This is an automated email from the ASF dual-hosted git repository.
openinx pushed a commit to branch branch-2.0
in repository https://gitbox.apache.org/repos/asf/hbase.git
The following commit(s) were added to refs/heads/branch-2.0 by this push:
new 58ab212 HBASE-22324 loss a mass of data when the sequenceId of cells
greater than Integer.Max
58ab212 is described below
commit 58ab212a4da4de95020e8bf077f109008f94ad1d
Author: chenyang <[email protected]>
AuthorDate: Mon May 6 20:55:31 2019 +0800
HBASE-22324 loss a mass of data when the sequenceId of cells greater than
Integer.Max
Signed-off-by: huzheng <[email protected]>
---
.../MemStoreCompactorSegmentsIterator.java | 2 +-
.../MemStoreMergerSegmentsIterator.java | 2 +-
.../regionserver/TestMemStoreSegmentsIterator.java | 164 +++++++++++++++++++++
3 files changed, 166 insertions(+), 2 deletions(-)
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactorSegmentsIterator.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactorSegmentsIterator.java
index 6fa8e53..bab0838 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactorSegmentsIterator.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreCompactorSegmentsIterator.java
@@ -59,7 +59,7 @@ public class MemStoreCompactorSegmentsIterator extends
MemStoreSegmentsIterator
// create the list of scanners to traverse over all the data
// no dirty reads here as these are immutable segments
int order = segments.size();
- AbstractMemStore.addToScanners(segments, Integer.MAX_VALUE, order,
scanners);
+ AbstractMemStore.addToScanners(segments, Long.MAX_VALUE, order, scanners);
// build the scanner based on Query Matcher
// reinitialize the compacting scanner for each instance of iterator
compactingScanner = createScanner(store, scanners);
diff --git
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java
index 02824ba..6fbcbbf 100644
---
a/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java
+++
b/hbase-server/src/main/java/org/apache/hadoop/hbase/regionserver/MemStoreMergerSegmentsIterator.java
@@ -48,7 +48,7 @@ public class MemStoreMergerSegmentsIterator extends
MemStoreSegmentsIterator {
// create the list of scanners to traverse over all the data
// no dirty reads here as these are immutable segments
int order = segments.size();
- AbstractMemStore.addToScanners(segments, Integer.MAX_VALUE, order,
scanners);
+ AbstractMemStore.addToScanners(segments, Long.MAX_VALUE, order, scanners);
heap = new KeyValueHeap(scanners, comparator);
}
diff --git
a/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMemStoreSegmentsIterator.java
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMemStoreSegmentsIterator.java
new file mode 100644
index 0000000..141bf6b
--- /dev/null
+++
b/hbase-server/src/test/java/org/apache/hadoop/hbase/regionserver/TestMemStoreSegmentsIterator.java
@@ -0,0 +1,164 @@
+/**
+ * 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 static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+
+import org.apache.hadoop.conf.Configuration;
+import org.apache.hadoop.fs.Path;
+import org.apache.hadoop.hbase.Cell;
+import org.apache.hadoop.hbase.CellComparator;
+import org.apache.hadoop.hbase.HBaseClassTestRule;
+import org.apache.hadoop.hbase.HBaseTestingUtility;
+import org.apache.hadoop.hbase.HColumnDescriptor;
+import org.apache.hadoop.hbase.HConstants;
+import org.apache.hadoop.hbase.HRegionInfo;
+import org.apache.hadoop.hbase.HTableDescriptor;
+import org.apache.hadoop.hbase.KeyValue;
+import org.apache.hadoop.hbase.TableName;
+import org.apache.hadoop.hbase.testclassification.RegionServerTests;
+import org.apache.hadoop.hbase.testclassification.SmallTests;
+import org.apache.hadoop.hbase.util.Bytes;
+import org.apache.hadoop.hbase.util.EnvironmentEdgeManagerTestHelper;
+import org.apache.hadoop.hbase.wal.WAL;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.ClassRule;
+import org.junit.Test;
+import org.junit.experimental.categories.Category;
+
+/**
+ * Test the {@link MemStoreCompactorSegmentsIterator} and {@link
MemStoreMergerSegmentsIterator}
+ * class, Test for bug : HBASE-22324
+ */
+@Category({ RegionServerTests.class, SmallTests.class })
+public class TestMemStoreSegmentsIterator {
+
+ @ClassRule
+ public static final HBaseClassTestRule CLASS_RULE =
+ HBaseClassTestRule.forClass(TestMemStoreSegmentsIterator.class);
+
+ protected static String TABLE = "test_mscsi";
+ protected static String FAMILY = "f";
+ protected static String COLUMN = "c";
+ protected static String ROOT_SUB_PATH = "testMemStoreSegmentsIterator";
+ protected static long LESS_THAN_INTEGER_MAX_VALUE_SEQ_ID =
Long.valueOf(Integer.MAX_VALUE) - 1;
+ protected static long GREATER_THAN_INTEGER_MAX_VALUE_SEQ_ID =
Long.valueOf(Integer.MAX_VALUE) + 1;
+
+ protected CellComparator comparator;
+ protected int compactionKVMax;
+ protected WAL wal;
+ protected HRegion region;
+ protected HStore store;
+
+ @Before
+ public void setup() throws IOException {
+ Configuration conf = new Configuration();
+ HBaseTestingUtility hbaseUtility =
HBaseTestingUtility.createLocalHTU(conf);
+ HColumnDescriptor hcd = new HColumnDescriptor(FAMILY);
+ HTableDescriptor htd = new HTableDescriptor(TableName.valueOf(TABLE));
+ htd.addFamily(hcd);
+ HRegionInfo info = new HRegionInfo(TableName.valueOf(TABLE), null, null,
false);
+ Path rootPath = hbaseUtility.getDataTestDir(ROOT_SUB_PATH);
+ this.wal = hbaseUtility.createWal(conf, rootPath, info);
+ this.region = HRegion.createHRegion(info, rootPath, conf, htd, this.wal,
true);
+ this.store = new HStore(this.region, hcd, conf);
+ this.comparator = CellComparator.getInstance();
+ this.compactionKVMax = HConstants.COMPACTION_KV_MAX_DEFAULT;
+ }
+
+ @Test
+ public void testMemStoreCompactorSegmentsIteratorNext() throws IOException {
+ List<ImmutableSegment> segments =
Arrays.asList(createTestImmutableSegment());
+ MemStoreCompactorSegmentsIterator iterator = new
MemStoreCompactorSegmentsIterator(segments,
+ this.comparator, this.compactionKVMax, this.store);
+ verifyNext(iterator);
+ closeTestSegments(segments);
+ }
+
+ @Test
+ public void testMemStoreMergerSegmentsIteratorNext() throws IOException {
+ List<ImmutableSegment> segments =
Arrays.asList(createTestImmutableSegment());
+ MemStoreMergerSegmentsIterator iterator =
+ new MemStoreMergerSegmentsIterator(segments, this.comparator,
this.compactionKVMax);
+ verifyNext(iterator);
+ closeTestSegments(segments);
+ }
+
+ protected ImmutableSegment createTestImmutableSegment() {
+ ImmutableSegment segment1 =
SegmentFactory.instance().createImmutableSegment(this.comparator);
+ final byte[] one = Bytes.toBytes(1);
+ final byte[] two = Bytes.toBytes(2);
+ final byte[] f = Bytes.toBytes(FAMILY);
+ final byte[] q = Bytes.toBytes(COLUMN);
+ final byte[] v = Bytes.toBytes(3);
+ final KeyValue kv1 = new KeyValue(one, f, q, System.currentTimeMillis(),
v);
+ final KeyValue kv2 = new KeyValue(two, f, q, System.currentTimeMillis(),
v);
+ // the seqId of first cell less than Integer.MAX_VALUE,
+ // the seqId of second cell greater than integer.MAX_VALUE
+ kv1.setSequenceId(LESS_THAN_INTEGER_MAX_VALUE_SEQ_ID);
+ kv2.setSequenceId(GREATER_THAN_INTEGER_MAX_VALUE_SEQ_ID);
+ segment1.internalAdd(kv1, false, null);
+ segment1.internalAdd(kv2, false, null);
+ return segment1;
+ }
+
+ protected void closeTestSegments(List<ImmutableSegment> segments) {
+ for (Segment segment : segments) {
+ segment.close();
+ }
+ }
+
+ protected void verifyNext(MemStoreSegmentsIterator iterator) {
+ // check first cell
+ assertTrue(iterator.hasNext());
+ Cell firstCell = iterator.next();
+ assertEquals(LESS_THAN_INTEGER_MAX_VALUE_SEQ_ID,
firstCell.getSequenceId());
+
+ // check second cell
+ assertTrue(iterator.hasNext());
+ Cell secondCell = iterator.next();
+ assertEquals(GREATER_THAN_INTEGER_MAX_VALUE_SEQ_ID,
secondCell.getSequenceId());
+ }
+
+ @After
+ public void tearDown() throws Exception {
+ EnvironmentEdgeManagerTestHelper.reset();
+ if (store != null) {
+ try {
+ store.close();
+ } catch (IOException e) {
+ }
+ store = null;
+ }
+ if (region != null) {
+ region.close();
+ region = null;
+ }
+
+ if (wal != null) {
+ wal.close();
+ wal = null;
+ }
+ }
+}
\ No newline at end of file