{"record":{"id":"65378eef8687258f","repo":"alibaba/spring-ai-alibaba","slug":"cannot-delete-running-experiment","errorCode":null,"errorMessage":"Cannot delete running experiment: ","messagePattern":"Cannot delete running experiment: ","errorType":"exception","errorClass":"IllegalStateException","httpStatus":null,"severity":"error","filePath":"spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java","lineNumber":315,"sourceCode":"\n    @Override\n    @Transactional\n    public void deleteById(Long id) {\n        log.info(\"删除实验: {}\", id);\n        \n        if (id == null) {\n            throw new IllegalArgumentException(\"Experiment ID cannot be null\");\n        }\n        \n        // 检查实验是否存在\n        ExperimentDO experimentDO = experimentMapper.selectById(id);\n        if (experimentDO == null) {\n            throw new IllegalArgumentException(\"Experiment not found: \" + id);\n        }\n        \n        // 检查实验状态，运行中的实验不能删除\n        if (Objects.equals(experimentDO.getStatus(), ExperimentStatus.RUNNING.getCode())) {\n            throw new IllegalStateException(\"Cannot delete running experiment: \" + id);\n        }\n        \n        // 删除实验\n        int result = experimentMapper.deleteById(id);\n        if (result <= 0) {\n            throw new RuntimeException(\"Failed to delete experiment\");\n        }\n//\n//        // 删除相关的实验结果\n//        experimentResultMapper.deleteByExperimentId(id);\n        \n        log.info(\"实验删除成功: {}\", id);\n    }\n\n    @Override\n    public void restartById(Long id) {\n        //清理历史数据\n        experimentResultMapper.deleteByExperimentId(id);","sourceCodeStart":297,"sourceCodeEnd":333,"githubUrl":"https://github.com/alibaba/spring-ai-alibaba/blob/f82da0b50f35744c13968191be2b1cd2452ef550/spring-ai-alibaba-admin/spring-ai-alibaba-admin-server-start/src/main/java/com/alibaba/cloud/ai/studio/admin/service/impl/ExperimentServiceImpl.java#L297-L333","documentation":"Thrown by ExperimentServiceImpl.deleteById when the experiment's stored status equals ExperimentStatus.RUNNING's code. The library forbids deleting experiments that are still running to avoid orphaning in-flight runs.","triggerScenarios":"Calling deleteById on an experiment whose status column contains the RUNNING code — usually while it is actively executing or was left in RUNNING state after a crash.","commonSituations":"User tries to delete a currently running evaluation; a previous server restart left the status stuck at RUNNING so even finished experiments cannot be deleted; status never transitioned due to an earlier failure.","solutions":["Stop the experiment (stop(id)) first, then delete it","If the status is stale after a crash, reset it to STOPPED/FAILED manually or via an update before deleting","Confirm the experiment truly finished and the status column was updated"],"exampleFix":"// before\nexperimentService.deleteById(id); // fails if RUNNING\n// after\nExperiment exp = experimentService.getById(id);\nif (ExperimentStatus.RUNNING.getCode().equals(exp.getStatus())) {\n    experimentService.stop(id);\n}\nexperimentService.deleteById(id);","handlingStrategy":"try-catch","validationCode":"Experiment exp = experimentService.getById(id);\nboolean deletable = exp != null && !ExperimentStatus.RUNNING.getCode().equals(exp.getStatus());","typeGuard":"boolean isDeletable(Experiment exp) { return exp != null && !ExperimentStatus.RUNNING.getCode().equals(exp.getStatus()); }","tryCatchPattern":"try { service.deleteById(id); } catch (IllegalStateException e) { return ResponseEntity.status(409).body(e.getMessage()); }","preventionTips":["Stop running experiments before deleting","Fix stale RUNNING statuses after crashes (reconcile on startup)","Disable delete buttons in UI for running experiments"],"tags":["invalid-state","experiment-lifecycle","rest"],"backgroundTag":"invalid-state-transition","analyzedSha":"f82da0b50f35744c13968191be2b1cd2452ef550","analyzedAt":"2026-09-09T15:32:42.421Z","contentChangedAt":"2026-09-09T15:32:42.421Z","schemaVersion":2},"datasetVersion":"2026-09-17T15:17:12.973Z"}