diff --git a/src/modules/discovery/discovery.c b/src/modules/discovery/discovery.c index 1b0170d..afefd07 100644 --- a/src/modules/discovery/discovery.c +++ b/src/modules/discovery/discovery.c @@ -204,13 +204,16 @@ static void *receive_thread_fn(void *arg) { uint32_t addr = src.sin_addr.s_addr; uint64_t ts = now_ms(); - int is_new = 0; + int is_new = 0; + int reannounce = 0; struct Discovery_Peer peer_copy; pthread_mutex_lock(&d->peers_mutex); int idx = find_peer(d, addr, tcp_port); if (idx >= 0) { + /* detect restart: same addr+port but site_id changed */ + if (d->peers[idx].info.site_id != site_id) { reannounce = 1; } d->peers[idx].last_seen_ms = ts; d->peers[idx].info.site_id = site_id; d->peers[idx].info.tcp_port = tcp_port; @@ -233,9 +236,9 @@ static void *receive_thread_fn(void *arg) { pthread_mutex_unlock(&d->peers_mutex); - if (is_new) { - /* announce ourselves immediately so the new peer learns about us - * without waiting up to interval_ms */ + if (is_new || reannounce) { + /* new peer, or peer restarted (site_id changed) — announce ourselves + * immediately so it learns about us without waiting up to interval_ms */ pthread_mutex_lock(&d->announce_mutex); pthread_cond_signal(&d->announce_cond); pthread_mutex_unlock(&d->announce_mutex);