Skip to content

Instantly share code, notes, and snippets.

@afeinberg
Created January 27, 2010 23:12
Show Gist options
  • Save afeinberg/288256 to your computer and use it in GitHub Desktop.
Save afeinberg/288256 to your computer and use it in GitHub Desktop.
diff --git a/src/java/voldemort/client/AbstractStoreClientFactory.java b/src/java/voldemort/client/AbstractStoreClientFactory.java
index 2991553..b7d134c 100644
--- a/src/java/voldemort/client/AbstractStoreClientFactory.java
+++ b/src/java/voldemort/client/AbstractStoreClientFactory.java
@@ -19,6 +19,7 @@ package voldemort.client;
import java.io.StringReader;
import java.net.URI;
import java.net.URISyntaxException;
+import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutorService;
@@ -88,8 +89,10 @@ public abstract class AbstractStoreClientFactory implements StoreClientFactory {
protected FailureDetector failureDetector;
private final int maxBootstrapRetries;
private final StoreStats stats;
+ private final ClientConfig config;
public AbstractStoreClientFactory(ClientConfig config) {
+ this.config = config;
this.threadPool = new ClientThreadPool(config.getMaxThreads(),
config.getThreadIdleTime(TimeUnit.MILLISECONDS),
config.getMaxQueuedRequests());
@@ -156,7 +159,7 @@ public abstract class AbstractStoreClientFactory implements StoreClientFactory {
repairReads,
threadPool,
routingTimeoutMs,
- failureDetector,
+ getFailureDetector(),
SystemTime.INSTANCE);
if(isJmxEnabled) {
@@ -188,7 +191,16 @@ public abstract class AbstractStoreClientFactory implements StoreClientFactory {
return serializedStore;
}
- public FailureDetector getFailureDetector() {
+ protected abstract FailureDetector initFailureDetector(final ClientConfig config,
+ final Collection<Node> nodes);
+
+ public synchronized FailureDetector getFailureDetector() {
+ if (failureDetector == null) {
+ String clusterXml = bootstrapMetadataWithRetries(MetadataStore.CLUSTER_KEY, bootstrapUrls);
+ Cluster cluster = clusterMapper.readCluster(new StringReader(clusterXml));
+ failureDetector = initFailureDetector(config, cluster.getNodes());
+ }
+
return failureDetector;
}
diff --git a/src/java/voldemort/client/HttpStoreClientFactory.java b/src/java/voldemort/client/HttpStoreClientFactory.java
index 048fd1c..24026fa 100644
--- a/src/java/voldemort/client/HttpStoreClientFactory.java
+++ b/src/java/voldemort/client/HttpStoreClientFactory.java
@@ -86,11 +86,6 @@ public class HttpStoreClientFactory extends AbstractStoreClientFactory {
config.getMaxConnectionsPerNode());
this.reroute = config.getRoutingTier().equals(RoutingTier.SERVER);
this.requestFormatFactory = new RequestFormatFactory();
-
- String clusterXml = bootstrapMetadataWithRetries(MetadataStore.CLUSTER_KEY);
- Cluster cluster = clusterMapper.readCluster(new StringReader(clusterXml));
-
- failureDetector = initFailureDetector(config, cluster.getNodes());
}
@Override
@@ -106,6 +101,7 @@ public class HttpStoreClientFactory extends AbstractStoreClientFactory {
reroute);
}
+ @Override
protected FailureDetector initFailureDetector(final ClientConfig config,
final Collection<Node> nodes) {
ClientStoreVerifier<ByteArray, byte[]> storeVerifier = new ClientStoreVerifier<ByteArray, byte[]>() {
diff --git a/src/java/voldemort/client/SocketStoreClientFactory.java b/src/java/voldemort/client/SocketStoreClientFactory.java
index c2b73c1..6bbc518 100644
--- a/src/java/voldemort/client/SocketStoreClientFactory.java
+++ b/src/java/voldemort/client/SocketStoreClientFactory.java
@@ -65,11 +65,6 @@ public class SocketStoreClientFactory extends AbstractStoreClientFactory {
config.getSocketBufferSize());
if(config.isJmxEnabled())
JmxUtils.registerMbean(socketPool, JmxUtils.createObjectName(SocketPool.class));
-
- String clusterXml = bootstrapMetadataWithRetries(MetadataStore.CLUSTER_KEY);
- Cluster cluster = clusterMapper.readCluster(new StringReader(clusterXml));
-
- failureDetector = initFailureDetector(config, cluster.getNodes());
}
@Override
@@ -83,6 +78,7 @@ public class SocketStoreClientFactory extends AbstractStoreClientFactory {
RoutingTier.SERVER.equals(routingTier));
}
+ @Override
protected FailureDetector initFailureDetector(final ClientConfig config,
final Collection<Node> nodes) {
failureDetectorListener = new FailureDetectorListener() {
@@ -145,7 +141,8 @@ public class SocketStoreClientFactory extends AbstractStoreClientFactory {
@Override
public void close() {
this.socketPool.close();
- this.failureDetector.removeFailureDetectorListener(failureDetectorListener);
+ if (failureDetector != null)
+ this.failureDetector.removeFailureDetectorListener(failureDetectorListener);
this.getThreadPool().shutdown();
super.close();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment