fix: 防止分页漏读和上游异常快照误标 orphaned

This commit is contained in:
SmartUp Developer
2026-07-02 14:21:09 +08:00
parent 00af34c487
commit e2129d3796
4 changed files with 349 additions and 9 deletions
+22 -1
View File
@@ -248,6 +248,27 @@ def _sync_upstream_keys(upstream_id: int, snapshot: dict[str, Any], captured_at:
db = SessionLocal()
try:
active_group_ids = set(snapshot.get("groups", {}).keys())
# 获取倒数第二个快照作为 previous snapshot
prev_active_group_ids: set[str] | None = None
from app.models.snapshot import UpstreamRateSnapshot
snapshots = (
db.query(UpstreamRateSnapshot)
.filter(UpstreamRateSnapshot.upstream_id == upstream_id)
.order_by(UpstreamRateSnapshot.captured_at.desc())
.limit(2)
.all()
)
if len(snapshots) >= 2:
prev_snapshot = snapshots[1]
try:
prev_data = json.loads(prev_snapshot.snapshot_json or "{}")
prev_groups = prev_data.get("groups") or {}
if isinstance(prev_groups, dict):
prev_active_group_ids = set(prev_groups.keys())
except Exception:
pass
# 用 UpstreamClient 查询远端活跃 Key ID 集合
remote_key_ids: set[str] | None = None
try:
@@ -269,7 +290,7 @@ def _sync_upstream_keys(upstream_id: int, snapshot: dict[str, Any], captured_at:
except Exception as exc:
logger.warning("sync upstream keys list failed for %s: %s", upstream_id, exc)
website_sync.reconcile_upstream_keys(db, upstream_id, active_group_ids, remote_key_ids, captured_at)
website_sync.reconcile_upstream_keys(db, upstream_id, active_group_ids, remote_key_ids, captured_at, prev_active_group_ids=prev_active_group_ids)
db.commit()
except Exception:
logger.exception("key sync failed for upstream %s", upstream_id)