From 1a11555810692bd45fcc88111c06b16ec328b4c3 Mon Sep 17 00:00:00 2001 From: Roman Khlopkov <roman.khlopkov@demlabs.net> Date: Wed, 29 Jul 2020 17:58:42 +0300 Subject: [PATCH] [+] GDB reverse sync request --- modules/channel/chain/dap_stream_ch_chain.c | 18 +++++- modules/net/dap_chain_net.c | 61 ++++++++------------- 2 files changed, 39 insertions(+), 40 deletions(-) diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 7f93f8111a..b6ab690f90 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -510,9 +510,23 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } } break; - default:{ + case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB_RVRS: { + dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; + memcpy(&l_sync_gdb, l_chain_pkt->data, l_chain_pkt_data_size); + dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain->request_net_id); + l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr(l_net) ? + dap_chain_net_get_cur_addr(l_net)->uint64 : + dap_db_get_cur_node_addr(l_net->pub.name); + // Get last timestamp in log + l_sync_gdb.id_start = (uint64_t) dap_db_log_get_last_id_remote(l_ch_chain->request.node_addr.uint64); + // no limit + l_sync_gdb.id_end = (uint64_t)0; + dap_stream_ch_chain_pkt_write(a_ch, DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_chain_pkt->hdr.net_id, + l_chain_pkt->hdr.chain_id, l_chain_pkt->hdr.cell_id, &l_sync_gdb, sizeof(l_sync_gdb)); + } + default: { //log_it(L_INFO, "Get %s packet", c_dap_stream_ch_chain_pkt_type_str[l_ch_pkt->hdr.type]); - } + } } if(l_ch_chain->callback_notify_packet_in) l_ch_chain->callback_notify_packet_in(l_ch_chain, l_ch_pkt->hdr.type, l_chain_pkt, diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 4ecadf7742..1ccac6cdd2 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -492,34 +492,23 @@ static int s_net_states_proc(dap_chain_net_t * l_net) break; case NET_STATE_SYNC_CHAINS: { - dap_chain_node_client_t *l_node_client = l_pvt_net->links; - uint8_t l_ch_id = dap_stream_ch_chain_get_id(); // Channel id for global_db and chains sync - dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); - if(!l_ch_chain) { - log_it(L_DEBUG,"Can't get stream_ch for id='%c' ", l_ch_id); - l_pvt_net->state = NET_STATE_LINKS_CONNECTING; - break; - } - dap_chain_t * l_chain = NULL; - int l_sync_errors = 0; - DL_FOREACH(l_net->pub.chains, l_chain ){ - //size_t l_lasts_size = 0; - //dap_chain_atom_ptr_t * l_lasts; - //dap_chain_atom_iter_t * l_atom_iter = l_chain->callback_atom_iter_create(l_chain); - //l_lasts = l_chain->callback_atom_iter_get_lasts(l_atom_iter, &l_lasts_size); - //if( l_lasts ) { + for (dap_list_t *l_tmp = l_pvt_net->links; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_client_t *l_node_client = (dap_chain_node_client_t *)l_tmp->data; + uint8_t l_ch_id = dap_stream_ch_chain_get_id(); // Channel id for global_db and chains sync + dap_stream_ch_t *l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + if (!l_ch_chain) { + log_it(L_DEBUG,"Can't get stream_ch for id='%c' ", l_ch_id); + continue; + } + dap_chain_t * l_chain = NULL; + int l_sync_errors = 0; + DL_FOREACH (l_net->pub.chains, l_chain) { l_node_client->state = NODE_CLIENT_STATE_CONNECTED; dap_stream_ch_chain_sync_request_t l_request ; memset(&l_request, 0, sizeof (l_request)); - //dap_hash_fast(l_lasts[0], l_chain->callback_atom_get_size(l_lasts[0]), &l_request.hash_from); 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_net->pub.cell_id, &l_request, sizeof(l_request)); - // - // dap_chain_node_client_send_ch_pkt(l_node_client,l_ch_id, - // DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_CHAINS, - // &l_request,sizeof (l_request) ); - // wait for finishing of request int timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms // TODO add progress info to console @@ -535,7 +524,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) // set time of last sync { struct timespec l_to; - clock_gettime( CLOCK_MONOTONIC, &l_to); + clock_gettime(CLOCK_MONOTONIC, &l_to); l_pvt_net->last_sync = l_to.tv_sec; } break; @@ -545,19 +534,15 @@ static int s_net_states_proc(dap_chain_net_t * l_net) if (l_res) { l_sync_errors++; } - //DAP_DELETE( l_lasts ); - //} - //DAP_DELETE( l_atom_iter ); + } } - dap_chain_node_client_close(l_node_client); - l_pvt_net->links = NULL; - if (!l_sync_errors) { - l_pvt_net->links_success++; + if (l_pvt_net->state_target == NET_STATE_ONLINE){ + l_pvt_net->state = NET_STATE_ONLINE; + } else { // Synchronization done, go offline + l_pvt_net->state = l_pvt_net->state_target = NET_STATE_OFFLINE; } - l_pvt_net->state = NET_STATE_LINKS_CONNECTING; break; - } - break; + } break; case NET_STATE_ONLINE: { if (l_pvt_net->flags & F_DAP_CHAIN_NET_GO_SYNC) @@ -571,7 +556,7 @@ static int s_net_states_proc(dap_chain_net_t * l_net) case NET_STATE_ONLINE: case NET_STATE_SYNC_GDB: case NET_STATE_SYNC_CHAINS: - l_pvt_net->state = NET_STATE_LINKS_CONNECTING; + l_pvt_net->state = NET_STATE_SYNC_GDB; break; default: break; } @@ -998,16 +983,16 @@ static int s_cli_net( int argc, char **argv, void *arg_func, char **a_str_reply) dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" has state %s (target state %s), active links %u from %u, cur node address not defined", l_net->pub.name, c_net_states[PVT(l_net)->state], - c_net_states[PVT(l_net)->state_target], PVT(l_net)->links_count, - PVT(l_net)->links_addrs_count + c_net_states[PVT(l_net)->state_target], dap_list_length(PVT(l_net)->links), + dap_list_length(PVT(l_net)->links_info) ); } else { dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" has state %s (target state %s), active links %u from %u, cur node address " NODE_ADDR_FP_STR, l_net->pub.name, c_net_states[PVT(l_net)->state], - c_net_states[PVT(l_net)->state_target], PVT(l_net)->links_count, - PVT(l_net)->links_addrs_count, + c_net_states[PVT(l_net)->state_target], dap_list_length(PVT(l_net)->links), + dap_list_length(PVT(l_net)->links_info), NODE_ADDR_FP_ARGS_S(l_cur_node_addr) ); } -- GitLab