roma 0.8.2 → 0.8.10

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 (114) hide show
  1. data/CHANG +326 -0
  2. data/CHANGELOG +132 -0
  3. data/{README.rdoc → FETCH_HEAD} +0 -0
  4. data/{LICENSE.rdoc → LICENSE} +0 -1
  5. data/README +17 -0
  6. data/Rakefile +33 -18
  7. data/ruby/server/bin/chg_redundancy +10 -0
  8. data/ruby/server/bin/key_access +7 -0
  9. data/ruby/server/bin/key_list +7 -0
  10. data/ruby/server/bin/mkconfig +19 -0
  11. data/{bin → ruby/server/bin}/mkrecent +0 -1
  12. data/{bin → ruby/server/bin}/mkroute +0 -1
  13. data/ruby/server/bin/multi_commander +19 -0
  14. data/ruby/server/bin/recoverlost +10 -0
  15. data/ruby/server/bin/recoverlost_alist +10 -0
  16. data/ruby/server/bin/recoverlost_alist_all +10 -0
  17. data/ruby/server/bin/recoverlost_alist_keys +10 -0
  18. data/{bin/recoverlost → ruby/server/bin/roma_watcher} +1 -2
  19. data/ruby/server/bin/romad +36 -0
  20. data/{bin → ruby/server/bin}/sample_watcher +0 -1
  21. data/{bin → ruby/server/bin}/sample_watcher2 +0 -1
  22. data/{bin/simple_bench → ruby/server/bin/sample_watcher3} +1 -2
  23. data/ruby/server/bin/simple_bench +26 -0
  24. data/{bin → ruby/server/bin}/ssroute +0 -1
  25. data/ruby/server/bin/test-scenario +11 -0
  26. data/{bin → ruby/server/bin}/tribunus +0 -1
  27. data/{lib → ruby/server/lib}/roma/async_process.rb +67 -15
  28. data/{lib → ruby/server/lib}/roma/command/bg_command_receiver.rb +1 -1
  29. data/ruby/server/lib/roma/command/command_definition.rb +422 -0
  30. data/ruby/server/lib/roma/command/mh_command_receiver.rb +127 -0
  31. data/ruby/server/lib/roma/command/receiver.rb +64 -0
  32. data/{lib → ruby/server/lib}/roma/command/rt_command_receiver.rb +6 -1
  33. data/ruby/server/lib/roma/command/sys_command_receiver.rb +609 -0
  34. data/{lib → ruby/server/lib}/roma/command/util_command_receiver.rb +15 -5
  35. data/{lib → ruby/server/lib}/roma/command/vn_command_receiver.rb +12 -4
  36. data/{lib → ruby/server/lib}/roma/command_plugin.rb +0 -0
  37. data/ruby/server/lib/roma/config.rb +84 -0
  38. data/{lib → ruby/server/lib}/roma/event/con_pool.rb +12 -1
  39. data/ruby/server/lib/roma/event/handler.rb +256 -0
  40. data/ruby/server/lib/roma/live_patch-20120302-001.rb +107 -0
  41. data/ruby/server/lib/roma/logging/rlogger.rb +163 -0
  42. data/ruby/server/lib/roma/messaging/con_pool.rb +92 -0
  43. data/{lib → ruby/server/lib}/roma/plugin/plugin_alist.rb +118 -240
  44. data/ruby/server/lib/roma/plugin/plugin_debug.rb +31 -0
  45. data/ruby/server/lib/roma/plugin/plugin_map.rb +177 -0
  46. data/ruby/server/lib/roma/plugin/plugin_mapcount.rb +185 -0
  47. data/{lib/roma/command/st_command_receiver.rb → ruby/server/lib/roma/plugin/plugin_storage.rb} +170 -146
  48. data/ruby/server/lib/roma/plugin/plugin_stub.rb +283 -0
  49. data/{lib → ruby/server/lib}/roma/plugin/plugin_test.rb +0 -0
  50. data/{lib → ruby/server/lib}/roma/romad.rb +221 -94
  51. data/{lib → ruby/server/lib}/roma/routing/cb_rttable.rb +4 -6
  52. data/{lib → ruby/server/lib}/roma/routing/merkle_tree.rb +0 -0
  53. data/ruby/server/lib/roma/routing/routing_data.rb +307 -0
  54. data/{lib → ruby/server/lib}/roma/routing/rttable.rb +4 -0
  55. data/{lib → ruby/server/lib}/roma/stats.rb +19 -3
  56. data/{lib → ruby/server/lib}/roma/storage/basic_storage.rb +25 -26
  57. data/{lib → ruby/server/lib}/roma/storage/dbm_storage.rb +1 -23
  58. data/{lib → ruby/server/lib}/roma/storage/dummy_storage.rb +0 -0
  59. data/{lib → ruby/server/lib}/roma/storage/rh_storage.rb +0 -0
  60. data/{lib → ruby/server/lib}/roma/storage/sqlite3_storage.rb +0 -0
  61. data/{lib → ruby/server/lib}/roma/storage/tc_storage.rb +62 -2
  62. data/ruby/server/lib/roma/tools/chg_redundancy.rb +36 -0
  63. data/ruby/server/lib/roma/tools/key_access.rb +105 -0
  64. data/ruby/server/lib/roma/tools/key_list.rb +94 -0
  65. data/ruby/server/lib/roma/tools/mkconfig.rb +535 -0
  66. data/{lib → ruby/server/lib}/roma/tools/mkrecent.rb +0 -0
  67. data/{lib → ruby/server/lib}/roma/tools/mkroute.rb +0 -0
  68. data/ruby/server/lib/roma/tools/multi_commander.rb +45 -0
  69. data/{lib → ruby/server/lib}/roma/tools/recoverlost.rb +0 -0
  70. data/{lib → ruby/server/lib}/roma/tools/recoverlost_alist.rb +0 -0
  71. data/ruby/server/lib/roma/tools/recoverlost_alist_all.rb +8 -0
  72. data/ruby/server/lib/roma/tools/recoverlost_alist_keys.rb +16 -0
  73. data/ruby/server/lib/roma/tools/recoverlost_lib.rb +349 -0
  74. data/ruby/server/lib/roma/tools/roma_watcher.rb +150 -0
  75. data/ruby/server/lib/roma/tools/roma_watcher_config.yml.example +20 -0
  76. data/{lib → ruby/server/lib}/roma/tools/sample_watcher.rb +3 -1
  77. data/{lib → ruby/server/lib}/roma/tools/sample_watcher2.rb +3 -1
  78. data/ruby/server/lib/roma/tools/sample_watcher3.rb +49 -0
  79. data/{lib → ruby/server/lib}/roma/tools/simple_bench.rb +2 -0
  80. data/ruby/server/lib/roma/tools/simple_bench2.rb +78 -0
  81. data/{lib → ruby/server/lib}/roma/tools/ssroute.rb +0 -0
  82. data/ruby/server/lib/roma/tools/test-scenario.rb +327 -0
  83. data/{lib → ruby/server/lib}/roma/tools/tribunus.rb +0 -0
  84. data/ruby/server/lib/roma/version.rb +4 -0
  85. data/{lib → ruby/server/lib}/roma/write_behind.rb +1 -0
  86. data/ruby/server/test/config4mhash.rb +68 -0
  87. data/ruby/server/test/config4storage_error.rb +69 -0
  88. data/{lib/roma/config.rb → ruby/server/test/config4test.rb} +6 -3
  89. data/{test → ruby/server/test}/rcirb.rb +0 -1
  90. data/{test → ruby/server/test}/roma-test-utils.rb +21 -8
  91. data/{test → ruby/server/test}/run-test.rb +3 -2
  92. data/ruby/server/test/storage_error_storage.rb +37 -0
  93. data/ruby/server/test/t_command_definition.rb +326 -0
  94. data/{test → ruby/server/test}/t_cpdata.rb +9 -3
  95. data/{test → ruby/server/test}/t_listplugin.rb +48 -12
  96. data/ruby/server/test/t_mapcountplugin.rb +231 -0
  97. data/ruby/server/test/t_mapplugin.rb +131 -0
  98. data/ruby/server/test/t_mhash.rb +222 -0
  99. data/ruby/server/test/t_rclient.rb +199 -0
  100. data/{test → ruby/server/test}/t_routing_data.rb +56 -0
  101. data/{test → ruby/server/test}/t_storage.rb +107 -111
  102. data/ruby/server/test/t_storage_error.rb +61 -0
  103. data/ruby/server/test/t_writebehind.rb +374 -0
  104. metadata +150 -82
  105. data/bin/recoverlost_alist +0 -8
  106. data/bin/romad +0 -7
  107. data/lib/roma/command/mh_command_receiver.rb +0 -117
  108. data/lib/roma/command/receiver.rb +0 -287
  109. data/lib/roma/event/handler.rb +0 -159
  110. data/lib/roma/plugin/plugin_debug.rb +0 -19
  111. data/lib/roma/tools/recoverlost_lib.rb +0 -217
  112. data/lib/roma/version.rb +0 -4
  113. data/test/t_rclient.rb +0 -318
  114. data/test/t_writebehind.rb +0 -200
