switch to tokyo rwlock
This commit is contained in:
		
							parent
							
								
									e5e4109007
								
							
						
					
					
						commit
						eceafd9de8
					
				
							
								
								
									
										151
									
								
								src/datastore.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										151
									
								
								src/datastore.rs
									
									
									
									
									
								
							| @ -2,8 +2,8 @@ use crate::persistence::{SealError, SealedFile}; | |||||||
| use serde::{Deserialize, Serialize}; | use serde::{Deserialize, Serialize}; | ||||||
| use serde_with::{serde_as, TimestampSeconds}; | use serde_with::{serde_as, TimestampSeconds}; | ||||||
| use std::collections::{HashMap, HashSet}; | use std::collections::{HashMap, HashSet}; | ||||||
| use std::sync::RwLock; |  | ||||||
| use std::time::{Duration, SystemTime, UNIX_EPOCH}; | use std::time::{Duration, SystemTime, UNIX_EPOCH}; | ||||||
|  | use tokio::sync::RwLock; | ||||||
| 
 | 
 | ||||||
| type IP = String; | type IP = String; | ||||||
| const LOCAL_INFO_FILE: &str = "/host/main/node_info"; | const LOCAL_INFO_FILE: &str = "/host/main/node_info"; | ||||||
| @ -104,153 +104,143 @@ impl State { | |||||||
|         Self { my_ip, nodes: RwLock::new(nodes), conns: RwLock::new(HashSet::new()) } |         Self { my_ip, nodes: RwLock::new(nodes), conns: RwLock::new(HashSet::new()) } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn add_conn(&self, ip: &str) { |     pub async fn add_conn(&self, ip: &str) { | ||||||
|         self.increase_mratls_conns(); |         self.increase_mratls_conns().await; | ||||||
|         self.add_mratls_conn(ip); |         self.add_mratls_conn(ip).await; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn delete_conn(&self, ip: &str) { |     pub async fn delete_conn(&self, ip: &str) { | ||||||
|         self.decrease_mratls_conns(); |         self.decrease_mratls_conns().await; | ||||||
|         self.delete_mratls_conn(ip); |         self.delete_mratls_conn(ip).await; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn add_mratls_conn(&self, ip: &str) { |     async fn add_mratls_conn(&self, ip: &str) { | ||||||
|         if let Ok(mut conns) = self.conns.write() { |         let mut conns = self.conns.write().await; | ||||||
|         conns.insert(ip.to_string()); |         conns.insert(ip.to_string()); | ||||||
|     } |     } | ||||||
|     } |  | ||||||
| 
 | 
 | ||||||
|     fn delete_mratls_conn(&self, ip: &str) { |     async fn delete_mratls_conn(&self, ip: &str) { | ||||||
|         if let Ok(mut conns) = self.conns.write() { |         let mut conns = self.conns.write().await; | ||||||
|         conns.remove(ip); |         conns.remove(ip); | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     pub async fn increase_mint_requests(&self) { | ||||||
|  |         let mut nodes = self.nodes.write().await; | ||||||
|  |         if let Some(my_info) = nodes.get(&self.my_ip) { | ||||||
|  |             let mut updated_info = my_info.clone(); | ||||||
|  |             updated_info.mint_requests += 1; | ||||||
|  |             let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn increase_mint_requests(&self) { |     pub async fn increase_mints(&self) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|         if let Some(my_info) = nodes.get_mut(&self.my_ip) { |         if let Some(my_info) = nodes.get_mut(&self.my_ip) { | ||||||
|                 *my_info = NodeInfo { mint_requests: my_info.mint_requests + 1, ..my_info.clone() }; |             let mut updated_info = my_info.clone(); | ||||||
|             } |             updated_info.mints += 1; | ||||||
|  |             let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn increase_mints(&self) { |     pub async fn increase_mratls_conns(&self) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|         if let Some(my_info) = nodes.get_mut(&self.my_ip) { |         if let Some(my_info) = nodes.get_mut(&self.my_ip) { | ||||||
|                 *my_info = NodeInfo { mints: my_info.mints + 1, ..my_info.clone() }; |             let mut updated_info = my_info.clone(); | ||||||
|             } |             updated_info.mratls_conns += 1; | ||||||
|  |             let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn increase_mratls_conns(&self) { |     pub async fn decrease_mratls_conns(&self) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|             if let Some(my_info) = nodes.get_mut(&self.my_ip) { |  | ||||||
|                 *my_info = NodeInfo { mratls_conns: my_info.mratls_conns + 1, ..my_info.clone() }; |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     pub fn decrease_mratls_conns(&self) { |  | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |  | ||||||
|         if let Some(my_info) = nodes.get_mut(&self.my_ip) { |         if let Some(my_info) = nodes.get_mut(&self.my_ip) { | ||||||
|             if my_info.mratls_conns > 0 { |             if my_info.mratls_conns > 0 { | ||||||
|                     *my_info = |                 let mut updated_info = my_info.clone(); | ||||||
|                         NodeInfo { mratls_conns: my_info.mratls_conns - 1, ..my_info.clone() }; |                 updated_info.mratls_conns -= 1; | ||||||
|                 } |                 let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn increase_disk_attacks(&self) { |     pub async fn increase_disk_attacks(&self) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|         if let Some(my_info) = nodes.get_mut(&self.my_ip) { |         if let Some(my_info) = nodes.get_mut(&self.my_ip) { | ||||||
|                 *my_info = NodeInfo { disk_attacks: my_info.disk_attacks + 1, ..my_info.clone() }; |             let mut updated_info = my_info.clone(); | ||||||
|             } |             updated_info.disk_attacks += 1; | ||||||
|  |             let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn increase_net_attacks(&self) { |     pub async fn increase_net_attacks(&self) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|         if let Some(my_info) = nodes.get_mut(&self.my_ip) { |         if let Some(my_info) = nodes.get_mut(&self.my_ip) { | ||||||
|                 *my_info = NodeInfo { net_attacks: my_info.net_attacks + 1, ..my_info.clone() }; |             let mut updated_info = my_info.clone(); | ||||||
|             } |             updated_info.net_attacks += 1; | ||||||
|  |             let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn declare_myself_public(&self) { |     pub async fn declare_myself_public(&self) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|         if let Some(my_info) = nodes.get_mut(&self.my_ip) { |         if let Some(my_info) = nodes.get_mut(&self.my_ip) { | ||||||
|                 *my_info = NodeInfo { public: true, ..my_info.clone() }; |             let mut updated_info = my_info.clone(); | ||||||
|             } |             updated_info.public = true; | ||||||
|  |             let _ = nodes.insert(self.my_ip.clone(), updated_info); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_nodes(&self) -> Vec<(String, NodeInfo)> { |     pub async fn get_nodes(&self) -> Vec<(String, NodeInfo)> { | ||||||
|         if let Ok(nodes) = self.nodes.read() { |         let nodes = self.nodes.read().await; | ||||||
|             return nodes.iter().map(|(k, v)| (k.clone(), v.clone())).collect(); |         nodes.iter().map(|(k, v)| (k.clone(), v.clone())).collect() | ||||||
|         } |  | ||||||
|         Vec::new() |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_my_ip(&self) -> String { |     pub async fn get_my_ip(&self) -> String { | ||||||
|         self.my_ip.clone() |         self.my_ip.clone() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_my_info(&self) -> NodeInfo { |     pub async fn get_my_info(&self) -> NodeInfo { | ||||||
|         if let Ok(nodes) = self.nodes.read() { |         let nodes = self.nodes.read().await; | ||||||
|             if let Some(found_info) = nodes.get(&self.my_ip) { |         nodes.get(&self.my_ip).cloned().unwrap_or(NodeInfo::new_empty()) | ||||||
|                 return found_info.clone(); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         NodeInfo::new_empty() |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_connected_ips(&self) -> Vec<String> { |     pub async fn get_connected_ips(&self) -> Vec<String> { | ||||||
|         if let Ok(conns) = self.conns.read() { |         let conns = self.conns.read().await; | ||||||
|             return conns.iter().map(|n| n.clone()).collect(); |         conns.iter().map(|n| n.clone()).collect() | ||||||
|         } |  | ||||||
|         Vec::new() |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     // returns a random node that does not have an active connection
 |     // returns a random node that does not have an active connection
 | ||||||
|     pub fn get_random_disconnected_ip(&self) -> Option<String> { |     pub async fn get_random_disconnected_ip(&self) -> Option<String> { | ||||||
|         use rand::{rngs::OsRng, RngCore}; |         use rand::{rngs::OsRng, RngCore}; | ||||||
| 
 | 
 | ||||||
|         let conn_ips = self.get_connected_ips(); |         let conn_ips = self.get_connected_ips().await; | ||||||
|         if let Ok(nodes) = self.nodes.read() { |         let nodes = self.nodes.read().await; | ||||||
|         let skip = OsRng.next_u64().try_into().unwrap_or(0) % nodes.len(); |         let skip = OsRng.next_u64().try_into().unwrap_or(0) % nodes.len(); | ||||||
|             return nodes |         nodes | ||||||
|             .keys() |             .keys() | ||||||
|             .map(|ip| ip.to_string()) |             .map(|ip| ip.to_string()) | ||||||
|             .filter(|ip| ip != &self.my_ip && !conn_ips.contains(ip)) |             .filter(|ip| ip != &self.my_ip && !conn_ips.contains(ip)) | ||||||
|             .cycle() |             .cycle() | ||||||
|                 .nth(skip); |             .nth(skip) | ||||||
|         } |  | ||||||
|         None |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /// This returns true if the update should be further forwarded
 |     /// This returns true if the update should be further forwarded
 | ||||||
|     /// For example, we never forward our own updates that came back
 |     /// For example, we never forward our own updates that came back
 | ||||||
|     pub fn process_node_update(&self, (node_ip, node_info): (String, NodeInfo)) -> bool { |     pub async fn process_node_update(&self, (node_ip, node_info): (String, NodeInfo)) -> bool { | ||||||
|         let is_update_mine = node_ip.eq(&self.my_ip); |         let is_update_mine = node_ip.eq(&self.my_ip); | ||||||
|         let mut is_update_new = false; |         let mut nodes = self.nodes.write().await; | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let is_update_new = nodes | ||||||
|             is_update_new = nodes |  | ||||||
|             .get(&node_ip) |             .get(&node_ip) | ||||||
|             .map(|curr_info| node_info.is_newer_than(&curr_info)) |             .map(|curr_info| node_info.is_newer_than(&curr_info)) | ||||||
|             .unwrap_or(true); |             .unwrap_or(true); | ||||||
|             if is_update_new { |  | ||||||
|                 let _ = nodes.insert(node_ip.clone(), node_info.clone()); |  | ||||||
|             } |  | ||||||
|         } |  | ||||||
|         if is_update_new { |         if is_update_new { | ||||||
|             println!("Inserting: {}, {}", node_ip, node_info.to_json()); |             println!("Inserting: {}, {}", node_ip, node_info.to_json()); | ||||||
|  |             let _ = nodes.insert(node_ip, node_info); | ||||||
|         } |         } | ||||||
|         is_update_new && !is_update_mine |         is_update_new && !is_update_mine | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn remove_inactive_nodes(&self, max_age: u64) { |     pub async fn remove_inactive_nodes(&self, max_age: u64) { | ||||||
|         if let Ok(mut nodes) = self.nodes.write() { |         let mut nodes = self.nodes.write().await; | ||||||
|         // TODO: Check if it is possible to corrupt SGX system time
 |         // TODO: Check if it is possible to corrupt SGX system time
 | ||||||
|         let now = SystemTime::now(); |         let now = SystemTime::now(); | ||||||
|         nodes.retain(|_, n| { |         nodes.retain(|_, n| { | ||||||
| @ -259,4 +249,3 @@ impl State { | |||||||
|         }); |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| } |  | ||||||
|  | |||||||
| @ -14,7 +14,7 @@ pub async fn grpc_new_conn( | |||||||
|     ra_cfg: RaTlsConfig, |     ra_cfg: RaTlsConfig, | ||||||
|     tx: Sender<InternalNodeUpdate>, |     tx: Sender<InternalNodeUpdate>, | ||||||
| ) { | ) { | ||||||
|     if Ipv4Addr::from_str(&node_ip).is_err() || node_ip == state.get_my_ip() { |     if Ipv4Addr::from_str(&node_ip).is_err() || node_ip == state.get_my_ip().await { | ||||||
|         println!("IPv4 address is invalid: {node_ip}"); |         println!("IPv4 address is invalid: {node_ip}"); | ||||||
|         return; |         return; | ||||||
|     } |     } | ||||||
| @ -47,11 +47,11 @@ impl ConnManager { | |||||||
| 
 | 
 | ||||||
|     async fn connect_to(&self, node_ip: String) { |     async fn connect_to(&self, node_ip: String) { | ||||||
|         let state = self.state.clone(); |         let state = self.state.clone(); | ||||||
|         state.add_conn(&node_ip); |         state.add_conn(&node_ip).await; | ||||||
|         if let Err(e) = self.connect_to_int(node_ip.clone()).await { |         if let Err(e) = self.connect_to_int(node_ip.clone()).await { | ||||||
|             println!("Client connection for {node_ip} failed: {e:?}"); |             println!("Client connection for {node_ip} failed: {e:?}"); | ||||||
|         } |         } | ||||||
|         state.delete_conn(&node_ip); |         state.delete_conn(&node_ip).await; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     async fn connect_to_int(&self, remote_ip: String) -> Result<(), Box<dyn std::error::Error>> { |     async fn connect_to_int(&self, remote_ip: String) -> Result<(), Box<dyn std::error::Error>> { | ||||||
| @ -104,20 +104,21 @@ impl ConnManager { | |||||||
|                 } |                 } | ||||||
|             }); |             }); | ||||||
| 
 | 
 | ||||||
|         let response = client.get_updates(rx_stream).await.map_err(|e| { |         let response = client.get_updates(rx_stream).await; | ||||||
|  |         if let Err(e) = response { | ||||||
|             println!("Error connecting to {remote_ip}: {e}"); |             println!("Error connecting to {remote_ip}: {e}"); | ||||||
|             if e.to_string().contains("QuoteVerifyError") { |             if e.to_string().contains("QuoteVerifyError") { | ||||||
|                 self.state.increase_net_attacks(); |                 self.state.increase_net_attacks().await; | ||||||
|             } |             } | ||||||
|             e |             return Err(e.into()); | ||||||
|         })?; |         } | ||||||
|         let mut resp_stream = response.into_inner(); |         let mut resp_stream = response.unwrap().into_inner(); | ||||||
| 
 | 
 | ||||||
|         // Immediately send our info as a network update
 |         // Immediately send our info as a network update
 | ||||||
|         let _ = self.tx.send((self.state.get_my_ip(), self.state.get_my_info()).into()); |         let _ = self.tx.send((self.state.get_my_ip().await, self.state.get_my_info().await).into()); | ||||||
|         while let Some(update) = resp_stream.message().await? { |         while let Some(update) = resp_stream.message().await? { | ||||||
|             // Update the entire network in case the information is new
 |             // Update the entire network in case the information is new
 | ||||||
|             if self.state.process_node_update(update.clone().into()) { |             if self.state.process_node_update(update.clone().into()).await { | ||||||
|                 // If process update returns true, the update must be forwarded
 |                 // If process update returns true, the update must be forwarded
 | ||||||
|                 if self.tx.send((remote_ip.clone(), update).into()).is_err() { |                 if self.tx.send((remote_ip.clone(), update).into()).is_err() { | ||||||
|                     println!("Tokio broadcast receivers had an issue consuming the channel"); |                     println!("Tokio broadcast receivers had an issue consuming the channel"); | ||||||
| @ -170,12 +171,13 @@ async fn query_keys( | |||||||
|     let uri = Uri::from_static("https://example.com"); |     let uri = Uri::from_static("https://example.com"); | ||||||
|     let mut client = UpdateClient::with_origin(client, uri); |     let mut client = UpdateClient::with_origin(client, uri); | ||||||
| 
 | 
 | ||||||
|     let response = client.get_keys(tonic::Request::new(Empty {})).await.map_err(|e| { |     let response = client.get_keys(tonic::Request::new(Empty {})).await; | ||||||
|  |     if let Err(e) = response { | ||||||
|         println!("Error getting keys from {node_ip}: {e}"); |         println!("Error getting keys from {node_ip}: {e}"); | ||||||
|         if e.to_string().contains("QuoteVerifyError") { |         if e.to_string().contains("QuoteVerifyError") { | ||||||
|             state.increase_net_attacks(); |             state.increase_net_attacks().await; | ||||||
|         } |         } | ||||||
|         e |         return Err(e.into()); | ||||||
|     })?; |     } | ||||||
|     Ok(response.into_inner()) |     Ok(response.unwrap().into_inner()) | ||||||
| } | } | ||||||
|  | |||||||
| @ -92,7 +92,7 @@ impl NodeServer { | |||||||
|                 let conn = if let Err(e) = conn { |                 let conn = if let Err(e) = conn { | ||||||
|                     println!("Error accepting TLS connection: {e}"); |                     println!("Error accepting TLS connection: {e}"); | ||||||
|                     if e.to_string().contains("HandshakeFailure") { |                     if e.to_string().contains("HandshakeFailure") { | ||||||
|                         state.increase_net_attacks(); |                         state.increase_net_attacks().await; | ||||||
|                     } |                     } | ||||||
|                     return; |                     return; | ||||||
|                 } else { |                 } else { | ||||||
| @ -131,12 +131,12 @@ struct ConnInfo { | |||||||
| 
 | 
 | ||||||
| #[tonic::async_trait] | #[tonic::async_trait] | ||||||
| impl Update for NodeServer { | impl Update for NodeServer { | ||||||
|     type GetUpdatesStream = Pin<Box<dyn Stream<Item = Result<NodeUpdate, Status>> + Send>>; |  | ||||||
| 
 |  | ||||||
|     async fn get_keys(&self, _request: Request<Empty>) -> Result<Response<Keys>, Status> { |     async fn get_keys(&self, _request: Request<Empty>) -> Result<Response<Keys>, Status> { | ||||||
|         Ok(Response::new(self.keys.clone())) |         Ok(Response::new(self.keys.clone())) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     type GetUpdatesStream = Pin<Box<dyn Stream<Item = Result<NodeUpdate, Status>> + Send>>; | ||||||
|  | 
 | ||||||
|     async fn get_updates( |     async fn get_updates( | ||||||
|         &self, |         &self, | ||||||
|         req: Request<Streaming<NodeUpdate>>, |         req: Request<Streaming<NodeUpdate>>, | ||||||
| @ -148,13 +148,13 @@ impl Update for NodeServer { | |||||||
|         let mut rx = self.tx.subscribe(); |         let mut rx = self.tx.subscribe(); | ||||||
|         let mut inbound = req.into_inner(); |         let mut inbound = req.into_inner(); | ||||||
|         let state = self.state.clone(); |         let state = self.state.clone(); | ||||||
|         let my_ip = self.state.get_my_ip(); |         let my_ip = self.state.get_my_ip().await; | ||||||
| 
 | 
 | ||||||
|         let stream = async_stream::stream! { |         let stream = async_stream::stream! { | ||||||
|             state.declare_myself_public(); |             state.declare_myself_public().await; | ||||||
|             state.add_conn(&remote_ip); |             state.add_conn(&remote_ip).await; | ||||||
| 
 | 
 | ||||||
|             let known_nodes: Vec<NodeUpdate> = state.get_nodes().into_iter().map(Into::into).collect(); |             let known_nodes: Vec<NodeUpdate> = state.get_nodes().await.into_iter().map(Into::into).collect(); | ||||||
|             for update in known_nodes { |             for update in known_nodes { | ||||||
|                 yield Ok(update); |                 yield Ok(update); | ||||||
|             } |             } | ||||||
| @ -173,7 +173,7 @@ impl Update for NodeServer { | |||||||
|                                     println!("Node {remote_ip} is forwarding the update of {}", update.ip); |                                     println!("Node {remote_ip} is forwarding the update of {}", update.ip); | ||||||
|                                 } |                                 } | ||||||
| 
 | 
 | ||||||
|                                 if state.process_node_update(update.clone().into()) { |                                 if state.process_node_update(update.clone().into()).await { | ||||||
|                                     // if process update returns true, the update must be forwarded
 |                                     // if process update returns true, the update must be forwarded
 | ||||||
|                                     if tx.send((remote_ip.clone(), update).into()).is_err() { |                                     if tx.send((remote_ip.clone(), update).into()).is_err() { | ||||||
|                                         println!("Tokio broadcast receivers had an issue consuming the channel"); |                                         println!("Tokio broadcast receivers had an issue consuming the channel"); | ||||||
| @ -199,7 +199,7 @@ impl Update for NodeServer { | |||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|             state.delete_conn(&remote_ip); |             state.delete_conn(&remote_ip).await; | ||||||
|             yield Err(error_status); |             yield Err(error_status); | ||||||
|         }; |         }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -47,9 +47,10 @@ impl From<(String, datastore::NodeInfo)> for NodesResp { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[get("/nodes")] | #[get("/nodes")] | ||||||
| async fn get_nodes(ds: web::Data<Arc<State>>) -> HttpResponse { | async fn get_nodes(state: web::Data<Arc<State>>) -> HttpResponse { | ||||||
|  |     let nodes = state.get_nodes().await; | ||||||
|     HttpResponse::Ok() |     HttpResponse::Ok() | ||||||
|         .json(ds.get_nodes().into_iter().map(Into::<NodesResp>::into).collect::<Vec<NodesResp>>()) |         .json(nodes.into_iter().map(Into::<NodesResp>::into).collect::<Vec<NodesResp>>()) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Deserialize)] | #[derive(Deserialize)] | ||||||
| @ -64,13 +65,13 @@ async fn mint( | |||||||
|     req: web::Json<MintReq>, |     req: web::Json<MintReq>, | ||||||
| ) -> impl Responder { | ) -> impl Responder { | ||||||
|     let recipient = req.into_inner().wallet; |     let recipient = req.into_inner().wallet; | ||||||
|     state.increase_mint_requests(); |     state.increase_mint_requests().await; | ||||||
|     let result = |     let result = | ||||||
|         web::block(move || sol_client.mint(&recipient).map_err(|e| e.to_string())).await.unwrap(); // TODO: check if this can get a BlockingError
 |         web::block(move || sol_client.mint(&recipient).map_err(|e| e.to_string())).await.unwrap(); // TODO: check if this can get a BlockingError
 | ||||||
| 
 | 
 | ||||||
|     match result { |     match result { | ||||||
|         Ok(s) => { |         Ok(s) => { | ||||||
|             state.increase_mints(); |             state.increase_mints().await; | ||||||
|             HttpResponse::Ok().body(format!(r#"{{" signature": "{s} "}}"#)) |             HttpResponse::Ok().body(format!(r#"{{" signature": "{s} "}}"#)) | ||||||
|         } |         } | ||||||
|         Err(e) => HttpResponse::InternalServerError().body(format!(r#"{{ "error": "{e}" }}"#)), |         Err(e) => HttpResponse::InternalServerError().body(format!(r#"{{ "error": "{e}" }}"#)), | ||||||
| @ -78,9 +79,9 @@ async fn mint( | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[get("/metrics")] | #[get("/metrics")] | ||||||
| async fn metrics(ds: web::Data<Arc<State>>) -> HttpResponse { | async fn metrics(state: web::Data<Arc<State>>) -> HttpResponse { | ||||||
|     let mut metrics = String::new(); |     let mut metrics = String::new(); | ||||||
|     for (ip, node) in ds.get_nodes() { |     for (ip, node) in state.get_nodes().await { | ||||||
|         metrics.push_str(node.to_metrics(&ip).as_str()); |         metrics.push_str(node.to_metrics(&ip).as_str()); | ||||||
|     } |     } | ||||||
|     HttpResponse::Ok().content_type("text/plain; version=0.0.4; charset=utf-8").body(metrics) |     HttpResponse::Ok().content_type("text/plain; version=0.0.4; charset=utf-8").body(metrics) | ||||||
|  | |||||||
							
								
								
									
										10
									
								
								src/main.rs
									
									
									
									
									
								
							
							
								
								
								
								
								
									
									
								
							
						
						
									
										10
									
								
								src/main.rs
									
									
									
									
									
								
							| @ -51,12 +51,12 @@ pub async fn heartbeat( | |||||||
|     loop { |     loop { | ||||||
|         interval.tick().await; |         interval.tick().await; | ||||||
|         println!("Heartbeat..."); |         println!("Heartbeat..."); | ||||||
|         state.remove_inactive_nodes(HEARTBEAT_INTERVAL * 3); |         state.remove_inactive_nodes(HEARTBEAT_INTERVAL * 3).await; | ||||||
|         let connected_ips = state.get_connected_ips(); |         let connected_ips = state.get_connected_ips().await; | ||||||
|         println!("Connected nodes ({}): {:?}", connected_ips.len(), connected_ips); |         println!("Connected nodes ({}): {:?}", connected_ips.len(), connected_ips); | ||||||
|         let _ = tx.send((state.get_my_ip(), state.get_my_info()).into()); |         let _ = tx.send((state.get_my_ip().await, state.get_my_info().await).into()); | ||||||
|         if connected_ips.len() < NUM_CONNECTIONS { |         if connected_ips.len() < NUM_CONNECTIONS { | ||||||
|             if let Some(node_ip) = state.get_random_disconnected_ip() { |             if let Some(node_ip) = state.get_random_disconnected_ip().await { | ||||||
|                 println!("Dialing random node {}", node_ip); |                 println!("Dialing random node {}", node_ip); | ||||||
|                 tasks.spawn(grpc_new_conn(node_ip, state.clone(), ra_cfg.clone(), tx.clone())); |                 tasks.spawn(grpc_new_conn(node_ip, state.clone(), ra_cfg.clone(), tx.clone())); | ||||||
|             } |             } | ||||||
| @ -77,7 +77,7 @@ async fn init_token(state: Arc<State>, ra_cfg: RaTlsConfig) -> SolClient { | |||||||
|         } |         } | ||||||
|         Err(SealError::Attack(e)) => { |         Err(SealError::Attack(e)) => { | ||||||
|             println!("The sealed keys are corrupted: {}", e); |             println!("The sealed keys are corrupted: {}", e); | ||||||
|             state.increase_disk_attacks(); |             state.increase_disk_attacks().await; | ||||||
|         } |         } | ||||||
|         Err(e) => { |         Err(e) => { | ||||||
|             println!("Could not read sealed keys: {e}"); |             println!("Could not read sealed keys: {e}"); | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user