From 5efaca3d5ab8e61751283b9ea305834029a1e4a7 Mon Sep 17 00:00:00 2001 From: whyour Date: Sat, 22 Aug 2026 14:26:57 +0800 Subject: [PATCH] test(postgres): isolate backend fault injection --- .github/workflows/ql3-ci.yml | 1 + .../test/postgres.integration.test.cjs | 15 ++++++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/.github/workflows/ql3-ci.yml b/.github/workflows/ql3-ci.yml index ead7d733..4b009f69 100644 --- a/.github/workflows/ql3-ci.yml +++ b/.github/workflows/ql3-ci.yml @@ -987,6 +987,7 @@ jobs: env: QL3_TEST_POSTGRES_MIGRATION_URL: postgresql://ql3_migration:ql3_migration_test@127.0.0.1:5432/ql3_contract QL3_TEST_POSTGRES_RUNTIME_URL: postgresql://ql3_runtime:ql3_runtime_test@127.0.0.1:5432/ql3_contract + QL3_TEST_POSTGRES_FAULT_INJECTION_URL: postgresql://postgres:postgres@127.0.0.1:5432/ql3_contract QL3_TEST_POSTGRES_WORKER_INGRESS_URL: postgresql://ql3_worker_ingress:ql3_worker_ingress_test@127.0.0.1:5432/ql3_contract run: node --test packages/ql3-cluster-control/test/postgres.integration.test.cjs - name: Test optional AI invocation and price catalog against isolated roles diff --git a/packages/ql3-cluster-control/test/postgres.integration.test.cjs b/packages/ql3-cluster-control/test/postgres.integration.test.cjs index 3435ec2e..ccc05e9b 100644 --- a/packages/ql3-cluster-control/test/postgres.integration.test.cjs +++ b/packages/ql3-cluster-control/test/postgres.integration.test.cjs @@ -66,6 +66,9 @@ const migrationConnectionString = process.env.QL3_TEST_POSTGRES_MIGRATION_URL ?? process.env.QL3_TEST_POSTGRES_URL; const runtimeConnectionString = process.env.QL3_TEST_POSTGRES_RUNTIME_URL; +const faultInjectionConnectionString = + process.env.QL3_TEST_POSTGRES_FAULT_INJECTION_URL ?? + migrationConnectionString; const workerIngressConnectionString = process.env.QL3_TEST_POSTGRES_WORKER_INGRESS_URL; const mtlsFixtures = path.join(__dirname, 'fixtures', 'mtls'); @@ -1038,7 +1041,12 @@ if (!migrationConnectionString || !runtimeConnectionString) { test('terminating the active runtime backend withdraws admission without killing liveness', async () => { const openMigration = opener('migration', migrationConnectionString); + const openFaultInjector = opener( + 'migration', + faultInjectionConnectionString, + ); const migration = await openMigration(); + const faultInjector = await openFaultInjector(); let application; let reactivatedApplication; try { @@ -1082,7 +1090,7 @@ if (!migrationConnectionString || !runtimeConnectionString) { body: { status: 'ready' }, }); - const backend = await migration.pool.query( + const backend = await faultInjector.pool.query( `SELECT pid FROM pg_stat_activity WHERE application_name = 'ql3-cluster-availability-integration' @@ -1092,7 +1100,7 @@ if (!migrationConnectionString || !runtimeConnectionString) { ); assert.equal(backend.rowCount, 1); const terminatedBackendPid = backend.rows[0].pid; - const terminated = await migration.pool.query( + const terminated = await faultInjector.pool.query( 'SELECT pg_terminate_backend($1) AS terminated', [terminatedBackendPid], ); @@ -1119,7 +1127,7 @@ if (!migrationConnectionString || !runtimeConnectionString) { await probeRequest(reactivatedApplication.address, '/readyz'), { status: 200, body: { status: 'ready' } }, ); - const replacementBackend = await migration.pool.query( + const replacementBackend = await faultInjector.pool.query( `SELECT pid FROM pg_stat_activity WHERE application_name = 'ql3-cluster-availability-integration' @@ -1132,6 +1140,7 @@ if (!migrationConnectionString || !runtimeConnectionString) { } finally { await application?.stop(); await reactivatedApplication?.stop(); + await faultInjector.close(); await migration.close(); } });