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

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: test044.tcl,v 11.26 2000/10/27 13:23:56 sue Exp $
  7. #
  8. # DB Test 44 {access method}
  9. # System integration DB test: verify that locking, recovery, checkpoint,
  10. # and all the other utilities basically work.
  11. #
  12. # The test consists of $nprocs processes operating on $nfiles files.  A
  13. # transaction consists of adding the same key/data pair to some random
  14. # number of these files.  We generate a bimodal distribution in key
  15. # size with 70% of the keys being small (1-10 characters) and the
  16. # remaining 30% of the keys being large (uniform distribution about
  17. # mean $key_avg).  If we generate a key, we first check to make sure
  18. # that the key is not already in the dataset.  If it is, we do a lookup.
  19. #
  20. # XXX This test uses grow-only files currently!
  21. proc test044 { method {nprocs 5} {nfiles 10} {cont 0} args } {
  22. source ./include.tcl
  23. global rand_init
  24. set args [convert_args $method $args]
  25. set omethod [convert_method $method]
  26. berkdb srand $rand_init
  27. # If we are using an env, then skip this test.  It needs its own.
  28. set eindex [lsearch -exact $args "-env"]
  29. if { $eindex != -1 } {
  30. incr eindex
  31. set env [lindex $args $eindex]
  32. puts "Test044 skipping for env $env"
  33. return
  34. }
  35. puts "Test044: system integration test db $method $nprocs processes 
  36.     on $nfiles files"
  37. # Parse options
  38. set otherargs ""
  39. set key_avg 10
  40. set data_avg 20
  41. set do_exit 0
  42. for { set i 0 } { $i < [llength $args] } {incr i} {
  43. switch -regexp -- [lindex $args $i] {
  44. -key_avg { incr i; set key_avg [lindex $args $i] }
  45. -data_avg { incr i; set data_avg [lindex $args $i] }
  46. -testdir { incr i; set testdir [lindex $args $i] }
  47. -x.* { set do_exit 1 }
  48. default {
  49. lappend otherargs [lindex $args $i]
  50. }
  51. }
  52. }
  53. if { $cont == 0 } {
  54. # Create the database and open the dictionary
  55. env_cleanup $testdir
  56. # Create an environment
  57. puts "tTest044.a: creating environment and $nfiles files"
  58. set dbenv [berkdb env -create -txn -home $testdir]
  59. error_check_good env_open [is_valid_env $dbenv] TRUE
  60. # Create a bunch of files
  61. set m $method
  62. for { set i 0 } { $i < $nfiles } { incr i } {
  63. if { $method == "all" } {
  64. switch [berkdb random_int 1 2] {
  65. 1 { set m -btree }
  66. 2 { set m -hash }
  67. }
  68. } else {
  69. set m $omethod
  70. }
  71. set db [eval {berkdb_open -env $dbenv -create 
  72.     -mode 0644 $m} $otherargs {test044.$i.db}]
  73. error_check_good dbopen [is_valid_db $db] TRUE
  74. error_check_good db_close [$db close] 0
  75. }
  76. }
  77. # Close the environment
  78. $dbenv close
  79. if { $do_exit == 1 } {
  80. return
  81. }
  82. # Database is created, now fork off the kids.
  83. puts "tTest044.b: forking off $nprocs processes and utilities"
  84. set cycle 1
  85. set ncycles 3
  86. while { $cycle <= $ncycles } {
  87. set dbenv [berkdb env -create -txn -home $testdir]
  88. error_check_good env_open [is_valid_env $dbenv] TRUE
  89. # Fire off deadlock detector and checkpointer
  90. puts "Beginning cycle $cycle"
  91. set ddpid [exec $util_path/db_deadlock -h $testdir -t 5 &]
  92. set cppid [exec $util_path/db_checkpoint -h $testdir -p 2 &]
  93. puts "Deadlock detector: $ddpid Checkpoint daemon $cppid"
  94. set pidlist {}
  95. for { set i 0 } {$i < $nprocs} {incr i} {
  96. set p [exec $tclsh_path 
  97.     $test_path/sysscript.tcl $testdir 
  98.     $nfiles $key_avg $data_avg $omethod 
  99.     >& $testdir/test044.$i.log &]
  100. lappend pidlist $p
  101. }
  102. set sleep [berkdb random_int 300 600]
  103. puts 
  104. "[timestamp] $nprocs processes running $pidlist for $sleep seconds"
  105. tclsleep $sleep
  106. # Now simulate a crash
  107. puts "[timestamp] Crashing"
  108. #
  109. # The environment must remain open until this point to get
  110. # proper sharing (using the paging file) on Win/9X.  [#2342]
  111. #
  112. error_check_good env_close [$dbenv close] 0
  113. exec $KILL -9 $ddpid
  114. exec $KILL -9 $cppid
  115. #
  116. # Use catch so that if any of the children died, we don't
  117. # stop the script
  118. #
  119. foreach p $pidlist {
  120. set e [catch {eval exec 
  121.     [concat $KILL -9 $p]} res]
  122. }
  123. # Check for test failure
  124. set e [eval findfail [glob $testdir/test044.*.log]]
  125. error_check_good "FAIL: error message(s) in log files" $e 0
  126. # Now run recovery
  127. test044_verify $testdir $nfiles
  128. incr cycle
  129. }
  130. }
  131. proc test044_usage { } {
  132. puts -nonewline "test044 method nentries [-d directory] [-i iterations]"
  133. puts " [-p procs] -x"
  134. }
  135. proc test044_verify { dir nfiles } {
  136. source ./include.tcl
  137. # Save everything away in case something breaks
  138. # for { set f 0 } { $f < $nfiles } {incr f} {
  139. # file copy -force $dir/test044.$f.db $dir/test044.$f.save1
  140. # }
  141. # foreach f [glob $dir/log.*] {
  142. # if { [is_substr $f save] == 0 } {
  143. # file copy -force $f $f.save1
  144. # }
  145. # }
  146. # Run recovery and then read through all the database files to make
  147. # sure that they all look good.
  148. puts "tTest044.verify: Running recovery and verifying file contents"
  149. set stat [catch {exec $util_path/db_recover -h $dir} result]
  150. if { $stat == 1 } {
  151. error "FAIL: Recovery error: $result."
  152. }
  153. # Save everything away in case something breaks
  154. # for { set f 0 } { $f < $nfiles } {incr f} {
  155. # file copy -force $dir/test044.$f.db $dir/test044.$f.save2
  156. # }
  157. # foreach f [glob $dir/log.*] {
  158. # if { [is_substr $f save] == 0 } {
  159. # file copy -force $f $f.save2
  160. # }
  161. # }
  162. for { set f 0 } { $f < $nfiles } { incr f } {
  163. set db($f) [berkdb_open $dir/test044.$f.db]
  164. error_check_good $f:dbopen [is_valid_db $db($f)] TRUE
  165. set cursors($f) [$db($f) cursor]
  166. error_check_bad $f:cursor_open $cursors($f) NULL
  167. error_check_good 
  168.     $f:cursor_open [is_substr $cursors($f) $db($f)] 1
  169. }
  170. for { set f 0 } { $f < $nfiles } { incr f } {
  171. for {set d [$cursors($f) get -first] } 
  172.     { [string length $d] != 0 } 
  173.     { set d [$cursors($f) get -next] } {
  174. set k [lindex [lindex $d 0] 0]
  175. set d [lindex [lindex $d 0] 1]
  176. set flist [zero_list $nfiles]
  177. set r $d
  178. while { [set ndx [string first : $r]] != -1 } {
  179. set fnum [string range $r 0 [expr $ndx - 1]]
  180. if { [lindex $flist $fnum] == 0 } {
  181. set fl "-set"
  182. } else {
  183. set fl "-next"
  184. }
  185. if { $fl != "-set" || $fnum != $f } {
  186. if { [string compare $fl "-set"] == 0} {
  187. set full [$cursors($fnum) 
  188.     get -set $k]
  189. } else  {
  190. set full [$cursors($fnum) 
  191.     get -next]
  192. }
  193. set key [lindex [lindex $full 0] 0]
  194. set rec [lindex [lindex $full 0] 1]
  195. error_check_good 
  196.     $f:dbget_$fnum:key $key $k
  197. error_check_good 
  198.     $f:dbget_$fnum:data $rec $d
  199. }
  200. set flist [lreplace $flist $fnum $fnum 1]
  201. incr ndx
  202. set r [string range $r $ndx end]
  203. }
  204. }
  205. }
  206. for { set f 0 } { $f < $nfiles } { incr f } {
  207. error_check_good $cursors($f) [$cursors($f) close] 0
  208. error_check_good db_close:$f [$db($f) close] 0
  209. }
  210. }