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

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: log.tcl,v 11.17 2000/11/30 20:09:19 dda Exp $
  7. #
  8. # Options are:
  9. # -dir <directory in which to store memp>
  10. # -maxfilesize <maxsize of log file>
  11. # -iterations <iterations>
  12. # -stat
  13. proc log_usage {} {
  14. puts "log -dir <directory> -iterations <number of ops> 
  15.     -maxfilesize <max size of log files> -stat"
  16. }
  17. proc logtest { args } {
  18. source ./include.tcl
  19. global rand_init
  20. # Set defaults
  21. set iterations 1000
  22. set maxfile [expr 1024 * 128]
  23. set dostat 0
  24. for { set i 0 } { $i < [llength $args] } {incr i} {
  25. switch -regexp -- [lindex $args $i] {
  26. -d.* { incr i; set testdir [lindex $args $i] }
  27. -i.* { incr i; set iterations [lindex $args $i] }
  28. -m.* { incr i; set maxfile [lindex $args $i] }
  29. -s.* { set dostat 1 }
  30. default {
  31. puts -nonewline "FAIL:[timestamp] Usage: "
  32. log_usage
  33. return
  34. }
  35. }
  36. }
  37. set multi_log [expr 3 * $iterations]
  38. # Clean out old log if it existed
  39. puts "Unlinking log: error message OK"
  40. env_cleanup $testdir
  41. # Now run the various functionality tests
  42. berkdb srand $rand_init
  43. log001 $testdir $maxfile $iterations
  44. log001 $testdir $maxfile $multi_log
  45. log002 $testdir $maxfile
  46. log003 $testdir $maxfile
  47. log004 $testdir
  48. }
  49. proc log001 { dir max nrecs } {
  50. source ./include.tcl
  51. puts "Log001: Basic put/get test"
  52. env_cleanup $dir
  53. set env [berkdb env -log -create -home $dir 
  54. -mode 0644 -log_max $max]
  55. error_check_bad log_env:$dir $env NULL
  56. error_check_good log:$dir [is_substr $env "env"] 1
  57. # We will write records to the log and make sure we can
  58. # read them back correctly.  We'll use a standard pattern
  59. # repeated some number of times for each record.
  60. set lsn_list {}
  61. set rec_list {}
  62. puts "Log001.a: Writing $nrecs log records"
  63. for { set i 0 } { $i < $nrecs } { incr i } {
  64. set rec ""
  65. for { set j 0 } { $j < [expr $i % 10 + 1] } {incr j} {
  66. set rec $rec$i:logrec:$i
  67. }
  68. set lsn [$env log_put $rec]
  69. error_check_bad log_put [is_substr $lsn log_cmd] 1
  70. lappend lsn_list $lsn
  71. lappend rec_list $rec
  72. }
  73. puts "Log001.b: Retrieving log records sequentially (forward)"
  74. set i 0
  75. for { set grec [$env log_get -first] } { [llength $grec] != 0 } {
  76. set grec [$env log_get -next]} {
  77. error_check_good log_get:seq [lindex $grec 1] 
  78.  [lindex $rec_list $i]
  79. incr i
  80. }
  81. puts "Log001.c: Retrieving log records sequentially (backward)"
  82. set i [llength $rec_list]
  83. for { set grec [$env log_get -last] } { [llength $grec] != 0 } {
  84.     set grec [$env log_get -prev] } {
  85. incr i -1
  86. error_check_good 
  87.     log_get:seq [lindex $grec 1] [lindex $rec_list $i]
  88. }
  89. puts "Log001.d: Retrieving log records sequentially by LSN"
  90. set i 0
  91. foreach lsn $lsn_list {
  92. set grec [$env log_get -set $lsn]
  93. error_check_good 
  94.     log_get:seq [lindex $grec 1] [lindex $rec_list $i]
  95. incr i
  96. }
  97. puts "Log001.e: Retrieving log records randomly by LSN"
  98. set m [expr [llength $lsn_list] - 1]
  99. for { set i 0 } { $i < $nrecs } { incr i } {
  100. set recno [berkdb random_int 0 $m ]
  101. set lsn [lindex $lsn_list $recno]
  102. set grec [$env log_get -set $lsn]
  103. error_check_good 
  104.     log_get:seq [lindex $grec 1] [lindex $rec_list $recno]
  105. }
  106. # Close and unlink the file
  107. error_check_good env:close:$env [$env close] 0
  108. error_check_good envremove:$dir [berkdb envremove -home $dir] 0
  109. puts "Log001 Complete"
  110. }
  111. proc log002 { dir {max 32768} } {
  112. source ./include.tcl
  113. puts "Log002: Multiple log test w/trunc, file, compare functionality"
  114. env_cleanup $dir
  115. set env [berkdb env -create -home $dir -mode 0644 -log -log_max $max]
  116. error_check_bad log_env:$dir $env NULL
  117. error_check_good log:$dir [is_substr $env "env"] 1
  118. # We'll record every hundred'th record for later use
  119. set info_list {}
  120. set i 0
  121. puts "Log002.a: Writing log records"
  122. for {set s 0} { $s <  [expr 3 * $max] } { incr s $len } {
  123. set rec [random_data 120 0 0]
  124. set len [string length $rec]
  125. set lsn [$env log_put $rec]
  126. if { [expr $i % 100 ] == 0 } {
  127. lappend info_list [list $lsn $rec]
  128. }
  129. incr i
  130. }
  131. puts "Log002.b: Checking log_compare"
  132. set last {0 0}
  133. foreach p $info_list {
  134. set l [lindex $p 0]
  135. if { [llength $last] != 0 } {
  136. error_check_good 
  137.     log_compare [$env log_compare $l $last] 1
  138. error_check_good 
  139.     log_compare [$env log_compare $last $l] -1
  140. error_check_good 
  141.     log_compare [$env log_compare $l $l] 0
  142. }
  143. set last $l
  144. }
  145. puts "Log002.c: Checking log_file"
  146. set flist [glob $dir/log*]
  147. foreach p $info_list {
  148. set lsn [lindex $p 0]
  149. set f [$env log_file $lsn]
  150. # Change all backslash separators on Windows to forward slash
  151. # separators, which is what the rest of the test suite expects.
  152. regsub -all {\} $f {/} f
  153. error_check_bad log_file:$f [lsearch $flist $f] -1
  154. }
  155. puts "Log002.d: Verifying records"
  156. for {set i [expr [llength $info_list] - 1] } { $i >= 0 } { incr i -1} {
  157. set p [lindex $info_list $i]
  158. set grec [$env log_get -set [lindex $p 0]]
  159. error_check_good log_get:$env [lindex $grec 1] [lindex $p 1]
  160. }
  161. # Close and unlink the file
  162. error_check_good env:close:$env [$env close] 0
  163. error_check_good envremove:$dir [berkdb envremove -home $dir] 0
  164. puts "Log002 Complete"
  165. }
  166. proc log003 { dir {max 32768} } {
  167. source ./include.tcl
  168. puts "Log003: Verify log_flush behavior"
  169. env_cleanup $dir
  170. set short_rec "abcdefghijklmnopqrstuvwxyz"
  171. set long_rec [repeat $short_rec 200]
  172. set very_long_rec [repeat $long_rec 4]
  173. foreach rec "$short_rec $long_rec $very_long_rec" {
  174. puts "Log003.a: Verify flush on [string length $rec] byte rec"
  175. set env [berkdb env -log -home $dir 
  176. -create -mode 0644 -log_max $max]
  177. error_check_bad log_env:$dir $env NULL
  178. error_check_good log:$dir [is_substr $env "env"] 1
  179. set lsn [$env log_put $rec]
  180. error_check_bad log_put [lindex $lsn 0] "ERROR:"
  181. set ret [$env log_flush $lsn]
  182. error_check_good log_flush $ret 0
  183. # Now, we want to crash the region and recheck.  Closing the
  184. # log does not flush any records, so we'll use a close to
  185. # do the "crash"
  186. set ret [$env close]
  187. error_check_good log_env:close $ret 0
  188. # Now, remove the log region
  189. #set ret [berkdb envremove -home $dir]
  190. #error_check_good env:remove $ret 0
  191. # Re-open the log and try to read the record.
  192. set env [berkdb env -create -home $dir 
  193. -log -mode 0644 -log_max $max]
  194. error_check_bad log_env:$dir $env NULL
  195. error_check_good log:$dir [is_substr $env "env"] 1
  196. set gotrec [$env log_get -first]
  197. error_check_good lp_get [lindex $gotrec 1] $rec
  198. # Close and unlink the file
  199. error_check_good env:close:$env [$env close] 0
  200. error_check_good envremove:$dir [berkdb envremove -home $dir] 0
  201. log_cleanup $dir
  202. }
  203. foreach rec "$short_rec $long_rec $very_long_rec" {
  204. puts "Log003.b: 
  205.     Verify flush on non-last record [string length $rec]"
  206. set env [berkdb env 
  207.     -create -log -home $dir -mode 0644 -log_max $max]
  208. error_check_bad log_env:$dir $env NULL
  209. error_check_good log:$dir [is_substr $env "env"] 1
  210. # Put 10 random records
  211. for { set i 0 } { $i < 10 } { incr i} {
  212. set r [random_data 450 0 0]
  213. set lsn [$env log_put $r]
  214. error_check_bad log_put [lindex $lsn 0] "ERROR:"
  215. }
  216. # Put the record we are interested in
  217. set save_lsn [$env log_put $rec]
  218. error_check_bad log_put [lindex $save_lsn 0] "ERROR:"
  219. # Put 10 more random records
  220. for { set i 0 } { $i < 10 } { incr i} {
  221. set r [random_data 450 0 0]
  222. set lsn [$env log_put $r]
  223. error_check_bad log_put [lindex $lsn 0] "ERROR:"
  224. }
  225. # Now check the flush
  226. set ret [$env log_flush $save_lsn]
  227. error_check_good log_flush $ret 0
  228. # Now, we want to crash the region and recheck.  Closing the
  229. # log does not flush any records, so we'll use a close to
  230. # do the "crash"
  231. #
  232. # Now, close and remove the log region
  233. error_check_good env:close:$env [$env close] 0
  234. set ret [berkdb envremove -home $dir]
  235. error_check_good env:remove $ret 0
  236. # Re-open the log and try to read the record.
  237. set env [berkdb env 
  238.     -home $dir -create -log -mode 0644 -log_max $max]
  239. error_check_bad log_env:$dir $env NULL
  240. error_check_good log:$dir [is_substr $env "env"] 1
  241. set gotrec [$env log_get -set $save_lsn]
  242. error_check_good lp_get [lindex $gotrec 1] $rec
  243. # Close and unlink the file
  244. error_check_good env:close:$env [$env close] 0
  245. error_check_good envremove:$dir [berkdb envremove -home $dir] 0
  246. log_cleanup $dir
  247. }
  248. puts "Log003 Complete"
  249. }
  250. # Make sure that if we do PREVs on a log, but the beginning of the
  251. # log has been truncated, we do the right thing.
  252. proc log004 { dir } {
  253. source ./include.tcl
  254. puts "Log004: Prev on log when beginning of log has been truncated."
  255. # Use archive test to populate log
  256. env_cleanup $dir
  257. puts "Log004.a: Call archive to populate log."
  258. archive
  259. # Delete all log files under 100
  260. puts "Log004.b: Delete all log files under 100."
  261. set ret [catch { glob $dir/log.00000000* } result]
  262. if { $ret == 0 } {
  263. eval fileremove -f $result
  264. }
  265. # Now open the log and get the first record and try a prev
  266. puts "Log004.c: Open truncated log, attempt to access missing portion."
  267. set myenv [berkdb env -create -log -home $dir]
  268. error_check_good log_open [is_substr $myenv "env"] 1
  269. set ret [$myenv log_get -first]
  270. error_check_bad log_get [llength $ret] 0
  271. # This should give DB_NOTFOUND which is a ret of length 0
  272. catch {$myenv log_get -prev} ret
  273. error_check_good log_get_prev [string length $ret] 0
  274. puts "Log004.d: Close log and environment."
  275. error_check_good log_close [$myenv close] 0
  276. puts "Log004 complete."
  277. }