feat: add fast warm start with deferred full health test
On warm start (state has alive proxies), only quick-test the previously-alive subset before serving. Full health test runs in background. Cold start behavior unchanged (test all before serving). Reduces startup blocking from minutes to seconds on warm restarts.
This commit is contained in:
@@ -153,6 +153,38 @@ class TestProxyPoolWeight:
|
||||
pool.report_failure(hop) # should not raise
|
||||
|
||||
|
||||
class TestProxyPoolHealthTests:
|
||||
"""Test selective health testing."""
|
||||
|
||||
def test_selective_keys(self):
|
||||
import asyncio
|
||||
from unittest.mock import AsyncMock, patch
|
||||
|
||||
cfg = ProxyPoolConfig(sources=[])
|
||||
pool = ProxyPool(cfg, [], timeout=10.0)
|
||||
|
||||
now = time.time()
|
||||
hop_a = ChainHop(proto="socks5", host="10.0.0.1", port=1080)
|
||||
hop_b = ChainHop(proto="socks5", host="10.0.0.2", port=1080)
|
||||
pool._proxies["socks5://10.0.0.1:1080"] = ProxyEntry(
|
||||
hop=hop_a, alive=False, last_seen=now,
|
||||
)
|
||||
pool._proxies["socks5://10.0.0.2:1080"] = ProxyEntry(
|
||||
hop=hop_b, alive=False, last_seen=now,
|
||||
)
|
||||
|
||||
# only test proxy A
|
||||
with patch.object(pool, "_test_proxy", new_callable=AsyncMock, return_value=True) as mock:
|
||||
asyncio.run(pool._run_health_tests(keys=["socks5://10.0.0.1:1080"]))
|
||||
# should only have been called for proxy A
|
||||
assert mock.call_count == 1
|
||||
assert mock.call_args[0][0] == "socks5://10.0.0.1:1080"
|
||||
|
||||
assert pool._proxies["socks5://10.0.0.1:1080"].alive is True
|
||||
# proxy B untouched
|
||||
assert pool._proxies["socks5://10.0.0.2:1080"].alive is False
|
||||
|
||||
|
||||
class TestProxyPoolStaleExpiry:
|
||||
"""Test stale proxy eviction."""
|
||||
|
||||
|
||||
Reference in New Issue
Block a user