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:
Suhas Thalanki
2025-07-03 13:10:30 -04:00
committed by GitHub
parent 305fe61ac1
commit 46158ee63f

View File

@@ -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();
} }
}); });