#!/usr/bin/env bash
set -euo pipefail

# 仅执行 pgbench 的脚本（不安装 PostgreSQL，不 initdb，不启停服务，不改配置）。
#
# 前提条件：
# 1) PostgreSQL 已经在运行。
# 2) 测试库已经存在（默认 benchdb）。
# 3) PostgreSQL 已经在外部配置为禁用 mmap 共享内存：
#    shared_memory_type = sysv
#    dynamic_shared_memory_type = sysv
#
# 关于 Malloc0：
# - 当前后端是内存虚拟设备，容量有限。
# - 默认参数故意设置得较小，避免一次灌入过多数据。
#
# 关于 LD_PRELOAD：
# - USE_LD_PRELOAD_INIT=1：初始化阶段（pgbench -i）启用 LD_PRELOAD
# - USE_LD_PRELOAD_RUN=1 ：压测阶段启用 LD_PRELOAD
# - 设为 0 即可关闭对应阶段的 LD_PRELOAD
#
# 用法：
#   bash codex/run_pgbench_no_mmap.sh
#
# 可选环境变量（含义）：
#   PG_HOST=127.0.0.1
#     PostgreSQL 服务器地址。
#   PG_PORT=5432
#     PostgreSQL 服务器端口（默认改为 5432）。
#   PG_DB=benchdb
#     压测数据库名。
#   PG_SCALE=2
#     pgbench 初始化规模因子（-s），越大初始数据越多。
#   PG_TIME=20
#     压测持续时间（秒，pgbench -T）。
#   PG_CLIENTS=2
#     并发客户端数（pgbench -c）。
#   PG_JOBS=2
#     工作线程数（pgbench -j）。
#   PG_SUPERUSER=postgres
#     执行 pgbench 的系统用户（通常是 postgres）。
#   LD_PRELOAD_PATH=/home/lian/try/zvfs/src/libzvfs.so
#     LD_PRELOAD 目标库路径（你的 zvfs hook so）。
#   PG_BIN_DIR=/usr/lib/postgresql/16/bin
#     pgbench 所在目录；不填时自动从 PATH 查找。
#   USE_LD_PRELOAD_INIT=1
#     初始化阶段（pgbench -i）是否启用 LD_PRELOAD：1=启用，0=关闭。
#   USE_LD_PRELOAD_RUN=1
#     压测阶段是否启用 LD_PRELOAD：1=启用，0=关闭。

PG_HOST="${PG_HOST:-127.0.0.1}"
PG_PORT="${PG_PORT:-5432}"
PG_DB="${PG_DB:-benchdb}"
PG_SCALE="${PG_SCALE:-2}"
PG_TIME="${PG_TIME:-20}"
PG_CLIENTS="${PG_CLIENTS:-2}"
PG_JOBS="${PG_JOBS:-2}"
PG_SUPERUSER="${PG_SUPERUSER:-postgres}"
LD_PRELOAD_PATH="${LD_PRELOAD_PATH:-/home/lian/try/zvfs/src/libzvfs.so}"
PG_BIN_DIR="${PG_BIN_DIR:-$(dirname "$(command -v pgbench 2>/dev/null || true)")}"
USE_LD_PRELOAD_INIT="${USE_LD_PRELOAD_INIT:-1}"
USE_LD_PRELOAD_RUN="${USE_LD_PRELOAD_RUN:-1}"

if [[ -z "${PG_BIN_DIR}" || ! -x "${PG_BIN_DIR}/pgbench" ]]; then
  echo "未找到 pgbench，请设置 PG_BIN_DIR 或把 pgbench 放到 PATH 中。" >&2
  exit 1
fi

run_pgbench_cmd() {
  local use_preload="$1"
  shift
  if [[ "${use_preload}" == "1" ]]; then
    sudo -u "${PG_SUPERUSER}" env LD_PRELOAD="${LD_PRELOAD_PATH}" "$@"
  else
    sudo -u "${PG_SUPERUSER}" "$@"
  fi
}

echo "当前参数："
echo "  host=${PG_HOST} port=${PG_PORT} db=${PG_DB}"
echo "  scale=${PG_SCALE} clients=${PG_CLIENTS} jobs=${PG_JOBS} time=${PG_TIME}s"
echo "  preload_init=${USE_LD_PRELOAD_INIT} preload_run=${USE_LD_PRELOAD_RUN}"

echo "[1/2] 初始化数据（pgbench -i）"
run_pgbench_cmd "${USE_LD_PRELOAD_INIT}" \
  "${PG_BIN_DIR}/pgbench" -h "${PG_HOST}" -p "${PG_PORT}" -i -s "${PG_SCALE}" "${PG_DB}"

echo "[2/2] 执行压测（pgbench -T）"
run_pgbench_cmd "${USE_LD_PRELOAD_RUN}" \
  "${PG_BIN_DIR}/pgbench" -h "${PG_HOST}" -p "${PG_PORT}" \
  -c "${PG_CLIENTS}" -j "${PG_JOBS}" -T "${PG_TIME}" -P 5 "${PG_DB}"
