diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index fa714eac7c3bc259cc570ba2b96747148dc22ce2..a835fdc847b621678a30fc02eb7b9864fe8f0d02 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -768,3 +768,7 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) // } else return l_ret; } + +const char* dap_chain_get_path(dap_chain_t *a_chain){ + return DAP_CHAIN_PVT(a_chain)->file_storage_dir; +} diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 41bf1b79261dc61a554cd55a8ccfec24a5def44a..116609a436e7cf9509034c5563991eeb4cac0444 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -238,3 +238,5 @@ bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_ ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id); void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_store_obj_callback_notify_t a_callback, void *a_cb_arg); 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/net/dap_chain_node_cli_cmd.c b/modules/net/dap_chain_node_cli_cmd.c index 0febd4b8cb77ff58082ce716ef739f17e5942446..2eaa442b45a6386b36942f7d5fabce9f95b901ea 100644 --- a/modules/net/dap_chain_node_cli_cmd.c +++ b/modules/net/dap_chain_node_cli_cmd.c @@ -105,6 +105,7 @@ #include "dap_stream_ch_chain_pkt.h" #include "dap_stream_ch_chain_net_pkt.h" #include "dap_enc_base64.h" +#include "dap_chain_net_srv_stake_pos_delegate.h" #define LOG_TAG "chain_node_cli_cmd" @@ -5711,12 +5712,20 @@ dap_list_t *s_go_all_nets_offline() return l_net_returns; } +typedef struct _pvt_net_aliases_list{ + dap_chain_net_t *net; + dap_global_db_obj_t *group_aliases; + size_t count_aliases; + dap_global_db_obj_t *group_nodes; + size_t count_nodes; +}_pvt_net_aliases_list_t; + int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply) { //default init const char *return_message = NULL; const char *l_gdb_path = NULL; - const char *l_chains_path = NULL; +// const char *l_chains_path = NULL; const char *l_net_str = NULL; dap_chain_net_t *l_net = NULL; int all = 0; @@ -5741,27 +5750,54 @@ int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply) //check path's from config file if (dap_cli_server_cmd_check_option(a_argv, 1, a_argc, "-gdb") >= 0 - && (NULL == (l_gdb_path = dap_config_get_item_str(g_config, "resources", "dap_global_db_path")))){ + && (NULL == (l_gdb_path = dap_config_get_item_str(g_config, "global_db", "path")))){ error |= GDB_FAIL_PATH; } - if (dap_cli_server_cmd_check_option(a_argv, 1, a_argc, "-chains") >= 0 - && (NULL == (l_chains_path = dap_config_get_item_str(g_config, "resources", "dap_chains_path")))) { - error |= CHAINS_FAIL_PATH; - } +// if (dap_cli_server_cmd_check_option(a_argv, 1, a_argc, "-chains") >= 0 +// && (NULL == (l_chains_path = dap_config_get_item_str(g_config, "resources", "dap_chains_path")))) { +// error |= CHAINS_FAIL_PATH; +// } dap_list_t *l_net_returns = NULL; //perform deletion according to the specified parameters, if the path is specified if (l_gdb_path) { l_net_returns = s_go_all_nets_offline(); - char *l_gdb_rm_path = dap_strdup_printf("%s/gdb-%s", l_gdb_path, - dap_config_get_item_str_default(g_config, "resources", "global_db_driver", "mdbx")); + uint16_t l_net_count; + dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); + dap_list_t *l_gdb_aliases_list = NULL; + for (uint16_t i = 0; i < l_net_count; i++) { + size_t l_aliases_count = 0; + _pvt_net_aliases_list_t *l_gdb_groups = DAP_NEW(_pvt_net_aliases_list_t); + l_gdb_groups->net = l_net_list[i]; + l_gdb_groups->group_aliases = dap_global_db_get_all_sync(l_gdb_groups->net->pub.gdb_nodes_aliases, &l_gdb_groups->count_aliases); + l_gdb_groups->group_nodes = dap_global_db_get_all_sync(l_gdb_groups->net->pub.gdb_nodes, &l_gdb_groups->count_nodes); + l_gdb_aliases_list = dap_list_append(l_gdb_aliases_list, l_gdb_groups); + } + dap_global_db_deinit(); + const char *l_gdb_driver = dap_config_get_item_str_default(g_config, "global_db", "driver", "mdbx"); + char *l_gdb_rm_path = dap_strdup_printf("%s/gdb-%s", l_gdb_path, l_gdb_driver); dap_rm_rf(l_gdb_rm_path); DAP_DELETE(l_gdb_rm_path); + dap_global_db_init(l_gdb_path, l_gdb_driver); + for (dap_list_t *ptr = l_gdb_aliases_list; ptr; ptr = dap_list_next(ptr)) { + _pvt_net_aliases_list_t *l_tmp = (_pvt_net_aliases_list_t*)ptr->data; + for (size_t i = 0; i < l_tmp->count_aliases; i++) { + dap_global_db_obj_t l_obj = l_tmp->group_aliases[i]; + dap_global_db_set_sync(l_tmp->net->pub.gdb_nodes_aliases, l_obj.key, l_obj.value, l_obj.value_len, true); + } + dap_global_db_objs_delete(l_tmp->group_aliases, l_tmp->count_aliases); + for (size_t i = 0; i < l_tmp->count_nodes; i++) { + dap_global_db_obj_t l_obj = l_tmp->group_nodes[i]; + dap_global_db_set_sync(l_tmp->net->pub.gdb_nodes, l_obj.key, l_obj.value, l_obj.value_len, true); + } + dap_global_db_objs_delete(l_tmp->group_nodes, l_tmp->count_nodes); + } + dap_list_free_full(l_gdb_aliases_list, NULL); if (!error) successful |= REMOVED_GDB; } - if (l_chains_path) { + if (dap_cli_server_cmd_check_option(a_argv, 1, a_argc, "-chains") != -1) { dap_cli_server_cmd_find_option_val(a_argv, 1, a_argc, "-net", &l_net_str); all = dap_cli_server_cmd_check_option(a_argv, 1, a_argc, "-all"); @@ -5771,10 +5807,20 @@ int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply) uint16_t l_net_count; dap_chain_net_t **l_net_list = dap_chain_net_list(&l_net_count); for (uint16_t i = 0; i < l_net_count; i++) { - char *l_chains_rm_path = dap_strdup_printf("%s/%s", l_chains_path, - l_net_list[i]->pub.gdb_groups_prefix); - dap_rm_rf(l_chains_rm_path); - DAP_DELETE(l_chains_rm_path); + dap_chain_ledger_purge(l_net_list[i]->pub.ledger, false); + dap_chain_net_srv_stake_purge(l_net_list[i]); + dap_chain_net_decree_purge(l_net_list[i]); + dap_chain_t *l_chain = NULL; + DL_FOREACH(l_net_list[i]->pub.chains, l_chain) { + if (l_chain->callback_purge) + l_chain->callback_purge(l_chain); + if (l_chain->callback_set_min_validators_count) + l_chain->callback_set_min_validators_count(l_chain, 0); + const char *l_chains_rm_path = dap_chain_get_path(l_chain); + dap_rm_rf(l_chains_rm_path); + dap_chain_ledger_set_fee(l_net_list[i]->pub.ledger, uint256_0, c_dap_chain_addr_blank); + dap_chain_load_all(l_chain); + } } if (!error) successful |= REMOVED_CHAINS; @@ -5786,10 +5832,20 @@ int cmd_remove(int a_argc, char **a_argv, char ** a_str_reply) } else { error |= NET_NOT_VALID; } - sleep(1); - char *l_chains_rm_path = dap_strdup_printf("%s/%s", l_chains_path, l_net->pub.gdb_groups_prefix); - dap_rm_rf(l_chains_rm_path); - DAP_DELETE(l_chains_rm_path); + dap_chain_t *l_chain = NULL; + dap_chain_ledger_purge(l_net->pub.ledger, false); + dap_chain_net_srv_stake_purge(l_net); + dap_chain_net_decree_purge(l_net); + DL_FOREACH(l_net->pub.chains, l_chain) { + if (l_chain->callback_purge) + l_chain->callback_purge(l_chain); + if (l_chain->callback_set_min_validators_count) + l_chain->callback_set_min_validators_count(l_chain, 0); + const char *l_chains_rm_path = dap_chain_get_path(l_chain); + dap_rm_rf(l_chains_rm_path); + dap_chain_ledger_set_fee(l_net->pub.ledger, uint256_0, c_dap_chain_addr_blank); + dap_chain_load_all(l_chain); + } if (!error) successful |= REMOVED_CHAINS; diff --git a/modules/type/blocks/dap_chain_cs_blocks.c b/modules/type/blocks/dap_chain_cs_blocks.c index 7949f0ed486a49dc338248a28c906d56120e2e59..7b7794b01d853475119c010dc865553a622f1217 100644 --- a/modules/type/blocks/dap_chain_cs_blocks.c +++ b/modules/type/blocks/dap_chain_cs_blocks.c @@ -852,6 +852,10 @@ static void s_callback_cs_blocks_purge(dap_chain_t *a_chain) dap_chain_block_chunks_delete(PVT(l_blocks)->chunks); PVT(l_blocks)->block_cache_last = NULL; PVT(l_blocks)->block_cache_first = NULL; + dap_chain_cell_t *l_cell = NULL, *l_cell_tmp = NULL; + HASH_ITER(hh, a_chain->cells, l_cell, l_cell_tmp) { + dap_chain_cell_delete(l_cell); + } PVT(l_blocks)->chunks = dap_chain_block_chunks_create(l_blocks); }