mirror of
https://github.com/kanidm/kanidm.git
synced 2025-02-23 12:37:00 +01:00
signal handling for tasks daemon (#1651)
This commit is contained in:
parent
fcab605320
commit
21d372c09f
|
@ -35,6 +35,7 @@ use sketching::tracing_forest::traits::*;
|
|||
use sketching::tracing_forest::util::*;
|
||||
use sketching::tracing_forest::{self};
|
||||
use tokio::net::{UnixListener, UnixStream};
|
||||
use tokio::sync::broadcast;
|
||||
use tokio::sync::mpsc::{channel, Receiver, Sender};
|
||||
use tokio::sync::oneshot;
|
||||
use tokio::time;
|
||||
|
@ -683,9 +684,18 @@ async fn main() -> ExitCode {
|
|||
|
||||
let task_channel_tx_cln = task_channel_tx.clone();
|
||||
|
||||
tokio::spawn(async move {
|
||||
// Start to build the worker tasks
|
||||
let (broadcast_tx, mut broadcast_rx) = broadcast::channel(4);
|
||||
let mut c_broadcast_rx = broadcast_tx.subscribe();
|
||||
|
||||
let task_b = tokio::spawn(async move {
|
||||
loop {
|
||||
match task_listener.accept().await {
|
||||
tokio::select! {
|
||||
_ = c_broadcast_rx.recv() => {
|
||||
break;
|
||||
}
|
||||
accept_res = task_listener.accept() => {
|
||||
match accept_res {
|
||||
Ok((socket, _addr)) => {
|
||||
// Did it come from root?
|
||||
if let Ok(ucred) = socket.peer_cred() {
|
||||
|
@ -715,16 +725,23 @@ async fn main() -> ExitCode {
|
|||
error!("Task Accept error -> {:?}", err);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
// done
|
||||
}
|
||||
});
|
||||
|
||||
// TODO: Setup a task that handles pre-fetching here.
|
||||
|
||||
let server = async move {
|
||||
let task_a = tokio::spawn(async move {
|
||||
loop {
|
||||
let tc_tx = task_channel_tx_cln.clone();
|
||||
match listener.accept().await {
|
||||
|
||||
tokio::select! {
|
||||
_ = broadcast_rx.recv() => {
|
||||
break;
|
||||
}
|
||||
accept_res = listener.accept() => {
|
||||
match accept_res {
|
||||
Ok((socket, _addr)) => {
|
||||
let cachelayer_ref = cachelayer.clone();
|
||||
tokio::spawn(async move {
|
||||
|
@ -739,11 +756,59 @@ async fn main() -> ExitCode {
|
|||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
});
|
||||
|
||||
info!("Server started ...");
|
||||
|
||||
server.await;
|
||||
loop {
|
||||
tokio::select! {
|
||||
Ok(()) = tokio::signal::ctrl_c() => {
|
||||
break
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::terminate();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
break
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::alarm();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::hangup();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::user_defined1();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::user_defined2();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
info!("Signal received, shutting down");
|
||||
// Send a broadcast that we are done.
|
||||
if let Err(e) = broadcast_tx.send(true) {
|
||||
error!("Unable to shutdown workers {:?}", e);
|
||||
}
|
||||
|
||||
let _ = task_a.await;
|
||||
let _ = task_b.await;
|
||||
|
||||
ExitCode::SUCCESS
|
||||
})
|
||||
.await
|
||||
|
|
|
@ -28,6 +28,7 @@ use sketching::tracing_forest::traits::*;
|
|||
use sketching::tracing_forest::util::*;
|
||||
use sketching::tracing_forest::{self};
|
||||
use tokio::net::UnixStream;
|
||||
use tokio::sync::broadcast;
|
||||
use tokio::time;
|
||||
use tokio_util::codec::{Decoder, Encoder, Framed};
|
||||
use users::{get_effective_gid, get_effective_uid};
|
||||
|
@ -262,12 +263,18 @@ async fn main() -> ExitCode {
|
|||
let task_sock_path = cfg.task_sock_path.clone();
|
||||
debug!("Attempting to use {} ...", task_sock_path);
|
||||
|
||||
let server = async move {
|
||||
let (broadcast_tx, mut broadcast_rx) = broadcast::channel(4);
|
||||
|
||||
let server = tokio::spawn(async move {
|
||||
loop {
|
||||
info!("Attempting to connect to kanidm_unixd ...");
|
||||
// Try to connect to the daemon.
|
||||
match UnixStream::connect(&task_sock_path).await {
|
||||
// Did we connect?
|
||||
|
||||
tokio::select! {
|
||||
_ = broadcast_rx.recv() => {
|
||||
break;
|
||||
}
|
||||
connect_res = UnixStream::connect(&task_sock_path) => {
|
||||
match connect_res {
|
||||
Ok(stream) => {
|
||||
info!("Found kanidm_unixd, waiting for tasks ...");
|
||||
// Yep! Now let the main handler do it's job.
|
||||
|
@ -275,16 +282,63 @@ async fn main() -> ExitCode {
|
|||
handle_tasks(stream, &cfg).await;
|
||||
}
|
||||
Err(e) => {
|
||||
error!("Unable to find kanidm_unixd, sleeping ...");
|
||||
debug!("\\---> {:?}", e);
|
||||
error!("Unable to find kanidm_unixd, sleeping ...");
|
||||
// Back off.
|
||||
time::sleep(Duration::from_millis(5000)).await;
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
server.await;
|
||||
info!("Server started ...");
|
||||
|
||||
loop {
|
||||
tokio::select! {
|
||||
Ok(()) = tokio::signal::ctrl_c() => {
|
||||
break
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::terminate();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
break
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::alarm();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::hangup();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::user_defined1();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
Some(()) = async move {
|
||||
let sigterm = tokio::signal::unix::SignalKind::user_defined2();
|
||||
tokio::signal::unix::signal(sigterm).unwrap().recv().await
|
||||
} => {
|
||||
// Ignore
|
||||
}
|
||||
}
|
||||
}
|
||||
info!("Signal received, shutting down");
|
||||
// Send a broadcast that we are done.
|
||||
if let Err(e) = broadcast_tx.send(true) {
|
||||
error!("Unable to shutdown workers {:?}", e);
|
||||
}
|
||||
|
||||
let _ = server.await;
|
||||
ExitCode::SUCCESS
|
||||
})
|
||||
.await
|
||||
|
|
Loading…
Reference in a new issue