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

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: mpoolscript.tcl,v 11.12 2000/05/05 15:23:47 sue Exp $
  7. #
  8. # Random multiple process mpool tester.
  9. # Usage: mpoolscript dir id numiters numfiles numpages sleepint
  10. # dir: lock directory.
  11. # id: Unique identifier for this process.
  12. # maxprocs: Number of procs in this test.
  13. # numiters: Total number of iterations.
  14. # pgsizes: Pagesizes for the different files.  Length of this item indicates
  15. # how many files to use.
  16. # numpages: Number of pages per file.
  17. # sleepint: Maximum sleep interval.
  18. # flags: Flags for env open
  19. source ./include.tcl
  20. source $test_path/test.tcl
  21. source $test_path/testutils.tcl
  22. set usage 
  23.    "mpoolscript dir id maxprocs numiters pgsizes numpages sleepint flags"
  24. # Verify usage
  25. if { $argc != 8 } {
  26. puts stderr "FAIL:[timestamp] Usage: $usage"
  27. puts $argc
  28. exit
  29. }
  30. # Initialize arguments
  31. set dir [lindex $argv 0]
  32. set id [lindex $argv 1]
  33. set maxprocs [lindex $argv 2]
  34. set numiters [ lindex $argv 3 ]
  35. set pgsizes [ lindex $argv 4 ]
  36. set numpages [ lindex $argv 5 ]
  37. set sleepint [ lindex $argv 6 ]
  38. set flags [ lindex $argv 7]
  39. # Initialize seed
  40. global rand_init
  41. berkdb srand $rand_init
  42. # Give time for all processes to start up.
  43. tclsleep 10
  44. puts -nonewline "Beginning execution for $id: $maxprocs $dir $numiters"
  45. puts " $pgsizes $numpages $sleepint"
  46. flush stdout
  47. # Figure out how small/large to make the cache
  48. set max 0
  49. foreach i $pgsizes {
  50. if { $i > $max } {
  51. set max $i
  52. }
  53. }
  54. set cache [list 0 [expr $maxprocs * ([lindex $pgsizes 0] + $max)] 1]
  55. set env_cmd {berkdb env -lock -cachesize $cache -home $dir}
  56. set e [eval $env_cmd $flags]
  57. error_check_good env_open [is_valid_env $e] TRUE
  58. # Now open files
  59. set mpools {}
  60. set nfiles 0
  61. foreach psize $pgsizes {
  62. set mp [$e mpool -create -mode 0644 -pagesize $psize file$nfiles]
  63. error_check_good memp_fopen:$nfiles [is_valid_mpool $mp $e] TRUE
  64. lappend mpools $mp
  65. incr nfiles
  66. }
  67. puts "Establishing long-term pin on file 0 page $id for process $id"
  68. # Set up the long-pin page
  69. set lock [$e lock_get write $id 0:$id]
  70. error_check_good lock_get [is_valid_lock $lock $e] TRUE
  71. set mp [lindex $mpools 0]
  72. set master_page [$mp get -create $id]
  73. error_check_good mp_get:$master_page [is_valid_page $master_page $mp] TRUE
  74. set r [$master_page init MASTER$id]
  75. error_check_good page_init $r 0
  76. # Release the lock but keep the page pinned
  77. set r [$lock put]
  78. error_check_good lock_put $r 0
  79. # Main loop.  On each iteration, we'll check every page in each of
  80. # of the files.  On any file, if we see the appropriate tag in the
  81. # field, we'll rewrite the page, else we won't.  Keep track of
  82. # how many pages we actually process.
  83. set pages 0
  84. for { set iter 0 } { $iter < $numiters } { incr iter } {
  85. puts "[timestamp]: iteration $iter, $pages pages set so far"
  86. flush stdout
  87. for { set fnum 1 } { $fnum < $nfiles } { incr fnum } {
  88. if { [expr $fnum % 2 ] == 0 } {
  89. set pred [expr ($id + $maxprocs - 1) % $maxprocs]
  90. } else {
  91. set pred [expr ($id + $maxprocs + 1) % $maxprocs]
  92. }
  93. set mpf [lindex $mpools $fnum]
  94. for { set p 0 } { $p < $numpages } { incr p } {
  95. set lock [$e lock_get write $id $fnum:$p]
  96. error_check_good lock_get:$fnum:$p 
  97.     [is_valid_lock $lock $e] TRUE
  98. # Now, get the page
  99. set pp [$mpf get -create $p]
  100. error_check_good page_get:$fnum:$p 
  101.     [is_valid_page $pp $mpf] TRUE
  102. if { [$pp is_setto $pred] == 0 || [$pp is_setto 0] == 0 } {
  103. # Set page to self.
  104. set r [$pp init $id]
  105. error_check_good page_init:$fnum:$p $r 0
  106. incr pages
  107. set r [$pp put -dirty]
  108. error_check_good page_put:$fnum:$p $r 0
  109. } else {
  110. error_check_good page_put:$fnum:$p [$pp put] 0
  111. }
  112. error_check_good lock_put:$fnum:$p [$lock put] 0
  113. }
  114. }
  115. tclsleep [berkdb random_int 1 $sleepint]
  116. }
  117. # Now verify your master page, release its pin, then verify everyone else's
  118. puts "$id: End of run verification of master page"
  119. set r [$master_page is_setto MASTER$id]
  120. error_check_good page_check $r 1
  121. set r [$master_page put -dirty]
  122. error_check_good page_put $r 0
  123. set i [expr ($id + 1) % $maxprocs]
  124. set mpf [lindex $mpools 0]
  125. while { $i != $id } {
  126. set p [$mpf get -create $i]
  127. error_check_good mp_get [is_valid_page $p $mpf] TRUE
  128. if { [$p is_setto MASTER$i] != 1 } {
  129. puts "Warning: Master page $i not set."
  130. }
  131. error_check_good page_put:$p [$p put] 0
  132. set i [expr ($i + 1) % $maxprocs]
  133. }
  134. # Close files
  135. foreach i $mpools {
  136. set r [$i close]
  137. error_check_good mpf_close $r 0
  138. }
  139. # Close environment system
  140. set r [$e close]
  141. error_check_good env_close $r 0
  142. puts "[timestamp] $id Complete"
  143. flush stdout