mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-04 23:17:20 +08:00
fix(persistence): separate retryable rejection errors (#6423)
This commit is contained in:
@@ -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})"
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user