From 9f45e774484505c31a87f288566c6af006d1d401 Mon Sep 17 00:00:00 2001 From: Wenaixi Date: Tue, 31 Mar 2026 11:54:27 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=81=A5=E5=BA=B7?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E7=9A=84=E4=B8=A4=E4=B8=AA=E5=85=B3=E9=94=AE?= =?UTF-8?q?bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 修复双重计数usage的问题: - 移除 _checkProviderHealth 中的 markProviderHealthy 调用 - 使用量计数现在只由调用方处理 2. 修复热重载timer时的竞态条件: - reload时重置 isHealthCheckRunning 标志 - 避免reload期间运行时导致新timer被跳过 --- src/providers/provider-pool-manager.js | 4 ++-- src/services/api-server.js | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/providers/provider-pool-manager.js b/src/providers/provider-pool-manager.js index 2b4fdc6..909fba4 100644 --- a/src/providers/provider-pool-manager.js +++ b/src/providers/provider-pool-manager.js @@ -1950,8 +1950,8 @@ export class ProviderPoolManager { await serviceAdapter.generateContent(modelName, requestWithSignal); clearTimeout(timeoutId); - // 将健康检查计入使用量(resetUsageCount=false 只会递增,不会重置) - this.markProviderHealthy(providerType, providerConfig, false, modelName); + // 注意:使用量计数由调用方处理(performScheduledHealthChecks/performHealthChecks) + // 这里只返回成功结果,让调用方统一处理状态更新和计数 return { success: true, modelName, errorMessage: null }; } catch (error) { clearTimeout(timeoutId); diff --git a/src/services/api-server.js b/src/services/api-server.js index 0b36fd6..a194fcd 100644 --- a/src/services/api-server.js +++ b/src/services/api-server.js @@ -394,6 +394,10 @@ async function startServer() { if (healthCheckTimerId) { clearInterval(healthCheckTimerId); } + // 重置运行状态,允许新的 timer 立即触发 + // 否则如果 reload 时正在运行,新 timer 的第一次触发会被跳过 + isHealthCheckRunning = false; + // 设置定时任务 healthCheckTimerId = setInterval(async () => { if (isHealthCheckRunning) {