diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index e5227ffdbc8c80b71974660a03fdca5b5a8a09cd..4963bc7d5bccc58d332417d71b72aa066dd9133a 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -962,9 +962,7 @@ static int s_add_atom_datums(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_ca */ static int s_add_atom_to_blocks(dap_chain_cs_blocks_t *a_blocks, dap_chain_block_cache_t *a_block_cache ) { - int l_res = 0; - pthread_rwlock_wrlock( &PVT(a_blocks)->rwlock ); - l_res = s_add_atom_datums(a_blocks, a_block_cache); + int l_res = s_add_atom_datums(a_blocks, a_block_cache); debug_if(s_debug_more, L_DEBUG, "Block %s checked, %s", a_block_cache->block_hash_str, l_res == (int)a_block_cache->datum_count ? "all correct" : "but ledger declined"); @@ -1064,15 +1062,21 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da pthread_rwlock_wrlock(&PVT(l_blocks)->datums_lock); dap_chain_hash_fast_t l_block_hash; dap_hash_fast(l_block, l_block_size, &l_block_hash); - dap_chain_block_cache_t * l_block_cache = dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_block_hash); + + dap_chain_block_cache_t * l_block_cache = NULL; + pthread_rwlock_wrlock(& PVT(l_blocks)->rwlock); + HASH_FIND(hh, PVT(l_blocks)->blocks,&l_block_hash, sizeof (l_block_hash), l_block_cache ); + if (l_block_cache ){ debug_if(s_debug_more, L_DEBUG, "... already present in blocks %s", l_block_cache->block_hash_str); pthread_rwlock_unlock(&PVT(l_blocks)->datums_lock); + pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); return ATOM_PASS; } else { l_block_cache = dap_chain_block_cache_new(l_blocks, &l_block_hash, l_block, l_block_size); if (!l_block_cache) { log_it(L_DEBUG, "... corrupted block"); + pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); pthread_rwlock_unlock(&PVT(l_blocks)->datums_lock); return ATOM_REJECT; } @@ -1093,9 +1097,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da if(l_consensus_check == 1){ debug_if(s_debug_more, L_DEBUG, "... added"); }else if (l_consensus_check == DAP_CHAIN_CS_VERIFY_CODE_TX_NO_PREVIOUS){ - pthread_rwlock_wrlock( &PVT(l_blocks)->rwlock ); HASH_ADD(hh, PVT(l_blocks)->blocks_tx_treshold, block_hash, sizeof(l_block_cache->block_hash), l_block_cache); - pthread_rwlock_unlock( &PVT(l_blocks)->rwlock ); debug_if(s_debug_more, L_DEBUG, "... tresholded for tx ledger"); }else{ debug_if(s_debug_more, L_WARNING, "... error adding (code %d)", l_consensus_check); @@ -1103,9 +1105,12 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da } // !TODO make chunks add to blocks }else if(ret == ATOM_MOVE_TO_THRESHOLD){ - if (dap_chain_block_cs_cache_get_by_hash(l_blocks, &l_block_hash)) { + l_block_cache = NULL; + HASH_FIND(hh, PVT(l_blocks)->blocks,&l_block_hash, sizeof (l_block_hash), l_block_cache ); + if (l_block_cache) { // if it was concurrent atom processed before dap_chain_block_cache_delete(l_block_cache); + pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); return ATOM_PASS; } dap_chain_block_chunks_add( PVT(l_blocks)->chunks,l_block_cache); @@ -1116,6 +1121,7 @@ static dap_chain_atom_verify_res_t s_callback_atom_add(dap_chain_t * a_chain, da debug_if(s_debug_more, L_DEBUG, "Verified atom %p: %s", a_atom, ret == ATOM_ACCEPT ? "accepted" : (ret == ATOM_REJECT ? "rejected" : "thresholded")); //s_bft_consensus_setup(l_blocks); + pthread_rwlock_unlock(&PVT(l_blocks)->rwlock); return ret; } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 222e9295555555883b61e0ddf652506e331c0a05..1665ee8b713585c0e11f84127aa566398091cf01 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -524,7 +524,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha // check if we already have this event dap_chain_atom_verify_res_t ret = s_dap_chain_check_if_event_is_present(PVT(l_dag)->events, &l_event_item->hash) || s_dap_chain_check_if_event_is_present(PVT(l_dag)->events_treshold, &l_event_item->hash) ? ATOM_PASS : ATOM_ACCEPT; - pthread_mutex_unlock(l_events_mutex); + //pthread_mutex_unlock(l_events_mutex); // verify hashes and consensus switch (ret) { @@ -541,6 +541,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha log_it(L_DEBUG, "Atom already present"); } DAP_DELETE(l_event_item); + pthread_mutex_unlock(l_events_mutex); return ret; default: break; @@ -548,7 +549,8 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha switch (ret) { case ATOM_MOVE_TO_THRESHOLD: - pthread_mutex_lock(l_events_mutex); + //pthread_mutex_lock(l_events_mutex); + ; dap_chain_cs_dag_blocked_t *el = NULL; HASH_FIND(hh, PVT(l_dag)->removed_events_from_treshold, &l_event_item->hash, sizeof(dap_chain_hash_fast_t), el); if (!el) { @@ -561,7 +563,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha if (s_debug_more) log_it(L_DEBUG, "... rejected because the atom was removed from the threshold."); } - pthread_mutex_unlock(l_events_mutex); + //pthread_mutex_unlock(l_events_mutex); break; case ATOM_ACCEPT: { int l_consensus_check = s_dap_chain_add_atom_to_events_table(l_dag, l_event_item); @@ -588,7 +590,7 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha log_it(L_WARNING, "... added with ledger code %d", l_consensus_check); break; } - pthread_mutex_lock(l_events_mutex); + //pthread_mutex_lock(l_events_mutex); dap_chain_cs_dag_event_item_t *l_tail = PVT(l_dag)->events ? PVT(l_dag)->events->hh.tbl->tail->prev : NULL; if (!l_tail) l_tail = PVT(l_dag)->events; @@ -601,12 +603,13 @@ static dap_chain_atom_verify_res_t s_chain_callback_atom_add(dap_chain_t * a_cha else HASH_ADD(hh, PVT(l_dag)->events, hash, sizeof(l_event_item->hash), l_event_item); s_dag_events_lasts_process_new_last_event(l_dag, l_event_item); - pthread_mutex_unlock(l_events_mutex); + //pthread_mutex_unlock(l_events_mutex); } break; default: DAP_DELETE(l_event_item); // Neither added, nor freed break; } + pthread_mutex_unlock(l_events_mutex); return ret; }