aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/backend/access/transam/twophase.c9
-rw-r--r--src/backend/access/transam/xact.c25
-rw-r--r--src/backend/storage/smgr/md.c38
-rw-r--r--src/include/storage/smgr.h1
4 files changed, 44 insertions, 29 deletions
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index 10d615068ce..faf590b7709 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1373,7 +1373,6 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
RelFileNode *delrels;
int ndelrels;
SharedInvalidationMessage *invalmsgs;
- int i;
/*
* Validate the GID, and lock the GXACT to ensure that two backends do not
@@ -1463,13 +1462,9 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
delrels = abortrels;
ndelrels = hdr->nabortrels;
}
- for (i = 0; i < ndelrels; i++)
- {
- SMgrRelation srel = smgropen(delrels[i], InvalidBackendId);
- smgrdounlink(srel, false);
- smgrclose(srel);
- }
+ /* Make sure files supposed to be dropped are dropped */
+ DropRelationFiles(delrels, ndelrels, false);
/*
* Handle cache invalidation messages.
diff --git a/src/backend/access/transam/xact.c b/src/backend/access/transam/xact.c
index f4ddd2604f8..d3632c25cae 100644
--- a/src/backend/access/transam/xact.c
+++ b/src/backend/access/transam/xact.c
@@ -5322,7 +5322,6 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
RepOriginId origin_id)
{
TransactionId max_xid;
- int i;
TimestampTz commit_time;
max_xid = TransactionIdLatest(xid, parsed->nsubxacts, parsed->subxacts);
@@ -5439,16 +5438,8 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
*/
XLogFlush(lsn);
- for (i = 0; i < parsed->nrels; i++)
- {
- SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId);
- ForkNumber fork;
-
- for (fork = 0; fork <= MAX_FORKNUM; fork++)
- XLogDropRelation(parsed->xnodes[i], fork);
- smgrdounlink(srel, true);
- smgrclose(srel);
- }
+ /* Make sure files supposed to be dropped are dropped */
+ DropRelationFiles(parsed->xnodes, parsed->nrels, true);
}
/*
@@ -5480,7 +5471,6 @@ xact_redo_commit(xl_xact_parsed_commit *parsed,
static void
xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
{
- int i;
TransactionId max_xid;
/*
@@ -5542,16 +5532,7 @@ xact_redo_abort(xl_xact_parsed_abort *parsed, TransactionId xid)
}
/* Make sure files supposed to be dropped are dropped */
- for (i = 0; i < parsed->nrels; i++)
- {
- SMgrRelation srel = smgropen(parsed->xnodes[i], InvalidBackendId);
- ForkNumber fork;
-
- for (fork = 0; fork <= MAX_FORKNUM; fork++)
- XLogDropRelation(parsed->xnodes[i], fork);
- smgrdounlink(srel, true);
- smgrclose(srel);
- }
+ DropRelationFiles(parsed->xnodes, parsed->nrels, true);
}
void
diff --git a/src/backend/storage/smgr/md.c b/src/backend/storage/smgr/md.c
index b36198ed4a8..849055b191a 100644
--- a/src/backend/storage/smgr/md.c
+++ b/src/backend/storage/smgr/md.c
@@ -26,6 +26,7 @@
#include <sys/file.h>
#include "miscadmin.h"
+#include "access/xlogutils.h"
#include "access/xlog.h"
#include "catalog/catalog.h"
#include "portability/instr_time.h"
@@ -1641,6 +1642,43 @@ ForgetDatabaseFsyncRequests(Oid dbid)
}
}
+/*
+ * DropRelationFiles -- drop files of all given relations
+ */
+void
+DropRelationFiles(RelFileNode *delrels, int ndelrels, bool isRedo)
+{
+ SMgrRelation *srels;
+ int i;
+
+ srels = palloc(sizeof(SMgrRelation) * ndelrels);
+ for (i = 0; i < ndelrels; i++)
+ {
+ SMgrRelation srel = smgropen(delrels[i], InvalidBackendId);
+
+ if (isRedo)
+ {
+ ForkNumber fork;
+
+ for (fork = 0; fork <= MAX_FORKNUM; fork++)
+ XLogDropRelation(delrels[i], fork);
+ }
+ srels[i] = srel;
+ }
+
+ smgrdounlinkall(srels, ndelrels, isRedo);
+
+ /*
+ * Call smgrclose() in reverse order as when smgropen() is called.
+ * This trick enables remove_from_unowned_list() in smgrclose()
+ * to search the SMgrRelation from the unowned list,
+ * with O(1) performance.
+ */
+ for (i = ndelrels - 1; i >= 0; i--)
+ smgrclose(srels[i]);
+ pfree(srels);
+}
+
/*
* _fdvec_alloc() -- Make a MdfdVec object.
diff --git a/src/include/storage/smgr.h b/src/include/storage/smgr.h
index 69a624fe237..dfb7e98e932 100644
--- a/src/include/storage/smgr.h
+++ b/src/include/storage/smgr.h
@@ -135,6 +135,7 @@ extern void RememberFsyncRequest(RelFileNode rnode, ForkNumber forknum,
BlockNumber segno);
extern void ForgetRelationFsyncRequests(RelFileNode rnode, ForkNumber forknum);
extern void ForgetDatabaseFsyncRequests(Oid dbid);
+extern void DropRelationFiles(RelFileNode *delrels, int ndelrels, bool isRedo);
/* smgrtype.c */
extern Datum smgrout(PG_FUNCTION_ARGS);