Skip to content

Commit 9fc4e62

Browse files
authored
Merge branch 'master' into somepal/s3-express-featureID-implementation
2 parents 589d722 + 839bbaa commit 9fc4e62

File tree

7 files changed

+347
-19
lines changed

7 files changed

+347
-19
lines changed
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"type": "feature",
3+
"category": "AWS SDK for Java v2",
4+
"contributor": "",
5+
"description": "Adds business metrics for flexible checksum algorithms and configurations"
6+
}

.github/workflows/s3-regression-tests.yml

Lines changed: 11 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
name: S3 Regression Tests
22
on:
33
pull_request:
4+
types: [ opened, synchronize, reopened, labeled, unlabeled ]
45
merge_group:
56
push:
67
branches:
@@ -14,7 +15,7 @@ jobs:
1415
if: github.repository == 'aws/aws-sdk-java-v2'
1516
runs-on: ubuntu-latest
1617
outputs:
17-
has_s3_related_changes: ${{ steps.check-changes.outputs.has_s3_related_changes }}
18+
run_tests: ${{ contains(github.event.pull_request.labels.*.name, 'force-s3-regression-tests') || steps.check-changes.outputs.has_s3_related_changes }}
1819
steps:
1920
- uses: actions/checkout@v4
2021
with:
@@ -26,8 +27,8 @@ jobs:
2627
BASE_REF=${BASE_REF#refs/heads/}
2728
git fetch origin "$BASE_REF" --depth 1
2829
CHANGED_FILES=$(git diff origin/"$BASE_REF" --name-only)
29-
if echo "$CHANGED_FILES" | grep -q -E '^core/|^services/s3/|^services-custom/s3-transfer-manager/|^http-client-spi/|^http-clients/'; then
30-
echo "Detected changes in S3, HTTP client, or core modules"
30+
if echo "$CHANGED_FILES" | grep -q -E '^core/|^services/s3/|^services-custom/s3-transfer-manager/|^http-client-spi/|^http-clients/|^test/s3-tests/'; then
31+
echo "Detected changes in S3, HTTP client, core modules, or s3-tests"
3132
echo "has_s3_related_changes=true" >> $GITHUB_OUTPUT
3233
else
3334
echo "No changes detected in S3, HTTP client, or core modules"
@@ -40,7 +41,7 @@ jobs:
4041
runs-on: ubuntu-latest
4142
env:
4243
REGRESSION_TEST: DownloadStreamingRegressionTesting
43-
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.has_s3_related_changes }}
44+
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.run_tests }}
4445
steps:
4546
- name: Configure AWS Credentials
4647
uses: aws-actions/configure-aws-credentials@v4
@@ -61,7 +62,7 @@ jobs:
6162
runs-on: ubuntu-latest
6263
env:
6364
REGRESSION_TEST: ControlPlaneOperationRegressionTesting
64-
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.has_s3_related_changes }}
65+
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.run_tests }}
6566
steps:
6667
- name: Configure AWS Credentials
6768
uses: aws-actions/configure-aws-credentials@v4
@@ -82,7 +83,7 @@ jobs:
8283
runs-on: ubuntu-latest
8384
env:
8485
REGRESSION_TEST: UploadSyncRegressionTesting
85-
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.has_s3_related_changes }}
86+
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.run_tests }}
8687
steps:
8788
- name: Configure AWS Credentials
8889
uses: aws-actions/configure-aws-credentials@v4
@@ -103,7 +104,7 @@ jobs:
103104
runs-on: ubuntu-latest
104105
env:
105106
REGRESSION_TEST: UploadAsyncRegressionTesting
106-
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.has_s3_related_changes }}
107+
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.run_tests }}
107108
steps:
108109
- name: Configure AWS Credentials
109110
uses: aws-actions/configure-aws-credentials@v4
@@ -124,7 +125,7 @@ jobs:
124125
runs-on: ubuntu-latest
125126
env:
126127
REGRESSION_TEST: UploadCrtRegressionTesting
127-
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.has_s3_related_changes }}
128+
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.run_tests }}
128129
steps:
129130
- name: Configure AWS Credentials
130131
uses: aws-actions/configure-aws-credentials@v4
@@ -145,7 +146,7 @@ jobs:
145146
runs-on: ubuntu-latest
146147
env:
147148
REGRESSION_TEST: UploadTransferManagerRegressionTesting
148-
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.has_s3_related_changes }}
149+
HAS_S3_CHANGES: ${{ needs.check-s3-related-changes.outputs.run_tests }}
149150
steps:
150151
- name: Configure AWS Credentials
151152
uses: aws-actions/configure-aws-credentials@v4
@@ -158,4 +159,4 @@ jobs:
158159
with:
159160
project-name: aws-sdk-java-v2-s3-regression-tests
160161
env-vars-for-codebuild: REGRESSION_TEST,HAS_S3_CHANGES
161-
hide-cloudwatch-logs: true
162+
hide-cloudwatch-logs: true

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/http/pipeline/stages/HttpChecksumStage.java

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,9 @@
4949
import software.amazon.awssdk.core.internal.http.RequestExecutionContext;
5050
import software.amazon.awssdk.core.internal.http.pipeline.MutableRequestToRequestPipeline;
5151
import software.amazon.awssdk.core.internal.io.AwsUnsignedChunkedEncodingInputStream;
52+
import software.amazon.awssdk.core.internal.useragent.BusinessMetricsUtils;
5253
import software.amazon.awssdk.core.internal.util.HttpChecksumUtils;
54+
import software.amazon.awssdk.core.useragent.BusinessMetricCollection;
5355
import software.amazon.awssdk.http.ContentStreamProvider;
5456
import software.amazon.awssdk.http.Header;
5557
import software.amazon.awssdk.http.SdkHttpFullRequest;
@@ -79,11 +81,16 @@ public SdkHttpFullRequest.Builder execute(SdkHttpFullRequest.Builder request, Re
7981

8082
ensurePayloadChecksumStorePresent(context.executionAttributes());
8183

84+
SdkHttpFullRequest.Builder result;
8285
if (sraSigningEnabled(context)) {
83-
return sraChecksum(request, context);
86+
result = sraChecksum(request, context);
87+
} else {
88+
result = legacyChecksum(request, context);
8489
}
8590

86-
return legacyChecksum(request, context);
91+
recordChecksumBusinessMetrics(context.executionAttributes());
92+
93+
return result;
8794
}
8895

