Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Add a simple test case for inter-process locking. (CVS 1752) |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
b0fcc99d227c061203fb1e0f4583b667 |
User & Date: | danielk1977 2004-06-28 08:25:48.000 |
Context
2004-06-28
| ||
11:52 | Get all tests working under win2k. (CVS 1753) (check-in: 168112c8b7 user: drh tags: trunk) | |
08:25 | Add a simple test case for inter-process locking. (CVS 1752) (check-in: b0fcc99d22 user: danielk1977 tags: trunk) | |
04:52 | Fix some problems with multi-file transaction rollback. (CVS 1751) (check-in: 06e8e30b24 user: danielk1977 tags: trunk) | |
Changes
Changes to src/os_unix.c.
︙ | ︙ | |||
792 793 794 795 796 797 798 | /* A PENDING lock is needed before acquiring a SHARED lock and before ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will ** be released. */ if( locktype==SHARED_LOCK || (locktype==EXCLUSIVE_LOCK && id->locktype<PENDING_LOCK) ){ | | | 792 793 794 795 796 797 798 799 800 801 802 803 804 805 806 | /* A PENDING lock is needed before acquiring a SHARED lock and before ** acquiring an EXCLUSIVE lock. For the SHARED lock, the PENDING will ** be released. */ if( locktype==SHARED_LOCK || (locktype==EXCLUSIVE_LOCK && id->locktype<PENDING_LOCK) ){ lock.l_type = (locktype==SHARED_LOCK?F_RDLCK:F_WRLCK); lock.l_start = PENDING_BYTE; s = fcntl(id->h, F_SETLK, &lock); if( s ){ rc = (errno==EINVAL) ? SQLITE_NOLFS : SQLITE_BUSY; goto end_lock; } } |
︙ | ︙ |
Added test/lock2.test.
> > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 | # 2001 September 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 script is database locks between competing processes. # # $Id: lock2.test,v 1.1 2004/06/28 08:25:48 danielk1977 Exp $ set testdir [file dirname $argv0] source $testdir/tester.tcl # Launch another testfixture process to be controlled by this one. A # channel name is returned that may be passed as the first argument to proc # 'testfixture' to execute a command. The child testfixture process is shut # down by closing the channel. proc launch_testfixture {} { set chan [open "|[file join . testfixture] tf_main.tcl" r+] fconfigure $chan -buffering line return $chan } # Execute a command in a child testfixture process, connected by two-way # channel $chan. Return the result of the command, or an error message. proc testfixture {chan cmd} { puts $chan $cmd puts $chan OVER set r "" while { 1 } { set line [gets $chan] if { $line == "OVER" } { return $r } append r $line } } # Write the main loop for the child testfixture processes into file # tf_main.tcl. The parent (this script) interacts with the child processes # via a two way pipe. The parent writes a script to the stdin of the child # process, followed by the word "OVER" on a line of it's own. The child # process evaluates the script and writes the results to stdout, followed # by an "OVER" of its own. set f [open tf_main.tcl w] puts $f { set l [open log w] set script "" while {![eof stdin]} { flush stdout set line [gets stdin] puts $l "READ $line" if { $line == "OVER" } { catch {eval $script} result puts $result puts $l "WRITE $result" puts OVER puts $l "WRITE OVER" flush stdout set script "" } else { append script $line append script " ; " } } close $l } close $f # Simple locking test case: # # lock2-1.1: Connect a second process to the database. # lock2-1.2: Establish a RESERVED lock with this process. # lock2-1.3: Get a SHARED lock with the second process. # lock2-1.4: Try for a RESERVED lock with process 2. This fails. # lock2-1.5: Try to upgrade the first process to EXCLUSIVE, this fails so # it gets PENDING. # lock2-1.6: Release the SHARED lock held by the second process. # lock2-1.7: Attempt to reaquire a SHARED lock with the second process. # this fails due to the PENDING lock. # lock2-1.8: Ensure the first process can now upgrade to EXCLUSIVE. # do_test lock2-1.1 { set ::tf1 [launch_testfixture] testfixture $::tf1 { sqlite3 db test.db db eval {select * from sqlite_master} } } {} do_test lock2-1.2 { execsql { BEGIN; CREATE TABLE abc(a, b, c); } } {} do_test lock2-1.3 { testfixture $::tf1 { db eval { BEGIN; SELECT * FROM sqlite_master; } } } {} do_test lock2-1.4 { testfixture $::tf1 { db eval { CREATE TABLE def(d, e, f) } } } {database is locked} do_test lock2-1.5 { catchsql { COMMIT; } } {1 {database is locked}} do_test lock2-1.6 { testfixture $::tf1 { db eval { SELECT * FROM sqlite_master; COMMIT; } } } {} do_test lock2-1.7 { testfixture $::tf1 { db eval { BEGIN; SELECT * FROM sqlite_master; } } } {database is locked} do_test lock2-1.8 { catchsql { COMMIT; } } {0 {}} do_test lock2-1.9 { execsql { SELECT * FROM sqlite_master; } } {table abc abc 2 {CREATE TABLE abc(a, b, c)}} do_test lock2-1.10 { testfixture $::tf1 { db eval { SELECT * FROM sqlite_master; } } } {table abc abc 2 {CREATE TABLE abc(a, b, c)}} finish_test |