diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index bc4ba71798b8bfa98f4f21a563cf50822c1141c7..b765f4662b9a89b45f74c980e189352f7b81510e 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -336,7 +336,7 @@ static void s_sync_out_gdb_first_worker_callback(dap_worker_t *a_worker, void *a dap_chain_net_t *l_net = dap_chain_net_by_id(l_ch_chain->request_hdr.net_id); // Add it to outgoing list - l_ch_chain->request_db_log = l_sync_request->gdb.db_log; + if (l_ch_chain->request_db_log == NULL) l_ch_chain->request_db_log = l_sync_request->gdb.db_log; l_ch_chain->state = CHAIN_STATE_SYNC_GLOBAL_DB; dap_chain_node_addr_t l_node_addr = { 0 }; l_node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); @@ -394,19 +394,31 @@ static bool s_sync_out_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a_ar { struct sync_request *l_sync_request = (struct sync_request *)a_arg; dap_chain_net_t *l_net = dap_chain_net_by_id(l_sync_request->request_hdr.net_id); + dap_stream_ch_t *l_ch = dap_stream_ch_find_by_uuid_unsafe(DAP_STREAM_WORKER(l_sync_request->worker), l_sync_request->ch_uuid); + if (l_ch == NULL) { + log_it(L_INFO, "Client disconnected before we sent the reply"); + s_sync_request_delete(l_sync_request); + return; + } + dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); + int l_flags = 0; if (dap_chain_net_get_add_gdb_group(l_net, l_sync_request->request.node_addr)) l_flags |= F_DB_LOG_ADD_EXTRA_GROUPS; if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; - dap_db_log_list_t *l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + dap_db_log_list_t *l_db_log = NULL; + if (l_ch_chain->request_db_log == NULL) { + l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = l_db_log; + } if(l_db_log) { if (s_debug_more) log_it(L_DEBUG, "Sync out gdb proc, requested %"DAP_UINT64_FORMAT_U" transactions from address "NODE_ADDR_FP_STR, l_db_log->items_number, NODE_ADDR_FP_ARGS_S(l_sync_request->request.node_addr)); l_sync_request->gdb.db_log = l_db_log; - //dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_out_gdb_first_worker_callback, l_sync_request ); + dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_out_gdb_first_worker_callback, l_sync_request ); } else { dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_out_gdb_last_worker_callback, l_sync_request ); } @@ -445,8 +457,11 @@ static bool s_sync_update_gdb_proc_callback(dap_proc_thread_t *a_thread, void *a l_flags |= F_DB_LOG_ADD_EXTRA_GROUPS; if (!l_sync_request->request.id_start) l_flags |= F_DB_LOG_SYNC_FROM_ZERO; - dap_db_log_list_t *l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); - l_ch_chain->request_db_log = l_db_log; + dap_db_log_list_t *l_db_log = NULL; + if (l_ch_chain->request_db_log == NULL) { + l_db_log = dap_db_log_list_start(l_sync_request->request.node_addr, l_flags); + l_ch_chain->request_db_log = l_db_log; + } l_ch_chain->state = CHAIN_STATE_UPDATE_GLOBAL_DB; l_sync_request->request.node_addr.uint64 = dap_chain_net_get_cur_addr_int(l_net); dap_proc_thread_worker_exec_callback(a_thread, l_sync_request->worker->id, s_sync_update_gdb_start_worker_callback, l_sync_request); @@ -798,7 +813,7 @@ static bool s_chain_timer_callback(void *a_arg) dap_stream_ch_chain_t *l_ch_chain = DAP_STREAM_CH_CHAIN(l_ch); if (!l_ch_chain->was_active) { if (l_ch_chain->state != CHAIN_STATE_IDLE) { - dap_stream_ch_chain_go_idle(l_ch_chain); + dap_stream_ch_chain_go_idle_and_free_list(l_ch_chain); } DAP_DELETE(a_arg); l_ch_chain->activity_timer = NULL; @@ -1521,7 +1536,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) &l_ch_chain->request, sizeof(dap_stream_ch_chain_sync_request_t)); if (s_debug_more ) log_it(L_INFO, "Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_END"); - dap_stream_ch_chain_go_idle_and_free_list(l_ch_chain); + dap_stream_ch_chain_go_idle(l_ch_chain); } } break;