beanstalkd_view 1.0.2 → 1.1.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 +6 -0
- data/Gemfile +2 -0
- data/README.md +12 -3
- data/Rakefile +18 -12
- data/lib/beanstalkd_view/beanstalkd_utils.rb +65 -3
- data/lib/beanstalkd_view/resources/js/peek_jobs.js +3 -1
- data/lib/beanstalkd_view/resources/js/peek_range.js +3 -3
- data/lib/beanstalkd_view/server.rb +42 -133
- data/lib/beanstalkd_view/version.rb +1 -1
- data/lib/beanstalkd_view/views/index.erb +68 -57
- data/lib/beanstalkd_view/views/peek_range.erb +6 -4
- data/lib/beanstalkd_view/views/tube_stats.erb +21 -21
- data/lib/beanstalkd_view.rb +1 -2
- data/spec/integration/sinatra_integration_spec.rb +0 -1
- data/spec/lib/beanstalkd_view/beanstalkd_util_spec.rb +0 -10
- data/spec/rails_app/log/test.log +1762 -8515
- data/spec/spec_helper.rb +11 -0
- data/spec/support/integration_test_shared_examples.rb +8 -7
- metadata +8 -11
- data/lib/beanstalkd_view/Gemfile +0 -4
- data/lib/beanstalkd_view/Rakefile +0 -1
- data/lib/beanstalkd_view/extensions/beanstalk-pool.rb +0 -39
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -10,7 +10,6 @@ Configuration
|
|
10
10
|
To use in a Rails app, include the gem in your Gemfile:
|
11
11
|
|
12
12
|
``` ruby
|
13
|
-
gem 'beanstalk-client', :git => 'https://github.com/kr/beanstalk-client-ruby.git' #Use the latest, if you need the pause-tube command
|
14
13
|
gem beanstalkd_view
|
15
14
|
```
|
16
15
|
|
@@ -23,7 +22,7 @@ Use the following environment variable to specify the location of the beanstalk
|
|
23
22
|
ENV['BEANSTALK_URL'] = 'beanstalk://localhost/'
|
24
23
|
```
|
25
24
|
|
26
|
-
|
25
|
+
This can be a comma separated list, e.g. 'beanstalk://localhost:11300,beanstalk://localhost:11400'
|
27
26
|
|
28
27
|
Embedding in a Rails app
|
29
28
|
------------------------
|
@@ -63,12 +62,22 @@ bundle exec beanstalkd_view
|
|
63
62
|
|
64
63
|
(This will use the vegas gem to launch the Sinatra app on an available port.)
|
65
64
|
|
66
|
-
Alternatively, a Rackup file is provided. To use: cd into the beanstalkd_view directory and execute
|
65
|
+
Alternatively, a Rackup file is provided. To use: cd into the beanstalkd_view directory and execute:
|
66
|
+
|
67
|
+
rackup
|
68
|
+
|
67
69
|
|
68
70
|
Screenshot
|
69
71
|
------------------------
|
70
72
|

|
71
73
|
|
74
|
+
Running the tests
|
75
|
+
------------------------
|
76
|
+
There are 3 variants of RSpec tests.
|
77
|
+
* Without beanstalkd running, just execute: rspec spec
|
78
|
+
* Without 1 instance of beanstalkd running (default port), execute: rspec spec --tag requires_beanstalkd
|
79
|
+
* Without 2 instances of beanstalkd running (ports 11300 and 11400), execute: rspec spec --tag requires_two_beanstalkd
|
80
|
+
|
72
81
|
License
|
73
82
|
------------------------
|
74
83
|
|
data/Rakefile
CHANGED
@@ -10,7 +10,7 @@ RSpec::Core::RakeTask.new(:spec)
|
|
10
10
|
|
11
11
|
task :default => :spec
|
12
12
|
|
13
|
-
require '
|
13
|
+
require 'beaneater'
|
14
14
|
require 'json'
|
15
15
|
|
16
16
|
namespace :beanstalkd_view do
|
@@ -21,17 +21,17 @@ namespace :beanstalkd_view do
|
|
21
21
|
task :enqueue_test do
|
22
22
|
host = "localhost"
|
23
23
|
port = 11300
|
24
|
-
beanstalk =
|
24
|
+
beanstalk = Beaneater::Pool.new([ "#{host}:#{port}" ])
|
25
25
|
|
26
26
|
# Loop flooding the queues with jobs
|
27
27
|
while true
|
28
|
-
|
28
|
+
tube_name = TEST_QUEUES.sample
|
29
29
|
pri = 65536
|
30
30
|
delay = 0
|
31
31
|
ttr = 120
|
32
|
-
beanstalk.
|
33
|
-
|
34
|
-
puts "Enqueued Job to #{
|
32
|
+
tube = beanstalk.tubes[tube_name]
|
33
|
+
tube.put '{}', :pri => pri, :delay => delay, :ttr => ttr
|
34
|
+
puts "Enqueued Job to #{tube_name}"
|
35
35
|
end
|
36
36
|
end
|
37
37
|
|
@@ -39,14 +39,20 @@ namespace :beanstalkd_view do
|
|
39
39
|
task :pull_test do
|
40
40
|
host = "localhost"
|
41
41
|
port = 11300
|
42
|
-
beanstalk =
|
42
|
+
beanstalk = Beaneater::Pool.new([ "#{host}:#{port}" ])
|
43
43
|
|
44
44
|
while true
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
45
|
+
tube_name = TEST_QUEUES.sample
|
46
|
+
begin
|
47
|
+
beanstalk.tubes.watch!(tube_name)
|
48
|
+
job = beanstalk.tubes.reserve(1)
|
49
|
+
if job
|
50
|
+
puts "Pulled Job #{job} from #{tube_name}"
|
51
|
+
job.delete
|
52
|
+
end
|
53
|
+
rescue Exception => ex
|
54
|
+
puts "Exception while pulling job from #{tube_name}: #{ex}"
|
55
|
+
end
|
50
56
|
end
|
51
57
|
end
|
52
58
|
|
@@ -2,10 +2,12 @@ module BeanstalkdView
|
|
2
2
|
|
3
3
|
module BeanstalkdUtils
|
4
4
|
|
5
|
+
GUESS_PEEK_RANGE = 100 # Default number of elements to use in peek-range guesses
|
6
|
+
|
5
7
|
class BadURL < RuntimeError; end
|
6
8
|
|
7
9
|
def beanstalk
|
8
|
-
@@beanstalk ||=
|
10
|
+
@@beanstalk ||= Beaneater::Pool.new(beanstalk_addresses)
|
9
11
|
end
|
10
12
|
|
11
13
|
def beanstalk_url
|
@@ -13,8 +15,6 @@ module BeanstalkdView
|
|
13
15
|
ENV['BEANSTALK_URL'] || 'beanstalk://localhost/'
|
14
16
|
end
|
15
17
|
|
16
|
-
class BadURL < RuntimeError; end
|
17
|
-
|
18
18
|
def beanstalk_addresses
|
19
19
|
uris = beanstalk_url.split(/[\s,]+/)
|
20
20
|
uris.map {|uri| beanstalk_host_and_port(uri)}
|
@@ -25,5 +25,67 @@ module BeanstalkdView
|
|
25
25
|
raise(BadURL, uri_string) if uri.scheme != 'beanstalk'
|
26
26
|
"#{uri.host}:#{uri.port || 11300}"
|
27
27
|
end
|
28
|
+
|
29
|
+
# Convert Beaneater::Job to hash
|
30
|
+
def job_to_hash(job)
|
31
|
+
ret_value = {}
|
32
|
+
job_stats = job.stats
|
33
|
+
job_stats.keys.each { |key| ret_value[key] = job_stats[key] }
|
34
|
+
ret_value['body'] = job.body.inspect
|
35
|
+
ret_value
|
36
|
+
end
|
37
|
+
|
38
|
+
# Return the stats data in a format for the Bluff JS UI Charts
|
39
|
+
def get_chart_data_hash(tubes)
|
40
|
+
chart_data = {}
|
41
|
+
chart_data["total_jobs_data"] = Hash.new
|
42
|
+
chart_data["buried_jobs_data"] = Hash.new
|
43
|
+
chart_data["total_jobs_data"]["items"] = Array.new
|
44
|
+
chart_data["buried_jobs_data"]["items"] = Array.new
|
45
|
+
tubes.each do |tube|
|
46
|
+
stats = tube.stats
|
47
|
+
#total_jobs
|
48
|
+
total_jobs = stats[:total_jobs]
|
49
|
+
if total_jobs > 0
|
50
|
+
total_datum = {}
|
51
|
+
total_datum["label"] = tube.name
|
52
|
+
total_datum["data"] = total_jobs
|
53
|
+
chart_data["total_jobs_data"]["items"] << total_datum
|
54
|
+
end
|
55
|
+
#buried_jobs
|
56
|
+
buried_jobs = stats[:current_jobs_buried]
|
57
|
+
if buried_jobs > 0
|
58
|
+
buried_datum = {}
|
59
|
+
buried_datum["label"] = tube.name
|
60
|
+
buried_datum["data"] = buried_jobs
|
61
|
+
chart_data["buried_jobs_data"]["items"] << buried_datum
|
62
|
+
end
|
63
|
+
end
|
64
|
+
chart_data
|
65
|
+
end
|
66
|
+
|
67
|
+
# Pick a Minimum Peek Range Based on minumum ready jobs on all tubes
|
68
|
+
def guess_min_peek_range(tubes)
|
69
|
+
min = 0
|
70
|
+
tubes.each do |tube|
|
71
|
+
response = tube.peek('ready')
|
72
|
+
if response
|
73
|
+
if min == 0
|
74
|
+
min = response.id.to_i
|
75
|
+
else
|
76
|
+
min = [min, response.id.to_i].min
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
80
|
+
# Add some jitter in the opposite direction of 1/4 range
|
81
|
+
jitter_min = (min-(GUESS_PEEK_RANGE*0.25)).to_i
|
82
|
+
[1, jitter_min].max
|
83
|
+
end
|
84
|
+
|
85
|
+
# Pick a Minimum Peek Range Based on the minimum
|
86
|
+
def guess_max_peek_range(min)
|
87
|
+
(min+GUESS_PEEK_RANGE)-1
|
88
|
+
end
|
89
|
+
|
28
90
|
end
|
29
91
|
end
|
@@ -85,10 +85,11 @@ $(document).ready(function() {
|
|
85
85
|
} else {
|
86
86
|
// Build the confirmation popup
|
87
87
|
data = {};
|
88
|
+
data["tube"] = tube;
|
88
89
|
data["pri"] = priority;
|
89
90
|
data["delay"] = delay;
|
90
91
|
data["ttr"] = ttr;
|
91
|
-
data["body"] = JSON.stringify(
|
92
|
+
data["body"] = JSON.stringify(parsed_body_json);
|
92
93
|
$("#job_info_popup_title").html(create_new_job_title());
|
93
94
|
$("#job_info_popup_body").html(create_job_info_table(data));
|
94
95
|
$("#job_info_popup_footer").html(create_new_job_buttons());
|
@@ -127,6 +128,7 @@ $(document).ready(function() {
|
|
127
128
|
function create_job_info_table(data) {
|
128
129
|
var job_info_table = "<table class=\"table\">";
|
129
130
|
job_info_table += "<tbody>";
|
131
|
+
job_info_table += create_job_info_row("tube", data["tube"], "The tube to which the job will be added.");
|
130
132
|
job_info_table += create_job_info_row("pri", data["pri"], "The priority value set by the put, release, or bury commands.");
|
131
133
|
if ("age" in data) {
|
132
134
|
job_info_table += create_job_info_row("age", data["age"], "The time in seconds since the put command that created this job.");
|
@@ -3,10 +3,10 @@ $(document).ready(function() {
|
|
3
3
|
function filter_table_by_tube() {
|
4
4
|
var tube = $("#peek_range_tube_select").val();
|
5
5
|
if (tube === '') {
|
6
|
-
$('tr[data-tube]').show();
|
6
|
+
$('tr.datum[data-tube]').show();
|
7
7
|
} else {
|
8
|
-
$('tr[data-tube!="'+tube+'"]').hide();
|
9
|
-
$('tr[data-tube="'+tube+'"]').show();
|
8
|
+
$('tr.datum[data-tube!="'+tube+'"]').hide();
|
9
|
+
$('tr.datum[data-tube="'+tube+'"]').show();
|
10
10
|
}
|
11
11
|
}
|
12
12
|
|
@@ -30,19 +30,17 @@ module BeanstalkdView
|
|
30
30
|
'/css/vendor/bootstrap.min.css',
|
31
31
|
'/css/app.css']
|
32
32
|
end
|
33
|
-
|
34
|
-
GUESS_PEEK_RANGE = 100 # Default number of elements to use in peek-range guesses
|
35
|
-
|
33
|
+
|
36
34
|
get "/" do
|
37
35
|
begin
|
38
|
-
@
|
36
|
+
@connections = beanstalk.connections
|
37
|
+
@tubes = beanstalk.tubes.all
|
39
38
|
@stats = beanstalk.stats
|
40
|
-
|
41
|
-
chart_data = get_chart_data_hash(@tube_set)
|
39
|
+
chart_data = get_chart_data_hash(@tubes)
|
42
40
|
@total_jobs_data = chart_data["total_jobs_data"]
|
43
41
|
@buried_jobs_data = chart_data["buried_jobs_data"] if chart_data["buried_jobs_data"]["items"].size > 0
|
44
42
|
erb :index
|
45
|
-
rescue
|
43
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
46
44
|
erb :error
|
47
45
|
end
|
48
46
|
end
|
@@ -50,28 +48,27 @@ module BeanstalkdView
|
|
50
48
|
post "/add_job" do
|
51
49
|
begin
|
52
50
|
response = nil
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
end
|
51
|
+
tube = beanstalk.tubes[params[:tube]]
|
52
|
+
response = tube.put params[:body],
|
53
|
+
:pri => params[:priority].to_i, :delay => params[:delay].to_i, :ttr => params[:ttr].to_i
|
57
54
|
if response
|
58
|
-
cookies[:beanstalkd_view_notice] = "Added job #{response.inspect}"
|
55
|
+
cookies[:beanstalkd_view_notice] = "Added job: #{response.inspect}"
|
59
56
|
redirect url("/")
|
60
57
|
else
|
61
58
|
cookies[:beanstalkd_view_notice] = "Error adding job"
|
62
59
|
redirect url("/")
|
63
60
|
end
|
64
|
-
rescue
|
61
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
65
62
|
erb :error
|
66
63
|
end
|
67
64
|
end
|
68
65
|
|
69
66
|
get "/tube/:tube" do
|
70
67
|
begin
|
71
|
-
@tube = params[:tube]
|
72
|
-
@stats =
|
68
|
+
@tube = beanstalk.tubes[params[:tube]]
|
69
|
+
@stats = @tube.stats
|
73
70
|
erb :tube_stats
|
74
|
-
rescue
|
71
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
75
72
|
erb :error
|
76
73
|
end
|
77
74
|
end
|
@@ -79,24 +76,14 @@ module BeanstalkdView
|
|
79
76
|
get "/peek/:tube/:type" do
|
80
77
|
content_type :json
|
81
78
|
begin
|
82
|
-
|
83
|
-
|
84
|
-
if (params[:type]) == "ready"
|
85
|
-
response = conn.peek_ready()
|
86
|
-
elsif (params[:type]) == "delayed"
|
87
|
-
response = conn.peek_delayed()
|
88
|
-
else
|
89
|
-
response = conn.peek_buried()
|
90
|
-
end
|
91
|
-
end
|
79
|
+
tube = beanstalk.tubes[params[:tube]]
|
80
|
+
response = tube.peek(params[:type])
|
92
81
|
if response
|
93
|
-
|
94
|
-
ret_value["body"] = response.body
|
95
|
-
ret_value.to_json
|
82
|
+
job_to_hash(response).to_json
|
96
83
|
else
|
97
84
|
{ :error => "No job was found, or an error occurred while trying to peek at the next job."}.to_json
|
98
85
|
end
|
99
|
-
rescue
|
86
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
100
87
|
{ :error => @error.to_s }.to_json
|
101
88
|
end
|
102
89
|
end
|
@@ -105,15 +92,15 @@ module BeanstalkdView
|
|
105
92
|
begin
|
106
93
|
@min = params[:min].to_i
|
107
94
|
@max = params[:max].to_i
|
108
|
-
@
|
95
|
+
@min = params[:min].to_i
|
96
|
+
tubes = beanstalk.tubes
|
97
|
+
@tubes = tubes.all
|
98
|
+
@tube = tubes[params[:tube]] if params[:tube] and params[:tube] != ''
|
109
99
|
|
110
|
-
# Get the Set of Tubes for the Form
|
111
|
-
tubes = beanstalk.list_tubes
|
112
|
-
@tube_set = tube_set(tubes)
|
113
100
|
# Only guess with the specified tube (if passed in)
|
114
|
-
guess_tubes = @
|
115
|
-
if @tube
|
116
|
-
guess_tubes =
|
101
|
+
guess_tubes = @tubes
|
102
|
+
if @tube
|
103
|
+
guess_tubes = []
|
117
104
|
guess_tubes << @tube
|
118
105
|
end
|
119
106
|
# Guess ID Range if not specified
|
@@ -123,20 +110,16 @@ module BeanstalkdView
|
|
123
110
|
@jobs = []
|
124
111
|
for i in min..max
|
125
112
|
begin
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
ret_value["body"] = response.body
|
130
|
-
parsed_body = JSON.parse(response.body)
|
131
|
-
ret_value["tube"] = parsed_body[0]
|
132
|
-
@jobs << ret_value
|
113
|
+
jobs = beanstalk.jobs.find_all(i)
|
114
|
+
jobs.each do |job|
|
115
|
+
@jobs << job_to_hash(job)
|
133
116
|
end
|
134
|
-
rescue
|
135
|
-
#
|
117
|
+
rescue Beaneater::NotFoundError => e
|
118
|
+
# Since we're looping over potentially non-existant jobs, ignore
|
136
119
|
end
|
137
120
|
end
|
138
121
|
erb :peek_range
|
139
|
-
rescue
|
122
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
140
123
|
erb :error
|
141
124
|
end
|
142
125
|
end
|
@@ -144,9 +127,8 @@ module BeanstalkdView
|
|
144
127
|
get "/delete/:tube/:job_id" do
|
145
128
|
begin
|
146
129
|
response = nil
|
147
|
-
beanstalk.
|
148
|
-
|
149
|
-
end
|
130
|
+
job = beanstalk.jobs.find(params[:job_id].to_i)
|
131
|
+
response = job.delete if job
|
150
132
|
if response
|
151
133
|
cookies[:beanstalkd_view_notice] = "Deleted Job #{params[:job_id]}"
|
152
134
|
redirect url("/tube/#{params[:tube]}")
|
@@ -154,14 +136,15 @@ module BeanstalkdView
|
|
154
136
|
cookies[:beanstalkd_view_notice] = "Error deleting Job #{params[:job_id]}"
|
155
137
|
redirect url("/tube/#{params[:tube]}")
|
156
138
|
end
|
157
|
-
rescue
|
139
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
158
140
|
erb :error
|
159
141
|
end
|
160
142
|
end
|
161
143
|
|
162
144
|
post "/pause" do
|
163
145
|
begin
|
164
|
-
|
146
|
+
tube = beanstalk.tubes[params[:tube]]
|
147
|
+
response = tube.pause(params[:delay].to_i)
|
165
148
|
if response
|
166
149
|
cookies[:beanstalkd_view_notice] = "Paused #{params[:tube]}. No jobs will be reserved for #{params[:delay].to_i} seconds."
|
167
150
|
redirect url("/tube/#{params[:tube]}")
|
@@ -169,10 +152,7 @@ module BeanstalkdView
|
|
169
152
|
cookies[:beanstalkd_view_notice] = "Error pausing #{params[:tube]}."
|
170
153
|
redirect url("/tube/#{params[:tube]}")
|
171
154
|
end
|
172
|
-
rescue
|
173
|
-
cookies[:beanstalkd_view_notice] = "The pause_tube method is currently not implemented by this version of beanstalk-client."
|
174
|
-
redirect url("/tube/#{params[:tube]}")
|
175
|
-
rescue Beanstalk::NotConnected => @error
|
155
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
176
156
|
erb :error
|
177
157
|
end
|
178
158
|
end
|
@@ -180,17 +160,16 @@ module BeanstalkdView
|
|
180
160
|
post "/kick" do
|
181
161
|
begin
|
182
162
|
response = nil
|
183
|
-
beanstalk.
|
184
|
-
|
185
|
-
end
|
163
|
+
tube = beanstalk.tubes[params[:tube]]
|
164
|
+
response = tube.kick(params[:bound].to_i)
|
186
165
|
if response
|
187
|
-
cookies[:beanstalkd_view_notice] = "Kicked #{params[:tube]}
|
166
|
+
cookies[:beanstalkd_view_notice] = "Kicked #{params[:tube]}: #{response}"
|
188
167
|
redirect url("/tube/#{params[:tube]}")
|
189
168
|
else
|
190
169
|
cookies[:beanstalkd_view_notice] = "Error kicking #{params[:tube]}."
|
191
170
|
redirect url("/tube/#{params[:tube]}")
|
192
171
|
end
|
193
|
-
rescue
|
172
|
+
rescue Beaneater::NotConnected, Beaneater::NotFoundError => @error
|
194
173
|
erb :error
|
195
174
|
end
|
196
175
|
end
|
@@ -200,6 +179,8 @@ module BeanstalkdView
|
|
200
179
|
end
|
201
180
|
alias_method :u, :url_path
|
202
181
|
|
182
|
+
private
|
183
|
+
|
203
184
|
def path_prefix
|
204
185
|
request.env['SCRIPT_NAME']
|
205
186
|
end
|
@@ -209,78 +190,6 @@ module BeanstalkdView
|
|
209
190
|
cookies[:beanstalkd_view_notice] = ''
|
210
191
|
message
|
211
192
|
end
|
212
|
-
|
213
|
-
private
|
214
|
-
|
215
|
-
# Return the stats data in a format for the Bluff JS UI Charts
|
216
|
-
def get_chart_data_hash(tube_set)
|
217
|
-
chart_data = Hash.new
|
218
|
-
chart_data["total_jobs_data"] = Hash.new
|
219
|
-
chart_data["buried_jobs_data"] = Hash.new
|
220
|
-
chart_data["total_jobs_data"]["items"] = Array.new
|
221
|
-
chart_data["buried_jobs_data"]["items"] = Array.new
|
222
|
-
tube_set.each do |tube|
|
223
|
-
begin
|
224
|
-
stats = beanstalk.stats_tube(tube)
|
225
|
-
#total_jobs
|
226
|
-
total_jobs = stats['total-jobs']
|
227
|
-
if total_jobs > 0
|
228
|
-
total_datum = Hash.new
|
229
|
-
total_datum["label"] = tube
|
230
|
-
total_datum["data"] = total_jobs
|
231
|
-
chart_data["total_jobs_data"]["items"] << total_datum
|
232
|
-
end
|
233
|
-
#buried_jobs
|
234
|
-
buried_jobs = stats['current-jobs-buried']
|
235
|
-
if buried_jobs > 0
|
236
|
-
buried_datum = Hash.new
|
237
|
-
buried_datum["label"] = tube
|
238
|
-
buried_datum["data"] = buried_jobs
|
239
|
-
chart_data["buried_jobs_data"]["items"] << buried_datum
|
240
|
-
end
|
241
|
-
rescue Beanstalk::NotFoundError
|
242
|
-
puts "Ignoring Beanstalk::NotFoundError for #{tube}"
|
243
|
-
end
|
244
|
-
end
|
245
|
-
chart_data
|
246
|
-
end
|
247
193
|
|
248
|
-
# Return a Set of tube names
|
249
|
-
def tube_set(tubes)
|
250
|
-
tube_set = Set.new
|
251
|
-
tubes.keys.each do |key|
|
252
|
-
tubes[key].each do |tube|
|
253
|
-
tube_set.add(tube)
|
254
|
-
end
|
255
|
-
end
|
256
|
-
tube_set
|
257
|
-
end
|
258
|
-
|
259
|
-
# Pick a Minimum Peek Range Based on calls to peek_ready
|
260
|
-
def guess_min_peek_range(tube_set)
|
261
|
-
min = 0
|
262
|
-
tube_set.each do |tube|
|
263
|
-
response = nil
|
264
|
-
beanstalk.on_tube(tube) do |conn|
|
265
|
-
response = conn.peek_ready()
|
266
|
-
end
|
267
|
-
if response
|
268
|
-
if min == 0
|
269
|
-
min = response.id
|
270
|
-
else
|
271
|
-
min = [min, response.id].min
|
272
|
-
end
|
273
|
-
end
|
274
|
-
end
|
275
|
-
# Add some jitter in the opposite direction of 1/4 range
|
276
|
-
jitter_min = (min-(GUESS_PEEK_RANGE*0.25)).to_i
|
277
|
-
[1, jitter_min].max
|
278
|
-
end
|
279
|
-
|
280
|
-
# Pick a Minimum Peek Range Based on the minimum
|
281
|
-
def guess_max_peek_range(min)
|
282
|
-
(min+GUESS_PEEK_RANGE)-1
|
283
|
-
end
|
284
|
-
|
285
194
|
end
|
286
195
|
end
|