Summary
GraphBatch temporarily relaxes the WAL flush policy for bulk speed (documented, sensible) — but on close() it restores the engine default rather than the value the user configured. After any GraphBatch bulk load, every subsequent transaction on that database silently stops honoring arcadedb.txWalFlush=2 (fsync-per-commit): the durability contract is downgraded with no error, log line, or signal.
Reproduction (embedded, 26.8.1.dev2 line; measured on idle i9-12900HK, NVMe)
// JVM started with -Darcadedb.txWalFlush=2 (YES_FULL)
// 1) per-commit inserts BEFORE any GraphBatch:
// ~79 tx/s <- fsync honored (disk floor)
// 2) run any GraphBatch bulk load (500 vertices is enough), close it
// 3) same per-commit inserts AFTER:
// ~4,120 tx/s <- fsync silently gone
Python-bindings script that shows exactly this (same engine calls) available on request; the effect reproduces deterministically. The pre/post asymmetry isolates it to GraphBatch's save/restore of WAL settings ("Saved state for restore after close" block): it appears to restore a captured-too-late or default value instead of the configured one.
Why it matters
Any application that (a) sets full durability and (b) ever bulk-loads via GraphBatch runs the rest of its life at relaxed durability without knowing. We found it while building a matched-durability benchmark ablation: graph cells (bulk-loaded via GraphBatch) refused to show fsync-bound throughput while document cells (plain INSERT ingest) behaved correctly — the discrepancy only made sense once the post-GraphBatch downgrade was isolated.
Suggested fix
Capture the configured value (GlobalConfiguration or database-level override) before relaxing, and restore exactly that on close(), including on exceptional exit; a log line on relax/restore would also make the temporary window visible.
Summary
GraphBatchtemporarily relaxes the WAL flush policy for bulk speed (documented, sensible) — but onclose()it restores the engine default rather than the value the user configured. After any GraphBatch bulk load, every subsequent transaction on that database silently stops honoringarcadedb.txWalFlush=2(fsync-per-commit): the durability contract is downgraded with no error, log line, or signal.Reproduction (embedded, 26.8.1.dev2 line; measured on idle i9-12900HK, NVMe)
Python-bindings script that shows exactly this (same engine calls) available on request; the effect reproduces deterministically. The pre/post asymmetry isolates it to GraphBatch's save/restore of WAL settings ("Saved state for restore after close" block): it appears to restore a captured-too-late or default value instead of the configured one.
Why it matters
Any application that (a) sets full durability and (b) ever bulk-loads via GraphBatch runs the rest of its life at relaxed durability without knowing. We found it while building a matched-durability benchmark ablation: graph cells (bulk-loaded via GraphBatch) refused to show fsync-bound throughput while document cells (plain INSERT ingest) behaved correctly — the discrepancy only made sense once the post-GraphBatch downgrade was isolated.
Suggested fix
Capture the configured value (GlobalConfiguration or database-level override) before relaxing, and restore exactly that on close(), including on exceptional exit; a log line on relax/restore would also make the temporary window visible.