blob: 23167a88305531c21dc67dffd7dee6bc87874c8c [file] [log] [blame]
dan363fc9e2015-03-17 16:01:29 +00001# 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
13set testdir [file dirname $argv0]
14source $testdir/tester.tcl
15source $testdir/lock_common.tcl
16source $testdir/wal_common.tcl
17
drh62ca61e2015-04-03 20:33:33 +000018finish_test; return; # Feature currently not implemented.
dan363fc9e2015-03-17 16:01:29 +000019ifcapable !wal {finish_test ; return }
20if {$::tcl_platform(platform)!="unix"} { finish_test ; return }
21set testprefix walblock
22
23catch { db close }
24testvfs tvfs -fullshm 1
25foreach f [glob test.db*] { forcedelete $f }
26
27sqlite3 db test.db -vfs tvfs
28do_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
37do_test 1.1.1 {
38 lsort [glob test.db*]
39} {test.db test.db-shm test.db-wal}
40
41do_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
49do_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
57do_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#
85do_execsql_test 1.2.1 {
86 BEGIN;
87 INSERT INTO t1 VALUES(9, 10);
88} {}
89
90tvfs script barrier_callback
91tvfs filter xShmBarrier
92proc barrier_callback {method args} {
93 set ::out ""
94 testfixture $::C { db eval { SELECT * FROM t1 } } {set ::out}
95
dand2f99332015-03-21 16:40:24 +000096 do_test "1.2.2.(blocking 10 seconds)" {
dan363fc9e2015-03-17 16:01:29 +000097 set ::continue 0
dand2f99332015-03-21 16:40:24 +000098 after 10000 {set ::continue 1}
dan363fc9e2015-03-17 16:01:29 +000099 vwait ::continue
100 set ::out
101 } {}
102}
103
104execsql COMMIT
105
106do_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
114finish_test