[ https://issues.apache.org/jira/browse/HBASE-19522?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Guanghao Zhang updated HBASE-19522: ----------------------------------- Resolution: Fixed Fix Version/s: 2.0.0-beta-1 Status: Resolved (was: Patch Available) Pushed to master and branch-2. > The complete order may be wrong in AsyncBufferedMutatorImpl > ----------------------------------------------------------- > > Key: HBASE-19522 > URL: https://issues.apache.org/jira/browse/HBASE-19522 > Project: HBase > Issue Type: Bug > Reporter: Guanghao Zhang > Assignee: Guanghao Zhang > Fix For: 2.0.0-beta-1 > > Attachments: HBASE-19522.master.001.patch, > HBASE-19522.master.002.patch > > > {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)