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
@@ -40,9 +40,7 @@ module Roma
40
40
 
41
41
  def set_version(nid,ver)
42
42
  @version_of_nodes[nid] = ver
43
- if @min_version == nil || @min_version > ver
44
- @min_version = ver
45
- end
43
+ @min_version = find_min_version
46
44
  end
47
45
 
48
46
  def find_min_version
@@ -176,8 +174,8 @@ module Roma
176
174
  end
177
175
 
178
176
  def enabled_failover=(b)
179
- @enabled_failover=b
180
177
  @fail_cnt.clear
178
+ @enabled_failover=b
181
179
  end
182
180
 
183
181
  def enabled_failover
@@ -312,9 +310,9 @@ module Roma
312
310
 
313
311
  @log.debug("#{__FILE__}:#{__LINE__}:n=#{n} pcount=#{pcount} scount=#{scount}")
314
312
 
315
- if pcount > n*1.1
313
+ if pcount > n
316
314
  return :over
317
- elsif pcount < n*0.9
315
+ elsif pcount < n
318
316
  return :less
319
317
  end
320
318
  :even
@@ -0,0 +1,307 @@
1
+ require 'yaml'
2
+
3
+ module Roma
4
+ module Routing
5
+
6
+ class RoutingData
7
+ attr_accessor :dgst_bits
8
+ attr_accessor :div_bits
9
+ attr_accessor :rn
10
+ attr_accessor :nodes
11
+ attr_accessor :v_idx
12
+ attr_accessor :v_clk
13
+
14
+ def initialize(dgst_bits,div_bits,rn)
15
+ @dgst_bits=dgst_bits
16
+ @div_bits=div_bits
17
+ @rn=rn
18
+ @nodes=[]
19
+ @v_idx={}
20
+ @v_clk={}
21
+ end
22
+
23
+ def save(fname)
24
+ @nodes.sort!
25
+ open(fname,'wb'){|io|
26
+ io.write(YAML.dump(self))
27
+ }
28
+ end
29
+
30
+ def self.load(fname)
31
+ rd=load_snapshot(fname)
32
+ rd.load_log_all(fname)
33
+ rd
34
+ end
35
+
36
+ def self.load_snapshot(fname)
37
+ rd=nil
38
+ open(fname,'rb'){|io|
39
+ rd = YAML.load(io.read)
40
+ }
41
+ rd
42
+ end
43
+
44
+ def self.snapshot(fname)
45
+ rd=load_snapshot(fname)
46
+ loglist=rd.get_file_list(fname)
47
+ if loglist.length<2
48
+ return false
49
+ end
50
+ loglist.delete(loglist.last)
51
+ loglist.each{|i,f|
52
+ rd.load_log_one(f)
53
+ File.rename(f,"#{f}~")
54
+ }
55
+ File.rename(fname,"#{fname}~")
56
+ rd.save(fname)
57
+ true
58
+ end
59
+
60
+ def self.decode_binary(bin)
61
+ magic, ver, dgst_bits, div_bits, rn, nodeslen = bin.unpack('a2nCCCn')
62
+ raise 'Illegal format error' if magic != 'RT'
63
+ raise 'Unsupported version error' if ver != 1
64
+
65
+ rd = RoutingData.new(dgst_bits, div_bits, rn)
66
+
67
+ bin = bin[9..-1]
68
+ nodeslen.times{|i|
69
+ len, = bin.unpack('n')
70
+ bin = bin[2..-1]
71
+ nid, = bin.unpack("a#{len}")
72
+ bin = bin[len..-1]
73
+ rd.nodes << nid
74
+ }
75
+ (2**div_bits).times{|i|
76
+ vn=i<<(dgst_bits-div_bits)
77
+ v_clk,len = bin.unpack('Nc')
78
+ rd.v_clk[vn] = v_clk
79
+ bin = bin[5..-1]
80
+ len.times{|i|
81
+ idx, = bin.unpack('n')
82
+ rd.v_idx[vn] = [] unless rd.v_idx[vn]
83
+ rd.v_idx[vn] << rd.nodes[idx]
84
+ bin = bin[2..-1]
85
+ }
86
+ }
87
+ rd
88
+ end
89
+
90
+ # 2 bytes('RT'):magic code
91
+ # unsigned short:format version
92
+ # unsigned char:dgst_bits
93
+ # unsigned char:div_bits
94
+ # unsigned char:rn
95
+ # unsigned short:number of nodes
96
+ # while number of nodes
97
+ # unsigned short:length of node-id string
98
+ # node-id string
99
+ # while umber of vnodes
100
+ # unsigned int32:v_clk
101
+ # unsigned char:number of nodes
102
+ # while umber of nodes
103
+ # unsigned short:index of nodes
104
+ def dump_binary
105
+ format_version = 1
106
+ # 9 bytes
107
+ ret = ['RT',format_version,dgst_bits,div_bits,rn,nodes.length].pack('a2nCCCn')
108
+ rev_hash = {}
109
+ nodes.each_with_index{|nid,idx|
110
+ rev_hash[nid] = idx
111
+ # 2 + nid.length bytes
112
+ ret += [nid.length,nid].pack('na*')
113
+ }
114
+ (2**div_bits).times{|i|
115
+ vn=i<<(dgst_bits-div_bits)
116
+ # 5 bytes
117
+ ret += [v_clk[vn],v_idx[vn].length].pack('Nc')
118
+ v_idx[vn].each{|nid|
119
+ # 2 bytes
120
+ ret += [rev_hash[nid]].pack('n')
121
+ }
122
+ }
123
+ ret
124
+ end
125
+
126
+ def each_log_all(fname)
127
+ loglist=get_file_list(fname)
128
+ loglist.each{|i,f|
129
+ each_log_one(f){|t,l| yield t,l}
130
+ }
131
+ end
132
+
133
+ def each_log_one(fname)
134
+ File.open(fname,"r"){|f|
135
+ while((line=f.gets)!=nil)
136
+ line.chomp!
137
+ next if line[0]=="#" || line.length==0
138
+ if line =~ /(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})\.\d+\s(.+)/
139
+ yield Time.mktime($1, $2, $3, $4, $5, $6), $7
140
+ end
141
+ end
142
+ }
143
+ end
144
+
145
+ def load_log_all(fname)
146
+ each_log_all(fname){|t,line|
147
+ parse_log(t,line)
148
+ }
149
+ @nodes.sort!
150
+ end
151
+
152
+ def load_log_one(fname)
153
+ each_log_one(fname){|t,line|
154
+ parse_log(t,line)
155
+ }
156
+ @nodes.sort!
157
+ end
158
+
159
+ def parse_log(t,line)
160
+ s=line.split(' ')
161
+ case s[0]
162
+ when 'setroute'
163
+ # setroute <vnode-id> <clock> <node-id> ...
164
+ nids=[]
165
+ s[3..-1].each{ |nid| nids << nid }
166
+ @v_idx[s[1].to_i]=nids
167
+ @v_clk[s[1].to_i]=s[2].to_i
168
+ when 'join'
169
+ # join <node-id>
170
+ @nodes << s[1] unless @nodes.include?(s[1])
171
+ when 'leave'
172
+ # leave <node-id>
173
+ @nodes.delete(s[1])
174
+ else
175
+ raise "RoutingData.parse_log:parse error #{line}"
176
+ end
177
+ end
178
+
179
+ def search_mask
180
+ 2**@div_bits-1<<(@dgst_bits-@div_bits)
181
+ end
182
+
183
+ def next_vnode(vn)
184
+ n = (vn >> (@dgst_bits-@div_bits)) + 1
185
+ n = 0 if n == (2**@div_bits)
186
+ n << (@dgst_bits-@div_bits)
187
+ end
188
+
189
+ def create_nodes_from_v_idx
190
+ buf_nodes={}
191
+ v_idx.each_value{|nids|
192
+ nids.each{|nid| buf_nodes[nid]=nid }
193
+ }
194
+ @nodes=buf_nodes.values.sort
195
+ end
196
+
197
+ # Returns the losted vnode-id list.
198
+ def get_lost_vnodes
199
+ ret=[]
200
+ v_idx.each_pair{|vn,nids|
201
+ ret << vn if nids.length == 0
202
+ }
203
+ ret
204
+ end
205
+
206
+ def self.create(dgst_bits,div_bits,rn,nodes,repethost=false)
207
+ ret=RoutingData.new(dgst_bits,div_bits,rn)
208
+ ret.nodes=nodes.clone
209
+
210
+ rnlm=RandomNodeListMaker.new(nodes,repethost)
211
+
212
+ (2**div_bits).times{|i|
213
+ vn=i<<(dgst_bits-div_bits)
214
+ ret.v_clk[vn]=0
215
+ ret.v_idx[vn]=rnlm.list(rn)
216
+ }
217
+ ret
218
+ end
219
+
220
+ # Returns the log file list by old ordered.
221
+ # +fname+:: Prefix of a log file.(ex.roma0_3300.route)
222
+ # One of the following example:
223
+ # [[1, "roma0_3300.route.1"], [2, "roma0_3300.route.2"]]
224
+ def get_file_list(fname)
225
+ l={}
226
+ files=Dir.glob("#{fname}*")
227
+ files.each{ |file|
228
+ if /#{fname}\.(\d+)$/=~file
229
+ l[$1.to_i]=$&
230
+ end
231
+ }
232
+ # sorted by old order
233
+ l.to_a.sort{|a,b| a[0]<=>b[0]}
234
+ end
235
+
236
+ def get_histgram
237
+ ret = {}
238
+ nodes.each{|nid|
239
+ ret[nid] = Array.new(rn,0)
240
+ }
241
+ v_idx.each_pair{|vn,nids|
242
+ nids.each_with_index{|nid,i|
243
+ ret[nid][i] += 1
244
+ }
245
+ }
246
+ ret
247
+ end
248
+
249
+ private
250
+
251
+ class RandomNodeListMaker
252
+ def initialize(nodes,repethost)
253
+ @repethost=repethost
254
+ @nodes=nodes
255
+ @host_idx={}
256
+ nodes.each{|nid|
257
+ h,p=nid.split('_')
258
+ if @host_idx.key?(h)
259
+ @host_idx[h] << nid
260
+ else
261
+ @host_idx[h]=[nid]
262
+ end
263
+ }
264
+ end
265
+
266
+ # Returns the random node-list without repetition.
267
+ # +n+:: list length
268
+ def list(n)
269
+ ret=[]
270
+ hosts=[]
271
+ proc_other_one = :get_other_one
272
+ proc_other_one = :get_other_one_repethost if @repethost
273
+ n.times{
274
+ nid=nil
275
+ nid=send(proc_other_one,hosts,ret)
276
+ break unless nid
277
+ hosts << nid.split('_')[0]
278
+ ret << nid
279
+ }
280
+ ret
281
+ end
282
+
283
+ # +exp_hosts+:: ignore
284
+ # +exp_nodes+:: exceptional nodes(ex.['roma0_11211'])
285
+ def get_other_one_repethost(exp_hosts,exp_nodes)
286
+ buf=@nodes.clone
287
+ buf.delete_if{|nid| exp_nodes.include?(nid)}
288
+ buf[rand(buf.length)]
289
+ end
290
+
291
+ # +exp_hosts+:: exceptional hosts(ex.['roma0','roma1'])
292
+ # +exp_nodes+:: ignore
293
+ def get_other_one(exp_hosts,exp_nodes)
294
+ hidx=@host_idx.clone
295
+ exp_hosts.each{|h| hidx.delete(h) }
296
+ return nil if hidx.length == 0
297
+
298
+ rh=hidx.keys[rand(hidx.keys.length)]
299
+ nodes=hidx[rh]
300
+ nodes[rand(nodes.length)]
301
+ end
302
+ end # class RandomNodeListMaker
303
+
304
+ end # class RoutingData
305
+
306
+ end # module Routing
307
+ end # module Roma
@@ -122,6 +122,10 @@ module Roma
122
122
  @rd.nodes,@rd.v_idx])
123
123
  end
124
124
 
125
+ def dump_binary
126
+ @rd.dump_binary
127
+ end
128
+
125
129
  def proc_failed(nid)
126
130
  t = Time.now
127
131
  if t - @fail_time > @fail_cnt_gap
@@ -1,11 +1,13 @@
1
1
  require 'singleton'
2
- require 'roma/config'
3
2
 
4
3
  module Roma
5
4
 
6
5
  class Stats
7
6
  include Singleton
8
7
 
8
+ # environment options
9
+ attr_accessor :config_path
10
+
9
11
  # command options
10
12
  attr_accessor :address, :port
11
13
  attr_accessor :daemon
@@ -14,6 +16,7 @@ module Roma
14
16
  attr_accessor :name
15
17
  attr_accessor :verbose
16
18
  attr_accessor :enabled_repetition_host_in_routing
19
+ attr_accessor :disabled_cmd_protect
17
20
 
18
21
  # proc mode
19
22
  attr_accessor :enabled_vnodes_balance
@@ -29,6 +32,7 @@ module Roma
29
32
 
30
33
  # proc param
31
34
  attr_accessor :stream_copy_wait_param
35
+ attr_accessor :dcnice
32
36
 
33
37
  # compressed redundant param
34
38
  attr_accessor :size_of_zredundant
