code wiki / _hdl_build / nx_release_master_gate.nx

nx_release_master_gate.nx source

↩ module page · 118 lines · 7571 B

1// nx_release_master_gate.nx -- referee for the RELEASE-MASTER coordinated-deploy lifecycle. 2// PROVES the operator's "rollouts coordinated + workstreams stop crashing everything" as a decision matrix: 3// T1 no-bless-without-pass: gate_passed=0 -> ABORTED, prod UNTOUCHED (liar-kill: an un-gated deploy = RED) 4// T2 good deploy: gate_passed=1 + healthy candidate -> DEPLOYED, live swapped, backup saved 5// T3 bad deploy: healthy gate but UNHEALTHY artifact -> ROLLED_BACK, live RESTORED (prod survives a bad push) 6// T4 no candidate: missing artifact -> ABORTED, prod UNTOUCHED 7// T5 SERIALIZE: 8 concurrent workstreams deploy to the SAME sink -> all 8 complete under the lease, live is a 8// COMPLETE (non-torn) artifact = the exact "two workstreams crash each other on the shared sink" fix. 9// GREEN iff every row matches. Prints verdict=GREEN to STDOUT *and* returns the exit code (0=pass). 10// Durable verdict -> knowledge/status/release_master_gate.log. license_tier: ORIGINAL 11import "nx_release_master.nx" 12import "nx_deploy.nx" 13import "nx_syscalls.nx" 14 15func 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 } 16func g_num(v: i64) -> i64 { let bb: *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 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(1,bb,k); return 0 } 17func g_w(fd: i64, s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(fd,s,n); return 0 } 18func g_wn(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m}; let t: *u8=sys_mmap(28); var k: i64=0; if m==0{t[0]=(48 as u8);k=1}; while m>0{t[k]=((48+(m%10)) as u8);m=m/10;k=k+1}; var i: i64=0; while i<k{bb[i]=t[k-1-i];i=i+1}; sys_write(fd,bb,k); return 0 } 19 20func gwrite(path: *u8, s: *u8, n: i64) -> i64 { let fd: i64 = sys_openat_wr(path, 0x1a4); if fd<0 { return 0 } if n>0 { sys_write(fd, s, n) } sys_close(fd); return 0 } 21// count non-overlapping occurrences of pat in path's content. 22func gcount(path: *u8, pat: *u8) -> i64 { 23 let fd: i64 = sys_openat_rd(path); if fd<0 { return 0 } 24 let buf: *u8 = sys_mmap(262144); var n: i64=0; var go: i64=1 25 while go==1 { let r: i64=sys_read(fd, buf+n, 262144-n); if r<=0 {go=0} else { n=n+r; if n>=262144 {go=0} } } 26 sys_close(fd) 27 let pl: i64 = rm_len(pat); if pl<=0 { return 0 } 28 var c: i64=0; var i: i64=0 29 while i + pl <= n { 30 var j: i64=0; var m: i64=1 31 while j<pl { if buf[i+j]!=pat[j] {m=0;j=pl} else {j=j+1} } 32 if m==1 { c=c+1; i=i+pl } else { i=i+1 } 33 } 34 return c 35} 36func chk(got: i64, want: i64, label: *u8) -> i64 { 37 g_puts(" "); g_puts(label); g_puts(" got="); g_num(got); g_puts(" want="); g_num(want) 38 if got == want { g_puts(" PASS\n"); return 1 } 39 g_puts(" FAIL\n"); return 0 40} 41 42func main() -> i64 { 43 g_puts("=== RELEASE-MASTER GATE (coordinated, blessed, rollback-safe, serialized deploy) ===\n" as *u8) 44 var pass: i64=0 45 var rows: i64=0 46 47 let live: *u8 = "/tmp/nx_rmg_live" as *u8 48 let cand: *u8 = "/tmp/nx_rmg_cand" as *u8 49 let cand2: *u8 = "/tmp/nx_rmg_cand2" as *u8 50 let ledger: *u8 = "/tmp/nx_rmg_ledger" as *u8 51 let res: *u8 = "nx_rmg" as *u8 52 let marker: *u8 = "SERVING" as *u8 53 let bak: *u8 = sys_mmap(1280); rm_cat(live, ".bak" as *u8, bak) 54 55 gwrite(ledger, "" as *u8, 0) // fresh ledger 56 gwrite(live, "ORIGINAL SERVING v0" as *u8, 19) // current good production 57 gwrite(cand, "NEWGOOD SERVING v1" as *u8, 18) // a healthy candidate 58 59 // T1: no bless without a gate pass -> ABORTED, prod untouched 60 let v1: i64 = rm_deploy(cand, live, 0, res, ledger, marker) 61 rows=rows+1; pass=pass+chk(v1, DEP_ABORTED, "no-gate-pass -> ABORTED" as *u8) 62 rows=rows+1; pass=pass+chk(rm_contains(live, "ORIGINAL" as *u8), 1, " -> prod UNTOUCHED (still ORIGINAL)" as *u8) 63 64 // T2: blessed healthy deploy -> DEPLOYED, swapped, backup saved 65 let v2: i64 = rm_deploy(cand, live, 1, res, ledger, marker) 66 rows=rows+1; pass=pass+chk(v2, DEP_DEPLOYED, "blessed+healthy -> DEPLOYED" as *u8) 67 rows=rows+1; pass=pass+chk(rm_contains(live, "NEWGOOD" as *u8), 1, " -> live swapped to candidate" as *u8) 68 rows=rows+1; pass=pass+chk(rm_contains(bak, "ORIGINAL" as *u8), 1, " -> backup saved (rollback point)" as *u8) 69 70 // T3: blessed but UNHEALTHY artifact (no serving marker) -> ROLLED_BACK, prod restored+survives 71 gwrite(cand2, "BROKEN no-marker v2" as *u8, 19) 72 let v3: i64 = rm_deploy(cand2, live, 1, res, ledger, marker) 73 rows=rows+1; pass=pass+chk(v3, DEP_ROLLED_BACK, "blessed+UNHEALTHY -> ROLLED_BACK" as *u8) 74 rows=rows+1; pass=pass+chk(rm_contains(live, "NEWGOOD" as *u8), 1, " -> live RESTORED (prod survives)" as *u8) 75 rows=rows+1; pass=pass+chk(rm_contains(live, "BROKEN" as *u8), 0, " -> broken bytes NOT live" as *u8) 76 77 // T4: missing candidate -> ABORTED, prod untouched (never swap to nothing) 78 let v4: i64 = rm_deploy("/tmp/nx_rmg_missing" as *u8, live, 1, res, ledger, marker) 79 rows=rows+1; pass=pass+chk(v4, DEP_ABORTED, "missing candidate -> ABORTED" as *u8) 80 rows=rows+1; pass=pass+chk(rm_contains(live, "NEWGOOD" as *u8), 1, " -> prod UNTOUCHED" as *u8) 81 82 // T5: SERIALIZE -- 8 concurrent workstreams deploy to the SAME live under the SAME lease. 83 gwrite(ledger, "" as *u8, 0) // reset ledger to count this round cleanly 84 var p: i64 = 0 85 while p < 8 { // parent pre-writes 8 healthy candidates 86 let cp: *u8 = sys_mmap(64); var o: i64 = rm_puts(cp,0,"/tmp/nx_rmg_c" as *u8); cp[o]=(48+p) as u8; cp[o+1]=0 as u8 87 let cc: *u8 = sys_mmap(64); var co: i64 = rm_puts(cc,0,"WS" as *u8); cc[co]=(48+p) as u8; co=co+1; co=rm_puts(cc,co," SERVING d" as *u8); cc[co]=(48+p) as u8; co=co+1 88 gwrite(cp, cc, co) 89 p = p + 1 90 } 91 var i: i64 = 0 92 while i < 8 { 93 let pid: i64 = sys_fork() 94 if pid == 0 { 95 let cp2: *u8 = sys_mmap(64); var o2: i64 = rm_puts(cp2,0,"/tmp/nx_rmg_c" as *u8); cp2[o2]=(48+i) as u8; cp2[o2+1]=0 as u8 96 rm_deploy(cp2, live, 1, res, ledger, marker) 97 sys_exit(0) 98 } 99 i = i + 1 100 } 101 let st: *i64 = sys_mmap(16) as *i64 102 var reaped: i64 = 0 103 while reaped < 8 { let w: i64 = sys_wait4(0-1, st, 0); if w > 0 { reaped = reaped + 1 } else { reaped = 8 } } 104 rows=rows+1; pass=pass+chk(rm_health(live, marker), 1, "8x concurrent: live is a COMPLETE serving artifact (not torn)" as *u8) 105 rows=rows+1; pass=pass+chk(rm_contains(live, "WS" as *u8), 1, " -> live holds one workstream's full content" as *u8) 106 rows=rows+1; pass=pass+chk(gcount(ledger, "verdict=1 " as *u8), 8, " -> ledger: all 8 deploys completed (serialized)" as *u8) 107 108 g_puts("----\nRELEASE-MASTER-GATE rows=" as *u8); g_num(rows); g_puts(" pass=" as *u8); g_num(pass) 109 if pass==rows { g_puts(" verdict=GREEN\n" as *u8) } else { g_puts(" verdict=RED\n" as *u8) } 110 let lg: i64=sys_openat_append("knowledge/status/release_master_gate.log" as *u8, 0x1a4) 111 if lg>=0 { 112 g_w(lg, "RELEASE-MASTER-GATE rows=" as *u8); g_wn(lg, rows); g_w(lg, " pass=" as *u8); g_wn(lg, pass) 113 if pass==rows { g_w(lg, " verdict=GREEN\n" as *u8) } else { g_w(lg, " verdict=RED\n" as *u8) } 114 sys_close(lg) 115 } 116 if pass==rows { sys_exit(0); return 0 } 117 sys_exit(1); return 1 118}