@@ -66,6 +66,7 @@ func (s *PermitState) Clone() framework.StateData {
66
66
type Manager interface {
67
67
PreFilter (context.Context , * corev1.Pod ) error
68
68
Permit (context.Context , * framework.CycleState , * corev1.Pod ) Status
69
+ Reserve (context.Context , * corev1.Pod )
69
70
Unreserve (context.Context , * corev1.Pod )
70
71
GetPodGroup (context.Context , * corev1.Pod ) (string , * v1alpha1.PodGroup )
71
72
GetAssignedPodCount (string ) int
@@ -95,7 +96,7 @@ type PodGroupManager struct {
95
96
sync.RWMutex
96
97
}
97
98
98
- func AddPodFactory (pgMgr * PodGroupManager ) func (obj interface {}) {
99
+ func AddPodFactory (ctx context. Context , pgMgr * PodGroupManager ) func (obj interface {}) {
99
100
return func (obj interface {}) {
100
101
p , ok := obj .(* corev1.Pod )
101
102
if ! ok {
@@ -104,22 +105,52 @@ func AddPodFactory(pgMgr *PodGroupManager) func(obj interface{}) {
104
105
if p .Spec .NodeName == "" {
105
106
return
106
107
}
107
- pgFullName , _ := pgMgr .GetPodGroup (context .Background (), p )
108
- if pgFullName == "" {
108
+ pgMgr .Reserve (ctx , p )
109
+ }
110
+ }
111
+
112
+ func UpdatePodFactory (ctx context.Context , pgMgr * PodGroupManager ) func (oldObj interface {}, newObj interface {}) {
113
+ return func (oldObj interface {}, newObj interface {}) {
114
+ oldPod , ok := oldObj .(* corev1.Pod )
115
+ if ! ok {
109
116
return
110
117
}
111
- pgMgr .RWMutex .Lock ()
112
- defer pgMgr .RWMutex .Unlock ()
113
- if assigned , exist := pgMgr .assignedPodsByPG [pgFullName ]; exist {
114
- assigned .Insert (p .Name )
115
- } else {
116
- pgMgr .assignedPodsByPG [pgFullName ] = sets .New (p .Name )
118
+ newPod , ok := newObj .(* corev1.Pod )
119
+ if ! ok {
120
+ return
121
+ }
122
+ // If the pod is assumed or bound, it should be reserved.
123
+ if oldPod .Spec .NodeName == "" && newPod .Spec .NodeName != "" {
124
+ pgMgr .Reserve (ctx , newPod )
125
+ }
126
+ }
127
+ }
128
+
129
+ func DelPodFactory (ctx context.Context , pgMgr * PodGroupManager ) func (obj interface {}) {
130
+ return func (obj interface {}) {
131
+ var pod * corev1.Pod
132
+ switch t := obj .(type ) {
133
+ case * corev1.Pod :
134
+ pod = t
135
+ case cache.DeletedFinalStateUnknown :
136
+ var ok bool
137
+ if pod , ok = t .Obj .(* corev1.Pod ); ! ok {
138
+ return
139
+ }
140
+ default :
141
+ return
142
+ }
143
+ if pod .Spec .NodeName == "" {
144
+ return
117
145
}
146
+ pgMgr .Unreserve (ctx , pod )
118
147
}
119
148
}
120
149
121
150
// NewPodGroupManager creates a new operation object.
122
- func NewPodGroupManager (client client.Client , snapshotSharedLister framework.SharedLister , scheduleTimeout * time.Duration , podInformer informerv1.PodInformer ) * PodGroupManager {
151
+ func NewPodGroupManager (
152
+ ctx context.Context , client client.Client , snapshotSharedLister framework.SharedLister ,
153
+ scheduleTimeout * time.Duration , podInformer informerv1.PodInformer ) * PodGroupManager {
123
154
pgMgr := & PodGroupManager {
124
155
client : client ,
125
156
snapshotSharedLister : snapshotSharedLister ,
@@ -130,30 +161,9 @@ func NewPodGroupManager(client client.Client, snapshotSharedLister framework.Sha
130
161
assignedPodsByPG : map [string ]sets.Set [string ]{},
131
162
}
132
163
podInformer .Informer ().AddEventHandler (cache.ResourceEventHandlerFuncs {
133
- AddFunc : AddPodFactory (pgMgr ),
134
- DeleteFunc : func (obj interface {}) {
135
- switch t := obj .(type ) {
136
- case * corev1.Pod :
137
- pod := t
138
- if pod .Spec .NodeName == "" {
139
- return
140
- }
141
- pgMgr .Unreserve (context .Background (), pod )
142
- return
143
- case cache.DeletedFinalStateUnknown :
144
- pod , ok := t .Obj .(* corev1.Pod )
145
- if ! ok {
146
- return
147
- }
148
- if pod .Spec .NodeName == "" {
149
- return
150
- }
151
- pgMgr .Unreserve (context .Background (), pod )
152
- return
153
- default :
154
- return
155
- }
156
- },
164
+ AddFunc : AddPodFactory (ctx , pgMgr ),
165
+ UpdateFunc : UpdatePodFactory (ctx , pgMgr ),
166
+ DeleteFunc : DelPodFactory (ctx , pgMgr ),
157
167
})
158
168
return pgMgr
159
169
}
@@ -312,6 +322,21 @@ func (pgMgr *PodGroupManager) Permit(ctx context.Context, state *framework.Cycle
312
322
return Wait
313
323
}
314
324
325
+ // Reserve adds Pod to the assignedPodsByPG map when it is scheduled
326
+ func (pgMgr * PodGroupManager ) Reserve (ctx context.Context , pod * corev1.Pod ) {
327
+ pgFullName , _ := pgMgr .GetPodGroup (ctx , pod )
328
+ if pgFullName == "" {
329
+ return
330
+ }
331
+ pgMgr .RWMutex .Lock ()
332
+ defer pgMgr .RWMutex .Unlock ()
333
+ if assigned , exist := pgMgr .assignedPodsByPG [pgFullName ]; exist {
334
+ assigned .Insert (pod .Name )
335
+ } else {
336
+ pgMgr .assignedPodsByPG [pgFullName ] = sets .New (pod .Name )
337
+ }
338
+ }
339
+
315
340
// Unreserve invalidates assigned pod from assignedPodsByPG when schedule or bind failed.
316
341
func (pgMgr * PodGroupManager ) Unreserve (ctx context.Context , pod * corev1.Pod ) {
317
342
pgFullName , _ := pgMgr .GetPodGroup (ctx , pod )
0 commit comments