fix: honor tidy recovery row counts

This commit is contained in:
zgw
2026-07-23 15:36:00 +08:00
parent 3ea7216fdb
commit 303beb5d42
2 changed files with 34 additions and 4 deletions

View File

@@ -29,9 +29,10 @@ public class TidyWorkflowRecoveryService {
}
if (evidence.stepId() == null) {
if (evidence.activeTidyJobCount() == 0) {
mapper.completeTidyWorkflow(evidence.workflowId());
mapper.releaseTidyResources(evidence.workflowId());
changed++;
if (mapper.completeTidyWorkflow(evidence.workflowId()) > 0) {
mapper.releaseTidyResources(evidence.workflowId());
changed++;
}
} else {
changed += pause(evidence, "RECOVERY_JOB_MISMATCH");
}
@@ -100,7 +101,9 @@ public class TidyWorkflowRecoveryService {
}
private int pause(TidyRecoveryEvidence evidence, String reason) {
mapper.pauseTidyWorkflow(evidence.workflowId(), reason);
if (mapper.pauseTidyWorkflow(evidence.workflowId(), reason) == 0) {
return 0;
}
if (evidence.stepNo() != null) {
mapper.pauseTidyStep(evidence.workflowId(), evidence.stepNo(), reason);
}

View File

@@ -30,6 +30,8 @@ class TidyWorkflowRecoveryServiceTest {
mapper = mock(WmsAlgorithmMapper.class);
transaction = mock(TidyWorkflowTransaction.class);
service = new TidyWorkflowRecoveryService(mapper, transaction);
when(mapper.completeTidyWorkflow(anyString())).thenReturn(1);
when(mapper.pauseTidyWorkflow(anyString(), anyString())).thenReturn(1);
}
@Test
@@ -70,6 +72,17 @@ class TidyWorkflowRecoveryServiceTest {
verify(mapper).releaseTidyResources(evidence.workflowId());
}
@Test
void completedStepsAlreadyFinalizedReturnZeroAndDoNotReleaseLocksAgain() {
TidyRecoveryEvidence evidence = matching().allStepsCompleted().build();
when(mapper.selectTidyRecoveryEvidence("01")).thenReturn(List.of(evidence));
when(mapper.completeTidyWorkflow(evidence.workflowId())).thenReturn(0);
assertThat(service.reconcile("01")).isZero();
verify(mapper, never()).releaseTidyResources(anyString());
}
@Test
void completedStepsWithALingeringActiveJobPauseWithoutReleasingLocks() {
TidyRecoveryEvidence evidence = matching().allStepsCompleted().activeTidyJobCount(1).build();
@@ -82,6 +95,20 @@ class TidyWorkflowRecoveryServiceTest {
verify(mapper, never()).releaseTidyResources(anyString());
}
@Test
void pauseThatChangesNoWorkflowRowReturnsZeroAndDoesNotPauseTheStep() {
TidyRecoveryEvidence evidence = matching().missingJobs().build();
when(mapper.selectTidyRecoveryEvidence("01")).thenReturn(List.of(evidence));
when(mapper.pauseTidyWorkflow(evidence.workflowId(), "RECOVERY_JOB_MISSING"))
.thenReturn(0);
assertThat(service.reconcile("01")).isZero();
verify(mapper, never()).pauseTidyStep(anyString(),
org.mockito.ArgumentMatchers.anyInt(), anyString());
verify(mapper, never()).releaseTidyResources(anyString());
}
@ParameterizedTest(name = "{0}")
@MethodSource("pauseCases")
void inconsistentLocalEvidencePausesWithoutReleasingLocks(