mini_scheduler 0.10.0 → 0.11.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 61de19d47b5090c36a179869a01800506ee364629db64f47df963426c1d9a8b6
4
- data.tar.gz: faa1b86a2d625fa570b26dd8ad8a2ccdb15fcd6029f1d93ad67ddefb0301342a
3
+ metadata.gz: d84546928a92e57ef72f4af8a5125c6d1ac12cddd32cd3b4203f819754b8c754
4
+ data.tar.gz: a5a8406b9c15ef74ea8729991137ebcc37f80ea4a367e7f9ce5da11cc6620ab9
5
5
  SHA512:
6
- metadata.gz: 931ae1731d9c1b49b3c861ec5b401d317e436f9548494c6fc9cd7b242c5d9bd932459bdf5598f9e7ca24abe8c46d585a43d75cac8a2772f7a04bc77fcf6ad27d
7
- data.tar.gz: 82ef45be2249b8c5d6834aeeb13f3f72e4b23604436a68246bba46350ad49255d0f9adf6ac262f685c189d9fc6670c8247776ab3b2d4eaf1f9b7e55b87a63515
6
+ metadata.gz: c8b0a9e24bc8b785ffb0a4a01b4cef24a403604ec92851d862533b306ceab23008dad5419a7833e7c4f625d32206604f3308360db8942f61b7c254b0c2603a1d
7
+ data.tar.gz: e2f99830e4ede44cd66fba4d206cb6d2c16e712e0df30888a8677ec8b5ac6db78d3538da92769985cc84e8f211025f1682c51aa41716a034e39a5b49cdeeb56a
@@ -1,3 +1,8 @@
1
+ # 0.11.0 - 24-06-2019
2
+
3
+ - Correct situation where distributed mutex could end in a tight loop when
4
+ redis could not be contacted
5
+
1
6
  # 0.9.2 - 26-04-2019
2
7
 
3
8
  - Correct UI so it displays durations that are longer than a minute
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  if defined?(ActiveRecord::Base)
2
4
  module MiniScheduler
3
5
  class Stat < ActiveRecord::Base
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  require 'rails/generators'
2
4
  require 'rails/generators/migration'
3
5
  require 'active_record'
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  class CreateMiniSchedulerStats < ActiveRecord::Migration[4.2]
2
4
  def change
3
5
  create_table :scheduler_stats do |t|
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  MiniScheduler.configure do |config|
2
4
  # An instance of Redis. See https://github.com/redis/redis-rb
3
5
 
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  require "mini_scheduler/engine"
2
3
  require 'mini_scheduler/schedule'
3
4
  require 'mini_scheduler/schedule_info'
@@ -1,5 +1,8 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MiniScheduler
2
4
  class DistributedMutex
5
+ class Timeout < StandardError; end
3
6
 
4
7
  @default_redis = nil
5
8
 
@@ -18,11 +21,26 @@ module MiniScheduler
18
21
  @mutex = Mutex.new
19
22
  end
20
23
 
24
+ MAX_POLLING_ATTEMPTS ||= 60
25
+ BASE_SLEEP_DURATION ||= 0.001
26
+ MAX_SLEEP_DURATION ||= 1
27
+
21
28
  # NOTE wrapped in mutex to maintain its semantics
22
29
  def synchronize
23
30
  @mutex.lock
31
+
32
+ attempts = 0
33
+ sleep_duration = BASE_SLEEP_DURATION
24
34
  while !try_to_get_lock
25
- sleep 0.001
35
+
36
+ sleep(sleep_duration)
37
+
38
+ if sleep_duration < MAX_SLEEP_DURATION
39
+ sleep_duration = [sleep_duration * 2, MAX_SLEEP_DURATION].min
40
+ end
41
+
42
+ attempts += 1
43
+ raise Timeout if attempts >= MAX_POLLING_ATTEMPTS
26
44
  end
27
45
 
28
46
  yield
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  if defined?(::Rails)
2
4
  module MiniScheduler
3
5
  class Engine < ::Rails::Engine
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MiniScheduler
2
4
  class Manager
3
5
  attr_accessor :random_ratio, :redis, :enable_stats, :queue
@@ -8,6 +10,8 @@ module MiniScheduler
8
10
  @mutex = Mutex.new
9
11
  @queue = Queue.new
10
12
  @manager = manager
13
+ @hostname = manager.hostname
14
+
11
15
  @reschedule_orphans_thread = Thread.new do
12
16
  while !@stopped
13
17
  sleep 60
@@ -45,20 +49,17 @@ module MiniScheduler
45
49
  end
46
50
 
47
51
  def hostname
48
- @hostname ||= begin
49
- `hostname`
50
- rescue
51
- "unknown"
52
- end
52
+ @hostname
53
53
  end
54
54
 
55
55
  def process_queue
56
56
 
57
57
  klass = @queue.deq
58
- return unless klass
59
-
60
58
  # hack alert, I need to both deq and set @running atomically.
61
59
  @running = true
60
+
61
+ return if !klass
62
+
62
63
  failed = false
63
64
  start = Time.now.to_f
64
65
  info = @mutex.synchronize { @manager.schedule_info(klass) }
@@ -145,7 +146,8 @@ module MiniScheduler
145
146
  sleep 0.001
146
147
  end
147
148
  # this is a hack, but is only used for test anyway
148
- sleep 0.001
149
+ # if tests fail that depend on this we are forced to increase it.
150
+ sleep 0.010
149
151
  while @running
150
152
  sleep 0.001
151
153
  end
@@ -169,7 +171,6 @@ module MiniScheduler
169
171
 
170
172
  def initialize(options = nil)
171
173
  @queue = options && options[:queue] || "default"
172
-
173
174
  @redis = MiniScheduler.redis
174
175
  @random_ratio = 0.1
175
176
  unless options && options[:skip_runner]
@@ -192,7 +193,11 @@ module MiniScheduler
192
193
  end
193
194
 
194
195
  def hostname
195
- @hostname ||= `hostname`.strip
196
+ @hostname ||= begin
197
+ `hostname`.strip
198
+ rescue
199
+ "unknown"
200
+ end
196
201
  end
197
202
 
198
203
  def schedule_info(klass)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MiniScheduler::Schedule
2
4
 
3
5
  def queue(value = nil)
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MiniScheduler
2
4
  class ScheduleInfo
3
5
  attr_accessor :next_run,
@@ -1,3 +1,5 @@
1
+ # frozen_string_literal: true
2
+
1
3
  module MiniScheduler
2
- VERSION = "0.10.0"
4
+ VERSION = "0.11.0"
3
5
  end
@@ -1,3 +1,4 @@
1
+ # frozen_string_literal: true
1
2
  # Based off sidetiq https://github.com/tobiassvn/sidetiq/blob/master/lib/sidetiq/web.rb
2
3
  module MiniScheduler
3
4
  module Web
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: mini_scheduler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.10.0
4
+ version: 0.11.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sam Saffron
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2019-05-23 00:00:00.000000000 Z
12
+ date: 2019-06-24 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: sidekiq