@peerbit/pubsub 5.4.8 → 5.4.11
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/fanout-tree.d.ts +11 -1
- package/dist/src/fanout-tree.d.ts.map +1 -1
- package/dist/src/fanout-tree.js +228 -38
- package/dist/src/fanout-tree.js.map +1 -1
- package/dist/src/index.d.ts +11 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +641 -141
- package/dist/src/index.js.map +1 -1
- package/package.json +5 -5
- package/src/fanout-tree.ts +301 -42
- package/src/index.ts +899 -190
|
@@ -371,7 +371,7 @@ export type FanoutTreeJoinOptions = {
|
|
|
371
371
|
*/
|
|
372
372
|
parentUpgradeStaleRootProbeProbability?: number;
|
|
373
373
|
/**
|
|
374
|
-
* How long to wait for a parent probe reply
|
|
374
|
+
* How long to wait for a candidate or idle-parent probe reply.
|
|
375
375
|
*/
|
|
376
376
|
parentProbeTimeoutMs?: number;
|
|
377
377
|
/**
|
|
@@ -525,6 +525,11 @@ export interface FanoutTreeEvents extends StreamEvents {
|
|
|
525
525
|
root: string;
|
|
526
526
|
parent: string;
|
|
527
527
|
}>;
|
|
528
|
+
"fanout:child-joined": CustomEvent<{
|
|
529
|
+
topic: string;
|
|
530
|
+
root: string;
|
|
531
|
+
child: string;
|
|
532
|
+
}>;
|
|
528
533
|
"fanout:kicked": CustomEvent<{
|
|
529
534
|
topic: string;
|
|
530
535
|
root: string;
|
|
@@ -544,6 +549,7 @@ export declare class FanoutTree extends DirectStream<FanoutTreeEvents> {
|
|
|
544
549
|
private channelsBySuffixKey;
|
|
545
550
|
private readonly cachedSuffixKey;
|
|
546
551
|
private readonly metricsBySuffixKey;
|
|
552
|
+
private readonly providerControlMetrics;
|
|
547
553
|
private readonly joinTimeoutStreakByPeer;
|
|
548
554
|
private readonly joinResetCooldownUntilByPeer;
|
|
549
555
|
private bootstraps;
|
|
@@ -574,6 +580,7 @@ export declare class FanoutTree extends DirectStream<FanoutTreeEvents> {
|
|
|
574
580
|
private pruneTrackerNamespaceIfEmpty;
|
|
575
581
|
private touchProviderNamespace;
|
|
576
582
|
private pruneProviderNamespaceIfEmpty;
|
|
583
|
+
private touchProviderWatchers;
|
|
577
584
|
private pruneProviderWatchersIfEmpty;
|
|
578
585
|
private getProviderCandidatesFromCache;
|
|
579
586
|
/** Decoded provider entries (raw multiaddr bytes) -> candidates. Invalid
|
|
@@ -710,6 +717,8 @@ export declare class FanoutTree extends DirectStream<FanoutTreeEvents> {
|
|
|
710
717
|
private makeDataId;
|
|
711
718
|
private getSuffixKeyFromId;
|
|
712
719
|
private getMetricsForSuffixKey;
|
|
720
|
+
private storeDetachedMetrics;
|
|
721
|
+
private getControlMetrics;
|
|
713
722
|
private recordControlSend;
|
|
714
723
|
private recordControlReceive;
|
|
715
724
|
private markCached;
|
|
@@ -721,6 +730,7 @@ export declare class FanoutTree extends DirectStream<FanoutTreeEvents> {
|
|
|
721
730
|
private refillUploadTokens;
|
|
722
731
|
private refillNeighborRepairTokens;
|
|
723
732
|
private takeIngressBudget;
|
|
733
|
+
private setIngressBucket;
|
|
724
734
|
private _sendData;
|
|
725
735
|
private _forwardDataMessage;
|
|
726
736
|
private noteReceivedSeq;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fanout-tree.d.ts","sourceRoot":"","sources":["../../src/fanout-tree.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fanout-tree.d.ts","sourceRoot":"","sources":["../../src/fanout-tree.ts"],"names":[],"mappings":"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"}
|
package/dist/src/fanout-tree.js
CHANGED
|
@@ -32,6 +32,19 @@ const PROVIDER_DIRECTORY_MAX_NAMESPACES = 4_096;
|
|
|
32
32
|
// large networks can cause unbounded memory growth on the tracker nodes.
|
|
33
33
|
const TRACKER_DIRECTORY_MAX_ENTRIES = 16_384;
|
|
34
34
|
const TRACKER_DIRECTORY_MAX_NAMESPACES = 4_096;
|
|
35
|
+
// Best-effort bound on per-key control metrics for keys without an open channel.
|
|
36
|
+
// Every inbound control frame is recorded under its key, including tracker frames
|
|
37
|
+
// for channels we do not host, so bootstraps/relays see an open-ended key set.
|
|
38
|
+
// Open channels keep their metrics on the channel and are never evicted.
|
|
39
|
+
const DETACHED_METRICS_MAX_KEYS = 4_096;
|
|
40
|
+
// Best-effort bounds for provider watches and namespace names. Provider namespaces
|
|
41
|
+
// are commonly per block (`cid:<cid>`), so anything keyed by them must be bounded.
|
|
42
|
+
const PROVIDER_WATCH_MAX_NAMESPACES = 4_096;
|
|
43
|
+
const PROVIDER_NAMESPACE_NAME_MAX_ENTRIES = 16_384;
|
|
44
|
+
// Per-channel ingress token buckets (proxy-publish/unicast) are kept for recent
|
|
45
|
+
// senders only: a few multiples of the child limit, with a small floor.
|
|
46
|
+
const INGRESS_BUCKETS_MIN_ENTRIES = 64;
|
|
47
|
+
const INGRESS_BUCKETS_PER_CHILD = 4;
|
|
35
48
|
const FANOUT_PROTOCOLS = ["/peerbit/fanout-tree/0.5.0"];
|
|
36
49
|
const ID_PREFIX = Uint8Array.from([0x46, 0x4f, 0x55, 0x54]); // "FOUT"
|
|
37
50
|
const OVERLOAD_KICK_STREAK_THRESHOLD = 5;
|
|
@@ -44,6 +57,7 @@ const DATA_WRITE_FAIL_KICK_COOLDOWN_MS = 2_000;
|
|
|
44
57
|
const DATA_WRITE_FAIL_KICK_MAX_PER_EVENT = 4;
|
|
45
58
|
const PARENT_REPAIR_DEAD_STREAK_THRESHOLD = 16;
|
|
46
59
|
const PARENT_REPAIR_DEAD_MIN_LIVENESS_MS = 15_000;
|
|
60
|
+
const PARENT_IDLE_PROBE_INTERVAL_MS = 5_000;
|
|
47
61
|
const REPAIR_RETRY_MIN_MS = 1_000;
|
|
48
62
|
const REPAIR_RETRY_INTERVAL_FACTOR = 5;
|
|
49
63
|
// A stream can remain locally readable/writable while silently dropping every
|
|
@@ -135,6 +149,7 @@ const createEmptyMetrics = () => ({
|
|
|
135
149
|
reparentUpgradeSkipProbeOverloaded: 0,
|
|
136
150
|
reparentUpgradeSkipProbeCooldown: 0,
|
|
137
151
|
parentProbeReqSent: 0,
|
|
152
|
+
parentHealthProbeReqSent: 0,
|
|
138
153
|
parentProbeReqReceived: 0,
|
|
139
154
|
parentProbeReplySent: 0,
|
|
140
155
|
parentProbeReplyReceived: 0,
|
|
@@ -190,10 +205,21 @@ const isDataId = (id) => id.length === 32 &&
|
|
|
190
205
|
id[1] === ID_PREFIX[1] &&
|
|
191
206
|
id[2] === ID_PREFIX[2] &&
|
|
192
207
|
id[3] === ID_PREFIX[3];
|
|
208
|
+
const isProviderControlKind = (kind) => kind === MSG_PROVIDER_ANNOUNCE ||
|
|
209
|
+
kind === MSG_PROVIDER_QUERY ||
|
|
210
|
+
kind === MSG_PROVIDER_REPLY ||
|
|
211
|
+
kind === MSG_PROVIDER_SUBSCRIBE ||
|
|
212
|
+
kind === MSG_PROVIDER_UNSUBSCRIBE ||
|
|
213
|
+
kind === MSG_PROVIDER_NOTIFY;
|
|
193
214
|
export class FanoutTree extends DirectStream {
|
|
194
215
|
channelsBySuffixKey = new Map();
|
|
195
216
|
cachedSuffixKey = new WeakMap();
|
|
217
|
+
// Metrics for keys without an open channel, in LRU order (oldest first) and
|
|
218
|
+
// bounded by DETACHED_METRICS_MAX_KEYS. Open channels own `ch.metrics`.
|
|
196
219
|
metricsBySuffixKey = new Map();
|
|
220
|
+
// Provider control frames are keyed per provider namespace (often per block),
|
|
221
|
+
// which no channel metrics lookup can address, so they share one aggregate.
|
|
222
|
+
providerControlMetrics = createEmptyMetrics();
|
|
197
223
|
joinTimeoutStreakByPeer = new Map();
|
|
198
224
|
joinResetCooldownUntilByPeer = new Map();
|
|
199
225
|
bootstraps = [];
|
|
@@ -341,6 +367,20 @@ export class FanoutTree extends DirectStream {
|
|
|
341
367
|
this.pendingProviderQueryBySuffixKey.delete(suffixKey);
|
|
342
368
|
}
|
|
343
369
|
}
|
|
370
|
+
touchProviderWatchers(suffixKey) {
|
|
371
|
+
// LRU touch
|
|
372
|
+
const watchers = this.providerWatchersBySuffixKey.get(suffixKey) ??
|
|
373
|
+
new Map();
|
|
374
|
+
this.providerWatchersBySuffixKey.delete(suffixKey);
|
|
375
|
+
this.providerWatchersBySuffixKey.set(suffixKey, watchers);
|
|
376
|
+
while (this.providerWatchersBySuffixKey.size > PROVIDER_WATCH_MAX_NAMESPACES) {
|
|
377
|
+
const oldest = this.providerWatchersBySuffixKey.keys().next().value;
|
|
378
|
+
if (oldest === undefined)
|
|
379
|
+
break;
|
|
380
|
+
this.providerWatchersBySuffixKey.delete(oldest);
|
|
381
|
+
}
|
|
382
|
+
return watchers;
|
|
383
|
+
}
|
|
344
384
|
pruneProviderWatchersIfEmpty(suffixKey) {
|
|
345
385
|
const watchers = this.providerWatchersBySuffixKey.get(suffixKey);
|
|
346
386
|
if (watchers && watchers.size === 0) {
|
|
@@ -465,7 +505,16 @@ export class FanoutTree extends DirectStream {
|
|
|
465
505
|
getProviderNamespaceId(namespace) {
|
|
466
506
|
const key = sha256Sync(textEncoder.encode(`provider|${namespace}`));
|
|
467
507
|
const suffixKey = toBase64(key.subarray(0, 24));
|
|
508
|
+
// LRU touch: every announced block adds a namespace, so keep this bounded.
|
|
509
|
+
this.providerNamespaceBySuffixKey.delete(suffixKey);
|
|
468
510
|
this.providerNamespaceBySuffixKey.set(suffixKey, namespace);
|
|
511
|
+
while (this.providerNamespaceBySuffixKey.size >
|
|
512
|
+
PROVIDER_NAMESPACE_NAME_MAX_ENTRIES) {
|
|
513
|
+
const oldest = this.providerNamespaceBySuffixKey.keys().next().value;
|
|
514
|
+
if (oldest === undefined)
|
|
515
|
+
break;
|
|
516
|
+
this.providerNamespaceBySuffixKey.delete(oldest);
|
|
517
|
+
}
|
|
469
518
|
return { namespace, key, suffixKey };
|
|
470
519
|
}
|
|
471
520
|
getProviderNamespaceIdFromKey(key, suffixKey = toBase64(key.subarray(0, 24))) {
|
|
@@ -1037,6 +1086,9 @@ export class FanoutTree extends DirectStream {
|
|
|
1037
1086
|
lastTrackerQueryAt: 0,
|
|
1038
1087
|
};
|
|
1039
1088
|
this.channelsBySuffixKey.set(id.suffixKey, ch);
|
|
1089
|
+
// The open channel now owns its metrics; take them out of the detached LRU
|
|
1090
|
+
// so they can never be evicted while the channel is open.
|
|
1091
|
+
this.metricsBySuffixKey.delete(id.suffixKey);
|
|
1040
1092
|
const needsAnnounceLoop = ch.effectiveMaxChildren > 0;
|
|
1041
1093
|
if (needsAnnounceLoop) {
|
|
1042
1094
|
ch.announceLoop = this._announceLoop(ch).catch(() => { });
|
|
@@ -1204,6 +1256,12 @@ export class FanoutTree extends DirectStream {
|
|
|
1204
1256
|
if (!peerHash)
|
|
1205
1257
|
return;
|
|
1206
1258
|
this.joinTimeoutStreakByPeer.delete(peerHash);
|
|
1259
|
+
// A disconnected watcher can no longer receive provider notifications.
|
|
1260
|
+
for (const [suffixKey, watchers] of this.providerWatchersBySuffixKey) {
|
|
1261
|
+
if (watchers.delete(peerHash) && watchers.size === 0) {
|
|
1262
|
+
this.providerWatchersBySuffixKey.delete(suffixKey);
|
|
1263
|
+
}
|
|
1264
|
+
}
|
|
1207
1265
|
// Detach from a disconnected parent immediately, so children can rejoin.
|
|
1208
1266
|
// This is more reliable than polling `getConnections()` because the underlay
|
|
1209
1267
|
// can flap/reconnect faster than the join loop cadence.
|
|
@@ -1286,6 +1344,8 @@ export class FanoutTree extends DirectStream {
|
|
|
1286
1344
|
ch.routeByPeer.clear();
|
|
1287
1345
|
this.channelsBySuffixKey.delete(id.suffixKey);
|
|
1288
1346
|
this.trackerBySuffixKey.delete(id.suffixKey);
|
|
1347
|
+
// Keep the counters readable after close (and across a reopen), bounded.
|
|
1348
|
+
this.storeDetachedMetrics(id.suffixKey, ch.metrics);
|
|
1289
1349
|
await Promise.all(pendingSends);
|
|
1290
1350
|
}
|
|
1291
1351
|
getChannelStats(topic, root) {
|
|
@@ -2265,21 +2325,45 @@ export class FanoutTree extends DirectStream {
|
|
|
2265
2325
|
return key;
|
|
2266
2326
|
}
|
|
2267
2327
|
getMetricsForSuffixKey(suffixKey) {
|
|
2268
|
-
|
|
2269
|
-
if (
|
|
2270
|
-
|
|
2271
|
-
|
|
2272
|
-
|
|
2328
|
+
const ch = this.channelsBySuffixKey.get(suffixKey);
|
|
2329
|
+
if (ch)
|
|
2330
|
+
return ch.metrics;
|
|
2331
|
+
const m = this.metricsBySuffixKey.get(suffixKey) ?? createEmptyMetrics();
|
|
2332
|
+
this.storeDetachedMetrics(suffixKey, m);
|
|
2273
2333
|
return m;
|
|
2274
2334
|
}
|
|
2275
|
-
|
|
2335
|
+
storeDetachedMetrics(suffixKey, metrics) {
|
|
2336
|
+
// LRU touch
|
|
2337
|
+
this.metricsBySuffixKey.delete(suffixKey);
|
|
2338
|
+
this.metricsBySuffixKey.set(suffixKey, metrics);
|
|
2339
|
+
while (this.metricsBySuffixKey.size > DETACHED_METRICS_MAX_KEYS) {
|
|
2340
|
+
const oldest = this.metricsBySuffixKey.keys().next().value;
|
|
2341
|
+
if (oldest === undefined)
|
|
2342
|
+
break;
|
|
2343
|
+
this.metricsBySuffixKey.delete(oldest);
|
|
2344
|
+
}
|
|
2345
|
+
}
|
|
2346
|
+
getControlMetrics(suffixKey, kind) {
|
|
2347
|
+
return isProviderControlKind(kind)
|
|
2348
|
+
? this.providerControlMetrics
|
|
2349
|
+
: this.getMetricsForSuffixKey(suffixKey);
|
|
2350
|
+
}
|
|
2351
|
+
/**
|
|
2352
|
+
* Returns aggregate diagnostic counters for provider control frames.
|
|
2353
|
+
*
|
|
2354
|
+
* @internal
|
|
2355
|
+
*/
|
|
2356
|
+
getProviderControlMetrics() {
|
|
2357
|
+
return this.providerControlMetrics;
|
|
2358
|
+
}
|
|
2359
|
+
recordControlSend(bytes, transmissions, probePurpose = "upgrade") {
|
|
2276
2360
|
if (transmissions <= 0)
|
|
2277
2361
|
return;
|
|
2278
2362
|
if (bytes.length < 1 + 24)
|
|
2279
2363
|
return;
|
|
2280
2364
|
const kind = bytes[0];
|
|
2281
2365
|
const suffixKey = toBase64(bytes.subarray(1, 25));
|
|
2282
|
-
const m = this.
|
|
2366
|
+
const m = this.getControlMetrics(suffixKey, kind);
|
|
2283
2367
|
m.controlSends += transmissions;
|
|
2284
2368
|
const sentBytes = bytes.byteLength * transmissions;
|
|
2285
2369
|
m.controlBytesSent += sentBytes;
|
|
@@ -2334,6 +2418,9 @@ export class FanoutTree extends DirectStream {
|
|
|
2334
2418
|
break;
|
|
2335
2419
|
case MSG_PARENT_PROBE_REQ:
|
|
2336
2420
|
m.parentProbeReqSent += transmissions;
|
|
2421
|
+
if (probePurpose === "health") {
|
|
2422
|
+
m.parentHealthProbeReqSent += transmissions;
|
|
2423
|
+
}
|
|
2337
2424
|
m.controlBytesSentJoin += sentBytes;
|
|
2338
2425
|
break;
|
|
2339
2426
|
case MSG_PARENT_PROBE_REPLY:
|
|
@@ -2353,7 +2440,7 @@ export class FanoutTree extends DirectStream {
|
|
|
2353
2440
|
}
|
|
2354
2441
|
}
|
|
2355
2442
|
recordControlReceive(suffixKey, kind, bytesReceived) {
|
|
2356
|
-
const m = this.
|
|
2443
|
+
const m = this.getControlMetrics(suffixKey, kind);
|
|
2357
2444
|
m.controlReceives += 1;
|
|
2358
2445
|
m.controlBytesReceived += bytesReceived;
|
|
2359
2446
|
switch (kind) {
|
|
@@ -2473,14 +2560,14 @@ export class FanoutTree extends DirectStream {
|
|
|
2473
2560
|
// Best-effort reset. The join loop keeps retrying other candidates.
|
|
2474
2561
|
}
|
|
2475
2562
|
}
|
|
2476
|
-
async _sendControl(to, bytes, signal) {
|
|
2563
|
+
async _sendControl(to, bytes, signal, probePurpose = "upgrade") {
|
|
2477
2564
|
if (signal?.aborted) {
|
|
2478
2565
|
throw signal.reason ?? new AbortError("fanout control send aborted");
|
|
2479
2566
|
}
|
|
2480
2567
|
const stream = this.peers.get(to);
|
|
2481
2568
|
if (!stream)
|
|
2482
2569
|
return;
|
|
2483
|
-
this.recordControlSend(bytes, 1);
|
|
2570
|
+
this.recordControlSend(bytes, 1, probePurpose);
|
|
2484
2571
|
const message = await this.createMessage(bytes, {
|
|
2485
2572
|
mode: new AnyWhere(),
|
|
2486
2573
|
priority: CONTROL_PRIORITY,
|
|
@@ -2550,16 +2637,26 @@ export class FanoutTree extends DirectStream {
|
|
|
2550
2637
|
tokens = Math.min(capacity, tokens + (elapsedMs * budgetBps) / 1_000);
|
|
2551
2638
|
}
|
|
2552
2639
|
if (tokens < costBytes) {
|
|
2553
|
-
|
|
2554
|
-
byPeer.delete(fromHash);
|
|
2555
|
-
byPeer.set(fromHash, { tokens, lastRefillAt: now });
|
|
2640
|
+
this.setIngressBucket(ch, byPeer, fromHash, { tokens, lastRefillAt: now });
|
|
2556
2641
|
return false;
|
|
2557
2642
|
}
|
|
2558
2643
|
tokens -= costBytes;
|
|
2559
|
-
|
|
2560
|
-
byPeer.set(fromHash, { tokens, lastRefillAt: now });
|
|
2644
|
+
this.setIngressBucket(ch, byPeer, fromHash, { tokens, lastRefillAt: now });
|
|
2561
2645
|
return true;
|
|
2562
2646
|
}
|
|
2647
|
+
setIngressBucket(ch, byPeer, fromHash, bucket) {
|
|
2648
|
+
// LRU touch, capped: long-lived (pinned) roots see an open-ended set of
|
|
2649
|
+
// children over time, and buckets are not dropped when a child leaves.
|
|
2650
|
+
byPeer.delete(fromHash);
|
|
2651
|
+
byPeer.set(fromHash, bucket);
|
|
2652
|
+
const maxBuckets = Math.max(INGRESS_BUCKETS_MIN_ENTRIES, ch.maxChildren * INGRESS_BUCKETS_PER_CHILD);
|
|
2653
|
+
while (byPeer.size > maxBuckets) {
|
|
2654
|
+
const oldest = byPeer.keys().next().value;
|
|
2655
|
+
if (oldest === undefined)
|
|
2656
|
+
break;
|
|
2657
|
+
byPeer.delete(oldest);
|
|
2658
|
+
}
|
|
2659
|
+
}
|
|
2563
2660
|
async _sendData(ch, to, seq, payload) {
|
|
2564
2661
|
this.markCached(ch, seq, payload);
|
|
2565
2662
|
ch.maxSeqSeen = Math.max(ch.maxSeqSeen, seq);
|
|
@@ -3895,21 +3992,47 @@ export class FanoutTree extends DirectStream {
|
|
|
3895
3992
|
reservationToken,
|
|
3896
3993
|
});
|
|
3897
3994
|
}
|
|
3898
|
-
async probeParentCandidate(ch, parentHash, timeoutMs, signal, minFreeSlots = 0, reserveRootCapacity = true) {
|
|
3899
|
-
|
|
3995
|
+
async probeParentCandidate(ch, parentHash, timeoutMs, signal, minFreeSlots = 0, reserveRootCapacity = true, purpose = "upgrade") {
|
|
3996
|
+
const peer = this.peers.get(parentHash);
|
|
3997
|
+
if (!peer)
|
|
3900
3998
|
return;
|
|
3901
|
-
const
|
|
3902
|
-
|
|
3903
|
-
|
|
3904
|
-
|
|
3905
|
-
|
|
3906
|
-
|
|
3907
|
-
|
|
3908
|
-
|
|
3909
|
-
|
|
3910
|
-
|
|
3911
|
-
|
|
3912
|
-
|
|
3999
|
+
const controller = new AbortController();
|
|
4000
|
+
let reqId = (this.random() * 0xffffffff) >>> 0;
|
|
4001
|
+
while (ch.pendingParentProbe.has(reqId))
|
|
4002
|
+
reqId = (reqId + 1) >>> 0;
|
|
4003
|
+
let pending;
|
|
4004
|
+
let onAbort;
|
|
4005
|
+
let timer;
|
|
4006
|
+
try {
|
|
4007
|
+
return await new Promise((resolve, reject) => {
|
|
4008
|
+
pending = { peer, resolve };
|
|
4009
|
+
ch.pendingParentProbe.set(reqId, pending);
|
|
4010
|
+
onAbort = () => {
|
|
4011
|
+
const reason = signal.reason ?? new AbortError("fanout probe aborted");
|
|
4012
|
+
controller.abort(reason);
|
|
4013
|
+
reject(reason);
|
|
4014
|
+
};
|
|
4015
|
+
signal.addEventListener("abort", onAbort, { once: true });
|
|
4016
|
+
if (signal.aborted)
|
|
4017
|
+
return onAbort();
|
|
4018
|
+
// Bound signing/queueing as well as the reply; a stuck send must not
|
|
4019
|
+
// prevent the join loop from recovering or closing the channel.
|
|
4020
|
+
timer = setTimeout(() => {
|
|
4021
|
+
controller.abort(new AbortError("fanout probe timed out"));
|
|
4022
|
+
resolve(undefined);
|
|
4023
|
+
}, Math.max(1, timeoutMs));
|
|
4024
|
+
timer.unref?.();
|
|
4025
|
+
void this._sendControl(parentHash, this.codec.encodeParentProbeReq(ch.id.key, reqId, minFreeSlots, reserveRootCapacity), controller.signal, purpose).catch(() => resolve(undefined));
|
|
4026
|
+
});
|
|
4027
|
+
}
|
|
4028
|
+
finally {
|
|
4029
|
+
clearTimeout(timer);
|
|
4030
|
+
signal.removeEventListener("abort", onAbort);
|
|
4031
|
+
if (ch.pendingParentProbe.get(reqId) === pending) {
|
|
4032
|
+
ch.pendingParentProbe.delete(reqId);
|
|
4033
|
+
}
|
|
4034
|
+
controller.abort(new AbortError("fanout probe settled"));
|
|
4035
|
+
}
|
|
3913
4036
|
}
|
|
3914
4037
|
async _joinLoop(ch, joinOpts) {
|
|
3915
4038
|
const retryMs = Math.max(1, Math.floor(joinOpts.retryMs ?? 200));
|
|
@@ -3972,6 +4095,8 @@ export class FanoutTree extends DirectStream {
|
|
|
3972
4095
|
throwInitialJoinTimeout();
|
|
3973
4096
|
};
|
|
3974
4097
|
let nextParentUpgradeCheckAt = 0;
|
|
4098
|
+
let nextParentHealthProbeAt = 0;
|
|
4099
|
+
let failedParentProbe;
|
|
3975
4100
|
let parentUpgradeCheckSeq = 0;
|
|
3976
4101
|
let parentUpgradeActiveGuardBackoffMs = 0;
|
|
3977
4102
|
const unsuccessfulColdBootstrapPeers = new Set();
|
|
@@ -4033,8 +4158,10 @@ export class FanoutTree extends DirectStream {
|
|
|
4033
4158
|
}
|
|
4034
4159
|
// Parent disappeared? Rejoin.
|
|
4035
4160
|
if (ch.parent) {
|
|
4036
|
-
const
|
|
4161
|
+
const parentHash = ch.parent;
|
|
4162
|
+
const parentPeer = this.peers.get(parentHash);
|
|
4037
4163
|
let connected = false;
|
|
4164
|
+
let probeFailed = false;
|
|
4038
4165
|
if (parentPeer) {
|
|
4039
4166
|
try {
|
|
4040
4167
|
const conns = this.components.connectionManager.getConnections(parentPeer.peerId);
|
|
@@ -4044,8 +4171,49 @@ export class FanoutTree extends DirectStream {
|
|
|
4044
4171
|
connected = parentPeer.isReadable || parentPeer.isWritable;
|
|
4045
4172
|
}
|
|
4046
4173
|
}
|
|
4174
|
+
const now = Date.now();
|
|
4175
|
+
if (now - ch.lastParentDataAt < PARENT_IDLE_PROBE_INTERVAL_MS) {
|
|
4176
|
+
failedParentProbe = undefined;
|
|
4177
|
+
}
|
|
4178
|
+
else if (connected &&
|
|
4179
|
+
parentPeer &&
|
|
4180
|
+
now >= nextParentHealthProbeAt) {
|
|
4181
|
+
const route = ch.routeFromRoot;
|
|
4182
|
+
const lastDataAt = ch.lastParentDataAt;
|
|
4183
|
+
const reply = await this.probeParentCandidate(ch, parentHash, parentUpgrade.probe.timeoutMs, signal, 0, false, "health");
|
|
4184
|
+
if (ch.closed ||
|
|
4185
|
+
signal.aborted ||
|
|
4186
|
+
this.channelsBySuffixKey.get(ch.id.suffixKey) !== ch ||
|
|
4187
|
+
ch.parent !== parentHash ||
|
|
4188
|
+
ch.routeFromRoot !== route ||
|
|
4189
|
+
this.peers.get(parentHash) !== parentPeer) {
|
|
4190
|
+
failedParentProbe = undefined;
|
|
4191
|
+
continue;
|
|
4192
|
+
}
|
|
4193
|
+
nextParentHealthProbeAt = Date.now() + PARENT_IDLE_PROBE_INTERVAL_MS;
|
|
4194
|
+
// A full parent is still healthy. Do not reserve capacity or
|
|
4195
|
+
// refresh lastParentDataAt: probes must not mask stalled data.
|
|
4196
|
+
if (reply || ch.lastParentDataAt !== lastDataAt) {
|
|
4197
|
+
failedParentProbe = undefined;
|
|
4198
|
+
}
|
|
4199
|
+
else if (failedParentProbe?.peer === parentPeer &&
|
|
4200
|
+
failedParentProbe.route === route) {
|
|
4201
|
+
probeFailed = true;
|
|
4202
|
+
connected = false;
|
|
4203
|
+
cooldownUntilByHash.set(parentHash, Date.now() + candidateCooldownMs);
|
|
4204
|
+
}
|
|
4205
|
+
else {
|
|
4206
|
+
failedParentProbe = { peer: parentPeer, route };
|
|
4207
|
+
nextParentHealthProbeAt = Date.now() + Math.max(retryMs, 1_000);
|
|
4208
|
+
}
|
|
4209
|
+
}
|
|
4047
4210
|
if (!connected) {
|
|
4048
|
-
|
|
4211
|
+
if (probeFailed)
|
|
4212
|
+
ch.metrics.reparentStale += 1;
|
|
4213
|
+
else
|
|
4214
|
+
ch.metrics.reparentDisconnect += 1;
|
|
4215
|
+
failedParentProbe = undefined;
|
|
4216
|
+
nextParentHealthProbeAt = 0;
|
|
4049
4217
|
const hadChildren = ch.children.size > 0;
|
|
4050
4218
|
this.detachFromParent(ch);
|
|
4051
4219
|
nextParentUpgradeCheckAt = 0;
|
|
@@ -5914,11 +6082,7 @@ export class FanoutTree extends DirectStream {
|
|
|
5914
6082
|
const want = Math.max(1, decoded.want);
|
|
5915
6083
|
const ttlMs = Math.min(120_000, Math.max(1_000, decoded.ttlMs));
|
|
5916
6084
|
const now = Date.now();
|
|
5917
|
-
|
|
5918
|
-
if (!watchers) {
|
|
5919
|
-
watchers = new Map();
|
|
5920
|
-
this.providerWatchersBySuffixKey.set(suffixKey, watchers);
|
|
5921
|
-
}
|
|
6085
|
+
const watchers = this.touchProviderWatchers(suffixKey);
|
|
5922
6086
|
watchers.set(fromHash, {
|
|
5923
6087
|
hash: fromHash,
|
|
5924
6088
|
want,
|
|
@@ -6033,8 +6197,12 @@ export class FanoutTree extends DirectStream {
|
|
|
6033
6197
|
return false;
|
|
6034
6198
|
const { reqId, ...reply } = decoded;
|
|
6035
6199
|
const pending = ch.pendingParentProbe.get(reqId);
|
|
6036
|
-
if (!pending
|
|
6200
|
+
if (!pending ||
|
|
6201
|
+
pending.peer !== peerStream ||
|
|
6202
|
+
pending.peer.publicKey.hashcode() !== fromHash ||
|
|
6203
|
+
this.peers.get(fromHash) !== peerStream) {
|
|
6037
6204
|
return true;
|
|
6205
|
+
}
|
|
6038
6206
|
ch.pendingParentProbe.delete(reqId);
|
|
6039
6207
|
pending.resolve(reply);
|
|
6040
6208
|
this.touchPeerHint(ch, fromHash);
|
|
@@ -6245,7 +6413,8 @@ export class FanoutTree extends DirectStream {
|
|
|
6245
6413
|
}
|
|
6246
6414
|
void this.kickChildHashes(ch, [worstChild]).catch(() => { });
|
|
6247
6415
|
}
|
|
6248
|
-
|
|
6416
|
+
const child = { bidPerByte };
|
|
6417
|
+
ch.children.set(fromHash, child);
|
|
6249
6418
|
if (ch.isRoot && consumedParentUpgradeReservation) {
|
|
6250
6419
|
ch.parentUpgradeTrackerNoCapacityUntil = Math.max(ch.parentUpgradeTrackerNoCapacityUntil, Date.now() + 2_000);
|
|
6251
6420
|
}
|
|
@@ -6253,6 +6422,11 @@ export class FanoutTree extends DirectStream {
|
|
|
6253
6422
|
const joinAccept = this.codec.encodeJoinAccept(ch.id.key, reqId, ch.level, ch.routeFromRoot, this.getHaveRange(ch));
|
|
6254
6423
|
void (async () => {
|
|
6255
6424
|
await this._sendControl(fromHash, joinAccept);
|
|
6425
|
+
if (ch.closed || ch.children.get(fromHash) !== child)
|
|
6426
|
+
return;
|
|
6427
|
+
this.dispatchEvent(new CustomEvent("fanout:child-joined", {
|
|
6428
|
+
detail: { topic: ch.id.topic, root: ch.id.root, child: fromHash },
|
|
6429
|
+
}));
|
|
6256
6430
|
if (ch.endSeqExclusive > 0) {
|
|
6257
6431
|
await this._sendControl(fromHash, this.codec.encodeEnd(ch.id.key, ch.endSeqExclusive));
|
|
6258
6432
|
}
|
|
@@ -6635,6 +6809,22 @@ export class FanoutTree extends DirectStream {
|
|
|
6635
6809
|
return true;
|
|
6636
6810
|
}
|
|
6637
6811
|
if (kind === MSG_KICK) {
|
|
6812
|
+
if (this.peers.get(fromHash) !== peerStream)
|
|
6813
|
+
return true;
|
|
6814
|
+
if (fromHash !== ch.parent) {
|
|
6815
|
+
if (ch.parentUpgradeGrace?.previousParent === fromHash) {
|
|
6816
|
+
// This attachment was evicted; never roll back to it.
|
|
6817
|
+
this.clearParentUpgradeGrace(ch);
|
|
6818
|
+
}
|
|
6819
|
+
if (ch.parentShadow?.hash === fromHash) {
|
|
6820
|
+
ch.parentShadow = undefined;
|
|
6821
|
+
ch.metrics.parentShadowReset += 1;
|
|
6822
|
+
if (this.parentUpgradeShadowInFlightSuffixKey === ch.id.suffixKey) {
|
|
6823
|
+
this.parentUpgradeShadowInFlightSuffixKey = undefined;
|
|
6824
|
+
}
|
|
6825
|
+
}
|
|
6826
|
+
return true;
|
|
6827
|
+
}
|
|
6638
6828
|
ch.metrics.reparentKicked += 1;
|
|
6639
6829
|
ch.parent = undefined;
|
|
6640
6830
|
ch.level = Number.POSITIVE_INFINITY;
|