roma 0.8.13 → 0.8.14

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env ruby
2
+ require 'optparse'
3
+ require 'date'
4
+ require 'roma/client/rclient'
5
+
6
+ @cnt = 0
7
+ @tmax = 0
8
+ @tmin = 100
9
+
10
+ Thread.new do
11
+ sleep_time=10
12
+ while(true)
13
+ sleep sleep_time
14
+ printf("qps=%d max=%f min=%f ave=%f\n",@cnt/sleep_time,@tmax,@tmin,sleep_time/@cnt.to_f)
15
+ @cnt=0
16
+ @tmax=0
17
+ @tmin=100
18
+ end
19
+ end
20
+
21
+ def random_rquest_sender(ini_nodes, n)
22
+ puts __method__
23
+ rc=Roma::Client::RomaClient.new(ini_nodes)
24
+
25
+ loop do
26
+ i=rand(n)
27
+ ts = DateTime.now
28
+ case rand(3)
29
+ when 0
30
+ res=rc.set(i.to_s,'hoge'+i.to_s)
31
+ puts "set k=#{i} #{res}" if res==nil || res.chomp != 'STORED'
32
+ when 1
33
+ res=rc.get(i.to_s)
34
+ puts "get k=#{i} #{res}" if res == :error
35
+ when 2
36
+ res=rc.delete(i.to_s)
37
+ puts "del k=#{i} #{res}" if res != 'DELETED' && res != 'NOT_FOUND'
38
+ end
39
+ t=(DateTime.now - ts).to_f * 86400.0
40
+ @tmax=t if t > @tmax
41
+ @tmin=t if t < @tmin
42
+ @cnt+=1
43
+ end
44
+ end
45
+
46
+ def set_counts(ini_nodes, range, c)
47
+ puts "#{__method__} #{range} #{c}"
48
+ rc=Roma::Client::RomaClient.new(ini_nodes)
49
+
50
+ range.each do |i|
51
+ ts = DateTime.now
52
+ res=rc.set("key_#{i}","#{c}")
53
+ puts "set k=#{i} #{res}" if res==nil || res.chomp != 'STORED'
54
+ t=(DateTime.now - ts).to_f * 86400.0
55
+ @tmax=t if t > @tmax
56
+ @tmin=t if t < @tmin
57
+ @cnt+=1
58
+ end
59
+ end
60
+
61
+ def check_count(ini_nodes, range, c)
62
+ puts "#{__method__} #{range} #{c}"
63
+ rc=Roma::Client::RomaClient.new(ini_nodes)
64
+
65
+ range.each do |i|
66
+ ts = DateTime.now
67
+ res = rc.get("key_#{i}")
68
+ if res != c.to_s
69
+ puts "error k=key_#{i} #{res}"
70
+ end
71
+ t=(DateTime.now - ts).to_f * 86400.0
72
+ @tmax=t if t > @tmax
73
+ @tmin=t if t < @tmin
74
+ @cnt+=1
75
+ end
76
+ end
77
+
78
+ def send_cmd(nid, cmd)
79
+ conn = Roma::Client::ConPool.instance.get_connection(nid)
80
+ conn.write "#{cmd}\r\n"
81
+ ret = conn.gets
82
+ Roma::Client::ConPool.instance.return_connection(nid, conn)
83
+ ret
84
+ rescue =>e
85
+ STDERR.puts "#{nid} #{cmd} #{e.inspect}"
86
+ nil
87
+ end
88
+
89
+ def stats(nid, regexp=nil)
90
+ conn = Roma::Client::ConPool.instance.get_connection(nid)
91
+ if regexp
92
+ conn.write "stats #{regexp}\r\n"
93
+ else
94
+ conn.write "stats\r\n"
95
+ end
96
+ ret = ""
97
+ while(conn.gets != "END\r\n")
98
+ ret << $_
99
+ end
100
+ Roma::Client::ConPool.instance.return_connection(nid, conn)
101
+ ret
102
+ rescue =>e
103
+ STDERR.puts "#{nid} #{e.inspect}"
104
+ nil
105
+ end
106
+
107
+ def safecopy_stats(nid)
108
+ ret = stats(nid, 'storage.safecopy_stats')
109
+ return eval $1 if ret =~ /^.+\s(\[.+\])/
110
+ nil
111
+ end
112
+
113
+ def set_storage_status(nid, fno, stat)
114
+ send_cmd(ARGV[0], "set_storage_status #{fno} #{stat}")
115
+ end
116
+
117
+ def wait_status(nid, fno, stat)
118
+ while safecopy_stats(nid)[fno] != stat
119
+ sleep 5
120
+ end
121
+ stat
122
+ end
123
+
124
+
125
+ def test_change_status
126
+
127
+ puts "write (0...10000) = 0"
128
+ set_counts(ARGV, 0...10000, 0)
129
+ Thread.new { random_rquest_sender(ARGV, 10000) }
130
+
131
+ nid = ARGV[0]
132
+
133
+ sleep(5)
134
+
135
+ 10.times do |n|
136
+ t = Thread.new { set_counts(ARGV, (n * 1000)...(n * 1000 + 2000), n * 10 + 1) }
137
+ p set_storage_status(nid, n, 'safecopy')
138
+ p wait_status(nid, n, :safecopy_flushed)
139
+ t.join
140
+ p safecopy_stats(nid)
141
+
142
+ #sleep(30)
143
+ t = Thread.new { set_counts(ARGV, (n * 1000 + 500)...(n * 1000 + 2000), n * 10 + 2) }
144
+ p set_storage_status(nid, n, 'normal')
145
+ p wait_status(nid, n, :normal)
146
+ t.join
147
+ p safecopy_stats(nid)
148
+ check_count(ARGV, (n * 1000)...(n * 1000 + 500), n * 10 + 1)
149
+ check_count(ARGV, (n * 1000 + 500)...(n * 1000 + 2000), n * 10 + 2)
150
+ if (n * 1000 + 2000) < 10000
151
+ check_count(ARGV, (n * 1000 + 2000)...10000, 0)
152
+ end
153
+ end
154
+ end
155
+
156
+ def test_round
157
+ n = 0
158
+ 1000.times do |i|
159
+ set_counts(ARGV, 0...10000, i)
160
+ check_count(ARGV, 0...10000, i)
161
+ end
162
+ end
163
+
164
+ param = { :num=>10000, :th=>1 }
165
+
166
+ opts = OptionParser.new
167
+
168
+ opts.on("-r", "--round", "round request"){|v| param[:round] = v }
169
+
170
+ opts.banner = "usage:#{File.basename($0)} [options] addr:port"
171
+ opts.parse!(ARGV)
172
+
173
+ if ARGV.length == 0
174
+ STDERR.puts opts.help
175
+ exit
176
+ end
177
+
178
+ if param.key?(:round)
179
+ test_round
180
+ else
181
+ test_change_status
182
+ end
183
+
184
+ puts "#{File.basename($0)} has done."
@@ -3,18 +3,18 @@ require 'optparse'
3
3
  require 'date'
