From 00a79eb4860e797237a53cf1fd975e2824d41850 Mon Sep 17 00:00:00 2001 From: zengchuanrui Date: Tue, 29 Apr 2025 19:26:25 +0800 Subject: [PATCH] sync_5.1 Signed-off-by: ryne3366 --- src/sqlite3.c | 68 +++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 52 insertions(+), 16 deletions(-) diff --git a/src/sqlite3.c b/src/sqlite3.c index 24c6b8c..a4cbde0 100644 --- a/src/sqlite3.c +++ b/src/sqlite3.c @@ -3220,7 +3220,7 @@ SQLITE_API void sqlite3_free_table(char **result); #else # define EXPORT_SYMBOLS #endif - +#endif /* ** CAPI3REF: Formatted String Printing Functions ** @@ -41701,6 +41701,7 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ (sStat.st_mode&0777)); } if( pShmNode->hShm<0 ){ + int sysno = errno; pShmNode->hShm = robust_open(zShm, O_RDONLY|O_NOFOLLOW, (sStat.st_mode&0777)); if( pShmNode->hShm<0 ){ @@ -41708,6 +41709,9 @@ static int unixOpenSharedMemory(unixFile *pDbFd){ goto shm_open_err; } pShmNode->isReadonly = 1; +#ifdef LOG_DUMP + sqlite3_log(SQLITE_WARNING_DUMP, "OpenSharedMemory node set to readonly sysno[%d]", sysno); +#endif } /* If this process is running as root, make sure that the SHM file @@ -43291,6 +43295,9 @@ static int unixOpen( flags |= SQLITE_OPEN_READONLY; openFlags |= O_RDONLY; isReadonly = 1; +#ifdef LOG_DUMP + sqlite3_log(SQLITE_WARNING_DUMP, "Try open file readonly sysno %d", errno); +#endif fd = robust_open(zName, openFlags, openMode); } } @@ -60662,6 +60669,10 @@ SQLITE_PRIVATE int sqlite3PagerOpen( if( (iDc & SQLITE_IOCAP_IMMUTABLE)!=0 || sqlite3_uri_boolean(pPager->zFilename, "immutable", 0) ){ vfsFlags |= SQLITE_OPEN_READONLY; +#ifdef LOG_DUMP + sqlite3_log(SQLITE_WARNING_DUMP, "Vfsflag set to readonly, readOnly[%d], vfsFlags[%d], sysno[%d]", + readOnly, vfsFlags, errno); +#endif goto act_like_temp_file; } } @@ -64215,6 +64226,9 @@ static SQLITE_NOINLINE int walIndexPageRealloc( if( iPage>0 && sqlite3FaultSim(600) ) rc = SQLITE_NOMEM; }else if( (rc&0xff)==SQLITE_READONLY ){ pWal->readOnly |= WAL_SHM_RDONLY; +#ifdef LOG_DUMP + sqlite3_log(rc, "PagerRealloc wal set to readonly, sysno[%d]", errno); +#endif if( rc==SQLITE_READONLY ){ rc = SQLITE_OK; } @@ -67443,6 +67457,7 @@ static sqlite3_int64 g_lastCkptTime = 0; ** If parameter xBusy is not NULL, it is a pointer to a busy-handler ** callback. In this case this function runs a blocking checkpoint. */ +static void walLogCheckpointInfo(Wal *pWal, sqlite3 *db, sqlite3_int64 startTime); SQLITE_PRIVATE int sqlite3WalCheckpoint( Wal *pWal, /* Wal connection */ sqlite3 *db, /* Check this handle's interrupt flag */ @@ -67534,7 +67549,12 @@ SQLITE_PRIVATE int sqlite3WalCheckpoint( -1, 0, zMsg, NULL); rc = SQLITE_CORRUPT_REPORT(&context); }else{ + sqlite3_int64 startTime; + sqlite3OsCurrentTimeInt64(db->pVfs, &startTime); rc = walCheckpoint(pWal, db, eMode2, xBusy2, pBusyArg, sync_flags, zBuf); + if (rc == SQLITE_OK){ + walLogCheckpointInfo(pWal, db, startTime); + } } /* If no error occurred, set the output variables. */ @@ -72325,6 +72345,9 @@ static int lockBtree(BtShared *pBt){ #else if( page1[18]>2 ){ pBt->btsFlags |= BTS_READ_ONLY; +#ifdef LOG_DUMP + sqlite3_log(SQLITE_WARNING_DUMP, "Mark bts readonly %u", get4byte(&page1[18])); +#endif } if( page1[19]>2 ){ goto page1_init_failed; @@ -246060,15 +246083,6 @@ static inline void MarkLockStatusByRc(int rc, u32 lockIdx, u32 lockLen, u8 lockT } } -static inline const char *TrxLockName(int eLock) -{ - return eLock == NO_LOCK ? "NO_LOCK" : - eLock == RESERVED_LOCK ? "RESERVED" : - eLock == EXCLUSIVE_LOCK ? "EXCLUSIVE" : - eLock == SHARED_LOCK ? "SHARED" : - eLock == UNKNOWN_LOCK ? "UNKNOWN" : "UNKNOWN_LOCK"; -} - static inline const char *IdxToLockName(u32 idx) { const char *lockName[MAX_LOCK_NUM] = {"write", "ckpt", "recover", "read0", @@ -246085,7 +246099,7 @@ static void DumpHandleLock(char *dumpBuf, int dumpBufLen) for (int i = 0; i < MAX_LOCK_NUM && availLen > DUMP_MAX_STR_LEN; i++) { if (lockStatus[i] != NO_LOCK) { tmp[0] = '\0'; - sqlite3_snprintf(availLen, tmp, "<%s, %s>", IdxToLockName((u32)i), TrxLockName(lockStatus[i])); + sqlite3_snprintf(availLen, tmp, "<%s, %d>", IdxToLockName((u32)i), lockStatus[i]); int len = strlen(tmp); tmp += len; availLen -= len; @@ -246124,8 +246138,8 @@ static void DumpTrxProcessLocks(unixFile *file, char *dumpBuf, int dumpBufLen) sqlite3_log(SQLITE_ERROR, "[SQLite]Inode is null!"); return; } - sqlite3_log(SQLITE_WARNING_DUMP, "[SQLite]acqLock:%s, dbRef:%d, lockCnt:%d, curLock:%s, processLock:%d", - TrxLockName(file->eFileLock), inode->nRef, inode->nLock, TrxLockName(inode->eFileLock), inode->bProcessLock); + sqlite3_log(SQLITE_WARNING_DUMP, "[SQLite]acqLock:%d, dbRef:%d, lockCnt:%d, curLock:%d, processLock:%d", + file->eFileLock, inode->nRef, inode->nLock, inode->eFileLock, inode->bProcessLock); const char *lockName[DB_LOCK_NUM] = {"pending", "reserved", "shared_first"}; char *tmp = dumpBuf; int availLen = dumpBufLen - 1; @@ -246145,16 +246159,19 @@ static void DumpTrxProcessLocks(unixFile *file, char *dumpBuf, int dumpBufLen) static void DumpWalLocks(unixFile *file, u8 walEnabled, char *dumpBuf, int dumpBufLen) { - if (!walEnabled || file->pShm == NULL || file->pShm->pShmNode == NULL) { - sqlite3_log(SQLITE_ERROR, "[SQLite]Wal mode disabled!"); + if (file->pShm == NULL || file->pShm->pShmNode == NULL) { + sqlite3_log(SQLITE_ERROR, "[SQLite]Wal mode disabled! pShm or pShmNode is NULL"); return; } + if (!walEnabled) { + sqlite3_log(SQLITE_WARNING_DUMP, "[SQLite] walEnabled false"); + } unixShmNode *pShmNode = file->pShm->pShmNode; char *tmp = dumpBuf; int availLen = dumpBufLen - 1; dumpBuf[availLen] = '\0'; for (int i = 0; i < WAL_LOCK_NUM && availLen > DUMP_MAX_STR_LEN; i++) { - if (pShmNode->aLock[i] && i < SQLITE_SHM_NLOCK) { + if (i < SQLITE_SHM_NLOCK && pShmNode->aLock[i]) { tmp[0] = '\0'; sqlite3_snprintf(availLen, tmp, "<%s, %d, tid:%d>", IdxToLockName((u32)i), pShmNode->aLock[i], pShmNode->aLockTid[i]); @@ -246217,6 +246234,25 @@ static void DumpLocksByPager(Pager *pPager) } #endif /* SQLITE_OS_UNIX */ +#ifndef SQLITE_OMIT_WAL +static void walLogCheckpointInfo(Wal *pWal, sqlite3 *db, sqlite3_int64 startTime) { + sqlite3_int64 endTime; + sqlite3OsCurrentTimeInt64(db->pVfs, &endTime); + sqlite3_int64 timeUse = endTime - startTime; + static sqlite3_int64 lastDumpTime = 0; + static sqlite3_int64 ckptCnt = 0; + /* Only when timeUse > 1500ms or wal size > 50MB, default pageSize 4K, 50*1024/4 = 12800 */ + if (timeUse > 1500 || (pWal->hdr.mxFrame > 12800 && (lastDumpTime - endTime) > 2000)) { + sqlite3_log(SQLITE_WARNING_DUMP, "[SQLite]Wal try ckpt count %d use time: %lld(ms), wal frame: %u", + ckptCnt, timeUse, pWal->hdr.mxFrame); + lastDumpTime = endTime; + ckptCnt = 0; + } + ckptCnt++; +} +#endif +// hw export the symbols +#ifdef SQLITE_EXPORT_SYMBOLS struct sqlite3_api_routines_hw { int (*initialize)(); int (*config)(int,...); -- Gitee