feat: add per-proxy backoff after connection failure
Track last_fail timestamp on ProxyEntry. When a connection attempt fails in server.py, report_failure() records the time. The selection weight multiplies by min(fail_age/60, 1.0), ramping back from floor over 60s. Prevents wasting retries on proxies that just failed.
This commit is contained in:
@@ -116,6 +116,42 @@ class TestProxyPoolWeight:
|
||||
entry.last_ok = 0
|
||||
assert ProxyPool._weight(entry, now) == pytest.approx(0.01)
|
||||
|
||||
def test_weight_failure_penalty(self):
|
||||
hop = ChainHop(proto="socks5", host="1.2.3.4", port=1080)
|
||||
now = 1000.0
|
||||
|
||||
# healthy proxy: weight ~1.0
|
||||
entry = ProxyEntry(hop=hop, last_ok=now)
|
||||
assert ProxyPool._weight(entry, now) == pytest.approx(1.0)
|
||||
|
||||
# just failed: weight drops to floor (fail_age=0 -> multiplier=0)
|
||||
entry.last_fail = now
|
||||
assert ProxyPool._weight(entry, now) == pytest.approx(0.01)
|
||||
|
||||
# 30s after failure: base=1/(1+30/300)=0.909, penalty=30/60=0.5 -> ~0.45
|
||||
assert ProxyPool._weight(entry, now + 30) == pytest.approx(0.4545, abs=0.05)
|
||||
|
||||
# 60s after failure: penalty=1.0, only base decay -> 1/(1+60/300)=0.833
|
||||
assert ProxyPool._weight(entry, now + 60) == pytest.approx(0.833, abs=0.05)
|
||||
|
||||
def test_report_failure(self):
|
||||
cfg = ProxyPoolConfig(sources=[])
|
||||
pool = ProxyPool(cfg, [], timeout=10.0)
|
||||
hop = ChainHop(proto="socks5", host="1.2.3.4", port=1080)
|
||||
pool._proxies["socks5://1.2.3.4:1080"] = ProxyEntry(
|
||||
hop=hop, alive=True, last_ok=time.time(),
|
||||
)
|
||||
|
||||
assert pool._proxies["socks5://1.2.3.4:1080"].last_fail == 0.0
|
||||
pool.report_failure(hop)
|
||||
assert pool._proxies["socks5://1.2.3.4:1080"].last_fail > 0.0
|
||||
|
||||
def test_report_failure_unknown_proxy(self):
|
||||
cfg = ProxyPoolConfig(sources=[])
|
||||
pool = ProxyPool(cfg, [], timeout=10.0)
|
||||
hop = ChainHop(proto="socks5", host="9.9.9.9", port=1080)
|
||||
pool.report_failure(hop) # should not raise
|
||||
|
||||
|
||||
class TestProxyPoolFetchFile:
|
||||
"""Test file source parsing."""
|
||||
|
||||
Reference in New Issue
Block a user