Files
qdrant/tests/e2e_tests/test_low_ram.py
2025-10-21 14:05:57 +02:00

72 lines
3.0 KiB
Python

import pytest
import uuid
from e2e_tests.client_utils import ClientUtils
from e2e_tests.models import QdrantContainerConfig
class TestLowRam:
"""Test Qdrant behavior under low RAM conditions and recovery mode."""
@pytest.mark.parametrize("storage_from_archive", ["storage.tar.xz"], indirect=True)
def test_oom_with_insufficient_memory(self, qdrant_container_factory, storage_from_archive):
"""
Test that Qdrant OOMs when started with insufficient memory.
"""
print("Starting container with 128MB memory limit - expecting OOM...")
unique_suffix = str(uuid.uuid4())[:8]
config = QdrantContainerConfig(
name=f"qdrant-oom-{unique_suffix}",
mem_limit="128m",
volumes={str(storage_from_archive): {'bind': '/qdrant/storage', 'mode': 'rw'}},
environment={"QDRANT__STORAGE__HANDLE_COLLECTION_LOAD_ERRORS": "true"},
remove=False,
exit_on_error=False # Don't raise error when Qdrant fails to start
)
oom_container_info = qdrant_container_factory(config)
oom_container = oom_container_info.container
exit_code = oom_container.wait()['StatusCode']
assert exit_code == 137, f"Expected exit code 137 (OOM), but got {exit_code}"
@pytest.mark.parametrize("storage_from_archive", ["storage.tar.xz"], indirect=True)
def test_recovery_mode_with_low_memory(self, qdrant_container_factory, storage_from_archive):
"""
Test that:
1. Qdrant can start in recovery mode with low memory limit
2. Collection loads as a dummy shard in recovery mode
"""
print("Starting container in recovery mode...")
config = QdrantContainerConfig(
mem_limit="128m",
volumes={str(storage_from_archive): {'bind': '/qdrant/storage', 'mode': 'rw'}},
environment={
"QDRANT__STORAGE__HANDLE_COLLECTION_LOAD_ERRORS": "true",
"QDRANT_ALLOW_RECOVERY_MODE": "true"
}
)
recovery_container_info = qdrant_container_factory(config)
recovery_container = recovery_container_info.container
api_port = recovery_container_info.http_port
client = ClientUtils(host=recovery_container_info.host, port=api_port)
assert client.wait_for_collection_loaded("low-ram"), "Collection failed to load in ~10 seconds"
# Check for recovery mode message in logs
logs = recovery_container.logs().decode('utf-8')
recovery_msg = "Qdrant is loaded in recovery mode"
assert recovery_msg in logs, f"'{recovery_msg}' log message not found in container logs"
# Check that collection info returns 500 (dummy shard)
try:
client.get_collection_info_dict("low-ram")
assert False, "Expected collection info to fail with Out-of-Memory error"
except Exception as e:
error_text = str(e)
expected_error = "Out-of-Memory"
assert expected_error in error_text, f"'{expected_error}' not found in error: {error_text}"