]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
director: Fixed user weakness getting stuck if multiple directors set user weak simul...
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Thu, 24 Mar 2016 00:36:14 +0000 (09:36 +0900)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Tue, 29 Mar 2016 08:21:24 +0000 (11:21 +0300)
src/director/director-connection.c

index a0d15975dad11b9e09e5ac5825a66ea6755d2907..fd301b795b92ecb6c304fed049468808a607fa12 100644 (file)
@@ -824,9 +824,16 @@ director_cmd_user_weak(struct director_connection *conn,
                return TRUE;
        }
 
-       if (ret == 0)
-               ;
-       else if (dir_host == conn->dir->self_host) {
+       if (ret == 0) {
+               /* First time we're seeing this - forward it to others also.
+                  We'll want to do it even if the user was already marked as
+                  weak, because otherwise if two directors mark the user weak
+                  at the same time both the USER-WEAK notifications reach
+                  only half the directors until they collide and neither one
+                  finishes going through the whole ring marking the user
+                  non-weak. */
+               weak_forward = TRUE;
+       } else if (dir_host == conn->dir->self_host) {
                /* We originated this USER-WEAK request. The entire ring has seen
                   it and there weren't any conflicts. Make the user non-weak. */
                dir_debug("user refresh: %u Our USER-WEAK seen by the entire ring",