Re: Skipping logical replication transactions on subscriber side - Mailing list pgsql-hackers
From | vignesh C |
---|---|
Subject | Re: Skipping logical replication transactions on subscriber side |
Date | |
Msg-id | CALDaNm2MdMUZsP_NpfE-FYnF8-tnwGR8FqUH5yquVZkBKQ_nkg@mail.gmail.com Whole thread Raw |
In response to | Re: Skipping logical replication transactions on subscriber side (Masahiko Sawada <sawada.mshk@gmail.com>) |
List | pgsql-hackers |
On Fri, Dec 10, 2021 at 11:14 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > On Thu, Dec 9, 2021 at 6:16 PM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > On Thu, Dec 9, 2021 at 2:24 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote: > > > > > > On Thu, Dec 9, 2021 at 11:47 AM Amit Kapila <amit.kapila16@gmail.com> wrote: > > > > > > > > I am thinking that we can start a transaction, update the catalog, > > > > commit that transaction. Then start a new one to update > > > > origin_lsn/timestamp, finishprepared, and commit it. Now, if it > > > > crashes after the first transaction, only commit prepared will be > > > > resent again and this time we don't need to update the catalog as that > > > > entry would be already cleared. > > > > > > Sounds good. In the crash case, it should be fine since we will just > > > commit an empty transaction. The same is true for the case where > > > skip_xid has been changed after skipping and preparing the transaction > > > and before handling commit_prepared. > > > > > > Regarding the case where the user specifies XID of the transaction > > > after it is prepared on the subscriber (i.g., the transaction is not > > > empty), we won’t skip committing the prepared transaction. But I think > > > that we don't need to support skipping already-prepared transaction > > > since such transaction doesn't conflict with anything regardless of > > > having changed or not. > > > > > > > Yeah, this makes sense to me. > > > > I've attached an updated patch. The new syntax is like "ALTER > SUBSCRIPTION testsub SKIP (xid = '123')". > > I’ve been thinking we can do something safeguard for the case where > the user specified the wrong xid. For example, can we somewhat use the > stats in pg_stat_subscription_workers? An idea is that logical > replication worker fetches the xid from the stats when reading the > subscription and skips the transaction if the xid matches to > subskipxid. That is, the worker checks the error reported by the > worker previously working on the same subscription. The error could > not be a conflict error (e.g., connection error etc.) or might have > been cleared by the reset function, But given the worker is in an > error loop, the worker can eventually get xid in question. We can > prevent an unrelated transaction from being skipped unexpectedly. It > seems not a stable solution though. Or it might be enough to warn > users when they specified an XID that doesn’t match to last_error_xid. > Anyway, I think it’s better to have more discussion on this. Any > ideas? Few comments: 1) Should we check if conflicting option is specified like others above: + else if (strcmp(defel->defname, "xid") == 0) + { + char *xid_str = defGetString(defel); + TransactionId xid; + + if (strcmp(xid_str, "-1") == 0) + { + /* Setting -1 to xid means to reset it */ + xid = InvalidTransactionId; + } + else + { 2) Currently only superusers can set skip xid, we can add this in the documentation: + if (!superuser()) + ereport(ERROR, + (errcode(ERRCODE_INSUFFICIENT_PRIVILEGE), + errmsg("must be superuser to set %s", "skip_xid"))); 3) There is an extra tab before "The resolution can be done ...", it can be removed. + Skip applying changes of the particular transaction. If incoming data + violates any constraints the logical replication will stop until it is + resolved. The resolution can be done either by changing data on the + subscriber so that it doesn't conflict with incoming change or by skipping + the whole transaction. The logical replication worker skips all data 4) xid with -2 is currently allowed, may be it is ok. If it is fine we can remove it from the fail section. +-- fail +ALTER SUBSCRIPTION regress_testsub SKIP (xid = 1.1); +ERROR: invalid transaction id: 1.1 +ALTER SUBSCRIPTION regress_testsub SKIP (xid = -2); +ALTER SUBSCRIPTION regress_testsub SKIP (xid = 0); +ERROR: invalid transaction id: 0 +ALTER SUBSCRIPTION regress_testsub SKIP (xid = 1); Regards, Vignesh
pgsql-hackers by date: