08a0157c95
调度页执行周期可视化/单次执行/分类选机/推送源对齐;登录 IP 门控与无缝导航; 服务器批量后台任务、执行记录、凭据合并、各页激活刷新与错误提示修复。 Co-authored-by: Cursor <cursoragent@cursor.com>
39 lines
1.6 KiB
Markdown
39 lines
1.6 KiB
Markdown
# 2026-06-08 批量检测目标路径 — 服务器名称与并发 Session 修复
|
||
|
||
## 摘要
|
||
|
||
修复「自动检测目标路径」等批量 SSH 操作结果弹窗显示 `#164` 而非服务器全名的问题;消除并行任务共用 `AsyncSession` 导致的 `isce` / `readexactly` 错误。
|
||
|
||
## 动机
|
||
|
||
- 批量 `detect-path` / install / upgrade / uninstall 在 `asyncio.gather` 内并发调用 `service.get_server()` 与 `db.commit()`,触发 SQLAlchemy `This session is provisioning a new connection; concurrent operations are not permitted`
|
||
- 异常发生在读取 `server.name` 之前时 `server_name` 为空,前端回退为 `#${server_id}`
|
||
|
||
## 涉及文件
|
||
|
||
- `server/api/servers.py` — `_prefetch_batch_servers`、独立 Session 写库、`_batch_server_display_name`
|
||
- `frontend/src/components/servers/BatchAgentResultDialog.vue` — 移除 `#id` 回退
|
||
- `tests/test_batch_server_display_name.py`
|
||
|
||
## 行为
|
||
|
||
1. 批量操作前一次性 `get_by_ids` 预取服务器
|
||
2. 并行阶段仅 SSH,写库使用独立 `AsyncSessionLocal`
|
||
3. 结果始终带完整 `server_name`(name → domain →「未知服务器」)
|
||
|
||
## 迁移/重启
|
||
|
||
- 需重启 API / 重建镜像
|
||
|
||
## 验证
|
||
|
||
```bash
|
||
pytest tests/test_batch_server_display_name.py -q
|
||
# 跨页多选 → 检测目标路径 → 弹窗每台显示完整公司/站点名(非 #id)
|
||
```
|
||
|
||
## 2026-06-08 补充(名称仍缺失)
|
||
|
||
- 预取后立即固化 `labels` dict,不等到并行任务内再读 ORM
|
||
- 前端 `enrichBatchAgentResults`:API `server_name` 为空时用列表页已加载的 `name` 补全(表格勾选仅存 ID)
|