session: parallelize session restoration on startup
Load persisted session JSONs sequentially (fast disk reads), then fan out restoreSession calls in parallel. Each session restoration involves backend init, prompt resolution, and potentially SSH connections for remote sessions.
This commit is contained in:
parent
c59f1c57d7
commit
e40d266206
|
|
@ -759,6 +759,13 @@ func (s *Manager) restoreAllSessions() {
|
|||
if err != nil {
|
||||
return
|
||||
}
|
||||
|
||||
// Load all persisted session JSONs (fast, sequential disk reads)
|
||||
type loadedSession struct {
|
||||
ps *agent.PersistedSession
|
||||
name string
|
||||
}
|
||||
var loaded []loadedSession
|
||||
for _, e := range entries {
|
||||
if !strings.HasSuffix(e.Name(), ".json") {
|
||||
continue
|
||||
|
|
@ -769,13 +776,25 @@ func (s *Manager) restoreAllSessions() {
|
|||
s.cfg.Log.Error("restore session %s: %v", e.Name(), err)
|
||||
continue
|
||||
}
|
||||
if err := s.restoreSession(ps); err != nil {
|
||||
s.cfg.Log.Error("restore session %s: %v", ps.ID, err)
|
||||
continue
|
||||
}
|
||||
// Keep active snapshots until the session is explicitly killed.
|
||||
// Shutdown refreshes these files with the latest state.
|
||||
loaded = append(loaded, loadedSession{ps: ps, name: e.Name()})
|
||||
}
|
||||
|
||||
if len(loaded) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
// Restore sessions in parallel
|
||||
var wg sync.WaitGroup
|
||||
for _, ls := range loaded {
|
||||
wg.Add(1)
|
||||
go func(ls loadedSession) {
|
||||
defer wg.Done()
|
||||
if err := s.restoreSession(ls.ps); err != nil {
|
||||
s.cfg.Log.Error("restore session %s: %v", ls.ps.ID, err)
|
||||
}
|
||||
}(ls)
|
||||
}
|
||||
wg.Wait()
|
||||
}
|
||||
|
||||
func (s *Manager) restoreSession(ps *agent.PersistedSession) error {
|
||||
|
|
|
|||
Reference in New Issue