orez 0.1.13 → 0.1.14

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.
@@ -0,0 +1,10 @@
1
+ /**
2
+ * benchmark: serial mutations with connected client
3
+ *
4
+ * measures the time for N mutations to be fully replicated
5
+ * to a connected websocket client.
6
+ *
7
+ * run: bun src/bench/serial-mutations.bench.ts
8
+ */
9
+ export {};
10
+ //# sourceMappingURL=serial-mutations.bench.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-mutations.bench.d.ts","sourceRoot":"","sources":["../../src/bench/serial-mutations.bench.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG"}
@@ -0,0 +1,228 @@
1
+ /**
2
+ * benchmark: serial mutations with connected client
3
+ *
4
+ * measures the time for N mutations to be fully replicated
5
+ * to a connected websocket client.
6
+ *
7
+ * run: bun src/bench/serial-mutations.bench.ts
8
+ */
9
+ import WebSocket from 'ws';
10
+ import { startZeroLite } from '../index.js';
11
+ import { ensureTablesInPublications, installAllowAllPermissions, } from '../integration/test-permissions.js';
12
+ import { installChangeTracking } from '../replication/change-tracker.js';
13
+ const SYNC_PROTOCOL_VERSION = 45;
14
+ const NUM_MUTATIONS = 100;
15
+ // test schema
16
+ const CLIENT_SCHEMA = {
17
+ tables: {
18
+ bench_items: {
19
+ columns: {
20
+ id: { type: 'string' },
21
+ value: { type: 'string' },
22
+ num: { type: 'number' },
23
+ },
24
+ primaryKey: ['id'],
25
+ },
26
+ },
27
+ };
28
+ function encodeSecProtocols(initConnectionMessage, authToken) {
29
+ const payload = JSON.stringify({ initConnectionMessage, authToken });
30
+ return encodeURIComponent(Buffer.from(payload, 'utf-8').toString('base64'));
31
+ }
32
+ class Queue {
33
+ items = [];
34
+ waiters = [];
35
+ enqueue(item) {
36
+ const waiter = this.waiters.shift();
37
+ if (waiter) {
38
+ if (waiter.timer)
39
+ clearTimeout(waiter.timer);
40
+ waiter.resolve(item);
41
+ }
42
+ else {
43
+ this.items.push(item);
44
+ }
45
+ }
46
+ dequeue(fallback, timeoutMs = 10000) {
47
+ if (this.items.length > 0) {
48
+ return Promise.resolve(this.items.shift());
49
+ }
50
+ return new Promise((resolve) => {
51
+ const waiter = {
52
+ resolve,
53
+ };
54
+ if (fallback !== undefined) {
55
+ waiter.timer = setTimeout(() => {
56
+ const idx = this.waiters.indexOf(waiter);
57
+ if (idx >= 0)
58
+ this.waiters.splice(idx, 1);
59
+ resolve(fallback);
60
+ }, timeoutMs);
61
+ }
62
+ this.waiters.push(waiter);
63
+ });
64
+ }
65
+ }
66
+ async function waitForZero(port, timeoutMs = 30000) {
67
+ const deadline = Date.now() + timeoutMs;
68
+ while (Date.now() < deadline) {
69
+ try {
70
+ const res = await fetch(`http://localhost:${port}/`);
71
+ if (res.ok || res.status === 404)
72
+ return;
73
+ }
74
+ catch { }
75
+ await new Promise((r) => setTimeout(r, 500));
76
+ }
77
+ throw new Error(`zero-cache not ready on port ${port} after ${timeoutMs}ms`);
78
+ }
79
+ async function runBenchmark() {
80
+ console.log(`\n=== Serial Mutations Benchmark (${NUM_MUTATIONS} mutations) ===\n`);
81
+ const testPgPort = 24000 + Math.floor(Math.random() * 1000);
82
+ const testZeroPort = testPgPort + 100;
83
+ const dataDir = `.orez-bench-${Date.now()}`;
84
+ console.log(`starting orez on pg:${testPgPort} zero:${testZeroPort}`);
85
+ const result = await startZeroLite({
86
+ pgPort: testPgPort,
87
+ zeroPort: testZeroPort,
88
+ dataDir,
89
+ logLevel: 'info',
90
+ skipZeroCache: false,
91
+ });
92
+ const db = result.db;
93
+ const zeroPort = result.zeroPort;
94
+ try {
95
+ // create test table
96
+ await db.exec(`
97
+ CREATE TABLE IF NOT EXISTS bench_items (
98
+ id TEXT PRIMARY KEY,
99
+ value TEXT,
100
+ num INTEGER
101
+ );
102
+ `);
103
+ // add table to publication and install permissions
104
+ await ensureTablesInPublications(db, ['bench_items']);
105
+ await installChangeTracking(db);
106
+ await installAllowAllPermissions(db, ['bench_items']);
107
+ if (result.resetZeroFull) {
108
+ await result.resetZeroFull();
109
+ }
110
+ else if (result.restartZero) {
111
+ await result.restartZero();
112
+ }
113
+ console.log('waiting for zero-cache...');
114
+ await waitForZero(zeroPort, 90000);
115
+ console.log('zero-cache ready');
116
+ // connect websocket client
117
+ const downstream = new Queue();
118
+ const cg = `bench-cg-${Date.now()}`;
119
+ const cid = `bench-client-${Date.now()}`;
120
+ const secProtocol = encodeSecProtocols([
121
+ 'initConnection',
122
+ {
123
+ desiredQueriesPatch: [
124
+ {
125
+ op: 'put',
126
+ hash: 'q1',
127
+ ast: { table: 'bench_items', orderBy: [['id', 'asc']] },
128
+ },
129
+ ],
130
+ clientSchema: CLIENT_SCHEMA,
131
+ },
132
+ ], undefined);
133
+ const ws = new WebSocket(`ws://localhost:${zeroPort}/sync/v${SYNC_PROTOCOL_VERSION}/connect` +
134
+ `?clientGroupID=${cg}&clientID=${cid}&wsid=ws1&schemaVersion=1&baseCookie=&ts=${Date.now()}&lmid=0`, secProtocol);
135
+ ws.on('message', (data) => {
136
+ downstream.enqueue(JSON.parse(data.toString()));
137
+ });
138
+ // wait for connection
139
+ await new Promise((resolve, reject) => {
140
+ ws.on('open', resolve);
141
+ ws.on('error', reject);
142
+ setTimeout(() => reject(new Error('ws connect timeout')), 5000);
143
+ });
144
+ console.log('websocket connected');
145
+ // drain initial pokes
146
+ let settled = false;
147
+ const timeout = Date.now() + 30000;
148
+ while (!settled && Date.now() < timeout) {
149
+ const msg = (await downstream.dequeue('timeout', 3000));
150
+ if (msg === 'timeout') {
151
+ settled = true;
152
+ }
153
+ else if (Array.isArray(msg) && msg[0] === 'pokeEnd') {
154
+ const next = (await downstream.dequeue('timeout', 2000));
155
+ if (next === 'timeout') {
156
+ settled = true;
157
+ }
158
+ }
159
+ }
160
+ console.log('initial sync complete, starting benchmark...\n');
161
+ // ========== BENCHMARK: Serial Mutations ==========
162
+ const receivedIds = new Set();
163
+ const startTime = performance.now();
164
+ // insert mutations serially
165
+ for (let i = 0; i < NUM_MUTATIONS; i++) {
166
+ const id = `bench-${i}`;
167
+ await db.query(`INSERT INTO bench_items (id, value, num) VALUES ($1, $2, $3)`, [
168
+ id,
169
+ `value-${i}`,
170
+ i,
171
+ ]);
172
+ }
173
+ const insertEndTime = performance.now();
174
+ console.log(`inserts completed in ${(insertEndTime - startTime).toFixed(1)}ms`);
175
+ // wait for all mutations to be replicated
176
+ const replicationTimeout = Date.now() + 60000;
177
+ while (receivedIds.size < NUM_MUTATIONS && Date.now() < replicationTimeout) {
178
+ const msg = (await downstream.dequeue('timeout', 1000));
179
+ if (msg !== 'timeout' &&
180
+ Array.isArray(msg) &&
181
+ msg[0] === 'pokePart' &&
182
+ msg[1]?.rowsPatch) {
183
+ for (const row of msg[1].rowsPatch) {
184
+ if (row.op === 'put' && row.tableName === 'bench_items' && row.value?.id) {
185
+ receivedIds.add(row.value.id);
186
+ }
187
+ }
188
+ }
189
+ }
190
+ const endTime = performance.now();
191
+ ws.close();
192
+ // results
193
+ const totalMs = endTime - startTime;
194
+ const insertMs = insertEndTime - startTime;
195
+ const replicationMs = endTime - insertEndTime;
196
+ const perMutation = totalMs / NUM_MUTATIONS;
197
+ console.log(`\n=== Results ===`);
198
+ console.log(`total time: ${totalMs.toFixed(1)}ms`);
199
+ console.log(`insert time: ${insertMs.toFixed(1)}ms (${(insertMs / NUM_MUTATIONS).toFixed(1)}ms/op)`);
200
+ console.log(`replication time: ${replicationMs.toFixed(1)}ms`);
201
+ console.log(`per mutation (end-to-end): ${perMutation.toFixed(1)}ms`);
202
+ console.log(`mutations received: ${receivedIds.size}/${NUM_MUTATIONS}`);
203
+ console.log(`throughput: ${(1000 / perMutation).toFixed(1)} mutations/sec`);
204
+ if (receivedIds.size < NUM_MUTATIONS) {
205
+ console.log(`\nWARNING: not all mutations were replicated!`);
206
+ const missing = [];
207
+ for (let i = 0; i < NUM_MUTATIONS; i++) {
208
+ if (!receivedIds.has(`bench-${i}`))
209
+ missing.push(i);
210
+ }
211
+ console.log(`missing: ${missing.slice(0, 10).join(', ')}${missing.length > 10 ? '...' : ''}`);
212
+ }
213
+ }
214
+ finally {
215
+ await result.stop();
216
+ // cleanup
217
+ const { rmSync } = await import('node:fs');
218
+ try {
219
+ rmSync(dataDir, { recursive: true, force: true });
220
+ }
221
+ catch { }
222
+ }
223
+ }
224
+ runBenchmark().catch((err) => {
225
+ console.error('benchmark failed:', err);
226
+ process.exit(1);
227
+ });
228
+ //# sourceMappingURL=serial-mutations.bench.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serial-mutations.bench.js","sourceRoot":"","sources":["../../src/bench/serial-mutations.bench.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/replication/handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CAC9B;AA4HD,iBAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAqBvD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA8D5B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,iBAAiB,EACzB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,CAkTf;AAuHD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/replication/handler.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAyBH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,aAAa,CAAA;AACxC,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AAElD,MAAM,WAAW,iBAAiB;IAChC,KAAK,CAAC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAA;CAC9B;AA4HD,iBAAS,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,CAqBvD;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CA8D5B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAC1C,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,iBAAiB,EACzB,EAAE,EAAE,MAAM,EACV,KAAK,EAAE,KAAK,GACX,OAAO,CAAC,IAAI,CAAC,CAuVf;AAuHD,OAAO,EAAE,kBAAkB,EAAE,CAAA"}
@@ -356,16 +356,44 @@ export async function handleStartReplication(query, writer, db, mutex) {
356
356
  // track which tables we've sent RELATION messages for
357
357
  const sentRelations = new Set();
358
358
  let txCounter = 1;
359
- // polling + notification loop
360
- // adaptive: poll fast when catching up, slow when idle
359
+ // event-driven replication with promise-based wakeup
360
+ // uses pg_notify to wake up immediately, polling only as fallback
361
361
  const pollIntervalIdle = 500;
362
- const pollIntervalCatchUp = 20;
363
362
  const batchSize = 2000;
364
363
  const purgeEveryN = 10;
365
364
  const shardRescanEveryN = 20;
366
365
  let running = true;
367
366
  let pollsSincePurge = 0;
368
367
  let pollsSinceShardRescan = 0;
368
+ // promise-based wakeup mechanism
369
+ let wakeupResolve = null;
370
+ const wakeup = () => {
371
+ if (wakeupResolve) {
372
+ wakeupResolve();
373
+ wakeupResolve = null;
374
+ }
375
+ };
376
+ const waitForWakeup = (timeoutMs) => {
377
+ return new Promise((resolve) => {
378
+ const timer = setTimeout(() => {
379
+ wakeupResolve = null;
380
+ resolve();
381
+ }, timeoutMs);
382
+ wakeupResolve = () => {
383
+ clearTimeout(timer);
384
+ resolve();
385
+ };
386
+ });
387
+ };
388
+ // set up LISTEN to wake up immediately on changes
389
+ let unsubscribe = null;
390
+ try {
391
+ unsubscribe = await db.listen('_zero_changes', wakeup);
392
+ log.debug.proxy('replication: listening for _zero_changes notifications');
393
+ }
394
+ catch {
395
+ log.debug.proxy('replication: LISTEN not available, using polling only');
396
+ }
369
397
  const poll = async () => {
370
398
  while (running) {
371
399
  try {
@@ -427,13 +455,14 @@ export async function handleStartReplication(query, writer, db, mutex) {
427
455
  mutex.release();
428
456
  }
429
457
  }
458
+ // got changes - continue immediately to check for more
459
+ continue;
430
460
  }
431
461
  // send keepalive
432
462
  const ts = nowMicros();
433
463
  writer.write(encodeKeepalive(currentLsn, ts, false));
434
- // if we got a full batch, there's likely more - poll fast
435
- const delay = changes.length >= batchSize ? pollIntervalCatchUp : pollIntervalIdle;
436
- await new Promise((resolve) => setTimeout(resolve, delay));
464
+ // no changes: wait for notify signal or poll interval
465
+ await waitForWakeup(pollIntervalIdle);
437
466
  }
438
467
  catch (err) {
439
468
  const msg = err instanceof Error ? err.message : String(err);
@@ -447,7 +476,14 @@ export async function handleStartReplication(query, writer, db, mutex) {
447
476
  }
448
477
  };
449
478
  log.debug.proxy('replication: starting poll loop');
450
- await poll();
479
+ try {
480
+ await poll();
481
+ }
482
+ finally {
483
+ if (unsubscribe) {
484
+ await unsubscribe().catch(() => { });
485
+ }
486
+ }
451
487
  log.debug.proxy('replication: poll loop exited');
452
488
  }
