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