From f643fcb7cdf0913dffb965c6631dba111eb13d12 Mon Sep 17 00:00:00 2001 From: ryne3366 Date: Tue, 27 May 2025 16:24:19 +0800 Subject: [PATCH] Enhance busy log and add corrupt debug log Signed-off-by: ryne3366 --- patch/0007-Bugfix-on-current-version.patch | 236 ++++++++++++++++++++- 1 file changed, 225 insertions(+), 11 deletions(-) diff --git a/patch/0007-Bugfix-on-current-version.patch b/patch/0007-Bugfix-on-current-version.patch index 80567a1..3cb2d20 100644 --- a/patch/0007-Bugfix-on-current-version.patch +++ b/patch/0007-Bugfix-on-current-version.patch @@ -1,18 +1,56 @@ -From 8d6efba6380ce511d82898451884835aba14dd3d Mon Sep 17 00:00:00 2001 +From d96edfb55be3895eb2468ac461772df2855e79b6 Mon Sep 17 00:00:00 2001 From: ryne3366 -Date: Sat, 24 May 2025 16:18:20 +0800 -Subject: [PATCH] attach no key specified, use null key +Date: Tue, 27 May 2025 16:18:04 +0800 +Subject: [PATCH] add corrupt log -Signed-off-by: ryne3366 --- - src/sqlite3.c | 52 +++++++++++++++++++++++++++++++++++++++++---------- - 1 file changed, 42 insertions(+), 10 deletions(-) + src/sqlite3.c | 203 +++++++++++++++++++++++++++++++++++++++++--------- + 1 file changed, 168 insertions(+), 35 deletions(-) diff --git a/src/sqlite3.c b/src/sqlite3.c -index 2f26487..fac1ec2 100644 +index 3ae7a1a..abe918d 100644 --- a/src/sqlite3.c +++ b/src/sqlite3.c -@@ -121506,8 +121506,8 @@ static void attachFunc( +@@ -57775,6 +57775,8 @@ static void MetaDwrCheckVacuum(BtShared *pBt); + static int MetaDwrRecoverAndBeginTran(Btree *pBt, int wrflag, int *pSchemaVersion); + static int MetaDwrOpenAndCheck(Btree *pBt); + static void MetaDwrDisable(Btree *pBt); ++static void MetaDwrDumpInfo(Pager *pPager); ++static void MetaDwrCommitUpdate(Pager *pPager); + #define META_HEADER_CHANGED 1 + #define META_SCHEMA_CHANGED 2 + #define META_IN_RECOVERY 1 +@@ -59553,11 +59555,12 @@ static int pager_end_transaction(Pager *pPager, int hasSuper, int bCommit){ + sqlite3PcacheTruncate(pPager->pPCache, pPager->dbSize); + } + #ifdef SQLITE_META_DWR +- if (bCommit && pPager->metaChanged != 0) { +- sqlite3BeginBenignMalloc(); +- (void)MetaDwrWriteHeader(pPager, pPager->metaHdr); +- sqlite3EndBenignMalloc(); +- pPager->metaChanged = 0; ++ if (bCommit) { ++ MetaDwrCommitUpdate(pPager); ++ if (pPager->metaChanged != 0) { ++ (void)MetaDwrWriteHeader(pPager, pPager->metaHdr); ++ pPager->metaChanged = 0; ++ } + } + #endif + if( pagerUseWal(pPager) ){ +@@ -74658,6 +74661,11 @@ static int lockBtree(BtShared *pBt){ + } + if( nPage>nPageFile ){ + if( sqlite3WritableSchema(pBt->db)==0 ){ ++ sqlite3_log(SQLITE_WARNING_DUMP, "sqlite3WritableSchema nPage %d nPageFile %d", nPage, nPageFile); ++#ifdef SQLITE_META_DWR ++ DumpLocksByPager(pBt->pPager); ++ MetaDwrDumpInfo(pBt->pPager); ++#endif + rc = SQLITE_CORRUPT_BKPT; + goto page1_init_failed; + }else{ +@@ -121506,8 +121514,8 @@ static void attachFunc( if( rc==SQLITE_OK ){ extern int sqlite3CodecAttach(sqlite3*, int, const void*, int); extern void sqlite3CodecGetKey(sqlite3*, int, void**, int*); @@ -23,7 +61,7 @@ index 2f26487..fac1ec2 100644 int t = sqlite3_value_type(argv[2]); switch( t ){ case SQLITE_INTEGER: -@@ -121524,14 +121524,7 @@ static void attachFunc( +@@ -121524,14 +121532,7 @@ static void attachFunc( break; case SQLITE_NULL: @@ -39,7 +77,24 @@ index 2f26487..fac1ec2 100644 break; } } -@@ -204144,6 +204137,39 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ +@@ -183691,10 +183692,12 @@ opendb_out: + db->eOpenState = SQLITE_STATE_SICK; + } + #ifdef SQLITE_ENABLE_DROPTABLE_CALLBACK +- db->isDropTable = 0; +- db->mDropTableName = NULL; +- db->mDropSchemaName = NULL; +- db->xDropTableHandle = NULL; ++ if( db!=0 ){ ++ db->isDropTable = 0; ++ db->mDropTableName = NULL; ++ db->mDropSchemaName = NULL; ++ db->xDropTableHandle = NULL; ++ } + #endif /* SQLITE_ENABLE_DROPTABLE_CALLBACK */ + #ifdef SQLITE_ENABLE_BINLOG + sqlite3BinlogReset(db); +@@ -204144,6 +204147,39 @@ static int fts3ExprTermOffsetInit(Fts3Expr *pExpr, int iPhrase, void *ctx){ return rc; } @@ -79,7 +134,7 @@ index 2f26487..fac1ec2 100644 /* ** Implementation of offsets() function. */ -@@ -204180,6 +204206,12 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( +@@ -204180,6 +204216,12 @@ SQLITE_PRIVATE void sqlite3Fts3Offsets( sCtx.iDocid = pCsr->iPrevId; sCtx.pCsr = pCsr; @@ -92,6 +147,165 @@ index 2f26487..fac1ec2 100644 /* Loop through the table columns, appending offset information to ** string-buffer res for each column. */ +@@ -254366,7 +254408,20 @@ SQLITE_API int sqlite3_stmt_init( + /* Return the source-id for this library */ + SQLITE_API const char *sqlite3_sourceid(void){ return SQLITE_SOURCE_ID; } + /************************** End of sqlite3.c ******************************/ +- ++#if SQLITE_OS_UNIX ++#include ++#include ++static inline int OsGetTid(void) ++{ ++#if defined(__linux__) ++ return (int)syscall(__NR_gettid); ++#elif defined(__APPLE__) ++ return (int)syscall(SYS_thread_selfid); ++#else ++ return 0; ++#endif ++} ++#endif + #ifdef SQLITE_HAS_CODEC + /************** Begin file hw_codec_openssl.h *******************************/ + #ifndef EXPOSE_INTERNAL_FUNC +@@ -256014,7 +256069,12 @@ typedef struct MetaDwrHdr { + u32 pageSz; + u32 pageCnt; + u64 dbFileInode; +- u32 reserved[12]; ++ u64 walShmFileIno; ++ u64 updateTimeStamp; ++ int updateTid; ++ int updatePid; ++ u32 walFrameCksum[2]; ++ u32 reserved[4]; + u32 checkSum; + u8 *zones; + Pgno *pages; +@@ -256369,6 +256429,87 @@ static inline u64 CaculateMetaDwrWriteOffset(int pageSz, u32 idx, u8 zone) { + return META_DWR_HEADER_PAGE_SIZE + pageSz * (idx * 2 + zone); + } + ++static void MetaDwrDumpInfo(Pager *pPager) ++{ ++ MetaDwrHdr *hdr = pPager->metaHdr; ++ if (hdr != NULL) { ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr dbSize %u mxFrameInWal %u dbIno %lu walShmIno %lu", ++ hdr->dbSize, hdr->mxFrameInWal, hdr->dbFileInode, hdr->walShmFileIno); ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr updatestamp %ld updatetid %d updatepid %d", ++ hdr->updateTimeStamp, hdr->updateTid, hdr->updatePid); ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr ckSum0 %u ckSum1 %u", hdr->walFrameCksum[0], hdr->walFrameCksum[1]); ++ } ++#ifndef SQLITE_OMIT_WAL ++ if (!pagerUseWal(pPager)) { ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr ignore dump wal info"); ++ return; ++ } ++ WalIndexHdr *pWalHdr = &pPager->pWal->hdr; ++ sqlite3_log(SQLITE_WARNING_DUMP, "wal ckSum0 %u ckSum1 %u maxFram %u nPage %u", pWalHdr->aFrameCksum[0], ++ pWalHdr->aFrameCksum[1], pWalHdr->mxFrame, pWalHdr->nPage); ++#if SQLITE_OS_UNIX ++ if (hdr == NULL || !hdr->checkFileId) { ++ return; ++ } ++ unixFile *fd = (unixFile *)pPager->fd; ++ if (fd == NULL || fd->pInode == NULL) { ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr dump invalid db fd"); ++ return; ++ } ++ if (fd->pShm == NULL || fd->pShm->pShmNode == NULL || fd->pShm->pShmNode->hShm < 0) { ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr dump invalid shm fd"); ++ return; ++ } ++ struct stat sStat; ++ if (osFstat(fd->pShm->pShmNode->hShm, &sStat)) { ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr dump shm stat go wrong %d", errno); ++ return; ++ } ++ sqlite3_log(SQLITE_WARNING_DUMP, "MetaDwr shm ino %lld", (i64)sStat.st_ino); ++#endif ++#endif ++} ++ ++static void MetaDwrCommitUpdate(Pager *pPager) ++{ ++#if SQLITE_OS_UNIX ++ MetaDwrHdr *hdr = pPager->metaHdr; ++ if (hdr == NULL) { ++ return; ++ } ++ hdr->updateTid = OsGetTid(); ++ hdr->updatePid = osGetpid(); ++ struct timeval time; ++ gettimeofday(&time, NULL); ++ hdr->updateTimeStamp = time.tv_sec * 1000 + time.tv_usec / 1000; ++#ifndef SQLITE_OMIT_WAL ++ if (pagerUseWal(pPager)) { ++ WalIndexHdr *pWalHdr = &pPager->pWal->hdr; ++ if (pWalHdr->isInit) { ++ hdr->walFrameCksum[0] = pWalHdr->aFrameCksum[0]; ++ hdr->walFrameCksum[1] = pWalHdr->aFrameCksum[1]; ++ } ++ } ++#endif ++#if !defined(NDEBUG) ++ if (!hdr->checkFileId) { ++ return; ++ } ++ if (fd == NULL || fd->pShm == NULL || fd->pShm->pShmNode == NULL || fd->pShm->pShmNode->hShm < 0) { ++ sqlite3_log(SQLITE_WARNING_DUMP, "update meta header invalid shm fd"); ++ return; ++ } ++ struct stat sStat; ++ if (osFstat(fd->pShm->pShmNode->hShm, &sStat)) { ++ hdr->walShmFileIno = 0; ++ sqlite3_log(SQLITE_WARNING_DUMP, "update meta header stat go wrong %d", errno); ++ return; ++ } ++ hdr->walShmFileIno = sStat.st_ino; ++#endif ++#endif ++} ++ + static void MetaDwrUpdateHeaderDbInfo(BtShared *pBt) { + MetaDwrHdr *hdr = pBt->pPager->metaHdr; + // 28 offset: dbSize, freelist pageNo, freelist pages count, schema cookie +@@ -257055,19 +257196,6 @@ static void MetaDwrDisable(Btree *pBt) + } + #endif + #if SQLITE_OS_UNIX +-#include +-#include +-static inline int OsGetTid(void) +-{ +-#if defined(__linux__) +- return (int)syscall(__NR_gettid); +-#elif defined(__APPLE__) +- return (int)syscall(SYS_thread_selfid); +-#else +- return 0; +-#endif +-} +- + static void ResetLockStatus(void) + { + (void)memset(&g_lockStatus, 0, sizeof(g_lockStatus)); +@@ -257171,8 +257299,13 @@ static inline const char *FlockToName(int l_type) + + static int DumpProcessLocks(int fd, struct flock *lock, const char *lockName, char *dumpBuf, int bufLen) + { ++#ifdef F_OFD_GETLK ++ int lkType = F_OFD_GETLK; ++#else ++ int lkType = F_GETLK; ++#endif + dumpBuf[0] = '\0'; +- if (osFcntl(fd, F_GETLK, lock) != SQLITE_OK) { ++ if (osFcntl(fd, lkType, lock) != SQLITE_OK) { + sqlite3_log(SQLITE_ERROR, "[SQLite]Get wal file lock ofs %u failed, errno: %d", lock->l_start, errno); + return 0; + } -- 2.34.1 -- Gitee