44package schedulerutils
55
66import (
7+ "fmt"
78 "sync"
89
910 "github.com/microsoft/azurelinux/toolkit/tools/internal/logger"
@@ -27,7 +28,7 @@ import (
2728// and are queued for building in the testNodesToRequests() function.
2829// At this point the partner build nodes for these test nodes have either already finished building or are being built,
2930// thus the check for active and cached SRPMs inside testNodesToRequests().
30- func ConvertNodesToRequests (pkgGraph * pkggraph.PkgGraph , graphMutex * sync.RWMutex , nodesToBuild []* pkggraph.PkgNode , packagesToRebuild , testsToRerun []* pkgjson.PackageVer , buildState * GraphBuildState , isCacheAllowed bool ) (requests []* BuildRequest ) {
31+ func ConvertNodesToRequests (pkgGraph * pkggraph.PkgGraph , graphMutex * sync.RWMutex , nodesToBuild []* pkggraph.PkgNode , packagesToRebuild , testsToRerun []* pkgjson.PackageVer , buildState * GraphBuildState , isCacheAllowed bool ) (requests []* BuildRequest , err error ) {
3132 timestamp .StartEvent ("generate requests" , nil )
3233 defer timestamp .StopEvent (nil )
3334
@@ -57,13 +58,23 @@ func ConvertNodesToRequests(pkgGraph *pkggraph.PkgGraph, graphMutex *sync.RWMute
5758 requests = append (requests , req )
5859 }
5960
60- requests = append (requests , buildNodesToRequests (pkgGraph , buildState , packagesToRebuild , testsToRerun , buildNodes , isCacheAllowed )... )
61- requests = append (requests , testNodesToRequests (pkgGraph , buildState , testsToRerun , testNodes )... )
61+ newBuildReqs , err := buildNodesToRequests (pkgGraph , buildState , packagesToRebuild , testsToRerun , buildNodes , isCacheAllowed )
62+ if err != nil {
63+ err = fmt .Errorf ("failed to convert build nodes to requests:\n %w" , err )
64+ return
65+ }
66+ requests = append (requests , newBuildReqs ... )
67+ newTestReqs , err := testNodesToRequests (pkgGraph , buildState , testsToRerun , testNodes )
68+ if err != nil {
69+ err = fmt .Errorf ("failed to convert test nodes to requests:\n %w" , err )
70+ return
71+ }
72+ requests = append (requests , newTestReqs ... )
6273
6374 return
6475}
6576
66- func buildNodesToRequests (pkgGraph * pkggraph.PkgGraph , buildState * GraphBuildState , packagesToRebuild , testsToRerun []* pkgjson.PackageVer , buildNodesLists map [string ][]* pkggraph.PkgNode , isCacheAllowed bool ) (requests []* BuildRequest ) {
77+ func buildNodesToRequests (pkgGraph * pkggraph.PkgGraph , buildState * GraphBuildState , packagesToRebuild , testsToRerun []* pkgjson.PackageVer , buildNodesLists map [string ][]* pkggraph.PkgNode , isCacheAllowed bool ) (requests []* BuildRequest , err error ) {
6778 for _ , buildNodes := range buildNodesLists {
6879 // Check if any of the build nodes is a delta node and mark it. We will use this to determine if the
6980 // build is a delta build that might have pre-built .rpm files available.
@@ -76,6 +87,17 @@ func buildNodesToRequests(pkgGraph *pkggraph.PkgGraph, buildState *GraphBuildSta
7687 }
7788
7889 defaultNode := buildNodes [0 ]
90+
91+ // Check if we already queued up this build node for building.
92+ if buildState .IsSRPMBuildActive (defaultNode .SRPMFileName ()) || buildState .IsNodeProcessed (defaultNode ) {
93+ err = fmt .Errorf ("unexpected duplicate build for (%s)" , defaultNode .SRPMFileName ())
94+ // Temporarily ignore the error, this state is unexpected but not fatal. Error return will be
95+ // restored later once the underlying cause of this error is fixed.
96+ logger .Log .Warnf (err .Error ())
97+ err = nil
98+ continue
99+ }
100+
79101 req := buildRequest (pkgGraph , buildState , packagesToRebuild , defaultNode , buildNodes , isCacheAllowed , hasADeltaNode )
80102 requests = append (requests , req )
81103
@@ -152,13 +174,23 @@ func partnerTestNodesToRequest(pkgGraph *pkggraph.PkgGraph, buildState *GraphBui
152174// which have already been queued to build or finished building.
153175//
154176// NOTE: the caller must guarantee the build state does not change while this function is running.
155- func testNodesToRequests (pkgGraph * pkggraph.PkgGraph , buildState * GraphBuildState , testsToRerun []* pkgjson.PackageVer , testNodesLists map [string ][]* pkggraph.PkgNode ) (requests []* BuildRequest ) {
177+ func testNodesToRequests (pkgGraph * pkggraph.PkgGraph , buildState * GraphBuildState , testsToRerun []* pkgjson.PackageVer , testNodesLists map [string ][]* pkggraph.PkgNode ) (requests []* BuildRequest , err error ) {
156178 const isDelta = false
157179
158180 for _ , testNodes := range testNodesLists {
159181 defaultTestNode := testNodes [0 ]
160182 srpmFileName := defaultTestNode .SRPMFileName ()
161183
184+ // Check if we already queued up this build node for building.
185+ if buildState .IsSRPMBuildActive (srpmFileName ) || buildState .IsNodeProcessed (defaultTestNode ) {
186+ err = fmt .Errorf ("unexpected duplicate test for (%s)" , srpmFileName )
187+ // Temporarily ignore the error, this state is unexpected but not fatal. Error return will be
188+ // restored later once the underlying cause of this error is fixed.
189+ logger .Log .Warnf (err .Error ())
190+ err = nil
191+ continue
192+ }
193+
162194 buildUsedCache := buildState .IsSRPMCached (srpmFileName )
163195 if buildRequest := buildState .ActiveBuildFromSRPM (srpmFileName ); buildRequest != nil {
164196 buildUsedCache = buildRequest .UseCache
0 commit comments