]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
virtual: Optimize mailbox_notify_changes() when there's only a single backend mailbox
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 19 Jul 2017 20:19:12 +0000 (23:19 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 20 Jul 2017 07:55:36 +0000 (10:55 +0300)
src/plugins/virtual/virtual-storage.c

index a2df0e60cad0d0e55e36bbf870fb37695ff37c3f..efa51293af298cb1419febb5f5cd6f0c9f8ccf09 100644 (file)
@@ -711,14 +711,22 @@ static void virtual_notify_changes(struct mailbox *box)
        }
 
        array_foreach_modifiable(&mbox->backend_boxes, bboxp) {
-               /* we are already waiting for notifications */
-               if ((*bboxp)->notify != NULL)
-                       continue;
-               /* wait for notifications */
-               if (virtual_notify_start(*bboxp) == 0)
-                       continue;
-               /* it did not work, so open the mailbox and use
-                  alternative method */
+               if (array_count(&mbox->backend_boxes) == 1 &&
+                   (*bboxp)->box->opened) {
+                       /* There's only a single backend mailbox and its
+                          indexes are already opened. Might as well use the
+                          backend directly for notifications. */
+               } else {
+                       /* we are already waiting for notifications */
+                       if ((*bboxp)->notify != NULL)
+                               continue;
+                       /* wait for notifications */
+                       if (virtual_notify_start(*bboxp) == 0)
+                               continue;
+                       /* it did not work, so open the mailbox and use
+                          alternative method */
+               }
+
                if (!(*bboxp)->box->opened &&
                    virtual_backend_box_open(mbox, *bboxp) < 0) {
                        /* we can't report error in here, so do it later */