Add a note that `peer_disconnected` impls must be idempotent
[rust-lightning] / lightning / src / ln / channel.rs
index b37550b0d2a91eb909bb997dc3dda39a91de887b..c8209a9eac6f984f76514987729d9ca04dde192f 100644 (file)
@@ -3550,6 +3550,12 @@ impl<Signer: Sign> Channel<Signer> {
                        return;
                }
 
+               if self.channel_state & (ChannelState::PeerDisconnected as u32) == (ChannelState::PeerDisconnected as u32) {
+                       // While the below code should be idempotent, it's simpler to just return early, as
+                       // redundant disconnect events can fire, though they should be rare.
+                       return;
+               }
+
                if self.announcement_sigs_state == AnnouncementSigsState::MessageSent || self.announcement_sigs_state == AnnouncementSigsState::Committed {
                        self.announcement_sigs_state = AnnouncementSigsState::NotSent;
                }