Cache.put() triggers CacheStore.load()
aolenev Jul 15, 2014 2:52 AMHi,
I'm using Infinispan 7.0.0.Alpha4 and faced with strange behaviour: if I put object in cache it triggers cacheStore.load(). Snippet from my configuration:
<distributed-cache name="string-cache" owners="2" mode="SYNC"> <state-transfer enabled="true" /> <persistence> <store class="org.sproot_grid.infinispan.cachestore.StringCacheStore"> <property name="driver">org.h2.Driver</property> <property name="connection-url">jdbc:h2:mem:testdb</property> <property name="username">sa</property> <property name="password"></property> </store> </persistence> </distributed-cache>
StringCacheStore - is my implementation of CacheLoader and CacheWriter
I found possible reason here (org.infinispan.factories.InterceptorChainFactory):
if (configuration.persistence().usingStores()) { if (configuration.persistence().passivation()) { if (configuration.clustering().cacheMode().isClustered()) interceptorChain.appendInterceptor(createInterceptor(new ClusteredActivationInterceptor(), ClusteredActivationInterceptor.class), false); else interceptorChain.appendInterceptor(createInterceptor(new ActivationInterceptor(), ActivationInterceptor.class), false); } else { if (configuration.clustering().cacheMode().isClustered()) interceptorChain.appendInterceptor(createInterceptor(new ClusteredCacheLoaderInterceptor(), ClusteredCacheLoaderInterceptor.class), false); else interceptorChain.appendInterceptor(createInterceptor(new CacheLoaderInterceptor(), CacheLoaderInterceptor.class), false); switch (configuration.clustering().cacheMode()) { case DIST_SYNC: case DIST_ASYNC: case REPL_SYNC: case REPL_ASYNC: interceptorChain.appendInterceptor(createInterceptor(new DistCacheWriterInterceptor(), DistCacheWriterInterceptor.class), false); break; default: interceptorChain.appendInterceptor(createInterceptor(new CacheWriterInterceptor(), CacheWriterInterceptor.class), false); break; } } }
Why do we need CacheLoaderInterceptor here (despite command is PutKeyValueCommand)?
Moreover it fails with NPE if there is no entry with given key in underlying persistent storage (UPDATE: NPE is fixed, I just had to return null from CacheLoader if nothing found instead of wrapping null into MarshalledEntry).
Can I disable such a workflow by declarative configuration?