diff options
author | Andres Freund <andres@anarazel.de> | 2014-12-02 23:42:26 +0100 |
---|---|---|
committer | Andres Freund <andres@anarazel.de> | 2014-12-02 23:47:08 +0100 |
commit | 0fd38e13706e6bd4b2a4ce4e0570d0aa4ad65345 (patch) | |
tree | 06761df2cd6448e02d42beb8f1ff15e0e5ad0643 /src/backend/replication/logical/logical.c | |
parent | 75ef435218fe4f6ce29d33e10f6f7a328c93f7e7 (diff) | |
download | postgresql-0fd38e13706e6bd4b2a4ce4e0570d0aa4ad65345.tar.gz postgresql-0fd38e13706e6bd4b2a4ce4e0570d0aa4ad65345.zip |
Don't skip SQL backends in logical decoding for visibility computation.
The logical decoding patchset introduced PROC_IN_LOGICAL_DECODING flag
PGXACT flag, that allows such backends to be skipped when computing
the xmin horizon/snapshots. That's fine and sensible for walsenders
streaming out logical changes, but not at all fine for SQL backends
doing logical decoding. If the latter set that flag any change they
have performed outside of logical decoding will not be regarded as
visible - which e.g. can lead to that change being vacuumed away.
Note that not setting the flag for SQL backends isn't particularly
bothersome - the SQL backend doesn't do streaming, so it only runs for
a limited amount of time.
Per buildfarm member 'tick' and Alvaro.
Backpatch to 9.4, where logical decoding was introduced.
Diffstat (limited to 'src/backend/replication/logical/logical.c')
-rw-r--r-- | src/backend/replication/logical/logical.c | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/src/backend/replication/logical/logical.c b/src/backend/replication/logical/logical.c index 8c318cd4b51..8fd66356267 100644 --- a/src/backend/replication/logical/logical.c +++ b/src/backend/replication/logical/logical.c @@ -146,10 +146,19 @@ StartupDecodingContext(List *output_plugin_options, * logical decoding backend which doesn't need to be checked individually * when computing the xmin horizon because the xmin is enforced via * replication slots. + * + * We can only do so if we're outside of a transaction (i.e. the case when + * streaming changes via walsender), otherwise a already setup + * snapshot/xid would end up being ignored. That's not a particularly + * bothersome restriction since the SQL interface can't be used for + * streaming anyway. */ - LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); - MyPgXact->vacuumFlags |= PROC_IN_LOGICAL_DECODING; - LWLockRelease(ProcArrayLock); + if (!IsTransactionOrTransactionBlock()) + { + LWLockAcquire(ProcArrayLock, LW_EXCLUSIVE); + MyPgXact->vacuumFlags |= PROC_IN_LOGICAL_DECODING; + LWLockRelease(ProcArrayLock); + } ctx->slot = slot; |