Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Fix a problem with wrapping the log file in server mode. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | server-edition |
Files: | files | file ages | folders |
SHA3-256: |
270b7d1eacb57827465946262b31c5c8 |
User & Date: | dan 2017-05-09 16:32:19.219 |
Context
2017-05-10
| ||
13:46 | Use a blocking call to obtain the wal-mode WRITER lock in some cases. (check-in: 4464ca1d68 user: dan tags: server-edition) | |
2017-05-09
| ||
16:32 | Fix a problem with wrapping the log file in server mode. (check-in: 270b7d1eac user: dan tags: server-edition) | |
2017-05-08
| ||
20:15 | Add some support for wal mode to the hack on this branch. (check-in: b733afc1d0 user: dan tags: server-edition) | |
Changes
Changes to src/wal.c.
︙ | ︙ | |||
2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 | ** unchanged. ** ** SQLITE_OK is returned if no error is encountered (regardless of whether ** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned ** if an error occurs. */ static int walRestartLog(Wal *pWal){ int rc = SQLITE_OK; int cnt; | > | | > | 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 | ** unchanged. ** ** SQLITE_OK is returned if no error is encountered (regardless of whether ** or not pWal->hdr.mxFrame is modified). An SQLite error code is returned ** if an error occurs. */ static int walRestartLog(Wal *pWal){ volatile WalCkptInfo *pInfo = walCkptInfo(pWal); int rc = SQLITE_OK; int cnt; if( pWal->readLock==0 || (walIsServer(pWal) && pInfo->nBackfill==pWal->hdr.mxFrame) ){ assert( pInfo->nBackfill==pWal->hdr.mxFrame ); if( pInfo->nBackfill>0 ){ u32 salt1; sqlite3_randomness(4, &salt1); rc = walLockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); if( rc==SQLITE_OK ){ /* If all readers are using WAL_READ_LOCK(0) (in other words if no |
︙ | ︙ | |||
2924 2925 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 | ** to handle if this transaction is rolled back. */ walRestartHdr(pWal, salt1); walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); }else if( rc!=SQLITE_BUSY ){ return rc; } } walUnlockShared(pWal, WAL_READ_LOCK(0)); pWal->readLock = -1; cnt = 0; do{ int notUsed; rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); }while( rc==WAL_RETRY ); | > | 2926 2927 2928 2929 2930 2931 2932 2933 2934 2935 2936 2937 2938 2939 2940 | ** to handle if this transaction is rolled back. */ walRestartHdr(pWal, salt1); walUnlockExclusive(pWal, WAL_READ_LOCK(1), WAL_NREADER-1); }else if( rc!=SQLITE_BUSY ){ return rc; } } if( walIsServer(pWal) ) return rc; walUnlockShared(pWal, WAL_READ_LOCK(0)); pWal->readLock = -1; cnt = 0; do{ int notUsed; rc = walTryBeginRead(pWal, ¬Used, 1, ++cnt); }while( rc==WAL_RETRY ); |
︙ | ︙ |
Changes to test/serverwal.test.
︙ | ︙ | |||
32 33 34 35 36 37 38 39 40 41 42 43 44 45 | lsort [glob test.db*] } {test.db test.db-hma test.db-shm test.db-wal} do_test 1.4 { db close glob test.db* } {test.db} # Two concurrent transactions. # do_test 2.0 { sqlite3 db test.db sqlite3 db2 test.db db eval { CREATE TABLE t2(a, b); | > | 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | lsort [glob test.db*] } {test.db test.db-hma test.db-shm test.db-wal} do_test 1.4 { db close glob test.db* } {test.db} #------------------------------------------------------------------------- # Two concurrent transactions. # do_test 2.0 { sqlite3 db test.db sqlite3 db2 test.db db eval { CREATE TABLE t2(a, b); |
︙ | ︙ | |||
55 56 57 58 59 60 61 62 | INSERT INTO t2 VALUES(1, 2); } db2 } {} do_test 2.2 { execsql COMMIT db execsql COMMIT db2 } {} | > > > | > > > > > > > > > > > > > > > > > > > > > > | 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 | INSERT INTO t2 VALUES(1, 2); } db2 } {} do_test 2.2 { execsql COMMIT db execsql COMMIT db2 } {} db close #------------------------------------------------------------------------- # That the wal file can be wrapped around. # reset_db do_execsql_test 3.0 { PRAGMA journal_mode = wal; CREATE TABLE ttt(a, b); INSERT INTO ttt VALUES(1, 2); INSERT INTO ttt VALUES(3, 4); INSERT INTO ttt VALUES(5, 6); INSERT INTO ttt VALUES(7, 8); INSERT INTO ttt VALUES(9, 10); } {wal} do_test 3.1 { set N [file size test.db-wal] execsql { PRAGMA wal_checkpoint; INSERT INTO ttt VALUES(11, 12); INSERT INTO ttt VALUES(13, 14); } expr {$N == [file size test.db-wal]} } {1} finish_test |