Skip to content

Commit

Permalink
Add sslmode support for PostgreSQL database (#271)
Browse files Browse the repository at this point in the history
* Add sslmode support for PostgreSQL database

Allow pg_sslmode argument to be passed into the postgres driver. Keep default argument value to prefer to make it compatible with default postgres value (refer to https://www.postgresql.org/docs/13/libpq-ssl.html)

pg_sslmode can be changed as follows:

    hammerdb>dbset db pg
    Database set to PostgreSQL

    hammerdb>print dict
    Dictionary Settings for PostgreSQL
    connection {
     pg_host    = localhost
     pg_port    = 5432
     pg_sslmode = prefer
    }
    ...

    hammerdb>diset connection pg_sslmode disable
    Changed connection:pg_sslmode from prefer to disable for PostgreSQL

    hammerdb>print dict
    Dictionary Settings for PostgreSQL
    connection {
     pg_host    = localhost
     pg_port    = 5432
     pg_sslmode = disable
    }
    ...

All new code of the whole pull request, including one or several files that are either new files or modified ones, are contributed under the BSD-new license. I am contributing on behalf of my employer Amazon Web Services, Inc.

* Updates for #274 add sslmode support for PostgreSQL database (#1)

* Fix invalid sslmode value for Transaction Counter

* Fix can't read sslmode value when using asynchronous scaling

* Fix wrong number of args with sslmode for TPROC-H Refresh Function

* Add sslmode to XML config for PostgreSQL connect pool

* Add PostgreSQL sslmode option to GUI interface for TPROC-C/H and TX Counter

* Fix sslmode for TPROC-C Asynch with Connect Pool

Co-authored-by: Steve Shaw <38044085+sm-shaw@users.noreply.github.com>
  • Loading branch information
christianricci and sm-shaw committed Sep 14, 2021
1 parent 6e76479 commit c8e987e
Show file tree
Hide file tree
Showing 6 changed files with 183 additions and 154 deletions.
3 changes: 3 additions & 0 deletions config/connectpool/pgcpool.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,20 +3,23 @@
<c1>
<pg_host>host1</pg_host>
<pg_port>5432</pg_port>
<pg_sslmode>prefer</pg_sslmode>
<pg_user>tpcc</pg_user>
<pg_pass>tpcc</pg_pass>
<pg_dbase>tpcc</pg_dbase>
</c1>
<c2>
<pg_host>host2</pg_host>
<pg_port>5432</pg_port>
<pg_sslmode>prefer</pg_sslmode>
<pg_user>tpcc</pg_user>
<pg_pass>tpcc</pg_pass>
<pg_dbase>tpcc</pg_dbase>
</c2>
<c3>
<pg_host>host3</pg_host>
<pg_port>5432</pg_port>
<pg_sslmode>prefer</pg_sslmode>
<pg_user>tpcc</pg_user>
<pg_pass>tpcc</pg_pass>
<pg_dbase>tpcc</pg_dbase>
Expand Down
1 change: 1 addition & 0 deletions config/postgresql.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@
<connection>
<pg_host>localhost</pg_host>
<pg_port>5432</pg_port>
<pg_sslmode>prefer</pg_sslmode>
</connection>
<tpcc>
<schema>
Expand Down
65 changes: 34 additions & 31 deletions src/postgresql/pgolap.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@ if {[dict exists $dbdict postgresql library ]} {
upvar #0 configpostgresql configpostgresql
#set variables to values in dict
setlocaltpchvars $configpostgresql
if {[ tk_messageBox -title "Create Schema" -icon question -message "Ready to create a Scale Factor $pg_scale_fact TPROC-H schema\n in host [string toupper $pg_host:$pg_port] under user [ string toupper $pg_tpch_user ] in database [ string toupper $pg_tpch_dbase ]?" -type yesno ] == yes} {
if {[ tk_messageBox -title "Create Schema" -icon question -message "Ready to create a Scale Factor $pg_scale_fact TPROC-H schema\n in host [string toupper $pg_host:$pg_port] sslmode [string toupper $pg_sslmode] under user [ string toupper $pg_tpch_user ] in database [ string toupper $pg_tpch_dbase ]?" -type yesno ] == yes} {

if { $pg_num_tpch_threads eq 1 } {
set maxvuser 1
} else {
Expand Down Expand Up @@ -50,16 +51,16 @@ pg_result $result -clear
return
}

proc ConnectToPostgres { host port user password dbname } {
proc ConnectToPostgres { host port sslmode user password dbname } {
global tcl_platform
if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]} message]} {
if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port sslmode = $sslmode user = $user password = $password dbname = $dbname ]]} message]} {
set lda "Failed" ; puts $message
error $message
} else {
if {$tcl_platform(platform) == "windows"} {
#Workaround for Bug #95 where first connection fails on Windows
catch {pg_disconnect $lda}
set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]
set lda [pg_connect -conninfo [list host = $host port = $port sslmode = $sslmode user = $user password = $password dbname = $dbname ]]
}
pg_notice_handler $lda puts
set result [ pg_exec $lda "set CLIENT_MIN_MESSAGES TO 'ERROR'" ]
Expand All @@ -68,7 +69,7 @@ pg_result $result -clear
return $lda
}

