gemerald_beanstalk 0.0.1
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/.gitignore +17 -0
- data/.travis.yml +27 -0
- data/Gemfile +8 -0
- data/LICENSE +22 -0
- data/README.md +67 -0
- data/Rakefile +19 -0
- data/gemerald_beanstalk.gemspec +25 -0
- data/lib/gemerald_beanstalk.rb +10 -0
- data/lib/gemerald_beanstalk/beanstalk.rb +289 -0
- data/lib/gemerald_beanstalk/beanstalk_helper.rb +300 -0
- data/lib/gemerald_beanstalk/command.rb +365 -0
- data/lib/gemerald_beanstalk/connection.rb +170 -0
- data/lib/gemerald_beanstalk/job.rb +229 -0
- data/lib/gemerald_beanstalk/jobs.rb +39 -0
- data/lib/gemerald_beanstalk/server.rb +54 -0
- data/lib/gemerald_beanstalk/tube.rb +164 -0
- data/lib/gemerald_beanstalk/version.rb +3 -0
- data/test/beanstalk_integration_tests_test.rb +2 -0
- data/test/test_helper.rb +8 -0
- metadata +133 -0
@@ -0,0 +1,164 @@
|
|
1
|
+
class GemeraldBeanstalk::Tube
|
2
|
+
|
3
|
+
attr_reader :jobs, :name, :reservartions
|
4
|
+
|
5
|
+
|
6
|
+
def active?
|
7
|
+
return !self.deactivated?
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
def adjust_stats_key(key, adjustment = 1)
|
12
|
+
@stats[key] = [@stats[key] + adjustment, 0].max
|
13
|
+
end
|
14
|
+
|
15
|
+
|
16
|
+
def cancel_reservation(connection)
|
17
|
+
return @reservations.delete(connection)
|
18
|
+
end
|
19
|
+
|
20
|
+
|
21
|
+
def deactivate
|
22
|
+
return false if @state == :deactivated || self.name == 'default'
|
23
|
+
@state = :deactivated
|
24
|
+
return true
|
25
|
+
end
|
26
|
+
|
27
|
+
|
28
|
+
def deactivated?
|
29
|
+
return @state == :deactivated
|
30
|
+
end
|
31
|
+
|
32
|
+
|
33
|
+
def delete(job)
|
34
|
+
adjust_stats_key(:'cmd-delete')
|
35
|
+
return @jobs.delete(job)
|
36
|
+
end
|
37
|
+
|
38
|
+
|
39
|
+
def ignore
|
40
|
+
adjust_stats_key(:'watching', -1)
|
41
|
+
deactivate if should_deactivate?
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
def initialize(name)
|
46
|
+
@name = name
|
47
|
+
@jobs = GemeraldBeanstalk::Jobs.new
|
48
|
+
@reservations = []
|
49
|
+
@state = :ready
|
50
|
+
@stats = ThreadSafe::Cache.new
|
51
|
+
@stats[:'cmd-delete'] = 0
|
52
|
+
@stats[:'cmd-pause-tube'] = 0
|
53
|
+
@stats[:'using'] = 0
|
54
|
+
@stats[:'waiting'] = 0
|
55
|
+
@stats[:'watching'] = 0
|
56
|
+
end
|
57
|
+
|
58
|
+
|
59
|
+
def next_job(state = :ready, action = :reserve)
|
60
|
+
return nil if paused? && action == :reserve
|
61
|
+
|
62
|
+
best_candidate = nil
|
63
|
+
@jobs.each do |candidate|
|
64
|
+
next if candidate.state != state
|
65
|
+
best_candidate = candidate if best_candidate.nil? || candidate < best_candidate
|
66
|
+
end
|
67
|
+
|
68
|
+
return best_candidate
|
69
|
+
end
|
70
|
+
|
71
|
+
|
72
|
+
def next_reservation
|
73
|
+
reservation = nil
|
74
|
+
while ready? && @reservations.any? && reservation.nil?
|
75
|
+
reservation = @reservations[0]
|
76
|
+
break if reservation.waiting?
|
77
|
+
|
78
|
+
@reservations.shift
|
79
|
+
reservation = nil
|
80
|
+
end
|
81
|
+
return reservation
|
82
|
+
end
|
83
|
+
|
84
|
+
|
85
|
+
def pause(delay, *args)
|
86
|
+
return false unless ready?
|
87
|
+
@state = :paused
|
88
|
+
adjust_stats_key(:'cmd-pause-tube')
|
89
|
+
@pause_delay = delay.to_i
|
90
|
+
@paused_at = Time.now.to_f
|
91
|
+
@resume_at = @paused_at + @pause_delay
|
92
|
+
return true
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
def paused?
|
97
|
+
return false unless @state == :paused
|
98
|
+
return true if @resume_at > Time.now.to_f
|
99
|
+
|
100
|
+
@state = :ready
|
101
|
+
@pause_delay = @paused_at = @resume_at = nil
|
102
|
+
return false
|
103
|
+
end
|
104
|
+
|
105
|
+
|
106
|
+
def put(job)
|
107
|
+
@jobs.enqueue(job)
|
108
|
+
end
|
109
|
+
|
110
|
+
|
111
|
+
def ready?
|
112
|
+
return @state == :ready
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
def reserve(connection)
|
117
|
+
@reservations << connection
|
118
|
+
end
|
119
|
+
|
120
|
+
|
121
|
+
def should_deactivate?
|
122
|
+
return @jobs.length == 0 && @stats[:'watching'] == 0 && @stats[:'using'] == 0
|
123
|
+
end
|
124
|
+
|
125
|
+
|
126
|
+
def stats
|
127
|
+
job_stats = @jobs.counts_by_state
|
128
|
+
# Need to call paused in advance to update state
|
129
|
+
pause_time_left = paused? ? (@resume_at - Time.now.to_f).to_i : 0
|
130
|
+
return {
|
131
|
+
'name' => @name,
|
132
|
+
'current-jobs-urgent' => job_stats['current-jobs-urgent'],
|
133
|
+
'current-jobs-ready' => job_stats['current-jobs-ready'],
|
134
|
+
'current-jobs-reserved' => job_stats['current-jobs-reserved'],
|
135
|
+
'current-jobs-delayed' => job_stats['current-jobs-delayed'],
|
136
|
+
'current-jobs-buried' => job_stats['current-jobs-buried'],
|
137
|
+
'total-jobs' => @jobs.total_jobs,
|
138
|
+
'current-using' => @stats[:'using'],
|
139
|
+
'current-watching' => @stats[:'watching'],
|
140
|
+
'current-waiting' => @reservations.length,
|
141
|
+
'cmd-delete' => @stats[:'cmd-delete'],
|
142
|
+
'cmd-pause-tube' => @stats[:'cmd-pause-tube'],
|
143
|
+
'pause' => @pause_delay || 0,
|
144
|
+
'pause-time-left' => pause_time_left,
|
145
|
+
}
|
146
|
+
end
|
147
|
+
|
148
|
+
|
149
|
+
def stop_use
|
150
|
+
adjust_stats_key(:'using', -1)
|
151
|
+
deactivate if should_deactivate?
|
152
|
+
end
|
153
|
+
|
154
|
+
|
155
|
+
def watch
|
156
|
+
adjust_stats_key(:'watching')
|
157
|
+
end
|
158
|
+
|
159
|
+
|
160
|
+
def use
|
161
|
+
adjust_stats_key(:'using')
|
162
|
+
end
|
163
|
+
|
164
|
+
end
|
data/test/test_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,133 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: gemerald_beanstalk
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Freewrite.org
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-12-20 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: eventmachine
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: '0'
|
30
|
+
- !ruby/object:Gem::Dependency
|
31
|
+
name: thread_safe
|
32
|
+
requirement: !ruby/object:Gem::Requirement
|
33
|
+
none: false
|
34
|
+
requirements:
|
35
|
+
- - ! '>='
|
36
|
+
- !ruby/object:Gem::Version
|
37
|
+
version: '0'
|
38
|
+
type: :runtime
|
39
|
+
prerelease: false
|
40
|
+
version_requirements: !ruby/object:Gem::Requirement
|
41
|
+
none: false
|
42
|
+
requirements:
|
43
|
+
- - ! '>='
|
44
|
+
- !ruby/object:Gem::Version
|
45
|
+
version: '0'
|
46
|
+
- !ruby/object:Gem::Dependency
|
47
|
+
name: bundler
|
48
|
+
requirement: !ruby/object:Gem::Requirement
|
49
|
+
none: false
|
50
|
+
requirements:
|
51
|
+
- - ~>
|
52
|
+
- !ruby/object:Gem::Version
|
53
|
+
version: '1.3'
|
54
|
+
type: :development
|
55
|
+
prerelease: false
|
56
|
+
version_requirements: !ruby/object:Gem::Requirement
|
57
|
+
none: false
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.3'
|
62
|
+
- !ruby/object:Gem::Dependency
|
63
|
+
name: rake
|
64
|
+
requirement: !ruby/object:Gem::Requirement
|
65
|
+
none: false
|
66
|
+
requirements:
|
67
|
+
- - ! '>='
|
68
|
+
- !ruby/object:Gem::Version
|
69
|
+
version: '0'
|
70
|
+
type: :development
|
71
|
+
prerelease: false
|
72
|
+
version_requirements: !ruby/object:Gem::Requirement
|
73
|
+
none: false
|
74
|
+
requirements:
|
75
|
+
- - ! '>='
|
76
|
+
- !ruby/object:Gem::Version
|
77
|
+
version: '0'
|
78
|
+
description: RubyGem implementation of beanstalkd
|
79
|
+
email:
|
80
|
+
- dev@freewrite.org
|
81
|
+
executables: []
|
82
|
+
extensions: []
|
83
|
+
extra_rdoc_files: []
|
84
|
+
files:
|
85
|
+
- .gitignore
|
86
|
+
- .travis.yml
|
87
|
+
- Gemfile
|
88
|
+
- LICENSE
|
89
|
+
- README.md
|
90
|
+
- Rakefile
|
91
|
+
- gemerald_beanstalk.gemspec
|
92
|
+
- lib/gemerald_beanstalk.rb
|
93
|
+
- lib/gemerald_beanstalk/beanstalk.rb
|
94
|
+
- lib/gemerald_beanstalk/beanstalk_helper.rb
|
95
|
+
- lib/gemerald_beanstalk/command.rb
|
96
|
+
- lib/gemerald_beanstalk/connection.rb
|
97
|
+
- lib/gemerald_beanstalk/job.rb
|
98
|
+
- lib/gemerald_beanstalk/jobs.rb
|
99
|
+
- lib/gemerald_beanstalk/server.rb
|
100
|
+
- lib/gemerald_beanstalk/tube.rb
|
101
|
+
- lib/gemerald_beanstalk/version.rb
|
102
|
+
- test/beanstalk_integration_tests_test.rb
|
103
|
+
- test/test_helper.rb
|
104
|
+
homepage: https://github.com/gemeraldbeanstalk/gemerald_beanstalk
|
105
|
+
licenses:
|
106
|
+
- MIT
|
107
|
+
post_install_message:
|
108
|
+
rdoc_options: []
|
109
|
+
require_paths:
|
110
|
+
- lib
|
111
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
112
|
+
none: false
|
113
|
+
requirements:
|
114
|
+
- - ! '>='
|
115
|
+
- !ruby/object:Gem::Version
|
116
|
+
version: '0'
|
117
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
|
+
none: false
|
119
|
+
requirements:
|
120
|
+
- - ! '>='
|
121
|
+
- !ruby/object:Gem::Version
|
122
|
+
version: '0'
|
123
|
+
requirements: []
|
124
|
+
rubyforge_project:
|
125
|
+
rubygems_version: 1.8.25
|
126
|
+
signing_key:
|
127
|
+
specification_version: 3
|
128
|
+
summary: Gemerald Beanstalk offers a Ruby implementation of beanstalkd for testing
|
129
|
+
and other uses.
|
130
|
+
test_files:
|
131
|
+
- test/beanstalk_integration_tests_test.rb
|
132
|
+
- test/test_helper.rb
|
133
|
+
has_rdoc:
|