Mercurial > hg > nginx
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 } |