From 9be6f156c7b54cf2ac586ee497255dfca710fe75 Mon Sep 17 00:00:00 2001 From: Justin Gu <97915@qq.com> Date: Sat, 5 Sep 2026 11:42:05 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E7=83=AD=E7=82=B9=E7=9B=B8=E5=85=B3?= =?UTF-8?q?=E6=80=A7=E7=9F=A9=E9=98=B5=E8=A1=8C=E5=88=97=E9=A1=BA=E5=BA=8F?= =?UTF-8?q?=E8=B7=A8=E9=87=8D=E5=90=AF=E9=9A=8F=E6=9C=BA=E4=BA=92=E6=8D=A2?= =?UTF-8?q?=20=E2=80=94=20set=20=E8=BF=AD=E4=BB=A3=E5=BA=8F=E9=9D=9E?= =?UTF-8?q?=E7=A1=AE=E5=AE=9A=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit board-mac/hotspot-correlation 的入阵板块来自 set 的并集, sorted(days_in, key=-days_in) 在上榜次数并列时保持 set 迭代序, 而字符串哈希随机化(PYTHONHASHSEED)使该顺序跨进程不稳定—— 服务每次重启矩阵的行/列都可能互换(全量单测中按哈希种子复现)。 排序加 code 兜底使其确定性;热点矩阵 rows_out 的多级排序同样 补 code 兜底(全并列时此前也受 set 序影响)。 --- src/easy_tdx/web/routers/board_mac.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/easy_tdx/web/routers/board_mac.py b/src/easy_tdx/web/routers/board_mac.py index f6f837f..b0aca23 100644 --- a/src/easy_tdx/web/routers/board_mac.py +++ b/src/easy_tdx/web/routers/board_mac.py @@ -491,6 +491,7 @@ async def board_hotspot( -r["days_in"], -(r["sum_pct"] or 0.0), r["best_rank"] if r["best_rank"] else 9999, + r["code"], # 全并列时按代码兜底:candidates 来自 set,迭代序跨进程不稳定 ) ) rows_out = rows_out[:_HOTSPOT_MAX_ROWS] @@ -552,7 +553,9 @@ async def board_hotspot_correlation( for c in s: days_in[c] = days_in.get(c, 0) + 1 - chosen = sorted(days_in, key=lambda c: -days_in[c])[:top] + # 排序必须确定性:days_in 并列时按代码兜底——set 迭代序受哈希随机化影响, + # 跨进程不稳定,会导致相关矩阵行列顺序在服务重启后随机互换 + chosen = sorted(days_in, key=lambda c: (-days_in[c], c))[:top] if len(chosen) < 2: return DictResponse.from_dict( {"status": "ready", "boards": [], "matrix": [], "days": len(window)}