diff --git a/dap-sdk b/dap-sdk index 16bc9813751b728c9b0ad67402198a5749a1ce86..a2431fb2bac221b9a5393292d02bede1f237a99f 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 16bc9813751b728c9b0ad67402198a5749a1ce86 +Subproject commit a2431fb2bac221b9a5393292d02bede1f237a99f diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index d0a40eba61d7d9ba30f8a4ac4073798b800df776..d411a57f2a05536e9228982b9f282931849fd390 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -495,11 +495,15 @@ int s_link_manager_link_request(uint64_t a_net_id) if (l_net_pvt->state == NET_STATE_LINKS_PREPARE) l_net_pvt->state = NET_STATE_LINKS_CONNECTING; struct request_link_info *l_balancer_link = s_balancer_link_from_cfg(l_net); - if (!l_balancer_link) { - log_it(L_ERROR, "Can't process balancer link %s request in nte %s", dap_chain_net_balancer_type_to_str(PVT(l_net)->balancer_type), l_net->pub.name); - return -5; - } - return dap_chain_net_balancer_request(l_net, l_balancer_link->addr, l_balancer_link->port, PVT(l_net)->balancer_type); + if (!l_balancer_link) + return log_it(L_ERROR, "Can't process balancer link %s request in net %s", + dap_chain_net_balancer_type_to_str(PVT(l_net)->balancer_type), l_net->pub.name), -5; + dap_balancer_link_request_t *l_arg = DAP_NEW_Z(dap_balancer_link_request_t); + l_arg->net = l_net; + l_arg->host_addr = (const char*)l_balancer_link->addr; + l_arg->host_port = l_balancer_link->port; + l_arg->type = PVT(l_net)->balancer_type; + return dap_worker_exec_callback_on(dap_worker_get_auto(), dap_chain_net_balancer_request, l_arg), 0; } int s_link_manager_fill_net_info(dap_link_t *a_link) diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index 1460bce84e96d0110971b376ba051e6a47e98653..bbd3dd7320599a509763cbe6ca94d132215b9c75 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -44,15 +44,6 @@ typedef struct dap_balancer_request_info { UT_hash_handle hh; } dap_balancer_request_info_t; -typedef struct dap_balancer_link_request { - const char* host_addr; - uint16_t host_port; - dap_chain_net_t *net; - dap_worker_t *worker; - uint16_t required_links_count; - dap_balancer_request_info_t *request_info; -} dap_balancer_link_request_t; - 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 @@ -465,66 +456,53 @@ dap_link_info_t *dap_chain_net_balancer_dns_issue_link(const char *a_net_name) * @param a_balancer_type - http or DNS * @return if ok 0, error - other */ -int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_addr, uint16_t a_host_port, int a_balancer_type) +void dap_chain_net_balancer_request(void *a_arg) { // sanity check - dap_return_val_if_pass(!a_net, -1); + dap_return_if_fail(a_arg); + dap_balancer_link_request_t *l_arg = (dap_balancer_link_request_t*)a_arg; // period request check dap_balancer_request_info_t *l_item = NULL; - HASH_FIND(hh, s_request_info_items, &a_net->pub.id, sizeof(a_net->pub.id), l_item); + HASH_FIND(hh, s_request_info_items, &l_arg->net->pub.id, sizeof(l_arg->net->pub.id), l_item); if (!l_item) { - DAP_NEW_Z_RET_VAL(l_item, dap_balancer_request_info_t, -2, NULL); - l_item->net_id = a_net->pub.id; + DAP_NEW_Z_RET(l_item, dap_balancer_request_info_t, NULL); + l_item->net_id = l_arg->net->pub.id; HASH_ADD(hh, s_request_info_items, net_id, sizeof(l_item->net_id), l_item); } - if (l_item->request_time + DAP_CHAIN_NET_BALANCER_REQUEST_DELAY > dap_time_now()) { - log_it(L_DEBUG, "Who understands life, he is in no hurry. Dear %s, please wait few seconds", a_net->pub.name); - return 0; - } + if (l_item->request_time + DAP_CHAIN_NET_BALANCER_REQUEST_DELAY > dap_time_now()) + return log_it(L_DEBUG, "Who understands life, he is in no hurry. Dear %s, please wait few seconds", l_arg->net->pub.name); // preparing to request size_t l_ignored_addrs_size = 0, - l_required_links_count = dap_link_manager_needed_links_count(a_net->pub.id.uint64); + l_required_links_count = dap_link_manager_needed_links_count(l_arg->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); + *l_ignored_addrs = s_get_ignored_node_addrs(l_arg->net, &l_ignored_addrs_size), + *l_links = s_get_node_addrs(l_arg->net, l_required_links_count, l_ignored_addrs, false); // links from local GDB if (l_links) { - log_it(L_INFO, "%"DAP_UINT64_FORMAT_U" links successful prepared from global-db in net %s", l_links->count_node, a_net->pub.name); - 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; - } + log_it(L_INFO, "%"DAP_UINT64_FORMAT_U" links successful prepared from global-db in net %s", l_links->count_node, l_arg->net->pub.name); + s_balancer_link_prepare_success(l_arg->net, l_links, NULL, 0); + if (l_links->count_node >= l_required_links_count) + return DAP_DEL_MULTY(l_ignored_addrs, l_links); l_required_links_count -= l_links->count_node; DAP_DELETE(l_links); } // links from http balancer request - if (!a_host_addr || !a_host_port) { - log_it(L_INFO, "Can't read seed nodes addresses in net %s, work with local balancer only", a_net->pub.name); - DAP_DEL_Z(l_ignored_addrs); - return 0; - } - dap_balancer_link_request_t *l_balancer_request = NULL; - DAP_NEW_Z_RET_VAL(l_balancer_request, dap_balancer_link_request_t, -4, NULL); - *l_balancer_request = (dap_balancer_link_request_t) { - .host_addr = a_host_addr, - .host_port = a_host_port, - .net = a_net, - .worker = dap_worker_get_current(), - .required_links_count = l_required_links_count, - .request_info = l_item - }; + if (!l_arg->host_addr || !*l_arg->host_addr || !l_arg->host_port) + return DAP_DELETE(l_ignored_addrs), log_it(L_INFO, "Can't read seed nodes addresses in net %s, work with local balancer only", + l_arg->net->pub.name); + l_arg->worker = dap_worker_get_current(); + l_arg->required_links_count = l_required_links_count; + l_arg->request_info = l_item; log_it(L_DEBUG, "Start balancer %s request to %s:%u in net %s", - dap_chain_net_balancer_type_to_str(a_balancer_type), l_balancer_request->host_addr, l_balancer_request->host_port, a_net->pub.name); + dap_chain_net_balancer_type_to_str(l_arg->type), l_arg->host_addr, l_arg->host_port, l_arg->net->pub.name); - int ret; - if (a_balancer_type == DAP_CHAIN_NET_BALANCER_TYPE_HTTP) { + if (l_arg->type == DAP_CHAIN_NET_BALANCER_TYPE_HTTP) { char *l_ignored_addrs_str = NULL; if (l_ignored_addrs) { - DAP_NEW_Z_SIZE_RET_VAL( + DAP_NEW_Z_SIZE_RET( l_ignored_addrs_str, char, DAP_ENC_BASE64_ENCODE_SIZE(l_ignored_addrs_size) + 1, - -7, l_ignored_addrs, l_balancer_request); + l_ignored_addrs, l_arg); dap_enc_base64_encode(l_ignored_addrs, l_ignored_addrs_size, l_ignored_addrs_str, DAP_ENC_DATA_TYPE_B64); DAP_DELETE(l_ignored_addrs); } @@ -534,38 +512,28 @@ int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_ad DAP_BALANCER_URI_HASH, DAP_BALANCER_PROTOCOL_VERSION, (int)l_required_links_count, - a_net->pub.name, + l_arg->net->pub.name, l_ignored_addrs_str ? l_ignored_addrs_str : ""); - ret = dap_client_http_request(l_balancer_request->worker, - l_balancer_request->host_addr, - l_balancer_request->host_port, - "GET", - "text/text", - l_request, - NULL, - 0, - NULL, - s_http_balancer_link_prepare_success, - s_http_balancer_link_prepare_error, - l_balancer_request, - NULL) == NULL; + if (! dap_client_http_request(l_arg->worker, l_arg->host_addr, l_arg->host_port, + "GET", "text/text", l_request, NULL, 0, NULL, + s_http_balancer_link_prepare_success, s_http_balancer_link_prepare_error, + l_arg, NULL) ) + { + log_it(L_ERROR, "Can't process balancer link %s request in net %s", + dap_chain_net_balancer_type_to_str(l_arg->type), l_arg->net->pub.name); + } DAP_DEL_MULTY(l_ignored_addrs_str, l_request); } else { - l_balancer_request->host_port = DNS_LISTEN_PORT; + l_arg->host_port = DNS_LISTEN_PORT; // TODO: change signature and implementation - ret = /* dap_chain_node_info_dns_request(l_balancer_request->worker, - l_link_node_info->hdr.ext_addr_v4, - l_link_node_info->hdr.ext_port, - a_net->pub.name, - s_dns_balancer_link_prepare_success, - s_dns_balancer_link_prepare_error, - l_balancer_request); */ -1; - } - if (ret) { - log_it(L_ERROR, "Can't process balancer link %s request in net %s", dap_chain_net_balancer_type_to_str(a_balancer_type), a_net->pub.name); - return -6; + /* dap_chain_node_info_dns_request(l_balancer_request->worker, + l_link_node_info->hdr.ext_addr_v4, + l_link_node_info->hdr.ext_port, + a_net->pub.name, + s_dns_balancer_link_prepare_success, + s_dns_balancer_link_prepare_error, + l_balancer_request); */ } - return 0; } /** diff --git a/modules/net/include/dap_chain_net_balancer.h b/modules/net/include/dap_chain_net_balancer.h index b5e1d0bd26bf0d06335676b698f41256e79895e7..ccada8e10d97086f34654e607c3113a8a5bde7c2 100644 --- a/modules/net/include/dap_chain_net_balancer.h +++ b/modules/net/include/dap_chain_net_balancer.h @@ -30,6 +30,8 @@ along with any CellFrame SDK based project. If not, see <http://www.gnu.org/lic #define DAP_BALANCER_PROTOCOL_VERSION 2 #define DAP_BALANCER_MAX_REPLY_SIZE 2048 +typedef struct dap_balancer_request_info dap_balancer_request_info_t; + typedef struct dap_chain_net_links { uint64_t count_node; byte_t nodes_info[]; @@ -40,6 +42,15 @@ typedef enum dap_balancer_type { DAP_CHAIN_NET_BALANCER_TYPE_DNS } dap_balancer_type_t; +typedef struct dap_balancer_link_request { + const char* host_addr; + uint16_t host_port; + dap_chain_net_t *net; + dap_worker_t *worker; + uint16_t required_links_count; + dap_balancer_request_info_t *request_info; + dap_balancer_type_t type; +} dap_balancer_link_request_t; DAP_STATIC_INLINE const char *dap_chain_net_balancer_type_to_str(dap_balancer_type_t a_type) { @@ -54,4 +65,4 @@ void dap_chain_net_balancer_http_issue_link(dap_http_simple_t *a_http_simple, vo 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); dap_string_t *dap_chain_net_balancer_get_node_str(dap_chain_net_t *a_net); -int dap_chain_net_balancer_request(dap_chain_net_t *a_net, const char *a_host_addr, uint16_t a_host_port, int a_balancer_type); \ No newline at end of file +void dap_chain_net_balancer_request(void *a_arg); \ No newline at end of file