
cherokee at cherokee-project
Sep 14, 2009, 6:25 AM
Post #1 of 1
(188 views)
Permalink
|
|
[3661] cherokee/trunk/cherokee: This patch improves the gethostbyname() usage in Cherokee.
|
|
Revision: 3661 http://svn.cherokee-project.com/changeset/3661 Author: alo Date: 2009-09-14 15:25:30 +0200 (Mon, 14 Sep 2009) Log Message: ----------- This patch improves the gethostbyname() usage in Cherokee. Besides, it set the proxy handler to use the "resolve_cache" of the server. Modified Paths: -------------- cherokee/trunk/cherokee/access.c cherokee/trunk/cherokee/proxy_hosts.c cherokee/trunk/cherokee/resolv_cache.c cherokee/trunk/cherokee/resolv_cache.h cherokee/trunk/cherokee/source.c cherokee/trunk/cherokee/util.c Modified: cherokee/trunk/cherokee/access.c =================================================================== --- cherokee/trunk/cherokee/access.c 2009-09-14 10:33:47 UTC (rev 3660) +++ cherokee/trunk/cherokee/access.c 2009-09-14 13:25:30 UTC (rev 3661) @@ -331,11 +331,14 @@ ret_t ret; const char *ip; cherokee_resolv_cache_t *resolv; + cherokee_buffer_t domain_buf = CHEROKEE_BUF_INIT; + cherokee_buffer_fake (&domain_buf, domain, strlen(domain)); + ret = cherokee_resolv_cache_get_default (&resolv); if (unlikely(ret!=ret_ok)) return ret; - ret = cherokee_resolv_cache_get_ipstr (resolv, domain, &ip); + ret = cherokee_resolv_cache_get_ipstr (resolv, &domain_buf, &ip); if (unlikely(ret!=ret_ok)) return ret; TRACE (ENTRIES, "Access: domain '%s'\n", domain); Modified: cherokee/trunk/cherokee/proxy_hosts.c =================================================================== --- cherokee/trunk/cherokee/proxy_hosts.c 2009-09-14 10:33:47 UTC (rev 3660) +++ cherokee/trunk/cherokee/proxy_hosts.c 2009-09-14 13:25:30 UTC (rev 3661) @@ -24,6 +24,7 @@ #include "common-internal.h" #include "proxy_hosts.h" +#include "resolv_cache.h" #include "util.h" @@ -355,7 +356,8 @@ cherokee_proxy_util_init_socket (cherokee_socket_t *socket, cherokee_source_t *src) { - ret_t ret; + ret_t ret; + cherokee_resolv_cache_t *resolv; /* Family */ if (cherokee_string_is_ipv6 (&src->host)) { @@ -371,14 +373,16 @@ SOCKET_SIN_PORT(socket) = htons (src->port); /* IP host */ - ret = cherokee_socket_pton (socket, &src->host); - if (ret != ret_ok) { - ret = cherokee_socket_gethostbyname (socket, &src->host); - if (unlikely(ret != ret_ok)) { - return ret_error; - } - } + ret = cherokee_resolv_cache_get_default (&resolv); + if (unlikely (ret != ret_ok)) { + return ret_error; + } + ret = cherokee_resolv_cache_get_host (resolv, &src->host, socket); + if (ret != ret_ok) { + return ret_error; + } + /* Set a few properties */ cherokee_fd_set_closexec (socket->socket); cherokee_fd_set_nonblocking (socket->socket, true); Modified: cherokee/trunk/cherokee/resolv_cache.c =================================================================== --- cherokee/trunk/cherokee/resolv_cache.c 2009-09-14 10:33:47 UTC (rev 3660) +++ cherokee/trunk/cherokee/resolv_cache.c 2009-09-14 13:25:30 UTC (rev 3661) @@ -35,6 +35,7 @@ #include "util.h" #include "avl.h" #include "socket.h" +#include "bogotime.h" typedef struct { @@ -76,16 +77,38 @@ static ret_t -entry_fill_up (cherokee_resolv_cache_entry_t *entry, const char *domain) +entry_fill_up (cherokee_resolv_cache_entry_t *entry, + cherokee_buffer_t *domain) { - ret_t ret; - char *tmp; + ret_t ret; + char *tmp; + time_t eagain_at = 0; - ret = cherokee_gethostbyname (domain, &entry->addr); - if (unlikely (ret != ret_ok)) return ret; + while (true) { + ret = cherokee_gethostbyname (domain->buf, &entry->addr); + if (ret == ret_ok) { + break; + } else if (ret == ret_eagain) { + if (eagain_at == 0) { + eagain_at = cherokee_bogonow_now; + } else if (cherokee_bogonow_now > eagain_at + 3) { + LOG_WARNING ("Timed out while resolving '%s'\n", domain->buf); + return ret_error; + } + + CHEROKEE_THREAD_YIELD(); + continue; + + } else { + return ret_error; + } + } + tmp = inet_ntoa (entry->addr); - if (tmp == NULL) return ret; + if (tmp == NULL) { + return ret_error; + } cherokee_buffer_add (&entry->ip_str, tmp, strlen(tmp)); return ret_ok; @@ -151,7 +174,9 @@ static ret_t -table_add_new_entry (cherokee_resolv_cache_t *resolv, const char *domain, cherokee_resolv_cache_entry_t **entry) +table_add_new_entry (cherokee_resolv_cache_t *resolv, + cherokee_buffer_t *domain, + cherokee_resolv_cache_entry_t **entry) { ret_t ret; cherokee_resolv_cache_entry_t *n = NULL; @@ -173,7 +198,7 @@ /* Add it to the table */ CHEROKEE_RWLOCK_WRITER (&resolv->lock); - ret = cherokee_avl_add_ptr (&resolv->table, (char *)domain, (void **)n); + ret = cherokee_avl_add (&resolv->table, domain, (void **)n); CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); *entry = n; @@ -182,7 +207,9 @@ ret_t -cherokee_resolv_cache_get_ipstr (cherokee_resolv_cache_t *resolv, const char *domain, const char **ip) +cherokee_resolv_cache_get_ipstr (cherokee_resolv_cache_t *resolv, + cherokee_buffer_t *domain, + const char **ip) { ret_t ret; cherokee_resolv_cache_entry_t *entry = NULL; @@ -190,14 +217,16 @@ /* Look for the name in the cache */ CHEROKEE_RWLOCK_READER (&resolv->lock); - ret = cherokee_avl_get_ptr (&resolv->table, (char *)domain, (void **)&entry); + ret = cherokee_avl_get (&resolv->table, domain, (void **)&entry); CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); if (ret != ret_ok) { /* Bad luck: it wasn't cached */ ret = table_add_new_entry (resolv, domain, &entry); - if (ret != ret_ok) return ret; + if (ret != ret_ok) { + return ret; + } } /* Return the ip string @@ -208,7 +237,9 @@ ret_t -cherokee_resolv_cache_get_host (cherokee_resolv_cache_t *resolv, const char *domain, void *sock_) +cherokee_resolv_cache_get_host (cherokee_resolv_cache_t *resolv, + cherokee_buffer_t *domain, + void *sock_) { ret_t ret; cherokee_socket_t *sock = sock_; @@ -217,14 +248,16 @@ /* Look for the name in the cache */ CHEROKEE_RWLOCK_READER (&resolv->lock); - ret = cherokee_avl_get_ptr (&resolv->table, (char *)domain, (void **)&entry); + ret = cherokee_avl_get (&resolv->table, domain, (void **)&entry); CHEROKEE_RWLOCK_UNLOCK (&resolv->lock); if (ret != ret_ok) { /* Bad luck: it wasn't cached */ ret = table_add_new_entry (resolv, domain, &entry); - if (ret != ret_ok) return ret; + if (ret != ret_ok) { + return ret; + } } /* Copy the address Modified: cherokee/trunk/cherokee/resolv_cache.h =================================================================== --- cherokee/trunk/cherokee/resolv_cache.h 2009-09-14 10:33:47 UTC (rev 3660) +++ cherokee/trunk/cherokee/resolv_cache.h 2009-09-14 13:25:30 UTC (rev 3661) @@ -44,8 +44,8 @@ ret_t cherokee_resolv_cache_mrproper (cherokee_resolv_cache_t *resolv); ret_t cherokee_resolv_cache_clean (cherokee_resolv_cache_t *resolv); -ret_t cherokee_resolv_cache_get_ipstr (cherokee_resolv_cache_t *resolv, const char *domain, const char **ip); -ret_t cherokee_resolv_cache_get_host (cherokee_resolv_cache_t *resolv, const char *domain, void *sock); +ret_t cherokee_resolv_cache_get_ipstr (cherokee_resolv_cache_t *resolv, cherokee_buffer_t *domain, const char **ip); +ret_t cherokee_resolv_cache_get_host (cherokee_resolv_cache_t *resolv, cherokee_buffer_t *domain, void *sock); CHEROKEE_END_DECLS Modified: cherokee/trunk/cherokee/source.c =================================================================== --- cherokee/trunk/cherokee/source.c 2009-09-14 10:33:47 UTC (rev 3660) +++ cherokee/trunk/cherokee/source.c 2009-09-14 13:25:30 UTC (rev 3661) @@ -121,7 +121,7 @@ } /* Query the host */ - ret = cherokee_resolv_cache_get_host (resolv, src->host.buf, sock); + ret = cherokee_resolv_cache_get_host (resolv, &src->host, sock); if (unlikely (ret != ret_ok)) { return ret; } @@ -201,8 +201,9 @@ /* Host name */ ret = cherokee_parse_host (host, &src->host, &src->port); - if (unlikely (ret != ret_ok)) + if (unlikely (ret != ret_ok)) { return ret_error; + } return ret_ok; } Modified: cherokee/trunk/cherokee/util.c =================================================================== --- cherokee/trunk/cherokee/util.c 2009-09-14 10:33:47 UTC (rev 3660) +++ cherokee/trunk/cherokee/util.c 2009-09-14 13:25:30 UTC (rev 3661) @@ -689,10 +689,16 @@ struct hostent *host; CHEROKEE_MUTEX_LOCK (&__global_gethostbyname_mutex); + /* Resolv the host name */ host = gethostbyname (hostname); if (host == NULL) { + if (h_errno == TRY_AGAIN) { + CHEROKEE_MUTEX_UNLOCK (&__global_gethostbyname_mutex); + return ret_eagain; + } + CHEROKEE_MUTEX_UNLOCK (&__global_gethostbyname_mutex); return ret_error; } @@ -711,11 +717,10 @@ # define GETHOSTBYNAME_R_BUF_LEN 512 int r; - int h_errnop; struct hostent hs; - struct hostent *hp = NULL; + int h_errnop = 0; + struct hostent *hp = NULL; char tmp[GETHOSTBYNAME_R_BUF_LEN]; - # if defined(SOLARIS) || defined(IRIX) /* Solaris 10: @@ -723,11 +728,14 @@ * (const char *, struct hostent *, char *, int, int *h_errnop); */ hp = gethostbyname_r (hostname, &hs, tmp, - GETHOSTBYNAME_R_BUF_LEN - 1, &h_errnop); + GETHOSTBYNAME_R_BUF_LEN - 1, &h_errnop); - if (hp == NULL) + if (hp == NULL) { + if (h_errnop == TRY_AGAIN) { + return ret_eagain; + } return ret_error; - + } # else /* Linux glibc2: * int gethostbyname_r (const char *name, @@ -737,17 +745,22 @@ r = gethostbyname_r (hostname, &hs, tmp, GETHOSTBYNAME_R_BUF_LEN - 1, &hp, &h_errnop); - if (r != 0) + if (r != 0) { + if (h_errnop == TRY_AGAIN) { + return ret_eagain; + } return ret_error; + } # endif /* Copy the address */ - if (hp == NULL) + if (hp == NULL) { return ret_not_found; + } memcpy (addr, hp->h_addr, hp->h_length); + return ret_ok; - return ret_ok; #else /* Bad case ! */
|