From 3efc0e553055aa25e09845588c6aef9d73eabaed Mon Sep 17 00:00:00 2001 From: David Estes Date: Wed, 1 Jul 2020 22:17:41 -0400 Subject: [PATCH] Fixes concurrency issue where a classload in a concurrent environment with a large number of classes can cause a loss of a TypeRegistry entry --- .../org/springsource/loaded/TypeRegistry.java | 18 ++++++++++++------ .../agent/FileSystemWatcherInterface.java | 18 ++++++++++++++++++ .../loaded/agent/MacOsFileSystemWatcher.java | 4 ++++ .../loaded/agent/PollingFileSystemWatcher.java | 4 ++++ ...java => PollingFileSystemWatcherTests.java} | 0 5 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java create mode 100644 springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java create mode 100644 springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java rename springloaded/src/test/java/org/springsource/loaded/test/{FileSystemWatcherTests.java => PollingFileSystemWatcherTests.java} (100%) diff --git a/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java b/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java index 83621ea..39eea2d 100644 --- a/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java +++ b/springloaded/src/main/java/org/springsource/loaded/TypeRegistry.java @@ -1125,10 +1125,13 @@ public class TypeRegistry { if (typeId >= reloadableTypes.length) { resizeReloadableTypeArray(typeId); } - reloadableTypes[typeId] = rtype; - if ((typeId + 1) > reloadableTypesSize) { - reloadableTypesSize = typeId + 1; + synchronized(this) { + reloadableTypes[typeId] = rtype; + if ((typeId + 1) > reloadableTypesSize) { + reloadableTypesSize = typeId + 1; + } } + // allocatedIds.put(slashname, rtype); // allocatedButNotYetRegisteredItds.remove(slashname); int cglibIndex = slashname.indexOf("$$EnhancerBy"); @@ -1196,10 +1199,13 @@ public class TypeRegistry { if (typeId >= reloadableTypes.length) { resizeReloadableTypeArray(typeId); } - reloadableTypes[typeId] = rtype; - if ((typeId + 1) > reloadableTypesSize) { - reloadableTypesSize = typeId + 1; + synchronized(this) { + reloadableTypes[typeId] = rtype; + if ((typeId + 1) > reloadableTypesSize) { + reloadableTypesSize = typeId + 1; + } } + } /** diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java b/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java new file mode 100644 index 0000000..225c729 --- /dev/null +++ b/springloaded/src/main/java/org/springsource/loaded/agent/FileSystemWatcherInterface.java @@ -0,0 +1,18 @@ +package org.springsource.loaded.agent; + +import java.io.File; + +public interface AbstractFileSystemWatcher { + /** + * Shutdown the thread. + */ + public void shutdown(); + + /** + * Add a new file to the list of those being monitored. If the file is something that can be watched, then this + * method will cause the thread to start (if it hasn't already been started). + * + * @param fileToMonitor the file to start monitor + */ + public void register(File fileToMonitor); +} diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java b/springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java new file mode 100644 index 0000000..476b38b --- /dev/null +++ b/springloaded/src/main/java/org/springsource/loaded/agent/MacOsFileSystemWatcher.java @@ -0,0 +1,4 @@ +package org.springsource.loaded.agent; + +public class MacOsFileSystemWatcher { +} diff --git a/springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java b/springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java new file mode 100644 index 0000000..f3e69fc --- /dev/null +++ b/springloaded/src/main/java/org/springsource/loaded/agent/PollingFileSystemWatcher.java @@ -0,0 +1,4 @@ +package org.springsource.loaded.agent; + +public class PollingFileSystemWatcher { +} diff --git a/springloaded/src/test/java/org/springsource/loaded/test/FileSystemWatcherTests.java b/springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java similarity index 100% rename from springloaded/src/test/java/org/springsource/loaded/test/FileSystemWatcherTests.java rename to springloaded/src/test/java/org/springsource/loaded/test/PollingFileSystemWatcherTests.java