Skip to content

Commit 674deb1

Browse files
Restore-DbaDbSnapshot - Add retry logic for deadlock errors (#9900)
2 parents a8c131a + 182ae09 commit 674deb1

File tree

1 file changed

+30
-6
lines changed

1 file changed

+30
-6
lines changed

public/Restore-DbaDbSnapshot.ps1

Lines changed: 30 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -166,14 +166,38 @@ function Restore-DbaDbSnapshot {
166166

167167
# Need a proper restore now
168168
if ($Pscmdlet.ShouldProcess($server, "Restore db $db from $snap")) {
169-
try {
170-
if ($Force) {
171-
$null = Stop-DbaProcess -SqlInstance $server -Database $db.Name, $snap.Name -WarningAction SilentlyContinue
169+
$maxRetries = 3
170+
$retryCount = 0
171+
$restoreSuccess = $false
172+
173+
while (-not $restoreSuccess -and $retryCount -lt $maxRetries) {
174+
try {
175+
if ($Force) {
176+
$null = Stop-DbaProcess -SqlInstance $server -Database $db.Name, $snap.Name -WarningAction SilentlyContinue
177+
}
178+
179+
$null = $server.Query("USE master; RESTORE DATABASE [$($db.Name)] FROM DATABASE_SNAPSHOT='$($snap.Name)'")
180+
$restoreSuccess = $true
181+
} catch {
182+
# Check if this is a deadlock error (error 1205)
183+
if ($_.Exception.InnerException.Number -eq 1205) {
184+
$retryCount++
185+
if ($retryCount -lt $maxRetries) {
186+
$waitSeconds = [Math]::Pow(2, $retryCount)
187+
Write-Message -Level Verbose -Message "Deadlock detected during restore of $db on $server. Retrying in $waitSeconds seconds (attempt $retryCount of $maxRetries)"
188+
Start-Sleep -Seconds $waitSeconds
189+
} else {
190+
Stop-Function -Message "Failiure attempting to restore $db on $server after $maxRetries attempts due to deadlock" -ErrorRecord $_ -Continue
191+
}
192+
} else {
193+
Stop-Function -Message "Failiure attempting to restore $db on $server" -ErrorRecord $_ -Continue
194+
break
195+
}
172196
}
197+
}
173198

174-
$null = $server.Query("USE master; RESTORE DATABASE [$($db.Name)] FROM DATABASE_SNAPSHOT='$($snap.Name)'")
175-
} catch {
176-
Stop-Function -Message "Failiure attempting to restore $db on $server" -ErrorRecord $_ -Continue
199+
if (-not $restoreSuccess) {
200+
continue
177201
}
178202
}
179203

0 commit comments

Comments
 (0)