Skip to content
Snippets Groups Projects
Commit 73c66c03 authored by Constantin P.'s avatar Constantin P. 💬
Browse files

...

parent 63c82b97
No related branches found
No related tags found
2 merge requests!1864[*] Fix wrong last tx changed value in xchange order history.,!1857...
Pipeline #45665 passed with stage
in 11 minutes and 1 second
......@@ -48,26 +48,29 @@
#define LOG_TAG "dap_chain_node"
#define DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION 2
typedef struct dap_chain_node_net_states_info {
uint16_t version_info;
char version_node[16];
dap_chain_node_role_t role;
typedef struct dap_chain_node_net_states_info_v1 {
dap_chain_node_addr_t address;
uint64_t events_count;
uint64_t atoms_count;
uint32_t uplinks_count;
uint32_t downlinks_count;
dap_chain_node_addr_t links_addrs[];
} DAP_ALIGN_PACKED dap_chain_node_net_states_info_v1_t;
typedef struct dap_chain_node_net_states_info {
uint16_t version_info;
char version_node[16];
dap_chain_node_role_t role;
dap_chain_node_net_states_info_v1_t info_v1;
} DAP_ALIGN_PACKED dap_chain_node_net_states_info_t;
#define node_info_v1_shift ( sizeof(uint16_t) + 16 + sizeof(dap_chain_node_role_t) )
static const uint64_t s_cmp_delta_timestamp = (uint64_t)1000 /*sec*/ * (uint64_t)1000000000;
static const uint64_t s_cmp_delta_event = 0;
static const uint64_t s_cmp_delta_atom = 10;
static const uint64_t s_timer_update_states_info = 10 /*sec*/ * 1000;
static const char s_states_group[] = ".nodes.states";
// only add in version up, not change!!!
static const uint16_t s_states_version_size[DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION] = { 32, 54 };
/**
* @brief get states info about current
......@@ -95,19 +98,20 @@ static void s_update_node_states_info(UNUSED_ARG void *a_arg)
l_info->version_info = DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION;
dap_strncpy(l_info->version_node, DAP_VERSION, sizeof(l_info->version_node) - 1);
l_info->role = dap_chain_net_get_role(l_net);
l_info->address.uint64 = g_node_addr.uint64;
l_info->uplinks_count = l_uplinks_count;
l_info->downlinks_count = l_downlinks_count;
l_info->info_v1.address.uint64 = g_node_addr.uint64;
l_info->info_v1.uplinks_count = l_uplinks_count;
l_info->info_v1.downlinks_count = l_downlinks_count;
dap_chain_t *l_chain = dap_chain_find_by_id(l_net->pub.id, (dap_chain_id_t){ .uint64 = 0 }); // zerochain
l_info->events_count = (l_chain && l_chain->callback_count_atom) ? l_chain->callback_count_atom(l_chain) : 0;
l_info->info_v1.events_count = (l_chain && l_chain->callback_count_atom) ? l_chain->callback_count_atom(l_chain) : 0;
l_chain = l_chain ? l_chain->next : NULL; // mainchain
l_info->atoms_count = (l_chain && l_chain->callback_count_atom) ? l_chain->callback_count_atom(l_chain) : 0;
l_info->info_v1.atoms_count = (l_chain && l_chain->callback_count_atom) ? l_chain->callback_count_atom(l_chain) : 0;
memcpy(l_info->links_addrs, l_linked_node_addrs, (l_info->uplinks_count + l_info->downlinks_count) * sizeof(dap_chain_node_addr_t));
memcpy( l_info->info_v1.links_addrs, l_linked_node_addrs,
(l_info->info_v1.uplinks_count + l_info->info_v1.downlinks_count) * sizeof(dap_chain_node_addr_t) );
// DB write
char *l_gdb_group = dap_strdup_printf("%s%s", l_net->pub.gdb_groups_prefix, s_states_group);
const char *l_node_addr_str = dap_stream_node_addr_to_str_static(l_info->address);
const char *l_node_addr_str = dap_stream_node_addr_to_str_static(l_info->info_v1.address);
dap_global_db_set_sync(l_gdb_group, l_node_addr_str, l_info, l_info_size, false);
DAP_DEL_MULTY(l_linked_node_addrs, l_info, l_gdb_group);
}
......@@ -122,20 +126,31 @@ static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr
dap_nanotime_t l_timestamp = 0;
size_t l_data_size = 0;
char *l_gdb_group = dap_strdup_printf("%s%s", a_net->pub.gdb_groups_prefix, s_states_group);
dap_chain_node_net_states_info_t *l_store_obj = (dap_chain_node_net_states_info_t *)dap_global_db_get_sync(l_gdb_group, a_node_addr_str, &l_data_size, NULL, &l_timestamp);
if (!l_store_obj || l_store_obj->version_info != DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION ||
l_data_size != s_states_version_size[DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION - 1] + (l_store_obj->uplinks_count + l_store_obj->downlinks_count) * sizeof(dap_chain_node_addr_t))
{
log_it(L_ERROR, "Can't find state about %s node in net %s", a_node_addr_str, a_net->pub.name);
DAP_DELETE(l_gdb_group);
return;
}
byte_t *l_node_info_data = dap_global_db_get_sync(l_gdb_group, a_node_addr_str, &l_data_size, NULL, &l_timestamp);
DAP_DELETE(l_gdb_group);
dap_chain_node_net_states_info_t *l_node_info = NULL;
if (!l_node_info_data)
return log_it(L_ERROR, "Can't find state of node %s in net %s", a_node_addr_str, a_net->pub.name);
if ( (l_data_size - sizeof(dap_chain_node_net_states_info_t)) % sizeof(dap_chain_node_addr_t) ) {
if ( (l_data_size - sizeof(dap_chain_node_net_states_info_v1_t)) % sizeof(dap_chain_node_addr_t) )
return DAP_DELETE(l_node_info_data), log_it(L_ERROR, "Irrelevant size of node %s info");
dap_chain_node_net_states_info_v1_t *l_info_old = (dap_chain_node_net_states_info_v1_t*)l_node_info_data;
l_node_info = DAP_NEW_Z_SIZE( dap_chain_node_net_states_info_t, sizeof(dap_chain_node_net_states_info_t)
+ (l_info_old->uplinks_count + l_info_old->downlinks_count) * sizeof(dap_chain_node_addr_t) );
l_node_info->version_info = 1;
memcpy( (byte_t*)l_node_info + node_info_v1_shift, l_info_old, l_data_size );
DAP_DELETE(l_node_info_data);
} else
l_node_info = (dap_chain_node_net_states_info_t*)l_node_info_data;
char l_ts[80] = { '\0' };
dap_nanotime_to_str_rfc822(l_ts, sizeof(l_ts), l_timestamp);
dap_string_append_printf(l_info_str,
"Record timestamp: %s\nRecord version: %u\nNode version: %s\nNode addr: %s\nNet: %s\nRole: %s\nEvents count: %"DAP_UINT64_FORMAT_U"\nAtoms count: %"DAP_UINT64_FORMAT_U"\nUplinks count: %u\nDownlinks count: %u\n",
l_ts, l_store_obj->version_info, l_store_obj->version_node,a_node_addr_str, a_net->pub.name, dap_chain_node_role_to_str(l_store_obj->role), l_store_obj->events_count, l_store_obj->atoms_count, l_store_obj->uplinks_count, l_store_obj->downlinks_count);
size_t l_max_links = dap_max(l_store_obj->uplinks_count, l_store_obj->downlinks_count);
"Record timestamp: %s\nRecord version: %u\nNode version: %s\nNode addr: %s\nNet: %s\nRole: %s\n"
"Events count: %"DAP_UINT64_FORMAT_U"\nAtoms count: %"DAP_UINT64_FORMAT_U"\nUplinks count: %u\nDownlinks count: %u\n",
l_ts, l_node_info->version_info, l_node_info->version_node, a_node_addr_str, a_net->pub.name,
dap_chain_node_role_to_str(l_node_info->role), l_node_info->info_v1.events_count, l_node_info->info_v1.atoms_count,
l_node_info->info_v1.uplinks_count, l_node_info->info_v1.downlinks_count);
size_t l_max_links = dap_max(l_node_info->info_v1.uplinks_count, l_node_info->info_v1.downlinks_count);
if(l_max_links) {
dap_string_append_printf(l_info_str,
"-----------------------------------------------------------------\n"
......@@ -143,13 +158,17 @@ static void s_states_info_to_str(dap_chain_net_t *a_net, const char *a_node_addr
"-----------------------------------------------------------------\n");
}
for (size_t i = 0; i < l_max_links; ++i) {
char *l_upnlink_str = i < l_store_obj->uplinks_count ? dap_stream_node_addr_to_str(l_store_obj->links_addrs[i], false) : dap_strdup("\t\t");
char *l_downlink_str = i < l_store_obj->downlinks_count ? dap_stream_node_addr_to_str(l_store_obj->links_addrs[i + l_store_obj->uplinks_count], false) : dap_strdup("\t\t");
char *l_upnlink_str = i < l_node_info->info_v1.uplinks_count
? dap_stream_node_addr_to_str(l_node_info->info_v1.links_addrs[i], false)
: dap_strdup("\t\t");
char *l_downlink_str = i < l_node_info->info_v1.downlinks_count
? dap_stream_node_addr_to_str(l_node_info->info_v1.links_addrs[i + l_node_info->info_v1.uplinks_count], false)
: dap_strdup("\t\t");
dap_string_append_printf(l_info_str, "|\t%s\t|\t%s\t|\n", l_upnlink_str, l_downlink_str);
DAP_DEL_MULTY(l_upnlink_str, l_downlink_str);
}
dap_string_append_printf(l_info_str, "-----------------------------------------------------------------\n");
DAP_DEL_MULTY(l_store_obj, l_gdb_group);
DAP_DELETE(l_node_info);
}
/**
......@@ -486,26 +505,35 @@ dap_list_t *dap_chain_node_get_states_list_sort(dap_chain_net_t *a_net, dap_chai
dap_nanotime_t l_state_timestamp = 0;
size_t l_data_size = 0;
dap_chain_node_net_states_info_t *l_state_store_obj = (dap_chain_node_net_states_info_t *)dap_global_db_get_sync(l_gdb_group, l_objs[i].key, &l_data_size, NULL, &l_state_timestamp);
if (!l_state_store_obj) {
dap_chain_node_net_states_info_t *l_node_info = NULL;
byte_t *l_node_info_data = dap_global_db_get_sync(l_gdb_group, l_objs[i].key, &l_data_size, NULL, &l_state_timestamp);
if (!l_node_info_data) {
log_it(L_DEBUG, "Can't find state about %s node, apply low priority", l_objs[i].key);
l_item->downlinks_count = (uint32_t)(-1);
} else if (
l_state_store_obj->version_info != DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION ||
l_data_size != s_states_version_size[DAP_CHAIN_NODE_NET_STATES_INFO_CURRENT_VERSION - 1] + (l_state_store_obj->uplinks_count + l_state_store_obj->downlinks_count) * sizeof(dap_chain_node_addr_t)
) {
log_it(L_DEBUG, "Wrong %s node state record size to state version %u, expected %zu, get %zu. Apply low priority", l_objs[i].key, l_state_store_obj->version_info, sizeof(dap_chain_node_net_states_info_t) + (l_state_store_obj->uplinks_count + l_state_store_obj->downlinks_count) * sizeof(dap_chain_node_addr_t), l_data_size);
l_item->role.enums = NODE_ROLE_ROOT;
l_item->downlinks_count = (uint32_t)(-1);
} else {
l_item->role.enums = l_state_store_obj->role.enums;
l_item->atoms_count = l_state_store_obj->atoms_count;
l_item->events_count = l_state_store_obj->events_count;
l_item->downlinks_count = l_state_store_obj->downlinks_count;
l_item->timestamp = l_state_timestamp;
if ( (l_data_size - sizeof(dap_chain_node_net_states_info_t)) % sizeof(dap_chain_node_addr_t) ) {
if ( (l_data_size - sizeof(dap_chain_node_net_states_info_v1_t)) % sizeof(dap_chain_node_addr_t) ) {
log_it(L_ERROR, "Irrelevant size of node %s info, ignore it");
DAP_DEL_MULTY(l_node_info_data, l_item);
continue;
}
dap_chain_node_net_states_info_v1_t *l_info_old = (dap_chain_node_net_states_info_v1_t*)l_node_info_data;
l_node_info = DAP_NEW_Z_SIZE( dap_chain_node_net_states_info_t, sizeof(dap_chain_node_net_states_info_t)
+ (l_info_old->uplinks_count + l_info_old->downlinks_count) * sizeof(dap_chain_node_addr_t) );
l_node_info->version_info = 1;
memcpy( (byte_t*)l_node_info + node_info_v1_shift, l_info_old, l_data_size );
DAP_DELETE(l_node_info_data);
} else
l_node_info = (dap_chain_node_net_states_info_t*)l_node_info_data;
}
l_item->role.enums = l_node_info->role.enums;
l_item->atoms_count = l_node_info->info_v1.atoms_count;
l_item->events_count = l_node_info->info_v1.events_count;
l_item->downlinks_count = l_node_info->info_v1.downlinks_count;
l_item->timestamp = l_state_timestamp;
l_ret = dap_list_insert_sorted(l_ret, (void *)l_item, s_node_states_info_cmp);
DAP_DELETE(l_state_store_obj);
DAP_DELETE(l_node_info);
}
DAP_DELETE(l_gdb_group);
dap_global_db_objs_delete(l_objs, l_node_count);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment