From 8e8ed733812412ae80c67bfe42ca1eab4069cfd0 Mon Sep 17 00:00:00 2001 From: ferreo Date: Sat, 10 Aug 2024 14:06:31 +0100 Subject: [PATCH] Fix broken i386 queue --- buildqueue/queue.go | 97 ++++++++++++++++++++------------------------ buildqueue/worker.go | 54 ++++++++++++++++++------ domain/buildqueue.go | 3 ++ 3 files changed, 89 insertions(+), 65 deletions(-) diff --git a/buildqueue/queue.go b/buildqueue/queue.go index c6d2721..ae4e79f 100644 --- a/buildqueue/queue.go +++ b/buildqueue/queue.go @@ -2,6 +2,7 @@ package buildqueue import ( "brunel/domain" + "fmt" "strings" "errors" @@ -11,42 +12,8 @@ import ( var queue = haxmap.New[string, domain.BuildQueueItem]() -func Add(buildItem domain.BuildQueueItem) error { - if strings.Contains(buildItem.BuildVersion, "+b") { - buildItem.BuildVersion = strings.Split(buildItem.BuildVersion, "+b")[0] - } - if _, ok := queue.Get(buildItem.Source.Name); ok { - return errors.New("package already in queue") - } - - queue.Set(buildItem.Source.Name, buildItem) - return nil -} - -func Get(name string) (domain.BuildQueueItem, bool) { - item, ok := queue.Get(name) - return item, ok -} - -func Remove(name string) error { - _, ok := queue.Get(name) - if !ok { - return errors.New("package not in queue") - } - queue.Del(name) - return nil -} - -func Update(buildItem domain.BuildQueueItem) error { - item, ok := queue.Get(buildItem.Source.Name) - if !ok { - return errors.New("package not in queue") - } - if item.Status == domain.Building { - return errors.New("package is already building") - } - queue.Set(buildItem.Source.Name, buildItem) - return nil +func getQueueKey(name string, buildType domain.BuildType) string { + return fmt.Sprintf("%s_%s", name, buildType) } func GetQueue() *haxmap.Map[string, domain.BuildQueueItem] { @@ -69,8 +36,49 @@ func GetCounts() domain.BuildQueueCount { return count } -func ProcessNext() error { +func Add(buildItem domain.BuildQueueItem) error { + if strings.Contains(buildItem.BuildVersion, "+b") { + buildItem.BuildVersion = strings.Split(buildItem.BuildVersion, "+b")[0] + } + key := getQueueKey(buildItem.Source.Name, buildItem.Type) + if _, ok := queue.Get(key); ok { + return errors.New("package already in queue") + } + queue.Set(key, buildItem) + return nil +} + +func Get(name string, buildType domain.BuildType) (domain.BuildQueueItem, bool) { + key := getQueueKey(name, buildType) + item, ok := queue.Get(key) + return item, ok +} + +func Remove(name string, buildType domain.BuildType) error { + key := getQueueKey(name, buildType) + _, ok := queue.Get(key) + if !ok { + return errors.New("package not in queue") + } + queue.Del(key) + return nil +} + +func Update(buildItem domain.BuildQueueItem) error { + key := getQueueKey(buildItem.Source.Name, buildItem.Type) + item, ok := queue.Get(key) + if !ok { + return errors.New("package not in queue") + } + if item.Status == domain.Building { + return errors.New("package is already building") + } + queue.Set(key, buildItem) + return nil +} + +func ProcessNext() error { var item *domain.BuildQueueItem queue.ForEach(func(k string, v domain.BuildQueueItem) bool { if v.Status == domain.Queued { @@ -82,21 +90,6 @@ func ProcessNext() error { if item == nil { return nil } - if item.Source.Has32bit && domain.BuildTypeI386 != "i386" { - i386Item := domain.BuildQueueItem{ - Source: item.Source, - Status: domain.Building, - Type: domain.BuildTypeI386, - Patch: item.Patch, - Rebuild: item.Rebuild, - BuildNumber: item.BuildNumber, - BuildVersion: item.BuildVersion, - } - err := UpdateBuildFile(i386Item) - if err != nil { - return err - } - } err := UpdateBuildFile(*item) if err != nil { diff --git a/buildqueue/worker.go b/buildqueue/worker.go index 4f5773a..f4c71e6 100644 --- a/buildqueue/worker.go +++ b/buildqueue/worker.go @@ -45,31 +45,45 @@ func processPackages() { } state, _ := helpers.DBInst.GetBuildState(v.Name) - if state.BuildNumber > 1 { + if state.BuildNumber > 3 { return true } - buildItem := createBuildItem(v, state) - if err := Add(buildItem); err != nil { - slog.Info("unable to add package to queue", "error", err) + if state.BuildNumber > 1 && state.Type == string(domain.BuildTypeI386) { + return true + } + + queueBuildItem(v, state, false) + if v.Has32bit { + queueBuildItem(v, state, true) } return true }) } -func shouldBuild(v domain.SourcePackage) bool { - return v.Status == domain.Missing || v.Status == domain.Stale || v.Status == domain.Error +func queueBuildItem(v domain.SourcePackage, state domain.BuildState, isI386 bool) { + buildItem := createBuildItem(v, state, isI386) + if err := Add(buildItem); err != nil { + slog.Info("unable to add package to queue", "error", err) + } } -func createBuildItem(v domain.SourcePackage, state domain.BuildState) domain.BuildQueueItem { +func createBuildItem(v domain.SourcePackage, state domain.BuildState, isI386 bool) domain.BuildQueueItem { buildVersion := v.NewVersion if buildVersion == "" { buildVersion = v.Version } - typ := domain.BuildTypeLTO - if state.BuildNumber == 1 { - typ = domain.BuildTypeNormal + var typ domain.BuildType + if isI386 { + typ = domain.BuildTypeI386 + } else { + typ = domain.BuildTypeLTO + if state.BuildNumber == 1 { + typ = domain.BuildTypeNormal + } else if state.BuildNumber == 2 { + typ = domain.BuildTypeAmd64 + } } return domain.BuildQueueItem{ @@ -82,6 +96,9 @@ func createBuildItem(v domain.SourcePackage, state domain.BuildState) domain.Bui BuildVersion: buildVersion, } } +func shouldBuild(v domain.SourcePackage) bool { + return v.Status == domain.Missing || v.Status == domain.Stale || v.Status == domain.Error +} func processQueueAndStatus(ctx context.Context) { for { @@ -97,7 +114,10 @@ func processQueueAndStatus(ctx context.Context) { func processQueue() { q := GetQueue() - itemsToRemove := []string{} + itemsToRemove := []struct { + name string + buildType domain.BuildType + }{} buildingFound := false q.ForEach(func(k string, item domain.BuildQueueItem) bool { @@ -106,14 +126,20 @@ func processQueue() { complete, err := checkIfBuildComplete(item) if complete { handleCompletedBuild(item, err) - itemsToRemove = append(itemsToRemove, k) + itemsToRemove = append(itemsToRemove, struct { + name string + buildType domain.BuildType + }{ + name: item.Source.Name, + buildType: item.Type, + }) } } return true }) for _, item := range itemsToRemove { - Remove(item) + Remove(item.name, item.buildType) } if !buildingFound { @@ -159,10 +185,12 @@ func updateBuildState(item domain.BuildQueueItem, buildStatus domain.PackageStat Name: item.Source.Name, Status: string(domain.Queued), BuildVersion: item.BuildVersion, + Type: string(item.Type), BuildNumber: 0, } } state.Status = string(buildStatus) + state.Type = string(item.Type) state.BuildVersion = item.BuildVersion state.BuildNumber++ helpers.DBInst.UpdateBuildState(state) diff --git a/domain/buildqueue.go b/domain/buildqueue.go index be66a8b..6a0aa55 100644 --- a/domain/buildqueue.go +++ b/domain/buildqueue.go @@ -10,6 +10,8 @@ const ( BuildTypeLTO BuildType = "lto" // BuildType is an i386 build BuildTypeI386 BuildType = "i386" + // BuildType is an amd64 build + BuildTypeAmd64 BuildType = "amd64" ) const ( @@ -38,5 +40,6 @@ type BuildState struct { Name string `gorm:"primarykey"` Status string BuildVersion string + Type string BuildNumber int }