Skip to content

Commit f0b6284

Browse files
authored
Remove operation conflict check from newversion executor (#696)
1 parent 605717e commit f0b6284

File tree

2 files changed

+38
-1
lines changed

2 files changed

+38
-1
lines changed

internal/core/services/schedulers/scheduler_manager.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,12 @@ func (s *SchedulerManager) CreateNewSchedulerVersionAndEnqueueSwitchVersion(ctx
130130
return err
131131
}
132132

133-
op, err := s.EnqueueSwitchActiveVersionOperation(ctx, scheduler.Name, scheduler.Spec.Version)
133+
// Conflict checks are not performed here because this method runs only inside
134+
// the operation executor. Checking for conflicts at this point would cause the
135+
// operation to block itself. All conflict validation is handled earlier, when
136+
// operations are enqueued at the API level.
137+
opDef := &switchversion.Definition{NewActiveVersion: scheduler.Spec.Version}
138+
op, err := s.operationManager.CreateOperation(ctx, scheduler.Name, opDef)
134139
if err != nil {
135140
return fmt.Errorf("error enqueuing switch active version operation: %w", err)
136141
}

internal/core/services/schedulers/scheduler_manager_test.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,38 @@ func TestCreateNewSchedulerVersion(t *testing.T) {
155155

156156
}
157157

158+
func TestCreateNewSchedulerVersionAndEnqueueSwitchVersion(t *testing.T) {
159+
err := validations.RegisterValidations()
160+
if err != nil {
161+
t.Errorf("unexpected error %d'", err)
162+
}
163+
164+
ctx := context.Background()
165+
mockCtrl := gomock.NewController(t)
166+
167+
schedulerStorage := mockports.NewMockSchedulerStorage(mockCtrl)
168+
operationManager := mock.NewMockOperationManager(mockCtrl)
169+
roomStorage := mockports.NewMockRoomStorage(mockCtrl)
170+
schedulerCache := mockports.NewMockSchedulerCache(mockCtrl)
171+
schedulerManager := NewSchedulerManager(schedulerStorage, schedulerCache, operationManager, roomStorage)
172+
173+
t.Run("succeeds without conflict checking - called from operation executor", func(t *testing.T) {
174+
scheduler := newValidScheduler()
175+
scheduler.Spec.Version = "v2.0.0"
176+
177+
schedulerStorage.EXPECT().RunWithTransaction(ctx, gomock.Any()).DoAndReturn(
178+
func(ctx context.Context, fn func(ports.TransactionID) error) error {
179+
return fn(ports.TransactionID("test-transaction-id"))
180+
})
181+
schedulerStorage.EXPECT().CreateSchedulerVersion(ctx, ports.TransactionID("test-transaction-id"), scheduler).Return(nil)
182+
operationManager.EXPECT().CreateOperation(ctx, scheduler.Name, gomock.Any()).Return(&operation.Operation{ID: "switch-op-id"}, nil)
183+
184+
opID, err := schedulerManager.CreateNewSchedulerVersionAndEnqueueSwitchVersion(ctx, scheduler)
185+
require.NoError(t, err)
186+
require.Equal(t, "switch-op-id", opID)
187+
})
188+
}
189+
158190
func TestEnqueueNewSchedulerVersionOperation(t *testing.T) {
159191
mockCtrl := gomock.NewController(t)
160192

0 commit comments

Comments
 (0)