@@ -41,7 +45,13 @@ module Roma
41
45
  attr_accessor :out_message_count
42
46
  attr_accessor :redundant_count
43
47
 
48
+ attr_accessor :hilatency_warn_time
49
+
50
+ # for write behind
51
+ attr_accessor :wb_command_map
52
+
44
53
  def initialize
54
+ @config_path = nil
45
55
  @run_acquire_vnodes = false
46
56
  @run_recover = false
47
57
  @run_sync_routing = false
@@ -49,8 +59,8 @@ module Roma
49
59
  @run_storage_clean_up = false
50
60
  @run_receive_a_vnode = false
51
61
  @run_release = false
52
- @stream_copy_wait_param =
53
- Roma::Config::DATACOPY_STREAM_COPY_WAIT_PARAM
62
+ @stream_copy_wait_param = 0.0001
63
+ @dcnice = 3
54
64
  @enabled_vnodes_balance = nil
55
65
  @write_count = 0
56
66
  @read_count = 0
@@ -59,6 +69,8 @@ module Roma
59
69
  @out_message_count = 0
60
70
  @redundant_count = 0
61
71
  @size_of_zredundant = 0
72
+ @hilatency_warn_time = 5
73
+ @wb_command_map = {}
62
74
  end
63
75
 
64
76
  def ap_str
