mini_scheduler 0.10.0 → 0.11.0

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