From f00e097b25a5d5853fcef57bed63d5ad8767b4ec Mon Sep 17 00:00:00 2001 From: "Constantin P." <papizh.konstantin@demlabs.net> Date: Tue, 1 Oct 2024 14:40:25 +0700 Subject: [PATCH] Even more fixes --- .../consensus/dag-poa/dap_chain_cs_dag_poa.c | 34 +++++++++---------- modules/type/dag/dap_chain_cs_dag.c | 7 ++-- modules/type/dag/dap_chain_cs_dag_event.c | 22 +++++++----- modules/type/dag/include/dap_chain_cs_dag.h | 2 -- .../type/dag/include/dap_chain_cs_dag_event.h | 5 ++- 5 files changed, 34 insertions(+), 36 deletions(-) diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index 10306fb5a1..96de9aeb9c 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -85,10 +85,10 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size); static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_round_item_t *a_arg); static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group, - const char *a_key, const void *a_value, const size_t a_value_size); + const char *a_key, const void *a_value, const size_t a_value_size, bool a_by_us); static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_t *a_event, size_t a_event_size, char *a_event_hash_hex_str); -static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item); +static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item, uint32_t a_timeout_s); // CLI commands static int s_cli_dag_poa(int argc, char ** argv, void **a_str_reply); @@ -291,7 +291,7 @@ static int s_cli_dag_poa(int argc, char ** argv, void **a_str_reply) .datum_hash = l_round_item->round_info.datum_hash, .dag = l_dag }; - s_round_event_cs_done(&l_event_item); + s_round_event_cs_done(&l_event_item, l_poa_pvt->confirmations_timeout); } } else { if(!dap_strcmp(l_hash_out_type, "hex")) { @@ -604,8 +604,7 @@ static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_d } } } else /* !l_chosen_item */ - log_it(L_WARNING, "No valid candidates to wrap datum %s in current round #%"DAP_UINT64_FORMAT_U"", - l_datum_hash_str, l_dag->round_id); + log_it(L_WARNING, "No valid candidates to wrap datum %s in current round", l_datum_hash_str); return DAP_DELETE(l_arg), true; } @@ -620,7 +619,7 @@ static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_round_item_t *a false; } -static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item) +static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item, uint32_t a_timeout_s) { dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT( DAP_CHAIN_CS_DAG_POA(a_event_item->dag) ); dap_chain_cs_dag_poa_round_item_t *l_event_item = NULL; @@ -628,7 +627,7 @@ static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_ite HASH_FIND(hh, l_poa_pvt->event_items, &a_event_item->datum_hash, sizeof(dap_hash_fast_t), l_event_item); if (!l_event_item) { l_event_item = DAP_DUP(a_event_item); - if ( !dap_timerfd_start(l_poa_pvt->confirmations_timeout * 1000, (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_event_item) ) + if ( !dap_timerfd_start(a_timeout_s * 1000, (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_event_item) ) return DAP_DELETE(l_event_item), pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock), log_it(L_CRITICAL, "Timer creation failed"); HASH_ADD(hh, l_poa_pvt->event_items, datum_hash, sizeof(dap_hash_fast_t), l_event_item); log_it(L_INFO, "Confirmation timer for datum %s started [%d s]", @@ -643,7 +642,7 @@ static bool s_callback_sync_all_on_start(dap_global_db_instance_t *a_dbi, int a_ { for (size_t i = 0; i < a_values_count; i++) s_callback_event_round_sync((dap_chain_cs_dag_t *)a_arg, DAP_GLOBAL_DB_OPTYPE_ADD, a_group, - a_values[i].key, a_values[i].value, a_values[i].value_len); + a_values[i].key, a_values[i].value, a_values[i].value_len, true); return false; } @@ -659,7 +658,8 @@ static void s_round_changes_notify(dap_store_obj_t *a_obj, void *a_arg) return; switch ( l_type ) { case DAP_GLOBAL_DB_OPTYPE_ADD: - s_callback_event_round_sync(l_dag, l_type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len); + s_callback_event_round_sync(l_dag, l_type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len, + dap_stream_node_addr_from_sign(a_obj->sign).uint64 == g_node_addr.uint64); default: break; } @@ -699,7 +699,6 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c dap_global_db_cluster_add_notify_callback(l_dag_cluster, s_round_changes_notify, l_dag); dap_chain_net_add_auth_nodes_to_cluster(l_net, l_dag_cluster); dap_link_manager_add_net_associate(l_net->pub.id.uint64, l_dag_cluster->links_cluster); - l_dag->round_id = 0; PVT(l_poa)->mempool_timer = dap_interval_timer_create(15000, s_timer_process_callback, a_chain); switch ( dap_chain_net_get_role(l_net).enums ) { @@ -762,11 +761,11 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a log_it(L_ERROR, "Can't sign event with events_sign_cert in [dag-poa] section"); else if ( s_seed_mode || (a_hashes && a_hashes_count) ) { if ( !PVT(l_poa)->callback_pre_sign || !PVT(l_poa)->callback_pre_sign->callback) { - return dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_dag->round_id, - a_datum, PVT(l_poa)->events_sign_cert->enc_key, - a_hashes, a_hashes_count, a_event_size); + return dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_datum, + PVT(l_poa)->events_sign_cert->enc_key, + a_hashes, a_hashes_count, a_event_size); } else { - dap_chain_cs_dag_event_t *l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_dag->round_id, + dap_chain_cs_dag_event_t *l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_datum, NULL, a_hashes, a_hashes_count, a_event_size); if ( PVT(l_poa)->callback_pre_sign->callback(a_dag->chain, l_event, *a_event_size, PVT(l_poa)->callback_pre_sign->arg) ) return DAP_DELETE(l_event), NULL; @@ -778,7 +777,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a } static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group, - const char *a_key, const void *a_value, const size_t a_value_size) + const char *a_key, const void *a_value, const size_t a_value_size, bool a_by_us) { dap_return_val_if_pass(a_op_code != DAP_GLOBAL_DB_OPTYPE_ADD || !a_key || !a_value || !a_value_size || !strcmp(DAG_ROUND_CURRENT_KEY, a_key), 0); @@ -799,9 +798,8 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_ if ( dap_chain_cs_dag_event_sign_exists(l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key) ) { if (l_poa_pvt->auto_round_complete && s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, (char*)a_key) ) { dap_chain_cs_dag_poa_round_item_t l_event_item = { .datum_hash = l_round_item->round_info.datum_hash, .dag = a_dag }; - return s_round_event_cs_done(&l_event_item), l_ret; - } else - return log_it(L_INFO, "Event %s is already signed by us", a_key), l_ret; + return s_round_event_cs_done(&l_event_item, a_by_us ? l_poa_pvt->confirmations_timeout : 2*l_poa_pvt->confirmations_timeout), l_ret; + } } else { if ( !l_poa_pvt->callback_pre_sign || !l_poa_pvt->callback_pre_sign->callback diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 2cb6b3b806..f81527ebc8 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -679,7 +679,6 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da * or we have successfully chosen the hash(es) to link with. * No additional conditions required. */ - ++l_dag->round_id; uint64_t l_event_size = 0; dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create ? l_dag->callback_cs_event_create(l_dag, a_datum, l_hashes, l_hashes_linked, &l_event_size) @@ -706,9 +705,9 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_hex_str, l_event, l_event_size, &l_round_item); DAP_DELETE(l_event); log_it(l_res ? L_INFO : L_ERROR, - l_res ? "Event %s placed into new forming round [id %"DAP_UINT64_FORMAT_U"]" - : "Can't add new event %s to new events round [id %"DAP_UINT64_FORMAT_U"]", - l_event_hash_hex_str, l_dag->round_id); + l_res ? "Event %s placed into new forming round" + : "Can't add new event %s to new events round", + l_event_hash_hex_str); return l_res; } diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c index 08faedc0af..c9d769f044 100644 --- a/modules/type/dag/dap_chain_cs_dag_event.c +++ b/modules/type/dag/dap_chain_cs_dag_event.c @@ -43,9 +43,9 @@ * @param a_hashes_count * @return */ -dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, uint64_t a_round_id, - dap_chain_datum_t *a_datum, dap_enc_key_t *a_key, - dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size) +dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, + dap_chain_datum_t *a_datum, dap_enc_key_t *a_key, dap_chain_hash_fast_t *a_hashes, + size_t a_hashes_count, size_t *a_event_size) { assert(a_event_size); size_t l_hashes_size = sizeof(*a_hashes) * a_hashes_count, @@ -53,7 +53,7 @@ dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, l_event_size = sizeof(dap_chain_class_dag_event_hdr_t) + l_hashes_size + l_datum_size; dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size); *l_event_new = (dap_chain_cs_dag_event_t) { - { // .round_id = a_round_id, + { .ts_created = dap_time_now(), .chain_id = a_chain_id, .cell_id = a_cell_id, @@ -154,11 +154,13 @@ size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, s size_t l_event_size_excl_sign = dap_chain_cs_dag_event_calc_size_excl_signs(l_event, a_event_size); dap_sign_t *l_sign = dap_sign_create(a_key, l_event, l_event_size_excl_sign, 0); size_t l_sign_size = dap_sign_get_size(l_sign); - *a_event_ptr = l_event = DAP_REALLOC(l_event, a_event_size + l_sign_size); + if (! (l_event = DAP_REALLOC(*a_event_ptr, a_event_size + l_sign_size) )) + return log_it(L_CRITICAL, "Memory allocation error"), DAP_DELETE(l_sign), a_event_size; size_t l_event_size = a_event_size - sizeof(l_event->header); memcpy(l_event->hashes_n_datum_n_signs + l_event_size, l_sign, l_sign_size); l_event->header.signs_count++; DAP_DELETE(l_sign); + *a_event_ptr = l_event; return a_event_size + l_sign_size; } @@ -237,12 +239,14 @@ size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t return 0; dap_sign_t * l_sign = dap_sign_create(a_key, &l_round_item->round_info.datum_hash, sizeof(dap_chain_hash_fast_t), 0); size_t l_sign_size = dap_sign_get_size(l_sign); - size_t l_offset = (size_t)l_round_item->data_size; - *a_round_item_ptr = l_round_item = DAP_REALLOC(l_round_item, a_round_item_size+l_sign_size); - memcpy(l_round_item->event_n_signs+l_offset, l_sign, l_sign_size); + size_t l_offset = l_round_item->data_size; + if (! (l_round_item = DAP_REALLOC(*a_round_item_ptr, a_round_item_size + l_sign_size)) ) + return log_it(L_CRITICAL, "Memory allocaton error"), DAP_DELETE(l_sign), a_round_item_size; + memcpy(l_round_item->event_n_signs + l_offset, l_sign, l_sign_size); DAP_DELETE(l_sign); l_round_item->data_size += (uint32_t)l_sign_size; - return a_round_item_size+l_sign_size; + *a_round_item_ptr = l_round_item; + return a_round_item_size + l_sign_size; } /** diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h index 42fc9e30dd..f28f7baf3c 100644 --- a/modules/type/dag/include/dap_chain_cs_dag.h +++ b/modules/type/dag/include/dap_chain_cs_dag.h @@ -61,8 +61,6 @@ typedef struct dap_chain_cs_dag dap_chain_hash_fast_t static_genesis_event_hash; dap_chain_cs_dag_hal_item_t *hal; - atomic_uint_fast64_t round_id; - uint16_t datum_add_hashes_count; char * gdb_group_events_round_new; diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h index 4de1d9055b..b56f5ae9b3 100644 --- a/modules/type/dag/include/dap_chain_cs_dag_event.h +++ b/modules/type/dag/include/dap_chain_cs_dag_event.h @@ -60,9 +60,8 @@ typedef struct dap_chain_cs_dag_event_round_item { uint8_t event_n_signs[]; // event // dap_chain_cs_dag_event_t } DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_item_t; -dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, uint64_t a_round_id, - dap_chain_datum_t *a_datum, dap_enc_key_t *a_key, - dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size); +dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t *a_datum, + dap_enc_key_t *a_key, dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size); /** * @brief dap_chain_cs_dag_event_get_datum -- GitLab