test070.tcl
上传用户:tsgydb
上传日期:2007-04-14
资源大小:10674k
文件大小:4k
源码类别:

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: test070.tcl,v 11.18 2000/12/18 20:04:47 sue Exp $
  7. #
  8. # DB Test 70: Test of DB_CONSUME.
  9. # Fork off six processes, four consumers and two producers.
  10. # The producers will each put 20000 records into a queue;
  11. # the consumers will each get 10000.
  12. # Then, verify that no record was lost or retrieved twice.
  13. proc test070 { method {nconsumers 4} {nproducers 2} 
  14.     {nitems 1000} {mode CONSUME } {start 0} {txn -txn} {tnum 70} args } {
  15. source ./include.tcl
  16. global alphabet
  17. #
  18. # If we are using an env, then skip this test.  It needs its own.
  19. set eindex [lsearch -exact $args "-env"]
  20. if { $eindex != -1 } {
  21. incr eindex
  22. set env [lindex $args $eindex]
  23. puts "Test0$tnum skipping for env $env"
  24. return
  25. }
  26. set omethod [convert_method $method]
  27. set args [convert_args $method $args]
  28. puts "Test0$tnum: $method ($args) Test of DB_$mode flag to DB->get."
  29. puts "tUsing $txn environment."
  30. error_check_good enough_consumers [expr $nconsumers > 0] 1
  31. error_check_good enough_producers [expr $nproducers > 0] 1
  32. if { [is_queue $method] != 1 } {
  33. puts "tSkipping Test0$tnum for method $method."
  34. return
  35. }
  36. env_cleanup $testdir
  37. set testfile test0$tnum.db
  38. # Create environment
  39. set dbenv [eval {berkdb env -create $txn -home } $testdir]
  40. error_check_good dbenv_create [is_valid_env $dbenv] TRUE
  41. # Create database
  42. set db [eval {berkdb_open -create -mode 0644 -queue}
  43. -env $dbenv $args $testfile]
  44. error_check_good db_open [is_valid_db $db] TRUE
  45. if { $start != 0 } {
  46. error_check_good set_seed [$db put $start "consumer data"] 0
  47. puts "tStarting at $start."
  48. } else {
  49. incr start
  50. }
  51. set pidlist {}
  52. # Divvy up the total number of records amongst the consumers and
  53. # producers.
  54. error_check_good cons_div_evenly [expr $nitems % $nconsumers] 0
  55. error_check_good prod_div_evenly [expr $nitems % $nproducers] 0
  56. set nperconsumer [expr $nitems / $nconsumers]
  57. set nperproducer [expr $nitems / $nproducers]
  58. set consumerlog $testdir/CONSUMERLOG.
  59. # Fork consumer processes (we want them to be hungry)
  60. for { set ndx 0 } { $ndx < $nconsumers } { incr ndx } {
  61. set output $consumerlog$ndx
  62. set p [exec $tclsh_path $test_path/wrap.tcl 
  63.     conscript.tcl $testdir/conscript.log.consumer$ndx 
  64.     $testdir $testfile $mode $nperconsumer $output $tnum 
  65.     $args &]
  66. lappend pidlist $p
  67. }
  68. for { set ndx 0 } { $ndx < $nproducers } { incr ndx } {
  69. set p [exec $tclsh_path $test_path/wrap.tcl 
  70.     conscript.tcl $testdir/conscript.log.producer$ndx 
  71.     $testdir $testfile PRODUCE $nperproducer "" $tnum 
  72.     $args &]
  73. lappend pidlist $p
  74. }
  75. # Wait for all children.
  76. watch_procs 10
  77. # Verify: slurp all record numbers into list, sort, and make
  78. # sure each appears exactly once.
  79. puts "tTest0$tnum: Verifying results."
  80. set reclist {}
  81. for { set ndx 0 } { $ndx < $nconsumers } { incr ndx } {
  82. set input $consumerlog$ndx
  83. set iid [open $input r]
  84. while { [gets $iid str] != -1 } {
  85. lappend reclist $str
  86. }
  87. close $iid
  88. }
  89. set sortreclist [lsort -integer $reclist]
  90. set nitems [expr $start + $nitems]
  91. for { set ndx $start } { $ndx < $nitems } { incr ndx } {
  92. # Skip 0 if we are wrapping around
  93. if { $ndx == 0 } {
  94. incr ndx
  95. incr nitems
  96. }
  97. # Be sure to convert ndx to a number before comparing.
  98. error_check_good pop_num [lindex $sortreclist 0] [expr $ndx + 0]
  99. set sortreclist [lreplace $sortreclist 0 0]
  100. }
  101. error_check_good list_ends_empty $sortreclist {}
  102. error_check_good dbenv_close [$dbenv close] 0
  103. puts "tTest0$tnum completed successfully."
  104. }