From e0e8bab70d14838ed20de179566dfa5166ebc34c Mon Sep 17 00:00:00 2001
From: "roman.khlopkov" <roman.khlopkov@demlabs.net>
Date: Wed, 21 Feb 2024 13:10:27 +0300
Subject: [PATCH] [*] DAG rounds fixes

---
 dap-sdk                                       |  2 +-
 .../consensus/dag-poa/dap_chain_cs_dag_poa.c  | 16 +++++++--
 modules/type/dag/dap_chain_cs_dag.c           | 33 +++++++++++--------
 modules/type/dag/dap_chain_cs_dag_event.c     |  2 +-
 4 files changed, 36 insertions(+), 17 deletions(-)

diff --git a/dap-sdk b/dap-sdk
index decf5b801e..a806d84506 160000
--- a/dap-sdk
+++ b/dap-sdk
@@ -1 +1 @@
-Subproject commit decf5b801e348066a51b91b3fe944b79b2fbba37
+Subproject commit a806d84506a9c073a90ca792006019aaa8acdb30
diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
index 9d4ef3f5b5..151f48d3f0 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -595,10 +595,9 @@ static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_d
     HASH_DEL(l_poa_pvt->active_rounds, l_arg);
     pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
     DAP_DELETE(a_arg);
-    size_t l_events_round_size = a_values_count;
     uint16_t l_max_signs_count = 0;
     dap_list_t *l_dups_list = NULL;
-    for (size_t i = 0; i < l_events_round_size; i++) {
+    for (size_t i = 0; i < a_values_count; i++) {
         if (!strcmp(DAG_ROUND_CURRENT_KEY, a_values[i].key))
             continue;
         dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)a_values[i].value;
@@ -686,6 +685,15 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, uint64_t a_round_i
     pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock);
 }
 
+static bool s_callback_sync_all_on_start(dap_global_db_instance_t *a_dbi, int a_rc, const char *a_group,
+                                         const size_t a_values_total, const size_t a_values_count,
+                                         dap_global_db_obj_t *a_values, void *a_arg)
+{
+    for (size_t i = 0; i < a_values_count; i++)
+        s_callback_event_round_sync((dap_chain_cs_dag_t *)a_arg, DAP_GLOBAL_DB_OPTYPE_ADD, a_group,
+                                    a_values[i].key, a_values[i].value, a_values[i].value_len);
+}
+
 /**
  * @brief create callback load certificate for event signing for specific chain
  * path to certificate iw written to chain config file in dag_poa section
@@ -712,6 +720,7 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
         l_dag->callback_cs_event_round_sync = s_callback_event_round_sync;
         l_dag->round_completed = l_dag->round_current++;
         log_it(L_MSG, "Round complete ID %"DAP_UINT64_FORMAT_U", current ID %"DAP_UINT64_FORMAT_U, l_dag->round_completed, l_dag->round_current);
+        dap_global_db_get_all(l_dag->gdb_group_events_round_new, 0, s_callback_sync_all_on_start, l_dag);
     }
     return 0;
 }
@@ -793,6 +802,9 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
     if (a_op_code != DAP_GLOBAL_DB_OPTYPE_ADD || !a_key || !a_value || !a_value_size)
         return 0;
 
+    if (!strcmp(DAG_ROUND_CURRENT_KEY, a_key))
+        return 0;
+
     dap_chain_cs_dag_poa_t * l_poa = DAP_CHAIN_CS_DAG_POA(a_dag);
     dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT(l_poa);
 
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 8d43eb4e60..931a8dcc86 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -638,21 +638,20 @@ static size_t s_callback_add_datums(dap_chain_t *a_chain, dap_chain_datum_t **a_
     return l_datum_processed;
 }
 
-static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_datum_t *a_datum) {
-    if (!a_datum || !a_chain){
-        log_it(L_ERROR, "Datum or chain in mempool processing comes NULL in s_chain_callback_datums_pool_proc");
-        return false;
-    }
-
+static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_datum_t *a_datum)
+{
+    dap_return_val_if_fail(a_datum && a_chain, false);
     dap_chain_cs_dag_t * l_dag = DAP_CHAIN_CS_DAG(a_chain);
     /* If datum passes thru rounds, let's check if it wasn't added before */
     dap_chain_hash_fast_t l_datum_hash;
