You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@curator.apache.org by ra...@apache.org on 2015/08/23 02:07:07 UTC

[1/2] curator git commit: removed some test code

Repository: curator
Updated Branches:
  refs/heads/CURATOR-247 ec2f9bd55 -> e23913701


removed some test code


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/6381ccb6
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/6381ccb6
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/6381ccb6

Branch: refs/heads/CURATOR-247
Commit: 6381ccb6536f4710248a50ae5d0313399bbfe858
Parents: ec2f9bd
Author: randgalt <ra...@apache.org>
Authored: Sat Aug 22 17:50:09 2015 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sat Aug 22 17:50:09 2015 -0500

----------------------------------------------------------------------
 .../src/main/java/org/apache/curator/RetryLoop.java       | 10 +++-------
 .../main/java/org/apache/curator/utils/DebugUtils.java    |  1 -
 .../java/org/apache/curator/test/BaseClassForTests.java   |  5 -----
 3 files changed, 3 insertions(+), 13 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/6381ccb6/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 f6abf21..92291c1 100644
--- a/curator-client/src/main/java/org/apache/curator/RetryLoop.java
+++ b/curator-client/src/main/java/org/apache/curator/RetryLoop.java
@@ -74,7 +74,6 @@ public class RetryLoop
             unit.sleep(time);
         }
     };
-    private static final boolean checkInjectedDebugExceptions = Boolean.getBoolean(DebugUtils.PROPERTY_CHECK_INJECTED_DEBUG_EXCEPTIONS);
 
     /**
      * Returns the default retry sleeper
@@ -104,13 +103,10 @@ public class RetryLoop
         {
             try
             {
-                if ( checkInjectedDebugExceptions )
+                Exception debugException = client.getDebugException();
+                if ( debugException != null )
                 {
-                    Exception debugException = client.getDebugException();
-                    if ( debugException != null )
-                    {
-                        throw debugException;
-                    }
+                    throw debugException;
                 }
 
                 client.internalBlockUntilConnectedOrTimedOut();

http://git-wip-us.apache.org/repos/asf/curator/blob/6381ccb6/curator-client/src/main/java/org/apache/curator/utils/DebugUtils.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/utils/DebugUtils.java b/curator-client/src/main/java/org/apache/curator/utils/DebugUtils.java
index 0e473fb..3e90600 100644
--- a/curator-client/src/main/java/org/apache/curator/utils/DebugUtils.java
+++ b/curator-client/src/main/java/org/apache/curator/utils/DebugUtils.java
@@ -26,7 +26,6 @@ public class DebugUtils
     public static final String PROPERTY_LOG_ONLY_FIRST_CONNECTION_ISSUE_AS_ERROR_LEVEL = "curator-log-only-first-connection-issue-as-error-level";
     public static final String PROPERTY_REMOVE_WATCHERS_IN_FOREGROUND = "curator-remove-watchers-in-foreground";
     public static final String PROPERTY_RETRY_FAILED_TESTS = "curator-retry-failed-tests";
-    public static final String PROPERTY_CHECK_INJECTED_DEBUG_EXCEPTIONS = "curator-check-injected-debug-exceptions";
 
     private DebugUtils()
     {

http://git-wip-us.apache.org/repos/asf/curator/blob/6381ccb6/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
index 55dcb61..c9f3524 100644
--- a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
+++ b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
@@ -44,20 +44,17 @@ public class BaseClassForTests
     private static final String INTERNAL_PROPERTY_DONT_LOG_CONNECTION_ISSUES;
     private static final String INTERNAL_PROPERTY_REMOVE_WATCHERS_IN_FOREGROUND;
     private static final String INTERNAL_RETRY_FAILED_TESTS;
-    private static final String INTERNAL_CHECK_INJECTED_DEBUG_EXCEPTIONS;
 
     static
     {
         String logConnectionIssues = null;
         String retryFailedTests = null;
-        String checkInjectedDebugExceptions = null;
         try
         {
             // use reflection to avoid adding a circular dependency in the pom
             Class<?> debugUtilsClazz = Class.forName("org.apache.curator.utils.DebugUtils");
             logConnectionIssues = (String)debugUtilsClazz.getField("PROPERTY_DONT_LOG_CONNECTION_ISSUES").get(null);
             retryFailedTests = (String)debugUtilsClazz.getField("PROPERTY_RETRY_FAILED_TESTS").get(null);
-            checkInjectedDebugExceptions = (String)debugUtilsClazz.getField("PROPERTY_CHECK_INJECTED_DEBUG_EXCEPTIONS").get(null);
         }
         catch ( Exception e )
         {
@@ -65,7 +62,6 @@ public class BaseClassForTests
         }
         INTERNAL_PROPERTY_DONT_LOG_CONNECTION_ISSUES = logConnectionIssues;
         INTERNAL_RETRY_FAILED_TESTS = retryFailedTests;
-        INTERNAL_CHECK_INJECTED_DEBUG_EXCEPTIONS = checkInjectedDebugExceptions;
         String s = null;
         try
         {
@@ -118,7 +114,6 @@ public class BaseClassForTests
             System.setProperty(INTERNAL_PROPERTY_DONT_LOG_CONNECTION_ISSUES, "true");
         }
         System.setProperty(INTERNAL_PROPERTY_REMOVE_WATCHERS_IN_FOREGROUND, "true");
-        System.setProperty(INTERNAL_CHECK_INJECTED_DEBUG_EXCEPTIONS, "true");
 
         while ( server == null )
         {


[2/2] curator git commit: major refactoring. Abstracting old/new behavior into a pluggable ConnectionHandlingPolicy. Also, IMPORTANT, made the new behavior the default. This needs to be discussed but it's a major improvement and we should default to it.

Posted by ra...@apache.org.
major refactoring. Abstracting old/new behavior into a pluggable ConnectionHandlingPolicy. Also, IMPORTANT, made the new behavior the default. This needs to be discussed but it's a major improvement and we should default to it.


Project: http://git-wip-us.apache.org/repos/asf/curator/repo
Commit: http://git-wip-us.apache.org/repos/asf/curator/commit/e2391370
Tree: http://git-wip-us.apache.org/repos/asf/curator/tree/e2391370
Diff: http://git-wip-us.apache.org/repos/asf/curator/diff/e2391370

Branch: refs/heads/CURATOR-247
Commit: e239137019608f02cabb23c27ab13adcef88c027
Parents: 6381ccb
Author: randgalt <ra...@apache.org>
Authored: Sat Aug 22 19:06:55 2015 -0500
Committer: randgalt <ra...@apache.org>
Committed: Sat Aug 22 19:06:55 2015 -0500

----------------------------------------------------------------------
 .../org/apache/curator/ConnectionState.java     | 85 ++++++++++++--------
 .../apache/curator/CuratorZookeeperClient.java  | 32 ++++----
 .../main/java/org/apache/curator/RetryLoop.java | 28 +++++--
 .../ClassicConnectionHandlingPolicy.java        | 48 +++++++++++
 .../connection/ConnectionHandlingPolicy.java    | 84 +++++++++++++++++++
 .../StandardConnectionHandlingPolicy.java       | 35 ++++++++
 .../java/org/apache/curator/TestEnsurePath.java |  5 +-
 .../framework/CuratorFrameworkFactory.java      | 54 +++++++++++--
 .../framework/imps/CuratorFrameworkImpl.java    | 43 +++++-----
 .../framework/state/ConnectionState.java        | 20 +----
 .../framework/state/ConnectionStateManager.java |  9 +--
 .../imps/TestEnabledSessionExpiredState.java    |  5 +-
 .../apache/curator/test/BaseClassForTests.java  |  6 +-
 13 files changed, 336 insertions(+), 118 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-client/src/main/java/org/apache/curator/ConnectionState.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/ConnectionState.java b/curator-client/src/main/java/org/apache/curator/ConnectionState.java
index c3d6921..d6ddd33 100644
--- a/curator-client/src/main/java/org/apache/curator/ConnectionState.java
+++ b/curator-client/src/main/java/org/apache/curator/ConnectionState.java
@@ -18,9 +18,10 @@
  */
 package org.apache.curator;
 
