aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAlvaro Herrera <alvherre@alvh.no-ip.org>2007-05-02 15:47:14 +0000
committerAlvaro Herrera <alvherre@alvh.no-ip.org>2007-05-02 15:47:14 +0000
commita115bfe3b97c3168f169e757dfbc3bc0a4ddf416 (patch)
tree75ad73867ad8cf1c68d022afac47a81230bc2375 /src
parent88f1fd29897df477f0af3c5ffcefe53c697a6ff3 (diff)
downloadpostgresql-a115bfe3b97c3168f169e757dfbc3bc0a4ddf416.tar.gz
postgresql-a115bfe3b97c3168f169e757dfbc3bc0a4ddf416.zip
Fix failure to check for INVALID worker entry in the new autovacuum code, which
could happen when a worker took to long to start and was thus "aborted" by the launcher. Noticed by lionfish buildfarm member.
Diffstat (limited to 'src')
-rw-r--r--src/backend/postmaster/autovacuum.c45
1 files changed, 28 insertions, 17 deletions
diff --git a/src/backend/postmaster/autovacuum.c b/src/backend/postmaster/autovacuum.c
index d5bb99c504b..59128212d5a 100644
--- a/src/backend/postmaster/autovacuum.c
+++ b/src/backend/postmaster/autovacuum.c
@@ -10,7 +10,7 @@
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.42 2007/04/18 16:44:18 alvherre Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.43 2007/05/02 15:47:14 alvherre Exp $
*
*-------------------------------------------------------------------------
*/
@@ -1407,25 +1407,36 @@ AutoVacWorkerMain(int argc, char *argv[])
* Get the info about the database we're going to work on.
*/
LWLockAcquire(AutovacuumLock, LW_EXCLUSIVE);
- MyWorkerInfo = (WorkerInfo) MAKE_PTR(AutoVacuumShmem->av_startingWorker);
- dbid = MyWorkerInfo->wi_dboid;
- MyWorkerInfo->wi_workerpid = MyProcPid;
- /* insert into the running list */
- SHMQueueInsertBefore(&AutoVacuumShmem->av_runningWorkers,
- &MyWorkerInfo->wi_links);
/*
- * remove from the "starting" pointer, so that the launcher can start a new
- * worker if required
+ * beware of startingWorker being INVALID; this could happen if the
+ * launcher thinks we've taking too long to start.
*/
- AutoVacuumShmem->av_startingWorker = INVALID_OFFSET;
- LWLockRelease(AutovacuumLock);
+ if (AutoVacuumShmem->av_startingWorker != INVALID_OFFSET)
+ {
+ MyWorkerInfo = (WorkerInfo) MAKE_PTR(AutoVacuumShmem->av_startingWorker);
+ dbid = MyWorkerInfo->wi_dboid;
+ MyWorkerInfo->wi_workerpid = MyProcPid;
+
+ /* insert into the running list */
+ SHMQueueInsertBefore(&AutoVacuumShmem->av_runningWorkers,
+ &MyWorkerInfo->wi_links);
+ /*
+ * remove from the "starting" pointer, so that the launcher can start a new
+ * worker if required
+ */
+ AutoVacuumShmem->av_startingWorker = INVALID_OFFSET;
+ LWLockRelease(AutovacuumLock);
- on_shmem_exit(FreeWorkerInfo, 0);
+ on_shmem_exit(FreeWorkerInfo, 0);
- /* wake up the launcher */
- if (AutoVacuumShmem->av_launcherpid != 0)
- kill(AutoVacuumShmem->av_launcherpid, SIGUSR1);
+ /* wake up the launcher */
+ if (AutoVacuumShmem->av_launcherpid != 0)
+ kill(AutoVacuumShmem->av_launcherpid, SIGUSR1);
+ }
+ else
+ /* no worker entry for me, go away */
+ LWLockRelease(AutovacuumLock);
if (OidIsValid(dbid))
{
@@ -1466,8 +1477,8 @@ AutoVacWorkerMain(int argc, char *argv[])
}
/*
- * FIXME -- we need to notify the launcher when we are gone. But this
- * should be done after our PGPROC is released, in ProcKill.
+ * The launcher will be notified of my death in ProcKill, *if* we managed
+ * to get a worker slot at all
*/
/* All done, go away */