Author: rawson
Date: Thu Jan 27 09:27:01 2011
New Revision: 1064054
URL: http://svn.apache.org/viewvc?rev=1064054&view=rev
Log:
HBASE-2481 max seq id in flushed file can be larger than its correct value
causing data loss during recovery
Modified:
hbase/branches/0.90/CHANGES.txt
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
Modified: hbase/branches/0.90/CHANGES.txt
URL:
http://svn.apache.org/viewvc/hbase/branches/0.90/CHANGES.txt?rev=1064054&r1=1064053&r2=1064054&view=diff
==============================================================================
--- hbase/branches/0.90/CHANGES.txt (original)
+++ hbase/branches/0.90/CHANGES.txt Thu Jan 27 09:27:01 2011
@@ -7,6 +7,8 @@ Release 0.90.1 - Unreleased
HBASE-3456 Fix hardcoding of 20 second socket timeout down in HBaseClient
HBASE-3476 HFile -m option need not scan key values
(Prakash Khemani via Lars George)
+ HBASE-3481 max seq id in flushed file can be larger than its correct
+ value causing data loss during recovery
IMPROVEMENTS
Modified:
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
URL:
http://svn.apache.org/viewvc/hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java?rev=1064054&r1=1064053&r2=1064054&view=diff
==============================================================================
---
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
(original)
+++
hbase/branches/0.90/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java
Thu Jan 27 09:27:01 2011
@@ -1386,6 +1386,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);
@@ -1443,6 +1444,10 @@ public class HRegion implements HeapSize
byteNow);
}
+
+ this.updatesLock.readLock().lock();
+ locked = true;
+
// ------------------------------------
// STEP 3. Write to WAL
// ----------------------------------
@@ -1474,6 +1479,9 @@ public class HRegion implements HeapSize
success = true;
return addedSize;
} finally {
+ if (locked)
+ this.updatesLock.readLock().unlock();
+
for (Integer toRelease : acquiredLocks) {
releaseRowLock(toRelease);
}
@@ -2986,6 +2994,7 @@ public class HRegion implements HeapSize
startRegionOperation();
try {
Integer lid = getLock(lockid, row, true);
+ this.updatesLock.readLock().lock();
try {
// Process each family
for (Map.Entry<byte [], NavigableMap<byte [], Long>> family :
@@ -3041,6 +3050,7 @@ public class HRegion implements HeapSize
size = this.memstoreSize.addAndGet(size);
flush = isFlushSize(size);
} finally {
+ this.updatesLock.readLock().unlock();
releaseRowLock(lid);
}
} finally {
@@ -3075,6 +3085,7 @@ public class HRegion implements HeapSize
startRegionOperation();
try {
Integer lid = obtainRowLock(row);
+ this.updatesLock.readLock().lock();
try {
Store store = stores.get(family);
@@ -3113,6 +3124,7 @@ public class HRegion implements HeapSize
size = this.memstoreSize.addAndGet(size);
flush = isFlushSize(size);
} finally {
+ this.updatesLock.readLock().unlock();
releaseRowLock(lid);
}
} finally {