@optimystic/db-core 0.22.0 → 0.24.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +336 -336
- package/dist/src/cluster/structs.d.ts +39 -1
- package/dist/src/cluster/structs.d.ts.map +1 -1
- package/dist/src/cluster/structs.js +24 -0
- package/dist/src/cluster/structs.js.map +1 -1
- package/dist/src/collection/collection.d.ts +17 -0
- package/dist/src/collection/collection.d.ts.map +1 -1
- package/dist/src/collection/collection.js +24 -2
- package/dist/src/collection/collection.js.map +1 -1
- package/dist/src/collections/tree/tree.d.ts +5 -0
- package/dist/src/collections/tree/tree.d.ts.map +1 -1
- package/dist/src/collections/tree/tree.js +7 -0
- package/dist/src/collections/tree/tree.js.map +1 -1
- package/dist/src/network/i-peer-network.d.ts +16 -0
- package/dist/src/network/i-peer-network.d.ts.map +1 -1
- package/dist/src/network/struct.d.ts +39 -2
- package/dist/src/network/struct.d.ts.map +1 -1
- package/dist/src/network/struct.js +18 -0
- package/dist/src/network/struct.js.map +1 -1
- package/dist/src/testing/test-transactor.d.ts +95 -8
- package/dist/src/testing/test-transactor.d.ts.map +1 -1
- package/dist/src/testing/test-transactor.js +121 -8
- package/dist/src/testing/test-transactor.js.map +1 -1
- package/dist/src/transaction/transaction.d.ts +1 -1
- package/dist/src/transaction/transaction.js +1 -1
- package/dist/src/transactor/network-transactor.d.ts.map +1 -1
- package/dist/src/transactor/network-transactor.js +48 -13
- package/dist/src/transactor/network-transactor.js.map +1 -1
- package/dist/src/transactor/transactor-source.d.ts.map +1 -1
- package/dist/src/transactor/transactor-source.js +25 -2
- package/dist/src/transactor/transactor-source.js.map +1 -1
- package/package.json +1 -1
- package/src/cluster/membership.ts +85 -85
- package/src/cluster/structs.ts +43 -4
- package/src/cohort-topic/addressing.ts +120 -120
- package/src/cohort-topic/antidos/bootstrap-evidence-envelope.ts +253 -253
- package/src/cohort-topic/antidos/bootstrap-evidence.ts +106 -106
- package/src/cohort-topic/antidos/index.ts +5 -5
- package/src/cohort-topic/antidos/rate-limiter.ts +210 -210
- package/src/cohort-topic/antidos/replay-guard.ts +146 -146
- package/src/cohort-topic/antidos/topic-budget.ts +160 -160
- package/src/cohort-topic/antiflood/index.ts +2 -2
- package/src/cohort-topic/antiflood/invariants.ts +108 -108
- package/src/cohort-topic/antiflood/jitter.ts +117 -117
- package/src/cohort-topic/coldstart.ts +237 -237
- package/src/cohort-topic/dmax.ts +88 -88
- package/src/cohort-topic/gossip/bus.ts +254 -254
- package/src/cohort-topic/gossip/index.ts +3 -3
- package/src/cohort-topic/gossip/records.ts +45 -45
- package/src/cohort-topic/gossip/view.ts +91 -91
- package/src/cohort-topic/index.ts +20 -20
- package/src/cohort-topic/load/barometer.ts +134 -134
- package/src/cohort-topic/load/index.ts +1 -1
- package/src/cohort-topic/member-engine.ts +430 -430
- package/src/cohort-topic/membership/index.ts +3 -3
- package/src/cohort-topic/membership/publisher.ts +163 -163
- package/src/cohort-topic/membership/source.ts +41 -41
- package/src/cohort-topic/membership/verifier.ts +461 -461
- package/src/cohort-topic/ports.ts +157 -157
- package/src/cohort-topic/promotion.ts +405 -405
- package/src/cohort-topic/registration/bytes.ts +37 -37
- package/src/cohort-topic/registration/handoff.ts +154 -154
- package/src/cohort-topic/registration/index.ts +6 -6
- package/src/cohort-topic/registration/renewal.ts +495 -495
- package/src/cohort-topic/registration/sharding.ts +61 -61
- package/src/cohort-topic/registration/store.ts +81 -81
- package/src/cohort-topic/registration/types.ts +91 -91
- package/src/cohort-topic/ring-hash.ts +50 -50
- package/src/cohort-topic/service.ts +416 -416
- package/src/cohort-topic/sig/index.ts +2 -2
- package/src/cohort-topic/sig/payloads.ts +59 -59
- package/src/cohort-topic/sig/threshold.ts +64 -64
- package/src/cohort-topic/tiers.ts +74 -74
- package/src/cohort-topic/traffic.ts +233 -233
- package/src/cohort-topic/walk.ts +326 -326
- package/src/cohort-topic/willingness.ts +237 -237
- package/src/cohort-topic/wire/codec.ts +216 -216
- package/src/cohort-topic/wire/index.ts +18 -18
- package/src/cohort-topic/wire/payloads.ts +126 -126
- package/src/cohort-topic/wire/primitives.ts +188 -188
- package/src/cohort-topic/wire/types.ts +475 -475
- package/src/cohort-topic/wire/validate.ts +512 -512
- package/src/collection/collection-type-registry.ts +37 -37
- package/src/collection/collection.ts +25 -2
- package/src/collections/diary/diary.ts +68 -68
- package/src/collections/tree/readme.md +4 -0
- package/src/collections/tree/tree.ts +320 -312
- package/src/matchmaking/capability-filter.ts +45 -45
- package/src/matchmaking/config.ts +98 -98
- package/src/matchmaking/index.ts +21 -21
- package/src/matchmaking/multi-cohort-seeker.ts +234 -234
- package/src/matchmaking/provider.ts +123 -123
- package/src/matchmaking/query-eval.ts +105 -105
- package/src/matchmaking/seeker-walk.ts +127 -127
- package/src/matchmaking/seeker.ts +86 -86
- package/src/matchmaking/topic-anchor.ts +90 -90
- package/src/matchmaking/voting-quorum.ts +394 -394
- package/src/matchmaking/wire.ts +603 -603
- package/src/network/i-peer-network.ts +17 -0
- package/src/network/stale-failure.ts +43 -43
- package/src/network/struct.ts +41 -2
- package/src/network/types.ts +37 -37
- package/src/reactivity/backfill.ts +220 -220
- package/src/reactivity/backpressure.ts +191 -191
- package/src/reactivity/checkpoint.ts +308 -308
- package/src/reactivity/config.ts +172 -172
- package/src/reactivity/dedupe.ts +132 -132
- package/src/reactivity/forwarder.ts +87 -87
- package/src/reactivity/index.ts +34 -34
- package/src/reactivity/notification.ts +123 -123
- package/src/reactivity/policy.ts +79 -79
- package/src/reactivity/push-state.ts +310 -310
- package/src/reactivity/recover.ts +153 -153
- package/src/reactivity/replay-buffer.ts +141 -141
- package/src/reactivity/resume.ts +549 -549
- package/src/reactivity/rotation.ts +415 -415
- package/src/reactivity/subscriber.ts +132 -132
- package/src/reactivity/subscription.ts +66 -66
- package/src/reactivity/topic-anchor.ts +71 -71
- package/src/reactivity/verify.ts +73 -73
- package/src/reactivity/wire-validate.ts +13 -13
- package/src/reactivity/wire.ts +224 -224
- package/src/testing/async-wait.ts +65 -65
- package/src/testing/index.ts +2 -2
- package/src/testing/test-transactor.ts +638 -502
- package/src/transaction/errors.ts +91 -91
- package/src/transaction/operations-hash.ts +196 -196
- package/src/transaction/read-dependency-collector.ts +78 -78
- package/src/transaction/transaction.ts +1 -1
- package/src/transactor/change-notifier.ts +80 -80
- package/src/transactor/index.ts +5 -5
- package/src/transactor/network-transactor.ts +49 -14
- package/src/transactor/transactor-source.ts +25 -2
- package/src/transform/atomic-proxy.ts +92 -92
- package/src/transform/helpers.ts +159 -159
- package/src/utility/backoff.ts +95 -95
- package/src/utility/batch-coordinator.ts +191 -191
- package/dist/src/transaction/context.d.ts +0 -60
- package/dist/src/transaction/context.d.ts.map +0 -1
- package/dist/src/transaction/context.js +0 -91
- package/dist/src/transaction/context.js.map +0 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import type { ITransactor, GetBlockResults, ActionBlocks, BlockActionStatus, PendResult, CommitResult, PendRequest, BlockId, CommitRequest, BlockGets, ActionId, ActionTransforms, ClusterNomineesResult } from "../index.js";
|
|
1
|
+
import type { ITransactor, GetBlockResults, ActionBlocks, BlockActionStatus, PendResult, CommitResult, PendRequest, BlockId, CommitRequest, BlockGets, ActionId, ActionTransforms, ClusterNomineesResult, CollectionId } from "../index.js";
|
|
2
|
+
import type { TreeReplaceAction } from "../collections/tree/struct.js";
|
|
2
3
|
export declare class TestTransactor implements ITransactor {
|
|
3
4
|
private blocks;
|
|
4
5
|
available: boolean;
|
|
@@ -17,14 +18,34 @@ export declare class TestTransactor implements ITransactor {
|
|
|
17
18
|
/** Optional method for querying cluster nominees (used in GATHER phase for multi-collection transactions) */
|
|
18
19
|
queryClusterNominees?: (blockId: BlockId) => Promise<ClusterNomineesResult>;
|
|
19
20
|
}
|
|
21
|
+
/**
|
|
22
|
+
* Base for the intercepting wrappers below: forwards every {@link ITransactor} member to `inner`,
|
|
23
|
+
* so a wrapper overrides only the one call it intercepts and cannot silently drop the rest.
|
|
24
|
+
*
|
|
25
|
+
* `queryClusterNominees` is forwarded through a GETTER rather than a method, because the coordinator
|
|
26
|
+
* treats its ABSENCE as "no supercluster" (see `gatherPhase`). A wrapper that always defined it
|
|
27
|
+
* would push every wrapped multi-collection test onto the GATHER path even when the inner
|
|
28
|
+
* transactor never opted in; a wrapper that omits it (as these did before) does the opposite —
|
|
29
|
+
* a test that sets `inner.queryClusterNominees` and then wraps would skip GATHER and pass
|
|
30
|
+
* vacuously. The getter reproduces the inner transactor's own answer either way.
|
|
31
|
+
*/
|
|
32
|
+
export declare abstract class DelegatingTransactor implements ITransactor {
|
|
33
|
+
protected readonly inner: TestTransactor;
|
|
34
|
+
protected constructor(inner: TestTransactor);
|
|
35
|
+
get(b: BlockGets): Promise<GetBlockResults>;
|
|
36
|
+
getStatus(a: ActionBlocks[]): Promise<BlockActionStatus[]>;
|
|
37
|
+
pend(r: PendRequest): Promise<PendResult>;
|
|
38
|
+
cancel(a: ActionBlocks): Promise<void>;
|
|
39
|
+
commit(r: CommitRequest): Promise<CommitResult>;
|
|
40
|
+
get queryClusterNominees(): ((blockId: BlockId) => Promise<ClusterNomineesResult>) | undefined;
|
|
41
|
+
}
|
|
20
42
|
/**
|
|
21
43
|
* Wraps a {@link TestTransactor} and forces its commit phase to fail a bounded (or unbounded)
|
|
22
44
|
* number of times before delegating, so tests can exercise the sync retry / backoff / give-up
|
|
23
|
-
* path deterministically.
|
|
45
|
+
* path deterministically. Everything else delegates unchanged, so the pend→commit→cancel
|
|
24
46
|
* round-trip runs exactly as in production.
|
|
25
47
|
*/
|
|
26
|
-
export declare class FlakyCommitTransactor
|
|
27
|
-
private readonly inner;
|
|
48
|
+
export declare class FlakyCommitTransactor extends DelegatingTransactor {
|
|
28
49
|
private readonly failFirstN;
|
|
29
50
|
private readonly reason;
|
|
30
51
|
/** Number of commit() calls observed so far (across success and forced failure). */
|
|
@@ -35,10 +56,76 @@ export declare class FlakyCommitTransactor implements ITransactor {
|
|
|
35
56
|
* @param reason the StaleFailure.reason returned on a forced failure
|
|
36
57
|
*/
|
|
37
58
|
constructor(inner: TestTransactor, failFirstN: number, reason?: string);
|
|
38
|
-
get(b: BlockGets): Promise<GetBlockResults>;
|
|
39
|
-
getStatus(a: ActionBlocks[]): Promise<BlockActionStatus[]>;
|
|
40
|
-
pend(r: PendRequest): Promise<PendResult>;
|
|
41
|
-
cancel(a: ActionBlocks): Promise<void>;
|
|
42
59
|
commit(request: CommitRequest): Promise<CommitResult>;
|
|
43
60
|
}
|
|
61
|
+
/** A competing writer: a real write driven against the UNWRAPPED transactor, so its own
|
|
62
|
+
* pend/commit calls are invisible to {@link CompetingWriterTransactor}'s counters and cannot
|
|
63
|
+
* re-trigger the interception. See {@link commitRivalTreeWrite} for the usual implementation. */
|
|
64
|
+
export type RivalWrite = (inner: ITransactor) => Promise<void>;
|
|
65
|
+
export type CompetingWriterOptions = {
|
|
66
|
+
/** Fires on the first pend whose request satisfies this predicate. `callIndex` is 1-based over
|
|
67
|
+
* ALL pend calls seen (not only matching ones). Default: fire on the first pend call. */
|
|
68
|
+
when?: (request: PendRequest, callIndex: number) => boolean;
|
|
69
|
+
};
|
|
70
|
+
/**
|
|
71
|
+
* Wraps a {@link TestTransactor} and, exactly once, runs a real competing writer to completion
|
|
72
|
+
* BEFORE delegating the intercepted pend. The rival durably commits (real log entry, real
|
|
73
|
+
* revision bump), so the delegated pend then fails as a GENUINE optimistic-concurrency loss —
|
|
74
|
+
* nothing is forced or faked, unlike {@link FlakyCommitTransactor}, which returns a stale failure
|
|
75
|
+
* without ever advancing a block's revision.
|
|
76
|
+
*
|
|
77
|
+
* That distinction is the whole point: only a rival that actually landed can prove the loser
|
|
78
|
+
* OBSERVED a newer revision, re-applied its work on top of it, and did not lose an update.
|
|
79
|
+
*
|
|
80
|
+
* Two deliberate design constraints:
|
|
81
|
+
*
|
|
82
|
+
* 1. **The trigger is on PEND, and there is no commit trigger.** The rival is a real
|
|
83
|
+
* Collection/Tree, so its write pends with policy `'r'` (see `TransactorSource.transact`), and
|
|
84
|
+
* {@link TestTransactor.pend} rejects a pend whose blocks already carry a *pending* action.
|
|
85
|
+
* Firing before the loser's pend delegates means the loser has pended nothing yet, so the
|
|
86
|
+
* rival pends and commits cleanly and the loser's delegated pend then fails with `missing` — a
|
|
87
|
+
* real conflict. Firing at COMMIT time instead would leave the loser already pending on the
|
|
88
|
+
* shared log-tail block, so the rival's own pend would collide with it and spin through its
|
|
89
|
+
* sync retry budget (~10 attempts, ~21s) while the loser sits awaiting the rival inside its
|
|
90
|
+
* own commit: a livelock dressed up as a slow test. Do not add a commit trigger.
|
|
91
|
+
*
|
|
92
|
+
* 2. **The rival runs before delegation, never inside {@link TestTransactor}'s critical section.**
|
|
93
|
+
* `TestTransactor.get`/`commit` hold per-block latches (`TestTransactor.commit:${blockId}`), and
|
|
94
|
+
* those latch keys are process-global — a rival invoked from inside one of them would
|
|
95
|
+
* self-deadlock on its own reads. Intercepting here in the wrapper, before
|
|
96
|
+
* `await this.inner.pend(...)`, is outside every such section.
|
|
97
|
+
*/
|
|
98
|
+
export declare class CompetingWriterTransactor extends DelegatingTransactor {
|
|
99
|
+
private readonly rival;
|
|
100
|
+
private readonly options?;
|
|
101
|
+
/** Pend calls observed (including the intercepted one). */
|
|
102
|
+
pendCalls: number;
|
|
103
|
+
/** Commit calls observed. */
|
|
104
|
+
commitCalls: number;
|
|
105
|
+
/** The 1-based pend call index the rival fired on; undefined if it never fired. */
|
|
106
|
+
firedAtCall?: number;
|
|
107
|
+
/** How many times the rival ran. Latched to at most 1 — a second firing would collide with the
|
|
108
|
+
* loser's now-pending blocks and the transaction under test could never win. */
|
|
109
|
+
rivalRuns: number;
|
|
110
|
+
constructor(inner: TestTransactor, rival: RivalWrite, options?: CompetingWriterOptions | undefined);
|
|
111
|
+
pend(request: PendRequest): Promise<PendResult>;
|
|
112
|
+
commit(request: CommitRequest): Promise<CommitResult>;
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Durably commit a conflicting change to a tree collection: opens a SECOND {@link Tree} over the
|
|
116
|
+
* same transactor + collection id and replaces `entries` through it, producing a real log entry
|
|
117
|
+
* and a real revision bump — the durable competitor a {@link CompetingWriterTransactor} needs.
|
|
118
|
+
*
|
|
119
|
+
* `Tree.replace` is act + `updateAndSync`, i.e. a full commit through the single-collection sync
|
|
120
|
+
* path, so the rival's write is indistinguishable from any other client's.
|
|
121
|
+
*
|
|
122
|
+
* Pass the UNWRAPPED transactor (that is what {@link RivalWrite} receives).
|
|
123
|
+
*
|
|
124
|
+
* NOTE: opens the rival tree at the DEFAULT node capacity (64), because fan-out is not persisted
|
|
125
|
+
* in the collection header (see Tree.createOrOpen's `nodeCapacity` note). Fine while every rival
|
|
126
|
+
* race is between default-fan-out trees; if a test ever needs to race a small-capacity tree, add a
|
|
127
|
+
* capacity parameter here and pass the same value both sides, or the two writers will split nodes
|
|
128
|
+
* at different fan-outs.
|
|
129
|
+
*/
|
|
130
|
+
export declare function commitRivalTreeWrite<TKey, TEntry>(inner: ITransactor, collectionId: CollectionId, keyFromEntry: (entry: TEntry) => TKey, entries: TreeReplaceAction<TKey, TEntry>): Promise<void>;
|
|
44
131
|
//# sourceMappingURL=test-transactor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-transactor.d.ts","sourceRoot":"","sources":["../../../src/testing/test-transactor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,eAAe,EAAE,YAAY,EAAE,iBAAiB,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,EAAE,SAAS,EAAU,QAAQ,EAAE,gBAAgB,EAAyB,qBAAqB,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"test-transactor.d.ts","sourceRoot":"","sources":["../../../src/testing/test-transactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { ensuredMap } from "../utility/ensured.js";
|
|
2
2
|
import { Latches } from "../utility/latches.js";
|
|
3
3
|
import { applyTransform, blockIdsForTransforms, transformForBlockId, emptyTransforms, concatTransform, transformsFromTransform } from "../transform/index.js";
|
|
4
|
+
import { Tree } from "../collections/tree/tree.js";
|
|
4
5
|
// Simple in-memory transactor for testing that maintains materialized blocks for every revision
|
|
5
6
|
export class TestTransactor {
|
|
6
7
|
blocks = new Map();
|
|
@@ -388,14 +389,38 @@ export class TestTransactor {
|
|
|
388
389
|
/** Optional method for querying cluster nominees (used in GATHER phase for multi-collection transactions) */
|
|
389
390
|
queryClusterNominees;
|
|
390
391
|
}
|
|
392
|
+
/**
|
|
393
|
+
* Base for the intercepting wrappers below: forwards every {@link ITransactor} member to `inner`,
|
|
394
|
+
* so a wrapper overrides only the one call it intercepts and cannot silently drop the rest.
|
|
395
|
+
*
|
|
396
|
+
* `queryClusterNominees` is forwarded through a GETTER rather than a method, because the coordinator
|
|
397
|
+
* treats its ABSENCE as "no supercluster" (see `gatherPhase`). A wrapper that always defined it
|
|
398
|
+
* would push every wrapped multi-collection test onto the GATHER path even when the inner
|
|
399
|
+
* transactor never opted in; a wrapper that omits it (as these did before) does the opposite —
|
|
400
|
+
* a test that sets `inner.queryClusterNominees` and then wraps would skip GATHER and pass
|
|
401
|
+
* vacuously. The getter reproduces the inner transactor's own answer either way.
|
|
402
|
+
*/
|
|
403
|
+
export class DelegatingTransactor {
|
|
404
|
+
inner;
|
|
405
|
+
constructor(inner) {
|
|
406
|
+
this.inner = inner;
|
|
407
|
+
}
|
|
408
|
+
get(b) { return this.inner.get(b); }
|
|
409
|
+
getStatus(a) { return this.inner.getStatus(a); }
|
|
410
|
+
pend(r) { return this.inner.pend(r); }
|
|
411
|
+
cancel(a) { return this.inner.cancel(a); }
|
|
412
|
+
commit(r) { return this.inner.commit(r); }
|
|
413
|
+
get queryClusterNominees() {
|
|
414
|
+
return this.inner.queryClusterNominees?.bind(this.inner);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
391
417
|
/**
|
|
392
418
|
* Wraps a {@link TestTransactor} and forces its commit phase to fail a bounded (or unbounded)
|
|
393
419
|
* number of times before delegating, so tests can exercise the sync retry / backoff / give-up
|
|
394
|
-
* path deterministically.
|
|
420
|
+
* path deterministically. Everything else delegates unchanged, so the pend→commit→cancel
|
|
395
421
|
* round-trip runs exactly as in production.
|
|
396
422
|
*/
|
|
397
|
-
export class FlakyCommitTransactor {
|
|
398
|
-
inner;
|
|
423
|
+
export class FlakyCommitTransactor extends DelegatingTransactor {
|
|
399
424
|
failFirstN;
|
|
400
425
|
reason;
|
|
401
426
|
/** Number of commit() calls observed so far (across success and forced failure). */
|
|
@@ -406,14 +431,10 @@ export class FlakyCommitTransactor {
|
|
|
406
431
|
* @param reason the StaleFailure.reason returned on a forced failure
|
|
407
432
|
*/
|
|
408
433
|
constructor(inner, failFirstN, reason = 'forced stale') {
|
|
409
|
-
|
|
434
|
+
super(inner);
|
|
410
435
|
this.failFirstN = failFirstN;
|
|
411
436
|
this.reason = reason;
|
|
412
437
|
}
|
|
413
|
-
get(b) { return this.inner.get(b); }
|
|
414
|
-
getStatus(a) { return this.inner.getStatus(a); }
|
|
415
|
-
pend(r) { return this.inner.pend(r); }
|
|
416
|
-
cancel(a) { return this.inner.cancel(a); }
|
|
417
438
|
async commit(request) {
|
|
418
439
|
this.commitAttempts++;
|
|
419
440
|
if (this.commitAttempts <= this.failFirstN) {
|
|
@@ -422,6 +443,98 @@ export class FlakyCommitTransactor {
|
|
|
422
443
|
return this.inner.commit(request);
|
|
423
444
|
}
|
|
424
445
|
}
|
|
446
|
+
/**
|
|
447
|
+
* Wraps a {@link TestTransactor} and, exactly once, runs a real competing writer to completion
|
|
448
|
+
* BEFORE delegating the intercepted pend. The rival durably commits (real log entry, real
|
|
449
|
+
* revision bump), so the delegated pend then fails as a GENUINE optimistic-concurrency loss —
|
|
450
|
+
* nothing is forced or faked, unlike {@link FlakyCommitTransactor}, which returns a stale failure
|
|
451
|
+
* without ever advancing a block's revision.
|
|
452
|
+
*
|
|
453
|
+
* That distinction is the whole point: only a rival that actually landed can prove the loser
|
|
454
|
+
* OBSERVED a newer revision, re-applied its work on top of it, and did not lose an update.
|
|
455
|
+
*
|
|
456
|
+
* Two deliberate design constraints:
|
|
457
|
+
*
|
|
458
|
+
* 1. **The trigger is on PEND, and there is no commit trigger.** The rival is a real
|
|
459
|
+
* Collection/Tree, so its write pends with policy `'r'` (see `TransactorSource.transact`), and
|
|
460
|
+
* {@link TestTransactor.pend} rejects a pend whose blocks already carry a *pending* action.
|
|
461
|
+
* Firing before the loser's pend delegates means the loser has pended nothing yet, so the
|
|
462
|
+
* rival pends and commits cleanly and the loser's delegated pend then fails with `missing` — a
|
|
463
|
+
* real conflict. Firing at COMMIT time instead would leave the loser already pending on the
|
|
464
|
+
* shared log-tail block, so the rival's own pend would collide with it and spin through its
|
|
465
|
+
* sync retry budget (~10 attempts, ~21s) while the loser sits awaiting the rival inside its
|
|
466
|
+
* own commit: a livelock dressed up as a slow test. Do not add a commit trigger.
|
|
467
|
+
*
|
|
468
|
+
* 2. **The rival runs before delegation, never inside {@link TestTransactor}'s critical section.**
|
|
469
|
+
* `TestTransactor.get`/`commit` hold per-block latches (`TestTransactor.commit:${blockId}`), and
|
|
470
|
+
* those latch keys are process-global — a rival invoked from inside one of them would
|
|
471
|
+
* self-deadlock on its own reads. Intercepting here in the wrapper, before
|
|
472
|
+
* `await this.inner.pend(...)`, is outside every such section.
|
|
473
|
+
*/
|
|
474
|
+
export class CompetingWriterTransactor extends DelegatingTransactor {
|
|
475
|
+
rival;
|
|
476
|
+
options;
|
|
477
|
+
/** Pend calls observed (including the intercepted one). */
|
|
478
|
+
pendCalls = 0;
|
|
479
|
+
/** Commit calls observed. */
|
|
480
|
+
commitCalls = 0;
|
|
481
|
+
/** The 1-based pend call index the rival fired on; undefined if it never fired. */
|
|
482
|
+
firedAtCall;
|
|
483
|
+
/** How many times the rival ran. Latched to at most 1 — a second firing would collide with the
|
|
484
|
+
* loser's now-pending blocks and the transaction under test could never win. */
|
|
485
|
+
rivalRuns = 0;
|
|
486
|
+
constructor(inner, rival, options) {
|
|
487
|
+
super(inner);
|
|
488
|
+
this.rival = rival;
|
|
489
|
+
this.options = options;
|
|
490
|
+
}
|
|
491
|
+
async pend(request) {
|
|
492
|
+
// Increment synchronously, before any await, so call indexes reflect the caller's fan-out
|
|
493
|
+
// order rather than scheduling order.
|
|
494
|
+
const callIndex = ++this.pendCalls;
|
|
495
|
+
const matches = this.options?.when
|
|
496
|
+
? this.options.when(request, callIndex)
|
|
497
|
+
: callIndex === 1;
|
|
498
|
+
if (this.rivalRuns === 0 && matches) {
|
|
499
|
+
this.rivalRuns++;
|
|
500
|
+
this.firedAtCall = callIndex;
|
|
501
|
+
// A throwing rival escapes as a rejected pend, which pendPhase flattens to a bare message
|
|
502
|
+
// string ("hard failure") with the stack discarded — so name the source in the message, or
|
|
503
|
+
// a broken rival reads as an unexplained coordinator pend failure.
|
|
504
|
+
try {
|
|
505
|
+
await this.rival(this.inner);
|
|
506
|
+
}
|
|
507
|
+
catch (e) {
|
|
508
|
+
throw new Error(`competing writer failed: ${e instanceof Error ? e.message : String(e)}`, { cause: e });
|
|
509
|
+
}
|
|
510
|
+
}
|
|
511
|
+
return this.inner.pend(request);
|
|
512
|
+
}
|
|
513
|
+
async commit(request) {
|
|
514
|
+
this.commitCalls++;
|
|
515
|
+
return this.inner.commit(request);
|
|
516
|
+
}
|
|
517
|
+
}
|
|
518
|
+
/**
|
|
519
|
+
* Durably commit a conflicting change to a tree collection: opens a SECOND {@link Tree} over the
|
|
520
|
+
* same transactor + collection id and replaces `entries` through it, producing a real log entry
|
|
521
|
+
* and a real revision bump — the durable competitor a {@link CompetingWriterTransactor} needs.
|
|
522
|
+
*
|
|
523
|
+
* `Tree.replace` is act + `updateAndSync`, i.e. a full commit through the single-collection sync
|
|
524
|
+
* path, so the rival's write is indistinguishable from any other client's.
|
|
525
|
+
*
|
|
526
|
+
* Pass the UNWRAPPED transactor (that is what {@link RivalWrite} receives).
|
|
527
|
+
*
|
|
528
|
+
* NOTE: opens the rival tree at the DEFAULT node capacity (64), because fan-out is not persisted
|
|
529
|
+
* in the collection header (see Tree.createOrOpen's `nodeCapacity` note). Fine while every rival
|
|
530
|
+
* race is between default-fan-out trees; if a test ever needs to race a small-capacity tree, add a
|
|
531
|
+
* capacity parameter here and pass the same value both sides, or the two writers will split nodes
|
|
532
|
+
* at different fan-outs.
|
|
533
|
+
*/
|
|
534
|
+
export async function commitRivalTreeWrite(inner, collectionId, keyFromEntry, entries) {
|
|
535
|
+
const tree = await Tree.createOrOpen(inner, collectionId, keyFromEntry);
|
|
536
|
+
await tree.replace(entries);
|
|
537
|
+
}
|
|
425
538
|
function newBlockState() {
|
|
426
539
|
return {
|
|
427
540
|
materializedBlocks: new Map(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test-transactor.js","sourceRoot":"","sources":["../../../src/testing/test-transactor.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"test-transactor.js","sourceRoot":"","sources":["../../../src/testing/test-transactor.ts"],"names":[],"mappings":"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"}
|
|
@@ -108,7 +108,7 @@ export declare const DEFAULT_TRANSACTION_TTL_MS = 30000;
|
|
|
108
108
|
* Upper bound on a transaction's aged {@link Transaction.priority}. Capping is essential: it
|
|
109
109
|
* bounds the fairness effect (an aged transaction cannot accrue unlimited advantage) and bounds
|
|
110
110
|
* the throughput cost (it can impose at most `MaxPriority` extra race-losses on rivals before it
|
|
111
|
-
* commits). Two transactions capped out at `MaxPriority` fall back to the existing
|
|
111
|
+
* commits). Two transactions capped out at `MaxPriority` fall back to the existing approval-count /
|
|
112
112
|
* message-hash tiebreak, so behavior degrades gracefully to the pre-priority status quo.
|
|
113
113
|
*/
|
|
114
114
|
export declare const MaxPriority = 8;
|
|
@@ -7,7 +7,7 @@ export const DEFAULT_TRANSACTION_TTL_MS = 30_000;
|
|
|
7
7
|
* Upper bound on a transaction's aged {@link Transaction.priority}. Capping is essential: it
|
|
8
8
|
* bounds the fairness effect (an aged transaction cannot accrue unlimited advantage) and bounds
|
|
9
9
|
* the throughput cost (it can impose at most `MaxPriority` extra race-losses on rivals before it
|
|
10
|
-
* commits). Two transactions capped out at `MaxPriority` fall back to the existing
|
|
10
|
+
* commits). Two transactions capped out at `MaxPriority` fall back to the existing approval-count /
|
|
11
11
|
* message-hash tiebreak, so behavior degrades gracefully to the pre-priority status quo.
|
|
12
12
|
*/
|
|
13
13
|
export const MaxPriority = 8;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"network-transactor.d.ts","sourceRoot":"","sources":["../../../src/transactor/network-transactor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAA6B,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAc,aAAa,EAA+B,qBAAqB,EAAE,YAAY,
|
|
1
|
+
{"version":3,"file":"network-transactor.d.ts","sourceRoot":"","sources":["../../../src/transactor/network-transactor.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,OAAO,KAAK,EAAE,gBAAgB,EAAE,YAAY,EAAE,iBAAiB,EAAE,WAAW,EAA6B,WAAW,EAAE,OAAO,EAAE,eAAe,EAAE,UAAU,EAAE,YAAY,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,EAAc,aAAa,EAA+B,qBAAqB,EAAE,YAAY,EAAqD,MAAM,aAAa,CAAC;AAC7W,OAAO,KAAK,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAc3F,KAAK,qBAAqB,GAAG;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,UAAU,EAAE,WAAW,CAAC;IACxB,OAAO,EAAE,CAAC,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC;IACnC;;;;;;;OAOG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;;OAMG;IACH,mBAAmB,CAAC,EAAE,oBAAoB,CAAC;CAC3C,CAAA;AAWD,qBAAa,iBAAkB,YAAW,WAAW,EAAE,oBAAoB;IAC1E,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAc;IACzC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAS;IACnC,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAAS;IAChD,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAqB;IACnD,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAmC;IAEvE;;;;;;;;;;;;;;;;OAgBG;IACH,OAAO,CAAC,QAAQ,CAAC,mBAAmB,CAAgF;IACpH,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,iCAAiC,CAAQ;gBAGhE,IAAI,EAAE,qBAAqB;IAc5B;;;;;OAKG;IACH,kBAAkB,CAAC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,wBAAwB,GAAG,MAAM,IAAI;IAQxF,GAAG,CAAC,SAAS,EAAE,SAAS,GAAG,OAAO,CAAC,eAAe,CAAC;IA4LnD,SAAS,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;IA2D3E;;;;;;;;;;;OAWG;YACW,yBAAyB;IA6BvC,yGAAyG;YAC3F,sBAAsB;YAuBtB,uBAAuB;IA+F/B,IAAI,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,UAAU,CAAC;IA0InD,MAAM,CAAC,SAAS,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;IAmB9C,oBAAoB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,qBAAqB,CAAC;IAOtE,MAAM,CAAC,OAAO,EAAE,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC;YAwC7C,WAAW;IA4BzB,0EAA0E;YAC5D,YAAY;IAsC1B,8FAA8F;YAChF,iBAAiB;IAmB/B;;;;;;;OAOG;YACW,kBAAkB;IAehC;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IA2B1B,oHAAoH;YACtG,WAAW;IAqBzB,OAAO,CAAC,mBAAmB;CAY3B;AAiDD;;GAEG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,gBAAgB,EAAE,GAAG,gBAAgB,EAAE,CAIlG"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { peerIdFromString } from "../network/types.js";
|
|
2
2
|
import { highestStaleAt, isConflictFailure } from "../network/stale-failure.js";
|
|
3
|
-
import { BlockUnavailableError } from "../network/struct.js";
|
|
3
|
+
import { BlockUnavailableError, BlockPossiblyStaleError } from "../network/struct.js";
|
|
4
4
|
import { transformForBlockId, concatTransforms, concatTransform, transformsFromTransform, blockIdsForTransforms } from "../transform/helpers.js";
|
|
5
5
|
import { Tracker } from "../transform/tracker.js";
|
|
6
6
|
import { CacheSource } from "../transform/cache-source.js";
|
|
@@ -107,18 +107,29 @@ export class NetworkTransactor {
|
|
|
107
107
|
return b.request?.isResponse === true && b.request.response != null;
|
|
108
108
|
};
|
|
109
109
|
// A batch is answered when its response carries an entry for EVERY requested
|
|
110
|
-
// block id and none of those entries
|
|
110
|
+
// block id and none of those entries carries a doubt marker. An entry present
|
|
111
111
|
// with only `state` (no `block`) is an authoritative "absent", which counts as
|
|
112
|
-
// answered — not a gap. An `unavailable` entry is the peer saying
|
|
113
|
-
//
|
|
112
|
+
// answered — not a gap. An `unavailable` entry is the peer saying it could not
|
|
113
|
+
// find out whether the block EXISTS; an `unconfirmedAheadRev` entry is the peer
|
|
114
|
+
// saying it could not confirm the content it served is CURRENT (a cohort claim
|
|
115
|
+
// sits ahead of it, unsettled). Neither counts as answered, so both earn the
|
|
116
|
+
// second-chance retry against a different coordinator.
|
|
114
117
|
const isAuthoritative = (b) => {
|
|
115
118
|
if (!hasValidResponse(b))
|
|
116
119
|
return false;
|
|
117
120
|
const resp = b.request.response;
|
|
118
|
-
return b.payload.every(bid => resp[bid] !== undefined
|
|
121
|
+
return b.payload.every(bid => resp[bid] !== undefined
|
|
122
|
+
&& resp[bid].unavailable === undefined
|
|
123
|
+
&& resp[bid].unconfirmedAheadRev === undefined);
|
|
119
124
|
};
|
|
120
125
|
// Retry only genuine no-response / partial-response batches. An authoritative
|
|
121
126
|
// absent answer is not retried.
|
|
127
|
+
// NOTE: a 'cohort-unreachable' entry earns this retry like any other flagged entry,
|
|
128
|
+
// and on a genuinely isolated node the retry re-picks the same node (the
|
|
129
|
+
// findCoordinator:all-excluded path) and repeats the same futile consult. Fine
|
|
130
|
+
// today — one extra bounded consult on an already failing read. If isolated-node
|
|
131
|
+
// read latency ever matters, skip the retry for that reason rather than widening
|
|
132
|
+
// isAuthoritative.
|
|
122
133
|
const retryable = Array.from(allBatches(batches)).filter(b => !isAuthoritative(b));
|
|
123
134
|
if (retryable.length > 0 && Date.now() < expiration) {
|
|
124
135
|
log('get:retry retryable=%d', retryable.length);
|
|
@@ -143,24 +154,42 @@ export class NetworkTransactor {
|
|
|
143
154
|
}
|
|
144
155
|
// Cache the completed batches that had actual responses (not just coordinator not found)
|
|
145
156
|
const completedBatches = Array.from(allBatches(batches, b => b.request?.isResponse && !isRecordEmpty(b.request.response)));
|
|
146
|
-
//
|
|
147
|
-
//
|
|
148
|
-
//
|
|
149
|
-
//
|
|
157
|
+
// Ranking per block id: a block the answering repo could confirm is current beats
|
|
158
|
+
// one it marked possibly-behind (`unconfirmedAheadRev`), which beats an
|
|
159
|
+
// authoritative absent, which beats an absent marked possibly-behind (a doubted
|
|
160
|
+
// tombstone), which beats an `unavailable` guess. Content still beats absence at
|
|
161
|
+
// every confidence level, and one peer that positively knows outranks another
|
|
162
|
+
// that could not find out. Without the confirmed-over-unconfirmed split, a stale
|
|
163
|
+
// flagged block and the fresh confirmed block fetched by its own retry round tie
|
|
164
|
+
// — and only strictly-greater rank replaces, so first-arrival (the stale one)
|
|
165
|
+
// would win the very merge the retry exists to fix. Non-object junk ranks below
|
|
166
|
+
// everything so any real entry replaces it.
|
|
150
167
|
// NOTE: `materializedRev` is not part of the ranking, so two peers answering the same
|
|
151
168
|
// pinned get with block-carrying entries at DIFFERENT materialized revisions resolve
|
|
152
169
|
// to whichever arrived first. Not a concern today — cohort peers share the block's
|
|
153
170
|
// revision log, so they agree on the highest committed rev at or below a pin — and the
|
|
154
171
|
// failure direction is safe (a lower recorded revision spuriously stale-rejects rather
|
|
155
172
|
// than wrongly accepting). If peers are ever seen to disagree here, break the tie on
|
|
156
|
-
// the HIGHEST materializedRev among rank
|
|
173
|
+
// the HIGHEST materializedRev among top-rank entries.
|
|
174
|
+
// `unavailable` answers rank among THEMSELVES by how much they establish, so the merged
|
|
175
|
+
// entry never presents a weaker doubt than some peer actually returned. This matters
|
|
176
|
+
// because the reason travels out verbatim on `BlockUnavailableError` and callers act on
|
|
177
|
+
// it: 'cohort-unreachable' is the one reason a caller may treat permissively (the
|
|
178
|
+
// answering node reached nobody, so its own view is all it has), and a partitioned
|
|
179
|
+
// coordinator answering first must not mask a well-connected one that positively
|
|
180
|
+
// established the block EXISTS ('claimed-elsewhere', or 'unmaterializable' — records
|
|
181
|
+
// held here). 'peers-unreachable' sits between: it establishes that some of the cohort
|
|
182
|
+
// was reachable, without settling existence.
|
|
183
|
+
const unavailableRank = (reason) => reason === 'cohort-unreachable' ? 0 : reason === 'peers-unreachable' ? 1 : 2;
|
|
157
184
|
const rankOf = (r) => {
|
|
158
185
|
if (!r || typeof r !== 'object')
|
|
159
186
|
return -1;
|
|
160
187
|
const entry = r;
|
|
161
188
|
if (entry.block != null)
|
|
162
|
-
return
|
|
163
|
-
|
|
189
|
+
return entry.unconfirmedAheadRev === undefined ? 6 : 5;
|
|
190
|
+
if (entry.unavailable !== undefined)
|
|
191
|
+
return unavailableRank(entry.unavailable);
|
|
192
|
+
return entry.unconfirmedAheadRev === undefined ? 4 : 3;
|
|
164
193
|
};
|
|
165
194
|
// Create a lookup map from successful responses only
|
|
166
195
|
const resultEntries = new Map();
|
|
@@ -201,12 +230,18 @@ export class NetworkTransactor {
|
|
|
201
230
|
// A block whose repo could not determine whether it exists carries no status either:
|
|
202
231
|
// its empty `state` would read below as `aborted`, turning "I could not find out" into
|
|
203
232
|
// a definite verdict on someone's action. Fail loudly instead, like every other read of
|
|
204
|
-
// an unavailable block (see BlockUnavailableError).
|
|
233
|
+
// an unavailable block (see BlockUnavailableError). The same goes for a state the repo
|
|
234
|
+
// could not confirm is CURRENT (`unconfirmedAheadRev`, surviving the retry round above):
|
|
235
|
+
// an action committed at the claimed-ahead revision would read out of the stale state as
|
|
236
|
+
// a definite `aborted` — this read is unpinned, so the doubt always applies.
|
|
205
237
|
for (const blockId of allBlockIds) {
|
|
206
238
|
const entry = blockStates[blockId];
|
|
207
239
|
if (entry?.unavailable !== undefined && entry.block == null) {
|
|
208
240
|
throw new BlockUnavailableError(blockId, entry.unavailable);
|
|
209
241
|
}
|
|
242
|
+
if (entry?.unconfirmedAheadRev !== undefined) {
|
|
243
|
+
throw new BlockPossiblyStaleError(blockId, entry.unconfirmedAheadRev);
|
|
244
|
+
}
|
|
210
245
|
}
|
|
211
246
|
// Determine status for each action ref
|
|
212
247
|
const results = blockActions.map(ref => ({
|