#!/bin/bash
# Usage: run.sh <label> <image> [cmd...]. Starts one server, runs the load, prints timings, removes it.
set -e
label=$1; image=$2; shift 2
docker rm -f bench >/dev/null 2>&1 || true
docker run -d --name bench --cpus=4 --memory=4g -e POSTGRES_HOST_AUTH_METHOD=trust "$image" "$@" >/dev/null
ready() { for i in $(seq 90); do docker exec bench psql -U postgres -X -qAt -c 'select 1' >/dev/null 2>&1 && return; sleep 1; done; echo "server never came up" >&2; exit 1; }
psql() { docker exec -i bench psql -U postgres -X -q -v ON_ERROR_STOP=1 "$@"; }
ready
# Same settings on every version, then restart so they apply.
psql -c "ALTER SYSTEM SET shared_buffers = '1GB'" -c "ALTER SYSTEM SET max_wal_size = '8GB'" -c "ALTER SYSTEM SET checkpoint_timeout = '30min'" >/dev/null
docker restart bench >/dev/null
sleep 3
ready
psql < bench.sql | grep -v Time
for run in 1 2 3 4 5 6; do
  for table in child; do
    psql -c "TRUNCATE $table" >/dev/null
    psql -c "CHECKPOINT" >/dev/null
    ms=$(psql -c '\timing on' -c "INSERT INTO $table (parent_id) SELECT i FROM generate_series(1, 1000000) AS i" | grep -oE 'Time: [0-9.]+' | cut -d' ' -f2)
    echo "$label,$table,$run,$ms"
  done
done
docker rm -f bench >/dev/null
