]> granicus.if.org Git - postgresql/commitdiff
Don't build full initial logical decoding snapshot if NOEXPORT_SNAPSHOT.
authorAndres Freund <andres@anarazel.de>
Thu, 27 Apr 2017 22:49:22 +0000 (15:49 -0700)
committerAndres Freund <andres@anarazel.de>
Thu, 27 Apr 2017 22:52:31 +0000 (15:52 -0700)
Earlier commits (56e19d938dd14 and 2bef06d5164) make it cheaper to
create a logical slot if not exporting the initial snapshot.  If
NOEXPORT_SNAPSHOT is specified, we can skip the overhead, not just
when creating a slot via sql (which can't export snapshots).  As
NOEXPORT_SNAPSHOT has only recently been introduced, this shouldn't be
backpatched.

src/backend/replication/walsender.c

index 43c8a73f3e1f763472fce2f36efd197e30a47669..2a6c8bb62dfba479ddfd908f20f4887de956a53d 100644 (file)
@@ -873,6 +873,7 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
        if (cmd->kind == REPLICATION_KIND_LOGICAL)
        {
                LogicalDecodingContext *ctx;
+               bool    need_full_snapshot = false;
 
                /*
                 * Do options check early so that we can bail before calling the
@@ -884,6 +885,8 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
                                ereport(ERROR,
                                                (errmsg("CREATE_REPLICATION_SLOT ... EXPORT_SNAPSHOT "
                                                                "must not be called inside a transaction")));
+
+                       need_full_snapshot = true;
                }
                else if (snapshot_action == CRS_USE_SNAPSHOT)
                {
@@ -906,10 +909,11 @@ CreateReplicationSlot(CreateReplicationSlotCmd *cmd)
                                ereport(ERROR,
                                                (errmsg("CREATE_REPLICATION_SLOT ... USE_SNAPSHOT "
                                                                "must not be called in a subtransaction")));
+
+                       need_full_snapshot = true;
                }
 
-               ctx = CreateInitDecodingContext(cmd->plugin, NIL,
-                                                                               true, /* build snapshot */
+               ctx = CreateInitDecodingContext(cmd->plugin, NIL, need_full_snapshot,
                                                                                logical_read_xlog_page,
                                                                                WalSndPrepareWrite, WalSndWriteData);