Skip to content

Commit d69e264

Browse files
committed
Improve query cancellation
1 parent 3fdf1a2 commit d69e264

File tree

2 files changed

+13
-14
lines changed

2 files changed

+13
-14
lines changed

src/connection.js

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
7575
, connectTimer = timer(connectTimedOut, options.connect_timeout)
7676

7777
let socket = null
78+
, cancelMessage
7879
, result = new Result()
7980
, incoming = Buffer.alloc(0)
8081
, needsTypes = options.fetch_types
@@ -139,16 +140,14 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
139140
}
140141

141142
async function cancel({ pid, secret }, resolve, reject) {
142-
socket || (socket = await createSocket())
143-
if (!socket)
144-
return
145-
146-
socket.removeAllListeners()
147-
socket = net.Socket()
148-
socket.on('connect', () => socket.write(b().i32(16).i32(80877102).i32(pid).i32(secret).end(16)))
149-
socket.once('error', reject)
150-
socket.once('close', resolve)
151-
connect()
143+
try {
144+
cancelMessage = b().i32(16).i32(80877102).i32(pid).i32(secret).end(16)
145+
await connect()
146+
socket.once('error', reject)
147+
socket.once('close', resolve)
148+
} catch (error) {
149+
reject(error)
150+
}
152151
}
153152

154153
function execute(q) {
@@ -955,7 +954,7 @@ function Connection(options, queues = {}, { onopen = noop, onend = noop, onclose
955954
}
956955

957956
function StartupMessage() {
958-
return b().inc(4).i16(3).z(2).str(
957+
return cancelMessage || b().inc(4).i16(3).z(2).str(
959958
Object.entries(Object.assign({
960959
user,
961960
database,

tests/index.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,16 +1774,16 @@ t('Execute', async() => {
17741774

17751775
t('Cancel running query', async() => {
17761776
const query = sql`select pg_sleep(2)`
1777-
setTimeout(() => query.cancel(), 50)
1777+
setTimeout(() => query.cancel(), 200)
17781778
const error = await query.catch(x => x)
17791779
return ['57014', error.code]
17801780
})
17811781

17821782
t('Cancel piped query', async() => {
17831783
await sql`select 1`
1784-
const last = sql`select pg_sleep(0.05)`.execute()
1784+
const last = sql`select pg_sleep(0.2)`.execute()
17851785
const query = sql`select pg_sleep(2) as dig`
1786-
setTimeout(() => query.cancel(), 10)
1786+
setTimeout(() => query.cancel(), 100)
17871787
const error = await query.catch(x => x)
17881788
await last
17891789
return ['57014', error.code]

0 commit comments

Comments
 (0)