]> git.ipfire.org Git - thirdparty/dovecot/core.git/commitdiff
auth: Use fewer syscalls for sending user list.
authorTimo Sirainen <tss@iki.fi>
Thu, 11 Jul 2013 23:29:00 +0000 (02:29 +0300)
committerTimo Sirainen <tss@iki.fi>
Thu, 11 Jul 2013 23:29:00 +0000 (02:29 +0300)
src/auth/auth-master-connection.c
src/auth/auth-worker-client.c

index c399d93dce04d5725b6bf6178295eb31c7ea2f41..135b5421221ac2ff818f5b14a17f9a1bbc738549 100644 (file)
@@ -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);
index a39d0ac2b713aa59f69074940f3b71161f355efa..9667ff285c93e71cdb4c70637718adb4852ab3d7 100644 (file)
@@ -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->