Shutdown gracefully after render_thread failure

This commit is contained in:
Jeremy Wall 2020-07-27 23:36:15 -04:00
parent c3a7709277
commit a6fedfc978

View File

@ -16,6 +16,7 @@ use std::convert::From;
use std::io; use std::io;
use std::net::{SocketAddr, ToSocketAddrs, UdpSocket}; use std::net::{SocketAddr, ToSocketAddrs, UdpSocket};
use std::sync::Arc; use std::sync::Arc;
use std::sync::RwLock;
use std::time::SystemTime; use std::time::SystemTime;
use gflags; use gflags;
@ -139,6 +140,9 @@ fn main() -> anyhow::Result<()> {
"stun_attempt_latency_ms", "stun_attempt_latency_ms",
"Latency guage in millis per stun domain.", "Latency guage in millis per stun domain.",
); );
let stop_signal = Arc::new(RwLock::new(false));
// Create a Registry and register metrics. // Create a Registry and register metrics.
let r = Registry::new(); let r = Registry::new();
let stun_counter_vec = CounterVec::new(counter_opts, &["result", "domain"]).unwrap(); let stun_counter_vec = CounterVec::new(counter_opts, &["result", "domain"]).unwrap();
@ -158,9 +162,17 @@ fn main() -> anyhow::Result<()> {
let stun_latency_vec_copy = stun_latency_vec.clone(); let stun_latency_vec_copy = stun_latency_vec.clone();
let s = s.clone(); let s = s.clone();
let domain_name = *stun_servers_copy.get(i).unwrap(); let domain_name = *stun_servers_copy.get(i).unwrap();
let stop_signal = stop_signal.clone();
let connect_thread = thread::Pending::new(move || { let connect_thread = thread::Pending::new(move || {
debug!("started thread for {}", domain_name); debug!("started thread for {}", domain_name);
loop { loop {
{
// Limit the scope of this lock
if *stop_signal.read().unwrap() {
info!("Stopping thread for {}", domain_name);
return;
}
}
let now = SystemTime::now(); let now = SystemTime::now();
info!("Attempting to connect to {}", domain_name); info!("Attempting to connect to {}", domain_name);
match attempt_stun_connect(s) { match attempt_stun_connect(s) {
@ -204,9 +216,19 @@ fn main() -> anyhow::Result<()> {
}); });
parent.schedule(Box::new(connect_thread)); parent.schedule(Box::new(connect_thread));
} }
let stop_signal = stop_signal.clone();
let render_thread = thread::Pending::new(move || { let render_thread = thread::Pending::new(move || {
debug!("attempting to start server on {}", LISTENHOST.flag); debug!("attempting to start server on {}", LISTENHOST.flag);
let server = tiny_http::Server::http(LISTENHOST.flag).unwrap(); let server = match tiny_http::Server::http(LISTENHOST.flag) {
Ok(server) => server,
Err(err) => {
let mut signal = stop_signal.write().unwrap();
*signal = true;
error!("Error starting render thread {}", err);
error!("Shutting down all threads...");
return;
}
};
loop { loop {
info!("Waiting for request"); info!("Waiting for request");
match server.recv() { match server.recv() {