RingyDingy 1.4 → 1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 1054fdc0bd640813aee2cea5b6b2509e37dba286
4
- data.tar.gz: 213d83aeee80b18b00cf43da678d87af8fb86872
3
+ metadata.gz: 49a70aaeac4ce0f4d9e3bddb018da38372ca5d0d
4
+ data.tar.gz: 373f70d3c2e3bb548fdf5cfd81e32f77e40aeb32
5
5
  SHA512:
6
- metadata.gz: 0ac41a4cbcf2c46ad0ff168e3edb6329bb58bf02a16c3ec35a8e4df21d51ee9939485b46d39aaeb17d195119a68a208c48a64ec07f8cc7bcb1a4ea22ea864d9f
7
- data.tar.gz: 646b70ea57a8976574b2972d88f83e6c18d1497bc0efb75109257f35d86f00b6157bf087f86e0e7b2cee9abab5da1494aca21392e38fd0adc31b3c0ca88f7b29
6
+ metadata.gz: 50ce6ae837b4dcde616b9c9d8dcf5376c01527a2a6300c9e6a7b2fa6b58e5787b4bbdf1aaa492fa5eec92d4f8562804b3af098dc7c8ff42d1470df7f323571a8
7
+ data.tar.gz: eaec7dfff951f1b88bcfa18445a5427394d130a3e7a12e314004426cf1c28090602a74016c73fc7473c65ee8ac3d10ce831a0c2ccb19533abfc95660e0aafeb0
checksums.yaml.gz.sig CHANGED
Binary file
data.tar.gz.sig CHANGED
Binary file
data/History.rdoc CHANGED
@@ -1,3 +1,8 @@
1
+ === 1.5 / 2013-05-03
2
+
3
+ * Added RingyDingy::Lookup to handle lookup of services.
4
+ * Added RingyDingy::Lookup#wait_for to wait on a recently registered service
5
+
1
6
  === 1.4 / 2013-03-15
2
7
 
3
8
  * Work around [ruby-talk:395364] by adding a timeout.
data/Manifest.txt CHANGED
@@ -5,6 +5,10 @@ README.rdoc
5
5
  Rakefile
6
6
  bin/ring_server
7
7
  lib/ringy_dingy.rb
8
+ lib/ringy_dingy/cancelable_renewer.rb
9
+ lib/ringy_dingy/lookup.rb
8
10
  lib/ringy_dingy/ring_server.rb
9
11
  test/test_ring_server.rb
10
12
  test/test_ringy_dingy.rb
13
+ test/test_ringy_dingy_cancelable_renewer.rb
14
+ test/test_ringy_dingy_lookup.rb
data/Rakefile CHANGED
@@ -2,6 +2,7 @@ require 'hoe'
2
2
 
3
3
  Hoe.plugin :git
4
4
  Hoe.plugin :minitest
5
+ Hoe.plugin :travis
5
6
 
6
7
  Hoe.spec 'RingyDingy' do |p|
7
8
  p.developer 'Eric Hodel', 'drbrain@segment7.net'
data/lib/ringy_dingy.rb CHANGED
@@ -2,8 +2,6 @@ require 'English'
2
2
  require 'drb'
3
3
  require 'rinda/ring'
4
4
 
5
- $TESTING = false unless defined? $TESTING
6
-
7
5
  ##
8
6
  # RingyDingy registers a DRb service with a Rinda::RingServer and re-registers
9
7
  # the service if communication with the Rinda::RingServer is ever lost.
@@ -24,7 +22,7 @@ class RingyDingy
24
22
  ##
25
23
  # The version of RingyDingy you are using
26
24
 
27
- VERSION = '1.4'
25
+ VERSION = '1.5'
28
26
 
29
27
  ##
30
28
  # Interval to check the RingServer for our registration information.
@@ -47,10 +45,8 @@ class RingyDingy
47
45
 
48
46
  attr_reader :thread
49
47
 
50
- if $TESTING then
51
- attr_accessor :ring_finger, :renewer # :nodoc:
52
- attr_writer :ring_server, :thread # :nodoc:
53
- end
48
+ attr_accessor :ring_finger, :renewer # :nodoc:
49
+ attr_writer :ring_server, :thread # :nodoc:
54
50
 
55
51
  ##
56
52
  # Lists of hosts to search for ring servers. By default includes the subnet
@@ -63,32 +59,7 @@ class RingyDingy
63
59
  # Ring servers are discovered via the +broadcast_list+.
64
60
 
65
61
  def self.find service_name, broadcast_list = BROADCAST_LIST
