From 7453c3632cfec20e7f37c2369fb22264a24b1983 Mon Sep 17 00:00:00 2001 From: Abhishek Shah Date: Fri, 23 Feb 2024 17:50:40 +0530 Subject: [PATCH] prepare server-client comms & network protocol --- Cargo.lock | 218 +++++++++++++++++++++++++++++-- crates/kvs-client/Cargo.toml | 3 +- crates/kvs-client/src/client.rs | 24 ++-- crates/kvs-server/Cargo.toml | 10 +- crates/kvs-server/src/request.rs | 5 + crates/kvs-server/src/server.rs | 55 ++++++-- server.sh | 5 + 7 files changed, 287 insertions(+), 33 deletions(-) create mode 100644 crates/kvs-server/src/request.rs create mode 100755 server.sh diff --git a/Cargo.lock b/Cargo.lock index 2c68480..031d081 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -13,9 +13,9 @@ dependencies = [ [[package]] name = "anstream" -version = "0.6.4" +version = "0.6.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ab91ebe16eb252986481c5b62f6098f3b698a45e34b5b98200cf20dd2484a44" +checksum = "96b09b5178381e0874812a9b157f7fe84982617e48f71f4e3235482775e5b540" dependencies = [ "anstyle", "anstyle-parse", @@ -27,9 +27,9 @@ dependencies = [ [[package]] name = "anstyle" -version = "1.0.4" +version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" [[package]] name = "anstyle-parse" @@ -59,6 +59,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "anyhow" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ad32ce52e4161730f7098c077cd2ed6229b5804ccf99e5366be1ab72a98b4e1" + [[package]] name = "assert_cmd" version = "0.11.1" @@ -334,6 +340,16 @@ version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", +] + [[package]] name = "env_logger" version = "0.10.0" @@ -347,6 +363,19 @@ dependencies = [ "termcolor", ] +[[package]] +name = "env_logger" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c012a26a7f605efc424dd53697843a72be7dc86ad2d01f7814337794a12231d" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "humantime", + "log", +] + [[package]] name = "errno" version = "0.3.4" @@ -420,6 +449,17 @@ dependencies = [ "byteorder", ] +[[package]] +name = "getrandom" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + [[package]] name = "half" version = "1.8.2" @@ -505,11 +545,11 @@ dependencies = [ "clap 4.4.6", "criterion", "dotenv", - "env_logger", + "env_logger 0.10.0", "lazy_static", "log", "predicates", - "rand", + "rand 0.6.5", "ron", "serde", "serde_json", @@ -523,12 +563,13 @@ dependencies = [ name = "kvs-client" version = "1.2.0" dependencies = [ + "anyhow", "assert_cmd", "clap 4.4.6", "criterion", "kvs", "predicates", - "rand", + "rand 0.6.5", "tempfile", "walkdir", ] @@ -538,7 +579,11 @@ name = "kvs-server" version = "1.2.0" dependencies = [ "clap 4.4.6", + "env_logger 0.11.2", "kvs", + "tracing", + "tracing-subscriber", + "uuid", ] [[package]] @@ -596,6 +641,16 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "61807f77802ff30975e01f4f071c8ba10c022052f98b3294119f3e615d13e5be" +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + [[package]] name = "num-traits" version = "0.2.17" @@ -617,6 +672,12 @@ version = "11.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ab1bc2a289d34bd04a330323ac98a1b4bc82c9d9fcb1e66b63caa84da26b575" +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + [[package]] name = "parking_lot" version = "0.11.2" @@ -642,6 +703,12 @@ dependencies = [ "winapi", ] +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + [[package]] name = "plotters" version = "0.3.5" @@ -670,6 +737,12 @@ dependencies = [ "plotters-backend", ] +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + [[package]] name = "predicates" version = "1.0.8" @@ -725,7 +798,7 @@ checksum = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" dependencies = [ "autocfg 0.1.8", "libc", - "rand_chacha", + "rand_chacha 0.1.1", "rand_core 0.4.2", "rand_hc", "rand_isaac", @@ -736,6 +809,17 @@ dependencies = [ "winapi", ] +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + [[package]] name = "rand_chacha" version = "0.1.1" @@ -746,6 +830,16 @@ dependencies = [ "rand_core 0.3.1", ] +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + [[package]] name = "rand_core" version = "0.3.1" @@ -761,6 +855,15 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c33a3c44ca05fa6f1807d8e6743f3824e8509beca625669633be0acbdf509dc" +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + [[package]] name = "rand_hc" version = "0.1.0" @@ -986,6 +1089,15 @@ dependencies = [ "serde", ] +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + [[package]] name = "sled" version = "0.34.7" @@ -1082,6 +1194,16 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + [[package]] name = "tinytemplate" version = "1.2.1" @@ -1092,6 +1214,64 @@ dependencies = [ "serde_json", ] +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "log", + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "nu-ansi-term", + "sharded-slab", + "smallvec", + "thread_local", + "tracing-core", + "tracing-log", +] + [[package]] name = "unicode-ident" version = "1.0.12" @@ -1110,6 +1290,22 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" +[[package]] +name = "uuid" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" +dependencies = [ + "getrandom", + "rand 0.8.5", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + [[package]] name = "walkdir" version = "2.4.0" @@ -1120,6 +1316,12 @@ dependencies = [ "winapi-util", ] +[[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.87" diff --git a/crates/kvs-client/Cargo.toml b/crates/kvs-client/Cargo.toml index cc4a422..23a684a 100644 --- a/crates/kvs-client/Cargo.toml +++ b/crates/kvs-client/Cargo.toml @@ -15,6 +15,7 @@ path = "src/client.rs" [dependencies] kvs = { workspace = true } clap = { workspace = true } +anyhow = "1.0.80" [dev-dependencies] assert_cmd = "0.11" @@ -22,4 +23,4 @@ criterion = "0.3" predicates = "1.0.0" rand = "0.6.5" tempfile = "3.0.7" -walkdir = "2.2.7" \ No newline at end of file +walkdir = "2.2.7" diff --git a/crates/kvs-client/src/client.rs b/crates/kvs-client/src/client.rs index 7f83590..e0e0588 100644 --- a/crates/kvs-client/src/client.rs +++ b/crates/kvs-client/src/client.rs @@ -1,16 +1,24 @@ +use kvs::cli::{Action, GetCmd, RmCmd, SetCmd}; use kvs::exit_program; -fn main() { - println!("Hello, world! from kvs client"); +fn main() -> anyhow::Result<()> { + let cli = ::parse(); + match cli.action { + Action::Set(SetCmd { key, value }) => { + + }, + Action::Get(GetCmd { key }) => { + + }, + Action::Remove(RmCmd { key }) => { + + }, + } exit_program(1); } #[derive(Debug, clap::Parser)] struct Cli { - #[arg(short, long)] - get: String, - #[arg(short, long)] - set: String, - #[arg(short, long)] - rm: String, + #[clap(subcommand)] + action: Action, } diff --git a/crates/kvs-server/Cargo.toml b/crates/kvs-server/Cargo.toml index 7b939a9..1145bea 100644 --- a/crates/kvs-server/Cargo.toml +++ b/crates/kvs-server/Cargo.toml @@ -1,8 +1,8 @@ [package] name = "kvs-server" -version = { workspace = true } +version = { workspace = true } edition = "2021" -authors = { workspace = true } +authors = { workspace = true } # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -12,4 +12,8 @@ path = "src/server.rs" [dependencies] kvs = { workspace = true } -clap = { workspace = true } \ No newline at end of file +clap = { workspace = true } +tracing = { version = "0.1.40", features = ["log"] } +tracing-subscriber = "0.3.18" +env_logger = "0.11.2" +uuid = { version = "1.7.0", features = ["v4", "fast-rng"] } diff --git a/crates/kvs-server/src/request.rs b/crates/kvs-server/src/request.rs new file mode 100644 index 0000000..737f9c1 --- /dev/null +++ b/crates/kvs-server/src/request.rs @@ -0,0 +1,5 @@ +use std::net::TcpStream; + +pub(crate) fn serve_request(s: TcpStream) { + tracing::info!("served :)") +} diff --git a/crates/kvs-server/src/server.rs b/crates/kvs-server/src/server.rs index 1f21e49..a20aec3 100644 --- a/crates/kvs-server/src/server.rs +++ b/crates/kvs-server/src/server.rs @@ -1,20 +1,36 @@ -use kvs::{ - cli::{Action, GetCmd, RmCmd, SetCmd}, - exit_program, -}; -fn main() { - let KvsServer { - action, - socket, - engine, - } = ::parse(); +use kvs::exit_program; +use request::serve_request; +use std::net::{SocketAddr, TcpListener}; +use tracing::{error, info}; - println!("Starting KVS server on {socket}"); +mod request; +#[tracing::instrument] +fn main() -> std::io::Result<()> { + ::env_logger::init(); + let KvsServer { socket, engine } = ::parse(); + let socket: SocketAddr = socket.parse().expect("Failed to parse socket address"); + let engine: Backend = match engine.expect("clap default used").as_str() { + "kvs" => Backend::Kvs, + "sled" => Backend::Sled, + _ => { + error!("Unsupported Engine"); + exit_program(2); + } + }; + info!("Starting KVS server version {}", env!("CARGO_PKG_VERSION")); + info!("Server configuration - IP:PORT: {socket}, Storage Engine: {engine}"); + + let server = TcpListener::bind(socket).expect("Failed to bind to socket"); + for stream in server.incoming() { + let request_id = uuid::Uuid::new_v4(); + let span = tracing::info_span!("Serving", %request_id ); + let _span_enter = span.enter(); + serve_request(stream?); + } + Ok(()) } #[derive(clap::Parser)] struct KvsServer { - #[clap(subcommand)] - action: Action, #[arg(long = "addr", short = 'a', default_value = "127.0.0.1:4000")] // Socket v4 or v6 -> IP:PORT socket: String, @@ -22,3 +38,16 @@ struct KvsServer { /// KV backend to use. engine: Option, } +enum Backend { + Kvs, + Sled, +} + +impl std::fmt::Display for Backend { + fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { + match self { + Backend::Kvs => write!(f, "Kvs"), + Backend::Sled => write!(f, "Sled"), + } + } +} diff --git a/server.sh b/server.sh new file mode 100755 index 0000000..165e55a --- /dev/null +++ b/server.sh @@ -0,0 +1,5 @@ +#!/bin/bash + +cargo build --workspace; + +cargo r -p kvs-server -- --engine kvs \ No newline at end of file