dcell 0.0.0 → 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 +2 -0
- data/.rspec +4 -0
- data/CHANGES.md +8 -0
- data/Gemfile +2 -0
- data/README.md +209 -0
- data/Rakefile +3 -0
- data/benchmarks/messaging.rb +67 -0
- data/benchmarks/receiver.rb +37 -0
- data/dcell.gemspec +10 -3
- data/lib/celluloid/README +8 -0
- data/lib/celluloid/zmq.rb +28 -0
- data/lib/celluloid/zmq/mailbox.rb +13 -0
- data/lib/celluloid/zmq/reactor.rb +74 -0
- data/lib/dcell.rb +92 -2
- data/lib/dcell/actor_proxy.rb +4 -0
- data/lib/dcell/application.rb +6 -0
- data/lib/dcell/celluloid_ext.rb +57 -0
- data/lib/dcell/directory.rb +23 -0
- data/lib/dcell/global.rb +23 -0
- data/lib/dcell/mailbox_proxy.rb +61 -0
- data/lib/dcell/messages.rb +67 -0
- data/lib/dcell/node.rb +120 -0
- data/lib/dcell/registries/redis_adapter.rb +86 -0
- data/lib/dcell/registries/zk_adapter.rb +122 -0
- data/lib/dcell/responses.rb +16 -0
- data/lib/dcell/router.rb +71 -0
- data/lib/dcell/rspec.rb +1 -0
- data/lib/dcell/server.rb +80 -0
- data/lib/dcell/version.rb +1 -1
- data/spec/celluloid/zmq/mailbox_spec.rb +6 -0
- data/spec/dcell/actor_proxy_spec.rb +60 -0
- data/spec/dcell/celluloid_ext_spec.rb +21 -0
- data/spec/dcell/directory_spec.rb +8 -0
- data/spec/dcell/global_spec.rb +21 -0
- data/spec/dcell/node_spec.rb +23 -0
- data/spec/dcell/registries/redis_adapter_spec.rb +6 -0
- data/spec/dcell/registries/zk_adapter_spec.rb +11 -0
- data/spec/spec_helper.rb +16 -0
- data/spec/support/helpers.rb +40 -0
- data/spec/support/registry_examples.rb +35 -0
- data/spec/test_node.rb +33 -0
- data/tasks/rspec.task +7 -0
- data/tasks/zookeeper.task +58 -0
- metadata +111 -7
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Celluloid, "extensions" do
|
4
|
+
before do
|
5
|
+
class WillKane
|
6
|
+
include Celluloid
|
7
|
+
end
|
8
|
+
@marshal = WillKane.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "marshals Celluloid::ActorProxy objects" do
|
12
|
+
string = Marshal.dump(@marshal)
|
13
|
+
Marshal.load(string).should be_alive
|
14
|
+
end
|
15
|
+
|
16
|
+
it "marshals Celluloid::Mailbox objects" do
|
17
|
+
@marshal.mailbox.should be_a(Celluloid::Mailbox)
|
18
|
+
string = Marshal.dump(@marshal.mailbox)
|
19
|
+
Marshal.load(string).should be_alive
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DCell::Global do
|
4
|
+
it "stores values" do
|
5
|
+
DCell::Global[:the_answer] = 42
|
6
|
+
DCell::Global[:the_answer].should == 42
|
7
|
+
|
8
|
+
# Double check the global value is available on all nodes
|
9
|
+
node = DCell::Node['test_node']
|
10
|
+
node[:test_actor].the_answer.should == 42
|
11
|
+
end
|
12
|
+
|
13
|
+
it "stores the keys of all globals" do
|
14
|
+
DCell::Global[:foo] = 1
|
15
|
+
DCell::Global[:bar] = 2
|
16
|
+
DCell::Global[:baz] = 3
|
17
|
+
|
18
|
+
keys = DCell::Global.keys
|
19
|
+
[:foo, :bar, :baz].each { |key| keys.should include key }
|
20
|
+
end
|
21
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe DCell::Node do
|
4
|
+
before do
|
5
|
+
@node = DCell::Node['test_node']
|
6
|
+
@node.id.should == 'test_node'
|
7
|
+
end
|
8
|
+
|
9
|
+
it "finds all available nodes" do
|
10
|
+
nodes = DCell::Node.all
|
11
|
+
nodes.should include(DCell.me)
|
12
|
+
end
|
13
|
+
|
14
|
+
it "finds remote actors" do
|
15
|
+
actor = @node[:test_actor]
|
16
|
+
actor.value.should == 42
|
17
|
+
end
|
18
|
+
|
19
|
+
it "lists remote actors" do
|
20
|
+
@node.actors.should include :test_actor
|
21
|
+
@node.all.should include :test_actor
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,11 @@
|
|
1
|
+
# The Zookeeper CRuby dependency is pretty annoying :(
|
2
|
+
# Disabling until this can be spun off into a separate gem
|
3
|
+
=begin
|
4
|
+
require 'spec_helper'
|
5
|
+
require 'dcell/registries/zk_adapter'
|
6
|
+
|
7
|
+
describe DCell::Registry::ZkAdapter do
|
8
|
+
subject { DCell::Registry::ZkAdapter.new :server => 'localhost', :env => 'test' }
|
9
|
+
it_behaves_like "a DCell registry"
|
10
|
+
end
|
11
|
+
=end
|
data/spec/spec_helper.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
# For Gem.ruby, and almost certainly already loaded
|
2
|
+
require 'rubygems'
|
3
|
+
|
4
|
+
module TestNode
|
5
|
+
PORT = 21264
|
6
|
+
|
7
|
+
def self.start
|
8
|
+
@pid = Process.spawn Gem.ruby, File.expand_path("../../test_node.rb", __FILE__)
|
9
|
+
end
|
10
|
+
|
11
|
+
def self.wait_until_ready
|
12
|
+
STDERR.print "Waiting for test node to start up..."
|
13
|
+
|
14
|
+
socket = nil
|
15
|
+
30.times do
|
16
|
+
begin
|
17
|
+
socket = TCPSocket.open("127.0.0.1", PORT)
|
18
|
+
break if socket
|
19
|
+
rescue Errno::ECONNREFUSED
|
20
|
+
STDERR.print "."
|
21
|
+
sleep 1
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
if socket
|
26
|
+
STDERR.puts " done!"
|
27
|
+
socket.close
|
28
|
+
else
|
29
|
+
STDERR.puts " FAILED!"
|
30
|
+
raise "couldn't connect to test node!"
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
def self.stop
|
35
|
+
Process.kill 9, @pid
|
36
|
+
rescue Errno::ESRCH
|
37
|
+
ensure
|
38
|
+
Process.wait @pid rescue nil
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
shared_context "a DCell registry" do
|
2
|
+
context "node registry" do
|
3
|
+
before :each do
|
4
|
+
subject.clear_nodes
|
5
|
+
end
|
6
|
+
|
7
|
+
it "stores node addresses" do
|
8
|
+
address = "tcp://localhost:7777"
|
9
|
+
|
10
|
+
subject.set_node("foobar", address)
|
11
|
+
subject.get_node("foobar").should == address
|
12
|
+
end
|
13
|
+
|
14
|
+
it "stores the IDs of all nodes" do
|
15
|
+
subject.set_node("foobar", "tcp://localhost:7777")
|
16
|
+
subject.nodes.should include "foobar"
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
context "global registry" do
|
21
|
+
before :each do
|
22
|
+
subject.clear_globals
|
23
|
+
end
|
24
|
+
|
25
|
+
it "stores values" do
|
26
|
+
subject.set_global("foobar", [1,2,3])
|
27
|
+
subject.get_global("foobar").should == [1,2,3]
|
28
|
+
end
|
29
|
+
|
30
|
+
it "stores the keys of all globals" do
|
31
|
+
subject.set_global("foobar", true)
|
32
|
+
subject.global_keys.should include "foobar"
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
data/spec/test_node.rb
ADDED
@@ -0,0 +1,33 @@
|
|
1
|
+
# The DCell specs start a completely separate Ruby VM running this code
|
2
|
+
# for complete integration testing using 0MQ over TCP
|
3
|
+
|
4
|
+
require 'rubygems'
|
5
|
+
require 'bundler'
|
6
|
+
Bundler.setup
|
7
|
+
|
8
|
+
require 'dcell'
|
9
|
+
DCell.setup :id => 'test_node', :addr => 'tcp://127.0.0.1:21264'
|
10
|
+
|
11
|
+
class TestActor
|
12
|
+
include Celluloid
|
13
|
+
attr_reader :value
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@value = 42
|
17
|
+
end
|
18
|
+
|
19
|
+
def the_answer
|
20
|
+
DCell::Global[:the_answer]
|
21
|
+
end
|
22
|
+
|
23
|
+
def crash
|
24
|
+
raise "the spec purposely crashed me :("
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
class TestApplication < Celluloid::Application
|
29
|
+
supervise DCell::Application
|
30
|
+
supervise TestActor, :as => :test_actor
|
31
|
+
end
|
32
|
+
|
33
|
+
TestApplication.run
|
data/tasks/rspec.task
ADDED
@@ -0,0 +1,58 @@
|
|
1
|
+
require 'rake/clean'
|
2
|
+
|
3
|
+
namespace :zookeeper do
|
4
|
+
ZK_VERSION = "3.3.3"
|
5
|
+
ZK_TARBALL = "zookeeper-#{ZK_VERSION}.tar.gz"
|
6
|
+
|
7
|
+
task :download => "tmp/#{ZK_TARBALL}"
|
8
|
+
directory 'tmp'
|
9
|
+
|
10
|
+
file "tmp/#{ZK_TARBALL}" => "tmp" do
|
11
|
+
puts "*** Downloading Zookeeper"
|
12
|
+
sh "curl http://archive.apache.org/dist/zookeeper/zookeeper-#{ZK_VERSION}/#{ZK_TARBALL} -o tmp/#{ZK_TARBALL}"
|
13
|
+
end
|
14
|
+
|
15
|
+
task :install => :download do
|
16
|
+
puts "*** Unpacking Zookeeper"
|
17
|
+
|
18
|
+
rm_rf "zookeeper" if File.exists? "zookeeper"
|
19
|
+
sh "tar -zxvf tmp/#{ZK_TARBALL}"
|
20
|
+
mv "zookeeper-#{ZK_VERSION}", "zookeeper"
|
21
|
+
home = File.expand_path("../../zookeeper", __FILE__)
|
22
|
+
|
23
|
+
# Create base configuration
|
24
|
+
data = File.join(home, "data")
|
25
|
+
mkdir_p data
|
26
|
+
config = File.join(home, "conf", "zoo.cfg")
|
27
|
+
rm_r File.join(home, "conf", "zoo_sample.cfg")
|
28
|
+
|
29
|
+
File.open(config, "w") do |file|
|
30
|
+
# Maybe some kind soul will move this ugly heredoc into a template
|
31
|
+
file << <<-ZK_CONFIG
|
32
|
+
# The number of milliseconds of each tick
|
33
|
+
tickTime=2000
|
34
|
+
# The number of ticks that the initial
|
35
|
+
# synchronization phase can take
|
36
|
+
initLimit=10
|
37
|
+
# The number of ticks that can pass between
|
38
|
+
# sending a request and getting an acknowledgement
|
39
|
+
syncLimit=5
|
40
|
+
# the directory where the snapshot is stored.
|
41
|
+
dataDir=#{data}
|
42
|
+
# the port at which the clients will connect
|
43
|
+
clientPort=2181
|
44
|
+
ZK_CONFIG
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
task :start => :zookeeper do
|
49
|
+
puts "*** Starting Zookeeper"
|
50
|
+
sh "cd zookeeper && bin/zkServer.sh start"
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
file 'zookeeper' do
|
55
|
+
Rake::Task['zookeeper:install'].invoke
|
56
|
+
end
|
57
|
+
|
58
|
+
CLEAN.include "tmp", "zookeeper"
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: dcell
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,11 +9,22 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2011-
|
12
|
+
date: 2011-11-30 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: celluloid
|
16
|
-
requirement: &
|
16
|
+
requirement: &70327976661520 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.6.2
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70327976661520
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: ffi
|
27
|
+
requirement: &70327976682840 !ruby/object:Gem::Requirement
|
17
28
|
none: false
|
18
29
|
requirements:
|
19
30
|
- - ! '>='
|
@@ -21,10 +32,32 @@ dependencies:
|
|
21
32
|
version: '0'
|
22
33
|
type: :runtime
|
23
34
|
prerelease: false
|
24
|
-
version_requirements: *
|
35
|
+
version_requirements: *70327976682840
|
25
36
|
- !ruby/object:Gem::Dependency
|
26
37
|
name: ffi-rzmq
|
27
|
-
requirement: &
|
38
|
+
requirement: &70327976681680 !ruby/object:Gem::Requirement
|
39
|
+
none: false
|
40
|
+
requirements:
|
41
|
+
- - ! '>='
|
42
|
+
- !ruby/object:Gem::Version
|
43
|
+
version: '0'
|
44
|
+
type: :runtime
|
45
|
+
prerelease: false
|
46
|
+
version_requirements: *70327976681680
|
47
|
+
- !ruby/object:Gem::Dependency
|
48
|
+
name: redis
|
49
|
+
requirement: &70327976681260 !ruby/object:Gem::Requirement
|
50
|
+
none: false
|
51
|
+
requirements:
|
52
|
+
- - ! '>='
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '0'
|
55
|
+
type: :runtime
|
56
|
+
prerelease: false
|
57
|
+
version_requirements: *70327976681260
|
58
|
+
- !ruby/object:Gem::Dependency
|
59
|
+
name: redis-namespace
|
60
|
+
requirement: &70327976680800 !ruby/object:Gem::Requirement
|
28
61
|
none: false
|
29
62
|
requirements:
|
30
63
|
- - ! '>='
|
@@ -32,7 +65,29 @@ dependencies:
|
|
32
65
|
version: '0'
|
33
66
|
type: :runtime
|
34
67
|
prerelease: false
|
35
|
-
version_requirements: *
|
68
|
+
version_requirements: *70327976680800
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: rake
|
71
|
+
requirement: &70327976680260 !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
type: :development
|
78
|
+
prerelease: false
|
79
|
+
version_requirements: *70327976680260
|
80
|
+
- !ruby/object:Gem::Dependency
|
81
|
+
name: rspec
|
82
|
+
requirement: &70327976679760 !ruby/object:Gem::Requirement
|
83
|
+
none: false
|
84
|
+
requirements:
|
85
|
+
- - ! '>='
|
86
|
+
- !ruby/object:Gem::Version
|
87
|
+
version: 2.7.0
|
88
|
+
type: :development
|
89
|
+
prerelease: false
|
90
|
+
version_requirements: *70327976679760
|
36
91
|
description: DCell is an distributed object framework based on Celluloid built on
|
37
92
|
0MQ and Zookeeper
|
38
93
|
email:
|
@@ -42,11 +97,48 @@ extensions: []
|
|
42
97
|
extra_rdoc_files: []
|
43
98
|
files:
|
44
99
|
- .gitignore
|
100
|
+
- .rspec
|
101
|
+
- CHANGES.md
|
45
102
|
- Gemfile
|
103
|
+
- README.md
|
46
104
|
- Rakefile
|
105
|
+
- benchmarks/messaging.rb
|
106
|
+
- benchmarks/receiver.rb
|
47
107
|
- dcell.gemspec
|
108
|
+
- lib/celluloid/README
|
109
|
+
- lib/celluloid/zmq.rb
|
110
|
+
- lib/celluloid/zmq/mailbox.rb
|
111
|
+
- lib/celluloid/zmq/reactor.rb
|
48
112
|
- lib/dcell.rb
|
113
|
+
- lib/dcell/actor_proxy.rb
|
114
|
+
- lib/dcell/application.rb
|
115
|
+
- lib/dcell/celluloid_ext.rb
|
116
|
+
- lib/dcell/directory.rb
|
117
|
+
- lib/dcell/global.rb
|
118
|
+
- lib/dcell/mailbox_proxy.rb
|
119
|
+
- lib/dcell/messages.rb
|
120
|
+
- lib/dcell/node.rb
|
121
|
+
- lib/dcell/registries/redis_adapter.rb
|
122
|
+
- lib/dcell/registries/zk_adapter.rb
|
123
|
+
- lib/dcell/responses.rb
|
124
|
+
- lib/dcell/router.rb
|
125
|
+
- lib/dcell/rspec.rb
|
126
|
+
- lib/dcell/server.rb
|
49
127
|
- lib/dcell/version.rb
|
128
|
+
- spec/celluloid/zmq/mailbox_spec.rb
|
129
|
+
- spec/dcell/actor_proxy_spec.rb
|
130
|
+
- spec/dcell/celluloid_ext_spec.rb
|
131
|
+
- spec/dcell/directory_spec.rb
|
132
|
+
- spec/dcell/global_spec.rb
|
133
|
+
- spec/dcell/node_spec.rb
|
134
|
+
- spec/dcell/registries/redis_adapter_spec.rb
|
135
|
+
- spec/dcell/registries/zk_adapter_spec.rb
|
136
|
+
- spec/spec_helper.rb
|
137
|
+
- spec/support/helpers.rb
|
138
|
+
- spec/support/registry_examples.rb
|
139
|
+
- spec/test_node.rb
|
140
|
+
- tasks/rspec.task
|
141
|
+
- tasks/zookeeper.task
|
50
142
|
homepage: http://github.com/tarcieri/dcell
|
51
143
|
licenses: []
|
52
144
|
post_install_message:
|
@@ -71,5 +163,17 @@ rubygems_version: 1.8.10
|
|
71
163
|
signing_key:
|
72
164
|
specification_version: 3
|
73
165
|
summary: An asynchronous distributed object framework based on Celluloid
|
74
|
-
test_files:
|
166
|
+
test_files:
|
167
|
+
- spec/celluloid/zmq/mailbox_spec.rb
|
168
|
+
- spec/dcell/actor_proxy_spec.rb
|
169
|
+
- spec/dcell/celluloid_ext_spec.rb
|
170
|
+
- spec/dcell/directory_spec.rb
|
171
|
+
- spec/dcell/global_spec.rb
|
172
|
+
- spec/dcell/node_spec.rb
|
173
|
+
- spec/dcell/registries/redis_adapter_spec.rb
|
174
|
+
- spec/dcell/registries/zk_adapter_spec.rb
|
175
|
+
- spec/spec_helper.rb
|
176
|
+
- spec/support/helpers.rb
|
177
|
+
- spec/support/registry_examples.rb
|
178
|
+
- spec/test_node.rb
|
75
179
|
has_rdoc:
|