Hi Timo,

The below solved the problem for me as far as I can tell

I was getting a EPIPE about 1:30 dsync runs over the socket. I have received 0 
in 10000 runs with this change.
https://github.com/dovecot/core/pull/10 
<https://github.com/dovecot/core/pull/10>

You know the code much better then I do so you might have a better way?


Also I have a commit to address the constant warnings when the prefix is set to 
INBOX. with the
quota_quota plugin here:
https://github.com/dovecot/core/pull/7 <https://github.com/dovecot/core/pull/7>

Thanks
-Nick

Timo Sirainen tss at iki.fi  
<mailto:dovecot%40dovecot.org?Subject=Re%3A%20BUG%3F%3A%20Dsync%20over%20piped%20process%20%28DSYNC_RUN_TYPE_CMD%29%3A%20EPIPE%20if%20X%0A%09%28done%29%20is%20received%20in%20another%20write%20after%20F%20%28finish%29&In-Reply-To=%3CA5A2C866-9A65-439B-B232-231202B94525%40iki.fi%3E>Thu
 May 19 23:15:18 UTC 2016
> 
> On 19 May 2016, at 03:54, J. Nick Koston <nick at cpanel.net 
> <http://dovecot.org/cgi-bin/mailman/listinfo/dovecot>> wrote:
> > 
> > Hi,
> > 
> > It appears that dsync closes the file handle once it gets the F (finish) 
> > response even if it hasn’t received the X (done) response. 
> > If the X (done) response gets delivered in another write this will generate 
> > EPIPE in the connected process.
> > 
> > This is much easier to replicate over SSL, however the trace is provided 
> > without SSL since its easier to see whats going on.
> 
> Do you see this as causing some problem? I think this is intentional. The 
> F(inish) tells the final response whether everything was OK or not, so all 
> the work is done after that. The 'X' is described in code as:
> 
>               /* notify remote that we're closing. this is mainly to avoid
>                  "read() failed: EOF" errors on failing dsyncs */
>               o_stream_nsend_str(ibc->output,
>                       t_strdup_printf("%c\n", items[ITEM_DONE].chr));
> 
> and on the receiving side:
> 
>       if (line[0] == items[ITEM_DONE].chr) {
>               /* remote cleanly closed the connection, possibly because of
>                  some failure (which it should have logged). we don't want to
>                  log any stream errors anyway after this. */
>               dsync_ibc_stream_stop(ibc);
>               return DSYNC_IBC_RECV_RET_TRYAGAIN;
>       }
> 
> So I think it only matters in error handling.

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to