You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@phoenix.apache.org by ch...@apache.org on 2019/11/15 06:06:59 UTC

[phoenix] branch 4.x-HBase-1.3 updated: PHOENIX-5545: DropChildViews Task fails for a base table when its child view has an index

This is an automated email from the ASF dual-hosted git repository.

chinmayskulkarni pushed a commit to branch 4.x-HBase-1.3
in repository https://gitbox.apache.org/repos/asf/phoenix.git


The following commit(s) were added to refs/heads/4.x-HBase-1.3 by this push:
     new 4947b57  PHOENIX-5545: DropChildViews Task fails for a base table when its child view has an index
4947b57 is described below

commit 4947b57e749c518ff7f0c8329f5f3b48cba01431
Author: Chinmay Kulkarni <ch...@gmail.com>
AuthorDate: Wed Nov 13 01:12:29 2019 -0800

    PHOENIX-5545: DropChildViews Task fails for a base table when its child view has an index
---
 .../org/apache/phoenix/end2end/ViewMetadataIT.java | 52 +++++++++++++++++-----
 .../phoenix/query/ConnectionQueryServicesImpl.java | 12 ++++-
 .../org/apache/phoenix/schema/MetaDataClient.java  |  3 +-
 3 files changed, 55 insertions(+), 12 deletions(-)

diff --git a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewMetadataIT.java b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewMetadataIT.java
index 8c0eafb..b4ed6bf 100644
--- a/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewMetadataIT.java
+++ b/phoenix-core/src/it/java/org/apache/phoenix/end2end/ViewMetadataIT.java
@@ -26,6 +26,7 @@ import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_NAME;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TABLE_SCHEM;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TASK_TYPE;
 import static org.apache.phoenix.jdbc.PhoenixDatabaseMetaData.TENANT_ID;
+import static org.apache.phoenix.query.QueryServices.DROP_METADATA_ATTRIB;
 import static org.apache.phoenix.schema.PTable.TaskType.DROP_CHILD_VIEWS;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
@@ -41,7 +42,6 @@ import java.sql.SQLException;
 import java.sql.Statement;
 import java.sql.Timestamp;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Properties;
@@ -85,14 +85,19 @@ public class ViewMetadataIT extends SplitSystemCatalogIT {
     @BeforeClass
     public static void doSetup() throws Exception {
         NUM_SLAVES_BASE = 6;
-        Map<String, String> props = Collections.emptyMap();
+        Map<String, String> clientProps = Maps.newHashMapWithExpectedSize(1);
+        clientProps.put(DROP_METADATA_ATTRIB, Boolean.TRUE.toString());
         boolean splitSystemCatalog = (driver == null);
         Map<String, String> serverProps = Maps.newHashMapWithExpectedSize(1);
         serverProps.put(QueryServices.PHOENIX_ACLS_ENABLED, "true");
         serverProps.put(PhoenixMetaDataCoprocessorHost.PHOENIX_META_DATA_COPROCESSOR_CONF_KEY,
                 TestMetaDataRegionObserver.class.getName());
         serverProps.put("hbase.coprocessor.abortonerror", "false");
-        setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()), new ReadOnlyProps(props.entrySet().iterator()));
+        // Set this in server properties too since we get a connection on the server and pass in
+        // server-side properties when running the drop child views tasks
+        serverProps.put(DROP_METADATA_ATTRIB, Boolean.TRUE.toString());
+        setUpTestDriver(new ReadOnlyProps(serverProps.entrySet().iterator()),
+                new ReadOnlyProps(clientProps.entrySet().iterator()));
         // Split SYSTEM.CATALOG once after the mini-cluster is started
         if (splitSystemCatalog) {
             splitSystemCatalog();
@@ -186,7 +191,8 @@ public class ViewMetadataIT extends SplitSystemCatalogIT {
 
             // test for a view that is in non-default schema
             {
-                HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(NS, TBL));
+                TableName tableName = TableName.valueOf(NS, TBL);
+                HTableDescriptor desc = new HTableDescriptor(tableName);
                 desc.addFamily(new HColumnDescriptor(CF));
                 admin.createTable(desc);
 
@@ -199,11 +205,14 @@ public class ViewMetadataIT extends SplitSystemCatalogIT {
                         .contains(NS + ":" + TBL));
 
                 conn.createStatement().execute("DROP VIEW " + view1);
+                admin.disableTable(tableName);
+                admin.deleteTable(tableName);
             }
 
             // test for a view whose name contains a dot (e.g. "AAA.BBB") in default schema (for backward compatibility)
             {
-                HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(NS + "." + TBL));
+                TableName tableName = TableName.valueOf(NS + "." + TBL);
+                HTableDescriptor desc = new HTableDescriptor(tableName);
                 desc.addFamily(new HColumnDescriptor(CF));
                 admin.createTable(desc);
 
@@ -217,11 +226,14 @@ public class ViewMetadataIT extends SplitSystemCatalogIT {
                         .contains(NS + "." + TBL));
 
                 conn.createStatement().execute("DROP VIEW " + view2);
+                admin.disableTable(tableName);
+                admin.deleteTable(tableName);
             }
 
             // test for a view whose name contains a dot (e.g. "AAA.BBB") in non-default schema
             {
-                HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(NS, NS + "." + TBL));
+                TableName tableName = TableName.valueOf(NS, NS + "." + TBL);
+                HTableDescriptor desc = new HTableDescriptor(tableName);
                 desc.addFamily(new HColumnDescriptor(CF));
                 admin.createTable(desc);
 
