Repository: hbase Updated Branches: refs/heads/master 0cb2ab6a7 -> f4c55b877
HBASE-11834 TestHRegionBusyWait.testParallelAppendWithMemStoreFlush fails sporadically Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/f4c55b87 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/f4c55b87 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/f4c55b87 Branch: refs/heads/master Commit: f4c55b877c1da62884873d5db8dadca569e50f96 Parents: 0cb2ab6 Author: stack <st...@apache.org> Authored: Wed Aug 27 08:21:38 2014 -0700 Committer: stack <st...@apache.org> Committed: Wed Aug 27 08:21:38 2014 -0700 ---------------------------------------------------------------------- .../hadoop/hbase/regionserver/HRegion.java | 46 ++++++++++---------- .../hadoop/hbase/regionserver/TestHRegion.java | 7 +-- 2 files changed, 27 insertions(+), 26 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/f4c55b87/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java index 73b7957..cc78751 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HRegion.java @@ -501,12 +501,10 @@ public class HRegion implements HeapSize { // , Writable{ private long blockingMemStoreSize; final long threadWakeFrequency; // Used to guard closes - final ReentrantReadWriteLock lock = - new ReentrantReadWriteLock(); + final ReentrantReadWriteLock lock = new ReentrantReadWriteLock(); // Stop updates lock - private final ReentrantReadWriteLock updatesLock = - new ReentrantReadWriteLock(); + private final ReentrantReadWriteLock updatesLock = new ReentrantReadWriteLock(); private boolean splitRequest; private byte[] explicitSplitPoint = null; @@ -1751,26 +1749,22 @@ public class HRegion implements HeapSize { // , Writable{ // sure just beyond the last appended region edit (useful as a marker when bulk loading, // etc.) // wal can be null replaying edits. - try { - if (wal != null) { - w = mvcc.beginMemstoreInsert(); - long flushSeqId = getNextSequenceId(wal); - FlushResult flushResult = new FlushResult( - FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushSeqId, "Nothing to flush"); - w.setWriteNumber(flushSeqId); - mvcc.waitForPreviousTransactionsComplete(w); - w = null; - return flushResult; - } else { - return new FlushResult(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, - "Nothing to flush"); - } - - } finally { - this.updatesLock.writeLock().unlock(); + if (wal != null) { + w = mvcc.beginMemstoreInsert(); + long flushSeqId = getNextSequenceId(wal); + FlushResult flushResult = new FlushResult( + FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, flushSeqId, "Nothing to flush"); + w.setWriteNumber(flushSeqId); + mvcc.waitForPreviousTransactionsComplete(w); + w = null; + return flushResult; + } else { + return new FlushResult(FlushResult.Result.CANNOT_FLUSH_MEMSTORE_EMPTY, + "Nothing to flush"); } } } finally { + this.updatesLock.writeLock().unlock(); if (w != null) { mvcc.advanceMemstore(w); } @@ -3659,11 +3653,11 @@ public class HRegion implements HeapSize { // , Writable{ rowLockContext = existingContext; break; } else { - // Row is already locked by some other thread, give up or wait for it if (!waitForLock) { return null; } try { + // Row is already locked by some other thread, give up or wait for it if (!existingContext.latch.await(this.rowLockWaitDuration, TimeUnit.MILLISECONDS)) { throw new IOException("Timed out waiting for lock for row: " + rowKey); } @@ -5285,7 +5279,6 @@ public class HRegion implements HeapSize { // , Writable{ get.addColumn(family.getKey(), CellUtil.cloneQualifier(cell)); } List<Cell> results = get(get, false); - // Iterate the input columns and update existing values if they were // found, otherwise add new column initialized to the append value @@ -6325,6 +6318,13 @@ public class HRegion implements HeapSize { // , Writable{ return new RowLock(this); } + @Override + public String toString() { + Thread t = this.thread; + return "Thread=" + (t == null? "null": t.getName()) + ", row=" + this.row + + ", lockCount=" + this.lockCount; + } + void releaseLock() { if (!ownedByCurrentThread()) { throw new IllegalArgumentException("Lock held by thread: " + thread http://git-wip-us.apache.org/repos/asf/hbase/blob/f4c55b87/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java index 9fa430f..2d482b1 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestHRegion.java @@ -77,6 +77,7 @@ import org.apache.hadoop.hbase.HBaseTestCase; import org.apache.hadoop.hbase.HBaseTestingUtility; import org.apache.hadoop.hbase.HColumnDescriptor; import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.RegionTooBusyException; import org.apache.hadoop.hbase.HConstants.OperationStatusCode; import org.apache.hadoop.hbase.HDFSBlocksDistribution; import org.apache.hadoop.hbase.HRegionInfo; @@ -4210,7 +4211,7 @@ public class TestHRegion { try { region.increment(inc); } catch (IOException e) { - e.printStackTrace(); + LOG.info("Count=" + count + ", " + e); break; } } @@ -4297,7 +4298,7 @@ public class TestHRegion { try { region.append(app); } catch (IOException e) { - e.printStackTrace(); + LOG.info("Count=" + count + ", max=" + appendCounter + ", " + e); break; } } @@ -4327,7 +4328,7 @@ public class TestHRegion { } }; - // after all append finished, the value will append to threadNum * + // After all append finished, the value will append to threadNum * // appendCounter Appender.CHAR int threadNum = 20; int appendCounter = 100;