@@ -67,6 +79,7 @@ module Roma
67
79
 
68
80
  def get_stat
69
81
  ret = {}
82
+ ret['stats.config_path'] = @config_path
70
83
  ret['stats.address'] = @address
71
84
  ret['stats.port'] = @port
72
85
  ret['stats.daemon'] = @daemon
@@ -80,6 +93,7 @@ module Roma
80
93
  ret['stats.run_storage_clean_up'] = @run_storage_clean_up
81
94
  ret['stats.run_release'] = @run_release
82
95
  ret['stats.stream_copy_wait_param'] = @stream_copy_wait_param
96
+ ret['stats.dcnice'] = @dcnice
83
97
  ret['stats.size_of_zredundant'] = @size_of_zredundant
84
98
  ret['stats.write_count'] = @write_count
85
99
  ret['stats.read_count'] = @read_count
@@ -87,6 +101,8 @@ module Roma
87
101
  ret['stats.out_count'] = @out_count
88
102
  ret['stats.out_message_count'] = @out_message_count
89
103
  ret['stats.redundant_count'] = @redundant_count
104
+ ret['stats.hilatency_warn_time'] = @hilatency_warn_time
105
+ ret['stats.wb_command_map'] = @wb_command_map.inspect
90
106
  ret
91
107
  end
