mirror of
https://github.com/hanzoai/datastore.git
synced 2026-09-26 13:55:07 +00:00
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]>
92 lines
1.8 KiB
YAML
92 lines
1.8 KiB
YAML
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
|