Skip to content

Commit 2ca94eb

Browse files
timwtglman
authored andcommitted
Detect distributed setup early in activate process.
Split loading of enabled server plugins and starting of plugins to allow presence of a distributed server manager to be detected prior to network listeners being established and storage open. This allows guarding of constructs that require the distributed plugin to be present (and potentially running), which currently experience a race condition between the network listeners starting and the distributed plugin fully starting.
1 parent 25794a9 commit 2ca94eb

1 file changed

Lines changed: 59 additions & 24 deletions

File tree

  • server/src/main/java/com/orientechnologies/orient/server

server/src/main/java/com/orientechnologies/orient/server/OServer.java

Lines changed: 59 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,9 @@ public class OServer {
8989
new ArrayList<OServerLifecycleListener>();
9090
protected OServerPluginManager pluginManager;
9191
protected OConfigurableHooksManager hookManager;
92+
/** Whether a distributed plugin is registered in the configuration */
93+
private volatile boolean distributedPluginEnabled;
94+
9295
protected ODistributedServerManager distributedManager;
9396
private final Map<String, Object> variables = new HashMap<String, Object>();
9497
private String serverRootDirectory;
@@ -431,6 +434,15 @@ public OServer activate()
431434

432435
for (OServerLifecycleListener l : lifecycleListeners) l.onBeforeActivate();
433436

437+
// Load server plugin config and determine if participants in activation
438+
// need to be aware if distributed plugin will be part of server
439+
final List<ServerPluginConfig> serverPlugins = loadServerPlugins();
440+
for (ServerPluginConfig serverPlugin : serverPlugins) {
441+
if (ODistributedServerManager.class.isAssignableFrom(serverPlugin.clazz)) {
442+
distributedPluginEnabled = true;
443+
}
444+
}
445+
434446
final OServerConfiguration configuration = serverCfg.getConfiguration();
435447

436448
tokenHandler =
@@ -484,7 +496,7 @@ public OServer activate()
484496
throw OException.wrapException(new OConfigurationException(message), e);
485497
}
486498

487-
registerPlugins();
499+
registerPlugins(serverPlugins);
488500

489501
for (OServerLifecycleListener l : lifecycleListeners) l.onAfterActivate();
490502

@@ -867,6 +879,10 @@ public ODatabaseDocumentInternal openDatabase(String database) {
867879
return getDatabases().openNoAuthorization(database);
868880
}
869881

882+
public boolean isDistributedPluginEnabled() {
883+
return distributedPluginEnabled;
884+
}
885+
870886
public ODistributedServerManager getDistributedManager() {
871887
return distributedManager;
872888
}
@@ -1082,19 +1098,25 @@ public OServerPluginManager getPluginManager() {
10821098
return pluginManager;
10831099
}
10841100

1085-
protected void registerPlugins()
1086-
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
1087-
pluginManager = new OServerPluginManager();
1088-
pluginManager.config(this);
1089-
pluginManager.startup();
1101+
private static class ServerPluginConfig {
1102+
private final Class<?> clazz;
1103+
private OServerParameterConfiguration[] parameters;
1104+
1105+
private ServerPluginConfig(Class<?> clazz, OServerParameterConfiguration[] parameters) {
1106+
this.clazz = clazz;
1107+
this.parameters = parameters;
1108+
}
1109+
}
1110+
1111+
private List<ServerPluginConfig> loadServerPlugins() throws ClassNotFoundException {
1112+
// PLUGINS CONFIGURED IN XML and enabled
1113+
List<ServerPluginConfig> plugins = new ArrayList<>();
10901114

10911115
// PLUGINS CONFIGURED IN XML
10921116
final OServerConfiguration configuration = serverCfg.getConfiguration();
10931117

10941118
if (configuration.handlers != null) {
10951119
// ACTIVATE PLUGINS
1096-
final List<OServerPlugin> plugins = new ArrayList<OServerPlugin>();
1097-
10981120
for (OServerHandlerConfiguration h : configuration.handlers) {
10991121
if (h.parameters != null) {
11001122
// CHECK IF IT'S ENABLED
@@ -1120,28 +1142,41 @@ protected void registerPlugins()
11201142
// SKIP IT
11211143
continue;
11221144
}
1145+
final Class<?> pluginClass = loadClass(h.clazz);
1146+
plugins.add(new ServerPluginConfig(pluginClass, h.parameters));
1147+
}
1148+
}
1149+
return plugins;
1150+
}
11231151

1124-
final OServerPlugin plugin = (OServerPlugin) loadClass(h.clazz).newInstance();
1152+
private void registerPlugins(List<ServerPluginConfig> serverPlugins)
1153+
throws InstantiationException, IllegalAccessException, ClassNotFoundException {
1154+
pluginManager = new OServerPluginManager();
1155+
pluginManager.config(this);
1156+
pluginManager.startup();
11251157

1126-
if (plugin instanceof ODistributedServerManager)
1127-
distributedManager = (ODistributedServerManager) plugin;
1158+
final List<OServerPlugin> plugins = new ArrayList<>();
1159+
for (ServerPluginConfig serverPlugin : serverPlugins) {
1160+
final OServerPlugin plugin = (OServerPlugin) serverPlugin.clazz.newInstance();
11281161

1129-
pluginManager.registerPlugin(
1130-
new OServerPluginInfo(plugin.getName(), null, null, null, plugin, null, 0, null));
1162+
if (plugin instanceof ODistributedServerManager)
1163+
distributedManager = (ODistributedServerManager) plugin;
11311164

1132-
pluginManager.callListenerBeforeConfig(plugin, h.parameters);
1133-
plugin.config(this, h.parameters);
1134-
pluginManager.callListenerAfterConfig(plugin, h.parameters);
1165+
pluginManager.registerPlugin(
1166+
new OServerPluginInfo(plugin.getName(), null, null, null, plugin, null, 0, null));
11351167

1136-
plugins.add(plugin);
1137-
}
1168+
pluginManager.callListenerBeforeConfig(plugin, serverPlugin.parameters);
1169+
plugin.config(this, serverPlugin.parameters);
1170+
pluginManager.callListenerAfterConfig(plugin, serverPlugin.parameters);
11381171

1139-
// START ALL THE CONFIGURED PLUGINS
1140-
for (OServerPlugin plugin : plugins) {
1141-
pluginManager.callListenerBeforeStartup(plugin);
1142-
plugin.startup();
1143-
pluginManager.callListenerAfterStartup(plugin);
1144-
}
1172+
plugins.add(plugin);
1173+
}
1174+
1175+
// START ALL THE CONFIGURED PLUGINS
1176+
for (OServerPlugin plugin : plugins) {
1177+
pluginManager.callListenerBeforeStartup(plugin);
1178+
plugin.startup();
1179+
pluginManager.callListenerAfterStartup(plugin);
11451180
}
11461181
}
11471182

0 commit comments

Comments
 (0)