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

Ales Justin ales.justin at gmail.com
Fri Aug 15 17:40:27 EDT 2014


What about if you add an SPI for this?

e.g. this could be nicely implemented on top of WildFly's MSC

And by default you would keep this simple incRef,
or some similar simple state machine we used in Microcontainer.

-Ales

On 15 Aug 2014, at 16:26, Sanne Grinovero <sanne at infinispan.org> wrote:

> 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
> _______________________________________________
> 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