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

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: rpc001.tcl,v 11.23 2001/01/02 20:04:56 sue Exp $
  7. #
  8. # Test RPC specifics, primarily that unsupported functions return
  9. # errors and such.
  10. #
  11. proc rpc001 { } {
  12. global __debug_on
  13. global __debug_print
  14. global errorInfo
  15. source ./include.tcl
  16. #
  17. # First test timeouts on server.
  18. #
  19. set ttime 5
  20. set itime 10
  21. puts "Rpc001: Server timeouts: resource $ttime sec, idle $itime sec"
  22. if { [string compare $rpc_server "localhost"] == 0 } {
  23.        set dpid [exec $util_path/berkeley_db_svc 
  24.    -h $rpc_testdir -t $ttime -I $itime &]
  25. } else {
  26.        set dpid [exec rsh $rpc_server $rpc_path/berkeley_db_svc 
  27.    -h $rpc_testdir -t $ttime -I $itime&]
  28. }
  29. puts "tRpc001.a: Started server, pid $dpid"
  30. tclsleep 2
  31. remote_cleanup $rpc_server $rpc_testdir $testdir
  32. puts "tRpc001.b: Creating environment"
  33. set testfile "rpc001.db"
  34. set home [file tail $rpc_testdir]
  35. set env [eval {berkdb env -create -mode 0644 -home $home 
  36.     -server $rpc_server -client_timeout 10000 -txn}]
  37. error_check_good lock_env:open [is_valid_env $env] TRUE
  38. puts "tRpc001.c: Opening a database"
  39. #
  40. # NOTE: the type of database doesn't matter, just use btree.
  41. set db [eval {berkdb_open -create -btree -mode 0644} 
  42.     -env $env $testfile]
  43. error_check_good dbopen [is_valid_db $db] TRUE
  44. set curs_list {}
  45. set txn_list {}
  46. puts "tRpc001.d: Basic timeout test"
  47. puts "tRpc001.d1: Starting a transaction"
  48. set txn [$env txn]
  49. error_check_good txn_begin [is_valid_txn $txn $env] TRUE
  50. lappend txn_list $txn
  51. puts "tRpc001.d2: Open a cursor in that transaction"
  52. set dbc [$db cursor -txn $txn]
  53. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  54. lappend curs_list $dbc
  55. puts "tRpc001.d3: Duplicate that cursor"
  56. set dbc [$dbc dup]
  57. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  58. lappend curs_list $dbc
  59. puts "tRpc001.d4: Starting a nested transaction"
  60. set txn [$env txn -parent $txn]
  61. error_check_good txn_begin [is_valid_txn $txn $env] TRUE
  62. set txn_list [linsert $txn_list 0 $txn]
  63. puts "tRpc001.d5: Create a cursor, no transaction"
  64. set dbc [$db cursor]
  65. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  66. lappend curs_list $dbc
  67. puts "tRpc001.d6: Timeout cursor and transactions"
  68. set sleeptime [expr $ttime + 2]
  69. tclsleep $sleeptime
  70. #
  71. # Perform a generic db operations to cause the timeout routine
  72. # to trigger.
  73. #
  74. set stat [catch {$db stat} ret]
  75. error_check_good dbstat $stat 0
  76. #
  77. # Check that every handle we opened above is timed out
  78. #
  79. foreach c $curs_list {
  80. set stat [catch {$c close} ret]
  81. error_check_good dbc_close:$c $stat 1
  82. error_check_good dbc_timeout:$c 
  83.     [is_substr $errorInfo "DB_NOSERVER_ID"] 1
  84. }
  85. foreach t $txn_list {
  86. set stat [catch {$t commit} ret]
  87. error_check_good txn_commit:$t $stat 1
  88. error_check_good txn_timeout:$t 
  89.     [is_substr $errorInfo "DB_NOSERVER_ID"] 1
  90. }
  91. set txn_list {}
  92. set ntxns 8
  93. puts "tRpc001.e: Nested ($ntxns x $ntxns) transaction activity test"
  94. puts "tRpc001.e1: Starting parent transaction"
  95. set txn [$env txn]
  96. error_check_good txn_begin [is_valid_txn $txn $env] TRUE
  97. set txn_list [linsert $txn_list 0 $txn]
  98. set last_txn $txn
  99. set parent_txn $txn
  100. #
  101. # First set a breadth of 'ntxns'
  102. # We need 2 from this set for testing later on.  Just set them
  103. # up separately first.
  104. #
  105. puts "tRpc001.e2: Creating $ntxns child transactions"
  106. set child0 [$env txn -parent $parent_txn]
  107. error_check_good txn_begin [is_valid_txn $child0 $env] TRUE
  108. set child1 [$env txn -parent $parent_txn]
  109. error_check_good txn_begin [is_valid_txn $child1 $env] TRUE
  110. for {set i 2} {$i < $ntxns} {incr i} {
  111. set txn [$env txn -parent $parent_txn]
  112. error_check_good txn_begin [is_valid_txn $txn $env] TRUE
  113. set txn_list [linsert $txn_list 0 $txn]
  114. }
  115. #
  116. # Now make one 'ntxns' deeply nested.
  117. # Add one more for testing later on separately.
  118. #
  119. puts "tRpc001.e3: Creating $ntxns nested child transactions"
  120. for {set i 0} {$i < $ntxns} {incr i} {
  121. set txn [$env txn -parent $last_txn]
  122. error_check_good txn_begin [is_valid_txn $txn $env] TRUE
  123. set txn_list [linsert $txn_list 0 $txn]
  124. set last_txn $txn
  125. }
  126. set last_parent $last_txn
  127. set last_txn [$env txn -parent $last_parent]
  128. error_check_good txn_begin [is_valid_txn $last_txn $env] TRUE
  129. puts "tRpc001.e4: Open a cursor in deepest transaction"
  130. set dbc [$db cursor -txn $last_txn]
  131. error_check_good db_cursor [is_valid_cursor $dbc $db] TRUE
  132. puts "tRpc001.e5: Duplicate that cursor"
  133. set dbcdup [$dbc dup]
  134. error_check_good db_cursor [is_valid_cursor $dbcdup $db] TRUE
  135. lappend curs_list $dbcdup
  136. puts "tRpc001.f: Timeout then activate duplicate cursor"
  137. tclsleep $sleeptime
  138. set stat [catch {$dbcdup close} ret]
  139. error_check_good dup_close:$dbcdup $stat 0
  140. error_check_good dup_close:$dbcdup $ret 0
  141. #
  142. # Make sure that our parent txn is not timed out.  We will
  143. # try to begin another child tnx using the parent.  We expect
  144. # that to succeed.  Immediately commit that txn.
  145. #
  146. set stat [catch {$env txn -parent $parent_txn} newchild]
  147. error_check_good newchildtxn $stat 0
  148. error_check_good newcommit [$newchild commit] 0
  149. puts "tRpc001.g: Timeout, then activate cursor"
  150. tclsleep $sleeptime
  151. set stat [catch {$dbc close} ret]
  152. error_check_good dbc_close:$dbc $stat 0
  153. error_check_good dbc_close:$dbc $ret 0
  154. #
  155. # Make sure that our parent txn is not timed out.  We will
  156. # try to begin another child tnx using the parent.  We expect
  157. # that to succeed.  Immediately commit that txn.
  158. #
  159. set stat [catch {$env txn -parent $parent_txn} newchild]
  160. error_check_good newchildtxn $stat 0
  161. error_check_good newcommit [$newchild commit] 0
  162. puts "tRpc001.h: Timeout, then activate child txn"
  163. tclsleep $sleeptime
  164. set stat [catch {$child0 commit} ret]
  165. error_check_good child_commit $stat 0
  166. error_check_good child_commit:$child0 $ret 0
  167. #
  168. #
  169. # Make sure that our nested txn is not timed out.  We will
  170. # try to begin another child tnx using the parent.  We expect
  171. # that to succeed.  Immediately commit that txn.
  172. #
  173. set stat [catch {$env txn -parent $last_parent} newchild]
  174. error_check_good newchildtxn $stat 0
  175. error_check_good newcommit [$newchild commit] 0
  176. puts "tRpc001.i: Timeout, then activate nested txn"
  177. tclsleep $sleeptime
  178. set stat [catch {$last_txn commit} ret]
  179. error_check_good lasttxn_commit $stat 0
  180. error_check_good lasttxn_commit:$child0 $ret 0
  181. #
  182. # Make sure that our child txn is not timed out.  We should
  183. # be able to commit it.
  184. #
  185. set stat [catch {$child1 commit} ret]
  186. error_check_good child_commit:$child1 $stat 0
  187. error_check_good child_commit:$child1 $ret 0
  188. #
  189. # Clean up.  They were inserted in LIFO order, so we should
  190. # just be able to commit them all.
  191. foreach t $txn_list {
  192. set stat [catch {$t commit} ret]
  193. error_check_good txn_commit:$t $stat 0
  194. error_check_good txn_commit:$t $ret 0
  195. }
  196. set stat [catch {$db close} ret]
  197. error_check_good db_close $stat 0
  198. rpc_timeoutjoin $env "Rpc001.j" $sleeptime 0
  199. rpc_timeoutjoin $env "Rpc001.k" $sleeptime 1
  200. #
  201. # We need a 2nd env just to do an op to timeout the env.
  202. #
  203. set env1 [eval {berkdb env -create -mode 0644 -home $home 
  204.     -server $rpc_server -client_timeout 10000 -txn}]
  205. error_check_good lock_env:open [is_valid_env $env1] TRUE
  206. puts "tRpc001.l: Timeout idle env handle"
  207. set sleeptime [expr $itime + 2]
  208. tclsleep $sleeptime
  209. set stat [catch {$env1 close} ret]
  210. error_check_good env1_close $stat 0
  211. set stat [catch {$env close} ret]
  212. error_check_good env_close $stat 1
  213. error_check_good env_timeout 
  214.     [is_substr $errorInfo "DB_NOSERVER_ID"] 1
  215. exec $KILL $dpid
  216. }
  217. proc rpc_timeoutjoin {env msg sleeptime use_txn} {
  218. #
  219. # Check join cursors now.
  220. #
  221. puts -nonewline "t$msg: Test join cursors and timeouts"
  222. if { $use_txn } {
  223. puts " (using txns)"
  224. } else {
  225. puts " (without txns)"
  226. }
  227. #
  228. # Set up a simple set of join databases
  229. #
  230. puts "t${msg}0: Set up join databases"
  231. set fruit {
  232.     {blue blueberry}
  233.     {red apple} {red cherry} {red raspberry}
  234.     {yellow lemon} {yellow pear}
  235. }
  236. set price {
  237.     {expen blueberry} {expen cherry} {expen raspberry}
  238.     {inexp apple} {inexp lemon} {inexp pear}
  239. }
  240. set dessert {
  241.     {blueberry cobbler} {cherry cobbler} {pear cobbler}
  242.     {apple pie} {raspberry pie} {lemon pie}
  243. }
  244. set fdb [eval {berkdb_open -create -btree -mode 0644} 
  245.     -env $env -dup fruit.db]
  246. error_check_good dbopen [is_valid_db $fdb] TRUE
  247. set pdb [eval {berkdb_open -create -btree -mode 0644} 
  248.     -env $env -dup price.db]
  249. error_check_good dbopen [is_valid_db $pdb] TRUE
  250. set ddb [eval {berkdb_open -create -btree -mode 0644} 
  251.     -env $env -dup dessert.db]
  252. error_check_good dbopen [is_valid_db $ddb] TRUE
  253. foreach kd $fruit {
  254. set k [lindex $kd 0]
  255. set d [lindex $kd 1]
  256. set ret [$fdb put $k $d]
  257. error_check_good fruit_put $ret 0
  258. }
  259. error_check_good sync [$fdb sync] 0
  260. foreach kd $price {
  261. set k [lindex $kd 0]
  262. set d [lindex $kd 1]
  263. set ret [$pdb put $k $d]
  264. error_check_good price_put $ret 0
  265. }
  266. error_check_good sync [$pdb sync] 0
  267. foreach kd $dessert {
  268. set k [lindex $kd 0]
  269. set d [lindex $kd 1]
  270. set ret [$ddb put $k $d]
  271. error_check_good dessert_put $ret 0
  272. }
  273. error_check_good sync [$ddb sync] 0
  274. rpc_join $env $msg $sleeptime $fdb $pdb $ddb $use_txn 0
  275. rpc_join $env $msg $sleeptime $fdb $pdb $ddb $use_txn 1
  276. error_check_good ddb:close [$ddb close] 0
  277. error_check_good pdb:close [$pdb close] 0
  278. error_check_good fdb:close [$fdb close] 0
  279. }
  280. proc rpc_join {env msg sleep fdb pdb ddb use_txn op} {
  281. global errorInfo
  282. #
  283. # Start a parent and child transaction.  We'll do our join in
  284. # the child transaction just to make sure everything gets timed
  285. # out correctly.
  286. #
  287. set curs_list {}
  288. set txn_list {}
  289. set msgnum [expr $op * 2 + 1] 
  290. if { $use_txn } {
  291. puts "t$msg$msgnum: Set up txns and join cursor"
  292. set txn [$env txn]
  293. error_check_good txn_begin [is_valid_txn $txn $env] TRUE
  294. set txn_list [linsert $txn_list 0 $txn]
  295. set child0 [$env txn -parent $txn]
  296. error_check_good txn_begin [is_valid_txn $child0 $env] TRUE
  297. set txn_list [linsert $txn_list 0 $child0]
  298. set child1 [$env txn -parent $txn]
  299. error_check_good txn_begin [is_valid_txn $child1 $env] TRUE
  300. set txn_list [linsert $txn_list 0 $child1]
  301. set txncmd "-txn $child0"
  302. } else {
  303. puts "t$msg$msgnum: Set up join cursor"
  304. set txncmd ""
  305. }
  306. #
  307. # Start a cursor, (using txn child0 in the fruit and price dbs, if
  308. # needed).  # Just pick something simple to join on.  
  309. # Then call join on the dessert db.
  310. #
  311. set fkey yellow
  312. set pkey inexp
  313. set fdbc [eval $fdb cursor $txncmd]
  314. error_check_good fdb_cursor [is_valid_cursor $fdbc $fdb] TRUE
  315. set ret [$fdbc get -set $fkey]
  316. error_check_bad fget:set [llength $ret] 0
  317. set k [lindex [lindex $ret 0] 0]
  318. error_check_good fget:set:key $k $fkey
  319. set curs_list [linsert $curs_list 0 $fdbc]
  320. set pdbc [eval $pdb cursor $txncmd]
  321. error_check_good pdb_cursor [is_valid_cursor $pdbc $pdb] TRUE
  322. set ret [$pdbc get -set $pkey]
  323. error_check_bad pget:set [llength $ret] 0
  324. set k [lindex [lindex $ret 0] 0]
  325. error_check_good pget:set:key $k $pkey
  326. set curs_list [linsert $curs_list 0 $pdbc]
  327. set jdbc [$ddb join $fdbc $pdbc]
  328. error_check_good join_cursor [is_valid_cursor $jdbc $ddb] TRUE
  329. set ret [$jdbc get]
  330. error_check_bad jget [llength $ret] 0
  331. set msgnum [expr $op * 2 + 2] 
  332. if { $op == 1 } {
  333. puts -nonewline "t$msg$msgnum: Timeout all cursors"
  334. if { $use_txn } {
  335. puts " and txns"
  336. } else {
  337. puts ""
  338. }
  339. } else {
  340. puts "t$msg$msgnum: Timeout, then activate join cursor"
  341. }
  342. tclsleep $sleep
  343. if { $op == 1 } {
  344. #
  345. # Perform a generic db operations to cause the timeout routine
  346. # to trigger.
  347. #
  348. set stat [catch {$fdb stat} ret]
  349. error_check_good fdbstat $stat 0
  350. #
  351. # Check that join cursor is timed out.
  352. #
  353. set stat [catch {$jdbc close} ret]
  354. error_check_good dbc_close:$jdbc $stat 1
  355. error_check_good dbc_timeout:$jdbc 
  356.     [is_substr $errorInfo "DB_NOSERVER_ID"] 1
  357. #
  358. # Now the server may or may not timeout constituent
  359. # cursors when it times out the join cursor.  So, just
  360. # sleep again and then they should timeout.
  361. #
  362. tclsleep $sleep
  363. set stat [catch {$fdb stat} ret]
  364. error_check_good fdbstat $stat 0
  365. foreach c $curs_list {
  366. set stat [catch {$c close} ret]
  367. error_check_good dbc_close:$c $stat 1
  368. error_check_good dbc_timeout:$c 
  369.     [is_substr $errorInfo "DB_NOSERVER_ID"] 1
  370. }
  371. foreach t $txn_list {
  372. set stat [catch {$t commit} ret]
  373. error_check_good txn_commit:$t $stat 1
  374. error_check_good txn_timeout:$t 
  375.     [is_substr $errorInfo "DB_NOSERVER_ID"] 1
  376. }
  377. } else {
  378. set stat [catch {$jdbc get} ret]
  379. error_check_good jget.stat $stat 0
  380. error_check_bad jget [llength $ret] 0
  381. set curs_list [linsert $curs_list 0 $jdbc]
  382. foreach c $curs_list {
  383. set stat [catch {$c close} ret]
  384. error_check_good dbc_close:$c $stat 0
  385. error_check_good dbc_close:$c $ret 0
  386. }
  387. foreach t $txn_list {
  388. set stat [catch {$t commit} ret]
  389. error_check_good txn_commit:$t $stat 0
  390. error_check_good txn_commit:$t $ret 0
  391. }
  392. }
  393. }