|
|
@@ -9,9 +9,16 @@ param(
|
|
|
# Maximum number of jobs to run in parallel
|
|
|
$MaxParallelJobs = 6
|
|
|
|
|
|
+# Max number of retries
|
|
|
+$MaxRetry = 5
|
|
|
+
|
|
|
# Wait time between check for system load
|
|
|
$SecondsBetweenLoadChecks = 10
|
|
|
|
|
|
+# Set error codes
|
|
|
+Set-Variable -Name "ERROR_BADEXTRACT" -Option Constant -Value -1
|
|
|
+Set-Variable -Name "ERROR_FILEDOESNOTEXIST" -Option Constant -Value -2
|
|
|
+
|
|
|
$CountMissingSymbols = {
|
|
|
param(
|
|
|
[string] $PackagePath # Path to a NuGet package
|
|
|
@@ -21,10 +28,15 @@ $CountMissingSymbols = {
|
|
|
|
|
|
Add-Type -AssemblyName System.IO.Compression.FileSystem
|
|
|
|
|
|
+ Write-Host "Validating $PackagePath "
|
|
|
+
|
|
|
# Ensure input file exist
|
|
|
if (!(Test-Path $PackagePath)) {
|
|
|
Write-PipelineTaskError "Input file does not exist: $PackagePath"
|
|
|
- return -2
|
|
|
+ return [pscustomobject]@{
|
|
|
+ result = $using:ERROR_FILEDOESNOTEXIST
|
|
|
+ packagePath = $PackagePath
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
# Extensions for which we'll look for symbols
|
|
|
@@ -45,7 +57,7 @@ $CountMissingSymbols = {
|
|
|
Write-Host "Something went wrong extracting $PackagePath"
|
|
|
Write-Host $_
|
|
|
return [pscustomobject]@{
|
|
|
- result = -1
|
|
|
+ result = $using:ERROR_BADEXTRACT
|
|
|
packagePath = $PackagePath
|
|
|
}
|
|
|
}
|
|
|
@@ -91,26 +103,37 @@ $CountMissingSymbols = {
|
|
|
$dotnetSymbolExe = "$env:USERPROFILE\.dotnet\tools"
|
|
|
$dotnetSymbolExe = Resolve-Path "$dotnetSymbolExe\dotnet-symbol.exe"
|
|
|
|
|
|
- & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath | Out-Null
|
|
|
+ $totalRetries = 0
|
|
|
|
|
|
- if (Test-Path $PdbPath) {
|
|
|
- return 'PDB'
|
|
|
- }
|
|
|
- elseif (Test-Path $NGenPdb) {
|
|
|
- return 'NGen PDB'
|
|
|
- }
|
|
|
- elseif (Test-Path $SODbg) {
|
|
|
- return 'DBG for SO'
|
|
|
- }
|
|
|
- elseif (Test-Path $DylibDwarf) {
|
|
|
- return 'Dwarf for Dylib'
|
|
|
- }
|
|
|
- elseif (Test-Path $SymbolPath) {
|
|
|
- return 'Module'
|
|
|
- }
|
|
|
- else {
|
|
|
- return $null
|
|
|
+ while ($totalRetries -lt $using:MaxRetry) {
|
|
|
+ # Save the output and get diagnostic output
|
|
|
+ $output = & $dotnetSymbolExe --symbols --modules --windows-pdbs $TargetServerParam $FullPath -o $SymbolsPath --diagnostics | Out-String
|
|
|
+
|
|
|
+ if (Test-Path $PdbPath) {
|
|
|
+ return 'PDB'
|
|
|
+ }
|
|
|
+ elseif (Test-Path $NGenPdb) {
|
|
|
+ return 'NGen PDB'
|
|
|
+ }
|
|
|
+ elseif (Test-Path $SODbg) {
|
|
|
+ return 'DBG for SO'
|
|
|
+ }
|
|
|
+ elseif (Test-Path $DylibDwarf) {
|
|
|
+ return 'Dwarf for Dylib'
|
|
|
+ }
|
|
|
+ elseif (Test-Path $SymbolPath) {
|
|
|
+ return 'Module'
|
|
|
+ }
|
|
|
+ elseif ($output.Contains("503 Service Unavailable")) {
|
|
|
+ # If we got a 503 error, we should retry.
|
|
|
+ $totalRetries++
|
|
|
+ }
|
|
|
+ else {
|
|
|
+ return $null
|
|
|
+ }
|
|
|
}
|
|
|
+
|
|
|
+ return $null
|
|
|
}
|
|
|
|
|
|
$SymbolsOnMSDL = & $FirstMatchingSymbolDescriptionOrDefault $FileName '--microsoft-symbol-server' $SymbolsPath
|
|
|
@@ -155,14 +178,21 @@ function CheckJobResult(
|
|
|
$packagePath,
|
|
|
[ref]$DupedSymbols,
|
|
|
[ref]$TotalFailures) {
|
|
|
- if ($result -eq '-1') {
|
|
|
+ if ($result -eq $ERROR_BADEXTRACT) {
|
|
|
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath has duplicated symbol files"
|
|
|
$DupedSymbols.Value++
|
|
|
}
|
|
|
- elseif ($jobResult.result -ne '0') {
|
|
|
+ elseif ($result -eq $ERROR_FILEDOESNOTEXIST) {
|
|
|
+ Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "$packagePath does not exist"
|
|
|
+ $TotalFailures.Value++
|
|
|
+ }
|
|
|
+ elseif ($result -gt '0') {
|
|
|
Write-PipelineTelemetryError -Category 'CheckSymbols' -Message "Missing symbols for $result modules in the package $packagePath"
|
|
|
$TotalFailures.Value++
|
|
|
}
|
|
|
+ else {
|
|
|
+ Write-Host "All symbols verified for package $packagePath"
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
function CheckSymbolsAvailable {
|
|
|
@@ -192,8 +222,6 @@ function CheckSymbolsAvailable {
|
|
|
return
|
|
|
}
|
|
|
|
|
|
- Write-Host "Validating $FileName "
|
|
|
-
|
|
|
Start-Job -ScriptBlock $CountMissingSymbols -ArgumentList $FullName | Out-Null
|
|
|
|
|
|
$NumJobs = @(Get-Job -State 'Running').Count
|