diff options
author | Reyk Floeter <reyk@esdenera.com> | 2014-07-15 11:45:52 +0200 |
---|---|---|
committer | Reyk Floeter <reyk@esdenera.com> | 2014-07-15 11:45:52 +0200 |
commit | 435ab22dd5d9496a355be35e6540f0063f656465 (patch) | |
tree | 4f2e62eb8e1f1153cebb221090ebaf861551eab9 | |
parent | 9b7e15e3badd2165021ca8d072da56cc0d993d70 (diff) | |
download | httpd-435ab22dd5d9496a355be35e6540f0063f656465.tar.gz httpd-435ab22dd5d9496a355be35e6540f0063f656465.zip |
sync inflight wip
-rw-r--r-- | httpd.h | 2 | ||||
-rw-r--r-- | server.c | 15 | ||||
-rw-r--r-- | server_file.c | 26 | ||||
-rw-r--r-- | server_http.c | 8 |
4 files changed, 40 insertions, 11 deletions
@@ -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 *); @@ -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; |