|
10 | 10 | * |
11 | 11 | * |
12 | 12 | * IDENTIFICATION |
13 | | - * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.42 2007/04/18 16:44:18 alvherre Exp $ |
| 13 | + * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.43 2007/05/02 15:47:14 alvherre Exp $ |
14 | 14 | * |
15 | 15 | *------------------------------------------------------------------------- |
16 | 16 | */ |
@@ -1407,25 +1407,36 @@ AutoVacWorkerMain(int argc, char *argv[]) |
1407 | 1407 | * Get the info about the database we're going to work on. |
1408 | 1408 | */ |
1409 | 1409 | LWLockAcquire(AutovacuumLock,LW_EXCLUSIVE); |
1410 | | -MyWorkerInfo= (WorkerInfo)MAKE_PTR(AutoVacuumShmem->av_startingWorker); |
1411 | | -dbid=MyWorkerInfo->wi_dboid; |
1412 | | -MyWorkerInfo->wi_workerpid=MyProcPid; |
1413 | 1410 |
|
1414 | | -/* insert into the running list */ |
1415 | | -SHMQueueInsertBefore(&AutoVacuumShmem->av_runningWorkers, |
1416 | | -&MyWorkerInfo->wi_links); |
1417 | 1411 | /* |
1418 | | - *remove from the "starting" pointer, so that the launcher can start a new |
1419 | | - *worker if required |
| 1412 | + *beware of startingWorker being INVALID; this could happen if the |
| 1413 | + *launcher thinks we've taking too long to start. |
1420 | 1414 | */ |
1421 | | -AutoVacuumShmem->av_startingWorker=INVALID_OFFSET; |
1422 | | -LWLockRelease(AutovacuumLock); |
| 1415 | +if (AutoVacuumShmem->av_startingWorker!=INVALID_OFFSET) |
| 1416 | +{ |
| 1417 | +MyWorkerInfo= (WorkerInfo)MAKE_PTR(AutoVacuumShmem->av_startingWorker); |
| 1418 | +dbid=MyWorkerInfo->wi_dboid; |
| 1419 | +MyWorkerInfo->wi_workerpid=MyProcPid; |
| 1420 | + |
| 1421 | +/* insert into the running list */ |
| 1422 | +SHMQueueInsertBefore(&AutoVacuumShmem->av_runningWorkers, |
| 1423 | +&MyWorkerInfo->wi_links); |
| 1424 | +/* |
| 1425 | + * remove from the "starting" pointer, so that the launcher can start a new |
| 1426 | + * worker if required |
| 1427 | + */ |
| 1428 | +AutoVacuumShmem->av_startingWorker=INVALID_OFFSET; |
| 1429 | +LWLockRelease(AutovacuumLock); |
1423 | 1430 |
|
1424 | | -on_shmem_exit(FreeWorkerInfo,0); |
| 1431 | +on_shmem_exit(FreeWorkerInfo,0); |
1425 | 1432 |
|
1426 | | -/* wake up the launcher */ |
1427 | | -if (AutoVacuumShmem->av_launcherpid!=0) |
1428 | | -kill(AutoVacuumShmem->av_launcherpid,SIGUSR1); |
| 1433 | +/* wake up the launcher */ |
| 1434 | +if (AutoVacuumShmem->av_launcherpid!=0) |
| 1435 | +kill(AutoVacuumShmem->av_launcherpid,SIGUSR1); |
| 1436 | +} |
| 1437 | +else |
| 1438 | +/* no worker entry for me, go away */ |
| 1439 | +LWLockRelease(AutovacuumLock); |
1429 | 1440 |
|
1430 | 1441 | if (OidIsValid(dbid)) |
1431 | 1442 | { |
@@ -1466,8 +1477,8 @@ AutoVacWorkerMain(int argc, char *argv[]) |
1466 | 1477 | } |
1467 | 1478 |
|
1468 | 1479 | /* |
1469 | | - *FIXME -- we need to notify the launcher when we are gone. But this |
1470 | | - *should be done after our PGPROC is released, in ProcKill. |
| 1480 | + *The launcher will be notified of my death in ProcKill, *if* we managed |
| 1481 | + *to get a worker slot at all |
1471 | 1482 | */ |
1472 | 1483 |
|
1473 | 1484 | /* All done, go away */ |
|