diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c index 7a62b38b16..ca53d1a073 100644 --- a/source/libs/tdb/src/db/tdbBtree.c +++ b/source/libs/tdb/src/db/tdbBtree.c @@ -274,6 +274,7 @@ int tdbBtreeDelete(SBTree *pBt, const void *pKey, int kLen, TXN *pTxn) { return 0; } +#if 0 int tdbBtreeUpsert(SBTree *pBt, const void *pKey, int nKey, const void *pData, int nData, TXN *pTxn) { SBTC btc = {0}; int c; @@ -317,6 +318,7 @@ int tdbBtreeUpsert(SBTree *pBt, const void *pKey, int nKey, const void *pData, i tdbBtcClose(&btc); return 0; } +#endif int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen) { return tdbBtreePGet(pBt, pKey, kLen, NULL, NULL, ppVal, vLen); @@ -2490,6 +2492,10 @@ int tdbBtcClose(SBTC *pBtc) { pBtc->idx = pBtc->idxStack[pBtc->iPage]; } + if (TDB_CELLDECODER_FREE_KEY(&pBtc->coder)) { + tdbFree(pBtc->coder.pKey); + } + if (TDB_CELLDECODER_FREE_VAL(&pBtc->coder)) { tdbDebug("tdb btc/close decoder: %p pVal free: %p", &pBtc->coder, pBtc->coder.pVal); diff --git a/source/libs/tdb/src/db/tdbTable.c b/source/libs/tdb/src/db/tdbTable.c index 446a21f312..3bc6f75bef 100644 --- a/source/libs/tdb/src/db/tdbTable.c +++ b/source/libs/tdb/src/db/tdbTable.c @@ -202,7 +202,8 @@ int tdbTbInsert(TTB *pTb, const void *pKey, int keyLen, const void *pVal, int va int tdbTbDelete(TTB *pTb, const void *pKey, int kLen, TXN *pTxn) { return tdbBtreeDelete(pTb->pBt, pKey, kLen, pTxn); } int tdbTbUpsert(TTB *pTb, const void *pKey, int kLen, const void *pVal, int vLen, TXN *pTxn) { - return tdbBtreeUpsert(pTb->pBt, pKey, kLen, pVal, vLen, pTxn); + tdbTbDelete(pTb, pKey, kLen, pTxn); + return tdbTbInsert(pTb, pKey, kLen, pVal, vLen, pTxn); } int tdbTbGet(TTB *pTb, const void *pKey, int kLen, void **ppVal, int *vLen) { diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h index b3351cf787..b359f8a4cc 100644 --- a/source/libs/tdb/src/inc/tdbInt.h +++ b/source/libs/tdb/src/inc/tdbInt.h @@ -160,7 +160,7 @@ int tdbBtreeOpen(int keyLen, int valLen, SPager *pFile, char const *tbname, SPgn int tdbBtreeClose(SBTree *pBt); int tdbBtreeInsert(SBTree *pBt, const void *pKey, int kLen, const void *pVal, int vLen, TXN *pTxn); int tdbBtreeDelete(SBTree *pBt, const void *pKey, int kLen, TXN *pTxn); -int tdbBtreeUpsert(SBTree *pBt, const void *pKey, int nKey, const void *pData, int nData, TXN *pTxn); +// int tdbBtreeUpsert(SBTree *pBt, const void *pKey, int nKey, const void *pData, int nData, TXN *pTxn); int tdbBtreeGet(SBTree *pBt, const void *pKey, int kLen, void **ppVal, int *vLen); int tdbBtreePGet(SBTree *pBt, const void *pKey, int kLen, void **ppKey, int *pkLen, void **ppVal, int *vLen); diff --git a/source/libs/tdb/test/tdbTest.cpp b/source/libs/tdb/test/tdbTest.cpp index c1aa15b4d2..e358ac0197 100644 --- a/source/libs/tdb/test/tdbTest.cpp +++ b/source/libs/tdb/test/tdbTest.cpp @@ -479,6 +479,45 @@ TEST(tdb_test, DISABLED_simple_upsert1) { tdbClose(pEnv); } +TEST(tdb_test, simple_upsert2) { + int ret; + TDB *pEnv; + TTB *pDb; + int nData = 10000; + const char *key = "key"; + int32_t dataSize = 256 * 1024; + void *data = taosMemoryMalloc(dataSize); + void *pData = NULL; + SPoolMem *pPool; + TXN *txn; + + taosRemoveDir("tdb"); + memset(data, 'a', dataSize); + + // open env + ret = tdbOpen("tdb", 4096, 64, &pEnv, 0, 0, 0); + GTEST_ASSERT_EQ(ret, 0); + + // open database + ret = tdbTbOpen("db.db", -1, -1, NULL, pEnv, &pDb, 0); + GTEST_ASSERT_EQ(ret, 0); + + pPool = openPool(); + + for (int iData = 0; iData < nData; iData++) { + tdbBegin(pEnv, &txn, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); + + ret = tdbTbUpsert(pDb, key, strlen(key), data, dataSize, txn); + GTEST_ASSERT_EQ(ret, 0); + + tdbCommit(pEnv, txn); + tdbPostCommit(pEnv, txn); + } + + tdbTbClose(pDb); + tdbClose(pEnv); +} + TEST(tdb_test, multi_thread_query) { int ret; TDB *pEnv;