hbase-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Guanghao Zhang (JIRA)" <j...@apache.org>
Subject [jira] [Created] (HBASE-19522) The complete order is wrong in AsyncBufferedMutatorImpl
Date Fri, 15 Dec 2017 11:25:00 GMT
Guanghao Zhang created HBASE-19522:
--------------------------------------

             Summary: The complete order is wrong in AsyncBufferedMutatorImpl
                 Key: HBASE-19522
                 URL: https://issues.apache.org/jira/browse/HBASE-19522
             Project: HBase
          Issue Type: Bug
            Reporter: Guanghao Zhang


{code}
    List<CompletableFuture<Void>> toComplete = this.futures;
    assert toSend.size() == toComplete.size();
    this.mutations = new ArrayList<>();
    this.futures = new ArrayList<>();
    bufferedSize = 0L; 
    Iterator<CompletableFuture<Void>> toCompleteIter = toComplete.iterator();
    for (CompletableFuture<?> future : table.batch(toSend)) {
      future.whenComplete((r, e) -> {
        CompletableFuture<Void> f = toCompleteIter.next(); // Call next in callback,
so the complete order may different with the future order
        if (e != null) {
          f.completeExceptionally(e);
        } else {
          f.complete(null);
        }
      }); 
    }
{code}

Here we call table.batch to get a list of CompleteFuture for each mutation. Then we register
a call back for each future. But the problem is we call toCompleteIter.next() in the callback.
So we may complete the future by a wrong order(not same with the mutation order). Meanwhile,
as ArrayList is not thread safe, so different thread may get same future by toCompleteIter.next().



--
This message was sent by Atlassian JIRA
(v6.4.14#64029)

Mime
View raw message