From 17fb20c58d80293b47891f500db80beb5e09cef9 Mon Sep 17 00:00:00 2001 From: Alexander Schwartz Date: Thu, 9 Oct 2025 23:09:36 +0200 Subject: [PATCH] Prevent using JTA transaction when initializing JDBC_PING Closes #43335 Signed-off-by: Alexander Schwartz --- .../DefaultInfinispanConnectionProviderFactory.java | 13 +++++++++++-- .../jgroups/protocol/KEYCLOAK_JDBC_PING2.java | 2 ++ 2 files changed, 13 insertions(+), 2 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 40ac7eb77cc..6552b75d103 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 @@ -33,6 +33,7 @@ import org.infinispan.commons.configuration.io.ConfigurationWriter; import org.infinispan.commons.io.StringBuilderWriter; import org.infinispan.commons.util.Version; import org.infinispan.configuration.cache.Configuration; +import org.infinispan.configuration.parsing.ConfigurationBuilderHolder; import org.infinispan.factories.GlobalComponentRegistry; import org.infinispan.configuration.parsing.ParserRegistry; import org.infinispan.health.CacheHealth; @@ -42,7 +43,6 @@ import org.jboss.logging.Logger; import org.keycloak.Config; import org.keycloak.cluster.ClusterEvent; import org.keycloak.cluster.ClusterProvider; -import org.keycloak.config.CachingOptions; import org.keycloak.connections.infinispan.remote.RemoteInfinispanConnectionProvider; import org.keycloak.infinispan.health.ClusterHealth; import org.keycloak.infinispan.util.InfinispanUtils; @@ -193,7 +193,7 @@ public class DefaultInfinispanConnectionProviderFactory implements InfinispanCon logger.debugf("Infinispan configuration:\n%s", sw); } - var cm = new DefaultCacheManager(holder, true); + var cm = getDefaultCacheManager(session, holder); cm.getCache(KEYS_CACHE_NAME, true); cm.getCache(CRL_CACHE_NAME, true); @@ -201,6 +201,15 @@ public class DefaultInfinispanConnectionProviderFactory implements InfinispanCon return cm; } + private static DefaultCacheManager getDefaultCacheManager(KeycloakSession session, ConfigurationBuilderHolder holder) { + // This disables the JTA transaction context to avoid binding all JDBC_PING2 interactions to the current transaction + DefaultCacheManager[] _cm = new DefaultCacheManager[1]; + KeycloakModelUtils.suspendJtaTransaction(session.getKeycloakSessionFactory(), () -> + _cm[0] = new DefaultCacheManager(holder, true)); + var cm = _cm[0]; + return cm; + } + protected RemoteCacheManager createRemoteCacheManager(KeycloakSession session) { var remoteConfig = session.getProvider(CacheRemoteConfigProvider.class).configuration(); if (remoteConfig.isEmpty()) { diff --git a/model/infinispan/src/main/java/org/keycloak/jgroups/protocol/KEYCLOAK_JDBC_PING2.java b/model/infinispan/src/main/java/org/keycloak/jgroups/protocol/KEYCLOAK_JDBC_PING2.java index b20779ad9e6..a4f7c2964d3 100644 --- a/model/infinispan/src/main/java/org/keycloak/jgroups/protocol/KEYCLOAK_JDBC_PING2.java +++ b/model/infinispan/src/main/java/org/keycloak/jgroups/protocol/KEYCLOAK_JDBC_PING2.java @@ -161,6 +161,8 @@ public class KEYCLOAK_JDBC_PING2 extends JDBC_PING2 { // Always use a transaction for the delete+insert to make it atomic // to avoid the short moment where there is no entry in the table. connection.setAutoCommit(false); + } else { + log.warn("Autocommit is disabled. This indicates a transaction context that might batch statements and can lead to deadlocks."); } delete(connection, clustername, data.getAddress()); insert(connection, data, clustername);