Run discards on the state-driven coordinator
This commit is contained in:
@@ -15,43 +15,53 @@ func (m *Manager) poke() {
|
||||
}
|
||||
|
||||
func (m *Manager) coordinate() {
|
||||
finalizing := map[string]bool{}
|
||||
started := map[string]bool{}
|
||||
for {
|
||||
select {
|
||||
case <-m.watchStop:
|
||||
return
|
||||
case <-m.pokes:
|
||||
m.coordinateMerges(context.Background(), finalizing)
|
||||
m.coordinatePass(context.Background(), started)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (m *Manager) coordinateMerges(ctx context.Context, finalizing map[string]bool) {
|
||||
work, err := m.store.CoordinateMerges(ctx)
|
||||
func (m *Manager) coordinatePass(ctx context.Context, started map[string]bool) {
|
||||
work, err := m.store.Coordinate(ctx)
|
||||
if err != nil {
|
||||
slog.Error("coordinate merges", "err", err)
|
||||
slog.Error("coordinate", "err", err)
|
||||
return
|
||||
}
|
||||
for _, id := range work.Abandoned {
|
||||
for _, id := range work.AbandonedMerges {
|
||||
slog.Info("merge turn ended unfinished", "task", id)
|
||||
m.fileError(ctx, id, abandonedMergeText)
|
||||
m.deliverIdle(ctx, id)
|
||||
}
|
||||
for _, c := range work.Start {
|
||||
for _, c := range work.StartMerges {
|
||||
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 work.StartDiscards {
|
||||
m.startDiscard(ctx, id)
|
||||
}
|
||||
for id := range finalizing {
|
||||
if !current[id] {
|
||||
delete(finalizing, id)
|
||||
|
||||
current := map[string]bool{}
|
||||
once := func(key string, run func()) {
|
||||
current[key] = true
|
||||
if started[key] {
|
||||
return
|
||||
}
|
||||
started[key] = true
|
||||
go run()
|
||||
}
|
||||
for _, f := range work.FinalizeMerges {
|
||||
once("merge:"+f.Task.Id, func() { m.finalizeMerge(f) })
|
||||
}
|
||||
for _, id := range work.FinishDiscards {
|
||||
once("discard:"+id, func() { m.finishDiscard(id) })
|
||||
}
|
||||
for key := range started {
|
||||
if !current[key] {
|
||||
delete(started, key)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user