code wiki / _hdl_build / nx_ha_failover_gate.nx

nx_ha_failover_gate.nx source

↩ module page · 32 lines · 2399 B

1import "nx_gate_gn.nx" 2// nx_ha_failover_gate.nx -- hermetic gate for CAP-HA-FAILOVER. Proves: stay on a healthy primary, failover to standby 3// when the primary dies, stay put (no flapping) while the primary is down, DEGRADED when both are down, recover from 4// degraded, and conservative failback. Sovereign: nx_syscalls + nx_ha_failover. expect_exit: 0 5import "nx_syscalls.nx" 6import "nx_ha_failover.nx" 7 8func gp(s: *u8) -> i64 { var n: i64=0; while s[n]!=(0 as u8){n=n+1} sys_write(1,s,n); return 0 } 9 10func main(argc: i64, argv: *i64) -> i64 { 11 gp("=== nx_ha_failover_gate (multi-node failover -- kill the SPOF) ===\n" as *u8) 12 let st: *i64 = sys_mmap(16) as *i64; st[0] = HA_PRIMARY 13 var pass: i64 = 0; var fail: i64 = 0 14 15 if fo_step(st, HA_UP, HA_UP) == HA_PRIMARY { pass=pass+1; gp(" T1 primary healthy -> stay PRIMARY PASS\n" as *u8) } else { fail=fail+1; gp(" T1 FAIL\n" as *u8) } 16 17 if fo_step(st, HA_DOWN, HA_UP) == HA_STANDBY { if st[0]==HA_STANDBY { pass=pass+1; gp(" T2 primary down + standby up -> FAILOVER to standby PASS\n" as *u8) } else { fail=fail+1; gp(" T2 FAIL state\n" as *u8) } } else { fail=fail+1; gp(" T2 FAIL\n" as *u8) } 18 19 if fo_step(st, HA_DOWN, HA_UP) == HA_STANDBY { pass=pass+1; gp(" T3 primary still down -> stay STANDBY (no flapping) PASS\n" as *u8) } else { fail=fail+1; gp(" T3 FAIL\n" as *u8) } 20 21 if fo_step(st, HA_DOWN, HA_DOWN) == HA_DEGRADED { if st[0]==HA_DEGRADED { pass=pass+1; gp(" T4 both down -> DEGRADED (honest, no false-up) PASS\n" as *u8) } else { fail=fail+1; gp(" T4 FAIL state\n" as *u8) } } else { fail=fail+1; gp(" T4 FAIL\n" as *u8) } 22 23 if fo_step(st, HA_UP, HA_DOWN) == HA_PRIMARY { if st[0]==HA_PRIMARY { pass=pass+1; gp(" T5 recover from DEGRADED -> PRIMARY PASS\n" as *u8) } else { fail=fail+1; gp(" T5 FAIL state\n" as *u8) } } else { fail=fail+1; gp(" T5 FAIL\n" as *u8) } 24 25 // T6 conservative failback: on standby, standby dies while primary is back -> failback to primary 26 st[0] = HA_STANDBY 27 if fo_step(st, HA_UP, HA_DOWN) == HA_PRIMARY { pass=pass+1; gp(" T6 on standby, standby down + primary up -> failback PRIMARY PASS\n" as *u8) } else { fail=fail+1; gp(" T6 FAIL\n" as *u8) } 28 29 gp("RESULT pass=" as *u8); gn(pass); gp(" fail=" as *u8); gn(fail) 30 if fail == 0 { gp(" verdict=GREEN\n" as *u8); sys_exit(0); return 0 } 31 gp(" verdict=RED\n" as *u8); sys_exit(1); return 1 32}