diff --git a/src/lib_shell/chain_validator.ml b/src/lib_shell/chain_validator.ml index 6f8ece6a9010df9d8b722993cc571eb968defbcf..8e58b6ae8c9b9d08ec25f2aaa4bf17cf1d332cac 100644 --- a/src/lib_shell/chain_validator.ml +++ b/src/lib_shell/chain_validator.ml @@ -351,19 +351,15 @@ let may_switch_test_chain w active_chains spawn_child block = Lwt.return_unit let broadcast_head w ~previous block = - let open Lwt_syntax in let nv = Worker.state w in if not (is_bootstrapped nv) then Lwt.return_unit else - let* successor = - let* o = - Store.Block.read_predecessor_opt nv.parameters.chain_store block - in - match o with - | None -> Lwt.return_true - | Some predecessor -> Lwt.return (Store.Block.equal predecessor previous) + let predecessor_hash = Store.Block.predecessor block in + let successor_or_sibling = + Block_hash.equal predecessor_hash (Store.Block.hash previous) + || Block_hash.equal predecessor_hash (Store.Block.predecessor previous) in - if successor then ( + if successor_or_sibling then ( Distributed_db.Advertise.current_head nv.chain_db block ; Lwt.return_unit) else Distributed_db.Advertise.current_branch nv.chain_db diff --git a/src/lib_shell/distributed_db.ml b/src/lib_shell/distributed_db.ml index 1b04504c30ff8cdd5fb6ad0831dda7269ee84540..907934442b9c8799e5d30affc2506b8fa28d6401 100644 --- a/src/lib_shell/distributed_db.ml +++ b/src/lib_shell/distributed_db.ml @@ -447,7 +447,7 @@ module Request = struct let current_branch chain_db peer = let chain_id = Store.Chain.chain_id chain_db.reader_chain_db.chain_store in let meta = P2p.get_peer_metadata chain_db.global_db.p2p peer in - Peer_metadata.incr meta (Sent_request Head) ; + Peer_metadata.incr meta (Sent_request Branch) ; try_send chain_db peer @@ Get_current_branch chain_id end diff --git a/src/lib_shell/peer_validator.ml b/src/lib_shell/peer_validator.ml index 1a20e287a39a20376ca8b8bfffba00e9f1d09242..b8c9a28972b1823232084d2fe1c955f91ddf4160 100644 --- a/src/lib_shell/peer_validator.ml +++ b/src/lib_shell/peer_validator.ml @@ -290,10 +290,11 @@ let may_validate_new_branch w locator = locator in match v with - | Known_valid, prefix_locator -> - if prefix_locator.Block_locator.history <> [] then - bootstrap_new_branch w prefix_locator - else return_unit + | Known_valid, {history = []; _} -> return_unit + | Known_valid, {history = [x]; head_header; head_hash} + when Block_hash.equal x head_header.shell.predecessor -> + validate_new_head w head_hash head_header + | Known_valid, prefix_locator -> bootstrap_new_branch w prefix_locator | Unknown, _ -> (* May happen when: - A locator from another chain is received;