From f83a196ed477e804434fa43af0981aa49c4986c1 Mon Sep 17 00:00:00 2001 From: Alexander Lysikov <alexander.lysikov@demlabs.net> Date: Fri, 15 Apr 2022 19:26:26 +0500 Subject: [PATCH] Feature-5370: Sync the selected network only --- modules/channel/chain/dap_stream_ch_chain.c | 4 +- modules/consensus/none/dap_chain_cs_none.c | 2 +- modules/global-db/dap_chain_global_db.c | 44 +++++++++++++++---- .../global-db/dap_chain_global_db_remote.c | 17 +++++-- .../global-db/include/dap_chain_global_db.h | 9 ++-- .../include/dap_chain_global_db_remote.h | 3 +- modules/net/dap_chain_net.c | 6 +-- modules/type/dag/dap_chain_cs_dag.c | 4 +- 8 files changed, 64 insertions(+), 25 deletions(-) diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 11cf1f2f66..8b9dce49d6 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -404,7 +404,7 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; if (l_ch_chain->request_db_log == NULL) - l_ch_chain->request_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = dap_db_log_list_start(l_net, l_sync_request->request.node_addr, l_flags); else dap_db_log_list_rewind(l_ch_chain->request_db_log); @@ -464,7 +464,7 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; if (l_ch_chain->request_db_log == NULL) - l_ch_chain->request_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = dap_db_log_list_start(l_net, l_sync_request->request.node_addr, l_flags); else dap_db_log_list_rewind(l_ch_chain->request_db_log); l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB; diff --git a/modules/consensus/none/dap_chain_cs_none.c b/modules/consensus/none/dap_chain_cs_none.c index 5b756f1f7c..6d791fb3e4 100644 --- a/modules/consensus/none/dap_chain_cs_none.c +++ b/modules/consensus/none/dap_chain_cs_none.c @@ -185,7 +185,7 @@ int dap_chain_gdb_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) } // Add group prefix that will be tracking all changes - dap_chain_global_db_add_sync_group("chain-gdb", s_history_callback_notify, l_gdb); + dap_chain_global_db_add_sync_group(l_net->pub.name, "chain-gdb", s_history_callback_notify, l_gdb); // load ledger l_gdb_priv->is_load_mode = true; diff --git a/modules/global-db/dap_chain_global_db.c b/modules/global-db/dap_chain_global_db.c index 5b9e6e2ba8..5768111d6d 100644 --- a/modules/global-db/dap_chain_global_db.c +++ b/modules/global-db/dap_chain_global_db.c @@ -74,7 +74,8 @@ int s_db_drvmode_async , /* S int s_db_add_sync_group(dap_list_t **a_grp_list, dap_sync_group_item_t *a_item) { for (dap_list_t *it = *a_grp_list; it; it = it->next) { - if (!dap_strcmp(((dap_sync_group_item_t *)it->data)->group_mask, a_item->group_mask)) { + dap_sync_group_item_t *l_item = (dap_sync_group_item_t *)it->data; + if (!dap_strcmp(l_item->group_mask, a_item->group_mask) && !dap_strcmp(l_item->net_name, a_item->net_name)) { log_it(L_WARNING, "Group mask '%s' already present in the list, ignore it", a_item->group_mask); return -1; } @@ -85,14 +86,16 @@ int s_db_add_sync_group(dap_list_t **a_grp_list, dap_sync_group_item_t *a_item) /** * @brief Adds a group name for synchronization. + * @param a_net_name a net name string, for all net a_net_name=null * @param a_group_prefix a prefix of the group name * @param a_callback a callback function * @param a_arg a pointer to an argument * @return (none) */ -void dap_chain_global_db_add_sync_group(const char *a_group_prefix, dap_global_db_obj_callback_notify_t a_callback, void *a_arg) +void dap_chain_global_db_add_sync_group(const char *a_net_name, const char *a_group_prefix, dap_global_db_obj_callback_notify_t a_callback, void *a_arg) { dap_sync_group_item_t *l_item = DAP_NEW_Z(dap_sync_group_item_t); + l_item->net_name = dap_strdup(a_net_name); l_item->group_mask = dap_strdup_printf("%s.*", a_group_prefix); l_item->callback_notify = a_callback; l_item->callback_arg = a_arg; @@ -101,14 +104,16 @@ void dap_chain_global_db_add_sync_group(const char *a_group_prefix, dap_global_d /** * @brief Adds a group name for synchronization with especially node addresses. + * @param a_net_name a net name string, for all net a_net_name=null * @param a_group_mask a group mask string * @param a_callback a callabck function * @param a_arg a pointer to an argument * @return (none) */ -void dap_chain_global_db_add_sync_extra_group(const char *a_group_mask, dap_global_db_obj_callback_notify_t a_callback, void *a_arg) +void dap_chain_global_db_add_sync_extra_group(const char *a_net_name, const char *a_group_mask, dap_global_db_obj_callback_notify_t a_callback, void *a_arg) { dap_sync_group_item_t* l_item = DAP_NEW_Z(dap_sync_group_item_t); + l_item->net_name = dap_strdup(a_net_name); l_item->group_mask = dap_strdup(a_group_mask); l_item->callback_notify = a_callback; l_item->callback_arg = a_arg; @@ -117,21 +122,44 @@ void dap_chain_global_db_add_sync_extra_group(const char *a_group_mask, dap_glob /** * @brief Gets a list of a group mask for s_sync_group_items. + * @param a_net_name a net name string, for all net a_net_name=null * @return Returns a pointer to a list of a group mask. */ -dap_list_t *dap_chain_db_get_sync_groups() +dap_list_t* dap_chain_db_get_sync_groups(const char *a_net_name) { - return dap_list_copy(s_sync_group_items); + if(!a_net_name) { + return dap_list_copy(s_sync_group_items); + } + dap_list_t *l_list_out = NULL; + dap_list_t *l_list_group = s_sync_group_items; + while(l_list_group) { + if(!dap_strcmp(a_net_name, ((dap_sync_group_item_t*) l_list_group->data)->net_name)) { + l_list_out = dap_list_append(l_list_out, l_list_group->data); + } + l_list_group = dap_list_next(l_list_group); + } + return l_list_out; } /** * @brief Gets a list of a group mask for s_sync_group_items. - * @param a_table a table + * @param a_net_name a net name string, for all net a_net_name=null * @return Returns a pointer to a list of a group mask. */ -dap_list_t *dap_chain_db_get_sync_extra_groups() +dap_list_t* dap_chain_db_get_sync_extra_groups(const char *a_net_name) { - return dap_list_copy(s_sync_group_extra_items); + if(!a_net_name) { + return dap_list_copy(s_sync_group_extra_items); + } + dap_list_t *l_list_out = NULL; + dap_list_t *l_list_group = s_sync_group_extra_items; + while(l_list_group) { + if(!dap_strcmp(a_net_name, ((dap_sync_group_item_t*) l_list_group->data)->net_name)) { + l_list_out = dap_list_append(l_list_out, l_list_group->data); + } + l_list_group = dap_list_next(l_list_group); + } + return l_list_out; } /** diff --git a/modules/global-db/dap_chain_global_db_remote.c b/modules/global-db/dap_chain_global_db_remote.c index 7cd47a2ed4..fd597586f0 100644 --- a/modules/global-db/dap_chain_global_db_remote.c +++ b/modules/global-db/dap_chain_global_db_remote.c @@ -112,20 +112,30 @@ static void *s_list_thread_proc(void *arg) * @brief Starts a thread that readding a log list * @note instead dap_db_log_get_list() * + * @param l_net net for sync * @param a_addr a pointer to the structure * @param a_flags flags * @return Returns a pointer to the log list structure if successful, otherwise NULL pointer. */ -dap_db_log_list_t* dap_db_log_list_start(dap_chain_node_addr_t a_addr, int a_flags) +dap_db_log_list_t* dap_db_log_list_start(dap_chain_net_t *l_net, dap_chain_node_addr_t a_addr, int a_flags) { #ifdef GDB_SYNC_ALWAYS_FROM_ZERO a_flags |= F_DB_LOG_SYNC_FROM_ZERO; #endif + + const char *l_net_name = NULL; + if(l_net && l_net->pub.name && l_net->pub.name[0]!='\0') { + l_net_name = l_net->pub.name; + } + //log_it(L_DEBUG, "Start loading db list_write..."); dap_db_log_list_t *l_dap_db_log_list = DAP_NEW_Z(dap_db_log_list_t); - dap_list_t *l_groups_masks = dap_chain_db_get_sync_groups(); + // Add groups for the selected network only + dap_list_t *l_groups_masks = dap_chain_db_get_sync_groups(l_net_name); if (a_flags & F_DB_LOG_ADD_EXTRA_GROUPS) { - l_groups_masks = dap_list_concat(l_groups_masks, dap_chain_db_get_sync_extra_groups()); + dap_list_t *l_extra_groups_masks = dap_chain_db_get_sync_extra_groups(l_net_name); + l_groups_masks = dap_list_concat(l_groups_masks, l_extra_groups_masks); + dap_list_free(l_extra_groups_masks); } dap_list_t *l_groups_names = NULL; for (dap_list_t *l_cur_mask = l_groups_masks; l_cur_mask; l_cur_mask = dap_list_next(l_cur_mask)) { @@ -134,7 +144,6 @@ dap_db_log_list_t* dap_db_log_list_start(dap_chain_node_addr_t a_addr, int a_fla } dap_list_free(l_groups_masks); - static uint16_t s_size_ban_list = 0; static char **s_ban_list = NULL; diff --git a/modules/global-db/include/dap_chain_global_db.h b/modules/global-db/include/dap_chain_global_db.h index d5891d7bcb..a2951e8b78 100644 --- a/modules/global-db/include/dap_chain_global_db.h +++ b/modules/global-db/include/dap_chain_global_db.h @@ -31,6 +31,7 @@ typedef void (*dap_global_db_obj_callback_notify_t) (void * a_arg, const char a_ // Callback table item typedef struct dap_sync_group_item { char *group_mask; + char *net_name; dap_global_db_obj_callback_notify_t callback_notify; void * callback_arg; } dap_sync_group_item_t; @@ -61,10 +62,10 @@ void dap_chain_global_db_deinit(void); * Setup callbacks and filters */ // Add group name that will be synchronized -void dap_chain_global_db_add_sync_group(const char *a_group_prefix, dap_global_db_obj_callback_notify_t a_callback, void *a_arg); -void dap_chain_global_db_add_sync_extra_group(const char *a_group_mask, dap_global_db_obj_callback_notify_t a_callback, void *a_arg); -dap_list_t *dap_chain_db_get_sync_groups(); -dap_list_t *dap_chain_db_get_sync_extra_groups(); +void dap_chain_global_db_add_sync_group(const char *a_net_name, const char *a_group_prefix, dap_global_db_obj_callback_notify_t a_callback, void *a_arg); +void dap_chain_global_db_add_sync_extra_group(const char *a_net_name, const char *a_group_mask, dap_global_db_obj_callback_notify_t a_callback, void *a_arg); +dap_list_t *dap_chain_db_get_sync_groups(const char *a_net_name); +dap_list_t *dap_chain_db_get_sync_extra_groups(const char *a_net_name); void dap_global_db_change_notify(dap_store_obj_t *a_store_data); /** * Get entry from base diff --git a/modules/global-db/include/dap_chain_global_db_remote.h b/modules/global-db/include/dap_chain_global_db_remote.h index 4a45e708d3..8ae1d84ce3 100644 --- a/modules/global-db/include/dap_chain_global_db_remote.h +++ b/modules/global-db/include/dap_chain_global_db_remote.h @@ -4,6 +4,7 @@ #include <time.h> #include "dap_chain.h" #include "dap_chain_common.h" +#include "dap_chain_net.h" #include "dap_chain_global_db_driver.h" #define F_DB_LOG_ADD_EXTRA_GROUPS 1 @@ -55,7 +56,7 @@ char *dap_store_packet_get_group(dap_store_obj_pkt_t *a_pkt); uint64_t dap_store_packet_get_id(dap_store_obj_pkt_t *a_pkt); void dap_store_packet_change_id(dap_store_obj_pkt_t *a_pkt, uint64_t a_id); -dap_db_log_list_t* dap_db_log_list_start(dap_chain_node_addr_t a_addr, int flags); +dap_db_log_list_t* dap_db_log_list_start(dap_chain_net_t *l_net, dap_chain_node_addr_t a_addr, int a_flags); size_t dap_db_log_list_get_count(dap_db_log_list_t *a_db_log_list); size_t dap_db_log_list_get_count_rest(dap_db_log_list_t *a_db_log_list); dap_db_log_list_obj_t *dap_db_log_list_get(dap_db_log_list_t *a_db_log_list); diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 0a3a4d5529..d74add9f6a 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -2020,8 +2020,8 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_net->pub.gdb_groups_prefix = dap_strdup ( dap_config_get_item_str_default(l_cfg , "general" , "gdb_groups_prefix", dap_config_get_item_str(l_cfg , "general" , "name" ) ) ); - dap_chain_global_db_add_sync_group("global", s_gbd_history_callback_notify, l_net); - dap_chain_global_db_add_sync_group(l_net->pub.gdb_groups_prefix, s_gbd_history_callback_notify, l_net); + dap_chain_global_db_add_sync_group(l_net->pub.name, "global", s_gbd_history_callback_notify, l_net); + dap_chain_global_db_add_sync_group(l_net->pub.name, 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); @@ -2070,7 +2070,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) if (l_gdb_sync_groups && l_gdb_sync_groups_count > 0) { for(uint16_t i = 0; i < l_gdb_sync_groups_count; i++) { // add group to special sync - dap_chain_global_db_add_sync_extra_group(l_gdb_sync_groups[i], s_gbd_history_callback_notify, l_net); + dap_chain_global_db_add_sync_extra_group(l_net->pub.name, l_gdb_sync_groups[i], s_gbd_history_callback_notify, l_net); } } diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index 6cf24bebf1..850a3fba63 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -268,11 +268,11 @@ int dap_chain_cs_dag_new(dap_chain_t * a_chain, dap_config_t * a_chain_cfg) if(!l_dag->is_celled){ char * gdb_group = dap_strdup_printf( "dag-%s-%s-round", l_net->pub.gdb_groups_prefix, a_chain->name); l_dag->gdb_group_events_round_new = dap_strdup_printf( "%s.%s", gdb_group, l_round_new_str); - dap_chain_global_db_add_sync_group(gdb_group, s_history_callback_round_notify, l_dag); + dap_chain_global_db_add_sync_group(l_net->pub.name, gdb_group, s_history_callback_round_notify, l_dag); } else { char * gdb_group = dap_strdup_printf( "dag-%s-%s-%016llx-round", l_net->pub.gdb_groups_prefix, a_chain->name, 0);//a_chain->cells->id.uint64); l_dag->gdb_group_events_round_new = dap_strdup_printf( "%s.%s", gdb_group, l_round_new_str); - dap_chain_global_db_add_sync_group(gdb_group, s_history_callback_round_notify, l_dag); + dap_chain_global_db_add_sync_group(l_net->pub.name, gdb_group, s_history_callback_round_notify, l_dag); } DAP_DELETE(l_round_new_str); -- GitLab