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

适用版本: 6.8-7.7

1. 错误异常的基本描述 #

Attempting to remove non-existent snapshot [{}] from repository data 表示 Elasticsearch 在更新 RepositoryData 时,试图删除一个指定的 snapshot,但当前仓库元数据里根本没有这个 snapshot。源码片段也很清楚:如果过滤掉目标 snapshot 后,newSnapshotIds.size() 与原始大小完全相同,就说明要删的 snapshot 不存在,于是抛出 ResourceNotFoundException

这类问题通常不是存储不可达,而是删除请求与仓库实际元数据不一致。换句话说,调用方认为某个快照还存在,但仓库元数据已经不再包含它。

常见现象 #

  • 删除单个 snapshot 请求返回 not found 或 repository data 异常。
  • 仓库列表中已经没有该快照,但自动化任务仍在尝试删除它。
  • 常见于重复删除、并发删除或元数据缓存过期场景。
  • 从运维角度看,问题更像“删错对象”而不是“删不动对象”。

典型报错与异常栈 #

这类错误通常会与下面这些关键字一起出现:

  • Attempting to remove non-existent snapshot
  • ResourceNotFoundException
  • RepositoryData
  • removeSnapshot

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

ResourceNotFoundException: Attempting to remove non-existent snapshot [snap-20250301] from repository data

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

根因是删除目标与当前仓库元数据不匹配。最常见的情况是:快照已经被删除、名称写错、调用方使用了过期 snapshot ID,或者并发删除导致第二次删除落空。

常见原因通常包括:

  • 快照名称或 UUID 写错。
  • 同一快照已被其他任务或人工操作删除。
  • 自动化脚本基于过期快照列表继续执行删除。
  • 多节点/多任务并发删除同一 snapshot。

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

建议按“先确认快照在仓库中是否仍然存在,再判断删除请求为何过期”的顺序处理:

  1. 列出当前仓库中的 snapshot,确认目标快照是否真的存在。
  2. 对照删除请求中的名称或 UUID,排查是否拼写错误或引用旧 ID。
  3. 查看是否有并发删除、保留策略任务或人工操作已经提前删除该快照。
  4. 修正自动化流程,避免重复删除同一对象。

相关 Elasticsearch API 及调用说明 #

1. 列出仓库快照 #

curl -X GET "http://localhost:9200/_snapshot/my_repo/_all?pretty"

删除前先确认目标 snapshot 是否仍存在。

2. 查看指定快照 #

curl -X GET "http://localhost:9200/_snapshot/my_repo/snap-20250301?pretty"

用于验证调用方要删除的快照 ID 是否正确。

3. 删除指定快照 #

curl -X DELETE "http://localhost:9200/_snapshot/my_repo/snap-20250301?pretty"

只有在确认 snapshot 仍存在时才应执行删除。

排查时需要注意的问题 #

  • 这是元数据找不到目标对象,不要先从底层存储权限角度误判。
  • 对删除型自动化任务,必须避免“按旧列表重复删除”。
  • 如果仓库 recently 发生 cleanup 或 retention,要重点看时间顺序。

4. 如何解决这个错误 #

常用修复思路 #

  • 修正删除目标,确保 snapshot 名称或 UUID 与仓库元数据一致。
  • 对已不存在的对象,不要反复重试删除。
  • 修复自动化脚本中的快照列表刷新逻辑,避免继续使用陈旧元数据。

后续注意事项与推荐建议 #

  • 为删除流程增加“删除前检查 snapshot 是否存在”的保护。
  • 对保留策略和人工删除操作建立审计。
  • 在自动化快照治理中缩短列表缓存时间,减少陈旧元数据问题。

借助 INFINI 产品提升排障效率 #

  • INFINI Console 适合查看 snapshot 保留与删除历史,帮助判断目标快照是否已被提前清理。
  • INFINI Gateway 适合审计 delete snapshot 请求,定位是谁发起了重复删除。

5. 小结 #

Attempting to remove non-existent snapshot from repository data 的核心不是删除失败,而是目标快照在仓库元数据里已经不存在。处理重点应放在删除请求的正确性和自动化流程的一致性上。

相关错误 #

附:日志上下文 #

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

public RepositoryData removeSnapshot(final SnapshotId snapshotId, final ShardGenerations updatedShardGenerations) {
 Map<SnapshotId, SnapshotId> newSnapshotIds = snapshotIds.values().stream()
 .filter(id -> !snapshotId.equals(id))
 .collect(Collectors.toMap(SnapshotId::getUUID, Function.identity()));
 if (newSnapshotIds.size() == snapshotIds.size()) {
 throw new ResourceNotFoundException("Attempting to remove non-existent snapshot [{}] from repository data", snapshotId);
 }
 Map<SnapshotId, SnapshotState> newSnapshotStates = new HashMap<>(snapshotStates);
 newSnapshotStates.remove(snapshotId.getUUID());
 final Map<SnapshotId, Version> newSnapshotVersions = new HashMap<>(snapshotVersions);
 newSnapshotVersions.remove(snapshotId.getUUID());