@peerbit/shared-log 13.2.23 → 13.2.25

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 (175) hide show
  1. package/dist/src/checked-prune.d.ts +12 -0
  2. package/dist/src/checked-prune.d.ts.map +1 -1
  3. package/dist/src/checked-prune.js +33 -0
  4. package/dist/src/checked-prune.js.map +1 -1
  5. package/dist/src/coordinate-persistence.d.ts +211 -0
  6. package/dist/src/coordinate-persistence.d.ts.map +1 -0
  7. package/dist/src/coordinate-persistence.js +1133 -0
  8. package/dist/src/coordinate-persistence.js.map +1 -0
  9. package/dist/src/errors.d.ts +1 -0
  10. package/dist/src/errors.d.ts.map +1 -1
  11. package/dist/src/errors.js +19 -0
  12. package/dist/src/errors.js.map +1 -1
  13. package/dist/src/index.d.ts +139 -133
  14. package/dist/src/index.d.ts.map +1 -1
  15. package/dist/src/index.js +1491 -4265
  16. package/dist/src/index.js.map +1 -1
  17. package/dist/src/instance-lifecycle.d.ts +117 -0
  18. package/dist/src/instance-lifecycle.d.ts.map +1 -0
  19. package/dist/src/instance-lifecycle.js +254 -0
  20. package/dist/src/instance-lifecycle.js.map +1 -0
  21. package/dist/src/join-warmup.d.ts +86 -0
  22. package/dist/src/join-warmup.d.ts.map +1 -0
  23. package/dist/src/join-warmup.js +351 -0
  24. package/dist/src/join-warmup.js.map +1 -0
  25. package/dist/src/leader-plan-cache.d.ts +33 -0
  26. package/dist/src/leader-plan-cache.d.ts.map +1 -0
  27. package/dist/src/leader-plan-cache.js +49 -0
  28. package/dist/src/leader-plan-cache.js.map +1 -0
  29. package/dist/src/native-write-through-block-store.d.ts +123 -0
  30. package/dist/src/native-write-through-block-store.d.ts.map +1 -0
  31. package/dist/src/native-write-through-block-store.js +989 -0
  32. package/dist/src/native-write-through-block-store.js.map +1 -0
  33. package/dist/src/peer-session.d.ts +117 -0
  34. package/dist/src/peer-session.d.ts.map +1 -0
  35. package/dist/src/peer-session.js +259 -0
  36. package/dist/src/peer-session.js.map +1 -0
  37. package/dist/src/ranges.d.ts +2 -2
  38. package/dist/src/ranges.d.ts.map +1 -1
  39. package/dist/src/ranges.js +10 -8
  40. package/dist/src/ranges.js.map +1 -1
  41. package/dist/src/replication-announcement.d.ts +116 -0
  42. package/dist/src/replication-announcement.d.ts.map +1 -0
  43. package/dist/src/replication-announcement.js +515 -0
  44. package/dist/src/replication-announcement.js.map +1 -0
  45. package/dist/src/replicator-liveness.d.ts +59 -0
  46. package/dist/src/replicator-liveness.d.ts.map +1 -0
  47. package/dist/src/replicator-liveness.js +304 -0
  48. package/dist/src/replicator-liveness.js.map +1 -0
  49. package/dist/src/sync/dispatch-lifecycle.d.ts +48 -0
  50. package/dist/src/sync/dispatch-lifecycle.d.ts.map +1 -0
  51. package/dist/src/sync/dispatch-lifecycle.js +141 -0
  52. package/dist/src/sync/dispatch-lifecycle.js.map +1 -0
  53. package/dist/src/sync/factory.d.ts +29 -0
  54. package/dist/src/sync/factory.d.ts.map +1 -0
  55. package/dist/src/sync/factory.js +87 -0
  56. package/dist/src/sync/factory.js.map +1 -0
  57. package/dist/src/sync/pending-sync-store.d.ts +105 -0
  58. package/dist/src/sync/pending-sync-store.d.ts.map +1 -0
  59. package/dist/src/sync/pending-sync-store.js +877 -0
  60. package/dist/src/sync/pending-sync-store.js.map +1 -0
  61. package/dist/src/sync/rateless-iblt.d.ts +4 -1
  62. package/dist/src/sync/rateless-iblt.d.ts.map +1 -1
  63. package/dist/src/sync/rateless-iblt.js +102 -106
  64. package/dist/src/sync/rateless-iblt.js.map +1 -1
  65. package/dist/src/sync/simple.d.ts +10 -41
  66. package/dist/src/sync/simple.d.ts.map +1 -1
  67. package/dist/src/sync/simple.js +259 -952
  68. package/dist/src/sync/simple.js.map +1 -1
  69. package/dist/src/sync/sync-peer-state.d.ts +16 -0
  70. package/dist/src/sync/sync-peer-state.d.ts.map +1 -0
  71. package/dist/src/sync/sync-peer-state.js +82 -0
  72. package/dist/src/sync/sync-peer-state.js.map +1 -0
  73. package/package.json +22 -21
  74. package/src/checked-prune.ts +35 -0
  75. package/src/coordinate-persistence.ts +1796 -0
  76. package/src/errors.ts +21 -0
  77. package/src/index.ts +6367 -10052
  78. package/src/instance-lifecycle.ts +351 -0
  79. package/src/join-warmup.ts +507 -0
  80. package/src/leader-plan-cache.ts +61 -0
  81. package/src/native-write-through-block-store.ts +1170 -0
  82. package/src/peer-session.ts +336 -0
  83. package/src/ranges.ts +22 -16
  84. package/src/replication-announcement.ts +744 -0
  85. package/src/replicator-liveness.ts +439 -0
  86. package/src/sync/dispatch-lifecycle.ts +230 -0
  87. package/src/sync/factory.ts +154 -0
  88. package/src/sync/pending-sync-store.ts +1085 -0
  89. package/src/sync/rateless-iblt.ts +122 -132
  90. package/src/sync/simple.ts +334 -1144
  91. package/src/sync/sync-peer-state.ts +107 -0
  92. package/dist/benchmark/adaptive-ingest.d.ts +0 -2
  93. package/dist/benchmark/adaptive-ingest.d.ts.map +0 -1
  94. package/dist/benchmark/adaptive-ingest.js +0 -275
  95. package/dist/benchmark/adaptive-ingest.js.map +0 -1
  96. package/dist/benchmark/get-samples.d.ts +0 -2
  97. package/dist/benchmark/get-samples.d.ts.map +0 -1
  98. package/dist/benchmark/get-samples.js +0 -194
  99. package/dist/benchmark/get-samples.js.map +0 -1
  100. package/dist/benchmark/index.d.ts +0 -2
  101. package/dist/benchmark/index.d.ts.map +0 -1
  102. package/dist/benchmark/index.js +0 -224
  103. package/dist/benchmark/index.js.map +0 -1
  104. package/dist/benchmark/join-backfill-repair.d.ts +0 -2
  105. package/dist/benchmark/join-backfill-repair.d.ts.map +0 -1
  106. package/dist/benchmark/join-backfill-repair.js +0 -288
  107. package/dist/benchmark/join-backfill-repair.js.map +0 -1
  108. package/dist/benchmark/memory/child.d.ts +0 -2
  109. package/dist/benchmark/memory/child.d.ts.map +0 -1
  110. package/dist/benchmark/memory/child.js +0 -204
  111. package/dist/benchmark/memory/child.js.map +0 -1
  112. package/dist/benchmark/memory/index.d.ts +0 -2
  113. package/dist/benchmark/memory/index.d.ts.map +0 -1
  114. package/dist/benchmark/memory/index.js +0 -81
  115. package/dist/benchmark/memory/index.js.map +0 -1
  116. package/dist/benchmark/memory/utils.d.ts +0 -13
  117. package/dist/benchmark/memory/utils.d.ts.map +0 -1
  118. package/dist/benchmark/memory/utils.js +0 -2
  119. package/dist/benchmark/memory/utils.js.map +0 -1
  120. package/dist/benchmark/native-graph.d.ts +0 -2
  121. package/dist/benchmark/native-graph.d.ts.map +0 -1
  122. package/dist/benchmark/native-graph.js +0 -359
  123. package/dist/benchmark/native-graph.js.map +0 -1
  124. package/dist/benchmark/network-preset-e2e.d.ts +0 -2
  125. package/dist/benchmark/network-preset-e2e.d.ts.map +0 -1
  126. package/dist/benchmark/network-preset-e2e.js +0 -497
  127. package/dist/benchmark/network-preset-e2e.js.map +0 -1
  128. package/dist/benchmark/partial-sync.d.ts +0 -3
  129. package/dist/benchmark/partial-sync.d.ts.map +0 -1
  130. package/dist/benchmark/partial-sync.js +0 -121
  131. package/dist/benchmark/partial-sync.js.map +0 -1
  132. package/dist/benchmark/pid-convergence.d.ts +0 -2
  133. package/dist/benchmark/pid-convergence.d.ts.map +0 -1
  134. package/dist/benchmark/pid-convergence.js +0 -138
  135. package/dist/benchmark/pid-convergence.js.map +0 -1
  136. package/dist/benchmark/rateless-iblt-sender-startsync.d.ts +0 -2
  137. package/dist/benchmark/rateless-iblt-sender-startsync.d.ts.map +0 -1
  138. package/dist/benchmark/rateless-iblt-sender-startsync.js +0 -104
  139. package/dist/benchmark/rateless-iblt-sender-startsync.js.map +0 -1
  140. package/dist/benchmark/rateless-iblt-startsync-cache.d.ts +0 -2
  141. package/dist/benchmark/rateless-iblt-startsync-cache.d.ts.map +0 -1
  142. package/dist/benchmark/rateless-iblt-startsync-cache.js +0 -112
  143. package/dist/benchmark/rateless-iblt-startsync-cache.js.map +0 -1
  144. package/dist/benchmark/receive-prune.d.ts +0 -2
  145. package/dist/benchmark/receive-prune.d.ts.map +0 -1
  146. package/dist/benchmark/receive-prune.js +0 -818
  147. package/dist/benchmark/receive-prune.js.map +0 -1
  148. package/dist/benchmark/replication-prune.d.ts +0 -2
  149. package/dist/benchmark/replication-prune.d.ts.map +0 -1
  150. package/dist/benchmark/replication-prune.js +0 -105
  151. package/dist/benchmark/replication-prune.js.map +0 -1
  152. package/dist/benchmark/replication.d.ts +0 -2
  153. package/dist/benchmark/replication.d.ts.map +0 -1
  154. package/dist/benchmark/replication.js +0 -88
  155. package/dist/benchmark/replication.js.map +0 -1
  156. package/dist/benchmark/sync-batch-sweep.d.ts +0 -2
  157. package/dist/benchmark/sync-batch-sweep.d.ts.map +0 -1
  158. package/dist/benchmark/sync-batch-sweep.js +0 -353
  159. package/dist/benchmark/sync-batch-sweep.js.map +0 -1
  160. package/dist/benchmark/sync-catchup.d.ts +0 -2
  161. package/dist/benchmark/sync-catchup.d.ts.map +0 -1
  162. package/dist/benchmark/sync-catchup.js +0 -277
  163. package/dist/benchmark/sync-catchup.js.map +0 -1
  164. package/dist/benchmark/sync-phase-profile.d.ts +0 -2
  165. package/dist/benchmark/sync-phase-profile.d.ts.map +0 -1
  166. package/dist/benchmark/sync-phase-profile.js +0 -303
  167. package/dist/benchmark/sync-phase-profile.js.map +0 -1
  168. package/dist/benchmark/to-rebalance.d.ts +0 -2
  169. package/dist/benchmark/to-rebalance.d.ts.map +0 -1
  170. package/dist/benchmark/to-rebalance.js +0 -117
  171. package/dist/benchmark/to-rebalance.js.map +0 -1
  172. package/dist/benchmark/utils.d.ts +0 -24
  173. package/dist/benchmark/utils.d.ts.map +0 -1
  174. package/dist/benchmark/utils.js +0 -47
  175. package/dist/benchmark/utils.js.map +0 -1
