On Tue, Jun 14, 2022 at 9:07 AM wangw.f...@fujitsu.com <wangw.f...@fujitsu.com> wrote: > > > Attach the new patches. > Only changed patches 0001, 0004 and added new separate patch 0005. >
Few questions/comments on 0001 =========================== 1. In the commit message, I see: "We also need to allow stream_stop to complete by the apply background worker to avoid deadlocks because T-1's current stream of changes can update rows in conflicting order with T-2's next stream of changes." Thinking about this, won't the T-1 and T-2 deadlock on the publisher node as well if the above statement is true? 2. + <para> + The apply background workers are taken from the pool defined by + <varname>max_logical_replication_workers</varname>. + </para> + <para> + The default value is 3. This parameter can only be set in the + <filename>postgresql.conf</filename> file or on the server command + line. + </para> Is there a reason to choose this number as 3? Why not 2 similar to max_sync_workers_per_subscription? 3. + + <para> + Setting streaming mode to <literal>apply</literal> could export invalid LSN + as finish LSN of failed transaction. Changing the streaming mode and making + the same conflict writes the finish LSN of the failed transaction in the + server log if required. + </para> How will the user identify that this is an invalid LSN value and she shouldn't use it to SKIP the transaction? Can we change the second sentence to: "User should change the streaming mode to 'on' if they would instead wish to see the finish LSN on error. Users can use finish LSN to SKIP applying the transaction." I think we can give reference to docs where the SKIP feature is explained. 4. + * This file contains routines that are intended to support setting up, using, + * and tearing down a ApplyBgworkerState. + * Refer to the comments in file header of logical/worker.c to see more + * informations about apply background worker. Typo. /informations/information. Consider having an empty line between the above two lines. 5. +ApplyBgworkerState * +apply_bgworker_find_or_start(TransactionId xid, bool start) { ... ... + if (!TransactionIdIsValid(xid)) + return NULL; + + /* + * We don't start new background worker if we are not in streaming apply + * mode. + */ + if (MySubscription->stream != SUBSTREAM_APPLY) + return NULL; + + /* + * We don't start new background worker if user has set skiplsn as it's + * possible that user want to skip the streaming transaction. For + * streaming transaction, we need to spill the transaction to disk so that + * we can get the last LSN of the transaction to judge whether to skip + * before starting to apply the change. + */ + if (start && !XLogRecPtrIsInvalid(MySubscription->skiplsn)) + return NULL; + + /* + * For streaming transactions that are being applied in apply background + * worker, we cannot decide whether to apply the change for a relation + * that is not in the READY state (see should_apply_changes_for_rel) as we + * won't know remote_final_lsn by that time. So, we don't start new apply + * background worker in this case. + */ + if (start && !AllTablesyncsReady()) + return NULL; ... ... } Can we move some of these starting checks to a separate function like canstartapplybgworker()? -- With Regards, Amit Kapila.