use super::SelfStreams;
use crate::ServerError;
impl SelfStreams {
pub(in crate::server) fn stop(&self) -> Result<(), ServerError> {
let stopped = self.queue.stop();
if self.queue.was_abandoned() {
stopped?;
return Err(Self::failure(
"record drainer join remains unconfirmed after owned drain abandonment",
));
}
let mut owner = self.drainer.lock().map_err(|error| {
Self::failure(&format!("record drainer join lock poisoned: {error}"))
})?;
owner.stopped = true;
drop(owner.worker.take());
let joined = owner.thread.take().map_or(Ok(()), |thread| {
thread
.join()
.map_err(|_| Self::failure("record drainer join panicked"))
});
drop(owner);
match (stopped, joined) {
(Err(error), Err(join_error)) => {
tracing::error!(%join_error, "record drainer teardown also failed");
Err(error)
}
(Err(error), Ok(())) | (Ok(()), Err(error)) => Err(error),
(Ok(()), Ok(())) => Ok(()),
}
}
}