mirror of https://github.com/shunfei/cronsun
parent
93832d66a8
commit
f236df65aa
17
job.go
17
job.go
|
@ -70,7 +70,7 @@ type Job struct {
|
|||
// 用于存储分隔后的任务
|
||||
cmd []string
|
||||
// 控制同时执行任务数
|
||||
count int64
|
||||
Count *int64 `json:"-"`
|
||||
}
|
||||
|
||||
type JobRule struct {
|
||||
|
@ -169,13 +169,13 @@ func (j *Job) limit() bool {
|
|||
|
||||
// 更精确的控制是加锁
|
||||
// 两次运行时间极为接近的任务才可能出现控制不精确的情况
|
||||
count := atomic.LoadInt64(&j.count)
|
||||
count := atomic.LoadInt64(j.Count)
|
||||
if j.Parallels <= count {
|
||||
j.Fail(time.Now(), fmt.Sprintf("job[%s] running on[%s] running:[%d]", j.Key(), j.runOn, count))
|
||||
return true
|
||||
}
|
||||
|
||||
atomic.AddInt64(&j.count, 1)
|
||||
atomic.AddInt64(j.Count, 1)
|
||||
return false
|
||||
}
|
||||
|
||||
|
@ -183,7 +183,12 @@ func (j *Job) unlimit() {
|
|||
if j.Parallels == 0 {
|
||||
return
|
||||
}
|
||||
atomic.AddInt64(&j.count, -1)
|
||||
atomic.AddInt64(j.Count, -1)
|
||||
}
|
||||
|
||||
func (j *Job) Init(n string) {
|
||||
var c int64
|
||||
j.Count, j.runOn = &c, n
|
||||
}
|
||||
|
||||
func (c *Cmd) lockTtl() int64 {
|
||||
|
@ -377,10 +382,6 @@ func GetJobFromKv(kv *mvccpb.KeyValue) (job *Job, err error) {
|
|||
return
|
||||
}
|
||||
|
||||
func (j *Job) RunOn(n string) {
|
||||
j.runOn = n
|
||||
}
|
||||
|
||||
func (j *Job) alone() {
|
||||
if j.Kind == KindAlone {
|
||||
j.Parallels = 1
|
||||
|
|
|
@ -133,7 +133,7 @@ func (n *Node) loadJobs() (err error) {
|
|||
}
|
||||
|
||||
for _, job := range jobs {
|
||||
job.RunOn(n.ID)
|
||||
job.Init(n.ID)
|
||||
n.addJob(job, false)
|
||||
}
|
||||
|
||||
|
@ -189,6 +189,8 @@ func (n *Node) modJob(job *cronsun.Job) {
|
|||
|
||||
n.link.delJob(oJob)
|
||||
prevCmds := oJob.Cmds(n.ID, n.groups)
|
||||
|
||||
job.Count = oJob.Count
|
||||
*oJob = *job
|
||||
cmds := oJob.Cmds(n.ID, n.groups)
|
||||
|
||||
|
@ -312,6 +314,7 @@ func (n *Node) groupAddNode(g *cronsun.Group) {
|
|||
n.link.delGroupJob(g.ID, jid)
|
||||
continue
|
||||
}
|
||||
job.Init(n.ID)
|
||||
}
|
||||
|
||||
cmds := job.Cmds(n.ID, n.groups)
|
||||
|
@ -367,7 +370,7 @@ func (n *Node) watchJobs() {
|
|||
continue
|
||||
}
|
||||
|
||||
job.RunOn(n.ID)
|
||||
job.Init(n.ID)
|
||||
n.addJob(job, true)
|
||||
case ev.IsModify():
|
||||
job, err := cronsun.GetJobFromKv(ev.Kv)
|
||||
|
@ -376,7 +379,7 @@ func (n *Node) watchJobs() {
|
|||
continue
|
||||
}
|
||||
|
||||
job.RunOn(n.ID)
|
||||
job.Init(n.ID)
|
||||
n.modJob(job)
|
||||
case ev.Type == client.EventTypeDelete:
|
||||
n.delJob(cronsun.GetIDFromKey(string(ev.Kv.Key)))
|
||||
|
|
Loading…
Reference in New Issue