fix(persistence): separate retryable rejection errors (#6423)

This commit is contained in:
InfinityPacer
2026-08-23 20:10:59 +08:00
committed by GitHub
parent 46d5c8538e
commit c6ffc309d4
8 changed files with 79 additions and 48 deletions
+5 -6
View File
@@ -12,10 +12,7 @@ from app.application.database import (
AsyncDatabaseExecutor,
)
from app.schemas.agent import AgentChatSessionDetail, AgentChatSessionSummary
from app.schemas.exception import (
DatabaseWorkerClosedError,
DatabaseWorkerOverloadedError,
)
from app.schemas.exception import AgentChatPersistenceUnavailableError
from app.runtime.observability import record_metric
@@ -364,14 +361,16 @@ class AgentChatPersistenceService:
"""在线程 worker 内完成同步写入并丢弃仓储对象返回值。"""
# 同时限制全局和单会话等待量,避免一个热点会话占满总 admission 后饿死其他会话。
if self._closing:
raise DatabaseWorkerClosedError("AgentChat 持久化服务当前不可接收任务")
raise AgentChatPersistenceUnavailableError(
"AgentChat 持久化服务当前不可接收任务"
)
session_pending = self._pending_by_session.get(session_id, 0)
if (
self._pending_writes >= self._capacity
or session_pending >= self._session_capacity
):
record_metric("agent.chat.persistence.rejected")
raise DatabaseWorkerOverloadedError(
raise AgentChatPersistenceUnavailableError(
f"AgentChat 写入容量已用尽(全局上限 {self._capacity}"
f"单会话上限 {self._session_capacity}"
)
+6 -6
View File
@@ -7,7 +7,7 @@ from collections.abc import Awaitable, Callable
from dataclasses import dataclass, field
from typing import Any, Optional
from app.schemas.exception import DatabaseWorkerOverloadedError
from app.schemas.exception import PersistenceUnavailableError
from app.application.plugin.lifecycle import plugin_lifecycle
from app.runtime.log import logger
@@ -196,7 +196,7 @@ class PluginInstallCommand:
message=str(err),
package_installed=False,
)
if isinstance(err, DatabaseWorkerOverloadedError):
if isinstance(err, PersistenceUnavailableError):
raise
return result
if not package_installed:
@@ -228,7 +228,7 @@ class PluginInstallCommand:
package_installed=True,
installed_list_persisted=state.installed_list_touched,
)
if isinstance(err, DatabaseWorkerOverloadedError):
if isinstance(err, PersistenceUnavailableError):
raise
return result
@@ -247,7 +247,7 @@ class PluginInstallCommand:
installed_list_persisted=installed_list_persisted,
runtime_touched=True,
)
if isinstance(err, DatabaseWorkerOverloadedError):
if isinstance(err, PersistenceUnavailableError):
raise
return result
@@ -267,7 +267,7 @@ class PluginInstallCommand:
runtime_touched=True,
registrations_touched=True,
)
if isinstance(err, DatabaseWorkerOverloadedError):
if isinstance(err, PersistenceUnavailableError):
raise
return result
@@ -412,7 +412,7 @@ class PluginInstallCommand:
failure_stage=failure_stage,
rollback=rollback,
)
if isinstance(err, DatabaseWorkerOverloadedError):
if isinstance(err, PersistenceUnavailableError):
raise
return result