diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index e55befd9d9a5ec51fa1fdb537c05c36369af8f8e..086bb90dd2ddcd2eed231f47bfb9aa66d474901b 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -120,10 +120,11 @@ typedef struct dap_chain_net_pvt{ dap_chain_node_info_t * node_info; // Current node's info dap_chain_node_client_t * links; - size_t links_count; dap_chain_node_addr_t *links_addrs; + size_t links_count; size_t links_addrs_count; + size_t links_success; size_t addr_request_attempts; bool load_mode; @@ -424,7 +425,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) l_links_addrs_count * sizeof(dap_chain_node_addr_t)); // add linked nodes for connect - for(uint16_t i = 0; i < min(4, l_cur_node_info->hdr.links_number); i++) { + for(uint16_t i = 0; i < min(s_max_links_count, l_cur_node_info->hdr.links_number); i++) { dap_chain_node_addr_t *l_addr = l_cur_node_info->links + i; //dap_chain_node_addr_t link_addr = l_cur_node_info->links[i]; dap_chain_node_info_t *l_remore_node_info = dap_chain_node_info_read(l_net, l_addr); @@ -442,8 +443,8 @@ static int s_net_states_proc(dap_chain_net_t * l_net) } // if no links then add root nodes for connect if(!l_pvt_net->links_addrs_count){ - // use no more then 4 root node - int l_use_root_nodes = min(4, l_pvt_net->seed_aliases_count); + // use no more then s_max_links_count root node + int l_use_root_nodes = min(s_max_links_count, l_pvt_net->seed_aliases_count); l_pvt_net->links_addrs = DAP_NEW_Z_SIZE(dap_chain_node_addr_t, l_use_root_nodes * sizeof(dap_chain_node_addr_t)); @@ -484,13 +485,18 @@ static int s_net_states_proc(dap_chain_net_t * l_net) log_it(L_WARNING,"Target state is NET_STATE_LINKS_PREPARE? Realy?"); l_pvt_net->state = NET_STATE_OFFLINE; } + l_pvt_net->links_success = 0; } break; case NET_STATE_LINKS_CONNECTING:{ size_t l_links_count = l_pvt_net->links_count; - if(l_links_count >= s_required_links_count || (l_links_count + 1) >= s_max_links_count) { - // TODO what if other failed and we want more? + if (l_pvt_net->links_success >= s_required_links_count) { + log_it(L_INFO, "Synchronization done"); + l_pvt_net->links_count = 0; + l_pvt_net->links_success = 0; + l_pvt_net->flags &= ~F_DAP_CHAIN_NET_GO_SYNC; + l_pvt_net->state = NET_STATE_ONLINE; } if (l_links_count < l_pvt_net->links_addrs_count) { l_pvt_net->links_count++; @@ -521,7 +527,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) }else { log_it(L_DEBUG, "Cant establish link %u", l_links_count); dap_chain_node_client_close(l_node_client); - l_node_client = NULL; + l_pvt_net->links = NULL; } } } @@ -609,7 +615,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) if (res == 0) { log_it(L_WARNING,"Can't send NODE_ADDR_REQUEST packet"); dap_chain_node_client_close(l_node_client); - l_node_client = NULL; + l_pvt_net->links = NULL; l_pvt_net->state = NET_STATE_LINKS_CONNECTING; break; // try with another link } @@ -675,7 +681,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) if (l_res == 0) { log_it(L_WARNING, "Can't send GDB sync request"); dap_chain_node_client_close(l_node_client); - l_node_client = NULL; + l_pvt_net->links = NULL; l_pvt_net->state = NET_STATE_LINKS_CONNECTING; break; //try another link } @@ -700,8 +706,8 @@ static int s_net_states_proc(dap_chain_net_t * l_net) if(l_pvt_net->state_target >= NET_STATE_SYNC_CHAINS){ l_pvt_net->state = NET_STATE_SYNC_CHAINS; } else { - l_pvt_net->flags &= ~F_DAP_CHAIN_NET_GO_SYNC; - l_pvt_net->state = NET_STATE_ONLINE; + l_pvt_net->links_success++; + l_pvt_net->state = NET_STATE_LINKS_CONNECTING; } } break; @@ -765,15 +771,12 @@ static int s_net_states_proc(dap_chain_net_t * l_net) //DAP_DELETE( l_atom_iter ); } dap_chain_node_client_close(l_node_client); - l_node_client = NULL; - if (l_sync_errors) { - l_pvt_net->state = NET_STATE_LINKS_CONNECTING; - break; + l_pvt_net->links = NULL; + if (!l_sync_errors) { + l_pvt_net->links_success++; } - log_it(L_INFO, "Synchronization done"); - l_pvt_net->flags &= ~F_DAP_CHAIN_NET_GO_SYNC; - l_pvt_net->state = NET_STATE_ONLINE; - l_pvt_net->links_count = 0; + l_pvt_net->state = NET_STATE_LINKS_CONNECTING; + break; } break;