// execute some action in the deferred context of the process, but only if we // match the stage of the process at the time the action is executed. func (stage stageType) Do(p *SchedulerProcess, a proc.Action) <-chan error { errOnce := proc.NewErrorOnce(p.fin) errOuter := p.Do(proc.Action(func() { switch stage { case standbyStage: //await standby signal or death select { case <-p.standby: case <-p.Done(): } case masterStage: //await elected signal or death select { case <-p.elected: case <-p.Done(): } case finStage: errOnce.Reportf("scheduler process is dying, dropping action") return default: } errOnce.Report(stage.When(p, a)) })) return errOnce.Send(errOuter).Err() }
func (self *SchedulerProcess) Elect(newDriver DriverFactory) { errOnce := proc.NewErrorOnce(self.fin) proc.OnError(errOnce.Send(standbyStage.Do(self, proc.Action(func() { if !(&self.stage).transition(standbyStage, masterStage) { log.Errorf("failed to transition from standby to master stage, aborting") self.End() return } log.Infoln("scheduler process entered master stage") drv, err := newDriver() if err != nil { log.Errorf("failed to fetch scheduler driver: %v", err) self.End() return } log.V(1).Infoln("starting driver...") stat, err := drv.Start() if stat == mesos.Status_DRIVER_RUNNING && err == nil { log.Infoln("driver started successfully and is running") close(self.elected) go func() { defer self.End() _, err := drv.Join() if err != nil { log.Errorf("driver failed with error: %v", err) } errOnce.Report(err) }() return } defer self.End() if err != nil { log.Errorf("failed to start scheduler driver: %v", err) } else { log.Errorf("expected RUNNING status, not %v", stat) } }))).Err(), func(err error) { defer self.End() log.Errorf("failed to handle election event, aborting: %v", err) }, self.fin) }
func (self *SchedulerProcess) ExecutorLost(drv bindings.SchedulerDriver, eid *mesos.ExecutorID, sid *mesos.SlaveID, x int) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.ExecutorLost(drv, eid, sid, x) }))) }
func (self *SchedulerProcess) SlaveLost(drv bindings.SchedulerDriver, sid *mesos.SlaveID) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.SlaveLost(drv, sid) }))) }
func (self *SchedulerProcess) FrameworkMessage(drv bindings.SchedulerDriver, eid *mesos.ExecutorID, sid *mesos.SlaveID, m string) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.FrameworkMessage(drv, eid, sid, m) }))) }
func (self *SchedulerProcess) StatusUpdate(drv bindings.SchedulerDriver, ts *mesos.TaskStatus) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.StatusUpdate(drv, ts) }))) }
func (self *SchedulerProcess) OfferRescinded(drv bindings.SchedulerDriver, oid *mesos.OfferID) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.OfferRescinded(drv, oid) }))) }
func (self *SchedulerProcess) ResourceOffers(drv bindings.SchedulerDriver, off []*mesos.Offer) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.ResourceOffers(drv, off) }))) }
func (self *SchedulerProcess) Disconnected(drv bindings.SchedulerDriver) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.Disconnected(drv) }))) }
func (self *SchedulerProcess) Reregistered(drv bindings.SchedulerDriver, mi *mesos.MasterInfo) { self.logError(self.Master().Do(proc.Action(func() { self.Scheduler.Reregistered(drv, mi) }))) }