Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix for keepalive issue #445 #446

Merged
merged 3 commits into from
Nov 3, 2022
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions config/generic.xml
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,9 @@
<gen_directory>
</gen_directory>
</datageneration>
<commandline>
<keepalive_margin>10</keepalive_margin>
</commandline>
<webservice>
<ws_port>8080</ws_port>
<sqlite_db>TMP</sqlite_db>
Expand Down
15 changes: 13 additions & 2 deletions src/generic/gencli.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,7 @@ proc .ed_mainFrame.buttons.datagen { args } { ; }
proc .ed_mainFrame.buttons.boxes { args } { ; }
proc .ed_mainFrame.buttons.test { args } { ; }
proc .ed_mainFrame.buttons.runworld { args } { ; }
proc .ed_mainFrame.buttons.delete { args } { ; }
proc ed_lvuser_button { args } { ; }
proc .ed_mainFrame.editbuttons.test { args } { ; }
proc .ed_mainFrame.editbuttons.distribute { args } { ; }
Expand Down Expand Up @@ -779,6 +780,9 @@ proc vucreate {} {
catch {loadscript}
if { [ string length $_ED(package) ] eq 0 } {
putscli "No Script loaded: Load script before creating Virtual Users"
} else {
#Call vucreate recursively, first call loaded script, 2nd to create VUs
vucreate
}
} else {
if {[expr [ llength [ threadnames_without_tcthread ] ] - 1 ] > 0} {
Expand Down Expand Up @@ -1051,6 +1055,13 @@ proc keepalive {} {
if {$bm eq "TPC-C"} {
#For TPC-C we have a rampup and duration time, find these, check they are valid and call _runtimer automatically with these values
upvar #0 dbdict dbdict
upvar #0 genericdict genericdict
if {[dict exists $genericdict commandline keepalive_margin]} {
set ka_margin [ dict get $genericdict commandline keepalive_margin]
if {![string is entier $ka_margin]} { set ka_margin 10 }
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

The if and else branches do the same thing - do we need the condition at all?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I believe so - the genericdict has a new entry as below in the XML config files and this also gets stored in the SQLite files as well.

<commandline>
       <keepalive_margin>10</keepalive_margin>
</commandline>

all of the XML files get stored as global dicts on startup, upvar allows us to access this dict on a higher level.
The user could potentially corrupt this entry by editing the file so either it will not be there, or it could not be set to a valid integer that we can do calculations with. So the first if/else checks if there is an entry in the genericdict before we start to use it, otherwise it would give an uncaught error so instead in this case it gets set to a default of 10. (This would also happen if the XML is updated but not the SQLite files) If the first is passed and an entry is found the 2nd if/else then checks if this is a valid integer (https://core.tcl-lang.org/tips/doc/trunk/tip/395.md) if it is not (![string is entier $ka_margin]) e.g. someone changed the entry to "true" misunderstanding the value, then it also gets set to a default of 10.

We can potentially compress this to use an && for the 2 statements as Tcl will short circuit if the first argument (exists) is not true so will not evaluate the 2nd (is entier - instead of is not entier) - however doing this you need to know Tcl does this - so as it stands is safer as if you reversed the 2 && arguments and the dict entry didn't exist but was evaluated 2nd it would give an uncaught error.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I understand now. I had misread the code.

I thought the else on line 1062 was for the if on line 1061, but it's actually for the if on line 1059.

Can we fix the indentation on lines 1062-1064 so that it is aligned properly with line 1059?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have updated the indentation. There is a package included with HammerDB called reformat_tcl. You can do "package require reformat_tcl" and then reformat_src indent filename, and it will update the file with the correct indentation. This should server as a prompt for me to use it to prevent less confusion going forward.

} else {
set ka_margin 10
}
foreach { key } [ dict keys $dbdict ] {
if { [ dict get $dbdict $key name ] eq $rdbms } {
set dictname config$key
Expand All @@ -1060,12 +1071,12 @@ proc keepalive {} {
set rampup_secs [expr {[ get_base_rampup [ set $dictname ]]*60}]
set duration_secs [expr {[ get_base_duration [ set $dictname ]] *60}]
foreach { val } [ list $rampup_secs $duration_secs ] {
if { ![string is integer -strict $val ] || $val < 60 } {
if { ![string is entier $val ] || ($val < 60 && $val != 0) } {
set ka_valid 0
}
}
if { $ka_valid } {
_runtimer [expr {$rampup_secs + $duration_secs + 10}]
_runtimer [expr {$rampup_secs + $duration_secs + $ka_margin}]
} else {
tk_messageBox -icon warning -message "Cannot detect rampup and duration times, keepalive for main thread not active"
}
Expand Down
1 change: 1 addition & 0 deletions src/generic/genws.tcl
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ proc .ed_mainFrame.buttons.datagen { args } { ; }
proc .ed_mainFrame.buttons.boxes { args } { ; }
proc .ed_mainFrame.buttons.test { args } { ; }
proc .ed_mainFrame.buttons.runworld { args } { ; }
proc .ed_mainFrame.buttons.delete { args } { ; }
proc ed_lvuser_button { args } { ; }
proc .ed_mainFrame.editbuttons.test { args } { ; }
proc .ed_mainFrame.editbuttons.distribute { args } { ; }
Expand Down