From f00e097b25a5d5853fcef57bed63d5ad8767b4ec Mon Sep 17 00:00:00 2001
From: "Constantin P." <papizh.konstantin@demlabs.net>
Date: Tue, 1 Oct 2024 14:40:25 +0700
Subject: [PATCH] Even more fixes

---
 .../consensus/dag-poa/dap_chain_cs_dag_poa.c  | 34 +++++++++----------
 modules/type/dag/dap_chain_cs_dag.c           |  7 ++--
 modules/type/dag/dap_chain_cs_dag_event.c     | 22 +++++++-----
 modules/type/dag/include/dap_chain_cs_dag.h   |  2 --
 .../type/dag/include/dap_chain_cs_dag_event.h |  5 ++-
 5 files changed, 34 insertions(+), 36 deletions(-)

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 10306fb5a1..96de9aeb9c 100644
--- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
+++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c
@@ -85,10 +85,10 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
                                                           dap_chain_hash_fast_t * a_hashes, size_t a_hashes_count, size_t* a_event_size);
 static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_round_item_t *a_arg);
 static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group,
-                                        const char *a_key, const void *a_value, const size_t a_value_size);
+                                       const char *a_key, const void *a_value, const size_t a_value_size, bool a_by_us);
 static bool s_round_event_ready_minimum_check(dap_chain_cs_dag_t *a_dag, dap_chain_cs_dag_event_t *a_event,
                                               size_t a_event_size, char *a_event_hash_hex_str);
-static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item);
+static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item, uint32_t a_timeout_s);
 
 // CLI commands
 static int s_cli_dag_poa(int argc, char ** argv, void **a_str_reply);
@@ -291,7 +291,7 @@ static int s_cli_dag_poa(int argc, char ** argv, void **a_str_reply)
                                 .datum_hash = l_round_item->round_info.datum_hash,
                                 .dag = l_dag
                             };
-                            s_round_event_cs_done(&l_event_item);
+                            s_round_event_cs_done(&l_event_item, l_poa_pvt->confirmations_timeout);
                         }
                     } else {
                         if(!dap_strcmp(l_hash_out_type, "hex")) {
@@ -604,8 +604,7 @@ static bool s_callback_round_event_to_chain_callback_get_round_item(dap_global_d
             }
         }
     } else /* !l_chosen_item */
-        log_it(L_WARNING, "No valid candidates to wrap datum %s in current round #%"DAP_UINT64_FORMAT_U"",
-                          l_datum_hash_str, l_dag->round_id);
+        log_it(L_WARNING, "No valid candidates to wrap datum %s in current round", l_datum_hash_str);
     return DAP_DELETE(l_arg), true;
 }
 
@@ -620,7 +619,7 @@ static bool s_callback_round_event_to_chain(dap_chain_cs_dag_poa_round_item_t *a
         false;
 }
 
-static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item)
+static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_item, uint32_t a_timeout_s)
 {
     dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT( DAP_CHAIN_CS_DAG_POA(a_event_item->dag) );
     dap_chain_cs_dag_poa_round_item_t *l_event_item = NULL;
@@ -628,7 +627,7 @@ static void s_round_event_cs_done(dap_chain_cs_dag_poa_round_item_t *a_event_ite
     HASH_FIND(hh, l_poa_pvt->event_items, &a_event_item->datum_hash, sizeof(dap_hash_fast_t), l_event_item);
     if (!l_event_item) {
         l_event_item = DAP_DUP(a_event_item);
-        if ( !dap_timerfd_start(l_poa_pvt->confirmations_timeout * 1000, (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_event_item) )
+        if ( !dap_timerfd_start(a_timeout_s * 1000, (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_event_item) )
             return DAP_DELETE(l_event_item), pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock), log_it(L_CRITICAL, "Timer creation failed");
         HASH_ADD(hh, l_poa_pvt->event_items, datum_hash, sizeof(dap_hash_fast_t), l_event_item);
         log_it(L_INFO, "Confirmation timer for datum %s started [%d s]",
@@ -643,7 +642,7 @@ static bool s_callback_sync_all_on_start(dap_global_db_instance_t *a_dbi, int a_
 {
     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);
+                                    a_values[i].key, a_values[i].value, a_values[i].value_len, true);
     return false;
 }
 
@@ -659,7 +658,8 @@ static void s_round_changes_notify(dap_store_obj_t *a_obj, void *a_arg)
         return;
     switch ( l_type ) {
     case DAP_GLOBAL_DB_OPTYPE_ADD:
-        s_callback_event_round_sync(l_dag, l_type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len);
+        s_callback_event_round_sync(l_dag, l_type, a_obj->group, a_obj->key, a_obj->value, a_obj->value_len,
+                                    dap_stream_node_addr_from_sign(a_obj->sign).uint64 == g_node_addr.uint64);
     default:
         break;
     }
@@ -699,7 +699,6 @@ static int s_callback_created(dap_chain_t * a_chain, dap_config_t *a_chain_net_c
     dap_global_db_cluster_add_notify_callback(l_dag_cluster, s_round_changes_notify, l_dag);
     dap_chain_net_add_auth_nodes_to_cluster(l_net, l_dag_cluster);
     dap_link_manager_add_net_associate(l_net->pub.id.uint64, l_dag_cluster->links_cluster);
-    l_dag->round_id = 0;
     PVT(l_poa)->mempool_timer = dap_interval_timer_create(15000, s_timer_process_callback, a_chain);
 
     switch ( dap_chain_net_get_role(l_net).enums ) {
@@ -762,11 +761,11 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
         log_it(L_ERROR, "Can't sign event with events_sign_cert in [dag-poa] section");
     else if ( s_seed_mode || (a_hashes && a_hashes_count) ) {
         if ( !PVT(l_poa)->callback_pre_sign || !PVT(l_poa)->callback_pre_sign->callback) {
-            return dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_dag->round_id,
-                                                                            a_datum, PVT(l_poa)->events_sign_cert->enc_key,
-                                                                            a_hashes, a_hashes_count, a_event_size);
+            return dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_datum,
+                                              PVT(l_poa)->events_sign_cert->enc_key,
+                                              a_hashes, a_hashes_count, a_event_size);
         } else {
-            dap_chain_cs_dag_event_t *l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id, a_dag->round_id,
+            dap_chain_cs_dag_event_t *l_event = dap_chain_cs_dag_event_new(a_dag->chain->id, a_dag->chain->cells->id,
                                                                            a_datum, NULL, a_hashes, a_hashes_count, a_event_size);
             if ( PVT(l_poa)->callback_pre_sign->callback(a_dag->chain, l_event, *a_event_size, PVT(l_poa)->callback_pre_sign->arg) )
                 return DAP_DELETE(l_event), NULL;
@@ -778,7 +777,7 @@ static dap_chain_cs_dag_event_t * s_callback_event_create(dap_chain_cs_dag_t * a
 }
 
 static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_op_code, const char *a_group,
-                                        const char *a_key, const void *a_value, const size_t a_value_size)
+                                       const char *a_key, const void *a_value, const size_t a_value_size, bool a_by_us)
 {
     dap_return_val_if_pass(a_op_code != DAP_GLOBAL_DB_OPTYPE_ADD || !a_key || !a_value
                            || !a_value_size || !strcmp(DAG_ROUND_CURRENT_KEY, a_key), 0);
@@ -799,9 +798,8 @@ static int s_callback_event_round_sync(dap_chain_cs_dag_t * a_dag, const char a_
     if ( dap_chain_cs_dag_event_sign_exists(l_event, l_event_size, l_poa_pvt->events_sign_cert->enc_key) ) {
         if (l_poa_pvt->auto_round_complete && s_round_event_ready_minimum_check(a_dag, l_event, l_event_size, (char*)a_key) ) {
             dap_chain_cs_dag_poa_round_item_t l_event_item = { .datum_hash = l_round_item->round_info.datum_hash, .dag = a_dag };
-            return s_round_event_cs_done(&l_event_item), l_ret;
-        } else 
-            return log_it(L_INFO, "Event %s is already signed by us", a_key), l_ret;
+            return s_round_event_cs_done(&l_event_item, a_by_us ? l_poa_pvt->confirmations_timeout : 2*l_poa_pvt->confirmations_timeout), l_ret;
+        }
     } else {
         if ( !l_poa_pvt->callback_pre_sign 
             || !l_poa_pvt->callback_pre_sign->callback
diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c
index 2cb6b3b806..f81527ebc8 100644
--- a/modules/type/dag/dap_chain_cs_dag.c
+++ b/modules/type/dag/dap_chain_cs_dag.c
@@ -679,7 +679,6 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da
      * or we have successfully chosen the hash(es) to link with.
      * No additional conditions required.
     */
-    ++l_dag->round_id;
     uint64_t l_event_size = 0;
     dap_chain_cs_dag_event_t * l_event = l_dag->callback_cs_event_create
             ? l_dag->callback_cs_event_create(l_dag, a_datum, l_hashes, l_hashes_linked, &l_event_size)
@@ -706,9 +705,9 @@ static bool s_chain_callback_datums_pool_proc(dap_chain_t *a_chain, dap_chain_da
     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 into new forming round [id %"DAP_UINT64_FORMAT_U"]"
-                 : "Can't add new event %s to new events round [id %"DAP_UINT64_FORMAT_U"]",
-           l_event_hash_hex_str, l_dag->round_id);
+           l_res ? "Event %s placed into new forming round"
+                 : "Can't add new event %s to new events round",
+           l_event_hash_hex_str);
     return l_res;
 }
 
diff --git a/modules/type/dag/dap_chain_cs_dag_event.c b/modules/type/dag/dap_chain_cs_dag_event.c
index 08faedc0af..c9d769f044 100644
--- a/modules/type/dag/dap_chain_cs_dag_event.c
+++ b/modules/type/dag/dap_chain_cs_dag_event.c
@@ -43,9 +43,9 @@
  * @param a_hashes_count
  * @return
  */
-dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, uint64_t a_round_id,
-                                                     dap_chain_datum_t *a_datum, dap_enc_key_t *a_key,
-                                                     dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size)
+dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id,
+                                                     dap_chain_datum_t *a_datum, dap_enc_key_t *a_key, dap_chain_hash_fast_t *a_hashes,
+                                                     size_t a_hashes_count, size_t *a_event_size)
 {
     assert(a_event_size);
     size_t l_hashes_size = sizeof(*a_hashes) * a_hashes_count,
@@ -53,7 +53,7 @@ dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id,
         l_event_size = sizeof(dap_chain_class_dag_event_hdr_t) + l_hashes_size + l_datum_size;
     dap_chain_cs_dag_event_t *l_event_new = DAP_NEW_Z_SIZE(dap_chain_cs_dag_event_t, l_event_size);
     *l_event_new = (dap_chain_cs_dag_event_t) {
-        { // .round_id = a_round_id,
+        {
             .ts_created = dap_time_now(),
             .chain_id = a_chain_id,
             .cell_id = a_cell_id,
@@ -154,11 +154,13 @@ size_t dap_chain_cs_dag_event_sign_add(dap_chain_cs_dag_event_t **a_event_ptr, s
     size_t l_event_size_excl_sign = dap_chain_cs_dag_event_calc_size_excl_signs(l_event, a_event_size);
     dap_sign_t *l_sign = dap_sign_create(a_key, l_event, l_event_size_excl_sign, 0);
     size_t l_sign_size = dap_sign_get_size(l_sign);
-    *a_event_ptr = l_event = DAP_REALLOC(l_event, a_event_size + l_sign_size);
+    if (! (l_event = DAP_REALLOC(*a_event_ptr, a_event_size + l_sign_size) ))
+        return log_it(L_CRITICAL, "Memory allocation error"), DAP_DELETE(l_sign), a_event_size;
     size_t l_event_size = a_event_size - sizeof(l_event->header);
     memcpy(l_event->hashes_n_datum_n_signs + l_event_size, l_sign, l_sign_size);
     l_event->header.signs_count++;
     DAP_DELETE(l_sign);
+    *a_event_ptr = l_event;
     return a_event_size + l_sign_size;
 }
 
@@ -237,12 +239,14 @@ size_t dap_chain_cs_dag_event_round_sign_add(dap_chain_cs_dag_event_round_item_t
         return 0;
     dap_sign_t * l_sign = dap_sign_create(a_key, &l_round_item->round_info.datum_hash, sizeof(dap_chain_hash_fast_t), 0);
     size_t l_sign_size = dap_sign_get_size(l_sign);
-    size_t l_offset = (size_t)l_round_item->data_size;
-    *a_round_item_ptr = l_round_item = DAP_REALLOC(l_round_item, a_round_item_size+l_sign_size);
-    memcpy(l_round_item->event_n_signs+l_offset, l_sign, l_sign_size);
+    size_t l_offset = l_round_item->data_size;
+    if (! (l_round_item = DAP_REALLOC(*a_round_item_ptr, a_round_item_size + l_sign_size)) )
+        return log_it(L_CRITICAL, "Memory allocaton error"), DAP_DELETE(l_sign), a_round_item_size;
+    memcpy(l_round_item->event_n_signs + l_offset, l_sign, l_sign_size);
     DAP_DELETE(l_sign);
     l_round_item->data_size += (uint32_t)l_sign_size;
-    return a_round_item_size+l_sign_size;
+    *a_round_item_ptr = l_round_item;
+    return a_round_item_size + l_sign_size;
 }
 
 /**
diff --git a/modules/type/dag/include/dap_chain_cs_dag.h b/modules/type/dag/include/dap_chain_cs_dag.h
index 42fc9e30dd..f28f7baf3c 100644
--- a/modules/type/dag/include/dap_chain_cs_dag.h
+++ b/modules/type/dag/include/dap_chain_cs_dag.h
@@ -61,8 +61,6 @@ typedef struct dap_chain_cs_dag
     dap_chain_hash_fast_t static_genesis_event_hash;
     dap_chain_cs_dag_hal_item_t *hal;
 
-    atomic_uint_fast64_t round_id;
-
     uint16_t datum_add_hashes_count;
     char * gdb_group_events_round_new;
 
diff --git a/modules/type/dag/include/dap_chain_cs_dag_event.h b/modules/type/dag/include/dap_chain_cs_dag_event.h
index 4de1d9055b..b56f5ae9b3 100644
--- a/modules/type/dag/include/dap_chain_cs_dag_event.h
+++ b/modules/type/dag/include/dap_chain_cs_dag_event.h
@@ -60,9 +60,8 @@ typedef struct dap_chain_cs_dag_event_round_item {
     uint8_t event_n_signs[]; // event // dap_chain_cs_dag_event_t
 } DAP_ALIGN_PACKED dap_chain_cs_dag_event_round_item_t;
 
-dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, uint64_t a_round_id,
-                                                     dap_chain_datum_t *a_datum, dap_enc_key_t *a_key,
-                                                     dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size);
+dap_chain_cs_dag_event_t *dap_chain_cs_dag_event_new(dap_chain_id_t a_chain_id, dap_chain_cell_id_t a_cell_id, dap_chain_datum_t *a_datum,
+                                                     dap_enc_key_t *a_key, dap_chain_hash_fast_t *a_hashes, size_t a_hashes_count, size_t *a_event_size);
 
 /**
  * @brief dap_chain_cs_dag_event_get_datum
-- 
GitLab