From 0b754cbbf30e8af840fb532e99f0d6a85a552f3c Mon Sep 17 00:00:00 2001 From: WenyXu Date: Wed, 23 Sep 2026 03:18:43 +0000 Subject: [PATCH] fix: cover Windows path and time limits in full test CI Signed-off-by: WenyXu --- .github/workflows/rust.yml | 18 ++++++++--------- src/mito2/src/cache/write_cache.rs | 3 ++- src/query/src/promql/label_values.rs | 29 ++++++++++++++++++---------- 3 files changed, 30 insertions(+), 20 deletions(-) diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml index d4b76b8738f..215da11920b 100644 --- a/.github/workflows/rust.yml +++ b/.github/workflows/rust.yml @@ -157,9 +157,9 @@ jobs: env: RUSTFLAGS: "-D warnings" - test-windows-filesystem: + test-windows: if: ${{ github.repository == 'GreptimeTeam/greptimedb' && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }} - name: Test Windows filesystem + name: Test Windows runs-on: windows-2022 timeout-minutes: 90 env: @@ -187,17 +187,17 @@ jobs: - name: Rust Cache uses: Swatinem/rust-cache@v2 with: - shared-key: "test-windows-filesystem" + shared-key: "test-windows" cache-all-crates: "true" save-if: ${{ github.ref == 'refs/heads/main' }} - name: Install Cargo Nextest uses: taiki-e/install-action@nextest - - name: Run filesystem regression tests - # Keep this focused and omit dashboard, which requires WSL on Windows. - run: >- - cargo nextest run --locked --lib - -p object-store -p common-datasource -p cli - -E 'package(=object-store) | package(=common-datasource) | (package(=cli) & test(metadata::snapshot::tests::))' + - name: Install WSL distribution + uses: Vampire/setup-wsl@v2 + with: + distribution: Ubuntu-22.04 + - name: Run Windows tests + run: cargo nextest run --locked --workspace -F dashboard --no-fail-fast conflict-check: if: ${{ github.repository == 'GreptimeTeam/greptimedb' && (github.event_name != 'pull_request' || github.event.pull_request.draft == false) }} diff --git a/src/mito2/src/cache/write_cache.rs b/src/mito2/src/cache/write_cache.rs index 0e96c2f16a2..87ab4f0081a 100644 --- a/src/mito2/src/cache/write_cache.rs +++ b/src/mito2/src/cache/write_cache.rs @@ -790,7 +790,8 @@ mod tests { async fn test_read_metadata_from_write_cache() { common_telemetry::init_default_ut_logging(); let mut env = TestEnv::new().await; - let data_home = env.data_home().display().to_string(); + // Object keys are relative to the mock store root, not native paths. + let data_home = "write-cache-test".to_string(); let mock_store = env.init_object_store_manager(); let local_dir = create_temp_dir(""); diff --git a/src/query/src/promql/label_values.rs b/src/query/src/promql/label_values.rs index 44c173477bb..841666758e4 100644 --- a/src/query/src/promql/label_values.rs +++ b/src/query/src/promql/label_values.rs @@ -37,15 +37,15 @@ fn millis_since_epoch(time: SystemTime) -> Result { Ok(duration) => (duration.as_millis(), false), Err(earlier) => (earlier.duration().as_millis(), true), }; - let millis = i64::try_from(millis) - .ok() - .with_context(|| SystemTimeOutOfRangeSnafu { time })?; + let millis = + signed_millis(millis, before_epoch).with_context(|| SystemTimeOutOfRangeSnafu { time })?; + Ok(Timestamp::new_millisecond(millis)) +} - Ok(Timestamp::new_millisecond(if before_epoch { - -millis - } else { - millis - })) +/// Converts a millisecond magnitude and epoch direction without platform time limits. +fn signed_millis(millis: u128, before_epoch: bool) -> Option { + let millis = i64::try_from(millis).ok()?; + Some(if before_epoch { -millis } else { millis }) } fn build_time_filter(time_index_expr: Expr, start: Timestamp, end: Timestamp) -> Expr { @@ -139,7 +139,16 @@ mod tests { #[test] fn millis_beyond_i64_are_rejected() { - let time = UNIX_EPOCH + Duration::from_secs(1 << 60); - assert!(millis_since_epoch(time).is_err()); + let limit = i64::MAX as u128; + assert_eq!(signed_millis(limit, false), Some(i64::MAX)); + assert_eq!(signed_millis(limit, true), Some(-i64::MAX)); + assert_eq!(signed_millis(limit + 1, false), None); + assert_eq!(signed_millis(limit + 1, true), None); + + // Windows cannot represent this SystemTime. The conversion boundary is + // tested above on every platform; exercise the wrapper where possible. + if let Some(time) = UNIX_EPOCH.checked_add(Duration::from_millis(i64::MAX as u64 + 1)) { + assert!(millis_since_epoch(time).is_err()); + } } }