diff --git a/application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java b/application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java index bec88fd2ad..a21d89cc53 100644 --- a/application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java +++ b/application/src/main/java/org/thingsboard/server/service/install/lts/LtsMigrationService.java @@ -110,7 +110,15 @@ public class LtsMigrationService { return migrations.stream() .filter(migration -> { LtsVersion version = LtsVersion.parse(migration.getVersion()); - return version.compareTo(from) > 0 && version.compareTo(to) <= 0; + // Run only migrations whose family matches the target version. Older-family + // migrations (e.g. 4.2.x) ride onto newer-family branches (e.g. 4.3.x) via the + // release-merge cascade, but each branch's own family of migrations is + // self-contained (newer-family copies reproduce the older schema/data changes), + // so a cross-family upgrade is fully handled by the target-family migrations. + // Excluding the dormant older-family beans avoids double-processing. + return version.sameFamily(to) + && version.compareTo(from) > 0 + && version.compareTo(to) <= 0; }) .toList(); } diff --git a/application/src/test/java/org/thingsboard/server/service/install/lts/LtsMigrationServiceTest.java b/application/src/test/java/org/thingsboard/server/service/install/lts/LtsMigrationServiceTest.java index 0674bdbea5..f2f3e93896 100644 --- a/application/src/test/java/org/thingsboard/server/service/install/lts/LtsMigrationServiceTest.java +++ b/application/src/test/java/org/thingsboard/server/service/install/lts/LtsMigrationServiceTest.java @@ -113,6 +113,21 @@ class LtsMigrationServiceTest { verify(schemaSettingsService).updateSchemaVersion("4.2.2.4"); } + @Test + void skipsMigrationsOutsideTargetFamilyOnCrossFamilyUpgrade() { + List applied = new ArrayList<>(); + // 4.2.2.3 is carried onto a 4.3 branch by the release-merge cascade but must stay dormant: + // a cross-family 4.2 -> 4.3 upgrade is handled entirely by the 4.3-family migrations. + LtsMigrationService service = service(List.of( + migration("4.2.2.3", applied), + migration("4.3.1.2", applied), + migration("4.3.1.3", applied))); + + service.runDataMigrations("4.2.2.2", "4.3.1.3"); + + assertEquals(List.of("4.3.1.2", "4.3.1.3"), applied); + } + @Test void reRunAtCurrentVersionIsNoOp() throws Exception { List applied = new ArrayList<>();