// returns a Process instance that will only execute a proc.Action if the scheduler is the elected master func (self *SchedulerProcess) Master() proc.Process { return &masterProcess{ SchedulerProcess: self, doer: proc.DoWith(self, proc.DoerFunc(func(a proc.Action) <-chan error { return proc.ErrorChan(masterStage.When(self, a)) })), } }
// New creates a new QingYuanScheduler func New(config Config) *QingYuanScheduler { var k *QingYuanScheduler k = &QingYuanScheduler{ schedcfg: &config.Schedcfg, RWMutex: new(sync.RWMutex), executor: config.Executor, executorGroup: uid.Parse(config.Executor.ExecutorId.GetValue()).Group(), scheduleFunc: config.ScheduleFunc, client: config.Client, etcdClient: config.EtcdClient, failoverTimeout: config.FailoverTimeout, reconcileInterval: config.ReconcileInterval, offers: offers.CreateRegistry(offers.RegistryConfig{ Compat: func(o *mesos.Offer) bool { // filter the offers: the executor IDs must not identify a qinglet- // executor with a group that doesn't match ours for _, eid := range o.GetExecutorIds() { execuid := uid.Parse(eid.GetValue()) if execuid.Name() == execcfg.DefaultInfoID && execuid.Group() != k.executorGroup { return false } } return true }, DeclineOffer: func(id string) <-chan error { errOnce := proc.NewErrorOnce(k.terminate) errOuter := k.asRegisteredMaster.Do(func() { var err error defer errOnce.Report(err) offerId := mutil.NewOfferID(id) filters := &mesos.Filters{} _, err = k.driver.DeclineOffer(offerId, filters) }) return errOnce.Send(errOuter).Err() }, // remember expired offers so that we can tell if a previously scheduler offer relies on one LingerTTL: config.Schedcfg.OfferLingerTTL.Duration, TTL: config.Schedcfg.OfferTTL.Duration, ListenerDelay: config.Schedcfg.ListenerDelay.Duration, }), slaves: newSlaveStorage(), taskRegistry: podtask.NewInMemoryRegistry(), reconcileCooldown: config.ReconcileCooldown, registration: make(chan struct{}), asRegisteredMaster: proc.DoerFunc(func(proc.Action) <-chan error { return proc.ErrorChanf("cannot execute action with unregistered scheduler") }), } return k }
func (k *QingYuanScheduler) Init(electedMaster proc.Process, pl PluginInterface, mux *http.ServeMux) error { log.V(1).Infoln("initializing qingyuan mesos scheduler") k.asRegisteredMaster = proc.DoerFunc(func(a proc.Action) <-chan error { if !k.registered { return proc.ErrorChanf("failed to execute action, scheduler is disconnected") } return electedMaster.Do(a) }) k.terminate = electedMaster.Done() k.plugin = pl k.offers.Init(k.terminate) k.InstallDebugHandlers(mux) return k.recoverTasks() }