@peerbit/shared-log 12.2.0-874976b → 12.2.0-90d77b6
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/benchmark/pid-convergence.d.ts +2 -0
- package/dist/benchmark/pid-convergence.d.ts.map +1 -0
- package/dist/benchmark/pid-convergence.js +138 -0
- package/dist/benchmark/pid-convergence.js.map +1 -0
- package/dist/benchmark/rateless-iblt-sender-startsync.d.ts +2 -0
- package/dist/benchmark/rateless-iblt-sender-startsync.d.ts.map +1 -0
- package/dist/benchmark/rateless-iblt-sender-startsync.js +104 -0
- package/dist/benchmark/rateless-iblt-sender-startsync.js.map +1 -0
- package/dist/benchmark/rateless-iblt-startsync-cache.d.ts +2 -0
- package/dist/benchmark/rateless-iblt-startsync-cache.d.ts.map +1 -0
- package/dist/benchmark/rateless-iblt-startsync-cache.js +112 -0
- package/dist/benchmark/rateless-iblt-startsync-cache.js.map +1 -0
- package/dist/benchmark/sync-catchup.d.ts +3 -0
- package/dist/benchmark/sync-catchup.d.ts.map +1 -0
- package/dist/benchmark/sync-catchup.js +109 -0
- package/dist/benchmark/sync-catchup.js.map +1 -0
- package/dist/src/index.d.ts +14 -2
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +256 -82
- package/dist/src/index.js.map +1 -1
- package/dist/src/ranges.d.ts +1 -0
- package/dist/src/ranges.d.ts.map +1 -1
- package/dist/src/ranges.js +48 -18
- package/dist/src/ranges.js.map +1 -1
- package/dist/src/sync/rateless-iblt.d.ts +8 -0
- package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
- package/dist/src/sync/rateless-iblt.js +109 -20
- package/dist/src/sync/rateless-iblt.js.map +1 -1
- package/package.json +18 -18
- package/src/index.ts +324 -125
- package/src/ranges.ts +97 -65
- package/src/sync/rateless-iblt.ts +138 -28
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-convergence.d.ts","sourceRoot":"","sources":["../../benchmark/pid-convergence.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { Bench } from "tinybench";
|
|
2
|
+
import { PIDReplicationController } from "../src/pid.js";
|
|
3
|
+
// Benchmarks PID convergence speed in a simplified simulation model.
|
|
4
|
+
//
|
|
5
|
+
// Run with:
|
|
6
|
+
// cd packages/programs/data/shared-log
|
|
7
|
+
// PID_WARMUP=2 PID_ITERATIONS=50 PID_RUNS=200 node --loader ts-node/esm ./benchmark/pid-convergence.ts
|
|
8
|
+
//
|
|
9
|
+
// Notes:
|
|
10
|
+
// - This is a *model* benchmark: it does not simulate network, pruning, or real memory measurements.
|
|
11
|
+
// - It is intended to catch regressions/improvements in the controller dynamics and step cost.
|
|
12
|
+
const parseNumberList = (value, defaults) => {
|
|
13
|
+
if (!value)
|
|
14
|
+
return defaults;
|
|
15
|
+
const parsed = value
|
|
16
|
+
.split(",")
|
|
17
|
+
.map((x) => Number.parseInt(x.trim(), 10))
|
|
18
|
+
.filter((x) => Number.isFinite(x) && x > 0);
|
|
19
|
+
return parsed.length > 0 ? parsed : defaults;
|
|
20
|
+
};
|
|
21
|
+
const warmupIterations = Number.parseInt(process.env.PID_WARMUP || "2", 10);
|
|
22
|
+
const iterations = Number.parseInt(process.env.PID_ITERATIONS || "50", 10);
|
|
23
|
+
const runsPerTask = Number.parseInt(process.env.PID_RUNS || "200", 10);
|
|
24
|
+
const maxSteps = Number.parseInt(process.env.PID_MAX_STEPS || "200", 10);
|
|
25
|
+
const peersList = parseNumberList(process.env.PID_PEERS, [2, 3, 5]);
|
|
26
|
+
const clamp01 = (value) => Math.max(0, Math.min(1, value));
|
|
27
|
+
const simulateConvergence = (properties) => {
|
|
28
|
+
const { controllers, initialFactors, cpuUsage, memoryUsage, expectedFactor, epsilon, } = properties;
|
|
29
|
+
for (const controller of controllers) {
|
|
30
|
+
controller.reset();
|
|
31
|
+
}
|
|
32
|
+
let factors = initialFactors.slice();
|
|
33
|
+
const peerCount = factors.length;
|
|
34
|
+
for (let step = 0; step < maxSteps; step++) {
|
|
35
|
+
const totalFactor = clamp01(factors.reduce((acc, f) => acc + f, 0));
|
|
36
|
+
const next = [];
|
|
37
|
+
for (let peerIndex = 0; peerIndex < peerCount; peerIndex++) {
|
|
38
|
+
next[peerIndex] = controllers[peerIndex].step({
|
|
39
|
+
memoryUsage: memoryUsage(peerIndex, factors[peerIndex]),
|
|
40
|
+
currentFactor: factors[peerIndex],
|
|
41
|
+
totalFactor,
|
|
42
|
+
peerCount,
|
|
43
|
+
cpuUsage: cpuUsage(peerIndex),
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
factors = next;
|
|
47
|
+
let ok = true;
|
|
48
|
+
for (let peerIndex = 0; peerIndex < peerCount; peerIndex++) {
|
|
49
|
+
const target = expectedFactor(peerIndex, peerCount);
|
|
50
|
+
if (Math.abs(factors[peerIndex] - target) > epsilon) {
|
|
51
|
+
ok = false;
|
|
52
|
+
break;
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
if (ok && Math.abs(factors.reduce((acc, f) => acc + f, 0) - 1) <= epsilon) {
|
|
56
|
+
return { converged: true, steps: step + 1 };
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
return { converged: false, steps: maxSteps };
|
|
60
|
+
};
|
|
61
|
+
const suite = new Bench({
|
|
62
|
+
name: "pid-convergence",
|
|
63
|
+
warmupIterations: Number.isFinite(warmupIterations) ? warmupIterations : 0,
|
|
64
|
+
iterations: Number.isFinite(iterations) ? iterations : undefined,
|
|
65
|
+
});
|
|
66
|
+
const makeControllers = (peerCount, options) => Array.from({ length: peerCount }, (_, i) => new PIDReplicationController(`p${i}`, options(i)));
|
|
67
|
+
for (const peerCount of peersList) {
|
|
68
|
+
const controllers = makeControllers(peerCount, () => ({}));
|
|
69
|
+
const epsilon = 0.02;
|
|
70
|
+
const target = (_i, n) => 1 / n;
|
|
71
|
+
const initialFactors = Array.from({ length: peerCount }, () => 0);
|
|
72
|
+
suite.add(`even (peers=${peerCount})`, () => {
|
|
73
|
+
for (let i = 0; i < runsPerTask; i++) {
|
|
74
|
+
const res = simulateConvergence({
|
|
75
|
+
controllers,
|
|
76
|
+
initialFactors,
|
|
77
|
+
cpuUsage: () => 0,
|
|
78
|
+
memoryUsage: () => 0,
|
|
79
|
+
expectedFactor: target,
|
|
80
|
+
epsilon,
|
|
81
|
+
});
|
|
82
|
+
if (!res.converged) {
|
|
83
|
+
throw new Error(`did not converge (peers=${peerCount})`);
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
// A constrained scenario (2 peers): peer 0 has a memory cap (ratio), peer 1 is unconstrained.
|
|
89
|
+
{
|
|
90
|
+
const peerCount = 2;
|
|
91
|
+
const totalSize = 1_000_000; // bytes
|
|
92
|
+
const memoryLimit = 250_000; // 25% of total
|
|
93
|
+
const limitRatio = memoryLimit / totalSize;
|
|
94
|
+
const epsilon = 0.03;
|
|
95
|
+
const controllers = makeControllers(peerCount, (peerIndex) => peerIndex === 0 ? { storage: { max: memoryLimit } } : {});
|
|
96
|
+
const initialFactors = [0.5, 0.5];
|
|
97
|
+
const expectedFactor = (peerIndex) => peerIndex === 0 ? limitRatio : 1 - limitRatio;
|
|
98
|
+
suite.add("memory-limited (2 peers, 25% cap)", () => {
|
|
99
|
+
for (let i = 0; i < runsPerTask; i++) {
|
|
100
|
+
const res = simulateConvergence({
|
|
101
|
+
controllers,
|
|
102
|
+
initialFactors,
|
|
103
|
+
cpuUsage: () => 0,
|
|
104
|
+
memoryUsage: (peerIndex, factor) => peerIndex === 0 ? totalSize * factor : 0,
|
|
105
|
+
expectedFactor,
|
|
106
|
+
epsilon,
|
|
107
|
+
});
|
|
108
|
+
if (!res.converged) {
|
|
109
|
+
throw new Error("did not converge (memory-limited)");
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
await suite.run();
|
|
115
|
+
if (process.env.BENCH_JSON === "1") {
|
|
116
|
+
const tasks = suite.tasks.map((task) => ({
|
|
117
|
+
name: task.name,
|
|
118
|
+
hz: task.result?.hz ?? null,
|
|
119
|
+
mean_ms: task.result?.mean ?? null,
|
|
120
|
+
rme: task.result?.rme ?? null,
|
|
121
|
+
samples: task.result?.samples?.length ?? null,
|
|
122
|
+
}));
|
|
123
|
+
process.stdout.write(JSON.stringify({
|
|
124
|
+
name: suite.name,
|
|
125
|
+
tasks,
|
|
126
|
+
meta: {
|
|
127
|
+
peersList,
|
|
128
|
+
warmupIterations,
|
|
129
|
+
iterations,
|
|
130
|
+
runsPerTask,
|
|
131
|
+
maxSteps,
|
|
132
|
+
},
|
|
133
|
+
}, null, 2));
|
|
134
|
+
}
|
|
135
|
+
else {
|
|
136
|
+
console.table(suite.table());
|
|
137
|
+
}
|
|
138
|
+
//# sourceMappingURL=pid-convergence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pid-convergence.js","sourceRoot":"","sources":["../../benchmark/pid-convergence.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateless-iblt-sender-startsync.d.ts","sourceRoot":"","sources":["../../benchmark/rateless-iblt-sender-startsync.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
import { Cache } from "@peerbit/cache";
|
|
2
|
+
import { ready as ribltReady } from "@peerbit/riblt";
|
|
3
|
+
import { Bench } from "tinybench";
|
|
4
|
+
import { createNumbers } from "../src/integers.js";
|
|
5
|
+
import { RatelessIBLTSynchronizer } from "../src/sync/rateless-iblt.js";
|
|
6
|
+
// Benchmarks sender-side StartSync setup cost (sort + encoder build + initial symbols),
|
|
7
|
+
// by timing `RatelessIBLTSynchronizer.onMaybeMissingEntries()` for large batches.
|
|
8
|
+
//
|
|
9
|
+
// Run with:
|
|
10
|
+
// cd packages/programs/data/shared-log
|
|
11
|
+
// RIBLT_SIZES="1000,10000,50000" RIBLT_WARMUP=5 RIBLT_ITERATIONS=20 \\
|
|
12
|
+
// node --loader ts-node/esm ./benchmark/rateless-iblt-sender-startsync.ts
|
|
13
|
+
const parseNumberList = (value, defaults) => {
|
|
14
|
+
if (!value)
|
|
15
|
+
return defaults;
|
|
16
|
+
const parsed = value
|
|
17
|
+
.split(",")
|
|
18
|
+
.map((x) => Number.parseInt(x.trim(), 10))
|
|
19
|
+
.filter((x) => Number.isFinite(x) && x > 0);
|
|
20
|
+
return parsed.length > 0 ? parsed : defaults;
|
|
21
|
+
};
|
|
22
|
+
const sizes = parseNumberList(process.env.RIBLT_SIZES, [1_000, 10_000, 50_000]);
|
|
23
|
+
const warmupIterations = Number.parseInt(process.env.RIBLT_WARMUP || "5", 10);
|
|
24
|
+
const iterations = Number.parseInt(process.env.RIBLT_ITERATIONS || "20", 10);
|
|
25
|
+
const useRandomHashes = process.env.RIBLT_RANDOM === "1";
|
|
26
|
+
const U64_MASK = (1n << 64n) - 1n;
|
|
27
|
+
const createXorShift64Star = (seed) => {
|
|
28
|
+
let x = seed & U64_MASK;
|
|
29
|
+
return () => {
|
|
30
|
+
x ^= x >> 12n;
|
|
31
|
+
x ^= (x << 25n) & U64_MASK;
|
|
32
|
+
x ^= x >> 27n;
|
|
33
|
+
return (x * 2685821657736338717n) & U64_MASK;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
const createEntries = (size) => {
|
|
37
|
+
const entries = new Map();
|
|
38
|
+
const rand = useRandomHashes
|
|
39
|
+
? createXorShift64Star(88172645463393265n ^ BigInt(size))
|
|
40
|
+
: undefined;
|
|
41
|
+
for (let i = 0; i < size; i++) {
|
|
42
|
+
const hash = `h${i}`;
|
|
43
|
+
entries.set(hash, {
|
|
44
|
+
hash,
|
|
45
|
+
hashNumber: useRandomHashes ? rand() : BigInt(i + 1),
|
|
46
|
+
assignedToRangeBoundary: false,
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
return entries;
|
|
50
|
+
};
|
|
51
|
+
const createSync = (numbers) => {
|
|
52
|
+
const send = async () => { };
|
|
53
|
+
const rpc = { send };
|
|
54
|
+
return new RatelessIBLTSynchronizer({
|
|
55
|
+
rpc,
|
|
56
|
+
rangeIndex: {},
|
|
57
|
+
entryIndex: {},
|
|
58
|
+
log: {},
|
|
59
|
+
coordinateToHash: new Cache({ max: 10 }),
|
|
60
|
+
numbers,
|
|
61
|
+
});
|
|
62
|
+
};
|
|
63
|
+
const clearOutgoing = async (sync) => {
|
|
64
|
+
const ids = Array.from(sync.outgoingSyncProcesses.keys());
|
|
65
|
+
for (const id of ids) {
|
|
66
|
+
sync.outgoingSyncProcesses.get(id)?.free();
|
|
67
|
+
}
|
|
68
|
+
};
|
|
69
|
+
await ribltReady;
|
|
70
|
+
const numbers = createNumbers("u64");
|
|
71
|
+
const suite = new Bench({
|
|
72
|
+
name: "rateless-iblt-sender-startsync",
|
|
73
|
+
warmupIterations: Number.isFinite(warmupIterations) ? warmupIterations : 0,
|
|
74
|
+
iterations: Number.isFinite(iterations) ? iterations : undefined,
|
|
75
|
+
});
|
|
76
|
+
const sync = createSync(numbers);
|
|
77
|
+
for (const size of sizes) {
|
|
78
|
+
const entries = createEntries(size);
|
|
79
|
+
suite.add(`onMaybeMissingEntries (rateless IBLT, n=${size})`, async () => {
|
|
80
|
+
await clearOutgoing(sync);
|
|
81
|
+
await sync.onMaybeMissingEntries({ entries, targets: ["t"] });
|
|
82
|
+
await clearOutgoing(sync);
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
await suite.run();
|
|
86
|
+
if (process.env.BENCH_JSON === "1") {
|
|
87
|
+
const tasks = suite.tasks.map((task) => ({
|
|
88
|
+
name: task.name,
|
|
89
|
+
hz: task.result?.hz ?? null,
|
|
90
|
+
mean_ms: task.result?.mean ?? null,
|
|
91
|
+
rme: task.result?.rme ?? null,
|
|
92
|
+
samples: task.result?.samples?.length ?? null,
|
|
93
|
+
}));
|
|
94
|
+
process.stdout.write(JSON.stringify({
|
|
95
|
+
name: suite.name,
|
|
96
|
+
tasks,
|
|
97
|
+
meta: { sizes, warmupIterations, iterations },
|
|
98
|
+
}, null, 2));
|
|
99
|
+
}
|
|
100
|
+
else {
|
|
101
|
+
console.table(suite.table());
|
|
102
|
+
}
|
|
103
|
+
await sync.close();
|
|
104
|
+
//# sourceMappingURL=rateless-iblt-sender-startsync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateless-iblt-sender-startsync.js","sourceRoot":"","sources":["../../benchmark/rateless-iblt-sender-startsync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateless-iblt-startsync-cache.d.ts","sourceRoot":"","sources":["../../benchmark/rateless-iblt-startsync-cache.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { Cache } from "@peerbit/cache";
|
|
2
|
+
import { ready as ribltReady } from "@peerbit/riblt";
|
|
3
|
+
import { Bench } from "tinybench";
|
|
4
|
+
import { createNumbers } from "../src/integers.js";
|
|
5
|
+
import { RatelessIBLTSynchronizer } from "../src/sync/rateless-iblt.js";
|
|
6
|
+
// Run with:
|
|
7
|
+
// cd packages/programs/data/shared-log
|
|
8
|
+
// RIBLT_SIZES="1000,10000,50000" RIBLT_WARMUP=5 RIBLT_ITERATIONS=20 \
|
|
9
|
+
// node --loader ts-node/esm ./benchmark/rateless-iblt-startsync-cache.ts
|
|
10
|
+
const parseNumberList = (value, defaults) => {
|
|
11
|
+
if (!value)
|
|
12
|
+
return defaults;
|
|
13
|
+
const parsed = value
|
|
14
|
+
.split(",")
|
|
15
|
+
.map((x) => Number.parseInt(x.trim(), 10))
|
|
16
|
+
.filter((x) => Number.isFinite(x) && x > 0);
|
|
17
|
+
return parsed.length > 0 ? parsed : defaults;
|
|
18
|
+
};
|
|
19
|
+
const sizes = parseNumberList(process.env.RIBLT_SIZES, [1_000, 10_000, 50_000]);
|
|
20
|
+
const warmupIterations = Number.parseInt(process.env.RIBLT_WARMUP || "5", 10);
|
|
21
|
+
const iterations = Number.parseInt(process.env.RIBLT_ITERATIONS || "20", 10);
|
|
22
|
+
const createEntries = (size) => {
|
|
23
|
+
const entries = new Array(size);
|
|
24
|
+
for (let i = 0; i < size; i++) {
|
|
25
|
+
entries[i] = { value: { hash: `h${i}`, hashNumber: BigInt(i + 1) } };
|
|
26
|
+
}
|
|
27
|
+
return entries;
|
|
28
|
+
};
|
|
29
|
+
const createSync = (entries, numbers) => {
|
|
30
|
+
const entryIndex = {
|
|
31
|
+
iterate: () => ({
|
|
32
|
+
all: async () => entries,
|
|
33
|
+
}),
|
|
34
|
+
};
|
|
35
|
+
const send = async () => { };
|
|
36
|
+
const rpc = { send };
|
|
37
|
+
return new RatelessIBLTSynchronizer({
|
|
38
|
+
rpc,
|
|
39
|
+
rangeIndex: {},
|
|
40
|
+
entryIndex,
|
|
41
|
+
log: {},
|
|
42
|
+
coordinateToHash: new Cache({ max: 10 }),
|
|
43
|
+
numbers,
|
|
44
|
+
});
|
|
45
|
+
};
|
|
46
|
+
await ribltReady;
|
|
47
|
+
const numbers = createNumbers("u64");
|
|
48
|
+
const suite = new Bench({
|
|
49
|
+
name: "rateless-iblt-startsync-cache",
|
|
50
|
+
warmupIterations: Number.isFinite(warmupIterations) ? warmupIterations : 0,
|
|
51
|
+
iterations: Number.isFinite(iterations) ? iterations : undefined,
|
|
52
|
+
});
|
|
53
|
+
const syncsToClose = [];
|
|
54
|
+
for (const size of sizes) {
|
|
55
|
+
const entries = createEntries(size);
|
|
56
|
+
const range = {
|
|
57
|
+
start1: 0n,
|
|
58
|
+
end1: numbers.maxValue,
|
|
59
|
+
start2: 0n,
|
|
60
|
+
end2: 0n,
|
|
61
|
+
};
|
|
62
|
+
const coldSync = createSync(entries, numbers);
|
|
63
|
+
const warmSync = createSync(entries, numbers);
|
|
64
|
+
const warmDecoder = await warmSync.getLocalDecoderForRange(range);
|
|
65
|
+
if (warmDecoder) {
|
|
66
|
+
warmDecoder.free();
|
|
67
|
+
}
|
|
68
|
+
syncsToClose.push(() => coldSync.close());
|
|
69
|
+
syncsToClose.push(() => warmSync.close());
|
|
70
|
+
suite.add(`StartSync local decoder (cold, n=${size})`, async () => {
|
|
71
|
+
coldSync.invalidateLocalRangeEncoderCache();
|
|
72
|
+
const decoder = await coldSync.getLocalDecoderForRange(range);
|
|
73
|
+
if (decoder) {
|
|
74
|
+
decoder.free();
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
suite.add(`StartSync local decoder (warm, n=${size})`, async () => {
|
|
78
|
+
const decoder = await warmSync.getLocalDecoderForRange(range);
|
|
79
|
+
if (decoder) {
|
|
80
|
+
decoder.free();
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
suite.add(`StartSync local decoder (after invalidation, n=${size})`, async () => {
|
|
84
|
+
warmSync.invalidateLocalRangeEncoderCache();
|
|
85
|
+
const decoder = await warmSync.getLocalDecoderForRange(range);
|
|
86
|
+
if (decoder) {
|
|
87
|
+
decoder.free();
|
|
88
|
+
}
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
await suite.run();
|
|
92
|
+
if (process.env.BENCH_JSON === "1") {
|
|
93
|
+
const tasks = suite.tasks.map((task) => ({
|
|
94
|
+
name: task.name,
|
|
95
|
+
hz: task.result?.hz ?? null,
|
|
96
|
+
mean_ms: task.result?.mean ?? null,
|
|
97
|
+
rme: task.result?.rme ?? null,
|
|
98
|
+
samples: task.result?.samples?.length ?? null,
|
|
99
|
+
}));
|
|
100
|
+
process.stdout.write(JSON.stringify({
|
|
101
|
+
name: suite.name,
|
|
102
|
+
tasks,
|
|
103
|
+
meta: { sizes, warmupIterations, iterations },
|
|
104
|
+
}, null, 2));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.table(suite.table());
|
|
108
|
+
}
|
|
109
|
+
for (const closeSync of syncsToClose) {
|
|
110
|
+
await closeSync();
|
|
111
|
+
}
|
|
112
|
+
//# sourceMappingURL=rateless-iblt-startsync-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rateless-iblt-startsync-cache.js","sourceRoot":"","sources":["../../benchmark/rateless-iblt-startsync-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-catchup.d.ts","sourceRoot":"","sources":["../../benchmark/sync-catchup.ts"],"names":[],"mappings":"AAoBA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAOxD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,EAa5C,CAAC"}
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
// Benchmarks full catch-up sync time: one peer has N entries, the other starts empty.
|
|
2
|
+
//
|
|
3
|
+
// Run with:
|
|
4
|
+
// cd packages/programs/data/shared-log
|
|
5
|
+
// CATCHUP_COUNT=5000 CATCHUP_TIMEOUT=60000 node --loader ts-node/esm ./benchmark/sync-catchup.ts
|
|
6
|
+
//
|
|
7
|
+
// Notes:
|
|
8
|
+
// - This is an integration benchmark (network + sync + indexing). It is more variable than pure
|
|
9
|
+
// algorithmic benches; prefer running it a few times and comparing medians.
|
|
10
|
+
// - For CI regression tracking, consider smaller `CATCHUP_COUNT` values and low run counts.
|
|
11
|
+
import { keys } from "@libp2p/crypto";
|
|
12
|
+
import { TestSession } from "@peerbit/test-utils";
|
|
13
|
+
import { waitForResolved } from "@peerbit/time";
|
|
14
|
+
import { expect } from "chai";
|
|
15
|
+
import { performance } from "node:perf_hooks";
|
|
16
|
+
import { v4 as uuid } from "uuid";
|
|
17
|
+
import { createReplicationDomainHash } from "../src/replication-domain-hash.js";
|
|
18
|
+
import { RatelessIBLTSynchronizer } from "../src/sync/rateless-iblt.js";
|
|
19
|
+
import { SimpleSyncronizer } from "../src/sync/simple.js";
|
|
20
|
+
import { EventStore } from "../test/utils/stores/event-store.js";
|
|
21
|
+
const entryCount = Number.parseInt(process.env.CATCHUP_COUNT || "5000", 10);
|
|
22
|
+
const timeoutMs = Number.parseInt(process.env.CATCHUP_TIMEOUT || "60000", 10);
|
|
23
|
+
const runs = Number.parseInt(process.env.CATCHUP_RUNS || "1", 10);
|
|
24
|
+
export const testSetups = [
|
|
25
|
+
{
|
|
26
|
+
domain: createReplicationDomainHash("u32"),
|
|
27
|
+
type: "u32",
|
|
28
|
+
syncronizer: SimpleSyncronizer,
|
|
29
|
+
name: "u32-simple",
|
|
30
|
+
},
|
|
31
|
+
{
|
|
32
|
+
domain: createReplicationDomainHash("u64"),
|
|
33
|
+
type: "u64",
|
|
34
|
+
syncronizer: RatelessIBLTSynchronizer,
|
|
35
|
+
name: "u64-iblt",
|
|
36
|
+
},
|
|
37
|
+
];
|
|
38
|
+
const fixedKeys = [
|
|
39
|
+
{
|
|
40
|
+
libp2p: {
|
|
41
|
+
privateKey: keys.privateKeyFromRaw(new Uint8Array([
|
|
42
|
+
204, 234, 187, 172, 226, 232, 70, 175, 62, 211, 147, 91, 229, 157,
|
|
43
|
+
168, 15, 45, 242, 144, 98, 75, 58, 208, 9, 223, 143, 251, 52, 252,
|
|
44
|
+
159, 64, 83, 52, 197, 24, 246, 24, 234, 141, 183, 151, 82, 53, 142,
|
|
45
|
+
57, 25, 148, 150, 26, 209, 223, 22, 212, 40, 201, 6, 191, 72, 148,
|
|
46
|
+
82, 66, 138, 199, 185,
|
|
47
|
+
])),
|
|
48
|
+
},
|
|
49
|
+
},
|
|
50
|
+
{
|
|
51
|
+
libp2p: {
|
|
52
|
+
privateKey: keys.privateKeyFromRaw(new Uint8Array([
|
|
53
|
+
237, 55, 205, 86, 40, 44, 73, 169, 196, 118, 36, 69, 214, 122, 28,
|
|
54
|
+
157, 208, 163, 15, 215, 104, 193, 151, 177, 62, 231, 253, 120, 122,
|
|
55
|
+
222, 174, 242, 120, 50, 165, 97, 8, 235, 97, 186, 148, 251, 100, 168,
|
|
56
|
+
49, 10, 119, 71, 246, 246, 174, 163, 198, 54, 224, 6, 174, 212, 159,
|
|
57
|
+
187, 2, 137, 47, 192,
|
|
58
|
+
])),
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
|
+
];
|
|
62
|
+
const runOnce = async (setup) => {
|
|
63
|
+
const session = await TestSession.disconnected(2, fixedKeys);
|
|
64
|
+
const store = new EventStore();
|
|
65
|
+
const db1 = await session.peers[0].open(store.clone(), {
|
|
66
|
+
args: { replicate: { factor: 1 }, setup },
|
|
67
|
+
});
|
|
68
|
+
const db2 = await session.peers[1].open(store.clone(), {
|
|
69
|
+
args: { replicate: { factor: 1 }, setup },
|
|
70
|
+
});
|
|
71
|
+
for (let i = 0; i < entryCount; i++) {
|
|
72
|
+
await db1.add(uuid(), { meta: { next: [] } });
|
|
73
|
+
}
|
|
74
|
+
expect(db1.log.log.length).to.equal(entryCount);
|
|
75
|
+
await waitForResolved(() => session.peers[0].dial(session.peers[1].getMultiaddrs()));
|
|
76
|
+
const t0 = performance.now();
|
|
77
|
+
await waitForResolved(() => {
|
|
78
|
+
expect(db2.log.log.length).to.equal(entryCount);
|
|
79
|
+
}, { timeout: timeoutMs, delayInterval: 250 });
|
|
80
|
+
const dt = performance.now() - t0;
|
|
81
|
+
await session.stop();
|
|
82
|
+
return dt;
|
|
83
|
+
};
|
|
84
|
+
const tasks = [];
|
|
85
|
+
for (const setup of testSetups) {
|
|
86
|
+
const samples = [];
|
|
87
|
+
for (let i = 0; i < runs; i++) {
|
|
88
|
+
samples.push(await runOnce(setup));
|
|
89
|
+
}
|
|
90
|
+
const mean_ms = samples.reduce((acc, x) => acc + x, 0) / samples.length;
|
|
91
|
+
tasks.push({
|
|
92
|
+
name: `${setup.name} catchup (n=${entryCount})`,
|
|
93
|
+
mean_ms,
|
|
94
|
+
hz: mean_ms > 0 ? 1000 / mean_ms : 0,
|
|
95
|
+
rme: null,
|
|
96
|
+
samples: samples.length,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (process.env.BENCH_JSON === "1") {
|
|
100
|
+
process.stdout.write(JSON.stringify({
|
|
101
|
+
name: "shared-log-sync-catchup",
|
|
102
|
+
tasks,
|
|
103
|
+
meta: { entryCount, timeoutMs, runs },
|
|
104
|
+
}, null, 2));
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
console.table(tasks);
|
|
108
|
+
}
|
|
109
|
+
//# sourceMappingURL=sync-catchup.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync-catchup.js","sourceRoot":"","sources":["../../benchmark/sync-catchup.ts"],"names":[],"mappings":"AAAA,sFAAsF;AACtF,EAAE;AACF,YAAY;AACZ,yCAAyC;AACzC,mGAAmG;AACnG,EAAE;AACF,SAAS;AACT,gGAAgG;AAChG,8EAA8E;AAC9E,4FAA4F;AAE5F,OAAO,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAChD,OAAO,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAC9B,OAAO,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAC9C,OAAO,EAAE,EAAE,IAAI,IAAI,EAAE,MAAM,MAAM,CAAC;AAClC,OAAO,EAAE,2BAA2B,EAAE,MAAM,mCAAmC,CAAC;AAChF,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AAE1D,OAAO,EAAE,UAAU,EAAE,MAAM,qCAAqC,CAAC;AAEjE,MAAM,UAAU,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,IAAI,MAAM,EAAE,EAAE,CAAC,CAAC;AAC5E,MAAM,SAAS,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,IAAI,OAAO,EAAE,EAAE,CAAC,CAAC;AAC9E,MAAM,IAAI,GAAG,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AAElE,MAAM,CAAC,MAAM,UAAU,GAA2B;IACjD;QACC,MAAM,EAAE,2BAA2B,CAAC,KAAK,CAAC;QAC1C,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,iBAAiB;QAC9B,IAAI,EAAE,YAAY;KAClB;IACD;QACC,MAAM,EAAE,2BAA2B,CAAC,KAAK,CAAC;QAC1C,IAAI,EAAE,KAAK;QACX,WAAW,EAAE,wBAAwB;QACrC,IAAI,EAAE,UAAU;KAChB;CACD,CAAC;AAEF,MAAM,SAAS,GAAG;IACjB;QACC,MAAM,EAAE;YACP,UAAU,EAAE,IAAI,CAAC,iBAAiB,CACjC,IAAI,UAAU,CAAC;gBACd,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG;gBACjE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;gBACjE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG;gBAClE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;gBACjE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;aACrB,CAAC,CACF;SACD;KACD;IACD;QACC,MAAM,EAAE;YACP,UAAU,EAAE,IAAI,CAAC,iBAAiB,CACjC,IAAI,UAAU,CAAC;gBACd,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;gBACjE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;gBAClE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;gBACpE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG;gBACnE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG;aACpB,CAAC,CACF;SACD;KACD;CACD,CAAC;AAEF,MAAM,OAAO,GAAG,KAAK,EAAE,KAA2B,EAAE,EAAE;IACrD,MAAM,OAAO,GAAG,MAAM,WAAW,CAAC,YAAY,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC;IAC7D,MAAM,KAAK,GAAG,IAAI,UAAU,EAAe,CAAC;IAE5C,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE;QACtD,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE;KACzC,CAAC,CAAC;IACH,MAAM,GAAG,GAAG,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE;QACtD,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,KAAK,EAAE;KACzC,CAAC,CAAC;IAEH,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAEhD,MAAM,eAAe,CAAC,GAAG,EAAE,CAC1B,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC,CACvD,CAAC;IAEF,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC;IAC7B,MAAM,eAAe,CACpB,GAAG,EAAE;QACJ,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IACjD,CAAC,EACD,EAAE,OAAO,EAAE,SAAS,EAAE,aAAa,EAAE,GAAG,EAAE,CAC1C,CAAC;IACF,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,GAAG,EAAE,CAAC;IAElC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IAErB,OAAO,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,MAAM,KAAK,GAMN,EAAE,CAAC;AAER,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;IAChC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC;QAC/B,OAAO,CAAC,IAAI,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IACxE,KAAK,CAAC,IAAI,CAAC;QACV,IAAI,EAAE,GAAG,KAAK,CAAC,IAAI,eAAe,UAAU,GAAG;QAC/C,OAAO;QACP,EAAE,EAAE,OAAO,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;QACpC,GAAG,EAAE,IAAI;QACT,OAAO,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;AACJ,CAAC;AAED,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;IACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CACnB,IAAI,CAAC,SAAS,CACb;QACC,IAAI,EAAE,yBAAyB;QAC/B,KAAK;QACL,IAAI,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE;KACrC,EACD,IAAI,EACJ,CAAC,CACD,CACD,CAAC;AACH,CAAC;KAAM,CAAC;IACP,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -92,6 +92,8 @@ export type SharedLogOptions<T, D extends ReplicationDomain<any, T, R>, R extend
|
|
|
92
92
|
syncronizer?: SynchronizerConstructor<R>;
|
|
93
93
|
timeUntilRoleMaturity?: number;
|
|
94
94
|
waitForReplicatorTimeout?: number;
|
|
95
|
+
waitForReplicatorRequestIntervalMs?: number;
|
|
96
|
+
waitForReplicatorRequestMaxAttempts?: number;
|
|
95
97
|
waitForPruneDelay?: number;
|
|
96
98
|
distributionDebounceTime?: number;
|
|
97
99
|
compatibility?: number;
|
|
@@ -103,7 +105,9 @@ export type SharedLogOptions<T, D extends ReplicationDomain<any, T, R>, R extend
|
|
|
103
105
|
export declare const DEFAULT_MIN_REPLICAS = 2;
|
|
104
106
|
export declare const WAIT_FOR_REPLICATOR_TIMEOUT = 9000;
|
|
105
107
|
export declare const WAIT_FOR_ROLE_MATURITY = 5000;
|
|
106
|
-
export declare const
|
|
108
|
+
export declare const WAIT_FOR_REPLICATOR_REQUEST_INTERVAL = 1000;
|
|
109
|
+
export declare const WAIT_FOR_REPLICATOR_REQUEST_MIN_ATTEMPTS = 3;
|
|
110
|
+
export declare const WAIT_FOR_PRUNE_DELAY = 0;
|
|
107
111
|
export type Args<T, D extends ReplicationDomain<any, T, R>, R extends "u32" | "u64" = D extends ReplicationDomain<any, T, infer I> ? I : "u32"> = LogProperties<T> & LogEvents<T> & SharedLogOptions<T, D, R>;
|
|
108
112
|
export type DeliveryOptions = {
|
|
109
113
|
settle?: true | {
|
|
@@ -147,6 +151,7 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
147
151
|
private coordinateToHash;
|
|
148
152
|
private recentlyRebalanced;
|
|
149
153
|
uniqueReplicators: Set<string>;
|
|
154
|
+
private _replicatorsReconciled;
|
|
150
155
|
_gidPeersHistory: Map<string, Set<string>>;
|
|
151
156
|
private _onSubscriptionFn;
|
|
152
157
|
private _onUnsubscriptionFn;
|
|
@@ -180,6 +185,8 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
180
185
|
private cpuUsage?;
|
|
181
186
|
timeUntilRoleMaturity: number;
|
|
182
187
|
waitForReplicatorTimeout: number;
|
|
188
|
+
waitForReplicatorRequestIntervalMs: number;
|
|
189
|
+
waitForReplicatorRequestMaxAttempts?: number;
|
|
183
190
|
waitForPruneDelay: number;
|
|
184
191
|
distributionDebounceTime: number;
|
|
185
192
|
replicationController: PIDReplicationController;
|
|
@@ -356,7 +363,12 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
356
363
|
rebalanceAll(options?: {
|
|
357
364
|
clearCache?: boolean;
|
|
358
365
|
}): Promise<false | undefined>;
|
|
359
|
-
waitForPruned(
|
|
366
|
+
waitForPruned(options?: {
|
|
367
|
+
timeout?: number;
|
|
368
|
+
signal?: AbortSignal;
|
|
369
|
+
delayInterval?: number;
|
|
370
|
+
timeoutMessage?: string;
|
|
371
|
+
}): Promise<void>;
|
|
360
372
|
onReplicationChange(changeOrChanges: ReplicationChanges<ReplicationRangeIndexable<R>> | ReplicationChanges<ReplicationRangeIndexable<R>>[]): Promise<false | undefined>;
|
|
361
373
|
_onUnsubscription(evt: CustomEvent<UnsubcriptionEvent>): Promise<void>;
|
|
362
374
|
_onSubscription(evt: CustomEvent<SubscriptionEvent>): Promise<void>;
|