clandestined 1.0.0b → 1.0.0rc1

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: 03d6d29e1c5fe16b7457ae7ae9d851a55ad2c03e
4
- data.tar.gz: 9ce134bb758d8f00442ac45a1b592ccbe143f04c
3
+ metadata.gz: a5ff566c681b3dbb615337f7950d77952ed1a431
4
+ data.tar.gz: 3ecbd2a3a64361d73fdf2f964f7455d5c25cf4b0
5
5
  SHA512:
6
- metadata.gz: ccdcbbbd4d4d9524cbb61a21efa5d3389da3ad6b7b366c1d1d6273a7da265686a600ece76eb1a8d68e6955761fcb3ec82323747a8ee9c6c2ef76d2fb4d4e09f3
7
- data.tar.gz: 04e1699336e8e5b08e0d75207d80308955e86986dafd79c1cd2d8b7ae3ec1b94de470e26cc6e88aea31c9bdf06606df2a06769737faa00ee6cb70383d8cc400d
6
+ metadata.gz: a8537d75aed9c1e1efc253474ec5d47941fa3b0a2aab914f146151f4e03e00cf2311f444b1be8362431a6e0b2952ef0df311eced0d84829e7d6614b57975d8a6
7
+ data.tar.gz: ad82997d11d2d492b744bdcc5de5b869cb2e7c4d8dd6b61278649a4cc0fd1b0799294e7241c965e28d63e7104c2623db650afcab79528ca42c380312906af2a4
data/.gitignore CHANGED
@@ -2,6 +2,9 @@
2
2
  /bin
3
3
  /vendor
4
4
  /.vendor
5
+ /Gemfile.lock
6
+
7
+ /.ruby-version
5
8
 
6
9
  /pkg
7
10
  /tmp
data/CHANGES.md CHANGED
@@ -1,4 +1,10 @@
1
1
 
2
+ v1.0.0rc1 (2014-07-13)
3
+ ======================
4
+
5
+ - `Rendezvous.find_node` breaks ties in the event of a hash collision. Winner
6
+ is chosen by `[node_id.to_s, node_id.to_s].max`
7
+
2
8
  v1.0.0b (2014-07-07)
3
9
  ====================
4
10
 
data/README.md CHANGED
@@ -4,7 +4,7 @@ clandestined
4
4
  rendezvous hashing implementation based on murmur3 hash
5
5
 
6
6
 
7
- ## motiviation
7
+ ## motivation
8
8
 
9
9
  in distributed systems, the need often arises to locate objects amongst a
10
10
  cluster of machines. consistent hashing and rendezvous hashing are methods of
data/Rakefile CHANGED
@@ -1,4 +1,3 @@
1
- require "bundler/gem_tasks"
2
1
  require 'rake/testtask'
3
2
  require 'rake/extensiontask'
4
3
 
@@ -1,6 +1,6 @@
1
1
  Gem::Specification.new do |s|
2
2
  s.name = 'clandestined'
3
- s.version = '1.0.0b'
3
+ s.version = '1.0.0rc1'
4
4
  s.licenses = ['MIT']
5
5
  s.date = Time.now.strftime('%Y-%m-%d')
6
6
  s.summary = 'rendezvous hashing implementation based on murmur3 hash'
@@ -13,9 +13,15 @@ Gem::Specification.new do |s|
13
13
  s.require_paths = ['lib', 'ext']
14
14
  s.extensions = ['ext/murmur3_native/extconf.rb']
15
15
 
16
- s.add_development_dependency 'rake', '0.9.6'
17
- s.add_development_dependency 'rake-compiler', '0.8.3'
18
- s.add_development_dependency 'rubydoctest', '1.1.3'
16
+ if RUBY_VERSION < "1.9"
17
+ s.add_development_dependency 'rake', '0.8.7'
18
+ s.add_development_dependency 'rake-compiler', '0.8.3'
19
+ s.add_development_dependency 'rubydoctest', '1.1.3'
20
+ else
21
+ s.add_development_dependency 'rake'
22
+ s.add_development_dependency 'rake-compiler'
23
+ s.add_development_dependency 'rubydoctest'
24
+ end
19
25
 
