From 5ebc77961d36c786d2cccafcea607fd396852a7a Mon Sep 17 00:00:00 2001 From: Liu Jicong Date: Fri, 5 Nov 2021 17:48:58 +0800 Subject: [PATCH] fix tq invalid free --- source/dnode/vnode/tq/inc/tqMetaStore.h | 2 ++ source/dnode/vnode/tq/src/tqMetaStore.c | 11 +++++-- source/dnode/vnode/tq/test/tqMetaTest.cpp | 40 +++++++++++++++++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) diff --git a/source/dnode/vnode/tq/inc/tqMetaStore.h b/source/dnode/vnode/tq/inc/tqMetaStore.h index 52cc767409..3d1473a443 100644 --- a/source/dnode/vnode/tq/inc/tqMetaStore.h +++ b/source/dnode/vnode/tq/inc/tqMetaStore.h @@ -92,6 +92,8 @@ int32_t tqStoreClose(TqMetaStore*); //int32_t tqStoreDelete(TqMetaStore*); //int32_t TqStoreCommitAll(TqMetaStore*); int32_t tqStorePersist(TqMetaStore*); +//clean deleted idx and data from persistent file +int32_t tqStoreCompact(TqMetaStore*); void* tqHandleGet(TqMetaStore*, int64_t key); int32_t tqHandleMovePut(TqMetaStore*, int64_t key, void* value); diff --git a/source/dnode/vnode/tq/src/tqMetaStore.c b/source/dnode/vnode/tq/src/tqMetaStore.c index eb2c3404fc..079aae7435 100644 --- a/source/dnode/vnode/tq/src/tqMetaStore.c +++ b/source/dnode/vnode/tq/src/tqMetaStore.c @@ -153,9 +153,9 @@ TqMetaStore* tqStoreOpen(const char* path, } else { pNode->handle.valueInUse = TQ_DELETE_TOKEN; } - serializedObj = POINTER_SHIFT(serializedObj, serializedObj->ssize); - if(serializedObj->ssize != sizeof(TqSerializedHead)) { - pMeta->deserializer(serializedObj, &pNode->handle.valueInTxn); + TqSerializedHead* ptr = POINTER_SHIFT(serializedObj, serializedObj->ssize); + if(ptr->ssize != sizeof(TqSerializedHead)) { + pMeta->deserializer(ptr, &pNode->handle.valueInTxn); } else { pNode->handle.valueInTxn = TQ_DELETE_TOKEN; } @@ -591,3 +591,8 @@ int32_t tqHandleClear(TqMetaStore* pMeta, int64_t key) { } return -2; } + +//TODO: clean deleted idx and data from persistent file +int32_t tqStoreCompact(TqMetaStore *pMeta) { + return 0; +} diff --git a/source/dnode/vnode/tq/test/tqMetaTest.cpp b/source/dnode/vnode/tq/test/tqMetaTest.cpp index a1021233db..4bf56a0a56 100644 --- a/source/dnode/vnode/tq/test/tqMetaTest.cpp +++ b/source/dnode/vnode/tq/test/tqMetaTest.cpp @@ -57,6 +57,10 @@ TEST_F(TqMetaTest, copyPutTest) { Foo* pFoo = (Foo*) tqHandleGet(pMeta, 1); EXPECT_EQ(pFoo == NULL, true); + + tqHandleCommit(pMeta, 1); + pFoo = (Foo*) tqHandleGet(pMeta, 1); + EXPECT_EQ(pFoo->a, 3); } TEST_F(TqMetaTest, persistTest) { @@ -135,6 +139,42 @@ TEST_F(TqMetaTest, deleteTest) { pMeta = tqStoreOpen(pathName, FooSerializer, FooDeserializer, FooDeleter); ASSERT(pMeta); + pFoo = (Foo*) tqHandleGet(pMeta, 1); EXPECT_EQ(pFoo == NULL, true); } + +TEST_F(TqMetaTest, intxnPersist) { + Foo* pFoo = (Foo*)malloc(sizeof(Foo)); + pFoo->a = 3; + tqHandleMovePut(pMeta, 1, pFoo); + tqHandleCommit(pMeta, 1); + + Foo* pBar = (Foo*)malloc(sizeof(Foo)); + pBar->a = 4; + tqHandleMovePut(pMeta, 1, pBar); + + Foo* pFoo1 = (Foo*)tqHandleGet(pMeta, 1); + EXPECT_EQ(pFoo1->a, 3); + + tqStoreClose(pMeta); + pMeta = tqStoreOpen(pathName, + FooSerializer, FooDeserializer, FooDeleter); + ASSERT(pMeta); + + pFoo1 = (Foo*)tqHandleGet(pMeta, 1); + EXPECT_EQ(pFoo1->a, 3); + + tqHandleCommit(pMeta, 1); + + pFoo1 = (Foo*)tqHandleGet(pMeta, 1); + EXPECT_EQ(pFoo1->a, 4); + + tqStoreClose(pMeta); + pMeta = tqStoreOpen(pathName, + FooSerializer, FooDeserializer, FooDeleter); + ASSERT(pMeta); + + pFoo1 = (Foo*)tqHandleGet(pMeta, 1); + EXPECT_EQ(pFoo1->a, 4); +} -- GitLab