ezmobius-nanite 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/README.rdoc +36 -11
- data/Rakefile +1 -2
- data/TODO +7 -8
- data/bin/nanite-admin +9 -3
- data/bin/nanite-agent +19 -1
- data/bin/nanite-mapper +19 -1
- metadata +2 -12
data/README.rdoc
CHANGED
|
@@ -29,7 +29,8 @@ In your Nanites you can have any number of actor classes. These actors are like
|
|
|
29
29
|
in Rails or Merb and this is where you implement your own custom functionality. An actor looks
|
|
30
30
|
like:
|
|
31
31
|
|
|
32
|
-
class Foo
|
|
32
|
+
class Foo
|
|
33
|
+
include Nanite::Actor
|
|
33
34
|
expose :bar
|
|
34
35
|
def bar(payload)
|
|
35
36
|
"got payload: #{payload}"
|
|
@@ -128,22 +129,22 @@ If you don't have easy_install, install setuptools from http://pypi.python.org/p
|
|
|
128
129
|
|
|
129
130
|
and install simplejson, which is needed for the "make" step below.
|
|
130
131
|
|
|
131
|
-
These instructions assume the latest RabbitMQ release 1.5.
|
|
132
|
+
These instructions assume the latest RabbitMQ release 1.5.3:
|
|
132
133
|
|
|
133
134
|
# Download somewhere
|
|
134
135
|
cd /root
|
|
135
|
-
wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.5.
|
|
136
|
+
wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.5.3/rabbitmq-server-1.5.3.tar.gz
|
|
136
137
|
|
|
137
138
|
# Go to your erlang lib directory, usually /usr/lib/erlang/lib or:
|
|
138
139
|
cd /usr/local/lib/erlang/lib
|
|
139
140
|
|
|
140
|
-
tar -zxf ~/rabbitmq-server-1.5.
|
|
141
|
-
cd rabbitmq-server-1.5.
|
|
141
|
+
tar -zxf ~/rabbitmq-server-1.5.3.tar.gz
|
|
142
|
+
cd rabbitmq-server-1.5.3
|
|
142
143
|
make
|
|
143
144
|
|
|
144
145
|
# There is no "make install" phase.
|
|
145
146
|
|
|
146
|
-
Be sure to add the /usr/local/lib/erlang/lib/rabbitmq-server-1.5.
|
|
147
|
+
Be sure to add the /usr/local/lib/erlang/lib/rabbitmq-server-1.5.3/scripts to your $PATH.
|
|
147
148
|
|
|
148
149
|
The following websites may also be useful:
|
|
149
150
|
* RabbitMQ website for the latest info : http://www.rabbitmq.com/download.html
|
|
@@ -154,9 +155,9 @@ The following websites may also be useful:
|
|
|
154
155
|
|
|
155
156
|
=== Install RabbitMQ (Linux .deb)
|
|
156
157
|
|
|
157
|
-
wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.5.
|
|
158
|
+
wget http://www.rabbitmq.com/releases/rabbitmq-server/v1.5.3/rabbitmq-server_1.5.3-1_all.deb
|
|
158
159
|
sudo apt-get install logrotate
|
|
159
|
-
sudo dpkg -i rabbitmq-server_1.5.
|
|
160
|
+
sudo dpkg -i rabbitmq-server_1.5.3-1_all.deb
|
|
160
161
|
|
|
161
162
|
== Test your installation
|
|
162
163
|
|
|
@@ -282,17 +283,41 @@ Thin is EventMachine-based, so we only need to make sure that the EventMachine r
|
|
|
282
283
|
until EM.reactor_running?
|
|
283
284
|
sleep 1
|
|
284
285
|
end
|
|
285
|
-
Nanite.
|
|
286
|
+
Nanite.start_mapper(:host => 'localhost', :user => 'mapper', :pass => 'testing', :vhost => '/nanite', :log_level => 'info')
|
|
286
287
|
end
|
|
287
288
|
|
|
288
289
|
Mongrel on the other hand does not use EventMachine and therefore requires to wrap the start of our mapper
|
|
289
290
|
|
|
290
291
|
Thread.new do
|
|
291
292
|
EM.run do
|
|
292
|
-
Nanite.
|
|
293
|
+
Nanite.start_mapper(:host => 'localhost', :user => 'mapper', :pass => 'testing', :vhost => '/nanite', :log_level => 'info')
|
|
293
294
|
end
|
|
294
295
|
end
|
|
295
296
|
|
|
297
|
+
Using nanite with Passenger:
|
|
298
|
+
|
|
299
|
+
current = Thread.current
|
|
300
|
+
Thread.new do
|
|
301
|
+
AMQP.start(:host => AMQP_HOST) do
|
|
302
|
+
current.wakeup
|
|
303
|
+
end
|
|
304
|
+
end
|
|
305
|
+
Thread.stop
|
|
306
|
+
|
|
307
|
+
# catch these, stop AMQP, stop eventmachine, and re-throw to
|
|
308
|
+
Mongrel/Passenger's signal traps
|
|
309
|
+
EM.run do
|
|
310
|
+
['INT', 'TERM'].each do |sig|
|
|
311
|
+
old = trap(sig) do
|
|
312
|
+
AMQP.stop do
|
|
313
|
+
EM.stop
|
|
314
|
+
old.call
|
|
315
|
+
end
|
|
316
|
+
end
|
|
317
|
+
end
|
|
318
|
+
end
|
|
319
|
+
|
|
320
|
+
=======
|
|
296
321
|
Where to put the mapper initialization code depends on the framework and our preference.
|
|
297
322
|
For Rails the canonical place to start our mapper is within nanite.rb (or any other filename you prefer) in config/initalizers.
|
|
298
323
|
In Merb we can use init.rb in config.
|
|
@@ -321,7 +346,7 @@ The easiest way to verify it is by starting two separate Erlang shells like this
|
|
|
321
346
|
$ erl -sname fred
|
|
322
347
|
(fred@odin)1>
|
|
323
348
|
|
|
324
|
-
$erl -sname bob
|
|
349
|
+
$ erl -sname bob
|
|
325
350
|
(bob@odin)1>
|
|
326
351
|
|
|
327
352
|
And then trying to 'ping' one from the other. In the 'fred' node you can do that like this:
|
data/Rakefile
CHANGED
|
@@ -10,7 +10,7 @@ end
|
|
|
10
10
|
require 'rake/clean'
|
|
11
11
|
|
|
12
12
|
GEM = "nanite"
|
|
13
|
-
VER = "0.
|
|
13
|
+
VER = "0.4.0"
|
|
14
14
|
AUTHOR = "Ezra Zygmuntowicz"
|
|
15
15
|
EMAIL = "ezra@engineyard.com"
|
|
16
16
|
HOMEPAGE = "http://github.com/ezmobius/nanite"
|
|
@@ -33,7 +33,6 @@ spec = Gem::Specification.new do |s|
|
|
|
33
33
|
s.bindir = "bin"
|
|
34
34
|
s.executables = %w( nanite-agent nanite-mapper nanite-admin )
|
|
35
35
|
|
|
36
|
-
s.add_dependency "extlib"
|
|
37
36
|
s.add_dependency('amqp', '>= 0.6.0')
|
|
38
37
|
|
|
39
38
|
s.require_path = 'lib'
|
data/TODO
CHANGED
|
@@ -9,17 +9,16 @@ Ian:
|
|
|
9
9
|
- Update docs for Agent#start and Mapper#start
|
|
10
10
|
- Update docs in nanite-agent and nanite-mapper
|
|
11
11
|
- Ensure file transfer works
|
|
12
|
-
- Ensure admin works
|
|
13
12
|
- Check secure stuff still works
|
|
14
13
|
- Check custom status_proc works
|
|
15
|
-
- Update README
|
|
16
14
|
- Check documentation, only document public methods
|
|
17
|
-
- no_declare => true in dispatcher.rb?
|
|
18
15
|
- ensure the removal of threaded_actors option doesn't cause shit to block
|
|
19
16
|
|
|
20
|
-
|
|
17
|
+
- Look into using EM deferables for actors dispatch.
|
|
18
|
+
- Integration specs that spawn a small cluster of nanites
|
|
19
|
+
- Rename Ping to Status
|
|
20
|
+
- request/push should take *args for payload?
|
|
21
21
|
|
|
22
|
-
|
|
23
|
-
-
|
|
24
|
-
-
|
|
25
|
-
- What's the point of || 'index' in the dispatcher?
|
|
22
|
+
Maybe:
|
|
23
|
+
- Make mapper queue durable and Results respect :persistent flag on the request
|
|
24
|
+
- Add a global result received callback
|
data/bin/nanite-admin
CHANGED
|
@@ -48,12 +48,18 @@ opts = OptionParser.new do |opts|
|
|
|
48
48
|
opts.separator '*'*80
|
|
49
49
|
|
|
50
50
|
setup_mapper_options(opts, options)
|
|
51
|
+
|
|
52
|
+
opts.on("--thin-debug", "Set the equivalent of the '--debug' flag on the Thin webserver.") do
|
|
53
|
+
options[:thin_debug] = true
|
|
54
|
+
end
|
|
51
55
|
end
|
|
52
56
|
|
|
53
57
|
opts.parse!
|
|
54
58
|
|
|
55
59
|
EM.run do
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
Rack::Handler::Thin.run(Nanite::Admin.new(mapper), :Port => 4000)
|
|
60
|
+
Nanite.start_mapper(options)
|
|
61
|
+
Nanite::Log.info "starting nanite-admin"
|
|
62
|
+
Rack::Handler::Thin.run(Nanite::Admin.new(Nanite.mapper), :Port => 4000) do
|
|
63
|
+
Thin::Logging.debug = options[:thin_debug]
|
|
64
|
+
end
|
|
59
65
|
end
|
data/bin/nanite-agent
CHANGED
|
@@ -25,6 +25,24 @@ end
|
|
|
25
25
|
|
|
26
26
|
opts.parse!
|
|
27
27
|
|
|
28
|
+
if ARGV[0] == 'stop'
|
|
29
|
+
agent = Nanite::Agent.new(options)
|
|
30
|
+
pid_file = Nanite::PidFile.new(agent.identity, agent.options)
|
|
31
|
+
unless pid = pid_file.read_pid
|
|
32
|
+
puts "#{pid_file} not found"
|
|
33
|
+
exit
|
|
34
|
+
end
|
|
35
|
+
puts "Stopping nanite agent #{agent.identity} (pid #{pid})"
|
|
36
|
+
begin
|
|
37
|
+
Process.kill('TERM', pid)
|
|
38
|
+
rescue Errno::ESRCH
|
|
39
|
+
puts "Process does not exist (pid #{pid})"
|
|
40
|
+
exit
|
|
41
|
+
end
|
|
42
|
+
puts 'Done.'
|
|
43
|
+
exit
|
|
44
|
+
end
|
|
45
|
+
|
|
28
46
|
EM.run do
|
|
29
|
-
Nanite
|
|
47
|
+
Nanite.start_agent(options)
|
|
30
48
|
end
|
data/bin/nanite-mapper
CHANGED
|
@@ -17,6 +17,24 @@ end
|
|
|
17
17
|
|
|
18
18
|
opts.parse!
|
|
19
19
|
|
|
20
|
+
if ARGV[0] == 'stop'
|
|
21
|
+
mapper = Nanite::Mapper.new(options)
|
|
22
|
+
pid_file = Nanite::PidFile.new(mapper.identity, mapper.options)
|
|
23
|
+
unless pid = pid_file.read_pid
|
|
24
|
+
puts "#{pid_file} not found"
|
|
25
|
+
exit
|
|
26
|
+
end
|
|
27
|
+
puts "Stopping nanite mapper #{mapper.identity} (pid #{pid})"
|
|
28
|
+
begin
|
|
29
|
+
Process.kill('TERM', pid)
|
|
30
|
+
rescue Errno::ESRCH
|
|
31
|
+
puts "Process does not exist (pid #{pid})"
|
|
32
|
+
exit
|
|
33
|
+
end
|
|
34
|
+
puts 'Done.'
|
|
35
|
+
exit
|
|
36
|
+
end
|
|
37
|
+
|
|
20
38
|
EM.run do
|
|
21
|
-
Nanite
|
|
39
|
+
Nanite.start_mapper(options)
|
|
22
40
|
end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: ezmobius-nanite
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.4.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Ezra Zygmuntowicz
|
|
@@ -9,19 +9,9 @@ autorequire:
|
|
|
9
9
|
bindir: bin
|
|
10
10
|
cert_chain: []
|
|
11
11
|
|
|
12
|
-
date: 2009-02-
|
|
12
|
+
date: 2009-02-25 00:00:00 -08:00
|
|
13
13
|
default_executable:
|
|
14
14
|
dependencies:
|
|
15
|
-
- !ruby/object:Gem::Dependency
|
|
16
|
-
name: extlib
|
|
17
|
-
type: :runtime
|
|
18
|
-
version_requirement:
|
|
19
|
-
version_requirements: !ruby/object:Gem::Requirement
|
|
20
|
-
requirements:
|
|
21
|
-
- - ">="
|
|
22
|
-
- !ruby/object:Gem::Version
|
|
23
|
-
version: "0"
|
|
24
|
-
version:
|
|
25
15
|
- !ruby/object:Gem::Dependency
|
|
26
16
|
name: amqp
|
|
27
17
|
type: :runtime
|