-import org.apache.curator.utils.CloseableUtils;
+import org.apache.curator.connection.ConnectionHandlingPolicy;
 import org.apache.curator.drivers.TracerDriver;
 import org.apache.curator.ensemble.EnsembleProvider;
+import org.apache.curator.utils.CloseableUtils;
 import org.apache.curator.utils.DebugUtils;
 import org.apache.curator.utils.ZookeeperFactory;
 import org.apache.zookeeper.KeeperException;
@@ -32,6 +33,7 @@ import org.slf4j.LoggerFactory;
 import java.io.Closeable;
 import java.io.IOException;
 import java.util.Queue;
+import java.util.concurrent.Callable;
 import java.util.concurrent.ConcurrentLinkedQueue;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicLong;
@@ -48,18 +50,19 @@ class ConnectionState implements Watcher, Closeable
     private final int sessionTimeoutMs;
     private final int connectionTimeoutMs;
     private final AtomicReference<TracerDriver> tracer;
+    private final ConnectionHandlingPolicy connectionHandlingPolicy;
     private final Queue<Exception> backgroundExceptions = new ConcurrentLinkedQueue<Exception>();
     private final Queue<Watcher> parentWatchers = new ConcurrentLinkedQueue<Watcher>();
     private final AtomicLong instanceIndex = new AtomicLong();
     private volatile long connectionStartMs = 0;
-    private final AtomicBoolean enableTimeoutChecks = new AtomicBoolean(true);
 
