Skip to content

Commit f529985

Browse files
authored
Merge pull request #286 from bootjp/feature/fix-create-node
Jepsen test add failuer case test
2 parents b68ca07 + af4258d commit f529985

File tree

13 files changed

+856
-219
lines changed

13 files changed

+856
-219
lines changed

.github/workflows/jepsen.yml

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
name: Jepsen VM Run
2+
3+
permissions:
4+
contents: read
5+
6+
on:
7+
workflow_dispatch:
8+
inputs:
9+
time-limit:
10+
description: "Workload runtime seconds"
11+
required: false
12+
default: "60"
13+
rate:
14+
description: "Ops/sec per worker"
15+
required: false
16+
default: "10"
17+
faults:
18+
description: "Comma-separated faults (partition,kill,clock)"
19+
required: false
20+
default: "partition,kill,clock"
21+
22+
jobs:
23+
jepsen:
24+
# Requires a self-hosted runner with VirtualBox + Vagrant and at least 12GB RAM free.
25+
runs-on: [self-hosted, virtualbox]
26+
timeout-minutes: 120
27+
steps:
28+
- name: Checkout
29+
uses: actions/checkout@v4
30+
with:
31+
submodules: recursive
32+
33+
- name: Set up Go
34+
uses: actions/setup-go@v5
35+
with:
36+
go-version: "1.25.5"
37+
38+
- name: Bring up Jepsen VMs
39+
working-directory: jepsen
40+
run: vagrant up
41+
42+
- name: Run Jepsen workload
43+
working-directory: jepsen
44+
env:
45+
HOME: ${{ github.workspace }}/jepsen/tmp-home
46+
LEIN_HOME: ${{ github.workspace }}/jepsen/.lein
47+
LEIN_JVM_OPTS: -Duser.home=${{ github.workspace }}/jepsen/tmp-home
48+
run: |
49+
vagrant ssh ctrl -c "cd ~/elastickv/jepsen && \
50+
lein run -m elastickv.redis-workload \
51+
--nodes n1,n2,n3,n4,n5 \
52+
--time-limit ${{ github.event.inputs['time-limit'] || github.event.inputs.time-limit }} \
53+
--rate ${{ github.event.inputs['rate'] || github.event.inputs.rate }} \
54+
--faults ${{ github.event.inputs['faults'] || github.event.inputs.faults }} \
55+
--concurrency 10"
56+
57+
- name: Collect Jepsen artifacts
58+
if: always()
59+
working-directory: jepsen
60+
run: |
61+
mkdir -p $GITHUB_WORKSPACE/artifacts
62+
vagrant ssh ctrl -c "cd ~/elastickv/jepsen && tar czf /home/vagrant/results.tgz store/ target/ tmp-home/jepsen.store || true"
63+
vagrant scp ctrl:/home/vagrant/results.tgz $GITHUB_WORKSPACE/artifacts/results.tgz || true
64+
65+
- name: Destroy VMs
66+
if: always()
67+
working-directory: jepsen
68+
run: vagrant destroy -f
69+
70+
- name: Upload artifacts
71+
if: always()
72+
uses: actions/upload-artifact@v4
73+
with:
74+
name: jepsen-results
75+
path: artifacts/results.tgz

JEPSEN_TODO.md

Lines changed: 40 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -3,49 +3,59 @@
33
本家 Jepsen Redis テストに近いレベルで Elastickv/Redis プロトコルを検証するために必要な構成要素と TODO です。
44

55
## 1. クラスタ構成
6-
- 最低 5 台のノードを用意する:
6+
- [x] 最低 5 台のノードを用意する:
77
- 1 台: コントロールノード(Jepsen runner)
88
- 4〜5 台: DB ノード(Elastickv を起動)
9-
- 全ノードで SSH 鍵認証(root または sudo 無パス)をセットアップ。
10-
- `/etc/hosts` 等でノード名解決をそろえる。
9+
- [x] 全ノードで SSH 鍵認証(root または sudo 無パス)をセットアップ。
10+
- [x] `/etc/hosts` 等でノード名解決をそろえる。
1111

1212
## 2. DB ドライバの拡張
13-
- `jepsen/src/elastickv/redis_workload.clj` を拡張し、`jepsen.os.debian` などを使って以下を実装:
14-
- 各ノードへのバイナリ配布(ビルド or 配布)。
15-
- 起動/停止/リスタートを `Remote` 経由で管理。
16-
- データ/ログディレクトリをノードごとに初期化・掃除。
17-
- ポート割り当て (Redis/GRPC/Raft) をノードごとに設定。
13+
- [x] `jepsen/src/elastickv/redis_workload.clj` を拡張し、`jepsen.os.debian` などを使って以下を実装:
14+
- [x] 各ノードへのバイナリ配布(ビルド or 配布)。
15+
- [x] 起動/停止/リスタートを `Remote` 経由で管理。
16+
- [x] データ/ログディレクトリをノードごとに初期化・掃除。
17+
- [x] ポート割り当て (Redis/GRPC/Raft) をノードごとに設定。
18+
- [x] 起動時のサービス待機(gRPCポート待機など)の実装。
1819

1920
## 3. 故障注入 (Nemesis)
20-
- 本家に近いセットを有効化する:
21-
- ネットワーク分断(partition-random-halves, majorities-ring 等)
22-
- プロセス kill / 再起動
23-
- ノード停止/再起動(必要なら再デプロイ)
24-
- 時刻ずれ(clock-skew)
25-
- `jepsen.nemesis` を使い、複数 nemesis の組み合わせをテスト。
21+
- [x] 本家に近いセットを有効化する:
22+
- [x] ネットワーク分断(partition-random-halves, majorities-ring 等)
23+
- [x] プロセス kill / 再起動 (server 側の bootstrap エラー無視対応済み)
24+
- [x] ノード停止/再起動(必要なら再デプロイ)
25+
- [x] 時刻ずれ(clock-skew)
26+
- [x] `jepsen.nemesis` を使い、複数 nemesis の組み合わせをテスト。
2627

2728
## 4. ワークロード
28-
- 既存 append ワークロードに加え、以下を追加検討:
29-
- 混合 read/write、トランザクション長バリエーション
30-
- キー数増加、コンカレンシ/レート可変
31-
- テスト時間 5〜10 分 / 試行、複数試行
29+
- [x] 既存 append ワークロード (基本動作確認済み)
30+
- [ ] 以下を追加検討:
31+
- [ ] 混合 read/write、トランザクション長バリエーション
32+
- [ ] キー数増加、コンカレンシ/レート可変
33+
- [ ] テスト時間 5〜10 分 / 試行、複数試行 (現在は 60秒程度で検証中)
3234

3335
## 5. バイナリ配布/ビルド
34-
- DB ノード上で Elastickv をビルドするか、事前ビルド済みバイナリを `scp` 配布。
35-
- systemd/supervisor か Jepsen 管理スクリプトでプロセスを起動・監視。
36+
- [x] DB ノード上で Elastickv をビルドするか、事前ビルド済みバイナリを `scp` 配布。
37+
- [x] systemd/supervisor か Jepsen 管理スクリプトでプロセスを起動・監視。
3638

3739
## 6. 計測と証跡
38-
- Raft/Redis/アプリログをノード別に収集。
39-
- Jepsen history/analysis の保管。
40-
- 可能なら tcpdump やメトリクス(Prometheus/Grafana)も併設。
40+
- [x] Raft/Redis/アプリログをノード別に収集。
41+
- [x] Jepsen history/analysis の保管。
42+
- [ ] 可能なら tcpdump やメトリクス(Prometheus/Grafana)も併設。
4143

4244
## 7. CI への統合
43-
- GitHub Actions 単体では不足するため、外部の VM/ベアメタルクラスタを用意し、Actions から SSH で制御するワークフローを作成。
44-
- サブモジュール(`jepsen/redis`)取得を忘れず `submodules: recursive` を設定。
45+
- [x] GitHub Actions 単体では不足するため、外部の VM/ベアメタルクラスタを用意し、Actions から SSH で制御するワークフローを作成。
46+
- [x] サブモジュール(`jepsen/redis`)取得を忘れず `submodules: recursive` を設定。
4547

4648
## 8. 作業ステップ案
47-
1. ワークロードドライバを `db` / `os` / `nemesis` 付きに書き換える。
48-
2. デプロイ・起動スクリプトを用意(ビルド or 配布を選択)。
49-
3. 小規模 (2~3 ノード) でローカル VM を用いた疎通テスト。
50-
4. 故障注入を広げ、本家標準セットに近づける。
51-
5. 外部クラスタで長時間テストを回し、結果を保存。
49+
1. [x] ワークロードドライバを `db` / `os` / `nemesis` 付きに書き換える。
50+
2. [x] デプロイ・起動スクリプトを用意(ビルド or 配布を選択)。
51+
3. [x] 小規模 (2~3 ノード) でローカル VM を用いた疎通テスト。
52+
4. [x] 故障注入を広げ、本家標準セットに近づける (Partition, Kill, Clock 対応)。
53+
5. [ ] 外部クラスタで長時間テストを回し、結果を保存。
54+
55+
## 9. 実装済みの足回り (最新ステータス)
56+
- **Vagrant Cluster**: `jepsen/Vagrantfile``jepsen/VM.md` でコントロール + 5 ノードの VM クラスタ構築済み。
57+
- **DB Adapter**: `jepsen/src/elastickv/db.clj` 実装済み。Go バイナリのビルド/配布、起動・停止、Raft 参加、再起動時の待機処理を管理。
58+
- **Fault Tolerance**: `elastickv` サーバー側で `raft.ErrCantBootstrap` を無視する修正を適用し、Kill Nemesis 耐性を獲得。
59+
- **Workload**: `jepsen/src/elastickv/redis_workload.clj` は Debian/SSH/combined nemesis(partition, kill, clock)対応済み。
60+
- **CI**: `.github/workflows/jepsen.yml` で self-hosted ランナー向けワークフローを用意。
61+
- **Result**: `partition`, `kill`, `clock` 障害下での `append` ワークロードテストをパス (`{:valid? true}`)。

0 commit comments

Comments
 (0)