Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | In shared-cache mode, do not allow one connection to checkpoint a database while a second connection is reading or writing the same shared-cache. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
e75b52d156905ce16bedb94f65c01a46 |
User & Date: | dan 2010-08-02 10:47:06.000 |
Context
2010-08-02
| ||
10:59 | Modify wal2.test to disable tests requiring TCL 8.5 if the test harness is compiled using TCL 8.4. (check-in: 016486c7d5 user: drh tags: trunk) | |
10:47 | In shared-cache mode, do not allow one connection to checkpoint a database while a second connection is reading or writing the same shared-cache. (check-in: e75b52d156 user: dan tags: trunk) | |
2010-08-01
| ||
22:41 | Fix a typo in an error message of the TCL interface. (check-in: 8eadd7b87b user: drh tags: trunk) | |
Changes
Changes to src/btree.c.
︙ | ︙ | |||
7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 | /* ** Return non-zero if a transaction is active. */ int sqlite3BtreeIsInTrans(Btree *p){ assert( p==0 || sqlite3_mutex_held(p->db->mutex) ); return (p && (p->inTrans==TRANS_WRITE)); } /* ** Return non-zero if a read (or write) transaction is active. */ int sqlite3BtreeIsInReadTrans(Btree *p){ assert( p ); assert( sqlite3_mutex_held(p->db->mutex) ); | > > > > > > > > > > > > > > > > > > > > > > > | 7843 7844 7845 7846 7847 7848 7849 7850 7851 7852 7853 7854 7855 7856 7857 7858 7859 7860 7861 7862 7863 7864 7865 7866 7867 7868 7869 7870 7871 7872 7873 7874 7875 7876 7877 7878 7879 | /* ** Return non-zero if a transaction is active. */ int sqlite3BtreeIsInTrans(Btree *p){ assert( p==0 || sqlite3_mutex_held(p->db->mutex) ); return (p && (p->inTrans==TRANS_WRITE)); } #ifndef SQLITE_OMIT_WAL /* ** Run a checkpoint on the Btree passed as the first argument. ** ** Return SQLITE_LOCKED if this or any other connection has an open ** transaction on the shared-cache the argument Btree is connected to. */ int sqlite3BtreeCheckpoint(Btree *p){ int rc = SQLITE_OK; if( p ){ BtShared *pBt = p->pBt; sqlite3BtreeEnter(p); if( pBt->inTransaction!=TRANS_NONE ){ rc = SQLITE_LOCKED; }else{ rc = sqlite3PagerCheckpoint(pBt->pPager); } sqlite3BtreeLeave(p); } return rc; } #endif /* ** Return non-zero if a read (or write) transaction is active. */ int sqlite3BtreeIsInReadTrans(Btree *p){ assert( p ); assert( sqlite3_mutex_held(p->db->mutex) ); |
︙ | ︙ |
Changes to src/btree.h.
︙ | ︙ | |||
196 197 198 199 200 201 202 203 204 205 206 207 208 209 | int sqlite3BtreeCount(BtCursor *, i64 *); #endif #ifdef SQLITE_TEST int sqlite3BtreeCursorInfo(BtCursor*, int*, int); void sqlite3BtreeCursorList(Btree*); #endif /* ** If we are not using shared cache, then there is no need to ** use mutexes to access the BtShared structures. So make the ** Enter and Leave procedures no-ops. */ #ifndef SQLITE_OMIT_SHARED_CACHE | > > > > | 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 | int sqlite3BtreeCount(BtCursor *, i64 *); #endif #ifdef SQLITE_TEST int sqlite3BtreeCursorInfo(BtCursor*, int*, int); void sqlite3BtreeCursorList(Btree*); #endif #ifndef SQLITE_OMIT_WAL int sqlite3BtreeCheckpoint(Btree*); #endif /* ** If we are not using shared cache, then there is no need to ** use mutexes to access the BtShared structures. So make the ** Enter and Leave procedures no-ops. */ #ifndef SQLITE_OMIT_SHARED_CACHE |
︙ | ︙ |
Changes to src/main.c.
︙ | ︙ | |||
1304 1305 1306 1307 1308 1309 1310 | int rc = SQLITE_OK; /* Return code */ int i; /* Used to iterate through attached dbs */ assert( sqlite3_mutex_held(db->mutex) ); for(i=0; i<db->nDb && rc==SQLITE_OK; i++){ if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){ | | < < < < < < < < < | 1304 1305 1306 1307 1308 1309 1310 1311 1312 1313 1314 1315 1316 1317 1318 | int rc = SQLITE_OK; /* Return code */ int i; /* Used to iterate through attached dbs */ assert( sqlite3_mutex_held(db->mutex) ); for(i=0; i<db->nDb && rc==SQLITE_OK; i++){ if( i==iDb || iDb==SQLITE_MAX_ATTACHED ){ rc = sqlite3BtreeCheckpoint(db->aDb[i].pBt); } } return rc; } #endif /* SQLITE_OMIT_WAL */ |
︙ | ︙ |
Added test/walshared.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 | # 2010 August 2 # # 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 the operation of the library in # "PRAGMA journal_mode=WAL" mode with shared-cache turned on. # set testdir [file dirname $argv0] source $testdir/tester.tcl db close set ::enable_shared_cache [sqlite3_enable_shared_cache 1] sqlite3 db test.db sqlite3 db2 test.db do_test walshared-1.0 { execsql { PRAGMA cache_size = 10; PRAGMA journal_mode = WAL; CREATE TABLE t1(a PRIMARY KEY, b UNIQUE); INSERT INTO t1 VALUES(randomblob(100), randomblob(200)); } } {wal} do_test walshared-1.1 { execsql { BEGIN; INSERT INTO t1 VALUES(randomblob(100), randomblob(200)); INSERT INTO t1 SELECT randomblob(100), randomblob(200) FROM t1; INSERT INTO t1 SELECT randomblob(100), randomblob(200) FROM t1; INSERT INTO t1 SELECT randomblob(100), randomblob(200) FROM t1; } } {} do_test walshared-1.2 { catchsql { PRAGMA wal_checkpoint } } {1 {database table is locked}} do_test walshared-1.3 { catchsql { PRAGMA wal_checkpoint } db2 } {1 {database table is locked}} do_test walshared-1.4 { execsql { COMMIT } execsql { PRAGMA integrity_check } db2 } {ok} sqlite3_enable_shared_cache $::enable_shared_cache finish_test |