fix(ha-repl-hardening): heartbeat re-arm broken by delaymgr ms-task ordering
Root cause: task_cmp in delay.c compared nextrun (always 0 for ms-tasks) instead of nextrun_ts, making all ms-tasks appear equal in the ordered queue. The heartbeat task was re-enqueued correctly but stuck behind the liveness poll task in the broken ordering. Changes: - delay.c: fix task_cmp to compare nextrun_ts for ms-tasks (ns precision) - ha.c: use runcount=-1 (infinite repeat) instead of one-shot+re-arm; simpler and avoids the broken re-arm path entirely - ha.c: add static atomic idempotency guard to prevent duplicate heartbeat tasks on re-election
This commit is contained in:
parent
f236d320a2
commit
e1517bbf28
2 changed files with 34 additions and 17 deletions
|
|
@ -99,17 +99,25 @@ static int task_cmp(void* ctx, void* arg1, void* arg2)
|
|||
(void)ctx;
|
||||
delay_task_t* t1 = (delay_task_t*)arg1;
|
||||
delay_task_t* t2 = (delay_task_t*)arg2;
|
||||
time_t k1 = t1->nextrun;
|
||||
time_t k2 = t2->nextrun;
|
||||
|
||||
if (k1 > k2) {
|
||||
return 1;
|
||||
}
|
||||
/* ms-tasks: compare by nextrun_ts (nanosecond-precision deadline).
|
||||
* Both delay_task_ms and ordq_put use nextrun==0 as the ms-task marker. */
|
||||
int t1_is_ms = (t1->nextrun_ts.tv_nsec != 0 || t1->nextrun_ts.tv_sec != 0);
|
||||
int t2_is_ms = (t2->nextrun_ts.tv_nsec != 0 || t2->nextrun_ts.tv_sec != 0);
|
||||
|
||||
if (k1 == k2) {
|
||||
if (t1_is_ms && t2_is_ms) {
|
||||
if (t1->nextrun_ts.tv_sec > t2->nextrun_ts.tv_sec) return 1;
|
||||
if (t1->nextrun_ts.tv_sec < t2->nextrun_ts.tv_sec) return -1;
|
||||
if (t1->nextrun_ts.tv_nsec > t2->nextrun_ts.tv_nsec) return 1;
|
||||
if (t1->nextrun_ts.tv_nsec < t2->nextrun_ts.tv_nsec) return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Mixed or seconds-based: fall back to nextrun comparison. */
|
||||
time_t k1 = t1->nextrun;
|
||||
time_t k2 = t2->nextrun;
|
||||
if (k1 > k2) return 1;
|
||||
if (k1 == k2) return 0;
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue