[Bug] 一直报错Indexing policy changed
Maintainer thường phản hồi trong vòng 1 ngày
Đánh giá
- Độ khó
- 4/5
- Thời gian dự kiến
- 3-5 ngày
- Mức phù hợp với người mới
- 48/100
- Loại issue
- Lỗi
- Độ rõ ràng
- Khá rõ ràng
- Mức độ hoạt động
- Sôi nổi
- Công nghệ
- java, typescript
Hướng nghiên cứu
Start with the reported language and application logs under logs/language and logs/application, then trace the workspace indexing policy failure in the LSP startup path; the report names lsp-core-adapter-*.js but gives no source file or test. Reproduce with the described Windows 11, 16-module Maven workspace and automatic Java project import. Done means Java LSP startup completes without repeated “Indexing policy changed” cancellations.
Do mô hình lập chỉ mục viết ra từ nội dung của issue.
Mô tả
[Bug] Windows: "Indexing policy changed" 反复取消 Java LSP 启动,Java 语言服务始终无法就绪
环境
| 项 | 值 |
|---|---|
| Lithe 版本 | 0.6.7(Windows x64,正式版,2026-11-04 构建) |
| 系统 | Windows 11 专业版 build 26300(64 位) |
| JDK | 使用 Lithe 自带的 JDT LS + 内置 JDK(LanguageServers/jdk),未自定义 |
| 工程类型 | Maven 多模块(16 个模块,约 630 个 .java,工作区约 26 MB,依赖全部来自本地仓库) |
| 相关设置 | 索引设置为默认值(Git 忽略开启、无手动排除);autoSave = true;javaProjectImportOnOpen = "automatic";单窗口、单工作区 |
| 日志级别 | 默认(<app_local_data_dir>/logs/{application,language}) |
单次失败耗时分布(最新会话,毫秒):6072, 9391, 12152, 13250, 14683, 27327, 30999, 31772, 39284, 41519, 75028, 94725, 113480, 114143, 130464, 136063, 140129, 144482, 161339, 231036, 253610, 261048, 285503。可见耗时跨度从 6 秒到近 5 分钟,越往后越接近“导入已接近完成时被打断”。
关键日志片段(已脱敏)
Language 日志(logs/language/lithe.*.log):
02:13:11.320 ERROR [scope=runtime.console] Failed to read workspace indexing policy for file change: IndexingSettingsError: configureFailed
02:13:11.310 INFO [scope=lsp.lifecycle] javaWorkspaceDetection:started language_id=java outcome=started
02:13:12.100 INFO [scope=lsp.lifecycle] sessionStart:started language_id=java provider_id=java outcome=started
02:13:43.119 ERROR [scope=lsp.lifecycle] sessionStart:failed duration_milliseconds=30999
error="Indexing policy changed" error_code=cancelled language_id=java
operation=sessionStart provider_id=java stage=processStart outcome=failed
02:13:43.120 ERROR [scope=editor.LSPClient] Failed to start LSP for file:
detail="Error: Indexing policy changed at .../assets/lsp-core-adapter-*.js"
02:13:43.120 ERROR [scope=editor.LspIntegration] LSP initialization failedApplication 日志(logs/application/lithe.*.log),同一时刻还有一组“工作区会话关闭”的连带错误:
02:13:43.908 ERROR [scope=runtime.console] [fff] workspace sync failed: Error: Workspace window closed
02:13:11.310 WARN [scope=runtime.console] MyBatis index failed: Error: Workspace window closed
02:13:11.310 WARN [scope=runtime.console] Spring index failed: indexFailed以及工程打开当刻就已经失败过一次:
02:13:11.320 ERROR [scope=runtime.console] Failed to read workspace indexing policy for file change: IndexingSettingsError: configureFailed
02:13:11.310 INFO [scope=workspace-open] setProjectRoot:end duration_ms=38340源码定位(0.6.7 / main)
1. 消息来源:rust/lithe-core/src/project/indexing.rs
// 发布阶段:代次已被替换
if !entries.get(&root).is_some_and(|current| Arc::ptr_eq(current, &context)) {
return Err(CoreError::new(ErrorCode::Cancelled, "Indexing policy changed"));
}
// 检查点:代次已退役
impl IndexingContext {
pub(crate) fn check(&self) -> Result<(), CoreError> {
crate::protocol::cancellation::check()?;
if self.retired.load(Ordering::Acquire) {
return Err(CoreError::new(ErrorCode::Cancelled, "Indexing policy changed"));
}
Ok(())
}
}这条路径上有四个地方会退役当前代次:
configure()/configure_with_provider_update()(策略不同、refresh = true,或旧代次已退役时新建代次并retired.store(true));refresh_indexing()(workspace.refreshIndexing,安装refreshed_context并退役旧代次);refresh()(文件监听侧刷新,同样退役旧代次);release_lease()(最后一个租约释放后退役)。
2. LSP 启动与索引策略的耦合点:prepare_provider_exclusions() 在给 provider 下发新代次前调用 context.check()?,命中退役即返回上面的 Cancelled;而 sessionStart 把这个错误直接当作启动失败处理,没有重取最新代次重试。
3. 前端重试覆盖不全:windows/tauri/src/features/file-explorer/stores/workspace-indexing.ts 只对 workspace.configureIndexing / workspace.refreshIndexing 的 cancelled 做了有限重试(supersededRetries < 2),LSP 启动链路没有对应处理,三次尝试用尽后原始错误被弹成通知。
推测根因
JDT 冷启动(Maven 导入 + 依赖解析)耗时很长(本例 6 秒 ~ 285 秒)。在此期间只要有任意一处重新安装索引策略,正在进行的 sessionStart 就会在检查点被判为 Cancelled,整段启动作废并重来;重来又会再次与下一次策略刷新撞上,形成稳定复现的循环,因此 Java 语言服务永远不会就绪。
从日志时序看,javaWorkspaceDetection:started、前端 configureFailed 与 sessionStart:started 出现在同一毫秒级窗口,且失败时同时出现 Workspace window closed(Spring/MyBatis 索引、工作区同步同时被取消),更像是启动期存在多路并发(Java 检测侧的排除项安装 + UI 侧索引策略刷新 + 工作区会话生命周期)互相作废,而不是单一调用方的问题。
建议的修复方向
prepare_provider_exclusions()/sessionStart命中ErrorCode::Cancelled + "Indexing policy changed"时不要整体失败,改为重新读取当前context后用最新策略继续(与前端已有的“重读设置并重试”策略一致)。或者给 Java 冷启动加一个“策略代次稳定期”/背压:导入期间把策略重配排队,导入完成后再应用。
UI 侧把这类“代次被替换”的内部取消降级(不弹红色错误通知),仅在最终重试耗尽时提示一次,并给出可操作文案(例如“索引配置在 Java 导入期间变化,已重新应用”)。
若上述时序确实是“Java 检测侧与 UI 侧策略不同导致乒乓”,建议两侧共享同一份策略来源(同一 owner / 同一 localStorage 键),避免互相退役。
影响
在 Windows 上打开较大的 Maven 多模块工程时,Java 语言服务 100% 无法启动(本机三次会话内 0 次成功),Java 相关功能全部不可用;同时通知中心被大量重复错误占据,用户无法判断这是否是严重故障。
说明:本报告中的
<WORKSPACE>、<app_local_data_dir>及模块/包路径均为脱敏占位,原始日志中的用户名、工程名与业务包名已移除;时间戳、错误码、耗时、行号与源码引用保持原样。
- Ngôn ngữ chính
- TypeScript
- Star
- 1.8k
- Fork
- 151
- Merge trung bình
- 10 giờ 29 phút
- Pull request đã merge (30 ngày)
- 407
Chuẩn bị môi trường
Dự án này không cung cấp dev container, Dockerfile hay hướng dẫn đóng góp, nên bạn cần tự thiết lập môi trường: hãy bắt đầu từ README và xem hướng dẫn đóng góp lần đầu của chúng tôi để biết các bước chung.
Bắt đầu từ đâu
- Đọc hết issue, rồi đọc hướng dẫn đóng góp của dự án.
- Bình luận trên issue rằng bạn sẽ nhận — tránh hai người làm cùng một việc.
- Fork repository và làm thay đổi trên một nhánh.
- Mở pull request có tham chiếu số hiệu của issue.
Issue khác của 1lck/Lithe-IDEA
-
review: high
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
1lck/Lithe-IDEA#1797 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
area:other bug P2 platform:other review: high
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
1lck/Lithe-IDEA#1789 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
review: medium
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 70/100
1lck/Lithe-IDEA#1670 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
area:editor bug P0 platform:macos review: low
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 65/100
1lck/Lithe-IDEA#1118 · 2 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
review: high
Độ khó 5/5 Hơn một tuần Mức phù hợp với người mới 25/100
1lck/Lithe-IDEA#1798 ·
Maintainer thường phản hồi trong vòng 1 ngày
Tất cả issue của 1lck/Lithe-IDEA
Issue tương tự
-
area:cards enhancement ready-for-agent
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 66/100
fil-donadoni/tolaria#8883 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
xsd:integer cast from a string rejects negative numbers, a leading + and surrounding whitespaceĐang mởbug 🐛
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 78/100
comunica/comunica#1960 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Waiting for: Product Owner
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
getsentry/sentry-javascript#26203 · 1 bình luận ·
Maintainer thường phản hồi trong vòng 1 ngày
-
bug
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
bytedance/flowgram.ai#1235 ·
Maintainer thường phản hồi trong vòng 1 ngày
-
Độ khó 2/5 1-3 giờ Mức phù hợp với người mới 76/100
devswha/herdr-web-ui#3325 ·