This is an automated email from the ASF dual-hosted git repository.

arnold pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/fineract.git


The following commit(s) were added to refs/heads/develop by this push:
     new 7b45f3e4d5 FINERACT-2181: Liquibase migrations are stuck when 
multi-threaded migrations are enabled and one tenant migration fails
7b45f3e4d5 is described below

commit 7b45f3e4d557f109943cfec4628d53373a0a5fa7
Author: Arnold Galovics <[email protected]>
AuthorDate: Thu Mar 6 13:26:15 2025 +0100

    FINERACT-2181: Liquibase migrations are stuck when multi-threaded 
migrations are enabled and one tenant migration fails
---
 .../service/migration/TenantDatabaseUpgradeService.java     | 13 +++++++++++--
 .../infrastructure/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 14aae50394..e44523aa48 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<Exception> exceptions = new ArrayList<>();
         try {
             for (Future<String> 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 e838b6e8e3..a22499905e 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<FineractPlatformTenant> 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;
             }
         });
 

Reply via email to