[ 
http://issues.apache.org/jira/browse/DERBY-2107?page=comments#action_12458623 ] 
            
Daniel John Debrunner commented on DERBY-2107:
----------------------------------------------

This is how the page latching currently works in the case when the lock manager 
releases its latch:

Page page = ContainerHandle.getPage(long)
     results in a call to FileContainer.getPage(...)
     - page is found in the cache and kept (ie. usage count in the cache will 
be bumped)
     - page is latched
         - BasePage.lockEvent() is called  to assign page ownership

    at this point the page is held in the cache and is latched, 
ContainerHandle.getPage states Page reference will remain valid until unlatch() 
is called. Note that multiple threads can execute this code concurrently, all 
will have the same valid reference to the Page, one will have it latched, the 
others will be queued in the lock manager waiting for the latch to be released.

LockingPolicy.lockRecordForRead() called to get a row lock passing the Page's 
latch, assume the lock can not be obtained.
   - Page's latch will be released
     - BasePage.unlockEvent() is called to clear page ownership
   - caller will wait for row lock
      at this point the caller still has not returned the Page object to the 
cache, so from the cache's point of view the
      Page is still in use and so cannot be re-used with another identity.
   - next waiter is be granted the Page latch and continue their work, ie. 
their  ContainerHandle.getPage(long) returns with the same valid Page reference.

   - at some point the caller gets its row lock and then attempts to get the 
latch, queuing behind any other waiters
   - once the latch is granted (following the row lock) the lockRecordForRead() 
call returns
       BasePage.lockEvent() is called to assign page ownership

Caller reads and/or modifies page

Page.unlatch() is called to indicate the caller is finished with the page
   - page is unlatched
   - BasePage.unlockEvent()  is called to clear page ownership
   - Page is released from the cache (ie. usage count decremented)

At this point in time the caller cannot trust the Page reference any more, 
since its usage count in the cache could have dropped to zero and some other 
thread could have replaced it.




> Move page latching out of the lock manager
> ------------------------------------------
>
>                 Key: DERBY-2107
>                 URL: http://issues.apache.org/jira/browse/DERBY-2107
>             Project: Derby
>          Issue Type: Improvement
>          Components: Store, Services, Performance
>    Affects Versions: 10.3.0.0
>            Reporter: Knut Anders Hatlen
>         Assigned To: Knut Anders Hatlen
>            Priority: Minor
>         Attachments: derby-2107-1a.diff, derby-2107-1a.stat, 
> derby-2107-1b.diff
>
>
> Latching of pages could be done more efficiently locally in store than in the 
> lock manager. See the discussion here: 
> http://thread.gmane.org/gmane.comp.apache.db.derby.devel/33135

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: 
http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

Reply via email to