8996
private SdkHttpFullRequest.Builder legacyChecksum(SdkHttpFullRequest.Builder request, RequestExecutionContext context) {
@@ -351,6 +358,29 @@ private PayloadChecksumStore getPayloadChecksumStore(ExecutionAttributes executi
351358
return executionAttributes.getAttribute(CHECKSUM_STORE);
352359
}
353360

361+
private void recordChecksumBusinessMetrics(ExecutionAttributes executionAttributes) {
362+
BusinessMetricCollection businessMetrics =
363+
executionAttributes.getAttribute(SdkInternalExecutionAttribute.BUSINESS_METRICS);
364+
365+
if (businessMetrics == null) {
366+
return;
367+
}
368+
369+
BusinessMetricsUtils.resolveRequestChecksumCalculationMetric(
370+
executionAttributes.getAttribute(SdkInternalExecutionAttribute.REQUEST_CHECKSUM_CALCULATION))
371+
.ifPresent(businessMetrics::addMetric);
372+
373+
BusinessMetricsUtils.resolveResponseChecksumValidationMetric(
374+
executionAttributes.getAttribute(SdkInternalExecutionAttribute.RESPONSE_CHECKSUM_VALIDATION))
375+
.ifPresent(businessMetrics::addMetric);
376+
377+
ChecksumSpecs checksumSpecs = executionAttributes.getAttribute(RESOLVED_CHECKSUM_SPECS);
378+
if (checksumSpecs != null && checksumSpecs.algorithmV2() != null) {
379+
BusinessMetricsUtils.resolveChecksumAlgorithmMetric(checksumSpecs.algorithmV2())
380+
.ifPresent(businessMetrics::addMetric);
381+
}
382+
}
383+
354384
static final class ChecksumCalculatingStreamProvider implements ContentStreamProvider {
355385
private final ContentStreamProvider underlyingInputStreamProvider;
356386
private final String checksumHeaderForTrailer;

core/sdk-core/src/main/java/software/amazon/awssdk/core/internal/useragent/BusinessMetricsUtils.java

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717

1818
import java.util.Optional;
1919
import software.amazon.awssdk.annotations.SdkInternalApi;
20+
import software.amazon.awssdk.checksums.DefaultChecksumAlgorithm;
21+
import software.amazon.awssdk.checksums.spi.ChecksumAlgorithm;
22+
import software.amazon.awssdk.core.checksums.RequestChecksumCalculation;
23+
import software.amazon.awssdk.core.checksums.ResponseChecksumValidation;
2024
import software.amazon.awssdk.core.retry.RetryMode;
2125
import software.amazon.awssdk.core.retry.RetryPolicy;
2226
import software.amazon.awssdk.core.useragent.BusinessMetricFeatureId;
@@ -55,4 +59,59 @@ public static Optional<String> resolveRetryMode(RetryPolicy retryPolicy, RetrySt
5559
}
5660
return Optional.empty();
5761
}
62+
63+
public static Optional<String> resolveRequestChecksumCalculationMetric(
64+
RequestChecksumCalculation requestChecksumCalculation) {
65+
if (requestChecksumCalculation == null) {
66+
return Optional.empty();
67+
}
68+
switch (requestChecksumCalculation) {
69+
case WHEN_SUPPORTED:
70+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED.value());
71+
case WHEN_REQUIRED:
72+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED.value());
73+
default:
74+
return Optional.empty();
75+
}
76+
}
77+
78+
public static Optional<String> resolveResponseChecksumValidationMetric(
79+
ResponseChecksumValidation responseChecksumValidation) {
80+
if (responseChecksumValidation == null) {
81+
return Optional.empty();
82+
}
83+
switch (responseChecksumValidation) {
84+
case WHEN_SUPPORTED:
85+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED.value());
86+
case WHEN_REQUIRED:
87+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED.value());
88+
default:
89+
return Optional.empty();
90+
}
91+
}
92+
93+
public static Optional<String> resolveChecksumAlgorithmMetric(ChecksumAlgorithm algorithm) {
94+
if (algorithm == null) {
95+
return Optional.empty();
96+
}
97+
98+
String algorithmId = algorithm.algorithmId();
99+
if (algorithmId.equals(DefaultChecksumAlgorithm.CRC32.algorithmId())) {
100+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_CRC32.value());
101+
}
102+
if (algorithmId.equals(DefaultChecksumAlgorithm.CRC32C.algorithmId())) {
103+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_CRC32C.value());
104+
}
105+
if (algorithmId.equals(DefaultChecksumAlgorithm.CRC64NVME.algorithmId())) {
106+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_CRC64.value());
107+
}
108+
if (algorithmId.equals(DefaultChecksumAlgorithm.SHA1.algorithmId())) {
109+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_SHA1.value());
110+
}
111+
if (algorithmId.equals(DefaultChecksumAlgorithm.SHA256.algorithmId())) {
112+
return Optional.of(BusinessMetricFeatureId.FLEXIBLE_CHECKSUMS_REQ_SHA256.value());
113+
}
114+
return Optional.empty();
115+
}
116+
58117
}

