Skip to content

Add prefix "kc_" to all existing tables#10124

Merged
hmlnarik merged 1 commit intokeycloak:mainfrom
vramik:#10101-add-kc-prefix
Feb 11, 2022
Merged

Add prefix "kc_" to all existing tables#10124
hmlnarik merged 1 commit intokeycloak:mainfrom
vramik:#10101-add-kc-prefix

Conversation

@vramik
Copy link
Copy Markdown
Contributor

@vramik vramik commented Feb 10, 2022

Closes #10101

@vramik vramik requested a review from ahus1 February 10, 2022 14:17
@vramik vramik added area/storage Indicates an issue that touches storage (change in data layout or data manipulation) kind/enhancement Categorizes a PR related to an enhancement team/storage-sig labels Feb 10, 2022
@ahus1
Copy link
Copy Markdown
Member

ahus1 commented Feb 10, 2022

Hi @vramik - the code changes look good at first sight. Still, there seems to be something wired that might be connected to the Liquibase update. // cc: @sguilhen

An initial startup with an empty database succeeds (with client/clientScope/role enable for Map JPA). Once I create a new role (that might trigger a new DB connection?) an exception as follows occurs. Can join you tomorrow on this to figure out what's going on here.

21:05:12,519 ERROR XNIO-1 task-4 [org.keycloak.services.error.KeycloakErrorHandler] Uncaught server error
java.lang.RuntimeException: Failed to validate database
	at org.keycloak.models.map.storage.jpa.liquibase.updater.MapJpaLiquibaseUpdaterProvider.validate(MapJpaLiquibaseUpdaterProvider.java:128)
	at org.keycloak.models.map.storage.jpa.JpaMapStorageProviderFactory.validateAndUpdateSchema(JpaMapStorageProviderFactory.java:234)
	at org.keycloak.models.map.storage.jpa.JpaMapStorageProvider.getStorage(JpaMapStorageProvider.java:49)
	at org.keycloak.models.map.common.AbstractMapProviderFactory.getStorage(AbstractMapProviderFactory.java:64)
	at org.keycloak.models.map.client.MapClientProviderFactory.create(MapClientProviderFactory.java:56)
	at org.keycloak.models.map.client.MapClientProviderFactory.create(MapClientProviderFactory.java:38)
	at org.keycloak.services.DefaultKeycloakSession.getProvider(DefaultKeycloakSession.java:316)
	at org.keycloak.services.DefaultKeycloakSession.clientLocalStorage(DefaultKeycloakSession.java:233)
	at org.keycloak.storage.ClientStorageManager.getClientsStream(ClientStorageManager.java:227)
	at org.keycloak.models.cache.infinispan.RealmCacheSession.getClientsStream(RealmCacheSession.java:558)
	at org.keycloak.models.cache.infinispan.RealmAdapter.getClientsStream(RealmAdapter.java:835)
	at org.keycloak.services.resources.admin.ClientsResource.getClients(ClientsResource.java:122)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.base/java.lang.reflect.Method.invoke(Method.java:566)
	at org.jboss.resteasy.core.MethodInjectorImpl.invoke(MethodInjectorImpl.java:138)
	at org.jboss.resteasy.core.ResourceMethodInvoker.internalInvokeOnTarget(ResourceMethodInvoker.java:546)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTargetAfterFilter(ResourceMethodInvoker.java:435)
	at org.jboss.resteasy.core.ResourceMethodInvoker.lambda$invokeOnTarget$0(ResourceMethodInvoker.java:396)
	at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:398)
	at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:365)
	at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:150)
	at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:110)
	at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:141)
	at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:110)
	at org.jboss.resteasy.core.ResourceLocatorInvoker.invokeOnTargetObject(ResourceLocatorInvoker.java:141)
	at org.jboss.resteasy.core.ResourceLocatorInvoker.invoke(ResourceLocatorInvoker.java:104)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:440)
	at org.jboss.resteasy.core.SynchronousDispatcher.lambda$invoke$4(SynchronousDispatcher.java:229)
	at org.jboss.resteasy.core.SynchronousDispatcher.lambda$preprocess$0(SynchronousDispatcher.java:135)
	at org.jboss.resteasy.core.interception.PreMatchContainerRequestContext.filter(PreMatchContainerRequestContext.java:358)
	at org.jboss.resteasy.core.SynchronousDispatcher.preprocess(SynchronousDispatcher.java:138)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:215)
	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:245)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:61)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:74)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:129)
	at org.keycloak.testsuite.UndertowRequestFilter.lambda$doFilter$0(UndertowRequestFilter.java:49)
	at org.keycloak.services.filters.AbstractRequestFilter.filter(AbstractRequestFilter.java:43)
	at org.keycloak.testsuite.UndertowRequestFilter.doFilter(UndertowRequestFilter.java:47)
	at io.undertow.servlet.core.ManagedFilter.doFilter(ManagedFilter.java:61)
	at io.undertow.servlet.handlers.FilterHandler$FilterChainImpl.doFilter(FilterHandler.java:131)
	at io.undertow.servlet.handlers.FilterHandler.handleRequest(FilterHandler.java:84)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletChain$1.handleRequest(ServletChain.java:68)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at io.undertow.servlet.handlers.RedirectDirHandler.handleRequest(RedirectDirHandler.java:68)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:117)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.SendErrorPageHandler.handleRequest(SendErrorPageHandler.java:52)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:269)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:78)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:133)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:130)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:249)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:78)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:99)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:387)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:841)
	at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
	at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:1982)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1486)
	at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1377)
	at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: liquibase.exception.LiquibaseException: java.lang.RuntimeException: Cannot end scope cwqyeonetb when currently at scope jprwnxnlng
	at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:124)
	at liquibase.changelog.DatabaseChangeLog.validate(DatabaseChangeLog.java:289)
	at liquibase.Liquibase$16.run(Liquibase.java:1987)
	at liquibase.Scope.lambda$child$0(Scope.java:177)
	at liquibase.Scope.child(Scope.java:186)
	at liquibase.Scope.child(Scope.java:176)
	at liquibase.Scope.child(Scope.java:155)
	at liquibase.Liquibase.runInScope(Liquibase.java:2404)
	at liquibase.Liquibase.listUnrunChangeSets(Liquibase.java:1977)
	at org.keycloak.models.map.storage.jpa.liquibase.updater.MapJpaLiquibaseUpdaterProvider.getLiquibaseUnrunChangeSets(MapJpaLiquibaseUpdaterProvider.java:154)
	at org.keycloak.models.map.storage.jpa.liquibase.updater.MapJpaLiquibaseUpdaterProvider.validateChangeSet(MapJpaLiquibaseUpdaterProvider.java:136)
	at org.keycloak.models.map.storage.jpa.liquibase.updater.MapJpaLiquibaseUpdaterProvider.validate(MapJpaLiquibaseUpdaterProvider.java:122)
	... 77 more
