This is an automated email from the ASF dual-hosted git repository. kgyrtkirk pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push: new 6392c0e HIVE-24106: Abort polling on the operation state when the current thr… (#1456) (Zhihua Deng reviewed by Zoltan Haindrich) 6392c0e is described below commit 6392c0e7f16f0f767aa8c1b70eafa672c0b7865f Author: dengzh <dengzhhu...@gmail.com> AuthorDate: Wed Oct 14 15:51:43 2020 +0800 HIVE-24106: Abort polling on the operation state when the current thr… (#1456) (Zhihua Deng reviewed by Zoltan Haindrich) --- .../java/org/apache/hadoop/hive/ql/ErrorMsg.java | 1 + .../org/apache/hive/jdbc/TestJdbcWithMiniHS2.java | 29 ++++++++++++++++++++++ .../java/org/apache/hive/jdbc/HiveStatement.java | 6 +++++ 3 files changed, 36 insertions(+) diff --git a/common/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java b/common/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java index 92406cd..9b50f75 100644 --- a/common/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java +++ b/common/src/java/org/apache/hadoop/hive/ql/ErrorMsg.java @@ -509,6 +509,7 @@ public enum ErrorMsg { REPL_FILE_MISSING_FROM_SRC_AND_CM_PATH(20016, "File is missing from both source and cm path."), REPL_EXTERNAL_SERVICE_CONNECTION_ERROR(20017, "Failed to connect to {0} service. Error code {1}.",true), + CLIENT_POLLING_OPSTATUS_INTERRUPTED(20018, "Interrupted while polling on the operation status", "70100"), // An exception from runtime that will show the full stack to client UNRESOLVED_RT_EXCEPTION(29999, "Runtime Error: {0}", "58004", true), diff --git a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java index b80fb58..acbc5fd 100644 --- a/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java +++ b/itests/hive-unit/src/test/java/org/apache/hive/jdbc/TestJdbcWithMiniHS2.java @@ -47,6 +47,7 @@ import java.util.Set; import java.util.Base64; import java.util.concurrent.Callable; import java.util.concurrent.CancellationException; +import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; @@ -1683,4 +1684,32 @@ public class TestJdbcWithMiniHS2 { assertTrue(getDetailedTableDescription(stmt, "emp_mm_table").contains(mndPath)); } } + + @Test + public void testInterruptPollingState() throws Exception { + ExecutorService pool = Executors.newFixedThreadPool(1); + final CountDownLatch latch = new CountDownLatch(1); + final Object[] results = new Object[2]; + results[0] = false; + Future future = pool.submit(new Callable<Void>() { + @Override + public Void call() { + try (Statement stmt = conTestDb.createStatement()) { + stmt.execute("create temporary function sleepMsUDF as '" + SleepMsUDF.class.getName() + "'"); + stmt.execute("SELECT sleepMsUDF(1, 10000)"); + results[0] = true; + } catch (Exception e) { + results[1] = e; + } finally { + latch.countDown(); + } + return null; + } + }); + Thread.sleep(2000); + future.cancel(true); + latch.await(); + assertEquals(false, results[0]); + assertEquals("Interrupted while polling on the operation status", ((Exception)results[1]).getMessage()); + } } diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java index cd1c130..0fb8496 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveStatement.java @@ -59,6 +59,8 @@ import java.util.Map; import java.util.Objects; import java.util.Optional; +import static org.apache.hadoop.hive.ql.ErrorMsg.CLIENT_POLLING_OPSTATUS_INTERRUPTED; + /** * The object used for executing a static SQL statement and returning the * results it produces. @@ -360,6 +362,10 @@ public class HiveStatement implements java.sql.Statement { // Poll on the operation status, till the operation is complete do { try { + if (Thread.currentThread().isInterrupted()) { + throw new SQLException(CLIENT_POLLING_OPSTATUS_INTERRUPTED.getMsg(), + CLIENT_POLLING_OPSTATUS_INTERRUPTED.getSQLState()); + } /** * For an async SQLOperation, GetOperationStatus will use the long polling approach It will * essentially return after the HIVE_SERVER2_LONG_POLLING_TIMEOUT (a server config) expires