一、问题描述
操作步骤
- 登录dolphinshceduler
- 点击项目管理
- 点击要操作的项目名
- 点击工作流实例
- 点击删除按钮
- 点击确认
报错:删除工作流实例错误
二、解决
1.删除过程源码
请求头里的url包括的关键字,instance/delete,对应的接口是ProcessInstanceController类的deleteProcessInstanceById(),这个方法里通常不会有什么,再往下看service
调用的是ProcessInstanceService类的deleteProcessInstanceById()
/**
* delete process instance by id, at the same time,delete task instance and their mapping relation data
* @param loginUser login user
* @param projectName project name
* @param processInstanceId process instance id
* @return delete result code
*/
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> deleteProcessInstanceById(User loginUser, String projectName, Integer processInstanceId) {
Map<String, Object> result = new HashMap<>(5);
Project project = projectMapper.queryByName(projectName);
Map<String, Object> checkResult = projectService.checkProjectAndAuth(loginUser, project, projectName);
Status resultEnum = (Status) checkResult.get(Constants.STATUS);
if (resultEnum != Status.SUCCESS) {
return checkResult;
}
ProcessInstance processInstance = processService.findProcessInstanceDetailById(processInstanceId);
List<TaskInstance> taskInstanceList = processService.findValidTaskListByProcessId(processInstanceId);
if (null == processInstance) {
putMsg(result, Status.PROCESS_INSTANCE_NOT_EXIST, processInstanceId);
return result;
}
// delete database cascade
int delete = processService.deleteWorkProcessInstanceById(processInstanceId);
processService.deleteAllSubWorkProcessByParentId(processInstanceId);
processService.deleteWorkProcessMapByParentId(processInstanceId);
if (delete > 0) {
putMsg(result, Status.SUCCESS);
} else {
putMsg(result, Status.DELETE_PROCESS_INSTANCE_BY_ID_ERROR);
}
return result;
}
从源码来看做了几件事
- 验证权限
- 判断工作流实例是否存在
- 存在则删除
接下来调用的是jpa的mapper的delete方法,先根据工作流实例删除子流程,再删除工作流实例
2.排查mysql
1 根据ProcessInstance对象找到了对应的表名
工作流实例
表名:t_ds_process_instance
子工作流实例表名和工作流实例表名一样,猜想is_sub_process字段为1是子流程,否则不是子流程
2 尝试用sql直接删一下
删除子工作流实例
上面请求里的参数里就有一个删除报错的id=37360
delete from dolphinscheduler.t_ds_process_instance where id = 37360;
正在看的时候,突然遇到之前遇到过的任务排队等待问题,重启dolphin和zookeeper后,本问题消失了,已经可以删除了,问题未能重现,活太多就不深究了。
猜想:可能是某个服务的线程数达到上限,导致处理删除的任务没有线程去执行。已经占用了zookeeper分布式锁的,导致新的删除操作无法执行。