Repository: phoenix Updated Branches: refs/heads/4.x-HBase-0.98 0b015aad4 -> 7111e8d14
PHOENIX-4277 Treat delete markers consistently with puts for point-in-time scans Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/7111e8d1 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/7111e8d1 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/7111e8d1 Branch: refs/heads/4.x-HBase-0.98 Commit: 7111e8d14c60229bd33d26cd1f6207fda9660e4c Parents: 0b015aa Author: James Taylor <[email protected]> Authored: Sun Oct 29 15:19:23 2017 -0700 Committer: James Taylor <[email protected]> Committed: Mon Oct 30 09:09:18 2017 -0700 ---------------------------------------------------------------------- .../phoenix/end2end/PointInTimeQueryIT.java | 2 +- .../hadoop/hbase/regionserver/ScanInfoUtil.java | 35 ++++++++++++++++++++ .../coprocessor/BaseScannerRegionObserver.java | 22 ++++++++++++ .../apache/phoenix/util/TransactionUtil.java | 7 ++-- 4 files changed, 63 insertions(+), 3 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/7111e8d1/phoenix-core/src/it/java/org/apache/phoenix/end2end/PointInTimeQueryIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/PointInTimeQueryIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PointInTimeQueryIT.java index c53e523..ed3e8a9 100644 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/PointInTimeQueryIT.java +++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/PointInTimeQueryIT.java @@ -63,7 +63,7 @@ public class PointInTimeQueryIT extends BaseQueryIT { public PointInTimeQueryIT(String idxDdl, boolean columnEncoded) throws Exception { // These queries fail without KEEP_DELETED_CELLS=true - super(idxDdl, columnEncoded, true); + super(idxDdl, columnEncoded, false); } @Test http://git-wip-us.apache.org/repos/asf/phoenix/blob/7111e8d1/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/ScanInfoUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/ScanInfoUtil.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/ScanInfoUtil.java new file mode 100644 index 0000000..ba6526b --- /dev/null +++ b/phoenix-core/src/main/java/org/apache/hadoop/hbase/regionserver/ScanInfoUtil.java @@ -0,0 +1,35 @@ +/* + * 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 org.apache.hadoop.hbase.KeepDeletedCells; + +public class ScanInfoUtil { + private ScanInfoUtil() { + } + + public static boolean isKeepDeletedCells(ScanInfo scanInfo) { + return scanInfo.getKeepDeletedCells() != KeepDeletedCells.FALSE; + } + + public static ScanInfo cloneScanInfoWithKeepDeletedCells(ScanInfo scanInfo) { + return new ScanInfo(scanInfo.getFamily(), Math.max(scanInfo.getMinVersions(), 1), + scanInfo.getMaxVersions(), scanInfo.getTtl(), KeepDeletedCells.TRUE, + scanInfo.getTimeToPurgeDeletes(), scanInfo.getComparator()); + } +} http://git-wip-us.apache.org/repos/asf/phoenix/blob/7111e8d1/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java index ab41e37..df5ebc7 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseScannerRegionObserver.java @@ -19,10 +19,12 @@ package org.apache.phoenix.coprocessor; import java.io.IOException; import java.util.List; +import java.util.NavigableSet; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.CoprocessorEnvironment; import org.apache.hadoop.hbase.DoNotRetryIOException; +import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.NotServingRegionException; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.coprocessor.BaseRegionObserver; @@ -31,7 +33,12 @@ import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.io.TimeRange; import org.apache.hadoop.hbase.regionserver.HRegion; +import org.apache.hadoop.hbase.regionserver.KeyValueScanner; import org.apache.hadoop.hbase.regionserver.RegionScanner; +import org.apache.hadoop.hbase.regionserver.ScanInfo; +import org.apache.hadoop.hbase.regionserver.ScanInfoUtil; +import org.apache.hadoop.hbase.regionserver.Store; +import org.apache.hadoop.hbase.regionserver.StoreScanner; import org.apache.hadoop.hbase.util.Bytes; import org.apache.phoenix.execute.TupleProjector; import org.apache.phoenix.hbase.index.covered.update.ColumnReference; @@ -44,10 +51,12 @@ import org.apache.phoenix.schema.types.PUnsignedTinyint; import org.apache.phoenix.util.EncodedColumnsUtil; import org.apache.phoenix.util.ScanUtil; import org.apache.phoenix.util.ServerUtil; +import org.apache.phoenix.util.TransactionUtil; import org.cloudera.htrace.Span; import org.cloudera.htrace.Trace; + abstract public class BaseScannerRegionObserver extends BaseRegionObserver { public static final String AGGREGATORS = "_Aggs"; @@ -338,6 +347,19 @@ abstract public class BaseScannerRegionObserver extends BaseRegionObserver { useNewValueColumnQualifier, encodingScheme); return regionScannerFactory.getWrappedScanner(c.getEnvironment(), s, null, null, offset, scan, dataColumns, tupleProjector, dataRegion, indexMaintainer, null, viewConstants, null, null, projector, ptr, useQualiferAsListIndex); + } + + @Override + public KeyValueScanner preStoreScannerOpen(final ObserverContext<RegionCoprocessorEnvironment> c, + final Store store, final Scan scan, final NavigableSet<byte[]> targetCols, + final KeyValueScanner s) throws IOException { + + if (scan.isRaw() || ScanInfoUtil.isKeepDeletedCells(store.getScanInfo()) || scan.getTimeRange().getMax() == HConstants.LATEST_TIMESTAMP || TransactionUtil.isTransactionalTimestamp(scan.getTimeRange().getMax())) { + return s; + } + ScanInfo scanInfo = ScanInfoUtil.cloneScanInfoWithKeepDeletedCells(store.getScanInfo()); + return new StoreScanner(store, scanInfo, scan, targetCols, + c.getEnvironment().getRegion().getReadpoint(scan.getIsolationLevel())); } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/7111e8d1/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java b/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java index 01b775e..a99c700 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/util/TransactionUtil.java @@ -24,8 +24,6 @@ import org.apache.hadoop.hbase.CellUtil; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.client.HTableInterface; import org.apache.phoenix.coprocessor.MetaDataProtocol.MetaDataMutationResult; -import org.apache.phoenix.exception.SQLExceptionCode; -import org.apache.phoenix.exception.SQLExceptionInfo; import org.apache.phoenix.execute.MutationState; import org.apache.phoenix.jdbc.PhoenixConnection; import org.apache.phoenix.schema.PTable; @@ -33,11 +31,16 @@ import org.apache.phoenix.transaction.PhoenixTransactionContext; import org.apache.phoenix.transaction.PhoenixTransactionalTable; import org.apache.phoenix.transaction.TephraTransactionTable; import org.apache.phoenix.transaction.TransactionFactory; +import org.apache.tephra.util.TxUtils; public class TransactionUtil { private TransactionUtil() { } + public static boolean isTransactionalTimestamp(long ts) { + return !TxUtils.isPreExistingVersion(ts); + } + public static boolean isDelete(Cell cell) { return (CellUtil.matchingValue(cell, HConstants.EMPTY_BYTE_ARRAY)); }
