Skip to content

Commit cc9aa45

Browse files
committed
Improve PeerHandler debug_assertions and checks
This removes two panics from `PeerHandler` which can trivially be `debug_assert!(false); return Err;`s, and adds another `debug_assertion` on internal state consistency during disconnect.
1 parent 2c15bb4 commit cc9aa45

File tree

1 file changed

+76
-59
lines changed

1 file changed

+76
-59
lines changed

lightning/src/ln/peer_handler.rs

+76-59
Original file line numberDiff line numberDiff line change
@@ -815,34 +815,40 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
815815
let pending_read_buffer = [0; 50].to_vec(); // Noise act two is 50 bytes
816816

817817
let mut peers = self.peers.write().unwrap();
818-
if peers.insert(descriptor, Mutex::new(Peer {
819-
channel_encryptor: peer_encryptor,
820-
their_node_id: None,
821-
their_features: None,
822-
their_net_address: remote_network_address,
823-
824-
pending_outbound_buffer: LinkedList::new(),
825-
pending_outbound_buffer_first_msg_offset: 0,
826-
gossip_broadcast_buffer: LinkedList::new(),
827-
awaiting_write_event: false,
828-
829-
pending_read_buffer,
830-
pending_read_buffer_pos: 0,
831-
pending_read_is_header: false,
832-
833-
sync_status: InitSyncTracker::NoSyncRequested,
834-
835-
msgs_sent_since_pong: 0,
836-
awaiting_pong_timer_tick_intervals: 0,
837-
received_message_since_timer_tick: false,
838-
sent_gossip_timestamp_filter: false,
839-
840-
received_channel_announce_since_backlogged: false,
841-
inbound_connection: false,
842-
})).is_some() {
843-
panic!("PeerManager driver duplicated descriptors!");
844-
};
845-
Ok(res)
818+
match peers.entry(descriptor) {
819+
hash_map::Entry::Occupied(_) => {
820+
debug_assert!(false, "PeerManager driver duplicated descriptors!");
821+
Err(PeerHandleError {})
822+
},
823+
hash_map::Entry::Vacant(e) => {
824+
e.insert(Mutex::new(Peer {
825+
channel_encryptor: peer_encryptor,
826+
their_node_id: None,
827+
their_features: None,
828+
their_net_address: remote_network_address,
829+
830+
pending_outbound_buffer: LinkedList::new(),
831+
pending_outbound_buffer_first_msg_offset: 0,
832+
gossip_broadcast_buffer: LinkedList::new(),
833+
awaiting_write_event: false,
834+
835+
pending_read_buffer,
836+
pending_read_buffer_pos: 0,
837+
pending_read_is_header: false,
838+
839+
sync_status: InitSyncTracker::NoSyncRequested,
840+
841+
msgs_sent_since_pong: 0,
842+
awaiting_pong_timer_tick_intervals: 0,
843+
received_message_since_timer_tick: false,
844+
sent_gossip_timestamp_filter: false,
845+
846+
received_channel_announce_since_backlogged: false,
847+
inbound_connection: false,
848+
}));
849+
Ok(res)
850+
}
851+
}
846852
}
847853

848854
/// Indicates a new inbound connection has been established to a node with an optional remote
@@ -865,34 +871,40 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
865871
let pending_read_buffer = [0; 50].to_vec(); // Noise act one is 50 bytes
866872

