fix(janitor): 禁止启动时因目录不存在而自动删除数据库任务记录

reconcile_tasks_on_startup() 中有一段逻辑:遍历所有任务,如果 output_dir
在磁盘上不存在,直接 DELETE FROM tasks。这导致重启时如果目录被移动/重命名/
被之前的 janitor 清理,所有任务记录静默丢失。

修改为仅输出 WARNING 日志,保留数据库记录。用户可通过 DELETE /task/<id> 手动清理。
This commit is contained in:
DXC
2026-07-13 10:40:31 +08:00
parent 55cb7fb025
commit c6b9783a7a

View File

@ -310,8 +310,7 @@ def reconcile_tasks_on_startup():
except Exception as e:
current_app.logger.error(f"Failed to delete failed task {task_id}: {str(e)}", exc_info=True)
# Check for tasks with output directories that no longer exist
# This helps clean up database entries for manually deleted directories
# 检查 output_dir 不存在的任务(仅警告,不自动删除)
rows = conn.execute("""
SELECT task_id, output_dir
FROM tasks
@ -321,18 +320,21 @@ def reconcile_tasks_on_startup():
orphaned_count = 0
for row in rows:
task_id_from_db = row[0] # task_id是第一个字段
output_dir_from_db = row[1] # output_dir是第二个字段
task_id_from_db = row[0]
output_dir_from_db = row[1]
if not Path(output_dir_from_db).exists():
conn.execute(
"DELETE FROM tasks WHERE task_id = ?",
(task_id_from_db,)
current_app.logger.warning(
f"Startup reconciliation: Task {task_id_from_db} output directory "
f"not found on disk: {output_dir_from_db}. Database record preserved."
)
orphaned_count += 1
if orphaned_count > 0:
current_app.logger.info(f"Startup reconciliation: Marked {orphaned_count} tasks as deleted (directories not found)")
current_app.logger.info(
f"Startup reconciliation: Found {orphaned_count} tasks with missing directories "
f"(records preserved, use DELETE /task/<id> to manually clean up)"
)
# Backfill output_dir for rows with NULL, using OUTPUT_FOLDER/<task_id>
output_base = Path(current_app.config.get('OUTPUT_FOLDER') or '')