Re: Conflict detection for update_deleted in logical replication - Mailing list pgsql-hackers
From | Masahiko Sawada |
---|---|
Subject | Re: Conflict detection for update_deleted in logical replication |
Date | |
Msg-id | CAD21AoDfL8_4ryU_Bo-CpvhfH9jS0SihtrGwBfSyFwHMcerm2Q@mail.gmail.com Whole thread Raw |
In response to | Re: Conflict detection for update_deleted in logical replication (Amit Kapila <amit.kapila16@gmail.com>) |
Responses |
Re: Conflict detection for update_deleted in logical replication
|
List | pgsql-hackers |
On Mon, Sep 16, 2024 at 11:53 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > On Tue, Sep 17, 2024 at 6:08 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > > > On Fri, Sep 13, 2024 at 12:56 AM shveta malik <shveta.malik@gmail.com> wrote: > > > > > > On Fri, Sep 13, 2024 at 11:38 AM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > > > > > > > > > > > So in brief, this solution is only for bidrectional setup? For non-bidirectional, > > > > > > feedback_slots is non-configurable and thus irrelevant. > > > > > > > > > > Right. > > > > > > > > > > > > > One possible idea to address the non-bidirectional case raised by > > > > Shveta is to use a time-based cut-off to remove dead tuples. As > > > > mentioned earlier in my email [1], we can define a new GUC parameter > > > > say vacuum_committs_age which would indicate that we will allow rows > > > > to be removed only if the modified time of the tuple as indicated by > > > > committs module is greater than the vacuum_committs_age. We could keep > > > > this parameter a table-level option without introducing a GUC as this > > > > may not apply to all tables. I checked and found that some other > > > > replication solutions like GoldenGate also allowed similar parameters > > > > (tombstone_deletes) to be specified at table level [2]. The other > > > > advantage of allowing it at table level is that it won't hamper the > > > > performance of hot-pruning or vacuum in general. Note, I am careful > > > > here because to decide whether to remove a dead tuple or not we need > > > > to compare its committs_time both during hot-pruning and vacuum. > > > > > > +1 on the idea, > > > > I agree that this idea is much simpler than the idea originally > > proposed in this thread. > > > > IIUC vacuum_committs_age specifies a time rather than an XID age. > > > > Your understanding is correct that vacuum_committs_age specifies a time. > > > > > But > > how can we implement it? If it ends up affecting the vacuum cutoff, we > > should be careful not to end up with the same result of > > vacuum_defer_cleanup_age that was discussed before[1]. Also, I think > > the implementation needs not to affect the performance of > > ComputeXidHorizons(). > > > > I haven't thought about the implementation details yet but I think > during pruning (for example in heap_prune_satisfies_vacuum()), apart > from checking if the tuple satisfies > HeapTupleSatisfiesVacuumHorizon(), we should also check if the tuple's > committs is greater than configured vacuum_committs_age (for the > table) to decide whether tuple can be removed. Sounds very costly. I think we need to do performance tests. Even if the vacuum gets slower only on the particular table having the vacuum_committs_age setting, it would affect overall autovacuum performance. Also, it would affect HOT pruning performance. > > > > but IIUC this value doesn’t need to be significant; it > > > can be limited to just a few minutes. The one which is sufficient to > > > handle replication delays caused by network lag or other factors, > > > assuming clock skew has already been addressed. > > > > I think that in a non-bidirectional case the value could need to be a > > large number. Is that right? > > > > As per my understanding, even for non-bidirectional cases, the value > should be small. For example, in the case, pointed out by Shveta [1], > where the updates from 2 nodes are received by a third node, this > setting is expected to be small. This setting primarily deals with > concurrent transactions on multiple nodes, so it should be small but I > could be missing something. > I might be missing something but the scenario I was thinking of is something below. Suppose that we setup uni-directional logical replication between Node A and Node B (e.g., Node A -> Node B) and both nodes have the same row with key = 1: Node A: T1: UPDATE t SET val = 2 WHERE key = 1; (10:00 AM) -> This change is applied on Node B at 10:01 AM. Node B: T2: DELETE FROM t WHERE key = 1; (05:00 AM) If a vacuum runs on Node B at 06:00 AM, the change of T1 coming from Node A would raise an "update_missing" conflict. On the other hand, if a vacuum runs on Node B at 11:00 AM, the change would raise an "update_deleted" conflict. It looks whether we detect an "update_deleted" or an "updated_missing" depends on the timing of vacuum, and to avoid such a situation, we would need to set vacuum_committs_age to more than 5 hours. Regards, -- Masahiko Sawada Amazon Web Services: https://aws.amazon.com
pgsql-hackers by date: