code wiki / _hdl_build / _queue_load_gate_authored.nx

_queue_load_gate_authored.nx source

↩ module page · 166 lines · 6365 B

1// _queue_load_gate_authored.nx -- gate for IM-Q1 (the queue on the sovereign 2// store). Scratch store prefix + scratch queue through the REAL organ elf: 3// run1: ingest (queue rows + sponsor surfaces) -> store populated 4// run2: NOTHING changed -> added=0 (idempotency BY CONSTRUCTION) 5// run3: one row's status flipped in the scratch queue -> added=1 (exactly 6// the changed row becomes a NEW VERSION under the same aq: key) and 7// the store's LATEST value for that key reflects the flip -- the 8// time-travel property the bare TSV can never have. 9// Markers: QLG-*; final QLGATE row -> knowledge/status/infomgmt_store.log 10// license_tier: ORIGINAL 11 12import "nx_syscalls.nx" 13import "nx_seg_store.nx" 14 15func qlg_p(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 16func qlg_f(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 } 17func qlg_n(fd: i64, v: i64) -> i64 { let bb: *u8=sys_mmap(28); var m: i64=v; if m<0{m=0-m; sys_write(fd,"-" 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)) 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 } 18 19func qlg_chk(label: *u8, ok: i64, bad: *i64) -> i64 { 20 qlg_p("QLG-" as *u8) 21 qlg_p(label) 22 if ok == 1 { qlg_p(" ok\n" as *u8) } else { qlg_p(" BAD\n" as *u8); bad[0] = bad[0] + 1 } 23 return 0 24} 25 26func qlg_seed(qp: *u8, qb_done: i64) -> i64 { 27 let fd: i64 = sys_openat_wr(qp, 0x1a4) 28 if fd < 0 { return 0 } 29 qlg_f(fd, "# scratch queue for the queue-load gate\n" as *u8) 30 qlg_f(fd, "QA\tX\t9\tS\tBuilder\tTODO\t-\tg\trow a\n" as *u8) 31 if qb_done == 1 { 32 qlg_f(fd, "QB\tX\t8\tS\tBuilder\tDONE\t-\tg\trow b\n" as *u8) 33 } else { 34 qlg_f(fd, "QB\tX\t8\tS\tBuilder\tTODO\t-\tg\trow b\n" as *u8) 35 } 36 qlg_f(fd, "QC\tX\t7\tS\tWarden\tNOVEL\t-\tg\trow c\n" as *u8) 37 var i: i64 = 0 38 while i < 8 { qlg_f(fd, "\n" as *u8); i = i + 1 } 39 sys_close(fd) 40 return 1 41} 42 43// spawn the built organ elf: argv[1]=prefix argv[2]=queue, stdout -> outpath 44func qlg_run(prefix: *u8, qp: *u8, outpath: *u8) -> i64 { 45 let pid: i64 = sys_fork() 46 if pid == 0 { 47 let ofd: i64 = sys_openat_wr(outpath, 0x1a4) 48 if ofd >= 0 { sys_dup3(ofd, 1, 0) } 49 let argv: *i64 = sys_mmap(40) as *i64 50 argv[0] = "/tmp/nx_queue_load.sov.elf" as *u8 as i64 51 argv[1] = prefix as i64 52 argv[2] = qp as i64 53 argv[3] = 0 54 let envp: *i64 = sys_mmap(16) as *i64 55 envp[0] = 0 56 sys_execve("/tmp/nx_queue_load.sov.elf" as *u8, argv, envp) 57 sys_exit(127) 58 } 59 let st: *i64 = sys_mmap(16) as *i64 60 sys_wait4(pid, st, 0) 61 return (st[0] >> 8) & 0xff 62} 63 64func qlg_has(path: *u8, pat: *u8) -> i64 { 65 let buf: *u8 = sys_mmap(65536) 66 let fd: i64 = sys_openat_rd(path) 67 if fd < 0 { return 0 } 68 var n: i64 = 0 69 var r: i64 = sys_read(fd, buf, 65535) 70 while r > 0 { n = n + r; r = sys_read(fd, buf + n, 65535 - n) } 71 sys_close(fd) 72 var pl: i64 = 0 73 while pat[pl] != (0 as u8) { pl = pl + 1 } 74 var i: i64 = 0 75 while i + pl <= n { 76 var k: i64 = 0 77 var hit: i64 = 1 78 while k < pl { 79 if buf[i + k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } 80 } 81 if hit == 1 { return 1 } 82 i = i + 1 83 } 84 return 0 85} 86 87// does the store's LATEST value for key contain pat? 88func qlg_latest_has(prefix: *u8, key: *u8, pat: *u8) -> i64 { 89 let h: *i64 = ss_open(prefix) 90 let pp: *i64 = sys_mmap(16) as *i64 91 let ll: *i64 = sys_mmap(16) as *i64 92 if ss_hget(h, key, pp, ll) != 1 { return 0 } 93 let v: *u8 = pp[0] as *u8 94 let n: i64 = ll[0] 95 var pl: i64 = 0 96 while pat[pl] != (0 as u8) { pl = pl + 1 } 97 var i: i64 = 0 98 while i + pl <= n { 99 var k: i64 = 0 100 var hit: i64 = 1 101 while k < pl { 102 if v[i + k] != pat[k] { hit = 0; k = pl } else { k = k + 1 } 103 } 104 if hit == 1 { return 1 } 105 i = i + 1 106 } 107 return 0 108} 109 110func main() -> i64 { 111 let badv: *i64 = sys_mmap(16) as *i64 112 badv[0] = 0 113 qlg_p("=== queue-load gate (IM-Q1: the queue on the sovereign store) ===\n" as *u8) 114 // per-run unique scratch prefix: a prior run's /tmp store would dedup 115 // run3's flipped row and fake added=0 (staleness law) 116 let prefix: *u8 = sys_mmap(96) 117 var po: i64 = 0 118 po = ss_cat(prefix, po, "/tmp/_aqstore" as *u8) 119 po = ss_catn(prefix, po, sys_now_us()) 120 po = ss_cat(prefix, po, "-" as *u8) 121 prefix[po] = 0 as u8 122 let qp: *u8 = "/tmp/_aq_scratch.tsv" as *u8 123 124 if qlg_seed(qp, 0) != 1 { qlg_p("QLGATE verdict=RED reason=seed-fail\n" as *u8); sys_exit(98) } 125 let rc1: i64 = qlg_run(prefix, qp, "/tmp/_qlg_out1.txt" as *u8) 126 var c: i64 = 0 127 if rc1 == 0 { if qlg_has("/tmp/_qlg_out1.txt" as *u8, "verdict=GREEN" as *u8) == 1 { c = 1 } } 128 qlg_chk("RUN1-GREEN" as *u8, c, badv) 129 c = 0 130 if qlg_latest_has(prefix, "aq:QA" as *u8, "row a" as *u8) == 1 { c = 1 } 131 qlg_chk("KEY-PRESENT" as *u8, c, badv) 132 133 let rc2: i64 = qlg_run(prefix, qp, "/tmp/_qlg_out2.txt" as *u8) 134 c = 0 135 if rc2 == 0 { if qlg_has("/tmp/_qlg_out2.txt" as *u8, " added=0 " as *u8) == 1 { c = 1 } } 136 qlg_chk("RUN2-IDEMPOTENT" as *u8, c, badv) 137 138 qlg_seed(qp, 1) 139 let rc3: i64 = qlg_run(prefix, qp, "/tmp/_qlg_out3.txt" as *u8) 140 c = 0 141 if rc3 == 0 { if qlg_has("/tmp/_qlg_out3.txt" as *u8, " added=1 " as *u8) == 1 { c = 1 } } 142 qlg_chk("RUN3-VERSION-ON-CHANGE" as *u8, c, badv) 143 c = 0 144 if qlg_latest_has(prefix, "aq:QB" as *u8, "DONE" as *u8) == 1 { c = 1 } 145 qlg_chk("LATEST-REFLECTS-FLIP" as *u8, c, badv) 146 147 let lg: i64 = sys_openat_append("knowledge/status/infomgmt_store.log" as *u8, 0x1a4) 148 var rcg: i64 = 0 149 if badv[0] == 0 { 150 qlg_p("QLGATE checks=5/5 verdict=GREEN\n" as *u8) 151 if lg >= 0 { 152 qlg_f(lg, "QLGATE checks=5/5 verdict=GREEN epoch=" as *u8) 153 qlg_n(lg, sys_now_realtime_sec()) 154 qlg_f(lg, "\n" as *u8) 155 } 156 } else { 157 qlg_p("QLGATE verdict=RED bad=" as *u8) 158 qlg_n(1, badv[0]) 159 qlg_p("\n" as *u8) 160 if lg >= 0 { qlg_f(lg, "QLGATE verdict=RED\n" as *u8) } 161 rcg = badv[0] 162 } 163 if lg >= 0 { sys_close(lg) } 164 sys_exit(rcg) 165 return rcg 166}