higgs 0.1.5 → 0.1.6

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 (69) hide show
  1. data/ChangeLog +67 -0
  2. data/bin/higgs_apply_jlog +1 -1
  3. data/bin/higgs_backup +1 -1
  4. data/bin/higgs_dump_index +1 -1
  5. data/bin/higgs_dump_jlog +1 -1
  6. data/bin/higgs_ping +1 -1
  7. data/bin/higgs_verify +1 -1
  8. data/lib/cgi/session/higgs.rb +3 -3
  9. data/lib/higgs/block.rb +3 -3
  10. data/lib/higgs/cache.rb +17 -13
  11. data/lib/higgs/dbm.rb +3 -3
  12. data/lib/higgs/exceptions.rb +3 -3
  13. data/lib/higgs/flock.rb +3 -3
  14. data/lib/higgs/index.rb +35 -17
  15. data/lib/higgs/jlog.rb +3 -3
  16. data/lib/higgs/lock.rb +5 -5
  17. data/lib/higgs/services.rb +3 -3
  18. data/lib/higgs/sman.rb +7 -3
  19. data/lib/higgs/storage.rb +14 -3
  20. data/lib/higgs/store.rb +3 -3
  21. data/lib/higgs/tar.rb +3 -3
  22. data/lib/higgs/thread.rb +130 -8
  23. data/lib/higgs/tman.rb +15 -13
  24. data/lib/higgs/utils/bman.rb +3 -3
  25. data/lib/higgs/utils.rb +3 -3
  26. data/lib/higgs/version.rb +4 -4
  27. data/lib/higgs.rb +2 -2
  28. data/misc/cache_bench/cache_bench.rb +2 -2
  29. data/misc/dbm_bench/.strc +1 -1
  30. data/misc/dbm_bench/Rakefile +1 -1
  31. data/misc/dbm_bench/dbm_multi_thread.rb +2 -2
  32. data/misc/dbm_bench/dbm_rnd_delete.rb +2 -2
  33. data/misc/dbm_bench/dbm_rnd_read.rb +2 -2
  34. data/misc/dbm_bench/dbm_rnd_update.rb +2 -2
  35. data/misc/dbm_bench/dbm_seq_read.rb +2 -2
  36. data/misc/dbm_bench/dbm_seq_write.rb +2 -2
  37. data/misc/dbm_bench/run.rb +52 -0
  38. data/misc/dbm_bench/st_verify.rb +2 -2
  39. data/misc/io_bench/cksum_bench.rb +1 -1
  40. data/misc/io_bench/jlog_bench.rb +2 -2
  41. data/misc/io_bench/write_bench.rb +1 -1
  42. data/misc/thread_bench/lock_bench.rb +2 -2
  43. data/test/Rakefile +1 -1
  44. data/test/run.rb +3 -3
  45. data/test/test_block.rb +1 -1
  46. data/test/test_cache.rb +9 -9
  47. data/test/test_cache_mvcc.rb +403 -168
  48. data/test/test_cgi_session.rb +3 -3
  49. data/test/test_dbm.rb +14 -5
  50. data/test/test_flock.rb +1 -1
  51. data/test/test_index.rb +5 -7
  52. data/test/test_jlog.rb +1 -1
  53. data/test/test_lock.rb +21 -21
  54. data/test/test_online_backup.rb +1 -1
  55. data/test/test_services.rb +1 -1
  56. data/test/test_storage.rb +4 -4
  57. data/test/test_storage_conf.rb +1 -1
  58. data/test/test_storage_init_opts.rb +1 -1
  59. data/test/test_store.rb +2 -2
  60. data/test/test_tar.rb +19 -19
  61. data/test/test_thread.rb +46 -46
  62. data/test/test_tman.rb +2 -2
  63. data/test/test_tman_init_opts.rb +1 -1
  64. data/test/test_tman_mvcc.rb +11 -11
  65. data/test/test_utils_bman.rb +4 -2
  66. metadata +10 -18
  67. data/Rakefile +0 -81
  68. data/mkrdoc.rb +0 -11
  69. data/rdoc.yml +0 -13
@@ -14,29 +14,28 @@ module Higgs::Test
14
14
  include Higgs
15
15
 
16
16
  # for ident(1)
17
- CVS_ID = '$Id: test_cache_mvcc.rb 742 2008-01-13 15:55:53Z toki $'
17
+ CVS_ID = '$Id: test_cache_mvcc.rb 781 2008-07-28 15:13:27Z toki $'
18
18
 
19
19
  NUM_OF_THREADS = 10
20
- WORK_COUNT = 10000
20
+ WORK_COUNT = 1000
21
21
 
22
22
  def setup
23
- srand(0) # prset for rand
23
+ srand(0) # prset for rand
24
24
  @cache = MVCCCache.new
25
25
  end
26
26
 
27
27
  def test_many_transaction
28
28
  assert(@cache.empty?)
29
29
 
30
- cnum_list = [ 2, 7, 13 ]
30
+ cnum_func = proc{ rand(100) }
31
31
  barrier = Higgs::Barrier.new(NUM_OF_THREADS + 1)
32
- th_grp = ThreadGroup.new
32
+ th_list = []
33
33
 
34
34
  NUM_OF_THREADS.times{|i|
35
- th_grp.add Thread.new{
35
+ th_list << Thread.new{
36
36
  barrier.wait
37
37
  WORK_COUNT.times do
38
- cnum = cnum_list[rand(cnum_list.size)]
39
- @cache.transaction(cnum) {
38
+ @cache.transaction(cnum_func) {
40
39
  assert(! @cache.empty?, "#thread: {i}th")
41
40
  }
42
41
  end
@@ -44,7 +43,7 @@ module Higgs::Test
44
43
  }
45
44
 
46
45
  barrier.wait
47
- for t in th_grp.list
46
+ for t in th_list
48
47
  t.join
49
48
  end
50
49
 
@@ -55,20 +54,20 @@ module Higgs::Test
55
54
 
56
55
  class RunFlag
57
56
  def initialize(running)
58
- #@lock = Mutex.new
57
+ @lock = Mutex.new
59
58
  @running = running
60
59
  end
61
60
 
62
61
  def running=(running)
63
- #@lock.synchronize{
64
- @running = running
65
- #}
62
+ @lock.synchronize{
63
+ @running = running
64
+ }
66
65
  end
67
66
 
68
67
  def running?
69
- #@lock.synchronize{
70
- @running
71
- #}
68
+ @lock.synchronize{
69
+ @running
70
+ }
72
71
  end
73
72
  end
74
73
 
@@ -91,11 +90,18 @@ module Higgs::Test
91
90
  store = {}
92
91
  do_read = RunFlag.new(true)
93
92
 
93
+ cnum = 0
94
+ cnum_func = proc{
95
+ last_cnum = cnum
96
+ cnum += 1
97
+ last_cnum
98
+ }
99
+
94
100
  # change number: 0
95
101
  init_read_latch = Latch.new
96
102
  init_read_count = Count.new
97
103
  init_read_thread = Thread.new{
98
- @cache.transaction(0) {|snapshot|
104
+ @cache.transaction(cnum_func) {|snapshot|
99
105
  while (do_read.running?)
100
106
  p [ 0, snapshot ] if $DEBUG
101
107
  assert_equal([], snapshot.keys(store))
@@ -116,7 +122,7 @@ module Higgs::Test
116
122
  insert_read_latch = Latch.new
117
123
  insert_read_count = Count.new
118
124
  insert_read_thread = Thread.new{
119
- @cache.transaction(1) {|snapshot|
125
+ @cache.transaction(cnum_func) {|snapshot|
120
126
  while (do_read.running?)
121
127
  p [ 1, snapshot ] if $DEBUG
122
128
  assert_equal([ :foo ], snapshot.keys(store))
@@ -137,7 +143,7 @@ module Higgs::Test
137
143
  update_read_latch = Latch.new
138
144
  update_read_count = Count.new
139
145
  update_read_thread = Thread.new{
140
- @cache.transaction(2) {|snapshot|
146
+ @cache.transaction(cnum_func) {|snapshot|
141
147
  while (do_read.running?)
142
148
  p [ 2, snapshot ] if $DEBUG
143
149
  assert_equal([ :foo ], snapshot.keys(store))
@@ -158,7 +164,7 @@ module Higgs::Test
158
164
  delete_read_latch = Latch.new
159
165
  delete_read_count = Count.new
160
166
  delete_read_thread = Thread.new{
161
- @cache.transaction(3) {|snapshot|
167
+ @cache.transaction(cnum_func) {|snapshot|
162
168
  while (do_read.running?)
163
169
  p [ 3, snapshot ] if $DEBUG
164
170
  assert_equal([], snapshot.keys(store))
@@ -197,13 +203,236 @@ module Higgs::Test
197
203
  end
198
204
  end
199
205
 
206
+ class MVCCCacheWithHashTest < Test::Unit::TestCase
207
+ include Higgs
208
+
209
+ # for ident(1)
210
+ CVS_ID = '$Id: test_cache_mvcc.rb 781 2008-07-28 15:13:27Z toki $'
211
+
212
+ def setup
213
+ srand(0) # preset for rand
214
+ @cache = MVCCCache.new
215
+
216
+ @st = {}
217
+ class << @st
218
+ include Higgs::Synchronized
219
+ synchronized :[], :[]=, :delete
220
+ synchronized :key?, :keys, :each_key
221
+ end
222
+ @st.__lock__ = Mutex.new
223
+
224
+ @cnum = 0
225
+ @cn_lock = Mutex.new
226
+ @cnum_func = proc{
227
+ @cn_lock.synchronize{ @cnum }
228
+ }
229
+ end
230
+
231
+ def update_cnum
232
+ @cn_lock.synchronize{
233
+ @cnum += 1
234
+ }
235
+ end
236
+ private :update_cnum
237
+
238
+ class RunFlag
239
+ def initialize(running)
240
+ @lock = Mutex.new
241
+ @running = running
242
+ end
243
+
244
+ def running=(running)
245
+ @lock.synchronize{
246
+ @running = running
247
+ }
248
+ end
249
+
250
+ def running?
251
+ @lock.synchronize{
252
+ @running
253
+ }
254
+ end
255
+ end
256
+
257
+ NUM_OF_READ_THREADS = 10
258
+ NUM_OF_DATA_CHUNK = 100
259
+ HEAT_RUN_TIME = 60
260
+ STORAGE_ITEMS = 1000
261
+ MAX_ITEM_BYTES = 1024*5
262
+ ITEM_CHARS = ('A'..'Z').to_a + ('a'..'z').to_a
263
+
264
+ def update_storage
265
+ NUM_OF_DATA_CHUNK.times do
266
+ write_list = []
267
+ ope = [ :write, :delete ][rand(2)]
268
+ key = rand(STORAGE_ITEMS)
269
+ case (ope)
270
+ when :write
271
+ value = rand(256).chr * rand(MAX_ITEM_BYTES)
272
+ write_list << [ ope, key, value ]
273
+ when :delete
274
+ next unless (@st.key? key)
275
+ write_list << [ ope, key ]
276
+ else
277
+ raise "unknown operation: #{ope}"
278
+ end
279
+
280
+ if (block_given?) then
281
+ old_values = []
282
+ for ope, key, value in write_list
283
+ case (ope)
284
+ when :write
285
+ if (@st.key? key) then
286
+ old_values << [ :value, key, :data, @st[key] ]
287
+ else
288
+ old_values << [ :none, key ]
289
+ end
290
+ when :delete
291
+ if (@st.key? key) then
292
+ old_values << [ :value, key, :data, @st[key] ]
293
+ end
294
+ end
295
+ end
296
+ yield(old_values)
297
+ end
298
+
299
+ for ope, key, value in write_list
300
+ case (ope)
301
+ when :write
302
+ @st[key] = value
303
+ when :delete
304
+ @st.delete(key)
305
+ else
306
+ raise "unknown operation: #{ope}"
307
+ end
308
+ end
309
+ end
310
+ end
311
+ private :update_storage
312
+
313
+ def test_mvcc_random_write
314
+ do_read = RunFlag.new(true)
315
+ update_storage{ @cnum_func.call }
316
+
317
+ init_cnum = @cnum_func.call
318
+ init_cnum_func = proc{ init_cnum }
319
+ init_keys = @st.keys.sort
320
+ init_values = {}
321
+ for key in init_keys
322
+ init_values[key] = @st[key]
323
+ end
324
+
325
+ th_read_list = []
326
+ read_start_latch = CountDownLatch.new(NUM_OF_READ_THREADS)
327
+ NUM_OF_READ_THREADS.times{|i| # `i' should be local scope of thread block
328
+ th_read_list << Thread.new{
329
+ @cache.transaction(init_cnum_func) {|snapshot|
330
+ read_start_latch.count_down
331
+
332
+ while (do_read.running?)
333
+ assert_equal(init_keys, snapshot.keys(@st).sort, "keys at thread:#{i}")
334
+ STORAGE_ITEMS.times do |k|
335
+ assert_equal((init_values.key? k),
336
+ (snapshot.key? @st, k), "thread: #{i}, key: #{k}")
337
+ assert_equal(init_values[k],
338
+ snapshot.fetch(k, :data) { @st[k] }, "thread: #{i}, key: #{k}")
339
+ end
340
+ end
341
+ }
342
+ }
343
+ }
344
+ read_start_latch.wait
345
+
346
+ t0 = Time.now
347
+ while (Time.now - t0 < HEAT_RUN_TIME)
348
+ update_storage{|write_list|
349
+ update_cnum
350
+ @cache.write_old_values(@cnum_func.call, write_list)
351
+ }
352
+ end
353
+
354
+ sleep(HEAT_RUN_TIME)
355
+ do_read.running = false
356
+ for t in th_read_list
357
+ t.join
358
+ end
359
+ end
360
+
361
+ WORK_COUNT = 100
362
+ NUM_OF_READ_WRITE_THREADS = 10
363
+
364
+ def test_mvcc_frequency_update
365
+ do_read = RunFlag.new(true)
366
+ write_lock = Mutex.new
367
+
368
+ th_read_list = []
369
+ read_start_latch = CountDownLatch.new(NUM_OF_READ_WRITE_THREADS)
370
+ NUM_OF_READ_WRITE_THREADS.times{|i| # `i' should be local scope of thread block
371
+ th_read_list << Thread.new{
372
+ read_start_latch.count_down
373
+
374
+ while (do_read.running?)
375
+ @cache.transaction(@cnum_func) {|snapshot|
376
+ if (snapshot.change_number > 0) then
377
+ assert_equal(snapshot.change_number.to_s,
378
+ snapshot.fetch(:foo, :data) { @st[:foo] }, "thread: #{i}")
379
+ else
380
+ assert_nil(snapshot.fetch(:foo, :data) { @st[:foo] }, "thread: #{i}")
381
+ end
382
+ }
383
+ end
384
+ }
385
+ }
386
+ read_start_latch.wait
387
+
388
+ th_write_list = []
389
+ write_start_latch = CountDownLatch.new(NUM_OF_READ_WRITE_THREADS)
390
+ NUM_OF_READ_WRITE_THREADS.times{|i| # `i' should be local scope of thread block
391
+ th_write_list << Thread.new{
392
+ write_start_latch.count_down
393
+
394
+ WORK_COUNT.times do |j|
395
+ write_lock.synchronize{
396
+ @cache.transaction(@cnum_func) {|snapshot|
397
+ value = snapshot.fetch(:foo, :data) { @st[:foo] }
398
+ if (snapshot.change_number > 0) then
399
+ assert_equal(snapshot.change_number.to_s, value, "thread: #{i}-#{j}")
400
+ else
401
+ assert_nil(value, "thread: #{i}-#{j}")
402
+ end
403
+
404
+ next_value = (value || '0').succ
405
+
406
+ snapshot.write_old_values([ [ :value, :foo, :data, value ] ])
407
+ @st[:foo] = next_value
408
+ update_cnum
409
+ }
410
+ }
411
+ end
412
+ }
413
+ }
414
+ write_start_latch.wait
415
+
416
+ for t in th_write_list
417
+ t.join
418
+ end
419
+
420
+ do_read.running = false
421
+ for t in th_read_list
422
+ t.join
423
+ end
424
+
425
+ assert_equal((NUM_OF_READ_WRITE_THREADS * WORK_COUNT).to_s, @st[:foo])
426
+ end
427
+ end
428
+
200
429
  class MVCCCacheWithStorageTest < Test::Unit::TestCase
201
430
  include Higgs
202
431
 
203
432
  # for ident(1)
204
- CVS_ID = '$Id: test_cache_mvcc.rb 742 2008-01-13 15:55:53Z toki $'
433
+ CVS_ID = '$Id: test_cache_mvcc.rb 781 2008-07-28 15:13:27Z toki $'
205
434
 
206
- def setup # preset for rand
435
+ def setup # preset for rand
207
436
  srand(0)
208
437
  @cache = MVCCCache.new
209
438
 
@@ -212,9 +441,9 @@ module Higgs::Test
212
441
  FileUtils.mkdir_p(@test_dir)
213
442
  @name = File.join(@test_dir, 'foo')
214
443
  @logger = proc{|path|
215
- logger = Logger.new(path, 1)
216
- logger.level = Logger::DEBUG
217
- logger
444
+ logger = Logger.new(path, 1)
445
+ logger.level = Logger::DEBUG
446
+ logger
218
447
  }
219
448
  @st = Storage.new(@name, :logger => @logger)
220
449
  end
@@ -226,20 +455,20 @@ module Higgs::Test
226
455
 
227
456
  class RunFlag
228
457
  def initialize(running)
229
- #@lock = Mutex.new
458
+ @lock = Mutex.new
230
459
  @running = running
231
460
  end
232
461
 
233
462
  def running=(running)
234
- #@lock.synchronize{
235
- @running = running
236
- #}
463
+ @lock.synchronize{
464
+ @running = running
465
+ }
237
466
  end
238
467
 
239
468
  def running?
240
- #@lock.synchronize{
241
- @running
242
- #}
469
+ @lock.synchronize{
470
+ @running
471
+ }
243
472
  end
244
473
  end
245
474
 
@@ -252,65 +481,65 @@ module Higgs::Test
252
481
 
253
482
  def update_storage
254
483
  NUM_OF_DATA_CHUNK.times do
255
- write_list = []
256
- ope = [ :write, :system_properties, :custom_properties, :delete ][rand(4)]
257
- key = rand(STORAGE_ITEMS)
258
- case (ope)
259
- when :write
260
- value = rand(256).chr * rand(MAX_ITEM_BYTES)
261
- write_list << [ ope, key, value ]
262
- when :system_properties
263
- next unless (@st.key? key)
264
- write_list << [ ope, key, { 'string_only' => [ true, false ][rand(2)] } ]
265
- when :custom_properties
266
- next unless (@st.key? key)
267
- value = ITEM_CHARS[rand(ITEM_CHARS.length)] * rand(MAX_ITEM_BYTES)
268
- write_list << [ ope, key, { 'foo' => value } ]
269
- when :delete
270
- next unless (@st.key? key)
271
- write_list << [ ope, key ]
272
- else
273
- raise "unknown operation: #{ope}"
274
- end
275
-
276
- if (block_given?) then
277
- old_values = []
278
- for ope, key, value in write_list
279
- case (ope)
280
- when :write
281
- if (@st.key? key) then
282
- properties = Marshal.load(Marshal.dump(@st.fetch_properties(key)))
283
- old_values << [ :value, key, :data, @st.fetch(key) ]
284
- old_values << [ :value, key, :properties, properties ]
285
- old_values << [ :value, key, :data_change_number, @st.data_change_number(key) ]
286
- old_values << [ :value, key, :properties_change_number, @st.properties_change_number(key) ]
287
- old_values << [ :value, key, :unique_data_id, @st.unique_data_id(key) ]
288
- else
289
- old_values << [ :none, key ]
290
- end
291
- when :system_properties, :custom_properties
292
- if (@st.key? key) then
293
- properties = Marshal.load(Marshal.dump(@st.fetch_properties(key)))
294
- old_values << [ :value, key, :properties, properties ]
295
- old_values << [ :value, key, :properties_change_number, @st.properties_change_number(key) ]
296
- else
297
- old_values << [ :none, key ]
298
- end
299
- when :delete
300
- if (@st.key? key) then
301
- properties = Marshal.load(Marshal.dump(@st.fetch_properties(key)))
302
- old_values << [ :value, key, :data, @st.fetch(key) ]
303
- old_values << [ :value, key, :properties, properties ]
304
- old_values << [ :value, key, :data_change_number, @st.data_change_number(key) ]
305
- old_values << [ :value, key, :properties_change_number, @st.properties_change_number(key) ]
306
- old_values << [ :value, key, :unique_data_id, @st.unique_data_id(key) ]
307
- end
308
- end
309
- end
310
- yield(@st.change_number, old_values)
311
- end
312
-
313
- @st.write_and_commit(write_list)
484
+ write_list = []
485
+ ope = [ :write, :system_properties, :custom_properties, :delete ][rand(4)]
486
+ key = rand(STORAGE_ITEMS)
487
+ case (ope)
488
+ when :write
489
+ value = rand(256).chr * rand(MAX_ITEM_BYTES)
490
+ write_list << [ ope, key, value ]
491
+ when :system_properties
492
+ next unless (@st.key? key)
493
+ write_list << [ ope, key, { 'string_only' => [ true, false ][rand(2)] } ]
494
+ when :custom_properties
495
+ next unless (@st.key? key)
496
+ value = ITEM_CHARS[rand(ITEM_CHARS.length)] * rand(MAX_ITEM_BYTES)
497
+ write_list << [ ope, key, { 'foo' => value } ]
498
+ when :delete
499
+ next unless (@st.key? key)
500
+ write_list << [ ope, key ]
501
+ else
502
+ raise "unknown operation: #{ope}"
503
+ end
504
+
505
+ if (block_given?) then
506
+ old_values = []
507
+ for ope, key, value in write_list
508
+ case (ope)
509
+ when :write
510
+ if (@st.key? key) then
511
+ properties = Marshal.load(Marshal.dump(@st.fetch_properties(key)))
512
+ old_values << [ :value, key, :data, @st.fetch(key) ]
513
+ old_values << [ :value, key, :properties, properties ]
514
+ old_values << [ :value, key, :data_change_number, @st.data_change_number(key) ]
515
+ old_values << [ :value, key, :properties_change_number, @st.properties_change_number(key) ]
516
+ old_values << [ :value, key, :unique_data_id, @st.unique_data_id(key) ]
517
+ else
518
+ old_values << [ :none, key ]
519
+ end
520
+ when :system_properties, :custom_properties
521
+ if (@st.key? key) then
522
+ properties = Marshal.load(Marshal.dump(@st.fetch_properties(key)))
523
+ old_values << [ :value, key, :properties, properties ]
524
+ old_values << [ :value, key, :properties_change_number, @st.properties_change_number(key) ]
525
+ else
526
+ old_values << [ :none, key ]
527
+ end
528
+ when :delete
529
+ if (@st.key? key) then
530
+ properties = Marshal.load(Marshal.dump(@st.fetch_properties(key)))
531
+ old_values << [ :value, key, :data, @st.fetch(key) ]
532
+ old_values << [ :value, key, :properties, properties ]
533
+ old_values << [ :value, key, :data_change_number, @st.data_change_number(key) ]
534
+ old_values << [ :value, key, :properties_change_number, @st.properties_change_number(key) ]
535
+ old_values << [ :value, key, :unique_data_id, @st.unique_data_id(key) ]
536
+ end
537
+ end
538
+ end
539
+ yield(@st.change_number, old_values)
540
+ end
541
+
542
+ @st.write_and_commit(write_list)
314
543
  end
315
544
  end
316
545
  private :update_storage
@@ -320,58 +549,59 @@ module Higgs::Test
320
549
  update_storage
321
550
 
322
551
  init_cnum = @st.change_number
552
+ init_cnum_func = proc{ init_cnum }
323
553
  init_keys = @st.keys.sort
324
554
  init_values = {}
325
555
  for key in init_keys
326
- init_values[key] = {
327
- :data => @st.fetch(key),
328
- :properties => Marshal.load(Marshal.dump(@st.fetch_properties(key))),
329
- :data_change_number => @st.data_change_number(key),
330
- :properties_change_number => @st.properties_change_number(key),
331
- :unique_data_id => @st.unique_data_id(key)
332
- }
556
+ init_values[key] = {
557
+ :data => @st.fetch(key),
558
+ :properties => Marshal.load(Marshal.dump(@st.fetch_properties(key))),
559
+ :data_change_number => @st.data_change_number(key),
560
+ :properties_change_number => @st.properties_change_number(key),
561
+ :unique_data_id => @st.unique_data_id(key)
562
+ }
333
563
  end
334
564
 
335
- th_read_grp = ThreadGroup.new
565
+ th_read_list = []
336
566
  read_start_latch = CountDownLatch.new(NUM_OF_READ_THREADS)
337
567
  NUM_OF_READ_THREADS.times{|i| # `i' should be local scope of thread block
338
- th_read_grp.add Thread.new{
339
- @cache.transaction(init_cnum) {|snapshot|
340
- read_start_latch.count_down
341
-
342
- while (do_read.running?)
343
- assert_equal(init_keys, snapshot.keys(@st).sort, "keys at thread:#{i}")
344
- STORAGE_ITEMS.times do |k|
345
- assert_equal((init_values.key? k),
346
- (snapshot.key? @st, k), "thread: #{i}, key: #{k}")
347
- assert_equal(init_values[k] && init_values[k][:data],
348
- snapshot.fetch(k, :data) { @st.fetch(k) }, "thread: #{i}, key: #{k}")
349
- assert_equal(init_values[k] && init_values[k][:properties],
350
- snapshot.fetch(k, :properties) { @st.fetch_properties(k) }, "thread: #{i}, key: #{k}")
351
- assert_equal(init_values[k] && init_values[k][:data_change_number],
352
- snapshot.fetch(k, :data_change_number) { @st.data_change_number(k) }, "thread: #{i}, key: #{k}")
353
- assert_equal(init_values[k] && init_values[k][:properties_change_number],
354
- snapshot.fetch(k, :properties_change_number) { @st.properties_change_number(k) }, "thread: #{i}, key: #{k}")
355
- assert_equal(init_values[k] && init_values[k][:unique_data_id],
356
- snapshot.fetch(k, :unique_data_id) { @st.unique_data_id(k) }, "thread: #{i}, key: #{k}")
357
- end
358
- end
359
- }
360
- }
568
+ th_read_list << Thread.new{
569
+ @cache.transaction(init_cnum_func) {|snapshot|
570
+ read_start_latch.count_down
571
+
572
+ while (do_read.running?)
573
+ assert_equal(init_keys, snapshot.keys(@st).sort, "keys at thread:#{i}")
574
+ STORAGE_ITEMS.times do |k|
575
+ assert_equal((init_values.key? k),
576
+ (snapshot.key? @st, k), "thread: #{i}, key: #{k}")
577
+ assert_equal(init_values[k] && init_values[k][:data],
578
+ snapshot.fetch(k, :data) { @st.fetch(k) }, "thread: #{i}, key: #{k}")
579
+ assert_equal(init_values[k] && init_values[k][:properties],
580
+ snapshot.fetch(k, :properties) { @st.fetch_properties(k) }, "thread: #{i}, key: #{k}")
581
+ assert_equal(init_values[k] && init_values[k][:data_change_number],
582
+ snapshot.fetch(k, :data_change_number) { @st.data_change_number(k) }, "thread: #{i}, key: #{k}")
583
+ assert_equal(init_values[k] && init_values[k][:properties_change_number],
584
+ snapshot.fetch(k, :properties_change_number) { @st.properties_change_number(k) }, "thread: #{i}, key: #{k}")
585
+ assert_equal(init_values[k] && init_values[k][:unique_data_id],
586
+ snapshot.fetch(k, :unique_data_id) { @st.unique_data_id(k) }, "thread: #{i}, key: #{k}")
587
+ end
588
+ end
589
+ }
590
+ }
361
591
  }
362
592
  read_start_latch.wait
363
593
 
364
594
  t0 = Time.now
365
595
  while (Time.now - t0 < HEAT_RUN_TIME)
366
- update_storage{|cnum, write_list|
367
- @cache.write_old_values(cnum, write_list)
368
- }
596
+ update_storage{|cnum, write_list|
597
+ @cache.write_old_values(cnum, write_list)
598
+ }
369
599
  end
370
600
 
371
601
  sleep(HEAT_RUN_TIME)
372
602
  do_read.running = false
373
- for t in th_read_grp.list
374
- t.join
603
+ for t in th_read_list
604
+ t.join
375
605
  end
376
606
  end
377
607
 
@@ -382,63 +612,68 @@ module Higgs::Test
382
612
  do_read = RunFlag.new(true)
383
613
  write_lock = Mutex.new
384
614
 
385
- th_read_grp = ThreadGroup.new
615
+ th_read_list = []
386
616
  read_start_latch = CountDownLatch.new(NUM_OF_READ_WRITE_THREADS)
387
617
  NUM_OF_READ_WRITE_THREADS.times{|i| # `i' should be local scope of thread block
388
- th_read_grp.add Thread.new{
389
- read_start_latch.count_down
390
-
391
- while (do_read.running?)
392
- @cache.transaction(@st.change_number) {|snapshot|
393
- if (snapshot.change_number > 0) then
394
- assert_equal(snapshot.change_number.to_s,
395
- snapshot.fetch(:foo, :data) { @st.fetch(:foo) }, "thread: #{i}")
396
- else
397
- assert_nil(snapshot.fetch(:foo, :data) { @st.fetch(:foo) }, "thread: #{i}")
398
- end
399
- }
400
- end
401
- }
618
+ th_read_list << Thread.new{
619
+ read_start_latch.count_down
620
+
621
+ while (do_read.running?)
622
+ @cache.transaction(@st.method(:change_number)) {|snapshot|
623
+ if (snapshot.change_number > 0) then
624
+ assert_equal(snapshot.change_number.to_s,
625
+ snapshot.fetch(:foo, :data) { @st.fetch(:foo) }, "thread: #{i}")
626
+ else
627
+ assert_nil(snapshot.fetch(:foo, :data) { @st.fetch(:foo) }, "thread: #{i}")
628
+ end
629
+ }
630
+ end
631
+ }
402
632
  }
403
633
  read_start_latch.wait
404
634
 
405
- th_write_grp = ThreadGroup.new
635
+ th_write_list = []
406
636
  write_start_latch = CountDownLatch.new(NUM_OF_READ_WRITE_THREADS)
407
637
  NUM_OF_READ_WRITE_THREADS.times{|i| # `i' should be local scope of thread block
408
- th_write_grp.add Thread.new{
409
- write_start_latch.count_down
410
-
411
- WORK_COUNT.times do |j|
412
- write_lock.synchronize{
413
- @cache.transaction(@st.change_number) {|snapshot|
414
- value = snapshot.fetch(:foo, :data) { @st.fetch(:foo) }
415
- if (snapshot.change_number > 0) then
416
- assert_equal(snapshot.change_number.to_s, value, "thread: #{i}-#{j}")
417
- else
418
- assert_nil(value, "thread: #{i}-#{j}")
419
- end
420
-
421
- next_value = (value || '0').succ
422
-
423
- snapshot.write_old_values([ [ :value, :foo, :data, value ] ])
424
- @st.write_and_commit([ [ :write, :foo, next_value ] ])
425
- }
426
- }
427
- end
428
- }
638
+ th_write_list << Thread.new{
639
+ write_start_latch.count_down
640
+
641
+ WORK_COUNT.times do |j|
642
+ write_lock.synchronize{
643
+ @cache.transaction(@st.method(:change_number)) {|snapshot|
644
+ value = snapshot.fetch(:foo, :data) { @st.fetch(:foo) }
645
+ if (snapshot.change_number > 0) then
646
+ assert_equal(snapshot.change_number.to_s, value, "thread: #{i}-#{j}")
647
+ else
648
+ assert_nil(value, "thread: #{i}-#{j}")
649
+ end
650
+
651
+ next_value = (value || '0').succ
652
+
653
+ snapshot.write_old_values([ [ :value, :foo, :data, value ] ])
654
+ @st.write_and_commit([ [ :write, :foo, next_value ] ])
655
+ }
656
+ }
657
+ end
658
+ }
429
659
  }
430
660
  write_start_latch.wait
431
661
 
432
- for t in th_write_grp.list
433
- t.join
662
+ for t in th_write_list
663
+ t.join
434
664
  end
435
665
 
436
666
  do_read.running = false
437
- for t in th_read_grp.list
438
- t.join
667
+ for t in th_read_list
668
+ t.join
439
669
  end
440
670
 
441
671
  assert_equal((NUM_OF_READ_WRITE_THREADS * WORK_COUNT).to_s, @st.fetch(:foo))
442
672
  end
443
673
  end
444
674
  end
675
+
676
+ # Local Variables:
677
+ # mode: Ruby
678
+ # indent-tabs-mode: nil
679
+ # End: