fix: reparent governance backend failures under GatewayUnavailableError (issue #7)
A fail-closed limiter or breaker backend means the scope cannot emit a single request, which is exactly scope-level unavailability. But the error sat directly under PolyGatewayError, so a caller writing only `except GatewayUnavailableError` dropped it into the catch-all branch: Redis blips once and a backlog of tasks burns its business failure budget into the dead letter queue, over a fault a restart would clear. Three gate paths leak to callers rather than being absorbed by _record_quietly (try_acquire, try_enter, progress_age_s); each is now pinned by a test, since none of them had one before. The two unknown-source sites move to SourceNotConfiguredError instead of following along. They report a misconfigured source name, not an outage, and letting them into the retryable family would be the mirror of the bug being fixed here: the task would retry forever and never surface.
This commit is contained in:
@@ -68,10 +68,13 @@ class TestConversions:
|
||||
_limiter(lease_ttl_s=0)
|
||||
|
||||
def test_unknown_source_rejected(self):
|
||||
from polygateway.errors import GovernanceBackendError
|
||||
"""未知源是装配缺陷,不是后端故障(issue #7 §3.4)。"""
|
||||
from polygateway.errors import GatewayUnavailableError, SourceNotConfiguredError
|
||||
|
||||
with pytest.raises(GovernanceBackendError):
|
||||
with pytest.raises(SourceNotConfiguredError) as ei:
|
||||
_limiter()._cfg("nope")
|
||||
# 关键: 若归入 scope 级家族,配置写错的任务会永远延期重投、永不进死信
|
||||
assert not isinstance(ei.value, GatewayUnavailableError)
|
||||
|
||||
|
||||
class TestLuaFidelity:
|
||||
|
||||
Reference in New Issue
Block a user