Handling failure with subtransaction

niupre/TestDeferredDropAndCleanup
Nitish Upreti 2022-08-29 18:42:14 -07:00
parent 789ff7b162
commit 28dceecfff
2 changed files with 20 additions and 4 deletions

View File

@ -169,10 +169,24 @@ TryDropOrphanedShards(bool waitForLocks)
{ {
int droppedShardCount = 0; int droppedShardCount = 0;
MemoryContext savedContext = CurrentMemoryContext; MemoryContext savedContext = CurrentMemoryContext;
/*
* Start a subtransaction so we can rollback database's state to it in case
* of error.
*/
BeginInternalSubTransaction(NULL);
PG_TRY(); PG_TRY();
{ {
droppedShardCount = DropOrphanedShardsForMove(waitForLocks); droppedShardCount = DropOrphanedShardsForMove(waitForLocks);
droppedShardCount += DropOrphanedShardsForCleanup(); 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(); PG_CATCH();
{ {
@ -180,6 +194,8 @@ TryDropOrphanedShards(bool waitForLocks)
ErrorData *edata = CopyErrorData(); ErrorData *edata = CopyErrorData();
FlushErrorState(); FlushErrorState();
RollbackAndReleaseCurrentSubTransaction();
/* rethrow as WARNING */ /* rethrow as WARNING */
edata->elevel = WARNING; edata->elevel = WARNING;
ThrowErrorData(edata); ThrowErrorData(edata);

View File

@ -80,7 +80,7 @@ static void CreateAndCopySplitShardsForShardGroup(WorkerNode *sourceShardNode,
List *shardGroupSplitIntervalListList, List *shardGroupSplitIntervalListList,
List *workersForPlacementList); List *workersForPlacementList);
static bool CheckIfRelationWithSameNameExists(ShardInterval *shardInterval, static bool CheckIfRelationWithSameNameExists(ShardInterval *shardInterval,
WorkerNode *workerNode); WorkerNode *workerNode);
static void CreateSplitShardsForShardGroup(List *shardGroupSplitIntervalListList, static void CreateSplitShardsForShardGroup(List *shardGroupSplitIntervalListList,
List *workersForPlacementList); List *workersForPlacementList);
static void CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList, static void CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList,
@ -635,7 +635,7 @@ CreateSplitShardsForShardGroup(List *shardGroupSplitIntervalListList,
* old shard. We don't want that. * old shard. We don't want that.
*/ */
bool relationExists = CheckIfRelationWithSameNameExists(shardInterval, bool relationExists = CheckIfRelationWithSameNameExists(shardInterval,
workerPlacementNode); workerPlacementNode);
if (relationExists) if (relationExists)
{ {
@ -1535,7 +1535,7 @@ CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList,
* old shard. We don't want that. * old shard. We don't want that.
*/ */
bool relationExists = CheckIfRelationWithSameNameExists(shardInterval, bool relationExists = CheckIfRelationWithSameNameExists(shardInterval,
workerPlacementNode); workerPlacementNode);
if (relationExists) if (relationExists)
{ {
@ -1600,7 +1600,7 @@ CreateDummyShardsForShardGroup(HTAB *mapOfPlacementToDummyShardList,
* old shard. We don't want that. * old shard. We don't want that.
*/ */
bool relationExists = CheckIfRelationWithSameNameExists(shardInterval, bool relationExists = CheckIfRelationWithSameNameExists(shardInterval,
sourceWorkerNode); sourceWorkerNode);
if (relationExists) if (relationExists)
{ {