On 1 September 2016 at 21:19, Simon Riggs <si...@2ndquadrant.com> wrote:
> I agree the doc patch should go in, though I suggest reword it > slightly, like attached patch. Thanks. The rewording looks good to me and I think that Doc-correction-each-change-once.v2.patch is ready for commit. Meanwhile, thinking about the patch to dirty slots on confirmed_flush_lsn advance some more, I don't think it's ideal to do it in LogicalConfirmReceivedLocation(). I'd rather not add more complexity there, it's already complex enough. Doing it there will also lead to unnecessary slot write-out being done to slots at normal checkpoints even if the slot hasn't otherwise changed, possibly in response to lsn advances sent in response to keepalives due to activity on other unrelated databases. Slots are always fsync()ed when written out so we don't want to do it more than we have to. We really only need to write out slots where only the confirmed_flush_lsn has changed at a shutdown checkpoint since it's not really a big worry if it goes backwards on crash, and otherwise it can't. Even then it only _really_ matters when the SQL interface is used. Losing the confirmed_flush_lsn is very annoying when using pg_recvlogical too, and was the original motivation for this patch. But I'm thinking of instead teaching pg_recvlogical to write out a status file with its last confirmed point on exit and to be able to take that as an argument when (re)connecting. Poor-man's replication origins, effectively. So here's a simpler patch that just dirties the slot when it's replayed something from it on the SQL interface, so it's flushed out next checkpoint or on shutdown. That's the main user visible defect that should be fixed and it's trivial to do here. It means we'll still forget the confirmed_flush_lsn on clean shutdown if it was advanced using the walsender protocol, but *shrug*. That's just a little inconvenient. I can patch pg_recvlogical separately. The alternative is probably to add a second, "softer" dirty tracking method that only causes a write at a clean shutdown or forced checkpoint - and maybe doesn't bother fsync()ing. That's a bit more invasive but would work for walsender use as well as the SQL interface. I don't think it's worth the bother, since in the end callers have to be prepared for repeated data on crash anyway. -- Craig Ringer http://www.2ndQuadrant.com/ PostgreSQL Development, 24x7 Support, Training & Services
From 7261d4e182a011c8bb609f9307dcc61c5e15dd56 Mon Sep 17 00:00:00 2001 From: Craig Ringer <cr...@2ndquadrant.com> Date: Mon, 2 May 2016 19:50:22 +0800 Subject: [PATCH] Dirty replication slots when accessed via sql interface When pg_logical_slot_get_changes(...) sets confirmed_flush_lsn to the point at which replay stopped, it doesn't dirty the replication slot. So if the replay didn't cause restart_lsn or catalog_xmin to change as well, this change will not get written out to disk. Even on a clean shutdown. If Pg crashes or restarts, a subsequent pg_logical_slot_get_changes(...) call will see the same changes already replayed since it uses the slot's confirmed_flush_lsn as the start point for fetching changes. The caller can't specify a start LSN when using the SQL interface. Mark the slot as dirty after reading changes using the SQL interface so that users won't see repeated changes after a clean shutdown. Repeated changes still occur when using the walsender interface or after an unclean shutdown. --- src/backend/replication/logical/logicalfuncs.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/backend/replication/logical/logicalfuncs.c b/src/backend/replication/logical/logicalfuncs.c index 4e4c8cd..3d1de03 100644 --- a/src/backend/replication/logical/logicalfuncs.c +++ b/src/backend/replication/logical/logicalfuncs.c @@ -321,7 +321,10 @@ pg_logical_slot_get_changes_guts(FunctionCallInfo fcinfo, bool confirm, bool bin * business..) */ if (ctx->reader->EndRecPtr != InvalidXLogRecPtr && confirm) + { LogicalConfirmReceivedLocation(ctx->reader->EndRecPtr); + ReplicationSlotMarkDirty(); + } /* free context, call shutdown callback */ FreeDecodingContext(ctx); -- 2.5.5
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers