From 435ab22dd5d9496a355be35e6540f0063f656465 Mon Sep 17 00:00:00 2001 From: Reyk Floeter Date: Tue, 15 Jul 2014 11:45:52 +0200 Subject: sync inflight wip --- httpd.h | 2 ++ server.c | 15 ++++++++------- server_file.c | 26 ++++++++++++++++++++++++-- server_http.c | 8 ++++++-- 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; -- cgit v1.2.3-54-g00ecf