Alvaro Herrera <alvherre@commandprompt.com> wrote:
> ITAGAKI Takahiro wrote:
> > > I found that autovacuum launcher does not launch any workers in HEAD.
> >
> > The attached autovacuum-fix.patch could fix the problem. I changed
> > to use 'greater or equal' instead of 'greater' at the decision of
> > next autovacuum target.
>
> I have committed a patch which might fix this issue in autovacuum.c rev 1.44.
> Please retest.
HEAD (r1.45) is still broken. We skip entries using the test adl_next_worker - autovacuum_naptime < current_time <=
adl_next_worker,
but the second inequation should be adl_next_worker - autovacuum_naptime < current_time < adl_next_worker,
because adl_next_worker can equal current_time.
@@ -1036,8 +1036,8 @@ * Skip this database if its next_worker value falls between * the
currenttime and the current time plus naptime. */
- if (TimestampDifferenceExceeds(current_time,
- dbp->adl_next_worker, 0) &&
+ if (!TimestampDifferenceExceeds(dbp->adl_next_worker,
+ current_time, 0) &&
!TimestampDifferenceExceeds(current_time, dbp->adl_next_worker,
autovacuum_naptime * 1000))
By the way, why do we need the upper bounds to decide a next target?
Can we use simplify it to "current_time < adl_next_worker"?
@@ -1033,16 +1033,11 @@ if (dbp->adl_datid == tmp->adw_datid) { /*
- * Skip this database if its next_worker value falls between
- * the current time and the current time plus naptime.
+ * Skip this database if its next_worker value is later than
+ * the current time. */
- if (TimestampDifferenceExceeds(current_time,
- dbp->adl_next_worker, 0) &&
- !TimestampDifferenceExceeds(current_time,
- dbp->adl_next_worker,
- autovacuum_naptime * 1000))
- skipit = true;
-
+ skipit = !TimestampDifferenceExceeds(dbp->adl_next_worker,
+ current_time, 0); break; }
elem= DLGetPred(elem);
Regards,
---
ITAGAKI Takahiro
NTT Open Source Software Center