🔴 [H10] Loading 状态下忽略文件变更事件 #10

Closed
opened 2026-06-03 13:52:51 +08:00 by dailz · 1 comment
Owner

文件: tui/app.rs:839-919
分类: 状态机 / 并发

问题: handle_file_appendedhandle_file_truncated 仅在 Ready 状态响应。如果文件在 Loading 期间被修改,索引完成后用的是过期快照

fn handle_file_appended(&mut self) {
    match &mut self.loading_state {
        AppLoadingState::Ready { reader } => { /* 处理 */ }
        _ => {}  // ← Loading 状态被静默忽略!
    }
}

建议修复: Loading 状态下收到文件变更事件应取消/重启加载。

**文件**: `tui/app.rs:839-919` **分类**: 状态机 / 并发 **问题**: `handle_file_appended` 和 `handle_file_truncated` 仅在 `Ready` 状态响应。如果文件在 Loading 期间被修改,索引完成后用的是**过期快照**。 ```rust fn handle_file_appended(&mut self) { match &mut self.loading_state { AppLoadingState::Ready { reader } => { /* 处理 */ } _ => {} // ← Loading 状态被静默忽略! } } ``` **建议修复**: Loading 状态下收到文件变更事件应取消/重启加载。
dailz added the area/tuibugseverity/high labels 2026-06-03 13:52:51 +08:00
dailz closed this issue 2026-06-04 17:33:07 +08:00
Author
Owner

已修复

提交: 534a089 fix(tui): defer file-change events during Loading state to prevent stale reader

修复方案:延迟重载标记

App 中新增 reload_after_loading: bool 标志位:

  1. handle_file_appended / handle_file_truncated 改为显式三分支 match:

    • Ready → 正常处理
    • Loading → 设置 reload_after_loading = true
    • 其余 → 忽略
  2. poll_background_indexerIndexerMessage::Complete 分支:Loading→Ready 转换完成后检查 flag,触发 reload_ready_reader() 全量重载

  3. IndexerMessage::Error 分支清除 flag 防止残留

  4. 提取 reload_ready_reader() 私有方法(从 handle_file_truncated Ready 分支抽取),避免语义耦合

回归测试(4 个)

  • test_append_during_loading_sets_reload_flag
  • test_truncate_during_loading_sets_reload_flag
  • test_multiple_events_during_loading_collapse_to_single_reload
  • test_indexer_error_clears_reload_flag

全部 92 个测试通过,0 失败。

## 已修复 ✅ **提交**: `534a089` fix(tui): defer file-change events during Loading state to prevent stale reader ### 修复方案:延迟重载标记 在 `App` 中新增 `reload_after_loading: bool` 标志位: 1. `handle_file_appended` / `handle_file_truncated` 改为显式三分支 match: - `Ready` → 正常处理 - `Loading` → 设置 `reload_after_loading = true` - 其余 → 忽略 2. `poll_background_indexer` 的 `IndexerMessage::Complete` 分支:Loading→Ready 转换完成后检查 flag,触发 `reload_ready_reader()` 全量重载 3. `IndexerMessage::Error` 分支清除 flag 防止残留 4. 提取 `reload_ready_reader()` 私有方法(从 `handle_file_truncated` Ready 分支抽取),避免语义耦合 ### 回归测试(4 个) - `test_append_during_loading_sets_reload_flag` - `test_truncate_during_loading_sets_reload_flag` - `test_multiple_events_during_loading_collapse_to_single_reload` - `test_indexer_error_clears_reload_flag` 全部 92 个测试通过,0 失败。
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: dailz/logViewer#10