Skip to content

Commit fd07903

Browse files
majectysgkim126
authored andcommitted
Ignore max-peers min-peers option when a user call the "connect" RPC
1 parent 10169cf commit fd07903

File tree

4 files changed

+40
-16
lines changed

4 files changed

+40
-16
lines changed

network/src/p2p/handler.rs

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,15 @@ const LAST_CONNECTION_TOKEN: TimerToken = FIRST_CONNECTION_TOKEN + MAX_CONNECTIO
5959
const CREATE_CONNECTIONS_TOKEN: TimerToken = 0;
6060
const PULL_CONNECTIONS_MS: u64 = 10 * 1000;
6161

62-
#[derive(Clone, Debug, PartialOrd, PartialEq)]
62+
#[derive(Clone, Debug, PartialEq)]
63+
pub enum IgnoreConnectionLimit {
64+
Ignore,
65+
Not,
66+
}
67+
68+
#[derive(Clone, Debug, PartialEq)]
6369
pub enum Message {
64-
RequestConnection(SocketAddr),
70+
RequestConnection(SocketAddr, IgnoreConnectionLimit),
6571

6672
RequestNegotiation {
6773
node_id: NodeId,
@@ -355,7 +361,7 @@ impl IoHandler<Message> for Handler {
355361
let count = (self.min_peers - number_of_connections + 1) / 2;
356362
let addresses = manager.routing_table.unestablished_addresses(count);
357363
for address in addresses {
358-
io.message(Message::RequestConnection(address))?;
364+
io.message(Message::RequestConnection(address, IgnoreConnectionLimit::Not))?;
359365
}
360366
}
361367
Ok(())
@@ -366,12 +372,14 @@ impl IoHandler<Message> for Handler {
366372

367373
fn message(&self, io: &IoContext<Message>, message: &Message) -> IoHandlerResult<()> {
368374
match message {
369-
Message::RequestConnection(socket_address) => {
375+
Message::RequestConnection(socket_address, ignore_connection_limit) => {
370376
let mut manager = self.manager.lock();
371-
let number_of_connections = manager.connections.len();
372-
if self.max_peers <= manager.connections.len() {
373-
ctrace!(NET, "Already has maximum peers({})", number_of_connections);
374-
return Ok(())
377+
if ignore_connection_limit == &IgnoreConnectionLimit::Not {
378+
let number_of_connections = manager.connections.len();
379+
if self.max_peers <= manager.connections.len() {
380+
ctrace!(NET, "Already has maximum peers({})", number_of_connections);
381+
return Ok(())
382+
}
375383
}
376384

377385
ctrace!(NET, "Connecting to {:?}", socket_address);

network/src/p2p/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ mod listener;
2121
mod message;
2222
mod stream;
2323

24-
pub use self::handler::{Handler, Message};
24+
pub use self::handler::{Handler, IgnoreConnectionLimit, Message};
2525
use self::message::ExtensionMessage;
2626
use self::message::NegotiationBody;
2727
use self::message::NegotiationMessage;

network/src/service.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,8 @@ impl Service {
5858

5959
timer.register_handler(Arc::new(timer::Handler::new(Arc::clone(&client))))?;
6060

61-
let session_initiator_handler = Arc::new(session_initiator::Handler::new(address, Arc::clone(&routing_table)));
61+
let session_initiator_handler =
62+
Arc::new(session_initiator::Handler::new(address, Arc::clone(&routing_table), p2p.channel()));
6263
session_initiator.register_handler(session_initiator_handler)?;
6364

6465
Ok(Arc::new(Self {

network/src/session_initiator/handler.rs

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -22,14 +22,15 @@ use std::sync::Arc;
2222

2323
use ccrypto::aes::SymmetricCipherError;
2424
use cfinally::finally;
25-
use cio::{IoContext, IoError as CIoError, IoHandler, IoHandlerResult, IoManager, StreamToken, TimerToken};
25+
use cio::{IoChannel, IoContext, IoError as CIoError, IoHandler, IoHandlerResult, IoManager, StreamToken, TimerToken};
2626
use ckey::Error as KeysError;
2727
use ctypes::Secret;
2828
use mio::deprecated::EventLoop;
2929
use mio::Token;
3030
use parking_lot::Mutex;
3131
use rlp::DecoderError;
3232

33+
use super::super::p2p;
3334
use super::super::token_generator::TokenGenerator;
3435
use super::super::RoutingTable;
3536
use super::super::SocketAddr;
@@ -90,6 +91,7 @@ struct SessionInitiator {
9091

9192
routing_table: Arc<RoutingTable>,
9293
requests: Requests,
94+
channel_to_p2p: IoChannel<p2p::Message>,
9395
}
9496

9597
#[derive(Debug)]
@@ -191,12 +193,17 @@ pub enum Message {
191193
const MESSAGE_TIMEOUT_MS: u64 = 10_000;
192194

193195
impl SessionInitiator {
194-
fn bind(socket_address: &SocketAddr, routing_table: Arc<RoutingTable>) -> Result<Self> {
196+
fn bind(
197+
socket_address: &SocketAddr,
198+
routing_table: Arc<RoutingTable>,
199+
channel_to_p2p: IoChannel<p2p::Message>,
200+
) -> Result<Self> {
195201
let server = Server::bind(socket_address)?;
196202
Ok(Self {
197203
server,
198204
routing_table,
199205
requests: Requests::new(),
206+
channel_to_p2p,
200207
})
201208
}
202209

@@ -341,7 +348,10 @@ impl SessionInitiator {
341348
return Ok(())
342349
}
343350

344-
self.requests.manually_connected_address.take(from);
351+
if self.requests.manually_connected_address.take(from).is_some() {
352+
self.channel_to_p2p
353+
.send(p2p::Message::RequestConnection(from.clone(), p2p::IgnoreConnectionLimit::Ignore))?;
354+
}
345355

346356
if !self.routing_table.create_allowed_session(from, &encrypted_nonce) {
347357
cwarn!(NET, "Cannot create session to {:?}", from);
@@ -376,9 +386,14 @@ pub struct Handler {
376386
}
377387

378388
impl Handler {
379-
pub fn new(socket_address: SocketAddr, routing_table: Arc<RoutingTable>) -> Self {
380-
let session_initiator =
381-
Mutex::new(SessionInitiator::bind(&socket_address, routing_table).expect("Cannot bind UDP port"));
389+
pub fn new(
390+
socket_address: SocketAddr,
391+
routing_table: Arc<RoutingTable>,
392+
channel_to_p2p: IoChannel<p2p::Message>,
393+
) -> Self {
394+
let session_initiator = Mutex::new(
395+
SessionInitiator::bind(&socket_address, routing_table, channel_to_p2p).expect("Cannot bind UDP port"),
396+
);
382397
Self {
383398
session_initiator,
384399
}

0 commit comments

Comments
 (0)