From 71b0a53192420a510b8ab89457f60a49aad72f13 Mon Sep 17 00:00:00 2001
From: "Constantin P." <papizh.konstantin@demlabs.net>
Date: Fri, 25 Oct 2024 13:58:14 +0700
Subject: [PATCH] Net loading moved to regular threads

---
 modules/net/dap_chain_net.c               | 36 ++++++++++++++++-------
 modules/net/dap_chain_node_cli_cmd.c      |  2 +-
 modules/type/blocks/dap_chain_cs_blocks.c |  4 +--
 3 files changed, 29 insertions(+), 13 deletions(-)

diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index e2939a9da6..2677fe14db 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -191,9 +191,9 @@ typedef struct dap_chain_net_pvt{
 #define PVT_S(a) ((dap_chain_net_pvt_t *)a.pvt)
 
 static dap_chain_net_t *s_nets_by_name = NULL, *s_nets_by_id = NULL;
-static pthread_mutex_t s_net_cond_lock = PTHREAD_MUTEX_INITIALIZER;
-static pthread_cond_t s_net_cond = PTHREAD_COND_INITIALIZER;
-static uint16_t s_net_loading_count = 0;
+//static pthread_mutex_t s_net_cond_lock = PTHREAD_MUTEX_INITIALIZER;
+//static pthread_cond_t s_net_cond = PTHREAD_COND_INITIALIZER;
+//static uint16_t s_net_loading_count = 0;
 
 static const char *c_net_states[] = {
     [NET_STATE_LOADING]             = "NET_STATE_LOADING",
@@ -230,7 +230,7 @@ static void s_net_states_notify(dap_chain_net_t * l_net);
 static void s_nodelist_change_notify(dap_store_obj_t *a_obj, void *a_arg);
 //static void s_net_proc_kill( dap_chain_net_t * a_net );
 static int s_net_init(const char *a_net_name, const char *a_path, uint16_t a_acl_idx);
-static bool s_net_load(void *a_arg);
+static void *s_net_load(void *a_arg);
 static int s_net_try_online(dap_chain_net_t *a_net);
 static int s_cli_net(int argc, char ** argv, void **a_str_reply);
 static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash);
@@ -765,7 +765,22 @@ bool s_net_disk_load_notify_callback(UNUSED_ARG void *a_arg) {
  */
 void dap_chain_net_load_all()
 {
-    pthread_mutex_lock(&s_net_cond_lock);
+    uint16_t l_nets_count = HASH_COUNT(s_nets_by_name);
+    if (!l_nets_count)
+        return log_it(L_ERROR, "No networks initialized!");
+    pthread_t l_tids[l_nets_count];
+    dap_chain_net_t *l_net = s_nets_by_name;
+    dap_timerfd_t *l_load_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)s_net_disk_load_notify_callback, NULL);
+    for (int i = 0; i < l_nets_count; ++i) {
+        pthread_create(&l_tids[i], NULL, s_net_load, l_net);
+        l_net = l_net->hh.next;
+    }
+    for (int i = 0; i < l_nets_count; ++i) {
+        pthread_join(l_tids[i], NULL);
+    }
+    dap_timerfd_delete_mt(l_load_notify_timer->worker, l_load_notify_timer->esocket_uuid);
+
+    /*pthread_mutex_lock(&s_net_cond_lock);
     s_net_loading_count = HASH_COUNT(s_nets_by_name);
     if (!s_net_loading_count) {
         log_it(L_ERROR, "Can't find any nets");
@@ -780,7 +795,7 @@ void dap_chain_net_load_all()
     }
     int l_net_counter = 0;
     uint32_t l_cpu_count = dap_get_cpu_count();
-    dap_timerfd_t *l_load_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)s_net_disk_load_notify_callback, NULL);
+    
     for (dap_chain_net_t *net = s_nets_by_name; net; net = net->hh.next) {
         dap_proc_thread_create(l_net_threads + l_net_counter, dap_random_byte() % l_cpu_count);
         dap_proc_thread_callback_add(l_net_threads + l_net_counter, s_net_load, net);
@@ -793,7 +808,7 @@ void dap_chain_net_load_all()
         dap_context_stop_n_kill(l_net_threads[i].context);
     DAP_DELETE(l_net_threads);
     pthread_mutex_unlock(&s_net_cond_lock);
-    dap_timerfd_delete_mt(l_load_notify_timer->worker, l_load_notify_timer->esocket_uuid);
+    dap_timerfd_delete_mt(l_load_notify_timer->worker, l_load_notify_timer->esocket_uuid);*/
 }
 
 dap_string_t* dap_cli_list_net()
