improved logic for online/offline status
This commit is contained in:
		
							parent
							
								
									438c34de3a
								
							
						
					
					
						commit
						d47f71c941
					
				| @ -182,6 +182,7 @@ impl Store { | |||||||
|         let mut nodes = self.nodes.lock().await; |         let mut nodes = self.nodes.lock().await; | ||||||
|         match nodes.insert(ip, info.clone()) { |         match nodes.insert(ip, info.clone()) { | ||||||
|             Some(old_info) => match old_info.pubkey.ne(&info.pubkey) { |             Some(old_info) => match old_info.pubkey.ne(&info.pubkey) { | ||||||
|  |                 // TODO: save old private key to disk using SGX Sealing
 | ||||||
|                 true => Some(old_info.pubkey), |                 true => Some(old_info.pubkey), | ||||||
|                 false => None, |                 false => None, | ||||||
|             }, |             }, | ||||||
| @ -199,20 +200,32 @@ impl Store { | |||||||
|         nodes.get(ip).cloned() |         nodes.get(ip).cloned() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub async fn cycle_self_key(&self) { |     /// freshes the keys of the node and returns a protobuf for the network
 | ||||||
|  |     pub async fn reset_localhost_keys(&self) -> NodeUpdate { | ||||||
|         let mut csprng = OsRng; |         let mut csprng = OsRng; | ||||||
|         // TODO: save old private key to disk using SGX Sealing
 |         let keypair_raw = ed25519_dalek::SigningKey::generate(&mut csprng); | ||||||
|         let privkey = ed25519_dalek::SigningKey::generate(&mut csprng); |         let keypair = hex::encode(keypair_raw.as_bytes()); | ||||||
|  |         let pubkey = keypair_raw.verifying_key(); | ||||||
|  |         let ip = "localhost".to_string(); | ||||||
|  |         let updated_at = std::time::SystemTime::now(); | ||||||
|  |         let online = false; | ||||||
|         self.update_node( |         self.update_node( | ||||||
|             "localhost".to_string(), |             ip.clone(), | ||||||
|             NodeInfo { |             NodeInfo { | ||||||
|                 pubkey: privkey.verifying_key(), |                 pubkey, | ||||||
|                 updated_at: std::time::SystemTime::now(), |                 updated_at, | ||||||
|                 online: true, |                 online, | ||||||
|             }, |             }, | ||||||
|         ) |         ) | ||||||
|         .await; |         .await; | ||||||
|         self.add_key(privkey.verifying_key(), privkey).await; |         self.add_key(pubkey, keypair_raw.clone()).await; | ||||||
|  |         let updated_at = Some(prost_types::Timestamp::from(updated_at)); | ||||||
|  |         NodeUpdate { | ||||||
|  |             ip, | ||||||
|  |             keypair, | ||||||
|  |             updated_at, | ||||||
|  |             online, | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub async fn get_full_node_list(&self) -> Vec<NodeUpdate> { |     pub async fn get_full_node_list(&self) -> Vec<NodeUpdate> { | ||||||
| @ -253,4 +266,11 @@ impl Store { | |||||||
|         } |         } | ||||||
|         random_nodes |         random_nodes | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     pub async fn set_online(&self, ip: &str, online: bool) { | ||||||
|  |         let mut nodes = self.nodes.lock().await; | ||||||
|  |         if let Some(node) = nodes.get_mut(ip) { | ||||||
|  |             node.online = online; | ||||||
|  |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
|  | |||||||
| @ -35,20 +35,30 @@ impl ConnManager { | |||||||
|         let response = client.get_updates(rx_stream).await.unwrap(); |         let response = client.get_updates(rx_stream).await.unwrap(); | ||||||
|         let mut resp_stream = response.into_inner(); |         let mut resp_stream = response.into_inner(); | ||||||
| 
 | 
 | ||||||
|         while let Some(update) = resp_stream.message().await.unwrap() { |         while let Some(mut update) = resp_stream.message().await.unwrap() { | ||||||
|  | 
 | ||||||
|  |             // "localhost" IPs need to be changed to the real IP of the counterpart
 | ||||||
|  |             if update.ip == "localhost" { | ||||||
|  |                 update.ip = node_ip.clone(); | ||||||
|  |                 // since we are connecting TO this server, we have a guarantee that this
 | ||||||
|  |                 // server is not behind NAT, so we can set it online
 | ||||||
|  |                 update.online = true; | ||||||
|  |             } | ||||||
|  | 
 | ||||||
|  |             // update the entire network in case the information is new
 | ||||||
|             if self.ds.process_grpc_update(update.clone()).await { |             if self.ds.process_grpc_update(update.clone()).await { | ||||||
|                 if let Err(_) = self.tx.send(update.clone()) { |                 if let Err(_) = self.tx.send(update.clone()) { | ||||||
|                     println!("tokio broadcast receivers had an issue consuming the channel"); |                     println!("tokio broadcast receivers had an issue consuming the channel"); | ||||||
|                 } |                 } | ||||||
|             }; |             }; | ||||||
|         } |         } | ||||||
| 
 |  | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn init_connections(ds: Arc<Store>, tx: Sender<NodeUpdate>) -> JoinHandle<()> { | fn init_connections(ds: Arc<Store>, tx: Sender<NodeUpdate>) -> JoinHandle<()> { | ||||||
|     std::thread::spawn(move || { |     std::thread::spawn(move || { | ||||||
|         tokio::runtime::Runtime::new().unwrap().block_on(async { |         tokio::runtime::Runtime::new().unwrap().block_on(async { | ||||||
|  |             // we rotate online and offline nodes, to constantly check new nodes
 | ||||||
|             let mut only_online_nodes = true; |             let mut only_online_nodes = true; | ||||||
|             loop { |             loop { | ||||||
|                 let mut set = JoinSet::new(); |                 let mut set = JoinSet::new(); | ||||||
|  | |||||||
| @ -57,21 +57,26 @@ impl Update for MyServer { | |||||||
|                 yield Ok(update); |                 yield Ok(update); | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             if tx.receiver_count() > 10 { |  | ||||||
|                 yield Err(Status::internal("Already have too many clients. Connect to another server.")); |  | ||||||
|                 return; |  | ||||||
|             } |  | ||||||
| 
 |  | ||||||
|             loop { |             loop { | ||||||
|                 tokio::select! { |                 tokio::select! { | ||||||
|                     Some(msg) = inbound.next() => { |                     Some(msg) = inbound.next() => { | ||||||
|                         match msg { |                         match msg { | ||||||
|                             Ok(update) => { |                             Ok(mut update) => { | ||||||
|  |                                 if update.ip == "localhost" { | ||||||
|  |                                     update.ip = remote_ip.clone(); | ||||||
|  |                                     // note that we don't set this node online,
 | ||||||
|  |                                     // as it can be behind NAT
 | ||||||
|  |                                 } | ||||||
|                                 if ds.process_grpc_update(update.clone()).await { |                                 if ds.process_grpc_update(update.clone()).await { | ||||||
|                                     if let Err(_) = tx.send(update.clone()) { |                                     if let Err(_) = tx.send(update.clone()) { | ||||||
|                                         println!("tokio broadcast receivers had an issue consuming the channel"); |                                         println!("tokio broadcast receivers had an issue consuming the channel"); | ||||||
|                                     } |                                     } | ||||||
|                                 }; |                                 }; | ||||||
|  |                                 // disconnect client if too many connections are active
 | ||||||
|  |                                 if tx.receiver_count() > 9 { | ||||||
|  |                                     yield Err(Status::internal("Already have too many clients. Connect to another server.")); | ||||||
|  |                                     return; | ||||||
|  |                                 } | ||||||
|                             } |                             } | ||||||
|                             Err(e) => { |                             Err(e) => { | ||||||
|                                 yield Err(Status::internal(format!("Error receiving client stream: {}", e))); |                                 yield Err(Status::internal(format!("Error receiving client stream: {}", e))); | ||||||
| @ -80,10 +85,8 @@ impl Update for MyServer { | |||||||
|                         } |                         } | ||||||
|                     } |                     } | ||||||
|                     Ok(update) = rx.recv() => { |                     Ok(update) = rx.recv() => { | ||||||
|                         if update.ip != remote_ip { |  | ||||||
|                         yield Ok(update); |                         yield Ok(update); | ||||||
|                     } |                     } | ||||||
|                     } |  | ||||||
| 
 | 
 | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user