code wiki / (root) / nx_memindex_budget_gate.nx

nx_memindex_budget_gate.nx source

↩ module page · 173 lines · 8227 B

1// nx_memindex_budget_gate.nx -- liar-killed GATE for the memindex TOTAL-size budget (the 2// remaining memindex-cap-treadmill rail feature). Forks the REAL built elf 3// (_build/nx_memindex_emit.sov.elf) against byte-exact fixtures and proves: 4// - budget split keeps the NEWEST entries in the md block, moves the OLDEST into the 5// overflow file's COINDEX-OVFL block (presence AND absence checks = neg-controls) 6// - NO-LOSS: every slug lands in exactly one of the two blocks 7// - both files fully re-derive -> IDEMPOTENT (second identical run byte-identical) 8// - FAIL-CLOSED: overflow file without markers is untouched AND nothing is evicted 9// (the md gets the FULL block -- no entry ever silently vanishes) 10// - the newest entry is NEVER evicted (budget=1 still keeps it live) 11// - 2-arg form = unbudgeted back-compat (full block, no overflow writes) 12// Fixture line sizes are chosen so budget=24 keeps exactly {e5,e6}: e6=14B + e5=8B = 22 <= 24, 13// +e4(8B)=30 > 24. usage: nx_memindex_budget_gate [emit_elf] Exit 0 only on 9/9. 14// license_tier: ORIGINAL expect_exit: 0 15import "nx_syscalls.nx" 16import "nx_crashresume_census_core.nx" 17 18// module statics at TOP (flag/data statics before any reader -- forward-ref gotcha) 19static g_av: i64 = 0 20 21func g_puts(s: *u8) -> i64 { var n: i64 = 0; while s[n] != (0 as u8) { n = n + 1 } sys_write(1, s, n); return 0 } 22func g_putn(v: i64) -> i64 { nxi_out(v); return 0 } 23func g_bool(name: *u8, got: i64, want: i64, passp: *i64) -> i64 { 24 g_puts("T " as *u8); g_puts(name); g_puts(" got=" as *u8); g_putn(got) 25 if got == want { g_puts(" PASS\n" as *u8); passp[0] = passp[0] + 1 } else { g_puts(" FAIL\n" as *u8) } 26 return 0 27} 28func g_write(path: *u8, s: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 420); if fd < 0 { return 0 - 1 } sys_write(fd, s, ccz_slen(s)); sys_close(fd); return 0 } 29func g_has(hay: *u8, hn: i64, needle: *u8) -> i64 { 30 let nn: i64 = ccz_slen(needle) 31 if nn == 0 { return 0 } 32 var i: i64 = 0 33 while i + nn <= hn { 34 var k: i64 = 0 35 var ok: i64 = 1 36 while k < nn { if hay[i+k] != needle[k] { ok = 0; k = nn } k = k + 1 } 37 if ok == 1 { return 1 } 38 i = i + 1 39 } 40 return 0 41} 42func g_same(p: *u8, q: *u8, qn: i64) -> i64 { 43 let b: *u8 = sys_mmap(262144) 44 let n: i64 = ccz_read(p, b, 262143) 45 if n != qn { return 0 } 46 var i: i64 = 0 47 while i < n { if b[i] != q[i] { return 0 } i = i + 1 } 48 return 1 49} 50// file at p contains needle? 51func g_fhas(p: *u8, needle: *u8) -> i64 { 52 let b: *u8 = sys_mmap(262144) 53 let n: i64 = ccz_read(p, b, 262143) 54 if n <= 0 { return 0 } 55 return g_has(b, n, needle) 56} 57// fork+exec the argv prepared in g_av (module static -- keeps this helper to ZERO data args, 58// sidestepping the multi-arg helper miscompile class), wait, return exit code. 59func g_run() -> i64 { 60 let av: *i64 = g_av as *i64 61 let pid: i64 = sys_fork() 62 if pid < 0 { return 127 } 63 if pid == 0 { 64 sys_execve(av[0] as *u8, av, 0 as *i64) 65 sys_exit(127) 66 } 67 let st: *i64 = sys_mmap(16) as *i64 68 sys_wait4(pid, st, 0) 69 return wait_exit_code(st[0]) 70} 71 72func fixtures(md: *u8, ov: *u8) -> i64 { 73 g_write(md, "# top MDTOP\n<!-- COINDEX:BEGIN -->\nstale-md\n<!-- COINDEX:END -->\n# bottom MDBOT\n" as *u8) 74 g_write(ov, "# ov OVTOP\n<!-- COINDEX-OVFL:BEGIN -->\nstale-ovfl\n<!-- COINDEX-OVFL:END -->\n# ovbot OVBOT\n" as *u8) 75 return 0 76} 77 78func main(argc: i64, argv: *i64) -> i64 { 79 var elf: *u8 = "_build/nx_memindex_emit.sov.elf" as *u8 80 if argc >= 2 { elf = argv[1] as *u8 } 81 let pass: *i64 = sys_mmap(16) as *i64 82 pass[0] = 0 83 let avb: *i64 = sys_mmap(128) as *i64 84 g_av = avb as i64 85 86 let jr: *u8 = "/tmp/mib.journal" as *u8 87 let mdp: *u8 = "/tmp/mib.md" as *u8 88 let ovp: *u8 = "/tmp/mib.ovfl" as *u8 89 g_write(jr, "e1 one-oldest\ne2 two\ne3 three\ne4 four\ne5 five\ne6 six-newest\n" as *u8) 90 91 // ---- Phase A: big budget -> NO eviction, ovfl block derives EMPTY (stale gone) ---- 92 fixtures(mdp, ovp) 93 avb[0] = elf as i64; avb[1] = jr as i64; avb[2] = mdp as i64; avb[3] = ovp as i64; avb[4] = "4096" as *u8 as i64; avb[5] = 0 94 let rcA: i64 = g_run() 95 g_bool("emit-exit0" as *u8, rcA, 0, pass) 96 var ok2: i64 = 0 97 if g_fhas(mdp, "e1 one-oldest" as *u8) == 1 { if g_fhas(mdp, "e6 six-newest" as *u8) == 1 { if g_fhas(mdp, "stale-md" as *u8) == 0 { if g_fhas(ovp, "stale-ovfl" as *u8) == 0 { if g_fhas(ovp, "OVTOP" as *u8) == 1 { if g_fhas(ovp, "OVBOT" as *u8) == 1 { ok2 = 1 } } } } } } 98 g_bool("nobudget-all-live+ovfl-derived-empty" as *u8, ok2, 1, pass) 99 100 // ---- Phase B: budget 24 -> newest {e5,e6} LIVE, oldest {e1..e4} evicted ---- 101 fixtures(mdp, ovp) 102 avb[4] = "24" as *u8 as i64 103 g_run() 104 var ok3a: i64 = 0 105 if g_fhas(mdp, "e5 five" as *u8) == 1 { if g_fhas(mdp, "e6 six-newest" as *u8) == 1 { if g_fhas(mdp, "e1 one-oldest" as *u8) == 0 { if g_fhas(mdp, "e4 four" as *u8) == 0 { ok3a = 1 } } } } 106 g_bool("evict-md-newest-only" as *u8, ok3a, 1, pass) 107 var ok3b: i64 = 0 108 if g_fhas(ovp, "e1 one-oldest" as *u8) == 1 { if g_fhas(ovp, "e4 four" as *u8) == 1 { if g_fhas(ovp, "e6 six-newest" as *u8) == 0 { ok3b = 1 } } } 109 g_bool("evict-ovfl-oldest-only" as *u8, ok3b, 1, pass) 110 var lost: i64 = 0 111 var si: i64 = 0 112 let slugs: *i64 = sys_mmap(64) as *i64 113 slugs[0] = "e1 one-oldest" as *u8 as i64 114 slugs[1] = "e2 two" as *u8 as i64 115 slugs[2] = "e3 three" as *u8 as i64 116 slugs[3] = "e4 four" as *u8 as i64 117 slugs[4] = "e5 five" as *u8 as i64 118 slugs[5] = "e6 six-newest" as *u8 as i64 119 while si < 6 { 120 let nd: *u8 = slugs[si] as *u8 121 var found: i64 = 0 122 if g_fhas(mdp, nd) == 1 { found = 1 } 123 if g_fhas(ovp, nd) == 1 { found = found + 1 } 124 if found != 1 { lost = lost + 1 } 125 si = si + 1 126 } 127 g_bool("no-loss-each-slug-exactly-once" as *u8, lost, 0, pass) 128 129 // ---- Phase C: idempotent -- identical re-run leaves BOTH files byte-identical ---- 130 let snapm: *u8 = sys_mmap(262144) 131 let snm: i64 = ccz_read(mdp, snapm, 262143) 132 let snapo: *u8 = sys_mmap(262144) 133 let sno: i64 = ccz_read(ovp, snapo, 262143) 134 g_run() 135 var ok5: i64 = 0 136 if g_same(mdp, snapm, snm) == 1 { if g_same(ovp, snapo, sno) == 1 { ok5 = 1 } } 137 g_bool("idempotent-both-files" as *u8, ok5, 1, pass) 138 139 // ---- Phase D: FAIL-CLOSED -- markerless overflow untouched AND nothing evicted ---- 140 let md2: *u8 = "/tmp/mib2.md" as *u8 141 let ovnm: *u8 = "/tmp/mib.ovnm" as *u8 142 g_write(md2, "# top MDTOP\n<!-- COINDEX:BEGIN -->\nstale-md\n<!-- COINDEX:END -->\n# bottom MDBOT\n" as *u8) 143 g_write(ovnm, "# no markers here NM\n- body\n" as *u8) 144 let snapn: *u8 = sys_mmap(4096) 145 let snn: i64 = ccz_read(ovnm, snapn, 4095) 146 avb[2] = md2 as i64; avb[3] = ovnm as i64 147 g_run() 148 var ok6: i64 = 0 149 if g_same(ovnm, snapn, snn) == 1 { if g_fhas(md2, "e1 one-oldest" as *u8) == 1 { if g_fhas(md2, "e6 six-newest" as *u8) == 1 { ok6 = 1 } } } 150 g_bool("failclosed-noevict-fullblock-stays" as *u8, ok6, 1, pass) 151 152 // ---- Phase E: newest NEVER evicted even at budget=1 ---- 153 fixtures(mdp, ovp) 154 avb[2] = mdp as i64; avb[3] = ovp as i64; avb[4] = "1" as *u8 as i64 155 g_run() 156 var ok7: i64 = 0 157 if g_fhas(mdp, "e6 six-newest" as *u8) == 1 { if g_fhas(mdp, "e5 five" as *u8) == 0 { if g_fhas(ovp, "e5 five" as *u8) == 1 { if g_fhas(ovp, "e1 one-oldest" as *u8) == 1 { ok7 = 1 } } } } 158 g_bool("newest-never-evicted" as *u8, ok7, 1, pass) 159 160 // ---- Phase F: 2-arg back-compat -- full block, no overflow involvement ---- 161 let md3: *u8 = "/tmp/mib3.md" as *u8 162 g_write(md3, "# top MDTOP\n<!-- COINDEX:BEGIN -->\nstale-md\n<!-- COINDEX:END -->\n# bottom MDBOT\n" as *u8) 163 avb[2] = md3 as i64; avb[3] = 0; avb[4] = 0 164 let rcF: i64 = g_run() 165 var ok8: i64 = 0 166 if rcF == 0 { if g_fhas(md3, "e1 one-oldest" as *u8) == 1 { if g_fhas(md3, "e6 six-newest" as *u8) == 1 { ok8 = 1 } } } 167 g_bool("backcompat-2arg-full-block" as *u8, ok8, 1, pass) 168 169 g_puts("MIB-GATE pass=" as *u8); g_putn(pass[0]); g_puts("/9 verdict=" as *u8) 170 if pass[0] == 9 { g_puts("GREEN\n" as *u8); return 0 } 171 g_puts("RED\n" as *u8) 172 return 1 173}