From bd8eacf52d22c37b2ca7e757a618aec0119467f7 Mon Sep 17 00:00:00 2001 From: Igor Sysoev Date: Thu, 12 Jul 2018 18:29:22 +0300 Subject: Fixed socket write error handling. --- src/nxt_conn_write.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) (limited to 'src') diff --git a/src/nxt_conn_write.c b/src/nxt_conn_write.c index f40f9c2f..ac73bb9e 100644 --- a/src/nxt_conn_write.c +++ b/src/nxt_conn_write.c @@ -24,6 +24,10 @@ nxt_conn_io_write(nxt_task_t *task, void *obj, void *data) nxt_debug(task, "conn write fd:%d", c->socket.fd); + if (c->socket.error != 0) { + goto error; + } + if (!c->socket.write_ready || c->write == NULL) { return; } @@ -109,22 +113,25 @@ nxt_conn_io_write(nxt_task_t *task, void *obj, void *data) } if (ret == 0 || sb.sent != 0) { - /* "ret == 0" means a sync buffer was processed. */ + /* + * ret == 0 means a sync buffer was processed. + * ret == NXT_ERROR is ignored here if some data was sent, + * the error will be handled on the next nxt_conn_write() call. + */ c->sent += sb.sent; nxt_work_queue_add(c->write_work_queue, c->write_state->ready_handler, task, c, data); - /* - * Fall through if first operations were - * successful but the last one failed. - */ + return; } - if (nxt_slow_path(ret == NXT_ERROR)) { - nxt_fd_event_block_write(engine, &c->socket); + /* ret == NXT_ERROR */ - nxt_work_queue_add(c->write_work_queue, c->write_state->error_handler, - task, c, data); - } + nxt_fd_event_block_write(engine, &c->socket); + +error: + + nxt_work_queue_add(c->write_work_queue, c->write_state->error_handler, + task, c, data); } -- cgit