From fd03bdbe00d2e548549eaae109e29e0ccbb4aa2c Mon Sep 17 00:00:00 2001 From: "roberto@debian32" Date: Wed, 26 Oct 2011 06:30:42 +0200 Subject: [PATCH] improved mule and farm signal handling --- mule.c | 19 +++++++++++++++---- plugins/python/uwsgi_pymodule.c | 15 ++++++++++----- signal.c | 13 ++++++++++++- uwsgi.h | 1 + 4 files changed, 38 insertions(+), 10 deletions(-) diff --git a/mule.c b/mule.c index 208501cb..55b5b17b 100644 --- a/mule.c +++ b/mule.c @@ -156,7 +156,7 @@ void uwsgi_mule_handler() { uwsgi_log_verbose("master sent signal %d to mule %d\n", uwsgi_signal, uwsgi.muleid); #endif if (uwsgi_signal_handler(uwsgi_signal)) { - uwsgi_log_verbose("error managing signal %d on mule %d\n", uwsgi_signal, uwsgi.mywid); + uwsgi_log_verbose("error managing signal %d on mule %d\n", uwsgi_signal, uwsgi.muleid); } } else if (interesting_fd == uwsgi.mules[uwsgi.muleid-1].queue_pipe[1] || interesting_fd == uwsgi.shared->mule_queue_pipe[1] || farm_has_msg(interesting_fd)) { @@ -164,9 +164,6 @@ void uwsgi_mule_handler() { if (len < 0) { uwsgi_error("read()"); } - else if (len == 0) { - exit(1); - } else { uwsgi_log("*** mule %d received a %d bytes message ***\n", uwsgi.muleid, len); } @@ -188,6 +185,20 @@ struct uwsgi_mule *get_mule_by_id(int id) { return NULL; } +struct uwsgi_farm *get_farm_by_name(char *name) { + + int i; + + for(i=0;i -1) { - ssize_t len = read(interesting_fd, &uwsgi_signal, 1); + len = read(interesting_fd, &uwsgi_signal, 1); if (len <= 0) { uwsgi_log_verbose("uWSGI mule %d braying: my master died, i will follow him...\n", uwsgi.muleid); end_me(0); @@ -1245,17 +1245,22 @@ PyObject *py_uwsgi_mule_get_msg(PyObject * self, PyObject * args, PyObject *kwar if (uwsgi_signal_handler(uwsgi_signal)) { uwsgi_log_verbose("error managing signal %d on mule %d\n", uwsgi_signal, uwsgi.mywid); } + goto clear; } } } UWSGI_GET_GIL; - if (len <= 0) { - if (len < 0) uwsgi_error("read()"); - Py_INCREF(Py_None); - return Py_None; + if (len < 0) { + uwsgi_error("read()"); + goto clear2; } return PyString_FromStringAndSize(message, len); +clear: + UWSGI_GET_GIL; +clear2: + Py_INCREF(Py_None); + return Py_None; } PyObject *py_uwsgi_farm_get_msg(PyObject * self, PyObject * args) { diff --git a/signal.c b/signal.c index 70e94133..9718b060 100644 --- a/signal.c +++ b/signal.c @@ -271,7 +271,18 @@ void uwsgi_route_signal(uint8_t sig) { } } } - + else if (!strncmp(use->receiver, "farm_", 5)) { + char *name = use->receiver+5; + struct uwsgi_farm *uf = get_farm_by_name(name); + if (!uf) { + uwsgi_log("unknown farm: %s\n", name); + return; + } + if (write(uf->signal_pipe[0], &sig, 1) != 1) { + uwsgi_error("write()"); + uwsgi_log("could not deliver signal %d to farm %d (%s)\n", sig, uf->id, uf->name); + } + } else if (!strncmp(use->receiver, "farm", 4)) { i = atoi(use->receiver+4); if (i > uwsgi.farms_cnt || i <= 0) { diff --git a/uwsgi.h b/uwsgi.h index 47d1edc6..fddb88f0 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -2423,6 +2423,7 @@ struct uwsgi_mule *get_mule_by_id(int); struct uwsgi_mule_farm *uwsgi_mule_farm_new(struct uwsgi_mule_farm **, struct uwsgi_mule *); int uwsgi_farm_has_mule(struct uwsgi_farm *, int); +struct uwsgi_farm *get_farm_by_name(char *); #ifdef UWSGI_CAP void uwsgi_build_cap(char *);