/* * JBoss, Home of Professional Open Source * Copyright 2010 Red Hat Inc. and/or its affiliates and other * contributors as indicated by the @author tags. All rights reserved. * See the copyright.txt in the distribution for a full listing of * individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.infinispan.config; import org.infinispan.commons.hash.MurmurHash3; import org.infinispan.config.GlobalConfiguration.ShutdownHookBehavior; import org.infinispan.container.DefaultDataContainer; import org.infinispan.distribution.ch.DefaultConsistentHash; import org.infinispan.eviction.EvictionStrategy; import org.infinispan.eviction.EvictionThreadPolicy; import org.infinispan.executors.DefaultExecutorFactory; import org.infinispan.executors.DefaultScheduledExecutorFactory; import org.infinispan.interceptors.*; import org.infinispan.interceptors.locking.OptimisticLockingInterceptor; import org.infinispan.jmx.JBossMBeanServerLookup; import org.infinispan.loaders.cluster.ClusterCacheLoaderConfig; import org.infinispan.loaders.dummy.DummyInMemoryCacheStore; import org.infinispan.loaders.file.FileCacheStoreConfig; import org.infinispan.marshall.VersionAwareMarshaller; import org.infinispan.marshall.exts.ArrayListExternalizer; import org.infinispan.marshall.exts.ReplicableCommandExternalizer; import org.infinispan.remoting.ReplicationQueueImpl; import org.infinispan.test.AbstractInfinispanTest; import org.infinispan.transaction.lookup.DummyTransactionManagerLookup; import org.infinispan.util.TypedProperties; import org.infinispan.util.concurrent.IsolationLevel; import org.testng.annotations.Test; import java.util.List; import java.util.Properties; import static org.testng.Assert.assertEquals; /** * Programmatic configuration test. * * @author Galder ZamarreƱo * @since 4.1 */ @Test(groups = "functional", testName = "config.ProgrammaticConfigurationTest") public class ProgrammaticConfigurationTest extends AbstractInfinispanTest { public void testGlobalConfiguration() { GlobalConfiguration gc = new GlobalConfiguration().fluent() .transport() .clusterName("boo").distributedSyncTimeout(999L) .addProperty("configurationFile", "jgroups-tcp.xml") .machineId("id").rackId("rack").strictPeerToPeer(true) .globalJmxStatistics() .jmxDomain("org.my.infinispan") .allowDuplicateDomains(true).cacheManagerName("BooMooCacheManager") .mBeanServerLookupClass(JBossMBeanServerLookup.class) .withProperties(new TypedProperties() .setProperty("jb", "oss")) .addProperty("na", "me") .serialization() .version("2.2").marshallerClass(VersionAwareMarshaller.class) .addAdvancedExternalizer(ReplicableCommandExternalizer.class) .addAdvancedExternalizer(999, ArrayListExternalizer.class) .asyncListenerExecutor() .factory(DefaultExecutorFactory.class) .addProperty("maxThreads", "6") .addProperty("threadNamePrefix", "AsyncListenerThread2") .asyncTransportExecutor() .factory(DefaultExecutorFactory.class) .withProperties(new TypedProperties() .setProperty("maxThreads", "26") .setProperty("threadNamePrefix", "AsyncSerializationThread2")) .evictionScheduledExecutor() .factory(DefaultScheduledExecutorFactory.class) .addProperty("threadNamePrefix", "EvictionThread2") .replicationQueueScheduledExecutor() .factory(DefaultScheduledExecutorFactory.class) .addProperty("threadNamePrefix", "ReplicationQueueThread2") .shutdown() .hookBehavior(ShutdownHookBehavior.DONT_REGISTER) .build() ; assertEquals("boo", gc.getClusterName()); assertEquals(999L, gc.getDistributedSyncTimeout()); assertEquals("jgroups-tcp.xml", gc.getTransportProperties().getProperty("configurationFile")); assertEquals("rack", gc.getRackId()); assertEquals("id", gc.getMachineId()); assert gc.isStrictPeerToPeer(); assertEquals("org.my.infinispan", gc.getJmxDomain()); assert gc.isExposeGlobalJmxStatistics(); assert gc.isAllowDuplicateDomains(); assertEquals("BooMooCacheManager", gc.getCacheManagerName()); assertEquals(JBossMBeanServerLookup.class.getName(), gc.getMBeanServerLookup()); assertEquals("oss", gc.getMBeanServerProperties().getProperty("jb")); assertEquals("me", gc.getMBeanServerProperties().getProperty("na")); assertEquals("2.2", gc.getMarshallVersionString()); List<AdvancedExternalizerConfig> exts = gc.getExternalizers(); assertEquals(2, exts.size()); assertEquals(ReplicableCommandExternalizer.class.getName(), exts.get(0).getExternalizerClass()); assertEquals(ArrayListExternalizer.class.getName(), exts.get(1).getExternalizerClass()); assert 999 == exts.get(1).getId(); assertEquals(DefaultExecutorFactory.class.getName(), gc.getAsyncListenerExecutorFactoryClass()); Properties asyncListenerExecutorProps = gc.getAsyncListenerExecutorProperties(); assertEquals("6", asyncListenerExecutorProps.getProperty("maxThreads")); assertEquals("AsyncListenerThread2", asyncListenerExecutorProps.getProperty("threadNamePrefix")); assertEquals(DefaultExecutorFactory.class.getName(), gc.getAsyncTransportExecutorFactoryClass()); Properties asyncTransportExecutorProps = gc.getAsyncTransportExecutorProperties(); assertEquals("26", asyncTransportExecutorProps.getProperty("maxThreads")); assertEquals("AsyncSerializationThread2", asyncTransportExecutorProps.getProperty("threadNamePrefix")); assertEquals(DefaultScheduledExecutorFactory.class.getName(), gc.getEvictionScheduledExecutorFactoryClass()); Properties evictionScheduledExecutorProps = gc.getEvictionScheduledExecutorProperties(); assertEquals("EvictionThread2", evictionScheduledExecutorProps.getProperty("threadNamePrefix")); assertEquals(DefaultScheduledExecutorFactory.class.getName(), gc.getReplicationQueueScheduledExecutorFactoryClass()); Properties replicationQueueScheduledExecutorProps = gc.getReplicationQueueScheduledExecutorProperties(); assertEquals("ReplicationQueueThread2", replicationQueueScheduledExecutorProps.getProperty("threadNamePrefix")); assert ShutdownHookBehavior.DONT_REGISTER == gc.getShutdownHookBehavior(); gc = new GlobalConfiguration(); assert !gc.isExposeGlobalJmxStatistics(); } public void testConfiguration() { Configuration c = new Configuration().fluent() .locking() .concurrencyLevel(1234).isolationLevel(IsolationLevel.SERIALIZABLE) .lockAcquisitionTimeout(8888L).useLockStriping(false).writeSkewCheck(true) .loaders() .shared(true).passivation(false) .addCacheLoader( new FileCacheStoreConfig() .purgeOnStartup(true) .location("/tmp2").streamBufferSize(1615) .asyncStore() .threadPoolSize(14).flushLockTimeout(777L) .shutdownTimeout(666L) .fetchPersistentState(false).ignoreModifications(true) .singletonStore() .pushStateWhenCoordinator(true).pushStateTimeout(8989L) .purgeSynchronously(false)) .addCacheLoader( new DummyInMemoryCacheStore.Cfg() .debug(true) .failKey("fail") .purgeOnStartup(false) .asyncStore() .threadPoolSize(21) .purgeSynchronously(true)) .addCacheLoader( new ClusterCacheLoaderConfig().remoteCallTimeout(7694L)) .preload(true) .transaction() .cacheStopTimeout(1928).eagerLockSingleNode(false) .syncCommitPhase(true).syncRollbackPhase(false).useEagerLocking(false) .recovery() .recoveryInfoCacheName("mmmmmircea") .transactionManagerLookup(new DummyTransactionManagerLookup()) .useSynchronization(true) .deadlockDetection() .spinDuration(8373L) .customInterceptors() .add(new OptimisticLockingInterceptor()).first() .add(new DistributionInterceptor()).last() .add(new CallInterceptor()).atIndex(8) .add(new CacheStoreInterceptor()).after(OptimisticLockingInterceptor.class) .add(new CacheLoaderInterceptor()).before(CallInterceptor.class) .eviction() .maxEntries(7676).strategy(EvictionStrategy.LIRS) .threadPolicy(EvictionThreadPolicy.PIGGYBACK) .expiration() .maxIdle(8392L).lifespan(4372L).wakeUpInterval(7585L) .clustering() .mode(Configuration.CacheMode.INVALIDATION_ASYNC) .async() .replQueueClass(ReplicationQueueImpl.class) .asyncMarshalling(false) .replQueueInterval(5738L) .replQueueMaxElements(19191) .useReplQueue(true) .l1() .lifespan(65738L).onRehash(true) .stateRetrieval() .alwaysProvideInMemoryState(false).fetchInMemoryState(true) .initialRetryWaitTime(8989L).retryWaitTimeIncreaseFactor(4) .numRetries(8).logFlushTimeout(533L).maxNonProgressingLogWrites(434) .timeout(7383L).chunkSize(1234) .hash() .hashFunctionClass(MurmurHash3.class) .consistentHashClass(DefaultConsistentHash.class) .numOwners(200).rehashWait(74843L).rehashRpcTimeout(374L) .rehashEnabled(false) .dataContainer() .dataContainerClass(DefaultDataContainer.class) .dataContainer(new QueryableDataContainer()) .addProperty("a-property", "a-value") .indexing() .indexLocalOnly(true) .addProperty("indexing", "in memory") .unsafe() .unreliableReturnValues(false) .jmxStatistics() .storeAsBinary() .invocationBatching() .build(); assert c.isInvocationBatchingEnabled(); assert c.isStoreAsBinary(); assert c.isExposeJmxStatistics(); assert !c.isUnsafeUnreliableReturnValues(); assert c.getDataContainer() instanceof QueryableDataContainer; assertEquals(DefaultDataContainer.class.getName(), c.getDataContainerClass()); assertEquals("a-value", c.getDataContainerProperties().getProperty("a-property")); assert c.isIndexingEnabled(); assert c.isIndexLocalOnly(); assert c.getIndexingProperties().getProperty("indexing").equals("in memory"); assert !c.isAlwaysProvideInMemoryState(); assert c.isFetchInMemoryState(); assert 8989L == c.getStateRetrievalInitialRetryWaitTime(); assert 4 == c.getStateRetrievalRetryWaitTimeIncreaseFactor(); assert 8 == c.getStateRetrievalNumRetries(); assert 533L == c.getStateRetrievalLogFlushTimeout(); assert 434 == c.getStateRetrievalMaxNonProgressingLogWrites(); assert 7383L == c.getStateRetrievalTimeout(); assert 1234 == c.getStateRetrievalChunkSize(); assertEquals(MurmurHash3.class.getName(), c.getHashFunctionClass()); assertEquals(DefaultConsistentHash.class.getName(), c.getConsistentHashClass()); assert 200 == c.getNumOwners(); assert 74843L == c.getRehashWaitTime(); assert 374L == c.getRehashRpcTimeout(); assert !c.isRehashEnabled(); assert c.isL1CacheEnabled(); assert c.isL1OnRehash(); assert 65738L == c.getL1Lifespan(); assert Configuration.CacheMode.INVALIDATION_ASYNC == c.getCacheMode(); assert !c.isUseAsyncMarshalling(); assertEquals(ReplicationQueueImpl.class.getName(), c.getReplQueueClass()); assert 5738L == c.getReplQueueInterval(); assert 19191 == c.getReplQueueMaxElements(); assert c.isUseReplQueue(); assert 4372L == c.getExpirationLifespan(); assert 8392L == c.getExpirationMaxIdle(); assert 7676 == c.getEvictionMaxEntries(); assert EvictionStrategy.LIRS == c.getEvictionStrategy(); assert EvictionThreadPolicy.PIGGYBACK == c.getEvictionThreadPolicy(); assert 7585L == c.getExpirationWakeUpInterval(); List<CustomInterceptorConfig> customInterceptors = c.getCustomInterceptors(); assert customInterceptors.get(0).getInterceptor() instanceof OptimisticLockingInterceptor; assert customInterceptors.get(1).getInterceptor() instanceof DistributionInterceptor; assert customInterceptors.get(2).getInterceptor() instanceof CallInterceptor; assert customInterceptors.get(3).getInterceptor() instanceof CacheStoreInterceptor; assert customInterceptors.get(4).getInterceptor() instanceof CacheLoaderInterceptor; assert c.isDeadlockDetectionEnabled(); assert 8373L == c.getDeadlockDetectionSpinDuration(); assert 1928 == c.getCacheStopTimeout(); assert !c.isEagerLockSingleNode(); assert c.isSyncCommitPhase(); assert !c.isSyncRollbackPhase(); assert !c.isUseEagerLocking(); assert c.getTransactionManagerLookup() instanceof DummyTransactionManagerLookup; assert c.isTransactionRecoveryEnabled(); assertEquals("mmmmmircea", c.getTransactionRecoveryCacheName()); assert c.isUseSynchronizationForTransactions(); ClusterCacheLoaderConfig clusterLoaderConfig = (ClusterCacheLoaderConfig) c.getCacheLoaders().get(2); assert 7694L == clusterLoaderConfig.getRemoteCallTimeout(); DummyInMemoryCacheStore.Cfg dummyStoreConfig = (DummyInMemoryCacheStore.Cfg) c.getCacheLoaders().get(1); assert dummyStoreConfig.isDebug(); assert !dummyStoreConfig.isPurgeOnStartup(); assert dummyStoreConfig.isPurgeSynchronously(); assert 21 == dummyStoreConfig.getAsyncStoreConfig().getThreadPoolSize(); assert dummyStoreConfig.isPurgeSynchronously(); FileCacheStoreConfig storeConfig = (FileCacheStoreConfig) c.getCacheLoaders().get(0); assertEquals("/tmp2", storeConfig.getLocation()); assert 1615 == storeConfig.getStreamBufferSize(); assert storeConfig.isPurgeOnStartup(); assert 14 == storeConfig.getAsyncStoreConfig().getThreadPoolSize(); assert 777L == storeConfig.getAsyncStoreConfig().getFlushLockTimeout(); assert 666L == storeConfig.getAsyncStoreConfig().getShutdownTimeout(); assert !storeConfig.isFetchPersistentState(); assert storeConfig.isIgnoreModifications(); assert storeConfig.getSingletonStoreConfig().isPushStateWhenCoordinator(); assert 8989L == storeConfig.getSingletonStoreConfig().getPushStateTimeout(); assert !storeConfig.isPurgeSynchronously(); assert c.isCacheLoaderShared(); assert !c.isCacheLoaderPassivation(); assert c.isCacheLoaderPreload(); assert !c.isFetchPersistentState(); assert 1234 == c.getConcurrencyLevel(); assert IsolationLevel.SERIALIZABLE == c.getIsolationLevel(); assert 8888L == c.getLockAcquisitionTimeout(); assert !c.isUseLockStriping(); assert c.isWriteSkewCheck(); } }