diff --git a/dap_chain_net.c b/dap_chain_net.c index f8edbc70b8b56cb2f6fe4322517e097ee7538363..2e6ae1abd3d4f8c0c56018f0ce1af227d4feb6ea 100644 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -413,7 +413,13 @@ lb_proc_state: case NODE_ROLE_MASTER:{ PVT(l_net)->state = NET_STATE_ADDR_REQUEST; } break; - default: PVT( l_net)->state = NET_STATE_SYNC_GDB; + default:{ + // get addr for current node if it absent + if(dap_chain_net_get_cur_addr_int(l_net)) + PVT(l_net)->state = NET_STATE_ADDR_REQUEST; + else + PVT( l_net)->state = NET_STATE_SYNC_GDB; + } } }pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state; case NET_STATE_SYNC_GDB: // we need only to sync gdb @@ -452,7 +458,11 @@ lb_proc_state: dap_chain_node_client_t * l_node_client = NULL, *l_node_client_tmp = NULL; HASH_ITER(hh,PVT(l_net)->links,l_node_client,l_node_client_tmp){ uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); // Channel id for chain net request - size_t res = dap_stream_ch_chain_net_pkt_write(dap_client_get_stream_ch(l_node_client->client, l_ch_id), + dap_stream_ch_t * l_ch_chain = dap_client_get_stream_ch(l_node_client->client, l_ch_id); + // set callback for l_ch_id + dap_chain_node_client_set_callbacks( l_node_client->client, l_ch_id); + // send request for new address + size_t res = dap_stream_ch_chain_net_pkt_write(l_ch_chain, DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_LEASE_REQUEST, //DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_NODE_ADDR_REQUEST, l_net->pub.id, NULL, 0); @@ -464,13 +474,18 @@ lb_proc_state: } // wait for finishing of request - int timeout_ms = 5000; // 2 min = 120 sec = 120 000 ms + int timeout_ms = 5000; // 5 sec = 5 000 ms // TODO add progress info to console PVT(l_net)->addr_request_attempts++; int l_res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_NODE_ADDR_LEASED, timeout_ms); switch (l_res) { case -1: log_it(L_WARNING,"Timeout with addr leasing"); + // try again 3 times + if(PVT(l_net)->addr_request_attempts < 3) { + pthread_mutex_unlock(&PVT(l_net)->state_mutex); + goto lb_proc_state; + } continue; // try with another link case 0: log_it(L_INFO, "Node address leased"); @@ -1511,6 +1526,12 @@ dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net) return PVT(l_net)->node_info? &PVT(l_net)->node_info->hdr.address: PVT(l_net)->node_addr; } +uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net) +{ + return 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); +} + dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net) { return PVT(l_net)->node_info? &PVT(l_net)->node_info->hdr.cell_id: 0; diff --git a/dap_chain_net.h b/dap_chain_net.h index 9cff00b5e499d4e780252e4ca17f83cd4bc67ce1..05d9e73f13bd4e687299c83e89e91d342501908a 100644 --- a/dap_chain_net.h +++ b/dap_chain_net.h @@ -102,6 +102,7 @@ dap_ledger_t * dap_chain_ledger_by_net_name( const char * a_net_name); dap_chain_t * dap_chain_net_get_chain_by_name( dap_chain_net_t * l_net, const char * a_name); dap_chain_node_addr_t * dap_chain_net_get_cur_addr( dap_chain_net_t * l_net); +uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t * l_net); dap_chain_cell_id_t * dap_chain_net_get_cur_cell( dap_chain_net_t * l_net); void dap_chain_net_links_connect(dap_chain_net_t * a_net); diff --git a/dap_chain_node_cli_cmd.c b/dap_chain_node_cli_cmd.c index 3dfe96961b54af3db5ab4649ce1420e14825a07c..505008291e708c44740dedf35bd88e3531ca0177 100644 --- a/dap_chain_node_cli_cmd.c +++ b/dap_chain_node_cli_cmd.c @@ -1058,11 +1058,10 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) // fill end id = 0 - no time limit //l_sync_request.ts_end = 0; // fill current node address - l_sync_request.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); - //feature-2630 - //if(!l_sync_request.node_addr.uint64 ) + l_sync_request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); + + // if need to get current node address (feature-2630) + if(!l_sync_request.node_addr.uint64 ) { log_it(L_NOTICE, "Now get node addr"); uint8_t l_ch_id = dap_stream_ch_chain_net_get_id(); @@ -1215,7 +1214,7 @@ int com_node(int a_argc, char ** a_argv, char **a_str_reply) dap_chain_node_info_t *node_info = node_info_read_and_reply(l_net, &l_node_addr, a_str_reply); if(!node_info) return -6; - int timeout_ms = 10000; //10 sec = 10000 ms + int timeout_ms = 5000; //5 sec = 5000 ms // start handshake dap_chain_node_client_t *client = dap_chain_node_client_connect(node_info); if(!client) {