Deadlock on incoming connection (#1672) (#1675)

This commit is contained in:
Arkadiy Paronyan 2016-07-20 18:12:07 +02:00 committed by GitHub
parent a453bab9e8
commit 429c83f92f

View File

@ -754,7 +754,8 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
if let Some(session) = session.clone() {
let mut s = session.lock().unwrap();
loop {
match s.readable(io, &self.info.read().unwrap()) {
let session_result = s.readable(io, &self.info.read().unwrap());
match session_result {
Err(e) => {
trace!(target: "network", "Session read error: {}:{:?} ({:?}) {:?}", token, s.id(), s.remote_addr(), e);
if let UtilError::Network(NetworkError::Disconnect(DisconnectReason::IncompatibleProtocol)) = e {
@ -771,7 +772,6 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
self.num_sessions.fetch_add(1, AtomicOrdering::SeqCst);
if !s.info.originated {
let session_count = self.session_count();
let reserved_nodes = self.reserved_nodes.read().unwrap();
let (ideal_peers, reserved_only) = {
let info = self.info.read().unwrap();
(info.config.ideal_peers, info.config.non_reserved_mode == NonReservedPeerMode::Deny)
@ -779,7 +779,7 @@ impl<Message> Host<Message> where Message: Send + Sync + Clone {
if session_count >= ideal_peers as usize || reserved_only {
// only proceed if the connecting peer is reserved.
if !reserved_nodes.contains(s.id().unwrap()) {
if !self.reserved_nodes.read().unwrap().contains(s.id().unwrap()) {
s.disconnect(io, DisconnectReason::TooManyPeers);
return;
}