@@ -451,6 +451,7 @@ mdcreate(SMgrRelation reln, ForkNumber forkNum, bool isRedo)
451
451
void
452
452
mdunlink (RelFileNodeBackend rnode , ForkNumber forkNum , bool isRedo )
453
453
{
454
+ bool cfs_gc_locked = false;
454
455
/*
455
456
* We have to clean out any pending fsync requests for the doomed
456
457
* relation, else the next mdsync() will fail. There can't be any such
@@ -461,14 +462,33 @@ mdunlink(RelFileNodeBackend rnode, ForkNumber forkNum, bool isRedo)
461
462
if (!RelFileNodeBackendIsTemp (rnode ))
462
463
ForgetRelationFsyncRequests (rnode .node , forkNum );
463
464
464
- /* Now do the per-fork work */
465
- if (forkNum == InvalidForkNumber )
465
+ if (md_use_compression (rnode , forkNum == InvalidForkNumber ? MAIN_FORKNUM : forkNum ))
466
466
{
467
- for (forkNum = 0 ; forkNum <= MAX_FORKNUM ; forkNum ++ )
467
+ cfs_gc_locked = true;
468
+ cfs_control_gc_lock ();
469
+ }
470
+
471
+ PG_TRY ();
472
+ {
473
+ /* Now do the per-fork work */
474
+ if (forkNum == InvalidForkNumber )
475
+ {
476
+ for (forkNum = 0 ; forkNum <= MAX_FORKNUM ; forkNum ++ )
477
+ mdunlinkfork (rnode , forkNum , isRedo );
478
+ }
479
+ else
468
480
mdunlinkfork (rnode , forkNum , isRedo );
481
+ }
469
482
}
470
- else
471
- mdunlinkfork (rnode , forkNum , isRedo );
483
+ PG_CATCH ();
484
+ {
485
+ if (cfs_gc_locked )
486
+ cfs_control_gc_unlock ();
487
+ PG_RE_THROW ();
488
+ }
489
+ PG_END_TRY ();
490
+ if (cfs_gc_locked )
491
+ cfs_control_gc_unlock ();
472
492
}
473
493
474
494
static void
0 commit comments