Stop background worker on rename database

When background workers are running RENAME DATABASE will not work
because there are still active sessions to that database open.
This stops background workers on RENAME DATABASE so databases can
be renamed without manually stopping background workers.
This commit is contained in:
Sven Klemm 2019-02-02 16:10:26 +01:00 committed by Sven Klemm
parent c7803730d8
commit 7973b4a753
3 changed files with 28 additions and 1 deletions

View File

@ -351,7 +351,6 @@ stop_workers_on_db_drop(DropdbStmt *drop_db_statement)
static void
post_analyze_hook(ParseState *pstate, Query *query)
{
if (query->commandType == CMD_UTILITY)
{
/*
@ -378,6 +377,16 @@ post_analyze_hook(ParseState *pstate, Query *query)
if (drop_owned_statement_drops_extension((DropOwnedStmt *) query->utilityStmt))
ts_bgw_message_send_and_wait(RESTART, MyDatabaseId);
break;
case T_RenameStmt:
if (((RenameStmt *) query->utilityStmt)->renameType == OBJECT_DATABASE)
{
RenameStmt *stmt = (RenameStmt *) query->utilityStmt;
Oid db_oid = get_database_oid(stmt->subname, stmt->missing_ok);
if (OidIsValid(db_oid))
ts_bgw_message_send_and_wait(STOP, db_oid);
}
break;
default:
break;

View File

@ -438,3 +438,11 @@ SELECT wait_worker_counts(1,1,0,0);
-- clean up additional database
\c :TEST_DBNAME :ROLE_SUPERUSER
DROP DATABASE :TEST_DBNAME_2;
-- test rename database
CREATE DATABASE db_rename_test;
\c db_rename_test :ROLE_SUPERUSER
SET client_min_messages=error;
CREATE EXTENSION timescaledb;
\c :TEST_DBNAME :ROLE_SUPERUSER
ALTER DATABASE db_rename_test RENAME TO db_rename_test2;
DROP DATABASE db_rename_test2;

View File

@ -214,3 +214,13 @@ SELECT wait_worker_counts(1,1,0,0);
\c :TEST_DBNAME :ROLE_SUPERUSER
DROP DATABASE :TEST_DBNAME_2;
-- test rename database
CREATE DATABASE db_rename_test;
\c db_rename_test :ROLE_SUPERUSER
SET client_min_messages=error;
CREATE EXTENSION timescaledb;
\c :TEST_DBNAME :ROLE_SUPERUSER
ALTER DATABASE db_rename_test RENAME TO db_rename_test2;
DROP DATABASE db_rename_test2;