You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by la...@apache.org on 2012/03/24 23:03:04 UTC

svn commit: r1304941 - in /hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase: util/RetryCounter.java zookeeper/RecoverableZooKeeper.java

Author: larsh
Date: Sat Mar 24 22:03:04 2012
New Revision: 1304941

URL: http://svn.apache.org/viewvc?rev=1304941&view=rev
Log:
HBASE-4957 Clean up some log messages, code in RecoverableZooKeeper (Todd)

Modified:
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/RetryCounter.java
    hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.java

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/RetryCounter.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/RetryCounter.java?rev=1304941&r1=1304940&r2=1304941&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/RetryCounter.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/util/RetryCounter.java Sat Mar 24 22:03:04 2012
@@ -50,8 +50,7 @@ public class RetryCounter {
   public void sleepUntilNextRetry() throws InterruptedException {
     int attempts = getAttemptTimes();
     long sleepTime = (long) (retryIntervalMillis * Math.pow(2, attempts));
-    LOG.info("The " + attempts + " times to retry  after sleeping " + sleepTime
-        + " ms");
+    LOG.info("Sleeping " + sleepTime + "ms before retry #" + attempts + "...");
     timeUnit.sleep(sleepTime);
   }
 
@@ -66,4 +65,4 @@ public class RetryCounter {
   public int getAttemptTimes() {
     return maxRetries-retriesRemaining+1;
   }
-}
\ No newline at end of file
+}

Modified: hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.java?rev=1304941&r1=1304940&r2=1304941&view=diff
==============================================================================
--- hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.java (original)
+++ hbase/branches/0.94/src/main/java/org/apache/hadoop/hbase/zookeeper/RecoverableZooKeeper.java Sat Mar 24 22:03:04 2012
@@ -71,10 +71,18 @@ public class RecoverableZooKeeper {
   private final byte[] id;
   private int retryIntervalMillis;
 
-  private static final int ID_OFFSET =  Bytes.SIZEOF_INT;
+  // The metadata attached to each piece of data has the
+  // format:
+  //   <magic> 1-byte constant
+  //   <id length> 4-byte big-endian integer (length of next field)
+  //   <id> identifier corresponding uniquely to this process
+  // It is prepended to the data supplied by the user.
+
   // the magic number is to be backward compatible
   private static final byte MAGIC =(byte) 0XFF;
-  private static final int MAGIC_OFFSET = Bytes.SIZEOF_BYTE;
+  private static final int MAGIC_SIZE = Bytes.SIZEOF_BYTE;
+  private static final int ID_LENGTH_OFFSET = MAGIC_SIZE;
+  private static final int ID_LENGTH_SIZE =  Bytes.SIZEOF_INT;
 
   public RecoverableZooKeeper(String quorumServers, int seesionTimeout,
       Watcher watcher, int maxRetries, int retryIntervalMillis) 
@@ -91,12 +99,9 @@ public class RecoverableZooKeeper {
   }
 
   /**
-   * delete is an idempotent operation. Retry before throw out exception.
-   * This function will not throw out NoNodeException if the path is not existed
-   * @param path
-   * @param version
-   * @throws InterruptedException
-   * @throws KeeperException
+   * delete is an idempotent operation. Retry before throwing exception.
+   * This function will not throw NoNodeException if the path does not
+   * exist.
    */
   public void delete(String path, int version)
   throws InterruptedException, KeeperException {
@@ -120,12 +125,7 @@ public class RecoverableZooKeeper {
 
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper delete failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "delete");
             break;
 
           default:
@@ -139,12 +139,8 @@ public class RecoverableZooKeeper {
   }
 
   /**
-   * exists is an idempotent operation. Retry before throw out exception
-   * @param path
-   * @param watcher
+   * exists is an idempotent operation. Retry before throwing exception
    * @return A Stat instance
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public Stat exists(String path, Watcher watcher)
   throws KeeperException, InterruptedException {
@@ -156,12 +152,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper exists failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "exists");
             break;
 
           default:
@@ -174,12 +165,8 @@ public class RecoverableZooKeeper {
   }
 
   /**
-   * exists is an idempotent operation. Retry before throw out exception
-   * @param path
-   * @param watch
+   * exists is an idempotent operation. Retry before throwing exception
    * @return A Stat instance
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public Stat exists(String path, boolean watch)
   throws KeeperException, InterruptedException {
@@ -191,12 +178,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper exists failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "exists");
             break;
 
           default:
@@ -208,13 +190,19 @@ public class RecoverableZooKeeper {
     }
   }
 
+  private void retryOrThrow(RetryCounter retryCounter, KeeperException e,
+      String opName) throws KeeperException {
+    LOG.warn("Possibly transient ZooKeeper exception: " + e);
+    if (!retryCounter.shouldRetry()) {
+      LOG.error("ZooKeeper " + opName + " failed after "
+        + retryCounter.getMaxRetries() + " retries");
+      throw e;
+    }
+  }
+
   /**
-   * getChildren is an idempotent operation. Retry before throw out exception
-   * @param path
-   * @param watcher
+   * getChildren is an idempotent operation. Retry before throwing exception
    * @return List of children znodes
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public List<String> getChildren(String path, Watcher watcher)
     throws KeeperException, InterruptedException {
@@ -226,12 +214,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper getChildren failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "getChildren");
             break;
 
           default:
@@ -244,12 +227,8 @@ public class RecoverableZooKeeper {
   }
 
   /**
-   * getChildren is an idempotent operation. Retry before throw out exception
-   * @param path
-   * @param watch
+   * getChildren is an idempotent operation. Retry before throwing exception
    * @return List of children znodes
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public List<String> getChildren(String path, boolean watch)
   throws KeeperException, InterruptedException {
@@ -261,12 +240,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper getChildren failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "getChildren");
             break;
 
           default:
@@ -279,13 +253,8 @@ public class RecoverableZooKeeper {
   }
 
   /**
-   * getData is an idempotent operation. Retry before throw out exception
-   * @param path
-   * @param watcher
-   * @param stat
+   * getData is an idempotent operation. Retry before throwing exception
    * @return Data
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public byte[] getData(String path, Watcher watcher, Stat stat)
   throws KeeperException, InterruptedException {
@@ -298,12 +267,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper getData failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "getData");
             break;
 
           default:
@@ -316,13 +280,8 @@ public class RecoverableZooKeeper {
   }
 
   /**
-   * getData is an idemnpotent operation. Retry before throw out exception
-   * @param path
-   * @param watch
-   * @param stat
+   * getData is an idemnpotent operation. Retry before throwing exception
    * @return Data
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public byte[] getData(String path, boolean watch, Stat stat)
   throws KeeperException, InterruptedException {
@@ -335,12 +294,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper getData failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "getData");
             break;
 
           default:
@@ -356,12 +310,7 @@ public class RecoverableZooKeeper {
    * setData is NOT an idempotent operation. Retry may cause BadVersion Exception
    * Adding an identifier field into the data to check whether 
    * badversion is caused by the result of previous correctly setData
-   * @param path
-   * @param data
-   * @param version
    * @return Stat instance
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public Stat setData(String path, byte[] data, int version)
   throws KeeperException, InterruptedException {
@@ -374,33 +323,28 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper setData failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "setData");
             break;
           case BADVERSION:
             // try to verify whether the previous setData success or not
             try{
               Stat stat = new Stat();
               byte[] revData = zk.getData(path, false, stat);
-              int idLength = Bytes.toInt(revData, ID_OFFSET);
-              int dataLength = revData.length-ID_OFFSET-idLength;
-              int dataOffset = ID_OFFSET+idLength;
+              int idLength = Bytes.toInt(revData, ID_LENGTH_SIZE);
+              int dataLength = revData.length-ID_LENGTH_SIZE-idLength;
+              int dataOffset = ID_LENGTH_SIZE+idLength;
               
-              if(Bytes.compareTo(revData, ID_OFFSET, id.length, 
+              if(Bytes.compareTo(revData, ID_LENGTH_SIZE, id.length, 
                   revData, dataOffset, dataLength) == 0) {
                 // the bad version is caused by previous successful setData
                 return stat;
               }
             } catch(KeeperException keeperException){
-              // the ZK is not reliable at this moment. just throw out exception
+              // the ZK is not reliable at this moment. just throwing exception
               throw keeperException;
             }            
           
-          // throw out other exceptions and verified bad version exceptions
+          // throw other exceptions and verified bad version exceptions
           default:
             throw e;
         }
@@ -413,8 +357,8 @@ public class RecoverableZooKeeper {
   /**
    * <p>
    * NONSEQUENTIAL create is idempotent operation. 
-   * Retry before throw out exceptions.
-   * But this function will not throw out the NodeExist exception back to the
+   * Retry before throwing exceptions.
+   * But this function will not throw the NodeExist exception back to the
    * application.
    * </p>
    * <p>
@@ -423,13 +367,7 @@ public class RecoverableZooKeeper {
    * or not.
    * </p>
    * 
-   * @param path
-   * @param data
-   * @param acl
-   * @param createMode
    * @return Path
-   * @throws KeeperException
-   * @throws InterruptedException
    */
   public String create(String path, byte[] data, List<ACL> acl,
       CreateMode createMode)
@@ -481,12 +419,7 @@ public class RecoverableZooKeeper {
 
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper create failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "create");
             break;
 
           default:
@@ -520,12 +453,7 @@ public class RecoverableZooKeeper {
         switch (e.code()) {
           case CONNECTIONLOSS:
           case OPERATIONTIMEOUT:
-            LOG.warn("Possibly transient ZooKeeper exception: " + e);
-            if (!retryCounter.shouldRetry()) {
-              LOG.error("ZooKeeper create failed after "
-                + retryCounter.getMaxRetries() + " retries");
-              throw e;
-            }
+            retryOrThrow(retryCounter, e, "create");
             break;
 
           default:
@@ -566,9 +494,9 @@ public class RecoverableZooKeeper {
       return data;
     }
     
-    int idLength = Bytes.toInt(data, MAGIC_OFFSET);
-    int dataLength = data.length-MAGIC_OFFSET-ID_OFFSET-idLength;
-    int dataOffset = MAGIC_OFFSET+ID_OFFSET+idLength;
+    int idLength = Bytes.toInt(data, ID_LENGTH_OFFSET);
+    int dataLength = data.length-MAGIC_SIZE-ID_LENGTH_SIZE-idLength;
+    int dataOffset = MAGIC_SIZE+ID_LENGTH_SIZE+idLength;
 
     byte[] newData = new byte[dataLength];
     System.arraycopy(data, dataOffset, newData, 0, dataLength);
@@ -582,7 +510,7 @@ public class RecoverableZooKeeper {
       return data;
     }
     
-    byte[] newData = new byte[MAGIC_OFFSET+ID_OFFSET+id.length+data.length];
+    byte[] newData = new byte[MAGIC_SIZE+ID_LENGTH_SIZE+id.length+data.length];
     int pos = 0;
     pos = Bytes.putByte(newData, pos, MAGIC);
     pos = Bytes.putInt(newData, pos, id.length);