diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index 6a979e113ae7617d00918448d84390a8731c7c17..0fcb14f8d7388bfa8e5cbfdbd5169bc01a11a063 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -214,7 +214,7 @@ dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain dap_chain_atom_ptr_t l_ret = NULL; dap_chain_cell_t *l_cell, *l_iter_tmp; HASH_ITER(hh, a_chain->cells, l_cell, l_iter_tmp) { - dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + dap_chain_atom_iter_t * l_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, 0); l_ret = a_chain->callback_atom_find_by_hash(l_iter, a_atom_hash, a_atom_size); a_chain->callback_atom_iter_delete(l_iter); if (l_ret) @@ -576,7 +576,7 @@ void dap_chain_add_callback_notify(dap_chain_t * a_chain, dap_chain_callback_not 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 l_ret = false; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_cel_id); + 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; diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index ad8c8ebbc92da8b9c209cc4509da400fa95b6f67..a51bd399fd7fab15b09cf6cd04bd165cd77bd4a6 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -297,7 +297,7 @@ int dap_chain_cell_file_append( dap_chain_cell_t * a_cell, const void* a_atom, s // if no atom provided in arguments, we flush all the atoms in given chain size_t l_atom_size = a_atom_size ? a_atom_size : 0; size_t l_total_wrote_bytes = 0, l_count = 0; - dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id); + dap_chain_atom_iter_t *l_atom_iter = a_atom ? NULL : a_cell->chain->callback_atom_iter_create(a_cell->chain, a_cell->id, 0); if (!a_atom) { fseek(a_cell->file_storage, sizeof(dap_chain_cell_file_header_t), SEEK_SET); } diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index a52ded135cc488ec961a53daf28f3b2bc7738501..fbeb990a94845af14716e0e40d2032bb2408a0fc 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -48,6 +48,8 @@ typedef struct dap_chain_atom_iter{ dap_chain_atom_ptr_t cur; dap_chain_hash_fast_t *cur_hash; dap_chain_cell_id_t cell_id; + bool with_treshold; + bool found_in_treshold; size_t cur_size; void * cur_item; void * _inheritor; @@ -72,7 +74,7 @@ typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_form_treshold_t)(dap_chai typedef dap_chain_atom_verify_res_t (*dap_chain_callback_atom_verify_t)(dap_chain_t *, dap_chain_atom_ptr_t , size_t); typedef size_t (*dap_chain_callback_atom_get_hdr_size_t)(void); -typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *, dap_chain_cell_id_t); +typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_t)(dap_chain_t *, dap_chain_cell_id_t, bool); typedef dap_chain_atom_iter_t* (*dap_chain_callback_atom_iter_create_from_t)(dap_chain_t * ,dap_chain_atom_ptr_t, size_t); typedef dap_chain_atom_ptr_t (*dap_chain_callback_atom_iter_get_first_t)(dap_chain_atom_iter_t * , size_t*); typedef dap_chain_datum_t** (*dap_chain_callback_atom_get_datum_t)(dap_chain_atom_ptr_t, size_t, size_t * ); diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index d1ba56f8df0149a01aa26a57d3396e6b4b8acd71..bc8c77212fe059d3c751336ba75cc387b9e44c72 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -292,7 +292,7 @@ static bool s_sync_out_chains_proc_callback(dap_proc_thread_t *a_thread, void *a dap_chain_t * l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id); assert(l_chain); //pthread_rwlock_rdlock(&l_chain->atoms_rwlock); - l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id); + l_sync_request->chain.request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_sync_request->request_hdr.cell_id, 1); size_t l_first_size = 0; dap_chain_atom_ptr_t l_iter = l_chain->callback_atom_iter_get_first(l_sync_request->chain.request_atom_iter, &l_first_size); if (l_iter && l_first_size) { @@ -1105,7 +1105,7 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) if(s_debug_more) log_it(L_INFO, "Out: UPDATE_CHAINS_START pkt: net %s chain %s cell 0x%016"DAP_UINT64_FORMAT_X, l_chain->name, l_chain->net_name, l_chain_pkt->hdr.cell_id.uint64); - l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_chain_pkt->hdr.cell_id); + l_ch_chain->request_atom_iter = l_chain->callback_atom_iter_create(l_chain, l_chain_pkt->hdr.cell_id, 1); l_chain->callback_atom_iter_get_first(l_ch_chain->request_atom_iter, NULL); memcpy(&l_ch_chain->request_hdr, &l_chain_pkt->hdr, sizeof(dap_stream_ch_chain_pkt_hdr_t)); dap_stream_ch_chain_pkt_write_unsafe(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_START, diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index d6509844a748ba6bc58c3f4b61d08d81017756f2..8f18a3da687e4e6b2f5cac076751e3380bc634f6 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -71,7 +71,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t, size_t); // Verify new event in gdb static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get gdb event header size -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id); +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold); static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * a_chain, dap_chain_atom_ptr_t a, size_t a_atom_size); @@ -418,11 +418,12 @@ static size_t s_chain_callback_atom_get_static_hdr_size() * @param a_chain dap_chain_t a_chain * @return dap_chain_atom_iter_t* */ -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id) +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold) { dap_chain_atom_iter_t * l_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_iter->chain = a_chain; l_iter->cell_id = a_cell_id; + l_iter->with_treshold = a_with_treshold; return l_iter; } diff --git a/modules/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 232ee6c87f33b8230ffca7cd8bcea91e02aa172c..d797a5abaa27af58464f408c5efbf9fe00344523 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -4535,7 +4535,7 @@ static int s_check_cmd(int a_arg_index, int a_argc, char **a_argv, char **a_str_ size_t l_size = 0; HASH_ITER(hh, l_chain->cells, l_cell, l_cell_tmp) { - l_iter = l_cell->chain->callback_atom_iter_create(l_cell->chain, l_cell->id); + l_iter = l_cell->chain->callback_atom_iter_create(l_cell->chain, l_cell->id, 0); dap_chain_datum_t *l_datum = l_cell->chain->callback_atom_find_by_hash(l_iter, &l_hash_tmp, &l_size); if (l_datum) { dap_hash_fast_t l_hash; diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index 87d243c677ad6638ecececc2e3b78501719ee530..44fdd7abaff7475bb748358fc11b3d81bee9c76e 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -420,7 +420,7 @@ char* dap_db_history_tx(dap_chain_hash_fast_t* a_tx_hash, dap_chain_t * a_chain, dap_chain_cell_t *l_cell = a_chain->cells; do { // load transactions - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, 0); size_t l_atom_size = 0; dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); @@ -687,7 +687,7 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons dap_tx_data_t *l_tx_data_hash = NULL; // load transactions - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->cells->id); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, a_chain->cells->id, 0); size_t l_atom_size=0; dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); if (!l_atom) { @@ -841,7 +841,7 @@ static char* dap_db_history_token_list(dap_chain_t * a_chain, const char *a_toke size_t l_atom_size = 0; dap_chain_cell_t *l_cell = a_chain->cells; do { - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, 0); if(!a_chain->callback_atom_get_datums) { log_it(L_DEBUG, "Not defined callback_atom_get_datums for chain \"%s\"", a_chain->name); return NULL ; @@ -968,7 +968,7 @@ static char* dap_db_history_filter(dap_chain_t * a_chain, dap_ledger_t *a_ledger do { // load transactions size_t l_atom_size = 0; - dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id); + dap_chain_atom_iter_t *l_atom_iter = a_chain->callback_atom_iter_create(a_chain, l_cell->id, 0); dap_chain_atom_ptr_t l_atom = a_chain->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); size_t l_datum_num = 0, l_token_num = 0, l_emission_num = 0, l_tx_num = 0; size_t l_datum_num_global = a_total_datums ? *a_total_datums : 0; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 61ba34df74265bd78efa982cd3d8c3758d134346..bfaab7e2480edefe3c10943137a0b147c7e11df6 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -105,7 +105,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_verify(dap_chain_t * a_chain, // Get block header size static size_t s_callback_atom_get_static_hdr_size(void); -static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id); +static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold); static dap_chain_atom_iter_t* s_callback_atom_iter_create_from(dap_chain_t * , dap_chain_atom_ptr_t , size_t); @@ -898,11 +898,12 @@ static size_t s_callback_atom_get_static_hdr_size(void) * @param a_chain * @return */ -static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id) +static dap_chain_atom_iter_t *s_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold) { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_atom_iter->chain = a_chain; l_atom_iter->cell_id = a_cell_id; + l_atom_iter->with_treshold = a_with_treshold; l_atom_iter->_inheritor = DAP_NEW_Z(dap_chain_cs_blocks_iter_t); ITER_PVT(l_atom_iter)->blocks = DAP_CHAIN_CS_BLOCKS(a_chain); @@ -921,7 +922,7 @@ static dap_chain_atom_iter_t* s_callback_atom_iter_create_from(dap_chain_t * a_c if (a_atom && a_atom_size){ dap_chain_hash_fast_t l_atom_hash; dap_hash_fast(a_atom, a_atom_size, &l_atom_hash); - dap_chain_atom_iter_t * l_atom_iter = s_callback_atom_iter_create(a_chain, a_chain->cells->id); + dap_chain_atom_iter_t * l_atom_iter = s_callback_atom_iter_create(a_chain, a_chain->cells->id, 0); if (l_atom_iter){ dap_chain_cs_blocks_t *l_blocks = DAP_CHAIN_CS_BLOCKS(a_chain); l_atom_iter->cur_item = ITER_PVT(l_atom_iter)->cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_atom_hash); diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index aebe5a09cdb7ce08f5bfc787b09ffe18af0f2934..900edc5ec1aaac07f64f787df5737fd7031517ad 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -89,7 +89,7 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_add_from_treshold(dap_chain_t static dap_chain_atom_verify_res_t s_chain_callback_atom_verify(dap_chain_t * a_chain, dap_chain_atom_ptr_t , size_t); // Verify new event in dag static size_t s_chain_callback_atom_get_static_hdr_size(void); // Get dag event header size -static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id); +static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create(dap_chain_t * a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold); static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * , dap_chain_atom_ptr_t , size_t); @@ -988,11 +988,12 @@ static dap_chain_atom_iter_t* s_chain_callback_atom_iter_create_from(dap_chain_t * @param a_chain * @return */ -static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id) +static dap_chain_atom_iter_t *s_chain_callback_atom_iter_create(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id, bool a_with_treshold) { dap_chain_atom_iter_t * l_atom_iter = DAP_NEW_Z(dap_chain_atom_iter_t); l_atom_iter->chain = a_chain; l_atom_iter->cell_id = a_cell_id; + l_atom_iter->with_treshold = a_with_treshold; pthread_rwlock_rdlock(&a_chain->atoms_rwlock); #ifdef WIN32 log_it(L_DEBUG, "! Create caller id %lu", GetThreadId(GetCurrentThread())); @@ -1040,12 +1041,25 @@ static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_first(dap_chain_atom_ assert(l_dag_pvt); a_atom_iter->cur_item = NULL; dap_chain_cs_dag_event_item_t *l_item_tmp, *l_item_cur; + int found = 0; HASH_ITER(hh, l_dag_pvt->events, l_item_cur, l_item_tmp) { if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) { a_atom_iter->cur_item = l_item_cur; + found = 1; + a_atom_iter->found_in_treshold = 0; break; } } + if (!found && a_atom_iter->with_treshold) { + HASH_ITER(hh, l_dag_pvt->events_treshold, l_item_cur, l_item_tmp) { + if (l_item_cur->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) { + a_atom_iter->cur_item = l_item_cur; + a_atom_iter->found_in_treshold = 1; + break; + } + } + } + if ( a_atom_iter->cur_item ){ a_atom_iter->cur = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event; a_atom_iter->cur_size = ((dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item)->event_size; @@ -1195,11 +1209,29 @@ static dap_chain_datum_tx_t* s_chain_callback_atom_iter_find_by_tx_hash(dap_chai static dap_chain_atom_ptr_t s_chain_callback_atom_iter_get_next( dap_chain_atom_iter_t * a_atom_iter,size_t * a_atom_size ) { dap_chain_cs_dag_event_item_t * l_event_item = (dap_chain_cs_dag_event_item_t*) a_atom_iter->cur_item; + while (l_event_item) { l_event_item = (dap_chain_cs_dag_event_item_t *)l_event_item->hh.next; if (l_event_item && l_event_item->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) break; } + + if(!l_event_item && !a_atom_iter->found_in_treshold) { + dap_chain_cs_dag_t *l_dag = DAP_CHAIN_CS_DAG(a_atom_iter->chain); + assert(l_dag); + dap_chain_cs_dag_pvt_t *l_dag_pvt = PVT(l_dag); + assert(l_dag_pvt); + l_event_item = l_dag_pvt->events_treshold; + while (l_event_item) { + if (l_event_item && l_event_item->event->header.cell_id.uint64 == a_atom_iter->cell_id.uint64) { + a_atom_iter->found_in_treshold = 1; + break; + } + l_event_item = (dap_chain_cs_dag_event_item_t *)l_event_item->hh.next; + } + } + + // if l_event_item=NULL then items are over a_atom_iter->cur_item = l_event_item; a_atom_iter->cur = l_event_item ? l_event_item->event : NULL;