From 1ce47e48d7231da6f18f02eab6bab6451b4ef12a Mon Sep 17 00:00:00 2001 From: Timo Sirainen Date: Fri, 12 Jul 2013 02:29:00 +0300 Subject: [PATCH] auth: Use fewer syscalls for sending user list. --- src/auth/auth-master-connection.c | 6 +++++- src/auth/auth-worker-client.c | 10 +++++++++- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/src/auth/auth-master-connection.c b/src/auth/auth-master-connection.c index c399d93dce..135b542122 100644 --- a/src/auth/auth-master-connection.c +++ b/src/auth/auth-master-connection.c @@ -432,6 +432,7 @@ static void master_input_list_finish(struct master_list_iter_ctx *ctx) 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 @@ static void master_input_list_callback(const char *user, void *context) 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 @@ master_input_list(struct auth_master_connection *conn, const char *args) 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 --git a/src/auth/auth-worker-client.c b/src/auth/auth-worker-client.c index a39d0ac2b7..9667ff285c 100644 --- a/src/auth/auth-worker-client.c +++ b/src/auth/auth-worker-client.c @@ -421,6 +421,7 @@ static void list_iter_deinit(struct auth_worker_list_context *ctx) 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 @@ static void list_iter_callback(const char *user, void *context) 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 @@ auth_worker_handle_list(struct auth_worker_client *client, } 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-> -- 2.47.3