mirror of
https://github.com/scylladb/scylladb.git
synced 2026-04-27 03:45:11 +00:00
We add the CDC generation optimality check in `storage_service::raft_check_and_repair_cdc_streams` so that it doesn't create new generations when unnecessary. Since `generation_service::check_and_repair_cdc_streams` already has this check, we extract it to the new `is_cdc_generation_optimal` function to not duplicate the code. After this change, multiple tasks could wait for a single generation change. Calling `signal` on `topology_state_machine.event` would't wake them all. Moreover, we must ensure the topology coordinator wakes when his logic expects it. Therefore, we change all `signal` calls on `topology_state_machine.event` to `broadcast`. We delay the deletion of the `new_cdc_generation` request to the moment when the topology transition reaches the `publish_cdc_generation` state. We need this change to ensure the added CDC generation optimality check in the next commit has an intended effect. If we didn't make it, it would be possible that a task makes the `new_cdc_generation` request, and then, after this request was removed but before committing the new generation, another task also makes the `new_cdc_generation` request. In such a scenario, two generations are created, but only one should. After delaying the deletion of `new_cdc_generation` requests, the second request would have no effect. Additionally, we modify the `test_topology_ops.py` test in a way that verifies the new changes. We call `storage_service::raft_check_and_repair_cdc_streams` multiple times concurrently and verify that exactly one generation has been created. Fixes #14055 Closes #14789 * github.com:scylladb/scylladb: storage_service: raft_check_and_repair_cdc_streams: don't create a new generation if current one is optimal storage_service: delay deletion of the new_cdc_generation request raft topology: broadcast on topology_state_machine.event instead of signal cdc: implement the is_cdc_generation_optimal function