You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by ns...@apache.org on 2011/10/11 04:05:59 UTC

svn commit: r1181408 - in /hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase: regionserver/RSZookeeperUpdater.java zookeeper/ZooKeeperWrapper.java

Author: nspiegelberg
Date: Tue Oct 11 02:05:58 2011
New Revision: 1181408

URL: http://svn.apache.org/viewvc?rev=1181408&view=rev
Log:
Stale reads from ZK can break the atomic CAS operations

Summary:
Adds a sync(path) method to ZKWrapper and calls it from RSZKUpdater before we
do the initial read.

Test Plan:
Need to run test suite.  Currently testing this on the new master.

DiffCamp Revision: 172365
Reviewed By: kranganathan
CC: kranganathan, hbase@lists
Revert Plan:
OK

Modified:
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java?rev=1181408&r1=1181407&r2=1181408&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/RSZookeeperUpdater.java Tue Oct 11 02:05:58 2011
@@ -92,6 +92,7 @@ public class RSZookeeperUpdater {
    * @param updatePeriodically - if true, periodically updates the state in ZK
    */
   public void startRegionOpenEvent(HMsg hmsg, boolean updatePeriodically) throws IOException {
+    zkWrapper.sync(regionZNode);
     Stat stat = new Stat();
     byte[] data = zkWrapper.readZNode(regionZNode, stat);
     // if there is no ZNode for this region, something is wrong

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java?rev=1181408&r1=1181407&r2=1181408&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/zookeeper/ZooKeeperWrapper.java Tue Oct 11 02:05:58 2011
@@ -425,6 +425,22 @@ public class ZooKeeperWrapper implements
   }
 
   /**
+   * Forces a synchronization of this ZooKeeper client connection.
+   * <p>
+   * Executing this method before running other methods will ensure that the
+   * subsequent operations are up-to-date and consistent as of the time that
+   * the sync is complete.
+   * <p>
+   * This is used for compareAndSwap type operations where we need to read the
+   * data of an existing node and delete or transition that node, utilizing the
+   * previously read version and data.  We want to ensure that the version read
+   * is up-to-date from when we begin the operation.
+   */
+  public void sync(String path) {
+    this.zooKeeper.sync(path, null, null);
+  }
+
+  /**
    * Check if the specified znode exists.  Set a watch if boolean is true,
    * whether or not the node exists.
    * @param znode