@optimystic/db-p2p 0.21.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/dist/src/cluster/client.d.ts +10 -0
- package/dist/src/cluster/client.d.ts.map +1 -1
- package/dist/src/cluster/client.js +30 -1
- package/dist/src/cluster/client.js.map +1 -1
- package/dist/src/cluster/cluster-policy.d.ts +13 -2
- package/dist/src/cluster/cluster-policy.d.ts.map +1 -1
- package/dist/src/cluster/cluster-policy.js +51 -4
- package/dist/src/cluster/cluster-policy.js.map +1 -1
- package/dist/src/cluster/cluster-repo.d.ts +42 -17
- package/dist/src/cluster/cluster-repo.d.ts.map +1 -1
- package/dist/src/cluster/cluster-repo.js +229 -122
- package/dist/src/cluster/cluster-repo.js.map +1 -1
- package/dist/src/cluster/cluster-size-coupling.d.ts +28 -0
- package/dist/src/cluster/cluster-size-coupling.d.ts.map +1 -0
- package/dist/src/cluster/cluster-size-coupling.js +35 -0
- package/dist/src/cluster/cluster-size-coupling.js.map +1 -0
- package/dist/src/cluster/quorum-restore.d.ts +6 -0
- package/dist/src/cluster/quorum-restore.d.ts.map +1 -1
- package/dist/src/cluster/quorum-restore.js +1 -1
- package/dist/src/cluster/quorum-restore.js.map +1 -1
- package/dist/src/cluster/reconcile-block.d.ts.map +1 -1
- package/dist/src/cluster/reconcile-block.js +15 -3
- package/dist/src/cluster/reconcile-block.js.map +1 -1
- package/dist/src/cluster/service.d.ts +32 -1
- package/dist/src/cluster/service.d.ts.map +1 -1
- package/dist/src/cluster/service.js +43 -2
- package/dist/src/cluster/service.js.map +1 -1
- package/dist/src/cohort-topic/stream-util.d.ts +22 -6
- package/dist/src/cohort-topic/stream-util.d.ts.map +1 -1
- package/dist/src/cohort-topic/stream-util.js +56 -10
- package/dist/src/cohort-topic/stream-util.js.map +1 -1
- package/dist/src/dispute/dispute-service.d.ts.map +1 -1
- package/dist/src/dispute/dispute-service.js +9 -3
- package/dist/src/dispute/dispute-service.js.map +1 -1
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -0
- package/dist/src/index.js.map +1 -1
- package/dist/src/libp2p-key-network.d.ts +134 -7
- package/dist/src/libp2p-key-network.d.ts.map +1 -1
- package/dist/src/libp2p-key-network.js +174 -37
- package/dist/src/libp2p-key-network.js.map +1 -1
- package/dist/src/libp2p-node-base.d.ts +3 -2
- package/dist/src/libp2p-node-base.d.ts.map +1 -1
- package/dist/src/libp2p-node-base.js +859 -778
- package/dist/src/libp2p-node-base.js.map +1 -1
- package/dist/src/libp2p-node-rn.d.ts +2 -2
- package/dist/src/libp2p-node-rn.d.ts.map +1 -1
- package/dist/src/libp2p-node-rn.js.map +1 -1
- package/dist/src/libp2p-node.d.ts +2 -2
- package/dist/src/libp2p-node.d.ts.map +1 -1
- package/dist/src/libp2p-node.js.map +1 -1
- package/dist/src/logger.d.ts +17 -1
- package/dist/src/logger.d.ts.map +1 -1
- package/dist/src/logger.js +19 -2
- package/dist/src/logger.js.map +1 -1
- package/dist/src/network/network-manager-service.d.ts +2 -0
- package/dist/src/network/network-manager-service.d.ts.map +1 -1
- package/dist/src/network/network-manager-service.js +4 -0
- package/dist/src/network/network-manager-service.js.map +1 -1
- package/dist/src/optimystic-node.d.ts +35 -0
- package/dist/src/optimystic-node.d.ts.map +1 -0
- package/dist/src/optimystic-node.js +2 -0
- package/dist/src/optimystic-node.js.map +1 -0
- package/dist/src/owned-block-seed.d.ts +6 -3
- package/dist/src/owned-block-seed.d.ts.map +1 -1
- package/dist/src/owned-block-seed.js +16 -3
- package/dist/src/owned-block-seed.js.map +1 -1
- package/dist/src/peer-address-book.d.ts +72 -0
- package/dist/src/peer-address-book.d.ts.map +1 -0
- package/dist/src/peer-address-book.js +123 -0
- package/dist/src/peer-address-book.js.map +1 -0
- package/dist/src/repo/client.d.ts.map +1 -1
- package/dist/src/repo/client.js +11 -2
- package/dist/src/repo/client.js.map +1 -1
- package/dist/src/repo/cluster-coordinator.d.ts +30 -0
- package/dist/src/repo/cluster-coordinator.d.ts.map +1 -1
- package/dist/src/repo/cluster-coordinator.js +95 -3
- package/dist/src/repo/cluster-coordinator.js.map +1 -1
- package/dist/src/repo/coordinator-repo.d.ts +78 -14
- package/dist/src/repo/coordinator-repo.d.ts.map +1 -1
- package/dist/src/repo/coordinator-repo.js +266 -81
- package/dist/src/repo/coordinator-repo.js.map +1 -1
- package/dist/src/rn.d.ts +5 -0
- package/dist/src/rn.d.ts.map +1 -1
- package/dist/src/rn.js +5 -0
- package/dist/src/rn.js.map +1 -1
- package/dist/src/storage/block-storage.d.ts.map +1 -1
- package/dist/src/storage/block-storage.js +57 -5
- package/dist/src/storage/block-storage.js.map +1 -1
- package/dist/src/storage/cached-raw-storage.d.ts +83 -0
- package/dist/src/storage/cached-raw-storage.d.ts.map +1 -0
- package/dist/src/storage/cached-raw-storage.js +152 -0
- package/dist/src/storage/cached-raw-storage.js.map +1 -0
- package/dist/src/storage/cached-store-driver.d.ts +186 -0
- package/dist/src/storage/cached-store-driver.d.ts.map +1 -0
- package/dist/src/storage/cached-store-driver.js +775 -0
- package/dist/src/storage/cached-store-driver.js.map +1 -0
- package/dist/src/storage/i-block-storage.d.ts +20 -1
- package/dist/src/storage/i-block-storage.d.ts.map +1 -1
- package/dist/src/storage/i-raw-storage.d.ts +12 -5
- package/dist/src/storage/i-raw-storage.d.ts.map +1 -1
- package/dist/src/storage/shared-cache-pool.d.ts +234 -0
- package/dist/src/storage/shared-cache-pool.d.ts.map +1 -0
- package/dist/src/storage/shared-cache-pool.js +354 -0
- package/dist/src/storage/shared-cache-pool.js.map +1 -0
- package/dist/src/storage/storage-repo.d.ts +56 -3
- package/dist/src/storage/storage-repo.d.ts.map +1 -1
- package/dist/src/storage/storage-repo.js +124 -18
- package/dist/src/storage/storage-repo.js.map +1 -1
- package/dist/src/testing/raw-storage-conformance.d.ts +2 -1
- package/dist/src/testing/raw-storage-conformance.d.ts.map +1 -1
- package/dist/src/testing/raw-storage-conformance.js +52 -2
- package/dist/src/testing/raw-storage-conformance.js.map +1 -1
- package/package.json +3 -3
- package/readme.md +668 -653
- package/src/cluster/block-transfer.ts +424 -424
- package/src/cluster/client.ts +119 -88
- package/src/cluster/cluster-error.ts +64 -64
- package/src/cluster/cluster-policy.ts +203 -152
- package/src/cluster/cluster-repo.ts +245 -125
- package/src/cluster/cluster-size-coupling.ts +45 -0
- package/src/cluster/commit-cert.ts +139 -139
- package/src/cluster/i-transaction-state-store.ts +43 -43
- package/src/cluster/memory-transaction-state-store.ts +56 -56
- package/src/cluster/peer-key-binding.ts +37 -37
- package/src/cluster/persistent-transaction-state-store.ts +92 -92
- package/src/cluster/quorum-restore.ts +223 -223
- package/src/cluster/reconcile-block.ts +203 -191
- package/src/cluster/service.ts +293 -241
- package/src/cluster/supermajority-coupling.ts +37 -37
- package/src/cohort-topic/bootstrap-evidence-builder.ts +122 -122
- package/src/cohort-topic/bootstrap-evidence-verifiers.ts +132 -132
- package/src/cohort-topic/bootstrap-parent-reference.ts +159 -159
- package/src/cohort-topic/change-bridge.ts +109 -109
- package/src/cohort-topic/cohort-gossip-driver.ts +231 -231
- package/src/cohort-topic/cohort-gossip-transport.ts +84 -84
- package/src/cohort-topic/fret-trust-anchor.ts +153 -153
- package/src/cohort-topic/host.ts +2901 -2901
- package/src/cohort-topic/index.ts +13 -13
- package/src/cohort-topic/membership-publish-sink.ts +20 -20
- package/src/cohort-topic/membership-source.ts +68 -68
- package/src/cohort-topic/peer-codec.ts +31 -31
- package/src/cohort-topic/peer-sig.ts +86 -86
- package/src/cohort-topic/protocols.ts +71 -71
- package/src/cohort-topic/reactivity-membership-gate.ts +77 -77
- package/src/cohort-topic/size-estimator.ts +16 -16
- package/src/cohort-topic/stream-util.ts +135 -87
- package/src/cohort-topic/threshold-crypto.ts +239 -239
- package/src/cohort-topic/topic-router.ts +77 -77
- package/src/dispute/arbitrator-selection.ts +138 -138
- package/src/dispute/cascade.ts +524 -524
- package/src/dispute/dispute-service.ts +11 -5
- package/src/dispute/invalidation.ts +625 -625
- package/src/inbound-authorization.ts +190 -190
- package/src/index.ts +52 -47
- package/src/libp2p-key-network.ts +1120 -958
- package/src/libp2p-node-base.ts +1675 -1591
- package/src/libp2p-node-rn.ts +30 -30
- package/src/libp2p-node.ts +36 -36
- package/src/logger.ts +19 -2
- package/src/matchmaking/aggregate-counts.ts +104 -104
- package/src/matchmaking/index.ts +20 -20
- package/src/matchmaking/module.ts +363 -363
- package/src/matchmaking/protocols.ts +51 -51
- package/src/matchmaking/provider-manager.ts +95 -95
- package/src/matchmaking/query-handler.ts +88 -88
- package/src/matchmaking/query-transport.ts +492 -492
- package/src/matchmaking/seeker-manager.ts +64 -64
- package/src/matchmaking/seeker-walk-client.ts +293 -293
- package/src/matchmaking/traffic-validation.ts +195 -195
- package/src/network/network-manager-service.ts +5 -0
- package/src/optimystic-node.ts +36 -0
- package/src/owned-block-seed.ts +53 -40
- package/src/peer-address-book.ts +149 -0
- package/src/protocol-limits.ts +33 -33
- package/src/reactivity/forwarder-host.ts +438 -438
- package/src/reactivity/index.ts +19 -19
- package/src/reactivity/notify-transport.ts +144 -144
- package/src/reactivity/origination-manager.ts +192 -192
- package/src/reactivity/protocols.ts +61 -61
- package/src/reactivity/push-state-gossip.ts +291 -291
- package/src/reactivity/recover-transport.ts +408 -408
- package/src/reactivity/rotation-rereg-scheduler.ts +256 -256
- package/src/reactivity/subscriber-registry.ts +96 -96
- package/src/reactivity/subscription-manager.ts +450 -450
- package/src/reactivity/topic-bytes.ts +37 -37
- package/src/repo/client.ts +12 -2
- package/src/repo/cluster-coordinator.ts +99 -3
- package/src/repo/coordinator-repo.ts +305 -82
- package/src/repo/types.ts +7 -7
- package/src/rn.ts +39 -34
- package/src/rpc-deadline.ts +45 -45
- package/src/storage/arachnode-partition.ts +74 -74
- package/src/storage/block-storage.ts +59 -6
- package/src/storage/cached-raw-storage.ts +180 -0
- package/src/storage/cached-store-driver.ts +859 -0
- package/src/storage/i-block-storage.ts +20 -1
- package/src/storage/i-kv-store.ts +8 -8
- package/src/storage/i-raw-storage.ts +12 -5
- package/src/storage/kv-raw-storage.ts +135 -135
- package/src/storage/memory-kv-store.ts +28 -28
- package/src/storage/memory-storage.ts +25 -25
- package/src/storage/memory-store-driver.ts +157 -157
- package/src/storage/raw-store-codec.ts +42 -42
- package/src/storage/raw-store-driver.ts +80 -80
- package/src/storage/ring-selector.ts +317 -317
- package/src/storage/ring-shift-coordinator.ts +271 -271
- package/src/storage/shared-cache-pool.ts +452 -0
- package/src/storage/storage-repo.ts +1014 -903
- package/src/testing/cohort-topic-mesh-harness.ts +663 -663
- package/src/testing/index.ts +8 -8
- package/src/testing/matchmaking-mesh-harness.ts +475 -475
- package/src/testing/raw-storage-conformance.ts +453 -397
- package/src/testing/reactivity-mesh-harness.ts +922 -922
- package/dist/src/storage/restoration-coordinator-v2.d.ts +0 -67
- package/dist/src/storage/restoration-coordinator-v2.d.ts.map +0 -1
- package/dist/src/storage/restoration-coordinator-v2.js +0 -172
- package/dist/src/storage/restoration-coordinator-v2.js.map +0 -1
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
import type { BlockId } from '@optimystic/db-core';
|
|
2
|
-
import type { BlockArchive, RestoreCallback } from './struct.js';
|
|
3
|
-
import type { IPeerNetwork } from '@optimystic/db-core';
|
|
4
|
-
import type { ArachnodeFretAdapter } from './arachnode-fret-adapter.js';
|
|
5
|
-
/**
|
|
6
|
-
* Coordinates block restoration across discovered Arachnode storage rings.
|
|
7
|
-
*
|
|
8
|
-
* Queries rings in order of broader coverage (inner rings first):
|
|
9
|
-
* 1. Transaction ring peers (my ring)
|
|
10
|
-
* 2. Inner storage rings (Ring N-1, N-2, ..., Ring 0)
|
|
11
|
-
*
|
|
12
|
-
* Each ring is discovered dynamically via FRET neighbor snapshots.
|
|
13
|
-
*/
|
|
14
|
-
export declare class RestorationCoordinator {
|
|
15
|
-
private readonly fretAdapter;
|
|
16
|
-
private readonly peerNetwork;
|
|
17
|
-
private readonly protocolPrefix;
|
|
18
|
-
/** Optional self peer id — used to skip dialing self on solo/bootstrap nodes. */
|
|
19
|
-
private readonly selfPeerId?;
|
|
20
|
-
private readonly metrics;
|
|
21
|
-
constructor(fretAdapter: ArachnodeFretAdapter, peerNetwork: IPeerNetwork, protocolPrefix: string,
|
|
22
|
-
/** Optional self peer id — used to skip dialing self on solo/bootstrap nodes. */
|
|
23
|
-
selfPeerId?: string | undefined);
|
|
24
|
-
private readonly log;
|
|
25
|
-
/**
|
|
26
|
-
* Restore a block by querying discovered storage rings.
|
|
27
|
-
*/
|
|
28
|
-
restore(blockId: BlockId, rev?: number): Promise<BlockArchive | undefined>;
|
|
29
|
-
/**
|
|
30
|
-
* Create a RestoreCallback function that uses this coordinator.
|
|
31
|
-
*/
|
|
32
|
-
createRestoreCallback(): RestoreCallback;
|
|
33
|
-
/**
|
|
34
|
-
* Get peers in my transaction ring for a given block.
|
|
35
|
-
*/
|
|
36
|
-
private getMyRingPeers;
|
|
37
|
-
/**
|
|
38
|
-
* Get my own ring depth from Arachnode info.
|
|
39
|
-
*/
|
|
40
|
-
private getMyRingDepth;
|
|
41
|
-
/**
|
|
42
|
-
* Filter peers by partition responsibility.
|
|
43
|
-
*/
|
|
44
|
-
private filterByPartition;
|
|
45
|
-
/**
|
|
46
|
-
* Extract prefix bits from block ID for partition matching.
|
|
47
|
-
*/
|
|
48
|
-
private extractBlockPrefix;
|
|
49
|
-
/**
|
|
50
|
-
* Query a specific peer for a block.
|
|
51
|
-
*/
|
|
52
|
-
private queryPeer;
|
|
53
|
-
/**
|
|
54
|
-
* Record successful restoration from a ring.
|
|
55
|
-
*/
|
|
56
|
-
private recordSuccess;
|
|
57
|
-
/**
|
|
58
|
-
* Get restoration metrics for monitoring.
|
|
59
|
-
*/
|
|
60
|
-
getMetrics(): {
|
|
61
|
-
totalRequests: number;
|
|
62
|
-
successByRing: Map<number, number>;
|
|
63
|
-
failureByRing: Map<number, number>;
|
|
64
|
-
averageDurationMs: number;
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
//# sourceMappingURL=restoration-coordinator-v2.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"restoration-coordinator-v2.d.ts","sourceRoot":"","sources":["../../../src/storage/restoration-coordinator-v2.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,OAAO,KAAK,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,6BAA6B,CAAC;AAGxE;;;;;;;;GAQG;AACH,qBAAa,sBAAsB;IASjC,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,WAAW;IAC5B,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,iFAAiF;IACjF,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC;IAZ7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAKtB;gBAGgB,WAAW,EAAE,oBAAoB,EACjC,WAAW,EAAE,YAAY,EACzB,cAAc,EAAE,MAAM;IACvC,iFAAiF;IAChE,UAAU,CAAC,EAAE,MAAM,YAAA;IAGrC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAsC;IAE1D;;OAEG;IACG,OAAO,CAAC,OAAO,EAAE,OAAO,EAAE,GAAG,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,SAAS,CAAC;IAkDhF;;OAEG;IACH,qBAAqB,IAAI,eAAe;IAMxC;;OAEG;YACW,cAAc;IAM5B;;OAEG;IACH,OAAO,CAAC,cAAc;IAKtB;;OAEG;IACH,OAAO,CAAC,iBAAiB;IAczB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IAmB1B;;OAEG;YACW,SAAS;IAiBvB;;OAEG;IACH,OAAO,CAAC,aAAa;IAarB;;OAEG;IACH,UAAU,IAAI;QACb,aAAa,EAAE,MAAM,CAAC;QACtB,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,aAAa,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACnC,iBAAiB,EAAE,MAAM,CAAC;KAC1B;CAGD"}
|
|
@@ -1,172 +0,0 @@
|
|
|
1
|
-
import { hashKey } from 'p2p-fret';
|
|
2
|
-
import { peerIdFromString } from '@libp2p/peer-id';
|
|
3
|
-
import { SyncClient } from '../sync/client.js';
|
|
4
|
-
import { createLogger } from '../logger.js';
|
|
5
|
-
/**
|
|
6
|
-
* Coordinates block restoration across discovered Arachnode storage rings.
|
|
7
|
-
*
|
|
8
|
-
* Queries rings in order of broader coverage (inner rings first):
|
|
9
|
-
* 1. Transaction ring peers (my ring)
|
|
10
|
-
* 2. Inner storage rings (Ring N-1, N-2, ..., Ring 0)
|
|
11
|
-
*
|
|
12
|
-
* Each ring is discovered dynamically via FRET neighbor snapshots.
|
|
13
|
-
*/
|
|
14
|
-
export class RestorationCoordinator {
|
|
15
|
-
fretAdapter;
|
|
16
|
-
peerNetwork;
|
|
17
|
-
protocolPrefix;
|
|
18
|
-
selfPeerId;
|
|
19
|
-
metrics = {
|
|
20
|
-
totalRequests: 0,
|
|
21
|
-
successByRing: new Map(),
|
|
22
|
-
failureByRing: new Map(),
|
|
23
|
-
averageDurationMs: 0
|
|
24
|
-
};
|
|
25
|
-
constructor(fretAdapter, peerNetwork, protocolPrefix,
|
|
26
|
-
/** Optional self peer id — used to skip dialing self on solo/bootstrap nodes. */
|
|
27
|
-
selfPeerId) {
|
|
28
|
-
this.fretAdapter = fretAdapter;
|
|
29
|
-
this.peerNetwork = peerNetwork;
|
|
30
|
-
this.protocolPrefix = protocolPrefix;
|
|
31
|
-
this.selfPeerId = selfPeerId;
|
|
32
|
-
}
|
|
33
|
-
log = createLogger('storage:restoration');
|
|
34
|
-
/**
|
|
35
|
-
* Restore a block by querying discovered storage rings.
|
|
36
|
-
*/
|
|
37
|
-
async restore(blockId, rev) {
|
|
38
|
-
const startTime = Date.now();
|
|
39
|
-
this.metrics.totalRequests++;
|
|
40
|
-
// 1. Try my transaction ring peers first
|
|
41
|
-
const myPeers = await this.getMyRingPeers(blockId);
|
|
42
|
-
const myRingDepth = this.getMyRingDepth();
|
|
43
|
-
// Avoid dialing self: on a solo/bootstrap node with no listenAddrs, dialing self
|
|
44
|
-
// either hangs or fails noisily. Filter self out of the ring-peer list so the loop
|
|
45
|
-
// below can no-op cleanly when self is the only candidate.
|
|
46
|
-
const nonSelfMyPeers = this.selfPeerId
|
|
47
|
-
? myPeers.filter(p => p !== this.selfPeerId)
|
|
48
|
-
: myPeers;
|
|
49
|
-
if (nonSelfMyPeers.length === 0 && myRingDepth <= 0) {
|
|
50
|
-
this.log('restore:solo-node-skip blockId=%s', blockId);
|
|
51
|
-
return undefined;
|
|
52
|
-
}
|
|
53
|
-
for (const peerId of nonSelfMyPeers) {
|
|
54
|
-
const archive = await this.queryPeer(peerId, blockId, rev);
|
|
55
|
-
if (archive) {
|
|
56
|
-
this.recordSuccess(myRingDepth, blockId, Date.now() - startTime);
|
|
57
|
-
return archive;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
// 2. Try inner storage rings (broader coverage)
|
|
61
|
-
for (let ringDepth = myRingDepth - 1; ringDepth >= 0; ringDepth--) {
|
|
62
|
-
const storagePeers = this.fretAdapter.findPeersAtRing(ringDepth);
|
|
63
|
-
// Filter to peers responsible for this block's partition (skip self — cannot dial self).
|
|
64
|
-
const responsiblePeers = this.filterByPartition(storagePeers, blockId, ringDepth)
|
|
65
|
-
.filter(p => !this.selfPeerId || p !== this.selfPeerId);
|
|
66
|
-
for (const peerIdStr of responsiblePeers) {
|
|
67
|
-
const archive = await this.queryPeer(peerIdStr, blockId, rev);
|
|
68
|
-
if (archive) {
|
|
69
|
-
this.recordSuccess(ringDepth, blockId, Date.now() - startTime);
|
|
70
|
-
return archive;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
// No ring had the data
|
|
75
|
-
const duration = Date.now() - startTime;
|
|
76
|
-
this.log('restore failed for block %s after %dms', blockId, duration);
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Create a RestoreCallback function that uses this coordinator.
|
|
81
|
-
*/
|
|
82
|
-
createRestoreCallback() {
|
|
83
|
-
return async (blockId, rev) => {
|
|
84
|
-
return await this.restore(blockId, rev);
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Get peers in my transaction ring for a given block.
|
|
89
|
-
*/
|
|
90
|
-
async getMyRingPeers(blockId) {
|
|
91
|
-
const blockIdBytes = new TextEncoder().encode(blockId);
|
|
92
|
-
const coord = await hashKey(blockIdBytes);
|
|
93
|
-
return this.fretAdapter.getFret().assembleCohort(coord, 10);
|
|
94
|
-
}
|
|
95
|
-
/**
|
|
96
|
-
* Get my own ring depth from Arachnode info.
|
|
97
|
-
*/
|
|
98
|
-
getMyRingDepth() {
|
|
99
|
-
const myInfo = this.fretAdapter.getMyArachnodeInfo();
|
|
100
|
-
return myInfo?.ringDepth ?? 8; // Default to Ring 8
|
|
101
|
-
}
|
|
102
|
-
/**
|
|
103
|
-
* Filter peers by partition responsibility.
|
|
104
|
-
*/
|
|
105
|
-
filterByPartition(peers, blockId, ringDepth) {
|
|
106
|
-
if (ringDepth === 0) {
|
|
107
|
-
return peers; // Ring 0 covers all blocks
|
|
108
|
-
}
|
|
109
|
-
const blockPrefix = this.extractBlockPrefix(blockId, ringDepth);
|
|
110
|
-
return peers.filter(peerId => {
|
|
111
|
-
const info = this.fretAdapter.getArachnodeInfo(peerId);
|
|
112
|
-
if (!info || !info.partition)
|
|
113
|
-
return false;
|
|
114
|
-
return info.partition.prefixValue === blockPrefix;
|
|
115
|
-
});
|
|
116
|
-
}
|
|
117
|
-
/**
|
|
118
|
-
* Extract prefix bits from block ID for partition matching.
|
|
119
|
-
*/
|
|
120
|
-
extractBlockPrefix(blockId, bits) {
|
|
121
|
-
const bytes = new TextEncoder().encode(blockId);
|
|
122
|
-
// Hash the block ID to get uniform distribution
|
|
123
|
-
const hash = new Uint8Array(32);
|
|
124
|
-
for (let i = 0; i < Math.min(bytes.length, hash.length); i++) {
|
|
125
|
-
hash[i] = bytes[i];
|
|
126
|
-
}
|
|
127
|
-
// Extract first N bits
|
|
128
|
-
let value = 0;
|
|
129
|
-
for (let i = 0; i < bits; i++) {
|
|
130
|
-
const byteIndex = Math.floor(i / 8);
|
|
131
|
-
const bitIndex = 7 - (i % 8);
|
|
132
|
-
const bit = (hash[byteIndex] >> bitIndex) & 1;
|
|
133
|
-
value = (value << 1) | bit;
|
|
134
|
-
}
|
|
135
|
-
return value;
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Query a specific peer for a block.
|
|
139
|
-
*/
|
|
140
|
-
async queryPeer(peerIdStr, blockId, rev) {
|
|
141
|
-
try {
|
|
142
|
-
const peerId = peerIdFromString(peerIdStr);
|
|
143
|
-
const client = new SyncClient(peerId, this.peerNetwork, this.protocolPrefix);
|
|
144
|
-
const response = await client.requestBlock({ blockId, rev });
|
|
145
|
-
return response.success ? response.archive : undefined;
|
|
146
|
-
}
|
|
147
|
-
catch (error) {
|
|
148
|
-
this.log('queryPeer failed for %s - %o', peerIdStr, error);
|
|
149
|
-
return undefined;
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
/**
|
|
153
|
-
* Record successful restoration from a ring.
|
|
154
|
-
*/
|
|
155
|
-
recordSuccess(ringDepth, blockId, durationMs) {
|
|
156
|
-
const count = this.metrics.successByRing.get(ringDepth) ?? 0;
|
|
157
|
-
this.metrics.successByRing.set(ringDepth, count + 1);
|
|
158
|
-
// Update rolling average duration
|
|
159
|
-
const totalSuccesses = Array.from(this.metrics.successByRing.values())
|
|
160
|
-
.reduce((sum, c) => sum + c, 0);
|
|
161
|
-
const prevTotal = this.metrics.averageDurationMs * (totalSuccesses - 1);
|
|
162
|
-
this.metrics.averageDurationMs = (prevTotal + durationMs) / totalSuccesses;
|
|
163
|
-
this.log('[Ring %d] Successfully restored block %s in %dms', ringDepth, blockId, durationMs);
|
|
164
|
-
}
|
|
165
|
-
/**
|
|
166
|
-
* Get restoration metrics for monitoring.
|
|
167
|
-
*/
|
|
168
|
-
getMetrics() {
|
|
169
|
-
return { ...this.metrics };
|
|
170
|
-
}
|
|
171
|
-
}
|
|
172
|
-
//# sourceMappingURL=restoration-coordinator-v2.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"restoration-coordinator-v2.js","sourceRoot":"","sources":["../../../src/storage/restoration-coordinator-v2.ts"],"names":[],"mappings":"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"}
|