1
0
mirror of https://github.com/sqlite/sqlite.git synced 2026-10-28 10:57:26 +03:00

Integrated proxy locking file support for WAL journal mode and double free fix

FossilOrigin-Name: fd4d38fa66de85676189ff4922fb1bf5f8cac9c4
This commit is contained in:
adam
2010-11-09 00:43:59 +00:00
parent 99f24349ea
commit 985be1bce6
13 changed files with 119 additions and 84 deletions

View File

@@ -76,6 +76,7 @@ set skipwaltests [expr {
[permutation]=="journaltest" || [permutation]=="inmemory_journal"
}]
ifcapable !wal { set skipwaltests 1 }
if {![wal_is_ok]} { set skipwaltests 1 }
if {!$skipwaltests} {
db close

View File

@@ -126,7 +126,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set lockpath
} {{:auto: (not held)}}
set lpp [pwd]/notmine
set lpp [exec mktemp -t fail]
do_test lock6-1.4.1 {
execsql "PRAGMA lock_proxy_file='$lpp'"
catchsql {
@@ -151,7 +151,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
catch {testfixture $::tf1 {db close}}
set lpp [pwd]/mine
set lpp [exec mktemp -t ok]
do_test lock6-1.6 {
execsql "PRAGMA lock_proxy_file='$lpp'"
execsql {

View File

@@ -27,7 +27,7 @@ db close
file delete -force test.db.lock
#####################################################################
ifcapable lock_proxy_pragmas {
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set ::using_proxy 0
foreach {name value} [array get env SQLITE_FORCE_PROXY_LOCKING] {
set ::using_proxy $value
@@ -135,7 +135,7 @@ ifcapable lock_proxy_pragmas {
file delete -force test.db
ifcapable lock_proxy_pragmas {
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set env(SQLITE_FORCE_PROXY_LOCKING) $::using_proxy
}

View File

@@ -1130,10 +1130,6 @@ if { $do_wal_tests } {
do_test pager1-7.1.$tn.2 { list $J $W } [list $js $ws]
}
}
} else {
do_test pager1-7.1.wal_is_not_ok {
execsql { PRAGMA journal_mode = WAL }
} {delete}
}
do_test pager1-7.2.1 {
@@ -2276,24 +2272,26 @@ do_test pager1.27.1 {
# the same database.
#
catch { db close }
do_multiclient_test tn {
do_test pager1-28.$tn.1 {
sql1 {
PRAGMA journal_mode = WAL;
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES('a', 'b');
}
} {wal}
do_test pager1-28.$tn.2 { sql2 { SELECT * FROM t1 } } {a b}
if {[wal_is_ok]} {
do_multiclient_test tn {
do_test pager1-28.$tn.1 {
sql1 {
PRAGMA journal_mode = WAL;
CREATE TABLE t1(a, b);
INSERT INTO t1 VALUES('a', 'b');
}
} {wal}
do_test pager1-28.$tn.2 { sql2 { SELECT * FROM t1 } } {a b}
do_test pager1-28.$tn.3 { sql1 { PRAGMA locking_mode=exclusive } } {exclusive}
do_test pager1-28.$tn.4 {
csql1 { BEGIN; INSERT INTO t1 VALUES('c', 'd'); }
} {1 {database is locked}}
code2 { db2 close ; sqlite3 db2 test.db }
do_test pager1-28.$tn.4 {
sql1 { INSERT INTO t1 VALUES('c', 'd'); COMMIT }
} {}
do_test pager1-28.$tn.3 { sql1 { PRAGMA locking_mode=exclusive } } {exclusive}
do_test pager1-28.$tn.4 {
csql1 { BEGIN; INSERT INTO t1 VALUES('c', 'd'); }
} {1 {database is locked}}
code2 { db2 close ; sqlite3 db2 test.db }
do_test pager1-28.$tn.4 {
sql1 { INSERT INTO t1 VALUES('c', 'd'); COMMIT }
} {}
}
}
#-------------------------------------------------------------------------

View File

@@ -1292,7 +1292,12 @@ sqlite3 dbX :memory:
dbX eval {PRAGMA temp_store_directory = ""}
dbX close
ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set skip_lock_proxy_tests [path_is_dos "."]
ifcapable !lock_proxy_pragmas&&prefer_proxy_locking {
set skip_lock_proxy_tests 1
}
if !$skip_lock_proxy_tests {
set sqlite_hostid_num 1
set using_proxy 0
@@ -1307,7 +1312,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
sqlite3 db test.db
# set lock proxy name and then query it via pragma interface
set lpp [pwd]/proxyfile_1
set lpp [exec mktemp -t 'proxy1']
do_test pragma-16.1 {
execsql "PRAGMA lock_proxy_file='$lpp'"
execsql "select * from sqlite_master"
@@ -1332,7 +1337,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
} $lpp
db2 close
set lpp2 [pwd]/proxyfile_2
set lpp2 [exec mktemp -t 'proxy2']
# 2nd database connection cannot override the lock proxy file
do_test pragma-16.3 {
@@ -1343,7 +1348,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
} db2
} {1 {database is locked}}
set lpp3 [pwd]/unused_proxyfile
set lpp3 [exec mktemp -t 'proxy3']
# lock proxy file can be renamed if no other connections are active
do_test pragma-16.4 {
@@ -1399,7 +1404,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
} {1 {database is locked}}
db2 close
set lpp4 [pwd]/proxyfile_4
set lpp4 [exec mktemp -t 'proxy4']
# check that db is unlocked after first host connection closes
do_test pragma-16.8.1 {
@@ -1428,7 +1433,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
} {1}
# ensure creating directories for a lock proxy file works
set lpp5 [pwd]/proxytest/sub/dir/lock
set lpp5 [exec mktemp -d -t "proxy5"]/sub/dir/lock
db close
file delete -force proxytest
do_test pragma-16.10.1 {
@@ -1437,7 +1442,7 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
set lockpath2 [execsql {
PRAGMA lock_proxy_file;
} db]
string match "*proxytest/sub/dir/lock" $lockpath2
string match "*sub/dir/lock" $lockpath2
} {1}
# ensure that after deleting the path, setting ":auto:" works correctly
@@ -1445,12 +1450,12 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
file delete -force proxytest
do_test pragma-16.10.2 {
sqlite3 db proxytest.db
set lockpath2 [execsql {
set lockpath3 [execsql {
PRAGMA lock_proxy_file=":auto:";
create table if not exists pt(y);
PRAGMA lock_proxy_file;
} db]
string match "*proxytest/sub/dir/lock" $lockpath2
string match "*sub/dir/lock" $lockpath3
} {1}
# ensure that if the path can not be created (file instead of dir)
@@ -1469,17 +1474,17 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
} {1}
# make sure we can deal with ugly file paths correctly
set lpp6 [pwd]/./././////./proxytest/../proxytest/sub/dir/lock
set lpp6 [exec mktemp -d -t "proxy6"]/./././////./proxytest/../proxytest/sub/dir/lock
db close
file delete -force proxytest
do_test pragma-16.10.4 {
sqlite3 db proxytest.db
execsql "PRAGMA lock_proxy_file='$lpp6'"
set lockpath2 [execsql {
set lockpath4 [execsql {
create table if not exists aa(bb);
PRAGMA lock_proxy_file;
} db]
string match "*proxytest/sub/dir/lock" $lockpath2
string match "*proxytest/sub/dir/lock" $lockpath4
} {1}
# ensure that if the path can not be created (perm), setting :auto: deals
@@ -1496,12 +1501,12 @@ ifcapable lock_proxy_pragmas&&prefer_proxy_locking {
file mkdir proxytest
file attributes proxytest -permission 0000
sqlite3 db proxytest.db
set lockpath2 [execsql {
set lockpath5 [execsql {
PRAGMA lock_proxy_file=":auto:";
create table if not exists cc(bb);
PRAGMA lock_proxy_file;
} db]
string match "*proxytest.db:auto:" $lockpath2
string match "*proxytest.db:auto:" $lockpath5
} {1}
# ensure that if the path can not be created, locking fails

View File

@@ -1183,7 +1183,7 @@ proc forced_proxy_locking {} {
proc wal_is_ok {} {
if { [forced_proxy_locking] } {
return 0
return 1
}
if { ![path_is_local "."] } {
return 0

View File

@@ -617,7 +617,7 @@ T delete
#-------------------------------------------------------------------------
#
do_test wal3-8.1 {
file delete -force test.db test.db-journal test.db wal
file delete -force test.db test.db-journal test.db wal .test.db-conch
sqlite3 db test.db
sqlite3 db2 test.db
execsql {

View File

@@ -35,7 +35,7 @@ ifcapable !wal {
finish_test
return
}
if { ![wal_is_ok] } {
if { ![wal_is_ok] && ![path_is_dos "."]} {
do_test walmode-0.1 {
execsql { PRAGMA journal_mode = wal }
} {delete}

View File

@@ -15,6 +15,13 @@
set testdir [file dirname $argv0]
source $testdir/tester.tcl
ifcapable !wal {finish_test ; return }
if { ![wal_is_ok] } {
finish_test
return
}
db close
set ::enable_shared_cache [sqlite3_enable_shared_cache 1]