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>
This commit is contained in:
co-authored by
Claude Opus 5
parent
43bccd08a8
commit
b2963105a8
+115
@@ -0,0 +1,115 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="1200" height="1954" viewBox="0 0 1200 1954" role="img">
|
||||
<title>terminal evidence</title>
|
||||
<desc>Terminal-style rendering generated from retained command output. Sensitive-looking values are redacted in the visual asset.</desc>
|
||||
<rect x="1" y="1" width="1198" height="1952" rx="14" fill="#0d1117" stroke="#30363d"/>
|
||||
<rect x="1" y="1" width="1198" height="44" rx="14" fill="#161b22"/>
|
||||
<rect x="1" y="30" width="1198" height="14" fill="#161b22"/>
|
||||
<circle cx="24" cy="22" r="6" fill="#ff5f57"/>
|
||||
<circle cx="44" cy="22" r="6" fill="#febc2e"/>
|
||||
<circle cx="64" cy="22" r="6" fill="#28c840"/>
|
||||
<text x="92" y="27" fill="#8b949e" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace">terminal evidence</text>
|
||||
<text x="24" y="68" fill="#c9d1d9" font-size="15" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">$ M=src/adapter/outbound/persistence-mongo/src/main/java/dev/caskeleton/adapter/outbound/mongo/migration
|
||||
T=src/adapter/o</tspan><tspan x="24" dy="22">utbound/persistence-mongo/src/test/java/dev/caskeleton/adapter/outbound/mongo/migration
|
||||
|
||||
echo '# 조립된 경로에서 갱신과 </tspan><tspan x="24" dy="22">원장 기록 사이에 있는 것'
|
||||
sed -n '139,142p' $M/MongoMigrationRunner.java
|
||||
sed -n '144,148p' $M/MongoMigrationRunner.java
|
||||
</tspan><tspan x="24" dy="22">echo ' ...'
|
||||
sed -n '154,158p' $M/MongoMigrationRunner.java
|
||||
|
||||
echo
|
||||
echo '# 완료를 만드는 팩토리는 체크포인트를 남기지 </tspan><tspan x="24" dy="22">않는다'
|
||||
sed -n '24,34p' $M/MongoMigrationResult.java
|
||||
|
||||
echo
|
||||
echo '# 그 갱신이 던지는 것'
|
||||
sed -n '160,165p' $M/MongoColl</tspan><tspan x="24" dy="22">ectionMigrationLock.java
|
||||
echo '# 같은 인터페이스의 다른 잠금 구현이 같은 상황에 던지는 것'
|
||||
sed -n '57,63p' $M/flamingo</tspan><tspan x="24" dy="22">ck/FlamingockLockAdapter.java
|
||||
|
||||
echo
|
||||
echo '# 다른 원장 구현은 펜스 인자를 쓰지 않는다'
|
||||
sed -n '61,65p' $M/flamingock/Flam</tspan><tspan x="24" dy="22">ingockLedgerAdapter.java
|
||||
|
||||
echo
|
||||
echo '# recordApplied 를 부르는 시험 전수'
|
||||
grep -rn 'ledger.recordApplied(' --include=*.j</tspan><tspan x="24" dy="22">ava $T | sed "s#$T/##"
|
||||
echo '# 그중 실서버에서 두 번 부르는 시험이 단언하는 것'
|
||||
sed -n '230,234p' $T/MongoMigrationLan</tspan><tspan x="24" dy="22">eTest.java
|
||||
|
||||
echo
|
||||
echo '# 고유 색인을 만드는 메서드를 부르는 곳 전수'
|
||||
grep -rln 'ensureIndexes()' --include=*.java src | </tspan><tspan x="24" dy="22">sed 's#src/adapter/outbound/persistence-mongo/src/##' </tspan></text>
|
||||
<text x="24" y="310" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">cwd: /shared/codebase/clean-architecture-backend-template</tspan></text>
|
||||
<text x="24" y="332" fill="#8b949e" font-size="13" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">time: 2026-09-02T07:40:13+00:00 · exit 0</tspan></text>
|
||||
<line x1="24" y1="346" x2="1176" y2="346" stroke="#30363d"/>
|
||||
<text x="24" y="386" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 조립된 경로에서 갱신과 원장 기록 사이에 있는 것</tspan></text>
|
||||
<text x="24" y="408" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // Still refreshed after execute, but the refresh is no longer what protects the run: the</tspan></text>
|
||||
<text x="24" y="430" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // heartbeat inside the context is. This one only proves the lease survived to the end, before</tspan></text>
|
||||
<text x="24" y="452" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> // anything is written to the ledger under it.</tspan></text>
|
||||
<text x="24" y="474" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> lock.refresh(template.maxTime());</tspan></text>
|
||||
<text x="24" y="496" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> if (!migration.postcondition().isSatisfied(context, result)) {</tspan></text>
|
||||
<text x="24" y="518" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> throw MongoOperationRejectedException.of(</tspan></text>
|
||||
<text x="24" y="540" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> "migration.postcondition",</tspan></text>
|
||||
<text x="24" y="562" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> "migration "</tspan></text>
|
||||
<text x="24" y="584" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> + migration.id()</tspan></text>
|
||||
<text x="24" y="606" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ...</tspan></text>
|
||||
<text x="24" y="628" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> result.resumePoint().ifPresent(checkpoint -> ledger.saveCheckpoint(checkpoint, lock.fence()));</tspan></text>
|
||||
<text x="24" y="650" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> if (result.status() == MongoMigrationResult.Status.COMPLETED && !context.dryRun()) {</tspan></text>
|
||||
<text x="24" y="672" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ledger.recordApplied(</tspan></text>
|
||||
<text x="24" y="694" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> migration.id(), migration.checksum(), context.operator(), clock.instant(), lock.fence());</tspan></text>
|
||||
<text x="24" y="716" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
|
||||
<text x="24" y="738" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
||||
<text x="24" y="760" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 완료를 만드는 팩토리는 체크포인트를 남기지 않는다</tspan></text>
|
||||
<text x="24" y="782" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> /** The migration finished. */</tspan></text>
|
||||
<text x="24" y="804" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> public static MongoMigrationResult completed(long processedCount) {</tspan></text>
|
||||
<text x="24" y="826" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> return new MongoMigrationResult(Status.COMPLETED, processedCount, null, "");</tspan></text>
|
||||
<text x="24" y="848" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
|
||||
<text x="24" y="870" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
||||
<text x="24" y="892" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> /** The migration made progress and stored a checkpoint to resume from. */</tspan></text>
|
||||
<text x="24" y="914" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> public static MongoMigrationResult incomplete(</tspan></text>
|
||||
<text x="24" y="936" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> long processedCount, MongoMigrationCheckpoint checkpoint) {</tspan></text>
|
||||
<text x="24" y="958" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> return new MongoMigrationResult(</tspan></text>
|
||||
<text x="24" y="980" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> Status.INCOMPLETE, processedCount, Objects.requireNonNull(checkpoint, "checkpoint"), "");</tspan></text>
|
||||
<text x="24" y="1002" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
|
||||
<text x="24" y="1024" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
||||
<text x="24" y="1046" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그 갱신이 던지는 것</tspan></text>
|
||||
<text x="24" y="1068" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> if (stillOwned != 1) {</tspan></text>
|
||||
<text x="24" y="1090" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> held = false;</tspan></text>
|
||||
<text x="24" y="1112" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> throw new IllegalStateException(</tspan></text>
|
||||
<text x="24" y="1134" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> "the migration lease was lost before it could be refreshed; another runner may have "</tspan></text>
|
||||
<text x="24" y="1156" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> + "taken it after this one appeared to stall");</tspan></text>
|
||||
<text x="24" y="1178" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
|
||||
<text x="24" y="1200" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 같은 인터페이스의 다른 잠금 구현이 같은 상황에 던지는 것</tspan></text>
|
||||
<text x="24" y="1222" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> public void refresh(Duration extension) {</tspan></text>
|
||||
<text x="24" y="1244" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> Objects.requireNonNull(extension, "extension");</tspan></text>
|
||||
<text x="24" y="1266" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> if (!held.get()) {</tspan></text>
|
||||
<text x="24" y="1288" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> throw MongoOperationRejectedException.of(</tspan></text>
|
||||
<text x="24" y="1310" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> "migration.lock", "the migration lease has been released and cannot be extended");</tspan></text>
|
||||
<text x="24" y="1332" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
|
||||
<text x="24" y="1354" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> extend.accept(extension);</tspan></text>
|
||||
<text x="24" y="1376" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
||||
<text x="24" y="1398" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 다른 원장 구현은 펜스 인자를 쓰지 않는다</tspan></text>
|
||||
<text x="24" y="1420" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> long fence) {</tspan></text>
|
||||
<text x="24" y="1442" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> recorded.put(</tspan></text>
|
||||
<text x="24" y="1464" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> Objects.requireNonNull(migrationId, "migrationId"),</tspan></text>
|
||||
<text x="24" y="1486" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> new AppliedMigration(migrationId, checksum, operator, appliedAt));</tspan></text>
|
||||
<text x="24" y="1508" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> }</tspan></text>
|
||||
<text x="24" y="1530" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
||||
<text x="24" y="1552" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># recordApplied 를 부르는 시험 전수</tspan></text>
|
||||
<text x="24" y="1574" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">MongoMigrationRunnerTest.java:23: ledger.recordApplied(</tspan></text>
|
||||
<text x="24" y="1596" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">MongoMigrationRunnerTest.java:40: ledger.recordApplied(</tspan></text>
|
||||
<text x="24" y="1618" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">MongoMigrationLaneTest.java:130: ledger.recordApplied(</tspan></text>
|
||||
<text x="24" y="1640" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">MongoMigrationLaneTest.java:227: ledger.recordApplied(id, new MongoMigrationChecksum("abc"), "operator", FIXED.instant(), 1L)</tspan><tspan x="24" dy="22">;</tspan></text>
|
||||
<text x="24" y="1684" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">MongoMigrationLaneTest.java:231: ledger.recordApplied(</tspan></text>
|
||||
<text x="24" y="1706" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 그중 실서버에서 두 번 부르는 시험이 단언하는 것</tspan></text>
|
||||
<text x="24" y="1728" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> () -></tspan></text>
|
||||
<text x="24" y="1750" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> ledger.recordApplied(</tspan></text>
|
||||
<text x="24" y="1772" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> id, new MongoMigrationChecksum("abc"), "operator", FIXED.instant(), 1L))</tspan></text>
|
||||
<text x="24" y="1794" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .as("the unique index, not the read-then-write check, is what makes this impossible")</tspan></text>
|
||||
<text x="24" y="1816" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"> .isInstanceOf(RuntimeException.class);</tspan></text>
|
||||
<text x="24" y="1838" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"></tspan></text>
|
||||
<text x="24" y="1860" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0"># 고유 색인을 만드는 메서드를 부르는 곳 전수</tspan></text>
|
||||
<text x="24" y="1882" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">test/java/dev/caskeleton/adapter/outbound/mongo/migration/MongoMigrationLaneTest.java</tspan></text>
|
||||
<text x="24" y="1904" fill="#e6edf3" font-size="14" font-family="ui-monospace, SFMono-Regular, Menlo, Consolas, monospace" xml:space="preserve"><tspan x="24" dy="0">main/java/dev/caskeleton/adapter/outbound/mongo/migration/MongoCollectionMigrationLedger.java</tspan></text>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 19 KiB |
Reference in New Issue
Block a user