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)