diff --git a/dap_chain_net.c b/dap_chain_net.c index 5d855126c4cf8d8b8ccb746b9c46165c2b6a6666..da690a96585200e2fd1b23791071263fd5e17ede 100755 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -30,6 +30,7 @@ #include <stdint.h> #include <string.h> #include <errno.h> +#include <fnmatch.h> #ifdef DAP_OS_UNIX #include <sys/types.h> @@ -126,6 +127,11 @@ typedef struct dap_chain_net_pvt{ uint8_t padding2[7]; char ** seed_aliases; + uint16_t gdb_sync_groups_count; + uint16_t gdb_sync_nodes_addrs_count; + char **gdb_sync_groups; + dap_chain_node_addr_t *gdb_sync_nodes_addrs; + uint8_t padding3[6]; uint16_t seed_aliases_count; @@ -1003,7 +1009,7 @@ int dap_chain_net_init() "\tList,add,del, dump or establish links\n\n" ); s_seed_mode = dap_config_get_item_bool_default(g_config,"general","seed_mode",false); - dap_chain_global_db_add_history_group_prefix("global"); + dap_chain_global_db_add_history_group_prefix("global", GROUP_LOCAL_HISTORY); dap_chain_global_db_add_history_callback_notify("global", s_gbd_history_callback_notify, NULL ); @@ -1307,12 +1313,54 @@ int s_net_load(const char * a_net_name) PVT(l_net)->load_mode = true; l_net->pub.gdb_groups_prefix = dap_strdup ( dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix","" ) ); - dap_chain_global_db_add_history_group_prefix( l_net->pub.gdb_groups_prefix); + dap_chain_global_db_add_history_group_prefix( l_net->pub.gdb_groups_prefix, GROUP_LOCAL_HISTORY); dap_chain_global_db_add_history_callback_notify(l_net->pub.gdb_groups_prefix, s_gbd_history_callback_notify, l_net ); l_net->pub.gdb_nodes = dap_strdup_printf("%s.nodes",l_net->pub.gdb_groups_prefix); l_net->pub.gdb_nodes_aliases = dap_strdup_printf("%s.nodes.aliases",l_net->pub.gdb_groups_prefix); + // for sync special groups - nodes + char **l_gdb_sync_nodes_addrs = dap_config_get_array_str(l_cfg, "general", "gdb_sync_nodes_addrs", + &PVT(l_net)->gdb_sync_nodes_addrs_count); + if(l_gdb_sync_nodes_addrs && PVT(l_net)->gdb_sync_nodes_addrs_count > 0) { + PVT(l_net)->gdb_sync_nodes_addrs = (dap_chain_node_addr_t*) DAP_NEW_Z_SIZE(char**, + sizeof(dap_chain_node_addr_t)*PVT(l_net)->gdb_sync_nodes_addrs_count); + for(uint16_t i = 0; i < PVT(l_net)->gdb_sync_nodes_addrs_count; i++) { + dap_chain_node_addr_from_str(PVT(l_net)->gdb_sync_nodes_addrs + i, l_gdb_sync_nodes_addrs[i]); + } + } + // for sync special groups - groups + char **l_gdb_sync_groups = dap_config_get_array_str(l_cfg, "general", "gdb_sync_groups", &PVT(l_net)->gdb_sync_groups_count); + if(l_gdb_sync_groups && PVT(l_net)->gdb_sync_groups_count > 0) { + PVT(l_net)->gdb_sync_groups = (char **) DAP_NEW_SIZE(char**, sizeof(char*)*PVT(l_net)->gdb_sync_groups_count); + for(uint16_t i = 0; i < PVT(l_net)->gdb_sync_groups_count; i++) { + PVT(l_net)->gdb_sync_groups[i] = dap_strdup(l_gdb_sync_groups[i]); + // added group to history log + dap_list_t *l_groups0 = dap_chain_global_db_driver_get_groups_by_mask(PVT(l_net)->gdb_sync_groups[i]); + dap_list_t *l_groups = l_groups0; + while(l_groups) { + char *l_group_name = l_groups->data; + // do not use groups with names like *.del + if(fnmatch("*.del", l_group_name, 0)) { + const char *l_history_group = dap_chain_global_db_add_history_extra_group(l_group_name, PVT(l_net)->gdb_sync_nodes_addrs, + PVT(l_net)->gdb_sync_nodes_addrs_count); + dap_chain_global_db_add_history_extra_group_callback_notify(l_group_name, + s_gbd_history_callback_notify, l_net); + // create history for group + if(dap_db_log_get_group_history_last_id(l_history_group) <= 0) { + size_t l_data_size_out = 0; + dap_store_obj_t *l_obj = dap_chain_global_db_obj_gr_get(NULL, &l_data_size_out, l_group_name); + if(l_obj && l_data_size_out > 0) { + dap_db_history_add('a', l_obj, l_data_size_out, l_history_group); + dap_store_obj_free(l_obj, l_data_size_out); + } + } + } + l_groups = dap_list_next(l_groups); + } + dap_list_free_full(l_groups0, (dap_callback_destroyed_t)free); + } + } // Add network to the list @@ -2052,3 +2100,22 @@ dap_chain_datum_tx_t * dap_chain_net_get_tx_by_hash(dap_chain_net_t * a_net, dap return l_tx; } +/** + * @brief dap_chain_net_get_add_gdb_group + * @param a_net + * @param a_node_addr + * @return + */ +dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_node_addr_t a_node_addr) +{ + dap_list_t *l_list_groups = NULL; + if(!PVT(a_net)->gdb_sync_nodes_addrs || !a_net) + return NULL; + for(uint16_t i = 0; i < PVT(a_net)->gdb_sync_nodes_addrs_count; i++) { + if(a_node_addr.uint64 == PVT(a_net)->gdb_sync_nodes_addrs[i].uint64) { + for(uint16_t j = 0; j < PVT(a_net)->gdb_sync_groups_count; j++) + l_list_groups = dap_list_append(l_list_groups, PVT(a_net)->gdb_sync_groups[j]); + } + } + return l_list_groups; +} diff --git a/dap_chain_net.h b/dap_chain_net.h index 1e6e03a5846d643ad54c86591f1f2310b7c92b79..719fe7beb92c7230988162182e25630e5089b7e0 100644 --- a/dap_chain_net.h +++ b/dap_chain_net.h @@ -148,3 +148,5 @@ DAP_STATIC_INLINE char * dap_chain_net_get_gdb_group_mempool(dap_chain_t * l_cha dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type); char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type); + +dap_list_t * dap_chain_net_get_add_gdb_group(dap_chain_net_t * a_net, dap_chain_node_addr_t a_node_addr); diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c index 61990373dab248e2486c292a8e83b3de746a221f..3b536019d72bdea3343ff25eaa523df0c1816e85 100644 --- a/dap_chain_node_client.c +++ b/dap_chain_node_client.c @@ -291,13 +291,18 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha // If the current global_db has been truncated, but the remote node has not known this uint64_t l_last_id = dap_db_log_get_last_id(); if(l_request->id_start > a_ch_chain->request_last_ts){ - l_db_log = dap_db_log_list_start(l_start_item + 1); + dap_chain_net_t *l_net = dap_chain_net_by_id(a_pkt->hdr.net_id); + dap_list_t *l_add_groups = dap_chain_net_get_add_gdb_group(l_net, a_ch_chain->request.node_addr); + l_db_log = dap_db_log_list_start(l_start_item + 1, l_add_groups); if(!l_db_log) l_start_item = 0; } //dap_list_t *l_list = dap_db_log_get_list(l_request->id_start + 1); - if(!l_db_log) - l_db_log = dap_db_log_list_start(l_start_item + 1); + if(!l_db_log){ + dap_chain_net_t *l_net = dap_chain_net_by_id(a_pkt->hdr.net_id); + dap_list_t *l_add_groups = dap_chain_net_get_add_gdb_group(l_net, a_ch_chain->request.node_addr); + l_db_log = dap_db_log_list_start(l_start_item + 1, l_add_groups); + } if(l_db_log) { // Add it to outgoing list //l_list->prev = a_ch_chain->request_global_db_trs;