Avoid additional execution of Liquibase changelog lock table statement

Closes #41295

Signed-off-by: Martin Bartoš <mabartos@redhat.com>
This commit is contained in:
Martin Bartoš
2025-07-24 12:18:25 +02:00
committed by GitHub
parent 7f5c747aa9
commit 4a23e43e02
2 changed files with 29 additions and 1 deletions

View File

@@ -128,7 +128,10 @@ public class CustomLockService extends StandardLockService {
try {
Set<Integer> currentIds = currentIdsInDatabaseChangeLogLockTable();
if (!currentIds.containsAll(Arrays.asList(DBLockProvider.Namespace.values()))) {
Set<Integer> 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);
}

View File

@@ -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");
}
}