sidetiq 0.3.7 → 0.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +1 -0
- data/CHANGELOG.md +16 -0
- data/LICENSE +2 -2
- data/README.md +9 -16
- data/Rakefile +2 -7
- data/examples/Procfile +2 -0
- data/examples/config.ru +15 -0
- data/examples/server.rb +17 -0
- data/examples/workers/failing.rb +13 -0
- data/examples/workers/simple.rb +10 -0
- data/lib/sidetiq/actor/clock.rb +31 -0
- data/lib/sidetiq/actor/handler.rb +7 -0
- data/lib/sidetiq/actor.rb +38 -0
- data/lib/sidetiq/api.rb +109 -0
- data/lib/sidetiq/clock.rb +3 -118
- data/lib/sidetiq/config.rb +8 -0
- data/lib/sidetiq/handler.rb +50 -0
- data/lib/sidetiq/lock/meta_data.rb +53 -0
- data/lib/sidetiq/lock/redis.rb +115 -0
- data/lib/sidetiq/lock/watcher.rb +41 -0
- data/lib/sidetiq/logging.rb +12 -0
- data/lib/sidetiq/middleware/history.rb +58 -0
- data/lib/sidetiq/schedulable.rb +6 -7
- data/lib/sidetiq/supervisor.rb +50 -0
- data/lib/sidetiq/version.rb +6 -3
- data/lib/sidetiq/views/_home_nav.erb +16 -0
- data/lib/sidetiq/views/_worker_nav.erb +22 -0
- data/lib/sidetiq/views/assets/styles.css +36 -0
- data/lib/sidetiq/views/history.erb +48 -0
- data/lib/sidetiq/views/locks.erb +48 -0
- data/lib/sidetiq/views/schedule.erb +59 -0
- data/lib/sidetiq/views/sidetiq.erb +39 -28
- data/lib/sidetiq/web.rb +36 -16
- data/lib/sidetiq.rb +34 -114
- data/sidetiq.gemspec +5 -2
- data/tasks/bundler.task +1 -0
- data/tasks/minitest.task +6 -0
- data/test/fixtures/optional_arguments_worker.rb +8 -0
- data/test/helper.rb +21 -6
- data/test/test_clock.rb +16 -24
- data/test/test_history.rb +60 -0
- data/test/test_lock_meta_data.rb +90 -0
- data/test/test_lock_redis.rb +63 -0
- data/test/test_version.rb +2 -1
- data/test/test_watcher.rb +24 -0
- data/test/test_web.rb +26 -2
- metadata +80 -12
- data/examples/simple.rb +0 -22
- data/lib/sidetiq/lock.rb +0 -63
- data/lib/sidetiq/middleware.rb +0 -23
- data/lib/sidetiq/views/sidetiq_details.erb +0 -49
- data/test/test_lock.rb +0 -30
- data/test/test_middleware.rb +0 -18
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: sidetiq
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.4.0.rc1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Svensson
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2013-
|
11
|
+
date: 2013-09-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sidekiq
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.14.0
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: celluloid
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - '>='
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: 0.14.1
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: 0.14.1
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: ice_cube
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -38,6 +52,20 @@ dependencies:
|
|
38
52
|
- - ~>
|
39
53
|
- !ruby/object:Gem::Version
|
40
54
|
version: 0.11.0
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: json
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
41
69
|
- !ruby/object:Gem::Dependency
|
42
70
|
name: rake
|
43
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -94,6 +122,20 @@ dependencies:
|
|
94
122
|
- - '>='
|
95
123
|
- !ruby/object:Gem::Version
|
96
124
|
version: '0'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: minitest
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - ~>
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: 5.0.7
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - ~>
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: 5.0.7
|
97
139
|
- !ruby/object:Gem::Dependency
|
98
140
|
name: coveralls
|
99
141
|
requirement: !ruby/object:Gem::Requirement
|
@@ -122,33 +164,56 @@ files:
|
|
122
164
|
- LICENSE
|
123
165
|
- README.md
|
124
166
|
- Rakefile
|
125
|
-
- examples/
|
167
|
+
- examples/Procfile
|
168
|
+
- examples/config.ru
|
169
|
+
- examples/server.rb
|
170
|
+
- examples/workers/failing.rb
|
171
|
+
- examples/workers/simple.rb
|
126
172
|
- lib/sidetiq.rb
|
173
|
+
- lib/sidetiq/actor.rb
|
174
|
+
- lib/sidetiq/actor/clock.rb
|
175
|
+
- lib/sidetiq/actor/handler.rb
|
176
|
+
- lib/sidetiq/api.rb
|
127
177
|
- lib/sidetiq/clock.rb
|
128
178
|
- lib/sidetiq/config.rb
|
129
|
-
- lib/sidetiq/
|
130
|
-
- lib/sidetiq/
|
179
|
+
- lib/sidetiq/handler.rb
|
180
|
+
- lib/sidetiq/lock/meta_data.rb
|
181
|
+
- lib/sidetiq/lock/redis.rb
|
182
|
+
- lib/sidetiq/lock/watcher.rb
|
183
|
+
- lib/sidetiq/logging.rb
|
184
|
+
- lib/sidetiq/middleware/history.rb
|
131
185
|
- lib/sidetiq/schedulable.rb
|
132
186
|
- lib/sidetiq/schedule.rb
|
187
|
+
- lib/sidetiq/supervisor.rb
|
133
188
|
- lib/sidetiq/version.rb
|
189
|
+
- lib/sidetiq/views/_home_nav.erb
|
190
|
+
- lib/sidetiq/views/_worker_nav.erb
|
191
|
+
- lib/sidetiq/views/assets/styles.css
|
192
|
+
- lib/sidetiq/views/history.erb
|
193
|
+
- lib/sidetiq/views/locks.erb
|
194
|
+
- lib/sidetiq/views/schedule.erb
|
134
195
|
- lib/sidetiq/views/sidetiq.erb
|
135
|
-
- lib/sidetiq/views/sidetiq_details.erb
|
136
196
|
- lib/sidetiq/web.rb
|
137
197
|
- sidetiq.gemspec
|
198
|
+
- tasks/bundler.task
|
199
|
+
- tasks/minitest.task
|
138
200
|
- test/fixtures/backfill_worker.rb
|
139
201
|
- test/fixtures/last_and_scheduled_ticks_worker.rb
|
140
202
|
- test/fixtures/last_tick_worker.rb
|
203
|
+
- test/fixtures/optional_arguments_worker.rb
|
141
204
|
- test/fixtures/scheduled_worker.rb
|
142
205
|
- test/fixtures/simple_worker.rb
|
143
206
|
- test/fixtures/splat_args_worker.rb
|
144
207
|
- test/helper.rb
|
145
208
|
- test/test_clock.rb
|
146
209
|
- test/test_config.rb
|
147
|
-
- test/
|
148
|
-
- test/
|
210
|
+
- test/test_history.rb
|
211
|
+
- test/test_lock_meta_data.rb
|
212
|
+
- test/test_lock_redis.rb
|
149
213
|
- test/test_schedule.rb
|
150
214
|
- test/test_sidetiq.rb
|
151
215
|
- test/test_version.rb
|
216
|
+
- test/test_watcher.rb
|
152
217
|
- test/test_web.rb
|
153
218
|
- test/test_worker.rb
|
154
219
|
homepage: http://github.com/tobiassvn/sidetiq
|
@@ -166,9 +231,9 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
166
231
|
version: '0'
|
167
232
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
168
233
|
requirements:
|
169
|
-
- - '
|
234
|
+
- - '>'
|
170
235
|
- !ruby/object:Gem::Version
|
171
|
-
version:
|
236
|
+
version: 1.3.1
|
172
237
|
requirements: []
|
173
238
|
rubyforge_project:
|
174
239
|
rubygems_version: 2.0.3
|
@@ -179,16 +244,19 @@ test_files:
|
|
179
244
|
- test/fixtures/backfill_worker.rb
|
180
245
|
- test/fixtures/last_and_scheduled_ticks_worker.rb
|
181
246
|
- test/fixtures/last_tick_worker.rb
|
247
|
+
- test/fixtures/optional_arguments_worker.rb
|
182
248
|
- test/fixtures/scheduled_worker.rb
|
183
249
|
- test/fixtures/simple_worker.rb
|
184
250
|
- test/fixtures/splat_args_worker.rb
|
185
251
|
- test/helper.rb
|
186
252
|
- test/test_clock.rb
|
187
253
|
- test/test_config.rb
|
188
|
-
- test/
|
189
|
-
- test/
|
254
|
+
- test/test_history.rb
|
255
|
+
- test/test_lock_meta_data.rb
|
256
|
+
- test/test_lock_redis.rb
|
190
257
|
- test/test_schedule.rb
|
191
258
|
- test/test_sidetiq.rb
|
192
259
|
- test/test_version.rb
|
260
|
+
- test/test_watcher.rb
|
193
261
|
- test/test_web.rb
|
194
262
|
- test/test_worker.rb
|
data/examples/simple.rb
DELETED
@@ -1,22 +0,0 @@
|
|
1
|
-
# Run with `sidekiq -r /path/to/simple.rb`
|
2
|
-
|
3
|
-
require 'sidekiq'
|
4
|
-
require 'sidetiq'
|
5
|
-
|
6
|
-
Sidekiq.options[:poll_interval] = 1
|
7
|
-
|
8
|
-
Sidekiq.configure_server do |config|
|
9
|
-
Sidetiq::Clock.start!
|
10
|
-
end
|
11
|
-
|
12
|
-
class MyWorker
|
13
|
-
include Sidekiq::Worker
|
14
|
-
include Sidetiq::Schedulable
|
15
|
-
|
16
|
-
recurrence { secondly }
|
17
|
-
|
18
|
-
def perform(*args)
|
19
|
-
Sidekiq.logger.info "#perform"
|
20
|
-
end
|
21
|
-
end
|
22
|
-
|
data/lib/sidetiq/lock.rb
DELETED
@@ -1,63 +0,0 @@
|
|
1
|
-
module Sidetiq
|
2
|
-
class Lock # :nodoc: all
|
3
|
-
attr_reader :key, :timeout
|
4
|
-
|
5
|
-
OWNER = "#{Socket.gethostname}:#{Process.pid}"
|
6
|
-
|
7
|
-
def initialize(key, timeout = Sidetiq.config.lock_expire)
|
8
|
-
@key = key.kind_of?(Class) ? "sidetiq:#{key.name}:lock" : "sidetiq:#{key}:lock"
|
9
|
-
@timeout = timeout
|
10
|
-
end
|
11
|
-
|
12
|
-
def synchronize
|
13
|
-
Sidekiq.redis do |redis|
|
14
|
-
if lock(redis)
|
15
|
-
Sidetiq.logger.debug "Sidetiq::Clock lock #{key}"
|
16
|
-
|
17
|
-
begin
|
18
|
-
yield redis
|
19
|
-
ensure
|
20
|
-
unlock(redis)
|
21
|
-
Sidetiq.logger.debug "Sidetiq::Clock unlock #{key}"
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
private
|
28
|
-
|
29
|
-
def lock(redis)
|
30
|
-
acquired = false
|
31
|
-
|
32
|
-
watch(redis, key) do
|
33
|
-
if !redis.exists(key)
|
34
|
-
acquired = !!redis.multi do |multi|
|
35
|
-
multi.psetex(key, timeout, OWNER)
|
36
|
-
end
|
37
|
-
end
|
38
|
-
end
|
39
|
-
|
40
|
-
acquired
|
41
|
-
end
|
42
|
-
|
43
|
-
def unlock(redis)
|
44
|
-
watch(redis, key) do
|
45
|
-
if redis.get(key) == OWNER
|
46
|
-
redis.multi do |multi|
|
47
|
-
multi.del(key)
|
48
|
-
end
|
49
|
-
end
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def watch(redis, *args)
|
54
|
-
redis.watch(*args)
|
55
|
-
|
56
|
-
begin
|
57
|
-
yield
|
58
|
-
ensure
|
59
|
-
redis.unwatch
|
60
|
-
end
|
61
|
-
end
|
62
|
-
end
|
63
|
-
end
|
data/lib/sidetiq/middleware.rb
DELETED
@@ -1,23 +0,0 @@
|
|
1
|
-
module Sidetiq
|
2
|
-
class Middleware
|
3
|
-
def initialize
|
4
|
-
@clock = Sidetiq::Clock.instance
|
5
|
-
end
|
6
|
-
|
7
|
-
def call(*args)
|
8
|
-
# Restart the clock if the thread died.
|
9
|
-
if !@clock.ticking?
|
10
|
-
Sidetiq.logger.warn "Sidetiq::Clock thread died. Restarting..."
|
11
|
-
@clock.start!
|
12
|
-
end
|
13
|
-
yield
|
14
|
-
end
|
15
|
-
end
|
16
|
-
end
|
17
|
-
|
18
|
-
Sidekiq.configure_server do |config|
|
19
|
-
config.server_middleware do |chain|
|
20
|
-
chain.add Sidetiq::Middleware
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
@@ -1,49 +0,0 @@
|
|
1
|
-
<header class="row">
|
2
|
-
<div class="span5">
|
3
|
-
<h3>Recurring Job: <%= @worker.name %></h3>
|
4
|
-
</div>
|
5
|
-
</header>
|
6
|
-
|
7
|
-
<% if (recurrences = @schedule.recurrence_rules).length > 0 %>
|
8
|
-
<table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
|
9
|
-
<thead>
|
10
|
-
<th>Recurrences</th>
|
11
|
-
</thead>
|
12
|
-
<% recurrences.each do |rule| %>
|
13
|
-
<tr>
|
14
|
-
<td><%= rule.to_s %></td>
|
15
|
-
</tr>
|
16
|
-
<% end %>
|
17
|
-
</table>
|
18
|
-
<% end %>
|
19
|
-
|
20
|
-
<br />
|
21
|
-
|
22
|
-
<% if (exceptions = @schedule.exception_rules).length > 0 %>
|
23
|
-
<table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
|
24
|
-
<thead>
|
25
|
-
<th>Exceptions</th>
|
26
|
-
</thead>
|
27
|
-
<% exceptions.each do |rule| %>
|
28
|
-
<tr>
|
29
|
-
<td><%= rule.to_s %></td>
|
30
|
-
</tr>
|
31
|
-
<% end %>
|
32
|
-
</table>
|
33
|
-
<% end %>
|
34
|
-
|
35
|
-
<br />
|
36
|
-
|
37
|
-
<table class="table table-striped table-bordered table-white" style="width: 100%; margin: 0; table-layout:fixed;">
|
38
|
-
<thead>
|
39
|
-
<th style="width: 25%">Next 10 runs</th>
|
40
|
-
<th style="width: 75%" />
|
41
|
-
<% @schedule.next_occurrences(10, @time).each do |time| %>
|
42
|
-
<tr>
|
43
|
-
<td><time><%= time.getutc %></time></td>
|
44
|
-
<td><%= relative_time(time) %></td>
|
45
|
-
</tr>
|
46
|
-
<% end %>
|
47
|
-
</table>
|
48
|
-
|
49
|
-
<br />
|
data/test/test_lock.rb
DELETED
@@ -1,30 +0,0 @@
|
|
1
|
-
require_relative 'helper'
|
2
|
-
|
3
|
-
class TestLock < Sidetiq::TestCase
|
4
|
-
def test_locking
|
5
|
-
lock_name = SecureRandom.hex(8)
|
6
|
-
key = SecureRandom.hex(8)
|
7
|
-
|
8
|
-
Sidekiq.redis do |redis|
|
9
|
-
redis.set(key, 0)
|
10
|
-
|
11
|
-
5.times.map do
|
12
|
-
Thread.start do
|
13
|
-
locked(lock_name) do |r|
|
14
|
-
sleep 0.1
|
15
|
-
r.incr(key)
|
16
|
-
end
|
17
|
-
end
|
18
|
-
end.each(&:join)
|
19
|
-
|
20
|
-
assert_equal "1", redis.get(key)
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
def locked(lock_name)
|
25
|
-
Sidetiq::Lock.new(lock_name).synchronize do |redis|
|
26
|
-
yield redis
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
|
data/test/test_middleware.rb
DELETED
@@ -1,18 +0,0 @@
|
|
1
|
-
require_relative 'helper'
|
2
|
-
|
3
|
-
class TestMiddleware < Sidetiq::TestCase
|
4
|
-
def middleware
|
5
|
-
Sidetiq::Middleware.new
|
6
|
-
end
|
7
|
-
|
8
|
-
def test_restarts_clock
|
9
|
-
clock.stubs(:ticking?).returns(false)
|
10
|
-
clock.expects(:start!).once
|
11
|
-
middleware.call {}
|
12
|
-
|
13
|
-
clock.stubs(:ticking?).returns(true)
|
14
|
-
clock.expects(:start!).never
|
15
|
-
middleware.call {}
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|