Revert "PHOENIX-4198 Remove the need for users to have access to the Phoenix SYSTEM tables to create tables"
This reverts commit 7a4a974d3e82292b5b5ce94868d8d57c5272d114. Project: http://git-wip-us.apache.org/repos/asf/phoenix/repo Commit: http://git-wip-us.apache.org/repos/asf/phoenix/commit/5003ac30 Tree: http://git-wip-us.apache.org/repos/asf/phoenix/tree/5003ac30 Diff: http://git-wip-us.apache.org/repos/asf/phoenix/diff/5003ac30 Branch: refs/heads/4.x-HBase-1.1 Commit: 5003ac304eaa3ff27a3c5199f56e9954835ddc87 Parents: 1c3116f Author: James Taylor <jtay...@salesforce.com> Authored: Wed Nov 15 10:40:36 2017 -0800 Committer: James Taylor <jtay...@salesforce.com> Committed: Wed Nov 15 10:40:36 2017 -0800 ---------------------------------------------------------------------- .../phoenix/end2end/TableDDLPermissionsIT.java | 692 ------------------- .../org/apache/hadoop/hbase/ipc/RpcUtil.java | 32 - .../BaseMetaDataEndpointObserver.java | 111 --- .../coprocessor/MetaDataEndpointImpl.java | 338 ++------- .../coprocessor/MetaDataEndpointObserver.java | 68 -- .../coprocessor/MetaDataRegionObserver.java | 17 +- .../coprocessor/PhoenixAccessController.java | 628 ----------------- .../PhoenixMetaDataCoprocessorHost.java | 236 ------- .../index/PhoenixIndexFailurePolicy.java | 109 ++- .../query/ConnectionQueryServicesImpl.java | 15 +- .../org/apache/phoenix/query/QueryServices.java | 4 - .../phoenix/query/QueryServicesOptions.java | 14 +- .../phoenix/schema/stats/StatisticsWriter.java | 42 +- .../org/apache/phoenix/util/MetaDataUtil.java | 18 - .../org/apache/phoenix/util/SchemaUtil.java | 12 - 15 files changed, 140 insertions(+), 2196 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/phoenix/blob/5003ac30/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java deleted file mode 100644 index 971383b..0000000 --- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/TableDDLPermissionsIT.java +++ /dev/null @@ -1,692 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one or more - * contributor license agreements. See the NOTICE file distributed with - * this work for additional information regarding copyright ownership. - * The ASF licenses this file to you under the Apache License, Version 2.0 - * (the "License"); you may not use this file except in compliance with - * the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.phoenix.end2end; - -import static org.junit.Assert.assertEquals; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; - -import java.io.IOException; -import java.lang.reflect.UndeclaredThrowableException; -import java.security.PrivilegedExceptionAction; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.sql.Statement; -import java.util.Arrays; -import java.util.Collection; -import java.util.Collections; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Properties; -import java.util.Set; - -import org.apache.hadoop.conf.Configuration; -import org.apache.hadoop.hbase.AuthUtil; -import org.apache.hadoop.hbase.HBaseTestingUtility; -import org.apache.hadoop.hbase.HConstants; -import org.apache.hadoop.hbase.NamespaceDescriptor; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.security.AccessDeniedException; -import org.apache.hadoop.hbase.security.access.AccessControlClient; -import org.apache.hadoop.hbase.security.access.Permission.Action; -import org.apache.hadoop.hbase.util.Bytes; -import org.apache.hadoop.security.UserGroupInformation; -import org.apache.phoenix.exception.PhoenixIOException; -import org.apache.phoenix.query.QueryServices; -import org.apache.phoenix.util.MetaDataUtil; -import org.apache.phoenix.util.SchemaUtil; -import org.junit.After; -import org.junit.BeforeClass; -import org.junit.Test; -import org.junit.experimental.categories.Category; -import org.junit.runner.RunWith; -import org.junit.runners.Parameterized; -import org.junit.runners.Parameterized.Parameters; - -import com.google.common.collect.Maps; - -/** - * Test that verifies a user can read Phoenix tables with a minimal set of permissions. - */ -@Category(NeedsOwnMiniClusterTest.class) -@RunWith(Parameterized.class) -public class TableDDLPermissionsIT{ - private static String SUPERUSER; - - private static HBaseTestingUtility testUtil; - - private static final Set<String> PHOENIX_SYSTEM_TABLES = new HashSet<>(Arrays.asList( - "SYSTEM.CATALOG", "SYSTEM.SEQUENCE", "SYSTEM.STATS", "SYSTEM.FUNCTION", - "SYSTEM.MUTEX")); - // PHOENIX-XXXX SYSTEM.MUTEX isn't being created in the SYSTEM namespace as it should be. - private static final Set<String> PHOENIX_NAMESPACE_MAPPED_SYSTEM_TABLES = new HashSet<>( - Arrays.asList("SYSTEM:CATALOG", "SYSTEM:SEQUENCE", "SYSTEM:STATS", "SYSTEM:FUNCTION", - "SYSTEM.MUTEX")); - private static final String GROUP_SYSTEM_ACCESS = "group_system_access"; - final UserGroupInformation superUser = UserGroupInformation.createUserForTesting(SUPERUSER, new String[0]); - final UserGroupInformation superUser2 = UserGroupInformation.createUserForTesting("superuser", new String[0]); - final UserGroupInformation regularUser = UserGroupInformation.createUserForTesting("user", new String[0]); - final UserGroupInformation groupUser = UserGroupInformation.createUserForTesting("user2", new String[] { GROUP_SYSTEM_ACCESS }); - final UserGroupInformation unprivilegedUser = UserGroupInformation.createUserForTesting("unprivilegedUser", - new String[0]); - - - private static final int NUM_RECORDS = 5; - - private boolean isNamespaceMapped; - - public TableDDLPermissionsIT(final boolean isNamespaceMapped) throws Exception { - this.isNamespaceMapped = isNamespaceMapped; - Map<String, String> clientProps = Maps.newHashMapWithExpectedSize(1); - clientProps.put(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, "true"); - } - - private void startNewMiniCluster(Configuration overrideConf) throws Exception{ - if (null != testUtil) { - testUtil.shutdownMiniCluster(); - testUtil = null; - } - testUtil = new HBaseTestingUtility(); - - Configuration config = testUtil.getConfiguration(); - - config.set("hbase.coprocessor.master.classes", - "org.apache.hadoop.hbase.security.access.AccessController"); - config.set("hbase.coprocessor.region.classes", - "org.apache.hadoop.hbase.security.access.AccessController"); - config.set("hbase.coprocessor.regionserver.classes", - "org.apache.hadoop.hbase.security.access.AccessController"); - config.set("hbase.security.exec.permission.checks", "true"); - config.set("hbase.security.authorization", "true"); - config.set("hbase.superuser", SUPERUSER+","+superUser2.getShortUserName()); - config.set("hbase.regionserver.wal.codec", "org.apache.hadoop.hbase.regionserver.wal.IndexedWALEditCodec"); - config.set(QueryServices.PHOENIX_ACLS_ENABLED,"true"); - config.set(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); - // Avoid multiple clusters trying to bind the master's info port (16010) - config.setInt(HConstants.MASTER_INFO_PORT, -1); - - if (overrideConf != null) { - config.addResource(overrideConf); - } - testUtil.startMiniCluster(1); - } - - private void grantSystemTableAccess() throws Exception{ - try (Connection conn = getConnection()) { - if (isNamespaceMapped) { - grantPermissions(regularUser.getShortUserName(), PHOENIX_NAMESPACE_MAPPED_SYSTEM_TABLES, Action.READ, - Action.EXEC); - grantPermissions(unprivilegedUser.getShortUserName(), PHOENIX_NAMESPACE_MAPPED_SYSTEM_TABLES, - Action.READ, Action.EXEC); - grantPermissions(AuthUtil.toGroupEntry(GROUP_SYSTEM_ACCESS), PHOENIX_NAMESPACE_MAPPED_SYSTEM_TABLES, - Action.READ, Action.EXEC); - // Local Index requires WRITE permission on SYSTEM.SEQUENCE TABLE. - grantPermissions(regularUser.getShortUserName(), Collections.singleton("SYSTEM:SEQUENCE"), Action.WRITE, - Action.READ, Action.EXEC); - grantPermissions(unprivilegedUser.getShortUserName(), Collections.singleton("SYSTEM:SEQUENCE"), Action.WRITE, - Action.READ, Action.EXEC); - - } else { - grantPermissions(regularUser.getShortUserName(), PHOENIX_SYSTEM_TABLES, Action.READ, Action.EXEC); - grantPermissions(unprivilegedUser.getShortUserName(), PHOENIX_SYSTEM_TABLES, Action.READ, Action.EXEC); - grantPermissions(AuthUtil.toGroupEntry(GROUP_SYSTEM_ACCESS), PHOENIX_SYSTEM_TABLES, Action.READ, Action.EXEC); - // Local Index requires WRITE permission on SYSTEM.SEQUENCE TABLE. - grantPermissions(regularUser.getShortUserName(), Collections.singleton("SYSTEM.SEQUENCE"), Action.WRITE, - Action.READ, Action.EXEC); - grantPermissions(unprivilegedUser.getShortUserName(), Collections.singleton("SYSTEM:SEQUENCE"), Action.WRITE, - Action.READ, Action.EXEC); - } - } catch (Throwable e) { - if (e instanceof Exception) { - throw (Exception)e; - } else { - throw new Exception(e); - } - } - } - - @Parameters(name = "isNamespaceMapped={0}") // name is used by failsafe as file name in reports - public static Collection<Boolean> data() { - return Arrays.asList(true, false); - } - - @BeforeClass - public static void doSetup() throws Exception { - SUPERUSER = System.getProperty("user.name"); - //setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()), new ReadOnlyProps(clientProps.entrySet().iterator())); - } - - protected static String getUrl() { - return "jdbc:phoenix:localhost:" + testUtil.getZkCluster().getClientPort() + ":/hbase"; - } - - public Connection getConnection() throws SQLException{ - Properties props = new Properties(); - props.setProperty(QueryServices.IS_NAMESPACE_MAPPING_ENABLED, Boolean.toString(isNamespaceMapped)); - return DriverManager.getConnection(getUrl(),props); - } - - @Test - public void testSchemaPermissions() throws Throwable{ - - if (!isNamespaceMapped) { return; } - try { - startNewMiniCluster(null); - grantSystemTableAccess(); - final String schemaName = "TEST_SCHEMA_PERMISSION"; - superUser.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - try { - AccessControlClient.grant(getUtility().getConnection(), regularUser.getShortUserName(), - Action.ADMIN); - } catch (Throwable e) { - if (e instanceof Exception) { - throw (Exception)e; - } else { - throw new Exception(e); - } - } - return null; - } - }); - verifyAllowed(createSchema(schemaName), regularUser); - // Unprivileged user cannot drop a schema - verifyDenied(dropSchema(schemaName), unprivilegedUser); - verifyDenied(createSchema(schemaName), unprivilegedUser); - - verifyAllowed(dropSchema(schemaName), regularUser); - } finally { - revokeAll(); - } - } - - @Test - public void testAutomaticGrantDisabled() throws Throwable{ - testIndexAndView(false); - } - - public void testIndexAndView(boolean isAutomaticGrant) throws Throwable { - Configuration conf = new Configuration(); - conf.set(QueryServices.PHOENIX_AUTOMATIC_GRANT_ENABLED, Boolean.toString(isAutomaticGrant)); - startNewMiniCluster(conf); - final String schema = "TEST_INDEX_VIEW"; - final String tableName = "TABLE_DDL_PERMISSION_IT"; - final String phoenixTableName = schema + "." + tableName; - final String indexName1 = tableName + "_IDX1"; - final String indexName2 = tableName + "_IDX2"; - final String lIndexName1 = tableName + "_LIDX1"; - final String viewName1 = schema+"."+tableName + "_V1"; - final String viewName2 = schema+"."+tableName + "_V2"; - final String viewName3 = schema+"."+tableName + "_V3"; - final String viewName4 = schema+"."+tableName + "_V4"; - final String viewIndexName1 = tableName + "_VIDX1"; - final String viewIndexName2 = tableName + "_VIDX2"; - grantSystemTableAccess(); - try { - superUser.doAs(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - try { - verifyAllowed(createSchema(schema), superUser); - if (isNamespaceMapped) { - grantPermissions(regularUser.getShortUserName(), schema, Action.CREATE); - grantPermissions(AuthUtil.toGroupEntry(GROUP_SYSTEM_ACCESS), schema, Action.CREATE); - - } else { - grantPermissions(regularUser.getShortUserName(), - NamespaceDescriptor.DEFAULT_NAMESPACE.getName(), Action.CREATE); - grantPermissions(AuthUtil.toGroupEntry(GROUP_SYSTEM_ACCESS), - NamespaceDescriptor.DEFAULT_NAMESPACE.getName(), Action.CREATE); - - } - } catch (Throwable e) { - if (e instanceof Exception) { - throw (Exception)e; - } else { - throw new Exception(e); - } - } - return null; - } - }); - - verifyAllowed(createTable(phoenixTableName), regularUser); - verifyAllowed(createIndex(indexName1, phoenixTableName), regularUser); - verifyAllowed(createView(viewName1, phoenixTableName), regularUser); - verifyAllowed(createLocalIndex(lIndexName1, phoenixTableName), regularUser); - verifyAllowed(createIndex(viewIndexName1, viewName1), regularUser); - verifyAllowed(createIndex(viewIndexName2, viewName1), regularUser); - verifyAllowed(createView(viewName4, viewName1), regularUser); - verifyAllowed(readTable(phoenixTableName), regularUser); - - verifyDenied(createIndex(indexName2, phoenixTableName), unprivilegedUser); - verifyDenied(createView(viewName2, phoenixTableName), unprivilegedUser); - verifyDenied(createView(viewName3, viewName1), unprivilegedUser); - verifyDenied(dropView(viewName1), unprivilegedUser); - - verifyDenied(dropIndex(indexName1, phoenixTableName), unprivilegedUser); - verifyDenied(dropTable(phoenixTableName), unprivilegedUser); - verifyDenied(rebuildIndex(indexName1, phoenixTableName), unprivilegedUser); - verifyDenied(addColumn(phoenixTableName, "val1"), unprivilegedUser); - verifyDenied(dropColumn(phoenixTableName, "val"), unprivilegedUser); - verifyDenied(addProperties(phoenixTableName, "GUIDE_POSTS_WIDTH", "100"), unprivilegedUser); - - // Granting read permission to unprivileged user, now he should be able to create view but not index - grantPermissions(unprivilegedUser.getShortUserName(), - Collections.singleton( - SchemaUtil.getPhysicalHBaseTableName(schema, tableName, isNamespaceMapped).getString()), - Action.READ, Action.EXEC); - grantPermissions(AuthUtil.toGroupEntry(GROUP_SYSTEM_ACCESS), - Collections.singleton( - SchemaUtil.getPhysicalHBaseTableName(schema, tableName, isNamespaceMapped).getString()), - Action.READ, Action.EXEC); - verifyDenied(createIndex(indexName2, phoenixTableName), unprivilegedUser); - if (!isAutomaticGrant) { - // Automatic grant will read access for all indexes - verifyDenied(createView(viewName2, phoenixTableName), unprivilegedUser); - - // Granting read permission to unprivileged user on index so that a new view can read a index as well, - // now - // he should be able to create view but not index - grantPermissions(unprivilegedUser.getShortUserName(), - Collections.singleton(SchemaUtil - .getPhysicalHBaseTableName(schema, indexName1, isNamespaceMapped).getString()), - Action.READ, Action.EXEC); - verifyDenied(createView(viewName3, viewName1), unprivilegedUser); - } - - verifyAllowed(createView(viewName2, phoenixTableName), unprivilegedUser); - - if (!isAutomaticGrant) { - // Grant access to view index for parent view - grantPermissions(unprivilegedUser.getShortUserName(), - Collections.singleton(Bytes.toString(MetaDataUtil.getViewIndexPhysicalName(SchemaUtil - .getPhysicalHBaseTableName(schema, tableName, isNamespaceMapped).getBytes()))), - Action.READ, Action.EXEC); - } - verifyAllowed(createView(viewName3, viewName1), unprivilegedUser); - - // Grant create permission in namespace - if (isNamespaceMapped) { - grantPermissions(unprivilegedUser.getShortUserName(), schema, Action.CREATE); - } else { - grantPermissions(unprivilegedUser.getShortUserName(), NamespaceDescriptor.DEFAULT_NAMESPACE.getName(), - Action.CREATE); - } - if (!isAutomaticGrant) { - verifyDenied(createIndex(indexName2, phoenixTableName), unprivilegedUser); - // Give user of data table access to index table which will be created by unprivilegedUser - grantPermissions(regularUser.getShortUserName(), - Collections.singleton(SchemaUtil - .getPhysicalHBaseTableName(schema, indexName2, isNamespaceMapped).getString()), - Action.WRITE); - verifyDenied(createIndex(indexName2, phoenixTableName), unprivilegedUser); - grantPermissions(regularUser.getShortUserName(), - Collections.singleton(SchemaUtil - .getPhysicalHBaseTableName(schema, indexName2, isNamespaceMapped).getString()), - Action.WRITE, Action.READ, Action.CREATE, Action.EXEC, Action.ADMIN); - } - // we should be able to read the data from another index as well to which we have not given any access to - // this user - verifyAllowed(createIndex(indexName2, phoenixTableName), unprivilegedUser); - verifyAllowed(readTable(phoenixTableName, indexName1), unprivilegedUser); - verifyAllowed(readTable(phoenixTableName, indexName2), unprivilegedUser); - verifyAllowed(rebuildIndex(indexName2, phoenixTableName), unprivilegedUser); - - // data table user should be able to read new index - verifyAllowed(rebuildIndex(indexName2, phoenixTableName), regularUser); - verifyAllowed(readTable(phoenixTableName, indexName2), regularUser); - - verifyAllowed(readTable(phoenixTableName), regularUser); - verifyAllowed(rebuildIndex(indexName1, phoenixTableName), regularUser); - verifyAllowed(addColumn(phoenixTableName, "val1"), regularUser); - verifyAllowed(addProperties(phoenixTableName, "GUIDE_POSTS_WIDTH", "100"), regularUser); - verifyAllowed(dropView(viewName1), regularUser); - verifyAllowed(dropView(viewName2), regularUser); - verifyAllowed(dropColumn(phoenixTableName, "val1"), regularUser); - verifyAllowed(dropIndex(indexName2, phoenixTableName), regularUser); - verifyAllowed(dropIndex(indexName1, phoenixTableName), regularUser); - verifyAllowed(dropTable(phoenixTableName), regularUser); - - // check again with super users - verifyAllowed(createTable(phoenixTableName), superUser2); - verifyAllowed(createIndex(indexName1, phoenixTableName), superUser2); - verifyAllowed(createView(viewName1, phoenixTableName), superUser2); - verifyAllowed(readTable(phoenixTableName), superUser2); - verifyAllowed(dropView(viewName1), superUser2); - verifyAllowed(dropTable(phoenixTableName), superUser2); - - } finally { - revokeAll(); - } - } - - - @Test - public void testAutomaticGrantEnabled() throws Throwable{ - testIndexAndView(true); - } - - private void revokeAll() throws IOException, Throwable { - AccessControlClient.revoke(getUtility().getConnection(), AuthUtil.toGroupEntry(GROUP_SYSTEM_ACCESS),Action.values() ); - AccessControlClient.revoke(getUtility().getConnection(), regularUser.getShortUserName(),Action.values() ); - AccessControlClient.revoke(getUtility().getConnection(), unprivilegedUser.getShortUserName(),Action.values() ); - - } - - protected void grantPermissions(String groupEntry, Action... actions) throws IOException, Throwable { - AccessControlClient.grant(getUtility().getConnection(), groupEntry, actions); - } - - private AccessTestAction dropTable(final String tableName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("DROP TABLE IF EXISTS " + tableName)); - } - return null; - } - }; - - } - - private AccessTestAction createTable(final String tableName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("CREATE TABLE " + tableName + "(pk INTEGER not null primary key, data VARCHAR,val integer)")); - try (PreparedStatement pstmt = conn.prepareStatement("UPSERT INTO " + tableName + " values(?, ?, ?)")) { - for (int i = 0; i < NUM_RECORDS; i++) { - pstmt.setInt(1, i); - pstmt.setString(2, Integer.toString(i)); - pstmt.setInt(3, i); - assertEquals(1, pstmt.executeUpdate()); - } - } - conn.commit(); - } - return null; - } - }; - } - - private AccessTestAction readTable(final String tableName) throws SQLException { - return readTable(tableName,null); - } - private AccessTestAction readTable(final String tableName, final String indexName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement()) { - ResultSet rs = stmt.executeQuery("SELECT "+(indexName!=null?"/*+ INDEX("+tableName+" "+indexName+")*/":"")+" pk, data,val FROM " + tableName +" where data>='0'"); - assertNotNull(rs); - int i = 0; - while (rs.next()) { - assertEquals(i, rs.getInt(1)); - assertEquals(Integer.toString(i), rs.getString(2)); - assertEquals(i, rs.getInt(3)); - i++; - } - assertEquals(NUM_RECORDS, i); - } - return null; - } - }; - } - - public static HBaseTestingUtility getUtility(){ - return testUtil; - } - - private void grantPermissions(String toUser, Set<String> tablesToGrant, Action... actions) throws Throwable { - for (String table : tablesToGrant) { - AccessControlClient.grant(getUtility().getConnection(), TableName.valueOf(table), toUser, null, null, - actions); - } - } - - private void grantPermissions(String toUser, String namespace, Action... actions) throws Throwable { - AccessControlClient.grant(getUtility().getConnection(), namespace, toUser, actions); - } - - - private AccessTestAction dropColumn(final String tableName, final String columnName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("ALTER TABLE " + tableName + " DROP COLUMN "+columnName)); - } - return null; - } - }; - } - - private AccessTestAction addColumn(final String tableName, final String columnName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("ALTER TABLE " + tableName + " ADD "+columnName+" varchar")); - } - return null; - } - }; - } - - private AccessTestAction addProperties(final String tableName, final String property, final String value) - throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("ALTER TABLE " + tableName + " SET " + property + "=" + value)); - } - return null; - } - }; - } - - private AccessTestAction dropView(final String viewName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("DROP VIEW " + viewName)); - } - return null; - } - }; - } - - private AccessTestAction createView(final String viewName, final String dataTable) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("CREATE VIEW " + viewName + " AS SELECT * FROM " + dataTable)); - } - return null; - } - }; - } - - private AccessTestAction createIndex(final String indexName, final String dataTable) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("CREATE INDEX " + indexName + " on " + dataTable + "(data)")); - } - return null; - } - }; - } - - private AccessTestAction createLocalIndex(final String indexName, final String dataTable) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("CREATE LOCAL INDEX " + indexName + " on " + dataTable + "(data)")); - } - return null; - } - }; - } - - private AccessTestAction dropIndex(final String indexName, final String dataTable) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("DROP INDEX " + indexName + " on " + dataTable)); - } - return null; - } - }; - } - - private AccessTestAction createSchema(final String schemaName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - if (isNamespaceMapped) { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("CREATE SCHEMA " + schemaName)); - } - } - return null; - } - }; - } - - private AccessTestAction dropSchema(final String schemaName) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - if (isNamespaceMapped) { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("DROP SCHEMA " + schemaName)); - } - } - return null; - } - }; - } - - private AccessTestAction rebuildIndex(final String indexName, final String dataTable) throws SQLException { - return new AccessTestAction() { - @Override - public Object run() throws Exception { - try (Connection conn = getConnection(); Statement stmt = conn.createStatement();) { - assertFalse(stmt.execute("ALTER INDEX " + indexName + " on " + dataTable + " DISABLE")); - assertFalse(stmt.execute("ALTER INDEX " + indexName + " on " + dataTable + " REBUILD")); - } - return null; - } - }; - } - - static interface AccessTestAction extends PrivilegedExceptionAction<Object> { } - - @After - public void cleanup() throws Exception { - if (null != testUtil) { - testUtil.shutdownMiniCluster(); - testUtil = null; - } - } - - /** This fails only in case of ADE or empty list for any of the users. */ - private void verifyAllowed(AccessTestAction action, UserGroupInformation... users) throws Exception { - for (UserGroupInformation user : users) { - verifyAllowed(user, action); - } - } - - /** This passes only in case of ADE for all users. */ - private void verifyDenied(AccessTestAction action, UserGroupInformation... users) throws Exception { - for (UserGroupInformation user : users) { - verifyDenied(user, action); - } - } - - /** This fails only in case of ADE or empty list for any of the actions. */ - private void verifyAllowed(UserGroupInformation user, AccessTestAction... actions) throws Exception { - for (AccessTestAction action : actions) { - try { - Object obj = user.doAs(action); - if (obj != null && obj instanceof List<?>) { - List<?> results = (List<?>) obj; - if (results != null && results.isEmpty()) { - fail("Empty non null results from action for user '" + user.getShortUserName() + "'"); - } - } - } catch (AccessDeniedException ade) { - fail("Expected action to pass for user '" + user.getShortUserName() + "' but was denied"); - } - } - } - - /** This passes only in case of ADE for all actions. */ - private void verifyDenied(UserGroupInformation user, AccessTestAction... actions) throws Exception { - for (AccessTestAction action : actions) { - try { - user.doAs(action); - fail("Expected exception was not thrown for user '" + user.getShortUserName() + "'"); - } catch (IOException e) { - fail("Expected exception was not thrown for user '" + user.getShortUserName() + "'"); - } catch (UndeclaredThrowableException ute) { - Throwable ex = ute.getUndeclaredThrowable(); - - if (ex instanceof PhoenixIOException) { - if (ex.getCause() instanceof AccessDeniedException) { - // expected result - validateAccessDeniedException((AccessDeniedException) ex.getCause()); - return; - } - } - }catch(RuntimeException ex){ - // This can occur while accessing tabledescriptors from client by the unprivileged user - if (ex.getCause() instanceof AccessDeniedException) { - // expected result - validateAccessDeniedException((AccessDeniedException) ex.getCause()); - return; - } - } - fail("Expected exception was not thrown for user '" + user.getShortUserName() + "'"); - } - } - - private void validateAccessDeniedException(AccessDeniedException ade) { - String msg = ade.getMessage(); - assertTrue("Exception contained unexpected message: '" + msg + "'", - !msg.contains("is not the scanner owner")); - } -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/5003ac30/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/RpcUtil.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/RpcUtil.java b/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/RpcUtil.java deleted file mode 100644 index ac281f1..0000000 --- a/phoenix-core/src/main/java/org/apache/hadoop/hbase/ipc/RpcUtil.java +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.hadoop.hbase.ipc; - -import org.apache.hadoop.hbase.ipc.RpcServer.Call; - -public class RpcUtil { - - public static Call getRpcContext() { - return RpcServer.CurCall.get(); - } - - public static void setRpcContext(Call c){ - RpcServer.CurCall.set(c); - } - -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/5003ac30/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseMetaDataEndpointObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseMetaDataEndpointObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseMetaDataEndpointObserver.java deleted file mode 100644 index 8decc8c..0000000 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/BaseMetaDataEndpointObserver.java +++ /dev/null @@ -1,111 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.phoenix.coprocessor; - -import java.io.IOException; -import java.util.List; -import java.util.Set; - -import org.apache.hadoop.hbase.CoprocessorEnvironment; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.coprocessor.ObserverContext; -import org.apache.phoenix.coprocessor.PhoenixMetaDataCoprocessorHost.PhoenixMetaDataControllerEnvironment; -import org.apache.phoenix.schema.PIndexState; -import org.apache.phoenix.schema.PTable; -import org.apache.phoenix.schema.PTableType; - -public class BaseMetaDataEndpointObserver implements MetaDataEndpointObserver{ - - @Override - public void start(CoprocessorEnvironment env) throws IOException { - - } - - @Override - public void stop(CoprocessorEnvironment env) throws IOException { - - } - - @Override - public void preGetTable( - org.apache.hadoop.hbase.coprocessor.ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, - String tenantId, String tableName, TableName physicalTableName) throws IOException { - - } - - - @Override - public void preCreateTable(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, - String tableName, TableName physicalTableName, TableName parentPhysicalTableName, PTableType tableType, - Set<byte[]> familySet, Set<TableName> indexes) throws IOException { - - } - - @Override - public void preDropTable(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, - String tableName, TableName physicalTableName, TableName parentPhysicalTableName, PTableType tableType, - List<PTable> indexes) throws IOException { - - } - - @Override - public void preAlterTable(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, - String tableName, TableName physicalTableName, TableName parentPhysicalTableName, PTableType type) throws IOException { - - } - - @Override - public void preGetSchema(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String schemaName) - throws IOException { - - } - - @Override - public void preCreateSchema(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String schemaName) - throws IOException { - - } - - @Override - public void preDropSchema(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String schemaName) throws IOException { - - } - - @Override - public void preCreateFunction(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, - String functionName) throws IOException { - - } - - @Override - public void preDropFunction(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, String functionName) - throws IOException {} - - @Override - public void preGetFunctions(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, String functionName) - throws IOException { - - } - - @Override - public void preIndexUpdate(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, - String indexName, TableName physicalTableName, TableName parentPhysicalTableName, PIndexState newState) - throws IOException { - - } -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/5003ac30/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 026a516..43c885a 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 @@ -84,7 +84,6 @@ import static org.apache.phoenix.util.SchemaUtil.getVarCharLength; import static org.apache.phoenix.util.SchemaUtil.getVarChars; import java.io.IOException; -import java.security.PrivilegedExceptionAction; import java.sql.ResultSetMetaData; import java.sql.SQLException; import java.sql.Statement; @@ -92,12 +91,10 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; import java.util.Comparator; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.NavigableMap; -import java.util.Set; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hbase.Cell; @@ -108,7 +105,6 @@ import org.apache.hadoop.hbase.DoNotRetryIOException; import org.apache.hadoop.hbase.HConstants; import org.apache.hadoop.hbase.KeyValue; import org.apache.hadoop.hbase.KeyValue.Type; -import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.Delete; import org.apache.hadoop.hbase.client.Get; import org.apache.hadoop.hbase.client.HTableInterface; @@ -125,12 +121,9 @@ 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; -import org.apache.hadoop.hbase.ipc.RpcServer.Call; -import org.apache.hadoop.hbase.ipc.RpcUtil; import org.apache.hadoop.hbase.regionserver.Region; import org.apache.hadoop.hbase.regionserver.Region.RowLock; import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.Bytes; import org.apache.hadoop.hbase.util.Pair; import org.apache.hadoop.hbase.util.VersionInfo; @@ -459,7 +452,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso private static final int DEFAULT_VALUE_INDEX = FUNCTION_ARG_KV_COLUMNS.indexOf(DEFAULT_VALUE_KV); private static final int MIN_VALUE_INDEX = FUNCTION_ARG_KV_COLUMNS.indexOf(MIN_VALUE_KV); private static final int MAX_VALUE_INDEX = FUNCTION_ARG_KV_COLUMNS.indexOf(MAX_VALUE_KV); - + private static PName newPName(byte[] keyBuffer, int keyOffset, int keyLength) { if (keyLength <= 0) { return null; @@ -470,9 +463,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso private RegionCoprocessorEnvironment env; - private PhoenixMetaDataCoprocessorHost phoenixAccessCoprocessorHost; - private boolean accessCheckEnabled; - /** * Stores a reference to the coprocessor environment provided by the * {@link org.apache.hadoop.hbase.regionserver.RegionCoprocessorHost} from the region where this @@ -490,10 +480,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } else { throw new CoprocessorException("Must be loaded on a table region!"); } - - phoenixAccessCoprocessorHost = new PhoenixMetaDataCoprocessorHost(this.env); - this.accessCheckEnabled = env.getConfiguration().getBoolean(QueryServices.PHOENIX_ACLS_ENABLED, - QueryServicesOptions.DEFAULT_PHOENIX_ACLS_ENABLED); logger.info("Starting Tracing-Metrics Systems"); // Start the phoenix trace collection Tracing.addTraceMetricsSource(); @@ -537,9 +523,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(builder.build()); return; } - getCoprocessorHost().preGetTable(Bytes.toString(tenantId), SchemaUtil.getTableName(schemaName, tableName), - TableName.valueOf(table.getPhysicalName().getBytes())); - builder.setReturnCode(MetaDataProtos.MutationCode.TABLE_ALREADY_EXISTS); long disableIndexTimestamp = table.getIndexDisableTimestamp(); long minNonZerodisableIndexTimestamp = disableIndexTimestamp > 0 ? disableIndexTimestamp : Long.MAX_VALUE; @@ -571,10 +554,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } } - private PhoenixMetaDataCoprocessorHost getCoprocessorHost() { - return phoenixAccessCoprocessorHost; - } - private PTable buildTable(byte[] key, ImmutableBytesPtr cacheKey, Region region, long clientTimeStamp, int clientVersion) throws IOException, SQLException { Scan scan = MetaDataUtil.newTableRowsScan(key, MIN_TABLE_TIMESTAMP, clientTimeStamp); @@ -1338,14 +1317,12 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso * @return null if the physical table row information is not present. * */ - private static Mutation getPhysicalTableRowForView(List<Mutation> tableMetadata, byte[][] parentTenantSchemaTableNames, byte[][] physicalSchemaTableNames) { + private static Mutation getPhysicalTableForView(List<Mutation> tableMetadata, byte[][] parentSchemaTableNames) { int size = tableMetadata.size(); byte[][] rowKeyMetaData = new byte[3][]; MetaDataUtil.getTenantIdAndSchemaAndTableName(tableMetadata, rowKeyMetaData); Mutation physicalTableRow = null; - Mutation parentTableRow = null; boolean physicalTableLinkFound = false; - boolean parentTableLinkFound = false; if (size >= 2) { int i = size - 1; while (i >= 1) { @@ -1355,51 +1332,28 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso if (linkType == LinkType.PHYSICAL_TABLE) { physicalTableRow = m; physicalTableLinkFound = true; - } - if (linkType == LinkType.PARENT_TABLE) { - parentTableRow=m; - parentTableLinkFound = true; + break; } } - if(physicalTableLinkFound && parentTableLinkFound){ - break; - } i--; } } - if (!parentTableLinkFound) { - parentTenantSchemaTableNames[0] = null; - parentTenantSchemaTableNames[1] = null; - parentTenantSchemaTableNames[2] = null; - - } if (!physicalTableLinkFound) { - physicalSchemaTableNames[0] = null; - physicalSchemaTableNames[1] = null; - physicalSchemaTableNames[2] = null; - } - if (physicalTableLinkFound) { - getSchemaTableNames(physicalTableRow,physicalSchemaTableNames); - } - if (parentTableLinkFound) { - getSchemaTableNames(parentTableRow,parentTenantSchemaTableNames); + parentSchemaTableNames[0] = null; + parentSchemaTableNames[1] = null; + return null; } - return physicalTableRow; - } - - private static void getSchemaTableNames(Mutation row, byte[][] schemaTableNames) { - byte[][] rowKeyMetaData = new byte[5][]; - getVarChars(row.getRow(), 5, rowKeyMetaData); - byte[] tenantId = rowKeyMetaData[PhoenixDatabaseMetaData.TENANT_ID_INDEX]; + rowKeyMetaData = new byte[5][]; + getVarChars(physicalTableRow.getRow(), 5, rowKeyMetaData); byte[] colBytes = rowKeyMetaData[PhoenixDatabaseMetaData.COLUMN_NAME_INDEX]; byte[] famBytes = rowKeyMetaData[PhoenixDatabaseMetaData.FAMILY_NAME_INDEX]; if ((colBytes == null || colBytes.length == 0) && (famBytes != null && famBytes.length > 0)) { byte[] sName = SchemaUtil.getSchemaNameFromFullName(famBytes).getBytes(); byte[] tName = SchemaUtil.getTableNameFromFullName(famBytes).getBytes(); - schemaTableNames[0]= tenantId; - schemaTableNames[1] = sName; - schemaTableNames[2] = tName; + parentSchemaTableNames[0] = sName; + parentSchemaTableNames[1] = tName; } + return physicalTableRow; } @Override @@ -1416,76 +1370,25 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso byte[] tenantIdBytes = rowKeyMetaData[PhoenixDatabaseMetaData.TENANT_ID_INDEX]; schemaName = rowKeyMetaData[PhoenixDatabaseMetaData.SCHEMA_NAME_INDEX]; tableName = rowKeyMetaData[PhoenixDatabaseMetaData.TABLE_NAME_INDEX]; - boolean isNamespaceMapped = MetaDataUtil.isNameSpaceMapped(tableMetadata, GenericKeyValueBuilder.INSTANCE, - new ImmutableBytesWritable()); - final IndexType indexType = MetaDataUtil.getIndexType(tableMetadata, GenericKeyValueBuilder.INSTANCE, - new ImmutableBytesWritable()); + byte[] parentSchemaName = null; byte[] parentTableName = null; PTableType tableType = MetaDataUtil.getTableType(tableMetadata, GenericKeyValueBuilder.INSTANCE, new ImmutableBytesWritable()); byte[] parentTableKey = null; Mutation viewPhysicalTableRow = null; - Set<TableName> indexes = new HashSet<TableName>();; - byte[] cPhysicalName = SchemaUtil.getPhysicalHBaseTableName(schemaName, tableName, isNamespaceMapped) - .getBytes(); - byte[] cParentPhysicalName=null; if (tableType == PTableType.VIEW) { - byte[][] parentSchemaTableNames = new byte[3][]; - byte[][] parentPhysicalSchemaTableNames = new byte[3][]; + byte[][] parentSchemaTableNames = new byte[2][]; /* * For a view, we lock the base physical table row. For a mapped view, there is * no link present to the physical table. So the viewPhysicalTableRow is null * in that case. */ - - viewPhysicalTableRow = getPhysicalTableRowForView(tableMetadata, parentSchemaTableNames,parentPhysicalSchemaTableNames); - long clientTimeStamp = MetaDataUtil.getClientTimeStamp(tableMetadata); - if (parentPhysicalSchemaTableNames[2] != null) { - - parentTableKey = SchemaUtil.getTableKey(ByteUtil.EMPTY_BYTE_ARRAY, - parentPhysicalSchemaTableNames[1], parentPhysicalSchemaTableNames[2]); - PTable parentTable = loadTable(env, parentTableKey, new ImmutableBytesPtr(parentTableKey), - clientTimeStamp, clientTimeStamp, clientVersion); - if (parentTable == null) { - builder.setReturnCode(MetaDataProtos.MutationCode.PARENT_TABLE_NOT_FOUND); - builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis()); - done.run(builder.build()); - return; - } - cParentPhysicalName = parentTable.getPhysicalName().getBytes(); - if (parentSchemaTableNames[2] != null - && Bytes.compareTo(parentSchemaTableNames[2], parentPhysicalSchemaTableNames[2]) != 0) { - // if view is created on view - byte[] parentKey = SchemaUtil.getTableKey( - parentSchemaTableNames[0] == null ? ByteUtil.EMPTY_BYTE_ARRAY : parentSchemaTableNames[0], - parentSchemaTableNames[1], parentSchemaTableNames[2]); - parentTable = loadTable(env, parentKey, new ImmutableBytesPtr(parentKey), - clientTimeStamp, clientTimeStamp, clientVersion); - if (parentTable == null) { - // it could be a global view - parentKey = SchemaUtil.getTableKey(ByteUtil.EMPTY_BYTE_ARRAY, - parentSchemaTableNames[1], parentSchemaTableNames[2]); - parentTable = loadTable(env, parentKey, new ImmutableBytesPtr(parentKey), - clientTimeStamp, clientTimeStamp, clientVersion); - } - } - if (parentTable == null) { - builder.setReturnCode(MetaDataProtos.MutationCode.PARENT_TABLE_NOT_FOUND); - builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis()); - done.run(builder.build()); - return; - } - for (PTable index : parentTable.getIndexes()) { - indexes.add(TableName.valueOf(index.getPhysicalName().getBytes())); - } - - } else { - // Mapped View - cParentPhysicalName = SchemaUtil.getTableNameAsBytes(schemaName, tableName); + viewPhysicalTableRow = getPhysicalTableForView(tableMetadata, parentSchemaTableNames); + parentSchemaName = parentSchemaTableNames[0]; + parentTableName = parentSchemaTableNames[1]; + if (parentTableName != null) { + parentTableKey = SchemaUtil.getTableKey(ByteUtil.EMPTY_BYTE_ARRAY, parentSchemaName, parentTableName); } - parentSchemaName = parentPhysicalSchemaTableNames[1]; - parentTableName = parentPhysicalSchemaTableNames[2]; - } else if (tableType == PTableType.INDEX) { parentSchemaName = schemaName; /* @@ -1495,27 +1398,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso */ parentTableName = MetaDataUtil.getParentTableName(tableMetadata); parentTableKey = SchemaUtil.getTableKey(tenantIdBytes, parentSchemaName, parentTableName); - long clientTimeStamp = MetaDataUtil.getClientTimeStamp(tableMetadata); - PTable parentTable = loadTable(env, parentTableKey, new ImmutableBytesPtr(parentTableKey), - clientTimeStamp, clientTimeStamp, clientVersion); - if (IndexType.LOCAL == indexType) { - cPhysicalName = parentTable.getPhysicalName().getBytes(); - cParentPhysicalName=parentTable.getPhysicalName().getBytes(); - } else if (parentTable.getType() == PTableType.VIEW) { - cPhysicalName = MetaDataUtil.getViewIndexPhysicalName(parentTable.getPhysicalName().getBytes()); - cParentPhysicalName = parentTable.getPhysicalName().getBytes(); - }else{ - cParentPhysicalName = SchemaUtil - .getPhysicalHBaseTableName(parentSchemaName, parentTableName, isNamespaceMapped).getBytes(); - } } - - getCoprocessorHost().preCreateTable(Bytes.toString(tenantIdBytes), - SchemaUtil.getTableName(schemaName, tableName), - (tableType == PTableType.VIEW) ? null : TableName.valueOf(cPhysicalName), - cParentPhysicalName == null ? null : TableName.valueOf(cParentPhysicalName), tableType, - /* TODO: During inital create we may not need the family map */ - Collections.<byte[]> emptySet(), indexes); Region region = env.getRegion(); List<RowLock> locks = Lists.newArrayList(); @@ -1730,7 +1613,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso // primary and then index table locks are held, in that order). For now, we just don't support // indexing on the system table. This is an issue because of the way we manage batch mutation // in the Indexer. - mutateRowsWithLocks(region, tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); + region.mutateRowsWithLocks(tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); // Invalidate the cache - the next getTable call will add it // TODO: consider loading the table that was just created here, patching up the parent table, and updating the cache @@ -1749,7 +1632,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(builder.build()); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { logger.error("createTable failed", t); @@ -1765,6 +1648,15 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso QueryServicesOptions.DEFAULT_MAX_INDEXES_PER_TABLE); } + private static RowLock acquireLock(Region region, byte[] key, List<RowLock> locks) + throws IOException { + RowLock rowLock = region.getRowLock(key, true); + if (rowLock == null) { + throw new IOException("Failed to acquire lock on " + Bytes.toStringBinary(key)); + } + locks.add(rowLock); + return rowLock; + } private static final byte[] CHILD_TABLE_BYTES = new byte[] {PTable.LinkType.CHILD_TABLE.getSerializedValue()}; @@ -1954,23 +1846,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso parentTableName == null ? lockKey : SchemaUtil.getTableKey(tenantIdBytes, schemaName, tableName); - - PTableType ptableType=PTableType.fromSerializedValue(tableType); - long clientTimeStamp = MetaDataUtil.getClientTimeStamp(tableMetadata); - byte[] cKey = SchemaUtil.getTableKey(tenantIdBytes, schemaName, tableName); - PTable loadedTable = loadTable(env, cKey, new ImmutableBytesPtr(cKey), clientTimeStamp, clientTimeStamp, - request.getClientVersion()); - if (loadedTable == null) { - builder.setReturnCode(MetaDataProtos.MutationCode.TABLE_NOT_FOUND); - builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis()); - done.run(builder.build()); - return; - } - getCoprocessorHost().preDropTable(Bytes.toString(tenantIdBytes), - SchemaUtil.getTableName(schemaName, tableName), - TableName.valueOf(loadedTable.getPhysicalName().getBytes()), - getParentPhysicalTableName(loadedTable), ptableType,loadedTable.getIndexes()); - Region region = env.getRegion(); MetaDataMutationResult result = checkTableKeyInRegion(key, region); if (result != null) { @@ -1995,7 +1870,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } Cache<ImmutableBytesPtr,PMetaDataEntity> metaDataCache = GlobalCache.getInstance(this.env).getMetaDataCache(); // Commit the list of deletion. - mutateRowsWithLocks(region, tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, + region.mutateRowsWithLocks(tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); long currentTime = MetaDataUtil.getClientTimeStamp(tableMetadata); for (ImmutableBytesPtr ckey : invalidateList) { @@ -2008,7 +1883,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(MetaDataMutationResult.toProto(result)); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { logger.error("dropTable failed", t); @@ -2016,24 +1891,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso ServerUtil.createIOException(SchemaUtil.getTableName(schemaName, tableName), t)); } } - - protected void releaseRowLocks(Region region, List<RowLock> locks) { - if (locks != null) { - region.releaseRowLocks(locks); - } - } - - private RowLock acquireLock(Region region, byte[] lockKey, List<RowLock> locks) throws IOException { - //LockManager.RowLock rowLock = lockManager.lockRow(lockKey, rowLockWaitDuration); - RowLock rowLock = region.getRowLock(lockKey, false); - if (rowLock == null) { - throw new IOException("Failed to acquire lock on " + Bytes.toStringBinary(lockKey)); - } - if (locks != null) { - locks.add(rowLock); - } - return rowLock; - } private MetaDataMutationResult doDropTable(byte[] key, byte[] tenantId, byte[] schemaName, byte[] tableName, byte[] parentTableName, PTableType tableType, List<Mutation> rowsToDelete, @@ -2236,15 +2093,18 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso EnvironmentEdgeManager.currentTimeMillis(), null); } if (table.getTimeStamp() >= clientTimeStamp) { - logger.info("Found newer table as of " + table.getTimeStamp() + " versus client timestamp of " - + clientTimeStamp); + logger.info("Found newer table as of " + table.getTimeStamp() + " versus client timestamp of " + clientTimeStamp); return new MetaDataMutationResult(MutationCode.NEWER_TABLE_FOUND, EnvironmentEdgeManager.currentTimeMillis(), table); - } else if (isTableDeleted(table)) { return new MetaDataMutationResult(MutationCode.TABLE_NOT_FOUND, - EnvironmentEdgeManager.currentTimeMillis(), null); } - long expectedSeqNum = MetaDataUtil.getSequenceNumber(tableMetadata) - 1; // lookup TABLE_SEQ_NUM in - // tableMetaData + } else if (isTableDeleted(table)) { + return new MetaDataMutationResult(MutationCode.TABLE_NOT_FOUND, + EnvironmentEdgeManager.currentTimeMillis(), null); + } + long expectedSeqNum = MetaDataUtil.getSequenceNumber(tableMetadata) - 1; // lookup + // TABLE_SEQ_NUM + // in + // tableMetaData if (logger.isDebugEnabled()) { logger.debug("For table " + Bytes.toStringBinary(key) + " expecting seqNum " + expectedSeqNum + " and found seqNum " + table.getSequenceNumber() @@ -2279,7 +2139,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso if (result != null && result.getMutationCode()!=MutationCode.TABLE_ALREADY_EXISTS) { return result; } - mutateRowsWithLocks(region, tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); + region.mutateRowsWithLocks(tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); // Invalidate from cache for (ImmutableBytesPtr invalidateKey : invalidateList) { metaDataCache.invalidate(invalidateKey); @@ -2295,7 +2155,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso return new MetaDataMutationResult(MutationCode.TABLE_ALREADY_EXISTS, currentTime, table); } } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { ServerUtil.throwIOException(SchemaUtil.getTableName(schemaName, tableName), t); @@ -3111,11 +2971,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso PTableType type = table.getType(); byte[] tableHeaderRowKey = SchemaUtil.getTableKey(tenantId, schemaName, tableName); - byte[] cPhysicalTableName=table.getPhysicalName().getBytes(); - getCoprocessorHost().preAlterTable(Bytes.toString(tenantId), - SchemaUtil.getTableName(schemaName, tableName), TableName.valueOf(cPhysicalTableName), - getParentPhysicalTableName(table),type); - // Size for worst case - all new columns are PK column List<Mutation> mutationsForAddingColumnsToViews = Lists.newArrayListWithExpectedSize(tableMetaData.size() * ( 1 + table.getIndexes().size())); if (type == PTableType.TABLE || type == PTableType.SYSTEM) { @@ -3269,7 +3124,10 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso boolean blockWriteRebuildIndex = env.getConfiguration().getBoolean(QueryServices.INDEX_FAILURE_BLOCK_WRITE, QueryServicesOptions.DEFAULT_INDEX_FAILURE_BLOCK_WRITE); if (!wasLocked) { - rowLock = acquireLock(region, key, null); + rowLock = region.getRowLock(key, true); + if (rowLock == null) { + throw new IOException("Failed to acquire lock on " + Bytes.toStringBinary(key)); + } } try { PTable table = (PTable)metaDataCache.getIfPresent(cacheKey); @@ -3326,10 +3184,16 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso * Lock directly on key, though it may be an index table. This will just prevent a table * from getting rebuilt too often. */ - List<RowLock> rowLocks = new ArrayList<RowLock>(keys.size()); + List<RowLock> rowLocks = new ArrayList<Region.RowLock>(keys.size());; try { + rowLocks = new ArrayList<Region.RowLock>(keys.size()); for (int i = 0; i < keys.size(); i++) { - acquireLock(region, keys.get(i), rowLocks); + Region.RowLock rowLock = region.getRowLock(keys.get(i), true); + if (rowLock == null) { + throw new IOException("Failed to acquire lock on " + + Bytes.toStringBinary(keys.get(i))); + } + rowLocks.add(rowLock); } List<PFunction> functionsAvailable = new ArrayList<PFunction>(keys.size()); @@ -3359,7 +3223,10 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso if(functionsAvailable.size() == numFunctions) return functionsAvailable; return null; } finally { - releaseRowLocks(region,rowLocks); + for (Region.RowLock lock : rowLocks) { + lock.release(); + } + rowLocks.clear(); } } @@ -3381,11 +3248,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso byte[] schemaName = rowKeyMetaData[SCHEMA_NAME_INDEX]; byte[] tableName = rowKeyMetaData[TABLE_NAME_INDEX]; boolean deletePKColumn = false; - getCoprocessorHost().preAlterTable(Bytes.toString(tenantId), - SchemaUtil.getTableName(schemaName, tableName), - TableName.valueOf(table.getPhysicalName().getBytes()), - getParentPhysicalTableName(table),table.getType()); - List<Mutation> additionalTableMetaData = Lists.newArrayList(); PTableType type = table.getType(); @@ -3618,7 +3480,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } PIndexState newState = PIndexState.fromSerializedValue(newKV.getValueArray()[newKV.getValueOffset()]); - RowLock rowLock = acquireLock(region, key, null); + RowLock rowLock = region.getRowLock(key, true); if (rowLock == null) { throw new IOException("Failed to acquire lock on " + Bytes.toStringBinary(key)); } @@ -3640,22 +3502,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso Cell currentDisableTimeStamp = currentResult.getColumnLatestCell(TABLE_FAMILY_BYTES, INDEX_DISABLE_TIMESTAMP_BYTES); boolean rowKeyOrderOptimizable = currentResult.getColumnLatestCell(TABLE_FAMILY_BYTES, ROW_KEY_ORDER_OPTIMIZABLE_BYTES) != null; - //check permission on data table - long clientTimeStamp = MetaDataUtil.getClientTimeStamp(tableMetadata); - PTable loadedTable = loadTable(env, key, new ImmutableBytesPtr(key), clientTimeStamp, clientTimeStamp, - request.getClientVersion()); - if (loadedTable == null) { - builder.setReturnCode(MetaDataProtos.MutationCode.TABLE_NOT_FOUND); - builder.setMutationTime(EnvironmentEdgeManager.currentTimeMillis()); - done.run(builder.build()); - return; - } - getCoprocessorHost().preIndexUpdate(Bytes.toString(tenantId), - SchemaUtil.getTableName(schemaName, tableName), - TableName.valueOf(loadedTable.getPhysicalName().getBytes()), - getParentPhysicalTableName(loadedTable), - newState); - PIndexState currentState = PIndexState.fromSerializedValue(currentStateKV.getValueArray()[currentStateKV .getValueOffset()]); @@ -3765,7 +3611,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso if (setRowKeyOrderOptimizableCell) { UpgradeUtil.addRowKeyOrderOptimizableCell(tableMetadata, key, timeStamp); } - mutateRowsWithLocks(region, tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, + region.mutateRowsWithLocks(tableMetadata, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); // Invalidate from cache Cache<ImmutableBytesPtr,PMetaDataEntity> metaDataCache = GlobalCache.getInstance(this.env).getMetaDataCache(); @@ -3926,7 +3772,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso long clientTimeStamp = request.getClientTimestamp(); List<RowLock> locks = Lists.newArrayList(); try { - getCoprocessorHost().preGetSchema(schemaName); acquireLock(region, lockKey, locks); // Get as of latest timestamp so we can detect if we have a // newer schema that already @@ -3957,7 +3802,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(builder.build()); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } @@ -4060,7 +3905,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso } // Don't store function info for temporary functions. if(!temporaryFunction) { - mutateRowsWithLocks(region, functionMetaData, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); + region.mutateRowsWithLocks(functionMetaData, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); } // Invalidate the cache - the next getFunction call will add it @@ -4074,7 +3919,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(builder.build()); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { logger.error("createFunction failed", t); @@ -4113,7 +3958,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(MetaDataMutationResult.toProto(result)); return; } - mutateRowsWithLocks(region, functionMetaData, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); + region.mutateRowsWithLocks(functionMetaData, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); Cache<ImmutableBytesPtr,PMetaDataEntity> metaDataCache = GlobalCache.getInstance(this.env).getMetaDataCache(); long currentTime = MetaDataUtil.getClientTimeStamp(functionMetaData); @@ -4126,7 +3971,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(MetaDataMutationResult.toProto(result)); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { logger.error("dropFunction failed", t); @@ -4223,7 +4068,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso return; } } - mutateRowsWithLocks(region, schemaMutations, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, + region.mutateRowsWithLocks(schemaMutations, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); // Invalidate the cache - the next getSchema call will add it @@ -4241,7 +4086,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(builder.build()); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { logger.error("Creating the schema" + schemaName + "failed", t); @@ -4255,7 +4100,6 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso try { List<Mutation> schemaMetaData = ProtobufUtil.getMutations(request); schemaName = request.getSchemaName(); - getCoprocessorHost().preDropSchema(schemaName); byte[] lockKey = SchemaUtil.getSchemaKey(schemaName); Region region = env.getRegion(); MetaDataMutationResult result = checkSchemaKeyInRegion(lockKey, region); @@ -4273,7 +4117,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(MetaDataMutationResult.toProto(result)); return; } - mutateRowsWithLocks(region, schemaMetaData, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, + region.mutateRowsWithLocks(schemaMetaData, Collections.<byte[]> emptySet(), HConstants.NO_NONCE, HConstants.NO_NONCE); Cache<ImmutableBytesPtr, PMetaDataEntity> metaDataCache = GlobalCache.getInstance(this.env) .getMetaDataCache(); @@ -4285,7 +4129,7 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso done.run(MetaDataMutationResult.toProto(result)); return; } finally { - releaseRowLocks(region,locks); + region.releaseRowLocks(locks); } } catch (Throwable t) { logger.error("drop schema failed:", t); @@ -4331,48 +4175,4 @@ public class MetaDataEndpointImpl extends MetaDataProtocol implements Coprocesso null); } - - private void mutateRowsWithLocks(final Region region, final List<Mutation> mutations, final Set<byte[]> rowsToLock, - final long nonceGroup, final long nonce) throws IOException { - // we need to mutate SYSTEM.CATALOG with HBase/login user if access is enabled. - if (this.accessCheckEnabled) { - User.runAsLoginUser(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - final Call rpcContext = RpcUtil.getRpcContext(); - // Setting RPC context as null so that user can be resetted - try { - RpcUtil.setRpcContext(null); - region.mutateRowsWithLocks(mutations, rowsToLock, nonceGroup, nonce); - } catch (Throwable e) { - throw new IOException(e); - } finally { - // Setting RPC context back to original context of the RPC - RpcUtil.setRpcContext(rpcContext); - } - return null; - } - }); - } else { - region.mutateRowsWithLocks(mutations, rowsToLock, nonceGroup, nonce); - } - } - - private TableName getParentPhysicalTableName(PTable table) { - return table - .getType() == PTableType.VIEW - ? TableName.valueOf(table.getPhysicalName().getBytes()) - : table.getType() == PTableType.INDEX - ? TableName - .valueOf(SchemaUtil - .getPhysicalHBaseTableName(table.getParentSchemaName(), - table.getParentTableName(), table.isNamespaceMapped()) - .getBytes()) - : TableName - .valueOf( - SchemaUtil - .getPhysicalHBaseTableName(table.getSchemaName(), - table.getTableName(), table.isNamespaceMapped()) - .getBytes()); - } } http://git-wip-us.apache.org/repos/asf/phoenix/blob/5003ac30/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointObserver.java deleted file mode 100644 index 86b8bf1..0000000 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataEndpointObserver.java +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.apache.phoenix.coprocessor; - -import java.io.IOException; -import java.util.List; -import java.util.Set; - -import org.apache.hadoop.hbase.Coprocessor; -import org.apache.hadoop.hbase.TableName; -import org.apache.hadoop.hbase.coprocessor.ObserverContext; -import org.apache.phoenix.coprocessor.PhoenixMetaDataCoprocessorHost.PhoenixMetaDataControllerEnvironment; -import org.apache.phoenix.schema.PIndexState; -import org.apache.phoenix.schema.PTable; -import org.apache.phoenix.schema.PTableType; - -public interface MetaDataEndpointObserver extends Coprocessor { - - void preGetTable( ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId,String tableName, - TableName physicalTableName) throws IOException; - - void preCreateTable(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String tenantId, - String tableName, TableName physicalTableName, final TableName parentPhysicalTableName, - PTableType tableType, final Set<byte[]> familySet, Set<TableName> indexes) throws IOException; - - void preDropTable(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String tenantId, - final String tableName,TableName physicalTableName, TableName parentPhysicalTableName, PTableType tableType, List<PTable> indexes) throws IOException; - - void preAlterTable(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String tenantId,final String tableName, - final TableName physicalTableName,final TableName parentPhysicalTableName, PTableType type) throws IOException; - - void preGetSchema(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String schemaName) - throws IOException; - - void preCreateSchema(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String schemaName) - throws IOException; - - void preDropSchema(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String schemaName) - throws IOException; - - void preCreateFunction(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String tenantId, - final String functionName) throws IOException; - - void preDropFunction(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String tenantId, - final String functionName) throws IOException; - - void preGetFunctions(final ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, final String tenantId, - final String functionName) throws IOException; - - void preIndexUpdate(ObserverContext<PhoenixMetaDataControllerEnvironment> ctx, String tenantId, - String indexName, TableName physicalTableName, TableName parentPhysicalTableName, PIndexState newState) throws IOException; - -} http://git-wip-us.apache.org/repos/asf/phoenix/blob/5003ac30/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataRegionObserver.java ---------------------------------------------------------------------- diff --git a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataRegionObserver.java b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataRegionObserver.java index af06235..c816549 100644 --- a/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataRegionObserver.java +++ b/phoenix-core/src/main/java/org/apache/phoenix/coprocessor/MetaDataRegionObserver.java @@ -20,7 +20,6 @@ package org.apache.phoenix.coprocessor; import static org.apache.phoenix.schema.types.PDataType.TRUE_BYTES; import java.io.IOException; -import java.security.PrivilegedExceptionAction; import java.sql.SQLException; import java.util.ArrayList; import java.util.Collections; @@ -51,7 +50,6 @@ import org.apache.hadoop.hbase.filter.CompareFilter; import org.apache.hadoop.hbase.filter.SingleColumnValueFilter; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.regionserver.RegionScanner; -import org.apache.hadoop.hbase.security.User; import org.apache.hadoop.hbase.util.Pair; import org.apache.log4j.Level; import org.apache.log4j.Logger; @@ -165,18 +163,9 @@ public class MetaDataRegionObserver extends BaseRegionObserver { SchemaUtil.getPhysicalName(PhoenixDatabaseMetaData.SYSTEM_CATALOG_NAME_BYTES, props)); statsTable = env.getTable( SchemaUtil.getPhysicalName(PhoenixDatabaseMetaData.SYSTEM_STATS_NAME_BYTES, props)); - final HTableInterface mTable=metaTable; - final HTableInterface sTable=statsTable; - User.runAsLoginUser(new PrivilegedExceptionAction<Void>() { - @Override - public Void run() throws Exception { - if (UpgradeUtil.truncateStats(mTable, sTable)) { - LOG.info("Stats are successfully truncated for upgrade 4.7!!"); - } - return null; - } - }); - + if (UpgradeUtil.truncateStats(metaTable, statsTable)) { + LOG.info("Stats are successfully truncated for upgrade 4.7!!"); + } } catch (Exception exception) { LOG.warn("Exception while truncate stats..," + " please check and delete stats manually inorder to get proper result with old client!!");