Files
byre/internal/agents/coordinator.go
T

58 lines
1.2 KiB
Go
Raw Normal View History

package agents
import (
"context"
"log/slog"
)
const abandonedMergeText = "The Merge turn ended unfinished (interrupted, failed to start, or with no final message), so byre didn't squash or push the task. Merge again to retry."
func (m *Manager) poke() {
select {
case m.pokes <- struct{}{}:
default:
}
}
func (m *Manager) coordinate() {
finalizing := map[string]bool{}
for {
select {
case <-m.watchStop:
return
case <-m.pokes:
m.coordinateMerges(context.Background(), finalizing)
}
}
}
func (m *Manager) coordinateMerges(ctx context.Context, finalizing map[string]bool) {
work, err := m.store.CoordinateMerges(ctx)
if err != nil {
slog.Error("coordinate merges", "err", err)
return
}
for _, id := range work.Abandoned {
slog.Info("merge turn ended unfinished", "task", id)
m.fileError(ctx, id, abandonedMergeText)
m.deliverIdle(ctx, id)
}
for _, c := range work.Start {
m.startClaimedMerge(ctx, c)
}
current := map[string]bool{}
for _, f := range work.Finalize {
current[f.Task.Id] = true
if finalizing[f.Task.Id] {
continue
}
finalizing[f.Task.Id] = true
go m.finalizeMerge(f)
}
for id := range finalizing {
if !current[id] {
delete(finalizing, id)
}
}
}