From 067e240ff44348192971c0a7a331cfb6f156d31f Mon Sep 17 00:00:00 2001 From: _ <_@_> Date: Sun, 1 Nov 2020 18:13:12 -0600 Subject: [PATCH] :construction: I'm gonna try to fix the rendezvous problem --- src/lib.rs | 4 ++-- src/relay/mod.rs | 52 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 2 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index a11e1f8..8b05ca2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -45,8 +45,6 @@ mod tests { let server_name_2 = server_name.into (); spawn (async move { - tokio::time::delay_for (std::time::Duration::from_secs (5)).await; - let opt = server::Opt { relay_url: relay_url_2, server_name: server_name_2, @@ -56,6 +54,8 @@ mod tests { server::main (opt).await.unwrap (); }); + tokio::time::delay_for (std::time::Duration::from_secs (1)).await; + let client = Client::new (); let resp = client.get (&format! ("{}/relay_up_check", relay_url)) diff --git a/src/relay/mod.rs b/src/relay/mod.rs index ceb563e..1de526b 100644 --- a/src/relay/mod.rs +++ b/src/relay/mod.rs @@ -36,7 +36,14 @@ use watcher::*; struct ServerState { handlebars: Arc >, + // Holds clients that are waiting for a response to come + // back from a server. + client_watchers: Arc >>, + + // Holds servers that are waiting for a request to come in + // from a client. + server_watchers: Arc >>, } @@ -284,3 +291,48 @@ pub async fn main () -> Result <(), Box > { Ok (()) } + +#[cfg (test)] +mod tests { + // Toy model of a relay for a single server + // with one consumer thread. + // To scale this up, we can just put a bunch into a + // concurrent hash map inside of mutexes or something + + struct RelayStateMachine { + + } + + enum RequestStateMachine { + WaitForServerAccept, // Client has connected + WaitForServerResponse, // Server has accepted request + } + + /* + + Here's what we need to handle: + + When a request comes in: + + - Look up the server + - If the server is parked, unpark it + - Park the client + + When a server comes to listen: + + - Look up the server + - Either return all pending requests, or park the server + + When a server comes to respond: + + - Look up the parked client + - Begin a stream, unparking the client + + So we need these lookups to be fast: + + - Server IDs, where 0 or 1 servers and 0 or many clients + can be parked + - Request IDs, where 1 client is parked + + */ +}