Keycloak 26.2.5 released

295 views
Skip to first unread message

Stian Thorgersen

unread,
May 28, 2025, 5:08:03 AM5/28/25
to keycloak-team, Keycloak Dev, Keycloak User

Arif EROL

unread,
May 29, 2025, 12:04:12 AM5/29/25
to stho...@redhat.com, keycloak-team, Keycloak Dev, Keycloak User
Hi,

Version 26.2.4 was working without any issues in my test environment. I tried upgrading to the newly released version 26.2.5, but I started seeing error logs in the console.

Below is the content of my cache-ispn.xml file, which was working fine in version 26.2.4:

<infinispan
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="urn:infinispan:config:15.0 http://www.infinispan.org/schemas/infinispan-config-15.0.xsd"
        xmlns="urn:infinispan:config:15.0">
    <jgroups>
        <stack name="mssql-jdbc-ping-tcp" extends="tcp">
            <TCP external_addr="${env.JGROUPS_DISCOVERY_EXTERNAL_IP:127.0.0.1}" />
            <JDBC_PING2 connection_driver="com.microsoft.sqlserver.jdbc.SQLServerDriver"
                        connection_username="${env.KC_DB_USERNAME}" connection_password="${env.KC_DB_PASSWORD}"
                        connection_url="jdbc:sqlserver://${env.KC_DB_URL_HOST}:${env.KC_DB_URL_PORT:1433};databaseName=${env.KC_DB_URL_DATABASE}${env.KC_DB_URL_PROPERTIES:}"
                        initialize_sql="IF NOT EXISTS (SELECT 1 FROM sys.schemas WHERE name = '${env.KC_DB_SCHEMA:dbo}') BEGIN EXEC ('CREATE SCHEMA [${env.KC_DB_SCHEMA:dbo}] AUTHORIZATION [dbo]') END; IF NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME='JGROUPS_PING' AND TABLE_SCHEMA='${env.KC_DB_SCHEMA:dbo}') CREATE TABLE ${env.KC_DB_SCHEMA:dbo}.JGROUPS_PING (address varchar(200) NOT NULL, name varchar(200) NULL, cluster_name varchar(200) NOT NULL, ip varchar(200) NOT NULL, coord bit NULL, constraint PK_JGROUPS_PING PRIMARY KEY (address));"
                        insert_single_sql="INSERT INTO ${env.KC_DB_SCHEMA:dbo}.JGROUPS_PING (address, name, cluster_name, ip, coord) values (?, ?, ?, '${env.JGROUPS_DISCOVERY_EXTERNAL_IP:127.0.0.1}', ?);"
delete_single_sql="DELETE FROM ${env.KC_DB_SCHEMA:dbo}.JGROUPS_PING WHERE address=?;"
                        select_all_pingdata_sql="SELECT address, name, ip, coord FROM ${env.KC_DB_SCHEMA:dbo}.JGROUPS_PING WHERE cluster_name=?;"
                        info_writer_sleep_time="500"
                        remove_all_data_on_view_change="true"
                        stack.combine="REPLACE"
                        stack.position="MPING" />
        </stack>
    </jgroups>

    <cache-container name="keycloak"> ...

In my initial test, the cluster node information was not being inserted into the JGROUPS_PING table.
When I changed the following line:

"insert_single_sql="INSERT INTO ${env.KC_DB_SCHEMA:dbo}.JGROUPS_PING (address, name, cluster_name, ip, coord) values (?, ?, ?, '${env.JGROUPS_DISCOVERY_EXTERNAL_IP:127.0.0.1}', ?);"
to:

"insert_single_sql="INSERT INTO ${env.KC_DB_SCHEMA:dbo}.JGROUPS_PING (address, name, cluster_name, ip, coord) VALUES (?, ?, ?, ?, ?);"
the node information started to appear in the table correctly.

However, at this point, I am seeing the following error log in the console:
"2025-05-29 02:22:44,595 ERROR [org.jgroups.protocols.JDBC_PING2] (main) a0f8ca45903c-14147: failed clearing the table for cluster ISPN: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'jgroups'.
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:270)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1735)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:675)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:594)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7745)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:4391)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:276)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:246)
keycloak-1  |   at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.execute(SQLServerPreparedStatement.java:571)
keycloak-1  |   at org.jgroups.protocols.JDBC_PING2.clearTable(JDBC_PING2.java:389)
keycloak-1  |   at org.jgroups.protocols.JDBC_PING2.removeAll(JDBC_PING2.java:200)
keycloak-1  |   at org.jgroups.protocols.FILE_PING.handleView(FILE_PING.java:204)
keycloak-1  |   at org.jgroups.protocols.FILE_PING.down(FILE_PING.java:138)
keycloak-1  |   at org.jgroups.protocols.MERGE3.down(MERGE3.java:249)
keycloak-1  |   at org.jgroups.protocols.FD_SOCK2.down(FD_SOCK2.java:228)
keycloak-1  |   at org.jgroups.protocols.FailureDetection.down(FailureDetection.java:149)
keycloak-1  |   at org.jgroups.protocols.VERIFY_SUSPECT2.down(VERIFY_SUSPECT2.java:84)
keycloak-1  |   at org.jgroups.protocols.pbcast.NAKACK2.down(NAKACK2.java:632)
keycloak-1  |   at org.jgroups.protocols.UNICAST3.down(UNICAST3.java:661)
keycloak-1  |   at org.jgroups.protocols.pbcast.STABLE.down(STABLE.java:269)
keycloak-1  |   at org.jgroups.protocols.pbcast.GMS.installView(GMS.java:694)
keycloak-1  |   at org.jgroups.protocols.pbcast.ClientGmsImpl.becomeSingletonMember(ClientGmsImpl.java:251)
keycloak-1  |   at org.jgroups.protocols.pbcast.ClientGmsImpl.joinInternal(ClientGmsImpl.java:86)
keycloak-1  |   at org.jgroups.protocols.pbcast.ClientGmsImpl.join(ClientGmsImpl.java:37)
keycloak-1  |   at org.jgroups.protocols.pbcast.GMS.down(GMS.java:902)
keycloak-1  |   at org.jgroups.protocols.FlowControl.down(FlowControl.java:201)
keycloak-1  |   at org.jgroups.protocols.FlowControl.down(FlowControl.java:201)
keycloak-1  |   at org.jgroups.stack.Protocol.down(Protocol.java:308)
keycloak-1  |   at org.jgroups.protocols.FRAG2.down(FRAG2.java:103)
keycloak-1  |   at org.jgroups.stack.ProtocolStack.down(ProtocolStack.java:948)
keycloak-1  |   at org.jgroups.JChannel.down(JChannel.java:612)
keycloak-1  |   at org.jgroups.JChannel._connect(JChannel.java:825)
keycloak-1  |   at org.jgroups.JChannel.connect(JChannel.java:331)
keycloak-1  |   at org.jgroups.JChannel.connect(JChannel.java:321)
keycloak-1  |   at org.infinispan.remoting.transport.jgroups.JGroupsTransport.startJGroupsChannelIfNeeded(JGroupsTransport.java:581)
keycloak-1  |   at org.infinispan.remoting.transport.jgroups.JGroupsTransport.start(JGroupsTransport.java:456)
keycloak-1  |   at org.infinispan.remoting.transport.jgroups.CorePackageImpl$2.start(CorePackageImpl.java:65)
keycloak-1  |   at org.infinispan.remoting.transport.jgroups.CorePackageImpl$2.start(CorePackageImpl.java:50)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl.invokeStart(BasicComponentRegistryImpl.java:616)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl.doStartWrapper(BasicComponentRegistryImpl.java:607)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl.startWrapper(BasicComponentRegistryImpl.java:576)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl$ComponentWrapper.running(BasicComponentRegistryImpl.java:807)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl.startDependencies(BasicComponentRegistryImpl.java:634)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl.doStartWrapper(BasicComponentRegistryImpl.java:598)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl.startWrapper(BasicComponentRegistryImpl.java:576)
keycloak-1  |   at org.infinispan.factories.impl.BasicComponentRegistryImpl$ComponentWrapper.running(BasicComponentRegistryImpl.java:807)
keycloak-1  |   at org.infinispan.factories.GlobalComponentRegistry.preStart(GlobalComponentRegistry.java:307)
keycloak-1  |   at org.infinispan.factories.AbstractComponentRegistry.start(AbstractComponentRegistry.java:241)
keycloak-1  |   at org.infinispan.manager.DefaultCacheManager.internalStart(DefaultCacheManager.java:778)
keycloak-1  |   at org.infinispan.manager.DefaultCacheManager.start(DefaultCacheManager.java:746)
keycloak-1  |   at org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:412)
keycloak-1  |   at org.keycloak.quarkus.runtime.storage.infinispan.CacheManagerFactory.startEmbeddedCacheManager(CacheManagerFactory.java:339)
keycloak-1  |   at org.keycloak.quarkus.runtime.storage.infinispan.CacheManagerFactory.getOrCreateEmbeddedCacheManager(CacheManagerFactory.java:134)
keycloak-1  |   at org.keycloak.quarkus.runtime.storage.infinispan.CacheManagerFactory_Uq0wIYR2uOCznFEYZOJeeAi-Obg_Synthetic_ClientProxy.getOrCreateEmbeddedCacheManager(Unknown Source)
keycloak-1  |   at org.keycloak.quarkus.runtime.storage.infinispan.QuarkusCacheManagerProvider.getEmbeddedCacheManager(QuarkusCacheManagerProvider.java:33)
keycloak-1  |   at org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory.lazyInit(DefaultInfinispanConnectionProviderFactory.java:211)
keycloak-1  |   at org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory.create(DefaultInfinispanConnectionProviderFactory.java:119)
keycloak-1  |   at org.keycloak.connections.infinispan.DefaultInfinispanConnectionProviderFactory.create(DefaultInfinispanConnectionProviderFactory.java:100)
keycloak-1  |   at org.keycloak.services.DefaultKeycloakSession.getOrCreateProvider(DefaultKeycloakSession.java:184)
keycloak-1  |   at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:173)
keycloak-1  |   at org.keycloak.models.sessions.infinispan.InfinispanSingleUseObjectProviderFactory.getSingleUseObjectCache(InfinispanSingleUseObjectProviderFactory.java:82)
keycloak-1  |   at org.keycloak.models.sessions.infinispan.InfinispanSingleUseObjectProviderFactory.postInit(InfinispanSingleUseObjectProviderFactory.java:129)
keycloak-1  |   at org.keycloak.services.DefaultKeycloakSessionFactory.initializeProviders(DefaultKeycloakSessionFactory.java:168)
keycloak-1  |   at org.keycloak.services.DefaultKeycloakSessionFactory.initProviderFactories(DefaultKeycloakSessionFactory.java:145)
keycloak-1  |   at org.keycloak.services.DefaultKeycloakSessionFactory.initProviderFactories(DefaultKeycloakSessionFactory.java:126)
keycloak-1  |   at org.keycloak.quarkus.runtime.integration.QuarkusKeycloakSessionFactory.init(QuarkusKeycloakSessionFactory.java:87)
keycloak-1  |   at org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication.createSessionFactory(QuarkusKeycloakApplication.java:67)
keycloak-1  |   at org.keycloak.services.resources.KeycloakApplication.startup(KeycloakApplication.java:90)
keycloak-1  |   at org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication.onStartupEvent(QuarkusKeycloakApplication.java:52)
keycloak-1  |   at org.keycloak.quarkus.runtime.integration.jaxrs.QuarkusKeycloakApplication_Observer_onStartupEvent_GNZ8m5QenZ9h9VNelo7awjUZFDE.notify(Unknown Source)
keycloak-1  |   at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:365)
keycloak-1  |   at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:347)
keycloak-1  |   at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:81)
keycloak-1  |   at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:163)
keycloak-1  |   at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:114)
keycloak-1  |   at io.quarkus.runner.recorded.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
keycloak-1  |   at io.quarkus.runner.recorded.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
keycloak-1  |   at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
keycloak-1  |   at io.quarkus.runtime.Application.start(Application.java:101)
keycloak-1  |   at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:121)
keycloak-1  |   at io.quarkus.runtime.Quarkus.run(Quarkus.java:77)
keycloak-1  |   at org.keycloak.quarkus.runtime.KeycloakMain.start(KeycloakMain.java:145)
keycloak-1  |   at org.keycloak.quarkus.runtime.cli.Picocli.start(Picocli.java:1002)
keycloak-1  |   at org.keycloak.quarkus.runtime.cli.command.AbstractStartCommand.run(AbstractStartCommand.java:49)
keycloak-1  |   at org.keycloak.quarkus.runtime.cli.command.Start.fastStart(Start.java:79)
keycloak-1  |   at org.keycloak.quarkus.runtime.KeycloakMain.main(KeycloakMain.java:111)
keycloak-1  |   at org.keycloak.quarkus.runtime.KeycloakMain.main(KeycloakMain.java:71)
keycloak-1  |   at io.quarkus.bootstrap.runner.QuarkusEntryPoint.doRun(QuarkusEntryPoint.java:68)
keycloak-1  |   at io.quarkus.bootstrap.runner.QuarkusEntryPoint.main(QuarkusEntryPoint.java:36)
keycloak-1  |
keycloak-1  | 2025-05-29 02:22:44,631 DEBUG [org.jgroups.protocols.JDBC_PING2] (main) a0f8ca45903c-14147: removed a0f8ca45903c-14147 for cluster ISPN from database
keycloak-1  | 2025-05-29 02:22:44,634 DEBUG [org.jgroups.protocols.JDBC_PING2] (main) a0f8ca45903c-14147: inserted a0f8ca45903c-14147 for cluster ISPN
keycloak-1  | 2025-05-29 02:22:44,646 INFO  [org.infinispan.CLUSTER] (main) ISPN000094: Received new cluster view for channel ISPN: [a0f8ca45903c-14147|0] (1) [a0f8ca45903c-14147]
keycloak-1  | 2025-05-29 02:22:44,647 DEBUG [org.infinispan.remoting.transport.jgroups.JGroupsTransport] (main) Joined: [a0f8ca45903c-14147], Left: []
keycloak-1  | 2025-05-29 02:22:44,649 INFO  [org.keycloak.infinispan.module.certificates.CertificateReloadManager] (main) Reloading JGroups Certificate
keycloak-1  | 2025-05-29 02:22:44,662 DEBUG [org.jgroups.protocols.pbcast.GMS] (main) a0f8ca45903c-14147: created cluster (first member). My view is [a0f8ca45903c-14147|0], impl is CoordGmsImpl
"

Just for your information. 

'Stian Thorgersen' via Keycloak User <keyclo...@googlegroups.com>, 28 May 2025 Çar, 12:07 tarihinde şunu yazdı:

--
You received this message because you are subscribed to the Google Groups "Keycloak User" group.
To unsubscribe from this group and stop receiving emails from it, send an email to keycloak-use...@googlegroups.com.
To view this discussion visit https://groups.google.com/d/msgid/keycloak-user/CAJgngAeUWyuAGssJL%2BPQ6ECso5a4VJA6_D-kRey_QV6MZ5r2NQ%40mail.gmail.com.

Alexander Schwartz

unread,
Jun 5, 2025, 3:00:24 AM6/5/25
to Arif EROL, stho...@redhat.com, keycloak-team, Keycloak Dev, Keycloak User
Hi Arif,

for Keycloak 26.2.5 we fixed a bug that the stack configuration in the cache-ispn.xml file was ignored unless you passed in the stack name on the Keycloak CLI options. 

Keycloak 26.1+ provides jdbc_ping by default. So my recommendation is to remove all stack configurations from your Cache XML file. See https://www.keycloak.org/server/caching on how to pass in external IP addresses if that would be needed.

This would fit your description that it was working with 26.2.4 as you expected.

If you experience problems, and expect that there is a bug, please open a GitHub bug issue.

Best,
Alexander



--

Alexander Schwartz, RHCE

He/Him

Principal Software Engineer, Keycloak Maintainer

Red Hat - Germany remote

asch...@redhat.com   

Red Hat GmbH, Registered seat: Werner von Siemens Ring 12, D-85630 Grasbrunn, Germany 
Commercial register: Amtsgericht Muenchen/Munich, HRB 153243,
Managing Directors: Ryan Barnhart, Charles Cachera, Michael O'Neill, Amy Ross

Arif EROL

unread,
Jun 13, 2025, 2:10:32 AM6/13/25
to Keycloak User
Firstly, I observed that the issue was resolved by passing the --cache-stack parameter in my Docker Compose file as shown below:
"
keycloak:
  image: /keycloak:${KC_VERSION}
  command: ["start", "--cache-stack=mssql-jdbc-ping-tcp"]

"
However, I noticed that you recommended removing all stack configurations from the cache XML file.

I was already passing the external IP addresses via a JVM parameter in the Docker Compose file like this:
JAVA_OPTS_APPEND: -Djgroups.external_addr=${HOST_IP}.

So, I removed the --cache-stack=mssql-jdbc-ping-tcp CLI parameter along with the environment variables ENV KC_CACHE_CONFIG_FILE=cache-ispn-jdbc-ping.xml and ENV JGROUPS_DISCOVERY_PROTOCOL=JDBC_PING2.

In the console log, I observed the following message:
INFO [org.infinispan.CLUSTER] (main) ISPN000078: Starting JGroups channel 'ISPN' with stack 'jdbc-ping'.

At the moment, everything seems to be working fine with the automated default configuration.

Thank you for your support.

5 Haziran 2025 Perşembe tarihinde saat 10:00:24 UTC+3 itibarıyla Alexander Schwartz şunları yazdı:
Reply all
Reply to author
Forward
0 new messages