@@ -2,6 +2,7 @@
2
2
  # -*- coding: utf-8 -*-
3
3
 
4
4
  require 'roma/client/rclient'
5
+ require 'roma/messaging/con_pool'
5
6
 
6
7
  $dat = {}
7
8
 
@@ -164,7 +165,7 @@ class CopyDataTest < Test::Unit::TestCase
164
165
  push_a_vnode_stream('roma', 0, nid[0], keys)
165
166
 
166
167
  keys.each{|k|
167
- assert_equal( "#{k}-stream", @rc.get(k))
168
+ assert_equal( "#{k}-stream", @rc.get(k,true))
168
169
  # puts "#{k} #{@rc.get(k)}"
169
170
  }
170
171
  end
@@ -242,8 +243,13 @@ class CopyDataTest < Test::Unit::TestCase
242
243
  def reqpushv(hname,vn,is_primary=false)
243
244
  $dat.delete(vn)
244
245
  con = Roma::Messaging::ConPool.instance.get_connection("localhost_11211")
245
- con.write("reqpushv #{vn} localhost_11213 #{is_primary}\r\n")
246
- res = con.gets
246
+ res = nil
247
+ 10.times{
248
+ con.write("reqpushv #{vn} localhost_11213 #{is_primary}\r\n")
249
+ res = con.gets
250
+ break if res == "PUSHED\r\n"
251
+ sleep 0.5
252
+ }
247
253
  assert_equal( "PUSHED\r\n", res )
248
254
  con.close
249
255
 
@@ -1,9 +1,9 @@
1
1
  #!/usr/bin/env ruby
2
- # -*- coding: utf-8 -*-
3
-
4
2
  require 'roma/client/rclient'
5
3
  require 'roma/plugin/plugin_alist'
6
4
  require 'roma/storage/tc_storage'
5
+ require 'roma/messaging/con_pool'
6
+ require 'roma/client/plugin/alist'
7
7
 
8
8
  Roma::Client::RomaClient.class_eval{
9
9
  def init_sync_routing_proc
@@ -17,7 +17,7 @@ class ListPluginTest < Test::Unit::TestCase
17
17
  start_roma
18
18
  @rc=Roma::Client::RomaClient.new(
19
19
  ["localhost_11211","localhost_11212"],
20
- [::Roma::ClientPlugin::PluginAshiatoList])
20
+ [Roma::Client::Plugin::Alist])
21
21
  end
22
22
 
23
23
  def teardown
@@ -174,6 +174,16 @@ class ListPluginTest < Test::Unit::TestCase
174
174
  assert_equal(["55","66","55","44","33"], @rc.alist_to_s("aa")[1])
175
175
  assert_equal('STORED', @rc.alist_sized_insert("aa",3,"22"))
176
176
  assert_equal(["22","55","66"], @rc.alist_to_s("aa")[1] )
