[
https://issues.apache.org/jira/browse/SLING-8946?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17045315#comment-17045315
]
Dirk Rudolph commented on SLING-8946:
-------------------------------------
Ok got it. In this case the logic in BasicObservationReporter prevents the
registration of an unnecessary listener which depending on the RP costs some
overhead. ResourceChanges reported via the BasicObservationReporter are also
filtered again in a later stage.
I don't see any way to implement this in linear time keeping the behaviour that
when ever a ResourceProvider appears/disappears it immediately is
activated/deactivated. No matter how the control flow goes as long as the root
ResourceProvider has to keep track on excluding all overlapping
ResourceProviders the time complexity is at least n^2.
Giving some background of the issue and why I set it critical:
We have a ResourceProvider registered on a path (/content/foo), overlapping the
root ResourceProvider. This ResourceProvider resolves Resources from other
areas of the repository (for example in /etc) and so "mounts" them on deep
paths below /content/foo. Any other path that cannot be resolved to one of the
"other areas" will be delegated to the parent/root ResourceProvider. For
example:
We have in /etc
/etc/appletrees/en_GB/apple [sling:resourceType='fruit']
And in /content/foo we have
/content/foo/en_GB => from root ResourceProvider
/content/foo/en_GB/fruits => from root ResourceProvider
/content/foo/en_GB/fruits/apple => from custom ResourceProvider found by a
"Resource in /etc with resourceType='fruit' and name='apple'"
Now this works fine as long as it comes to events and ResourceChangeListeners,
as they are used for sling:alias for example. We implemented the event
listeners as instructed by the product's support team (actually registering
listeners on the same JCR repository as the root ResourceProvider does) and
now, depending on the start order of the services and as stated in the
description, we receive ResourceChanges sometimes twice (first time from the
root ResourceProvider and second time from our custom ResourceProvider).
(p.s. I know this setup is not really lean and can probably be implemented
differently)
> 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)