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

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: recd010.tcl,v 1.14 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # Recovery Test 10.
  9. # Test stability of btree duplicates across btree off-page dup splits
  10. # and reverse splits and across recovery.
  11. proc recd010 { method {select 0} args} {
  12. global fixed_len
  13. global kvals
  14. global kvals_dups
  15. source ./include.tcl
  16. if { [is_dbtree $method] != 1 && [is_ddbtree $method] != 1} {
  17. puts "Recd010 skipping for method $method."
  18. return
  19. }
  20. set pgindex [lsearch -exact $args "-pagesize"]
  21. if { $pgindex != -1 } {
  22. puts "Recd010: skipping for specific pagesizes"
  23. return
  24. }
  25. set opts [convert_args $method $args]
  26. set method [convert_method $method]
  27. puts "tRecd010 ($opts): Test duplicates across splits and recovery"
  28. set testfile recd010.db
  29. env_cleanup $testdir
  30. #
  31. # Set pagesize small to generate lots of off-page dups
  32. #
  33. set page 512
  34. set mkeys 1000
  35. set firstkeys 5
  36. set data "data"
  37. set key "recd010_key"
  38. puts "tRecd010.a: Create $method environment and database."
  39. set flags "-create -txn -home $testdir"
  40. set env_cmd "berkdb env $flags"
  41. set dbenv [eval $env_cmd]
  42. error_check_good dbenv [is_valid_env $dbenv] TRUE
  43. set oflags "-env $dbenv -create -mode 0644 $opts $method"
  44. set db [eval {berkdb_open} -pagesize $page $oflags $testfile]
  45. error_check_good dbopen [is_valid_db $db] TRUE
  46. # Fill page with small key/data pairs.  Keep at leaf.
  47. puts "tRecd010.b: Fill page with $firstkeys small dups."
  48. for { set i 1 } { $i <= $firstkeys } { incr i } {
  49. set ret [$db put $key $data$i]
  50. error_check_good dbput $ret 0
  51. }
  52. set kvals 1
  53. set kvals_dups $firstkeys
  54. error_check_good db_close [$db close] 0
  55. error_check_good env_close [$dbenv close] 0
  56. # List of recovery tests: {CMD MSG} pairs.
  57. if { $mkeys < 100 } {
  58. puts "Recd010 mkeys of $mkeys too small"
  59. return
  60. }
  61. set rlist {
  62. { {recd010_split DB TXNID 1 $method 2 $mkeys}
  63.     "Recd010.c: btree split 2 large dups"}
  64. { {recd010_split DB TXNID 0 $method 2 $mkeys}
  65.     "Recd010.d: btree reverse split 2 large dups"}
  66. { {recd010_split DB TXNID 1 $method 10 $mkeys}
  67.     "Recd010.e: btree split 10 dups"}
  68. { {recd010_split DB TXNID 0 $method 10 $mkeys}
  69.     "Recd010.f: btree reverse split 10 dups"}
  70. { {recd010_split DB TXNID 1 $method 100 $mkeys}
  71.     "Recd010.g: btree split 100 dups"}
  72. { {recd010_split DB TXNID 0 $method 100 $mkeys}
  73.     "Recd010.h: btree reverse split 100 dups"}
  74. }
  75. foreach pair $rlist {
  76. set cmd [subst [lindex $pair 0]]
  77. set msg [lindex $pair 1]
  78. if { $select != 0 } {
  79. set tag [lindex $msg 0]
  80. set tail [expr [string length $tag] - 2]
  81. set tag [string range $tag $tail $tail]
  82. if { [lsearch $select $tag] == -1 } {
  83. continue
  84. }
  85. }
  86. set reverse [string first "reverse" $msg]
  87. op_recover abort $testdir $env_cmd $testfile $cmd $msg
  88. recd010_check $testdir $testfile $opts abort $reverse $firstkeys
  89. op_recover commit $testdir $env_cmd $testfile $cmd $msg
  90. recd010_check $testdir $testfile $opts commit $reverse $firstkeys
  91. }
  92. puts "tRecd010.e: Verify db_printlog can read logfile"
  93. set tmpfile $testdir/printlog.out
  94. set stat [catch {exec $util_path/db_printlog -h $testdir 
  95.     > $tmpfile} ret]
  96. error_check_good db_printlog $stat 0
  97. fileremove $tmpfile
  98. }
  99. #
  100. # This procedure verifies that the database has only numkeys number
  101. # of keys and that they are in order.
  102. #
  103. proc recd010_check { tdir testfile opts op reverse origdups } {
  104. global kvals
  105. global kvals_dups
  106. source ./include.tcl
  107. set db [eval {berkdb_open} $opts $tdir/$testfile]
  108. error_check_good dbopen [is_valid_db $db] TRUE
  109. set data "data"
  110. if { $reverse == -1 } {
  111. puts "tRecd010_check: Verify split after $op"
  112. } else {
  113. puts "tRecd010_check: Verify reverse split after $op"
  114. }
  115. set stat [$db stat]
  116. if { [expr ([string compare $op "abort"] == 0 && $reverse == -1) || 
  117.    ([string compare $op "commit"] == 0 && $reverse != -1)]} {
  118. set numkeys 0
  119. set allkeys [expr $numkeys + 1]
  120. set numdups $origdups
  121. #
  122. # If we abort the adding of dups, or commit
  123. # the removal of dups, either way check that
  124. # we are back at the beginning.  Check that:
  125. # - We have 0 internal pages.
  126. # - We have only 1 key (the original we primed the db
  127. # with at the beginning of the test).
  128. # - We have only the original number of dups we primed
  129. # the db with at the beginning of the test.
  130. #
  131. error_check_good stat:orig0 [is_substr $stat 
  132. "{{Internal pages} 0}"] 1
  133. error_check_good stat:orig1 [is_substr $stat 
  134. "{{Number of keys} 1}"] 1
  135. error_check_good stat:orig2 [is_substr $stat 
  136. "{{Number of records} $origdups}"] 1
  137. } else {
  138. set numkeys $kvals
  139. set allkeys [expr $numkeys + 1]
  140. set numdups $kvals_dups
  141. #
  142. # If we abort the removal of dups, or commit the
  143. # addition of dups, check that:
  144. # - We have > 0 internal pages.
  145. # - We have the number of keys.
  146. #
  147. error_check_bad stat:new0 [is_substr $stat 
  148. "{{Internal pages} 0}"] 1
  149. error_check_good stat:new1 [is_substr $stat 
  150. "{{Number of keys} $allkeys}"] 1
  151. }
  152. set dbc [$db cursor]
  153. error_check_good dbcursor [is_valid_cursor $dbc $db] TRUE
  154. puts "tRecd010_check: Checking key and duplicate values"
  155. set key "recd010_key"
  156. #
  157. # Check dups are there as they should be.
  158. #
  159. for {set ki 0} {$ki < $numkeys} {incr ki} {
  160. set datacnt 0
  161. for {set d [$dbc get -set $key$ki]} { [llength $d] != 0 } {
  162.     set d [$dbc get -nextdup]} {
  163. set thisdata [lindex [lindex $d 0] 1]
  164. error_check_good dup_check $thisdata $data$datacnt
  165. incr datacnt
  166. }
  167. error_check_good dup_count $datacnt $numdups
  168. }
  169. #
  170. # Check that the number of expected keys (allkeys) are
  171. # all of the ones that exist in the database.
  172. #
  173. set dupkeys 0
  174. set lastkey ""
  175. for {set d [$dbc get -first]} { [llength $d] != 0 } {
  176.     set d [$dbc get -next]} {
  177. set thiskey [lindex [lindex $d 0] 0]
  178. if { [string compare $lastkey $thiskey] != 0 } {
  179. incr dupkeys
  180. }
  181. set lastkey $thiskey
  182. }
  183. error_check_good key_check $allkeys $dupkeys
  184. error_check_good curs_close [$dbc close] 0
  185. error_check_good db_close [$db close] 0
  186. }
  187. proc recd010_split { db txn split method nkeys mkeys } {
  188. global errorCode
  189. global kvals
  190. global kvals_dups
  191. source ./include.tcl
  192. set data "data"
  193. set key "recd010_key"
  194. set numdups [expr $mkeys / $nkeys]
  195. set kvals $nkeys
  196. set kvals_dups $numdups
  197. if { $split == 1 } {
  198. puts 
  199. "tRecd010_split: Add $nkeys keys, with $numdups duplicates each to force split."
  200. for {set k 0} { $k < $nkeys } { incr k } {
  201. for {set i 0} { $i < $numdups } { incr i } {
  202. set ret [$db put -txn $txn $key$k $data$i]
  203. error_check_good dbput:more $ret 0
  204. }
  205. }
  206. } else {
  207. puts 
  208. "tRecd010_split: Delete $nkeys keys to force reverse split."
  209. for {set k 0} { $k < $nkeys } { incr k } {
  210. error_check_good db_del:$k [$db del -txn $txn $key$k] 0
  211. }
  212. }
  213. return 0
  214. }