Skip to content

Commit 74c45d8

Browse files
committed
Fix scheduling metadata being nil on sandbox create
When GetTemplate is called for a new sandbox, headers were pre-filled with nil using resolvedHeader(nil), which immediately marked the SetOnce as 'done'. When Fetch loaded actual headers from storage, they couldn't update the SetOnce because it was already set. This caused SchedulingMetadata() to return nil on create. Changed GetTemplate to pass unresolved SetOnce instances and modified Fetch to load headers from storage when they are unset.
1 parent 7abe525 commit 74c45d8

2 files changed

Lines changed: 42 additions & 14 deletions

File tree

packages/orchestrator/pkg/sandbox/template/cache.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -193,8 +193,8 @@ func (c *Cache) GetTemplate(
193193
storageTemplate, err := newTemplateFromStorage(
194194
c.config.BuilderConfig,
195195
buildID,
196-
resolvedHeader(nil),
197-
resolvedHeader(nil),
196+
utils.NewSetOnce[*header.Header](),
197+
utils.NewSetOnce[*header.Header](),
198198
persistence,
199199
c.blockMetrics,
200200
nil,

packages/orchestrator/pkg/sandbox/template/storage_template.go

Lines changed: 40 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -176,14 +176,28 @@ func (t *storageTemplate) Fetch(ctx context.Context, buildStore *build.DiffStore
176176
})
177177

178178
wg.Go(func() error {
179-
memHdr, hdrErr := t.memfileHeader.WaitWithContext(ctx)
179+
memHdr, hdrErr := t.memfileHeader.Result()
180180
if hdrErr != nil {
181-
errMsg := fmt.Errorf("failed to resolve memfile header: %w", hdrErr)
182-
if err := t.memfile.SetError(errMsg); err != nil {
183-
return fmt.Errorf("failed to set memfile error: %w", errors.Join(errMsg, err))
181+
if _, notSet := hdrErr.(utils.NotSetError); notSet {
182+
// Header not set yet, load it from storage
183+
loadedHdr, loadErr := header.LoadHeader(ctx, t.persistence, t.paths.MemfileHeader())
184+
if loadErr != nil && !errors.Is(loadErr, storage.ErrObjectNotExist) {
185+
errMsg := fmt.Errorf("failed to load memfile header: %w", loadErr)
186+
if err := t.memfile.SetError(errMsg); err != nil {
187+
return fmt.Errorf("failed to set memfile error: %w", errors.Join(errMsg, err))
188+
}
189+
return nil
190+
}
191+
// Set the header (may be nil if not found)
192+
_ = t.memfileHeader.SetValue(loadedHdr)
193+
memHdr = loadedHdr
194+
} else {
195+
errMsg := fmt.Errorf("failed to resolve memfile header: %w", hdrErr)
196+
if err := t.memfile.SetError(errMsg); err != nil {
197+
return fmt.Errorf("failed to set memfile error: %w", errors.Join(errMsg, err))
198+
}
199+
return nil
184200
}
185-
186-
return nil
187201
}
188202

189203
memfileStorage, memfileErr := NewStorage(
@@ -214,14 +228,28 @@ func (t *storageTemplate) Fetch(ctx context.Context, buildStore *build.DiffStore
214228
})
215229

216230
wg.Go(func() error {
217-
rootHdr, hdrErr := t.rootfsHeader.WaitWithContext(ctx)
231+
rootHdr, hdrErr := t.rootfsHeader.Result()
218232
if hdrErr != nil {
219-
errMsg := fmt.Errorf("failed to resolve rootfs header: %w", hdrErr)
220-
if err := t.rootfs.SetError(errMsg); err != nil {
221-
return fmt.Errorf("failed to set rootfs error: %w", errors.Join(errMsg, err))
233+
if _, notSet := hdrErr.(utils.NotSetError); notSet {
234+
// Header not set yet, load it from storage
235+
loadedHdr, loadErr := header.LoadHeader(ctx, t.persistence, t.paths.RootfsHeader())
236+
if loadErr != nil && !errors.Is(loadErr, storage.ErrObjectNotExist) {
237+
errMsg := fmt.Errorf("failed to load rootfs header: %w", loadErr)
238+
if err := t.rootfs.SetError(errMsg); err != nil {
239+
return fmt.Errorf("failed to set rootfs error: %w", errors.Join(errMsg, err))
240+
}
241+
return nil
242+
}
243+
// Set the header (may be nil if not found)
244+
_ = t.rootfsHeader.SetValue(loadedHdr)
245+
rootHdr = loadedHdr
246+
} else {
247+
errMsg := fmt.Errorf("failed to resolve rootfs header: %w", hdrErr)
248+
if err := t.rootfs.SetError(errMsg); err != nil {
249+
return fmt.Errorf("failed to set rootfs error: %w", errors.Join(errMsg, err))
250+
}
251+
return nil
222252
}
223-
224-
return nil
225253
}
226254

227255
rootfsStorage, rootfsErr := NewStorage(

0 commit comments

Comments
 (0)