mutex for lastmeltdown

This commit is contained in:
Steven Dee (Jōshin) 2024-12-01 22:10:56 -05:00
parent 493249a02f
commit 11ec93ce17
No known key found for this signature in database

View file

@ -374,9 +374,8 @@ struct Blackhole {
static struct Shared { static struct Shared {
_Atomic(int) workers; _Atomic(int) workers;
struct timespec nowish;
struct timespec lastreindex;
struct timespec lastmeltdown; struct timespec lastmeltdown;
struct timespec nowish;
char currentdate[32]; char currentdate[32];
struct rusage server; struct rusage server;
struct rusage children; struct rusage children;
@ -388,6 +387,7 @@ static struct Shared {
pthread_mutex_t datetime_mu; pthread_mutex_t datetime_mu;
pthread_mutex_t server_mu; pthread_mutex_t server_mu;
pthread_mutex_t children_mu; pthread_mutex_t children_mu;
pthread_mutex_t lastmeltdown_mu;
} *shared; } *shared;
static const char kCounterNames[] = static const char kCounterNames[] =
@ -3215,7 +3215,9 @@ static char *ServeStatusz(void) {
AppendLong1("gmtoff", gmtoff); AppendLong1("gmtoff", gmtoff);
AppendLong1("CLK_TCK", CLK_TCK); AppendLong1("CLK_TCK", CLK_TCK);
AppendLong1("startserver", startserver.tv_sec); AppendLong1("startserver", startserver.tv_sec);
unassert(pthread_mutex_lock(&shared->lastmeltdown_mu));
AppendLong1("lastmeltdown", shared->lastmeltdown.tv_sec); AppendLong1("lastmeltdown", shared->lastmeltdown.tv_sec);
unassert(pthread_mutex_unlock(&shared->lastmeltdown_mu));
AppendLong1("workers", AppendLong1("workers",
atomic_load_explicit(&shared->workers, memory_order_relaxed)); atomic_load_explicit(&shared->workers, memory_order_relaxed));
AppendLong1("assets.n", assets.n); AppendLong1("assets.n", assets.n);
@ -5755,14 +5757,17 @@ Content-Length: 22\r\n\
} }
static void EnterMeltdownMode(void) { static void EnterMeltdownMode(void) {
unassert(pthread_mutex_lock(&shared->lastmeltdown_mu));
if (timespec_cmp(timespec_sub(timespec_real(), shared->lastmeltdown), if (timespec_cmp(timespec_sub(timespec_real(), shared->lastmeltdown),
(struct timespec){1}) < 0) { (struct timespec){1}) < 0) {
unassert(pthread_mutex_unlock(&shared->lastmeltdown_mu));
return; return;
} }
shared->lastmeltdown = timespec_real();
pthread_mutex_unlock(&shared->lastmeltdown_mu);
WARNF("(srvr) server is melting down (%,d workers)", WARNF("(srvr) server is melting down (%,d workers)",
atomic_load_explicit(&shared->workers, memory_order_relaxed)); atomic_load_explicit(&shared->workers, memory_order_relaxed));
LOGIFNEG1(kill(0, SIGUSR2)); LOGIFNEG1(kill(0, SIGUSR2));
shared->lastmeltdown = timespec_real();
LockInc(&shared->c.meltdowns); LockInc(&shared->c.meltdowns);
} }