rescheduler 0.4.0 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|
|