hbase-issues mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Enis Soztutar (JIRA)" <j...@apache.org>
Subject [jira] [Commented] (HBASE-17924) Consider sorting the row order when processing multi() ops before taking rowlocks
Date Tue, 18 Apr 2017 23:09:41 GMT

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

Enis Soztutar commented on HBASE-17924:
---------------------------------------

Good point, we do this sorting in MultiRowMutationEndpoint: 
{code}
      // set of rows to lock, sorted to avoid deadlocks
      SortedSet<byte[]> rowsToLock = new TreeSet<>(Bytes.BYTES_COMPARATOR);
      List<MutationProto> mutateRequestList = request.getMutationRequestList();
      List<Mutation> mutations = new ArrayList<>(mutateRequestList.size());
      for (MutationProto m : mutateRequestList) {
        mutations.add(ProtobufUtil.toMutation(m));
      }
{code}
Makes sense to do it in the regular batch path as well. 

> Consider sorting the row order when processing multi() ops before taking rowlocks
> ---------------------------------------------------------------------------------
>
>                 Key: HBASE-17924
>                 URL: https://issues.apache.org/jira/browse/HBASE-17924
>             Project: HBase
>          Issue Type: Improvement
>    Affects Versions: 2.0.0, 1.1.8
>            Reporter: Andrew Purtell
>            Assignee: Allan Yang
>             Fix For: 2.0.0
>
>         Attachments: HBASE-17924.patch, HBASE-17924.v0.patch
>
>
> When processing a batch mutation, we take row locks in whatever order the mutations were
added to the multi op by the client.
>  
> {noformat}
> RSRpcServices#multi -> RSRpcServices#mutateRows -> HRegion#mutateRow -> HRegion#mutateRowsWithLocks
-> HRegion#processRowsWithLocks
> {noformat}
> Or
> {noformat}
> RSRpcServices#multi -> RSRpcServices#doNonAtomicRegionMutation ->
>       HRegion#get 
>     | HRegion#append 
>     | HRegion#increment 
>     | HRegionServer#doBatchOp -> HRegion#batchMutate -> HRegion#doMiniBatchMutation
> {noformat}
>  
> multi() is fed by client APIs that accept a RowMutations object containing actions for
multiple rows. The container for ops inside RowMutations is an ArrayList, which doesn't change
the ordering of objects added to it. The protobuf implementation of the messages for multi
ops do not reorder the list of actions. When processing multi ops we iterate over the actions
in the order rehydrated from protobuf.
> We should discuss sorting the order of ops by row key when processing multi() ops before
taking row locks. Does this make lock ordering more predictable for server side operations?
Yes, but potentially surprising for the client, right? Is there any legitimate reason we should
take locks out of row key sorted order because the client has structured the request as such?



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)

Mime
View raw message