66
- DRb.start_service unless DRb.primary_server
67
- rf = Rinda::RingFinger.new broadcast_list
68
-
69
- services = {}
70
-
71
- rf.lookup_ring do |ts|
72
- services[ts.__drburi] = ts.read_all [:name, nil, DRbObject, nil]
73
- end
74
-
75
- services.each do |_, tuples|
76
- tuples.each do |_, found_service_name, service|
77
- begin
78
- next unless found_service_name == service_name
79
-
80
- service.method_missing :object_id # ping service for liveness
81
-
82
- return service
83
- rescue DRb::DRbConnError
84
- next
85
- rescue NoMethodError
86
- next
87
- end
88
- end
89
- end
90
-
91
- raise "unable to find service #{service_name.inspect}"
62
+ RingyDingy::Lookup.new(broadcast_list).find service_name
92
63
  end
93
64
 
94
65
  ##
@@ -116,9 +87,13 @@ class RingyDingy
116
87
  # Registers this service with the primary Rinda::RingServer.
117
88
 
118
89
  def register
119
- ring_server.write [:name, @service, DRbObject.new(@object), @identifier],
120
- @renewer
121
- return nil
90
+ reference = DRb::DRbObject.new(@object)
91
+
92
+ tuple = [:name, @service, reference, @identifier]
93
+
94
+ ring_server.write tuple, @renewer
95
+
96
+ nil
122
97
  end
123
98
 
124
99
  ##
@@ -202,3 +177,5 @@ class RingyDingy
202
177
 
203
178
  end
204
179
 
180
+ require 'ringy_dingy/cancelable_renewer'
181
+ require 'ringy_dingy/lookup'
@@ -0,0 +1,28 @@
1
+ ##
2
+ # This renewer can be canceled to shut down a TupleSpace operation.
3
+
4
+ class RingyDingy::CancelableRenewer
5
+ include DRbUndumped
6
+
7
+ ##
8
+ # Creates a new renewer that will be checked every +sec+ for cancellation by
9
+ # the TupleSpace
10
+
11
+ def initialize seconds = 1
12
+ @renew = true
13
+ @seconds = seconds
14
+ end
15
+
16
+ ##
17
+ # Cancels the renewer
18
+
19
+ def cancel
20
+ @renew = false
21
+ end
22
+
23
+ def renew # :nodoc:
24
+ @renew ? @seconds : true
25
+ end
26
+
27
+ end
28
+
@@ -0,0 +1,128 @@
1
+ require 'rinda/tuplespace'
2
+
3
+ class RingyDingy::Lookup
4
+
5
+ ##
6
+ # The list of addresses where ring servers will be searched-for
7
+
8
+ attr_reader :broadcast_list
9
+
10
+ ##
11
+ # The Rinda::RingFinger used to search for ring servers
12
+
13
+ attr_reader :ring_finger
14
+
15
+ ##
16
+ # Lists of hosts to search for ring servers. By default includes the subnet
17
+ # broadcast address and localhost.
18
+
19
+ def initialize broadcast_list = RingyDingy::BROADCAST_LIST
20
+ DRb.start_service unless DRb.primary_server
21
+
22
+ @broadcast_list = broadcast_list
23
+
24
+ @ring_finger = Rinda::RingFinger.new @broadcast_list
25
+ end
26
+
27
+ ##
28
+ # Yields each tuple space found in the broadcast list
29
+
30
+ def each_tuple_space
31
+ return enum_for __method__ unless block_given?
32
+
33
+ @ring_finger.lookup_ring do |tuple_space|
34
+ yield tuple_space
35
+ end
36
+ end
37
+
38
+ ##
39
+ # Continually checks for tuple spaces and yields found tuple spaces.
40
+ #
41
+ # Returns a Thread that must be killed to shut down lookup:
42
+ #
43
+ # def my_method
44
+ # thread = enumerate_tuple_spaces do |tuple_space|
45
+ # # ...
46
+ # end
47
+ # ensure
48
+ # thread.kill
49
+ # end
50
+
51
+ def enumerate_tuple_spaces
52
+ Thread.start do
53
+ spaces = {}
54
+
55
+ loop do
56
+ @ring_finger.lookup_ring do |tuple_space|
57
+ yield tuple_space
58
+ end
59
+ end
60
+ end
61
+ end
62
+
63
+ ##
64
+ # Finds the first live service matching +service_name+ on any ring server.
65
+ # Ring servers are discovered via the +broadcast_list+.
66
+
67
+ def find service_name
68
+ found = nil
69
+
70
+ each_tuple_space.any? do |ts|
71
+ tuples = ts.read_all [:name, nil, DRbObject, nil]
72
+
73
+ found = tuples.find do |_, found_service_name, service, _|
74
+ begin
75
+ next unless found_service_name == service_name
76
+
77
+ if DRbObject === service then
78
+ service.method_missing :object_id # ping service for liveness
79
+ else
80
+ service
81
+ end
82
+ rescue DRb::DRbConnError
83
+ next
84
+ rescue NoMethodError
85
+ next
86
+ end
87
+ end
88
+ end
89
+
90
+ raise "unable to find service #{service_name.inspect}" unless found
91
+
92
+ found[2]
93
+ end
94
+
95
+ ##
96
+ # Waits until +service_name+ appears on any ring server. Returns the first
97
+ # service found with that name.
98
+ #
99
+ # If you launch a service via another process use this to wait until the
100
+ # service comes up.
101
+
102
+ def wait_for service_name
103
+ queue = Queue.new
104
+ renewer = nil
105
+
106
+ thread = enumerate_tuple_spaces do |tuple_space|
107
+ renewer.cancel if renewer
108
+ renewer = RingyDingy::CancelableRenewer.new
109
+
110
+ Thread.new do
111
+ template = [:name, service_name, DRbObject, nil]
112
+ begin
113
+ tuple = tuple_space.read template, renewer
114
+
115
+ queue.push tuple[2]
116
+ rescue DRb::DRbConnError => e
117
+ end
118
+ end
119
+ end
120
+
121
+ queue.pop
122
+ ensure
123
+ renewer.cancel
124
+ thread.kill if thread
125
+ end
126
+
127
+ end
128
+
@@ -93,11 +93,13 @@ class RingyDingy::RingServer
93
93
  list_services.each do |ring_server, services|
