Files
DCTS/scripts/migrate_data_dirs.sh
fmq 1bfa240cb0 feat(all): 源精度命名体系、工作流可观测台、节点停用管理与白名单归档
核心变更:

  1. GridAxisValue 源精度命名
     - 新增 GridAxisValue 类型,携带 f64 数值 + YAML 源书写文本(Deref 透明兼容算术)
     - config.rs 绕过 serde_yaml 归一化,逐 token 捕获轴值原文(logg: 5.0 → g5.0)
     - runner/executor/scheduler 全链路改用 DB TEXT 列权威 point_name,
       修复 REAL 列回读丢精度导致的 model_name 错配

  2. 工作流执行可观测台
     - 新增 stats/progress/points 三组 API(进度时间序列、经验速率 ETA、
       停滞预警、逐点明细分页、收敛性热力图数据)
     - 新增 workflow_progress_snapshots 表 + tasks/grid_points 耗时列
     - runner 携带 last_iter/worst_depth/n_depths 进 conv.json
     - 前端新增 hash 路由、工作流详情页(概览/网格点/收敛分析三 Tab)、YAML 编辑器

  3. 节点停用/启用管理
     - 新增 disabled 状态 + disable/enable API;停用节点保持心跳但停止分发,
       worker 空闲待命而非退出;移除 revoke API,token 失效统一走重发覆盖;
       移除 host_name 字段

  4. 白名单结果归档
     - 新增 result_filter 模块,只归档有语义产物,丢弃 Tlusty 中间单元(~2MB/模型)
     - executor 原子写入归档 + 200 点 LRU 上限

  5. 历史数据导入
     - sync_seeds 重写为 import_results:经 /admin/import_seed 标记 converged +
       按新版命名迁移产物树

  6. 部署与目录重规划
     - data/results→seeds、data/archive→result + migrate_data_dirs.sh
     - deploy.sh 增强(SSH 复用、Profile、远程 env);Dockerfile 瘦身

  7. 文档同步更新 api/database/architecture/deployment
2026-07-31 01:34:05 +08:00

108 lines
4.1 KiB
Bash
Executable File
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/usr/bin/env bash
# 一次性数据目录迁移:results→seeds、archive→result(目录重命名后的历史数据搬迁)。
#
# 背景:data 目录重新规划后,两个子目录改名:
# data/results/ → data/seeds/ server 种子库;原名 results 误导,实际只存种子)
# data/archive/ → data/result/ node 完整计算结果归档;原名 archive 不够准确)
# 本脚本把已落盘的旧目录搬到新位置,并修正 DB 的 seeds.file_path 审计字段。
#
# 关键事实(已确认):
# - download_seed 端点不读 seeds.file_path(从 seeds_dir 重拼路径),故 DB 迁移失败
# 不影响功能;但保持审计一致仍建议执行。
# - 迁移需在 server 停机时进行(mv 整目录 + 写 DB)。
#
# 用法:
# ./scripts/migrate_data_dirs.sh # dry-run,只看将做什么
# ./scripts/migrate_data_dirs.sh --apply # 实际执行
#
# 环境变量:
# DCTS_DATA_DIR 数据根目录(默认 data)
# DCTS_DB_PATH 主库路径(默认 data/dcts.db,相对 DCTS_DATA_DIR
set -euo pipefail
DATA_DIR="${DCTS_DATA_DIR:-data}"
DB_PATH="${DCTS_DB_PATH:-${DCTS_DATA_DIR:-data}/dcts.db}"
APPLY=0
if [[ "${1:-}" == "--apply" ]]; then
APPLY=1
fi
run_or_echo() {
# dry-run 时打印命令,--apply 时执行
if [[ $APPLY -eq 1 ]]; then
eval "$1"
else
echo " [dry-run] $1"
fi
}
echo "数据根目录: $DATA_DIR"
echo "主库路径: $DB_PATH"
echo "模式: $([[ $APPLY -eq 1 ]] && echo ' APPLY(实际执行)' || echo ' dry-run(只预览)')"
echo "------------------------------------------------"
moved=0
# 1. results → seeds
OLD_RESULTS="${DATA_DIR}/results"
NEW_SEEDS="${DATA_DIR}/seeds"
if [[ -d "$OLD_RESULTS" ]]; then
echo "[1/2] 发现旧目录 $OLD_RESULTS"
if [[ -d "$NEW_SEEDS" ]]; then
echo " ⚠️ 目标 $NEW_SEEDS 已存在!不会自动合并,请手动处理后重跑。"
else
run_or_echo "mv '$OLD_RESULTS' '$NEW_SEEDS'"
moved=$((moved + 1))
echo " → results 重命名为 seeds"
fi
else
echo "[1/2] 旧目录 $OLD_RESULTS 不存在,跳过"
fi
# 2. archive → result
OLD_ARCHIVE="${DATA_DIR}/archive"
NEW_RESULT="${DATA_DIR}/result"
if [[ -d "$OLD_ARCHIVE" ]]; then
echo "[2/2] 发现旧目录 $OLD_ARCHIVE"
if [[ -d "$NEW_RESULT" ]]; then
echo " ⚠️ 目标 $NEW_RESULT 已存在!不会自动合并,请手动处理后重跑。"
else
run_or_echo "mv '$OLD_ARCHIVE' '$NEW_RESULT'"
moved=$((moved + 1))
echo " → archive 重命名为 result"
fi
else
echo "[2/2] 旧目录 $OLD_ARCHIVE 不存在,跳过"
fi
# 3. DB seeds.file_path 审计字段修正(非功能性,但保持一致)
echo "------------------------------------------------"
if [[ -f "$DB_PATH" ]] && command -v sqlite3 >/dev/null 2>&1; then
# 统计待更新的行数(results→seeds
STMT_COUNT="SELECT COUNT(*) FROM seeds WHERE file_path LIKE '%/results/%';"
if [[ $APPLY -eq 1 ]]; then
cnt=$(sqlite3 "$DB_PATH" "$STMT_COUNT" 2>/dev/null || echo "0")
else
# dry-run:尝试只读,读不到就标"无法预览"
cnt=$(sqlite3 "file:${DB_PATH}?mode=ro" "$STMT_COUNT" 2>/dev/null || echo "?")
fi
echo "[3/3] DB seeds.file_path 含旧路径的行数: $cnt"
if [[ "$cnt" != "0" && "$cnt" != "?" ]]; then
# 把路径中的 /results/ 替换为 /seeds/
run_or_echo "sqlite3 \"$DB_PATH\" \"UPDATE seeds SET file_path = REPLACE(file_path, '/results/', '/seeds/') WHERE file_path LIKE '%/results/%';\""
echo " → 已修正 seeds.file_path 审计路径"
fi
else
echo "[3/3] 跳过 DB 迁移:$DB_PATH 不存在或无 sqlite3 命令"
echo " download_seed 不读此列,不影响功能;可后续手动执行 UPDATE)"
fi
echo "------------------------------------------------"
if [[ $APPLY -eq 1 ]]; then
echo "✅ 完成:迁移了 $moved 个目录"
else
echo "✅ dry-run 完成。加 --apply 实际执行。"
echo " ⚠️ 执行前请先停掉 server(mv 整目录 + 写 DB 需停机)。"
fi