fix: 防止分页漏读和上游异常快照误标 orphaned
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user