core/sdk-core/src/main/java/software/amazon/awssdk/core/useragent/BusinessMetricFeatureId.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,15 @@ public enum BusinessMetricFeatureId {
4343
ACCOUNT_ID_MODE_REQUIRED("R"),
4444
SIGV4A_SIGNING("S"),
4545
RESOLVED_ACCOUNT_ID("T"),
46+
FLEXIBLE_CHECKSUMS_REQ_CRC32("U"),
47+
FLEXIBLE_CHECKSUMS_REQ_CRC32C("V"),
48+
FLEXIBLE_CHECKSUMS_REQ_CRC64("W"),
49+
FLEXIBLE_CHECKSUMS_REQ_SHA1("X"),
50+
FLEXIBLE_CHECKSUMS_REQ_SHA256("Y"),
51+
FLEXIBLE_CHECKSUMS_REQ_WHEN_SUPPORTED("Z"),
52+
FLEXIBLE_CHECKSUMS_REQ_WHEN_REQUIRED("a"),
53+
FLEXIBLE_CHECKSUMS_RES_WHEN_SUPPORTED("b"),
54+
FLEXIBLE_CHECKSUMS_RES_WHEN_REQUIRED("c"),
4655
DDB_MAPPER("d"),
4756
BEARER_SERVICE_ENV_VARS("3"),
4857
CREDENTIALS_CODE("e"),

0 commit comments

Comments
 (0)