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