20
26
  s.has_rdoc = false
21
27
 
@@ -1,12 +1,9 @@
1
1
 
2
2
  require 'clandestined/rendezvous_hash'
3
- require 'murmur3'
4
3
 
5
4
  module Clandestined
6
5
  class Cluster
7
6
 
8
- include Murmur3
9
-
10
7
  attr_reader :hash_function
11
8
  attr_reader :seed
12
9
  attr_reader :replicas
@@ -14,7 +14,6 @@ module Clandestined
14
14
  @seed = seed
15
15
 
16
16
  @hash_function = lambda { |key| murmur3_32(key, seed) }
17
-
18
17
  end
19
18
 
20
19
  def add_node(node)
@@ -30,7 +29,17 @@ module Clandestined
30
29
  end
31
30
 
32
31
  def find_node(key)
33
- nodes.max {|a,b| hash_function.call("#{a}-#{key}") <=> hash_function.call("#{b}-#{key}")}
32
+ high_score = -1
33
+ winner = nil
34
+ nodes.each do |node|
35
+ score = hash_function.call("#{node}-#{key}")
36
+ if score > high_score
37
+ high_score, winner = score, node
38
+ elsif score == high_score
39
+ high_score, winner = score, [node.to_s, winner.to_s].max
40
+ end
41
+ end
42
+ winner
34
43
  end
35
44
 
36
45
  end
@@ -0,0 +1,71 @@
1
+
2
+ require 'test/unit'
3
+
4
+ require 'clandestined/rendezvous_hash'
5
+ require 'clandestined/cluster'
6
+
7
+ include Clandestined
8
+
9
+ class CollisionHashTestCase < Test::Unit::TestCase
10
+
11
+ def setup
12
+ RendezvousHash.class_eval do
13
+ def mock_murmur3_32(key, seed=0)
14
+ 4294967295
15
+ end
16
+ alias original_murmur3_32 murmur3_32
17
+ alias murmur3_32 mock_murmur3_32
18
+ end
19
+ end
20
+
21
+ def teardown
22
+ RendezvousHash.class_eval do
23
+ alias murmur3_32 original_murmur3_32
24
+ remove_method(:mock_murmur3_32)
25
+ remove_method(:original_murmur3_32)
26
+ end
27
+ end
28
+
29
+ def test_monkey_patch
30
+ rendezvous = RendezvousHash.new()
31
+ assert_equal(rendezvous.hash_function.call('lol'), 4294967295)
32
+ assert_equal(rendezvous.hash_function.call('wat'), 4294967295)
33
+ end
34
+
35
+ def test_rendezvous_collision
36
+ nodes = ['c', 'b', 'a']
37
+ rendezvous = RendezvousHash.new(nodes)
38
+ for i in (0..1000)
39
+ assert_equal('c', rendezvous.find_node(i))
40
+ end
41
+ end
42
+
43
+ def test_rendezvous_names
44
+ nodes = [1, 2, 3, 'a', 'b', 'lol.wat.com']
45
+ rendezvous = RendezvousHash.new(nodes)
46
+ for i in (0..10)
47
+ assert_equal('lol.wat.com', rendezvous.find_node(i))
48
+ end
49
+ nodes = [1, 'a', '0']
50
+ rendezvous = RendezvousHash.new(nodes)
51
+ for i in (0..10)
52
+ assert_equal('a', rendezvous.find_node(i))
53
+ end
54
+ end
55
+
56
+ def test_cluster_collision
57
+ nodes = Hash[
58
+ '1' => Hash['zone' => 'a'],
59
+ '2' => Hash['zone' => 'a'],
60
+ '3' => Hash['zone' => 'b'],
61
+ '4' => Hash['zone' => 'b'],
62
+ ]
63
+ cluster = Cluster.new(nodes)
64
+ for n in (0..100)
65
+ for m in (0..100)
66
+ assert_equal(['2', '4'], cluster.find_nodes_by_index(n, m).sort)
67
+ end
68
+ end
69
+ end
70
+
71
+ end
metadata CHANGED
@@ -1,57 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: clandestined
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0b
4
+ version: 1.0.0rc1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Ernest W. Durbin III
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-07-07 00:00:00.000000000 Z
11
+ date: 2014-07-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - '='
17
+ - - '>='
18
18
  - !ruby/object:Gem::Version
