From 92cf23b6421c56899b6931fbe877f9e15555ff48 Mon Sep 17 00:00:00 2001 From: Zack Pollard Date: Fri, 30 Oct 2026 14:53:30 +0000 Subject: [PATCH] fix(server): compress database backups on 75% of the cores, up to 32 (#32823) (cherry picked from commit 02c0d4d392217b02b670afb0b4ce9941330120ec) --- .../src/services/database-backup.service.spec.ts | 14 +++++++++++--- server/src/services/database-backup.service.ts | 2 +- 2 files changed, 12 insertions(+), 4 deletions(-) diff --git a/server/src/services/database-backup.service.spec.ts b/server/src/services/database-backup.service.spec.ts index 8a57bbfc7..7ddc34ae5 100644 --- a/server/src/services/database-backup.service.spec.ts +++ b/server/src/services/database-backup.service.spec.ts @@ -241,11 +241,19 @@ describe(DatabaseBackupService.name, () => { expect(mocks.process.spawnDuplexStream).toHaveBeenLastCalledWith('gzip', ['--rsyncable']); }); - it('should compress with pigz on every available core when it is installed', async () => { + it.each([ + { cores: 1, processes: '1' }, + { cores: 8, processes: '6' }, + { cores: 72, processes: '32' }, + ])('should compress with pigz on $processes of $cores cores when it is installed', async ({ cores, processes }) => { mocks.process.isCommandAvailable.mockResolvedValue(true); - mocks.process.availableParallelism.mockReturnValue(8); + mocks.process.availableParallelism.mockReturnValue(cores); await sut.handleBackupDatabase(); - expect(mocks.process.spawnDuplexStream).toHaveBeenLastCalledWith('pigz', ['--rsyncable', '--processes', '8']); + expect(mocks.process.spawnDuplexStream).toHaveBeenLastCalledWith('pigz', [ + '--rsyncable', + '--processes', + processes, + ]); }); it('should fail if pg_dump fails', async () => { diff --git a/server/src/services/database-backup.service.ts b/server/src/services/database-backup.service.ts index 4ad0185ff..4f9e1e88f 100644 --- a/server/src/services/database-backup.service.ts +++ b/server/src/services/database-backup.service.ts @@ -271,7 +271,7 @@ export class DatabaseBackupService { private async getCompressionCommand() { if (await this.processRepository.isCommandAvailable('pigz')) { - const processes = this.processRepository.availableParallelism(); + const processes = Math.min(Math.max(Math.floor(this.processRepository.availableParallelism() * 0.75), 1), 32); return { command: 'pigz', args: ['--rsyncable', '--processes', processes.toString()] }; }