From 5fee1faa92ea6fe7e96cf3111f0a99688ff02583 Mon Sep 17 00:00:00 2001
From: Roman Khlopkov <roman.khlopkov@demlabs.net>
Date: Fri, 11 Aug 2023 12:36:37 +0300
Subject: [PATCH] [*] ESBOCS emergency mode sync fix

---
 modules/consensus/esbocs/dap_chain_cs_esbocs.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/modules/consensus/esbocs/dap_chain_cs_esbocs.c b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
index 9e56b71a7d..9fd77474e7 100644
--- a/modules/consensus/esbocs/dap_chain_cs_esbocs.c
+++ b/modules/consensus/esbocs/dap_chain_cs_esbocs.c
@@ -357,8 +357,6 @@ static void s_session_db_serialize(dap_global_db_context_t *a_context, void *a_a
 static void s_session_load_penaltys(dap_chain_esbocs_session_t *a_session)
 {
     const char *l_penalty_group = s_get_penalty_group(a_session->chain->net_id);
-    // TODO: remove it after consensus stabilization
-    dap_global_db_del_sync(l_penalty_group, NULL);
     size_t l_group_size = 0;
     dap_global_db_obj_t *l_keys = dap_global_db_get_all_sync(l_penalty_group, &l_group_size);
     for (size_t i = 0; i < l_group_size; i++) {
@@ -1127,10 +1125,13 @@ static void s_session_proc_state(dap_chain_esbocs_session_t *a_session)
     switch (a_session->state) {
     case DAP_CHAIN_ESBOCS_SESSION_STATE_WAIT_START: {
         a_session->listen_ensure = 1;
-        bool l_round_skip = !s_validator_check(&a_session->my_signing_addr, a_session->cur_round.validators_list);
+        bool l_round_skip = PVT(a_session->esbocs)->emergency_mode ?
+                    false : !s_validator_check(&a_session->my_signing_addr, a_session->cur_round.validators_list);
         if (a_session->ts_round_sync_start && l_time - a_session->ts_round_sync_start >=
                 PVT(a_session->esbocs)->round_start_sync_timeout) {
-            if (a_session->cur_round.validators_synced_count >= PVT(a_session->esbocs)->min_validators_count && !l_round_skip) {
+            uint16_t l_min_validators_synced = PVT(a_session->esbocs)->emergency_mode ?
+                        a_session->cur_round.total_validators_synced : a_session->cur_round.validators_synced_count;
+            if (l_min_validators_synced >= PVT(a_session->esbocs)->min_validators_count && !l_round_skip) {
                 a_session->cur_round.id = s_session_calc_current_round_id(a_session);
                 debug_if(l_cs_debug, L_MSG, "net:%s, chain:%s, round:%"DAP_UINT64_FORMAT_U", attempt:%hhu."
                                             " Minimum count of validators are synchronized, wait to submit candidate",
-- 
GitLab