dovecot-2.2: auth: Use fewer syscalls for sending user list.

dovecot at dovecot.org dovecot at dovecot.org
Fri Jul 12 02:30:21 EEST 2013


details:   http://hg.dovecot.org/dovecot-2.2/rev/86275093e7b3
changeset: 16611:86275093e7b3
user:      Timo Sirainen <tss at iki.fi>
date:      Fri Jul 12 02:29:00 2013 +0300
description:
auth: Use fewer syscalls for sending user list.

diffstat:

 src/auth/auth-master-connection.c |   6 +++++-
 src/auth/auth-worker-client.c     |  10 +++++++++-
 2 files changed, 14 insertions(+), 2 deletions(-)

diffs (70 lines):

diff -r 328bc770af54 -r 86275093e7b3 src/auth/auth-master-connection.c
--- a/src/auth/auth-master-connection.c	Fri Jul 12 02:26:44 2013 +0300
+++ b/src/auth/auth-master-connection.c	Fri Jul 12 02:29:00 2013 +0300
@@ -432,6 +432,7 @@
 
 	if (ctx->iter != NULL)
 		(void)userdb_blocking_iter_deinit(&ctx->iter);
+	o_stream_uncork(ctx->conn->output);
 	o_stream_unset_flush_callback(ctx->conn->output);
 	auth_request_unref(&ctx->auth_request);
 	auth_master_connection_unref(&ctx->conn);
@@ -492,12 +493,14 @@
 				      str_tabescape(user));
 		ret = o_stream_send_str(ctx->conn->output, str);
 	} T_END;
+	if (o_stream_get_buffer_used_size(ctx->conn->output) >= MAX_OUTBUF_SIZE)
+		ret = o_stream_flush(ctx->conn->output);
 	if (ret < 0) {
 		/* disconnected, don't bother finishing */
 		master_input_list_finish(ctx);
 		return;
 	}
-	if (o_stream_get_buffer_used_size(ctx->conn->output) == 0)
+	if (o_stream_get_buffer_used_size(ctx->conn->output) < MAX_OUTBUF_SIZE)
 		userdb_blocking_iter_next(ctx->iter);
 }
 
@@ -569,6 +572,7 @@
 	ctx->auth_request->userdb = userdb;
 
 	io_remove(&conn->io);
+	o_stream_cork(conn->output);
 	o_stream_set_flush_callback(conn->output, master_output_list, ctx);
 	ctx->iter = userdb_blocking_iter_init(auth_request,
 					      master_input_list_callback, ctx);
diff -r 328bc770af54 -r 86275093e7b3 src/auth/auth-worker-client.c
--- a/src/auth/auth-worker-client.c	Fri Jul 12 02:26:44 2013 +0300
+++ b/src/auth/auth-worker-client.c	Fri Jul 12 02:29:00 2013 +0300
@@ -421,6 +421,7 @@
 	auth_worker_send_reply(client, str);
 
 	client->io = io_add(client->fd, IO_READ, auth_worker_input, client);
+	o_stream_uncork(ctx->client->output);
 	o_stream_set_flush_callback(client->output, auth_worker_output, client);
 	auth_request_unref(&ctx->auth_request);
 	auth_worker_client_unref(&client);
@@ -459,8 +460,14 @@
 			ctx->auth_request->userdb->userdb->iface->
 				iterate_next(ctx->iter);
 		} T_END;
+		if (o_stream_get_buffer_used_size(ctx->client->output) > OUTBUF_THROTTLE_SIZE) {
+			if (o_stream_flush(ctx->client->output) < 0) {
+				ctx->done = TRUE;
+				break;
+			}
+		}
 	} while (ctx->sent &&
-		 o_stream_get_buffer_used_size(ctx->client->output) == 0);
+		 o_stream_get_buffer_used_size(ctx->client->output) <= OUTBUF_THROTTLE_SIZE);
 	ctx->sending = FALSE;
 	if (ctx->done)
 		list_iter_deinit(ctx);
@@ -513,6 +520,7 @@
 	}
 
 	io_remove(&ctx->client->io);
+	o_stream_cork(ctx->client->output);
 	o_stream_set_flush_callback(ctx->client->output,
 				    auth_worker_list_output, ctx);
 	ctx->iter = ctx->auth_request->userdb->userdb->iface->


More information about the dovecot-cvs mailing list