blob: e7f58d5412dc62db904d7cc087b19480095e80f8 [file] [log] [blame]
/**
* 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.assertNull;
import java.io.IOException;
import org.apache.hadoop.hbase.HBaseClassTestRule;
import org.apache.hadoop.hbase.HBaseTestingUtility;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.client.Table;
import org.apache.hadoop.hbase.client.TableDescriptor;
import org.apache.hadoop.hbase.client.TableDescriptorBuilder;
import org.apache.hadoop.hbase.testclassification.MediumTests;
import org.apache.hadoop.hbase.testclassification.RegionServerTests;
import org.apache.hadoop.hbase.util.Bytes;
import org.apache.hadoop.hbase.util.Threads;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.ClassRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.experimental.categories.Category;
import org.junit.rules.TestName;
@Category({ RegionServerTests.class, MediumTests.class })
public class TestNewVersionBehaviorFromClientSide {
@ClassRule
public static final HBaseClassTestRule CLASS_RULE =
HBaseClassTestRule.forClass(TestNewVersionBehaviorFromClientSide.class);
private final static HBaseTestingUtility TEST_UTIL = new HBaseTestingUtility();
private static final byte[] ROW = Bytes.toBytes("r1");
private static final byte[] ROW2 = Bytes.toBytes("r2");
private static final byte[] FAMILY = Bytes.toBytes("f");
private static final byte[] value = Bytes.toBytes("value");
private static final byte[] col1 = Bytes.toBytes("col1");
private static final byte[] col2 = Bytes.toBytes("col2");
private static final byte[] col3 = Bytes.toBytes("col3");
@Rule
public TestName name = new TestName();
@BeforeClass
public static void setUpBeforeClass() throws Exception {
TEST_UTIL.startMiniCluster(1);
}
@AfterClass
public static void setDownAfterClass() throws Exception {
TEST_UTIL.shutdownMiniCluster();
}
private Table createTable() throws IOException {
TableName tableName = TableName.valueOf(name.getMethodName());
TableDescriptor tableDescriptor =
TableDescriptorBuilder.newBuilder(tableName).setColumnFamily(ColumnFamilyDescriptorBuilder
.newBuilder(FAMILY).setNewVersionBehavior(true).setMaxVersions(3).build()).build();
TEST_UTIL.getAdmin().createTable(tableDescriptor);
return TEST_UTIL.getConnection().getTable(tableName);
}
@Test
public void testPutAndDeleteVersions() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
t.delete(new Delete(ROW).addColumns(FAMILY, col1, 2000000));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000000, value));
TEST_UTIL.getAdmin().flush(t.getName());
Result r = t.get(new Get(ROW).readVersions(3));
assertEquals(1, r.size());
assertEquals(1000000, r.rawCells()[0].getTimestamp());
}
}
@Test
public void testPutMasked() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000003));
Result r = t.get(new Get(ROW).readVersions(3));
assertEquals(2, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000002, r.rawCells()[1].getTimestamp());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3));
assertEquals(2, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000002, r.rawCells()[1].getTimestamp());
}
}
@Test
public void testPutMasked2() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000003));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
Result r = t.get(new Get(ROW).readVersions(3));
assertEquals(3, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000003, r.rawCells()[1].getTimestamp());
assertEquals(1000002, r.rawCells()[2].getTimestamp());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3));
assertEquals(3, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000003, r.rawCells()[1].getTimestamp());
assertEquals(1000002, r.rawCells()[2].getTimestamp());
}
}
@Test
public void testPutMaskedAndUserMaxVersion() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000004));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000003));
Result r = t.get(new Get(ROW).readVersions(1));
assertEquals(1, r.size());
assertEquals(1000002, r.rawCells()[0].getTimestamp());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(1));
assertEquals(1, r.size());
assertEquals(1000002, r.rawCells()[0].getTimestamp());
}
}
@Test
public void testSameTs() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
Result r = t.get(new Get(ROW).readVersions(3));
assertEquals(3, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000003, r.rawCells()[1].getTimestamp());
assertEquals(1000002, r.rawCells()[2].getTimestamp());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3));
assertEquals(3, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000003, r.rawCells()[1].getTimestamp());
assertEquals(1000002, r.rawCells()[2].getTimestamp());
}
}
@Test
public void testSameTsAndDelete() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000003));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
Result r = t.get(new Get(ROW).readVersions(3));
assertEquals(3, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000002, r.rawCells()[1].getTimestamp());
assertEquals(1000001, r.rawCells()[2].getTimestamp());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3));
assertEquals(3, r.size());
assertEquals(1000004, r.rawCells()[0].getTimestamp());
assertEquals(1000002, r.rawCells()[1].getTimestamp());
assertEquals(1000001, r.rawCells()[2].getTimestamp());
}
}
@Test
public void testDeleteFamily() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col3, 1000001, value));
t.delete(new Delete(ROW).addFamily(FAMILY, 2000000));
t.put(new Put(ROW).addColumn(FAMILY, col3, 1500002, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, 1500001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1500001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1500002, value));
TEST_UTIL.getAdmin().flush(t.getName());
Result r = t.get(new Get(ROW).readVersions(3));
assertEquals(4, r.size());
assertEquals(1500002, r.rawCells()[0].getTimestamp());
assertEquals(1500001, r.rawCells()[1].getTimestamp());
assertEquals(1500001, r.rawCells()[2].getTimestamp());
assertEquals(1500002, r.rawCells()[3].getTimestamp());
t.delete(new Delete(ROW).addFamilyVersion(FAMILY, 1500001));
r = t.get(new Get(ROW).readVersions(3));
assertEquals(2, r.size());
assertEquals(1500002, r.rawCells()[0].getTimestamp());
assertEquals(1500002, r.rawCells()[1].getTimestamp());
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col3, 1000001, value));
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3));
assertEquals(6, r.size());
assertEquals(1500002, r.rawCells()[0].getTimestamp());
assertEquals(1000002, r.rawCells()[1].getTimestamp());
assertEquals(1000001, r.rawCells()[2].getTimestamp());
assertEquals(1000002, r.rawCells()[3].getTimestamp());
assertEquals(1500002, r.rawCells()[4].getTimestamp());
assertEquals(1000001, r.rawCells()[5].getTimestamp());
}
}
@Test
public void testTimeRange() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000005, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000006, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000007, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000008, value));
Result r = t.get(new Get(ROW).readVersions(3).setTimeRange(0, 1000005));
assertEquals(0, r.size());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3).setTimeRange(0, 1000005));
assertEquals(0, r.size());
}
}
@Test
public void testExplicitColum() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, value));
t.put(new Put(ROW).addColumn(FAMILY, col2, value));
t.put(new Put(ROW).addColumn(FAMILY, col3, value));
t.put(new Put(ROW).addColumn(FAMILY, col3, value));
t.put(new Put(ROW).addColumn(FAMILY, col3, value));
t.put(new Put(ROW).addColumn(FAMILY, col3, value));
Result r = t.get(new Get(ROW).readVersions(3).addColumn(FAMILY, col2));
assertEquals(3, r.size());
TEST_UTIL.getAdmin().flush(t.getName());
r = t.get(new Get(ROW).readVersions(3).addColumn(FAMILY, col2));
assertEquals(3, r.size());
TEST_UTIL.getAdmin().flush(t.getName());
}
}
@Test
public void testGetColumnHint() throws IOException {
createTable();
try (Table t =
TEST_UTIL.getConnection().getTableBuilder(TableName.valueOf(name.getMethodName()), null)
.setOperationTimeout(10000).setRpcTimeout(10000).build()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 100, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 101, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 102, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 103, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 104, value));
t.put(new Put(ROW2).addColumn(FAMILY, col1, 104, value));
TEST_UTIL.getAdmin().flush(t.getName());
t.delete(new Delete(ROW).addColumn(FAMILY, col1));
}
}
@Test
public void testRawScanAndMajorCompaction() throws IOException {
try (Table t = createTable()) {
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000001, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000002, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000003, value));
t.put(new Put(ROW).addColumn(FAMILY, col1, 1000004, value));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000004));
t.delete(new Delete(ROW).addColumn(FAMILY, col1, 1000003));
try (ResultScanner scannner = t.getScanner(new Scan().setRaw(true).readAllVersions())) {
Result r = scannner.next();
assertNull(scannner.next());
assertEquals(6, r.size());
}
TEST_UTIL.getAdmin().flush(t.getName());
try (ResultScanner scannner = t.getScanner(new Scan().setRaw(true).readAllVersions())) {
Result r = scannner.next();
assertNull(scannner.next());
assertEquals(6, r.size());
}
TEST_UTIL.getAdmin().majorCompact(t.getName());
Threads.sleep(5000);
try (ResultScanner scannner = t.getScanner(new Scan().setRaw(true).readAllVersions())) {
Result r = scannner.next();
assertNull(scannner.next());
assertEquals(1, r.size());
assertEquals(1000002, r.rawCells()[0].getTimestamp());
}
}
}
}