From 7b45f3e4d557f109943cfec4628d53373a0a5fa7 Mon Sep 17 00:00:00 2001 From: Arnold Galovics Date: Thu, 6 Mar 2025 13:26:15 +0100 Subject: [PATCH] FINERACT-2181: Liquibase migrations are stuck when multi-threaded migrations are enabled and one tenant migration fails --- .../migration/TenantDatabaseUpgradeService.java | 13 +++++++++++-- .../core/LiquibaseStepDefinitions.java | 7 ++----- 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java index 14aae5039..e44523aa4 100644 --- a/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java +++ b/fineract-provider/src/main/java/org/apache/fineract/infrastructure/core/service/migration/TenantDatabaseUpgradeService.java @@ -148,16 +148,23 @@ public class TenantDatabaseUpgradeService implements InitializingBean { } } + List exceptions = new ArrayList<>(); try { for (Future future : futures) { future.get(); } } catch (InterruptedException | ExecutionException exception) { - throw new RuntimeException(exception); + exceptions.add(exception); } finally { tenantUpgradeThreadPoolTaskExecutor.shutdown(); } - log.info("Tenant upgrades have finished"); + + if (exceptions.isEmpty()) { + log.info("Tenant upgrades have successfully finished"); + } else { + exceptions.forEach(e -> log.error("Exception: ", e)); + throw new RuntimeException("Tenant upgrades had exceptions"); + } } private ThreadPoolTaskExecutor createTenantUpgradeThreadPoolTaskExecutor() { @@ -193,6 +200,8 @@ public class TenantDatabaseUpgradeService implements InitializingBean { tenant.getTenantIdentifier()); tenantLiquibase.afterPropertiesSet(); log.info("Upgrade for tenant {} has finished", tenant.getTenantIdentifier()); + } catch (Exception e) { + throw new RuntimeException("Exception while upgrading tenant " + tenant.getTenantIdentifier(), e); } } diff --git a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java index e838b6e8e..a22499905 100644 --- a/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java +++ b/fineract-provider/src/test/java/org/apache/fineract/infrastructure/core/LiquibaseStepDefinitions.java @@ -40,7 +40,6 @@ import org.apache.fineract.infrastructure.core.config.FineractProperties; import org.apache.fineract.infrastructure.core.domain.FineractPlatformTenant; import org.apache.fineract.infrastructure.core.service.migration.ExtendedSpringLiquibase; import org.apache.fineract.infrastructure.core.service.migration.ExtendedSpringLiquibaseFactory; -import org.apache.fineract.infrastructure.core.service.migration.SchemaUpgradeNeededException; import org.apache.fineract.infrastructure.core.service.migration.TenantDataSourceFactory; import org.apache.fineract.infrastructure.core.service.migration.TenantDatabaseStateVerifier; import org.apache.fineract.infrastructure.core.service.migration.TenantDatabaseUpgradeService; @@ -66,7 +65,7 @@ public class LiquibaseStepDefinitions implements En { private DataSource tenantStoreDataSource; private TenantDatabaseUpgradeService tenantDatabaseUpgradeService; private List allTenants; - private SchemaUpgradeNeededException executionException; + private RuntimeException executionException; private HikariDataSource defaultTenantDataSource; private Environment environment; @@ -103,10 +102,8 @@ public class LiquibaseStepDefinitions implements En { When("The database migration process is executed", () -> { try { tenantDatabaseUpgradeService.afterPropertiesSet(); - } catch (SchemaUpgradeNeededException e) { - executionException = e; } catch (RuntimeException e) { - executionException = (SchemaUpgradeNeededException) e.getCause().getCause(); + executionException = e; } });