Browse Source

map: send ping, receive pong, then run get_info. error if pong reply times out

lunar-mining 4 years ago
parent
commit
556e8deba3
1 changed files with 68 additions and 63 deletions
  1. 68 63
      bin/map/src/main.rs

+ 68 - 63
bin/map/src/main.rs

@@ -10,16 +10,17 @@ use darkfi::{
 
 
 use async_std::sync::Arc;
 use async_std::sync::Arc;
 use easy_parallel::Parallel;
 use easy_parallel::Parallel;
-use log::{debug, info, trace};
+use log::{debug, info};
 use serde_json::{json, Value};
 use serde_json::{json, Value};
 use simplelog::*;
 use simplelog::*;
-use smol::Executor;
+use smol::{Executor, Timer};
 use std::{
 use std::{
     collections::{HashMap, HashSet},
     collections::{HashMap, HashSet},
     fs::File,
     fs::File,
     io,
     io,
     io::Read,
     io::Read,
     path::PathBuf,
     path::PathBuf,
+    time::Duration,
 };
 };
 use termion::{async_stdin, event::Key, input::TermRead, raw::IntoRawMode};
 use termion::{async_stdin, event::Key, input::TermRead, raw::IntoRawMode};
 use tui::{
 use tui::{
@@ -150,71 +151,75 @@ async fn run_rpc(config: &MapConfig, ex: Arc<Executor<'_>>, model: Arc<Model>) -
 
 
 async fn poll(client: Map, model: Arc<Model>) -> Result<()> {
 async fn poll(client: Map, model: Arc<Model>) -> Result<()> {
     debug!("Attemping to poll: {}", client.url);
     debug!("Attemping to poll: {}", client.url);
-    let mut index = 0;
-    loop {
-        let reply = client.ping().await?;
-
-        let reply = client.get_info().await?;
-
-        if reply.as_object().is_some() && !reply.as_object().unwrap().is_empty() {
-            let id = reply.as_object().unwrap().get("id").unwrap();
-
-            let connections = reply.as_object().unwrap().get("connections").unwrap();
-            let outgoing = connections.get("outgoing").unwrap();
-            let incoming = connections.get("incoming").unwrap();
-
-            let mut outconnects = Vec::new();
-            let mut inconnects = Vec::new();
+    let reply = client.ping().await?;
+    if reply.as_str().is_some() {
+        let mut index = 0;
+        loop {
+            debug!("Connected to: {}", client.url);
+            let reply = client.get_info().await?;
+
+            if reply.as_object().is_some() && !reply.as_object().unwrap().is_empty() {
+                let id = reply.as_object().unwrap().get("id").unwrap();
+
+                let connections = reply.as_object().unwrap().get("connections").unwrap();
+                let outgoing = connections.get("outgoing").unwrap();
+                let incoming = connections.get("incoming").unwrap();
+
+                let mut outconnects = Vec::new();
+                let mut inconnects = Vec::new();
+
+                // here we are simulating new messages by scrolling through a vector
+                let msgs = outgoing[1].get("message").unwrap();
+                if index == 0 {
+                    index += 1;
+                } else if index >= 5 {
+                    index = 0
+                } else {
+                    index = index + 1;
+                }
 
 
-            // here we are simulating new messages by scrolling through a vector
-            let msgs = outgoing[1].get("message").unwrap();
-            if index == 0 {
-                index += 1;
-            } else if index >= 5 {
-                index = 0
+                let out0 = Connection::new(
+                    outgoing[0].get("id").unwrap().as_str().unwrap().to_string(),
+                    msgs[index].as_str().unwrap().to_string(),
+                );
+                let out1 = Connection::new(
+                    outgoing[1].get("id").unwrap().as_str().unwrap().to_string(),
+                    msgs[index].as_str().unwrap().to_string(),
+                );
+
+                let in0 = Connection::new(
+                    incoming[0].get("id").unwrap().as_str().unwrap().to_string(),
+                    msgs[index].as_str().unwrap().to_string(),
+                );
+                let in1 = Connection::new(
+                    incoming[1].get("id").unwrap().as_str().unwrap().to_string(),
+                    msgs[index].as_str().unwrap().to_string(),
+                );
+
+                outconnects.push(out0);
+                outconnects.push(out1);
+
+                inconnects.push(in0);
+                inconnects.push(in1);
+
+                let infos = NodeInfo { outgoing: outconnects, incoming: inconnects };
+
+                let mut node_info = HashMap::new();
+                node_info.insert(id.as_str().unwrap().to_string(), infos);
+
+                for (id, value) in node_info.clone() {
+                    model.id_list.node_id.lock().await.insert(id.clone());
+                    model.info_list.infos.lock().await.insert(id, value);
+                }
             } else {
             } else {
-                index = index + 1;
-            }
-
-            let out0 = Connection::new(
-                outgoing[0].get("id").unwrap().as_str().unwrap().to_string(),
-                msgs[index].as_str().unwrap().to_string(),
-            );
-            let out1 = Connection::new(
-                outgoing[1].get("id").unwrap().as_str().unwrap().to_string(),
-                msgs[index].as_str().unwrap().to_string(),
-            );
-
-            let in0 = Connection::new(
-                incoming[0].get("id").unwrap().as_str().unwrap().to_string(),
-                msgs[index].as_str().unwrap().to_string(),
-            );
-            let in1 = Connection::new(
-                incoming[1].get("id").unwrap().as_str().unwrap().to_string(),
-                msgs[index].as_str().unwrap().to_string(),
-            );
-
-            outconnects.push(out0);
-            outconnects.push(out1);
-
-            inconnects.push(in0);
-            inconnects.push(in1);
-
-            let infos = NodeInfo { outgoing: outconnects, incoming: inconnects };
-
-            let mut node_info = HashMap::new();
-            node_info.insert(id.as_str().unwrap().to_string(), infos);
-
-            for (id, value) in node_info.clone() {
-                model.id_list.node_id.lock().await.insert(id.clone());
-                model.info_list.infos.lock().await.insert(id, value);
+                // TODO: error handling
+                debug!("Reply is empty");
             }
             }
-        } else {
-            // TODO: error handling
-            debug!("Reply is empty");
+            async_util::sleep(2).await;
         }
         }
-
-        async_util::sleep(2).await;
+    } else {
+        Timer::after(Duration::from_secs(10)).await;
+        Err(Error::ConnectTimeout)
     }
     }
 }
 }