177
+ assert_equal('STORED', @rc.alist_sized_insert("aa",6,"77"))
178
+ assert_equal(["77","22","55","66"], @rc.alist_to_s("aa")[1] )
179
+ assert_equal('STORED', @rc.alist_sized_insert("aa",6,"88"))
180
+ assert_equal(["88","77","22","55","66"], @rc.alist_to_s("aa")[1] )
181
+ assert_equal('STORED', @rc.alist_sized_insert("aa",6,"99"))
182
+ assert_equal(["99","88","77","22","55","66"], @rc.alist_to_s("aa")[1] )
183
+ assert_equal('STORED', @rc.alist_sized_insert("aa",6,"00"))
184
+ assert_equal(["00","99","88","77","22","55"], @rc.alist_to_s("aa")[1] )
185
+ assert_equal('STORED', @rc.alist_sized_insert("aa",6,"00"))
186
+ assert_equal(["00","00","99","88","77","22"], @rc.alist_to_s("aa")[1] )
177
187
  end
178
188
 
179
189
  def test_sized_insert2
@@ -278,7 +288,7 @@ class ListPluginTest < Test::Unit::TestCase
278
288
  t = Time.now.to_i
279
289
  assert( @rc.alist_push("aa","11")=='STORED' )
280
290
  assert( @rc.alist_join("aa","|")[1]=="11" )
281
- # 挿入時間を取得、おそらく1秒以内
291
+ # get a time of insert, maybe in 1 sec
282
292
  assert_operator(1,:>,t - @rc.alist_join_with_time("aa","|")[2].to_i)
283
293
  assert_equal('STORED', @rc.alist_push("aa","22"))
284
294
  assert_equal("11|22", @rc.alist_join("aa","|")[1])
@@ -468,6 +478,34 @@ class ListPluginTest < Test::Unit::TestCase
468
478
  assert_equal(["44"], @rc.alist_to_s("aa")[1])
469
479
  end
470
480
 
481
+ def test_alist_update_at
482
+ @rc.delete("aa")
483
+
484
+ assert_equal('NOT_FOUND', @rc.alist_update_at("aa",0,"a0"))
485
+
486
+ assert_equal('STORED', @rc.alist_push("aa","00"))
487
+ assert_equal('STORED', @rc.alist_push("aa","11"))
488
+ assert_equal('STORED', @rc.alist_push("aa","22"))
489
+ assert_equal('STORED', @rc.alist_push("aa","33"))
490
+ assert_equal('STORED', @rc.alist_push("aa","44"))
491
+
492
+ assert_equal(["00","11","22","33","44"], @rc.alist_to_s("aa")[1])
493
+
494
+ assert_equal('NOT_FOUND', @rc.alist_update_at("aa",-1,"a0"))
495
+ assert_equal('NOT_FOUND', @rc.alist_update_at("aa",5,"a0"))
496
+
497
+ assert_equal('STORED', @rc.alist_update_at("aa",2,"a2"))
498
+ assert_equal(["00","11","a2","33","44"], @rc.alist_to_s("aa")[1])
499
+ assert_equal('STORED', @rc.alist_update_at("aa",0,"a0"))
500
+ assert_equal(["a0","11","a2","33","44"], @rc.alist_to_s("aa")[1])
501
+ assert_equal('STORED', @rc.alist_update_at("aa",1,"a1"))
502
+ assert_equal(["a0","a1","a2","33","44"], @rc.alist_to_s("aa")[1])
503
+ assert_equal('STORED', @rc.alist_update_at("aa",3,"a3"))
504
+ assert_equal(["a0","a1","a2","a3","44"], @rc.alist_to_s("aa")[1])
505
+ assert_equal('STORED', @rc.alist_update_at("aa",4,"a4"))
506
+ assert_equal(["a0","a1","a2","a3","a4"], @rc.alist_to_s("aa")[1])
507
+ end
508
+
471
509
  def test_shift
472
510
  @rc.delete("aa")
473
511
 
@@ -514,9 +552,7 @@ class ListPluginTest < Test::Unit::TestCase
514
552
 
515
553
  st, nid, vn = create_storage_and_calc_vn('aa')
516
554
 
