diff --git a/modules/chain/dap_chain.c b/modules/chain/dap_chain.c index d1a0d3c46126f576a00ca288437deeb64899db50..c8080919dc9b702c7fb87364f50f6edf9d7425df 100644 --- a/modules/chain/dap_chain.c +++ b/modules/chain/dap_chain.c @@ -41,8 +41,10 @@ #include "dap_cert_file.h" #include "dap_chain_ch.h" #include "dap_stream_ch_gossip.h" +#include "dap_notify_srv.h" #include <uthash.h> #include <pthread.h> +#include "json.h" #define LOG_TAG "chain" @@ -580,6 +582,19 @@ int dap_chain_save_all(dap_chain_t *l_chain) return l_ret; } +//send chain load_progress data to notify socket +bool download_notify_callback(dap_chain_t* a_chain) { + json_object* l_chain_info = json_object_new_object(); + json_object_object_add(l_chain_info, "class", json_object_new_string("chain_init")); + json_object_object_add(l_chain_info, "net", json_object_new_string(a_chain->net_name)); + json_object_object_add(l_chain_info, "chain_id", json_object_new_uint64(a_chain->id.uint64)); + json_object_object_add(l_chain_info, "load_progress", json_object_new_int(a_chain->load_progress)); + dap_notify_server_send_mt(json_object_get_string(l_chain_info)); + log_it(L_DEBUG, "Load progress: net_name: %s; chain_id: %d; download:%d%c", a_chain->net_name, a_chain->id.uint64, a_chain->load_progress, '%'); + json_object_put(l_chain_info); + return true; +} + /** * @brief dap_chain_load_all * @param l_chain @@ -610,6 +625,7 @@ int dap_chain_load_all(dap_chain_t *a_chain) uint64_t l_cell_id_uint64 = 0; sscanf(l_filename, "%"DAP_UINT64_FORMAT_x".dchaincell", &l_cell_id_uint64); dap_chain_cell_t *l_cell = dap_chain_cell_create_fill(a_chain, (dap_chain_cell_id_t){ .uint64 = l_cell_id_uint64 }); + dap_timerfd_t* l_download_notify_timer = dap_timerfd_start(5000, (dap_timerfd_callback_t)download_notify_callback, a_chain); l_ret += dap_chain_cell_load(a_chain, l_cell); if ( DAP_CHAIN_PVT(a_chain)->need_reorder ) { #ifdef DAP_OS_WINDOWS @@ -629,6 +645,8 @@ int dap_chain_load_all(dap_chain_t *a_chain) DAP_DELETE(l_filename_backup); #endif } + dap_timerfd_delete_unsafe(l_download_notify_timer); + download_notify_callback(a_chain); } } closedir(l_dir); diff --git a/modules/chain/dap_chain_cell.c b/modules/chain/dap_chain_cell.c index e72e14f11b9378e74819f808c84abae5e3c471a9..750c05c7abddb55b8fe92bbca870463e01ce09cd 100644 --- a/modules/chain/dap_chain_cell.c +++ b/modules/chain/dap_chain_cell.c @@ -439,7 +439,7 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) uint64_t q = 0; if (a_chain->is_mapped) { a_cell->map_pos = a_cell->map + sizeof(dap_chain_cell_file_header_t); - for ( uint64_t l_el_size = 0; l_pos < l_size; ++q, l_pos += l_el_size + sizeof(uint64_t) ) { + for ( uint64_t l_el_size = 0; l_pos < l_size; ++q, l_pos += l_el_size + sizeof(uint64_t), a_chain->load_progress = (int)((double)l_pos/l_size * 100 + 0.5)) { size_t space_left = (size_t)( a_cell->map_end - a_cell->map_pos ); if ( space_left < sizeof(uint64_t) || (space_left - sizeof(uint64_t)) < *(uint64_t*)a_cell->map_pos ) if ( s_cell_map_new_volume(a_cell, l_pos) ) @@ -468,6 +468,7 @@ int dap_chain_cell_load(dap_chain_t *a_chain, dap_chain_cell_t *a_cell) break; } l_pos += sizeof(uint64_t) + ( l_read = fread((void*)l_element, 1, l_el_size, a_cell->file_storage) ); + a_chain->load_progress = (int)((double)l_pos/l_size * 100 + 0.5); if (l_read != l_el_size) { log_it(L_ERROR, "Read only %lu of %zu bytes, stop cell loading", l_read, l_el_size); DAP_DELETE(l_element); diff --git a/modules/chain/include/dap_chain.h b/modules/chain/include/dap_chain.h index c060a96726f8f3ff40d50f8750e1c29ba5c0739d..5d10ba584ffbc32504e9d0f4650ba5155edbbc99 100644 --- a/modules/chain/include/dap_chain.h +++ b/modules/chain/include/dap_chain.h @@ -140,6 +140,7 @@ typedef struct dap_chain { char *net_name; bool is_datum_pool_proc; bool is_mapped; + atomic_int load_progress; // Nested cells (hashtab by cell_id) dap_chain_cell_t *cells; dap_chain_cell_id_t active_cell_id; diff --git a/modules/type/dag/dap_chain_cs_dag.c b/modules/type/dag/dap_chain_cs_dag.c index d392889bb785d87e44c5b7c3f71066fad1856daa..84dc44b8c4ecf071cd4d51321c4d1e21f6ead521 100644 --- a/modules/type/dag/dap_chain_cs_dag.c +++ b/modules/type/dag/dap_chain_cs_dag.c @@ -1599,12 +1599,12 @@ static int s_cli_dag(int argc, char ** argv, void **a_str_reply) break; } - if ( l_event ){ + if ( l_event ) { + char buf[DAP_TIME_STR_SIZE]; json_object_object_add(json_obj_event,"Event hash", json_object_new_string(l_event_hash_str)); // Round info if ((l_from_events_str && strcmp(l_from_events_str,"round.new") == 0) && l_round_item) { - char buf[DAP_TIME_STR_SIZE]; json_object_object_add(json_obj_event,"Round info", json_object_new_string(" ")); json_object_object_add(json_obj_event,"tsigns reject", json_object_new_uint64(l_round_item->round_info.reject_count)); json_object_object_add(json_obj_event,"ts_update", json_object_new_string(buf));