Обсуждение: Why BgWriterDelay is fixed?

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

Why BgWriterDelay is fixed?

От
高健
Дата:
In src/backend/postmaster/bgwriter.c , I can find the following source code(PostgreSQL9.2):


/*
 * GUC parameters
 */
int BgWriterDelay = 200;

...
rc = WaitLatch(&MyProc->procLatch,
  WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
  BgWriterDelay /* ms */ );
...
if (rc == WL_TIMEOUT && can_hibernate && prev_hibernate)
{
/* Ask for notification at next buffer allocation */
StrategyNotifyBgWriter(&MyProc->procLatch);
/* Sleep ... */
rc = WaitLatch(&MyProc->procLatch,
  WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
  BgWriterDelay * HIBERNATE_FACTOR);
/* Reset the notification request in case we timed out */
StrategyNotifyBgWriter(NULL);
}

But I also found  the following in postgresql.conf:
#bgwriter_delay = 200ms                 # 10-10000ms between rounds
It is now comment .
But according to the fixed code of  BgWriterDelay = 200, even when I update bgwriter_delay in postgresql.conf to a different value(eg 300ms), 
how can it ovewrite the fixed  200ms in bgwriter.c ?

I also want to know,  if it is not a bug, then what is the reason?

Re: Why BgWriterDelay is fixed?

От
"Xiong He"
Дата:
You can check the code in guc.c,  search "bgwriter_delay",  &BgWriterDelay
In the global user configuration, it can change the value of BgWriterDelay.
Since the BgWriterDelay declared in bgwriter.h as extern.  It can be changed in the global namespace.

------------------
Thanks&Regards,
Xiong He

 


------------------ Original ------------------
From:  "高健"<luckyjackgao@gmail.com>;
Date:  Mon, Oct 29, 2012 03:17 PM
To:  "pgsql-general"<pgsql-general@postgresql.org>;
Subject:  [GENERAL] Why BgWriterDelay is fixed?

In src/backend/postmaster/bgwriter.c , I can find the following source code(PostgreSQL9.2):


/*
 * GUC parameters
 */
int BgWriterDelay = 200;

...
rc = WaitLatch(&MyProc->procLatch,
  WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
  BgWriterDelay /* ms */ );
...
if (rc == WL_TIMEOUT && can_hibernate && prev_hibernate)
{
/* Ask for notification at next buffer allocation */
StrategyNotifyBgWriter(&MyProc->procLatch);
/* Sleep ... */
rc = WaitLatch(&MyProc->procLatch,
  WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,
  BgWriterDelay * HIBERNATE_FACTOR);
/* Reset the notification request in case we timed out */
StrategyNotifyBgWriter(NULL);
}

But I also found  the following in postgresql.conf:
#bgwriter_delay = 200ms                 # 10-10000ms between rounds
It is now comment .
But according to the fixed code of  BgWriterDelay = 200, even when I update bgwriter_delay in postgresql.conf to a different value(eg 300ms), 
how can it ovewrite the fixed  200ms in bgwriter.c ?

I also want to know,  if it is not a bug, then what is the reason?

Re: Why BgWriterDelay is fixed?

От
Jeff Janes
Дата:
On Mon, Oct 29, 2012 at 12:17 AM, 高健 <luckyjackgao@gmail.com> wrote:
> In src/backend/postmaster/bgwriter.c , I can find the following source
> code(PostgreSQL9.2):
>
>
> /*
>  * GUC parameters
>  */
> int BgWriterDelay = 200;

The value hard coded into the C code is the starting value, or
default.  It is not a constant.

Indeed, I don't think that value is even used.  I think that upon
start-up, that value gets set to the default listed in the guc.c file
(which is also 200), and so the value listed in the bgwriter.c file is
merely a mnemonic to remind people editing the file what the default
value is.


> But according to the fixed code of  BgWriterDelay = 200, even when I update
> bgwriter_delay in postgresql.conf to a different value(eg 300ms),
> how can it ovewrite the fixed  200ms in bgwriter.c ?

Doing so is the job of the "grand unified configuration" machinery, in
src/backend/utils/misc/guc.c



Cheers,

Jeff


Re: Why BgWriterDelay is fixed?

От
Peter Geoghegan
Дата:
On 29 October 2012 07:17, 高健 <luckyjackgao@gmail.com> wrote:
> But I also found  the following in postgresql.conf:
> #bgwriter_delay = 200ms                 # 10-10000ms between rounds
> It is now comment .
> But according to the fixed code of  BgWriterDelay = 200, even when I update
> bgwriter_delay in postgresql.conf to a different value(eg 300ms),
> how can it ovewrite the fixed  200ms in bgwriter.c ?

That value is just a default, that we initialise the variable to as a
sort of a reminder. We do this all over the place. Setting
bgwriter_delay downwards will alter the frequency of iterations.

The WaitLatch() thing is purely concerned with keeping the number of
wake-ups low. As long as your database server does not idle, the logic
is effectively exactly the same as what you'll see in 9.1, where the
event loop is much simpler, and merely sleeps exactly bgwriter_delay
ms every iteration.

--
Peter Geoghegan       http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Training and Services


Re: Why BgWriterDelay is fixed?

От
Tom Lane
Дата:
Jeff Janes <jeff.janes@gmail.com> writes:
> The value hard coded into the C code is the starting value, or
> default.  It is not a constant.

> Indeed, I don't think that value is even used.  I think that upon
> start-up, that value gets set to the default listed in the guc.c file
> (which is also 200), and so the value listed in the bgwriter.c file is
> merely a mnemonic to remind people editing the file what the default
> value is.

It's partly that, and mostly to ensure that the variable has some valid
value even before the configuration file has been read.  The latter
consideration might or might not be important for BgWriterDelay in
particular; but it is important for some GUC variables, so we tend to
follow the coding pattern of initializing GUC variables to their
defaults whenever practical.

            regards, tom lane