Files
zlareb1andClaude Sonnet 4.6 35e48faf43 keeper stress: add Keeper stress test framework
Adds a stress testing framework for ClickHouse Keeper under
`tests/stress/keeper/`, wired into CI (PR gate + nightly workflows).

Key components:
- Workloads: `keeper_bench.py` runner with YAML-defined workload profiles
  (`prod_mix.yaml`, `read_requests.yaml`, `write_requests.yaml`, etc.)
- Scenarios: `core_no_faults.yaml` and `core_faults.yaml` with netem-based
  network fault injection (latency, jitter, packet loss)
- Fault framework: `faults/network.py` (netem), `faults/base.py` (step
  dispatcher with `kind: parallel` support)
- Metrics: `MetricsSampler` collects keeper stats, `sink.py` writes JSONL,
  ingested into CIDB via `ingest_keeper_metrics.py` post-hook
- Gates: scenario pass/fail conditions based on RPS, p99 latency, error rate
- Grafana dashboards for run details, 1vs1 comparison, historical progression

CI integration:
- PR job: 3 no-fault scenarios (prod-mix, read-multi, write-multi), ARM_LARGE,
  15 min each, runs when `src/Coordination/` or stress test files change
- Nightly (no-faults): all no-fault scenarios, default + rocks backends, ARM_LARGE
- Nightly (faults): all fault scenarios, default + rocks backends, ARM_LARGE
- Single `keeper_stress_job` config; mode detected via `Info().pr_number` and
  `Info().workflow_name` inside the job script

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-03-21 16:08:00 +00:00

92 lines
1.8 KiB
YAML
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
name: large_payload
# Same request mix as prod_mix but larger values (1–4 KB). Stresses serialization, log size, and network.
concurrency: 640
report_delay: 0.0
continue_on_error: true
connections:
operation_timeout_ms: 30000
connection_timeout_ms: 400000
setup:
node:
name: e2e
node:
name: prod
node:
- name: hot
data:
random_string:
size:
min_value: 1024
max_value: 4096
- name: pool
node:
- repeat: 64
name:
random_string:
size: 12
data:
random_string:
size:
min_value: 1024
max_value: 4096
- name: churn
generator:
requests:
get:
path:
- /e2e/prod/hot
- children_of: /e2e/prod
weight: 38
create:
path:
- /e2e/prod/churn
- /e2e/prod/pool
- children_of: /e2e/prod/pool
name_length:
min_value: 8
max_value: 16
data:
random_string:
size:
min_value: 1024
max_value: 4096
remove_factor: 0.49
weight: 34
set:
path:
- /e2e/prod/hot
- children_of: /e2e/prod/pool
data:
random_string:
size:
min_value: 1024
max_value: 4096
weight: 9
multi:
size:
min_value: 3
max_value: 7
create:
path: /e2e/prod/churn
data:
random_string:
size:
min_value: 1024
max_value: 4096
set:
path: /e2e/prod/hot
data:
random_string:
size:
min_value: 1024
max_value: 4096
weight: 11
list:
path:
- /e2e/prod/pool
- children_of: /e2e/prod
weight: 4