public inbox for [email protected]
help / color / mirror / Atom feedFrom: Kyotaro Horiguchi <[email protected]>
Subject: [PATCH 4/7] Add new interface to TableAmRoutine
Date: Tue, 2 Apr 2019 11:53:36 +0900
Add two interface functions to TableAmRoutine, which are related to
WAL-skipping feature.
---
src/backend/access/table/tableamapi.c | 4 ++
src/include/access/tableam.h | 79 +++++++++++++++++++++++------------
2 files changed, 56 insertions(+), 27 deletions(-)
diff --git a/src/backend/access/table/tableamapi.c b/src/backend/access/table/tableamapi.c
index 51c0deaaf2..fef4e523e8 100644
--- a/src/backend/access/table/tableamapi.c
+++ b/src/backend/access/table/tableamapi.c
@@ -94,6 +94,10 @@ GetTableAmRoutine(Oid amhandler)
(routine->scan_bitmap_next_tuple == NULL));
Assert(routine->scan_sample_next_block != NULL);
Assert(routine->scan_sample_next_tuple != NULL);
+ Assert((routine->relation_register_walskip == NULL) ==
+ (routine->relation_invalidate_walskip == NULL) &&
+ (routine->relation_register_walskip == NULL) ==
+ (routine->finish_bulk_insert == NULL));
return routine;
}
diff --git a/src/include/access/tableam.h b/src/include/access/tableam.h
index 4efe178ed1..1a3a3c6711 100644
--- a/src/include/access/tableam.h
+++ b/src/include/access/tableam.h
@@ -382,19 +382,15 @@ typedef struct TableAmRoutine
/*
* Perform operations necessary to complete insertions made via
- * tuple_insert and multi_insert with a BulkInsertState specified. This
- * e.g. may e.g. used to flush the relation when inserting with
- * TABLE_INSERT_SKIP_WAL specified.
+ * tuple_insert and multi_insert or page-level copying performed by ALTER
+ * TABLE rewrite. This is called at commit time if WAL-skipping is
+ * activated and the caller decided that any finish work is required to
+ * the file.
*
- * Typically callers of tuple_insert and multi_insert will just pass all
- * the flags the apply to them, and each AM has to decide which of them
- * make sense for it, and then only take actions in finish_bulk_insert
- * that make sense for a specific AM.
- *
- * Optional callback.
+ * Optional callback. Must be provided when relation_register_walskip is
+ * provided.
*/
- void (*finish_bulk_insert) (Relation rel, int options);
-
+ void (*finish_bulk_insert) (RelFileNode rnode, ForkNumber forkNum);
/* ------------------------------------------------------------------------
* DDL related functionality.
@@ -447,6 +443,26 @@ typedef struct TableAmRoutine
double *tups_vacuumed,
double *tups_recently_dead);
+ /*
+ * Register WAL-skipping on the current storage of rel. WAL-logging on the
+ * relation is skipped and the storage will be synced at commit. Returns
+ * true if successfully registered, and finish_bulk_insert() is called at
+ * commit.
+ *
+ * Optional callback.
+ */
+ void (*relation_register_walskip) (Relation rel);
+
+ /*
+ * Invalidate registered WAL skipping on the current storage of rel. The
+ * function is called when the storage of the relation is going to be
+ * out-of-use after commit.
+ *
+ * Optional callback. Must be provided when relation_register_walskip is
+ * provided.
+ */
+ void (*relation_invalidate_walskip) (Relation rel);
+
/*
* React to VACUUM command on the relation. The VACUUM might be user
* triggered or by autovacuum. The specific actions performed by the AM
@@ -1026,8 +1042,7 @@ table_compute_xid_horizon_for_tuples(Relation rel,
*
*
* The BulkInsertState object (if any; bistate can be NULL for default
- * behavior) is also just passed through to RelationGetBufferForTuple. If
- * `bistate` is provided, table_finish_bulk_insert() needs to be called.
+ * behavior) is also just passed through to RelationGetBufferForTuple.
*
* On return the slot's tts_tid and tts_tableOid are updated to reflect the
* insertion. But note that any toasting of fields within the slot is NOT
@@ -1201,20 +1216,6 @@ table_lock_tuple(Relation rel, ItemPointer tid, Snapshot snapshot,
flags, tmfd);
}
-/*
- * Perform operations necessary to complete insertions made via
- * tuple_insert and multi_insert with a BulkInsertState specified. This
- * e.g. may e.g. used to flush the relation when inserting with
- * TABLE_INSERT_SKIP_WAL specified.
- */
-static inline void
-table_finish_bulk_insert(Relation rel, int options)
-{
- /* optional callback */
- if (rel->rd_tableam && rel->rd_tableam->finish_bulk_insert)
- rel->rd_tableam->finish_bulk_insert(rel, options);
-}
-
/* ------------------------------------------------------------------------
* DDL related functionality.
@@ -1298,6 +1299,30 @@ table_relation_copy_for_cluster(Relation OldHeap, Relation NewHeap,
tups_recently_dead);
}
+/*
+ * Register WAL-skipping to the relation. WAL-logging is skipped for the new
+ * pages after this call and the relation file is going to be synced at
+ * commit.
+ */
+static inline void
+table_relation_register_walskip(Relation rel)
+{
+ if (rel->rd_tableam && rel->rd_tableam->relation_register_walskip)
+ rel->rd_tableam->relation_register_walskip(rel);
+}
+
+/*
+ * Unregister WAL-skipping to the relation. Call this when the relation is
+ * going to be out-of-use after commit. WAL-skipping continues but the
+ * relation won't be synced at commit.
+ */
+static inline void
+table_relation_invalidate_walskip(Relation rel)
+{
+ if (rel->rd_tableam && rel->rd_tableam->relation_invalidate_walskip)
+ rel->rd_tableam->relation_invalidate_walskip(rel);
+}
+
/*
* Perform VACUUM on the relation. The VACUUM can be user triggered or by
* autovacuum. The specific actions performed by the AM will depend heavily on
--
2.16.3
----Next_Part(Tue_Apr_02_19_54_06_2019_801)--
Content-Type: Text/X-Patch; charset=us-ascii
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="v10-0005-Add-infrastructure-to-WAL-logging-skip-feature.patch"
view thread (4+ 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 4/7] Add new interface to TableAmRoutine
In-Reply-To: <no-message-id-1883181@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