Merge branch 'master' of github.com:hibernate/hibernate-core
This commit is contained in:
commit
7899d34ca4
|
@ -29,6 +29,14 @@
|
|||
on the entity.
|
||||
</para>
|
||||
|
||||
<important>
|
||||
<para>
|
||||
Unlike in previous versions, you no longer need to specify listeners in the Hibernate configuration
|
||||
file. Just putting the Envers jar on the classpath is enough - listeners will be registered
|
||||
automatically.
|
||||
</para>
|
||||
</important>
|
||||
|
||||
<para>
|
||||
And that's all - you can create, modify and delete the entites as always. If you look at the generated
|
||||
schema for your entities, or at the data persisted by Hibernate, you will notice that there are no changes.
|
||||
|
|
|
@ -282,9 +282,9 @@ public class OptimizerFactory {
|
|||
* <p/>
|
||||
* The general algorithms used to determine the bucket are:<ol>
|
||||
* <li>{@code upperLimit = (databaseValue * incrementSize) + 1}</li>
|
||||
* <li>{@code lowerLimit = upperLimit - 1}</li>
|
||||
* <li>{@code lowerLimit = upperLimit - incrementSize}</li>
|
||||
* </ol>
|
||||
* As an example, consider a case with incrementSize of 10. Initially the
|
||||
* As an example, consider a case with incrementSize of 20. Initially the
|
||||
* database holds 1:<ol>
|
||||
* <li>{@code upperLimit = (1 * 20) + 1 = 21}</li>
|
||||
* <li>{@code lowerLimit = 21 - 20 = 1}</li>
|
||||
|
@ -457,7 +457,9 @@ public class OptimizerFactory {
|
|||
// we are using a sequence...
|
||||
if (value.lt(1)) LOG.pooledOptimizerReportedInitialValue(value);
|
||||
// the call to obtain next-value just gave us the initialValue
|
||||
if ((initialValue == -1 && value.lt(incrementSize)) || value.eq(initialValue)) hiValue = callback.getNextValue();
|
||||
if ( ( initialValue == -1 && value.lt( incrementSize ) ) || value.eq( initialValue ) ) {
|
||||
hiValue = callback.getNextValue();
|
||||
}
|
||||
else {
|
||||
hiValue = value;
|
||||
value = hiValue.copy().subtract( incrementSize );
|
||||
|
|
|
@ -5,7 +5,7 @@ configurations {
|
|||
}
|
||||
|
||||
dependencies {
|
||||
infinispanVersion = '5.1.0.CR1'
|
||||
infinispanVersion = '5.1.0.CR3'
|
||||
jnpVersion = '5.0.3.GA'
|
||||
|
||||
compile(project(':hibernate-core'))
|
||||
|
@ -35,6 +35,8 @@ test {
|
|||
systemProperties['jgroups.ping.num_initial_members'] = 1
|
||||
systemProperties['jgroups.udp.enable_bundling'] = false
|
||||
systemProperties['jgroups.bind_addr'] = 'localhost'
|
||||
// Use Infinispan's test JGroups stack that uses TEST_PING
|
||||
systemProperties['hibernate.cache.infinispan.jgroups_cfg'] = 'stacks/tcp.xml'
|
||||
// systemProperties['log4j.configuration'] = 'file:/log4j/log4j-infinispan.xml'
|
||||
enabled = true
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
package org.hibernate.cache.infinispan;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.util.Collections;
|
||||
import java.util.Enumeration;
|
||||
|
@ -7,7 +8,13 @@ import java.util.HashSet;
|
|||
import java.util.Map;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
import java.util.concurrent.ConcurrentMap;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
import org.hibernate.cache.infinispan.impl.BaseRegion;
|
||||
import org.hibernate.cache.infinispan.util.CacheCommandFactory;
|
||||
import org.hibernate.cache.infinispan.util.CacheCommandInitializer;
|
||||
import org.hibernate.cache.spi.CacheDataDescription;
|
||||
import org.hibernate.cache.CacheException;
|
||||
import org.hibernate.cache.spi.CollectionRegion;
|
||||
|
@ -28,8 +35,9 @@ import org.hibernate.cache.infinispan.util.CacheAdapterImpl;
|
|||
import org.hibernate.cfg.Settings;
|
||||
import org.hibernate.internal.util.config.ConfigurationHelper;
|
||||
import org.infinispan.AdvancedCache;
|
||||
import org.infinispan.Cache;
|
||||
import org.infinispan.config.Configuration;
|
||||
import org.infinispan.factories.ComponentRegistry;
|
||||
import org.infinispan.factories.GlobalComponentRegistry;
|
||||
import org.infinispan.manager.DefaultCacheManager;
|
||||
import org.infinispan.manager.EmbeddedCacheManager;
|
||||
import org.infinispan.util.logging.Log;
|
||||
|
@ -155,6 +163,9 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
private org.infinispan.transaction.lookup.TransactionManagerLookup transactionManagerlookup;
|
||||
|
||||
private TransactionManager transactionManager;
|
||||
|
||||
private ConcurrentMap<String, BaseRegion> allRegions =
|
||||
new ConcurrentHashMap<String, BaseRegion>();
|
||||
|
||||
/**
|
||||
* Create a new instance using the default configuration.
|
||||
|
@ -174,20 +185,20 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
/** {@inheritDoc} */
|
||||
public CollectionRegion buildCollectionRegion(String regionName, Properties properties, CacheDataDescription metadata) throws CacheException {
|
||||
if (log.isDebugEnabled()) log.debug("Building collection cache region [" + regionName + "]");
|
||||
Cache cache = getCache(regionName, COLLECTION_KEY, properties);
|
||||
AdvancedCache cache = getCache(regionName, COLLECTION_KEY, properties);
|
||||
CacheAdapter cacheAdapter = CacheAdapterImpl.newInstance(cache);
|
||||
CollectionRegionImpl region = new CollectionRegionImpl(cacheAdapter, regionName, metadata, transactionManager, this);
|
||||
region.start();
|
||||
startRegion(region, regionName);
|
||||
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);
|
||||
AdvancedCache cache = getCache(regionName, ENTITY_KEY, properties);
|
||||
CacheAdapter cacheAdapter = CacheAdapterImpl.newInstance(cache);
|
||||
EntityRegionImpl region = new EntityRegionImpl(cacheAdapter, regionName, metadata, transactionManager, this);
|
||||
region.start();
|
||||
startRegion(region, regionName);
|
||||
return region;
|
||||
}
|
||||
|
||||
|
@ -202,10 +213,10 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
if (!regionName.equals("org.hibernate.cache.internal.StandardQueryCache"))
|
||||
cacheName = regionName;
|
||||
|
||||
Cache cache = getCache(cacheName, QUERY_KEY, properties);
|
||||
AdvancedCache cache = getCache(cacheName, QUERY_KEY, properties);
|
||||
CacheAdapter cacheAdapter = CacheAdapterImpl.newInstance(cache);
|
||||
QueryResultsRegionImpl region = new QueryResultsRegionImpl(cacheAdapter, regionName, properties, transactionManager, this);
|
||||
region.start();
|
||||
startRegion(region, regionName);
|
||||
return region;
|
||||
}
|
||||
|
||||
|
@ -215,10 +226,10 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
public TimestampsRegion buildTimestampsRegion(String regionName, Properties properties)
|
||||
throws CacheException {
|
||||
if (log.isDebugEnabled()) log.debug("Building timestamps cache region [" + regionName + "]");
|
||||
Cache cache = getCache(regionName, TIMESTAMPS_KEY, properties);
|
||||
AdvancedCache cache = getCache(regionName, TIMESTAMPS_KEY, properties);
|
||||
CacheAdapter cacheAdapter = CacheAdapterImpl.newInstance(cache);
|
||||
TimestampsRegionImpl region = createTimestampsRegion(cacheAdapter, regionName);
|
||||
region.start();
|
||||
startRegion(region, regionName);
|
||||
return region;
|
||||
}
|
||||
|
||||
|
@ -226,10 +237,6 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
return new TimestampsRegionImpl(cacheAdapter, regionName, transactionManager, this);
|
||||
}
|
||||
|
||||
protected TransactionManager getTransactionManager() {
|
||||
return transactionManager;
|
||||
}
|
||||
|
||||
/**
|
||||
* {@inheritDoc}
|
||||
*/
|
||||
|
@ -270,7 +277,7 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
Enumeration keys = properties.propertyNames();
|
||||
while (keys.hasMoreElements()) {
|
||||
String key = (String) keys.nextElement();
|
||||
int prefixLoc = -1;
|
||||
int prefixLoc;
|
||||
if ((prefixLoc = key.indexOf(PREFIX)) != -1) {
|
||||
dissectProperty(prefixLoc, key, properties);
|
||||
}
|
||||
|
@ -310,11 +317,15 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
return Collections.unmodifiableSet(definedConfigurations);
|
||||
}
|
||||
|
||||
public BaseRegion getRegion(String regionName) {
|
||||
return allRegions.get(regionName);
|
||||
}
|
||||
|
||||
protected EmbeddedCacheManager createCacheManager(Properties properties) throws CacheException {
|
||||
try {
|
||||
String configLoc = ConfigurationHelper.getString(INFINISPAN_CONFIG_RESOURCE_PROP, properties, DEF_INFINISPAN_CONFIG_RESOURCE);
|
||||
EmbeddedCacheManager manager = new DefaultCacheManager(configLoc, false);
|
||||
String globalStats = ConfigurationHelper.extractPropertyValue(INFINISPAN_GLOBAL_STATISTICS_PROP, properties);
|
||||
String globalStats = extractProperty(INFINISPAN_GLOBAL_STATISTICS_PROP, properties);
|
||||
if (globalStats != null) {
|
||||
manager.getGlobalConfiguration().setExposeGlobalJmxStatistics(Boolean.parseBoolean(globalStats));
|
||||
}
|
||||
|
@ -325,6 +336,10 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
}
|
||||
}
|
||||
|
||||
private void startRegion(BaseRegion region, String regionName) {
|
||||
allRegions.put(regionName, region);
|
||||
}
|
||||
|
||||
private Map<String, TypeOverrides> initGenericDataTypeOverrides() {
|
||||
TypeOverrides entityOverrides = new TypeOverrides();
|
||||
entityOverrides.setCacheName(DEF_ENTITY_RESOURCE);
|
||||
|
@ -342,31 +357,33 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
}
|
||||
|
||||
private void dissectProperty(int prefixLoc, String key, Properties properties) {
|
||||
TypeOverrides cfgOverride = null;
|
||||
int suffixLoc = -1;
|
||||
TypeOverrides cfgOverride;
|
||||
int suffixLoc;
|
||||
if (!key.equals(INFINISPAN_CONFIG_RESOURCE_PROP) && (suffixLoc = key.indexOf(CONFIG_SUFFIX)) != -1) {
|
||||
cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
cfgOverride.setCacheName( ConfigurationHelper.extractPropertyValue(key, properties));
|
||||
cfgOverride.setCacheName(extractProperty(key, properties));
|
||||
} else if ((suffixLoc = key.indexOf(STRATEGY_SUFFIX)) != -1) {
|
||||
cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
cfgOverride.setEvictionStrategy( ConfigurationHelper.extractPropertyValue(key, properties));
|
||||
cfgOverride.setEvictionStrategy(extractProperty(key, properties));
|
||||
} else if ((suffixLoc = key.indexOf(WAKE_UP_INTERVAL_SUFFIX)) != -1) {
|
||||
cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
cfgOverride.setEvictionWakeUpInterval(Long.parseLong( ConfigurationHelper.extractPropertyValue(key, properties)));
|
||||
cfgOverride.setEvictionWakeUpInterval(Long.parseLong(extractProperty(key, properties)));
|
||||
} else if ((suffixLoc = key.indexOf(MAX_ENTRIES_SUFFIX)) != -1) {
|
||||
cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
cfgOverride.setEvictionMaxEntries( ConfigurationHelper.getInt(key, properties, -1));
|
||||
cfgOverride.setEvictionMaxEntries(Integer.parseInt(extractProperty(key, properties)));
|
||||
} else if ((suffixLoc = key.indexOf(LIFESPAN_SUFFIX)) != -1) {
|
||||
cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
cfgOverride.setExpirationLifespan(Long.parseLong( ConfigurationHelper.extractPropertyValue(key, properties)));
|
||||
cfgOverride.setExpirationLifespan(Long.parseLong(extractProperty(key, properties)));
|
||||
} else if ((suffixLoc = key.indexOf(MAX_IDLE_SUFFIX)) != -1) {
|
||||
cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
cfgOverride.setExpirationMaxIdle(Long.parseLong( ConfigurationHelper.extractPropertyValue(key, properties)));
|
||||
cfgOverride.setExpirationMaxIdle(Long.parseLong(extractProperty(key, properties)));
|
||||
}
|
||||
// else if ((suffixLoc = key.indexOf(STATISTICS_SUFFIX)) != -1) {
|
||||
// cfgOverride = getOrCreateConfig(prefixLoc, key, suffixLoc);
|
||||
// cfgOverride.setExposeStatistics(Boolean.parseBoolean(PropertiesHelper.extractPropertyValue(key, properties)));
|
||||
// }
|
||||
}
|
||||
|
||||
private String extractProperty(String key, Properties properties) {
|
||||
String value = ConfigurationHelper.extractPropertyValue(key, properties);
|
||||
log.debugf("Configuration override via property %s: %s", key, value);
|
||||
return value;
|
||||
}
|
||||
|
||||
private TypeOverrides getOrCreateConfig(int prefixLoc, String key, int suffixLoc) {
|
||||
|
@ -395,7 +412,7 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
}
|
||||
}
|
||||
|
||||
private Cache getCache(String regionName, String typeKey, Properties properties) {
|
||||
private AdvancedCache getCache(String regionName, String typeKey, Properties properties) {
|
||||
TypeOverrides regionOverride = typeOverrides.get(regionName);
|
||||
if (!definedConfigurations.contains(regionName)) {
|
||||
String templateCacheName = null;
|
||||
|
@ -420,38 +437,46 @@ public class InfinispanRegionFactory implements RegionFactory {
|
|||
manager.defineConfiguration(regionName, templateCacheName, regionCacheCfg);
|
||||
definedConfigurations.add(regionName);
|
||||
}
|
||||
Cache cache = manager.getCache(regionName);
|
||||
AdvancedCache cache = manager.getCache(regionName).getAdvancedCache();
|
||||
if (!cache.getStatus().allowInvocations()) {
|
||||
cache.start();
|
||||
}
|
||||
return createCacheWrapper(cache.getAdvancedCache());
|
||||
ComponentRegistry cr = cache.getComponentRegistry();
|
||||
cr.getComponent(CacheCommandInitializer.class).setRegionFactory(this);
|
||||
GlobalComponentRegistry globalCr = cache.getComponentRegistry().getGlobalComponentRegistry();
|
||||
// TODO: This is a hack, make it easier to retrieve in Infinispan!
|
||||
((CacheCommandFactory) ((Map) globalCr.getComponent("org.infinispan.modules.command.factories"))
|
||||
.values().iterator().next()).setRegionFactory(this);
|
||||
return createCacheWrapper(cache);
|
||||
}
|
||||
|
||||
protected ClassLoaderAwareCache createCacheWrapper(AdvancedCache cache) {
|
||||
protected AdvancedCache createCacheWrapper(AdvancedCache cache) {
|
||||
return new ClassLoaderAwareCache(cache, Thread.currentThread().getContextClassLoader());
|
||||
}
|
||||
|
||||
private Configuration configureTransactionManager(Configuration regionOverrides, String templateCacheName, Properties properties) {
|
||||
// Get existing configuration to verify whether a tm was configured or not.
|
||||
Configuration templateConfig = manager.defineConfiguration(templateCacheName, new Configuration());
|
||||
String ispnTmLookupClassName = templateConfig.getTransactionManagerLookupClass();
|
||||
String hbTmLookupClassName = org.hibernate.cache.infinispan.tm.HibernateTransactionManagerLookup.class.getName();
|
||||
if (ispnTmLookupClassName != null && !ispnTmLookupClassName.equals(hbTmLookupClassName)) {
|
||||
log.debug("Infinispan is configured [" + ispnTmLookupClassName + "] with a different transaction manager lookup " +
|
||||
"class than Hibernate [" + hbTmLookupClassName + "]");
|
||||
} else {
|
||||
regionOverrides.setTransactionManagerLookup(transactionManagerlookup);
|
||||
}
|
||||
if (templateConfig.isTransactionalCache()) {
|
||||
String ispnTmLookupClassName = templateConfig.getTransactionManagerLookupClass();
|
||||
String hbTmLookupClassName = org.hibernate.cache.infinispan.tm.HibernateTransactionManagerLookup.class.getName();
|
||||
if (ispnTmLookupClassName != null && !ispnTmLookupClassName.equals(hbTmLookupClassName)) {
|
||||
log.debug("Infinispan is configured [" + ispnTmLookupClassName + "] with a different transaction manager lookup " +
|
||||
"class than Hibernate [" + hbTmLookupClassName + "]");
|
||||
} else {
|
||||
regionOverrides.setTransactionManagerLookup(transactionManagerlookup);
|
||||
}
|
||||
|
||||
String useSyncProp = ConfigurationHelper.extractPropertyValue(INFINISPAN_USE_SYNCHRONIZATION_PROP, properties);
|
||||
boolean useSync = useSyncProp == null ? DEF_USE_SYNCHRONIZATION : Boolean.parseBoolean(useSyncProp);
|
||||
regionOverrides.fluent().transaction().useSynchronization(useSync);
|
||||
String useSyncProp = extractProperty(INFINISPAN_USE_SYNCHRONIZATION_PROP, properties);
|
||||
boolean useSync = useSyncProp == null ? DEF_USE_SYNCHRONIZATION : Boolean.parseBoolean(useSyncProp);
|
||||
regionOverrides.fluent().transaction().useSynchronization(useSync);
|
||||
}
|
||||
|
||||
return regionOverrides;
|
||||
}
|
||||
|
||||
private TypeOverrides overrideStatisticsIfPresent(TypeOverrides override, Properties properties) {
|
||||
String globalStats = ConfigurationHelper.extractPropertyValue(INFINISPAN_GLOBAL_STATISTICS_PROP, properties);
|
||||
String globalStats = extractProperty(INFINISPAN_GLOBAL_STATISTICS_PROP, properties);
|
||||
if (globalStats != null) {
|
||||
override.setExposeStatistics(Boolean.parseBoolean(globalStats));
|
||||
}
|
||||
|
|
|
@ -22,6 +22,7 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.cache.infinispan.access;
|
||||
|
||||
import javax.transaction.Transaction;
|
||||
import org.hibernate.cache.CacheException;
|
||||
import org.hibernate.cache.spi.access.CollectionRegionAccessStrategy;
|
||||
|
@ -29,7 +30,6 @@ import org.hibernate.cache.spi.access.EntityRegionAccessStrategy;
|
|||
import org.hibernate.cache.spi.access.SoftLock;
|
||||
import org.hibernate.cache.infinispan.impl.BaseRegion;
|
||||
import org.hibernate.cache.infinispan.util.CacheAdapter;
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
import org.hibernate.cache.infinispan.util.FlagAdapter;
|
||||
import org.infinispan.util.logging.Log;
|
||||
import org.infinispan.util.logging.LogFactory;
|
||||
|
@ -162,7 +162,8 @@ public class TransactionalAccessDelegate {
|
|||
}
|
||||
Transaction tx = region.suspend();
|
||||
try {
|
||||
CacheHelper.sendEvictAllNotification(cacheAdapter, region.getAddress());
|
||||
region.invalidateRegion(); // Invalidate the local region and then go remote
|
||||
cacheAdapter.broadcastEvictAll();
|
||||
} finally {
|
||||
region.resume(tx);
|
||||
}
|
||||
|
|
|
@ -1,10 +1,8 @@
|
|||
package org.hibernate.cache.infinispan.impl;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.atomic.AtomicReference;
|
||||
import javax.transaction.SystemException;
|
||||
import javax.transaction.Transaction;
|
||||
|
@ -13,17 +11,9 @@ import org.hibernate.cache.CacheException;
|
|||
import org.hibernate.cache.spi.Region;
|
||||
import org.hibernate.cache.spi.RegionFactory;
|
||||
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.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;
|
||||
|
||||
|
@ -37,12 +27,12 @@ import org.infinispan.util.logging.LogFactory;
|
|||
* @since 3.5
|
||||
*/
|
||||
public abstract class BaseRegion implements Region {
|
||||
|
||||
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();
|
||||
|
@ -59,32 +49,6 @@ public abstract class BaseRegion implements Region {
|
|||
this.factory = factory;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
@ -94,13 +58,9 @@ public abstract class BaseRegion implements Region {
|
|||
}
|
||||
|
||||
public long getElementCountInMemory() {
|
||||
if (checkValid()) {
|
||||
Set keySet = cacheAdapter.keySet();
|
||||
int size = cacheAdapter.size();
|
||||
if (CacheHelper.containsEvictAllNotification(keySet, address))
|
||||
size--;
|
||||
return size;
|
||||
}
|
||||
if (checkValid())
|
||||
return cacheAdapter.size();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -131,25 +91,15 @@ public abstract class BaseRegion implements Region {
|
|||
}
|
||||
|
||||
public Map toMap() {
|
||||
if (checkValid()) {
|
||||
// If copying causes issues, provide a lazily loaded Map
|
||||
Map map = new HashMap();
|
||||
Set<Map.Entry> entries = cacheAdapter.toMap().entrySet();
|
||||
for (Map.Entry entry : entries) {
|
||||
Object key = entry.getKey();
|
||||
if (!CacheHelper.isEvictAllNotification(key)) {
|
||||
map.put(key, entry.getValue());
|
||||
}
|
||||
}
|
||||
return map;
|
||||
}
|
||||
if (checkValid())
|
||||
return cacheAdapter.toMap();
|
||||
|
||||
return Collections.EMPTY_MAP;
|
||||
}
|
||||
|
||||
public void destroy() throws CacheException {
|
||||
try {
|
||||
cacheAdapter.stop();
|
||||
// cacheAdapter.clear();
|
||||
} finally {
|
||||
cacheAdapter.removeListener(this);
|
||||
}
|
||||
|
@ -173,7 +123,15 @@ public abstract class BaseRegion implements Region {
|
|||
if (invalidateState.compareAndSet(InvalidateState.INVALID, InvalidateState.CLEARING)) {
|
||||
Transaction tx = suspend();
|
||||
try {
|
||||
cacheAdapter.withFlags(FlagAdapter.CACHE_MODE_LOCAL, FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT).clear();
|
||||
// Clear region in a separate transaction
|
||||
cacheAdapter.withinTx(new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
cacheAdapter.withFlags(FlagAdapter.CACHE_MODE_LOCAL,
|
||||
FlagAdapter.ZERO_LOCK_ACQUISITION_TIMEOUT).clear();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
invalidateState.compareAndSet(InvalidateState.CLEARING, InvalidateState.VALID);
|
||||
}
|
||||
catch (Exception e) {
|
||||
|
@ -192,6 +150,8 @@ public abstract class BaseRegion implements Region {
|
|||
return valid;
|
||||
}
|
||||
|
||||
|
||||
|
||||
protected boolean isValid() {
|
||||
return invalidateState.get() == InvalidateState.VALID;
|
||||
}
|
||||
|
@ -261,44 +221,13 @@ public abstract class BaseRegion implements Region {
|
|||
}
|
||||
}
|
||||
|
||||
@CacheEntryModified
|
||||
public void entryModified(CacheEntryModifiedEvent event) {
|
||||
handleEvictAllModification(event);
|
||||
public void invalidateRegion() {
|
||||
if (log.isTraceEnabled()) log.trace("Invalidate region: " + name);
|
||||
invalidateState.set(InvalidateState.INVALID);
|
||||
}
|
||||
|
||||
protected boolean handleEvictAllModification(CacheEntryModifiedEvent event) {
|
||||
if (!event.isPre() && (replication || event.isOriginLocal()) && CacheHelper.isEvictAllNotification(event.getKey(), event.getValue())) {
|
||||
if (log.isTraceEnabled()) log.tracef("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.tracef("Cache entry invalidated: {0}", event);
|
||||
handleEvictAllInvalidation(event);
|
||||
}
|
||||
|
||||
protected boolean handleEvictAllInvalidation(CacheEntryInvalidatedEvent event) {
|
||||
if (!event.isPre() && CacheHelper.isEvictAllNotification(event.getKey())) {
|
||||
if (log.isTraceEnabled()) log.tracef("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();
|
||||
}
|
||||
}
|
||||
public TransactionManager getTransactionManager() {
|
||||
return transactionManager;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
package org.hibernate.cache.infinispan.impl;
|
||||
|
||||
import javax.transaction.TransactionManager;
|
||||
import org.hibernate.cache.spi.CacheDataDescription;
|
||||
import org.hibernate.cache.spi.RegionFactory;
|
||||
|
@ -12,11 +13,14 @@ import org.hibernate.cache.infinispan.util.CacheAdapter;
|
|||
* @author Galder Zamarreño
|
||||
* @since 3.5
|
||||
*/
|
||||
public abstract class BaseTransactionalDataRegion extends BaseRegion implements TransactionalDataRegion {
|
||||
public abstract class BaseTransactionalDataRegion
|
||||
extends BaseRegion implements TransactionalDataRegion {
|
||||
|
||||
private final CacheDataDescription metadata;
|
||||
|
||||
public BaseTransactionalDataRegion(CacheAdapter cacheAdapter, String name, CacheDataDescription metadata, TransactionManager transactionManager, RegionFactory factory) {
|
||||
public BaseTransactionalDataRegion(CacheAdapter cacheAdapter, String name,
|
||||
CacheDataDescription metadata, TransactionManager transactionManager,
|
||||
RegionFactory factory) {
|
||||
super(cacheAdapter, name, transactionManager, factory);
|
||||
this.metadata = metadata;
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import org.hibernate.cache.spi.QueryResultsRegion;
|
|||
import org.hibernate.cache.spi.RegionFactory;
|
||||
import org.hibernate.cache.infinispan.impl.BaseTransactionalDataRegion;
|
||||
import org.hibernate.cache.infinispan.util.CacheAdapter;
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
import org.hibernate.cache.infinispan.util.FlagAdapter;
|
||||
|
||||
import org.infinispan.notifications.Listener;
|
||||
|
@ -38,7 +37,7 @@ public class QueryResultsRegionImpl extends BaseTransactionalDataRegion implemen
|
|||
public void evictAll() throws CacheException {
|
||||
Transaction tx = suspend();
|
||||
try {
|
||||
CacheHelper.sendEvictAllNotification(cacheAdapter, getAddress());
|
||||
cacheAdapter.broadcastEvictAll();
|
||||
} finally {
|
||||
resume(tx);
|
||||
}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
package org.hibernate.cache.infinispan.timestamp;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
@ -9,12 +10,10 @@ import org.hibernate.cache.spi.RegionFactory;
|
|||
import org.hibernate.cache.spi.TimestampsRegion;
|
||||
import org.hibernate.cache.infinispan.impl.BaseGeneralDataRegion;
|
||||
import org.hibernate.cache.infinispan.util.CacheAdapter;
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
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;
|
||||
|
||||
|
@ -45,8 +44,8 @@ public class TimestampsRegionImpl extends BaseGeneralDataRegion implements Times
|
|||
public void evictAll() throws CacheException {
|
||||
// TODO Is this a valid operation on a timestamps cache?
|
||||
Transaction tx = suspend();
|
||||
try {
|
||||
CacheHelper.sendEvictAllNotification(cacheAdapter, getAddress());
|
||||
try {
|
||||
cacheAdapter.broadcastEvictAll();
|
||||
} finally {
|
||||
resume(tx);
|
||||
}
|
||||
|
@ -74,18 +73,13 @@ public class TimestampsRegionImpl extends BaseGeneralDataRegion implements Times
|
|||
return value;
|
||||
}
|
||||
|
||||
public void put(Object key, Object value) throws CacheException {
|
||||
// Don't hold the JBC node lock throughout the tx, as that
|
||||
// prevents reads and other updates
|
||||
Transaction tx = suspend();
|
||||
public void put(final Object key, final Object value) throws CacheException {
|
||||
try {
|
||||
// We ensure ASYNC semantics (JBCACHE-1175) and make sure previous
|
||||
// value is not loaded from cache store cos it's not needed.
|
||||
cacheAdapter.withFlags(FlagAdapter.FORCE_ASYNCHRONOUS).put(key, value);
|
||||
} catch (Exception e) {
|
||||
throw new CacheException(e);
|
||||
} finally {
|
||||
resume(tx);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -103,9 +97,8 @@ public class TimestampsRegionImpl extends BaseGeneralDataRegion implements Times
|
|||
*/
|
||||
@CacheEntryModified
|
||||
public void nodeModified(CacheEntryModifiedEvent event) {
|
||||
if (!handleEvictAllModification(event) && !event.isPre()) {
|
||||
if (!event.isPre())
|
||||
localCache.put(event.getKey(), event.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -120,21 +113,9 @@ public class TimestampsRegionImpl extends BaseGeneralDataRegion implements Times
|
|||
}
|
||||
|
||||
@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;
|
||||
public void invalidateRegion() {
|
||||
super.invalidateRegion(); // Invalidate first
|
||||
localCache.clear();
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -24,6 +24,8 @@ package org.hibernate.cache.infinispan.util;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import org.hibernate.cache.CacheException;
|
||||
import org.infinispan.Cache;
|
||||
import org.infinispan.config.Configuration;
|
||||
|
@ -204,4 +206,21 @@ public interface CacheAdapter {
|
|||
* @return Configuration instance associated with this cache.
|
||||
*/
|
||||
Configuration getConfiguration();
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*/
|
||||
void broadcastEvictAll();
|
||||
|
||||
/**
|
||||
* TODO
|
||||
*
|
||||
* @param c
|
||||
* @param <T>
|
||||
* @return
|
||||
*/
|
||||
<T> T withinTx(Callable<T> c) throws Exception;
|
||||
|
||||
Cache getCache();
|
||||
|
||||
}
|
||||
|
|
|
@ -21,10 +21,14 @@
|
|||
* 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 java.util.concurrent.Callable;
|
||||
|
||||
import org.hibernate.cache.CacheException;
|
||||
import org.infinispan.AdvancedCache;
|
||||
import org.infinispan.Cache;
|
||||
import org.infinispan.config.Configuration;
|
||||
import org.infinispan.context.Flag;
|
||||
|
@ -42,13 +46,18 @@ import org.infinispan.util.logging.LogFactory;
|
|||
public class CacheAdapterImpl implements CacheAdapter {
|
||||
private static final Log log = LogFactory.getLog(CacheAdapterImpl.class);
|
||||
|
||||
private final Cache cache;
|
||||
private final AdvancedCache cache;
|
||||
private final CacheCommandInitializer cacheCmdInitializer;
|
||||
private final boolean isSync;
|
||||
|
||||
private CacheAdapterImpl(Cache cache) {
|
||||
private CacheAdapterImpl(AdvancedCache cache) {
|
||||
this.cache = cache;
|
||||
this.cacheCmdInitializer = cache.getComponentRegistry()
|
||||
.getComponent(CacheCommandInitializer.class);
|
||||
this.isSync = isSynchronous(cache.getConfiguration().getCacheMode());
|
||||
}
|
||||
|
||||
public static CacheAdapter newInstance(Cache cache) {
|
||||
public static CacheAdapter newInstance(AdvancedCache cache) {
|
||||
return new CacheAdapterImpl(cache);
|
||||
}
|
||||
|
||||
|
@ -61,7 +70,7 @@ public class CacheAdapterImpl implements CacheAdapter {
|
|||
}
|
||||
|
||||
public boolean isSynchronous() {
|
||||
return isSynchronous(cache.getConfiguration().getCacheMode());
|
||||
return isSync;
|
||||
}
|
||||
|
||||
public Set keySet() {
|
||||
|
@ -70,7 +79,7 @@ public class CacheAdapterImpl implements CacheAdapter {
|
|||
|
||||
public CacheAdapter withFlags(FlagAdapter... flagAdapters) {
|
||||
Flag[] flags = FlagAdapter.toFlags(flagAdapters);
|
||||
return newInstance(cache.getAdvancedCache().withFlags(flags));
|
||||
return newInstance(cache.withFlags(flags));
|
||||
}
|
||||
|
||||
public Object get(Object key) throws CacheException {
|
||||
|
@ -173,7 +182,7 @@ public class CacheAdapterImpl implements CacheAdapter {
|
|||
}
|
||||
|
||||
public AddressAdapter getAddress() {
|
||||
RpcManager rpc = cache.getAdvancedCache().getRpcManager();
|
||||
RpcManager rpc = cache.getRpcManager();
|
||||
if (rpc != null) {
|
||||
return AddressAdapterImpl.newInstance(rpc.getTransport().getAddress());
|
||||
}
|
||||
|
@ -181,17 +190,13 @@ public class CacheAdapterImpl implements CacheAdapter {
|
|||
}
|
||||
|
||||
public List<AddressAdapter> getMembers() {
|
||||
RpcManager rpc = cache.getAdvancedCache().getRpcManager();
|
||||
RpcManager rpc = cache.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();
|
||||
}
|
||||
|
@ -212,17 +217,33 @@ public class CacheAdapterImpl implements CacheAdapter {
|
|||
return cache.getConfiguration();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void broadcastEvictAll() {
|
||||
EvictAllCommand cmd = cacheCmdInitializer.buildEvictAllCommand(cache.getName());
|
||||
cache.getRpcManager().broadcastRpcCommand(cmd, isSync);
|
||||
}
|
||||
|
||||
@Override
|
||||
public <T> T withinTx(Callable<T> c) throws Exception {
|
||||
return CacheHelper.withinTx(cache.getTransactionManager(), c);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Cache getCache() {
|
||||
return cache;
|
||||
}
|
||||
|
||||
private Cache getFailSilentCache() {
|
||||
return cache.getAdvancedCache().withFlags(Flag.FAIL_SILENTLY);
|
||||
return cache.withFlags(Flag.FAIL_SILENTLY);
|
||||
}
|
||||
|
||||
private Cache getSkipRemoteGetLoadCache() {
|
||||
return cache.getAdvancedCache().withFlags(
|
||||
return cache.withFlags(
|
||||
Flag.SKIP_CACHE_LOAD, Flag.SKIP_REMOTE_LOOKUP);
|
||||
}
|
||||
|
||||
private Cache getFailSilentCacheSkipRemotes() {
|
||||
return cache.getAdvancedCache().withFlags(
|
||||
return cache.withFlags(
|
||||
Flag.FAIL_SILENTLY, Flag.SKIP_CACHE_LOAD, Flag.SKIP_REMOTE_LOOKUP);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
package org.hibernate.cache.infinispan.util;
|
||||
|
||||
import org.infinispan.commands.module.ExtendedModuleCommandFactory;
|
||||
import org.infinispan.commands.module.ModuleCommandExtensions;
|
||||
import org.infinispan.commands.module.ModuleCommandInitializer;
|
||||
|
||||
/**
|
||||
* Command extensions for second-level cache use case
|
||||
*
|
||||
* @author Galder Zamarreño
|
||||
* @since 4.0
|
||||
*/
|
||||
public class CacheCommandExtensions implements ModuleCommandExtensions {
|
||||
|
||||
final CacheCommandFactory cacheCommandFactory = new CacheCommandFactory();
|
||||
final CacheCommandInitializer cacheCommandInitializer = new CacheCommandInitializer();
|
||||
|
||||
@Override
|
||||
public ExtendedModuleCommandFactory getModuleCommandFactory() {
|
||||
return cacheCommandFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ModuleCommandInitializer getModuleCommandInitializer() {
|
||||
return cacheCommandInitializer;
|
||||
}
|
||||
|
||||
}
|
53
hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheCommandFactory.java
vendored
Normal file
53
hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheCommandFactory.java
vendored
Normal file
|
@ -0,0 +1,53 @@
|
|||
package org.hibernate.cache.infinispan.util;
|
||||
|
||||
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
|
||||
import org.infinispan.commands.ReplicableCommand;
|
||||
import org.infinispan.commands.module.ExtendedModuleCommandFactory;
|
||||
import org.infinispan.commands.remote.CacheRpcCommand;
|
||||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Command factory
|
||||
*
|
||||
* @author Galder Zamarreño
|
||||
* @since 4.0
|
||||
*/
|
||||
public class CacheCommandFactory implements ExtendedModuleCommandFactory {
|
||||
|
||||
private InfinispanRegionFactory regionFactory;
|
||||
|
||||
public void setRegionFactory(InfinispanRegionFactory regionFactory) {
|
||||
this.regionFactory = regionFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<Byte, Class<? extends ReplicableCommand>> getModuleCommands() {
|
||||
Map<Byte, Class<? extends ReplicableCommand>> map = new HashMap<Byte, Class<? extends ReplicableCommand>>(3);
|
||||
map.put(CacheCommandIds.EVICT_ALL, EvictAllCommand.class);
|
||||
return map;
|
||||
}
|
||||
|
||||
@Override
|
||||
public CacheRpcCommand fromStream(byte commandId, Object[] args, String cacheName) {
|
||||
CacheRpcCommand c;
|
||||
switch (commandId) {
|
||||
case CacheCommandIds.EVICT_ALL:
|
||||
c = new EvictAllCommand(cacheName, regionFactory);
|
||||
break;
|
||||
default:
|
||||
throw new IllegalArgumentException("Not registered to handle command id " + commandId);
|
||||
}
|
||||
c.setParameters(commandId, args);
|
||||
return c;
|
||||
}
|
||||
|
||||
@Override
|
||||
public ReplicableCommand fromStream(byte commandId, Object[] args) {
|
||||
// Should not be called while this factory only
|
||||
// provides cache specific replicable commands.
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
13
hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheCommandIds.java
vendored
Normal file
13
hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/CacheCommandIds.java
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
package org.hibernate.cache.infinispan.util;
|
||||
|
||||
/**
|
||||
* Command id range assigned to Hibernate second level cache: 120 - 139
|
||||
*
|
||||
* @author Galder Zamarreño
|
||||
* @since 4.0
|
||||
*/
|
||||
public interface CacheCommandIds {
|
||||
|
||||
byte EVICT_ALL = 120;
|
||||
|
||||
}
|
|
@ -0,0 +1,30 @@
|
|||
package org.hibernate.cache.infinispan.util;
|
||||
|
||||
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
|
||||
import org.infinispan.commands.ReplicableCommand;
|
||||
import org.infinispan.commands.module.ModuleCommandInitializer;
|
||||
|
||||
/**
|
||||
* Command initializer
|
||||
*
|
||||
* @author Galder Zamarreño
|
||||
* @since 4.0
|
||||
*/
|
||||
public class CacheCommandInitializer implements ModuleCommandInitializer {
|
||||
|
||||
private InfinispanRegionFactory regionFactory;
|
||||
|
||||
public void setRegionFactory(InfinispanRegionFactory regionFactory) {
|
||||
this.regionFactory = regionFactory;
|
||||
}
|
||||
|
||||
public EvictAllCommand buildEvictAllCommand(String regionName) {
|
||||
return new EvictAllCommand(regionName, regionFactory);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void initializeReplicableCommand(ReplicableCommand c, boolean isRemote) {
|
||||
// No need to initialize...
|
||||
}
|
||||
|
||||
}
|
|
@ -22,13 +22,10 @@
|
|||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
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.infinispan.util.logging.Log;
|
||||
import org.infinispan.util.logging.LogFactory;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import javax.transaction.Status;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
/**
|
||||
* Helper for dealing with Infinisan cache instances.
|
||||
|
@ -38,80 +35,23 @@ import org.infinispan.util.logging.LogFactory;
|
|||
*/
|
||||
public class CacheHelper {
|
||||
|
||||
private static final Log log = LogFactory.getLog(CacheHelper.class);
|
||||
|
||||
/**
|
||||
* Disallow external instantiation of CacheHelper.
|
||||
*/
|
||||
private CacheHelper() {
|
||||
}
|
||||
|
||||
public static void initInternalEvict(CacheAdapter cache, AddressAdapter member) {
|
||||
EvictAll eKey = new EvictAll(member == null ? NoAddress.INSTANCE : member);
|
||||
cache.withFlags(FlagAdapter.CACHE_MODE_LOCAL).put(eKey, Internal.INIT);
|
||||
}
|
||||
|
||||
public static void sendEvictAllNotification(CacheAdapter cache, AddressAdapter member) {
|
||||
EvictAll eKey = new EvictAll(member == null ? NoAddress.INSTANCE : member);
|
||||
cache.put(eKey, Internal.EVICT);
|
||||
}
|
||||
|
||||
public static boolean isEvictAllNotification(Object key) {
|
||||
return key instanceof EvictAll;
|
||||
}
|
||||
|
||||
public static boolean containsEvictAllNotification(Set keySet, AddressAdapter member) {
|
||||
EvictAll eKey = new EvictAll(member == null ? NoAddress.INSTANCE : member);
|
||||
return keySet.contains(eKey);
|
||||
}
|
||||
|
||||
public static boolean isEvictAllNotification(Object key, Object value) {
|
||||
return key instanceof EvictAll && value == Internal.EVICT;
|
||||
}
|
||||
|
||||
public static class EvictAll implements Externalizable {
|
||||
AddressAdapter member;
|
||||
|
||||
// Required by Java Externalizable
|
||||
public EvictAll() {
|
||||
public static <T> T withinTx(TransactionManager tm, Callable<T> c) throws Exception {
|
||||
tm.begin();
|
||||
try {
|
||||
return c.call();
|
||||
} catch (Exception e) {
|
||||
tm.setRollbackOnly();
|
||||
throw e;
|
||||
} finally {
|
||||
if (tm.getStatus() == Status.STATUS_ACTIVE) tm.commit();
|
||||
else tm.rollback();
|
||||
}
|
||||
|
||||
public EvictAll(AddressAdapter member) {
|
||||
this.member = member;
|
||||
}
|
||||
|
||||
@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);
|
||||
}
|
||||
|
||||
@Override
|
||||
public int hashCode() {
|
||||
int result = 17;
|
||||
result = 31 * result + member.hashCode();
|
||||
return result;
|
||||
}
|
||||
|
||||
public void readExternal(ObjectInput in) throws IOException, ClassNotFoundException {
|
||||
member = (AddressAdapter) in.readObject();
|
||||
}
|
||||
|
||||
public void writeExternal(ObjectOutput out) throws IOException {
|
||||
out.writeObject(member);
|
||||
}
|
||||
}
|
||||
|
||||
private enum NoAddress implements AddressAdapter {
|
||||
INSTANCE;
|
||||
}
|
||||
|
||||
private enum Internal {
|
||||
INIT, EVICT;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
50
hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/EvictAllCommand.java
vendored
Normal file
50
hibernate-infinispan/src/main/java/org/hibernate/cache/infinispan/util/EvictAllCommand.java
vendored
Normal file
|
@ -0,0 +1,50 @@
|
|||
package org.hibernate.cache.infinispan.util;
|
||||
|
||||
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
|
||||
import org.hibernate.cache.infinispan.impl.BaseRegion;
|
||||
import org.infinispan.commands.remote.BaseRpcCommand;
|
||||
import org.infinispan.context.InvocationContext;
|
||||
|
||||
/**
|
||||
* Evict all command
|
||||
*
|
||||
* @author Galder Zamarreño
|
||||
* @since 4.0
|
||||
*/
|
||||
public class EvictAllCommand extends BaseRpcCommand {
|
||||
|
||||
private InfinispanRegionFactory regionFactory;
|
||||
|
||||
public EvictAllCommand(String regionName, InfinispanRegionFactory regionFactory) {
|
||||
super(regionName); // region name and cache names are the same...
|
||||
this.regionFactory = regionFactory;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object perform(InvocationContext ctx) throws Throwable {
|
||||
BaseRegion region = regionFactory.getRegion(cacheName);
|
||||
region.invalidateRegion();
|
||||
return null;
|
||||
}
|
||||
|
||||
@Override
|
||||
public byte getCommandId() {
|
||||
return CacheCommandIds.EVICT_ALL;
|
||||
}
|
||||
|
||||
@Override
|
||||
public Object[] getParameters() {
|
||||
return new Object[0];
|
||||
}
|
||||
|
||||
@Override
|
||||
public void setParameters(int commandId, Object[] parameters) {
|
||||
// No-op
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean isReturnValueExpected() {
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1 @@
|
|||
org.hibernate.cache.infinispan.util.CacheCommandExtensions
|
|
@ -6,11 +6,13 @@
|
|||
<transport
|
||||
transportClass="org.infinispan.remoting.transport.jgroups.JGroupsTransport"
|
||||
clusterName="infinispan-hibernate-cluster"
|
||||
distributedSyncTimeout="50000">
|
||||
distributedSyncTimeout="50000"
|
||||
strictPeerToPeer="false">
|
||||
<!-- Note that the JGroups transport uses sensible defaults if no configuration property is defined. -->
|
||||
<properties>
|
||||
<!-- TODO: Change to udp.xml once streaming transfer requirement has been removed. -->
|
||||
<property name="configurationFile" value="flush-udp.xml"/>
|
||||
<!--<property name="configurationFile" value="jgroups-tcp.xml"/>-->
|
||||
<property name="configurationFile"
|
||||
value="${hibernate.cache.infinispan.jgroups_cfg:tcp.xml}"/>
|
||||
</properties>
|
||||
<!-- See the JGroupsTransport javadocs for more flags -->
|
||||
</transport>
|
||||
|
@ -19,11 +21,6 @@
|
|||
<default>
|
||||
<!-- Used to register JMX statistics in any available MBean server -->
|
||||
<jmxStatistics enabled="false"/>
|
||||
<!-- autoCommit would be better configured to be false
|
||||
but that would require redesigning evictAll handling -->
|
||||
<transaction autoCommit="true" use1PcForAutoCommitTransactions="false"
|
||||
transactionManagerLookupClass="org.hibernate.cache.infinispan.tm.HibernateTransactionManagerLookup"
|
||||
lockingMode="OPTIMISTIC"/>
|
||||
</default>
|
||||
|
||||
<!-- Default configuration is appropriate for entity/collection caching. -->
|
||||
|
@ -36,9 +33,11 @@
|
|||
lockAcquisitionTimeout="15000" useLockStriping="false"/>
|
||||
<!-- Eviction configuration. WakeupInterval defines how often the eviction thread runs, in milliseconds.
|
||||
0 means the eviction thread will never run. A separate executor is used for eviction in each cache. -->
|
||||
<eviction wakeUpInterval="5000" maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000"/>
|
||||
<eviction maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000" wakeUpInterval="5000"/>
|
||||
<lazyDeserialization enabled="true"/>
|
||||
<transaction transactionMode="TRANSACTIONAL" autoCommit="false"
|
||||
lockingMode="OPTIMISTIC"/>
|
||||
</namedCache>
|
||||
|
||||
<!-- Default configuration is appropriate for entity/collection caching. -->
|
||||
|
@ -57,9 +56,11 @@
|
|||
lockAcquisitionTimeout="15000" useLockStriping="false"/>
|
||||
<!-- Eviction configuration. WakeupInterval defines how often the eviction thread runs, in milliseconds.
|
||||
0 means the eviction thread will never run. A separate executor is used for eviction in each cache. -->
|
||||
<eviction wakeUpInterval="5000" maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000"/>
|
||||
<eviction maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000" wakeUpInterval="5000"/>
|
||||
<lazyDeserialization enabled="true"/>
|
||||
<transaction transactionMode="TRANSACTIONAL" autoCommit="false"
|
||||
lockingMode="OPTIMISTIC"/>
|
||||
</namedCache>
|
||||
|
||||
<!-- An alternative configuration for entity/collection caching that uses replication instead of invalidation -->
|
||||
|
@ -72,9 +73,11 @@
|
|||
lockAcquisitionTimeout="15000" useLockStriping="false"/>
|
||||
<!-- Eviction configuration. WakeupInterval defines how often the eviction thread runs, in milliseconds.
|
||||
0 means the eviction thread will never run. A separate executor is used for eviction in each cache. -->
|
||||
<eviction wakeUpInterval="5000" maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000"/>
|
||||
<eviction maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000" wakeUpInterval="5000"/>
|
||||
<lazyDeserialization enabled="true"/>
|
||||
<transaction transactionMode="TRANSACTIONAL" autoCommit="false"
|
||||
lockingMode="OPTIMISTIC"/>
|
||||
</namedCache>
|
||||
|
||||
<!-- A config appropriate for query caching. Does not replicate queries. -->
|
||||
|
@ -83,8 +86,10 @@
|
|||
lockAcquisitionTimeout="15000" useLockStriping="false"/>
|
||||
<!--Eviction configuration. WakeupInterval defines how often the eviction thread runs, in milliseconds. 0 means
|
||||
the eviction thread will never run. A separate executor is used for eviction in each cache. -->
|
||||
<eviction wakeUpInterval="5000" maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000"/>
|
||||
<eviction maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000" wakeUpInterval="5000"/>
|
||||
<transaction transactionMode="TRANSACTIONAL" autoCommit="false"
|
||||
lockingMode="OPTIMISTIC"/>
|
||||
</namedCache>
|
||||
|
||||
<!-- A query cache that replicates queries. Replication is asynchronous. -->
|
||||
|
@ -96,8 +101,10 @@
|
|||
lockAcquisitionTimeout="15000" useLockStriping="false"/>
|
||||
<!--Eviction configuration. WakeupInterval defines how often the eviction thread runs, in milliseconds. 0 means
|
||||
the eviction thread will never run. A separate executor is used for eviction in each cache. -->
|
||||
<eviction wakeUpInterval="5000" maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000"/>
|
||||
<eviction maxEntries="10000" strategy="LRU"/>
|
||||
<expiration maxIdle="100000" wakeUpInterval="5000"/>
|
||||
<transaction transactionMode="TRANSACTIONAL" autoCommit="false"
|
||||
lockingMode="OPTIMISTIC"/>
|
||||
<!-- State transfer forces all replication calls to be synchronous,
|
||||
so for calls to remain async, use a cluster cache loader instead -->
|
||||
<loaders passivation="false" shared="false" preload="false">
|
||||
|
@ -122,7 +129,10 @@
|
|||
lockAcquisitionTimeout="15000" useLockStriping="false"/>
|
||||
<lazyDeserialization enabled="true"/>
|
||||
<!-- Don't ever evict modification timestamps -->
|
||||
<eviction wakeUpInterval="0" strategy="NONE"/>
|
||||
<eviction strategy="NONE"/>
|
||||
<expiration wakeUpInterval="0"/>
|
||||
<!-- Explicitly non transactional -->
|
||||
<transaction transactionMode="NON_TRANSACTIONAL"/>
|
||||
<!-- State transfer forces all replication calls to be synchronous,
|
||||
so for calls to remain async, use a cluster cache loader instead -->
|
||||
<loaders passivation="false" shared="false" preload="false">
|
||||
|
|
|
@ -110,23 +110,31 @@ public abstract class AbstractGeneralDataRegionTestCase extends AbstractRegionIm
|
|||
assertNull( "local is clean", localRegion.get( KEY ) );
|
||||
assertNull( "remote is clean", remoteRegion.get( KEY ) );
|
||||
|
||||
localRegion.put( KEY, VALUE1 );
|
||||
assertEquals( VALUE1, localRegion.get( KEY ) );
|
||||
regionPut(localRegion);
|
||||
assertEquals( VALUE1, localRegion.get( KEY ) );
|
||||
|
||||
// allow async propagation
|
||||
sleep( 250 );
|
||||
Object expected = invalidation ? null : VALUE1;
|
||||
assertEquals( expected, remoteRegion.get( KEY ) );
|
||||
|
||||
localRegion.evict( KEY );
|
||||
regionEvict(localRegion);
|
||||
|
||||
// allow async propagation
|
||||
// allow async propagation
|
||||
sleep( 250 );
|
||||
assertEquals( null, localRegion.get( KEY ) );
|
||||
assertEquals( null, remoteRegion.get( KEY ) );
|
||||
}
|
||||
|
||||
protected abstract String getStandardRegionName(String regionPrefix);
|
||||
protected void regionEvict(GeneralDataRegion region) throws Exception {
|
||||
region.evict(KEY);
|
||||
}
|
||||
|
||||
protected void regionPut(GeneralDataRegion region) throws Exception {
|
||||
region.put(KEY, VALUE1);
|
||||
}
|
||||
|
||||
protected abstract String getStandardRegionName(String regionPrefix);
|
||||
|
||||
/**
|
||||
* Test method for {@link QueryResultsRegion#evictAll()}.
|
||||
|
@ -184,14 +192,14 @@ public abstract class AbstractGeneralDataRegionTestCase extends AbstractRegionIm
|
|||
assertNull( "local is clean", localRegion.get( KEY ) );
|
||||
assertNull( "remote is clean", remoteRegion.get( KEY ) );
|
||||
|
||||
localRegion.put( KEY, VALUE1 );
|
||||
assertEquals( VALUE1, localRegion.get( KEY ) );
|
||||
regionPut(localRegion);
|
||||
assertEquals( VALUE1, localRegion.get( KEY ) );
|
||||
|
||||
// Allow async propagation
|
||||
sleep( 250 );
|
||||
|
||||
remoteRegion.put( KEY, VALUE1 );
|
||||
assertEquals( VALUE1, remoteRegion.get( KEY ) );
|
||||
regionPut(remoteRegion);
|
||||
assertEquals( VALUE1, remoteRegion.get( KEY ) );
|
||||
|
||||
// Allow async propagation
|
||||
sleep( 250 );
|
||||
|
|
|
@ -29,7 +29,6 @@ import org.infinispan.Cache;
|
|||
import org.jboss.logging.Logger;
|
||||
|
||||
import org.hibernate.cache.spi.RegionFactory;
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
|
||||
import org.junit.After;
|
||||
import org.junit.Before;
|
||||
|
@ -43,76 +42,77 @@ import org.hibernate.test.cache.infinispan.util.CacheTestSupport;
|
|||
* @since 3.5
|
||||
*/
|
||||
public abstract class AbstractNonFunctionalTestCase extends org.hibernate.testing.junit4.BaseUnitTestCase {
|
||||
private static final Logger log = Logger.getLogger( AbstractNonFunctionalTestCase.class );
|
||||
private static final Logger log = Logger.getLogger(AbstractNonFunctionalTestCase.class);
|
||||
|
||||
public static final String REGION_PREFIX = "test";
|
||||
public static final String REGION_PREFIX = "test";
|
||||
|
||||
private static final String PREFER_IPV4STACK = "java.net.preferIPv4Stack";
|
||||
private String preferIPv4Stack;
|
||||
private static final String PREFER_IPV4STACK = "java.net.preferIPv4Stack";
|
||||
private String preferIPv4Stack;
|
||||
private static final String JGROUPS_CFG_FILE = "hibernate.cache.infinispan.jgroups_cfg";
|
||||
private String jgroupsCfgFile;
|
||||
|
||||
private CacheTestSupport testSupport = new CacheTestSupport();
|
||||
private CacheTestSupport testSupport = new CacheTestSupport();
|
||||
|
||||
@Before
|
||||
public void prepareCacheSupport() throws Exception {
|
||||
preferIPv4Stack = System.getProperty( PREFER_IPV4STACK );
|
||||
System.setProperty( PREFER_IPV4STACK, "true" );
|
||||
@Before
|
||||
public void prepareCacheSupport() throws Exception {
|
||||
preferIPv4Stack = System.getProperty(PREFER_IPV4STACK);
|
||||
System.setProperty(PREFER_IPV4STACK, "true");
|
||||
jgroupsCfgFile = System.getProperty(JGROUPS_CFG_FILE);
|
||||
System.setProperty(JGROUPS_CFG_FILE, "stacks/tcp.xml");
|
||||
|
||||
testSupport.setUp();
|
||||
}
|
||||
testSupport.setUp();
|
||||
}
|
||||
|
||||
@After
|
||||
public void releaseCachSupport() throws Exception {
|
||||
testSupport.tearDown();
|
||||
@After
|
||||
public void releaseCachSupport() throws Exception {
|
||||
testSupport.tearDown();
|
||||
|
||||
if ( preferIPv4Stack == null ) {
|
||||
System.clearProperty( PREFER_IPV4STACK );
|
||||
}
|
||||
else {
|
||||
System.setProperty( PREFER_IPV4STACK, preferIPv4Stack );
|
||||
}
|
||||
}
|
||||
if (preferIPv4Stack == null) {
|
||||
System.clearProperty(PREFER_IPV4STACK);
|
||||
} else {
|
||||
System.setProperty(PREFER_IPV4STACK, preferIPv4Stack);
|
||||
}
|
||||
|
||||
if (jgroupsCfgFile == null)
|
||||
System.clearProperty(JGROUPS_CFG_FILE);
|
||||
else
|
||||
System.setProperty(JGROUPS_CFG_FILE, jgroupsCfgFile);
|
||||
}
|
||||
|
||||
protected void registerCache(Cache cache) {
|
||||
testSupport.registerCache(cache);
|
||||
}
|
||||
protected void registerCache(Cache cache) {
|
||||
testSupport.registerCache(cache);
|
||||
}
|
||||
|
||||
protected void unregisterCache(Cache cache) {
|
||||
testSupport.unregisterCache(cache);
|
||||
}
|
||||
protected void unregisterCache(Cache cache) {
|
||||
testSupport.unregisterCache(cache);
|
||||
}
|
||||
|
||||
protected void registerFactory(RegionFactory factory) {
|
||||
testSupport.registerFactory(factory);
|
||||
}
|
||||
protected void registerFactory(RegionFactory factory) {
|
||||
testSupport.registerFactory(factory);
|
||||
}
|
||||
|
||||
protected void unregisterFactory(RegionFactory factory) {
|
||||
testSupport.unregisterFactory(factory);
|
||||
}
|
||||
protected void unregisterFactory(RegionFactory factory) {
|
||||
testSupport.unregisterFactory(factory);
|
||||
}
|
||||
|
||||
protected CacheTestSupport getCacheTestSupport() {
|
||||
return testSupport;
|
||||
}
|
||||
protected CacheTestSupport getCacheTestSupport() {
|
||||
return testSupport;
|
||||
}
|
||||
|
||||
protected void sleep(long ms) {
|
||||
try {
|
||||
Thread.sleep(ms);
|
||||
}
|
||||
catch (InterruptedException e) {
|
||||
log.warn("Interrupted during sleep", e);
|
||||
}
|
||||
}
|
||||
protected void sleep(long ms) {
|
||||
try {
|
||||
Thread.sleep(ms);
|
||||
} catch (InterruptedException e) {
|
||||
log.warn("Interrupted during sleep", e);
|
||||
}
|
||||
}
|
||||
|
||||
protected void avoidConcurrentFlush() {
|
||||
testSupport.avoidConcurrentFlush();
|
||||
}
|
||||
protected void avoidConcurrentFlush() {
|
||||
testSupport.avoidConcurrentFlush();
|
||||
}
|
||||
|
||||
protected int getValidKeyCount(Set keys) {
|
||||
int result = 0;
|
||||
for (Object key : keys) {
|
||||
if (!(CacheHelper.isEvictAllNotification(key))) {
|
||||
result++;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
protected int getValidKeyCount(Set keys) {
|
||||
return keys.size();
|
||||
}
|
||||
|
||||
}
|
|
@ -31,10 +31,8 @@ import org.hibernate.cache.infinispan.timestamp.TimestampsRegionImpl;
|
|||
import org.hibernate.cache.infinispan.tm.HibernateTransactionManagerLookup;
|
||||
import org.hibernate.cache.infinispan.util.CacheAdapter;
|
||||
import org.hibernate.cfg.Settings;
|
||||
import org.hibernate.cfg.SettingsFactory;
|
||||
import org.hibernate.service.jta.platform.internal.AbstractJtaPlatform;
|
||||
import org.hibernate.service.jta.platform.internal.JBossStandAloneJtaPlatform;
|
||||
import org.hibernate.service.jta.platform.spi.JtaPlatform;
|
||||
import org.hibernate.testing.ServiceRegistryBuilder;
|
||||
import org.infinispan.config.Configuration;
|
||||
import org.infinispan.config.Configuration.CacheMode;
|
||||
|
@ -43,13 +41,6 @@ import org.infinispan.manager.DefaultCacheManager;
|
|||
import org.infinispan.manager.EmbeddedCacheManager;
|
||||
import org.junit.Test;
|
||||
|
||||
import javax.transaction.HeuristicMixedException;
|
||||
import javax.transaction.HeuristicRollbackException;
|
||||
import javax.transaction.InvalidTransactionException;
|
||||
import javax.transaction.NotSupportedException;
|
||||
import javax.transaction.RollbackException;
|
||||
import javax.transaction.SystemException;
|
||||
import javax.transaction.Transaction;
|
||||
import javax.transaction.TransactionManager;
|
||||
|
||||
/**
|
||||
|
@ -78,8 +69,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
p.setProperty("hibernate.cache.infinispan.query.eviction.wake_up_interval", "3000");
|
||||
p.setProperty("hibernate.cache.infinispan.query.eviction.max_entries", "10000");
|
||||
|
||||
InfinispanRegionFactory factory = new InfinispanRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
|
||||
assertEquals("entity", factory.getTypeOverrides().get("entity").getCacheName());
|
||||
assertEquals("entity", factory.getTypeOverrides().get("collection").getCacheName());
|
||||
|
@ -101,6 +91,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
assertEquals(3000, factory.getTypeOverrides().get("query").getEvictionWakeUpInterval());
|
||||
assertEquals(10000, factory.getTypeOverrides().get("query").getEvictionMaxEntries());
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testBuildEntityCollectionRegionsPersonPlusEntityCollectionOverrides() {
|
||||
final String person = "com.acme.Person";
|
||||
|
@ -130,8 +121,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
p.setProperty("hibernate.cache.infinispan.collection.eviction.strategy", "LRU");
|
||||
p.setProperty("hibernate.cache.infinispan.collection.eviction.wake_up_interval", "3500");
|
||||
p.setProperty("hibernate.cache.infinispan.collection.eviction.max_entries", "25000");
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
try {
|
||||
assertFalse(manager.getGlobalConfiguration().isExposeGlobalJmxStatistics());
|
||||
|
@ -217,7 +207,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
|
||||
@Test
|
||||
public void testBuildEntityCollectionRegionOverridesOnly() {
|
||||
CacheAdapter cache = null;
|
||||
CacheAdapter cache;
|
||||
Properties p = new Properties();
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.strategy", "FIFO");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.wake_up_interval", "3000");
|
||||
|
@ -225,8 +215,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
p.setProperty("hibernate.cache.infinispan.collection.eviction.strategy", "LRU");
|
||||
p.setProperty("hibernate.cache.infinispan.collection.eviction.wake_up_interval", "3500");
|
||||
p.setProperty("hibernate.cache.infinispan.collection.eviction.max_entries", "35000");
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
factory.getCacheManager();
|
||||
try {
|
||||
EntityRegionImpl region = (EntityRegionImpl) factory.buildEntityRegion("com.acme.Address", p, null);
|
||||
|
@ -262,8 +251,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
p.setProperty("hibernate.cache.infinispan.entity.eviction.strategy", "FIFO");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.wake_up_interval", "3000");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.max_entries", "10000");
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
try {
|
||||
assertNotNull(factory.getTypeOverrides().get(person));
|
||||
|
@ -286,7 +274,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
public void testTimestampValidation() {
|
||||
Properties p = new Properties();
|
||||
final DefaultCacheManager manager = new DefaultCacheManager();
|
||||
InfinispanRegionFactory factory = createRegionFactory(manager);
|
||||
InfinispanRegionFactory factory = createRegionFactory(manager, p);
|
||||
Configuration config = new Configuration();
|
||||
config.setCacheMode(CacheMode.INVALIDATION_SYNC);
|
||||
manager.defineConfiguration("timestamps", config);
|
||||
|
@ -300,8 +288,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
public void testBuildDefaultTimestampsRegion() {
|
||||
final String timestamps = "org.hibernate.cache.spi.UpdateTimestampsCache";
|
||||
Properties p = new Properties();
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
try {
|
||||
assertTrue(factory.getDefinedConfigurations().contains("timestamps"));
|
||||
|
@ -325,8 +312,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
final String timestamps = "org.hibernate.cache.spi.UpdateTimestampsCache";
|
||||
Properties p = new Properties();
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.cfg", "unrecommended-timestamps");
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
try {
|
||||
assertFalse(factory.getDefinedConfigurations().contains("timestamp"));
|
||||
|
@ -351,9 +337,8 @@ public class InfinispanRegionFactoryTestCase {
|
|||
public void testBuildTimestamRegionWithCacheNameOverride() {
|
||||
final String timestamps = "org.hibernate.cache.spi.UpdateTimestampsCache";
|
||||
Properties p = new Properties();
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.cfg", "mytimestamps-cache");
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
try {
|
||||
factory.buildTimestampsRegion(timestamps, p);
|
||||
assertTrue(factory.getDefinedConfigurations().contains("mytimestamps-cache"));
|
||||
|
@ -365,31 +350,30 @@ public class InfinispanRegionFactoryTestCase {
|
|||
public void testBuildTimestamRegionWithFifoEvictionOverride() {
|
||||
final String timestamps = "org.hibernate.cache.spi.UpdateTimestampsCache";
|
||||
Properties p = new Properties();
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.cfg", "mytimestamps-cache");
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.strategy", "FIFO");
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.wake_up_interval", "3000");
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.max_entries", "10000");
|
||||
InfinispanRegionFactory factory = null;
|
||||
try {
|
||||
factory.start(null, p);
|
||||
factory = createRegionFactory(p);
|
||||
factory.buildTimestampsRegion(timestamps, p);
|
||||
assertTrue(factory.getDefinedConfigurations().contains("mytimestamps-cache"));
|
||||
fail("Should fail cos no eviction configurations are allowed for timestamp caches");
|
||||
} catch(CacheException ce) {
|
||||
} finally {
|
||||
factory.stop();
|
||||
if (factory != null) factory.stop();
|
||||
}
|
||||
}
|
||||
@Test
|
||||
public void testBuildTimestamRegionWithNoneEvictionOverride() {
|
||||
final String timestamps = "org.hibernate.cache.spi.UpdateTimestampsCache";
|
||||
Properties p = new Properties();
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.cfg", "timestamps-none-eviction");
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.strategy", "NONE");
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.wake_up_interval", "3000");
|
||||
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.max_entries", "10000");
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
manager.getGlobalConfiguration().setTransportClass(null);
|
||||
try {
|
||||
|
@ -403,8 +387,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
public void testBuildQueryRegion() {
|
||||
final String query = "org.hibernate.cache.internal.StandardQueryCache";
|
||||
Properties p = new Properties();
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
manager.getGlobalConfiguration().setTransportClass(null);
|
||||
try {
|
||||
|
@ -422,12 +405,11 @@ public class InfinispanRegionFactoryTestCase {
|
|||
public void testBuildQueryRegionWithCustomRegionName() {
|
||||
final String queryRegionName = "myquery";
|
||||
Properties p = new Properties();
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
p.setProperty("hibernate.cache.infinispan.myquery.cfg", "timestamps-none-eviction");
|
||||
p.setProperty("hibernate.cache.infinispan.myquery.eviction.strategy", "FIFO");
|
||||
p.setProperty("hibernate.cache.infinispan.myquery.eviction.wake_up_interval", "2222");
|
||||
p.setProperty("hibernate.cache.infinispan.myquery.eviction.max_entries", "11111");
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
manager.getGlobalConfiguration().setTransportClass(null);
|
||||
try {
|
||||
|
@ -454,8 +436,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
p.setProperty("hibernate.cache.infinispan.entity.eviction.strategy", "FIFO");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.wake_up_interval", "3000");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.max_entries", "10000");
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
try {
|
||||
assertTrue(manager.getGlobalConfiguration().isExposeGlobalJmxStatistics());
|
||||
|
@ -502,8 +483,7 @@ public class InfinispanRegionFactoryTestCase {
|
|||
p.setProperty("hibernate.cache.infinispan.entity.eviction.strategy", "FIFO");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.wake_up_interval", "3000");
|
||||
p.setProperty("hibernate.cache.infinispan.entity.eviction.max_entries", "10000");
|
||||
InfinispanRegionFactory factory = createRegionFactory();
|
||||
factory.start(null, p);
|
||||
InfinispanRegionFactory factory = createRegionFactory(p);
|
||||
EmbeddedCacheManager manager = factory.getCacheManager();
|
||||
try {
|
||||
assertFalse(manager.getGlobalConfiguration().isExposeGlobalJmxStatistics());
|
||||
|
@ -541,12 +521,12 @@ public class InfinispanRegionFactoryTestCase {
|
|||
}
|
||||
}
|
||||
|
||||
private InfinispanRegionFactory createRegionFactory() {
|
||||
return createRegionFactory(null);
|
||||
private InfinispanRegionFactory createRegionFactory(Properties p) {
|
||||
return createRegionFactory(null, p);
|
||||
}
|
||||
|
||||
private InfinispanRegionFactory createRegionFactory(final EmbeddedCacheManager manager) {
|
||||
return new InfinispanRegionFactory() {
|
||||
private InfinispanRegionFactory createRegionFactory(final EmbeddedCacheManager manager, Properties p) {
|
||||
final InfinispanRegionFactory factory = new InfinispanRegionFactory() {
|
||||
@Override
|
||||
protected HibernateTransactionManagerLookup createTransactionManagerLookup(Settings settings, Properties properties) {
|
||||
return new HibernateTransactionManagerLookup(null, null) {
|
||||
|
@ -567,6 +547,8 @@ public class InfinispanRegionFactoryTestCase {
|
|||
return super.createCacheManager(properties);
|
||||
}
|
||||
};
|
||||
factory.start(null, p);
|
||||
return factory;
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -25,6 +25,7 @@ package org.hibernate.test.cache.infinispan;
|
|||
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.Callable;
|
||||
|
||||
import org.hibernate.cache.spi.CacheDataDescription;
|
||||
import org.hibernate.cache.infinispan.InfinispanRegionFactory;
|
||||
|
@ -37,6 +38,8 @@ import org.hibernate.service.internal.StandardServiceRegistryImpl;
|
|||
|
||||
import org.hibernate.test.cache.infinispan.util.CacheTestUtil;
|
||||
|
||||
import static org.hibernate.cache.infinispan.util.CacheHelper.withinTx;
|
||||
|
||||
/**
|
||||
* Defines the environment for a node.
|
||||
*
|
||||
|
@ -117,15 +120,27 @@ public class NodeEnvironment {
|
|||
|
||||
public void release() throws Exception {
|
||||
if ( entityRegionMap != null ) {
|
||||
for ( EntityRegionImpl region : entityRegionMap.values() ) {
|
||||
region.getCacheAdapter().withFlags( FlagAdapter.CACHE_MODE_LOCAL ).clear();
|
||||
for ( final EntityRegionImpl region : entityRegionMap.values() ) {
|
||||
withinTx(region.getTransactionManager(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
region.getCacheAdapter().withFlags(FlagAdapter.CACHE_MODE_LOCAL).clear();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
region.getCacheAdapter().stop();
|
||||
}
|
||||
entityRegionMap.clear();
|
||||
}
|
||||
if ( collectionRegionMap != null ) {
|
||||
for ( CollectionRegionImpl collectionRegion : collectionRegionMap.values() ) {
|
||||
collectionRegion.getCacheAdapter().withFlags( FlagAdapter.CACHE_MODE_LOCAL ).clear();
|
||||
for ( final CollectionRegionImpl collectionRegion : collectionRegionMap.values() ) {
|
||||
withinTx(collectionRegion.getTransactionManager(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
collectionRegion.getCacheAdapter().withFlags( FlagAdapter.CACHE_MODE_LOCAL ).clear();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
collectionRegion.getCacheAdapter().stop();
|
||||
}
|
||||
collectionRegionMap.clear();
|
||||
|
|
|
@ -31,6 +31,7 @@ import java.util.concurrent.Executors;
|
|||
import java.util.concurrent.Future;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
import org.infinispan.transaction.tm.BatchModeTransactionManager;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
|
@ -52,7 +53,6 @@ import junit.framework.AssertionFailedError;
|
|||
|
||||
import org.hibernate.test.cache.infinispan.AbstractNonFunctionalTestCase;
|
||||
import org.hibernate.test.cache.infinispan.NodeEnvironment;
|
||||
import org.hibernate.test.cache.infinispan.functional.cluster.DualNodeJtaTransactionManagerImpl;
|
||||
import org.hibernate.test.cache.infinispan.util.CacheTestUtil;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
@ -162,8 +162,8 @@ public abstract class AbstractCollectionRegionAccessStrategyTestCase extends Abs
|
|||
public void testPutFromLoadRemoveDoesNotProduceStaleData() throws Exception {
|
||||
final CountDownLatch pferLatch = new CountDownLatch( 1 );
|
||||
final CountDownLatch removeLatch = new CountDownLatch( 1 );
|
||||
TransactionManager tm = DualNodeJtaTransactionManagerImpl.getInstance( "test1234" );
|
||||
PutFromLoadValidator validator = new PutFromLoadValidator( tm ) {
|
||||
final TransactionManager remoteTm = remoteCollectionRegion.getTransactionManager();
|
||||
PutFromLoadValidator validator = new PutFromLoadValidator(remoteTm) {
|
||||
@Override
|
||||
public boolean acquirePutFromLoadLock(Object key) {
|
||||
boolean acquired = super.acquirePutFromLoadLock( key );
|
||||
|
@ -182,9 +182,10 @@ public abstract class AbstractCollectionRegionAccessStrategyTestCase extends Abs
|
|||
return acquired;
|
||||
}
|
||||
};
|
||||
final TransactionalAccessDelegate delegate = new TransactionalAccessDelegate(
|
||||
(CollectionRegionImpl) localCollectionRegion, validator
|
||||
);
|
||||
|
||||
final TransactionalAccessDelegate delegate =
|
||||
new TransactionalAccessDelegate(localCollectionRegion, validator);
|
||||
final TransactionManager localTm = localCollectionRegion.getTransactionManager();
|
||||
|
||||
Callable<Void> pferCallable = new Callable<Void>() {
|
||||
public Void call() throws Exception {
|
||||
|
@ -196,7 +197,13 @@ public abstract class AbstractCollectionRegionAccessStrategyTestCase extends Abs
|
|||
Callable<Void> removeCallable = new Callable<Void>() {
|
||||
public Void call() throws Exception {
|
||||
removeLatch.await();
|
||||
delegate.remove( "k1" );
|
||||
CacheHelper.withinTx(localTm, new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
delegate.remove("k1");
|
||||
return null;
|
||||
}
|
||||
});
|
||||
pferLatch.countDown();
|
||||
return null;
|
||||
}
|
||||
|
@ -355,26 +362,26 @@ public abstract class AbstractCollectionRegionAccessStrategyTestCase extends Abs
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testRemove() {
|
||||
public void testRemove() throws Exception {
|
||||
evictOrRemoveTest( false );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveAll() {
|
||||
public void testRemoveAll() throws Exception {
|
||||
evictOrRemoveAllTest( false );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEvict() {
|
||||
public void testEvict() throws Exception {
|
||||
evictOrRemoveTest( true );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEvictAll() {
|
||||
public void testEvictAll() throws Exception {
|
||||
evictOrRemoveAllTest( true );
|
||||
}
|
||||
|
||||
private void evictOrRemoveTest(boolean evict) {
|
||||
private void evictOrRemoveTest(final boolean evict) throws Exception {
|
||||
|
||||
final String KEY = KEY_BASE + testCount++;
|
||||
|
||||
|
@ -389,19 +396,23 @@ public abstract class AbstractCollectionRegionAccessStrategyTestCase extends Abs
|
|||
// Wait for async propagation
|
||||
sleep( 250 );
|
||||
|
||||
if ( evict ) {
|
||||
localAccessStrategy.evict( KEY );
|
||||
}
|
||||
else {
|
||||
localAccessStrategy.remove( KEY );
|
||||
}
|
||||
CacheHelper.withinTx(localCollectionRegion.getTransactionManager(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
if (evict)
|
||||
localAccessStrategy.evict(KEY);
|
||||
else
|
||||
localAccessStrategy.remove(KEY);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
assertEquals( null, localAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
|
||||
assertEquals( null, remoteAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
}
|
||||
|
||||
private void evictOrRemoveAllTest(boolean evict) {
|
||||
private void evictOrRemoveAllTest(final boolean evict) throws Exception {
|
||||
|
||||
final String KEY = KEY_BASE + testCount++;
|
||||
|
||||
|
@ -420,12 +431,16 @@ public abstract class AbstractCollectionRegionAccessStrategyTestCase extends Abs
|
|||
// Wait for async propagation
|
||||
sleep( 250 );
|
||||
|
||||
if ( evict ) {
|
||||
localAccessStrategy.evictAll();
|
||||
}
|
||||
else {
|
||||
localAccessStrategy.removeAll();
|
||||
}
|
||||
CacheHelper.withinTx(localCollectionRegion.getTransactionManager(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
if (evict)
|
||||
localAccessStrategy.evictAll();
|
||||
else
|
||||
localAccessStrategy.removeAll();
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// This should re-establish the region root node
|
||||
assertNull( localAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
|
|
|
@ -76,7 +76,7 @@ public class CollectionRegionImplTestCase extends AbstractEntityCollectionRegion
|
|||
|
||||
@Override
|
||||
protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache(InfinispanRegionFactory.DEF_ENTITY_RESOURCE));
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache(InfinispanRegionFactory.DEF_ENTITY_RESOURCE).getAdvancedCache());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -23,9 +23,16 @@
|
|||
*/
|
||||
package org.hibernate.test.cache.infinispan.entity;
|
||||
|
||||
import java.util.ArrayList;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
import org.infinispan.Cache;
|
||||
import org.infinispan.test.TestingUtil;
|
||||
import org.infinispan.transaction.tm.BatchModeTransactionManager;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
|
@ -105,8 +112,15 @@ public abstract class AbstractEntityRegionAccessStrategyTestCase extends Abstrac
|
|||
|
||||
remoteEntityRegion = remoteEnvironment.getEntityRegion( REGION_NAME, getCacheDataDescription() );
|
||||
remoteAccessStrategy = remoteEntityRegion.buildAccessStrategy( getAccessType() );
|
||||
|
||||
waitForClusterToForm(localEntityRegion.getCacheAdapter().getCache(),
|
||||
remoteEntityRegion.getCacheAdapter().getCache());
|
||||
}
|
||||
|
||||
protected void waitForClusterToForm(Cache... caches) {
|
||||
TestingUtil.blockUntilViewsReceived(10000, Arrays.asList(caches));
|
||||
}
|
||||
|
||||
protected abstract String getConfigurationName();
|
||||
|
||||
protected static Configuration createConfiguration(String configName) {
|
||||
|
@ -503,26 +517,26 @@ public abstract class AbstractEntityRegionAccessStrategyTestCase extends Abstrac
|
|||
}
|
||||
|
||||
@Test
|
||||
public void testRemove() {
|
||||
public void testRemove() throws Exception {
|
||||
evictOrRemoveTest( false );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testRemoveAll() {
|
||||
public void testRemoveAll() throws Exception {
|
||||
evictOrRemoveAllTest( false );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEvict() {
|
||||
public void testEvict() throws Exception {
|
||||
evictOrRemoveTest( true );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEvictAll() {
|
||||
public void testEvictAll() throws Exception {
|
||||
evictOrRemoveAllTest( true );
|
||||
}
|
||||
|
||||
private void evictOrRemoveTest(boolean evict) {
|
||||
private void evictOrRemoveTest(final boolean evict) throws Exception {
|
||||
final String KEY = KEY_BASE + testCount++;
|
||||
assertEquals( 0, getValidKeyCount( localEntityRegion.getCacheAdapter().keySet() ) );
|
||||
assertEquals( 0, getValidKeyCount( remoteEntityRegion.getCacheAdapter().keySet() ) );
|
||||
|
@ -535,20 +549,23 @@ public abstract class AbstractEntityRegionAccessStrategyTestCase extends Abstrac
|
|||
remoteAccessStrategy.putFromLoad( KEY, VALUE1, System.currentTimeMillis(), new Integer( 1 ) );
|
||||
assertEquals( VALUE1, remoteAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
|
||||
if ( evict ) {
|
||||
localAccessStrategy.evict( KEY );
|
||||
}
|
||||
else {
|
||||
localAccessStrategy.remove( KEY );
|
||||
}
|
||||
|
||||
assertEquals( null, localAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
CacheHelper.withinTx(localEntityRegion.getTransactionManager(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
if ( evict )
|
||||
localAccessStrategy.evict( KEY );
|
||||
else
|
||||
localAccessStrategy.remove( KEY );
|
||||
return null;
|
||||
}
|
||||
});
|
||||
assertEquals(null, localAccessStrategy.get(KEY, System.currentTimeMillis()));
|
||||
assertEquals( 0, getValidKeyCount( localEntityRegion.getCacheAdapter().keySet() ) );
|
||||
assertEquals( null, remoteAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
assertEquals( 0, getValidKeyCount( remoteEntityRegion.getCacheAdapter().keySet() ) );
|
||||
}
|
||||
|
||||
private void evictOrRemoveAllTest(boolean evict) {
|
||||
private void evictOrRemoveAllTest(final boolean evict) throws Exception {
|
||||
final String KEY = KEY_BASE + testCount++;
|
||||
assertEquals( 0, getValidKeyCount( localEntityRegion.getCacheAdapter().keySet() ) );
|
||||
assertEquals( 0, getValidKeyCount( remoteEntityRegion.getCacheAdapter().keySet() ) );
|
||||
|
@ -567,16 +584,21 @@ public abstract class AbstractEntityRegionAccessStrategyTestCase extends Abstrac
|
|||
// Wait for async propagation
|
||||
sleep( 250 );
|
||||
|
||||
if ( evict ) {
|
||||
log.debug("Call evict all locally");
|
||||
localAccessStrategy.evictAll();
|
||||
}
|
||||
else {
|
||||
localAccessStrategy.removeAll();
|
||||
}
|
||||
CacheHelper.withinTx(localEntityRegion.getTransactionManager(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
if (evict) {
|
||||
log.debug("Call evict all locally");
|
||||
localAccessStrategy.evictAll();
|
||||
} else {
|
||||
localAccessStrategy.removeAll();
|
||||
}
|
||||
return null;
|
||||
}
|
||||
});
|
||||
|
||||
// This should re-establish the region root node in the optimistic case
|
||||
assertNull( localAccessStrategy.get( KEY, System.currentTimeMillis() ) );
|
||||
assertNull(localAccessStrategy.get(KEY, System.currentTimeMillis()));
|
||||
assertEquals( 0, getValidKeyCount( localEntityRegion.getCacheAdapter().keySet() ) );
|
||||
|
||||
// Re-establishing the region root on the local node doesn't
|
||||
|
|
|
@ -87,7 +87,7 @@ public class EntityRegionImplTestCase extends AbstractEntityCollectionRegionTest
|
|||
|
||||
@Override
|
||||
protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache(InfinispanRegionFactory.DEF_ENTITY_RESOURCE));
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache(InfinispanRegionFactory.DEF_ENTITY_RESOURCE).getAdvancedCache());
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -1,132 +0,0 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* Copyright (c) 2011, Red Hat Inc. or third-party contributors as
|
||||
* indicated by the @author tags or express copyright attribution
|
||||
* statements applied by the authors. All third-party contributions are
|
||||
* distributed under license by Red Hat Inc.
|
||||
*
|
||||
* This copyrighted material is made available to anyone wishing to use, modify,
|
||||
* copy, or redistribute it subject to the terms and conditions of the GNU
|
||||
* Lesser General Public License, as published by the Free Software Foundation.
|
||||
*
|
||||
* This program 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 distribution; if not, write to:
|
||||
* Free Software Foundation, Inc.
|
||||
* 51 Franklin Street, Fifth Floor
|
||||
* Boston, MA 02110-1301 USA
|
||||
*/
|
||||
package org.hibernate.test.cache.infinispan.functional;
|
||||
|
||||
import javax.transaction.TransactionManager;
|
||||
import java.util.Map;
|
||||
|
||||
import org.infinispan.util.logging.Log;
|
||||
import org.infinispan.util.logging.LogFactory;
|
||||
|
||||
import org.hibernate.Session;
|
||||
import org.hibernate.engine.transaction.internal.jdbc.JdbcTransactionFactory;
|
||||
import org.hibernate.engine.transaction.spi.TransactionFactory;
|
||||
import org.hibernate.stat.SecondLevelCacheStatistics;
|
||||
import org.hibernate.stat.Statistics;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* BasicJdbcTransactionalTestCase.
|
||||
*
|
||||
* @author Galder Zamarreño
|
||||
* @since 3.5
|
||||
*/
|
||||
public class BasicJdbcTransactionalTestCase extends SingleNodeTestCase {
|
||||
private static final Log log = LogFactory.getLog( BasicJdbcTransactionalTestCase.class );
|
||||
|
||||
@Override
|
||||
protected Class<? extends TransactionFactory> getTransactionFactoryClass() {
|
||||
return JdbcTransactionFactory.class;
|
||||
}
|
||||
|
||||
@Override
|
||||
protected TransactionManager getTransactionManager() {
|
||||
return null;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testCollectionCache() throws Exception {
|
||||
Item item = new Item( "chris", "Chris's Item" );
|
||||
Item another = new Item( "another", "Owned Item" );
|
||||
item.addItem( another );
|
||||
|
||||
Session s = null;
|
||||
try {
|
||||
s = openSession();
|
||||
s.beginTransaction();
|
||||
s.persist( item );
|
||||
s.persist( another );
|
||||
s.getTransaction().commit();
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.error( "Exception", e );
|
||||
s.getTransaction().rollback();
|
||||
throw e;
|
||||
}
|
||||
finally {
|
||||
s.close();
|
||||
}
|
||||
|
||||
try {
|
||||
s = openSession();
|
||||
s.beginTransaction();
|
||||
Item loaded = (Item) s.load( Item.class, item.getId() );
|
||||
assertEquals( 1, loaded.getItems().size() );
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.error( "Exception", e );
|
||||
s.getTransaction().rollback();
|
||||
throw e;
|
||||
}
|
||||
finally {
|
||||
s.close();
|
||||
}
|
||||
|
||||
try {
|
||||
s = openSession();
|
||||
s.beginTransaction();
|
||||
Statistics stats = s.getSessionFactory().getStatistics();
|
||||
SecondLevelCacheStatistics cStats = stats.getSecondLevelCacheStatistics( Item.class.getName() + ".items" );
|
||||
Item loadedWithCachedCollection = (Item) s.load( Item.class, item.getId() );
|
||||
stats.logSummary();
|
||||
assertEquals( item.getName(), loadedWithCachedCollection.getName() );
|
||||
assertEquals( item.getItems().size(), loadedWithCachedCollection.getItems().size() );
|
||||
assertEquals( 1, cStats.getHitCount() );
|
||||
Map cacheEntries = cStats.getEntries();
|
||||
assertEquals( 1, cacheEntries.size() );
|
||||
}
|
||||
catch (Exception e) {
|
||||
log.error( "Exception", e );
|
||||
s.getTransaction().rollback();
|
||||
throw e;
|
||||
}
|
||||
finally {
|
||||
s.close();
|
||||
}
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testEmptySecondLevelCacheEntry() throws Exception {
|
||||
sessionFactory().getCache().evictCollectionRegion( Item.class.getName() + ".items" );
|
||||
Statistics stats = sessionFactory().getStatistics();
|
||||
stats.clear();
|
||||
SecondLevelCacheStatistics statistics = stats.getSecondLevelCacheStatistics( Item.class.getName() + ".items" );
|
||||
Map cacheEntries = statistics.getEntries();
|
||||
assertEquals( 0, cacheEntries.size() );
|
||||
}
|
||||
|
||||
}
|
|
@ -35,8 +35,6 @@ import org.infinispan.notifications.cachelistener.event.CacheEntryModifiedEvent;
|
|||
import org.infinispan.notifications.cachelistener.event.CacheEntryVisitedEvent;
|
||||
import org.jboss.logging.Logger;
|
||||
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
|
||||
@Listener
|
||||
public class CacheAccessListener {
|
||||
private static final Logger log = Logger.getLogger( CacheAccessListener.class );
|
||||
|
@ -51,7 +49,7 @@ public class CacheAccessListener {
|
|||
|
||||
@CacheEntryModified
|
||||
public void nodeModified( CacheEntryModifiedEvent event ) {
|
||||
if (!event.isPre() && !CacheHelper.isEvictAllNotification(event.getKey())) {
|
||||
if (!event.isPre()) {
|
||||
Object key = event.getKey();
|
||||
log.info("Modified node " + key);
|
||||
modified.add(key.toString());
|
||||
|
@ -60,7 +58,7 @@ public class CacheAccessListener {
|
|||
|
||||
@CacheEntryCreated
|
||||
public void nodeCreated( CacheEntryCreatedEvent event ) {
|
||||
if (!event.isPre() && !CacheHelper.isEvictAllNotification(event.getKey())) {
|
||||
if (!event.isPre()) {
|
||||
Object key = event.getKey();
|
||||
log.info("Created node " + key);
|
||||
modified.add(key.toString());
|
||||
|
@ -69,7 +67,7 @@ public class CacheAccessListener {
|
|||
|
||||
@CacheEntryVisited
|
||||
public void nodeVisited( CacheEntryVisitedEvent event ) {
|
||||
if (!event.isPre() && !CacheHelper.isEvictAllNotification(event.getKey())) {
|
||||
if (!event.isPre()) {
|
||||
Object key = event.getKey();
|
||||
log.info("Visited node " + key);
|
||||
accessed.add(key.toString());
|
||||
|
|
|
@ -40,7 +40,6 @@ import org.jboss.util.collection.ConcurrentSet;
|
|||
import org.hibernate.Session;
|
||||
import org.hibernate.SessionFactory;
|
||||
import org.hibernate.cache.spi.CacheKey;
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
|
||||
import org.junit.Test;
|
||||
|
||||
|
@ -340,13 +339,7 @@ public class EntityCollectionInvalidationTestCase extends DualNodeTestCase {
|
|||
}
|
||||
|
||||
protected int getValidKeyCount(Set keys) {
|
||||
int result = 0;
|
||||
for ( Object key : keys ) {
|
||||
if ( !(CacheHelper.isEvictAllNotification( key )) ) {
|
||||
result++;
|
||||
}
|
||||
}
|
||||
return result;
|
||||
return keys.size();
|
||||
}
|
||||
|
||||
@Listener
|
||||
|
|
|
@ -24,9 +24,12 @@
|
|||
package org.hibernate.test.cache.infinispan.query;
|
||||
|
||||
import java.util.Properties;
|
||||
import java.util.concurrent.Callable;
|
||||
import java.util.concurrent.CountDownLatch;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
||||
import org.hibernate.cache.infinispan.util.CacheHelper;
|
||||
import org.hibernate.cache.spi.GeneralDataRegion;
|
||||
import org.infinispan.notifications.Listener;
|
||||
import org.infinispan.notifications.cachelistener.annotation.CacheEntryVisited;
|
||||
import org.infinispan.notifications.cachelistener.event.CacheEntryVisitedEvent;
|
||||
|
@ -76,9 +79,31 @@ public class QueryRegionImplTestCase extends AbstractGeneralDataRegionTestCase {
|
|||
return regionPrefix + "/" + StandardQueryCache.class.getName();
|
||||
}
|
||||
|
||||
@Override
|
||||
@Override
|
||||
protected void regionPut(final GeneralDataRegion region) throws Exception {
|
||||
CacheHelper.withinTx(BatchModeTransactionManager.getInstance(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
region.put(KEY, VALUE1);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void regionEvict(final GeneralDataRegion region) throws Exception {
|
||||
CacheHelper.withinTx(BatchModeTransactionManager.getInstance(), new Callable<Void>() {
|
||||
@Override
|
||||
public Void call() throws Exception {
|
||||
region.evict(KEY);
|
||||
return null;
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Override
|
||||
protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
|
||||
return CacheAdapterImpl.newInstance( regionFactory.getCacheManager().getCache( "local-query" ) );
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache( "local-query" ).getAdvancedCache());
|
||||
}
|
||||
|
||||
@Override
|
||||
|
|
|
@ -76,7 +76,7 @@ public class TimestampsRegionImplTestCase extends AbstractGeneralDataRegionTestC
|
|||
|
||||
@Override
|
||||
protected CacheAdapter getInfinispanCache(InfinispanRegionFactory regionFactory) {
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache("timestamps"));
|
||||
return CacheAdapterImpl.newInstance(regionFactory.getCacheManager().getCache("timestamps").getAdvancedCache());
|
||||
}
|
||||
|
||||
public void testClearTimestampsRegionInIsolated() throws Exception {
|
||||
|
@ -141,7 +141,7 @@ public class TimestampsRegionImplTestCase extends AbstractGeneralDataRegionTestC
|
|||
// }
|
||||
|
||||
@Override
|
||||
protected ClassLoaderAwareCache createCacheWrapper(AdvancedCache cache) {
|
||||
protected AdvancedCache createCacheWrapper(AdvancedCache cache) {
|
||||
return new ClassLoaderAwareCache(cache, Thread.currentThread().getContextClassLoader()) {
|
||||
@Override
|
||||
public void addListener(Object listener) {
|
||||
|
|
|
@ -26,6 +26,7 @@ import java.util.Enumeration;
|
|||
import java.util.HashSet;
|
||||
import java.util.Properties;
|
||||
import java.util.Set;
|
||||
|
||||
import junit.framework.Test;
|
||||
import junit.framework.TestCase;
|
||||
import junit.framework.TestSuite;
|
||||
|
@ -35,6 +36,7 @@ import org.hibernate.cfg.Configuration;
|
|||
import org.hibernate.cfg.Environment;
|
||||
import org.hibernate.cfg.Settings;
|
||||
import org.hibernate.service.ServiceRegistry;
|
||||
import org.hibernate.service.classloading.internal.ClassLoaderServiceImpl;
|
||||
|
||||
/**
|
||||
* Utilities for cache testing.
|
||||
|
@ -80,9 +82,7 @@ public class CacheTestUtil {
|
|||
String factoryType = cfg.getProperty(Environment.CACHE_REGION_FACTORY);
|
||||
Class factoryClass = Thread.currentThread().getContextClassLoader().loadClass(factoryType);
|
||||
InfinispanRegionFactory regionFactory = (InfinispanRegionFactory) factoryClass.newInstance();
|
||||
|
||||
regionFactory.start(settings, properties);
|
||||
|
||||
return regionFactory;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue