Aaron Stone <[EMAIL PROTECTED]> said: > Sean Chittenden <[EMAIL PROTECTED]> said: > >>> So, a detail that I hope a PostgreSQL person can answer definitively: >>> will wrapping the delivery into a transaction prevent rows that are >>> eventually deleted from even hitting the database? >> >> Sadly, no: but it will help throughput and performance to wrap things >> in a transaction. You're better off investigating the possibility of >> having a copy-on-write methodology wherein a message is added to the >> database, then user accounts point to a given message id. When the >> message is updated, it copies itself to a new message/message id and >> the change cascades downwards. This would save space and IO. -sc > > The message blocks themselves aren't (well, they shouldn't...) be copied, > just the message (and physmessage?) entries. It's been a while since I was > deep in that code, though, so I don't remember if we really did finish > getting rid of the actual messageblk copy.
Wait, I didn't finish that thought :-P So the necessary rearchitecture would involve delivering the messageblks first into a memory table, and only copying them into an on-disk table if there are local recipients. I believe that this method was used in an early pre-1.0 version of DBMail, and replaced with a locally in-memory system, which I replaced with the internal user system. My way makes it possible to store arbitrarily large messages without requiring them to be in memory all at once, which I think is a pretty important part of the design. ** Ok, looking at the TODO (these are in the 2.1 section): - Rather than always deleting messages after delivery, make it part of dbmail-util to clean out the special delivery user. - Import and export users and mailboxes to mbox format. - Combine the above two to allow for logging of all incoming messages (e.g. USA banks are required to archive all email by law). Ok, I feel much better now that I've already thought of most of this ;-) So much for a quick-fix for PostgreSQL users during 2.0... keep those daily vacuums running for now. Aaron ** Sidenote: I thought that the retrieval functions did this same thing by retrieving only one row at a time from the database, sending it over the wire, and repeat until all messageblks are sent. But apparently not; it's already been filed as a bug.