phoenix-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "ASF GitHub Bot (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (PHOENIX-1311) HBase namespaces surfaced in phoenix
Date Tue, 05 Apr 2016 00:01:33 GMT

    [ https://issues.apache.org/jira/browse/PHOENIX-1311?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15225332#comment-15225332
] 

ASF GitHub Bot commented on PHOENIX-1311:
-----------------------------------------

Github user samarthjain commented on a diff in the pull request:

    https://github.com/apache/phoenix/pull/153#discussion_r58469055
  
    --- Diff: phoenix-core/src/main/java/org/apache/phoenix/util/UpgradeUtil.java ---
    @@ -1279,4 +1304,129 @@ public static boolean truncateStats(HTableInterface metaTable,
HTableInterface s
             }
             return false;
         }
    +
    +    public static void mapTableToNamespace(HBaseAdmin admin, HTableInterface metatable,
String srcTableName,
    +            String destTableName, ReadOnlyProps props, Long ts, String phoenixTableName,
PTableType pTableType)
    +                    throws SnapshotCreationException, IllegalArgumentException, IOException,
InterruptedException,
    +                    SQLException {
    +        srcTableName = SchemaUtil.normalizeIdentifier(srcTableName);
    +        if (!SchemaUtil.isNamespaceMappingEnabled(
    +                SchemaUtil.isSystemTable(srcTableName.getBytes()) ? PTableType.SYSTEM
: null,
    +                props)) { throw new IllegalArgumentException(SchemaUtil.isSystemTable(srcTableName.getBytes())
    +                        ? "For system table " + QueryServices.IS_SYSTEM_TABLE_MAPPED_TO_NAMESPACE
    +                                + " also needs to be enabled along with " + QueryServices.IS_NAMESPACE_MAPPING_ENABLED
    +                        : QueryServices.IS_NAMESPACE_MAPPING_ENABLED + " is not enabled");
}
    +
    +        if (PTableType.TABLE.equals(pTableType) || PTableType.INDEX.equals(pTableType))
{
    +            admin.snapshot(srcTableName, srcTableName);
    +            admin.cloneSnapshot(srcTableName.getBytes(), destTableName.getBytes());
    +            admin.disableTable(srcTableName);
    +            admin.deleteTable(srcTableName);
    +        }
    +        if (phoenixTableName == null) {
    +            phoenixTableName = srcTableName;
    +        }
    +        Put put = new Put(SchemaUtil.getTableKey(null, SchemaUtil.getSchemaNameFromFullName(phoenixTableName),
    +                SchemaUtil.getTableNameFromFullName(phoenixTableName)), ts);
    +        put.addColumn(QueryConstants.DEFAULT_COLUMN_FAMILY_BYTES, PhoenixDatabaseMetaData.IS_NAMESPACE_MAPPED_BYTES,
    +                PBoolean.INSTANCE.toBytes(Boolean.TRUE));
    +        metatable.put(put);
    +    }
    +
    +    public static void mapTableToNamespace(HBaseAdmin admin, HTableInterface metatable,
String tableName,
    +            ReadOnlyProps props, Long ts) throws SnapshotCreationException, IllegalArgumentException,
IOException,
    +                    InterruptedException, SQLException {
    +        String destTablename = SchemaUtil
    +                .normalizeIdentifier(SchemaUtil.getPhysicalTableName(tableName, props).getNameAsString());
    +        mapTableToNamespace(admin, metatable, tableName, destTablename, props, ts, null,
PTableType.TABLE);
    +    }
    +
    +    public static void upgradeTable(PhoenixConnection conn, String srcTable) throws SQLException,
    +            SnapshotCreationException, IllegalArgumentException, IOException, InterruptedException
{
    +        ReadOnlyProps readOnlyProps = conn.getQueryServices().getProps();
    +        if (conn.getClientInfo(PhoenixRuntime.TENANT_ID_ATTRIB) != null) { throw new
SQLException(
    +                "May not specify the TENANT_ID_ATTRIB property when upgrading"); }
    +        try (HBaseAdmin admin = conn.getQueryServices().getAdmin();
    +                HTableInterface metatable = conn.getQueryServices()
    +                        .getTable(SchemaUtil
    +                                .getPhysicalName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES,
readOnlyProps)
    +                                .getName());) {
    +            String tableName = SchemaUtil.normalizeIdentifier(srcTable);
    +            String schemaName = SchemaUtil.getSchemaNameFromFullName(tableName);
    +
    +            // Upgrade is not required if schemaName is not present.
    +            if (schemaName.equals("")) { throw new IllegalArgumentException("Table doesn't
have schema name"); }
    +
    +            // Confirm table is not already upgraded
    +            PTable table = PhoenixRuntime.getTable(conn, tableName);
    +            if (table.isNamespaceMapped()) { throw new IllegalArgumentException("Table
is already upgraded"); }
    +            conn.createStatement().execute("CREATE SCHEMA IF NOT EXISTS " + schemaName);
    +            String newPhysicalTablename = SchemaUtil
    +                    .normalizeIdentifier(SchemaUtil.getPhysicalTableName(table.getPhysicalName().getString(),
readOnlyProps).getNameAsString());
    +
    +            // Upgrade the data or main table
    +            UpgradeUtil.mapTableToNamespace(admin, metatable, tableName, newPhysicalTablename,
readOnlyProps,
    +                    PhoenixRuntime.getCurrentScn(readOnlyProps), tableName, table.getType());
    +
    +            // clear the cache and get new table
    +            conn.getQueryServices().clearCache();
    +            MetaDataMutationResult result = new MetaDataClient(conn).updateCache(schemaName,
    +                    SchemaUtil.getTableNameFromFullName(tableName));
    +            if (result.getMutationCode() != MutationCode.TABLE_ALREADY_EXISTS) { throw
new TableNotFoundException(
    +                    tableName); }
    +            table = result.getTable();
    +            // check whether table is properly upgraded before upgrading indexes
    +            if (table.isNamespaceMapped()) {
    +                for (PTable index : table.getIndexes()) {
    +                    String srcTableName = index.getPhysicalName().getString();
    +                    if(srcTableName.contains(QueryConstants.NAMESPACE_SEPARATOR)){
    +                        //this condition occurs in case of multiple views on table
    +                        //skip already migrated tables 
    +                        continue;
    +                    }
    +                    String destTableName = null;
    +                    String phoenixTableName = index.getName().getString();
    +                    boolean updateLink = false;
    +                    if (srcTableName.startsWith(MetaDataUtil.LOCAL_INDEX_TABLE_PREFIX))
{
    --- End diff --
    
    Would be good to add a method like isLocalIndex in SchemaUtil


> HBase namespaces surfaced in phoenix
> ------------------------------------
>
>                 Key: PHOENIX-1311
>                 URL: https://issues.apache.org/jira/browse/PHOENIX-1311
>             Project: Phoenix
>          Issue Type: New Feature
>            Reporter: nicolas maillard
>            Assignee: Ankit Singhal
>            Priority: Minor
>             Fix For: 4.8.0
>
>         Attachments: PHOENIX-1311.docx, PHOENIX-1311_v1.patch, PHOENIX-1311_v2.patch,
PHOENIX-1311_wip.patch, PHOENIX-1311_wip_2.patch
>
>
> Hbase (HBASE-8015) has the concept of namespaces in the form of myNamespace:MyTable it
would be great if Phoenix leveraged this feature to give a database like feature on top of
the table.
> Maybe to stay close to Hbase it could also be a create DB:Table...
> or DB.Table which is a more standard annotation?



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Mime
View raw message