From 78b20a43c8f330c4b73c73037282ab92f7173bdd Mon Sep 17 00:00:00 2001 From: "Dmitriy A. Gerasimov" <dmitriy.gerasimov@demlabs.net> Date: Thu, 21 Jan 2021 21:09:12 +0700 Subject: [PATCH] [*] state machine fixes --- modules/net/dap_chain_net.c | 40 ++++++++++++++++++++++++----- modules/net/dap_chain_node_client.c | 17 +++++------- 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 4a69c2eb44..63ed017fc0 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -434,6 +434,7 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie a_node_client->state = NODE_CLIENT_STATE_ESTABLISHED; + a_node_client->stream_worker = dap_client_get_stream_worker(a_node_client->client); if( !a_node_client->is_reconnecting || s_debug_more ) log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_link_info->hdr.address)); pthread_rwlock_wrlock(&l_net_pvt->rwlock); @@ -452,7 +453,14 @@ static void s_node_link_callback_connected(dap_chain_node_client_t * a_node_clie dap_chain_t *l_chain = dap_chain_net_get_chain_by_name(l_net, "gdb"); dap_chain_id_t l_chain_id = l_chain ? l_chain->id : (dap_chain_id_t ) {0}; - dap_stream_ch_chain_pkt_write_unsafe( a_node_client->ch_chain, + a_node_client->ch_chain = dap_client_get_stream_ch_unsafe(a_node_client->client,dap_stream_ch_chain_get_id() ); + if (a_node_client->ch_chain) + a_node_client->ch_chain_uuid = a_node_client->ch_chain->uuid; + + a_node_client->ch_chain_net = dap_client_get_stream_ch_unsafe(a_node_client->client,dap_stream_ch_chain_get_id() ); + if(a_node_client->ch_chain_net) + a_node_client->ch_chain_net_uuid = a_node_client->ch_chain_net->uuid; + dap_stream_ch_chain_pkt_write_unsafe( a_node_client->ch_chain , DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNC_GLOBAL_DB, l_net->pub.id, l_chain_id, l_net->pub.cell_id, &l_sync_gdb, sizeof(l_sync_gdb)); } @@ -614,10 +622,12 @@ static void s_net_state_link_prepare_error(dap_worker_t * a_worker,dap_chain_nod if(!l_net_pvt->links_dns_requests ){ if( l_net_pvt->state != NET_STATE_OFFLINE){ - log_it(L_WARNING,"Can't prepare links via DNS requests"); - l_net_pvt->state = NET_STATE_OFFLINE; - l_net_pvt->state_target = NET_STATE_OFFLINE; + log_it(L_WARNING,"Can't prepare links via DNS requests. Prefilling links with root addresses"); + l_net_pvt->state = NET_STATE_LINKS_CONNECTING; + pthread_rwlock_unlock(&l_net_pvt->rwlock); + s_fill_links_from_root_aliases(l_net); dap_proc_queue_add_callback_inter( a_worker->proc_queue_input,s_net_states_proc,l_net ); + return; } } pthread_rwlock_unlock(&l_net_pvt->rwlock); @@ -685,7 +695,9 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) case NODE_ROLE_CELL_MASTER: { if (l_net_pvt->seed_aliases_count) { // Add other root nodes as synchronization links + pthread_rwlock_unlock(&l_net_pvt->rwlock); s_fill_links_from_root_aliases(l_net); + pthread_rwlock_wrlock(&l_net_pvt->rwlock); l_net_pvt->state = NET_STATE_LINKS_CONNECTING; l_repeat_after_exit = true; break; @@ -743,7 +755,9 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) } } if (l_sync_fill_root_nodes){ + pthread_rwlock_unlock(&l_net_pvt->rwlock); s_fill_links_from_root_aliases(l_net); + pthread_rwlock_wrlock(&l_net_pvt->rwlock); } l_link_id++; } break; @@ -751,18 +765,30 @@ static bool s_net_states_proc(dap_proc_thread_t *a_thread, void *a_arg) } break; case NET_STATE_LINKS_CONNECTING: { - log_it(L_DEBUG, "%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name); + log_it(L_INFO, "%s.state: NET_STATE_LINKS_CONNECTING",l_net->pub.name); for (dap_list_t *l_tmp = l_net_pvt->links_info; l_tmp; l_tmp = dap_list_next(l_tmp)) { dap_chain_node_info_t *l_link_info = (dap_chain_node_info_t *)l_tmp->data; (void) dap_chain_net_client_create_n_connect(l_net,l_link_info); } } break; case NET_STATE_LINKS_ESTABLISHED:{ - // TODO call some callbacks? + log_it(L_INFO,"%s.state: NET_STATE_LINKS_ESTABLISHED", l_net->pub.name); + for (dap_list_t *l_tmp = l_net_pvt->links ; l_tmp; l_tmp = dap_list_next(l_tmp)) { + dap_chain_node_client_t *l_link = (dap_chain_node_client_t *)l_tmp->data; + // + } + }break; + case NET_STATE_SYNC_GDB :{ + log_it(L_INFO,"%s.state: NET_STATE_SYNC_GDB", l_net->pub.name); }break; + case NET_STATE_SYNC_CHAINS:{ + log_it(L_INFO,"%s.state: NET_STATE_SYNC_CHAINS", l_net->pub.name); + }break; + + case NET_STATE_ONLINE: { - // TODO call some callbacks? + log_it(L_NOTICE,"%s.state: NET_STATE_ONLINE", l_net->pub.name); } break; default: log_it (L_DEBUG, "Unprocessed state"); diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index e4f72f6da6..e78793c821 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -297,12 +297,9 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha dap_chain_cell_t * l_cell = l_node_client->cur_chain->cells; if (l_cell){ l_cell_id=l_cell->id; - dap_stream_ch_chain_pkt_write_unsafe(a_ch_chain->ch,DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ,l_net->pub.id , - l_chain_id,l_cell_id,NULL,0); - }else{ - log_it(L_CRITICAL,"Can't sync %s.%s because there is no cells in chain",l_net->pub.name, l_node_client->cur_chain->name); - dap_stream_ch_chain_pkt_write_error_unsafe(a_ch_chain->ch,l_net->pub.id, l_chain_id,l_cell_id,"ERROR_CHAIN_NO_CELLS"); } + dap_stream_ch_chain_pkt_write_unsafe(a_ch_chain->ch,DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ,l_net->pub.id , + l_chain_id,l_cell_id,NULL,0); } }break; @@ -542,16 +539,14 @@ dap_chain_node_client_t* dap_chain_node_client_create_n_connect(dap_chain_net_t int hostlen = 128; char host[hostlen]; - if(a_node_info->hdr.ext_addr_v4.s_addr) - { + if(a_node_info->hdr.ext_addr_v4.s_addr){ struct sockaddr_in sa4 = { .sin_family = AF_INET, .sin_addr = a_node_info->hdr.ext_addr_v4 }; inet_ntop(AF_INET, &(((struct sockaddr_in *) &sa4)->sin_addr), host, hostlen); - log_it(L_DEBUG, "Connect to %s address",host); - } else - { + log_it(L_INFO, "Connecting to %s address",host); + } else { struct sockaddr_in6 sa6 = { .sin6_family = AF_INET6, .sin6_addr = a_node_info->hdr.ext_addr_v6 }; inet_ntop(AF_INET6, &(((struct sockaddr_in6 *) &sa6)->sin6_addr), host, hostlen); - log_it(L_DEBUG, "Connect to %s address",host); + log_it(L_INFO, "Connecting to %s address",host); } // address not defined if(!strcmp(host, "::")) { -- GitLab