fix plugin cache

This commit is contained in:
jxxghp
2025-09-08 13:27:32 +08:00
parent 1e94d794ed
commit 59a54d4f04
3 changed files with 27 additions and 69 deletions
+1 -53
View File
@@ -13,7 +13,7 @@ from app import schemas
from app.command import Command from app.command import Command
from app.core.config import settings from app.core.config import settings
from app.core.plugin import PluginManager from app.core.plugin import PluginManager
from app.core.security import verify_apikey, verify_token, verify_apitoken from app.core.security import verify_apikey, verify_token
from app.db.models import User from app.db.models import User
from app.db.systemconfig_oper import SystemConfigOper from app.db.systemconfig_oper import SystemConfigOper
from app.db.user_oper import get_current_active_superuser, get_current_active_superuser_async from app.db.user_oper import get_current_active_superuser, get_current_active_superuser_async
@@ -21,7 +21,6 @@ from app.factory import app
from app.helper.plugin import PluginHelper from app.helper.plugin import PluginHelper
from app.log import logger from app.log import logger
from app.scheduler import Scheduler from app.scheduler import Scheduler
from app.schemas.plugin import PluginMemoryInfo
from app.schemas.types import SystemConfigKey from app.schemas.types import SystemConfigKey
PROTECTED_ROUTES = {"/api/v1/openapi.json", "/docs", "/docs/oauth2-redirect", "/redoc"} PROTECTED_ROUTES = {"/api/v1/openapi.json", "/docs", "/docs/oauth2-redirect", "/redoc"}
@@ -494,57 +493,6 @@ def clone_plugin(plugin_id: str,
return schemas.Response(success=False, message=f"创建插件分身失败:{str(e)}") return schemas.Response(success=False, message=f"创建插件分身失败:{str(e)}")
@router.get("/memory", summary="插件内存使用统计", response_model=List[PluginMemoryInfo])
def plugin_memory_stats(_: Annotated[str, Depends(verify_apitoken)]) -> Any:
"""
获取所有插件的内存使用统计信息
"""
try:
plugin_manager = PluginManager()
memory_stats = plugin_manager.get_plugin_memory_stats()
return memory_stats
except Exception as e:
logger.error(f"获取插件内存统计失败:{str(e)}")
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"获取插件内存统计失败:{str(e)}")
@router.get("/memory/{plugin_id}", summary="单个插件内存使用统计", response_model=PluginMemoryInfo)
def plugin_memory_stat(plugin_id: str, _: Annotated[str, Depends(verify_apitoken)]) -> Any:
"""
获取指定插件的内存使用统计信息
"""
try:
plugin_manager = PluginManager()
memory_stats = plugin_manager.get_plugin_memory_stats(plugin_id)
if not memory_stats:
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
detail=f"插件 {plugin_id} 不存在或未运行")
return memory_stats[0]
except HTTPException:
raise
except Exception as e:
logger.error(f"获取插件 {plugin_id} 内存统计失败:{str(e)}")
raise HTTPException(status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail=f"获取插件内存统计失败:{str(e)}")
@router.delete("/memory/cache", summary="清除插件内存统计缓存")
def clear_plugin_memory_cache(_: Annotated[str, Depends(verify_apitoken)],
plugin_id: Optional[str] = None) -> Any:
"""
清除插件内存统计缓存
"""
try:
plugin_manager = PluginManager()
plugin_manager.clear_plugin_memory_cache(plugin_id)
message = f"已清除插件 {plugin_id} 的内存统计缓存" if plugin_id else "已清除所有插件的内存统计缓存"
return schemas.Response(success=True, message=message)
except Exception as e:
logger.error(f"清除插件内存统计缓存失败:{str(e)}")
return schemas.Response(success=False, message=f"清除缓存失败:{str(e)}")
@router.get("/{plugin_id}", summary="获取插件配置") @router.get("/{plugin_id}", summary="获取插件配置")
async def plugin_config(plugin_id: str, async def plugin_config(plugin_id: str,
_: User = Depends(get_current_active_superuser_async)) -> dict: _: User = Depends(get_current_active_superuser_async)) -> dict:
+9
View File
@@ -17,6 +17,7 @@ from watchdog.events import FileSystemEventHandler
from watchdog.observers import Observer from watchdog.observers import Observer
from app import schemas from app import schemas
from app.core.cache import cached
from app.core.config import settings from app.core.config import settings
from app.core.event import eventmanager, Event from app.core.event import eventmanager, Event
from app.db.plugindata_oper import PluginDataOper from app.db.plugindata_oper import PluginDataOper
@@ -863,10 +864,14 @@ class PluginManager(metaclass=Singleton):
""" """
return list(self._running_plugins.keys()) return list(self._running_plugins.keys())
@cached(maxsize=1, ttl=1800)
def get_online_plugins(self, force: bool = False) -> List[schemas.Plugin]: def get_online_plugins(self, force: bool = False) -> List[schemas.Plugin]:
""" """
获取所有在线插件信息 获取所有在线插件信息
""" """
if force:
self.get_online_plugins.cache_clear()
if not settings.PLUGIN_MARKET: if not settings.PLUGIN_MARKET:
return [] return []
@@ -1162,11 +1167,15 @@ class PluginManager(metaclass=Singleton):
return plugin return plugin
@cached(maxsize=1, ttl=1800)
async def async_get_online_plugins(self, force: bool = False) -> List[schemas.Plugin]: async def async_get_online_plugins(self, force: bool = False) -> List[schemas.Plugin]:
""" """
异步获取所有在线插件信息 异步获取所有在线插件信息
:param force: 是否强制刷新(忽略缓存) :param force: 是否强制刷新(忽略缓存)
""" """
if force:
await self.async_get_online_plugins.cache_clear()
if not settings.PLUGIN_MARKET: if not settings.PLUGIN_MARKET:
return [] return []
+17 -16
View File
@@ -58,21 +58,22 @@ class PluginHelper(metaclass=WeakSingleton):
""" """
# 如果强制刷新,直接调用不带缓存的版本 # 如果强制刷新,直接调用不带缓存的版本
if force: if force:
return self._get_plugins_uncached(repo_url, package_version) return self._request_plugins(repo_url, package_version)
else:
return self._request_plugins_cached(repo_url, package_version)
# 正常情况下调用带缓存的版本 @cached(maxsize=128, ttl=1800)
return self._get_plugins_cached(repo_url, package_version) def _request_plugins_cached(self, repo_url: str,
package_version: Optional[str] = None) -> Optional[Dict[str, dict]]:
@cached(maxsize=64, ttl=1800)
def _get_plugins_cached(self, repo_url: str, package_version: Optional[str] = None) -> Optional[Dict[str, dict]]:
""" """
获取Github所有最新插件列表(使用缓存) 获取Github所有最新插件列表(使用缓存)
:param repo_url: Github仓库地址 :param repo_url: Github仓库地址
:param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本 :param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本
""" """
return self._get_plugins_uncached(repo_url, package_version) return self._request_plugins(repo_url, package_version)
def _get_plugins_uncached(self, repo_url: str, package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: def _request_plugins(self, repo_url: str,
package_version: Optional[str] = None) -> Optional[Dict[str, dict]]:
""" """
获取Github所有最新插件列表(不使用缓存) 获取Github所有最新插件列表(不使用缓存)
:param repo_url: Github仓库地址 :param repo_url: Github仓库地址
@@ -923,23 +924,23 @@ class PluginHelper(metaclass=WeakSingleton):
:param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本 :param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本
:param force: 是否强制刷新,忽略缓存 :param force: 是否强制刷新,忽略缓存
""" """
# 异步版本直接调用不带缓存的版本(缓存在异步环境下可能有并发问题)
if force: if force:
await self._async_get_plugins_cached.cache_clear() return await self._async_request_plugins(repo_url, package_version)
return await self._async_get_plugins_cached(repo_url, package_version) else:
return await self._async_request_plugins_cached(repo_url, package_version)
@cached(maxsize=128, ttl=1800) @cached(maxsize=128, ttl=1800)
async def _async_get_plugins_cached(self, repo_url: str, async def _async_request_plugins_cached(self, repo_url: str,
package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: package_version: Optional[str] = None) -> Optional[Dict[str, dict]]:
""" """
获取Github所有最新插件列表(使用缓存) 获取Github所有最新插件列表(使用缓存)
:param repo_url: Github仓库地址 :param repo_url: Github仓库地址
:param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本 :param package_version: 首选插件版本 (如 "v2", "v3"),如果不指定则获取 v1 版本
""" """
return await self._async_get_plugins_uncached(repo_url, package_version) return await self._async_request_plugins(repo_url, package_version)
async def _async_get_plugins_uncached(self, repo_url: str, async def _async_request_plugins(self, repo_url: str,
package_version: Optional[str] = None) -> Optional[Dict[str, dict]]: package_version: Optional[str] = None) -> Optional[Dict[str, dict]]:
""" """
异步获取Github所有最新插件列表(不使用缓存) 异步获取Github所有最新插件列表(不使用缓存)
:param repo_url: Github仓库地址 :param repo_url: Github仓库地址