File tree Expand file tree Collapse file tree
postgres/pgsql-client/src Expand file tree Collapse file tree Original file line number Diff line number Diff line change @@ -10,6 +10,7 @@ import path from 'node:path';
1010import { buildClientSchema , printSchema } from 'graphql' ;
1111
1212import { PgpmPackage } from '@pgpmjs/core' ;
13+ import { pgCache } from 'pg-cache' ;
1314import { createEphemeralDb , type EphemeralDbResult } from 'pgsql-client' ;
1415import { deployPgpm } from 'pgsql-seed' ;
1516
@@ -840,6 +841,10 @@ export async function generateMulti(
840841 } finally {
841842 for ( const shared of sharedSources . values ( ) ) {
842843 const keepDb = Object . values ( configs ) . some ( ( c ) => c . db ?. keepDb ) ;
844+ // Release pg-cache pool for this ephemeral database before dropping
845+ // deployPgpm() caches connections that must be closed first
846+ pgCache . delete ( shared . ephemeralDb . config . database ) ;
847+ await pgCache . waitForDisposals ( ) ;
843848 shared . ephemeralDb . teardown ( { keepDb } ) ;
844849 }
845850 }
Original file line number Diff line number Diff line change 99 */
1010import { PgpmPackage } from '@pgpmjs/core' ;
1111import { buildSchema , introspectionFromSchema } from 'graphql' ;
12- import { getPgPool } from 'pg-cache' ;
12+ import { getPgPool , pgCache } from 'pg-cache' ;
1313import { createEphemeralDb , type EphemeralDbResult } from 'pgsql-client' ;
1414import { deployPgpm } from 'pgsql-seed' ;
1515
@@ -251,6 +251,11 @@ export class PgpmModuleSchemaSource implements SchemaSource {
251251
252252 return { introspection } ;
253253 } finally {
254+ // Release pg-cache pool for this ephemeral database before dropping
255+ // deployPgpm() and getPgPool() cache connections that must be closed first
256+ pgCache . delete ( dbConfig . database ) ;
257+ await pgCache . waitForDisposals ( ) ;
258+
254259 // Clean up the ephemeral database
255260 teardown ( { keepDb } ) ;
256261
Original file line number Diff line number Diff line change @@ -58,9 +58,22 @@ export class DbAdmin {
5858 try {
5959 this . run ( `dropdb "${ name } "` ) ;
6060 } catch ( err : any ) {
61- if ( ! err . message . includes ( 'does not exist' ) ) {
62- log . warn ( `Could not drop database ${ name } : ${ err . message } ` ) ;
61+ if ( err . message . includes ( 'does not exist' ) ) {
62+ return ;
6363 }
64+ if ( err . message . includes ( 'is being accessed by other users' ) ) {
65+ log . warn ( `Database ${ name } has active sessions, terminating backends and retrying drop...` ) ;
66+ try {
67+ this . run (
68+ `psql -c "SELECT pg_terminate_backend(pid) FROM pg_stat_activity WHERE datname = '${ name } ' AND pid <> pg_backend_pid();"`
69+ ) ;
70+ this . run ( `dropdb "${ name } "` ) ;
71+ } catch ( retryErr : any ) {
72+ log . warn ( `Could not drop database ${ name } after terminating backends: ${ retryErr . message } ` ) ;
73+ }
74+ return ;
75+ }
76+ log . warn ( `Could not drop database ${ name } : ${ err . message } ` ) ;
6477 }
6578 }
6679
You can’t perform that action at this time.
0 commit comments