Skip to content

Commit

Permalink
Auto merge of #13860 - ehuss:max_download_size-test-time-fix, r=epage
Browse files Browse the repository at this point in the history
Fix global_cache_tracker::max_download_size test flakiness

This (hopefully) fixes an issue where the `global_cache_tracker::max_download_size` test was sporadically failing on CI. My theory is that the `populate_cache` function was inconsistently saving entries with either the same timestamp or timestamps that differed by 1 second. The SQL query in `get_registry_items_to_clean_size_both` sorts the results based on `(timestamp,name)`. Thus if the timestamps were the same, it was sorting on name. If they differed, then the timestamp would dominate. The solution is to force the tests to use the same basis for the starting time so that a function call like `days_ago(1)` returns consistent results.

I don't have a particularly good way to reproduce the issue. Adding a sleep into `populate_cache` causes 100% errors. Running on a slowed down system, or perhaps GitHub Actions might also reproduce, but I did not try.
  • Loading branch information
bors committed May 4, 2024
2 parents 05364cb + b44edc5 commit d72d0b2
Showing 1 changed file with 13 additions and 1 deletion.
14 changes: 13 additions & 1 deletion tests/testsuite/global_cache_tracker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ use std::fmt::Write;
use std::path::Path;
use std::path::PathBuf;
use std::process::Stdio;
use std::sync::OnceLock;
use std::time::{Duration, SystemTime};

/// Helper to create a simple `foo` project which depends on a registry
Expand Down Expand Up @@ -72,7 +73,18 @@ fn get_git_checkout_names(db_name: &str) -> Vec<String> {
}

fn days_ago(n: u64) -> SystemTime {
SystemTime::now() - Duration::from_secs(60 * 60 * 24 * n)
now() - Duration::from_secs(60 * 60 * 24 * n)
}

fn now() -> SystemTime {
// This captures the time once to avoid potential time boundaries or
// inconsistencies affecting a test. For example, on a fast system
// `days_ago(1)` called twice in a row will return the same answer.
// However, on a slower system, or if the clock happens to flip over from
// one second to the next, then it would return different answers. This
// ensures that it always returns the same answer.
static START: OnceLock<SystemTime> = OnceLock::new();
*START.get_or_init(|| SystemTime::now())
}

/// Helper for simulating running cargo in the past. Use with the
Expand Down

0 comments on commit d72d0b2

Please sign in to comment.