roma 1.1.0 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG +21 -0
  3. data/Gemfile.lock +47 -0
  4. data/bin/check_tc_flag +39 -0
  5. data/bin/roma-adm +43 -0
  6. data/bin/ssroute +0 -3
  7. data/lib/roma/async_process.rb +203 -208
  8. data/lib/roma/command/sys_command_receiver.rb +52 -10
  9. data/lib/roma/config.rb +3 -0
  10. data/lib/roma/event/handler.rb +11 -4
  11. data/lib/roma/event/jaro_winkler.rb +23 -0
  12. data/lib/roma/event/levenshtein.rb +23 -0
  13. data/lib/roma/plugin/plugin_cmd_aliases.rb +1 -32
  14. data/lib/roma/romad.rb +23 -0
  15. data/lib/roma/routing/cb_rttable.rb +2 -0
  16. data/lib/roma/routing/random_partitioner.rb +43 -36
  17. data/lib/roma/routing/rttable.rb +5 -3
  18. data/lib/roma/stats.rb +4 -1
  19. data/lib/roma/tools/check_tc_flag.rb +25 -0
  20. data/lib/roma/tools/cpdb.rb +3 -2
  21. data/lib/roma/tools/mkconfig.rb +22 -13
  22. data/lib/roma/tools/roma-adm.rb +82 -0
  23. data/lib/roma/version.rb +1 -1
  24. data/test/config4mhash.rb +2 -0
  25. data/test/config4storage_error.rb +2 -0
  26. data/test/config4test.rb +2 -0
  27. data/test/cpdbtest/config4cpdb_base.rb +67 -0
  28. data/test/cpdbtest/config4cpdb_dbm.rb +9 -0
  29. data/test/cpdbtest/config4cpdb_groonga.rb +9 -0
  30. data/test/cpdbtest/config4cpdb_rh.rb +9 -0
  31. data/test/cpdbtest/config4cpdb_sqlite3.rb +9 -0
  32. data/test/cpdbtest/config4cpdb_tc.rb +9 -0
  33. data/test/cpdbtest/config4cpdb_tcmem.rb +9 -0
  34. data/test/roma-test-utils.rb +140 -40
  35. data/test/t_cpdata.rb +76 -80
  36. data/test/t_cpdb.rb +95 -0
  37. data/test/t_logshift.rb +86 -0
  38. data/test/t_mhash.rb +56 -54
  39. data/test/t_routing_logic.rb +121 -0
  40. data/test/t_writebehind.rb +202 -207
  41. metadata +25 -8
  42. data/bin/tc_data_restore.rb +0 -123
@@ -3,53 +3,51 @@
3
3
  require 'roma/client/rclient'
4
4
  require 'roma/messaging/con_pool'
5
5
 
6
+ TCP_SERVER_PORT = 11_219
6
7
  $dat = {}
7
8
 
8
9
  def receive_command_server
9
- $gs = TCPServer.open(11213)
10
- while true
11
- Thread.new($gs.accept){|s|
10
+ $gs = TCPServer.open(TCP_SERVER_PORT)
11
+ loop do
12
+ Thread.new($gs.accept) do |s|
12
13
  begin
13
- loop {
14
- res = s.gets
15
- p res
16
- if res==nil
17
- s.close
18
- elsif res.start_with?("pushv")
19
- ss = res.split(" ")
14
+ while res = s.gets
15
+ if res.start_with?('pushv')
16
+ ss = res.split(' ')
20
17
  s.write("READY\r\n")
21
18
  len = s.gets.chomp
22
19
  $dat[ss[2].to_i] = receive_dump(s, len.to_i)
23
20
  s.write("STORED\r\n")
24
- elsif res.start_with?("spushv")
25
- ss = res.split(" ")
21
+ elsif res.start_with?('spushv')
22
+ ss = res.split(' ')
26
23
  s.write("READY\r\n")
27
24
  $dat[ss[2].to_i] = receive_stream_dump(s)
28
25
  s.write("STORED\r\n")
29
- elsif res.start_with?("whoami")
26
+ elsif res.start_with?('whoami')
30
27
  s.write("ROMA\r\n")
31
- elsif res.start_with?("rbalse")
28
+ elsif res.start_with?('rbalse')
32
29
  s.write("BYE\r\n")
33
- s.close
34
30
  break
35
31
  else
36
32
  s.write("STORED\r\n")
37
33
  end
38
- }
39
- rescue =>e
34
+ end
35
+ rescue => e
40
36
  p e
41
- p $@
37
+ p $ERROR_POSITION
38
+ ensure
39
+ s.close if s
42
40
  end
43
- }
41
+ end
44
42
  end