453
489
  async function streamChanges(changes, writer, sentRelations, txId, tableKeyColumns, excludedColumns, columnTypeOids) {
@@ -1 +1 @@
1
- {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/replication/handler.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/replication/handler.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orez",
3
- "version": "0.1.13",
3
+ "version": "0.1.14",
4
4
  "description": "PGlite-powered zero-sync development backend. No Docker required.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -52,7 +52,7 @@
52
52
  "@electric-sql/pglite": "^0.3.15",
53
53
  "@electric-sql/pglite-tools": "^0.2.20",
54
54
  "@rocicorp/zero": ">=0.1.0",
55
- "bedrock-sqlite": "0.1.14",
55
+ "bedrock-sqlite": "0.1.15",
56
56
  "citty": "^0.2.0",
57
57
  "pg-gateway": "0.3.0-beta.4",
58
58
  "pgsql-parser": "^17.9.11",
@@ -0,0 +1,270 @@
1
+ /**
2
+ * benchmark: serial mutations with connected client
3
+ *
4
+ * measures the time for N mutations to be fully replicated
5
+ * to a connected websocket client.
6
+ *
7
+ * run: bun src/bench/serial-mutations.bench.ts
8
+ */
9
+
10
+ import WebSocket from 'ws'
11
+
12
+ import { startZeroLite } from '../index.js'
13
+ import {
14
+ ensureTablesInPublications,
15
+ installAllowAllPermissions,
16
+ } from '../integration/test-permissions.js'
17
+ import { installChangeTracking } from '../replication/change-tracker.js'
18
+
19
+ import type { PGlite } from '@electric-sql/pglite'
20
+
21
+ const SYNC_PROTOCOL_VERSION = 45
22
+ const NUM_MUTATIONS = 100
23
+
24
+ // test schema
25
+ const CLIENT_SCHEMA = {
26
+ tables: {
27
+ bench_items: {
28
+ columns: {
29
+ id: { type: 'string' },
30
+ value: { type: 'string' },
31
+ num: { type: 'number' },
32
+ },
33
+ primaryKey: ['id'],
34
+ },
35
+ },
36
+ }
37
+
38
+ function encodeSecProtocols(
39
+ initConnectionMessage: unknown,
40
+ authToken: string | undefined
41
+ ): string {
42
+ const payload = JSON.stringify({ initConnectionMessage, authToken })
43
+ return encodeURIComponent(Buffer.from(payload, 'utf-8').toString('base64'))
44
+ }
45
+
46
+ class Queue<T> {
47
+ private items: T[] = []
48
+ private waiters: Array<{
49
+ resolve: (v: T) => void
50
+ timer?: ReturnType<typeof setTimeout>
51
+ }> = []
52
+
53
+ enqueue(item: T) {
54
+ const waiter = this.waiters.shift()
55
+ if (waiter) {
56
+ if (waiter.timer) clearTimeout(waiter.timer)
57
+ waiter.resolve(item)
58
+ } else {
59
+ this.items.push(item)
60
+ }
61
+ }
62
+
63
+ dequeue(fallback?: T, timeoutMs = 10000): Promise<T> {
64
+ if (this.items.length > 0) {
65
+ return Promise.resolve(this.items.shift()!)
66
+ }
67
+ return new Promise<T>((resolve) => {
68
+ const waiter: { resolve: (v: T) => void; timer?: ReturnType<typeof setTimeout> } = {
69
+ resolve,
70
+ }
71
+ if (fallback !== undefined) {
72
+ waiter.timer = setTimeout(() => {
73
+ const idx = this.waiters.indexOf(waiter)
74
+ if (idx >= 0) this.waiters.splice(idx, 1)
75
+ resolve(fallback)
76
+ }, timeoutMs)
77
+ }
78
+ this.waiters.push(waiter)
79
+ })
80
+ }
81
+ }
82
+
83
+ async function waitForZero(port: number, timeoutMs = 30000) {
84
+ const deadline = Date.now() + timeoutMs
85
+ while (Date.now() < deadline) {
86
+ try {
87
+ const res = await fetch(`http://localhost:${port}/`)
88
+ if (res.ok || res.status === 404) return
89
+ } catch {}
90
+ await new Promise((r) => setTimeout(r, 500))
91
+ }
92
+ throw new Error(`zero-cache not ready on port ${port} after ${timeoutMs}ms`)
93
+ }
94
+
95
+ async function runBenchmark() {
96
+ console.log(`\n=== Serial Mutations Benchmark (${NUM_MUTATIONS} mutations) ===\n`)
97
+
98
+ const testPgPort = 24000 + Math.floor(Math.random() * 1000)
99
+ const testZeroPort = testPgPort + 100
100
+ const dataDir = `.orez-bench-${Date.now()}`
101
+
102
+ console.log(`starting orez on pg:${testPgPort} zero:${testZeroPort}`)
103
+ const result = await startZeroLite({
104
+ pgPort: testPgPort,
105
+ zeroPort: testZeroPort,
106
+ dataDir,
107
+ logLevel: 'info',
108
+ skipZeroCache: false,
109
+ })
110
+
111
+ const db = result.db
112
+ const zeroPort = result.zeroPort
113
+
114
+ try {
115
+ // create test table
116
+ await db.exec(`
117
+ CREATE TABLE IF NOT EXISTS bench_items (
118
+ id TEXT PRIMARY KEY,
119
+ value TEXT,
120
+ num INTEGER
121
+ );
122
+ `)
123
+
124
+ // add table to publication and install permissions
125
+ await ensureTablesInPublications(db, ['bench_items'])
126
+ await installChangeTracking(db)
127
+ await installAllowAllPermissions(db, ['bench_items'])
128
+
129
+ if (result.resetZeroFull) {
130
+ await result.resetZeroFull()
131
+ } else if (result.restartZero) {
132
+ await result.restartZero()
133
+ }
134
+
135
+ console.log('waiting for zero-cache...')
136
+ await waitForZero(zeroPort, 90000)
137
+ console.log('zero-cache ready')
138
+
139
+ // connect websocket client
140
+ const downstream = new Queue<unknown>()
141
+ const cg = `bench-cg-${Date.now()}`
142
+ const cid = `bench-client-${Date.now()}`
143
+ const secProtocol = encodeSecProtocols(
144
+ [
145
+ 'initConnection',
146
+ {
147
+ desiredQueriesPatch: [
148
+ {
149
+ op: 'put',
150
+ hash: 'q1',
151
+ ast: { table: 'bench_items', orderBy: [['id', 'asc']] },
152
+ },
153
+ ],
154
+ clientSchema: CLIENT_SCHEMA,
155
+ },
156
+ ],
157
+ undefined
158
+ )
159
+
160
+ const ws = new WebSocket(
161
+ `ws://localhost:${zeroPort}/sync/v${SYNC_PROTOCOL_VERSION}/connect` +
162
+ `?clientGroupID=${cg}&clientID=${cid}&wsid=ws1&schemaVersion=1&baseCookie=&ts=${Date.now()}&lmid=0`,
163
+ secProtocol
164
+ )
165
+
166
+ ws.on('message', (data) => {
167
+ downstream.enqueue(JSON.parse(data.toString()))
168
+ })
169
+
170
+ // wait for connection
171
+ await new Promise<void>((resolve, reject) => {
172
+ ws.on('open', resolve)
173
+ ws.on('error', reject)
174
+ setTimeout(() => reject(new Error('ws connect timeout')), 5000)
175
+ })
176
+ console.log('websocket connected')
177
+
178
+ // drain initial pokes
179
+ let settled = false
180
+ const timeout = Date.now() + 30000
181
+ while (!settled && Date.now() < timeout) {
182
+ const msg = (await downstream.dequeue('timeout' as any, 3000)) as any
183
+ if (msg === 'timeout') {
184
+ settled = true
185
+ } else if (Array.isArray(msg) && msg[0] === 'pokeEnd') {
186
+ const next = (await downstream.dequeue('timeout' as any, 2000)) as any
187
+ if (next === 'timeout') {
188
+ settled = true
189
+ }
190
+ }
191
+ }
192
+ console.log('initial sync complete, starting benchmark...\n')
193
+
194
+ // ========== BENCHMARK: Serial Mutations ==========
195
+ const receivedIds = new Set<string>()
196
+ const startTime = performance.now()
197
+
198
+ // insert mutations serially
199
+ for (let i = 0; i < NUM_MUTATIONS; i++) {
200
+ const id = `bench-${i}`
201
+ await db.query(`INSERT INTO bench_items (id, value, num) VALUES ($1, $2, $3)`, [
202
+ id,
203
+ `value-${i}`,
204
+ i,
205
+ ])
206
+ }
207
+ const insertEndTime = performance.now()
208
+ console.log(`inserts completed in ${(insertEndTime - startTime).toFixed(1)}ms`)
209
+
210
+ // wait for all mutations to be replicated
211
+ const replicationTimeout = Date.now() + 60000
212
+ while (receivedIds.size < NUM_MUTATIONS && Date.now() < replicationTimeout) {
213
+ const msg = (await downstream.dequeue('timeout' as any, 1000)) as any
214
+ if (
215
+ msg !== 'timeout' &&
216
+ Array.isArray(msg) &&
217
+ msg[0] === 'pokePart' &&
218
+ msg[1]?.rowsPatch
219
+ ) {
220
+ for (const row of msg[1].rowsPatch) {
221
+ if (row.op === 'put' && row.tableName === 'bench_items' && row.value?.id) {
222
+ receivedIds.add(row.value.id)
223
+ }
224
+ }
225
+ }
226
+ }
227
+ const endTime = performance.now()
228
+
229
+ ws.close()
230
+
231
+ // results
232
+ const totalMs = endTime - startTime
233
+ const insertMs = insertEndTime - startTime
234
+ const replicationMs = endTime - insertEndTime
235
+ const perMutation = totalMs / NUM_MUTATIONS
236
+
237
+ console.log(`\n=== Results ===`)
238
+ console.log(`total time: ${totalMs.toFixed(1)}ms`)
239
+ console.log(
240
+ `insert time: ${insertMs.toFixed(1)}ms (${(insertMs / NUM_MUTATIONS).toFixed(1)}ms/op)`
241
+ )
242
+ console.log(`replication time: ${replicationMs.toFixed(1)}ms`)
243
+ console.log(`per mutation (end-to-end): ${perMutation.toFixed(1)}ms`)
244
+ console.log(`mutations received: ${receivedIds.size}/${NUM_MUTATIONS}`)
245
+ console.log(`throughput: ${(1000 / perMutation).toFixed(1)} mutations/sec`)
246
+
247
+ if (receivedIds.size < NUM_MUTATIONS) {
248
+ console.log(`\nWARNING: not all mutations were replicated!`)
249
+ const missing = []
250
+ for (let i = 0; i < NUM_MUTATIONS; i++) {
251
+ if (!receivedIds.has(`bench-${i}`)) missing.push(i)
252
+ }
253
+ console.log(
254
+ `missing: ${missing.slice(0, 10).join(', ')}${missing.length > 10 ? '...' : ''}`
255
+ )
256
+ }
257
+ } finally {
258
+ await result.stop()
259
+ // cleanup
260
+ const { rmSync } = await import('node:fs')
261
+ try {
262
+ rmSync(dataDir, { recursive: true, force: true })
263
+ } catch {}
264
+ }
265
+ }
266
+
267
+ runBenchmark().catch((err) => {
268
+ console.error('benchmark failed:', err)
269
+ process.exit(1)
270
+ })
@@ -463,10 +463,9 @@ export async function handleStartReplication(
463
463
  const sentRelations = new Set<string>()
464
464
  let txCounter = 1
465
465
 
466
- // polling + notification loop
467
- // adaptive: poll fast when catching up, slow when idle
466
+ // event-driven replication with promise-based wakeup
467
+ // uses pg_notify to wake up immediately, polling only as fallback
468
468
  const pollIntervalIdle = 500
469
- const pollIntervalCatchUp = 20
470
469
  const batchSize = 2000
471
470
  const purgeEveryN = 10
472
471
  const shardRescanEveryN = 20
@@ -474,6 +473,36 @@ export async function handleStartReplication(
474
473
  let pollsSincePurge = 0
475
474
  let pollsSinceShardRescan = 0
476
475
 
476
+ // promise-based wakeup mechanism
477
+ let wakeupResolve: (() => void) | null = null
478
+ const wakeup = () => {
479
+ if (wakeupResolve) {
480
+ wakeupResolve()
481
+ wakeupResolve = null
482
+ }
483
+ }
484
+ const waitForWakeup = (timeoutMs: number): Promise<void> => {
485
+ return new Promise((resolve) => {
486
+ const timer = setTimeout(() => {
487
+ wakeupResolve = null
488
+ resolve()
489
+ }, timeoutMs)
490
+ wakeupResolve = () => {
491
+ clearTimeout(timer)
492
+ resolve()
493
+ }
494
+ })
495
+ }
496
+
497
+ // set up LISTEN to wake up immediately on changes
498
+ let unsubscribe: (() => Promise<void>) | null = null
499
+ try {
500
+ unsubscribe = await db.listen('_zero_changes', wakeup)
501
+ log.debug.proxy('replication: listening for _zero_changes notifications')
502
+ } catch {
503
+ log.debug.proxy('replication: LISTEN not available, using polling only')
504
+ }
505
+
477
506
  const poll = async () => {
478
507
  while (running) {
479
508
  try {
@@ -543,15 +572,17 @@ export async function handleStartReplication(
543
572
  mutex.release()
544
573
  }
545
574
  }
575
+
576
+ // got changes - continue immediately to check for more
577
+ continue
546
578
  }
547
579
 
548
580
  // send keepalive
549
581
  const ts = nowMicros()
550
582
  writer.write(encodeKeepalive(currentLsn, ts, false))
551
583
 
552
- // if we got a full batch, there's likely more - poll fast
553
- const delay = changes.length >= batchSize ? pollIntervalCatchUp : pollIntervalIdle
554
- await new Promise((resolve) => setTimeout(resolve, delay))
584
+ // no changes: wait for notify signal or poll interval
585
+ await waitForWakeup(pollIntervalIdle)
555
586
  } catch (err: unknown) {
556
587
  const msg = err instanceof Error ? err.message : String(err)
557
588
  log.debug.proxy(`replication poll error: ${msg}`)
@@ -565,7 +596,13 @@ export async function handleStartReplication(
565
596
  }
566
597
 
567
598
  log.debug.proxy('replication: starting poll loop')
568
- await poll()
599
+ try {
600
+ await poll()
601
+ } finally {
602
+ if (unsubscribe) {
603
+ await unsubscribe().catch(() => {})
604
+ }
605
+ }
569
606
  log.debug.proxy('replication: poll loop exited')
570
607
  }
571
608