mirror of
https://github.com/sqlite/sqlite.git
synced 2025-08-05 15:55:57 +03:00
Split SQLITE_ENABLE_ATOMIC_WRITE into two options - the original and
SQLITE_ENABLE_BATCH_ATOMIC_WRITE. FossilOrigin-Name: 7eb9bf2c5b42c39901fd571553c1f70aa5a9dac71fdc8e318b3063b928ad58f7
This commit is contained in:
19
manifest
19
manifest
@@ -1,5 +1,5 @@
|
|||||||
C Add\ssupport\sfor\sF2FS\satomic\swrites.\sUntested\sat\sthis\spoint.
|
C Split\sSQLITE_ENABLE_ATOMIC_WRITE\sinto\stwo\soptions\s-\sthe\soriginal\sand\nSQLITE_ENABLE_BATCH_ATOMIC_WRITE.
|
||||||
D 2017-07-20T19:49:14.731
|
D 2017-07-20T21:00:03.793
|
||||||
F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
|
F Makefile.in d9873c9925917cca9990ee24be17eb9613a668012c85a343aef7e5536ae266e8
|
||||||
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434
|
||||||
F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
|
F Makefile.msc 02b469e9dcd5b7ee63fc1fb05babc174260ee4cfa4e0ef2e48c3c6801567a016
|
||||||
@@ -424,7 +424,7 @@ F src/mem1.c c12a42539b1ba105e3707d0e628ad70e611040d8f5e38cf942cee30c867083de
|
|||||||
F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
|
F src/mem2.c f1940d9e91948dd6a908fbb9ce3835c36b5d83c3
|
||||||
F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a
|
F src/mem3.c 8768ac94694f31ffaf8b4d0ea5dc08af7010a35a
|
||||||
F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944
|
F src/mem5.c 9bf955937b07f8c32541c8a9991f33ce3173d944
|
||||||
F src/memjournal.c 3f1d95947cd39b35a6375b2ca384bac904f16353bd54995e9bff78161463ac1c
|
F src/memjournal.c 8669a499261d2c51ab2eb6c10b3b2e5085e559457ea630140de7f3521077daaa
|
||||||
F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81
|
F src/msvc.h 4942752b6a253116baaa8de75256c51a459a5e81
|
||||||
F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c
|
F src/mutex.c 8e45800ee78e0cd1f1f3fe8e398853307f4a085c
|
||||||
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
|
F src/mutex.h 779d588e3b7756ec3ecf7d78cde1d84aba414f85
|
||||||
@@ -439,7 +439,7 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586
|
|||||||
F src/os_unix.c eca7004f2cde959ed233951256e22aa4169c72f69b831e14276d0bdded4372f5
|
F src/os_unix.c eca7004f2cde959ed233951256e22aa4169c72f69b831e14276d0bdded4372f5
|
||||||
F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a
|
F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a
|
||||||
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a
|
||||||
F src/pager.c 7ab906445447d5374971986de3525350d18c0e256723cd5a2456a429cd372f6c
|
F src/pager.c a42704980ed4ce38ed75981acf12a4d34bea2419306c7ffe26940869c458df48
|
||||||
F src/pager.h f2a99646c5533ffe11afa43e9e0bea74054e4efa
|
F src/pager.h f2a99646c5533ffe11afa43e9e0bea74054e4efa
|
||||||
F src/parse.y e384cb73f99e1b074085c974b37f4d830e885359e4b60837e30f7d67c16ba65b
|
F src/parse.y e384cb73f99e1b074085c974b37f4d830e885359e4b60837e30f7d67c16ba65b
|
||||||
F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870
|
F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870
|
||||||
@@ -458,7 +458,7 @@ F src/shell.c.in b5725acacba95ccefa57b6d068f710e29ba8239c3aa704628a1902a1f729c17
|
|||||||
F src/sqlite.h.in 51541eacdbbd26afcb5933ea4fadf9952fa9b3e4d7277c2b7983bf2b4a09a0bf
|
F src/sqlite.h.in 51541eacdbbd26afcb5933ea4fadf9952fa9b3e4d7277c2b7983bf2b4a09a0bf
|
||||||
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8
|
||||||
F src/sqlite3ext.h 967154985ed2ae62f90d9029bb5b5071793d847f1696a2ebe9e8cc0b042ae60b
|
F src/sqlite3ext.h 967154985ed2ae62f90d9029bb5b5071793d847f1696a2ebe9e8cc0b042ae60b
|
||||||
F src/sqliteInt.h 96197a18f041b9ab99e6cee0db39dbf771ac7762d9f0f63d9e719285f0478664
|
F src/sqliteInt.h 437217b5d22e9c8f3c53f90324915a535f649262b1281eaabed4e31653576b51
|
||||||
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
F src/sqliteLimit.h 1513bfb7b20378aa0041e7022d04acb73525de35b80b252f1b83fedb4de6a76b
|
||||||
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
|
F src/status.c a9e66593dfb28a9e746cba7153f84d49c1ddc4b1
|
||||||
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
F src/table.c b46ad567748f24a326d9de40e5b9659f96ffff34
|
||||||
@@ -1637,10 +1637,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93
|
|||||||
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc
|
||||||
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e
|
||||||
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0
|
||||||
P a90c062d46c63a1e6f83064b1c5afb26a16e93b6ee8620ca46d169fdb325c488
|
P 416973ede3bde8567d1f2699728f72352979e054ef988d1c1e1cfe4290f6f8b8
|
||||||
R 83821cb44cbf5af73c5132cb66d20c9f
|
R 1638e645768cee73f97e29d4fc63d373
|
||||||
T *branch * f2fs-support
|
|
||||||
T *sym-f2fs-support *
|
|
||||||
T -sym-trunk *
|
|
||||||
U dan
|
U dan
|
||||||
Z 66fb297e5afae668d4c6aa465d37e6d1
|
Z d68435e6ed708ea00daef410ca52596e
|
||||||
|
@@ -1 +1 @@
|
|||||||
416973ede3bde8567d1f2699728f72352979e054ef988d1c1e1cfe4290f6f8b8
|
7eb9bf2c5b42c39901fd571553c1f70aa5a9dac71fdc8e318b3063b928ad58f7
|
@@ -96,7 +96,8 @@ static int memjrnlRead(
|
|||||||
int iChunkOffset;
|
int iChunkOffset;
|
||||||
FileChunk *pChunk;
|
FileChunk *pChunk;
|
||||||
|
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
#ifdef SQLITE_ENABLE_ATOMIC_WRITE \
|
||||||
|
|| defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
|
||||||
if( (iAmt+iOfst)>p->endpoint.iOffset ){
|
if( (iAmt+iOfst)>p->endpoint.iOffset ){
|
||||||
return SQLITE_IOERR_SHORT_READ;
|
return SQLITE_IOERR_SHORT_READ;
|
||||||
}
|
}
|
||||||
@@ -215,7 +216,8 @@ static int memjrnlWrite(
|
|||||||
** atomic-write optimization. In this case the first 28 bytes of the
|
** atomic-write optimization. In this case the first 28 bytes of the
|
||||||
** journal file may be written as part of committing the transaction. */
|
** journal file may be written as part of committing the transaction. */
|
||||||
assert( iOfst==p->endpoint.iOffset || iOfst==0 );
|
assert( iOfst==p->endpoint.iOffset || iOfst==0 );
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
#ifdef SQLITE_ENABLE_ATOMIC_WRITE \
|
||||||
|
|| defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
|
||||||
if( iOfst==0 && p->pFirst ){
|
if( iOfst==0 && p->pFirst ){
|
||||||
assert( p->nChunkSize>iAmt );
|
assert( p->nChunkSize>iAmt );
|
||||||
memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt);
|
memcpy((u8*)p->pFirst->zChunk, zBuf, iAmt);
|
||||||
@@ -384,7 +386,8 @@ void sqlite3MemJournalOpen(sqlite3_file *pJfd){
|
|||||||
sqlite3JournalOpen(0, 0, pJfd, 0, -1);
|
sqlite3JournalOpen(0, 0, pJfd, 0, -1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \
|
||||||
|
|| defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
|
||||||
/*
|
/*
|
||||||
** If the argument p points to a MemJournal structure that is not an
|
** If the argument p points to a MemJournal structure that is not an
|
||||||
** in-memory-only journal file (i.e. is one that was opened with a +ve
|
** in-memory-only journal file (i.e. is one that was opened with a +ve
|
||||||
@@ -394,9 +397,11 @@ void sqlite3MemJournalOpen(sqlite3_file *pJfd){
|
|||||||
int sqlite3JournalCreate(sqlite3_file *pJfd){
|
int sqlite3JournalCreate(sqlite3_file *pJfd){
|
||||||
int rc = SQLITE_OK;
|
int rc = SQLITE_OK;
|
||||||
MemJournal *p = (MemJournal*)pJfd;
|
MemJournal *p = (MemJournal*)pJfd;
|
||||||
if( p->pMethod==&MemJournalMethods
|
if( p->pMethod==&MemJournalMethods && (p->nSpill>0
|
||||||
&& (p->nSpill>0 || (p->flags & SQLITE_OPEN_MAIN_JOURNAL))
|
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
|
||||||
){
|
|| (p->flags & SQLITE_OPEN_MAIN_JOURNAL)
|
||||||
|
#endif
|
||||||
|
)){
|
||||||
rc = memjrnlCreateFile(p);
|
rc = memjrnlCreateFile(p);
|
||||||
}
|
}
|
||||||
return rc;
|
return rc;
|
||||||
|
76
src/pager.c
76
src/pager.c
@@ -947,6 +947,7 @@ static int assert_pager_state(Pager *p){
|
|||||||
assert( isOpen(p->jfd)
|
assert( isOpen(p->jfd)
|
||||||
|| p->journalMode==PAGER_JOURNALMODE_OFF
|
|| p->journalMode==PAGER_JOURNALMODE_OFF
|
||||||
|| p->journalMode==PAGER_JOURNALMODE_WAL
|
|| p->journalMode==PAGER_JOURNALMODE_WAL
|
||||||
|
|| (sqlite3OsDeviceCharacteristics(p->fd)&SQLITE_IOCAP_BATCH_ATOMIC)
|
||||||
);
|
);
|
||||||
assert( pPager->dbOrigSize<=pPager->dbHintSize );
|
assert( pPager->dbOrigSize<=pPager->dbHintSize );
|
||||||
break;
|
break;
|
||||||
@@ -1169,39 +1170,45 @@ static int pagerLockDb(Pager *pPager, int eLock){
|
|||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** This function determines whether or not the atomic-write optimization
|
** This function determines whether or not the atomic-write or
|
||||||
** can be used with this pager. The optimization can be used if:
|
** atomic-batch-write optimizations can be used with this pager. The
|
||||||
|
** atomic-write optimization can be used if:
|
||||||
**
|
**
|
||||||
** (a) the value returned by OsDeviceCharacteristics() indicates that
|
** (a) the value returned by OsDeviceCharacteristics() indicates that
|
||||||
** a database page may be written atomically, and
|
** a database page may be written atomically, and
|
||||||
** (b) the value returned by OsSectorSize() is less than or equal
|
** (b) the value returned by OsSectorSize() is less than or equal
|
||||||
** to the page size.
|
** to the page size.
|
||||||
**
|
**
|
||||||
** The optimization is also always enabled for temporary files. It is
|
** If it can be used, then the value returned is the size of the journal
|
||||||
** an error to call this function if pPager is opened on an in-memory
|
** file when it contains rollback data for exactly one page.
|
||||||
** database.
|
|
||||||
**
|
**
|
||||||
** If the optimization cannot be used, 0 is returned. If it can be used,
|
** The atomic-batch-write optimization can be used if OsDeviceCharacteristics()
|
||||||
** then the value returned is the size of the journal file when it
|
** returns a value with the SQLITE_IOCAP_BATCH_ATOMIC bit set. -1 is
|
||||||
** contains rollback data for exactly one page.
|
** returned in this case.
|
||||||
|
**
|
||||||
|
** If neither optimization can be used, 0 is returned.
|
||||||
*/
|
*/
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
|
||||||
static int jrnlBufferSize(Pager *pPager){
|
static int jrnlBufferSize(Pager *pPager){
|
||||||
assert( !MEMDB );
|
assert( !MEMDB );
|
||||||
if( !pPager->tempFile ){
|
|
||||||
int dc; /* Device characteristics */
|
|
||||||
int nSector; /* Sector size */
|
|
||||||
int szPage; /* Page size */
|
|
||||||
|
|
||||||
assert( isOpen(pPager->fd) );
|
#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \
|
||||||
dc = sqlite3OsDeviceCharacteristics(pPager->fd);
|
|| defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
|
||||||
/* use in-memory journal */
|
int dc; /* Device characteristics */
|
||||||
if( dc&SQLITE_IOCAP_BATCH_ATOMIC ){
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
nSector = pPager->sectorSize;
|
assert( isOpen(pPager->fd) );
|
||||||
szPage = pPager->pageSize;
|
dc = sqlite3OsDeviceCharacteristics(pPager->fd);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
|
||||||
|
if( dc&SQLITE_IOCAP_BATCH_ATOMIC ){
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
||||||
|
{
|
||||||
|
int nSector = pPager->sectorSize;
|
||||||
|
int szPage = pPager->pageSize;
|
||||||
|
|
||||||
assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
|
assert(SQLITE_IOCAP_ATOMIC512==(512>>8));
|
||||||
assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
|
assert(SQLITE_IOCAP_ATOMIC64K==(65536>>8));
|
||||||
@@ -1211,11 +1218,11 @@ static int jrnlBufferSize(Pager *pPager){
|
|||||||
}
|
}
|
||||||
|
|
||||||
return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
|
return JOURNAL_HDR_SZ(pPager) + JOURNAL_PG_SZ(pPager);
|
||||||
}
|
|
||||||
#else
|
|
||||||
# define jrnlBufferSize(x) 0
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
** If SQLITE_CHECK_PAGES is defined then we do some sanity checking
|
** If SQLITE_CHECK_PAGES is defined then we do some sanity checking
|
||||||
** on the cache using a hash function. This is used for testing
|
** on the cache using a hash function. This is used for testing
|
||||||
@@ -4576,7 +4583,7 @@ static int pagerStress(void *p, PgHdr *pPg){
|
|||||||
}
|
}
|
||||||
}else{
|
}else{
|
||||||
|
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
|
||||||
if( pPager->tempFile==0 ){
|
if( pPager->tempFile==0 ){
|
||||||
rc = sqlite3JournalCreate(pPager->jfd);
|
rc = sqlite3JournalCreate(pPager->jfd);
|
||||||
if( rc!=SQLITE_OK ) return pager_error(pPager, rc);
|
if( rc!=SQLITE_OK ) return pager_error(pPager, rc);
|
||||||
@@ -6385,13 +6392,17 @@ int sqlite3PagerCommitPhaseOne(
|
|||||||
** in 'direct' mode. In this case the journal file will never be
|
** in 'direct' mode. In this case the journal file will never be
|
||||||
** created for this transaction.
|
** created for this transaction.
|
||||||
*/
|
*/
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
|
||||||
sqlite3_file *fd = pPager->fd;
|
sqlite3_file *fd = pPager->fd;
|
||||||
int bBatch = zMaster==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */
|
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
|
||||||
|
const int bBatch = zMaster==0 /* An SQLITE_IOCAP_BATCH_ATOMIC commit */
|
||||||
&& (sqlite3OsDeviceCharacteristics(fd) & SQLITE_IOCAP_BATCH_ATOMIC)
|
&& (sqlite3OsDeviceCharacteristics(fd) & SQLITE_IOCAP_BATCH_ATOMIC)
|
||||||
&& pPager->journalMode!=PAGER_JOURNALMODE_MEMORY
|
&& pPager->journalMode!=PAGER_JOURNALMODE_MEMORY
|
||||||
&& sqlite3JournalIsInMemory(pPager->jfd);
|
&& sqlite3JournalIsInMemory(pPager->jfd);
|
||||||
|
#else
|
||||||
|
const int bBatch = 0;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
||||||
if( bBatch==0 ){
|
if( bBatch==0 ){
|
||||||
PgHdr *pPg;
|
PgHdr *pPg;
|
||||||
assert( isOpen(pPager->jfd)
|
assert( isOpen(pPager->jfd)
|
||||||
@@ -6416,9 +6427,16 @@ int sqlite3PagerCommitPhaseOne(
|
|||||||
rc = pager_incr_changecounter(pPager, 0);
|
rc = pager_incr_changecounter(pPager, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}else
|
}
|
||||||
#endif
|
#else
|
||||||
|
#ifdef SQLITE_ENABLE_BATCH_ATOMIC_WRITE
|
||||||
|
if( zMaster ){
|
||||||
|
rc = sqlite3JournalCreate(pPager->jfd);
|
||||||
|
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
rc = pager_incr_changecounter(pPager, 0);
|
rc = pager_incr_changecounter(pPager, 0);
|
||||||
|
#endif
|
||||||
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
|
if( rc!=SQLITE_OK ) goto commit_phase_one_exit;
|
||||||
|
|
||||||
/* Write the master journal name into the journal file. If a master
|
/* Write the master journal name into the journal file. If a master
|
||||||
|
@@ -4285,7 +4285,8 @@ int sqlite3FindInIndex(Parse *, Expr *, u32, int*, int*);
|
|||||||
|
|
||||||
int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int);
|
int sqlite3JournalOpen(sqlite3_vfs *, const char *, sqlite3_file *, int, int);
|
||||||
int sqlite3JournalSize(sqlite3_vfs *);
|
int sqlite3JournalSize(sqlite3_vfs *);
|
||||||
#ifdef SQLITE_ENABLE_ATOMIC_WRITE
|
#if defined(SQLITE_ENABLE_ATOMIC_WRITE) \
|
||||||
|
|| defined(SQLITE_ENABLE_BATCH_ATOMIC_WRITE)
|
||||||
int sqlite3JournalCreate(sqlite3_file *);
|
int sqlite3JournalCreate(sqlite3_file *);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user