51 lines
1.9 KiB
Go
51 lines
1.9 KiB
Go
package link
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"strings"
|
|
|
|
"github.com/nats-io/nats.go"
|
|
"github.com/nats-io/nats.go/jetstream"
|
|
|
|
"github.com/novox/mesh-controller/internal/broker"
|
|
)
|
|
|
|
// The kinds of ask, as the queue says them. **The kind decides the queue** (novox/hq ADR 0406 §3): a delivery build is on
|
|
// the seat's own queue, taken before any check; a check of a pull request marked ready is on the second; every other
|
|
// check on the third. Nothing orders the asks any more: a builder takes from the queues in that order, and the check
|
|
// queues keep one request a pull request. The reordering of one queue by moving asks to its tail, with its pause of the
|
|
// worker, its look every two seconds and its second copies, is gone (issue 558 is answered by the streams).
|
|
const (
|
|
KindDelivery = "delivery"
|
|
KindCheck = "check"
|
|
)
|
|
|
|
// KindOf is an ask's kind: a check for a pull request's check — a recheck the merge tool asks included —
|
|
// a dry run, or an ask nothing could be read from; a delivery for any other build.
|
|
func KindOf(r BuildRequest) string {
|
|
if r.ID == "" || r.Check != nil || r.DryRun {
|
|
return KindCheck
|
|
}
|
|
return KindDelivery
|
|
}
|
|
|
|
// DeleteAsk removes a waiting or dead ask from the queue it is in, at its sequence. Says the sequence it removed, 0 when
|
|
// it was not there any more: taken and settled, or replaced by a newer request for its pull request.
|
|
func DeleteAsk(_ context.Context, js *broker.JetStream, seat string, ask QueuedAsk) (uint64, error) {
|
|
stream := ask.Stream
|
|
if stream == "" {
|
|
worker, _ := broker.HolderConsumerFor("", "", broker.DeclaredSeat{Name: seat, Accepts: []string{"build"}})
|
|
stream = worker.Stream
|
|
}
|
|
err := js.Context().DeleteMsg(stream, ask.Seq)
|
|
switch {
|
|
case err == nil:
|
|
return ask.Seq, nil
|
|
case errors.Is(err, nats.ErrMsgNotFound) || errors.Is(err, jetstream.ErrMsgNotFound) ||
|
|
strings.Contains(err.Error(), "no message found"):
|
|
return 0, nil
|
|
}
|
|
return 0, err
|
|
}
|