From a7d681785d840bc3eee283e34732856518b61230 Mon Sep 17 00:00:00 2001
From: "roman.khlopkov" <roman.khlopkov@demlabs.net>
Date: Tue, 14 May 2024 19:08:33 +0300
Subject: [PATCH] [*] Nonconsensus fixes

---
 modules/chain/include/dap_chain.h     |  2 +-
 modules/net/dap_chain_net.c           |  3 +-
 modules/type/none/dap_chain_cs_none.c | 76 ++++++++-------------------
 3 files changed, 25 insertions(+), 56 deletions(-)

diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h
index d60ccae140..420891e4d0 100644
--- a/modules/chain/include/dap_chain.h
+++ b/modules/chain/include/dap_chain.h
@@ -84,7 +84,7 @@ typedef enum dap_chain_iter_op {
 typedef dap_chain_t* (*dap_chain_callback_new_t)(void);
 
 typedef void (*dap_chain_callback_t)(dap_chain_t *);
-typedef int (*dap_chain_callback_new_cfg_t)(dap_chain_t*, dap_config_t *);
+typedef int (*dap_chain_callback_new_cfg_t)(dap_chain_t *, dap_config_t *);
 typedef void (*dap_chain_callback_ptr_t)(dap_chain_t *, void * );
 
 typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_t)(dap_chain_t *, dap_chain_atom_ptr_t, size_t );
diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c
index 4ca57ad20e..a1767982f7 100644
--- a/modules/net/dap_chain_net.c
+++ b/modules/net/dap_chain_net.c
@@ -746,12 +746,13 @@ static dap_chain_net_t *s_net_new(dap_chain_net_id_t *a_id, const char *a_name,
  */
 void dap_chain_net_load_all()
 {
+    pthread_mutex_lock(&s_net_cond_lock);
     s_net_loading_count = HASH_COUNT(s_net_items);
     if (!s_net_loading_count) {
         log_it(L_ERROR, "Can't find any nets");
+        pthread_mutex_unlock(&s_net_cond_lock);
         return;
     }
-    pthread_mutex_lock(&s_net_cond_lock);
     dap_chain_net_item_t *l_net_items_current = NULL, *l_net_items_tmp = NULL;
     HASH_ITER(hh, s_net_items, l_net_items_current, l_net_items_tmp)
         dap_proc_thread_callback_add(NULL, s_net_load, l_net_items_current->chain_net);
diff --git a/modules/type/none/dap_chain_cs_none.c b/modules/type/none/dap_chain_cs_none.c
index dc36e54cdc..4c484f573b 100644
--- a/modules/type/none/dap_chain_cs_none.c
+++ b/modules/type/none/dap_chain_cs_none.c
@@ -54,8 +54,6 @@ typedef struct dap_nonconsensus_private {
     bool is_load_mode; // If load mode - not save when new atom adds
     char *group_datums;
     dap_chain_t *chain;
-    pthread_cond_t load_cond;
-    pthread_mutex_t load_mutex;
     dap_nonconsensus_datum_hash_item_t * hash_items;
 } dap_nonconsensus_private_t;
 
@@ -132,6 +130,12 @@ static void s_changes_callback_notify(dap_store_obj_t *a_obj, void *a_arg)
     s_nonconsensus_callback_atom_add(l_chain, (dap_chain_datum_t *)a_obj->value, a_obj->value_len);
 }
 
+int s_nonconsensus_callback_created(dap_chain_t *a_chain, dap_config_t UNUSED_ARG *a_chain_cfg)
+{
+    dap_chain_add_mempool_notify_callback(a_chain, s_nonconsensus_callback_mempool_notify, a_chain);
+    return 0;
+}
+
 /**
  * @brief configure chain gdb
  * Set atom element callbacks
@@ -171,10 +175,6 @@ static int s_cs_callback_new(dap_chain_t *a_chain, dap_config_t UNUSED_ARG *a_ch
         return -3;
     }
     dap_global_db_cluster_add_notify_callback(l_nonconsensus_cluster, s_changes_callback_notify, a_chain);
-    dap_chain_add_mempool_notify_callback(a_chain, s_nonconsensus_callback_mempool_notify, a_chain);
-
-    pthread_cond_init(&l_nochain_priv->load_cond, NULL);
-    pthread_mutex_init(&l_nochain_priv->load_mutex, NULL);
 
     a_chain->callback_delete = s_nonconsensus_delete;
     a_chain->callback_purge = s_nonconsensus_callback_purge;
@@ -205,6 +205,7 @@ static int s_cs_callback_new(dap_chain_t *a_chain, dap_config_t UNUSED_ARG *a_ch
     a_chain->callback_add_datums = s_nonconsensus_callback_datums_pool_proc;
 
     a_chain->callback_load_from_gdb = s_nonconsensus_ledger_load;
+    a_chain->callback_created = s_nonconsensus_callback_created;
 
     return 0;
 }
@@ -242,44 +243,6 @@ const char* dap_nonconsensus_get_group(dap_chain_t * a_chain)
 }
 
 
-/**
- * @brief s_ledger_load_callback
- * @param a_global_db_context
- * @param a_rc
- * @param a_group
- * @param a_key
- * @param a_values_total
- * @param a_values_shift
- * @param a_values_count
- * @param a_values
- * @param a_arg
- */
-static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_instance_t *a_dbi,
-                                   UNUSED_ARG int a_rc, UNUSED_ARG const char *a_group,
-                                   UNUSED_ARG const size_t a_values_total, const size_t a_values_count,
-                                   dap_global_db_obj_t *a_values, void *a_arg)
-{
-    assert(a_arg);
-    dap_chain_t * l_chain = (dap_chain_t *) a_arg;
-    assert(l_chain);
-    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(l_chain);
-    assert(l_nochain);
-    dap_nonconsensus_private_t * l_nochain_pvt = PVT(l_nochain);
-    assert(l_nochain_pvt);
-    // make list of datums
-    for(size_t i = 0; i < a_values_count; i++) {
-        dap_global_db_obj_t *it = a_values + i;
-        s_nonconsensus_callback_atom_add(l_chain, it->value, it->value_len);
-        log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", it->key, l_nochain_pvt->group_datums);
-    }
-
-    pthread_mutex_lock(&l_nochain_pvt->load_mutex);
-    l_nochain_pvt->is_load_mode = false;
-    pthread_cond_broadcast(&l_nochain_pvt->load_cond);
-    pthread_mutex_unlock(&l_nochain_pvt->load_mutex);
-    return true;
-}
-
 /**
  * @brief Load ledger from mempool
  *
@@ -289,16 +252,20 @@ static bool s_ledger_load_callback(UNUSED_ARG dap_global_db_instance_t *a_dbi,
  */
 static void s_nonconsensus_ledger_load(dap_chain_t *a_chain)
 {
-    dap_nonconsensus_t * l_nochain = DAP_NONCONSENSUS(a_chain);
-    dap_nonconsensus_private_t * l_nochain_pvt = PVT(l_nochain);
-    // load ledger
-    l_nochain_pvt->is_load_mode = true;
+    dap_nonconsensus_t *l_nochain = DAP_NONCONSENSUS(a_chain);
+    dap_nonconsensus_private_t *l_nochain_pvt = PVT(l_nochain);
+    size_t l_values_count = 0;
     //  Read the entire database into an array of size bytes
-    pthread_mutex_lock(&l_nochain_pvt->load_mutex);
-    dap_global_db_get_all(l_nochain_pvt->group_datums, 0, s_ledger_load_callback, a_chain);
-    while (l_nochain_pvt->is_load_mode)
-        pthread_cond_wait(&l_nochain_pvt->load_cond, &l_nochain_pvt->load_mutex);
-    pthread_mutex_unlock(&l_nochain_pvt->load_mutex);
+    dap_global_db_obj_t *l_values = dap_global_db_get_all_sync(l_nochain_pvt->group_datums, &l_values_count);
+    // make list of datums
+    for (size_t i = 0; l_values && i < l_values_count; i++) {
+        dap_global_db_obj_t *it = l_values + i;
+        // load ledger
+        s_nonconsensus_callback_atom_add(a_chain, it->value, it->value_len);
+        log_it(L_DEBUG,"Load mode, doesn't save item %s:%s", it->key, l_nochain_pvt->group_datums);
+    }
+    dap_global_db_objs_delete(l_values, l_values_count);
+    l_nochain_pvt->is_load_mode = false;
 }
 
 /**
@@ -450,7 +417,8 @@ static dap_chain_atom_ptr_t s_nonconsensus_callback_atom_iter_find_by_hash(dap_c
     dap_nonconsensus_t *l_nochain = DAP_NONCONSENSUS(a_atom_iter->chain);
     if (l_nochain) {
         l_ret = dap_global_db_get_sync(PVT(l_nochain)->group_datums, l_key, &l_ret_size, NULL, NULL);
-        *a_atom_size = l_ret_size;
+        if (a_atom_size)
+            *a_atom_size = l_ret_size;
     }
     //TODO set a_atom_iter item field
     return l_ret;
-- 
GitLab