test: add test to check if repair is properly aborted

This commit is contained in:
Aleksandra Martyniuk
2024-11-19 11:59:29 +01:00
parent ca14167b20
commit f5795e8aa4
2 changed files with 40 additions and 0 deletions

View File

@@ -2464,6 +2464,8 @@ future<> repair::tablet_repair_task_impl::run() {
throw abort_requested_exception();
}
co_await utils::get_local_injector().inject("repair_tablet_repair_task_impl_run", utils::wait_for_message(10s));
std::unordered_map<dht::token_range, repair_neighbors> neighbors;
neighbors[m.range] = m.neighbors;
dht::token_range_vector ranges = {m.range};

View File

@@ -221,3 +221,41 @@ async def test_batchlog_flush_in_repair_with_cache(manager):
@skip_mode('release', 'error injections are not supported in release mode')
async def test_batchlog_flush_in_repair_without_cache(manager):
await do_batchlog_flush_in_repair(manager, 0);
@pytest.mark.asyncio
@skip_mode('release', 'error injections are not supported in release mode')
async def test_repair_abort(manager):
cfg = {'enable_tablets': True}
await manager.server_add(config=cfg)
await manager.server_add(config=cfg)
servers = await manager.running_servers()
cql = manager.get_cql()
cql.execute("CREATE KEYSPACE ks WITH replication = {'class': 'NetworkTopologyStrategy', 'replication_factor': 2}")
cql.execute("CREATE TABLE ks.tbl (pk int, ck int, PRIMARY KEY (pk, ck)) WITH tombstone_gc = {'mode': 'repair'}")
await manager.api.client.post(f"/task_manager/ttl", params={ "ttl": "100000" },
host=servers[0].ip_addr)
await manager.api.enable_injection(servers[0].ip_addr, "repair_tablet_repair_task_impl_run", False, {})
# Start repair.
sequence_number = await manager.api.client.post_json(f"/storage_service/repair_async/ks", host=servers[0].ip_addr)
# Get repair id.
stats_list = await manager.api.client.get_json("/task_manager/list_module_tasks/repair", host=servers[0].ip_addr)
ids = [stats["task_id"] for stats in stats_list if stats["sequence_number"] == sequence_number]
assert len(ids) == 1
id = ids[0]
# Abort repair.
await manager.api.client.post("/storage_service/force_terminate_repair", host=servers[0].ip_addr)
await manager.api.message_injection(servers[0].ip_addr, "repair_tablet_repair_task_impl_run")
await manager.api.disable_injection(servers[0].ip_addr, "repair_tablet_repair_task_impl_run")
# Check if repair was aborted.
await manager.api.client.get_json(f"/task_manager/wait_task/{id}", host=servers[0].ip_addr)
statuses = await manager.api.client.get_json(f"/task_manager/task_status_recursive/{id}", host=servers[0].ip_addr)
assert all([status["state"] == "failed" for status in statuses])