From 2cf2aedf4f495298283a104f4e85ba8062b0d878 Mon Sep 17 00:00:00 2001 From: Joris Bayer Date: Thu, 19 Sep 2024 13:05:04 +0200 Subject: [PATCH] fix(buffer): Optimistically initialize stacks as ready --- .../src/services/buffer/envelope_buffer/mod.rs | 10 ++++++---- relay-server/src/services/buffer/mod.rs | 4 ++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/relay-server/src/services/buffer/envelope_buffer/mod.rs b/relay-server/src/services/buffer/envelope_buffer/mod.rs index aa819c11f0..9ae469f2f6 100644 --- a/relay-server/src/services/buffer/envelope_buffer/mod.rs +++ b/relay-server/src/services/buffer/envelope_buffer/mod.rs @@ -292,7 +292,7 @@ where }, Priority { readiness, - next_project_fetch: next_peek, + next_project_fetch, .. }, )) = self.priority_queue.peek_mut() @@ -305,7 +305,7 @@ where Ok(match (stack.peek().await?, ready) { (None, _) => Peek::Empty, (Some(envelope), true) => Peek::Ready(envelope), - (Some(envelope), false) => Peek::NotReady(*stack_key, *next_peek, envelope), + (Some(envelope), false) => Peek::NotReady(*stack_key, *next_project_fetch, envelope), }) } @@ -607,9 +607,11 @@ struct Readiness { impl Readiness { fn new() -> Self { + // Optimistically set ready state to true. + // The large majority of stack creations are re-creations after a stack was emptied. Self { - own_project_ready: false, - sampling_project_ready: false, + own_project_ready: true, + sampling_project_ready: true, } } diff --git a/relay-server/src/services/buffer/mod.rs b/relay-server/src/services/buffer/mod.rs index d02bbf87a3..8a0719e3ce 100644 --- a/relay-server/src/services/buffer/mod.rs +++ b/relay-server/src/services/buffer/mod.rs @@ -237,7 +237,7 @@ impl EnvelopeBufferService { self.services.project_cache.send(DequeuedEnvelope(envelope)); self.sleep = Duration::ZERO; // try next pop immediately } - Peek::NotReady(stack_key, next_peek, envelope) => { + Peek::NotReady(stack_key, next_project_fetch, envelope) => { relay_log::trace!("EnvelopeBufferService: project(s) of envelope not ready"); relay_statsd::metric!( counter(RelayCounters::BufferTryPop) += 1, @@ -247,7 +247,7 @@ impl EnvelopeBufferService { // We want to fetch the configs again, only if some time passed between the last // peek of this not ready project key pair and the current peek. This is done to // avoid flooding the project cache with `UpdateProject` messages. - if Instant::now() >= next_peek { + if Instant::now() >= next_project_fetch { relay_log::trace!("EnvelopeBufferService: requesting project(s) update"); let project_key = envelope.meta().public_key(); self.services.project_cache.send(UpdateProject(project_key));