Обсуждение: Supply restore_command to pg_rewind via CLI argument

Поиск
Список
Период
Сортировка

Supply restore_command to pg_rewind via CLI argument

От
Andrey Borodin
Дата:
Hi hackers!

Starting from v13 pg_rewind can use restore_command if it lacks necessary WAL segments. And this is awesome for HA
clusterswith many nodes! Thanks to everyone who worked on the feature! 

Here's some feedback on how to make things even better.

If we run 'pg_rewind --restore-target-wal' there must be restore_command in config of target installation. But if the
configis not within $PGDATA\postgresql.conf pg_rewind cannot use it. 
If we run postmaster with `-c config_file=/etc/postgresql/10/data/postgresql.conf`, we simply cannot use the feature.
Wesolved the problem by putting config into PGDATA only during pg_rewind, but this does not seem like a very robust
solution.

Maybe we could add "-C, --target-restore-command=COMMAND  target WAL restore_command\n" as was proposed within earlier
versionsof the patch[0]? Or instruct pg_rewind to pass config to 'postgres -C restore_command' run? 

From my POV adding --target-restore-command is simplest way, I can extract corresponding portions from original patch.

Thanks!

Best regards, Andrey Borodin.

[0]
https://www.postgresql.org/message-id/flat/CAPpHfduUqKLr2CRpcpHcv1qjaz%2B-%2Bi9bOL2AOvdWSr954ti8Xw%40mail.gmail.com#1d4b372b5aa26f93af9ed1d5dd0693cd


Re: Supply restore_command to pg_rewind via CLI argument

От
Alexey Kondratov
Дата:
Hi,

On Fri, Jun 18, 2021 at 5:42 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
>
> If we run 'pg_rewind --restore-target-wal' there must be restore_command in config of target installation. But if the
configis not within $PGDATA\postgresql.conf pg_rewind cannot use it.
 
> If we run postmaster with `-c config_file=/etc/postgresql/10/data/postgresql.conf`, we simply cannot use the feature.
Wesolved the problem by putting config into PGDATA only during pg_rewind, but this does not seem like a very robust
solution.
>

Yeah, Michael was against it, while we had no good arguments, so
Alexander removed it, IIRC. This example sounds reasonable to me. I
also recall some complaints from PostgresPro support folks, that it is
sad to not have a cli option to pass restore_command. However, I just
thought about another recent feature --- ensure clean shutdown, which
is turned on by default. So you usually run Postgres with one config,
but pg_rewind may start it with another, although in single-user mode.
Is it fine for you?

>
> Maybe we could add "-C, --target-restore-command=COMMAND  target WAL restore_command\n" as was proposed within
earlierversions of the patch[0]? Or instruct pg_rewind to pass config to 'postgres -C restore_command' run?
 

Hm, adding --target-restore-command is the simplest way, sure, but
forwarding something like '-c config_file=...' to postgres sounds
interesting too. Could it have any use case beside providing a
restore_command? I cannot imagine anything right now, but if any
exist, then it could be a more universal approach.

>
> From my POV adding --target-restore-command is simplest way, I can extract corresponding portions from original
patch.
>

I will have a look, maybe I even already have this patch separately. I
remember that we were considering adding this option to PostgresPro,
when we did a backport of this feature.


--
Alexey Kondratov



Re: Supply restore_command to pg_rewind via CLI argument

От
Alexey Kondratov
Дата:
On Fri, Jun 18, 2021 at 10:06 PM Alexey Kondratov
<kondratov.aleksey@gmail.com> wrote:
> On Fri, Jun 18, 2021 at 5:42 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
> >
> > If we run 'pg_rewind --restore-target-wal' there must be restore_command in config of target installation. But if
theconfig is not within $PGDATA\postgresql.conf pg_rewind cannot use it.
 
> > If we run postmaster with `-c config_file=/etc/postgresql/10/data/postgresql.conf`, we simply cannot use the
feature.We solved the problem by putting config into PGDATA only during pg_rewind, but this does not seem like a very
robustsolution.
 
> >
>
> Yeah, Michael was against it, while we had no good arguments, so
> Alexander removed it, IIRC. This example sounds reasonable to me. I
> also recall some complaints from PostgresPro support folks, that it is
> sad to not have a cli option to pass restore_command. However, I just
> thought about another recent feature --- ensure clean shutdown, which
> is turned on by default. So you usually run Postgres with one config,
> but pg_rewind may start it with another, although in single-user mode.
> Is it fine for you?
>
> >
> > Maybe we could add "-C, --target-restore-command=COMMAND  target WAL restore_command\n" as was proposed within
earlierversions of the patch[0]? Or instruct pg_rewind to pass config to 'postgres -C restore_command' run?
 
>
> Hm, adding --target-restore-command is the simplest way, sure, but
> forwarding something like '-c config_file=...' to postgres sounds
> interesting too. Could it have any use case beside providing a
> restore_command? I cannot imagine anything right now, but if any
> exist, then it could be a more universal approach.
>
> >
> > From my POV adding --target-restore-command is simplest way, I can extract corresponding portions from original
patch.
> >
>
> I will have a look, maybe I even already have this patch separately. I
> remember that we were considering adding this option to PostgresPro,
> when we did a backport of this feature.
>

Here it is. I have slightly adapted the previous patch to the recent
pg_rewind changes. In this version -C does not conflict with -c, it
just overrides it.


-- 
Alexey Kondratov

Вложения

Re: Supply restore_command to pg_rewind via CLI argument

От
Andrey Borodin
Дата:

> 29 июня 2021 г., в 19:34, Alexey Kondratov <kondratov.aleksey@gmail.com> написал(а):
>
> On Fri, Jun 18, 2021 at 10:06 PM Alexey Kondratov
> <kondratov.aleksey@gmail.com> wrote:
>> On Fri, Jun 18, 2021 at 5:42 PM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
>>>
>>> If we run 'pg_rewind --restore-target-wal' there must be restore_command in config of target installation. But if
theconfig is not within $PGDATA\postgresql.conf pg_rewind cannot use it. 
>>> If we run postmaster with `-c config_file=/etc/postgresql/10/data/postgresql.conf`, we simply cannot use the
feature.We solved the problem by putting config into PGDATA only during pg_rewind, but this does not seem like a very
robustsolution. 
>>>
>>
>> Yeah, Michael was against it, while we had no good arguments, so
>> Alexander removed it, IIRC. This example sounds reasonable to me. I
>> also recall some complaints from PostgresPro support folks, that it is
>> sad to not have a cli option to pass restore_command. However, I just
>> thought about another recent feature --- ensure clean shutdown, which
>> is turned on by default. So you usually run Postgres with one config,
>> but pg_rewind may start it with another, although in single-user mode.
>> Is it fine for you?
We rewind failovered node, so clean shutdown was not performed. But I do not see how it could help anyway.
To pass restore command we had to setup new config in PGDATA configured as standby, because either way we cannot set
restore_commandthere. 

>>> Maybe we could add "-C, --target-restore-command=COMMAND  target WAL restore_command\n" as was proposed within
earlierversions of the patch[0]? Or instruct pg_rewind to pass config to 'postgres -C restore_command' run? 
>>
>> Hm, adding --target-restore-command is the simplest way, sure, but
>> forwarding something like '-c config_file=...' to postgres sounds
>> interesting too. Could it have any use case beside providing a
>> restore_command? I cannot imagine anything right now, but if any
>> exist, then it could be a more universal approach.
I think --target-restore-command is the best solution right now.

>>> From my POV adding --target-restore-command is simplest way, I can extract corresponding portions from original
patch.
>>>
>>
>> I will have a look, maybe I even already have this patch separately. I
>> remember that we were considering adding this option to PostgresPro,
>> when we did a backport of this feature.
>>
>
> Here it is. I have slightly adapted the previous patch to the recent
> pg_rewind changes. In this version -C does not conflict with -c, it
> just overrides it.

Great, thanks!

There is a small bug
+    /*
+     * Take restore_command from the postgresql.conf only if it is not already
+     * provided as a command line option.
+     */
+    if (!restore_wal && restore_command == NULL)
         return;

I think we should use condition (!restore_wal || restore_command != NULL).

Besides this patch looks good and is ready for committer IMV.

Thanks!

Best regards, Andrey Borodin.


Re: Supply restore_command to pg_rewind via CLI argument

От
Alexey Kondratov
Дата:
On Fri, Aug 27, 2021 at 10:05 AM Andrey Borodin <x4mmm@yandex-team.ru> wrote:
> There is a small bug
> +       /*
> +        * Take restore_command from the postgresql.conf only if it is not already
> +        * provided as a command line option.
> +        */
> +       if (!restore_wal && restore_command == NULL)
>                 return;
>
> I think we should use condition (!restore_wal || restore_command != NULL).
>

