62 lines
2.5 KiB
Go
62 lines
2.5 KiB
Go
package main
|
|
|
|
import (
|
|
"database/sql"
|
|
"errors"
|
|
"fmt"
|
|
)
|
|
|
|
func Cleanup(db *sql.DB, starID int64, full bool) error {
|
|
if starID != LoadtestStarID {
|
|
return errors.New("safety: cleanup only accepts loadtest star_id 999900")
|
|
}
|
|
|
|
queries := []string{
|
|
"DELETE FROM asset_likes WHERE star_id = $1",
|
|
"DELETE FROM exhibitions USING fan_profiles fp WHERE exhibitions.host_profile_id = fp.id AND fp.star_id = $1",
|
|
"DELETE FROM booth_slots WHERE star_id = $1",
|
|
"DELETE FROM mint_orders WHERE star_id = $1",
|
|
"DELETE FROM crystal_transaction_records WHERE star_id = $1",
|
|
"DELETE FROM friendships WHERE star_id = $1",
|
|
"DELETE FROM assets WHERE star_id = $1",
|
|
"DELETE FROM fan_profiles WHERE star_id = $1",
|
|
// 通知系统 (2026-06-16 加的) — 压测期间 user 关注 loadtest star
|
|
// 触发了 1000 条 notification + 1000 条 notification_stats。
|
|
// 用 OR 同时覆盖 user_id 和 star_id 两条线索,保证清干净。
|
|
// 必须在 fan_profiles 删完之后跑(避免 fan_profiles FK 锁)。
|
|
// 注意: lib/pq 的 $1 占位符是按"unique 编号"算的,不能重复 $1 —
|
|
// 重复 $1 会让 pq 期望 1 个参数,我们传 2 个就报 got 2/requires 1。
|
|
"DELETE FROM notifications WHERE user_id IN (SELECT id FROM users WHERE id >= $1) OR star_id = $2",
|
|
"DELETE FROM notification_stats WHERE user_id IN (SELECT id FROM users WHERE id >= $1) OR star_id = $2",
|
|
}
|
|
if full {
|
|
queries = append(queries,
|
|
// 用 id >= LoadtestUserMin 而非 BETWEEN,避免漏掉压测期间
|
|
// 通过 nextval(users_id_seq) 插入的 id > LoadtestUserMax 的边界行
|
|
// (如 S4 mint 场景触发 userservice 注册新用户)。
|
|
// LoadtestUserMin = 30000001 远大于真实用户 id 范围(< 1000000),
|
|
// 不会误删真实用户。
|
|
"DELETE FROM users WHERE id >= $1",
|
|
"DELETE FROM stars WHERE star_id = $1",
|
|
)
|
|
}
|
|
for _, q := range queries {
|
|
var err error
|
|
switch q {
|
|
case "DELETE FROM users WHERE id >= $1":
|
|
_, err = db.Exec(q, LoadtestUserMin)
|
|
case "DELETE FROM notifications WHERE user_id IN (SELECT id FROM users WHERE id >= $1) OR star_id = $2",
|
|
"DELETE FROM notification_stats WHERE user_id IN (SELECT id FROM users WHERE id >= $1) OR star_id = $2":
|
|
// notifications / notification_stats 用 LoadtestUserMin 删 user 维度,
|
|
// 用 starID 删 star 维度。$1 / $2 顺序必须跟 SQL 出现顺序一致。
|
|
_, err = db.Exec(q, LoadtestUserMin, starID)
|
|
default:
|
|
_, err = db.Exec(q, starID)
|
|
}
|
|
if err != nil {
|
|
return fmt.Errorf("cleanup %q: %w", q[:30], err)
|
|
}
|
|
}
|
|
return ResetSequences(db)
|
|
}
|