-
Bug
-
Resolution: Done
-
Major
-
RH-SSO-7.2.0.GA
-
Keycloak Sprint 11, Keycloak Sprint 12, Keycloak Sprint 13
The primary key of the OFFLINE_CLIENT_SESSION table in RH-SSO 7.0/7.1 is created on (CLIENT_SESSION_ID, OFFLINE_FLAG), therefore, rarely non-unique values of (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG) are stored.
MariaDB [RHSSO70]> desc OFFLINE_CLIENT_SESSION;
+-------------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------------------+-------------+------+-----+---------+-------+
| CLIENT_SESSION_ID | varchar(36) | NO | PRI | NULL | |
| USER_SESSION_ID | varchar(36) | NO | MUL | NULL | |
| CLIENT_ID | varchar(36) | NO | | NULL | |
| OFFLINE_FLAG | varchar(4) | NO | PRI | NULL | |
| TIMESTAMP | int(11) | YES | | NULL | |
| DATA | longtext | YES | | NULL | |
+-------------------+-------------+------+-----+---------+-------+
6 rows in set (0.00 sec)
In 7.2, the primary key of the table is (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG).
MariaDB [RHSSO70to72]> desc OFFLINE_CLIENT_SESSION;
+-----------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+-------------+------+-----+---------+-------+
| USER_SESSION_ID | varchar(36) | NO | MUL | NULL | |
| CLIENT_ID | varchar(36) | NO | | NULL | |
| OFFLINE_FLAG | varchar(4) | NO | | NULL | |
| TIMESTAMP | int(11) | YES | | NULL | |
| DATA | longtext | YES | | NULL | |
+-----------------+-------------+------+-----+---------+-------+
5 rows in set (0.01 sec)
Therefore, the migration to 7.2 would be failed:
23:20:35,171 ERROR [org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider] (ServerService Thread Pool -- 49) Change Set META-INF/jpa-changelog-3.2.0.xml::3.2.0-fixed::keycloak failed. Error: (conn:40) Duplicate entry 'f48c13b5-691[153/4321] 6-801d1c7d5860-22483be3-2dd5-4a03-b228-55d' for key 'PRIMARY' [Failed SQL: ALTER TABLE RHSSO70to72.OFFLINE_CLIENT_SESSION ADD PRIMARY KEY (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG)]: liquibase.exception.DatabaseException: (conn:40) Duplicate entry 'f48c13b5-6915-4d45-abd6-8 01d1c7d5860-22483be3-2dd5-4a03-b228-55d' for key 'PRIMARY' [Failed SQL: ALTER TABLE RHSSO70to72.OFFLINE_CLIENT_SESSION ADD PRIMARY KEY (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG)] at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:316) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:122) at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1247) at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1230) at liquibase.changelog.ChangeSet.execute(ChangeSet.java:548) at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51) at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73) at liquibase.Liquibase.update(Liquibase.java:210) at liquibase.Liquibase.update(Liquibase.java:190) at liquibase.Liquibase.update(Liquibase.java:186) at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.updateChangeSet(LiquibaseJpaUpdaterProvider.java:135) at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.update(LiquibaseJpaUpdaterProvider.java:88) at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.update(LiquibaseJpaUpdaterProvider.java:67) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.update(DefaultJpaConnectionProviderFactory.java:322) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.migration(DefaultJpaConnectionProviderFactory.java:308) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lambda$lazyInit$0(DefaultJpaConnectionProviderFactory.java:179) at org.keycloak.models.utils.KeycloakModelUtils.suspendJtaTransaction(KeycloakModelUtils.java:544) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lazyInit(DefaultJpaConnectionProviderFactory.java:130) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create(DefaultJpaConnectionProviderFactory.java:78) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.create(DefaultJpaConnectionProviderFactory.java:56) at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:163) at org.keycloak.models.jpa.JpaRealmProviderFactory.create(JpaRealmProviderFactory.java:51) at org.keycloak.models.jpa.JpaRealmProviderFactory.create(JpaRealmProviderFactory.java:33) at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:163) at org.keycloak.models.cache.infinispan.RealmCacheSession.getDelegate(RealmCacheSession.java:144) at org.keycloak.models.cache.infinispan.RealmCacheSession.getMigrationModel(RealmCacheSession.java:137) at org.keycloak.migration.MigrationModelManager.migrate(MigrationModelManager.java:78) at org.keycloak.services.resources.KeycloakApplication.migrateModel(KeycloakApplication.java:246) at org.keycloak.services.resources.KeycloakApplication.migrateAndBootstrap(KeycloakApplication.java:187) at org.keycloak.services.resources.KeycloakApplication$1.run(KeycloakApplication.java:146) at org.keycloak.models.utils.KeycloakModelUtils.runJobInTransaction(KeycloakModelUtils.java:227) at org.keycloak.services.resources.KeycloakApplication.<init>(KeycloakApplication.java:137) at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at org.jboss.resteasy.core.ConstructorInjectorImpl.construct(ConstructorInjectorImpl.java:150) at org.jboss.resteasy.spi.ResteasyProviderFactory.createProviderInstance(ResteasyProviderFactory.java:2298) at org.jboss.resteasy.spi.ResteasyDeployment.createApplication(ResteasyDeployment.java:340) at org.jboss.resteasy.spi.ResteasyDeployment.start(ResteasyDeployment.java:253) at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.init(ServletContainerDispatcher.java:120) at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.init(HttpServletDispatcher.java:36) at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:117) at org.wildfly.extension.undertow.security.RunAsLifecycleInterceptor.init(RunAsLifecycleInterceptor.java:78) at io.undertow.servlet.core.LifecyleInterceptorInvocation.proceed(LifecyleInterceptorInvocation.java:103) at io.undertow.servlet.core.ManagedServlet$DefaultInstanceStrategy.start(ManagedServlet.java:250) at io.undertow.servlet.core.ManagedServlet.createServlet(ManagedServlet.java:133) at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:565) at io.undertow.servlet.core.DeploymentManagerImpl$2.call(DeploymentManagerImpl.java:536) at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:42) at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43) at org.wildfly.extension.undertow.security.SecurityContextThreadSetupAction.lambda$create$0(SecurityContextThreadSetupAction.java:105) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508) at org.wildfly.extension.undertow.deployment.UndertowDeploymentInfoService$UndertowThreadSetupAction.lambda$create$0(UndertowDeploymentInfoService.java:1508) at io.undertow.servlet.core.DeploymentManagerImpl.start(DeploymentManagerImpl.java:578) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService.startContext(UndertowDeploymentService.java:100) at org.wildfly.extension.undertow.deployment.UndertowDeploymentService$1.run(UndertowDeploymentService.java:81) at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) at java.util.concurrent.FutureTask.run(FutureTask.java:266) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748) at org.jboss.threads.JBossThread.run(JBossThread.java:320) Caused by: java.sql.SQLIntegrityConstraintViolationException: (conn:40) Duplicate entry 'f48c13b5-6915-4d45-abd6-801d1c7d5860-22483be3-2dd5-4a03-b228-55d' for key 'PRIMARY' at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.get(ExceptionMapper.java:152) at org.mariadb.jdbc.internal.util.exceptions.ExceptionMapper.getException(ExceptionMapper.java:118) at org.mariadb.jdbc.MariaDbStatement.executeExceptionEpilogue(MariaDbStatement.java:245) at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:343) at org.mariadb.jdbc.MariaDbStatement.execute(MariaDbStatement.java:394) at org.jboss.jca.adapters.jdbc.WrappedStatement.execute(WrappedStatement.java:198) at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:314) ... 65 more Caused by: java.sql.SQLException: Duplicate entry 'f48c13b5-6915-4d45-abd6-801d1c7d5860-22483be3-2dd5-4a03-b228-55d' for key 'PRIMARY' Query is: ALTER TABLE RHSSO70to72.OFFLINE_CLIENT_SESSION ADD PRIMARY KEY (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG) at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:113) at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:168) at org.mariadb.jdbc.MariaDbStatement.executeInternal(MariaDbStatement.java:337) ... 68 more 23:20:35,171 ERROR [org.keycloak.connections.jpa.updater.liquibase.conn.DefaultLiquibaseConnectionProvider] (ServerService Thr[235/5923]- 49) Change Set META-INF/jpa-changelog-3.2.0.xml::3.2.0-fixed::keycloak failed. Error: (conn:40) Duplicate entry 'f48c13b5-6915-4d45-a bd6-801d1c7d5860-22483be3-2dd5-4a03-b228-55d' for key 'PRIMARY' [Failed SQL: ALTER TABLE RHSSO70to72.OFFLINE_CLIENT_SESSION ADD PRIMARY KEY (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG)]: liquibase.exception.DatabaseException: (conn:40) Duplicate entry 'f48c13b5-6915-4d45-ab d6-801d1c7d5860-22483be3-2dd5-4a03-b228-55d' for key 'PRIMARY' [Failed SQL: ALTER TABLE RHSSO70to72.OFFLINE_CLIENT_SESSION ADD PRIMARY KEY (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG)] at liquibase.executor.jvm.JdbcExecutor$ExecuteStatementCallback.doInStatement(JdbcExecutor.java:316) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:55) at liquibase.executor.jvm.JdbcExecutor.execute(JdbcExecutor.java:122) at liquibase.database.AbstractJdbcDatabase.execute(AbstractJdbcDatabase.java:1247) at liquibase.database.AbstractJdbcDatabase.executeStatements(AbstractJdbcDatabase.java:1230) at liquibase.changelog.ChangeSet.execute(ChangeSet.java:548) at liquibase.changelog.visitor.UpdateVisitor.visit(UpdateVisitor.java:51) at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:73) at liquibase.Liquibase.update(Liquibase.java:210) at liquibase.Liquibase.update(Liquibase.java:190) at liquibase.Liquibase.update(Liquibase.java:186) at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.updateChangeSet(LiquibaseJpaUpdaterProvider.java:1 35) at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.update(LiquibaseJpaUpdaterProvider.java:88) at org.keycloak.connections.jpa.updater.liquibase.LiquibaseJpaUpdaterProvider.update(LiquibaseJpaUpdaterProvider.java:67) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.update(DefaultJpaConnectionProviderFactory.java:322) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.migration(DefaultJpaConnectionProviderFactory.java:308) at org.keycloak.connections.jpa.DefaultJpaConnectionProviderFactory.lambda$lazyInit$0(DefaultJpaConnectionProviderFactory.java:1 79)