shy3130
b8f1ebaaf0
fix(mining): 旧格式锁也能定位持有者并强制释放, 不再永久卡挖掘
用户反馈: 挖掘工作台一直提示「挖掘锁被其他进程占用 — 锁文件为旧格式,
无法定位持有进程」(v0.3.17+ fail-closed 设计)。根因: 锁内容是 v0.2 时代
写入的 b"0" (无 pid), 持有者为升级前启动、仍在运行的旧版后端残留进程;
flock 是 OS 级锁, 进程存活即一直占用, 旧版本无法被识别 → 强制释放按钮
永不出现, 用户只能去任务管理器逐个猜进程。
- mining_process_lock: 新增 locate_lock_holder_pid — 锁内容不可读时用
lsof (POSIX) / psutil (跨平台兜底) 反查打开锁文件的进程; 只认本产品
形态 (python/uvicorn/desktop/tickflow), 且连续两次扫描命中才采信,
避免误杀瞬时探测或无关进程 (误杀是破坏性操作, 宁可定位失败)
- mining_lock_admin.lock_status: 旧格式锁 → OS 反查持有者, 继续走既有
fail-closed 判定 (无进行中挖掘 + 存储静默 >=600s 才允许释放);
状态新增 holder_source 字段
- 前端横幅: 展示「已通过系统扫描定位」并出现既有「强制停止并接管」按钮;
定位失败时保留手动指引
- 设计纪律不变: 仍只提供人工确认的强制释放, 不做启动自动 kill
验证: 新增 4 条用例 (旧格式持锁进程定位 / 强制释放完整接管 / 挖掘活跃时
仍拒绝 fail-closed / 锁空闲不误报); 撤销集成时 3 条红, 恢复后绿;
后端全量 3540 passed; 前端 build + tsc 通过。
Signed-off-by: shy3130 <shy3130@qq.com>
2026-10-29 21:21:13 +08:00
..
2026-10-10 21:10:44 +08:00
2026-06-18 17:18:23 +08:00
2026-09-20 07:52:56 +09:00
2026-10-29 11:10:06 +08:00
2026-07-08 18:10:19 +08:00
2026-10-13 13:40:17 +08:00
2026-09-26 11:31:11 +08:00
2026-10-10 21:10:44 +08:00
2026-09-26 11:31:11 +08:00
2026-10-10 21:10:44 +08:00
2026-10-26 12:13:19 +08:00
2026-09-05 15:41:15 +08:00
2026-09-10 19:38:33 +09:00
2026-09-10 08:04:48 +09:00
2026-10-27 18:44:47 +08:00
2026-10-27 18:45:17 +08:00
2026-10-13 13:40:17 +08:00
2026-08-30 19:05:30 +08:00
2026-09-04 16:37:06 +08:00
2026-10-13 13:40:17 +08:00
2026-09-26 11:31:11 +08:00
2026-09-28 19:14:01 +09:00
2026-10-28 12:46:51 +08:00
2026-10-19 14:37:21 +08:00
2026-10-15 12:27:59 +08:00
2026-10-26 13:51:29 +08:00
2026-10-26 22:10:39 +08:00
2026-10-22 17:47:59 +08:00
2026-10-28 12:46:41 +08:00
2026-09-04 12:03:06 +08:00
2026-10-13 13:40:17 +08:00
2026-09-14 20:02:10 +09:00
2026-10-25 23:43:34 +08:00
2026-10-25 23:43:34 +08:00
2026-10-25 23:43:34 +08:00
2026-10-27 18:45:17 +08:00
2026-08-31 16:50:21 +08:00
2026-10-21 18:05:45 +08:00
2026-10-20 13:59:07 +08:00
2026-09-09 07:10:55 +09:00
2026-10-29 18:39:40 +08:00
2026-10-26 00:01:20 +08:00
2026-10-16 13:32:26 +08:00
2026-10-18 14:38:11 +08:00
2026-08-16 23:39:07 +08:00
2026-07-08 18:10:19 +08:00
2026-10-21 18:05:36 +08:00
2026-08-16 23:39:07 +08:00
2026-10-25 23:43:34 +08:00
2026-10-25 23:43:34 +08:00
2026-10-29 21:21:13 +08:00
2026-10-25 23:43:34 +08:00
2026-08-16 23:39:07 +08:00
2026-10-29 21:21:13 +08:00
2026-10-25 23:43:34 +08:00
2026-09-28 19:12:08 +09:00
2026-10-24 22:52:36 +08:00
2026-10-25 17:31:05 +08:00
2026-09-15 17:43:56 +08:00
2026-06-23 21:47:29 +08:00
2026-10-04 16:50:58 +08:00
2026-10-29 18:39:40 +08:00
2026-10-27 18:45:02 +08:00
2026-10-16 13:32:26 +08:00
2026-10-27 18:45:17 +08:00
2026-09-24 11:06:22 +08:00
2026-10-19 16:45:13 +08:00
2026-08-31 16:50:21 +08:00
2026-10-16 09:06:04 +08:00
2026-10-10 21:10:44 +08:00
2026-07-08 18:10:19 +08:00
2026-10-27 18:44:51 +08:00
2026-10-19 16:45:13 +08:00
2026-10-19 16:45:13 +08:00
2026-10-25 20:14:10 +08:00
2026-09-26 17:44:47 +08:00
2026-09-10 19:36:30 +09:00
2026-10-16 16:45:03 +08:00
2026-10-10 21:10:44 +08:00
2026-10-10 21:10:44 +08:00
2026-09-05 21:14:53 +09:00
2026-07-09 16:35:21 +08:00