From 5d2c353437dca12f16469bf9e8469488d0e8631f Mon Sep 17 00:00:00 2001 From: Radim Vansa Date: Wed, 18 Oct 2017 13:11:42 +0200 Subject: [PATCH] HHH-12036 Use cache.clear() for bulk removal on non-tx cache --- .../NonTxInvalidationCacheAccessDelegate.java | 13 +++++++++++++ .../hibernate/cache/infinispan/impl/BaseRegion.java | 2 +- .../AbstractRegionAccessStrategyTest.java | 6 +++++- 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/NonTxInvalidationCacheAccessDelegate.java b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/NonTxInvalidationCacheAccessDelegate.java index 0d0a42a254..76efc06686 100644 --- a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/NonTxInvalidationCacheAccessDelegate.java +++ b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/NonTxInvalidationCacheAccessDelegate.java @@ -77,4 +77,17 @@ public class NonTxInvalidationCacheAccessDelegate extends InvalidationCacheAcces // endInvalidatingKeys is called from NonTxInvalidationInterceptor, from the synchronization callback return false; } + + @Override + public void removeAll() throws CacheException { + try { + if (!putValidator.beginInvalidatingRegion()) { + log.failedInvalidateRegion(region.getName()); + } + cache.clear(); + } + finally { + putValidator.endInvalidatingRegion(); + } + } } diff --git a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java index 239327e2ca..1dbd04695f 100644 --- a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java +++ b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java @@ -242,7 +242,7 @@ public abstract class BaseRegion implements Region { // When we don't have transaction, we can do a clear operation (since we don't // case about context) and can't do the one-by-one remove: remove() on tx cache // requires transactional context. - if ( inTransaction ) { + if ( inTransaction && cache.getCacheConfiguration().transaction().transactionMode().isTransactional() ) { log.tracef( "Transaction, clearing one element at the time" ); Caches.removeAll( localAndSkipLoadCache ); } diff --git a/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionAccessStrategyTest.java b/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionAccessStrategyTest.java index d21c009455..ada6c4701b 100644 --- a/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionAccessStrategyTest.java +++ b/hibernate-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionAccessStrategyTest.java @@ -45,6 +45,10 @@ import org.hibernate.test.cache.infinispan.util.ExpectingInterceptor; import org.hibernate.test.cache.infinispan.util.JdbcResourceTransactionMock; import org.hibernate.test.cache.infinispan.util.TestInfinispanRegionFactory; import org.hibernate.test.cache.infinispan.util.TestSynchronization; +import org.infinispan.Cache; +import org.infinispan.commands.write.ClearCommand; +import org.infinispan.test.TestingUtil; +import org.jboss.logging.Logger; import org.hibernate.test.cache.infinispan.util.TestTimeService; import org.hibernate.testing.AfterClassOnce; import org.hibernate.testing.BeforeClassOnce; @@ -513,7 +517,7 @@ public abstract class AbstractRegionAccessStrategyTest cmd instanceof InvalidateCommand) + .when((ctx, cmd) -> cmd instanceof InvalidateCommand || cmd instanceof ClearCommand) .countDown(endInvalidationLatch); cleanup.add(() -> ExpectingInterceptor.cleanup(remoteRegion.getCache())); }