diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 534edc9d83fd0ed22c708f090528ab437b426a6d..75c6535935c1a8f62a07ce3c17f0b3824f97b735 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -253,6 +253,7 @@ static void s_nodelist_change_notify(dap_store_obj_t *a_obj, void *a_arg); static int s_net_init(const char * a_net_name, uint16_t a_acl_idx); static int s_net_load(dap_chain_net_t *a_net); +static int s_net_try_online(dap_chain_net_t *a_net); static int s_cli_net(int argc, char ** argv, void **a_str_reply); static uint8_t *s_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash); @@ -2777,7 +2778,7 @@ int s_net_load(dap_chain_net_t *a_net) // Do specific role actions post-chain created l_net_pvt->state_target = NET_STATE_OFFLINE; - dap_chain_net_state_t l_target_state = NET_STATE_OFFLINE; + l_net_pvt->only_static_links = false; switch ( l_net_pvt->node_role.enums ) { case NODE_ROLE_ROOT_MASTER:{ @@ -2822,12 +2823,7 @@ int s_net_load(dap_chain_net_t *a_net) } if (!l_net_pvt->only_static_links) l_net_pvt->only_static_links = dap_config_get_item_bool_default(l_cfg, "general", "links_static_only", false); - if (dap_config_get_item_bool_default(g_config ,"general", "auto_online", false)) - { - dap_chain_net_balancer_prepare_list_links(l_net->pub.name,true); - l_target_state = NET_STATE_ONLINE; - } - + l_net_pvt->load_mode = false; l_net_pvt->balancer_http = !dap_config_get_item_bool_default(l_cfg, "general", "use_dns_links", false); @@ -2931,16 +2927,65 @@ int s_net_load(dap_chain_net_t *a_net) uint32_t l_timeout = dap_config_get_item_uint32_default(g_config, "node_client", "timer_update_states", 600); PVT(l_net)->main_timer = dap_interval_timer_create(l_timeout * 1000, s_main_timer_callback, l_net); - log_it(L_INFO, "Chain network \"%s\" initialized",l_net->pub.name); + dap_config_close(l_cfg); + log_it(L_INFO, "Chain network \"%s\" initialized",l_net->pub.name); + return 0; +} + +/** + * @brief try net to go online + * + * @param a_net dap_chain_net_t *: network + * @return int + * + **/ +static int s_net_try_online(dap_chain_net_t *a_net) +{ + + dap_chain_net_t *l_net = a_net; + + dap_chain_net_pvt_t * l_net_pvt = PVT(l_net); + dap_chain_net_state_t l_target_state = NET_STATE_OFFLINE; + + if (dap_config_get_item_bool_default(g_config ,"general", "auto_online", false)) + { + dap_chain_net_balancer_prepare_list_links(l_net->pub.name, true); + l_target_state = NET_STATE_ONLINE; + } + if (l_target_state != l_net_pvt->state_target) + { dap_chain_net_state_go_to(l_net, l_target_state); + log_it(L_INFO, "Network \"%s\" goes online",l_net->pub.name); + } + return 0; } +/** + * @brief + * change all network states according to auto-online settings + */ +void dap_chain_net_try_online_all() { + int32_t l_ret = 0; + + if(!HASH_COUNT(s_net_items)){ + log_it(L_ERROR, "Can't find any nets"); + return; + } + dap_chain_net_item_t *l_net_items_current = NULL, *l_net_items_tmp = NULL; + HASH_ITER(hh, s_net_items, l_net_items_current, l_net_items_tmp) { + if( (l_ret = s_net_try_online(l_net_items_current->chain_net)) ) { + log_it(L_ERROR, "Can't try online state for net %s. Finished with (%d) error code.", l_net_items_current->name, l_ret); + } + } +} + + dap_global_db_cluster_t *dap_chain_net_get_mempool_cluster(dap_chain_t *a_chain) { dap_return_val_if_fail(a_chain, NULL); diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index 3472aa51fbcc312944f071834952b0b693e18407..67f151c7779851caf8ea1129f70e1a9e99f2166f 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -107,6 +107,7 @@ void dap_chain_net_deinit(void); DAP_STATIC_INLINE uint64_t dap_chain_net_get_cur_addr_int(dap_chain_net_t *a_net) { return g_node_addr.uint64; } void dap_chain_net_load_all(); +void dap_chain_net_try_online_all(); int dap_chain_net_state_go_to(dap_chain_net_t * a_net, dap_chain_net_state_t a_new_state); dap_chain_net_state_t dap_chain_net_get_target_state(dap_chain_net_t *a_net);