==> 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}