Skip to content

Commit c53a472

Browse files
authored
Batch network packets in prepared statements (#3402)
* Batch network packets in prepared statements Fixes #3340 Fixes #3325 Fixes #3098 * Fix type-o but mostly retrigger build for CF pages preview
1 parent f7c92e4 commit c53a472

File tree

2 files changed

+26
-6
lines changed

2 files changed

+26
-6
lines changed

Diff for: packages/pg/bench.js

+11-5
Original file line numberDiff line numberDiff line change
@@ -47,21 +47,27 @@ const run = async () => {
4747
for (let i = 0; i < 4; i++) {
4848
let queries = await bench(client, params, seconds * 1000)
4949
console.log('')
50-
console.log('little queries:', queries)
50+
console.log('param queries:', queries)
5151
console.log('qps', queries / seconds)
52-
console.log('on my laptop best so far seen 733 qps')
52+
console.log('on my laptop best so far seen 987 qps')
53+
54+
queries = await bench(client, { ...params, name: 'params' }, seconds * 1000)
55+
console.log('')
56+
console.log('named queries:', queries)
57+
console.log('qps', queries / seconds)
58+
console.log('on my laptop best so far seen 937 qps')
5359

5460
console.log('')
5561
queries = await bench(client, seq, seconds * 1000)
5662
console.log('sequence queries:', queries)
5763
console.log('qps', queries / seconds)
58-
console.log('on my laptop best so far seen 1309 qps')
64+
console.log('on my laptop best so far seen 2725 qps')
5965

6066
console.log('')
6167
queries = await bench(client, insert, seconds * 1000)
6268
console.log('insert queries:', queries)
6369
console.log('qps', queries / seconds)
64-
console.log('on my laptop best so far seen 6445 qps')
70+
console.log('on my laptop best so far seen 27383 qps')
6571

6672
console.log('')
6773
console.log('Warming up bytea test')
@@ -75,7 +81,7 @@ const run = async () => {
7581
const time = Date.now() - start
7682
console.log('bytea time:', time, 'ms')
7783
console.log('bytea length:', results.rows[0].data.byteLength, 'bytes')
78-
console.log('on my laptop best so far seen 1107ms and 104857600 bytes')
84+
console.log('on my laptop best so far seen 1407ms and 104857600 bytes')
7985
await new Promise((resolve) => setTimeout(resolve, 250))
8086
}
8187

Diff for: packages/pg/lib/query.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -161,7 +161,21 @@ class Query extends EventEmitter {
161161
return new Error('Query values must be an array')
162162
}
163163
if (this.requiresPreparation()) {
164-
this.prepare(connection)
164+
// If we're using the extended query protocol we fire off several separate commands
165+
// to the backend. On some versions of node & some operating system versions
166+
// the network stack writes each message separately instead of buffering them together
167+
// causing the client & network to send more slowly. Corking & uncorking the stream
168+
// allows node to buffer up the messages internally before sending them all off at once.
169+
// note: we're checking for existence of cork/uncork because some versions of streams
170+
// might not have this (cloudflare?)
171+
connection.stream.cork && connection.stream.cork()
172+
try {
173+
this.prepare(connection)
174+
} finally {
175+
// while unlikely for this.prepare to throw, if it does & we don't uncork this stream
176+
// this client becomes unresponsive, so put in finally block "just in case"
177+
connection.stream.uncork && connection.stream.uncork()
178+
}
165179
} else {
166180
connection.query(this.text)
167181
}

0 commit comments

Comments
 (0)