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 eece27a..d94cc99 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 @@ -619,7 +619,9 @@ class MemStoreFlusher implements FlushRequester { return this.globalMemStoreLimit; } - interface FlushQueueEntry extends Delayed {} + interface FlushQueueEntry extends Delayed { + int hashCode(); + } /** * Token to insert into the flush queue that ensures that the flusher does not sleep @@ -640,6 +642,10 @@ class MemStoreFlusher implements FlushRequester { return (this == obj); } + @Override + public int hashCode() { + return 1; + } } /** @@ -709,8 +715,12 @@ 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 @@ -720,7 +730,8 @@ class MemStoreFlusher implements FlushRequester { @Override public int hashCode() { - return (int) getDelay(TimeUnit.MILLISECONDS); + int hash = (int) getDelay(TimeUnit.MILLISECONDS); + return 31 * 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 676885b..bd50f59 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 @@ -34,8 +34,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);