aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/access/transam/twophase.c3
-rw-r--r--src/backend/access/transam/xact.c14
-rw-r--r--src/backend/catalog/storage.c9
-rw-r--r--src/backend/storage/smgr/md.c21
4 files changed, 21 insertions, 26 deletions
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index 0d94697084b..3be0a38cb27 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 cc20929fae6..f2c5c169271 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 67236ddd81f..326e76f283e 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 0c4861d6dbb..e69c7d3bb8a 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;