From 7eb7eb286daa776d7a4e87fcc764c7aa540148a4 Mon Sep 17 00:00:00 2001 From: Ryan Emerson Date: Mon, 28 Apr 2025 14:54:34 +0100 Subject: [PATCH] Reuse InfinispanConnectionProvider instances in DefaultInfinispanConnectionProviderFactory (#39263) Closes #39253 Signed-off-by: Ryan Emerson --- ...ltInfinispanConnectionProviderFactory.java | 39 +++++++++---------- 1 file changed, 19 insertions(+), 20 deletions(-) diff --git a/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java b/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java index 55511c80597..6ff30a16060 100755 --- a/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java +++ b/model/infinispan/src/main/java/org/keycloak/connections/infinispan/DefaultInfinispanConnectionProviderFactory.java @@ -82,18 +82,13 @@ public class DefaultInfinispanConnectionProviderFactory implements InfinispanCon private volatile EmbeddedCacheManager cacheManager; - private volatile TopologyInfo topologyInfo; - private volatile RemoteCacheManager remoteCacheManager; + private volatile InfinispanConnectionProvider connectionProvider; + @Override public InfinispanConnectionProvider create(KeycloakSession session) { - lazyInit(session); - - return InfinispanUtils.isRemoteInfinispan() ? - new RemoteInfinispanConnectionProvider(cacheManager, remoteCacheManager, topologyInfo) : - new DefaultInfinispanConnectionProvider(cacheManager, topologyInfo); - + return lazyInit(session); } /* @@ -152,22 +147,26 @@ public class DefaultInfinispanConnectionProviderFactory implements InfinispanCon factory.register(this); } - protected void lazyInit(KeycloakSession keycloakSession) { - if (cacheManager != null) { - return; + protected InfinispanConnectionProvider lazyInit(KeycloakSession keycloakSession) { + if (connectionProvider != null) { + return connectionProvider; } synchronized (this) { - // if cacheManager it not null, the remoteCacheManager must be visible too. - if (cacheManager != null) { - return; + if (connectionProvider != null) { + return connectionProvider; } - var cm = createEmbeddedCacheManager(keycloakSession); - this.remoteCacheManager = createRemoteCacheManager(keycloakSession); - this.topologyInfo = new TopologyInfo(cm); - injectKeycloakTimeService(cm); - // set cacheManager field last - this.cacheManager = cm; + + this.cacheManager = createEmbeddedCacheManager(keycloakSession); + injectKeycloakTimeService(cacheManager); + var topologyInfo = new TopologyInfo(cacheManager); logger.infof(topologyInfo.toString()); + + this.remoteCacheManager = createRemoteCacheManager(keycloakSession); + this.connectionProvider = InfinispanUtils.isRemoteInfinispan() ? + new RemoteInfinispanConnectionProvider(cacheManager, remoteCacheManager, topologyInfo) : + new DefaultInfinispanConnectionProvider(cacheManager, topologyInfo); + + return connectionProvider; } }