diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index 3ab76c40058daf81986d9b87d9edf2bf42dccc71..3c0710cbee62faa5dda034acfb32ace6cd49245e 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -333,6 +333,44 @@ void dap_chain_cell_delete(dap_chain_cell_t *a_cell) DAP_DELETE(a_cell); } +void dap_chain_cell_delete_all_and_free_file(dap_chain_t *a_chain) { + if (!a_chain) + return; + pthread_rwlock_wrlock(&a_chain->cell_rwlock); + dap_chain_cell_t *l_cell, *l_tmp; + HASH_ITER(hh, a_chain->cells, l_cell, l_tmp) { + char *l_fsp = dap_strdup(l_cell->file_storage_path); + dap_chain_cell_id_t l_cell_id = l_cell->id; + dap_chain_cell_close(l_cell); + + dap_chain_cell_t * l_cell_nh = DAP_NEW_Z(dap_chain_cell_t); + FILE *l_file = fopen(l_fsp, "w+b"); + if ( !l_file ) { + log_it(L_ERROR, "Chain cell \"%s\" 0x%016"DAP_UINT64_FORMAT_X" cannot be opened, error %d", + l_fsp, l_cell_id.uint64, errno); + } + *l_cell_nh = (dap_chain_cell_t) { + .id = l_cell_id, + .chain = a_chain, + .file_storage = l_file + }; + if ( !s_cell_file_write_header(l_cell_nh)) { + log_it(L_ERROR, "Can't init file storage for cell 0x%016"DAP_UINT64_FORMAT_X" \"%s\", errno %d", + l_cell_id.uint64, l_fsp, errno); + } else { + log_it(L_NOTICE, "Reinitialized file storage for cell 0x%016"DAP_UINT64_FORMAT_X" \"%s\"", + l_cell_id.uint64, l_fsp); + } + dap_chain_cell_close(l_cell_nh); + + DAP_DELETE(l_fsp); + HASH_DEL(a_chain->cells, l_cell); + pthread_rwlock_destroy(&l_cell->storage_rwlock); + DAP_DELETE(l_cell); + } + pthread_rwlock_unlock(&a_chain->cell_rwlock); +} + void dap_chain_cell_delete_all(dap_chain_t *a_chain) { if (!a_chain) return; diff --git a/modules/chain/include/dap_chain_cell.h b/modules/chain/include/dap_chain_cell.h index d0957d3c32d7f115374bef73e03349f7628f6644..88ba245e169bb02cb4564f141a8bfa5431ff5455 100644 --- a/modules/chain/include/dap_chain_cell.h +++ b/modules/chain/include/dap_chain_cell.h @@ -77,6 +77,7 @@ dap_chain_cell_t *dap_chain_cell_create_fill(dap_chain_t *a_chain, dap_chain_cel dap_chain_cell_t *dap_chain_cell_find_by_id(dap_chain_t *a_chain, dap_chain_cell_id_t a_cell_id); void dap_chain_cell_close(dap_chain_cell_t *a_cell); void dap_chain_cell_delete(dap_chain_cell_t *a_cell); +void dap_chain_cell_delete_all_and_free_file(dap_chain_t *a_chain); void dap_chain_cell_delete_all(dap_chain_t *a_chain); int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell); ssize_t dap_chain_cell_file_append(dap_chain_cell_t *a_cell,const void *a_atom, size_t a_atom_size); diff --git a/modules/net/dap_chain_ledger.c b/modules/net/dap_chain_ledger.c index d9715cd2f053e2ccb1124d98f005efdd394393fa..fda57f4916b7972b795e7544e5b9c5fa2d650472 100644 --- a/modules/net/dap_chain_ledger.c +++ b/modules/net/dap_chain_ledger.c @@ -5530,7 +5530,8 @@ void dap_ledger_purge(dap_ledger_t *a_ledger, bool a_preserve_db) char *l_gdb_group; HASH_ITER(hh, l_ledger_pvt->ledger_items , l_item_current, l_item_tmp) { HASH_DEL(l_ledger_pvt->ledger_items, l_item_current); - DAP_DELETE(l_item_current->tx); + if (!l_ledger_pvt->mapped) + DAP_DELETE(l_item_current->tx); DAP_DEL_Z(l_item_current); } if (!a_preserve_db) { diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 7010e89731dad30c71a20330d15677b2d46af080..d4d21553ed89149a7aafe38aea13f48a031589fd 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -880,18 +880,20 @@ void s_set_reply_text_node_status(void **a_str_reply, dap_chain_net_t * a_net){ */ void dap_chain_net_purge(dap_chain_net_t *l_net) { - dap_ledger_purge(l_net->pub.ledger, false); dap_chain_net_srv_stake_purge(l_net); + dap_chain_net_decree_deinit(l_net); + dap_ledger_purge(l_net->pub.ledger, false); dap_chain_t *l_chain = NULL; DL_FOREACH(l_net->pub.chains, l_chain) { - if (l_chain->callback_purge) + if (l_chain->callback_purge) { l_chain->callback_purge(l_chain); - if (!dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs")) + } + if (!dap_strcmp(dap_chain_get_cs_type(l_chain), "esbocs")) { dap_chain_esbocs_set_min_validators_count(l_chain, 0); + } + dap_chain_load_all(l_chain); l_net->pub.fee_value = uint256_0; l_net->pub.fee_addr = c_dap_chain_addr_blank; - dap_chain_net_decree_purge(l_net); - dap_chain_load_all(l_chain); } DL_FOREACH(l_net->pub.chains, l_chain) { if (l_chain->callback_atom_add_from_treshold) { @@ -899,6 +901,7 @@ void dap_chain_net_purge(dap_chain_net_t *l_net) debug_if(s_debug_more, L_DEBUG, "Added atom from treshold"); } } + dap_chain_net_decree_init(l_net); } /** diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 180971b28ba4c7c1c08d9ce55292dea8b7fd3a0a..86bf719e88b7da036ff270137406456d04a7e010 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -1352,7 +1352,8 @@ static void s_callback_cs_blocks_purge(dap_chain_t *a_chain) dap_chain_block_cache_t *l_block = NULL, *l_block_tmp = NULL; HASH_ITER(hh, PVT(l_blocks)->blocks, l_block, l_block_tmp) { HASH_DEL(PVT(l_blocks)->blocks, l_block); - DAP_DELETE(l_block->block); + if (!a_chain->is_mapped) + DAP_DELETE(l_block->block); dap_chain_block_cache_delete(l_block); } PVT(l_blocks)->blocks_count = 0; @@ -1368,7 +1369,7 @@ static void s_callback_cs_blocks_purge(dap_chain_t *a_chain) pthread_rwlock_unlock(&PVT(l_blocks)->datums_rwlock); dap_chain_block_chunks_delete(PVT(l_blocks)->chunks); - dap_chain_cell_delete_all(a_chain); + dap_chain_cell_delete_all_and_free_file(a_chain); PVT(l_blocks)->chunks = dap_chain_block_chunks_create(l_blocks); } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 0fb0c2803e54e80be100719c2f9bb2bbd9f523ba..e7dca3dd963e765278675e9c9c3b75c31b72fbe5 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -364,7 +364,7 @@ static void s_dap_chain_cs_dag_purge(dap_chain_t *a_chain) DAP_DELETE(l_event_current); } pthread_mutex_unlock(&l_dag_pvt->events_mutex); - dap_chain_cell_delete_all(a_chain); + dap_chain_cell_delete_all_and_free_file(a_chain); } /** @@ -389,7 +389,11 @@ static void s_chain_cs_dag_delete(dap_chain_t * a_chain) static int s_dap_chain_add_atom_to_events_table(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_item_t *a_event_item) { dap_chain_datum_t *l_datum = (dap_chain_datum_t*) dap_chain_cs_dag_event_get_datum(a_event_item->event, a_event_item->event_size); - if(a_event_item->event_size< sizeof(l_datum->header) ){ + if (!l_datum) { + log_it(L_WARNING, "Corrupted event, failed to extract datum from event."); + return -2; + } + if(a_event_item->event_size < sizeof(l_datum->header) ){ log_it(L_WARNING, "Corrupted event, too small to fit datum in it"); return -1; }