agora inbox for [email protected]
help / color / mirror / Atom feedFrom: Kyotaro Horiguchi <[email protected]>
Subject: [PATCH v26 2/6] change swap_relation_files
Date: Wed, 27 Nov 2019 07:38:46 -0500
The current patch doesn't adjust the new relation in
swap_relation_files. This inhibits the relcache from
invalidated. Adjust relache of the new relfilenode.
Change lock level for relcache adjusting.
---
src/backend/commands/cluster.c | 28 ++++++++++++++++++++++++----
1 file changed, 24 insertions(+), 4 deletions(-)
diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c
index 093fff8c5c..af7733eef4 100644
--- a/src/backend/commands/cluster.c
+++ b/src/backend/commands/cluster.c
@@ -1015,6 +1015,7 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class,
Oid swaptemp;
char swptmpchr;
Relation rel1;
+ Relation rel2;
/* We need writable copies of both pg_class tuples. */
relRelation = table_open(RelationRelationId, RowExclusiveLock);
@@ -1177,12 +1178,31 @@ swap_relation_files(Oid r1, Oid r2, bool target_is_pg_class,
/*
* Recognize that rel1's relfilenode (swapped from rel2) is new in this
- * subtransaction. Since the next step for rel2 is deletion, don't bother
- * recording the newness of its relfilenode.
+ * subtransaction. However the next step for rel2 is deletion, we need to
+ * turn off the newness of its relfilenode, that allows the relcache to be
+ * flushed. Requried lock must be held before getting here so we take
+ * AccessShareLock in case no lock is acquired. Since command counter is
+ * not advanced the relcache entries has the contens before the above
+ * updates. We don't bother incrementing it and swap their contents
+ * directly.
+ */
+ rel1 = relation_open(r1, AccessShareLock);
+ rel2 = relation_open(r2, AccessShareLock);
+
+ /* swap relfilenodes */
+ rel1->rd_node.relNode = relfilenode2;
+ rel2->rd_node.relNode = relfilenode1;
+
+ /*
+ * Adjust newness flags. relfilenode2 is already added to EOXact array so
+ * we don't need to do that again here. We assume the new file is created
+ * in the current subtransaction.
*/
- rel1 = relation_open(r1, AccessExclusiveLock);
RelationAssumeNewRelfilenode(rel1);
- relation_close(rel1, NoLock);
+ rel2->rd_createSubid = InvalidSubTransactionId;
+
+ relation_close(rel1, AccessShareLock);
+ relation_close(rel2, AccessShareLock);
/*
* Post alter hook for modified relations. The change to r2 is always
--
2.23.0
----Next_Part(Thu_Nov_28_20_56_20_2019_909)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="v26-0003-Improve-the-performance-of-relation-syncs.patch"
view thread (2+ messages) latest in thread
reply
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Reply to all the recipients using the --to and --cc options:
reply via email
To: [email protected]
Cc: [email protected]
Subject: Re: [PATCH v26 2/6] change swap_relation_files
In-Reply-To: <no-message-id-1883400@localhost>
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
This inbox is served by agora; see mirroring instructions
for how to clone and mirror all data and code used for this inbox