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)