[2.3] lowmark

Heath Kehoe heath.kehoe at intermec.com
Mon Sep 4 09:33:28 UTC 2000


Ok, here's the sequence of events for when an article is cancelled or
superseded (when 'groupbaseexpiry' is false):

1) innd removes it from storage, but not from history or overview.

2) expire removes the cancelled articles' tokens from the history file.

3) For articles in not-self-expiring storage, expireover removes
   from overview those articles which no longer appear in history.
   Katsuhiro's recent patch fixes this to remove from overview
   those articles whose tokens are no longer in history.

But if 'groupbaseexpiry' is true, the method_expiregroup function
does not do the OVhisthasmsgid test.  So cancelled articles will
not be removed from overview until they reach their expiration time.
That's easy enough to fix:  change the appropriate if() in
ov3.c/buffindexed.c/ovdb.c.

But wait, there's another issue: even if we fix the above problem;
remember that the expireover runs first when groupbaseexpiry==TRUE.
Since the cancelled article tokens are still in history (because
expire hasn't run yet), the cancelled articles are not removed
from overview (which is where the lowmark info comes from).

Then the expire runs, which will update history; and the expireover
in the _next_ news.daily run will then delete the cancelled
articles (from two days ago) from overview.

Also, why is it that for self-expiring storage methods, OVexpiregroup
checks storage (SMretrieve(token, RETR_STAT)), but for other
methods it checks history?

I propose that the method_expiregroup logic should be changed
to something like this:

for each overview record {
    if(SMretrieve(token, RETR_STAT) == NULL)
       deleteit;

    else if(innconf->groupbaseexpiry && OVgroupbasedexpire(...))
       deleteit;

    else keepit;
}


It's simpler, and is more consistent.

--heath




More information about the inn-workers mailing list