The keycloak project ended with four open questions that design could not
settle. A two-VM lab was built to answer them by measurement, and this is
that material: 26 experiments, 125 raw command outputs, 22 browser captures.
Follows the import procedure in README.md.
source/ the originating repository verbatim — 78 documents, 28 SVGs,
8 manifests, plus .source-revision recording the commit
final/ the SSOT
document.md 729 lines written from the 29 experiment documents, not
concatenated: what was predicted, what was measured, and
where the measurement itself was wrong
evidence/raw 125 outputs, flattened to <experiment>__<file> because
the originals collided (01-baseline.txt appeared three
times) and the audit only globs the top level
evidence/meta one per raw file; command and exitCode are null and the
README says why rather than inventing them
evidence/browser 22 captures
assets/ three diagrams through techviz
.techviz/ their VizSpecs
A separate project rather than an addition to keycloak: the B-layer answers
that project's four questions, but the A, C and D layers are about cluster
failure, SSO and operations, and one document.md should hold one subject.
The four question records there can point here through 관계.
Recorded rather than papered over: only three of the 28 diagrams were
remade. The repository forbids hand-drawn SVG and forbids titles inside the
canvas; all 28 originals carry both, so converting them is redrawing, not
reformatting. They stay in source/ and the gap is written into the document.
verify-pipeline.py passes. audit-records.py reports no issues.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
333 lines
23 KiB
Plaintext
333 lines
23 KiB
Plaintext
Sub-scope 04 (objectstorage) s3/** - provider binding, client policy, async bridges, providers
|
|
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
|
|
generatedAt=2026-08-30T02:46:24+00:00
|
|
|
|
=== OWNED FILES ===
|
|
c736a00af636ce33932ac81fdb639a9f8571f36b s3/S3AsyncClientFactory.java 69
|
|
019d11138e010247723336164a6bb675d39946ed s3/S3AsyncRequestBodyBridge.java 270
|
|
eb4a06038a10ef7ad968a9c65dc3a2933b1b71a7 s3/S3AsyncResponseBodyBridge.java 342
|
|
8921803dceeba2839db95f1a46a38875938cac1b s3/S3CapabilityProbe.java 42
|
|
f1b13054e3a2457d94cb84d9ae4cf6d444d75683 s3/S3ChecksumPolicy.java 43
|
|
84396fadf519bb404fc368b8270705b12e8d4ad4 s3/S3ClientLifecycle.java 59
|
|
329d53f84103c542c1e1f534e7abce2b2e997f10 s3/S3ClientPolicy.java 367
|
|
f7a57a87928e2bec0491664cbf10ae97befce4fe s3/S3ConditionalObjectControlStore.java 279
|
|
a4180450809282b4e95a8fccc104e13d3c203e5c s3/S3ConditionalRequestMapper.java 65
|
|
5d8d35240d5a4a43b607a55fcdbfc27a532a61e8 s3/S3DirectCompletionVerifier.java 74
|
|
9db6d172c12fc5cc7fe4468e2888d697c55a1cbd s3/S3DirectMultipartProvider.java 324
|
|
acad97412bf662866837f3c651fcf093b0d13cf6 s3/S3DirectTransferProvider.java 144
|
|
acd82d10d52a8973daf3d6b913c155fa94f64972 s3/S3ManagedMultipartProvider.java 281
|
|
dc987d674d1a33a28448d231b54dd3f913bcba89 s3/S3ManagedObjectProvider.java 213
|
|
669b7a0781a112505cbc05e3bc49e2d8ea334066 s3/S3ObjectEvidenceMapper.java 82
|
|
4772bcd70265b1292bf81506a9495d0c910b2e48 s3/S3ObjectOperationResolver.java 53
|
|
09eccbeefeb9fa283eb63eafdafbe9b7284217a5 s3/S3ObjectStorageProviderContribution.java 190
|
|
f999696a46d9f76b0ea7e3fa730ea179ddae8021 s3/S3PresignerFactory.java 24
|
|
482bf89618e84d0fe6e7d64a25bab82efe582426 s3/S3ProviderBinding.java 361
|
|
d68446f26ddb6d5e6d8e98061c77c4deb589142c s3/S3ProviderCapabilityConfig.java 41
|
|
54964c9b1f4f8453e09b77eb7dae7d4c31cd59e9 s3/S3ProviderErrorMapper.java 78
|
|
b2ee18c3ee94c4a85cb0a681e21a1a445fd151a2 s3/S3ProviderQualifier.java 58
|
|
00de3d38a968368c363142f23c3e9895671396c3 s3/S3ProviderSettings.java 52
|
|
6ee78a77458349929666c8a744fcc3850d993d5b s3/S3ProviderType.java 26
|
|
6c75433066baaa0b14c4872536ee0de3847bb6cd s3/S3ProviderVersion.java 29
|
|
6fdba8a52a6f2ef514fa4468fc24eae203a86962 s3/S3QualificationEvidence.java 15
|
|
2acf00be0158ab5c1c468f2f0b71a9e8a74fc402 test/s3/S3AsyncClientFactoryTest.java 179
|
|
d389c9af956cd6711556f0851c751dfaf2013c77 test/s3/S3AsyncRequestBodyBridgeTest.java 165
|
|
ae891add40c16119793e61bdc6ea8bcb85a38c77 test/s3/S3AsyncResponseBodyBridgeTest.java 133
|
|
68fa30eb3d9796f69b5b61c06b008fce59adfe5e test/s3/S3ConditionalObjectControlStoreTest.java 172
|
|
d60074a7f815098d2a7e59cb4f31bd1e9680c158 test/s3/S3DirectMultipartProviderTest.java 72
|
|
d4c3d86158b3f46aedff8bcd31c6fabe180426e3 test/s3/S3DirectTransferProviderTest.java 123
|
|
71bd20f2f9c33ff8e8f2f0f06577bae3a532829c test/s3/S3ManagedMultipartProviderTest.java 134
|
|
b18c3224b13b701167cd047b28f1936f17280c69 test/s3/S3ManagedObjectProviderTest.java 255
|
|
405c3e935cf997d8b08746be3922656a18d457ae test/s3/S3ObjectOperationResolverTest.java 151
|
|
23fd021ff93fa5ee59637aa35add37685ed89872 test/s3/S3ProviderBindingTest.java 468
|
|
fa7c910a87c64dec61d3cc8762718ab882ea9e7c test/s3/S3ProviderCompositionTest.java 197
|
|
f63aa1c373c887fef82fbfcad86788ac64e6be46 test/s3/S3ProviderErrorMapperTest.java 63
|
|
a9796529253b2d9b159a17606af1256d42c171b3 test/s3/S3ProviderQualifierTest.java 96
|
|
9fc3ebe5e8b0ba05937577c2d59e71ca82e88834 test/s3/S3SdkApiCharacterizationTest.java 115
|
|
main LOC: 3581 total
|
|
|
|
=== 8.1 reachability: SDK types confined to this package? ===
|
|
$ git grep -rln 'software.amazon.awssdk' -- 'adapter/outbound/objectstorage/src/main' | sed 's|.*/objectstorage/||' | sort | uniq -c
|
|
1 ObjectStorageConfig.java
|
|
1 S3ObjectStorageAdapter.java
|
|
1 config/ObjectStorageCapabilityConfig.java
|
|
1 s3/S3AsyncClientFactory.java
|
|
1 s3/S3AsyncRequestBodyBridge.java
|
|
1 s3/S3AsyncResponseBodyBridge.java
|
|
1 s3/S3ChecksumPolicy.java
|
|
1 s3/S3ClientLifecycle.java
|
|
1 s3/S3ClientPolicy.java
|
|
1 s3/S3ConditionalObjectControlStore.java
|
|
1 s3/S3ConditionalRequestMapper.java
|
|
1 s3/S3DirectCompletionVerifier.java
|
|
1 s3/S3DirectMultipartProvider.java
|
|
1 s3/S3DirectTransferProvider.java
|
|
1 s3/S3ManagedMultipartProvider.java
|
|
1 s3/S3ManagedObjectProvider.java
|
|
1 s3/S3ObjectEvidenceMapper.java
|
|
1 s3/S3ObjectStorageProviderContribution.java
|
|
1 s3/S3PresignerFactory.java
|
|
1 s3/S3ProviderErrorMapper.java
|
|
exit=0
|
|
|
|
$ git grep -rln 'software.amazon.awssdk' -- . | grep -v "^adapter/outbound/objectstorage/" | head
|
|
adapter/inbound/graphql/src/main/java/dev/caskeleton/adapter/inbound/graphql/architecture/GraphQlReturnTypePolicy.java
|
|
adapter/inbound/web/src/testkit/java/dev/caskeleton/adapter/inbound/web/testkit/arch/WebForbiddenTypeCatalog.java
|
|
app-bootstrap/build.gradle
|
|
app-bootstrap/gradle.lockfile
|
|
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/architecture/NotificationArchitectureTest.java
|
|
application-core/src/test/java/dev/caskeleton/application/objectstorage/ObjectStorageArchitectureContractTest.java
|
|
build.gradle
|
|
sample-portfolio/build.gradle
|
|
sample-portfolio/gradle.lockfile
|
|
exit=0
|
|
|
|
=== 8.2 client policy: the retry budget is checked against the parent call budget ===
|
|
$ grep -n 'retryWorstCase' -B 4 -A 6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java
|
|
151- }
|
|
152- if (source.retryBaseDelay.compareTo(source.retryMaximumBackoff) > 0) {
|
|
153- throw invalid("retry base delay exceeds maximum backoff");
|
|
154- }
|
|
155: Duration retryWorstCase =
|
|
156- multiply(source.apiCallAttemptTimeout, source.maximumAttempts)
|
|
157- .plus(multiply(source.retryMaximumBackoff, source.maximumAttempts - 1L));
|
|
158: if (retryWorstCase.compareTo(source.apiCallTimeout) > 0) {
|
|
159- throw invalid("retry attempts and backoff exceed the parent call budget");
|
|
160- }
|
|
161- validateEndpoint(source.endpointOverride);
|
|
162- boolean accessPresent = source.accessKeyId != null && !source.accessKeyId.isBlank();
|
|
163- boolean secretPresent = source.secretAccessKey != null && !source.secretAccessKey.isBlank();
|
|
164- if (accessPresent != secretPresent) {
|
|
exit=0
|
|
|
|
$ grep -n 'transport timeout exceeds the per-attempt timeout\|per-attempt timeout must be shorter' -B 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java
|
|
130- requirePositive("retryBaseDelay", source.retryBaseDelay);
|
|
131- requirePositive("retryMaximumBackoff", source.retryMaximumBackoff);
|
|
132- requirePositive("shutdownGrace", source.shutdownGrace);
|
|
133- if (source.apiCallAttemptTimeout.compareTo(source.apiCallTimeout) >= 0) {
|
|
134: throw invalid("per-attempt timeout must be shorter than the parent call timeout");
|
|
--
|
|
140- source.connectionAcquireTimeout,
|
|
141- source.readTimeout,
|
|
142- source.writeTimeout)) {
|
|
143- if (transport.compareTo(source.apiCallAttemptTimeout) > 0) {
|
|
144: throw invalid("transport timeout exceeds the per-attempt timeout");
|
|
exit=0
|
|
|
|
$ grep -n 'plaintext AWS endpoint is forbidden' -B 6 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java
|
|
190- || endpoint.getQuery() != null
|
|
191- || endpoint.getFragment() != null) {
|
|
192- throw invalid("endpoint override is not canonical");
|
|
193- }
|
|
194- if ("http".equalsIgnoreCase(scheme)
|
|
195- && (host.equals("amazonaws.com") || host.endsWith(".amazonaws.com"))) {
|
|
196: throw invalid("plaintext AWS endpoint is forbidden");
|
|
exit=0
|
|
|
|
$ grep -n 'credentials=' -A 2 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ClientPolicy.java
|
|
225: + ", credentials="
|
|
226- + (source.accessKeyId == null ? "default-chain" : "[REDACTED]")
|
|
227- + "]";
|
|
exit=0
|
|
|
|
=== 8.2b provider binding: per-provider-type identity rules ===
|
|
$ grep -n 'AWS expected owner must be an exact 12-digit\|MinIO binding cannot claim\|AWS endpoint override is not part\|MinIO endpoint is required\|MinIO requires explicit environment credential' -B 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java
|
|
229- requireToken("deploymentIdentity", settings.deploymentIdentity(), 256);
|
|
230- if (type == S3ProviderType.AWS_S3_GENERAL_PURPOSE) {
|
|
231- if (settings.expectedOwner() == null || !settings.expectedOwner().matches("[0-9]{12}")) {
|
|
232: throw invalid("AWS expected owner must be an exact 12-digit account ID");
|
|
233- }
|
|
234- } else if (settings.expectedOwner() != null && !settings.expectedOwner().isBlank()) {
|
|
235: throw invalid("MinIO binding cannot claim an AWS expected owner");
|
|
--
|
|
238-
|
|
239- private static void validateEndpoint(S3ProviderType type, URI endpoint) {
|
|
240- if (type == S3ProviderType.AWS_S3_GENERAL_PURPOSE && endpoint != null) {
|
|
241: throw invalid("AWS endpoint override is not part of the qualified profile");
|
|
242- }
|
|
243- if (type == S3ProviderType.MINIO_COMMUNITY_2024_01_16 && endpoint == null) {
|
|
244: throw invalid("MinIO endpoint is required");
|
|
--
|
|
279- throw invalid("default-chain credentials cannot include static references");
|
|
280- }
|
|
281- if (type != S3ProviderType.AWS_S3_GENERAL_PURPOSE) {
|
|
282: throw invalid("MinIO requires explicit environment credential references");
|
|
exit=0
|
|
|
|
$ grep -n 'runtime provisioning and public ACLs are forbidden' -B 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderBinding.java
|
|
265- }
|
|
266-
|
|
267- private static void validateProvisioning(S3ProviderSettings settings) {
|
|
268- if (settings.autoCreateBucket() || settings.publicAcl()) {
|
|
269: throw invalid("runtime provisioning and public ACLs are forbidden");
|
|
exit=0
|
|
|
|
=== 8.2c mutation uncertainty is preserved ===
|
|
$ grep -n 'if (mutation)' -B 4 -A 4 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java
|
|
17- Objects.requireNonNull(failure, "failure must be non-null");
|
|
18- if (failure instanceof AwsServiceException service) {
|
|
19- return mapService(service, mutation);
|
|
20- }
|
|
21: if (mutation) {
|
|
22- return new Mapping(Failure.INDETERMINATE, false, "S3 mutation outcome is indeterminate");
|
|
23- }
|
|
24- Throwable cause = failure.getCause();
|
|
25- if (cause instanceof SocketTimeoutException
|
|
exit=0
|
|
|
|
$ grep -n 'authoritative' -B 2 -A 2 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java | head -20
|
|
52- default -> mapStatus(status, mutation);
|
|
53- };
|
|
54: boolean authoritative = normalized != Failure.INDETERMINATE;
|
|
55: return new Mapping(normalized, authoritative, "S3 request failed: " + normalized.name());
|
|
56- }
|
|
57-
|
|
--
|
|
68- }
|
|
69-
|
|
70: /** Provider-neutral classification plus whether the observation is authoritative. */
|
|
71: public record Mapping(Failure failure, boolean authoritative, String safeMessage) {
|
|
72-
|
|
73- public Mapping {
|
|
exit=0
|
|
|
|
$ grep -n 'Failure.INDETERMINATE' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/*.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:114: if (exception.failure() == ObjectStorageProviderException.Failure.INDETERMINATE) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:131: ObjectStorageProviderException.Failure.INDETERMINATE,
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3DirectMultipartProvider.java:142: ObjectStorageProviderException.Failure.INDETERMINATE,
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ManagedMultipartProvider.java:121: ObjectStorageProviderException.Failure.INDETERMINATE,
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java:22: return new Mapping(Failure.INDETERMINATE, false, "S3 mutation outcome is indeterminate");
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java:54: boolean authoritative = normalized != Failure.INDETERMINATE;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ProviderErrorMapper.java:66: default -> mutation ? Failure.INDETERMINATE : Failure.UNKNOWN;
|
|
exit=0
|
|
|
|
=== 8.3 evidence: logical digest kept distinct from provider checksum ===
|
|
$ grep -n 'LOGICAL_SHA_256_METADATA\|requireMatchingEvidence' -A 10 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ChecksumPolicy.java | head -26
|
|
12: public static final String LOGICAL_SHA_256_METADATA = "ca-logical-sha256";
|
|
13-
|
|
14- private S3ChecksumPolicy() {}
|
|
15-
|
|
16- public static ChecksumAlgorithm requireSha256(ObjectContentIdentity identity) {
|
|
17- Objects.requireNonNull(identity, "identity must be non-null");
|
|
18- if (identity.fullDigest().algorithm() != ObjectDigestAlgorithm.SHA_256) {
|
|
19- throw new IllegalArgumentException("managed S3 profile requires logical SHA-256");
|
|
20- }
|
|
21- return ChecksumAlgorithm.SHA256;
|
|
22- }
|
|
--
|
|
26: return Map.of(LOGICAL_SHA_256_METADATA, identity.fullDigest().base64Value());
|
|
27- }
|
|
28-
|
|
29: public static void requireMatchingEvidence(
|
|
30- ObjectContentIdentity expected, String providerChecksum, Map<String, String> metadata) {
|
|
31- requireSha256(expected);
|
|
32: String logical = metadata == null ? null : metadata.get(LOGICAL_SHA_256_METADATA);
|
|
33- if (!expected.fullDigest().base64Value().equals(logical)
|
|
34- || (providerChecksum != null
|
|
35- && !expected.fullDigest().base64Value().equals(providerChecksum))) {
|
|
36- throw new dev.caskeleton.adapter.outbound.objectstorage.provider
|
|
37- .ObjectStorageProviderException(
|
|
38- dev.caskeleton.adapter.outbound.objectstorage.provider.ObjectStorageProviderException
|
|
39- .Failure.CONTENT_MISMATCH,
|
|
exit=0
|
|
|
|
$ grep -n 'ServerSideEncryption.AES256\|ETag evidence is absent' -B 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ObjectEvidenceMapper.java
|
|
41- }
|
|
42- S3ChecksumPolicy.requireMatchingEvidence(
|
|
43- identity, response.checksumSHA256(), response.metadata());
|
|
44: if (response.serverSideEncryption() != ServerSideEncryption.AES256) {
|
|
45- throw corrupt("S3 HEAD encryption evidence does not match the managed profile");
|
|
46- }
|
|
47- if (response.eTag() == null || response.eTag().isBlank()) {
|
|
48: throw corrupt("S3 HEAD ETag evidence is absent");
|
|
exit=0
|
|
|
|
=== 8.3b async bridges: single subscription, bounded buffer, backpressure ===
|
|
$ grep -n 'subscribed.compareAndSet(false, true)\|prepared.compareAndSet(false, true)' -B 3 adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java-57- @Override
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java-58- public void subscribe(Subscriber<? super ByteBuffer> subscriber) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java-59- Objects.requireNonNull(subscriber, "subscriber must be non-null");
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:60: if (!subscribed.compareAndSet(false, true)) {
|
|
--
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java-54-
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java-55- @Override
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java-56- public CompletableFuture<R> prepare() {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncResponseBodyBridge.java:57: if (!prepared.compareAndSet(false, true)) {
|
|
exit=0
|
|
|
|
$ grep -n 'maximumBufferedBytesObserved\|S3 producer exceeded its exact bound\|MAXIMUM_CONTROL_BYTES' adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:38: private final AtomicInteger maximumBufferedBytesObserved = new AtomicInteger();
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:75: public int maximumBufferedBytesObserved() {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:76: return maximumBufferedBytesObserved.get();
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:135: throw new ObjectChunkWriteException("S3 producer exceeded its exact bound");
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3AsyncRequestBodyBridge.java:139: maximumBufferedBytesObserved.accumulateAndGet(copy.length, Math::max);
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:32: private static final int MAXIMUM_CONTROL_BYTES = 64 * 1024;
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:82: if (encoded.length > MAXIMUM_CONTROL_BYTES) {
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:213: || response.contentLength() > MAXIMUM_CONTROL_BYTES
|
|
adapter/outbound/objectstorage/src/main/java/dev/caskeleton/adapter/outbound/objectstorage/s3/S3ConditionalObjectControlStore.java:239: if (next > MAXIMUM_CONTROL_BYTES) {
|
|
exit=0
|
|
|
|
=== 8.4 test coverage ===
|
|
$ grep -nE '@Test| void ' adapter/outbound/objectstorage/src/test/java/dev/caskeleton/adapter/outbound/objectstorage/s3/*.java | sed 's|.*/s3/||' | head -60
|
|
S3AsyncClientFactoryTest.java:21: @Test
|
|
S3AsyncClientFactoryTest.java:22: void buildsExplicitNettyAsyncClientWithoutCrtAndOwnsCloseOrder() {
|
|
S3AsyncClientFactoryTest.java:42: @Test
|
|
S3AsyncClientFactoryTest.java:43: void assemblesRetriesV2WithExactAttemptsAndSeparateHalfJitterPaths() throws Exception {
|
|
S3AsyncClientFactoryTest.java:66: @Test
|
|
S3AsyncClientFactoryTest.java:67: void rejectsMissingNonPositiveAndContradictoryTimeoutPoolAndRetryPolicy() {
|
|
S3AsyncClientFactoryTest.java:114: @Test
|
|
S3AsyncClientFactoryTest.java:115: void rejectsUnsafeEndpointAndPartialStaticCredentialsWithoutExposingSecrets() {
|
|
S3AsyncRequestBodyBridgeTest.java:24: @Test
|
|
S3AsyncRequestBodyBridgeTest.java:25: void streamsOnceOffTheSubscriberThreadWithOneChunkOfProducerLead() throws Exception {
|
|
S3AsyncRequestBodyBridgeTest.java:65: @Test
|
|
S3AsyncRequestBodyBridgeTest.java:66: void cancellationAndDigestMismatchFailWithoutProducerReplay() throws Exception {
|
|
S3AsyncResponseBodyBridgeTest.java:23: @Test
|
|
S3AsyncResponseBodyBridgeTest.java:24: void deliversAnExactBoundedBodyOnTheWorkerAndInvalidatesTheSource() throws Exception {
|
|
S3AsyncResponseBodyBridgeTest.java:90: @Test
|
|
S3AsyncResponseBodyBridgeTest.java:91: void truncatedAndOversizedSdkChunksFailClosed() throws Exception {
|
|
S3ConditionalObjectControlStoreTest.java:50: @Test
|
|
S3ConditionalObjectControlStoreTest.java:51: void createAndCasUseExactConditionalHeadersAndPrivateEtags() {
|
|
S3ConditionalObjectControlStoreTest.java:79: @Test
|
|
S3ConditionalObjectControlStoreTest.java:80: void droppedCreateResponseResolvesByExactGetAndDigestComparison() {
|
|
S3ConditionalObjectControlStoreTest.java:97: @Test
|
|
S3ConditionalObjectControlStoreTest.java:98: void staleWriterConflictAndCorruptControlNeverBecomeAbsence() {
|
|
S3ConditionalObjectControlStoreTest.java:121: @Test
|
|
S3ConditionalObjectControlStoreTest.java:122: void exact404IsTheOnlyAbsentRead() {
|
|
S3DirectMultipartProviderTest.java:26: @Test
|
|
S3DirectMultipartProviderTest.java:27: void presignsOneExactPartWithoutReturningTheProviderUploadIdentity() throws Exception {
|
|
S3DirectTransferProviderTest.java:43: @Test
|
|
S3DirectTransferProviderTest.java:44: void signsExactChecksumMediaEncryptionLengthAndCreateOnlyPutAndVerifiesWithHead()
|
|
S3ManagedMultipartProviderTest.java:40: @Test
|
|
S3ManagedMultipartProviderTest.java:41: void mapsCreatePartAndCreateOnlyCompletionToLowLevelSdkCalls() {
|
|
S3ManagedObjectProviderTest.java:49: @Test
|
|
S3ManagedObjectProviderTest.java:50: void mapsImmutablePutAndExactHeadWithoutExposingProviderEvidence() {
|
|
S3ManagedObjectProviderTest.java:100: @Test
|
|
S3ManagedObjectProviderTest.java:101: void exactFullAndRangeReadsUseHeadEvidenceAndConditionalGet() {
|
|
S3ManagedObjectProviderTest.java:180: @Test
|
|
S3ManagedObjectProviderTest.java:181: void absentHeadIsOptionalEmpty() {
|
|
S3ObjectOperationResolverTest.java:24: @Test
|
|
S3ObjectOperationResolverTest.java:25: void resolvesDataCreateFromExactHeadEvidenceWithoutReplayingAProducer() {
|
|
S3ObjectOperationResolverTest.java:50: @Test
|
|
S3ObjectOperationResolverTest.java:51: void resolvesControlMutationOnlyFromExactRecordEvidence() {
|
|
S3ProviderBindingTest.java:26: @Test
|
|
S3ProviderBindingTest.java:27: void acceptsOnlyTheTwoFrozenProviderIdentitiesAndTheirExactVersions() {
|
|
S3ProviderBindingTest.java:67: @Test
|
|
S3ProviderBindingTest.java:68: void rejectsUnsafeOrIncompleteProviderBindingsBeforeResourceConstruction() {
|
|
S3ProviderBindingTest.java:166: @Test
|
|
S3ProviderBindingTest.java:167: void exactNamedProfileRequiresCurrentSupportedEvidence() {
|
|
S3ProviderCompositionTest.java:31: @Test
|
|
S3ProviderCompositionTest.java:32: void disabledUnselectedAndInvalidBindingsConstructNoS3Resource() {
|
|
S3ProviderCompositionTest.java:58: @Test
|
|
S3ProviderCompositionTest.java:59: void selectedExactBindingConstructsAndClosesOneOwnedClientExactlyOnce() {
|
|
S3ProviderCompositionTest.java:80: @Test
|
|
S3ProviderCompositionTest.java:81: void selectedDirectProfileConstructsAndClosesOneOwnedPresigner() {
|
|
S3ProviderErrorMapperTest.java:16: @Test
|
|
S3ProviderErrorMapperTest.java:17: void mapsStableS3FailuresWithoutLeakingProviderDetails() {
|
|
S3ProviderErrorMapperTest.java:29: @Test
|
|
S3ProviderErrorMapperTest.java:30: void finalMutationTransportFailureIsIndeterminateRatherThanAuthoritativeFailure() {
|
|
S3ProviderQualifierTest.java:18: @Test
|
|
S3ProviderQualifierTest.java:19: void staticCiEvidenceIsValidatedWithoutRunningAProbe() {
|
|
S3ProviderQualifierTest.java:41: @Test
|
|
S3ProviderQualifierTest.java:42: void startupProbeIsConfinedToAReservedPrefixAndSafeActions() {
|
|
exit=0
|
|
|