# See the file LICENSE for redistribution information. # # Copyright (c) 1996, 1997, 1998, 1999, 2000 # Sleepycat Software. All rights reserved. # # $Id: txn.tcl,v 11.12 2000/12/31 19:26:23 bostic Exp $ # # Options are: # -dir # -max # -iterations # -stat proc txn_usage {} { puts "txn -dir -iterations \ -max -stat" } proc txntest { args } { source ./include.tcl # Set defaults set iterations 50 set max 1024 set dostat 0 set flags "" for { set i 0 } { $i < [llength $args] } {incr i} { switch -regexp -- [lindex $args $i] { -d.* { incr i; set testdir [lindex $args $i] } -f.* { incr i; set flags [lindex $args $i] } -i.* { incr i; set iterations [lindex $args $i] } -m.* { incr i; set max [lindex $args $i] } -s.* { set dostat 1 } default { puts -nonewline "FAIL:[timestamp] Usage: " txn_usage return } } } if { $max < $iterations } { set max $iterations } # Now run the various functionality tests txn001 $testdir $max $iterations $flags txn002 $testdir $max $iterations } proc txn001 { dir max ntxns flags} { source ./include.tcl puts "Txn001: Basic begin, commit, abort" # Open environment env_cleanup $dir set env [eval {berkdb \ env -create -mode 0644 -txn -txn_max $max -home $dir} $flags] error_check_good evn_open [is_valid_env $env] TRUE txn001_suba $ntxns $env txn001_subb $ntxns $env txn001_subc $ntxns $env # Close and unlink the file error_check_good env_close:$env [$env close] 0 } proc txn001_suba { ntxns env } { source ./include.tcl # We will create a bunch of transactions and commit them. set txn_list {} set tid_list {} puts "Txn001.a: Beginning/Committing $ntxns Transactions in $env" for { set i 0 } { $i < $ntxns } { incr i } { set txn [$env txn] error_check_good txn_begin [is_valid_txn $txn $env] TRUE lappend txn_list $txn set tid [$txn id] error_check_good tid_check [lsearch $tid_list $tid] -1 lappend tid_list $tid } # Now commit them all foreach t $txn_list { error_check_good txn_commit:$t [$t commit] 0 } } proc txn001_subb { ntxns env } { # We will create a bunch of transactions and abort them. set txn_list {} set tid_list {} puts "Txn001.b: Beginning/Aborting Transactions" for { set i 0 } { $i < $ntxns } { incr i } { set txn [$env txn] error_check_good txn_begin [is_valid_txn $txn $env] TRUE lappend txn_list $txn set tid [$txn id] error_check_good tid_check [lsearch $tid_list $tid] -1 lappend tid_list $tid } # Now abort them all foreach t $txn_list { error_check_good txn_abort:$t [$t abort] 0 } } proc txn001_subc { ntxns env } { # We will create a bunch of transactions and commit them. set txn_list {} set tid_list {} puts "Txn001.c: Beginning/Prepare/Committing Transactions" for { set i 0 } { $i < $ntxns } { incr i } { set txn [$env txn] error_check_good txn_begin [is_valid_txn $txn $env] TRUE lappend txn_list $txn set tid [$txn id] error_check_good tid_check [lsearch $tid_list $tid] -1 lappend tid_list $tid } # Now prepare them all foreach t $txn_list { error_check_good txn_prepare:$t [$t prepare] 0 } # Now commit them all foreach t $txn_list { error_check_good txn_commit:$t [$t commit] 0 } } # Verify that read-only transactions do not create any log records proc txn002 { dir max ntxns } { source ./include.tcl puts "Txn002: Read-only transaction test" env_cleanup $dir set env [berkdb \ env -create -mode 0644 -txn -txn_max $max -home $dir] error_check_good dbenv [is_valid_env $env] TRUE # We will create a bunch of transactions and commit them. set txn_list {} set tid_list {} puts "Txn002.a: Beginning/Committing Transactions" for { set i 0 } { $i < $ntxns } { incr i } { set txn [$env txn] error_check_good txn_begin [is_valid_txn $txn $env] TRUE lappend txn_list $txn set tid [$txn id] error_check_good tid_check [lsearch $tid_list $tid] -1 lappend tid_list $tid } # Now commit them all foreach t $txn_list { error_check_good txn_commit:$t [$t commit] 0 } # Now verify that there aren't any log records. set r [$env log_get -first] error_check_good log_get:$r [llength $r] 0 error_check_good env_close:$r [$env close] 0 }