func (c *client) handleRemoveJob(msgID, payload []byte) (err error) { var job driver.Job var e error var conn = c.conn var sched = c.sched defer sched.jobLocker.Unlock() sched.jobLocker.Lock() job, e = driver.NewJob(payload) if e != nil { err = conn.Send([]byte(e.Error())) return } job, e = sched.driver.GetOne(job.Func, job.Name) if e == nil && job.ID > 0 { if _, ok := sched.procQueue[job.ID]; ok { delete(sched.procQueue, job.ID) } sched.driver.Delete(job.ID) sched.decrStatJob(job) if job.IsProc() { sched.decrStatProc(job) sched.removeRevertPQ(job) } sched.notifyJobTimer() } if e != nil { err = conn.Send([]byte(e.Error())) } else { err = c.handleCommand(msgID, protocol.SUCCESS) } return }
func (c *httpClient) handleRemoveJob(req *http.Request) { var job driver.Job var e error var sched = c.sched defer sched.jobLocker.Unlock() sched.jobLocker.Lock() url := req.URL.String() funcName := url[1:] if funcName == "" { funcName = req.FormValue("func") } name := req.FormValue("name") job, e = sched.driver.GetOne(funcName, name) if e == nil && job.ID > 0 { if _, ok := sched.procQueue[job.ID]; ok { delete(sched.procQueue, job.ID) } sched.driver.Delete(job.ID) sched.decrStatJob(job) if job.IsProc() { sched.decrStatProc(job) sched.removeRevertPQ(job) } sched.notifyJobTimer() } if e != nil { c.sendErrResponse(e) } else { c.sendResponse("200 OK", []byte("{\"msg\": \""+protocol.SUCCESS.String()+"\"}")) } }
func (sched *Sched) removeRevertPQ(job driver.Job) { defer sched.PQLocker.Unlock() sched.PQLocker.Lock() if job.IsProc() && job.Timeout > 0 { for _, item := range sched.revertPQ { if item.Value == job.ID { heap.Remove(&sched.revertPQ, item.Index) break } } } }
func (c *httpClient) handleSubmitJob(req *http.Request) { var job driver.Job var e error var sched = c.sched defer sched.jobLocker.Unlock() sched.jobLocker.Lock() url := req.URL.String() funcName := url[1:] if funcName == "" { funcName = req.FormValue("func") } job.Name = req.FormValue("name") job.Func = funcName job.Args = req.FormValue("args") job.Timeout, _ = strconv.ParseInt(req.FormValue("timeout"), 10, 64) job.SchedAt, _ = strconv.ParseInt(req.FormValue("sched_at"), 10, 64) if job.Name == "" || job.Func == "" { c.sendErrResponse(errors.New("job name or func is required")) return } isNew := true changed := false job.SetReady() oldJob, e := sched.driver.GetOne(job.Func, job.Name) if e == nil && oldJob.ID > 0 { job.ID = oldJob.ID if job.IsProc() { sched.decrStatProc(oldJob) sched.removeRevertPQ(job) changed = true } isNew = false } e = sched.driver.Save(&job) if e != nil { c.sendErrResponse(e) return } if isNew { sched.incrStatJob(job) } if isNew || changed { sched.pushJobPQ(job) } sched.notifyJobTimer() c.sendResponse("200 OK", []byte("{\"msg\": \""+protocol.SUCCESS.String()+"\"}")) return }
func (sched *Sched) pushRevertPQ(job driver.Job) { defer sched.PQLocker.Unlock() sched.PQLocker.Lock() if job.IsProc() && job.Timeout > 0 { runAt := job.RunAt if runAt == 0 { runAt = job.SchedAt } item := &queue.Item{ Value: job.ID, Priority: runAt + job.Timeout, } heap.Push(&sched.revertPQ, item) } }
func (sched *Sched) decrStatProc(job driver.Job) { stat := sched.getFuncStat(job.Func) if job.IsProc() { stat.Processing.Decr() } }