Re: [Dovecot] [Patch] Fix delay on imao-append

2008-06-13 Thread Bruno Prémont
On Fri, 13 Jun 2008 Timo Sirainen <[EMAIL PROTECTED]> wrote:
> On Fri, 2008-06-13 at 11:04 +0200, Bruno Prémont wrote:
> > The attached patch makes dovecot send the whole answer in a single
> > packet, thus not triggering the delay issue.
> 
> Although the patch works for this APPEND case, it probably adds delays
> when other commands are pipelined, because tagged replies can be sent
> in the middle of processing multiple commands.
> 
> Could you try if the attached patch fixes this also?

This patch works for me, it also avoids the delay seen on a different
install which produces EXISTS and RECENT messages:
  * n EXISTS\r\n

  * n RECENT\r\n
   OK [APPENDUID m n] Append completed.\r\n

Here EXISTS was sent in a separate packet, waiting for ACK then finally
sending RECENT and end tag in a second packet.

Bruno Prémont
RESTENA Foundation


signature.asc
Description: PGP signature


Re: [Dovecot] [Patch] Fix delay on imao-append

2008-06-13 Thread Timo Sirainen
On Fri, 2008-06-13 at 11:04 +0200, Bruno Prémont wrote:
> The attached patch makes dovecot send the whole answer in a single
> packet, thus not triggering the delay issue.

Although the patch works for this APPEND case, it probably adds delays
when other commands are pipelined, because tagged replies can be sent in
the middle of processing multiple commands.

Could you try if the attached patch fixes this also?

diff -r ad933a630f77 src/imap/cmd-append.c
--- a/src/imap/cmd-append.c	Fri Jun 13 12:04:01 2008 +0300
+++ b/src/imap/cmd-append.c	Fri Jun 13 12:25:26 2008 +0300
@@ -38,6 +38,7 @@
 {
 	struct cmd_append_context *ctx = cmd->context;
 	struct client *client = cmd->client;
+	struct ostream *output = client->output;
 	bool finished;
 
 	i_assert(!client->destroyed);
@@ -73,15 +74,17 @@
 		return;
 	}
 
-	o_stream_cork(client->output);
+	o_stream_ref(output);
+	o_stream_cork(output);
 	finished = cmd->func(cmd);
-	o_stream_uncork(client->output);
 	if (!finished && cmd->state != CLIENT_COMMAND_STATE_DONE)
 		(void)client_handle_unfinished_cmd(cmd);
 	else
 		client_command_free(&cmd);
 	(void)cmd_sync_delayed(client);
 	client_continue_pending_input(&client);
+	o_stream_uncork(output);
+	o_stream_unref(&output);
 }
 
 /* Returns -1 = error, 0 = need more data, 1 = successful. flags and


signature.asc
Description: This is a digitally signed message part


[Dovecot] [Patch] Fix delay on imao-append

2008-06-13 Thread Bruno Prémont
Dovecot version: 1.1-rc8, 1.1-rc9
System: Linux-2.6.2x
User-Agent: claws-mail-3.3 and 3.4

When appending messages (e.g. copy from mailclient local folder or
second server to dovecot imap folder) dovecot answers with:
 OK [APPENDUID  ] Append completed\r\n

This answer often reaches the client as two or more TCP packets, the
client (when not using TCP_NODELAY on its socket) ACKs with some delay.

When copying lots of (small) messages this delay has a very negative
impact on copy time even though there are lots of network and system
resources available.

Sample sniffer output on client host:
   ...
1  0.  clawsdovecot  IMAP  Request: 14639 APPEND "Test" (\Seen) {853}
2  0.0033  dovecot  clawsIMAP  Response: +OK
3  0.0034  clawsdovecot  IMAP  Request: 
4  0.0096  dovecot  clawsIMAP  Response: 14639
5  0.0467  clawsdovecot  TCP   33453 > imap [ACK]
6  0.0481  dovecot  clawsIMAP  Response:  OK [APPENDUID 1204729411 2] 
Append Completed.
7  0.0481  clawsdovecot  TCP   33453 > imap [ACK]
   ...

The delay of about 35ms between packet 4 and its ACK in packet 5 causes
copies from client to server to be extremely slow. (Client and server on
same 100Mb LAN, same result if client and server are on same host)

The attached patch makes dovecot send the whole answer in a single
packet, thus not triggering the delay issue.

As far as I found out the delay is generated by Naggle algorithm, this
algorithm being used by Linux TCP stack for small packets with the aim of
improving payload/overhead share.

Bruno Prémont
RESTENA Foundation
diff -NurpP dovecot-1.1.rc8-orig/src/imap/client.c dovecot-1.1.rc8/src/imap/client.c
--- dovecot-1.1.rc8-orig/src/imap/client.c	2008-05-31 12:58:19.0 +0200
+++ dovecot-1.1.rc8/src/imap/client.c	2008-06-10 15:44:50.0 +0200
@@ -245,10 +245,12 @@ void client_send_tagline(struct client_c
 	if (tag == NULL || *tag == '\0')
 		tag = "*";
 
+	o_stream_cork(client->output);
 	(void)o_stream_send_str(client->output, tag);
 	(void)o_stream_send(client->output, " ", 1);
 	(void)o_stream_send_str(client->output, data);
 	(void)o_stream_send(client->output, "\r\n", 2);
+	o_stream_uncork(client->output);
 
 	client->last_output = ioloop_time;
 }


signature.asc
Description: PGP signature