From a9f164108bebe2f61c767f088115ba19c46b3773 Mon Sep 17 00:00:00 2001 From: Constantin P <papizh.konstantin@demlabs.net> Date: Wed, 9 Aug 2023 19:50:48 +0700 Subject: [PATCH] ... --- modules/net/dap_chain_net.c | 30 ++++++++++++------------------ 1 file changed, 12 insertions(+), 18 deletions(-) diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index a372e22211..eed26a2c4b 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -208,7 +208,6 @@ typedef struct dap_chain_net_pvt{ pthread_mutex_t uplinks_mutex; pthread_rwlock_t downlinks_lock; - pthread_rwlock_t balancer_lock; pthread_rwlock_t states_lock; dap_list_t *gdb_notifiers; @@ -465,7 +464,7 @@ int dap_chain_net_add_downlink(dap_chain_net_t *a_net, dap_stream_worker_t *a_wo unsigned a_hash_value; HASH_VALUE(&a_ch_uuid, sizeof(a_ch_uuid), a_hash_value); struct downlink *l_downlink = NULL; - pthread_rwlock_rdlock(&l_net_pvt->downlinks_lock); + pthread_rwlock_wrlock(&l_net_pvt->downlinks_lock); HASH_FIND_BYHASHVALUE(hh, l_net_pvt->downlinks, &a_ch_uuid, sizeof(a_ch_uuid), a_hash_value, l_downlink); if (l_downlink) { pthread_rwlock_unlock(&l_net_pvt->downlinks_lock); @@ -505,7 +504,7 @@ void dap_chain_net_sync_gdb_broadcast(dap_global_db_context_t *a_context, dap_st dap_chain_net_t *l_net = (dap_chain_net_t *)a_arg; dap_global_db_pkt_t *l_data_out = dap_global_db_pkt_serialize(a_obj); struct downlink *l_link, *l_tmp; - pthread_rwlock_rdlock(&PVT(l_net)->downlinks_lock); + pthread_rwlock_wrlock(&PVT(l_net)->downlinks_lock); HASH_ITER(hh, PVT(l_net)->downlinks, l_link, l_tmp) { bool l_ch_alive = dap_stream_ch_check_uuid_mt(l_link->worker, l_link->ch_uuid); if (!l_ch_alive) { @@ -884,9 +883,9 @@ static void s_node_link_callback_disconnected(dap_chain_node_client_t *a_node_cl if (l_net_pvt->state_target != NET_STATE_OFFLINE) { pthread_mutex_lock(&l_net_pvt->uplinks_mutex); s_net_link_remove(l_net_pvt, a_node_client, l_net_pvt->only_static_links); - char *l_key = dap_chain_node_addr_to_hash_str(&a_node_client->info->hdr.address); - dap_global_db_del_sync(l_net->pub.gdb_nodes, l_key); - DAP_DELETE(l_key); + //char *l_key = dap_chain_node_addr_to_hash_str(&a_node_client->info->hdr.address); + //dap_global_db_del_sync(l_net->pub.gdb_nodes, l_key); + //DAP_DELETE(l_key); log_it(L_DEBUG, "Remove "NODE_ADDR_FP_STR" from local db",NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address)); a_node_client->keep_connection = false; a_node_client->callbacks.delete = NULL; @@ -987,14 +986,12 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, static void s_net_links_complete_and_start(dap_chain_net_t *a_net, dap_worker_t *a_worker) { dap_chain_net_pvt_t * l_net_pvt = PVT(a_net); - pthread_rwlock_rdlock(&l_net_pvt->balancer_lock); if (--l_net_pvt->balancer_link_requests == 0){ // It was the last one // No links obtained from DNS if (HASH_COUNT(l_net_pvt->net_links) == 0 && !l_net_pvt->balancer_http) { // Try to get links from HTTP balancer l_net_pvt->balancer_http = true; s_prepare_links_from_balancer(a_net); - pthread_rwlock_unlock(&l_net_pvt->balancer_lock); return; } if (HASH_COUNT(l_net_pvt->net_links) < l_net_pvt->max_links_count) @@ -1006,7 +1003,6 @@ static void s_net_links_complete_and_start(dap_chain_net_t *a_net, dap_worker_t pthread_rwlock_unlock(&l_net_pvt->states_lock); dap_proc_queue_add_callback_inter(a_worker->proc_queue_input, s_net_states_proc, a_net); } - pthread_rwlock_unlock(&l_net_pvt->balancer_lock); } /** @@ -1066,14 +1062,16 @@ static void s_net_balancer_link_prepare_success(dap_worker_t * a_worker, dap_cha s_net_get_active_links_count(l_net) < PVT(l_net)->required_links_count) { // Auto-start new link pthread_rwlock_rdlock(&PVT(l_net)->states_lock); - if (PVT(l_net)->state_target != NET_STATE_OFFLINE) { + dap_chain_net_state_t l_net_state = PVT(l_net)->state_target; + pthread_rwlock_unlock(&PVT(l_net)->states_lock); + if (l_net_state != NET_STATE_OFFLINE) { struct net_link *l_free_link = s_get_free_link(l_net); if (l_free_link) s_net_link_start(l_net, l_free_link, PVT(l_net)->reconnect_delay); else s_new_balancer_link_request(l_net, l_balancer_request->link_replace_tries); } - pthread_rwlock_unlock(&PVT(l_net)->states_lock); + } if (!l_balancer_request->link_replace_tries) @@ -1164,16 +1162,15 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla if (l_free_link) s_net_link_start(a_net, l_free_link, l_net_pvt->reconnect_delay); pthread_mutex_unlock(&l_net_pvt->uplinks_mutex); - return false; + return true; } if(!a_link_replace_tries){ - dap_chain_net_node_balancer_t *l_link_full_node_list = dap_chain_net_balancer_get_node(a_net->pub.name,l_net_pvt->max_links_count); + dap_chain_net_node_balancer_t *l_link_full_node_list = dap_chain_net_balancer_get_node(a_net->pub.name,l_net_pvt->required_links_count); size_t node_cnt = 0,i = 0; if(l_link_full_node_list) { dap_chain_node_info_t * l_node_info = (dap_chain_node_info_t *)l_link_full_node_list->nodes_info; node_cnt = l_link_full_node_list->count_node; - pthread_rwlock_rdlock(&PVT(a_net)->states_lock); int l_net_link_add = 0; while(!l_net_link_add){ if(i >= node_cnt) @@ -1198,8 +1195,7 @@ static bool s_new_balancer_link_request(dap_chain_net_t *a_net, int a_link_repla struct net_link *l_free_link = s_get_free_link(a_net); if (l_free_link) s_net_link_start(a_net, l_free_link, l_net_pvt->reconnect_delay); - pthread_rwlock_unlock(&PVT(a_net)->states_lock); - return false; + return true; } } dap_chain_node_info_t *l_link_node_info = dap_get_balancer_link_from_cfg(a_net); @@ -1545,7 +1541,6 @@ static dap_chain_net_t *s_net_new(const char *a_id, const char *a_name, pthread_mutex_init(&PVT(l_ret)->uplinks_mutex, &l_mutex_attr); pthread_mutexattr_destroy(&l_mutex_attr); pthread_rwlock_init(&PVT(l_ret)->downlinks_lock, NULL); - pthread_rwlock_init(&PVT(l_ret)->balancer_lock, NULL); pthread_rwlock_init(&PVT(l_ret)->states_lock, NULL); if (dap_chain_net_id_parse(a_id, &l_ret->pub.id) != 0) { DAP_DELETE(l_ret); @@ -1583,7 +1578,6 @@ void dap_chain_net_delete( dap_chain_net_t * a_net ) { pthread_mutex_destroy(&PVT(a_net)->uplinks_mutex); pthread_rwlock_destroy(&PVT(a_net)->downlinks_lock); - pthread_rwlock_destroy(&PVT(a_net)->balancer_lock); pthread_rwlock_destroy(&PVT(a_net)->states_lock); if(PVT(a_net)->seed_aliases) { DAP_DELETE(PVT(a_net)->seed_aliases); -- GitLab