mirror of
https://github.com/neondatabase/neon.git
synced 2026-01-13 16:32:56 +00:00
Follows on from #6050 , in which we upload heatmaps. Secondary locations will now poll those heatmaps and download layers mentioned in the heatmap. TODO: - [X] ~Unify/reconcile stats for behind-schedule execution with warn_when_period_overrun (https://github.com/neondatabase/neon/pull/6050#discussion_r1426560695)~ - [x] Give downloads their own concurrency config independent of uploads Deferred optimizations: - https://github.com/neondatabase/neon/issues/6199 - https://github.com/neondatabase/neon/issues/6200 Eviction will be the next PR: - #5342
36 lines
891 B
Rust
36 lines
891 B
Rust
use tokio_util::sync::CancellationToken;
|
|
|
|
#[derive(thiserror::Error, Debug)]
|
|
pub enum YieldingLoopError {
|
|
#[error("Cancelled")]
|
|
Cancelled,
|
|
}
|
|
|
|
/// Helper for long synchronous loops, e.g. over all tenants in the system. Periodically
|
|
/// yields to avoid blocking the executor, and after resuming checks the provided
|
|
/// cancellation token to drop out promptly on shutdown.
|
|
#[inline(always)]
|
|
pub async fn yielding_loop<I, T, F>(
|
|
interval: usize,
|
|
cancel: &CancellationToken,
|
|
iter: I,
|
|
mut visitor: F,
|
|
) -> Result<(), YieldingLoopError>
|
|
where
|
|
I: Iterator<Item = T>,
|
|
F: FnMut(T),
|
|
{
|
|
for (i, item) in iter.enumerate() {
|
|
visitor(item);
|
|
|
|
if i + 1 % interval == 0 {
|
|
tokio::task::yield_now().await;
|
|
if cancel.is_cancelled() {
|
|
return Err(YieldingLoopError::Cancelled);
|
|
}
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|