4
4
  require 'roma/client/rclient'
5
5
 
6
- @@cnt = 0
7
- @@tmax = 0
8
- @@tmin = 100
6
+ @cnt = 0
7
+ @tmax = 0
8
+ @tmin = 100
9
9
 
10
10
  Thread.new do
11
11
  sleep_time=10
12
12
  while(true)
13
13
  sleep sleep_time
14
- printf("qps=%d max=%f min=%f ave=%f\n",@@cnt/sleep_time,@@tmax,@@tmin,sleep_time/@@cnt.to_f)
15
- @@cnt=0
16
- @@tmax=0
17
- @@tmin=100
14
+ printf("qps=%d max=%f min=%f ave=%f\n",@cnt/sleep_time,@tmax,@tmin,sleep_time/@cnt.to_f)
15
+ @cnt=0
16
+ @tmax=0
17
+ @tmin=100
18
18
  end
19
19
  end
20
20
 
@@ -37,9 +37,9 @@ def random_request_sender(ini_nodes, n)
37
37
  puts "del k=#{i} #{res}" if res != 'DELETED' && res != 'NOT_FOUND'
38
38
  end
39
39
  t=(DateTime.now - ts).to_f * 86400.0
40
- @@tmax=t if t > @@tmax
41
- @@tmin=t if t < @@tmin
42
- @@cnt+=1
40
+ @tmax=t if t > @tmax
41
+ @tmin=t if t < @tmin
42
+ @cnt+=1
43
43
  end
44
44
  end
45
45
 
