@@ -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
474462type 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