@@ -29,7 +29,7 @@ func (c *Calcium) PodResource(ctx context.Context, podname string) (*types.PodRe
29
29
Details : map [string ]string {},
30
30
}
31
31
for _ , node := range nodes {
32
- nodeDetail , err := c .doGetNodeResource (ctx , node )
32
+ nodeDetail , err := c .doGetNodeResource (ctx , node . Name , false )
33
33
if err != nil {
34
34
return nil , err
35
35
}
@@ -43,18 +43,13 @@ func (c *Calcium) PodResource(ctx context.Context, podname string) (*types.PodRe
43
43
}
44
44
45
45
// NodeResource check node's container and resource
46
- func (c * Calcium ) NodeResource (ctx context.Context , nodename string ) (* types.NodeResource , error ) {
47
- node , err := c .GetNode (ctx , nodename )
48
- if err != nil {
49
- return nil , err
50
- }
51
- nr , err := c .doGetNodeResource (ctx , node )
46
+ func (c * Calcium ) NodeResource (ctx context.Context , nodename string , fix bool ) (* types.NodeResource , error ) {
47
+ nr , err := c .doGetNodeResource (ctx , nodename , fix )
52
48
if err != nil {
53
49
return nil , err
54
50
}
55
51
for _ , container := range nr .Containers {
56
- _ , err := container .Inspect (ctx ) // 用于探测节点上容器是否存在
57
- if err != nil {
52
+ if _ , err := container .Inspect (ctx ); err != nil { // 用于探测节点上容器是否存在
58
53
nr .Verification = false
59
54
nr .Details = append (nr .Details , fmt .Sprintf ("container %s inspect failed %v \n " , container .ID , err ))
60
55
continue
@@ -63,65 +58,99 @@ func (c *Calcium) NodeResource(ctx context.Context, nodename string) (*types.Nod
63
58
return nr , err
64
59
}
65
60
66
- func (c * Calcium ) doGetNodeResource (ctx context.Context , node * types.Node ) (* types.NodeResource , error ) {
67
- containers , err := c .ListNodeContainers (ctx , node .Name , nil )
68
- if err != nil {
69
- return nil , err
70
- }
71
- nr := & types.NodeResource {
72
- Name : node .Name , CPU : node .CPU , MemCap : node .MemCap , StorageCap : node .StorageCap ,
73
- Containers : containers , Verification : true , Details : []string {},
74
- }
75
- cpus := 0.0
76
- memory := int64 (0 )
77
- storage := int64 (0 )
78
- cpumap := types.CPUMap {}
79
- for _ , container := range containers {
80
- cpus = utils .Round (cpus + container .Quota )
81
- memory += container .Memory
82
- storage += container .Storage
83
- cpumap .Add (container .CPU )
84
- }
85
- nr .CPUPercent = cpus / float64 (len (node .InitCPU ))
86
- nr .MemoryPercent = float64 (memory ) / float64 (node .InitMemCap )
87
- nr .NUMAMemoryPercent = map [string ]float64 {}
88
- nr .VolumePercent = float64 (node .VolumeUsed ) / float64 (node .InitVolume .Total ())
89
- for nodeID , nmemory := range node .NUMAMemory {
90
- if initMemory , ok := node .InitNUMAMemory [nodeID ]; ok {
91
- nr .NUMAMemoryPercent [nodeID ] = float64 (nmemory ) / float64 (initMemory )
61
+ func (c * Calcium ) doGetNodeResource (ctx context.Context , nodename string , fix bool ) (* types.NodeResource , error ) {
62
+ var nr * types.NodeResource
63
+ return nr , c .withNodeLocked (ctx , nodename , func (node * types.Node ) error {
64
+ containers , err := c .ListNodeContainers (ctx , node .Name , nil )
65
+ if err != nil {
66
+ return err
92
67
}
93
- }
94
- if cpus != node .CPUUsed {
95
- nr .Verification = false
96
- nr .Details = append (nr .Details , fmt .Sprintf ("cpus used record: %f but now: %f" , node .CPUUsed , cpus ))
97
- }
98
- node .CPU .Add (cpumap )
99
- for i , v := range node .CPU {
100
- if node .InitCPU [i ] != v {
101
- nr .Verification = false
102
- nr .Details = append (nr .Details , fmt .Sprintf ("cpu %s now %d" , i , v ))
68
+ nr = & types.NodeResource {
69
+ Name : node .Name , CPU : node .CPU , MemCap : node .MemCap , StorageCap : node .StorageCap ,
70
+ Containers : containers , Verification : true , Details : []string {},
103
71
}
104
- }
105
72
106
- if memory + node .MemCap != node .InitMemCap {
107
- nr .Verification = false
108
- nr .Details = append (nr .Details , fmt .Sprintf ("memory now %d" , node .InitMemCap - (memory + node .MemCap )))
109
- }
73
+ cpus := 0.0
74
+ memory := int64 (0 )
75
+ storage := int64 (0 )
76
+ cpumap := types.CPUMap {}
77
+ for _ , container := range containers {
78
+ cpus = utils .Round (cpus + container .Quota )
79
+ memory += container .Memory
80
+ storage += container .Storage
81
+ cpumap .Add (container .CPU )
82
+ }
83
+ nr .CPUPercent = cpus / float64 (len (node .InitCPU ))
84
+ nr .MemoryPercent = float64 (memory ) / float64 (node .InitMemCap )
85
+ nr .NUMAMemoryPercent = map [string ]float64 {}
86
+ nr .VolumePercent = float64 (node .VolumeUsed ) / float64 (node .InitVolume .Total ())
87
+ for nodeID , nmemory := range node .NUMAMemory {
88
+ if initMemory , ok := node .InitNUMAMemory [nodeID ]; ok {
89
+ nr .NUMAMemoryPercent [nodeID ] = float64 (nmemory ) / float64 (initMemory )
90
+ }
91
+ }
92
+ if cpus != node .CPUUsed {
93
+ nr .Verification = false
94
+ nr .Details = append (nr .Details , fmt .Sprintf ("cpus used: %f diff: %f" , node .CPUUsed , cpus ))
95
+ }
96
+ node .CPU .Add (cpumap )
97
+ for i , v := range node .CPU {
98
+ if node .InitCPU [i ] != v {
99
+ nr .Verification = false
100
+ nr .Details = append (nr .Details , fmt .Sprintf ("cpu %s diff %d" , i , node .InitCPU [i ]- v ))
101
+ }
102
+ }
110
103
111
- nr .StoragePercent = 0
112
- if node .InitStorageCap != 0 {
113
- nr .StoragePercent = float64 (storage ) / float64 (node .InitStorageCap )
114
- if storage + node .StorageCap != node .InitStorageCap {
104
+ if memory + node .MemCap != node .InitMemCap {
115
105
nr .Verification = false
116
- nr .Details = append (nr .Details , fmt .Sprintf ("storage now %d" , node .InitStorageCap - ( storage + node .StorageCap )))
106
+ nr .Details = append (nr .Details , fmt .Sprintf ("memory used: %d, diff %d " , node .MemCap , node . InitMemCap - ( memory + node .MemCap )))
117
107
}
118
- }
119
108
120
- if err := node .Engine .ResourceValidate (ctx , cpus , cpumap , memory , storage ); err != nil {
121
- nr .Details = append (nr .Details , err .Error ())
122
- }
109
+ nr .StoragePercent = 0
110
+ if node .InitStorageCap != 0 {
111
+ nr .StoragePercent = float64 (storage ) / float64 (node .InitStorageCap )
112
+ if storage + node .StorageCap != node .InitStorageCap {
113
+ nr .Verification = false
114
+ nr .Details = append (nr .Details , fmt .Sprintf ("storage used: %d, diff %d" , node .StorageCap , node .InitStorageCap - (storage + node .StorageCap )))
115
+ }
116
+ }
117
+
118
+ if err := node .Engine .ResourceValidate (ctx , cpus , cpumap , memory , storage ); err != nil {
119
+ nr .Details = append (nr .Details , err .Error ())
120
+ }
123
121
124
- return nr , nil
122
+ if fix {
123
+ if err := c .doFixDiffResource (ctx , node , cpus , memory , storage ); err != nil {
124
+ log .Warnf ("[doGetNodeResource] fix node resource failed %v" , err )
125
+ }
126
+ }
127
+
128
+ return nil
129
+ })
130
+ }
131
+
132
+ func (c * Calcium ) doFixDiffResource (ctx context.Context , node * types.Node , cpus float64 , memory , storage int64 ) error {
133
+ var n * types.Node
134
+ var err error
135
+ return utils .Txn (ctx ,
136
+ func (ctx context.Context ) error {
137
+ if n , err = c .GetNode (ctx , node .Name ); err != nil {
138
+ return err
139
+ }
140
+ n .CPUUsed = cpus
141
+ for i , v := range node .CPU {
142
+ n .CPU [i ] += node .InitCPU [i ] - v
143
+ }
144
+ n .MemCap += node .InitMemCap - (memory + node .MemCap )
145
+ n .StorageCap += node .InitStorageCap - (storage + node .StorageCap )
146
+ return nil
147
+ },
148
+ func (ctx context.Context ) error {
149
+ return c .store .UpdateNode (ctx , n )
150
+ },
151
+ nil ,
152
+ c .config .GlobalTimeout ,
153
+ )
125
154
}
126
155
127
156
func (c * Calcium ) doAllocResource (ctx context.Context , opts * types.DeployOptions ) ([]types.NodeInfo , error ) {
0 commit comments