From dedbe57b0ca2158cd724b3afe951ff1bbdd07864 Mon Sep 17 00:00:00 2001 From: Kevin Gatera Date: Sun, 2 Aug 2026 18:15:34 -0400 Subject: [PATCH] add timeout to postgres backup commands Kill pg_dump/pg_restore after 30 minutes so a lock wait cannot hang a backup or leave the server disconnected from its database during a restore. A killed restore rolls back via --single-transaction. --- server/managers/BackupManager.js | 2 ++ test/server/managers/BackupManager.test.js | 1 + 2 files changed, 3 insertions(+) diff --git a/server/managers/BackupManager.js b/server/managers/BackupManager.js index e27c2f111..aef76bddc 100644 --- a/server/managers/BackupManager.js +++ b/server/managers/BackupManager.js @@ -657,6 +657,8 @@ class BackupManager { const options = { maxBuffer: 10 * 1024 * 1024, + // Kill after 30 mins (e.g. lock waits) - a killed restore rolls back via --single-transaction + timeout: 30 * 60 * 1000, env: connection.env } childProcess.execFile(command, [...args, ...connection.args], options, (error, stdout, stderr) => { diff --git a/test/server/managers/BackupManager.test.js b/test/server/managers/BackupManager.test.js index b5bbcc311..5c5797814 100644 --- a/test/server/managers/BackupManager.test.js +++ b/test/server/managers/BackupManager.test.js @@ -76,6 +76,7 @@ describe('BackupManager', () => { ]) expect(execFileStub.firstCall.args[1].join(' ')).to.not.include('secretpass') expect(execFileStub.firstCall.args[2].env.PGPASSWORD).to.equal('secretpass') + expect(execFileStub.firstCall.args[2].timeout).to.be.a('number') }) it('should restore Postgres dumps in one transaction and clean existing objects', async () => {