[ 
https://issues.apache.org/jira/browse/IMPALA-15115?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Michael Smith resolved IMPALA-15115.
------------------------------------
    Fix Version/s: Impala 5.0.0
       Resolution: Fixed

> Race condition where GetOperationStatus() may return error when query is 
> retried
> --------------------------------------------------------------------------------
>
>                 Key: IMPALA-15115
>                 URL: https://issues.apache.org/jira/browse/IMPALA-15115
>             Project: IMPALA
>          Issue Type: Bug
>          Components: Backend
>    Affects Versions: Impala 5.0.0
>            Reporter: Joe McDonnell
>            Assignee: Joe McDonnell
>            Priority: Critical
>             Fix For: Impala 5.0.0
>
>
> In HS2's GetOperationStatus() and Beeswax's get_state(), the code looks like 
> this:
> {code:java}
> void ImpalaServer::GetOperationStatus(TGetOperationStatusResp& return_val,
>     const TGetOperationStatusReq& request) {
> ...
>    status = GetActiveQueryHandle(query_id, &query_handle); <---- #1
> ...
>   // When using long polling, this waits up to long_polling_time_ms 
> milliseconds for
>   // query completion.polling
>   query_handle->WaitForCompletionExecState(); <---- #2
> ...
>   {
>     lock_guard<mutex> l(*query_handle->lock());
>     TOperationState::type operation_state = query_handle->TOperationState();
>     return_val.__set_operationState(operation_state); <---- #3
>     if (operation_state == TOperationState::ERROR_STATE) {
>       DCHECK(!query_handle->query_status().ok());
>       return_val.__set_errorMessage(Substitute(QUERY_ERROR_FORMAT,
>           PrintId(query_id), query_handle->query_status().GetDetail()));
>       return_val.__set_sqlState(SQLSTATE_GENERAL_ERROR);
>     } else {
>       ClientRequestState::RetryState retry_state = 
> query_handle->retry_state();
>       if (retry_state != ClientRequestState::RetryState::RETRYING
>           && retry_state != ClientRequestState::RetryState::RETRIED) {
>         DCHECK(query_handle->query_status().ok());
>       }
>     }{code}
> If we get the active query handle in #1, then it fails and gets retried 
> before #3, GetOperationStatus() will return an error even though the query is 
> being retried. This is deterministic with long polling, because it waits for 
> significant time at #2 and gets posted out when the query hits an error. 
> However, this can happen without long polling, and it might be causing some 
> flakiness for some of our retry tests.
> When we have the lock, if the query hit an error, we should check to see if 
> it was retried. If it was retried, we can call GetActiveQueryHandle() to get 
> the new handle and then return its status.
> The same basic issue exists for Beeswax as well. This is a blocker for 
> enabling long polling by default.



--
This message was sent by Atlassian Jira
(v8.20.10#820010)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to