Skip to content

Nightly Sanitizer Stress #50

Nightly Sanitizer Stress

Nightly Sanitizer Stress #50

name: Nightly Sanitizer Stress
# Proactively hunt narrow, runner-specific concurrency bugs (data races,
# use-after-free, UB) that the PR-time cpp-tsan / cpp-sanitizer smokes only
# catch by luck on a single pass. This runs the SAME smoke scripts but with
# STRESS_MULTIPLIER cranked up, so the race window is hammered many times more
# per night. On failure it files an issue with the full sanitizer report —
# the diagnostic the PR smoke truncated/lost in earlier incidents (#96).
on:
schedule:
- cron: "0 16 * * *" # 00:00 UTC+8 — offset from diff-fuzz (14:00 UTC) so they don't contend
workflow_dispatch:
inputs:
stress-multiplier:
description: "Iteration multiplier over the PR-time smoke"
default: "8"
concurrency:
group: nightly-sanitizer-${{ github.ref }}
cancel-in-progress: false
permissions:
contents: read
issues: write
jobs:
tsan:
runs-on: ubuntu-latest
timeout-minutes: 180
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install LuaJIT and build deps
# ci-apt-install.sh retries with a per-attempt timeout so one slow
# mirror rotation doesn't burn the whole budget (#125, #164). cmake /
# gcc / make (build-essential) are preinstalled on the runner image.
run: |
bash scripts/ci-apt-install.sh libluajit-5.1-dev libcurl4-openssl-dev util-linux
cmake --version | head -1
- name: Run TSan stress
id: tsan
env:
STRESS_MULTIPLIER: ${{ inputs.stress-multiplier || '8' }}
run: |
set -o pipefail
bash scripts/cpp-tsan-smoke.sh 2>&1 | tee /tmp/tsan-stress.log
- name: File issue on TSan failure
if: ${{ failure() && steps.tsan.conclusion == 'failure' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: bash .github/scripts/file-sanitizer-issue.sh tsan /tmp/tsan-stress.log
asan:
runs-on: ubuntu-latest
timeout-minutes: 180
steps:
- uses: actions/checkout@v6
- uses: actions/setup-python@v6
with:
python-version: "3.13"
- name: Install LuaJIT and build deps
# Same resilient install as the tsan job above (#125, #164).
run: |
bash scripts/ci-apt-install.sh libluajit-5.1-dev libcurl4-openssl-dev util-linux
cmake --version | head -1
- name: Run ASan/UBSan smoke
id: asan
run: |
set -o pipefail
bash scripts/cpp-sanitizer-smoke.sh 2>&1 | tee /tmp/asan-stress.log
- name: File issue on ASan failure
if: ${{ failure() && steps.asan.conclusion == 'failure' }}
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: bash .github/scripts/file-sanitizer-issue.sh asan /tmp/asan-stress.log