From 4a648032781d789d413ecd68d2bb2a46ce39906f Mon Sep 17 00:00:00 2001 From: Minglei Jin Date: Sun, 9 Oct 2022 16:39:59 +0800 Subject: [PATCH] fix(tdb): subtract payload size with cell header size --- source/libs/tdb/src/db/tdbBtree.c | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index c5204ef59e..f663f4363d 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -1003,14 +1003,14 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const int nLeft = nPayload; int bytes; int lastPage = 0; - if (nLocal >= kLen + 4) { + if (nLocal >= nHeader + kLen + sizeof(SPgno)) { // pack key to local memcpy(pCell + nHeader, pKey, kLen); nLeft -= kLen; // pack partial val to local if any space left - if (nLocal > kLen + 4) { - memcpy(pCell + nHeader + kLen, pVal, nLocal - kLen - sizeof(SPgno)); - nLeft -= nLocal - kLen - sizeof(SPgno); + if (nLocal > nHeader + kLen + sizeof(SPgno)) { + memcpy(pCell + nHeader + kLen, pVal, nLocal - nHeader - kLen - sizeof(SPgno)); + nLeft -= nLocal - nHeader - kLen - sizeof(SPgno); } // pack nextPgno @@ -1150,9 +1150,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const // free local buffer tdbFree(pBuf); - *szPayload = nLocal; - - // ASSERT(0); + *szPayload = nLocal - nHeader; } return 0; @@ -1246,10 +1244,10 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, int bytes; int lastPage = 0; - if (nLocal >= pDecoder->kLen + 4) { + if (nLocal >= pDecoder->kLen + nHeader + sizeof(SPgno)) { pDecoder->pKey = (SCell *)pCell + nHeader; nLeft -= kLen; - if (nLocal > kLen + 4) { + if (nLocal > kLen + nHeader + sizeof(SPgno)) { // read partial val to local pDecoder->pVal = tdbRealloc(pDecoder->pVal, vLen); if (pDecoder->pVal == NULL) { @@ -1259,9 +1257,9 @@ static int tdbBtreeDecodePayload(SPage *pPage, const SCell *pCell, int nHeader, tdbDebug("tdb btc decoder: %p/0x%x pVal: %p ", pDecoder, pDecoder->freeKV, pDecoder->pVal); - memcpy(pDecoder->pVal, pCell + nHeader + kLen, nLocal - kLen - sizeof(SPgno)); + memcpy(pDecoder->pVal, pCell + nHeader + kLen, nLocal - nHeader - kLen - sizeof(SPgno)); - nLeft -= nLocal - kLen - sizeof(SPgno); + nLeft -= nLocal - nHeader - kLen - sizeof(SPgno); } memcpy(&pgno, pCell + nHeader + nPayload - nLeft, sizeof(pgno)); @@ -1474,7 +1472,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * int nPayload = kLen + vLen; if (nHeader + nPayload <= pPage->maxLocal) { - return nHeader + kLen + vLen; + return nHeader + nPayload; } else { int maxLocal = pPage->maxLocal; @@ -1486,7 +1484,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * // free ofp pages' cells if (dropOfp) { int ret = 0; - SPgno pgno = *(SPgno *)(pCell + nHeader + nLocal - sizeof(SPgno)); + SPgno pgno = *(SPgno *)(pCell + nLocal - sizeof(SPgno)); int nLeft = nPayload - nLocal + sizeof(SPgno); SPage *ofp; int bytes; @@ -1513,7 +1511,7 @@ static int tdbBtreeCellSize(const SPage *pPage, SCell *pCell, int dropOfp, TXN * } } - return nHeader + nLocal; + return nLocal; } } // TDB_BTREE_CELL