You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@hive.apache.org by "Peter Vary (JIRA)" <ji...@apache.org> on 2017/04/14 14:12:42 UTC

[jira] [Created] (HIVE-16451) Race condition between HiveStatement.getQueryLog and HiveStatement.runAsyncOnServer

Peter Vary created HIVE-16451:
---------------------------------

             Summary: 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
    Affects Versions: 3.0.0
            Reporter: Peter Vary
            Assignee: Peter Vary


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)