@@ -233,37 +233,42 @@ func (c *Calcium) updateContainersResources(ctx context.Context, ch chan *types.
233
233
}
234
234
235
235
func (c * Calcium ) updateResource (ctx context.Context , node * types.Node , container * types.Container , newResource * enginetypes.VirtualizationResource ) error {
236
- updateResourceErr := node .Engine .VirtualizationUpdateResource (ctx , container .ID , newResource )
237
- if updateResourceErr == nil {
238
- oldVolumeSize := container .Volumes .TotalSize ()
239
- container .CPU = newResource .CPU
240
- container .Quota = newResource .Quota
241
- container .Memory = newResource .Memory
242
- container .Volumes , _ = types .MakeVolumeBindings (newResource .Volumes )
243
- container .VolumePlan = types .MustToVolumePlan (newResource .VolumePlan )
244
- container .Storage += container .Volumes .TotalSize () - oldVolumeSize
245
- } else {
246
- log .Errorf ("[updateResource] When Realloc container, VirtualizationUpdateResource %s failed %v" , container .ID , updateResourceErr )
247
- }
248
- // 成功失败都需要修改 node 的占用
249
- // 成功的话,node 占用为新资源
250
- // 失败的话,node 占用为老资源
251
- node .CPU .Sub (container .CPU )
252
- node .SetCPUUsed (container .Quota , types .IncrUsage )
253
- node .Volume .Sub (container .VolumePlan .IntoVolumeMap ())
254
- node .SetVolumeUsed (container .VolumePlan .IntoVolumeMap ().Total (), types .IncrUsage )
255
- node .StorageCap -= container .Storage
256
- node .MemCap -= container .Memory
257
- if nodeID := node .GetNUMANode (container .CPU ); nodeID != "" {
258
- node .DecrNUMANodeMemory (nodeID , container .Memory )
259
- }
260
- // 更新 container 元数据
261
- // since we don't rollback VirutalUpdateResource, client can't interrupt
262
- if err := c .store .UpdateContainer (context .Background (), container ); err != nil {
263
- log .Errorf ("[updateResource] Realloc finish but update container %s failed %v" , container .ID , err )
236
+ var updateErr error
237
+ if err := utils .Txn (
238
+ ctx ,
239
+ func (ctx context.Context ) error {
240
+ if updateErr = node .Engine .VirtualizationUpdateResource (ctx , container .ID , newResource ); updateErr == nil {
241
+ oldVolumeSize := container .Volumes .TotalSize ()
242
+ container .CPU = newResource .CPU
243
+ container .Quota = newResource .Quota
244
+ container .Memory = newResource .Memory
245
+ container .Volumes , _ = types .MakeVolumeBindings (newResource .Volumes )
246
+ container .VolumePlan = types .MustToVolumePlan (newResource .VolumePlan )
247
+ container .Storage += container .Volumes .TotalSize () - oldVolumeSize
248
+ }
249
+ return nil
250
+ },
251
+ func (ctx context.Context ) error {
252
+ // 成功失败都需要修改 node 的占用
253
+ // 成功的话,node 占用为新资源
254
+ // 失败的话,node 占用为老资源
255
+ node .CPU .Sub (container .CPU )
256
+ node .SetCPUUsed (container .Quota , types .IncrUsage )
257
+ node .Volume .Sub (container .VolumePlan .IntoVolumeMap ())
258
+ node .SetVolumeUsed (container .VolumePlan .IntoVolumeMap ().Total (), types .IncrUsage )
259
+ node .StorageCap -= container .Storage
260
+ node .MemCap -= container .Memory
261
+ if nodeID := node .GetNUMANode (container .CPU ); nodeID != "" {
262
+ node .DecrNUMANodeMemory (nodeID , container .Memory )
263
+ }
264
+ return c .store .UpdateContainer (ctx , container )
265
+ },
266
+ nil ,
267
+ c .config .GlobalTimeout ,
268
+ ); err != nil {
264
269
return err
265
270
}
266
- return updateResourceErr
271
+ return updateErr
267
272
}
268
273
269
274
func (c * Calcium ) reallocVolume (node * types.Node , containers []* types.Container , vbs types.VolumeBindings ) (plans map [* types.Container ]types.VolumePlan , err error ) {
0 commit comments