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

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 1996, 1997, 1998, 1999, 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: test042.tcl,v 11.24 2000/08/25 14:21:56 sue Exp $
  7. #
  8. # DB Test 42 {access method}
  9. #
  10. # Multiprocess DB test; verify that locking is working for the concurrent
  11. # access method product.
  12. #
  13. # Use the first "nentries" words from the dictionary.  Insert each with self
  14. # as key and a fixed, medium length data string.  Then fire off multiple
  15. # processes that bang on the database.  Each one should try to read and write
  16. # random keys.  When they rewrite, they'll append their pid to the data string
  17. # (sometimes doing a rewrite sometimes doing a partial put).  Some will use
  18. # cursors to traverse through a few keys before finding one to write.
  19. set datastr abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyz
  20. proc test042 { method {nentries 1000} args } {
  21. global datastr
  22. source ./include.tcl
  23. #
  24. # If we are using an env, then skip this test.  It needs its own.
  25. set eindex [lsearch -exact $args "-env"]
  26. if { $eindex != -1 } {
  27. incr eindex
  28. set env [lindex $args $eindex]
  29. puts "Test042 skipping for env $env"
  30. return
  31. }
  32. set args [convert_args $method $args]
  33. set omethod [convert_method $method]
  34. puts "Test042: CDB Test $method $nentries"
  35. # Set initial parameters
  36. set do_exit 0
  37. set iter 10000
  38. set procs 5
  39. # Process arguments
  40. set oargs ""
  41. for { set i 0 } { $i < [llength $args] } {incr i} {
  42. switch -regexp -- [lindex $args $i] {
  43. -dir { incr i; set testdir [lindex $args $i] }
  44. -iter { incr i; set iter [lindex $args $i] }
  45. -procs { incr i; set procs [lindex $args $i] }
  46. -exit { set do_exit 1 }
  47. default { append oargs " " [lindex $args $i] }
  48. }
  49. }
  50. # Create the database and open the dictionary
  51. set testfile test042.db
  52. set t1 $testdir/t1
  53. set t2 $testdir/t2
  54. set t3 $testdir/t3
  55. env_cleanup $testdir
  56. set env [berkdb env -create -cdb -home $testdir]
  57. error_check_good dbenv [is_valid_widget $env env] TRUE
  58. set db [eval {berkdb_open -env $env -create -truncate 
  59.     -mode 0644 $omethod} $oargs {$testfile}]
  60. error_check_good dbopen [is_valid_widget $db db] TRUE
  61. set did [open $dict]
  62. set pflags ""
  63. set gflags ""
  64. set txn ""
  65. set count 0
  66. # Here is the loop where we put each key/data pair
  67. puts "tTest042.a: put/get loop"
  68. while { [gets $did str] != -1 && $count < $nentries } {
  69. if { [is_record_based $method] == 1 } {
  70. set key [expr $count + 1]
  71. } else {
  72. set key $str
  73. }
  74. set ret [eval {$db put} 
  75.     $txn $pflags {$key [chop_data $method $datastr]}]
  76. error_check_good put:$db $ret 0
  77. incr count
  78. }
  79. close $did
  80. error_check_good close:$db [$db close] 0
  81. # Database is created, now set up environment
  82. # Remove old mpools and Open/create the lock and mpool regions
  83. error_check_good env:close:$env [$env close] 0
  84. set ret [berkdb envremove -home $testdir]
  85. error_check_good env_remove $ret 0
  86. set env [berkdb env -create -cdb -home $testdir]
  87. error_check_good dbenv [is_valid_widget $env env] TRUE
  88. if { $do_exit == 1 } {
  89. return
  90. }
  91. # Now spawn off processes
  92. berkdb debug_check
  93. puts "tTest042.b: forking off $procs children"
  94. set pidlist {}
  95. for { set i 0 } {$i < $procs} {incr i} {
  96. puts "exec $tclsh_path $test_path/wrap.tcl 
  97.     mdbscript.tcl $testdir/test042.$i.log 
  98.     $method $testdir $testfile $nentries $iter $i $procs &"
  99. set p [exec $tclsh_path $test_path/wrap.tcl 
  100.     mdbscript.tcl $testdir/test042.$i.log $method 
  101.     $testdir $testfile $nentries $iter $i $procs &]
  102. lappend pidlist $p
  103. }
  104. puts "Test042: $procs independent processes now running"
  105. watch_procs
  106. # Check for test failure
  107. set e [eval findfail [glob $testdir/test042.*.log]]
  108. error_check_good "FAIL: error message(s) in log files" $e 0
  109. # Test is done, blow away lock and mpool region
  110. reset_env $env
  111. }
  112. # If we are renumbering, then each time we delete an item, the number of
  113. # items in the file is temporarily decreased, so the highest record numbers
  114. # do not exist.  To make sure this doesn't happen, we never generate the
  115. # highest few record numbers as keys.
  116. #
  117. # For record-based methods, record numbers begin at 1, while for other keys,
  118. # we begin at 0 to index into an array.
  119. proc rand_key { method nkeys renum procs} {
  120. if { $renum == 1 } {
  121. return [berkdb random_int 1 [expr $nkeys - $procs]]
  122. } elseif { [is_record_based $method] == 1 } {
  123. return [berkdb random_int 1 $nkeys]
  124. } else {
  125. return [berkdb random_int 0 [expr $nkeys - 1]]
  126. }
  127. }