aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorReyk Floeter <reyk@esdenera.com>2014-07-15 11:45:52 +0200
committerReyk Floeter <reyk@esdenera.com>2014-07-15 11:45:52 +0200
commit435ab22dd5d9496a355be35e6540f0063f656465 (patch)
tree4f2e62eb8e1f1153cebb221090ebaf861551eab9
parent9b7e15e3badd2165021ca8d072da56cc0d993d70 (diff)
downloadhttpd-435ab22dd5d9496a355be35e6540f0063f656465.tar.gz
httpd-435ab22dd5d9496a355be35e6540f0063f656465.zip
sync inflight wip
-rw-r--r--httpd.h2
-rw-r--r--server.c15
-rw-r--r--server_file.c26
-rw-r--r--server_http.c8
4 files changed, 40 insertions, 11 deletions
diff --git a/httpd.h b/httpd.h
index bd24c43..79e89fa 100644
--- a/httpd.h
+++ b/httpd.h
@@ -341,6 +341,8 @@ struct httpd {
#define HTTPD_OPT_LOGNOTIFY 0x10
#define HTTPD_OPT_LOGALL 0x18
+extern volatile int server_inflight;
+
/* control.c */
int control_init(struct privsep *, struct control_sock *);
int control_listen(struct control_sock *);
diff --git a/server.c b/server.c
index 977b864..876849b 100644
--- a/server.c
+++ b/server.c
@@ -448,7 +448,8 @@ server_accept(int fd, short event, void *arg)
event_del(&srv->srv_ev);
evtimer_add(&srv->srv_evt, &evtpause);
- log_debug("%s: deferring connections", __func__);
+ log_debug("%s: deferring connections %d",
+ __func__, getdtablecount());
}
return;
}
@@ -555,14 +556,9 @@ server_close(struct client *clt, const char *msg)
else if (clt->clt_output != NULL)
evbuffer_free(clt->clt_output);
- if (clt->clt_file != NULL)
- bufferevent_free(clt->clt_file);
- if (clt->clt_fd != -1)
- close(clt->clt_fd);
-
if (clt->clt_s != -1) {
close(clt->clt_s);
- if (/* XXX */ -1) {
+ if (clt->clt_fd == -1 && 0) {
/*
* the output was never connected,
* thus this was an inflight client.
@@ -573,6 +569,11 @@ server_close(struct client *clt, const char *msg)
}
}
+ if (clt->clt_file != NULL)
+ bufferevent_free(clt->clt_file);
+ if (clt->clt_fd != -1)
+ close(clt->clt_fd);
+
if (clt->clt_log != NULL)
evbuffer_free(clt->clt_log);
diff --git a/server_file.c b/server_file.c
index e8db8a7..74a7106 100644
--- a/server_file.c
+++ b/server_file.c
@@ -84,7 +84,29 @@ server_file(struct httpd *env, struct client *clt)
return (-1);
}
- if ((fd = open(path, O_RDONLY)) == -1 || fstat(fd, &st) == -1)
+ if ((fd = open(path, O_RDONLY)) == -1) {
+ /*
+ * Pause accept if we are out of file descriptors, or
+ * libevent will haunt us here too.
+ */
+ if (errno == ENFILE || errno == EMFILE) {
+ struct timeval evtpause = { 1, 0 };
+
+ event_del(&srv->srv_ev);
+ evtimer_add(&srv->srv_evt, &evtpause);
+ log_debug("%s: deferring connections", __func__);
+ return (0);
+ }
+ }
+
+ if (clt->clt_persist <= 1) {
+ server_inflight--;
+ DPRINTF("%s: inflight decremented, now %d",
+ __func__, server_inflight);
+ event_add(&srv->srv_ev, NULL);
+ }
+
+ if (fstat(fd, &st) == -1)
goto fail;
media = media_find(env->sc_mediatypes, path);
@@ -112,7 +134,7 @@ server_file(struct httpd *env, struct client *clt)
bufferevent_settimeout(clt->clt_file,
srv->srv_conf.timeout.tv_sec, srv->srv_conf.timeout.tv_sec);
- bufferevent_enable(clt->clt_file, EV_READ);
+ bufferevent_enable(clt->clt_file, EV_READ|EV_WRITE);
return (0);
fail:
diff --git a/server_http.c b/server_http.c
index 329080a..a3991e3 100644
--- a/server_http.c
+++ b/server_http.c
@@ -502,10 +502,14 @@ server_read_httpchunks(struct bufferevent *bev, void *arg)
}
void
-server_reset_http(struct client *clt, int done)
+server_reset_http(struct client *clt, int all)
{
struct http_descriptor *desc = clt->clt_desc;
+ log_debug("%s: method %s done %d count %d fd %d p %d", __func__,
+ server_httpmethod_byid(desc->http_method), all,
+ getdtablecount(), clt->clt_fd, clt->clt_persist);
+
server_httpdesc_free(desc);
desc->http_method = 0;
desc->http_chunked = 0;
@@ -514,7 +518,7 @@ server_reset_http(struct client *clt, int done)
clt->clt_line = 0;
clt->clt_done = 0;
- if (!done)
+ if (!all)
return;
clt->clt_toread = TOREAD_HTTP_HEADER;