Browse Source

Wait for control connections to finish too

tags/v0.2.0-candidate
Philipp Oppermann 2 years ago
parent
commit
aae4a66705
Failed to extract signature
2 changed files with 20 additions and 5 deletions
  1. +19
    -4
      binaries/coordinator/src/control.rs
  2. +1
    -1
      binaries/coordinator/src/lib.rs

+ 19
- 4
binaries/coordinator/src/control.rs View File

@@ -6,6 +6,7 @@ use dora_core::topics::{ControlRequest, ControlRequestReply};
use eyre::{eyre, Context}; use eyre::{eyre, Context};
use futures::{ use futures::{
future::{self, Either}, future::{self, Either},
stream::FuturesUnordered,
FutureExt, Stream, StreamExt, FutureExt, Stream, StreamExt,
}; };
use futures_concurrency::future::Race; use futures_concurrency::future::Race;
@@ -13,20 +14,30 @@ use std::{io::ErrorKind, net::SocketAddr};
use tokio::{ use tokio::{
net::{TcpListener, TcpStream}, net::{TcpListener, TcpStream},
sync::{mpsc, oneshot}, sync::{mpsc, oneshot},
task::JoinHandle,
}; };
use tokio_stream::wrappers::ReceiverStream; use tokio_stream::wrappers::ReceiverStream;


pub(crate) async fn control_events( pub(crate) async fn control_events(
control_listen_addr: SocketAddr, control_listen_addr: SocketAddr,
tasks: &FuturesUnordered<JoinHandle<()>>,
) -> eyre::Result<impl Stream<Item = Event>> { ) -> eyre::Result<impl Stream<Item = Event>> {
let (tx, rx) = mpsc::channel(10); let (tx, rx) = mpsc::channel(10);


tokio::spawn(listen(control_listen_addr, tx));
let (finish_tx, mut finish_rx) = mpsc::channel(1);
tasks.push(tokio::spawn(listen(control_listen_addr, tx, finish_tx)));
tasks.push(tokio::spawn(async move {
while let Some(()) = finish_rx.recv().await {}
}));


Ok(ReceiverStream::new(rx).map(Event::Control)) Ok(ReceiverStream::new(rx).map(Event::Control))
} }


async fn listen(control_listen_addr: SocketAddr, tx: mpsc::Sender<ControlEvent>) {
async fn listen(
control_listen_addr: SocketAddr,
tx: mpsc::Sender<ControlEvent>,
_finish_tx: mpsc::Sender<()>,
) {
let result = TcpListener::bind(control_listen_addr) let result = TcpListener::bind(control_listen_addr)
.await .await
.wrap_err("failed to listen for control messages"); .wrap_err("failed to listen for control messages");
@@ -51,7 +62,7 @@ async fn listen(control_listen_addr: SocketAddr, tx: mpsc::Sender<ControlEvent>)
match connection.wrap_err("failed to connect") { match connection.wrap_err("failed to connect") {
Ok((connection, _)) => { Ok((connection, _)) => {
let tx = tx.clone(); let tx = tx.clone();
tokio::spawn(handle_requests(connection, tx));
tokio::spawn(handle_requests(connection, tx, _finish_tx.clone()));
} }
Err(err) => { Err(err) => {
if tx.blocking_send(err.into()).is_err() { if tx.blocking_send(err.into()).is_err() {
@@ -62,7 +73,11 @@ async fn listen(control_listen_addr: SocketAddr, tx: mpsc::Sender<ControlEvent>)
} }
} }


async fn handle_requests(mut connection: TcpStream, tx: mpsc::Sender<ControlEvent>) {
async fn handle_requests(
mut connection: TcpStream,
tx: mpsc::Sender<ControlEvent>,
_finish_tx: mpsc::Sender<()>,
) {
loop { loop {
let next_request = tcp_receive(&mut connection).map(Either::Left); let next_request = tcp_receive(&mut connection).map(Either::Left);
let coordinator_stopped = tx.closed().map(Either::Right); let coordinator_stopped = tx.closed().map(Either::Right);


+ 1
- 1
binaries/coordinator/src/lib.rs View File

@@ -78,7 +78,7 @@ async fn start(runtime_path: &Path, tasks: &FuturesUnordered<JoinHandle<()>>) ->
let mut daemon_events_tx = Some(daemon_events_tx); let mut daemon_events_tx = Some(daemon_events_tx);
let daemon_events = ReceiverStream::new(daemon_events); let daemon_events = ReceiverStream::new(daemon_events);


let control_events = control::control_events(control_socket_addr())
let control_events = control::control_events(control_socket_addr(), tasks)
.await .await
.wrap_err("failed to create control events")?; .wrap_err("failed to create control events")?;




Loading…
Cancel
Save