fix(stock_node+utils+cli): review findings P0/P1/P2 一轮修复
medium effort code-review 暴露 8 个 finding,按 P0/P1/P2 优先级修复: P0 (数据正确性 / 跑得起来): #1 replace_all_node_categories 改 scope-aware delete 之前无条件 delete(NodeCategory) + 插入 runtime filter 后的子集, 导致 --type2 0 跑把其它 6 个 category 误删。改为只 delete 本批 category_key 集合,其它 type2 不动。 #2 replace_all_stock_node_map 对称化 之前空 rows 时 early-return 留下 stale,导致「categories 新 但 mappings 旧」不一致。改为 scope-aware delete 同 #1。 #3 stock_node systemd --workers 20 → 8 20 workers × 默认 10 RPS = 200 RPS,撞穿 mairui 钻石档 100 RPS 上限,触发风控。改为 8 × 10 = 80 RPS,留 20% buffer。 P1 (静默错): #4 is_a_share_code 接 hermes 格式 之前硬性要求 len(c)==6,iter_stock_codes 改返 hermes 时 5 个 task (moneyflow/share_snapshot/kline_5min/tick_trade/kline_daily) 会静默过滤成空 list。剥前缀再判断,兼容 'SH600519'。 #5 mairui tz 契约钉在 source 层 tz_localize 改为「已带 tz 就保留,没有再标 Asia/Shanghai」, 避免 mairui 改格式时抛 TypeError。task_tick_trade 删掉 strftime fallback + 冗长注释(契约已在 source 层 docstring)。 #6 CLI inspect.signature 过滤 kwargs --type2 / --backfill 加在共享 p_sync parser 上,任何 task 通过 **kwargs 静默吞掉。改为 dispatcher 按 task._run 签名过滤, 不支持的参数打 warning。 P2 (维护): #7 task_stock_node --type2 输入校验 之前空字符串 / 「concept」 / 99 都 silently collapse 成空 set, 走「无匹配叶子节点」warning 分支(被 daily_check 当正常)。 CLI 不再 silent-drop,任务层加 strict 校验,typo 返 status=error。 #8 code6_to_exchange 删 3 个死分支 4 个 code6_to_* wrapper 都先 _strip_hermes,3 个 hermes if 分支 走不到。删除后 function 简化,所有 caller 行为不变。 附带: - tests/test_smoke.py: 11 → 13 (含 mairui_ma_daily + stock_node) - tests/test_schema_models.py: 21 → 22 (含 kline_stock_ma_daily + node_categories/nodes/stock_node_map) - bin/market_sync_stock_node_run.sh 注释补充 RPS 计算 验证: - pytest tests/ 11 passed - is_a_share_code 8 个 hermes 边界 case 全过 - cli sync kline_daily --type2 2,3 → warning 已打印 - cli sync stock_node --type2 concept → status=error - cli sync stock_node --type2 99 → status=error - cli sync stock_node --type2 0 → 仅 0:0 行被刷新,其它 6 类不动 - fetch_tick_trade('600519') 返回 tz=Asia/Shanghai +08:00
This commit is contained in:
Executable
+35
@@ -0,0 +1,35 @@
|
||||
#!/bin/bash
|
||||
#!/bin/bash
|
||||
# systemd 调度的入口(专跑 stock_node - 股票-节点映射)
|
||||
#
|
||||
# 设计:
|
||||
# - 与 market_sync_moneyflow_run.sh 同构,只跑 stock_node 一个 task
|
||||
# - 周六 11:30 触发(mairui /hszg 数据 11:00 更新,留 30 min buffer)
|
||||
# - 单次 ~1100 次 mairui 调用(@10RPS,~2 min)
|
||||
# - 单独日志到 logs/stock_node_<ts>.log
|
||||
# - exit code 透传
|
||||
#
|
||||
# 并发选择(2026-07-07 调整):
|
||||
# - workers=8 × 默认 MAIRUI_RPS_LIMIT=10 = 80 RPS
|
||||
# - 钻石 licence 上限 100 RPS,留 20% buffer 防风控
|
||||
# - 之前 20 workers × 10 RPS = 200 RPS 撞穿钻石档,mairui 返"请稍后再试"
|
||||
set -u
|
||||
|
||||
PROJECT_ROOT="/home/gao/Development/quant_home/market_sync"
|
||||
LOG_DIR="$PROJECT_ROOT/logs"
|
||||
mkdir -p "$LOG_DIR"
|
||||
|
||||
TS=$(date +%Y%m%d_%H%M%S)
|
||||
LOG="$LOG_DIR/stock_node_${TS}.log"
|
||||
|
||||
echo "[market-sync-stock-node] start ts=$TS log=$LOG" | tee -a "$LOG"
|
||||
|
||||
# 注:不做法定节假日过滤 —— 与其他 3 个 timer 一致的 fail-open 原则。
|
||||
# 周六 stock_node 即使撞节假日,mairui 仍可能返上一周数据 → task 报 warning,不丢历史。
|
||||
|
||||
# ── 跑 stock_node ──
|
||||
cd "$PROJECT_ROOT"
|
||||
.venv/bin/python -m app.entrypoints.cli sync stock_node --workers 8 2>&1 | tee -a "$LOG"
|
||||
EXIT_CODE=${PIPESTATUS[0]}
|
||||
echo "[market-sync-stock-node] done exit_code=$EXIT_CODE" | tee -a "$LOG"
|
||||
exit $EXIT_CODE
|
||||
Reference in New Issue
Block a user