Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ri5TX-00F3hG-He for pgsql-hackers@arkaria.postgresql.org; Thu, 07 Mar 2024 04:35:24 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1ri5TV-000SV4-Ja for pgsql-hackers@arkaria.postgresql.org; Thu, 07 Mar 2024 04:35:22 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ri5TU-000SUw-Lc for pgsql-hackers@lists.postgresql.org; Thu, 07 Mar 2024 04:35:21 +0000 Received: from wfhigh2-smtp.messagingengine.com ([64.147.123.153]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1ri5TQ-003CT7-4I for pgsql-hackers@lists.postgresql.org; Thu, 07 Mar 2024 04:35:20 +0000 Received: from compute2.internal (compute2.nyi.internal [10.202.2.46]) by mailfhigh.west.internal (Postfix) with ESMTP id 1C83C1800091; Wed, 6 Mar 2024 23:35:13 -0500 (EST) Received: from imap49 ([10.202.2.99]) by compute2.internal (MEProxy); Wed, 06 Mar 2024 23:35:14 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=eulerto.com; h= cc:cc:content-type:content-type:date:date:from:from:in-reply-to :in-reply-to:message-id:mime-version:references:reply-to:subject :subject:to:to; s=fm2; t=1709786112; x=1709872512; bh=UaVztxh1nv JCgYGJ6D0KjsI2Y21l1yNhfkkg2AO7WRM=; b=KkRnr+Mca+2klpZsZUt3Fj8QSl +Ist5N7yrzimp0aTRo7FdB8TBAtlkA5S/ZVScSusv3UnB7+ibrEThdpQTJbVGPyy nGdn1eb/urK1NwBgR6bVu3CQP/krHO8Ogebe+uhq/+fUwVLSOqvr66gc38zX/uN/ p5BiuOOLQI0xAA2OPAdSlji2lQlVC8Arg2HDXXYH3gZ1BOp6g2iO8c+1Hmfs0s0N QTbPTESAw+mEwApYpDGxR4f0xCxtoxBbUX+2cWDCXJwz5yBEOEM5VzHF1In+Idyy QtjorPxZVX/wOedkhSq6bvb+/Kn+V76n1S5YYcqkmkOnbdM2N3+fLiA2rBog== DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d= messagingengine.com; h=cc:cc:content-type:content-type:date:date :feedback-id:feedback-id:from:from:in-reply-to:in-reply-to :message-id:mime-version:references:reply-to:subject:subject:to :to:x-me-proxy:x-me-proxy:x-me-sender:x-me-sender:x-sasl-enc; s= fm1; t=1709786112; x=1709872512; bh=UaVztxh1nvJCgYGJ6D0KjsI2Y21l 1yNhfkkg2AO7WRM=; b=nNXR7v9DaRX9ba0vYeYKJEc+LA7MpooeC7AOFMnKx3o5 ISnod5vBDHUzlbKNd7bR2B8i//AsOGDbQDoakJL6DQvsRX7LYMDlizhvi4mLgyw/ 0KBgawF2DFWHr78mV2qK66o49ZDGkJAQLe1b+fXNKcaZJKPq54t1A1E4tNcFzzhq K3KwSjyWgqvdmOqjbOeMktR6bQaPEo0a/M1PEPyWzTHdQ7xQ3AbwoH5Myo61b9i5 99dvT0RjRV+GAj/AcoQ7uM7fC8kq9Wdbb8SBHt0/Rk7YQSlTV8EmOwBLh2Rh2nwj nJhtHRuO7EvtL8I6HqcYpI31q+rLwjWS2+VB8uwNEg== X-ME-Sender: X-ME-Proxy-Cause: gggruggvucftvghtrhhoucdtuddrgedvledriedvgdejvdcutefuodetggdotefrodftvf curfhrohhfihhlvgemucfhrghsthforghilhdpqfgfvfdpuffrtefokffrpgfnqfghnecu uegrihhlohhuthemuceftddtnecusecvtfgvtghiphhivghnthhsucdlqddutddtmdenuc fjughrpefofgggkfgjfhffhffvvefutgesmhdtreerreertdenucfhrhhomhepfdfguhhl vghrucfvrghvvghirhgrfdcuoegvuhhlvghrsegvuhhlvghrthhordgtohhmqeenucggtf frrghtthgvrhhnpeeiheeuledvvdejteejieduteefgefhgfeftdeggfekhefgueetieek veduieetgfenucffohhmrghinhepphhoshhtghhrvghsqhhlrdhorhhgpdgvnhhtvghrph hrihhsvggusgdrtghomhenucevlhhushhtvghrufhiiigvpedtnecurfgrrhgrmhepmhgr ihhlfhhrohhmpegvuhhlvghrsegvuhhlvghrthhordgtohhm X-ME-Proxy: Feedback-ID: i0c21471d:Fastmail Received: by mailuser.nyi.internal (Postfix, from userid 501) id 198A515A0092; Wed, 6 Mar 2024 23:35:12 -0500 (EST) X-Mailer: MessagingEngine.com Webmail Interface User-Agent: Cyrus-JMAP/3.11.0-alpha0-251-g8332da0bf6-fm-20240305.001-g8332da0b MIME-Version: 1.0 Message-Id: <40595e73-c7e1-463a-b8be-49792e870007@app.fastmail.com> In-Reply-To: References: <9a9c7e65-c47b-4400-a63e-ac6169c0860e@app.fastmail.com> <8d8d9960-8130-4216-b0e4-adf36b8b1c43@app.fastmail.com> <370673e8-e2da-4249-8f07-cb67e9d9c20e@app.fastmail.com> <34075bd4-c85d-4654-a782-0cd6713b2c89@app.fastmail.com> <2edde173-5ff9-45fd-b881-cd04eb13049f@app.fastmail.com> <2231a04b-f2d4-4a4e-b5cd-56be8b002427@app.fastmail.com> Date: Thu, 07 Mar 2024 01:34:38 -0300 From: "Euler Taveira" To: "kuroda.hayato@fujitsu.com" Cc: "pgsql-hackers@lists.postgresql.org" , "Michael Paquier" , "Peter Eisentraut" , "Andres Freund" , "Ashutosh Bapat" , "Amit Kapila" , "Shlok Kyal" , =?UTF-8?Q?Fabr=C3=ADzio_de_Royes_Mello?= , "vignesh C" Subject: Re: speed up a logical replica setup Content-Type: multipart/mixed; boundary=8d0813ba951140d29cbfc405165833ae List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --8d0813ba951140d29cbfc405165833ae Content-Type: multipart/alternative; boundary=b4b157d13d694ca3abd9b0c04294273d --b4b157d13d694ca3abd9b0c04294273d Content-Type: text/plain On Wed, Mar 6, 2024, at 7:02 AM, Hayato Kuroda (Fujitsu) wrote: > Thanks for updating the patch! Thanks for the feedback. I'm attaching v26 that addresses most of your comments and some issues pointed by Vignesh [1]. > >* I also removed the check for standby is running. If the standby was stopped a > > long time ago, it will take some time to reach the start point. > >* Dry run mode has to start / stop the service to work correctly. Is it an > > issue? > > One concern (see below comment) is that -l option would not be passed even if > the standby has been logging before running pg_createsubscriber. Also, some settings > passed by pg_ctl start -o .... would not be restored. That's a good point. We should state in the documentation that GUCs specified in the command-line options are ignored during the execution. > >However, I decided to include --retain option, I'm thinking about to remove it. > >If the logging is enabled, the information during the pg_createsubscriber will > >be available. The client log can be redirected to a file for future inspection. > > Just to confirm - you meant to say like below, right? > * the client output would be redirected, and > * -r option would be removed. Yes. The logging_collector is usually enabled or the syslog is collecting the log entries. Under reflection, another log directory to store entries for a short period of time doesn't seem a good idea. It divides the information and it also costs development time. The questions that make me think about it were: Should I remove the pg_createsubscriber_output.d directory if it runs successfully? What if there is an old file there? Is it another directory to exclude while taking a backup? I also don't like the long directory name. > Here are my initial comments for v25-0001. I read new doc and looks very good. > I may do reviewing more about v25-0001, but feel free to revise. > > 01. cleanup_objects_atexit > ``` > PGconn *conn; > int i; > ``` > The declaration *conn can be in the for-loop. Also, the declaration of the indicator can be in the bracket. Changed. > 02. cleanup_objects_atexit > ``` > > /* > * If a connection could not be established, inform the user > * that some objects were left on primary and should be > * removed before trying again. > */ > if (dbinfo[i].made_publication) > { > pg_log_warning("There might be a publication \"%s\" in database \"%s\" on primary", > dbinfo[i].pubname, dbinfo[i].dbname); > pg_log_warning_hint("Consider dropping this publication before trying again."); > } > if (dbinfo[i].made_replslot) > { > pg_log_warning("There might be a replication slot \"%s\" in database \"%s\" on primary", > dbinfo[i].subname, dbinfo[i].dbname); > pg_log_warning_hint("Drop this replication slot soon to avoid retention of WAL files."); > } > ``` > > Not sure which is better, but we may able to the list to the concrete file like pg_upgrade. > (I thought it had been already discussed, but could not find from the archive. Sorry if it was a duplicated comment) Do you mean the replication slot file? I think the replication slot and the server (primary) is sufficient for checking and fixing if required. > 03. main > ``` > while ((c = getopt_long(argc, argv, "d:D:nP:rS:t:v", > long_options, &option_index)) != -1) > ``` > > Missing update for __shortopts. Fixed. > 04. main > ``` > case 'D': > opt.subscriber_dir = pg_strdup(optarg); > canonicalize_path(opt.subscriber_dir); > break; > ... > case 'P': > opt.pub_conninfo_str = pg_strdup(optarg); > break; > ... > case 's': > opt.socket_dir = pg_strdup(optarg); > break; > ... > case 'U': > opt.sub_username = pg_strdup(optarg); > break; > ``` > > Should we consider the case these options would be specified twice? > I.e., should we call pg_free() before the substitution? It isn't a concern for the other client tools. I think the reason is that it doesn't continue to leak memory during the execution. I wouldn't bother with it. > 05. main > > Missing canonicalize_path() to the socket_dir. Fixed. > 06. main > ``` > /* > * If socket directory is not provided, use the current directory. > */ > ``` > > One-line comment can be used. Period can be also removed at that time. Fixed. > 07. main > ``` > /* > * > * If subscriber username is not provided, check if the environment > * variable sets it. If not, obtain the operating system name of the user > * running it. > */ > ``` > Unnecessary blank. Fixed. > 08. main > ``` > char *errstr = NULL; > ``` > > This declaration can be at else-part. Fixed. > 09. main. > > Also, as the first place, do we have to get username if not specified? > I felt libpq can handle the case if we skip passing the info. Are you suggesting that the username should be optional? > 10. main > ``` > appendPQExpBuffer(sub_conninfo_str, "host=%s port=%u user=%s fallback_application_name=%s", > opt.socket_dir, opt.sub_port, opt.sub_username, progname); > sub_base_conninfo = get_base_conninfo(sub_conninfo_str->data, NULL); > ``` > > Is it really needed to call get_base_conninfo? I think no need to define > sub_base_conninfo. No. Good catch. I removed it. > 11. main > > ``` > /* > * In dry run mode, the server is restarted with the provided command-line > * options so validation can be applied in the target server. In order to > * preserve the initial state of the server (running), start it without > * the command-line options. > */ > if (dry_run) > start_standby_server(&opt, pg_ctl_path, NULL, false); > ``` > > I think initial state of the server may be stopped. Now both conditions are allowed. > And I think it is not good not to specify the logfile. Indeed, it is. I don't consider the following test as the first step because it is conditional. The stop server is a precondition to start. The first step is the start standby server so the initial state is stopped. /* * If the standby server is running, stop it. Some parameters (that can * only be set at server start) are informed by command-line options. */ if (stat(pidfile, &statbuf) == 0) { pg_log_info("standby is up and running"); pg_log_info("stopping the server to start the transformation steps"); stop_standby_server(pg_ctl_path, opt.subscriber_dir); } /* * Start a short-lived standby server with temporary parameters (provided * by command-line options). The goal is to avoid connections during the * transformation steps. */ pg_log_info("starting the standby with command-line options"); start_standby_server(&opt, pg_ctl_path, server_start_log, true); > 12. others > > As Peter E pointed out [1], the main function is still huge. It has more than 400 lines. > I think all functions should have less than 100 line to keep the readability. The previous versions moved a lot of code into its own function to improve readability. Since you mentioned it again, it did some refactor to move some code outside the main function. I created 2 new functions: setup_recovery (groups instructions in preparation for recovery) and drop_primary_replication_slot (remove the primary replication slot if it exists). At this point, the main steps are in their own functions making it easier to understand the code IMO. /* Get the absolute path of pg_ctl and pg_resetwal on the subscriber */ pg_ctl_path = get_exec_path(argv[0], "pg_ctl"); pg_resetwal_path = get_exec_path(argv[0], "pg_resetwal"); ... pg_log_info("Done!"); The code snippet above has ~ 120 lines and the majority of the lines are comments. > I considered separation idea like below. Note that this may require to change > orderings. How do you think? > > * add parse_command_options() which accepts user options and verifies them > * add verification_phase() or something which checks system identifier and calls check_XXX > * add catchup_phase() or something which creates a temporary slot, writes recovery parameters, > and wait until the end of recovery > * add cleanup_phase() or something which removes primary_slot and modifies the > system identifier > * stop/start server can be combined into one wrapper. IMO generic steps are more difficult to understand. I tend to avoid it. However, as I said above, I moved some code into its own function. We could probably consider grouping the check for required/optional arguments into its own function. Other than that, it wouldn't reduce the main() size and increase the readability. > Attached txt file is proofs the concept. > > 13. others > > PQresultStatus(res) is called 17 times in this source code, it may be redundant. > I think we can introduce a function like executeQueryOrDie() and gather in one place. That's a good goal. > 14. others > > I found that pg_createsubscriber does not refer functions declared in other files. > Is there a possibility to use them, e.g., streamutils.h? Which functions? IIRC we discussed it in the beginning of this thread but I didn't find low-hanging fruits to use in this code. > 15. others > > While reading the old discussions [2], Amit suggested to keep the comment and avoid > creating a temporary slot. You said "Got it" but temp slot still exists. > Is there any reason? Can you clarify your opinion? I decided to refactor the code and does what Amit Kapila suggested: use the last replication slot LSN as the replication start point. I keep it in a separate patch (v26-0002) to make it easier to review. I'm planning to incorporate it if nobody objects. > 16. others > > While reading [2] and [3], I was confused the decision. You and Amit discussed > the combination with pg_createsubscriber and slot sync and how should handle > slots on the physical standby. You seemed to agree to remove such a slot, and > Amit also suggested to raise an ERROR. However, you said in [8] that such > handlings is not mandatory so should raise an WARNING in dry_run. I was quite confused. > Am I missing something? I didn't address this item in this patch. As you pointed out, pg_resetwal does nothing if replication slots exist. That's not an excuse for doing nothing here. I agree that we should check this case and provide a suitable error message. If you have a complex replication scenario, users won't be happy with this restriction. We can always improve the UI (dropping replication slots during the execution if an option is provided, for example). > 17. others > > Per discussion around [4], we might have to consider an if the some options like > data_directory and config_file was initially specified for standby server. Another > easy approach is to allow users to specify options like -o in pg_upgrade [5], > which is similar to your idea. Thought? I didn't address this item in this patch. I have a half baked patch for it. The proposal is exactly to allow appending config_file option into -o. pg_ctl start -o "-c config_file=/etc/postgresql/17/postgresql.conf" ... > > 18. others > > How do you handle the reported failure [6]? It is a PEBCAK. I don't see an easy way to detect the scenario 1. In the current mode, we are susceptible to this human failure. The base backup support, won't allow it. Regarding scenario 2, the referred error is the way to capture this wrong command line. Do you expect a different message? > 19. main > ``` > char *pub_base_conninfo = NULL; > char *sub_base_conninfo = NULL; > char *dbname_conninfo = NULL; > ``` > > No need to initialize pub_base_conninfo and sub_base_conninfo. > These variables would not be free'd. Changed. > 20. others > > IIUC, slot creations would not be finished if there are prepared transactions. > Should we detect it on the verification phase and raise an ERROR? Maybe. If we decide to do it, we should also check all cases not just prepared transactions. The other option is to add a sentence into the documentation. > 21. others > > As I said in [7], the catch up would not be finished if long recovery_min_apply_delay > is used. Should we overwrite during the catch up? No. If the time-delayed logical replica [2] was available, I would say that we could use the apply delay for the logical replica. The user can expect that the replica will continue to have the configured apply delay but that's not the case if it silently ignore it. I'm not sure if an error is appropriate in this case because it requires an extra step. Another option is to print a message saying there is an apply delay. In dry run mode, user can detect this case and make a decision. Does it seem reasonable? > 22. pg_createsubscriber.sgml > ``` > > Check > Write recovery parameters into the target data... > ``` > > Not sure, but "Check" seems not needed. It was a typo. Fixed. [1] https://www.postgresql.org/message-id/CALDaNm215LodC48p7LmfAsuCq9m33CWtcag2%2B9DiyNfWGuL_KQ%40mail.gmail.com [2] https://www.postgresql.org/message-id/f026292b-c9ee-472e-beaa-d32c5c3a2ced%40www.fastmail.com -- Euler Taveira EDB https://www.enterprisedb.com/ --b4b157d13d694ca3abd9b0c04294273d Content-Type: text/html Content-Transfer-Encoding: quoted-printable
On Wed, Ma= r 6, 2024, at 7:02 AM, Hayato Kuroda (Fujitsu) wrote:
Thanks for updating the patch= !

Thanks for the feedback. I'm= attaching v26 that addresses most of your comments
and so= me issues pointed by Vignesh [1].

>* I also removed the check for= standby is running. If the standby was stopped a
>&nbs= p; long time ago, it will take some time to reach the start point.
>* Dry run mode has to start / stop the service to work corr= ectly. Is it an
>  issue?

=
One concern (see below comment) is that -l option would not be pass= ed even if
the standby has been logging before running pg_= createsubscriber. Also, some settings
passed by pg_ctl sta= rt -o .... would not be restored.

<= div>That's a good point. We should state in the documentation that GUCs = specified in
the command-line options are ignored during t= he execution.

>However, I decided to include --retain option, I'm= thinking about to remove it.
>If the logging is enable= d, the information during the pg_createsubscriber will
>= ;be available. The client log can be redirected to a file for future ins= pection.

Just to confirm - you meant to say= like below, right? 
* the client output would be red= irected, and
* -r option would be removed.

Yes. The logging_collector is usually enabled= or the syslog is collecting the
log entries. Under reflec= tion, another log directory to store entries for a
short p= eriod of time doesn't seem a good idea. It divides the information and
it also costs development time. The questions that make me = think about it were:
Should I remove the pg_createsubscrib= er_output.d directory if it runs
successfully? What if the= re is an old file there? Is it another directory to
exclud= e while taking a backup? I also don't like the long directory name.
<= /div>

= Here are my initial comments for v25-0001. I read new doc and looks very= good.
I may do reviewing more about v25-0001, but feel fr= ee to revise.

01. cleanup_objects_atexit
```
PGconn    *conn;
i= nt i;
```
The declaration *conn can be in = the for-loop. Also, the declaration of the indicator can be in the brack= et.

Changed.
02. cleanup_o= bjects_atexit
```

/*
* If a connection could not be established, inform the user
* that some objects were left on primary and should be
=
* removed before trying again.
*/
if (d= binfo[i].made_publication)
{
pg_log_warning(= "There might be a publication \"%s\" in database \"%s\" on primary",
=
   dbinfo[i].pubname, dbinfo[i].dbname);
<= div>pg_log_warning_hint("Consider dropping this publication before tryin= g again.");
}
if (dbinfo[i].made_replslot)
{
pg_log_warning("There might be a replicatio= n slot \"%s\" in database \"%s\" on primary",
  = dbinfo[i].subname, dbinfo[i].dbname);
pg_log_warning_hint= ("Drop this replication slot soon to avoid retention of WAL files.");
}
```

Not sure wh= ich is better, but we may able to the list to the concrete file like pg_= upgrade.
(I thought it had been already discussed, but cou= ld not find from the archive. Sorry if it was a duplicated comment)
<= /div>

Do you mean the replication slot f= ile? I think the replication slot and the
server (primary)= is sufficient for checking and fixing if required.

03. main
```
while ((c =3D getopt_long(argc, argv, "d:D:nP:r= S:t:v",
long_options, &option_index)) !=3D -1)
```

Missing update for __shortopts.<= br>

Fixed.

04. main
<= div>```
case 'D':
opt.subscriber_dir =3D pg_= strdup(optarg);
canonicalize_path(opt.subscriber_dir);
=
break;
...
case 'P':
opt.pub_conninfo_str =3D pg_strdup(optarg);
break;
...
case 's':
opt.socket_dir =3D pg= _strdup(optarg);
break;
...
ca= se 'U':
opt.sub_username =3D pg_strdup(optarg);
<= div>break;
```

Should we cons= ider the case these options would be specified twice?
I.e.= , should we call pg_free() before the substitution? 

It isn't a concern for the other client tool= s. I think the reason is that it
doesn't continue to leak = memory during the execution. I wouldn't bother with it.
05. main
=

Missing canonicalize_path() to the socket_dir.=

Fixed.

06. main
=
```
/*
* If socket directory is not pro= vided, use the current directory.
*/
```
=

One-line comment can be used. Period can be al= so removed at that time.

Fixed= .

07. main
```
/*
*
* If subscriber username is not provided, check if the environme= nt
* variable sets it. If not, obtain the operating system= name of the user
* running it.
*/
=
```
Unnecessary blank.
Fixed.

08. main
```
char  = ;  *errstr =3D NULL;
```
 
This declaration can be at else-part.
=
Fixed.

09. main.

Also, a= s the first place, do we have to get username if not specified?
I felt libpq can handle the case if we skip passing the info.
<= /div>

Are you suggesting that the userna= me should be optional?

10. main
```
appe= ndPQExpBuffer(sub_conninfo_str, "host=3D%s port=3D%u user=3D%s fallback_= application_name=3D%s",
  opt.socket_dir, opt.sub_por= t, opt.sub_username, progname);
sub_base_conninfo =3D get_= base_conninfo(sub_conninfo_str->data, NULL);
```

Is it really needed to call get_base_conninfo? I = think no need to define
sub_base_conninfo.

No. Good catch. I removed it.
<= br>
11. main

```
/*
* In dry r= un mode, the server is restarted with the provided command-line
* options so validation can be applied in the target server. In or= der to
* preserve the initial state of the server (running= ), start it without
* the command-line options.
<= div>*/
if (dry_run)
start_standby_server(&am= p;opt, pg_ctl_path, NULL, false);
```

I think initial state of the server may be stopped. Now both co= nditions are allowed.
And I think it is not good not to sp= ecify the logfile.

Indeed, it = is. I don't consider the following test as the first step because it
=
is conditional. The stop server is a precondition to start. T= he first step is
the start standby server so the initial s= tate is stopped.

    /* = ;  
     * If the standby se= rver is running, stop it. Some parameters (that can
 =     * only be set at server start) are informed by comman= d-line options.
     */
=     if (stat(pidfile, &statbuf) =3D=3D 0)
    {    

=
        pg_log_info("standby is = up and running");
      &nbs= p; pg_log_info("stopping the server to start the transformation steps");=
        stop_standby_s= erver(pg_ctl_path, opt.subscriber_dir);
   = }    

  &nbs= p; /*   
     * Start a= short-lived standby server with temporary parameters (provided
     * by command-line options). The goal is t= o avoid connections during the
     * = transformation steps.
     */
    pg_log_info("starting the standby with command-= line options");
    start_standby_server(&a= mp;opt, pg_ctl_path, server_start_log, true);


12. oth= ers

As Peter E pointed out [1], the main fu= nction is still huge. It has more than 400 lines.
I think = all functions should have less than 100 line to keep the readability.

The previous versions moved a lo= t of code into its own function to improve
readability. Si= nce you mentioned it again, it did some refactor to move some
<= div>code outside the main function. I created 2 new functions: setup_rec= overy
(groups instructions in preparation for recovery) an= d
drop_primary_replication_slot (remove the primary replic= ation slot if it
exists). At this point, the main steps ar= e in their own functions making it
easier to understand th= e code IMO.

    /* Get the a= bsolute path of pg_ctl and pg_resetwal on the subscriber */
    pg_ctl_path =3D get_exec_path(argv[0], "pg_ctl");
    pg_resetwal_path =3D get_exec_path(argv[= 0], "pg_resetwal");
    ...
 =    pg_log_info("Done!");

The code= snippet above has ~ 120 lines and the majority of the lines are
comments.

I considered separation idea like below. Note that = this may require to change
orderings. How do you think?

* add parse_command_options() which accepts u= ser options and verifies them
* add verification_phase() o= r something which checks system identifier and calls check_XXX
=
* add catchup_phase() or something which creates a temporary slot, = writes recovery parameters,
  and wait until the end = of recovery
* add cleanup_phase() or something which remov= es primary_slot and modifies the
  system identifier<= br>
* stop/start server can be combined into one wrapper.
<= /div>

IMO generic steps are more difficu= lt to understand. I tend to avoid it. However,
as I said a= bove, I moved some code into its own function. We could probably
consider grouping the check for required/optional arguments into = its own
function. Other than that, it wouldn't reduce the = main() size and increase the 
readability.
<= div>
Attach= ed txt file is proofs the concept.

13. othe= rs

PQresultStatus(res) is called 17 times i= n this source code, it may be redundant.
I think we can in= troduce a function like executeQueryOrDie() and gather in one place.
=

That's a good goal.

14. other= s

I found that pg_createsubscriber does not= refer functions declared in other files.
Is there a possi= bility to use them, e.g., streamutils.h?

=
Which functions? IIRC we discussed it in the beginning of thi= s thread but I
didn't find low-hanging fruits to use in th= is code.

15. others 

While reading= the old discussions [2], Amit suggested to keep the comment and avoid
creating a temporary slot. You said "Got it" but temp slot = still exists.
Is there any reason? Can you clarify your op= inion?

I decided to refactor t= he code and does what Amit Kapila suggested: use the last
= replication slot LSN as the replication start point. I keep it in a sepa= rate
patch (v26-0002) to make it easier to review. I'm pla= nning to incorporate it if
nobody objects.
<= br>
16. others<= br>

While reading [2] and [3], I was confused t= he decision. You and Amit discussed
the combination with p= g_createsubscriber and slot sync and how should handle
slo= ts on the physical standby. You seemed to agree to remove such a slot, a= nd
Amit also suggested to raise an ERROR. However, you sai= d in [8] that such
handlings is not mandatory so should ra= ise an WARNING in dry_run. I was quite confused.
Am I miss= ing something?

I didn't addres= s this item in this patch. As you pointed out, pg_resetwal does
nothing if replication slots exist. That's not an excuse for doing= nothing here.
I agree that we should check this case and = provide a suitable error message. If
you have a complex re= plication scenario, users won't be happy with this
restric= tion. We can always improve the UI (dropping replication slots during th= e
execution if an option is provided, for example).

17= . others

Per discussion around [4], we migh= t have to consider an if the some options like
data_direct= ory and config_file was initially specified for standby server. Another<= br>
easy approach is to allow users to specify options like -o= in pg_upgrade [5],
which is similar to your idea. Thought= ?

I didn't address this item i= n this patch. I have a half baked patch for it. The
propos= al is exactly to allow appending config_file option into -o.

pg_ctl start -o "-c config_file=3D/etc/postgresql/17/p= ostgresql.conf" ...


18. others

How do you handle the reported failure [6]?

It is a PEBCAK. I don't see an easy way to detect t= he scenario 1. In the current
mode, we are susceptible to = this human failure. The base backup support, won't
allow i= t. Regarding scenario 2, the referred error is the way to capture this
wrong command line. Do you expect a different message?
<= /div>

= 19. main
```
char    *pub_base_con= ninfo =3D NULL;
char    *sub_base_conninfo =3D N= ULL;
char    *dbname_conninfo =3D NULL;
```

No need to initialize pub_base_co= nninfo and sub_base_conninfo.
These variables would not be= free'd.

Changed.
20. others

IIUC, slot creations would not be finished i= f there are prepared transactions.
Should we detect it on = the verification phase and raise an ERROR?
Maybe. If we decide to do it, we should also check all case= s not just prepared
transactions. The other option is to a= dd a sentence into the documentation.

21. others

<= /div>
As I said in [7], the catch up would not be finished if long r= ecovery_min_apply_delay
is used. Should we overwrite durin= g the catch up?

No. If the tim= e-delayed logical replica [2] was available, I would say that we
could use the apply delay for the logical replica. The user can e= xpect that the
replica will continue to have the configure= d apply delay but that's not the case
if it silently ignor= e it. I'm not sure if an error is appropriate in this case 
because it requires an extra step. Another option is to print a m= essage saying
there is an apply delay. In dry run mode, us= er can detect this case and make a
decision. Does it seem = reasonable?

22. pg_createsubscriber.sgml
```
=
    <para>
   &nb= sp; Check
     Write recovery paramete= rs into the target data...
```

Not sure, but "Check" seems not needed.
It was a typo. Fixed.


[1] https://www.= postgresql.org/message-id/CALDaNm215LodC48p7LmfAsuCq9m33CWtcag2%2B9DiyNf= WGuL_KQ%40mail.gmail.com

--
Euler Taveira

--b4b157d13d694ca3abd9b0c04294273d-- --8d0813ba951140d29cbfc405165833ae Content-Disposition: attachment; filename*0="v26-0001-pg_createsubscriber-creates-a-new-logical-replic.pat"; filename*1="ch.gz" Content-Type: application/gzip; name="=?UTF-8?Q?v26-0001-pg=5Fcreatesubscriber-creates-a-new-logical-replic.pa?= =?UTF-8?Q?tch.gz?=" Content-Transfer-Encoding: BASE64 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 AA== --8d0813ba951140d29cbfc405165833ae Content-Disposition: attachment; filename*0="v26-0002-Use-latest-replication-slot-position-as-replicat.pat"; filename*1="ch.gz" Content-Type: application/gzip; name="=?UTF-8?Q?v26-0002-Use-latest-replication-slot-position-as-replicat.patc?= =?UTF-8?Q?h.gz?=" Content-Transfer-Encoding: BASE64 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 --8d0813ba951140d29cbfc405165833ae Content-Disposition: attachment; filename*0="v26-0003-port-replace-int-with-string.patch.gz" Content-Type: application/gzip; name="=?UTF-8?Q?v26-0003-port-replace-int-with-string.patch.gz?=" Content-Transfer-Encoding: BASE64 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 --8d0813ba951140d29cbfc405165833ae--