skip to content
==> src/sched_weights.c <==
1/* Weights::default and Weights::from_keys. */
2#include "mesh/sched_weights.h"
3#include "mesh/parse.h"
4#include "mesh/rust_fmt.h"
5#include "mesh/mt.h"
6
7#include <stdlib.h>
8#include <string.h>
9
10msw_weights msw_default(void) {
11    return (msw_weights){.perf = 1.0, .load = 0.6, .mem = 0.3, .spread = 0.2, .rtt = 0.3, .prefer = 0.25, .sticky = 0.1, .owner = 0.6,
12                         .improve = 0.25, .hold_ms = 10000, .dwell_ms = 60000, .per_min = 3, .replace_ms = 3000, .owner_share = 0.3f,
13                         .owner_psi = 0.25f, .owner_ms = 6000, .tick_ms = 1000, .reserve = 0.25f};
14}
15
16static bool num(const ms_map *m, const char *k, double d, double *out, char **err) {
17    const char *v = ms_get(m, k);
18    if (!v) {
19        *out = d;
20        return true;
21    }
22    if (mp_f64(v, out)) return true;
23    char *q = rf_debug_str(v);
24    *err = mt_fmt("cluster: %s = %s: a number", k, q);
25    free(q);
26    return false;
27}
28
29static bool integer(const ms_map *m, const char *k, uint64_t d, uint64_t *out, char **err) {
30    const char *v = ms_get(m, k);
31    if (!v) {
32        *out = d;
33        return true;
34    }
35    if (mp_u64(v, out)) return true;
36    char *q = rf_debug_str(v);
37    *err = mt_fmt("cluster: %s = %s: an integer", k, q);
38    free(q);
39    return false;
40}
41
42bool msw_from_keys(const ms_map *m, msw_weights *out, char **err) {
43    msw_weights w = msw_default();
44    double f;
45    uint64_t u;
46    if (!num(m, "sched_improve", w.improve, &w.improve, err)) return false;
47    if (!integer(m, "sched_hold_ms", w.hold_ms, &w.hold_ms, err)) return false;
48    if (!integer(m, "sched_dwell_ms", w.dwell_ms, &w.dwell_ms, err)) return false;
49    if (!integer(m, "sched_per_min", w.per_min, &u, err)) return false;
50    w.per_min = (uint32_t)u;
51    if (!integer(m, "sched_replace_ms", w.replace_ms, &w.replace_ms, err)) return false;
52    if (!num(m, "sched_owner_share", (double)w.owner_share, &f, err)) return false;
53    w.owner_share = (float)f;
54    if (!num(m, "sched_owner_psi", (double)w.owner_psi, &f, err)) return false;
55    w.owner_psi = (float)f;
56    if (!integer(m, "sched_owner_ms", w.owner_ms, &w.owner_ms, err)) return false;
57    if (!integer(m, "sched_tick_ms", w.tick_ms, &u, err)) return false;
58    w.tick_ms = u > 100 ? u : 100;
59    if (!num(m, "sched_reserve", (double)w.reserve, &f, err)) return false;
60    w.reserve = (float)f;
61    if (!(w.improve >= 0.0 && w.improve <= 10.0) || !(w.reserve >= 0.0f && w.reserve < 1.0f)) {
62        *err = mt_strdup("cluster: sched_improve 0..10, sched_reserve 0..1");
63        return false;
64    }
65    *out = w;
66    return true;
67}
68
69bool msw_eq(const msw_weights *a, const msw_weights *b) {
70    return a->perf == b->perf && a->load == b->load && a->mem == b->mem && a->spread == b->spread && a->rtt == b->rtt && a->prefer == b->prefer &&
71           a->sticky == b->sticky && a->owner == b->owner && a->improve == b->improve && a->hold_ms == b->hold_ms && a->dwell_ms == b->dwell_ms &&
72           a->per_min == b->per_min && a->replace_ms == b->replace_ms && a->owner_share == b->owner_share && a->owner_psi == b->owner_psi &&
73           a->owner_ms == b->owner_ms && a->tick_ms == b->tick_ms && a->reserve == b->reserve;
74}