diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index a2411e2e2016130161e1739d5ca5c1ae262c5f0e..a372e22211c06791af76939e4f993f207a386e55 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -1167,7 +1167,7 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla return false; } if(!a_link_replace_tries){ - dap_chain_net_node_balancer_t *l_link_full_node_list = dap_chain_net_balancer_get_node(a_net->pub.name); + dap_chain_net_node_balancer_t *l_link_full_node_list = dap_chain_net_balancer_get_node(a_net->pub.name,l_net_pvt->max_links_count); size_t node_cnt = 0,i = 0; if(l_link_full_node_list) { @@ -1221,9 +1221,10 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla int ret; if (PVT(a_net)->balancer_http) { l_balancer_request->from_http = true; - char *l_request = dap_strdup_printf("%s/%s?version=1,method=r,net=%s", + char *l_request = dap_strdup_printf("%s/%s?version=1,method=r,needlink=%d,net=%s", DAP_UPLINK_PATH_BALANCER, DAP_BALANCER_URI_HASH, + l_net_pvt->required_links_count, a_net->pub.name); ret = dap_client_http_request(l_balancer_request->worker, l_node_addr_str, diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index e051bdb328a066f9c9105eee96e4d6636866cf1e..4b4087c85e0ddede0984670a1ca1159b92074d5a 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -40,7 +40,7 @@ static int callback_compare_node_list(const void * a_item1, const void * a_item2 ? 1 : -1; } -dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net_name) +dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net_name,uint16_t a_links_need) { dap_list_t *l_node_addr_list = NULL,*l_objs_list = NULL; dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); @@ -51,7 +51,7 @@ dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net // 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; + size_t l_node_num = 0,l_links_need = 0; uint64_t l_blocks_events = 0; // read all node l_objs = dap_global_db_get_all_sync(l_net->pub.gdb_nodes, &l_nodes_count); @@ -99,17 +99,17 @@ dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net dap_chain_node_info_t *l_node_candidate; if(l_node_num) { - + l_links_need = l_node_num > a_links_need ? a_links_need : l_node_num; dap_chain_net_node_balancer_t *l_node_list_res = DAP_NEW_Z_SIZE(dap_chain_net_node_balancer_t, - sizeof(dap_chain_net_node_balancer_t) + l_node_num * sizeof(dap_chain_node_info_t)); + sizeof(dap_chain_net_node_balancer_t) + l_links_need * sizeof(dap_chain_node_info_t)); dap_chain_node_info_t * l_node_info = (dap_chain_node_info_t *)l_node_list_res->nodes_info; dap_list_t *nl = l_objs_list; - for(size_t i=0; i<l_node_num; i++,nl = nl->next) + for(size_t i=0; i<l_links_need; i++,nl = nl->next) { l_node_candidate = (dap_chain_node_info_t*)nl->data; *(l_node_info + i) = *l_node_candidate; } - l_node_list_res->count_node = l_node_num; + l_node_list_res->count_node = l_links_need; dap_list_free(l_objs_list); dap_global_db_objs_delete(l_objs, l_nodes_count); return l_node_list_res; @@ -123,10 +123,10 @@ dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net } } -dap_chain_net_node_balancer_t *s_balancer_issue_link(const char *a_net_name) +dap_chain_net_node_balancer_t *s_balancer_issue_link(const char *a_net_name,uint16_t a_links_need) { dap_chain_net_t *l_net = dap_chain_net_by_name(a_net_name); - dap_chain_net_node_balancer_t *l_link_full_node_list = dap_chain_net_balancer_get_node(a_net_name); + dap_chain_net_node_balancer_t *l_link_full_node_list = dap_chain_net_balancer_get_node(a_net_name,a_links_need); if(l_link_full_node_list) { dap_chain_node_info_t * l_node_info = (dap_chain_node_info_t *)l_link_full_node_list->nodes_info; @@ -167,8 +167,9 @@ void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, vo int l_protocol_version = 0; char l_issue_method = 0; const char l_net_token[] = "net="; - sscanf(a_http_simple->http_client->in_query_string, "version=%d,method=%c,net=", - &l_protocol_version, &l_issue_method); + uint16_t links_need = 0; + sscanf(a_http_simple->http_client->in_query_string, "version=%d,method=%c,needlink=%d,net=", + &l_protocol_version, &l_issue_method,&links_need); if (l_protocol_version != 1 || l_issue_method != 'r') { log_it(L_ERROR, "Unsupported prorocol version/method in the request to dap_chain_net_balancer module"); *l_return_code = Http_Status_MethodNotAllowed; @@ -183,8 +184,9 @@ void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, vo l_net_str += sizeof(l_net_token) - 1; char l_net_name[128] = {}; strncpy(l_net_name, l_net_str, 127); + links_need = links_need ? links_need : 5; log_it(L_DEBUG, "HTTP balancer parser retrieve netname %s", l_net_name); - dap_chain_net_node_balancer_t *l_link_full_node_list = s_balancer_issue_link(l_net_name); + dap_chain_net_node_balancer_t *l_link_full_node_list = s_balancer_issue_link(l_net_name,links_need); if (!l_link_full_node_list) { log_it(L_WARNING, "Can't issue link for network %s, no acceptable links found", l_net_name); *l_return_code = Http_Status_NotFound; @@ -204,5 +206,5 @@ void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, vo dap_chain_node_info_t *dap_chain_net_balancer_dns_issue_link(char *a_str) { log_it(L_DEBUG, "DNS balancer parser retrieve netname %s", a_str); - return s_balancer_issue_link(a_str); + return s_balancer_issue_link(a_str,3); } diff --git a/modules/net/include/dap_chain_net_balancer.h b/modules/net/include/dap_chain_net_balancer.h index 1a3d21134ef1e436f4d3d9d7f770a6dcbf47055c..637ba8da659ec2973ce0257069299429a3133aba 100644 --- a/modules/net/include/dap_chain_net_balancer.h +++ b/modules/net/include/dap_chain_net_balancer.h @@ -34,4 +34,4 @@ typedef struct dap_chain_net_node_balancer { void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg); dap_chain_node_info_t *dap_chain_net_balancer_dns_issue_link(char *a_str); -dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net_name); +dap_chain_net_node_balancer_t *dap_chain_net_balancer_get_node(const char *a_net_name,uint16_t a_links_need);