From 820a87b6544be0e58f68fa5a3d371fc581039492 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 17 Feb 2022 17:42:00 +0800 Subject: [PATCH] fix definite lost while restore wal --- source/dnode/mnode/impl/src/mndTrans.c | 2 +- source/dnode/mnode/sdb/src/sdbHash.c | 19 +++++++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c index 5158f40c8f..99a5a3a475 100644 --- a/source/dnode/mnode/impl/src/mndTrans.c +++ b/source/dnode/mnode/impl/src/mndTrans.c @@ -354,7 +354,7 @@ static void mndTransDropData(STrans *pTrans) { mndTransDropActions(pTrans->redoActions); mndTransDropActions(pTrans->undoActions); if (pTrans->rpcRsp != NULL) { - rpcFreeCont(pTrans->rpcRsp); + free(pTrans->rpcRsp); pTrans->rpcRsp = NULL; pTrans->rpcRspLen = 0; } diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c index 315268a9e3..204cd870f4 100644 --- a/source/dnode/mnode/sdb/src/sdbHash.c +++ b/source/dnode/mnode/sdb/src/sdbHash.c @@ -16,6 +16,8 @@ #define _DEFAULT_SOURCE #include "sdbInt.h" +static void sdbCheck(SSdb *pSdb, SSdbRow *pRow); + const char *sdbTableName(ESdbType type) { switch (type) { case SDB_TRANS: @@ -221,6 +223,8 @@ static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow * pSdb->tableVer[pOldRow->type]++; sdbFreeRow(pSdb, pRow); + + sdbCheck(pSdb, pOldRow); // sdbRelease(pSdb, pOldRow->pObj); return 0; } @@ -305,6 +309,19 @@ void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) { return pRet; } +static void sdbCheck(SSdb *pSdb, SSdbRow *pRow) { + SRWLatch *pLock = &pSdb->locks[pRow->type]; + taosRLockLatch(pLock); + + int32_t ref = atomic_load_32(&pRow->refCount); + sdbPrintOper(pSdb, pRow, "checkRow"); + if (ref <= 0 && pRow->status == SDB_STATUS_DROPPED) { + sdbFreeRow(pSdb, pRow); + } + + taosRUnLockLatch(pLock); +} + void sdbRelease(SSdb *pSdb, void *pObj) { if (pObj == NULL) return; @@ -332,6 +349,7 @@ void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) { SRWLatch *pLock = &pSdb->locks[type]; taosRLockLatch(pLock); +#if 0 if (pIter != NULL) { SSdbRow *pLastRow = *(SSdbRow **)pIter; int32_t ref = atomic_load_32(&pLastRow->refCount); @@ -339,6 +357,7 @@ void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) { sdbFreeRow(pSdb, pLastRow); } } +#endif SSdbRow **ppRow = taosHashIterate(hash, pIter); while (ppRow != NULL) {