sysscript.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: sysscript.tcl,v 11.12 2000/05/22 12:51:38 bostic Exp $
  7. #
  8. # System integration test script.
  9. # This script runs a single process that tests the full functionality of
  10. # the system.  The database under test contains nfiles files.  Each process
  11. # randomly generates a key and some data.  Both keys and data are bimodally
  12. # distributed between small keys (1-10 characters) and large keys (the avg
  13. # length is indicated via the command line parameter.
  14. # The process then decides on a replication factor between 1 and nfiles.
  15. # It writes the key and data to that many files and tacks on the file ids
  16. # of the files it writes to the data string.  For example, let's say that
  17. # I randomly generate the key dog and data cat.  Then I pick a replication
  18. # factor of 3.  I pick 3 files from the set of n (say 1, 3, and 5).  I then
  19. # rewrite the data as 1:3:5:cat.  I begin a transaction, add the key/data
  20. # pair to each file and then commit.  Notice that I may generate replication
  21. # of the form 1:3:3:cat in which case I simply add a duplicate to file 3.
  22. #
  23. # Usage: sysscript dir nfiles key_avg data_avg
  24. #
  25. # dir: DB_HOME directory
  26. # nfiles: number of files in the set
  27. # key_avg: average big key size
  28. # data_avg: average big data size
  29. source ./include.tcl
  30. source $test_path/test.tcl
  31. source $test_path/testutils.tcl
  32. set alphabet "abcdefghijklmnopqrstuvwxyz"
  33. set mypid [pid]
  34. set usage "sysscript dir nfiles key_avg data_avg method"
  35. # Verify usage
  36. if { $argc != 5 } {
  37. puts stderr "FAIL:[timestamp] Usage: $usage"
  38. exit
  39. }
  40. puts [concat "Argc: " $argc " Argv: " $argv]
  41. # Initialize arguments
  42. set dir [lindex $argv 0]
  43. set nfiles [ lindex $argv 1 ]
  44. set key_avg [ lindex $argv 2 ]
  45. set data_avg [ lindex $argv 3 ]
  46. set method [ lindex $argv 4 ]
  47. # Initialize seed
  48. global rand_init
  49. berkdb srand $rand_init
  50. puts "Beginning execution for $mypid"
  51. puts "$dir DB_HOME"
  52. puts "$nfiles files"
  53. puts "$key_avg average key length"
  54. puts "$data_avg average data length"
  55. flush stdout
  56. # Create local environment
  57. set dbenv [berkdb env -txn -home $dir]
  58. set err [catch {error_check_good $mypid:dbenv [is_substr $dbenv env] 1} ret]
  59. if {$err != 0} {
  60. puts $ret
  61. return
  62. }
  63. # Now open the files
  64. for { set i 0 } { $i < $nfiles } { incr i } {
  65. set file test044.$i.db
  66. set db($i) [berkdb open -env $dbenv $method $file]
  67. set err [catch {error_check_bad $mypid:dbopen $db($i) NULL} ret]
  68. if {$err != 0} {
  69. puts $ret
  70. return
  71. }
  72. set err [catch {error_check_bad $mypid:dbopen [is_substr $db($i) 
  73.     error] 1} ret]
  74. if {$err != 0} {
  75. puts $ret
  76. return
  77. }
  78. }
  79. set record_based [is_record_based $method]
  80. while { 1 } {
  81. # Decide if we're going to create a big key or a small key
  82. # We give small keys a 70% chance.
  83. if { [berkdb random_int 1 10] < 8 } {
  84. set k [random_data 5 0 0 $record_based]
  85. } else {
  86. set k [random_data $key_avg 0 0 $record_based]
  87. }
  88. set data [chop_data $method [random_data $data_avg 0 0]]
  89. set txn [$dbenv txn]
  90. set err [catch {error_check_good $mypid:txn_begin [is_substr $txn 
  91.     $dbenv.txn] 1} ret]
  92. if {$err != 0} {
  93. puts $ret
  94. return
  95. }
  96. # Open cursors
  97. for { set f 0 } {$f < $nfiles} {incr f} {
  98. set cursors($f) [$db($f) cursor -txn $txn]
  99. set err [catch {error_check_good $mypid:cursor_open 
  100.     [is_substr $cursors($f) $db($f)] 1} ret]
  101. if {$err != 0} {
  102. puts $ret
  103. return
  104. }
  105. }
  106. set aborted 0
  107. # Check to see if key is already in database
  108. set found 0
  109. for { set i 0 } { $i < $nfiles } { incr i } {
  110. set r [$db($i) get -txn $txn $k]
  111. set r [$db($i) get -txn $txn $k]
  112. if { $r == "-1" } {
  113. for {set f 0 } {$f < $nfiles} {incr f} {
  114. set err [catch {error_check_good 
  115.     $mypid:cursor_close 
  116.     [$cursors($f) close] 0} ret]
  117. if {$err != 0} {
  118. puts $ret
  119. return
  120. }
  121. }
  122. set err [catch {error_check_good $mypid:txn_abort 
  123.     [$txn abort] 0} ret]
  124. if {$err != 0} {
  125. puts $ret
  126. return
  127. }
  128. set aborted 1
  129. set found 2
  130. break
  131. } elseif { $r != "Key $k not found." } {
  132. set found 1
  133. break
  134. }
  135. }
  136. switch $found {
  137. 2 {
  138. # Transaction aborted, no need to do anything.
  139. }
  140. 0 {
  141. # Key was not found, decide how much to replicate
  142. # and then create a list of that many file IDs.
  143. set repl [berkdb random_int 1 $nfiles]
  144. set fset ""
  145. for { set i 0 } { $i < $repl } {incr i} {
  146. set f [berkdb random_int 0 [expr $nfiles - 1]]
  147. lappend fset $f
  148. set data [chop_data $method $f:$data]
  149. }
  150. foreach i $fset {
  151. set r [$db($i) put -txn $txn $k $data]
  152. if {$r == "-1"} {
  153. for {set f 0 } {$f < $nfiles} {incr f} {
  154. set err [catch {error_check_good 
  155.     $mypid:cursor_close 
  156.     [$cursors($f) close] 0} ret]
  157. if {$err != 0} {
  158. puts $ret
  159. return
  160. }
  161. }
  162. set err [catch {error_check_good 
  163.     $mypid:txn_abort [$txn abort] 0} ret]
  164. if {$err != 0} {
  165. puts $ret
  166. return
  167. }
  168. set aborted 1
  169. break
  170. }
  171. }
  172. }
  173. 1 {
  174. # Key was found.  Make sure that all the data values
  175. # look good.
  176. set f [zero_list $nfiles]
  177. set data $r
  178. while { [set ndx [string first : $r]] != -1 } {
  179. set fnum [string range $r 0 [expr $ndx - 1]]
  180. if { [lindex $f $fnum] == 0 } {
  181. #set flag -set
  182. set full [record $cursors($fnum) get -set $k]
  183. } else {
  184. #set flag -next
  185. set full [record $cursors($fnum) get -next]
  186. }
  187. if {[llength $full] == 0} {
  188. for {set f 0 } {$f < $nfiles} {incr f} {
  189. set err [catch {error_check_good 
  190.     $mypid:cursor_close 
  191.     [$cursors($f) close] 0} ret]
  192. if {$err != 0} {
  193. puts $ret
  194. return
  195. }
  196. }
  197. set err [catch {error_check_good 
  198.     $mypid:txn_abort [$txn abort] 0} ret]
  199. if {$err != 0} {
  200. puts $ret
  201. return
  202. }
  203. set aborted 1
  204. break
  205. }
  206. set err [catch {error_check_bad 
  207.     $mypid:curs_get($k,$data,$fnum,$flag) 
  208.     [string length $full] 0} ret]
  209. if {$err != 0} {
  210. puts $ret
  211. return
  212. }
  213. set key [lindex [lindex $full 0] 0]
  214. set rec [pad_data $method [lindex [lindex $full 0] 1]]
  215. set err [catch {error_check_good 
  216.     $mypid:dbget_$fnum:key $key $k} ret]
  217. if {$err != 0} {
  218. puts $ret
  219. return
  220. }
  221. set err [catch {error_check_good 
  222.     $mypid:dbget_$fnum:data($k) $rec $data} ret]
  223. if {$err != 0} {
  224. puts $ret
  225. return
  226. }
  227. set f [lreplace $f $fnum $fnum 1]
  228. incr ndx
  229. set r [string range $r $ndx end]
  230. }
  231. }
  232. }
  233. if { $aborted == 0 } {
  234. for {set f 0 } {$f < $nfiles} {incr f} {
  235. set err [catch {error_check_good $mypid:cursor_close 
  236.     [$cursors($f) close] 0} ret]
  237. if {$err != 0} {
  238. puts $ret
  239. return
  240. }
  241. }
  242. set err [catch {error_check_good $mypid:commit [$txn commit] 
  243.     0} ret]
  244. if {$err != 0} {
  245. puts $ret
  246. return
  247. }
  248. }
  249. }
  250. # Close files
  251. for { set i 0 } { $i < $nfiles} { incr i } {
  252. set r [$db($i) close]
  253. set err [catch {error_check_good $mypid:db_close:$i $r 0} ret]
  254. if {$err != 0} {
  255. puts $ret
  256. return
  257. }
  258. }
  259. # Close tm and environment
  260. $dbenv close
  261. puts "[timestamp] [pid] Complete"
  262. flush stdout
  263. filecheck $file 0