Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Clarify an assert in sqlite3WalExclusiveMode(). |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
255850699ddbf4aad8cc3223aefbada3 |
User & Date: | dan 2010-06-04 18:38:00.000 |
Context
2010-06-05
| ||
11:53 | Add extra coverage test cases for wal.c. No changes to production code. (check-in: f9d4ae0e8c user: dan tags: trunk) | |
2010-06-04
| ||
18:38 | Clarify an assert in sqlite3WalExclusiveMode(). (check-in: 255850699d user: dan tags: trunk) | |
17:16 | Remove an unnecessary branch from wal.c. (check-in: 8e54786c9a user: dan tags: trunk) | |
Changes
Changes to src/wal.c.
︙ | ︙ | |||
2444 2445 2446 2447 2448 2449 2450 | ** not actually change anything. The pager uses this to see if it ** should acquire the database exclusive lock prior to invoking ** the op==1 case. */ int sqlite3WalExclusiveMode(Wal *pWal, int op){ int rc; assert( pWal->writeLock==0 ); | > | > > > > > > > < | < | 2444 2445 2446 2447 2448 2449 2450 2451 2452 2453 2454 2455 2456 2457 2458 2459 2460 2461 2462 2463 2464 2465 2466 2467 2468 2469 2470 2471 | ** not actually change anything. The pager uses this to see if it ** should acquire the database exclusive lock prior to invoking ** the op==1 case. */ int sqlite3WalExclusiveMode(Wal *pWal, int op){ int rc; assert( pWal->writeLock==0 ); /* pWal->readLock is usually set, but might be -1 if there was a ** prior error while attempting to acquire are read-lock. This cannot ** happen if the connection is actually in exclusive mode (as no xShmLock ** locks are taken in this case). Nor should the pager attempt to ** upgrade to exclusive-mode following such an error. */ assert( pWal->readLock>=0 || pWal->lockError ); assert( pWal->readLock>=0 || (op<=0 && pWal->exclusiveMode==0) ); if( op==0 ){ if( pWal->exclusiveMode ){ pWal->exclusiveMode = 0; if( walLockShared(pWal, WAL_READ_LOCK(pWal->readLock))!=SQLITE_OK ){ pWal->exclusiveMode = 1; } rc = pWal->exclusiveMode==0; }else{ /* Already in locking_mode=NORMAL */ rc = 0; } |
︙ | ︙ |
Changes to test/wal2.test.
︙ | ︙ | |||
417 418 419 420 421 422 423 424 425 426 427 428 429 430 | # # wal2-6.3.*: Changing back to rollback mode from WAL mode after setting # locking_mode=exclusive. # # wal2-6.4.*: Check that xShmLock calls are omitted in exclusive locking # mode. # do_test wal2-6.1.1 { file delete -force test.db test.db-wal test.db-journal sqlite3 db test.db execsql { Pragma Journal_Mode = Wal; Pragma Locking_Mode = Exclusive; } | > > > > > > | 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 | # # wal2-6.3.*: Changing back to rollback mode from WAL mode after setting # locking_mode=exclusive. # # wal2-6.4.*: Check that xShmLock calls are omitted in exclusive locking # mode. # # wal2-6.5.*: # # wal2-6.6.*: Check that if the xShmLock() to reaquire a WAL read-lock when # exiting exclusive mode fails (i.e. SQLITE_IOERR), then the # connection silently remains in exclusive mode. # do_test wal2-6.1.1 { file delete -force test.db test.db-wal test.db-journal sqlite3 db test.db execsql { Pragma Journal_Mode = Wal; Pragma Locking_Mode = Exclusive; } |
︙ | ︙ | |||
713 714 715 716 717 718 719 720 721 722 723 724 725 726 | SELECT * FROM t2; } } {normal exclusive I II III IV} do_test wal2-6.5.3 { execsql { PRAGMA wal_checkpoint } } {} db close #------------------------------------------------------------------------- # Test a theory about the checksum algorithm. Theory was false and this # test did not provoke a bug. # file delete -force test.db test.db-wal test.db-journal do_test wal2-7.1.1 { | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760 761 762 763 764 765 766 767 768 769 770 771 772 773 774 775 776 | SELECT * FROM t2; } } {normal exclusive I II III IV} do_test wal2-6.5.3 { execsql { PRAGMA wal_checkpoint } } {} db close proc lock_control {method filename handle spec} { foreach {start n op type} $spec break if {$op == "lock"} { return SQLITE_IOERR } return SQLITE_OK } do_test wal2-6.6.1 { testvfs T T script lock_control T filter {} sqlite3 db test.db -vfs T execsql { PRAGMA locking_mode = exclusive } execsql { INSERT INTO t2 VALUES('V', 'VI') } } {} do_test wal2-6.6.2 { execsql { PRAGMA locking_mode = normal } T filter xShmLock execsql { INSERT INTO t2 VALUES('VII', 'VIII') } } {} do_test wal2-6.6.3 { # At this point the connection should still be in exclusive-mode, even # though it tried to exit exclusive-mode when committing the INSERT # statement above. To exit exclusive mode, SQLite has to take a read-lock # on the WAL file using xShmLock(). Since that call failed, it remains # in exclusive mode. # sqlite3 db2 test.db -vfs T catchsql { SELECT * FROM t2 } db2 } {1 {database is locked}} do_test wal2-6.6.2 { db2 close T filter {} execsql { INSERT INTO t2 VALUES('IX', 'X') } } {} do_test wal2-6.6.3 { # This time, we have successfully exited exclusive mode. So the second # connection can read the database. sqlite3 db2 test.db -vfs T catchsql { SELECT * FROM t2 } db2 } {0 {I II III IV V VI VII VIII IX X}} db close db2 close T delete #------------------------------------------------------------------------- # Test a theory about the checksum algorithm. Theory was false and this # test did not provoke a bug. # file delete -force test.db test.db-wal test.db-journal do_test wal2-7.1.1 { |
︙ | ︙ |