rescheduler 0.4.0 → 0.4.1
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rescheduler.rb +51 -9
- metadata +1 -1
data/lib/rescheduler.rb
CHANGED
@@ -9,10 +9,6 @@ module Rescheduler
|
|
9
9
|
attr_accessor :config
|
10
10
|
self.config = {}
|
11
11
|
|
12
|
-
# Debugging only (since initializers won't reload)
|
13
|
-
self.config[:prefix] = REDIS_PREFIX # This ensures cross DB deployment persistence
|
14
|
-
self.config[:redis] = RedisHelper.redis
|
15
|
-
|
16
12
|
#==========================
|
17
13
|
# Management routines
|
18
14
|
def prefix
|
@@ -70,7 +66,7 @@ module Rescheduler
|
|
70
66
|
|
71
67
|
unless quls # Retry
|
72
68
|
log_debug('Contention during stats')
|
73
|
-
|
69
|
+
return {:jobs=>{'Job contention'=>{}}}
|
74
70
|
end
|
75
71
|
|
76
72
|
qus.each_with_index do |k, idx|
|
@@ -339,6 +335,7 @@ module Rescheduler
|
|
339
335
|
newopt = sopt.dup
|
340
336
|
newopt[:due_at] = (sopt[:due_at] || Time.now).to_i + sopt[:recur_every].to_i
|
341
337
|
newopt.delete(:due_in) # In case the first job was specified by :due_in
|
338
|
+
log_debug("---Enqueue #{qnid}: due_every #{sopt[:due_every]}")
|
342
339
|
enqueue(newopt)
|
343
340
|
end
|
344
341
|
|
@@ -346,6 +343,7 @@ module Rescheduler
|
|
346
343
|
newopt = sopt.dup
|
347
344
|
newopt[:due_at] = time_from_recur_daily(sopt[:recur_daily])
|
348
345
|
newopt.delete(:due_in) # In case the first job was specified by :due_in
|
346
|
+
log_debug("---Enqueue #{qnid}: due_daily #{sopt[:recur_daily]}")
|
349
347
|
enqueue(newopt)
|
350
348
|
end
|
351
349
|
|
@@ -396,20 +394,64 @@ module Rescheduler
|
|
396
394
|
|
397
395
|
redis.multi
|
398
396
|
redis.zremrangebyscore(dtn, 0, curtime)
|
397
|
+
to_push = {}
|
399
398
|
tasks.each do |qnid|
|
400
|
-
q = qnid_to_queue(qnid)
|
401
|
-
|
399
|
+
q = rk_queue(qnid_to_queue(qnid))
|
400
|
+
to_push[q] ||= []
|
401
|
+
to_push[q] << qnid
|
402
|
+
end
|
403
|
+
|
404
|
+
to_push.each do |q, qnids|
|
405
|
+
redis.lpush(q, qnids) # Batch command
|
402
406
|
end
|
407
|
+
|
403
408
|
if !redis.exec
|
404
409
|
# Contention happens, retrying
|
405
410
|
# Sleep a random amount of time after first try
|
411
|
+
ntry += 1
|
406
412
|
log_debug("service_deferred_jobs contention")
|
407
|
-
Kernel.sleep (rand(ntry * 1000) / 1000.0)
|
413
|
+
Kernel.sleep (rand(ntry * 1000) / 1000.0)
|
408
414
|
else
|
409
415
|
return # Done transfering
|
410
416
|
end
|
411
417
|
end
|
412
|
-
|
418
|
+
|
419
|
+
if ntry > 3 # Max number of tries
|
420
|
+
# Fall back to
|
421
|
+
service_one_deferred_job
|
422
|
+
return
|
423
|
+
end
|
424
|
+
end
|
425
|
+
end
|
426
|
+
|
427
|
+
def service_one_deferred_jobs
|
428
|
+
dtn = rk_deferred # Make a copy in case prefix changes
|
429
|
+
ntry = 0
|
430
|
+
curtime = Time.now.to_i
|
431
|
+
loop do
|
432
|
+
redis.watch(dtn) do
|
433
|
+
tasks = redis.zrangebyscore(dtn, 0, curtime, :limit=>[0,1])
|
434
|
+
if tasks.empty?
|
435
|
+
redis.unwatch
|
436
|
+
return # Nothing to transfer, moving on.
|
437
|
+
end
|
438
|
+
|
439
|
+
qnid = tasks[0]
|
440
|
+
q = qnid_to_queue(qnid)
|
441
|
+
|
442
|
+
redis.multi
|
443
|
+
redis.zrem(dtn, qnid)
|
444
|
+
redis.lpush(rk_queue(q), qnid)
|
445
|
+
if !redis.exec
|
446
|
+
# Contention happens, retrying
|
447
|
+
# Sleep a random amount of time after first try
|
448
|
+
log_debug("service_one_deferred_job contention")
|
449
|
+
ntry += 1
|
450
|
+
Kernel.sleep (rand(ntry * 1000) / 1000.0)
|
451
|
+
else
|
452
|
+
break # Done transfering one job
|
453
|
+
end
|
454
|
+
end
|
413
455
|
end
|
414
456
|
end
|
415
457
|
|