Skip to content

Commit

Permalink
Make sure findLoadedClass is called, also allow for serialization of …
Browse files Browse the repository at this point in the history
…platform blocking actions
  • Loading branch information
purplefox committed Jan 13, 2014
1 parent 72425f3 commit 9212781
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 23 deletions.
2 changes: 2 additions & 0 deletions src/dist/scripts/vertx
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

# Add default JVM options here. You can also use JAVA_OPTS and VERTX_OPTS to pass JVM options to this script.

# VERTX_OPTS="-Dvertx.serialiseBlockingActions=true"

# If you're deploying and undeploying a lot of verticles with dynamic languages it's recommended to enable GC'ing
# of generated classes and prevent OOM due to a lot of gc
# JVM_OPTS="-XX:+CMSClassUnloadingEnabled -XX:-UseGCOverheadLimit"
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.Executor;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;
import java.util.zip.ZipOutputStream;
Expand Down Expand Up @@ -73,6 +74,7 @@ public class DefaultPlatformManager implements PlatformManagerInternal, ModuleRe
private static final String FILE_SEP = System.getProperty("file.separator");
private static final String MODULE_NAME_SYS_PROP = System.getProperty("vertx.modulename");
private static final String CLASSPATH_FILE = "vertx_classpath.txt";
private static final String SERIALISE_BLOCKING_PROP_NAME = "vertx.serialiseBlockingActions";

private final VertxInternal vertx;
// deployment name --> deployment
Expand All @@ -94,6 +96,7 @@ public class DefaultPlatformManager implements PlatformManagerInternal, ModuleRe
protected HAManager haManager;
private boolean stopped;
private final Queue<String> tempDeployments = new ConcurrentLinkedQueue<>();
private Executor backgroundExec;

protected DefaultPlatformManager() {
this(new DefaultVertx());
Expand All @@ -118,6 +121,12 @@ private DefaultPlatformManager(DefaultVertx vertx) {
this.vertx = new WrappedVertx(vertx);
this.clusterManager = vertx.clusterManager();

if (System.getProperty(SERIALISE_BLOCKING_PROP_NAME, "false").equalsIgnoreCase("true")) {
this.backgroundExec = new OrderedExecutorFactory(vertx.getBackgroundPool()).getExecutor();
} else {
this.backgroundExec = vertx.getBackgroundPool();
}

String modDir = System.getProperty(MODS_DIR_PROP_NAME);
if (modDir != null && !modDir.trim().equals("")) {
modRoot = new File(modDir);
Expand Down Expand Up @@ -426,7 +435,7 @@ public void run() {

private <T> void runInBackground(final Runnable runnable, final Handler<AsyncResult<T>> doneHandler) {
final DefaultContext context = vertx.getOrCreateContext();
vertx.getBackgroundPool().execute(new Runnable() {
backgroundExec.execute(new Runnable() {
public void run() {
try {
vertx.setContext(context);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,10 +58,6 @@ public class ModuleClassLoader extends URLClassLoader {
private final boolean loadFromModuleFirst;
private Set<ModuleClassLoader> modGraph;

// We use a single static object as a lock to prevent classes from being loaded from any modules concurrently
// Otherwise we can get deadlock when classes are loaded from similar sets of modules in different order
private static final Object lock = new Object();

public ModuleClassLoader(String modID, ClassLoader platformClassLoader, URL[] classpath,
boolean loadFromModuleFirst) {
super(classpath);
Expand Down Expand Up @@ -90,26 +86,27 @@ public void close() {
@Override
protected Class<?> loadClass(String name, boolean resolve)
throws ClassNotFoundException {
synchronized (lock) {
Class<?> c;
if (loadFromModuleFirst) {
try {
c = loadFromModule(name);
} catch (ClassNotFoundException e) {
c = platformClassLoader.loadClass(name);
}
} else {
try {
c = platformClassLoader.loadClass(name);
} catch (ClassNotFoundException e) {
c = loadFromModule(name);
}
Class<?> c = findLoadedClass(name);
if (c != null) {
return c;
}
if (loadFromModuleFirst) {
try {
c = loadFromModule(name);
} catch (ClassNotFoundException e) {
c = platformClassLoader.loadClass(name);
}
if (resolve) {
resolveClass(c);
} else {
try {
c = platformClassLoader.loadClass(name);
} catch (ClassNotFoundException e) {
c = loadFromModule(name);
}
return c;
}
if (resolve) {
resolveClass(c);
}
return c;
}

private Class<?> loadFromModule(String name) throws ClassNotFoundException {
Expand All @@ -127,7 +124,7 @@ private Class<?> loadFromModule(String name) throws ClassNotFoundException {
return c;
}

protected Class<?> doLoadClass(String name) {
protected synchronized Class<?> doLoadClass(String name) {
Class<?> c = findLoadedClass(name);
if (c == null) {
try {
Expand Down

0 comments on commit 9212781

Please sign in to comment.