@@ -1,497 +0,0 @@
1
- // End-to-end benchmark of the native network preset (`peerbit/rust`) against
2
- // the all-default TS client. Two real Peerbit nodes in one process, connected
3
- // over real TCP (127.0.0.1), open the same EventStore — mirroring
4
- // `test/network-e2e-native.spec.ts`. Three scenarios:
5
- //
6
- // cold-sync N independent entries written on peer1 before peer2
7
- // connects; measures entries/s until peer2 converges.
8
- // live-puts sustained awaited puts on peer1 while peer2 replicates;
9
- // measures peer2-visible throughput and per-put visibility
10
- // latency (p50/p95, attributed by log-length polling).
11
- // stash-pressure native leg only: a large-payload burst below and above
12
- // the wire-sync stash caps (512 msgs / 64 MB). The inbound
13
- // wire keeps end-to-end pace with the consumer in a 2-node
14
- // run (per-frame dispatch backpressure), so to reach the
15
- // FIFO boundary the receiver's program dispatch is gated
16
- // (held and replayed in order) while the burst arrives —
17
- // the stalled-consumer situation the caps exist for.
18
- // Asserts convergence (evicted messages are recovered by
19
- // the TS fallback decode) and reports how the commit-phase
20
- // throughput degrades across the eviction boundary.
21
- //
22
- // Legs: `default` = `Peerbit.create()` (pure TS wire path) and `native` =
23
- // `Peerbit.create(createRustPeerbitOptions())` (rust core stream + wire-sync
24
- // receive fusion + native shared-log defaults).
25
- //
26
- // Strictly sequential: legs and runs never overlap; each run creates and
27
- // stops its own pair of clients. Defaults: 2 warmup + 5 measured runs.
28
- //
29
- // Run with:
30
- // cd packages/programs/data/shared-log
31
- // node --loader ts-node/esm ./benchmark/network-preset-e2e.ts
32
- // NET_BENCH_SCENARIOS=cold-sync NET_BENCH_RUNS=3 node --loader ts-node/esm ./benchmark/network-preset-e2e.ts
33
- // NET_BENCH_COLD_COUNT=5000 BENCH_JSON=1 node --loader ts-node/esm ./benchmark/network-preset-e2e.ts
34
- //
35
- // Caveats:
36
- // - Both nodes share one process (and one JS thread), like the rest of the
37
- // networked benchmarks in this directory: numbers measure the combined
38
- // sender+receiver pipeline, not isolated per-node cost.
39
- // - Per-put latency attributes visibility by log-length order, which is an
40
- // approximation when entries commit out of order on the receiver.
41
- import { waitForResolved } from "@peerbit/time";
42
- import { expect } from "chai";
43
- import { performance } from "node:perf_hooks";
44
- import { Peerbit } from "peerbit";
45
- import { createRustPeerbitOptions } from "peerbit/rust";
46
- import { EventStore } from "../test/utils/stores/event-store.js";
47
- const envInt = (name, fallback) => {
48
- const value = process.env[name];
49
- return value ? Number.parseInt(value, 10) : fallback;
50
- };
51
- const warmupRuns = envInt("NET_BENCH_WARMUP", 2);
52
- const measuredRuns = envInt("NET_BENCH_RUNS", 5);
53
- const timeoutMs = envInt("NET_BENCH_TIMEOUT", 120_000);
54
- const coldCount = envInt("NET_BENCH_COLD_COUNT", 8000);
55
- const coldPayload = envInt("NET_BENCH_COLD_PAYLOAD", 1024);
56
- const liveCount = envInt("NET_BENCH_LIVE_COUNT", 2000);
57
- const livePayload = envInt("NET_BENCH_LIVE_PAYLOAD", 256);
58
- const stashPayload = envInt("NET_BENCH_STASH_PAYLOAD", 128 * 1024);
59
- const stashBelowCount = envInt("NET_BENCH_STASH_BELOW_COUNT", 256);
60
- const stashAboveCount = envInt("NET_BENCH_STASH_ABOVE_COUNT", 1024);
61
- const captureProfile = process.env.NET_BENCH_PROFILE !== "0";
62
- const allScenarios = ["cold-sync", "live-puts", "stash-pressure"];
63
- const scenarios = (process.env.NET_BENCH_SCENARIOS?.split(",")
64
- .map((x) => x.trim())
65
- .filter(Boolean) ?? [...allScenarios]).map((name) => {
66
- if (!allScenarios.includes(name)) {
67
- throw new Error(`Unknown scenario '${name}'`);
68
- }
69
- return name;
70
- });
71
- const legs = (process.env.NET_BENCH_LEGS?.split(",")
72
- .map((x) => x.trim())
73
- .filter(Boolean) ?? ["default", "native"]).map((name) => {
74
- if (name !== "default" && name !== "native") {
75
- throw new Error(`Unknown leg '${name}'`);
76
- }
77
- return name;
78
- });
79
- const createClient = (leg) => leg === "native"
80
- ? Peerbit.create({ ...createRustPeerbitOptions() })
81
- : Peerbit.create();
82
- const makePayload = (index, size) => {
83
- const prefix = `${index}-`;
84
- return prefix.length >= size
85
- ? prefix
86
- : prefix + "x".repeat(size - prefix.length);
87
- };
88
- const mean = (samples) => samples.reduce((acc, x) => acc + x, 0) / samples.length;
89
- const stdev = (samples) => {
90
- if (samples.length < 2) {
91
- return 0;
92
- }
93
- const m = mean(samples);
94
- return Math.sqrt(samples.reduce((acc, x) => acc + (x - m) * (x - m), 0) /
95
- (samples.length - 1));
96
- };
97
- const percentile = (samples, p) => {
98
- if (samples.length === 0) {
99
- return 0;
100
- }
101
- const sorted = [...samples].sort((a, b) => a - b);
102
- const index = Math.min(sorted.length - 1, Math.max(0, Math.ceil((p / 100) * sorted.length) - 1));
103
- return sorted[index];
104
- };
105
- const fmt = (value, digits = 1) => Number.isFinite(value) ? value.toFixed(digits) : "n/a";
106
- const wireSyncOf = (client) => client.nativeNetwork?.wireSync;
107
- const sumProfile = (events, name, pick) => events
108
- .filter((event) => event.name === name)
109
- .reduce((sum, event) => sum + pick(event), 0);
110
- const openPair = async (leg) => {
111
- const peer1 = await createClient(leg);
112
- const peer2 = await createClient(leg);
113
- const events1 = [];
114
- const events2 = [];
115
- const store = new EventStore();
116
- // no onChange consumer so the native-leg client defaults (raw
117
- // exchange-heads + wire-sync receive fusion) stay applicable; a
118
- // profile-only sync option does not override them
119
- const openArgs = (events) => ({
120
- args: {
121
- replicate: { factor: 1 },
122
- timeUntilRoleMaturity: 0,
123
- sync: captureProfile
124
- ? { profile: (event) => events.push(event) }
125
- : undefined,
126
- },
127
- });
128
- const db1 = await peer1.open(store.clone(), openArgs(events1));
129
- const db2 = await peer2.open(store.clone(), openArgs(events2));
130
- return { peer1, peer2, db1, db2, events1, events2 };
131
- };
132
- const stopPair = async (pair) => {
133
- await pair.peer1.stop();
134
- await pair.peer2.stop();
135
- };
136
- /** Shared by cold-sync and stash-pressure: seed peer1, dial, time convergence. */
137
- const bulkSyncOnce = async (leg, entryCount, payloadSize) => {
138
- const pair = await openPair(leg);
139
- const { peer1, peer2, db1, db2, events1, events2 } = pair;
140
- let sampler;
141
- try {
142
- for (let index = 0; index < entryCount; index++) {
143
- await db1.add(makePayload(index, payloadSize), { meta: { next: [] } });
144
- }
145
- expect(db1.log.log.length).to.equal(entryCount);
146
- let maxStashLength = 0;
147
- const wireSync = wireSyncOf(peer2);
148
- if (wireSync) {
149
- sampler = setInterval(() => {
150
- const length = wireSync.stashLength;
151
- if (typeof length === "number" && length > maxStashLength) {
152
- maxStashLength = length;
153
- }
154
- }, 2);
155
- }
156
- await peer2.dial(peer1.getMultiaddrs());
157
- const t0 = performance.now();
158
- await waitForResolved(() => {
159
- expect(db2.log.log.length).to.equal(entryCount);
160
- }, {
161
- timeout: timeoutMs,
162
- delayInterval: 10,
163
- timeoutMessage: `${leg} bulk sync (n=${entryCount})`,
164
- });
165
- const dtMs = performance.now() - t0;
166
- if (sampler) {
167
- clearInterval(sampler);
168
- sampler = undefined;
169
- }
170
- return {
171
- dtMs,
172
- entriesPerSecond: (entryCount / dtMs) * 1000,
173
- mbPerSecond: ((entryCount * payloadSize) / (1024 * 1024) / dtMs) * 1000,
174
- senderSendMs: sumProfile(events1, "simple.exchangeHeads", (event) => event.durationMs ?? 0),
175
- counters: wireSyncOf(peer2)?.counters?.(),
176
- maxStashLength,
177
- deserializeFallbacks: sumProfile(events2, "sharedLog.rawReceive.deserializeFallback", () => 1),
178
- };
179
- }
180
- finally {
181
- if (sampler) {
182
- clearInterval(sampler);
183
- }
184
- await stopPair(pair);
185
- }
186
- };
187
- /**
188
- * Native leg only. Seeds peer1, then holds peer2's pubsub `data` dispatch for
189
- * the shared-log topic (frames >= the entry payload size, i.e. the raw
190
- * exchange-head bulk frames; small control RPC passes through) while the
191
- * burst arrives. The wire keeps decoding + stashing, so the stash crosses its
192
- * FIFO caps and evicts. The held events are then replayed in arrival order:
193
- * retained ids commit through the fused stash path, evicted ids fall back to
194
- * the TS decode path. Convergence is asserted; the commit phase is timed.
195
- */
196
- const stashPressureOnce = async (entryCount, payloadSize) => {
197
- const pair = await openPair("native");
198
- const { peer1, peer2, db1, db2, events2 } = pair;
199
- const pubsub = peer2.services.pubsub;
200
- const originalDispatch = pubsub.dispatchEvent.bind(peer2.services.pubsub);
201
- let gateInstalled = false;
202
- let sampler;
203
- try {
204
- for (let index = 0; index < entryCount; index++) {
205
- await db1.add(makePayload(index, payloadSize), { meta: { next: [] } });
206
- }
207
- const wireSync = wireSyncOf(peer2);
208
- if (!wireSync?.counters) {
209
- throw new Error("native leg without a wire-sync session");
210
- }
211
- const topic = db2.log.rpc.topic;
212
- const held = [];
213
- let gateOpen = false;
214
- pubsub.dispatchEvent = (event) => {
215
- if (!gateOpen && event.type === "data") {
216
- const detail = event.detail;
217
- if (detail?.data?.topics?.includes(topic) &&
218
- (detail.data.data?.byteLength ?? 0) >= payloadSize) {
219
- held.push(event);
220
- return true;
221
- }
222
- }
223
- return originalDispatch(event);
224
- };
225
- gateInstalled = true;
226
- let maxStashLength = 0;
227
- sampler = setInterval(() => {
228
- const length = wireSync.stashLength;
229
- if (typeof length === "number" && length > maxStashLength) {
230
- maxStashLength = length;
231
- }
232
- }, 2);
233
- await peer2.dial(peer1.getMultiaddrs());
234
- const t0 = performance.now();
235
- // hold until the burst has fully arrived: the stash-activity counter
236
- // stops moving (all bulk frames are either stashed or evicted)
237
- let lastStashed = -1;
238
- let stableSince = performance.now();
239
- await waitForResolved(() => {
240
- const stashed = wireSync.counters().stashed;
241
- const now = performance.now();
242
- if (stashed !== lastStashed) {
243
- lastStashed = stashed;
244
- stableSince = now;
245
- }
246
- expect(stashed).to.be.greaterThan(0);
247
- expect(now - stableSince).to.be.greaterThanOrEqual(500);
248
- }, {
249
- timeout: timeoutMs,
250
- delayInterval: 100,
251
- timeoutMessage: `stash pressure burst arrival (n=${entryCount})`,
252
- });
253
- const commitStart = performance.now();
254
- gateOpen = true;
255
- const heldFrames = held.length;
256
- for (const event of held) {
257
- originalDispatch(event);
258
- }
259
- pubsub.dispatchEvent = originalDispatch;
260
- gateInstalled = false;
261
- await waitForResolved(() => {
262
- expect(db2.log.log.length).to.equal(entryCount);
263
- }, {
264
- timeout: timeoutMs,
265
- delayInterval: 10,
266
- timeoutMessage: `stash pressure convergence (n=${entryCount})`,
267
- });
268
- const tEnd = performance.now();
269
- clearInterval(sampler);
270
- sampler = undefined;
271
- const commitDtMs = tEnd - commitStart;
272
- const counters = wireSync.counters();
273
- return {
274
- totalDtMs: tEnd - t0,
275
- commitDtMs,
276
- entriesPerSecondCommit: (entryCount / commitDtMs) * 1000,
277
- mbPerSecondCommit: ((entryCount * payloadSize) / (1024 * 1024) / commitDtMs) * 1000,
278
- heldFrames,
279
- stashed: counters.stashed,
280
- evicted: counters.evicted,
281
- maxStashLength,
282
- deserializeFallbacks: sumProfile(events2, "sharedLog.rawReceive.deserializeFallback", () => 1),
283
- };
284
- }
285
- finally {
286
- if (gateInstalled) {
287
- pubsub.dispatchEvent = originalDispatch;
288
- }
289
- if (sampler) {
290
- clearInterval(sampler);
291
- }
292
- await stopPair(pair);
293
- }
294
- };
295
- const livePutsOnce = async (leg, putCount, payloadSize) => {
296
- const pair = await openPair(leg);
297
- const { peer1, peer2, db1, db2 } = pair;
298
- let poller;
299
- try {
300
- await peer2.dial(peer1.getMultiaddrs());
301
- await db1.log.waitForReplicator(peer2.identity.publicKey, {
302
- timeout: timeoutMs,
303
- });
304
- await db2.log.waitForReplicator(peer1.identity.publicKey, {
305
- timeout: timeoutMs,
306
- });
307
- // warm the path so the first measured put does not pay one-time costs
308
- await db1.add(makePayload(0, payloadSize), { meta: { next: [] } });
309
- await waitForResolved(() => {
310
- expect(db2.log.log.length).to.equal(1);
311
- }, { timeout: timeoutMs, timeoutMessage: `${leg} live-puts warm put` });
312
- const baseline = db2.log.log.length;
313
- const putStart = new Array(putCount);
314
- const putResolved = new Array(putCount);
315
- const visibleAt = new Array(putCount);
316
- let seen = 0;
317
- const observe = () => {
318
- const visible = Math.min(db2.log.log.length - baseline, putCount);
319
- if (visible > seen) {
320
- const now = performance.now();
321
- while (seen < visible) {
322
- visibleAt[seen++] = now;
323
- }
324
- }
325
- };
326
- poller = setInterval(observe, 1);
327
- for (let index = 0; index < putCount; index++) {
328
- putStart[index] = performance.now();
329
- await db1.add(makePayload(index + 1, payloadSize), {
330
- meta: { next: [] },
331
- });
332
- putResolved[index] = performance.now();
333
- }
334
- await waitForResolved(() => {
335
- observe();
336
- expect(seen).to.equal(putCount);
337
- }, {
338
- timeout: timeoutMs,
339
- delayInterval: 5,
340
- timeoutMessage: `${leg} live puts convergence (n=${putCount})`,
341
- });
342
- clearInterval(poller);
343
- poller = undefined;
344
- const latencies = visibleAt.map((visible, index) => {
345
- return visible - putStart[index];
346
- });
347
- const addDurations = putResolved.map((resolved, index) => resolved - putStart[index]);
348
- const wallMs = visibleAt[putCount - 1] - putStart[0];
349
- return {
350
- putsPerSecond: (putCount / wallMs) * 1000,
351
- latencyP50Ms: percentile(latencies, 50),
352
- latencyP95Ms: percentile(latencies, 95),
353
- latencyMeanMs: mean(latencies),
354
- addMeanMs: mean(addDurations),
355
- };
356
- }
357
- finally {
358
- if (poller) {
359
- clearInterval(poller);
360
- }
361
- await stopPair(pair);
362
- }
363
- };
364
- const tasks = [];
365
- const collect = async (name, runOnce, units, describe) => {
366
- console.error(`# ${name}: ${warmupRuns} warmup + ${measuredRuns} measured`);
367
- for (let index = 0; index < warmupRuns; index++) {
368
- await runOnce();
369
- console.error(` warmup ${index + 1}/${warmupRuns} done`);
370
- }
371
- const samplesByMetric = {};
372
- for (let index = 0; index < measuredRuns; index++) {
373
- const result = await runOnce();
374
- for (const [key, value] of Object.entries(result)) {
375
- (samplesByMetric[key] ??= []).push(value);
376
- }
377
- console.error(` run ${index + 1}/${measuredRuns} done`);
378
- }
379
- const metrics = {};
380
- for (const [key, samples] of Object.entries(samplesByMetric)) {
381
- metrics[key] = {
382
- mean: mean(samples),
383
- stdev: stdev(samples),
384
- unit: units[key] ?? "",
385
- };
386
- }
387
- tasks.push({
388
- name,
389
- samples: measuredRuns,
390
- metrics,
391
- notes: describe?.(samplesByMetric),
392
- });
393
- };
394
- for (const scenario of scenarios) {
395
- if (scenario === "cold-sync") {
396
- for (const leg of legs) {
397
- await collect(`cold-sync/${leg} (n=${coldCount}, payload=${coldPayload}B)`, async () => {
398
- const result = await bulkSyncOnce(leg, coldCount, coldPayload);
399
- return {
400
- dtMs: result.dtMs,
401
- entriesPerSecond: result.entriesPerSecond,
402
- mbPerSecond: result.mbPerSecond,
403
- senderSendMs: result.senderSendMs,
404
- senderSendShare: result.dtMs > 0 ? result.senderSendMs / result.dtMs : 0,
405
- evicted: result.counters?.evicted ?? 0,
406
- deserializeFallbacks: result.deserializeFallbacks,
407
- };
408
- }, {
409
- dtMs: "ms",
410
- entriesPerSecond: "entries/s",
411
- mbPerSecond: "MB/s",
412
- senderSendMs: "ms",
413
- senderSendShare: "of wall",
414
- evicted: "msgs",
415
- deserializeFallbacks: "msgs",
416
- });
417
- }
418
- }
419
- else if (scenario === "live-puts") {
420
- for (const leg of legs) {
421
- await collect(`live-puts/${leg} (n=${liveCount}, payload=${livePayload}B)`, async () => {
422
- const result = await livePutsOnce(leg, liveCount, livePayload);
423
- return { ...result };
424
- }, {
425
- putsPerSecond: "puts/s",
426
- latencyP50Ms: "ms",
427
- latencyP95Ms: "ms",
428
- latencyMeanMs: "ms",
429
- addMeanMs: "ms",
430
- });
431
- }
432
- }
433
- else {
434
- // stash-pressure runs only on the native leg: the FIFO caps are a
435
- // property of the wire-sync stash
436
- if (!legs.includes("native")) {
437
- continue;
438
- }
439
- for (const [label, count] of [
440
- ["below-cap", stashBelowCount],
441
- ["above-cap", stashAboveCount],
442
- ]) {
443
- const totalMb = (count * stashPayload) / (1024 * 1024);
444
- await collect(`stash-pressure/native ${label} (n=${count}, payload=${stashPayload}B, ~${fmt(totalMb, 0)}MB)`,
445
- // convergence is asserted inside stashPressureOnce; evicted
446
- // stash entries must have been recovered by the TS fallback
447
- // decode for the run to get here
448
- () => stashPressureOnce(count, stashPayload), {
449
- totalDtMs: "ms",
450
- commitDtMs: "ms",
451
- entriesPerSecondCommit: "entries/s",
452
- mbPerSecondCommit: "MB/s",
453
- heldFrames: "msgs",
454
- stashed: "msgs",
455
- evicted: "msgs",
456
- maxStashLength: "msgs",
457
- deserializeFallbacks: "msgs",
458
- }, (samples) => label === "above-cap" && (samples.evicted ?? []).every((x) => x === 0)
459
- ? "warning: burst did not exceed the stash caps (no evictions observed)"
460
- : "converged on every run");
461
- }
462
- }
463
- }
464
- if (process.env.BENCH_JSON === "1") {
465
- process.stdout.write(JSON.stringify({
466
- name: "shared-log-network-preset-e2e",
467
- tasks,
468
- meta: {
469
- warmupRuns,
470
- measuredRuns,
471
- timeoutMs,
472
- coldCount,
473
- coldPayload,
474
- liveCount,
475
- livePayload,
476
- stashPayload,
477
- stashBelowCount,
478
- stashAboveCount,
479
- scenarios,
480
- legs,
481
- },
482
- }, null, 2));
483
- }
484
- else {
485
- for (const task of tasks) {
486
- console.log(`\n## ${task.name} (${task.samples} runs)`);
487
- console.log("| metric | mean | stdev | unit |");
488
- console.log("| --- | --- | --- | --- |");
489
- for (const [key, metric] of Object.entries(task.metrics)) {
490
- console.log(`| ${key} | ${fmt(metric.mean, 2)} | ${fmt(metric.stdev, 2)} | ${metric.unit} |`);
491
- }
492
- if (task.notes) {
493
- console.log(`\n${task.notes}`);
494
- }
495
- }
496
- }
497
- //# sourceMappingURL=network-preset-e2e.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"network-preset-e2e.js","sourceRoot":"","sources":["../../benchmark/network-preset-e2e.ts"],"names":[],"mappings":"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"}
@@ -1,3 +0,0 @@
1
- import type { TestSetupConfig } from "../test/utils.js";
2
- export declare const testSetups: TestSetupConfig<any>[];
3
- //# sourceMappingURL=partial-sync.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"partial-sync.d.ts","sourceRoot":"","sources":["../../benchmark/partial-sync.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAiDxD,eAAO,MAAM,UAAU,EAAE,eAAe,CAAC,GAAG,CAAC,EAmB5C,CAAC"}
@@ -1,121 +0,0 @@
1
- // this benchmark test the time it takes for two nodes with almost the same data to sync up
2
- import { keys } from "@libp2p/crypto";
3
- import { TestSession } from "@peerbit/test-utils";
4
- import { waitForResolved } from "@peerbit/time";
5
- import { expect } from "chai";
6
- import { v4 as uuid } from "uuid";
7
- import { createReplicationDomainHash } from "../src/replication-domain-hash.js";
8
- import { RatelessIBLTSynchronizer } from "../src/sync/rateless-iblt.js";
9
- import { SimpleSyncronizer } from "../src/sync/simple.js";
10
- import { EventStore } from "../test/utils/stores/event-store.js";
11
- // Run with "node --loader ts-node/esm ./benchmark/partial-sync.ts"
12
- let db1 = undefined;
13
- let db2 = undefined;
14
- const store = new EventStore();
15
- let syncedCount = 20e3;
16
- let unsyncedCount = 1;
17
- let totalCount = syncedCount + unsyncedCount * 2;
18
- const reset = async (session, setup) => {
19
- db1 = await session.peers[0].open(store.clone(), {
20
- args: {
21
- replicate: {
22
- factor: 1,
23
- },
24
- setup,
25
- },
26
- });
27
- db2 = await session.peers[1].open(store.clone(), {
28
- args: {
29
- replicate: {
30
- factor: 1,
31
- },
32
- setup,
33
- },
34
- });
35
- for (let i = 0; i < syncedCount; i++) {
36
- const entry = await db1.add(uuid(), { meta: { next: [] } });
37
- await db2.log.join([entry.entry]);
38
- }
39
- expect(db1.log.log.length).to.equal(syncedCount);
40
- expect(db2.log.log.length).to.equal(syncedCount);
41
- for (let i = 0; i < unsyncedCount; i++) {
42
- await db1.add(uuid(), { meta: { next: [] } });
43
- await db2.add(uuid(), { meta: { next: [] } });
44
- }
45
- expect(db1.log.log.length).to.equal(syncedCount + unsyncedCount);
46
- expect(db2.log.log.length).to.equal(syncedCount + unsyncedCount);
47
- };
48
- export const testSetups = [
49
- {
50
- domain: createReplicationDomainHash("u32"),
51
- type: "u32",
52
- syncronizer: SimpleSyncronizer,
53
- name: "u32-simple",
54
- } /*
55
- {
56
- domain: createReplicationDomainHash("u64"),
57
- type: "u64",
58
- syncronizer: SimpleSyncronizer,
59
- name: "u64-simple",
60
- }, */,
61
- {
62
- domain: createReplicationDomainHash("u64"),
63
- type: "u64",
64
- syncronizer: RatelessIBLTSynchronizer,
65
- name: "u64-iblt",
66
- },
67
- ];
68
- for (const setup of testSetups) {
69
- let session = await TestSession.disconnected(2, [
70
- {
71
- // TODO dialing fails with this?
72
- libp2p: {
73
- privateKey: keys.privateKeyFromRaw(new Uint8Array([
74
- 204, 234, 187, 172, 226, 232, 70, 175, 62, 211, 147, 91, 229, 157,
75
- 168, 15, 45, 242, 144, 98, 75, 58, 208, 9, 223, 143, 251, 52, 252,
76
- 159, 64, 83, 52, 197, 24, 246, 24, 234, 141, 183, 151, 82, 53, 142,
77
- 57, 25, 148, 150, 26, 209, 223, 22, 212, 40, 201, 6, 191, 72, 148,
78
- 82, 66, 138, 199, 185,
79
- ])),
80
- },
81
- },
82
- {
83
- libp2p: {
84
- privateKey: keys.privateKeyFromRaw(new Uint8Array([
85
- 237, 55, 205, 86, 40, 44, 73, 169, 196, 118, 36, 69, 214, 122, 28,
86
- 157, 208, 163, 15, 215, 104, 193, 151, 177, 62, 231, 253, 120, 122,
87
- 222, 174, 242, 120, 50, 165, 97, 8, 235, 97, 186, 148, 251, 100,
88
- 168, 49, 10, 119, 71, 246, 246, 174, 163, 198, 54, 224, 6, 174, 212,
89
- 159, 187, 2, 137, 47, 192,
90
- ])),
91
- },
92
- },
93
- ]);
94
- console.log("Resetting...");
95
- await reset(session, setup);
96
- console.log("Reset");
97
- if (!db1 || !db2) {
98
- throw new Error("db1 or db2 is undefined");
99
- }
100
- console.log("Starting sync...");
101
- const timeLabel = setup.name +
102
- ": " +
103
- "Entries " +
104
- totalCount +
105
- " of which " +
106
- unsyncedCount * 2 +
107
- " are unsynced";
108
- console.log("Dialing...");
109
- await waitForResolved(() => db1.node.dial(db2.node.getMultiaddrs()));
110
- console.time(timeLabel);
111
- console.log("Waiting for sync...");
112
- await waitForResolved(() => {
113
- expect(db1.log.log.length).to.equal(totalCount);
114
- expect(db2.log.log.length).to.equal(totalCount);
115
- }, {
116
- timeout: 3e4,
117
- });
118
- console.timeEnd(timeLabel);
119
- await session.stop();
120
- }
121
- //# sourceMappingURL=partial-sync.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"partial-sync.js","sourceRoot":"","sources":["../../benchmark/partial-sync.ts"],"names":[],"mappings":"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"}