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

Allan Yang commented on HBASE-17506:
------------------------------------

{quote}
there will not be different nonce inside a single WALEntry. Nonce is by RPC 
request. WALEntry is a subparticle of an rpc request.
{quote}
If there is no different nonce inside a single WALEntry, then we can remove 
those code. Those code is only used in replay mode(region replica or log replay)

> started mvcc transaction is not completed in branch-1
> -----------------------------------------------------
>
>                 Key: HBASE-17506
>                 URL: https://issues.apache.org/jira/browse/HBASE-17506
>             Project: HBase
>          Issue Type: Bug
>    Affects Versions: 1.4.0
>            Reporter: Allan Yang
>            Assignee: Allan Yang
>
> In {{doMiniBatchMutation}}, if it is in replay and if the the nonce of the 
> mutation is different, we append them to a different wal.  But, after 
> HBASE-14465, we start a mvcc transition in the ringbuffer's append thread.  
> So, every time we append a wal entry, we started a mvcc transition, but we 
> didn't complete the mvcc transition anywhere. This can block other transition 
> of this region.
> {code}
> // txid should always increase, so having the one from the last call is ok.
> // we use HLogKey here instead of WALKey directly to support legacy 
> coprocessors.
>             walKey = new 
> ReplayHLogKey(this.getRegionInfo().getEncodedNameAsBytes(),
>               this.htableDescriptor.getTableName(), now, m.getClusterIds(),
>               currentNonceGroup, currentNonce, mvcc);
>             txid = this.wal.append(this.htableDescriptor,  
> this.getRegionInfo(),  walKey,
>               walEdit, true);
>             walEdit = new WALEdit(cellCount, isInReplay);
>             walKey = null;
> {code}
> Looked at master branch, there is no such problem. It has a method 
> named{{appendCurrentNonces}} :
> {code}
>  private void appendCurrentNonces(final Mutation mutation, final boolean 
> replay,
>        final WALEdit walEdit, final long now, final long currentNonceGroup, 
> final long currentNonce)
>    throws IOException {
>      if (walEdit.isEmpty()) return;
>      if (!replay) throw new IOException("Multiple nonces per batch and not in 
> replay");
>      WALKey walKey = new WALKey(this.getRegionInfo().getEncodedNameAsBytes(),
>          this.htableDescriptor.getTableName(), now, mutation.getClusterIds(),
>          currentNonceGroup, currentNonce, mvcc, this.getReplicationScope());
>      this.wal.append(this.getRegionInfo(), walKey, walEdit, true);
>      // Complete the mvcc transaction started down in append else it will 
> block others
>      this.mvcc.complete(walKey.getWriteEntry());
>    }
> {code}
> Yes, the easiest way to fix branch-1 is to complete the writeEntry like 
> master branch do. But is it really fine to do this?
> 1. :
> complete the mvcc transition before waiting sync will create a disturbance of 
> data visibility.
> 2.:
> In what circumstance will there be different nonce and nonce group in a 
> single wal entry? Nonce are used in append/increment. But in {{batchMuate}} 
> ,we treat them differently and append one wal entry for each of them. So I 
> think no test can reach this code path,  that maybe why no one has found this 
> bug(Please tell me if I'm wrong).



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

Reply via email to