Mercurial > nginx
changeset 5858:02c2352d5b01
Syslog: improved error handling of unix domain sockets.
If a syslog daemon is restarted and the unix socket is used, further logging
might stop to work. In case of send error, socket is closed, forcing
a reconnection at the next logging attempt.
author | Vladimir Homutov <vl@nginx.com> |
---|---|
date | Tue, 26 Aug 2014 14:56:54 +0400 (2014-08-26) |
parents | 2cb5275bf5e7 |
children | ad9116427acf |
files | src/core/ngx_syslog.c |
diffstat | 1 files changed, 24 insertions(+), 2 deletions(-) [+] |
line wrap: on
line diff
--- a/src/core/ngx_syslog.c Mon Sep 01 17:55:07 2014 +0400 +++ b/src/core/ngx_syslog.c Tue Aug 26 14:56:54 2014 +0400 @@ -261,6 +261,8 @@ ssize_t ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len) { + ssize_t n; + if (peer->conn.fd == (ngx_socket_t) -1) { if (ngx_syslog_init_peer(peer) != NGX_OK) { return NGX_ERROR; @@ -271,12 +273,28 @@ peer->conn.log = ngx_cycle->log; if (ngx_send) { - return ngx_send(&peer->conn, buf, len); + n = ngx_send(&peer->conn, buf, len); } else { /* event module has not yet set ngx_io */ - return ngx_os_io.send(&peer->conn, buf, len); + n = ngx_os_io.send(&peer->conn, buf, len); } + +#if (NGX_HAVE_UNIX_DOMAIN) + + if (n == NGX_ERROR && peer->server.sockaddr->sa_family == AF_UNIX) { + + if (ngx_close_socket(peer->conn.fd) == -1) { + ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, + ngx_close_socket_n " failed"); + } + + peer->conn.fd = (ngx_socket_t) -1; + } + +#endif + + return n; } @@ -344,6 +362,10 @@ /* prevents further use of this peer */ peer->busy = 1; + if (peer->conn.fd == (ngx_socket_t) -1) { + return; + } + if (ngx_close_socket(peer->conn.fd) == -1) { ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, ngx_close_socket_n " failed");