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}