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>
42 lines
2.1 KiB
Plaintext
42 lines
2.1 KiB
Plaintext
# 프로덕션이 실제로 내는 사유 전수
|
|
32: RetryDisposition.RETRY_FULL_TRANSACTION, delay, "retryable persistence failure");
|
|
53: return RetryDecision.reconcile("transaction completion is unknown");
|
|
56: return RetryDecision.fail("attempt performed an irreversible external side effect");
|
|
59: return RetryDecision.fail("retry is not enabled for this transaction profile");
|
|
63: return RetryDecision.fail("failure was classified as non-retryable");
|
|
67: return RetryDecision.fail("non-retryable persistence failure");
|
|
70- backoff.forAttempt(attempt.number()), "retrying whole transaction for " + category);
|
|
|
|
# 같은 모듈이 저카디널리티를 이미 정의해 뒀다
|
|
*
|
|
* <p>The check is structural: registered names already match a bounded format, so anything that
|
|
* does not is rejected rather than sanitised. Sanitising would let the caller keep passing
|
|
* unbounded values and never notice.
|
|
*/
|
|
public final class LowCardinality {
|
|
|
|
/** The shape every registered operation, query, and category name already satisfies. */
|
|
private static final Pattern REGISTERED = Pattern.compile("[a-zA-Z][a-zA-Z0-9._-]{0,95}");
|
|
/**
|
|
* Fails when any value is not a registered, bounded identifier.
|
|
*
|
|
* @throws IllegalArgumentException naming the first offending value
|
|
*/
|
|
public static void requireRegistered(String... values) {
|
|
for (String value : values) {
|
|
if (value == null || !REGISTERED.matcher(value).matches()) {
|
|
throw new IllegalArgumentException(
|
|
"metric tag value is not a registered low-cardinality identifier");
|
|
}
|
|
|
|
# 그 사유들을 그 가드에 실제로 넣어 본다
|
|
거절 29자 retryable persistence failure
|
|
거절 33자 transaction completion is unknown
|
|
거절 54자 attempt performed an irreversible external side effect
|
|
거절 49자 retry is not enabled for this transaction profile
|
|
거절 39자 failure was classified as non-retryable
|
|
거절 33자 non-retryable persistence failure
|
|
거절 52자 retrying whole transaction for SERIALIZATION_FAILURE
|
|
|
|
생성자에 100000자를 넣었을 때: 통과, 담긴 길이 100000
|