19
- version: 0.9.6
19
+ version: '0'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
- - - '='
24
+ - - '>='
25
25
  - !ruby/object:Gem::Version
26
- version: 0.9.6
26
+ version: '0'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake-compiler
29
29
  requirement: !ruby/object:Gem::Requirement
30
30
  requirements:
31
- - - '='
31
+ - - '>='
32
32
  - !ruby/object:Gem::Version
33
- version: 0.8.3
33
+ version: '0'
34
34
  type: :development
35
35
  prerelease: false
36
36
  version_requirements: !ruby/object:Gem::Requirement
37
37
  requirements:
38
- - - '='
38
+ - - '>='
39
39
  - !ruby/object:Gem::Version
40
- version: 0.8.3
40
+ version: '0'
41
41
  - !ruby/object:Gem::Dependency
42
42
  name: rubydoctest
43
43
  requirement: !ruby/object:Gem::Requirement
44
44
  requirements:
45
- - - '='
45
+ - - '>='
46
46
  - !ruby/object:Gem::Version
47
- version: 1.1.3
47
+ version: '0'
48
48
  type: :development
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
- - - '='
52
+ - - '>='
53
53
  - !ruby/object:Gem::Version
54
- version: 1.1.3
54
+ version: '0'
55
55
  description: |
56
56
  rendezvous hashing implementation based on murmur3 hash
57
57
  email: ewdurbin@gmail.com
@@ -64,7 +64,6 @@ files:
64
64
  - .travis.yml
65
65
  - CHANGES.md
66
66
  - Gemfile
67
- - Gemfile.lock
68
67
  - LICENSE
69
68
  - README.md
70
69
  - Rakefile
@@ -76,6 +75,7 @@ files:
76
75
  - lib/murmur3.rb
77
76
  - lib/murmur3_ruby.rb
78
77
  - test/test_cluster.rb
78
+ - test/test_collision.rb
79
79
  - test/test_rendezvous_hash.rb
80
80
  homepage: https://github.com/ewdurbin/clandestined-ruby
81
81
  licenses:
@@ -98,10 +98,11 @@ required_rubygems_version: !ruby/object:Gem::Requirement
98
98
  version: 1.3.1
99
99
  requirements: []
100
100
  rubyforge_project:
101
- rubygems_version: 2.0.14
101
+ rubygems_version: 2.0.3
102
102
  signing_key:
103
103
  specification_version: 4
104
104
  summary: rendezvous hashing implementation based on murmur3 hash
105
105
  test_files:
106
106
  - test/test_cluster.rb
107
+ - test/test_collision.rb
107
108
  - test/test_rendezvous_hash.rb
@@ -1,21 +0,0 @@
1
- PATH
2
- remote: .
3
- specs:
4
- clandestined (1.0.0a)
5
-
6
- GEM
7
- remote: https://rubygems.org/
8
- specs:
9
- rake (0.9.6)
10
- rake-compiler (0.8.3)
11
- rake
12
- rubydoctest (1.1.3)
13
-
14
- PLATFORMS
15
- ruby
16
-
17
- DEPENDENCIES
18
- clandestined!
19
- rake (= 0.9.6)
20
- rake-compiler (= 0.8.3)
21
- rubydoctest (= 1.1.3)