45
- rescue =>e
43
+ rescue => e
46
44
  p e
47
45
  end
48
46
 
49
47
  def receive_stream_dump(sok)
50
48
  ret = {}
51
49
  v = nil
52
- loop {
50
+ loop do
53
51
  context_bin = sok.read(20)
54
52
  vn, last, clk, expt, klen = context_bin.unpack('NNNNN')
55
53
 
@@ -61,15 +59,15 @@ def receive_stream_dump(sok)
61
59
  v = sok.read(vlen)
62
60
  end
63
61
  ret[k] = [vn, last, clk, expt, v].pack('NNNNa*')
64
- }
62
+ end
65
63
  ret
66
- rescue =>e
64
+ rescue => e
67
65
  p e
68
66
  end
69
67
 
70
68
  def receive_dump(sok, len)
71
69
  dmp = ''
72
- while(dmp.length != len.to_i)
70
+ while (dmp.length != len.to_i)
73
71
  dmp = dmp + sok.read(len.to_i - dmp.length)
74
72
  end
75
73
  sok.read(2)
@@ -78,7 +76,7 @@ def receive_dump(sok, len)
78
76
  else
79
77
  return nil
80
78
  end
81
- rescue =>e
79
+ rescue => e
82
80
  false
83
81
  end
84
82
 
@@ -87,37 +85,37 @@ class CopyDataTest < Test::Unit::TestCase
87
85
  include RomaTestUtils
88
86
 
89
87
  def setup
90
- @th = Thread.new{ receive_command_server }
88
+ @th = Thread.new { receive_command_server }
91
89
  start_roma
92
- @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
90
+ @rc = Roma::Client::RomaClient.new(%w(localhost_11211 localhost_11212))
93
91
  end
94
92
 
95
93
  def teardown
96
94
  stop_roma
97
95
  @th.kill
98
96
  $gs.close
99
- Roma::Messaging::ConPool::instance.close_all
97
+ Roma::Messaging::ConPool.instance.close_all
100
98
  end
101
99
 
102
100
  def test_spushv
103
101
  # key wihch's vn = 0
104
102
  keys = []
105
103
  n = 1000
106
- n.times{|i|
104
+ n.times do |i|
107
105
  d = Digest::SHA1.hexdigest(i.to_s).hex % @rc.rttable.hbits
108
106
  vn = @rc.rttable.get_vnode_id(d)
109
107
  if vn == 0
110
108
  keys << i.to_s
111
109
  end
112
- }
110
+ end
113
111
  nid = @rc.rttable.search_nodes(0)
114
112
 
115
113
  push_a_vnode_stream('roma', 0, nid[0], keys)
116
114
 
117
- keys.each{|k|
118
- assert_equal( "#{k}-stream", @rc.get(k,true))
119
- # puts "#{k} #{@rc.get(k)}"
120
- }
115
+ keys.each do |k|
116
+ assert_equal("#{k}-stream", @rc.get(k, true))
117
+ # puts "#{k} #{@rc.get(k)}"
118
+ end
121
119
  end
122
120
 
123
121
  def push_a_vnode_stream(hname, vn, nid, keys)
@@ -130,54 +128,53 @@ class CopyDataTest < Test::Unit::TestCase
130
128
  return res.chomp
131
129
  end
132
130
 
133
- keys.each{|k|
134
- v = k + "-stream"
131
+ keys.each do |k|
132
+ v = k + '-stream'
135
133
  data = [vn, Time.now.to_i, 1, 0x7fffffff, k.length, k, v.length, v].pack("NNNNNa#{k.length}Na#{v.length}")
136
134
  con.write(data)
137
- }
138
- con.write("\0"*20) # end of steram
135
+ end
136
+ con.write("\0" * 20) # end of steram
139
137
 
140
138
  res = con.gets # STORED\r\n or error string
141
- Roma::Messaging::ConPool.instance.return_connection(nid,con)
139
+ Roma::Messaging::ConPool.instance.return_connection(nid, con)
142
140
  res.chomp! if res
143
141
  res
144
- rescue =>e
142
+ rescue => e
145
143
  "#{e}"
146
144
  end
147
145
  private :push_a_vnode_stream
148
146
 
149
-
150
147
  def test_reqpushv
151
148
  make_dummy(1000)
152
149
 
153
- dat=[]
154
- dat[0] = reqpushv('roma',0)
155
- assert_not_nil( dat[0] )
156
- dat[0] = reqpushv('roma',0)
157
- assert_not_nil( dat[0] ) # confirming twice access to same node
158
-
159
- dat[1] = reqpushv('roma',536870912)
160
- assert_not_nil( dat[1] )
161
- dat[2] = reqpushv('roma',1073741824)
162
- assert_not_nil( dat[2] )
163
- dat[3] = reqpushv('roma',1610612736)
164
- assert_not_nil( dat[3])
165
- dat[4] = reqpushv('roma',2147483648)
166
- assert_not_nil( dat[4] )
167
- dat[5] = reqpushv('roma',2684354560)
168
- assert_not_nil( dat[5] )
169
- dat[6] = reqpushv('roma',3221225472,true)
170
- assert_not_nil( dat[6] )
171
- dat[7] = reqpushv('roma',3758096384,true)
172
- assert_not_nil( dat[7] )
150
+ dat = []
151
+ dat[0] = reqpushv('roma', 0)
152
+ assert_not_nil(dat[0])
153
+ dat[0] = reqpushv('roma', 0)
154
+ assert_not_nil(dat[0]) # confirming twice access to same node
155
+
156
+ dat[1] = reqpushv('roma', 536_870_912)
157
+ assert_not_nil(dat[1])
158
+ dat[2] = reqpushv('roma', 1_073_741_824)
159
+ assert_not_nil(dat[2])
160
+ dat[3] = reqpushv('roma', 1_610_612_736)
161
+ assert_not_nil(dat[3])
162
+ dat[4] = reqpushv('roma', 2_147_483_648)
163
+ assert_not_nil(dat[4])
164
+ dat[5] = reqpushv('roma', 2_684_354_560)
165
+ assert_not_nil(dat[5])
166
+ dat[6] = reqpushv('roma', 3_221_225_472, true)
167
+ assert_not_nil(dat[6])
168
+ dat[7] = reqpushv('roma', 3_758_096_384, true)
169
+ assert_not_nil(dat[7])
173
170
 
174
171
  a = 0
175
- dat.each{|v| a+=v.length }
176
- assert_equal( 1000,a )
172
+ dat.each { |v| a += v.length }
173
+ assert_equal(1000, a)
177
174
  end
178
175
 
179
176
  def wait(vn)
180
- while $dat.key?(vn) do
177
+ while $dat.key?(vn)
181
178
  sleep 0.01
182
179
  end
183
180
  $dat[vn]
@@ -185,38 +182,38 @@ class CopyDataTest < Test::Unit::TestCase
185
182
 
186
183
  # set dummy data of n count
187
184
  def make_dummy(n)
188
- n.times{|i|
189
- assert( @rc.set(i.to_s,i.to_s)=="STORED" )
190
- }
185
+ n.times do |i|
186
+ assert(@rc.set(i.to_s, i.to_s) == 'STORED')
187
+ end
191
188
  end
192
189
 
193
- def reqpushv(hname,vn,is_primary=false)
190
+ def reqpushv(_hname, vn, is_primary = false)
194
191
  $dat.delete(vn)
195
- con = Roma::Messaging::ConPool.instance.get_connection("localhost_11211")
192
+ con = Roma::Messaging::ConPool.instance.get_connection('localhost_11211')
196
193
  res = nil
197
- 10.times{
198
- con.write("reqpushv #{vn} localhost_11213 #{is_primary}\r\n")
194
+ 10.times do
195
+ con.write("reqpushv #{vn} localhost_#{TCP_SERVER_PORT} #{is_primary}\r\n")
199
196
  res = con.gets
200
197
  break if res == "PUSHED\r\n"
201
198
  sleep 0.5
202
- }
203
- assert_equal( "PUSHED\r\n", res )
199
+ end
200
+ assert_equal("PUSHED\r\n", res)
204
201
  con.close
205
202
 
206
- until $dat.key?(vn) do
203
+ until $dat.key?(vn)
207
204
  Thread.pass
208
205
  sleep 0.01
209
206
  end
210
207
  $dat[vn]
211
- rescue =>e
208
+ rescue => e
212
209
  p e
