From: drh <> Date: Thu, 14 Nov 2024 22:59:16 +0000 (+0000) Subject: Attempt to hold a lock across the COMMIT AND BEGIN boundary so that no other X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c367ef359321871fcb9bff40fd1f8e01315b99da;p=thirdparty%2Fsqlite.git Attempt to hold a lock across the COMMIT AND BEGIN boundary so that no other process can start a new transaction in between the COMMIT and the BEGIN. FossilOrigin-Name: bc8bcc53ff7a0cbe1c2e3a96e1bded055622b667c27284798433cc6d58c7f9fe --- diff --git a/manifest b/manifest index ae64e33db6..786a1241e2 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Fix\sassertion\sfaults\sin\sthe\sCOMMIT\sAND\sBEGIN\spath. -D 2024-11-14T19:59:02.896 +C Attempt\sto\shold\sa\slock\sacross\sthe\sCOMMIT\sAND\sBEGIN\sboundary\sso\sthat\sno\sother\nprocess\scan\sstart\sa\snew\stransaction\sin\sbetween\sthe\sCOMMIT\sand\sthe\sBEGIN. +D 2024-11-14T22:59:16.150 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md e108e1e69ae8e8a59e93c455654b8ac9356a11720d3345df2a4743e9590fb20d @@ -710,11 +710,11 @@ F src/alter.c aa93e37e4a36a0525bbb2a2aeda20d2018f0aa995542c7dc658e031375e3f532 F src/analyze.c 9a8b67239d899ac12289db5db3f5bfe7f7a0ad1277f80f87ead1d048085876eb F src/attach.c f35bb8cc1fcdde8f6815a7ef09ae413bcac71821d530796800ba24b3c7da1e80 F src/auth.c 54ab9c6c5803b47c0d45b76ce27eff22a03b4b1f767c5945a3a4eb13aa4c78dc -F src/backup.c 5c97e8023aab1ce14a42387eb3ae00ba5a0644569e3476f38661fa6f824c3523 +F src/backup.c 3a6b733262d0c8177fce98ae3a52b7bcbcec52e8f99f5aa0c7f08da35b1286b8 F src/bitvec.c 9eac5f42c11914d5ef00a75605bb205e934f435c579687f985f1f8b0995c8645 F src/btmutex.c 79a43670447eacc651519a429f6ece9fd638563cf95b469d6891185ddae2b522 -F src/btree.c 63ca6b647342e8cef643863cd0962a542f133e1069460725ba4461dcda92b03c -F src/btree.h 18e5e7b2124c23426a283523e5f31a4bff029131b795bb82391f9d2f3136fc50 +F src/btree.c b1027870704ab6a80c5c5e81f16a592562debf2600c4f2e3d2d8715664d830d0 +F src/btree.h 86f2a22eb71024ee5dc3d0125c7cac62c8fab75583182bff082ea4e9a58dd125 F src/btreeInt.h 98aadb6dcb77b012cab2574d6a728fad56b337fc946839b9898c4b4c969e30b6 F src/build.c c219c01d3490420addfe5e9673ed136cbf89acf4c72370b548cf68a4ad5cc281 F src/callback.c db3a45e376deff6a16c0058163fe0ae2b73a2945f3f408ca32cf74960b28d490 @@ -761,8 +761,8 @@ F src/os_setup.h 6011ad7af5db4e05155f385eb3a9b4470688de6f65d6166b8956e58a3d87210 F src/os_unix.c d2edbd92b07a3f778c2defa8a2e9d75acceb6267bda56948c41e8cdda65224d6 F src/os_win.c db4baa8f62bbfe3967c71b008cea31a8f2ff337c1667ff4d8a677e697315ff0d F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 9656ad4e8331efb8a4f94f7a0c6440b98caea073950a367ea0c728a53b8e62c9 -F src/pager.h 4b1140d691860de0be1347474c51fee07d5420bd7f802d38cbab8ea4ab9f538a +F src/pager.c 6b3929ef6aa958a991967f03de56a258b41ff34a11670d6ca388e1a35af0c6ae +F src/pager.h dea3f0dc42b12dc07596e4d92bae1a6ef9d7320ab7683f57ddcedf8294205417 F src/parse.y 61033fb5fa609161a0025fe7b6941ee5afbf382f6927ea26c51892dd3b63d731 F src/pcache.c 588cc3c5ccaaadde689ed35ce5c5c891a1f7b1f4d1f56f6cf0143b74d8ee6484 F src/pcache.h 1497ce1b823cf00094bb0cf3bac37b345937e6f910890c626b16512316d3abf5 @@ -786,7 +786,7 @@ F src/table.c 0f141b58a16de7e2fbe81c308379e7279f4c6b50eb08efeec5892794a0ba30d1 F src/tclsqlite.c ff2dc3ec1bd318ee7a45d6b246a367703d5fb2a4c8da99d675ee7eb987b3a153 F src/tclsqlite.h 65e2c761446e1c9fa0342b7d2612a703483643c8b6a316d12a65b745a4727395 F src/test1.c 2d507751bfb4aa254dc22588ef1e3c5c5cfcb2e636d0e6e1fa0bbd307669c2a8 -F src/test2.c 7ebc518e6735939d8979273a6f7b1d9b5702babf059f6ad62499f7f60a9eb9a3 +F src/test2.c 1d7928a9aa9576d6e153f219b841363782939eec6750866bc748b371a4bbadde F src/test3.c e7573aa0f78ee4e070a4bc8c3493941c1aa64d5c66d4825c74c0f055451f432b F src/test4.c 13e57ae7ec7a959ee180970aef09deed141252fe9bb07c61054f0dfa4f1dfd5d F src/test5.c bb87279ed12e199486894e6c83e58dc8cd1de9524ace171d59219d3ab696a0c1 @@ -847,7 +847,7 @@ F src/vdbe.c f4cb87fa3c12ec151515731badeaa997defa071f677c0f2f2cb52c818a5762b6 F src/vdbe.h c2549a215898a390de6669cfa32adba56f0d7e17ba5a7f7b14506d6fd5f0c36a F src/vdbeInt.h 2da01c73e8e3736a9015d5b04aa04d209bc9023d279d237d4d409205e921ea1e F src/vdbeapi.c 6353de05e8e78e497ccb33381ba5662ccc11c0339e5b1455faff01b6dacc3075 -F src/vdbeaux.c f0706ad786b8a6c5bc7ea622f3916c2ba2b883abc872d0b4911c4f021945c0e5 +F src/vdbeaux.c 798d56fc53f833225e5f72adbdf15644faf4035657cc8a4023140fe9238e2ddf F src/vdbeblob.c 255be187436da38b01f276c02e6a08103489bbe2a7c6c21537b7aecbe0e1f797 F src/vdbemem.c df568ef0187e4be2788c35174f6d9b8566ab9475f9aff2d73907ed05aa5684b2 F src/vdbesort.c d0a3c7056c081703c8b6d91ad60f17da5e062a5c64bf568ed0fa1b5f4cae311f @@ -2198,8 +2198,8 @@ F tool/version-info.c 3b36468a90faf1bbd59c65fd0eb66522d9f941eedd364fabccd7227350 F tool/warnings-clang.sh bbf6a1e685e534c92ec2bfba5b1745f34fb6f0bc2a362850723a9ee87c1b31a7 F tool/warnings.sh 49a486c5069de041aedcbde4de178293e0463ae9918ecad7539eedf0ec77a139 F tool/win/sqlite.vsix deb315d026cc8400325c5863eef847784a219a2f -P 098400d36140b90e1d6dab5f54b080568c633875916a1130b6627599b4f99469 -R 11a4595b2cb4390dbc018d3cf87a1735 +P a9a4ac17c2169fa7f97434177dfb01eaf4fae7f99b9203677d985d048eea4559 +R e076e0b1d6dcf99285c63f69d8918932 U drh -Z 8f9b353dc1d070b10157323a5e0f6a11 +Z 102dff9a412a8b8f29da274c5cd5e9d0 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index 9f38d4748f..4b5cf1d7c3 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -a9a4ac17c2169fa7f97434177dfb01eaf4fae7f99b9203677d985d048eea4559 +bc8bcc53ff7a0cbe1c2e3a96e1bded055622b667c27284798433cc6d58c7f9fe diff --git a/src/backup.c b/src/backup.c index 22615d1499..657d9abbb6 100644 --- a/src/backup.c +++ b/src/backup.c @@ -533,7 +533,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ /* Finish committing the transaction to the destination database. */ if( SQLITE_OK==rc - && SQLITE_OK==(rc = sqlite3BtreeCommitPhaseTwo(p->pDest, 0)) + && SQLITE_OK==(rc = sqlite3BtreeCommitPhaseTwo(p->pDest, 0, 0)) ){ rc = SQLITE_DONE; } @@ -548,7 +548,7 @@ int sqlite3_backup_step(sqlite3_backup *p, int nPage){ if( bCloseTrans ){ TESTONLY( int rc2 ); TESTONLY( rc2 = ) sqlite3BtreeCommitPhaseOne(p->pSrc, 0); - TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0); + TESTONLY( rc2 |= ) sqlite3BtreeCommitPhaseTwo(p->pSrc, 0, 0); assert( rc2==SQLITE_OK ); } diff --git a/src/btree.c b/src/btree.c index 49eb1d8037..38abdfee4e 100644 --- a/src/btree.c +++ b/src/btree.c @@ -4353,7 +4353,7 @@ static void btreeEndTransaction(Btree *p){ ** This will release the write lock on the database file. If there ** are no active cursors, it also releases the read lock. */ -int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ +int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup, int bKeepLock){ if( p->inTrans==TRANS_NONE ) return SQLITE_OK; sqlite3BtreeEnter(p); @@ -4367,7 +4367,7 @@ int sqlite3BtreeCommitPhaseTwo(Btree *p, int bCleanup){ BtShared *pBt = p->pBt; assert( pBt->inTransaction==TRANS_WRITE ); assert( pBt->nTransaction>0 ); - rc = sqlite3PagerCommitPhaseTwo(pBt->pPager); + rc = sqlite3PagerCommitPhaseTwo(pBt->pPager, bKeepLock); if( rc!=SQLITE_OK && bCleanup==0 ){ sqlite3BtreeLeave(p); return rc; @@ -4390,7 +4390,7 @@ int sqlite3BtreeCommit(Btree *p){ sqlite3BtreeEnter(p); rc = sqlite3BtreeCommitPhaseOne(p, 0); if( rc==SQLITE_OK ){ - rc = sqlite3BtreeCommitPhaseTwo(p, 0); + rc = sqlite3BtreeCommitPhaseTwo(p, 0, 0); } sqlite3BtreeLeave(p); return rc; diff --git a/src/btree.h b/src/btree.h index 241261dc6a..173ac12ee6 100644 --- a/src/btree.h +++ b/src/btree.h @@ -80,7 +80,7 @@ int sqlite3BtreeSetAutoVacuum(Btree *, int); int sqlite3BtreeGetAutoVacuum(Btree *); int sqlite3BtreeBeginTrans(Btree*,int,int*); int sqlite3BtreeCommitPhaseOne(Btree*, const char*); -int sqlite3BtreeCommitPhaseTwo(Btree*, int); +int sqlite3BtreeCommitPhaseTwo(Btree*, int, int); int sqlite3BtreeCommit(Btree*); int sqlite3BtreeRollback(Btree*,int,int); int sqlite3BtreeBeginStmt(Btree*,int); diff --git a/src/pager.c b/src/pager.c index 4f616f0c7f..4154561302 100644 --- a/src/pager.c +++ b/src/pager.c @@ -6680,8 +6680,9 @@ commit_phase_one_exit: ** If an error occurs, an IO error code is returned and the pager ** moves into the error state. Otherwise, SQLITE_OK is returned. */ -int sqlite3PagerCommitPhaseTwo(Pager *pPager){ +int sqlite3PagerCommitPhaseTwo(Pager *pPager, int bKeepLocked){ int rc = SQLITE_OK; /* Return code */ + u8 modeSaved; /* This routine should not be called if a prior error has occurred. ** But if (due to a coding error elsewhere in the system) it does get @@ -6716,7 +6717,10 @@ int sqlite3PagerCommitPhaseTwo(Pager *pPager){ } PAGERTRACE(("COMMIT %d\n", PAGERID(pPager))); + modeSaved = pPager->exclusiveMode; + pPager->exclusiveMode |= bKeepLocked; rc = pager_end_transaction(pPager, pPager->setSuper, 1); + pPager->exclusiveMode = modeSaved; return pager_error(pPager, rc); } diff --git a/src/pager.h b/src/pager.h index 7ef9a237ae..ddac6d17cd 100644 --- a/src/pager.h +++ b/src/pager.h @@ -165,7 +165,7 @@ int sqlite3PagerBegin(Pager*, int exFlag, int); int sqlite3PagerCommitPhaseOne(Pager*,const char *zSuper, int); int sqlite3PagerExclusiveLock(Pager*); int sqlite3PagerSync(Pager *pPager, const char *zSuper); -int sqlite3PagerCommitPhaseTwo(Pager*); +int sqlite3PagerCommitPhaseTwo(Pager*,int); int sqlite3PagerRollback(Pager*); int sqlite3PagerOpenSavepoint(Pager *pPager, int n); int sqlite3PagerSavepoint(Pager *pPager, int op, int iSavepoint); diff --git a/src/test2.c b/src/test2.c index a9549aa7f5..4e867b6570 100644 --- a/src/test2.c +++ b/src/test2.c @@ -148,7 +148,7 @@ static int SQLITE_TCLAPI pager_commit( Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); return TCL_ERROR; } - rc = sqlite3PagerCommitPhaseTwo(pPager); + rc = sqlite3PagerCommitPhaseTwo(pPager, 0); if( rc!=SQLITE_OK ){ Tcl_AppendResult(interp, sqlite3ErrName(rc), 0); return TCL_ERROR; diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 4414f7a2ec..9b16c1c534 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -2997,7 +2997,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ for(i=0; rc==SQLITE_OK && inDb; i++){ Btree *pBt = db->aDb[i].pBt; if( pBt ){ - rc = sqlite3BtreeCommitPhaseTwo(pBt, 0); + rc = sqlite3BtreeCommitPhaseTwo(pBt, 0, db->autoRebegin!=0); } } if( rc==SQLITE_OK ){ @@ -3141,7 +3141,7 @@ static int vdbeCommit(sqlite3 *db, Vdbe *p){ for(i=0; inDb; i++){ Btree *pBt = db->aDb[i].pBt; if( pBt ){ - sqlite3BtreeCommitPhaseTwo(pBt, 1); + sqlite3BtreeCommitPhaseTwo(pBt, 1, db->autoRebegin!=0); } } sqlite3EndBenignMalloc();