diff --git a/server/src/main/java/io/druid/initialization/Initialization.java b/server/src/main/java/io/druid/initialization/Initialization.java index 0752036575e..02825425aa1 100644 --- a/server/src/main/java/io/druid/initialization/Initialization.java +++ b/server/src/main/java/io/druid/initialization/Initialization.java @@ -78,13 +78,15 @@ import java.util.List; import java.util.Map; import java.util.ServiceLoader; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; +import java.util.concurrent.ConcurrentMap; /** */ public class Initialization { private static final Logger log = new Logger(Initialization.class); - private static final Map loadersMap = Maps.newHashMap(); + private static final ConcurrentMap loadersMap = new ConcurrentHashMap<>(); private final static Map extensionsMap = Maps.newHashMap(); @@ -114,7 +116,7 @@ public class Initialization /** * Used for testing only */ - static Map getLoadersMap() + static Map getLoadersMap() { return loadersMap; } @@ -274,8 +276,8 @@ public class Initialization log.info("added URL[%s]", url); urls[i++] = url; } - loader = new URLClassLoader(urls, Initialization.class.getClassLoader()); - loadersMap.put(extension.getName(), loader); + loadersMap.putIfAbsent(extension, new URLClassLoader(urls, Initialization.class.getClassLoader())); + loader = loadersMap.get(extension); } return loader; } diff --git a/server/src/test/java/io/druid/initialization/InitializationTest.java b/server/src/test/java/io/druid/initialization/InitializationTest.java index 8209d68d34a..3d978dcdb92 100644 --- a/server/src/test/java/io/druid/initialization/InitializationTest.java +++ b/server/src/test/java/io/druid/initialization/InitializationTest.java @@ -113,7 +113,8 @@ public class InitializationTest @Test public void test04DuplicateClassLoaderExtensions() throws Exception { - Initialization.getLoadersMap().put("xyz", (URLClassLoader) Initialization.class.getClassLoader()); + final File extensionDir = temporaryFolder.newFolder(); + Initialization.getLoadersMap().put(extensionDir, (URLClassLoader) Initialization.class.getClassLoader()); Collection modules = Initialization.getFromExtensions(new ExtensionsConfig(), DruidModule.class); @@ -426,6 +427,29 @@ public class InitializationTest } + @Test + public void testExtensionsWithSameDirName() throws Exception + { + final String extensionName = "some_extension"; + final File tmpDir1 = temporaryFolder.newFolder(); + final File tmpDir2 = temporaryFolder.newFolder(); + final File extension1 = new File(tmpDir1, extensionName); + final File extension2 = new File(tmpDir2, extensionName); + Assert.assertTrue(extension1.mkdir()); + Assert.assertTrue(extension2.mkdir()); + final File jar1 = new File(extension1, "jar1.jar"); + final File jar2 = new File(extension2, "jar2.jar"); + + Assert.assertTrue(jar1.createNewFile()); + Assert.assertTrue(jar2.createNewFile()); + + final ClassLoader classLoader1 = Initialization.getClassLoaderForExtension(extension1); + final ClassLoader classLoader2 = Initialization.getClassLoaderForExtension(extension2); + + Assert.assertArrayEquals(new URL[]{jar1.toURL()}, ((URLClassLoader) classLoader1).getURLs()); + Assert.assertArrayEquals(new URL[]{jar2.toURL()}, ((URLClassLoader) classLoader2).getURLs()); + } + public static class TestDruidModule implements DruidModule { @Override