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}