[infinispan-dev] Caches need be stopped in a specific order to respect cross-cache dependencies

Sanne Grinovero sanne at infinispan.org
Fri Aug 15 10:26:24 EDT 2014


On 15 August 2014 14:55, Dan Berindei <dan.berindei at gmail.com> wrote:
> It looks to me like you actually want a partial order between caches on
> shutdown, so why not declare an explicit dependency (e.g.
> manager.stopOrder(before, after)? We could even throw an exception if the
> user tries to stop a cache manually in the wrong order (e.g.
> TestingUtil.killCacheManagers).

Because that's much more complex to implement?
incRef() seems trivial, effective and can be used by other components
for different patterns.

> Alternatively, we could add an event CacheManagerStopEvent(pre=true) at the
> cache manager level that is invoked before any cache is stopped, and you
> could close all the indexes in that listener. The event could even be at the
> cache level, if it would make things easier.

I like that more than defining explicit dependency links and it would
probably be good enough for this specific problem
but I feel like it doesn't solve similar problems with a more complex
dependency sequence of services.
Counters are effectively providing the same semantics, just that you
can use the pre-close pattern nesting it "count times".

Also having ref-counting available makes it easier for users to
implement independent components - with an independent lifecycle -
which might share the same cache.

-- Sanne

>
> Cheers
> Dan
>
>
>
> On Fri, Aug 15, 2014 at 3:29 PM, Sanne Grinovero <sanne at infinispan.org>
> wrote:
>>
>> The goal being to resolve ISPN-4561, I was thinking to expose a very
>> simple reference counter in the AdvancedCache API.
>>
>> As you know the Query module - which triggers on indexed caches - can
>> use the Infinispan Lucene Directory to store its indexes in a
>> (different) Cache.
>> When the CacheManager is stopped, if the index storage caches are
>> stopped first, then the indexed cache is stopped, this might need to
>> flush/close some pending state on the index and this results in an
>> illegal operation as the storate is shut down already.
>>
>> We could either implement a complex dependency graph, or add a method
>> like:
>>
>>
>>   boolean incRef();
>>
>> on AdvancedCache.
>>
>> when the Cache#close() method is invoked, this will do an internal
>> decrement, and only when hitting zero it will really close the cache.
>>
>> A CacheManager shutdown will loop through all caches, and invoke
>> close() on all of them; the close() method should return something so
>> that the CacheManager shutdown loop understand if it really did close
>> all caches or if not, in which case it will loop again through all
>> caches, and loops until all cache instances are really closed.
>> The return type of "close()" doesn't necessarily need to be exposed on
>> public API, it could be an internal only variant.
>>
>>
>> Could we do this?
>>
>> --Sanne
>> _______________________________________________
>> infinispan-dev mailing list
>> infinispan-dev at lists.jboss.org
>> https://lists.jboss.org/mailman/listinfo/infinispan-dev
>
>
>
> _______________________________________________
> infinispan-dev mailing list
> infinispan-dev at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/infinispan-dev


More information about the infinispan-dev mailing list