-    ConnectionState(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher parentWatcher, AtomicReference<TracerDriver> tracer, boolean canBeReadOnly)
+    ConnectionState(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher parentWatcher, AtomicReference<TracerDriver> tracer, boolean canBeReadOnly, ConnectionHandlingPolicy connectionHandlingPolicy)
     {
         this.ensembleProvider = ensembleProvider;
         this.sessionTimeoutMs = sessionTimeoutMs;
         this.connectionTimeoutMs = connectionTimeoutMs;
         this.tracer = tracer;
+        this.connectionHandlingPolicy = connectionHandlingPolicy;
         if ( parentWatcher != null )
         {
             parentWatchers.offer(parentWatcher);
@@ -68,11 +71,6 @@ class ConnectionState implements Watcher, Closeable
         zooKeeper = new HandleHolder(zookeeperFactory, this, ensembleProvider, sessionTimeoutMs, canBeReadOnly);
     }
 
-    void disableTimeoutChecks()
-    {
-        enableTimeoutChecks.set(false);
-    }
-
     ZooKeeper getZooKeeper() throws Exception
     {
         if ( SessionFailRetryLoop.sessionForThreadHasFailed() )
@@ -87,13 +85,10 @@ class ConnectionState implements Watcher, Closeable
             throw exception;
         }
 
-        if ( enableTimeoutChecks.get() )
+        boolean localIsConnected = isConnected.get();
+        if ( !localIsConnected )
         {
-            boolean localIsConnected = isConnected.get();
-            if ( !localIsConnected )
-            {
-                checkTimeouts();
-            }
+            checkTimeouts();
         }
 
         return zooKeeper.getZooKeeper();
@@ -194,35 +189,57 @@ class ConnectionState implements Watcher, Closeable
 
     private synchronized void checkTimeouts() throws Exception
     {
-        int minTimeout = Math.min(sessionTimeoutMs, connectionTimeoutMs);
-        long elapsed = System.currentTimeMillis() - connectionStartMs;
-        if ( elapsed >= minTimeout )
+        Callable<Boolean> hasNewConnectionString  = new Callable<Boolean>()
+        {
+            @Override
+            public Boolean call()
+            {
+                return zooKeeper.hasNewConnectionString();
+            }
+        };
+        ConnectionHandlingPolicy.CheckTimeoutsResult result = connectionHandlingPolicy.checkTimeouts(hasNewConnectionString, connectionStartMs, sessionTimeoutMs, connectionTimeoutMs);
+        switch ( result )
         {
-            if ( zooKeeper.hasNewConnectionString() )
+            default:
+            case NOP:
+            {
+                break;
+            }
+
+            case NEW_CONNECTION_STRING:
             {
                 handleNewConnectionString();
+                break;
             }
-            else
+
+            case RESET_CONNECTION:
             {
-                int maxTimeout = Math.max(sessionTimeoutMs, connectionTimeoutMs);
-                if ( elapsed > maxTimeout )
+                if ( !Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES) )
                 {
-                    if ( !Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES) )
-                    {
-                        log.warn(String.format("Connection attempt unsuccessful after %d (greater than max timeout of %d). Resetting connection and trying again with a new connection.", elapsed, maxTimeout));
-                    }
-                    reset();
+                    long elapsed = System.currentTimeMillis() - connectionStartMs;
+                    int maxTimeout = Math.max(sessionTimeoutMs, connectionTimeoutMs);
+                    log.warn(String.format("Connection attempt unsuccessful after %d (greater than max timeout of %d). Resetting connection and trying again with a new connection.", elapsed, maxTimeout));
                 }
-                else
+                reset();
+                break;
+            }
+
+            case CONNECTION_TIMEOUT:
+            {
+                KeeperException.ConnectionLossException connectionLossException = new CuratorConnectionLossException();
+                if ( !Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES) )
                 {
-                    KeeperException.ConnectionLossException connectionLossException = new CuratorConnectionLossException();
-                    if ( !Boolean.getBoolean(DebugUtils.PROPERTY_DONT_LOG_CONNECTION_ISSUES) )
-                    {
-                        log.error(String.format("Connection timed out for connection string (%s) and timeout (%d) / elapsed (%d)", zooKeeper.getConnectionString(), connectionTimeoutMs, elapsed), connectionLossException);
-                    }
-                    tracer.get().addCount("connections-timed-out", 1);
-                    throw connectionLossException;
+                    long elapsed = System.currentTimeMillis() - connectionStartMs;
+                    log.error(String.format("Connection timed out for connection string (%s) and timeout (%d) / elapsed (%d)", zooKeeper.getConnectionString(), connectionTimeoutMs, elapsed), connectionLossException);
                 }
+                tracer.get().addCount("connections-timed-out", 1);
+                throw connectionLossException;
+            }
+
+            case SESSION_TIMEOUT:
+            {
+                handleExpiredSession();
+                break;
             }
         }
     }

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java b/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
index a065d78..9342acf 100644
--- a/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
+++ b/curator-client/src/main/java/org/apache/curator/CuratorZookeeperClient.java
@@ -21,6 +21,8 @@ package org.apache.curator;
 
 import com.google.common.annotations.VisibleForTesting;
 import com.google.common.base.Preconditions;
+import org.apache.curator.connection.ClassicConnectionHandlingPolicy;
+import org.apache.curator.connection.ConnectionHandlingPolicy;
 import org.apache.curator.drivers.TracerDriver;
 import org.apache.curator.ensemble.EnsembleProvider;
 import org.apache.curator.ensemble.fixed.FixedEnsembleProvider;
@@ -51,7 +53,7 @@ public class CuratorZookeeperClient implements Closeable
     private final int connectionTimeoutMs;
     private final AtomicBoolean started = new AtomicBoolean(false);
     private final AtomicReference<TracerDriver> tracer = new AtomicReference<TracerDriver>(new DefaultTracerDriver());
-    private final boolean manageTimeouts;
+    private final ConnectionHandlingPolicy connectionHandlingPolicy;
     private final AtomicReference<Exception> debugException = new AtomicReference<>();
 
     /**
@@ -64,7 +66,7 @@ public class CuratorZookeeperClient implements Closeable
      */
     public CuratorZookeeperClient(String connectString, int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy)
     {
-        this(new DefaultZookeeperFactory(), new FixedEnsembleProvider(connectString), sessionTimeoutMs, connectionTimeoutMs, watcher, retryPolicy, false, true);
+        this(new DefaultZookeeperFactory(), new FixedEnsembleProvider(connectString), sessionTimeoutMs, connectionTimeoutMs, watcher, retryPolicy, false, new ClassicConnectionHandlingPolicy());
     }
 
     /**
@@ -76,7 +78,7 @@ public class CuratorZookeeperClient implements Closeable
      */
     public CuratorZookeeperClient(EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy)
     {
-        this(new DefaultZookeeperFactory(), ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, retryPolicy, false, true);
+        this(new DefaultZookeeperFactory(), ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, retryPolicy, false, new ClassicConnectionHandlingPolicy());
     }
 
     /**
@@ -93,7 +95,7 @@ public class CuratorZookeeperClient implements Closeable
      */
     public CuratorZookeeperClient(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy, boolean canBeReadOnly)
     {
-        this(new DefaultZookeeperFactory(), ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, retryPolicy, canBeReadOnly, true);
+        this(new DefaultZookeeperFactory(), ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, retryPolicy, canBeReadOnly, new ClassicConnectionHandlingPolicy());
     }
 
     /**
@@ -107,11 +109,12 @@ public class CuratorZookeeperClient implements Closeable
      *                      read only mode in case of a network partition. See
      *                      {@link ZooKeeper#ZooKeeper(String, int, Watcher, long, byte[], boolean)}
      *                      for details
-     * @param manageTimeouts in general, Curator clients try to manage session/connection timeouts. If this is false, that management is turned off
+     * @param connectionHandlingPolicy connection handling policy - use one of the pre-defined policies or write your own
+     * @since 3.0.0
      */
