loops 2.0.1 → 2.0.2

Sign up to get free protection for your applications and to get access to all the features.
data/README.rdoc CHANGED
@@ -217,6 +217,27 @@ not support demonization in JRuby and never tested the code on Ruby 1.9. Obvious
217
217
  of JVM limitations you won't be able to use <tt>fork</tt> workers engine in JRuby, but
218
218
  threaded workers do pretty well.
219
219
 
220
+ Recommended version of ruby ro run loops is Ruby Enterprise Edition. This is because we
221
+ have a support for their Copy-On-Write friendly garbage collector that makes your loops
222
+ much smaller in memory (since they share the most of the code). Even with one loop process
223
+ you'd save some memory because your loop monitor process would share most of the memory with
224
+ the loop itself. When you run on RubyEE, you could use <tt>loops stats</tt> command to get
225
+ detailed loops memory stats:
226
+
227
+ [root@analyics current]# ./script/loops stats
228
+
229
+ --------- Loops processes ----------
230
+ PID PPID VMSize Private Name
231
+ ------------------------------------
232
+ 9062 1 199.3 MB 32.4 MB loops monitor: activemq
233
+ 9234 9062 211.9 MB 37.5 MB loop worker: activemq
234
+ 9251 9062 213.3 MB 38.4 MB loop worker: activemq
235
+ 9267 9062 211.9 MB 37.1 MB loop worker: activemq
236
+ 9268 9062 211.9 MB 38.0 MB loop worker: activemq
237
+ ### Processes: 5
238
+ ### Total private dirty RSS: 183.33 MB
239
+
240
+
220
241
 
221
242
  == Migrating from pre-2.0 releases
222
243
 
data/VERSION.yml CHANGED
@@ -1,5 +1,5 @@
1
1
  ---
2
- :patch: 1
3
- :major: 2
4
2
  :minor: 0
5
3
  :build:
4
+ :patch: 2
5
+ :major: 2
@@ -81,12 +81,7 @@ module Loops
81
81
  # Finds, instantiates and invokes a command.
82
82
  #
83
83
  def run!
84
- if cmd = find_command(options[:command])
85
- cmd.invoke(engine, options)
86
- else
87
- STDERR << option_parser
88
- exit
89
- end
84
+ @command.invoke(engine, options)
90
85
  end
91
86
 
92
87
  # Find and return an instance of {Command} by command name.
@@ -129,11 +129,8 @@ module Loops
129
129
  # Loops root
130
130
  Loops.loops_root = options.delete(:loops_root)
131
131
 
132
- extract_command!
133
- if options[:command].nil? || options[:command] == 'help'
134
- puts option_parser
135
- exit
136
- end
132
+ @command = extract_command!
133
+ options[:framework] = 'none' unless @command.requires_bootstrap?
137
134
 
138
135
  bootstrap!
139
136
  start_engine!
@@ -154,7 +151,16 @@ module Loops
154
151
  #
155
152
  def extract_command!
156
153
  options[:command], *options[:args] = args
157
- options[:command]
154
+ if options[:command].nil? || options[:command] == 'help'
155
+ puts option_parser
156
+ exit
157
+ end
158
+
159
+ unless command = find_command(options[:command])
160
+ STDERR << option_parser
161
+ exit
162
+ end
163
+ command
158
164
  end
159
165
 
160
166
  # Detect the application root directory (contatining "app"
data/lib/loops/command.rb CHANGED
@@ -29,6 +29,11 @@ class Loops::Command
29
29
  def execute
30
30
  raise 'Generic command has no actions'
31
31
  end
32
+
33
+ # Gets a value indicating whether command needs to bootstrap framework.
34
+ def requires_bootstrap?
35
+ true
36
+ end
32
37
  end
33
38
 
34
39
  # All Loops command registered.
@@ -8,4 +8,8 @@ class Loops::Commands::ListCommand < Loops::Command
8
8
  end
9
9
  end
10
10
  end
11
+
12
+ def requires_bootstrap?
13
+ false
14
+ end
11
15
  end
@@ -2,4 +2,8 @@ class Loops::Commands::StatsCommand < Loops::Command
2
2
  def execute
3
3
  system File.join(Loops::LIB_ROOT, '../bin/loops-memory-stats')
4
4
  end
5
+
6
+ def requires_bootstrap?
7
+ false
8
+ end
5
9
  end
@@ -15,4 +15,8 @@ class Loops::Commands::StopCommand < Loops::Command
15
15
  puts " Done!"
16
16
  exit(0)
17
17
  end
18
+
19
+ def requires_bootstrap?
20
+ false
21
+ end
18
22
  end
data/lib/loops/engine.rb CHANGED
@@ -181,20 +181,14 @@ class Loops::Engine
181
181
  end
182
182
 
183
183
  def setup_signals
