Skip to content
This repository was archived by the owner on Feb 7, 2025. It is now read-only.

Commit d687e0e

Browse files
committed
fix: still run tasks even if node is disabled
crawlab-team/crawlab#1226
1 parent 3bb0d1e commit d687e0e

File tree

3 files changed

+5
-141
lines changed

3 files changed

+5
-141
lines changed

interfaces/task_scheduler_service.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,6 @@ type TaskSchedulerService interface {
99
TaskBaseService
1010
// Enqueue task into the task queue
1111
Enqueue(t Task) (err error)
12-
// DequeueAndSchedule continuously dequeue task and schedule to corresponding node
13-
DequeueAndSchedule()
14-
// Dequeue task with node info from the task queue
15-
Dequeue() (tasks []Task, err error)
16-
// Schedule task to corresponding node
17-
Schedule(tasks []Task) (err error)
1812
// Cancel task to corresponding node
1913
Cancel(id primitive.ObjectID, args ...interface{}) (err error)
2014
// SetInterval set the interval or duration between two adjacent fetches

task/handler/service.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,11 @@ func (svc *Service) Fetch() {
8686
continue
8787
}
8888

89+
// skip if node is not active or enabled
90+
if !n.GetActive() || !n.GetEnabled() {
91+
continue
92+
}
93+
8994
// validate if there are available runners
9095
if svc.getRunnerCount() >= n.GetMaxRunners() {
9196
continue

task/scheduler/service.go

Lines changed: 0 additions & 135 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/crawlab-team/crawlab-db/mongo"
2020
grpc "github.com/crawlab-team/crawlab-grpc"
2121
"github.com/crawlab-team/go-trace"
22-
"github.com/joeshaw/multierror"
2322
"github.com/spf13/viper"
2423
"go.mongodb.org/mongo-driver/bson"
2524
"go.mongodb.org/mongo-driver/bson/primitive"
@@ -93,140 +92,6 @@ func (svc *Service) Enqueue(t interfaces.Task) (err error) {
9392
return nil
9493
}
9594

96-
func (svc *Service) DequeueAndSchedule() {
97-
for {
98-
if svc.IsStopped() {
99-
return
100-
}
101-
102-
// wait
103-
time.Sleep(svc.interval)
104-
105-
if err := mongo.RunTransaction(func(sc mongo2.SessionContext) error {
106-
// dequeue tasks
107-
tasks, err := svc.Dequeue()
108-
if err != nil {
109-
return trace.TraceError(err)
110-
}
111-
112-
// skip if no tasks available
113-
if tasks == nil || len(tasks) == 0 {
114-
return nil
115-
}
116-
117-
// schedule tasks
118-
if err := svc.Schedule(tasks); err != nil {
119-
return trace.TraceError(err)
120-
}
121-
122-
return nil
123-
}); err != nil {
124-
trace.PrintError(err)
125-
}
126-
}
127-
}
128-
129-
func (svc *Service) Dequeue() (tasks []interfaces.Task, err error) {
130-
// get task queue items
131-
tqList, err := svc.getTaskQueueItems()
132-
if err != nil {
133-
return nil, err
134-
}
135-
if tqList == nil {
136-
return nil, nil
137-
}
138-
139-
// match resources
140-
tasks, nodesMap, err := svc.matchResources(tqList)
141-
if err != nil {
142-
return nil, err
143-
}
144-
if tasks == nil {
145-
return nil, nil
146-
}
147-
148-
// update resources
149-
if err := svc.updateResources(nodesMap); err != nil {
150-
return nil, err
151-
}
152-
153-
// update tasks
154-
if err := svc.updateTasks(tasks); err != nil {
155-
return nil, err
156-
}
157-
158-
// delete task queue items
159-
if err := svc.deleteTaskQueueItems(tasks); err != nil {
160-
return nil, err
161-
}
162-
163-
return tasks, nil
164-
}
165-
166-
func (svc *Service) Schedule(tasks []interfaces.Task) (err error) {
167-
var e multierror.Errors
168-
169-
// nodes cache
170-
nodesCache := sync.Map{}
171-
172-
// wait group
173-
wg := sync.WaitGroup{}
174-
wg.Add(len(tasks))
175-
176-
// iterate tasks and execute each of them
177-
for _, t := range tasks {
178-
go func(t interfaces.Task) {
179-
var err error
180-
181-
// node of the task
182-
var n interfaces.Node
183-
res, ok := nodesCache.Load(t.GetNodeId())
184-
if !ok {
185-
// not exists in cache
186-
n, err = svc.modelSvc.GetNodeById(t.GetNodeId())
187-
if err == nil {
188-
nodesCache.Store(n.GetId(), n)
189-
}
190-
} else {
191-
// exists in cache
192-
n, ok = res.(interfaces.Node)
193-
if !ok {
194-
err = errors.ErrorTaskInvalidType
195-
}
196-
}
197-
if err != nil {
198-
e = append(e, err)
199-
svc.handleTaskError(n, t, err)
200-
wg.Done()
201-
return
202-
}
203-
204-
// schedule task
205-
if n.GetIsMaster() {
206-
// execute task on master
207-
err = svc.handlerSvc.Run(t.GetId())
208-
} else {
209-
// send to execute task on worker nodes
210-
err = svc.svr.SendStreamMessageWithData("node:"+n.GetKey(), grpc.StreamMessageCode_RUN_TASK, t)
211-
}
212-
if err != nil {
213-
e = append(e, err)
214-
svc.handleTaskError(n, t, err)
215-
wg.Done()
216-
return
217-
}
218-
219-
// success
220-
wg.Done()
221-
}(t)
222-
}
223-
224-
// wait
225-
wg.Wait()
226-
227-
return e.Err()
228-
}
229-
23095
func (svc *Service) Cancel(id primitive.ObjectID, args ...interface{}) (err error) {
23196
// user
23297
u := utils.GetUserFromArgs(args...)

0 commit comments

Comments
 (0)