fix(app.py): 移除异步任务中的全局 Config 状态覆盖

process_data_async() 函数:
- 原代码:调用 Config.update_directories_from_config(config_path) 全局覆盖
  Config.UPLOAD_FOLDER 和 Config.OUTPUT_FOLDER 类属性,
  然后同步到 app.config 字典
- 问题:多用户并发上传时,任务 A 的 YAML 配置可能覆盖任务 B 正在使用的目录路径,
  造成输出文件写入错误目录的竞争条件
- 修复:移除对 Config 类属性的全局覆盖调用,每个任务直接使用
  INI 配置的基础目录 + task_id 构建独立的任务目录 (job_upload_dir / job_output_dir),
  任务间目录完全隔离

影响范围:并发上传场景下的文件路径安全性
This commit is contained in:
DXC
2026-07-10 14:48:44 +08:00
parent e16bd2976f
commit d755367df0
2 changed files with 24 additions and 13 deletions

20
.idea/claudeCodeTabState.xml generated Normal file
View File

@ -0,0 +1,20 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ClaudeCodeTabState">
<option name="tabSessions">
<map>
<entry key="0">
<value>
<TabSessionState>
<option name="provider" value="claude" />
<option name="sessionId" value="cf5393e7-6de9-4f60-bde3-38759f3d4dba" />
<option name="cwd" value="$PROJECT_DIR$" />
<option name="model" value="claude-opus-4-8[1m]" />
<option name="permissionMode" value="bypassPermissions" />
</TabSessionState>
</value>
</entry>
</map>
</option>
</component>
</project>

View File

@ -397,20 +397,11 @@ def process_data_async(task_id, data_path, config_path, job_output_dir):
logger.error(f"Job {task_id}: Failed to load config from {config_path}: {str(e)}")
raise
# 根据配置 output_dir 更新目录
Config.update_directories_from_config(config_path)
# 不再全局覆盖 Config 类属性(避免多用户并发冲突)
# 每个任务使用独立目录,基础路径由 INI 配置决定task_id 保证隔离
# Config.update_directories_from_config(config_path) ← 已移除
# 将更新后的目录同步到 app.config
app.config['UPLOAD_FOLDER'] = Config.UPLOAD_FOLDER
app.config['OUTPUT_FOLDER'] = Config.OUTPUT_FOLDER
# 任务状态持久化现在仅使用 SQLite
# JSON 持久化已禁用
# from .shared import set_task_status_file_path, load_task_status_from_file
# set_task_status_file_path(Config.OUTPUT_FOLDER / "task_status.json")
# load_task_status_from_file()
# 更新任务目录到正确的基于配置的路径下
# 使用 INI 配置的基础目录 + task_id 构建任务专属路径
from pathlib import Path
job_upload_dir = Path(Config.UPLOAD_FOLDER) / task_id
job_output_dir = Path(Config.OUTPUT_FOLDER) / task_id