@peerbit/shared-log 12.1.3 → 12.2.0-3333888
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 +10 -3
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +66 -32
- package/dist/src/index.js.map +1 -1
- package/dist/src/like.d.ts +71 -0
- package/dist/src/like.d.ts.map +1 -0
- package/dist/src/like.js +2 -0
- package/dist/src/like.js.map +1 -0
- 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 +139 -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 +24 -2
- package/dist/src/sync/simple.js.map +1 -1
- package/package.json +20 -20
- package/src/index.ts +95 -37
- package/src/like.ts +84 -0
- package/src/sync/index.ts +19 -0
- package/src/sync/rateless-iblt.ts +193 -40
- package/src/sync/simple.ts +26 -3
|
@@ -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,10 +16,11 @@ 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";
|
|
23
|
+
export type { LogLike, LogResultsIterator, SharedLogLike, SharedLogReplicationIndexLike, } from "./like.js";
|
|
23
24
|
export { type ReplicationRangeIndexable, ReplicationRangeIndexableU32, ReplicationRangeIndexableU64, type EntryReplicated, EntryReplicatedU32, EntryReplicatedU64, type CoverRange, NoPeersError, };
|
|
24
25
|
export { MAX_U32, MAX_U64, type NumberFromType };
|
|
25
26
|
export declare const logger: import("@libp2p/interface").Logger;
|
|
@@ -87,6 +88,7 @@ export type SharedLogOptions<T, D extends ReplicationDomain<any, T, R>, R extend
|
|
|
87
88
|
respondToIHaveTimeout?: number;
|
|
88
89
|
canReplicate?: (publicKey: PublicSignKey) => Promise<boolean> | boolean;
|
|
89
90
|
keep?: (entry: ShallowOrFullEntry<T> | EntryReplicated<R>) => Promise<boolean> | boolean;
|
|
91
|
+
sync?: SyncOptions<R>;
|
|
90
92
|
syncronizer?: SynchronizerConstructor<R>;
|
|
91
93
|
timeUntilRoleMaturity?: number;
|
|
92
94
|
waitForReplicatorTimeout?: number;
|
|
@@ -101,7 +103,7 @@ export type SharedLogOptions<T, D extends ReplicationDomain<any, T, R>, R extend
|
|
|
101
103
|
export declare const DEFAULT_MIN_REPLICAS = 2;
|
|
102
104
|
export declare const WAIT_FOR_REPLICATOR_TIMEOUT = 9000;
|
|
103
105
|
export declare const WAIT_FOR_ROLE_MATURITY = 5000;
|
|
104
|
-
export declare const WAIT_FOR_PRUNE_DELAY =
|
|
106
|
+
export declare const WAIT_FOR_PRUNE_DELAY = 0;
|
|
105
107
|
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>;
|
|
106
108
|
export type DeliveryOptions = {
|
|
107
109
|
settle?: true | {
|
|
@@ -354,7 +356,12 @@ export declare class SharedLog<T, D extends ReplicationDomain<any, T, R> = any,
|
|
|
354
356
|
rebalanceAll(options?: {
|
|
355
357
|
clearCache?: boolean;
|
|
356
358
|
}): Promise<false | undefined>;
|
|
357
|
-
waitForPruned(
|
|
359
|
+
waitForPruned(options?: {
|
|
360
|
+
timeout?: number;
|
|
361
|
+
signal?: AbortSignal;
|
|
362
|
+
delayInterval?: number;
|
|
363
|
+
timeoutMessage?: string;
|
|
364
|
+
}): Promise<void>;
|
|
358
365
|
onReplicationChange(changeOrChanges: ReplicationChanges<ReplicationRangeIndexable<R>> | ReplicationChanges<ReplicationRangeIndexable<R>>[]): Promise<false | undefined>;
|
|
359
366
|
_onUnsubscription(evt: CustomEvent<UnsubcriptionEvent>): Promise<void>;
|
|
360
367
|
_onSubscription(evt: CustomEvent<SubscriptionEvent>): Promise<void>;
|