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
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
+++ b/src/core/ngx_syslog.c
@@ -261,6 +261,8 @@ ngx_syslog_writer(ngx_log_t *log, ngx_ui
 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 @@ ngx_syslog_send(ngx_syslog_peer_t *peer,
     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 @@ ngx_syslog_cleanup(void *data)
     /* 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");