@peerbit/shared-log 13.1.15 → 13.1.17

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.
Files changed (39) hide show
  1. package/dist/benchmark/native-graph.d.ts +2 -0
  2. package/dist/benchmark/native-graph.d.ts.map +1 -0
  3. package/dist/benchmark/native-graph.js +249 -0
  4. package/dist/benchmark/native-graph.js.map +1 -0
  5. package/dist/benchmark/sync-batch-sweep.js +72 -24
  6. package/dist/benchmark/sync-batch-sweep.js.map +1 -1
  7. package/dist/benchmark/sync-phase-profile.d.ts +2 -0
  8. package/dist/benchmark/sync-phase-profile.d.ts.map +1 -0
  9. package/dist/benchmark/sync-phase-profile.js +303 -0
  10. package/dist/benchmark/sync-phase-profile.js.map +1 -0
  11. package/dist/src/checked-prune.d.ts +55 -0
  12. package/dist/src/checked-prune.d.ts.map +1 -0
  13. package/dist/src/checked-prune.js +244 -0
  14. package/dist/src/checked-prune.js.map +1 -0
  15. package/dist/src/index.d.ts +10 -9
  16. package/dist/src/index.d.ts.map +1 -1
  17. package/dist/src/index.js +285 -186
  18. package/dist/src/index.js.map +1 -1
  19. package/dist/src/sync/index.d.ts +9 -1
  20. package/dist/src/sync/index.d.ts.map +1 -1
  21. package/dist/src/sync/profile.d.ts +3 -0
  22. package/dist/src/sync/profile.d.ts.map +1 -0
  23. package/dist/src/sync/profile.js +2 -0
  24. package/dist/src/sync/profile.js.map +1 -0
  25. package/dist/src/sync/rateless-iblt.d.ts +25 -11
  26. package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
  27. package/dist/src/sync/rateless-iblt.js +597 -106
  28. package/dist/src/sync/rateless-iblt.js.map +1 -1
  29. package/dist/src/sync/simple.d.ts +5 -0
  30. package/dist/src/sync/simple.d.ts.map +1 -1
  31. package/dist/src/sync/simple.js +224 -74
  32. package/dist/src/sync/simple.js.map +1 -1
  33. package/package.json +16 -12
  34. package/src/checked-prune.ts +331 -0
  35. package/src/index.ts +451 -302
  36. package/src/sync/index.ts +11 -1
  37. package/src/sync/profile.ts +9 -0
  38. package/src/sync/rateless-iblt.ts +768 -128
  39. package/src/sync/simple.ts +256 -94
