[ https://issues.apache.org/jira/browse/SLING-8946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17045357#comment-17045357 ]
Dirk Rudolph commented on SLING-8946: ------------------------------------- Thats right. The problem we are facing is related to ResourceChanges being (sometimes) propagated twice as stated above. The root cause of this is that the root ResourceProvider was not updating its excludePath set when a new provider appears and because of this the ResourceChanges are not filtered properly in [BasicObservationReporter.java#L289|https://github.com/apache/sling-org-apache-sling-resourceresolver/blob/master/src/main/java/org/apache/sling/resourceresolver/impl/observation/BasicObservationReporter.java#L289]. The performance issues on the other hand are coming from the resolution of this ticket. Afaik adding my custom ResourceProvider to the the required providers of the Resource Resolver Factory configuration will no resolve the issue of events being propagated twice but will cause an expensive restart of the RRF when ever we deploy a snapshot of the bundle containing our custom ResourceProvider implementation. > Non-deterministic shadowing of resource observation > --------------------------------------------------- > > Key: SLING-8946 > URL: https://issues.apache.org/jira/browse/SLING-8946 > Project: Sling > Issue Type: Bug > Components: ResourceResolver > Affects Versions: Resource Resolver 1.5.34 > Reporter: Dirk Rudolph > Assignee: Robert Munteanu > Priority: Critical > Fix For: Resource Resolver 1.6.18 > > Attachments: PerformanceScript.sh > > Time Spent: 1.5h > Remaining Estimate: 0h > > The BasicObservationReporter implements shadowing of events being propagated > per ResourceProvider instance [1]. Assuming we do have 2 ResourceProviders > registered, where the one shadows the other like this: > - RP A registered on / > - RP B registered on /path > then currently the excludes given to the BasicObservationReporter are > different depending on either RP A or RP B gets registered first: > - RP A before RP B => excludes are empty > - RP B before RP A => excludes contain /path > This is because only the newly registered RP gets its ProviderContext updated > [2] > Same applies if RP B is registered before RP A and gets unregistered. In that > case the ObservationReporter of RP A stays untouched. > [1] > [https://github.com/apache/sling-org-apache-sling-resourceresolver/blob/master/src/main/java/org/apache/sling/resourceresolver/impl/observation/BasicObservationReporter.java#L102] > [2] > [https://github.com/apache/sling-org-apache-sling-resourceresolver/blob/master/src/main/java/org/apache/sling/resourceresolver/impl/providers/ResourceProviderTracker.java#L358] -- This message was sent by Atlassian Jira (v8.3.4#803005)