#!/bin/bash make_master_mkdirs() { mkdir data-master omnipitr mkdir omnipitr/{longarchive,archive,state,backup,tmp,dst-pipe-archive} mkdir omnipitr/tmp/{archive,backup-master,backup-slave,restore} export TMPDIR="$(pwd)/omnipitr/tmp" chmod 700 data-master } create_temporary_script_for_dst_pipe() { cat > "$work_dir/omnipitr/tmp/helper-dst-pipe-archive.sh" << END_OF_SCRIPT #!/usr/bin/env bash cat - > "$work_dir/omnipitr/dst-pipe-archive/\$1" END_OF_SCRIPT chmod 755 "$work_dir/omnipitr/tmp/helper-dst-pipe-archive.sh" } make_master_initdb() { initdb -A trust -E UTF8 -D data-master > /dev/null perl -pi -e ' s/\A \s* (?: [#] \s* )? listen_addresses \s* = \s*.*/listen_addresses = \047*\047/x; s/\A \s* (?: [#] \s* )? port \s* = \s*.*/port = \04754001\047/x; s/\A \s* (?: [#] \s* )? log_destination \s* = \s*.*/log_destination = \047stderr\047/x; s/\A \s* (?: [#] \s* )? log_filename \s* = \s*.*/log_filename = \047pg.log\047/x; s/\A \s* (?: [#] \s* )? silent_mode \s* = \s*.*/silent_mode = on/x; s/\A \s* (?: [#] \s* )? logging_collector \s* = \s*.*/logging_collector = on/x; s/\A \s* (?: [#] \s* )? redirect_stderr \s* = \s*.*/redirect_stderr = on/x; s/\A \s* (?: [#] \s* )? log_min_duration_statement \s* = \s*.*/log_min_duration_statement = 0/x; s/\A \s* (?: [#] \s* )? log_line_prefix \s* = \s*.*/log_line_prefix = \047\%m \%u\@\%d \%p \%r \047/x; s/\A \s* (?: [#] \s* )? log_temp_files \s* = \s*.*/log_temp_files = 0/x; s/\A \s* (?: [#] \s* )? (log_checkpoints|log_connections|log_disconnections|log_lock_waits|archive_mode) \s* = \s*.*/$1 = on/x; s{\A \s* (?: [#] \s* )? archive_command \s* = \s*.*}{archive_command = \047$ENV{omnipitr_dir}/bin/omnipitr-archive -t $ENV{work_dir}/omnipitr/tmp/archive/ -PJ 5 -l $ENV{work_dir}/omnipitr/log.master -dl gzip=$ENV{work_dir}/omnipitr/archive -dl gzip=$ENV{work_dir}/omnipitr/longarchive -db $ENV{work_dir}/omnipitr/backup-archive/ -dp gzip=$ENV{work_dir}/omnipitr/tmp/helper-dst-pipe-archive.sh -s $ENV{work_dir}/omnipitr/state/ -v "\%p"\047}x; s/\A \s* (?: [#] \s* )? max_wal_senders \s* = \s*.*/max_wal_senders = 30/x; s/\A \s* (?: [#] \s* )? wal_level \s* = \s*.*/wal_level = \047hot_standby\047/x; s/\A \s* (?: [#] \s* )? archive_timeout \s* = \s*.*/archive_timeout = 60/x; ' data-master/postgresql.conf echo "local replication all trust host replication all 127.0.0.1/32 trust" >> data-master/pg_hba.conf } make_master_add_plpgsql() { if (( ${pg_version%%.*} < 9 )) then psql -d postgres -d template1 -p 54001 -qAtX -c "create language plpgsql" fi } make_master_make_load_generator_structs() { echo "\set VERBOSITY terse set client_min_messages = warning; create user postgres with superuser; create user replication with superuser; create database $use_user with owner $use_user; \c $use_user \set VERBOSITY terse set client_min_messages = warning; create table t0 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t1 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t2 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t3 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t4 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t5 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t6 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t7 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t8 (id serial primary key, when_tsz timestamptz default now(), payload text); create table t9 (id serial primary key, when_tsz timestamptz default now(), payload text); create function fill_me_in(float8) returns void as \$\$ begin insert into t0 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t1 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t2 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t3 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t4 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t5 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t6 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t7 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t8 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); insert into t9 (payload) values ( repeat('payload', 1000 ) ); perform pg_sleep( \$1 * random() ); end; \$\$ language plpgsql; create function remove_some_rows() returns void as \$\$ begin delete from t0 where when_tsz < now() - '10 minutes'::interval; delete from t1 where when_tsz < now() - '10 minutes'::interval; delete from t2 where when_tsz < now() - '10 minutes'::interval; delete from t3 where when_tsz < now() - '10 minutes'::interval; delete from t4 where when_tsz < now() - '10 minutes'::interval; delete from t5 where when_tsz < now() - '10 minutes'::interval; delete from t6 where when_tsz < now() - '10 minutes'::interval; delete from t7 where when_tsz < now() - '10 minutes'::interval; delete from t8 where when_tsz < now() - '10 minutes'::interval; delete from t9 where when_tsz < now() - '10 minutes'::interval; end; \$\$ language plpgsql; SELECT fill_me_in(0); " | psql -p 54001 -d template1 -qAtX | ( grep -v '^[[:space:]]*$' || true ) } verify_archived_xlogs() { while true do all_xlogs="$( find "$work_dir/omnipitr/archive" -type f -printf '%f\n' )" xlog_count="$( echo "$all_xlogs" | wc -l )" if (( $xlog_count > 4 )) then break fi sleep 1 done # sleep 1 - allow for dst-pipe call while read -r xlog_filename do archive_md5="$( md5sum "$work_dir/omnipitr/archive/$xlog_filename" | cut -d\ -f1 )" pipe_md5="$( md5sum "$work_dir/omnipitr/dst-pipe-archive/$xlog_filename" | cut -d\ -f1 )" if [[ $archive_md5 != $pipe_md5 ]] then echo "Checking md5sum of $work_dir/omnipitr/archive/$xlog_filename and $work_dir/omnipitr/dst-pipe-archive/$xlog_filename showed difference ?!" >&2 exit 1 fi done <<< "$all_xlogs" } make_master() { make_master_mkdirs create_temporary_script_for_dst_pipe make_master_initdb pg_ctl -D data-master -s -w start make_master_add_plpgsql make_master_make_load_generator_structs }