fix: adb 命令超时 + STF 释放失败检查,杜绝设备卡死/占用悬空

- adb 所有命令加 30s 超时:connect 到不可达地址不再无限挂起(worker 不再卡 connecting)
- STF release 检查响应状态并重试:504 等失败不再被静默吞掉,释放失败会真实上报
- release_all_mine 返回 (released, failed);web /api/release 透出失败列表
This commit is contained in:
2026-08-08 16:30:42 +08:00
parent 468e86f0a9
commit 3a38d9a57f
4 changed files with 55 additions and 25 deletions
+32 -14
View File
@@ -120,27 +120,45 @@ class STFClient:
return False, str(e)
return False, "占用冲突重试耗尽"
def release(self, serial):
"""释放设备占用(含远程断开)。"""
def release(self, serial, retries=3):
"""释放设备占用。返回 (ok, msg)。
STF 释放可能因设备响应超时返回 504(如设备过载/卡死),此时设备实际未释放。
必须检查响应状态并重试,不能静默吞掉——否则占用会一直悬着。
"""
self.remote_disconnect(serial)
try:
requests.delete(f"{self.base_url}/api/v1/user/devices/{serial}",
headers=self.headers, timeout=_TIMEOUT)
except requests.exceptions.RequestException as e:
_log.warning(f"释放 {serial} 请求失败: {e}")
last_status = None
last_body = ""
for attempt in range(1, retries + 1):
try:
r = requests.delete(f"{self.base_url}/api/v1/user/devices/{serial}",
headers=self.headers, timeout=_TIMEOUT)
if r.status_code in (200, 201, 202, 204):
return True, "released"
last_status = r.status_code
last_body = r.text[:150]
_log.warning(f"释放 {serial} 失败 HTTP {r.status_code}: {last_body} ({attempt}/{retries})")
except requests.exceptions.RequestException as e:
_log.warning(f"释放 {serial} 请求异常 ({attempt}/{retries}): {e}")
last_status = -1
last_body = str(e)
if attempt < retries:
time.sleep(2)
return False, f"STF 释放失败(HTTP {last_status}): {last_body}"
def release_all_mine(self):
"""释放当前账户占用的所有设备(清理用)。"""
released = []
"""释放当前账户占用的所有设备(清理用)。返回 (released, failed)。"""
released, failed = [], []
for d in self.list_my_devices():
serial = d["serial"]
try:
self.release(serial)
ok, msg = self.release(serial)
if ok:
released.append(serial)
_log.info(f"已释放 {serial}")
except Exception as e:
_log.error(f"释放 {serial} 失败: {e}")
return released
else:
failed.append(serial)
_log.error(f"释放 {serial} 失败: {msg}")
return released, failed
# ================== 远程 ADB 隧道 ==================
def remote_connect(self, serial):