-    dap_hash_fast(a_datum, dap_chain_datum_size(a_datum), &l_datum_hash);
+    dap_hash_fast(a_datum->data, a_datum->header.data_size, &l_datum_hash);
     if (!l_dag->is_add_directly) {
         bool l_dup_found = false;
         size_t l_objs_count = 0;
         dap_global_db_obj_t * l_objs = dap_global_db_get_all_sync(l_dag->gdb_group_events_round_new, &l_objs_count);
         for (size_t i = 0; i < l_objs_count; ++i) {
+            if (!strcmp(DAG_ROUND_CURRENT_KEY, l_objs[i].key))
+                continue;
             dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t*)l_objs[i].value;
             if (!memcmp(&l_datum_hash, &(l_round_item->round_info.datum_hash), sizeof(dap_chain_hash_fast_t))) {
                 l_dup_found = true;
@@ -748,7 +747,7 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da
     dap_chain_cs_dag_event_round_item_t l_round_item = { .round_info.datum_hash = l_datum_hash };
     char *l_event_hash_hex_str = DAP_NEW_STACK_SIZE(char, DAP_CHAIN_HASH_FAST_STR_SIZE);
     dap_chain_hash_fast_to_str(&l_event_hash, l_event_hash_hex_str, DAP_CHAIN_HASH_FAST_STR_SIZE);
-    l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_hex_str, l_event, l_event_size, &l_round_item) == DAP_GLOBAL_DB_RC_SUCCESS;
+    l_res = dap_chain_cs_dag_event_gdb_set(l_dag, l_event_hash_hex_str, l_event, l_event_size, &l_round_item);
     DAP_DELETE(l_event);
     log_it(l_res ? L_INFO : L_ERROR,
            l_res ? "Event %s placed in the new forming round [id %"DAP_UINT64_FORMAT_U"]"
@@ -1532,6 +1531,8 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply)
 
             // Check if its ready or not
             for (size_t i = 0; i< l_objs_size; i++ ){
+                if (!strcmp(DAG_ROUND_CURRENT_KEY, l_objs[i].key))
+                    continue;
                 dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)l_objs[i].value;
                 dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs;
                 size_t l_event_size = l_round_item->event_size;
@@ -1604,6 +1605,8 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply)
             size_t l_search_events = 0;
             dap_string_t *l_events_str = dap_string_new("Events: \n");
             for (size_t i = 0; i < l_objs_size;i++) {
+                if (!strcmp(DAG_ROUND_CURRENT_KEY, l_objs[i].key))
+                    continue;
                 dap_chain_cs_dag_event_round_item_t *l_round_item = (dap_chain_cs_dag_event_round_item_t *)l_objs[i].value;
                 if (dap_hash_fast_compare(&l_round_item->round_info.datum_hash, &l_datum_hash)) {
                     dap_chain_cs_dag_event_t *l_event = (dap_chain_cs_dag_event_t *)l_round_item->event_n_signs;
@@ -1929,13 +1932,17 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply)
                         l_objs = dap_global_db_get_all_sync(l_gdb_group_events,&l_objs_count);
                         dap_string_append_printf(l_str_tmp,"%s.%s: Found %zu records :\n",l_net->pub.name,l_chain->name,l_objs_count);
 
-                        for (size_t i = 0; i< l_objs_count; i++){
+                        for (size_t i = 0; i < l_objs_count; i++) {
+                            if (!strcmp(DAG_ROUND_CURRENT_KEY, l_objs[i].key)) {
+                                dap_string_append_printf(l_str_tmp, "\t%s: %" DAP_UINT64_FORMAT_U "\n",
+                                                         l_objs[i].key, *(uint64_t *)l_objs[i].value);
+                                continue;
+                            }
                             dap_chain_cs_dag_event_t * l_event = (dap_chain_cs_dag_event_t *)
                                             ((dap_chain_cs_dag_event_round_item_t *)l_objs[i].value)->event_n_signs;
-                            char buf[50];
-                            dap_time_to_str_rfc822(buf, 50, l_event->header.ts_created);
-                            dap_string_append_printf(l_str_tmp,"\t%s: ts_create=%s\n",
-                                                     l_objs[i].key, buf);
+                            char buf[DAP_TIME_STR_SIZE];
+                            dap_time_to_str_rfc822(buf, DAP_TIME_STR_SIZE, l_event->header.ts_created);
+                            dap_string_append_printf(l_str_tmp, "\t%s: ts_create=%s\n", l_objs[i].key, buf);
 
                         }
                         if (l_objs && l_objs_count )
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index 345524da61..364bfe4ae5 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -246,7 +246,7 @@ bool dap_chain_cs_dag_event_gdb_set(dap_chain_cs_dag_t *a_dag, char *a_event_has
 
     size_t l_round_item_size = dap_chain_cs_dag_event_round_item_get_size(l_round_item);
     bool ret = dap_global_db_set(a_dag->gdb_group_events_round_new, a_event_hash_str, l_round_item,
-                                 l_round_item_size, false, NULL, NULL) == 0;
+                                 l_round_item_size, false, NULL, NULL) == DAP_GLOBAL_DB_RC_SUCCESS;
     DAP_DELETE(l_round_item);
     return ret;
 }
-- 
GitLab