适用版本: 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 snapshotResourceNotFoundExceptionRepositoryDataremoveSnapshot
常见日志形态通常类似下面这样:
ResourceNotFoundException: Attempting to remove non-existent snapshot [snap-20250301] from repository data
2. 为什么会发生这个错误 #
根因是删除目标与当前仓库元数据不匹配。最常见的情况是:快照已经被删除、名称写错、调用方使用了过期 snapshot ID,或者并发删除导致第二次删除落空。
常见原因通常包括:
- 快照名称或 UUID 写错。
- 同一快照已被其他任务或人工操作删除。
- 自动化脚本基于过期快照列表继续执行删除。
- 多节点/多任务并发删除同一 snapshot。
3. 如何排查和解决这个异常和解决这个异常 #
建议按“先确认快照在仓库中是否仍然存在,再判断删除请求为何过期”的顺序处理:
- 列出当前仓库中的 snapshot,确认目标快照是否真的存在。
- 对照删除请求中的名称或 UUID,排查是否拼写错误或引用旧 ID。
- 查看是否有并发删除、保留策略任务或人工操作已经提前删除该快照。
- 修正自动化流程,避免重复删除同一对象。
相关 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 的核心不是删除失败,而是目标快照在仓库元数据里已经不存在。处理重点应放在删除请求的正确性和自动化流程的一致性上。
相关错误 #
- attempting to remove non-existent snapshots from repository data:批量删除版本会暴露同样的列表过期问题
- failed to delete snapshots:单个对象不存在时,批量或上层删除任务也会整体失败
- cannot delete snapshot from a readonly repository:删除请求除了目标不存在,还可能压根没有写权限
- cleanup snapshot step request … failed to be acknowledged:生命周期驱动的删除任务同样依赖正确的快照存在性判断
- concurrent modification of the repository before cleanup started:仓库并发变化会让删除目标视图更容易过期
附:日志上下文 #
下面保留当前页面中的源码或日志片段,便于继续结合异常调用栈定位问题:
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());





