resident P0+P1: DNS-level SSRF pin, batch budget, daily cap/cooldown/retention, PG schema/migration, dual-connection deadlock isolation, retarget baseline reset, proxy and structured failures, metrics

- DNS 级 SSRF pin:解析后 pin IP 建连,防 DNS 重绑定
- 批量总预算与每日上限/抖动冷却/保留期
- PG schema 与迁移清单
- 双连接死锁隔离
- 改目标重置基线
- 显式代理配置与结构化失败原因
- /metrics resident 口径
This commit is contained in:
host committed 2026-11-02 03:30:57 +00:00
1 parent 60997b138f
commit b391fe9320
9 files changed
+1906 -74

No files matched your search

+29 -3
View File
@@ -6582,21 +6582,47 @@ class Worker:
log_event(self.logger, "worker_push_due_failed",
message="push due processing failed: %s" % exc)
def process_due_resident_watches(self, now=None, fetcher=None):
def process_due_resident_watches(self, now=None, fetcher=None,
resolver=None):
"""常驻监听驱动(worker 轮次边界调用):到期监听逐条
走 resident.process_due_resident_watches,抢单 + 廉价
抓取 + 仅变化建任务。全部异常只记日志,不炸循环;
fetcher 缺省用 resident 默认抓取,单测可经
self.resident_fetcher 或参数注入假抓取。"""
self.resident_fetcher 或参数注入假抓取;resolver 同款
注入点(self.resident_resolver),生产路径为 None 即
默认 DNS 门,测试用它把测试主机名指到本地服务。
建表只在 worker 生命周期内做一次(首批):热路径
不再逐条 ensure,见 resident.ensure 的调用约定;
批量内逐条隔离的异常与预算耗尽信号记
worker_resident_watch_failed 日志,不炸整批。"""
if now is None:
now = time.time()
if fetcher is None:
fetcher = getattr(self, "resident_fetcher", None)
if resolver is None:
resolver = getattr(self, "resident_resolver", None)
try:
from cloud.resident import ensure_resident_tables as _ensure
from cloud.resident import process_due_resident_watches as _run
conn = _db_connect(self.db_path)
try:
polls = _run(conn, fetcher=fetcher, now=now)
if not getattr(self, "_resident_tables_ensured", False):
try:
_ensure(conn)
conn.commit()
self._resident_tables_ensured = True
except Exception as exc:
log_event(
self.logger, "worker_resident_watch_failed",
message="resident ensure failed: %s" % exc)
errors = []
polls = _run(conn, fetcher=fetcher, now=now,
resolver=resolver, errors=errors)
for watch_id, msg in errors:
log_event(
self.logger, "worker_resident_watch_failed",
message="resident watch item failed: %s: %s"
% (watch_id, msg))
finally:
conn.close()
except Exception as exc: