Project homepage Mailing List  Warmcat.com  API Docs  Github Mirror 
    npro  
 Modern all-safe Rust Network Protocol library supporting h1, h2, h3, ws, wt sans-IO and with socket IO + tls
git clone https://npro.rs/repo/npro
Author[]Andy Green <andy@warmcat.com> 2025-08-06 04:50 UTC
Committer[]Andy Green <andy@warmcat.com> 2025-08-06 06:07 UTC
Tree4081b53c05edb7b27c7f0293a216a0372533e713   Raw Patch
 
builder: report load only if something busy
builder: report load only if something busy
diff --git a/src/builder/b-comms.c b/src/builder/b-comms.c index 1740f38..0ebf7d7 100644 --- a/src/builder/b-comms.c +++ b/src/builder/b-comms.c @@ -589,6 +589,7 @@ saib_sul_load_report_cb(struct lws_sorted_usec_list *sul) struct sai_plat_server, sul_load_report); sai_load_report_t *lr = calloc(1, sizeof(*lr)); struct sai_plat *sp = NULL; + char somebody_not_idle = 0; if (!lr) return; @@ -628,6 +629,7 @@ saib_sul_load_report_cb(struct lws_sorted_usec_list *sul) /* If the instance is idle, its load is 0, regardless of system load. */ load = 0; } else { + somebody_not_idle = 1; /* The instance is busy, try to get a specific load for it. */ load = saib_get_cgroup_cpu(ns); if (load < 0) @@ -650,8 +652,9 @@ saib_sul_load_report_cb(struct lws_sorted_usec_list *sul) if (lws_ss_request_tx(spm->ss)) lwsl_debug("%s: request tx failed\n", __func__); - /* Reschedule the timer */ - lws_sul_schedule(builder.context, 0, &spm->sul_load_report, + if (somebody_not_idle) + /* Reschedule the timer only if at least one active instance */ + lws_sul_schedule(builder.context, 0, &spm->sul_load_report, saib_sul_load_report_cb, SAI_LOAD_REPORT_US); } diff --git a/src/builder/b-load.c b/src/builder/b-load.c index 9d37f16..2074661 100644 --- a/src/builder/b-load.c +++ b/src/builder/b-load.c @@ -1,7 +1,7 @@ /* * Sai builder - platform-specific load reporting * - * Copyright (C) 2021 Andy Green <andy@warmcat.com> + * Copyright (C) 2025 Andy Green <andy@warmcat.com> * * This file is part of Sai. * diff --git a/src/builder/b-task.c b/src/builder/b-task.c index c827217..b7d0828 100644 --- a/src/builder/b-task.c +++ b/src/builder/b-task.c @@ -727,6 +727,11 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len) lwsl_notice("%s: cancelling suspend grace time\n", __func__); lws_sul_cancel(&ns->builder->sul_idle); + /* if we weren't, we should report load on instances now we're busy */ + if (lws_dll2_is_detached(&spm->sul_load_report.list)) + lws_sul_schedule(ns->builder->context, 0, &spm->sul_load_report, + saib_sul_load_report_cb, 1); + /* * Let the mirror thread get on with things... * @@ -780,17 +785,41 @@ saib_ws_json_rx_builder(struct sai_plat_server *spm, const void *in, size_t len) case SAIB_RX_VIEWERSTATE: { sai_viewer_state_t *vs = (sai_viewer_state_t *)a.dest; + char any_busy = 0; + lwsl_notice("Received viewer state update: %u viewers\n", vs->viewers); spm->viewer_count = vs->viewers; - if (vs->viewers) - /* At least one viewer, start reporting */ - lws_sul_schedule(builder.context, 0, &spm->sul_load_report, - saib_sul_load_report_cb, SAI_LOAD_REPORT_US); - else + if (!vs->viewers) { lws_sul_cancel(&spm->sul_load_report); + break; + } + + /* are there any busy instances */ + + lws_start_foreach_dll_safe(struct lws_dll2 *, d, d1, + builder.sai_plat_owner.head) { + sp = lws_container_of(d, sai_plat_t, sai_plat_list); + + lws_start_foreach_dll(struct lws_dll2 *, d, sp->nspawn_owner.head) { + struct sai_nspawn *ns = lws_container_of(d, struct sai_nspawn, list); + + if (ns->state == NSSTATE_BUILD) + any_busy = 1; + + } lws_end_foreach_dll(d); + } lws_end_foreach_dll_safe(d, d1); + + if (!any_busy) { + lws_sul_cancel(&spm->sul_load_report); + break; + } + + /* At least one viewer, start reporting */ + lws_sul_schedule(builder.context, 0, &spm->sul_load_report, + saib_sul_load_report_cb, 1); } break; diff --git a/src/server/s-comms.c b/src/server/s-comms.c index 9fe5685..51c86fe 100644 --- a/src/server/s-comms.c +++ b/src/server/s-comms.c @@ -849,6 +849,8 @@ callback_ws(struct lws *wsi, enum lws_callback_reasons reason, void *user, LWS_WRITE_TEXT) < 0) return -1; + lws_callback_on_writable(pss->wsi); + goto passthru; } break; diff --git a/src/server/s-websrv.c b/src/server/s-websrv.c index ffb3afb..9ad9faa 100644 --- a/src/server/s-websrv.c +++ b/src/server/s-websrv.c @@ -494,8 +494,8 @@ websrvss_ws_rx(void *userobj, const uint8_t *buf, size_t len, int flags) sum_viewers_cb, &total_viewers); m->vhd->browser_viewer_count = total_viewers; - lwsl_notice("%s: Client viewer count %u, total is now %u\n", - __func__, m->viewers, m->vhd->browser_viewer_count); + lwsl_notice("%s: Client viewer count %u\n", + __func__, m->vhd->browser_viewer_count); /* Broadcast the new viewer state to all connected builders */ lws_start_foreach_dll(struct lws_dll2 *, p, m->vhd->builders.head) {
Page fetched 0s ago, creation time: 14ms (vhost etag hits: 0%, cache hits: 0%)