Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions docs/spec/map.md
Original file line number Diff line number Diff line change
Expand Up @@ -290,7 +290,7 @@ import software.amazon.awssdk.services.lambda.model.ContextOptions;
import software.amazon.awssdk.services.lambda.model.Operation;
import software.amazon.awssdk.services.lambda.model.OperationAction;
import software.amazon.awssdk.services.lambda.model.OperationUpdate;
import software.amazon.lambda.durable.CompletionConfig;
import software.amazon.lambda.durable.config.CompletionConfig;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.TypeToken;
import software.amazon.lambda.durable.model.CompletionReason;
Expand Down Expand Up @@ -480,8 +480,8 @@ import java.util.Collections;
import java.util.List;
import java.util.function.Function;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.MapConfig;
import software.amazon.lambda.durable.MapFunction;
import software.amazon.lambda.durable.config.MapConfig;
import software.amazon.lambda.durable.DurableContext.MapFunction;
import software.amazon.lambda.durable.TypeToken;
import software.amazon.lambda.durable.model.BatchResult;
import software.amazon.lambda.durable.model.OperationSubType;
Expand Down Expand Up @@ -900,8 +900,8 @@ package software.amazon.lambda.durable.operation;

import java.util.List;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.MapConfig;
import software.amazon.lambda.durable.MapFunction;
import software.amazon.lambda.durable.config.MapConfig;
import software.amazon.lambda.durable.DurableContext.MapFunction;
import software.amazon.lambda.durable.model.BatchResult;
import software.amazon.lambda.durable.model.OperationSubType;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,9 @@
package software.amazon.lambda.durable.examples;

import java.time.Duration;
import software.amazon.lambda.durable.CallbackConfig;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.config.CallbackConfig;

