Browse Source

db_sync: notify all peers when cascade_from changes chain (lock-free sync)

После cascade_from в db_handle_send_data оповещаем ВСЕХ пиров
с synced_pos >= fix_from о том что цепочка изменилась — откатываем
их synced_pos. Это устраняет неэффективность конкурентных sync:
раньше только пир-отправитель обновлялся, остальные видели устаревшие
хеши и обнаруживали ложное расхождение на следующем цикле.
topo_upd
Evgeny 3 months ago
parent
commit
ad56767646
  1. 10
      src/db_sync.c

10
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);

Loading…
Cancel
Save