Uploaded image for project: 'RH-SSO'
  1. RH-SSO
  2. RHSSO-1300

Fail to create a primary key on (USER_SESSION_ID, CLIENT_ID, OFFLINE_FLAG) when migrating to 7.2

XMLWordPrintable

    • 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)
      

            hmlnarik@redhat.com Hynek Mlnařík
            rhn-support-hokuda Hisanobu Okuda
            Votes:
            0 Vote for this issue
            Watchers:
            1 Start watching this issue

              Created:
              Updated:
              Resolved: