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

View File

@@ -30,6 +30,8 @@ class TidyWorkflowRecoveryServiceTest {
mapper = mock(WmsAlgorithmMapper.class); mapper = mock(WmsAlgorithmMapper.class);
transaction = mock(TidyWorkflowTransaction.class); transaction = mock(TidyWorkflowTransaction.class);
service = new TidyWorkflowRecoveryService(mapper, transaction); service = new TidyWorkflowRecoveryService(mapper, transaction);
when(mapper.completeTidyWorkflow(anyString())).thenReturn(1);
when(mapper.pauseTidyWorkflow(anyString(), anyString())).thenReturn(1);
} }
@Test @Test
@@ -70,6 +72,17 @@ class TidyWorkflowRecoveryServiceTest {
verify(mapper).releaseTidyResources(evidence.workflowId()); 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 @Test
void completedStepsWithALingeringActiveJobPauseWithoutReleasingLocks() { void completedStepsWithALingeringActiveJobPauseWithoutReleasingLocks() {
TidyRecoveryEvidence evidence = matching().allStepsCompleted().activeTidyJobCount(1).build(); TidyRecoveryEvidence evidence = matching().allStepsCompleted().activeTidyJobCount(1).build();
@@ -82,6 +95,20 @@ class TidyWorkflowRecoveryServiceTest {
verify(mapper, never()).releaseTidyResources(anyString()); 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}") @ParameterizedTest(name = "{0}")
@MethodSource("pauseCases") @MethodSource("pauseCases")
void inconsistentLocalEvidencePausesWithoutReleasingLocks( void inconsistentLocalEvidencePausesWithoutReleasingLocks(