From de6681956a0d364e9abf1c91cc69641b5aa77b57 Mon Sep 17 00:00:00 2001 From: Paul Ferraro Date: Thu, 14 Jan 2016 14:50:02 -0500 Subject: [PATCH] WFLY-5998 ISPN-6007 workaround fails for caches using optimistic locking --- .../session/InfinispanSessionManagerFactory.java | 6 ++++-- .../session/InfinispanSessionMetaDataFactory.java | 10 ++++++---- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionManagerFactory.java b/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionManagerFactory.java index 1c75f8b588e6..e43c1f0ddd8c 100644 --- a/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionManagerFactory.java +++ b/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionManagerFactory.java @@ -161,9 +161,11 @@ public Recordable getInactiveSessionRecorder() { private SessionFactory createSessionFactory(LocalContextFactory localContextFactory) { Configuration config = this.config.getCache().getCacheConfiguration(); - boolean lockOnRead = config.transaction().transactionMode().isTransactional() && (config.transaction().lockingMode() == LockingMode.PESSIMISTIC) && config.locking().isolationLevel() == IsolationLevel.REPEATABLE_READ; + boolean transactional = config.transaction().transactionMode().isTransactional(); + boolean lockOnWrite = transactional && (config.transaction().lockingMode() == LockingMode.PESSIMISTIC); + boolean lockOnRead = lockOnWrite && (config.locking().isolationLevel() == IsolationLevel.REPEATABLE_READ); boolean requireMarshallable = config.clustering().cacheMode().needsStateTransfer() || config.persistence().usingStores(); - SessionMetaDataFactory, L> metaDataFactory = new InfinispanSessionMetaDataFactory<>(this.config.getCache(), lockOnRead); + SessionMetaDataFactory, L> metaDataFactory = new InfinispanSessionMetaDataFactory<>(this.config.getCache(), transactional, lockOnRead, lockOnWrite); return new InfinispanSessionFactory<>(metaDataFactory, this.createSessionAttributesFactory(lockOnRead, requireMarshallable), localContextFactory); } diff --git a/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionMetaDataFactory.java b/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionMetaDataFactory.java index a46ba5e23a87..2ca9be274a32 100644 --- a/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionMetaDataFactory.java +++ b/clustering/web/infinispan/src/main/java/org/wildfly/clustering/web/infinispan/session/InfinispanSessionMetaDataFactory.java @@ -43,16 +43,18 @@ public class InfinispanSessionMetaDataFactory implements SessionMetaDataFacto private final Cache accessMetaDataCache; private final boolean transactional; private final boolean lockOnRead; + private final boolean lockOnWrite; @SuppressWarnings("unchecked") - public InfinispanSessionMetaDataFactory(Cache, ?> cache, boolean lockOnRead) { + public InfinispanSessionMetaDataFactory(Cache, ?> cache, boolean transactional, boolean lockOnRead, boolean lockOnWrite) { this.creationMetaDataCache = (Cache>) cache; // this.findCreationMetaDataCache = lockOnRead ? this.creationMetaDataCache.getAdvancedCache().withFlags(Flag.FORCE_WRITE_LOCK) : this.creationMetaDataCache; // Workaround for ISPN-6007 this.findCreationMetaDataCache = this.creationMetaDataCache; this.accessMetaDataCache = (Cache) cache; - this.transactional = cache.getCacheConfiguration().transaction().transactionMode().isTransactional(); + this.transactional = transactional; this.lockOnRead = lockOnRead; + this.lockOnWrite = lockOnWrite; } @Override @@ -78,7 +80,7 @@ private InfinispanSessionMetaData getValue(String id, Cache> creationMetaDataCache) { SessionCreationMetaDataKey key = new SessionCreationMetaDataKey(id); - if (creationMetaDataCache.getAdvancedCache().withFlags(Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, Flag.FAIL_SILENTLY).lock(key)) { + if (this.lockOnWrite && creationMetaDataCache.getAdvancedCache().withFlags(Flag.ZERO_LOCK_ACQUISITION_TIMEOUT, Flag.FAIL_SILENTLY).lock(key)) { creationMetaDataCache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).remove(key); this.accessMetaDataCache.getAdvancedCache().withFlags(Flag.IGNORE_RETURN_VALUES).remove(new SessionAccessMetaDataKey(id)); return true;