mirror of
https://github.com/neondatabase/neon.git
synced 2025-12-23 06:09:59 +00:00
fix(compute): background installed extensions worker would collect data without waiting for interval (#12465)
## Problem The background installed extensions worker relied on `interval.tick()` to go to sleep for a period of time. This can lead to bugs due to the interval being updated at the end of the loop as the first tick is [instantaneous](https://docs.rs/tokio/latest/tokio/time/struct.Interval.html#method.tick). ## Summary of changes Changed it to a `tokio::time::sleep` to prevent this issue. Now it puts the thread to sleep and only wakes up after the specified duration
This commit is contained in:
@@ -2371,24 +2371,23 @@ LIMIT 100",
|
|||||||
installed_extensions_collection_interval
|
installed_extensions_collection_interval
|
||||||
);
|
);
|
||||||
let handle = tokio::spawn(async move {
|
let handle = tokio::spawn(async move {
|
||||||
// An initial sleep is added to ensure that two collections don't happen at the same time.
|
|
||||||
// The first collection happens during compute startup.
|
|
||||||
tokio::time::sleep(tokio::time::Duration::from_secs(
|
|
||||||
installed_extensions_collection_interval,
|
|
||||||
))
|
|
||||||
.await;
|
|
||||||
let mut interval = tokio::time::interval(tokio::time::Duration::from_secs(
|
|
||||||
installed_extensions_collection_interval,
|
|
||||||
));
|
|
||||||
loop {
|
loop {
|
||||||
interval.tick().await;
|
info!(
|
||||||
|
"[NEON_EXT_INT_SLEEP]: Interval: {}",
|
||||||
|
installed_extensions_collection_interval
|
||||||
|
);
|
||||||
|
// Sleep at the start of the loop to ensure that two collections don't happen at the same time.
|
||||||
|
// The first collection happens during compute startup.
|
||||||
|
tokio::time::sleep(tokio::time::Duration::from_secs(
|
||||||
|
installed_extensions_collection_interval,
|
||||||
|
))
|
||||||
|
.await;
|
||||||
let _ = installed_extensions(conf.clone()).await;
|
let _ = installed_extensions(conf.clone()).await;
|
||||||
// Acquire a read lock on the compute spec and then update the interval if necessary
|
// Acquire a read lock on the compute spec and then update the interval if necessary
|
||||||
interval = tokio::time::interval(tokio::time::Duration::from_secs(std::cmp::max(
|
installed_extensions_collection_interval = std::cmp::max(
|
||||||
installed_extensions_collection_interval,
|
installed_extensions_collection_interval,
|
||||||
2 * atomic_interval.load(std::sync::atomic::Ordering::SeqCst),
|
2 * atomic_interval.load(std::sync::atomic::Ordering::SeqCst),
|
||||||
)));
|
);
|
||||||
installed_extensions_collection_interval = interval.period().as_secs();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user