diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 0d94697084..3be0a38cb2 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1271,8 +1271,7 @@ FinishPreparedTransaction(const char *gid, bool isCommit) for (fork = 0; fork <= MAX_FORKNUM; fork++) { - if (smgrexists(srel, fork)) - smgrdounlink(srel, fork, false, false); + smgrdounlink(srel, fork, false, false); } smgrclose(srel); } diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c index cc20929fae..f2c5c16927 100644 --- a/src/backend/access/transam/xact.c +++ b/src/backend/access/transam/xact.c @@ -4270,11 +4270,8 @@ xact_redo_commit(xl_xact_commit *xlrec, TransactionId xid) for (fork = 0; fork <= MAX_FORKNUM; fork++) { - if (smgrexists(srel, fork)) - { - XLogDropRelation(xlrec->xnodes[i], fork); - smgrdounlink(srel, fork, false, true); - } + XLogDropRelation(xlrec->xnodes[i], fork); + smgrdounlink(srel, fork, false, true); } smgrclose(srel); } @@ -4313,11 +4310,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, false, true); - } + XLogDropRelation(xlrec->xnodes[i], fork); + smgrdounlink(srel, fork, false, true); } smgrclose(srel); } diff --git a/src/backend/catalog/storage.c b/src/backend/catalog/storage.c index 67236ddd81..326e76f283 100644 --- a/src/backend/catalog/storage.c +++ b/src/backend/catalog/storage.c @@ -278,11 +278,10 @@ smgrDoPendingDeletes(bool isCommit) srel = smgropen(pending->relnode); for (i = 0; i <= MAX_FORKNUM; i++) { - if (smgrexists(srel, i)) - smgrdounlink(srel, - i, - pending->isTemp, - false); + smgrdounlink(srel, + i, + pending->isTemp, + false); } smgrclose(srel); } diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c index 0c4861d6db..e69c7d3bb8 100644 --- a/src/backend/storage/smgr/md.c +++ b/src/backend/storage/smgr/md.c @@ -310,7 +310,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. @@ -355,18 +361,15 @@ mdunlink(RelFileNode rnode, ForkNumber forkNum, bool isRedo) else ret = -1; } - if (ret < 0) - { - if (!isRedo || errno != ENOENT) - ereport(WARNING, - (errcode_for_file_access(), - errmsg("could not remove relation %s: %m", path))); - } + if (ret < 0 && errno != ENOENT) + ereport(WARNING, + (errcode_for_file_access(), + errmsg("could not remove relation %s: %m", path))); /* * Delete any additional segments. */ - else + if (ret >= 0) { char *segpath = (char *) palloc(strlen(path) + 12); BlockNumber segno;