journeta 0.1.1 → 0.1.2

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/History.txt CHANGED
@@ -1,3 +1,13 @@
1
+ == 0.1.2 2008-09-08
2
+
3
+ * Preemptive peer reaping. Peers now automatically "expire" from the local registry when they haven't been heard from in a while.
4
+ * Non-significant fixes.
5
+
6
+
7
+ == 0.1.1 2008-09-05
8
+
9
+ * Figuring out how to deploy properly with hoe :)
10
+
1
11
  == 0.1.0 2008-09-05
2
12
 
3
13
  * Renamed Journeta::JournetaEngine to Journeta::Engine
@@ -23,9 +23,15 @@ begin
23
23
  puts "Displays infromation on all known peers."
24
24
  puts "Updated: #{Time.now}"
25
25
  puts "\n"
26
- puts "UUID\t\tVersion\t\tIP Address\t\tPort\t\tDiscovered\t\tUpdated\t\tGroups\n"
27
- all.keys.sort.each do |uuid|
28
- puts "#{all[uuid].uuid}\t#{all[uuid].version}\t\t#{all[uuid].ip_address}\t\t#{all[uuid].peer_port}\t\t#{all[uuid].created_at || 'TODO'}\t\t#{all[uuid].updated_at || 'TODO'}\t[#{all[uuid].groups.join(',')}]"
26
+ puts "UUID\t\tVersion\t\tIP Address\t\tPort\t\tDiscovered\t\t\tUpdated\t\t\t\tGroups\n"
27
+ # require 'pp'
28
+ # pp all
29
+ all.each do |uuid, peer|
30
+ groups = '...'
31
+ if !all[uuid].groups.nil?
32
+ groups = all[uuid].groups.join(',')
33
+ end
34
+ puts "#{all[uuid].uuid}\t#{all[uuid].version}\t\t#{all[uuid].ip_address}\t\t#{all[uuid].peer_port}\t\t#{all[uuid].created_at || 'TODO'}\t#{all[uuid].updated_at || 'TODO'}\t[#{groups}]"
29
35
  end
30
36
  sleep(0.2)
31
37
  end while true
@@ -15,15 +15,11 @@ module Journeta
15
15
 
16
16
  attr_accessor :thread, :engine
17
17
 
18
-
19
-
20
18
  def initialize(engine)
21
19
  @engine = engine
22
20
  @thread_lock = Mutex.new
23
21
  @thread = nil
24
- end
25
-
26
-
22
+ end
27
23
 
28
24
  # Start the +Thread+ for this instance, iff not already running.
29
25
  def start
@@ -52,7 +48,7 @@ module Journeta
52
48
  def stop
53
49
  @thread_lock.synchronize do
54
50
  if @thread
55
- Thread.kill(@thread)
51
+ Thread.kill(@thread) # nasty pants!
56
52
  @thread.join
57
53
  @thread = nil
58
54
  end
@@ -95,6 +95,8 @@ module Journeta
95
95
  # Starts sub-comonents which have their own life-cycle requirements.
96
96
  # The registry itself does not have a dedication thread, and thus does not need to be started.
97
97
  def start
98
+ @peer_registry.start
99
+
98
100
  # Start a peer listener first so we don't risk missing a connection attempt.
99
101
  putsd "Starting #{@peer_listener.class.to_s}"
100
102
  @peer_listener.start
@@ -121,7 +123,8 @@ module Journeta
121
123
  # While the registry does not have its own thread, it is in charge of managing
122
124
  # +PeerConnection+s which DO have individual threads. This call
123
125
  # forcefully terminates all connections, which may or may not be actively passing data.
124
- @peer_registry.unregister_all
126
+ # @peer_registry.unregister_all
127
+ @peer_registry.stop
125
128
  end
126
129
 
127
130
  # Sends the given object to all peers in one of the #groups associated with this instance.
@@ -148,7 +151,7 @@ module Journeta
148
151
  def known_groups()
149
152
  s = Set.new
150
153
  self.known_peers(true).each do |uuid, peer|
151
- s.merge peer.groups
154
+ s.merge peer.groups unless peer.groups.nil?
152
155
  end
