rescheduler 0.4.0 → 0.4.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (2) hide show
  1. data/lib/rescheduler.rb +51 -9
  2. metadata +1 -1
@@ -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
- next
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
- redis.lpush(rk_queue(q), qnid)
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) if ntry > 0
413
+ Kernel.sleep (rand(ntry * 1000) / 1000.0)
408
414
  else
409
415
  return # Done transfering
410
416
  end
411
417
  end
412
- ntry += 1
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
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: rescheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.0
4
+ version: 0.4.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors: