]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
dsync: Fixed hangs with remote dsyncing
authorTimo Sirainen <tss@iki.fi>
Fri, 14 Dec 2012 09:17:19 +0000 (11:17 +0200)
committerTimo Sirainen <tss@iki.fi>
Fri, 14 Dec 2012 09:17:19 +0000 (11:17 +0200)
src/doveadm/dsync/dsync-ibc-stream.c

index e8c9960a814b986981c21ed9cc24090ef33bfbb1..3fe7550e19f77c8c242cf8fe1f2137882c08e70d 100644 (file)
@@ -143,7 +143,11 @@ static void dsync_ibc_stream_stop(struct dsync_ibc_stream *ibc)
 
 static int dsync_ibc_stream_read_mail_stream(struct dsync_ibc_stream *ibc)
 {
-       if (i_stream_read(ibc->mail_input) < 0) {
+       while (i_stream_read(ibc->mail_input) > 0) {
+               i_stream_skip(ibc->mail_input,
+                             i_stream_get_data_size(ibc->mail_input));
+       }
+       if (ibc->mail_input->eof) {
                if (ibc->mail_input->stream_errno != 0) {
                        errno = ibc->mail_input->stream_errno;
                        i_error("dsync(%s): read() failed: %m", ibc->name);
@@ -153,10 +157,10 @@ static int dsync_ibc_stream_read_mail_stream(struct dsync_ibc_stream *ibc)
                /* finished reading the mail stream */
                i_assert(ibc->mail_input->eof);
                i_stream_seek(ibc->mail_input, 0);
+               ibc->has_pending_data = TRUE;
                ibc->mail_input = NULL;
                return 1;
        }
-       i_stream_skip(ibc->mail_input, i_stream_get_data_size(ibc->mail_input));
        return 0;
 }