From f1458a28db527882d3e2ab6a75a4eab07ac23b25 Mon Sep 17 00:00:00 2001 From: nvasiu Date: Fri, 13 Mar 2026 23:19:33 +0000 Subject: [PATCH] Add subtype to checkpoint updates in BaseDurableOperation --- .../durable/operation/BaseDurableOperation.java | 11 ++++++----- .../operation/ChildContextOperation.java | 17 +++++------------ 2 files changed, 11 insertions(+), 17 deletions(-) diff --git a/sdk/src/main/java/software/amazon/lambda/durable/operation/BaseDurableOperation.java b/sdk/src/main/java/software/amazon/lambda/durable/operation/BaseDurableOperation.java index e69f2b80..fe625b3b 100644 --- a/sdk/src/main/java/software/amazon/lambda/durable/operation/BaseDurableOperation.java +++ b/sdk/src/main/java/software/amazon/lambda/durable/operation/BaseDurableOperation.java @@ -263,11 +263,12 @@ protected void sendOperationUpdate(OperationUpdate.Builder builder) { } protected CompletableFuture sendOperationUpdateAsync(OperationUpdate.Builder builder) { - return executionManager.sendOperationUpdate(builder.id(getOperationId()) - .name(getName()) - .type(getType()) - .parentId(durableContext.getContextId()) - .build()); + var updateBuilder = + builder.id(getOperationId()).name(getName()).type(getType()).parentId(durableContext.getContextId()); + if (getSubType() != null) { + updateBuilder.subType(getSubType().getValue()); + } + return executionManager.sendOperationUpdate(updateBuilder.build()); } // serialization/deserialization utilities diff --git a/sdk/src/main/java/software/amazon/lambda/durable/operation/ChildContextOperation.java b/sdk/src/main/java/software/amazon/lambda/durable/operation/ChildContextOperation.java index 5acde1fe..2e750e6f 100644 --- a/sdk/src/main/java/software/amazon/lambda/durable/operation/ChildContextOperation.java +++ b/sdk/src/main/java/software/amazon/lambda/durable/operation/ChildContextOperation.java @@ -60,9 +60,7 @@ public ChildContextOperation( @Override protected void start() { // First execution: fire-and-forget START checkpoint, then run - sendOperationUpdateAsync(OperationUpdate.builder() - .action(OperationAction.START) - .subType(getSubType().getValue())); + sendOperationUpdateAsync(OperationUpdate.builder().action(OperationAction.START)); executeChildContext(); } @@ -139,17 +137,14 @@ private void checkpointSuccess(T result) { var serializedBytes = serialized.getBytes(StandardCharsets.UTF_8); if (serializedBytes.length < LARGE_RESULT_THRESHOLD) { - sendOperationUpdate(OperationUpdate.builder() - .action(OperationAction.SUCCEED) - .subType(getSubType().getValue()) - .payload(serialized)); + sendOperationUpdate( + OperationUpdate.builder().action(OperationAction.SUCCEED).payload(serialized)); } else { // Large result: checkpoint with empty payload + ReplayChildren flag. // Store the result so get() can return it directly without deserializing the empty payload. this.reconstructedResult = result; sendOperationUpdate(OperationUpdate.builder() .action(OperationAction.SUCCEED) - .subType(getSubType().getValue()) .payload("") .contextOptions( ContextOptions.builder().replayChildren(true).build())); @@ -173,10 +168,8 @@ private void handleChildContextFailure(Throwable exception) { errorObject = serializeException(exception); } - sendOperationUpdate(OperationUpdate.builder() - .action(OperationAction.FAIL) - .subType(getSubType().getValue()) - .error(errorObject)); + sendOperationUpdate( + OperationUpdate.builder().action(OperationAction.FAIL).error(errorObject)); } @Override