# 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)