HIVE-18316 - HiveEndPoint should only work with full acid tables (Eugene Koifman...
authorEugene Koifman <ekoifman@hortonworks.com>
Thu, 21 Dec 2017 04:07:39 +0000 (20:07 -0800)
committerEugene Koifman <ekoifman@hortonworks.com>
Thu, 21 Dec 2017 04:07:39 +0000 (20:07 -0800)
hcatalog/streaming/src/java/org/apache/hive/hcatalog/streaming/HiveEndPoint.java
ql/src/java/org/apache/hadoop/hive/ql/io/AcidUtils.java

index db3109e..bccf60c 100644 (file)
@@ -21,7 +21,7 @@ package org.apache.hive.hcatalog.streaming;
 import org.apache.hadoop.fs.FileSystem;
 import org.apache.hadoop.hive.common.JavaUtils;
 import org.apache.hadoop.hive.metastore.api.DataOperationType;
-import org.apache.hadoop.hive.metastore.api.hive_metastoreConstants;
+import org.apache.hadoop.hive.ql.io.AcidUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.apache.hadoop.hive.cli.CliSessionState;
@@ -336,15 +336,10 @@ public class HiveEndPoint {
         LOG.warn("Unable to check the endPoint: " + endPoint, e);
         throw new InvalidTable(endPoint.database, endPoint.table, e);
       }
-
-      // 1 - check if TBLPROPERTIES ('transactional'='true') is set on table
-      Map<String, String> params = t.getParameters();
-      if (params != null) {
-        String transactionalProp = params.get(hive_metastoreConstants.TABLE_IS_TRANSACTIONAL);
-        if (transactionalProp == null || !transactionalProp.equalsIgnoreCase("true")) {
-          LOG.error("'transactional' property is not set on Table " + endPoint);
-          throw new InvalidTable(endPoint.database, endPoint.table, "\'transactional\' property" +
-              " is not set on Table");          }
+      // 1 - check that the table is Acid
+      if (!AcidUtils.isAcidTable(t)) {
+        LOG.error("HiveEndPoint " + endPoint + " must use an acid table");
+        throw new InvalidTable(endPoint.database, endPoint.table, "is not an Acid table");
       }
 
       // 2 - check if partitionvals are legitimate
index 31316f0..bb105fe 100644 (file)
@@ -1271,9 +1271,18 @@ public class AcidUtils {
    * {@link org.apache.hadoop.hive.metastore.txn.TxnUtils#isAcidTable(org.apache.hadoop.hive.metastore.api.Table)}
    */
   public static boolean isAcidTable(Table table) {
-    return isTransactionalTable(table) && !AcidUtils.isInsertOnlyTable(table);
+    return isAcidTable(table == null ? null : table.getTTable());
   }
-  
+  /**
+   * Should produce the same result as
+   * {@link org.apache.hadoop.hive.metastore.txn.TxnUtils#isAcidTable(org.apache.hadoop.hive.metastore.api.Table)}
+   */
+  public static boolean isAcidTable(org.apache.hadoop.hive.metastore.api.Table table) {
+    return table != null && table.getParameters() != null &&
+        isTablePropertyTransactional(table.getParameters()) &&
+        !isInsertOnlyTable(table.getParameters());
+  }
+
   public static boolean isAcidTable(CreateTableDesc td) {
     if (td == null || td.getTblProps() == null) {
       return false;