From 06d2df1b1f3ec9be4fb9d54633930b9b78788022 Mon Sep 17 00:00:00 2001 From: oliver Date: Mon, 12 Oct 2026 17:20:12 +0800 Subject: [PATCH] Retry interrupted PostgreSQL release downloads --- packaging/download_postgres.ps1 | 27 ++++++++++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/packaging/download_postgres.ps1 b/packaging/download_postgres.ps1 index 6398fd1..0a0fe29 100644 --- a/packaging/download_postgres.ps1 +++ b/packaging/download_postgres.ps1 @@ -12,6 +12,7 @@ $url = "https://get.enterprisedb.com/postgresql/postgresql-$ver-windows-x64-bina $cache = if ($OutDir) { $OutDir } else { Join-Path $PSScriptRoot "cache" } $zipPath = Join-Path $cache "postgresql-$ver-windows-x64-binaries.zip" +$partialPath = "$zipPath.partial" $extractRoot = Join-Path $cache "pgsql-$ver" $destPgsql = Join-Path $PSScriptRoot "postgres\pgsql" @@ -22,7 +23,31 @@ if (-not (Test-Path $cache)) { Write-Host "==> PostgreSQL binaries URL: $url" if (-not (Test-Path $zipPath)) { Write-Host "==> Downloading (large; may take several minutes)..." - Invoke-WebRequest -Uri $url -OutFile $zipPath -UseBasicParsing + $curl = Get-Command curl.exe -ErrorAction SilentlyContinue + if ($curl) { + # PostgreSQL's archive is several hundred MB. Resume interrupted transfers + # instead of restarting the entire download when the CDN drops a connection. + & $curl.Source --fail --location --retry 8 --retry-all-errors --retry-delay 3 ` + --connect-timeout 30 --continue-at - --output $partialPath $url + if ($LASTEXITCODE -ne 0) { + throw "postgres_download_failed: curl exit $LASTEXITCODE (partial file kept at $partialPath)" + } + Move-Item -LiteralPath $partialPath -Destination $zipPath -Force + } else { + # Fallback for environments without curl; retry from scratch on transient errors. + $downloaded = $false + for ($attempt = 1; $attempt -le 3 -and -not $downloaded; $attempt++) { + try { + Invoke-WebRequest -Uri $url -OutFile $partialPath -UseBasicParsing + Move-Item -LiteralPath $partialPath -Destination $zipPath -Force + $downloaded = $true + } catch { + if ($attempt -eq 3) { throw } + Remove-Item -LiteralPath $partialPath -Force -ErrorAction SilentlyContinue + Start-Sleep -Seconds (5 * $attempt) + } + } + } } else { Write-Host "==> Using cached zip: $zipPath" }