colibri.qdrant / tests /consensus_tests /test_collection_recovery.py
Gouzi Mohaled
Ajout du dossier tests
3932407
import pathlib
from .fixtures import create_collection, upsert_random_points
from .utils import *
from .assertions import assert_http_ok
N_PEERS = 3
COLLECTION_NAME = "test_collection"
def test_collection_recovery(tmp_path: pathlib.Path):
assert_project_root()
peer_urls, peer_dirs, bootstrap_url = start_cluster(tmp_path, N_PEERS)
create_collection(peer_urls[0], shard_number=2, replication_factor=2)
wait_collection_exists_and_active_on_all_peers(collection_name="test_collection", peer_api_uris=peer_urls)
upsert_random_points(peer_urls[0], 100)
# Check that collection is not empty
info = get_collection_cluster_info(peer_urls[-1], COLLECTION_NAME)
for shard in info["local_shards"]:
assert shard["points_count"] > 0
# Kill last peer
processes.pop().kill()
# Delete collection files from disk
collection_path = Path(peer_dirs[-1]) / "storage" / "collections" / COLLECTION_NAME
assert collection_path.exists()
shutil.rmtree(collection_path)
# Restart the peer
peer_url = start_peer(peer_dirs[-1], "peer_0_restarted.log", bootstrap_url)
# Wait until peer is up
wait_for_peer_online(peer_url)
# Recover Raft state
recover_raft_state(peer_url)
# Wait for all shards to be active
wait_for(all_collection_shards_are_active, peer_url, COLLECTION_NAME)
# Check, that the collection is not empty on recovered node
info = get_collection_cluster_info(peer_url, COLLECTION_NAME)
for shard in info["local_shards"]:
assert shard["points_count"] > 0
def recover_raft_state(peer_url):
r = requests.post(f"{peer_url}/cluster/recover")
return request_result(r)
def request_result(resp):
assert_http_ok(resp)
return resp.json()["result"]
def all_collection_shards_are_active(peer_url, collection_name):
try:
info = get_collection_cluster_info(peer_url, collection_name)
except:
return False
remote_shards = info["remote_shards"]
local_shards = info["local_shards"]
if len(remote_shards) == 0:
return False
return all(map(lambda shard: shard["state"] == "Active", local_shards + remote_shards))