From d9ba5502e22158b93aa98849fb42cd56e7ee46e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Galder=20Zamarren=CC=83o?= Date: Mon, 11 May 2015 10:23:10 +0200 Subject: [PATCH] HHH-9781 HHH-9776 Backport clear/evict and element count fixes to 4.3 --- .../access/TransactionalAccessDelegate.java | 2 +- .../cache/infinispan/impl/BaseRegion.java | 20 +++++++++---------- .../cache/infinispan/util/Caches.java | 14 +++++++++++++ 3 files changed, 25 insertions(+), 11 deletions(-) diff --git a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java index 62ae504bdb..facc57d233 100755 --- a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java +++ b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java @@ -220,7 +220,7 @@ public class TransactionalAccessDelegate { if ( !putValidator.invalidateRegion() ) { throw new CacheException( "Failed to invalidate pending putFromLoad calls for region " + region.getName() ); } - cache.clear(); + Caches.removeAll(cache); } /** 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 b977a3dcd9..944d2cca24 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 @@ -60,7 +60,7 @@ public abstract class BaseRegion implements Region { } private final String name; - private final AdvancedCache regionClearCache; + private final AdvancedCache localAndSkipLoadCache; private final TransactionManager tm; private final Object invalidationMutex = new Object(); @@ -84,8 +84,9 @@ public abstract class BaseRegion implements Region { this.name = name; this.tm = cache.getTransactionManager(); this.factory = factory; - this.regionClearCache = cache.withFlags( - Flag.CACHE_MODE_LOCAL, Flag.ZERO_LOCK_ACQUISITION_TIMEOUT + this.localAndSkipLoadCache = cache.withFlags( + Flag.CACHE_MODE_LOCAL, Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, + Flag.SKIP_CACHE_LOAD ); } @@ -97,7 +98,7 @@ public abstract class BaseRegion implements Region { @Override public long getElementCountInMemory() { if ( checkValid() ) { - return cache.size(); + return localAndSkipLoadCache.size(); } return 0; @@ -170,27 +171,26 @@ public abstract class BaseRegion implements Region { // (without forcing autoCommit cache configuration). Transaction tx = getCurrentTransaction(); if ( tx != null ) { - regionClearCache.clear(); + log.tracef("Transaction, clearing one element at the time"); + Caches.removeAll(localAndSkipLoadCache); } else { Caches.withinTx( cache, new Callable() { @Override public Void call() throws Exception { - regionClearCache.clear(); + localAndSkipLoadCache.clear(); return null; } } ); } + log.tracef("Transition state from CLEARING to VALID"); invalidateState.compareAndSet( InvalidateState.CLEARING, InvalidateState.VALID ); } catch ( Exception e ) { if ( log.isTraceEnabled() ) { - log.trace( - "Could not invalidate region: " - + e.getLocalizedMessage() - ); + log.trace("Could not invalidate region: ", e); } } } diff --git a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/Caches.java b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/Caches.java index c3466b31a7..04a2e3fcfb 100644 --- a/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/Caches.java +++ b/hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/Caches.java @@ -22,6 +22,7 @@ */ package org.hibernate.cache.infinispan.util; +import java.util.Iterator; import java.util.concurrent.Callable; import javax.transaction.Status; import javax.transaction.TransactionManager; @@ -265,4 +266,17 @@ public class Caches { .clustering().cacheMode().isClustered(); } + public static void removeAll(AdvancedCache cache) { + try { + Iterator it = cache.keySet().iterator(); + while (it.hasNext()) { + it.next(); // Necessary to get next element + it.remove(); + } + } catch (UnsupportedOperationException e) { + // Fallback on using clear for older version + cache.clear(); + } + } + }