Caused by: java.lang.RuntimeException: Cannot end scope cwqyeonetb when currently at scope jprwnxnlng
	at liquibase.Scope.exit(Scope.java:227)
	at liquibase.Scope.child(Scope.java:188)
	at liquibase.Scope.child(Scope.java:176)
	at liquibase.Scope.child(Scope.java:155)
	at liquibase.Scope.child(Scope.java:240)
	at liquibase.Scope.child(Scope.java:244)
	at liquibase.changelog.ChangeLogIterator.run(ChangeLogIterator.java:66)
	... 88 more

@hmlnarik
Copy link
Copy Markdown
Contributor

@sguilhen
Copy link
Copy Markdown
Contributor

Yes, I've just run into a very similar issue when loading roles, where more than one attempt to create the provider is made. I think that some streams are processing elements in parallel that are leading to these scenarios. As @hmlnarik said, this sould be fixed once #10129 is merged.

@hmlnarik
Copy link
Copy Markdown
Contributor

@ahus1 Is this an exception caused by this PR? If not and the PR does what it should, feel free to approve this PR.

Copy link
Copy Markdown
Member

@ahus1 ahus1 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Approved after code review and seeing that the initial setup of the DB runs ok. Observed exceptions related to other bug.

Copy link
Copy Markdown
Contributor

@hmlnarik hmlnarik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks @vramik and @ahus1! Approving per @ahus1 's review

@hmlnarik hmlnarik merged commit 8a8d59a into keycloak:main Feb 11, 2022
@vramik vramik deleted the #10101-add-kc-prefix branch February 11, 2022 11:07
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/storage Indicates an issue that touches storage (change in data layout or data manipulation) kind/enhancement Categorizes a PR related to an enhancement

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add prefix "kc_" to all existing tables

4 participants