Skip to content

Commit 002daac

Browse files
committed
rethrow OrchestratorBlockedException
1 parent 8331f81 commit 002daac

2 files changed

Lines changed: 11 additions & 0 deletions

File tree

exporthistory/src/main/java/com/microsoft/durabletask/exporthistory/entity/ExportJob.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,12 @@ private Object markAsFailed(TaskEntityOperation operation) {
177177
String jobId = operation.getContext().getId().getKey();
178178
String errorMessage = operation.getInput(String.class);
179179

180+
// Idempotent: a duplicate MARK_AS_FAILED (e.g. from replay) is a no-op rather than an error.
181+
if (state.getStatus() == ExportJobStatus.FAILED) {
182+
logger.fine("Export job already in FAILED state; ignoring duplicate MarkAsFailed: " + jobId);
183+
return null;
184+
}
185+
180186
if (!ExportJobTransitions.isValidTransition(ExportJobOperationNames.MARK_AS_FAILED, state.getStatus(), ExportJobStatus.FAILED)) {
181187
throw new ExportJobInvalidTransitionException(
182188
jobId, state.getStatus(), ExportJobStatus.FAILED, ExportJobOperationNames.MARK_AS_FAILED);

exporthistory/src/main/java/com/microsoft/durabletask/exporthistory/orchestrations/ExportJobOrchestrator.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
import com.microsoft.durabletask.TaskOrchestration;
88
import com.microsoft.durabletask.TaskOrchestrationContext;
99
import com.microsoft.durabletask.RetryPolicy;
10+
import com.microsoft.durabletask.interruption.ContinueAsNewInterruption;
11+
import com.microsoft.durabletask.interruption.OrchestratorBlockedException;
1012
import com.microsoft.durabletask.exporthistory.constants.ExportJobOperationNames;
1113
import com.microsoft.durabletask.exporthistory.models.*;
1214

@@ -125,6 +127,9 @@ public void run(TaskOrchestrationContext ctx) {
125127
// Mark completed
126128
ctx.callEntity(input.getJobEntityId(), ExportJobOperationNames.MARK_AS_COMPLETED).await();
127129

130+
} catch (OrchestratorBlockedException | ContinueAsNewInterruption controlFlow) {
131+
// SDK control-flow signals — must propagate so the runtime can suspend/continue.
132+
throw controlFlow;
128133
} catch (Exception ex) {
129134
// Mark as failed
130135
try {

0 commit comments

Comments
 (0)