收尾:验收脚本自动清死元组、城市圈首末到访按可见到访算、补使用说明

verify.sh:测试库 ≥ VACUUM_MIN_MB(默认 200MB)时先 VACUUM (ANALYZE)——一轮全量会留几百 MB
死元组,级联删除随之变慢(同一夹具用例实测 13.6s → 10.2s)。只用普通 VACUUM:FULL 要
ACCESS EXCLUSIVE 锁,有别的服务连着测试库时会把验收整段卡住。

/api/cities 的首末到访改成按可见到访的到达时间算(内层 min/max(v.arrival)),不再取
places.first/last_visit_at——那两列是全量的,会被已并入 / 子段的到访推早推晚。

README 补两节:「数据编辑页上的重复到访」(判定口径与清理范围)、「为什么有些到访在页面上看不到」
(已并入 / 子段不计入显示与统计,但导出必须原样带着),并在开发提示里记下验收环境的死元组与
is_active 两个坑。

回归:city_agg_test.go 补了一段能区分的断言——把某地点最晚那次到访标成已并入后,城市最近到访
必须从 09-13 退到 09-08(原先只比对同口径时,两种算法在夹具数据上结果一样,是条假绿的断言)。
This commit is contained in:
tamakyi
2026-09-29 23:49:39 +08:00
parent 3d03aae018
commit 881f2933ff
4 changed files with 144 additions and 3 deletions
+20
View File
@@ -103,6 +103,26 @@ export ROND_CLEAN_OUT="$CLEAN_OUT" ROND_EXPORT="$CLEAN_OUT"
mkdir -p "$OUT"
echo "== 库:$DBNAME 备份:$(basename "$ROND_SRC") / $(basename "$FOG_SRC")"
# --- 死元组回收:库一胖,级联删除就变 IO 爬虫,整套验收到点跑不完 ----------------
#
# 每个夹具都导入一整包(约千条到访 + 每行一整份 Core Data 原始行)再删掉,
# 一轮全量下来能留 ~370MB 死元组;实测 16MB 时 5m49s 跑完、385MB 时 30 分钟还在爬
# (看着像 hang:测试进程 CPU 长时间不动)。这里在库超过阈值时先收一次。
#
# 用普通 VACUUM 而不是 VACUUM FULL:FULL 要 ACCESS EXCLUSIVE 锁,万一有别的服务连着
# 这个库就会把验收卡住;普通 VACUUM 是并发的,清掉死元组即可恢复扫描速度。
# 没有 psql 就跳过(不拦人),真慢了手动来一次 VACUUM FULL 把文件也缩回去。
VACUUM_MIN_MB="${VACUUM_MIN_MB:-200}"
if command -v psql >/dev/null 2>&1; then
DB_MB="$(psql "$DSN" -A -t -c "SELECT pg_database_size(current_database())/1024/1024" 2>/dev/null || echo 0)"
if [ "${DB_MB:-0}" -ge "$VACUUM_MIN_MB" ]; then
echo "== 测试库 ${DB_MB}MB ≥ ${VACUUM_MIN_MB}MB,先清死元组(否则级联删除会慢到跑不完)"
psql "$DSN" -q -c "VACUUM (ANALYZE)" || echo "-- VACUUM 失败,照跑(不影响正确性,只是会慢)"
fi
else
echo "-- 本机没有 psql,跳过死元组回收;若验收跑得很慢,先手动 VACUUM (FULL, ANALYZE) 一次"
fi
GOFLAGS_EXTRA=""
[ "$RACE" = 1 ] && GOFLAGS_EXTRA="$GOFLAGS_EXTRA -race"
# 必须 -coverpkg:-cover 只统计「测试文件所在包」自己的执行,凡是主要由别的包驱动的