@@ -1984,7 +1999,7 @@ int s_net_init(const char *a_net_name, const char *a_path, uint16_t a_acl_idx)
     return 0;
 }
 
-bool s_net_load(void *a_arg)
+static void *s_net_load(void *a_arg)
 {
     dap_chain_net_t *l_net = a_arg;
     int l_err_code = 0;
@@ -2223,11 +2238,12 @@ bool s_net_load(void *a_arg)
 ret:
     if (l_err_code)
         log_it(L_ERROR, "Loading chains of net %s finished with (%d) error code.", l_net->pub.name, l_err_code);
-    pthread_mutex_lock(&s_net_cond_lock);
+    /*pthread_mutex_lock(&s_net_cond_lock);
     s_net_loading_count--;
     pthread_cond_signal(&s_net_cond);
     pthread_mutex_unlock(&s_net_cond_lock);
-    return false;
+    return false;*/
+    return NULL;
 }
 
 dap_global_db_cluster_t *dap_chain_net_get_mempool_cluster(dap_chain_t *a_chain)
diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c
index ca0232f229..644a40e19f 100644
--- a/modules/net/dap_chain_node_cli_cmd.c
+++ b/modules/net/dap_chain_node_cli_cmd.c
@@ -4031,7 +4031,7 @@ void _cmd_find_type_decree_in_chain(json_object *a_out, dap_chain_t *a_chain, ui
                                                                                        &l_datum_count);
                 json_object *l_obj_atom = json_object_new_object();
                 char l_buff_ts[50] = {'\0'};
-                dap_time_to_str_rfc822(&l_buff_ts, 50, l_atom_iter->cur_ts);
+                dap_time_to_str_rfc822(l_buff_ts, 50, l_atom_iter->cur_ts);
                 for (size_t i = 0; i < l_datum_count; i++) {
                     dap_chain_datum_t *l_datum = l_datums[i];
                     if (l_datum[i].header.type_id != DAP_CHAIN_DATUM_DECREE) continue;
diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c
index c9f9d33df4..f39003622d 100644
--- a/modules/type/blocks/dap_chain_cs_blocks.c
+++ b/modules/type/blocks/dap_chain_cs_blocks.c
@@ -465,8 +465,8 @@ static void s_cli_meta_hash_print(json_object* a_json_obj_out, const char *a_met
 {
     if (a_meta->hdr.data_size == sizeof (dap_chain_hash_fast_t)) {
         const char *l_hash_str = !dap_strcmp(a_hash_out_type, "base58") ?
-                dap_enc_base58_encode_hash_to_str_static(a_meta->data) :
-                dap_chain_hash_fast_to_str_static(a_meta->data);
+                dap_enc_base58_encode_hash_to_str_static((dap_chain_hash_fast_t*)a_meta->data) :
+                dap_chain_hash_fast_to_str_static((dap_chain_hash_fast_t*)a_meta->data);
         json_object_object_add(a_json_obj_out, a_meta_title, json_object_new_string(l_hash_str));
 //        if (dap_strcmp(a_hash_out_type, "base58")) {
 //            const char *l_hash_str = dap_enc_base58_encode_hash_to_str_static(a_meta->data);
-- 
GitLab