code wiki / _hdl_build / nx_mark_migrate.nx
nx_mark_migrate.nx source
↩ module page · 161 lines · 7761 B
1// nx_mark_migrate.nx -- X-Q-003b: migrate hand-seeded queue rows from prose
2// gate cells to LITERAL machine markers, so nx_reconcile can own their DONE
3// flip. Reads the marker MAP knowledge/registry/row_markers.tsv (id -> marker)
4// and, for each queue row whose id is in the map and whose gate cell lacks
5// "||MARK=", appends "||MARK=<marker>" to that row's gate field (field 7, before
6// the 8th tab). Idempotent (already-marked rows skipped); whole-file rewrite,
7// safe at this row count. (Rows generated by nx_gap_to_queue self-embed their
8// marker and need no map entry -- this organ is for pre-existing rows whose
9// gates ship later.) Appends MARKMIGRATE rows to knowledge/status/mark_migrate.log.
10// license_tier: ORIGINAL
11import "nx_registry_lock.nx" // lib-only (nx_syscalls transitive); rt_lock/rt_unlock for the shared queue lock
12const K_MAGIC_131072: i64 = 131072
13const K_MAGIC_1048576: i64 = 1048576
14const K_MAGIC_1310720: i64 = 1310720
15
16func mm_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 }
17func mm_wn(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 mm_read(path: *u8, buf: *u8, cap: i64) -> i64 {
20 let fd: i64 = sys_openat_rd(path)
21 if fd < 0 { return 0 }
22 var n: i64 = 0
23 var r: i64 = sys_read(fd, buf, cap - 1)
24 while r > 0 { n = n + r; if n >= cap - 1 { r = 0 } else { r = sys_read(fd, buf + n, cap - 1 - n) } }
25 sys_close(fd)
26 buf[n] = 0 as u8
27 return n
28}
29
30func mm_at(buf: *u8, n: i64, i: i64, pat: *u8, pl: i64) -> i64 {
31 if i + pl > n { return 0 }
32 var k: i64 = 0
33 while k < pl { if buf[i + k] != pat[k] { return 0 } k = k + 1 }
34 return 1
35}
36
37// look up id (NUL-term) in the map buf; copy its marker to out; 1 found / 0 not
38func mm_lookup(mb: *u8, mn: i64, id: *u8, out: *u8, ocap: i64) -> i64 {
39 var ls: i64 = 0
40 var i: i64 = 0
41 while i <= mn {
42 var eol: i64 = 0
43 if i == mn { eol = 1 } else { if mb[i] == (10 as u8) { eol = 1 } }
44 if eol == 1 {
45 if mb[ls] != (35 as u8) {
46 // field 0 = id up to tab; compare to id
47 var mtch: i64 = 1
48 var k: i64 = 0
49 var p: i64 = ls
50 var go: i64 = 1
51 while go == 1 {
52 let c: i64 = id[k] as i64
53 if c == 0 {
54 if p < i { if mb[p] != (9 as u8) { mtch = 0 } }
55 go = 0
56 } else {
57 if p >= i { mtch = 0; go = 0 } else {
58 if mb[p] != id[k] { mtch = 0; go = 0 }
59 p = p + 1; k = k + 1
60 }
61 }
62 }
63 if mtch == 1 {
64 // marker = after the tab to eol
65 var q: i64 = p
66 if q < i { if mb[q] == (9 as u8) { q = q + 1 } }
67 var k2: i64 = 0
68 while q < i { if k2 < ocap - 1 { out[k2] = mb[q]; k2 = k2 + 1 } q = q + 1 }
69 out[k2] = 0 as u8
70 return 1
71 }
72 }
73 ls = i + 1
74 }
75 i = i + 1
76 }
77 return 0
78}
79
80func main() -> i64 {
81 let mb: *u8 = sys_mmap(K_MAGIC_131072)
82 let mn: i64 = mm_read("knowledge/registry/row_markers.tsv" as *u8, mb, K_MAGIC_131072)
83 if mn <= 0 { mm_w(1, "MARKMIGRATE verdict=GREEN applied=0 (no map)\n" as *u8); sys_exit(0) }
84 // ACQUIRE the SHARED queue lock around the whole read-modify-write of assignment_queue.tsv
85 // (serializes against nx_novel_close + the other writers); degrade-gracefully on giveup
86 // (-1 -> proceed unlocked, never wedge; O_EXCL stale-steal bounds a crashed holder to 30s).
87 let qlk: i64 = rt_lock("knowledge/registry/assignment_queue.tsv.lock" as *u8)
88 let qb: *u8 = sys_mmap(K_MAGIC_1048576)
89 let qn: i64 = mm_read("knowledge/registry/assignment_queue.tsv" as *u8, qb, K_MAGIC_1048576)
90 if qn <= 0 { if qlk >= 0 { rt_unlock("knowledge/registry/assignment_queue.tsv.lock" as *u8, qlk) } mm_w(1, "MARKMIGRATE verdict=RED reason=queue-missing\n" as *u8); sys_exit(101) }
91 let ob: *u8 = sys_mmap(K_MAGIC_1310720)
92 var on: i64 = 0
93 let id: *u8 = sys_mmap(64)
94 let mark: *u8 = sys_mmap(512)
95 var applied: i64 = 0
96 var ls: i64 = 0
97 var i: i64 = 0
98 while i <= qn {
99 var eol: i64 = 0
100 if i == qn { eol = 1 } else { if qb[i] == (10 as u8) { eol = 1 } }
101 if eol == 1 {
102 // copy line [ls, i) possibly with a marker inserted before the 8th tab
103 var changed: i64 = 0
104 if qb[ls] != (35 as u8) {
105 // extract id (field 0)
106 var k: i64 = 0
107 var p: i64 = ls
108 while p < i { if qb[p] == (9 as u8) { p = i } else { if k < 63 { id[k] = qb[p]; k = k + 1 } p = p + 1 } }
109 id[k] = 0 as u8
110 // already marked?
111 var hasmark: i64 = 0
112 var s: i64 = ls
113 while s < i { if mm_at(qb, qn, s, "||MARK=" as *u8, 7) == 1 { hasmark = 1; s = i } else { s = s + 1 } }
114 if hasmark == 0 {
115 if mm_lookup(mb, mn, id, mark, 512) == 1 {
116 // find 8th tab position in [ls,i)
117 var tabs: i64 = 0
118 var t8: i64 = 0 - 1
119 var q: i64 = ls
120 while q < i { if qb[q] == (9 as u8) { tabs = tabs + 1; if tabs == 8 { t8 = q; q = i } } q = q + 1 }
121 if t8 >= 0 {
122 // copy [ls, t8) + "||MARK=" + mark + [t8, i)
123 var a: i64 = ls
124 while a < t8 { ob[on] = qb[a]; on = on + 1; a = a + 1 }
125 let mkpfx: *u8 = "||MARK=" as *u8
126 var b: i64 = 0
127 while b < 7 { ob[on] = mkpfx[b]; on = on + 1; b = b + 1 }
128 var c: i64 = 0
129 while mark[c] != (0 as u8) { ob[on] = mark[c]; on = on + 1; c = c + 1 }
130 var d: i64 = t8
131 while d < i { ob[on] = qb[d]; on = on + 1; d = d + 1 }
132 changed = 1
133 applied = applied + 1
134 }
135 }
136 }
137 }
138 if changed == 0 {
139 var a2: i64 = ls
140 while a2 < i { ob[on] = qb[a2]; on = on + 1; a2 = a2 + 1 }
141 }
142 if i < qn { ob[on] = 10 as u8; on = on + 1 }
143 ls = i + 1
144 }
145 i = i + 1
146 }
147 if applied > 0 {
148 let wf: i64 = sys_openat_wr("knowledge/registry/assignment_queue.tsv" as *u8, 0x1a4)
149 if wf >= 0 {
150 var off: i64 = 0
151 while off < on { let w: i64 = sys_write(wf, ob + off, on - off); if w <= 0 { off = on } else { off = off + w } }
152 sys_close(wf)
153 }
154 }
155 if qlk >= 0 { rt_unlock("knowledge/registry/assignment_queue.tsv.lock" as *u8, qlk) }
156 let lf: i64 = sys_openat_append("knowledge/status/mark_migrate.log" as *u8, 0x1a4)
157 if lf >= 0 { mm_w(lf, "MARKMIGRATE applied=" as *u8); mm_wn(lf, applied); mm_w(lf, " epoch=" as *u8); mm_wn(lf, sys_now_realtime_sec()); mm_w(lf, " verdict=GREEN\n" as *u8); sys_close(lf) }
158 mm_w(1, "MARKMIGRATE applied=" as *u8); mm_wn(1, applied); mm_w(1, " (idempotent) verdict=GREEN\n" as *u8)
159 sys_exit(0)
160 return 0
161}