|
|
|
|
@ -661,6 +661,12 @@ static int run_relay_recovery(void) {
|
|
|
|
|
} |
|
|
|
|
struct ETCP_CONN* to_a = instance_find_conn(inst_c, nid_a); |
|
|
|
|
struct TOPO_GROUP_NODE* b_on_c = topo_node_find_by_id(defgrp(inst_c), nid_b); |
|
|
|
|
// Получатель потерял анонс: очищаем кэш отправителя, чтобы NODEINFO действительно ушёл по сети.
|
|
|
|
|
for (struct ll_entry* e = defgrp(inst_c)->senders_list->head; e; e = e->next) { |
|
|
|
|
struct TOPO_GROUP_CONN_ITEM* peer = (struct TOPO_GROUP_CONN_ITEM*)e->data; |
|
|
|
|
struct ll_entry* advert = peer->node_id == nid_a && peer->advertised ? queue_find_data_by_index(peer->advertised, &nid_b) : NULL; |
|
|
|
|
if (advert) { queue_remove_data(peer->advertised, advert); queue_entry_free(advert); } |
|
|
|
|
} |
|
|
|
|
if (!to_a || !b_on_c || topo_group_send_nodeinfo(defgrp(inst_c), b_on_c, to_a) < 0) return -1; |
|
|
|
|
ev_a = -1; |
|
|
|
|
if (!poll_until(ev_a_up, 3000) || up_count != 2 || down_count != 1 || timeout_count || |
|
|
|
|
@ -696,6 +702,11 @@ static int run_initial_timeout(void) {
|
|
|
|
|
} |
|
|
|
|
struct ETCP_CONN* to_a = instance_find_conn(inst_c, nid_a); |
|
|
|
|
struct TOPO_GROUP_NODE* b_on_c = topo_node_find_by_id(defgrp(inst_c), nid_b); |
|
|
|
|
for (struct ll_entry* e = defgrp(inst_c)->senders_list->head; e; e = e->next) { |
|
|
|
|
struct TOPO_GROUP_CONN_ITEM* peer = (struct TOPO_GROUP_CONN_ITEM*)e->data; |
|
|
|
|
struct ll_entry* advert = peer->node_id == nid_a && peer->advertised ? queue_find_data_by_index(peer->advertised, &nid_b) : NULL; |
|
|
|
|
if (advert) { queue_remove_data(peer->advertised, advert); queue_entry_free(advert); } |
|
|
|
|
} |
|
|
|
|
if (!to_a || !b_on_c || topo_group_send_nodeinfo(defgrp(inst_c), b_on_c, to_a) < 0) return -1; |
|
|
|
|
ev_a = -1; |
|
|
|
|
if (!poll_until(ev_a_up, 3000) || up_count != 1 || timeout_count != 1 || down_count) { |
|
|
|
|
|