autoscaler 0.3.0 → 0.4.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.
- data/CHANGELOG.md +4 -0
- data/README.md +4 -0
- data/lib/autoscaler/binary_scaling_strategy.rb +26 -0
- data/lib/autoscaler/sidekiq/celluloid_monitor.rb +15 -23
- data/lib/autoscaler/sidekiq/client.rb +5 -1
- data/lib/autoscaler/sidekiq/entire_queue_system.rb +44 -0
- data/lib/autoscaler/sidekiq/monitor_middleware_adapter.rb +15 -3
- data/lib/autoscaler/sidekiq/queue_system.rb +8 -60
- data/lib/autoscaler/sidekiq/sleep_wait_server.rb +1 -1
- data/lib/autoscaler/sidekiq/specified_queue_system.rb +49 -0
- data/lib/autoscaler/version.rb +1 -1
- data/spec/autoscaler/binary_scaling_strategy_spec.rb +19 -0
- data/spec/autoscaler/sidekiq/celluloid_monitor_spec.rb +7 -15
- data/spec/autoscaler/sidekiq/entire_queue_system_spec.rb +61 -0
- data/spec/autoscaler/sidekiq/{queue_system_spec.rb → specified_queue_system_spec.rb} +12 -12
- data/spec/test_system.rb +10 -0
- metadata +13 -4
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,9 @@
|
|
1
1
|
# Changelog
|
2
2
|
|
3
|
+
## 0.4.0
|
4
|
+
|
5
|
+
- Experimental: The default scaling logic is contained in BinaryScalingStrategy. A strategy object can be passed instead of timeout to the server middleware.
|
6
|
+
|
3
7
|
## 0.3.0
|
4
8
|
|
5
9
|
- Downscale method changed from busy-waiting workers to a separate monitor process
|
data/README.md
CHANGED
@@ -42,6 +42,10 @@ Install the middleware in your `Sidekiq.configure_` blocks
|
|
42
42
|
- The retry and schedule lists are considered - if you schedule a long-running task, the process will not scale-down.
|
43
43
|
- If background jobs trigger jobs in other scaled processes, please note you'll need `config.client_middleware` in your `Sidekiq.configure_server` block in order to scale-up.
|
44
44
|
|
45
|
+
## Experimental
|
46
|
+
|
47
|
+
You can pass a scaling strategy object instead of the timeout to the server middleware. The object (or lambda) should respond to `#call(system, idle_time)` and return the desired number of workers. See `lib/autoscaler/binary_scaling_strategy.rb` for an example.
|
48
|
+
|
45
49
|
## Tests
|
46
50
|
|
47
51
|
The project is setup to run RSpec with Guard. It expects a redis instance on a custom port, which is started by the Guardfile.
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Autoscaler
|
2
|
+
# Strategies determine the target number of workers
|
3
|
+
# The default strategy has a single worker when there is anything, or shuts it down.
|
4
|
+
class BinaryScalingStrategy
|
5
|
+
#@params [integer] active_workers number of workers when in the active state.
|
6
|
+
def initialize(active_workers = 1)
|
7
|
+
@active_workers = active_workers
|
8
|
+
end
|
9
|
+
|
10
|
+
# @param [QueueSystem] system interface to the queuing system
|
11
|
+
# @param [Numeric] event_idle_time number of seconds since a job related event
|
12
|
+
# @return [Integer] target number of workers
|
13
|
+
def call(system, event_idle_time)
|
14
|
+
if active?(system)
|
15
|
+
@active_workers
|
16
|
+
else
|
17
|
+
0
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
def active?(system)
|
23
|
+
system.queued > 0 || system.scheduled > 0 || system.retrying > 0 || system.workers > 0
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -7,27 +7,28 @@ module Autoscaler
|
|
7
7
|
include Celluloid
|
8
8
|
|
9
9
|
# @param [scaler] scaler object that actually performs scaling operations (e.g. {HerokuScaler})
|
10
|
-
# @param [
|
11
|
-
# @param [System] system interface to the queuing system
|
12
|
-
def initialize(scaler,
|
10
|
+
# @param [Strategy] strategy object that decides the target number of workers (e.g. {BinaryScalingStrategy})
|
11
|
+
# @param [System] system interface to the queuing system for use by the strategy
|
12
|
+
def initialize(scaler, strategy, system)
|
13
13
|
@scaler = scaler
|
14
|
-
@
|
15
|
-
@poll = [timeout/4.0, 0.5].max
|
14
|
+
@strategy = strategy
|
16
15
|
@system = system
|
17
16
|
@running = false
|
18
17
|
end
|
19
18
|
|
20
|
-
#
|
21
|
-
|
19
|
+
# Periodically update the desired number of workers
|
20
|
+
# @param [Numeric] interval polling interval, mostly for testing
|
21
|
+
def wait_for_downscale(interval = 15)
|
22
22
|
once do
|
23
23
|
active_now!
|
24
24
|
|
25
|
-
|
26
|
-
sleep(@poll)
|
27
|
-
update_activity
|
28
|
-
end
|
25
|
+
workers = @scaler.workers
|
29
26
|
|
30
|
-
|
27
|
+
begin
|
28
|
+
sleep(interval)
|
29
|
+
target_workers = @strategy.call(@system, idle_time)
|
30
|
+
workers = @scaler.workers = target_workers unless workers == target_workers
|
31
|
+
end while workers > 0
|
31
32
|
end
|
32
33
|
end
|
33
34
|
|
@@ -42,22 +43,13 @@ module Autoscaler
|
|
42
43
|
end
|
43
44
|
|
44
45
|
private
|
45
|
-
attr_reader :system
|
46
|
-
|
47
|
-
def active?
|
48
|
-
system.pending_work? || system.working?
|
49
|
-
end
|
50
|
-
|
51
|
-
def update_activity
|
52
|
-
active_now! if active?
|
53
|
-
end
|
54
46
|
|
55
47
|
def active_now!
|
56
48
|
@activity = Time.now
|
57
49
|
end
|
58
50
|
|
59
|
-
def
|
60
|
-
|
51
|
+
def idle_time
|
52
|
+
Time.now - @activity
|
61
53
|
end
|
62
54
|
|
63
55
|
def once
|
@@ -11,7 +11,11 @@ module Autoscaler
|
|
11
11
|
|
12
12
|
# Sidekiq middleware api method
|
13
13
|
def call(worker_class, item, queue)
|
14
|
-
|
14
|
+
scaler = @scalers[queue]
|
15
|
+
if scaler && scaler.workers < 1
|
16
|
+
scaler.workers = 1
|
17
|
+
end
|
18
|
+
|
15
19
|
yield
|
16
20
|
end
|
17
21
|
end
|
@@ -0,0 +1,44 @@
|
|
1
|
+
require 'sidekiq/api'
|
2
|
+
|
3
|
+
module Autoscaler
|
4
|
+
module Sidekiq
|
5
|
+
# Interface to to interrogate the queuing system
|
6
|
+
# Includes every queue
|
7
|
+
class EntireQueueSystem
|
8
|
+
# @return [Integer] number of worker actively engaged
|
9
|
+
def workers
|
10
|
+
::Sidekiq::Workers.new.size
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Integer] amount work ready to go
|
14
|
+
def queued
|
15
|
+
sidekiq_queues.values.map(&:to_i).reduce(&:+)
|
16
|
+
end
|
17
|
+
|
18
|
+
# @return [Integer] amount of work scheduled for some time in the future
|
19
|
+
def scheduled
|
20
|
+
count_sorted_set("schedule")
|
21
|
+
end
|
22
|
+
|
23
|
+
# @return [Integer] amount of work still being retried
|
24
|
+
def retrying
|
25
|
+
count_sorted_set("retry")
|
26
|
+
end
|
27
|
+
|
28
|
+
# @return [Array[String]]
|
29
|
+
def queue_names
|
30
|
+
sidekiq_queues.keys
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def sidekiq_queues
|
36
|
+
::Sidekiq::Stats.new.queues
|
37
|
+
end
|
38
|
+
|
39
|
+
def count_sorted_set(sorted_set)
|
40
|
+
::Sidekiq::SortedSet.new(sorted_set).count
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
@@ -1,5 +1,7 @@
|
|
1
1
|
require 'autoscaler/sidekiq/queue_system'
|
2
2
|
require 'autoscaler/sidekiq/celluloid_monitor'
|
3
|
+
require 'autoscaler/binary_scaling_strategy'
|
4
|
+
require 'autoscaler/delayed_shutdown'
|
3
5
|
|
4
6
|
module Autoscaler
|
5
7
|
module Sidekiq
|
@@ -7,12 +9,14 @@ module Autoscaler
|
|
7
9
|
# Starts the monitor and notifies it of job events that may occur while it's sleeping
|
8
10
|
class MonitorMiddlewareAdapter
|
9
11
|
# @param [scaler] scaler object that actually performs scaling operations (e.g. {HerokuScaler})
|
10
|
-
# @param [Numeric] timeout
|
12
|
+
# @param [Strategy,Numeric] timeout strategy object that determines target workers, or a timeout to be passed to {DelayedShutdown}+{BinaryScalingStrategy}
|
11
13
|
# @param [Array[String]] specified_queues list of queues to monitor to determine if there is work left. Defaults to all sidekiq queues.
|
12
14
|
def initialize(scaler, timeout, specified_queues = nil)
|
13
|
-
system = QueueSystem.new(specified_queues)
|
14
15
|
unless monitor
|
15
|
-
CelluloidMonitor.supervise_as(:autoscaler_monitor,
|
16
|
+
CelluloidMonitor.supervise_as(:autoscaler_monitor,
|
17
|
+
scaler,
|
18
|
+
strategy(timeout),
|
19
|
+
QueueSystem.new(specified_queues))
|
16
20
|
end
|
17
21
|
end
|
18
22
|
|
@@ -28,6 +32,14 @@ module Autoscaler
|
|
28
32
|
def monitor
|
29
33
|
Celluloid::Actor[:autoscaler_monitor]
|
30
34
|
end
|
35
|
+
|
36
|
+
def strategy(timeout)
|
37
|
+
if timeout.respond_to?(:call)
|
38
|
+
timeout
|
39
|
+
else
|
40
|
+
DelayedShutdown.new(BinaryScalingStrategy.new, timeout)
|
41
|
+
end
|
42
|
+
end
|
31
43
|
end
|
32
44
|
end
|
33
45
|
end
|
@@ -1,72 +1,20 @@
|
|
1
1
|
require 'sidekiq/api'
|
2
|
+
require 'autoscaler/sidekiq/specified_queue_system'
|
3
|
+
require 'autoscaler/sidekiq/entire_queue_system'
|
2
4
|
|
3
5
|
module Autoscaler
|
4
6
|
module Sidekiq
|
5
7
|
# Interface to to interrogate the queuing system
|
6
|
-
|
8
|
+
# convenience constructor for SpecifiedQueueSystem and EntireQueueSystem
|
9
|
+
module QueueSystem
|
7
10
|
# @param [Array[String]] specified_queues list of queues to monitor to determine if there is work left. Defaults to all sidekiq queues.
|
8
|
-
def
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
# @return [boolean] whether there is queued work - does not include work currently in progress
|
13
|
-
def pending_work?
|
14
|
-
refresh_sidekiq_queues!
|
15
|
-
queued_work? || scheduled_work? || retry_work?
|
16
|
-
end
|
17
|
-
|
18
|
-
# @return [boolean] whether there are workers actively running
|
19
|
-
def working?
|
20
|
-
workers > 0
|
21
|
-
end
|
22
|
-
|
23
|
-
# @return [Array[String]]
|
24
|
-
def queue_names
|
25
|
-
(@specified_queues || sidekiq_queues.keys)
|
26
|
-
end
|
27
|
-
|
28
|
-
private
|
29
|
-
def queued_work?
|
30
|
-
queue_names.any? {|name| sidekiq_queues[name].to_i > 0 }
|
31
|
-
end
|
32
|
-
|
33
|
-
def scheduled_work?
|
34
|
-
empty_sorted_set?("schedule")
|
35
|
-
end
|
36
|
-
|
37
|
-
def retry_work?
|
38
|
-
empty_sorted_set?("retry")
|
39
|
-
end
|
40
|
-
|
41
|
-
attr_reader :sidekiq_queues
|
42
|
-
|
43
|
-
def refresh_sidekiq_queues!
|
44
|
-
@sidekiq_queues = ::Sidekiq::Stats.new.queues
|
45
|
-
end
|
46
|
-
|
47
|
-
def empty_sorted_set?(sorted_set)
|
48
|
-
ss = ::Sidekiq::SortedSet.new(sorted_set)
|
49
|
-
ss.any? { |job| queue_names.include?(job.queue) }
|
50
|
-
end
|
51
|
-
|
52
|
-
def workers
|
53
|
-
if @specified_queues
|
54
|
-
specified_workers
|
11
|
+
def self.new(specified_queues = nil)
|
12
|
+
if specified_queues
|
13
|
+
SpecifiedQueueSystem.new(specified_queues)
|
55
14
|
else
|
56
|
-
|
15
|
+
EntireQueueSystem.new
|
57
16
|
end
|
58
17
|
end
|
59
|
-
|
60
|
-
def total_workers
|
61
|
-
::Sidekiq::Workers.new.size
|
62
|
-
end
|
63
|
-
|
64
|
-
def specified_workers
|
65
|
-
refresh_sidekiq_queues!
|
66
|
-
::Sidekiq::Workers.new.count {|name, work|
|
67
|
-
queue_names.include?(work['queue'])
|
68
|
-
}
|
69
|
-
end
|
70
18
|
end
|
71
19
|
end
|
72
20
|
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'sidekiq/api'
|
2
|
+
|
3
|
+
module Autoscaler
|
4
|
+
module Sidekiq
|
5
|
+
# Interface to to interrogate the queuing system
|
6
|
+
# Includes only the queues provided to the constructor
|
7
|
+
class SpecifiedQueueSystem
|
8
|
+
# @param [Array[String]] specified_queues list of queues to monitor to determine if there is work left. Defaults to all sidekiq queues.
|
9
|
+
def initialize(specified_queues)
|
10
|
+
@queue_names = specified_queues
|
11
|
+
end
|
12
|
+
|
13
|
+
# @return [Integer] number of worker actively engaged
|
14
|
+
def workers
|
15
|
+
::Sidekiq::Workers.new.count {|name, work|
|
16
|
+
queue_names.include?(work['queue'])
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
# @return [Integer] amount work ready to go
|
21
|
+
def queued
|
22
|
+
queue_names.map {|name| sidekiq_queues[name].to_i}.reduce(&:+)
|
23
|
+
end
|
24
|
+
|
25
|
+
# @return [Integer] amount of work scheduled for some time in the future
|
26
|
+
def scheduled
|
27
|
+
count_sorted_set("schedule")
|
28
|
+
end
|
29
|
+
|
30
|
+
# @return [Integer] amount of work still being retried
|
31
|
+
def retrying
|
32
|
+
count_sorted_set("retry")
|
33
|
+
end
|
34
|
+
|
35
|
+
# @return [Array[String]]
|
36
|
+
attr_reader :queue_names
|
37
|
+
|
38
|
+
private
|
39
|
+
def sidekiq_queues
|
40
|
+
::Sidekiq::Stats.new.queues
|
41
|
+
end
|
42
|
+
|
43
|
+
def count_sorted_set(sorted_set)
|
44
|
+
ss = ::Sidekiq::SortedSet.new(sorted_set)
|
45
|
+
ss.count { |job| queue_names.include?(job.queue) }
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
data/lib/autoscaler/version.rb
CHANGED
@@ -0,0 +1,19 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'test_system'
|
3
|
+
require 'autoscaler/binary_scaling_strategy'
|
4
|
+
|
5
|
+
describe Autoscaler::BinaryScalingStrategy do
|
6
|
+
let(:cut) {Autoscaler::BinaryScalingStrategy}
|
7
|
+
|
8
|
+
it "scales with no work" do
|
9
|
+
system = TestSystem.new(0)
|
10
|
+
strategy = cut.new
|
11
|
+
strategy.call(system, 1).should == 0
|
12
|
+
end
|
13
|
+
|
14
|
+
it "does not scale with pending work" do
|
15
|
+
system = TestSystem.new(1)
|
16
|
+
strategy = cut.new(2)
|
17
|
+
strategy.call(system, 1).should == 2
|
18
|
+
end
|
19
|
+
end
|
@@ -1,16 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
+
require 'test_system'
|
2
3
|
require 'autoscaler/sidekiq/celluloid_monitor'
|
3
4
|
require 'timeout'
|
4
5
|
|
5
|
-
class TestSystem
|
6
|
-
def initialize(pending)
|
7
|
-
@pending = pending
|
8
|
-
end
|
9
|
-
|
10
|
-
def working?; false; end
|
11
|
-
def pending_work?; @pending; end
|
12
|
-
end
|
13
|
-
|
14
6
|
describe Autoscaler::Sidekiq::CelluloidMonitor do
|
15
7
|
before do
|
16
8
|
@redis = Sidekiq.redis = REDIS
|
@@ -21,17 +13,17 @@ describe Autoscaler::Sidekiq::CelluloidMonitor do
|
|
21
13
|
let(:scaler) {TestScaler.new(1)}
|
22
14
|
|
23
15
|
it "scales with no work" do
|
24
|
-
system = TestSystem.new(
|
25
|
-
manager = cut.new(scaler, 0, system)
|
26
|
-
Timeout.timeout(1) { manager.wait_for_downscale }
|
16
|
+
system = TestSystem.new(0)
|
17
|
+
manager = cut.new(scaler, lambda{|s,t| 0}, system)
|
18
|
+
Timeout.timeout(1) { manager.wait_for_downscale(0.5) }
|
27
19
|
scaler.workers.should == 0
|
28
20
|
manager.terminate
|
29
21
|
end
|
30
22
|
|
31
23
|
it "does not scale with pending work" do
|
32
|
-
system = TestSystem.new(
|
33
|
-
manager = cut.new(scaler,
|
34
|
-
expect {Timeout.timeout(1) { manager.wait_for_downscale }}.to raise_error Timeout::Error
|
24
|
+
system = TestSystem.new(1)
|
25
|
+
manager = cut.new(scaler, lambda{|s,t| 1}, system)
|
26
|
+
expect {Timeout.timeout(1) { manager.wait_for_downscale(0.5) }}.to raise_error Timeout::Error
|
35
27
|
scaler.workers.should == 1
|
36
28
|
manager.terminate
|
37
29
|
end
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
require 'autoscaler/sidekiq/entire_queue_system'
|
3
|
+
|
4
|
+
describe Autoscaler::Sidekiq::EntireQueueSystem do
|
5
|
+
let(:cut) {Autoscaler::Sidekiq::EntireQueueSystem}
|
6
|
+
|
7
|
+
before do
|
8
|
+
@redis = Sidekiq.redis = REDIS
|
9
|
+
Sidekiq.redis {|c| c.flushdb }
|
10
|
+
end
|
11
|
+
|
12
|
+
def with_work_in_set(queue, set)
|
13
|
+
payload = Sidekiq.dump_json('queue' => queue)
|
14
|
+
Sidekiq.redis { |c| c.zadd(set, (Time.now.to_f + 30.to_f).to_s, payload)}
|
15
|
+
end
|
16
|
+
|
17
|
+
def with_scheduled_work_in(queue)
|
18
|
+
with_work_in_set(queue, 'schedule')
|
19
|
+
end
|
20
|
+
|
21
|
+
def with_retry_work_in(queue)
|
22
|
+
with_work_in_set(queue, 'retry')
|
23
|
+
end
|
24
|
+
|
25
|
+
subject {cut.new}
|
26
|
+
|
27
|
+
it {subject.queue_names.should == []}
|
28
|
+
it {subject.workers.should == 0}
|
29
|
+
|
30
|
+
describe 'no queued work' do
|
31
|
+
it "with no work" do
|
32
|
+
subject.stub(:sidekiq_queues).and_return({'queue' => 0, 'another_queue' => 0})
|
33
|
+
subject.queued.should == 0
|
34
|
+
end
|
35
|
+
|
36
|
+
it "with no scheduled work" do
|
37
|
+
subject.scheduled.should == 0
|
38
|
+
end
|
39
|
+
|
40
|
+
it "with no retry work" do
|
41
|
+
subject.retrying.should == 0
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
describe 'with queued work' do
|
46
|
+
it "with enqueued work" do
|
47
|
+
subject.stub(:sidekiq_queues).and_return({'queue' => 1})
|
48
|
+
subject.queued.should == 1
|
49
|
+
end
|
50
|
+
|
51
|
+
it "with schedule work" do
|
52
|
+
with_scheduled_work_in('queue')
|
53
|
+
subject.scheduled.should == 1
|
54
|
+
end
|
55
|
+
|
56
|
+
it "with retry work" do
|
57
|
+
with_retry_work_in('queue')
|
58
|
+
subject.retrying.should == 1
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
@@ -1,8 +1,8 @@
|
|
1
1
|
require 'spec_helper'
|
2
|
-
require 'autoscaler/sidekiq/
|
2
|
+
require 'autoscaler/sidekiq/specified_queue_system'
|
3
3
|
|
4
|
-
describe Autoscaler::Sidekiq::
|
5
|
-
let(:cut) {Autoscaler::Sidekiq::
|
4
|
+
describe Autoscaler::Sidekiq::SpecifiedQueueSystem do
|
5
|
+
let(:cut) {Autoscaler::Sidekiq::SpecifiedQueueSystem}
|
6
6
|
|
7
7
|
before do
|
8
8
|
@redis = Sidekiq.redis = REDIS
|
@@ -25,39 +25,39 @@ describe Autoscaler::Sidekiq::QueueSystem do
|
|
25
25
|
subject {cut.new(['queue'])}
|
26
26
|
|
27
27
|
it {subject.queue_names.should == ['queue']}
|
28
|
-
it {subject.
|
28
|
+
it {subject.workers.should == 0}
|
29
29
|
|
30
|
-
describe 'no
|
30
|
+
describe 'no queued work' do
|
31
31
|
it "with no work" do
|
32
32
|
subject.stub(:sidekiq_queues).and_return({'queue' => 0, 'another_queue' => 1})
|
33
|
-
subject.
|
33
|
+
subject.queued.should == 0
|
34
34
|
end
|
35
35
|
|
36
36
|
it "with scheduled work in another queue" do
|
37
37
|
with_scheduled_work_in('another_queue')
|
38
|
-
subject.
|
38
|
+
subject.scheduled.should == 0
|
39
39
|
end
|
40
40
|
|
41
41
|
it "with retry work in another queue" do
|
42
42
|
with_retry_work_in('another_queue')
|
43
|
-
subject.
|
43
|
+
subject.retrying.should == 0
|
44
44
|
end
|
45
45
|
end
|
46
46
|
|
47
|
-
describe 'with
|
47
|
+
describe 'with queued work' do
|
48
48
|
it "with enqueued work" do
|
49
49
|
subject.stub(:sidekiq_queues).and_return({'queue' => 1})
|
50
|
-
subject.should
|
50
|
+
subject.queued.should == 1
|
51
51
|
end
|
52
52
|
|
53
53
|
it "with schedule work" do
|
54
54
|
with_scheduled_work_in('queue')
|
55
|
-
subject.should
|
55
|
+
subject.scheduled.should == 1
|
56
56
|
end
|
57
57
|
|
58
58
|
it "with retry work" do
|
59
59
|
with_retry_work_in('queue')
|
60
|
-
subject.should
|
60
|
+
subject.retrying.should == 1
|
61
61
|
end
|
62
62
|
end
|
63
63
|
end
|
data/spec/test_system.rb
ADDED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: autoscaler
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -10,7 +10,7 @@ authors:
|
|
10
10
|
autorequire:
|
11
11
|
bindir: bin
|
12
12
|
cert_chain: []
|
13
|
-
date: 2013-
|
13
|
+
date: 2013-06-21 00:00:00.000000000 Z
|
14
14
|
dependencies:
|
15
15
|
- !ruby/object:Gem::Dependency
|
16
16
|
name: sidekiq
|
@@ -132,13 +132,16 @@ executables: []
|
|
132
132
|
extensions: []
|
133
133
|
extra_rdoc_files: []
|
134
134
|
files:
|
135
|
+
- lib/autoscaler/binary_scaling_strategy.rb
|
135
136
|
- lib/autoscaler/heroku_scaler.rb
|
136
137
|
- lib/autoscaler/sidekiq/activity.rb
|
137
138
|
- lib/autoscaler/sidekiq/celluloid_monitor.rb
|
138
139
|
- lib/autoscaler/sidekiq/client.rb
|
140
|
+
- lib/autoscaler/sidekiq/entire_queue_system.rb
|
139
141
|
- lib/autoscaler/sidekiq/monitor_middleware_adapter.rb
|
140
142
|
- lib/autoscaler/sidekiq/queue_system.rb
|
141
143
|
- lib/autoscaler/sidekiq/sleep_wait_server.rb
|
144
|
+
- lib/autoscaler/sidekiq/specified_queue_system.rb
|
142
145
|
- lib/autoscaler/sidekiq.rb
|
143
146
|
- lib/autoscaler/stub_scaler.rb
|
144
147
|
- lib/autoscaler/version.rb
|
@@ -148,15 +151,18 @@ files:
|
|
148
151
|
- examples/complex.rb
|
149
152
|
- examples/simple.rb
|
150
153
|
- Guardfile
|
154
|
+
- spec/autoscaler/binary_scaling_strategy_spec.rb
|
151
155
|
- spec/autoscaler/heroku_scaler_spec.rb
|
152
156
|
- spec/autoscaler/sidekiq/activity_spec.rb
|
153
157
|
- spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
|
154
158
|
- spec/autoscaler/sidekiq/client_spec.rb
|
159
|
+
- spec/autoscaler/sidekiq/entire_queue_system_spec.rb
|
155
160
|
- spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb
|
156
|
-
- spec/autoscaler/sidekiq/queue_system_spec.rb
|
157
161
|
- spec/autoscaler/sidekiq/sleep_wait_server_spec.rb
|
162
|
+
- spec/autoscaler/sidekiq/specified_queue_system_spec.rb
|
158
163
|
- spec/redis_test.conf
|
159
164
|
- spec/spec_helper.rb
|
165
|
+
- spec/test_system.rb
|
160
166
|
homepage: ''
|
161
167
|
licenses: []
|
162
168
|
post_install_message:
|
@@ -183,13 +189,16 @@ specification_version: 3
|
|
183
189
|
summary: Start/stop Sidekiq workers on Heroku
|
184
190
|
test_files:
|
185
191
|
- Guardfile
|
192
|
+
- spec/autoscaler/binary_scaling_strategy_spec.rb
|
186
193
|
- spec/autoscaler/heroku_scaler_spec.rb
|
187
194
|
- spec/autoscaler/sidekiq/activity_spec.rb
|
188
195
|
- spec/autoscaler/sidekiq/celluloid_monitor_spec.rb
|
189
196
|
- spec/autoscaler/sidekiq/client_spec.rb
|
197
|
+
- spec/autoscaler/sidekiq/entire_queue_system_spec.rb
|
190
198
|
- spec/autoscaler/sidekiq/monitor_middleware_adapter_spec.rb
|
191
|
-
- spec/autoscaler/sidekiq/queue_system_spec.rb
|
192
199
|
- spec/autoscaler/sidekiq/sleep_wait_server_spec.rb
|
200
|
+
- spec/autoscaler/sidekiq/specified_queue_system_spec.rb
|
193
201
|
- spec/redis_test.conf
|
194
202
|
- spec/spec_helper.rb
|
203
|
+
- spec/test_system.rb
|
195
204
|
has_rdoc:
|