Skip to content

Commit cd9e508

Browse files
author
Mohit Joshi
committed
Added PG TDE testcases
1 parent a889eb1 commit cd9e508

File tree

9 files changed

+1041
-0
lines changed

9 files changed

+1041
-0
lines changed

postgresql/bugs/PG-1813/PG-1813.sh

Lines changed: 143 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,143 @@
1+
#!/bin/bash
2+
3+
# Setup paths and variables
4+
INSTALL_DIR=$HOME/postgresql/bld_tde/install
5+
PRIMARY_DATA=$INSTALL_DIR/primary_data
6+
REPLICA_DATA=$INSTALL_DIR/replica_data
7+
PRIMARY_LOGFILE=$PRIMARY_DATA/server.log
8+
REPLICA_LOGFILE=$REPLICA_DATA/server.log
9+
PG_CTL="$INSTALL_DIR/bin/pg_ctl"
10+
PG_REWIND="$INSTALL_DIR/bin/pg_rewind"
11+
PG_BASEBACKUP="$INSTALL_DIR/bin/pg_basebackup"
12+
PSQL="$INSTALL_DIR/bin/psql"
13+
SYSBENCH="/usr/bin/sysbench"
14+
15+
PORT_PRIMARY=5432
16+
PORT_REPLICA=5433
17+
REPL_USER=repl
18+
REPL_PASS=replica
19+
DB_NAME=postgres
20+
DB_USER=$(whoami)
21+
22+
# Clean slate
23+
pkill -9 postgres
24+
rm -rf "$PRIMARY_DATA" "$REPLICA_DATA"
25+
rm -rf /tmp/primary_keyfile
26+
27+
# Step 1: Init primary
28+
$INSTALL_DIR/bin/initdb -D "$PRIMARY_DATA"
29+
30+
# Configure primary
31+
cat >> "$PRIMARY_DATA/postgresql.conf" <<EOF
32+
port = $PORT_PRIMARY
33+
shared_preload_libraries = 'pg_tde'
34+
default_table_access_method = 'tde_heap'
35+
wal_level = replica
36+
wal_compression = on
37+
wal_log_hints = on
38+
wal_keep_size = 512MB
39+
max_replication_slots = 2
40+
max_wal_senders = 2
41+
listen_addresses = 'localhost'
42+
logging_collector = on
43+
log_directory = 'log'
44+
log_filename = 'primary.log'
45+
EOF
46+
47+
echo "host replication $REPL_USER 127.0.0.1/32 trust" >> "$PRIMARY_DATA/pg_hba.conf"
48+
echo "host all all 127.0.0.1/32 trust" >> "$PRIMARY_DATA/pg_hba.conf"
49+
50+
echo "=> Step 1: Start primary"
51+
echo "#########################"
52+
$PG_CTL -D "$PRIMARY_DATA" -o "-p $PORT_PRIMARY" -l "$PRIMARY_LOGFILE" start
53+
sleep 3
54+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "CREATE EXTENSION pg_tde;"
55+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "SELECT pg_tde_add_global_key_provider_file('file_provider','/tmp/primary_keyfile');"
56+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "SELECT pg_tde_create_key_using_global_key_provider('key1','file_provider');"
57+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "SELECT pg_tde_set_default_key_using_global_key_provider('key1','file_provider');"
58+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "ALTER SYSTEM SET pg_tde.wal_encrypt=ON;"
59+
# Restart primary
60+
$PG_CTL -D "$PRIMARY_DATA" -o "-p $PORT_PRIMARY" -l "$PRIMARY_LOGFILE" restart
61+
sleep 3
62+
63+
# Create replication user
64+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "CREATE ROLE $REPL_USER WITH LOGIN REPLICATION SUPERUSER PASSWORD '$REPL_PASS';"
65+
66+
# Create tables
67+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "CREATE TABLE t1(id INT, name TEXT);"
68+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "INSERT INTO t1 VALUES(101,'First Record');"
69+
70+
echo "=> Step 2: Take base backup for replica"
71+
echo "#######################################"
72+
$PG_BASEBACKUP -D "$REPLICA_DATA" -X stream -R -h localhost -p $PORT_PRIMARY -U $REPL_USER
73+
74+
# Configure replica
75+
cat > "$REPLICA_DATA/postgresql.conf" <<EOF
76+
port = $PORT_REPLICA
77+
shared_preload_libraries = 'pg_tde'
78+
default_table_access_method = 'tde_heap'
79+
hot_standby = on
80+
logging_collector = on
81+
log_directory = 'log'
82+
log_filename = 'replica.log'
83+
wal_level = replica
84+
wal_compression = on
85+
wal_keep_size= 512MB
86+
max_wal_senders = 2
87+
EOF
88+
89+
echo "=>Step 3: Start replica"
90+
echo "########################"
91+
$PG_CTL -D "$REPLICA_DATA" -o "-p $PORT_REPLICA" -l "$REPLICA_LOGFILE" start
92+
sleep 5
93+
$PSQL -p $PORT_REPLICA -d $DB_NAME -c "ALTER SYSTEM SET pg_tde.wal_encrypt=ON;"
94+
# Restart replica
95+
$PG_CTL -D "$REPLICA_DATA" -o "-p $PORT_REPLICA" -l "$REPLICA_LOGFILE" restart
96+
sleep 5
97+
98+
echo "=>Step 4: Generate some WAL on primary"
99+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "INSERT INTO t1 VALUES (102, 'Second Record');"
100+
101+
$PG_CTL -D "$PRIMARY_DATA" -m immediate stop
102+
sleep 3
103+
104+
echo "=> Step 5: Promote replica"
105+
echo "##########################"
106+
# Remove auto conf file which was created by pg_basebackup
107+
rm -f $REPLICA_DATA/postgresql.auto.conf
108+
$PG_CTL -D "$REPLICA_DATA" promote
109+
110+
echo "=>Step 6: Use sysbench to generate WAL on promoted replica"
111+
echo "##########################################################"
112+
echo "Generating WAL with sysbench..."
113+
$PSQL -p $PORT_REPLICA -d $DB_NAME -c "INSERT INTO t1 VALUES(103,'Third Record');"
114+
115+
# Backing up the Original config file
116+
cp $PRIMARY_DATA/postgresql.conf /tmp/postgresql_bk.conf
117+
echo "=> Step 8: Rewind old primary"
118+
echo "############################"
119+
echo "Rewinding old primary..."
120+
$PG_REWIND --target-pgdata="$PRIMARY_DATA" \
121+
--source-server="host=localhost port=$PORT_REPLICA user=$REPL_USER dbname=$DB_NAME"
122+
123+
# Restoring the Original config file
124+
cp /tmp/postgresql_bk.conf $PRIMARY_DATA/postgresql.conf
125+
126+
echo "=> Step 9: Configure old primary as standby"
127+
echo "###########################################"
128+
touch $PRIMARY_DATA/standby.signal
129+
cat >> "$PRIMARY_DATA/postgresql.conf" <<EOF
130+
primary_conninfo = 'host=localhost port=$PORT_REPLICA user=$REPL_USER password=$REPL_PASS'
131+
EOF
132+
133+
echo "=> Step 10: Start rewound primary"
134+
echo "################################"
135+
$PG_CTL -D "$PRIMARY_DATA" -o "-p $PORT_PRIMARY" -l "$PRIMARY_LOGFILE" start
136+
sleep 5
137+
138+
# Validate data on both servers
139+
$PSQL -p $PORT_PRIMARY -d $DB_NAME -c "SELECT * FROM t1"
140+
$PSQL -p $PORT_REPLICA -d $DB_NAME -c "SELECT * FROM t1"
141+
142+
tail -10f $PRIMARY_DATA/log/primary.log
143+

postgresql/bugs/PG-1835/PG-1835.sh

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
#!/bin/bash
2+
3+
# Config
4+
INSTALL_DIR=$HOME/postgresql/bld_tde/install
5+
DATA_DIR=$INSTALL_DIR/pg_resetwal_test_data
6+
LOGFILE=$DATA_DIR/server.log
7+
PG_CTL=$INSTALL_DIR/bin/pg_ctl
8+
INITDB=$INSTALL_DIR/bin/initdb
9+
PSQL=$INSTALL_DIR/bin/psql
10+
PG_RESETWAL=$INSTALL_DIR/bin/pg_resetwal
11+
PORT=5432
12+
13+
# Cleanup from previous runs
14+
PID=$(lsof -ti :$PORT)
15+
if [ -n "$PID" ]; then
16+
kill -9 $PID
17+
fi
18+
rm -rf "$DATA_DIR" /tmp/keyring.per
19+
20+
echo "=> Initialise Data directory"
21+
"$INSTALL_DIR/bin/initdb" -D "$DATA_DIR"
22+
23+
# Enable WAL encryption via postgresql.conf
24+
echo "shared_preload_libraries = 'pg_tde'" >> $DATA_DIR/postgresql.conf
25+
echo "default_table_access_method = 'tde_heap'" >> $DATA_DIR/postgresql.conf
26+
echo "port = $PORT" >> $DATA_DIR/postgresql.conf
27+
28+
echo "=> Starting PostgreSQL"
29+
$PG_CTL -D "$DATA_DIR" -l "$LOGFILE" start
30+
sleep 2
31+
32+
echo "Creating TDE extension"
33+
$PSQL -d postgres -p $PORT -c "CREATE EXTENSION pg_tde;"
34+
$PSQL -d postgres -p $PORT -c "SELECT pg_tde_add_global_key_provider_file('global_provider', '/tmp/keyring.per');"
35+
$PSQL -d postgres -p $PORT -c "SELECT pg_tde_create_key_using_global_key_provider('wal_key', 'global_provider');"
36+
$PSQL -d postgres -p $PORT -c "SELECT pg_tde_create_key_using_global_key_provider('database_key', 'global_provider');"
37+
$PSQL -d postgres -p $PORT -c "SELECT pg_tde_set_server_key_using_global_key_provider('wal_key', 'global_provider');"
38+
$PSQL -d postgres -p $PORT -c "SELECT pg_tde_set_key_using_global_key_provider('database_key', 'global_provider');"
39+
$PSQL -d postgres -p $PORT -c "ALTER SYSTEM SET pg_tde.wal_encrypt=ON;"
40+
41+
echo "=> ReStarting PostgreSQL"
42+
$PG_CTL -D "$DATA_DIR" -l "$LOGFILE" restart
43+
sleep 2
44+
45+
echo "=> Creating test table and inserting data"
46+
$PSQL -p 5432 -d postgres -c "CREATE TABLE test(id INT, val TEXT);"
47+
$PSQL -p 5432 -d postgres -c "INSERT INTO test VALUES (1, 'before reset');"
48+
49+
echo "=> Stopping PostgreSQL"
50+
$PG_CTL -D "$DATA_DIR" stop
51+
sleep 2
52+
53+
echo "=> Running pg_resetwal on encrypted WAL cluster"
54+
$PG_RESETWAL -D "$DATA_DIR"
55+
56+
echo ">>> Restarting PostgreSQL after WAL reset"
57+
$PG_CTL -D "$DATA_DIR" -l "$LOGFILE" start
58+
sleep 2
59+
60+
echo ">>> Inserting data after reset"
61+
$PSQL -p 5432 -d postgres -c "INSERT INTO test VALUES (2, 'after reset');"
62+
63+
echo ">>> Querying table to verify data"
64+
$PSQL -p 5432 -d postgres -c "SELECT * FROM test;"
65+
66+
echo ">>> Done. Check $LOGFILE for details."
67+
68+
# Optionally show WAL timeline
69+
echo ">>> Current timeline after reset:"
70+
$PSQL -p 5432 -d postgres -c "SELECT pg_walfile_name(pg_current_wal_lsn());"
71+
72+
echo ">>> Stopping PostgreSQL"
73+
$PG_CTL -D "$DATA_DIR" stop
74+

