From 1df82c3d3682e95beed9b7b5277170493ecae526 Mon Sep 17 00:00:00 2001 From: dcabib Date: Mon, 2 Feb 2026 14:44:59 -0300 Subject: [PATCH 1/3] feat(idempotency): add automatic priming for DynamoDB persistence store Implements automatic class preloading via CRaC hooks for the idempotency-dynamodb module to improve SnapStart cold start performance. Changes: - Add ClassPreLoader.preloadClasses() call to DynamoDBPersistenceStore.beforeCheckpoint() - Generate and include classesloaded.txt with 8,726 classes - Add powertools-common dependency for ClassPreLoader - Add Maven profile generate-classesloaded-file - Add unit tests for CRaC hooks - Update Priming.md with idempotency-dynamodb example - Add null check and logging for defensive error handling This combines both invoke priming (warming DynamoDB SDK paths) and automatic priming (preloading classes) for optimal performance. Follows the same pattern as implemented in powertools-metrics (#1861), powertools-tracing (#2345), and powertools-kafka (#2145). Fixes #1997 Co-Authored-By: Claude Sonnet 4.5 --- Priming.md | 4 +- .../powertools-idempotency-dynamodb/pom.xml | 22 + .../dynamodb/DynamoDBPersistenceStore.java | 15 +- .../src/main/resources/classesloaded.txt | 8726 +++++++++++++++++ .../DynamoDBPersistenceStoreTest.java | 23 + 5 files changed, 8787 insertions(+), 3 deletions(-) create mode 100644 powertools-idempotency/powertools-idempotency-dynamodb/src/main/resources/classesloaded.txt diff --git a/Priming.md b/Priming.md index d7597ad8c..c7654bb06 100644 --- a/Priming.md +++ b/Priming.md @@ -56,4 +56,6 @@ In order to generate the `classloaded.txt` file for a Java module in this projec - `classesloaded.txt` file includes test classes as well because the file is generated while running tests. This is not a problem because all the classes that are not found are ignored by `ClassPreLoader.preloadClasses()`. Also `beforeCheckpoint()` hook is not time-sensitive, it only runs once when a new Lambda version gets published. ## Reference Implementation -Working example is available in the [powertools-metrics](powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsFactory.java). +Working examples are available in: +- [powertools-metrics](powertools-metrics/src/main/java/software/amazon/lambda/powertools/metrics/MetricsFactory.java) - Automatic priming with `ClassPreLoader` +- [powertools-idempotency-dynamodb](powertools-idempotency/powertools-idempotency-dynamodb/src/main/java/software/amazon/lambda/powertools/idempotency/persistence/dynamodb/DynamoDBPersistenceStore.java) - Invoke priming + Automatic priming diff --git a/powertools-idempotency/powertools-idempotency-dynamodb/pom.xml b/powertools-idempotency/powertools-idempotency-dynamodb/pom.xml index d223e0d2f..bca412e5a 100644 --- a/powertools-idempotency/powertools-idempotency-dynamodb/pom.xml +++ b/powertools-idempotency/powertools-idempotency-dynamodb/pom.xml @@ -65,6 +65,10 @@ org.crac crac + + software.amazon.lambda + powertools-common + @@ -106,6 +110,24 @@ + + generate-classesloaded-file + + + + org.apache.maven.plugins + maven-surefire-plugin + + + -Xlog:class+load=info:classesloaded.txt + --add-opens java.base/java.util=ALL-UNNAMED + --add-opens java.base/java.lang=ALL-UNNAMED + + + + + + generate-graalvm-files