diff --git a/core/utils.c b/core/utils.c index 27536ad6..5d4bebed 100644 --- a/core/utils.c +++ b/core/utils.c @@ -1171,7 +1171,7 @@ void uwsgi_close_request(struct wsgi_request *wsgi_req) { // yes, this is pretty useless but we cannot ensure all of the plugin have the same behaviour uwsgi.workers[uwsgi.mywid].cores[wsgi_req->async_id].in_request = 0; - if (uwsgi.max_requests > 0 && uwsgi.workers[uwsgi.mywid].delta_requests >= uwsgi.max_requests + if (uwsgi.max_requests > 0 && uwsgi.workers[uwsgi.mywid].delta_requests >= (uwsgi.max_requests + ((uwsgi.mywid-1) * uwsgi.max_requests_delta)) && (end_of_request - (uwsgi.workers[uwsgi.mywid].last_spawn * 1000000) >= uwsgi.min_worker_lifetime * 1000000)) { goodbye_cruel_world(); } diff --git a/core/uwsgi.c b/core/uwsgi.c index 6707a3d6..c319fe0b 100644 --- a/core/uwsgi.c +++ b/core/uwsgi.c @@ -265,6 +265,7 @@ static struct uwsgi_option uwsgi_base_options[] = { {"reaper", no_argument, 'r', "call waitpid(-1,...) after each request to get rid of zombies", uwsgi_opt_true, &uwsgi.reaper, 0}, {"max-requests", required_argument, 'R', "reload workers after the specified amount of managed requests", uwsgi_opt_set_64bit, &uwsgi.max_requests, 0}, + {"max-requests-delta", required_argument, 0, "add (worker_id * delta) to the max_requests value of each worker", uwsgi_opt_set_64bit, &uwsgi.max_requests_delta, 0}, {"min-worker-lifetime", required_argument, 0, "number of seconds worker must run before being reloaded (default is 60)", uwsgi_opt_set_64bit, &uwsgi.min_worker_lifetime, 0}, {"max-worker-lifetime", required_argument, 0, "reload workers after the specified amount of seconds (default is disabled)", uwsgi_opt_set_64bit, &uwsgi.max_worker_lifetime, 0}, diff --git a/uwsgi.h b/uwsgi.h index 711b2351..911e41ae 100644 --- a/uwsgi.h +++ b/uwsgi.h @@ -2735,6 +2735,7 @@ struct uwsgi_server { char *emperor_wrapper_attr; int emperor_subreaper; struct uwsgi_string_list *hook_as_on_demand_vassal; + uint64_t max_requests_delta; }; struct uwsgi_rpc {