Honor --max-peers if --min-peers is not specified (#8087)
* Change interpretation min and max peers * Only min specified -> Set min to that value and max to default * Only max specified -> Set min and max to that value * Both specified -> Set min the smallest value and max to the largest value * simplify logic, new ParseError & add tests * simplify code according to the review comments * address review comments * more fine-grained tests
This commit is contained in:
		
							parent
							
								
									dcaff6f4c8
								
							
						
					
					
						commit
						0a535bf485
					
				| @ -409,11 +409,11 @@ usage! { | ||||
| 			"--port=[PORT]", | ||||
| 			"Override the port on which the node should listen.", | ||||
| 
 | ||||
| 			ARG arg_min_peers: (u16) = 25u16, or |c: &Config| c.network.as_ref()?.min_peers.clone(), | ||||
| 			ARG arg_min_peers: (Option<u16>) = None, or |c: &Config| c.network.as_ref()?.min_peers.clone(), | ||||
| 			"--min-peers=[NUM]", | ||||
| 			"Try to maintain at least NUM peers.", | ||||
| 
 | ||||
| 			ARG arg_max_peers: (u16) = 50u16, or |c: &Config| c.network.as_ref()?.max_peers.clone(), | ||||
| 			ARG arg_max_peers: (Option<u16>) = None, or |c: &Config| c.network.as_ref()?.max_peers.clone(), | ||||
| 			"--max-peers=[NUM]", | ||||
| 			"Allow up to NUM peers.", | ||||
| 
 | ||||
| @ -1504,8 +1504,8 @@ mod tests { | ||||
| 			// -- Networking Options
 | ||||
| 			flag_no_warp: false, | ||||
| 			arg_port: 30303u16, | ||||
| 			arg_min_peers: 25u16, | ||||
| 			arg_max_peers: 50u16, | ||||
| 			arg_min_peers: Some(25u16), | ||||
| 			arg_max_peers: Some(50u16), | ||||
| 			arg_max_pending_peers: 64u16, | ||||
| 			arg_snapshot_peers: 0u16, | ||||
| 			arg_allow_ips: "all".into(), | ||||
| @ -1896,4 +1896,18 @@ mod tests { | ||||
| 			stratum: None, | ||||
| 		}); | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn should_not_accept_min_peers_bigger_than_max_peers() { | ||||
| 		match Args::parse(&["parity", "--max-peers=39", "--min-peers=40"]) { | ||||
| 			Err(ArgsError::PeerConfiguration) => (), | ||||
| 			_ => assert_eq!(false, true), | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn should_accept_max_peers_equal_or_bigger_than_min_peers() { | ||||
| 		Args::parse(&["parity", "--max-peers=40", "--min-peers=40"]).unwrap(); | ||||
| 		Args::parse(&["parity", "--max-peers=100", "--min-peers=40"]).unwrap(); | ||||
| 	} | ||||
| } | ||||
|  | ||||
| @ -161,6 +161,7 @@ macro_rules! usage { | ||||
| 			Clap(ClapError), | ||||
| 			Decode(toml::de::Error), | ||||
| 			Config(String, io::Error), | ||||
| 			PeerConfiguration, | ||||
| 		} | ||||
| 
 | ||||
| 		impl ArgsError { | ||||
| @ -177,6 +178,10 @@ macro_rules! usage { | ||||
| 						println_stderr!("{}", e); | ||||
| 						process::exit(2) | ||||
| 					}, | ||||
| 					ArgsError::PeerConfiguration => { | ||||
| 						println_stderr!("You have supplied `min_peers` > `max_peers`"); | ||||
| 						process::exit(2) | ||||
| 					} | ||||
| 				} | ||||
| 			} | ||||
| 		} | ||||
| @ -312,6 +317,13 @@ macro_rules! usage { | ||||
| 			pub fn parse<S: AsRef<str>>(command: &[S]) -> Result<Self, ArgsError> { | ||||
| 				let raw_args = RawArgs::parse(command)?; | ||||
| 
 | ||||
| 				if let (Some(max_peers), Some(min_peers)) = (raw_args.arg_max_peers, raw_args.arg_min_peers) { | ||||
| 					// Invalid configuration pattern `mix_peers` > `max_peers`
 | ||||
| 					if min_peers > max_peers { | ||||
| 						return Err(ArgsError::PeerConfiguration); | ||||
| 					} | ||||
| 				} | ||||
| 
 | ||||
| 				// Skip loading config file if no_config flag is specified
 | ||||
| 				if raw_args.flag_no_config { | ||||
| 					return Ok(raw_args.into_args(Config::default())); | ||||
|  | ||||
| @ -14,12 +14,12 @@ | ||||
| // You should have received a copy of the GNU General Public License
 | ||||
| // along with Parity.  If not, see <http://www.gnu.org/licenses/>.
 | ||||
| 
 | ||||
| use std::cmp::{max, min}; | ||||
| use std::time::Duration; | ||||
| use std::io::Read; | ||||
| use std::net::SocketAddr; | ||||
| use std::path::{Path, PathBuf}; | ||||
| use std::collections::BTreeMap; | ||||
| use std::cmp::max; | ||||
| use std::str::FromStr; | ||||
| use cli::{Args, ArgsError}; | ||||
| use hash::keccak; | ||||
| @ -55,6 +55,9 @@ use account::{AccountCmd, NewAccount, ListAccounts, ImportAccounts, ImportFromGe | ||||
| use snapshot::{self, SnapshotCommand}; | ||||
| use network::{IpFilter}; | ||||
| 
 | ||||
| const DEFAULT_MAX_PEERS: u16 = 50; | ||||
| const DEFAULT_MIN_PEERS: u16 = 25; | ||||
| 
 | ||||
| #[derive(Debug, PartialEq)] | ||||
| pub enum Cmd { | ||||
| 	Run(RunCmd), | ||||
| @ -469,8 +472,9 @@ impl Configuration { | ||||
| 	} | ||||
| 
 | ||||
| 	fn max_peers(&self) -> u32 { | ||||
| 		let peers = self.args.arg_max_peers as u32; | ||||
| 		max(self.min_peers(), peers) | ||||
| 		self.args.arg_max_peers | ||||
| 			.or(max(self.args.arg_min_peers, Some(DEFAULT_MAX_PEERS))) | ||||
| 			.unwrap_or(DEFAULT_MAX_PEERS) as u32 | ||||
| 	} | ||||
| 
 | ||||
| 	fn ip_filter(&self) -> Result<IpFilter, String> { | ||||
| @ -481,7 +485,9 @@ impl Configuration { | ||||
| 	} | ||||
| 
 | ||||
| 	fn min_peers(&self) -> u32 { | ||||
| 		self.args.arg_peers.unwrap_or(self.args.arg_min_peers) as u32 | ||||
| 		self.args.arg_min_peers | ||||
| 			.or(min(self.args.arg_max_peers, Some(DEFAULT_MIN_PEERS))) | ||||
| 			.unwrap_or(DEFAULT_MIN_PEERS) as u32 | ||||
| 	} | ||||
| 
 | ||||
| 	fn max_pending_peers(&self) -> u32 { | ||||
| @ -1970,4 +1976,56 @@ mod tests { | ||||
| 		assert_eq!(std.directories().cache, dir::helpers::replace_home_and_local(&base_path, &local_path, ::dir::CACHE_PATH)); | ||||
| 		assert_eq!(base.directories().cache, "/test/cache"); | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn should_respect_only_max_peers_and_default() { | ||||
| 		let args = vec!["parity", "--max-peers=50"]; | ||||
| 		let conf = Configuration::parse(&args, None).unwrap(); | ||||
| 		match conf.into_command().unwrap().cmd { | ||||
| 			Cmd::Run(c) => { | ||||
| 				assert_eq!(c.net_conf.min_peers, 25); | ||||
| 				assert_eq!(c.net_conf.max_peers, 50); | ||||
| 			}, | ||||
| 			_ => panic!("Should be Cmd::Run"), | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn should_respect_only_max_peers_less_than_default() { | ||||
| 		let args = vec!["parity", "--max-peers=5"]; | ||||
| 		let conf = Configuration::parse(&args, None).unwrap(); | ||||
| 		match conf.into_command().unwrap().cmd { | ||||
| 			Cmd::Run(c) => { | ||||
| 				assert_eq!(c.net_conf.min_peers, 5); | ||||
| 				assert_eq!(c.net_conf.max_peers, 5); | ||||
| 			}, | ||||
| 			_ => panic!("Should be Cmd::Run"), | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn should_respect_only_min_peers_and_default() { | ||||
| 		let args = vec!["parity", "--min-peers=5"]; | ||||
| 		let conf = Configuration::parse(&args, None).unwrap(); | ||||
| 		match conf.into_command().unwrap().cmd { | ||||
| 			Cmd::Run(c) => { | ||||
| 				assert_eq!(c.net_conf.min_peers, 5); | ||||
| 				assert_eq!(c.net_conf.max_peers, 50); | ||||
| 			}, | ||||
| 			_ => panic!("Should be Cmd::Run"), | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	#[test] | ||||
| 	fn should_respect_only_min_peers_and_greater_than_default() { | ||||
| 		let args = vec!["parity", "--min-peers=500"]; | ||||
| 		let conf = Configuration::parse(&args, None).unwrap(); | ||||
| 		match conf.into_command().unwrap().cmd { | ||||
| 			Cmd::Run(c) => { | ||||
| 				assert_eq!(c.net_conf.min_peers, 500); | ||||
| 				assert_eq!(c.net_conf.max_peers, 500); | ||||
| 			}, | ||||
| 			_ => panic!("Should be Cmd::Run"), | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user