HHH-7553 Use new Infinispan configuration exclusively

This commit is contained in:
Galder Zamarreño 2012-10-23 12:08:38 +02:00
parent cf9ef94f8e
commit e57c822cbc
6 changed files with 81 additions and 54 deletions

View File

@ -17,13 +17,14 @@ import org.hibernate.cache.infinispan.timestamp.ClusteredTimestampsRegionImpl;
import org.hibernate.cache.infinispan.util.Caches;
import org.infinispan.AdvancedCache;
import org.infinispan.commands.module.ModuleCommandFactory;
import org.infinispan.config.Configuration;
import org.infinispan.configuration.cache.CacheMode;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.factories.GlobalComponentRegistry;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.manager.EmbeddedCacheManager;
import org.infinispan.transaction.TransactionMode;
import org.infinispan.transaction.lookup.GenericTransactionManagerLookup;
import org.infinispan.util.concurrent.IsolationLevel;
import org.infinispan.configuration.parsing.ConfigurationBuilderHolder;
import org.infinispan.configuration.parsing.ParserRegistry;
@ -318,7 +319,7 @@ public class InfinispanRegionFactory implements RegionFactory {
dissectProperty(prefixLoc, key, properties);
}
}
defineGenericDataTypeCacheConfigurations(settings, properties);
defineGenericDataTypeCacheConfigurations(properties);
definePendingPutsCache();
} catch (CacheException ce) {
throw ce;
@ -475,45 +476,59 @@ public class InfinispanRegionFactory implements RegionFactory {
return cfgOverride;
}
private void defineGenericDataTypeCacheConfigurations(Settings settings, Properties properties) throws CacheException {
private void defineGenericDataTypeCacheConfigurations(Properties properties) {
String[] defaultGenericDataTypes = new String[]{ENTITY_KEY, COLLECTION_KEY, TIMESTAMPS_KEY, QUERY_KEY};
for (String type : defaultGenericDataTypes) {
TypeOverrides override = overrideStatisticsIfPresent(typeOverrides.get(type), properties);
String cacheName = override.getCacheName();
Configuration newCacheCfg = override.createInfinispanConfiguration();
ConfigurationBuilder builder = new ConfigurationBuilder();
// Read base configuration
applyConfiguration(cacheName, builder);
// Apply overrides
Configuration cacheConfig = manager.defineConfiguration(cacheName, cacheName, newCacheCfg);
override.applyTo(builder);
// Configure transaction manager
cacheConfig = configureTransactionManager(cacheConfig, cacheName, properties);
manager.defineConfiguration(cacheName, cacheName, cacheConfig);
configureTransactionManager(builder, cacheName, properties);
// Define configuration, validate and then apply
Configuration cfg = builder.build();
override.validateInfinispanConfiguration(cfg);
manager.defineConfiguration(cacheName, cfg);
definedConfigurations.add(cacheName);
override.validateInfinispanConfiguration(cacheConfig);
}
}
private AdvancedCache getCache(String regionName, String typeKey, Properties properties) {
TypeOverrides regionOverride = typeOverrides.get(regionName);
if (!definedConfigurations.contains(regionName)) {
String templateCacheName = null;
Configuration regionCacheCfg = null;
String templateCacheName;
Configuration regionCacheCfg;
ConfigurationBuilder builder = new ConfigurationBuilder();
if (regionOverride != null) {
if (log.isDebugEnabled()) log.debug("Cache region specific configuration exists: " + regionOverride);
regionOverride = overrideStatisticsIfPresent(regionOverride, properties);
regionCacheCfg = regionOverride.createInfinispanConfiguration();
String cacheName = regionOverride.getCacheName();
if (cacheName != null) // Region specific override with a given cache name
templateCacheName = cacheName;
templateCacheName = cacheName;
else // Region specific override without cache name, so template cache name is generic for data type.
templateCacheName = typeOverrides.get(typeKey).getCacheName();
templateCacheName = typeOverrides.get(typeKey).getCacheName();
// Read template configuration
applyConfiguration(templateCacheName, builder);
regionOverride = overrideStatisticsIfPresent(regionOverride, properties);
regionOverride.applyTo(builder);
} else {
// No region specific overrides, template cache name is generic for data type.
templateCacheName = typeOverrides.get(typeKey).getCacheName();
regionCacheCfg = typeOverrides.get(typeKey).createInfinispanConfiguration();
// Read template configuration
builder.read(manager.getCacheConfiguration(templateCacheName));
// Apply overrides
typeOverrides.get(typeKey).applyTo(builder);
}
// Configure transaction manager
regionCacheCfg = configureTransactionManager(regionCacheCfg, templateCacheName, properties);
// Apply overrides
manager.defineConfiguration(regionName, templateCacheName, regionCacheCfg);
configureTransactionManager(builder, templateCacheName, properties);
// Define configuration
manager.defineConfiguration(regionName, builder.build());
definedConfigurations.add(regionName);
}
AdvancedCache cache = manager.getCache(regionName).getAdvancedCache();
@ -523,6 +538,12 @@ public class InfinispanRegionFactory implements RegionFactory {
return createCacheWrapper(cache);
}
private void applyConfiguration(String cacheName, ConfigurationBuilder builder) {
Configuration cfg = manager.getCacheConfiguration(cacheName);
if (cfg != null)
builder.read(cfg);
}
private CacheCommandFactory getCacheCommandFactory(AdvancedCache cache) {
GlobalComponentRegistry globalCr = cache.getComponentRegistry()
.getGlobalComponentRegistry();
@ -549,25 +570,30 @@ public class InfinispanRegionFactory implements RegionFactory {
return cache;
}
private Configuration configureTransactionManager(Configuration regionOverrides, String templateCacheName, Properties properties) {
private void configureTransactionManager(ConfigurationBuilder builder,
String cacheName, Properties properties) {
// Get existing configuration to verify whether a tm was configured or not.
Configuration templateConfig = manager.defineConfiguration(templateCacheName, new Configuration());
if (templateConfig.isTransactionalCache()) {
String ispnTmLookupClassName = templateConfig.getTransactionManagerLookupClass();
Configuration baseCfg = manager.getCacheConfiguration(cacheName);
if (baseCfg != null && baseCfg.transaction().transactionMode().isTransactional()) {
String ispnTmLookupClassName = baseCfg.transaction().transactionManagerLookup().getClass().getName();
String hbTmLookupClassName = org.hibernate.cache.infinispan.tm.HibernateTransactionManagerLookup.class.getName();
if (ispnTmLookupClassName != null && !ispnTmLookupClassName.equals(hbTmLookupClassName)) {
if (GenericTransactionManagerLookup.class.getName().equals(ispnTmLookupClassName)) {
log.debug("Using default Infinispan transaction manager lookup " +
"instance (GenericTransactionManagerLookup), overriding it " +
"with Hibernate transaction manager lookup");
builder.transaction().transactionManagerLookup(transactionManagerlookup);
} else 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);
// Infinispan TM lookup class null, so apply Hibernate one directly
builder.transaction().transactionManagerLookup(transactionManagerlookup);
}
String useSyncProp = extractProperty(INFINISPAN_USE_SYNCHRONIZATION_PROP, properties);
boolean useSync = useSyncProp == null ? DEF_USE_SYNCHRONIZATION : Boolean.parseBoolean(useSyncProp);
regionOverrides.fluent().transaction().useSynchronization(useSync);
builder.transaction().useSynchronization(useSync);
}
return regionOverrides;
}
private TypeOverrides overrideStatisticsIfPresent(TypeOverrides override, Properties properties) {

View File

@ -25,7 +25,8 @@ import java.util.HashSet;
import java.util.Locale;
import java.util.Set;
import org.infinispan.config.Configuration;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.eviction.EvictionStrategy;
import org.hibernate.cache.CacheException;
@ -118,25 +119,23 @@ public class TypeOverrides {
this.isExposeStatistics = isExposeStatistics;
}
public Configuration createInfinispanConfiguration() {
Configuration cacheCfg = new Configuration();
public void applyTo(ConfigurationBuilder builder) {
if (overridden.contains("evictionStrategy"))
cacheCfg.fluent().eviction().strategy(evictionStrategy);
builder.eviction().strategy(evictionStrategy);
if (overridden.contains("evictionWakeUpInterval"))
cacheCfg.fluent().expiration().wakeUpInterval(evictionWakeUpInterval);
builder.expiration().wakeUpInterval(evictionWakeUpInterval);
if (overridden.contains("evictionMaxEntries"))
cacheCfg.fluent().eviction().maxEntries(evictionMaxEntries);
builder.eviction().maxEntries(evictionMaxEntries);
if (overridden.contains("expirationLifespan"))
cacheCfg.fluent().expiration().lifespan(expirationLifespan);
builder.expiration().lifespan(expirationLifespan);
if (overridden.contains("expirationMaxIdle"))
cacheCfg.fluent().expiration().maxIdle(expirationMaxIdle);
builder.expiration().maxIdle(expirationMaxIdle);
if (overridden.contains("isExposeStatistics") && isExposeStatistics)
cacheCfg.fluent().jmxStatistics();
return cacheCfg;
builder.jmxStatistics().enable();
}
public void validateInfinispanConfiguration(Configuration configuration) throws CacheException {
// no-op
public void validateInfinispanConfiguration(Configuration cfg) throws CacheException {
// no-op, method overriden
}
@Override

View File

@ -21,8 +21,7 @@
*/
package org.hibernate.cache.infinispan.timestamp;
import org.infinispan.config.Configuration;
import org.infinispan.config.Configuration.CacheMode;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.eviction.EvictionStrategy;
import org.hibernate.cache.CacheException;
@ -35,15 +34,16 @@ import org.hibernate.cache.infinispan.TypeOverrides;
* @since 3.5
*/
public class TimestampTypeOverrides extends TypeOverrides {
@Override
public void validateInfinispanConfiguration(Configuration configuration) throws CacheException {
CacheMode cacheMode = configuration.getCacheMode();
if (cacheMode.equals(CacheMode.INVALIDATION_ASYNC) || cacheMode.equals(CacheMode.INVALIDATION_SYNC)) {
public void validateInfinispanConfiguration(Configuration cfg) throws CacheException {
if (cfg.clustering().cacheMode().isInvalidation()) {
throw new CacheException("Timestamp cache cannot be configured with invalidation");
}
EvictionStrategy strategy = configuration.getEvictionStrategy();
EvictionStrategy strategy = cfg.eviction().strategy();
if (!strategy.equals(EvictionStrategy.NONE)) {
throw new CacheException("Timestamp cache cannot be configured with eviction");
}
}
}

View File

@ -242,6 +242,7 @@ public class InfinispanRegionFactoryTestCase {
assertEquals(EvictionStrategy.LIRS, cacheCfg.eviction().strategy());
assertEquals(3000, cacheCfg.expiration().wakeUpInterval());
assertEquals(30000, cacheCfg.eviction().maxEntries());
// Max idle value comes from base XML configuration
assertEquals(100000, cacheCfg.expiration().maxIdle());
CollectionRegionImpl collectionRegion = (CollectionRegionImpl)
@ -394,7 +395,7 @@ public class InfinispanRegionFactoryTestCase {
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");
p.setProperty("hibernate.cache.infinispan.timestamps.eviction.max_entries", "0");
InfinispanRegionFactory factory = createRegionFactory(p);
try {
factory.buildTimestampsRegion(timestamps, p);

View File

@ -69,7 +69,7 @@ public class IsolatedClassLoaderTest extends DualNodeTestCase {
private static ClassLoader originalTCCL;
private static ClassLoader visibleClassesCl;
// private static ClassLoader visibleClassesCl;
@BeforeClass
public static void prepareClassLoader() {
@ -200,12 +200,10 @@ public class IsolatedClassLoaderTest extends DualNodeTestCase {
if ( useNamedRegion ) {
cacheName = "AccountRegion"; // As defined by ClassLoaderTestDAO via calls to query.setCacheRegion
// Define cache configurations for region early to avoid ending up with local caches for this region
localManager.defineConfiguration(
cacheName, "replicated-query", new org.infinispan.config.Configuration()
);
remoteManager.defineConfiguration(
cacheName, "replicated-query", new org.infinispan.config.Configuration()
);
localManager.defineConfiguration(cacheName,
localManager.getCacheConfiguration("replicated-query"));
remoteManager.defineConfiguration(cacheName,
remoteManager.getCacheConfiguration("replicated-query"));
}
else {
cacheName = "replicated-query";

View File

@ -34,6 +34,7 @@ import javax.naming.StringRefAddr;
import javax.transaction.Status;
import javax.transaction.UserTransaction;
import org.infinispan.configuration.cache.ConfigurationBuilder;
import org.infinispan.transaction.lookup.JBossStandaloneJTAManagerLookup;
import org.infinispan.util.logging.Log;
import org.infinispan.util.logging.LogFactory;
@ -84,7 +85,7 @@ public class JBossStandaloneJtaExampleTest {
jndiServer = startJndiServer();
ctx = createJndiContext();
// Inject configuration to initialise transaction manager from config classloader
lookup.init( new org.infinispan.config.Configuration() );
lookup.init(new ConfigurationBuilder().build());
bindTransactionManager();
bindUserTransaction();
}
@ -92,6 +93,8 @@ public class JBossStandaloneJtaExampleTest {
@After
public void tearDown() throws Exception {
try {
unbind("UserTransaction", ctx);
unbind("java:/TransactionManager", ctx);
ctx.close();
jndiServer.stop();
}