diff --git a/Cargo.lock b/Cargo.lock index 31e40f601dfa6521a83c04b726f7b8f9fb9c0a8c..e830a8a6f8af28e47053636a6280037a72b66838 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,7 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 - [[package]] name = "addr2line" version = "0.16.0" diff --git a/src/message.rs b/src/message.rs index f4c4aec87cc66bbed2f802150cabcf667ae4301c..9c948d10466825abcd8b0a69239e35a05b263939 100644 --- a/src/message.rs +++ b/src/message.rs @@ -1,4 +1,5 @@ use parse_display::Display; +use rand::{thread_rng, Rng}; use serde_json::Value; use std::fmt::Write; use std::sync::atomic::{AtomicBool, Ordering}; @@ -84,19 +85,25 @@ impl DebounceMap { } pub fn get_held_messages(&self) -> impl Iterator<Item = MessageType> { - self.file_held - .then(|| MessageType::File) + let file_opt = if self.file_held { + Some(MessageType::File) + } else { + None + }; + let activity_opt = if self.activity_held { + Some(MessageType::Activity) + } else { + None + }; + let notification_opt = if self.notification_held { + Some(MessageType::Notification) + } else { + None + }; + file_opt .into_iter() - .chain( - self.activity_held - .then(|| MessageType::Activity) - .into_iter(), - ) - .chain( - self.notification_held - .then(|| MessageType::Notification) - .into_iter(), - ) + .chain(activity_opt.into_iter()) + .chain(notification_opt.into_iter()) } fn get_last_send(&self, ty: &MessageType) -> Instant { @@ -109,10 +116,13 @@ impl DebounceMap { } fn set_last_send(&mut self, ty: &MessageType) { + // apply a randomized offset to the last_send + // this helps mitigate against load bursts from many clients receiving the same updates + let spread = Duration::from_millis(thread_rng().gen_range(0..1000)); match ty { - MessageType::File => self.file = Instant::now(), - MessageType::Activity => self.activity = Instant::now(), - MessageType::Notification => self.notification = Instant::now(), + MessageType::File => self.file = Instant::now() - spread, + MessageType::Activity => self.activity = Instant::now() - spread, + MessageType::Notification => self.notification = Instant::now() - spread, MessageType::Custom(..) => {} // no debouncing for custom messages } }