-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfib_server.rs
66 lines (57 loc) · 1.84 KB
/
fib_server.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
use std::{
io::{Read, Write},
net::{SocketAddr, TcpStream},
};
use tracing::{info_span, subscriber::set_default};
use tracing_subscriber::{fmt, layer::SubscriberExt, Registry};
use tracing_tape_recorder::TapeRecorder;
#[tracing::instrument]
fn fib(n: u64) -> u64 {
if n == 0 || n == 1 {
n
} else {
fib(n - 1) + fib(n - 2)
}
}
#[tracing::instrument]
fn handle_connection(mut stream: TcpStream, addr: SocketAddr) {
let mut buffer = [0u8; 8];
loop {
if let Err(err) = info_span!("read request").in_scope(|| stream.read_exact(&mut buffer)) {
tracing::error!(?err, "failed to read from stream");
break;
}
let n = u64::from_be_bytes(buffer);
tracing::info!(n, "received request");
let result = fib(n);
if let Err(err) =
info_span!("write response").in_scope(|| stream.write_all(&result.to_be_bytes()))
{
tracing::error!(?err, "failed to write to stream");
break;
}
}
}
fn main() {
let recorder = TapeRecorder::default();
let subscriber = Registry::default()
.with(recorder.clone())
.with(fmt::Layer::default());
let guard = set_default(subscriber);
let address = std::env::args()
.nth(1)
.unwrap_or_else(|| "0.0.0.0:8080".to_string());
let tcp_listener = std::net::TcpListener::bind(address).unwrap();
while let Ok((stream, addr)) = info_span!("accept").in_scope(|| tcp_listener.accept()) {
let recorder = recorder.clone();
std::thread::spawn(move || {
let subscriber = Registry::default()
.with(recorder)
.with(fmt::Layer::default());
let guard = set_default(subscriber);
handle_connection(stream, addr);
drop(guard);
});
}
drop(guard);
}