proc CreateUserDatabase { lda host port db tspace superuser superuser_password user password } {
proc CreateUserDatabase { lda host port sslmode db tspace superuser superuser_password user password } {
set stmnt_count 1
puts "CREATING DATABASE $db under OWNER $user"
set result [ pg_exec $lda "SELECT 1 FROM pg_roles WHERE rolname = '$user'"]
Expand All @@ -85,7 +86,7 @@ set result [ pg_exec $lda "SELECT 1 FROM pg_database WHERE datname = '$db'"]
if { [pg_result $result -numTuples] == 0} {
set sql($stmnt_count) "CREATE DATABASE $db OWNER $user"
} else {
set existing_db [ ConnectToPostgres $host $port $superuser $superuser_password $db ]
set existing_db [ ConnectToPostgres $host $port $sslmode $superuser $superuser_password $db ]
if { $existing_db eq "Failed" } {
error "error, the database connection to $host could not be established"
} else {
Expand Down Expand Up @@ -557,7 +558,7 @@ error "[pg_result $result -error]"
return
}

proc do_tpch { host port scale_fact superuser superuser_password defaultdb db tspace user password greenplum gpcompress num_vu } {
proc do_tpch { host port sslmode scale_fact superuser superuser_password defaultdb db tspace user password greenplum gpcompress num_vu } {
global dist_names dist_weights weights dists weights
###############################################
#Generating following rows
Expand Down Expand Up @@ -610,15 +611,15 @@ set num_vu 1
}
if { $threaded eq "SINGLE-THREADED" || $threaded eq "MULTI-THREADED" && $myposition eq 1 } {
puts "CREATING [ string toupper $user ] SCHEMA"
set lda [ ConnectToPostgres $host $port $superuser $superuser_password $defaultdb ]
set lda [ ConnectToPostgres $host $port $sslmode $superuser $superuser_password $defaultdb ]
if { $lda eq "Failed" } {
error "error, the database connection to $host could not be established"
} else {
CreateUserDatabase $lda $host $port $db $tspace $superuser $superuser_password $user $password
CreateUserDatabase $lda $host $port $sslmode $db $tspace $superuser $superuser_password $user $password
set result [ pg_exec $lda "commit" ]
pg_result $result -clear
pg_disconnect $lda
set lda [ ConnectToPostgres $host $port $user $password $db ]
set lda [ ConnectToPostgres $host $port $sslmode $user $password $db ]
if { $lda eq "Failed" } {
error "error, the database connection to $host could not be established"
} else {
Expand Down Expand Up @@ -677,7 +678,7 @@ return
}
after 5000
}
set lda [ ConnectToPostgres $host $port $user $password $db ]
set lda [ ConnectToPostgres $host $port $sslmode $user $password $db ]
if { $lda eq "Failed" } {
error "error, the database connection to $host could not be established"
}
Expand Down Expand Up @@ -720,7 +721,7 @@ return
}
}
}
.ed_mainFrame.mainwin.textFrame.left.text fastinsert end "do_tpch $pg_host $pg_port $pg_scale_fact $pg_tpch_superuser $pg_tpch_superuserpass $pg_tpch_defaultdbase $pg_tpch_dbase $pg_tpch_tspace $pg_tpch_user $pg_tpch_pass $pg_tpch_gpcompat $pg_tpch_gpcompress $pg_num_tpch_threads"
.ed_mainFrame.mainwin.textFrame.left.text fastinsert end "do_tpch $pg_host $pg_port $pg_sslmode $pg_scale_fact $pg_tpch_superuser $pg_tpch_superuserpass $pg_tpch_defaultdbase $pg_tpch_dbase $pg_tpch_tspace $pg_tpch_user $pg_tpch_pass $pg_tpch_gpcompat $pg_tpch_gpcompress $pg_num_tpch_threads"
} else { return }
}

