em-voldemort 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,73 @@
1
+ require 'spec_helper'
2
+
3
+ describe EM::Voldemort::Router do
4
+
5
+ before do
6
+ @logger = Logger.new($stdout)
7
+ @logger.level = Logger::ERROR
8
+
9
+ @node_by_partition = {}
10
+ xml = File.read(File.expand_path('fixtures/cluster.xml', File.dirname(__FILE__)))
11
+ Nokogiri::XML(xml).xpath('/cluster/server').each do |node|
12
+ connection = EM::Voldemort::Connection.new(
13
+ :host => node.xpath('host').text,
14
+ :port => node.xpath('socket-port').text.to_i,
15
+ :node_id => node.xpath('id').text.to_i,
16
+ :logger => @logger
17
+ )
18
+ node.xpath('partitions').text.split(/\s*,\s*/).map(&:to_i).each do |partition|
19
+ @node_by_partition[partition] = connection
20
+ end
21
+ end
22
+
23
+ @router = EM::Voldemort::Router.new('consistent-routing', 2)
24
+ end
25
+
26
+ # Examples generated by loading the Voldemort jar (and dependencies) into JRuby and running:
27
+ #
28
+ # require 'java'
29
+ # cluster_mapper = Java::VoldemortXml::ClusterMapper.new
30
+ # cluster = cluster_mapper.read_cluster(java.io.File.new('fixtures/cluster.xml'))
31
+ # routing = Java::VoldemortRouting::ConsistentRoutingStrategy.new(cluster.nodes, 2)
32
+ # logger = org.apache.log4j.Logger.get_logger('voldemort')
33
+ # logger.level = org.apache.log4j.Level::DEBUG
34
+ # logger.add_appender(org.apache.log4j.ConsoleAppender.new(org.apache.log4j.SimpleLayout.new))
35
+ # routing.route_request('asdf'.to_java_bytes) # should log partition/node IDs to stdout
36
+
37
+ it 'should route an empty key' do
38
+ @router.partitions('', @node_by_partition).should == [375, 376]
39
+ end
40
+
41
+ it 'should route a key of null bytes' do
42
+ @router.partitions("\x00\x00\x00", @node_by_partition).should == [155, 156]
43
+ end
44
+
45
+ it 'should route a binary key' do
46
+ @router.partitions("\xff\x00\xfe\x01\xfd\x02", @node_by_partition).should == [308, 309]
47
+ end
48
+
49
+ it 'should route a long key' do
50
+ @router.partitions('long' * 10_000, @node_by_partition).should == [41, 42]
51
+ end
52
+
53
+ it 'should route a key whose hash is -2**31' do
54
+ # This tests a special case in voldemort.routing.ConsistentRoutingStrategy.abs which ensures
55
+ # that we always take a positive value mod number of partitions
56
+ @router.partitions([2, 87, 150, 223, 77].pack('C*'), @node_by_partition).should == [307, 308]
57
+ end
58
+
59
+ it 'should route to replicas on different nodes' do
60
+ reconfigured_partitions = {
61
+ 0 => @node_by_partition[14], # node 0
62
+ 1 => @node_by_partition[14],
63
+ 2 => @node_by_partition[38], # node 1
64
+ 3 => @node_by_partition[38],
65
+ 4 => @node_by_partition[5], # node 2
66
+ 5 => @node_by_partition[5],
67
+ 6 => @node_by_partition[18], # node 3
68
+ 7 => @node_by_partition[18],
69
+ }
70
+ @router.partitions('abcdef', reconfigured_partitions).should == [6, 0]
71
+ end
72
+
73
+ end
@@ -0,0 +1,9 @@
1
+ require File.expand_path('../lib/em-voldemort', File.dirname(__FILE__))
2
+ require 'rspec'
3
+ require 'timecop'
4
+
5
+ RSpec.configure do |config|
6
+ config.after :each do
7
+ Timecop.return
8
+ end
9
+ end
metadata ADDED
@@ -0,0 +1,164 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: em-voldemort
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.5
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Martin Kleppmann
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2014-01-06 00:00:00.000000000 Z
13
+ dependencies:
14
+ - !ruby/object:Gem::Dependency
15
+ name: eventmachine
16
+ requirement: !ruby/object:Gem::Requirement
17
+ none: false
18
+ requirements:
19
+ - - ! '>='
20
+ - !ruby/object:Gem::Version
21
+ version: '0'
22
+ type: :runtime
23
+ prerelease: false
24
+ version_requirements: !ruby/object:Gem::Requirement
25
+ none: false
26
+ requirements:
27
+ - - ! '>='
28
+ - !ruby/object:Gem::Version
29
+ version: '0'
30
+ - !ruby/object:Gem::Dependency
31
+ name: beefcake
32
+ requirement: !ruby/object:Gem::Requirement
33
+ none: false
34
+ requirements:
35
+ - - ! '>='
36
+ - !ruby/object:Gem::Version
37
+ version: '0'
38
+ type: :runtime
39
+ prerelease: false
40
+ version_requirements: !ruby/object:Gem::Requirement
41
+ none: false
42
+ requirements:
43
+ - - ! '>='
44
+ - !ruby/object:Gem::Version
45
+ version: '0'
46
+ - !ruby/object:Gem::Dependency
47
+ name: nokogiri
48
+ requirement: !ruby/object:Gem::Requirement
49
+ none: false
50
+ requirements:
51
+ - - ! '>='
52
+ - !ruby/object:Gem::Version
53
+ version: '0'
54
+ type: :runtime
55
+ prerelease: false
56
+ version_requirements: !ruby/object:Gem::Requirement
57
+ none: false
58
+ requirements:
59
+ - - ! '>='
60
+ - !ruby/object:Gem::Version
61
+ version: '0'
62
+ - !ruby/object:Gem::Dependency
63
+ name: json
64
+ requirement: !ruby/object:Gem::Requirement
65
+ none: false
66
+ requirements:
67
+ - - ! '>='
68
+ - !ruby/object:Gem::Version
69
+ version: '0'
70
+ type: :runtime
71
+ prerelease: false
72
+ version_requirements: !ruby/object:Gem::Requirement
73
+ none: false
74
+ requirements:
75
+ - - ! '>='
76
+ - !ruby/object:Gem::Version
77
+ version: '0'
78
+ - !ruby/object:Gem::Dependency
79
+ name: rspec
80
+ requirement: !ruby/object:Gem::Requirement
81
+ none: false
82
+ requirements:
83
+ - - ! '>='
84
+ - !ruby/object:Gem::Version
85
+ version: '0'
86
+ type: :development
87
+ prerelease: false
88
+ version_requirements: !ruby/object:Gem::Requirement
89
+ none: false
90
+ requirements:
91
+ - - ! '>='
92
+ - !ruby/object:Gem::Version
93
+ version: '0'
94
+ - !ruby/object:Gem::Dependency
95
+ name: timecop
96
+ requirement: !ruby/object:Gem::Requirement
97
+ none: false
98
+ requirements:
99
+ - - ! '>='
100
+ - !ruby/object:Gem::Version
101
+ version: '0'
102
+ type: :development
103
+ prerelease: false
104
+ version_requirements: !ruby/object:Gem::Requirement
105
+ none: false
106
+ requirements:
107
+ - - ! '>='
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ description: EventMachine implementation of a Voldemort client. Currently limited
111
+ to read-only stores.
112
+ email: martin@kleppmann.com
113
+ executables: []
114
+ extensions: []
115
+ extra_rdoc_files: []
116
+ files:
117
+ - .gitignore
118
+ - Gemfile
119
+ - LICENSE
120
+ - README.md
121
+ - em-voldemort.gemspec
122
+ - lib/em-voldemort.rb
123
+ - lib/em-voldemort/binary_json.rb
124
+ - lib/em-voldemort/cluster.rb
125
+ - lib/em-voldemort/compressor.rb
126
+ - lib/em-voldemort/connection.rb
127
+ - lib/em-voldemort/errors.rb
128
+ - lib/em-voldemort/protobuf.rb
129
+ - lib/em-voldemort/protocol.rb
130
+ - lib/em-voldemort/router.rb
131
+ - lib/em-voldemort/store.rb
132
+ - spec/em-voldemort/binary_json_spec.rb
133
+ - spec/em-voldemort/cluster_spec.rb
134
+ - spec/em-voldemort/connection_spec.rb
135
+ - spec/em-voldemort/fixtures/cluster.xml
136
+ - spec/em-voldemort/router_spec.rb
137
+ - spec/spec_helper.rb
138
+ homepage: https://github.com/rapportive-oss/em-voldemort
139
+ licenses:
140
+ - MIT
141
+ post_install_message:
142
+ rdoc_options: []
143
+ require_paths:
144
+ - lib
145
+ required_ruby_version: !ruby/object:Gem::Requirement
146
+ none: false
147
+ requirements:
148
+ - - ! '>='
149
+ - !ruby/object:Gem::Version
150
+ version: '0'
151
+ required_rubygems_version: !ruby/object:Gem::Requirement
152
+ none: false
153
+ requirements:
154
+ - - ! '>='
155
+ - !ruby/object:Gem::Version
156
+ version: '0'
157
+ requirements: []
158
+ rubyforge_project:
159
+ rubygems_version: 1.8.23
160
+ signing_key:
161
+ specification_version: 3
162
+ summary: Client for Voldemort
163
+ test_files: []
164
+ has_rdoc: