Keep starting byre when one session fails to resume

This commit is contained in:
Ian Gulliver
2026-10-16 12:43:54 -07:00
parent acbbd8747e
commit 0e52253d07
3 changed files with 33 additions and 22 deletions
+32 -19
View File
@@ -299,28 +299,15 @@ func (m *Manager) Recover(ctx context.Context) error {
}
task, err := m.taskFor(ctx, sess)
if err != nil {
return err
slog.Error("resume session: load task", "session", sess.Id, "task", sess.TaskId, "err", err)
continue
}
l, err := m.ensureLive(ctx, sess, task)
if err != nil {
slog.Error("resume session", "session", sess.Id, "err", err)
m.logUndelivered(ctx, sess.Id, "resume failed")
derr := m.store.DropStageOutput(ctx, sess.Id)
if derr != nil {
return derr
}
next, serr := m.store.EndTurn(ctx, sess.Id, "byre", map[string]any{"error": err.Error()}, nil, false)
if serr != nil {
return serr
}
switch {
case next == store.DiscardClosing:
go m.finishDiscard(task.Id)
case next == store.DiscardHeld:
go m.startDiscard(task.Id)
case sess.Role == api.Implementer:
m.abandonMerge(task.Id, task.ProjectId)
ferr := m.failResume(ctx, sess, task, err)
if ferr != nil {
return ferr
}
continue
}
@@ -337,7 +324,11 @@ func (m *Manager) Recover(ctx context.Context) error {
}
err = m.message(ctx, l, "byre", notice, nil)
if err != nil {
return err
ferr := m.failResume(ctx, sess, task, err)
if ferr != nil {
return ferr
}
continue
}
slog.Info("resumed session", "session", sess.Id, "task", task.Id, "owner", sess.Owner)
m.logUndelivered(ctx, sess.Id, "resumed with restart notice")
@@ -367,6 +358,28 @@ func (m *Manager) Recover(ctx context.Context) error {
return nil
}
func (m *Manager) failResume(ctx context.Context, sess api.AgentSession, task api.Task, err error) error {
slog.Error("resume session", "session", sess.Id, "err", err)
m.logUndelivered(ctx, sess.Id, "resume failed")
derr := m.store.DropStageOutput(ctx, sess.Id)
if derr != nil {
return derr
}
next, serr := m.store.EndTurn(ctx, sess.Id, "byre", map[string]any{"error": err.Error()}, nil, false)
if serr != nil {
return serr
}
switch {
case next == store.DiscardClosing:
go m.finishDiscard(task.Id)
case next == store.DiscardHeld:
go m.startDiscard(task.Id)
case sess.Role == api.Implementer:
m.abandonMerge(task.Id, task.ProjectId)
}
return nil
}
func (m *Manager) logUndelivered(ctx context.Context, sessionID, reason string) {
pending, err := m.store.Undelivered(ctx, sessionID)
if err != nil {