Re: [Dovecot] Plugin help, number of messages in mailbox

2012-11-26 Thread Timo Sirainen
On 22.11.2012, at 17.06, Richard Platel wrote:

 We use Dovecot for IMAP and POP (but not LDA), we want to do something when a 
 user has an INBOX that becomes empty, or becomes not empty (set a flag in 
 memcached, but that's not really important).  
 
 I'm writing a plugin (for Dovecot 2.1.7).  On mailbox_open() I can use 
 mailbox_get_status() to get a count of messages in the mailbox, and then 
 decrement this in expunge() or increment it in mailbox save_finish() (for 
 IMAP APPEND or COPY commands).

So all mailbox access goes through Dovecot. Nothing else changes the underlying 
storage directly?

 However in expunge() and mailbox_save_finish, even after calling the super 
 function, mailbox_get_status doesn't update the number of messages in the 
 mailbox.

You'll get the updated count only after mailbox_sync_deinit().

 This is a problem if (for example) there are concurrent POP sessions.  Two 
 POP sessions could get all the messages in INBOX, one could logout, calling 
 expunge a few times, eventually causing my plugin to note that the inbox is 
 empty, then our LDA could deliver a message, mark the INBOX not empty, then 
 the other POP session could log out, call expunge and cause my plugin to mark 
 the INBOX empty, when it's not.
 
 
 So in summation: how can a plugin be notified of changes to a mailbox, and 
 then accurately get the real number of messages in that mailbox? 


I think if you hook into sync_deinit() and use a local lock file while you send 
the notification it would probably be race-free.



[Dovecot] Plugin help, number of messages in mailbox

2012-11-22 Thread Richard Platel

Hi,

We use Dovecot for IMAP and POP (but not LDA), we want to do something when a 
user has an INBOX that becomes empty, or becomes not empty (set a flag in 
memcached, but that's not really important).  

I'm writing a plugin (for Dovecot 2.1.7).  On mailbox_open() I can use 
mailbox_get_status() to get a count of messages in the mailbox, and then 
decrement this in expunge() or increment it in mailbox save_finish() (for IMAP 
APPEND or COPY commands).

However in expunge() and mailbox_save_finish, even after calling the super 
function, mailbox_get_status doesn't update the number of messages in the 
mailbox.

This is a problem if (for example) there are concurrent POP sessions.  Two POP 
sessions could get all the messages in INBOX, one could logout, calling expunge 
a few times, eventually causing my plugin to note that the inbox is empty, then 
our LDA could deliver a message, mark the INBOX not empty, then the other POP 
session could log out, call expunge and cause my plugin to mark the INBOX 
empty, when it's not.


So in summation: how can a plugin be notified of changes to a mailbox, and then 
accurately get the real number of messages in that mailbox?