@@ -204,9 +204,32 @@ func NewAISessionSelector(ctx context.Context, cap core.Capability, modelID stri
204
204
return nil , err
205
205
}
206
206
207
+ // Periodically refresh sessions for Live Video to Video in order to minimize the necessity of refreshing sessions
208
+ // when the AI process is started
209
+ if cap == core .Capability_LiveVideoToVideo {
210
+ startPeriodicRefresh (sel )
211
+ }
212
+
207
213
return sel , nil
208
214
}
209
215
216
+ func startPeriodicRefresh (sel * AISessionSelector ) {
217
+ go func () {
218
+ // Refresh and 80% or tll to avoid ever getting ttl applied
219
+ refreshInterval := time .Duration (0.8 * float64 (sel .ttl ))
220
+ ticker := time .NewTicker (refreshInterval )
221
+ defer ticker .Stop ()
222
+ for {
223
+ select {
224
+ case <- ticker .C :
225
+ if err := sel .Refresh (context .Background ()); err != nil {
226
+ clog .Infof (context .Background (), "Error refreshing AISessionSelector err=%v" , err )
227
+ }
228
+ }
229
+ }
230
+ }()
231
+ }
232
+
210
233
// newAICapabilities creates a new capabilities object with
211
234
func newAICapabilities (cap core.Capability , modelID string , warm bool , minVersion string ) * core.Capabilities {
212
235
aiCaps := []core.Capability {cap }
@@ -232,6 +255,11 @@ func (sel *AISessionSelector) SelectorIsEmpty() bool {
232
255
233
256
func (sel * AISessionSelector ) Select (ctx context.Context ) * AISession {
234
257
shouldRefreshSelector := func () bool {
258
+ sel .warmPool .mu .Lock ()
259
+ sel .coldPool .mu .Lock ()
260
+
261
+ defer sel .coldPool .mu .Unlock ()
262
+ defer sel .warmPool .mu .Unlock ()
235
263
discoveryPoolSize := int (math .Min (float64 (sel .node .OrchestratorPool .Size ()), float64 (sel .initialPoolSize )))
236
264
237
265
// If the selector is empty, release all orchestrators from suspension and
@@ -332,10 +360,13 @@ func (sel *AISessionSelector) Refresh(ctx context.Context) error {
332
360
}
333
361
}
334
362
363
+ sel .warmPool .mu .Lock ()
364
+ sel .coldPool .mu .Lock ()
365
+ defer sel .coldPool .mu .Unlock ()
366
+ defer sel .warmPool .mu .Unlock ()
335
367
sel .warmPool .Add (warmSessions )
336
368
sel .coldPool .Add (coldSessions )
337
369
sel .initialPoolSize = len (warmSessions ) + len (coldSessions ) + len (sel .suspender .list )
338
-
339
370
sel .lastRefreshTime = time .Now ()
340
371
341
372
return nil
0 commit comments