213
- p $@
210
+ p $ERROR_POSITION
214
211
  return nil
215
212
  end
216
213
 
217
214
  def receive_dump(sok, len)
218
215
  dmp = ''
219
- while(dmp.length != len.to_i)
216
+ while (dmp.length != len.to_i)
220
217
  dmp = dmp + sok.read(len.to_i - dmp.length)
221
218
  end
222
219
  sok.read(2)
@@ -225,9 +222,8 @@ class CopyDataTest < Test::Unit::TestCase
225
222
  else
226
223
  return nil
227
224
  end
228
- rescue =>e
229
- @log.error("#{e}\n#{$@}")
225
+ rescue => e
226
+ @log.error("#{e}\n#{$ERROR_POSITION}")
230
227
  false
231
228
  end
232
-
233
229
  end
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env ruby
2
+ require 'roma/client/rclient'
3
+ require 'roma/messaging/con_pool'
4
+ require 'roma/config'
5
+ require 'pathname'
6
+
7
+ class CpdbBaseTest < Test::Unit::TestCase
8
+ include RomaTestUtils
9
+
10
+ def teardown
11
+ stop_roma
12
+ rescue => e
13
+ puts "#{e} #{$@}"
14
+ end
15
+
16
+ end
17
+
18
+ # Groonga Storage Test
19
+ class GroongaTest < CpdbBaseTest
20
+ def setup
21
+ start_roma 'cpdbtest/config4cpdb_groonga.rb'
22
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
23
+ end
24
+
25
+ def test_cpdb
26
+ value = `#{bin_dir}/cpdb 11211`.chomp
27
+ assert_equal("ERROR:cpdb supports just TCStorage system, your storage type is GroongaStorage", value)
28
+ end
29
+ end
30
+
31
+ # RubyHash Storage Test
32
+ class RubyHashTest < CpdbBaseTest
33
+ def setup
34
+ start_roma 'cpdbtest/config4cpdb_rh.rb'
35
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
36
+ end
37
+ def test_cpdb
38
+ value = `#{bin_dir}/cpdb 11211`.chomp
39
+ assert_equal("ERROR:cpdb supports just TCStorage system, your storage type is RubyHashStorage", value)
40
+ end
41
+ end
42
+
43
+ # TcTest Storage Test
44
+ class TcTest < CpdbBaseTest
45
+ def setup
46
+ start_roma 'cpdbtest/config4cpdb_tc.rb'
47
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
48
+ end
49
+ def test_cpdb
50
+ # Log Assertion
51
+ value = `#{bin_dir}/cpdb 11211`.chomp
52
+ assert_match(/safecopy_flushed/, value)
53
+ assert_match(/finished/, value)
54
+ # File exist Assertion
55
+ valueFileList = `ls ./localhost_11211/roma/`.chomp
56
+ assert_match(/9.tc.([\d]+)/, valueFileList)
57
+ end
58
+ end
59
+
60
+ # TcMem Storage Test
61
+ class TcMemTest < CpdbBaseTest
62
+ def setup
63
+ start_roma 'cpdbtest/config4cpdb_tcmem.rb'
64
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
65
+ end
66
+ def test_cpdb
67
+ value = `#{bin_dir}/cpdb 11211`.chomp
68
+ assert_equal("ERROR:cpdb supports just TCStorage system, your storage type is TCMemStorage" , value)
69
+ end
70
+ end
71
+
72
+ # Dbm Storage Test
73
+ class DbmTest < CpdbBaseTest
74
+ def setup
75
+ start_roma 'cpdbtest/config4cpdb_dbm.rb'
76
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
77
+ end
78
+ def test_cpdb
79
+ value = `#{bin_dir}/cpdb 11211`.chomp
80
+ assert_equal("ERROR:cpdb supports just TCStorage system, your storage type is DbmStorage", value)
81
+ end
82
+ end
83
+
84
+ # Sqlite3 Storage Test
85
+ class Sqlite3Test < CpdbBaseTest
86
+ def setup
87
+ start_roma 'cpdbtest/config4cpdb_sqlite3.rb'
88
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"])
89
+ end
90
+ def test_cpdb
91
+ value = `#{bin_dir}/cpdb 11211`.chomp
92
+ assert_equal("ERROR:cpdb supports just TCStorage system, your storage type is SQLite3Storage", value)
93
+ end
94
+ end
95
+
@@ -0,0 +1,86 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require 'socket'
4
+ require 'test/unit'
5
+
6
+ class LogShiftTest < Test::Unit::TestCase
7
+ include RomaTestUtils
8
+
9
+ def setup
10
+ start_roma
11
+ @sock_port_1 = TCPSocket.new("localhost", 11211)
12
+ @sock_port_2 = TCPSocket.new("localhost", 11212)
13
+ end
14
+
15
+ def teardown
16
+ @sock_port_1.close if @sock_port_1
17
+ @sock_port_2.close if @sock_port_2
18
+ stop_roma
19
+ rescue => e
20
+ puts "#{e} #{$@}"
21
+ end
22
+
23
+ def test_log_shift_size
24
+ # get Current log_shift_size and log_shift_age of port 11211
25
+ @sock_port_1.write("stat log_shift_size\r\n")
26
+ old_log_shift_size = @sock_port_1.gets.chomp
27
+
28
+ # set & check new log_shift_size value on port 11211
29
+ @sock_port_1.write("set_log_shift_size 4096\r\n")
30
+ assert_equal("END", @sock_port_1.gets.chomp)
31
+ assert_equal('{"localhost_11212"=>"STORED", "localhost_11211"=>"STORED"}', @sock_port_1.gets.chomp)
32
+ @sock_port_1.write("stat log_shift_size\r\n")
33
+ puts "Old value was : #{old_log_shift_size} "
34
+ assert_equal( "stats.log_shift_size 4096" , @sock_port_1.gets.chomp);
35
+ assert_equal("END", @sock_port_1.gets.chomp)
36
+
37
+ # get & check new log_shift_size value on port 11212
38
+ @sock_port_2.write("stat log_shift_size\r\n")
39
+ assert_equal( "stats.log_shift_size 4096" , @sock_port_2.gets.chomp);
40
+ assert_equal("END", @sock_port_2.gets.chomp)
41
+
42
+ end
43
+
44
+ def test_log_shift_age
45
+ # get Current log_shift_size and log_shift_age of port 11211
46
+ @sock_port_1.write("stat log_shift_age\r\n")
47
+ old_log_shift_age = @sock_port_1.gets.chomp
48
+
49
+ # set & check new log_shift_size value on port 11211
50
+ @sock_port_1.write("set_log_shift_age 7\r\n")
51
+ assert_equal("END", @sock_port_1.gets.chomp)
52
+ assert_equal('{"localhost_11212"=>"STORED", "localhost_11211"=>"STORED"}', @sock_port_1.gets.chomp)
53
+ @sock_port_1.write("stat log_shift_age\r\n")
54
+ puts "Old value was : #{old_log_shift_age} "
55
+ assert_equal( "stats.log_shift_age 7" , @sock_port_1.gets.chomp);
56
+ assert_equal("END", @sock_port_1.gets.chomp)
57
+
58
+ # get & check new log_shift_size value on port 11212
59
+ @sock_port_2.write("stat log_shift_age\r\n")
60
+ assert_equal( "stats.log_shift_age 7" , @sock_port_2.gets.chomp);
61
+ assert_equal("END", @sock_port_2.gets.chomp)
62
+
63
+ end
64
+
65
+ def test_log_shift_age_min
66
+ # get Current log_shift_size and log_shift_age of port 11211
67
+ @sock_port_1.write("stat log_shift_age\r\n")
68
+ old_log_shift_age = @sock_port_1.gets.chomp
69
+
70
+ # set & check new log_shift_size value on port 11211
71
+ @sock_port_1.write("set_log_shift_age min\r\n")
72
+ assert_equal("END", @sock_port_1.gets.chomp)
73
+ assert_equal('{"localhost_11212"=>"STORED", "localhost_11211"=>"STORED"}', @sock_port_1.gets.chomp)
74
+ @sock_port_1.write("stat log_shift_age\r\n")
75
+ puts "Old value was : #{old_log_shift_age} "
76
+ assert_equal( "stats.log_shift_age min" , @sock_port_1.gets.chomp);
77
+ assert_equal("END", @sock_port_1.gets.chomp)
78
+
79
+ # get & check new log_shift_size value on port 11212
80
+ @sock_port_2.write("stat log_shift_age\r\n")
81
+ assert_equal( "stats.log_shift_age min" , @sock_port_2.gets.chomp);
82
+ assert_equal("END", @sock_port_2.gets.chomp)
83
+
84
+ end
85
+
86
+ end