code wiki / _hdl_build / nx_nomad_schedule_test.nx
nx_nomad_schedule_test.nx source
↩ module page · 62 lines · 4469 B
1// nx_nomad_schedule_test.nx -- NOMADGATE: proves the sovereign bin-pack scheduler. 3 nodes free:
2// n0=(cpu4,mem4) n1=(cpu8,mem8) n2=(cpu2,mem2). GREEN iff: a (cpu2,mem2) job bin-packs to the TIGHTEST
3// feasible node (n2, leftover 0) not the roomiest; capacity is decremented on alloc; the next job re-bin-packs
4// on updated capacity; a job bigger than every node is UNPLACEABLE (no overcommit); a job needing more mem
5// than a cpu-OK node is rejected there (both dims checked); a cluster filled exactly leaves 0 and the next
6// job is rejected (conservation). exit 0 on 7/7.
7import "nx_nomad_schedule.nx"
8import "nx_syscalls.nx"
9
10func ng_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 }
11func ng_num(v: i64) -> i64 { let b: *u8 = sys_mmap(28); var m: i64=v; if m<0 {m=0-m;sys_write(1,"-" as *u8,1)}; let t: *u8 = sys_mmap(28); var k: i64=0; if m==0 {t[0]=48;k=1}; while m>0 {t[k]=48+(m%10); m=m/10; k=k+1}; var i: i64=0; while i<k {b[i]=t[k-1-i]; i=i+1}; sys_write(1,b,k); return 0 }
12
13func main() -> i64 {
14 ng_puts("=== SOVEREIGN NOMAD BIN-PACK SCHEDULER ===\n" as *u8)
15 let n: i64 = 3
16 let fcpu: *i64 = sys_mmap(24) as *i64; fcpu[0]=4; fcpu[1]=8; fcpu[2]=2
17 let fmem: *i64 = sys_mmap(24) as *i64; fmem[0]=4; fmem[1]=8; fmem[2]=2
18
19 // job A (2,2): feasible on all 3; tightest = n2 (leftover 0) -> bin-pack picks n2, not n1 (roomiest)
20 let jA: i64 = ns_alloc(fcpu, fmem, n, 2, 2)
21 let n2cpu_after: i64 = fcpu[2] // 0 (decremented)
22
23 // job B (2,2): n2 now empty (0,0) infeasible; among n0(4,4) n1(8,8) tightest = n0 (leftover 4)
24 let jB: i64 = ns_alloc(fcpu, fmem, n, 2, 2) // expect n0
25
26 // job C huge (100,100): unplaceable
27 let jC: i64 = ns_place(fcpu, fmem, n, 100, 100)
28
29 // dimension test on a FRESH cluster: node with cpu OK but mem short must be rejected there
30 let g2c: *i64 = sys_mmap(16) as *i64; g2c[0]=10; g2c[1]=3
31 let g2m: *i64 = sys_mmap(16) as *i64; g2m[0]=1; g2m[1]=5
32 let jD: i64 = ns_place(g2c, g2m, 2, 4, 4) // n0 cpu ok mem short -> n1 (3>=4? no)... n1 cpu3<4 -> none? check below
33
34 // conservation: a single node sized exactly to one job -> fills to 0, next identical job rejected
35 let ec: *i64 = sys_mmap(8) as *i64; ec[0]=5
36 let em: *i64 = sys_mmap(8) as *i64; em[0]=5
37 let e1: i64 = ns_alloc(ec, em, 1, 5, 5) // node0 -> 0,0
38 let e_left: i64 = ec[0] // 0
39 let e2: i64 = ns_alloc(ec, em, 1, 1, 1) // rejected
40
41 ng_puts(" jobA->node" as *u8); ng_num(jA); ng_puts(" (n2 tight) n2cpu_after=" as *u8); ng_num(n2cpu_after)
42 ng_puts(" | jobB->node" as *u8); ng_num(jB); ng_puts(" | jobC(huge)=" as *u8); ng_num(jC)
43 ng_puts(" | dimtest jD=" as *u8); ng_num(jD); ng_puts(" | exact e1=" as *u8); ng_num(e1); ng_puts(" left=" as *u8); ng_num(e_left); ng_puts(" e2=" as *u8); ng_num(e2); ng_puts("\n" as *u8)
44
45 let r: *i64 = sys_mmap(8*8) as *i64
46 r[0] = 0; if jA == 2 { r[0] = 1 } // bin-pack: tightest node, not roomiest
47 r[1] = 0; if n2cpu_after == 0 { r[1] = 1 } // capacity decremented on alloc
48 r[2] = 0; if jB == 0 { r[2] = 1 } // re-bin-pack on updated capacity (n0 tightest left)
49 r[3] = 0; if jC == NOMAD_UNPLACEABLE { r[3] = 1 } // huge job unplaceable (no overcommit)
50 r[4] = 0; if jD == NOMAD_UNPLACEABLE { r[4] = 1 } // both dims checked: n0 mem-short, n1 cpu-short -> none
51 r[5] = 0; if e1 == 0 { if e_left == 0 { r[5] = 1 } } // exact fill leaves 0
52 r[6] = 0; if e2 == NOMAD_UNPLACEABLE { r[6] = 1 } // full cluster rejects next (conservation)
53
54 var pass: i64 = 0; var i: i64 = 0
55 while i < 7 { pass = pass + r[i]; i = i + 1 }
56 ng_puts("----\n passed " as *u8); ng_num(pass); ng_puts("/7\n" as *u8)
57 if pass == 7 {
58 ng_puts("NOMADGATE bin_pack_tightest=1 capacity_decrement=1 rebinpack=1 unplaceable_no_overcommit=1 two_dimensional=1 conservation=1 exceed[sovereign cluster scheduler core = HashiCorp Nomad-class bin-packing; feasibility on cpu+mem, tightest-fit, no overcommit; the allocator the eval-queue/reschedule build on; bits-up] verdict=GREEN\n" as *u8)
59 sys_exit(0); return 0
60 }
61 ng_puts("NOMADGATE verdict=RED\n" as *u8); sys_exit(1); return 1
62}