Skip to content

fix: 火山引擎弱网连接重试 + Windows 概率性「未配置」修复#722

Closed
appergb wants to merge 2 commits into
betafrom
fix/volc-win-config-network-resilience
Closed

fix: 火山引擎弱网连接重试 + Windows 概率性「未配置」修复#722
appergb wants to merge 2 commits into
betafrom
fix/volc-win-config-network-resilience

Conversation

@appergb

@appergb appergb commented Jun 21, 2026

Copy link
Copy Markdown
Collaborator

User description

背景

两个用户反馈的火山引擎接入问题,根因均已定位并修复。纯后端、外科手术式改动,对 PC 端只增不减、无 UI 改动

问题 1:Windows 端概率性显示「火山引擎未配置」,但实际可正常使用

根因:Windows Credential Manager(CredReadW) 在登录后/并发下读取凭据条目时会瞬时失败。凭据 v1 payload 按 1000 UTF-16 单位分片存成 manifest + 多个 chunk 条目;load_keyring_credentials 顺序读每一条,任一条读失败就 ? 抛错 → load_credentials 回退到空默认值 → 概览页 asrConfigured=false 显示「未配置」。而错误路径不缓存,下一次听写重读成功,所以是概率性、且实际能用。chunk 越多,单次 load 读取次数越多,命中瞬时失败概率越高。

修法persistence/credentials.rs):仅在 Windows 上,对非 NoEntry 的读错误做有限次短退避重试(4 次 / 60·n ms)。NoEntry 是确定的「未存储」立即返回,不付重试延迟。macOS/Linux 保持原单次行为(cfg 隔离)——其读错误是 ACL 拒绝,重试无益,且会拖慢 macOS 首次 Keychain 授权流程。

问题 2:网络环境较差时无法正常进行语音输入

根因open_session 里的 connect_async 既无超时也无重试。弱网下 TLS/WS 握手可挂到 OS 级 TCP 超时(几十秒),用户卡在「Starting」;协调器全局超时只覆盖 await_final_result不覆盖 open_session。单次网络抖动也直接让整次听写失败。

修法asr/volcengine.rs):每次握手包 5s 超时,最多 3 次尝试、250·n ms 退避;AuthRejected(凭据被拒)短路不重试。请求构造抽成 build_connect_requestconnect_async 消费 request 且 http::RequestClone,需每次重建)。最坏耗时从「无界(~75s)」降到有界(~15s),并新增抖动可恢复。桌面与安卓共享此路径,改动对两端等效。

平台影响

  • Windows 凭据修复:#[cfg(target_os="windows")] 隔离,macOS/Linux/Android 零变更
  • 连接超时重试:桌面 + 安卓共享,对 PC 端纯增益(更快失败 + 可恢复),无 UI 改动。

验证

  • cargo check 通过(仅既有无关 warning)
  • cargo test --lib 458 passed / 0 failed
  • 自有新增代码已过 rustfmt

🤖 Generated with Claude Code


PR Type

Bug fix


Description

  • Fix probabilistic "Volcengine not configured" on Windows by credential read retry

  • Fix session hang on poor network with connection timeout and retry


Diagram Walkthrough

flowchart LR
    subgraph Windows Credential Read
        A[Read credential] --> B{Success?}
        B -- Yes --> C[Return value]
        B -- No --> D{NoEntry?}
        D -- Yes --> E[Return None]
        D -- No --> F[Retry up to 4 times, 60ms backoff]
        F --> A
    end
    subgraph Volcengine Connection
        G[Connect with 5s timeout] --> H{Success?}
        H -- Yes --> I[Return WebSocket]
        H -- No --> J{AuthRejected? or max retries?}
        J -- Yes --> K[Return error]
        J -- No --> L[Sleep backoff, retry]
        L --> G
    end
Loading

File Walkthrough

Relevant files
Bug fix
volcengine.rs
Add timeout and retry for Volcengine WebSocket connection

openless-all/app/src-tauri/src/asr/volcengine.rs

  • Added CONNECT_TIMEOUT (5s) and CONNECT_MAX_ATTEMPTS (3) with backoff
  • Refactored connection into build_connect_request and
    connect_with_retry
  • connect_with_retry handles timeout and transient errors, excludes
    AuthRejected
+83/-28 
credentials.rs
Retry transient Windows credential read failures                 

openless-all/app/src-tauri/src/persistence/credentials.rs

  • Added retry loop for Windows-specific credential read failures (4
    attempts, 60ms backoff)
  • NoEntry errors are not retried; returned immediately
  • macOS/Linux remain unchanged
+54/-5   

sim added 2 commits June 21, 2026 11:08
Windows Credential Manager(CredReadW)在登录后/并发下读 manifest+各 chunk 条目
时可能瞬时失败。任一条目读失败会让整组凭据看起来为空 → load_keyring_credentials
返回 Err → load_credentials 回退到空默认值 → 概览页显示「火山引擎未配置」,但下
一次听写重读成功,所以是「概率性」且「实际可正常使用」。凭据 chunk 越多,单次
load 读取次数越多,命中瞬时失败的概率越高。

修法:仅在 Windows 上对非 NoEntry 的读错误做几次短退避重试(4 次 / 60·n ms)。
NoEntry 是确定的「未存储」,立即返回不付重试延迟。macOS/Linux 保持原单次行为
——它们的读错误是 ACL 拒绝,重试无益,且未缓存的错误路径下次调用本就会重读,
加 sleep 只会拖慢 macOS 首次 Keychain 授权流程。纯后端、cfg 隔离,零 PC-macOS 影响。
connect_async 此前既无超时也无重试:弱网下 TLS/WebSocket 握手可能挂到 OS 级
TCP 超时(几十秒),期间用户卡在「Starting」;而协调器全局超时只覆盖
await_final_result,不覆盖 open_session,所以握手挂起完全不受约束。单次网络
抖动(连接被重置/瞬时 DNS 失败)也会直接让整次听写失败。

修法:每次握手包 5s 超时,最多 3 次尝试、250·n ms 退避。AuthRejected(凭据被拒)
短路不重试——重试不会变好只会拖慢报错。把请求构造抽成 build_connect_request
(connect_async 消费 request 且 http::Request 非 Clone,需每次重建)。

桌面与安卓共享此路径,改动对两端等效;最坏耗时从「无界(~75s)」降到有界(~15s)
并新增抖动可恢复,对 PC 端只增不减。
@github-actions

Copy link
Copy Markdown
Contributor

PR Reviewer Guide 🔍

Here are some key observations to aid the review process:

⏱️ Estimated effort to review: 2 🔵🔵⚪⚪⚪
🧪 No relevant tests
🔒 No security concerns identified
⚡ No major issues detected

@jiangmuran

Copy link
Copy Markdown
Collaborator

已实现相同功能并推送至beta分支 并且针对所有来源渠道商而非单一火山引擎 并增加了队列处理等特性

@jiangmuran jiangmuran closed this Jun 21, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants