Skip to content

Commit

Permalink
WFLY-4651 Change default locking isolation of infinispan caches to RE…
Browse files Browse the repository at this point in the history
…AD_COMMITTED
  • Loading branch information
pferraro committed Jun 5, 2015
1 parent 73a0c70 commit c90f271
Show file tree
Hide file tree
Showing 8 changed files with 36 additions and 25 deletions.
Expand Up @@ -25,7 +25,10 @@
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;


import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.context.Flag;
import org.infinispan.remoting.transport.Address; import org.infinispan.remoting.transport.Address;
import org.infinispan.transaction.LockingMode;
import org.infinispan.util.concurrent.IsolationLevel;
import org.wildfly.clustering.dispatcher.CommandDispatcherFactory; import org.wildfly.clustering.dispatcher.CommandDispatcherFactory;
import org.wildfly.clustering.ee.infinispan.TransactionBatch; import org.wildfly.clustering.ee.infinispan.TransactionBatch;
import org.wildfly.clustering.ejb.BeanManager; import org.wildfly.clustering.ejb.BeanManager;
Expand Down Expand Up @@ -78,7 +81,8 @@ public BeanManager<G, I, T, TransactionBatch> createBeanManager(final Identifier
final boolean evictionAllowed = config.persistence().usingStores(); final boolean evictionAllowed = config.persistence().usingStores();
final boolean passivationEnabled = evictionAllowed && config.persistence().passivation(); final boolean passivationEnabled = evictionAllowed && config.persistence().passivation();
final boolean persistent = config.clustering().cacheMode().isClustered() || (evictionAllowed && !passivationEnabled); final boolean persistent = config.clustering().cacheMode().isClustered() || (evictionAllowed && !passivationEnabled);
BeanFactory<G, I, T> beanFactory = new InfinispanBeanFactory<>(beanName, groupFactory, beanCache, this.configuration.getBeanContext().getTimeout(), persistent ? passivationListener : null); boolean lockOnRead = config.transaction().transactionMode().isTransactional() && (config.transaction().lockingMode() == LockingMode.PESSIMISTIC) && (config.locking().isolationLevel() == IsolationLevel.REPEATABLE_READ);
BeanFactory<G, I, T> beanFactory = new InfinispanBeanFactory<>(beanName, groupFactory, lockOnRead ? beanCache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : beanCache, this.configuration.getBeanContext().getTimeout(), persistent ? passivationListener : null);
Configuration<I, BeanKey<I>, BeanEntry<G>, BeanFactory<G, I, T>> beanConfiguration = new SimpleConfiguration<>(beanCache, beanFactory, beanIdentifierFactory); Configuration<I, BeanKey<I>, BeanEntry<G>, BeanFactory<G, I, T>> beanConfiguration = new SimpleConfiguration<>(beanCache, beanFactory, beanIdentifierFactory);
final NodeFactory<Address> nodeFactory = this.configuration.getNodeFactory(); final NodeFactory<Address> nodeFactory = this.configuration.getNodeFactory();
final Registry<String, ?> registry = this.configuration.getRegistry(); final Registry<String, ?> registry = this.configuration.getRegistry();
Expand Down
Expand Up @@ -22,9 +22,7 @@
package org.wildfly.clustering.ejb.infinispan.bean; package org.wildfly.clustering.ejb.infinispan.bean;


import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.configuration.cache.TransactionConfiguration;
import org.infinispan.context.Flag; import org.infinispan.context.Flag;
import org.infinispan.transaction.LockingMode;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator; import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.Mutator; import org.wildfly.clustering.ee.infinispan.Mutator;
import org.wildfly.clustering.ejb.Bean; import org.wildfly.clustering.ejb.Bean;
Expand Down Expand Up @@ -82,10 +80,7 @@ public Bean<G, I, T> createBean(I id, BeanEntry<G> entry) {


@Override @Override
public BeanEntry<G> findValue(I id) { public BeanEntry<G> findValue(I id) {
TransactionConfiguration transaction = this.cache.getCacheConfiguration().transaction(); return this.cache.get(this.createKey(id));
boolean pessimistic = transaction.transactionMode().isTransactional() && (transaction.lockingMode() == LockingMode.PESSIMISTIC);
Cache<BeanKey<I>, BeanEntry<G>> cache = pessimistic ? this.cache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : this.cache;
return cache.get(this.createKey(id));
} }


@Override @Override
Expand Down
Expand Up @@ -25,6 +25,7 @@
import org.infinispan.util.concurrent.IsolationLevel; import org.infinispan.util.concurrent.IsolationLevel;
import org.jboss.as.clustering.controller.MetricHandler; import org.jboss.as.clustering.controller.MetricHandler;
import org.jboss.as.clustering.controller.ReloadRequiredAddStepHandler; import org.jboss.as.clustering.controller.ReloadRequiredAddStepHandler;
import org.jboss.as.clustering.controller.transform.DefaultValueAttributeConverter;
import org.jboss.as.controller.AttributeDefinition; import org.jboss.as.controller.AttributeDefinition;
import org.jboss.as.controller.ModelVersion; import org.jboss.as.controller.ModelVersion;
import org.jboss.as.controller.OperationStepHandler; import org.jboss.as.controller.OperationStepHandler;
Expand Down Expand Up @@ -72,7 +73,7 @@ public class LockingResourceDefinition extends SimpleResourceDefinition {
.setAllowExpression(true) .setAllowExpression(true)
.setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES) .setFlags(AttributeAccess.Flag.RESTART_ALL_SERVICES)
.setValidator(new EnumValidator<>(IsolationLevel.class, true, false)) .setValidator(new EnumValidator<>(IsolationLevel.class, true, false))
.setDefaultValue(new ModelNode().set(IsolationLevel.REPEATABLE_READ.name())) .setDefaultValue(new ModelNode().set(IsolationLevel.READ_COMMITTED.name()))
.build(); .build();


static final SimpleAttributeDefinition STRIPING = new SimpleAttributeDefinitionBuilder(ModelKeys.STRIPING, ModelType.BOOLEAN, true) static final SimpleAttributeDefinition STRIPING = new SimpleAttributeDefinitionBuilder(ModelKeys.STRIPING, ModelType.BOOLEAN, true)
Expand All @@ -87,7 +88,11 @@ public class LockingResourceDefinition extends SimpleResourceDefinition {
private final boolean allowRuntimeOnlyRegistration; private final boolean allowRuntimeOnlyRegistration;


static void buildTransformation(ModelVersion version, ResourceTransformationDescriptionBuilder parent) { static void buildTransformation(ModelVersion version, ResourceTransformationDescriptionBuilder parent) {
// Do nothing ResourceTransformationDescriptionBuilder builder = parent.addChildResource(PATH);

if (InfinispanModel.VERSION_3_0_0.requiresTransformation(version)) {
builder.getAttributeBuilder().setValueConverter(new DefaultValueAttributeConverter(ISOLATION), ISOLATION);
}
} }


LockingResourceDefinition(boolean allowRuntimeOnlyRegistration) { LockingResourceDefinition(boolean allowRuntimeOnlyRegistration) {
Expand Down
Expand Up @@ -25,7 +25,7 @@
<infinispan xmlns="urn:infinispan:config:7.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:7.1 http://infinispan.org/schemas/infinispan-config-7.1.xsd"> <infinispan xmlns="urn:infinispan:config:7.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="urn:infinispan:config:7.1 http://infinispan.org/schemas/infinispan-config-7.1.xsd">
<cache-container default-cache="LOCAL"> <cache-container default-cache="LOCAL">
<local-cache name="LOCAL"> <local-cache name="LOCAL">
<locking isolation="REPEATABLE_READ" acquire-timeout="15000" concurrency-level="1000"/> <locking acquire-timeout="15000" concurrency-level="1000"/>
<transaction locking="PESSIMISTIC"/> <transaction locking="PESSIMISTIC"/>
<store-as-binary keys="false" values="false"/> <store-as-binary keys="false" values="false"/>
</local-cache> </local-cache>
Expand Down
Expand Up @@ -24,7 +24,11 @@
import java.util.Map; import java.util.Map;


import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.context.Flag;
import org.infinispan.remoting.transport.Address; import org.infinispan.remoting.transport.Address;
import org.infinispan.transaction.LockingMode;
import org.infinispan.util.concurrent.IsolationLevel;
import org.wildfly.clustering.marshalling.MarshalledValue; import org.wildfly.clustering.marshalling.MarshalledValue;
import org.wildfly.clustering.marshalling.MarshalledValueFactory; import org.wildfly.clustering.marshalling.MarshalledValueFactory;
import org.wildfly.clustering.marshalling.MarshalledValueMarshaller; import org.wildfly.clustering.marshalling.MarshalledValueMarshaller;
Expand Down Expand Up @@ -119,13 +123,13 @@ private <L> SessionFactory<?, L> getSessionFactory(SessionContext context, Local


switch (config.getAttributePersistenceStrategy()) { switch (config.getAttributePersistenceStrategy()) {
case FINE: { case FINE: {
Cache<String, FineSessionCacheEntry<L>> sessionCache = this.config.getCache(); Cache<String, FineSessionCacheEntry<L>> sessionCache = this.getSessionCache();
Cache<SessionAttributeCacheKey, MarshalledValue<Object, MarshallingContext>> attributeCache = this.config.getCache(); Cache<SessionAttributeCacheKey, MarshalledValue<Object, MarshallingContext>> attributeCache = this.config.getCache();
Marshaller<Object, MarshalledValue<Object, MarshallingContext>> marshaller = new MarshalledValueMarshaller<>(factory, marshallingContext); Marshaller<Object, MarshalledValue<Object, MarshallingContext>> marshaller = new MarshalledValueMarshaller<>(factory, marshallingContext);
return new FineSessionFactory<>(sessionCache, attributeCache, context, marshaller, localContextFactory); return new FineSessionFactory<>(sessionCache, attributeCache, context, marshaller, localContextFactory);
} }
case COARSE: { case COARSE: {
Cache<String, CoarseSessionCacheEntry<L>> sessionCache = this.config.getCache(); Cache<String, CoarseSessionCacheEntry<L>> sessionCache = this.getSessionCache();
Cache<SessionAttributesCacheKey, MarshalledValue<Map<String, Object>, MarshallingContext>> attributesCache = this.config.getCache(); Cache<SessionAttributesCacheKey, MarshalledValue<Map<String, Object>, MarshallingContext>> attributesCache = this.config.getCache();
Marshaller<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> marshaller = new MarshalledValueMarshaller<>(factory, marshallingContext); Marshaller<Map<String, Object>, MarshalledValue<Map<String, Object>, MarshallingContext>> marshaller = new MarshalledValueMarshaller<>(factory, marshallingContext);
return new CoarseSessionFactory<>(sessionCache, attributesCache, context, marshaller, localContextFactory); return new CoarseSessionFactory<>(sessionCache, attributesCache, context, marshaller, localContextFactory);
Expand All @@ -136,4 +140,11 @@ private <L> SessionFactory<?, L> getSessionFactory(SessionContext context, Local
} }
} }
} }

private <V> Cache<String, V> getSessionCache() {
Cache<String, V> cache = this.config.getCache();
Configuration cacheConfig = cache.getCacheConfiguration();
boolean lockOnRead = cacheConfig.transaction().transactionMode().isTransactional() && (cacheConfig.transaction().lockingMode() == LockingMode.PESSIMISTIC) && cacheConfig.locking().isolationLevel() == IsolationLevel.REPEATABLE_READ;
return lockOnRead ? cache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : cache;
}
} }
Expand Up @@ -25,9 +25,7 @@
import java.util.Map; import java.util.Map;


import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.configuration.cache.TransactionConfiguration;
import org.infinispan.context.Flag; import org.infinispan.context.Flag;
import org.infinispan.transaction.LockingMode;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator; import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.MutableCacheEntry; import org.wildfly.clustering.ee.infinispan.MutableCacheEntry;
import org.wildfly.clustering.ee.infinispan.Mutator; import org.wildfly.clustering.ee.infinispan.Mutator;
Expand Down Expand Up @@ -119,10 +117,7 @@ public CoarseSessionEntry<L> createValue(String id, Void context) {


@Override @Override
public CoarseSessionEntry<L> findValue(String id) { public CoarseSessionEntry<L> findValue(String id) {
TransactionConfiguration transaction = this.sessionCache.getCacheConfiguration().transaction(); CoarseSessionCacheEntry<L> entry = this.sessionCache.get(id);
boolean pessimistic = transaction.transactionMode().isTransactional() && (transaction.lockingMode() == LockingMode.PESSIMISTIC);
Cache<String, CoarseSessionCacheEntry<L>> cache = pessimistic ? this.sessionCache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : this.sessionCache;
CoarseSessionCacheEntry<L> entry = cache.get(id);
if (entry != null) { if (entry != null) {
MutableCacheEntry<CoarseSessionCacheEntry<L>> sessionEntry = new MutableCacheEntry<>(entry, new CacheEntryMutator<>(this.sessionCache, id, entry)); MutableCacheEntry<CoarseSessionCacheEntry<L>> sessionEntry = new MutableCacheEntry<>(entry, new CacheEntryMutator<>(this.sessionCache, id, entry));
SessionAttributesCacheKey key = new SessionAttributesCacheKey(id); SessionAttributesCacheKey key = new SessionAttributesCacheKey(id);
Expand Down
Expand Up @@ -24,9 +24,7 @@
import java.util.Map; import java.util.Map;


import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.configuration.cache.TransactionConfiguration;
import org.infinispan.context.Flag; import org.infinispan.context.Flag;
import org.infinispan.transaction.LockingMode;
import org.wildfly.clustering.ee.infinispan.CacheEntryMutator; import org.wildfly.clustering.ee.infinispan.CacheEntryMutator;
import org.wildfly.clustering.ee.infinispan.MutableCacheEntry; import org.wildfly.clustering.ee.infinispan.MutableCacheEntry;
import org.wildfly.clustering.ee.infinispan.Mutator; import org.wildfly.clustering.ee.infinispan.Mutator;
Expand Down Expand Up @@ -86,10 +84,7 @@ public ImmutableSession createImmutableSession(String id, MutableCacheEntry<Fine


@Override @Override
public MutableCacheEntry<FineSessionCacheEntry<L>> findValue(String id) { public MutableCacheEntry<FineSessionCacheEntry<L>> findValue(String id) {
TransactionConfiguration transaction = this.sessionCache.getCacheConfiguration().transaction(); FineSessionCacheEntry<L> value = this.sessionCache.get(id);
boolean pessimistic = transaction.transactionMode().isTransactional() && (transaction.lockingMode() == LockingMode.PESSIMISTIC);
Cache<String, FineSessionCacheEntry<L>> cache = pessimistic ? this.sessionCache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : this.sessionCache;
FineSessionCacheEntry<L> value = cache.get(id);
if (value == null) return null; if (value == null) return null;
// Preemptively read all attributes to detect invalid session attributes // Preemptively read all attributes to detect invalid session attributes
for (Map.Entry<SessionAttributeCacheKey, MarshalledValue<Object, MarshallingContext>> entry : this.attributeCache.getAdvancedCache().getGroup(id).entrySet()) { for (Map.Entry<SessionAttributeCacheKey, MarshalledValue<Object, MarshallingContext>> entry : this.attributeCache.getAdvancedCache().getGroup(id).entrySet()) {
Expand Down
Expand Up @@ -24,6 +24,10 @@
import java.util.Map; import java.util.Map;


import org.infinispan.Cache; import org.infinispan.Cache;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.context.Flag;
import org.infinispan.transaction.LockingMode;
import org.infinispan.util.concurrent.IsolationLevel;
import org.jboss.msc.service.AbstractService; import org.jboss.msc.service.AbstractService;
import org.wildfly.clustering.ee.Batcher; import org.wildfly.clustering.ee.Batcher;
import org.wildfly.clustering.ee.infinispan.InfinispanBatcher; import org.wildfly.clustering.ee.infinispan.InfinispanBatcher;
Expand Down Expand Up @@ -59,8 +63,10 @@ public <L> SSOManager<A, D, L, TransactionBatch> createSSOManager(IdentifierFact
MarshalledValueFactory<MarshallingContext> marshalledValueFactory = new SimpleMarshalledValueFactory(marshallingContext); MarshalledValueFactory<MarshallingContext> marshalledValueFactory = new SimpleMarshalledValueFactory(marshallingContext);
Marshaller<A, MarshalledValue<A, MarshallingContext>> marshaller = new MarshalledValueMarshaller<>(marshalledValueFactory, marshallingContext); Marshaller<A, MarshalledValue<A, MarshallingContext>> marshaller = new MarshalledValueMarshaller<>(marshalledValueFactory, marshallingContext);
Cache<String, CoarseAuthenticationEntry<A, D, L>> authenticationCache = this.configuration.getCache(); Cache<String, CoarseAuthenticationEntry<A, D, L>> authenticationCache = this.configuration.getCache();
Configuration config = authenticationCache.getCacheConfiguration();
boolean lockOnRead = config.transaction().transactionMode().isTransactional() && (config.transaction().lockingMode() == LockingMode.PESSIMISTIC) && config.locking().isolationLevel() == IsolationLevel.REPEATABLE_READ;
Cache<CoarseSessionsKey, Map<D, String>> sessionsCache = this.configuration.getCache(); Cache<CoarseSessionsKey, Map<D, String>> sessionsCache = this.configuration.getCache();
SSOFactory<CoarseSSOEntry<A, D, L>, A, D, L> factory = new CoarseSSOFactory<>(authenticationCache, sessionsCache, marshaller, localContextFactory); SSOFactory<CoarseSSOEntry<A, D, L>, A, D, L> factory = new CoarseSSOFactory<>(lockOnRead ? authenticationCache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : authenticationCache, sessionsCache, marshaller, localContextFactory);
IdentifierFactory<String> idFactory = new AffinityIdentifierFactory<>(identifierFactory, authenticationCache, this.configuration.getKeyAffinityServiceFactory()); IdentifierFactory<String> idFactory = new AffinityIdentifierFactory<>(identifierFactory, authenticationCache, this.configuration.getKeyAffinityServiceFactory());
Batcher<TransactionBatch> batcher = new InfinispanBatcher(authenticationCache); Batcher<TransactionBatch> batcher = new InfinispanBatcher(authenticationCache);
return new InfinispanSSOManager<>(factory, idFactory, batcher); return new InfinispanSSOManager<>(factory, idFactory, batcher);
Expand Down

0 comments on commit c90f271

Please sign in to comment.