Commit Graph
40 Commits
Author SHA1 Message Date
Antonio AndelicandClaude Opus 4.6 c8aa474ebd Fix keeper-bench: exclude setup time from metrics and batch recursive removal
- Reset elapsed/total timers after warmup/setup so setup time is not
  counted toward throughput or time limit
- Rewrite `removeRecursive` to collect deletes in a single post-order
  batch (flushed every 1000 ops) instead of removing children then parent
  in separate rounds, reducing the number of multi requests
- Add proper error handling for list and multi responses

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-13 13:49:17 +01:00
Antonio AndelicandClaude Opus 4.6 a3cea2d34a Fix keeper-bench throughput and latency measurement
Two fixes:

1. Measure request latency in the response callback instead of when
   `collect_request` drains the in-flight deque. Previously the
   `Stopwatch` ran from submission until collection, which at high
   `pipeline_depth` included time the request sat completed in the
   deque waiting to be collected. Now a shared `Stopwatch` is captured
   by the callback and read when the response actually arrives.

2. Compute RPS using wall-clock elapsed time (`Stopwatch`) instead of
   deriving it from `sum(individual_latencies) / concurrency`. The old
   formula did not account for pipelining: with `pipeline_depth=64` it
   reported ~2k RPS while actual wall-clock throughput was ~140k RPS.
   `getThroughput` now takes elapsed seconds directly, and the
   `concurrency` parameter is removed from `report` and `writeJSON`.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-10 11:20:56 +01:00
Antonio AndelicandClaude Opus 4.6 793589c920 Fix style check and seed collision in MultiRequestGenerator
Add `// Ok` comments to `catch (...)` blocks in `Runner.cpp` that handle
exceptions via `handle_request_exception` (which logs and counts errors)
but were flagged by the `catch_all` style check.

Fix seed collision in `MultiRequestGenerator::setSeedImpl`: the inner
`RequestGetter::setSeed` distributed sub-seeds as `seed + i + 1`, which
collided with siblings assigned by the outer `RequestGetter` using the
same scheme. Use a large prime offset (500009) to separate the inner
seed namespace.

https://s3.amazonaws.com/clickhouse-test-reports/json.html?PR=98906&sha=latest&name_0=PR

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-08 22:27:24 +01:00
Antonio AndelicandClaude Opus 4.6 31601a2e87 Batch removeRecursive deletions and lock mutex in report/writeJSON
Restore batched child removal in `removeRecursive` using `multi` requests
in chunks of 1000, reducing network round trips from O(N) to O(N/1000).

Add `std::lock_guard` in `Stats::report` and `Stats::writeJSON` so that
collector fields are consistently protected by `Stats::mutex` regardless
of caller context.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-08 21:43:50 +01:00
Antonio Andelic 36daeb474d Merge branch 'master' into keeperbench-improv
# Conflicts:
#	programs/keeper-bench/Runner.cpp
#	programs/keeper-bench/Stats.cpp
#	programs/keeper-bench/Stats.h
2026-03-06 20:36:24 +01:00
zlareb1 ff0317563d move back to last_request 2026-03-06 20:09:49 +05:30
zlareb1andClaude Sonnet 4.6 c58be47e0e keeper-bench: fix assertion failure and data race in log replay mode
Fix two issues reported by Cursor Bugbot in `Stats::report` and
`requestFromLogExecutor`:

1. `Stats::report` called `getThroughput` unconditionally on both
   collectors after only checking if both are zero. A log with only read
   requests would hit `assert(requests != 0)` inside
   `write_collector.getThroughput`. Now each collector's throughput is
   computed only when its request count is non-zero.

2. `requestFromLogExecutor` only waited for the last request's promise.
   When an executor processes requests across multiple ZooKeeper
   connections (one per session_id), callbacks on earlier connections
   could still be running on I/O threads after `last_request->wait()`
   returned, causing a data race with `report`/`writeJSON` which read
   `Stats` fields without `Stats::mutex`. Fixed by collecting all
   per-request futures and waiting for all of them before returning.

Co-Authored-By: Claude Sonnet 4.6 <[email protected]>
2026-03-06 20:09:49 +05:30
zlareb1 317e7f247f accommodate claude bot suggestions 2026-03-06 20:09:49 +05:30
zlareb1 6132997cee add read, write metrics to stats 2026-03-06 20:09:49 +05:30
zlareb1 29df85aee0 don't handle which benchmark to run in runBenchmark 2026-03-06 20:09:49 +05:30
Mohammad Lareb ZafarandAntonio Andelic 391832a815 Apply suggestion from @antonio2368
Co-authored-by: Antonio Andelic <[email protected]>
2026-03-06 20:09:48 +05:30
zlareb1 03ae870353 Enable JSON metrics for log mode and report errors in metrics reported file 2026-03-06 20:09:48 +05:30
Antonio AndelicandClaude Opus 4.6 5b6d4b77e7 Fix warmup_complete race condition in keeper-bench
The producer thread was setting `warmup_complete = true` before acquiring
the mutex and calling `info->clear()`. This created a window where a
worker could observe `warmup_complete == true`, acquire the mutex first,
record post-warmup stats, and then have those stats silently discarded
when the producer subsequently called `clear()`.

Move the atomic store after `clear()` inside the locked section so that
workers can only begin recording once the stats have been reset.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-06 13:01:56 +01:00
Antonio AndelicandClaude Opus 4.6 e34d304af9 Fix failure callbacks lost when executeGenericRequest throws
The `on_failure_callbacks` (which clean up `paths_pending` in
`CreateRequestGenerator`) were moved into the response callback lambda.
If `executeGenericRequest` threw (e.g. expired connection), the lambda
was destroyed without being invoked, so the failure callbacks never ran.
This permanently leaked entries in `paths_pending`, eventually exhausting
`max_name_generation_retries`.

Fix by storing callbacks in `shared_ptr` so they remain accessible in
the catch block, and invoking failure callbacks there.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-06 10:52:55 +01:00
Antonio AndelicandClaude Opus 4.6 17344a6d17 Improve keeper-bench with pipelining, warmup, per-op stats, and reproducible seeds
- Add `pipeline_depth` and `queue_depth` settings to allow asynchronous
  in-flight requests per consumer thread, hiding round-trip latency
- Add `warmup_seconds` to discard early stats while caches warm up
- Add `generator.seed` for reproducible workloads
- Track per-operation-type stats (Create, Remove, Get, Set, List, Multi)
  in both stderr reports and JSON output
- Add `on_failure_callbacks` to clean up pending paths on failed creates
- Replace `paths_created` set with O(1) swap-and-pop vector+index structure
  for random path removal
- Fix `static` → `thread_local` for RNG instances to avoid data races
- Fix `continue_on_errors` → `continue_on_error` (match actual config key)
- Validate `remove_factor` range, zero weights, and empty path getters
- Add retry limit for unique path name generation
- Simplify `removeRecursive` and deduplicate default ACL construction
- Document all new settings in README

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-03-06 10:32:03 +01:00
Raúl MarínandClaude Opus 4.6 9aa8e4ed27 Move ErrnoException from Exception.h to its own header
Extract `ErrnoException` into `Common/ErrnoException.h` to reduce the
include footprint of `Exception.h`. This removes `<base/errnoToString.h>`
and `<cerrno>` from `Exception.h`, which is included by ~95% of all
translation units.

All files referencing `ErrnoException` now include the new header
directly. Files that used `errnoToString` without `ErrnoException`
got an explicit `<base/errnoToString.h>` include.

Co-Authored-By: Claude Opus 4.6 <[email protected]>
2026-02-20 13:47:23 +01:00
Antonio Andelic f9f786eb11 Fix remove_factor in keeper-bench 2026-02-17 15:53:46 +01:00
Michael Stetsyuk ee7cee2a97 make Runner::getConnection const 2026-02-09 13:07:40 +00:00
Michael Stetsyuk fa95f24f4f add enable_tracing to keeper-bench 2026-02-06 16:37:07 +00:00
Raúl Marín c7f4b2fa6a Bad header 2026-02-05 19:25:40 +01:00
Nikolay DegterinskyandGitHub b98a48c249 Merge pull request #94826 from evillique/add-new-keeper-request
Add with_data & with_stat extension to getChildren Keeper request
2026-01-27 13:48:28 +00:00
Nikolay Degterinsky baf8ba119a Fix tidy 2026-01-26 11:59:54 +00:00
Antonio Andelic 1fc565b0f6 Merge branch 'master' into enable-implicit-int-float-conversion 2026-01-22 11:04:21 +01:00
Antonio Andelic 6bd6e63e19 Fix keeper-bench output 2026-01-20 12:52:14 +01:00
Antonio Andelic dc3d47d689 Enable implicit-int-float-conversion check 2026-01-20 09:35:57 +01:00
Michael Stetsyuk 3c093e5b7f aggregated zookeeper log 2025-09-16 17:27:31 +00:00
Azat Khuzhin 04d64a7ca1 Fix deduplication of watches in ZooKeeper client by EventPtr
While adding a chassert, I also discovered an issue with EventPtr: it
was never deduplicated, since it was always wrapped into a callback.
This has now been fixed as well.
2025-09-08 12:01:08 +02:00
divanik 13eefce1bf Finish refactorring 2025-07-23 11:21:54 +02:00
divanik b1e9760f3a Built version 2025-07-23 00:32:10 +02:00
Michael Kolupaev 77fbb7b56b Revert "Revert "Refactor how IInputFormat deals with reading many files at once""
This reverts commit 1f28e8bbd0.
2025-06-30 16:53:52 +00:00
Alexey MilovidovandGitHub 1f28e8bbd0 Revert "Refactor how IInputFormat deals with reading many files at once" 2025-06-30 17:34:05 +02:00
Raúl Marín 22bf25b334 Merge remote-tracking branch 'blessed/master' into includes_utils 2025-06-25 19:31:29 +02:00
Raúl Marín d6ac63c8d2 Style: Forbid the use of quotes for includes (partial) 2025-06-24 13:20:10 +02:00
Michael Kolupaev de9fa0f3ad Refactor how IInputFormat deals with reading many files at once 2025-05-28 02:00:39 +00:00
Elmi Ahmadov 7046159532 Prevent setting max_block_size to 0
Mark `max_block_size` NonZeroUInt64.
2025-05-13 00:04:05 +02:00
Raúl Marín ed8423f1b7 Merge remote-tracking branch 'blessed/master' into fmt_update 2025-02-28 15:17:52 +01:00
Raúl Marín 2753c789b9 Untangle some dependencies 2025-02-25 12:23:47 +01:00
Raúl Marín da1d86ea15 Update files to the new fmt 2025-02-20 19:52:17 +01:00
Konstantin Bogdanov 72c3991c43 Cleanup dependencies in ZooKeeper.h 2025-02-14 02:34:22 +01:00
Nikita Mikhaylov dc7bc42223 Moved some of utils to programs 2024-12-09 21:35:31 +00:00