From 97f2294bfd17f7ae762d2e72ab0f25028b78f3fe Mon Sep 17 00:00:00 2001 From: anoopsjohn Date: Sat, 2 Jul 2016 11:42:08 +0530 Subject: [PATCH] HBASE-16164 Missing close of new compacted segments in few occasions which might leak MSLAB chunks from pool. --- .../hbase/regionserver/CompactingMemStore.java | 5 +++-- .../hbase/regionserver/CompactionPipeline.java | 4 ++-- .../hbase/regionserver/MemStoreCompactor.java | 13 ++++++++++--- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactingMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactingMemStore.java index 0ca8af03cf7..5e286def439 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactingMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactingMemStore.java @@ -203,8 +203,9 @@ public class CompactingMemStore extends AbstractMemStore { this.inMemoryFlushInProgress.set(inMemoryFlushInProgress); } - public void swapCompactedSegments(VersionedSegmentsList versionedList, ImmutableSegment result) { - pipeline.swap(versionedList, result); + public boolean swapCompactedSegments(VersionedSegmentsList versionedList, + ImmutableSegment result) { + return pipeline.swap(versionedList, result); } public boolean hasCompactibleSegments() { diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactionPipeline.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactionPipeline.java index 3ecd11c1ba1..626fabf954d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactionPipeline.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompactionPipeline.java @@ -86,7 +86,7 @@ public class CompactionPipeline { * @return true iff swapped tail with new compacted segment */ public boolean swap(VersionedSegmentsList versionedList, ImmutableSegment segment) { - if(versionedList.getVersion() != version) { + if (versionedList.getVersion() != version) { return false; } LinkedList suffix; @@ -103,7 +103,7 @@ public class CompactionPipeline { } swapSuffix(suffix,segment); } - if(region != null) { + if (region != null) { // update the global memstore size counter long suffixSize = CompactingMemStore.getSegmentsSize(suffix); long newSize = CompactingMemStore.getSegmentSize(segment); diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java index a363e95bbf8..d86cd32841d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactor.java @@ -135,9 +135,16 @@ class MemStoreCompactor { // Phase II: swap the old compaction pipeline if (!isInterrupted.get()) { - compactingMemStore.swapCompactedSegments(versionedList, result); - // update the wal so it can be truncated and not get too long - compactingMemStore.updateLowestUnflushedSequenceIdInWAL(true); // only if greater + if (compactingMemStore.swapCompactedSegments(versionedList, result)) { + // update the wal so it can be truncated and not get too long + compactingMemStore.updateLowestUnflushedSequenceIdInWAL(true); // only if greater + } else { + // We just ignored the Segment 'result' and swap did not happen. + result.close(); + } + } else { + // We just ignore the Segment 'result'. + result.close(); } } catch (Exception e) { LOG.debug("Interrupting the MemStore in-memory compaction for store " + compactingMemStore