hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Guanghao Zhang (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-19522) The complete order may be wrong in AsyncBufferedMutatorImpl
Date Sat, 16 Dec 2017 01:47:00 GMT

    [ https://issues.apache.org/jira/browse/HBASE-19522?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16293548#comment-16293548
] 

Guanghao Zhang commented on HBASE-19522:
----------------------------------------

Add a new ut in 002 patch.

> 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
>         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)

Mime
View raw message