[ https://issues.apache.org/jira/browse/HIVE-16451?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15981334#comment-15981334 ]
Peter Vary commented on HIVE-16451: ----------------------------------- On the weekend I did some thinking, and I realized that HiveStatement could not be made to thread safe (see execute, and getResultSet could be called from different threads and cause problems). We can not make the HiveStatement thread safe, but we should at least make sure that calling getQueryLog will not cause problems if it is called parallel with any of the followings: cancel, close, execute, executeAsync, executeQuery, executeUpdate, getUpdateCount and more interestingly for the HiveQueryResultSet.next too. It is a quiet complex problem for the first glance, so I created a new jira for it: HIVE-16517 - HiveStatement thread safety issues. In the meantime this patch could solve the problems which can arise during the happy path. > Race condition between HiveStatement.getQueryLog and > HiveStatement.runAsyncOnServer > ----------------------------------------------------------------------------------- > > Key: HIVE-16451 > URL: https://issues.apache.org/jira/browse/HIVE-16451 > Project: Hive > Issue Type: Bug > Components: Beeline, JDBC > Affects Versions: 3.0.0 > Reporter: Peter Vary > Assignee: Peter Vary > Attachments: HIVE-16451.02.patch, HIVE-16451.03.patch, > HIVE-16451.patch > > > During the BeeLineDriver testing I have met the following race condition: > - Run the query asynchronously through BeeLine > - Querying the logs in the BeeLine > In the following code: > {code:title=HiveStatement.runAsyncOnServer} > private void runAsyncOnServer(String sql) throws SQLException { > checkConnection("execute"); > closeClientOperation(); > initFlags(); > [..] > } > {code} > {code:title=HiveStatement.getQueryLog} > public List<String> getQueryLog(boolean incremental, int fetchSize) > throws SQLException, ClosedOrCancelledStatementException { > [..] > try { > if (stmtHandle != null) { > [..] > } else { > if (isQueryClosed) { > throw new ClosedOrCancelledStatementException("Method getQueryLog() > failed. The " + > "statement has been closed or cancelled."); > } else { > return logs; > } > } > } catch (SQLException e) { > [..] > } > [..] > } > {code} > The runAsyncOnServer {{closeClientOperation}} sets {{isQueryClosed}} flag to > true: > {code:title=HiveStatement.closeClientOperation} > void closeClientOperation() throws SQLException { > [..] > isQueryClosed = true; > isExecuteStatementFailed = false; > stmtHandle = null; > } > {code} > The {{initFlags}} sets it to false: > {code} > private void initFlags() { > isCancelled = false; > isQueryClosed = false; > isLogBeingGenerated = true; > isExecuteStatementFailed = false; > isOperationComplete = false; > } > {code} > If the {{getQueryLog}} is called after the {{closeClientOperation}}, but > before the {{initFlags}}, then we will have a following warning if verbose > mode is set to true in BeeLine: > {code} > Warning: org.apache.hive.jdbc.ClosedOrCancelledStatementException: Method > getQueryLog() failed. The statement has been closed or cancelled. > (state=,code=0) > {code} > This caused this fail: > https://builds.apache.org/job/PreCommit-HIVE-Build/4691/testReport/org.apache.hadoop.hive.cli/TestBeeLineDriver/testCliDriver_smb_mapjoin_11_/ > {code} > Error Message > Client result comparison failed with error code = 1 while executing > fname=smb_mapjoin_11 > 16a17 > > Warning: org.apache.hive.jdbc.ClosedOrCancelledStatementException: Method > > getQueryLog() failed. The statement has been closed or cancelled. > > (state=,code=0) > {code} -- This message was sent by Atlassian JIRA (v6.3.15#6346)