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:12:29 UTC

svn commit: r1181483 - /hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Author: nspiegelberg
Date: Tue Oct 11 02:12:28 2011
New Revision: 1181483

URL: http://svn.apache.org/viewvc?rev=1181483&view=rev
Log:
HBASE-3481: max seq id in flushed file can be larger than its correct value causing data loss during recovery

Summary:
(Ryan beat me to the patch). Bringing the patch in.

For the gory details see:

https://issues.apache.org/jira/browse/HBASE-3481

Test Plan:
running unit tests right now. And will do some more kill tests as well before
commit.

DiffCamp Revision: 205376
Reviewed By: kranganathan
Reviewers: jgray, kranganathan
Commenters: dhruba
CC: dhruba, kranganathan, hbase@lists
Revert Plan:
OK

Modified:
    hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java

Modified: hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL: http://svn.apache.org/viewvc/hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1181483&r1=1181482&r2=1181483&view=diff
==============================================================================
--- hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java (original)
+++ hbase/branches/0.89/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java Tue Oct 11 02:12:28 2011
@@ -1517,6 +1517,7 @@ public class HRegion implements HeapSize
   private long doMiniBatchPut(BatchOperationInProgress<Pair<Put, Integer>> batchOp) throws IOException {
     long now = EnvironmentEdgeManager.currentTimeMillis();
     byte[] byteNow = Bytes.toBytes(now);
+    boolean locked = false;
 
     /** Keep track of the locks we hold so we can release them in finally clause */
     List<Integer> acquiredLocks = Lists.newArrayListWithCapacity(batchOp.operations.length);
@@ -1563,6 +1564,10 @@ public class HRegion implements HeapSize
       // We've now grabbed as many puts off the list as we can
       assert numReadyToWrite > 0;
 
+
+      this.updatesLock.readLock().lock();
+      locked = true;
+
       // ------------------------------------
       // STEP 2. Update any LATEST_TIMESTAMP timestamps
       // ----------------------------------
@@ -1603,6 +1608,9 @@ public class HRegion implements HeapSize
       success = true;
       return addedSize;
     } finally {
+      if (locked)
+        this.updatesLock.readLock().unlock();
+
       for (Integer toRelease : acquiredLocks) {
         releaseRowLock(toRelease);
       }
@@ -3072,6 +3080,7 @@ public class HRegion implements HeapSize
     boolean flush = false;
     // Lock row
     Integer lid = obtainRowLock(row);
+    this.updatesLock.readLock().lock();
     long result = amount;
     try {
       Store store = stores.get(family);
@@ -3111,6 +3120,7 @@ public class HRegion implements HeapSize
       size = this.memstoreSize.addAndGet(size);
       flush = isFlushSize(size);
     } finally {
+      this.updatesLock.readLock().unlock();
       releaseRowLock(lid);
     }