Skip to content

Commit a23d7bd

Browse files
committed
fix: checkpoint token for paginated execution state
1 parent 45bbff8 commit a23d7bd

2 files changed

Lines changed: 119 additions & 0 deletions

File tree

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,60 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package com.amazonaws.lambda.durable.examples;
4+
5+
import com.amazonaws.lambda.durable.DurableContext;
6+
import com.amazonaws.lambda.durable.DurableFuture;
7+
import com.amazonaws.lambda.durable.DurableHandler;
8+
import java.time.Duration;
9+
import java.util.ArrayList;
10+
11+
/**
12+
* Performance test example demonstrating concurrent async steps.
13+
*
14+
* <p>This example tests the SDK's ability to handle many concurrent operations:
15+
*
16+
* <ul>
17+
* <li>Creates async steps in a loop
18+
* <li>Each step performs a simple computation
19+
* <li>All results are collected and summed
20+
* </ul>
21+
*/
22+
public class ManyAsyncStepsExample extends DurableHandler<ManyAsyncStepsExample.Input, String> {
23+
24+
private static final int STEP_COUNT = 500;
25+
26+
public record Input(int multiplier) {}
27+
28+
@Override
29+
public String handleRequest(Input input, DurableContext context) {
30+
var startTime = System.currentTimeMillis();
31+
var multiplier = input.multiplier() > 0 ? input.multiplier() : 1;
32+
33+
context.getLogger().info("Starting {} async steps with multiplier {}", STEP_COUNT, multiplier);
34+
35+
// Create 100 async steps
36+
var futures = new ArrayList<DurableFuture<Integer>>(STEP_COUNT);
37+
for (var i = 0; i < STEP_COUNT; i++) {
38+
var index = i;
39+
var future = context.stepAsync("compute-" + i, Integer.class, () -> index * multiplier);
40+
futures.add(future);
41+
}
42+
43+
context.getLogger().info("All {} async steps created, collecting results", STEP_COUNT);
44+
45+
// Collect all results
46+
var totalSum = 0L;
47+
for (var future : futures) {
48+
totalSum += future.get();
49+
}
50+
51+
var executionTimeMs = System.currentTimeMillis() - startTime;
52+
context.getLogger()
53+
.info("Completed {} steps, total sum: {}, execution time: {}ms", STEP_COUNT, totalSum, executionTimeMs);
54+
55+
// Wait 10 seconds to test replay
56+
context.wait("post-compute-wait", Duration.ofSeconds(10));
57+
58+
return String.format("Completed %d async steps. Sum: %d, Time: %dms", STEP_COUNT, totalSum, executionTimeMs);
59+
}
60+
}
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+
// SPDX-License-Identifier: Apache-2.0
3+
package com.amazonaws.lambda.durable.examples;
4+
5+
import static org.junit.jupiter.api.Assertions.*;
6+
7+
import com.amazonaws.lambda.durable.model.ExecutionStatus;
8+
import com.amazonaws.lambda.durable.testing.LocalDurableTestRunner;
9+
import org.junit.jupiter.api.Test;
10+
11+
class ManyAsyncStepsExampleTest {
12+
13+
@Test
14+
void testManyAsyncSteps() {
15+
var handler = new ManyAsyncStepsExample();
16+
var runner = LocalDurableTestRunner.create(ManyAsyncStepsExample.Input.class, handler);
17+
18+
var input = new ManyAsyncStepsExample.Input(2);
19+
var result = runner.runUntilComplete(input);
20+
21+
assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
22+
23+
var output = result.getResult(String.class);
24+
assertNotNull(output);
25+
assertTrue(output.contains("500 async steps"));
26+
27+
// Sum of 0..499 * 2 = 499 * 500 / 2 * 2 = 249500
28+
assertTrue(output.contains("249500"));
29+
}
30+
31+
@Test
32+
void testManyAsyncStepsWithDefaultMultiplier() {
33+
var handler = new ManyAsyncStepsExample();
34+
var runner = LocalDurableTestRunner.create(ManyAsyncStepsExample.Input.class, handler);
35+
36+
var input = new ManyAsyncStepsExample.Input(1);
37+
var result = runner.runUntilComplete(input);
38+
39+
assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
40+
41+
// Sum of 0..499 = 499 * 500 / 2 = 124750
42+
assertTrue(result.getResult(String.class).contains("124750"));
43+
}
44+
45+
@Test
46+
void testOperationsAreTracked() {
47+
var handler = new ManyAsyncStepsExample();
48+
var runner = LocalDurableTestRunner.create(ManyAsyncStepsExample.Input.class, handler);
49+
50+
var result = runner.runUntilComplete(new ManyAsyncStepsExample.Input(1));
51+
52+
assertEquals(ExecutionStatus.SUCCEEDED, result.getStatus());
53+
54+
// Verify some operations are tracked
55+
assertNotNull(result.getOperation("compute-0"));
56+
assertNotNull(result.getOperation("compute-499"));
57+
assertNotNull(result.getOperation("compute-250"));
58+
}
59+
}

0 commit comments

Comments
 (0)