This is an automated email from the ASF dual-hosted git repository.
github-merge-queue[bot] pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git
The following commit(s) were added to refs/heads/main by this push:
new df4dc3ede5 Run Miri on a daily schedule, require it before releases
(#11631)
df4dc3ede5 is described below
commit df4dc3ede59bd43b5f71847231212381d068bb72
Author: Kosta Tarasov <[email protected]>
AuthorDate: Fri Oct 23 07:02:16 2026 +0000
Run Miri on a daily schedule, require it before releases (#11631)
## Which issue does this PR close?
Part of #11548.
## Rationale for this change
Miri runs are expensive and delay the merge queue. Run Miri daily and on
demand before a release.
## What changes are included in this PR?
- Remove Miri from merge-queue execution and required checks.
- Enable manual runs through `workflow_dispatch`.
- Run Miri daily 3:17 UTC
- Add release instructions to run Miri before cutting a release commit,
verify all partitions pass, and link the results in the release issue.
## Are these changes tested?
Updated CI routing tests pass. Workflow linting, Markdown formatting,
and spelling checks pass. The Miri suite itself was not run.
## Are there any significant user-facing changes?
No.
AI assisted with implementation and validation.
---------
Co-authored-by: Andrew Lamb <[email protected]>
---
.github/ci/scripts/check-ci-config.py | 13 +++++--------
.github/ci/scripts/compute-changes.py | 2 +-
.github/workflows/README.md | 6 +++++-
.github/workflows/ci.yml | 12 ++++--------
.github/workflows/miri.yaml | 8 ++++++--
dev/release/README.md | 13 +++++++++++++
6 files changed, 34 insertions(+), 20 deletions(-)
diff --git a/.github/ci/scripts/check-ci-config.py
b/.github/ci/scripts/check-ci-config.py
index 2648251b4f..a902b9b4b2 100644
--- a/.github/ci/scripts/check-ci-config.py
+++ b/.github/ci/scripts/check-ci-config.py
@@ -100,8 +100,8 @@ def validate_config(root=ROOT):
ci = load_yaml(workflows / "ci.yml")
filters = load_yaml(root / ".github/ci/paths.yaml")
jobs = ci["jobs"]
- suites = set(filters["suites"]) | ALWAYS | {"miri"}
- assert not (set(filters["suites"]) & (ALWAYS | {"miri"})), "Unexpected
filtered suite"
+ suites = set(filters["suites"]) | ALWAYS
+ assert not (set(filters["suites"]) & ALWAYS), "Unexpected filtered suite"
assert set(jobs) == suites | {"changes", "required-checks"}, "CI suites
and jobs differ"
# PyYAML's YAML 1.1 loader treats the key 'on' as the boolean True.
events = ci[True]
@@ -146,8 +146,6 @@ def validate_config(root=ROOT):
and "workflow_call" in load_yaml(path).get(True, {})
}
assert called == reusable, "A reusable workflow is missing from Required
Checks"
- miri = load_yaml(workflows / "miri.yaml")["jobs"]["miri-checks"]
- assert "if" not in miri, "Miri event routing belongs in compute-changes.py"
print("CI configuration is valid")
@@ -165,7 +163,7 @@ class RoutingTests(unittest.TestCase):
def test_event_policy(self):
for paths in [[], ["README.md"], ["arrow-buffer/src/lib.rs"]]:
with self.subTest(paths=paths):
- self.assertEqual(self.select("merge_group", paths),
self.all_suites | {"miri"})
+ self.assertEqual(self.select("merge_group", paths),
self.all_suites)
self.assertEqual(self.select("push", paths), {"docs",
"integration", "parquet"})
self.assertNotIn("miri", self.select("pull_request", paths))
with self.assertRaises(ValueError):
@@ -173,7 +171,7 @@ class RoutingTests(unittest.TestCase):
def test_selector_outputs(self):
for event, expected in [("push", {"docs", "integration", "parquet"}),
- ("merge_group", self.all_suites | {"miri"}),
+ ("merge_group", self.all_suites),
("pull_request", self.always)]:
with self.subTest(event=event), tempfile.TemporaryDirectory() as
directory:
output = Path(directory) / "output"
@@ -235,10 +233,9 @@ class ConfigurationTests(unittest.TestCase):
def test_configuration_regressions(self):
cases = [
(".asf.yaml", '"Required Checks"', '"Missing Check"'),
- (".github/workflows/ci.yml", " - miri\n", ""),
+ (".github/workflows/ci.yml", " - arrow\n", ""),
(".github/workflows/ci.yml", " pull_request:\n", "
pull_request:\n paths: ['arrow/**']\n"),
(".github/workflows/ci.yml", " if: always()", " if:
success()"),
- (".github/workflows/miri.yaml", " name: MIRI\n", " name:
MIRI\n if: github.event_name == 'merge_group'\n"),
(".github/workflows/arrow.yml", " workflow_call:", "
workflow_call:\n pull_request:"),
(".github/ci/paths.yaml", " - arrow-integration-testing/**\n",
""),
(".github/workflows/ci.yml", " cache-refresh-only: ${{
steps.select.outputs.cache-refresh-only }}\n", ""),
diff --git a/.github/ci/scripts/compute-changes.py
b/.github/ci/scripts/compute-changes.py
index 0b8706206c..748180b4e0 100644
--- a/.github/ci/scripts/compute-changes.py
+++ b/.github/ci/scripts/compute-changes.py
@@ -36,7 +36,7 @@ def load_yaml(path):
def select_suites(event, paths, filters):
suites = set(filters["suites"]) | ALWAYS
if event == "merge_group":
- return sorted(suites | {"miri"})
+ return sorted(suites)
if event == "push":
# The queue already tested the merge result. Publish docs and populate
# main's caches through the reusable workflows' cache-refresh-only
mode.
diff --git a/.github/workflows/README.md b/.github/workflows/README.md
index d5c5d915c6..74ea738595 100644
--- a/.github/workflows/README.md
+++ b/.github/workflows/README.md
@@ -18,6 +18,10 @@
-->
CI runs a subset of checks on pull requests, selected by the changed files.
-The merge queue runs the full test suite against the proposed merge result.
+The merge queue runs the full test suite, except Miri, against the proposed
merge result.
Pushes to `main` populate caches and publish documentation without repeating
tests.
A single required status check combines the results and blocks merging on
failure.
+
+Miri runs separately every day at 03:17 UTC and on demand through the `miri`
+workflow's **Run workflow** button or
+`gh workflow run miri.yaml --repo apache/arrow-rs --ref <branch-or-tag>`.
diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml
index dcd624568c..6585f1a278 100644
--- a/.github/workflows/ci.yml
+++ b/.github/workflows/ci.yml
@@ -110,11 +110,6 @@ jobs:
contents: write
uses: ./.github/workflows/docs.yml
- miri:
- needs: changes
- if: contains(fromJSON(needs.changes.outputs.suites), 'miri')
- uses: ./.github/workflows/miri.yaml
-
required-checks:
# Like datafusion-comet: one stable check name even when a reusable
# workflow is skipped (its individual check names would be different).
@@ -131,15 +126,16 @@ jobs:
- dev
- rust
- docs
- - miri
runs-on: ubuntu-slim
steps:
- name: Summarize suite results
env:
NEEDS: ${{ toJSON(needs) }}
run: echo "$NEEDS"
- # Path-filtered suites and Miri outside the queue are intentionally
- # skipped. A failed/cancelled selector or suite must still block merging.
+ # Path-filtered suites are intentionally skipped. A failed/cancelled
+ # selector or suite must still block merging.
+ # Miri runs separately to reduce runner time:
+ # https://github.com/apache/arrow-rs/issues/11548
- name: Fail if any suite failed or was cancelled
if: needs.changes.result != 'success' || contains(needs.*.result,
'failure') || contains(needs.*.result, 'cancelled')
run: |
diff --git a/.github/workflows/miri.yaml b/.github/workflows/miri.yaml
index 3d99720004..48eb1d0df5 100644
--- a/.github/workflows/miri.yaml
+++ b/.github/workflows/miri.yaml
@@ -17,9 +17,13 @@
name: miri
-# Triggered by ci.yml, which owns event routing and concurrency.
+# Run daily and on demand, including before cutting a release candidate.
+# Keep Miri out of the merge queue to reduce runner time:
+# https://github.com/apache/arrow-rs/issues/11548
on:
- workflow_call:
+ schedule:
+ - cron: "17 3 * * *"
+ workflow_dispatch:
permissions:
contents: read
diff --git a/dev/release/README.md b/dev/release/README.md
index 35ffc8f12d..87a5a213c3 100644
--- a/dev/release/README.md
+++ b/dev/release/README.md
@@ -92,6 +92,19 @@ Note that when reviewing the change log, rather than editing
the
Merge this PR to `main` prior to the next step.
+## Verify Miri results (required)
+
+Before cutting a release candidate, run the
+[Miri workflow](https://github.com/apache/arrow-rs/actions/workflows/miri.yaml)
+on `main`:
+
+```shell
+gh workflow run miri.yaml --repo apache/arrow-rs --ref main
+```
+
+All partitions must pass before creating the RC tag. Review the results and
+link the run in the release tracking issue.
+
## Prepare release candidate tarball
After you have merged the updates to the `CHANGELOG` and version,