zeevex_cluster 0.2.3 → 0.3.0

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.
@@ -5,7 +5,7 @@ class ZeevexCluster::Coordinator::BaseKeyValStore
5
5
 
6
6
  def self.setup
7
7
  unless @setup
8
- require 'zeevex_cluster/serializer/json_hash'
8
+ require 'zeevex_cluster/serializer/edn'
9
9
  @setup = true
10
10
  end
11
11
  end
@@ -26,7 +26,7 @@ class ZeevexCluster::Coordinator::BaseKeyValStore
26
26
 
27
27
  @logger = options[:logger]
28
28
 
29
- @serializer = options[:serializer] || ZeevexCluster::Serializer::JsonHash.new
29
+ @serializer = options[:serializer] || ZeevexCluster::Serializer::EDN.new
30
30
 
31
31
  @retries = options.fetch(:retries, 20)
32
32
  @retry_wait = options.fetch(:retry_wait, 2)
@@ -0,0 +1,18 @@
1
+ require 'edn'
2
+ require 'date'
3
+
4
+ require 'zeevex_cluster/serializer'
5
+
6
+ class ZeevexCluster::Serializer::EDN
7
+ def new(options = {})
8
+ @options = options
9
+ end
10
+
11
+ def deserialize(str)
12
+ parsed = ::EDN.read(str)
13
+ end
14
+
15
+ def serialize(obj)
16
+ obj.to_edn
17
+ end
18
+ end
@@ -7,21 +7,21 @@ module ZeevexCluster
7
7
  end
8
8
 
9
9
  module InstanceMethods
10
- def to_json
10
+ def to_serialized
11
11
  serializer.serialize(self)
12
12
  end
13
13
 
14
14
  def serializer
15
- @_serializer ||= ZeevexCluster::Serializer::JsonHash.new
15
+ @_serializer ||= ZeevexCluster::Serializer::EDN.new
16
16
  end
17
17
  end
18
18
 
19
19
  module ClassMethods
20
- def from_json(string)
20
+ def from_serialized(string)
21
21
  serializer.deserialize(self)
22
22
  end
23
23
  end
24
24
  end
25
25
  end
26
26
 
27
- require 'zeevex_cluster/serializer/json_hash'
27
+ require 'zeevex_cluster/serializer/edn'
@@ -116,7 +116,7 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
116
116
  list = server.get(key('members')) || make_member_list
117
117
  members = []
118
118
  list[:members].values.each do |v|
119
- members << v[:nodename] unless v[:timestamp].utc < stale_point
119
+ members << v[:nodename] unless time_of(v[:timestamp]) < stale_point
120
120
  end
121
121
  members
122
122
  end
@@ -185,7 +185,7 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
185
185
 
186
186
  def got_lock(token)
187
187
  unless @locked_at
188
- @locked_at = token[:timestamp]
188
+ @locked_at = time_of(token[:timestamp])
189
189
  token = my_token
190
190
  run_hook :election_won
191
191
  end
@@ -238,8 +238,8 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
238
238
  def qualifies_for_master?(token)
239
239
  now = time_now()
240
240
  ! token_invalid?(token) and
241
- token[:timestamp] > (now - @stale_time) and
242
- token[:locked_at] <= (now - INAUGURATION_UPDATE_DELAY * @update_period)
241
+ time_of(token[:timestamp]) > (now - @stale_time) and
242
+ time_of(token[:locked_at]) <= (now - INAUGURATION_UPDATE_DELAY * @update_period)
243
243
  end
244
244
 
245
245
  def time_now
@@ -250,7 +250,7 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
250
250
  now = time_now
251
251
  !token || !token.is_a?(Hash) || !token[:timestamp] ||
252
252
  ! token[:locked_at] || ! token[:nodename] ||
253
- token[:timestamp].utc < (now - @stale_time)
253
+ time_of(token[:timestamp]) < (now - @stale_time)
254
254
  end
255
255
 
256
256
  def resigned?
@@ -343,7 +343,7 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
343
343
  res = server.cas(memberlist_key) do |hash|
344
344
  hash[:members] ||= {}
345
345
  hash[:members].keys.each do |key|
346
- hash[:members].delete(key) if hash[:members][key][:timestamp] < stale_point
346
+ hash[:members].delete(key) if time_of(hash[:members][key][:timestamp]) < stale_point
347
347
  end
348
348
  hash[:members][@nodename] = me
349
349
  hash
@@ -390,7 +390,7 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
390
390
  # has the master gone without updating suspiciously long?
391
391
  #
392
392
  def master_suspect?(token)
393
- time_now - token[:timestamp] > SUSPECT_MISSED_UPDATE_COUNT * @update_period
393
+ time_now - time_of(token[:timestamp]) > SUSPECT_MISSED_UPDATE_COUNT * @update_period
394
394
  end
395
395
 
396
396
  def reset_state_vars
@@ -401,4 +401,18 @@ class ZeevexCluster::Strategy::Cas < ZeevexCluster::Strategy::Base
401
401
  @current_master = nil
402
402
  @thread = nil
403
403
  end
404
+
405
+ def time_of(timelike)
406
+ res = case timelike
407
+ when DateTime then timelike.to_time
408
+ when Time then timelike
409
+ when String then time_of(DateTime.parse(timelike))
410
+ when Integer then Time.at(timelike)
411
+ when nil then nil
412
+ else
413
+ raise ArgumentError, "Cannot parse #{timelike.inspect} of class #{timelike.class} to a time"
414
+ end
415
+ res.respond_to?(:utc) ? res.utc : res
416
+ end
417
+
404
418
  end
@@ -1,3 +1,3 @@
1
1
  module ZeevexCluster
2
- VERSION = "0.2.3"
2
+ VERSION = "0.3.0"
3
3
  end
@@ -28,6 +28,8 @@ Gem::Specification.new do |s|
28
28
 
29
29
  s.add_dependency 'hookem', '~> 0.0.1'
30
30
 
31
+ s.add_dependency 'edn'
32
+
31
33
  ## other headius utils
32
34
  # s.add_dependency 'thread_safe'
33
35
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: zeevex_cluster
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.3
4
+ version: 0.3.0
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -123,6 +123,22 @@ dependencies:
123
123
  - - ~>
124
124
  - !ruby/object:Gem::Version
125
125
  version: 0.0.1
126
+ - !ruby/object:Gem::Dependency
127
+ name: edn
128
+ requirement: !ruby/object:Gem::Requirement
129
+ none: false
130
+ requirements:
131
+ - - ! '>='
132
+ - !ruby/object:Gem::Version
133
+ version: '0'
134
+ type: :runtime
135
+ prerelease: false
136
+ version_requirements: !ruby/object:Gem::Requirement
137
+ none: false
138
+ requirements:
139
+ - - ! '>='
140
+ - !ruby/object:Gem::Version
141
+ version: '0'
126
142
  - !ruby/object:Gem::Dependency
127
143
  name: rspec
128
144
  requirement: !ruby/object:Gem::Requirement
@@ -229,6 +245,7 @@ files:
229
245
  - lib/zeevex_cluster/message.rb
230
246
  - lib/zeevex_cluster/nil_logger.rb
231
247
  - lib/zeevex_cluster/serializer.rb
248
+ - lib/zeevex_cluster/serializer/edn.rb
232
249
  - lib/zeevex_cluster/serializer/json_hash.rb
233
250
  - lib/zeevex_cluster/static.rb
234
251
  - lib/zeevex_cluster/strategy.rb