From ad567676465f22d76ef2a20731454ce584c572bb Mon Sep 17 00:00:00 2001 From: Evgeny Date: Fri, 24 Jul 2026 17:26:09 +0300 Subject: [PATCH] db_sync: notify all peers when cascade_from changes chain (lock-free sync) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit После cascade_from в db_handle_send_data оповещаем ВСЕХ пиров с synced_pos >= fix_from о том что цепочка изменилась — откатываем их synced_pos. Это устраняет неэффективность конкурентных sync: раньше только пир-отправитель обновлялся, остальные видели устаревшие хеши и обнаруживали ложное расхождение на следующем цикле. --- src/db_sync.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/db_sync.c b/src/db_sync.c index f261d1f3..52ebf521 100644 --- a/src/db_sync.c +++ b/src/db_sync.c @@ -1011,6 +1011,16 @@ static void db_handle_send_data(struct DB_SYNC_INSTANCE* si, uint64_t src, const db_cascade_from(si, fix_from); + for (int j = 0; j < si->peer_count; j++) { + if (si->peers[j].synced_pos >= fix_from && &si->peers[j] != sp) { + uint32_t old = si->peers[j].synced_pos; + si->peers[j].synced_pos = fix_from > 0 ? fix_from - 1 : 0; + DEBUG_DEBUG(DEBUG_CATEGORY_DB_SYNC, "sync [%s:%04llX] cascade changed chain from pos=%u → peer=%016llx synced_pos %u→%u", + SI_SHRT(si), (unsigned long long)(src >> 16), fix_from, + (unsigned long long)si->peers[j].node_id, old, si->peers[j].synced_pos); + } + } + if (sp && received > 0) sp->synced_pos = from + received - 1; uint32_t mc = db_count(si);