diff --git a/core/master.c b/core/master.c index ba192db5..3561448c 100644 --- a/core/master.c +++ b/core/master.c @@ -948,7 +948,9 @@ next: // ok a worker died... uwsgi.workers[thewid].pid = 0; // only to be safe :P - uwsgi.workers[thewid].harakiri = 0; + for(i=0;i 0) { - if (uwsgi.workers[i].harakiri < (time_t) uwsgi.current_time) { - trigger_harakiri(i); - ret = 1; + for(j=0;j 0) { + if (uwsgi.workers[i].cores[j].harakiri < (time_t) uwsgi.current_time) { + trigger_harakiri(i); + ret = 1; + break; + } } - } - /* then user-defined harakiri */ - if (uwsgi.workers[i].user_harakiri > 0) { - if (uwsgi.workers[i].user_harakiri < (time_t) uwsgi.current_time) { - trigger_harakiri(i); - ret = 1; + /* then user-defined harakiri */ + if (uwsgi.workers[i].cores[j].user_harakiri > 0) { + if (uwsgi.workers[i].cores[j].user_harakiri < (time_t) uwsgi.current_time) { + trigger_harakiri(i); + ret = 1; + break; + } } } // then for evil memory checkers diff --git a/core/master_utils.c b/core/master_utils.c index d93b32c2..5306d0e5 100644 --- a/core/master_utils.c +++ b/core/master_utils.c @@ -632,7 +632,7 @@ void uwsgi_fixup_fds(int wid, int muleid, struct uwsgi_gateway *ug) { } int uwsgi_respawn_worker(int wid) { - + int i; int respawns = uwsgi.workers[wid].respawn_count; // the workers is not accepting (obviously) uwsgi.workers[wid].accepting = 0; @@ -641,8 +641,10 @@ int uwsgi_respawn_worker(int wid) { // ... same for update time uwsgi.workers[wid].last_spawn = uwsgi.current_time; // ... and memory/harakiri - uwsgi.workers[wid].harakiri = 0; - uwsgi.workers[wid].user_harakiri = 0; + for(i=0;i 0) { if (uwsgi.harakiri_options.workers > 0) { - inc_harakiri(uwsgi.harakiri_options.workers); + inc_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } ssize_t rlen = wsgi_req->socket->proto_read_body(wsgi_req, ptr, remains); @@ -551,7 +551,7 @@ int uwsgi_postbuffer_do_in_disk(struct wsgi_request *wsgi_req) { // during post buffering we need to constantly reset the harakiri if (uwsgi.harakiri_options.workers > 0) { - inc_harakiri(uwsgi.harakiri_options.workers); + inc_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } // we use the already available post buffering buffer to read chunks.... diff --git a/core/routing.c b/core/routing.c index 5cfbc1a9..efbd31cc 100644 --- a/core/routing.c +++ b/core/routing.c @@ -702,7 +702,7 @@ static int uwsgi_router_simple_math_divide(struct uwsgi_route *ur, char *arg) { // harakiri router static int uwsgi_router_harakiri_func(struct wsgi_request *wsgi_req, struct uwsgi_route *route) { if (route->custom > 0) { - set_user_harakiri(route->custom); + set_user_harakiri(wsgi_req, route->custom); } return UWSGI_ROUTE_NEXT; } diff --git a/core/signal.c b/core/signal.c index be20bd26..f93cd9eb 100644 --- a/core/signal.c +++ b/core/signal.c @@ -46,7 +46,7 @@ int uwsgi_signal_handler(uint8_t sig) { uwsgi.workers[uwsgi.mywid].signum = sig; uwsgi.workers[uwsgi.mywid].signals++; if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(NULL, uwsgi.harakiri_options.workers); } } else if (uwsgi.muleid > 0) { @@ -67,8 +67,8 @@ int uwsgi_signal_handler(uint8_t sig) { if (uwsgi.mywid > 0) { uwsgi.workers[uwsgi.mywid].sig = 0; - if (uwsgi.workers[uwsgi.mywid].harakiri > 0) { - set_harakiri(0); + if (uwsgi.workers[uwsgi.mywid].harakiri_total > 0) { + set_harakiri(NULL, 0); } } else if (uwsgi.muleid > 0) { diff --git a/core/utils.c b/core/utils.c index 5d4bebed..25ef4e3c 100644 --- a/core/utils.c +++ b/core/utils.c @@ -42,9 +42,9 @@ int check_hex(char *str, int len) { } // increase worker harakiri -void inc_harakiri(int sec) { +void inc_harakiri(struct wsgi_request *wsgi_req, int sec) { if (uwsgi.master_process) { - uwsgi.workers[uwsgi.mywid].harakiri += sec; + uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri += sec; } else { alarm(uwsgi.harakiri_options.workers + sec); @@ -52,12 +52,22 @@ void inc_harakiri(int sec) { } // set worker harakiri -void set_harakiri(int sec) { - if (sec == 0) { - uwsgi.workers[uwsgi.mywid].harakiri = 0; +void set_harakiri(struct wsgi_request *wsgi_req, int sec) { + if (!wsgi_req) { + if (sec == 0) { + uwsgi.workers[uwsgi.mywid].harakiri_total = 0; + } + else { + uwsgi.workers[uwsgi.mywid].harakiri_total = uwsgi_now() + sec; + } } else { - uwsgi.workers[uwsgi.mywid].harakiri = uwsgi_now() + sec; + if (sec == 0) { + uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri = 0; + } + else { + uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri = uwsgi_now() + sec; + } } if (!uwsgi.master_process) { alarm(sec); @@ -65,7 +75,7 @@ void set_harakiri(int sec) { } // set user harakiri -void set_user_harakiri(int sec) { +void set_user_harakiri(struct wsgi_request *wsgi_req, int sec) { if (!uwsgi.master_process) { uwsgi_log("!!! unable to set user harakiri without the master process !!!\n"); return; @@ -79,8 +89,8 @@ void set_user_harakiri(int sec) { struct uwsgi_spooler *uspool = uwsgi.i_am_a_spooler; uspool->user_harakiri = 0; } - else { - uwsgi.workers[uwsgi.mywid].user_harakiri = 0; + else if (wsgi_req) { + uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].user_harakiri = 0; } } else { @@ -91,8 +101,8 @@ void set_user_harakiri(int sec) { struct uwsgi_spooler *uspool = uwsgi.i_am_a_spooler; uspool->user_harakiri = uwsgi_now() + sec; } - else { - uwsgi.workers[uwsgi.mywid].user_harakiri = uwsgi_now() + sec; + else if (wsgi_req) { + uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].user_harakiri = uwsgi_now() + sec; } } } @@ -1099,13 +1109,13 @@ void uwsgi_close_request(struct wsgi_request *wsgi_req) { } // leave harakiri mode - if (uwsgi.workers[uwsgi.mywid].harakiri > 0) { - set_harakiri(0); + if (uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri > 0) { + set_harakiri(wsgi_req, 0); } // leave user harakiri mode - if (uwsgi.workers[uwsgi.mywid].user_harakiri > 0) { - set_user_harakiri(0); + if (uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].user_harakiri > 0) { + set_user_harakiri(wsgi_req, 0); } if (!wsgi_req->do_not_account) { @@ -1362,7 +1372,7 @@ int wsgi_req_async_recv(struct wsgi_request *wsgi_req) { // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } return 0; @@ -1394,7 +1404,7 @@ int wsgi_req_recv(int queue, struct wsgi_request *wsgi_req) { // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } #ifdef UWSGI_ROUTING diff --git a/core/uwsgi.c b/core/uwsgi.c index c319fe0b..5842b1d6 100644 --- a/core/uwsgi.c +++ b/core/uwsgi.c @@ -1458,7 +1458,7 @@ void what_i_am_doing() { #else ctime_r((const time_t *) &wsgi_req->start_of_request_in_sec, ctime_storage); #endif - if (uwsgi.harakiri_options.workers > 0 && uwsgi.workers[uwsgi.mywid].harakiri < uwsgi_now()) { + if (uwsgi.harakiri_options.workers > 0 && uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri < uwsgi_now()) { uwsgi_log("HARAKIRI: --- uWSGI worker %d core %d (pid: %d) WAS managing request %.*s since %.*s ---\n", (int) uwsgi.mywid, i, (int) uwsgi.mypid, wsgi_req->uri_len, wsgi_req->uri, 24, ctime_storage); } else { @@ -1475,14 +1475,14 @@ void what_i_am_doing() { #else ctime_r((const time_t *) &wsgi_req->start_of_request_in_sec, ctime_storage); #endif - if (uwsgi.harakiri_options.workers > 0 && uwsgi.workers[uwsgi.mywid].harakiri < uwsgi_now()) { + if (uwsgi.harakiri_options.workers > 0 && uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri < uwsgi_now()) { uwsgi_log("HARAKIRI: --- uWSGI worker %d (pid: %d) WAS managing request %.*s since %.*s ---\n", (int) uwsgi.mywid, (int) uwsgi.mypid, wsgi_req->uri_len, wsgi_req->uri, 24, ctime_storage); } else { uwsgi_log("SIGUSR2: --- uWSGI worker %d (pid: %d) is managing request %.*s since %.*s ---\n", (int) uwsgi.mywid, (int) uwsgi.mypid, wsgi_req->uri_len, wsgi_req->uri, 24, ctime_storage); } } - else if (uwsgi.harakiri_options.workers > 0 && uwsgi.workers[uwsgi.mywid].harakiri < uwsgi_now() && uwsgi.workers[uwsgi.mywid].sig) { + else if (uwsgi.harakiri_options.workers > 0 && uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri < uwsgi_now() && uwsgi.workers[uwsgi.mywid].sig) { uwsgi_log("HARAKIRI: --- uWSGI worker %d (pid: %d) WAS handling signal %d ---\n", (int) uwsgi.mywid, (int) uwsgi.mypid, uwsgi.workers[uwsgi.mywid].signum); } } diff --git a/plugins/asyncio/asyncio.c b/plugins/asyncio/asyncio.c index 14be58f9..a5252307 100644 --- a/plugins/asyncio/asyncio.c +++ b/plugins/asyncio/asyncio.c @@ -205,7 +205,7 @@ static PyObject *py_uwsgi_asyncio_accept(PyObject *self, PyObject *args) { // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } uwsgi.async_proto_fd_table[wsgi_req->fd] = wsgi_req; diff --git a/plugins/coroae/coroae.c b/plugins/coroae/coroae.c index fc6ca7e3..369c2f4d 100644 --- a/plugins/coroae/coroae.c +++ b/plugins/coroae/coroae.c @@ -227,7 +227,7 @@ edge: // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } diff --git a/plugins/gccgo/gccgo_plugin.c b/plugins/gccgo/gccgo_plugin.c index d2aa4eeb..43bf7798 100644 --- a/plugins/gccgo/gccgo_plugin.c +++ b/plugins/gccgo/gccgo_plugin.c @@ -389,7 +389,7 @@ retry: // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } // spawn the new goroutine diff --git a/plugins/gevent/gevent.c b/plugins/gevent/gevent.c index 15782fcf..6c57545c 100644 --- a/plugins/gevent/gevent.c +++ b/plugins/gevent/gevent.c @@ -211,7 +211,7 @@ edge: // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } // hack to easily pass wsgi_req pointer to the greenlet diff --git a/plugins/psgi/uwsgi_plmodule.c b/plugins/psgi/uwsgi_plmodule.c index 8500e520..e062f939 100644 --- a/plugins/psgi/uwsgi_plmodule.c +++ b/plugins/psgi/uwsgi_plmodule.c @@ -86,9 +86,11 @@ XS(XS_signal) { XS(XS_set_user_harakiri) { dXSARGS; + struct wsgi_request *wsgi_req = current_wsgi_req(); + psgi_check_args(1); - set_user_harakiri( SvIV(ST(0)) ); + set_user_harakiri(wsgi_req, SvIV(ST(0)) ); XSRETURN_UNDEF; } diff --git a/plugins/pypy/pypy_setup.py b/plugins/pypy/pypy_setup.py index ac83c75a..769c2386 100644 --- a/plugins/pypy/pypy_setup.py +++ b/plugins/pypy/pypy_setup.py @@ -237,7 +237,7 @@ void uwsgi_disconnect(struct wsgi_request *); int uwsgi_ready_fd(struct wsgi_request *); -void set_user_harakiri(int); +void set_user_harakiri(struct wsgi_request *, int); int uwsgi_metric_set(char *, char *, int64_t); int uwsgi_metric_inc(char *, char *, int64_t); @@ -918,7 +918,10 @@ uwsgi.chunked_read_nb = uwsgi_pypy_chunked_read_nb """ uwsgi.set_user_harakiri(sec) """ -uwsgi.set_user_harakiri = lambda x: lib.set_user_harakiri(x) +def uwsgi_pypy_set_user_harakiri(x): + wsgi_req = uwsgi_pypy_current_wsgi_req() + lib.set_user_harakiri(wsgi_req, x) +uwsgi.set_user_harakiri = uwsgi_pypy_set_user_harakiri print "Initialized PyPy with Python", sys.version diff --git a/plugins/python/uwsgi_pymodule.c b/plugins/python/uwsgi_pymodule.c index 473f39e9..fe29bb13 100644 --- a/plugins/python/uwsgi_pymodule.c +++ b/plugins/python/uwsgi_pymodule.c @@ -888,12 +888,13 @@ PyObject *py_uwsgi_log(PyObject * self, PyObject * args) { } PyObject *py_uwsgi_set_user_harakiri(PyObject * self, PyObject * args) { + struct wsgi_request *wsgi_req = py_current_wsgi_req(); int sec = 0; if (!PyArg_ParseTuple(args, "i:set_user_harakiri", &sec)) { return NULL; } - set_user_harakiri(sec); + set_user_harakiri(wsgi_req, sec); Py_INCREF(Py_None); return Py_None; diff --git a/plugins/python/wsgi_handlers.c b/plugins/python/wsgi_handlers.c index badb1ae9..6cc091b3 100644 --- a/plugins/python/wsgi_handlers.c +++ b/plugins/python/wsgi_handlers.c @@ -442,8 +442,8 @@ void uwsgi_after_request_wsgi(struct wsgi_request *wsgi_req) { if (up.after_req_hook) { if (uwsgi.harakiri_no_arh) { // leave harakiri mode - if (uwsgi.workers[uwsgi.mywid].harakiri > 0) - set_harakiri(0); + if (uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].harakiri > 0) + set_harakiri(wsgi_req, 0); } UWSGI_GET_GIL PyObject *arh = python_call(up.after_req_hook, up.after_req_hook_args, 0, NULL); diff --git a/plugins/rack/rack_api.c b/plugins/rack/rack_api.c index 465860e0..8567339e 100644 --- a/plugins/rack/rack_api.c +++ b/plugins/rack/rack_api.c @@ -110,7 +110,8 @@ static VALUE rack_uwsgi_warning(VALUE *class, VALUE rbmessage) { static VALUE rack_uwsgi_user_harakiri(VALUE *class, VALUE sec) { Check_Type(sec, T_FIXNUM); - set_user_harakiri(NUM2INT(sec)); + struct wsgi_request *wsgi_req = current_wsgi_req(); + set_user_harakiri(wsgi_req, NUM2INT(sec)); return Qnil; } diff --git a/plugins/tornado/tornado.c b/plugins/tornado/tornado.c index cc01c1a8..9030506b 100644 --- a/plugins/tornado/tornado.c +++ b/plugins/tornado/tornado.c @@ -235,7 +235,7 @@ PyObject *py_uwsgi_tornado_accept(PyObject *self, PyObject *args) { // enter harakiri mode if (uwsgi.harakiri_options.workers > 0) { - set_harakiri(uwsgi.harakiri_options.workers); + set_harakiri(wsgi_req, uwsgi.harakiri_options.workers); } uwsgi.async_proto_fd_table[wsgi_req->fd] = wsgi_req; diff --git a/uwsgi.h b/uwsgi.h index 911e41ae..f8966b11 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -2863,7 +2863,6 @@ struct uwsgi_shared { struct uwsgi_core { - //time_t harakiri; uint64_t requests; uint64_t failed_requests; @@ -2889,6 +2888,10 @@ struct uwsgi_core { char *post_buf; struct wsgi_request req; + + // uWSGI 2.1 + time_t harakiri; + time_t user_harakiri; }; struct uwsgi_worker { @@ -2904,8 +2907,9 @@ struct uwsgi_worker { uint64_t delta_requests; uint64_t failed_requests; - time_t harakiri; - time_t user_harakiri; + // renamed in 2.1 (was 'harakiri') + time_t harakiri_total; + time_t user_harakiri_unused; uint64_t harakiri_count; int pending_harakiri; @@ -3042,11 +3046,11 @@ void uwsgi_curse(int, int); void uwsgi_curse_mule(int, int); void uwsgi_destroy_processes(void); -void set_harakiri(int); -void set_user_harakiri(int); +void set_harakiri(struct wsgi_request *, int); +void set_user_harakiri(struct wsgi_request *, int); void set_mule_harakiri(int); void set_spooler_harakiri(int); -void inc_harakiri(int); +void inc_harakiri(struct wsgi_request *, int); #ifdef __BIG_ENDIAN__ uint16_t uwsgi_swap16(uint16_t);