comparison src/core/ngx_syslog.c @ 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 68f64bc17fa4
comparison
equal deleted inserted replaced
5857:2cb5275bf5e7 5858:02c2352d5b01
259 259
260 260
261 ssize_t 261 ssize_t
262 ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len) 262 ngx_syslog_send(ngx_syslog_peer_t *peer, u_char *buf, size_t len)
263 { 263 {
264 ssize_t n;
265
264 if (peer->conn.fd == (ngx_socket_t) -1) { 266 if (peer->conn.fd == (ngx_socket_t) -1) {
265 if (ngx_syslog_init_peer(peer) != NGX_OK) { 267 if (ngx_syslog_init_peer(peer) != NGX_OK) {
266 return NGX_ERROR; 268 return NGX_ERROR;
267 } 269 }
268 } 270 }
269 271
270 /* log syslog socket events with valid log */ 272 /* log syslog socket events with valid log */
271 peer->conn.log = ngx_cycle->log; 273 peer->conn.log = ngx_cycle->log;
272 274
273 if (ngx_send) { 275 if (ngx_send) {
274 return ngx_send(&peer->conn, buf, len); 276 n = ngx_send(&peer->conn, buf, len);
275 277
276 } else { 278 } else {
277 /* event module has not yet set ngx_io */ 279 /* event module has not yet set ngx_io */
278 return ngx_os_io.send(&peer->conn, buf, len); 280 n = ngx_os_io.send(&peer->conn, buf, len);
279 } 281 }
282
283 #if (NGX_HAVE_UNIX_DOMAIN)
284
285 if (n == NGX_ERROR && peer->server.sockaddr->sa_family == AF_UNIX) {
286
287 if (ngx_close_socket(peer->conn.fd) == -1) {
288 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,
289 ngx_close_socket_n " failed");
290 }
291
292 peer->conn.fd = (ngx_socket_t) -1;
293 }
294
295 #endif
296
297 return n;
280 } 298 }
281 299
282 300
283 static ngx_int_t 301 static ngx_int_t
284 ngx_syslog_init_peer(ngx_syslog_peer_t *peer) 302 ngx_syslog_init_peer(ngx_syslog_peer_t *peer)
342 ngx_syslog_peer_t *peer = data; 360 ngx_syslog_peer_t *peer = data;
343 361
344 /* prevents further use of this peer */ 362 /* prevents further use of this peer */
345 peer->busy = 1; 363 peer->busy = 1;
346 364
365 if (peer->conn.fd == (ngx_socket_t) -1) {
366 return;
367 }
368
347 if (ngx_close_socket(peer->conn.fd) == -1) { 369 if (ngx_close_socket(peer->conn.fd) == -1) {
348 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno, 370 ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, ngx_socket_errno,
349 ngx_close_socket_n " failed"); 371 ngx_close_socket_n " failed");
350 } 372 }
351 } 373 }