517
- # 過去のデータを作成
518
- # 時刻は適当で OK
519
- # リストの結合ロジックは delete and push
555
+ # create a data ,it's a past time
520
556
  pt =Time.now.to_i
521
557
  st.set(vn,'aa',0,0xffffffff,Marshal.dump([['11','22','33','44','55'],[pt,pt,pt,pt,pt]]))
522
558
 
@@ -529,19 +565,19 @@ class ListPluginTest < Test::Unit::TestCase
529
565
 
530
566
  assert_equal(["55", "33", "11", "22", "44"], @rc.alist_to_s("aa")[1])
531
567
 
532
- # list 以外のデータを作成
568
+ # create a data out of list
533
569
  st.set(vn,'aa',0,0xffffffff,'val-aa')
534
570
  push_a_vnode_stream(st, vn, nid)
535
- # 論クロックが小さいので上書きされない
571
+ # do not write a value
536
572
  assert_equal(["55", "33", "11", "22", "44"], @rc.alist_to_s("aa")[1])
537
573
 
538
- # 論理クロックを進める
574
+ # increases to logical clock
539
575
  10.times{
540
576
  st.set(vn,'aa',0,0xffffffff,'val-aa')
541
577
  }
542
578
  push_a_vnode_stream(st, vn, nid)
543
- # 論クロックが大きいので上書きされる
544
- assert_equal('val-aa', @rc.get("aa"))
579
+ # write over a value, cause increased a logical clock
580
+ assert_equal('val-aa', @rc.get("aa",true))
545
581
  end
546
582
 
547
583
  def create_storage_and_calc_vn(k)
