modify 内置插件配置修改失效问题
This commit is contained in:
@@ -438,10 +438,14 @@ def resolve_runtime_config(
|
|||||||
cached = toml_cfg
|
cached = toml_cfg
|
||||||
cache[key] = cached
|
cache[key] = cached
|
||||||
return {**config, **cached}
|
return {**config, **cached}
|
||||||
# toml(默认):toml 覆盖并修正缓存
|
# toml(默认):toml 仅作为「启动种子」。缓存缺失时写入;
|
||||||
toml_cfg = dict(toml_cfg)
|
# 缓存已存在(可能被运行时 config_set 更新过)则保留,不再用 toml 覆盖,
|
||||||
cache[key] = toml_cfg
|
# 否则会丢掉前端/管理指令对内置插件(inline)写入的配置——即“改了不生效”。
|
||||||
return {**config, **toml_cfg}
|
cached = cache.get(key)
|
||||||
|
if not isinstance(cached, dict):
|
||||||
|
cached = dict(toml_cfg)
|
||||||
|
cache[key] = cached
|
||||||
|
return {**config, **cached}
|
||||||
|
|
||||||
|
|
||||||
def _merge_runtime_config(config: Dict[str, Any], updates: Dict[str, Any]) -> Dict[str, Any]:
|
def _merge_runtime_config(config: Dict[str, Any], updates: Dict[str, Any]) -> Dict[str, Any]:
|
||||||
@@ -557,6 +561,8 @@ async def _handle_admin_command(
|
|||||||
# 写回改为缓存侧(不再回写 config.toml)。缓存为全局唯一事实来源,
|
# 写回改为缓存侧(不再回写 config.toml)。缓存为全局唯一事实来源,
|
||||||
# 仅 index0 执行写+热重载,避免多副本并发 read-modify-write;其余副本只应用。
|
# 仅 index0 执行写+热重载,避免多副本并发 read-modify-write;其余副本只应用。
|
||||||
cache = getattr(controller, "cache", None)
|
cache = getattr(controller, "cache", None)
|
||||||
|
# 记录旧值,便于热重载失败时回滚,避免缓存与运行配置不一致
|
||||||
|
prev_section = _read_worker_config_section(cache, worker_type)
|
||||||
if controller.index == 0:
|
if controller.index == 0:
|
||||||
new_section = _persist_worker_config_section(cache, worker_type, updates)
|
new_section = _persist_worker_config_section(cache, worker_type, updates)
|
||||||
applied_updates = {
|
applied_updates = {
|
||||||
@@ -576,11 +582,24 @@ async def _handle_admin_command(
|
|||||||
k: v for k, v in updates.items()
|
k: v for k, v in updates.items()
|
||||||
if k not in CONFIG_FORBIDDEN_KEYS
|
if k not in CONFIG_FORBIDDEN_KEYS
|
||||||
}
|
}
|
||||||
# 热重载:index0 副本触发插件重新初始化(重建客户端等),使新配置立即生效
|
# 热重载:index0 副本触发插件重新初始化(重建客户端等),使新配置立即生效。
|
||||||
|
# 若重建失败(如必填参数缺失),回滚缓存并中止重启——绝不带崩溃配置重启副本,
|
||||||
|
# 也避免缓存记录了一份实际未生效的配置。
|
||||||
if controller.index == 0 and controller.reload_cb is not None:
|
if controller.index == 0 and controller.reload_cb is not None:
|
||||||
|
try:
|
||||||
await controller.reload_cb(
|
await controller.reload_cb(
|
||||||
_merge_runtime_config(config or {}, applied_updates)
|
_merge_runtime_config(config or {}, applied_updates)
|
||||||
)
|
)
|
||||||
|
except Exception as e: # noqa: BLE001 - 重建失败回滚一致状态
|
||||||
|
if cache is not None:
|
||||||
|
cache[_configs_cache_key(worker_type)] = prev_section
|
||||||
|
logger.error(
|
||||||
|
"[Worker] %s 配置热重载失败,已回滚缓存并中止重启: %s",
|
||||||
|
worker_id, e,
|
||||||
|
)
|
||||||
|
raise RuntimeError(
|
||||||
|
f"配置热重载失败,未重启(已回滚): {e}"
|
||||||
|
) from e
|
||||||
logger.info(
|
logger.info(
|
||||||
"[Worker] %s 配置热重载完成,将以新配置重启", worker_id,
|
"[Worker] %s 配置热重载完成,将以新配置重启", worker_id,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user