When the connection timeout elapses and there is more than one server in the connection string, reset the connection and try again
Project: http://git-wip-us.apache.org/repos/asf/curator/repo Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/05d241da Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/05d241da Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/05d241da Branch: refs/heads/CURATOR-3.0 Commit: 05d241da642c6ba0d16b3ce97557128fad4dfe41 Parents: 2355447 Author: randgalt <randg...@apache.org> Authored: Sat Aug 22 20:32:41 2015 -0500 Committer: randgalt <randg...@apache.org> Committed: Sat Aug 22 20:32:41 2015 -0500 ---------------------------------------------------------------------- .../src/main/java/org/apache/curator/RetryLoop.java | 5 +++++ .../curator/connection/ConnectionHandlingPolicy.java | 5 +++++ .../connection/StandardConnectionHandlingPolicy.java | 13 ++++++++++++- 3 files changed, 22 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/curator/blob/05d241da/curator-client/src/main/java/org/apache/curator/RetryLoop.java ---------------------------------------------------------------------- diff --git a/curator-client/src/main/java/org/apache/curator/RetryLoop.java b/curator-client/src/main/java/org/apache/curator/RetryLoop.java index 35d55a1..a17cbf3 100644 --- a/curator-client/src/main/java/org/apache/curator/RetryLoop.java +++ b/curator-client/src/main/java/org/apache/curator/RetryLoop.java @@ -121,6 +121,11 @@ public class RetryLoop break; } + case WAIT_FOR_CONNECTION: + { + break; // just loop + } + case EXIT_RETRIES: { retryLoop.markComplete(); http://git-wip-us.apache.org/repos/asf/curator/blob/05d241da/curator-client/src/main/java/org/apache/curator/connection/ConnectionHandlingPolicy.java ---------------------------------------------------------------------- diff --git a/curator-client/src/main/java/org/apache/curator/connection/ConnectionHandlingPolicy.java b/curator-client/src/main/java/org/apache/curator/connection/ConnectionHandlingPolicy.java index f3ecce6..7f19159 100644 --- a/curator-client/src/main/java/org/apache/curator/connection/ConnectionHandlingPolicy.java +++ b/curator-client/src/main/java/org/apache/curator/connection/ConnectionHandlingPolicy.java @@ -63,6 +63,11 @@ public interface ConnectionHandlingPolicy CALL_PROC, /** + * Wait again for connection success or timeout + */ + WAIT_FOR_CONNECTION, + + /** * Do not call the procedure and exit the retry loop */ EXIT_RETRIES, http://git-wip-us.apache.org/repos/asf/curator/blob/05d241da/curator-client/src/main/java/org/apache/curator/connection/StandardConnectionHandlingPolicy.java ---------------------------------------------------------------------- diff --git a/curator-client/src/main/java/org/apache/curator/connection/StandardConnectionHandlingPolicy.java b/curator-client/src/main/java/org/apache/curator/connection/StandardConnectionHandlingPolicy.java index 06285ca..cbbceac 100644 --- a/curator-client/src/main/java/org/apache/curator/connection/StandardConnectionHandlingPolicy.java +++ b/curator-client/src/main/java/org/apache/curator/connection/StandardConnectionHandlingPolicy.java @@ -1,10 +1,15 @@ package org.apache.curator.connection; +import com.google.common.base.Splitter; import org.apache.curator.CuratorZookeeperClient; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import java.util.concurrent.Callable; public class StandardConnectionHandlingPolicy implements ConnectionHandlingPolicy { + private final Logger log = LoggerFactory.getLogger(getClass()); + @Override public boolean isEmulatingClassicHandling() { @@ -24,9 +29,15 @@ public class StandardConnectionHandlingPolicy implements ConnectionHandlingPolic @Override public PreRetryResult preRetry(CuratorZookeeperClient client) throws Exception { - // TODO - see if there are other servers to connect to if ( !client.isConnected() ) { + int serverCount = Splitter.on(",").omitEmptyStrings().splitToList(client.getCurrentConnectionString()).size(); + if ( serverCount > 1 ) + { + log.info("Connection timed out and connection string is > 1. Resetting connection and trying again."); + client.reset(); // unfortunately, there's no way to guarantee that ZK tries a different server. Internally it calls Collections.shuffle(). Hopefully, this will result in a different server each time. + return PreRetryResult.WAIT_FOR_CONNECTION; + } return PreRetryResult.CONNECTION_TIMEOUT; }