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}