phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Thomas D'Silva (JIRA)" <j...@apache.org>
Subject [jira] [Comment Edited] (PHOENIX-4229) Parent-Child linking rows in System.Catalog break tenant view replication
Date Thu, 05 Oct 2017 22:29:01 GMT

    [ 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)

Mime
View raw message