roma 1.1.0 → 1.2.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.
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