forked from lei.chen/myxce
feat(libxce-failover): reusable failover test harness — fake masters, status taxonomy, concurrency runner (task 1.2)
This commit is contained in:
parent
387ccfa8dc
commit
d11c6e1d89
5 changed files with 760 additions and 228 deletions
|
|
@ -8,7 +8,7 @@
|
|||
- Initialize all new state when the client starts; keep the retry-config defaults; remove the orphaned, never-wired retry primitive
|
||||
- Done: libxce builds with the new per-context state present and the dead primitive removed; retry defaults are reachable
|
||||
- _Requirements: 6.1, 6.2_
|
||||
- [ ] 1.2 Realign the retry test harness to the new model (RED)
|
||||
- [x] 1.2 Realign the retry test harness to the new model (RED)
|
||||
- Retarget the existing libxce retry tests from the removed primitive to the new classifier and client-wrapper retry path
|
||||
- Add fixtures simulating each controller status (redirect with and without address, no-primary, not-ready, standby, duplicate-job) and transport failures, plus a fake multi-master list and a shared-context concurrency harness
|
||||
- Done: the test file compiles against the new symbols and fails (RED) because the implementation does not yet exist
|
||||
|
|
@ -101,3 +101,4 @@
|
|||
|
||||
## Implementation Notes
|
||||
- 1.1: design said `XCE_MAXHOST_LEN`; real constant is `XCE_MAXHOSTNAME_LEN` (config.h, =256) — design corrected. `api_ctx_t` now in private `client_internal.h`; `xcecli_reconnect_cb` typedef lives there until task 4.1 adds the public setter. Build: `cd src && nix develop --command bash tools/xce-build.sh lib`.
|
||||
- 1.2 (ADAPTED): RED-against-undefined-symbols would break linking of the shared lib test binary across tasks, so 1.2 builds a GREEN reusable harness (`src/lib/testsuite/failover_harness.h`): fake multi-master config+cursor, an 11-row controller-status taxonomy table (resolves to real errnox.h codes), and an N-pthread runner. Component RED→GREEN tests live in 2.1/2.2/2.3/3.1/3.2. The harness defines `fo_expected_action_t` (FO_ACT_*) mirroring the design `xce_fo_action_t` — 2.1 asserts the real classifier against these rows.
|
||||
|
|
|
|||
317
.wolf/anatomy.md
317
.wolf/anatomy.md
|
|
@ -1,24 +1,24 @@
|
|||
# anatomy.md
|
||||
|
||||
> Auto-maintained by OpenWolf. Last scanned: 2026-06-16T08:19:04.353Z
|
||||
> Files: 516 tracked | Anatomy hits: 0 | Misses: 0
|
||||
> Auto-maintained by OpenWolf. Last scanned: 2026-06-17T02:32:09.045Z
|
||||
> Files: 510 tracked | Anatomy hits: 0 | Misses: 0
|
||||
|
||||
## ./
|
||||
|
||||
- `.clang-format` (~226 tok)
|
||||
- `.gitignore` — Git ignore rules (~88 tok)
|
||||
- `.mcp.json` (~7 tok)
|
||||
- `.opencode.json` (~55 tok)
|
||||
- `.opencode.json` (~7 tok)
|
||||
- `CLAUDE.md` — OpenWolf (~1400 tok)
|
||||
- `package-lock.json` — npm lock file (~1039 tok)
|
||||
- `package.json` — Node.js package manifest (~1 tok)
|
||||
- `README.md` — Project documentation (~612 tok)
|
||||
- `uninstall-code-review-graph.sh` — Fully uninstall `code-review-graph` (the Python/uv MCP tool). (~627 tok)
|
||||
- `uninstall-code-review-graph.sh` — Fully uninstall `code-review-graph` (the Python/uv MCP tool). (~672 tok)
|
||||
|
||||
## .claude/
|
||||
|
||||
- `settings.json` (~497 tok)
|
||||
- `settings.json.bak` (~329 tok)
|
||||
- `settings.json.bak` (~464 tok)
|
||||
- `settings.local.json` (~186 tok)
|
||||
- `ucai-formatter-cache.local.json` (~17 tok)
|
||||
|
||||
|
|
@ -60,6 +60,10 @@
|
|||
|
||||
- `SKILL.md` — kiro-spec-design Skill (~2881 tok)
|
||||
|
||||
## .claude/skills/kiro-spec-design/.claude/
|
||||
|
||||
- `ucai-formatter-cache.local.json` (~17 tok)
|
||||
|
||||
## .claude/skills/kiro-spec-design/rules/
|
||||
|
||||
- `design-discovery-full.md` — Full Discovery Process for Technical Design (~949 tok)
|
||||
|
|
@ -95,6 +99,10 @@
|
|||
|
||||
- `SKILL.md` — kiro-spec-requirements Skill (~2125 tok)
|
||||
|
||||
## .claude/skills/kiro-spec-requirements/.claude/
|
||||
|
||||
- `ucai-formatter-cache.local.json` (~17 tok)
|
||||
|
||||
## .claude/skills/kiro-spec-requirements/rules/
|
||||
|
||||
- `ears-format.md` — EARS Format Guidelines (~739 tok)
|
||||
|
|
@ -112,6 +120,10 @@
|
|||
|
||||
- `SKILL.md` — kiro-spec-tasks Skill (~2473 tok)
|
||||
|
||||
## .claude/skills/kiro-spec-tasks/.claude/
|
||||
|
||||
- `ucai-formatter-cache.local.json` (~17 tok)
|
||||
|
||||
## .claude/skills/kiro-spec-tasks/rules/
|
||||
|
||||
- `tasks-generation.md` — Task Generation Rules (~2773 tok)
|
||||
|
|
@ -185,10 +197,6 @@
|
|||
|
||||
- `SKILL.md` — XCE HA Cluster Deployment (~1345 tok)
|
||||
|
||||
## .code-review-graph/
|
||||
|
||||
- `.gitignore` — Git ignore rules (~38 tok)
|
||||
|
||||
## .codegraph/
|
||||
|
||||
- `.gitignore` — Git ignore rules (~47 tok)
|
||||
|
|
@ -279,7 +287,7 @@
|
|||
- `requirements.md` — Requirements: HA Config Bootstrap & Raft-Style Quorum Election (~3890 tok)
|
||||
- `research.md` — Cross-Spec Gap Audit (2026-06-03) (~14349 tok)
|
||||
- `spec.json` (~293 tok)
|
||||
- `tasks.md` — Implementation Plan: HA Config Bootstrap & Raft-Style Quorum Election (~5619 tok)
|
||||
- `tasks.md` — Implementation Plan: HA Config Bootstrap & Raft-Style Quorum Election (~5780 tok)
|
||||
|
||||
## .kiro/specs/ha-consistency-invariants/
|
||||
|
||||
|
|
@ -354,6 +362,15 @@
|
|||
- `spec.json` (~128 tok)
|
||||
- `tasks.md` — Implementation Plan: HA WAL Replication (~1737 tok)
|
||||
|
||||
## .kiro/specs/libxce-failover/
|
||||
|
||||
- `brief.md` — Brief: libxce-failover (~2238 tok)
|
||||
- `design.md` — Design Document — libxce-failover (~8277 tok)
|
||||
- `requirements.md` — Requirements Document (~2933 tok)
|
||||
- `research.md` — Research Log — libxce-failover (~2344 tok)
|
||||
- `spec.json` (~128 tok)
|
||||
- `tasks.md` — Implementation Plan (~2305 tok)
|
||||
|
||||
## .kiro/specs/raft-library/
|
||||
|
||||
- `design.md` — Design Document: raft-library (~7756 tok)
|
||||
|
|
@ -393,7 +410,7 @@
|
|||
- `error-handling.md` — Error Handling Standards (~782 tok)
|
||||
- `ha-async-io.md` — HA Protocol & Async I/O (~1431 tok)
|
||||
- `product.md` — Product Overview (~1246 tok)
|
||||
- `roadmap.md` — Roadmap (~2623 tok)
|
||||
- `roadmap.md` — Roadmap (~3412 tok)
|
||||
- `security.md` — Security Standards (~804 tok)
|
||||
- `structure.md` — Project Structure (~1170 tok)
|
||||
- `tech.md` — Technology Stack (~1155 tok)
|
||||
|
|
@ -412,52 +429,38 @@
|
|||
|
||||
## graphify-out/
|
||||
|
||||
- `.graphify_labels.json` (~6030 tok)
|
||||
- `.graphify_labels.json` (~5517 tok)
|
||||
- `.graphify_root` (~1 tok)
|
||||
- `GRAPH_REPORT.md` — Graph Report - persistent_ha (2026-06-16) (~49152 tok)
|
||||
- `manifest.json` (~35956 tok)
|
||||
- `GRAPH_REPORT.md` — Graph Report - persistent_ha (2026-06-17) (~45196 tok)
|
||||
- `manifest.json` (~36616 tok)
|
||||
|
||||
## graphify-out/cache/
|
||||
|
||||
- `stat-index.json` (~45861 tok)
|
||||
- `stat-index.json` (~46526 tok)
|
||||
|
||||
## graphify-out/cache/ast/
|
||||
|
||||
- `000c131d43cb1e40a783245cb81906a2abd9297491964242e5b5bbebcad1b0d1.json` (~10944 tok)
|
||||
- `004cc8d07f2f670da29d7c7f144c8875f274b8438fb1d4306fb6cc676c745fea.json` (~1050 tok)
|
||||
- `005d423b344fb7001a76e9a01e7226b28957f0318f503b6acd0f7f72a3fcde8e.json` (~227 tok)
|
||||
- `008610a0f4315b9a68f7cde989a73b27de885c7ab2c96a9e7440be16cf2fa094.json` (~2422 tok)
|
||||
- `00a44f36a2da752dce1be0700e58c3c4c485f8fd75e462e12d15f4ba144d9bf2.json` (~29528 tok)
|
||||
- `008e1a68f9305eaa5f4ea97dcbf0cadc3905e36d892968c53334f2b1f0fffcb6.json` (~30245 tok)
|
||||
- `00a5ff6db9d63a87d19ca8b0a68d7105c6ea2fa89be5f94c98b257bced832042.json` (~11282 tok)
|
||||
- `00bf4ac62988ea0494c2ffda33b92affa91df5763081a54b4c7d6c308fec999e.json` (~269 tok)
|
||||
- `01181572b4bf0d966f8391007f85c7a58838d83ef521a9fb455e180c704c78be.json` (~4182 tok)
|
||||
- `0158107a72d3c8414a7500cf543421f458e5cfff4a912448a50e1e37aae35b9a.json` (~21697 tok)
|
||||
- `016845199833895f368a40f072564f7b5502cd652cef19f58dffb9c1931bd179.json` (~1092 tok)
|
||||
- `019ce52f853a0d7c2d8646054bab194a2217f217ddf3d0ed4d0d476ec4553329.json` (~8110 tok)
|
||||
- `017525d533acff26d6ddd879e54b6284ce066a950e07536ed20b5b750b031219.json` (~1216 tok)
|
||||
- `01c91aa6fa18cc3129d3f6451a04b235c9528a88a165b1b6126f87c37bdc4048.json` (~14877 tok)
|
||||
- `01d5ae01a90dcbf2812ac05362927a7f9320cd5f20875838057caf559be8c5be.json` (~224 tok)
|
||||
- `01d75ef42f259e5752e9ee274fc1e00781b485b87349841c5c335ad92ba964b9.json` (~6308 tok)
|
||||
- `01ffefd3077e3989045ab89dbd8d9951d161531a0bef7cee8f652de34593ef79.json` (~40640 tok)
|
||||
- `0211c966a13950b059d40d37ff94e62d5b7ba25b554407097e4f964eaac39102.json` (~206 tok)
|
||||
- `023e107588bcbc8780b5fe90b346a96c5243e9192778aefb9bc9fcd92b5cf692.json` (~3708 tok)
|
||||
- `027186d92c26c611e9c4d3a9463dde3d13a74de8936252d1f0086ef64f4c11d5.json` (~12735 tok)
|
||||
- `02792109a97363521613514c608dc94da901e12328ff8ed7925297498b49e28b.json` (~11713 tok)
|
||||
- `0297e5997050ad938795b7335ba2e08338aa3e4b36046f19b34c3069fd8d4e60.json` (~57184 tok)
|
||||
- `02b1338304d9a7a16ca3476f5c5f60ba7b9e1d6f8aeb10fad01a7d8be2fc7bad.json` (~14324 tok)
|
||||
- `0327a8119a2ad0c8ee5fda692968124551ae97ec306a8d102349b9f9f9c587aa.json` (~652 tok)
|
||||
- `0334c7cb345f94591499afbcd6d06808702619a27ad0cad749c9ccf84738f77c.json` (~8238 tok)
|
||||
- `037105385f82cad6a302e5f737557c04fe1ca516e5b0ec8b188550958df851cd.json` (~29997 tok)
|
||||
- `0401198757a993070c98c754996a960299d605d55ee524b2f1aad817fa94322a.json` (~3011 tok)
|
||||
- `040ce3f94fd026464306f32ccbc5e0b59881a0f5654574d0c8564f9d06143c72.json` (~23952 tok)
|
||||
- `0440846ef240f3abb98b1ca27304c5cdbe56779ba1cc857850dd7a26cad49b66.json` (~2935 tok)
|
||||
- `04583d91aa48af789b952136fb7c52041b0d632793246105f3af6fe070727a07.json` (~2049 tok)
|
||||
- `04e3a10a165fc6dea955a31ec5c48db1e75c23545a74a734cb538d8ef8ac06ef.json` (~7004 tok)
|
||||
- `053929f384ca0a4fdabda00415d3f0e0a7f8ccbd86f273deadd54ac0590492a2.json` (~18832 tok)
|
||||
- `053f96f9072f59c2f44a8390d4047be1fefb697ea6db29f1eeca60602b7ab759.json` (~396 tok)
|
||||
- `057d67f05183f6fe7fd3414cb6f46de234ebe58fa3dbca7dddc5441ee3f8a2f1.json` (~6218 tok)
|
||||
- `0584ab00ab563c9f2f68e27d7bd9b58c07e95ff4c9ea2403a82818009186147f.json` (~81 tok)
|
||||
- `058ef9fb07d4ca45e2f49b6fa79609a1ce85c8662aa43696392b35bd9047e505.json` (~8010 tok)
|
||||
- `05b255f2ba83087a09d40fcf9e1f10209c1276b1e86c65d0eecdab2de2b28076.json` (~15467 tok)
|
||||
- `06a0b286e4c22fb4c981239820aea2042950d1d21dc96de40226b14cc696065e.json` (~8244 tok)
|
||||
- `06b99babef4c7ab862aa487145fb2e6736245ef4ad565fe0e06a24898c3875d7.json` (~352 tok)
|
||||
- `07014154947b85f86499894c59be83a316bf3fc006c8fc55c316cb893462977e.json` (~3083 tok)
|
||||
|
|
@ -466,122 +469,72 @@
|
|||
- `0752d0d43dbdaac573d4c7129d228ad267a5a5d8bc6820fde4b6e6a6a3062100.json` (~586 tok)
|
||||
- `0799df8da46779b19ce58b3ae776614f647d6d5f009f418520eec8897f538f9d.json` (~1961 tok)
|
||||
- `07d0b1dbd63fc8b71cab7d602d56453c4ed0a4170b3efe8d387de29c09487ead.json` (~467 tok)
|
||||
- `07d9e114e326083e00a16d55832ae1225b103e3a506da26b69f58bee6a0f14c8.json` (~76 tok)
|
||||
- `082d2508e015e3002b8399b37a4562991cff2b2d747f1e800d370c1f3e88b028.json` (~5332 tok)
|
||||
- `0857f9be25466f6f3c0da48438f7c7cf35d0140010f4639a673c2f35ae98a002.json` (~2468 tok)
|
||||
- `0894c6309b9aae7fdb3b1aef7fb1dfaf1b55fd8f31ac96a8112916d55ebbedba.json` (~315 tok)
|
||||
- `0895960bce4ca499c4505de3f178508e1cd9dda69a3e8ab43195493957793a34.json` (~7103 tok)
|
||||
- `0933c8c03485fee87e59ee544f2baed215459e37d445226aba3990bb5460dd8b.json` (~14400 tok)
|
||||
- `09cb38261b447a3240b1361064d5bd8dada4c7eb8430b961c0476e902bc11ea0.json` (~8966 tok)
|
||||
- `09fc4c36a264a7b935bf7ffe9e8506fc3452b8e90c8ecb7e22d6a740854ebc76.json` (~1802 tok)
|
||||
- `0a65fc39bdd68ec3137a208b663c8827bf663aa6ba3cbcbb94ae03d0d3ba4fa2.json` (~81 tok)
|
||||
- `0b84abe002c91c4608ec56b28a1a39a066c1d64f8bad5182c89a905e0f51138f.json` (~6400 tok)
|
||||
- `0b91b1fcfc8ae3bd247107dd81b84a03aea885632599033c06e8f9f372f8d967.json` (~504 tok)
|
||||
- `0bcad3d5790defe9b965d14f4fdf8b5bb80273549a9872226fce33ee2453cfd6.json` (~1122 tok)
|
||||
- `0bf7323dd6f181b3c8536da6fda90904a6d3ea5fb99d9a9211175beadd33ae49.json` (~1973 tok)
|
||||
- `0bfddfa19374691c60a82a0208b83881a8c2c8adc9e888576e7aa64801be9f9b.json` (~4672 tok)
|
||||
- `0c6b592cd952a83286c28fa23af1707fa0ec26c2c751337e7fe61c5f25179808.json` (~25338 tok)
|
||||
- `0c86267402031c08bcc3b4b5a1202712295c728654b1958f36368c636c0416a0.json` (~3581 tok)
|
||||
- `0ccb2e06c2139ef03aef6ba894efe1025c61daed9a9ef15b891319ecc4d9652e.json` (~5859 tok)
|
||||
- `0d31fe94cc46afc9674019867b10d786225c8a2af812798213e5aa9a960cc4f2.json` (~81 tok)
|
||||
- `0d5480993d38e8a128d23ff34faa9270999475e305b2f242bc82e4f674262739.json` (~15294 tok)
|
||||
- `0d75597651d23293ccc9bbe768fb9c1aeb53a0bd81b80a377996f5e68ad79fe6.json` (~1122 tok)
|
||||
- `0dab5b24f3cee60a70662d6ce8aef5a2bb4465361ba368b61f2d1c064c8a6cf1.json` (~269 tok)
|
||||
- `0db57ca4ac0c3ee6abc97242d0a04f274b18b83ba32d3b9c2b8c39b949c52fba.json` (~2878 tok)
|
||||
- `0dcea2652aaf077ffb9d6f61c387ac6dc42e03d347a5ea9dfde069c107ebabe4.json` (~26116 tok)
|
||||
- `0e688ceec91f4b7c192ec781324e9ddaa517ac653dc2256095ec17c49cb12928.json` (~309 tok)
|
||||
- `0eada2ef529a3511cb04b120cb3d2247c7822f9aa4c4d9dab4f7cfdc72d31e8a.json` (~1980 tok)
|
||||
- `0ebe1eba67e97d4287dcf82221f8fa6dceb6aef0980a011d21e7f7e8ce7ef741.json` (~592 tok)
|
||||
- `0ee129793c23e5933eade7198c1f08c5d84c9c26139e7eb7ff067d5c52d08d1e.json` (~6165 tok)
|
||||
- `0f1d7b66657a17d9d64f32e497db7dad40d2e9ddc16d9f96c9a789b750ec5cad.json` (~17210 tok)
|
||||
- `0efdb7988a262995018cbc7009c3ec35246c85602f7a6182cec1852b8c765ba2.json` (~859 tok)
|
||||
- `0f5341ff6ca93ba2938f8f8745a9739a2f5da1705bdb8b6abca03899d71e75c6.json` (~224 tok)
|
||||
- `0fa8ec51434b17edc5a26d6a037f6799618b873ebae92d6eac751f0f3578c038.json` (~2079 tok)
|
||||
- `0fb70f67355c6ee9bbb1dd9f5d55d21fdd019790f551898c33e6dd97d0742331.json` (~468 tok)
|
||||
- `0fd3a7a67fea0b2266942e702549a4de76ae86d31fbe66a68c21d765f66d37f0.json` (~15463 tok)
|
||||
- `10113aa2a94b02bb8464b4eaffd2ba059c6b9d386bd5f522eb4ec82d04a19bcb.json` (~17818 tok)
|
||||
- `103e27126a9e5950aa8c8063c54df342d6737d340c5411cf667b24a00dcc28a1.json` (~3251 tok)
|
||||
- `104ff5c6fbc4f31f0bc8dff467f2d17016e763fb171b757cc6eade51aab16220.json` (~10462 tok)
|
||||
- `105cfdcc702831a141523e3d24e7505c1da12134d0ddafee2000f43196596c54.json` (~7236 tok)
|
||||
- `111178800ae1876a431e527f3e0211c41e066afcf3636483674e1de0177fe726.json` (~3496 tok)
|
||||
- `1115d59cae0de03be0ebfeec800e4bc7a3142b1df07c22537ff00164f6d4becd.json` (~845 tok)
|
||||
- `114f295685c5796b4dcd914d8c84d0e74823a3000bce5dbf796f52519176b793.json` (~275 tok)
|
||||
- `1164b6d75143d4caf1a8c3ccd18258c793607dae4d869a5490fc09564b26c2af.json` (~214 tok)
|
||||
- `1196f6d0f42ffbd96922026767a312e1d25869970da006eda64602bb96691c22.json` (~228 tok)
|
||||
- `11a454492a215c5707704555427cc5a8a8d8c9e37140369fe3fd48964b6cd6be.json` (~3120 tok)
|
||||
- `11a72a0ce21f2f1a221493c217301e9d2721e7c93ad8fbf3eace49ba689be674.json` (~15463 tok)
|
||||
- `11ad0183b3812c612e30eea9caa754057bf827bb62044858e489f10b2dfc76d0.json` (~652 tok)
|
||||
- `122c7f6dd4c6905cae678fec4ec301f801c2a4ddf34d8cd5d114259499e42888.json` (~8512 tok)
|
||||
- `122d2b1601ab8c15ea9aee2e4fae51e0c85d8ec4559088e9ca8dfc2b596e1dc7.json` (~652 tok)
|
||||
- `12670c77f8cc5ed14a8fd970a52efd6443249934afe535ba5c942e20085ad13d.json` (~23240 tok)
|
||||
- `12681440af2141163a9c8e268eb57806917f49c6f9c096cc62916803475ce07a.json` (~81 tok)
|
||||
- `128104484efd94bffee42db38eb7f45f674e211912b614f10ed09b85616a2697.json` (~652 tok)
|
||||
- `12c733acf3d86ce393643e971e1f4940fd1758a2696817d2f2a4247f41b2f480.json` (~5120 tok)
|
||||
- `1312e11eefb522023a6437df3bef6b7a618dc2a482005da8315b46a9fe0264a6.json` (~7909 tok)
|
||||
- `137c52263f62b509bdf82667625be28668f70fcd3b3d560634d481289b687386.json` (~63297 tok)
|
||||
- `140148117c95271d4f0edef28aa39281e12ea2d7b91e5e9e546f5865adabdcf2.json` (~10944 tok)
|
||||
- `143d4b85cb0f06f22469489e94daac7b33824a4ba8aaf2a32ecdddc399a2a221.json` (~15340 tok)
|
||||
- `1459add9026c6903d390de90c7d1dea4d5a9d381a3930785e7a480dc27b5ec00.json` (~6672 tok)
|
||||
- `146294343cf8e6ac9b9dd5fae0a60bb65150f8da6bb5a386bc0da0f02183c14b.json` (~269 tok)
|
||||
- `14a93f201d19d457092b9bf881e8ac62f44caf42d70192b2106944c8380374d3.json` (~76 tok)
|
||||
- `151a099eec558a9e4c89bc08aae88ba096681971be1a94c7625343fd9a3a88e5.json` (~7640 tok)
|
||||
- `15224225923ce6697e098312e1dc8429b2768b415534886f344c212446813d83.json` (~495 tok)
|
||||
- `152d9c2445a8247d38b52f6ecab0cf6f36ba144aeb93e0bc7603445e7ed2c6cc.json` (~5075 tok)
|
||||
- `157c7929f5a2274e2f98c623d21343ab2f01711d4fd4e742caef92e2bf2b3463.json` (~4857 tok)
|
||||
- `158090133ac47bc62dd65c9b1ff44bdc089811c93f672d85e0711a994b41af17.json` (~8238 tok)
|
||||
- `15cb56feba56942d333a3d530b675dcfddd2cf20fbd9895f6a45278e9b07daa9.json` (~81 tok)
|
||||
- `15cc2d188fbb7c7bc937a39311efdc8cd2536b01947309e45f5563c0e40a7923.json` (~1376 tok)
|
||||
- `15f43122fe941435ef4d1c92bf796b0198998b92df0b915e6e173a4a0d3e0dcd.json` (~2943 tok)
|
||||
- `161d1766fb319e69d5a2a0b8ae6b0fe31094664d773a6bcabf946ea47a40960a.json` (~81 tok)
|
||||
- `16307f083b22977db26185b0f7407bc40e4f74e2098040ae978316d99d4444d8.json` (~335 tok)
|
||||
- `1642d4ea0bbdbc98ef3abccdbc361010f2f63d60d57d01adfd5ce1ac487809d1.json` (~10462 tok)
|
||||
- `169ccd05e20660f7947e1eec4a97149bb00203e4adf8525bbbf558c394af8203.json` (~81 tok)
|
||||
- `171c864c6be7b44ddbc4207c8890610c7cff16a6d109e83f1ef1cf872cb1d5cf.json` (~18765 tok)
|
||||
- `17315b1327a8f2b3df09bccacb57ea8753c011c3b898c7527349b5d113841b82.json` (~10352 tok)
|
||||
- `17c6bf76cfaf2951c6567ecaba00b057c5bf1a8c380a669df83e1a3cbecf630f.json` (~482 tok)
|
||||
- `17e09a3e268eac887a1cc2b71fa136349aec63609ea2848c6d2b745c6cc150df.json` (~269 tok)
|
||||
- `17f10a996c2294de1c285cc0663c48f43b791ed82eb71ac2cb754bb4d1a93e70.json` (~15467 tok)
|
||||
- `17fd2ab30160b12df998f624152b8f2fb7549f4e7b86c077d074a72810c11f08.json` (~8238 tok)
|
||||
- `1814c8441ce6baf90c83e273914a1f472136a2e348e12e9eaf902367a650574c.json` (~323 tok)
|
||||
- `181955f831ace827cab57775ab5c606ca3546d23e3b084d7bb3a386ab30603dc.json` (~182 tok)
|
||||
- `1870fbb4d9d0c1c96f6d0206b980cc4acaa128a432b581bcacec7f6fe866eecd.json` (~1988 tok)
|
||||
- `1880ee75786ce6a428cdaa0f911f58973080482a358b7886fb6aee65c43beda1.json` (~2444 tok)
|
||||
- `1882cd8ec3f0690693a3f400ebd6902a184ca6f0a65dd476837098df893adec0.json` (~81 tok)
|
||||
- `189fd5992484b9c2f1589b17d6564778263f7dce96697c30e3412d0fad0c5da2.json` (~8238 tok)
|
||||
- `18da646f592197b9cdd0707fbb41cbd46f3a59195718deea292f74812b4bb3b7.json` (~652 tok)
|
||||
- `18dc5928206967173c007cbb765877d41488abd0fcb0de1d56abecbaf3f724b7.json` (~9240 tok)
|
||||
- `19009ec1aff7567353993c6fcb7977616f21f799ba4d63e46047ee80585836a6.json` (~652 tok)
|
||||
- `191b4446d235d84fd3681d7e952ad2552fe572d3a5757a5074074549c4e27d50.json` (~1829 tok)
|
||||
- `1985ef8f8aff8de336ea7725369480591c8357e1d9cd22fd6472cb41ae61298e.json` (~36811 tok)
|
||||
- `19c8003bcc5314fd08d9000b104fd6d443d7959d5babc40fe8b7eb1397056352.json` (~2145 tok)
|
||||
- `19ef06be285e1769d58acf0223c5a445d872c31d629d30dee1c5eeb06c69ded7.json` (~35085 tok)
|
||||
- `19f40018949a73961f1be70427bfa744ba1dbb6c67e597c65b3f652d357be8f0.json` (~324 tok)
|
||||
- `1a91351d50722bca9da67761028884679cbc357a5587e783ce691d7cab7cf65b.json` (~1075 tok)
|
||||
- `1ac9034146e90e4bd572d5c5bfc825730a5387b7b08e37deb1d86cab034a99f9.json` (~81 tok)
|
||||
- `1acd8bb9dda7c761a55ae518ce15546212e95c0c5e3e9393dba5bc7d15813796.json` (~10462 tok)
|
||||
- `1ad8474a865962b24820ff0d953482ce1a9644e667ba136752e0388d24f0ebf9.json` (~4490 tok)
|
||||
- `1b3b474cc46958f3b63e6ef226c2f6b5d7b0275ca7d4e62a2e92c331fc09972c.json` (~6923 tok)
|
||||
- `1b3eb8209fe8ae83a46fe284c12c8577df135d756ac662156e4a61eab79e5601.json` (~1934 tok)
|
||||
- `1b5a6250958790565da71172c0f2da9c26e4651aaec7a353d34f33555f38f4c2.json` (~1904 tok)
|
||||
- `1b99d83061721291e801fa6f10dc01f973f1941a543a381aff9f1db4aa6ae0fc.json` (~5762 tok)
|
||||
- `1bb7af2ce570f59f08babf055ac4b6599c1f138fd580726f6f8056071d6790e8.json` (~76 tok)
|
||||
- `1bcad025e4de349658f8894bb6b724bc2b9937cb0a888ae13347682770ba2363.json` (~11054 tok)
|
||||
- `1c082dda72fabdaf8c4b3cf9c5891940b0bfba2696c65685421f88592504446a.json` (~12528 tok)
|
||||
- `1c0cfaeda41c83a55365b1b5b340cf80581217b083b93ce0dd156fc886276256.json` (~3131 tok)
|
||||
- `1c1177040b6bbb14eca016acca9d4e99dd2b7caf2522e31222570c960ed79501.json` (~53054 tok)
|
||||
- `1c86ed59f0918f5ea0f47f54917854eb2ce2a9b9b6724a107c9237ed0a7f7ea2.json` (~2916 tok)
|
||||
- `1c85f27fe659a6c257eeb5157b01c9b454293a22bc14be2be6c45aaefecd1967.json` (~753 tok)
|
||||
- `1c906780916fd91e042adaa801f385dc55bc1f29c851908ad61f8c5db0040107.json` (~2163 tok)
|
||||
- `1c9619334c216e67eec7d7a1c420d26476001173e926088e46d4d2acdd52f8d4.json` (~320 tok)
|
||||
- `1c96714a7cfa6cd6a3494d1325905a74a6caf801e63a5abaf2a20bb8c8a9e3bc.json` (~16210 tok)
|
||||
- `1d3f7ad969993099744a5c43cd721dd449fffe5670bae4a1e370838cbec89edb.json` (~81 tok)
|
||||
- `1db27410d00e74b35c0e017efa058080cc7641365093dcd76695b333a4dbe052.json` (~406 tok)
|
||||
- `1e6d25b23b6374258f00dcad017b13af96b179f0ab46b57b645edde2351ce116.json` (~15467 tok)
|
||||
- `1ef77ec32c809ea9f6abe455804f5630dc3a9693e633b03068f3546dfeeab099.json` (~3149 tok)
|
||||
- `1f0bff79dc1f1fcb886d13bab79c289cd46c2fe9af46ed22739c8076c4a4f6b2.json` (~10944 tok)
|
||||
- `1f6c6535ebbdcedd95bf44e6b96f07f1234d7ea54cb747d6e113f90ccf4bb7ea.json` (~13910 tok)
|
||||
- `1f7e683af7e73fefdcf14ce40c2ee81dfa8aa113b7aa90b51067d870710baa7a.json` (~332 tok)
|
||||
- `1fe907805f188b6cf4e490bbab545a31e875b83a02bb0e7220e1b8666ddee3e6.json` (~332 tok)
|
||||
- `204755bab645cbf0ae12bb0bf8787de41a1f94e10e2988eff7357b93085e7466.json` (~8392 tok)
|
||||
- `20f4f40d81b0a264990d7aab7acdf82a1b66fb32d803b2b878f056973584921a.json` (~474 tok)
|
||||
- `212272920267eaed9f41bb33936ef767250734cbb810306b712126256ad9e94d.json` (~351 tok)
|
||||
- `2155a5a1575dcef9f688750a7ab5aef21abf6857b99ca64f0140ec2d95679d8a.json` (~464 tok)
|
||||
- `21646b4f891df0a3a87bbf8bc22fbed445cf2865d4fa7c6b1c3366b5b5a55b37.json` (~1737 tok)
|
||||
- `21b020e96fb39c7dc4f05e58b046551b0434adcb3fb196276a019175b1d189dd.json` (~4422 tok)
|
||||
|
|
@ -589,145 +542,189 @@
|
|||
- `2218f88cc182f9064384f7ef7a3ac49908b837dd2d067cd8dbced90e8d043884.json` (~8526 tok)
|
||||
- `226d09a3ccfa62cc05d1b61facad2fd5f269e9f41888caa8457f1dc846435b4e.json` (~3797 tok)
|
||||
- `2272750056f162f7c74228b5a1cf2324b1299841d24f98d0dd31696682e18f28.json` (~2727 tok)
|
||||
- `22948d27d60794a47f2f93a70f92f6b9bdd22da872b32ebbad4812a1a235832e.json` (~81 tok)
|
||||
- `22e61dc743f906387265eea8a41943b22c9aab0f90ec999145a1a7ba7708b1cd.json` (~269 tok)
|
||||
- `232e0527910c5d5dbfcf861f2c6abd8658a0ed73b76f744d24c5cd24b250c344.json` (~8155 tok)
|
||||
- `236dbc464b50c074e467d53cab78fb8af06c934b191349a006f12477317ddb91.json` (~637 tok)
|
||||
- `237f88b4759f44668ce8cd4941b4231ee77fcb94c932ef3f283e596de3de41af.json` (~1262 tok)
|
||||
- `239ef73fc0ea3be8c6ce97517eb62f2c217a5c8b0cbd0c451fccceaf0ef89c47.json` (~8329 tok)
|
||||
- `23ae45376874ad36b52972b9b9031b66aa76f34d1de4b793801908d2dc0bdbc4.json` (~4128 tok)
|
||||
- `23b8085ed43aaaed2d876c21ecb494fa28af40a1cefaffcf5ffc4b131d9ed3f8.json` (~1662 tok)
|
||||
- `23c91fcdfe60f197a54ba90e48faeb3085a488c396aea86acda4c22f2777bc68.json` (~8238 tok)
|
||||
- `23cbeb01ae9cd9669fae81ddb2b2d6c7f89abd17b12365a5f6b256a32a717616.json` (~490 tok)
|
||||
- `2413854cfac3759faf39eae3f1132cac20fc8e916297c82256c957526bfa12df.json` (~53054 tok)
|
||||
- `242faeda0abe77b1e66a515917a267528fe2d1b0c091dbced56e493e9cf69737.json` (~3934 tok)
|
||||
- `2443d5f97a6adffcf84c2d6e593dca849ef0b302414976f1c1f44d4b8b72485d.json` (~81 tok)
|
||||
- `24829855230378343e117d2d2831a59dcb4efc0c8107a76984172094d819a306.json` (~1196 tok)
|
||||
- `2489328d295fdc7968fe9b006fdcf9755239044066224afc4fd3857c3667c560.json` (~652 tok)
|
||||
- `24fa3f5b3b5b6d59088387aad4130a5e2d657f88706205d6dbe57e8afda2e425.json` (~722 tok)
|
||||
- `251ce70fbb55f062faef6259731b4c82238f4f7af22d2c1ed266c86c15263b99.json` (~502 tok)
|
||||
- `25389b2042efd3ef5da1211191cd0c53e4d697dc319451cd5c7289fe6891dda0.json` (~1946 tok)
|
||||
- `255ff40d78e624e0f8c4e96ee7901bec920e078d9960cf9cdafa2a97453e877e.json` (~359 tok)
|
||||
- `2562c246c26f605f6ae96b19b59bfd9d1553b62194d348951b48964429914f8b.json` (~7592 tok)
|
||||
- `25a469841d1a48195460555e7ad298e145ff56da07c945566efcc95ac109b226.json` (~30466 tok)
|
||||
- `25dbcdd9da5297a9d6c98903f9f02d5d9065c88d7299b20c76b01a99f0ea2c11.json` (~81 tok)
|
||||
- `25d9960f7189fbb39fe69da1e664f8142f3aa9df8bbccc2253e148b2cfcfade9.json` (~269 tok)
|
||||
- `25f6c2a43106baedfadd95c63a6756af97347a44dec2331761762e474aae4efa.json` (~2638 tok)
|
||||
- `260fd344161776959594ebf486e3f15b3e284296c9bce4976df2f3b9c032532d.json` (~8329 tok)
|
||||
- `266573a6c4e7a0f3d1ea12581406c0bbdd0e38321f0573a978db00a9d56cbbd3.json` (~333 tok)
|
||||
- `267c67c5b1f429f43ed99481e42652c822ffcf51d0d0c6ba4121d120c9f74e4c.json` (~441 tok)
|
||||
- `2729cd44ff4befe72984d232b7ae9d0a2bda3c0ad487f7907c73680caec307e4.json` (~14268 tok)
|
||||
- `27e1c38fff94cb881b9e58c98496e83ae63eb8c025f3872f9a2d81fcbbae990d.json` (~37255 tok)
|
||||
- `284ed1a83c382d8a248273e336c02fb4673b75d877136f1c5f061412fd32dd8a.json` (~17664 tok)
|
||||
- `28773893e82e437c0850281f02e3d0e8c33a905b667ab3b5ec15c0125069cce2.json` (~12593 tok)
|
||||
- `28d052ea57fd7eef39d0ee9fe1d7c7531b0ddea082a123a6997c50f0703f2d98.json` (~1340 tok)
|
||||
- `2930482f7a15ac6d50037b6465a084fdc9cbed52609068751020b5c3016088c3.json` (~1279 tok)
|
||||
- `29cd8d6bcb6dadf0782652207d01f8eb0435d068aaa91c582d98a961fe3ad8fc.json` (~2251 tok)
|
||||
- `29f9d3dbb7661a1fec506165923e621ed0a0c0f1fdab925cb1759bdaf50e5f03.json` (~154 tok)
|
||||
- `2a2bb41a3bfba155bd19f74ab5cf8ed888210b7ecc7a11b5be1dd100774bc897.json` (~2825 tok)
|
||||
- `2a3d257e37d41ee27ac06bc1b28716624b811a1cc6446f1e56e78a7086d6efc3.json` (~12593 tok)
|
||||
- `2a5dc701edf8702bf74f2c9127b4fd7d34b53e232f21c275c49c6e89e427e606.json` (~8238 tok)
|
||||
- `2a7e32f31ea531530978500ba347d3eb463270ec6c4f4b0e300c84a9fca4729c.json` (~1131 tok)
|
||||
- `2aac8940fc2b352d82c8dd4f713ebfd622cd4362def8801096016bb713b9f35e.json` (~19676 tok)
|
||||
- `2ad72e7a427f8046c048381f2292e12f34926b58456a02043b407d6cf490a77a.json` (~28558 tok)
|
||||
- `2b0b0f1eb49df36a2e8fd4f88317124dd1edf9a0f08545a1a53accd6b47b16b1.json` (~309 tok)
|
||||
- `2b2444e22dedc796df87ccc78174df31031a529b9f3f346abb0e6b2f6d4fc52e.json` (~81 tok)
|
||||
- `2b36cdbba90a7e8d28e41d1db13968f9835bc5eef704899c398cd23b04abcdbb.json` (~1122 tok)
|
||||
- `2b3923c904abf48e7056718e593e92e6cac3c38606ded4c39acbad3468cdd6a8.json` (~8010 tok)
|
||||
- `2b6cec7f7a4d2ff30575fb5c744d62b40821119a034d3ae76babae799ce7917c.json` (~81 tok)
|
||||
- `2c220f2115dcf1eaf97111f87e953d7fd6c1c6ba4ace861b1f7f6b533a8915ec.json` (~652 tok)
|
||||
- `2c248a9563703f47faee7ed52cb4054689e07700bc17f38c025188351b860d17.json` (~81 tok)
|
||||
- `2c4427908596fd2a9eb4fd805b1d8b1f9c825dd2df14b560b1264e66eaab9e7d.json` (~15340 tok)
|
||||
- `2c46e2714bddfc44f5f42657d1bf834a1b50130847ac5742955e5dba3b6bc96c.json` (~76 tok)
|
||||
- `2cbca2b1bf0345399a27e19131777f4d537a479e5d9eea2aefe60bfa6f0c848d.json` (~5279 tok)
|
||||
- `2ce08b7c8b08e1091ac5949fb66ae92fa683e1be76fbaf7b41b958dc151441e8.json` (~24408 tok)
|
||||
- `2ce67e45b669a308d17c7ea9c19a75c9ff4e6b8fee11e4a38b9c52f35a1cefe1.json` (~81 tok)
|
||||
- `2cfa572dc6e7e65215e965583eb1ed589b5e67236b2ba727a7144ad8c09e92c6.json` (~269 tok)
|
||||
- `2d2ada19437fe72674471be93be30236721422b4f63176a58b6470f26ba5d88a.json` (~81 tok)
|
||||
- `2d59df43c2cc4d09ea8566c4a94d70cf1a59b8d86e8fc4f9d7c49e92fd356d75.json` (~702 tok)
|
||||
- `2da311d70331211f4889d37b811bfe6d4de072f101d561837f94cc46b2442696.json` (~81 tok)
|
||||
- `2e097eddc32d49647dfd7b1c33bb454265b5587ec5bf148029c1ea496321073c.json` (~5588 tok)
|
||||
- `2d7bca77beedd8fb1f113d009148dbc494da3f2c7db1546b50716ad5a2008ceb.json` (~268 tok)
|
||||
- `2efd2ac807fbaf51e1d509f8703b3a911bd6a2e99f11b7738f040cd777e02232.json` (~565 tok)
|
||||
- `2f253d9538cf47faa19555fcece49f789b8e0379c5d654a0fb17c2b9037d7e6e.json` (~619 tok)
|
||||
- `2f314917390ab9fc2f54f98e76033a35b0ac32f11d28a23c6cef9b10c03440d5.json` (~296 tok)
|
||||
- `2feeb0b89a79e107de5bd960ff0928229edd8ecd466be018d2f3e01ec37f92a1.json` (~406 tok)
|
||||
- `305c23f862d15ebe5ac5f8a24faff332bc1b47b912e318e8cf48aa9f8caf6845.json` (~30585 tok)
|
||||
- `30e46776a7b0b61fbf25b89f2cbfc05cce0db668f4e79ff9e2b5094e3b968fb9.json` (~2029 tok)
|
||||
- `310cc0c86b9b4731dc1657feaef6f82609534758ce5844550c1f430587248129.json` (~269 tok)
|
||||
- `31314813c9df83c12d3ce583abfae372cdd2b6fa81c85668871b82ea4a9347e0.json` (~10611 tok)
|
||||
- `3143298f7a6b86ced4d5f90d69491d3330c949f704944c0e74db95652a516dc9.json` (~31859 tok)
|
||||
- `318a72243b566402f62baddf5e7dd68a62f4f41eb20f5a9874529363bc92b8c0.json` (~8127 tok)
|
||||
- `31925f74354626a58d815d51a97d505725f05f1cdd757f6d07c35080d040c3b6.json` (~10147 tok)
|
||||
- `31e922879882c5b3f25d90a04b60bd1d7379d4c9129844b17a6829bc4bf89615.json` (~2210 tok)
|
||||
- `32263562937e5b72d3330814c6f107330176a5270e05f2009f0cb77800d669d0.json` (~73 tok)
|
||||
- `323b81424dba12471c44d1dc784633bf1d5a69a98fe31afafbdc964b63dd28ed.json` (~7914 tok)
|
||||
- `324d5a22da8a2bc8a6a657073dcd1ca83f95aafde5553a4425c41fdfd18b1502.json` (~844 tok)
|
||||
- `32526ddea34efdc2b69417295f72211dd5610b79379991f1bacc52a8e41e2bc8.json` (~5167 tok)
|
||||
- `32a73e47aacef8b9773844496f1bbd6068795cb2532775f0118d3147fc8f19e3.json` (~591 tok)
|
||||
- `32b58522b3e3c7218eeed3098b6c5c4f877195b74425407770722c3dd4e2aa8e.json` (~1988 tok)
|
||||
- `32c297b24895d5f2897691912f3881bd9390917db087a19c1e8d72b66e2060c5.json` (~16691 tok)
|
||||
- `32e14fb903c56f7793ccae75f5dc2c5511d97225d96486afd56604ecb3a43b7e.json` (~81 tok)
|
||||
- `3345b676a5c6e6c2392fc43615a0e0da1824dd13c83d3598598690f8c63697ef.json` (~15396 tok)
|
||||
- `3364f257aea55647d0ffd26f5c508d04e0cbf24c96c9d1090eeade816bd1adb9.json` (~5386 tok)
|
||||
- `3399458fe3fc893d4f104368ef5ecd4afb95871b46436b2d09d9c71e700cefd8.json` (~785 tok)
|
||||
- `33be867656840f3aa175ca57d8ae13a9f8edfb83c35e00dd876d55fe3d908d7e.json` (~15467 tok)
|
||||
- `3410dfc1ec23e9b3f27898e5d1ad8b821da4176eb9d5591666976699efb3126d.json` (~4145 tok)
|
||||
- `343a8094773eeff36246fa33f6bfa7ec36ae532abb4da401e808928adbe70424.json` (~15134 tok)
|
||||
- `344f4897098b23fcbfb47fdb64e4daf881dc02570068ecf06b077259f63ba525.json` (~1005 tok)
|
||||
- `3474f93a95d80c3c6cd6d95cafb0f5e6b66615e9c1aefd379dfe59e9d229d353.json` (~592 tok)
|
||||
- `34ec637d899925d6db1ba12bc8bf368183f2b0e3636ba7212b2056bf7bd642c6.json` (~85 tok)
|
||||
- `35084efafb380fce518784bf2d8b13c3683acabd3190810991b97a34c52418c2.json` (~396 tok)
|
||||
- `350898ae8fe9d6a099d42d9d292c43efb8a1a37182085f7acadb6b34602d6024.json` (~11199 tok)
|
||||
- `351d8046e5f9f289979f6864f99509fc2fc25b015c2ad343ab4b99193132e56e.json` (~715 tok)
|
||||
- `354f4cfb8682d9b8765e7580be9c5bd1555799633a6d59dc3aea0150f0528acd.json` (~15340 tok)
|
||||
- `35687c768af0e0ff77d76bd1dcc018cd30b6b20c597a67586137ed0a9878bd61.json` (~965 tok)
|
||||
- `35795db2910ab61ee7bf5537a6ca93f93732832dd4b43de3f36720d386de5fb8.json` (~1005 tok)
|
||||
- `35ec72e792b59b19044577eb54a5e7540f026ac35c6003306f597a5f1387d227.json` (~5448 tok)
|
||||
- `35f823871a12ed1809e20d70a663c8a8929fb35f3748705499e32df6cc4ec5c6.json` (~277 tok)
|
||||
- `35fd2a3ceb004b1d47fe5ccc509be97f4d380faebcfff32399237e9dfab59c00.json` (~6584 tok)
|
||||
- `3647cdf8214f8d719efeb55483edf1e5f601279994194bbd06e8ca067a55c2f7.json` (~108634 tok)
|
||||
- `367e004bbee4bd3a32e05eaf817f2dae69e39266c36b1649e4d3929362e383da.json` (~930 tok)
|
||||
- `36b96cc86a02e341b8b895b48397dce2385a86221fc47109ccddf46daeeea250.json` (~81 tok)
|
||||
- `36bcc986a2db0fbc0ec8b96ac0cfb16d96043e0f845992576d762e51fd7b242e.json` (~15340 tok)
|
||||
- `36c04caec72b0f97b36069c3908d6192104c00f4d704bf0690fc61765531f523.json` (~10462 tok)
|
||||
- `3702a2af17c73eed0470df46cecddc0b4c9a93aaab893ff5292d5c5b9b4ed512.json` (~9636 tok)
|
||||
- `3714706b1961d4945195e8613ba7a5fcbf550c040e671d5860f2e8d747dc477c.json` (~6708 tok)
|
||||
- `37a543436eff088729eaa2a790c9ef9e58f59f226122e12aa2a0e6c38bc6f5a0.json` (~1870 tok)
|
||||
- `37cc6559d16e5a27798efe47d8ef040ddb31d3774fd6ef9e594793d8083e99f9.json` (~15467 tok)
|
||||
- `37cfdb1b9139384b7afd6b71a19606306bde221b63a2c4b3eb65ec5307855e45.json` (~17007 tok)
|
||||
- `37d60444e71080df18fa511b971b5c8d3c62ac5e8cf74527dcdab21a2ae69a76.json` (~561 tok)
|
||||
- `3816d68655555e3b0fbaa3474816b59e27e52bb3b685686470a4d504053e203a.json` (~1110 tok)
|
||||
- `381ebaece388d903a5945752e2c6a1b923416e6e1f5373b13b903bc69639919a.json` (~6344 tok)
|
||||
- `386ae1e8bf78901053b32e9e09acab3017e1b15c172bdb9a7f0ba752ff25583d.json` (~586 tok)
|
||||
- `388dd55aa581a70dbce06969cd866d8f46cdfaa55cbe211302cf06acdc9fd64e.json` (~2999 tok)
|
||||
- `391cd94df914760e40d43aa047d32a6105918d3006e76f829cde3d5e77ebd1ca.json` (~652 tok)
|
||||
- `396e466ffa3cc396b083d8500b44a94b3d48f18866394c5d7cc8d1e2488bfc13.json` (~801 tok)
|
||||
- `3993a289fb925bac9ad356f94888ff857a44d592cf7d4c1815c3702493f24568.json` (~9385 tok)
|
||||
- `3a1c0a4d790a5bb1e032f9fb3e075ae112f12ebdcf0d096e53d65eddb606120b.json` (~300 tok)
|
||||
- `3a38eed59cea97b4e4b01fc4c0ca709a8a1e5c2065d6313ba025dc2dc239334a.json` (~81 tok)
|
||||
- `3a5d7638d9686a803cdaf98d5696e7dce79ce8876e7dad5a4f4a9cd9b26f473b.json` (~14751 tok)
|
||||
- `3a68f18d4842f9b82045fc5d795559e4763a993fb90a5115e8b0a941a2c4530f.json` (~15467 tok)
|
||||
- `3a6a97b8b8e2a07a3727870d8d4cd2bf8e52b8c30bf792aca0ac507bc99df405.json` (~9546 tok)
|
||||
- `3a6b9bf4c71e1e1b73af9874b2b0527602a93a58d92bba1df2e023b12827fc05.json` (~31127 tok)
|
||||
- `3afa3ebabd95e2dd6a480b94ee3fb361d3662421e7093c382a18fecbcae3322b.json` (~269 tok)
|
||||
- `3b3d41a9d9e7bf1a198634ee72bea3a02b87747fa073455ea33e203dca82b5f8.json` (~3990 tok)
|
||||
- `3b69e25c707eab4010cdbda8e2318a464bea4be6a2afbd7a985f7ea7706e09d6.json` (~2171 tok)
|
||||
- `3b768831aacf2f624535f6b5a9fcfa16db0b0650647dc2f7cea8d8535e708db1.json` (~81 tok)
|
||||
- `3b7d7fec7c26be70ed24ea69bb6ccd4bd5283f2cdab0bebee83059abce35df97.json` (~81 tok)
|
||||
- `3b9ea86d334e477b40b39d49f89f56cf27dd4797dce0436bfda50f157d20ca97.json` (~592 tok)
|
||||
- `3bc0e6a7a00dd29f382b9c836dbb598929fd4e4edb1b450959d00c8e4712bd8e.json` (~636 tok)
|
||||
- `3c10b54471efe824f1a83f3850f6bcca4e2d77c61410b1bc617461546a792a27.json` (~64512 tok)
|
||||
- `3c3cccc9607f4041ae193d3d0447f495c08dfa09f28d9ff75b4f73b98264d0d3.json` (~725 tok)
|
||||
- `3c576da7137df22cc5fbd982fd231d9d40d374a77c7d618081ba7018f5eec36c.json` (~4654 tok)
|
||||
- `3ce0572164f9daaf2eee6a108f57bb947fb3d812c5578c7451eed78062e38b68.json` (~8024 tok)
|
||||
|
||||
## src/controller/
|
||||
|
||||
- `cluster.c` — include "config.h" (~15511 tok)
|
||||
- `ha.c` — define _GNU_SOURCE (~52565 tok)
|
||||
- `ha.h` — ifndef HA_H (~14911 tok)
|
||||
- `persist.c` — define _GNU_SOURCE (~18295 tok)
|
||||
|
||||
## src/include/
|
||||
|
||||
- `persist.h` — pragma once (~2668 tok)
|
||||
- `3d7e3a102cd4fc3bc27f599364f8f63ec75e6cb1ea3c47bcacc0e1261b485a15.json` (~3783 tok)
|
||||
- `3da9ee357a09d89a26df59bd0393606349c2d0849078091078924f60b5cdfd51.json` (~495 tok)
|
||||
- `3db8027a5cdc79633520de23a59b83fb76ecfba3132ba8a4f52e785220157e70.json` (~336 tok)
|
||||
- `3ddf0434ea5d953052cfdb1597b14704a3692537f86a9fc442ce21024160eb1a.json` (~30420 tok)
|
||||
- `3de5f25efab468345f714829408944025550d1056ba2b46fa3f3f29bcd5a9573.json` (~2258 tok)
|
||||
- `3e4c4692b6473b063999f972a2cf88d768446bb245fd18a91f83d4ced2f1eaa5.json` (~847 tok)
|
||||
- `3ebb59da3bec8cfea2f9a426717e513a696eac7f6e08672e0a2d7f72ac811ba6.json` (~23800 tok)
|
||||
- `3f88bc2442422df4bf6036c3b2a1b3409779cbbeff5df7fb2c031bd14f973119.json` (~6809 tok)
|
||||
- `3f9cade10a0070913a41048bc2462ee7a4680399174c61c30c8d6e8a6e722cee.json` (~4780 tok)
|
||||
- `40138b45926e46347669dbe289bb2ea7597aedc0eb558bd0d39aacfef5df62e1.json` (~2333 tok)
|
||||
- `401cd381093f599bbb1439aed5ed4e0b4b1fd4026dea54a11e953bafc7289301.json` (~6490 tok)
|
||||
- `40a5802d6063d7dceabcd49010eac965e03377546e69b2839ce06e3bc19fb99b.json` (~3592 tok)
|
||||
- `41bc353adb8853621ebd82fa735c038f98fe3a7e14d44a2eba6a50f01b4cc944.json` (~1511 tok)
|
||||
- `41e4d75d97d06c3f52e77585e5d114ccd5a9ac8e21767a2b7c74cc568dc7b5b0.json` (~298 tok)
|
||||
- `4244574967e1be57fe35ab1b68d8b31aa262d50a728d8877e7af61f9dec09cd5.json` (~526 tok)
|
||||
- `42fc26ddae39455e27588e5cd8b7a61961a4e5ce52a4e6c77fce30fd813ebe38.json` (~465 tok)
|
||||
- `431735fb57e4e50e282f8cc57b09d553ef1b88f135996cfd253bfac5ff186bd3.json` (~2752 tok)
|
||||
- `43ba72a48acad7a07213454f6c1f78abccf9dd5ecf463d5863b83774dd99bf49.json` (~1010 tok)
|
||||
- `43cca59d292abf40819e07f2859c2dce727ca71a7334ce8384e9a1c50d922337.json` (~3604 tok)
|
||||
- `44245055f1f2aebb7db03f3ef508b06f9357cc6f5671308e8bfcaadf913972ad.json` (~2335 tok)
|
||||
- `44b45ed14c23e25aad3d891047d8f407eb08684458d1850b31e75380bff306e5.json` (~2902 tok)
|
||||
- `44d133b11103df5a5455f0e124056054065a43a4cf9bf6608a157d98a8247919.json` (~2414 tok)
|
||||
- `44eacc4abbec955dd4031ac82e902ced758e0fc319af2c17d2cc650d7c8701d3.json` (~648 tok)
|
||||
- `45a3f01bceef855fff2282e1e2f5a96edaf6e49eb2dd6774de2c951190939476.json` (~876 tok)
|
||||
- `45b2440b66a988758fb836ac379113401f941ef6a28b9eda47de0ec5b15d8775.json` (~2613 tok)
|
||||
- `468a56306bfbb4b7f8f052404e6f4d239bde83c10b206520cb8e9fd6631647c4.json` (~1038 tok)
|
||||
- `46936120f3fc1bfe47072b25b2af1a816c418616c4754b04053995ea6ba7e850.json` (~24480 tok)
|
||||
- `480dbaa39314c68c3d4da3c1cb184846dc98ea3f672516afb1683ad674bc88cf.json` (~678 tok)
|
||||
- `4864f62b6a1943ef81d8e4f903830c54ca1451bf8656bbcacf0b603e9ca39af9.json` (~238 tok)
|
||||
- `48e2a62af809b08d550c4c38d6312ef86dddbab71aa13f2b6058f83da4c364eb.json` (~1226 tok)
|
||||
- `48f612d06f7f9ac59bc69ee5cd647248f72809eb7cb81546a1d7fefc9a0c560d.json` (~16313 tok)
|
||||
- `48fabd0bf158cc4c2454a0f8feac054b1bdfaf3487e7a59ef8333589996833a3.json` (~27880 tok)
|
||||
- `493d95ae6177d34856630ff36929d3a77bdfdda78cdd13a3079af121c61a28ef.json` (~412 tok)
|
||||
- `495102d8b31e92493be8301b6d6af618f217d67f5d23eb73970ed03e4e6aae38.json` (~2679 tok)
|
||||
- `496de07d7e51cef1389ef84f25304ca54e6ed1d409b90c924d73cbf88230066d.json` (~49671 tok)
|
||||
- `4a16de26cbf3a4184dc0761323b9a08875225fe03c549d151fbc746db1144a7b.json` (~5507 tok)
|
||||
- `4a1af2b057f91ffb734e4dd1c6e02a70f7054d58da2611f6ff04b74883f2c46d.json` (~5486 tok)
|
||||
- `4a4287dcf690e9f19f6452e52c82efe2200dcc1c040b13272c606ee0df281c6e.json` (~50441 tok)
|
||||
- `4a48ff8b5aa860c94ce2439538aaf0a877bb759fe3f312b9a3be65dd8d121b47.json` (~3390 tok)
|
||||
- `4a5cfc964b051c80cf77dab98611bc81ee2af457f1fe2fcee99fec744ba1db6e.json` (~5301 tok)
|
||||
- `4a8450b30e8d556a37680a470ee5bfc9d223c06eff6dee6cbcd7b3b4a402b1d5.json` (~1551 tok)
|
||||
- `4b1e8b3876352a607a2d7f8945f9770d648a45f3285f916ab81b29798e1038b9.json` (~5468 tok)
|
||||
- `4b648434f378dc77cabcf7ad726d40ab8a3ecd4bd96c25fe2b9b303713b85cfd.json` (~71366 tok)
|
||||
- `4bf3a6240c3116e762e6c911280d0bc5e14d68dbd7b82caf61f8695a11587e72.json` (~1277 tok)
|
||||
- `4c776cf52b544a88c4c9a52d25dd1520c7a30cec47d7e0f08f0acb0eab7348cb.json` (~20902 tok)
|
||||
- `4c8845dd0c079a771cb7e6ff15708701de63a89516b79a1ec9a9cc9a2a5a4801.json` (~486 tok)
|
||||
- `4db3c1de6ac63ea0008c2a929d31af6a328b02f1f9ae4cca67aaf9e74d735e2b.json` (~2641 tok)
|
||||
- `4e1c9fda5ab7f3f66527cd52ef0fcc20daea535347855acfe4086cd0f9dd10c8.json` (~1221 tok)
|
||||
- `4e81d1fe6f1cfc63de7e1a59695f9687deecf540b45fa7df24141de82335a8b6.json` (~3036 tok)
|
||||
- `4e90715ba4f6253b1220ccc8949da57080ace7973196ecb257522a26b6288952.json` (~626 tok)
|
||||
- `4ee847c53c563a13117c4c6c9079895077ff7d18e951e8860530548e82f5f3e8.json` (~888 tok)
|
||||
- `4f1695f88fdc020f547c2cf509e08b8facfe69919b541b554c0aec76ec04537e.json` (~1432 tok)
|
||||
- `4f385d090c5ace09ef00e7883f4d965d6212218ea58df3f78088208fa47c7d56.json` (~8132 tok)
|
||||
- `4fbcc8c4f9a4190c3d5e6717b7d8315428abbdbc24b390b1081ad03954769178.json` (~181 tok)
|
||||
- `4fe83cc3758c5161a6c0c74e565d4e06a5eea66aa1488e2c1ac248a539742039.json` (~13032 tok)
|
||||
- `50b5f4dfe98634fea8d756c15c1b3f4d86fc1d607698133430210d0d97977856.json` (~1479 tok)
|
||||
- `51103bc49cc87487f9efa30dcffc5f7639f0cc6cbf8acc722f5da33fd0ce32e3.json` (~8308 tok)
|
||||
- `5175f1392d190fb958eb902f22aea50b3506648b739e0cb8a7bc42d389231e4b.json` (~4502 tok)
|
||||
- `51d646ce7e4c76a33d29d45d20149ff8825fe4339a842c2d000ed93d9e46f3de.json` (~12490 tok)
|
||||
- `527377e036844617174eac5b08965176bb127edc5db3d5a77f362b034a4ec4fd.json` (~10319 tok)
|
||||
- `5286722a3fefdea557784ae42c65304cf227e92c44178fff83b9f2394c57b2e6.json` (~5453 tok)
|
||||
- `528bfbd499082064cc9b015a4092ffba50f77e09f2f90b5497e20aec9aba24fb.json` (~138 tok)
|
||||
- `52a31389293007060719822853ae31ba48ea5a86df8441b9c191c64f173fdabf.json` (~2318 tok)
|
||||
- `52eabf2efd0f747f08eaf21143a5472f29e59591207fbc96262b97ff05925e6b.json` (~10316 tok)
|
||||
- `5343869ca34f5c819db0bccc7bc641c28bd99771118d48a495a4df736bc7cfd6.json` (~90431 tok)
|
||||
- `53630b8212623bc229ce74e756487117d202ec192b8120561d9fb5f19012b19c.json` (~1053 tok)
|
||||
- `53c97c6c796b513ab01170b56e6ace6f8725efa934165c6a84249fb0e278b687.json` (~4856 tok)
|
||||
- `53fb90c7ba54ed15ce868aec27ac9cf045a8b40311aa80dcd8c0c27619bb68c0.json` (~437 tok)
|
||||
- `546ac5f8e828ce834dbc0fd2e1af00b3970345404390f8e8de9d656977fb2761.json` (~2372 tok)
|
||||
- `547c8859d3083d2aa3df826d7d45b335b63abd89ecc10f67810628b642b26f28.json` (~32474 tok)
|
||||
- `54bf081b3ee033f99f334327084ec909aee9a0f93c01e9e7140a6da2e0e218b8.json` (~427 tok)
|
||||
- `556328f8d56c22698674e3a582461b4fd0b25468ffd0e633ab59b7441b9d1e52.json` (~1592 tok)
|
||||
- `5598204d609251195af1fd249f50dc13954de3767c7b1f6d3a5d7217f44ed180.json` (~1398 tok)
|
||||
- `55a60e8c9ee3b15597774bceaff343b2294c6bf4157ede4a0bc7e63338fb03a4.json` (~1627 tok)
|
||||
- `55a658f23a6ae2ae434c1847a8ce4e67d6077bb1d86cfdae1854e86b332c214a.json` (~3305 tok)
|
||||
- `55e566c3da1711786075f53bd5b5cf55c8c67385305c4e056e5c536471387fae.json` (~3852 tok)
|
||||
- `56138bbd8d51760f6d3569adae6d73f03a80a03921c90ad9428dfae1bc955894.json` (~59910 tok)
|
||||
- `577e37e81e94ff718f63cc8d59fb255f51ad4090898b88e7996ad50eeceb3379.json` (~4531 tok)
|
||||
- `57bfe3a23733334ec3ba0e0685f8c23e60f79d0c8a5db5f0e33dd1f050b747b0.json` (~13651 tok)
|
||||
- `57d9e640d91abd2f583860f3d63b54c0da0d89622194e945122d238869af3579.json` (~2262 tok)
|
||||
- `581c504c4d3fe6ca908dcfdb5bd9507b73f9b821e96fb15d58356ab6f2d04ccd.json` (~2270 tok)
|
||||
- `594aedf253eb6263edd24ffc2d34c93a770f4bdc0b728515eb053324773d4ddb.json` (~8323 tok)
|
||||
- `59f075695e0135dde52ba377bdd55298ecb1357cb177b5438d56d4244ec167f1.json` (~2354 tok)
|
||||
- `59f7956e28ec4fc2d018f85746017fdcfa3b6a124bbe9e6b2eb4cfc7e77b9be2.json` (~11412 tok)
|
||||
- `5a1508eee3b01cfd7586af0f88973dfc8c51ef9bdb8d3d6fcf7e40a61d663b0f.json` (~362 tok)
|
||||
- `5a1511c3eb48c941df71bc3f218854a6e5e8b3342f3a83d58b8bbc3adcd573dd.json` (~2093 tok)
|
||||
- `5a51f4134cc78b3e9b72124a8117a45e1d9a97d943172d29ba35c29fd844b12f.json` (~360 tok)
|
||||
- `5a92249e0d4f9dd34ff89497b4c540e6b84a672a455b0a5be5ca710b94e9eb79.json` (~4454 tok)
|
||||
- `5a974e6340597c0447c72b0d7bc977a668a8da2fac8c90c810e886c319e9bbd0.json` (~2118 tok)
|
||||
- `5a99edc88f1f75983b12b9b8931c7ba5717424024e2ffb000e19564f2956175c.json` (~2393 tok)
|
||||
- `5b5887beb614d310bb85633443a1e29df0dec82a39650daecc39d529ffe5ce37.json` (~4806 tok)
|
||||
- `5b710141d6eb0f199d33b695898e32519aca05ea857921dd62bf508c7f954948.json` (~567 tok)
|
||||
- `5b791c1c235d96fe2e512c3d6fedd8f44c5ee256db33beb485935a3f6cc3d1c1.json` (~6930 tok)
|
||||
- `5ba290aa8c7bdc0254d6b5efcaa55b3c85a821c51150bdebe182f29e37d9106b.json` (~14456 tok)
|
||||
- `5c1cd225c770bed4fc03e72d8433eb17a2193588c47d5abeb26580098aab6506.json` (~77 tok)
|
||||
- `5c3a1e3d92d85d4d34293b056e67c900f4050fc51af7aa5fa4d441070ecf536b.json` (~41692 tok)
|
||||
- `5cebb6a86cbc5a90d803973f1365c1673f3a11bd36cfc5178bdc985a03950378.json` (~8230 tok)
|
||||
- `5d7b2f244a9e7100f16139db782e80265d4724d5cb53b7c51fab1aeaaf1fb7b6.json` (~1313 tok)
|
||||
- `5d996b732909e4428bb55522f4fdad491a98075c3aa256d7a816956bd42adac7.json` (~984 tok)
|
||||
- `5da97b26e48c2ea5c6df990bedce598cfd8052022102fa7a7e4c499c6f1374f5.json` (~1773 tok)
|
||||
- `5eb698f53d93049c137820a52db3d1a7c451be085cea9d956a06b44671034787.json` (~1504 tok)
|
||||
- `5ed29f8b6584e6bb033cd37fb6ccdf486254adda489f989641a3dfdf1c595cd4.json` (~726 tok)
|
||||
- `5ede9a0001022535c762bd22ae452960e9664ea3487e3bcd04a9cc3368b9b819.json` (~2470 tok)
|
||||
- `5f1dd49f629f4e9163fb4f2dc4ba3c810a01e6c6604835843560f1fab6303bd6.json` (~506 tok)
|
||||
- `5f4bcb8abfd96052ce4500607dd3d9426acb458a5cba0a7a57f641f6b7d5a95f.json` (~801 tok)
|
||||
- `5f522fbbd977c3b08acea207a56d99aed5069c1b882a186498c8f0cd0957493c.json` (~2972 tok)
|
||||
- `6041d9e4749c93c1268d8ddce42d2eed66ab5b1dd739ef9fd28bee04f745bb48.json` (~3610 tok)
|
||||
- `6101027f230f560481292b1839c195d6a761a1a40d615f2aa6c7ab8dcb0db512.json` (~20625 tok)
|
||||
- `6138099a827202f5f984212ac5a92cdd0181489a14a0f341b27169d40695fa9b.json` (~12476 tok)
|
||||
- `616ea854efce5a7e95c1739d6400bb48fd63c7cee591a710c66a2bcc9e70fd20.json` (~4511 tok)
|
||||
- `6180aec3d86b1cb2980831e6c75a8ac6216fd14493f52a1539ad73a750bd10b7.json` (~5053 tok)
|
||||
- `61f1333461274a206f965221fa31fd7ce681795ce2c4271c9455759288e83655.json` (~4360 tok)
|
||||
|
||||
## src/lib/testsuite/
|
||||
|
||||
- `test_raft.c` — include <errno.h> (~36211 tok)
|
||||
- `failover_harness.h` — Declares xce_cluster_config_t (~1393 tok)
|
||||
- `failover_harness.h` — test-only header for the libxce-failover harness: fo_master_cursor_t, FO_STATUS_TABLE rows, fo_run_threads(); no production failover symbols (~900 tok)
|
||||
- `test_libxce_retry.c` — libxce-failover reusable harness (fake-master cursor, status taxonomy table, N-thread runner) + GREEN self-tests; consumed by later failover tasks 2.x/3.x/5.x (~2600 tok)
|
||||
|
|
|
|||
223
.wolf/memory.md
223
.wolf/memory.md
|
|
@ -264,77 +264,28 @@
|
|||
> Consolidated session (0 actions)
|
||||
|
||||
## Session: 2026-06-08 05:57
|
||||
> Consolidated session (13 actions)
|
||||
> Consolidated session (0 actions)
|
||||
|
||||
## Session: 2026-06-09 21:12
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
> Consolidated session (0 actions)
|
||||
|
||||
## Session: 2026-06-09 21:17
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
| 01:33 | Edited src/docs/cluster-config-split-analysis.md | added 1 condition(s) | ~288 |
|
||||
| 01:33 | Edited src/docs/cluster-config-split-analysis.md | expanded (+16 lines) | ~539 |
|
||||
| 01:35 | Edited src/docs/cluster-config-split-analysis.md | added 1 condition(s) | ~577 |
|
||||
| 01:36 | Edited src/docs/cluster-config-split-analysis.md | 6→7 lines | ~154 |
|
||||
| 01:36 | Session end: 4 writes across 1 files (cluster-config-split-analysis.md) | 8 reads | ~61375 tok |
|
||||
> Consolidated session (5 actions)
|
||||
|
||||
## Session: 2026-06-09 01:59
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
> Consolidated session (0 actions)
|
||||
|
||||
## Session: 2026-06-09 02:09
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
| 02:27 | Edited src/lib/raft/raft.c | modified if() | ~129 |
|
||||
| 02:27 | Edited src/controller/ha.c | strcmp() → deny() | ~60 |
|
||||
| 02:28 | Edited src/controller/myapp.c | modified if() | ~497 |
|
||||
| 02:28 | Edited src/controller/myapp.c | modified if() | ~281 |
|
||||
| 02:41 | Edited src/lib/raft/raft.c | voted() → grant() | ~210 |
|
||||
| 02:46 | Session end: 5 writes across 3 files (raft.c, ha.c, myapp.c) | 5 reads | ~72268 tok |
|
||||
| 03:17 | Edited src/controller/ha.c | added 3 condition(s) | ~497 |
|
||||
| 03:22 | Edited src/controller/ha.h | expanded (+15 lines) | ~199 |
|
||||
| 03:22 | Edited src/controller/ha.c | added 2 condition(s) | ~530 |
|
||||
| 03:23 | Edited src/controller/ha.c | removed 41 lines | ~43 |
|
||||
| 03:23 | Edited src/controller/ha.c | removed 33 lines | ~2 |
|
||||
| 03:23 | Edited src/controller/myapp.c | 5→10 lines | ~121 |
|
||||
| 03:26 | Session end: 11 writes across 4 files (raft.c, ha.c, myapp.c, ha.h) | 8 reads | ~84261 tok |
|
||||
| 04:02 | Session end: 11 writes across 4 files (raft.c, ha.c, myapp.c, ha.h) | 9 reads | ~84766 tok |
|
||||
| 05:56 | Edited src/controller/ha.c | 2→3 lines | ~47 |
|
||||
| 06:00 | Session end: 12 writes across 4 files (raft.c, ha.c, myapp.c, ha.h) | 10 reads | ~84423 tok |
|
||||
| 06:02 | Session end: 12 writes across 4 files (raft.c, ha.c, myapp.c, ha.h) | 10 reads | ~84423 tok |
|
||||
| 06:06 | Edited src/lib/raft/raft.c | modified if() | ~178 |
|
||||
| 06:10 | Session end: 13 writes across 4 files (raft.c, ha.c, myapp.c, ha.h) | 11 reads | ~84614 tok |
|
||||
> Consolidated session (19 actions)
|
||||
|
||||
## Session: 2026-06-09 16:49
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
> Consolidated session (0 actions)
|
||||
|
||||
## Session: 2026-06-09 16:51
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
> Consolidated session (0 actions)
|
||||
|
||||
## Session: 2026-06-09 16:52
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
| 14:xx | Validation-pass gap analysis appended for worker-join-refactor | .kiro/specs/worker-join-refactor/research.md | implemented, only 5.4 test-run unverified | ~9k |
|
||||
| 16:59 | Edited .kiro/specs/resval-id-decoupling/research.md | modified and() | ~2232 |
|
||||
| 00:02 | Validation-pass gap analysis appended for scheduler-controller-msg-gap (found G-1 resvals idx-0 bug, G-2 resource EEXIST, leaks, test debt) | .kiro/specs/scheduler-controller-msg-gap/research.md | partial, not 100% | ~12k |
|
||||
| 00:02 | Gap analysis validation pass for ha-heartbeat-liveness; found dead last_heartbeat field feeding vote gate | .kiro/specs/ha-heartbeat-liveness/research.md, .wolf/buglog.json | appended analysis + bug entry | ~25k |
|
||||
| 00:03 | Gap analysis validation pass for ha-config-bootstrap spec (50 ACs verified against on-disk code) | .kiro/specs/ha-config-bootstrap/research.md | appended analysis: ~40/50 implemented, 7 partial, 3 pivoted | ~45k |
|
||||
| 16:55 | Gap analysis validation pass for ha-peer-connection-reuse (18/19 reqs Implemented, 5.5 Partial: ASAN leaks); ran controller_unit_test (769 PASS/0 FAIL) | .kiro/specs/ha-peer-connection-reuse/research.md | appended analysis | ~30k |
|
||||
| 00:13 | gap-analysis validation pass: election-iomgr-refactor — found 2 failing unit tests from uncommitted ha.c vote changes | .kiro/specs/election-iomgr-refactor/research.md | appended analysis + buglog entry | ~30k |
|
||||
| 00:13 | Ran /kiro-validate-gap across all 9 specs via 9 parallel agents; appended Gap Analysis Validation Pass to each research.md | .kiro/specs/*/research.md | found 1 critical (repl data plane), 4 bugs logged (335-338) | ~1130k |
|
||||
| 17:14 | Created ../../../../../claude/.claude/projects/-home-rshen-projects-xce-xce/memory/project_ha_bootstrap_progress.md | — | ~576 |
|
||||
| 17:14 | Edited ../../../../../claude/.claude/projects/-home-rshen-projects-xce-xce/memory/MEMORY.md | inline fix | ~54 |
|
||||
| 17:15 | Session end: 3 writes across 3 files (research.md, project_ha_bootstrap_progress.md, MEMORY.md) | 50 reads | ~194368 tok |
|
||||
> Consolidated session (11 actions)
|
||||
|
||||
## Session: 2026-06-10 17:19
|
||||
|
||||
|
|
@ -1799,3 +1750,161 @@ Implemented sub-spec 3/4 of ha-consistency-invariants autonomously (per-task imp
|
|||
| 15:55 | Fixed controller test timeout: interruptible fsync_worker sleep (condvar) so persist_stop joins promptly | persist.c, persist.h | suite 300s+ TIMEOUT → 10s, 0 failures | ~25k |
|
||||
| 01:23 | Session end: 11 writes across 5 files (.mcp.json, settings.json, uninstall-code-review-graph.sh, persist.h, persist.c) | 9 reads | ~2478 tok |
|
||||
| 01:24 | Session end: 11 writes across 5 files (.mcp.json, settings.json, uninstall-code-review-graph.sh, persist.h, persist.c) | 9 reads | ~2478 tok |
|
||||
|
||||
## Session: 2026-06-16 01:33
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
| 16:30 | Diagnosed infinite PreVote failover loop (bug-605): live primary + lost PreVote re-arms doomed liveness watchdog; standby never reconnects. Confirmed scenario=primary-alive. | src/controller/ha.c, .wolf/buglog.json | diagnosed, routed to /kiro-debug ha-prevote | ~18k |
|
||||
| 09:00 | REPRODUCED bug-605 via /xce-deploy-ha (clean restart): 3-node fresh deploy elects NO primary; cold-start bootstrap DEADLOCK (ha-prevote x ha-config-bootstrap). config-holder loses boot election→STANDBY→PreVote-only forever; config-less peers voter-only. 96 leaked prevote conns. Corrected earlier lost-channel hypothesis. | /tmp/xce-deploy/logs, .wolf/buglog.json | reproduced+diagnosed | ~30k |
|
||||
| 02:32 | Edited src/controller/testsuite/test_ha_role.c | modified Regression() | ~521 |
|
||||
| 02:32 | Edited src/controller/testsuite/test_ha_role.c | modified 3() | ~79 |
|
||||
| 02:33 | Edited src/controller/ha.c | 12→13 lines | ~128 |
|
||||
| 02:33 | Edited src/controller/ha.c | 11→12 lines | ~117 |
|
||||
| 02:33 | Edited src/controller/ha.c | 3→4 lines | ~38 |
|
||||
| 09:40 | FIXED bug-605: ha_dispatch_gate missing OPCode_preVoteRequest (opcode 38) → STANDBY voters rejected PreVote with -XCE_ERR_STANDBY before handler → cold cluster never elected primary. Added preVoteRequest parity w/ requestVote in INIT/ELECTING/STANDBY + TDD test. Verified: deploy elects PRIMARY, prevote-LOST=0. | src/controller/ha.c, test_ha_role.c | fixed+verified | ~12k |
|
||||
| 02:39 | Session end: 5 writes across 2 files (test_ha_role.c, ha.c) | 5 reads | ~69020 tok |
|
||||
| 18:05 | Diagnosed bug-606: kill-primary → 2 survivors split-vote livelock (term climbs unbounded). Root: no randomized election timeout on failover path (raft.c:105 fixed; jitter startup-only). Distinct from bug-605 (gate). Owner: raft-library (convergence-recovery puts election correctness out of scope). | src/lib/raft/raft.c, src/controller/ha.c | diagnosed, routing | ~14k |
|
||||
| 02:53 | Session end: 5 writes across 2 files (test_ha_role.c, ha.c) | 5 reads | ~69055 tok |
|
||||
| 03:01 | Edited src/controller/ha.h | modified stagger() | ~178 |
|
||||
| 03:01 | Edited src/controller/ha.c | added 7 condition(s) | ~880 |
|
||||
| 03:02 | Edited src/controller/testsuite/test_ha_role.c | modified raft() | ~570 |
|
||||
| 03:02 | Edited src/controller/testsuite/test_ha_role.c | modified prevote() | ~77 |
|
||||
| 10:08 | FIXED bug-606: failover split-vote livelock. Added ha_election_stagger_ms + staggered/guarded PreVote start in ha_begin_failover (priority*step+jitter, delaymgr). TDD test added. Verified kill-primary repro: ctrl-2 won (630ms), ctrl-3 followed + guard skipped PreVote (1072ms). No term inflation. | src/controller/ha.c, ha.h, test_ha_role.c | fixed+verified | ~10k |
|
||||
| 03:06 | Session end: 9 writes across 3 files (test_ha_role.c, ha.c, ha.h) | 7 reads | ~93885 tok |
|
||||
|
||||
## Session: 2026-06-16 03:12
|
||||
|
||||
| Time | Action | File(s) | Outcome | ~Tokens |
|
||||
|------|--------|---------|---------|--------|
|
||||
| 03:27 | Created .kiro/specs/libxce-failover/brief.md | — | ~1922 |
|
||||
| 10:27 | kiro-discovery: libxce transparent failover | .kiro/specs/libxce-failover/brief.md | brief written (Path C, new spec) | ~6k |
|
||||
| 03:27 | Session end: 1 writes across 1 files (brief.md) | 14 reads | ~4682 tok |
|
||||
| 03:28 | Edited .kiro/specs/ha-config-bootstrap/tasks.md | modified NOTE() | ~204 |
|
||||
| 03:29 | Session end: 2 writes across 2 files (brief.md, tasks.md) | 15 reads | ~10520 tok |
|
||||
| 03:31 | Created .kiro/specs/libxce-failover/spec.json | — | ~128 |
|
||||
| 03:31 | Created .kiro/specs/libxce-failover/requirements.md | — | ~605 |
|
||||
| 10:31 | kiro-spec-init libxce-failover | .kiro/specs/libxce-failover/{spec.json,requirements.md} | spec scaffold created (phase: initialized) | ~1k |
|
||||
| 03:31 | Session end: 4 writes across 4 files (brief.md, tasks.md, spec.json, requirements.md) | 15 reads | ~11296 tok |
|
||||
| 03:33 | Created .kiro/specs/libxce-failover/requirements.md | — | ~2256 |
|
||||
| 03:33 | Edited .kiro/specs/libxce-failover/spec.json | 6→6 lines | ~46 |
|
||||
| 10:33 | kiro-spec-requirements libxce-failover | .kiro/specs/libxce-failover/requirements.md | 7 EARS requirements written, phase requirements-generated | ~2k |
|
||||
| 03:33 | Session end: 6 writes across 4 files (brief.md, tasks.md, spec.json, requirements.md) | 15 reads | ~13759 tok |
|
||||
| 03:37 | Edited .kiro/specs/libxce-failover/requirements.md | 5→8 lines | ~200 |
|
||||
| 03:37 | Edited .kiro/specs/libxce-failover/requirements.md | 13→15 lines | ~306 |
|
||||
| 03:37 | Edited .kiro/specs/libxce-failover/requirements.md | 3→3 lines | ~72 |
|
||||
| 03:38 | Edited .kiro/specs/libxce-failover/requirements.md | ready() → status() | ~270 |
|
||||
| 03:38 | Edited .kiro/specs/libxce-failover/brief.md | modified taxonomy() | ~305 |
|
||||
| 10:38 | requirements refine: real controller status taxonomy (E_XCE_REDIRECT) | requirements.md, brief.md, buglog.json | R2/R3/R4 realigned; bug-608 logged | ~3k |
|
||||
| 03:39 | Session end: 11 writes across 4 files (brief.md, tasks.md, spec.json, requirements.md) | 16 reads | ~14995 tok |
|
||||
| 03:47 | Edited .kiro/specs/libxce-failover/requirements.md | 9→11 lines | ~243 |
|
||||
| 03:47 | Edited .kiro/specs/libxce-failover/requirements.md | 8→9 lines | ~230 |
|
||||
| 03:48 | Edited .kiro/specs/libxce-failover/requirements.md | expanded (+16 lines) | ~310 |
|
||||
| 03:48 | Edited .kiro/specs/libxce-failover/brief.md | modified expansion() | ~203 |
|
||||
| 10:48 | scope: controller populates redirect addr (Req 8) | requirements.md, brief.md | redirect now carries primary host/port; client prefers it, rotate fallback | ~2k |
|
||||
| 03:48 | Session end: 15 writes across 4 files (brief.md, tasks.md, spec.json, requirements.md) | 17 reads | ~18467 tok |
|
||||
| 03:52 | Edited .kiro/specs/libxce-failover/requirements.md | 6→9 lines | ~213 |
|
||||
| 03:52 | Edited .kiro/steering/roadmap.md | 4→5 lines | ~374 |
|
||||
| 03:52 | Edited .kiro/steering/roadmap.md | 3→4 lines | ~337 |
|
||||
| 10:52 | roadmap: record libxce-failover (in-flight) + component-failover-adoption (backlog) | .kiro/steering/roadmap.md | both specs recorded; adoption=scheduler/worker/apiserver, xce_test stays in libxce-failover | ~1k |
|
||||
| 03:53 | Session end: 18 writes across 5 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 17 reads | ~19704 tok |
|
||||
| 05:44 | Created .kiro/specs/libxce-failover/research.md | — | ~1437 |
|
||||
| 05:46 | Created .kiro/specs/libxce-failover/design.md | — | ~5167 |
|
||||
| 05:46 | Edited .kiro/specs/libxce-failover/design.md | 3→3 lines | ~31 |
|
||||
| 05:47 | Edited .kiro/specs/libxce-failover/design.md | 6→6 lines | ~80 |
|
||||
| 05:47 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~23 |
|
||||
| 05:47 | Created .kiro/specs/libxce-failover/spec.json | — | ~129 |
|
||||
| 12:47 | kiro-spec-design libxce-failover | design.md, research.md, spec.json | design generated; async-model chokepoint correction (ctx round trip, not xce_request) | ~5k |
|
||||
| 05:47 | Session end: 24 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 21 reads | ~27183 tok |
|
||||
| 06:02 | Edited .kiro/specs/libxce-failover/design.md | modified enum() | ~375 |
|
||||
| 06:02 | Edited .kiro/specs/libxce-failover/design.md | modified struct() | ~245 |
|
||||
| 06:02 | Edited .kiro/specs/libxce-failover/design.md | modified reset() | ~377 |
|
||||
| 06:02 | Edited .kiro/specs/libxce-failover/design.md | 4→8 lines | ~183 |
|
||||
| 06:02 | Edited .kiro/specs/libxce-failover/design.md | modified model() | ~324 |
|
||||
| 06:03 | Edited .kiro/specs/libxce-failover/design.md | 2→4 lines | ~92 |
|
||||
| 06:03 | Edited .kiro/specs/libxce-failover/design.md | modified correlation() | ~180 |
|
||||
| 06:03 | Edited .kiro/specs/libxce-failover/research.md | modified D7() | ~385 |
|
||||
| 13:04 | validate-design: applied CI1/CI2/CI3 fixes | design.md, research.md | reply-seq correlation, ctx state reset, dup-job-on-retry=success | ~3k |
|
||||
| 06:04 | Session end: 32 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 21 reads | ~29498 tok |
|
||||
| 06:09 | Edited .kiro/specs/libxce-failover/design.md | 6→10 lines | ~252 |
|
||||
| 06:15 | Edited .kiro/specs/libxce-failover/design.md | expanded (+6 lines) | ~728 |
|
||||
| 06:15 | Edited .kiro/specs/libxce-failover/design.md | 31→33 lines | ~653 |
|
||||
| 06:16 | Edited .kiro/specs/libxce-failover/design.md | 18→18 lines | ~418 |
|
||||
| 06:17 | Edited .kiro/specs/libxce-failover/design.md | modified struct() | ~1320 |
|
||||
| 06:17 | Edited .kiro/specs/libxce-failover/design.md | modified struct() | ~626 |
|
||||
| 06:18 | Edited .kiro/specs/libxce-failover/design.md | trip() → loop() | ~114 |
|
||||
| 06:18 | Edited .kiro/specs/libxce-failover/design.md | 3→3 lines | ~75 |
|
||||
| 06:18 | Edited .kiro/specs/libxce-failover/design.md | "xce_ctx_call" → "xcecli_retry_next" | ~27 |
|
||||
| 06:18 | Edited .kiro/specs/libxce-failover/research.md | modified D1() | ~256 |
|
||||
| 06:19 | Edited .kiro/specs/libxce-failover/research.md | loop() → reconnect() | ~202 |
|
||||
| 13:19 | design pivot to client.c layer (user) | design.md, research.md | xce_* fail-fast unchanged; xcecli_* do/while + xcecli_retry_next; xceapi untouched | ~4k |
|
||||
| 06:20 | Session end: 43 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 23 reads | ~42700 tok |
|
||||
| 06:36 | Edited .kiro/specs/libxce-failover/design.md | expanded (+8 lines) | ~422 |
|
||||
| 06:36 | Edited .kiro/specs/libxce-failover/design.md | 1→3 lines | ~74 |
|
||||
| 06:36 | Edited .kiro/specs/libxce-failover/design.md | expanded (+11 lines) | ~328 |
|
||||
| 06:36 | Edited .kiro/specs/libxce-failover/design.md | 14→19 lines | ~231 |
|
||||
| 06:37 | Edited .kiro/specs/libxce-failover/design.md | 13→16 lines | ~418 |
|
||||
| 06:38 | Edited .kiro/specs/libxce-failover/design.md | modified int() | ~737 |
|
||||
| 06:38 | Edited .kiro/specs/libxce-failover/design.md | modified struct() | ~137 |
|
||||
| 06:38 | Edited .kiro/specs/libxce-failover/design.md | modified Concurrency() | ~189 |
|
||||
| 06:39 | Edited .kiro/specs/libxce-failover/design.md | 3→6 lines | ~151 |
|
||||
| 06:39 | Edited .kiro/specs/libxce-failover/research.md | modified D10() | ~338 |
|
||||
| 06:39 | Edited .kiro/specs/libxce-failover/requirements.md | expanded (+6 lines) | ~208 |
|
||||
| 13:40 | validate-design pass2: rejoin hook + op categories + per-ctx lock | design.md, research.md, requirements.md | CI1/CI2 + stateful-daemon rejoin hook folded in | ~4k |
|
||||
| 06:48 | Edited .kiro/specs/libxce-failover/design.md | modified optimization() | ~397 |
|
||||
| 06:48 | Edited .kiro/steering/roadmap.md | modified Decision() | ~279 |
|
||||
| 13:49 | decision: accept full-state rejoin on failover | design.md (Perf section), roadmap.md | YAGNI defer of lightweight re-attach; backlog item recorded | ~2k |
|
||||
| 06:49 | Session end: 56 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 23 reads | ~48437 tok |
|
||||
| 06:58 | Created .kiro/specs/libxce-failover/tasks.md | — | ~2292 |
|
||||
| 06:59 | Created .kiro/specs/libxce-failover/spec.json | — | ~128 |
|
||||
| 13:59 | kiro-spec-tasks libxce-failover | tasks.md, spec.json | 6 majors/12 subs; sanity-review NEEDS_FIXES applied (ReplyWaitWake owner, CI2/CI1 split, 8.3/8.4 unit cov) | ~3k |
|
||||
| 06:59 | Session end: 58 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 24 reads | ~54351 tok |
|
||||
| 16:36 | Edited .kiro/specs/libxce-failover/requirements.md | 8→8 lines | ~205 |
|
||||
| 16:36 | Edited .kiro/specs/libxce-failover/requirements.md | 4→5 lines | ~121 |
|
||||
| 16:36 | Edited .kiro/specs/libxce-failover/requirements.md | 4→3 lines | ~78 |
|
||||
| 16:36 | Edited .kiro/specs/libxce-failover/requirements.md | 15→15 lines | ~273 |
|
||||
| 16:37 | Edited .kiro/specs/libxce-failover/design.md | modified enum() | ~232 |
|
||||
| 16:37 | Edited .kiro/specs/libxce-failover/design.md | 11→12 lines | ~178 |
|
||||
| 16:37 | Edited .kiro/specs/libxce-failover/design.md | 8→7 lines | ~155 |
|
||||
| 16:37 | Edited .kiro/specs/libxce-failover/design.md | 7→9 lines | ~161 |
|
||||
| 16:38 | Edited .kiro/specs/libxce-failover/design.md | modified avoidance() | ~115 |
|
||||
| 16:38 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~26 |
|
||||
| 16:38 | Edited .kiro/specs/libxce-failover/design.md | 13→9 lines | ~95 |
|
||||
| 16:38 | Edited .kiro/specs/libxce-failover/design.md | 11→9 lines | ~100 |
|
||||
| 16:38 | Edited .kiro/specs/libxce-failover/design.md | 3→3 lines | ~81 |
|
||||
| 16:39 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~26 |
|
||||
| 16:39 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~28 |
|
||||
| 16:39 | Edited .kiro/specs/libxce-failover/design.md | 3→3 lines | ~75 |
|
||||
| 16:39 | Edited .kiro/specs/libxce-failover/tasks.md | inline fix | ~32 |
|
||||
| 16:39 | Edited .kiro/specs/libxce-failover/tasks.md | inline fix | ~54 |
|
||||
| 16:40 | Edited .kiro/specs/libxce-failover/tasks.md | 3→3 lines | ~128 |
|
||||
| 16:40 | Edited .kiro/specs/libxce-failover/tasks.md | 4→4 lines | ~177 |
|
||||
| 16:40 | Edited .kiro/specs/libxce-failover/tasks.md | inline fix | ~69 |
|
||||
| 16:40 | Edited .kiro/specs/libxce-failover/tasks.md | inline fix | ~38 |
|
||||
| 16:40 | Edited .kiro/specs/libxce-failover/research.md | modified D13() | ~286 |
|
||||
| 23:40 | simplify: redirect=hint (drop reply_seq + 5→4 classifier) | requirements/design/tasks/research.md | controller still emits addr (forward-compat); client rotates, hint-first; rejoin hook + lock kept | ~4k |
|
||||
| 16:41 | Session end: 81 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 24 reads | ~57309 tok |
|
||||
| 16:48 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~15 |
|
||||
| 16:48 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~34 |
|
||||
| 16:48 | Edited .kiro/specs/libxce-failover/design.md | modified avoidance() | ~57 |
|
||||
| 23:48 | task sanity check pass | design.md | fixed 3 stale seq-correlation residues; task graph PASS | ~1k |
|
||||
| 16:49 | Session end: 84 writes across 7 files (brief.md, tasks.md, spec.json, requirements.md, roadmap.md) | 25 reads | ~59649 tok |
|
||||
| 16:51 | Edited .kiro/specs/libxce-failover/spec.json | 4→4 lines | ~20 |
|
||||
| 16:55 | Created src/lib/client_internal.h | — | ~482 |
|
||||
| 16:55 | Edited src/lib/client.c | reduced (-12 lines) | ~54 |
|
||||
| 16:55 | Edited src/lib/client.c | added 1 condition(s) | ~205 |
|
||||
| 16:55 | Edited src/lib/client.c | 5→6 lines | ~32 |
|
||||
| 16:55 | Edited src/include/xcectx.h | 4→7 lines | ~41 |
|
||||
| 16:55 | Edited src/include/xcectx.h | expanded (+7 lines) | ~124 |
|
||||
| 16:56 | Edited src/lib/request.c | removed 106 lines | ~155 |
|
||||
| 16:56 | Edited src/include/request.h | modified struct() | ~173 |
|
||||
| 16:57 | Created src/lib/testsuite/test_libxce_retry.c | — | ~378 |
|
||||
| 16:58 | Edited src/lib/testsuite/test_libxce_retry.c | TEST_ASSERT_EQUAL_DOUBLE() → TEST_ASSERT_TRUE() | ~55 |
|
||||
| 17:00 | Edited src/lib/client_internal.h | modified struct() | ~181 |
|
||||
| 17:00 | Edited src/include/xcectx.h | 6→6 lines | ~95 |
|
||||
| 17:04 | Edited .kiro/specs/libxce-failover/tasks.md | inline fix | ~18 |
|
||||
| 17:04 | Edited .kiro/specs/libxce-failover/design.md | inline fix | ~6 |
|
||||
| 19:26 | Created src/lib/testsuite/failover_harness.h | — | ~1393 |
|
||||
| 19:27 | Created src/lib/testsuite/test_libxce_retry.c | — | ~3468 |
|
||||
| 02:28 | task 1.2: built libxce-failover test harness (cursor/taxonomy/threads) + 7 GREEN self-tests | test_libxce_retry.c, failover_harness.h | Ok:1 Fail:0 | ~9k |
|
||||
| 19:32 | Edited .kiro/specs/libxce-failover/tasks.md | inline fix | ~17 |
|
||||
|
|
|
|||
107
src/lib/testsuite/failover_harness.h
Normal file
107
src/lib/testsuite/failover_harness.h
Normal file
|
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* failover_harness.h — reusable, test-only fixtures for the libxce-failover
|
||||
* spec (test_libxce_retry.c and the later component tasks 2.1/2.2/2.3/3.1/3.2,
|
||||
* plus the concurrency tasks 5.1/6.1).
|
||||
*
|
||||
* This header is HARNESS ONLY. It references NO not-yet-existing failover
|
||||
* production symbols (e.g. xce_failover_classify, xcecli_retry_next,
|
||||
* xce_failover_rotate) — those arrive in later tasks. Everything here compiles
|
||||
* and links against the current libxce surface so the lib test suite stays
|
||||
* GREEN between this task (1.2) and the component tasks.
|
||||
*
|
||||
* What it provides:
|
||||
* 1. A fake multi-master client config (3 masters) + a master-list cursor
|
||||
* that the rotation logic will later consume (advance/wrap).
|
||||
* 2. A controller-status taxonomy table mapping every status the failover
|
||||
* classifier must handle (REDIRECT with/without hint, NOMASTER, NOT_READY,
|
||||
* STANDBY, DUP_JOB/EEXIST) and the transport errors (ECONNREFUSED,
|
||||
* ETIMEDOUT, ECONNRESET) to a stable description + expected failover
|
||||
* action category — so later tasks can table-drive the classifier RED/GREEN.
|
||||
* 3. A generic N-pthread concurrency harness so 5.1/6.1 can spawn N threads
|
||||
* against a shared ctx without re-rolling pthread plumbing.
|
||||
*
|
||||
* Requirements laid down for: 2.5, 4.1-4.5, 5.2, 8.3, 8.4 (taxonomy table);
|
||||
* 2.1, 2.4, 8.4 (master cursor); 6.3 / concurrency reuse (thread harness).
|
||||
*/
|
||||
#ifndef XCE_FAILOVER_HARNESS_H
|
||||
#define XCE_FAILOVER_HARNESS_H
|
||||
|
||||
#define _GNU_SOURCE
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <stdbool.h>
|
||||
#include <stddef.h>
|
||||
|
||||
#include "xce/cluster.h" /* xce_cluster_config_t, xce_candidate_t, MAX_HA_CANDIDATES */
|
||||
#include "xce/errnox.h" /* E_XCE_REDIRECT / NOMASTER / NOT_READY / STANDBY / DUP_JOB */
|
||||
|
||||
/* ── 1. Fake multi-master config + cursor ─────────────────────────────── */
|
||||
|
||||
/* Number of fake masters the rotation fixtures stand up. Kept <= MAX_HA_CANDIDATES. */
|
||||
#define FO_FAKE_MASTERS 3
|
||||
|
||||
/* A master-list cursor: mirrors the "advance to next master / wrap" behaviour
|
||||
* the real EndpointRotator (task 2.2) will drive over api_ctx->conf. Pure value
|
||||
* type — no I/O, no production dependency. */
|
||||
typedef struct {
|
||||
const xce_cluster_config_t *cfg;
|
||||
int cur; /* index into cfg->candidates[] */
|
||||
} fo_master_cursor_t;
|
||||
|
||||
/* Populate `cfg` with FO_FAKE_MASTERS distinct host:port candidates. Returns the
|
||||
* candidate count written. */
|
||||
int fo_make_fake_masters(xce_cluster_config_t *cfg);
|
||||
|
||||
/* Initialise a cursor at master 0. */
|
||||
void fo_cursor_init(fo_master_cursor_t *cur, const xce_cluster_config_t *cfg);
|
||||
|
||||
/* Advance the cursor to the next master, wrapping at the end. Returns the new
|
||||
* index. */
|
||||
int fo_cursor_advance(fo_master_cursor_t *cur);
|
||||
|
||||
/* The candidate the cursor currently points at (NULL if cfg empty). */
|
||||
const xce_candidate_t *fo_cursor_current(const fo_master_cursor_t *cur);
|
||||
|
||||
/* ── 2. Controller-status taxonomy table ──────────────────────────────── */
|
||||
|
||||
/* Expected failover action for each status — mirrors design.md StatusClassifier
|
||||
* (XCE_FO_SUCCESS / RETRY_NOW / RETRY_BACKOFF / TERMINAL). This is the HARNESS'
|
||||
* expectation table; the real xce_fo_action_t enum is introduced by task 2.1,
|
||||
* and its tests will assert the real classifier matches these expectations. */
|
||||
typedef enum {
|
||||
FO_ACT_SUCCESS = 0, /* status 0, or idempotent DUP replay on a re-sent write */
|
||||
FO_ACT_RETRY_NOW, /* REDIRECT / STANDBY / transport error — rotate, no backoff */
|
||||
FO_ACT_RETRY_BACKOFF,/* NOMASTER / NOT_READY — rotate after jittered backoff */
|
||||
FO_ACT_TERMINAL /* non-retriable — surface to caller */
|
||||
} fo_expected_action_t;
|
||||
|
||||
typedef struct {
|
||||
const char *name; /* human label, e.g. "E_XCE_REDIRECT+hint" */
|
||||
int status; /* status/rc as the classifier sees it */
|
||||
bool has_hint; /* redirect carried an address hint? */
|
||||
bool is_transport;/* negative -errno transport error? */
|
||||
fo_expected_action_t expect; /* expected first-send classification */
|
||||
const char *desc; /* one-line description */
|
||||
} fo_status_row_t;
|
||||
|
||||
/* The complete taxonomy table and its length. Defined in test_libxce_retry.c.
|
||||
* Covers: REDIRECT (with + without hint), NOMASTER, NOT_READY, STANDBY,
|
||||
* DUP_JOB, -EEXIST, and the three transport errors. */
|
||||
extern const fo_status_row_t FO_STATUS_TABLE[];
|
||||
extern const size_t FO_STATUS_TABLE_LEN;
|
||||
|
||||
/* Look up a row by its `status` field (first match), or NULL. */
|
||||
const fo_status_row_t *fo_status_lookup(int status);
|
||||
|
||||
/* ── 3. Generic N-thread concurrency harness ──────────────────────────── */
|
||||
|
||||
/* A worker fn run on each spawned thread. `ctx` is a shared context the caller
|
||||
* owns; `idx` is the thread's 0-based index. */
|
||||
typedef void (*fo_thread_fn)(void *ctx, int idx);
|
||||
|
||||
/* Spawn `n` pthreads, each invoking `fn(ctx, idx)`, and join them all. Returns 0
|
||||
* if every thread was created and joined, -errno on the first failure. Generic
|
||||
* so 5.1 (shared-ctx safety) and 6.1 (50-client jitter) reuse it unchanged. */
|
||||
int fo_run_threads(int n, fo_thread_fn fn, void *ctx);
|
||||
|
||||
#endif /* XCE_FAILOVER_HARNESS_H */
|
||||
|
|
@ -1,23 +1,195 @@
|
|||
/*
|
||||
* test_libxce_retry.c — placeholder for the libxce failover retry tests.
|
||||
* test_libxce_retry.c — reusable libxce-failover test harness + harness
|
||||
* self-tests (spec libxce-failover, task 1.2 ADAPTED).
|
||||
*
|
||||
* The orphaned xce_request_with_retry() primitive and its xce_retry_send_hook
|
||||
* test seam were removed (superseded by the xcecli_* failover loop). Task 1.2
|
||||
* rewrites this suite against the new failover model (StatusClassifier, master
|
||||
* rotation, redirect-hint, budget → cluster-not-ready).
|
||||
* This file builds the GREEN, reusable harness that the later component tasks
|
||||
* consume to write their own RED→GREEN tests:
|
||||
* - task 2.1 (StatusClassifier) → drives FO_STATUS_TABLE
|
||||
* - task 2.2 (EndpointRotator) → drives the fake-master cursor
|
||||
* - task 2.3 (reply-capture) → drives the redirect-hint rows
|
||||
* - task 3.1/3.2 (decision helper) → drives the table + cursor
|
||||
* - task 5.1/6.1 (concurrency) → drive fo_run_threads()
|
||||
*
|
||||
* For now this is a minimal compiling placeholder that asserts the retained
|
||||
* retry-tunables scaffolding (xce_retry_config_t + XCE_RETRY_DEFAULTS) is
|
||||
* reachable, keeping the lib test suite GREEN between tasks 1.1 and 1.2.
|
||||
* It deliberately references NO not-yet-existing failover production symbols
|
||||
* (xce_failover_classify / xcecli_retry_next / xce_failover_rotate); those are
|
||||
* added by the component tasks. The lib build+test MUST stay GREEN after this
|
||||
* task, so every fixture here is exercised by at least one real assertion.
|
||||
*
|
||||
* Requirements: 6.1, 6.2
|
||||
* Requirements covered by the harness: 2.5, 4.1, 4.2, 4.3, 4.4, 4.5, 5.2, 8.3,
|
||||
* 8.4 (status taxonomy); 2.1, 2.4 (master cursor); 6.3 (concurrency reuse).
|
||||
* The retained retry-defaults test still covers 6.1, 6.2.
|
||||
*/
|
||||
#define _GNU_SOURCE
|
||||
#include <errno.h>
|
||||
#include <pthread.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include <unity/unity.h>
|
||||
|
||||
#include "failover_harness.h"
|
||||
#include "request.h"
|
||||
|
||||
/* ════════════════════════════════════════════════════════════════════════
|
||||
* Harness implementation
|
||||
* ════════════════════════════════════════════════════════════════════════ */
|
||||
|
||||
/* ── 1. Fake multi-master config + cursor ─────────────────────────────── */
|
||||
|
||||
int fo_make_fake_masters(xce_cluster_config_t *cfg)
|
||||
{
|
||||
static const struct {
|
||||
const char *host;
|
||||
int port;
|
||||
} masters[FO_FAKE_MASTERS] = {
|
||||
{ "10.20.0.1", 7001 },
|
||||
{ "10.20.0.2", 7002 },
|
||||
{ "10.20.0.3", 7003 },
|
||||
};
|
||||
|
||||
memset(cfg, 0, sizeof(*cfg));
|
||||
for (int i = 0; i < FO_FAKE_MASTERS && i < MAX_HA_CANDIDATES; i++) {
|
||||
strncpy(cfg->candidates[i].hostname, masters[i].host,
|
||||
XCE_MAXHOSTNAME_LEN - 1);
|
||||
cfg->candidates[i].hostname[XCE_MAXHOSTNAME_LEN - 1] = '\0';
|
||||
cfg->candidates[i].port = masters[i].port;
|
||||
}
|
||||
cfg->candidates_count =
|
||||
(FO_FAKE_MASTERS < MAX_HA_CANDIDATES) ? FO_FAKE_MASTERS
|
||||
: MAX_HA_CANDIDATES;
|
||||
return cfg->candidates_count;
|
||||
}
|
||||
|
||||
void fo_cursor_init(fo_master_cursor_t *cur, const xce_cluster_config_t *cfg)
|
||||
{
|
||||
cur->cfg = cfg;
|
||||
cur->cur = 0;
|
||||
}
|
||||
|
||||
int fo_cursor_advance(fo_master_cursor_t *cur)
|
||||
{
|
||||
if (!cur->cfg || cur->cfg->candidates_count <= 0)
|
||||
return 0;
|
||||
cur->cur = (cur->cur + 1) % cur->cfg->candidates_count;
|
||||
return cur->cur;
|
||||
}
|
||||
|
||||
const xce_candidate_t *fo_cursor_current(const fo_master_cursor_t *cur)
|
||||
{
|
||||
if (!cur->cfg || cur->cfg->candidates_count <= 0)
|
||||
return NULL;
|
||||
return &cur->cfg->candidates[cur->cur];
|
||||
}
|
||||
|
||||
/* ── 2. Controller-status taxonomy table ──────────────────────────────── */
|
||||
|
||||
const fo_status_row_t FO_STATUS_TABLE[] = {
|
||||
/* success */
|
||||
{ "OK", 0, false, false, FO_ACT_SUCCESS,
|
||||
"request served by primary" },
|
||||
|
||||
/* redirect (a primary exists elsewhere) — rotate now, hint first if any */
|
||||
{ "E_XCE_REDIRECT+hint", E_XCE_REDIRECT, true, false, FO_ACT_RETRY_NOW,
|
||||
"standby redirects with primary address hint (8.3)" },
|
||||
{ "E_XCE_REDIRECT", E_XCE_REDIRECT, false, false, FO_ACT_RETRY_NOW,
|
||||
"standby redirects without address — rotate master list (8.4)" },
|
||||
|
||||
/* standby (op is primary-only) — treat as redirect, rotate now (4.3) */
|
||||
{ "E_XCE_STANDBY", E_XCE_STANDBY, false, false, FO_ACT_RETRY_NOW,
|
||||
"controller in standby; op is primary-only (4.3)" },
|
||||
|
||||
/* no-primary / not-ready — rotate after backoff (4.1) */
|
||||
{ "E_XCE_NOMASTER", E_XCE_NOMASTER, false, false, FO_ACT_RETRY_BACKOFF,
|
||||
"standby knows no primary yet — backoff + rotate (4.1)" },
|
||||
{ "E_XCE_NOT_READY", E_XCE_NOT_READY, false, false, FO_ACT_RETRY_BACKOFF,
|
||||
"controller initializing/electing — backoff + rotate (4.1)" },
|
||||
|
||||
/* idempotent-replay duplicate (write replay) — DUP/EEXIST (5.2) */
|
||||
{ "E_XCE_DUP_JOB", E_XCE_DUP_JOB, false, false, FO_ACT_TERMINAL,
|
||||
"duplicate job; SUCCESS only on a re-sent write (5.2, attempt-aware)" },
|
||||
{ "-EEXIST", -EEXIST, false, true, FO_ACT_TERMINAL,
|
||||
"duplicate via -EEXIST; SUCCESS only on a re-sent write (5.2)" },
|
||||
|
||||
/* transport errors — reconnect/rotate now (4.4) */
|
||||
{ "-ECONNREFUSED", -ECONNREFUSED, false, true, FO_ACT_RETRY_NOW,
|
||||
"connection refused — reconnect/rotate (4.4)" },
|
||||
{ "-ETIMEDOUT", -ETIMEDOUT, false, true, FO_ACT_RETRY_NOW,
|
||||
"connection timeout — reconnect/rotate (4.4)" },
|
||||
{ "-ECONNRESET", -ECONNRESET, false, true, FO_ACT_RETRY_NOW,
|
||||
"peer reset — reconnect/rotate (4.4)" },
|
||||
|
||||
/* terminal / non-retriable — surface immediately (4.5) */
|
||||
{ "-EINVAL", -EINVAL, false, true, FO_ACT_TERMINAL,
|
||||
"invalid request — surface, no retry (4.5)" },
|
||||
};
|
||||
|
||||
const size_t FO_STATUS_TABLE_LEN =
|
||||
sizeof(FO_STATUS_TABLE) / sizeof(FO_STATUS_TABLE[0]);
|
||||
|
||||
const fo_status_row_t *fo_status_lookup(int status)
|
||||
{
|
||||
for (size_t i = 0; i < FO_STATUS_TABLE_LEN; i++) {
|
||||
if (FO_STATUS_TABLE[i].status == status)
|
||||
return &FO_STATUS_TABLE[i];
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* ── 3. Generic N-thread concurrency harness ──────────────────────────── */
|
||||
|
||||
typedef struct {
|
||||
fo_thread_fn fn;
|
||||
void *ctx;
|
||||
int idx;
|
||||
} fo_thread_arg_t;
|
||||
|
||||
static void *fo_thread_trampoline(void *p)
|
||||
{
|
||||
fo_thread_arg_t *a = (fo_thread_arg_t *)p;
|
||||
a->fn(a->ctx, a->idx);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int fo_run_threads(int n, fo_thread_fn fn, void *ctx)
|
||||
{
|
||||
if (n <= 0 || !fn)
|
||||
return -EINVAL;
|
||||
|
||||
pthread_t *tids = calloc((size_t)n, sizeof(*tids));
|
||||
fo_thread_arg_t *args = calloc((size_t)n, sizeof(*args));
|
||||
if (!tids || !args) {
|
||||
free(tids);
|
||||
free(args);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
int spawned = 0;
|
||||
int rc = 0;
|
||||
for (int i = 0; i < n; i++) {
|
||||
args[i].fn = fn;
|
||||
args[i].ctx = ctx;
|
||||
args[i].idx = i;
|
||||
int e = pthread_create(&tids[i], NULL, fo_thread_trampoline, &args[i]);
|
||||
if (e != 0) {
|
||||
rc = -e;
|
||||
break;
|
||||
}
|
||||
spawned++;
|
||||
}
|
||||
|
||||
for (int i = 0; i < spawned; i++)
|
||||
pthread_join(tids[i], NULL);
|
||||
|
||||
free(tids);
|
||||
free(args);
|
||||
return rc;
|
||||
}
|
||||
|
||||
/* ════════════════════════════════════════════════════════════════════════
|
||||
* Harness self-tests (GREEN) — each fixture proven by real assertions
|
||||
* ════════════════════════════════════════════════════════════════════════ */
|
||||
|
||||
/* Req 6.1, 6.2: the retry-tunables struct + safe production defaults are
|
||||
* retained and reachable for the failover loop. */
|
||||
static void test_retry_defaults_are_reachable(void)
|
||||
|
|
@ -32,11 +204,157 @@ static void test_retry_defaults_are_reachable(void)
|
|||
printf("test_retry_defaults_are_reachable: PASS\n");
|
||||
}
|
||||
|
||||
/* ── Suite entry point ──────────────────────────────────────────── */
|
||||
/* Fixture 1: fake multi-master config holds 3 distinct candidates. */
|
||||
static void test_fake_masters_hold_three_candidates(void)
|
||||
{
|
||||
xce_cluster_config_t cfg;
|
||||
int n = fo_make_fake_masters(&cfg);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(FO_FAKE_MASTERS, n);
|
||||
TEST_ASSERT_EQUAL_INT(FO_FAKE_MASTERS, cfg.candidates_count);
|
||||
TEST_ASSERT_EQUAL_STRING("10.20.0.1", cfg.candidates[0].hostname);
|
||||
TEST_ASSERT_EQUAL_INT(7001, cfg.candidates[0].port);
|
||||
TEST_ASSERT_EQUAL_STRING("10.20.0.3", cfg.candidates[2].hostname);
|
||||
TEST_ASSERT_EQUAL_INT(7003, cfg.candidates[2].port);
|
||||
|
||||
printf("test_fake_masters_hold_three_candidates: PASS\n");
|
||||
}
|
||||
|
||||
/* Fixture 1: cursor advances through masters and wraps (2.1, 2.4, 8.4). */
|
||||
static void test_master_cursor_advances_and_wraps(void)
|
||||
{
|
||||
xce_cluster_config_t cfg;
|
||||
fo_make_fake_masters(&cfg);
|
||||
|
||||
fo_master_cursor_t cur;
|
||||
fo_cursor_init(&cur, &cfg);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, cur.cur);
|
||||
TEST_ASSERT_EQUAL_STRING("10.20.0.1", fo_cursor_current(&cur)->hostname);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(1, fo_cursor_advance(&cur));
|
||||
TEST_ASSERT_EQUAL_STRING("10.20.0.2", fo_cursor_current(&cur)->hostname);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(2, fo_cursor_advance(&cur));
|
||||
TEST_ASSERT_EQUAL_STRING("10.20.0.3", fo_cursor_current(&cur)->hostname);
|
||||
|
||||
/* wrap back to master 0 */
|
||||
TEST_ASSERT_EQUAL_INT(0, fo_cursor_advance(&cur));
|
||||
TEST_ASSERT_EQUAL_STRING("10.20.0.1", fo_cursor_current(&cur)->hostname);
|
||||
|
||||
printf("test_master_cursor_advances_and_wraps: PASS\n");
|
||||
}
|
||||
|
||||
/* Fixture 2: taxonomy table is complete — every status the classifier must
|
||||
* handle is present, lookups resolve, and the status codes equal the real
|
||||
* errnox.h values (2.5, 4.1-4.5, 5.2, 8.3, 8.4). */
|
||||
static void test_status_table_is_complete_and_resolves(void)
|
||||
{
|
||||
/* every mandated controller status + transport error is represented */
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(0));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(E_XCE_REDIRECT));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(E_XCE_STANDBY));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(E_XCE_NOMASTER));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(E_XCE_NOT_READY));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(E_XCE_DUP_JOB));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(-EEXIST));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(-ECONNREFUSED));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(-ETIMEDOUT));
|
||||
TEST_ASSERT_NOT_NULL(fo_status_lookup(-ECONNRESET));
|
||||
|
||||
/* status codes resolve to the real errnox.h values (ordered enum) */
|
||||
TEST_ASSERT_EQUAL_INT(XCE_ERRNO_BASE, E_XCE_BAD_JOB);
|
||||
TEST_ASSERT_TRUE(E_XCE_REDIRECT == E_XCE_NOMASTER + 1);
|
||||
TEST_ASSERT_TRUE(E_XCE_NOT_READY == E_XCE_REDIRECT + 1);
|
||||
TEST_ASSERT_TRUE(E_XCE_STANDBY == E_XCE_NOT_READY + 1);
|
||||
|
||||
/* expected actions line up with the design's StatusClassifier (first send) */
|
||||
TEST_ASSERT_EQUAL_INT(FO_ACT_SUCCESS, fo_status_lookup(0)->expect);
|
||||
TEST_ASSERT_EQUAL_INT(FO_ACT_RETRY_NOW,
|
||||
fo_status_lookup(E_XCE_REDIRECT)->expect);
|
||||
TEST_ASSERT_EQUAL_INT(FO_ACT_RETRY_NOW,
|
||||
fo_status_lookup(E_XCE_STANDBY)->expect);
|
||||
TEST_ASSERT_EQUAL_INT(FO_ACT_RETRY_BACKOFF,
|
||||
fo_status_lookup(E_XCE_NOMASTER)->expect);
|
||||
TEST_ASSERT_EQUAL_INT(FO_ACT_RETRY_BACKOFF,
|
||||
fo_status_lookup(E_XCE_NOT_READY)->expect);
|
||||
TEST_ASSERT_EQUAL_INT(FO_ACT_RETRY_NOW,
|
||||
fo_status_lookup(-ECONNRESET)->expect);
|
||||
|
||||
printf("test_status_table_is_complete_and_resolves: PASS\n");
|
||||
}
|
||||
|
||||
/* Fixture 2: the redirect-hint flag distinguishes hint vs. no-hint rows (8.3). */
|
||||
static void test_status_table_redirect_hint_flag(void)
|
||||
{
|
||||
bool saw_hint = false;
|
||||
bool saw_no_hint = false;
|
||||
for (size_t i = 0; i < FO_STATUS_TABLE_LEN; i++) {
|
||||
if (FO_STATUS_TABLE[i].status == E_XCE_REDIRECT) {
|
||||
if (FO_STATUS_TABLE[i].has_hint)
|
||||
saw_hint = true;
|
||||
else
|
||||
saw_no_hint = true;
|
||||
}
|
||||
}
|
||||
TEST_ASSERT_TRUE(saw_hint); /* REDIRECT+hint row present (8.3) */
|
||||
TEST_ASSERT_TRUE(saw_no_hint); /* REDIRECT no-hint row present (8.4) */
|
||||
|
||||
printf("test_status_table_redirect_hint_flag: PASS\n");
|
||||
}
|
||||
|
||||
/* Fixture 3: concurrency harness runs N threads to completion (6.3 reuse). */
|
||||
#define FO_TEST_NTHREADS 16
|
||||
|
||||
typedef struct {
|
||||
pthread_mutex_t lock;
|
||||
int counter;
|
||||
} fo_selftest_ctx_t;
|
||||
|
||||
static void fo_selftest_worker(void *ctx, int idx)
|
||||
{
|
||||
(void)idx;
|
||||
fo_selftest_ctx_t *c = (fo_selftest_ctx_t *)ctx;
|
||||
pthread_mutex_lock(&c->lock);
|
||||
c->counter++;
|
||||
pthread_mutex_unlock(&c->lock);
|
||||
}
|
||||
|
||||
static void test_thread_harness_runs_all_threads(void)
|
||||
{
|
||||
fo_selftest_ctx_t ctx;
|
||||
pthread_mutex_init(&ctx.lock, NULL);
|
||||
ctx.counter = 0;
|
||||
|
||||
int rc = fo_run_threads(FO_TEST_NTHREADS, fo_selftest_worker, &ctx);
|
||||
pthread_mutex_destroy(&ctx.lock);
|
||||
|
||||
TEST_ASSERT_EQUAL_INT(0, rc);
|
||||
TEST_ASSERT_EQUAL_INT(FO_TEST_NTHREADS, ctx.counter);
|
||||
|
||||
printf("test_thread_harness_runs_all_threads: PASS\n");
|
||||
}
|
||||
|
||||
/* Fixture 3: harness rejects bad arguments. */
|
||||
static void test_thread_harness_rejects_bad_args(void)
|
||||
{
|
||||
TEST_ASSERT_EQUAL_INT(-EINVAL, fo_run_threads(0, fo_selftest_worker, NULL));
|
||||
TEST_ASSERT_EQUAL_INT(-EINVAL, fo_run_threads(4, NULL, NULL));
|
||||
|
||||
printf("test_thread_harness_rejects_bad_args: PASS\n");
|
||||
}
|
||||
|
||||
/* ── Suite entry point ──────────────────────────────────────────────── */
|
||||
|
||||
void test_libxce_retry(void)
|
||||
{
|
||||
UNITY_BEGIN();
|
||||
RUN_TEST(test_retry_defaults_are_reachable);
|
||||
RUN_TEST(test_fake_masters_hold_three_candidates);
|
||||
RUN_TEST(test_master_cursor_advances_and_wraps);
|
||||
RUN_TEST(test_status_table_is_complete_and_resolves);
|
||||
RUN_TEST(test_status_table_redirect_hint_flag);
|
||||
RUN_TEST(test_thread_harness_runs_all_threads);
|
||||
RUN_TEST(test_thread_harness_rejects_bad_args);
|
||||
UNITY_END();
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue