mirror of
https://github.com/postgres/postgres.git
synced 2025-07-30 11:03:19 +03:00
Review logical replication tablesync code
Most importantly, remove optimization in LogicalRepSyncTableStart that skips the normal walrcv_startstreaming/endstreaming dance. The optimization is not critically important for production uses anyway, since it only fires in cases with no activity, and saves an uninteresting amount of work even then. Critically, it obscures bugs by hiding the interesting code path from test cases. Also: in GetSubscriptionRelState, remove pointless relation open; access pg_subscription_rel->srsubstate with GETSTRUCT as is typical rather than SysCacheGetAttr; remove unused 'missing_ok' argument. In wait_for_relation_state_change, use explicit catalog snapshot invalidation rather than obscurely (and expensively) through GetLatestSnapshot. In various places: sprinkle comments more liberally and rewrite a number of them. Other cosmetic code improvements. No backpatch, since no bug is being fixed here. Author: Álvaro Herrera <alvherre@alvh.no-ip.org> Reviewed-by: Petr Jelínek <petr.jelinek@2ndquadrant.com> Discussion: https://postgr.es/m/20201010190637.GA5774@alvherre.pgsql
This commit is contained in:
@ -2060,6 +2060,7 @@ LogicalRepApplyLoop(XLogRecPtr last_received)
|
||||
{
|
||||
TimestampTz last_recv_timestamp = GetCurrentTimestamp();
|
||||
bool ping_sent = false;
|
||||
TimeLineID tli;
|
||||
|
||||
/*
|
||||
* Init the ApplyMessageContext which we clean up after each replication
|
||||
@ -2201,12 +2202,7 @@ LogicalRepApplyLoop(XLogRecPtr last_received)
|
||||
|
||||
/* Check if we need to exit the streaming loop. */
|
||||
if (endofstream)
|
||||
{
|
||||
TimeLineID tli;
|
||||
|
||||
walrcv_endstreaming(wrconn, &tli);
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Wait for more data or latch. If we have unflushed transactions,
|
||||
@ -2283,6 +2279,9 @@ LogicalRepApplyLoop(XLogRecPtr last_received)
|
||||
send_feedback(last_received, requestReply, requestReply);
|
||||
}
|
||||
}
|
||||
|
||||
/* All done */
|
||||
walrcv_endstreaming(wrconn, &tli);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -3024,10 +3023,8 @@ ApplyWorkerMain(Datum main_arg)
|
||||
/* This is table synchronization worker, call initial sync. */
|
||||
syncslotname = LogicalRepSyncTableStart(&origin_startpos);
|
||||
|
||||
/* The slot name needs to be allocated in permanent memory context. */
|
||||
oldctx = MemoryContextSwitchTo(ApplyContext);
|
||||
myslotname = pstrdup(syncslotname);
|
||||
MemoryContextSwitchTo(oldctx);
|
||||
/* allocate slot name in long-lived context */
|
||||
myslotname = MemoryContextStrdup(ApplyContext, syncslotname);
|
||||
|
||||
pfree(syncslotname);
|
||||
}
|
||||
|
Reference in New Issue
Block a user