From ea8734b700032264aa82b8786a1c6f9674ee69db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=8E=8B=E5=BE=B7=E5=AE=87?= Date: Sat, 3 Oct 2026 19:26:06 +0800 Subject: [PATCH] =?UTF-8?q?=E5=90=8E=E7=AB=AF=EF=BC=9A=E6=B8=B8=E7=8E=A9?= =?UTF-8?q?=E8=AE=A1=E6=95=B0=E9=94=81=E4=B8=AD=E6=AF=92=E6=97=B6=E7=95=99?= =?UTF-8?q?=E6=97=A5=E5=BF=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - game_play_counter.rs:lock 仍从中毒互斥锁恢复,但先 warn 一次,便于关联留下部分更新状态的 panic --- server-rs/crates/api-server/src/game_play_counter.rs | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/server-rs/crates/api-server/src/game_play_counter.rs b/server-rs/crates/api-server/src/game_play_counter.rs index 56a138607..9605ed7e9 100644 --- a/server-rs/crates/api-server/src/game_play_counter.rs +++ b/server-rs/crates/api-server/src/game_play_counter.rs @@ -12,6 +12,8 @@ use std::{ time::{Duration, Instant}, }; +use tracing::warn; + /// 默认 flush 间隔;与 `tracking_outbox` 的秒级节奏一致,够短以保证展示及时。 const DEFAULT_FLUSH_INTERVAL: Duration = Duration::from_secs(5); /// 同一 `identity + game_id` 的去重窗口。 @@ -206,9 +208,11 @@ impl GamePlayCounter { fn lock(&self) -> MutexGuard<'_, GamePlayCounterState> { // 计数是尽力而为的展示指标:锁中毒时继续用内部状态,不让一次 panic 永久关闭计数。 - self.inner - .lock() - .unwrap_or_else(|poisoned| poisoned.into_inner()) + // 但中毒意味着上一次 panic 可能留下部分更新的状态,必须留下可关联的日志。 + self.inner.lock().unwrap_or_else(|poisoned| { + warn!("游戏游玩计数锁已中毒,继续使用内部状态"); + poisoned.into_inner() + }) } }