@optimystic/db-p2p 0.17.0 → 0.19.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/dist/src/cluster/block-transfer-service.d.ts +10 -0
- package/dist/src/cluster/block-transfer-service.d.ts.map +1 -1
- package/dist/src/cluster/block-transfer-service.js +2 -1
- package/dist/src/cluster/block-transfer-service.js.map +1 -1
- package/dist/src/cluster/cluster-policy.d.ts +112 -0
- package/dist/src/cluster/cluster-policy.d.ts.map +1 -0
- package/dist/src/cluster/cluster-policy.js +88 -0
- package/dist/src/cluster/cluster-policy.js.map +1 -0
- package/dist/src/cluster/cluster-repo.d.ts +35 -11
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +95 -19
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/quorum-restore.d.ts +25 -3
- package/dist/src/cluster/quorum-restore.d.ts.map +1 -1
- package/dist/src/cluster/quorum-restore.js +27 -3
- package/dist/src/cluster/quorum-restore.js.map +1 -1
- package/dist/src/cluster/reconcile-block.d.ts +10 -2
- package/dist/src/cluster/reconcile-block.d.ts.map +1 -1
- package/dist/src/cluster/reconcile-block.js +38 -18
- package/dist/src/cluster/reconcile-block.js.map +1 -1
- package/dist/src/cluster/spread-on-churn.d.ts.map +1 -1
- package/dist/src/cluster/spread-on-churn.js +8 -0
- package/dist/src/cluster/spread-on-churn.js.map +1 -1
- package/dist/src/inbound-authorization.d.ts +6 -0
- package/dist/src/inbound-authorization.d.ts.map +1 -1
- package/dist/src/inbound-authorization.js +6 -0
- package/dist/src/inbound-authorization.js.map +1 -1
- package/dist/src/libp2p-key-network.d.ts +66 -4
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +130 -17
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.d.ts +22 -23
- package/dist/src/libp2p-node-base.d.ts.map +1 -1
- package/dist/src/libp2p-node-base.js +45 -34
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +21 -3
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +27 -5
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +88 -28
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +287 -81
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/storage/storage-repo.d.ts +9 -0
- package/dist/src/storage/storage-repo.d.ts.map +1 -1
- package/dist/src/storage/storage-repo.js +77 -7
- package/dist/src/storage/storage-repo.js.map +1 -1
- package/dist/src/testing/mesh-harness.d.ts +17 -0
- package/dist/src/testing/mesh-harness.d.ts.map +1 -1
- package/dist/src/testing/mesh-harness.js +27 -4
- package/dist/src/testing/mesh-harness.js.map +1 -1
- package/package.json +2 -2
- package/readme.md +20 -0
- package/src/cluster/block-transfer-service.ts +9 -1
- package/src/cluster/cluster-policy.ts +152 -0
- package/src/cluster/cluster-repo.ts +100 -22
- package/src/cluster/quorum-restore.ts +28 -3
- package/src/cluster/reconcile-block.ts +52 -19
- package/src/cluster/spread-on-churn.ts +8 -0
- package/src/inbound-authorization.ts +6 -0
- package/src/libp2p-key-network.ts +958 -807
- package/src/libp2p-node-base.ts +65 -57
- package/src/repo/cluster-coordinator.ts +30 -6
- package/src/repo/coordinator-repo.ts +329 -91
- package/src/storage/storage-repo.ts +81 -10
- package/src/testing/mesh-harness.ts +34 -4
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import type { PendRequest, ActionBlocks, IRepo, MessageOptions, CommitResult, GetBlockResults, PendResult, BlockGets, CommitRequest, IKeyNetwork, ICluster, ClusterConsensusConfig, BlockId, ActionRev, ActionContext } from "@optimystic/db-core";
|
|
2
|
-
import type { ClusterClient } from "../cluster/client.js";
|
|
3
2
|
import type { PeerId } from "@libp2p/interface";
|
|
4
3
|
import type { FretService } from "p2p-fret";
|
|
5
4
|
import type { IPeerReputation } from "../reputation/types.js";
|
|
@@ -24,8 +23,18 @@ interface LocalClusterWithExecutionTracking extends ICluster {
|
|
|
24
23
|
wasTransactionExecuted?(messageHash: string): boolean;
|
|
25
24
|
}
|
|
26
25
|
/**
|
|
27
|
-
* Callback to query a cluster peer for their latest revision of a block.
|
|
28
|
-
*
|
|
26
|
+
* Callback to query a cluster peer for their latest revision of a block. Three-way contract:
|
|
27
|
+
* - resolves an `ActionRev` — the peer answered and holds the block at that revision;
|
|
28
|
+
* - resolves `undefined` — the peer answered and holds NOTHING (an absent claim);
|
|
29
|
+
* - REJECTS — the peer could not be asked at all (dial failure, protocol error).
|
|
30
|
+
*
|
|
31
|
+
* The distinction between the last two is load-bearing: `queryClusterForLatest` counts a
|
|
32
|
+
* rejection as a SILENT peer, which stops `CoordinatorRepo.get` from reporting a locally-missing
|
|
33
|
+
* block as an authoritative absent, while a resolved `undefined` is a real answer that keeps the
|
|
34
|
+
* absent authoritative. Implementations must therefore let transport errors propagate rather than
|
|
35
|
+
* swallowing them into `undefined` (see the implementations in `libp2p-node-base` and the mesh
|
|
36
|
+
* harness's `silentPeers` failure knob). Slowness needs no handling here — the caller deadlines
|
|
37
|
+
* each query and treats expiry as silence.
|
|
29
38
|
*/
|
|
30
39
|
export type ClusterLatestCallback = (peerId: PeerId, blockId: BlockId, context?: ActionContext) => Promise<ActionRev | undefined>;
|
|
31
40
|
interface CoordinatorRepoComponents {
|
|
@@ -45,13 +54,22 @@ interface CoordinatorRepoComponents {
|
|
|
45
54
|
*/
|
|
46
55
|
acquireBlockFromCohort?: AcquireBlockCallback;
|
|
47
56
|
}
|
|
48
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Consensus config for the coordinator side, plus the repair yardstick the read-repair path measures
|
|
59
|
+
* a (possibly shrunken) cohort view against. `repairCorroborationClusterSize` is deliberately its own
|
|
60
|
+
* field rather than an overload of {@link ClusterConsensusConfig.assumedClusterSize}: this same object
|
|
61
|
+
* also builds the `ClusterCoordinator`, and a field whose value silently differed from the cluster
|
|
62
|
+
* member's copy of it would be a trap. See `cluster/cluster-policy.ts` for why the two differ.
|
|
63
|
+
*/
|
|
64
|
+
export type CoordinatorRepoConfig = Partial<ClusterConsensusConfig> & {
|
|
49
65
|
clusterSize?: number;
|
|
50
|
-
|
|
66
|
+
repairCorroborationClusterSize?: number;
|
|
67
|
+
};
|
|
68
|
+
export declare function coordinatorRepo(keyNetwork: IKeyNetwork, createClusterClient: (peerId: PeerId) => ICluster, cfg?: CoordinatorRepoConfig, fretService?: FretService, reputation?: IPeerReputation, stateStore?: ITransactionStateStore): (components: CoordinatorRepoComponents) => CoordinatorRepo;
|
|
51
69
|
/** Cluster coordination repo - uses local store, as well as distributes changes to other nodes using cluster consensus. */
|
|
52
70
|
export declare class CoordinatorRepo implements IRepo {
|
|
53
71
|
readonly keyNetwork: IKeyNetwork;
|
|
54
|
-
readonly createClusterClient: (peerId: PeerId) =>
|
|
72
|
+
readonly createClusterClient: (peerId: PeerId) => ICluster;
|
|
55
73
|
private readonly storageRepo;
|
|
56
74
|
private readonly clusterLatestCallback?;
|
|
57
75
|
private readonly acquireBlockFromCohort?;
|
|
@@ -66,8 +84,13 @@ export declare class CoordinatorRepo implements IRepo {
|
|
|
66
84
|
private readonly readRepairSampleRate;
|
|
67
85
|
/** Simple-majority threshold from the consensus policy; drives the read-repair corroboration quorum. */
|
|
68
86
|
private readonly simpleMajorityThreshold;
|
|
69
|
-
/**
|
|
70
|
-
|
|
87
|
+
/**
|
|
88
|
+
* Yardstick the read-repair corroboration floor is measured against; the floor for
|
|
89
|
+
* {@link corroboratorCapacity}. Resolved by `resolveClusterPolicy` for a real node; falls back to
|
|
90
|
+
* `assumedClusterSize` and then `clusterSize` for direct constructors (see the constructor), so a
|
|
91
|
+
* caller that has adopted neither field keeps today's behavior exactly.
|
|
92
|
+
*/
|
|
93
|
+
private readonly repairCorroborationClusterSize;
|
|
71
94
|
/** Resolved super-majority threshold the coordinator commits on (mirrors the value handed to ClusterCoordinator). */
|
|
72
95
|
private readonly superMajorityThreshold;
|
|
73
96
|
private readonly reputation?;
|
|
@@ -75,9 +98,7 @@ export declare class CoordinatorRepo implements IRepo {
|
|
|
75
98
|
now: () => number;
|
|
76
99
|
/** Test seam: overridable RNG (0..1) for sample-rate gating. */
|
|
77
100
|
rand: () => number;
|
|
78
|
-
constructor(keyNetwork: IKeyNetwork, createClusterClient: (peerId: PeerId) =>
|
|
79
|
-
clusterSize?: number;
|
|
80
|
-
}, localCluster?: LocalClusterWithExecutionTracking, localPeerId?: PeerId, fretService?: FretService, clusterLatestCallback?: ClusterLatestCallback | undefined, reputation?: IPeerReputation, stateStore?: ITransactionStateStore, acquireBlockFromCohort?: AcquireBlockCallback | undefined);
|
|
101
|
+
constructor(keyNetwork: IKeyNetwork, createClusterClient: (peerId: PeerId) => ICluster, storageRepo: IRepo, cfg?: CoordinatorRepoConfig, localCluster?: LocalClusterWithExecutionTracking, localPeerId?: PeerId, fretService?: FretService, clusterLatestCallback?: ClusterLatestCallback | undefined, reputation?: IPeerReputation, stateStore?: ITransactionStateStore, acquireBlockFromCohort?: AcquireBlockCallback | undefined);
|
|
81
102
|
/**
|
|
82
103
|
* The resolved super-majority threshold this coordinator commits on. Exposed so the composition root
|
|
83
104
|
* can fail-fast if the coordinator and the cluster member would run different thresholds (see the
|
|
@@ -99,6 +120,14 @@ export declare class CoordinatorRepo implements IRepo {
|
|
|
99
120
|
*/
|
|
100
121
|
private verifyResponsibility;
|
|
101
122
|
get(blockGets: BlockGets, options?: MessageOptions): Promise<GetBlockResults>;
|
|
123
|
+
/**
|
|
124
|
+
* Downgrade an absence the coordinator could not confirm to `unavailable: 'peers-unreachable'` —
|
|
125
|
+
* the flag `NetworkTransactor.get` retries against another peer instead of taking as final.
|
|
126
|
+
*
|
|
127
|
+
* No-op once the entry carries a real answer (the consult restored the block) or a sharper flag
|
|
128
|
+
* (storage's `'unmaterializable'`), so callers only need to establish that the answer is a guess.
|
|
129
|
+
*/
|
|
130
|
+
private flagUnconfirmedAbsence;
|
|
102
131
|
/** Decide whether the read-repair policy wants us to consult the cluster for a present-but-possibly-stale block. */
|
|
103
132
|
private shouldReadRepair;
|
|
104
133
|
/** Milliseconds since we last marked this block fresh, or undefined if never. */
|
|
@@ -111,10 +140,23 @@ export declare class CoordinatorRepo implements IRepo {
|
|
|
111
140
|
* a full pend/commit cycle through the cluster coordinator.
|
|
112
141
|
*/
|
|
113
142
|
setLastSeenForTest(blockId: BlockId, ts: number): void;
|
|
143
|
+
/**
|
|
144
|
+
* One repair pass for a block: ask the cohort what it holds, and converge onto that if it is
|
|
145
|
+
* ahead of `localRev` — the revision the caller's read already loaded, and the baseline every
|
|
146
|
+
* decision below is measured against.
|
|
147
|
+
*
|
|
148
|
+
* Returns the one thing `get` needs beyond the storage side effects: whether the pass was
|
|
149
|
+
* INCONCLUSIVE — it neither confirmed the cohort holds nothing nor left this node holding the
|
|
150
|
+
* block. Two ways that happens: a cohort peer other than this node stayed SILENT (rejected
|
|
151
|
+
* callback or per-peer deadline), or a revision WAS corroborated and the convergence onto it
|
|
152
|
+
* failed. In both, `get` has learned that its local absence may be wrong, so it must not report
|
|
153
|
+
* a still-missing block as an authoritative absent. Paths that consult nobody (no cohort,
|
|
154
|
+
* solo-self) are conclusive: there, the local answer genuinely is the whole truth.
|
|
155
|
+
*/
|
|
114
156
|
private fetchBlockFromCluster;
|
|
115
157
|
/**
|
|
116
158
|
* Bring this node up to the cohort-corroborated `corroborated`, returning the revision it holds
|
|
117
|
-
* afterwards when that is an advance over `
|
|
159
|
+
* afterwards when that is an advance over `baselineRev`, else `undefined`.
|
|
118
160
|
*
|
|
119
161
|
* Two mechanisms, cheapest first:
|
|
120
162
|
* 1. **Promote a local pending** — free, no network, and the only mechanism that existed before
|
|
@@ -140,26 +182,18 @@ export declare class CoordinatorRepo implements IRepo {
|
|
|
140
182
|
* the repair. Returns the local revision afterwards.
|
|
141
183
|
*
|
|
142
184
|
* A pending-only block (metadata seeded by `savePendingTransaction`, no committed revision) asked
|
|
143
|
-
* for a forward revision
|
|
144
|
-
*
|
|
145
|
-
*
|
|
185
|
+
* for a forward revision no promotion can reach used to throw out of `BlockStorage.ensureRevision`;
|
|
186
|
+
* `StorageRepo.get` now reports it as an entry flagged `unavailable` instead (ticket
|
|
187
|
+
* repo-reports-unavailable-vs-absent). On THIS path either shape is an absence, not a read failure —
|
|
188
|
+
* acquisition is precisely the mechanism that can supply the revision — so both are logged as
|
|
189
|
+
* `promote-unavailable` and stepped over rather than short-circuiting the caller.
|
|
146
190
|
*/
|
|
147
191
|
private promoteCorroborated;
|
|
192
|
+
/** This node's own answer for a block, optionally driving a promotion context through the read.
|
|
193
|
+
* Callers that care whether the answer is authoritative inspect `entry.unavailable`. */
|
|
194
|
+
private readLocalEntry;
|
|
148
195
|
/** This node's own `latest.rev` for a block, optionally driving a promotion context through the read. */
|
|
149
196
|
private readLocalRev;
|
|
150
|
-
/**
|
|
151
|
-
* How many peers other than this node could corroborate a claim about a block, given a
|
|
152
|
-
* cohort view of `peerIds`. Deliberately the MAX of what we observe and what the
|
|
153
|
-
* configured cluster size implies: the corroboration floor may only be relaxed for a
|
|
154
|
-
* cohort that is genuinely small, never for one that merely *looks* small. `findCluster`
|
|
155
|
-
* results are unauthenticated, so a partition — or an attacker with routing influence —
|
|
156
|
-
* can shrink this node's view to itself plus one peer; measuring against the configured
|
|
157
|
-
* size keeps that shrunken view from talking the requirement down to a single voter.
|
|
158
|
-
* The escape hatch for a real two-node deployment is therefore to configure
|
|
159
|
-
* `clusterSize: 2`, an explicit operator declaration, mirroring how
|
|
160
|
-
* `allowUnvalidatedSmallCluster` gates the membership admission floor.
|
|
161
|
-
*/
|
|
162
|
-
private corroboratorCapacity;
|
|
163
197
|
/**
|
|
164
198
|
* Query cluster peers for their latest revision and return the highest revision
|
|
165
199
|
* corroborated by a quorum of distinct peers, alongside this node's own latest.
|
|
@@ -194,8 +228,34 @@ export declare class CoordinatorRepo implements IRepo {
|
|
|
194
228
|
*/
|
|
195
229
|
private penalizeContradictingRevClaims;
|
|
196
230
|
pend(request: PendRequest, options?: MessageOptions): Promise<PendResult>;
|
|
231
|
+
/**
|
|
232
|
+
* Decide whether a cluster validator rejection was an optimistic-concurrency loss — the block
|
|
233
|
+
* already advanced past the requested revision — rather than a genuine validation fault.
|
|
234
|
+
* A confirmed loss returns a {@link StaleFailure} carrying `conflict: true` so the caller
|
|
235
|
+
* receives a non-success *response* that says plainly it is a lost race: network-transactor's
|
|
236
|
+
* pend then takes its stale branch and both writers (`Collection.sync`, and the coordinator's
|
|
237
|
+
* multi-collection pendPhase via `isConflictFailure`) retry, instead of a thrown error escaping
|
|
238
|
+
* mid-batch (which splits multi-tree commits — see PartialCommitError).
|
|
239
|
+
*
|
|
240
|
+
* The failure carries no `missing` list: confirmation is a local re-read that reveals the
|
|
241
|
+
* revision is taken but not which actions took it, and no consumer rebases from `missing`
|
|
242
|
+
* anyway (it is only counted or logged). `conflict` conveys retryability directly instead.
|
|
243
|
+
*
|
|
244
|
+
* Confirmation is purely local: re-read the affected blocks from our own storage and require
|
|
245
|
+
* `latest.rev >= request.rev`. The signed reject-reason text is never consulted — it is
|
|
246
|
+
* free-form wire-visible prose and must not become control flow. Anything unconfirmed
|
|
247
|
+
* (including read errors during confirmation) stays a throw, preserving fail-fast for
|
|
248
|
+
* genuine validation faults.
|
|
249
|
+
*/
|
|
250
|
+
private classifyStaleRejection;
|
|
197
251
|
cancel(actionRef: ActionBlocks, options?: MessageOptions): Promise<void>;
|
|
198
252
|
commit(request: CommitRequest, options?: MessageOptions): Promise<CommitResult>;
|
|
253
|
+
/**
|
|
254
|
+
* Report success for a commit the cluster carried but this peer could not apply locally. The
|
|
255
|
+
* blocks are marked seen so the read path treats them as freshness-checked; convergence comes
|
|
256
|
+
* from replication (cohort reconcile, or read-driven acquisition), not from replay here.
|
|
257
|
+
*/
|
|
258
|
+
private tolerateLocalCommitDivergence;
|
|
199
259
|
}
|
|
200
260
|
export {};
|
|
201
261
|
//# sourceMappingURL=coordinator-repo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"coordinator-repo.d.ts","sourceRoot":"","sources":["../../../src/repo/coordinator-repo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,eAAe,EAAE,UAAU,
|
|
1
|
+
{"version":3,"file":"coordinator-repo.d.ts","sourceRoot":"","sources":["../../../src/repo/coordinator-repo.ts"],"names":[],"mappings":"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"}
|