I've committed a patch which will now unregister the resource resolver
factory if a resource provider factory is unregistered.
This is actually very simple as we already have all the code in the right
place (ResourceresolverFactoryActivator).
I tested this a little bit and it seems too not cause problems

Carsten


2014-02-21 9:37 GMT+01:00 Carsten Ziegeler <cziege...@apache.org>:

> I just gave this a try run with a large application...and it seems that
> this is causing too much service registration changes as there are many
> components having a reference to the resource resolver...or in other words
> the app never finishes its startup
>
> I guess the main problem is that now, the resource resolver is
> re-registered not just when a provider factory disappears but also wenn it
> appears.
> I'll give it a try with modifying the service registration when a resource
> resolver factory is unregistered.
>
> Carsten
>
>
> 2014-02-20 14:39 GMT+01:00 Carsten Ziegeler <cziege...@apache.org>:
>
> Yes, that sounds like the easiest option - it would mean that the resource
>> resolver factory is re-registered with every change to a resource provider
>> factory - which doesn't sound too bad to me
>>
>> Carsten
>>
>>
>> 2014-02-20 13:25 GMT+01:00 Felix Meschberger <fmesc...@adobe.com>:
>>
>> Hi
>>>
>>> I see.
>>>
>>> Can this be easily "solved" by just making the ResourceProviderFactory
>>> reference in the ResourceResolverFactoryActivator a static reference with
>>> eager policyOption?
>>>
>>> Regards
>>> Felix
>>>
>>> Am 20.02.2014 um 13:21 schrieb Carsten Ziegeler <cziege...@apache.org>:
>>>
>>> > Only ResourceProviderFactories are affected - simple resourceProviders
>>> like
>>> > the servlet ones can't keep state. Those appear/disappear silently. I
>>> agree
>>> > that service registration modifications are rather expensive, on the
>>> other
>>> > hand there are only a few provider factories and those are usually not
>>> > updated frequently (of course, we never know what our users are doing).
>>> >
>>> > Your idea for keeping references to the entries makes sense, however
>>> today,
>>> > the resource resolver context is holding the reference to the factory
>>> - and
>>> > this needs to be nulled out in some way. We could maybe get away with
>>> an
>>> > intermediate ResourceProviderEntry.
>>> >
>>> > I'm still not sure if this is the right thing, as RPs from factories
>>> can
>>> > keep state, like transient changes and these would simply disappear-
>>> >
>>> > Carsten
>>> >
>>> >
>>> > 2014-02-20 13:09 GMT+01:00 Felix Meschberger <fmesc...@adobe.com>:
>>> >
>>> >> Hi
>>> >>
>>> >> Am 20.02.2014 um 10:19 schrieb Carsten Ziegeler <cziege...@apache.org
>>> >:
>>> >>
>>> >>> Hi,
>>> >>>
>>> >>> as noted in SLING-3400 we have a problem when a resource provider
>>> factory
>>> >>> is unregistered and a resource resolver is currently using a provider
>>> >> from
>>> >>> this factory. In that case, that reference is never cleared.
>>> >>> This problem occurs due to long running resource resolvers.
>>> >>>
>>> >>> I looked at solving this issue and my first idea was to simply
>>> remove the
>>> >>> reference to the provider if the factory is unregistered.
>>> Unfortunately,
>>> >>> this comes with the drawback that we have to keep a reference to all
>>> open
>>> >>> resource resolver (contexts) in order to notify them, once a factory
>>> is
>>> >>> removed.
>>> >>> Although this is feasible, while implementing it I came to the
>>> conclusion
>>> >>> that this is actually the wrong approach: a resource resolver is
>>> using /
>>> >>> has used a provider and this one silently disappears. This might
>>> cause
>>> >> some
>>> >>> trouble / unexpected behaviour.
>>> >>>
>>> >>> So I rather think, once this happens all resource resolvers need to
>>> be
>>> >>> closed and recreated - the easiest way to do this is to unregister
>>> and
>>> >>> reregister the resource resolver factory. However, I think simply
>>> >> modifying
>>> >>> the service registration of the resolver factory would be the better
>>> >> option
>>> >>> and should do the trick.
>>> >>
>>> >> This will be expensive since serlvets are registered as
>>> ResourceProviders
>>> >> this will cause all ResourceResolverFactory consumers to be "cycled"
>>> >> whenever a servlet is registered and unregistered. I think that is
>>> >> inappropriate overhead.
>>> >>
>>> >> Rather, I think it is perfectly fine to me, that we remove
>>> >> ResourceProvider instances used by ResourceResolver objects: At the
>>> end of
>>> >> the day, this is like removing JCR node subtree: A ResourceResolver
>>> cannot
>>> >> expect for this to exist for ever.
>>> >>
>>> >> Basically we have two cases:
>>> >>
>>> >> (1) ResourceProvider from ResourceProviderFactory
>>> >> (2) ResourceProvider service
>>> >>
>>> >> IIRC the second case of ResourceProvider services is easy because
>>> >> essentially a ResourceResovler instances share the same
>>> >> ResourceProviderEntry which in turn calls the ResourceProvider.
>>> >> Unregistering the ResourceProvider would just remove the
>>> ResourceProvider
>>> >> from the ResourceProviderEntry.
>>> >>
>>> >> For ResourceResourceProviderFactory it is a bit more complicated:
>>> Maybe we
>>> >> must keep a collection of ResourceProviderEntry instances which refer
>>> to
>>> >> the ResourceProvider instances provided by the
>>> ResourceProviderFactory.
>>> >> When the factory is unregistered the respective ResourceProvider
>>> instances
>>> >> are removed from the entries.
>>> >>
>>> >> Does that make sense ?
>>> >>
>>> >> Regards
>>> >> Felix
>>> >>
>>> >>
>>> >>>
>>> >>> WDYT?
>>> >>>
>>> >>> Regards
>>> >>> Carsten
>>> >>> --
>>> >>> Carsten Ziegeler
>>> >>> cziege...@apache.org
>>> >>
>>> >>
>>> >
>>> >
>>> > --
>>> > Carsten Ziegeler
>>> > cziege...@apache.org
>>>
>>>
>>
>>
>> --
>> Carsten Ziegeler
>> cziege...@apache.org
>>
>
>
>
> --
> Carsten Ziegeler
> cziege...@apache.org
>



-- 
Carsten Ziegeler
cziege...@apache.org

Reply via email to