From c8e987ed4d380dd5b981b5457e4285d9cb5d74cc Mon Sep 17 00:00:00 2001 From: christianricci Date: Wed, 15 Sep 2021 06:17:30 +1000 Subject: [PATCH] Add sslmode support for PostgreSQL database (#271) * 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> --- config/connectpool/pgcpool.xml | 3 + config/postgresql.xml | 1 + src/postgresql/pgolap.tcl | 65 +++++++------ src/postgresql/pgoltp.tcl | 85 ++++++++-------- src/postgresql/pgopt.tcl | 171 ++++++++++++++++++--------------- src/postgresql/pgotc.tcl | 12 +-- 6 files changed, 183 insertions(+), 154 deletions(-) diff --git a/config/connectpool/pgcpool.xml b/config/connectpool/pgcpool.xml index 74167255..9dd6fb2e 100755 --- a/config/connectpool/pgcpool.xml +++ b/config/connectpool/pgcpool.xml @@ -3,6 +3,7 @@ host1 5432 + prefer tpcc tpcc tpcc @@ -10,6 +11,7 @@ host2 5432 + prefer tpcc tpcc tpcc @@ -17,6 +19,7 @@ host3 5432 + prefer tpcc tpcc tpcc diff --git a/config/postgresql.xml b/config/postgresql.xml index a74a68e2..4ba3474b 100755 --- a/config/postgresql.xml +++ b/config/postgresql.xml @@ -3,6 +3,7 @@ localhost 5432 + prefer diff --git a/src/postgresql/pgolap.tcl b/src/postgresql/pgolap.tcl index 7f748687..b255e485 100755 --- a/src/postgresql/pgolap.tcl +++ b/src/postgresql/pgolap.tcl @@ -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 { @@ -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'" ] @@ -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'"] @@ -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 { @@ -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 @@ -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 { @@ -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" } @@ -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 } } @@ -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 @@ -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'" ] @@ -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" } @@ -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" } @@ -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 }} } @@ -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 @@ -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'" ] @@ -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"] @@ -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} } diff --git a/src/postgresql/pgoltp.tcl b/src/postgresql/pgoltp.tcl index 3f09ffb9..ebe39b74 100755 --- a/src/postgresql/pgoltp.tcl +++ b/src/postgresql/pgoltp.tcl @@ -7,7 +7,7 @@ if {[dict exists $dbdict postgresql library ]} { upvar #0 configpostgresql configpostgresql #set variables to values in dict setlocaltpccvars $configpostgresql -if {[ tk_messageBox -title "Create Schema" -icon question -message "Ready to create a $pg_count_ware Warehouse PostgreSQL TPROC-C schema\nin host [string toupper $pg_host:$pg_port] under user [ string toupper $pg_user ] in database [ string toupper $pg_dbase ]?" -type yesno ] == yes} { +if {[ tk_messageBox -title "Create Schema" -icon question -message "Ready to create a $pg_count_ware Warehouse PostgreSQL TPROC-C schema\nin host [string toupper $pg_host:$pg_port] sslmode [string toupper $pg_sslmode] under user [ string toupper $pg_user ] in database [ string toupper $pg_dbase ]?" -type yesno ] == yes} { if { $pg_num_vu eq 1 || $pg_count_ware eq 1 } { set maxvuser 1 } else { @@ -1577,16 +1577,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'" ] @@ -1595,7 +1595,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'"] @@ -1612,7 +1612,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 { @@ -2064,7 +2064,7 @@ for {set d_id 1} {$d_id <= $DIST_PER_WARE } {incr d_id } { pg_result $result -clear return } -proc do_tpcc { host port count_ware superuser superuser_password defaultdb db tspace user password ora_compatible pg_storedprocs partition num_vu } { +proc do_tpcc { host port sslmode count_ware superuser superuser_password defaultdb db tspace user password ora_compatible pg_storedprocs partition num_vu } { set MAXITEMS 100000 set CUST_PER_DIST 3000 set DIST_PER_WARE 10 @@ -2095,15 +2095,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 { @@ -2160,7 +2160,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" } @@ -2192,7 +2192,7 @@ return } } } -.ed_mainFrame.mainwin.textFrame.left.text fastinsert end "do_tpcc $pg_host $pg_port $pg_count_ware $pg_superuser $pg_superuserpass $pg_defaultdbase $pg_dbase $pg_tspace $pg_user $pg_pass $pg_oracompat $pg_storedprocs $pg_partition $pg_num_vu" +.ed_mainFrame.mainwin.textFrame.left.text fastinsert end "do_tpcc $pg_host $pg_port $pg_sslmode $pg_count_ware $pg_superuser $pg_superuserpass $pg_defaultdbase $pg_dbase $pg_tspace $pg_user $pg_pass $pg_oracompat $pg_storedprocs $pg_partition $pg_num_vu" } else { return } } @@ -2239,13 +2239,13 @@ dict for {id conparams} $connectonly { #Set the parameters to variables named from the keys, this allows us to build the connect strings according to the database dict with conparams { #set PostgreSQL connect string -set $id [ list $pg_host $pg_port $pg_user $pg_pass $pg_dbase ] +set $id [ list $pg_host $pg_port $pg_sslmode $pg_user $pg_pass $pg_dbase ] } } #For the connect keys c1, c2 etc make a connection foreach id [ split $conkeys ] { - lassign [ set $id ] 1 2 3 4 5 -dict set connlist $id [ set lda$id [ ConnectToPostgres $1 $2 $3 $4 $5 ] ] + lassign [ set $id ] 1 2 3 4 5 6 +dict set connlist $id [ set lda$id [ ConnectToPostgres $1 $2 $3 $4 $5 $6 ] ] if { [ set lda$id ] eq "Failed" } { puts "error, the database connection to $1 could not be established" } @@ -2284,7 +2284,7 @@ set $cnt 0 #puts "sproc_cur:$curn_fn connections:[ set $cslist ] cursors:[set $cursor_list] number of cursors:[set $len] execs:[set $cnt]" } #Open standalone connect to determine highest warehouse id for all connections -set mlda [ ConnectToPostgres $host $port $user $password $db ] +set mlda [ ConnectToPostgres $host $port $sslmode $user $password $db ] if { $mlda eq "Failed" } { error "error, the database connection to $host could not be established" } @@ -2375,13 +2375,13 @@ set index [.ed_mainFrame.mainwin.textFrame.left.text search -backwards $line end } if { $timedtype eq "async" } { set syncdrvt(2) [ subst -nocommands -novariables {#CONNECT ASYNC -promise::async simulate_client { clientname total_iterations host port user password db ora_compatible pg_storedprocs RAISEERROR KEYANDTHINK async_verbose async_delay } \{ +promise::async simulate_client { clientname total_iterations host port sslmode user password db ora_compatible pg_storedprocs RAISEERROR KEYANDTHINK async_verbose async_delay } \{ set acno [ expr [ string trimleft [ lindex [ split $clientname ":" ] 1 ] ac ] * $async_delay ] if { $async_verbose } { puts "Delaying login of $clientname for $acno ms" } async_time $acno if { [ tsv::get application abort ] } { return "$clientname:abort before login" } if { $async_verbose } { puts "Logging in $clientname" } -set mlda [ ConnectToPostgresAsynch $host $port $user $password $db $RAISEERROR $clientname $async_verbose ] +set mlda [ ConnectToPostgresAsynch $host $port $sslmode $user $password $db $RAISEERROR $clientname $async_verbose ] } ] set syncdrvi(2a) [.ed_mainFrame.mainwin.textFrame.left.text search -forwards "#RUN TPC-C" 1.0 ] #Insert Asynch connections @@ -2447,10 +2447,10 @@ set syncdrvi(3b) [ expr $syncdrvi(3b) - 1 ] .ed_mainFrame.mainwin.textFrame.left.text fastinsert $syncdrvi(3a) $syncdrvt(3) #Remove extra async connection set syncdrvi(7a) [.ed_mainFrame.mainwin.textFrame.left.text search -backwards "#Open standalone connect to determine highest warehouse id for all connections" end ] -set syncdrvi(7b) [.ed_mainFrame.mainwin.textFrame.left.text search -backwards {set mlda [ ConnectToPostgres $host $port $user $password $db ]} end ] +set syncdrvi(7b) [.ed_mainFrame.mainwin.textFrame.left.text search -backwards {set mlda [ ConnectToPostgres $host $port $sslmode $user $password $db ]} end ] .ed_mainFrame.mainwin.textFrame.left.text fastdelete $syncdrvi(7a) $syncdrvi(7b)+1l #Replace individual lines for Asynch -foreach line {{dict set connlist $id [ set lda$id [ ConnectToPostgres $1 $2 $3 $4 $5 ] ]} {#puts "sproc_cur:$curn_fn connections:[ set $cslist ] cursors:[set $cursor_list] number of cursors:[set $len] execs:[set $cnt]"}} asynchline {{dict set connlist $id [ set lda$id [ ConnectToPostgresAsynch $1 $2 $3 $4 $5 $RAISEERROR $clientname $async_verbose ] ]} {#puts "$clientname:sproc_cur:$curn_fn connections:[ set $cslist ] cursors:[set $cursor_list] number of cursors:[set $len] execs:[set $cnt]"}} { +foreach line {{dict set connlist $id [ set lda$id [ ConnectToPostgres $1 $2 $3 $4 $5 $6 ] ]} {#puts "sproc_cur:$curn_fn connections:[ set $cslist ] cursors:[set $cursor_list] number of cursors:[set $len] execs:[set $cnt]"}} asynchline {{dict set connlist $id [ set lda$id [ ConnectToPostgresAsynch $1 $2 $3 $4 $5 $6 $RAISEERROR $clientname $async_verbose ] ]} {#puts "$clientname:sproc_cur:$curn_fn connections:[ set $cslist ] cursors:[set $cursor_list] number of cursors:[set $len] execs:[set $cnt]"}} { set index [.ed_mainFrame.mainwin.textFrame.left.text search -backwards $line end ] .ed_mainFrame.mainwin.textFrame.left.text fastdelete $index "$index lineend + 1 char" .ed_mainFrame.mainwin.textFrame.left.text fastinsert $index "$asynchline \n" @@ -2508,6 +2508,7 @@ set ora_compatible \"$pg_oracompat\" ;#Postgres Plus Oracle Compatible Schema set pg_storedprocs \"$pg_storedprocs\" ;#Postgres v11 Stored Procedures 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_user\" ;# PostgreSQL user set password \"$pg_pass\" ;# Password for the PostgreSQL user set db \"$pg_dbase\" ;# Database containing the TPC Schema @@ -2524,16 +2525,16 @@ set tstamp [ clock format [ clock seconds ] -format %Y%m%d%H%M%S ] return $tstamp } #POSTGRES CONNECTION -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'" ] @@ -2732,7 +2733,7 @@ pg_result $result -clear } } #RUN TPC-C -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 { @@ -2821,6 +2822,7 @@ set ora_compatible \"$pg_oracompat\" ;#Postgres Plus Oracle Compatible Schema set pg_storedprocs \"$pg_storedprocs\" ;#Postgres v11 Stored Procedures 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 superuser \"$pg_superuser\" ;# Superuser privilege user set superuser_password \"$pg_superuserpass\" ;# Password for Superuser set default_database \"$pg_defaultdbase\" ;# Default Database for Superuser @@ -2838,16 +2840,16 @@ if { [ chk_thread ] eq "FALSE" } { error "PostgreSQL Timed Script must be run in Thread Enabled Interpreter" } -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'" ] @@ -2860,12 +2862,12 @@ switch $myposition { 1 { if { $mode eq "Local" || $mode eq "Primary" } { if { ($DRITA_SNAPSHOTS eq "true") || ($VACUUM eq "true") } { -set lda [ ConnectToPostgres $host $port $superuser $superuser_password $default_database ] +set lda [ ConnectToPostgres $host $port $sslmode $superuser $superuser_password $default_database ] if { $lda eq "Failed" } { error "error, the database connection to $host could not be established" } } -set lda1 [ ConnectToPostgres $host $port $user $password $db ] +set lda1 [ ConnectToPostgres $host $port $sslmode $user $password $db ] if { $lda1 eq "Failed" } { error "error, the database connection to $host could not be established" } @@ -3176,7 +3178,7 @@ pg_result $result -clear } } #RUN TPC-C -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 { @@ -3248,6 +3250,7 @@ set ora_compatible \"$pg_oracompat\" ;#Postgres Plus Oracle Compatible Schema set pg_storedprocs \"$pg_storedprocs\" ;#Postgres v11 Stored Procedures 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 superuser \"$pg_superuser\" ;# Superuser privilege user set superuser_password \"$pg_superuserpass\" ;# Password for Superuser set default_database \"$pg_defaultdbase\" ;# Default Database for Superuser @@ -3269,16 +3272,16 @@ if { [ chk_thread ] eq "FALSE" } { error "PostgreSQL Timed Script must be run in Thread Enabled Interpreter" } -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'" ] @@ -3291,12 +3294,12 @@ switch $myposition { 1 { if { $mode eq "Local" || $mode eq "Primary" } { if { ($DRITA_SNAPSHOTS eq "true") || ($VACUUM eq "true") } { -set lda [ ConnectToPostgres $host $port $superuser $superuser_password $default_database ] +set lda [ ConnectToPostgres $host $port $sslmode $superuser $superuser_password $default_database ] if { $lda eq "Failed" } { error "error, the database connection to $host could not be established" } } -set lda1 [ ConnectToPostgres $host $port $user $password $db ] +set lda1 [ ConnectToPostgres $host $port $sslmode $user $password $db ] if { $lda1 eq "Failed" } { error "error, the database connection to $host could not be established" } @@ -3421,10 +3424,10 @@ proc gettimestamp { } { set tstamp [ clock format [ clock seconds ] -format %Y%m%d%H%M%S ] return $tstamp } -proc ConnectToPostgresAsynch { host port user password dbname RAISEERROR clientname async_verbose } { +proc ConnectToPostgresAsynch { host port sslmode user password dbname RAISEERROR clientname async_verbose } { global tcl_platform puts "Connecting to database $dbname" -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" if { $RAISEERROR } { puts "$clientname:login failed:$message" @@ -3434,7 +3437,7 @@ return "$clientname:login failed:$message" if {$tcl_platform(platform) == "windows"} { #Workaround for Bug #95 where first connection fails on Windows catch {pg_disconnect $lda} -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" if { $RAISEERROR } { puts "$clientname:login failed:$message" @@ -3636,13 +3639,13 @@ pg_result $result -clear } } #CONNECT ASYNC -promise::async simulate_client { clientname total_iterations host port user password db ora_compatible pg_storedprocs RAISEERROR KEYANDTHINK async_verbose async_delay } { +promise::async simulate_client { clientname total_iterations host port sslmode user password db ora_compatible pg_storedprocs RAISEERROR KEYANDTHINK async_verbose async_delay } { set acno [ expr [ string trimleft [ lindex [ split $clientname ":" ] 1 ] ac ] * $async_delay ] if { $async_verbose } { puts "Delaying login of $clientname for $acno ms" } async_time $acno if { [ tsv::get application abort ] } { return "$clientname:abort before login" } if { $async_verbose } { puts "Logging in $clientname" } -set lda [ ConnectToPostgresAsynch $host $port $user $password $db $RAISEERROR $clientname $async_verbose ] +set lda [ ConnectToPostgresAsynch $host $port $sslmode $user $password $db $RAISEERROR $clientname $async_verbose ] #RUN TPC-C if { $ora_compatible eq "true" } { set result [ pg_exec $lda "exec dbms_output.disable" ] @@ -3700,7 +3703,7 @@ return $clientname:complete for {set ac 1} {$ac <= $async_client} {incr ac} { set clientdesc "vuser$myposition:ac$ac" lappend clientlist $clientdesc -lappend clients [simulate_client $clientdesc $total_iterations $host $port $user $password $db $ora_compatible $pg_storedprocs $RAISEERROR $KEYANDTHINK $async_verbose $async_delay] +lappend clients [simulate_client $clientdesc $total_iterations $host $port $sslmode $user $password $db $ora_compatible $pg_storedprocs $RAISEERROR $KEYANDTHINK $async_verbose $async_delay] } puts "Started asynchronous clients:$clientlist" set acprom [ promise::eventloop [ promise::all $clients ] ] diff --git a/src/postgresql/pgopt.tcl b/src/postgresql/pgopt.tcl index ee6b5b31..fafc4aaf 100755 --- a/src/postgresql/pgopt.tcl +++ b/src/postgresql/pgopt.tcl @@ -17,9 +17,9 @@ variable pg_oracompat if {[dict exists configpostgresql tpcc pg_oracompat ]} { set pg_oracompat [ dict get configpostgresql tpcc pg_oracompat ] } -set pgoptsfields [ dict create connection {pg_host {.countopt.f1.e1 get} pg_port {.countopt.f1.e2 get}} tpcc {pg_superuser {.countopt.f1.e3 get} pg_superuserpass {.countopt.f1.e4 get} pg_defaultdbase {.countopt.f1.e5 get}} ] +set pgoptsfields [ dict create connection {pg_host {.countopt.f1.e1 get} pg_port {.countopt.f1.e2 get} pg_sslmode $pg_sslmode} tpcc {pg_superuser {.countopt.f1.e3 get} pg_superuserpass {.countopt.f1.e4 get} pg_defaultdbase {.countopt.f1.e5 get}} ] } else { -set pgoptsfields [ dict create connection {pg_host {.countopt.f1.e1 get} pg_port {.countopt.f1.e2 get}} tpch {pg_tpch_superuser {.countopt.f1.e3 get} pg_tpch_superuserpass {.countopt.f1.e4 get} pg_tpch_defaultdbase {.countopt.f1.e5 get}} ] +set pgoptsfields [ dict create connection {pg_host {.countopt.f1.e1 get} pg_port {.countopt.f1.e2 get} pg_sslmode $pg_sslmode} tpch {pg_tpch_superuser {.countopt.f1.e3 get} pg_tpch_superuserpass {.countopt.f1.e4 get} pg_tpch_defaultdbase {.countopt.f1.e5 get}} ] } if { [ info exists afval ] } { after cancel $afval @@ -103,9 +103,16 @@ set Name $Parent.f1.e6 grid $Prompt -column 0 -row 6 -sticky e grid $Name -column 1 -row 6 -sticky ew +set Prompt $Parent.f1.p6a +ttk::label $Prompt -text "Prefer PostgreSQL SSL Mode :" +set Name $Parent.f1.e6a +ttk::checkbutton $Name -text "" -variable pg_sslmode -onvalue "prefer" -offvalue "disable" + grid $Prompt -column 0 -row 7 -sticky e + grid $Name -column 1 -row 7 -sticky w + set Name $Parent.f1.e7 ttk::checkbutton $Name -text "Log Output to Temp" -variable tclog -onvalue 1 -offvalue 0 - grid $Name -column 1 -row 7 -sticky w + grid $Name -column 1 -row 8 -sticky w bind .countopt.f1.e7