dovecot-2.2: lib-storage/notify: Added MAILBOX_TRANSACTION_FLAG_...

dovecot at dovecot.org dovecot at dovecot.org
Tue Oct 20 12:29:16 UTC 2015


details:   http://hg.dovecot.org/dovecot-2.2/rev/16ff395c156e
changeset: 19317:16ff395c156e
user:      Timo Sirainen <tss at iki.fi>
date:      Tue Oct 20 15:27:42 2015 +0300
description:
lib-storage/notify: Added MAILBOX_TRANSACTION_FLAG_NO_NOTIFY
This flag could potentially apply for other things as well, not just notify
plugin. In general anything that could do external notifications shouldn't
do anything for transactions with this flag.

diffstat:

 src/lib-storage/mail-storage.h      |   6 +++++-
 src/plugins/notify/notify-storage.c |  27 ++++++++++++++++++++-------
 2 files changed, 25 insertions(+), 8 deletions(-)

diffs (102 lines):

diff -r 467695fee373 -r 16ff395c156e src/lib-storage/mail-storage.h
--- a/src/lib-storage/mail-storage.h	Tue Oct 20 13:12:24 2015 +0300
+++ b/src/lib-storage/mail-storage.h	Tue Oct 20 15:27:42 2015 +0300
@@ -177,7 +177,11 @@
 	MAILBOX_TRANSACTION_FLAG_NO_CACHE_DEC	= 0x10,
 	/* Sync transaction describes changes to mailbox that already happened
 	   to another mailbox with whom we're syncing with (dsync) */
-	MAILBOX_TRANSACTION_FLAG_SYNC		= 0x20
+	MAILBOX_TRANSACTION_FLAG_SYNC		= 0x20,
+	/* Don't trigger any notifications for this transaction. This
+	   especially means the notify plugin. This would normally be used only
+	   with _FLAG_SYNC. */
+	MAILBOX_TRANSACTION_FLAG_NO_NOTIFY	= 0x40
 };
 
 enum mailbox_sync_flags {
diff -r 467695fee373 -r 16ff395c156e src/plugins/notify/notify-storage.c
--- a/src/plugins/notify/notify-storage.c	Tue Oct 20 13:12:24 2015 +0300
+++ b/src/plugins/notify/notify-storage.c	Tue Oct 20 15:27:42 2015 +0300
@@ -79,6 +79,9 @@
 	struct mail_vfuncs *v = mail->vlast;
 	union mail_module_context *lmail;
 
+	if ((_mail->transaction->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) != 0)
+		return;
+
 	lmail = p_new(mail->pool, union mail_module_context, 1);
 	lmail->super = *v;
 	mail->vlast = &lmail->super;
@@ -98,7 +101,8 @@
 		NOTIFY_CONTEXT(ctx->transaction->box);
 	int ret;
 
-	if (ctx->dest_mail == NULL) {
+	if (ctx->dest_mail == NULL &&
+	    (ctx->transaction->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) == 0) {
 		if (lt->tmp_mail == NULL)
 			lt->tmp_mail = mail_alloc(ctx->transaction, 0, NULL);
 		ctx->dest_mail = lt->tmp_mail;
@@ -107,7 +111,9 @@
 	if ((ret = lbox->super.copy(ctx, mail)) < 0)
 		return -1;
 
-	if (ctx->saving) {
+	if ((ctx->transaction->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) != 0) {
+		/* no notifications */
+	} else if (ctx->saving) {
 		/* we came from mailbox_save_using_mail() */
 		notify_contexts_mail_save(ctx->dest_mail);
 	} else {
@@ -124,7 +130,8 @@
 	union mailbox_module_context *lbox =
 		NOTIFY_CONTEXT(ctx->transaction->box);
 
-	if (ctx->dest_mail == NULL) {
+	if (ctx->dest_mail == NULL &&
+	    (ctx->transaction->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) == 0) {
 		if (lt->tmp_mail == NULL)
 			lt->tmp_mail = mail_alloc(ctx->transaction, 0, NULL);
 		ctx->dest_mail = lt->tmp_mail;
@@ -141,7 +148,8 @@
 
 	if (lbox->super.save_finish(ctx) < 0)
 		return -1;
-	if (dest_mail != NULL)
+	if (dest_mail != NULL &&
+	    (ctx->transaction->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) == 0)
 		notify_contexts_mail_save(dest_mail);
 	return 0;
 }
@@ -159,7 +167,8 @@
 	lt = i_new(struct notify_transaction_context, 1);
 	MODULE_CONTEXT_SET(t, notify_storage_module, lt);
 
-	notify_contexts_mail_transaction_begin(t);
+	if ((t->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) == 0)
+		notify_contexts_mail_transaction_begin(t);
 	return t;
 }
 
@@ -179,7 +188,10 @@
 		return -1;
 	}
 
-	notify_contexts_mail_transaction_commit(t, changes_r);
+	/* FIXME: note that t is already freed at this stage. it's not actually
+	   being dereferenced anymore though. still, a bit unsafe.. */
+	if ((t->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) == 0)
+		notify_contexts_mail_transaction_commit(t, changes_r);
 	return 0;
 }
 
@@ -193,7 +205,8 @@
 		mail_free(&lt->tmp_mail);
 	i_free(lt);
 	
-	notify_contexts_mail_transaction_rollback(t);
+	if ((t->flags & MAILBOX_TRANSACTION_FLAG_NO_NOTIFY) == 0)
+		notify_contexts_mail_transaction_rollback(t);
 	lbox->super.transaction_rollback(t);
 }
 


More information about the dovecot-cvs mailing list