Skip to content

Commit f90ca6b

Browse files
authored
Fix potential task requeueing failure (#76)
1 parent e888846 commit f90ca6b

3 files changed

Lines changed: 29 additions & 24 deletions

File tree

‎handlers/getStatus.go‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import (
1212
)
1313

1414
var initTime = time.Now()
15-
var version = "1.19.0"
15+
var version = "1.19.1"
1616

1717
func getStatus(w http.ResponseWriter, r *http.Request) {
1818
json.NewEncoder(w).Encode(map[string]interface{}{

‎scraper/handleTaskError.go‎

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,24 @@ func handleTaskError(r *colly.Request, blocked bool, err error) {
1919
taskClient := r.Ctx.Get(metadataTaskClient)
2020
taskHash := r.Ctx.Get(metadataTaskHash)
2121

22+
taskQueue.ConfirmTaskCompletion(taskClient, taskHash)
23+
if taskRetries < viper.GetInt("taskretries") {
24+
taskQueue.AddTask(
25+
taskClient,
26+
taskHash,
27+
r.URL.String(),
28+
viper.GetBool("taskretryfront"),
29+
map[string]string{
30+
metadataTaskAddedAt: r.Ctx.Get(metadataTaskAddedAt),
31+
metadataTaskClient: taskClient,
32+
metadataTaskHash: taskHash,
33+
metadataTaskRegion: r.Ctx.Get(metadataTaskRegion),
34+
metadataTaskRetries: strconv.Itoa(taskRetries + 1),
35+
metadataTaskType: r.Ctx.Get(metadataTaskType),
36+
},
37+
)
38+
}
39+
2240
if blocked {
2341
logger.Error(fmt.Sprintf("Hit Imperva while loading %v, retries: %v", r.URL, taskRetries))
2442
} else if strings.Contains(err.Error(), "http2: Transport received GOAWAY from server ErrCode:INTERNAL_ERROR") {
@@ -40,23 +58,4 @@ func handleTaskError(r *colly.Request, blocked bool, err error) {
4058
} else {
4159
taskQueue.Pause(time.Duration(60-time.Now().Second()) * time.Second)
4260
}
43-
44-
taskQueue.ConfirmTaskCompletion(taskClient, taskHash)
45-
46-
if taskRetries < viper.GetInt("taskretries") {
47-
taskQueue.AddTask(
48-
taskClient,
49-
taskHash,
50-
r.URL.String(),
51-
viper.GetBool("taskretryfront"),
52-
map[string]string{
53-
metadataTaskAddedAt: r.Ctx.Get(metadataTaskAddedAt),
54-
metadataTaskClient: taskClient,
55-
metadataTaskHash: taskHash,
56-
metadataTaskRegion: r.Ctx.Get(metadataTaskRegion),
57-
metadataTaskRetries: strconv.Itoa(taskRetries + 1),
58-
metadataTaskType: r.Ctx.Get(metadataTaskType),
59-
},
60-
)
61-
}
6261
}

‎scraper/taskQueue.go‎

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@ var enqueueScript = redis.NewScript(`
2828
return 1
2929
`)
3030

31+
var confirmCompletionScript = redis.NewScript(`
32+
local clientsKey, hashesKey = KEYS[1], KEYS[2]
33+
local taskClient, hash = ARGV[1], ARGV[2]
34+
35+
redis.call("HINCRBY", clientsKey, taskClient, -1)
36+
redis.call("SREM", hashesKey, hash)
37+
return 1
38+
`)
39+
3140
type Task struct {
3241
Hash string
3342
Metadata map[string]string
@@ -198,8 +207,5 @@ func (q *TaskQueue) CountQueuedTasksForClient(taskClient string) (count int) {
198207
}
199208

200209
func (q *TaskQueue) ConfirmTaskCompletion(taskClient string, hash string) {
201-
pipe := q.rdb.Pipeline()
202-
pipe.HIncrBy(q.ctx, q.clientsKey, taskClient, -1)
203-
pipe.SRem(q.ctx, q.hashesKey, hash)
204-
_, _ = pipe.Exec(q.ctx)
210+
_, _ = confirmCompletionScript.Run(q.ctx, q.rdb, []string{q.clientsKey, q.hashesKey}, taskClient, hash).Result()
205211
}

0 commit comments

Comments
 (0)