From: Giovanni Meo Date: Fri, 22 Aug 2014 14:50:03 +0000 (+0200) Subject: Configuration service uses an inconsistent hashcode in the clustered data structure X-Git-Tag: release/helium~234^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=commitdiff_plain;h=1f5ea7dfb49937a9e6402bf8d194ff56c565836d Configuration service uses an inconsistent hashcode in the clustered data structure - Using Enum in the Key field of a clustered data structure can lead to propagation issues, because the clustering services implementation relay on a consistent hashcode to be calculated. So replaced the Java Enum used in configuration.implementation bundle with String. Change-Id: Id36ac46c9f38859d5325fc4f2e8674c9c3828ec4 Signed-off-by: Giovanni Meo --- diff --git a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java index dd73675070..de7621110e 100644 --- a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java +++ b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ConfigurationService.java @@ -44,13 +44,13 @@ import org.slf4j.LoggerFactory; * */ -public class ConfigurationService implements IConfigurationService, ICacheUpdateAware { +public class ConfigurationService implements IConfigurationService, ICacheUpdateAware { private static final Logger logger = LoggerFactory .getLogger(ConfigurationService.class); public static final String SAVE_EVENT_CACHE = "config.event.save"; private static final String ROOT = GlobalConstants.STARTUPHOME.toString(); private IClusterGlobalServices clusterServices; - private ConcurrentMap configEvent; + private ConcurrentMap configEvent; private Set configurationAwareList = Collections .synchronizedSet(new HashSet()); private ObjectReader objReader; @@ -105,7 +105,7 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate @Override public Status saveConfigurations() { if (configEvent != null) { - configEvent.put(ConfigurationEvent.SAVE, ""); + configEvent.put(ConfigurationEvent.SAVE.toString(), ""); } return saveConfigurationsInternal(); } @@ -183,7 +183,7 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate } @Override - public void entryCreated(ConfigurationEvent key, String cacheName, + public void entryCreated(String key, String cacheName, boolean originLocal) { if (originLocal) { return; @@ -191,18 +191,18 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate } @Override - public void entryUpdated(ConfigurationEvent key, String new_value, + public void entryUpdated(String key, String new_value, String cacheName, boolean originLocal) { if (originLocal) { return; } - if (key == ConfigurationEvent.SAVE) { + if (key.equals(ConfigurationEvent.SAVE.toString())) { saveConfigurationsInternal(); } } @Override - public void entryDeleted(ConfigurationEvent key, String cacheName, + public void entryDeleted(String key, String cacheName, boolean originLocal) { if (originLocal) { return; @@ -230,7 +230,7 @@ public class ConfigurationService implements IConfigurationService, ICacheUpdate logger.error("uninitialized clusterServices, can't retrieve cache"); return; } - configEvent = (ConcurrentMap) this.clusterServices.getCache(SAVE_EVENT_CACHE); + configEvent = (ConcurrentMap) this.clusterServices.getCache(SAVE_EVENT_CACHE); if (configEvent == null) { logger.error("Failed to retrieve configuration Cache"); } diff --git a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java index a36d4cc6d7..dcab1f63fb 100644 --- a/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java +++ b/opendaylight/configuration/implementation/src/main/java/org/opendaylight/controller/configuration/internal/ContainerConfigurationService.java @@ -47,11 +47,12 @@ import org.slf4j.LoggerFactory; */ public class ContainerConfigurationService implements IConfigurationContainerService, - IConfigurationAware, ICacheUpdateAware { + IConfigurationAware, + ICacheUpdateAware { public static final String CONTAINER_SAVE_EVENT_CACHE = "config.container.event.save"; private static final Logger logger = LoggerFactory.getLogger(ContainerConfigurationService.class); private IClusterContainerServices clusterServices; - private ConcurrentMap containerConfigEvent; + private ConcurrentMap containerConfigEvent; // Directory which contains the startup files for this container private String root; private Set configurationAwareList = Collections @@ -142,12 +143,12 @@ public class ContainerConfigurationService implements IConfigurationContainerSer @Override public Status saveConfigurations() { - containerConfigEvent.put(ConfigurationEvent.SAVE, ""); + containerConfigEvent.put(ConfigurationEvent.SAVE.toString(), ""); return saveConfiguration(); } @Override - public void entryCreated(ConfigurationEvent key, String cacheName, + public void entryCreated(String key, String cacheName, boolean originLocal) { if (originLocal) { return; @@ -155,19 +156,19 @@ public class ContainerConfigurationService implements IConfigurationContainerSer } @Override - public void entryUpdated(ConfigurationEvent key, String new_value, + public void entryUpdated(String key, String new_value, String cacheName, boolean originLocal) { if (originLocal) { return; } logger.debug("Processing {} event", key); - if (key == ConfigurationEvent.SAVE) { + if (key.equals(ConfigurationEvent.SAVE.toString())) { saveConfiguration(); } } @Override - public void entryDeleted(ConfigurationEvent key, String cacheName, + public void entryDeleted(String key, String cacheName, boolean originLocal) { if (originLocal) { return; @@ -195,7 +196,8 @@ public class ContainerConfigurationService implements IConfigurationContainerSer logger.error("uninitialized clusterServices, can't retrieve cache"); return; } - containerConfigEvent = (ConcurrentMap) this.clusterServices.getCache(CONTAINER_SAVE_EVENT_CACHE); + containerConfigEvent = + (ConcurrentMap) this.clusterServices.getCache(CONTAINER_SAVE_EVENT_CACHE); if (containerConfigEvent == null) { logger.error("Failed to retrieve configuration Cache"); }