diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index c910fdfa481c2851c3c05b14b30935ad0dd53517..de9d7fe0fbbe317b5ac712539a54129019987220 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -41,6 +41,7 @@ #include "dap_cert.h" #include "dap_chain_ledger.h" #include "dap_chain_cs.h" +#include "dap_cert_file.h" #include "dap_chain_vf.h" #include <uthash.h> #include <pthread.h> @@ -721,3 +722,40 @@ ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t } return l_res; } + +/** + * @brief dap_cert_chain_file_save + * @param datum + */ +int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) +{ + const char *s_system_chain_ca_dir = dap_config_get_item_str(g_config, "resources", "chain_ca_folder"); + if(dap_strlen(s_system_chain_ca_dir) == 0) { + log_it(L_ERROR, "Not found 'chain_ca_folder' in .cfg file"); + return -1; + } + dap_cert_t *cert = dap_cert_mem_load(datum->data, datum->header.data_size); + if(!cert) { + log_it(L_ERROR, "Can't load cert, size: %d", datum->header.data_size); + return -1; + } + const char *cert_name = cert->name; + size_t cert_path_length = dap_strlen(net_name) + dap_strlen(cert_name) + 9 + dap_strlen(s_system_chain_ca_dir); + char *cert_path = DAP_NEW_Z_SIZE(char, cert_path_length); + snprintf(cert_path, cert_path_length, "%s/%s/%s.dcert", s_system_chain_ca_dir, net_name, cert_name); + // In cert_path resolve all `..` and `.`s + char *cert_path_c = dap_canonicalize_filename(cert_path, NULL); + DAP_DELETE(cert_path); + // Protect the ca folder from using "/.." in cert_name + if(dap_strncmp(s_system_chain_ca_dir, cert_path_c, dap_strlen(s_system_chain_ca_dir))) { + log_it(L_ERROR, "Cert path '%s' is not in ca dir: %s", cert_path_c, s_system_chain_ca_dir); + return -1; + } + int l_ret = dap_cert_file_save(cert, cert_path_c); + DAP_DELETE(cert_path_c); +// if ( access( l_cert_path, F_OK ) != -1 ) { +// log_it (L_ERROR, "File %s is already exists.", l_cert_path); +// return -1; +// } else + return l_ret; +} diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index 2bfd2a0333a8f4c40a2e587e3345dfe915e26031..9b508ea967aa15045aba56c9ad7894d77e9fa4fe 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -218,3 +218,4 @@ dap_chain_atom_ptr_t dap_chain_get_atom_by_hash(dap_chain_t * a_chain, dap_chain bool dap_chain_get_atom_last_hash(dap_chain_t *a_chain, dap_hash_fast_t *a_atom_hash, dap_chain_cell_id_t a_cel_id); ssize_t dap_chain_atom_save(dap_chain_t *a_chain, const uint8_t *a_atom, size_t a_atom_size, dap_chain_cell_id_t a_cell_id); void dap_chain_add_mempool_notify_callback(dap_chain_t *a_chain, dap_global_db_obj_callback_notify_t a_callback, void *a_cb_arg); +int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name); diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 03e2325aff9b83640bdc1399260b905999fdd501..cfe5e391974526e10d9b33c7b28111c2c6a7afb5 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -204,6 +204,13 @@ static void s_stream_ch_delete(dap_stream_ch_t* a_ch, void* a_arg) a_ch->internal = NULL; // To prevent its cleaning in worker } +void dap_stream_ch_chain_reset(dap_stream_ch_chain_t *a_ch_chain) +{ + if (!a_ch_chain) + return; + dap_worker_exec_callback_on(DAP_STREAM_CH(a_ch_chain)->stream_worker->worker, s_stream_ch_delete_in_proc, a_ch_chain); +} + /** * @brief s_stream_ch_chain_delete * @param a_ch_chain diff --git a/modules/net/dap_chain_net.c b/modules/net/dap_chain_net.c index 9da9ca66e27378937655cd0fb6029a6c3d0b92ef..1cf9b8cb9ed0aa5fc7a95e1437303d9c5ce7a1f3 100644 --- a/modules/net/dap_chain_net.c +++ b/modules/net/dap_chain_net.c @@ -490,11 +490,12 @@ static bool s_net_send_records_callback_get_raw (dap_global_db_context_t * a_glo DAP_DELETE(l_link); continue; } - dap_stream_ch_chain_pkt_write_inter( a_global_db_context->queue_worker_ch_io_input[l_link->worker->worker->id], + if (!dap_stream_ch_chain_pkt_write_inter( a_global_db_context->queue_worker_ch_io_input[l_link->worker->worker->id], l_link->ch_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_GLOBAL_DB, l_net->pub.id.uint64, l_chain_id.uint64, l_cell_id.uint64, l_data_out, - sizeof(dap_global_db_pkt_t) + l_data_out->data_size); + sizeof(dap_global_db_pkt_t) + l_data_out->data_size)) + debug_if(g_debug_reactor, L_ERROR, "Can't send pkt to worker (%d) for writing", l_link->worker->worker->id); } DAP_DELETE(l_data_out); if (it) @@ -608,9 +609,10 @@ static bool s_net_send_atoms(dap_proc_thread_t *a_thread, void *a_arg) DAP_DELETE(l_link); continue; } - dap_stream_ch_chain_pkt_write_mt(l_link->worker, l_link->ch_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, + if(!dap_stream_ch_chain_pkt_write_mt(l_link->worker, l_link->ch_uuid, DAP_STREAM_CH_CHAIN_PKT_TYPE_CHAIN, l_net->pub.id.uint64, l_chain->id.uint64, l_cell_id, - l_obj_cur->value, l_obj_cur->value_len); + l_obj_cur->value, l_obj_cur->value_len)) + debug_if(g_debug_reactor, L_ERROR, "Can't send atom to worker (%d) for writing", l_link->worker->worker->id); } s_atom_obj_free(l_obj_cur); if (it) @@ -771,7 +773,8 @@ static bool dap_chain_net_link_is_present(dap_chain_net_t *a_net, dap_chain_node return false; dap_list_t *l_net_links = l_net_pvt->net_links; while(l_net_links) { - dap_chain_node_info_t *l_link_node_info = (dap_chain_node_info_t*) l_net_links->data; + struct net_link *l_net_link = (struct net_link*) l_net_links->data; + dap_chain_node_info_t *l_link_node_info = l_net_link->link_info; if(dap_chain_node_info_addr_match(l_link_node_info, a_link_node_info)) return true; l_net_links = dap_list_next(l_net_links); @@ -800,6 +803,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) continue; if (l_link_addr->uint64 == l_own_addr) { + DAP_DELETE(l_link_addr); continue; // Do not link with self } dap_chain_node_info_t *l_link_node_info = dap_chain_node_info_read(a_net, l_link_addr); @@ -814,6 +818,7 @@ static void s_fill_links_from_root_aliases(dap_chain_net_t * a_net) NODE_ADDR_FP_ARGS(l_link_addr)); DAP_DELETE(l_link_node_info); } + DAP_DELETE(l_link_addr); } } @@ -1059,18 +1064,20 @@ static void s_node_link_callback_stage(dap_chain_node_client_t * a_node_client,d static void s_node_link_callback_error(dap_chain_node_client_t * a_node_client, int a_error, void * a_arg) { dap_chain_net_t * l_net = (dap_chain_net_t *) a_arg; - log_it(L_WARNING, "Can't establish link with %s."NODE_ADDR_FP_STR, l_net->pub.name, + 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_node_client->remote_node_addr)); - struct json_object *l_json = net_states_json_collect(l_net); - char l_node_addr_str[INET_ADDRSTRLEN] = {}; - inet_ntop(AF_INET, &a_node_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN); - char l_err_str[128] = { }; - dap_snprintf(l_err_str, sizeof(l_err_str) - , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d" - , NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address), l_node_addr_str, a_error); - json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str)); - dap_notify_server_send_mt(json_object_get_string(l_json)); - json_object_put(l_json); + if (l_net){ + struct json_object *l_json = net_states_json_collect(l_net); + char l_node_addr_str[INET_ADDRSTRLEN] = {}; + inet_ntop(AF_INET, &a_node_client->info->hdr.ext_addr_v4, l_node_addr_str, INET_ADDRSTRLEN); + char l_err_str[128] = { }; + dap_snprintf(l_err_str, sizeof(l_err_str) + , "Link " NODE_ADDR_FP_STR " [%s] can't be established, errno %d" + , NODE_ADDR_FP_ARGS_S(a_node_client->info->hdr.address), l_node_addr_str, a_error); + json_object_object_add(l_json, "errorMessage", json_object_new_string(l_err_str)); + dap_notify_server_send_mt(json_object_get_string(l_json)); + json_object_put(l_json); + } } /** @@ -1094,10 +1101,6 @@ static void s_node_link_callback_delete(dap_chain_node_client_t * a_node_client, l_net_pvt->links_connected_count--; else log_it(L_ERROR, "Links count is zero in delete callback"); - // If the last link is lost, change the status to NET_STATE_OFFLINE - if(!l_net_pvt->links_connected_count) { - l_net_pvt->state = NET_STATE_OFFLINE; - } } dap_chain_net_sync_unlock(l_net, a_node_client); pthread_rwlock_wrlock(&l_net_pvt->rwlock); @@ -1192,6 +1195,8 @@ static void s_net_state_link_prepare_error(dap_worker_t * a_worker,dap_chain_nod if(l_net_pvt->links_dns_requests) l_net_pvt->links_dns_requests--; + log_it(L_DEBUG, "Still %u link dns requests in process",l_net_pvt->links_dns_requests); + if(!l_net_pvt->links_dns_requests ){ if( l_net_pvt->state_target != NET_STATE_OFFLINE){ log_it(L_WARNING,"Can't prepare links via DNS requests. Prefilling links with root addresses"); @@ -1481,6 +1486,13 @@ bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t { dap_chain_net_pvt_t *l_net_pvt = PVT(a_net); pthread_rwlock_wrlock(&l_net_pvt->rwlock); + bool l_not_found = dap_chain_net_sync_trylock_nolock(a_net, a_client); + pthread_rwlock_unlock(&l_net_pvt->rwlock); + return l_not_found; +} + +bool dap_chain_net_sync_trylock_nolock(dap_chain_net_t *a_net, dap_chain_node_client_t *a_client) { + dap_chain_net_pvt_t *l_net_pvt = PVT(a_net); bool l_found = false; if (l_net_pvt->active_link) { for (dap_list_t *l_links = l_net_pvt->net_links; l_links; l_links = dap_list_next(l_links)) { @@ -1501,7 +1513,6 @@ bool dap_chain_net_sync_trylock(dap_chain_net_t *a_net, dap_chain_node_client_t dap_events_socket_uuid_t *l_uuid = DAP_DUP(&a_client->uuid); l_net_pvt->links_queue = dap_list_append(l_net_pvt->links_queue, l_uuid); } - pthread_rwlock_unlock(&l_net_pvt->rwlock); return !l_found; } @@ -1511,15 +1522,14 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t * return false; dap_chain_net_pvt_t *l_net_pvt = PVT(a_net); pthread_rwlock_wrlock(&l_net_pvt->rwlock); + bool l_ret = false; if (!a_client || l_net_pvt->active_link == a_client) l_net_pvt->active_link = NULL; while (l_net_pvt->active_link == NULL && l_net_pvt->links_queue) { dap_events_socket_uuid_t *l_uuid = l_net_pvt->links_queue->data; - pthread_rwlock_unlock(&l_net_pvt->rwlock); - dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid); - pthread_rwlock_wrlock(&l_net_pvt->rwlock); + dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid, false); if (l_status != NODE_SYNC_STATUS_WAITING) { - DAP_DELETE(l_uuid); + DAP_DELETE(l_net_pvt->links_queue->data); dap_list_t *l_to_remove = l_net_pvt->links_queue; l_net_pvt->links_queue = l_net_pvt->links_queue->next; DAP_DELETE(l_to_remove); @@ -1527,8 +1537,9 @@ bool dap_chain_net_sync_unlock(dap_chain_net_t *a_net, dap_chain_node_client_t * break; } } + l_ret = l_net_pvt->active_link; pthread_rwlock_unlock(&l_net_pvt->rwlock); - return l_net_pvt->active_link; + return l_ret; } /** * @brief dap_chain_net_client_create_n_connect @@ -1801,11 +1812,15 @@ bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net) char *l_cache_dir = dap_strdup_printf( "%s/%s", g_sys_dir_path, "cache"); if (dap_mkdir_with_parents(l_cache_dir) != 0) { log_it(L_WARNING,"Error during disposable cache check file creation"); + DAP_DELETE(l_cache_dir); return false; } // create file, if it not presented. If file exists, ledger cache operation is stopped char *l_cache_file = dap_strdup_printf( "%s/%s.cache", l_cache_dir, "5B0FEEF6-B0D5-48A9-BFA2-32E8B294366D"); + DAP_DELETE(l_cache_dir); if (dap_file_simple_test(l_cache_file)) { + log_it(L_WARNING, "Cache file '%s' already exists", l_cache_file); + DAP_DELETE(l_cache_file); return false; } @@ -1825,6 +1840,7 @@ bool s_chain_net_reload_ledger_cache_once(dap_chain_net_t *l_net) if (dap_file_simple_test(l_cache_file)) s_chain_net_ledger_cache_reload(l_net); fclose(s_cache_file); + DAP_DELETE(l_cache_file); return true; } @@ -2690,6 +2706,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) l_net_pvt->node_info->hdr.links_number, l_net_pvt->node_info->hdr.cell_id.uint64); } + DAP_DELETE(l_addr_hash_str); } else{ log_it(L_WARNING, "Not present our own address %s in database", (l_node_alias_str) ? l_node_alias_str: ""); @@ -2868,6 +2885,7 @@ int s_net_load(const char * a_net_name, uint16_t a_acl_idx) // Start the proc thread log_it(L_INFO, "Chain network \"%s\" initialized",l_net_item->name); + DAP_DELETE(l_node_addr_str); dap_config_close(l_cfg); } return 0; @@ -3744,43 +3762,6 @@ static uint8_t *dap_chain_net_set_acl(dap_chain_hash_fast_t *a_pkey_hash) return NULL; } -/** - * @brief dap_cert_chain_file_save - * @param datum - */ -int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) -{ - const char *s_system_chain_ca_dir = dap_config_get_item_str(g_config, "resources", "chain_ca_folder"); - if(dap_strlen(s_system_chain_ca_dir) == 0) { - log_it(L_ERROR, "Not found 'chain_ca_folder' in .cfg file"); - return -1; - } - dap_cert_t *cert = dap_cert_mem_load(datum->data, datum->header.data_size); - if(!cert) { - log_it(L_ERROR, "Can't load cert, size: %d", datum->header.data_size); - return -1; - } - const char *cert_name = cert->name; - size_t cert_path_length = dap_strlen(net_name) + dap_strlen(cert_name) + 9 + dap_strlen(s_system_chain_ca_dir); - char *cert_path = DAP_NEW_Z_SIZE(char, cert_path_length); - snprintf(cert_path, cert_path_length, "%s/%s/%s.dcert", s_system_chain_ca_dir, net_name, cert_name); - // In cert_path resolve all `..` and `.`s - char *cert_path_c = dap_canonicalize_filename(cert_path, NULL); - DAP_DELETE(cert_path); - // Protect the ca folder from using "/.." in cert_name - if(dap_strncmp(s_system_chain_ca_dir, cert_path_c, dap_strlen(s_system_chain_ca_dir))) { - log_it(L_ERROR, "Cert path '%s' is not in ca dir: %s", cert_path_c, s_system_chain_ca_dir); - return -1; - } - int l_ret = dap_cert_file_save(cert, cert_path_c); - DAP_DELETE(cert_path_c); -// if ( access( l_cert_path, F_OK ) != -1 ) { -// log_it (L_ERROR, "File %s is already exists.", l_cert_path); -// return -1; -// } else - return l_ret; -} - /** * @brief dap_chain_datum_list * Get datum list by filter @@ -3791,38 +3772,59 @@ int dap_cert_chain_file_save(dap_chain_datum_t *datum, char *net_name) */ dap_list_t* dap_chain_datum_list(dap_chain_net_t *a_net, dap_chain_t *a_chain, datum_filter_func_t *a_filter_func, void *a_filter_func_param) { - dap_list_t *l_list = NULL; + dap_list_t *l_list = NULL; if(!a_net) - return l_list; +// return l_list; +// void *l_chain_tmp = (void*) 0x1; +// dap_chain_t *l_chain_cur; + return NULL; void *l_chain_tmp = (void*) 0x1; - dap_chain_t *l_chain_cur; - if(a_chain) - l_chain_cur = a_chain; - else - l_chain_cur = dap_chain_enum(&l_chain_tmp); + dap_chain_t *l_chain_cur = a_chain ? a_chain : dap_chain_enum(&l_chain_tmp); + size_t l_sz; + while(l_chain_cur) { // Use chain only for selected net and with callback_atom_get_datums - if(a_net->pub.id.uint64 == l_chain_cur->net_id.uint64 && l_chain_cur->callback_atom_get_datums) { + if(a_net->pub.id.uint64 == l_chain_cur->net_id.uint64 && l_chain_cur->callback_atom_get_datums) + { dap_chain_cell_t *l_cell = l_chain_cur->cells; size_t l_atom_size = 0; dap_chain_atom_iter_t *l_atom_iter = l_chain_cur->callback_atom_iter_create(l_chain_cur, l_cell->id, 0); dap_chain_atom_ptr_t l_atom = l_chain_cur->callback_atom_iter_get_first(l_atom_iter, &l_atom_size); - while(l_atom && l_atom_size) { + while(l_atom && l_atom_size) + { size_t l_datums_count = 0; dap_chain_datum_t **l_datums = l_chain_cur->callback_atom_get_datums(l_atom, l_atom_size, &l_datums_count); + dap_chain_datum_t *l_datum, *l_datum2; for(size_t l_datum_n = 0; l_datum_n < l_datums_count; l_datum_n++) { - dap_chain_datum_t *l_datum = l_datums[l_datum_n]; - if(l_datum) { - // If there is a filter, then check the datum in it - if(a_filter_func) { - if(a_filter_func(l_datum, l_chain_cur, a_filter_func_param)) - l_list = dap_list_append(l_list, l_datum); - } - else - l_list = dap_list_append(l_list, l_datum); - } + if ( ! (l_datum = l_datums[l_datum_n]) ) + continue; + + if ( a_filter_func) + if ( !a_filter_func(l_datum, l_chain_cur, a_filter_func_param) ) + continue; +// if(l_datum) { +// // If there is a filter, then check the datum in it +// if(a_filter_func) { +// if(a_filter_func(l_datum, l_chain_cur, a_filter_func_param)) +// l_list = dap_list_append(l_list, l_datum); +// } +// else +// l_list = dap_list_append(l_list, l_datum); +// } + /* + * Make a copy of the datum, copy is placed into the list, + * so don't forget to free whole list + */ + l_sz = sizeof(dap_chain_datum_t) + l_datum->header.data_size + 16; + l_datum2 = DAP_NEW_Z_SIZE(dap_chain_datum_t, l_sz); + assert ( l_datum2 ); + memcpy(l_datum2, l_datum, l_sz); + + /* Add new entry into the list */ + l_list = dap_list_append(l_list, l_datum2); + } - DAP_DELETE(l_datums); + DAP_DEL_Z(l_datums); // go to next transaction l_atom = l_chain_cur->callback_atom_iter_get_next(l_atom_iter, &l_atom_size); } @@ -3901,7 +3903,7 @@ int dap_chain_datum_add(dap_chain_t * a_chain, dap_chain_datum_t *a_datum, size_ }break; case DAP_CHAIN_DATUM_CA:{ - if ( dap_cert_chain_file_save(a_datum, a_chain->net_name) < 0 ) + if (dap_cert_chain_file_save(a_datum, a_chain->net_name) < 0) return -5; }break; case DAP_CHAIN_DATUM_SIGNER: diff --git a/modules/net/dap_chain_node_cli.c b/modules/net/dap_chain_node_cli.c index e97b4f724170c8a1e79d22085efffc598c5ad885..11dcbf7cabce78e04f8d3680dd6f74c96f67cb38 100644 --- a/modules/net/dap_chain_node_cli.c +++ b/modules/net/dap_chain_node_cli.c @@ -95,17 +95,17 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // "global_db wallet_info set -addr <wallet address> -cell <cell id> \n\n" ); dap_cli_server_cmd_add("mempool", com_signer, "Sign operations", - "mempool sign -cert <cert name> -net <net name> -chain <chain name> -file <filename> [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n" - "mempool check -cert <cert name> -net <net name> {-file <filename> | -hash <hash>} [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n" + "mempool sign -cert <priv_cert_name> -net <net_name> -chain <chain_name> -file <filename> [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n" + "mempool check -cert <priv_cert_name> -net <net_name> {-file <filename> | -hash <hash>} [-mime {<SIGNER_FILENAME,SIGNER_FILENAME_SHORT,SIGNER_FILESIZE,SIGNER_DATE,SIGNER_MIME_MAGIC> | <SIGNER_ALL_FLAGS>}]\n" ); dap_cli_server_cmd_add("node", com_node, "Work with node", - "node add -net <net name> {-addr <node address> | -alias <node alias>} -port <port> -cell <cell id> {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n" - "node del -net <net name> {-addr <node address> | -alias <node alias>}\n\n" - "node link {add | del} -net <net name> {-addr <node address> | -alias <node alias>} -link <node address>\n\n" - "node alias -addr <node address> -alias <node alias>\n\n" - "node connect -net <net name> {-addr <node address> | -alias <node alias> | auto}\n\n" - "node handshake -net <net name> {-addr <node address> | -alias <node alias>}\n" - "node dump -net <net name> [ -addr <node address> | -alias <node alias>] [-full]\n\n" + "node add -net <net_name> {-addr <node_address> | -alias <node_alias>} -port <port> -cell <cell id> {-ipv4 <ipv4 external address> | -ipv6 <ipv6 external address>}\n\n" + "node del -net <net_name> {-addr <node_address> | -alias <node_alias>}\n\n" + "node link {add | del} -net <net_name> {-addr <node_address> | -alias <node_alias>} -link <node_address>\n\n" + "node alias -addr <node_address> -alias <node_alias>\n\n" + "node connect -net <net_name> {-addr <node_address> | -alias <node_alias> | auto}\n\n" + "node handshake -net <net_name> {-addr <node_address> | -alias <node_alias>}\n" + "node dump -net <net_name> [ -addr <node_address> | -alias <node_alias>] [-full]\n\n" ); dap_cli_server_cmd_add ("ping", com_ping, "Send ICMP ECHO_REQUEST to network hosts", "ping [-c <count>] host\n"); @@ -127,13 +127,13 @@ int dap_chain_node_cli_init(dap_config_t * g_config) "\tObtain help for <command> or get the total list of the commands\n" ); dap_cli_server_cmd_add("wallet", com_tx_wallet, "Wallet operations", - "wallet {new -w <wallet_name> [-sign <sign_type>] [-restore <hex value>] [-net <net_name>] [-force]| list | info {-addr <addr> | -w <wallet_name>} -net <net_name>}\n"); + "wallet {new -w <wallet_name> [-sign <sign_type>] [-restore <hex_value>] [-net <net_name>] [-force] | list | info {-addr <addr> | -w <wallet_name>} -net <net_name>}\n"); // Token commands dap_cli_server_cmd_add ("token_update", com_token_update, "Token update", "\nPrivate token update\n" - "token_update -net <net name> -chain <chain name> -token <token ticker> [-type private] [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" - "\t Update private token <token ticker> for <netname>:<chain name> with" + "token_update -net <net_name> -chain <chain_name> -token <token_ticker> [-type private] [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" + "\t Update private token <token_ticker> for <netname>:<chain_name> with" "\t custom parameters list <Param 1>, <Param 2>...<Param N>." "\n" "==Params==\n" @@ -182,18 +182,18 @@ int dap_chain_node_cli_init(dap_config_t * g_config) // Token commands dap_cli_server_cmd_add ("token_decl", com_token_decl, "Token declaration", "Simple token declaration:\n" - "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -total_supply <total supply> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n" - "\t Declare new simple token for <netname>:<chain name> with ticker <token ticker>, maximum emission <total supply> and <signs for emission> from <signs total> signatures on valid emission\n" + "token_decl -net <net_name> -chain <chain_name> -token <token_ticker> -total_supply <total supply> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>\n" + "\t Declare new simple token for <netname>:<chain_name> with ticker <token_ticker>, maximum emission <total supply> and <signs for emission> from <signs total> signatures on valid emission\n" "\nExtended private token declaration\n" - "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -type private -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n" + "token_decl -net <net_name> -chain <chain_name> -token <token_ticker> -type private -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n" "\t [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" - "\t Declare new token for <netname>:<chain name> with ticker <token ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n" + "\t Declare new token for <netname>:<chain_name> with ticker <token_ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n" "\t and custom parameters list <Param 1>, <Param 2>...<Param N>.\n" "\nExtended CF20 token declaration\n" - "\t token_decl -net <net name> -chain <chain name> -token <token ticker> -type CF20 -decimals <18> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>" + "token_decl -net <net_name> -chain <chain_name> -token <token_ticker> -type CF20 -decimals <18> -signs_total <sign total> -signs_emission <signs for emission> -certs <certs list>" "\t -flags [<Flag 1>][,<Flag 2>]...[,<Flag N>]...\n" "\t [-<Param name 1> <Param Value 1>] [-Param name 2> <Param Value 2>] ...[-<Param Name N> <Param Value N>]\n" - "\t Declare new token for <netname>:<chain name> with ticker <token ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n" + "\t Declare new token for <netname>:<chain_name> with ticker <token_ticker>, flags <Flag 1>,<Flag2>...<Flag N>\n" "\t and custom parameters list <Param 1>, <Param 2>...<Param N>.\n" "\n" "==Flags==" @@ -227,67 +227,67 @@ int dap_chain_node_cli_init(dap_config_t * g_config) ); dap_cli_server_cmd_add ("token_decl_sign", com_token_decl_sign, "Token declaration add sign", - "token_decl_sign -net <net name> -chain <chain name> -datum <datum_hash> -certs <certs list>\n" + "token_decl_sign -net <net_name> -chain <chain_name> -datum <datum_hash> -certs <certs list>\n" "\t Sign existent <datum hash> in mempool with <certs list>\n" ); dap_cli_server_cmd_add ("token_emit", com_token_emit, "Token emission", - "token_emit {sign | -token <token ticker> -emission_value <val>} -net <net name> [-chain_emission <chain for emission>] [-chain_base_tx <chain for base tx> -addr <addr>] -certs <cert list>\n"); + "token_emit {sign | -token <mempool_token_ticker> -emission_value <val>} -net <net_name> [-chain_emission <chain_name>] [-chain_base_tx <chain_name> -addr <addr>] -certs <cert list>\n"); dap_cli_server_cmd_add ("mempool_list", com_mempool_list, "List mempool entries for selected chain network", - "mempool_list -net <net name>\n"); + "mempool_list -net <net_name>\n"); dap_cli_server_cmd_add ("mempool_proc", com_mempool_proc, "Proc mempool entrie with specified hash for selected chain network", - "mempool_proc -net <net name> -datum <datum hash>\n"); + "mempool_proc -net <net_name> -datum <datum hash>\n"); dap_cli_server_cmd_add ("mempool_delete", com_mempool_delete, "Delete datum with hash <datum hash> for selected chain network", - "mempool_delete -net <net name> -datum <datum hash>\n"); + "mempool_delete -net <net_name> -datum <datum hash>\n"); dap_cli_server_cmd_add ("mempool_add_ca", com_mempool_add_ca, "Add pubic certificate into the mempool to prepare its way to chains", - "mempool_add_ca -net <net name> [-chain <chain name>] -ca_name <Certificate name>\n"); + "mempool_add_ca -net <net_name> [-chain <chain_name>] -ca_name <priv_cert_name>\n"); dap_cli_server_cmd_add ("chain_ca_pub", com_chain_ca_pub, "Add pubic certificate into the mempool to prepare its way to chains", - "chain_ca_pub -net <net name> [-chain <chain name>] -ca_name <Certificate name>\n"); + "chain_ca_pub -net <net_name> [-chain <chain_name>] -ca_name <priv_cert_name>\n"); dap_cli_server_cmd_add ("chain_ca_copy", com_chain_ca_copy, "Copy pubic certificate into the mempool to prepare its way to chains", - "chain_ca_copy -net <net name> [-chain <chain name>] -ca_name <Public certificate name>\n"); + "chain_ca_copy -net <net_name> [-chain <chain_name>] -ca_name <pub_cert_name>\n"); // Transaction commands dap_cli_server_cmd_add ("tx_create", com_tx_create, "Make transaction", - "tx_create -net <net name> -chain <chain name> {-from_wallet <name> -token <token ticker> -value <value> -to_addr <addr> | -from_emission <emission_hash>} [-fee <addr> -value_fee <val>]\n" ); + "tx_create -net <net_name> -chain <chain_name> {-from_wallet <wallet_name> -token <token_ticker> -value <value> -to_addr <addr> | -from_emission <emission_hash>} [-fee <addr> -value_fee <val>]\n" ); dap_cli_server_cmd_add ("tx_create_json", com_tx_create_json, "Make transaction", - "tx_create_json -net <net name> -chain <chain name> -json <json file path>\n" ); + "tx_create_json -net <net_name> -chain <chain_name> -json <json_file_path>\n" ); dap_cli_server_cmd_add ("tx_cond_create", com_tx_cond_create, "Make cond transaction", - "tx_cond_create -net <net name> -token <token ticker> -wallet <from wallet> -cert <public cert> -value <value datoshi> -unit {mb | kb | b | sec | day} -srv_uid <numeric uid>\n" ); + "tx_cond_create -net <net_name> -token <token_ticker> -wallet <wallet_name> -cert <pub_cert_name> -value <value_datoshi> -unit {mb | kb | b | sec | day} -srv_uid <numeric_uid>\n" ); dap_cli_server_cmd_add ("tx_verify", com_tx_verify, "Verifing transaction in mempool", - "tx_verify -net <net name> -chain <chain name> -tx <tx_hash>\n" ); + "tx_verify -net <net_name> -chain <chain_name> -tx <tx_hash>\n" ); // Transaction history dap_cli_server_cmd_add("tx_history", com_tx_history, "Transaction history (for address or by hash)", - "tx_history {-addr <addr> | -w <wallet name> | -tx <tx_hash>} -net <net name> -chain <chain name>\n"); + "tx_history {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} -net <net_name> -chain <chain_name>\n"); // Ledger info dap_cli_server_cmd_add("ledger", com_ledger, "Ledger information", - "ledger list coins -net <network name>\n" - "ledger list threshold [-hash <tx_treshold_hash>] -net <network name>\n" - "ledger list balance -net <network name>\n" - "ledger info -hash <tx_hash> -net <network name> [-unspent]\n" - "ledger tx -all -net <network name>\n" - "ledger tx {-addr <addr> | -w <wallet name> | -tx <tx_hash>} [-chain <chain name>] -net <network name>\n"); + "ledger list coins -net <net_name>\n" + "ledger list threshold [-hash <tx_treshold_hash>] -net <net_name>\n" + "ledger list balance -net <net_name>\n" + "ledger info -hash <tx_hash> -net <net_name> [-unspent]\n" + "ledger tx -all -net <net_name>\n" + "ledger tx {-addr <addr> | -w <wallet_name> | -tx <tx_hash>} [-chain <chain_name>] -net <net_name>\n"); // Token info dap_cli_server_cmd_add("token", com_token, "Token info", - "token list -net <network name>\n" - "token info -net <network name> -name <token name>\n" - "token tx [all | -addr <wallet_addr> | -wallet <wallet_name>] -name <token name> -net <network name> [-page_start <page>] [-page <page>]\n"); + "token list -net <net_name>\n" + "token info -net <net_name> -name <token_ticker>\n" + "token tx [all | -addr <wallet_addr> | -wallet <wallet_name>] -name <token_ticker> -net <net_name> [-page_start <page>] [-page <page>]\n"); // Log dap_cli_server_cmd_add ("print_log", com_print_log, "Print log info", - "print_log [ts_after <timestamp >] [limit <line numbers>]\n" ); + "print_log [ts_after <timestamp>] [limit <line_numbers>]\n" ); // Statisticss dap_cli_server_cmd_add("stats", com_stats, "Print statistics", diff --git a/modules/net/dap_chain_node_cli_cmd_tx.c b/modules/net/dap_chain_node_cli_cmd_tx.c index b3ca737d0ca2ca1a623458dc008c5ba792de2b75..5837cd4897b0cec8a0dd3c92b8e77321c95f166a 100644 --- a/modules/net/dap_chain_node_cli_cmd_tx.c +++ b/modules/net/dap_chain_node_cli_cmd_tx.c @@ -481,10 +481,8 @@ char* dap_db_history_addr(dap_chain_addr_t * a_addr, dap_chain_t * a_chain, cons l_time_str[0] = ' ', l_time_str[1] = '\0'; /* Prefill string with the space */ if ( l_tx->header.ts_created) { - struct tm l_tm; /* Convert ts to Sat May 17 01:17:08 2014 */ uint64_t l_ts = l_tx->header.ts_created; - if ( (localtime_r((time_t *) &l_ts, &l_tm )) ) - asctime_r (&l_tm, l_time_str); + dap_ctime_r(&l_ts, l_time_str); /* Convert ts to Sat May 17 01:17:08 2014 */ } char *l_tx_hash_str; @@ -788,14 +786,16 @@ int com_ledger(int a_argc, char ** a_argv, char **a_str_reply) //switch ledger params list | tx | info int l_cmd = CMD_NONE; - if (dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "list", NULL)){ + if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "list", NULL)){ l_cmd = CMD_LIST; - } else if (dap_cli_server_cmd_find_option_val(a_argv, 1, 2, "tx", NULL)){ + } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "tx", NULL)){ l_cmd = CMD_TX_HISTORY; - } else if (dap_cli_server_cmd_find_option_val(a_argv, 2, 3, "info", NULL)) + } else if (dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "info", NULL)) l_cmd = CMD_TX_INFO; - bool l_is_all = dap_cli_server_cmd_find_option_val(a_argv, 0, a_argc, "-all", NULL); + bool l_is_all = dap_cli_server_cmd_find_option_val(a_argv, arg_index, a_argc, "-all", NULL); + + arg_index++; // command tx_history if(l_cmd == CMD_TX_HISTORY) { diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index fc0826f2361f80f52341ff9a6914cbdb15c14a1c..911dd035f443dd7811d5d06fe99b9b78c0d1c06e 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -152,13 +152,13 @@ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) bool l_is_last_attempt = a_arg ? true : false; if (l_is_last_attempt) { pthread_mutex_lock(&l_node_client->wait_mutex); + pthread_mutex_unlock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED; #ifndef _WIN32 pthread_cond_broadcast(&l_node_client->wait_cond); #else SetEvent( l_node_client->wait_cond ); #endif - pthread_mutex_unlock(&l_node_client->wait_mutex); l_node_client->esocket_uuid = 0; dap_chain_net_sync_unlock(l_node_client->net, l_node_client); @@ -196,7 +196,13 @@ static void s_node_client_connected_synchro_start_callback(dap_worker_t *a_worke DAP_DELETE(a_arg); } -dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *a_uuid) +/** + * @brief dap_chain_node_client_start_sync + * @param a_uuid + * @param a_wrlock + * @return + */ +dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *a_uuid, bool a_wrlock) { dap_chain_node_client_handle_t *l_client_found = NULL; HASH_FIND(hh, s_clients, a_uuid, sizeof(*a_uuid), l_client_found); @@ -228,7 +234,9 @@ dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_ // If we do nothing - init sync process if (l_ch_chain->state == CHAIN_STATE_IDLE) { - if (dap_chain_net_sync_trylock(l_net, l_node_client)) { + bool l_trylocked = a_wrlock ? dap_chain_net_sync_trylock(l_net, l_node_client) + : dap_chain_net_sync_trylock_nolock(l_net, l_node_client); + if (l_trylocked) { log_it(L_INFO, "Start synchronization process with "NODE_ADDR_FP_STR, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr)); dap_stream_ch_chain_sync_request_t l_sync_gdb = {}; l_sync_gdb.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); @@ -258,7 +266,7 @@ static bool s_timer_update_states_callback(void *a_arg) { dap_events_socket_uuid_t *l_uuid = (dap_events_socket_uuid_t *)a_arg; assert(l_uuid); - dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid); + dap_chain_node_sync_status_t l_status = dap_chain_node_client_start_sync(l_uuid, true); if (l_status == NODE_SYNC_STATUS_MISSING) { DAP_DELETE(l_uuid); return false; @@ -344,6 +352,8 @@ static void s_stage_connected_callback(dap_client_t *a_client, void *a_arg) } } } + pthread_mutex_lock(&l_node_client->wait_mutex); + pthread_mutex_unlock(&l_node_client->wait_mutex); #ifndef _WIN32 pthread_cond_broadcast(&l_node_client->wait_cond); #else @@ -410,10 +420,11 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha dap_stream_ch_chain_pkt_t *a_pkt, size_t a_pkt_data_size, void * a_arg) { - UNUSED(a_ch_chain); UNUSED(a_pkt_data_size); dap_chain_node_client_t * l_node_client = (dap_chain_node_client_t *) a_arg; - + dap_chain_net_t *l_net = l_node_client->net; + assert(l_net); + bool l_finished = false; switch (a_pkt_type) { case DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR: dap_snprintf(l_node_client->last_error, sizeof(l_node_client->last_error), @@ -421,12 +432,10 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha log_it(L_WARNING, "In: Received packet DAP_STREAM_CH_CHAIN_NET_PKT_TYPE_ERROR with error \"%s\"", l_node_client->last_error); l_node_client->state = NODE_CLIENT_STATE_ERROR; - - #ifndef _WIN32 - pthread_cond_broadcast(&l_node_client->wait_cond); - #else - SetEvent( l_node_client->wait_cond ); - #endif + if (!strcmp(l_node_client->last_error, "ERROR_SYNC_REQUEST_ALREADY_IN_PROCESS")) { + dap_stream_ch_chain_reset(a_ch_chain); + l_finished = true; + } break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_REQ:{ l_node_client->state = NODE_CLIENT_STATE_SYNC_GDB_UPDATES; @@ -454,8 +463,6 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha }break; case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB: case DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_CHAINS: { - dap_chain_net_t *l_net = l_node_client->net; - assert(l_net); dap_chain_id_t l_chain_id = {}; dap_chain_cell_id_t l_cell_id = {}; if (a_pkt_type == DAP_STREAM_CH_CHAIN_PKT_TYPE_SYNCED_GLOBAL_DB) { @@ -464,7 +471,8 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha log_it(L_INFO,"In: Link %s."NODE_ADDR_FP_STR" synced GDB. Going to update chains", l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_node_client->remote_node_addr )); l_node_client->cur_chain = l_net->pub.chains; l_node_client->cur_cell = l_node_client->cur_chain ? l_node_client->cur_chain->cells : NULL; - } + } else + l_node_client->cur_chain = NULL; } else { // Check if we over with it before if ( ! l_node_client->cur_cell ){ @@ -504,28 +512,31 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha dap_stream_ch_chain_pkt_write_unsafe(l_node_client->ch_chain, DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_CHAINS_REQ, l_net->pub.id.uint64 , l_chain_id.uint64,l_cell_id.uint64,NULL,0); - }else{ // If no - over with sync process + } else { // If no - over with sync process log_it(L_INFO, "In: State node %s."NODE_ADDR_FP_STR" is SYNCED",l_net->pub.name, NODE_ADDR_FP_ARGS_S(l_node_addr) ); - bool l_have_waiting = dap_chain_net_sync_unlock(l_net, l_node_client); - l_node_client->state = NODE_CLIENT_STATE_SYNCED; - if (dap_chain_net_get_target_state(l_net) == NET_STATE_ONLINE) { - dap_timerfd_reset(l_node_client->sync_timer); - dap_chain_net_set_state(l_net, NET_STATE_ONLINE); - } - else if (!l_have_waiting) - { - #ifndef _WIN32 - pthread_cond_broadcast(&l_node_client->wait_cond); - #else - SetEvent( l_node_client->wait_cond ); - #endif - // l_node_client object is not presented after dap_chain_net_state_go_to with NET_STATE_OFFLINE - dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE); - } + l_finished = true; } } break; default: break; } + if (l_finished) { +#ifndef _WIN32 + pthread_cond_broadcast(&l_node_client->wait_cond); +#else + SetEvent( l_node_client->wait_cond); +#endif + bool l_have_waiting = dap_chain_net_sync_unlock(l_net, l_node_client); + l_node_client->state = NODE_CLIENT_STATE_SYNCED; + if (dap_chain_net_get_target_state(l_net) == NET_STATE_ONLINE) { + dap_timerfd_reset(l_node_client->sync_timer); + dap_chain_net_set_state(l_net, NET_STATE_ONLINE); + } + else if (!l_have_waiting) + { + // l_node_client object is not presented after dap_chain_net_state_go_to with NET_STATE_OFFLINE + dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE); + } + } } @@ -639,8 +650,8 @@ static int s_save_stat_to_database(dap_stream_ch_chain_net_srv_pkt_test_t *a_req int l_ret = 0; if(!a_request) return -1; - long l_t1_ms = (long) a_request->send_time1.tv_sec * 1000 + a_request->send_time1.tv_usec / 1000; - long l_t2_ms = (long) a_request->recv_time1.tv_sec * 1000 + a_request->recv_time1.tv_usec / 1000; + long l_t1_ms = a_request->send_time1.tv_sec * 1000 + a_request->send_time1.tv_nsec / 1e6; + long l_t2_ms = a_request->recv_time1.tv_sec * 1000 + a_request->recv_time1.tv_nsec / 1e6; struct json_object *jobj = json_object_new_object(); time_t l_cur_t = time(NULL); char buf[1024]; @@ -852,8 +863,11 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) HASH_FIND(hh,s_clients,&a_client->uuid,sizeof(a_client->uuid),l_client_found); if (l_client_found) { - if (l_client_found->client->sync_timer) + if (l_client_found->client->sync_timer) { + // Free memory callback_arg=uuid + DAP_DELETE(l_client_found->client->sync_timer->callback_arg); dap_timerfd_delete(l_client_found->client->sync_timer); + } HASH_DEL(s_clients,l_client_found); DAP_DELETE(l_client_found); diff --git a/modules/net/include/dap_chain_node_client.h b/modules/net/include/dap_chain_node_client.h index 3026a70ba0da367e49304a64f484dd9aeafad376..14a0cbb542e9a22cb80339bc559be024060b0c1e 100644 --- a/modules/net/include/dap_chain_node_client.h +++ b/modules/net/include/dap_chain_node_client.h @@ -188,7 +188,7 @@ int dap_chain_node_client_set_callbacks(dap_client_t *a_client, uint8_t a_ch_id) int dap_chain_node_client_send_nodelist_req(dap_chain_node_client_t *a_client); -dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *l_uuid); +dap_chain_node_sync_status_t dap_chain_node_client_start_sync(dap_events_socket_uuid_t *l_uuid, bool a_wrlock); static inline const char * dap_chain_node_client_state_to_str( dap_chain_node_client_state_t a_state) { diff --git a/modules/net/srv/dap_chain_net_srv_client.c b/modules/net/srv/dap_chain_net_srv_client.c index 84b92fe75fa4209d419229c9883825feca0966a8..ace4bf6002ab4d0348d8a94865426775edf9d597 100644 --- a/modules/net/srv/dap_chain_net_srv_client.c +++ b/modules/net/srv/dap_chain_net_srv_client.c @@ -119,8 +119,8 @@ static void s_srv_client_pkt_in(dap_stream_ch_chain_net_srv_t *a_ch_chain, uint8 l_srv_client->callbacks_arg); break; } - struct timeval l_recv_time; - gettimeofday(&l_recv_time, NULL); + struct timespec l_recv_time; + clock_gettime(CLOCK_REALTIME, &l_recv_time); l_response->recv_time1 = l_recv_time; dap_chain_hash_fast_t l_data_hash; dap_hash_fast(l_response->data, l_response->data_size, &l_data_hash); diff --git a/modules/net/srv/include/dap_chain_net_srv.h b/modules/net/srv/include/dap_chain_net_srv.h index 2273807c230919401a2df16334f6b59300b2752f..e42da15fa07f4eb2493ff6046702cee35b52ea39 100755 --- a/modules/net/srv/include/dap_chain_net_srv.h +++ b/modules/net/srv/include/dap_chain_net_srv.h @@ -165,22 +165,16 @@ typedef struct dap_stream_ch_chain_net_srv_pkt_error{ // data packet for connectiont test typedef struct dap_stream_ch_chain_net_srv_pkt_test { - uint32_t usage_id; - dap_chain_net_id_t net_id; + uint32_t usage_id; + dap_chain_net_id_t net_id; dap_chain_net_srv_uid_t srv_uid; - int32_t time_connect_ms; - struct timeval recv_time1; - struct timespec recv_time2; - struct timeval send_time1; - struct timeval send_time2; - byte_t ip_send[16]; - byte_t ip_recv[16]; - int32_t err_code; - uint64_t data_size_send; - uint64_t data_size_recv; - uint64_t data_size; - dap_chain_hash_fast_t data_hash; - uint8_t data[]; + int32_t time_connect_ms; + struct timespec recv_time1, recv_time2, send_time1, send_time2; + byte_t ip_send[INET_ADDRSTRLEN], ip_recv[INET_ADDRSTRLEN]; + int32_t err_code; + uint64_t data_size_send, data_size_recv, data_size; + dap_chain_hash_fast_t data_hash; + uint8_t data[]; } DAP_ALIGN_PACKED dap_stream_ch_chain_net_srv_pkt_test_t; typedef struct dap_chain_net_srv dap_chain_net_srv_t; diff --git a/modules/service/datum/dap_chain_net_srv_datum.c b/modules/service/datum/dap_chain_net_srv_datum.c index 75b81fec1b19f9dde0851ac76a2ac6f895daa975..9362ed3f250cd9d97573d994ef9ac6e1bdd9afb6 100644 --- a/modules/service/datum/dap_chain_net_srv_datum.c +++ b/modules/service/datum/dap_chain_net_srv_datum.c @@ -41,9 +41,9 @@ void s_order_notficator(void *a_arg, const char a_op_code, const char *a_group, int dap_chain_net_srv_datum_init() { dap_cli_server_cmd_add("srv_datum", s_srv_datum_cli, "Service Datum commands", - "srv_datum -net <chain net name> -chain <chain name> datum save -datum <datum hash>\n" + "srv_datum -net <net_name> -chain <chain_name> datum save -datum <datum_hash>\n" "\tSaving datum from mempool to file.\n\n" - "srv_datum -net <chain net name> -chain <chain name> datum load -datum <datum hash>\n" + "srv_datum -net <net_name> -chain <chain_name> datum load -datum <datum_hash>\n" "\tLoad datum custum from file to mempool.\n\n"); s_srv_datum = DAP_NEW_Z(dap_chain_net_srv_t); s_srv_datum->uid.uint64 = DAP_CHAIN_NET_SRV_DATUM_ID; diff --git a/modules/service/vpn/dap_chain_net_vpn_client.c b/modules/service/vpn/dap_chain_net_vpn_client.c index edbce30708106c24a6ec057057ed3e07873883b7..ecac0fa8833a4c4374ea4bcb68c51676fb5510d6 100644 --- a/modules/service/vpn/dap_chain_net_vpn_client.c +++ b/modules/service/vpn/dap_chain_net_vpn_client.c @@ -504,9 +504,9 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st // measuring connection time - struct timeval l_t; - gettimeofday(&l_t, NULL);//get_cur_time_msec - long l_t1 = (long) l_t.tv_sec * 1000 + l_t.tv_usec / 1000; + struct timespec l_t; + clock_gettime(CLOCK_REALTIME, &l_t);//get_cur_time_msec + long l_t1 = l_t.tv_sec * 1000 + l_t.tv_nsec / 1e6; const char l_active_channels[] = { dap_stream_ch_chain_net_srv_get_id(), 0 }; //only R, without S if(a_ipv4_str) @@ -533,9 +533,9 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st return -3; } - gettimeofday(&l_t, NULL); - long l_t2 = (long) l_t.tv_sec * 1000 + l_t.tv_usec / 1000; - int l_dtime_connect_ms = l_t2-l_t1; + clock_gettime(CLOCK_REALTIME, &l_t); + long l_t2 = l_t.tv_sec * 1000 + l_t.tv_nsec / 1e6; + int l_dtime_connect_ms = l_t2 - l_t1; //l_ret = dap_chain_net_vpn_client_tun_init(a_ipv4_str); @@ -555,8 +555,8 @@ int dap_chain_net_vpn_client_check(dap_chain_net_t *a_net, const char *a_ipv4_st if(a_ipv4_str) memcpy(l_request->ip_recv, a_ipv4_str, min(sizeof(l_request->ip_recv), strlen(a_ipv4_str))); l_request->time_connect_ms = l_dtime_connect_ms; - gettimeofday(&l_t, NULL); - l_t = l_request->send_time1; + clock_gettime(CLOCK_REALTIME, &l_t); + l_request->send_time1 = l_t; size_t l_request_size = l_request->data_size + sizeof(dap_stream_ch_chain_net_srv_pkt_test_t); dap_stream_ch_pkt_write_unsafe(l_ch, DAP_STREAM_CH_CHAIN_NET_SRV_PKT_TYPE_CHECK_REQUEST, l_request, l_request_size); dap_stream_ch_set_ready_to_write_unsafe(l_ch, true);