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