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 53d1ed2..51d7060 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 @@ -614,7 +614,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 @@ -634,7 +635,6 @@ class MemStoreFlusher implements FlushRequester { public boolean equals(Object obj) { return (this == obj); } - } /** @@ -694,8 +694,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 @@ -705,7 +711,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 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 00bf09b..470ff60 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)); - FlushRegionEntry other = new FlushRegionEntry(Mockito.mock(HRegion.class)); + HRegion r = Mockito.mock(HRegion.class); + FlushRegionEntry entry = new FlushRegionEntry(r); + FlushRegionEntry other = new FlushRegionEntry(r); assertEquals(entry.hashCode(), other.hashCode()); assertEquals(entry, other); @@ -44,4 +45,4 @@ public class TestFlushRegionEntry { public void teardown() { EnvironmentEdgeManager.reset(); } -} \ No newline at end of file +}