@@ -0,0 +1,231 @@
1
+ #!/usr/bin/env ruby
2
+ require 'roma/client'
3
+ require 'roma/client/plugin/mapcount'
4
+
5
+ Roma::Client::RomaClient.class_eval{
6
+ def init_sync_routing_proc
7
+ end
8
+ }
9
+
10
+ class MapCountPluginTest < Test::Unit::TestCase
11
+ include RomaTestUtils
12
+
13
+ DATE_FORMAT = "%Y-%m-%dT%H:%M:%S +00"
14
+
15
+ def setup
16
+ start_roma
17
+ @rc=Roma::Client::RomaClient.new(["localhost_11211","localhost_11212"], [Roma::Client::Plugin::MapCount])
18
+ end
19
+
20
+ def teardown
21
+ stop_roma
22
+ end
23
+
24
+ def test_mapcount_get(n = 5)
25
+ n.times do |i|
26
+ k = "subkey#{i}"
27
+ expt = i
28
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
29
+
30
+ retc = {"last_updated_date"=>lt}
31
+ (i+1).times do |j|
32
+ retc["subkey#{j}"] = 1
33
+ end
34
+ assert_equal retc, @rc.mapcount_countup('key1', k, 0)
35
+
36
+ retg = {"last_updated_date"=>lt}
37
+ retg["subkey#{i}"] = 1
38
+ assert_equal retg, @rc.mapcount_get('key1', k)
39
+ assert_equal retc, @rc.mapcount_get('key1')
40
+ end
41
+
42
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
43
+ ret = {"last_updated_date"=>lt, "subkey0"=>1, "subkey1"=>1}
44
+ assert_equal ret, @rc.mapcount_get('key1', 'subkey0,subkey1')
45
+ end
46
+
47
+ def test_mapcount_countup_expt
48
+ k = "subkey1"
49
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
50
+ ret = {"last_updated_date"=>lt, k=>1}
51
+
52
+ assert_nil @rc.mapcount_get('key1', k)
53
+ assert_equal ret, @rc.mapcount_countup('key1', k, 1)
54
+ assert_equal ret, @rc.mapcount_get('key1', k)
55
+ sleep 2
56
+ assert_nil @rc.mapcount_get('key1', k)
57
+ end
58
+
59
+ def test_mapcount_update
60
+ k = "subkey1"
61
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
62
+ ret_time = {"last_updated_date"=>lt}
63
+ ret_all = {"last_updated_date"=>lt, k=>1}
64
+
65
+ assert_nil @rc.mapcount_update('key1')
66
+ assert_equal ret_all, @rc.mapcount_countup('key1', k, 0)
67
+ assert_equal ret_all, @rc.mapcount_update('key1')
68
+ assert_equal ret_time, @rc.mapcount_update('key1', 'subkey2')
69
+
70
+ assert_equal ret_all, @rc.mapcount_update('key1', nil, 1)
71
+ sleep 2
72
+ assert_nil @rc.mapcount_get('key1')
73
+
74
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
75
+ ret_all = {"last_updated_date"=>lt, k=>1}
76
+ assert_equal ret_all, @rc.mapcount_countup('key1', k, 0)
77
+ assert_equal ret_all, @rc.mapcount_update('key1', k, 1)
78
+ sleep 2
79
+ assert_nil @rc.mapcount_get('key1')
80
+
81
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
82
+ ret_all = {"last_updated_date"=>lt, k=>1}
83
+ assert_equal ret_all, @rc.mapcount_countup('key1', k, 0)
84
+ sleep 2
85
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
86
+ ret_all = {"last_updated_date"=>lt, k=>1}
87
+ assert_equal ret_all, @rc.mapcount_update('key1')
88
+ end
89
+
90
+ def test_counts
91
+ conn = Roma::Messaging::ConPool.instance.get_connection("localhost_11211")
92
+ if conn
93
+ conn.write "stat read_count\n"
94
+ r = conn.gets.split(" ")
95
+ assert_equal 0, r[1].to_i
96
+ conn.gets
97
+
98
+ @rc.mapcount_get('key')
99
+ sleep 10
100
+ conn.write "stat read_count\n"
101
+ r = conn.gets.split(" ")
102
+ assert_equal 1, r[1].to_i
103
+ conn.gets
104
+
105
+ conn.write "stat write_count\n"
106
+ r = conn.gets.split(" ")
107
+ assert_equal 0, r[1].to_i
108
+ conn.gets
109
+
110
+ @rc.mapcount_countup('key', 'subkey', 0)
111
+ sleep 10
112
+ conn.write "stat write_count\n"
113
+ r = conn.gets.split(" ")
114
+ assert_equal 1, r[1].to_i
115
+ conn.gets
116
+
117
+ @rc.mapcount_update('key')
118
+ sleep 10
119
+ conn.write "stat write_count\n"
120
+ r = conn.gets.split(" ")
121
+ assert_equal 2, r[1].to_i
122
+ conn.gets
123
+
124
+ conn.close
125
+ end
126
+ end
127
+
128
+ def test_mapcount_get_ms(n = 5)
129
+ n.times do |i|
130
+ k = "subkey#{i}"
131
+ expt = i
132
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
133
+
134
+ retc = {"last_updated_date"=>lt}
135
+ (i+1).times do |j|
136
+ retc["subkey#{j}"] = 1
137
+ end
138
+ assert_equal retc, @rc.mapcount_countup_ms('key1', k, 0)
139
+
140
+ retg = {"last_updated_date"=>lt}
141
+ retg["subkey#{i}"] = 1
142
+ assert_equal retg, @rc.mapcount_get_ms('key1', k)
143
+ assert_equal retc, @rc.mapcount_get_ms('key1')
144
+ end
145
+
146
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
147
+ ret = {"last_updated_date"=>lt, "subkey0"=>1, "subkey1"=>1}
148
+ assert_equal ret, @rc.mapcount_get_ms('key1', 'subkey0,subkey1')
149
+ end
150
+
151
+ def test_mapcount_countup_ms_expt
152
+ k = "subkey1"
153
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
154
+ ret = {"last_updated_date"=>lt, k=>1}
155
+
156
+ assert_nil @rc.mapcount_get_ms('key1', k)
157
+ assert_equal ret, @rc.mapcount_countup_ms('key1', k, 1)
158
+ assert_equal ret, @rc.mapcount_get_ms('key1', k)
159
+ sleep 2
160
+ assert_nil @rc.mapcount_get_ms('key1', k)
161
+ end
162
+
163
+ def test_mapcount_update_ms
164
+ k = "subkey1"
165
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
166
+ ret_time = {"last_updated_date"=>lt}
167
+ ret_all = {"last_updated_date"=>lt, k=>1}
168
+
169
+ assert_nil @rc.mapcount_update_ms('key1')
170
+ assert_equal ret_all, @rc.mapcount_countup_ms('key1', k, 0)
171
+ assert_equal ret_all, @rc.mapcount_update_ms('key1')
172
+ assert_equal ret_time, @rc.mapcount_update_ms('key1', 'subkey2')
173
+
174
+ assert_equal ret_all, @rc.mapcount_update_ms('key1', nil, 1)
175
+ sleep 2
176
+ assert_nil @rc.mapcount_get_ms('key1')
177
+
178
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
179
+ ret_all = {"last_updated_date"=>lt, k=>1}
180
+ assert_equal ret_all, @rc.mapcount_countup_ms('key1', k, 0)
181
+ assert_equal ret_all, @rc.mapcount_update_ms('key1', k, 1)
182
+ sleep 2
183
+ assert_nil @rc.mapcount_get_ms('key1')
184
+
185
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
186
+ ret_all = {"last_updated_date"=>lt, k=>1}
187
+ assert_equal ret_all, @rc.mapcount_countup_ms('key1', k, 0)
188
+ sleep 2
189
+ lt = Time.parse(Time.now.gmtime.strftime(DATE_FORMAT))
190
+ ret_all = {"last_updated_date"=>lt, k=>1}
191
+ assert_equal ret_all, @rc.mapcount_update_ms('key1')
192
+ end
193
+
194
+ def test_counts_ms
195
+ conn = Roma::Messaging::ConPool.instance.get_connection("localhost_11211")
196
+ if conn
197
+ conn.write "stat read_count\n"
198
+ r = conn.gets.split(" ")
199
+ assert_equal 0, r[1].to_i
200
+ conn.gets
201
+
202
+ @rc.mapcount_get_ms('key')
203
+ sleep 10
204
+ conn.write "stat read_count\n"
205
+ r = conn.gets.split(" ")
206
+ assert_equal 1, r[1].to_i
207
+ conn.gets
208
+
209
+ conn.write "stat write_count\n"
210
+ r = conn.gets.split(" ")
211
+ assert_equal 0, r[1].to_i
212
+ conn.gets
213
+
214
+ @rc.mapcount_countup_ms('key', 'subkey', 0)
215
+ sleep 10
216
+ conn.write "stat write_count\n"
217
+ r = conn.gets.split(" ")
218
+ assert_equal 1, r[1].to_i
219
+ conn.gets
220
+
221
+ @rc.mapcount_update_ms('key')
222
+ sleep 10
223
+ conn.write "stat write_count\n"
224
+ r = conn.gets.split(" ")
225
+ assert_equal 2, r[1].to_i
226
+ conn.gets
227
+
228
+ conn.close
229
+ end
230
+ end
231
+ end # MapCountPluginTest
@@ -0,0 +1,131 @@
1
+ #!/usr/bin/env ruby
2
+ require 'roma/client/rclient'
3
+ require 'roma/plugin/plugin_map'
4
+ require 'roma/client/plugin/map'
5
+
6
+ Roma::Client::RomaClient.class_eval{
7
+ def init_sync_routing_proc
8
+ end
9
+ }
10
+
11
+ class MapPluginTest < Test::Unit::TestCase
12
+ include RomaTestUtils
13
+
14
+ def setup
15
+ start_roma
16
+ @rc=Roma::Client::RomaClient.new(
17
+ ["localhost_11211","localhost_11212"],
18
+ [Roma::Client::Plugin::Map])
19
+ end
20
+
21
+ def teardown
22
+ stop_roma
23
+ Roma::Messaging::ConPool::instance.close_all
24
+ end
25
+
26
+ def mk_data(n = 10)
27
+ n.times do |i|
28
+ v = "value#{i}"
29
+ k = "mapkey#{i}"
30
+ assert_equal 'STORED', @rc.map_set('key1', k, v)
31
+ assert_equal v, @rc.map_get('key1', k)
32
+ end
33
+ end
34
+
35
+ def test_map_set_expt
36
+ assert_equal 'STORED', @rc.map_set('key1','mapkey1','value1', 1)
37
+ assert_equal 'value1', @rc.map_get('key1','mapkey1')
38
+ sleep 2
39
+ assert_nil @rc.map_get('key1','mapkey1')
40
+ end
41
+
42
+ def test_map_set
43
+ assert_nil @rc.map_get('key1','mapkey1')
44
+ assert_equal 'STORED', @rc.map_set('key1','mapkey1','value1')
45
+ assert_equal 'value1', @rc.map_get('key1','mapkey1')
46
+
47
+ assert_equal 'STORED', @rc.map_set('key1','mapkey1','value2')
48
+ assert_equal 'value2', @rc.map_get('key1','mapkey1')
49
+ end
50
+
51
+ def test_map_delete
52
+ mk_data
53
+ assert_equal 'NOT_FOUND', @rc.map_delete('key2', 'key1')
54
+ assert_equal 'NOT_DELETED', @rc.map_delete('key1', 'key1')
55
+ assert_equal 'DELETED', @rc.map_delete('key1', 'mapkey1')
56
+ assert_nil @rc.map_get('key1', 'mapkey1')
57
+ end
58
+
59
+ def test_map_clear
60
+ assert_equal 'NOT_FOUND', @rc.map_empty?('key1')
61
+ assert_equal 'NOT_FOUND', @rc.map_size('key1')
62
+ assert_equal 'NOT_FOUND', @rc.map_clear('key1')
63
+ mk_data
64
+ assert !@rc.map_empty?('key1')
65
+ assert_equal 10, @rc.map_size('key1')
66
+ assert_equal 'CLEARED', @rc.map_clear('key1')
67
+ assert @rc.map_empty?('key1')
68
+ assert_equal 0, @rc.map_size('key1')
69
+ end
70
+
71
+ def test_map_key?
72
+ assert_equal 'NOT_FOUND', @rc.map_key?('key1', 'key1')
73
+ mk_data
74
+ assert !@rc.map_key?('key1', 'key1')
75
+ assert @rc.map_key?('key1', 'mapkey1')
76
+ end
77
+
78
+ def test_map_value?
79
+ assert_equal 'NOT_FOUND', @rc.map_value?('key1', 'value1')
80
+ mk_data
81
+ assert !@rc.map_value?('key1', 'key1')
82
+ assert @rc.map_value?('key1', 'value1')
83
+ end
84
+
85
+ def test_map_keys
86
+ assert_nil @rc.map_keys('key1')
87
+ mk_data
88
+ v = [10]
89
+ 10.times{|i| v << "mapkey#{i}" }
90
+ assert_equal v, @rc.map_keys('key1')
91
+ end
92
+
93
+ def test_map_values
94
+ assert_nil @rc.map_values('key1')
95
+ mk_data
96
+ v = [10]
97
+ 10.times{|i| v << "value#{i}" }
98
+ assert_equal v, @rc.map_values('key1')
99
+ end
100
+
101
+ def test_map_to_s
102
+ assert !@rc.map_to_s('key1')
103
+ mk_data
104
+ h = {}
105
+ 10.times do |i|
106
+ v = "value#{i}"
107
+ k = "mapkey#{i}"
108
+ h[k] = v
109
+ end
110
+ assert_equal h, eval(@rc.map_to_s('key1'))
111
+ end
112
+
113
+ end # MapPluginTest
114
+
115
+ class MapPluginTestForceForward < MapPluginTest
116
+ def setup
117
+ super
118
+ @rc.rttable.instance_eval{
119
+ undef search_node
120
+
121
+ def search_node(key); search_node2(key); end
122
+
123
+ def search_node2(key)
124
+ d = Digest::SHA1.hexdigest(key).hex % @hbits
125
+ @rd.v_idx[d & @search_mask][1]
126
+ end
127
+ }
128
+ end
129
+ end
130
+
131
+