From 6cd6aeb7a55d3ff30b2fc80dba2c3ed7e22b6ee2 Mon Sep 17 00:00:00 2001 From: "roman.khlopkov" <roman.khlopkov@demlabs.net> Date: Fri, 2 Aug 2024 18:39:24 +0300 Subject: [PATCH] [*] Autocollect repair --- dap-sdk | 2 +- .../consensus/esbocs/dap_chain_cs_esbocs.c | 16 +++++-- modules/type/blocks/dap_chain_cs_blocks.c | 46 ++++++++++--------- 3 files changed, 36 insertions(+), 28 deletions(-) diff --git a/dap-sdk b/dap-sdk index 2a84146f1d..7cb4e6b9c8 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit 2a84146f1d73c7690497762be1e922b4ecbe20ef +Subproject commit 7cb4e6b9c8efa99c492cbd2ca68f9424647f1122 diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index fa0f643fe0..b7f5204d98 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -324,6 +324,7 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d const size_t a_value_size, dap_nanotime_t UNUSED_ARG a_value_ts, bool UNUSED_ARG a_is_pinned, void *a_arg) { + static pthread_rwlock_t s_collecting_lock = PTHREAD_RWLOCK_INITIALIZER; bool l_fee_collect = strstr(a_group, "fee"); if (a_rc != DAP_GLOBAL_DB_RC_SUCCESS) { log_it(L_ERROR, "Can't add block with hash %s to autocollect %s list", a_key, l_fee_collect ? "fee" : "reward"); @@ -335,6 +336,7 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d bool l_level_reached = false; uint256_t l_value_total = uint256_0; size_t l_objs_count = 0; + pthread_rwlock_wrlock(&s_collecting_lock); dap_global_db_obj_t *l_objs = dap_global_db_get_all_sync(a_group, &l_objs_count); if (l_objs_count >= 10) { for (size_t i = 0; i < l_objs_count; i++) { @@ -365,8 +367,10 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d DAP_DELETE(l_tx_hash_str); } else log_it(L_ERROR, "%s collect transaction creation error", l_fee_collect ? "Fee" : "Reward"); - dap_global_db_del_sync(a_group, NULL); + for (size_t i = 0; i < l_objs_count; i++) + dap_global_db_del_sync(a_group, l_objs[i].key); } + pthread_rwlock_unlock(&s_collecting_lock); DAP_DELETE(l_block_collect_params); dap_global_db_objs_delete(l_objs, l_objs_count); } @@ -445,7 +449,9 @@ bool dap_chain_esbocs_get_autocollect_status(dap_chain_net_id_t a_net_id) dap_chain_esbocs_session_t *l_session; DL_FOREACH(s_session_items, l_session) { if (l_session->chain->net_id.uint64 == a_net_id.uint64) { - if (l_session->esbocs && l_session->esbocs->_pvt && PVT(l_session->esbocs)->collecting_addr && + if (l_session->esbocs && l_session->esbocs->_pvt && + PVT(l_session->esbocs)->block_sign_pkey && + PVT(l_session->esbocs)->collecting_addr && !dap_chain_addr_is_blank(PVT(l_session->esbocs)->collecting_addr)) return true; else @@ -462,8 +468,8 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf dap_chain_esbocs_pvt_t *l_esbocs_pvt = PVT(l_esbocs); l_esbocs_pvt->collecting_addr = dap_chain_addr_from_str(dap_config_get_item_str(a_chain_net_cfg, "esbocs", "fee_addr")); - l_esbocs_pvt->collecting_level = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "set_collect_fee", "10.0")); - + l_esbocs_pvt->collecting_level = dap_chain_coins_to_balance(dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "collecting_level", + dap_config_get_item_str_default(a_chain_net_cfg, "esbocs", "set_collect_fee", "10.0"))); dap_list_t *l_validators = dap_chain_net_srv_stake_get_validators(a_chain->net_id, false, NULL); for (dap_list_t *it = l_validators; it; it = it->next) { dap_stream_node_addr_t *l_addr = &((dap_chain_net_srv_stake_item_t *)it->data)->node_addr; @@ -571,7 +577,7 @@ static int s_callback_created(dap_chain_t *a_chain, dap_config_t *a_chain_net_cf dap_global_db_objs_delete(l_orders, l_orders_count); if (IS_ZERO_256(l_esbocs_pvt->minimum_fee)) { - log_it(L_ERROR, "No valid order found was signed by this validator deledgated key. Switch off validator mode."); + log_it(L_ERROR, "No valid order found was signed by this validator delegated key. Switch off validator mode."); return -4; } l_esbocs_pvt->emergency_mode = dap_config_get_item_bool_default(a_chain_net_cfg, "esbocs", "emergency_mode", false); diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 3acac0e63e..2f9b7cadd5 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -99,7 +99,7 @@ typedef struct dap_chain_cs_blocks_pvt log_it(L_DEBUG, "Unlocked rwqlock, %s, %d, thread_id=%u", __FUNCTION__, __LINE__, dap_gettid()); static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, void **a_str_reply,const char * a_param, dap_chain_hash_fast_t * a_datum_hash); -static void s_cli_meta_hash_print( json_object* json_obj_a, const char * a_meta_title, dap_chain_block_meta_t * a_meta); +static void s_cli_meta_hash_print( json_object* a_json_obj_out, const char * a_meta_title, dap_chain_block_meta_t * a_meta); static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply); // Setup BFT consensus and select the longest chunk @@ -455,14 +455,14 @@ static int s_cli_parse_cmd_hash(char ** a_argv, int a_arg_index, int a_argc, voi * @param a_meta_title * @param a_meta */ -static void s_cli_meta_hash_print(json_object* json_obj_a, const char *a_meta_title, dap_chain_block_meta_t *a_meta) +static void s_cli_meta_hash_print(json_object* a_json_obj_out, const char *a_meta_title, dap_chain_block_meta_t *a_meta) { if (a_meta->hdr.data_size == sizeof (dap_chain_hash_fast_t)) { char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; dap_chain_hash_fast_to_str((dap_chain_hash_fast_t *)a_meta->data, l_hash_str, sizeof(l_hash_str)); - json_object_object_add(json_obj_a, a_meta_title, json_object_new_string(l_hash_str)); + json_object_object_add(a_json_obj_out, a_meta_title, json_object_new_string(l_hash_str)); } else - json_object_object_add(json_obj_a, a_meta_title, json_object_new_string("Error, hash size is incorrect")); + json_object_object_add(a_json_obj_out, a_meta_title, json_object_new_string("Error, hash size is incorrect")); } /** @@ -471,27 +471,18 @@ static void s_cli_meta_hash_print(json_object* json_obj_a, const char *a_meta_ti * @param a_meta_title * @param a_meta */ -static void s_cli_meta_hex_print(json_object* json_obj_a, const char * a_meta_title, dap_chain_block_meta_t * a_meta) +static void s_cli_meta_hex_print(json_object* a_json_obj_out, const char * a_meta_title, dap_chain_block_meta_t * a_meta) { char *l_data_hex = DAP_NEW_Z_SIZE(char, a_meta->hdr.data_size * 2 + 3); dap_bin2hex(l_data_hex, a_meta->data, a_meta->hdr.data_size); char l_tmp_buff[70]={0}; sprintf(l_tmp_buff,"0x%s\n", l_data_hex); - json_object_object_add(json_obj_a, a_meta_title, json_object_new_string(l_tmp_buff)); + json_object_object_add(a_json_obj_out, a_meta_title, json_object_new_string(l_tmp_buff)); DAP_DELETE(l_data_hex); } -static void s_print_autocollect_table(dap_chain_net_t *a_net, json_object* json_obj_a, const char *a_table_name) +static void s_print_autocollect_table(dap_chain_net_t *a_net, json_object *a_json_obj_out, const char *a_table_name) { - bool l_status = dap_chain_esbocs_get_autocollect_status(a_net->pub.id); - char l_tmp_buff[150]={0}; - sprintf(l_tmp_buff,"for %s in network %s is %s\n", a_table_name, a_net->pub.name, - l_status ? "active" : "inactive, cause the network config or consensus starting problems"); - json_object_object_add(json_obj_a, "Autocollect status", json_object_new_string(l_tmp_buff)); - if (!l_status) - return; - sprintf(l_tmp_buff,"\nAutocollect tables content for:\n=== %s ===\n", a_table_name); - json_object_object_add(json_obj_a, "Autocollect status", json_object_new_string(l_tmp_buff)); size_t l_objs_count = 0; char *l_group = dap_strcmp(a_table_name, "Fees") ? dap_chain_cs_blocks_get_reward_group(a_net->pub.name) : dap_chain_cs_blocks_get_fee_group(a_net->pub.name); @@ -504,12 +495,14 @@ static void s_print_autocollect_table(dap_chain_net_t *a_net, json_object* json_ dap_global_db_obj_t *l_obj_cur = l_objs + i; uint256_t l_cur_value = *(uint256_t*)l_obj_cur->value; const char *l_value_str; dap_uint256_to_char(l_cur_value, &l_value_str); - json_object_object_add(json_obj_t, "obj_key",json_object_new_string(l_obj_cur->key)); - json_object_object_add(json_obj_t, "obj_val",json_object_new_string(l_value_str)); + json_object_object_add(json_obj_t, "obj_key", json_object_new_string(l_obj_cur->key)); + json_object_object_add(json_obj_t, "obj_val", json_object_new_string(l_value_str)); json_object_array_add(json_arr_out, json_obj_t); SUM_256_256(l_total_value, l_cur_value, &l_total_value); } - json_object_object_add(json_obj_a,"Autocollect tables",json_arr_out); + char l_tmp_buff[256]; + sprintf(l_tmp_buff,"Autocollect tables content for === %s ===", a_table_name); + json_object_object_add(a_json_obj_out, l_tmp_buff, json_arr_out); if (l_objs_count) { dap_global_db_objs_delete(l_objs, l_objs_count); uint256_t l_collect_fee = dap_chain_esbocs_get_fee(a_net->pub.id); @@ -531,12 +524,14 @@ static void s_print_autocollect_table(dap_chain_net_t *a_net, json_object* json_ char *l_profit_str = dap_chain_balance_to_coins(l_collect_value); char *l_tax_str = dap_chain_balance_to_coins(l_collect_tax); char *l_fee_str = dap_chain_balance_to_coins(l_collect_fee); - sprintf(l_tmp_buff,"\nTotal prepared value: %s %s, where\n\tprofit is %s, tax is %s, fee is %s\n", + sprintf(l_tmp_buff,"Total prepared value: %s %s, where profit is %s, tax is %s, fee is %s\n", l_total_str, a_net->pub.native_ticker, l_profit_str, l_tax_str, l_fee_str); - json_object_object_add(json_obj_a, "status",json_object_new_string(l_tmp_buff)); DAP_DEL_MULTY(l_total_str, l_profit_str, l_tax_str, l_fee_str); } else - json_object_object_add(json_obj_a, "status",json_object_new_string("Empty\n")); + strcpy(l_tmp_buff, "Empty"); + char l_status_buf[32]; + sprintf(l_status_buf, "%s status", a_table_name); + json_object_object_add(a_json_obj_out, l_status_buf, json_object_new_string(l_tmp_buff)); } /** @@ -1333,6 +1328,13 @@ static int s_cli_blocks(int a_argc, char ** a_argv, void **a_str_reply) return DAP_CHAIN_NODE_CLI_COM_BLOCK_PARAM_ERR; } json_object* json_obj_out = json_object_new_object(); + bool l_status = dap_chain_esbocs_get_autocollect_status(l_net->pub.id); + char l_tmp_buff[150]={0}; + sprintf(l_tmp_buff, "for network %s is %s\n", l_net->pub.name, + l_status ? "active" : "inactive, cause the network config or consensus starting problems"); + json_object_object_add(json_obj_out, "Autocollect status", json_object_new_string(l_tmp_buff)); + if (!l_status) + break; s_print_autocollect_table(l_net, json_obj_out, "Fees"); s_print_autocollect_table(l_net, json_obj_out, "Rewards"); json_object_array_add(*json_arr_reply, json_obj_out); -- GitLab