Hi all,
I encountered some problems using gwlib httpd features. In particular, gwlib
will PANIC when the open file limit is exceeded, which is not acceptable for
many applications.
Here's a patch that seems to help.
And here's the question: I've added a few retries with a sleep in between in
put_port_request in http.c.
* Is there really a point in retrying?
* Is there really a point in sleeping?
* would it be better to just skip failed requests immediately without
retrying?
Thanks,
Ilan
Index: gwlib/http.c
===================================================================
RCS file: /var/cvsroot/dsmsc/gwlib/http.c,v
retrieving revision 1.2
diff -u -r1.2 http.c
--- gwlib/http.c 27 Jan 2005 18:54:48 -0000 1.2
+++ gwlib/http.c 5 Mar 2005 19:55:32 -0000
@@ -1903,18 +1903,32 @@
}
-static void port_put_request(HTTPClient *client)
+static int port_put_request(HTTPClient *client)
{
Octstr *key;
- struct port *p;
+ struct port *p = NULL;
+ int retry = 100; /* give up after 5 sec */
+ int ret = 0;
mutex_lock(port_mutex);
key = port_key(client->port);
p = dict_get(port_collection, key);
- gw_assert(p != NULL);
- list_produce(p->clients_with_requests, client);
octstr_destroy(key);
+ while (p == NULL && retry--) {
+ warning(0, "HTTPClient: can\'t port_put_request, retrying in 50
msec");
+ gwthread_sleep(0.050); /* sleep 50 msec before retry */
+ key = port_key(client->port);
+ p = dict_get(port_collection, key);
+ octstr_destroy(key);
+ }
+ if (p == NULL) {
+ error(0, "HTTPClient: can\'t port_put_request, skipping");
+ ret = -1;
+ } else {
+ list_produce(p->clients_with_requests, client);
+ }
mutex_unlock(port_mutex);
+ return ret;
}
@@ -2048,7 +2062,10 @@
if (ret == 0) {
client->state = request_is_being_handled;
conn_unregister(conn);
- port_put_request(client);
+ if ((ret = port_put_request(client))) {
+ goto error;
+// client->state = reading_request_line;
+ }
}
return;
Index: gwlib/thread.c
===================================================================
RCS file: /var/cvsroot/dsmsc/gwlib/thread.c,v
retrieving revision 1.2
diff -u -r1.2 thread.c
--- gwlib/thread.c 27 Sep 2004 16:59:21 -0000 1.2
+++ gwlib/thread.c 5 Mar 2005 19:55:32 -0000
@@ -113,8 +113,13 @@
}
#endif
- if ((ret = pthread_mutex_destroy(&mutex->mutex)) != 0)
- panic(ret, "Attempt to destroy locked mutex!");
+ if ((ret = pthread_mutex_destroy(&mutex->mutex)) != 0) {
+ error(ret, "Attempt to destroy locked mutex!");
+ pthread_mutex_unlock(&mutex->mutex);
+ if ((ret = pthread_mutex_destroy(&mutex->mutex)) != 0) {
+ error(ret, "Mutex: mutex won't unlock, ignoring");
+ }
+ }
if (mutex->dynamic == 0)
return;