@@ -52,9 +52,9 @@ def set_sequence(ini_nodes, n)
52
52
  res=rc.set("key_#{i}","value_#{i}")
53
53
  puts "set k=#{i} #{res}" if res==nil || res.chomp != 'STORED'
54
54
  t=(DateTime.now - ts).to_f * 86400.0
55
- @@tmax=t if t > @@tmax
56
- @@tmin=t if t < @@tmin
57
- @@cnt+=1
55
+ @tmax=t if t > @tmax
56
+ @tmin=t if t < @tmin
57
+ @cnt+=1
58
58
  end
59
59
  end
60
60
 
@@ -67,9 +67,9 @@ def get_sequence(ini_nodes, n)
67
67
  res=rc.get("key_#{i}")
68
68
  puts "get #{i} #{res}" if res != "value_#{i}"
69
69
  t=(DateTime.now - ts).to_f * 86400.0
70
- @@tmax=t if t > @@tmax
71
- @@tmin=t if t < @@tmin
72
- @@cnt+=1
70
+ @tmax=t if t > @tmax
71
+ @tmin=t if t < @tmin
72
+ @cnt+=1
73
73
  end
74
74
  end
75
75
 
@@ -1,4 +1,4 @@
1
1
 
2
2
  module Roma
3
- VERSION = "0.8.13"
3
+ VERSION = "0.8.14"
4
4
  end
@@ -36,7 +36,7 @@ class TCStorageTest < Test::Unit::TestCase
36
36
 
37
37
  def test_set_get
38
38
  assert_equal( 'abc_data',@st.set(0,'abc',0,0xffffffff,'abc_data')[4])
39
- assert_equal( 'abc_data', @st.get(0,'abc',0) )
39
+ assert_equal( 'abc_data', @st.get(0,'abc',0) )
40
40
  end
41
41
 
42
42
  def test_set_delete
@@ -435,61 +435,63 @@ class TCStorageTest < Test::Unit::TestCase
435
435
  }
436
436
  end
437
437
 
438
- def test_dump_file
438
+ def test_each_vn_dump_in_normal
439
439
  n=100
440
440
  n.times{|i|
441
441
  @st.set(0,"key#{i}",0,0x7fffffff,"val#{i}")
442
442
  }
