diff --git a/apps/electron-backend/src/app/workers/database.worker.ts b/apps/electron-backend/src/app/workers/database.worker.ts index 2310d3398..fc709c959 100644 --- a/apps/electron-backend/src/app/workers/database.worker.ts +++ b/apps/electron-backend/src/app/workers/database.worker.ts @@ -96,6 +96,10 @@ import { startWorkerPerformanceCapture, type WorkerPerformanceCapture, } from './worker-performance-capture'; +import { + handleDatabaseWorkerPostGcHeapRequest, + isDatabaseWorkerPostGcHeapRequest, +} from './database-worker-post-gc-heap'; const loggerLabel = '[DB Worker]'; const batchDelayMs = Number.parseInt( @@ -989,6 +993,14 @@ async function executeRequest( } parentPort.on('message', async (message: DbWorkerIncomingMessage) => { + if (isDatabaseWorkerPostGcHeapRequest(message)) { + handleDatabaseWorkerPostGcHeapRequest( + message, + activePerformanceCaptures.size === 0 + ); + return; + } + if (message.type === 'cancel') { const activeOperation = activeOperations.get(message.operationId); if (activeOperation) { diff --git a/apps/electron-backend/src/app/workers/worker-performance-cancellation.spec.ts b/apps/electron-backend/src/app/workers/worker-performance-cancellation.spec.ts index 4cdd550b7..58b8c836b 100644 --- a/apps/electron-backend/src/app/workers/worker-performance-cancellation.spec.ts +++ b/apps/electron-backend/src/app/workers/worker-performance-cancellation.spec.ts @@ -311,3 +311,51 @@ describe('worker cancellation while performance capture arms', () => { ); }); }); + +describe('database worker performance control messages', () => { + afterEach(() => { + jest.restoreAllMocks(); + jest.resetModules(); + }); + + it('handles a post-GC probe without dispatching a database request', async () => { + const armGate = createArmGate(); + armGate.release(); + const port = createParentPortHarness(); + const getWorkerDatabase = jest.fn().mockResolvedValue({}); + const handlePostGcHeapRequest = jest.fn(); + const responsePort = { marker: 'response-port' }; + mockPerformanceCapture(armGate); + jest.doMock('worker_threads', () => ({ + parentPort: port.parentPort, + })); + jest.doMock('./database.worker-connection', () => ({ + closeWorkerDatabase: jest.fn(), + getWorkerDatabase, + })); + jest.doMock('./database-worker-post-gc-heap', () => ({ + handleDatabaseWorkerPostGcHeapRequest: handlePostGcHeapRequest, + isDatabaseWorkerPostGcHeapRequest: jest.fn( + (message: unknown) => + typeof message === 'object' && + message !== null && + (message as Record)['type'] === + 'performance:collect-post-gc-heap' + ), + })); + + await import('./database.worker'); + port.postMessage.mockClear(); + const handleMessage = port.getMessageHandler(); + const message = { + type: 'performance:collect-post-gc-heap', + responsePort, + }; + + await handleMessage(message); + + expect(handlePostGcHeapRequest).toHaveBeenCalledWith(message, true); + expect(getWorkerDatabase).not.toHaveBeenCalled(); + expect(port.postMessage).not.toHaveBeenCalled(); + }); +});