@@ -40,22 +40,28 @@ var denySchedulersByLabelerCounter = labeler.LabelerEventCounter.WithLabelValues
4040// Controller is used to manage all schedulers.
4141type Controller struct {
4242 sync.RWMutex
43- wg sync.WaitGroup
44- ctx context.Context
45- cluster sche.SchedulerCluster
46- storage endpoint.ConfigStorage
47- schedulers map [string ]* ScheduleController
48- opController * operator.Controller
43+ wg sync.WaitGroup
44+ ctx context.Context
45+ cluster sche.SchedulerCluster
46+ storage endpoint.ConfigStorage
47+ // schedulers is used to manage all schedulers, which will only be initialized
48+ // and used in the PD leader service mode now.
49+ schedulers map [string ]* ScheduleController
50+ // schedulerHandlers is used to manage the HTTP handlers of schedulers,
51+ // which will only be initialized and used in the API service mode now.
52+ schedulerHandlers map [string ]http.Handler
53+ opController * operator.Controller
4954}
5055
5156// NewController creates a scheduler controller.
5257func NewController (ctx context.Context , cluster sche.SchedulerCluster , storage endpoint.ConfigStorage , opController * operator.Controller ) * Controller {
5358 return & Controller {
54- ctx : ctx ,
55- cluster : cluster ,
56- storage : storage ,
57- schedulers : make (map [string ]* ScheduleController ),
58- opController : opController ,
59+ ctx : ctx ,
60+ cluster : cluster ,
61+ storage : storage ,
62+ schedulers : make (map [string ]* ScheduleController ),
63+ schedulerHandlers : make (map [string ]http.Handler ),
64+ opController : opController ,
5965 }
6066}
6167
@@ -86,6 +92,9 @@ func (c *Controller) GetSchedulerNames() []string {
8692func (c * Controller ) GetSchedulerHandlers () map [string ]http.Handler {
8793 c .RLock ()
8894 defer c .RUnlock ()
95+ if len (c .schedulerHandlers ) > 0 {
96+ return c .schedulerHandlers
97+ }
8998 handlers := make (map [string ]http.Handler , len (c .schedulers ))
9099 for name , scheduler := range c .schedulers {
91100 handlers [name ] = scheduler .Scheduler
@@ -117,6 +126,50 @@ func (c *Controller) ResetSchedulerMetrics() {
117126 schedulerStatusGauge .Reset ()
118127}
119128
129+ // AddSchedulerHandler adds the HTTP handler for a scheduler.
130+ func (c * Controller ) AddSchedulerHandler (scheduler Scheduler , args ... string ) error {
131+ c .Lock ()
132+ defer c .Unlock ()
133+
134+ name := scheduler .GetName ()
135+ if _ , ok := c .schedulerHandlers [name ]; ok {
136+ return errs .ErrSchedulerExisted .FastGenByArgs ()
137+ }
138+
139+ c .schedulerHandlers [name ] = scheduler
140+ c .cluster .GetSchedulerConfig ().AddSchedulerCfg (scheduler .GetType (), args )
141+ return nil
142+ }
143+
144+ // RemoveSchedulerHandler removes the HTTP handler for a scheduler.
145+ func (c * Controller ) RemoveSchedulerHandler (name string ) error {
146+ c .Lock ()
147+ defer c .Unlock ()
148+ if c .cluster == nil {
149+ return errs .ErrNotBootstrapped .FastGenByArgs ()
150+ }
151+ s , ok := c .schedulerHandlers [name ]
152+ if ! ok {
153+ return errs .ErrSchedulerNotFound .FastGenByArgs ()
154+ }
155+
156+ conf := c .cluster .GetSchedulerConfig ()
157+ conf .RemoveSchedulerCfg (s .(Scheduler ).GetType ())
158+ if err := conf .Persist (c .storage ); err != nil {
159+ log .Error ("the option can not persist scheduler config" , errs .ZapError (err ))
160+ return err
161+ }
162+
163+ if err := c .storage .RemoveScheduleConfig (name ); err != nil {
164+ log .Error ("can not remove the scheduler config" , errs .ZapError (err ))
165+ return err
166+ }
167+
168+ delete (c .schedulerHandlers , name )
169+
170+ return nil
171+ }
172+
120173// AddScheduler adds a scheduler.
121174func (c * Controller ) AddScheduler (scheduler Scheduler , args ... string ) error {
122175 c .Lock ()
@@ -249,8 +302,9 @@ func (c *Controller) IsSchedulerExisted(name string) (bool, error) {
249302 if c .cluster == nil {
250303 return false , errs .ErrNotBootstrapped .FastGenByArgs ()
251304 }
252- _ , ok := c .schedulers [name ]
253- if ! ok {
305+ _ , existScheduler := c .schedulers [name ]
306+ _ , existHandler := c .schedulerHandlers [name ]
307+ if ! existScheduler && ! existHandler {
254308 return false , errs .ErrSchedulerNotFound .FastGenByArgs ()
255309 }
256310 return true , nil
0 commit comments