diff --git a/src/backend/distributed/executor/multi_utility.c b/src/backend/distributed/executor/multi_utility.c index c04fdb895..aa226731c 100644 --- a/src/backend/distributed/executor/multi_utility.c +++ b/src/backend/distributed/executor/multi_utility.c @@ -46,6 +46,7 @@ #include "distributed/multi_utility.h" /* IWYU pragma: keep */ #include "distributed/pg_dist_partition.h" #include "distributed/resource_lock.h" +#include "distributed/transaction_management.h" #include "distributed/transmit.h" #include "distributed/worker_protocol.h" #include "executor/executor.h" @@ -920,6 +921,10 @@ ProcessVacuumStmt(VacuumStmt *vacuumStmt, const char *vacuumCommand, bool isTopL taskList = VacuumTaskList(relationId, vacuumStmt); + SavedMultiShardCommitProtocol = MultiShardCommitProtocol; + MultiShardCommitProtocol = COMMIT_PROTOCOL_BARE; + ExecuteModifyTasksWithoutResults(taskList); + return (Node *) vacuumStmt; } @@ -967,9 +972,6 @@ VacuumTaskList(Oid relationId, VacuumStmt *vacuumStmt) taskList = lappend(taskList, task); } - ereport(ERROR, (errcode(ERRCODE_FEATURE_NOT_SUPPORTED), - errmsg("VACUUM of distributed tables is not supported"))); - return taskList; } diff --git a/src/backend/distributed/transaction/multi_shard_transaction.c b/src/backend/distributed/transaction/multi_shard_transaction.c index f62507af8..a581fa241 100644 --- a/src/backend/distributed/transaction/multi_shard_transaction.c +++ b/src/backend/distributed/transaction/multi_shard_transaction.c @@ -175,9 +175,11 @@ BeginTransactionOnShardPlacements(uint64 shardId, char *userName) * transaction to fail. */ MarkRemoteTransactionCritical(connection); - - /* issue BEGIN */ - RemoteTransactionBegin(connection); + if (MultiShardCommitProtocol > COMMIT_PROTOCOL_BARE) + { + /* issue BEGIN */ + RemoteTransactionBegin(connection); + } } } @@ -270,6 +272,11 @@ ResetShardPlacementTransactionState(void) * round. */ shardConnectionHash = NULL; + + if (MultiShardCommitProtocol == COMMIT_PROTOCOL_BARE) + { + MultiShardCommitProtocol = SavedMultiShardCommitProtocol; + } } diff --git a/src/backend/distributed/transaction/transaction_management.c b/src/backend/distributed/transaction/transaction_management.c index 8f8cf8515..7fe79ce75 100644 --- a/src/backend/distributed/transaction/transaction_management.c +++ b/src/backend/distributed/transaction/transaction_management.c @@ -32,6 +32,7 @@ CoordinatedTransactionState CurrentCoordinatedTransactionState = COORD_TRANS_NON /* GUC, the commit protocol to use for commands affecting more than one connection */ int MultiShardCommitProtocol = COMMIT_PROTOCOL_1PC; +int SavedMultiShardCommitProtocol = COMMIT_PROTOCOL_BARE; /* state needed to keep track of operations used during a transaction */ XactModificationType XactModificationLevel = XACT_MODIFICATION_NONE; diff --git a/src/include/distributed/transaction_management.h b/src/include/distributed/transaction_management.h index b2eda9af6..dd0c691ed 100644 --- a/src/include/distributed/transaction_management.h +++ b/src/include/distributed/transaction_management.h @@ -47,13 +47,17 @@ typedef enum CoordinatedTransactionState /* Enumeration that defines the different commit protocols available */ typedef enum { - COMMIT_PROTOCOL_1PC = 0, - COMMIT_PROTOCOL_2PC = 1 + COMMIT_PROTOCOL_BARE = 0, + COMMIT_PROTOCOL_1PC = 1, + COMMIT_PROTOCOL_2PC = 2 } CommitProtocolType; /* config variable managed via guc.c */ extern int MultiShardCommitProtocol; +/* state needed to restore multi-shard commit protocol during VACUUM/ANALYZE */ +extern int SavedMultiShardCommitProtocol; + /* state needed to prevent new connections during modifying transactions */ extern XactModificationType XactModificationLevel;