为什么这个错误发生 #
execution_cancelled_exception 是在执行中的操作被主动取消时抛出的错误。
Easysearch 中的某些长时间运行的操作(如数据恢复、快照创建、批量操作等)是可取消的。当这些操作被系统或用户主动中断时,就会抛出此异常。
这个错误可能由以下原因引起:
- 用户手动取消:通过 API 手动取消正在执行的任务
- 节点关闭:节点正在关闭过程中,正在执行的操作被取消
- 超时取消:操作执行时间超过预设的超时时间而被自动取消
- 主节点变更:集群主节点变更导致某些需要主节点协调的操作被取消
- 分片迁移:分片迁移导致相关操作被取消
- 任务冲突:新的操作请求导致现有操作被取消(如同一索引的并发快照)
- 资源限制:系统资源不足导致操作被强制取消
- 状态变更:索引或集群状态变更导致正在进行的操作无效而被取消
如何修复这个错误 #
1. 确认取消是否为预期行为 #
- 检查是否有人为干预(如手动删除任务、关闭节点等)
- 查看操作日志确认取消的具体原因
2. 检查节点状态 #
# 检查节点是否正常运行
GET /_cat/nodes?v
# 检查集群健康状态
GET /_cluster/health
3. 查看任务状态 #
# 查看当前正在执行的任务
GET /_tasks?detailed=true&actions=**&parent_task_id=
# 查看特定任务
GET /_tasks/<task_id>
4. 增加超时时间 #
如果操作因为超时而被取消,可以增加超时时间:
# 例如,在快照 API 中设置超时
PUT /_snapshot/<repository>/<snapshot-name>?wait_for_completion=true&timeout=10m
5. 重试操作 #
如果取消是由于临时性问题(如网络波动、资源暂时紧张),可以重试操作:
# 例如,重新创建快照
PUT /_snapshot/<repository>/<snapshot-name>
{
"indices": "<index>",
"wait_for_completion": true
}
6. 检查集群资源 #
# 检查线程池状态
GET /_cat/thread_pool?v
# 检查 JVM 内存使用
GET /_nodes/stats/jvm
# 检查磁盘使用情况
GET /_cat/allocation?v
7. 处理并发冲突 #
如果多个操作同时进行导致冲突,可以:
- 等待当前操作完成后再执行下一个
- 使用任务管理 API 取消不需要的任务
8. 调整操作参数 #
某些操作可以通过调整参数来避免被取消:
- 减小批量大小
- 减少并发操作数量
- 在非高峰时段执行大型操作
9. 查看详细日志 #
# 检查节点日志以了解取消的具体原因
tail -f /path/to/easysearch/logs/easysearch.log | grep -i "cancelled"
10. 任务管理 #
# 如果需要,可以取消特定任务
POST /_tasks/<task_id>/_cancel
# 或者按条件取消任务
POST /_tasks/_cancel?actions=*snapshot*&actions=*recovery*
预防措施 #
- 为长时间运行的操作设置合理的超时时间
- 在执行大型操作前,确保集群有充足的资源
- 避免在高峰时段执行大规模操作
- 使用任务 API 监控正在执行的任务状态
- 对于关键操作,考虑实现客户端重试机制
- 确保网络稳定,避免因网络问题导致操作被取消





