From 72a955ddc5f5e6c2fba3dd1c0a21d538a3ce2ad9 Mon Sep 17 00:00:00 2001 From: "Rafael H. Schloming" Date: Thu, 30 Aug 2007 19:21:49 +0000 Subject: fixed a race condition causing intermittant test failures in AMQBrokerManagerMBeanTest git-svn-id: https://svn.apache.org/repos/asf/incubator/qpid/trunk/qpid@571277 13f79535-47bb-0310-9956-ffa450edef68 --- .../qpid/server/registry/ApplicationRegistry.java | 89 ++++++++++++---------- 1 file changed, 49 insertions(+), 40 deletions(-) (limited to 'java') diff --git a/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java b/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java index 89f0b7b39d..a70505ff6c 100644 --- a/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java +++ b/java/broker/src/main/java/org/apache/qpid/server/registry/ApplicationRegistry.java @@ -61,7 +61,7 @@ public abstract class ApplicationRegistry implements IApplicationRegistry _logger.info("Shutting down application registries..."); try { - synchronized (ApplicationRegistry.class) + synchronized (_instanceMap) { Iterator keyIterator = _instanceMap.values().iterator(); @@ -87,40 +87,46 @@ public abstract class ApplicationRegistry implements IApplicationRegistry public static void initialise(IApplicationRegistry instance, int instanceID) throws Exception { - if (instance != null) + synchronized (_instanceMap) { - _logger.info("Initialising Application Registry:" + instanceID); - _instanceMap.put(instanceID, instance); - - try + if (instance != null) { - instance.initialise(); + _logger.info("Initialising Application Registry:" + instanceID); + _instanceMap.put(instanceID, instance); + + try + { + instance.initialise(); + } + catch (Exception e) + { + _instanceMap.remove(instanceID); + throw e; + } } - catch (Exception e) + else { - _instanceMap.remove(instanceID); - throw e; + remove(instanceID); } } - else - { - remove(instanceID); - } } public static void remove(int instanceID) { - try - { - _instanceMap.get(instanceID).close(); - } - catch (Exception e) + synchronized (_instanceMap) { + try + { + _instanceMap.get(instanceID).close(); + } + catch (Exception e) + { - } - finally - { - _instanceMap.remove(instanceID); + } + finally + { + _instanceMap.remove(instanceID); + } } } @@ -137,29 +143,32 @@ public abstract class ApplicationRegistry implements IApplicationRegistry public static IApplicationRegistry getInstance(int instanceID) { - IApplicationRegistry instance = _instanceMap.get(instanceID); - - if (instance == null) + synchronized (_instanceMap) { - try + IApplicationRegistry instance = _instanceMap.get(instanceID); + + if (instance == null) { - _logger.info("Creating DEFAULT_APPLICATION_REGISTRY: " + _APPLICATION_REGISTRY + " : Instance:" + instanceID); - IApplicationRegistry registry = (IApplicationRegistry) Class.forName(_APPLICATION_REGISTRY).getConstructor((Class[]) null).newInstance((Object[]) null); - ApplicationRegistry.initialise(registry, instanceID); - _logger.info("Initialised Application Registry:" + instanceID); - return registry; + try + { + _logger.info("Creating DEFAULT_APPLICATION_REGISTRY: " + _APPLICATION_REGISTRY + " : Instance:" + instanceID); + IApplicationRegistry registry = (IApplicationRegistry) Class.forName(_APPLICATION_REGISTRY).getConstructor((Class[]) null).newInstance((Object[]) null); + ApplicationRegistry.initialise(registry, instanceID); + _logger.info("Initialised Application Registry:" + instanceID); + return registry; + } + catch (Exception e) + { + _logger.error("Error configuring application: " + e, e); + //throw new AMQBrokerCreationException(instanceID, "Unable to create Application Registry instance " + instanceID); + throw new RuntimeException("Unable to create Application Registry", e); + } } - catch (Exception e) + else { - _logger.error("Error configuring application: " + e, e); - //throw new AMQBrokerCreationException(instanceID, "Unable to create Application Registry instance " + instanceID); - throw new RuntimeException("Unable to create Application Registry", e); + return instance; } } - else - { - return instance; - } } public void close() throws Exception -- cgit v1.2.1