diff options
Diffstat (limited to 'src/backend/commands/dbcommands.c')
-rw-r--r-- | src/backend/commands/dbcommands.c | 33 |
1 files changed, 19 insertions, 14 deletions
diff --git a/src/backend/commands/dbcommands.c b/src/backend/commands/dbcommands.c index d2e38f631f8..846f59244b4 100644 --- a/src/backend/commands/dbcommands.c +++ b/src/backend/commands/dbcommands.c @@ -13,7 +13,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.230 2010/01/02 16:57:37 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/commands/dbcommands.c,v 1.231 2010/01/10 15:44:28 sriggs Exp $ * *------------------------------------------------------------------------- */ @@ -1945,22 +1945,27 @@ dbase_redo(XLogRecPtr lsn, XLogRecord *record) if (InHotStandby) { - VirtualTransactionId *database_users; - /* - * Find all users connected to this database and ask them - * politely to immediately kill their sessions before processing - * the drop database record, after the usual grace period. - * We don't wait for commit because drop database is - * non-transactional. + * We don't do ResolveRecoveryConflictWithVirutalXIDs() here since + * that only waits for transactions and completely idle sessions + * would block us. This is rare enough that we do this as simply + * as possible: no wait, just force them off immediately. + * + * No locking is required here because we already acquired + * AccessExclusiveLock. Anybody trying to connect while we do this + * will block during InitPostgres() and then disconnect when they + * see the database has been removed. */ - database_users = GetConflictingVirtualXIDs(InvalidTransactionId, - xlrec->db_id, - false); + while (CountDBBackends(xlrec->db_id) > 0) + { + CancelDBBackends(xlrec->db_id); - ResolveRecoveryConflictWithVirtualXIDs(database_users, - "drop database", - CONFLICT_MODE_FATAL); + /* + * Wait awhile for them to die so that we avoid flooding an + * unresponsive backend when system is heavily loaded. + */ + pg_usleep(10000); + } } /* Drop pages for this database that are in the shared buffer cache */ |