diff --git a/dap_chain_net.c b/dap_chain_net.c index e4d259b7e51d4565b60b6f570cc7be72a169b939..dda95d6c0558a47d40d55235942922723b9a9402 100644 --- a/dap_chain_net.c +++ b/dap_chain_net.c @@ -152,8 +152,8 @@ int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_n log_it(L_WARNING,"Already going to state %s",s_net_state_to_str(a_new_state)); } PVT(a_net)->state_target = a_new_state; - pthread_mutex_unlock( &PVT(a_net)->state_mutex); pthread_cond_signal(&PVT(a_net)->state_proc_cond); + pthread_mutex_unlock( &PVT(a_net)->state_mutex); return 0; } @@ -191,6 +191,7 @@ static void s_gbd_history_callback_notify (void * a_arg, const char a_op_code, c */ static int s_net_states_proc(dap_chain_net_t * l_net) { + dap_chain_net_pvt_t *pvt_debug = PVT(l_net); int ret=0; lb_proc_state: pthread_mutex_lock(&PVT(l_net)->state_mutex ); @@ -277,7 +278,7 @@ lb_proc_state: break; } // wait connected - int timeout_ms = 15000; //15 sec = 15000 ms + int timeout_ms = 5000; //15 sec = 15000 ms int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_CONNECTED, timeout_ms); if (res == 0 ){ log_it(L_NOTICE, "Connected link %u",i); @@ -369,7 +370,7 @@ lb_proc_state: } // wait for finishing of request - int timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms + int timeout_ms = 5000; // 2 min = 120 sec = 120 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); @@ -402,7 +403,8 @@ lb_proc_state: dap_stream_ch_chain_sync_request_t l_sync_gdb = {{0}}; // Get last timestamp in log l_sync_gdb.ts_start = (uint64_t) dap_db_log_get_last_timestamp_remote(l_node_client->remote_node_addr.uint64); - l_sync_gdb.ts_end = (uint64_t) time(NULL); + // no limit + l_sync_gdb.ts_end = (uint64_t)0;// time(NULL); log_it(L_DEBUG,"Prepared request to gdb sync from %llu to %llu",l_sync_gdb.ts_start,l_sync_gdb.ts_end); size_t l_res = dap_stream_ch_chain_pkt_write( dap_client_get_stream_ch(l_node_client->client, @@ -417,7 +419,7 @@ lb_proc_state: } // wait for finishing of request - int timeout_ms = 120000; // 2 min = 120 sec = 120 000 ms + int timeout_ms = 5000; // 2 min = 120 sec = 120 000 ms // TODO add progress info to console int res = dap_chain_node_client_wait(l_node_client, NODE_CLIENT_STATE_SYNCED, timeout_ms); switch (res) { @@ -478,9 +480,22 @@ lb_proc_state: PVT(l_net)->state = NET_STATE_ONLINE; }pthread_mutex_unlock(&PVT(l_net)->state_mutex ); goto lb_proc_state; - case NET_STATE_ONLINE:{ - log_it(L_NOTICE,"State online"); - } break; + case NET_STATE_ONLINE: { + log_it(L_NOTICE, "State online"); + switch ( PVT(l_net)->state_target) { + // disconnect + case NET_STATE_OFFLINE: + PVT(l_net)->state = NET_STATE_OFFLINE; + pthread_mutex_unlock(&PVT(l_net)->state_mutex); + goto lb_proc_state; + // sync + case NET_STATE_SYNC_GDB: + PVT(l_net)->state = NET_STATE_SYNC_GDB; + pthread_mutex_unlock(&PVT(l_net)->state_mutex); + goto lb_proc_state; + } + } + break; } pthread_mutex_unlock(&PVT(l_net)->state_mutex ); return ret; @@ -499,7 +514,22 @@ static void * s_net_proc_thread ( void * a_net) while( is_looping ) { s_net_states_proc(l_net); pthread_mutex_lock( &PVT(l_net)->state_mutex ); - pthread_cond_wait(&PVT(l_net)->state_proc_cond,&PVT(l_net)->state_mutex); + + int l_timeout_ms = 3000;// 3 sec + // prepare for signal waiting + struct timespec l_to; + clock_gettime(CLOCK_MONOTONIC, &l_to); + int64_t l_nsec_new = l_to.tv_nsec + l_timeout_ms * 1000000ll; + // if the new number of nanoseconds is more than a second + if(l_nsec_new > (long) 1e9) { + l_to.tv_sec += l_nsec_new / (long) 1e9; + l_to.tv_nsec = l_nsec_new % (long) 1e9; + } + else + l_to.tv_nsec = (long) l_nsec_new; + // signal waiting + pthread_cond_timedwait(&PVT(l_net)->state_proc_cond, &PVT(l_net)->state_mutex, &l_to); + //pthread_cond_wait(&PVT(l_net)->state_proc_cond,&PVT(l_net)->state_mutex); pthread_mutex_unlock( &PVT(l_net)->state_mutex ); log_it( L_DEBUG, "Waked up net proHASH_COUNT( c thread"); @@ -547,7 +577,10 @@ static dap_chain_net_t * s_net_new(const char * a_id, const char * a_name , dap_chain_net_t * ret = DAP_NEW_Z_SIZE (dap_chain_net_t, sizeof (ret->pub)+ sizeof (dap_chain_net_pvt_t) ); ret->pub.name = strdup( a_name ); pthread_mutex_init( &PVT(ret)->state_mutex, NULL); - pthread_cond_init( &PVT(ret)->state_proc_cond, NULL); + pthread_condattr_t l_attr; + pthread_condattr_init(&l_attr); + pthread_condattr_setclock(&l_attr, CLOCK_MONOTONIC); + pthread_cond_init( &PVT(ret)->state_proc_cond, &l_attr); if ( sscanf(a_id,"0x%016lx", &ret->pub.id.uint64 ) == 1 ){ if (strcmp (a_node_role, "root_master")==0){ PVT(ret)->node_role.enums = NODE_ROLE_ROOT_MASTER; @@ -729,6 +762,13 @@ static int s_cli_net(int argc, const char ** argv, char **a_str_reply) c_net_states[PVT(l_net)->state_target]); } + else if(strcmp(l_go_str, "sync") == 0) { + dap_chain_net_state_go_to(l_net, NET_STATE_SYNC_GDB); + dap_chain_node_cli_set_reply_text(a_str_reply, "Network \"%s\" go from state %s to %s", + l_net->pub.name, c_net_states[PVT(l_net)->state], + c_net_states[PVT(l_net)->state_target]); + + } } else if ( l_get_str){ if ( strcmp(l_get_str,"status") == 0 ) { diff --git a/dap_chain_net.h b/dap_chain_net.h index 4cf307089b2afd038bb081aad0b14f7ba9e031a1..fb904da4a30bb0710f652a8e2de48e11e0e7a6d4 100644 --- a/dap_chain_net.h +++ b/dap_chain_net.h @@ -42,9 +42,9 @@ typedef enum dap_chain_net_state{ NET_STATE_LINKS_CONNECTING, NET_STATE_LINKS_ESTABLISHED, NET_STATE_ADDR_REQUEST, // Waiting for address assign + NET_STATE_ONLINE, NET_STATE_SYNC_GDB, NET_STATE_SYNC_CHAINS, - NET_STATE_ONLINE, } dap_chain_net_state_t;