mdp 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 +19 -0
- data/CHANGELOG.rdoc +4 -0
- data/Gemfile +5 -0
- data/Gemfile.lock +19 -0
- data/README.rdoc +158 -0
- data/Rakefile +47 -0
- data/ext/majordomo/client.c +302 -0
- data/ext/majordomo/client.h +39 -0
- data/ext/majordomo/extconf.rb +25 -0
- data/ext/majordomo/jruby.h +9 -0
- data/ext/majordomo/majordomo_ext.c +19 -0
- data/ext/majordomo/majordomo_ext.h +26 -0
- data/ext/majordomo/prelude.h +23 -0
- data/ext/majordomo/rubinius.h +19 -0
- data/ext/majordomo/ruby18.h +38 -0
- data/ext/majordomo/ruby19.h +13 -0
- data/ext/majordomo/worker.c +366 -0
- data/ext/majordomo/worker.h +43 -0
- data/lib/majordomo.rb +8 -0
- data/lib/majordomo/version.rb +3 -0
- data/mdp.gemspec +22 -0
- data/test/helper.rb +20 -0
- data/test/test_client.rb +51 -0
- data/test/test_threading.rb +32 -0
- data/test/test_worker.rb +86 -0
- metadata +92 -0
@@ -0,0 +1,43 @@
|
|
1
|
+
#ifndef MAJORDOMO_WORKER_H
|
2
|
+
#define MAJORDOMO_WORKER_H
|
3
|
+
|
4
|
+
typedef struct {
|
5
|
+
mdp_worker_t *worker;
|
6
|
+
VALUE broker;
|
7
|
+
VALUE service;
|
8
|
+
VALUE heartbeat;
|
9
|
+
VALUE reconnect;
|
10
|
+
#ifndef HAVE_RB_THREAD_BLOCKING_REGION
|
11
|
+
zlist_t *recv_buffer;
|
12
|
+
#endif
|
13
|
+
} rb_majordomo_worker_t;
|
14
|
+
|
15
|
+
#define MAJORDOMO_WORKER_HEARTBEAT 2500
|
16
|
+
#define MAJORDOMO_WORKER_RECONNECT 2500
|
17
|
+
|
18
|
+
#define GetMajordomoWorker(obj) \
|
19
|
+
rb_majordomo_worker_t *worker = NULL; \
|
20
|
+
Data_Get_Struct(obj, rb_majordomo_worker_t, worker); \
|
21
|
+
if (!worker) rb_raise(rb_eTypeError, "uninitialized Majordomo worker!"); \
|
22
|
+
if (!worker->worker) rb_raise(rb_eRuntimeError, "Majordomo worker has already been closed!");
|
23
|
+
|
24
|
+
struct nogvl_md_worker_new_args {
|
25
|
+
char *broker;
|
26
|
+
char *service;
|
27
|
+
int verbose;
|
28
|
+
};
|
29
|
+
|
30
|
+
struct nogvl_md_worker_recv_args {
|
31
|
+
rb_majordomo_worker_t *worker;
|
32
|
+
zframe_t *reply;
|
33
|
+
};
|
34
|
+
|
35
|
+
struct nogvl_md_worker_send_args {
|
36
|
+
mdp_worker_t *worker;
|
37
|
+
zmsg_t *progress;
|
38
|
+
zframe_t *reply_to;
|
39
|
+
};
|
40
|
+
|
41
|
+
void _init_majordomo_worker();
|
42
|
+
|
43
|
+
#endif
|
data/lib/majordomo.rb
ADDED
data/mdp.gemspec
ADDED
@@ -0,0 +1,22 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.expand_path('../lib/majordomo/version', __FILE__)
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "mdp"
|
7
|
+
s.version = Majordomo::VERSION
|
8
|
+
s.summary = "Majordomo for Ruby"
|
9
|
+
s.description = "Majordomo - A Ruby binding for libmdp (Majordomo implementation in C)"
|
10
|
+
s.authors = ["Lourens Naudé"]
|
11
|
+
s.email = ["lourens@methodmissing.com"]
|
12
|
+
s.homepage = "http://github.com/methodmissing/majordomo"
|
13
|
+
s.date = Time.now.utc.strftime('%Y-%m-%d')
|
14
|
+
s.platform = Gem::Platform::RUBY
|
15
|
+
s.extensions = "ext/majordomo/extconf.rb"
|
16
|
+
s.has_rdoc = true
|
17
|
+
s.files = `git ls-files`.split("\n")
|
18
|
+
s.test_files = `git ls-files test`.split("\n")
|
19
|
+
s.rdoc_options = ["--charset=UTF-8"]
|
20
|
+
s.require_paths = ["lib"]
|
21
|
+
s.add_development_dependency('rake-compiler', '~> 0.8.0')
|
22
|
+
end
|
data/test/helper.rb
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require 'test/unit'
|
4
|
+
require 'majordomo'
|
5
|
+
|
6
|
+
class MajordomoTestCase < Test::Unit::TestCase
|
7
|
+
undef_method :default_test if method_defined? :default_test
|
8
|
+
|
9
|
+
BROKER = "tcp://localhost:5555"
|
10
|
+
|
11
|
+
if ENV['STRESS_GC']
|
12
|
+
def setup
|
13
|
+
GC.stress = true
|
14
|
+
end
|
15
|
+
|
16
|
+
def teardown
|
17
|
+
GC.stress = false
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
data/test/test_client.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestClient < MajordomoTestCase
|
6
|
+
def test_init
|
7
|
+
client = Majordomo::Client.new(BROKER)
|
8
|
+
assert_instance_of Majordomo::Client, client
|
9
|
+
client.close
|
10
|
+
|
11
|
+
assert_raises TypeError do
|
12
|
+
Majordomo::Client.new(:invalid)
|
13
|
+
end
|
14
|
+
|
15
|
+
client = Majordomo::Client.new(BROKER, true)
|
16
|
+
ensure
|
17
|
+
client.close
|
18
|
+
end
|
19
|
+
|
20
|
+
def test_broker
|
21
|
+
client = Majordomo::Client.new(BROKER)
|
22
|
+
assert_equal BROKER, client.broker
|
23
|
+
ensure
|
24
|
+
client.close
|
25
|
+
end
|
26
|
+
|
27
|
+
def test_timeout
|
28
|
+
client = Majordomo::Client.new(BROKER)
|
29
|
+
assert_equal 2500, client.timeout
|
30
|
+
client.timeout = 1000
|
31
|
+
assert_equal 1000, client.timeout
|
32
|
+
ensure
|
33
|
+
client.close
|
34
|
+
end
|
35
|
+
|
36
|
+
def test_close
|
37
|
+
client = Majordomo::Client.new(BROKER)
|
38
|
+
assert_nil client.close
|
39
|
+
assert_raises RuntimeError do
|
40
|
+
client.timeout
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
def test_send
|
45
|
+
client = Majordomo::Client.new(BROKER, true)
|
46
|
+
client.timeout = 100;
|
47
|
+
assert client.send("test", "message")
|
48
|
+
ensure
|
49
|
+
client.close
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestThreading < MajordomoTestCase
|
6
|
+
def test_send_recv
|
7
|
+
threads = []
|
8
|
+
req_received, rep_received = 0, 0
|
9
|
+
threads << Thread.new do
|
10
|
+
client = Majordomo::Client.new(BROKER, true)
|
11
|
+
client.timeout = 100
|
12
|
+
100.times do
|
13
|
+
client.send("thread_test", "ping")
|
14
|
+
reply = client.recv("thread_test")
|
15
|
+
rep_received += 1 if reply
|
16
|
+
end
|
17
|
+
end
|
18
|
+
|
19
|
+
threads << Thread.new do
|
20
|
+
worker = Majordomo::Worker.new(BROKER, "thread_test", true)
|
21
|
+
100.times do
|
22
|
+
request, reply_to = worker.recv
|
23
|
+
req_received += 1 if request
|
24
|
+
worker.send("pong", reply_to)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
threads.map(&:join)
|
29
|
+
assert_equal req_received, 100
|
30
|
+
assert_equal rep_received, 100
|
31
|
+
end
|
32
|
+
end
|
data/test/test_worker.rb
ADDED
@@ -0,0 +1,86 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
|
3
|
+
require File.join(File.dirname(__FILE__), 'helper')
|
4
|
+
|
5
|
+
class TestWorker < MajordomoTestCase
|
6
|
+
def test_init
|
7
|
+
worker = Majordomo::Worker.new(BROKER, "test_init")
|
8
|
+
assert_instance_of Majordomo::Worker, worker
|
9
|
+
worker.close
|
10
|
+
|
11
|
+
assert_raises TypeError do
|
12
|
+
Majordomo::Worker.new(:invalid, "test")
|
13
|
+
end
|
14
|
+
|
15
|
+
assert_raises TypeError do
|
16
|
+
Majordomo::Worker.new(BROKER, :invalid)
|
17
|
+
end
|
18
|
+
|
19
|
+
worker = Majordomo::Worker.new(BROKER, "test", true)
|
20
|
+
ensure
|
21
|
+
worker.close
|
22
|
+
end
|
23
|
+
|
24
|
+
def test_broker
|
25
|
+
worker = Majordomo::Worker.new(BROKER, "test")
|
26
|
+
assert_equal BROKER, worker.broker
|
27
|
+
ensure
|
28
|
+
worker.close
|
29
|
+
end
|
30
|
+
|
31
|
+
def test_service
|
32
|
+
service = "test_service"
|
33
|
+
worker = Majordomo::Worker.new(BROKER, service)
|
34
|
+
assert_equal service, worker.service
|
35
|
+
ensure
|
36
|
+
worker.close
|
37
|
+
end
|
38
|
+
|
39
|
+
def test_heartbeat
|
40
|
+
worker = Majordomo::Worker.new(BROKER, "test_heartbeat")
|
41
|
+
assert_equal 2500, worker.heartbeat
|
42
|
+
worker.heartbeat = 100
|
43
|
+
assert_equal 100, worker.heartbeat
|
44
|
+
ensure
|
45
|
+
worker.close
|
46
|
+
end
|
47
|
+
|
48
|
+
def test_reconnect
|
49
|
+
worker = Majordomo::Worker.new(BROKER, "test_reconnect")
|
50
|
+
assert_equal 2500, worker.reconnect
|
51
|
+
worker.reconnect = 100
|
52
|
+
assert_equal 100, worker.reconnect
|
53
|
+
ensure
|
54
|
+
worker.close
|
55
|
+
end
|
56
|
+
|
57
|
+
def test_close
|
58
|
+
worker = Majordomo::Worker.new(BROKER, "test_close")
|
59
|
+
assert_nil worker.close
|
60
|
+
|
61
|
+
assert_raises RuntimeError do
|
62
|
+
worker.reconnect
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
def test_recv
|
67
|
+
service = "test_revc"
|
68
|
+
worker = Majordomo::Worker.new(BROKER, service, true)
|
69
|
+
worker.heartbeat = 100
|
70
|
+
worker.reconnect = 100
|
71
|
+
|
72
|
+
client = Majordomo::Client.new(BROKER, true)
|
73
|
+
client.timeout = 100
|
74
|
+
assert client.send service, "request"
|
75
|
+
|
76
|
+
request = worker.recv
|
77
|
+
assert_instance_of Array, request
|
78
|
+
assert_equal "request", request[0]
|
79
|
+
|
80
|
+
assert worker.send("reply", request[1])
|
81
|
+
assert_equal "reply", client.recv(service)
|
82
|
+
ensure
|
83
|
+
client.close
|
84
|
+
worker.close
|
85
|
+
end
|
86
|
+
end
|
metadata
ADDED
@@ -0,0 +1,92 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: mdp
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: '0.1'
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Lourens Naudé
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2012-09-06 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake-compiler
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ~>
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 0.8.0
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ~>
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 0.8.0
|
30
|
+
description: Majordomo - A Ruby binding for libmdp (Majordomo implementation in C)
|
31
|
+
email:
|
32
|
+
- lourens@methodmissing.com
|
33
|
+
executables: []
|
34
|
+
extensions:
|
35
|
+
- ext/majordomo/extconf.rb
|
36
|
+
extra_rdoc_files: []
|
37
|
+
files:
|
38
|
+
- .gitignore
|
39
|
+
- CHANGELOG.rdoc
|
40
|
+
- Gemfile
|
41
|
+
- Gemfile.lock
|
42
|
+
- README.rdoc
|
43
|
+
- Rakefile
|
44
|
+
- ext/majordomo/client.c
|
45
|
+
- ext/majordomo/client.h
|
46
|
+
- ext/majordomo/extconf.rb
|
47
|
+
- ext/majordomo/jruby.h
|
48
|
+
- ext/majordomo/majordomo_ext.c
|
49
|
+
- ext/majordomo/majordomo_ext.h
|
50
|
+
- ext/majordomo/prelude.h
|
51
|
+
- ext/majordomo/rubinius.h
|
52
|
+
- ext/majordomo/ruby18.h
|
53
|
+
- ext/majordomo/ruby19.h
|
54
|
+
- ext/majordomo/worker.c
|
55
|
+
- ext/majordomo/worker.h
|
56
|
+
- lib/majordomo.rb
|
57
|
+
- lib/majordomo/version.rb
|
58
|
+
- mdp.gemspec
|
59
|
+
- test/helper.rb
|
60
|
+
- test/test_client.rb
|
61
|
+
- test/test_threading.rb
|
62
|
+
- test/test_worker.rb
|
63
|
+
homepage: http://github.com/methodmissing/majordomo
|
64
|
+
licenses: []
|
65
|
+
post_install_message:
|
66
|
+
rdoc_options:
|
67
|
+
- --charset=UTF-8
|
68
|
+
require_paths:
|
69
|
+
- lib
|
70
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
71
|
+
none: false
|
72
|
+
requirements:
|
73
|
+
- - ! '>='
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '0'
|
76
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
77
|
+
none: false
|
78
|
+
requirements:
|
79
|
+
- - ! '>='
|
80
|
+
- !ruby/object:Gem::Version
|
81
|
+
version: '0'
|
82
|
+
requirements: []
|
83
|
+
rubyforge_project:
|
84
|
+
rubygems_version: 1.8.24
|
85
|
+
signing_key:
|
86
|
+
specification_version: 3
|
87
|
+
summary: Majordomo for Ruby
|
88
|
+
test_files:
|
89
|
+
- test/helper.rb
|
90
|
+
- test/test_client.rb
|
91
|
+
- test/test_threading.rb
|
92
|
+
- test/test_worker.rb
|