From c40761f07cec1d34912f667caadf44fb632131ee Mon Sep 17 00:00:00 2001 From: Nitish Upreti Date: Wed, 31 Aug 2022 10:12:30 -0700 Subject: [PATCH] Fix hang --- .../distributed/operations/shard_cleaner.c | 38 ++++++++++++++----- .../distributed/operations/shard_split.c | 2 +- 2 files changed, 30 insertions(+), 10 deletions(-) diff --git a/src/backend/distributed/operations/shard_cleaner.c b/src/backend/distributed/operations/shard_cleaner.c index 9420f3f66..74724ed1a 100644 --- a/src/backend/distributed/operations/shard_cleaner.c +++ b/src/backend/distributed/operations/shard_cleaner.c @@ -15,12 +15,14 @@ #include "access/genam.h" #include "access/xact.h" #include "catalog/namespace.h" +#include "commands/dbcommands.h" #include "commands/sequence.h" #include "postmaster/postmaster.h" #include "nodes/makefuncs.h" #include "utils/builtins.h" #include "utils/fmgroids.h" +#include "distributed/citus_safe_lib.h" #include "distributed/listutils.h" #include "distributed/coordinator_protocol.h" #include "distributed/metadata_cache.h" @@ -657,17 +659,35 @@ GetNextOperationId() return operationdId; } - /* token location, or -1 if unknown */ - const int location = -1; - RangeVar *sequenceName = makeRangeVar(PG_CATALOG, - OPERATIONID_SEQUENCE_NAME, - location); + /* Generate sequence using a subtransaction. else we can hold replication slot creation for operations */ + StringInfo nextValueCommand = makeStringInfo(); + appendStringInfo(nextValueCommand, "SELECT nextval(%s);", OPERATIONID_SEQUENCE_NAME); - bool missingOK = false; - Oid sequenceId = RangeVarGetRelid(sequenceName, NoLock, missingOK); + int connectionFlag = FORCE_NEW_CONNECTION; + MultiConnection *connection = GetNodeUserDatabaseConnection(connectionFlag, + LocalHostName, + PostPortNumber, + CitusExtensionOwnerName(), + get_database_name( + MyDatabaseId)); - bool checkPermissions = false; - operationdId = nextval_internal(sequenceId, checkPermissions); + PGresult *result = NULL; + int queryResult = ExecuteOptionalRemoteCommand(connection, nextValueCommand->data, + &result); + if (queryResult != RESPONSE_OKAY || !IsResponseOK(result) || PQntuples(result) != 1 || + PQnfields(result) != 1) + { + PQclear(result); + ForgetResults(connection); + CloseConnection(connection); + + ereport(ERROR, (errcode(ERRCODE_CONNECTION_FAILURE), + errmsg( + "Could not generate next operation id while executing shard splits."))); + } + + operationdId = SafeStringToUint64(PQgetvalue(result, 0, 0 /* nodeId column*/)); + CloseConnection(connection); return operationdId; } diff --git a/src/backend/distributed/operations/shard_split.c b/src/backend/distributed/operations/shard_split.c index 122af8af6..6c9bad75d 100644 --- a/src/backend/distributed/operations/shard_split.c +++ b/src/backend/distributed/operations/shard_split.c @@ -47,7 +47,7 @@ #include "postmaster/postmaster.h" /* declarations for dynamic loading */ -bool DeferShardDeleteOnSplit = false; +bool DeferShardDeleteOnSplit = true; /* * Entry for map that tracks ShardInterval -> Placement Node