Skip to content

Callable Dqlite Jepsen tests #19

Callable Dqlite Jepsen tests

Callable Dqlite Jepsen tests #19

name: Callable Dqlite Jepsen tests
on:
workflow_dispatch:
inputs:
raft-repo:
description: 'raft repo'
default: 'canonical/raft'
raft-ref:
description: 'raft branch or ref'
default: 'master'
dqlite-repo:
description: 'dqlite repo'
default: 'canonical/dqlite'
dqlite-ref:
description: 'dqlite branch or ref'
default: 'master'
go-dqlite-repo:
description: 'go-dqlite repo'
default: 'canonical/go-dqlite'
go-dqlite-ref:
description: 'go-dqlite branch or ref'
default: 'master'
workloads:
description: 'Jepsen workloads as JSON, e.g. [ append, bank ]'
required: true
nemeses:
description: "Jepsen nemesis as JSON, e.g. [ 'pause,disk' ]"
required: true
disk:
description: "Enable or disable dqlite's disk-mode e.g. [ '0', '1' ]"
required: true
cli-opts:
description: 'Jepsen cli opts, e.g. --node-targets primaries'
required: false
workflow_call:
inputs:
jepsen-dqlite-repo:
type: string
required: false
default: 'canonical/jepsen.dqlite'
jepsen-dqlite-ref:
type: string
required: false
default: 'master'
jepsen-repo:
type: string
required: false
jepsen-branch:
type: string
required: false
raft-repo:
type: string
required: false
raft-ref:
type: string
required: false
dqlite-repo:
type: string
required: false
dqlite-ref:
type: string
required: false
go-dqlite-repo:
type: string
required: false
go-dqlite-ref:
type: string
required: false
workloads:
type: string
required: true
nemeses:
type: string
required: true
disk:
type: string
required: true
cli-opts:
type: string
required: false
env:
RAFT_REPO: 'canonical/raft'
RAFT_BRANCH: 'master'
DQLITE_REPO: 'canonical/dqlite'
DQLITE_BRANCH: 'master'
GO_DQLITE_REPO: 'canonical/go-dqlite'
GO_DQLITE_BRANCH: 'master'
jobs:
test:
strategy:
fail-fast: false
matrix:
workload: ${{ fromJSON(inputs.workloads) }}
nemesis: ${{ fromJSON(inputs.nemeses) }}
disk: ${{ fromJSON(inputs.disk) }}
runs-on: ubuntu-20.04
timeout-minutes: 25
steps:
- name: Checkout code
uses: actions/checkout@v3
with:
repository: ${{ inputs.jepsen-dqlite-repo || github.repository }}
ref: ${{ inputs.jepsen-dqlite-ref || github.ref }}
- name: Cache Go modules
uses: actions/cache@v3
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
restore-keys: |
${{ runner.os }}-go-
- name: Cache Jepsen (lein project) dependencies
uses: actions/cache@v3
with:
path: ~/.m2/repository
key: ${{ runner.os }}-clojure-${{ hashFiles('**/project.clj') }}
restore-keys: |
${{ runner.os }}-clojure
- name: Install Go
uses: actions/setup-go@v3
- name: Setup environment
timeout-minutes: 15
run: |
sudo apt update
sudo apt install -y gnuplot libsqlite3-dev libuv1-dev liblz4-dev libjna-java graphviz leiningen build-essential
printf core | sudo tee /proc/sys/kernel/core_pattern
- name: Install local Jepsen
if: ${{ inputs.jepsen-repo && inputs.jepsen-branch }}
run: |
git clone --branch ${{ inputs.jepsen-branch }} --depth 1 ${{ inputs.jepsen-repo }}
cd jepsen/jepsen
git log -n 1
lein install
cd ../..
- name: Install libbacktrace
run: |
git clone https://github.com/ianlancetaylor/libbacktrace --depth 1
cd libbacktrace
autoreconf -i
./configure
make -j4
sudo make install
sudo ldconfig
cd ..
- name: Check out raft
uses: actions/checkout@v3
with:
repository: ${{ inputs.raft-repo || env.RAFT_REPO }}
ref: ${{ inputs.raft-ref || env.RAFT_REF }}
path: raft
- name: Build raft
run: |
cd raft
git log -n 1
autoreconf -i
./configure --enable-debug --enable-backtrace
make -j4
sudo make install
sudo ldconfig
- name: Check out dqlite
uses: actions/checkout@v3
with:
repository: ${{ inputs.dqlite-repo || env.DQLITE_REPO }}
ref: ${{ inputs.dqlite-ref || env.DQLITE_REF }}
path: dqlite
- name: Build dqlite
run: |
cd dqlite
git log -n 1
autoreconf -i
./configure --enable-debug --enable-backtrace
make -j4
sudo make install
sudo ldconfig
- name: Test
env:
LD_LIBRARY_PATH: "/usr/local/lib"
timeout-minutes: 8
run: |
go get golang.org/x/sync/semaphore
go get -tags libsqlite3 github.com/canonical/go-dqlite/app
go build -tags libsqlite3 -o resources/app resources/app.go
sudo ufw disable
sleep 0.200
sudo systemctl stop ufw.service
sudo ./resources/network.sh setup 5
if test ${{ matrix.workload }} = set; then echo 180 >time-limit; else echo 240 >time-limit; fi
lein run test --no-ssh --binary $(pwd)/resources/app \
--workload ${{ matrix.workload }} \
--nemesis ${{ matrix.nemesis }} \
--rate 100 \
--time-limit $(cat time-limit) \
--disk ${{ matrix.disk }} \
${{ inputs.cli-opts }}
sudo ./resources/network.sh teardown 5
- name: Jepsen log Summary
if: ${{ always() }}
run: tail -n 100 store/current/jepsen.log > store/current/tail-jepsen.log
- name: Summary Artifact
if: ${{ always() }}
uses: actions/upload-artifact@v3
with:
name: jepsen-data-${{ matrix.workload }}-${{ matrix.nemesis }}-summary
path: |
store/dqlite*/**/results.edn
store/dqlite*/**/latency-raw.png
store/dqlite*/**/tail-jepsen.log
!**/current/
!**/latest/
- name: Failure Artifact
uses: actions/upload-artifact@v3
with:
name: jepsen-data-${{ matrix.workload }}-${{ matrix.nemesis }}-failure
path: |
store/dqlite*
!**/current/
!**/latest/