diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index d2fecb1ecb..c5a2541807 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1366,8 +1366,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit) for (fork = 0; fork <= MAX_FORKNUM; fork++) { - if (smgrexists(srel, fork)) - smgrdounlink(srel, fork, false); + smgrdounlink(srel, fork, false); } smgrclose(srel); } diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index c383011b5f..4177a6c5cf 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -4595,11 +4595,8 @@ xact_redo_commit_internal(TransactionId xid, XLogRecPtr lsn, for (fork = 0; fork <= MAX_FORKNUM; fork++) { - if (smgrexists(srel, fork)) - { - XLogDropRelation(xnodes[i], fork); - smgrdounlink(srel, fork, true); - } + XLogDropRelation(xnodes[i], fork); + smgrdounlink(srel, fork, true); } smgrclose(srel); } @@ -4738,11 +4735,8 @@ xact_redo_abort(xl_xact_abort *xlrec, TransactionId xid) for (fork = 0; fork <= MAX_FORKNUM; fork++) { - if (smgrexists(srel, fork)) - { - XLogDropRelation(xlrec->xnodes[i], fork); - smgrdounlink(srel, fork, true); - } + XLogDropRelation(xlrec->xnodes[i], fork); + smgrdounlink(srel, fork, true); } smgrclose(srel); } diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index fff933d403..450e292f40 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -361,8 +361,7 @@ smgrDoPendingDeletes(bool isCommit) srel = smgropen(pending->relnode, pending->backend); for (i = 0; i <= MAX_FORKNUM; i++) { - if (smgrexists(srel, i)) - smgrdounlink(srel, i, false); + smgrdounlink(srel, i, false); } smgrclose(srel); } diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index a761369d39..7150a00407 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -323,7 +323,13 @@ mdcreate(SMgrRelation reln, ForkNumber forkNum, bool isRedo) * number until it's safe, because relfilenode assignment skips over any * existing file. * - * If isRedo is true, it's okay for the relation to be already gone. + * All the above applies only to the relation's main fork; other forks can + * just be removed immediately, since they are not needed to prevent the + * relfilenode number from being recycled. Also, we do not carefully + * track whether other forks have been created or not, but just attempt to + * unlink them unconditionally; so we should never complain about ENOENT. + * + * If isRedo is true, it's unsurprising for the relation to be already gone. * Also, we should remove the file immediately instead of queuing a request * for later, since during redo there's no possibility of creating a * conflicting relation. @@ -351,13 +357,10 @@ mdunlink(RelFileNodeBackend rnode, ForkNumber forkNum, bool isRedo) if (isRedo || forkNum != MAIN_FORKNUM) { ret = unlink(path); - if (ret < 0) - { - if (!isRedo || errno != ENOENT) - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not remove file \"%s\": %m", path))); - } + if (ret < 0 && errno != ENOENT) + ereport(WARNING, + (errcode_for_file_access(), + errmsg("could not remove file \"%s\": %m", path))); } else { @@ -380,6 +383,9 @@ mdunlink(RelFileNodeBackend rnode, ForkNumber forkNum, bool isRedo) ereport(WARNING, (errcode_for_file_access(), errmsg("could not truncate file \"%s\": %m", path))); + + /* Register request to unlink first segment later */ + register_unlink(rnode); } /* @@ -411,10 +417,6 @@ mdunlink(RelFileNodeBackend rnode, ForkNumber forkNum, bool isRedo) } pfree(path); - - /* Register request to unlink first segment later */ - if (!isRedo && forkNum == MAIN_FORKNUM) - register_unlink(rnode); } /*