94
94
  out << "Services on #{ring_server}"
95
95
 
96
- values = services.sort_by { |s| [s[2].__drburi, -s[2].__drbref] }
96
+ values = services.sort_by do |_, name, service,|
97
+ [name.to_s, service.__drburi, -service.__drbref]
98
+ end
97
99
 
98
- values.each do |s|
99
- out << "\t%p, %p\n\t\tURI: %s ref: %d" %
100
- [s[1], s[3], s[2].__drburi, s[2].__drbref]
100
+ values.each do |_, name, service, description|
101
+ out << " %p, %p\n URI: %s ref: %d" %
102
+ [name, description, service.__drburi, service.__drbref]
101
103
  out << nil
102
104
  end
103
105
  end
@@ -103,15 +103,15 @@ class TestRingServer < MiniTest::Unit::TestCase
103
103
 
104
104
  expected = <<-EOF
105
105
  Services on druby://localhost:10000
106
- \t:RingyDingy, "localhost_9607_obj0"
107
- \t\tURI: druby://localhost:10001 ref: #{OBJ0.object_id}
106
+ :RingyDingy, "localhost_9607_obj0"
107
+ URI: druby://localhost:10001 ref: #{OBJ0.object_id}
108
108
 
109
- \t:RingyDingy, "localhost_9607_obj1"
110
- \t\tURI: druby://localhost:10001 ref: #{OBJ1.object_id}
109
+ :RingyDingy, "localhost_9607_obj1"
110
+ URI: druby://localhost:10001 ref: #{OBJ1.object_id}
111
111
 
112
112
  Services on druby://localhost:10002
113
- \t:RingyDingy, "localhost_9607_obj2"
114
- \t\tURI: druby://localhost:10003 ref: #{OBJ2.object_id}
113
+ :RingyDingy, "localhost_9607_obj2"
114
+ URI: druby://localhost:10003 ref: #{OBJ2.object_id}
115
115
  EOF
116
116
 
117
117
  assert_equal expected, out
@@ -1,7 +1,5 @@
1
1
  require 'test/unit'
2
2
 
3
- $TESTING = true
4
-
5
3
  require 'ringy_dingy'
6
4
 
7
5
  class StubRingFinger
