From ade9a8eeed838489f0052d933e6d5bbef010fc0f Mon Sep 17 00:00:00 2001 From: Michael Stack Date: Wed, 23 May 2018 11:13:24 -0700 Subject: [PATCH] HBASE-20628 SegmentScanner does over-comparing when one flushing --- .../hadoop/hbase/regionserver/CompactingMemStore.java | 10 +++++++++- .../hadoop/hbase/regionserver/DefaultMemStore.java | 3 +-- .../hadoop/hbase/regionserver/MemStoreSnapshot.java | 18 ++++++++++++++++-- 3 files changed, 26 insertions(+), 5 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 7a11d5538f..bf89986e94 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 @@ -213,7 +213,15 @@ public class CompactingMemStore extends AbstractMemStore { } compactor.resetStats(); } - return new MemStoreSnapshot(snapshotId, this.snapshot); + return new MemStoreSnapshot(snapshotId, this.snapshot) { + /** + * Override to return SegmentScanner. + */ + @Override + protected List initScanners(ImmutableSegment snapshot) { + return snapshot.getScanners(Long.MAX_VALUE, Long.MAX_VALUE); + } + }; } @Override diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java index f4db666c8b..742e2f1b22 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/DefaultMemStore.java @@ -88,9 +88,8 @@ public class DefaultMemStore extends AbstractMemStore { } else { this.snapshotId = EnvironmentEdgeManager.currentTime(); if (!this.active.isEmpty()) { - ImmutableSegment immutableSegment = SegmentFactory.instance(). + this.snapshot = SegmentFactory.instance(). createImmutableSegment(this.active); - this.snapshot = immutableSegment; resetActive(); } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java index cbd60e5da3..56bad4a367 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java @@ -17,9 +17,11 @@ */ package org.apache.hadoop.hbase.regionserver; +import org.apache.hadoop.hbase.util.CollectionBackedScanner; import org.apache.yetus.audience.InterfaceAudience; import java.io.Closeable; +import java.util.Collections; import java.util.List; /** * Holds details of the snapshot taken on a MemStore. Details include the snapshot's identifier, @@ -40,10 +42,23 @@ public class MemStoreSnapshot implements Closeable { this.cellsCount = snapshot.getCellsCount(); this.memStoreSize = snapshot.getMemStoreSize(); this.timeRangeTracker = snapshot.getTimeRangeTracker(); - this.scanners = snapshot.getScanners(Long.MAX_VALUE, Long.MAX_VALUE); + // Make a dumbed-down Scanner, one that can be used flushing. Doesn't need to be able to + // scan in reverse, etc. This dumbed-down scanner gives us a throughput boost when writing. + // See HBASE-20628. + this.scanners = initScanners(snapshot); + this.tagsPresent = snapshot.isTagsPresent(); } + /** + * Defaults simple Scanner. + * Override to do fancier scanning. + */ + protected List initScanners(ImmutableSegment snapshot) { + return Collections.singletonList( + new CollectionBackedScanner(snapshot.getCellSet(), snapshot.getComparator())); + } + /** * @return snapshot's identifier. */ @@ -95,5 +110,4 @@ public class MemStoreSnapshot implements Closeable { } } } - } -- 2.16.3