| # 2018-07-15 |
| # |
| # The author disclaims copyright to this source code. In place of |
| # a legal notice, here is a blessing: |
| # |
| # May you do good and not evil. |
| # May you find forgiveness for yourself and forgive others. |
| # May you share freely, never taking more than you give. |
| # |
| #*********************************************************************** |
| # This file implements regression tests for SQLite library. The |
| # focus of this file is testing that if an IO error is encountered |
| # as part of an atomic F2FS commit, an attempt is made to commit the |
| # transaction using a legacy journal commit. |
| # |
| |
| set testdir [file dirname $argv0] |
| source $testdir/tester.tcl |
| source $testdir/malloc_common.tcl |
| set ::testprefix atomic2 |
| |
| db close |
| if {[atomic_batch_write test.db]==0} { |
| puts "No f2fs atomic-batch-write support. Skipping tests..." |
| finish_test |
| return |
| } |
| |
| reset_db |
| |
| do_execsql_test 1.0 { |
| CREATE TABLE t1(x, y); |
| CREATE INDEX i1x ON t1(x); |
| CREATE INDEX i2x ON t1(y); |
| |
| WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) |
| INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; |
| } |
| |
| set setup [list \ |
| -injectstart at_injectstart \ |
| -injectstop at_injectstop \ |
| ] |
| |
| set ::at_fail 0 |
| set ::at_nfail 0 |
| |
| proc at_injectstart {iFail} { |
| set ::at_fail $iFail |
| set ::at_nfail 0 |
| } |
| proc at_injectstop {} { |
| set ::at_fail 0 |
| return $::at_nfail |
| } |
| |
| proc at_vfs_callback {method file z args} { |
| if {$::at_fail>0} { |
| incr ::at_fail -1 |
| if {$::at_fail==0} { |
| incr ::at_nfail |
| return SQLITE_IOERR |
| } elseif {$method=="xFileControl" && $z=="COMMIT_ATOMIC_WRITE"} { |
| set ::at_fail 0 |
| } |
| } |
| return SQLITE_OK |
| } |
| |
| testvfs tvfs -default 1 |
| tvfs script at_vfs_callback |
| tvfs filter {xFileControl xWrite} |
| |
| faultsim_save_and_close |
| |
| do_one_faultsim_test 2.0 {*}$setup -prep { |
| faultsim_restore_and_reopen |
| } -body { |
| execsql { |
| WITH s(i) AS ( SELECT 1 UNION ALL SELECT i+1 FROM s WHERE i<100 ) |
| INSERT INTO t1 SELECT randomblob(400), randomblob(400) FROM s; |
| } |
| } -test { |
| faultsim_test_result {0 {}} |
| |
| set res [execsql {SELECT count(*) FROM t1; PRAGMA integrity_check}] |
| if {$res!="200 ok"} { |
| error "expected {200 ok}, got $res" |
| } |
| } |
| |
| db close |
| tvfs delete |
| |
| finish_test |