From: dan Date: Mon, 19 Dec 2022 18:42:55 +0000 (+0000) Subject: Hack for special gettimeofday() instrumentation of "PRAGMA schema_version". X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=24249b3bf92f95b8f68001b221be35f8e124fe67;p=thirdparty%2Fsqlite.git Hack for special gettimeofday() instrumentation of "PRAGMA schema_version". FossilOrigin-Name: 44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0 --- diff --git a/manifest b/manifest index c6fa5feea5..7c0d038f72 100644 --- a/manifest +++ b/manifest @@ -1,5 +1,5 @@ -C Merge\sthe\slatest\strunk\senhancements\sinto\sthe\sbegin-concurrent-pnu-wal2\sbranch. -D 2022-09-30T14:04:15.072 +C Hack\sfor\sspecial\sgettimeofday()\sinstrumentation\sof\s"PRAGMA\sschema_version". +D 2022-12-19T18:42:55.300 F .fossil-settings/empty-dirs dbb81e8fc0401ac46a1491ab34a7f2c7c0452f2f06b54ebb845d024ca8283ef1 F .fossil-settings/ignore-glob 35175cdfcf539b2318cb04a9901442804be81cd677d8b889fcc9149c21f239ea F LICENSE.md df5091916dbb40e6e9686186587125e1b2ff51f022cc334e886c19a0e9982724 @@ -583,13 +583,13 @@ F src/os_setup.h 0dbaea40a7d36bf311613d31342e0b99e2536586 F src/os_unix.c 52ac6823d3895c6a3a5cf4b07c05052f7ee8bd100a076bf0cd672ec83c996246 F src/os_win.c 8d129ae3e59e0fa900e20d0ad789e96f2e08177f0b00b53cdda65c40331e0902 F src/os_win.h 7b073010f1451abe501be30d12f6bc599824944a -F src/pager.c 6d3a93a7abfcb17e69ceb8a5e78ab74a0234ebf2a87819cc63d5c6044e78834c -F src/pager.h 3ddab454e313da7c93f92fea35c842ad17ae9f4e96254871ddb0171b2bfb859a +F src/pager.c c15d151cd6f6c2a66a48cefdd1a6a7bda1cbe67057e48315e7e04b4c8bf9e71b +F src/pager.h 4684b1ea6a770b6cebd9dcd519e25d9eb3891f49fad14b096b4c35e3d6d27869 F src/parse.y 17c50d262d92083badeb60b3ebe4725e19c76548f90aea898ab07d4f2940a7d8 F src/pcache.c f4268f7f73c6a3db12ce22fd25bc68dc42315d19599414ab1207d7cf32f79197 F src/pcache.h 4f87acd914cef5016fae3030343540d75f5b85a1877eed1a2a19b9f284248586 F src/pcache1.c dee95e3cd2b61e6512dc814c5ab76d5eb36f0bfc9441dbb4260fccc0d12bbddc -F src/pragma.c c471a8752cc37919a213d860a1550c3e4b5bc1a416dff2aa72212e73c6982230 +F src/pragma.c 717d6213e98661583207a0053a451d9e28a7e1ad483e3ba9b1f5b97e0aaa608e F src/pragma.h 1f421360eed1a7721e8c521463df8519a7c8d0d5893ebd9dbfe0dba8de996f8c F src/prepare.c 971d5819a4bda88038c2283d71fc0a2974ffc3dd480f9bd941341017abacfd1b F src/printf.c e99ee9741e79ae3873458146f59644276657340385ade4e76a5f5d1c25793764 @@ -668,11 +668,11 @@ F src/upsert.c 8789047a8f0a601ea42fa0256d1ba3190c13746b6ba940fe2d25643a7e991937 F src/utf.c ee39565f0843775cc2c81135751ddd93eceb91a673ea2c57f61c76f288b041a0 F src/util.c 0be191521ff6d2805995f4910f0b6231b42843678b2efdc1abecaf39929a673f F src/vacuum.c 5b7888f917936dda09f98b1fda164cff1dad44fb5e143436bdbb9dc3191ce2df -F src/vdbe.c be71256da51f60d13e0f53850bae9902d7c9926c71e5e50d4c686bd92e458574 -F src/vdbe.h 64619af62603dc3c4f5ff6ff6d2c8f389abd667a29ce6007ed44bd22b3211cd0 -F src/vdbeInt.h 17b7461ffcf9ee760d1341731715a419f6b8c763089a7ece25c2e8098d702b3f +F src/vdbe.c 0aebfd43f07b3c97e08ac0c2fe6a4c6b0e46b4f78573c3fa613463298aff1168 +F src/vdbe.h 2b994184581ac41e9f7ec49ac0f1569da1766f24d7a1775df67328d749a22a1c +F src/vdbeInt.h 18ed4bf4bc1c0070e217822f82217cf586023288b6c7b30dabe020f96a3a7df8 F src/vdbeapi.c fc3183daf72808b4311b228989120fdbc2dc44972fb0d77d5c453460cc0e5b2c -F src/vdbeaux.c df2bbf6b5d6e45a7ab4061fb11f788fd1e4f91ae95ef0309cf8b9465f94eec83 +F src/vdbeaux.c 9922b5ce849a301934ab918403aaa0cdbc70d6c3f73bbb7925a024ec40781eef F src/vdbeblob.c 5e61ce31aca17db8fb60395407457a8c1c7fb471dde405e0cd675974611dcfcd F src/vdbemem.c c3ce80af15e2ff5c2824a8db881681cbf511376f13613da020bac6d320c535b1 F src/vdbesort.c 43756031ca7430f7aec3ef904824a7883c4ede783e51f280d99b9b65c0796e35 @@ -680,8 +680,8 @@ F src/vdbetrace.c fe0bc29ebd4e02c8bc5c1945f1d2e6be5927ec12c06d89b03ef2a4def34bf8 F src/vdbevtab.c f99b275366c5fc5e2d99f734729880994ab9500bdafde7fae3b02d562b9d323c F src/vtab.c bb53f9e2eaeecca07158643dd3d5039cf13b525fe2d267e113b39a36f374556c F src/vxworks.h d2988f4e5a61a4dfe82c6524dd3d6e4f2ce3cdb9 -F src/wal.c 393ffbef8381b50265a3f0de5cf3c68d0df6c6867df429c5719c2446e9254126 -F src/wal.h 7a733af13b966ecb81872ce397e862116b3575ea53245b90b139a2873ee87825 +F src/wal.c 6d1fc9d36b681af15cc46cbf8e3c3683a7d6970a0c24b82b28d00df94dba4a60 +F src/wal.h 11692a4e45c39dd8851a1b226cb22046f1271dedc19a2c734af0a1929c837b91 F src/walker.c f890a3298418d7cba3b69b8803594fdc484ea241206a8dfa99db6dd36f8cbb3b F src/where.c 63e712bcad47f70e94c2150976cd7da5040933699e3938d4189d064acbe40891 F src/whereInt.h 70cd30de9ed784aa33fa6bd1245f060617de7a00d992469b6d8e419eed915743 @@ -2035,8 +2035,11 @@ F vsixtest/vsixtest.tcl 6a9a6ab600c25a91a7acc6293828957a386a8a93 F vsixtest/vsixtest.vcxproj.data 2ed517e100c66dc455b492e1a33350c1b20fbcdc F vsixtest/vsixtest.vcxproj.filters 37e51ffedcdb064aad6ff33b6148725226cd608e F vsixtest/vsixtest_TemporaryKey.pfx e5b1b036facdb453873e7084e1cae9102ccc67a0 -P dde76e91d3cb5aa66fcfab91ab02adfcfcf1eafc1e7e9d3520f4f396d27655d7 c22c7c879846b1357c00741700b7f6d1111c4b94895b4e7f552c92299d35712e -R e466d0b3e01cc2259e6859e5a0f9267d -U drh -Z caa9cc539d5620a96e294ec646f6ad74 +P 68a61513f9e064ed9e79638ec40f8bff1a8ee678793683e2725a4ce63563db6a +R 2f43d3dc3e17ee6fabc748016c417fe1 +T *branch * schema-version-instr +T *sym-schema-version-instr * +T -sym-begin-concurrent-pnu-wal2 * +U dan +Z a4635fc4d36ee98a47f7e6822a0b7770 # Remove this line to create a well-formed Fossil manifest. diff --git a/manifest.uuid b/manifest.uuid index fe26a19e6d..a8b7a517a4 100644 --- a/manifest.uuid +++ b/manifest.uuid @@ -1 +1 @@ -68a61513f9e064ed9e79638ec40f8bff1a8ee678793683e2725a4ce63563db6a \ No newline at end of file +44dd01e3152eba0b487f9ec5349ecc9e6474e94a10e3f4951b9d928ea39f53f0 \ No newline at end of file diff --git a/src/pager.c b/src/pager.c index 7aef60136f..3f60d1e66e 100644 --- a/src/pager.c +++ b/src/pager.c @@ -7905,4 +7905,8 @@ int sqlite3PagerWalFramesize(Pager *pPager){ } #endif +void sqlite3PagerIsSchemaVersion(Pager *pPager, u64 *a){ + sqlite3WalIsSchemaVersion(pPager->pWal, a); +} + #endif /* SQLITE_OMIT_DISKIO */ diff --git a/src/pager.h b/src/pager.h index 58bfc0fa19..05beca1366 100644 --- a/src/pager.h +++ b/src/pager.h @@ -274,4 +274,6 @@ int sqlite3PagerWalInfo(Pager*, u32 *pnPrior, u32 *pnFrame); # define enable_simulated_io_errors() #endif +void sqlite3PagerIsSchemaVersion(Pager*, u64*); + #endif /* SQLITE_PAGER_H */ diff --git a/src/pragma.c b/src/pragma.c index 7de9cfb4f9..ba904896c5 100644 --- a/src/pragma.c +++ b/src/pragma.c @@ -2066,6 +2066,7 @@ void sqlite3Pragma( case PragTyp_HEADER_VALUE: { int iCookie = pPragma->iArg; /* Which cookie to read or write */ sqlite3VdbeUsesBtree(v, iDb); + if( iCookie==BTREE_SCHEMA_VERSION ) sqlite3VdbeIsSchemaVersion(v); if( zRight && (pPragma->mPragFlg & PragFlg_ReadOnly)==0 ){ /* Write the specified cookie value */ static const VdbeOpList setCookie[] = { diff --git a/src/vdbe.c b/src/vdbe.c index e58ba74cf9..ec4058b81d 100644 --- a/src/vdbe.c +++ b/src/vdbe.c @@ -3849,8 +3849,18 @@ case OP_Transaction: { pDb = &db->aDb[pOp->p1]; pBt = pDb->pBt; + if( p->bSchemaVersion ){ + p->aSchemaVersion[SCHEMA_VERSION_OPTRANS] = sqlite3STimeNow(); + } + if( pBt ){ + if( p->bSchemaVersion ){ + sqlite3PagerIsSchemaVersion(sqlite3BtreePager(pBt), p->aSchemaVersion); + } rc = sqlite3BtreeBeginTrans(pBt, pOp->p2, &iMeta); + if( p->bSchemaVersion ){ + sqlite3PagerIsSchemaVersion(sqlite3BtreePager(pBt), 0); + } testcase( rc==SQLITE_BUSY_SNAPSHOT ); testcase( rc==SQLITE_BUSY_RECOVERY ); if( rc!=SQLITE_OK ){ @@ -3862,6 +3872,10 @@ case OP_Transaction: { goto abort_due_to_error; } + if( p->bSchemaVersion ){ + p->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE] = sqlite3STimeNow(); + } + if( p->usesStmtJournal && pOp->p2 && (db->autoCommit==0 || db->nVdbeRead>1) @@ -3953,6 +3967,10 @@ case OP_ReadCookie: { /* out2 */ sqlite3BtreeGetMeta(db->aDb[iDb].pBt, iCookie, (u32 *)&iMeta); pOut = out2Prerelease(p, pOp); pOut->u.i = iMeta; + if( p->bSchemaVersion ){ + p->aSchemaVersion[SCHEMA_VERSION_READDONE] = sqlite3STimeNow(); + sqlite3SchemaVersionLog(p); + } break; } @@ -8508,6 +8526,11 @@ case OP_Init: { /* jump */ */ assert( pOp->p4.z==0 || strncmp(pOp->p4.z, "-" "- ", 3)==0 ); + if( p->bSchemaVersion ){ + memset(p->aSchemaVersion, 0, sizeof(p->aSchemaVersion)); + p->aSchemaVersion[SCHEMA_VERSION_START] = sqlite3STimeNow(); + } + /* OP_Init is always instruction 0 */ assert( pOp==p->aOp || pOp->opcode==OP_Trace ); diff --git a/src/vdbe.h b/src/vdbe.h index eb1445f1db..6788963d23 100644 --- a/src/vdbe.h +++ b/src/vdbe.h @@ -392,4 +392,8 @@ void sqlite3VdbeScanStatus(Vdbe*, int, int, int, LogEst, const char*); void sqlite3VdbePrintOp(FILE*, int, VdbeOp*); #endif +void sqlite3VdbeIsSchemaVersion(Vdbe*); +void sqlite3SchemaVersionLog(Vdbe *v); +u64 sqlite3STimeNow(); + #endif /* SQLITE_VDBE_H */ diff --git a/src/vdbeInt.h b/src/vdbeInt.h index 0c6301c8f1..bf37cd8d7c 100644 --- a/src/vdbeInt.h +++ b/src/vdbeInt.h @@ -487,8 +487,21 @@ struct Vdbe { int nScan; /* Entries in aScan[] */ ScanStatus *aScan; /* Scan definitions for sqlite3_stmt_scanstatus() */ #endif + int bSchemaVersion; + u64 aSchemaVersion[6]; }; +#define SCHEMA_VERSION_START 0 /* OP_Init */ +#define SCHEMA_VERSION_OPTRANS 1 /* Start of OP_Transaction */ +#define SCHEMA_VERSION_BEFOREWALTBR 2 /* Before walTryBeginRead() loop */ +#define SCHEMA_VERSION_BEFOREWALSHARED 3 /* Before walTryBeginRead() loop */ +#define SCHEMA_VERSION_AFTERWALSHARED 4 /* Before walTryBeginRead() loop */ +#define SCHEMA_VERSION_BEGINTRANSDONE 5 /* After BeginTrans() */ +#define SCHEMA_VERSION_READDONE 6 /* End of OP_ReadCookie */ + +/* Call sqlite3_log() if "PRAGMA schema_version" is slower than this (in us) */ +#define SCHEMA_VERSION_TIMEOUT 2000000 + /* ** The following are allowed values for Vdbe.eVdbeState */ diff --git a/src/vdbeaux.c b/src/vdbeaux.c index 2ff02c82e9..d99eb2b9b6 100644 --- a/src/vdbeaux.c +++ b/src/vdbeaux.c @@ -5216,6 +5216,34 @@ int sqlite3NotPureFunc(sqlite3_context *pCtx){ return 1; } +#include +void sqlite3VdbeIsSchemaVersion(Vdbe *v){ + v->bSchemaVersion = 1; +} +void sqlite3SchemaVersionLog(Vdbe *v){ + u64 i1 = v->aSchemaVersion[SCHEMA_VERSION_START]; + if( v->aSchemaVersion[SCHEMA_VERSION_READDONE]>(i1+SCHEMA_VERSION_TIMEOUT) ){ + sqlite3_log(SQLITE_WARNING, + "slow \"PRAGMA schema_version\": (%d, %d, %d, %d, %d, %d)", + (int)(v->aSchemaVersion[SCHEMA_VERSION_OPTRANS] - i1), + (v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR]==0) ? 0 : + (int)(v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR] - i1), + (v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALSHARED]==0) ? 0 : + (int)(v->aSchemaVersion[SCHEMA_VERSION_BEFOREWALSHARED] - i1), + (v->aSchemaVersion[SCHEMA_VERSION_AFTERWALSHARED]==0) ? 0 : + (int)(v->aSchemaVersion[SCHEMA_VERSION_AFTERWALSHARED] - i1), + (v->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE]==0) ? 0 : + (int)(v->aSchemaVersion[SCHEMA_VERSION_BEGINTRANSDONE] - i1), + (int)(v->aSchemaVersion[SCHEMA_VERSION_READDONE] - i1) + ); + } +} +u64 sqlite3STimeNow(){ + struct timeval time; + gettimeofday(&time, 0); + return ((u64)time.tv_sec * 1000000 + (u64)time.tv_usec); +} + #ifndef SQLITE_OMIT_VIRTUALTABLE /* ** Transfer error message text from an sqlite3_vtab.zErrMsg (text stored diff --git a/src/wal.c b/src/wal.c index 5fe3c6ff1d..0385b0f8d2 100644 --- a/src/wal.c +++ b/src/wal.c @@ -435,6 +435,7 @@ #ifndef SQLITE_OMIT_WAL #include "wal.h" +#include "vdbeInt.h" /* ** Trace output macros @@ -802,6 +803,7 @@ struct Wal { #ifdef SQLITE_ENABLE_SETLK_TIMEOUT sqlite3 *db; #endif + u64 *aSchemaVersion; }; /* @@ -3435,6 +3437,10 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ assert( iWal!=1 || nBackfill!=1 || eLock==WAL_LOCK_PART2 ); assert( iWal!=1 || nBackfill!=0 || eLock==WAL_LOCK_PART2_FULL1 ); + if( pWal->aSchemaVersion ){ + pWal->aSchemaVersion[SCHEMA_VERSION_BEFOREWALSHARED] = sqlite3STimeNow(); + } + rc = walLockShared(pWal, WAL_READ_LOCK(eLock)); if( rc!=SQLITE_OK ){ return (rc==SQLITE_BUSY ? WAL_RETRY : rc); @@ -3446,6 +3452,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ }else{ pWal->readLock = eLock; } + if( pWal->aSchemaVersion ){ + pWal->aSchemaVersion[SCHEMA_VERSION_AFTERWALSHARED] = sqlite3STimeNow(); + } assert( pWal->minFrame==0 && walFramePage(pWal->minFrame)==0 ); }else{ u32 mxReadMark; /* Largest aReadMark[] value */ @@ -3712,6 +3721,10 @@ int sqlite3WalBeginReadTransaction(Wal *pWal, int *pChanged){ } #endif + if( pWal->aSchemaVersion ){ + pWal->aSchemaVersion[SCHEMA_VERSION_BEFOREWALTBR] = sqlite3STimeNow(); + } + do{ rc = walTryBeginRead(pWal, pChanged, 0, ++cnt); }while( rc==WAL_RETRY ); @@ -5331,4 +5344,10 @@ int sqlite3WalJournalMode(Wal *pWal){ return (isWalMode2(pWal) ? PAGER_JOURNALMODE_WAL2 : PAGER_JOURNALMODE_WAL); } +void sqlite3WalIsSchemaVersion(Wal *pWal, u64 *a){ + if( pWal ){ + pWal->aSchemaVersion = a; + } +} + #endif /* #ifndef SQLITE_OMIT_WAL */ diff --git a/src/wal.h b/src/wal.h index 137abcba2b..0ba96e792a 100644 --- a/src/wal.h +++ b/src/wal.h @@ -170,5 +170,7 @@ int sqlite3WalInfo(Wal *pWal, u32 *pnPrior, u32 *pnFrame); /* sqlite3_wal_info() data */ int sqlite3WalInfo(Wal *pWal, u32 *pnPrior, u32 *pnFrame); +void sqlite3WalIsSchemaVersion(Wal *pWal, u64 *a); + #endif /* ifndef SQLITE_OMIT_WAL */ #endif /* SQLITE_WAL_H */