From 4a23e43e0274102015ba1fd74a05e71fffa2a4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Barto=C5=A1?= Date: Thu, 24 Jul 2025 12:18:25 +0200 Subject: [PATCH] Avoid additional execution of Liquibase changelog lock table statement MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Closes #41295 Signed-off-by: Martin Bartoš --- .../liquibase/lock/CustomLockService.java | 5 +++- .../it/cli/dist/LiquibaseDistTest.java | 25 +++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 quarkus/tests/integration/src/test/java/org/keycloak/it/cli/dist/LiquibaseDistTest.java 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"); + } +}