/**
* Example demonstrating callback operations for external system integration.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
import java.time.Duration;
import java.util.List;
import java.util.stream.Collectors;
import software.amazon.lambda.durable.CompletionConfig;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.MapConfig;
import software.amazon.lambda.durable.config.CompletionConfig;
import software.amazon.lambda.durable.config.MapConfig;

/**
* Example demonstrating advanced map features: wait operations inside branches, error handling, and early termination.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
import software.amazon.lambda.durable.DurableConfig;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.InvokeConfig;
import software.amazon.lambda.durable.config.InvokeConfig;
import software.amazon.lambda.durable.retry.JitterStrategy;
import software.amazon.lambda.durable.retry.PollingStrategies;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,8 @@
import org.slf4j.LoggerFactory;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.StepSemantics;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.config.StepSemantics;
import software.amazon.lambda.durable.exception.StepFailedException;
import software.amazon.lambda.durable.exception.StepInterruptedException;
import software.amazon.lambda.durable.retry.RetryStrategies;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import org.slf4j.LoggerFactory;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.TypeToken;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.retry.RetryStrategies;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,8 @@
import org.slf4j.LoggerFactory;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.TypeToken;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.retry.RetryStrategies;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.retry.JitterStrategy;
import software.amazon.lambda.durable.retry.RetryStrategies;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@

import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.InvokeConfig;
import software.amazon.lambda.durable.config.InvokeConfig;

/**
* Simple example demonstrating basic invoke execution with the Durable Execution SDK.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.retry.RetryStrategies;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.retry.RetryStrategies;

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

import java.time.Duration;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;

/**
Expand Down Expand Up @@ -31,15 +32,26 @@ public String handleRequest(GreetingRequest input, DurableContext context) {
context.wait(null, Duration.ofSeconds(10));
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Do we need to remove this? If we are waiting for 10 seconds within step 2.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

step2 is using wait as a at-most timer.


// Step 2: Continue processing
var continued =
context.step("continue-processing", String.class, stepCtx -> started + " - continued after 10s");
var continued = context.stepAsync("continue-processing", String.class, stepCtx -> {
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
return started + " - continued after 10s";
});

// Wait 5 seconds
context.wait(null, Duration.ofSeconds(5));
// Wait at most seconds
var wait5seconds = context.runInChildContextAsync("wait-5-seconds", String.class, ctx -> {
ctx.wait("wait-5-seconds", Duration.ofSeconds(5));

return started + " - waited 5 seconds";
});

var step2 = DurableFuture.anyOf(continued, wait5seconds);

// Step 3: Complete
var result =
context.step("complete-processing", String.class, stepCtx -> continued + " - completed after 5s more");
var result = context.step("complete-processing", String.class, stepCtx -> step2 + " - completed after 5s more");

return result;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.ParallelConfig;
import software.amazon.lambda.durable.ParallelDurableFuture;
import software.amazon.lambda.durable.config.ParallelConfig;
import software.amazon.lambda.durable.model.ParallelResult;

/**
Expand All @@ -21,8 +22,8 @@
* <li>A final step combines the results into a summary
* </ol>
*
* <p>The {@link software.amazon.lambda.durable.ParallelContext} implements {@link AutoCloseable}, so try-with-resources
* guarantees {@code join()} is called even if an exception occurs.
* <p>The {@link ParallelDurableFuture} implements {@link AutoCloseable}, so try-with-resources guarantees
* {@code join()} is called even if an exception occurs.
*/
public class ParallelExample extends DurableHandler<ParallelExample.Input, ParallelExample.Output> {

Expand Down Expand Up @@ -54,9 +55,9 @@ public Output handleRequest(Input input, DurableContext context) {
ParallelResult parallelResult = parallel.get();
logger.info(
"Parallel complete: total={}, succeeded={}, failed={}",
parallelResult.getTotalBranches(),
parallelResult.getSucceededBranches(),
parallelResult.getFailedBranches());
parallelResult.size(),
parallelResult.succeeded(),
parallelResult.failed());

var results = futures.stream().map(DurableFuture::get).toList();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,9 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.ParallelConfig;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.config.CompletionConfig;
import software.amazon.lambda.durable.config.ParallelConfig;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.model.ParallelResult;
import software.amazon.lambda.durable.retry.RetryStrategies;

Expand All @@ -25,7 +26,7 @@
public class ParallelFailureToleranceExample
extends DurableHandler<ParallelFailureToleranceExample.Input, ParallelFailureToleranceExample.Output> {

public record Input(List<String> services, int toleratedFailures, int minSuccessful) {}
public record Input(List<String> services, Integer toleratedFailures, Integer minSuccessful) {}

public record Output(int succeeded, int failed) {}

Expand All @@ -35,8 +36,7 @@ public Output handleRequest(Input input, DurableContext context) {
logger.info("Starting parallel execution with toleratedFailureCount={}", input.toleratedFailures());

var config = ParallelConfig.builder()
.minSuccessful(input.minSuccessful())
.toleratedFailureCount(input.toleratedFailures())
.completionConfig(new CompletionConfig(input.minSuccessful, input.toleratedFailures, null))
.build();

var futures = new ArrayList<DurableFuture<String>>(input.services().size());
Expand Down Expand Up @@ -65,12 +65,12 @@ public Output handleRequest(Input input, DurableContext context) {
ParallelResult parallelResult = parallel.get();
logger.info(
"Parallel complete: succeeded={}, failed={}, status={}",
parallelResult.getSucceededBranches(),
parallelResult.getFailedBranches(),
parallelResult.getCompletionStatus().isSucceeded() ? "succeeded" : "failed");
parallelResult.succeeded(),
parallelResult.failed(),
parallelResult.completionStatus().isSucceeded() ? "succeeded" : "failed");

var succeeded = parallelResult.getSucceededBranches();
var failed = parallelResult.getFailedBranches();
var succeeded = parallelResult.succeeded();
var failed = parallelResult.failed();

logger.info("Completed: {} succeeded, {} failed", succeeded, failed);
return new Output(succeeded, failed);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableFuture;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.ParallelConfig;
import software.amazon.lambda.durable.config.ParallelConfig;
import software.amazon.lambda.durable.model.ParallelResult;

/**
Expand Down Expand Up @@ -68,6 +68,6 @@ public Output handleRequest(Input input, DurableContext context) {
logger.info("All {} notifications delivered", deliveries.size());
// Test replay
context.wait("wait for finalization", Duration.ofSeconds(5));
return new Output(deliveries, result.getSucceededBranches(), result.getFailedBranches());
return new Output(deliveries, result.succeeded(), result.failed());
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,8 @@ void testWaitExample() {
var finalResult = result.getResult(String.class);
assertNotNull(finalResult);
assertTrue(finalResult.contains("Started processing for TestUser"));
assertTrue(finalResult.contains("continued after 10s"));
assertFalse(finalResult.contains("continued after 10s"));
assertTrue(finalResult.contains("waited 5 seconds"));
assertTrue(finalResult.contains("completed after 5s more"));

assertNotNull(runner.getOperation("start-processing"));
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ void succeedsWhenFailuresAreWithinTolerance() {
var runner = LocalDurableTestRunner.create(ParallelFailureToleranceExample.Input.class, handler);

// 2 good services, 1 bad — toleratedFailureCount=1 so the parallel op still succeeds
var input = new ParallelFailureToleranceExample.Input(List.of("svc-a", "bad-svc-b", "svc-c"), 1, -1);
var input = new ParallelFailureToleranceExample.Input(List.of("svc-a", "bad-svc-b", "svc-c"), 1, null);
var result = runner.runUntilComplete(input);

assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
Expand All @@ -32,7 +32,7 @@ void succeedsWhenAllBranchesSucceed() {
var handler = new ParallelFailureToleranceExample();
var runner = LocalDurableTestRunner.create(ParallelFailureToleranceExample.Input.class, handler);

var input = new ParallelFailureToleranceExample.Input(List.of("svc-a", "svc-b", "svc-c"), 2, -1);
var input = new ParallelFailureToleranceExample.Input(List.of("svc-a", "svc-b", "svc-c"), 2, null);
var result = runner.runUntilComplete(input);

assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import software.amazon.awssdk.services.lambda.model.ErrorObject;
import software.amazon.awssdk.services.lambda.model.OperationStatus;
import software.amazon.awssdk.services.lambda.model.OperationType;
import software.amazon.lambda.durable.config.CallbackConfig;
import software.amazon.lambda.durable.exception.CallbackFailedException;
import software.amazon.lambda.durable.exception.CallbackTimeoutException;
import software.amazon.lambda.durable.model.ExecutionStatus;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.lambda.LambdaClient;
import software.amazon.lambda.durable.client.LambdaDurableFunctionsClient;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.serde.JacksonSerDes;
import software.amazon.lambda.durable.serde.SerDes;
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.serde.JacksonSerDes;
import software.amazon.lambda.durable.serde.SerDes;
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@

import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.config.StepSemantics;
import software.amazon.lambda.durable.exception.StepInterruptedException;
import software.amazon.lambda.durable.model.ExecutionStatus;
import software.amazon.lambda.durable.retry.RetryStrategies;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
import java.util.List;
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
import software.amazon.lambda.durable.config.CompletionConfig;
import software.amazon.lambda.durable.config.MapConfig;
import software.amazon.lambda.durable.model.ConcurrencyCompletionStatus;
import software.amazon.lambda.durable.model.ExecutionStatus;
import software.amazon.lambda.durable.model.MapResultItem;
import software.amazon.lambda.durable.model.MapResult;
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;

class MapIntegrationTest {
Expand Down Expand Up @@ -535,8 +537,10 @@ void testMapWithAllSuccessfulCompletionConfig_stopsOnFirstFailure() {
assertEquals("OK1", result.getResult(0));
assertNotNull(result.getError(1));
// Items after the failure should be NOT_STARTED
assertEquals(MapResultItem.Status.NOT_STARTED, result.getItem(2).status());
assertEquals(MapResultItem.Status.NOT_STARTED, result.getItem(3).status());
assertEquals(
MapResult.MapResultItem.Status.SKIPPED, result.getItem(2).status());
assertEquals(
MapResult.MapResultItem.Status.SKIPPED, result.getItem(3).status());
return "done";
});

Expand Down Expand Up @@ -873,7 +877,9 @@ void testMapWithNullResults() {
assertTrue(result.allSucceeded());
assertEquals(3, result.size());
for (int i = 0; i < result.size(); i++) {
assertEquals(MapResultItem.Status.SUCCEEDED, result.getItem(i).status());
assertEquals(
MapResult.MapResultItem.Status.SUCCEEDED,
result.getItem(i).status());
assertNull(result.getResult(i));
assertNull(result.getError(i));
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@

import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.Test;
import software.amazon.lambda.durable.config.StepConfig;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Are these placeholder for future changes?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

import wasn't needed because they were in the same package.

import software.amazon.lambda.durable.config.StepSemantics;
import software.amazon.lambda.durable.model.ExecutionStatus;
import software.amazon.lambda.durable.retry.RetryStrategies;
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
import java.util.concurrent.atomic.AtomicInteger;
import org.junit.jupiter.api.RepeatedTest;
import org.junit.jupiter.api.Test;
import software.amazon.lambda.durable.config.WaitForConditionConfig;
import software.amazon.lambda.durable.model.ExecutionStatus;
import software.amazon.lambda.durable.model.WaitForConditionResult;
import software.amazon.lambda.durable.retry.JitterStrategy;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.junit.jupiter.api.Test;
import software.amazon.lambda.durable.DurableContext;
import software.amazon.lambda.durable.DurableHandler;
import software.amazon.lambda.durable.StepConfig;
import software.amazon.lambda.durable.config.StepConfig;
import software.amazon.lambda.durable.model.ExecutionStatus;
import software.amazon.lambda.durable.testing.LocalDurableTestRunner;

Expand Down
Loading
Loading