From 6ed2525e6a2ba17122bd3c4845f753ba3cffb505 Mon Sep 17 00:00:00 2001 From: binlijin Date: Fri, 15 May 2020 16:31:22 +0800 Subject: [PATCH 1/2] HBASE-24377 MemStoreFlusher throw NullPointerException --- .../org/apache/hadoop/hbase/regionserver/MemStoreFlusher.java | 1 + 1 file changed, 1 insertion(+) 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 9f4d8811491e..4fcb823304f7 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 @@ -349,6 +349,7 @@ public void run() { // we still select the regions based on the region's memstore data size. // TODO : If we want to decide based on heap over head it can be done without tracking // it per region. + setFlushType(type); if (!flushOneForGlobalPressure()) { // Wasn't able to flush any region, but we're above low water mark // This is unlikely to happen, but might happen when closing the From d9a3f4483ab500c24e521ab621fe69f140cdc063 Mon Sep 17 00:00:00 2001 From: binlijin Date: Sun, 17 May 2020 15:35:09 +0800 Subject: [PATCH 2/2] remove field flushType --- .../hadoop/hbase/regionserver/MemStoreFlusher.java | 13 ++----------- 1 file changed, 2 insertions(+), 11 deletions(-) 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 4fcb823304f7..17c3c4e83e4f 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 @@ -87,8 +87,6 @@ class MemStoreFlusher implements FlushRequester { private final FlushHandler[] flushHandlers; private List flushRequestListeners = new ArrayList<>(1); - private FlushType flushType; - /** * Singleton instance inserted into flush queue used for signaling. */ @@ -149,17 +147,13 @@ public LongAdder getUpdatesBlockedMsHighWater() { return this.updatesBlockedMsHighWater; } - public void setFlushType(FlushType flushType) { - this.flushType = flushType; - } - /** * The memstore across all regions has exceeded the low water mark. Pick * one region to flush and flush it synchronously (this is called from the * flush thread) * @return true if successful */ - private boolean flushOneForGlobalPressure() { + private boolean flushOneForGlobalPressure(FlushType flushType) { SortedMap> regionsBySize = null; switch(flushType) { case ABOVE_OFFHEAP_HIGHER_MARK: @@ -349,8 +343,7 @@ public void run() { // we still select the regions based on the region's memstore data size. // TODO : If we want to decide based on heap over head it can be done without tracking // it per region. - setFlushType(type); - if (!flushOneForGlobalPressure()) { + if (!flushOneForGlobalPressure(type)) { // Wasn't able to flush any region, but we're above low water mark // This is unlikely to happen, but might happen when closing the // entire server - another thread is flushing regions. We'll just @@ -717,7 +710,6 @@ public void reclaimMemStoreMemory() { try { flushType = isAboveHighWaterMark(); while (flushType != FlushType.NORMAL && !server.isStopped()) { - server.getMemStoreFlusher().setFlushType(flushType); if (!blocked) { startTime = EnvironmentEdgeManager.currentTime(); if (!server.getRegionServerAccounting().isOffheap()) { @@ -775,7 +767,6 @@ public void reclaimMemStoreMemory() { } else { flushType = isAboveLowWaterMark(); if (flushType != FlushType.NORMAL) { - server.getMemStoreFlusher().setFlushType(flushType); wakeupFlushThread(); } }