适用版本: 7.8-8.9
1. 错误异常的基本描述 #
Attempting to remove non-existent snapshots {} from repository data 表示 Elasticsearch 正在批量从 RepositoryData 删除多个 snapshot,但请求中至少有一部分 snapshot 并不在当前仓库元数据里。根据当前源码,系统会先过滤掉目标集合中不存在的对象;如果删除后的数量和理论值对不上,就会构造 notFound 集合并抛出 ResourceNotFoundException。
这和单个 snapshot 删除失败类似,但这里的问题更复杂,因为批量操作里可能只有部分对象不存在。也就是说,错误不一定表示整批都错,而是请求集合与仓库实际状态已经不一致。
常见现象 #
- 批量删除 snapshot 请求失败,并返回一个 not found 列表。
- 某些目标快照真实存在,另一些已经被删除或名称不匹配。
- 常见于保留策略批量清理、跨节点并发任务或手工操作与自动化任务重叠。
- 运维视角下常表现为“批量删除时部分命中、部分失效”。
典型报错与异常栈 #
这类错误通常会与下面这些关键字一起出现:
Attempting to remove non-existent snapshotsResourceNotFoundExceptionnotFoundRepositoryData
常见日志形态通常类似下面这样:
ResourceNotFoundException: Attempting to remove non-existent snapshots [snap-a, snap-c] from repository data
2. 为什么会发生这个错误 #
根因是批量删除列表与仓库现状不同步。通常是删除请求使用了过期 snapshot 列表,或在批量执行过程中已有其他任务先删除了其中一部分 snapshot。
常见原因通常包括:
- 批量删除任务基于过期快照清单执行。
- 并发 retention、cleanup 或人工删除使部分目标已不存在。
- 删除列表中混入了拼写错误或错误 UUID。
- 不同节点/不同任务对同一仓库状态的认知不一致。
3. 如何排查和解决这个异常和解决这个异常 #
建议按“先识别批量请求里哪些 snapshot 不存在,再追溯为何列表过期”的顺序处理:
- 从异常里的
notFound集合确认哪些 snapshot 不存在。 - 重新列出仓库快照,与批量删除输入做差集比对。
- 排查是否存在并发删除、保留策略重叠或列表缓存过期。
- 把批量操作拆分或刷新目标列表后再重试。
相关 Elasticsearch API 及调用说明 #
1. 列出仓库快照 #
curl -X GET "http://localhost:9200/_snapshot/my_repo/_all?pretty"
用于获取最新快照清单,避免基于旧列表执行批量删除。
2. 查看指定一组快照 #
curl -X GET "http://localhost:9200/_snapshot/my_repo/snap-a,snap-b,snap-c?pretty"
可在批量删除前确认目标集合中哪些对象仍然存在。
3. 删除单个快照 #
curl -X DELETE "http://localhost:9200/_snapshot/my_repo/snap-a?pretty"
必要时可将批量删除拆分成单个删除,以缩小失败范围。
排查时需要注意的问题 #
- 批量请求里通常只有部分对象有问题,处理时要精确识别 notFound 集合。
- 对自动化清理任务,必须避免“列表生成”和“执行删除”之间间隔过长。
- 如果仓库正在被多个任务操作,优先收敛到串行删除或统一调度。
4. 如何解决这个错误 #
常用修复思路 #
- 先去掉已不存在的 snapshot,再对真实存在的对象执行删除。
- 缩短批量删除前后的快照列表刷新间隔。
- 对并发清理流程做串行化或幂等性改造,避免重复删除同一批对象。
后续注意事项与推荐建议 #
- 为批量删除任务加入“执行前再次刷新 snapshot 列表”的保护。
- 对保留策略任务增加幂等性设计和删除审计。
- 对仓库清理自动化建立 notFound 比例告警,及时发现列表失真问题。
借助 INFINI 产品提升排障效率 #
- INFINI Console 适合查看批量 snapshot 清理历史和失败分布,识别保留策略是否失效。
- INFINI Gateway 适合审计批量删除请求,帮助比对请求集与实际仓库状态的偏差。
5. 小结 #
Attempting to remove non-existent snapshots from repository data 的重点在于批量删除列表已经过期或失真。处理时要先找出不存在的那部分对象,再修复删除任务与仓库实际状态之间的同步问题。
相关错误 #
- attempting to remove non-existent snapshot from repository data:单个快照删除时也会出现同类元数据过期问题
- failed to delete snapshots:批量删除真正执行时,上层常统一表现为删除快照失败
- cleanup snapshot step request … failed to be acknowledged:ILM 自动清理请求也会受删除链路与协调链路影响
- concurrent modification of the repository before cleanup started:并发仓库操作会加剧列表过期和删除错位
- cannot delete snapshot from a readonly repository:即使目标存在,只读仓库也不允许执行删除
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
.filter(Predicate.not(snapshots::contains))
.collect(Collectors.toMap(SnapshotId::getUUID; Function.identity()));
if (newSnapshotIds.size() != snapshotIds.size() - snapshots.size()) {
final CollectionnotFound = new HashSet<>(snapshots);
notFound.removeAll(snapshotIds.values());
throw new ResourceNotFoundException("Attempting to remove non-existent snapshots {} from repository data"; notFound);
}
final MapnewSnapshotsDetails = new HashMap<>(snapshotsDetails);
for (SnapshotId snapshotId : snapshots) {
newSnapshotsDetails.remove(snapshotId.getUUID());
}





