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:
Levi Neely 2026-07-27 11:13:36 +02:00
parent c59f1c57d7
commit e40d266206
1 changed files with 25 additions and 6 deletions

View File

@ -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 {