From 55badefa3817b9dd43797b7e6acdd429782e81e1 Mon Sep 17 00:00:00 2001 From: Nihal Jain Date: Wed, 25 Apr 2018 12:17:14 +0530 Subject: [PATCH] HBASE-20485 Copy constructor of Scan doesn't copy the readType and replicaId Signed-off-by: Chia-Ping Tsai --- .../org/apache/hadoop/hbase/client/Scan.java | 3 + .../apache/hadoop/hbase/client/TestScan.java | 94 ++++++++++++++++++- .../hbase/master/SplitOrMergeTracker.java | 1 - 3 files changed, 94 insertions(+), 4 deletions(-) diff --git a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java index b02bdc1462e..32fe2dc6b49 100644 --- a/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java +++ b/hbase-client/src/main/java/org/apache/hadoop/hbase/client/Scan.java @@ -279,6 +279,8 @@ public class Scan extends Query { this.limit = scan.getLimit(); this.needCursorResult = scan.isNeedCursorResult(); setPriority(scan.getPriority()); + readType = scan.getReadType(); + super.setReplicaId(scan.getReplicaId()); } /** @@ -310,6 +312,7 @@ public class Scan extends Query { } this.mvccReadPoint = -1L; setPriority(get.getPriority()); + super.setReplicaId(get.getReplicaId()); } public boolean isGetScan() { diff --git a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java index 18dcb46ce9c..7ef95245f27 100644 --- a/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java +++ b/hbase-client/src/test/java/org/apache/hadoop/hbase/client/TestScan.java @@ -24,9 +24,13 @@ import static org.junit.Assert.fail; import java.io.IOException; import java.util.Arrays; import java.util.Set; + +import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.hadoop.hbase.HBaseClassTestRule; import org.apache.hadoop.hbase.HConstants; +import org.apache.hadoop.hbase.client.Scan.ReadType; import org.apache.hadoop.hbase.filter.FilterList; +import org.apache.hadoop.hbase.security.access.Permission; import org.apache.hadoop.hbase.security.visibility.Authorizations; import org.apache.hadoop.hbase.testclassification.ClientTests; import org.apache.hadoop.hbase.testclassification.SmallTests; @@ -35,7 +39,6 @@ import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; import org.junit.experimental.categories.Category; - import org.apache.hadoop.hbase.shaded.protobuf.ProtobufUtil; import org.apache.hadoop.hbase.shaded.protobuf.generated.ClientProtos; @@ -66,7 +69,7 @@ public class TestScan { } @Test - public void testGetToScan() throws IOException { + public void testGetToScan() throws Exception { Get get = new Get(Bytes.toBytes(1)); get.setCacheBlocks(true) .setConsistency(Consistency.TIMELINE) @@ -79,7 +82,12 @@ public class TestScan { .setRowOffsetPerColumnFamily(5) .setTimeRange(0, 13) .setAttribute("att_v0", Bytes.toBytes("att_v0")) - .setColumnFamilyTimeRange(Bytes.toBytes("cf"), 0, 123); + .setColumnFamilyTimeRange(Bytes.toBytes("cf"), 0, 123) + .setReplicaId(3) + .setACL("test_user", new Permission(Permission.Action.READ)) + .setAuthorizations(new Authorizations("test_label")) + .setPriority(3); + Scan scan = new Scan(get); assertEquals(get.getCacheBlocks(), scan.getCacheBlocks()); assertEquals(get.getConsistency(), scan.getConsistency()); @@ -97,6 +105,10 @@ public class TestScan { scan.getColumnFamilyTimeRange().get(Bytes.toBytes("cf")).getMin()); assertEquals(get.getColumnFamilyTimeRange().get(Bytes.toBytes("cf")).getMax(), scan.getColumnFamilyTimeRange().get(Bytes.toBytes("cf")).getMax()); + assertEquals(get.getReplicaId(), scan.getReplicaId()); + assertEquals(get.getACL(), scan.getACL()); + assertEquals(get.getAuthorizations().getLabels(), scan.getAuthorizations().getLabels()); + assertEquals(get.getPriority(), scan.getPriority()); } @Test @@ -201,5 +213,81 @@ public class TestScan { fail("expected IllegalArgumentException to be thrown"); } } + + @Test + public void testScanCopyConstructor() throws Exception { + Scan scan = new Scan(); + + scan.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("q")) + .setACL("test_user", new Permission(Permission.Action.READ)) + .setAllowPartialResults(true) + .setAsyncPrefetch(false) + .setAttribute("test_key", Bytes.toBytes("test_value")) + .setAuthorizations(new Authorizations("test_label")) + .setBatch(10) + .setCacheBlocks(false) + .setCaching(10) + .setConsistency(Consistency.TIMELINE) + .setFilter(new FilterList()) + .setId("scan_copy_constructor") + .setIsolationLevel(IsolationLevel.READ_COMMITTED) + .setLimit(100) + .setLoadColumnFamiliesOnDemand(false) + .setMaxResultSize(100) + .setMaxResultsPerColumnFamily(1000) + .readVersions(9999) + .setMvccReadPoint(5) + .setNeedCursorResult(true) + .setPriority(1) + .setRaw(true) + .setReplicaId(3) + .setReversed(true) + .setRowOffsetPerColumnFamily(5) + .setRowPrefixFilter(Bytes.toBytes("row_")) + .setScanMetricsEnabled(true) + .setSmall(true) + .setReadType(ReadType.STREAM) + .withStartRow(Bytes.toBytes("row_1")) + .withStopRow(Bytes.toBytes("row_2")) + .setTimeRange(0, 13); + + // create a copy of existing scan object + Scan scanCopy = new Scan(scan); + + // validate fields of copied scan object match with the original scan object + assertEquals(scan.getACL(), scanCopy.getACL()); + assertEquals(scan.getAllowPartialResults(), scanCopy.getAllowPartialResults()); + assertEquals(scan.getAttribute("test_key"), scanCopy.getAttribute("test_key")); + assertEquals(scan.getAttributeSize(), scanCopy.getAttributeSize()); + assertEquals(scan.getAttributesMap(), scanCopy.getAttributesMap()); + assertEquals(scan.getAuthorizations().getLabels(), scanCopy.getAuthorizations().getLabels()); + assertEquals(scan.getBatch(), scanCopy.getBatch()); + assertEquals(scan.getCacheBlocks(), scanCopy.getCacheBlocks()); + assertEquals(scan.getCaching(), scanCopy.getCaching()); + assertEquals(scan.getConsistency(), scanCopy.getConsistency()); + assertEquals(scan.getFamilies().length, scanCopy.getFamilies().length); + assertEquals(scan.getFamilies()[0], scanCopy.getFamilies()[0]); + assertEquals(scan.getFamilyMap(), scanCopy.getFamilyMap()); + assertEquals(scan.getFilter(), scanCopy.getFilter()); + assertEquals(scan.getId(), scanCopy.getId()); + assertEquals(scan.getIsolationLevel(), scanCopy.getIsolationLevel()); + assertEquals(scan.getLimit(), scanCopy.getLimit()); + assertEquals(scan.getLoadColumnFamiliesOnDemandValue(), + scanCopy.getLoadColumnFamiliesOnDemandValue()); + assertEquals(scan.getMaxResultSize(), scanCopy.getMaxResultSize()); + assertEquals(scan.getMaxResultsPerColumnFamily(), scanCopy.getMaxResultsPerColumnFamily()); + assertEquals(scan.getMaxVersions(), scanCopy.getMaxVersions()); + assertEquals(scan.getMvccReadPoint(), scanCopy.getMvccReadPoint()); + assertEquals(scan.getPriority(), scanCopy.getPriority()); + assertEquals(scan.getReadType(), scanCopy.getReadType()); + assertEquals(scan.getReplicaId(), scanCopy.getReplicaId()); + assertEquals(scan.getRowOffsetPerColumnFamily(), scanCopy.getRowOffsetPerColumnFamily()); + assertEquals(scan.getStartRow(), scanCopy.getStartRow()); + assertEquals(scan.getStopRow(), scanCopy.getStopRow()); + assertEquals(scan.getTimeRange(), scanCopy.getTimeRange()); + + assertTrue("Make sure copy constructor adds all the fields in the copied object", + EqualsBuilder.reflectionEquals(scan, scanCopy)); + } } diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitOrMergeTracker.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitOrMergeTracker.java index 55287d21d71..52040fab77d 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitOrMergeTracker.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/master/SplitOrMergeTracker.java @@ -36,7 +36,6 @@ import org.apache.zookeeper.KeeperException; /** * Tracks the switch of split and merge states in ZK - * */ @InterfaceAudience.Private public class SplitOrMergeTracker {