diff --git a/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/lock/CustomLockService.java b/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/lock/CustomLockService.java index c750ea98ef3..b7bc505a60e 100644 --- a/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/lock/CustomLockService.java +++ b/model/jpa/src/main/java/org/keycloak/connections/jpa/updater/liquibase/lock/CustomLockService.java @@ -128,7 +128,10 @@ public class CustomLockService extends StandardLockService { try { Set currentIds = currentIdsInDatabaseChangeLogLockTable(); - if (!currentIds.containsAll(Arrays.asList(DBLockProvider.Namespace.values()))) { + Set customNamespaceIds = Arrays.stream(DBLockProvider.Namespace.values()) + .map(DBLockProvider.Namespace::getId) + .collect(Collectors.toSet()); + if (!currentIds.containsAll(customNamespaceIds)) { if (log.isTraceEnabled()) { log.tracef("Initialize Database Lock Table, current locks %s", currentIds); } diff --git a/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LiquibaseDistTest.java b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LiquibaseDistTest.java new file mode 100644 index 00000000000..3eb988bad8d --- /dev/null +++ b/quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LiquibaseDistTest.java @@ -0,0 +1,25 @@ +package org.keycloak.it.cli.dist; + +import org.junit.jupiter.api.Tag; +import org.junit.jupiter.api.Test; +import org.keycloak.it.junit5.extension.DistributionTest; +import org.keycloak.it.junit5.extension.RawDistOnly; +import org.keycloak.it.utils.KeycloakDistribution; + +@DistributionTest +@RawDistOnly(reason = "Containers are immutable") +@Tag(DistributionTest.SLOW) +public class LiquibaseDistTest { + + @Test + public void dbLockMultipleExecution(KeycloakDistribution distribution) { + var result = distribution.run("start-dev", "--log-level=org.keycloak.connections.jpa.updater.liquibase.lock.CustomLockService:trace"); + result.assertMessage("Initialize Database Lock Table, current locks []"); + result.assertMessage("Initialized record in the database lock table"); + + // the code block in the CustomLockService should not be executed for the second time + result = distribution.run("start-dev", "--log-level=org.keycloak.connections.jpa.updater.liquibase.lock.CustomLockService:trace"); + result.assertNoMessage("Initialize Database Lock Table, current locks"); + result.assertNoMessage("Initialized record in the database lock table"); + } +}