Mercurial > hg > nginx
comparison src/core/ngx_resolver.c @ 5582:545a4d393e2f
Resolver: properly handle connect() failures.
If initial attempt to connect() the UDP socket failed, e.g.
due to network unreachable, no further attempts were made.
author | Ruslan Ermilov <ru@nginx.com> |
---|---|
date | Thu, 20 Feb 2014 17:27:09 +0400 |
parents | d091d16ed398 |
children | 957d734362ed |
comparison
equal
deleted
inserted
replaced
5581:4dee5ad51e9e | 5582:545a4d393e2f |
---|---|
3035 | 3035 |
3036 if (ngx_nonblocking(s) == -1) { | 3036 if (ngx_nonblocking(s) == -1) { |
3037 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno, | 3037 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno, |
3038 ngx_nonblocking_n " failed"); | 3038 ngx_nonblocking_n " failed"); |
3039 | 3039 |
3040 ngx_free_connection(c); | 3040 goto failed; |
3041 | |
3042 if (ngx_close_socket(s) == -1) { | |
3043 ngx_log_error(NGX_LOG_ALERT, &uc->log, ngx_socket_errno, | |
3044 ngx_close_socket_n " failed"); | |
3045 } | |
3046 | |
3047 return NGX_ERROR; | |
3048 } | 3041 } |
3049 | 3042 |
3050 rev = c->read; | 3043 rev = c->read; |
3051 wev = c->write; | 3044 wev = c->write; |
3052 | 3045 |
3077 | 3070 |
3078 if (rc == -1) { | 3071 if (rc == -1) { |
3079 ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno, | 3072 ngx_log_error(NGX_LOG_CRIT, &uc->log, ngx_socket_errno, |
3080 "connect() failed"); | 3073 "connect() failed"); |
3081 | 3074 |
3082 return NGX_ERROR; | 3075 goto failed; |
3083 } | 3076 } |
3084 | 3077 |
3085 /* UDP sockets are always ready to write */ | 3078 /* UDP sockets are always ready to write */ |
3086 wev->ready = 1; | 3079 wev->ready = 1; |
3087 | 3080 |
3091 /* kqueue, epoll */ NGX_CLEAR_EVENT: | 3084 /* kqueue, epoll */ NGX_CLEAR_EVENT: |
3092 /* select, poll, /dev/poll */ NGX_LEVEL_EVENT; | 3085 /* select, poll, /dev/poll */ NGX_LEVEL_EVENT; |
3093 /* eventport event type has no meaning: oneshot only */ | 3086 /* eventport event type has no meaning: oneshot only */ |
3094 | 3087 |
3095 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { | 3088 if (ngx_add_event(rev, NGX_READ_EVENT, event) != NGX_OK) { |
3096 return NGX_ERROR; | 3089 goto failed; |
3097 } | 3090 } |
3098 | 3091 |
3099 } else { | 3092 } else { |
3100 /* rtsig */ | 3093 /* rtsig */ |
3101 | 3094 |
3102 if (ngx_add_conn(c) == NGX_ERROR) { | 3095 if (ngx_add_conn(c) == NGX_ERROR) { |
3103 return NGX_ERROR; | 3096 goto failed; |
3104 } | 3097 } |
3105 } | 3098 } |
3106 | 3099 |
3107 return NGX_OK; | 3100 return NGX_OK; |
3108 } | 3101 |
3102 failed: | |
3103 | |
3104 ngx_close_connection(c); | |
3105 uc->connection = NULL; | |
3106 | |
3107 return NGX_ERROR; | |
3108 } |