92
108
 
@@ -3,6 +3,8 @@ require 'digest/sha1'
3
3
  module Roma
4
4
  module Storage
5
5
 
6
+ class StorageException < Exception; end
7
+
6
8
  class BasicStorage
7
9
 
8
10
  attr :hdb
@@ -13,9 +15,9 @@ module Roma
13
15
 
14
16
  attr_writer :vn_list
15
17
  attr_writer :storage_path
16
- attr_writer :divnum
17
18
  attr_writer :option
18
19
 
20
+ attr_accessor :divnum
19
21
  attr_accessor :each_vn_dump_sleep
20
22
  attr_accessor :each_vn_dump_sleep_count
21
23
  attr_accessor :each_clean_up_sleep
@@ -87,6 +89,7 @@ module Roma
87
89
  end
88
90
 
89
91
  def closedb
92
+ stop_clean_up
90
93
  buf = @hdb; @hdb = []
91
94
  buf.each{ |hdb| close_db(hdb) }
92
95
  end
@@ -237,6 +240,14 @@ module Roma
237
240
  unpack_data(buf)
238
241
  end
239
242
 
243
+ def get_raw2(k)
244
+ @hdb.each{|hdb|
245
+ buf = hdb.get(k)
246
+ return unpack_data(buf) if buf
247
+ }
248
+ nil
249
+ end
250
+
240
251
  def rdelete(vn, k, d, clk)
241
252
  buf = @hdb[@hdiv[vn]].get(k)
242
253
  t = Time.now.to_i
@@ -323,6 +334,19 @@ module Roma
323
334
  nil
324
335
  end
325
336
 
337
+ # set expire time
338
+ def set_expt(vn, k, d, expt)
339
+ buf = @hdb[@hdiv[vn]].get(k)
340
+ if buf
341
+ vn, t, clk, expt2, v = unpack_data(buf)
342
+ return nil if Time.now.to_i > expt2
343
+ clk = (clk + 1) & 0xffffffff
344
+ ret = [vn, Time.now.to_i, clk, expt, v]
345
+ return ret if @hdb[@hdiv[vn]].put(k, pack_data(*ret))
346
+ end
347
+ nil
348
+ end
349
+
326
350
  def true_length
327
351
  res = 0
328
352
  @hdb.each{ |hdb| res += hdb.rnum }
@@ -337,30 +361,6 @@ module Roma
337
361
  buf.each_key{ |k| @hdb[@hdiv[vn]].out(k) }
338
362
  end
339
363
 
340
- def clean_up(t,unit_test_flg=nil)
341
- n = 0
342
- nt = Time.now.to_i
343
- @hdb.each_index{ |i|
344
- delkey = []
345
- @hdb[i].each{ |k, v|
346
- vn, last, clk, expt = unpack_header(v)
347
- if nt > expt && t > last
348
- n += 1
349
- #delkey << k
350
- @hdb[i].out(k)
351
- end
352
- if unit_test_flg
353
- closedb
354
- end
355
- sleep @each_clean_up_sleep
356
- }
357
- #delkey.each{ |k| @hdb[i].out(k) }
358
- }
359
- n
360
- rescue => e
361
- raise NoMethodError(e.message)
362
- end
363
-
364
364
  def each_clean_up(t, vnhash)
365
365
  @do_clean_up = true
366
366
  nt = Time.now.to_i
@@ -488,7 +488,6 @@ module Roma
488
488
  end
489
489
  }
490
490
  end
491
- private :each_hdb_dump
492
491
 
493
492
  # Create vnode dump.
494
493
  def get_vnode_hash(vn)