Thread: Why BgWriterDelay is fixed?

Why BgWriterDelay is fixed?

From
高健
Date:
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?

From
"Xiong He"
Date:
You can check the code in guc.c,  search "bgwriter_delay",  &BgWriterDelay<br />In the global user configuration,
itcan change the value of BgWriterDelay.<br />Since the BgWriterDelay declared in bgwriter.h as extern.  It can be
changedin the global namespace.<br /><br /><div><div style="color:#909090;font-family:Arial
Narrow;font-size:12px">------------------</div><divstyle="font-size:14px;font-family:Verdana;color:#000;"><div><div
style="font-family:'lucida Grande', Verdana; font-size: 12px; line-height: 18px; ">Thanks&Regards,</div><div
style="font-family:'lucida Grande', Verdana; font-size: 12px; line-height: 18px; ">Xiong He<br /><br
/></div></div></div></div><div> </div><div><div><br/></div><div><br /></div><div style="font-size: 12px;font-family:
ArialNarrow;padding:2px 0 2px 0;">------------------ Original ------------------</div><div style="font-size:
12px;background:#efefef;padding:8px;"><div><b>From:</b> "高健"<luckyjackgao@gmail.com>;</div><div><b>Date:
</b> Mon,Oct 29, 2012 03:17 PM</div><div><b>To: </b> "pgsql-general"<pgsql-general@postgresql.org>; <wbr
/></div><div></div><div><b>Subject:</b> [GENERAL] Why BgWriterDelay is fixed?</div></div><div><br
/></div>In src/backend/postmaster/bgwriter.c, I can find the following source code(PostgreSQL9.2):<div><br
/></div><div><div><br/></div><div>/*</div><div> * GUC parameters</div><div> */</div><div>int<span
class="Apple-tab-span"style="white-space:pre"> </span>BgWriterDelay = 200;</div></div><div><br
/></div><div>...</div><div><div><spanclass="Apple-tab-span" style="white-space:pre"> </span>rc =
WaitLatch(&MyProc->procLatch,</div><div><spanclass="Apple-tab-span" style="white-space:pre"> </span>  
WL_LATCH_SET| WL_TIMEOUT | WL_POSTMASTER_DEATH,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>
 BgWriterDelay /* ms */ );</div></div><div>...</div><div><div><span class="Apple-tab-span" style="white-space:pre">
</span>if(rc == WL_TIMEOUT && can_hibernate && prev_hibernate)</div><div><span class="Apple-tab-span"
style="white-space:pre"></span>{</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>/* Ask for
notificationat next buffer allocation */</div><div><span class="Apple-tab-span" style="white-space:pre">
</span>StrategyNotifyBgWriter(&MyProc->procLatch);</div><div><spanclass="Apple-tab-span"
style="white-space:pre"></span>/* Sleep ... */</div><div><span class="Apple-tab-span" style="white-space:pre">
</span>rc= WaitLatch(&MyProc->procLatch,</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>
 WL_LATCH_SET | WL_TIMEOUT | WL_POSTMASTER_DEATH,</div><div><span class="Apple-tab-span" style="white-space:pre">
</span>  BgWriterDelay * HIBERNATE_FACTOR);</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>/*
Resetthe notification request in case we timed out */</div><div><span class="Apple-tab-span" style="white-space:pre">
</span>StrategyNotifyBgWriter(NULL);</div><div><spanclass="Apple-tab-span" style="white-space:pre">
</span>}</div></div><div><br/></div><div>But I also found  the following in
postgresql.conf:</div><div><div>#bgwriter_delay= 200ms                 # 10-10000ms between rounds</div></div><div>It
isnow comment .</div><div>But according to the fixed code of  BgWriterDelay = 200, even when I update bgwriter_delay in
postgresql.confto a different value(eg 300ms), </div><div>how can it ovewrite the fixed  200ms in bgwriter.c
?</div><div><br/></div><div>I also want to know,  if it is not a bug, then what is the reason?</div></div> 

Re: Why BgWriterDelay is fixed?

From
Jeff Janes
Date:
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?

From
Peter Geoghegan
Date:
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?

From
Tom Lane
Date:
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