Skip to content

Commit e7e7461

Browse files
authored
Merge pull request DMDcoin#269 from DMDcoin/0.11
release 0.11.8
2 parents 45b790e + 2e6e129 commit e7e7461

File tree

6 files changed

+49
-15
lines changed

6 files changed

+49
-15
lines changed

CHANGELOG.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
## Diamond Node Software 3.3.5-hbbft-0.11.8
2+
- [deregister_session_stream can cause deadlocks](https://github.com/DMDcoin/diamond-node/issues/267)
3+
14
## Diamond Node Software 3.3.5-hbbft-0.11.7
25
- [Handshake and Session Management improvements](https://github.com/DMDcoin/diamond-node/issues/262)
36
- [Reliable Message Broadcast Protocol: message_cache of SyncProtocolHandler does not get cleaned up](https://github.com/DMDcoin/diamond-node/issues/261)

Cargo.lock

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
description = "Diamond Node"
33
name = "diamond-node"
44
# NOTE Make sure to update util/version/Cargo.toml as well
5-
version = "3.3.5-hbbft-0.11.7"
5+
version = "3.3.5-hbbft-0.11.8"
66
license = "GPL-3.0"
77
authors = [
88
"bit.diamonds developers",

crates/net/network-devp2p/src/host.rs

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1613,7 +1613,13 @@ impl IoHandler<NetworkIoMessage> for Host {
16131613
event_loop: &mut EventLoop<IoManager<NetworkIoMessage>>,
16141614
) {
16151615
match stream {
1616-
FIRST_HANDSHAKE.. => {
1616+
FIRST_HANDSHAKE..FIRST_SESSION => {
1617+
let _handhake_lock = self.handshake_lock.lock(); // we do not allow new handshakes to get processed during deregistering a stream.
1618+
self.sessions
1619+
.deregister_handshake_stream(stream, event_loop);
1620+
}
1621+
FIRST_SESSION..=LAST_SESSION => {
1622+
let _handhake_lock = self.handshake_lock.lock(); // since finalizing handshakes is the only way to promot a handshake to a session, we also block handshakes here.
16171623
self.sessions.deregister_session_stream(stream, event_loop);
16181624
}
16191625
DISCOVERY => (),

crates/net/network-devp2p/src/session_container.rs

Lines changed: 35 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std::{collections::BTreeMap, sync::Arc, time::Duration};
66

77
use crate::{io::*, node_table::*, session::Session};
88
use network::{Error, ErrorKind, NetworkIoMessage, PeerId};
9-
use parking_lot::{Mutex, RwLock, RwLockReadGuard, RwLockUpgradableReadGuard};
9+
use parking_lot::{Mutex, RwLock, RwLockReadGuard};
1010

1111
pub type SharedSession = Arc<Mutex<Session>>;
1212

@@ -430,28 +430,53 @@ impl SessionContainer {
430430
return None;
431431
}
432432

433+
pub(crate) fn deregister_handshake_stream<Host: mio::deprecated::Handler>(
434+
&self,
435+
stream: usize,
436+
event_loop: &mut mio::deprecated::EventLoop<Host>,
437+
) {
438+
if stream < self.first_handshake || stream >= self.last_handshake {
439+
warn!(target: "network", "Tried to deregister handshake stream {} but it is out of range.", stream);
440+
return;
441+
}
442+
443+
if let Some(connection) = self.get_handshake(stream) {
444+
let c = connection.lock();
445+
if c.expired() {
446+
// make sure it is the same connection that the event was generated for
447+
c.deregister_socket(event_loop)
448+
.expect("Error deregistering socket");
449+
drop(c);
450+
451+
self.handshakes.write().remove(&stream);
452+
//RwLockUpgradableReadGuard::<'_, parking_lot::RawRwLock, BTreeMap<usize, Arc<parking_lot::lock_api::Mutex<parking_lot::RawMutex, Session>>>>::upgrade(connections).remove(&stream);
453+
} else {
454+
debug!(target: "network", "Tried to deregister session stream {} but it is not expired.", stream);
455+
}
456+
} else {
457+
debug!(target: "network", "Tried to deregister session stream {} but it does not exist.", stream);
458+
}
459+
}
460+
433461
pub(crate) fn deregister_session_stream<Host: mio::deprecated::Handler>(
434462
&self,
435463
stream: usize,
436464

437465
event_loop: &mut mio::deprecated::EventLoop<Host>,
438466
) {
439-
let connections = if stream < self.last_handshake {
440-
self.handshakes.upgradable_read()
441-
} else {
442-
self.sessions.upgradable_read()
443-
};
467+
if stream < self.last_handshake + 1 {
468+
warn!(target: "network", "Tried to deregister session stream {} but it is out of range.", stream);
469+
return;
470+
}
444471

445-
if let Some(connection) = connections.get(&stream).cloned() {
472+
if let Some(connection) = self.get_session(stream) {
446473
let c = connection.lock();
447474
if c.expired() {
448475
// make sure it is the same connection that the event was generated for
449476
c.deregister_socket(event_loop)
450477
.expect("Error deregistering socket");
451478
drop(c);
452-
let mut connections_write = RwLockUpgradableReadGuard::upgrade(connections);
453-
connections_write.remove(&stream);
454-
//RwLockUpgradableReadGuard::<'_, parking_lot::RawRwLock, BTreeMap<usize, Arc<parking_lot::lock_api::Mutex<parking_lot::RawMutex, Session>>>>::upgrade(connections).remove(&stream);
479+
self.sessions.write().remove(&stream);
455480
} else {
456481
debug!(target: "network", "Tried to deregister session stream {} but it is not expired.", stream);
457482
}

crates/util/version/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "parity-version"
33
# NOTE: this value is used for OpenEthereum version string (via env CARGO_PKG_VERSION)
4-
version = "3.3.5-hbbft-0.11.7"
4+
version = "3.3.5-hbbft-0.11.8"
55
authors = [
66
"bit.diamonds developers",
77
"OpenEthereum developers",

0 commit comments

Comments
 (0)