diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/replication/logical/logical.c | 7 | ||||
-rw-r--r-- | src/backend/replication/logical/snapbuild.c | 19 | ||||
-rw-r--r-- | src/include/replication/logical.h | 6 |
3 files changed, 25 insertions, 7 deletions
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 41243d0187a..6894d3acbc4 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -151,6 +151,7 @@ StartupDecodingContext(List *output_plugin_options, TransactionId xmin_horizon, bool need_full_snapshot, bool fast_forward, + bool in_create, XLogReaderRoutine *xl_routine, LogicalOutputPluginWriterPrepareWrite prepare_write, LogicalOutputPluginWriterWrite do_write, @@ -296,6 +297,8 @@ StartupDecodingContext(List *output_plugin_options, ctx->fast_forward = fast_forward; + ctx->in_create = in_create; + MemoryContextSwitchTo(old_context); return ctx; @@ -437,7 +440,7 @@ CreateInitDecodingContext(const char *plugin, ReplicationSlotSave(); ctx = StartupDecodingContext(NIL, restart_lsn, xmin_horizon, - need_full_snapshot, false, + need_full_snapshot, false, true, xl_routine, prepare_write, do_write, update_progress); @@ -573,7 +576,7 @@ CreateDecodingContext(XLogRecPtr start_lsn, ctx = StartupDecodingContext(output_plugin_options, start_lsn, InvalidTransactionId, false, - fast_forward, xl_routine, prepare_write, + fast_forward, false, xl_routine, prepare_write, do_write, update_progress); /* call output plugin initialization callback */ diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index 7a7aba33e16..3ed2f79dd06 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -1314,6 +1314,8 @@ SnapBuildProcessRunningXacts(SnapBuild *builder, XLogRecPtr lsn, xl_running_xact static bool SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *running) { + LogicalDecodingContext *ctx = (LogicalDecodingContext *) builder->reorder->private_data; + /* --- * Build catalog decoding snapshot incrementally using information about * the currently running transactions. There are several ways to do that: @@ -1323,10 +1325,12 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn * state while waiting on c)'s sub-states. * * b) This (in a previous run) or another decoding slot serialized a - * snapshot to disk that we can use. Can't use this method for the - * initial snapshot when slot is being created and needs full snapshot - * for export or direct use, as that snapshot will only contain catalog - * modifying transactions. + * snapshot to disk that we can use. Can't use this method while finding + * the start point for decoding changes as the restart LSN would be an + * arbitrary LSN but we need to find the start point to extract changes + * where we won't see the data for partial transactions. Also, we cannot + * use this method when a slot needs a full snapshot for export or direct + * use, as that snapshot will only contain catalog modifying transactions. * * c) First incrementally build a snapshot for catalog tuples * (BUILDING_SNAPSHOT), that requires all, already in-progress, @@ -1391,8 +1395,13 @@ SnapBuildFindSnapshot(SnapBuild *builder, XLogRecPtr lsn, xl_running_xacts *runn return false; } - /* b) valid on disk state and not building full snapshot */ + + /* + * b) valid on disk state and while neither building full snapshot nor + * creating a slot. + */ else if (!builder->building_full_snapshot && + !ctx->in_create && SnapBuildRestore(builder, lsn)) { /* there won't be any state to cleanup */ diff --git a/src/include/replication/logical.h b/src/include/replication/logical.h index 5f49554ea05..68d1c37230a 100644 --- a/src/include/replication/logical.h +++ b/src/include/replication/logical.h @@ -109,6 +109,12 @@ typedef struct LogicalDecodingContext TransactionId write_xid; /* Are we processing the end LSN of a transaction? */ bool end_xact; + + /* + * True if the logical decoding context being used for the creation + * of a logical replication slot. + */ + bool in_create; } LogicalDecodingContext; |