feat(ha-commit-durability): gate standby ACK on fdatasync success + persist-before-ACK regression test (task 2.3)
This commit is contained in:
parent
c41edc515e
commit
e4c4968331
4 changed files with 155 additions and 3 deletions
|
|
@ -730,8 +730,27 @@ int persist_wal_write_replicated(persist_t* p, uint64_t lsn, uint32_t type,
|
|||
* persist_wal_async defers fsync to the background thread / persist_flush;
|
||||
* here we sync inline because the entry feeds the primary's commit
|
||||
* majority and must survive a standby restart. fdatasync is sufficient
|
||||
* (entry bytes + segment metadata are pre-allocated by open_new_segment). */
|
||||
fdatasync(p->wal_fd);
|
||||
* (entry bytes + segment metadata are pre-allocated by open_new_segment).
|
||||
*
|
||||
* Fail-loud rc-gate (ha-commit-durability Req 1.3, symmetric with the
|
||||
* append-path gate at task 2.1): the ACK is sent by the caller ONLY when
|
||||
* this returns success, and the ACK claims the entry is durable. So if
|
||||
* the fdatasync FAILS (EIO/ENOSPC, or the forced-fail test seam), we must
|
||||
* NOT return success — we log loudly and return -EIO so the caller's
|
||||
* existing error path (ha_apply_single_entry) does NOT apply or ACK. */
|
||||
int fsrc = fdatasync(p->wal_fd);
|
||||
#ifdef XCE_TESTING
|
||||
atomic_fetch_add_explicit(&p->test_replicated_fdatasync_count, 1,
|
||||
memory_order_relaxed);
|
||||
#endif
|
||||
if (fsrc != 0 || flusher_fsync_forced_fail(p)) {
|
||||
int e = (fsrc != 0) ? errno : EIO;
|
||||
ERROR("persist: persist_wal_write_replicated fdatasync FAILED for "
|
||||
"lsn=%" PRIu64 " (errno=%d %s) — entry NOT durable; returning "
|
||||
"error so the standby does NOT ACK", lsn, e, strerror(e));
|
||||
pthread_mutex_unlock(&p->lock);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* Rotate segment when full (same threshold as the primary append). */
|
||||
if (p->seg_offset >= WAL_SEGMENT_SIZE_BYTES) {
|
||||
|
|
@ -799,6 +818,14 @@ void persist_test_set_force_fsync_fail(persist_t* p, int fail)
|
|||
memory_order_release);
|
||||
}
|
||||
|
||||
unsigned persist_test_replicated_fdatasync_count(persist_t* p)
|
||||
{
|
||||
if (!p)
|
||||
return 0;
|
||||
return atomic_load_explicit(&p->test_replicated_fdatasync_count,
|
||||
memory_order_relaxed);
|
||||
}
|
||||
|
||||
/* ------------------------------------------------------------------ *
|
||||
* Durability-verification test seam (ha-commit-durability Req 3.2/3.3)*
|
||||
* *
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue