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

MySQL数据库

开发平台:

Visual C++

  1. # See the file LICENSE for redistribution information.
  2. #
  3. # Copyright (c) 2000
  4. # Sleepycat Software.  All rights reserved.
  5. #
  6. # $Id: recd013.tcl,v 11.10 2000/12/11 17:24:55 sue Exp $
  7. #
  8. # Recovery Test 13.
  9. # Smoke test of aborted cursor adjustments.
  10. #
  11. # XXX
  12. # Other tests that cover more specific variants of the same issue
  13. # are in the access method tests for now.  This is probably wrong;  we
  14. # put this one here because they're closely based on and intertwined
  15. # with other, non-transactional cursor stability tests that are among
  16. # the access method tests, and because we need at least one test to 
  17. # fit under recd and keep logtrack from complaining.  We'll sort out the mess
  18. # later;  the important thing, for now, is that everything that needs to gets
  19. # tested.  (This really shouldn't be under recd at all, since it doesn't 
  20. # run recovery!)
  21. proc recd013 { method { nitems 100 } args } {
  22. source ./include.tcl
  23. global alphabet log_log_record_types
  24. set args [convert_args $method $args]
  25. set omethod [convert_method $method]
  26. set tnum 13
  27. set pgsz 512
  28. puts "Recd0$tnum $method ($args): Test of aborted cursor adjustments."
  29. set pgindex [lsearch -exact $args "-pagesize"]
  30. if { $pgindex != -1 } {
  31. puts "Recd013: skipping for specific pagesizes"
  32. return
  33. }
  34. set testfile recd0$tnum.db
  35. env_cleanup $testdir
  36. set i 0
  37. if { [is_record_based $method] == 1 } {
  38. set keybase ""
  39. } else {
  40. set keybase "key"
  41. }
  42. puts "tRecd0$tnum.a:
  43.     Create environment, database, and parent transaction."
  44. set flags "-create -txn -home $testdir"
  45. set env_cmd "berkdb env $flags"
  46. set env [eval $env_cmd]
  47. error_check_good dbenv [is_valid_env $env] TRUE
  48. set oflags "-env $env -create -mode 0644 -pagesize $pgsz $args $omethod"
  49. set db [eval {berkdb_open} $oflags $testfile]
  50. error_check_good dbopen [is_valid_db $db] TRUE
  51. # Create a database containing $nitems items, numbered with odds.
  52. # We'll then put the even numbers during the body of the test.
  53. set txn [$env txn]
  54. error_check_good init_txn [is_valid_txn $txn $env] TRUE
  55. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  56. set key $keybase$i
  57. set data [chop_data $method $i$alphabet]
  58. error_check_good init_put($i) [$db put -txn $txn $key $data] 0
  59. }
  60. error_check_good init_txn_commit [$txn commit] 0
  61. # Create an initial txn;  set a cursor of that txn to each item.
  62. set txn [$env txn]
  63. error_check_good txn [is_valid_txn $txn $env] TRUE
  64. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  65. set dbc($i) [$db cursor -txn $txn]
  66. error_check_good dbc_getset($i) [$dbc($i) get -set $keybase$i] 
  67.     [list [list $keybase$i [pad_data $method $i$alphabet]]]
  68. }
  69. puts "tRecd0$tnum.b: Put test."
  70. puts "ttRecd0$tnum.b.1: Put items."
  71. set ctxn [$env txn -parent $txn]
  72. error_check_good txn [is_valid_txn $ctxn $env] TRUE
  73. for { set i 2 } { $i <= 2 * $nitems } { incr i 2 } {
  74. set key $keybase$i
  75. set data [chop_data $method $i$alphabet]
  76. error_check_good child_put($i) [$db put -txn $ctxn $key $data] 0
  77. # If we're a renumbering recno, this is uninteresting.
  78. # Stir things up by putting a few additional records at
  79. # the beginning.
  80. if { [is_rrecno $method] == 1 } {
  81. set curs [$db cursor -txn $ctxn]
  82. error_check_bad llength_get_first 
  83.     [llength [$curs get -first]] 0
  84. error_check_good cursor [is_valid_cursor $curs $db] TRUE
  85. # expect a recno!
  86. error_check_good rrecno_put($i) 
  87.     [$curs put -before ADDITIONAL.$i] 1
  88. error_check_good curs_close [$curs close] 0
  89. }
  90. }
  91. puts "ttRecd0$tnum.b.2: Verify cursor stability after abort."
  92. error_check_good ctxn_abort [$ctxn abort] 0
  93. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  94. error_check_good dbc_get($i) [$dbc($i) get -current] 
  95.     [list [list $keybase$i [pad_data $method $i$alphabet]]]
  96. }
  97. # Clean up cursors.
  98. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  99. error_check_good dbc($i)_close [$dbc($i) close] 0
  100. }
  101. # Sync and verify.
  102. error_check_good txn_commit [$txn commit] 0
  103. set txn [$env txn]
  104. error_check_good txn [is_valid_txn $txn $env] TRUE
  105. error_check_good db_sync [$db sync] 0
  106. error_check_good db_verify 
  107.     [verify_dir $testdir "ttRecd0$tnum.b.3: "] 0
  108. # Now put back all the even records, this time in the parent.  
  109. # Commit and re-begin the transaction so we can abort and
  110. # get back to a nice full database.
  111. for { set i 2 } { $i <= 2 * $nitems } { incr i 2 } {
  112. set key $keybase$i
  113. set data [chop_data $method $i$alphabet]
  114. error_check_good child_put($i) [$db put -txn $txn $key $data] 0
  115. }
  116. error_check_good txn_commit [$txn commit] 0
  117. set txn [$env txn]
  118. error_check_good txn [is_valid_txn $txn $env] TRUE
  119. # Delete test.  Set a cursor to each record.  Delete the even ones
  120. # in the parent and check cursor stability.  Then open a child 
  121. # transaction, and delete the odd ones.  Verify that the database
  122. # is empty
  123. puts "tRecd0$tnum.c: Delete test."
  124. unset dbc
  125. # Create cursors pointing at each item.
  126. for { set i 1 } { $i <= 2 * $nitems } { incr i } {
  127. set dbc($i) [$db cursor -txn $txn]
  128. error_check_good dbc($i)_create [is_valid_cursor $dbc($i) $db] 
  129.     TRUE
  130. error_check_good dbc_getset($i) [$dbc($i) get -set $keybase$i] 
  131.     [list [list $keybase$i [pad_data $method $i$alphabet]]]
  132. }
  133. puts "ttRecd0$tnum.c.1: Delete even items in parent txn."
  134. if { [is_rrecno $method] != 1 } {
  135. set init 2
  136. set bound [expr 2 * $nitems]
  137. set step 2
  138. } else {
  139. # In rrecno, deletes will renumber the items, so we have
  140. # to take that into account when we delete by recno.
  141. set init 2
  142. set bound [expr $nitems + 1]
  143. set step 1
  144. }
  145. for { set i $init } { $i <= $bound } { incr i $step } {
  146. error_check_good del($i) [$db del -txn $txn $keybase$i] 0
  147. }
  148. # Verify that even items are deleted and odd items are not.
  149. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  150. if { [is_rrecno $method] != 1 } {
  151. set j $i
  152. } else {
  153. set j [expr ($i - 1) / 2 + 1]
  154. }
  155. error_check_good dbc_get($i) [$dbc($i) get -current] 
  156.     [list [list $keybase$j [pad_data $method $i$alphabet]]]
  157. }
  158. for { set i 2 } { $i <= 2 * $nitems } { incr i 2 } {
  159. error_check_good dbc_get($i) [$dbc($i) get -current] 
  160.     [list [list "" ""]]
  161. }
  162. puts "ttRecd0$tnum.c.2: Delete odd items in child txn."
  163. set ctxn [$env txn -parent $txn]
  164. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  165. if { [is_rrecno $method] != 1 } {
  166. set j $i
  167. } else {
  168. # If this is an rrecno, just delete the first
  169. # item repeatedly--the renumbering will make
  170. # that delete everything.
  171. set j 1
  172. }
  173. error_check_good del($i) [$db del -txn $ctxn $keybase$j] 0
  174. }
  175. # Verify that everyone's deleted.
  176. for { set i 1 } { $i <= 2 * $nitems } { incr i } {
  177. error_check_good get_deleted($i) 
  178.     [llength [$db get -txn $ctxn $keybase$i]] 0
  179. }
  180. puts "ttRecd0$tnum.c.3: Verify cursor stability after abort."
  181. error_check_good ctxn_abort [$ctxn abort] 0
  182. # Verify that even items are deleted and odd items are not.
  183. for { set i 1 } { $i <= 2 * $nitems } { incr i 2 } {
  184. if { [is_rrecno $method] != 1 } {
  185. set j $i
  186. } else {
  187. set j [expr ($i - 1) / 2 + 1]
  188. }
  189. error_check_good dbc_get($i) [$dbc($i) get -current] 
  190.     [list [list $keybase$j [pad_data $method $i$alphabet]]]
  191. }
  192. for { set i 2 } { $i <= 2 * $nitems } { incr i 2 } {
  193. error_check_good dbc_get($i) [$dbc($i) get -current] 
  194.     [list [list "" ""]]
  195. }
  196. # Clean up cursors.
  197. for { set i 1 } { $i <= 2 * $nitems } { incr i } {
  198. error_check_good dbc($i)_close [$dbc($i) close] 0
  199. }
  200. # Sync and verify.
  201. error_check_good db_sync [$db sync] 0
  202. error_check_good db_verify 
  203.     [verify_dir $testdir "ttRecd0$tnum.c.4: "] 0
  204. puts "tRecd0$tnum.d: Clean up."
  205. error_check_good txn_commit [$txn commit] 0
  206. error_check_good db_close [$db close] 0
  207. error_check_good env_close [$env close] 0
  208. error_check_good verify_dir 
  209.     [verify_dir $testdir "ttRecd0$tnum.d.1: "] 0
  210. if { $log_log_record_types == 1 } { 
  211. logtrack_read $testdir
  212. }
  213. }