47714c9622
回归 (eba7ae8 引入):
sync loop 周期调 sync_instances, 它只看 DB 里 enabled=True 的实例。
但 stop_instance 只停进程 + 设 running=False, 不改 enabled。
结果: 用户手动停止实例后, 30 秒内 sync loop 会把它当'死掉的实例'
自动拉回来——手动停止完全失效。
语义修正:
enabled = 期望运行状态, 是 sync loop 判断'该实例是否应该在跑'的唯一权威。
- stop_instance: enabled=False (手动停止, sync loop 不得自动重启)
- start_instance: enabled=True (手动启动, 否则下轮 sync 会把它当多余停掉)
- start 失败: enabled 保持 True (端口冲突常是暂时的, sync loop 自动重试)
测试:
+ tests/e2e_stop_semantics.py
stop 后等 2 个 loop 周期 (5s), 断言端口不被自动拉回 + DB.enabled=False;
start 后断言端口恢复 + DB.enabled=True + DB.running=True
本地 PASS
全套回归:
smoke tunnel / e2e lifecycle / e2e health / e2e sync loop / e2e stop semantics
全部 PASS