Files
document-haness/docs/clean-architecture-backend-template/final/evidence/raw/145-fileserver-local-io-probes.txt
T
DongHyeonkaandClaude Opus 5 b2963105a8 docs(keycloak-session-store): import the session-storage lab as a new project
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>
2026-09-04 22:51:59 +09:00

393 lines
48 KiB
Plaintext

Sub-scope 04 (fileserver) platform/local - IO primitive / gateway / store+publisher
revision=a24ece9cf797f7ea647e33bf846b115208ed1ba5
generatedAt=2026-08-30T01:22:06+00:00
=== OWNED FILES ===
3c03d0e4158da54e8105d03c2233662139b0bd2e platform/local/LocalStorageLayout.java 29
ade8a995be43b400974148f20e103cd347ec3bef platform/local/PhysicalPathResolver.java 26
ef697d8d353ad83cd8cdf2bf0af833d98a06065b platform/local/DefaultPhysicalPathResolver.java 134
de4a170b7c7d44bc69302b958c161145ce8ad6aa platform/local/SecureDirectoryWalk.java 172
eb5594e2bdce47fc01e720c811faae93ab222530 platform/local/SafeFileChannelFactory.java 288
35b5e29b631cdd50ff4618983f669bcde1f16447 platform/local/BoundedFileChannel.java 52
d60c3a5db41a27b3612bb8514146e4edc4416ab3 platform/local/StreamingDigest.java 62
675e5f0e0b22e3280e5037ba6a65be35de84b599 platform/local/TransferBufferPool.java 59
05639c1c99be3986dcb1978e480052b1b589a178 platform/local/LocalAppendEngine.java 260
c03b3c4a65a834b55969a74c73c84100ac315fb2 platform/local/LocalUploadContentGateway.java 118
16b82d1689bdd819dd655e20f699d363cbe8b4af platform/local/LocalUploadStorageGateway.java 62
61e4a361fd57accc87355befde54e4d8a8f8c8c8 platform/local/LocalDownloadContentGateway.java 26
d61ca3342028694c233131a16510ca597ec0eb75 platform/local/LocalZeroCopyDownloadGateway.java 42
d5c5b8d0e1f3890e92416f4adb13b9c691e58e06 platform/local/LocalCopyContentGateway.java 102
64a3456555dae206bd5fdac3d5adf22aa17db6e7 platform/local/LocalCleanupContentGateway.java 33
7d4466f3071626cf4e19cf3167b701055943a89b platform/local/LocalUploadHandle.java 75
28ea844dd9209f303ac2782070c700e1a0c45eec platform/local/LocalBlockingContentStore.java 400
38924d53eec31163de73d6b98a8da8351c94f538 platform/local/ContentPublisher.java 17
e878aab9a89c2dc268cad36ae4b0f440ce2ebb79 platform/local/AtomicMoveContentPublisher.java 124
b5e407f37420a3d861cc7d612a7375e95102ed3d platform/local/MetadataPointerContentPublisher.java 115
d9c8790ab5f0beb9c206e01610aebc3f219b44f9 platform/local/ContentPublishVerification.java 133
7a4b14c2820ac250818c2e43544cd71253fa3e06 platform/local/PublishResult.java 21
b01552ee5658797faef668bc322b9776681e1587 test/ContentPublisherTest.java 208
8a9a8ad2799700f69ef9e428d0dafd928b0f89cf test/LocalAppendEngineTest.java 245
72c3b9920e105683e58df82a0e7f717eceb548f9 test/LocalAppendMemoryTest.java 92
42fd4735920e8b8ce26f48dc3d5a7eb634dcf12f test/LocalCreateUploadTest.java 157
db9c350bf983107f17fd62234222445fb78b60be test/LocalCreateUploadConcurrencyTest.java 72
7e1fbf711532bbe13dc69c9f3707a329b5ef2ab4 test/LocalStorageGatewayContractTest.java 269
2696bca685bf8a49c4bb37839dded0c19c0c877f test/PhysicalPathResolverTest.java 112
00fcdd6fd3c8e7464b19dfcf119f762be22b8cb9 test/LocalContentStoreFixture.java 82
=== 8.1 reachability: which platform/local types are public? ===
$ grep -l 'public final class\|public interface\|public record' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/*.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AmbiguousFilesystemOperationDetector.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCleanupContentGateway.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCopyContentGateway.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalDownloadContentGateway.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalReconciliationContentProbe.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageProbeResult.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageProperties.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageUsageProbe.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalUploadContentGateway.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalUploadStorageGateway.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalZeroCopyDownloadGateway.java
exit=0
$ git grep -rln 'platform.local' -- . | grep -v "^adapter/outbound/fileserver/"
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverServiceConfiguration.java
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupCheck.java
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupConfiguration.java
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidator.java
app-bootstrap/src/main/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStorageConfiguration.java
app-bootstrap/src/test/java/dev/caskeleton/bootstrap/autoconfigure/fileserver/FileserverStartupValidatorTest.java
exit=0
=== 8.2 the module's own rule: descriptor-relative access, and where pathnames survive ===
--- descriptor-relative usage per file
$ grep -c 'SecureDirectoryWalk\|channels\.' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java:20
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java:5
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:5
exit=0
--- every remaining java.nio.file.Files.* call in platform/local
$ grep -n 'Files\.' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/*.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:53: Files.move(staging, target, StandardCopyOption.ATOMIC_MOVE);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:113: boolean stagingGone = !Files.exists(staging, LinkOption.NOFOLLOW_LINKS);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:114: boolean targetPresent = Files.exists(target, LinkOption.NOFOLLOW_LINKS);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublishVerification.java:53: return Files.size(target);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublishVerification.java:114: if (!Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java:124: * <p>{@code Files.size} would re-resolve the whole pathname, which is precisely the lookup a
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:73: if (!Files.isDirectory(contentRoot, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:81: try (Stream<Path> tree = Files.walk(contentRoot, MAXIMUM_WALK_DEPTH)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:111: if (!Files.isRegularFile(object, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:121: size = Files.size(object);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:122: modifiedAt = Files.getLastModifiedTime(object, LinkOption.NOFOLLOW_LINKS).toInstant();
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:135: Files.createDirectories(quarantined.getParent());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:136: Files.move(object, quarantined, StandardCopyOption.ATOMIC_MOVE);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:146: Files.move(quarantined, object, StandardCopyOption.ATOMIC_MOVE);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:163: if (!Files.isRegularFile(quarantined, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:167: return Files.deleteIfExists(quarantined);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:174: if (!Files.isRegularFile(candidate, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:184: size = Files.size(candidate);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalOrphanScanAdapter.java:185: modifiedAt = Files.getLastModifiedTime(candidate, LinkOption.NOFOLLOW_LINKS).toInstant();
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:56: Files.createDirectories(probeDirectory);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:119: Files.delete(candidate);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:166: Files.createDirectories(resolver.stagingRoot());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:167: Files.createDirectories(resolver.contentRoot());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:168: Files.createDirectories(resolver.quarantineRoot());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:169: Object staging = Files.getFileStore(resolver.stagingRoot());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:170: Object content = Files.getFileStore(resolver.contentRoot());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:171: Object quarantine = Files.getFileStore(resolver.quarantineRoot());
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:187: Files.write(source, new byte[] {1, 2, 3});
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:188: Files.move(source, target, StandardCopyOption.ATOMIC_MOVE);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:189: return Files.exists(target, LinkOption.NOFOLLOW_LINKS);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:206: Files.write(source, new byte[] {1});
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:207: Files.write(target, new byte[] {2});
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:208: Files.move(source, target, StandardCopyOption.REPLACE_EXISTING);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:224: Files.write(target, new byte[] {7});
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:225: Files.createSymbolicLink(link, target);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:248: Files.write(candidate, new byte[] {9});
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:250: Files.delete(candidate);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:263: return Files.getFileStore(properties.root()).getUsableSpace() >= 0;
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:273: String type = Files.getFileStore(properties.root()).type();
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:284: Files.deleteIfExists(path);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:292: if (!Files.isDirectory(directory, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageCapabilityProbe.java:295: try (Stream<Path> entries = Files.walk(directory)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java:46: FileStore fileStore = Files.getFileStore(root);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageHealthAdapter.java:56: Files.isWritable(root),
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageUsageProbe.java:35: FileStore store = Files.getFileStore(root);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/MetadataPointerContentPublisher.java:107: Files.deleteIfExists(staging);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/MetadataPointerContentPublisher.java:110: if (Files.exists(staging, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:143: if (parent == null || Files.isDirectory(parent, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:147: Files.createDirectories(parent);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:167: if (Files.isSymbolicLink(current)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:172: if (Files.isSymbolicLink(current)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java:224: Files.setPosixFilePermissions(current, OWNER_ONLY_DIRECTORY);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:129: if (!Files.isDirectory(root, LinkOption.NOFOLLOW_LINKS)) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:134: DirectoryStream<Path> stream = Files.newDirectoryStream(root);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:146: try (DirectoryStream<Path> stream = Files.newDirectoryStream(directory)) {
exit=0
=== 8.2b the publish rename: pathname move guarded by the precheck the module calls insufficient ===
$ grep -n 'requireNoSymlinkBetween' -B 3 -A 3 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java
47- ContentKey contentKey = resolver.newContentKey();
48- Path target = resolver.contentPath(contentKey);
49- channels.createParentDirectories(root, target);
50: channels.requireNoSymlinkBetween(root, target.getParent());
51-
52- try {
53- Files.move(staging, target, StandardCopyOption.ATOMIC_MOVE);
exit=0
$ grep -n 'Retained for the capability probe' -A 6 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java
155: * Retained for the capability probe, which still reasons about pathnames.
156- *
157- * <p>Production access no longer relies on it: descending descriptor by descriptor with {@code
158- * NOFOLLOW_LINKS} refuses a symlinked component by construction, which a precheck could only ever
159- * approximate.
160- */
161- void requireNoSymlinkBetween(Path root, Path leaf) {
exit=0
$ grep -n 'could only ever approximate\|More checks only narrow the window' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SafeFileChannelFactory.java adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/SecureDirectoryWalk.java:20: * directories. More checks only narrow the window; they never close it.
exit=0
=== 8.2c the same question answered two ways: file length ===
$ grep -n 'Files.size' -B 4 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublishVerification.java
49- }
50-
51- long sizeOf(Path target) {
52- try {
53: return Files.size(target);
exit=0
$ grep -n 'private long currentLength' -B 8 -A 4 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendEngine.java
121- /**
122- * Length read through the staging file's parent descriptor.
123- *
124- * <p>{@code Files.size} would re-resolve the whole pathname, which is precisely the lookup a
125- * replaced shard directory redirects: an attacker who swaps the parent for a symlink gets this
126- * check to report the size of their own file, and the offset comparison that follows is then
127- * being made about a different object than the one the append will open.
128- */
129: private long currentLength(Path root, Path staging) {
130- return channels.readAttributes(root, staging).size();
131- }
132-
133- /**
exit=0
=== 8.3 duplicate mechanism: two publishers, one selection point ===
$ grep -n 'selectPublisher' -A 18 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java | head -24
63: this.publisher = selectPublisher(properties, probeResult, verification);
64- this.capabilities = probeResult.toCapabilities(true);
65- }
66-
67- /**
68- * Chooses the publish strategy from the probe result.
69- *
70- * <p>{@code ATOMIC_MOVE_REQUIRED} fails closed when the probe could not demonstrate an atomic
71- * move; {@code ATOMIC_MOVE_PREFERRED} degrades to a metadata pointer publish instead.
72- */
73: private ContentPublisher selectPublisher(
74- LocalStorageProperties properties,
75- LocalStorageProbeResult probeResult,
76- ContentPublishVerification verification) {
77- Path root = properties.root();
78- boolean atomicProven = probeResult.atomicMove();
79- return switch (properties.publishMode()) {
80- case ATOMIC_MOVE_REQUIRED -> {
81- if (!atomicProven) {
82- throw new AtomicPublishUnsupportedException(
83- "publish mode requires an atomic move that the storage probe could not prove",
84- FileserverFailureContext.of(FileserverErrorCode.ATOMIC_PUBLISH_UNSUPPORTED, false));
85- }
86- yield new AtomicMoveContentPublisher(root, resolver, channels, verification);
exit=0
$ grep -n 'usesAtomicMove' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/*.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/AtomicMoveContentPublisher.java:101: public boolean usesAtomicMove() {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisher.java:16: boolean usesAtomicMove();
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java:379: return publisher.usesAtomicMove();
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalBlockingContentStore.java:384: if (publisher.usesAtomicMove()) {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/MetadataPointerContentPublisher.java:69: public boolean usesAtomicMove() {
exit=0
=== 8.4 doc/behaviour: bounded memory claim and its regression test ===
$ grep -n 'maxBorrowedBytes' adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:20: private final AtomicLong maxBorrowedBytes = new AtomicLong();
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:38: maxBorrowedBytes.accumulateAndGet(outstanding, Math::max);
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:56: long maxBorrowedBytes() {
adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java:57: return maxBorrowedBytes.get();
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:54: assertThat(bufferPool.maxBorrowedBytes()).isLessThanOrEqualTo(BUFFER_BYTES);
exit=0
$ grep -nE '@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java | head -30
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:31: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:32: void maxObservedBufferDoesNotGrowWithPayload() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:20: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:21: void generatedContentPathAlwaysStaysBelowContentRoot() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:30: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:31: void stagingPathIsShardedFromTheUploadIdentityOnly() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:43: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:44: void quarantinePathMirrorsTheContentLayoutInASeparateArea() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:67: void rejectsEveryKeyThatIsNotTheServerGeneratedShardedShape(String candidate) {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:75: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:76: void newContentKeyIsShardedUniqueAndResolvable() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:87: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:88: void aRelativeStorageRootIsRejectedOutright() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:93: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:94: void everyAreaRootStaysBelowTheConfiguredRoot() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:103: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:104: void resolutionNeverDependsOnAClientFilename() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:32: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:33: void atomicPublisherMovesStagingToCreateOnlyTarget() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:48: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:49: void pointerPublisherKeepsImmutableObjectAndReturnsNewContentKey() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:64: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:65: void bothStrategiesRecordTheProvenSizeAndDigest() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:80: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:81: void aDigestMismatchNeverPublishesAnything() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:94: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:95: void aLengthMismatchNeverPublishesAnything() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:107: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:108: void requiredAtomicModeFailsClosedWhenTheProbeCouldNotProveIt() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:119: @Test
exit=0
$ grep -nE '@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java | head -30
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java:28: void exactlyOneConcurrentCreateWinsForSameUploadId() throws Exception {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:47: void setUp() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:56: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:57: void anUploadIsStagedAppendedAndReadBackThroughTheGateways() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:67: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:68: void aStagingLengthOfAMissingObjectReadsAsZeroRatherThanFailing() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:76: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:77: void aStagedDigestIsRefusedWhenTheOffsetDisagreesWithTheBytesOnDisk() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:86: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:87: void aPublishedObjectIsReadableThroughTheDownloadGateway() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:96: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:97: void aRangedReadIsBoundedToTheRequestedRegion() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:106: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:107: void aCopyProducesAnIndependentObjectWithTheSameBytes() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:121: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:122: void deletingTheCopyLeavesTheSourceIntact() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:133: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:134: void aDeleteWhoseSizePreconditionDisagreesIsRefused() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:143: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:144: void deletingAnAbsentObjectIsIdempotentRatherThanAFailure() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:152: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:153: void aDirectTransferWritesExactlyTheRequestedRegion() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:165: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:166: void aDirectTransferDeclinesForAnObjectThatIsNotThereRatherThanThrowing() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:188: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:189: void aSinkThatStopsPartWayReportsAPartialTransferRatherThanADecline() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:230: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:231: void aStagingCleanupRemovesTheBytesTheUploadOwned() {
exit=0
=== 8.4b maxBorrowedBytes: the javadoc names a regression test; who reads it? ===
$ grep -n 'the bounded-memory regression asserts on this' -A 3 adapter/outbound/fileserver/src/main/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/TransferBufferPool.java
55: /** Peak simultaneously-borrowed bytes; the bounded-memory regression asserts on this. */
56- long maxBorrowedBytes() {
57- return maxBorrowedBytes.get();
58- }
exit=0
$ git grep -rn 'maxBorrowedBytes' -- 'adapter/outbound/fileserver/src' | grep -v 'TransferBufferPool.java'
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java:54: assertThat(bufferPool.maxBorrowedBytes()).isLessThanOrEqualTo(BUFFER_BYTES);
exit=0
$ grep -nE '@Test| void |assertThat' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalAppendMemoryTest.java | head -20
3:import static org.assertj.core.api.Assertions.assertThat;
31: @Test
32: void maxObservedBufferDoesNotGrowWithPayload() throws IOException {
53: assertThat(result.committedOffset()).isEqualTo(PAYLOAD_BYTES);
54: assertThat(bufferPool.maxBorrowedBytes()).isLessThanOrEqualTo(BUFFER_BYTES);
55: assertThat(Files.size(staging)).isEqualTo(PAYLOAD_BYTES);
exit=0
$ git grep -rn 'LargeFileBoundedMemory' -- 'adapter/outbound/fileserver/src' | head -4
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java:34:class LargeFileBoundedMemoryTest {
exit=0
$ grep -nE '@Test| void |assertThat.*[Mm]emory|Runtime.getRuntime' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/testkit/LargeFileBoundedMemoryTest.java | head -20
43: @Test
44: void uploadingALargeObjectNeverRequestsMoreThanOneBufferAtATime() {
71: @Test
72: void readingALargeObjectIsAlsoBounded() throws Exception {
exit=0
=== 8.4c what LocalCreateUploadConcurrencyTest and the gateway contract cover ===
$ grep -nE '@Test| void ' adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalCreateUploadConcurrencyTest.java:28: void exactlyOneConcurrentCreateWinsForSameUploadId() throws Exception {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:47: void setUp() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:56: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:57: void anUploadIsStagedAppendedAndReadBackThroughTheGateways() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:67: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:68: void aStagingLengthOfAMissingObjectReadsAsZeroRatherThanFailing() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:76: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:77: void aStagedDigestIsRefusedWhenTheOffsetDisagreesWithTheBytesOnDisk() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:86: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:87: void aPublishedObjectIsReadableThroughTheDownloadGateway() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:96: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:97: void aRangedReadIsBoundedToTheRequestedRegion() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:106: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:107: void aCopyProducesAnIndependentObjectWithTheSameBytes() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:121: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:122: void deletingTheCopyLeavesTheSourceIntact() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:133: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:134: void aDeleteWhoseSizePreconditionDisagreesIsRefused() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:143: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:144: void deletingAnAbsentObjectIsIdempotentRatherThanAFailure() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:152: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:153: void aDirectTransferWritesExactlyTheRequestedRegion() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:165: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:166: void aDirectTransferDeclinesForAnObjectThatIsNotThereRatherThanThrowing() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:188: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:189: void aSinkThatStopsPartWayReportsAPartialTransferRatherThanADecline() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:230: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/LocalStorageGatewayContractTest.java:231: void aStagingCleanupRemovesTheBytesTheUploadOwned() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:20: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:21: void generatedContentPathAlwaysStaysBelowContentRoot() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:30: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:31: void stagingPathIsShardedFromTheUploadIdentityOnly() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:43: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:44: void quarantinePathMirrorsTheContentLayoutInASeparateArea() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:67: void rejectsEveryKeyThatIsNotTheServerGeneratedShardedShape(String candidate) {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:75: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:76: void newContentKeyIsShardedUniqueAndResolvable() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:87: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:88: void aRelativeStorageRootIsRejectedOutright() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:93: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:94: void everyAreaRootStaysBelowTheConfiguredRoot() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:103: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/PhysicalPathResolverTest.java:104: void resolutionNeverDependsOnAClientFilename() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:32: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:33: void atomicPublisherMovesStagingToCreateOnlyTarget() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:48: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:49: void pointerPublisherKeepsImmutableObjectAndReturnsNewContentKey() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:64: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:65: void bothStrategiesRecordTheProvenSizeAndDigest() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:80: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:81: void aDigestMismatchNeverPublishesAnything() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:94: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:95: void aLengthMismatchNeverPublishesAnything() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:107: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:108: void requiredAtomicModeFailsClosedWhenTheProbeCouldNotProveIt() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:119: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:120: void preferredModeDegradesToPointerPublishWhenAtomicMoveIsUnproven() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:133: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:134: void statReadsTheProvenPhysicalSizeWithoutFollowingALink() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:146: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:147: void rangedReadStopsExactlyAtTheRequestedEnd() throws IOException {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:158: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:159: void deleteIsPreconditionCheckedAndIdempotent() {
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:179: @Test
adapter/outbound/fileserver/src/test/java/dev/caskeleton/adapter/outbound/fileserver/platform/local/ContentPublisherTest.java:180: void publishedContentIsNeverNamedAfterAClientFilename() {
exit=0