Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line numberDiff line numberDiff line change
Expand Up@@ -2110,12 +2110,11 @@ private boolean execeededIndexQuota(PTableType tableType, PTable parentTable) {
return PTableType.INDEX == tableType && parentTable.getIndexes().size() >= maxIndexesPerTable;
}

private List<PTable> findAllChildViews(long clientTimeStamp, byte[] tenantId, byte[] schemaName, byte[] tableName) throws IOException, SQLException {
private List<PTable> findAllChildViews(long clientTimeStamp, int clientVersion, byte[] tenantId,
byte[] schemaName, byte[] tableName) throws IOException, SQLException {
TableViewFinderResult result = new TableViewFinderResult();
try (Table hTable =
env.getTable(SchemaUtil.getPhysicalTableName(
SYSTEM_CHILD_LINK_NAME_BYTES,
env.getConfiguration()))) {
try (Table hTable = env.getTable(
getSystemTableForChildLinks(clientVersion, env.getConfiguration()))) {
ViewUtil.findAllRelatives(hTable, tenantId, schemaName, tableName,
LinkType.CHILD_TABLE, result);
}
Expand DownExpand Up@@ -2505,7 +2504,8 @@ private MetaDataMutationResult doDropTable(byte[] key, byte[] tenantId, byte[] s
List<RowLock> locks = Lists.newArrayList();
try {
if (expectedType == PTableType.TABLE) {
childViews = findAllChildViews(clientTimeStamp, tenantId, schemaName, tableName);
childViews = findAllChildViews(clientTimeStamp, clientVersion, tenantId,
schemaName, tableName);

if (!childViews.isEmpty()) {
// From 4.15 onwards we allow SYSTEM.CATALOG to split and no longer propagate parent
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -42,6 +42,8 @@
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_SCHEMA;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CATALOG_TABLE_BYTES;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.SYSTEM_CHILD_LINK_NAME_BYTES;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_CAT;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_NAME;
import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_SCHEM;
Expand DownExpand Up@@ -1348,28 +1350,37 @@ public static void syncUpdateCacheFreqAllIndexes(PhoenixConnection conn, PTable
syncUpdateCacheFreqForIndexesOfTable(table, stmt);

TableViewFinderResult childViewsResult = new TableViewFinderResult();
try (Table childLinkTable = newConn.getQueryServices()
.getTable(SchemaUtil.getPhysicalName(
PhoenixDatabaseMetaData.SYSTEM_CHILD_LINK_NAME_BYTES,
newConn.getQueryServices().getProps())
.getName())) {
ViewUtil.findAllRelatives(childLinkTable, tenantId,
table.getSchemaName().getBytes(), table.getTableName().getBytes(),
LinkType.CHILD_TABLE, childViewsResult);

// Iterate over the chain of child views
for (TableInfo tableInfo: childViewsResult.getLinks()) {
PTable view;
String viewName = SchemaUtil.getTableName(tableInfo.getSchemaName(),
tableInfo.getTableName());
try {
view = PhoenixRuntime.getTable(newConn, viewName);
} catch (TableNotFoundException e) {
// Ignore
LOGGER.warn("Error getting PTable for view: " + viewName);
continue;
for (int i=0; i<2; i++) {
try (Table sysCatOrSysChildLinkTable = newConn.getQueryServices()
.getTable(SchemaUtil.getPhysicalName(
i==0 ? SYSTEM_CHILD_LINK_NAME_BYTES : SYSTEM_CATALOG_TABLE_BYTES,
newConn.getQueryServices().getProps())
.getName())) {
ViewUtil.findAllRelatives(sysCatOrSysChildLinkTable, tenantId,
table.getSchemaName().getBytes(), table.getTableName().getBytes(),
LinkType.CHILD_TABLE, childViewsResult);

// Iterate over the chain of child views
for (TableInfo tableInfo: childViewsResult.getLinks()) {
PTable view;
String viewName = SchemaUtil.getTableName(tableInfo.getSchemaName(),
tableInfo.getTableName());
try {
view = PhoenixRuntime.getTable(newConn, viewName);
} catch (TableNotFoundException e) {
// Ignore
LOGGER.warn("Error getting PTable for view: " + viewName);
continue;
}
syncUpdateCacheFreqForIndexesOfTable(view, stmt);
}
break;
} catch (TableNotFoundException ex) {
// try again with SYSTEM.CATALOG in case the schema is old
if (i == 1) {
// This means even SYSTEM.CATALOG was not found, so this is bad, rethrow
throw ex;
}
syncUpdateCacheFreqForIndexesOfTable(view, stmt);
}
}
stmt.executeBatch();
Expand DownExpand Up@@ -2110,14 +2121,23 @@ public static void upgradeTable(PhoenixConnection conn, String srcTable) throws
LOGGER.info(String.format("teanantId %s..", conn.getTenantId()));

TableViewFinderResult childViewsResult = new TableViewFinderResult();
try (Table childLinkTable =
conn.getQueryServices()
.getTable(SchemaUtil.getPhysicalName(
PhoenixDatabaseMetaData.SYSTEM_CHILD_LINK_NAME_BYTES, readOnlyProps)
.getName())) {
byte[] tenantId = conn.getTenantId() != null ? conn.getTenantId().getBytes() : null;
ViewUtil.findAllRelatives(childLinkTable, tenantId, schemaName.getBytes(),
tableName.getBytes(), LinkType.CHILD_TABLE, childViewsResult);

for (int i=0; i<2; i++) {
try (Table sysCatOrSysChildLinkTable = conn.getQueryServices()
.getTable(SchemaUtil.getPhysicalName(
i==0 ? SYSTEM_CHILD_LINK_NAME_BYTES : SYSTEM_CATALOG_TABLE_BYTES,
readOnlyProps).getName())) {
byte[] tenantId = conn.getTenantId() != null ? conn.getTenantId().getBytes() : null;
ViewUtil.findAllRelatives(sysCatOrSysChildLinkTable, tenantId, schemaName.getBytes(),
tableName.getBytes(), LinkType.CHILD_TABLE, childViewsResult);
break;
} catch (TableNotFoundException ex) {
// try again with SYSTEM.CATALOG in case the schema is old
if (i == 1) {
// This means even SYSTEM.CATALOG was not found, so this is bad, rethrow
throw ex;
}
}
}

// Upgrade the data or main table
Expand Down
Original file line numberDiff line numberDiff line change
Expand Up@@ -85,25 +85,25 @@ public class ViewUtil {

private static final Logger logger = LoggerFactory.getLogger(ViewUtil.class);

public static void findAllRelatives(Table systemTable, byte[] tenantId, byte[] schema, byte[] table,
public static void findAllRelatives(Table sysCatOrsysChildLink, byte[] tenantId, byte[] schema, byte[] table,
PTable.LinkType linkType, TableViewFinderResult result) throws IOException {
findAllRelatives(systemTable, tenantId, schema, table, linkType, HConstants.LATEST_TIMESTAMP, result);
findAllRelatives(sysCatOrsysChildLink, tenantId, schema, table, linkType, HConstants.LATEST_TIMESTAMP, result);
}

static void findAllRelatives(Table systemCatalog, byte[] tenantId, byte[] schema, byte[] table,
private static void findAllRelatives(Table sysCatOrsysChildLink, byte[] tenantId, byte[] schema, byte[] table,
PTable.LinkType linkType, long timestamp, TableViewFinderResult result) throws IOException {
TableViewFinderResult currentResult =
findRelatedViews(systemCatalog, tenantId, schema, table, linkType, timestamp);
findRelatedViews(sysCatOrsysChildLink, tenantId, schema, table, linkType, timestamp);
result.addResult(currentResult);
for (TableInfo viewInfo : currentResult.getLinks()) {
findAllRelatives(systemCatalog, viewInfo.getTenantId(), viewInfo.getSchemaName(), viewInfo.getTableName(), linkType, timestamp, result);
findAllRelatives(sysCatOrsysChildLink, viewInfo.getTenantId(), viewInfo.getSchemaName(), viewInfo.getTableName(), linkType, timestamp, result);
}
}

/**
* Runs a scan on SYSTEM.CATALOG or SYSTEM.CHILD_LINK to get the related tables/views
*/
static TableViewFinderResult findRelatedViews(Table systemCatalog, byte[] tenantId, byte[] schema, byte[] table,
private static TableViewFinderResult findRelatedViews(Table sysCatOrsysChildLink, byte[] tenantId, byte[] schema, byte[] table,
PTable.LinkType linkType, long timestamp) throws IOException {
if (linkType==PTable.LinkType.INDEX_TABLE || linkType==PTable.LinkType.EXCLUDED_COLUMN) {
throw new IllegalArgumentException("findAllRelatives does not support link type "+linkType);
Expand All@@ -121,7 +121,7 @@ static TableViewFinderResult findRelatedViews(Table systemCatalog, byte[] tenant
if (linkType==PTable.LinkType.PHYSICAL_TABLE)
scan.addColumn(TABLE_FAMILY_BYTES, TABLE_TYPE_BYTES);
List<TableInfo> tableInfoList = Lists.newArrayList();
try (ResultScanner scanner = systemCatalog.getScanner(scan)) {
try (ResultScanner scanner = sysCatOrsysChildLink.getScanner(scan)) {
for (Result result = scanner.next(); (result != null); result = scanner.next()) {
byte[][] rowKeyMetaData = new byte[5][];
byte[] viewTenantId = null;
Expand DownExpand Up@@ -189,7 +189,7 @@ public static void dropChildViews(RegionCoprocessorEnvironment env, byte[] tenan
}
catch (Exception e){
}
// if the SYSTEM.CHILD_LINK doesn't exist just return
// if the SYSTEM.CATALOG or SYSTEM.CHILD_LINK doesn't exist just return
if (hTable==null) {
return;
}
Expand Down