HBASE-20628 SegmentScanner does over-comparing when one flushing Signed-off-by: eshcar <esh...@oath.com> Signed-off-by: anoopsjohn <anoopsamj...@gmail.com>
Project: http://git-wip-us.apache.org/repos/asf/hbase/repo Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/03c0f7fe Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/03c0f7fe Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/03c0f7fe Branch: refs/heads/HBASE-19064 Commit: 03c0f7fe1343e681eda350a7a3528b62b28532cc Parents: a472f24 Author: Michael Stack <st...@apache.org> Authored: Fri Jun 1 13:35:23 2018 -0700 Committer: Michael Stack <st...@apache.org> Committed: Mon Jun 4 09:50:47 2018 -0700 ---------------------------------------------------------------------- .../regionserver/CompositeImmutableSegment.java | 9 ++ .../hbase/regionserver/ImmutableSegment.java | 4 + .../hbase/regionserver/MemStoreSnapshot.java | 3 +- .../regionserver/SnapshotSegmentScanner.java | 101 +++++++++++++++++++ 4 files changed, 115 insertions(+), 2 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hbase/blob/03c0f7fe/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java index 1fd2f23..dcfaf81 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/CompositeImmutableSegment.java @@ -279,4 +279,13 @@ public class CompositeImmutableSegment extends ImmutableSegment { } return sb.toString(); } + + @Override + List<KeyValueScanner> getSnapshotScanners() { + List<KeyValueScanner> list = new ArrayList<>(this.segments.size()); + for (ImmutableSegment segment: this.segments) { + list.add(new SnapshotSegmentScanner(segment)); + } + return list; + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/03c0f7fe/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableSegment.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableSegment.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableSegment.java index b781aab..8c426bc 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableSegment.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/ImmutableSegment.java @@ -84,4 +84,8 @@ public abstract class ImmutableSegment extends Segment { res += "Num uniques "+getNumUniqueKeys()+"; "; return res; } + + List<KeyValueScanner> getSnapshotScanners() { + return Collections.singletonList(new SnapshotSegmentScanner(this)); + } } http://git-wip-us.apache.org/repos/asf/hbase/blob/03c0f7fe/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreSnapshot.java ---------------------------------------------------------------------- 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 f747224..3b34828 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 @@ -40,7 +40,7 @@ public class MemStoreSnapshot implements Closeable { this.cellsCount = snapshot.getCellsCount(); this.memStoreSize = snapshot.getMemStoreSize(); this.timeRangeTracker = snapshot.getTimeRangeTracker(); - this.scanners = snapshot.getScanners(Long.MAX_VALUE); + this.scanners = snapshot.getSnapshotScanners(); this.tagsPresent = snapshot.isTagsPresent(); } @@ -95,5 +95,4 @@ public class MemStoreSnapshot implements Closeable { } } } - } http://git-wip-us.apache.org/repos/asf/hbase/blob/03c0f7fe/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SnapshotSegmentScanner.java ---------------------------------------------------------------------- diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SnapshotSegmentScanner.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SnapshotSegmentScanner.java new file mode 100644 index 0000000..87be2e4 --- /dev/null +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/SnapshotSegmentScanner.java @@ -0,0 +1,101 @@ +/* + * + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.hadoop.hbase.regionserver; + +import java.util.Iterator; + +import org.apache.hadoop.hbase.Cell; +import org.apache.yetus.audience.InterfaceAudience; + + +/** + * A basic SegmentScanner used against an ImmutableScanner snapshot + * Used flushing where we do a single pass, no reverse scanning or + * inserts happening. Its a dumbed-down Scanner that can go fast. + * Like {@link org.apache.hadoop.hbase.util.CollectionBackedScanner} + * (but making it know about Segments was onerous). + */ +@InterfaceAudience.Private +public class SnapshotSegmentScanner extends NonReversedNonLazyKeyValueScanner { + private final ImmutableSegment segment; + private Iterator<Cell> iter; + private Cell current; + + public SnapshotSegmentScanner(ImmutableSegment segment) { + this.segment = segment; + this.segment.incScannerCount(); + this.iter = createIterator(this.segment); + if (this.iter.hasNext()){ + this.current = this.iter.next(); + } + } + + private static Iterator<Cell> createIterator(Segment segment) { + return segment.getCellSet().iterator(); + } + + @Override + public Cell peek() { + return current; + } + + @Override + public Cell next() { + Cell oldCurrent = current; + if(iter.hasNext()){ + current = iter.next(); + } else { + current = null; + } + return oldCurrent; + } + + @Override + public boolean seek(Cell seekCell) { + // restart iterator + this.iter = createIterator(this.segment); + return reseek(seekCell); + } + + @Override + public boolean reseek(Cell seekCell) { + while (this.iter.hasNext()){ + Cell next = this.iter.next(); + int ret = this.segment.getComparator().compare(next, seekCell); + if (ret >= 0) { + this.current = next; + return true; + } + } + return false; + } + + /** + * @see KeyValueScanner#getScannerOrder() + */ + @Override + public long getScannerOrder() { + return 0; + } + + @Override + public void close() { + this.segment.decScannerCount(); + } +}