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