Avoid recursive standby retries on allocation failure

This commit is contained in:
evgeny committed 2026-10-26 18:27:27 +01:00
1 parent f92077e601
commit d532fe062e
2 files changed
+12 -8

No files matched your search

+8 -1
View File
@@ -944,13 +944,20 @@ static void db_sync_resume_peer_check(struct DB_SYNC* db) {
db->peer_check_timer = uasync_set_timeout(db->inst->ua, DB_SYNC_PEER_CHECK_INTERVAL * 10000ULL, db, db_sync_peer_check_cb, "history_retry");
if (!db->peer_check_timer) DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "history retry timer allocation");
}
#ifdef UTUN_HAVE_STANDBY
/* standby_wait может вызвать callback синхронно при отказе памяти: освобождаем handle и ставим таймер без рекурсии. */
static void db_sync_peer_check_wake(void* arg) {
struct DB_SYNC* db = arg; db->peer_check_wait = NULL;
db_sync_resume_peer_check(db);
}
#endif
static void db_sync_peer_check_cb(void* arg) {
struct DB_SYNC* db = arg; db->peer_check_timer = NULL; int pending = 0;
if (!db->enabled) return;
#ifdef UTUN_HAVE_STANDBY
db->peer_check_wait = NULL;
if (standby_get_sleep_tb() > 0) {
db->peer_check_wait = standby_wait(db, db_sync_peer_check_cb);
db->peer_check_wait = standby_wait(db, db_sync_peer_check_wake);
if (!db->peer_check_wait) {
DEBUG_ERROR(DEBUG_CATEGORY_CHAT_SYNC, "history standby wait allocation; retry later");
db_sync_resume_peer_check(db);
+4 -7
View File
@@ -1,4 +1,4 @@
// test_db_sync.c — sync protocol test: peer_empty, hash_MATCH, divergence merge
// test_db_sync.c — реальный MESSAGES/PUSH: пустой пир, новые записи, расхождение и слияние истории.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
@@ -35,7 +35,7 @@
#include "../lib/debug_config.h"
#include "../lib/mem.h"
#define TEST_TIMEOUT_TB 300000 // 12s
#define TEST_TIMEOUT_TB 300000 // 30s
#define PHASE_TIMEOUT_TB 100000 // 10s per phase
#define POLL_INTERVAL_MS 1
@@ -278,8 +278,7 @@ int main(void) {
if (!wait_for("links up", cond_links_init, PHASE_TIMEOUT_TB)) { test_phase = 2; goto done; }
// ===================================================================
// Phase 1: peer_empty. add_quiet (no auto-sync) → insert A=5,
// reinitiate → INIT_SYNC(5) → B INIT_RESP(ch8=0,sc=0) → A sends all 5.
// Phase 1: пустой пир получает пять проверенных записей через общий Merkle.
// ===================================================================
printf("Phase 1: peer_empty\n");
reset_done_flags();
@@ -295,9 +294,7 @@ int main(void) {
printf(" PASS\n");
// ===================================================================
// Phase 2: hash_MATCH tail-send. Insert 3 more on A (PUSH disabled —
// si_a from phase 1 has sync_state=2? No, reinitiate set it to 1, then
// SYNC_DONE set it to 2. Disable PUSH, insert, reinitiate.
// Phase 2: приостанавливаем обмен, добавляем три записи и возобновляем обе стороны.
// ===================================================================
printf("Phase 2: hash_MATCH tail-send\n");
reset_done_flags();