From: | Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
---|---|
To: | Kyotaro Horiguchi <horikyota(dot)ntt(at)gmail(dot)com> |
Cc: | jgdr(at)dalibo(dot)com, andres(at)anarazel(dot)de, michael(at)paquier(dot)xyz, sawada(dot)mshk(at)gmail(dot)com, peter(dot)eisentraut(at)2ndquadrant(dot)com, pgsql-hackers(at)lists(dot)postgresql(dot)org, thomas(dot)munro(at)enterprisedb(dot)com, sk(at)zsrv(dot)org, michael(dot)paquier(at)gmail(dot)com |
Subject: | Re: [HACKERS] Restricting maximum keep segments by repslots |
Date: | 2020-03-31 15:07:55 |
Message-ID: | 20200331150755.GA3858@alvherre.pgsql |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 2020-Mar-31, Kyotaro Horiguchi wrote:
> Thank you for looking this and trouble rebasing!
>
> At Mon, 30 Mar 2020 20:03:27 -0300, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> wrote in
> > I rebased this patch; it's failing to apply due to minor concurrent
> > changes in PostgresNode.pm. I squashed the patches in a series that
> > made the most sense to me.
> >
> > I have a question about static variable lastFoundOldestSeg in
> > FindOldestXLogFileSegNo. It may be set the first time the function
> > runs; if it is, the function never again does anything, it just returns
> > that value. In other words, the static value is never reset; it never
> > advances either. Isn't that strange? I think the coding is to assume
> > that XLogCtl->lastRemovedSegNo will always be set, so its code will
> > almost never run ... except when the very first wal file has not been
> > removed yet. This seems weird and pointless. Maybe we should think
> > about this differently -- example: if XLogGetLastRemovedSegno returns
> > zero, then the oldest file is the zeroth one. In what cases this is
> > wrong? Maybe we should fix those.
>
> That's right, but without the static variable, every call to the
> pg_replication_slots view before the fist checkpoint causes scanning
> pg_xlog. XLogCtl->lastRemovedSegNo advances only at a checkpoint, so
> it is actually right that the return value from
> FindOldestXLogFileSegNo doesn't change until the first checkpoint.
>
> Also we could set XLogCtl->lastRemovedSegNo at startup, but the
> scanning on pg_xlog is useless in most cases.
>
> I avoided to update the XLogCtl->lastRemovedSegNo directlry, but the
> third way would be if XLogGetLastRemovedSegno() returned 0, then set
> XLogCtl->lastRemovedSegNo by scanning the WAL directory. The attached
> takes this way.
I'm not sure if I explained my proposal clearly. What if
XLogGetLastRemovedSegno returning zero means that every segment is
valid? We don't need to scan pg_xlog at all.
> > Regarding the PostgresNode change in 0001, I think adding a special
> > parameter for primary_slot_name is limited. I'd like to change the
> > definition so that anything that you give as a parameter that's not one
> > of the recognized keywords (has_streaming, etc) is tested to see if it's
> > a GUC; and if it is, then put it in postgresql.conf. This would have to
> > apply both to PostgresNode::init() as well as
> > PostgresNode::init_from_backup(), obviously, since it would make no
> > sense for the APIs to diverge on this point. So you'd be able to do
> > $node->init_from_backup(allow_streaming => 1, work_mem => "4MB");
> > without having to add code to init_from_backup to handle work_mem
> > specifically. This could be done by having a Perl hash with all the GUC
> > names, that we could read lazily from "postmaster --describe-config" the
> > first time we see an unrecognized keyword as an option to init() /
> > init_from_backup().
>
> Done that way. We could exclude "known" parameters by explicitly
> delete the key at reading it, but I choosed to enumerate the known
> keywords. Although it can be used widely but actually I changed only
> 018_repslot_limit.pl to use the feature.
Hmm. I like this idea in general, but I'm not sure I want to introduce
it in this form right away. For the time being I realized while waking
up this morning we can just use $node->append_conf() in the
018_replslot_limit.pl file, like every other place that needs a special
config. There's no need to change the test infrastructure for this.
I'll go through this again. Many thanks,
--
Álvaro Herrera https://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From | Date | Subject | |
---|---|---|---|
Next Message | Jehan-Guillaume de Rorthais | 2020-03-31 15:22:29 | [BUG] non archived WAL removed during production crash recovery |
Previous Message | Ranier Vilela | 2020-03-31 14:26:31 | Re: [PATCH] remove condition always true (/src/backend/access/heap/vacuumlazy.c) |