Horreum
Horreum copied to clipboard
Failing to restart after keycloak migration
Describe the bug
Occasionally, restarting Horreum in Dev mode with a backup database, horreum fails to start with the following exception:
2024-03-07 13:47:09,124 INFO [SecurityMigration] (Quarkus Main Thread) Perform roles migration from keycloak...
...
2024-03-07 13:47:09,732 INFO [SecurityMigration] (Quarkus Main Thread) Migration of user REDACTED with username REDACTED
2024-03-07 13:47:09,824 WARN [SecurityMigration] (Quarkus Main Thread) Unable to perform migration for user REDACTED due to A different object with the same identifier value was already associated with the session : [io.hyperfoil.tools.horreum.entity.user.TeamMembership#io.hyperfoil.tools.horreum.entity.user.TeamMembership@69a77a6c]
2024-03-07 13:47:09,850 ERROR [io.qua.run.Application] (Quarkus Main Thread) Failed to start application (with profile [dev]): java.lang.RuntimeException: Failed to start quarkus
at io.quarkus.runner.ApplicationImpl.doStart(Unknown Source)
at io.quarkus.runtime.Application.start(Application.java:101)
at io.quarkus.runtime.ApplicationLifecycleManager.run(ApplicationLifecycleManager.java:111)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:71)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:44)
at io.quarkus.runtime.Quarkus.run(Quarkus.java:124)
at io.quarkus.runner.GeneratedMain.main(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
at io.quarkus.runner.bootstrap.StartupActionImpl$1.run(StartupActionImpl.java:113)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: jakarta.persistence.EntityExistsException: A different object with the same identifier value was already associated with the session : [io.hyperfoil.tools.horreum.entity.user.TeamMembership#io.hyperfoil.tools.horreum.entity.user.TeamMembership@69a77a6c]
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:123)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:162)
at org.hibernate.internal.ExceptionConverterImpl.convert(ExceptionConverterImpl.java:168)
at org.hibernate.internal.SessionImpl.doFlush(SessionImpl.java:1416)
at org.hibernate.internal.SessionImpl.flush(SessionImpl.java:1398)
at org.hibernate.query.sql.internal.NativeQueryImpl.prepareForExecution(NativeQueryImpl.java:599)
at org.hibernate.query.spi.AbstractSelectionQuery.beforeQuery(AbstractSelectionQuery.java:391)
at org.hibernate.query.spi.AbstractSelectionQuery.list(AbstractSelectionQuery.java:364)
at org.hibernate.query.spi.AbstractSelectionQuery.getSingleResult(AbstractSelectionQuery.java:473)
at io.hyperfoil.tools.horreum.server.RoleManager.setRoles(RoleManager.java:28)
at io.hyperfoil.tools.horreum.server.RoleManager_ClientProxy.setRoles(Unknown Source)
at io.hyperfoil.tools.horreum.server.SecurityMigration.performUserMigration(SecurityMigration.java:85)
at io.hyperfoil.tools.horreum.server.SecurityMigration_Subclass.performUserMigration$$superforward(Unknown Source)
at io.hyperfoil.tools.horreum.server.SecurityMigration_Subclass$$function$$1.apply(Unknown Source)
at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:73)
at io.quarkus.arc.impl.AroundInvokeInvocationContext.proceed(AroundInvokeInvocationContext.java:62)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:136)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.invokeInOurTx(TransactionalInterceptorBase.java:107)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.doIntercept(TransactionalInterceptorRequired.java:38)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorBase.intercept(TransactionalInterceptorBase.java:61)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired.intercept(TransactionalInterceptorRequired.java:32)
at io.quarkus.narayana.jta.runtime.interceptor.TransactionalInterceptorRequired_Bean.intercept(Unknown Source)
at io.quarkus.arc.impl.InterceptorInvocation.invoke(InterceptorInvocation.java:42)
at io.quarkus.arc.impl.AroundInvokeInvocationContext.perform(AroundInvokeInvocationContext.java:30)
at io.quarkus.arc.impl.InvocationContexts.performAroundInvoke(InvocationContexts.java:27)
at io.hyperfoil.tools.horreum.server.SecurityMigration_Subclass.performUserMigration(Unknown Source)
at io.hyperfoil.tools.horreum.server.SecurityMigration.onStart(SecurityMigration.java:37)
at io.hyperfoil.tools.horreum.server.SecurityMigration_Observer_onStart_KTiARLQ98yl7VaQKMNvfKxawCpE.notify(Unknown Source)
at io.quarkus.arc.impl.EventImpl$Notifier.notifyObservers(EventImpl.java:346)
at io.quarkus.arc.impl.EventImpl$Notifier.notify(EventImpl.java:328)
at io.quarkus.arc.impl.EventImpl.fire(EventImpl.java:82)
at io.quarkus.arc.runtime.ArcRecorder.fireLifecycleEvent(ArcRecorder.java:157)
at io.quarkus.arc.runtime.ArcRecorder.handleLifecycleEvents(ArcRecorder.java:108)
at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy_0(Unknown Source)
at io.quarkus.deployment.steps.LifecycleEventsBuildStep$startupEvent1144526294.deploy(Unknown Source)
... 13 more
This has only happened once, and I am struggling to recreate the issue