867873
let mut peers = self.peers.write().unwrap();
868-
if peers.insert(descriptor, Mutex::new(Peer {
869-
channel_encryptor: peer_encryptor,
870-
their_node_id: None,
871-
their_features: None,
872-
their_net_address: remote_network_address,
873-
874-
pending_outbound_buffer: LinkedList::new(),
875-
pending_outbound_buffer_first_msg_offset: 0,
876-
gossip_broadcast_buffer: LinkedList::new(),
877-
awaiting_write_event: false,
878-
879-
pending_read_buffer,
880-
pending_read_buffer_pos: 0,
881-
pending_read_is_header: false,
882-
883-
sync_status: InitSyncTracker::NoSyncRequested,
884-
885-
msgs_sent_since_pong: 0,
886-
awaiting_pong_timer_tick_intervals: 0,
887-
received_message_since_timer_tick: false,
888-
sent_gossip_timestamp_filter: false,
889-
890-
received_channel_announce_since_backlogged: false,
891-
inbound_connection: true,
892-
})).is_some() {
893-
panic!("PeerManager driver duplicated descriptors!");
894-
};
895-
Ok(())
874+
match peers.entry(descriptor) {
875+
hash_map::Entry::Occupied(_) => {
876+
debug_assert!(false, "PeerManager driver duplicated descriptors!");
877+
Err(PeerHandleError {})
878+
},
879+
hash_map::Entry::Vacant(e) => {
880+
e.insert(Mutex::new(Peer {
881+
channel_encryptor: peer_encryptor,
882+
their_node_id: None,
883+
their_features: None,
884+
their_net_address: remote_network_address,
885+
886+
pending_outbound_buffer: LinkedList::new(),
887+
pending_outbound_buffer_first_msg_offset: 0,
888+
gossip_broadcast_buffer: LinkedList::new(),
889+
awaiting_write_event: false,
890+
891+
pending_read_buffer,
892+
pending_read_buffer_pos: 0,
893+
pending_read_is_header: false,
894+
895+
sync_status: InitSyncTracker::NoSyncRequested,
896+
897+
msgs_sent_since_pong: 0,
898+
awaiting_pong_timer_tick_intervals: 0,
899+
received_message_since_timer_tick: false,
900+
sent_gossip_timestamp_filter: false,
901+
902+
received_channel_announce_since_backlogged: false,
903+
inbound_connection: true,
904+
}));
905+
Ok(())
906+
}
907+
}
896908
}
897909

898910
fn peer_should_read(&self, peer: &mut Peer) -> bool {
@@ -1141,9 +1153,13 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
11411153
macro_rules! insert_node_id {
11421154
() => {
11431155
match self.node_id_to_descriptor.lock().unwrap().entry(peer.their_node_id.unwrap().0) {
1144-
hash_map::Entry::Occupied(_) => {
1156+
hash_map::Entry::Occupied(e) => {
11451157
log_trace!(self.logger, "Got second connection with {}, closing", log_pubkey!(peer.their_node_id.unwrap().0));
11461158
peer.their_node_id = None; // Unset so that we don't generate a peer_disconnected event
1159+
// Check that the peers map is consistent with the
1160+
// node_id_to_descriptor map, as this has been broken
1161+
// before.
1162+
debug_assert!(peers.get(e.get()).is_some());
11471163
return Err(PeerHandleError { })
11481164
},
11491165
hash_map::Entry::Vacant(entry) => {
@@ -1913,7 +1929,7 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
19131929
self.do_attempt_write_data(&mut descriptor, &mut *peer, false);
19141930
}
19151931
self.do_disconnect(descriptor, &*peer, "DisconnectPeer HandleError");
1916-
}
1932+
} else { debug_assert!(false, "Missing connection for peer"); }
19171933
}
19181934
}
19191935
}
@@ -1953,7 +1969,8 @@ impl<Descriptor: SocketDescriptor, CM: Deref, RM: Deref, OM: Deref, L: Deref, CM
19531969
let peer = peer_lock.lock().unwrap();
19541970
if let Some((node_id, _)) = peer.their_node_id {
19551971
log_trace!(self.logger, "Handling disconnection of peer {}", log_pubkey!(node_id));
1956-
self.node_id_to_descriptor.lock().unwrap().remove(&node_id);
1972+
let removed = self.node_id_to_descriptor.lock().unwrap().remove(&node_id);
1973+
debug_assert!(removed.is_some(), "descriptor maps should be consistent");
19571974
if !peer.handshake_complete() { return; }
19581975
self.message_handler.chan_handler.peer_disconnected(&node_id);
19591976
self.message_handler.onion_message_handler.peer_disconnected(&node_id);

0 commit comments

Comments
 (0)