]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dict: Pipelined iteration replies may have been hanging.
authorTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 1 Jun 2016 21:52:37 +0000 (00:52 +0300)
committerTimo Sirainen <timo.sirainen@dovecot.fi>
Wed, 1 Jun 2016 21:52:37 +0000 (00:52 +0300)
For example:
 - lookup start
 - iterate start
 - iterate finished, but can't reply yet
 - lookup finished
 - iterate reply can be sent now, but wasn't previously

src/dict/dict-commands.c

index 8f13113e5289017bc697b211878a9fc8d6eb354c..44ec866055a323e8f933419ad7bae14b606f8403 100644 (file)
@@ -34,6 +34,8 @@ struct dict_connection_cmd {
 
 struct dict_command_stats cmd_stats;
 
+static int cmd_iterate_flush(struct dict_connection_cmd *cmd);
+
 static void dict_connection_cmd_output_more(struct dict_connection_cmd *cmd);
 
 static void dict_connection_cmd_free(struct dict_connection_cmd *cmd)
@@ -76,6 +78,10 @@ static void dict_connection_cmds_flush(struct dict_connection *conn)
                first_cmdp = array_idx(&conn->cmds, 0);
                cmd = *first_cmdp;
 
+               /* we may be able to start outputting iterations now. */
+               if (cmd->iter != NULL)
+                       (void)cmd_iterate_flush(cmd);
+
                if (cmd->reply == NULL) {
                        /* command not finished yet */
                        break;