Skip to content

Commit 2c658e2

Browse files
committed
refactor(stovepipe): clarify request log persistence
1 parent e05290a commit 2c658e2

4 files changed

Lines changed: 31 additions & 11 deletions

File tree

‎stovepipe/controller/build/build.go‎

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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,

‎stovepipe/controller/build/build_test.go‎

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -307,7 +307,7 @@ func TestProcess(t *testing.T) {
307307
},
308308
},
309309
{
310-
name: "already exists on create is swallowed and publish still happens",
310+
name: "existing build for this request repairs the event and publication",
311311
setup: func(m buildMocks) {
312312
req := processingRequest(entity.BuildStrategyFull, "")
313313
m.reqStore.EXPECT().Get(gomock.Any(), testID).Return(req, nil)
@@ -321,6 +321,20 @@ func TestProcess(t *testing.T) {
321321
m.publisher.EXPECT().Publish(gomock.Any(), "buildsignal", gomock.Any()).Return(nil).After(logCall)
322322
},
323323
},
324+
{
325+
name: "existing build for another request is rejected",
326+
wantErr: true,
327+
setup: func(m buildMocks) {
328+
req := processingRequest(entity.BuildStrategyFull, "")
329+
m.reqStore.EXPECT().Get(gomock.Any(), testID).Return(req, nil)
330+
m.runnerFactory.EXPECT().For(buildrunner.Config{QueueName: testQueue}).Return(m.runner, nil)
331+
m.runner.EXPECT().Trigger(gomock.Any(), "", testHeadURI, entity.BuildMetadata(nil)).Return(entity.BuildID{ID: testBuildID}, nil)
332+
createCall := m.buildStore.EXPECT().Create(gomock.Any(), gomock.Any()).Return(storage.ErrAlreadyExists)
333+
m.buildStore.EXPECT().Get(gomock.Any(), testBuildID).
334+
Return(entity.Build{ID: testBuildID, RequestID: "request/monorepo/main/8", Status: entity.BuildStatusAccepted, Version: 1}, nil).
335+
After(createCall)
336+
},
337+
},
324338
{
325339
name: "build store error is not retryable",
326340
wantErr: true,

‎stovepipe/controller/buildsignal/buildsignal.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ func (c *Controller) Process(ctx context.Context, delivery consumer.Delivery) er
170170
}
171171

172172
if effective.IsTerminal() {
173-
if err := c.persistBuildFinished(ctx, store, request, build.ID); err != nil {
173+
if err := c.persistBuildFinishedLog(ctx, store, request, build.ID); err != nil {
174174
return err
175175
}
176176
if err := c.finishRequest(ctx, store, &request, effective); err != nil {
@@ -204,7 +204,7 @@ func (c *Controller) Process(ctx context.Context, delivery consumer.Delivery) er
204204
return nil
205205
}
206206

207-
func (c *Controller) persistBuildFinished(ctx context.Context, store storage.Storage, request entity.Request, buildID string) error {
207+
func (c *Controller) persistBuildFinishedLog(ctx context.Context, store storage.Storage, request entity.Request, buildID string) error {
208208
log := requestlog.NewRequestEventLog(
209209
request,
210210
entity.RequestEventBuildFinished,

‎stovepipe/controller/record/record.go‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ func (c *Controller) Process(ctx context.Context, delivery consumer.Delivery) er
143143
if err != nil {
144144
return err
145145
}
146-
if err := c.persistValidationFactRecorded(ctx, store, request, fact); err != nil {
146+
if err := c.persistValidationFactRecordedLog(ctx, store, request, fact); err != nil {
147147
return err
148148
}
149149
if err := c.applyFactToDerivedCaches(ctx, store, request, fact, created); err != nil {
@@ -172,7 +172,7 @@ func (c *Controller) Process(ctx context.Context, delivery consumer.Delivery) er
172172
}
173173
}
174174

175-
func (c *Controller) persistValidationFactRecorded(
175+
func (c *Controller) persistValidationFactRecordedLog(
176176
ctx context.Context,
177177
store storage.Storage,
178178
request entity.Request,

0 commit comments

Comments
 (0)