51 lines
1.3 KiB
Go
51 lines
1.3 KiB
Go
package store
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
)
|
|
|
|
type Work struct {
|
|
AbandonedMerges []string
|
|
StartMerges []ClaimedMerge
|
|
FinalizeMerges []FinalizingMerge
|
|
StartDiscards []string
|
|
FinishDiscards []string
|
|
}
|
|
|
|
func (s *Store) Coordinate(ctx context.Context) (Work, error) {
|
|
work := Work{}
|
|
err := s.write(ctx, func(tx *sql.Tx, emit emitFunc) error {
|
|
var err error
|
|
work.AbandonedMerges, err = abandonMerges(ctx, tx, emit)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = claimHeldMerges(ctx, tx, emit)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
work.StartMerges, err = startableMerges(ctx, tx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
work.FinalizeMerges, err = finalizingMerges(ctx, tx)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
_, err = tx.ExecContext(ctx, `UPDATE tasks SET discard_state = 'closing'
|
|
WHERE status = 'active' AND discard_state = 'running'
|
|
AND NOT EXISTS (SELECT 1 FROM agent_sessions s WHERE s.id = tasks.discard_session AND s.state = 'running')`)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
work.StartDiscards, err = queryIDs(ctx, tx, `SELECT id FROM tasks WHERE status = 'active' AND discard_state = 'held' AND NOT `+implementerRunning)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
work.FinishDiscards, err = queryIDs(ctx, tx, `SELECT id FROM tasks WHERE status = 'active' AND discard_state = 'closing'`)
|
|
return err
|
|
})
|
|
return work, err
|
|
}
|