1010 *
1111 *
1212 * IDENTIFICATION
13- * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.43 2007/05/0215:47:14 alvherre Exp $
13+ * $PostgreSQL: pgsql/src/backend/postmaster/autovacuum.c,v 1.44 2007/05/0218:27:57 alvherre Exp $
1414 *
1515 *-------------------------------------------------------------------------
1616 */
@@ -549,8 +549,6 @@ AutoVacLauncherMain(int argc, char *argv[])
549549
550550if (can_launch && AutoVacuumShmem -> av_startingWorker != INVALID_OFFSET )
551551{
552- long secs ;
553- int usecs ;
554552WorkerInfo worker = (WorkerInfo )MAKE_PTR (AutoVacuumShmem -> av_startingWorker );
555553
556554if (current_time == 0 )
@@ -566,11 +564,8 @@ AutoVacLauncherMain(int argc, char *argv[])
566564 * startingWorker pointer before trying to connect; only low-level
567565 * problems, like fork() failure, can get us here.
568566 */
569- TimestampDifference (worker -> wi_launchtime ,current_time ,
570- & secs ,& usecs );
571-
572- /* ignore microseconds, as they cannot make any difference */
573- if (secs > autovacuum_naptime )
567+ if (TimestampDifferenceExceeds (worker -> wi_launchtime ,current_time ,
568+ autovacuum_naptime * 1000 ))
574569{
575570LWLockRelease (AutovacuumLock );
576571LWLockAcquire (AutovacuumLock ,LW_EXCLUSIVE );
@@ -618,13 +613,13 @@ AutoVacLauncherMain(int argc, char *argv[])
618613if (elem != NULL )
619614{
620615avl_dbase * avdb = DLE_VAL (elem );
621- long secs ;
622- int usecs ;
623-
624- TimestampDifference (current_time ,avdb -> adl_next_worker ,& secs ,& usecs );
625616
626- /* do we have to start a worker? */
627- if (secs <=0 && usecs <=0 )
617+ /*
618+ * launch a worker if next_worker is right now or it is in the
619+ * past
620+ */
621+ if (TimestampDifferenceExceeds (avdb -> adl_next_worker ,
622+ current_time ,0 ))
628623launch_worker (current_time );
629624}
630625else
@@ -1037,22 +1032,15 @@ do_start_worker(void)
10371032
10381033if (dbp -> adl_datid == tmp -> adw_datid )
10391034{
1040- TimestampTz curr_plus_naptime ;
1041- TimestampTz next = dbp -> adl_next_worker ;
1042-
1043- curr_plus_naptime =
1044- TimestampTzPlusMilliseconds (current_time ,
1045- autovacuum_naptime * 1000 );
1046-
10471035/*
1048- *What we want here ifto skip if next_worker falls between
1036+ *Skip this database ifits next_worker value falls between
10491037 * the current time and the current time plus naptime.
10501038 */
1051- if (timestamp_cmp_internal (current_time ,next ) > 0 )
1052- skipit = false;
1053- else if ( timestamp_cmp_internal ( next , curr_plus_naptime ) > 0 )
1054- skipit = false;
1055- else
1039+ if (TimestampDifferenceExceeds (current_time ,
1040+ dbp -> adl_next_worker , 0 ) &&
1041+ ! TimestampDifferenceExceeds ( current_time ,
1042+ dbp -> adl_next_worker ,
1043+ autovacuum_naptime * 1000 ))
10561044skipit = true;
10571045
10581046break ;