Skip to content

Commit 15b8fbd

Browse files
ivicacclaude
andcommitted
4756 Delete jobs child-first to avoid double-deleting recursive children
jobFacade.deleteJob recursively deletes child jobs, so iterating a flat jobIds list that contains both parents and children revisits already-deleted rows. Sort by id descending (children have larger ids since they are inserted later) and de-dup before the delete loop. Loosen the ordering assertion in the deployment test accordingly. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent bb734f9 commit 15b8fbd

3 files changed

Lines changed: 22 additions & 6 deletions

File tree

server/ee/libs/embedded/embedded-configuration/embedded-configuration-service/src/main/java/com/bytechef/ee/embedded/configuration/facade/IntegrationInstanceConfigurationFacadeImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import java.time.Instant;
6363
import java.util.Collection;
6464
import java.util.Collections;
65+
import java.util.Comparator;
6566
import java.util.List;
6667
import java.util.Map;
6768
import java.util.Objects;
@@ -239,7 +240,12 @@ public void deleteIntegrationInstanceConfiguration(long id) {
239240
principalJobService.deletePrincipalJobs(jobId, PlatformType.EMBEDDED);
240241
}
241242

242-
for (long jobId : jobIds) {
243+
List<Long> orderedJobIds = jobIds.stream()
244+
.distinct()
245+
.sorted(Comparator.reverseOrder())
246+
.toList();
247+
248+
for (long jobId : orderedJobIds) {
243249
jobFacade.deleteJob(jobId);
244250
}
245251

server/libs/automation/automation-configuration/automation-configuration-service/src/main/java/com/bytechef/automation/configuration/facade/ProjectDeploymentFacadeImpl.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@
6262
import java.time.Instant;
6363
import java.util.Collection;
6464
import java.util.Collections;
65+
import java.util.Comparator;
6566
import java.util.List;
6667
import java.util.Map;
6768
import java.util.Objects;
@@ -224,7 +225,12 @@ public void deleteProjectDeployment(long id) {
224225
principalJobService.deletePrincipalJobs(jobId, PlatformType.AUTOMATION);
225226
}
226227

227-
for (long jobId : jobIds) {
228+
List<Long> orderedJobIds = jobIds.stream()
229+
.distinct()
230+
.sorted(Comparator.reverseOrder())
231+
.toList();
232+
233+
for (long jobId : orderedJobIds) {
228234
jobFacade.deleteJob(jobId);
229235
}
230236

server/libs/automation/automation-configuration/automation-configuration-service/src/test/java/com/bytechef/automation/configuration/facade/ProjectDeploymentFacadeIntTest.java

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import static org.mockito.ArgumentMatchers.anyString;
2525
import static org.mockito.ArgumentMatchers.eq;
2626
import static org.mockito.Mockito.atLeastOnce;
27+
import static org.mockito.Mockito.calls;
2728
import static org.mockito.Mockito.inOrder;
2829
import static org.mockito.Mockito.reset;
2930
import static org.mockito.Mockito.verify;
@@ -211,10 +212,13 @@ public void testDeleteProjectDeploymentRemovesAllPrincipalJobsBeforeAnyJob() {
211212
.deletePrincipalJobs(parentJobId, PlatformType.AUTOMATION);
212213
inOrder.verify(principalJobService)
213214
.deletePrincipalJobs(childJobId, PlatformType.AUTOMATION);
214-
inOrder.verify(jobFacade)
215-
.deleteJob(parentJobId);
216-
inOrder.verify(jobFacade)
217-
.deleteJob(childJobId);
215+
inOrder.verify(jobFacade, calls(1))
216+
.deleteJob(anyLong());
217+
inOrder.verify(jobFacade, calls(1))
218+
.deleteJob(anyLong());
219+
220+
verify(jobFacade).deleteJob(parentJobId);
221+
verify(jobFacade).deleteJob(childJobId);
218222
}
219223

220224
@Disabled

0 commit comments

Comments
 (0)