跳转至

SOP — 共享库同名副本去遮蔽(paramiko / logger / config 三份一并收)

主题目录:slurm_ins/paramiko_unify_20261007/|执行日期:2026-10-07|类型:C 类(改实现体 + 删副本) 触发:收 slurm_ins 最后一项欠账 paramiko_module 双份并存 → 发现它单独收不掉(见第 1 章)

1. 背景

slurm_ins/utils/ 下有三份与共享库同名的副本,deployer.py 等用相对导入取本地副本, 使 .pth 挂载的共享库形同虚设(技能明确:「挂了 .pth ≠ 用了共享库」):

本地副本 行数 与共享库差异(忽略空白) 结论
utils/paramiko_module.py 855 203 行(含 _connect_count、acquire_host_lock;缺 keepalive / batch_logger) 共享库是超集,只多两项能力
utils/logger_module.py 309 16 行(仅文档串与单例位置) 功能等价
utils/config_module.py 148 24 行(仅文档串 + 导入写法) 功能等价

关键坑(本次实测):只把 paramiko_module 指向共享库、却留着 logger_module 副本 → 共享 paramiko 里 from logger_module import log_manager 取的是共享的 logger_module, 而 deployer.py 仍取本地的 → 两个 log_manager 实例分家: deployer 配置的 handler 挂不到 paramiko 的 logger 上, 实测远端命令日志整段消失(paramiko 日志行 194 → 0,而变更记录数不变——静默丢审计线索)。 故三份必须一起去遮蔽。

2. 目标

# 目标 判据
1 把 _connect_count(建连计数/自报)与 acquire_host_lock() 上移共享库 离线自测通过;上机日志出现「本任务共新建连接 N 次」
2 三份副本全部删除,全部改走共享库 官方遮蔽检测 0 处同名副本 / 0 处版本落后
3 判定与日志行为不变 主流程记录 225/25/200、命令数 87、paramiko 日志行 194 全部复位
4 顺带获得「建连数自报」能力(此前 slurm 有、其它工程无) 8 个挂载工程共享该能力

3. 前置条件

  • 工程根 /home/rain/Documents/slurm/slurm_ins,.venv 可用且 .pth 指向 /home/rain/py_public_modules;
  • 共享库 /home/rain/py_public_modules/paramiko_module.py 可写(影响 8 个挂载工程);
  • 变更前完成 5.1 备份;上机验证用 --dry-run(只读)。

4. 影响范围

项 内容
变更对象 共享库 1 文件(paramiko_module.py,纯新增 3 处);slurm_ins 12 文件(9 处导入改写 + deployer.py/utils/file_utils.py/utils/idempotent_utils.py)+ 删除 3 个副本
影响面 共享库改动对其余 7 个挂载工程纯新增、向后兼容;删除副本只影响本工程
是否停服 否
风险等级 中:删副本 = 改导入解析路径,必须上机验证

5. 分步操作

5.1 备份(高危前置)

TOP=/home/rain/Documents/slurm/slurm_ins/paramiko_unify_20261007
STAMP=$(date +%Y%m%d-%H%M%S); cd /home/rain/Documents/slurm/slurm_ins
mkdir -p "$TOP/backup/slurm_ins/utils" "$TOP/backup/py_public_modules"
cp -a /home/rain/py_public_modules/paramiko_module.py "$TOP/backup/py_public_modules/paramiko_module.py.bak.$STAMP"
for f in deployer.py slurm_deployer.py user_mgmt_deployer.py scratch_gc_deployer.py \
         storage_layout_deployer.py local_scratch_deployer.py node_env_deployer.py \
         module_env_deployer.py health_ensure_deployer.py conn_reuse_20261007/selftest.py \
         utils/paramiko_module.py utils/logger_module.py utils/config_module.py \
         utils/file_utils.py utils/idempotent_utils.py; do
  mkdir -p "$TOP/backup/slurm_ins/$(dirname $f)"; cp -a "$f" "$TOP/backup/slurm_ins/$f.bak.$STAMP"; done

预期:15 份快照(STAMP = 20261007-220238)。

5.2 两项能力上移共享库(py_public_modules/paramiko_module.py)

# 概念等价(Python 侧)
# __init__:            self._host_locks = {host: threading.RLock()}  # 可重入
#                      self._connect_count: int = 0
# acquire_host_lock(): 返回该主机的 RLock(不存在则创建)
# get_connection():    host_lock = self.acquire_host_lock(host)   # 取代内联 Lock
#                      新建连接成功处 self._connect_count += 1
# shutdown():          「SSH连接池已关闭 | 本任务共新建连接 N 次 | 结束时保有 M 条」

坑(必须留痕): - 锁必须 RLock:调用方「先持锁、再 get_connection」时普通 Lock 会自锁死; - _connect_count 只是诊断计数,不参与任何判定; - 共享库改动对其余挂载工程是纯新增,但按共享库规则仍须确认向后兼容(本次:新增属性/方法 + 文案,无签名变更)。

5.3 删除三份副本 + 改写导入(slurm_ins)

# 导入改写(9 处 paramiko)
# from .utils.paramiko_module import X   →  from paramiko_module import X
# deployer.py 另有两行:
# from .utils.logger_module import log_manager → from logger_module import log_manager
# from .utils.config_module import ConfigLoader → from config_module import ConfigLoader
# utils/file_utils.py、utils/idempotent_utils.py 内的相对导入同样改写
# 删除:utils/paramiko_module.py、utils/logger_module.py、utils/config_module.py

坑:只改 paramiko 不改 logger/config 会静默丢日志(见第 1 章),三份必须一起。

