Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commitfd71421

Browse files
committed
Improve tests for postmaster death in auxiliary processes.
In checkpointer and walwriter, avoid calling PostmasterIsAlive unlessWaitLatch has reported WL_POSTMASTER_DEATH. This saves a kernel call periteration of the process's outer loop, which is not all that much, but acycle shaved is a cycle earned. I had already removed the unconditionalPostmasterIsAlive calls in bgwriter and pgstat in previous patches, butforgot that WL_POSTMASTER_DEATH is supposed to be treated as untrustworthy(per comment in unix_latch.c); so adjust those two cases to match.There are a few other places where the same idea might be applied, but onlyafter substantial code rearrangement, so I didn't bother.
1 parente78cc62 commitfd71421

File tree

4 files changed

+37
-24
lines changed

4 files changed

+37
-24
lines changed

‎src/backend/postmaster/bgwriter.c

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -323,9 +323,11 @@ BackgroundWriterMain(void)
323323

324324
/*
325325
* Emergency bailout if postmaster has died. This is to avoid the
326-
* necessity for manual cleanup of all postmaster children.
326+
* necessity for manual cleanup of all postmaster children. Note
327+
* that we mustn't trust the WL_POSTMASTER_DEATH result flag entirely;
328+
* if it is set, recheck with PostmasterIsAlive before believing it.
327329
*/
328-
if (rc&WL_POSTMASTER_DEATH)
330+
if ((rc&WL_POSTMASTER_DEATH)&& !PostmasterIsAlive())
329331
exit(1);
330332

331333
prev_hibernate=can_hibernate;

‎src/backend/postmaster/checkpointer.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -374,17 +374,11 @@ CheckpointerMain(void)
374374
pg_time_tnow;
375375
intelapsed_secs;
376376
intcur_timeout;
377+
intrc;
377378

378379
/* Clear any already-pending wakeups */
379380
ResetLatch(&MyProc->procLatch);
380381

381-
/*
382-
* Emergency bailout if postmaster has died. This is to avoid the
383-
* necessity for manual cleanup of all postmaster children.
384-
*/
385-
if (!PostmasterIsAlive())
386-
exit(1);
387-
388382
/*
389383
* Process any requests or signals received recently.
390384
*/
@@ -581,9 +575,18 @@ CheckpointerMain(void)
581575
cur_timeout=Min(cur_timeout,XLogArchiveTimeout-elapsed_secs);
582576
}
583577

584-
(void)WaitLatch(&MyProc->procLatch,
585-
WL_LATCH_SET |WL_TIMEOUT |WL_POSTMASTER_DEATH,
586-
cur_timeout*1000L/* convert to ms */);
578+
rc=WaitLatch(&MyProc->procLatch,
579+
WL_LATCH_SET |WL_TIMEOUT |WL_POSTMASTER_DEATH,
580+
cur_timeout*1000L/* convert to ms */);
581+
582+
/*
583+
* Emergency bailout if postmaster has died. This is to avoid the
584+
* necessity for manual cleanup of all postmaster children. Note
585+
* that we mustn't trust the WL_POSTMASTER_DEATH result flag entirely;
586+
* if it is set, recheck with PostmasterIsAlive before believing it.
587+
*/
588+
if ((rc&WL_POSTMASTER_DEATH)&& !PostmasterIsAlive())
589+
exit(1);
587590
}
588591
}
589592

‎src/backend/postmaster/pgstat.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3225,8 +3225,13 @@ PgstatCollectorMain(int argc, char *argv[])
32253225
pgStatSock,
32263226
-1L);
32273227

3228-
/* Check for postmaster death */
3229-
if (wr&WL_POSTMASTER_DEATH)
3228+
/*
3229+
* Emergency bailout if postmaster has died. This is to avoid the
3230+
* necessity for manual cleanup of all postmaster children. Note
3231+
* that we mustn't trust the WL_POSTMASTER_DEATH result flag entirely;
3232+
* if it is set, recheck with PostmasterIsAlive before believing it.
3233+
*/
3234+
if ((wr&WL_POSTMASTER_DEATH)&& !PostmasterIsAlive())
32303235
break;
32313236
}/* end of outer loop */
32323237

‎src/backend/postmaster/walwriter.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,7 @@ WalWriterMain(void)
246246
for (;;)
247247
{
248248
longcur_timeout;
249+
intrc;
249250

250251
/*
251252
* Advertise whether we might hibernate in this cycle. We do this
@@ -265,13 +266,6 @@ WalWriterMain(void)
265266
/* Clear any already-pending wakeups */
266267
ResetLatch(&MyProc->procLatch);
267268

268-
/*
269-
* Emergency bailout if postmaster has died. This is to avoid the
270-
* necessity for manual cleanup of all postmaster children.
271-
*/
272-
if (!PostmasterIsAlive())
273-
exit(1);
274-
275269
/*
276270
* Process any requests or signals received recently.
277271
*/
@@ -305,9 +299,18 @@ WalWriterMain(void)
305299
else
306300
cur_timeout=WalWriterDelay*HIBERNATE_FACTOR;
307301

308-
(void)WaitLatch(&MyProc->procLatch,
309-
WL_LATCH_SET |WL_TIMEOUT |WL_POSTMASTER_DEATH,
310-
cur_timeout);
302+
rc=WaitLatch(&MyProc->procLatch,
303+
WL_LATCH_SET |WL_TIMEOUT |WL_POSTMASTER_DEATH,
304+
cur_timeout);
305+
306+
/*
307+
* Emergency bailout if postmaster has died. This is to avoid the
308+
* necessity for manual cleanup of all postmaster children. Note
309+
* that we mustn't trust the WL_POSTMASTER_DEATH result flag entirely;
310+
* if it is set, recheck with PostmasterIsAlive before believing it.
311+
*/
312+
if ((rc&WL_POSTMASTER_DEATH)&& !PostmasterIsAlive())
313+
exit(1);
311314
}
312315
}
313316

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp