Skip to content

Commit 634f337

Browse files
committed
Use bytes::Bytes
- Replace String with Bytes for Value containers - Remove del operation on server side - Covert use of string in grpc messages to bytes
1 parent 06d4a57 commit 634f337

File tree

3 files changed

+18
-29
lines changed

3 files changed

+18
-29
lines changed

proto/dstore.proto

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ package dstore;
44

55
message SetArg {
66
string key = 1;
7-
string value = 2;
7+
bytes value = 2;
88
}
99

1010
message GetArg {
@@ -16,12 +16,11 @@ message SetResult {
1616
}
1717

1818
message GetResult {
19-
string value = 1;
19+
bytes value = 1;
2020
bool success = 2;
2121
}
2222

2323
service Dstore {
2424
rpc Set(SetArg) returns (SetResult);
2525
rpc Get(GetArg) returns (GetResult);
26-
rpc Del(GetArg) returns (SetResult);
2726
}

src/global.rs

Lines changed: 7 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,16 @@
11
use std::collections::HashMap;
22
use std::sync::{Arc, Mutex};
3+
use bytes::Bytes;
34
use tonic::{transport::Server, Request, Response, Status};
45

56
use dstore::dstore_proto::dstore_server::{Dstore, DstoreServer};
67
use dstore::dstore_proto::{GetArg, GetResult, SetArg, SetResult};
78
struct Store {
8-
db: Arc<Mutex<HashMap<String, String>>>,
9+
db: Arc<Mutex<HashMap<String, Bytes>>>,
910
}
1011

1112
impl Store {
12-
fn new(db: Arc<Mutex<HashMap<String, String>>>) -> Self {
13+
fn new(db: Arc<Mutex<HashMap<String, Bytes>>>) -> Self {
1314
Self { db }
1415
}
1516
}
@@ -22,7 +23,7 @@ impl Dstore for Store {
2223
match db.contains_key(&args.key) {
2324
true => Ok(Response::new(SetResult { success: false })),
2425
false => {
25-
db.insert(args.key, args.value);
26+
db.insert(args.key, Bytes::from(args.value));
2627
Ok(Response::new(SetResult { success: true }))
2728
}
2829
}
@@ -33,33 +34,21 @@ impl Dstore for Store {
3334
let args = get_arg.into_inner();
3435
match db.get(&args.key) {
3536
Some(val) => Ok(Response::new(GetResult {
36-
value: val.clone(),
37+
value: val.to_vec(),
3738
success: true,
3839
})),
3940
None => Ok(Response::new(GetResult {
40-
value: "".to_string(),
41+
value: vec![],
4142
success: false,
4243
})),
4344
}
4445
}
45-
46-
async fn del(&self, del_arg: Request<GetArg>) -> Result<Response<SetResult>, Status> {
47-
let mut db = self.db.lock().unwrap();
48-
let args = del_arg.into_inner();
49-
match db.contains_key(&args.key) {
50-
false => Ok(Response::new(SetResult { success: false })),
51-
true => {
52-
db.remove(&args.key);
53-
Ok(Response::new(SetResult { success: true }))
54-
}
55-
}
56-
}
5746
}
5847

5948
#[tokio::main]
6049
async fn main() -> Result<(), Box<dyn std::error::Error>> {
6150
let addr = "127.0.0.1:50051".parse().unwrap();
62-
let global_store = Arc::new(Mutex::new(HashMap::<String, String>::new()));
51+
let global_store = Arc::new(Mutex::new(HashMap::<String, Bytes>::new()));
6352

6453
println!("Dstore server listening on {}", addr);
6554

src/local.rs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
use std::collections::HashMap;
22
use std::io;
33
use std::io::{stdin, BufRead, Write};
4+
use bytes::Bytes;
45
use tonic::{transport::Channel, Request};
56

67
use dstore::dstore_proto::dstore_client::DstoreClient;
78
use dstore::dstore_proto::{GetArg, SetArg};
89

910
struct Store {
10-
db: HashMap<String, String>,
11+
db: HashMap<String, Bytes>,
1112
global: DstoreClient<Channel>,
1213
}
1314

@@ -37,31 +38,31 @@ impl Store {
3738
let value = words[2..].join(" ");
3839
let req = Request::new(SetArg {
3940
key: key.clone(),
40-
value: value.clone(),
41+
value: value.as_bytes().to_vec(),
4142
});
4243
let res = self.global.set(req).await.unwrap();
4344
if res.into_inner().success {
44-
self.db.insert(key, value);
45+
self.db.insert(key, Bytes::from(value));
4546
eprintln!("Database updated");
4647
} else {
4748
let req = Request::new(GetArg { key: key.clone() });
4849
let res = self.global.get(req).await.unwrap().into_inner();
49-
self.db.insert(key, res.value);
50+
self.db.insert(key, Bytes::from(res.value));
5051
eprintln!("(Updated local) Key occupied!");
5152
}
5253
}
5354
}
5455
"get" | "select" | "output" | "out" | "o" => {
5556
let key = words[1].to_string();
5657
match self.db.get(&key) {
57-
Some(value) => println!("db: {} -> {}", key, value),
58+
Some(value) => println!("db: {} -> {}", key, String::from_utf8(value.to_vec()).unwrap()),
5859
None => {
5960
let req = Request::new(GetArg { key: key.clone() });
6061
let res = self.global.get(req).await.unwrap().into_inner();
6162
if res.success {
62-
println!("global: {} -> {}\t(Updating Local)", key, res.value);
63+
println!("global: {} -> {}\t(Updating Local)", key, String::from_utf8(res.value.clone()).unwrap());
6364
// Update local
64-
self.db.insert(key, res.value);
65+
self.db.insert(key, Bytes::from(res.value));
6566
} else {
6667
eprintln!("Key-Value mapping doesn't exist");
6768
}
@@ -73,7 +74,7 @@ impl Store {
7374
let key = words[1];
7475
match self.db.get(key) {
7576
Some(value) => {
76-
eprintln!("({} -> {}) Removing local mapping!", key, value);
77+
eprintln!("({} -> {}) Removing local mapping!", key, String::from_utf8(value.to_vec()).unwrap());
7778
self.db.remove(key);
7879
}
7980
None => eprintln!("Key-Value mapping doesn't exist"),

0 commit comments

Comments
 (0)