Merge pull request #818 from yuslepukhin/improve_test_concurrency

Improve concurrency when running tests
This commit is contained in:
Islam AbdelRahman 2015-11-05 17:21:34 -08:00
commit e89e5b253c

View File

@ -8,7 +8,10 @@ Param(
[string]$WorkFolder = "", # Direct tests to use that folder [string]$WorkFolder = "", # Direct tests to use that folder
[int]$Limit = -1, # -1 means run all otherwise limit for testing purposes [int]$Limit = -1, # -1 means run all otherwise limit for testing purposes
[string]$Exclude = "", # Expect a comma separated list, no spaces [string]$Exclude = "", # Expect a comma separated list, no spaces
[string]$Run = "db_test" # Run db_test|tests [string]$Run = "db_test", # Run db_test|tests
# Number of async tasks that would run concurrently. Recommend a number below 64.
# However, CPU utlization really depends on the storage media. Recommend ram based disk.
[int]$Concurrency = 62
) )
# Folders and commands must be fullpath to run assuming # Folders and commands must be fullpath to run assuming
@ -122,10 +125,17 @@ function Normalize-DbTests($HashTable) {
function Discover-TestBinaries($HashTable) { function Discover-TestBinaries($HashTable) {
$Exclusions = @("db_test*", "db_sanity_test*") $Exclusions = @("db_test*", "db_sanity_test*")
$p = -join ($BinariesFolder, "*_test*.exe") if($EnableJE) {
$p = -join ($BinariesFolder, "*_test_je.exe")
} else {
$p = -join ($BinariesFolder, "*_test.exe")
}
dir -Path $p -Exclude $Exclusions | ForEach-Object { dir -Path $p -Exclude $Exclusions | ForEach-Object {
$t = ($_.Name) -replace '.exe$', '' $t = ($_.Name) -replace '.exe$', ''
if($ExcludeTests.Contains($t)) {
continue
}
$test_log = -join ($t, ".log") $test_log = -join ($t, ".log")
$HashTable.Add($t, $test_log) $HashTable.Add($t, $test_log)
} }
@ -137,6 +147,9 @@ if($Run -ceq "db_test") {
Normalize-DbTests -HashTable $TestToLog Normalize-DbTests -HashTable $TestToLog
} elseif($Run -ceq "tests") { } elseif($Run -ceq "tests") {
Discover-TestBinaries -HashTable $TestToLog Discover-TestBinaries -HashTable $TestToLog
} else {
Write-Warning "Invalid -Run option value"
exit 2
} }
@ -159,40 +172,48 @@ $JobToLog = @{}
# Test limiting factor here # Test limiting factor here
$count = 0 $count = 0
ForEach($k in $TestToLog.keys) {
Write-Host "Starting $k"
$log_path = -join ($LogFolder, ($TestToLog.$k))
if($Run -ceq "db_test") {
$job = Start-Job -Name $k -ScriptBlock $InvokeTestCase -ArgumentList @($db_test,$k,$log_path)
} else {
[string]$Exe = -Join ($BinariesFolder, $k)
$job = Start-Job -Name $k -ScriptBlock $InvokeTestAsync -ArgumentList @($exe,$log_path)
}
$JobToLog.Add($job, $log_path)
# Limiting trial runs
if(($Limit -gt 0) -and (++$count -ge $Limit)) {
break
}
}
[bool]$success = $true; [bool]$success = $true;
# Wait for all to finish and get the results # Wait for all to finish and get the results
while($JobToLog.Count -gt 0) { while(($JobToLog.Count -gt 0) -or
($TestToLog.Count -gt 0)) {
# Make sure we have maximum concurrent jobs running if anything
# and the $Limit either not set or allows to proceed
while(($JobToLog.Count -lt $Concurrency) -and
(($TestToLog.Count -gt 0) -and
(($Limit -lt 0) -or ($count -lt $Limit)))) {
# We only need the first key
foreach($key in $TestToLog.keys) {
$k = $key
break
}
Write-Host "Starting $k"
$log_path = -join ($LogFolder, ($TestToLog.$k))
if($Run -ceq "db_test") {
$job = Start-Job -Name $k -ScriptBlock $InvokeTestCase -ArgumentList @($db_test,$k,$log_path)
} else {
[string]$Exe = -Join ($BinariesFolder, $k)
$job = Start-Job -Name $k -ScriptBlock $InvokeTestAsync -ArgumentList @($exe,$log_path)
}
$JobToLog.Add($job, $log_path)
$TestToLog.Remove($k)
++$count
}
if($JobToLog.Count -lt 1) {
break
}
$jobs = @() $jobs = @()
foreach($k in $JobToLog.Keys) { $jobs += $k } foreach($k in $JobToLog.Keys) { $jobs += $k }
<#
if(!$success) {
break
}
#>
$completed = Wait-Job -Job $jobs -Any $completed = Wait-Job -Job $jobs -Any
$log = $JobToLog[$completed] $log = $JobToLog[$completed]
$JobToLog.Remove($completed) $JobToLog.Remove($completed)