From f4772937f0f9f7f31e5960885a1be12da984172b Mon Sep 17 00:00:00 2001 From: wuyichen <664334617@qq.com> Date: Mon, 14 Oct 2024 16:37:37 +0800 Subject: [PATCH] PrintLockInfo cherry-pick from: bcce191be3a3aafd741e1f1f22f8410e70f9d12c cherry-pick from: 828ab50af7553452401873e56f70e26486e09962 cherry-pick from: 5e801579346f51b924ab2161705b00e5a24b4258 Signed-off-by: wuyichen <664334617@qq.com> --- src/sqlite3.c | 116 +++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 115 insertions(+), 1 deletion(-) diff --git a/src/sqlite3.c b/src/sqlite3.c index 13c791b..3d089e5 100644 --- a/src/sqlite3.c +++ b/src/sqlite3.c @@ -66072,6 +66072,7 @@ static int walBeginShmUnreliable(Wal *pWal, int *pChanged){ ** so it takes care to hold an exclusive lock on the corresponding ** WAL_READ_LOCK() while changing values. */ +static void printLockInfoUsingWal(Wal *pWal); static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ volatile WalCkptInfo *pInfo; /* Checkpoint information in wal-index */ u32 mxReadMark; /* Largest aReadMark[] value */ @@ -66109,6 +66110,9 @@ static int walTryBeginRead(Wal *pWal, int *pChanged, int useWal, int cnt){ return SQLITE_PROTOCOL; } if( cnt>=10 ) nDelay = (cnt-9)*(cnt-9)*39; +#if SQLITE_OS_UNIX + if( cnt>=15 ) printLockInfoUsingWal(pWal); +#endif /* SQLITE_OS_UNIX */ sqlite3OsSleep(pWal->pVfs, nDelay); } @@ -71028,6 +71032,7 @@ static void pageReinit(DbPage *pData){ } } +static void printLockInfoUsingPager(Pager *pPager); /* ** Invoke the busy handler for a btree. */ @@ -71035,7 +71040,13 @@ static int btreeInvokeBusyHandler(void *pArg){ BtShared *pBt = (BtShared*)pArg; assert( pBt->db ); assert( sqlite3_mutex_held(pBt->db->mutex) ); - return sqlite3InvokeBusyHandler(&pBt->db->busyHandler); + int rc = sqlite3InvokeBusyHandler(&pBt->db->busyHandler); +#if SQLITE_OS_UNIX + if( rc==0 ){ + printLockInfoUsingPager( pBt->pPager ); + } +#endif /* SQLITE_OS_UNIX */ + return rc; } /* @@ -246026,6 +246037,109 @@ export_finish: /************** End file hw_codec.c *****************************************/ #endif +#if SQLITE_OS_UNIX +#define DB_LOCK_NUM 3 +#define DB_SHARED_LOCK_OFFSET 2 +#define WAL_LOCK_NUM 8 +#define WAL_READ_LOCK_POS 3 +#define LOCK_NUM (DB_LOCK_NUM+WAL_LOCK_NUM) +static void printLockInfo(unixFile *dbFile, int walStat) +{ + const char *lockType[DB_LOCK_NUM] = {"F_RDLCK", "F_WRLCK", "F_UNLCK"}; + + sqlite3_log(SQLITE_WARNING, "*** SQLITE_LOG DB Lock ***"); + if( dbFile==NULL ){ + sqlite3_log(SQLITE_WARNING, "NO DB FILE !"); + return; + } + unixInodeInfo *inode = dbFile->pInode; + if( inode==NULL ){ + sqlite3_log(SQLITE_ERROR, "Inode is NULL !"); + return; + } + sqlite3_log(SQLITE_WARNING, "fileLock %d inodeRef %d inodeLockCnt %d inodeFileLock %d inodeProcessLock %d", + dbFile->eFileLock, inode->nRef, inode->nLock, inode->eFileLock, inode->bProcessLock); + + /* Set param list */ + int fdDb = dbFile->h; + const char *lockNameList[LOCK_NUM] = {"pending lock ", + "reserved lock", + "shared lock ", + "wal_write lock ", + "wal_ckpt lock ", + "wal_recover lock"}; + for(int i=DB_LOCK_NUM+WAL_READ_LOCK_POS; ipInode->pShmNode; + int hasShm = (dbFile->pShm==NULL || pShmNode==NULL) ? 0 : 1; + off_t startPos = PENDING_BYTE; + for(int i=0; ihShm; + } + off_t lockLen = i==DB_SHARED_LOCK_OFFSET ? SHARED_SIZE : 1; + struct flock flDb = { .l_type=F_WRLCK, .l_start=startPos, .l_len=lockLen, .l_whence=SEEK_SET }; + int ret = osFcntl(fdDb, F_GETLK, &flDb); + if( ret!=SQLITE_OK ){ + sqlite3_log(SQLITE_ERROR, "Get File Lock Info Fail! errno: %d", ret); + return; + } + if( flDb.l_type!=F_UNLCK ){ + sqlite3_log(SQLITE_WARNING, "lock name: %s, pos: 0x%x, len: 0x%x, lock type: %s, owner pId: %d", + lockNameList[i], startPos, lockLen, lockType[flDb.l_type], flDb.l_pid); + } + startPos++; + } + + /* thread WAL Lock Info */ + for(int i=0; ipShm->pShmNode->aLock[i] ){ + sqlite3_log(SQLITE_WARNING, "Local WAL Lock[%d] for DB file: %d", i, dbFile->pShm->pShmNode->aLock[i]); + } + } +} + +#ifndef SQLITE_OMIT_WAL +static void printLockInfoUsingWal(Wal *pWal) +{ + if( pWal==NULL ){ + sqlite3_log(SQLITE_ERROR, "Wal ptr is NULL!"); + return; + } + if( pWal->pVfs==NULL || sqlite3_stricmp(pWal->pVfs->zName, "unix")!=0 ){ + return; + } + printLockInfo((unixFile *)(pWal->pDbFd), 1); +} +#endif /* #ifndef SQLITE_OMIT_WAL */ + +static void printLockInfoUsingPager(Pager *pPager) +{ + if( pPager==NULL ){ + sqlite3_log(SQLITE_ERROR, "Pager ptr is NULL!"); + return; + } + if( pPager->pVfs==NULL || sqlite3_stricmp(pPager->pVfs->zName, "unix")!=0 ){ + return; + } +#ifndef SQLITE_OMIT_WAL + printLockInfo((unixFile *)(pPager->fd), pPager->pWal!=NULL); +#else /* #ifndef SQLITE_OMIT_WAL */ + printLockInfo((unixFile *)(pPager->fd), 0); +#endif /* #ifndef SQLITE_OMIT_WAL */ +} +#endif /* SQLITE_OS_UNIX */ + // hw export the symbols #ifdef SQLITE_EXPORT_SYMBOLS #if defined(__GNUC__) -- Gitee