kore

Kore is a web application platform for writing scalable, concurrent web based processes in C or Python.
Commits | Files | Refs | README | LICENSE | git clone https://git.kore.io/kore.git

commit 370041656e5becae517610726eff2697a5681408
parent 8b0279879ae3ca5e6e358c44cd4404e89d7e8ee4
Author: Joris Vink <joris@coders.se>
Date:   Thu, 21 Mar 2019 14:03:11 +0100

Get rid of WORKER_LOCK_TIMEOUT.

Instead let the workers send a message on the msg channel to each
other when they have given up the accept lock and it is now available
to be grabbed.

Diffstat:
include/kore/kore.h | 1+
src/worker.c | 43++++++++++++++++++++++++-------------------
2 files changed, 25 insertions(+), 19 deletions(-)

diff --git a/include/kore/kore.h b/include/kore/kore.h @@ -498,6 +498,7 @@ struct kore_timer { #define KORE_MSG_CERTIFICATE 7 #define KORE_MSG_CERTIFICATE_REQ 8 #define KORE_MSG_CRL 9 +#define KORE_MSG_ACCEPT_AVAILABLE 10 /* Predefined message targets. */ #define KORE_MSG_PARENT 1000 diff --git a/src/worker.c b/src/worker.c @@ -53,8 +53,6 @@ #define WAIT_ANY (-1) #endif -#define WORKER_LOCK_TIMEOUT 100 - #if !defined(KORE_NO_TLS) #define WORKER_SOLO_COUNT 2 #else @@ -74,7 +72,8 @@ static int worker_trylock(void); static void worker_unlock(void); static inline int worker_acceptlock_obtain(void); -static inline int worker_acceptlock_release(void); +static inline void worker_acceptlock_release(void); +static void worker_accept_avail(struct kore_msg *, const void *); #if !defined(KORE_NO_TLS) static void worker_entropy_recv(struct kore_msg *, const void *); @@ -83,7 +82,7 @@ static int worker_keymgr_response_verify(struct kore_msg *, const void *, struct kore_domain **); #endif -static u_int64_t next_lock; +static int accept_avail; static struct kore_worker *kore_workers; static int worker_no_lock; static int shm_accept_key; @@ -353,8 +352,8 @@ kore_worker_entry(struct kore_worker *kw) quit = 0; had_lock = 0; - next_lock = 0; next_prune = 0; + accept_avail = 1; worker_active_connections = 0; #if defined(KORE_USE_PGSQL) @@ -376,6 +375,8 @@ kore_worker_entry(struct kore_worker *kw) } #endif + kore_msg_register(KORE_MSG_ACCEPT_AVAILABLE, worker_accept_avail); + if (nlisteners == 0) worker_no_lock = 1; @@ -405,14 +406,13 @@ kore_worker_entry(struct kore_worker *kw) } #endif - if (!worker->has_lock && next_lock <= now) { + if (!worker->has_lock && accept_avail) { + accept_avail = 0; if (worker_acceptlock_obtain()) { if (had_lock == 0) { kore_platform_enable_accept(); had_lock = 1; } - } else { - next_lock = now + WORKER_LOCK_TIMEOUT / 2; } } @@ -420,10 +420,8 @@ kore_worker_entry(struct kore_worker *kw) kore_platform_event_wait(netwait); now = kore_time_ms(); - if (worker->has_lock) { - if (worker_acceptlock_release()) - next_lock = now + WORKER_LOCK_TIMEOUT; - } + if (worker->has_lock) + worker_acceptlock_release(); if (!worker->has_lock) { if (had_lock == 1) { @@ -600,25 +598,26 @@ kore_worker_make_busy(void) if (worker->has_lock) { worker_unlock(); worker->has_lock = 0; - next_lock = kore_time_ms() + WORKER_LOCK_TIMEOUT; + kore_msg_send(KORE_MSG_WORKER_ALL, + KORE_MSG_ACCEPT_AVAILABLE, NULL, 0); } } -static inline int +static inline void worker_acceptlock_release(void) { if (worker_count == WORKER_SOLO_COUNT || worker_no_lock == 1) - return (0); + return; if (worker->has_lock != 1) - return (0); + return; if (worker_active_connections < worker_max_connections) { #if !defined(KORE_NO_HTTP) if (http_request_count < http_request_limit) - return (0); + return; #else - return (0); + return; #endif } @@ -629,7 +628,7 @@ worker_acceptlock_release(void) worker_unlock(); worker->has_lock = 0; - return (1); + kore_msg_send(KORE_MSG_WORKER_ALL, KORE_MSG_ACCEPT_AVAILABLE, NULL, 0); } static inline int @@ -684,6 +683,12 @@ worker_unlock(void) kore_log(LOG_NOTICE, "worker_unlock(): wasnt locked"); } +static void +worker_accept_avail(struct kore_msg *msg, const void *data) +{ + accept_avail = 1; +} + #if !defined(KORE_NO_TLS) static void worker_entropy_recv(struct kore_msg *msg, const void *data)