From 432542049be8d15ce8a21b78aea00767bf7bf899 Mon Sep 17 00:00:00 2001 From: "hanyu.liang" Date: Wed, 18 Mar 2026 23:58:35 -0700 Subject: [PATCH] [plugin]: add newDriverInstance for isolated drivers Add newDriverInstance() method to PluginManager interface and implementation. Unlike getPlugin() which returns a shared singleton, this method creates a fresh instance each time via reflection to avoid concurrent state corruption when multiple callers need isolated driver configurations. Resolves: ZSTAC-82729 Change-Id: Ife8c01012dc38780d91f2b67c04c7a1ac8f9bd1f --- .../org/zstack/core/plugin/PluginManager.java | 11 +++++++++++ .../org/zstack/core/plugin/PluginManagerImpl.java | 15 +++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManager.java b/core/src/main/java/org/zstack/core/plugin/PluginManager.java index 4e1b78c33d2..bb2b2abd3b5 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManager.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManager.java @@ -25,4 +25,15 @@ public interface PluginManager { // get plugin class with type T getPlugin(Class pluginClass, String type); + + /** + * Create a new independent instance of a plugin driver. + * Unlike getPlugin() which returns a shared singleton, this method creates + * a fresh instance each time to avoid concurrent state corruption when + * multiple callers need isolated driver configurations. + * + * @param pluginUuid the plugin product key / UUID + * @return a new instance of the plugin driver + */ + T newDriverInstance(String pluginUuid); } diff --git a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java index 823a3ea91e9..64dbbaa98f1 100644 --- a/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java +++ b/core/src/main/java/org/zstack/core/plugin/PluginManagerImpl.java @@ -298,6 +298,21 @@ public T getPlugin(Class plugin .orElse(null); } + @Override + public T newDriverInstance(String pluginProductKey) { + PluginDriver singleton = pluginInstances.get(pluginProductKey); + if (singleton == null) { + throw new CloudRuntimeException(String.format("Unsupported plugin %s", pluginProductKey)); + } + + try { + return (T) singleton.getClass().getConstructor().newInstance(); + } catch (Exception e) { + throw new CloudRuntimeException( + String.format("Failed to create new instance of plugin %s", pluginProductKey), e); + } + } + @Override public void handleMessage(Message msg) { if (msg instanceof APIRefreshPluginDriversMsg) {