($INBOX_DIR/description missing)
help / color / mirror / Atom feedFrom: Alvaro Herrera <[email protected]>
Subject: [PATCH] Flag CREATE INDEX CONCURRENTLY to avoid spurious waiting
Date: Tue, 4 Aug 2020 22:04:57 -0400
---
src/backend/commands/indexcmds.c | 13 +++++++++++--
src/include/storage/proc.h | 2 ++
src/include/storage/procarray.h | 6 +++++-
3 files changed, 18 insertions(+), 3 deletions(-)
diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c
index a3cb3cd47f..241c8a337e 100644
--- a/src/backend/commands/indexcmds.c
+++ b/src/backend/commands/indexcmds.c
@@ -393,7 +393,7 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
VirtualTransactionId *old_snapshots;
old_snapshots = GetCurrentVirtualXIDs(limitXmin, true, false,
- PROC_IS_AUTOVACUUM | PROC_IN_VACUUM,
+ PROC_IS_AUTOVACUUM | PROC_IN_VACUUM | PROC_IN_CIC,
&n_old_snapshots);
if (progress)
pgstat_progress_update_param(PROGRESS_WAITFOR_TOTAL, n_old_snapshots);
@@ -413,7 +413,7 @@ WaitForOlderSnapshots(TransactionId limitXmin, bool progress)
newer_snapshots = GetCurrentVirtualXIDs(limitXmin,
true, false,
- PROC_IS_AUTOVACUUM | PROC_IN_VACUUM,
+ PROC_IS_AUTOVACUUM | PROC_IN_VACUUM | PROC_IN_CIC,
&n_newer_snapshots);
for (j = i; j < n_old_snapshots; j++)
{
@@ -1420,6 +1420,9 @@ DefineIndex(Oid relationId,
CommitTransactionCommand();
StartTransactionCommand();
+ /* Set flag for other concurrent index builds to ignore us */
+ MyPgXact->vacuumFlags |= PROC_IN_CIC;
+
/*
* The index is now visible, so we can report the OID.
*/
@@ -1482,6 +1485,9 @@ DefineIndex(Oid relationId,
CommitTransactionCommand();
StartTransactionCommand();
+ /* Set flag for other concurrent index builds to ignore us */
+ MyPgXact->vacuumFlags |= PROC_IN_CIC;
+
/*
* Phase 3 of concurrent index build
*
@@ -1541,6 +1547,9 @@ DefineIndex(Oid relationId,
CommitTransactionCommand();
StartTransactionCommand();
+ /* Set flag for other concurrent index builds to ignore us */
+ MyPgXact->vacuumFlags |= PROC_IN_CIC;
+
/* We should now definitely not be advertising any xmin. */
Assert(MyPgXact->xmin == InvalidTransactionId);
diff --git a/src/include/storage/proc.h b/src/include/storage/proc.h
index b20e2ad4f6..43c8ea3e31 100644
--- a/src/include/storage/proc.h
+++ b/src/include/storage/proc.h
@@ -53,6 +53,8 @@ struct XidCache
#define PROC_IS_AUTOVACUUM 0x01 /* is it an autovac worker? */
#define PROC_IN_VACUUM 0x02 /* currently running lazy vacuum */
#define PROC_IN_ANALYZE 0x04 /* currently running analyze */
+#define PROC_IN_CIC 0x40 /* currently running CREATE INDEX
+ CONCURRENTLY */
#define PROC_VACUUM_FOR_WRAPAROUND 0x08 /* set by autovac only */
#define PROC_IN_LOGICAL_DECODING 0x10 /* currently doing logical
* decoding outside xact */
diff --git a/src/include/storage/procarray.h b/src/include/storage/procarray.h
index a5c7d0c064..0255949307 100644
--- a/src/include/storage/procarray.h
+++ b/src/include/storage/procarray.h
@@ -36,6 +36,9 @@
#define PROCARRAY_SLOTS_XMIN 0x20 /* replication slot xmin,
* catalog_xmin */
+#define PROCARRAY_CIC_FLAG 0x40 /* currently running CREATE INDEX
+ * CONCURRENTLY */
+
/*
* Only flags in PROCARRAY_PROC_FLAGS_MASK are considered when matching
* PGXACT->vacuumFlags. Other flags are used for different purposes and
@@ -43,7 +46,8 @@
*/
#define PROCARRAY_PROC_FLAGS_MASK (PROCARRAY_VACUUM_FLAG | \
PROCARRAY_ANALYZE_FLAG | \
- PROCARRAY_LOGICAL_DECODING_FLAG)
+ PROCARRAY_LOGICAL_DECODING_FLAG | \
+ PROCARRAY_CIC_FLAG)
/* Use the following flags as an input "flags" to GetOldestXmin function */
/* Consider all backends except for logical decoding ones which manage xmin separately */
--
2.20.1
--VS++wcV0S1rZb1Fb--
view thread (44+ 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] Flag CREATE INDEX CONCURRENTLY to avoid spurious waiting
In-Reply-To: <no-message-id-1871986@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