@@ -16,94 +16,98 @@ import (
16
16
// ReallocResource updates workload resource dynamically
17
17
func (c * Calcium ) ReallocResource (ctx context.Context , opts * types.ReallocOptions ) (err error ) {
18
18
logger := log .WithField ("Calcium" , "ReallocResource" ).WithField ("opts" , opts )
19
- return c .withWorkloadLocked (ctx , opts .ID , func (ctx context.Context , workload * types.Workload ) error {
20
- rrs , err := resources .MakeRequests (
21
- types.ResourceOptions {
22
- CPUQuotaRequest : utils .Round (workload .CPUQuotaRequest + opts .ResourceOpts .CPUQuotaRequest ),
23
- CPUQuotaLimit : utils .Round (workload .CPUQuotaLimit + opts .ResourceOpts .CPUQuotaLimit ),
24
- CPUBind : types .ParseTriOption (opts .CPUBindOpts , len (workload .CPU ) > 0 ),
25
- CPU : workload .CPU ,
26
- MemoryRequest : workload .MemoryRequest + opts .ResourceOpts .MemoryRequest ,
27
- MemoryLimit : workload .MemoryLimit + opts .ResourceOpts .MemoryLimit ,
28
- StorageRequest : workload .StorageRequest + opts .ResourceOpts .StorageRequest ,
29
- StorageLimit : workload .StorageLimit + opts .ResourceOpts .StorageLimit ,
30
- VolumeRequest : types .MergeVolumeBindings (workload .VolumeRequest , opts .ResourceOpts .VolumeRequest ),
31
- VolumeLimit : types .MergeVolumeBindings (workload .VolumeLimit , opts .ResourceOpts .VolumeLimit ),
32
- VolumeExist : workload .VolumePlanRequest ,
33
- },
34
- )
35
- if err != nil {
36
- return logger .Err (ctx , err )
37
- }
38
- return logger .Err (ctx , c .doReallocOnNode (ctx , workload .Nodename , workload , rrs ))
19
+ workload , err := c .GetWorkload (ctx , opts .ID )
20
+ if err != nil {
21
+ return
22
+ }
23
+ return c .withNodeLocked (ctx , workload .Nodename , func (ctx context.Context , node * types.Node ) error {
24
+ return c .withWorkloadLocked (ctx , opts .ID , func (ctx context.Context , workload * types.Workload ) error {
25
+ rrs , err := resources .MakeRequests (
26
+ types.ResourceOptions {
27
+ CPUQuotaRequest : utils .Round (workload .CPUQuotaRequest + opts .ResourceOpts .CPUQuotaRequest ),
28
+ CPUQuotaLimit : utils .Round (workload .CPUQuotaLimit + opts .ResourceOpts .CPUQuotaLimit ),
29
+ CPUBind : types .ParseTriOption (opts .CPUBindOpts , len (workload .CPU ) > 0 ),
30
+ CPU : workload .CPU ,
31
+ MemoryRequest : workload .MemoryRequest + opts .ResourceOpts .MemoryRequest ,
32
+ MemoryLimit : workload .MemoryLimit + opts .ResourceOpts .MemoryLimit ,
33
+ StorageRequest : workload .StorageRequest + opts .ResourceOpts .StorageRequest ,
34
+ StorageLimit : workload .StorageLimit + opts .ResourceOpts .StorageLimit ,
35
+ VolumeRequest : types .MergeVolumeBindings (workload .VolumeRequest , opts .ResourceOpts .VolumeRequest ),
36
+ VolumeLimit : types .MergeVolumeBindings (workload .VolumeLimit , opts .ResourceOpts .VolumeLimit ),
37
+ VolumeExist : workload .VolumePlanRequest ,
38
+ },
39
+ )
40
+ if err != nil {
41
+ return logger .Err (ctx , err )
42
+ }
43
+ return logger .Err (ctx , c .doReallocOnNode (ctx , node , workload , rrs ))
44
+ })
39
45
})
40
46
}
41
47
42
48
// transaction: node resource
43
- func (c * Calcium ) doReallocOnNode (ctx context.Context , nodename string , workload * types.Workload , rrs resourcetypes.ResourceRequests ) error {
44
- return c .withNodeLocked (ctx , nodename , func (ctx context.Context , node * types.Node ) (err error ) {
45
- node .RecycleResources (& workload .ResourceMeta )
46
- plans , err := resources .SelectNodesByResourceRequests (ctx , rrs , map [string ]* types.Node {node .Name : node })
47
- if err != nil {
48
- return err
49
- }
49
+ func (c * Calcium ) doReallocOnNode (ctx context.Context , node * types.Node , workload * types.Workload , rrs resourcetypes.ResourceRequests ) (err error ) {
50
+ node .RecycleResources (& workload .ResourceMeta )
51
+ plans , err := resources .SelectNodesByResourceRequests (ctx , rrs , map [string ]* types.Node {node .Name : node })
52
+ if err != nil {
53
+ return err
54
+ }
50
55
51
- originalWorkload := * workload
52
- resourceMeta := & types.ResourceMeta {}
53
- if err = utils .Txn (
54
- ctx ,
56
+ originalWorkload := * workload
57
+ resourceMeta := & types.ResourceMeta {}
58
+ if err = utils .Txn (
59
+ ctx ,
55
60
56
- // if update workload resources
57
- func (ctx context.Context ) (err error ) {
58
- resourceMeta := & types.ResourceMeta {}
59
- for _ , plan := range plans {
60
- if resourceMeta , err = plan .Dispense (resourcetypes.DispenseOptions {
61
- Node : node ,
62
- }, resourceMeta ); err != nil {
63
- return err
64
- }
61
+ // if update workload resources
62
+ func (ctx context.Context ) (err error ) {
63
+ resourceMeta := & types.ResourceMeta {}
64
+ for _ , plan := range plans {
65
+ if resourceMeta , err = plan .Dispense (resourcetypes.DispenseOptions {
66
+ Node : node ,
67
+ }, resourceMeta ); err != nil {
68
+ return err
65
69
}
70
+ }
66
71
67
- return c .doReallocWorkloadsOnInstance (ctx , node .Engine , resourceMeta , workload )
68
- },
69
- // then commit changes
70
- func (ctx context.Context ) error {
71
- for _ , plan := range plans {
72
- plan .ApplyChangesOnNode (node , 0 )
73
- }
74
- return errors .WithStack (c .store .UpdateNodes (ctx , node ))
75
- },
76
- // no need rollback
77
- func (ctx context.Context , failureByCond bool ) (err error ) {
78
- if failureByCond {
79
- return
80
- }
81
- r := & types.ResourceMeta {
82
- CPUQuotaRequest : originalWorkload .CPUQuotaRequest ,
83
- CPUQuotaLimit : originalWorkload .CPUQuotaLimit ,
84
- CPU : originalWorkload .CPU ,
85
- NUMANode : originalWorkload .NUMANode ,
86
- MemoryRequest : originalWorkload .MemoryRequest ,
87
- MemoryLimit : originalWorkload .MemoryLimit ,
88
- VolumeRequest : originalWorkload .VolumeRequest ,
89
- VolumeLimit : originalWorkload .VolumeLimit ,
90
- VolumePlanRequest : originalWorkload .VolumePlanRequest ,
91
- VolumePlanLimit : originalWorkload .VolumePlanLimit ,
92
- VolumeChanged : resourceMeta .VolumeChanged ,
93
- StorageRequest : originalWorkload .StorageRequest ,
94
- StorageLimit : originalWorkload .StorageLimit ,
95
- }
96
- return c .doReallocWorkloadsOnInstance (ctx , node .Engine , r , workload )
97
- },
72
+ return c .doReallocWorkloadsOnInstance (ctx , node .Engine , resourceMeta , workload )
73
+ },
74
+ // then commit changes
75
+ func (ctx context.Context ) error {
76
+ for _ , plan := range plans {
77
+ plan .ApplyChangesOnNode (node , 0 )
78
+ }
79
+ return errors .WithStack (c .store .UpdateNodes (ctx , node ))
80
+ },
81
+ // no need rollback
82
+ func (ctx context.Context , failureByCond bool ) (err error ) {
83
+ if failureByCond {
84
+ return
85
+ }
86
+ r := & types.ResourceMeta {
87
+ CPUQuotaRequest : originalWorkload .CPUQuotaRequest ,
88
+ CPUQuotaLimit : originalWorkload .CPUQuotaLimit ,
89
+ CPU : originalWorkload .CPU ,
90
+ NUMANode : originalWorkload .NUMANode ,
91
+ MemoryRequest : originalWorkload .MemoryRequest ,
92
+ MemoryLimit : originalWorkload .MemoryLimit ,
93
+ VolumeRequest : originalWorkload .VolumeRequest ,
94
+ VolumeLimit : originalWorkload .VolumeLimit ,
95
+ VolumePlanRequest : originalWorkload .VolumePlanRequest ,
96
+ VolumePlanLimit : originalWorkload .VolumePlanLimit ,
97
+ VolumeChanged : resourceMeta .VolumeChanged ,
98
+ StorageRequest : originalWorkload .StorageRequest ,
99
+ StorageLimit : originalWorkload .StorageLimit ,
100
+ }
101
+ return c .doReallocWorkloadsOnInstance (ctx , node .Engine , r , workload )
102
+ },
98
103
99
- c .config .GlobalTimeout ,
100
- ); err != nil {
101
- return
102
- }
104
+ c .config .GlobalTimeout ,
105
+ ); err != nil {
106
+ return
107
+ }
103
108
104
- c .doRemapResourceAndLog (ctx , log .WithField ("Calcium" , "doReallocOnNode" ), node )
105
- return nil
106
- })
109
+ c .doRemapResourceAndLog (ctx , log .WithField ("Calcium" , "doReallocOnNode" ), node )
110
+ return nil
107
111
}
108
112
109
113
func (c * Calcium ) doReallocWorkloadsOnInstance (ctx context.Context , engine engine.API , resourceMeta * types.ResourceMeta , workload * types.Workload ) (err error ) {
0 commit comments