diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 326f4538c95d9a33a2678a6da741154dc165b66b..e6531e2230b5c7f72bc86dd7a67cc9dfcba98441 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -737,12 +737,7 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) } const char *cert_name = cert->name; size_t cert_path_length = dap_strlen(net_name) + dap_strlen(cert_name) + 9 + dap_strlen(s_system_chain_ca_dir); - char *cert_path = DAP_NEW_STACK_SIZE(char, cert_path_length); - if ( !cert_path ) { - dap_cert_delete(cert); - log_it(L_ERROR, "Memory allocation error in dap_cert_chain_file_save, errno=%d", errno); - return -1; - } + char cert_path[cert_path_length]; snprintf(cert_path, cert_path_length, "%s/%s/%s.dcert", s_system_chain_ca_dir, net_name, cert_name); // In cert_path resolve all `..` and `.`s char *cert_path_c = dap_canonicalize_filename(cert_path, NULL); @@ -751,12 +746,10 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) log_it(L_ERROR, "Cert path '%s' is not in ca dir: %s", cert_path_c, s_system_chain_ca_dir); dap_cert_delete(cert); DAP_DELETE(cert_path_c); - DAP_DELETE(cert_path); return -1; } int l_ret = dap_cert_file_save(cert, cert_path_c); dap_cert_delete(cert); - DAP_DELETE(cert_path); DAP_DELETE(cert_path_c); // if ( access( l_cert_path, F_OK ) != -1 ) { // log_it (L_ERROR, "File %s is already exists.", l_cert_path); diff --git a/modules/chain/dap_chain_ledger.c b/modules/chain/dap_chain_ledger.c index 8078dc806de2f5bf79ca322f5c9270704df0c677..094f72f7a0f86095dbc296acf53c8a4cd48bcebd 100644 --- a/modules/chain/dap_chain_ledger.c +++ b/modules/chain/dap_chain_ledger.c @@ -4430,9 +4430,9 @@ static inline int s_tx_add(dap_ledger_t *a_ledger, dap_chain_datum_tx_t *a_tx, d size_t l_cache_size = sizeof(dap_store_obj_t) * (l_outs_used + 1); dap_store_obj_t *l_cache_used_outs = DAP_NEW_Z_SIZE(dap_store_obj_t, l_cache_size); if ( !l_cache_used_outs ) { - if (l_item_tmp->tx) - DAP_DELETE(l_item_tmp->tx); if (l_item_tmp) + if (l_item_tmp->tx) + DAP_DELETE(l_item_tmp->tx); DAP_DELETE(l_item_tmp); log_it(L_ERROR, "Memory allocation error in s_tx_add"); return -1; diff --git a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c index 26b015536b47e46ac54332fb3040c822508d06d8..6ff08a3d9af94f9a5ba261c170fb7d7c409a6d92 100644 --- a/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c +++ b/modules/channel/chain-net-srv/dap_stream_ch_chain_net_srv.c @@ -494,17 +494,18 @@ static void s_grace_period_start(dap_chain_net_srv_grace_t *a_grace) static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) { assert(a_grace_item); - dap_stream_ch_chain_net_srv_pkt_error_t l_err; - memset(&l_err, 0, sizeof(l_err)); + dap_stream_ch_chain_net_srv_pkt_error_t l_err = { }; dap_chain_net_srv_grace_t *l_grace = a_grace_item->grace; dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(l_grace->stream_worker, l_grace->ch_uuid); +#define RET_WITH_DEL_A_GRACE do \ + { HASH_DEL(s_grace_table, a_grace_item); DAP_DELETE(a_grace_item); return false; } \ + while(0); + if (!l_ch){ s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } if (l_grace->usage->price && !l_grace->usage->receipt_next){ // if first grace delete price and set actual @@ -515,9 +516,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it(L_INFO, "No new tx cond!"); s_grace_error(l_grace, l_err); l_grace->usage->is_waiting_new_tx_cond = false; - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } dap_chain_net_t * l_net = l_grace->usage->net; @@ -533,9 +532,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it( L_WARNING, "No Ledger"); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_NETWORK_NO_LEDGER ; s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } log_it(L_INFO, "Grace period is over! Check tx in ledger."); l_tx = dap_chain_ledger_tx_find_by_hash(l_ledger, &l_grace->usage->tx_cond_hash); @@ -543,9 +540,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it( L_WARNING, "No tx cond transaction"); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_FOUND ; s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } else { // Start srvice in normal pay mode log_it(L_INFO, "Tx is found in ledger."); l_grace->usage->tx_cond = l_tx; @@ -556,9 +551,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it( L_WARNING, "No conditioned output"); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NO_COND_OUT ; s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } // Check cond output if it equesl or not to request @@ -567,9 +560,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) l_tx_out_cond->header.srv_uid.uint64 ); l_err.code = DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_WRONG_SRV_UID ; s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } dap_chain_net_srv_price_t * l_price = NULL; @@ -602,9 +593,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) l_ticker, l_net->pub.name ); l_err.code =DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_RESPONSE_ERROR_CODE_TX_COND_NOT_ACCEPT_TOKEN; s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } l_grace->usage->price = l_price; @@ -614,9 +603,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it( L_WARNING, "Request canceled by service callback, return code %d", ret); l_err.code = (uint32_t) ret ; s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } // make receipt or tx @@ -629,6 +616,11 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) } else { // Send error??? } + if (!l_receipt) { + log_it(L_ERROR, "Receipt is not present, finish grace"); + s_grace_error(l_grace, l_err); + RET_WITH_DEL_A_GRACE; + } size_t l_receipt_size = l_receipt->size; // get a second signature - from the client (first sign in server, second sign in client) @@ -636,9 +628,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) if ( ! l_receipt_sign ){ log_it(L_WARNING, "Tx already in chain, but receipt is not signed by client. Finish grace and wait receipt sign responce."); s_grace_error(l_grace, l_err); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } dap_get_data_hash_str_static(l_receipt, l_receipt_size, l_receipt_hash_str); dap_global_db_set("local.receipts", l_receipt_hash_str, l_receipt, l_receipt_size, false, NULL, NULL); @@ -667,9 +657,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it(L_ERROR, "Memory allocation error in s_grace_period_finish"); DAP_DELETE(a_grace_item->grace->request); DAP_DEL_Z(a_grace_item->grace); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } // Parse the request l_grace_new->request = DAP_NEW_Z_SIZE(dap_stream_ch_chain_net_srv_pkt_request_t, sizeof(dap_stream_ch_chain_net_srv_pkt_request_t)); @@ -677,9 +665,7 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) log_it(L_ERROR, "Memory allocation error in s_grace_period_finish"); DAP_DELETE(a_grace_item->grace->request); DAP_DEL_Z(a_grace_item->grace); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; } l_grace_new->request->hdr.net_id = a_grace_item->grace->usage->net->pub.id; memcpy(l_grace_new->request->hdr.token, a_grace_item->grace->usage->token_ticker, strlen(a_grace_item->grace->usage->token_ticker)); @@ -713,9 +699,8 @@ static bool s_grace_period_finish(usages_in_grace_t *a_grace_item) l_grace->usage->is_grace = false; DAP_DELETE(a_grace_item->grace->request); DAP_DEL_Z(a_grace_item->grace); - HASH_DEL(s_grace_table, a_grace_item); - DAP_DEL_Z(a_grace_item); - return false; + RET_WITH_DEL_A_GRACE; +#undef RET_WITH_DEL_A_GRACE } /** diff --git a/modules/common/dap_chain_datum_tx.c b/modules/common/dap_chain_datum_tx.c index 9480c69043adc17d7ff3e81a872496fcbfb991d5..08a897c201ed9a2220fe5a77d492174ed023f663 100644 --- a/modules/common/dap_chain_datum_tx.c +++ b/modules/common/dap_chain_datum_tx.c @@ -76,10 +76,13 @@ size_t dap_chain_datum_tx_get_size(dap_chain_datum_tx_t *a_tx) int dap_chain_datum_tx_add_item(dap_chain_datum_tx_t **a_tx, const void *a_item) { size_t size = dap_chain_datum_item_tx_get_size(a_item); - if(!size) + if(!size || !a_tx || !*a_tx) return -1; dap_chain_datum_tx_t *tx_cur = *a_tx; - tx_cur = (dap_chain_datum_tx_t *)DAP_REALLOC(tx_cur, dap_chain_datum_tx_get_size(tx_cur) + size); + size_t l_new_size = dap_chain_datum_tx_get_size(tx_cur) + size; + tx_cur = (dap_chain_datum_tx_t*)DAP_REALLOC(tx_cur, l_new_size); + if (!tx_cur) + return -1; memcpy((uint8_t*) tx_cur->tx_items + tx_cur->header.tx_items_size, a_item, size); tx_cur->header.tx_items_size += size; *a_tx = tx_cur; diff --git a/modules/common/dap_chain_datum_tx_receipt.c b/modules/common/dap_chain_datum_tx_receipt.c index dd24b2f665f7238ee11b22f09387bb76b3868396..43e607dcec37cf65ca412dc32894f3b0214a074c 100644 --- a/modules/common/dap_chain_datum_tx_receipt.c +++ b/modules/common/dap_chain_datum_tx_receipt.c @@ -76,6 +76,11 @@ dap_chain_datum_tx_receipt_t *dap_chain_datum_tx_receipt_sign_add(dap_chain_datu } dap_chain_datum_tx_receipt_t *l_receipt = (dap_chain_datum_tx_receipt_t *) DAP_REALLOC(a_receipt, a_receipt->size + l_sign_size); + if (!l_receipt) + { + DAP_DELETE(l_sign); + return NULL; + } memcpy((byte_t *)l_receipt + l_receipt->size, l_sign, l_sign_size); l_receipt->size += l_sign_size; DAP_DELETE(l_sign); diff --git a/modules/consensus/block-pos/dap_chain_cs_block_pos.c b/modules/consensus/block-pos/dap_chain_cs_block_pos.c index da4c1390e4043dea0642f080d3ce6ecd4253d525..8207767d47d23ecdf3d1e3d4755c8f6d33b63c24 100644 --- a/modules/consensus/block-pos/dap_chain_cs_block_pos.c +++ b/modules/consensus/block-pos/dap_chain_cs_block_pos.c @@ -139,14 +139,12 @@ lb_err: if (l_tokens_hold[i]) DAP_DELETE(l_tokens_hold[i]); } - if (l_tokens_hold) - DAP_DELETE(l_tokens_hold); - if (l_pos_pvt->tokens_hold_value) - DAP_DELETE(l_pos_pvt->tokens_hold_value); - if (l_pos_pvt) + DAP_DEL_Z(l_tokens_hold); + if (l_pos_pvt) { + DAP_DEL_Z(l_pos_pvt->tokens_hold_value); DAP_DELETE(l_pos_pvt); - if (l_pos) - DAP_DELETE(l_pos); + } + DAP_DEL_Z(l_pos); l_blocks->_inheritor = NULL; l_blocks->callback_delete = NULL; l_blocks->callback_block_verify = NULL; diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index fc07881cdd7b3b05c836b5405fc795232edc8f80..5120db7e4e47d48c7788537573b45c14662fa11b 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -603,7 +603,7 @@ static void s_callback_round_event_to_chain_callback_get_round_item(dap_global_d char *l_event_hash_hex_str; dap_get_data_hash_str_static(l_new_atom, l_event_size, l_event_hash_hex_str); dap_chain_datum_t *l_datum = dap_chain_cs_dag_event_get_datum(l_new_atom, l_event_size); - l_dag->round_completed = l_new_atom->header.round_id ? l_new_atom->header.round_id : l_dag->round_completed + 1; + l_dag->round_completed = MAX(l_new_atom->header.round_id, l_dag->round_current); int l_verify_datum = dap_chain_net_verify_datum_for_add(l_dag->chain, l_datum, &l_chosen_item->round_info.datum_hash); if (!l_verify_datum) { dap_chain_atom_verify_res_t l_res = l_dag->chain->callback_atom_add(l_dag->chain, l_new_atom, l_event_size); @@ -622,7 +622,7 @@ static void s_callback_round_event_to_chain_callback_get_round_item(dap_global_d l_event_hash_hex_str, l_round_id, l_datum_hash_str, dap_chain_net_verify_datum_err_code_to_str(l_datum, l_verify_datum)); } } else { /* !l_chosen_item */ - l_dag->round_completed++; + l_dag->round_completed = l_dag->round_current; log_it(L_WARNING, "No candidates for round id %"DAP_UINT64_FORMAT_U, l_round_id); } @@ -696,11 +696,8 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c dap_chain_node_role_t l_role = dap_chain_net_get_role(l_cur_net); if (l_role.enums == NODE_ROLE_ROOT_MASTER || l_role.enums == NODE_ROLE_ROOT) { l_dag->callback_cs_event_round_sync = s_callback_event_round_sync; + l_dag->round_completed = l_dag->round_current++; log_it(L_MSG, "Round complete ID %"DAP_UINT64_FORMAT_U", current ID %"DAP_UINT64_FORMAT_U, l_dag->round_completed, l_dag->round_current); - if (l_dag->round_completed > l_dag->round_current) { - l_dag->round_completed = l_dag->round_current; - l_dag->round_current = l_dag->round_completed + 1; - } } return 0; } @@ -794,6 +791,10 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)a_value; size_t l_event_size = l_round_item->event_size; dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t*)DAP_DUP_SIZE(l_round_item->event_n_signs, l_event_size); + if (!l_event) { + log_it(L_CRITICAL, "Memory allocation failed"); + return -1; + } if (l_event->header.round_id < a_dag->round_completed) { struct round_timer_arg *l_round_active; uint64_t l_round_id = l_event->header.round_id; @@ -820,6 +821,10 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ size_t l_event_size_new = 0; int ret = 0; + if (l_event->header.round_id > a_dag->round_current) { + log_it(L_DEBUG, "Refresh current round ID [%lu -> %lu]", a_dag->round_current, l_event->header.round_id); + a_dag->round_current = l_event->header.round_id; + } if (!l_poa_pvt->callback_pre_sign || !l_poa_pvt->callback_pre_sign->callback || !(ret = l_poa_pvt->callback_pre_sign->callback(a_dag->chain, l_event, l_event_size, l_poa_pvt->callback_pre_sign->arg))) { diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 1cf47808c28ba78247a095e882208edc4938b819..043b3eb25e4d4e67c4e73f4b0ce5d7672ca7c276 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -766,7 +766,8 @@ static bool s_net_link_callback_connect_delayed(void *a_arg) { struct net_link *l_link = a_arg; dap_chain_node_client_t *l_client = l_link->link; - debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", NODE_ADDR_FP_ARGS_S(l_client->info->hdr.address)); + log_it(L_MSG, "Connecting to link "NODE_ADDR_FP_STR" [%s]", + NODE_ADDR_FP_ARGS_S(l_client->info->hdr.address), inet_ntoa(l_client->info->hdr.ext_addr_v4)); dap_chain_node_client_connect(l_client, "CN"); l_link->delay_timer = NULL; return false; @@ -786,7 +787,7 @@ static bool s_net_link_start(dap_chain_net_t *a_net, struct net_link *a_link, ui a_link->delay_timer = dap_timerfd_start(a_delay * 1000, s_net_link_callback_connect_delayed, a_link); return true; } - debug_if(s_debug_more, L_DEBUG, "Link "NODE_ADDR_FP_STR" started", NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address)); + log_it(L_MSG, "Connecting to link "NODE_ADDR_FP_STR" [%s]", NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address), inet_ntoa(l_link_info->hdr.ext_addr_v4)); return dap_chain_node_client_connect(l_client, "CN"); } @@ -1137,9 +1138,18 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla dap_chain_node_info_t *l_link_full_node = dap_chain_net_balancer_get_node(a_net->pub.name); if(l_link_full_node) { - log_it(L_DEBUG, "Network LOCAL balancer issues ip %s",inet_ntoa(l_link_full_node->hdr.ext_addr_v4)); pthread_rwlock_rdlock(&PVT(a_net)->states_lock); - s_net_link_add(a_net, l_link_full_node); + int l_net_link_add = s_net_link_add(a_net, l_link_full_node); + switch (l_net_link_add) { + case 0: + log_it(L_MSG, "Network LOCAL balancer issues link IP %s", inet_ntoa(l_link_full_node->hdr.ext_addr_v4)); + break; + case -1: + log_it(L_MSG, "Network LOCAL balancer: IP %s is already among links", inet_ntoa(l_link_full_node->hdr.ext_addr_v4)); + break; + default: + break; + } DAP_DELETE(l_link_full_node); struct net_link *l_free_link = s_get_free_link(a_net); if (l_free_link) @@ -1157,6 +1167,7 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla struct balancer_link_request *l_balancer_request = DAP_NEW_Z(struct balancer_link_request); if (!l_balancer_request) { log_it(L_ERROR, "Memory allocation error in s_new_balancer_link_request"); + DAP_DELETE(l_link_node_info); return false; } l_balancer_request->net = a_net; @@ -1232,7 +1243,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) json_object_object_add(l_json, "name" , json_object_new_string((const char*)a_net->pub.name)); json_object_object_add(l_json, "networkState" , json_object_new_string(dap_chain_net_state_to_str(PVT(a_net)->state))); json_object_object_add(l_json, "targetState" , json_object_new_string(dap_chain_net_state_to_str(PVT(a_net)->state_target))); - json_object_object_add(l_json, "linksCount" , json_object_new_int(HASH_COUNT(PVT(a_net)->net_links))); + json_object_object_add(l_json, "linksCount" , json_object_new_int(PVT(a_net)->net_links ? HASH_COUNT(PVT(a_net)->net_links) : 0)); json_object_object_add(l_json, "activeLinksCount" , json_object_new_int(s_net_get_active_links_count(a_net))); char l_node_addr_str[24] = {'\0'}; int l_tmp = PVT(a_net)->node_addr @@ -2612,7 +2623,7 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) l_net_pvt->node_info = DAP_NEW_Z(dap_chain_node_info_t); if (!l_net_pvt->node_info) { log_it(L_ERROR, "Memory allocation error in s_net_init"); - DAP_DEL_Z(l_net_pvt); + DAP_DEL_Z(l_node_addr); dap_config_close(l_cfg); return -1; } @@ -2657,7 +2668,6 @@ int s_net_init(const char * a_net_name, uint16_t a_acl_idx) if (!l_chains_dir) { log_it(L_ERROR, "Can't find any chains for network %s", l_net->pub.name); l_net_pvt->load_mode = false; - closedir(l_chains_dir); dap_config_close(l_cfg); return -2; } diff --git a/modules/net/dap_chain_net_balancer.c b/modules/net/dap_chain_net_balancer.c index 50aefc9b428a99a76569ef8f66299112c3a3d381..8f7ba35113c317f703509b74e09a86b086cad7c2 100644 --- a/modules/net/dap_chain_net_balancer.c +++ b/modules/net/dap_chain_net_balancer.c @@ -42,7 +42,7 @@ dap_chain_node_info_t *dap_chain_net_balancer_get_node(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_nodes_count = 0, l_nodes_selected_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); @@ -52,7 +52,7 @@ dap_chain_node_info_t *dap_chain_net_balancer_get_node(const char *a_net_name) for(size_t i=0;i<l_nodes_count;i++) { bool l_check = true; - for(dap_list_t *node_i = l_node_addr_list;node_i;node_i = node_i->next) + for(dap_list_t *node_i = l_node_addr_list; node_i; node_i = node_i->next) { struct in_addr *l_node_addr_cfg = (struct in_addr*)node_i->data; dap_chain_node_info_t *l_node_cand = (dap_chain_node_info_t *)l_objs[i].value; @@ -72,14 +72,13 @@ dap_chain_node_info_t *dap_chain_net_balancer_get_node(const char *a_net_name) l_node_num++; } } - dap_global_db_objs_delete(l_objs, l_nodes_count); dap_list_free(l_node_addr_list); - l_nodes_count = l_node_num; + l_nodes_selected_count = l_node_num; dap_chain_node_info_t *l_node_candidate; - if(l_nodes_count) + if(l_nodes_selected_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); + l_node_num = rand() % l_nodes_selected_count; + l_node_candidate = (dap_chain_node_info_t*)dap_list_nth_data(l_objs_list, l_node_num); dap_chain_node_info_t *l_node_info = DAP_NEW_Z(dap_chain_node_info_t); if (!l_node_info) { log_it(L_ERROR, "Memory allocation error in dap_chain_net_balancer_get_node"); @@ -88,12 +87,14 @@ dap_chain_node_info_t *dap_chain_net_balancer_get_node(const char *a_net_name) } memcpy(l_node_info, l_node_candidate, sizeof(dap_chain_node_info_t)); dap_list_free(l_objs_list); + dap_global_db_objs_delete(l_objs, l_nodes_count); return l_node_info; } else { dap_list_free(l_objs_list); - log_it(L_DEBUG, "Node list is empty"); + dap_global_db_objs_delete(l_objs, l_nodes_count); + log_it(L_ERROR, "Node list is empty"); return NULL; } } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 68f97ee6c25e5058559b8880f5634865fabb1287..9c980ef5a0206b882af0974303dd10f8d9ed4785 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -6746,6 +6746,7 @@ static uint8_t *s_concat_hash_and_mimetypes (dap_chain_hash_fast_t *a_chain_hash uint8_t *l_fullbuf = DAP_CALLOC(*a_fullsize, 1); if (!l_fullbuf) { log_it(L_ERROR, "Memory allocation error in s_concat_hash_and_mimetypes"); + DAP_DELETE(l_buf); return NULL; } uint8_t *l_s = l_fullbuf; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index bcdef7ed0673d4fdcbd0292675125cc817f52735..1b52fa685516e86c1210144a5ebb4c9fe2afcac2 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -193,6 +193,8 @@ static void s_history_callback_round_notify(dap_global_db_context_t *a_context, dap_chain_cs_dag_event_broadcast(l_dag, a_obj, a_context); if (dap_strcmp(a_obj->key, DAG_ROUND_CURRENT_KEY)) { // check key for round increment, if no than process event l_dag->callback_cs_event_round_sync(l_dag, a_obj->type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len); + } else { + log_it(L_INFO, "Global round ID: %lu", *(uint64_t*)a_obj->value); } } } @@ -700,10 +702,11 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da * or we have successfully chosen the hash(es) to link with. * No additional conditions required. */ - byte_t *l_current_round = dap_global_db_get_sync(DAG_ROUND_CURRENT_KEY, l_dag->gdb_group_events_round_new, NULL, NULL, NULL); - uint64_t l_round_current = MAX(l_current_round ? *(uint64_t*)l_current_round : 0, l_dag->round_completed) + 1; - DAP_DELETE(l_current_round); - l_dag->round_current = l_round_current; /* it's an atomic_store */ + byte_t *l_current_round_bytes = dap_global_db_get_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, NULL, NULL, NULL); + uint64_t l_current_round = l_current_round_bytes ? *(uint64_t*)l_current_round_bytes : 0; + DAP_DEL_Z(l_current_round_bytes); + l_dag->round_completed = l_current_round++; + l_dag->round_current = l_current_round; uint64_t l_event_size = 0; dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create ? l_dag->callback_cs_event_create(l_dag, a_datum, l_hashes, l_hashes_linked, &l_event_size) @@ -724,8 +727,8 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da } } - dap_global_db_set(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, - &l_round_current, sizeof(uint64_t), false, NULL, NULL); + dap_global_db_set_sync(l_dag->gdb_group_events_round_new, DAG_ROUND_CURRENT_KEY, + &l_current_round, sizeof(uint64_t), false); dap_chain_cs_dag_event_round_item_t l_round_item = { .round_info.datum_hash = l_datum_hash }; char *l_event_hash_str; dap_get_data_hash_str_static(l_event, l_event_size, l_event_hash_str); @@ -733,7 +736,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da log_it(l_res ? L_INFO : L_ERROR, l_res ? "Event %s placed in the new forming round [id %"DAP_UINT64_FORMAT_U"]" : "Can't add new event [%s] to the new events round [id %"DAP_UINT64_FORMAT_U"]", - l_event_hash_str, l_round_current); + l_event_hash_str, l_current_round); return l_res; } diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index c0f894574d23710b7b49beaef47ff5891e80fb67..34f407772ddfb2500e5585e438ddd71997d7086b 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -60,8 +60,7 @@ typedef struct dap_chain_cs_dag dap_chain_hash_fast_t static_genesis_event_hash; dap_chain_cs_dag_hal_item_t *hal; - atomic_uint_fast64_t round_current; - uint64_t round_completed; + atomic_uint_fast64_t round_current, round_completed; bool broadcast_disable; uint16_t datum_add_hashes_count;