diff --git a/.gitignore b/.gitignore index e1ef714069..fd693adc3b 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ taosdalipu/ Target/ *.failed *.sql +sim sim/ psim/ pysim/ diff --git a/source/libs/tdb/src/db/tdbPCache.c b/source/libs/tdb/src/db/tdbPCache.c index a453973338..e9d8e7a59b 100644 --- a/source/libs/tdb/src/db/tdbPCache.c +++ b/source/libs/tdb/src/db/tdbPCache.c @@ -115,10 +115,7 @@ void tdbPCacheRelease(SPCache *pCache, SPage *pPage, TXN *pTxn) { tdbPCacheRemovePageFromHash(pCache, pPage); } - // free the page - if (pTxn && pTxn->xFree) { - tdbPageDestroy(pPage, pTxn->xFree, pTxn->xArg); - } + tdbPageDestroy(pPage, pTxn->xFree, pTxn->xArg); } } @@ -195,6 +192,7 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn) pPage->pPager = pPageH->pPager; memcpy(pPage->pData, pPageH->pData, pPage->pageSize); + tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize); } else { memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid)); pPage->pLruNext = NULL; @@ -294,7 +292,7 @@ static int tdbPCacheOpenImpl(SPCache *pCache) { // Open the hash table pCache->nPage = 0; - pCache->nHash = pCache->cacheSize; + pCache->nHash = pCache->cacheSize < 8 ? 8 : pCache->cacheSize; pCache->pgHash = (SPage **)tdbOsCalloc(pCache->nHash, sizeof(SPage *)); if (pCache->pgHash == NULL) { // TODO diff --git a/source/libs/tdb/test/tdbTest.cpp b/source/libs/tdb/test/tdbTest.cpp index 904ad64fe7..420d1d991f 100644 --- a/source/libs/tdb/test/tdbTest.cpp +++ b/source/libs/tdb/test/tdbTest.cpp @@ -225,6 +225,89 @@ TEST(tdb_test, simple_test) { // Close a database tdbDbClose(pDb); + // Close Env + ret = tdbEnvClose(pEnv); + GTEST_ASSERT_EQ(ret, 0); +} + +TEST(tdb_test, simple_test2) { + int ret; + TENV *pEnv; + TDB *pDb; + FKeyComparator compFunc; + int nData = 10000; + TXN txn; + + // Open Env + ret = tdbEnvOpen("tdb", 1024, 0, &pEnv); + GTEST_ASSERT_EQ(ret, 0); + + // Create a database + compFunc = tKeyCmpr; + ret = tdbDbOpen("db.db", TDB_VARIANT_LEN, TDB_VARIANT_LEN, compFunc, pEnv, &pDb); + GTEST_ASSERT_EQ(ret, 0); + + { + char key[64]; + char val[64]; + int64_t txnid = 0; + SPoolMem *pPool; + + // open the pool + pPool = openPool(); + + // start a transaction + txnid++; + tdbTxnOpen(&txn, txnid, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED); + tdbBegin(pEnv, &txn); + + for (int iData = 1; iData <= nData; iData++) { + sprintf(key, "key%d", iData); + sprintf(val, "value%d", iData); + ret = tdbDbInsert(pDb, key, strlen(key), val, strlen(val), &txn); + GTEST_ASSERT_EQ(ret, 0); + } + + { // Iterate to query the DB data + TDBC *pDBC; + void *pKey = NULL; + void *pVal = NULL; + int vLen, kLen; + int count = 0; + + ret = tdbDbcOpen(pDb, &pDBC); + GTEST_ASSERT_EQ(ret, 0); + + for (;;) { + ret = tdbDbNext(pDBC, &pKey, &kLen, &pVal, &vLen); + if (ret < 0) break; + + std::cout.write((char *)pKey, kLen) /* << " " << kLen */ << " "; + std::cout.write((char *)pVal, vLen) /* << " " << vLen */; + std::cout << std::endl; + + count++; + } + + GTEST_ASSERT_EQ(count, nData); + + tdbDbcClose(pDBC); + + TDB_FREE(pKey); + TDB_FREE(pVal); + } + } + + // commit the transaction + tdbCommit(pEnv, &txn); + tdbTxnClose(&txn); + + ret = tdbDbDrop(pDb); + GTEST_ASSERT_EQ(ret, 0); + + // Close a database + tdbDbClose(pDb); + // Close Env ret = tdbEnvClose(pEnv); GTEST_ASSERT_EQ(ret, 0);