import java.util.Set;
import java.util.StringTokenizer;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.TimeUnit;
import javax.transaction.HeuristicMixedException;
import javax.transaction.HeuristicRollbackException;
import org.infinispan.Cache;
import org.infinispan.configuration.cache.Configuration;
+import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.configuration.parsing.ParserRegistry;
import org.opendaylight.controller.clustering.services.IGetUpdates;
import org.opendaylight.controller.clustering.services.IListenRoleChange;
import org.opendaylight.controller.clustering.services.ListenRoleChangeAddException;
-import org.opendaylight.controller.sal.core.IContainerAware;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
-public class ClusterManager implements IClusterServices, IContainerAware {
+public class ClusterManager implements IClusterServices {
protected static final Logger logger = LoggerFactory
.getLogger(ClusterManager.class);
private DefaultCacheManager cm;
private HashSet<IListenRoleChange> roleChangeListeners;
private ViewChangedListener cacheManagerListener;
- private static String loopbackAddress = "127.0.0.1";
+ private static String loopbackAddress = InetAddress.getLoopbackAddress().getHostAddress();
+
+ // defaultTransactionTimeout is 60 seconds
+ private static int DEFAULT_TRANSACTION_TIMEOUT = 60;
/**
* Start a JGroups GossipRouter if we are a supernode. The
return res;
}
+ private void exitOnSecurityException(Exception ioe) {
+ Throwable cause = ioe.getCause();
+ while (cause != null) {
+ if (cause instanceof java.lang.SecurityException) {
+ logger.error("Failed Cluster authentication. Stopping Controller...");
+ System.exit(0);
+ }
+ cause = cause.getCause();
+ }
+ }
+
public void start() {
this.gossiper = startGossiper();
if (this.gossiper != null) {
logger.error("Stack Trace that raised th exception");
logger.error("",ioe);
this.cm = null;
+ exitOnSecurityException(ioe);
this.stop();
}
logger.debug("Cache Manager has value {}", this.cm);
throw new CacheExistException();
}
- // Sanity check to avoid contrasting parameters
- if (cMode.containsAll(EnumSet.of(
- IClusterServices.cacheMode.NON_TRANSACTIONAL,
+ // Sanity check to avoid contrasting parameters between transactional
+ // and not
+ if (cMode.containsAll(EnumSet.of(IClusterServices.cacheMode.NON_TRANSACTIONAL,
IClusterServices.cacheMode.TRANSACTIONAL))) {
throw new CacheConfigException();
}
- if (cMode.contains(IClusterServices.cacheMode.NON_TRANSACTIONAL)) {
- c = manager.getCache(realCacheName);
- return c;
- } else if (cMode.contains(IClusterServices.cacheMode.TRANSACTIONAL)) {
- Configuration rc = manager
- .getCacheConfiguration("transactional-type");
- manager.defineConfiguration(realCacheName, rc);
- c = manager.getCache(realCacheName);
- return c;
+ // Sanity check to avoid contrasting parameters between sync and async
+ if (cMode.containsAll(EnumSet.of(IClusterServices.cacheMode.SYNC, IClusterServices.cacheMode.ASYNC))) {
+ throw new CacheConfigException();
}
- return null;
+
+ Configuration fromTemplateConfig = null;
+ /*
+ * Fetch transactional/non-transactional templates
+ */
+ // Check if transactional
+ if (cMode.contains(IClusterServices.cacheMode.TRANSACTIONAL)) {
+ fromTemplateConfig = manager.getCacheConfiguration("transactional-type");
+ } else if (cMode.contains(IClusterServices.cacheMode.NON_TRANSACTIONAL)) {
+ fromTemplateConfig = manager.getDefaultCacheConfiguration();
+ }
+
+ // If none set the transactional property then just return null
+ if (fromTemplateConfig == null) {
+ return null;
+ }
+
+ ConfigurationBuilder builder = new ConfigurationBuilder();
+ builder.read(fromTemplateConfig);
+ /*
+ * Now evaluate async/sync
+ */
+ if (cMode.contains(IClusterServices.cacheMode.ASYNC)) {
+ builder.clustering()
+ .cacheMode(fromTemplateConfig.clustering()
+ .cacheMode()
+ .toAsync());
+ } else if (cMode.contains(IClusterServices.cacheMode.SYNC)) {
+ builder.clustering()
+ .cacheMode(fromTemplateConfig.clustering()
+ .cacheMode()
+ .toSync());
+ }
+
+ manager.defineConfiguration(realCacheName, builder.build());
+ c = manager.getCache(realCacheName);
+ return c;
}
@Override
@Override
public boolean existCache(String containerName, String cacheName) {
EmbeddedCacheManager manager = this.cm;
- String realCacheName = "{" + containerName + "}_{" + cacheName + "}";
+
if (manager == null) {
return false;
}
+
+ String realCacheName = "{" + containerName + "}_{" + cacheName + "}";
return manager.cacheExists(realCacheName);
}
return null;
}
for (String cacheName : manager.getCacheNames()) {
+ if (!manager.isRunning(cacheName)) continue;
if (cacheName.startsWith("{" + containerName + "}_")) {
String[] res = cacheName.split("[{}]");
if (res.length >= 4 && res[1].equals(containerName)
@Override
public void tbegin() throws NotSupportedException, SystemException {
+ // call tbegin with the default timeout
+ tbegin(DEFAULT_TRANSACTION_TIMEOUT, TimeUnit.SECONDS);
+ }
+
+ @Override
+ public void tbegin(long timeout, TimeUnit unit) throws NotSupportedException, SystemException {
EmbeddedCacheManager manager = this.cm;
if (manager == null) {
throw new IllegalStateException();
if (tm == null) {
throw new IllegalStateException();
}
+ long timeoutSec = unit.toSeconds(timeout);
+ if((timeoutSec > Integer.MAX_VALUE) || (timeoutSec <= 0)) {
+ // fall back to the default timeout
+ tm.setTransactionTimeout(DEFAULT_TRANSACTION_TIMEOUT);
+ } else {
+ // cast is ok here
+ // as here we are sure that timeoutSec < = Integer.MAX_VALUE.
+ tm.setTransactionTimeout((int) timeoutSec);
+ }
tm.begin();
}
}
}
}
-
- private void removeContainerCaches(String containerName) {
- logger.info("Destroying caches for container {}", containerName);
- for (String cacheName : this.getCacheList(containerName)) {
- this.destroyCache(containerName, cacheName);
- }
- }
-
- @Override
- public void containerCreate(String arg0) {
- // no op
- }
-
- @Override
- public void containerDestroy(String container) {
- removeContainerCaches(container);
- }
}