Many hyperlinks are disabled.
Use anonymous login
to enable hyperlinks.
Overview
Comment: | Avoid unnecessarily reseting the pager cache after committing a transaction that takes advantage of the SQLITE_IOCAP_ATOMIC related optimization. |
---|---|
Downloads: | Tarball | ZIP archive |
Timelines: | family | ancestors | descendants | both | trunk |
Files: | files | file ages | folders |
SHA1: |
c47144e98c0a0f9e09780c945de10c57 |
User & Date: | dan 2013-04-26 18:36:58.055 |
Context
2013-04-26
| ||
19:33 | Fix a formatting typo in a comment. No changes to code. (check-in: 7a97226ffe user: drh tags: trunk) | |
18:36 | Avoid unnecessarily reseting the pager cache after committing a transaction that takes advantage of the SQLITE_IOCAP_ATOMIC related optimization. (check-in: c47144e98c user: dan tags: trunk) | |
17:00 | Avoid using posix_fallocate() in WAL mode, as it is not supported by all file-systems. (check-in: 1bbb4be1a2 user: dan tags: trunk) | |
Changes
Changes to src/pager.c.
︙ | ︙ | |||
5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 | assert( pPager->dbFileSize>0 ); CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf); if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); pPager->aStat[PAGER_STAT_WRITE]++; } if( rc==SQLITE_OK ){ pPager->changeCountDone = 1; } }else{ pPager->changeCountDone = 1; } } | > > > > > | 5923 5924 5925 5926 5927 5928 5929 5930 5931 5932 5933 5934 5935 5936 5937 5938 5939 5940 5941 | assert( pPager->dbFileSize>0 ); CODEC2(pPager, pPgHdr->pData, 1, 6, rc=SQLITE_NOMEM, zBuf); if( rc==SQLITE_OK ){ rc = sqlite3OsWrite(pPager->fd, zBuf, pPager->pageSize, 0); pPager->aStat[PAGER_STAT_WRITE]++; } if( rc==SQLITE_OK ){ /* Update the pager's copy of the change-counter. Otherwise, the ** next time a read transaction is opened the cache will be ** flushed (as the change-counter values will not match). */ const void *pCopy = (const void *)&((const char *)zBuf)[24]; memcpy(&pPager->dbFileVers, pCopy, sizeof(pPager->dbFileVers)); pPager->changeCountDone = 1; } }else{ pPager->changeCountDone = 1; } } |
︙ | ︙ |
Changes to test/io.test.
︙ | ︙ | |||
34 35 36 37 38 39 40 41 42 43 44 45 46 47 | # io-4.* - Test the IO traffic enhancements triggered when the # IOCAP_SAFE_APPEND device capability flag is set (fewer # fsync() calls on the journal file, no need to set nRec # field in the single journal header). # # io-5.* - Test that the default page size is selected and used # correctly. # set ::nWrite 0 proc nWrite {db} { set bt [btree_from_db $db] db_enter $db array set stats [btree_pager_stats $bt] | > > > > | 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | # io-4.* - Test the IO traffic enhancements triggered when the # IOCAP_SAFE_APPEND device capability flag is set (fewer # fsync() calls on the journal file, no need to set nRec # field in the single journal header). # # io-5.* - Test that the default page size is selected and used # correctly. # # io-6.* - Test that the pager-cache is not being flushed unnecessarily # after a transaction that uses the special atomic-write path # is committed. # set ::nWrite 0 proc nWrite {db} { set bt [btree_from_db $db] db_enter $db array set stats [btree_pager_stats $bt] |
︙ | ︙ | |||
560 561 562 563 564 565 566 567 568 569 | do_test io-5.$tn { execsql { CREATE TABLE abc(a, b, c); } expr {[file size test.db]/2} } $pgsize } sqlite3_simulate_device -char {} -sectorsize 0 finish_test | > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > > | 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 | do_test io-5.$tn { execsql { CREATE TABLE abc(a, b, c); } expr {[file size test.db]/2} } $pgsize } #---------------------------------------------------------------------- # do_test io-6.1 { db close sqlite3_simulate_device -char atomic forcedelete test.db sqlite3 db test.db -vfs devsym execsql { PRAGMA mmap_size = 0; PRAGMA page_size = 1024; CREATE TABLE t1(x); CREATE TABLE t2(x); CREATE TABLE t3(x); CREATE INDEX i3 ON t3(x); INSERT INTO t3 VALUES(randomblob(100)); INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; INSERT INTO t3 SELECT randomblob(100) FROM t3; } db_save_and_close } {} foreach {tn sql} { 1 { BEGIN; INSERT INTO t1 VALUES('123'); INSERT INTO t2 VALUES('456'); COMMIT; } 2 { BEGIN; INSERT INTO t1 VALUES('123'); COMMIT; } } { db_restore sqlite3 db test.db -vfs devsym execsql { PRAGMA mmap_size = 0; SELECT x FROM t3 ORDER BY rowid; SELECT x FROM t3 ORDER BY x; } do_execsql_test 6.2.$tn.1 { PRAGMA integrity_check } {ok} do_execsql_test 6.2.$tn.2 $sql # Corrupt the database file on disk. This should not matter for the # purposes of the following "PRAGMA integrity_check", as the entire # database should be cached in the pager-cache. If corruption is # reported, it indicates that executing $sql caused the pager cache # to be flushed. Which is a bug. hexio_write test.db [expr 1024 * 5] [string repeat 00 2048] do_execsql_test 6.2.$tn.3 { PRAGMA integrity_check } {ok} } sqlite3_simulate_device -char {} -sectorsize 0 finish_test |