brb 0.2.0 → 0.2.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/CHANGELOG.rdoc +5 -0
- data/README.rdoc +1 -1
- data/examples/simple_client.rb +27 -32
- data/examples/simple_core.rb +4 -7
- data/lib/brb.rb +1 -45
- data/lib/brb/event_machine.rb +79 -32
- data/lib/brb/exception.rb +1 -0
- data/lib/brb/service.rb +60 -0
- data/lib/brb/tunnel.rb +5 -5
- data/lib/brb/tunnel/shared.rb +1 -1
- data/spec/brb/brb_massive_usage_spec.rb +1 -1
- data/spec/brb/brb_service_spec.rb +1 -1
- data/spec/brb/brb_tunnel_spec.rb +1 -1
- data/spec/spec_helper.rb +2 -21
- metadata +6 -5
data/CHANGELOG.rdoc
CHANGED
data/README.rdoc
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
= BrB - Easy and Fast distributed ruby
|
2
2
|
|
3
|
-
BrB is a simple and extremely fast interface for doing simple distributed ruby.
|
3
|
+
BrB is a simple, fully transparent and extremely fast interface for doing simple distributed ruby.
|
4
4
|
The main power of the architecture is provided by EventMachine (Fast and reliable IO event library).
|
5
5
|
|
6
6
|
BrB was build in order to achieve these 4 main goals :
|
data/examples/simple_client.rb
CHANGED
@@ -1,37 +1,32 @@
|
|
1
|
-
require '
|
1
|
+
require File.join(File.dirname(__FILE__), '../init.rb')
|
2
2
|
|
3
3
|
port = 5555
|
4
4
|
host = 'localhost'
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
#
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
end
|
19
|
-
|
20
|
-
# Calling 10 times again long treatment time distant methods
|
21
|
-
10.times do
|
22
|
-
core.simple_long_api_method # Do not wait for response
|
23
|
-
end
|
24
|
-
|
25
|
-
# Calling a blocking method with _block on the distant core server :
|
26
|
-
puts " >> Calling 1s call, and wait for response..."
|
27
|
-
r = core.simple_api_method_block
|
28
|
-
puts " > Api response : #{r}"
|
29
|
-
|
30
|
-
puts " >> Calling long call, and wait for response..."
|
31
|
-
r = core.simple_long_api_method_block
|
32
|
-
puts " > Api long response : #{r}"
|
33
|
-
|
34
|
-
# Our job is over, close
|
35
|
-
EM.stop
|
36
|
-
end
|
6
|
+
# Connecting to the core server, retrieving its interface object : core
|
7
|
+
# We do not want to expose an object, so the first parameter is nil
|
8
|
+
core = BrB::Tunnel.create(nil, "brb://#{host}:#{port}", :silent => false)
|
9
|
+
|
10
|
+
# Calling 10 times an non blocking method on the distant core server
|
11
|
+
10.times do
|
12
|
+
core.simple_api_method # Do not wait for response
|
13
|
+
end
|
14
|
+
|
15
|
+
# Calling 10 times again long treatment time distant methods
|
16
|
+
10.times do
|
17
|
+
core.simple_long_api_method # Do not wait for response
|
37
18
|
end
|
19
|
+
|
20
|
+
# Calling a blocking method with _block on the distant core server :
|
21
|
+
puts " >> Calling 1s call, and wait for response..."
|
22
|
+
r = core.simple_api_method_block
|
23
|
+
puts " > Api response : #{r}"
|
24
|
+
|
25
|
+
puts " >> Calling long call, and wait for response..."
|
26
|
+
r = core.simple_long_api_method_block
|
27
|
+
puts " > Api long response : #{r}"
|
28
|
+
|
29
|
+
core.stop_service
|
30
|
+
|
31
|
+
# Our job is over, close event machine :
|
32
|
+
EM.stop
|
data/examples/simple_core.rb
CHANGED
@@ -1,4 +1,4 @@
|
|
1
|
-
require '
|
1
|
+
require File.join(File.dirname(__FILE__), '../init.rb')
|
2
2
|
|
3
3
|
class ExposedCoreObject
|
4
4
|
|
@@ -23,9 +23,6 @@ Thread.abort_on_exception = true
|
|
23
23
|
port = 5555
|
24
24
|
host = 'localhost'
|
25
25
|
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
puts " > Starting the core on brb://#{host}:#{port}"
|
30
|
-
BrB::Service.instance.start_service(:object => ExposedCoreObject.new, :silent => false, :host => host, :port => port)
|
31
|
-
end
|
26
|
+
puts " > Starting the core on brb://#{host}:#{port}"
|
27
|
+
BrB::Service.start_service(:object => ExposedCoreObject.new, :silent => false, :host => host, :port => port)
|
28
|
+
EM.reactor_thread.join
|
data/lib/brb.rb
CHANGED
@@ -1,48 +1,4 @@
|
|
1
1
|
require File.join(File.dirname(__FILE__), 'brb', 'exception.rb')
|
2
2
|
require File.join(File.dirname(__FILE__), 'brb', 'event_machine.rb')
|
3
|
+
require File.join(File.dirname(__FILE__), 'brb', 'service.rb')
|
3
4
|
require File.join(File.dirname(__FILE__), 'brb', 'tunnel.rb')
|
4
|
-
require 'singleton'
|
5
|
-
|
6
|
-
#
|
7
|
-
# Brb Main class used to do basic distributed ruby, Simple but fast
|
8
|
-
# Use two distinct canal, one for the command reception, and the other one for send return value
|
9
|
-
#
|
10
|
-
module BrB
|
11
|
-
class Service
|
12
|
-
attr_reader :silent
|
13
|
-
attr_reader :uri
|
14
|
-
|
15
|
-
include Singleton
|
16
|
-
|
17
|
-
# Start a server hosted on the object given,
|
18
|
-
# If an uri is given, automatcilay connect to the distant brb object
|
19
|
-
def start_service(opts = {}, &block)
|
20
|
-
return if @em_signature
|
21
|
-
|
22
|
-
@silent = opts[:silent]
|
23
|
-
|
24
|
-
addr = "brb://#{opts[:host] || 'localhost'}:#{opts[:port] || 6200}"
|
25
|
-
|
26
|
-
tputs " [BrB] Start service on #{addr} ..."
|
27
|
-
@uri, @em_signature = BrBProtocol.open_server(addr, BrB::Tunnel::Handler, opts.merge(:block => block))
|
28
|
-
tputs " [BrB] Service started on #{@uri}"
|
29
|
-
end
|
30
|
-
|
31
|
-
private
|
32
|
-
def tputs(s)
|
33
|
-
puts s if !@silent
|
34
|
-
end
|
35
|
-
|
36
|
-
public
|
37
|
-
# Stop the Brb Service
|
38
|
-
def stop_service
|
39
|
-
return if !@em_signature
|
40
|
-
|
41
|
-
tputs ' [BrB] Stop service'
|
42
|
-
EM::stop_server(@em_signature)
|
43
|
-
@em_signature = nil
|
44
|
-
@uri = nil
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
48
|
-
end
|
data/lib/brb/event_machine.rb
CHANGED
@@ -1,44 +1,91 @@
|
|
1
|
+
# Define a BrB::Protocol using event machine
|
1
2
|
require 'eventmachine'
|
2
3
|
|
3
|
-
|
4
|
-
class
|
4
|
+
module BrB
|
5
|
+
class EventMachine
|
5
6
|
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
7
|
+
class << self
|
8
|
+
|
9
|
+
private
|
10
|
+
# If EM::run has not been called yet, start the EM reactor in another thread.
|
11
|
+
def ensure_em_is_started!
|
12
|
+
if !EM::reactor_running?
|
13
|
+
# Launch event machine reactor
|
14
|
+
q = Queue.new
|
15
|
+
Thread.new do
|
16
|
+
EM::run do
|
17
|
+
q << true # Set to the calling thread that the reactor is running
|
18
|
+
#EM::set_quantum(20)
|
19
|
+
#EventMachine::epoll
|
20
|
+
end
|
21
|
+
end
|
22
|
+
# Wait for event machine running :
|
23
|
+
q.pop
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
|
28
|
+
public
|
29
|
+
def open(uri, klass, opts = {})
|
30
|
+
host, port = parse_uri(uri)
|
31
|
+
begin
|
32
|
+
ensure_em_is_started!
|
33
|
+
|
34
|
+
q = Queue.new
|
35
|
+
EM.schedule do
|
36
|
+
q << EM::connect(host, port, klass, opts.merge(:uri => "brb://#{host}:#{port}"))
|
37
|
+
end
|
38
|
+
|
39
|
+
# Wait for socket connection with the q.pop
|
40
|
+
return q.pop
|
41
|
+
|
42
|
+
rescue Exception => e
|
43
|
+
puts e.backtrace.join("\n")
|
44
|
+
raise "#{e} - #{uri}"
|
45
|
+
end
|
46
|
+
end
|
13
47
|
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
48
|
+
def open_server(uri, klass, opts = {})
|
49
|
+
host, port = parse_uri(uri)
|
50
|
+
max = 80 # Nb try before giving up
|
51
|
+
begin
|
52
|
+
uri = "brb://#{host}:#{port}"
|
53
|
+
ensure_em_is_started!
|
18
54
|
|
19
|
-
|
20
|
-
|
21
|
-
|
55
|
+
# Schedule server creation for thread safety
|
56
|
+
q = Queue.new
|
57
|
+
EM.schedule do
|
58
|
+
q << EM::start_server(host, port, klass, opts.merge(:uri => uri))
|
59
|
+
end
|
60
|
+
|
61
|
+
# Wait for server creation with the q.pop
|
62
|
+
return uri, q.pop
|
63
|
+
|
64
|
+
rescue Exception => e
|
65
|
+
max -= 1
|
66
|
+
port += 1
|
67
|
+
retry if max > 0
|
68
|
+
puts e.backtrace.join("\n")
|
69
|
+
raise "#{e} - BrB Tcp Event machine Can not bind on #{host}:#{port}"
|
70
|
+
end
|
71
|
+
|
72
|
+
end
|
22
73
|
end
|
23
|
-
return socket
|
24
74
|
end
|
75
|
+
|
76
|
+
class Protocol < EventMachine
|
77
|
+
|
78
|
+
class << self
|
79
|
+
|
80
|
+
def parse_uri(uri)
|
81
|
+
if /^brb:\/\/(.+):([0-9]+)$/ =~ uri
|
82
|
+
[$1, $2.to_i]
|
83
|
+
else
|
84
|
+
raise "Bad tcp BrB url: '#{uri}'"
|
85
|
+
end
|
86
|
+
end
|
25
87
|
|
26
|
-
def self.open_server(uri, klass, opts = {})
|
27
|
-
host, port = parse_uri(uri)
|
28
|
-
max = 80
|
29
|
-
begin
|
30
|
-
#EventMachine::epoll
|
31
|
-
uri = "brb://#{host}:#{port}"
|
32
|
-
return uri, EventMachine::start_server(host, port, klass, opts.merge(:uri => uri))
|
33
|
-
rescue Exception => e
|
34
|
-
max -= 1
|
35
|
-
port += 1
|
36
|
-
retry if max > 0
|
37
|
-
puts e.backtrace.join("\n")
|
38
|
-
raise "#{e} - BrB Tcp Event machine Can not bind on #{host}:#{port}"
|
39
88
|
end
|
40
89
|
end
|
41
90
|
end
|
42
91
|
|
43
|
-
class BrBProtocol < BrBEventMachine
|
44
|
-
end
|
data/lib/brb/exception.rb
CHANGED
@@ -0,0 +1 @@
|
|
1
|
+
# Future BrB custom exceptions will come here
|
data/lib/brb/service.rb
ADDED
@@ -0,0 +1,60 @@
|
|
1
|
+
#
|
2
|
+
# Brb Main class used to do basic distributed ruby, Simple but fast
|
3
|
+
# Use two distinct canal, one for the command reception, and the other one for send return value
|
4
|
+
#
|
5
|
+
module BrB
|
6
|
+
class Service
|
7
|
+
@@uri = nil
|
8
|
+
@@em_signature = nil
|
9
|
+
@@silent = true
|
10
|
+
|
11
|
+
class << self
|
12
|
+
|
13
|
+
private
|
14
|
+
def tputs(s)
|
15
|
+
puts s if !@@silent
|
16
|
+
end
|
17
|
+
|
18
|
+
public
|
19
|
+
|
20
|
+
# Start a server hosted on the object given,
|
21
|
+
# If an uri is given, automatcilay connect to the distant brb object
|
22
|
+
def start_service(opts = {}, &block)
|
23
|
+
return if @@em_signature
|
24
|
+
|
25
|
+
@@silent = opts[:silent]
|
26
|
+
|
27
|
+
addr = "brb://#{opts[:host] || 'localhost'}:#{opts[:port] || 6200}"
|
28
|
+
|
29
|
+
tputs " [BrB] Start service on #{addr} ..."
|
30
|
+
@@uri, @@em_signature = BrB::Protocol::open_server(addr, BrB::Tunnel::Handler, opts.merge(:block => block))
|
31
|
+
tputs " [BrB] Service started on #{@@uri}"
|
32
|
+
end
|
33
|
+
|
34
|
+
def uri
|
35
|
+
@@uri
|
36
|
+
end
|
37
|
+
|
38
|
+
# Stop the Brb Service
|
39
|
+
def stop_service
|
40
|
+
return if !@@em_signature or !EM::reactor_running?
|
41
|
+
|
42
|
+
tputs " [BrB] Stop service on #{@@uri}"
|
43
|
+
sign = @@em_signature
|
44
|
+
q = Queue.new # Creation of a Queue for waiting server to stop
|
45
|
+
EM::schedule do
|
46
|
+
q << EM::stop_server(sign)
|
47
|
+
end
|
48
|
+
q.pop
|
49
|
+
@@em_signature = nil
|
50
|
+
@@uri = nil
|
51
|
+
end
|
52
|
+
|
53
|
+
# Deprecated old method
|
54
|
+
def instance
|
55
|
+
puts "DEPRECATION WARNING: BrB::Service::instance is deprecated => Just use BrB::Service"
|
56
|
+
self
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
data/lib/brb/tunnel.rb
CHANGED
@@ -7,11 +7,11 @@ module BrB
|
|
7
7
|
module Tunnel
|
8
8
|
|
9
9
|
def self.create(object, uri = nil, opts = {}, &block)
|
10
|
-
|
10
|
+
BrB::Protocol.open(uri, BrB::Tunnel::Handler, opts.merge(:object => object, :block => block))
|
11
11
|
end
|
12
12
|
|
13
13
|
# Brb interface Handler for Tunnel over Event machine
|
14
|
-
class Handler < EventMachine::Connection
|
14
|
+
class Handler < ::EventMachine::Connection
|
15
15
|
attr_reader :uri
|
16
16
|
|
17
17
|
include BrB::Request
|
@@ -38,12 +38,12 @@ module BrB
|
|
38
38
|
tputs " [BrB] Tunnel initialized on #{@uri}"
|
39
39
|
@active = true
|
40
40
|
if @block
|
41
|
-
|
41
|
+
EM.defer do
|
42
42
|
@block.call(:register, self)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
end
|
46
|
-
|
46
|
+
|
47
47
|
def close_connection(after_writing = false)
|
48
48
|
@active = false
|
49
49
|
super
|
@@ -53,7 +53,7 @@ module BrB
|
|
53
53
|
tputs ' [BrB] Tunnel service closed'
|
54
54
|
@active = false
|
55
55
|
if @block
|
56
|
-
|
56
|
+
EM.defer do
|
57
57
|
@block.call(:unregister, self)
|
58
58
|
end
|
59
59
|
end
|
data/lib/brb/tunnel/shared.rb
CHANGED
data/spec/brb/brb_tunnel_spec.rb
CHANGED
data/spec/spec_helper.rb
CHANGED
@@ -6,30 +6,11 @@ Thread.abort_on_exception = true
|
|
6
6
|
require File.dirname(__FILE__) + '/../init.rb'
|
7
7
|
|
8
8
|
def open_service(object, host = 'localhost', port = 6200)
|
9
|
-
|
10
|
-
# Launch event machine reactor
|
11
|
-
Thread.new do
|
12
|
-
EM::run do
|
13
|
-
EM::set_quantum(20)
|
14
|
-
end
|
15
|
-
end
|
16
|
-
sleep 0.05
|
17
|
-
end
|
18
|
-
r = nil
|
19
|
-
EM.schedule do
|
20
|
-
r = BrB::Service.instance.start_service(:object => object, :silent => true, :host => host, :port => port)
|
21
|
-
end
|
22
|
-
sleep 0.1
|
23
|
-
return r
|
9
|
+
BrB::Service.start_service(:object => object, :silent => true, :host => host, :port => port)
|
24
10
|
end
|
25
11
|
|
26
12
|
def connect_to_the_service(object_exposed, uri, &block)
|
27
|
-
|
28
|
-
EM.schedule do
|
29
|
-
r = BrB::Tunnel.create(object_exposed, uri, :silent => true, &block)
|
30
|
-
end
|
31
|
-
sleep 0.1
|
32
|
-
return r
|
13
|
+
BrB::Tunnel.create(object_exposed, uri, :silent => true, &block)
|
33
14
|
end
|
34
15
|
|
35
16
|
class BrBTest
|
metadata
CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
|
|
5
5
|
segments:
|
6
6
|
- 0
|
7
7
|
- 2
|
8
|
-
-
|
9
|
-
version: 0.2.
|
8
|
+
- 1
|
9
|
+
version: 0.2.1
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- Guillaume Luccisano
|
@@ -14,7 +14,7 @@ autorequire:
|
|
14
14
|
bindir: bin
|
15
15
|
cert_chain: []
|
16
16
|
|
17
|
-
date: 2010-04-
|
17
|
+
date: 2010-04-19 00:00:00 +02:00
|
18
18
|
default_executable:
|
19
19
|
dependencies:
|
20
20
|
- !ruby/object:Gem::Dependency
|
@@ -29,7 +29,7 @@ dependencies:
|
|
29
29
|
version: "0"
|
30
30
|
type: :runtime
|
31
31
|
version_requirements: *id001
|
32
|
-
description: BrB is a simple and extremely fast interface for doing simple distributed ruby and message passing
|
32
|
+
description: BrB is a simple, fully transparent and extremely fast interface for doing simple distributed ruby and message passing
|
33
33
|
email: guillaume.luccisano@gmail.com
|
34
34
|
executables: []
|
35
35
|
|
@@ -43,6 +43,7 @@ files:
|
|
43
43
|
- lib/brb/event_machine.rb
|
44
44
|
- lib/brb/exception.rb
|
45
45
|
- lib/brb/request.rb
|
46
|
+
- lib/brb/service.rb
|
46
47
|
- lib/brb/tunnel/shared.rb
|
47
48
|
- lib/brb/tunnel.rb
|
48
49
|
- lib/brb.rb
|
@@ -86,6 +87,6 @@ rubyforge_project: brb
|
|
86
87
|
rubygems_version: 1.3.6
|
87
88
|
signing_key:
|
88
89
|
specification_version: 3
|
89
|
-
summary: BrB is a simple and extremely fast interface for doing simple distributed ruby
|
90
|
+
summary: BrB is a simple, fully transparent and extremely fast interface for doing simple distributed ruby
|
90
91
|
test_files: []
|
91
92
|
|