Expand All @@ -746,6 +747,7 @@ set degree_of_parallel \"$pg_degree_of_parallel\" ;# Degree of Parallelism
set scale_factor $pg_scale_fact ;#Scale factor of the tpc-h schema
set host \"$pg_host\" ;# Address of the server hosting PostgreSQL
set port \"$pg_port\" ;# Port of the PostgreSQL Server
set sslmode \"$pg_sslmode\" ;# SSLMode of the PostgreSQL Server
set user \"$pg_tpch_user\" ;# PostgreSQL user
set password \"$pg_tpch_pass\" ;# Password for the PostgreSQL user
set db \"$pg_tpch_dbase\" ;# Database containing the TPC Schema
Expand Down Expand Up @@ -775,16 +777,16 @@ puts "Query Failed : $sql : $message"
return [ expr $rowcount ]
}

proc ConnectToPostgres { host port user password dbname } {
proc ConnectToPostgres { host port sslmode user password dbname } {
global tcl_platform
if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]} message]} {
if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port sslmode = $sslmode user = $user password = $password dbname = $dbname ]]} message]} {
set lda "Failed" ; puts $message
error $message
} else {
if {$tcl_platform(platform) == "windows"} {
#Workaround for Bug #95 where first connection fails on Windows
catch {pg_disconnect $lda}
set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]
set lda [pg_connect -conninfo [list host = $host port sslmode = $port sslmode = $sslmode user = $user password = $password dbname = $dbname ]]
}
pg_notice_handler $lda puts
set result [ pg_exec $lda "set CLIENT_MIN_MESSAGES TO 'ERROR'" ]
Expand Down Expand Up @@ -944,8 +946,8 @@ set result [ pg_exec $lda "commit" ]
pg_result $result -clear
}

proc do_refresh { host port db user password scale_factor update_sets trickle_refresh REFRESH_VERBOSE RF_SET } {
set lda [ ConnectToPostgres $host $port $user $password $db ]
proc do_refresh { host port sslmode db user password scale_factor update_sets trickle_refresh REFRESH_VERBOSE RF_SET } {
set lda [ ConnectToPostgres $host $port $sslmode $user $password $db ]
if { $lda eq "Failed" } {
error "error, the database connection to $host could not be established"
}
Expand Down Expand Up @@ -1198,10 +1200,10 @@ return $q2sub
}
#########################
#TPCH QUERY SETS PROCEDURE
proc do_tpch { host port db user password scale_factor RAISEERROR VERBOSE degree_of_parallel total_querysets myposition } {
proc do_tpch { host port sslmode db user password scale_factor RAISEERROR VERBOSE degree_of_parallel total_querysets myposition } {
#Queries 17 and 20 are long running on PostgreSQL
set SKIP_QUERY_17_20 "false"
set lda [ ConnectToPostgres $host $port $user $password $db ]
set lda [ ConnectToPostgres $host $port $sslmode $user $password $db ]
if { $lda eq "Failed" } {
error "error, the database connection to $host could not be established"
}
Expand Down Expand Up @@ -1304,21 +1306,21 @@ if { $power_test } {
set trickle_refresh 0
set update_sets 1
set REFRESH_VERBOSE "false"
do_refresh $host $port $db $user $password $scale_factor $update_sets $trickle_refresh $REFRESH_VERBOSE RF1
do_tpch $host $port $db $user $password $scale_factor $RAISEERROR $VERBOSE $degree_of_parallel $total_querysets 0
do_refresh $host $port $db $user $password $scale_factor $update_sets $trickle_refresh $REFRESH_VERBOSE RF2
do_refresh $host $port $sslmode $db $user $password $scale_factor $update_sets $trickle_refresh $REFRESH_VERBOSE RF1
do_tpch $host $port $sslmode $db $user $password $scale_factor $RAISEERROR $VERBOSE $degree_of_parallel $total_querysets 0
do_refresh $host $port $sslmode $db $user $password $scale_factor $update_sets $trickle_refresh $REFRESH_VERBOSE RF2
} else {
switch $myposition {
1 {
do_refresh $host $port $db $user $password $scale_factor $update_sets $trickle_refresh $REFRESH_VERBOSE BOTH
do_refresh $host $port $sslmode $db $user $password $scale_factor $update_sets $trickle_refresh $REFRESH_VERBOSE BOTH
}
default {
do_tpch $host $port $db $user $password $scale_factor $RAISEERROR $VERBOSE $degree_of_parallel $total_querysets [ expr $myposition - 1 ]
do_tpch $host $port $sslmode $db $user $password $scale_factor $RAISEERROR $VERBOSE $degree_of_parallel $total_querysets [ expr $myposition - 1 ]
}
}
}
} else {
do_tpch $host $port $db $user $password $scale_factor $RAISEERROR $VERBOSE $degree_of_parallel $total_querysets $myposition
do_tpch $host $port $sslmode $db $user $password $scale_factor $RAISEERROR $VERBOSE $degree_of_parallel $total_querysets $myposition
}}
}

