Repository: hbase Updated Branches: refs/heads/branch-1 8556e2598 -> 3a529c04c
HBASE-10499 In write heavy scenario one of the regions does not get flushed causing RegionTooBusyException (Ram and Ted) Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/3a529c04 Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/3a529c04 Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/3a529c04 Branch: refs/heads/branch-1 Commit: 3a529c04cebb4f3debdfd42fb00d3736dc2ea2fd Parents: 8556e25 Author: tedyu <[email protected]> Authored: Fri Jan 23 09:44:50 2015 -0800 Committer: tedyu <[email protected]> Committed: Fri Jan 23 09:44:50 2015 -0800 ---------------------------------------------------------------------- .../hadoop/hbase/regionserver/MemStoreFlusher.java | 15 +++++++++++---- .../hbase/regionserver/TestFlushRegionEntry.java | 5 +++-- 2 files changed, 14 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/3a529c04/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java index dd68b8e..d3c987f 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java @@ -615,7 +615,8 @@ class MemStoreFlusher implements FlushRequester { return this.globalMemStoreLimit; } - interface FlushQueueEntry extends Delayed {} + interface FlushQueueEntry extends Delayed { + } /** * Token to insert into the flush queue that ensures that the flusher does not sleep @@ -635,7 +636,6 @@ class MemStoreFlusher implements FlushRequester { public boolean equals(Object obj) { return (this == obj); } - } /** @@ -705,8 +705,14 @@ class MemStoreFlusher implements FlushRequester { @Override public int compareTo(Delayed other) { - return Long.valueOf(getDelay(TimeUnit.MILLISECONDS) - + // Delay is compared first. If there is a tie, compare region's hash code + int ret = Long.valueOf(getDelay(TimeUnit.MILLISECONDS) - other.getDelay(TimeUnit.MILLISECONDS)).intValue(); + if (ret != 0) { + return ret; + } + FlushQueueEntry otherEntry = (FlushQueueEntry) other; + return hashCode() - otherEntry.hashCode(); } @Override @@ -716,7 +722,8 @@ class MemStoreFlusher implements FlushRequester { @Override public int hashCode() { - return (int) getDelay(TimeUnit.MILLISECONDS); + int hash = (int) getDelay(TimeUnit.MILLISECONDS); + return hash ^ region.hashCode(); } @Override http://git-wip-us.apache.org/repos/asf/hbase/blob/3a529c04/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushRegionEntry.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushRegionEntry.java b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushRegionEntry.java index edb4926..0a2bbc2 100644 --- a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushRegionEntry.java +++ b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestFlushRegionEntry.java @@ -33,8 +33,9 @@ public class TestFlushRegionEntry { @Test public void test() { - FlushRegionEntry entry = new FlushRegionEntry(Mockito.mock(HRegion.class), true); - FlushRegionEntry other = new FlushRegionEntry(Mockito.mock(HRegion.class), true); + HRegion r = Mockito.mock(HRegion.class); + FlushRegionEntry entry = new FlushRegionEntry(r, true); + FlushRegionEntry other = new FlushRegionEntry(r, true); assertEquals(entry.hashCode(), other.hashCode()); assertEquals(entry, other);
