Keep starting byre when one session fails to resume
This commit is contained in:
+32
-19
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user