gitlab.com/CoiaPrant/sqlite3@v1.19.1/testdata/tcl/walblock.test (about) 1 # 2015 Mar 17 2 # 3 # The author disclaims copyright to this source code. In place of 4 # a legal notice, here is a blessing: 5 # 6 # May you do good and not evil. 7 # May you find forgiveness for yourself and forgive others. 8 # May you share freely, never taking more than you give. 9 # 10 #*********************************************************************** 11 # 12 13 set testdir [file dirname $argv0] 14 source $testdir/tester.tcl 15 source $testdir/lock_common.tcl 16 source $testdir/wal_common.tcl 17 18 finish_test; return; # Feature currently not implemented. 19 ifcapable !wal {finish_test ; return } 20 if {$::tcl_platform(platform)!="unix"} { finish_test ; return } 21 set testprefix walblock 22 23 catch { db close } 24 testvfs tvfs -fullshm 1 25 foreach f [glob test.db*] { forcedelete $f } 26 27 sqlite3 db test.db -vfs tvfs 28 do_execsql_test 1.1.0 { 29 CREATE TABLE t1(x, y); 30 INSERT INTO t1 VALUES(1, 2); 31 INSERT INTO t1 VALUES(3, 4); 32 INSERT INTO t1 VALUES(5, 6); 33 PRAGMA journal_mode = wal; 34 INSERT INTO t1 VALUES(7, 8); 35 } {wal} 36 37 do_test 1.1.1 { 38 lsort [glob test.db*] 39 } {test.db test.db-shm test.db-wal} 40 41 do_test 1.1.2 { 42 set C [launch_testfixture] 43 testfixture $C { 44 sqlite3 db test.db 45 db eval { SELECT * FROM t1 } 46 } 47 } {1 2 3 4 5 6 7 8} 48 49 do_test 1.1.3 { 50 set ::out [list] 51 testfixture $C { 52 db eval { SELECT * FROM t1 } 53 } [list set ::out] 54 set ::out 55 } {} 56 57 do_test 1.1.4 { 58 vwait ::out 59 set ::out 60 } {1 2 3 4 5 6 7 8} 61 62 # 63 # Test that if a read client cannot read the wal-index header because a 64 # write client is in the middle of updating it, the reader blocks until 65 # the writer finishes. 66 # 67 # 1. Open a write transaction using client [db] in this process. 68 # 69 # 2. Attempt to commit the write transaction. Intercept the xShmBarrier() 70 # call made by the writer between updating the two copies of the 71 # wal-index header. 72 # 73 # 3. Within the xShmBarrier() callback, make an asynchronous request to 74 # the other process to read from the database. It should block, as it 75 # cannot get read the wal-index header. 76 # 77 # 4. Still in xShmBarrier(), wait for 5 seconds. Check that the other 78 # process has not answered the request. 79 # 80 # 5: Finish committing the transaction. Then wait for 0.5 seconds more. 81 # Ensure that the second process has by this stage read the database 82 # and that the snapshot it read included the transaction committed in 83 # step (4). 84 # 85 do_execsql_test 1.2.1 { 86 BEGIN; 87 INSERT INTO t1 VALUES(9, 10); 88 } {} 89 90 tvfs script barrier_callback 91 tvfs filter xShmBarrier 92 proc barrier_callback {method args} { 93 set ::out "" 94 testfixture $::C { db eval { SELECT * FROM t1 } } {set ::out} 95 96 do_test "1.2.2.(blocking 10 seconds)" { 97 set ::continue 0 98 after 10000 {set ::continue 1} 99 vwait ::continue 100 set ::out 101 } {} 102 } 103 104 execsql COMMIT 105 106 do_test "1.2.3.(blocking 0.5 seconds)" { 107 set ::continue 0 108 after 500 {set ::continue 1} 109 vwait ::continue 110 set ::out 111 } {1 2 3 4 5 6 7 8 9 10} 112 113 114 finish_test