[ https://issues.apache.org/jira/browse/HBASE-15716?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=15358632#comment-15358632 ]
Hiroshi Ikeda commented on HBASE-15716: --------------------------------------- Sorry, I found that getSmallestReadPoint() may go backward when getEntry() is going to adding a new tail node with an already obsolete read point. In order to keep the consistency between the methods I should have left the decision of returning the current mvcc read point into the internal queue. Now I'm thinking: {code} long getSmallestReadPoint() { Node head = headRef.get(); while (true) { long refs = head.references; if (refs > 0) { return head.readPoint; } Node next = head.next; if (next == null) { assert refs == 0; long mvccReadPoint = getMvccReadPoint(); if (head.readPoint < mvccReadPoint) { next = new Node(mvccReadPoint, 0); if (! head.setNextIfAbsent(next)) { // The following node is asynchronously set. next = head.next; } } else { return head.readPoint; } } assert next != null; if (refs < 0 || head.compareAndSetReferences(0, -1)) { if (headRef.compareAndSet(head, next)) { head = next; } else { head = headRef.get(); } } // Otherwise head.references is asynchronously changed from 0; Check again. } } {code} Or any better idea? Sorry for bothering you. > 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, HBASE-15716.branch-1.005.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, Screen Shot 2016-06-30 at > 9.52.52 PM.png, Screen Shot 2016-06-30 at 9.54.08 PM.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)