Skip to content

Commit 1b1fd6d

Browse files
committed
fix: promote schedulers on creation if controller is leader
Signed-off-by: Calum Murray <cmurray@redhat.com>
1 parent e5c425e commit 1b1fd6d

1 file changed

Lines changed: 39 additions & 17 deletions

File tree

control-plane/pkg/reconciler/consumergroup/controller.go

Lines changed: 39 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -209,20 +209,8 @@ func NewController(ctx context.Context, watcher configmap.Watcher) *controller.I
209209

210210
impl := cgreconciler.NewImpl(ctx, r, func(impl *controller.Impl) controller.Options {
211211
return controller.Options{
212-
PromoteFunc: func(bkt reconciler.Bucket) {
213-
for _, value := range schedulerMgr.getAll() {
214-
if ss, ok := value.Scheduler.(*statefulsetscheduler.StatefulSetScheduler); ok {
215-
ss.Promote(bkt, nil)
216-
}
217-
}
218-
},
219-
DemoteFunc: func(bkt reconciler.Bucket) {
220-
for _, value := range schedulerMgr.getAll() {
221-
if ss, ok := value.Scheduler.(*statefulsetscheduler.StatefulSetScheduler); ok {
222-
ss.Demote(bkt)
223-
}
224-
}
225-
},
212+
PromoteFunc: schedulerMgr.promote,
213+
DemoteFunc: schedulerMgr.demote,
226214
}
227215
})
228216

@@ -472,8 +460,9 @@ func createStatefulSetScheduler(ctx context.Context, c SchedulerConfig, lister s
472460
}
473461

474462
type schedulerManager struct {
475-
mu sync.RWMutex
476-
schedulers map[string]Scheduler
463+
mu sync.RWMutex
464+
schedulers map[string]Scheduler // protected by mu
465+
leaderBucket reconciler.Bucket // protected by mu
477466

478467
ctx context.Context
479468
config SchedulerConfig
@@ -522,7 +511,16 @@ func (sm *schedulerManager) createSchedulerForStatefulSet(ssName string) bool {
522511
logger := logging.FromContext(sm.ctx)
523512
logger.Infow("Creating scheduler for StatefulSet", zap.String("statefulset", ssName), zap.String("scheduler", schedulerKey))
524513

525-
sm.schedulers[schedulerKey] = createKafkaScheduler(sm.ctx, sm.config, ssName, sm.dispatcherPodInformer)
514+
scheduler := createKafkaScheduler(sm.ctx, sm.config, ssName, sm.dispatcherPodInformer)
515+
sm.schedulers[schedulerKey] = scheduler
516+
517+
// If we're already leader, promote the new scheduler immediately
518+
if sm.leaderBucket != nil {
519+
if ss, ok := scheduler.Scheduler.(*statefulsetscheduler.StatefulSetScheduler); ok {
520+
ss.Promote(sm.leaderBucket, nil)
521+
}
522+
}
523+
526524
return true
527525
}
528526

@@ -545,3 +543,27 @@ func (sm *schedulerManager) removeSchedulerForStatefulSet(ssName string) bool {
545543
delete(sm.schedulers, schedulerKey)
546544
return true
547545
}
546+
547+
func (sm *schedulerManager) promote(bkt reconciler.Bucket) {
548+
sm.mu.Lock()
549+
defer sm.mu.Unlock()
550+
551+
sm.leaderBucket = bkt
552+
for _, value := range sm.schedulers {
553+
if ss, ok := value.Scheduler.(*statefulsetscheduler.StatefulSetScheduler); ok {
554+
ss.Promote(bkt, nil)
555+
}
556+
}
557+
}
558+
559+
func (sm *schedulerManager) demote(bkt reconciler.Bucket) {
560+
sm.mu.Lock()
561+
defer sm.mu.Unlock()
562+
563+
sm.leaderBucket = nil
564+
for _, value := range sm.schedulers {
565+
if ss, ok := value.Scheduler.(*statefulsetscheduler.StatefulSetScheduler); ok {
566+
ss.Demote(bkt)
567+
}
568+
}
569+
}

0 commit comments

Comments
 (0)