diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c index 5a22a0e5cb6cbbe45e9bacab6c993b9e2c345af6..f457f31cf3c0108797b9ba077ab663785c9b26f3 100644 --- a/modules/chain/dap_chain_ch.c +++ b/modules/chain/dap_chain_ch.c @@ -917,6 +917,8 @@ static bool s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } dap_chain_t *l_chain = dap_chain_find_by_id(l_chain_pkt->hdr.net_id, l_chain_pkt->hdr.chain_id); dap_chain_ch_summary_t *l_sum = (dap_chain_ch_summary_t *)l_chain_pkt->data; + if(l_chain->atom_num_last < l_sum->num_last) + l_chain->atom_num_last = l_sum->num_last; debug_if(s_debug_more, L_DEBUG, "In: CHAIN_SUMMARY of %s for net %s from source " NODE_ADDR_FP_STR " with %" DAP_UINT64_FORMAT_U " atoms to sync from %" DAP_UINT64_FORMAT_U " to %" DAP_UINT64_FORMAT_U, l_chain ? l_chain->name : "(null)", diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index ca8986103f08f6929b27d310b2c24c07030a5f2c..4b83efb886aafcd3ab98f56bcfa07a68e139d474 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -150,6 +150,7 @@ typedef struct dap_chain { dap_chain_type_t *default_datum_types; uint16_t autoproc_datum_types_count; uint16_t *autoproc_datum_types; + uint64_t atom_num_last; // To hold it in double-linked lists struct dap_chain * next; diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 649ee2142a3b0df6a4cd0e2029349eaacebc7b6e..6918af0098e1be5ceef3407ec5d7e6df2a1da2f5 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -231,7 +231,7 @@ static const dap_link_manager_callbacks_t s_link_manager_callbacks = { // State machine switchs here static bool s_net_states_proc(void *a_arg); -struct json_object *s_net_states_json_collect(dap_chain_net_t * l_net); +json_object *s_net_states_json_collect(dap_chain_net_t * l_net); static void s_net_states_notify(dap_chain_net_t * l_net); static void s_nodelist_change_notify(dap_store_obj_t *a_obj, void *a_arg); //static void s_net_proc_kill( dap_chain_net_t * a_net ); @@ -464,7 +464,7 @@ static void s_link_manager_callback_connected(dap_link_t *a_link, uint64_t a_net log_it(L_NOTICE, "Established connection with %s."NODE_ADDR_FP_STR,l_net->pub.name, NODE_ADDR_FP_ARGS_S(a_link->addr)); - struct json_object *l_json = s_net_states_json_collect(l_net); + json_object *l_json = s_net_states_json_collect(l_net); char l_err_str[128] = { }; snprintf(l_err_str, sizeof(l_err_str) , "Established connection with link " NODE_ADDR_FP_STR @@ -528,7 +528,7 @@ static void s_link_manager_callback_error(dap_link_t *a_link, uint64_t a_net_id, log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR, l_net ? l_net->pub.name : "(unknown)", NODE_ADDR_FP_ARGS_S(a_link->addr)); if (l_net){ - struct json_object *l_json = s_net_states_json_collect(l_net); + json_object *l_json = s_net_states_json_collect(l_net); char l_err_str[512] = { }; snprintf(l_err_str, sizeof(l_err_str) , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d" @@ -583,9 +583,37 @@ int s_link_manager_fill_net_info(dap_link_t *a_link) return 0; } -struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) +json_object *s_net_sync_status(dap_chain_net_t *a_net) { +// sanity check + dap_return_val_if_pass(!a_net, NULL); +// func work + json_object *l_ret = json_object_new_object(); + size_t + l_count_el = 0, + l_count_el_all = 0, + l_node_link_nodes = 0; + char *l_gdb_nodes = a_net->pub.gdb_nodes; + + dap_chain_t *l_chain = NULL; + DL_FOREACH(a_net->pub.chains, l_chain){ + l_count_el += l_chain->callback_count_atom(l_chain); + l_count_el_all += l_chain->atom_num_last; + } + double l_percent = l_count_el_all ? (double)(l_count_el * 100) / l_count_el_all : 0; + char *l_percent_str = dap_strdup_printf("%.3f", l_percent); + json_object *l_jobj_percent = json_object_new_string(l_percent_str); + DAP_DELETE(l_percent_str); + json_object *l_jobj_total = json_object_new_uint64(l_count_el_all); + json_object *l_jobj_current = json_object_new_uint64(l_count_el); + json_object_object_add(l_ret, "current", l_jobj_current); + json_object_object_add(l_ret, "total", l_jobj_total); + json_object_object_add(l_ret, "percent", l_jobj_percent); + return l_ret; +} + +json_object *s_net_states_json_collect(dap_chain_net_t *a_net) { - struct json_object *l_json = json_object_new_object(); + json_object *l_json = json_object_new_object(); json_object_object_add(l_json, "class" , json_object_new_string("NetStates")); json_object_object_add(l_json, "name" , json_object_new_string((const char*)a_net->pub.name)); json_object_object_add(l_json, "networkState" , json_object_new_string(dap_chain_net_state_to_str(PVT(a_net)->state))); @@ -595,6 +623,10 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) char l_node_addr_str[24] = {'\0'}; int l_tmp = snprintf(l_node_addr_str, sizeof(l_node_addr_str), NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(g_node_addr)); json_object_object_add(l_json, "nodeAddress" , json_object_new_string(l_tmp ? l_node_addr_str : "0000::0000::0000::0000")); + if (PVT(a_net)->state == NET_STATE_SYNC_CHAINS) { + json_object *l_json_sync_status = s_net_sync_status(a_net); + json_object_object_add(l_json, "processed", l_json_sync_status); + } return l_json; } @@ -604,7 +636,7 @@ struct json_object *s_net_states_json_collect(dap_chain_net_t *a_net) */ static void s_net_states_notify(dap_chain_net_t *a_net) { - struct json_object *l_json = s_net_states_json_collect(a_net); + json_object *l_json = s_net_states_json_collect(a_net); json_object_object_add(l_json, "errorMessage", json_object_new_string(" ")); // regular notify has no error dap_notify_server_send_mt(json_object_get_string(l_json)); json_object_put(l_json); @@ -795,20 +827,24 @@ json_object* s_set_reply_text_node_status_json(dap_chain_net_t *a_net) { json_object_object_add(l_jobj_ret, "current_addr", l_jobj_cur_node_addr); if (PVT(a_net)->state != NET_STATE_OFFLINE) { json_object *l_jobj_links = json_object_new_object(); - json_object *l_jobj_active_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/); // need adopt to link manager - json_object *l_jobj_total_links = json_object_new_uint64(0 /*HASH_COUNT(PVT(a_net)->net_links)*/); - if (!l_jobj_links || !l_jobj_active_links || !l_jobj_total_links) { + json_object *l_jobj_active_links = json_object_new_uint64(dap_link_manager_links_count(a_net->pub.id.uint64)); + json_object *l_jobj_required_links = json_object_new_uint64(dap_link_manager_required_links_count(a_net->pub.id.uint64)); + if (!l_jobj_links || !l_jobj_active_links || !l_jobj_required_links) { json_object_put(l_jobj_ret); json_object_put(l_jobj_links); json_object_put(l_jobj_active_links); - json_object_put(l_jobj_total_links); + json_object_put(l_jobj_required_links); dap_json_rpc_allocation_error; return NULL; } json_object_object_add(l_jobj_links, "active", l_jobj_active_links); - json_object_object_add(l_jobj_links, "total", l_jobj_total_links); + json_object_object_add(l_jobj_links, "required", l_jobj_required_links); json_object_object_add(l_jobj_ret, "links", l_jobj_links); } + + json_object *l_json_sync_status = s_net_sync_status(a_net); + json_object_object_add(l_jobj_ret, "processed", l_json_sync_status); + json_object *l_jobj_states = json_object_new_object(); json_object *l_jobj_current_states = json_object_new_string(c_net_states[PVT(a_net)->state]); json_object *l_jobj_target_states = json_object_new_string(c_net_states[PVT(a_net)->state_target]); @@ -2134,7 +2170,7 @@ bool s_net_load(void *a_arg) dap_chain_save_all( l_chain ); log_it (L_NOTICE, "Initialized chain files"); } - + l_chain->atom_num_last = l_chain->callback_count_atom(l_chain); l_chain = l_chain->next; } // Process thresholds if any