lnworker: fix another peer-handling race
(related to prev commit, but really another bug)
If we had two peers with the same pubkey (peer A in the process of teardown, peer B ~freshly connected),
peer A might remove peer B from lnworker.peers via close_and_cleanup().
rm `close_and_cleanup()` call from reestablish_channel - it was added
as a workaround for this bug (in 8b95b2127d)
before we understood the cause.
This commit is contained in:
@@ -478,6 +478,9 @@ class Peer(Logger):
|
|||||||
self.querying.set()
|
self.querying.set()
|
||||||
|
|
||||||
def close_and_cleanup(self):
|
def close_and_cleanup(self):
|
||||||
|
# note: This method might get called multiple times!
|
||||||
|
# E.g. if you call close_and_cleanup() to cause a disconnection from the peer,
|
||||||
|
# it will get called a second time in handle_disconnect().
|
||||||
try:
|
try:
|
||||||
if self.transport:
|
if self.transport:
|
||||||
self.transport.close()
|
self.transport.close()
|
||||||
@@ -1081,7 +1084,6 @@ class Peer(Logger):
|
|||||||
elif we_are_ahead:
|
elif we_are_ahead:
|
||||||
self.logger.warning(f"channel_reestablish ({chan.get_id_for_log()}): we are ahead of remote! trying to force-close.")
|
self.logger.warning(f"channel_reestablish ({chan.get_id_for_log()}): we are ahead of remote! trying to force-close.")
|
||||||
await self.lnworker.try_force_closing(chan_id)
|
await self.lnworker.try_force_closing(chan_id)
|
||||||
self.close_and_cleanup()
|
|
||||||
return
|
return
|
||||||
|
|
||||||
chan.peer_state = PeerState.GOOD
|
chan.peer_state = PeerState.GOOD
|
||||||
|
|||||||
@@ -316,7 +316,9 @@ class LNWorker(Logger, NetworkRetryManager[LNPeerAddr]):
|
|||||||
|
|
||||||
def peer_closed(self, peer: Peer) -> None:
|
def peer_closed(self, peer: Peer) -> None:
|
||||||
with self.lock:
|
with self.lock:
|
||||||
self._peers.pop(peer.pubkey, None)
|
peer2 = self._peers.get(peer.pubkey)
|
||||||
|
if peer2 is peer:
|
||||||
|
self._peers.pop(peer.pubkey)
|
||||||
|
|
||||||
def num_peers(self) -> int:
|
def num_peers(self) -> int:
|
||||||
return sum([p.is_initialized() for p in self.peers.values()])
|
return sum([p.is_initialized() for p in self.peers.values()])
|
||||||
|
|||||||
Reference in New Issue
Block a user