[
https://issues.apache.org/jira/browse/PHOENIX-4229?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16193839#comment-16193839
]
Thomas D'Silva edited comment on PHOENIX-4229 at 10/5/17 10:28 PM:
-------------------------------------------------------------------
The child to parent link uses LinkType.PARENT_TABLE and parent to child link
uses LinkType.CHILD_TABLE. This happens in MetadataClient createTableInternal
{code}
// Add row linking view to its parent
PreparedStatement linkStatement =
connection.prepareStatement(CREATE_VIEW_LINK);
linkStatement.setString(1, tenantIdStr);
linkStatement.setString(2, schemaName);
linkStatement.setString(3, tableName);
linkStatement.setString(4, parent.getName().getString());
linkStatement.setByte(5,
LinkType.PARENT_TABLE.getSerializedValue());
linkStatement.setString(6, parent.getTenantId() == null ?
null : parent.getTenantId().getString());
linkStatement.execute();
// Add row linking parent to view
linkStatement =
connection.prepareStatement(CREATE_CHILD_LINK);
linkStatement.setString(1, parent.getTenantId() == null ?
null : parent.getTenantId().getString());
linkStatement.setString(2, parent.getSchemaName() == null ?
null : parent.getSchemaName().getString());
linkStatement.setString(3,
parent.getTableName().getString());
linkStatement.setString(4, tenantIdStr);
linkStatement.setString(5,
SchemaUtil.getTableName(schemaName, tableName));
linkStatement.setByte(6,
LinkType.CHILD_TABLE.getSerializedValue());
linkStatement.execute();
{code}
The parent to child link is created using CREATE_CHILD_LINK, you only need to
replicate a single cell (LINK_TYPE) and check that the row key of cell matches
the format. As James said, you can use MetaDataUtil.getVarChars() to decompose
the row key and check if
rowViewKeyMetaData[PhoenixDatabaseMetaData.FAMILY_NAME_INDEX] is not null and
the cell value is 4 (the serialized value of LinkType.CHILD_TABLE)
was (Author: tdsilva):
The child to parent link uses LinkType.PARENT_TABLE and parent to child link
uses LinkType.CHILD_TABLE. This happens in MetadataClient createTableInternal
{code}
// Add row linking view to its parent
PreparedStatement linkStatement =
connection.prepareStatement(CREATE_VIEW_LINK);
linkStatement.setString(1, tenantIdStr);
linkStatement.setString(2, schemaName);
linkStatement.setString(3, tableName);
linkStatement.setString(4, parent.getName().getString());
linkStatement.setByte(5,
LinkType.PARENT_TABLE.getSerializedValue());
linkStatement.setString(6, parent.getTenantId() == null ?
null : parent.getTenantId().getString());
linkStatement.execute();
// Add row linking parent to view
linkStatement =
connection.prepareStatement(CREATE_CHILD_LINK);
linkStatement.setString(1, parent.getTenantId() == null ?
null : parent.getTenantId().getString());
linkStatement.setString(2, parent.getSchemaName() == null ?
null : parent.getSchemaName().getString());
linkStatement.setString(3,
parent.getTableName().getString());
linkStatement.setString(4, tenantIdStr);
linkStatement.setString(5,
SchemaUtil.getTableName(schemaName, tableName));
linkStatement.setByte(6,
LinkType.CHILD_TABLE.getSerializedValue());
linkStatement.execute();
{code}
The parent to child link is created using CREATE_CHILD_LINK, you only need to
replicate a single cell (LINK_TYPE) and check that the row key of cell matches
the format. As James said, you can use MetaDataUtil.getVarChars() to decompose
the row key and check if
rowViewKeyMetaData[PhoenixDatabaseMetaData.FAMILY_NAME_INDEX] is not null and
the link type value is 4 (the serialized value of LinkType.CHILD_TABLE)
> Parent-Child linking rows in System.Catalog break tenant view replication
> -------------------------------------------------------------------------
>
> Key: PHOENIX-4229
> URL: https://issues.apache.org/jira/browse/PHOENIX-4229
> Project: Phoenix
> Issue Type: Bug
> Affects Versions: 4.11.0, 4.12.0
> Reporter: Geoffrey Jacoby
> Assignee: Geoffrey Jacoby
>
> PHOENIX-2051 introduced new Parent-Child linking rows to System.Catalog that
> speed up view deletion. Unfortunately, this breaks assumptions in
> PHOENIX-3639, which gives a way to replicate tenant views from one cluster to
> another. (It assumes that all the metadata for a tenant view is owned by the
> tenant -- the linking rows are not.)
> PHOENIX-3639 was a workaround in the first place to the more fundamental
> design problem that Phoenix places the metadata for both table schemas --
> which should never be replicated -- in the same table and column family as
> the metadata for tenant views, which should be replicated.
> Note that the linking rows also make it more difficult to ever split these
> two datasets apart, as proposed in PHOENIX-3520.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)