-    public CuratorZookeeperClient(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy, boolean canBeReadOnly, boolean manageTimeouts)
+    public CuratorZookeeperClient(ZookeeperFactory zookeeperFactory, EnsembleProvider ensembleProvider, int sessionTimeoutMs, int connectionTimeoutMs, Watcher watcher, RetryPolicy retryPolicy, boolean canBeReadOnly, ConnectionHandlingPolicy connectionHandlingPolicy)
     {
-        this.manageTimeouts = manageTimeouts;
+        this.connectionHandlingPolicy = connectionHandlingPolicy;
         if ( sessionTimeoutMs < connectionTimeoutMs )
         {
             log.warn(String.format("session timeout [%d] is less than connection timeout [%d]", sessionTimeoutMs, connectionTimeoutMs));
@@ -121,11 +124,7 @@ public class CuratorZookeeperClient implements Closeable
         ensembleProvider = Preconditions.checkNotNull(ensembleProvider, "ensembleProvider cannot be null");
 
         this.connectionTimeoutMs = connectionTimeoutMs;
-        state = new ConnectionState(zookeeperFactory, ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, tracer, canBeReadOnly);
-        if ( !manageTimeouts )
-        {
-            state.disableTimeoutChecks();
-        }
+        state = new ConnectionState(zookeeperFactory, ensembleProvider, sessionTimeoutMs, connectionTimeoutMs, watcher, tracer, canBeReadOnly, connectionHandlingPolicy);
         setRetryPolicy(retryPolicy);
     }
 
@@ -328,14 +327,13 @@ public class CuratorZookeeperClient implements Closeable
     }
 
     /**
-     * Returns true if connection timeouts should cause the retry policy to be checked. If false
-     * is returned, throw a connection exception without retrying
+     * Return the configured connection handling policy
      *
-     * @return true/false
+     * @return ConnectionHandlingPolicy
      */
-    public boolean retryConnectionTimeouts()
+    public ConnectionHandlingPolicy getConnectionHandlingPolicy()
     {
-        return manageTimeouts;
+        return connectionHandlingPolicy;
     }
 
     @VisibleForTesting

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/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 92291c1..35d55a1 100644
--- a/curator-client/src/main/java/org/apache/curator/RetryLoop.java
+++ b/curator-client/src/main/java/org/apache/curator/RetryLoop.java
@@ -110,14 +110,30 @@ public class RetryLoop
                 }
 
                 client.internalBlockUntilConnectedOrTimedOut();
-                if ( !client.isConnected() && !client.retryConnectionTimeouts() )
+
+                switch ( client.getConnectionHandlingPolicy().preRetry(client) )
                 {
-                    connectionFailed = true;
-                    break;
+                    default:
+                    case CALL_PROC:
+                    {
+                        result = proc.call();
+                        retryLoop.markComplete();
+                        break;
+                    }
+
+                    case EXIT_RETRIES:
+                    {
+                        retryLoop.markComplete();
+                        break;
+                    }
+
+                    case CONNECTION_TIMEOUT:
+                    {
+                        connectionFailed = true;
+                        retryLoop.markComplete();
+                        break;
+                    }
                 }
