You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by td...@apache.org on 2017/05/31 17:35:35 UTC
phoenix git commit: PHOENIX-3870 Backward compatibility fails between
v4.9.0 and head of 4.x (4.11-SNAPSHOT)
Repository: phoenix
Updated Branches:
refs/heads/4.x-HBase-0.98 0fa032969 -> d1db996cb
PHOENIX-3870 Backward compatibility fails between v4.9.0 and head of 4.x (4.11-SNAPSHOT)
Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo
Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/d1db996c
Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/d1db996c
Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/d1db996c
Branch: refs/heads/4.x-HBase-0.98
Commit: d1db996cb0cab11b6c27f1a620cc92000cd3ad7d
Parents: 0fa0329
Author: Thomas <td...@salesforce.com>
Authored: Tue May 30 15:47:20 2017 -0700
Committer: Thomas <td...@salesforce.com>
Committed: Wed May 31 10:32:02 2017 -0700
----------------------------------------------------------------------
.../coprocessor/MetaDataEndpointImpl.java | 126 ++++++++++++++++---
1 file changed, 109 insertions(+), 17 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/phoenix/blob/d1db996c/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
----------------------------------------------------------------------
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
index 96b8d8f..8957fb9 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointImpl.java
@@ -95,7 +95,6 @@ import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.NavigableMap;
-import java.util.Properties;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
@@ -118,6 +117,7 @@ import org.apache.hadoop.hbase.coprocessor.CoprocessorException;
import org.apache.hadoop.hbase.coprocessor.CoprocessorService;
import org.apache.hadoop.hbase.coprocessor.RegionCoprocessorEnvironment;
import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;
+import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.FirstKeyOnlyFilter;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.io.ImmutableBytesWritable;
@@ -195,10 +195,10 @@ import org.apache.phoenix.schema.PName;
import org.apache.phoenix.schema.PNameFactory;
import org.apache.phoenix.schema.PTable;
import org.apache.phoenix.schema.PTable.EncodedCQCounter;
+import org.apache.phoenix.schema.PTable.ImmutableStorageScheme;
import org.apache.phoenix.schema.PTable.IndexType;
import org.apache.phoenix.schema.PTable.LinkType;
import org.apache.phoenix.schema.PTable.QualifierEncodingScheme;
-import org.apache.phoenix.schema.PTable.ImmutableStorageScheme;
import org.apache.phoenix.schema.PTable.ViewType;
import org.apache.phoenix.schema.PTableImpl;
import org.apache.phoenix.schema.PTableType;
@@ -1652,8 +1652,8 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
return null;
}
- private void findAllChildViews(HRegion region, byte[] tenantId, byte[] schemaName, byte[] tableName, TableViewFinderResult result) throws IOException {
- TableViewFinderResult currResult = findChildViews(region, tenantId, schemaName, tableName);
+ private void findAllChildViews(HRegion region, byte[] tenantId, PTable table, TableViewFinderResult result, long clientTimeStamp) throws IOException, SQLException {
+ TableViewFinderResult currResult = findChildViews(region, tenantId, table);
result.addResult(currResult);
for (Result viewResult : currResult.getResults()) {
byte[][] rowViewKeyMetaData = new byte[5][];
@@ -1661,16 +1661,89 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
byte[] viewtenantId = rowViewKeyMetaData[PhoenixDatabaseMetaData.COLUMN_NAME_INDEX];
byte[] viewSchema = SchemaUtil.getSchemaNameFromFullName(rowViewKeyMetaData[PhoenixDatabaseMetaData.FAMILY_NAME_INDEX]).getBytes();
byte[] viewTable = SchemaUtil.getTableNameFromFullName(rowViewKeyMetaData[PhoenixDatabaseMetaData.FAMILY_NAME_INDEX]).getBytes();
- findAllChildViews(region, viewtenantId, viewSchema, viewTable, result);
+ byte[] tableKey =
+ SchemaUtil.getTableKey(viewtenantId,
+ viewSchema,
+ viewTable);
+ ImmutableBytesPtr cacheKey = new ImmutableBytesPtr(tableKey);
+ PTable view =
+ loadTable(env, tableKey, cacheKey, clientTimeStamp,
+ clientTimeStamp);
+ findAllChildViews(region, viewtenantId, view, result, clientTimeStamp);
}
}
-
- /**
- * @param tableName parent table's name
- * Looks for whether child views exist for the table specified by table.
- * TODO: should we pass a timestamp here?
- */
- private TableViewFinderResult findChildViews(HRegion region, byte[] tenantId, byte[] schemaName, byte[] tableName) throws IOException {
+
+
+ // TODO remove this in 4.13 release
+ @Deprecated
+ private TableViewFinderResult findChildViews_deprecated(HRegion region, byte[] tenantId, PTable table, byte[] linkTypeBytes) throws IOException {
+ byte[] schemaName = table.getSchemaName().getBytes();
+ byte[] tableName = table.getTableName().getBytes();
+ boolean isMultiTenant = table.isMultiTenant();
+ Scan scan = new Scan();
+ // If the table is multi-tenant, we need to check across all tenant_ids,
+ // so we can't constrain the row key. Otherwise, any views would have
+ // the same tenantId.
+ if (!isMultiTenant) {
+ byte[] startRow = ByteUtil.concat(tenantId, QueryConstants.SEPARATOR_BYTE_ARRAY);
+ byte[] stopRow = ByteUtil.nextKey(startRow);
+ scan.setStartRow(startRow);
+ scan.setStopRow(stopRow);
+ }
+ SingleColumnValueFilter linkFilter = new SingleColumnValueFilter(TABLE_FAMILY_BYTES, LINK_TYPE_BYTES, CompareOp.EQUAL, linkTypeBytes);
+ SingleColumnValueFilter tableTypeFilter = new SingleColumnValueFilter(TABLE_FAMILY_BYTES, TABLE_TYPE_BYTES,
+ CompareOp.EQUAL, PTableType.VIEW.getSerializedValue().getBytes());
+ tableTypeFilter.setFilterIfMissing(false);
+ linkFilter.setFilterIfMissing(true);
+ byte[] suffix = ByteUtil.concat(QueryConstants.SEPARATOR_BYTE_ARRAY, SchemaUtil
+ .getPhysicalTableName(SchemaUtil.getTableNameAsBytes(schemaName, tableName), table.isNamespaceMapped())
+ .getName());
+ SuffixFilter rowFilter = new SuffixFilter(suffix);
+ FilterList filter = new FilterList(linkFilter,tableTypeFilter,rowFilter);
+ scan.setFilter(filter);
+ scan.addColumn(TABLE_FAMILY_BYTES, LINK_TYPE_BYTES);
+ scan.addColumn(TABLE_FAMILY_BYTES, TABLE_TYPE_BYTES);
+ scan.addColumn(TABLE_FAMILY_BYTES, TABLE_SEQ_NUM_BYTES);
+
+ // Original region-only scanner modified due to PHOENIX-1208
+ // RegionScanner scanner = region.getScanner(scan);
+ // The following *should* work, but doesn't due to HBASE-11837
+ // TableName systemCatalogTableName = region.getTableDesc().getTableName();
+ // HTableInterface hTable = env.getTable(systemCatalogTableName);
+ // These deprecated calls work around the issue
+ HTableInterface hTable = ServerUtil.getHTableForCoprocessorScan(env,
+ region.getTableDesc().getTableName().getName());
+ try {
+ boolean allViewsInCurrentRegion = true;
+ int numOfChildViews = 0;
+ List<Result> results = Lists.newArrayList();
+ ResultScanner scanner = hTable.getScanner(scan);
+ try {
+ for (Result result = scanner.next(); (result != null); result = scanner.next()) {
+ numOfChildViews++;
+ ImmutableBytesWritable ptr = new ImmutableBytesWritable();
+ ResultTuple resultTuple = new ResultTuple(result);
+ resultTuple.getKey(ptr);
+ byte[] key = ptr.copyBytes();
+ if (checkTableKeyInRegion(key, region) != null) {
+ allViewsInCurrentRegion = false;
+ }
+ results.add(result);
+ }
+ TableViewFinderResult tableViewFinderResult = new TableViewFinderResult(results);
+ if (numOfChildViews > 0 && !allViewsInCurrentRegion) {
+ tableViewFinderResult.setAllViewsNotInSingleRegion();
+ }
+ return tableViewFinderResult;
+ } finally {
+ scanner.close();
+ }
+ } finally {
+ hTable.close();
+ }
+ }
+
+ private TableViewFinderResult findChildViews_4_11(HRegion region, byte[] tenantId, byte[] schemaName, byte[] tableName) throws IOException {
Scan scan = new Scan();
byte[] startRow = SchemaUtil.getTableKey(tenantId, schemaName, tableName);
byte[] stopRow = ByteUtil.nextKey(startRow);
@@ -1719,7 +1792,28 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
hTable.close();
}
}
+
+ private static final byte[] PHYSICAL_TABLE_BYTES =
+ new byte[] { PTable.LinkType.PHYSICAL_TABLE.getSerializedValue() };
+ private TableViewFinderResult findChildViews(HRegion region, byte[] tenantId, PTable table)
+ throws IOException, SQLException {
+ byte[] tableKey =
+ SchemaUtil.getTableKey(ByteUtil.EMPTY_BYTE_ARRAY,
+ PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA_BYTES,
+ PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE_BYTES);
+ ImmutableBytesPtr cacheKey = new ImmutableBytesPtr(tableKey);
+ PTable systemCatalog =
+ loadTable(env, tableKey, cacheKey, MIN_SYSTEM_TABLE_TIMESTAMP,
+ HConstants.LATEST_TIMESTAMP);
+ if (systemCatalog.getTimeStamp() < MIN_SYSTEM_TABLE_TIMESTAMP_4_11_0) {
+ return findChildViews_deprecated(region, tenantId, table, PHYSICAL_TABLE_BYTES);
+ } else {
+ return findChildViews_4_11(region, tenantId, table.getSchemaName().getBytes(),
+ table.getTableName().getBytes());
+ }
+ }
+
@Override
public void dropTable(RpcController controller, DropTableRequest request,
RpcCallback<MetaDataResponse> done) {
@@ -1850,7 +1944,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
if (tableType == PTableType.TABLE || tableType == PTableType.SYSTEM) {
// Handle any child views that exist
- TableViewFinderResult tableViewFinderResult = findChildViews(region, tenantId, table.getSchemaName().getBytes(), table.getTableName().getBytes());
+ TableViewFinderResult tableViewFinderResult = findChildViews(region, tenantId, table);
if (tableViewFinderResult.hasViews()) {
if (isCascade) {
if (tableViewFinderResult.allViewsInMultipleRegions()) {
@@ -2884,10 +2978,9 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
schemaName, tableName);
// Size for worst case - all new columns are PK column
List<Mutation> mutationsForAddingColumnsToViews = Lists.newArrayListWithExpectedSize(tableMetaData.size() * ( 1 + table.getIndexes().size()));
- // TODO propagate to grandchild views as well
if (type == PTableType.TABLE || type == PTableType.SYSTEM) {
TableViewFinderResult childViewsResult = new TableViewFinderResult();
- findAllChildViews(region, tenantId, table.getSchemaName().getBytes(), table.getTableName().getBytes(), childViewsResult);
+ findAllChildViews(region, tenantId, table, childViewsResult, clientTimeStamp);
if (childViewsResult.hasViews()) {
/*
* Dis-allow if:
@@ -3161,10 +3254,9 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso
List<Mutation> additionalTableMetaData = Lists.newArrayList();
PTableType type = table.getType();
- // TODO propagate to grandchild views as well
if (type == PTableType.TABLE || type == PTableType.SYSTEM) {
TableViewFinderResult childViewsResult = new TableViewFinderResult();
- findAllChildViews(region, tenantId, table.getSchemaName().getBytes(), table.getTableName().getBytes(), childViewsResult);
+ findAllChildViews(region, tenantId, table, childViewsResult, clientTimeStamp);
if (childViewsResult.hasViews()) {
MetaDataMutationResult mutationResult =
dropColumnsFromChildViews(region, table,