153
156
  s.to_a
154
157
  end
@@ -22,9 +22,8 @@ module Journeta
22
22
 
23
23
  # integer.
24
24
  attr_accessor :peer_port
25
-
26
-
27
-
25
+
26
+
28
27
  def initialize(engine)
29
28
  super(engine)
30
29
  @queue = Queue.new
@@ -29,9 +29,13 @@ module Journeta
29
29
  while more = session.gets
30
30
  data += more
31
31
  end
32
- msg = YAML::load(data)
33
- h = @engine.peer_handler
34
- h.call msg
32
+ begin
33
+ msg = YAML::load(data)
34
+ h = @engine.peer_handler
35
+ h.call msg
36
+ rescue
37
+ putsd "YAML could not be deserialized! The data will not be passed up to the application."
38
+ end
35
39
  end
36
40
  end
37
41
  rescue
@@ -3,18 +3,28 @@ require 'thread'
3
3
  module Journeta
4
4
 
5
5
  # Responsible for keeping in-memory metadata on known peers in the form of PeerConnections.
6
- # TODO Add dead peer reaper functionality.
7
- class PeerRegistry #<< Journeta::Asynchronous
6
+ class PeerRegistry < Journeta::Asynchronous
8
7
 
9
8
  include Logger
10
9
 
11
10
  # {<:uuid> => PeerConnection}
12
11
  # attr_reader :peers
13
12
 
13
+
14
+ # Minimum period between reaper invocations, in seconds.
15
+ #attr_accessor :reaper_period
16
+
17
+ # The minimun time, in seconds, after a given presence notification arrive that it may be considered for reaping.
18
+ #attr_accessor :reaper_tolerance
19
+
20
+ @@DEFAULT_REAPER_PERIOD = 1
21
+
14
22
  def initialize(engine)
15
- @engine = engine
23
+ super(engine)
16
24
  @peers = {}
17
25
  @mutex = Mutex.new
26
+ @reaper_period = @@DEFAULT_REAPER_PERIOD
27
+ @reaper_tolerance = engine.presence_period + 2.0
18
28
  end
19
29
 
20
30
  def clear
@@ -23,6 +33,26 @@ module Journeta
23
33
  end
24
34
  end
25
35
 
36
+ def go
37
+ loop do
38
+ @mutex.synchronize do
39
+ to_reap = []
40
+ @peers.each do |uuid, peer|
41
+ tolerance = Time.now - @reaper_tolerance
42
+ if peer.updated_at < tolerance
43
+ to_reap << peer
44
+ end
45
+ end
46
+ to_reap.each do |peer|
47
+ peer.stop
48
+ @peers.delete peer.uuid
49
+ end
50
+ end
51
+ sleep @reaper_period
52
+ end
53
+ end
54
+
55
+
26
56
  def all(all_groups = false)
27
57
  r = nil
28
58
  @mutex.synchronize do
@@ -46,6 +76,8 @@ module Journeta
46
76
  else
47
77
  putsd "Updating peer #{peer.uuid}."
48
78
  peer.stop
79
+ # Make sure we're not overriding the creation date of the original entry.
80
+ peer.created_at = nil
49
81
  existing.update_settings peer
50
82
  end
51
83
 
@@ -45,6 +45,7 @@ module Journeta
45
45
  peer.uuid = m.uuid
46
46
  peer.version = m.version
47
47
  peer.groups = m.groups
48
+ peer.created_at = peer.updated_at = Time.now
48
49
 
49
50
  # We should not start the #PeerConnection before registering because
50
51
  # the peer might already be registered. In this case, we'd have wasted a thread,
@@ -2,7 +2,7 @@ module Journeta #:nodoc:
2
2
  module VERSION #:nodoc:
3
3
  MAJOR = 0
4
4
  MINOR = 1
5
- TINY = 1
5
+ TINY = 2
6
6
 
7
7
  STRING = [MAJOR, MINOR, TINY].join('.')
8
8
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: journeta
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.1
4
+ version: 0.1.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Preston Lee
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2008-09-05 00:00:00 -07:00
12
+ date: 2008-09-08 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies:
15
15
  - !ruby/object:Gem::Dependency