Expand All @@ -1343,6 +1345,7 @@ set degree_of_parallel \"$pg_degree_of_parallel\" ;# Degree of Parallelism
set redshift_compat \"$pg_rs_compat\" ;# Queries to run against redshift (true or false)
set host \"$pg_host\" ;# Address of the server hosting PostgreSQL
set port \"$pg_port\" ;# Port of the PostgreSQL Server
set sslmode \"$pg_sslmode\" ;# SSLMode of the PostgreSQL Server
set user \"$pg_tpch_user\" ;# PostgreSQL user
set password \"$pg_tpch_pass\" ;# Password for the PostgreSQL user
set db \"$pg_tpch_dbase\" ;# Database containing the TPC Schema
Expand All @@ -1368,16 +1371,16 @@ puts "Query Failed : $sql : $message"
return [ expr $rowcount ]
}

proc ConnectToPostgres { host port user password dbname } {
proc ConnectToPostgres { host port sslmode user password dbname } {
global tcl_platform
if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]} message]} {
if {[catch {set lda [pg_connect -conninfo [list host = $host port = $port sslmode = $sslmode user = $user password = $password dbname = $dbname ]]} message]} {
puts $message
error $message
} else {
if {$tcl_platform(platform) == "windows"} {
#Workaround for Bug #95 where first connection fails on Windows
catch {pg_disconnect $lda}
set lda [pg_connect -conninfo [list host = $host port = $port user = $user password = $password dbname = $dbname ]]
set lda [pg_connect -conninfo [list host = $host port = $port sslmode = $sslmode user = $user password = $password dbname = $dbname ]]
}
pg_notice_handler $lda puts
set result [ pg_exec $lda "set CLIENT_MIN_MESSAGES TO 'ERROR'" ]
Expand Down Expand Up @@ -1448,13 +1451,13 @@ return $sql($query_no)
}
#########################
#CLOUD ANALYTIC TPCH QUERY SETS PROCEDURE
proc do_cloud { host port user password db RAISEERROR VERBOSE degree_of_parallel redshift_compat } {
proc do_cloud { host port sslmode user password db RAISEERROR VERBOSE degree_of_parallel redshift_compat } {
if { $redshift_compat } {
set VERSION "redshift"
} else {
set VERSION "postgres"
}
set lda [ ConnectToPostgres $host $port $user $password $db ]
set lda [ ConnectToPostgres $host $port $sslmode $user $password $db ]
if { $VERSION eq "postgres" } {
create_median_and_percentile $lda
set result [ pg_exec $lda "set max_parallel_workers_per_gather=$degree_of_parallel"]
Expand Down Expand Up @@ -1489,5 +1492,5 @@ pg_disconnect $lda
}
#########################
#RUN CLOUD ANALYTIC TPC-H
do_cloud $host $port $user $password $db $RAISEERROR $VERBOSE $degree_of_parallel $redshift_compat}
do_cloud $host $port $sslmode $user $password $db $RAISEERROR $VERBOSE $degree_of_parallel $redshift_compat}
}
Loading

0 comments on commit c8e987e

Please sign in to comment.