From d0fd059f985bbfe18ba796719b4851326caf60f8 Mon Sep 17 00:00:00 2001 From: Bastian Gruber Date: Mon, 15 May 2023 15:42:26 +0200 Subject: [PATCH] 3b-multi-node-broadcast: CHECK --- 03b-multi-node-broadcast/src/main.rs | 175 -------- {01-echo => 1-echo}/.gitignore | 0 {01-echo => 1-echo}/Cargo.lock | 0 {01-echo => 1-echo}/Cargo.toml | 0 {01-echo => 1-echo}/src/main.rs | 0 {02-unique-id => 2-unique-id}/.gitignore | 0 {02-unique-id => 2-unique-id}/Cargo.lock | 0 {02-unique-id => 2-unique-id}/Cargo.toml | 0 {02-unique-id => 2-unique-id}/src/main.rs | 0 .../.gitignore | 0 .../Cargo.lock | 383 ++++++++++++++++- .../Cargo.toml | 2 + .../src/connection.rs | 3 + .../src/main.rs | 1 + .../src/message.rs | 0 .../src/node.rs | 0 .../src/storage.rs | 0 .../.gitignore | 0 .../Cargo.lock | 405 +++++++++++++++--- .../Cargo.toml | 3 +- 3b-multi-node-broadcast/log4rs.yaml | 16 + 3b-multi-node-broadcast/src/main.rs | 180 ++++++++ .../src/message.rs | 0 .../src/node.rs | 0 .../src/storage.rs | 4 +- 25 files changed, 923 insertions(+), 249 deletions(-) delete mode 100644 03b-multi-node-broadcast/src/main.rs rename {01-echo => 1-echo}/.gitignore (100%) rename {01-echo => 1-echo}/Cargo.lock (100%) rename {01-echo => 1-echo}/Cargo.toml (100%) rename {01-echo => 1-echo}/src/main.rs (100%) rename {02-unique-id => 2-unique-id}/.gitignore (100%) rename {02-unique-id => 2-unique-id}/Cargo.lock (100%) rename {02-unique-id => 2-unique-id}/Cargo.toml (100%) rename {02-unique-id => 2-unique-id}/src/main.rs (100%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/.gitignore (100%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/Cargo.lock (55%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/Cargo.toml (92%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/src/connection.rs (91%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/src/main.rs (97%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/src/message.rs (100%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/src/node.rs (100%) rename {03a-single-node-broadcast => 3a-single-node-broadcast}/src/storage.rs (100%) rename {03b-multi-node-broadcast => 3b-multi-node-broadcast}/.gitignore (100%) rename {03b-multi-node-broadcast => 3b-multi-node-broadcast}/Cargo.lock (54%) rename {03b-multi-node-broadcast => 3b-multi-node-broadcast}/Cargo.toml (85%) create mode 100644 3b-multi-node-broadcast/log4rs.yaml create mode 100644 3b-multi-node-broadcast/src/main.rs rename {03b-multi-node-broadcast => 3b-multi-node-broadcast}/src/message.rs (100%) rename {03b-multi-node-broadcast => 3b-multi-node-broadcast}/src/node.rs (100%) rename {03b-multi-node-broadcast => 3b-multi-node-broadcast}/src/storage.rs (94%) diff --git a/03b-multi-node-broadcast/src/main.rs b/03b-multi-node-broadcast/src/main.rs deleted file mode 100644 index 92605b3..0000000 --- a/03b-multi-node-broadcast/src/main.rs +++ /dev/null @@ -1,175 +0,0 @@ -mod message; -mod node; -mod storage; - -use crate::message::{Body, Message}; -use crate::node::Node; - -use std::sync::Arc; -use std::time::Duration; -use tokio::io::AsyncBufReadExt; -use tokio::io::{AsyncWriteExt, BufReader, BufWriter}; -use tokio::sync::Mutex; -use tokio::sync::{broadcast, broadcast::Receiver, broadcast::Sender}; -use tokio::time; - -#[tokio::main] -async fn main() { - let mut interval = time::interval(Duration::from_millis(200)); - let (reader_tx, mut reader_rx) = broadcast::channel(100); - let (writer_tx, mut writer_rx) = broadcast::channel(100); - - let node = Arc::new(Mutex::new(Node::default())); - - let n1 = node.clone(); - let n2 = node.clone(); - - let reader_tx1 = reader_tx.clone(); - let writer_tx1 = writer_tx.clone(); - let writer_tx2 = writer_tx.clone(); - - let read = tokio::spawn(async move { - read_from_stdin(reader_tx1).await; - }); - - let write = tokio::spawn(async move { - write_to_stdout(&mut writer_rx).await; - }); - - let gossip = tokio::spawn(async move { - loop { - interval.tick().await; - gossip_messages(n1.clone(), writer_tx2.clone()).await; - } - }); - - let handle = tokio::spawn(async move { - handle_messages(n2, &mut reader_rx, writer_tx1).await; - }); - - let _ = tokio::try_join!(read, handle, write, gossip); -} - -async fn read_from_stdin(reader_tx: Sender) { - let stdin = tokio::io::stdin(); - let mut reader = BufReader::new(stdin); - - loop { - let mut buf = String::new(); - reader.read_line(&mut buf).await.unwrap(); - let message = Message::parse_message(buf.clone()); - reader_tx.send(message).unwrap(); - } -} - -async fn write_to_stdout(writer_rx: &mut Receiver) { - let stdout = tokio::io::stdout(); - let mut writer = BufWriter::new(stdout); - - loop { - let message = writer_rx.recv().await.unwrap(); - let message = Message::format_message(message); - writer.write_all(&message.as_bytes()).await.unwrap(); - writer.flush().await.unwrap(); - } -} - -async fn gossip_messages(node: Arc>, writer: Sender) { - let mut node = node.lock().await; - - for n in node.storage.get_neighbours(&node.get_id()) { - let messages = node.storage.get_messages_for_node(n.clone()); - let message = Message { - src: node.id.clone(), - dest: n.clone(), - body: Body::Gossip { - messages: messages.clone(), - }, - }; - - writer.send(message).unwrap(); - node.storage - .add_to_sent_messages(messages.into_iter().collect(), n); - } -} - -async fn handle_messages( - node: Arc>, - input: &mut Receiver, - writer: Sender, -) { - while let Ok(input) = input.recv().await { - match input.body { - Body::Init { msg_id, .. } => { - node.lock().await.init(input.clone()); - let id = node.lock().await.get_id(); - let response = Message { - src: id, - dest: input.src, - body: Body::InitOk { - in_reply_to: msg_id, - }, - }; - - writer.send(response).unwrap(); - } - Body::Broadcast { msg_id, message } => { - let id = node.lock().await.get_id(); - node.lock().await.storage.add_message(message, id.clone()); - - let response = Message { - src: id, - dest: input.src, - body: Body::BroadcastOk { - msg_id, - in_reply_to: msg_id, - }, - }; - - writer.send(response).unwrap(); - } - Body::Read { msg_id } => { - let id = node.lock().await.get_id(); - - let response = Message { - src: id, - dest: input.src, - body: Body::ReadOk { - msg_id, - in_reply_to: msg_id, - messages: node.lock().await.storage.get_messages(), - }, - }; - - writer.send(response).unwrap(); - } - Body::Topology { msg_id, topology } => { - let id = node.lock().await.get_id(); - node.lock().await.storage.init_topology(topology); - - let response = Message { - src: id, - dest: input.src, - body: Body::TopologyOk { - msg_id, - in_reply_to: msg_id, - }, - }; - - writer.send(response).unwrap(); - } - Body::Error { - in_reply_to, - code, - text, - } => { - eprintln!( - "Error received (in_reply_to: {}, code: {}, text: {})", - in_reply_to, code, text - ); - } - _ => (), - } - } - println!("Error, nothing to read from receiver"); -} diff --git a/01-echo/.gitignore b/1-echo/.gitignore similarity index 100% rename from 01-echo/.gitignore rename to 1-echo/.gitignore diff --git a/01-echo/Cargo.lock b/1-echo/Cargo.lock similarity index 100% rename from 01-echo/Cargo.lock rename to 1-echo/Cargo.lock diff --git a/01-echo/Cargo.toml b/1-echo/Cargo.toml similarity index 100% rename from 01-echo/Cargo.toml rename to 1-echo/Cargo.toml diff --git a/01-echo/src/main.rs b/1-echo/src/main.rs similarity index 100% rename from 01-echo/src/main.rs rename to 1-echo/src/main.rs diff --git a/02-unique-id/.gitignore b/2-unique-id/.gitignore similarity index 100% rename from 02-unique-id/.gitignore rename to 2-unique-id/.gitignore diff --git a/02-unique-id/Cargo.lock b/2-unique-id/Cargo.lock similarity index 100% rename from 02-unique-id/Cargo.lock rename to 2-unique-id/Cargo.lock diff --git a/02-unique-id/Cargo.toml b/2-unique-id/Cargo.toml similarity index 100% rename from 02-unique-id/Cargo.toml rename to 2-unique-id/Cargo.toml diff --git a/02-unique-id/src/main.rs b/2-unique-id/src/main.rs similarity index 100% rename from 02-unique-id/src/main.rs rename to 2-unique-id/src/main.rs diff --git a/03a-single-node-broadcast/.gitignore b/3a-single-node-broadcast/.gitignore similarity index 100% rename from 03a-single-node-broadcast/.gitignore rename to 3a-single-node-broadcast/.gitignore diff --git a/03a-single-node-broadcast/Cargo.lock b/3a-single-node-broadcast/Cargo.lock similarity index 55% rename from 03a-single-node-broadcast/Cargo.lock rename to 3a-single-node-broadcast/Cargo.lock index de30834..dcc711f 100644 --- a/03a-single-node-broadcast/Cargo.lock +++ b/3a-single-node-broadcast/Cargo.lock @@ -2,6 +2,27 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "autocfg" version = "1.1.0" @@ -14,12 +35,24 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" +[[package]] +name = "bumpalo" +version = "3.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" + [[package]] name = "bytes" version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" + [[package]] name = "cfg-if" version = "1.0.0" @@ -30,11 +63,63 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "ch03a-single-node-broadcast" version = "0.1.0" dependencies = [ + "log", + "log4rs", "serde", "serde_json", "tokio", ] +[[package]] +name = "chrono" +version = "0.4.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" +dependencies = [ + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "destructure_traitobject" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + [[package]] name = "hermit-abi" version = "0.2.6" @@ -44,18 +129,72 @@ dependencies = [ "libc", ] +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", +] + [[package]] name = "itoa" version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" +[[package]] +name = "js-sys" +version = "0.3.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +dependencies = [ + "wasm-bindgen", +] + [[package]] name = "libc" version = "0.2.142" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" + [[package]] name = "lock_api" version = "0.4.9" @@ -73,6 +212,39 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", + "serde", +] + +[[package]] +name = "log-mdc" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" + +[[package]] +name = "log4rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36ca1786d9e79b8193a68d480a0907b612f109537115c6ff655a3a1967533fd" +dependencies = [ + "anyhow", + "arc-swap", + "chrono", + "derivative", + "fnv", + "humantime", + "libc", + "log", + "log-mdc", + "parking_lot", + "serde", + "serde-value", + "serde_json", + "serde_yaml", + "thiserror", + "thread-id", + "typemap-ors", + "winapi", ] [[package]] @@ -83,10 +255,29 @@ checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" dependencies = [ "libc", "log", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.45.0", ] +[[package]] +name = "num-integer" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + [[package]] name = "num_cpus" version = "1.15.0" @@ -97,6 +288,21 @@ dependencies = [ "libc", ] +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", +] + [[package]] name = "parking_lot" version = "0.12.1" @@ -174,6 +380,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.160" @@ -182,7 +398,7 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -196,6 +412,18 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_yaml" +version = "0.8.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" +dependencies = [ + "indexmap", + "ryu", + "serde", + "yaml-rust", +] + [[package]] name = "signal-hook-registry" version = "1.4.1" @@ -221,6 +449,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.15" @@ -232,6 +471,48 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "thiserror" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", +] + +[[package]] +name = "thread-id" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fdfe0627923f7411a43ec9ec9c39c3a9b4151be313e0922042581fb6c9b717f" +dependencies = [ + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi 0.10.0+wasi-snapshot-preview1", + "winapi", +] + [[package]] name = "tokio" version = "1.28.0" @@ -259,7 +540,16 @@ checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", +] + +[[package]] +name = "typemap-ors" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" +dependencies = [ + "unsafe-any-ors", ] [[package]] @@ -268,12 +558,81 @@ version = "1.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" +[[package]] +name = "unsafe-any-ors" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" +dependencies = [ + "destructure_traitobject", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +[[package]] +name = "wasm-bindgen" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.15", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" + [[package]] name = "winapi" version = "0.3.9" @@ -296,6 +655,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -427,3 +795,12 @@ name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/03a-single-node-broadcast/Cargo.toml b/3a-single-node-broadcast/Cargo.toml similarity index 92% rename from 03a-single-node-broadcast/Cargo.toml rename to 3a-single-node-broadcast/Cargo.toml index 791414d..0247202 100644 --- a/03a-single-node-broadcast/Cargo.toml +++ b/3a-single-node-broadcast/Cargo.toml @@ -6,6 +6,8 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] +log = "0.4" +log4rs = "1" tokio = {version = "1", features = ["full"]} serde = {version = "1", features = ["derive"] } serde_json = "1" diff --git a/03a-single-node-broadcast/src/connection.rs b/3a-single-node-broadcast/src/connection.rs similarity index 91% rename from 03a-single-node-broadcast/src/connection.rs rename to 3a-single-node-broadcast/src/connection.rs index 983d24c..c815119 100644 --- a/03a-single-node-broadcast/src/connection.rs +++ b/3a-single-node-broadcast/src/connection.rs @@ -1,4 +1,5 @@ use crate::message::Message; +use log::info; use std::io::{BufRead, Write}; #[derive(Debug)] @@ -18,6 +19,7 @@ impl<'a> Connection<'a> { pub fn read_one(&mut self) -> Option { let mut buf = String::new(); let _ = self.reader.read_line(&mut buf); + info!("read_from_stdin:: {buf:?}"); return Some(Message::parse_message(buf)); } @@ -37,6 +39,7 @@ impl<'a> Connection<'a> { } pub fn write(&mut self, message: Message) { + info!("write to stdout: {message:?}"); let message = Message::format_message(message); writeln!(self.writer, "{}", message).unwrap(); self.writer.flush().unwrap(); diff --git a/03a-single-node-broadcast/src/main.rs b/3a-single-node-broadcast/src/main.rs similarity index 97% rename from 03a-single-node-broadcast/src/main.rs rename to 3a-single-node-broadcast/src/main.rs index 749b0f0..b7e0abb 100644 --- a/03a-single-node-broadcast/src/main.rs +++ b/3a-single-node-broadcast/src/main.rs @@ -8,6 +8,7 @@ use crate::message::{Body, Message}; use crate::node::Node; fn main() { + log4rs::init_file("log4rs.yaml", Default::default()).unwrap(); let stdin = std::io::stdin(); let mut connection = Connection::new(stdin); diff --git a/03a-single-node-broadcast/src/message.rs b/3a-single-node-broadcast/src/message.rs similarity index 100% rename from 03a-single-node-broadcast/src/message.rs rename to 3a-single-node-broadcast/src/message.rs diff --git a/03a-single-node-broadcast/src/node.rs b/3a-single-node-broadcast/src/node.rs similarity index 100% rename from 03a-single-node-broadcast/src/node.rs rename to 3a-single-node-broadcast/src/node.rs diff --git a/03a-single-node-broadcast/src/storage.rs b/3a-single-node-broadcast/src/storage.rs similarity index 100% rename from 03a-single-node-broadcast/src/storage.rs rename to 3a-single-node-broadcast/src/storage.rs diff --git a/03b-multi-node-broadcast/.gitignore b/3b-multi-node-broadcast/.gitignore similarity index 100% rename from 03b-multi-node-broadcast/.gitignore rename to 3b-multi-node-broadcast/.gitignore diff --git a/03b-multi-node-broadcast/Cargo.lock b/3b-multi-node-broadcast/Cargo.lock similarity index 54% rename from 03b-multi-node-broadcast/Cargo.lock rename to 3b-multi-node-broadcast/Cargo.lock index 78a9e6d..bf55435 100644 --- a/03b-multi-node-broadcast/Cargo.lock +++ b/3b-multi-node-broadcast/Cargo.lock @@ -2,6 +2,27 @@ # It is not intended for manual editing. version = 3 +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c7d0618f0e0b7e8ff11427422b64564d5fb0be1940354bfe2e0529b18a9d9b8" + +[[package]] +name = "arc-swap" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bddcadddf5e9015d310179a59bb28c4d4b9920ad0f11e8e14dbadf654890c9a6" + [[package]] name = "autocfg" version = "1.1.0" @@ -15,10 +36,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] -name = "bytes" -version = "1.4.0" +name = "bumpalo" +version = "3.12.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89b2fd2a0dcf38d7971e2194b6b6eebab45ae01067456a7fd93d5547a61b70be" +checksum = "3c6ed94e98ecff0c12dd1b04c15ec0d7d9458ca8fe806cea6f12954efe74c63b" + +[[package]] +name = "cc" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50d30906286121d95be3d479533b458f87493b30a4b5f79a607db8f5d11aa91f" [[package]] name = "cfg-if" @@ -30,18 +57,99 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" name = "ch03b-multi-node-broadcast" version = "0.1.0" dependencies = [ + "log", + "log4rs", "serde", "serde_json", - "tokio", ] [[package]] -name = "hermit-abi" -version = "0.2.6" +name = "chrono" +version = "0.4.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee512640fe35acbfb4bb779db6f0d80704c2cacfa2e39b601ef3e3f47d1ae4c7" +checksum = "4e3c5919066adf22df73762e50cffcde3a758f2a848b113b586d1f86728b673b" dependencies = [ - "libc", + "iana-time-zone", + "js-sys", + "num-integer", + "num-traits", + "time", + "wasm-bindgen", + "winapi", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "destructure_traitobject" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c877555693c14d2f84191cfd3ad8582790fc52b5e2274b40b59cf5f5cea25c7" + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "iana-time-zone" +version = "0.1.56" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0722cd7114b7de04316e7ea5456a0bbb20e4adb46fd27a3697adb812cff0f37c" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown", ] [[package]] @@ -51,10 +159,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "453ad9f582a441959e5f0d088b02ce04cfe8d51a8eaf077f12ac6d3e94164ca6" [[package]] -name = "libc" -version = "0.2.142" +name = "js-sys" +version = "0.3.62" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a987beff54b60ffa6d51982e1aa1146bc42f19bd26be28b0586f252fccf5317" +checksum = "68c16e1bfd491478ab155fd8b4896b86f9ede344949b641e61501e07c2b8b4d5" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "libc" +version = "0.2.144" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b00cc1c228a6782d0f076e7b232802e0c5689d41bb5df366f2a6b6621cfdfe1" + +[[package]] +name = "linked-hash-map" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "lock_api" @@ -73,28 +196,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" dependencies = [ "cfg-if", + "serde", ] [[package]] -name = "mio" -version = "0.8.6" +name = "log-mdc" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b9d9a46eff5b4ff64b45a9e316a6d1e0bc719ef429cbec4dc630684212bfdf9" +checksum = "a94d21414c1f4a51209ad204c1776a3d0765002c76c6abcb602a6f09f1e881c7" + +[[package]] +name = "log4rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d36ca1786d9e79b8193a68d480a0907b612f109537115c6ff655a3a1967533fd" dependencies = [ + "anyhow", + "arc-swap", + "chrono", + "derivative", + "fnv", + "humantime", "libc", "log", - "wasi", - "windows-sys 0.45.0", + "log-mdc", + "parking_lot", + "serde", + "serde-value", + "serde_json", + "serde_yaml", + "thiserror", + "thread-id", + "typemap-ors", + "winapi", ] [[package]] -name = "num_cpus" -version = "1.15.0" +name = "num-integer" +version = "0.1.45" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b" +checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" dependencies = [ - "hermit-abi", - "libc", + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "578ede34cf02f8924ab9447f50c28075b4d3e5b269972345e7e0372b38c6cdcd" +dependencies = [ + "autocfg", +] + +[[package]] +name = "once_cell" +version = "1.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7e5500299e16ebb147ae15a00a942af264cf3688f47923b8fc2cd5858f23ad3" + +[[package]] +name = "ordered-float" +version = "2.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7940cf2ca942593318d07fcf2596cdca60a85c9e7fab408a5e21a4f9dcd40d87" +dependencies = [ + "num-traits", ] [[package]] @@ -117,15 +285,9 @@ dependencies = [ "libc", "redox_syscall", "smallvec", - "windows-sys 0.45.0", + "windows-sys", ] -[[package]] -name = "pin-project-lite" -version = "0.2.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116" - [[package]] name = "proc-macro2" version = "1.0.56" @@ -174,6 +336,16 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-value" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a1a3341211875ef120e117ea7fd5228530ae7e7036a779fdc9117be6b3282c" +dependencies = [ + "ordered-float", + "serde", +] + [[package]] name = "serde_derive" version = "1.0.160" @@ -182,7 +354,7 @@ checksum = "291a097c63d8497e00160b166a967a4a79c64f3facdd01cbd7502231688d77df" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", ] [[package]] @@ -197,12 +369,15 @@ dependencies = [ ] [[package]] -name = "signal-hook-registry" -version = "1.4.1" +name = "serde_yaml" +version = "0.8.26" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "578a7433b776b56a35785ed5ce9a7e777ac0598aac5a6dd1b4b18a307c7fc71b" dependencies = [ - "libc", + "indexmap", + "ryu", + "serde", + "yaml-rust", ] [[package]] @@ -212,13 +387,14 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0" [[package]] -name = "socket2" -version = "0.4.9" +name = "syn" +version = "1.0.109" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64a4a911eed85daf18834cfaa86a79b7d266ff93ff5ba14005426219480ed662" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" dependencies = [ - "libc", - "winapi", + "proc-macro2", + "quote", + "unicode-ident", ] [[package]] @@ -233,33 +409,54 @@ dependencies = [ ] [[package]] -name = "tokio" -version = "1.28.0" +name = "thiserror" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3c786bf8134e5a3a166db9b29ab8f48134739014a3eca7bc6bfa95d673b136f" +checksum = "978c9a314bd8dc99be594bc3c175faaa9794be04a5a5e153caba6915336cebac" dependencies = [ - "autocfg", - "bytes", - "libc", - "mio", - "num_cpus", - "parking_lot", - "pin-project-lite", - "signal-hook-registry", - "socket2", - "tokio-macros", - "windows-sys 0.48.0", + "thiserror-impl", ] [[package]] -name = "tokio-macros" -version = "2.1.0" +name = "thiserror-impl" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "f9456a42c5b0d803c8cd86e73dd7cc9edd429499f37a3550d286d5e86720569f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.15", +] + +[[package]] +name = "thread-id" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fdfe0627923f7411a43ec9ec9c39c3a9b4151be313e0922042581fb6c9b717f" +dependencies = [ + "libc", + "redox_syscall", + "winapi", +] + +[[package]] +name = "time" +version = "0.1.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b797afad3f312d1c66a56d11d0316f916356d11bd158fbc6ca6389ff6bf805a" +dependencies = [ + "libc", + "wasi", + "winapi", +] + +[[package]] +name = "typemap-ors" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a68c24b707f02dd18f1e4ccceb9d49f2058c2fb86384ef9972592904d7a28867" +dependencies = [ + "unsafe-any-ors", ] [[package]] @@ -269,10 +466,73 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5464a87b239f13a63a501f2701565754bae92d243d4bb7eb12f6d57d2269bf4" [[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +name = "unsafe-any-ors" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "e0a303d30665362d9680d7d91d78b23f5f899504d4f08b3c4cf08d055d87c0ad" +dependencies = [ + "destructure_traitobject", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "wasm-bindgen" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b6cb788c4e39112fbe1822277ef6fb3c55cd86b95cb3d3c4c1c9597e4ac74b4" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35e522ed4105a9d626d885b35d62501b30d9666283a5c8be12c14a8bdafe7822" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.15", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "358a79a0cb89d21db8120cbfb91392335913e4890665b1a7981d9e956903b434" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4783ce29f09b9d93134d41297aded3a712b7b979e9c6f28c32cb88c973a94869" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.15", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.85" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a901d592cafaa4d711bc324edfaff879ac700b19c3dfd60058d2b445be2691eb" [[package]] name = "winapi" @@ -296,6 +556,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.0", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -305,15 +574,6 @@ dependencies = [ "windows-targets 0.42.2", ] -[[package]] -name = "windows-sys" -version = "0.48.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" -dependencies = [ - "windows-targets 0.48.0", -] - [[package]] name = "windows-targets" version = "0.42.2" @@ -427,3 +687,12 @@ name = "windows_x86_64_msvc" version = "0.48.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a" + +[[package]] +name = "yaml-rust" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" +dependencies = [ + "linked-hash-map", +] diff --git a/03b-multi-node-broadcast/Cargo.toml b/3b-multi-node-broadcast/Cargo.toml similarity index 85% rename from 03b-multi-node-broadcast/Cargo.toml rename to 3b-multi-node-broadcast/Cargo.toml index 9efaa72..ac5f59b 100644 --- a/03b-multi-node-broadcast/Cargo.toml +++ b/3b-multi-node-broadcast/Cargo.toml @@ -6,6 +6,7 @@ edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -tokio = {version = "1", features = ["full"]} +log = "0.4" +log4rs = "1" serde = {version = "1", features = ["derive"] } serde_json = "1" diff --git a/3b-multi-node-broadcast/log4rs.yaml b/3b-multi-node-broadcast/log4rs.yaml new file mode 100644 index 0000000..90447a1 --- /dev/null +++ b/3b-multi-node-broadcast/log4rs.yaml @@ -0,0 +1,16 @@ +appenders: + my_file_logger: + kind: rolling_file + path: "log/my.log" + encoder: + pattern: "{d(%Y-%m-%d %H:%M:%S)(utc)} - {h({l})}: {m}{n}" + policy: + trigger: + kind: size + limit: 50kb + roller: + kind: delete +root: + level: trace + appenders: + - my_file_logger diff --git a/3b-multi-node-broadcast/src/main.rs b/3b-multi-node-broadcast/src/main.rs new file mode 100644 index 0000000..e4f1da9 --- /dev/null +++ b/3b-multi-node-broadcast/src/main.rs @@ -0,0 +1,180 @@ +mod message; +mod node; +mod storage; + +use crate::message::{Body, Message}; +use crate::node::Node; + +use std::io::prelude::*; +use std::io::{BufReader, Write}; +use std::sync::{ + mpsc, + mpsc::{Receiver, Sender}, + Arc, Mutex, +}; +use std::thread; +use std::time::Duration; + +fn main() { + let (reader_tx, mut reader_rx) = mpsc::channel(); + let (writer_tx, mut writer_rx) = mpsc::channel(); + + let node = Arc::new(Mutex::new(Node::default())); + + let n1 = node.clone(); + let n2 = node.clone(); + + let reader_tx1: Sender = reader_tx.clone(); + let writer_tx1: Sender = writer_tx.clone(); + let writer_tx2: Sender = writer_tx.clone(); + + let read = thread::spawn(move || { + read_from_stdin(reader_tx1); + }); + + let write = thread::spawn(move || { + write_to_stdout(&mut writer_rx); + }); + + let gossip = thread::spawn(move || loop { + thread::sleep(Duration::from_secs(1)); + gossip_messages(n1.clone(), writer_tx2.clone()); + }); + + let handle = thread::spawn(move || { + handle_messages(n2, &mut reader_rx, writer_tx1); + }); + let _ = handle.join(); + let _ = write.join(); + let _ = gossip.join(); + let _ = read.join(); +} + +fn read_from_stdin(reader_tx: Sender) { + let stdin = std::io::stdin(); + let mut reader = BufReader::new(stdin.lock()); + + loop { + let mut buf = String::new(); + reader.read_line(&mut buf).unwrap(); + let message = Message::parse_message(buf.clone()); + reader_tx.send(message).unwrap(); + } +} + +fn write_to_stdout(writer_rx: &mut Receiver) { + let mut stdout = std::io::stdout(); + + loop { + let message = writer_rx.recv().unwrap(); + let message = Message::format_message(message); + writeln!(stdout, "{}", message).unwrap(); + stdout.flush().unwrap(); + } +} + +fn gossip_messages(node: Arc>, writer: Sender) { + let mut node = node.lock().unwrap(); + if let Some(neighbours) = node.storage.get_neighbours(&node.get_id()) { + for n in neighbours { + let messages = node.storage.get_messages_for_node(n.clone()); + let message = Message { + src: node.id.clone(), + dest: n.clone(), + body: Body::Gossip { + messages: messages.clone(), + }, + }; + + writer.send(message).unwrap(); + node.storage + .add_to_sent_messages(messages.into_iter().collect(), n); + } + } +} + +fn handle_messages(node: Arc>, input: &mut Receiver, writer: Sender) { + while let Ok(input) = input.recv() { + match input.body { + Body::Init { msg_id, .. } => { + node.lock().unwrap().init(input.clone()); + let id = node.lock().unwrap().get_id(); + let response = Message { + src: id, + dest: input.src, + body: Body::InitOk { + in_reply_to: msg_id, + }, + }; + + writer.send(response).unwrap(); + } + Body::Broadcast { msg_id, message } => { + let id = node.lock().unwrap().get_id(); + node.lock() + .unwrap() + .storage + .add_message(message, id.clone()); + + let response = Message { + src: id, + dest: input.src, + body: Body::BroadcastOk { + msg_id, + in_reply_to: msg_id, + }, + }; + + writer.send(response).unwrap(); + } + Body::Gossip { messages } => { + let id = node.lock().unwrap().get_id(); + for m in messages.into_iter() { + node.lock().unwrap().storage.add_message(m, id.clone()); + } + } + Body::Read { msg_id } => { + let id = node.lock().unwrap().get_id(); + + let response = Message { + src: id, + dest: input.src, + body: Body::ReadOk { + msg_id, + in_reply_to: msg_id, + messages: node.lock().unwrap().storage.get_messages(), + }, + }; + + writer.send(response).unwrap(); + } + Body::Topology { msg_id, topology } => { + let id = node.lock().unwrap().get_id(); + node.lock().unwrap().storage.init_topology(topology); + + let response = Message { + src: id, + dest: input.src, + body: Body::TopologyOk { + msg_id, + in_reply_to: msg_id, + }, + }; + + writer.send(response).unwrap(); + } + Body::Error { + in_reply_to, + code, + text, + } => { + eprintln!( + "Error received (in_reply_to: {}, code: {}, text: {})", + in_reply_to, code, text + ); + } + _ => (), + } + } + println!("Error, nothing to read from receiver"); +} diff --git a/03b-multi-node-broadcast/src/message.rs b/3b-multi-node-broadcast/src/message.rs similarity index 100% rename from 03b-multi-node-broadcast/src/message.rs rename to 3b-multi-node-broadcast/src/message.rs diff --git a/03b-multi-node-broadcast/src/node.rs b/3b-multi-node-broadcast/src/node.rs similarity index 100% rename from 03b-multi-node-broadcast/src/node.rs rename to 3b-multi-node-broadcast/src/node.rs diff --git a/03b-multi-node-broadcast/src/storage.rs b/3b-multi-node-broadcast/src/storage.rs similarity index 94% rename from 03b-multi-node-broadcast/src/storage.rs rename to 3b-multi-node-broadcast/src/storage.rs index 25ad5bc..c2adc65 100644 --- a/03b-multi-node-broadcast/src/storage.rs +++ b/3b-multi-node-broadcast/src/storage.rs @@ -77,7 +77,7 @@ impl Storage { self.topology.0 = topology; } - pub(crate) fn get_neighbours(&self, node_id: &str) -> Vec { - self.topology.0.get(node_id).unwrap().to_owned() + pub(crate) fn get_neighbours(&self, node_id: &str) -> Option> { + self.topology.0.get(node_id).cloned() } }