nx_id_concurrent_canonical_gate_t190.nx source
↩ module page · 36 lines · 1743 B
1import "nx_apistack_idempotency.nx"
2import "nx_gate_verdict.nx"
3import "nx_itoa_lib.nx"
4func ic_child(p:*u8,label:*u8)->i64{
5 let key:*u8=sys_mmap(64)
6 var i:i64=0
7 while i<100{
8 key[0]=label[0];key[1]=45 as u8
9 let n:i64=ccz_cat_num(key,2,i)
10 if id_record(p,key,n,"rc=0",4)!=1{return 1};i=i+1
11 };return 0
12}
13func main()->i64{
14 let c:*i64=gv_ctr();let p:*u8="knowledge/gates/id-concurrent-canonical-t190.jrnl"
15 let fd:i64=__syscall(257,AT_FDCWD,p,193,MODE_0600,0,0)
16 gv_check("exclusive test ledger",fd>=0,c);if fd<0{return 1};sys_close(fd)
17 let first:i64=sys_fork();if first==0{sys_exit(ic_child(p,"A"));return 99}
18 let second:i64=sys_fork();if second==0{sys_exit(ic_child(p,"B"));return 99}
19 let sa:*i64=sys_mmap(8) as *i64;let sb:*i64=sys_mmap(8) as *i64
20 var wa:i64=0-1;var wb:i64=0-1
21 if first>0{wa=sys_wait4(first,sa,0)};if second>0{wb=sys_wait4(second,sb,0)}
22 gv_check("first owned writer complete",first>0&&wa==first&&wait_status_rc(sa[0])==0,c)
23 gv_check("second owned writer complete",second>0&&wb==second&&wait_status_rc(sb[0])==0,c)
24 let key:*u8=sys_mmap(64);let out:*u8=sys_mmap(8);var pass:i64=0;var label:i64=65
25 while label<=66{
26 var i:i64=0;while i<100{
27 key[0]=label as u8;key[1]=45 as u8;let n:i64=ccz_cat_num(key,2,i)
28 if id_lookup(p,key,n,out,8)==4{if out[0]==114 as u8&&out[3]==48 as u8{pass=pass+1}}
29 i=i+1
30 };label=label+1
31 }
32 gv_check("all200 concurrent records retained without interleaving",pass==200,c)
33 let stat:*u8=sys_mmap(NX_STAT_X64_BYTES)
34 gv_check("journal bytes exact across concurrent appends",sys_fstatat(p,stat)==0&&*((stat+NX_STAT_X64_SIZE_OFFSET) as *i64)==1980,c)
35 return gv_verdict("idempotency-concurrent-append",c,"Append serialization only; lookup/mutate/record is not a transaction")
36}