fix: ensure final message is always delivered (#4569)

This commit is contained in:
Matthias Seitz
2023-09-12 22:03:20 +02:00
committed by GitHub
parent 60fa4f8457
commit b8e15fa10b
3 changed files with 74 additions and 33 deletions

View File

@ -11,6 +11,7 @@ use std::{
use tokio::sync::mpsc::{
self,
error::{SendError, TryRecvError, TrySendError},
OwnedPermit,
};
/// Wrapper around [mpsc::unbounded_channel] that returns a new unbounded metered channel.
@ -142,6 +143,18 @@ impl<T> MeteredSender<T> {
Self { sender, metrics: MeteredSenderMetrics::new(scope) }
}
/// Tries to acquire a permit to send a message.
///
/// See also [Sender](mpsc::Sender)'s `try_reserve_owned`.
pub fn try_reserve_owned(&self) -> Result<OwnedPermit<T>, TrySendError<mpsc::Sender<T>>> {
self.sender.clone().try_reserve_owned()
}
/// Returns the underlying [Sender](mpsc::Sender).
pub fn inner(&self) -> &mpsc::Sender<T> {
&self.sender
}
/// Calls the underlying [Sender](mpsc::Sender)'s `try_send`, incrementing the appropriate
/// metrics depending on the result.
pub fn try_send(&self, message: T) -> Result<(), TrySendError<T>> {