func (l LevelDBDriver) Save(job *driver.Job) (err error) { defer l.RWLocker.Unlock() l.RWLocker.Lock() batch := new(leveldb.Batch) var isNew = true if job.Id > 0 { isNew = false } else { last_id, e := l.db.Get([]byte(PRE_SEQUENCE+"JOB"), nil) if e != nil || last_id == nil { job.Id = 1 } else { id, _ := strconv.ParseInt(string(last_id), 10, 64) job.Id = id + 1 } } var strId = strconv.FormatInt(job.Id, 10) if isNew { batch.Put([]byte(PRE_SEQUENCE+"JOB"), []byte(strId)) batch.Put([]byte(PRE_JOB_FUNC+job.Func+":"+job.Name), []byte(strId)) } else { old, e := l.get(job.Id) if e != nil || old.Id == 0 { err = errors.New(fmt.Sprintf("Update Job %d fail, the old job is not exists.", job.Id)) return } l.cache.Remove(PRE_JOB + strId) if old.Name != job.Name { batch.Delete([]byte(PRE_JOB_FUNC + job.Func + ":" + old.Name)) batch.Put([]byte(PRE_JOB_FUNC+job.Func+":"+job.Name), []byte(strId)) } } batch.Put([]byte(PRE_JOB+strId), job.Bytes()) err = l.db.Write(batch, nil) return }
func (client *Client) HandleSubmitJob(msgId int64, payload []byte) (err error) { var job driver.Job var e error var conn = client.conn var sched = client.sched defer sched.JobLocker.Unlock() sched.JobLocker.Lock() job, e = driver.NewJob(payload) if e != nil { err = conn.Send([]byte(e.Error())) return } is_new := true changed := false job.Status = driver.JOB_STATUS_READY oldJob, e := sched.driver.GetOne(job.Func, job.Name) if e == nil && oldJob.Id > 0 { job.Id = oldJob.Id if oldJob.Status == driver.JOB_STATUS_PROC { sched.DecrStatProc(oldJob) sched.removeRevertPQ(job) changed = true } is_new = false } e = sched.driver.Save(&job) if e != nil { err = conn.Send([]byte(e.Error())) return } if is_new { sched.IncrStatJob(job) } if is_new || changed { sched.pushJobPQ(job) } sched.NotifyJobTimer() err = client.HandleCommand(msgId, protocol.SUCCESS) return }