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.
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: