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 23321e8..89d1e61 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 @@ -209,6 +209,13 @@ class MemStoreFlusher implements FlushRequester { bestAnyRegionSize = bestAnyRegion.getMemStoreDataSize(); bestFlushableRegionSize = getMemStoreDataSize(bestFlushableRegion); } + if (bestAnyRegionSize == 0) { + // A concurrency issue (such as splitting region) may happen such that the online region + // seen by getCopyOfOnlineRegionsSortedByXX() method is no longer eligible to flush in + // getBiggestMemStoreRegion(). This means that we can come out of the loop + LOG.debug("Above memory mark but {} doesn't have data to flush", bestAnyRegion); + return false; + } if (bestAnyRegionSize > 2 * bestFlushableRegionSize) { // Even if it's not supposed to be flushed, pick a region if it's more than twice // as big as the best flushable one - otherwise when we're under pressure we make