-
-                result = proc.call();
-                retryLoop.markComplete();
             }
             catch ( Exception e )
             {

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-client/src/main/java/org/apache/curator/connection/ClassicConnectionHandlingPolicy.java
----------------------------------------------------------------------
diff --git a/curator-client/src/main/java/org/apache/curator/connection/ClassicConnectionHandlingPolicy.java b/curator-client/src/main/java/org/apache/curator/connection/ClassicConnectionHandlingPolicy.java
new file mode 100644
index 0000000..71dc065
--- /dev/null
+++ b/curator-client/src/main/java/org/apache/curator/connection/ClassicConnectionHandlingPolicy.java
@@ -0,0 +1,48 @@
+package org.apache.curator.connection;
+
+import org.apache.curator.CuratorZookeeperClient;
+import java.util.concurrent.Callable;
+
+public class ClassicConnectionHandlingPolicy implements ConnectionHandlingPolicy
+{
+    @Override
+    public boolean isEmulatingClassicHandling()
+    {
+        return true;
+    }
+
+    @Override
+    public CheckTimeoutsResult checkTimeouts(Callable<Boolean> hasNewConnectionString, long connectionStartMs, int sessionTimeoutMs, int connectionTimeoutMs) throws Exception
+    {
+        CheckTimeoutsResult result = CheckTimeoutsResult.NOP;
+        int minTimeout = Math.min(sessionTimeoutMs, connectionTimeoutMs);
+        long elapsed = System.currentTimeMillis() - connectionStartMs;
+        if ( elapsed >= minTimeout )
+        {
+            if ( hasNewConnectionString.call() )
+            {
+                result = CheckTimeoutsResult.NEW_CONNECTION_STRING;
+            }
+            else
+            {
+                int maxTimeout = Math.max(sessionTimeoutMs, connectionTimeoutMs);
+                if ( elapsed > maxTimeout )
+                {
+                    result = CheckTimeoutsResult.RESET_CONNECTION;
+                }
+                else
+                {
+                    result = CheckTimeoutsResult.CONNECTION_TIMEOUT;
+                }
+            }
+        }
+
+        return result;
+    }
+
+    @Override
+    public PreRetryResult preRetry(CuratorZookeeperClient client) throws Exception
+    {
+        return PreRetryResult.CALL_PROC;
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/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
new file mode 100644
index 0000000..f3ecce6
--- /dev/null
+++ b/curator-client/src/main/java/org/apache/curator/connection/ConnectionHandlingPolicy.java
@@ -0,0 +1,84 @@
+package org.apache.curator.connection;
+
+import org.apache.curator.CuratorZookeeperClient;
+import org.apache.zookeeper.KeeperException;
+import java.util.concurrent.Callable;
+
+public interface ConnectionHandlingPolicy
+{
+    /**
+     * Return true if this policy should behave like the pre-3.0.0 version of Curator
+     *
+     * @return true/false
+     */
+    boolean isEmulatingClassicHandling();
+
+    enum CheckTimeoutsResult
+    {
+        /**
+         * Do nothing
+         */
+        NOP,
+
+        /**
+         * handle a new connection string
+         */
+        NEW_CONNECTION_STRING,
+
+        /**
+         * reset/recreate the internal ZooKeeper connection
+         */
+        RESET_CONNECTION,
+
+        /**
+         * handle a connection timeout
+         */
+        CONNECTION_TIMEOUT,
+
+        /**
+         * handle a session timeout
+         */
+        SESSION_TIMEOUT
+    }
+
+    /**
+     * Check timeouts. NOTE: this method is only called when an attempt to access to the ZooKeeper instances
+     * is made and the connection has not completed.
+     *
+     * @param hasNewConnectionString proc to call to check if there is a new connection string. Important: the internal state is cleared after
+     *                               this is called so you MUST handle the new connection string if <tt>true</tt> is returned
+     * @param connectionStartMs the epoch/ms time that the connection was first initiated
+     * @param sessionTimeoutMs the configured session timeout in milliseconds
+     * @param connectionTimeoutMs the configured connection timeout in milliseconds
+     * @return result
+     * @throws Exception errors
+     */
+    CheckTimeoutsResult checkTimeouts(Callable<Boolean> hasNewConnectionString, long connectionStartMs, int sessionTimeoutMs, int connectionTimeoutMs) throws Exception;
+
+    enum PreRetryResult
+    {
+        /**
+         * The retry loop should call the procedure
+         */
+        CALL_PROC,
+
+        /**
+         * Do not call the procedure and exit the retry loop
+         */
+        EXIT_RETRIES,
+
+        /**
+         * Do not call the procedure and throw {@link KeeperException.ConnectionLossException}
+         */
+        CONNECTION_TIMEOUT
+    }
+
+    /**
+     * Called prior to each iteration of a procedure in a retry loop
+     *
+     * @param client the client
+     * @return result
+     * @throws Exception errors
+     */
+    PreRetryResult preRetry(CuratorZookeeperClient client) throws Exception;
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/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
new file mode 100644
index 0000000..06285ca
--- /dev/null
+++ b/curator-client/src/main/java/org/apache/curator/connection/StandardConnectionHandlingPolicy.java
@@ -0,0 +1,35 @@
+package org.apache.curator.connection;
+
+import org.apache.curator.CuratorZookeeperClient;
+import java.util.concurrent.Callable;
+
+public class StandardConnectionHandlingPolicy implements ConnectionHandlingPolicy
+{
+    @Override
+    public boolean isEmulatingClassicHandling()
+    {
+        return false;
+    }
+
+    @Override
+    public CheckTimeoutsResult checkTimeouts(Callable<Boolean> hasNewConnectionString, long connectionStartMs, int sessionTimeoutMs, int connectionTimeoutMs) throws Exception
+    {
+        if ( hasNewConnectionString.call() )
+        {
+            return CheckTimeoutsResult.NEW_CONNECTION_STRING;
+        }
+        return CheckTimeoutsResult.NOP;
+    }
+
+    @Override
+    public PreRetryResult preRetry(CuratorZookeeperClient client) throws Exception
+    {
+        // TODO - see if there are other servers to connect to
+        if ( !client.isConnected() )
+        {
+            return PreRetryResult.CONNECTION_TIMEOUT;
+        }
+
+        return PreRetryResult.CALL_PROC;
+    }
+}

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
----------------------------------------------------------------------
diff --git a/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java b/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
index 871e4af..59c30ac 100644
--- a/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
+++ b/curator-client/src/test/java/org/apache/curator/TestEnsurePath.java
@@ -32,6 +32,7 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.Semaphore;
 import java.util.concurrent.TimeUnit;
 
+import org.apache.curator.connection.ClassicConnectionHandlingPolicy;
 import org.apache.curator.retry.RetryOneTime;
 import org.apache.curator.utils.EnsurePath;
 import org.apache.zookeeper.ZooKeeper;
@@ -51,7 +52,7 @@ public class TestEnsurePath
         CuratorZookeeperClient  curator = mock(CuratorZookeeperClient.class);
         RetryPolicy             retryPolicy = new RetryOneTime(1);
         RetryLoop               retryLoop = new RetryLoop(retryPolicy, null);
-        when(curator.retryConnectionTimeouts()).thenReturn(true);
+        when(curator.getConnectionHandlingPolicy()).thenReturn(new ClassicConnectionHandlingPolicy());
         when(curator.getZooKeeper()).thenReturn(client);
         when(curator.getRetryPolicy()).thenReturn(retryPolicy);
         when(curator.newRetryLoop()).thenReturn(retryLoop);
@@ -77,7 +78,7 @@ public class TestEnsurePath
         RetryPolicy             retryPolicy = new RetryOneTime(1);
         RetryLoop               retryLoop = new RetryLoop(retryPolicy, null);
         final CuratorZookeeperClient  curator = mock(CuratorZookeeperClient.class);
-        when(curator.retryConnectionTimeouts()).thenReturn(true);
+        when(curator.getConnectionHandlingPolicy()).thenReturn(new ClassicConnectionHandlingPolicy());
         when(curator.getZooKeeper()).thenReturn(client);
         when(curator.getRetryPolicy()).thenReturn(retryPolicy);
         when(curator.newRetryLoop()).thenReturn(retryLoop);

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-framework/src/main/java/org/apache/curator/framework/CuratorFrameworkFactory.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/CuratorFrameworkFactory.java b/curator-framework/src/main/java/org/apache/curator/framework/CuratorFrameworkFactory.java
index fad4fc2..01a8666 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/CuratorFrameworkFactory.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/CuratorFrameworkFactory.java
@@ -21,6 +21,9 @@ package org.apache.curator.framework;
 
 import com.google.common.collect.ImmutableList;
 import org.apache.curator.RetryPolicy;
+import org.apache.curator.connection.ClassicConnectionHandlingPolicy;
+import org.apache.curator.connection.ConnectionHandlingPolicy;
+import org.apache.curator.connection.StandardConnectionHandlingPolicy;
 import org.apache.curator.ensemble.EnsembleProvider;
 import org.apache.curator.ensemble.fixed.FixedEnsembleProvider;
 import org.apache.curator.framework.api.ACLProvider;
@@ -35,6 +38,7 @@ import org.apache.curator.framework.state.ConnectionState;
 import org.apache.curator.utils.DefaultZookeeperFactory;
 import org.apache.curator.utils.ZookeeperFactory;
 import org.apache.zookeeper.CreateMode;
+import org.apache.zookeeper.KeeperException;
 import org.apache.zookeeper.Watcher;
 import org.apache.zookeeper.ZooKeeper;
 import java.net.InetAddress;
@@ -117,7 +121,7 @@ public class CuratorFrameworkFactory
         private ACLProvider aclProvider = DEFAULT_ACL_PROVIDER;
         private boolean canBeReadOnly = false;
         private boolean useContainerParentsIfAvailable = true;
-        private boolean enableSessionExpiredState = Boolean.getBoolean("curator-enable-session-expired-state");
+        private ConnectionHandlingPolicy connectionHandlingPolicy = Boolean.getBoolean("curator-use-classic-connection-handling") ? new ClassicConnectionHandlingPolicy() : new StandardConnectionHandlingPolicy();
 
         /**
          * Apply the current values and build a new CuratorFramework
@@ -346,14 +350,50 @@ public class CuratorFrameworkFactory
         }
 
         /**
-         * Changes the meaning of {@link ConnectionState#LOST} from it's pre Curator 3.0.0 meaning
-         * to a true lost session state. See the {@link ConnectionState#LOST} doc for details.
+         * <p>
+         *     Change the connection handling policy. The default policy is {@link StandardConnectionHandlingPolicy}.
+         * </p>
+         * <p>
+         *     <strong>IMPORTANT: </strong> StandardConnectionHandlingPolicy has different behavior than the connection
+         *     policy handling prior to version 3.0.0. You can specify that the connection handling be the method
+         *     prior to 3.0.0 by passing in an instance of {@link ClassicConnectionHandlingPolicy} here or by
+         *     setting the command line value "curator-use-classic-connection-handling" to true (e.g. <tt>-Dcurator-use-classic-connection-handling=true</tt>).
+         * </p>
+         * <p>
+         *     Major differences from the older behavior are:
+         * </p>
+         * <ul>
+         *     <li>
+         *         Session/connection timeouts are no longer managed by the low-level client. They are managed
+         *         by the CuratorFramework instance. There should be no noticeable differences.
+         *     </li>
+         *     <li>
+         *         Prior to 3.0.0, an elapsed connection timeout would be presented to the retry policy, possibly
+         *         causing retries. Now, elapsed connection timeouts are only retried if there is an another server
+         *         in the connection string. i.e. a new instance will be retried should the retry policy allow a retry.
+         *         If no other servers remain, a {@link KeeperException.ConnectionLossException} is thrown immediately
+         *         without notifying the retry policy.
+         *     </li>
+         *     <li>
+         *         <strong>MOST IMPORTANTLY!</strong> Prior to 3.0.0, {@link ConnectionState#LOST} did not imply
+         *         a lost session (much to the confusion of users). Now,
+         *         Curator will set the LOST state only when it believes that the ZooKeeper session
+         *         has expired. ZooKeeper connections have a session. When the session expires, clients must take appropriate
+         *         action. In Curator, this is complicated by the fact that Curator internally manages the ZooKeeper
+         *         connection. Now, Curator will set the LOST state when any of the following occurs:
+         *         a) ZooKeeper returns a {@link Watcher.Event.KeeperState#Expired} or {@link KeeperException.Code#SESSIONEXPIRED};
+         *         b) Curator closes the internally managed ZooKeeper instance; c) The configured session timeout
+         *         elapses during a network partition.
+         *     </li>
+         * </ul>
          *
+         * @param connectionHandlingPolicy the policy
          * @return this
+         * @since 3.0.0
          */
-        public Builder enableSessionExpiredState()
+        public Builder connectionHandlingPolicy(ConnectionHandlingPolicy connectionHandlingPolicy)
         {
-            this.enableSessionExpiredState = true;
+            this.connectionHandlingPolicy = connectionHandlingPolicy;
             return this;
         }
 
@@ -412,9 +452,9 @@ public class CuratorFrameworkFactory
             return useContainerParentsIfAvailable;
         }
 
-        public boolean getEnableSessionExpiredState()
+        public ConnectionHandlingPolicy getConnectionHandlingPolicy()
         {
-            return enableSessionExpiredState;
+            return connectionHandlingPolicy;
         }
 
         @Deprecated

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
index bcbeecd..44a8ec6 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/imps/CuratorFrameworkImpl.java
@@ -84,7 +84,6 @@ public class CuratorFrameworkImpl implements CuratorFramework
     private final NamespaceFacadeCache namespaceFacadeCache;
     private final NamespaceWatcherMap namespaceWatcherMap = new NamespaceWatcherMap(this);
     private final boolean useContainerParentsIfAvailable;
-    private final boolean enableSessionExpiredState;
     private final AtomicLong currentInstanceIndex = new AtomicLong(-1);
 
     private volatile ExecutorService executorService;
@@ -107,24 +106,24 @@ public class CuratorFrameworkImpl implements CuratorFramework
     {
         ZookeeperFactory localZookeeperFactory = makeZookeeperFactory(builder.getZookeeperFactory());
         this.client = new CuratorZookeeperClient
-        (
-            localZookeeperFactory,
-            builder.getEnsembleProvider(),
-            builder.getSessionTimeoutMs(),
-            builder.getConnectionTimeoutMs(),
-            new Watcher()
-            {
-                @Override
-                public void process(WatchedEvent watchedEvent)
+            (
+                localZookeeperFactory,
+                builder.getEnsembleProvider(),
+                builder.getSessionTimeoutMs(),
+                builder.getConnectionTimeoutMs(),
+                new Watcher()
                 {
-                    CuratorEvent event = new CuratorEventImpl(CuratorFrameworkImpl.this, CuratorEventType.WATCHED, watchedEvent.getState().getIntValue(), unfixForNamespace(watchedEvent.getPath()), null, null, null, null, null, watchedEvent, null, null);
-                    processEvent(event);
-                }
-            },
-            builder.getRetryPolicy(),
-            builder.canBeReadOnly(),
-            !builder.getEnableSessionExpiredState() // inverse is correct here. By default, CuratorZookeeperClient manages timeouts. The new SessionExpiredState needs this disabled.
-        );
+                    @Override
+                    public void process(WatchedEvent watchedEvent)
+                    {
+                        CuratorEvent event = new CuratorEventImpl(CuratorFrameworkImpl.this, CuratorEventType.WATCHED, watchedEvent.getState().getIntValue(), unfixForNamespace(watchedEvent.getPath()), null, null, null, null, null, watchedEvent, null, null);
+                        processEvent(event);
+                    }
+                },
+                builder.getRetryPolicy(),
+                builder.canBeReadOnly(),
+                builder.getConnectionHandlingPolicy()
+            );
 
         listeners = new ListenerContainer<CuratorListener>();
         unhandledErrorListeners = new ListenerContainer<UnhandledErrorListener>();
@@ -132,12 +131,11 @@ public class CuratorFrameworkImpl implements CuratorFramework
         namespace = new NamespaceImpl(this, builder.getNamespace());
         threadFactory = getThreadFactory(builder);
         maxCloseWaitMs = builder.getMaxCloseWaitMs();
-        connectionStateManager = new ConnectionStateManager(this, builder.getThreadFactory(), builder.getEnableSessionExpiredState(), builder.getSessionTimeoutMs());
+        connectionStateManager = new ConnectionStateManager(this, builder.getThreadFactory(), builder.getSessionTimeoutMs());
         compressionProvider = builder.getCompressionProvider();
         aclProvider = builder.getAclProvider();
         state = new AtomicReference<CuratorFrameworkState>(CuratorFrameworkState.LATENT);
         useContainerParentsIfAvailable = builder.useContainerParentsIfAvailable();
-        enableSessionExpiredState = builder.getEnableSessionExpiredState();
 
         byte[] builderDefaultData = builder.getDefaultData();
         defaultData = (builderDefaultData != null) ? Arrays.copyOf(builderDefaultData, builderDefaultData.length) : new byte[0];
@@ -211,7 +209,6 @@ public class CuratorFrameworkImpl implements CuratorFramework
         state = parent.state;
         authInfos = parent.authInfos;
         useContainerParentsIfAvailable = parent.useContainerParentsIfAvailable;
-        enableSessionExpiredState = parent.enableSessionExpiredState;
     }
 
     @Override
@@ -699,7 +696,7 @@ public class CuratorFrameworkImpl implements CuratorFramework
 
     private void checkNewConnection()
     {
-        if ( enableSessionExpiredState )
+        if ( !client.getConnectionHandlingPolicy().isEmulatingClassicHandling() )
         {
             long instanceIndex = client.getInstanceIndex();
             long newInstanceIndex = currentInstanceIndex.getAndSet(instanceIndex);
@@ -752,7 +749,7 @@ public class CuratorFrameworkImpl implements CuratorFramework
             return;
         }
 
-        if ( !enableSessionExpiredState )
+        if ( client.getConnectionHandlingPolicy().isEmulatingClassicHandling() )
         {
             doSyncForSuspendedConnection(client.getInstanceIndex());
         }

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionState.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionState.java b/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionState.java
index 79f3b62..fe40abf 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionState.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionState.java
@@ -64,32 +64,18 @@ public enum ConnectionState
 
     /**
      * <p>
-     *     NOTE: the meaning of this state depends on how your CuratorFramework instance
-     *     is created.
-     * </p>
-     *
-     * <p>
-     *     The default meaning of LOST (and the only meaning prior to Curator 3.0.0) is:
-     *     The connection is confirmed to be lost (i.e. the retry policy has given up). Close any locks, leaders, etc. and
-     *     attempt to re-create them. NOTE: it is possible to get a {@link #RECONNECTED}
-     *     state after this but you should still consider any locks, etc. as dirty/unstable
-     * </p>
-     *
-     * <p>
-     *     <strong>Since 3.0.0</strong>, you can alter the meaning of LOST by calling
-     *     {@link CuratorFrameworkFactory.Builder#enableSessionExpiredState()}. In this mode,
      *     Curator will set the LOST state only when it believes that the ZooKeeper session
      *     has expired. ZooKeeper connections have a session. When the session expires, clients must take appropriate
      *     action. In Curator, this is complicated by the fact that Curator internally manages the ZooKeeper
-     *     connection. In this mode, Curator will set the LOST state when any of the following occurs:
+     *     connection. Curator will set the LOST state when any of the following occurs:
      *     a) ZooKeeper returns a {@link Watcher.Event.KeeperState#Expired} or {@link KeeperException.Code#SESSIONEXPIRED};
      *     b) Curator closes the internally managed ZooKeeper instance; c) The configured session timeout
      *     elapses during a network partition.
      * </p>
      *
      * <p>
-     *     NOTE: the new behavior for the LOST state can also be enabled via the command line
-     *     property "curator-enable-session-expired-state" (e.g. -Dcurator-enable-session-expired-state=true)
+     *     NOTE: see {@link CuratorFrameworkFactory.Builder#connectionHandlingPolicy} for an important note about a
+     *     change in meaning to LOST since 3.0.0
      * </p>
      */
     LOST

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionStateManager.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionStateManager.java b/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionStateManager.java
index 52e0d07..2e7492f 100644
--- a/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionStateManager.java
+++ b/curator-framework/src/main/java/org/apache/curator/framework/state/ConnectionStateManager.java
@@ -21,6 +21,7 @@ package org.apache.curator.framework.state;
 
 import com.google.common.base.Function;
 import com.google.common.base.Preconditions;
+import org.apache.curator.connection.ConnectionHandlingPolicyStyle;
 import org.apache.curator.framework.CuratorFramework;
 import org.apache.curator.framework.listen.ListenerContainer;
 import org.apache.curator.utils.ThreadUtils;
@@ -35,7 +36,6 @@ import java.util.concurrent.Executors;
 import java.util.concurrent.ThreadFactory;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicBoolean;
-import java.util.concurrent.atomic.AtomicLong;
 import java.util.concurrent.atomic.AtomicReference;
 
 /**
@@ -66,7 +66,6 @@ public class ConnectionStateManager implements Closeable
     private final Logger log = LoggerFactory.getLogger(getClass());
     private final BlockingQueue<ConnectionState> eventQueue = new ArrayBlockingQueue<ConnectionState>(QUEUE_SIZE);
     private final CuratorFramework client;
-    private final boolean enableSessionExpiredState;
     private final int sessionTimeoutMs;
     private final ListenerContainer<ConnectionStateListener> listeners = new ListenerContainer<ConnectionStateListener>();
     private final AtomicBoolean initialConnectMessageSent = new AtomicBoolean(false);
@@ -88,13 +87,11 @@ public class ConnectionStateManager implements Closeable
     /**
      * @param client        the client
      * @param threadFactory thread factory to use or null for a default
-     * @param enableSessionExpiredState if true, applies new meaning for LOST as described here: {@link ConnectionState#LOST}
      * @param sessionTimeoutMs the ZK session timeout in milliseconds
      */
-    public ConnectionStateManager(CuratorFramework client, ThreadFactory threadFactory, boolean enableSessionExpiredState, int sessionTimeoutMs)
+    public ConnectionStateManager(CuratorFramework client, ThreadFactory threadFactory, int sessionTimeoutMs)
     {
         this.client = client;
-        this.enableSessionExpiredState = enableSessionExpiredState;
         this.sessionTimeoutMs = sessionTimeoutMs;
         if ( threadFactory == null )
         {
@@ -273,7 +270,7 @@ public class ConnectionStateManager implements Closeable
                             }
                         );
                 }
-                else if ( enableSessionExpiredState )
+                else if ( !client.getZookeeperClient().getConnectionHandlingPolicy().isEmulatingClassicHandling() )
                 {
                     synchronized(this)
                     {

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
----------------------------------------------------------------------
diff --git a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
index cd415b1..4d6f473 100644
--- a/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
+++ b/curator-framework/src/test/java/org/apache/curator/framework/imps/TestEnabledSessionExpiredState.java
@@ -53,7 +53,6 @@ public class TestEnabledSessionExpiredState extends BaseClassForTests
             .connectString(server.getConnectString())
             .connectionTimeoutMs(timing.connection())
             .sessionTimeoutMs(timing.session())
-            .enableSessionExpiredState()
             .retryPolicy(new RetryOneTime(1))
             .build();
         client.start();
@@ -115,7 +114,7 @@ public class TestEnabledSessionExpiredState extends BaseClassForTests
         Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.CONNECTED);
         server.stop();
         Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-        Assert.assertEquals(states.poll(timing.multiple(2).session(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+        Assert.assertEquals(states.poll(timing.sessionSleep(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
     }
 
     @Test
@@ -125,7 +124,7 @@ public class TestEnabledSessionExpiredState extends BaseClassForTests
         server.stop();
         timing.sleepForSession();
         Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.SUSPENDED);
-        Assert.assertEquals(states.poll(timing.multiple(2).session(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
+        Assert.assertEquals(states.poll(timing.sessionSleep(), TimeUnit.MILLISECONDS), ConnectionState.LOST);
         server.restart();
         client.checkExists().forPath("/");
         Assert.assertEquals(states.poll(timing.milliseconds(), TimeUnit.MILLISECONDS), ConnectionState.RECONNECTED);

http://git-wip-us.apache.org/repos/asf/curator/blob/e2391370/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
----------------------------------------------------------------------
diff --git a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
index c9f3524..1f6503d 100644
--- a/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
+++ b/curator-test/src/main/java/org/apache/curator/test/BaseClassForTests.java
@@ -86,14 +86,14 @@ public class BaseClassForTests
                 public void beforeInvocation(IInvokedMethod method, ITestResult testResult)
                 {
                     int invocationCount = method.getTestMethod().getCurrentInvocationCount();
-                    System.setProperty("curator-enable-session-expired-state", Boolean.toString(invocationCount == 1));
-                    log.info("curator-enable-session-expired-state: " + Boolean.toString(invocationCount == 1));
+                    System.setProperty("curator-use-classic-connection-handling", Boolean.toString(invocationCount == 1));
+                    log.info("curator-use-classic-connection-handling: " + Boolean.toString(invocationCount == 1));
                 }
 
                 @Override
                 public void afterInvocation(IInvokedMethod method, ITestResult testResult)
                 {
-                    System.clearProperty("curator-enable-session-expired-state");
+                    System.clearProperty("curator-use-classic-connection-handling");
                 }
             };
             context.getSuite().addListener(listener);