@@ -145,10 +145,10 @@ func (c *Controller) Process(ctx context.Context, delivery consumer.Delivery) er
145145 Status : entity .BuildStatusAccepted ,
146146 Version : 1 ,
147147 }
148- if err := c .persistBuild (ctx , store , build ); err != nil {
148+ if err := c .createOrVerifyBuildForRequest (ctx , store , build ); err != nil {
149149 return err
150150 }
151- if err := c .persistBuildTriggered (ctx , store , request , build .ID ); err != nil {
151+ if err := c .persistBuildTriggeredLog (ctx , store , request , build .ID ); err != nil {
152152 return err
153153 }
154154
@@ -165,14 +165,20 @@ func (c *Controller) Process(ctx context.Context, delivery consumer.Delivery) er
165165 return nil
166166}
167167
168- func (c * Controller ) persistBuild (ctx context.Context , store storage.Storage , build entity.Build ) error {
168+ func (c * Controller ) createOrVerifyBuildForRequest (ctx context.Context , store storage.Storage , build entity.Build ) error {
169169 buildStore := store .GetBuildStore ()
170- if err := buildStore .Create (ctx , build ); err == nil {
170+ err := buildStore .Create (ctx , build )
171+ if err == nil {
171172 return nil
172- } else if ! errors .Is (err , storage .ErrAlreadyExists ) {
173+ }
174+ if ! errors .Is (err , storage .ErrAlreadyExists ) {
173175 return fmt .Errorf ("failed to persist build %s: %w" , build .ID , err )
174176 }
175177
178+ // ErrAlreadyExists can mean an earlier delivery already stored this Request's Build,
179+ // or another Request received the same runner-assigned build ID first. Only the first
180+ // case is a safe retry; continuing after a collision would make BuildSignal update the
181+ // wrong Request.
176182 stored , err := buildStore .Get (ctx , build .ID )
177183 if err != nil {
178184 return fmt .Errorf ("failed to load existing build %s: %w" , build .ID , err )
@@ -183,7 +189,7 @@ func (c *Controller) persistBuild(ctx context.Context, store storage.Storage, bu
183189 return nil
184190}
185191
186- func (c * Controller ) persistBuildTriggered (ctx context.Context , store storage.Storage , request entity.Request , buildID string ) error {
192+ func (c * Controller ) persistBuildTriggeredLog (ctx context.Context , store storage.Storage , request entity.Request , buildID string ) error {
187193 log := requestlog .NewRequestEventLog (
188194 request ,
189195 entity .RequestEventBuildTriggered ,
0 commit comments