#! /bin/sh

# validate inputs
[ -f src/Makefile.global.in ] || {
    echo >&2 "CWD must be a postgresql source directory"
    exit 1
}
[ -n "$1" ] || {
    echo >&2 "Usage: $0 WORK-DIR-PARENT"
    exit 1
}
set -ue
WORK_DIR=$1/bench-bulk-extend
rm -rf "$WORK_DIR"

SCALE=100
THREADS=8
ITERATIONS=5
ITERATIONS=80

TEST_PGDATA_DATA=$WORK_DIR/test-pgdata
PGDATA=$TEST_PGDATA_DATA
PGPORT=1
PGDATABASE=test
export PGDATA PGPORT PGDATABASE

# build test binary: before bulk extend
git checkout .; make -j$THREADS distclean ||:
git checkout 719c84c^
./configure --prefix=$WORK_DIR/inst/before_bulk
make -j$THREADS; make -j$THREADS install; make -j$THREADS distclean

# build test binary: bulk extend intro commit
git checkout 719c84c
./configure --prefix=$WORK_DIR/inst/bulk
make -j$THREADS; make -j$THREADS install; make -j$THREADS distclean

# build test binary: bulk extend intro commit w/ fsm disabled
patch -p1 <<EOF
diff --git a/src/backend/storage/freespace/freespace.c b/src/backend/storage/freespace/freespace.c
index 2ffa8ff..42847c7 100644
--- a/src/backend/storage/freespace/freespace.c
+++ b/src/backend/storage/freespace/freespace.c
@@ -131,9 +131,7 @@ static void fsm_update_recursive(Relation rel, FSMAddress addr, uint8 new_cat);
 BlockNumber
 GetPageWithFreeSpace(Relation rel, Size spaceNeeded)
 {
-	uint8		min_cat = fsm_space_needed_to_cat(spaceNeeded);
-
-	return fsm_search(rel, min_cat);
+	return InvalidBlockNumber;
 }
 
 /*
EOF
./configure --prefix=$WORK_DIR/inst/bulk_without_fsm
make -j$THREADS; make -j$THREADS install; make -j$THREADS distclean

# other one-time tasks
(
    PATH=$WORK_DIR/inst/bulk/bin:$PATH
    initdb -N "$TEST_PGDATA_DATA"
    cat >"$TEST_PGDATA_DATA"/postgresql.conf <<EOF
max_connections = 40
shared_buffers = 1GB
wal_buffers = 16MB
datestyle = 'iso, mdy'
fsync = off
full_page_writes = off
listen_addresses = ''
bgwriter_flush_after=0
backend_flush_after=0

log_directory = '..'
log_filename = 'pgdev.log'
log_line_prefix = '%p %m '
log_statement = all
log_connections = on
log_disconnections = on
logging_collector = on
EOF
    pg_ctl -w start
    createdb
    pgbench --unlogged-tables -i -s $SCALE
    psql -Xc "copy pgbench_accounts to '$WORK_DIR/accounts.pgcopy' with binary"
    >"$WORK_DIR"/copy.benchscript \
	echo "copy pgbench_accounts from '$WORK_DIR/accounts.pgcopy' with binary"
)

# main benchmark loop
for n in `seq 1 $ITERATIONS`; do
    for scenario in before_bulk bulk bulk_without_fsm; do
	(
	    PATH=$WORK_DIR/inst/$scenario/bin:$PATH
	    pgbench --unlogged-tables -i -s 1
	    psql -Xc 'alter table pgbench_accounts drop constraint pgbench_accounts_pkey;'
	    psql -Xc 'truncate pgbench_accounts'
	    pg_ctl -w restart
	    env TIME="TIME $scenario COPY real %e user %U sys %S exit %x" time pgbench -n -f "$WORK_DIR"/copy.benchscript -t 1 -c $THREADS -j $THREADS && \
		psql -Xc "select '$scenario' AS scenario, pg_relation_size('pgbench_accounts');" && \
		env TIME="TIME $scenario CHECKPOINT real %e user %U sys %S exit %x" time psql -Xc CHECKPOINT
	)
    done
done

PATH=$WORK_DIR/inst/bulk/bin:$PATH pg_ctl -w stop
