Skip to content

Commit 278f92f

Browse files
committed
store max-debounce-time in sendqueue
Signed-off-by: Robin Appelman <robin@icewind.nl>
1 parent f66ef2d commit 278f92f

2 files changed

Lines changed: 25 additions & 18 deletions

File tree

src/connection.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,7 @@ pub async fn handle_user_socket(
135135
// cryptographically secure. It is also OK to use same sequence for every connection.
136136
let mut rng = rand::rngs::SmallRng::seed_from_u64(0);
137137

138-
let mut send_queue = SendQueue::default();
138+
let mut send_queue = SendQueue::new(opts.max_debounce_time);
139139

140140
let mut reset = app.reset_rx();
141141

@@ -162,7 +162,7 @@ pub async fn handle_user_socket(
162162
break 'tx_loop;
163163
}
164164

165-
for msg in send_queue.drain(now, METRICS.active_connection_count() + 50000, opts.max_debounce_time) {
165+
for msg in send_queue.drain(now, METRICS.active_connection_count()) {
166166
last_send = now;
167167
METRICS.add_message(msg.message_type());
168168
log::debug!(target: "notify_push::send", "Sending debounced {msg} to {user_id}");

src/message.rs

Lines changed: 23 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -132,14 +132,21 @@ impl Default for SendQueueItem {
132132
}
133133
}
134134

135-
#[derive(Default, Debug)]
135+
/// Queue for sending outgoing messages to a user for debounce
136+
///
137+
/// The server maintains once queue per connection
138+
#[derive(Debug)]
136139
pub struct SendQueue {
140+
max_debounce_time: usize,
137141
items: [SendQueueItem; 3],
138142
}
139143

140144
impl SendQueue {
141-
pub fn new() -> Self {
142-
SendQueue::default()
145+
pub fn new(max_debounce_time: usize) -> Self {
146+
SendQueue {
147+
max_debounce_time,
148+
items: Default::default(),
149+
}
143150
}
144151

145152
fn item_mut(&mut self, message: &PushMessage) -> Option<&mut SendQueueItem> {
@@ -177,8 +184,8 @@ impl SendQueue {
177184
&mut self,
178185
now: Instant,
179186
connection_count: usize,
180-
max_debounce_time: usize,
181187
) -> impl Iterator<Item = PushMessage> + '_ {
188+
let max_debounce_time = self.max_debounce_time;
182189
self.items.iter_mut().filter_map(move |item| {
183190
let debounce_time = item
184191
.message
@@ -201,7 +208,7 @@ impl SendQueue {
201208
#[test]
202209
fn test_send_queue_100() {
203210
let base_time = Instant::now();
204-
let mut queue = SendQueue::new();
211+
let mut queue = SendQueue::new(15);
205212
queue.push(PushMessage::Activity, base_time);
206213
queue.push(
207214
PushMessage::File(UpdatedFiles::Known(vec![1].into())),
@@ -216,7 +223,7 @@ fn test_send_queue_100() {
216223
assert_eq!(
217224
Vec::<PushMessage>::new(),
218225
queue
219-
.drain(base_time + Duration::from_millis(20), 100, 15)
226+
.drain(base_time + Duration::from_millis(20), 100)
220227
.collect::<Vec<_>>()
221228
);
222229

@@ -227,7 +234,7 @@ fn test_send_queue_100() {
227234
PushMessage::Activity
228235
],
229236
queue
230-
.drain(base_time + Duration::from_millis(200), 100, 15)
237+
.drain(base_time + Duration::from_millis(200), 100)
231238
.collect::<Vec<_>>()
232239
);
233240

@@ -243,31 +250,31 @@ fn test_send_queue_100() {
243250
assert_eq!(
244251
Vec::<PushMessage>::new(),
245252
queue
246-
.drain(base_time + Duration::from_secs(10), 100, 15)
253+
.drain(base_time + Duration::from_secs(10), 100)
247254
.collect::<Vec<_>>()
248255
);
249256

250257
// after debounce time we get the merged messages from the timeframe
251258
assert_eq!(
252259
vec![PushMessage::File(UpdatedFiles::Known(vec![3, 4].into()))],
253260
queue
254-
.drain(base_time + Duration::from_secs(70), 100, 15)
261+
.drain(base_time + Duration::from_secs(70), 100)
255262
.collect::<Vec<_>>()
256263
);
257264

258265
// nothing left
259266
assert_eq!(
260267
Vec::<PushMessage>::new(),
261268
queue
262-
.drain(base_time + Duration::from_secs(300), 100, 15)
269+
.drain(base_time + Duration::from_secs(300), 100)
263270
.collect::<Vec<_>>()
264271
);
265272
}
266273

267274
#[test]
268275
fn test_send_queue_1() {
269276
let base_time = Instant::now();
270-
let mut queue = SendQueue::new();
277+
let mut queue = SendQueue::new(15);
271278
queue.push(PushMessage::Activity, base_time);
272279
queue.push(
273280
PushMessage::File(UpdatedFiles::Known(vec![1].into())),
@@ -282,7 +289,7 @@ fn test_send_queue_1() {
282289
assert_eq!(
283290
Vec::<PushMessage>::new(),
284291
queue
285-
.drain(base_time + Duration::from_millis(20), 1, 15)
292+
.drain(base_time + Duration::from_millis(20), 1)
286293
.collect::<Vec<_>>()
287294
);
288295

@@ -293,7 +300,7 @@ fn test_send_queue_1() {
293300
PushMessage::Activity
294301
],
295302
queue
296-
.drain(base_time + Duration::from_millis(200), 1, 15)
303+
.drain(base_time + Duration::from_millis(200), 1)
297304
.collect::<Vec<_>>()
298305
);
299306

@@ -309,23 +316,23 @@ fn test_send_queue_1() {
309316
assert_eq!(
310317
Vec::<PushMessage>::new(),
311318
queue
312-
.drain(base_time + Duration::from_secs(1), 1, 15)
319+
.drain(base_time + Duration::from_secs(1), 1)
313320
.collect::<Vec<_>>()
314321
);
315322

316323
// after debounce time we get the merged messages from the timeframe
317324
assert_eq!(
318325
vec![PushMessage::File(UpdatedFiles::Known(vec![3, 4].into()))],
319326
queue
320-
.drain(base_time + Duration::from_secs(3), 1, 15)
327+
.drain(base_time + Duration::from_secs(3), 1)
321328
.collect::<Vec<_>>()
322329
);
323330

324331
// nothing left
325332
assert_eq!(
326333
Vec::<PushMessage>::new(),
327334
queue
328-
.drain(base_time + Duration::from_secs(5), 1, 15)
335+
.drain(base_time + Duration::from_secs(5), 1)
329336
.collect::<Vec<_>>()
330337
);
331338
}

0 commit comments

Comments
 (0)