Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Cherokee: commits

[3661] cherokee/trunk/cherokee: This patch improves the gethostbyname() usage in Cherokee.

 

 

Cherokee commits RSS feed   Index | Next | Previous | View Threaded


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 !
*/

Cherokee commits RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.