Optimize watcher range collection on notify.
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
@@ -8,11 +8,12 @@ use std::{
|
|||||||
use futures::pin_mut;
|
use futures::pin_mut;
|
||||||
use serde::Serialize;
|
use serde::Serialize;
|
||||||
use tokio::sync::watch::{Sender, channel};
|
use tokio::sync::watch::{Sender, channel};
|
||||||
use tuwunel_core::implement;
|
use tuwunel_core::{implement, smallvec::SmallVec};
|
||||||
|
|
||||||
use crate::keyval::{KeyBuf, serialize_key};
|
use crate::keyval::{KeyBuf, serialize_key};
|
||||||
|
|
||||||
type Watchers = Mutex<BTreeMap<KeyBuf, Sender<()>>>;
|
type Watchers = Mutex<BTreeMap<KeyBuf, Sender<()>>>;
|
||||||
|
type KeyVec = SmallVec<[KeyBuf; 1]>;
|
||||||
|
|
||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub(super) struct Watch {
|
pub(super) struct Watch {
|
||||||
@@ -71,7 +72,7 @@ where
|
|||||||
.take_while(|(k, _)| key.as_ref().starts_with(k))
|
.take_while(|(k, _)| key.as_ref().starts_with(k))
|
||||||
.filter_map(|(k, tx)| tx.send(()).is_err().then_some(k))
|
.filter_map(|(k, tx)| tx.send(()).is_err().then_some(k))
|
||||||
.cloned()
|
.cloned()
|
||||||
.collect::<Vec<_>>()
|
.collect::<KeyVec>()
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.for_each(|k| {
|
.for_each(|k| {
|
||||||
watchers.remove(&k);
|
watchers.remove(&k);
|
||||||
|
|||||||
Reference in New Issue
Block a user