From 6103cf58cb30ffaf4baf1931f18e575e94341923 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Al=D0=B5x=D0=B0nder=20Lysik=D0=BEv?=
 <alexander.lysikov@demlabs.net>
Date: Mon, 18 Nov 2019 22:12:20 +0500
Subject: [PATCH] fixed sync chains

---
 dap_chain_node_cli_cmd.c | 13 ++++++++----
 dap_chain_node_client.c  | 43 ++++++++++++++++++++++++++++++++++++----
 2 files changed, 48 insertions(+), 8 deletions(-)

diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c
index 92ddb23..c0922a4 100644
--- a/dap_chain_node_cli_cmd.c
+++ b/dap_chain_node_cli_cmd.c
@@ -1074,7 +1074,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             return -1;
         }
         // wait connected
-        int timeout_ms = 5000; //5 sec = 5000 ms
+        int timeout_ms = 50000; //5 sec = 5000 ms
         int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms);
         if(res) {
             dap_chain_node_cli_set_reply_text(a_str_reply, "no response from node: code %d", res);
@@ -1183,7 +1183,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         }
         dap_stream_ch_set_ready_to_write(l_ch_chain, true);
         // wait for finishing of request
-        timeout_ms = 120000; // 20 min = 1200 sec = 1 200 000 ms
+        timeout_ms = 1200000; // 20 min = 1200 sec = 1 200 000 ms
         // TODO add progress info to console
         res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
         if(res < 0) {
@@ -1199,12 +1199,14 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
         dap_chain_t *l_chain = NULL;
         DL_FOREACH(l_net->pub.chains, l_chain)
         {
+            // reset state NODE_CLIENT_STATE_SYNCED
+            l_node_client->state = NODE_CLIENT_STATE_CONNECTED;
             // send request
             dap_stream_ch_chain_sync_request_t l_sync_request = { { 0 } };
             if(0 == dap_stream_ch_chain_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS,
                     l_net->pub.id, l_chain->id, l_remote_node_info->hdr.cell_id, &l_sync_request,
                     sizeof(l_sync_request))) {
-                dap_chain_node_cli_set_reply_text(a_str_reply, "Error: Cant send sync chains request");
+                dap_chain_node_cli_set_reply_text(a_str_reply, "Error: Can't send sync chains request");
                 // clean client struct
                 dap_chain_node_client_close(l_node_client);
                 DAP_DELETE(l_remote_node_info);
@@ -1214,9 +1216,12 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply)
             dap_stream_ch_set_ready_to_write(l_ch_chain, true);
 
             // wait for finishing of request
-            timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms
+            timeout_ms = 1200000; // 2 min = 120 sec = 120 000 ms
             // TODO add progress info to console
             res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms);
+            if(res < 0) {
+                log_it(L_ERROR, "Error: Can't sync chain %s", l_chain->name);
+            }
         }
         log_it(L_INFO, "Chains and gdb are synced");
         DAP_DELETE(l_remote_node_info);
diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c
index ee356a4..0a3fb88 100644
--- a/dap_chain_node_client.c
+++ b/dap_chain_node_client.c
@@ -46,8 +46,10 @@
 #include "dap_client.h"
 #include "dap_config.h"
 #include "dap_events.h"
+#include "dap_hash.h"
 #include "dap_http_client_simple.h"
 #include "dap_client_pvt.h"
+#include "dap_chain_global_db_remote.h"
 #include "dap_stream_ch_pkt.h"
 #include "dap_stream_ch_chain.h"
 #include "dap_stream_ch_chain_pkt.h"
@@ -305,12 +307,45 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha
                     a_ch_chain->request_net_id.uint64 = a_pkt->hdr.net_id.uint64;
                     a_ch_chain->request_cell_id.uint64 = a_pkt->hdr.cell_id.uint64;
                     a_ch_chain->request_chain_id.uint64 = a_pkt->hdr.chain_id.uint64;
-                    a_ch_chain->state = CHAIN_STATE_SYNC_GLOBAL_DB;
-
+                    a_ch_chain->state = dap_stream_ch_chain_pkt_type_to_dap_stream_ch_chain_state(a_pkt_type);//CHAIN_STATE_SYNC_CHAINS;//GLOBAL_DB;
+
+                    // type of first packet
+                    uint8_t l_type =
+                            (a_pkt_type != DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS) ?
+                                    DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB :
+                                    DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN;
+                    if(l_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_CHAIN)
+                    {
+                        dap_chain_t * l_chain = dap_chain_find_by_id(a_pkt->hdr.net_id, a_pkt->hdr.chain_id);
+                        // dbg
+                        dap_chain_atom_iter_t* l_iter = l_chain ? l_chain->callback_atom_iter_create(l_chain) : NULL;
+                        a_ch_chain->request_atom_iter = l_iter;
+
+                        dap_chain_atom_ptr_t * l_lasts = NULL;
+                        size_t l_lasts_size = 0;
+                        l_lasts = l_chain->callback_atom_iter_get_lasts(l_iter, &l_lasts_size);
+                        for(size_t i = 0; i < l_lasts_size; i++) {
+                            dap_chain_atom_item_t * l_item = NULL;
+                            dap_chain_hash_fast_t l_atom_hash;
+                            dap_hash_fast(l_lasts[i], l_chain->callback_atom_get_size(l_lasts[i]),
+                                    &l_atom_hash);
+                            HASH_FIND(hh, a_ch_chain->request_atoms_lasts, &l_atom_hash, sizeof(l_atom_hash), l_item);
+                            if(l_item == NULL) { // Not found, add new lasts
+                                l_item = DAP_NEW_Z(dap_chain_atom_item_t);
+                                l_item->atom = l_lasts[i];
+                                memcpy(&l_item->atom_hash, &l_atom_hash, sizeof(l_atom_hash));
+                                HASH_ADD(hh, a_ch_chain->request_atoms_lasts, atom_hash, sizeof(l_atom_hash), l_item);
+                            }
+                            else
+                                DAP_DELETE(l_lasts[i]);
+                        }
+                        DAP_DELETE(l_lasts);
+                        //DAP_DELETE(l_iter);
+                    }
                     dap_chain_node_addr_t l_node_addr = { 0 };
                     dap_chain_net_t *l_net = dap_chain_net_by_id(a_ch_chain->request_net_id);
-                    l_node_addr.uint64 = dap_db_get_cur_node_addr(l_net->pub.name);
-                    dap_stream_ch_chain_pkt_write(a_ch_chain->ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_FIRST_GLOBAL_DB,
+                    l_node_addr.uint64 = l_net ? dap_db_get_cur_node_addr(l_net->pub.name) : 0;
+                    dap_stream_ch_chain_pkt_write(a_ch_chain->ch, l_type,
                             a_ch_chain->request_net_id, a_ch_chain->request_chain_id,
                             a_ch_chain->request_cell_id, &l_node_addr, sizeof(dap_chain_node_addr_t));
 
-- 
GitLab