diff --git a/src/lib_shell/distributed_db.ml b/src/lib_shell/distributed_db.ml index 29d926470e0b8f2ff039c337316c58117baed8fa..1b04504c30ff8cdd5fb6ad0831dda7269ee84540 100644 --- a/src/lib_shell/distributed_db.ml +++ b/src/lib_shell/distributed_db.ml @@ -49,6 +49,7 @@ *) module Message = Distributed_db_message +module Distributed_db_event = Distributed_db_event.Distributed_db_event type p2p = (Message.t, Peer_metadata.t, Connection_metadata.t) P2p.net @@ -123,7 +124,27 @@ let activate ({p2p; active_chains; protocol_db; disk; p2p_readers; _} as global_db) chain_store callback = let run_p2p_reader gid = - let register p2p_reader = P2p_peer.Table.add p2p_readers gid p2p_reader in + let register p2p_reader = + (match P2p_peer.Table.find p2p_readers gid with + | None -> () + | Some old_p2p_reader -> + Distributed_db_event.( + emit__dont_wait__use_with_care multiple_p2p_reader) + gid ; + (* It is not expected to have exception raised by this function, + however to prevent future problems potential exceptions are + logged. *) + Lwt.dont_wait + (fun () -> P2p_reader.shutdown old_p2p_reader) + (fun exn -> + match exn with + | Out_of_memory | Stack_overflow -> raise exn + | _ -> + Distributed_db_event.( + emit__dont_wait__use_with_care p2p_reader_shutdown_failed) + (gid, Printexc.to_string exn))) ; + P2p_peer.Table.add p2p_readers gid p2p_reader + in let unregister () = P2p_peer.Table.remove p2p_readers gid in P2p_reader.run ~register ~unregister p2p disk protocol_db active_chains gid in diff --git a/src/lib_shell/distributed_db_event.ml b/src/lib_shell/distributed_db_event.ml index 5574d3d6af80004e7a91e2095506f3ca863555e8..c61051b5f6630399b5378e369eef8e24d19d0d78 100644 --- a/src/lib_shell/distributed_db_event.ml +++ b/src/lib_shell/distributed_db_event.ml @@ -22,6 +22,30 @@ (* DEALINGS IN THE SOFTWARE. *) (* *) (*****************************************************************************) + +module Distributed_db_event = struct + include Internal_event.Simple + + let section = ["node"; "distributed_db"] + + let multiple_p2p_reader = + declare_1 + ~section + ~name:"multiple_p2p_reader" + ~msg:"multiple p2p_reader for {peer}, a connection may be stuck" + ~level:Warning + ("peer", P2p_peer.Id.encoding) + + let p2p_reader_shutdown_failed = + declare_2 + ~section + ~name:"p2p_reader_shutdow_failed" + ~msg:"p2p_reader of {peer} failed to shut down with {exn}" + ~level:Warning + ("peer", P2p_peer.Id.encoding) + ("exn", Data_encoding.string) +end + module Requester_event = struct include Internal_event.Simple