diff --git a/dap-sdk b/dap-sdk index be69f08335f87c02611bde352b3062f21eed1ef8..fa8ebb3bc4e5a9aaa9782f52199d2b00307f7ca2 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit be69f08335f87c02611bde352b3062f21eed1ef8 +Subproject commit fa8ebb3bc4e5a9aaa9782f52199d2b00307f7ca2 diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 9d73093321f8b4f7b8fb907a4d211caf5310ade9..8415b5b77d1b2ef8d267e376f78a70805b6207ff 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -680,31 +680,36 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not * @param a_atom_hash * @return */ -bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id) +bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cell_id) { - bool l_ret = false; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cel_id, 0); - dap_chain_atom_ptr_t * l_lasts_atom; - size_t l_lasts_atom_count = 0; - size_t* l_lasts_atom_size = NULL; - l_lasts_atom = a_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_atom_count, &l_lasts_atom_size); - if (l_lasts_atom && l_lasts_atom_count) { - assert(l_lasts_atom_size[0]); - assert(l_lasts_atom[0]); - if(a_atom_hash){ - dap_hash_fast(l_lasts_atom[0], l_lasts_atom_size[0], a_atom_hash); - if(dap_log_level_get() <= L_DEBUG) { - char l_hash_str[DAP_CHAIN_HASH_FAST_STR_SIZE]; - dap_chain_hash_fast_to_str(a_atom_hash, l_hash_str, sizeof(l_hash_str)); - log_it(L_DEBUG, "Send sync chain request from %s to infinity",l_hash_str); - } - } - l_ret = true; - } - a_chain->callback_atom_iter_delete(l_atom_iter); + dap_chain_atom_iter_t *l_iter = a_chain->callback_atom_iter_create(a_chain, a_cell_id, false); + dap_chain_atom_ptr_t *l_ptr_list = a_chain->callback_atom_iter_get_lasts(l_iter, NULL, NULL); + DAP_DEL_Z(l_ptr_list); + *a_atom_hash = l_iter->cur_hash ? *l_iter->cur_hash : (dap_hash_fast_t){0}; + bool l_ret = l_iter->cur_hash; + a_chain->callback_atom_iter_delete(l_iter); return l_ret; } +struct chain_thread_notifier { + dap_chain_callback_notify_t callback; + void *callback_arg; + dap_chain_t *chain; + dap_chain_cell_id_t cell_id; + void *atom; + size_t atom_size; +}; + +static bool s_notify_atom_on_thread(void *a_arg) +{ + struct chain_thread_notifier *l_arg = a_arg; + assert(l_arg->atom && l_arg->callback); + l_arg->callback(l_arg->callback_arg, l_arg->chain, l_arg->cell_id, l_arg->atom, l_arg->atom_size); + DAP_DELETE(l_arg->atom); + DAP_DELETE(l_arg); + return false; +} + ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_atom, size_t a_atom_size, dap_hash_fast_t *a_new_atom_hash) { dap_return_val_if_fail(a_chain_cell && a_chain_cell->chain, -1); @@ -727,7 +732,20 @@ ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_ato dap_list_t *l_iter; DL_FOREACH(l_chain->atom_notifiers, l_iter) { dap_chain_atom_notifier_t *l_notifier = (dap_chain_atom_notifier_t*)l_iter->data; - l_notifier->callback(l_notifier->arg, l_chain, a_chain_cell->id, (void*)a_atom, a_atom_size); + struct chain_thread_notifier *l_arg = DAP_NEW_Z(struct chain_thread_notifier); + if (!l_arg) { + log_it(L_CRITICAL, g_error_memory_alloc); + continue; + } + *l_arg = (struct chain_thread_notifier) { .callback = l_notifier->callback, .callback_arg = l_notifier->arg, + .chain = l_chain, .cell_id = a_chain_cell->id, .atom_size = a_atom_size }; + l_arg->atom = DAP_DUP_SIZE(a_atom, a_atom_size); + if (!l_arg->atom) { + DAP_DELETE(l_arg); + log_it(L_CRITICAL, g_error_memory_alloc); + continue; + } + dap_proc_thread_callback_add(NULL, s_notify_atom_on_thread, l_arg); } } if (l_chain->callback_atom_add_from_treshold) { diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index cd90370807ec279a8e1c5a1910160f5c7cd23b3e..df21f65198adf8f2c013def65e4581c1b8e83eb2 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -258,7 +258,7 @@ dap_chain_t *dap_chain_load_from_cfg(const char *a_chain_net_name, dap_chain_net void dap_chain_delete(dap_chain_t * a_chain); void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_notify_t a_callback, void * a_arg); dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain_hash_fast_t * a_atom_hash, size_t * a_atom_size); -bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id); +bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cell_id); ssize_t dap_chain_atom_save(dap_chain_cell_t *a_chain_cell, const uint8_t *a_atom, size_t a_atom_size, dap_hash_fast_t *a_new_atom_hash); int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name); const char* dap_chain_get_path(dap_chain_t *a_chain); diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c index ce52243862909d53b533f5274a1140424fa7dfb5..56d2b9c00ecb731e94a54f767c0573cd432ba588 100644 --- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c +++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c @@ -50,7 +50,6 @@ enum s_esbocs_session_state { }; static dap_list_t *s_validator_check(dap_chain_addr_t *a_addr, dap_list_t *a_validators); -static void s_get_last_block_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_last_hash_ptr); static void s_session_state_change(dap_chain_esbocs_session_t *a_session, enum s_esbocs_session_state a_new_state, dap_time_t a_time); static void s_session_packet_in(void *a_arg, dap_chain_node_addr_t *a_sender_node_addr, dap_chain_node_addr_t *a_receiver_node_addr, dap_chain_hash_fast_t *a_data_hash, uint8_t *a_data, size_t a_data_size); @@ -346,14 +345,14 @@ static void s_check_db_collect_callback(dap_global_db_instance_t UNUSED_ARG *a_d dap_global_db_objs_delete(l_objs, l_objs_count); } -static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t UNUSED_ARG a_id, +static void s_new_atom_notifier(void *a_arg, dap_chain_t *a_chain, dap_chain_cell_id_t a_id, void *a_atom, size_t a_atom_size) { dap_chain_esbocs_session_t *l_session = a_arg; assert(l_session->chain == a_chain); pthread_mutex_lock(&l_session->mutex); dap_chain_hash_fast_t l_last_block_hash; - s_get_last_block_hash(l_session->chain, &l_last_block_hash); + dap_chain_get_atom_last_hash(l_session->chain, &l_last_block_hash, a_id); if (!dap_hash_fast_compare(&l_last_block_hash, &l_session->cur_round.last_block_hash)) s_session_round_new(l_session); pthread_mutex_unlock(&l_session->mutex); @@ -784,15 +783,6 @@ static dap_list_t *s_get_validators_list(dap_chain_esbocs_session_t *a_session, return l_ret; } -static void s_get_last_block_hash(dap_chain_t *a_chain, dap_chain_hash_fast_t *a_last_hash_ptr) -{ - dap_chain_atom_iter_t *l_iter = a_chain->callback_atom_iter_create(a_chain, c_dap_chain_cell_id_null, false); - dap_chain_atom_ptr_t *l_ptr_list = a_chain->callback_atom_iter_get_lasts(l_iter, NULL, NULL); - DAP_DEL_Z(l_ptr_list); - *a_last_hash_ptr = l_iter->cur_hash ? *l_iter->cur_hash : (dap_hash_fast_t){0}; - a_chain->callback_atom_iter_delete(l_iter); -} - static int s_callback_addr_compare(dap_list_t *a_list_elem, dap_list_t *a_addr_elem) { dap_chain_esbocs_validator_t *l_validator = a_list_elem->data; @@ -831,7 +821,7 @@ static void s_session_send_startsync(dap_chain_esbocs_session_t *a_session) if (a_session->cur_round.sync_sent) return; // Sync message already was sent dap_chain_hash_fast_t l_last_block_hash; - s_get_last_block_hash(a_session->chain, &l_last_block_hash); + dap_chain_get_atom_last_hash(a_session->chain, &l_last_block_hash, c_dap_chain_cell_id_null); a_session->ts_round_sync_start = dap_time_now(); if (!dap_hash_fast_compare(&l_last_block_hash, &a_session->cur_round.last_block_hash)) return; // My last block hash has changed, skip sync message @@ -936,7 +926,7 @@ static void s_session_round_new(dap_chain_esbocs_session_t *a_session) a_session->ts_stage_entry = 0; dap_hash_fast_t l_last_block_hash; - s_get_last_block_hash(a_session->chain, &l_last_block_hash); + dap_chain_get_atom_last_hash(a_session->chain, &l_last_block_hash, c_dap_chain_cell_id_null); if (!dap_hash_fast_compare(&l_last_block_hash, &a_session->cur_round.last_block_hash) || (!dap_hash_fast_is_blank(&l_last_block_hash) && dap_hash_fast_is_blank(&a_session->cur_round.last_block_hash))) { diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index d3d5e62f30213b737470d3e0a375d9766fe6ddd5..fadccfe53697b5ff48d867299c1c51717c43c5b9 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -192,6 +192,8 @@ dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_chain_node_cli bool l_trylocked = dap_chain_net_sync_trylock(l_net, a_node_client); if (l_trylocked) { log_it(L_INFO, "Start synchronization process with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(a_node_client->remote_node_addr)); + a_node_client->cur_chain = l_net->pub.chains; + a_node_client->cur_cell = a_node_client->cur_chain ? a_node_client->cur_chain->cells : NULL; dap_chain_ch_sync_request_t l_sync_chain = {}; l_sync_chain.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); dap_chain_ch_pkt_write_unsafe(a_node_client->ch_chain,