From: dan Date: Sat, 29 Apr 2017 15:48:32 +0000 (+0000) Subject: Avoid reading the file-size before page 1 is read-locked. X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=f427296520de7a474aa7751fe5717c64b2d6de15;p=thirdparty%2Fsqlite.git Avoid reading the file-size before page 1 is read-locked. FossilOrigin-Name: f6b025bf632501f51e691a05d309225671fd78bc62c9a43dd916d35ba4cf6d0e --- diff --git a/manifest b/manifest index 07906638d3..e3c353b3af 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\svarious\sbugs\srevealed\sby\srunning\sperformance\stests. -D 2017-04-28T17:32:57.316 +C Avoid\sreading\sthe\sfile-size\sbefore\spage\s1\sis\sread-locked. +D 2017-04-29T15:48:32.290 F Makefile.in 1cc758ce3374a32425e4d130c2fe7b026b20de5b8843243de75f087c0a2661fb F Makefile.linux-gcc 7bc79876b875010e8c8f9502eb935ca92aa3c434 F Makefile.msc 6a8c838220f7c00820e1fc0ac1bccaaa8e5676067e1dbfa1bafa7a4ffecf8ae6 @@ -345,7 +345,7 @@ F src/auth.c 930b376a9c56998557367e6f7f8aaeac82a2a792 F src/backup.c faf17e60b43233c214aae6a8179d24503a61e83b F src/bitvec.c 17ea48eff8ba979f1f5b04cc484c7bb2be632f33 F src/btmutex.c 0e9ce2d56159b89b9bc8e197e023ee11e39ff8ca -F src/btree.c defa7525774e74977aaed98242160002fbeecaf96e4f8da7911a1f43c3a16754 +F src/btree.c 5bd5e1f17a74836e6d6273c1d04d406bb481a6c517f18f96db0a5de266797f4a F src/btree.h 80f518c0788be6cec8d9f8e13bd8e380df299d2b5e4ac340dc887b0642647cfc F src/btreeInt.h a392d353104b4add58b4a59cb185f5d5693dde832c565b77d8d4c343ed98f610 F src/build.c 4026a9c554b233e50c5e9ad46963e676cf54dd2306d952aa1eaa07a1bc9ce14f @@ -389,8 +389,8 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 30e2c43e4955db990e5b5a81e901f8aa74cc8820 F src/os_win.c 2a6c73eef01c51a048cc4ddccd57f981afbec18a F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c b9ae00a1daf843c0eee6b1aff427453990f4e56e99bbeaf0322bbce807980b3d -F src/pager.h c14a05a9c0ff7face5c3cfec285f29dc297b308e9584a8e6bae134a2a3dd57a1 +F src/pager.c 67e97956c302cf81acf0f3f56e1853b32c88cda5ae09ecba3bcd35272d2ab739 +F src/pager.h ea05992c581c3366279fb1d436944604b4be17208ebb41fa407306e5e4b34205 F src/parse.y 0513387ce02fea97897d8caef82d45f347818593f24f1bdc48e0c530a8af122d F src/pcache.c 62835bed959e2914edd26afadfecce29ece0e870 F src/pcache.h 2cedcd8407eb23017d92790b112186886e179490 @@ -403,7 +403,7 @@ F src/random.c 80f5d666f23feb3e6665a6ce04c7197212a88384 F src/resolve.c 3e518b962d932a997fae373366880fc028c75706 F src/rowset.c 7b7e7e479212e65b723bf40128c7b36dc5afdfac F src/select.c bf8ab605e49717c222136380453cfb7eda564f8e500d5ff6a01341ea59fefe80 -F src/server.c 143a16259e3b6786e2fcc0c3321b1c495e5d4a9ac57761581a99b20d6565a619 +F src/server.c ffeab1087cdae36f1454065b1feb49c61ce48db0088c6130e28197d6bfbc7545 F src/shell.c 21b79c0e1b93f8e35fd7b4087d6ba438326c3d7e285d0dd51dfd741475f858a1 F src/sqlite.h.in f6e3734fee6d334a896cff8f43446ca2e47dcf7e39135b3e3a596bf23cdbbc97 F src/sqlite3.rc 5121c9e10c3964d5755191c80dd1180c122fc3a8 @@ -1580,7 +1580,7 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P a5a085483c66b17727cf4d2a15165621016031ab78990cb5977ccdbd231d13ac -R c6c0a835b38330053a58b1b4289c39cf +P a40b42c422a53aa99280eca7ba419a3937699e273efa3377e0fefe52582cbbd4 +R 9a85e5e4940ba5e8bd67cc7c6dfd6715 U dan -Z 12d4c81995414ce72af03f0392a0e5ee +Z 5b549d7ff43521bff2f6a6a67d4b45a8 diff --git a/manifest.uuid b/manifest.uuid index 5ecb9a837b..8be646eae0 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a40b42c422a53aa99280eca7ba419a3937699e273efa3377e0fefe52582cbbd4 \ No newline at end of file +f6b025bf632501f51e691a05d309225671fd78bc62c9a43dd916d35ba4cf6d0e \ No newline at end of file diff --git a/src/btree.c b/src/btree.c index 7f7d44b516..545b769578 100644 --- a/src/btree.c +++ b/src/btree.c @@ -2916,12 +2916,6 @@ static int lockBtree(BtShared *pBt){ */ nPage = nPageHeader = get4byte(28+(u8*)pPage1->aData); sqlite3PagerPagecount(pBt->pPager, &nPageFile); -#ifdef SQLITE_SERVER_EDITION - if( sqlite3PagerIsServer(pBt->pPager) ){ - sqlite3PagerSetPagecount(pBt->pPager, nPage); - nPageFile = nPage; - } -#endif if( nPage==0 || memcmp(24+(u8*)pPage1->aData, 92+(u8*)pPage1->aData,4)!=0 ){ nPage = nPageFile; } @@ -5705,7 +5699,7 @@ static int findServerTrunk(BtShared *pBt, int bAlloc, MemPage **ppTrunk){ nList = (int)get4byte(&pNode->aData[4]); for(i=0; iaData[8+i*4]); - if( SQLITE_OK==sqlite3PagerWritelock(pBt->pPager, iTrunk) ){ + if( SQLITE_OK==sqlite3PagerPagelock(pBt->pPager, iTrunk, 1) ){ rc = btreeGetUnusedPage(pBt, iTrunk, &pTrunk, 0); if( rc==SQLITE_OK && bAlloc ){ if( !get4byte(&pTrunk->aData[0]) && !get4byte(&pTrunk->aData[4]) ){ diff --git a/src/pager.c b/src/pager.c index 2762ff5c18..5c810bad30 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7667,12 +7667,8 @@ int sqlite3PagerWalFramesize(Pager *pPager){ int sqlite3PagerIsServer(Pager *pPager){ return pagerIsServer(pPager); } -int sqlite3PagerWritelock(Pager *pPager, Pgno pgno){ - return sqlite3ServerLock(pPager->pServer, pgno, 1); -} -void sqlite3PagerSetPagecount(Pager *pPager, u32 nPage){ - assert( pPager->eState==PAGER_READER ); - pPager->dbSize = nPage; +int sqlite3PagerPagelock(Pager *pPager, Pgno pgno, int bWrite){ + return sqlite3ServerLock(pPager->pServer, pgno, bWrite); } #endif diff --git a/src/pager.h b/src/pager.h index 8a1fed1331..8d9d25d1b2 100644 --- a/src/pager.h +++ b/src/pager.h @@ -239,8 +239,7 @@ void *sqlite3PagerCodec(DbPage *); #ifdef SQLITE_SERVER_EDITION int sqlite3PagerRollbackJournal(Pager*, int); int sqlite3PagerIsServer(Pager *pPager); - int sqlite3PagerWritelock(Pager *pPager, Pgno); - void sqlite3PagerSetPagecount(Pager*, u32); + int sqlite3PagerPagelock(Pager *pPager, Pgno, int); #endif #endif /* SQLITE_PAGER_H */ diff --git a/src/server.c b/src/server.c index 312b42ad1c..4ed028023d 100644 --- a/src/server.c +++ b/src/server.c @@ -399,7 +399,7 @@ int sqlite3ServerBegin(Server *p){ #if 0 return posixLock(p->pHma->fd, p->iClient+1, SERVER_WRITE_LOCK, 0); #endif - return SQLITE_OK; + return sqlite3ServerLock(p, 1, 0); } /*