From 26d1efe4c3ce5bbc6436c0deb8f2e83bbfb00ef9 Mon Sep 17 00:00:00 2001 From: Romain Ruetschi Date: Thu, 24 Sep 2020 20:36:59 +0200 Subject: [PATCH] Improve API of PeerListBuilder --- light-client/src/builder/supervisor.rs | 8 +++---- light-client/src/peer_list.rs | 30 ++++++++++++-------------- light-client/tests/integration.rs | 10 +++++---- light-client/tests/supervisor.rs | 4 ++-- light-node/src/commands/start.rs | 12 +++++------ 5 files changed, 31 insertions(+), 33 deletions(-) diff --git a/light-client/src/builder/supervisor.rs b/light-client/src/builder/supervisor.rs index d753dbb57..0e0c99dfc 100644 --- a/light-client/src/builder/supervisor.rs +++ b/light-client/src/builder/supervisor.rs @@ -53,8 +53,8 @@ impl SupervisorBuilder { address: net::Address, instance: Instance, ) -> SupervisorBuilder { - self.instances = self.instances.primary(peer_id, instance); - self.addresses = self.addresses.primary(peer_id, address); + self.instances.primary(peer_id, instance); + self.addresses.primary(peer_id, address); self.with_state(HasPrimary) } @@ -68,8 +68,8 @@ impl SupervisorBuilder { address: net::Address, instance: Instance, ) -> SupervisorBuilder { - self.instances = self.instances.witness(peer_id, instance); - self.addresses = self.addresses.witness(peer_id, address); + self.instances.witness(peer_id, instance); + self.addresses.witness(peer_id, address); self.with_state(Done) } diff --git a/light-client/src/peer_list.rs b/light-client/src/peer_list.rs index 7a7d66ce8..20e740ab7 100644 --- a/light-client/src/peer_list.rs +++ b/light-client/src/peer_list.rs @@ -193,33 +193,30 @@ impl Default for PeerListBuilder { impl PeerListBuilder { /// Register the given peer id and instance as the primary. /// Overrides the previous primary if it was already set. - pub fn primary(mut self, peer_id: PeerId, value: T) -> Self { + pub fn primary(&mut self, peer_id: PeerId, value: T) { self.primary = Some(peer_id); self.values.insert(peer_id, value); - self } /// Register the given peer id and value as a witness. #[pre(self.primary != Some(peer_id))] - pub fn witness(mut self, peer_id: PeerId, value: T) -> Self { + pub fn witness(&mut self, peer_id: PeerId, value: T) { self.values.insert(peer_id, value); self.witnesses.insert(peer_id); - self } /// Register the given peer id and value as a full node. #[pre(self.primary != Some(peer_id))] - pub fn full_node(mut self, peer_id: PeerId, value: T) -> Self { + pub fn full_node(&mut self, peer_id: PeerId, value: T) { self.values.insert(peer_id, value); self.full_nodes.insert(peer_id); - self } + /// Register the given peer id and value as a faulty node. #[pre(self.primary != Some(peer_id))] - pub fn faulty_node(mut self, peer_id: PeerId, value: T) -> Self { + pub fn faulty_node(&mut self, peer_id: PeerId, value: T) { self.values.insert(peer_id, value); self.faulty_nodes.insert(peer_id); - self } /// Builds the `PeerList`. @@ -266,12 +263,11 @@ mod tests { "da918eef62d986812b4e6271de78db4ec52594eb".parse().unwrap() } fn dummy_peer_list() -> PeerList { - let builder = PeerList::builder(); - builder - .primary(a(), 1_u32) - .witness(b(), 2_u32) - .full_node(c(), 3_u32) - .build() + let mut builder = PeerList::builder(); + builder.primary(a(), 1_u32); + builder.witness(b(), 2_u32); + builder.full_node(c(), 3_u32); + builder.build() } #[test] @@ -289,8 +285,10 @@ mod tests { #[test] #[should_panic(expected = "Pre-condition of build violated")] fn builder_fails_if_no_primary() { - let builder = PeerList::builder(); - let _ = builder.witness(b(), 2_u32).full_node(c(), 3_u32).build(); + let mut builder = PeerList::builder(); + builder.witness(b(), 2_u32); + builder.full_node(c(), 3_u32); + let _ = builder.build(); unreachable!(); } diff --git a/light-client/tests/integration.rs b/light-client/tests/integration.rs index 5a3b86fc9..e437934a5 100644 --- a/light-client/tests/integration.rs +++ b/light-client/tests/integration.rs @@ -93,10 +93,12 @@ fn sync() { let primary_instance = make_instance(primary, options, primary_io); let witness_instance = make_instance(witness, options, witness_io); - let peer_list = PeerList::builder() - .primary(primary, primary_instance) - .witness(witness, witness_instance) - .build(); + let peer_list = { + let mut builder = PeerList::builder(); + builder.primary(primary, primary_instance); + builder.witness(witness, witness_instance); + builder.build() + }; let supervisor = Supervisor::new(peer_list, ProdForkDetector::default(), TestEvidenceReporter); diff --git a/light-client/tests/supervisor.rs b/light-client/tests/supervisor.rs index 4190bf474..0b3f3a0e9 100644 --- a/light-client/tests/supervisor.rs +++ b/light-client/tests/supervisor.rs @@ -72,14 +72,14 @@ fn run_multipeer_test(tc: TestBisection) { let primary_instance = make_instance(primary, tc.trust_options.clone(), io.clone(), tc.now); let mut peer_list = PeerList::builder(); - peer_list = peer_list.primary(primary, primary_instance); + peer_list.primary(primary, primary_instance); for provider in tc.witnesses.into_iter() { let peer_id = provider.value.lite_blocks[0].provider; println!("Witness: {}", peer_id); let io = MockIo::new(provider.value.chain_id, provider.value.lite_blocks); let instance = make_instance(peer_id, tc.trust_options.clone(), io.clone(), tc.now); - peer_list = peer_list.witness(peer_id, instance); + peer_list.witness(peer_id, instance); } let supervisor = Supervisor::new( diff --git a/light-node/src/commands/start.rs b/light-node/src/commands/start.rs index 26c94eab6..e97ca3db2 100644 --- a/light-node/src/commands/start.rs +++ b/light-node/src/commands/start.rs @@ -161,24 +161,22 @@ impl StartCmd { fn construct_supervisor(&self) -> Result { let conf = app_config().deref().clone(); - let options: light_client::Options = conf.into(); - let timeout = app_config().rpc_config.request_timeout; + let options: light_client::Options = conf.into(); let mut peer_list: PeerListBuilder = PeerList::builder(); + for (i, light_conf) in app_config().light_clients.iter().enumerate() { let instance = self.make_instance(light_conf, options, Some(timeout))?; if i == 0 { // primary instance - peer_list = peer_list.primary(instance.light_client.peer, instance); + peer_list.primary(instance.light_client.peer, instance); } else { - peer_list = peer_list.witness(instance.light_client.peer, instance); + peer_list.witness(instance.light_client.peer, instance); } } - let peer_list = peer_list.build(); - let peer_map: HashMap<_, _> = app_config() .light_clients .iter() @@ -186,7 +184,7 @@ impl StartCmd { .collect(); Ok(Supervisor::new( - peer_list, + peer_list.build(), ProdForkDetector::default(), ProdEvidenceReporter::new(peer_map), ))