Hi, As I report in another thread[1], I found the autovacuum launcher occurs the following error in PG 10 when this received SIGINT. I can repuroduce this by pg_cancel_backend or `kill -2 <pid of autovacuum laucher>`.
2017-06-21 13:56:07.010 JST [32483] ERROR: canceling statement due to user request 2017-06-21 13:56:08.022 JST [32483] ERROR: can't attach the same segment more than once 2017-06-21 13:56:09.034 JST [32483] ERROR: can't attach the same segment more than once 2017-06-21 13:56:10.045 JST [32483] ERROR: can't attach the same segment more than once ... This errors continue until this process is terminated or the server is restarted. When SIGINT is issued, the process exits from the main loop and returns to sigsetjmp, and calls dsa_attach() before entering into the loop again, this causes the error. We can fix it by calling dsa_attach() before sigsetjmp. Attached is the patch. Regards, [1] https://www.postgresql.org/message-id/20170621205657.61d90605.nagata%40sraoss.co.jp -- Yugo Nagata <nag...@sraoss.co.jp>
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c index 89dd3b3..8a41a98 100644 --- a/src/backend/postmaster/autovacuum.c +++ b/src/backend/postmaster/autovacuum.c @@ -502,6 +502,28 @@ AutoVacLauncherMain(int argc, char *argv[]) MemoryContextSwitchTo(AutovacMemCxt); /* + * Set up our DSA so that backends can install work-item requests. It may + * already exist as created by a previous launcher. + */ + if (!AutoVacuumShmem->av_dsa_handle) + { + LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE); + AutoVacuumDSA = dsa_create(AutovacuumLock->tranche); + /* make sure it doesn't go away even if we do */ + dsa_pin(AutoVacuumDSA); + dsa_pin_mapping(AutoVacuumDSA); + AutoVacuumShmem->av_dsa_handle = dsa_get_handle(AutoVacuumDSA); + /* delay array allocation until first request */ + AutoVacuumShmem->av_workitems = InvalidDsaPointer; + LWLockRelease(AutovacuumLock); + } + else + { + AutoVacuumDSA = dsa_attach(AutoVacuumShmem->av_dsa_handle); + dsa_pin_mapping(AutoVacuumDSA); + } + + /* * If an exception is encountered, processing resumes here. * * This code is a stripped down version of PostgresMain error recovery. @@ -610,28 +632,6 @@ AutoVacLauncherMain(int argc, char *argv[]) */ rebuild_database_list(InvalidOid); - /* - * Set up our DSA so that backends can install work-item requests. It may - * already exist as created by a previous launcher. - */ - if (!AutoVacuumShmem->av_dsa_handle) - { - LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE); - AutoVacuumDSA = dsa_create(AutovacuumLock->tranche); - /* make sure it doesn't go away even if we do */ - dsa_pin(AutoVacuumDSA); - dsa_pin_mapping(AutoVacuumDSA); - AutoVacuumShmem->av_dsa_handle = dsa_get_handle(AutoVacuumDSA); - /* delay array allocation until first request */ - AutoVacuumShmem->av_workitems = InvalidDsaPointer; - LWLockRelease(AutovacuumLock); - } - else - { - AutoVacuumDSA = dsa_attach(AutoVacuumShmem->av_dsa_handle); - dsa_pin_mapping(AutoVacuumDSA); - } - /* loop until shutdown request */ while (!got_SIGTERM) {
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers