You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hive.apache.org by ha...@apache.org on 2013/10/05 18:38:21 UTC

svn commit: r1529479 - in /hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore: MetaStoreDirectSql.java ObjectStore.java

Author: hashutosh
Date: Sat Oct  5 16:38:20 2013
New Revision: 1529479

URL: http://svn.apache.org/r1529479
Log:
HIVE-5428 : Direct SQL check fails during tests (Sergey Shelukhin via Ashutosh Chauhan)

Modified:
    hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
    hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java

Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java?rev=1529479&r1=1529478&r2=1529479&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java Sat Oct  5 16:38:20 2013
@@ -46,6 +46,7 @@ import org.apache.hadoop.hive.metastore.
 import org.apache.hadoop.hive.metastore.api.SkewedInfo;
 import org.apache.hadoop.hive.metastore.api.StorageDescriptor;
 import org.apache.hadoop.hive.metastore.api.Table;
+import org.apache.hadoop.hive.metastore.model.MDatabase;
 import org.apache.hadoop.hive.metastore.parser.ExpressionTree;
 import org.apache.hadoop.hive.metastore.parser.ExpressionTree.FilterBuilder;
 import org.apache.hadoop.hive.metastore.parser.ExpressionTree.LeafNode;
@@ -102,7 +103,9 @@ class MetaStoreDirectSql {
       tx = pm.currentTransaction();
       tx.begin();
     }
-    // This should work. If it doesn't, we will self-disable. What a PITA...
+    // Force the underlying db to initialize.
+    pm.newQuery(MDatabase.class, "name == ''").execute();
+    // Self-test query. If it doesn't work, we will self-disable. What a PITA...
     boolean isCompatibleDatastore = false;
     String selfTestQuery = "select \"DB_ID\" from \"DBS\"";
     try {

Modified: hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java
URL: http://svn.apache.org/viewvc/hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java?rev=1529479&r1=1529478&r2=1529479&view=diff
==============================================================================
--- hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java (original)
+++ hive/trunk/metastore/src/java/org/apache/hadoop/hive/metastore/ObjectStore.java Sat Oct  5 16:38:20 2013
@@ -1424,7 +1424,7 @@ public class ObjectStore implements RawS
       int maxParts, boolean allowSql, boolean allowJdo) throws MetaException {
     assert allowSql || allowJdo;
     boolean doTrace = LOG.isDebugEnabled();
-    boolean doUseDirectSql = canUseDirectSql(allowSql);
+    boolean doUseDirectSql = canUseDirectSql(allowSql, allowJdo);
 
     boolean success = false;
     List<Partition> parts = null;
@@ -1754,7 +1754,7 @@ public class ObjectStore implements RawS
     dbName = dbName.toLowerCase();
     tblName = tblName.toLowerCase();
     boolean doTrace = LOG.isDebugEnabled();
-    boolean doUseDirectSql = canUseDirectSql(allowSql);
+    boolean doUseDirectSql = canUseDirectSql(allowSql, allowJdo);
 
     boolean success = false;
     List<Partition> results = null;
@@ -1819,7 +1819,7 @@ public class ObjectStore implements RawS
     //       Filter.g stuff. That way this method and ...ByFilter would just be merged.
     ExpressionTree exprTree = makeExpressionTree(filter);
 
-    boolean doUseDirectSql = allowSql && isDirectSqlEnabled(maxParts);
+    boolean doUseDirectSql = canUseDirectSql(allowSql, allowJdo);
     boolean doTrace = LOG.isDebugEnabled();
     List<Partition> partitions = null;
     boolean hasUnknownPartitions = false;
@@ -1877,12 +1877,6 @@ public class ObjectStore implements RawS
     return hasUnknownPartitions;
   }
 
-  private boolean isDirectSqlEnabled(short maxParts) {
-    // There's no portable SQL limit. It doesn't make a lot of sense w/o offset anyway.
-    return (maxParts < 0)
-        && HiveConf.getBoolVar(getConf(), ConfVars.METASTORE_TRY_DIRECT_SQL);
-  }
-
   private class LikeChecker extends ExpressionTree.TreeVisitor {
     private boolean hasLike;
 
@@ -2062,7 +2056,7 @@ public class ObjectStore implements RawS
       throws MetaException, NoSuchObjectException {
     assert allowSql || allowJdo;
     boolean doTrace = LOG.isDebugEnabled();
-    boolean doUseDirectSql = canUseDirectSql(allowSql);
+    boolean doUseDirectSql = canUseDirectSql(allowSql, allowJdo);
 
     dbName = dbName.toLowerCase();
     tblName = tblName.toLowerCase();
@@ -2108,15 +2102,22 @@ public class ObjectStore implements RawS
     }
   }
 
-  private boolean canUseDirectSql(boolean allowSql) {
+  /**
+   * @param allowSql Whether SQL usage is allowed (always true outside test).
+   * @param allowJdo Whether JDO usage is allowed (always true outside test).
+   * @return Whether we can use direct SQL.
+   */
+  private boolean canUseDirectSql(boolean allowSql, boolean allowJdo) throws MetaException {
     // We don't allow direct SQL usage if we are inside a larger transaction (e.g. droptable).
     // That is because some databases (e.g. Postgres) abort the entire transaction when
     // any query fails, so the fallback from failed SQL to JDO is not possible.
     // TODO: Drop table can be very slow on large tables, we might want to address this.
-    return allowSql
-      && HiveConf.getBoolVar(getConf(), ConfVars.METASTORE_TRY_DIRECT_SQL)
-      && directSql.isCompatibleDatastore()
-      && !isActiveTransaction();
+    boolean isEnabled = !isActiveTransaction()
+        && HiveConf.getBoolVar(getConf(), ConfVars.METASTORE_TRY_DIRECT_SQL);
+    if (!allowJdo && isEnabled && !directSql.isCompatibleDatastore()) {
+      throw new MetaException("SQL is not operational"); // test path; SQL is enabled and broken.
+    }
+    return allowSql && isEnabled && directSql.isCompatibleDatastore();
   }
 
   /**