443
- @st.dump_file('storage_test_dump')
444
-
445
- count = 0
446
- open("storage_test_dump/#{@st.hdiv[0]}.dump",'rb'){|f|
447
- until(f.eof?)
448
- b1 = f.read(5 * 4)
449
- vn, last, clk, expt, klen = b1.unpack('NNNNN')
450
- key = f.read(klen)
451
- b2 = f.read(4)
452
- vlen = b2.unpack('N')[0]
453
- val = f.read(vlen)
454
-
455
- count += 1
456
- assert_equal('key',key[0..2])
457
- assert_equal('val',val[0..2])
458
- assert_equal(val[3..-1],key[3..-1] )
459
- end
443
+ (90..99).each{|i|
444
+ @st.delete(0, "key#{i}", 0)
460
445
  }
461
- assert_equal(n,count)
462
- rmtestdir('storage_test_dump')
463
-
464
- @st.dump_file('storage_test_dump',{0=>0})
465
446
  count = 0
466
- open("storage_test_dump/#{@st.hdiv[0]}.dump",'rb'){|f|
467
- until(f.eof?)
468
- b1 = f.read(5 * 4)
469
- vn, last, clk, expt, klen = b1.unpack('NNNNN')
470
- key = f.read(klen)
471
- b2 = f.read(4)
472
- vlen = b2.unpack('N')[0]
473
- val = f.read(vlen)
474
-
475
- count += 1
476
- assert_equal('key',key[0..2] )
477
- assert_equal('val',val[0..2] )
478
- assert_equal(val[3..-1],key[3..-1] )
479
- end
447
+ @st.each_vn_dump(0){|data|
448
+ vn, last, clk, expt, klen = data.slice!(0..19).unpack('NNNNN')
449
+ k = data.slice!(0..(klen-1))
450
+ vlen, = data.slice!(0..3).unpack('N')
451
+ v = data
452
+ count += 1
453
+ # puts "#{vn} #{last} #{clk} #{expt} #{klen} #{k} #{vlen} #{v}"
454
+ assert_equal('key',k[0..2])
455
+ assert_equal('val',v[0..2]) if k[3..-1].to_i < 90
456
+
457
+ assert_nil( @st.load_stream_dump(vn, last, clk, expt, k, v) )
458
+ @st.load_stream_dump(2, last, clk, expt, k, v)
480
459
  }
460
+ assert_equal(100,count)
461
+
462
+ count = 0
463
+ @st.each_vn_dump(1){|data| count += 1 }
481
464
  assert_equal(0,count )
482
- rmtestdir('storage_test_dump')
465
+
466
+ count = 0
467
+ @st.each_vn_dump(2){|data| count += 1 }
468
+ assert_equal(100,count )
483
469
  end
484
470
 
485
- def test_each_vn_dump
471
+ def test_each_vn_dump_not_normal
472
+ dn = @st.instance_eval{ @hdiv[0] }
473
+
486
474
  n=100
487
475
  n.times{|i|
488
476
  @st.set(0,"key#{i}",0,0x7fffffff,"val#{i}")
489
477
  }
478
+
479
+ # :normal -> :safecopy_flushing
480
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
481
+ # :safecopy_flushing -> :safecopy_flushed
482
+ assert_equal(:safecopy_flushed, @st.set_db_stat(dn, :safecopy_flushed))
483
+
484
+ (80..99).each{|i|
485
+ @st.set(0,"key#{i}",0,0x7fffffff,"val#{i + 1}")
486
+ }
487
+
488
+ # :safecopy_flushed -> :cachecleaning
489
+ assert_equal(:cachecleaning, @st.set_db_stat(dn, :cachecleaning))
490
+
490
491
  (90..99).each{|i|
491
492
  @st.delete(0, "key#{i}", 0)
492
493
  }
494
+
493
495
  count = 0
494
496
  @st.each_vn_dump(0){|data|
495
497
  vn, last, clk, expt, klen = data.slice!(0..19).unpack('NNNNN')
@@ -498,8 +500,14 @@ class TCStorageTest < Test::Unit::TestCase
498
500
  v = data
499
501
  count += 1
500
502
  # puts "#{vn} #{last} #{clk} #{expt} #{klen} #{k} #{vlen} #{v}"
501
- assert_equal('key',k[0..2])
502
- assert_equal('val',v[0..2]) if k[3..-1].to_i < 90
503
+ assert_match(/key\d/, k)
504
+ if k[3..-1].to_i < 80
505
+ assert_match("val#{k[3..-1]}", v)
506
+ elsif k[3..-1].to_i < 90
507
+ assert_match("val#{k[3..-1].to_i + 1}", v)
508
+ else
509
+ assert(vlen == 0)
510
+ end
503
511
 
504
512
  assert_nil( @st.load_stream_dump(vn, last, clk, expt, k, v) )
505
513
  @st.load_stream_dump(2, last, clk, expt, k, v)
@@ -515,6 +523,180 @@ class TCStorageTest < Test::Unit::TestCase
515
523
  assert_equal(100,count )
516
524
  end
517
525
 
526
+ def test_db_stat
527
+ assert_nil(@st.instance_eval{ @hdbc[0] })
528
+ # :normal -> error case
529
+ assert_equal(false, @st.set_db_stat(0, :safecopy_flushed))
530
+ assert_equal(false, @st.set_db_stat(0, :cachecleaning))
531
+ assert_equal(false, @st.set_db_stat(0, :normal))
532
+ # :normal -> :safecopy_flushing
533
+ assert_equal(:safecopy_flushing, @st.set_db_stat(0, :safecopy_flushing))
534
+ assert_equal(:safecopy_flushing, @st.instance_eval{ @dbs[0] })
535
+ assert(@st.instance_eval{ @hdbc[0] })
536
+
537
+ # :safecopy_flushing -> error case
538
+ assert_equal(false, @st.set_db_stat(0, :safecopy_flushing))
539
+ assert_equal(false, @st.set_db_stat(0, :cachecleaning))
540
+ assert_equal(false, @st.set_db_stat(0, :normal))
541
+ # :safecopy_flushing -> :safecopy_flushed
542
+ assert_equal(:safecopy_flushed, @st.set_db_stat(0, :safecopy_flushed))
543
+ assert_equal(:safecopy_flushed, @st.instance_eval{ @dbs[0] })
544
+ assert(@st.instance_eval{ @hdbc[0] })
545
+
546
+ # :safecopy_flushed -> error case
547
+ assert_equal(false, @st.set_db_stat(0, :safecopy_flushing))
548
+ assert_equal(false, @st.set_db_stat(0, :safecopy_flushed))
549
+ assert_equal(false, @st.set_db_stat(0, :normal))
550
+ # :safecopy_flushed -> :cachecleaning
551
+ assert_equal(:cachecleaning, @st.set_db_stat(0, :cachecleaning))
552
+ assert_equal(:cachecleaning, @st.instance_eval{ @dbs[0] })
553
+ assert(@st.instance_eval{ @hdbc[0] })
554
+
555
+ # :cachecleaning -> error case
556
+ assert_equal(false, @st.set_db_stat(0, :safecopy_flushed))
557
+ assert_equal(false, @st.set_db_stat(0, :cachecleaning))
558
+ # :cachecleaning -> :safecopy_flushing
559
+ assert_equal(:safecopy_flushing, @st.set_db_stat(0, :safecopy_flushing))
560
+ assert_equal(:safecopy_flushing, @st.instance_eval{ @dbs[0] })
561
+ assert_equal(:safecopy_flushed, @st.set_db_stat(0, :safecopy_flushed))
562
+ assert_equal(:cachecleaning, @st.set_db_stat(0, :cachecleaning))
563
+ assert(@st.instance_eval{ @hdbc[0] })
564
+ # :cachecleaning -> :normal
565
+ assert_equal(:normal, @st.set_db_stat(0, :normal))
566
+ assert_equal(:normal, @st.instance_eval{ @dbs[0] })
567
+ assert_nil(@st.instance_eval{ @hdbc[0] })
568
+ end
569
+
570
+ def test_clock_along_status
571
+ vn = 0
572
+ dn = @st.instance_eval{ @hdiv[vn] }
573
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
574
+ assert( @st.get_context(vn, 'abc', 0)[2] == 0 )
575
+ # :normal -> :safecopy_flushing
576
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
577
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
578
+ assert( @st.get_context(vn, 'abc', 0)[2] == 1 )
579
+ # :safecopy_flushing -> :safecopy_flushed
580
+ assert_equal(:safecopy_flushed, @st.set_db_stat(dn, :safecopy_flushed))
581
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
582
+ assert( @st.get_context(vn, 'abc', 0)[2] == 2 )
583
+ # :safecopy_flushed -> :cachecleaning
584
+ assert_equal(:cachecleaning, @st.set_db_stat(dn, :cachecleaning))
585
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
586
+ assert( @st.get_context(vn, 'abc', 0)[2] == 3 )
587
+ # :cachecleaning -> :normal
588
+ assert_equal(:normal, @st.set_db_stat(dn, :normal))
589
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
590
+ assert( @st.get_context(vn, 'abc', 0)[2] == 4 )
591
+ end
592
+
593
+ def test_set_get_in_safecopy
594
+ vn = 0
595
+ dn = @st.instance_eval{ @hdiv[vn] }
596
+ # :normal -> :safecopy_flushing
597
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
598
+ assert_equal(:safecopy_flushing, @st.instance_eval{ @dbs[dn] })
599
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
600
+ assert_equal('abc_data', @st.get(vn,'abc',0) )
601
+ # not stored
602
+ assert_nil(@st.instance_eval{ @hdb[dn].get('abc') })
603
+ # stored
604
+ assert(@st.instance_eval{ @hdbc[dn].get('abc') })
605
+
606
+ # :safecopy_flushing -> :safecopy_flushed
607
+ assert_equal(:safecopy_flushed, @st.set_db_stat(dn, :safecopy_flushed))
608
+ assert_equal(:safecopy_flushed, @st.instance_eval{ @dbs[dn] })
609
+ assert_equal('def_data', @st.set(vn,'def',0,0xffffffff,'def_data')[4])
610
+ assert_equal('def_data', @st.get(vn,'def',0) )
611
+ # not stored
612
+ assert_nil(@st.instance_eval{ @hdb[dn].get('def') })
613
+ # stored
614
+ assert(@st.instance_eval{ @hdbc[dn].get('def') })
615
+ end
616
+
617
+ def test_set_get_in_cachecleaning
618
+ vn = 0
619
+ dn = @st.instance_eval{ @hdiv[vn] }
620
+ assert_equal( 'abc_data',@st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
621
+ assert_equal( 'abc_data', @st.get(vn,'abc',0) ) # database
622
+ # :normal -> :safecopy_flushing
623
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
624
+ # :safecopy_flushing -> :safecopy_flushed
625
+ assert_equal(:safecopy_flushed, @st.set_db_stat(dn, :safecopy_flushed))
626
+ assert_equal( 'abc_data1',@st.set(vn,'abc',0,0xffffffff,'abc_data1')[4])
627
+ assert_equal( 'abc_data1', @st.get(vn,'abc',0) ) # cache
628
+ # :safecopy_flushed -> :cachecleaning
629
+ assert_equal(:cachecleaning, @st.set_db_stat(dn, :cachecleaning))
630
+ assert_equal( 'abc_data1', @st.get(vn,'abc',0) ) # cache
631
+ assert_equal( 'abc_data2',@st.set(vn,'abc',0,0xffffffff,'abc_data2')[4])
632
+ assert_equal( 'abc_data2', @st.get(vn,'abc',0) ) # database
633
+ end
634
+
635
+ def test_out_cache
636
+ vn = 0
637
+ dn = @st.instance_eval{ @hdiv[vn] }
638
+ # :normal -> :safecopy_flushing
639
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
640
+ assert_equal(:safecopy_flushing, @st.instance_eval{ @dbs[dn] })
641
+ assert_equal('abc_data', @st.set(vn,'abc',0,0xffffffff,'abc_data')[4])
642
+ assert_equal('abc_data', @st.get(vn,'abc',0) )
643
+ # not stored
644
+ assert_nil(@st.instance_eval{ @hdb[dn].get('abc') })
645
+ # stored
646
+ assert(@st.instance_eval{ @hdbc[dn].get('abc') })
647
+ # out
648
+ @st.out_cache(dn, 'abc')
649
+ # not stored
650
+ assert_nil(@st.instance_eval{ @hdb[dn].get('abc') })
651
+ # not stored
652
+ assert_nil(@st.instance_eval{ @hdbc[dn].get('abc') })
653
+ end
654
+
655
+ def test_each_cache_dump_pack
656
+ vn = 0
657
+ dn = @st.instance_eval{ @hdiv[vn] }
658
+ # :normal -> :safecopy_flushing
659
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
660
+ keys = []
661
+ 10.times do |i|
662
+ k = "key#{i}"
663
+ v = "val#{i}"
664
+ assert_equal(v, @st.set(vn,k,0,0xffffffff,v)[4])
665
+ keys << k
666
+ end
667
+ @st.each_cache_dump_pack(dn, keys) do |data|
668
+ vn, last, clk, expt, klen = data.slice!(0..19).unpack('NNNNN')
669
+ k = data.slice!(0..(klen-1))
670
+ vlen, = data.slice!(0..3).unpack('N')
671
+ v = data
672
+ # puts "#{vn} #{last} #{clk} #{expt} #{klen} #{k} #{vlen} #{v}"
673
+ assert_match(/key\d/, k)
674
+ assert_match("val#{k[3..-1]}", v)
675
+ end
676
+ end
677
+
678
+ def test_get_keys_in_cache
679
+ vn = 0
680
+ dn = @st.instance_eval{ @hdiv[vn] }
681
+ # :normal -> :safecopy_flushing
682
+ assert_equal(:safecopy_flushing, @st.set_db_stat(dn, :safecopy_flushing))
683
+ keys = []
684
+ 100.times do |i|
685
+ k = "key#{i}"
686
+ v = "val#{i}"
687
+ assert_equal(v, @st.set(vn,k,0,0xffffffff,v)[4])
688
+ end
689
+
690
+ assert(@st.instance_eval{ @hdbc[dn].rnum } == 100)
691
+ 10.times do
692
+ keys = @st.get_keys_in_cache(dn, 10)
693
+ assert(keys.length == 10)
694
+ keys.each do |k|
695
+ @st.out_cache(dn, k)
696
+ end
697
+ end
698
+ assert(@st.instance_eval{ @hdbc[dn].rnum } == 0)
699
+ end
518
700
  end
519
701
 
520
702
  class DbmStorageTest < TCStorageTest