SOP — 共享库 base_module 新增只读探测缓存(三件套之③)¶
主题目录:
py_public_modules_changes/probe_cache_20261008/|执行日期:2026-10-08|类型:C 类(改共享库) 触发:把「只读探测批量化」推广到 harbor / lustre_ins / eda_tools_ins 时发现, 三件套的 ①(拼 shell)②(主机间并发)共享库已有,③ 进程内(host,命令)缓存没有 (precheck_module有_probe_cache,但只覆盖它自己的 check_*;base_module完全没有)
1. 背景¶
- 8 个工程挂载共享库
/home/rain/py_public_modules(.pth),其中多个继承base_module.BaseModule; - 缺缓存 → 同一事实被
pre_check/sync_status/execute/validate各查一遍,重复往返; - 本次为纯新增能力,不改变任何既有方法语义(见第 4 章)。
2. 目标¶
| # | 目标 | 判据 |
|---|---|---|
| 1 | 新增 query_on_host(host, cmd):命中 (host,命令原文) 缓存则不下发 |
离线自测:第二次调用零下发 |
| 2 | 新增 probe_per_host(hosts, probes):每台一条 shell 取回并回填缓存 |
离线自测:每台 1 条;回填后 query_on_host 命中 |
| 3 | 变更后自动失效,避免读到陈旧值 | run_on_host(默认)/ apply_change 执行后清空;dry-run 不清 |
| 4 | 向后兼容 | run_on_host 旧位置参数形态不变;可 BASE_MODULE_PROBE_CACHE=0 关闭 |
3. 前置条件¶
- 共享库根
/home/rain/py_public_modules(非 git 仓库,故以文件备份留档); - 任一挂载了共享库的解释器(本次用
slurm_ins/.venv/bin/python); - 变更前完成 5.1 备份。
4. 影响范围¶
| 项 | 内容 |
|---|---|
| 变更对象 | base_module.py(单文件) |
| 改动性质 | 纯新增 3 个方法 + __init__ 2 个字段;run_on_host 增一个默认 True 的参数;apply_change 末尾加一次清空 |
| 受影响方 | 8 个挂载工程的 BaseModule 子类(默认行为不变:不用 query_on_host 的代码完全无感) |
| 是否停服 | 否 |
| 回滚风险 | 低:单文件可整体还原 |
5. 分步操作¶
5.1 备份¶
TOP=/home/rain/Documents/py_public_modules_changes/probe_cache_20261008
mkdir -p "$TOP/backup"
cp -a /home/rain/py_public_modules/base_module.py "$TOP/backup/base_module.py.bak.$(date +%Y%m%d-%H%M%S)"
chmod 600 "$TOP"/backup/base_module.py.bak.*
5.2 改动点(实现体源码改动,非手工命令)¶
# __init__:
# self._probe_cache: Dict[Tuple[str, str], str] = {} # 键 (host, 命令原文) → stdout(strip)
# self._probe_cache_enabled = os.environ.get("BASE_MODULE_PROBE_CACHE", "1") != "0"
# run_on_host(host, cmd, timeout=300, retry=3, invalidate_cache=True)
# 命令下发后:if invalidate_cache: self.invalidate_probe_cache()
# invalidate_probe_cache() # 公开,供手工/变更后调用
# query_on_host(host, cmd) -> str # 只读;命中即返回;未命中走 run_on_host(..., invalidate_cache=False) 并写缓存
# probe_per_host(hosts, probes) # 每台 run_on_host(_kv_script(probes), invalidate_cache=False)
# # → _parse_kv → 回填 self._probe_cache[(host, cmd)]
# apply_change(...):action() 之后 invalidate_probe_cache()
关键约束:缓存键是 (host, 命令原文),故 probe_per_host 里的命令文本必须与后续
query_on_host 的文本逐字相同,否则不命中(退化为逐条,不影响正确性)。
为什么 run_on_host 默认清缓存:命令一旦下发就可能改变远端状态;默认清空可避免后续读到旧值。
代价是「仍用 run_on_host 做只读」的老代码享受不到缓存 —— 这是有意的:想让缓存生效就必须显式改用
query_on_host / probe_per_host,语义边界清晰。
5.3 离线自测¶
cd /home/rain/Documents/py_public_modules_changes/probe_cache_20261008
python3 -m py_compile /home/rain/py_public_modules/base_module.py && echo COMPILE_OK
/home/rain/Documents/slurm/slurm_ins/.venv/bin/python selftest.py # → BASE_MODULE_PROBE_CACHE_SELFTEST_OK
5.4 挂载工程 import 冒烟¶
for p in /home/rain/Documents/slurm/slurm_ins/.venv/bin/python \
/home/rain/Documents/services/harbor/.venv/bin/python \
/home/rain/Documents/kvm/kvm_deploy/.venv/bin/python; do
"$p" -c "import base_module,paramiko_module,precheck_module,ssh_executor; print('OK', base_module.__file__)"
done
6. 验证¶
验证一:离线自测【已确认】BASE_MODULE_PROBE_CACHE_SELFTEST_OK(13 项,桩 connection_pool,不连主机):
| 用例 | 结果 |
|---|---|
query_on_host 命中不再下发 / 不同主机不串 |
OK |
run_on_host 默认清缓存;invalidate_cache=False 不清 |
OK |
probe_per_host 每台 1 条 + 回填 → query_on_host 全部命中 |
OK |
apply_change 后失效;dry-run 的 apply_change 不清 |
OK |
| 缓存关闭(属性 / 环境变量) | OK |
run_on_host 旧调用形态仍可用 |
OK |
验证二:挂载工程冒烟【已确认】3 个不同 venv 解释器 import base_module 均解析到
/home/rain/py_public_modules/base_module.py(说明 .pth 生效、无遮蔽)。
验证三:下游工程上机对照【已确认】harbor / lustre_ins / eda_tools_ins 各自以此能力改造后
--dry-run / precheck 新旧对照,命令数与墙钟下降、变更清单逐条一致(见各自主题 SOP)。
失败判断:自测或冒烟失败 → 按第 7 章整体还原。
7. 回滚¶
cp -a /home/rain/Documents/py_public_modules_changes/probe_cache_20261008/backup/base_module.py.bak.* \
/home/rain/py_public_modules/base_module.py
回滚后验证:py_compile + 复跑 5.4 冒烟。
8. 风险说明¶
| 风险 | 缓解 |
|---|---|
| 共享库改动波及 8 个工程 | 纯新增 + 默认参数;不用新 API 的代码零影响;回滚为单文件还原 |
老代码用 run_on_host 做只读 → 缓存被频繁清空 |
不影响正确性,仅少收益;会促使迁移到 query_on_host |
| 变更后未清缓存 → 读到旧值 | run_on_host / apply_change 自动清;invalidate_probe_cache() 可手工补 |
| 命令文本漂移 → 预取白做 | 约束写入 docstring;下游各自 selftest 断言文本一致 |
无 git 无法 git diff 追溯 |
备份留档 + 本 SOP 记录改动点 |
附录 A 交付物清单¶
| 文件 | 说明 |
|---|---|
SOP.md |
本文件 |
selftest.py |
离线自测(13 项) |
backup/base_module.py.bak.YYYYmmdd-HHMMSS |
改造前快照(chmod 600) |
| 变更的共享库文件 | /home/rain/py_public_modules/base_module.py |
附录 B RUNBOOK 判定¶
共享库是库、非服务,无独立 RUNBOOK;其使用方式(query_on_host / probe_per_host /
invalidate_probe_cache 的语义与约束)已由 docstring 与
deployment-tool-engineering 技能承载。不新增 RUNBOOK。
来源:
/home/rain/Documents/py_public_modules_changes/probe_cache_20261008/SOP.md| 最后更新:2026-10-08 11:45(由build/sync.py同步,请勿在站点侧修改)