@@ -46,9 +46,8 @@ type Datastore interface {
46
46
47
47
// InferenceModel operations
48
48
ModelSetIfOlder (infModel * v1alpha2.InferenceModel ) bool
49
- ModelGetByModelName (modelName string ) (* v1alpha2.InferenceModel , bool )
50
- ModelGetByObjName (namespacedName types.NamespacedName ) (* v1alpha2.InferenceModel , bool )
51
- ModelDelete (namespacedName types.NamespacedName )
49
+ ModelGet (modelName string ) (* v1alpha2.InferenceModel , bool )
50
+ ModelDelete (namespacedName types.NamespacedName ) (* v1alpha2.InferenceModel , bool )
52
51
ModelGetAll () []* v1alpha2.InferenceModel
53
52
54
53
// PodMetrics operations
@@ -67,11 +66,9 @@ type Datastore interface {
67
66
68
67
func NewDatastore () Datastore {
69
68
store := & datastore {
70
- poolMu : sync.RWMutex {},
71
- modelsMu : sync.RWMutex {},
72
- modelsByModelName : make (map [string ]* v1alpha2.InferenceModel ),
73
- modelsByObjName : make (map [types.NamespacedName ]* v1alpha2.InferenceModel ),
74
- pods : & sync.Map {},
69
+ poolAndModelsMu : sync.RWMutex {},
70
+ models : make (map [string ]* v1alpha2.InferenceModel ),
71
+ pods : & sync.Map {},
75
72
}
76
73
return store
77
74
}
@@ -97,127 +94,102 @@ func NewFakeDatastore(pods []*PodMetrics, models []*v1alpha2.InferenceModel, poo
97
94
}
98
95
99
96
type datastore struct {
100
- // poolMu is used to synchronize access to the inferencePool.
101
- poolMu sync.RWMutex
102
- pool * v1alpha2.InferencePool
103
- modelsMu sync.RWMutex
104
- // key: types.NamespacedName, value: *InferenceModel
105
- modelsByObjName map [types.NamespacedName ]* v1alpha2.InferenceModel
97
+ // poolAndModelsMu is used to synchronize access to pool and the models map.
98
+ poolAndModelsMu sync.RWMutex
99
+ pool * v1alpha2.InferencePool
106
100
// key: InferenceModel.Spec.ModelName, value: *InferenceModel
107
- modelsByModelName map [string ]* v1alpha2.InferenceModel
101
+ models map [string ]* v1alpha2.InferenceModel
108
102
// key: types.NamespacedName, value: *PodMetrics
109
103
pods * sync.Map
110
104
}
111
105
112
106
func (ds * datastore ) Clear () {
113
- ds .poolMu .Lock ()
114
- defer ds .poolMu .Unlock ()
107
+ ds .poolAndModelsMu .Lock ()
108
+ defer ds .poolAndModelsMu .Unlock ()
115
109
ds .pool = nil
116
- ds .modelsMu .Lock ()
117
- ds .modelsByModelName = make (map [string ]* v1alpha2.InferenceModel )
118
- ds .modelsByObjName = make (map [types.NamespacedName ]* v1alpha2.InferenceModel )
119
- ds .modelsMu .Unlock ()
110
+ ds .models = make (map [string ]* v1alpha2.InferenceModel )
120
111
ds .pods .Clear ()
121
112
}
122
113
123
114
// /// InferencePool APIs ///
124
115
func (ds * datastore ) PoolSet (pool * v1alpha2.InferencePool ) {
125
- ds .poolMu .Lock ()
126
- defer ds .poolMu .Unlock ()
116
+ ds .poolAndModelsMu .Lock ()
117
+ defer ds .poolAndModelsMu .Unlock ()
127
118
ds .pool = pool
128
119
}
129
120
130
121
func (ds * datastore ) PoolGet () (* v1alpha2.InferencePool , error ) {
131
- ds .poolMu .RLock ()
132
- defer ds .poolMu .RUnlock ()
122
+ ds .poolAndModelsMu .RLock ()
123
+ defer ds .poolAndModelsMu .RUnlock ()
133
124
if ! ds .PoolHasSynced () {
134
125
return nil , errPoolNotSynced
135
126
}
136
127
return ds .pool , nil
137
128
}
138
129
139
130
func (ds * datastore ) PoolHasSynced () bool {
140
- ds .poolMu .RLock ()
141
- defer ds .poolMu .RUnlock ()
131
+ ds .poolAndModelsMu .RLock ()
132
+ defer ds .poolAndModelsMu .RUnlock ()
142
133
return ds .pool != nil
143
134
}
144
135
145
136
func (ds * datastore ) PoolLabelsMatch (podLabels map [string ]string ) bool {
146
- ds .poolMu .RLock ()
147
- defer ds .poolMu .RUnlock ()
137
+ ds .poolAndModelsMu .RLock ()
138
+ defer ds .poolAndModelsMu .RUnlock ()
148
139
poolSelector := selectorFromInferencePoolSelector (ds .pool .Spec .Selector )
149
140
podSet := labels .Set (podLabels )
150
141
return poolSelector .Matches (podSet )
151
142
}
152
143
153
144
// /// InferenceModel APIs ///
154
145
func (ds * datastore ) ModelSetIfOlder (infModel * v1alpha2.InferenceModel ) bool {
155
- ds .modelsMu .Lock ()
156
- defer ds .modelsMu .Unlock ()
146
+ ds .poolAndModelsMu .Lock ()
147
+ defer ds .poolAndModelsMu .Unlock ()
157
148
158
149
// Check first if the existing model is older.
159
150
// One exception is if the incoming model object is the same, in which case, we should not
160
151
// check for creation timestamp since that means the object was re-created, and so we should override.
161
- existing , exists := ds .modelsByModelName [infModel .Spec .ModelName ]
152
+ existing , exists := ds .models [infModel .Spec .ModelName ]
162
153
if exists {
163
154
diffObj := infModel .Name != existing .Name || infModel .Namespace != existing .Namespace
164
155
if diffObj && existing .ObjectMeta .CreationTimestamp .Before (& infModel .ObjectMeta .CreationTimestamp ) {
165
156
return false
166
157
}
167
158
}
168
-
169
- // Deleting the model first ensures that the two maps are always aligned.
170
- namespacedName := types.NamespacedName {Name : infModel .Name , Namespace : infModel .Namespace }
171
- ds .modelDeleteByObjName (namespacedName )
172
- ds .modelDeleteByModelName (infModel .Spec .ModelName )
173
- ds .modelsByModelName [infModel .Spec .ModelName ] = infModel
174
- ds .modelsByObjName [namespacedName ] = infModel
159
+ // Delete the model
160
+ ds .modelDelete (types.NamespacedName {Name : infModel .Name , Namespace : infModel .Namespace })
161
+ ds .models [infModel .Spec .ModelName ] = infModel
175
162
return true
176
163
}
177
164
178
- func (ds * datastore ) ModelGetByModelName (modelName string ) (* v1alpha2.InferenceModel , bool ) {
179
- ds .modelsMu .RLock ()
180
- defer ds .modelsMu .RUnlock ()
181
- m , exists := ds .modelsByModelName [modelName ]
182
- return m , exists
183
- }
184
-
185
- func (ds * datastore ) ModelGetByObjName (namespacedName types.NamespacedName ) (* v1alpha2.InferenceModel , bool ) {
186
- ds .modelsMu .RLock ()
187
- defer ds .modelsMu .RUnlock ()
188
- m , exists := ds .modelsByObjName [namespacedName ]
165
+ func (ds * datastore ) ModelGet (modelName string ) (* v1alpha2.InferenceModel , bool ) {
166
+ ds .poolAndModelsMu .RLock ()
167
+ defer ds .poolAndModelsMu .RUnlock ()
168
+ m , exists := ds .models [modelName ]
189
169
return m , exists
190
170
}
191
171
192
- func (ds * datastore ) ModelDelete (namespacedName types.NamespacedName ) {
193
- ds .modelsMu .Lock ()
194
- defer ds .modelsMu .Unlock ()
195
- ds .modelDeleteByObjName (namespacedName )
196
- }
197
-
198
- func (ds * datastore ) modelDeleteByObjName (namespacedName types.NamespacedName ) {
199
- infModel , ok := ds .modelsByObjName [namespacedName ]
200
- if ! ok {
201
- return
172
+ func (ds * datastore ) modelDelete (namespacedName types.NamespacedName ) (* v1alpha2.InferenceModel , bool ) {
173
+ for _ , m := range ds .models {
174
+ if m .Name == namespacedName .Name && m .Namespace == namespacedName .Namespace {
175
+ delete (ds .models , m .Spec .ModelName )
176
+ return m , true
177
+ }
202
178
}
203
- delete (ds .modelsByObjName , namespacedName )
204
- delete (ds .modelsByModelName , infModel .Spec .ModelName )
179
+ return nil , false
205
180
}
206
181
207
- func (ds * datastore ) modelDeleteByModelName (modelName string ) {
208
- infModel , ok := ds .modelsByModelName [modelName ]
209
- if ! ok {
210
- return
211
- }
212
- delete (ds .modelsByObjName , types.NamespacedName {Name : infModel .Name , Namespace : infModel .Namespace })
213
- delete (ds .modelsByModelName , modelName )
182
+ func (ds * datastore ) ModelDelete (namespacedName types.NamespacedName ) (* v1alpha2.InferenceModel , bool ) {
183
+ ds .poolAndModelsMu .Lock ()
184
+ defer ds .poolAndModelsMu .Unlock ()
185
+ return ds .modelDelete (namespacedName )
214
186
}
215
187
216
188
func (ds * datastore ) ModelGetAll () []* v1alpha2.InferenceModel {
217
- ds .modelsMu .RLock ()
218
- defer ds .modelsMu .RUnlock ()
189
+ ds .poolAndModelsMu .RLock ()
190
+ defer ds .poolAndModelsMu .RUnlock ()
219
191
res := []* v1alpha2.InferenceModel {}
220
- for _ , v := range ds .modelsByObjName {
192
+ for _ , v := range ds .models {
221
193
res = append (res , v )
222
194
}
223
195
return res
0 commit comments