postgresql/tests/pg_resetwal.sh

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/bin/bash
2+
3+
# Paths and ports
4+
INSTALL_DIR=$HOME/postgresql/bld_tde/install
5+
PRIMARY_DATA=$INSTALL_DIR/primary_data
6+
PG_CTL="$INSTALL_DIR/bin/pg_ctl"
7+
PG_RESETWAL="$INSTALL_DIR/bin/pg_resetwal"
8+
PSQL="$INSTALL_DIR/bin/psql"
9+
PORT=5432
10+
LOG="$PRIMARY_DATA/server.log"
11+
12+
echo "Cleaning up..."
13+
pkill -9 postgres
14+
rm -rf "$PRIMARY_DATA"
15+
mkdir -p "$PRIMARY_DATA"
16+
17+
echo "Initializing new cluster with encrypted WAL..."
18+
$INSTALL_DIR/bin/initdb -D "$PRIMARY_DATA" --wal-segsize=16
19+
20+
# Enable encryption
21+
echo "shared_preload_libraries = 'pg_tde'" >> "$PRIMARY_DATA/postgresql.conf"
22+
echo "port = $PORT" >> "$PRIMARY_DATA/postgresql.conf"
23+
24+
echo "Starting PostgreSQL..."
25+
$PG_CTL -D "$PRIMARY_DATA" -l "$LOG" start
26+
sleep 3
27+
28+
echo "Creating some tables and generating WAL..."
29+
$PSQL -p $PORT -d postgres -c "CREATE EXTENSION pg_tde;"
30+
$PSQL -p $PORT -d postgres -c "CREATE TABLE t1 (id serial, data text);"
31+
$PSQL -p $PORT -d postgres -c "INSERT INTO t1 (data) SELECT repeat('x', 1000) FROM generate_series(1,10000);"
32+
$PSQL -p $PORT -d postgres -c "CHECKPOINT;"
33+
34+
echo "Stopping PostgreSQL..."
35+
$PG_CTL -D "$PRIMARY_DATA" stop
36+
37+
echo "Resetting WAL forcibly using pg_resetwal..."
38+
$PG_RESETWAL -D "$PRIMARY_DATA"
39+
40+
echo "Attempting to start PostgreSQL after WAL reset..."
41+
$PG_CTL -D "$PRIMARY_DATA" -l "$LOG" start || echo "Server failed to start as expected due to TDE"
42+
43+
44+
$PSQL -p $PORT -d postgres -c "SELECT count(*) FROM t1;"
45+
46+
47+
echo "Done."

0 commit comments

Comments
 (0)