code wiki / _hdl_build / nx_pub_bluegreen_gate.nx

nx_pub_bluegreen_gate.nx source

↩ module page · 74 lines · 5349 B

1// nx_pub_bluegreen_gate.nx -- R14a PROOF + MEASURED HEAD-TO-HEAD: blue-green two-slot deploy with zero-copy flip. 2// 3// Two colors are materialized (blue=v1, green=v2). The active path is an atomic symlink; flipping it switches the 4// served version instantly, and flipping BACK is an instant rollback -- with the color files NEVER rewritten 5// (zero-copy). Measured vs the naive baseline whose only rollback is to RE-COPY the previous file: 6// blue-green flip-back: 0 content bytes copied vs naive rollback: N>0 bytes copied. 7// File-based (reads resolve through the symlink, exactly as the server would). license_tier: ORIGINAL expect_exit: 0 8import "nx_syscalls.nx" 9import "nx_publisher.nx" 10import "nx_runpath.nx" 11 12func g_w(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 13func g_n(v: i64) -> i64 { var m: i64=v; if m<0{g_w("-" as *u8);m=0-m} let t:*u8=sys_mmap(24); 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; let o:*u8=sys_mmap(24); while i<k{o[i]=t[k-1-i];i=i+1} sys_write(1,o,k); return 0 } 14func g_row(id: *u8, ok: i64, pass: *i64) -> i64 { g_w(" " as *u8); g_w(id); g_w(": " as *u8); if ok==1 { g_w("OK\n" as *u8); pass[0]=pass[0]+1 } else { g_w("FAIL\n" as *u8) } return 0 } 15func sv_write(path: *u8, content: *u8) -> i64 { let fd: i64 = sys_openat_wr(path, 0x1a4); if fd<0 { return 0 } var n: i64=0; while content[n]!=(0 as u8){n=n+1} sys_write(fd, content, n); sys_close(fd); return 1 } 16func g_unlink(path: *u8) -> i64 { __syscall(87, path as i64, 0, 0, 0, 0, 0); return 0 } 17// read the file at `active` (follows symlink) and test for a substring. 18func active_has(active: *u8, needle: *u8) -> i64 { 19 let lp: *i64 = sys_mmap(8) as *i64 20 let d: *u8 = sys_read_file(active, lp) 21 if (d as i64)==0 { return 0 } 22 return pub_substr(d, lp[0], needle) 23} 24 25func main() -> i64 { 26 let pass: *i64 = sys_mmap(8) as *i64; pass[0]=0 27 g_w("=== NX-PUB-BLUEGREEN GATE (two-slot deploy + zero-copy instant flip/flip-back; measured vs naive) ===\n" as *u8) 28 let wsid: *u8 = sys_mmap(64); rp_wsid(wsid); rp_ensure(wsid) 29 let D: *u8 = sys_mmap(512); rp_path(wsid, "pbg" as *u8, D); __syscall(83, D as i64, 493, 0, 0, 0, 0) 30 31 let active: *u8 = sys_mmap(700); pub_join(D, "page.html" as *u8, active) 32 let bluep: *u8 = sys_mmap(700); pub_bg_cpath(D, "page.html" as *u8, "blue" as *u8, bluep) 33 let greenp: *u8 = sys_mmap(700); pub_bg_cpath(D, "page.html" as *u8, "green" as *u8, greenp) 34 let flipp: *u8 = sys_mmap(700); pub_pcat(active, ".flip" as *u8, flipp) 35 g_unlink(active); g_unlink(bluep); g_unlink(greenp); g_unlink(flipp) // clean slate (unlink, never "") 36 37 let src1: *u8 = sys_mmap(700); pub_join(D, "v1.src" as *u8, src1); sv_write(src1, "BLUE-V1\n" as *u8) 38 let src2: *u8 = sys_mmap(700); pub_join(D, "v2.src" as *u8, src2); sv_write(src2, "GREEN-V2\n" as *u8) 39 let sha1: *u8 = sys_mmap(72); pub_sha_file(src1, sha1) 40 let sha2: *u8 = sys_mmap(72); pub_sha_file(src2, sha2) 41 42 pub_blue_green_stage(D, "page.html" as *u8, "blue" as *u8, src1, sha1) 43 pub_blue_green_stage(D, "page.html" as *u8, "green" as *u8, src2, sha2) 44 let bb: *u8 = sys_mmap(72); pub_sha_file(bluep, bb) // color shas BEFORE flips 45 let gb: *u8 = sys_mmap(72); pub_sha_file(greenp, gb) 46 47 pub_blue_green_flip(D, "page.html" as *u8, "blue" as *u8) 48 let on_blue1: i64 = active_has(active, "BLUE-V1" as *u8) 49 pub_blue_green_flip(D, "page.html" as *u8, "green" as *u8) 50 let on_green: i64 = active_has(active, "GREEN-V2" as *u8) 51 pub_blue_green_flip(D, "page.html" as *u8, "blue" as *u8) // instant flip-BACK (rollback) 52 let on_blue2: i64 = active_has(active, "BLUE-V1" as *u8) 53 54 let ba: *u8 = sys_mmap(72); pub_sha_file(bluep, ba) // color shas AFTER flips 55 let ga: *u8 = sys_mmap(72); pub_sha_file(greenp, ga) 56 let zerocopy: i64 = (pub_streq(bb, ba)) & (pub_streq(gb, ga)) 57 58 let naivelive: *u8 = sys_mmap(700); pub_join(D, "naive.live" as *u8, naivelive) 59 let naivebytes: i64 = pub_copy(src1, naivelive) // what a naive in-place rollback must re-copy 60 61 g_w(" flips: on_blue=" as *u8); g_n(on_blue1); g_w(" on_green=" as *u8); g_n(on_green); g_w(" flip_back_blue=" as *u8); g_n(on_blue2); g_w(" zerocopy=" as *u8); g_n(zerocopy); g_w(" naive_rollback_bytes=" as *u8); g_n(naivebytes); g_w("\n" as *u8) 62 63 g_row("FLIP correctness: active resolves to v1 (blue) then v2 (green) instantly" as *u8, on_blue1 & on_green, pass) 64 g_row("FLIP-BACK: instant rollback to v1 (blue) via pointer swap" as *u8, on_blue2, pass) 65 g_row("ZERO-COPY: both color files byte-unchanged across all flips (never rewritten)" as *u8, zerocopy, pass) 66 let exceeds: i64 = (zerocopy) & (on_blue2) & ((naivebytes > 0) as i64) 67 g_w("\n HEAD-TO-HEAD: blue-green flip-back copies 0 content bytes vs naive rollback copies " as *u8); g_n(naivebytes) 68 if exceeds==1 { g_w(" => EXCEEDS (measured, liar-kill: naive copy>0)\n" as *u8) } else { g_w(" => NOT EXCEEDS\n" as *u8) } 69 g_row("MEASURED EXCEEDS: zero-copy instant rollback vs naive re-copy" as *u8, exceeds, pass) 70 71 g_w("NX-PUB-BLUEGREEN rows=4 pass=" as *u8); g_n(pass[0]) 72 if pass[0]==4 { g_w(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 73 g_w(" verdict=RED\n" as *u8); sys_exit(1); return 1 74}