184
- trap('TERM') {
185
- warn "Received a TERM signal... stopping..."
186
- @pm.stop_workers!
184
+ stop = proc {
185
+ warn "Received a signal... stopping..."
186
+ @pm.start_shutdown!
187
187
  }
188
188
 
189
- trap('INT') {
190
- warn "Received an INT signal... stopping..."
191
- @pm.stop_workers!
192
- }
193
-
194
- trap('EXIT') {
195
- warn "Received a EXIT 'signal'... stopping..."
196
- @pm.stop_workers!
197
- }
189
+ trap('TERM', stop)
190
+ trap('INT', stop)
191
+ trap('EXIT', stop)
198
192
  end
199
193
 
200
194
  def fix_ar_after_fork
@@ -37,6 +37,11 @@ module Loops
37
37
  sleep(@config['poll_period'])
38
38
  end
39
39
  ensure
40
+ logger.info("Workers monitoring loop is finished, starting shutdown...")
41
+ # Send out stop signals
42
+ stop_workers(false)
43
+
44
+ # Wait for all the workers to die
40
45
  unless wait_for_workers(10)
41
46
  logger.info("Some workers are still alive after 10 seconds of waiting. Killing them...")
42
47
  stop_workers(true)
@@ -72,12 +77,8 @@ module Loops
72
77
  end
73
78
 
74
79
  def stop_workers(force = false)
75
- # Return if already shuting down (and not forced to stop)
76
- return if shutdown? && !force
77
-
78
80
  # Set shutdown flag
79
81
  logger.info("Stopping workers#{force ? ' (forced)' : ''}...")
80
- start_shutdown!
81
82
 
82
83
  # Termination loop
83
84
  @worker_pools.each do |name, pool|
@@ -85,23 +86,6 @@ module Loops
85
86
  end
86
87
  end
87
88
 
88
- def stop_workers!
89
- # return if already shutting down
90
- return if shutdown?
91
-
92
- # Set shutdown flag
93
- start_shutdown!
94
-
95
- # Ask gently to stop
96
- stop_workers(false)
97
-
98
- # Give it a second
99
- sleep(1)
100
-
101
- # Forcefully stop the workers
102
- stop_workers(true)
103
- end
104
-
105
89
  def shutdown?
106
90
  @shutdown
107
91
  end
data/loops.gemspec CHANGED
@@ -5,11 +5,11 @@
5
5
 
6
6
  Gem::Specification.new do |s|
7
7
  s.name = %q{loops}
8
- s.version = "2.0.1"
8
+ s.version = "2.0.2"
9
9
 
10
10
  s.required_rubygems_version = Gem::Requirement.new(">= 0") if s.respond_to? :required_rubygems_version=
11
11
  s.authors = ["Alexey Kovyrin", "Dmytro Shteflyuk"]
12
- s.date = %q{2010-03-19}
12
+ s.date = %q{2010-03-31}
13
13
  s.description = %q{Loops is a small and lightweight framework for Ruby on Rails, Merb and other ruby frameworks created to support simple background loops in your application which are usually used to do some background data processing on your servers (queue workers, batch tasks processors, etc).}
14
14
  s.email = %q{alexey@kovyrin.net}
15
15
  s.executables = ["loops", "loops-memory-stats"]
@@ -70,7 +70,7 @@ Gem::Specification.new do |s|
70
70
  s.homepage = %q{http://github.com/kovyrin/loops}
71
71
  s.rdoc_options = ["--charset=UTF-8"]
72
72
  s.require_paths = ["lib"]
73
- s.rubygems_version = %q{1.3.6}
73
+ s.rubygems_version = %q{1.3.5}
74
74
  s.summary = %q{Simple background loops framework for ruby}
75
75
  s.test_files = [
76
76
  "spec/loop_lock_spec.rb",
@@ -1,6 +1,6 @@
1
1
  class ComplexLoop < Loops::Base
2
2
  def run
3
- with_period_of(1.second) do
3
+ with_period_of(1) do
4
4
  if shutdown?
5
5
  info("Shutting down!")
6
6
  return # exit the loop
metadata CHANGED
@@ -1,12 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: loops
3
3
  version: !ruby/object:Gem::Version
4
- prerelease: false
5
- segments:
6
- - 2
7
- - 0
8
- - 1
9
- version: 2.0.1
4
+ version: 2.0.2
10
5
  platform: ruby
11
6
  authors:
12
7
  - Alexey Kovyrin
@@ -15,7 +10,7 @@ autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
12
 
18
- date: 2010-03-19 00:00:00 -04:00
13
+ date: 2010-03-31 00:00:00 -04:00
19
14
  default_executable:
20
15
  dependencies: []
21
16
 
@@ -91,20 +86,18 @@ required_ruby_version: !ruby/object:Gem::Requirement
91
86
  requirements:
92
87
  - - ">="
93
88
  - !ruby/object:Gem::Version
94
- segments:
95
- - 0
96
89
  version: "0"
90
+ version:
97
91
  required_rubygems_version: !ruby/object:Gem::Requirement
98
92
  requirements:
99
93
  - - ">="
100
94
  - !ruby/object:Gem::Version
101
- segments:
102
- - 0
103
95
  version: "0"
96
+ version:
104
97
  requirements: []
105
98
 
106
99
  rubyforge_project:
107
- rubygems_version: 1.3.6
100
+ rubygems_version: 1.3.5
108
101
  signing_key:
109
102
  specification_version: 3
110
103
  summary: Simple background loops framework for ruby