fix(socks5): stop_instance 置 enabled=False, 防 sync loop 自动重启用户手动停止的实例
回归 (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
This commit is contained in:
+14
-2
@@ -290,17 +290,28 @@ class InstanceManager:
|
||||
# 端口占用等启动失败: 回滚状态, 清理缓存, 返回 False
|
||||
log.error("[%s] 启动实例失败: %s", inst.name, e)
|
||||
self._config_cache.pop(inst.name, None)
|
||||
# enabled 保持 True: 用户意图是运行, sync loop 下周期会重试
|
||||
# (端口冲突常是暂时的, 自动重试比让用户手动点更合理)
|
||||
inst.enabled = True
|
||||
inst.running = False
|
||||
db.session.commit()
|
||||
raise
|
||||
with self._lock:
|
||||
self._instances[inst.name] = srv
|
||||
# enabled = 期望运行状态, 是 sync loop 的权威依据。
|
||||
# 手动启动必须置 True, 否则下轮 sync 会把它当"多余实例"停掉。
|
||||
inst.enabled = True
|
||||
inst.running = True
|
||||
db.session.commit()
|
||||
return True
|
||||
|
||||
def stop_instance(self, instance_id):
|
||||
"""停止单个实例。"""
|
||||
"""停止单个实例。
|
||||
|
||||
关键: 必须同时置 enabled=False。enabled 是 sync loop 判断"该实例是否
|
||||
应该在跑"的唯一依据——只停进程不改 enabled, 30 秒内 sync loop 会把它
|
||||
当"死掉的实例"自动重启, 用户的手动停止就失效了。
|
||||
"""
|
||||
from models import Instance
|
||||
from database import db
|
||||
with db.app.app_context():
|
||||
@@ -310,7 +321,8 @@ class InstanceManager:
|
||||
srv = self._instances.pop(inst.name, None)
|
||||
if srv:
|
||||
srv.stop()
|
||||
del self._config_cache[inst.name]
|
||||
self._config_cache.pop(inst.name, None)
|
||||
inst.enabled = False # 手动停止: sync loop 不得自动重启
|
||||
inst.running = False
|
||||
inst.active_connections = 0
|
||||
db.session.commit()
|
||||
|
||||
Reference in New Issue
Block a user