@peerbit/shared-log 12.2.0-e38a67b → 12.3.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/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 +16 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +259 -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/index.d.ts +14 -0
- package/dist/src/sync/index.d.ts.map +1 -1
- package/dist/src/sync/rateless-iblt.d.ts +14 -22
- package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
- package/dist/src/sync/rateless-iblt.js +137 -22
- package/dist/src/sync/rateless-iblt.js.map +1 -1
- package/dist/src/sync/simple.d.ts +3 -1
- package/dist/src/sync/simple.d.ts.map +1 -1
- package/dist/src/sync/simple.js +23 -1
- package/dist/src/sync/simple.js.map +1 -1
- package/package.json +20 -20
- package/src/index.ts +333 -126
- package/src/ranges.ts +97 -65
- package/src/sync/index.ts +19 -0
- package/src/sync/rateless-iblt.ts +187 -41
- package/src/sync/simple.ts +25 -2
|
@@ -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":"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"}
|
package/dist/src/index.d.ts
CHANGED
|
@@ -16,7 +16,7 @@ import { type ReplicationDomainHash, createReplicationDomainHash } from "./repli
|
|
|
16
16
|
import { type ReplicationDomainTime, createReplicationDomainTime } from "./replication-domain-time.js";
|
|
17
17
|
import { type CoverRange, type ExtractDomainArgs, type ReplicationDomain, type ReplicationDomainConstructor } from "./replication-domain.js";
|
|
18
18
|
import { AbsoluteReplicas, AddedReplicationSegmentMessage, AllReplicatingSegmentsMessage, type ReplicationLimits } from "./replication.js";
|
|
19
|
-
import type { SynchronizerConstructor, Syncronizer } from "./sync/index.js";
|
|
19
|
+
import type { SyncOptions, SynchronizerConstructor, Syncronizer } from "./sync/index.js";
|
|
20
20
|
export { type ReplicationDomain, type ReplicationDomainHash, type ReplicationDomainTime, createReplicationDomainHash, createReplicationDomainTime, };
|
|
21
21
|
export { type CPUUsage, CPUUsageIntervalLag };
|
|
22
22
|
export * from "./replication.js";
|
|
@@ -88,9 +88,12 @@ export type SharedLogOptions<T, D extends ReplicationDomain<any, T, R>, R extend
|
|
|
88
88
|
respondToIHaveTimeout?: number;
|
|
89
89
|
canReplicate?: (publicKey: PublicSignKey) => Promise<boolean> | boolean;
|
|
90
90
|
keep?: (entry: ShallowOrFullEntry<T> | EntryReplicated<R>) => Promise<boolean> | boolean;
|
|
91
|
+
sync?: SyncOptions<R>;
|
|
91
92
|
syncronizer?: SynchronizerConstructor<R>;
|
|
92
93
|
timeUntilRoleMaturity?: number;
|
|
93
94
|
waitForReplicatorTimeout?: number;
|
|
95
|
+
waitForReplicatorRequestIntervalMs?: number;
|
|
96
|
+
waitForReplicatorRequestMaxAttempts?: number;
|
|
94
97
|
waitForPruneDelay?: number;
|
|
95
98
|
distributionDebounceTime?: number;
|
|
96
99
|
compatibility?: number;
|
|
@@ -102,7 +105,9 @@ export type SharedLogOptions<T, D extends ReplicationDomain<any, T, R>, R extend
|
|
|
102
105
|
export declare const DEFAULT_MIN_REPLICAS = 2;
|
|
103
106
|
export declare const WAIT_FOR_REPLICATOR_TIMEOUT = 9000;
|
|
104
107
|
export declare const WAIT_FOR_ROLE_MATURITY = 5000;
|
|
105
|
-
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;
|
|
106
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>;
|
|
107
112
|
export type DeliveryOptions = {
|
|
108
113
|
settle?: true | {
|
|
@@ -146,6 +151,7 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
146
151
|
private coordinateToHash;
|
|
147
152
|
private recentlyRebalanced;
|
|
148
153
|
uniqueReplicators: Set<string>;
|
|
154
|
+
private _replicatorsReconciled;
|
|
149
155
|
_gidPeersHistory: Map<string, Set<string>>;
|
|
150
156
|
private _onSubscriptionFn;
|
|
151
157
|
private _onUnsubscriptionFn;
|
|
@@ -179,6 +185,8 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
179
185
|
private cpuUsage?;
|
|
180
186
|
timeUntilRoleMaturity: number;
|
|
181
187
|
waitForReplicatorTimeout: number;
|
|
188
|
+
waitForReplicatorRequestIntervalMs: number;
|
|
189
|
+
waitForReplicatorRequestMaxAttempts?: number;
|
|
182
190
|
waitForPruneDelay: number;
|
|
183
191
|
distributionDebounceTime: number;
|
|
184
192
|
replicationController: PIDReplicationController;
|
|
@@ -355,7 +363,12 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
355
363
|
rebalanceAll(options?: {
|
|
356
364
|
clearCache?: boolean;
|
|
357
365
|
}): Promise<false | undefined>;
|
|
358
|
-
waitForPruned(
|
|
366
|
+
waitForPruned(options?: {
|
|
367
|
+
timeout?: number;
|
|
368
|
+
signal?: AbortSignal;
|
|
369
|
+
delayInterval?: number;
|
|
370
|
+
timeoutMessage?: string;
|
|
371
|
+
}): Promise<void>;
|
|
359
372
|
onReplicationChange(changeOrChanges: ReplicationChanges<ReplicationRangeIndexable<R>> | ReplicationChanges<ReplicationRangeIndexable<R>>[]): Promise<false | undefined>;
|
|
360
373
|
_onUnsubscription(evt: CustomEvent<UnsubcriptionEvent>): Promise<void>;
|
|
361
374
|
_onSubscription(evt: CustomEvent<SubscriptionEvent>): Promise<void>;
|