@@ -0,0 +1,303 @@
1
+ // Profiles where catch-up sync spends time across simple and rateless phases.
2
+ //
3
+ // Run with:
4
+ // cd packages/programs/data/shared-log
5
+ // node --loader ts-node/esm ./benchmark/sync-phase-profile.ts --entries 20000 --seededEntries 10000 --runs 1
6
+ //
7
+ // JSON output:
8
+ // node --loader ts-node/esm ./benchmark/sync-phase-profile.ts --json
9
+ import { TestSession } from "@peerbit/test-utils";
10
+ import { waitForResolved } from "@peerbit/time";
11
+ import { expect } from "chai";
12
+ import { performance } from "node:perf_hooks";
13
+ import { createReplicationDomainHash, } from "../src/index.js";
14
+ import { MoreSymbols, RatelessIBLTSynchronizer, RequestAll, StartSync, } from "../src/sync/rateless-iblt.js";
15
+ import { RequestMaybeSync, RequestMaybeSyncCoordinate, } from "../src/sync/simple.js";
16
+ import { EventStore } from "../test/utils/stores/event-store.js";
17
+ const parseArgs = () => {
18
+ const args = process.argv.slice(2);
19
+ const readNumber = (name, fallback) => {
20
+ const index = args.indexOf(`--${name}`);
21
+ const raw = index >= 0
22
+ ? args[index + 1]
23
+ : process.env[`SYNC_PROFILE_${name.toUpperCase()}`];
24
+ if (!raw) {
25
+ return fallback;
26
+ }
27
+ const parsed = Number.parseInt(raw, 10);
28
+ if (!Number.isFinite(parsed) || parsed <= 0) {
29
+ throw new Error(`Expected --${name} to be a positive integer`);
30
+ }
31
+ return parsed;
32
+ };
33
+ const readNonNegativeNumber = (name, fallback) => {
34
+ const index = args.indexOf(`--${name}`);
35
+ const raw = index >= 0
36
+ ? args[index + 1]
37
+ : process.env[`SYNC_PROFILE_${name.toUpperCase()}`];
38
+ if (!raw) {
39
+ return fallback;
40
+ }
41
+ const parsed = Number.parseInt(raw, 10);
42
+ if (!Number.isFinite(parsed) || parsed < 0) {
43
+ throw new Error(`Expected --${name} to be a non-negative integer`);
44
+ }
45
+ return parsed;
46
+ };
47
+ return {
48
+ entryCount: readNumber("entries", 10_000),
49
+ seededEntries: readNonNegativeNumber("seededEntries", 1_000),
50
+ batchSize: readNumber("batchSize", 16_384),
51
+ timeoutMs: readNumber("timeoutMs", 120_000),
52
+ drainMs: readNonNegativeNumber("drainMs", 250),
53
+ runs: readNumber("runs", 1),
54
+ warmupRuns: readNonNegativeNumber("warmupRuns", 0),
55
+ json: args.includes("--json") || process.env.BENCH_JSON === "1",
56
+ };
57
+ };
58
+ const writeStdout = (text) => new Promise((resolve, reject) => {
59
+ process.stdout.write(text, (error) => {
60
+ if (error) {
61
+ reject(error);
62
+ return;
63
+ }
64
+ resolve();
65
+ });
66
+ });
67
+ const createEmptyCounters = () => ({
68
+ startSync: 0,
69
+ moreSymbols: 0,
70
+ requestAll: 0,
71
+ requestMaybeSync: 0,
72
+ requestMaybeSyncCoordinate: 0,
73
+ });
74
+ const mergeCounters = (left, right) => ({
75
+ startSync: left.startSync + right.startSync,
76
+ moreSymbols: left.moreSymbols + right.moreSymbols,
77
+ requestAll: left.requestAll + right.requestAll,
78
+ requestMaybeSync: left.requestMaybeSync + right.requestMaybeSync,
79
+ requestMaybeSyncCoordinate: left.requestMaybeSyncCoordinate + right.requestMaybeSyncCoordinate,
80
+ });
81
+ const attachMessageCounter = (store) => {
82
+ const counters = createEmptyCounters();
83
+ const original = store.log.onMessage.bind(store.log);
84
+ store.log.onMessage = async (msg, context) => {
85
+ if (msg instanceof StartSync)
86
+ counters.startSync += 1;
87
+ else if (msg instanceof MoreSymbols)
88
+ counters.moreSymbols += 1;
89
+ else if (msg instanceof RequestAll)
90
+ counters.requestAll += 1;
91
+ else if (msg instanceof RequestMaybeSync)
92
+ counters.requestMaybeSync += 1;
93
+ else if (msg instanceof RequestMaybeSyncCoordinate)
94
+ counters.requestMaybeSyncCoordinate += 1;
95
+ return original(msg, context);
96
+ };
97
+ return {
98
+ read: () => ({ ...counters }),
99
+ restore: () => {
100
+ store.log.onMessage = original;
101
+ },
102
+ };
103
+ };
104
+ class SyncProfileCollector {
105
+ records = [];
106
+ profile(peer) {
107
+ return (event) => {
108
+ this.records.push({
109
+ ...event,
110
+ peer,
111
+ atMs: performance.now(),
112
+ });
113
+ };
114
+ }
115
+ }
116
+ const summarizeRecords = (records) => {
117
+ const summaries = new Map();
118
+ for (const record of records) {
119
+ let summary = summaries.get(record.name);
120
+ if (!summary) {
121
+ summary = {
122
+ count: 0,
123
+ totalMs: 0,
124
+ maxMs: 0,
125
+ entries: 0,
126
+ symbols: 0,
127
+ messages: 0,
128
+ bytes: 0,
129
+ peers: new Map(),
130
+ };
131
+ summaries.set(record.name, summary);
132
+ }
133
+ const durationMs = record.durationMs ?? 0;
134
+ summary.count += 1;
135
+ summary.totalMs += durationMs;
136
+ summary.maxMs = Math.max(summary.maxMs, durationMs);
137
+ summary.entries += record.entries ?? 0;
138
+ summary.symbols += record.symbols ?? 0;
139
+ summary.messages += record.messages ?? 0;
140
+ summary.bytes += record.bytes ?? 0;
141
+ summary.peers.set(record.peer, (summary.peers.get(record.peer) ?? 0) + 1);
142
+ }
143
+ return [...summaries.entries()]
144
+ .map(([phase, summary]) => ({
145
+ phase,
146
+ count: summary.count,
147
+ totalMs: summary.totalMs,
148
+ meanMs: summary.count > 0 ? summary.totalMs / summary.count : 0,
149
+ maxMs: summary.maxMs,
150
+ entries: summary.entries,
151
+ symbols: summary.symbols,
152
+ messages: summary.messages,
153
+ bytes: summary.bytes,
154
+ peers: Object.fromEntries(summary.peers),
155
+ }))
156
+ .sort((a, b) => b.totalMs - a.totalMs || b.count - a.count);
157
+ };
158
+ const setup = {
159
+ domain: createReplicationDomainHash("u64"),
160
+ type: "u64",
161
+ syncronizer: RatelessIBLTSynchronizer,
162
+ name: "u64-iblt",
163
+ };
164
+ const runCatchup = async (properties) => {
165
+ const collector = new SyncProfileCollector();
166
+ const session = await TestSession.disconnected(2);
167
+ const store = new EventStore();
168
+ let db1;
169
+ let db2;
170
+ let counter1;
171
+ let counter2;
172
+ let catchupMs = 0;
173
+ let counters = createEmptyCounters();
174
+ try {
175
+ db1 = await session.peers[0].open(store.clone(), {
176
+ args: {
177
+ replicate: { factor: 2 },
178
+ setup,
179
+ sync: {
180
+ repairSweepTargetBufferSize: properties.batchSize,
181
+ profile: collector.profile("source"),
182
+ },
183
+ },
184
+ });
185
+ db2 = await session.peers[1].open(store.clone(), {
186
+ args: {
187
+ replicate: { factor: 2 },
188
+ setup,
189
+ sync: {
190
+ repairSweepTargetBufferSize: properties.batchSize,
191
+ profile: collector.profile("joiner"),
192
+ },
193
+ },
194
+ });
195
+ for (let i = 0; i < properties.seededEntries; i++) {
196
+ const out = await db1.add(`seed-${i}`, { meta: { next: [] } });
197
+ await db2.log.join([out.entry]);
198
+ }
199
+ for (let i = 0; i < properties.entryCount; i++) {
200
+ await db1.add(`entry-${i}`, { meta: { next: [] } });
201
+ }
202
+ const expectedLength = properties.seededEntries + properties.entryCount;
203
+ expect(db1.log.log.length).to.equal(expectedLength);
204
+ expect(db2.log.log.length).to.equal(properties.seededEntries);
205
+ counter1 = attachMessageCounter(db1);
206
+ counter2 = attachMessageCounter(db2);
207
+ await waitForResolved(() => session.peers[0].dial(session.peers[1].getMultiaddrs()));
208
+ const t0 = performance.now();
209
+ await waitForResolved(() => expect(db2.log.log.length).to.equal(expectedLength), { timeout: properties.timeoutMs, delayInterval: 250 });
210
+ catchupMs = performance.now() - t0;
211
+ if (properties.drainMs > 0) {
212
+ await new Promise((resolve) => setTimeout(resolve, properties.drainMs));
213
+ }
214
+ counters = mergeCounters(counter1.read(), counter2.read());
215
+ }
216
+ finally {
217
+ counter1?.restore();
218
+ counter2?.restore();
219
+ await session.stop();
220
+ }
221
+ const records = [...collector.records];
222
+ return {
223
+ run: properties.run,
224
+ catchupMs,
225
+ counters,
226
+ records,
227
+ phases: summarizeRecords(records),
228
+ };
229
+ };
230
+ const options = parseArgs();
231
+ const measuredRuns = [];
232
+ const allMeasuredRecords = [];
233
+ let counterTotals = createEmptyCounters();
234
+ const totalRuns = options.warmupRuns + options.runs;
235
+ for (let run = 0; run < totalRuns; run++) {
236
+ const result = await runCatchup({
237
+ batchSize: options.batchSize,
238
+ entryCount: options.entryCount,
239
+ seededEntries: options.seededEntries,
240
+ timeoutMs: options.timeoutMs,
241
+ drainMs: options.drainMs,
242
+ run,
243
+ });
244
+ if (run < options.warmupRuns) {
245
+ continue;
246
+ }
247
+ measuredRuns.push({
248
+ run: result.run,
249
+ catchupMs: result.catchupMs,
250
+ counters: result.counters,
251
+ phases: result.phases,
252
+ });
253
+ counterTotals = mergeCounters(counterTotals, result.counters);
254
+ allMeasuredRecords.push(...result.records);
255
+ }
256
+ const catchupSamples = measuredRuns.map((run) => run.catchupMs);
257
+ const meanCatchupMs = catchupSamples.reduce((sum, value) => sum + value, 0) / catchupSamples.length;
258
+ const aggregatePhases = summarizeRecords(allMeasuredRecords);
259
+ const output = {
260
+ name: "shared-log-sync-phase-profile",
261
+ meta: {
262
+ entryCount: options.entryCount,
263
+ seededEntries: options.seededEntries,
264
+ batchSize: options.batchSize,
265
+ timeoutMs: options.timeoutMs,
266
+ drainMs: options.drainMs,
267
+ warmupRuns: options.warmupRuns,
268
+ measuredRuns: options.runs,
269
+ },
270
+ task: {
271
+ name: "rateless-catchup",
272
+ mean_ms: meanCatchupMs,
273
+ hz: meanCatchupMs > 0 ? 1000 / meanCatchupMs : 0,
274
+ rme: null,
275
+ samples: catchupSamples.length,
276
+ counters: counterTotals,
277
+ phases: aggregatePhases,
278
+ },
279
+ runs: measuredRuns,
280
+ };
281
+ if (options.json) {
282
+ await writeStdout(`${JSON.stringify(output, null, 2)}\n`);
283
+ }
284
+ else {
285
+ console.log(`shared-log sync phase profile: entries=${options.entryCount} seededEntries=${options.seededEntries} batchSize=${options.batchSize} drainMs=${options.drainMs} runs=${options.runs}`);
286
+ console.log(`catchup mean=${meanCatchupMs.toFixed(2)}ms hz=${output.task.hz.toFixed(2)}`);
287
+ console.table(counterTotals);
288
+ console.table(aggregatePhases.map((phase) => ({
289
+ phase: phase.phase,
290
+ count: phase.count,
291
+ total_ms: phase.totalMs.toFixed(2),
292
+ mean_ms: phase.meanMs.toFixed(2),
293
+ max_ms: phase.maxMs.toFixed(2),
294
+ entries: phase.entries,
295
+ symbols: phase.symbols,
296
+ messages: phase.messages,
297
+ peers: Object.entries(phase.peers)
298
+ .map(([peer, count]) => `${peer}:${count}`)
299
+ .join(","),
300
+ })));
301
+ }
302
+ process.exit(process.exitCode ?? 0);
303
+ //# sourceMappingURL=sync-phase-profile.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync-phase-profile.js","sourceRoot":"","sources":["../../benchmark/sync-phase-profile.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ import type { Entry, ShallowEntry } from "@peerbit/log";
2
+ import type { DeferredPromise } from "p-defer";
3
+ import type { EntryReplicated } from "./ranges.js";
4
+ export type CheckedPruneLeaderMap = Map<string, {
5
+ intersecting: boolean;
6
+ }>;
7
+ export type CheckedPruneEntry<T, R extends "u32" | "u64"> = Entry<T> | ShallowEntry | EntryReplicated<R>;
8
+ export type CheckedPrunePendingDelete = {
9
+ promise: DeferredPromise<void>;
10
+ clear: () => void;
11
+ resolve: (publicKeyHash: string) => Promise<void> | void;
12
+ reject(reason: any): Promise<void> | void;
13
+ };
14
+ export type CheckedPruneRetryState<T, R extends "u32" | "u64"> = {
15
+ attempts: number;
16
+ timer?: ReturnType<typeof setTimeout>;
17
+ entry: CheckedPruneEntry<T, R>;
18
+ leaders: CheckedPruneLeaderMap | Set<string>;
19
+ };
20
+ export declare class CheckedPruneCoordinator<T, R extends "u32" | "u64"> {
21
+ readonly pendingDeletes: Map<string, CheckedPrunePendingDelete>;
22
+ readonly requestIPruneSent: Map<string, Set<string>>;
23
+ readonly responseReplicatorSet: Map<string, Set<string>>;
24
+ readonly retries: Map<string, CheckedPruneRetryState<T, R>>;
25
+ private readonly sessions;
26
+ private getOrCreateSession;
27
+ private remember;
28
+ private deleteSessionIfIdle;
29
+ trackCandidate(hash: string, entry: CheckedPruneEntry<T, R>, leaders: CheckedPruneLeaderMap | Set<string>): void;
30
+ hasActiveWork(hash: string): boolean;
31
+ getPendingDelete(hash: string): CheckedPrunePendingDelete | undefined;
32
+ hasPendingDelete(hash: string): boolean;
33
+ setPendingDelete(hash: string, pending: CheckedPrunePendingDelete, entry: CheckedPruneEntry<T, R>, leaders: CheckedPruneLeaderMap | Set<string>): void;
34
+ deletePendingDelete(hash: string, pending?: CheckedPrunePendingDelete): void;
35
+ getRetry(hash: string): CheckedPruneRetryState<T, R> | undefined;
36
+ hasRetry(hash: string): boolean;
37
+ setRetry(hash: string, state: CheckedPruneRetryState<T, R>): void;
38
+ clearRetry(hash: string): void;
39
+ clearRetryTimer(hash: string): CheckedPruneRetryState<T, R> | undefined;
40
+ addRequestSent(hash: string, peer: string): void;
41
+ removeRequestSent(hash: string, peer?: string): void;
42
+ addConfirmedReplicator(hash: string, peer: string): Set<string>;
43
+ removeConfirmedReplicator(hash: string, peer: string): void;
44
+ clearConfirmedReplicators(hash: string): void;
45
+ getConfirmedReplicators(hash: string): Set<string> | undefined;
46
+ getContactedReplicators(hash: string): Set<string> | undefined;
47
+ markRemoving(hash: string): void;
48
+ markDone(hash: string): void;
49
+ markCancelled(hash: string, options?: {
50
+ preserveRetry?: boolean;
51
+ }): void;
52
+ cleanupPeer(peer: string): void;
53
+ close(): void;
54
+ }
55
+ //# sourceMappingURL=checked-prune.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checked-prune.d.ts","sourceRoot":"","sources":["../../src/checked-prune.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACxD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEnD,MAAM,MAAM,qBAAqB,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,YAAY,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC;AAE3E,MAAM,MAAM,iBAAiB,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,IACrD,KAAK,CAAC,CAAC,CAAC,GACR,YAAY,GACZ,eAAe,CAAC,CAAC,CAAC,CAAC;AAEtB,MAAM,MAAM,yBAAyB,GAAG;IACvC,OAAO,EAAE,eAAe,CAAC,IAAI,CAAC,CAAC;IAC/B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,OAAO,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACzD,MAAM,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CAC1C,CAAC;AAEF,MAAM,MAAM,sBAAsB,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK,IAAI;IAChE,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,UAAU,CAAC,OAAO,UAAU,CAAC,CAAC;IACtC,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;IAC/B,OAAO,EAAE,qBAAqB,GAAG,GAAG,CAAC,MAAM,CAAC,CAAC;CAC7C,CAAC;AAqBF,qBAAa,uBAAuB,CAAC,CAAC,EAAE,CAAC,SAAS,KAAK,GAAG,KAAK;IAC9D,QAAQ,CAAC,cAAc,yCAAgD;IACvE,QAAQ,CAAC,iBAAiB,2BAAkC;IAC5D,QAAQ,CAAC,qBAAqB,2BAAkC;IAChE,QAAQ,CAAC,OAAO,4CAAmD;IACnE,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAgD;IAEzE,OAAO,CAAC,kBAAkB;IAa1B,OAAO,CAAC,QAAQ;IAehB,OAAO,CAAC,mBAAmB;IAY3B,cAAc,CACb,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,OAAO,EAAE,qBAAqB,GAAG,GAAG,CAAC,MAAM,CAAC;IAQ7C,aAAa,CAAC,IAAI,EAAE,MAAM;IAS1B,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAI7B,gBAAgB,CAAC,IAAI,EAAE,MAAM;IAI7B,gBAAgB,CACf,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,yBAAyB,EAClC,KAAK,EAAE,iBAAiB,CAAC,CAAC,EAAE,CAAC,CAAC,EAC9B,OAAO,EAAE,qBAAqB,GAAG,GAAG,CAAC,MAAM,CAAC;IAQ7C,mBAAmB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,yBAAyB;IAYrE,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIrB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAIrB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,sBAAsB,CAAC,CAAC,EAAE,CAAC,CAAC;IAO1D,UAAU,CAAC,IAAI,EAAE,MAAM;IAavB,eAAe,CAAC,IAAI,EAAE,MAAM;IAS5B,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAczC,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM;IAqB7C,sBAAsB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAajD,yBAAyB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAcpD,yBAAyB,CAAC,IAAI,EAAE,MAAM;IAOtC,uBAAuB,CAAC,IAAI,EAAE,MAAM;IAIpC,uBAAuB,CAAC,IAAI,EAAE,MAAM;IAIpC,YAAY,CAAC,IAAI,EAAE,MAAM;IAKzB,QAAQ,CAAC,IAAI,EAAE,MAAM;IAYrB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE;QAAE,aAAa,CAAC,EAAE,OAAO,CAAA;KAAE;IAoBjE,WAAW,CAAC,IAAI,EAAE,MAAM;IAoBxB,KAAK;CAgBL"}
@@ -0,0 +1,244 @@
1
+ export class CheckedPruneCoordinator {
2
+ pendingDeletes = new Map();
3
+ requestIPruneSent = new Map();
4
+ responseReplicatorSet = new Map();
5
+ retries = new Map();
6
+ sessions = new Map();
7
+ getOrCreateSession(hash) {
8
+ let session = this.sessions.get(hash);
9
+ if (!session) {
10
+ session = {
11
+ phase: "candidate",
12
+ contacted: new Set(),
13
+ confirmed: new Set(),
14
+ };
15
+ this.sessions.set(hash, session);
16
+ }
17
+ return session;
18
+ }
19
+ remember(hash, entry, leaders) {
20
+ const session = this.getOrCreateSession(hash);
21
+ if (entry) {
22
+ session.entry = entry;
23
+ }
24
+ if (leaders) {
25
+ session.leaders = leaders;
26
+ }
27
+ return session;
28
+ }
29
+ deleteSessionIfIdle(hash) {
30
+ if (this.pendingDeletes.has(hash) ||
31
+ this.requestIPruneSent.has(hash) ||
32
+ this.responseReplicatorSet.has(hash) ||
33
+ this.retries.has(hash)) {
34
+ return;
35
+ }
36
+ this.sessions.delete(hash);
37
+ }
38
+ trackCandidate(hash, entry, leaders) {
39
+ const session = this.remember(hash, entry, leaders);
40
+ if (!this.hasActiveWork(hash)) {
41
+ session.phase = "candidate";
42
+ }
43
+ }
44
+ hasActiveWork(hash) {
45
+ return (this.pendingDeletes.has(hash) ||
46
+ this.requestIPruneSent.has(hash) ||
47
+ this.responseReplicatorSet.has(hash) ||
48
+ this.retries.has(hash));
49
+ }
50
+ getPendingDelete(hash) {
51
+ return this.pendingDeletes.get(hash);
52
+ }
53
+ hasPendingDelete(hash) {
54
+ return this.pendingDeletes.has(hash);
55
+ }
56
+ setPendingDelete(hash, pending, entry, leaders) {
57
+ this.pendingDeletes.set(hash, pending);
58
+ const session = this.remember(hash, entry, leaders);
59
+ session.pending = pending;
60
+ session.phase = "requested";
61
+ }
62
+ deletePendingDelete(hash, pending) {
63
+ const current = this.pendingDeletes.get(hash);
64
+ if (!pending || current === pending) {
65
+ this.pendingDeletes.delete(hash);
66
+ const session = this.sessions.get(hash);
67
+ if (session && session.pending === current) {
68
+ session.pending = undefined;
69
+ }
70
+ this.deleteSessionIfIdle(hash);
71
+ }
72
+ }
73
+ getRetry(hash) {
74
+ return this.retries.get(hash);
75
+ }
76
+ hasRetry(hash) {
77
+ return this.retries.has(hash);
78
+ }
79
+ setRetry(hash, state) {
80
+ this.retries.set(hash, state);
81
+ const session = this.remember(hash, state.entry, state.leaders);
82
+ session.retry = state;
83
+ session.phase = "retrying";
84
+ }
85
+ clearRetry(hash) {
86
+ const state = this.retries.get(hash);
87
+ if (state?.timer) {
88
+ clearTimeout(state.timer);
89
+ }
90
+ this.retries.delete(hash);
91
+ const session = this.sessions.get(hash);
92
+ if (session && session.retry === state) {
93
+ session.retry = undefined;
94
+ }
95
+ this.deleteSessionIfIdle(hash);
96
+ }
97
+ clearRetryTimer(hash) {
98
+ const state = this.retries.get(hash);
99
+ if (state?.timer) {
100
+ clearTimeout(state.timer);
101
+ state.timer = undefined;
102
+ }
103
+ return state;
104
+ }
105
+ addRequestSent(hash, peer) {
106
+ let set = this.requestIPruneSent.get(hash);
107
+ if (!set) {
108
+ set = new Set();
109
+ this.requestIPruneSent.set(hash, set);
110
+ }
111
+ set.add(peer);
112
+ const session = this.getOrCreateSession(hash);
113
+ session.contacted.add(peer);
114
+ if (session.phase === "candidate") {
115
+ session.phase = "requested";
116
+ }
117
+ }
118
+ removeRequestSent(hash, peer) {
119
+ if (!peer) {
120
+ this.requestIPruneSent.delete(hash);
121
+ const session = this.sessions.get(hash);
122
+ session?.contacted.clear();
123
+ this.deleteSessionIfIdle(hash);
124
+ return;
125
+ }
126
+ const set = this.requestIPruneSent.get(hash);
127
+ if (!set) {
128
+ return;
129
+ }
130
+ set.delete(peer);
131
+ const session = this.sessions.get(hash);
132
+ session?.contacted.delete(peer);
133
+ if (set.size === 0) {
134
+ this.requestIPruneSent.delete(hash);
135
+ this.deleteSessionIfIdle(hash);
136
+ }
137
+ }
138
+ addConfirmedReplicator(hash, peer) {
139
+ let set = this.responseReplicatorSet.get(hash);
140
+ if (!set) {
141
+ set = new Set();
142
+ this.responseReplicatorSet.set(hash, set);
143
+ }
144
+ set.add(peer);
145
+ const session = this.getOrCreateSession(hash);
146
+ session.confirmed.add(peer);
147
+ session.phase = "confirmed";
148
+ return set;
149
+ }
150
+ removeConfirmedReplicator(hash, peer) {
151
+ const set = this.responseReplicatorSet.get(hash);
152
+ if (!set) {
153
+ return;
154
+ }
155
+ set.delete(peer);
156
+ const session = this.sessions.get(hash);
157
+ session?.confirmed.delete(peer);
158
+ if (set.size === 0) {
159
+ this.responseReplicatorSet.delete(hash);
160
+ this.deleteSessionIfIdle(hash);
161
+ }
162
+ }
163
+ clearConfirmedReplicators(hash) {
164
+ this.responseReplicatorSet.delete(hash);
165
+ const session = this.sessions.get(hash);
166
+ session?.confirmed.clear();
167
+ this.deleteSessionIfIdle(hash);
168
+ }
169
+ getConfirmedReplicators(hash) {
170
+ return this.responseReplicatorSet.get(hash);
171
+ }
172
+ getContactedReplicators(hash) {
173
+ return this.requestIPruneSent.get(hash);
174
+ }
175
+ markRemoving(hash) {
176
+ const session = this.getOrCreateSession(hash);
177
+ session.phase = "removing";
178
+ }
179
+ markDone(hash) {
180
+ const session = this.sessions.get(hash);
181
+ if (session) {
182
+ session.phase = "done";
183
+ }
184
+ this.pendingDeletes.delete(hash);
185
+ this.requestIPruneSent.delete(hash);
186
+ this.responseReplicatorSet.delete(hash);
187
+ this.clearRetry(hash);
188
+ this.sessions.delete(hash);
189
+ }
190
+ markCancelled(hash, options) {
191
+ const retry = this.retries.get(hash);
192
+ const session = this.sessions.get(hash);
193
+ if (session) {
194
+ session.phase = "cancelled";
195
+ session.pending = undefined;
196
+ session.contacted.clear();
197
+ session.confirmed.clear();
198
+ if (!options?.preserveRetry || session.retry !== retry) {
199
+ session.retry = undefined;
200
+ }
201
+ }
202
+ this.requestIPruneSent.delete(hash);
203
+ this.responseReplicatorSet.delete(hash);
204
+ if (!options?.preserveRetry) {
205
+ this.clearRetry(hash);
206
+ }
207
+ this.deleteSessionIfIdle(hash);
208
+ }
209
+ cleanupPeer(peer) {
210
+ for (const [hash, peers] of this.requestIPruneSent) {
211
+ peers.delete(peer);
212
+ this.sessions.get(hash)?.contacted.delete(peer);
213
+ if (peers.size === 0) {
214
+ this.requestIPruneSent.delete(hash);
215
+ this.deleteSessionIfIdle(hash);
216
+ }
217
+ }
218
+ for (const [hash, peers] of this.responseReplicatorSet) {
219
+ peers.delete(peer);
220
+ this.sessions.get(hash)?.confirmed.delete(peer);
221
+ if (peers.size === 0) {
222
+ this.responseReplicatorSet.delete(hash);
223
+ this.deleteSessionIfIdle(hash);
224
+ }
225
+ }
226
+ }
227
+ close() {
228
+ for (const [_hash, pending] of this.pendingDeletes) {
229
+ pending.clear();
230
+ pending.promise.resolve();
231
+ }
232
+ for (const [_hash, retry] of this.retries) {
233
+ if (retry.timer) {
234
+ clearTimeout(retry.timer);
235
+ }
236
+ }
237
+ this.pendingDeletes.clear();
238
+ this.requestIPruneSent.clear();
239
+ this.responseReplicatorSet.clear();
240
+ this.retries.clear();
241
+ this.sessions.clear();
242
+ }
243
+ }
244
+ //# sourceMappingURL=checked-prune.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"checked-prune.js","sourceRoot":"","sources":["../../src/checked-prune.ts"],"names":[],"mappings":"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"}