diff --git a/src/backend/distributed/operations/shard_cleaner.c b/src/backend/distributed/operations/shard_cleaner.c index 896daf55b..9420f3f66 100644 --- a/src/backend/distributed/operations/shard_cleaner.c +++ b/src/backend/distributed/operations/shard_cleaner.c @@ -169,10 +169,24 @@ TryDropOrphanedShards(bool waitForLocks) { int droppedShardCount = 0; MemoryContext savedContext = CurrentMemoryContext; + + /* + * Start a subtransaction so we can rollback database's state to it in case + * of error. + */ + BeginInternalSubTransaction(NULL); + PG_TRY(); { droppedShardCount = DropOrphanedShardsForMove(waitForLocks); droppedShardCount += DropOrphanedShardsForCleanup(); + + /* + * Releasing a subtransaction doesn't free its memory context, since the + * data it contains will be needed at upper commit. See the comments for + * AtSubCommit_Memory() at postgres/src/backend/access/transam/xact.c. + */ + ReleaseCurrentSubTransaction(); } PG_CATCH(); { @@ -180,6 +194,8 @@ TryDropOrphanedShards(bool waitForLocks) ErrorData *edata = CopyErrorData(); FlushErrorState(); + RollbackAndReleaseCurrentSubTransaction(); + /* rethrow as WARNING */ edata->elevel = WARNING; ThrowErrorData(edata); diff --git a/src/backend/distributed/operations/shard_split.c b/src/backend/distributed/operations/shard_split.c index 235a51395..9cdd3e7f7 100644 --- a/src/backend/distributed/operations/shard_split.c +++ b/src/backend/distributed/operations/shard_split.c @@ -80,7 +80,7 @@ static void CreateAndCopySplitShardsForShardGroup(WorkerNode *sourceShardNode, List *shardGroupSplitIntervalListList, List *workersForPlacementList); static bool CheckIfRelationWithSameNameExists(ShardInterval *shardInterval, - WorkerNode *workerNode); + WorkerNode *workerNode); static void CreateSplitShardsForShardGroup(List *shardGroupSplitIntervalListList, List *workersForPlacementList); static void CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList, @@ -635,7 +635,7 @@ CreateSplitShardsForShardGroup(List *shardGroupSplitIntervalListList, * old shard. We don't want that. */ bool relationExists = CheckIfRelationWithSameNameExists(shardInterval, - workerPlacementNode); + workerPlacementNode); if (relationExists) { @@ -1535,7 +1535,7 @@ CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList, * old shard. We don't want that. */ bool relationExists = CheckIfRelationWithSameNameExists(shardInterval, - workerPlacementNode); + workerPlacementNode); if (relationExists) { @@ -1600,7 +1600,7 @@ CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList, * old shard. We don't want that. */ bool relationExists = CheckIfRelationWithSameNameExists(shardInterval, - sourceWorkerNode); + sourceWorkerNode); if (relationExists) {