diff options
Diffstat (limited to 'test/tcl/test016.tcl')
| -rw-r--r-- | test/tcl/test016.tcl | 396 |
1 files changed, 286 insertions, 110 deletions
diff --git a/test/tcl/test016.tcl b/test/tcl/test016.tcl index bd8581a0..7ac2b02d 100644 --- a/test/tcl/test016.tcl +++ b/test/tcl/test016.tcl @@ -1,6 +1,6 @@ # See the file LICENSE for redistribution information. # -# Copyright (c) 1996, 2012 Oracle and/or its affiliates. All rights reserved. +# Copyright (c) 1996, 2015 Oracle and/or its affiliates. All rights reserved. # # $Id$ # @@ -14,10 +14,13 @@ # TEST retrieve each. After all are entered, go back and do partial puts, # TEST replacing a random-length string with the key value. # TEST Then verify. +# TEST Run the test with blob enabled and disabled. proc test016 { method {nentries 10000} args } { + global alphabet global datastr global dvals + global has_crypto global rand_init source ./include.tcl @@ -57,143 +60,316 @@ proc test016 { method {nentries 10000} args } { } set testdir [get_home $env] } - puts "Test016: $method ($args) $nentries partial put shorten" set t1 $testdir/t1 set t2 $testdir/t2 set t3 $testdir/t3 - cleanup $testdir $env - set db [eval {berkdb_open \ - -create -mode 0644} $args {$omethod $testfile}] - error_check_good dbopen [is_valid_db $db] TRUE - - set pflags "" - set gflags "" - set txn "" - set count 0 - - if { [is_record_based $method] == 1 } { - append gflags " -recno" - } - # Here is the loop where we put and get each key/data pair - puts "\tTest016.a: put/get loop" - set did [open $dict] - while { [gets $did str] != -1 && $count < $nentries } { + # + # Set blob threshold as 5 since most words in the wordlist to put into + # the database have length <= 10. + # + set threshold 5 + set orig_args $args + foreach blob [list "" " -blob_threshold $threshold"] { + set args $orig_args + set msg "" + if { $blob != "" } { + set msg "with blob" + # + # This test runs a bit slowly when blob gets enabled. + # Cut down the nunber of entries to 100 for blob case. + # + if { $nentries == 10000 } { + set nentries 100 + } + } + + puts "Test016: $method ($args)\ + $nentries partial put shorten ($msg)" + + if { $blob != "" } { + # Blob is supported by btree, hash and heap. + if { [is_btree $method] != 1 && \ + [is_hash $method] != 1 && [is_heap $method] != 1 } { + puts "Test016 skipping\ + for method $method for blob" + return + } + # Look for incompatible configurations of blob. + foreach conf { "-encryptaes" "-encrypt" "-compress" \ + "-dup" "-dupsort" "-read_uncommitted" \ + "-multiversion" } { + if { [lsearch -exact $args $conf] != -1 } { + puts "Test016 skipping $conf for blob" + return + } + } + if { $env != "NULL" } { + if { [lsearch \ + [$env get_flags] "-snapshot"] != -1 } { + puts "Test016\ + skipping -snapshot for blob" + return + } + if { [is_repenv $env] == 1 } { + puts "Test016 skipping\ + replication env for blob" + return + } + if { $has_crypto == 1 } { + if { [$env get_encrypt_flags] != "" } { + puts "Test016 skipping\ + encrypted env for blob" + return + } + } + } + if { [lsearch -exact $args "-chksum"] != -1 } { + set indx [lsearch -exact $args "-chksum"] + set args [lreplace $args $indx $indx] + puts "Test016 ignoring -chksum for blob" + } + + # Set up the blob arguments. + append args $blob + if { $env == "NULL" } { + append args " -blob_dir $testdir/__db_bl" + } + } + + cleanup $testdir $env + set db [eval {berkdb_open \ + -create -mode 0644} $args {$omethod $testfile}] + error_check_good dbopen [is_valid_db $db] TRUE + + set pflags "" + set gflags "" + set txn "" + set count 0 + if { [is_record_based $method] == 1 } { - set key [expr $count + 1] - } else { - set key $str + append gflags " -recno" } - if { $txnenv == 1 } { - set t [$env txn] - error_check_good txn [is_valid_txn $t $env] TRUE - set txn "-txn $t" + + # Here is the loop where we put and get each key/data pair + puts "\tTest016.a1: put/get loop" + set did [open $dict] + while { [gets $did str] != -1 && $count < $nentries } { + if { [is_record_based $method] == 1 } { + set key [expr $count + 1] + } else { + set key $str + } + if { $txnenv == 1 } { + set t [$env txn] + error_check_good txn \ + [is_valid_txn $t $env] TRUE + set txn "-txn $t" + } + set ret [eval {$db put} \ + $txn $pflags {$key [chop_data $method $datastr]}] + error_check_good put $ret 0 + + set ret [eval {$db get} $txn $gflags {$key}] + error_check_good get $ret \ + [list [list $key [pad_data $method $datastr]]] + if { $txnenv == 1 } { + error_check_good txn [$t commit] 0 + } + incr count } - set ret [eval {$db put} \ - $txn $pflags {$key [chop_data $method $datastr]}] - error_check_good put $ret 0 + close $did - set ret [eval {$db get} $txn $gflags {$key}] - error_check_good \ - get $ret [list [list $key [pad_data $method $datastr]]] - if { $txnenv == 1 } { - error_check_good txn [$t commit] 0 + if { $blob != "" } { + puts "\tTest016.a2:\ + put/get a new blob with -partial and offset > 0" + set key $count + set len [string length ${count}.abc] + if { $txnenv == 1 } { + set t [$env txn] + error_check_good txn \ + [is_valid_txn $t $env] TRUE + set txn "-txn $t" + } + # Make the partial put offset equal to the blob + # threshold, so that the value must be stored as a + # blob in the database. + if { [is_heap $method] == 1 } { + set ret [catch {eval {$db put} $txn -append \ + {-partial [list $threshold $len] \ + ${count}.abc}} key] + } else { + set ret [eval {$db put} $txn {-partial \ + [list $threshold $len] $key ${count}.abc}] + } + error_check_good put $ret 0 + + set ret [eval {$db get} $txn \ + {-partial [list $threshold $len] $key}] + error_check_good get \ + [lindex [lindex $ret 0] 1] ${count}.abc + set ret [eval {$db get} $txn {$key}] + error_check_good get [string length [lindex \ + [lindex $ret 0] 1]] [expr $threshold + $len] + if { $txnenv == 1 } { + error_check_good txn [$t commit] 0 + } + # Delete this record since it does not work + # in the following test. + set ret [eval {$db del} $key] + error_check_good delete $ret 0 } - incr count - } - close $did - - # Next we will do a partial put replacement, making the data - # shorter - puts "\tTest016.b: partial put loop" - set did [open $dict] - set count 0 - set len [string length $datastr] - while { [gets $did str] != -1 && $count < $nentries } { - if { [is_record_based $method] == 1 } { - set key [expr $count + 1] - } else { - set key $str + + # Next we will do a partial put replacement, making the data + # shorter + puts "\tTest016.b1: partial put loop" + set did [open $dict] + set count 0 + set len [string length $datastr] + while { [gets $did str] != -1 && $count < $nentries } { + if { [is_record_based $method] == 1 } { + set key [expr $count + 1] + } else { + set key $str + } + + set repl_len [berkdb random_int \ + [string length $key] $len] + set repl_off [berkdb random_int \ + 0 [expr $len - $repl_len] ] + set s1 [string range $datastr 0 [ expr $repl_off - 1] ] + set s2 [string toupper $key] + set s3 [string range $datastr \ + [expr $repl_off + $repl_len] end ] + set dvals($key) [pad_data $method $s1$s2$s3] + if { $txnenv == 1 } { + set t [$env txn] + error_check_good txn \ + [is_valid_txn $t $env] TRUE + set txn "-txn $t" + } + set ret [eval {$db put} $txn {-partial \ + [list $repl_off $repl_len] $key \ + [chop_data $method $s2]}] + error_check_good put $ret 0 + set ret [eval {$db get} $txn $gflags {$key}] + error_check_good put $ret \ + [list [list $key [pad_data $method $s1$s2$s3]]] + if { $txnenv == 1 } { + error_check_good txn [$t commit] 0 + } + incr count } + close $did + + if { $blob != "" } { + puts "\tTest016.b2: partial put with > 1MB\ + of original data following the replaced data." + set key $count + set basestr [repeat [repeat $alphabet 40] 1024] + set len [string length $basestr] + if { $txnenv == 1 } { + set t [$env txn] + error_check_good txn \ + [is_valid_txn $t $env] TRUE + set txn "-txn $t" + } + if { [is_heap $method] == 1 } { + set ret [catch {eval {$db put} $txn \ + -append {$basestr}} key] + } else { + set ret [eval {$db put} $txn {$key $basestr}] + } + error_check_good put $ret 0 + set ret [eval {$db get} $txn {$key}] + error_check_good get \ + [lindex [lindex $ret 0] 1] $basestr + + set repl_str replaceXXX + set repl_len [string length $repl_str] + set off [berkdb random_int 1 \ + [expr $len - 1024 * 1024 - $repl_len]] + + set ret [eval {$db put} $txn \ + {-partial [list $off $repl_len] $key $repl_str}] + error_check_good put $ret 0 - set repl_len [berkdb random_int [string length $key] $len] - set repl_off [berkdb random_int 0 [expr $len - $repl_len] ] - set s1 [string range $datastr 0 [ expr $repl_off - 1] ] - set s2 [string toupper $key] - set s3 [string range $datastr [expr $repl_off + $repl_len] end ] - set dvals($key) [pad_data $method $s1$s2$s3] + set ret [eval {$db get} $txn $key] + error_check_bad get [llength $ret] 0 + + set data [lindex [lindex $ret 0] 1] + set expt_str1 [string range $basestr 0 [expr $off - 1]] + set expt_str2 [string range \ + $basestr [expr $off + $repl_len] $len] + set expt_str ${expt_str1}${repl_str}${expt_str2} + error_check_good get $data $expt_str + + if { $txnenv == 1 } { + error_check_good txn [$t commit] 0 + } + # Delete this record since it does not work + # in the following test. + set ret [eval {$db del} $key] + error_check_good delete $ret 0 + } + + # Now we will get each key from the DB and compare the results + # to the original. + puts "\tTest016.c: dump file" if { $txnenv == 1 } { set t [$env txn] error_check_good txn [is_valid_txn $t $env] TRUE set txn "-txn $t" } - set ret [eval {$db put} $txn {-partial \ - [list $repl_off $repl_len] $key [chop_data $method $s2]}] - error_check_good put $ret 0 - set ret [eval {$db get} $txn $gflags {$key}] - error_check_good \ - put $ret [list [list $key [pad_data $method $s1$s2$s3]]] + dump_file $db $txn $t1 test016.check if { $txnenv == 1 } { error_check_good txn [$t commit] 0 } - incr count - } - close $did - - # Now we will get each key from the DB and compare the results - # to the original. - puts "\tTest016.c: dump file" - if { $txnenv == 1 } { - set t [$env txn] - error_check_good txn [is_valid_txn $t $env] TRUE - set txn "-txn $t" - } - dump_file $db $txn $t1 test016.check - if { $txnenv == 1 } { - error_check_good txn [$t commit] 0 - } - error_check_good db_close [$db close] 0 + error_check_good db_close [$db close] 0 - # Now compare the keys to see if they match the dictionary - if { [is_record_based $method] == 1 } { - set oid [open $t2 w] - for {set i 1} {$i <= $nentries} {set i [incr i]} { - puts $oid $i + # Now compare the keys to see if they match the dictionary + if { [is_record_based $method] == 1 } { + set oid [open $t2 w] + for {set i 1} {$i <= $nentries} {set i [incr i]} { + puts $oid $i + } + close $oid + file rename -force $t1 $t3 + } else { + set q q + filehead $nentries $dict $t3 + filesort $t3 $t2 + filesort $t1 $t3 } - close $oid - file rename -force $t1 $t3 - } else { - set q q - filehead $nentries $dict $t3 - filesort $t3 $t2 - filesort $t1 $t3 - } - error_check_good Test016:diff($t3,$t2) \ - [filecmp $t3 $t2] 0 + error_check_good Test016:diff($t3,$t2) \ + [filecmp $t3 $t2] 0 - # Now, reopen the file and run the last test again. - puts "\tTest016.d: close, open, and dump file" - eval open_and_dump_file $testfile $env $t1 test016.check \ - dump_file_direction "-first" "-next" $args + # Now, reopen the file and run the last test again. + puts "\tTest016.d: close, open, and dump file" + eval open_and_dump_file $testfile $env $t1 test016.check \ + dump_file_direction "-first" "-next" $args - if { [ is_record_based $method ] == 0 } { - filesort $t1 $t3 - } - error_check_good Test016:diff($t3,$t2) \ - [filecmp $t3 $t2] 0 + if { [ is_record_based $method ] == 0 } { + filesort $t1 $t3 + } + error_check_good Test016:diff($t3,$t2) \ + [filecmp $t3 $t2] 0 - # Now, reopen the file and run the last test again in reverse direction. - puts "\tTest016.e: close, open, and dump file in reverse direction" - eval open_and_dump_file $testfile $env $t1 test016.check \ - dump_file_direction "-last" "-prev" $args + # Now, reopen the file and run the last test again + # in reverse direction. + puts "\tTest016.e: close, open,\ + and dump file in reverse direction" + eval open_and_dump_file $testfile $env $t1 test016.check \ + dump_file_direction "-last" "-prev" $args - if { [ is_record_based $method ] == 0 } { - filesort $t1 $t3 + if { [ is_record_based $method ] == 0 } { + filesort $t1 $t3 + } + error_check_good Test016:diff($t3,$t2) \ + [filecmp $t3 $t2] 0 } - error_check_good Test016:diff($t3,$t2) \ - [filecmp $t3 $t2] 0 } # Check function for test016; data should be whatever is set in dvals |
