📣 极限科技诚招搜索运维工程师(Elasticsearch/Easysearch)- 全职/北京 👉 : 立即申请加入

适用版本: 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 snapshots
  • ResourceNotFoundException
  • notFound
  • RepositoryData

常见日志形态通常类似下面这样:

ResourceNotFoundException: Attempting to remove non-existent snapshots [snap-a, snap-c] from repository data

2. 为什么会发生这个错误 #

根因是批量删除列表与仓库现状不同步。通常是删除请求使用了过期 snapshot 列表,或在批量执行过程中已有其他任务先删除了其中一部分 snapshot。

常见原因通常包括:

  • 批量删除任务基于过期快照清单执行。
  • 并发 retention、cleanup 或人工删除使部分目标已不存在。
  • 删除列表中混入了拼写错误或错误 UUID。
  • 不同节点/不同任务对同一仓库状态的认知不一致。

3. 如何排查和解决这个异常和解决这个异常 #

建议按“先识别批量请求里哪些 snapshot 不存在,再追溯为何列表过期”的顺序处理:

  1. 从异常里的 notFound 集合确认哪些 snapshot 不存在。
  2. 重新列出仓库快照,与批量删除输入做差集比对。
  3. 排查是否存在并发删除、保留策略重叠或列表缓存过期。
  4. 把批量操作拆分或刷新目标列表后再重试。

相关 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 的重点在于批量删除列表已经过期或失真。处理时要先找出不存在的那部分对象,再修复删除任务与仓库实际状态之间的同步问题。

相关错误 #

附:日志上下文 #

下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:

.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());
}