Skip to content

Commit 433ae5b

Browse files
committed
Improve naming, add to sandbox table on the first insert
1 parent dfc1d8a commit 433ae5b

File tree

4 files changed

+30
-32
lines changed

4 files changed

+30
-32
lines changed

packages/api/internal/orchestrator/lifecycle.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import (
1111
e2bcatalog "github.com/e2b-dev/infra/packages/shared/pkg/sandbox-catalog"
1212
)
1313

14-
func (o *Orchestrator) addToSandboxRoutingTable(ctx context.Context, sandbox sandbox.Sandbox) {
14+
func (o *Orchestrator) addSandboxToRoutingTable(ctx context.Context, sandbox sandbox.Sandbox) {
1515
node := o.GetNode(sandbox.ClusterID, sandbox.NodeID)
1616
if node == nil {
1717
logger.L().Error(ctx, "failed to get node", logger.WithNodeID(sandbox.NodeID))

packages/api/internal/orchestrator/orchestrator.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ func New(
145145
sandboxStorage,
146146
reservationStorage,
147147
sandbox.Callbacks{
148-
AddToSandboxRoutingTable: o.addToSandboxRoutingTable,
148+
AddSandboxToRoutingTable: o.addSandboxToRoutingTable,
149149
AsyncSandboxCounter: o.sandboxCounterInsert,
150150
AsyncNewlyCreatedSandbox: o.handleNewlyCreatedSandbox,
151151
},

packages/api/internal/sandbox/store.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,8 @@ func WithOnlyExpired(isExpired bool) ItemsOption {
5151
}
5252

5353
type Callbacks struct {
54-
// AddToSandboxRoutingTable should be called sync to prevent race conditions where we would know where to route the sandbox
55-
AddToSandboxRoutingTable InsertCallback
54+
// AddSandboxToRoutingTable should be called sync to prevent race conditions where we would know where to route the sandbox
55+
AddSandboxToRoutingTable InsertCallback
5656
// AsyncSandboxCounter should be called async to prevent blocking the main goroutine
5757
AsyncSandboxCounter InsertCallback
5858
// AsyncNewlyCreatedSandbox should be called async to prevent blocking the main goroutine
@@ -94,6 +94,7 @@ func (s *Store) Add(ctx context.Context, sandbox Sandbox, newlyCreated bool) err
9494
err := s.storage.Add(ctx, sandbox)
9595
if err == nil {
9696
// Count only newly added sandboxes to the store
97+
s.callbacks.AddSandboxToRoutingTable(ctx, sandbox)
9798
go s.callbacks.AsyncSandboxCounter(context.WithoutCancel(ctx), sandbox)
9899
} else {
99100
// There's a race condition when the sandbox is added from node sync
@@ -115,9 +116,6 @@ func (s *Store) Add(ctx context.Context, sandbox Sandbox, newlyCreated bool) err
115116
finishStart(sandbox, nil)
116117
}
117118

118-
// Add sandbox info to node for routing
119-
s.callbacks.AddToSandboxRoutingTable(ctx, sandbox)
120-
121119
if newlyCreated {
122120
go s.callbacks.AsyncNewlyCreatedSandbox(context.WithoutCancel(ctx), sandbox)
123121
}

packages/api/internal/sandbox/store_test.go

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,7 @@ func TestAdd_NewSandbox(t *testing.T) {
189189

190190
tracker := NewCallbackTracker(3) // Expect 3 callbacks
191191
callbacks := sandbox.Callbacks{
192-
AddToSandboxRoutingTable: tracker.Track("AddToSandboxRoutingTable"),
192+
AddSandboxToRoutingTable: tracker.Track("AddSandboxToRoutingTable"),
193193
AsyncSandboxCounter: tracker.Track("AsyncSandboxCounter"),
194194
AsyncNewlyCreatedSandbox: tracker.Track("AsyncNewlyCreatedSandbox"),
195195
}
@@ -207,7 +207,7 @@ func TestAdd_NewSandbox(t *testing.T) {
207207
require.NoError(t, err)
208208

209209
// Verify all callbacks called exactly once
210-
tracker.AssertCallCount(t, "AddToSandboxRoutingTable", 1)
210+
tracker.AssertCallCount(t, "AddSandboxToRoutingTable", 1)
211211
tracker.AssertCallCount(t, "AsyncSandboxCounter", 1)
212212
tracker.AssertCallCount(t, "AsyncNewlyCreatedSandbox", 1)
213213

@@ -228,7 +228,7 @@ func TestAdd_AlreadyInCache(t *testing.T) {
228228
// First add with all 3 callbacks
229229
tracker1 := NewCallbackTracker(3)
230230
callbacks1 := sandbox.Callbacks{
231-
AddToSandboxRoutingTable: tracker1.Track("AddToSandboxRoutingTable"),
231+
AddSandboxToRoutingTable: tracker1.Track("AddSandboxToRoutingTable"),
232232
AsyncSandboxCounter: tracker1.Track("AsyncSandboxCounter"),
233233
AsyncNewlyCreatedSandbox: tracker1.Track("AsyncNewlyCreatedSandbox"),
234234
}
@@ -241,9 +241,9 @@ func TestAdd_AlreadyInCache(t *testing.T) {
241241

242242
// Second add with newlyCreated=true, only 2 callbacks
243243
// (AsyncSandboxCounter is NOT called because already in cache)
244-
tracker2 := NewCallbackTracker(2)
244+
tracker2 := NewCallbackTracker(1)
245245
callbacks2 := sandbox.Callbacks{
246-
AddToSandboxRoutingTable: tracker2.Track("AddToSandboxRoutingTable"),
246+
AddSandboxToRoutingTable: tracker2.Track("AddSandboxToRoutingTable"),
247247
AsyncSandboxCounter: tracker2.Track("AsyncSandboxCounter"),
248248
AsyncNewlyCreatedSandbox: tracker2.Track("AsyncNewlyCreatedSandbox"),
249249
}
@@ -253,12 +253,12 @@ func TestAdd_AlreadyInCache(t *testing.T) {
253253
tracker2.WaitForCalls(t, 2*time.Second)
254254

255255
require.NoError(t, err)
256-
tracker2.AssertCallCount(t, "AddToSandboxRoutingTable", 1)
256+
tracker2.AssertNotCalled(t, "AddSandboxToRoutingTable")
257257
tracker2.AssertNotCalled(t, "AsyncSandboxCounter") // NOT called when already in cache!
258258
tracker2.AssertCallCount(t, "AsyncNewlyCreatedSandbox", 1)
259259
})
260260

261-
t.Run("newlyCreated=false - only AddToSandboxRoutingTable called when already in cache", func(t *testing.T) {
261+
t.Run("newlyCreated=false - only AddSandboxToRoutingTable called when already in cache", func(t *testing.T) {
262262
ctx := t.Context()
263263

264264
storage := memory.NewStorage()
@@ -267,7 +267,7 @@ func TestAdd_AlreadyInCache(t *testing.T) {
267267
// First add with newlyCreated=true
268268
tracker1 := NewCallbackTracker(3)
269269
callbacks1 := sandbox.Callbacks{
270-
AddToSandboxRoutingTable: tracker1.Track("AddToSandboxRoutingTable"),
270+
AddSandboxToRoutingTable: tracker1.Track("AddSandboxToRoutingTable"),
271271
AsyncSandboxCounter: tracker1.Track("AsyncSandboxCounter"),
272272
AsyncNewlyCreatedSandbox: tracker1.Track("AsyncNewlyCreatedSandbox"),
273273
}
@@ -280,9 +280,9 @@ func TestAdd_AlreadyInCache(t *testing.T) {
280280

281281
// Second add with newlyCreated=false, only 1 callback
282282
// (AsyncSandboxCounter NOT called because already in cache)
283-
tracker2 := NewCallbackTracker(1)
283+
tracker2 := NewCallbackTracker(0)
284284
callbacks2 := sandbox.Callbacks{
285-
AddToSandboxRoutingTable: tracker2.Track("AddToSandboxRoutingTable"),
285+
AddSandboxToRoutingTable: tracker2.Track("AddSandboxToRoutingTable"),
286286
AsyncSandboxCounter: tracker2.Track("AsyncSandboxCounter"),
287287
AsyncNewlyCreatedSandbox: tracker2.Track("AsyncNewlyCreatedSandbox"),
288288
}
@@ -292,14 +292,14 @@ func TestAdd_AlreadyInCache(t *testing.T) {
292292
tracker2.WaitForCalls(t, 2*time.Second)
293293

294294
require.NoError(t, err)
295-
tracker2.AssertCallCount(t, "AddToSandboxRoutingTable", 1)
295+
tracker2.AssertNotCalled(t, "AddSandboxToRoutingTable")
296296
tracker2.AssertNotCalled(t, "AsyncSandboxCounter") // NOT called when already in cache
297297
tracker2.AssertNotCalled(t, "AsyncNewlyCreatedSandbox")
298298
})
299299
}
300300

301301
func TestAdd_NotNewlyCreated(t *testing.T) {
302-
t.Run("not in cache - AddToSandboxRoutingTable and AsyncSandboxCounter called", func(t *testing.T) {
302+
t.Run("not in cache - AddSandboxToRoutingTable and AsyncSandboxCounter called", func(t *testing.T) {
303303
ctx := t.Context()
304304

305305
storage := memory.NewStorage()
@@ -308,7 +308,7 @@ func TestAdd_NotNewlyCreated(t *testing.T) {
308308
// Add with newlyCreated=false, expect 2 callbacks
309309
tracker := NewCallbackTracker(2)
310310
callbacks := sandbox.Callbacks{
311-
AddToSandboxRoutingTable: tracker.Track("AddToSandboxRoutingTable"),
311+
AddSandboxToRoutingTable: tracker.Track("AddSandboxToRoutingTable"),
312312
AsyncSandboxCounter: tracker.Track("AsyncSandboxCounter"),
313313
AsyncNewlyCreatedSandbox: tracker.Track("AsyncNewlyCreatedSandbox"),
314314
}
@@ -319,12 +319,12 @@ func TestAdd_NotNewlyCreated(t *testing.T) {
319319
tracker.WaitForCalls(t, 2*time.Second)
320320

321321
require.NoError(t, err)
322-
tracker.AssertCallCount(t, "AddToSandboxRoutingTable", 1)
322+
tracker.AssertCallCount(t, "AddSandboxToRoutingTable", 1)
323323
tracker.AssertCallCount(t, "AsyncSandboxCounter", 1)
324324
tracker.AssertNotCalled(t, "AsyncNewlyCreatedSandbox")
325325
})
326326

327-
t.Run("already in cache - only AddToSandboxRoutingTable called", func(t *testing.T) {
327+
t.Run("already in cache - only AddSandboxToRoutingTable called", func(t *testing.T) {
328328
ctx := t.Context()
329329

330330
storage := memory.NewStorage()
@@ -333,7 +333,7 @@ func TestAdd_NotNewlyCreated(t *testing.T) {
333333
// First add
334334
tracker1 := NewCallbackTracker(2)
335335
callbacks1 := sandbox.Callbacks{
336-
AddToSandboxRoutingTable: tracker1.Track("AddToSandboxRoutingTable"),
336+
AddSandboxToRoutingTable: tracker1.Track("AddSandboxToRoutingTable"),
337337
AsyncSandboxCounter: tracker1.Track("AsyncSandboxCounter"),
338338
AsyncNewlyCreatedSandbox: tracker1.Track("AsyncNewlyCreatedSandbox"),
339339
}
@@ -345,9 +345,9 @@ func TestAdd_NotNewlyCreated(t *testing.T) {
345345
require.NoError(t, err)
346346

347347
// Second add with same sandbox, newlyCreated=false, only 1 callback
348-
tracker2 := NewCallbackTracker(1)
348+
tracker2 := NewCallbackTracker(0)
349349
callbacks2 := sandbox.Callbacks{
350-
AddToSandboxRoutingTable: tracker2.Track("AddToSandboxRoutingTable"),
350+
AddSandboxToRoutingTable: tracker2.Track("AddSandboxToRoutingTable"),
351351
AsyncSandboxCounter: tracker2.Track("AsyncSandboxCounter"),
352352
AsyncNewlyCreatedSandbox: tracker2.Track("AsyncNewlyCreatedSandbox"),
353353
}
@@ -357,7 +357,7 @@ func TestAdd_NotNewlyCreated(t *testing.T) {
357357
tracker2.WaitForCalls(t, 2*time.Second)
358358

359359
require.NoError(t, err)
360-
tracker2.AssertCallCount(t, "AddToSandboxRoutingTable", 1)
360+
tracker2.AssertNotCalled(t, "AddSandboxToRoutingTable")
361361
tracker2.AssertNotCalled(t, "AsyncSandboxCounter") // NOT called when already in cache
362362
tracker2.AssertNotCalled(t, "AsyncNewlyCreatedSandbox")
363363
})
@@ -377,7 +377,7 @@ func TestAdd_StorageErrors(t *testing.T) {
377377
// Expect 0 callbacks since error should be returned immediately
378378
tracker := NewCallbackTracker(1)
379379
callbacks := sandbox.Callbacks{
380-
AddToSandboxRoutingTable: tracker.Track("AddToSandboxRoutingTable"),
380+
AddSandboxToRoutingTable: tracker.Track("AddSandboxToRoutingTable"),
381381
AsyncSandboxCounter: tracker.Track("AsyncSandboxCounter"),
382382
AsyncNewlyCreatedSandbox: tracker.Track("AsyncNewlyCreatedSandbox"),
383383
}
@@ -394,7 +394,7 @@ func TestAdd_StorageErrors(t *testing.T) {
394394
time.Sleep(100 * time.Millisecond)
395395

396396
// No callbacks should have been called
397-
tracker.AssertNotCalled(t, "AddToSandboxRoutingTable")
397+
tracker.AssertNotCalled(t, "AddSandboxToRoutingTable")
398398
tracker.AssertNotCalled(t, "AsyncSandboxCounter")
399399
tracker.AssertNotCalled(t, "AsyncNewlyCreatedSandbox")
400400
})
@@ -411,7 +411,7 @@ func TestAdd_ConcurrentCalls(t *testing.T) {
411411
tracker := NewCallbackTracker(numGoroutines * 3) // Each add calls 3 callbacks
412412

413413
callbacks := sandbox.Callbacks{
414-
AddToSandboxRoutingTable: tracker.Track("AddToSandboxRoutingTable"),
414+
AddSandboxToRoutingTable: tracker.Track("AddSandboxToRoutingTable"),
415415
AsyncSandboxCounter: tracker.Track("AsyncSandboxCounter"),
416416
AsyncNewlyCreatedSandbox: tracker.Track("AsyncNewlyCreatedSandbox"),
417417
}
@@ -448,7 +448,7 @@ func TestAdd_ConcurrentCalls(t *testing.T) {
448448
tracker.WaitForCalls(t, 5*time.Second)
449449

450450
// Verify all callbacks were called expected number of times
451-
tracker.AssertCallCount(t, "AddToSandboxRoutingTable", numGoroutines)
451+
tracker.AssertCallCount(t, "AddSandboxToRoutingTable", numGoroutines)
452452
tracker.AssertCallCount(t, "AsyncSandboxCounter", numGoroutines)
453453
tracker.AssertCallCount(t, "AsyncNewlyCreatedSandbox", numGoroutines)
454454

@@ -475,7 +475,7 @@ func TestAdd_ConcurrentCalls(t *testing.T) {
475475
tracker := NewCallbackTracker(3 + (numGoroutines-1)*2)
476476

477477
callbacks := sandbox.Callbacks{
478-
AddToSandboxRoutingTable: tracker.Track("AddToSandboxRoutingTable"),
478+
AddSandboxToRoutingTable: tracker.Track("AddSandboxToRoutingTable"),
479479
AsyncSandboxCounter: tracker.Track("AsyncSandboxCounter"),
480480
AsyncNewlyCreatedSandbox: tracker.Track("AsyncNewlyCreatedSandbox"),
481481
}
@@ -503,7 +503,7 @@ func TestAdd_ConcurrentCalls(t *testing.T) {
503503
tracker.WaitForCalls(t, 5*time.Second)
504504

505505
// Verify callbacks
506-
tracker.AssertCallCount(t, "AddToSandboxRoutingTable", numGoroutines)
506+
tracker.AssertCallCount(t, "AddSandboxToRoutingTable", numGoroutines)
507507
tracker.AssertCallCount(t, "AsyncSandboxCounter", 1) // Only called once (first successful add)
508508
tracker.AssertCallCount(t, "AsyncNewlyCreatedSandbox", numGoroutines) // All calls have newlyCreated=true
509509

0 commit comments

Comments
 (0)