Repository: hive Updated Branches: refs/heads/master 308ae90aa -> 5a1957fc6
HIVE-11668 : make sure directsql calls pre-query init when needed (Sergey Shelukhin, reviewed by Sushanth Sowmyan) Project: http://git-wip-us.apache.org/repos/asf/hive/repo Commit: http://git-wip-us.apache.org/repos/asf/hive/commit/5a1957fc Tree: http://git-wip-us.apache.org/repos/asf/hive/tree/5a1957fc Diff: http://git-wip-us.apache.org/repos/asf/hive/diff/5a1957fc Branch: refs/heads/master Commit: 5a1957fc61da4d5e32c46e8e38bdf596eaeef8a3 Parents: 308ae90 Author: Sergey Shelukhin <ser...@apache.org> Authored: Wed Sep 2 11:05:44 2015 -0700 Committer: Sergey Shelukhin <ser...@apache.org> Committed: Wed Sep 2 12:27:11 2015 -0700 ---------------------------------------------------------------------- .../hive/metastore/MetaStoreDirectSql.java | 29 ++++++++++++++++---- 1 file changed, 23 insertions(+), 6 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/hive/blob/5a1957fc/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java ---------------------------------------------------------------------- diff --git a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java index 522fcc2..1f89b7c 100644 --- a/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java +++ b/metastore/src/java/org/apache/hadoop/hive/metastore/MetaStoreDirectSql.java @@ -178,7 +178,13 @@ class MetaStoreDirectSql { private boolean ensureDbInit() { Transaction tx = pm.currentTransaction(); + boolean doCommit = false; + if (!tx.isActive()) { + tx.begin(); + doCommit = true; + } Query dbQuery = null, tblColumnQuery = null, partColumnQuery = null; + try { // Force the underlying db to initialize. dbQuery = pm.newQuery(MDatabase.class, "name == ''"); @@ -192,10 +198,14 @@ class MetaStoreDirectSql { return true; } catch (Exception ex) { + doCommit = false; LOG.warn("Database initialization failed; direct SQL is disabled", ex); tx.rollback(); return false; } finally { + if (doCommit) { + tx.commit(); + } if (dbQuery != null) { dbQuery.closeAll(); } @@ -210,23 +220,28 @@ class MetaStoreDirectSql { private boolean runTestQuery() { Transaction tx = pm.currentTransaction(); + boolean doCommit = false; if (!tx.isActive()) { tx.begin(); + doCommit = true; } Query query = null; // Run a self-test query. If it doesn't work, we will self-disable. What a PITA... String selfTestQuery = "select \"DB_ID\" from \"DBS\""; try { + doDbSpecificInitializationsBeforeQuery(); query = pm.newQuery("javax.jdo.query.SQL", selfTestQuery); query.execute(); - tx.commit(); return true; - } catch (Exception ex) { - LOG.warn("Self-test query [" + selfTestQuery + "] failed; direct SQL is disabled", ex); + } catch (Throwable t) { + doCommit = false; + LOG.warn("Self-test query [" + selfTestQuery + "] failed; direct SQL is disabled", t); tx.rollback(); return false; - } - finally { + } finally { + if (doCommit) { + tx.commit(); + } if (query != null) { query.closeAll(); } @@ -524,7 +539,6 @@ class MetaStoreDirectSql { + "where \"PART_ID\" in (" + partIds + ") order by \"PART_NAME\" asc"; long start = doTrace ? System.nanoTime() : 0; Query query = pm.newQuery("javax.jdo.query.SQL", queryText); - @SuppressWarnings("unchecked") List<Object[]> sqlResult = executeWithArray(query, null, queryText); long queryTime = doTrace ? System.nanoTime() : 0; Deadline.checkTimeout(); @@ -1095,6 +1109,7 @@ class MetaStoreDirectSql { if (colNames.isEmpty()) { return null; } + doDbSpecificInitializationsBeforeQuery(); boolean doTrace = LOG.isDebugEnabled(); long start = doTrace ? System.nanoTime() : 0; String queryText = "select " + STATS_COLLIST + " from \"TAB_COL_STATS\" " @@ -1214,6 +1229,7 @@ class MetaStoreDirectSql { private List<ColumnStatisticsObj> columnStatisticsObjForPartitions(String dbName, String tableName, List<String> partNames, List<String> colNames, long partsFound, boolean useDensityFunctionForNDVEstimation) throws MetaException { + doDbSpecificInitializationsBeforeQuery(); // TODO: all the extrapolation logic should be moved out of this class, // only mechanical data retrieval should remain here. String commonPrefix = "select \"COLUMN_NAME\", \"COLUMN_TYPE\", " @@ -1530,6 +1546,7 @@ class MetaStoreDirectSql { return Lists.newArrayList(); } boolean doTrace = LOG.isDebugEnabled(); + doDbSpecificInitializationsBeforeQuery(); long start = doTrace ? System.nanoTime() : 0; String queryText = "select \"PARTITION_NAME\", " + STATS_COLLIST + " from \"PART_COL_STATS\"" + " where \"DB_NAME\" = ? and \"TABLE_NAME\" = ? and \"COLUMN_NAME\" in ("