No description
Find a file
Rongsong Shen f28ce57993 fix(raft-apply-decoupling): bug-1419 layer 3 — close cross-primary client-retry dedup gap
jobid_range_exists() (c->jobmgr) and the in-flight registry (job.c,
per-process, only populated by this node's own handle_jobsubmit calls)
both miss a real cross-node case: a client's XCECLI_FAILOVER_CALL retry
resends the same client-generated jobid after a connection drop, and the
resend lands on a newly elected primary that never processed the original
request. If the original was already committed before the old primary
died, the new primary's own local WAL already holds it (Raft Leader
Completeness) but jobmgr hasn't applied it yet — both existing guards see
nothing, so the resend appends a second, genuinely committed WAL_JOB_SUBMIT
entry for the same jobid. A live chaotic soak reproduced this exactly
(waldump: two committed entries, same term, matching apiserverId/timestamp/
sequence, one second apart) — apply's own idempotent dedup keeps jobmgr
correct, but replay's raw WAL_JOB_SUBMIT count no longer matches jobmgr's
growth, firing a false APPLY_DIVERGENT fence and deadlocking promotion.

Fix: apply_committed_entry()'s WAL_JOB_SUBMIT case now claims the jobid in
job.c's in-flight registry (new job_wal_commit_claim/release, wrapping the
existing inflight_range_try_add/remove) for the duration of dispatch,
regardless of whether this node originated the submission or is applying a
replicated/replayed entry. A resend landing mid-dispatch on any node now
sees the same -EEXIST rejection self-originated in-flight submits already
get. Release only fires when the claim call added the entry, so a
self-originated submission's own claim/release lifecycle (unchanged) is
never double-released or stolen.

Also fixes 4 pre-existing tests that broke under the earlier checkpoint_lsn
fix (0eb1054) and were missed in that commit's regression sweep: cluster-
less fixtures where last_applied_lsn never advances now correctly get
checkpoint_lsn=0 unless the test simulates apply catch-up, matching the
new (correct) semantics. One assertion in
test_checkpoint_tail_with_no_snapshot_is_apply_clean compared Phase 1's
checkpoint_lsn against Phase 2's independently-reconstructed physical WAL
tip — that equality only held under the pre-fix current_lsn-tracking
behavior and is removed, not patched around.

Also hardens run-ha-soak.sh's start_node() with setsid+nohup: a forked/
background test-harness invocation whose session tears down mid-run was
silently killing every controller process via SIGHUP forwarding (observed
twice — deploy completes, ~1s of activity, then all 3 nodes die together
with no error logged).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01VgT3n4vTv4ZjCuCTmzed1F
2026-07-08 08:45:22 +00:00
.claude fix(raft-apply-decoupling): bug-1419 layer 3 — close cross-primary client-retry dedup gap 2026-07-08 08:45:22 +00:00
.kiro docs(raft-apply-decoupling): reconcile design.md deviations, retroactive boundary tag 2026-07-07 08:48:57 +00:00
.wolf fix(xce-test-ha): bug-1420 harness jobid collision + bug-1419 regression coverage 2026-07-08 04:49:41 +00:00
docs/superpowers/plans claude skills 2026-05-29 15:00:06 +08:00
ha/data chore: checkpoint all prior work for clean state 2026-06-04 13:04:16 +00:00
raft chore: checkpoint all prior work for clean state 2026-06-04 13:04:16 +00:00
reports fix(raft-apply-decoupling): kill-mid-fact-stream soak + close bug-1416 boot-time TOCTOU (task 7.2) 2026-07-07 03:03:40 +00:00
src fix(raft-apply-decoupling): bug-1419 layer 3 — close cross-primary client-retry dedup gap 2026-07-08 08:45:22 +00:00
.clang-format reformat code and job array 2025-11-07 16:14:27 +08:00
.gitignore chore: clean buglog.json junk/duplicates, gitignore scratch soak output 2026-07-03 03:24:19 +00:00
.mcp.json checkpoint: bug-851 root cause + raft TLA+ conformance spec family 2026-06-21 14:02:15 +00:00
.opencode.json checkpoint: bug-851 root cause + raft TLA+ conformance spec family 2026-06-21 14:02:15 +00:00
CLAUDE.md chore: baseline snapshot — prior-session work + ha-consistency-invariants spec family 2026-06-11 13:21:50 +00:00
README.md save works 2026-03-03 16:49:26 +08:00
uninstall-code-review-graph.sh checkpoint: bug-851 root cause + raft TLA+ conformance spec family 2026-06-21 14:02:15 +00:00

1. commit 规则

  • 每个人 fork 自己的 branch, 从自己的 branch 做 PR,review 完再 commit

2. code format

2.1. C

推荐使用 clang-format,公共配置放在源码里面 xce/.clang-format

(理论上直接使用源码里面 xce/.clang-format 文件格式不会变)

2.1.1. vscode 可以在配置中加上如下内容

"C_Cpp.clang_format_style": "WebKit",
"C_Cpp.clang_format_fallbackStyle": "WebKit",

2.1.2. vim & emacs

clang-format -style="{BasedOnStyle: webkit}" -i XX.c

2.2. golang

使用默认 gofmt

3. build environment and build (example of ubuntu)

3.1 build environment

  • Install nix package management tool
sh <(curl -L https://nixos.org/nix/install) --daemon
  • Edit /etc/nix/nix.conf to make sure
experimental-features = nix-command flakes
sandbox = true
sandbox-fallback = false
substituters = https://mirrors.ustc.edu.cn/nix-channels/store https://cache.nixos.org https://cache.nixos.org/
trusted-users = root <your account>

make sure that you have restarted nix-daemon service after you have changed /etc/nix/nix.conf

  • Install socat and config ssh (for clone by ssh protocol)
nix profile add nixpkgs#socat

.ssh/config

Host gitea.shenrs.eu
	HostName gitea.shenrs.eu
	IdentityFile ~/.ssh/id_ed25519
	ProxyCommand socat - openssl-connect:gitea.shenrs.eu:2022,snihost=gitea.shenrs.eu,verify=0

3.2 checkout source code

3.3 build (for package and release)

cd xce/src

# for build debug version
nix build --option sandbox false .#xcecore_debug

# for normal build
nix build --option sandbox false .#xcecore

You can find the generated binaries at =result= directory

3.4 build (for daily develop)

cd xce/src
nix develop

# using meson to generated build configuration (debug and address sanitize)

meson setup build --buildtype=debug -Db_sanitize=address

# run meson to build
meson compile -C  build

# The generated files will be in build/

3.5 build AppImage package

cd xce/src
nix bundle --bundler github:ralismark/nix-appimage --option sandbox false .#xce

This will create all in one AppImage file which contains everything for package delivery.

4. misc

4.1. Windows remap ctrl and alt key

create a reg file, e.g. remapkey.reg

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]
"Scancode Map"=hex:00,00,00,00,00,00,00,00,05,00,00,00,38,00,1d,00,1d,00,38,00,38,e0,1d,e0,1d,e0,38,e0,00,00,00,00

then double click remapkey.reg to import it. Restart OS.