Yes, you are right, thanks. Attached is a fixed version. Tests were
passing since PostgresNode->enable_restoring is adding restore_command
to the postgresql.conf anyway.

>
> Besides this patch looks good and is ready for committer IMV.
>


-- 
Alexey Kondratov

Вложения

Re: Supply restore_command to pg_rewind via CLI argument

От
Daniel Gustafsson
Дата:
>> Besides this patch looks good and is ready for committer IMV.

A variant of this patch was originally objected against by Michael, and as this
version is marked Ready for Committer I would like to hear his opinions on
whether the new evidence changes anything.

--
Daniel Gustafsson        https://vmware.com/




Re: Supply restore_command to pg_rewind via CLI argument

От
Andrey Borodin
Дата:

> 14 сент. 2021 г., в 18:41, Daniel Gustafsson <daniel@yesql.se> написал(а):
>
>>> Besides this patch looks good and is ready for committer IMV.
>
> A variant of this patch was originally objected against by Michael, and as this
> version is marked Ready for Committer I would like to hear his opinions on
> whether the new evidence changes anything.

I skimmed the thread for reasoning. --target-restore-command was rejected on the following grounds

> Do we actually need --target-restore-command at all? It seems to me
> that we have all we need with --restore-target-wal, and that's not
> really instinctive to pass down a command via another command..

Currently we know that --restore-target-wal is not enough if postgresql.conf does not reside within PGDATA.

Best regards, Andrey Borodin.


Re: Supply restore_command to pg_rewind via CLI argument

От
Daniel Gustafsson
Дата:
> On 14 Sep 2021, at 16:05, Andrey Borodin <x4mmm@yandex-team.ru> wrote:

>> Do we actually need --target-restore-command at all? It seems to me
>> that we have all we need with --restore-target-wal, and that's not
>> really instinctive to pass down a command via another command..
>
> Currently we know that --restore-target-wal is not enough if postgresql.conf does not reside within PGDATA.

That's a useful reason which wasn't brought up in the earlier thread, and may
tip the scales in favor.

The patch no longer applies, can you submit a rebased version please?

--
Daniel Gustafsson        https://vmware.com/




Re: Supply restore_command to pg_rewind via CLI argument

От
Andrey Borodin
Дата:

> 4 нояб. 2021 г., в 17:55, Daniel Gustafsson <daniel@yesql.se> написал(а):
>
> The patch no longer applies, can you submit a rebased version please?

Thanks, Daniel! PFA rebase.

Best regards, Andrey Borodin.

Вложения

Re: Supply restore_command to pg_rewind via CLI argument

От
Andres Freund
Дата:
Hi,

On 2021-11-05 15:10:29 +0500, Andrey Borodin wrote:
> > 4 нояб. 2021 г., в 17:55, Daniel Gustafsson <daniel@yesql.se> написал(а):
> > 
> > The patch no longer applies, can you submit a rebased version please?
> 
> Thanks, Daniel! PFA rebase.

Doesn't apply once more: http://cfbot.cputube.org/patch_37_3213.log

Greetings,

Andres Freund



Re: Supply restore_command to pg_rewind via CLI argument

От
Alexey Kondratov
Дата:
Hi,

On Tue, Mar 22, 2022 at 3:32 AM Andres Freund <andres@anarazel.de> wrote:
>
> Doesn't apply once more: http://cfbot.cputube.org/patch_37_3213.log
>

Thanks for the reminder, a rebased version is attached.


Regards
-- 
Alexey Kondratov

Вложения

Re: Supply restore_command to pg_rewind via CLI argument

От
Michael Paquier
Дата:
On Thu, Nov 04, 2021 at 01:55:43PM +0100, Daniel Gustafsson wrote:
>> On 14 Sep 2021, at 16:05, Andrey Borodin <x4mmm@yandex-team.ru> wrote:
>>> Do we actually need --target-restore-command at all? It seems to me
>>> that we have all we need with --restore-target-wal, and that's not
>>> really instinctive to pass down a command via another command..
>>
>> Currently we know that --restore-target-wal is not enough if postgresql.conf does not reside within PGDATA.
>
> That's a useful reason which wasn't brought up in the earlier thread, and may
> tip the scales in favor.

It does now, as of 0d5c3875.  FWIW, I am not much a fan of the design
where we pass down a command line as an option value of a different
command line (more games with quoting comes into mind first), and
--config-file should give enough room for the case of this thread.  I
have switched the status of the patch to reflect that.
--
Michael

Вложения