Class SessionFailRetryLoop

java.lang.Object
org.apache.curator.SessionFailRetryLoop
All Implemented Interfaces:
Closeable, AutoCloseable

public class SessionFailRetryLoop extends Object implements Closeable

See RetryLoop for the main details on retry loops. All Curator/ZooKeeper operations should be done in a retry loop.

The standard retry loop treats session failure as a type of connection failure. i.e. the fact that it is a session failure isn't considered. This can be problematic if you are performing a series of operations that rely on ephemeral nodes. If the session fails after the ephemeral node has been created, future Curator/ZooKeeper operations may succeed even though the ephemeral node has been removed by ZooKeeper.

Here's an example:

  • You create an ephemeral/sequential node as a kind of lock/marker
  • You perform some other operations
  • The session fails for some reason
  • You attempt to create a node assuming that the lock/marker still exists
    • Curator will notice the session failure and try to reconnect
    • In most cases, the reconnect will succeed and, thus, the node creation will succeed even though the ephemeral node will have been deleted by ZooKeeper.

The SessionFailRetryLoop prevents this type of scenario. When a session failure is detected, the thread is marked as failed which will cause all future Curator operations to fail. The SessionFailRetryLoop will then either retry the entire set of operations or fail (depending on SessionFailRetryLoop.Mode)

Canonical usage:
 SessionFailRetryLoop    retryLoop = client.newSessionFailRetryLoop(mode);
 retryLoop.start();
 try
 {
     while ( retryLoop.shouldContinue() )
     {
         try
         {
             // do work
         }
         catch ( Exception e )
         {
             retryLoop.takeException(e);
         }
     }
 }
 finally
 {
     retryLoop.close();
 }
 
  • Method Details

    • callWithRetry

      public static <T> T callWithRetry(CuratorZookeeperClient client, SessionFailRetryLoop.Mode mode, Callable<T> proc) throws Exception
      Convenience utility: creates a "session fail" retry loop calling the given proc
      Type Parameters:
      T - return type
      Parameters:
      client - Zookeeper
      mode - how to handle session failures
      proc - procedure to call with retry
      Returns:
      procedure result
      Throws:
      Exception - any non-retriable errors
    • start

      public void start()
      SessionFailRetryLoop must be started
    • shouldContinue

      public boolean shouldContinue()
      If true is returned, make an attempt at the set of operations
      Returns:
      true/false
    • close

      public void close()
      Must be called in a finally handler when done with the loop
      Specified by:
      close in interface AutoCloseable
      Specified by:
      close in interface Closeable
    • takeException

      public void takeException(Exception exception) throws Exception
      Pass any caught exceptions here
      Parameters:
      exception - the exception
      Throws:
      Exception - if not retry-able or the retry policy returned negative