5.4 离线自测(上机前)

cd /home/rain/Documents/slurm/slurm_ins
.venv/bin/python -m py_compile deployer.py slurm_deployer.py utils/file_utils.py utils/idempotent_utils.py \
  /home/rain/py_public_modules/paramiko_module.py && echo COMPILE_OK
.venv/bin/python paramiko_unify_20261007/selftest.py     # 计数 / RLock 可重入 / shutdown 自报
.venv/bin/python conn_reuse_20261007/selftest.py         # 连接池复用语义(4 项)

预期:COMPILE_OK + PARAMIKO_UNIFY_SELFTEST_OK + CONN_REUSE_SELFTEST_OK。

5.5 官方遮蔽检测 + 上机验证

cd /home/rain/Documents/slurm/slurm_ins
.venv/bin/python /home/rain/.trae-cn/skills/deployment-tool-engineering/references/scripts/shared_lib_divergence_check.py --root "$PWD"
.venv/bin/python main.py --config config/slurm_deploy.yaml --dry-run | grep -E '变更记录总数|待执行|幂等|SSH连接池已关闭'

6. 验证

验证一:官方遮蔽检测【已确认】

发现工程内同名副本 0 处
需处理(版本落后): 0 处

(改前为 3 处副本;这是技能「交付前自检」的阻断项判据,现已通过。)

验证二:离线自测 —— PARAMIKO_UNIFY_SELFTEST_OK(12 项:计数自增/复用不增/RLock 可重入/ 持锁期间 get_connection 不死锁/shutdown 自报/共享库含 keepalive 与 batch_logger/副本已删) + CONN_REUSE_SELFTEST_OK(复用、失活重建、活跃数)。

验证三:上机行为不变【已确认】

项 改前 改后
主流程 --dry-run 记录 225 / 待执行 25 / 幂等 200 225 / 25 / 200
主流程命令数 / 墙钟 87 条 / 11.4 s 87 条 / 12.2 s
paramiko 日志行数 194 194(中间态曾静默为 0,见第 1 章)
--submit-node 26 条 / 12.3 s / 31·0·31 26 条 / 10.6 s / 31·0·31

验证四:新增能力生效 —— 主流程日志末尾出现 SSH连接池已关闭 | 本任务共新建连接 6 次 | 结束时保有 6 条(6 台主机 → 每台恰好 1 次建连) ——这正是此前多轮反复提到「缺建连数自报」的那项,现已具备,且全部 8 个挂载工程共享。

失败判断:遮蔽检测 >0;记录/命令数变化;paramiko 日志行显著减少;任一自测失败 → 按第 7 章回滚。

7. 回滚

  • 备份位置:paramiko_unify_20261007/backup/(15 份),台账见同目录 backup/README.md。
  • 回滚步骤:还原 12 个文件 + 3 个被删副本 + 共享库;注意备份里含被删副本的原文:
cd /home/rain/Documents/slurm/slurm_ins
BAK=paramiko_unify_20261007/backup/slurm_ins
for f in deployer.py slurm_deployer.py user_mgmt_deployer.py scratch_gc_deployer.py \
         storage_layout_deployer.py local_scratch_deployer.py node_env_deployer.py \
         module_env_deployer.py health_ensure_deployer.py conn_reuse_20261007/selftest.py \
         utils/paramiko_module.py utils/logger_module.py utils/config_module.py \
         utils/file_utils.py utils/idempotent_utils.py; do cp -a "$BAK/$f".bak.* "$f"; done
cp -a paramiko_unify_20261007/backup/py_public_modules/paramiko_module.py.bak.* /home/rain/py_public_modules/paramiko_module.py
  • 回滚后验证:遮蔽检测回到 3 处副本;主流程记录 225/25/200。
  • 回滚触发条件:任一验证项不达标;出现导入错误;日志格式异常。

8. 风险说明

风险 缓解
只收 paramiko 会静默丢日志(两个 log_manager 分家) 三份副本一起收;上机以「paramiko 日志行数复位」为验收项
共享库改动波及 7 个其它工程 纯新增(属性/方法/文案),无签名变更;shutdown 文案从「已关闭」变为带计数——若某工程解析该文案需注意(已 grep 各工程无解析)
删除副本导致相对导入解析失败 删除前 grep 全部引用点并改写;py_compile + 上机 --dry-run 双验证
utils/ 下另有同名工具被误删 只删与共享库同名的三个;file_utils.py / idempotent_utils.py 是工程私有,保留

附录 A 交付物清单

文件 说明
SOP.md 本文件
selftest.py 离线自测(计数 / RLock 可重入 / shutdown 自报 / 副本已删)
backup/py_public_modules/ 共享库改前快照
backup/slurm_ins/ 15 份工程侧改前快照(含被删三副本)
backup/README.md 备份台账
变更的实现体 共享库 paramiko_module.py;slurm_ins 12 文件导入改写;删 3 副本

附录 B 遗留

项 说明
slurm_ins/utils/paramiko_module.py 的「两份模块内容拼接」结构 副本已删除,该历史痕迹随之消失(共享库是拍平版)
其它挂载工程是否仍有同名副本 【2026-10-11 结案】 已对 lsf_ins / lustre_ins / k8s_ins / eda_tools_ins / harbor 各跑官方遮蔽检测:0 处版本落后;eda_tools_ins 有 1 处同名副本但已对齐(且在弃用工程 ic25_install 内)

来源:/home/rain/Documents/slurm/slurm_ins/paramiko_unify_20261007/SOP.md | 最后更新:2026-10-11 21:15(由 build/sync.py 同步,请勿在站点侧修改)