@@ -234,6 +246,8 @@ public class ViewMetadataIT extends SplitSystemCatalogIT {
                         .contains(NS + ":" + NS + "." + TBL));
 
                 conn.createStatement().execute("DROP VIEW " + view3);
+                admin.disableTable(tableName);
+                admin.deleteTable(tableName);
             }
             conn.createStatement().execute("DROP SCHEMA " + NS);
         }
@@ -359,26 +373,44 @@ public class ViewMetadataIT extends SplitSystemCatalogIT {
         String fullViewName = SchemaUtil.getTableName(SCHEMA2, generateUniqueName());
 
         try (Connection conn = DriverManager.getConnection(getUrl())) {
-            createTableViewAndDropCascade(conn, fullTableName, fullViewName);
+            createTableViewAndDropCascade(conn, fullTableName, fullViewName, false);
             validateViewDoesNotExist(conn, fullViewName);
             validateSystemTaskContainsCompletedDropChildViewsTasks(conn, SCHEMA1, tableName, 1);
 
             // Repeat this and check that the view still doesn't exist
-            createTableViewAndDropCascade(conn, fullTableName, fullViewName);
+            createTableViewAndDropCascade(conn, fullTableName, fullViewName, false);
             validateViewDoesNotExist(conn, fullViewName);
             validateSystemTaskContainsCompletedDropChildViewsTasks(conn, SCHEMA1, tableName, 2);
         }
     }
 
+    // We set DROP_METADATA_ATTRIB to true and check that this does not fail dropping child views
+    // that have an index, though their underlying physical table was already dropped.
+    // See PHOENIX-5545.
+    @Test
+    public void testDropTableCascadeWithChildViewWithIndex() throws SQLException {
+        String tableName = generateUniqueName();
+        String fullTableName = SchemaUtil.getTableName(SCHEMA1, tableName);
+        String fullViewName = SchemaUtil.getTableName(SCHEMA2, generateUniqueName());
+        try (Connection conn = DriverManager.getConnection(getUrl())) {
+            createTableViewAndDropCascade(conn, fullTableName, fullViewName, true);
+            validateViewDoesNotExist(conn, fullViewName);
+            validateSystemTaskContainsCompletedDropChildViewsTasks(conn, SCHEMA1, tableName, 1);
+        }
+    }
+
     private void createTableViewAndDropCascade(Connection conn, String fullTableName,
-            String fullViewName) throws SQLException {
+            String fullViewName, boolean createViewIndex) throws SQLException {
         String tableDdl = "CREATE TABLE " + fullTableName +
                 "  (k INTEGER NOT NULL PRIMARY KEY, v1 DATE)";
         conn.createStatement().execute(tableDdl);
         String ddl = "CREATE VIEW " + fullViewName +
                 " (v2 VARCHAR) AS SELECT * FROM " + fullTableName + " WHERE k > 5";
         conn.createStatement().execute(ddl);
-
+        if (createViewIndex) {
+            conn.createStatement().execute("CREATE INDEX " + "INDEX_" + generateUniqueName() +
+                    " ON " + fullViewName + "(v2)");
+        }
         // drop table cascade should succeed
         conn.createStatement().execute("DROP TABLE " + fullTableName + " CASCADE");
         runDropChildViewsTask();
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
index 4c1e61c..a66d2eb 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/query/ConnectionQueryServicesImpl.java
@@ -1932,7 +1932,17 @@ public class ConnectionQueryServicesImpl extends DelegateQueryServices implement
             parentPhysicalTableName = parentTable.getPhysicalName().getBytes();
         }
         if (parentPhysicalTableName != null) {
-            flushTable(parentPhysicalTableName);
+            try {
+                flushTable(parentPhysicalTableName);
+            } catch (PhoenixIOException ex) {
+                if (ex.getCause() instanceof org.apache.hadoop.hbase.TableNotFoundException) {
+                    LOGGER.info("Flushing physical parent table " + Bytes.toString(parentPhysicalTableName) + " of " + table.getName()
+                            .getString() + " failed with : " + ex + " with cause: " + ex.getCause()
+                            + " since the table has already been dropped");
+                } else {
+                    throw ex;
+                }
+            }
         }
     }
 
diff --git a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
index 8123b7a..b8c194d 100644
--- a/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
+++ b/phoenix-core/src/main/java/org/apache/phoenix/schema/MetaDataClient.java
@@ -3177,7 +3177,8 @@ public class MetaDataClient {
                 connection.removeTable(tenantId, SchemaUtil.getTableName(schemaName, tableName), parentTableName, result.getMutationTime());
 
                 if (table != null) {
-                    boolean dropMetaData = false;
+                    boolean dropMetaData = connection.getQueryServices().getProps()
+                            .getBoolean(DROP_METADATA_ATTRIB, DEFAULT_DROP_METADATA);
                     long ts = (scn == null ? result.getMutationTime() : scn);
                     List<TableRef> tableRefs = Lists.newArrayListWithExpectedSize(2 + table.getIndexes().size());
                     connection.setAutoCommit(true);