mirror of
https://github.com/postgres/postgres.git
synced 2025-04-24 10:47:04 +03:00
Fix autovacuum launcher attachment to its DSA
The autovacuum launcher doesn't actually do anything with its DSA other than creating it and attaching to it, but it's been observed that after longjmp'ing to the standard error handling block (for example after getting SIGINT) the autovacuum enters an infinite loop reporting that it cannot attach to its DSA anymore (which is correct, because it's already attached to it.) Fix by only attempting to attach if not already attached. I introduced this bug together with BRIN autosummarization in 7526e10224f0. Reported-by: Yugo Nagata. Author: Thomas Munro. I added the comment to go with it. Discussion: https://postgr.es/m/20170621211538.0c9eae73.nagata@sraoss.co.jp
This commit is contained in:
parent
2a6db5eba6
commit
a4f06606a3
@ -612,7 +612,8 @@ AutoVacLauncherMain(int argc, char *argv[])
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Set up our DSA so that backends can install work-item requests. It may
|
* Set up our DSA so that backends can install work-item requests. It may
|
||||||
* already exist as created by a previous launcher.
|
* already exist as created by a previous launcher; and we may even be
|
||||||
|
* already attached to it, if we're here after longjmp'ing above.
|
||||||
*/
|
*/
|
||||||
if (!AutoVacuumShmem->av_dsa_handle)
|
if (!AutoVacuumShmem->av_dsa_handle)
|
||||||
{
|
{
|
||||||
@ -626,7 +627,7 @@ AutoVacLauncherMain(int argc, char *argv[])
|
|||||||
AutoVacuumShmem->av_workitems = InvalidDsaPointer;
|
AutoVacuumShmem->av_workitems = InvalidDsaPointer;
|
||||||
LWLockRelease(AutovacuumLock);
|
LWLockRelease(AutovacuumLock);
|
||||||
}
|
}
|
||||||
else
|
else if (AutoVacuumDSA == NULL)
|
||||||
{
|
{
|
||||||
AutoVacuumDSA = dsa_attach(AutoVacuumShmem->av_dsa_handle);
|
AutoVacuumDSA = dsa_attach(AutoVacuumShmem->av_dsa_handle);
|
||||||
dsa_pin_mapping(AutoVacuumDSA);
|
dsa_pin_mapping(AutoVacuumDSA);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user