Page MenuHomePhabricator

[net] Make cs_inventory nonrecursive
ClosedPublic

Authored by PiRK on Apr 20 2021, 15:18.

Details

Reviewers
deadalnix
Group Reviewers
Restricted Project
Commits
rABC8ef7cf94d1d8: [net] Make cs_inventory nonrecursive
Summary

[net processing] Remove PushBlockInventory and PushBlockHash

PushBlockInventory() and PushBlockHash() are functions that can
be replaced with single-line statements. This also eliminates
the single place that cs_inventory is taken recursively.

[net] Make cs_inventory a non-recursive mutex

cs_inventory is never taken recursively. Make it a non-recursive mutex.

[net] Don't try to take cs_inventory before deleting CNode

The TRY_LOCK(cs_inventory) in DisconnectNodes() is taken after the CNode
object has been removed from vNodes and when the CNode's nRefCount is
zero.

The only other places that cs_inventory can be taken are:

  • In ProcessMessages() or SendMessages(), when the CNode's nRefCount

must be >0 (see ThreadMessageHandler(), where the refcount is
incremented before calling ProcessMessages() and SendMessages()).

  • In a ForEachNode() lambda in PeerLogicValidation::UpdatedBlockTip().

ForEachNode() locks cs_vNodes and calls the function on the CNode
objects in vNodes.

Therefore, cs_inventory is never locked by another thread when the
TRY_LOCK(cs_inventory) is reached in DisconnectNodes(). Since the
only purpose of this TRY_LOCK is to ensure that the lock is not
taken by another thread, this always succeeds. Remove the check.

This is a backport of core#19347

Test Plan

ninja all check-all