Author: galder.zamarreno(a)jboss.com
Date: 2009-11-13 13:12:53 -0500 (Fri, 13 Nov 2009)
New Revision: 17976
Added:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapter.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapterImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapter.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapterImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/FlagAdapter.java
Modified:
core/trunk/cache-infinispan/pom.xml
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/InfinispanRegionFactory.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/CollectionRegionImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/TransactionalAccess.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/EntityRegionImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/TransactionalAccess.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseGeneralDataRegion.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseTransactionalDataRegion.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheHelper.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractGeneralDataRegionTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionImplTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/InfinispanRegionFactoryTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/collection/AbstractCollectionRegionAccessStrategyTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/AbstractEntityRegionAccessStrategyTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/EntityRegionImplTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/AbstractFunctionalTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/CacheAccessListener.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/IsolatedClassLoaderTest.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/AbstractDualNodeTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/EntityCollectionInvalidationTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/query/QueryRegionImplTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/timestamp/TimestampsRegionImplTestCase.java
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/tm/XaTransactionImpl.java
Log:
[HHH-4519] (Hibernate/Infinispan integration doesn't property handle
Entity/CollectionRegionAccessStrategy evictAll) Fixed and got provider to work with
forthcoming Infinispan 4.0.0.CR2 which has been just tagged but the maven repo has not
been updated yet.
Modified: core/trunk/cache-infinispan/pom.xml
===================================================================
--- core/trunk/cache-infinispan/pom.xml 2009-11-13 17:40:36 UTC (rev 17975)
+++ core/trunk/cache-infinispan/pom.xml 2009-11-13 18:12:53 UTC (rev 17976)
@@ -17,7 +17,7 @@
<description>Integration of Hibernate with Infinispan</description>
<properties>
- <version.infinispan>4.0.0.BETA2</version.infinispan>
+ <version.infinispan>4.0.0-SNAPSHOT</version.infinispan>
<version.hsqldb>1.8.0.2</version.hsqldb>
<version.cglib>2.2</version.cglib>
<version.javassist>3.4.GA</version.javassist>
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/InfinispanRegionFactory.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/InfinispanRegionFactory.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/InfinispanRegionFactory.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -24,6 +24,8 @@
import org.hibernate.cache.infinispan.timestamp.TimestampsRegionImpl;
import org.hibernate.cache.infinispan.timestamp.TimestampTypeOverrides;
import org.hibernate.cache.infinispan.tm.HibernateTransactionManagerLookup;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.CacheAdapterImpl;
import org.hibernate.cfg.Settings;
import org.hibernate.util.PropertiesHelper;
import org.infinispan.Cache;
@@ -154,14 +156,20 @@
public CollectionRegion buildCollectionRegion(String regionName, Properties
properties, CacheDataDescription metadata) throws CacheException {
log.debug("Building collection cache region [" + regionName +
"]");
Cache cache = getCache(regionName, COLLECTION_KEY, properties);
- return new CollectionRegionImpl(cache, regionName, metadata, transactionManager);
+ CacheAdapter cacheAdapter = CacheAdapterImpl.newInstance(cache);
+ CollectionRegionImpl region = new CollectionRegionImpl(cacheAdapter, regionName,
metadata, transactionManager);
+ region.start();
+ return region;
}
/** {@inheritDoc} */
public EntityRegion buildEntityRegion(String regionName, Properties properties,
CacheDataDescription metadata) throws CacheException {
if (log.isDebugEnabled()) log.debug("Building entity cache region [" +
regionName + "]");
Cache cache = getCache(regionName, ENTITY_KEY, properties);
- return new EntityRegionImpl(cache, regionName, metadata, transactionManager);
+ CacheAdapter cacheAdapter = CacheAdapterImpl.newInstance(cache);
+ EntityRegionImpl region = new EntityRegionImpl(cacheAdapter, regionName, metadata,
transactionManager);
+ region.start();
+ return region;
}
/**
@@ -171,7 +179,10 @@
throws CacheException {
log.debug("Building query results cache region [" + regionName +
"]");
String cacheName = typeOverrides.get(QUERY_KEY).getCacheName();
- return new QueryResultsRegionImpl(manager.getCache(cacheName), regionName,
properties, transactionManager);
+ CacheAdapter cacheAdapter =
CacheAdapterImpl.newInstance(manager.getCache(cacheName));
+ QueryResultsRegionImpl region = new QueryResultsRegionImpl(cacheAdapter,
regionName, properties, transactionManager);
+ region.start();
+ return region;
}
/**
@@ -181,7 +192,10 @@
throws CacheException {
log.debug("Building timestamps cache region [" + regionName +
"]");
String cacheName = typeOverrides.get(TIMESTAMPS_KEY).getCacheName();
- return new TimestampsRegionImpl(manager.getCache(cacheName), regionName,
transactionManager);
+ CacheAdapter cacheAdapter =
CacheAdapterImpl.newInstance(manager.getCache(cacheName));
+ TimestampsRegionImpl region = new TimestampsRegionImpl(cacheAdapter, regionName,
transactionManager);
+ region.start();
+ return region;
}
/**
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/access/TransactionalAccessDelegate.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -23,11 +23,15 @@
*/
package org.hibernate.cache.infinispan.access;
+import javax.transaction.Transaction;
+
import org.hibernate.cache.CacheException;
import org.hibernate.cache.access.CollectionRegionAccessStrategy;
import org.hibernate.cache.access.EntityRegionAccessStrategy;
import org.hibernate.cache.access.SoftLock;
-import org.infinispan.Cache;
+import org.hibernate.cache.infinispan.impl.BaseRegion;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.CacheHelper;
/**
* Defines the strategy for transactional access to entity or collection data in a
Infinispan instance.
@@ -41,18 +45,24 @@
*/
public class TransactionalAccessDelegate {
- protected final Cache cache;
+ protected final CacheAdapter cacheAdapter;
+ protected final BaseRegion region;
- public TransactionalAccessDelegate(Cache cache) {
- this.cache = cache;
+ public TransactionalAccessDelegate(BaseRegion region) {
+ this.region = region;
+ this.cacheAdapter = region.getCacheAdapter();
}
public Object get(Object key, long txTimestamp) throws CacheException {
- return cache.get(key);
+ if (!region.checkValid())
+ return null;
+ return cacheAdapter.get(key);
}
public boolean putFromLoad(Object key, Object value, long txTimestamp, Object version)
throws CacheException {
- cache.putForExternalRead(key, value);
+ if (!region.checkValid())
+ return false;
+ cacheAdapter.putForExternalRead(key, value);
return true;
}
@@ -76,7 +86,9 @@
}
public boolean insert(Object key, Object value, Object version) throws CacheException
{
- cache.put(key, value);
+ if (!region.checkValid())
+ return false;
+ cacheAdapter.put(key, value);
return true;
}
@@ -85,7 +97,10 @@
}
public boolean update(Object key, Object value, Object currentVersion, Object
previousVersion) throws CacheException {
- cache.put(key, value);
+ // We update whether or not the region is valid. Other nodes
+ // may have already restored the region so they need to
+ // be informed of the change.
+ cacheAdapter.put(key, value);
return true;
}
@@ -95,18 +110,26 @@
}
public void remove(Object key) throws CacheException {
- cache.remove(key);
+ // We update whether or not the region is valid. Other nodes
+ // may have already restored the region so they need to
+ // be informed of the change.
+ cacheAdapter.remove(key);
}
public void removeAll() throws CacheException {
- cache.clear();
+ cacheAdapter.clear();
}
- public void evictAll() throws CacheException {
- evictOrRemoveAll();
+ public void evict(Object key) throws CacheException {
+ cacheAdapter.remove(key);
}
- private void evictOrRemoveAll() throws CacheException {
- cache.clear();
+ public void evictAll() throws CacheException {
+ Transaction tx = region.suspend();
+ try {
+ CacheHelper.sendEvictAllNotification(cacheAdapter, region.getAddress());
+ } finally {
+ region.resume(tx);
+ }
}
}
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/CollectionRegionImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/CollectionRegionImpl.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/CollectionRegionImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -8,17 +8,19 @@
import org.hibernate.cache.access.AccessType;
import org.hibernate.cache.access.CollectionRegionAccessStrategy;
import org.hibernate.cache.infinispan.impl.BaseTransactionalDataRegion;
-import org.infinispan.Cache;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.infinispan.notifications.Listener;
/**
* @author Chris Bredesen
* @author Galder Zamarreño
* @since 3.5
*/
+@Listener
public class CollectionRegionImpl extends BaseTransactionalDataRegion implements
CollectionRegion {
- public CollectionRegionImpl(Cache cache, String name, CacheDataDescription metadata,
TransactionManager transactionManager) {
- super(cache, name, metadata, transactionManager);
+ public CollectionRegionImpl(CacheAdapter cacheAdapter, String name,
CacheDataDescription metadata, TransactionManager transactionManager) {
+ super(cacheAdapter, name, metadata, transactionManager);
}
public CollectionRegionAccessStrategy buildAccessStrategy(AccessType accessType)
throws CacheException {
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/TransactionalAccess.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/TransactionalAccess.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/collection/TransactionalAccess.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -21,11 +21,11 @@
TransactionalAccess(CollectionRegionImpl region) {
this.region = region;
- this.delegate = new TransactionalAccessDelegate(region.getCache());
+ this.delegate = new TransactionalAccessDelegate(region);
}
public void evict(Object key) throws CacheException {
- delegate.remove(key);
+ delegate.evict(key);
}
public void evictAll() throws CacheException {
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/EntityRegionImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/EntityRegionImpl.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/EntityRegionImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -8,17 +8,19 @@
import org.hibernate.cache.access.AccessType;
import org.hibernate.cache.access.EntityRegionAccessStrategy;
import org.hibernate.cache.infinispan.impl.BaseTransactionalDataRegion;
-import org.infinispan.Cache;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.infinispan.notifications.Listener;
/**
* @author Chris Bredesen
* @author Galder Zamarreño
* @since 3.5
*/
+@Listener
public class EntityRegionImpl extends BaseTransactionalDataRegion implements EntityRegion
{
- public EntityRegionImpl(Cache cache, String name, CacheDataDescription metadata,
TransactionManager transactionManager) {
- super(cache, name, metadata, transactionManager);
+ public EntityRegionImpl(CacheAdapter cacheAdapter, String name, CacheDataDescription
metadata, TransactionManager transactionManager) {
+ super(cacheAdapter, name, metadata, transactionManager);
}
public EntityRegionAccessStrategy buildAccessStrategy(AccessType accessType) throws
CacheException {
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/TransactionalAccess.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/TransactionalAccess.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/entity/TransactionalAccess.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -21,11 +21,11 @@
TransactionalAccess(EntityRegionImpl region) {
this.region = region;
- this.delegate = new TransactionalAccessDelegate(region.getCache());
+ this.delegate = new TransactionalAccessDelegate(region);
}
public void evict(Object key) throws CacheException {
- delegate.remove(key);
+ delegate.evict(key);
}
public void evictAll() throws CacheException {
@@ -41,8 +41,7 @@
}
public boolean insert(Object key, Object value, Object version) throws CacheException
{
- region.getCache().put(key, value);
- return true; // TODO this is suspect
+ return delegate.insert(key, value, version);
}
public boolean putFromLoad(Object key, Object value, long txTimestamp, Object version)
throws CacheException {
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseGeneralDataRegion.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseGeneralDataRegion.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseGeneralDataRegion.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -4,7 +4,7 @@
import org.hibernate.cache.CacheException;
import org.hibernate.cache.GeneralDataRegion;
-import org.infinispan.Cache;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
/**
* Support for Infinispan {@link GeneralDataRegion} implementors.
@@ -15,24 +15,24 @@
*/
public abstract class BaseGeneralDataRegion extends BaseRegion implements
GeneralDataRegion {
- public BaseGeneralDataRegion(Cache cache, String name, TransactionManager
transactionManager) {
- super(cache, name, transactionManager);
+ public BaseGeneralDataRegion(CacheAdapter cacheAdapter, String name,
TransactionManager transactionManager) {
+ super(cacheAdapter, name, transactionManager);
}
public void evict(Object key) throws CacheException {
- getCache().evict(key);
+ cacheAdapter.evict(key);
}
public void evictAll() throws CacheException {
- getCache().clear();
+ cacheAdapter.clear();
}
public Object get(Object key) throws CacheException {
- return getCache().get(key);
+ return cacheAdapter.get(key);
}
public void put(Object key, Object value) throws CacheException {
- getCache().put(key, value);
+ cacheAdapter.put(key, value);
}
}
\ No newline at end of file
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseRegion.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -1,6 +1,11 @@
package org.hibernate.cache.infinispan.impl;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.atomic.AtomicReference;
import javax.transaction.SystemException;
import javax.transaction.Transaction;
@@ -8,9 +13,19 @@
import org.hibernate.cache.CacheException;
import org.hibernate.cache.Region;
+import org.hibernate.cache.infinispan.util.AddressAdapter;
+import org.hibernate.cache.infinispan.util.AddressAdapterImpl;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
import org.hibernate.cache.infinispan.util.CacheHelper;
-import org.infinispan.Cache;
-import org.infinispan.context.Flag;
+import org.hibernate.cache.infinispan.util.FlagAdapter;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryInvalidated;
+import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
+import org.infinispan.notifications.cachelistener.event.CacheEntryInvalidatedEvent;
+import org.infinispan.notifications.cachelistener.event.CacheEntryModifiedEvent;
+import org.infinispan.notifications.cachemanagerlistener.annotation.ViewChanged;
+import org.infinispan.notifications.cachemanagerlistener.event.ViewChangedEvent;
+import org.infinispan.util.logging.Log;
+import org.infinispan.util.logging.LogFactory;
/**
* Support for Infinispan {@link Region}s. Handles common "utility" methods for
an underlying named
@@ -22,26 +37,69 @@
* @since 3.5
*/
public abstract class BaseRegion implements Region {
- private final Cache cache;
+ private enum InvalidateState { INVALID, CLEARING, VALID };
+ private static final Log log = LogFactory.getLog(BaseRegion.class);
private final String name;
+ protected final CacheAdapter cacheAdapter;
+ protected final AddressAdapter address;
+ protected final Set<AddressAdapter> currentView = new
HashSet<AddressAdapter>();
protected final TransactionManager transactionManager;
+ protected final boolean replication;
+ protected final Object invalidationMutex = new Object();
+ protected final AtomicReference<InvalidateState> invalidateState = new
AtomicReference<InvalidateState>(InvalidateState.VALID);
- public BaseRegion(Cache cache, String name, TransactionManager transactionManager) {
- this.cache = cache;
+ public BaseRegion(CacheAdapter cacheAdapter, String name, TransactionManager
transactionManager) {
+ this.cacheAdapter = cacheAdapter;
this.name = name;
this.transactionManager = transactionManager;
+ this.replication = cacheAdapter.isClusteredReplication();
+ this.address = this.cacheAdapter.getAddress();
+ this.cacheAdapter.addListener(this);
}
- public Cache getCache() {
- return cache;
+ public void start() {
+ if (address != null) {
+ synchronized (currentView) {
+ List<AddressAdapter> view = cacheAdapter.getMembers();
+ if (view != null) {
+ currentView.addAll(view);
+ establishInternalNodes();
+ }
+ }
+ }
}
+ /**
+ * Calls to this method must be done from synchronized (currentView) blocks only!!
+ */
+ private void establishInternalNodes() {
+ Transaction tx = suspend();
+ try {
+ for (AddressAdapter member : currentView) {
+ CacheHelper.initInternalEvict(cacheAdapter, member);
+ }
+ } finally {
+ resume(tx);
+ }
+ }
+
public String getName() {
return name;
}
+ public CacheAdapter getCacheAdapter() {
+ return cacheAdapter;
+ }
+
public long getElementCountInMemory() {
- return cache.size();
+ if (checkValid()) {
+ Set keySet = cacheAdapter.keySet();
+ int size = cacheAdapter.size();
+ if (CacheHelper.containsEvictAllNotification(keySet, address))
+ size--;
+ return size;
+ }
+ return 0;
}
/**
@@ -71,17 +129,64 @@
}
public Map toMap() {
- return cache;
+ if (checkValid()) {
+ Map map = cacheAdapter.toMap();
+ Set keys = map.keySet();
+ for (Object key : keys) {
+ if (CacheHelper.isEvictAllNotification(key)) {
+ map.remove(key);
+ }
+ }
+ return map;
+ }
+ return Collections.EMPTY_MAP;
}
public void destroy() throws CacheException {
- cache.clear();
+ try {
+ cacheAdapter.clear();
+ } finally {
+ cacheAdapter.removeListener(this);
+ }
}
public boolean contains(Object key) {
- return CacheHelper.containsKey(cache, key, Flag.ZERO_LOCK_ACQUISITION_TIMEOUT);
+ if (!checkValid())
+ return false;
+ // Reads are non-blocking in Infinispan, so not sure of the necessity of passing
ZERO_LOCK_ACQUISITION_TIMEOUT
+ return
cacheAdapter.withFlags(FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT).containsKey(key);
}
-
+
+ public AddressAdapter getAddress() {
+ return address;
+ }
+
+ public boolean checkValid() {
+ boolean valid = invalidateState.get() == InvalidateState.VALID;
+ if (!valid) {
+ synchronized (invalidationMutex) {
+ if (invalidateState.compareAndSet(InvalidateState.INVALID,
InvalidateState.CLEARING)) {
+ Transaction tx = suspend();
+ try {
+ cacheAdapter.withFlags(FlagAdapter.CACHE_MODE_LOCAL,
FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT).clear();
+ invalidateState.compareAndSet(InvalidateState.CLEARING,
InvalidateState.VALID);
+ }
+ catch (Exception e) {
+ if (log.isTraceEnabled()) {
+ log.trace("Could not invalidate region: " +
e.getLocalizedMessage());
+ }
+ }
+ finally {
+ resume(tx);
+ }
+ }
+ }
+ valid = invalidateState.get() == InvalidateState.VALID;
+ }
+
+ return valid;
+ }
+
/**
* Performs a JBoss Cache <code>get(Fqn, Object)</code> after first
* {@link #suspend suspending any ongoing transaction}. Wraps any exception
@@ -93,13 +198,13 @@
* @return The retrieved object
* @throws CacheException issue managing transaction or talking to cache
*/
- protected Object suspendAndGet(Object key, Flag opt, boolean suppressTimeout) throws
CacheException {
+ protected Object suspendAndGet(Object key, FlagAdapter opt, boolean suppressTimeout)
throws CacheException {
Transaction tx = suspend();
try {
if (suppressTimeout)
- return CacheHelper.getAllowingTimeout(cache, key);
+ return cacheAdapter.getAllowingTimeout(key);
else
- return CacheHelper.get(cache, key);
+ return cacheAdapter.get(key);
} finally {
resume(tx);
}
@@ -111,7 +216,7 @@
* @return the transaction that was suspended, or <code>null</code> if
* there wasn't one
*/
- protected Transaction suspend() {
+ public Transaction suspend() {
Transaction tx = null;
try {
if (transactionManager != null) {
@@ -122,14 +227,14 @@
}
return tx;
}
-
+
/**
* Tell the TransactionManager to resume the given transaction
*
* @param tx
* the transaction to suspend. May be <code>null</code>.
*/
- protected void resume(Transaction tx) {
+ public void resume(Transaction tx) {
try {
if (tx != null)
transactionManager.resume(tx);
@@ -138,4 +243,44 @@
}
}
+ @CacheEntryModified
+ public void entryModified(CacheEntryModifiedEvent event) {
+ handleEvictAllModification(event);
+ }
+
+ protected boolean handleEvictAllModification(CacheEntryModifiedEvent event) {
+ if (!event.isPre() && (replication || event.isOriginLocal()) &&
CacheHelper.isEvictAllNotification(event.getKey(), event.getValue())) {
+ if (log.isTraceEnabled()) log.trace("Set invalid state because marker cache
entry was put: {0}", event);
+ invalidateState.set(InvalidateState.INVALID);
+ return true;
+ }
+ return false;
+ }
+
+ @CacheEntryInvalidated
+ public void entryInvalidated(CacheEntryInvalidatedEvent event) {
+ if (log.isTraceEnabled()) log.trace("Cache entry invalidated: {0}",
event);
+ handleEvictAllInvalidation(event);
+ }
+
+ protected boolean handleEvictAllInvalidation(CacheEntryInvalidatedEvent event) {
+ if (!event.isPre() && CacheHelper.isEvictAllNotification(event.getKey()))
{
+ if (log.isTraceEnabled()) log.trace("Set invalid state because marker cache
entry was invalidated: {0}", event);
+ invalidateState.set(InvalidateState.INVALID);
+ return true;
+ }
+ return false;
+ }
+
+ @ViewChanged
+ public void viewChanged(ViewChangedEvent event) {
+ synchronized (currentView) {
+ List<AddressAdapter> view =
AddressAdapterImpl.toAddressAdapter(event.getNewMembers());
+ if (view != null) {
+ currentView.addAll(view);
+ establishInternalNodes();
+ }
+ }
+ }
+
}
\ No newline at end of file
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseTransactionalDataRegion.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseTransactionalDataRegion.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/impl/BaseTransactionalDataRegion.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -4,7 +4,7 @@
import org.hibernate.cache.CacheDataDescription;
import org.hibernate.cache.TransactionalDataRegion;
-import org.infinispan.Cache;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
/**
* Support for Inifinispan {@link TransactionalDataRegion} implementors.
@@ -17,8 +17,8 @@
private final CacheDataDescription metadata;
- public BaseTransactionalDataRegion(Cache cache, String name, CacheDataDescription
metadata, TransactionManager transactionManager) {
- super(cache, name, transactionManager);
+ public BaseTransactionalDataRegion(CacheAdapter cacheAdapter, String name,
CacheDataDescription metadata, TransactionManager transactionManager) {
+ super(cacheAdapter, name, transactionManager);
this.metadata = metadata;
}
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/query/QueryResultsRegionImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -2,74 +2,85 @@
import java.util.Properties;
+import javax.transaction.Transaction;
import javax.transaction.TransactionManager;
import org.hibernate.cache.CacheException;
import org.hibernate.cache.QueryResultsRegion;
import org.hibernate.cache.infinispan.impl.BaseTransactionalDataRegion;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
import org.hibernate.cache.infinispan.util.CacheHelper;
-import org.infinispan.Cache;
-import org.infinispan.context.Flag;
+import org.hibernate.cache.infinispan.util.FlagAdapter;
+import org.infinispan.notifications.Listener;
/**
* @author Chris Bredesen
* @author Galder Zamarreño
* @since 3.5
*/
+@Listener
public class QueryResultsRegionImpl extends BaseTransactionalDataRegion implements
QueryResultsRegion {
private boolean localOnly;
- public QueryResultsRegionImpl(Cache cache, String name, Properties properties,
TransactionManager transactionManager) {
- super(cache, name, null, transactionManager);
+ public QueryResultsRegionImpl(CacheAdapter cacheAdapter, String name, Properties
properties, TransactionManager transactionManager) {
+ super(cacheAdapter, name, null, transactionManager);
// If Infinispan is using INVALIDATION for query cache, we don't want to
propagate changes.
// We use the Timestamps cache to manage invalidation
- localOnly = CacheHelper.isClusteredInvalidation(cache);
+ localOnly = cacheAdapter.isClusteredInvalidation();
}
public void evict(Object key) throws CacheException {
if (localOnly)
- CacheHelper.removeKey(getCache(), key, Flag.CACHE_MODE_LOCAL);
+ cacheAdapter.withFlags(FlagAdapter.CACHE_MODE_LOCAL).remove(key);
else
- CacheHelper.removeKey(getCache(), key);
+ cacheAdapter.remove(key);
}
public void evictAll() throws CacheException {
- if (localOnly)
- CacheHelper.removeAll(getCache(), Flag.CACHE_MODE_LOCAL);
- else
- CacheHelper.removeAll(getCache());
+ Transaction tx = suspend();
+ try {
+ CacheHelper.sendEvictAllNotification(cacheAdapter, getAddress());
+ } finally {
+ resume(tx);
+ }
}
public Object get(Object key) throws CacheException {
+ if (!checkValid())
+ return null;
+
// Don't hold the JBC node lock throughout the tx, as that
// prevents updates
// Add a zero (or low) timeout option so we don't block
// waiting for tx's that did a put to commit
- return suspendAndGet(key, Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, true);
+ return suspendAndGet(key, FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT, true);
}
public void put(Object key, Object value) throws CacheException {
- // Here we don't want to suspend the tx. If we do:
- // 1) We might be caching query results that reflect uncommitted
- // changes. No tx == no WL on cache node, so other threads
- // can prematurely see those query results
- // 2) No tx == immediate replication. More overhead, plus we
- // spread issue #1 above around the cluster
+ if (checkValid()) {
+ // Here we don't want to suspend the tx. If we do:
+ // 1) We might be caching query results that reflect uncommitted
+ // changes. No tx == no WL on cache node, so other threads
+ // can prematurely see those query results
+ // 2) No tx == immediate replication. More overhead, plus we
+ // spread issue #1 above around the cluster
- // Add a zero (or quite low) timeout option so we don't block.
- // Ignore any TimeoutException. Basically we forego caching the
- // query result in order to avoid blocking.
- // Reads are done with suspended tx, so they should not hold the
- // lock for long. Not caching the query result is OK, since
- // any subsequent read will just see the old result with its
- // out-of-date timestamp; that result will be discarded and the
- // db query performed again.
- if (localOnly)
- CacheHelper.putAllowingTimeout(getCache(), key, value,
Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, Flag.CACHE_MODE_LOCAL);
- else
- CacheHelper.putAllowingTimeout(getCache(), key, value,
Flag.ZERO_LOCK_ACQUISITION_TIMEOUT);
-
+ // Add a zero (or quite low) timeout option so we don't block.
+ // Ignore any TimeoutException. Basically we forego caching the
+ // query result in order to avoid blocking.
+ // Reads are done with suspended tx, so they should not hold the
+ // lock for long. Not caching the query result is OK, since
+ // any subsequent read will just see the old result with its
+ // out-of-date timestamp; that result will be discarded and the
+ // db query performed again.
+ if (localOnly)
+ cacheAdapter.withFlags(FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT,
FlagAdapter.CACHE_MODE_LOCAL)
+ .putAllowingTimeout(key, value);
+ else
+ cacheAdapter.withFlags(FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT)
+ .putAllowingTimeout(key, value);
+ }
}
}
\ No newline at end of file
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/timestamp/TimestampsRegionImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -10,12 +10,13 @@
import org.hibernate.cache.CacheException;
import org.hibernate.cache.TimestampsRegion;
import org.hibernate.cache.infinispan.impl.BaseGeneralDataRegion;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
import org.hibernate.cache.infinispan.util.CacheHelper;
-import org.infinispan.Cache;
-import org.infinispan.context.Flag;
+import org.hibernate.cache.infinispan.util.FlagAdapter;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryRemoved;
+import org.infinispan.notifications.cachelistener.event.CacheEntryInvalidatedEvent;
import org.infinispan.notifications.cachelistener.event.CacheEntryModifiedEvent;
import org.infinispan.notifications.cachelistener.event.CacheEntryRemovedEvent;
@@ -31,26 +32,31 @@
private Map localCache = new ConcurrentHashMap();
- public TimestampsRegionImpl(Cache cache, String name, TransactionManager
transactionManager) {
- super(cache, name, transactionManager);
- cache.addListener(this);
+ public TimestampsRegionImpl(CacheAdapter cacheAdapter, String name, TransactionManager
transactionManager) {
+ super(cacheAdapter, name, transactionManager);
+ cacheAdapter.addListener(this);
populateLocalCache();
}
@Override
public void evict(Object key) throws CacheException {
// TODO Is this a valid operation on a timestamps cache?
- CacheHelper.removeKey(getCache(), key);
+ cacheAdapter.remove(key);
}
public void evictAll() throws CacheException {
// TODO Is this a valid operation on a timestamps cache?
- CacheHelper.removeAll(getCache());
+ Transaction tx = suspend();
+ try {
+ CacheHelper.sendEvictAllNotification(cacheAdapter, getAddress());
+ } finally {
+ resume(tx);
+ }
}
public Object get(Object key) throws CacheException {
Object value = localCache.get(key);
- if (value == null) {
+ if (value == null && checkValid()) {
value = suspendAndGet(key, null, false);
if (value != null)
localCache.put(key, value);
@@ -64,7 +70,7 @@
Transaction tx = suspend();
try {
// We ensure ASYNC semantics (JBCACHE-1175)
- CacheHelper.put(getCache(), key, value, Flag.FORCE_ASYNCHRONOUS);
+ cacheAdapter.withFlags(FlagAdapter.FORCE_ASYNCHRONOUS).put(key, value);
} catch (Exception e) {
throw new CacheException(e);
} finally {
@@ -75,7 +81,7 @@
@Override
public void destroy() throws CacheException {
localCache.clear();
- getCache().removeListener(this);
+ cacheAdapter.removeListener(this);
super.destroy();
}
@@ -86,8 +92,9 @@
*/
@CacheEntryModified
public void nodeModified(CacheEntryModifiedEvent event) {
- if (event.isPre()) return;
- localCache.put(event.getKey(), event.getValue());
+ if (!handleEvictAllModification(event) && !event.isPre()) {
+ localCache.put(event.getKey(), event.getValue());
+ }
}
/**
@@ -101,11 +108,29 @@
localCache.remove(event.getKey());
}
+ @Override
+ protected boolean handleEvictAllModification(CacheEntryModifiedEvent event) {
+ boolean result = super.handleEvictAllModification(event);
+ if (result) {
+ localCache.clear();
+ }
+ return result;
+ }
+
+ @Override
+ protected boolean handleEvictAllInvalidation(CacheEntryInvalidatedEvent event) {
+ boolean result = super.handleEvictAllInvalidation(event);
+ if (result) {
+ localCache.clear();
+ }
+ return result;
+ }
+
/**
* Brings all data from the distributed cache into our local cache.
*/
private void populateLocalCache() {
- Set children = CacheHelper.getKeySet(getCache());
+ Set children = cacheAdapter.keySet();
for (Object key : children)
get(key);
}
Added:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapter.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapter.java
(rev 0)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapter.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -0,0 +1,32 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat, Inc. and/or its affiliates, and
+ * individual contributors as indicated by the @author tags. See the
+ * copyright.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.hibernate.cache.infinispan.util;
+
+/**
+ * AddressAdapter.
+ *
+ * @author Galder Zamarreño
+ * @since 3.5
+ */
+public interface AddressAdapter {
+}
Added:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapterImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapterImpl.java
(rev 0)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/AddressAdapterImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -0,0 +1,84 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat, Inc. and/or its affiliates, and
+ * individual contributors as indicated by the @author tags. See the
+ * copyright.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.hibernate.cache.infinispan.util;
+
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.infinispan.remoting.transport.Address;
+
+/**
+ * AddressAdapterImpl.
+ *
+ * @author Galder Zamarreño
+ * @since 3.5
+ */
+public class AddressAdapterImpl implements AddressAdapter, Externalizable {
+
+ private Address address;
+
+ private AddressAdapterImpl(Address address) {
+ this.address = address;
+ }
+
+ static AddressAdapter newInstance(Address address) {
+ return new AddressAdapterImpl(address);
+ }
+
+ public static List<AddressAdapter> toAddressAdapter(List<Address>
ispnAddresses) {
+ List<AddressAdapter> addresses = new
ArrayList<AddressAdapter>(ispnAddresses.size());
+ for (Address address : ispnAddresses) {
+ addresses.add(AddressAdapterImpl.newInstance(address));
+ }
+ return addresses;
+ }
+
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
+ address = (Address) in.readObject();
+ }
+
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(address);
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this)
+ return true;
+ if (!(obj instanceof AddressAdapterImpl))
+ return false;
+ AddressAdapterImpl other = (AddressAdapterImpl) obj;
+ return other.address.equals(address);
+ }
+
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + address.hashCode();
+ return result;
+ }
+}
Added:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapter.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapter.java
(rev 0)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapter.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -0,0 +1,207 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat, Inc. and/or its affiliates, and
+ * individual contributors as indicated by the @author tags. See the
+ * copyright.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.hibernate.cache.infinispan.util;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.hibernate.cache.CacheException;
+import org.infinispan.Cache;
+import org.infinispan.config.Configuration;
+import org.infinispan.util.concurrent.TimeoutException;
+
+/**
+ * Infinispan cache abstraction.
+ *
+ * @author Galder Zamarreño
+ * @since 3.5
+ */
+public interface CacheAdapter {
+
+ /**
+ * Is this cache participating in a cluster with invalidation?
+ *
+ * @return true if the cache is configured for synchronous/asynchronous invalidation;
false otherwise.
+ */
+ boolean isClusteredInvalidation();
+
+ /**
+ * Is this cache participating in a cluster with replication?
+ *
+ * @return true if the cache is configured for synchronous/asynchronous invalidation;
false otherwise.
+ */
+ boolean isClusteredReplication();
+
+ /**
+ * Is this cache configured for synchronous communication?
+ *
+ * @return true if the cache is configured for synchronous communication; false
otherwise.
+ */
+ boolean isSynchronous();
+
+ /**
+ * Set of keys of this cache.
+ *
+ * @return Set containing keys stored in this cache.
+ */
+ Set keySet();
+
+ /**
+ * A builder-style method that adds flags to any cache API call.
+ *
+ * @param flagAdapters a set of flags to apply. See the {@link FlagAdapter}
documentation.
+ * @return a cache on which a real operation is to be invoked.
+ */
+ CacheAdapter withFlags(FlagAdapter... flagAdapters);
+
+ /**
+ * Method to check whether a certain key exists in this cache.
+ *
+ * @param key key to look up.
+ * @return true if key is present, false otherwise.
+ */
+ boolean containsKey(Object key);
+
+ /**
+ * Performs an <code>get(Object)</code> on the cache, wrapping any
exception in a {@link CacheException}.
+ *
+ * @param key key to retrieve
+ * @throws CacheException
+ */
+ Object get(Object key) throws CacheException;
+
+ /**
+ * Performs an <code>get(Object)</code> on the cache ignoring any {@link
TimeoutException}
+ * and wrapping any other exception in a {@link CacheException}.
+ *
+ * @param key key to retrieve
+ * @throws CacheException
+ */
+ Object getAllowingTimeout(Object key) throws CacheException;
+
+ /**
+ * Performs a <code>put(Object, Object)</code> on the cache, wrapping any
exception in a {@link CacheException}.
+ *
+ * @param key key whose value will be modified
+ * @param value data to store in the cache entry
+ * @return the previous value associated with <tt>key</tt>, or
<tt>null</tt>
+ * if there was no mapping for <tt>key</tt>.
+ * @throws CacheException
+ */
+ Object put(Object key, Object value) throws CacheException;
+
+ /**
+ * Performs a <code>put(Object, Object)</code> on the cache ignoring any
{@link TimeoutException}
+ * and wrapping any exception in a {@link CacheException}.
+ *
+ * @param key key whose value will be modified
+ * @param value data to store in the cache entry
+ * @return the previous value associated with <tt>key</tt>, or
<tt>null</tt>
+ * if there was no mapping for <tt>key</tt>.
+ * @throws CacheException
+ */
+ Object putAllowingTimeout(Object key, Object value) throws CacheException;
+
+ /**
+ * See {@link Cache#putForExternalRead(Object, Object)} for detailed documentation.
+ *
+ * @param key key with which the specified value is to be associated.
+ * @param value value to be associated with the specified key.
+ * @throws CacheException
+ */
+ void putForExternalRead(Object key, Object value) throws CacheException;
+
+ /**
+ * Performs a <code>remove(Object)</code>, wrapping any exception in a
{@link CacheException}.
+ *
+ * @param key key to be removed
+ * @return the previous value associated with <tt>key</tt>, or
+ * <tt>null</tt> if there was no mapping for
<tt>key</tt>.
+ * @throws CacheException
+ */
+ Object remove(Object key) throws CacheException;
+
+ /**
+ * Evict the given key from memory.
+ *
+ * @param key to evict.
+ */
+ void evict(Object key) throws CacheException;
+
+ /**
+ * Clear the cache.
+ *
+ * @throws CacheException
+ */
+ void clear() throws CacheException;
+
+ /**
+ * Add listener to this cache.
+ *
+ * @param listener to be added to cache.
+ */
+ void addListener(Object listener);
+
+ /**
+ * Get local cluster address.
+ *
+ * @return Address representing local address.
+ */
+ AddressAdapter getAddress();
+
+ /**
+ * Get cluster members.
+ *
+ * @return List of cluster member Address instances
+ */
+ List<AddressAdapter> getMembers();
+
+ /**
+ * Size of cache.
+ *
+ * @return number of cache entries.
+ */
+ int size();
+
+ /**
+ * This method returns a Map view of the cache.
+ *
+ * @return Map view of cache.
+ */
+ Map toMap();
+
+ /**
+ * Remove listener from cache instance.
+ *
+ * @param listener to be removed.
+ */
+ void removeListener(Object listener);
+
+ /**
+ * Get cache configuration.
+ *
+ * @return Configuration instance associated with this cache.
+ */
+ Configuration getConfiguration();
+}
Added:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapterImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapterImpl.java
(rev 0)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheAdapterImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -0,0 +1,205 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat, Inc. and/or its affiliates, and
+ * individual contributors as indicated by the @author tags. See the
+ * copyright.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.hibernate.cache.infinispan.util;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+
+import org.hibernate.cache.CacheException;
+import org.infinispan.Cache;
+import org.infinispan.config.Configuration;
+import org.infinispan.context.Flag;
+import org.infinispan.remoting.rpc.RpcManager;
+import org.infinispan.util.concurrent.TimeoutException;
+
+/**
+ * CacheAdapterImpl.
+ *
+ * @author Galder Zamarreño
+ * @since 3.5
+ */
+public class CacheAdapterImpl implements CacheAdapter {
+
+ private final Cache cache;
+
+ private CacheAdapterImpl(Cache cache) {
+ this.cache = cache;
+ }
+
+ public static CacheAdapter newInstance(Cache cache) {
+ return new CacheAdapterImpl(cache);
+ }
+
+ public boolean isClusteredInvalidation() {
+ return isClusteredInvalidation(cache.getConfiguration().getCacheMode());
+ }
+
+ public boolean isClusteredReplication() {
+ return isClusteredReplication(cache.getConfiguration().getCacheMode());
+ }
+
+ public boolean isSynchronous() {
+ return isSynchronous(cache.getConfiguration().getCacheMode());
+ }
+
+ public Set keySet() {
+ return cache.keySet();
+ }
+
+ public CacheAdapter withFlags(FlagAdapter... flagAdapters) {
+ Flag[] flags = FlagAdapter.toFlags(flagAdapters);
+ return newInstance(cache.getAdvancedCache().withFlags(flags));
+ }
+
+ public Object get(Object key) throws CacheException {
+ try {
+ return cache.get(key);
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public Object getAllowingTimeout(Object key) throws CacheException {
+ try {
+ return cache.get(key);
+ } catch (TimeoutException ignored) {
+ // ignore it
+ return null;
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public Object put(Object key, Object value) throws CacheException {
+ try {
+ return cache.put(key, value);
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public Object putAllowingTimeout(Object key, Object value) throws CacheException {
+ try {
+ return cache.put(key, value);
+ } catch (TimeoutException allowed) {
+ // ignore it
+ return null;
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public void putForExternalRead(Object key, Object value) throws CacheException {
+ try {
+ cache.putForExternalRead(key, value);
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public Object remove(Object key) throws CacheException {
+ try {
+ return cache.remove(key);
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public void evict(Object key) throws CacheException {
+ try {
+ cache.evict(key);
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ public void clear() throws CacheException {
+ try {
+ cache.clear();
+ } catch (Exception e) {
+ throw new CacheException(e);
+ }
+ }
+
+ private static boolean isClusteredInvalidation(Configuration.CacheMode cacheMode) {
+ return cacheMode == Configuration.CacheMode.INVALIDATION_ASYNC
+ || cacheMode == Configuration.CacheMode.INVALIDATION_SYNC;
+ }
+
+ private static boolean isClusteredReplication(Configuration.CacheMode cacheMode) {
+ return cacheMode == Configuration.CacheMode.REPL_ASYNC
+ || cacheMode == Configuration.CacheMode.REPL_SYNC;
+ }
+
+ private static boolean isSynchronous(Configuration.CacheMode cacheMode) {
+ return cacheMode == Configuration.CacheMode.REPL_SYNC
+ || cacheMode == Configuration.CacheMode.INVALIDATION_SYNC
+ || cacheMode == Configuration.CacheMode.DIST_SYNC;
+ }
+
+ public void addListener(Object listener) {
+ cache.addListener(listener);
+ }
+
+ public AddressAdapter getAddress() {
+ RpcManager rpc = cache.getAdvancedCache().getRpcManager();
+ if (rpc != null) {
+ return AddressAdapterImpl.newInstance(rpc.getTransport().getAddress());
+ }
+ return null;
+ }
+
+ public List<AddressAdapter> getMembers() {
+ RpcManager rpc = cache.getAdvancedCache().getRpcManager();
+ if (rpc != null) {
+ return AddressAdapterImpl.toAddressAdapter(rpc.getTransport().getMembers());
+ }
+ return null;
+ }
+
+ public RpcManager getRpcManager() {
+ return cache.getAdvancedCache().getRpcManager();
+ }
+
+ public int size() {
+ return cache.size();
+ }
+
+ public Map toMap() {
+ return cache;
+ }
+
+ public void removeListener(Object listener) {
+ cache.removeListener(listener);
+ }
+
+ public boolean containsKey(Object key) {
+ return cache.containsKey(key);
+ }
+
+ public Configuration getConfiguration() {
+ return cache.getConfiguration();
+ }
+
+}
Modified:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheHelper.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheHelper.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheHelper.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -23,13 +23,12 @@
*/
package org.hibernate.cache.infinispan.util;
+import java.io.Externalizable;
+import java.io.IOException;
+import java.io.ObjectInput;
+import java.io.ObjectOutput;
import java.util.Set;
-import org.hibernate.cache.CacheException;
-import org.infinispan.Cache;
-import org.infinispan.config.Configuration;
-import org.infinispan.context.Flag;
-import org.infinispan.util.concurrent.TimeoutException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@@ -49,324 +48,68 @@
private CacheHelper() {
}
- /**
- * Is this cache participating in a cluster with invalidation?
- *
- * @param cache
- * The cache to check.
- * @return True if the cache is configured for synchronous/asynchronous invalidation;
false
- * otherwise.
- */
- public static boolean isClusteredInvalidation(Cache cache) {
- return isClusteredInvalidation(cache.getConfiguration().getCacheMode());
+ public static void initInternalEvict(CacheAdapter cacheAdapter, AddressAdapter member)
{
+ EvictAll eKey = new EvictAll(member == null ? NoAddress.INSTANCE : member);
+ cacheAdapter.withFlags(FlagAdapter.CACHE_MODE_LOCAL).put(eKey, Internal.INIT);
}
- /**
- * Does this cache mode indicate clustered invalidation?
- *
- * @param cacheMode
- * The cache to check
- * @return True if the cache mode is confiogured for synchronous/asynchronous
invalidation; false
- * otherwise.
- */
- public static boolean isClusteredInvalidation(Configuration.CacheMode cacheMode) {
- return cacheMode == Configuration.CacheMode.INVALIDATION_ASYNC
- || cacheMode == Configuration.CacheMode.INVALIDATION_SYNC;
+ public static void sendEvictAllNotification(CacheAdapter cacheAdapter, AddressAdapter
member) {
+ EvictAll eKey = new EvictAll(member == null ? NoAddress.INSTANCE : member);
+ cacheAdapter.put(eKey, Internal.EVICT);
}
- /**
- * Is this cache participating in a cluster with replication?
- *
- * @param cache
- * The cache to check.
- * @return True if the cache is configured for synchronous/asynchronous invalidation;
false
- * otherwise.
- */
- public static boolean isClusteredReplication(Cache cache) {
- return isClusteredReplication(cache.getConfiguration().getCacheMode());
+ public static boolean isEvictAllNotification(Object key) {
+ return key instanceof EvictAll;
}
- /**
- * Does this cache mode indicate clustered replication?
- *
- * @param cacheMode
- * The cache to check
- * @return True if the cache mode is confiogured for synchronous/asynchronous
invalidation; false
- * otherwise.
- */
- public static boolean isClusteredReplication(Configuration.CacheMode cacheMode) {
- return cacheMode == Configuration.CacheMode.REPL_ASYNC || cacheMode ==
Configuration.CacheMode.REPL_SYNC;
+ public static boolean containsEvictAllNotification(Set keySet, AddressAdapter member)
{
+ EvictAll eKey = new EvictAll(member == null ? NoAddress.INSTANCE : member);
+ return keySet.contains(eKey);
}
- public static boolean isSynchronous(Cache cache) {
- return isSynchronous(cache.getConfiguration().getCacheMode());
+ public static boolean isEvictAllNotification(Object key, Object value) {
+ return key instanceof EvictAll && value == Internal.EVICT;
}
- public static boolean isSynchronous(Configuration.CacheMode cacheMode) {
- return cacheMode == Configuration.CacheMode.REPL_SYNC || cacheMode ==
Configuration.CacheMode.INVALIDATION_SYNC;
- }
+ private static class EvictAll implements Externalizable {
+ AddressAdapter member;
- public static Set getKeySet(Cache cache) {
- return cache.keySet();
- }
-
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>get(Fqn, Object)</code>, wrapping any exception in a {@link
CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- */
- public static Object get(Cache cache, Object key) throws CacheException {
- try {
- return cache.get(key);
- } catch (Exception e) {
- throw new CacheException(e);
+ EvictAll(AddressAdapter member) {
+ this.member = member;
}
- }
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>get(Fqn, Object)</code>, wrapping any exception in a {@link
CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- */
- public static Object getAllowingTimeout(Cache cache, Object key) throws CacheException
{
- try {
- return cache.get(key);
- } catch (TimeoutException ignored) {
- // ignore it
- return null;
- } catch (Exception e) {
- throw new CacheException(e);
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == this)
+ return true;
+ if (!(obj instanceof EvictAll))
+ return false;
+ EvictAll ek = (EvictAll) obj;
+ return ek.member.equals(member);
}
- }
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>put(Object, Object)</code>, wrapping any exception in a {@link
CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- * @param value
- * data to store in the cache node
- */
- public static void put(Cache cache, Object key, Object value) throws CacheException {
- put(cache, key, value, null);
- }
-
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>put(Object, Object)</code>, wrapping any exception in a {@link
CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- * @param value
- * data to store in the cache node
- * @param option
- * invocation Option to set for this invocation. May be
<code>null</code>.
- */
- public static void put(Cache cache, Object key, Object value, Flag option) throws
CacheException {
- try {
- cache.getAdvancedCache().put(key, value, option);
- } catch (Exception e) {
- throw new CacheException(e);
+ @Override
+ public int hashCode() {
+ int result = 17;
+ result = 31 * result + member.hashCode();
+ return result;
}
- }
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>put(Object, Object)</code>, ignoring any {@link TimeoutException}
and wrapping any other
- * exception in a {@link CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- * @param value
- * data to store in the cache node
- * @param option
- * invocation Option to set for this invocation. May be
<code>null</code>.
- */
- public static void putAllowingTimeout(Cache cache, Object key, Object value, Flag...
option) throws CacheException {
- try {
- cache.getAdvancedCache().put(key, value, option);
- } catch (TimeoutException allowed) {
- // ignore it
- } catch (Exception e) {
- throw new CacheException(e);
+ public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException
{
+ member = (AddressAdapter) in.readObject();
}
- }
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>putForExternalRead(Object, Object)</code>, wrapping any exception
in a
- * {@link CacheException}. Ignores any JBoss Cache {@link TimeoutException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- * @param value
- * data to store in the cache node
- */
- public static boolean putForExternalRead(Cache cache, Object key, Object value) throws
CacheException {
- return putForExternalRead(cache, key, value, (Flag[])null);
- }
-
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>putForExternalRead(Object, Object)</code>, wrapping any exception
in a
- * {@link CacheException}. Ignores any JBoss Cache {@link TimeoutException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- * @param value
- * data to store in the cache node
- * @param option
- * invocation Option to set for this invocation. May be
<code>null</code>.
- */
- public static boolean putForExternalRead(Cache cache, Object key, Object value,
Flag... option) throws CacheException {
- try {
- cache.getAdvancedCache().putForExternalRead(key, value, option);
- return true;
- } catch (TimeoutException te) {
- // ignore!
- log.debug("ignoring write lock acquisition failure");
- return false;
- } catch (Throwable t) {
- throw new CacheException(t);
+ public void writeExternal(ObjectOutput out) throws IOException {
+ out.writeObject(member);
}
}
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>removeNode(Fqn)</code>, wrapping any exception in a {@link
CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- */
- public static void remove(Cache cache, Object key) throws CacheException {
- remove(cache, key, null);
+ private enum NoAddress implements AddressAdapter {
+ INSTANCE;
}
- /**
- * Builds an {@link Fqn} from <code>region</code> and
<code>key</code> and performs a JBoss Cache
- * <code>removeNode(Fqn)</code>, wrapping any exception in a {@link
CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param key
- * specific key to append to the <code>region</code> to form the
full Fqn
- * @param option
- * invocation Option to set for this invocation. May be
<code>null</code>.
- */
- public static void remove(Cache cache, Object key, Flag option) throws CacheException
{
- try {
- cache.getAdvancedCache().remove(key, option);
- } catch (Exception e) {
- throw new CacheException(e);
- }
+ private enum Internal {
+ INIT, EVICT;
}
- /**
- * Performs a JBoss Cache <code>removeNode(Fqn)</code>, wrapping any
exception in a
- * {@link CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- */
- public static void removeAll(Cache cache) throws CacheException {
- try {
- cache.clear();
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
-
- /**
- * Performs a JBoss Cache <code>removeNode(Fqn)</code>, wrapping any
exception in a
- * {@link CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param option
- * invocation Option to set for this invocation. May be
<code>null</code>.
- */
- public static void removeAll(Cache cache, Flag option) throws CacheException {
- try {
- cache.getAdvancedCache().clear(option);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
-
- /**
- * Performs a JBoss Cache <code>removeNode(Fqn)</code>, wrapping any
exception in a
- * {@link CacheException}.
- *
- * @param cache
- * the cache to invoke on
- * @param region
- * base Fqn for the cache region
- * @param option
- * invocation Option to set for this invocation. May be
<code>null</code>.
- */
- public static void removeKey(Cache cache, Object key, Flag option) throws
CacheException {
- try {
- cache.getAdvancedCache().remove(key, option);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
-
- public static void removeKey(Cache cache, Object key) throws CacheException {
- try {
- cache.remove(key);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
-
- public static boolean containsKey(Cache cache, Object key, Flag... flags) {
- try {
- return cache.getAdvancedCache().containsKey(key, flags);
- } catch (Exception e) {
- throw new CacheException(e);
- }
- }
-
}
Added:
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/FlagAdapter.java
===================================================================
---
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/FlagAdapter.java
(rev 0)
+++
core/trunk/cache-infinispan/src/main/java/org/hibernate/cache/infinispan/util/FlagAdapter.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -0,0 +1,59 @@
+/*
+ * JBoss, Home of Professional Open Source.
+ * Copyright 2009, Red Hat, Inc. and/or its affiliates, and
+ * individual contributors as indicated by the @author tags. See the
+ * copyright.txt file in the distribution for a full listing of
+ * individual contributors.
+ *
+ * This is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU Lesser General Public License as
+ * published by the Free Software Foundation; either version 2.1 of
+ * the License, or (at your option) any later version.
+ *
+ * This software is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this software; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
+ * 02110-1301 USA, or see the FSF site:
http://www.fsf.org.
+ */
+package org.hibernate.cache.infinispan.util;
+
+import org.hibernate.cache.CacheException;
+import org.infinispan.context.Flag;
+
+/**
+ * FlagAdapter.
+ *
+ * @author Galder Zamarreño
+ * @since 3.5
+ */
+public enum FlagAdapter {
+ ZERO_LOCK_ACQUISITION_TIMEOUT,
+ CACHE_MODE_LOCAL,
+ FORCE_ASYNCHRONOUS;
+
+ Flag toFlag() {
+ switch(this) {
+ case ZERO_LOCK_ACQUISITION_TIMEOUT:
+ return Flag.ZERO_LOCK_ACQUISITION_TIMEOUT;
+ case CACHE_MODE_LOCAL:
+ return Flag.CACHE_MODE_LOCAL;
+ case FORCE_ASYNCHRONOUS:
+ return Flag.FORCE_ASYNCHRONOUS;
+ default:
+ throw new CacheException("Unmatched Infinispan flag " + this);
+ }
+ }
+
+ static Flag[] toFlags(FlagAdapter[] adapters) {
+ Flag[] flags = new Flag[adapters.length];
+ for (int i = 0; i < adapters.length; i++) {
+ flags[i] = adapters[i].toFlag();
+ }
+ return flags;
+ }
+}
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractGeneralDataRegionTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractGeneralDataRegionTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractGeneralDataRegionTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -29,10 +29,9 @@
import org.hibernate.cache.QueryResultsRegion;
import org.hibernate.cache.Region;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
-import org.hibernate.cache.infinispan.util.CacheHelper;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
import org.hibernate.cfg.Configuration;
import org.hibernate.test.cache.infinispan.util.CacheTestUtil;
-import org.infinispan.Cache;
import org.infinispan.transaction.tm.BatchModeTransactionManager;
/**
@@ -74,8 +73,8 @@
private void evictOrRemoveTest() throws Exception {
Configuration cfg = createConfiguration();
InfinispanRegionFactory regionFactory = CacheTestUtil.startRegionFactory(cfg,
getCacheTestSupport());
- Cache localCache = getInfinispanCache(regionFactory);
- boolean invalidation = CacheHelper.isClusteredInvalidation(localCache);
+ CacheAdapter localCache = getInfinispanCache(regionFactory);
+ boolean invalidation = localCache.isClusteredInvalidation();
// Sleep a bit to avoid concurrent FLUSH problem
avoidConcurrentFlush();
@@ -123,7 +122,7 @@
private void evictOrRemoveAllTest(String configName) throws Exception {
Configuration cfg = createConfiguration();
InfinispanRegionFactory regionFactory = CacheTestUtil.startRegionFactory(cfg,
getCacheTestSupport());
- Cache localCache = getInfinispanCache(regionFactory);
+ CacheAdapter localCache = getInfinispanCache(regionFactory);
// Sleep a bit to avoid concurrent FLUSH problem
avoidConcurrentFlush();
@@ -133,7 +132,7 @@
cfg = createConfiguration();
regionFactory = CacheTestUtil.startRegionFactory(cfg, getCacheTestSupport());
- Cache remoteCache = getInfinispanCache(regionFactory);
+ CacheAdapter remoteCache = getInfinispanCache(regionFactory);
// Sleep a bit to avoid concurrent FLUSH problem
avoidConcurrentFlush();
@@ -141,11 +140,11 @@
GeneralDataRegion remoteRegion = (GeneralDataRegion) createRegion(regionFactory,
getStandardRegionName(REGION_PREFIX), cfg.getProperties(), null);
- Set children = CacheHelper.getKeySet(localCache);
- assertEquals("No children in " + children, 0, children.size());
+ Set keys = localCache.keySet();
+ assertEquals("No valid children in " + keys, 0, getValidKeyCount(keys));
- children = CacheHelper.getKeySet(remoteCache);
- assertEquals("No children in " + children, 0, children.size());
+ keys = remoteCache.keySet();
+ assertEquals("No valid children in " + keys, 0, getValidKeyCount(keys));
assertNull("local is clean", localRegion.get(KEY));
assertNull("remote is clean", remoteRegion.get(KEY));
@@ -168,11 +167,13 @@
sleep(250);
// This should re-establish the region root node in the optimistic case
assertNull(localRegion.get(KEY));
+ assertEquals("No valid children in " + keys, 0,
getValidKeyCount(localCache.keySet()));
// Re-establishing the region root on the local node doesn't
// propagate it to other nodes. Do a get on the remote node to re-establish
// This only adds a node in the case of optimistic locking
assertEquals(null, remoteRegion.get(KEY));
+ assertEquals("No valid children in " + keys, 0,
getValidKeyCount(remoteCache.keySet()));
assertEquals("local is clean", null, localRegion.get(KEY));
assertEquals("remote is clean", null, remoteRegion.get(KEY));
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractNonFunctionalTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -23,7 +23,10 @@
*/
package org.hibernate.test.cache.infinispan;
+import java.util.Set;
+
import org.hibernate.cache.RegionFactory;
+import org.hibernate.cache.infinispan.util.CacheHelper;
import org.hibernate.junit.UnitTestCase;
import org.hibernate.test.cache.infinispan.util.CacheTestSupport;
import org.infinispan.Cache;
@@ -81,7 +84,7 @@
protected CacheTestSupport getCacheTestSupport() {
return testSupport;
}
-
+
protected void sleep(long ms) {
try {
Thread.sleep(ms);
@@ -94,4 +97,15 @@
protected void avoidConcurrentFlush() {
testSupport.avoidConcurrentFlush();
}
+
+ protected int getValidKeyCount(Set keys) {
+ int result = 0;
+ for (Object key : keys) {
+ if (!(CacheHelper.isEvictAllNotification(key))) {
+ result++;
+ }
+ }
+ return result;
+ }
+
}
\ No newline at end of file
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionImplTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionImplTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/AbstractRegionImplTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -29,8 +29,8 @@
import org.hibernate.cache.Region;
import org.hibernate.cache.impl.CacheDataDescriptionImpl;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
import org.hibernate.util.ComparableComparator;
-import org.infinispan.Cache;
/**
* Base class for tests of Region implementations.
@@ -44,7 +44,7 @@
super(name);
}
- protected abstract Cache getInfinispanCache(InfinispanRegionFactory regionFactory);
+ protected abstract CacheAdapter getInfinispanCache(InfinispanRegionFactory
regionFactory);
protected abstract Region createRegion(InfinispanRegionFactory regionFactory, String
regionName, Properties properties, CacheDataDescription cdd);
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/InfinispanRegionFactoryTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/InfinispanRegionFactoryTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/InfinispanRegionFactoryTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -29,7 +29,7 @@
import org.hibernate.cache.infinispan.entity.EntityRegionImpl;
import org.hibernate.cache.infinispan.query.QueryResultsRegionImpl;
import org.hibernate.cache.infinispan.timestamp.TimestampsRegionImpl;
-import org.infinispan.Cache;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
import org.infinispan.config.Configuration;
import org.infinispan.config.Configuration.CacheMode;
import org.infinispan.eviction.EvictionStrategy;
@@ -125,13 +125,13 @@
assertFalse(factory.getDefinedConfigurations().contains(person));
assertNotNull(factory.getTypeOverrides().get(addresses));
assertFalse(factory.getDefinedConfigurations().contains(addresses));
- Cache cache = null;
+ CacheAdapter cache = null;
EntityRegionImpl region = (EntityRegionImpl) factory.buildEntityRegion(person,
p, null);
assertNotNull(factory.getTypeOverrides().get(person));
assertTrue(factory.getDefinedConfigurations().contains(person));
assertNull(factory.getTypeOverrides().get(address));
- cache = region.getCache();
+ cache = region.getCacheAdapter();
Configuration cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.LRU, cacheCfg.getEvictionStrategy());
assertEquals(2000, cacheCfg.getEvictionWakeUpInterval());
@@ -143,7 +143,7 @@
assertNotNull(factory.getTypeOverrides().get(person));
assertTrue(factory.getDefinedConfigurations().contains(person));
assertNull(factory.getTypeOverrides().get(address));
- cache = region.getCache();
+ cache = region.getCacheAdapter();
cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.FIFO, cacheCfg.getEvictionStrategy());
assertEquals(3000, cacheCfg.getEvictionWakeUpInterval());
@@ -153,7 +153,7 @@
assertNotNull(factory.getTypeOverrides().get(person));
assertTrue(factory.getDefinedConfigurations().contains(person));
assertNull(factory.getTypeOverrides().get(address));
- cache = region.getCache();
+ cache = region.getCacheAdapter();
cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.FIFO, cacheCfg.getEvictionStrategy());
assertEquals(3000, cacheCfg.getEvictionWakeUpInterval());
@@ -163,7 +163,7 @@
assertNotNull(factory.getTypeOverrides().get(addresses));
assertTrue(factory.getDefinedConfigurations().contains(person));
assertNull(factory.getTypeOverrides().get(parts));
- cache = collectionRegion .getCache();
+ cache = collectionRegion .getCacheAdapter();
cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.FIFO, cacheCfg.getEvictionStrategy());
assertEquals(2500, cacheCfg.getEvictionWakeUpInterval());
@@ -175,7 +175,7 @@
assertNotNull(factory.getTypeOverrides().get(addresses));
assertTrue(factory.getDefinedConfigurations().contains(addresses));
assertNull(factory.getTypeOverrides().get(parts));
- cache = collectionRegion.getCache();
+ cache = collectionRegion.getCacheAdapter();
cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.LRU, cacheCfg.getEvictionStrategy());
assertEquals(3500, cacheCfg.getEvictionWakeUpInterval());
@@ -185,7 +185,7 @@
assertNotNull(factory.getTypeOverrides().get(addresses));
assertTrue(factory.getDefinedConfigurations().contains(addresses));
assertNull(factory.getTypeOverrides().get(parts));
- cache = collectionRegion.getCache();
+ cache = collectionRegion.getCacheAdapter();
cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.LRU, cacheCfg.getEvictionStrategy());
assertEquals(3500, cacheCfg.getEvictionWakeUpInterval());
@@ -196,7 +196,7 @@
}
public void testBuildEntityCollectionRegionOverridesOnly() {
- Cache cache = null;
+ CacheAdapter cache = null;
Properties p = new Properties();
p.setProperty("hibernate.cache.infinispan.entity.eviction.strategy",
"FIFO");
p.setProperty("hibernate.cache.infinispan.entity.eviction.wake_up_interval",
"3000");
@@ -211,7 +211,7 @@
try {
EntityRegionImpl region = (EntityRegionImpl)
factory.buildEntityRegion("com.acme.Address", p, null);
assertNull(factory.getTypeOverrides().get("com.acme.Address"));
- cache = region.getCache();
+ cache = region.getCacheAdapter();
Configuration cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.FIFO, cacheCfg.getEvictionStrategy());
assertEquals(3000, cacheCfg.getEvictionWakeUpInterval());
@@ -220,7 +220,7 @@
CollectionRegionImpl collectionRegion = (CollectionRegionImpl)
factory.buildCollectionRegion("com.acme.Person.addresses", p, null);
assertNull(factory.getTypeOverrides().get("com.acme.Person.addresses"));
- cache = collectionRegion.getCache();
+ cache = collectionRegion.getCacheAdapter();
cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.LRU, cacheCfg.getEvictionStrategy());
assertEquals(3500, cacheCfg.getEvictionWakeUpInterval());
@@ -252,7 +252,7 @@
EntityRegionImpl region = (EntityRegionImpl) factory.buildEntityRegion(person,
p, null);
assertNotNull(factory.getTypeOverrides().get(person));
assertTrue(factory.getDefinedConfigurations().contains(person));
- Cache cache = region.getCache();
+ CacheAdapter cache = region.getCacheAdapter();
Configuration cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.LRU, cacheCfg.getEvictionStrategy());
assertEquals(3000, cacheCfg.getEvictionWakeUpInterval());
@@ -297,7 +297,7 @@
config.setFetchInMemoryState(false);
manager.defineConfiguration("timestamps", config);
TimestampsRegionImpl region = (TimestampsRegionImpl)
factory.buildTimestampsRegion(timestamps, p);
- Cache cache = region.getCache();
+ CacheAdapter cache = region.getCacheAdapter();
Configuration cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.NONE, cacheCfg.getEvictionStrategy());
assertEquals(CacheMode.REPL_ASYNC, cacheCfg.getCacheMode());
@@ -324,7 +324,7 @@
config.setCacheMode(CacheMode.REPL_SYNC);
manager.defineConfiguration("unrecommended-timestamps", config);
TimestampsRegionImpl region = (TimestampsRegionImpl)
factory.buildTimestampsRegion(timestamps, p);
- Cache cache = region.getCache();
+ CacheAdapter cache = region.getCacheAdapter();
Configuration cacheCfg = cache.getConfiguration();
assertEquals(EvictionStrategy.NONE, cacheCfg.getEvictionStrategy());
assertEquals(CacheMode.REPL_SYNC, cacheCfg.getCacheMode());
@@ -400,7 +400,7 @@
try {
assertTrue(factory.getDefinedConfigurations().contains("local-query"));
QueryResultsRegionImpl region = (QueryResultsRegionImpl)
factory.buildQueryResultsRegion(query, p);
- Cache cache = region.getCache();
+ CacheAdapter cache = region.getCacheAdapter();
Configuration cacheCfg = cache.getConfiguration();
assertEquals(CacheMode.LOCAL, cacheCfg.getCacheMode());
} finally {
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/collection/AbstractCollectionRegionAccessStrategyTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/collection/AbstractCollectionRegionAccessStrategyTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/collection/AbstractCollectionRegionAccessStrategyTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -38,13 +38,12 @@
import org.hibernate.cache.impl.CacheDataDescriptionImpl;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
import org.hibernate.cache.infinispan.impl.BaseRegion;
-import org.hibernate.cache.infinispan.util.CacheHelper;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.FlagAdapter;
import org.hibernate.cfg.Configuration;
import org.hibernate.test.cache.infinispan.AbstractNonFunctionalTestCase;
import org.hibernate.test.cache.infinispan.util.CacheTestUtil;
import org.hibernate.util.ComparableComparator;
-import org.infinispan.Cache;
-import org.infinispan.context.Flag;
import org.infinispan.transaction.tm.BatchModeTransactionManager;
/**
@@ -64,10 +63,10 @@
protected static Configuration localCfg;
protected static InfinispanRegionFactory localRegionFactory;
- protected Cache localCache;
+ protected CacheAdapter localCache;
protected static Configuration remoteCfg;
protected static InfinispanRegionFactory remoteRegionFactory;
- protected Cache remoteCache;
+ protected CacheAdapter remoteCache;
protected CollectionRegion localCollectionRegion;
protected CollectionRegionAccessStrategy localAccessStrategy;
@@ -112,17 +111,17 @@
localCollectionRegion = localRegionFactory.buildCollectionRegion(REGION_NAME,
localCfg.getProperties(),
getCacheDataDescription());
- localCache = ((BaseRegion) localCollectionRegion).getCache();
+ localCache = ((BaseRegion) localCollectionRegion).getCacheAdapter();
localAccessStrategy = localCollectionRegion.buildAccessStrategy(getAccessType());
- invalidation = CacheHelper.isClusteredInvalidation(localCache);
- synchronous = CacheHelper.isSynchronous(localCache);
+ invalidation = localCache.isClusteredInvalidation();
+ synchronous = localCache.isSynchronous();
// Sleep a bit to avoid concurrent FLUSH problem
avoidConcurrentFlush();
remoteCollectionRegion = remoteRegionFactory.buildCollectionRegion(REGION_NAME,
remoteCfg.getProperties(),
getCacheDataDescription());
- remoteCache = ((BaseRegion) remoteCollectionRegion).getCache();
+ remoteCache = ((BaseRegion) remoteCollectionRegion).getCacheAdapter();
remoteAccessStrategy =
remoteCollectionRegion.buildAccessStrategy(getAccessType());
node1Exception = null;
@@ -142,13 +141,13 @@
remoteCollectionRegion.destroy();
try {
- localCache.getAdvancedCache().clear(Flag.CACHE_MODE_LOCAL);
+ localCache.withFlags(FlagAdapter.CACHE_MODE_LOCAL).clear();
} catch (Exception e) {
log.error("Problem purging local cache", e);
}
try {
- remoteCache.getAdvancedCache().clear(Flag.CACHE_MODE_LOCAL);
+ remoteCache.withFlags(FlagAdapter.CACHE_MODE_LOCAL).clear();
} catch (Exception e) {
log.error("Problem purging remote cache", e);
}
@@ -402,9 +401,9 @@
final String KEY = KEY_BASE + testCount++;
- assertEquals(0, localCache.keySet().size());
+ assertEquals(0, getValidKeyCount(localCache.keySet()));
- assertEquals(0, remoteCache.keySet().size());
+ assertEquals(0, getValidKeyCount(remoteCache.keySet()));
assertNull("local is clean", localAccessStrategy.get(KEY,
System.currentTimeMillis()));
assertNull("remote is clean", remoteAccessStrategy.get(KEY,
System.currentTimeMillis()));
@@ -425,19 +424,19 @@
// This should re-establish the region root node
assertNull(localAccessStrategy.get(KEY, System.currentTimeMillis()));
- assertEquals(0, localCache.keySet().size());
+ assertEquals(0, getValidKeyCount(localCache.keySet()));
// Re-establishing the region root on the local node doesn't
// propagate it to other nodes. Do a get on the remote node to re-establish
assertEquals(null, remoteAccessStrategy.get(KEY, System.currentTimeMillis()));
- assertEquals(0, remoteCache.keySet().size());
+ assertEquals(0, getValidKeyCount(remoteCache.keySet()));
// Test whether the get above messes up the optimistic version
remoteAccessStrategy.putFromLoad(KEY, VALUE1, System.currentTimeMillis(), new
Integer(1));
assertEquals(VALUE1, remoteAccessStrategy.get(KEY, System.currentTimeMillis()));
- assertEquals(1, remoteCache.keySet().size());
+ assertEquals(1, getValidKeyCount(remoteCache.keySet()));
// Wait for async propagation of the putFromLoad
sleep(250);
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/AbstractEntityRegionAccessStrategyTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/AbstractEntityRegionAccessStrategyTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/AbstractEntityRegionAccessStrategyTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -38,13 +38,12 @@
import org.hibernate.cache.impl.CacheDataDescriptionImpl;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
import org.hibernate.cache.infinispan.impl.BaseRegion;
-import org.hibernate.cache.infinispan.util.CacheHelper;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.FlagAdapter;
import org.hibernate.cfg.Configuration;
import org.hibernate.test.cache.infinispan.AbstractNonFunctionalTestCase;
import org.hibernate.test.cache.infinispan.util.CacheTestUtil;
import org.hibernate.util.ComparableComparator;
-import org.infinispan.Cache;
-import org.infinispan.context.Flag;
import org.infinispan.transaction.tm.BatchModeTransactionManager;
/**
@@ -64,10 +63,10 @@
protected static Configuration localCfg;
protected static InfinispanRegionFactory localRegionFactory;
- protected Cache localCache;
+ protected CacheAdapter localCache;
protected static Configuration remoteCfg;
protected static InfinispanRegionFactory remoteRegionFactory;
- protected Cache remoteCache;
+ protected CacheAdapter remoteCache;
protected boolean invalidation;
protected boolean synchronous;
@@ -114,10 +113,10 @@
.getProperties(), getCacheDataDescription());
localAccessStrategy = localEntityRegion.buildAccessStrategy(getAccessType());
- localCache = ((BaseRegion) localEntityRegion).getCache();
+ localCache = ((BaseRegion) localEntityRegion).getCacheAdapter();
- invalidation = CacheHelper.isClusteredInvalidation(localCache);
- synchronous = CacheHelper.isSynchronous(localCache);
+ invalidation = localCache.isClusteredInvalidation();
+ synchronous = localCache.isSynchronous();
// Sleep a bit to avoid concurrent FLUSH problem
avoidConcurrentFlush();
@@ -126,7 +125,7 @@
.getProperties(), getCacheDataDescription());
remoteAccessStrategy = remoteEntityRegion.buildAccessStrategy(getAccessType());
- remoteCache = ((BaseRegion) remoteEntityRegion).getCache();
+ remoteCache = ((BaseRegion) remoteEntityRegion).getCacheAdapter();
node1Exception = null;
node2Exception = null;
@@ -145,13 +144,13 @@
remoteEntityRegion.destroy();
try {
- localCache.getAdvancedCache().clear(Flag.CACHE_MODE_LOCAL);
+ localCache.withFlags(FlagAdapter.CACHE_MODE_LOCAL).clear();
} catch (Exception e) {
log.error("Problem purging local cache", e);
}
try {
- remoteCache.getAdvancedCache().clear(Flag.CACHE_MODE_LOCAL);
+ remoteCache.withFlags(FlagAdapter.CACHE_MODE_LOCAL).clear();
} catch (Exception e) {
log.error("Problem purging remote cache", e);
}
@@ -560,8 +559,9 @@
}
private void evictOrRemoveTest(boolean evict) {
-
final String KEY = KEY_BASE + testCount++;
+ assertEquals(0, getValidKeyCount(localCache.keySet()));
+ assertEquals(0, getValidKeyCount(remoteCache.keySet()));
assertNull("local is clean", localAccessStrategy.get(KEY,
System.currentTimeMillis()));
assertNull("remote is clean", remoteAccessStrategy.get(KEY,
System.currentTimeMillis()));
@@ -571,26 +571,21 @@
remoteAccessStrategy.putFromLoad(KEY, VALUE1, System.currentTimeMillis(), new
Integer(1));
assertEquals(VALUE1, remoteAccessStrategy.get(KEY, System.currentTimeMillis()));
- // Wait for async propagation
- sleep(250);
-
if (evict)
localAccessStrategy.evict(KEY);
else
localAccessStrategy.remove(KEY);
assertEquals(null, localAccessStrategy.get(KEY, System.currentTimeMillis()));
-
+ assertEquals(0, getValidKeyCount(localCache.keySet()));
assertEquals(null, remoteAccessStrategy.get(KEY, System.currentTimeMillis()));
+ assertEquals(0, getValidKeyCount(remoteCache.keySet()));
}
private void evictOrRemoveAllTest(boolean evict) {
-
final String KEY = KEY_BASE + testCount++;
-
- assertEquals(0, localCache.keySet().size());
- assertEquals(0, remoteCache.keySet().size());
-
+ assertEquals(0, getValidKeyCount(localCache.keySet()));
+ assertEquals(0, getValidKeyCount(remoteCache.keySet()));
assertNull("local is clean", localAccessStrategy.get(KEY,
System.currentTimeMillis()));
assertNull("remote is clean", remoteAccessStrategy.get(KEY,
System.currentTimeMillis()));
@@ -606,28 +601,27 @@
// Wait for async propagation
sleep(250);
- if (evict)
+ if (evict) {
+ log.debug("Call evict all locally");
localAccessStrategy.evictAll();
- else
+ } else {
localAccessStrategy.removeAll();
+ }
// This should re-establish the region root node in the optimistic case
assertNull(localAccessStrategy.get(KEY, System.currentTimeMillis()));
+ assertEquals(0, getValidKeyCount(localCache.keySet()));
- assertEquals(0, localCache.keySet().size());
-
// Re-establishing the region root on the local node doesn't
// propagate it to other nodes. Do a get on the remote node to re-establish
assertEquals(null, remoteAccessStrategy.get(KEY, System.currentTimeMillis()));
+ assertEquals(0, getValidKeyCount(remoteCache.keySet()));
- assertEquals(0, remoteCache.keySet().size());
-
// Test whether the get above messes up the optimistic version
remoteAccessStrategy.putFromLoad(KEY, VALUE1, System.currentTimeMillis(), new
Integer(1));
assertEquals(VALUE1, remoteAccessStrategy.get(KEY, System.currentTimeMillis()));
+ assertEquals(1, getValidKeyCount(remoteCache.keySet()));
- assertEquals(1, remoteCache.keySet().size());
-
// Wait for async propagation
sleep(250);
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/EntityRegionImplTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/EntityRegionImplTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/entity/EntityRegionImplTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -32,8 +32,9 @@
import org.hibernate.cache.RegionFactory;
import org.hibernate.cache.access.AccessType;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.CacheAdapterImpl;
import org.hibernate.test.cache.infinispan.AbstractEntityCollectionRegionTestCase;
-import org.infinispan.Cache;
/**
* Tests of EntityRegionImpl.
@@ -94,8 +95,8 @@
}
@Override
- protected Cache getInfinispanCache(InfinispanRegionFactory regionFactory) {
- return regionFactory.getCacheManager().getCache("entity");
+ protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
+ return
CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache("entity"));
}
}
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/AbstractFunctionalTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/AbstractFunctionalTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/AbstractFunctionalTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -26,7 +26,7 @@
public String getCacheConcurrencyStrategy() {
return cacheConcurrencyStrategy;
}
-
+
public void testEmptySecondLevelCacheEntry() throws Exception {
getSessions().getCache().evictEntityRegion(Item.class.getName());
Statistics stats = getSessions().getStatistics();
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/BasicTransactionalTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -1,6 +1,7 @@
package org.hibernate.test.cache.infinispan.functional;
import java.io.Serializable;
+import java.util.Map;
import org.hibernate.Session;
import org.hibernate.Transaction;
@@ -63,6 +64,8 @@
assertEquals(item.getName(), loadedWithCachedCollection.getName());
assertEquals(item.getItems().size(),
loadedWithCachedCollection.getItems().size());
assertEquals(1, cStats.getHitCount());
+ Map cacheEntries = cStats.getEntries();
+ assertEquals(1, cacheEntries.size());
s.close();
}
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/bulk/BulkOperationsTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -32,6 +32,7 @@
import org.hibernate.cfg.Environment;
import org.hibernate.classic.Session;
import org.hibernate.junit.functional.FunctionalTestCase;
+import org.hibernate.stat.SecondLevelCacheStatistics;
import org.hibernate.test.cache.infinispan.functional.Contact;
import org.hibernate.test.cache.infinispan.functional.Customer;
import org.hibernate.transaction.CMTTransactionFactory;
@@ -48,30 +49,31 @@
public class BulkOperationsTestCase extends FunctionalTestCase {
private static final Logger log =
LoggerFactory.getLogger(BulkOperationsTestCase.class);
-
+
private TransactionManager tm;
-
+
public BulkOperationsTestCase(String string) {
super(string);
}
public String[] getMappings() {
- return new String[] { "cache/infinispan/functional/Contact.hbm.xml",
"cache/infinispan/functional/Customer.hbm.xml" };
+ return new String[] { "cache/infinispan/functional/Contact.hbm.xml",
+ "cache/infinispan/functional/Customer.hbm.xml" };
}
-
+
@Override
public String getCacheConcurrencyStrategy() {
return "transactional";
}
-
+
protected Class getTransactionFactoryClass() {
- return CMTTransactionFactory.class;
+ return CMTTransactionFactory.class;
}
protected Class getConnectionProviderClass() {
return org.hibernate.test.cache.infinispan.tm.XaConnectionProvider.class;
}
-
+
protected Class<? extends TransactionManagerLookup>
getTransactionManagerLookupClass() {
return org.hibernate.test.cache.infinispan.tm.XaTransactionManagerLookup.class;
}
@@ -81,11 +83,13 @@
cfg.setProperty(Environment.USE_SECOND_LEVEL_CACHE, "true");
cfg.setProperty(Environment.GENERATE_STATISTICS, "true");
+ cfg.setProperty(Environment.USE_QUERY_CACHE, "false");
cfg.setProperty(Environment.CONNECTION_PROVIDER,
getConnectionProviderClass().getName());
- cfg.setProperty(Environment.TRANSACTION_MANAGER_STRATEGY,
getTransactionManagerLookupClass().getName());
-
+ cfg.setProperty(Environment.TRANSACTION_MANAGER_STRATEGY,
getTransactionManagerLookupClass()
+ .getName());
+
Class transactionFactory = getTransactionFactoryClass();
- cfg.setProperty( Environment.TRANSACTION_STRATEGY, transactionFactory.getName());
+ cfg.setProperty(Environment.TRANSACTION_STRATEGY, transactionFactory.getName());
}
public void testBulkOperations() throws Throwable {
@@ -93,14 +97,19 @@
boolean cleanedUp = false;
try {
tm =
getTransactionManagerLookupClass().newInstance().getTransactionManager(null);
-
+
createContacts();
List<Integer> rhContacts = getContactsByCustomer("Red Hat");
assertNotNull("Red Hat contacts exist", rhContacts);
assertEquals("Created expected number of Red Hat contacts", 10,
rhContacts.size());
+ SecondLevelCacheStatistics contactSlcs = getEnvironment().getSessionFactory()
+
.getStatistics().getSecondLevelCacheStatistics(Contact.class.getName());
+ assertEquals(20, contactSlcs.getElementCountInMemory());
+
assertEquals("Deleted all Red Hat contacts", 10, deleteContacts());
+ assertEquals(0, contactSlcs.getElementCountInMemory());
List<Integer> jbContacts = getContactsByCustomer("JBoss");
assertNotNull("JBoss contacts exist", jbContacts);
@@ -115,6 +124,7 @@
}
updateContacts("Kabir", "Updated");
+ assertEquals(0, contactSlcs.getElementCountInMemory());
for (Integer id : jbContacts) {
Contact contact = getContact(id);
assertNotNull("JBoss contact " + id + " exists",
contact);
@@ -125,7 +135,20 @@
List<Integer> updated = getContactsByTLF("Updated");
assertNotNull("Got updated contacts", updated);
assertEquals("Updated contacts", 5, updated.size());
- } catch(Throwable t) {
+
+ updateContactsWithOneManual("Kabir", "UpdatedAgain");
+ assertEquals(contactSlcs.getElementCountInMemory(), 0);
+ for (Integer id : jbContacts) {
+ Contact contact = getContact(id);
+ assertNotNull("JBoss contact " + id + " exists",
contact);
+ String expected = ("Kabir".equals(contact.getName())) ?
"UpdatedAgain" : "2222";
+ assertEquals("JBoss contact " + id + " has correct TLF",
expected, contact.getTlf());
+ }
+
+ updated = getContactsByTLF("UpdatedAgain");
+ assertNotNull("Got updated contacts", updated);
+ assertEquals("Updated contacts", 5, updated.size());
+ } catch (Throwable t) {
cleanedUp = true;
log.debug("Exceptional cleanup");
cleanup(true);
@@ -185,8 +208,8 @@
try {
Session session = getSessions().getCurrentSession();
- List results =
session.createQuery(selectHQL).setFlushMode(FlushMode.AUTO).setParameter("cName",
customerName)
- .list();
+ List results =
session.createQuery(selectHQL).setFlushMode(FlushMode.AUTO).setParameter(
+ "cName", customerName).list();
tm.commit();
return results;
} catch (Exception e) {
@@ -203,7 +226,8 @@
try {
Session session = getSessions().getCurrentSession();
- List results =
session.createQuery(selectHQL).setFlushMode(FlushMode.AUTO).setParameter("cTLF",
tlf).list();
+ List results =
session.createQuery(selectHQL).setFlushMode(FlushMode.AUTO).setParameter(
+ "cTLF", tlf).list();
tm.commit();
return results;
} catch (Exception e) {
@@ -214,13 +238,30 @@
public int updateContacts(String name, String newTLF) throws Exception {
String updateHQL = "update Contact set tlf = :cNewTLF where name =
:cName";
+ tm.begin();
+ try {
+ Session session = getSessions().getCurrentSession();
+ int rowsAffected = session.createQuery(updateHQL).setFlushMode(FlushMode.AUTO)
+ .setParameter("cNewTLF",
newTLF).setParameter("cName", name).executeUpdate();
+ tm.commit();
+ return rowsAffected;
+ } catch (Exception e) {
+ tm.rollback();
+ throw e;
+ }
+ }
+ public int updateContactsWithOneManual(String name, String newTLF) throws Exception {
+ String queryHQL = "from Contact c where c.name = :cName";
+ String updateHQL = "update Contact set tlf = :cNewTLF where name =
:cName";
tm.begin();
try {
-
Session session = getSessions().getCurrentSession();
- int rowsAffected =
session.createQuery(updateHQL).setFlushMode(FlushMode.AUTO).setParameter("cNewTLF",
newTLF)
- .setParameter("cName", name).executeUpdate();
+ @SuppressWarnings("unchecked")
+ List<Contact> list =
session.createQuery(queryHQL).setParameter("cName", name).list();
+ list.get(0).setTlf(newTLF);
+ int rowsAffected = session.createQuery(updateHQL).setFlushMode(FlushMode.AUTO)
+ .setParameter("cNewTLF",
newTLF).setParameter("cName", name).executeUpdate();
tm.commit();
return rowsAffected;
} catch (Exception e) {
@@ -290,7 +331,7 @@
s.persist(customer);
s.getTransaction().commit();
s.close();
-
+
return customer;
} finally {
System.out.println("CREATE CUSTOMER " + id + " - END");
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/CacheAccessListener.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/CacheAccessListener.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/CacheAccessListener.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -26,6 +26,7 @@
import java.util.HashSet;
import java.util.Set;
+import org.hibernate.cache.infinispan.util.CacheHelper;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryCreated;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryModified;
@@ -50,7 +51,7 @@
@CacheEntryModified
public void nodeModified(CacheEntryModifiedEvent event) {
- if (!event.isPre()) {
+ if (!event.isPre() && !CacheHelper.isEvictAllNotification(event.getKey()))
{
Object key = event.getKey();
log.info("Modified node " + key);
modified.add(key.toString());
@@ -59,7 +60,7 @@
@CacheEntryCreated
public void nodeCreated(CacheEntryCreatedEvent event) {
- if (!event.isPre()) {
+ if (!event.isPre() && !CacheHelper.isEvictAllNotification(event.getKey()))
{
Object key = event.getKey();
log.info("Created node " + key);
modified.add(key.toString());
@@ -68,7 +69,7 @@
@CacheEntryVisited
public void nodeVisited(CacheEntryVisitedEvent event) {
- if (!event.isPre()) {
+ if (!event.isPre() && !CacheHelper.isEvictAllNotification(event.getKey()))
{
Object key = event.getKey();
log.info("Visited node " + key);
accessed.add(key.toString());
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/IsolatedClassLoaderTest.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/IsolatedClassLoaderTest.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/classloader/IsolatedClassLoaderTest.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -198,7 +198,7 @@
// Sleep a bit to allow async repl to happen
sleep(SLEEP_TIME);
-
+
assertEquals("Query cache used", 1,
remoteQueryListener.getSawRegionModificationCount());
remoteQueryListener.clearSawRegionModification();
@@ -207,12 +207,12 @@
assertEquals("63088 has correct # of accounts", 6,
dao1.getCountForBranch(branch, useNamedRegion));
assertEquals("Query cache used", 1,
remoteQueryListener.getSawRegionModificationCount());
remoteQueryListener.clearSawRegionModification();
-
+
sleep(SLEEP_TIME);
-
+
assertEquals("Query cache used", 1,
localQueryListener.getSawRegionModificationCount());
localQueryListener.clearSawRegionModification();
-
+
log.info("First query on node 1 done");
// Sleep a bit to allow async repl to happen
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/AbstractDualNodeTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/AbstractDualNodeTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/AbstractDualNodeTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -21,7 +21,10 @@
*/
package org.hibernate.test.cache.infinispan.functional.cluster;
+import java.util.Set;
+
import org.hibernate.Session;
+import org.hibernate.cache.infinispan.util.CacheHelper;
import org.hibernate.cfg.Configuration;
import org.hibernate.cfg.Environment;
import org.hibernate.cfg.Mappings;
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/EntityCollectionInvalidationTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/EntityCollectionInvalidationTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/functional/cluster/EntityCollectionInvalidationTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -30,11 +30,11 @@
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cache.CacheKey;
+import org.hibernate.cache.infinispan.util.CacheHelper;
import org.hibernate.test.cache.infinispan.functional.Contact;
import org.hibernate.test.cache.infinispan.functional.Customer;
import org.infinispan.Cache;
import org.infinispan.manager.CacheManager;
-import org.infinispan.marshall.MarshalledValue;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited;
import org.infinispan.notifications.cachelistener.event.CacheEntryVisitedEvent;
@@ -143,8 +143,8 @@
assertLoadedFromCache(remoteListener, ids.customerId, ids.contactIds);
// After modification, local cache should have been invalidated and hence should
be empty
- assertTrue(localCollectionCache.isEmpty());
- assertTrue(localCustomerCache.isEmpty());
+ assertEquals(0, getValidKeyCount(localCollectionCache.keySet()));
+ assertEquals(0, getValidKeyCount(localCustomerCache.keySet()));
} catch (Exception e) {
log.error("Error", e);
throw e;
@@ -307,6 +307,16 @@
.contains("Customer.contacts#" + custId));
}
+ protected int getValidKeyCount(Set keys) {
+ int result = 0;
+ for (Object key : keys) {
+ if (!(CacheHelper.isEvictAllNotification(key))) {
+ result++;
+ }
+ }
+ return result;
+ }
+
@Listener
public static class MyListener {
private static final Logger log = LoggerFactory.getLogger(MyListener.class);
@@ -329,8 +339,7 @@
public void nodeVisited(CacheEntryVisitedEvent event) {
log.debug(event.toString());
if (!event.isPre()) {
- MarshalledValue mv = (MarshalledValue) event.getKey();
- CacheKey cacheKey = (CacheKey) mv.get();
+ CacheKey cacheKey = (CacheKey) event.getKey();
Integer primKey = (Integer) cacheKey.getKey();
String key = (String) cacheKey.getEntityOrRoleName() + '#' +
primKey;
log.debug("MyListener[" + name +"] - Visiting key " +
key);
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/query/QueryRegionImplTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/query/QueryRegionImplTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/query/QueryRegionImplTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -34,10 +34,11 @@
import org.hibernate.cache.Region;
import org.hibernate.cache.StandardQueryCache;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.CacheAdapterImpl;
import org.hibernate.cfg.Configuration;
import org.hibernate.test.cache.infinispan.AbstractGeneralDataRegionTestCase;
import org.hibernate.test.cache.infinispan.util.CacheTestUtil;
-import org.infinispan.Cache;
import org.infinispan.notifications.Listener;
import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited;
import org.infinispan.notifications.cachelistener.event.CacheEntryVisitedEvent;
@@ -74,8 +75,8 @@
}
@Override
- protected Cache getInfinispanCache(InfinispanRegionFactory regionFactory) {
- return regionFactory.getCacheManager().getCache("local-query");
+ protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
+ return
CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache("local-query"));
}
@Override
@@ -186,7 +187,7 @@
assertEquals(VALUE1, region.get(KEY));
// final Fqn rootFqn = getRegionFqn(getStandardRegionName(REGION_PREFIX),
REGION_PREFIX);
- final Cache jbc = getInfinispanCache(regionFactory);
+ final CacheAdapter jbc = getInfinispanCache(regionFactory);
final CountDownLatch blockerLatch = new CountDownLatch(1);
final CountDownLatch writerLatch = new CountDownLatch(1);
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/timestamp/TimestampsRegionImplTestCase.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/timestamp/TimestampsRegionImplTestCase.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/timestamp/TimestampsRegionImplTestCase.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -29,8 +29,9 @@
import org.hibernate.cache.Region;
import org.hibernate.cache.UpdateTimestampsCache;
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
+import org.hibernate.cache.infinispan.util.CacheAdapter;
+import org.hibernate.cache.infinispan.util.CacheAdapterImpl;
import org.hibernate.test.cache.infinispan.AbstractGeneralDataRegionTestCase;
-import org.infinispan.Cache;
/**
* Tests of TimestampsRegionImpl.
@@ -55,8 +56,8 @@
}
@Override
- protected Cache getInfinispanCache(InfinispanRegionFactory regionFactory) {
- return regionFactory.getCacheManager().getCache("timestamps");
+ protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
+ return
CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache("timestamps"));
}
}
Modified:
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/tm/XaTransactionImpl.java
===================================================================
---
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/tm/XaTransactionImpl.java 2009-11-13
17:40:36 UTC (rev 17975)
+++
core/trunk/cache-infinispan/src/test/java/org/hibernate/test/cache/infinispan/tm/XaTransactionImpl.java 2009-11-13
18:12:53 UTC (rev 17976)
@@ -80,6 +80,8 @@
Synchronization s = (Synchronization) synchronizations.get(i);
s.beforeCompletion();
}
+
+ runXaResourcePrepare();
status = Status.STATUS_COMMITTING;
@@ -92,6 +94,8 @@
throw new SystemException();
}
}
+
+ runXaResourceCommitTx();
status = Status.STATUS_COMMITTED;
@@ -117,6 +121,8 @@
throw new SystemException();
}
}
+
+ runXaResourceRollback();
for (int i = 0; i < synchronizations.size(); i++) {
Synchronization s = (Synchronization) synchronizations.get(i);