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

Hiroshi Ikeda commented on HBASE-15716:
---------------------------------------

I meant, in Listener.doAccept, change
{code}
Reader reader = getReader();
try {
  reader.startAdd();
  SelectionKey readKey = reader.registerChannel(channel);
       // calling channel.register(readSelector, SelectionKey.OP_READ),
       // possibly blocked until the reader returns from the 
readSelector.select,
       // depending on VM implementations
  c = getConnection(channel, System.currentTimeMillis());
  readKey.attach(c);
...
} finally {
  reader.finishAdd();
      // The reader will be blocked until calling this.
}
{code}

with

{code}
Reader reader = getReader();
c = getConnection(channel, System.currentTimeMillis());
...
reader.registrationQueue.offer(c);
    // The channel is still just-accepted, and the reader thread will register 
later.
reader.readSelector.wakeup();
{code}


In Reader.doRunLoop, change
{code}
readSelector.select();
while (adding) {
  this.wait(1000);
}
...
{code}

with

{code}
readSelector.select();
Connection c;
while ((c = registrationQueue.poll()) != null) {
     // Register anything in the queue.
  try {
      c.channel.register(readSelector, SelectionKey.OP_READ, c)
  } catch (ClosedChannelException e) {
  // The channel is already closed somewhere.
  // That's legal, and you might want to just log something.
  }
}
...
{code}

That is a little part of the logic of the patch I created in HBASE-14479.
Selector is subtle against multi-threads.


> HRegion#RegionScannerImpl scannerReadPoints synchronization constrains random 
> read
> ----------------------------------------------------------------------------------
>
>                 Key: HBASE-15716
>                 URL: https://issues.apache.org/jira/browse/HBASE-15716
>             Project: HBase
>          Issue Type: Bug
>          Components: Performance
>            Reporter: stack
>            Assignee: stack
>         Attachments: 
> 15716.implementation.using.ScannerReadPoints.branch-1.patch, 
> 15716.prune.synchronizations.patch, 15716.prune.synchronizations.v3.patch, 
> 15716.prune.synchronizations.v4.patch, 15716.prune.synchronizations.v4.patch, 
> 15716.wip.more_to_be_done.patch, HBASE-15716.branch-1.001.patch, 
> HBASE-15716.branch-1.002.patch, HBASE-15716.branch-1.003.patch, 
> HBASE-15716.branch-1.004.patch, ScannerReadPoints.java, Screen Shot 
> 2016-04-26 at 2.05.45 PM.png, Screen Shot 2016-04-26 at 2.06.14 PM.png, 
> Screen Shot 2016-04-26 at 2.07.06 PM.png, Screen Shot 2016-04-26 at 2.25.26 
> PM.png, Screen Shot 2016-04-26 at 6.02.29 PM.png, Screen Shot 2016-04-27 at 
> 9.49.35 AM.png, TestScannerReadPoints.java, before_after.png, 
> current-branch-1.vs.NoSynchronization.vs.Patch.png, hits.png, 
> remove.locks.patch, remove_cslm.patch
>
>
> Here is a [~lhofhansl] special.
> When we construct the region scanner, we get our read point and then store it 
> with the scanner instance in a Region scoped CSLM. This is done under a 
> synchronize on the CSLM.
> This synchronize on a region-scoped Map creating region scanners is the 
> outstanding point of lock contention according to flight recorder (My work 
> load is workload c, random reads).



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

Reply via email to