You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@jackrabbit.apache.org by "Sergiy Shyrkov (JIRA)" <ji...@apache.org> on 2013/04/04 23:16:15 UTC

[jira] [Updated] (JCR-3560) CachingHierarchyManager.stateDiscarded() call to provider.hasItemState(discarded.getId())

     [ https://issues.apache.org/jira/browse/JCR-3560?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Sergiy Shyrkov updated JCR-3560:
--------------------------------

    Attachment: CachingHierarchyManager-stateDiscarded.jpg
    
> CachingHierarchyManager.stateDiscarded() call to provider.hasItemState(discarded.getId())
> -----------------------------------------------------------------------------------------
>
>                 Key: JCR-3560
>                 URL: https://issues.apache.org/jira/browse/JCR-3560
>             Project: Jackrabbit Content Repository
>          Issue Type: Bug
>          Components: jackrabbit-core
>    Affects Versions: 2.2.13, 2.4.3, 2.5.3, 2.6
>            Reporter: Sergiy Shyrkov
>            Priority: Minor
>              Labels: performance
>         Attachments: CachingHierarchyManager-stateDiscarded.jpg
>
>
> As a follow up of the discussion in users mailing list: http://markmail.org/thread/w4ubczmddkqdzoac
> Hello guys,
> I would need your help in understanding the code in the CachingHierarchyManager.stateDiscarded() method (Jackrabbit 2.2.4). A short background: I am working on a tool to purge orphaned version history from the repository (version history for nodes, which are no longer present in the repository). The version store is quite large (the row count in the version bundle table is around 12 000 000 entries). When profiling the tool execution I see in the snapshot that in the CachingHierarchyManager.stateDiscarded() method the provider.hasItemState(discarded.getId()) is called. In my case this happens quite often and the call provider.hasItemState() goes into the DB and loads the bundle. The things is that the item is no longer present and the provider.hasItemState() evaluates to false.
> The call in my case is coming from the org.apache.jackrabbit.core.state.ChangeLog.persisted() where we have the following lines:
> ... for (ItemState state : deletedStates()) { state.setStatus(ItemState.STATUS_EXISTING_REMOVED); state.notifyStateDestroyed(); state.discard(); } ...
> The state.discard() calls the notifyStateDiscarded();
> Is it really needed here after we have already called state.notifyStateDestroyed()?
> If yes, is there any way we can optimize the check in the CachingHierarchyManager.stateDiscarded() to not call provider.hasItemState() in some cases? Perhaps check for discarded.getStatus() != ItemState.STATUS_EXISTING_REMOVED first or similar?
> I am attaching the profiler snapshot (CachingHierarchyManager-stateDiscarded.png). Also provided here: http://img580.imageshack.us/img580/7179/cachinghierarchymanager.png
> And just in case the image won't get through the mailing list, here is a text representation of the method call trace: 
> org.apache.jackrabbit.core.state.ChangeLog.persisted()
>  - org.apache.jackrabbit.core.state.ItemState.discard()
>   - org.apache.jackrabbit.core.state.ItemState.notifyStateDiscarded()
>    - org.apache.jackrabbit.core.state.SharedItemStateManager.stateDiscarded(ItemState)
>     - org.apache.jackrabbit.core.state.StateChangeDispatcher.notifyStateDiscarded(ItemState)
>      - org.apache.jackrabbit.core.state.SharedItemStateManager.stateDiscarded(ItemState)
>       - org.apache.jackrabbit.core.state.StateChangeDispatcher.notifyStateDiscarded(ItemState)
>        - org.apache.jackrabbit.core.CachingHierarchyManager.stateDiscarded(ItemState)
>         - org.apache.jackrabbit.core.state.SharedItemStateManager.hasItemState(ItemId)
>          - org.apache.jackrabbit.core.state.SharedItemStateManager.hasNonVirtualItemState(ItemId)
>           - org.apache.jackrabbit.core.persistence.bundle.AbstractBundlePersistenceManager.exists(PropertyId)
>            - org.apache.jackrabbit.core.persistence.bundle.AbstractBundlePersistenceManager.getBundle(NodeId)
>             - org.apache.jackrabbit.core.persistence.pool.BundleDbPersistenceManager.loadBundle(NodeId)
>              - org.apache.jackrabbit.core.util.db.ConnectionHelper.exec(String, Object[], boolean, int)
> Thank you in advance for any hints!
> Sergiy Shyrkov

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira