diff --git a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java index 62f615b93..3a439aeaa 100644 --- a/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java +++ b/lens-driver-jdbc/src/main/java/org/apache/lens/driver/jdbc/JDBCDriver.java @@ -633,14 +633,7 @@ public void validate(AbstractQueryContext pContext) throws LensException { PreparedStatement stmt; // Estimate queries need to get connection from estimate pool to make sure // we are not blocked by data queries. - stmt = prepareInternal(pContext, true, true, "validate-"); - if (stmt != null) { - try { - stmt.close(); - } catch (SQLException e) { - throw new LensException(); - } - } + prepareInternal(pContext, true, true, "validate-"); } } @@ -707,12 +700,12 @@ protected final ConnectionProvider getConnectionProvider() { * @return prepared statement of the query * @throws LensException */ - private PreparedStatement prepareInternal(AbstractQueryContext pContext) throws LensException { + private void prepareInternal(AbstractQueryContext pContext) throws LensException { if (pContext.getDriverQuery(this) == null) { throw new NullPointerException("Null driver query for " + pContext.getUserQuery()); } checkConfigured(); - return prepareInternal(pContext, false, false, "prepare-"); + prepareInternal(pContext, false, false, "prepare-"); } @@ -725,7 +718,7 @@ private PreparedStatement prepareInternal(AbstractQueryContext pContext) throws * @return prepared statement * @throws LensException */ - private PreparedStatement prepareInternal(AbstractQueryContext pContext, + private void prepareInternal(AbstractQueryContext pContext, boolean calledForEstimate, boolean checkConfigured, String metricCallStack) throws LensException { @@ -742,33 +735,8 @@ private PreparedStatement prepareInternal(AbstractQueryContext pContext, MethodMetricsContext sqlRewriteGauge = MethodMetricsFactory.createMethodGauge(pContext.getDriverConf(this), true, metricCallStack + COLUMNAR_SQL_REWRITE_GAUGE); String rewrittenQuery = rewriteQuery(pContext); + pContext.setSelectedDriverQuery(rewrittenQuery); sqlRewriteGauge.markSuccess(); - MethodMetricsContext jdbcPrepareGauge = MethodMetricsFactory.createMethodGauge(pContext.getDriverConf(this), true, - metricCallStack + JDBC_PREPARE_GAUGE); - - PreparedStatement stmt = null; - Connection conn = null; - try { - conn = calledForEstimate ? getEstimateConnection() : getConnection(); - stmt = conn.prepareStatement(rewrittenQuery); - if (!pContext.getDriverConf(this).getBoolean(JDBC_VALIDATE_SKIP_WARNINGS, - DEFAULT_JDBC_VALIDATE_SKIP_WARNINGS) && stmt.getWarnings() != null) { - throw new LensException(stmt.getWarnings()); - } - } catch (SQLException sql) { - handleJDBCSQLException(sql); - } finally { - if (conn != null) { - try { - conn.close(); - } catch (SQLException e) { - log.error("Error closing connection: {}", rewrittenQuery, e); - } - } - jdbcPrepareGauge.markSuccess(); - } - log.info("Prepared: {}", rewrittenQuery); - return stmt; } /** @@ -807,10 +775,7 @@ public void prepare(PreparedQueryContext pContext) throws LensException { // already prepared return; } - PreparedStatement stmt = prepareInternal(pContext); - if (stmt != null) { - preparedQueries.put(pContext.getPrepareHandle(), stmt); - } + prepareInternal(pContext); } /** diff --git a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java index c08b04a27..377b2dfb8 100644 --- a/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java +++ b/lens-driver-jdbc/src/test/java/org/apache/lens/driver/jdbc/TestJdbcDriver.java @@ -44,7 +44,6 @@ import org.apache.lens.server.api.query.QueryContext; import org.apache.lens.server.api.query.cost.QueryCost; import org.apache.lens.server.api.query.cost.StaticQueryCost; -import org.apache.lens.server.api.util.LensUtil; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.hive.conf.HiveConf; @@ -294,23 +293,7 @@ public void testEstimate() throws Exception { } /** - * Test estimate failing - * - * @throws Exception the exception - */ - @Test - public void testEstimateFailing() throws Exception { - String query2 = "SELECT * FROM estimate_test2"; // Select query against non existing table - try { - driver.estimate(createExplainContext(query2, baseConf)); - Assert.fail("Running estimate on a non existing table."); - } catch (LensException ex) { - Assert.assertEquals(LensUtil.getCauseMessage(ex), "user lacks privilege or object not found: ESTIMATE_TEST2"); - } - } - - /** - * Test estimate failing + * Test estimate guages * * @throws Exception the exception */ @@ -326,7 +309,6 @@ public void testEstimateGauges() throws Exception { String driverQualifiledName = driver.getFullyQualifiedName(); Assert.assertTrue(reg.getGauges().keySet().containsAll(Arrays.asList( "lens.MethodMetricGauge.TestJdbcDriver-"+driverQualifiledName+"-validate-columnar-sql-rewrite", - "lens.MethodMetricGauge.TestJdbcDriver-"+driverQualifiledName+"-validate-jdbc-prepare-statement", "lens.MethodMetricGauge.TestJdbcDriver-"+driverQualifiledName+"-validate-thru-prepare", "lens.MethodMetricGauge.TestJdbcDriver-"+driverQualifiledName+"-jdbc-check-allowed-query"))); } @@ -359,7 +341,11 @@ public void testMetricsEnabled() throws Exception { cost = driver.estimate(pContext2); Assert.assertEquals(cost, JDBC_COST); driver.prepare(pContext2); - driver.explainAndPrepare(pContext2); + + PreparedQueryContext pContext3 = new PreparedQueryContext(query1, "SA", metricConf, drivers); + cost = driver.estimate(pContext3); + Assert.assertEquals(cost, JDBC_COST); + driver.explainAndPrepare(pContext3); } /** @@ -653,23 +639,6 @@ public void testPrepare() throws Exception { driver.prepare(pContext); } - /** - * Test prepare failing - * - * @throws Exception the exception - */ - @Test - public void testPrepareFailing() throws Exception { - String query = "SELECT * FROM prepare_test2"; // Select query against non existing table - try { - PreparedQueryContext pContext = new PreparedQueryContext(query, "SA", baseConf, drivers); - driver.prepare(pContext); - Assert.fail("Running prepare on a non existing table."); - } catch (LensException ex) { - Assert.assertEquals(LensUtil.getCauseMessage(ex), "user lacks privilege or object not found: PREPARE_TEST2"); - } - } - /** * Test prepare skip warnings * diff --git a/lens-server-api/src/main/java/org/apache/lens/server/api/query/PreparedQueryContext.java b/lens-server-api/src/main/java/org/apache/lens/server/api/query/PreparedQueryContext.java index 69ee7c4fe..1834c8b0e 100644 --- a/lens-server-api/src/main/java/org/apache/lens/server/api/query/PreparedQueryContext.java +++ b/lens-server-api/src/main/java/org/apache/lens/server/api/query/PreparedQueryContext.java @@ -77,7 +77,7 @@ public class PreparedQueryContext extends AbstractQueryContext implements Delaye /** * The millis in week. */ - private static long millisInWeek = 7 * 24 * 60 * 60 * 1000; + private static long millisInTenMinutes = 10 * 60 * 1000; /** * Instantiates a new prepared query context. @@ -129,7 +129,7 @@ public long getDelay(TimeUnit units) { if (this.prepareStartTime != null) { Date now = new Date(); long elapsedMills = now.getTime() - this.prepareStartTime.getTime(); - delayMillis = millisInWeek - elapsedMills; + delayMillis = millisInTenMinutes - elapsedMills; return units.convert(delayMillis, TimeUnit.MILLISECONDS); } else { return Integer.MAX_VALUE; diff --git a/lens-server/src/main/java/org/apache/lens/server/query/LensServerDAO.java b/lens-server/src/main/java/org/apache/lens/server/query/LensServerDAO.java index 28b678b3b..bba6caca0 100644 --- a/lens-server/src/main/java/org/apache/lens/server/query/LensServerDAO.java +++ b/lens-server/src/main/java/org/apache/lens/server/query/LensServerDAO.java @@ -120,7 +120,7 @@ public void createPreparedQueriesTable() throws Exception { log.warn("Unable to create prepared_queries queries table", e); } } - + public void createFailedAttemptsTable() throws Exception { String sql = "CREATE TABLE if not exists failed_attempts (handle varchar(255) not null," + "attempt_number int, drivername varchar(10000), progress float, progressmessage varchar(10000), " @@ -845,8 +845,9 @@ public boolean deleteActiveSession(LensSessionHandle sessionId) throws LensExcep * @throws SQLException the exception */ public void insertPreparedQuery(PreparedQueryContext preparedQueryContext) throws LensException { - String sql = "insert into prepared_queries (handle, userquery, submitter, timetaken, queryname, drivername, " - + "driverquery, starttime)" + " values (?,?,?,?,?,?,?,?)"; + String sql = + "insert into prepared_queries (handle, userquery, submitter, timetaken, queryname, drivername, " + + "driverquery, starttime)" + " values (?,?,?,?,?,?,?,?)"; Connection conn = null; try { conn = getConnection(); @@ -864,7 +865,7 @@ public void insertPreparedQuery(PreparedQueryContext preparedQueryContext) throw } catch (SQLException e) { log.error("Failed to insert prepared query into database with error, " + e); throw new LensException(e); - } finally { + } finally { DbUtils.closeQuietly(conn); } } diff --git a/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java b/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java index 18bd2d06f..f240f8878 100644 --- a/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java +++ b/lens-server/src/main/java/org/apache/lens/server/query/QueryExecutionServiceImpl.java @@ -2057,6 +2057,7 @@ public QueryPrepareHandle prepare(LensSessionHandle sessionHandle, String query, acquire(sessionHandle); prepared = prepareQuery(sessionHandle, query, lensConf, SubmitOp.PREPARE); prepared.setQueryName(queryName); + prepared.getSelectedDriver().prepare(prepared); lensServerDao.insertPreparedQuery(prepared); return prepared.getPrepareHandle(); } catch (LensException e) {