From aee11f54bc2d3398fefb4dfa42b77ebfdac9d6c0 Mon Sep 17 00:00:00 2001 From: Ben McAuley Date: Thu, 5 Mar 2026 16:33:22 +0000 Subject: [PATCH] When an upgrade step has no read actions and no modify actions (for example where it has been blanked out and replaced due to issues found) Morf was still treating it as requiring exclusive execution. Instead, treat it as a normal node which can be parallelised in the graph based upgrade, speeding up end-to-end upgrade execution. MORF-122 --- .../org/alfasoftware/morf/upgrade/GraphBasedUpgradeNode.java | 2 +- .../alfasoftware/morf/upgrade/TestGraphBasedUpgradeBuilder.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/morf-core/src/main/java/org/alfasoftware/morf/upgrade/GraphBasedUpgradeNode.java b/morf-core/src/main/java/org/alfasoftware/morf/upgrade/GraphBasedUpgradeNode.java index 0f6c4adab..6a4f2da1b 100644 --- a/morf-core/src/main/java/org/alfasoftware/morf/upgrade/GraphBasedUpgradeNode.java +++ b/morf-core/src/main/java/org/alfasoftware/morf/upgrade/GraphBasedUpgradeNode.java @@ -134,7 +134,7 @@ public List getUpgradeStatements() { * node should be executed while this one is being processed) */ public boolean requiresExclusiveExecution() { - return exclusiveExecution || reads.isEmpty() && modifies.isEmpty(); + return exclusiveExecution || isRoot(); } diff --git a/morf-core/src/test/java/org/alfasoftware/morf/upgrade/TestGraphBasedUpgradeBuilder.java b/morf-core/src/test/java/org/alfasoftware/morf/upgrade/TestGraphBasedUpgradeBuilder.java index 9213ce130..7e53bcaab 100644 --- a/morf-core/src/test/java/org/alfasoftware/morf/upgrade/TestGraphBasedUpgradeBuilder.java +++ b/morf-core/src/test/java/org/alfasoftware/morf/upgrade/TestGraphBasedUpgradeBuilder.java @@ -353,7 +353,7 @@ public void testExclusiveNodeFirstThenStandard() { public void testExclusiveNodeNotAParent() { // given when(upgradeTableResolution.getModifiedTables(U1000.class.getName())).thenReturn(Sets.newHashSet("t1")); - when(upgradeTableResolution.getModifiedTables(U1000.class.getName())).thenReturn(Sets.newHashSet("t1", "t2")); + when(upgradeTableResolution.getModifiedTables(U1001.class.getName())).thenReturn(Sets.newHashSet("t1", "t2")); upgradeSteps.addAll(Lists.newArrayList(eu1, u1000, u1001)); // when