mirror of
https://github.com/mimblewimble/grin.git
synced 2025-02-01 17:01:09 +03:00
* Fix concurrency issue around peer add and start. Fixes #1585
This commit is contained in:
parent
0cb228d4e9
commit
85d5feafa3
2 changed files with 30 additions and 24 deletions
|
@ -56,9 +56,12 @@ impl Peers {
|
|||
|
||||
/// Adds the peer to our internal peer mapping. Note that the peer is still
|
||||
/// returned so the server can run it.
|
||||
pub fn add_connected(&self, p: Peer) -> Result<Arc<RwLock<Peer>>, Error> {
|
||||
debug!(LOGGER, "Saving newly connected peer {}.", p.info.addr);
|
||||
let peer_data = PeerData {
|
||||
pub fn add_connected(&self, peer: Arc<RwLock<Peer>>) -> Result<(), Error> {
|
||||
let peer_data: PeerData;
|
||||
let addr: SocketAddr;
|
||||
{
|
||||
let p = peer.read().unwrap();
|
||||
peer_data = PeerData {
|
||||
addr: p.info.addr,
|
||||
capabilities: p.info.capabilities,
|
||||
user_agent: p.info.user_agent.clone(),
|
||||
|
@ -66,15 +69,16 @@ impl Peers {
|
|||
last_banned: 0,
|
||||
ban_reason: ReasonForBan::None,
|
||||
};
|
||||
addr = p.info.addr.clone();
|
||||
}
|
||||
debug!(LOGGER, "Saving newly connected peer {}.", addr);
|
||||
self.save_peer(&peer_data)?;
|
||||
|
||||
let addr = p.info.addr.clone();
|
||||
let apeer = Arc::new(RwLock::new(p));
|
||||
{
|
||||
let mut peers = self.peers.write().unwrap();
|
||||
peers.insert(addr, apeer.clone());
|
||||
peers.insert(addr, peer.clone());
|
||||
}
|
||||
Ok(apeer)
|
||||
Ok(())
|
||||
}
|
||||
|
||||
// Update the dandelion relay
|
||||
|
|
|
@ -178,20 +178,20 @@ impl Server {
|
|||
let addr = SocketAddr::new(self.config.host, self.config.port);
|
||||
let total_diff = self.peers.total_difficulty();
|
||||
|
||||
let peer = Peer::connect(
|
||||
let peer = Arc::new(RwLock::new(Peer::connect(
|
||||
&mut stream,
|
||||
self.capabilities,
|
||||
total_diff,
|
||||
addr,
|
||||
&self.handshake,
|
||||
self.peers.clone(),
|
||||
)?;
|
||||
let added = self.peers.add_connected(peer)?;
|
||||
)?));
|
||||
{
|
||||
let mut peer = added.write().unwrap();
|
||||
let mut peer = peer.write().unwrap();
|
||||
peer.start(stream);
|
||||
}
|
||||
Ok(added)
|
||||
self.peers.add_connected(peer.clone())?;
|
||||
Ok(peer)
|
||||
}
|
||||
Err(e) => {
|
||||
debug!(
|
||||
|
@ -211,16 +211,18 @@ impl Server {
|
|||
let total_diff = self.peers.total_difficulty();
|
||||
|
||||
// accept the peer and add it to the server map
|
||||
let peer = Peer::accept(
|
||||
let peer = Arc::new(RwLock::new(Peer::accept(
|
||||
&mut stream,
|
||||
self.capabilities,
|
||||
total_diff,
|
||||
&self.handshake,
|
||||
self.peers.clone(),
|
||||
)?;
|
||||
let added = self.peers.add_connected(peer)?;
|
||||
let mut peer = added.write().unwrap();
|
||||
)?));
|
||||
{
|
||||
let mut peer = peer.write().unwrap();
|
||||
peer.start(stream);
|
||||
}
|
||||
self.peers.add_connected(peer)?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue