diff --git a/dap-sdk b/dap-sdk index 72ddf0b2f2433f056e8d060accf804d5e37c5803..8ea87036ecc4a222c0879e6fd87aa7bb19606b0e 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 72ddf0b2f2433f056e8d060accf804d5e37c5803 +Subproject commit 8ea87036ecc4a222c0879e6fd87aa7bb19606b0e diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index e4aa08b5205742c85915355e9063fbf129f0d3b6..adbc3548b8d2dcdf3f71c11806c307a347d93624 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2265,7 +2265,7 @@ bool s_net_load(void *a_arg) l_chain->callback_created(l_chain, l_cfg); if ( dap_config_get_item_bool_default(g_config, "server", "enabled", false) ) { - if ( !l_net_pvt->node_info ) { + if ( !l_net_pvt->node_info->ext_port ) { char l_host[DAP_HOSTADDR_STRLEN + 1] = { '\0' }; uint16_t l_ext_port = 0; const char *l_ext_addr = dap_config_get_item_str_default(g_config, "server", "ext_address", NULL); diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index 1c0ed5b4ce56a3023ecdeb22c1f1f5e351f9a199..9d969ad754e4227c41a7084cbb1d3c39711734bc 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -46,6 +46,7 @@ typedef struct dap_balancer_link_request { static_assert(sizeof(dap_chain_net_links_t) + sizeof(dap_chain_node_info_old_t) < DAP_BALANCER_MAX_REPLY_SIZE, "DAP_BALANCER_MAX_REPLY_SIZE cannot accommodate information minimum about 1 link"); static const size_t s_max_links_response_count = (DAP_BALANCER_MAX_REPLY_SIZE - sizeof(dap_chain_net_links_t)) / sizeof(dap_chain_node_info_old_t); +static const dap_time_t s_request_period = 5; // sec /** * @brief forming json file with balancer info: class networkName nodeAddress hostAddress hostPort @@ -78,19 +79,23 @@ static dap_chain_net_links_t *s_get_ignored_node_addrs(dap_chain_net_t *a_net, s l_size = 0, l_uplinks_count = 0, l_low_availability_count = 0; - dap_stream_node_addr_t *l_uplinks = dap_link_manager_get_net_links_addrs(a_net->pub.id.uint64, &l_uplinks_count, NULL, true); - dap_stream_node_addr_t *l_low_availability = dap_link_manager_get_ignored_addrs(&l_low_availability_count); - if(!l_uplinks && !l_low_availability) { + const dap_stream_node_addr_t + *l_curr_addr = &dap_chain_net_get_my_node_info(a_net)->address, + *l_uplinks = dap_link_manager_get_net_links_addrs(a_net->pub.id.uint64, &l_uplinks_count, NULL, true), + *l_low_availability = dap_link_manager_get_ignored_addrs(&l_low_availability_count); + if(!l_curr_addr->uint64 && !l_uplinks && !l_low_availability) { + log_it(L_WARNING, "Error forming ignore list, please check, should be minimum self addr"); return NULL; } - l_size = sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * (l_uplinks_count + l_low_availability_count); + l_size = sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * (l_uplinks_count + l_low_availability_count + 1); // memory alloc dap_chain_net_links_t *l_ret = NULL; - DAP_NEW_Z_SIZE_RET_VAL(l_ret, dap_chain_net_links_t, l_size, NULL, NULL); + DAP_NEW_Z_SIZE_RET_VAL(l_ret, dap_chain_net_links_t, l_size, NULL, l_uplinks, l_low_availability); // func work - memcpy(l_ret->nodes_info, l_uplinks, l_uplinks_count * sizeof(dap_stream_node_addr_t)); - memcpy(l_ret->nodes_info + l_uplinks_count, l_low_availability, l_low_availability_count * sizeof(dap_stream_node_addr_t)); - l_ret->count_node = l_uplinks_count + l_low_availability_count; + memcpy(l_ret->nodes_info, l_curr_addr, sizeof(dap_stream_node_addr_t)); + memcpy(l_ret->nodes_info + sizeof(dap_stream_node_addr_t), l_uplinks, l_uplinks_count * sizeof(dap_stream_node_addr_t)); + memcpy(l_ret->nodes_info + (l_uplinks_count + 1) * sizeof(dap_stream_node_addr_t), l_low_availability, l_low_availability_count * sizeof(dap_stream_node_addr_t)); + l_ret->count_node = l_uplinks_count + l_low_availability_count + 1; if (a_size) *a_size = l_size; DAP_DEL_MULTY(l_uplinks, l_low_availability); @@ -283,8 +288,8 @@ static dap_chain_net_links_t *s_balancer_issue_link(const char *a_net_name, uint if (l_ignored_size) { DAP_NEW_Z_SIZE_RET_VAL(l_ignored_dec, dap_chain_net_links_t, l_ignored_size, NULL, NULL); dap_enc_base64_decode(a_ignored_enc, l_ignored_size, l_ignored_dec, DAP_ENC_DATA_TYPE_B64); - if (l_ignored_size < DAP_ENC_BASE64_ENCODE_SIZE(sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node)) { - log_it(L_ERROR, "Cant't decode ignored node list, %zu %zu", l_ignored_size, DAP_ENC_BASE64_ENCODE_SIZE(sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node)); + if (l_ignored_size < DAP_ENC_BASE64_ENCODE_SIZE((sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node))) { + log_it(L_ERROR, "Can't decode ignored node list, received size %zu < expected size %zu", l_ignored_size, DAP_ENC_BASE64_ENCODE_SIZE((sizeof(dap_chain_net_links_t) + sizeof(dap_stream_node_addr_t) * l_ignored_dec->count_node))); DAP_DEL_Z(l_ignored_dec); } } @@ -293,6 +298,14 @@ static dap_chain_net_links_t *s_balancer_issue_link(const char *a_net_name, uint return l_ret; } +/** + * @brief balancer deinit + */ +void dap_chain_net_balancer_deinit() +{ + +} + /** * @brief balancer handshake * @param a_node_info @@ -402,23 +415,31 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad // sanity check dap_return_val_if_pass(!a_net, -1); // func work - size_t l_ignored_addrs_size = 0; // prepare list of the ignored addrs - dap_chain_net_links_t *l_ignored_addrs = s_get_ignored_node_addrs(a_net, &l_ignored_addrs_size); - size_t l_required_links_count = dap_link_manager_needed_links_count(a_net->pub.id.uint64); - // links from local GDB - dap_chain_net_links_t *l_links = s_get_node_addrs(a_net, l_required_links_count, l_ignored_addrs, false); + // request each 5 sec + static dap_time_t l_last_time = 0; + if (dap_time_now() - l_last_time < s_request_period) { + log_it(L_DEBUG, "Who understands life, he is in no hurry"); + return 0; + } + l_last_time = dap_time_now(); + size_t + l_ignored_addrs_size = 0, + l_required_links_count = dap_link_manager_needed_links_count(a_net->pub.id.uint64); + dap_chain_net_links_t + *l_ignored_addrs = s_get_ignored_node_addrs(a_net, &l_ignored_addrs_size), + *l_links = s_get_node_addrs(a_net, l_required_links_count, l_ignored_addrs, false); // links from local GDB if (l_links) { s_balancer_link_prepare_success(a_net, l_links, NULL, 0); if (l_links->count_node >= l_required_links_count) { DAP_DEL_MULTY(l_ignored_addrs, l_links); return 0; } - else - l_required_links_count -= l_links->count_node; + l_required_links_count -= l_links->count_node; DAP_DELETE(l_links); } if (!a_host_addr || !a_host_port) { log_it(L_INFO, "Can't read seed nodes addresses, work with local balancer only"); + DAP_DEL_Z(l_ignored_addrs); return 0; } // dynamic links from http balancer request diff --git a/modules/net/dap_chain_net_node_list.c b/modules/net/dap_chain_net_node_list.c index 205a5bf2193ce6215302ad42108e1230eeedc2e3..85d7f8228fd55cf953a015bef1132509fb0f9169 100644 --- a/modules/net/dap_chain_net_node_list.c +++ b/modules/net/dap_chain_net_node_list.c @@ -302,8 +302,7 @@ int dap_chain_net_node_list_request(dap_chain_net_t *a_net, uint16_t a_port, boo } } } - DAP_DELETE(l_request); - DAP_DELETE(l_seeds_addrs); + DAP_DEL_MULTY(l_request, l_seeds_addrs); s_node_list_request_deinit(l_link_node_request); return l_ret; } diff --git a/modules/net/include/dap_chain_net_balancer.h b/modules/net/include/dap_chain_net_balancer.h index a7aa901dab156a6f97d077359f7c1fd752d11b5f..b5e1d0bd26bf0d06335676b698f41256e79895e7 100644 --- a/modules/net/include/dap_chain_net_balancer.h +++ b/modules/net/include/dap_chain_net_balancer.h @@ -49,7 +49,7 @@ DAP_STATIC_INLINE const char *dap_chain_net_balancer_type_to_str(dap_balancer_ty default: return "UNDEFINED"; } } - +void dap_chain_net_balancer_deinit(); void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, void *a_arg); dap_link_info_t *dap_chain_net_balancer_dns_issue_link(const char *a_net_name); int dap_chain_net_balancer_handshake(dap_chain_node_info_t *a_node_info, dap_chain_net_t * a_net);