- Synced with main

- Removed maintenance_management_database GUC and logic
pull/7286/head
ivyazmitinov 2023-11-28 14:16:39 +03:00
parent b3bfca9ac6
commit f447b39b84
5 changed files with 32 additions and 89 deletions

View File

@ -360,9 +360,7 @@ StartNodeUserDatabaseConnection(uint32 flags, const char *hostname, int32 port,
MultiConnection *connection = FindAvailableConnection(entry->connections, flags);
if (connection)
{
if ((flags & REQUIRE_MAINTENANCE_CONNECTION) &&
IsMaintenanceDaemon &&
!IsMaintenanceManagementDatabase(MyDatabaseId))
if (flags & REQUIRE_MAINTENANCE_CONNECTION)
{
// Maintenance database may have changed, so cached connection should be closed
connection->forceCloseAtTransactionEnd = true;
@ -446,10 +444,7 @@ StartNodeUserDatabaseConnection(uint32 flags, const char *hostname, int32 port,
else if (flags & REQUIRE_MAINTENANCE_CONNECTION)
{
connection->useForMaintenanceOperations = true;
if (IsMaintenanceDaemon && !IsMaintenanceManagementDatabase(MyDatabaseId))
{
connection->forceCloseAtTransactionEnd = true;
}
connection->forceCloseAtTransactionEnd = true;
}
/* fully initialized the connection, record it */

View File

@ -2705,17 +2705,6 @@ RegisterCitusConfigVariables(void)
GUC_STANDARD,
NULL, NULL, NULL);
DefineCustomStringVariable(
"citus.maintenance_management_database",
gettext_noop("Database for cluster-wide maintenance operations across all databases"),
gettext_noop("It should be enabled when there are more than "
"one database with Citus in a cluster."),
&MaintenanceManagementDatabase,
"",
PGC_SIGHUP,
GUC_STANDARD,
NULL, NULL, NULL);
/* warn about config items in the citus namespace that are not registered above */
EmitWarningsOnPlaceholders("citus");

View File

@ -718,27 +718,24 @@ CitusMaintenanceDaemonMain(Datum main_arg)
InvalidateMetadataSystemCache();
StartTransactionCommand();
if ((strcmp(GetMaintenanceManagementDatabase(), "") == 0 || IsMaintenanceManagementDatabase(databaseOid)))
/*
* We skip the deadlock detection if citus extension
* is not accessible.
*
* Similarly, we skip to run the deadlock checks if
* there exists any version mismatch or the extension
* is not fully created yet.
*/
if (!LockCitusExtension())
{
/*
* We skip the deadlock detection if citus extension
* is not accessible.
*
* Similarly, we skip to run the deadlock checks if
* there exists any version mismatch or the extension
* is not fully created yet.
*/
if (!LockCitusExtension())
{
ereport(DEBUG1, (errmsg("could not lock the citus extension, "
"skipping deadlock detection")));
}
else if (CheckCitusVersion(DEBUG1) && CitusHasBeenLoaded())
{
foundDeadlock = CheckForDistributedDeadlocks();
}
ereport(DEBUG1, (errmsg("could not lock the citus extension, "
"skipping deadlock detection")));
}
else if (CheckCitusVersion(DEBUG1) && CitusHasBeenLoaded())
{
foundDeadlock = CheckForDistributedDeadlocks();
}
CommitTransactionCommand();
@ -1237,35 +1234,3 @@ MetadataSyncTriggeredCheckAndReset(MaintenanceDaemonDBData *dbData)
return metadataSyncTriggered;
}
char
*GetMaintenanceManagementDatabase(void)
{
char *result = MaintenanceManagementDatabase;
/* If MaintenanceManagementDatabase is not set, all maintenance daemons are considered independent */
if (strcmp(MaintenanceManagementDatabase, "") != 0)
{
Oid maintenanceDatabaseOid = get_database_oid(MaintenanceManagementDatabase, true);
if (!maintenanceDatabaseOid)
{
ereport(WARNING, (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmsg("Database \"%s\" doesn't exists, please check the citus.maintenance_management_database parameter. "
"Applying a default value instead.",
MaintenanceManagementDatabase)));
result = "";
}
}
return result;
}
bool
IsMaintenanceManagementDatabase(Oid databaseOid)
{
if (strcmp(GetMaintenanceManagementDatabase(), "") == 0)
{
/* If MaintenanceManagementDatabase is not set, all maintenance daemons are considered independent */
return false;
}
Oid maintenanceDatabaseOid = get_database_oid(MaintenanceManagementDatabase, true);
return maintenanceDatabaseOid == databaseOid;
}

View File

@ -1,9 +1,5 @@
-- This test verfies a behavioir of maintenance daemon in multi-database environment
-- It checks two things:
-- 1. Maintenance daemons should not cache connections, except the one for the citus.maintenance_management_database
-- 2. 2PC transaction recovery should respect the citus.shared_pool_size_maintenance_quota
-- 2. Distributed deadlock detection should run only on citus.maintenance_management_database.
--
-- It checks that distributed deadlock detection and 2PC transaction recovery should respect the citus.shared_pool_size_maintenance_quota.
-- To do that, it created 100 databases and syntactically generates distributed transactions in various states there.
SELECT $definition$
ALTER SYSTEM SET citus.recover_2pc_interval TO '-1';
@ -14,7 +10,6 @@ SELECT $definition$
SELECT $deinition$
ALTER SYSTEM SET citus.recover_2pc_interval TO '5s';
ALTER SYSTEM RESET citus.distributed_deadlock_detection_factor;
ALTER SYSTEM SET citus.maintenance_management_database = 'regression';
SELECT pg_reload_conf();
$deinition$ AS turn_on_maintenance
\gset
@ -284,7 +279,7 @@ WHERE datname LIKE 'db%';
t
(1 row)
SELECT count(*) BETWEEN 1 AND 3 AS cached_connections_after_recovery_coordinator_test
SELECT count(*) = 0 AS cached_connections_after_recovery_coordinator_test
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - backend_start > '5 seconds'::interval;
@ -303,7 +298,7 @@ WHERE gid LIKE 'citus_0_1234_4_0_%'
t
(1 row)
SELECT count(*) BETWEEN 1 AND 3 AS cached_connections_after_recovery_worker_1_test
SELECT count(*) = 0 AS cached_connections_after_recovery_worker_1_test
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - backend_start > '5 seconds'::interval;
@ -322,7 +317,7 @@ WHERE gid LIKE 'citus_0_1234_4_0_%'
t
(1 row)
SELECT count(*) BETWEEN 1 AND 3 AS cached_connections_after_recovery_worker_2_test
SELECT count(*) = 0 AS cached_connections_after_recovery_worker_2_test
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - backend_start > '5 seconds'::interval;
@ -336,7 +331,6 @@ WHERE state = 'idle'
SELECT $definition$
ALTER SYSTEM RESET citus.recover_2pc_interval;
ALTER SYSTEM RESET citus.distributed_deadlock_detection_factor;
ALTER SYSTEM RESET citus.maintenance_management_database;
SELECT pg_reload_conf();
DO
@ -500,3 +494,5 @@ SELECT $definition$
0
(1 row)
\c - - - :master_port
DROP EXTENSION IF EXISTS dblink;

View File

@ -1,9 +1,5 @@
-- This test verfies a behavioir of maintenance daemon in multi-database environment
-- It checks two things:
-- 1. Maintenance daemons should not cache connections, except the one for the citus.maintenance_management_database
-- 2. 2PC transaction recovery should respect the citus.shared_pool_size_maintenance_quota
-- 2. Distributed deadlock detection should run only on citus.maintenance_management_database.
--
-- It checks that distributed deadlock detection and 2PC transaction recovery should respect the citus.shared_pool_size_maintenance_quota.
-- To do that, it created 100 databases and syntactically generates distributed transactions in various states there.
SELECT $definition$
@ -16,7 +12,6 @@ SELECT $definition$
SELECT $deinition$
ALTER SYSTEM SET citus.recover_2pc_interval TO '5s';
ALTER SYSTEM RESET citus.distributed_deadlock_detection_factor;
ALTER SYSTEM SET citus.maintenance_management_database = 'regression';
SELECT pg_reload_conf();
$deinition$ AS turn_on_maintenance
\gset
@ -245,7 +240,7 @@ FROM pg_database,
$statement$) AS t(groupid integer, gid text)
WHERE datname LIKE 'db%';
SELECT count(*) BETWEEN 1 AND 3 AS cached_connections_after_recovery_coordinator_test
SELECT count(*) = 0 AS cached_connections_after_recovery_coordinator_test
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - backend_start > '5 seconds'::interval;
@ -257,7 +252,7 @@ FROM pg_prepared_xacts
WHERE gid LIKE 'citus_0_1234_4_0_%'
OR gid LIKE 'citus_0_should_be_forgotten_%';
SELECT count(*) BETWEEN 1 AND 3 AS cached_connections_after_recovery_worker_1_test
SELECT count(*) = 0 AS cached_connections_after_recovery_worker_1_test
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - backend_start > '5 seconds'::interval;
@ -269,7 +264,7 @@ FROM pg_prepared_xacts
WHERE gid LIKE 'citus_0_1234_4_0_%'
OR gid LIKE 'citus_0_should_be_forgotten_%';
SELECT count(*) BETWEEN 1 AND 3 AS cached_connections_after_recovery_worker_2_test
SELECT count(*) = 0 AS cached_connections_after_recovery_worker_2_test
FROM pg_stat_activity
WHERE state = 'idle'
AND now() - backend_start > '5 seconds'::interval;
@ -282,7 +277,6 @@ WHERE state = 'idle'
SELECT $definition$
ALTER SYSTEM RESET citus.recover_2pc_interval;
ALTER SYSTEM RESET citus.distributed_deadlock_detection_factor;
ALTER SYSTEM RESET citus.maintenance_management_database;
SELECT pg_reload_conf();
DO
@ -421,3 +415,7 @@ SELECT $definition$
\c - - - :worker_2_port
:cleanup
\c - - - :master_port
DROP EXTENSION IF EXISTS dblink;