.../apache/hadoop/hbase/regionserver/AbstractMemStore.java | 9 +++++++-- .../apache/hadoop/hbase/regionserver/HeapMemStoreLAB.java | 4 ++++ .../org/apache/hadoop/hbase/regionserver/MemStoreLAB.java | 9 +++++++++ .../java/org/apache/hadoop/hbase/regionserver/Segment.java | 2 +- .../org/apache/hadoop/hbase/regionserver/SegmentFactory.java | 12 +++++++++--- 5 files changed, 30 insertions(+), 6 deletions(-) diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java index 08e3f5e..a56c2d6 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/AbstractMemStore.java @@ -78,8 +78,13 @@ public abstract class AbstractMemStore implements MemStore { protected void resetCellSet() { // Reset heap to not include any keys - this.active = SegmentFactory.instance().createMutableSegment( - conf, comparator, DEEP_OVERHEAD); + if (this.active != null) { + this.active = SegmentFactory.instance().createMutableSegment(conf, comparator, DEEP_OVERHEAD, + this.active.getMemStoreLAB()); + } else { + this.active = + SegmentFactory.instance().createMutableSegment(conf, comparator, DEEP_OVERHEAD, null); + } this.timeOfOldestEdit = Long.MAX_VALUE; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HeapMemStoreLAB.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HeapMemStoreLAB.java index f22a6e5..cb8d1a3 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HeapMemStoreLAB.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/HeapMemStoreLAB.java @@ -93,6 +93,10 @@ public class HeapMemStoreLAB implements MemStoreLAB { MAX_ALLOC_KEY + " must be less than " + CHUNK_SIZE_KEY); } + @Override + public MemStoreLAB recreate(Configuration conf) { + return new HeapMemStoreLAB(conf); + } /** * Allocate a slice of the given length. * diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java index 5c3c1e7..1e805cb 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreLAB.java @@ -17,9 +17,11 @@ */ package org.apache.hadoop.hbase.regionserver; +import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.classification.InterfaceAudience; import org.apache.hadoop.hbase.util.ByteRange; + /** * A memstore-local allocation buffer. *

@@ -60,4 +62,11 @@ public interface MemStoreLAB { * Called when closing a scanner on the data of this MemStoreLAB */ void decScannerCount(); + + /** + * Recreates the MemStoreLAB and creates a new instance of the underlying MemStoreLAB + * in cases such as memstore snapshot + * @return a new instance of MemStoreLAB + */ + MemStoreLAB recreate(Configuration conf); } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java index 135def9..c8a51da 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/Segment.java @@ -259,7 +259,7 @@ public abstract class Segment { return getCellSet().tailSet(firstCell); } - private MemStoreLAB getMemStoreLAB() { + MemStoreLAB getMemStoreLAB() { return memStoreLAB; } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SegmentFactory.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SegmentFactory.java index 394ffa1..12f4a13 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SegmentFactory.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SegmentFactory.java @@ -57,9 +57,15 @@ public final class SegmentFactory { return new ImmutableSegment(segment); } public MutableSegment createMutableSegment(final Configuration conf, - CellComparator comparator, long size) { - MemStoreLAB memStoreLAB = getMemStoreLAB(conf); - return generateMutableSegment(conf, comparator, memStoreLAB, size); + CellComparator comparator, long size, MemStoreLAB memStoreLAB) { + MemStoreLAB newMemStoreLAB = null; + if(memStoreLAB != null) { + // Avoid call to reflections if the memstoreLAB is not null + newMemStoreLAB = memStoreLAB.recreate(conf); + } else { + newMemStoreLAB = getMemStoreLAB(conf); + } + return generateMutableSegment(conf, comparator, newMemStoreLAB, size); } //****** private methods to instantiate concrete store segments **********//