From aad85598f4852dda69d2baeaeb313b9160fe95b2 Mon Sep 17 00:00:00 2001 From: "roman.padenkov" <roman.padenkov@demlabs.net> Date: Wed, 17 May 2023 12:26:36 +0000 Subject: [PATCH] Feature 6700 --- modules/net/dap_chain_net.c | 14 ++++++++++ modules/net/dap_chain_net_balancer.c | 40 +++++++++++++++++++++------- modules/net/include/dap_chain_net.h | 3 ++- 3 files changed, 46 insertions(+), 11 deletions(-) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 35a230c7a7..7d062584b5 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -3073,6 +3073,20 @@ dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net) return l_node_list; } +/** + * Get nodes list from config file (list of dap_chain_node_addr_t struct) + */ +dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net) +{ + dap_list_t *l_node_list = NULL; + dap_chain_net_pvt_t *l_pvt_net = PVT(a_net); + for(size_t i=0; i < l_pvt_net->seed_aliases_count;i++) + { + l_node_list = dap_list_append(l_node_list, &l_pvt_net->node_info[i]); + } + return l_node_list; +} + /** * @brief dap_chain_net_set_flag_sync_from_zero * @param a_net diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index 0254a46f46..5851af3429 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -30,6 +30,7 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name) { + dap_list_t *l_node_list = NULL,*l_objs_list = NULL; dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); if (l_net == NULL) { uint16_t l_nets_count; @@ -43,23 +44,42 @@ dap_chain_node_info_t *s_balancer_issue_link(const char *a_net_name) // get nodes list from global_db dap_global_db_obj_t *l_objs = NULL; size_t l_nodes_count = 0; + size_t l_node_num = 0; // read all node l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count); if (!l_nodes_count || !l_objs) - return NULL; + return NULL; + l_node_list = dap_chain_net_get_node_list_cfg(l_net); + for(size_t i=0;i<l_nodes_count;i++) + { + for(dap_list_t *node_i = l_node_list;node_i;node_i = node_i->next) + { + dap_chain_node_info_t *l_node_cfg = (dap_chain_node_info_t*)node_i->data; + dap_chain_node_info_t *l_node_cand = (dap_chain_node_info_t *)l_objs[i].value; + if(l_node_cand->hdr.ext_addr_v4.s_addr && l_node_cand->hdr.ext_port && + (l_node_cfg->hdr.ext_addr_v4.s_addr != l_node_cand->hdr.ext_addr_v4.s_addr)) + { + l_objs_list = dap_list_append(l_objs_list,l_objs[i].value); + l_node_num++; + break; + } + } + } + dap_global_db_objs_delete(l_objs, l_nodes_count); + l_nodes_count = l_node_num; dap_chain_node_info_t *l_node_candidate; - for (int i = 0; i < 50; i++) { - // 50 tryes for non empty address & port - size_t l_node_num = rand() % l_nodes_count; - l_node_candidate = (dap_chain_node_info_t *)l_objs[l_node_num].value; - if (l_node_candidate->hdr.ext_addr_v4.s_addr && l_node_candidate->hdr.ext_port) - break; + if(l_nodes_count) + { + l_node_num = rand() % l_nodes_count; + l_node_candidate = (dap_chain_node_info_t *)dap_list_nth_data(l_objs_list,l_node_num); } - if (!l_node_candidate->hdr.ext_addr_v4.s_addr || !l_node_candidate->hdr.ext_port) - return NULL; + else + l_node_candidate = (dap_chain_node_info_t *)dap_list_nth_data(l_node_list,0); + dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t)); - dap_global_db_objs_delete(l_objs, l_nodes_count); + dap_list_free(l_objs_list); + dap_list_free(l_node_list); log_it(L_DEBUG, "Network balancer issues ip %s", inet_ntoa(l_node_info->hdr.ext_addr_v4)); return l_node_info; } diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 5f191f9b6c..9cc386aa93 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -155,7 +155,8 @@ dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net); const char* dap_chain_net_get_type(dap_chain_t *l_chain); dap_list_t* dap_chain_net_get_link_node_list(dap_chain_net_t * l_net, bool a_is_only_cur_cell); -dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * l_net); +dap_list_t* dap_chain_net_get_node_list(dap_chain_net_t * a_net); +dap_list_t* dap_chain_net_get_node_list_cfg(dap_chain_net_t * a_net); dap_chain_node_role_t dap_chain_net_get_role(dap_chain_net_t * a_net); /** -- GitLab