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() + }) } }