Add Plugin name for verbose Plugin not found exception (#841)

* Add Plugin name for verbose Plugin not found exception
* Make the plugin loading failure exception more verbose
* Throw Opensearch in place of RuntimeException for plugin load failure

Signed-off-by: Jayesh Hathila <sharma.jayesh52@gmail.com>
This commit is contained in:
jayesh hathila 2021-06-15 21:39:41 +05:30 committed by GitHub
parent 733d9c6f4b
commit f3d5340b33
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 27 additions and 2 deletions

View File

@ -662,6 +662,7 @@ public class PluginsService implements ReportingService<PluginsAndModules> {
return null;
});
logger.debug("Loading plugin [" + name + "]...");
Class<? extends Plugin> pluginClass = loadPluginClass(bundle.plugin.getClassname(), loader);
if (loader != pluginClass.getClassLoader()) {
throw new IllegalStateException("Plugin [" + name + "] must reference a class loader local Plugin class ["
@ -700,8 +701,8 @@ public class PluginsService implements ReportingService<PluginsAndModules> {
private Class<? extends Plugin> loadPluginClass(String className, ClassLoader loader) {
try {
return Class.forName(className, false, loader).asSubclass(Plugin.class);
} catch (ClassNotFoundException e) {
throw new OpenSearchException("Could not find plugin class [" + className + "]", e);
} catch (Throwable t) {
throw new OpenSearchException("Unable to load plugin class [" + className + "]", t);
}
}

View File

@ -734,6 +734,30 @@ public class PluginsServiceTests extends OpenSearchTestCase {
TestPlugin.class.getName() + "] (class loader [" + PluginsServiceTests.class.getClassLoader() + "])")));
}
public void testPluginLoadFailure() throws IOException {
final Path pathHome = createTempDir();
final Path plugins = pathHome.resolve("plugins");
final Path fake = plugins.resolve("fake");
PluginTestUtil.writePluginProperties(
fake,
"description", "description",
"name", "fake",
"version", "1.0.0",
"opensearch.version", Version.CURRENT.toString(),
"java.version", System.getProperty("java.specification.version"),
"classname", "DummyClass"); // This class is not present in Path, hence plugin loading will throw ClassNotFoundException
final Settings settings =
Settings.builder()
.put("path.home", pathHome)
.put("plugin.mandatory", "fake")
.build();
RuntimeException exception = expectThrows(RuntimeException.class, () -> newPluginsService(settings));
assertTrue(exception.getCause() instanceof ClassNotFoundException);
assertThat(exception, hasToString(containsString("Unable to load plugin class [DummyClass]")));
}
public void testExtensiblePlugin() {
TestExtensiblePlugin extensiblePlugin = new TestExtensiblePlugin();
PluginsService.loadExtensions(Collections.singletonList(