Re: mailing list archiver chewing patches
Matteo Beccati <php@beccati.com>
From: Matteo Beccati <php@beccati.com>
To: Tom Lane <tgl@sss.pgh.pa.us>
Cc: Magnus Hagander <magnus@hagander.net>, Alvaro Herrera <alvherre@commandprompt.com>, Joe Conway <mail@joeconway.com>, Dimitri Fontaine <dfontaine@hi-media.com>, David Fetter <david@fetter.org>, Aidan Van Dyk <aidan@highrise.ca>, Dave Page <dpage@pgadmin.org>, Abhijit Menon-Sen <ams@toroid.org>, Andrew Dunstan <andrew@dunslane.net>, Tim Bunce <Tim.Bunce@pobox.com>, pgsql-hackers <pgsql-hackers@postgresql.org>
Date: 2010-02-13T12:34:56Z
Lists: pgsql-hackers
On 01/02/2010 17:28, Tom Lane wrote: > Matteo Beccati<php@beccati.com> writes: >> My main concern is that we'd need to overcomplicate the thread detection >> algorithm so that it better deals with delayed messages: as it currently >> works, the replies to a missing message get linked to the >> "grand-parent". Injecting the missing message afterwards will put it at >> the same level as its replies. If it happens only once in a while I >> guess we can live with it, but definitely not if it happens tens of >> times a day. > > That's quite common unfortunately --- I think you're going to need to > deal with the case. Even getting a direct feed from the mail relays > wouldn't avoid it completely: consider cases like > > * A sends a message > * B replies, cc'ing A and the list > * B's reply to list is delayed by greylisting > * A replies to B's reply (cc'ing list) > * A's reply goes through immediately > * B's reply shows up a bit later > > That happens pretty frequently IME. I've improved the threading algorithm by keeping an ordered backlog of unresolved references, i.e. when a message arrives: 1. Search for a parent message using: 1a. In-Reply-To header. If referenced message is not found insert its Message-Id to the backlog table with position 0 1b. References header. For each missing referenced message insert its Message-Id to the backlog table with position N 1c. MS Exchange Thread-Index and Thread-Topic headers 2. Message is stored along with its parent ID, if any. 3. Compare the Message-Id header with the backlog table. Update the parent field of any referencing message and clean up positions >= n in the references table. Now I just need some time to do a final clean up and I'd be ready to publish the code, which hopefully will be clearer than my words ;) Cheers -- Matteo Beccati Development & Consulting - http://www.beccati.com/