Skip to content

Merge pull request #58 from poyrazK/test/txn-manager-coverage #353

Merge pull request #58 from poyrazK/test/txn-manager-coverage

Merge pull request #58 from poyrazK/test/txn-manager-coverage #353

Workflow file for this run

name: cloudSQL CI
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
style-check:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.head_ref }}
- name: Run clang-format fix
run: |
sudo apt-get update
sudo apt-get install -y clang-format
find src include tests -name "*.cpp" -o -name "*.hpp" | xargs clang-format -i
- name: Commit style fixes
uses: stefanzweifel/git-auto-commit-action@v5
with:
commit_message: "style: automated clang-format fixes"
build:
needs: style-check
runs-on: ubuntu-latest
strategy:
matrix:
compiler: [clang++, g++]
sanitizer: [address, thread]
exclude:
- compiler: g++
sanitizer: thread # Focus TSan on Clang for faster CI
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y cmake clang clang-tidy llvm ninja-build ccache || (sleep 10 && sudo apt-get update && sudo apt-get install -y cmake clang clang-tidy llvm ninja-build ccache)
- name: Cache ccache
uses: actions/cache@v4
with:
path: ~/.ccache
key: ${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.sanitizer }}-ccache-${{ github.sha }}
restore-keys: |
${{ runner.os }}-${{ matrix.compiler }}-${{ matrix.sanitizer }}-ccache-
- name: Configure CMake
run: |
mkdir build
cd build
export CCACHE_DIR=~/.ccache
cmake .. -G Ninja \
-DCMAKE_CXX_COMPILER=${{ matrix.compiler }} \
-DCMAKE_CXX_COMPILER_LAUNCHER=ccache \
-DUSE_SANITIZER=${{ matrix.sanitizer }} \
-DBUILD_TESTS=ON \
-DSTRICT_LINT=OFF \
-DCMAKE_CXX_CLANG_TIDY="" \
-DBUILD_COVERAGE=${{ matrix.sanitizer == 'address' && 'ON' || 'OFF' }}
- name: Build
run: |
cd build
ninja sqlEngineCore
ninja
- name: Upload Build Artifacts
uses: actions/upload-artifact@v4
with:
name: build-${{ matrix.compiler }}-${{ matrix.sanitizer }}
path: build/
include-hidden-files: true
test:
needs: build
runs-on: ubuntu-latest
strategy:
matrix:
compiler: [clang++, g++]
sanitizer: [address, thread]
exclude:
- compiler: g++
sanitizer: thread
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y lcov python3 llvm || (sleep 10 && sudo apt-get update && sudo apt-get install -y lcov python3 llvm)
- name: Download Build Artifacts
uses: actions/download-artifact@v4
with:
name: build-${{ matrix.compiler }}-${{ matrix.sanitizer }}
path: build/
- name: Restore Permissions
run: |
chmod +x build/cloudSQL
chmod +x build/*_tests || true
- name: Run Unit Tests
run: |
cd build
ctest --output-on-failure
- name: Run Distributed Tests
run: |
set +e
./tests/run_dist_test.sh tests/logic/*.slt
exit 0
- name: Generate Coverage Report
if: matrix.sanitizer == 'address' && matrix.compiler == 'clang++'
run: |
cd build
echo "=== Finding gcda files ==="
find . -name "*.gcda" 2>/dev/null | head -10
echo "=== Running llvm-cov gcov on all gcda files ==="
# Run llvm-cov gcov on each .gcda file to create .gcov files
find . -name "*.gcda" -exec sh -c 'llvm-cov gcov "$1" 2>/dev/null || true' _ {} \;
echo "=== Checking for .gcov files ==="
ls -la *.gcov 2>/dev/null | head -5 || echo "No .gcov files"
echo "=== Capturing with lcov ==="
# lcov can read .gcov files directly when they're in the same directory as .gcda
lcov --capture --directory . --branch-coverage --output-file coverage.info 2>&1 || echo "lcov capture failed"
echo "=== Checking coverage.info ==="
wc -l coverage.info 2>/dev/null || echo "No coverage.info"
head -20 coverage.info 2>/dev/null || echo "Cannot read coverage.info"
echo "=== Generating HTML with branch coverage ==="
genhtml --branch-coverage coverage.info --output-directory out_coverage --ignore-errors inconsistent,category 2>&1 || echo "genhtml failed"
echo "=== HTML files in out_coverage ==="
ls -la out_coverage/ 2>/dev/null | head -20
- name: Upload Coverage
if: matrix.sanitizer == 'address' && matrix.compiler == 'clang++'
uses: actions/upload-artifact@v4
with:
name: code-coverage-report
path: build/out_coverage
- name: Upload Binaries
if: matrix.sanitizer == 'address'
uses: actions/upload-artifact@v4
with:
name: cloudsql-bin-${{ matrix.compiler }}
path: build/cloudSQL
performance-benchmarks:
needs: style-check
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install dependencies
run: |
sudo apt-get update
sudo apt-get install -y cmake clang ninja-build ccache python3
- name: Configure CMake (Release)
run: |
mkdir build
cd build
cmake .. -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DBUILD_BENCHMARKS=ON \
-DBUILD_TESTS=OFF
- name: Build Benchmarks
run: |
cd build
ninja storage_bench execution_bench network_bench
- name: Restore Performance Baseline
id: restore-baseline
uses: actions/cache/restore@v4
with:
path: build/baseline.json
key: perf-baseline-${{ runner.os }}-main
- name: Run Benchmarks
run: |
cd build
./storage_bench --benchmark_format=json > storage.json
./execution_bench --benchmark_format=json > execution.json
./network_bench --benchmark_format=json > network.json
# Merge results into one current.json
python3 -c "import json; s=json.load(open('storage.json')); e=json.load(open('execution.json')); n=json.load(open('network.json')); s['benchmarks'].extend(e['benchmarks']); s['benchmarks'].extend(n['benchmarks']); json.dump(s, open('current.json', 'w'))"
- name: Check for Performance Regressions
run: |
if [ -f build/baseline.json ]; then
python3 scripts/check_perf_regression.py build/current.json build/baseline.json 0.20
else
echo "No baseline found to compare against."
fi
- name: Save New Baseline
if: github.ref == 'refs/heads/main'
uses: actions/cache/save@v4
with:
path: build/current.json
key: perf-baseline-${{ runner.os }}-main-${{ github.sha }}
- name: Upload Current Results
uses: actions/upload-artifact@v4
with:
name: performance-results
path: build/current.json