From 21ca254448dfbb4134e40f1e9ba9614259c86299 Mon Sep 17 00:00:00 2001 From: Keith Rarick Date: Sat, 26 Feb 2011 04:10:41 -0800 Subject: [PATCH] don't use EV_PERSIST for listen socket --- beanstalkd.c | 8 ++++++-- conn.c | 2 +- dat.h | 6 +++--- net.c | 42 +++++++----------------------------------- prot.c | 20 +++++++++++--------- 5 files changed, 28 insertions(+), 50 deletions(-) diff --git a/beanstalkd.c b/beanstalkd.c index b6d21e03..17f147ce 100644 --- a/beanstalkd.c +++ b/beanstalkd.c @@ -259,7 +259,7 @@ opts(int argc, char **argv) int main(int argc, char **argv) { - int r; + int r, l; struct event_base *ev_base; struct job binlog_jobs = {}; @@ -285,13 +285,17 @@ main(int argc, char **argv) r = make_server_socket(host_addr, port); if (r == -1) twarnx("make_server_socket()"), exit(111); + l = r; if (user) su(user); ev_base = event_init(); set_sig_handlers(); nudge_fd_limit(); - unbrake((evh) h_accept); + r = listen(l, 1024); + if (r == -1) twarn("listen()"); + accept_handler = (evh)h_accept; + unbrake(); binlog_jobs.prev = binlog_jobs.next = &binlog_jobs; binlog_init(&binlog_jobs); diff --git a/conn.c b/conn.c index deda8c02..0f059c2a 100644 --- a/conn.c +++ b/conn.c @@ -282,7 +282,7 @@ conn_close(conn c) cur_conn_ct--; /* stats */ - unbrake(NULL); + unbrake(); remove_waiting_conn(c); conn_remove(c); if (has_reserved_job(c)) enqueue_reserved_jobs(c); diff --git a/dat.h b/dat.h index 1b3746fd..4bcd9497 100644 --- a/dat.h +++ b/dat.h @@ -281,9 +281,9 @@ void prot_replay_binlog(job binlog_jobs); int make_server_socket(char *host_addr, char *port); -void brake(); -void unbrake(evh h); -void set_main_timeout(); +void unbrake(); +extern int listening; +extern evh accept_handler; extern char *binlog_dir; diff --git a/net.c b/net.c index 00209c2e..c76c03d5 100644 --- a/net.c +++ b/net.c @@ -32,8 +32,8 @@ static int listen_socket = -1; static struct event listen_evq; -static evh accept_handler; -static int brakes_are_on = 1; +evh accept_handler; +int listening = 0; int make_server_socket(char *host, char *port) @@ -130,45 +130,17 @@ make_server_socket(char *host, char *port) } void -brake() -{ - int r; - - if (brakes_are_on) return; - brakes_are_on = 1; - twarnx("too many connections; putting on the brakes"); - - r = event_del(&listen_evq); - if (r == -1) twarn("event_del()"); - - r = listen(listen_socket, 0); - if (r == -1) twarn("listen()"); -} - -void -unbrake(evh h) +unbrake() { int r; + struct timeval tv; - if (!brakes_are_on) return; - brakes_are_on = 0; + if (listening) return; + listening = 1; - accept_handler = h ? : accept_handler; - event_set(&listen_evq, listen_socket, EV_READ | EV_PERSIST, + event_set(&listen_evq, listen_socket, EV_READ, accept_handler, &listen_evq); - set_main_timeout(); - - r = listen(listen_socket, 1024); - if (r == -1) twarn("listen()"); -} - -void -set_main_timeout() -{ - int r; - struct timeval tv; - timeval_from_usec(&tv, 10 * MSEC); r = event_add(&listen_evq, &tv); diff --git a/prot.c b/prot.c index 9b2689d9..250b4665 100644 --- a/prot.c +++ b/prot.c @@ -1744,7 +1744,7 @@ h_delay() } } - set_main_timeout(); + unbrake(); } void @@ -1755,30 +1755,32 @@ h_accept(const int fd, const short which, struct event *ev) socklen_t addrlen; struct sockaddr_in6 addr; - if (which == EV_TIMEOUT) return h_delay(), set_main_timeout(); + listening = 0; + + if (which == EV_TIMEOUT) return h_delay(), unbrake(); addrlen = sizeof addr; cfd = accept(fd, (struct sockaddr *)&addr, &addrlen); if (cfd == -1) { if (errno != EAGAIN && errno != EWOULDBLOCK) twarn("accept()"); - if (errno == EMFILE) return brake(), v(); - set_main_timeout(); + if (errno == EMFILE) return; + unbrake(); return; } flags = fcntl(cfd, F_GETFL, 0); - if (flags < 0) return twarn("getting flags"), close(cfd), set_main_timeout(); + if (flags < 0) return twarn("getting flags"), close(cfd), unbrake(); r = fcntl(cfd, F_SETFL, flags | O_NONBLOCK); - if (r < 0) return twarn("setting O_NONBLOCK"), close(cfd), set_main_timeout(); + if (r < 0) return twarn("setting O_NONBLOCK"), close(cfd), unbrake(); c = make_conn(cfd, STATE_WANTCOMMAND, default_tube, default_tube); - if (!c) return twarnx("make_conn() failed"), close(cfd), brake(); + if (!c) return twarnx("make_conn() failed"), close(cfd), v(); dbgprintf("accepted conn, fd=%d\n", cfd); r = conn_set_evq(c, EV_READ | EV_PERSIST, (evh) h_conn); - if (r == -1) return twarnx("conn_set_evq() failed"), close(cfd), brake(); - set_main_timeout(); + if (r == -1) return twarnx("conn_set_evq() failed"), close(cfd), v(); + unbrake(); } void