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

granthenke pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/kudu.git


The following commit(s) were added to refs/heads/master by this push:
     new 0df93bc  [hms] Allow the table type to change but not the 
synchronization of a table
0df93bc is described below

commit 0df93bcd8923029eb479e70d7253237c81309dd2
Author: Grant Henke <[email protected]>
AuthorDate: Fri May 14 10:44:00 2021 -0500

    [hms] Allow the table type to change but not the synchronization of a table
    
    When upgrading some verions of the Hive Metastore it migrates Kudu tables
    from managed tables to external tables with the purge property set. Both
    of these states are considered “synchronized” tables by the HMS sync
    and therefore this change sholuld be allowed as it won’t created orphaned
    tables.
    
    Change-Id: I7c029da1dbfef9812b0fe7389a768772605acc45
    Reviewed-on: http://gerrit.cloudera.org:8080/17445
    Reviewed-by: Attila Bukor <[email protected]>
    Tested-by: Grant Henke <[email protected]>
---
 .../kudu/hive/metastore/KuduMetastorePlugin.java   |  8 ++--
 .../hive/metastore/TestKuduMetastorePlugin.java    | 48 ++++++++++++++--------
 2 files changed, 34 insertions(+), 22 deletions(-)

diff --git 
a/java/kudu-hive/src/main/java/org/apache/kudu/hive/metastore/KuduMetastorePlugin.java
 
b/java/kudu-hive/src/main/java/org/apache/kudu/hive/metastore/KuduMetastorePlugin.java
index d304146..878a362 100644
--- 
a/java/kudu-hive/src/main/java/org/apache/kudu/hive/metastore/KuduMetastorePlugin.java
+++ 
b/java/kudu-hive/src/main/java/org/apache/kudu/hive/metastore/KuduMetastorePlugin.java
@@ -232,17 +232,15 @@ public class KuduMetastorePlugin extends 
MetaStoreEventListener {
     }
 
     // Prevent altering the table type (managed/external) of Kudu tables (or 
via
-    // altering table properties 'EXTERNAL' or `external.table.purge`).
-    // This can cause orphaned tables.
+    // altering table properties 'EXTERNAL' or `external.table.purge`) in a way
+    // that changes if a table is synchronized. This can cause orphaned tables.
     // Note: This doesn't prevent altering the table type for legacy tables
     // because they should continue to work as they always have primarily for
     // migration purposes.
     // The Kudu master is allowed to make these changes if necessary as it is 
a trusted user.
     if (isKuduTable(oldTable) &&
         !isKuduMasterAction(tableEvent) &&
-        (!Objects.equals(oldTable.getTableType(), newTable.getTableType()) ||
-            isExternalTable(oldTable) != isExternalTable(newTable) ||
-            isPurgeTable(oldTable) != isPurgeTable(newTable))) {
+        isSynchronizedTable(oldTable) != isSynchronizedTable(newTable) ) {
       throw new MetaException("Kudu table type may not be altered");
     }
 
diff --git 
a/java/kudu-hive/src/test/java/org/apache/kudu/hive/metastore/TestKuduMetastorePlugin.java
 
b/java/kudu-hive/src/test/java/org/apache/kudu/hive/metastore/TestKuduMetastorePlugin.java
index a2b5b70..f35b025 100644
--- 
a/java/kudu-hive/src/test/java/org/apache/kudu/hive/metastore/TestKuduMetastorePlugin.java
+++ 
b/java/kudu-hive/src/test/java/org/apache/kudu/hive/metastore/TestKuduMetastorePlugin.java
@@ -297,22 +297,6 @@ public class TestKuduMetastorePlugin {
                 "Kudu table entry must contain a Kudu storage handler 
property"));
       }
 
-      // Try to alter the Kudu table to a different type.
-      try {
-        Table alteredTable = table.deepCopy();
-        alteredTable.setTableType(TableType.MANAGED_TABLE.toString());
-        // Also change the location to avoid MetastoreDefaultTransformer 
validation
-        // that exists in some Hive versions.
-        alteredTable.getSd().setLocation(String.format("%s/%s/%s",
-            clientConf.get(HiveConf.ConfVars.METASTOREWAREHOUSE.varname),
-            table.getDbName(), table.getTableName()));
-        client.alter_table(table.getDbName(), table.getTableName(), 
alteredTable);
-        fail();
-      } catch (TException e) {
-        assertTrue(e.getMessage(),
-                   e.getMessage().contains("Kudu table type may not be 
altered"));
-      }
-
       // Alter the Kudu table to a different type by setting the external 
property fails.
       try {
         Table alteredTable = table.deepCopy();
@@ -354,7 +338,7 @@ public class TestKuduMetastorePlugin {
         alteredTable.getSd().setLocation(String.format("%s/%s/%s",
             clientConf.get(HiveConf.ConfVars.METASTOREWAREHOUSE.varname),
             table.getDbName(), table.getTableName()));
-        alteredTable.putToParameters(KuduMetastorePlugin.EXTERNAL_PURGE_KEY, 
"TRUE");
+        alteredTable.putToParameters(KuduMetastorePlugin.EXTERNAL_PURGE_KEY, 
"FALSE");
         client.alter_table(table.getDbName(), table.getTableName(), 
alteredTable);
         fail();
       } catch (TException e) {
@@ -377,6 +361,36 @@ public class TestKuduMetastorePlugin {
             alteredTable, masterContext());
       }
 
+      // Altering the table type in a what that maintains sync works.
+      // In this case an external purge table is the same as a managed table.
+      {
+        Table alteredTable = table.deepCopy();
+        alteredTable.setTableType(TableType.MANAGED_TABLE.toString());
+        alteredTable.putToParameters(KuduMetastorePlugin.EXTERNAL_TABLE_KEY, 
"FALSE");
+        alteredTable.putToParameters(KuduMetastorePlugin.EXTERNAL_PURGE_KEY, 
"FALSE");
+        // Also change the location to avoid MetastoreDefaultTransformer 
validation
+        // that exists in some Hive versions.
+        alteredTable.getSd().setLocation(String.format("%s/%s/%s",
+            clientConf.get(HiveConf.ConfVars.METASTOREWAREHOUSE.varname),
+            table.getDbName(), table.getTableName()));
+        client.alter_table(table.getDbName(), table.getTableName(), 
alteredTable);
+      }
+
+      // Altering back the table type in a what that maintains sync works.
+      // In this case a managed table is the same as an external purge table.
+      {
+        Table alteredTable = table.deepCopy();
+        alteredTable.setTableType(TableType.EXTERNAL_TABLE.toString());
+        alteredTable.putToParameters(KuduMetastorePlugin.EXTERNAL_TABLE_KEY, 
"TRUE");
+        alteredTable.putToParameters(KuduMetastorePlugin.EXTERNAL_PURGE_KEY, 
"TRUE");
+        // Also change the location to avoid MetastoreDefaultTransformer 
validation
+        // that exists in some Hive versions.
+        alteredTable.getSd().setLocation(String.format("%s/%s/%s",
+            clientConf.get(HiveConf.ConfVars.METASTOREWAREHOUSE.varname),
+            table.getDbName(), table.getTableName()));
+        client.alter_table(table.getDbName(), table.getTableName(), 
alteredTable);
+      }
+
       // Check that adding a column fails.
       table.getSd().addToCols(new FieldSchema("b", "int", ""));
       // Also change the location to avoid MetastoreDefaultTransformer 
validation

Reply via email to