@@ -0,0 +1,38 @@
1
+ require 'minitest/autorun'
2
+
3
+ class TestRingyDingyCancelableRenewer < MiniTest::Unit::TestCase
4
+
5
+ def setup
6
+ super
7
+
8
+ @renewer = RingyDingy::CancelableRenewer.new
9
+ end
10
+
11
+ def test_cancel
12
+ @renewer.cancel
13
+
14
+ assert_equal true, @renewer.renew
15
+ end
16
+
17
+ def test_marshal_dump
18
+ assert_raises TypeError do
19
+ Marshal.dump @renewer
20
+ end
21
+ end
22
+
23
+ def test_renew
24
+ assert_equal 1, @renewer.renew
25
+
26
+ @renewer.cancel
27
+
28
+ assert_equal true, @renewer.renew
29
+ end
30
+
31
+ def test_renew_seconds
32
+ @renewer = RingyDingy::CancelableRenewer.new 2
33
+
34
+ assert_equal 2, @renewer.renew
35
+ end
36
+
37
+ end
38
+
@@ -0,0 +1,57 @@
1
+ require 'minitest/autorun'
2
+ require 'ringy_dingy'
3
+
4
+ class TestRingyDingyLookup < MiniTest::Unit::TestCase
5
+
6
+ def setup
7
+ super
8
+
9
+ @lookup = RingyDingy::Lookup.new []
10
+ end
11
+
12
+ def test_enumerate_tuple_spaces
13
+ stub_ring_finger
14
+
15
+ items = []
16
+
17
+ thread = @lookup.enumerate_tuple_spaces do |ts|
18
+ items << ts
19
+ end
20
+
21
+ Thread.pass while items.empty?
22
+
23
+ refute_empty items
24
+ ensure
25
+ thread.kill if thread
26
+ end
27
+
28
+ def test_find
29
+ stub_ring_finger
30
+
31
+ found = @lookup.find 'service'
32
+
33
+ assert_kind_of Object, found
34
+ end
35
+
36
+ def test_wait_for
37
+ stub_ring_finger
38
+
39
+ found = @lookup.wait_for 'service'
40
+
41
+ assert_kind_of Object, found
42
+ end
43
+
44
+ def stub_ring_finger
45
+ def (@lookup.ring_finger).lookup_ring
46
+ ts = Rinda::TupleSpace.new
47
+ yield DRb::DRbObject.new ts
48
+
49
+ ro = DRbObject.new Object.new
50
+ ts = Rinda::TupleSpace.new
51
+ ts.write [:name, 'service', ro, 'the service']
52
+ yield DRb::DRbObject.new ts
53
+ end
54
+ end
55
+
56
+ end
57
+
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: RingyDingy
3
3
  version: !ruby/object:Gem::Version
4
- version: '1.4'
4
+ version: '1.5'
5
5
  platform: ruby
6
6
  authors:
7
7
  - Eric Hodel
@@ -30,7 +30,7 @@ cert_chain:
30
30
  KDyY1VIazVgoC8XvR4h/95/iScPiuglzA+DBG1hip1xScAtw05BrXyUNrc9CEMYU
31
31
  wgF94UVoHRp6ywo8I7NP3HcwFQDFNEZPNGXsng==
32
32
  -----END CERTIFICATE-----
33
- date: 2013-03-16 00:00:00.000000000 Z
33
+ date: 2013-05-03 00:00:00.000000000 Z
34
34
  dependencies:
35
35
  - !ruby/object:Gem::Dependency
36
36
  name: minitest
@@ -38,14 +38,14 @@ dependencies:
38
38
  requirements:
39
39
  - - ~>
40
40
  - !ruby/object:Gem::Version
41
- version: '4.3'
41
+ version: '4.6'
42
42
  type: :development
43
43
  prerelease: false
44
44
  version_requirements: !ruby/object:Gem::Requirement
45
45
  requirements:
46
46
  - - ~>
47
47
  - !ruby/object:Gem::Version
48
- version: '4.3'
48
+ version: '4.6'
49
49
  - !ruby/object:Gem::Dependency
50
50
  name: rdoc
51
51
  requirement: !ruby/object:Gem::Requirement
@@ -119,9 +119,13 @@ files:
119
119
  - Rakefile
120
120
  - bin/ring_server
121
121
  - lib/ringy_dingy.rb
122
+ - lib/ringy_dingy/cancelable_renewer.rb
123
+ - lib/ringy_dingy/lookup.rb
122
124
  - lib/ringy_dingy/ring_server.rb
123
125
  - test/test_ring_server.rb
124
126
  - test/test_ringy_dingy.rb
127
+ - test/test_ringy_dingy_cancelable_renewer.rb
128
+ - test/test_ringy_dingy_lookup.rb
125
129
  - .gemtest
126
130
  homepage: https://github.com/drbrain/RingyDingy
127
131
  licenses:
@@ -145,7 +149,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
145
149
  version: '0'
146
150
  requirements: []
147
151
  rubyforge_project: ringydingy
148
- rubygems_version: 2.0.2
152
+ rubygems_version: 2.0.3
149
153
  signing_key:
150
154
  specification_version: 4
151
155
  summary: RingyDingy is a little boat that keeps your DRb service afloat! RingyDingy
@@ -153,3 +157,5 @@ summary: RingyDingy is a little boat that keeps your DRb service afloat! RingyDi
153
157
  test_files:
154
158
  - test/test_ring_server.rb
155
159
  - test/test_ringy_dingy.rb
160
+ - test/test_ringy_dingy_cancelable_renewer.rb
161
+ - test/test_ringy_dingy_lookup.rb
metadata.gz.sig CHANGED
Binary file