@@ -59,13 +59,21 @@ func (m *manager) restoreInstance(
5959 }
6060
6161 // 2b. Validate aggregate resource limits before allocating resources (if configured)
62+ reservedResources := false
6263 if m .resourceValidator != nil {
6364 needsGPU := stored .GPUProfile != ""
6465 totalMemory := stored .Size + stored .HotplugSize
65- if err := m .resourceValidator .ValidateAllocation (ctx , stored .Vcpus , totalMemory , stored .NetworkBandwidthDownload , stored .NetworkBandwidthUpload , stored .DiskIOBps , needsGPU ); err != nil {
66- log .ErrorContext (ctx , "resource validation failed for restore" , "instance_id" , id , "error" , err )
66+ diskBytes := storedDiskReservationBytes (stored )
67+ if err := m .resourceValidator .ReserveAllocation (ctx , id , stored .Vcpus , totalMemory , stored .NetworkBandwidthDownload , stored .NetworkBandwidthUpload , stored .DiskIOBps , diskBytes , needsGPU ); err != nil {
68+ log .ErrorContext (ctx , "resource reservation failed for restore" , "instance_id" , id , "error" , err )
6769 return nil , fmt .Errorf ("%w: %v" , ErrInsufficientResources , err )
6870 }
71+ reservedResources = true
72+ defer func () {
73+ if reservedResources {
74+ m .resourceValidator .FinishAllocation (id )
75+ }
76+ }()
6977 }
7078
7179 // 3. Get snapshot directory
@@ -253,6 +261,10 @@ func (m *manager) restoreInstance(
253261 return nil , fmt .Errorf ("resume vm failed: %w" , err )
254262 }
255263 resumeSpanEnd (nil )
264+ if reservedResources {
265+ m .resourceValidator .FinishAllocation (id )
266+ reservedResources = false
267+ }
256268
257269 // Forked standby restores may allocate a fresh identity while the guest memory snapshot
258270 // still has the source VM's old IP configuration. Reconfigure guest networking after
0 commit comments