From fded16d1db34a8e1213efbc39bd34e7a23ce9808 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 30 Dec 2021 23:40:05 +0800 Subject: [PATCH 1/3] fix memory leak while drop user --- source/dnode/mnode/impl/src/mndUser.c | 22 +++++++++----- source/dnode/mnode/sdb/src/sdbHash.c | 10 +++--- source/dnode/mnode/sdb/src/sdbRow.c | 3 ++ tests/script/general/user/basic1.sim | 44 ++------------------------- 4 files changed, 25 insertions(+), 54 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 0926cf0c48..0f3dfd2ee3 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -75,7 +75,7 @@ static int32_t mndCreateDefaultUser(SMnode *pMnode, char *acct, char *user, char if (pRaw == NULL) return -1; sdbSetRawStatus(pRaw, SDB_STATUS_READY); - mDebug("user:%s, will be created while deploy sdb", userObj.user); + mDebug("user:%s, will be created while deploy sdb, raw:%p", userObj.user, pRaw); return sdbWrite(pMnode->pSdb, pRaw); } @@ -107,6 +107,7 @@ static SSdbRaw *mndUserActionEncode(SUserObj *pUser) { SDB_SET_RESERVE(pRaw, dataPos, TSDB_USER_RESERVE_SIZE) SDB_SET_DATALEN(pRaw, dataPos); + mTrace("user:%s, encode to raw:%p, row:%p", pUser->user, pRaw, pUser); return pRaw; } @@ -133,11 +134,12 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { SDB_GET_INT8(pRaw, pRow, dataPos, &pUser->superUser) SDB_GET_RESERVE(pRaw, pRow, dataPos, TSDB_USER_RESERVE_SIZE) + mTrace("user:%s, decode from raw:%p, row:%p", pUser->user, pRaw, pUser); return pRow; } static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) { - mTrace("user:%s, perform insert action", pUser->user); + mTrace("user:%s, perform insert action, row:%p", pUser->user, pUser); pUser->prohibitDbHash = taosHashInit(8, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_ENTRY_LOCK); if (pUser->prohibitDbHash == NULL) { terrno = TSDB_CODE_OUT_OF_MEMORY; @@ -158,7 +160,7 @@ static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) { } static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) { - mTrace("user:%s, perform delete action", pUser->user); + mTrace("user:%s, perform delete action, row:%p", pUser->user, pUser); if (pUser->prohibitDbHash) { taosHashCleanup(pUser->prohibitDbHash); pUser->prohibitDbHash = NULL; @@ -168,7 +170,7 @@ static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) { } static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOldUser, SUserObj *pNewUser) { - mTrace("user:%s, perform update action", pOldUser->user); + mTrace("user:%s, perform update action, old_row:%p new_row:%p", pOldUser->user, pOldUser, pNewUser); memcpy(pOldUser->pass, pNewUser->pass, TSDB_PASSWORD_LEN); pOldUser->updateTime = pNewUser->updateTime; return 0; @@ -242,7 +244,7 @@ static int32_t mndProcessCreateUserMsg(SMnodeMsg *pMsg) { SUserObj *pUser = sdbAcquire(pMnode->pSdb, SDB_USER, pCreate->user); if (pUser != NULL) { - sdbRelease(pMnode->pSdb, pUser); + mndReleaseUser(pMnode, pUser); terrno = TSDB_CODE_MND_USER_ALREADY_EXIST; mError("user:%s, failed to create since %s", pCreate->user, terrstr()); return -1; @@ -256,7 +258,7 @@ static int32_t mndProcessCreateUserMsg(SMnodeMsg *pMsg) { } int32_t code = mndCreateUser(pMnode, pOperUser->acct, pCreate->user, pCreate->pass, pMsg); - sdbRelease(pMnode->pSdb, pOperUser); + mndReleaseUser(pMnode, pOperUser); if (code != 0) { mError("user:%s, failed to create since %s", pCreate->user, terrstr()); @@ -319,6 +321,7 @@ static int32_t mndProcessAlterUserMsg(SMnodeMsg *pMsg) { SUserObj *pOperUser = sdbAcquire(pMnode->pSdb, SDB_USER, pMsg->user); if (pOperUser == NULL) { + mndReleaseUser(pMnode, pUser); terrno = TSDB_CODE_MND_NO_USER_FROM_CONN; mError("user:%s, failed to alter since %s", pAlter->user, terrstr()); return -1; @@ -331,7 +334,8 @@ static int32_t mndProcessAlterUserMsg(SMnodeMsg *pMsg) { newUser.updateTime = taosGetTimestampMs(); int32_t code = mndUpdateUser(pMnode, pUser, &newUser, pMsg); - sdbRelease(pMnode->pSdb, pOperUser); + mndReleaseUser(pMnode, pOperUser); + mndReleaseUser(pMnode, pUser); if (code != 0) { mError("user:%s, failed to alter since %s", pAlter->user, terrstr()); @@ -388,13 +392,15 @@ static int32_t mndProcessDropUserMsg(SMnodeMsg *pMsg) { SUserObj *pOperUser = sdbAcquire(pMnode->pSdb, SDB_USER, pMsg->user); if (pOperUser == NULL) { + mndReleaseUser(pMnode, pUser); terrno = TSDB_CODE_MND_NO_USER_FROM_CONN; mError("user:%s, failed to drop since %s", pDrop->user, terrstr()); return -1; } int32_t code = mndDropUser(pMnode, pMsg, pUser); - sdbRelease(pMnode->pSdb, pOperUser); + mndReleaseUser(pMnode, pOperUser); + mndReleaseUser(pMnode, pUser); if (code != 0) { mError("user:%s, failed to drop since %s", pDrop->user, terrstr()); diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c index 0388fa99f5..23bcdb1b60 100644 --- a/source/dnode/mnode/sdb/src/sdbHash.c +++ b/source/dnode/mnode/sdb/src/sdbHash.c @@ -57,12 +57,14 @@ void sdbPrintOper(SSdb *pSdb, SSdbRow *pRow, const char *oper) { EKeyType keyType = pSdb->keyTypes[pRow->type]; if (keyType == SDB_KEY_BINARY) { - mTrace("%s:%s, refCount:%d oper:%s", sdbTableName(pRow->type), (char *)pRow->pObj, pRow->refCount, oper); + mTrace("%s:%s, refCount:%d oper:%s row:%p", sdbTableName(pRow->type), (char *)pRow->pObj, pRow->refCount, oper, + pRow->pObj); } else if (keyType == SDB_KEY_INT32) { - mTrace("%s:%d, refCount:%d oper:%s", sdbTableName(pRow->type), *(int32_t *)pRow->pObj, pRow->refCount, oper); + mTrace("%s:%d, refCount:%d oper:%s row:%p", sdbTableName(pRow->type), *(int32_t *)pRow->pObj, pRow->refCount, oper, + pRow->pObj); } else if (keyType == SDB_KEY_INT64) { - mTrace("%s:%" PRId64 ", refCount:%d oper:%s", sdbTableName(pRow->type), *(int64_t *)pRow->pObj, pRow->refCount, - oper); + mTrace("%s:%" PRId64 ", refCount:%d oper:%s row:%p", sdbTableName(pRow->type), *(int64_t *)pRow->pObj, + pRow->refCount, oper, pRow->pObj); } else { } } diff --git a/source/dnode/mnode/sdb/src/sdbRow.c b/source/dnode/mnode/sdb/src/sdbRow.c index 4c889a6d04..e51dd48dcd 100644 --- a/source/dnode/mnode/sdb/src/sdbRow.c +++ b/source/dnode/mnode/sdb/src/sdbRow.c @@ -23,6 +23,7 @@ SSdbRow *sdbAllocRow(int32_t objSize) { return NULL; } + mTrace("row:%p, is created, len:%d", pRow->pObj, objSize); return pRow; } @@ -43,5 +44,7 @@ void sdbFreeRow(SSdb *pSdb, SSdbRow *pRow) { } sdbPrintOper(pSdb, pRow, "freeRow"); + + mTrace("row:%p, is freed", pRow->pObj); tfree(pRow); } diff --git a/tests/script/general/user/basic1.sim b/tests/script/general/user/basic1.sim index 33c4dc96d4..0ae4ab4c57 100644 --- a/tests/script/general/user/basic1.sim +++ b/tests/script/general/user/basic1.sim @@ -1,22 +1,9 @@ system sh/stop_dnodes.sh system sh/deploy.sh -n dnode1 -i 1 -system sh/exec.sh -n dnode1 -s start +system sh/exec.sh -n dnode1 -s start -v sql connect print =============== show users -sql show users -if $rows != 1 then - return -1 -endi - -print $data00 $data01 $data02 -print $data10 $data11 $data22 -print $data20 $data11 $data22 - -sql_error show accounts; -sql_error create account a pass "a" -sql_error drop account a -sql_error drop account root print =============== create user1 sql create user user1 PASS 'user1' @@ -30,23 +17,10 @@ print $data10 $data11 $data12 print $data20 $data11 $data22 print $data30 $data31 $data32 -print =============== create user2 -sql create user user2 PASS 'user2' -sql show users -if $rows != 3 then - return -1 -endi - -print $data00 $data01 $data02 -print $data10 $data11 $data12 -print $data20 $data11 $data22 -print $data30 $data31 $data32 -print $data40 $data41 $data42 - print =============== drop user1 sql drop user user1 sql show users -if $rows != 2 then +if $rows != 1 then return -1 endi @@ -57,18 +31,4 @@ print $data30 $data31 $data32 print =============== restart taosd system sh/exec.sh -n dnode1 -s stop -sleep 1000 -system sh/exec.sh -n dnode1 -s start -print =============== show users -sql show users -if $rows != 2 then - return -1 -endi - -print $data00 $data01 $data02 -print $data10 $data11 $data22 -print $data20 $data11 $data22 -print $data30 $data31 $data32 - -system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file From f5eb4ef6c64251b90e1a66e6ecb4dd792a76d9aa Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 30 Dec 2021 23:43:29 +0800 Subject: [PATCH 2/3] minor changes --- tests/script/general/user/basic1.sim | 44 ++++++++++++++++++++++++++-- 1 file changed, 42 insertions(+), 2 deletions(-) diff --git a/tests/script/general/user/basic1.sim b/tests/script/general/user/basic1.sim index 0ae4ab4c57..33c4dc96d4 100644 --- a/tests/script/general/user/basic1.sim +++ b/tests/script/general/user/basic1.sim @@ -1,9 +1,22 @@ system sh/stop_dnodes.sh system sh/deploy.sh -n dnode1 -i 1 -system sh/exec.sh -n dnode1 -s start -v +system sh/exec.sh -n dnode1 -s start sql connect print =============== show users +sql show users +if $rows != 1 then + return -1 +endi + +print $data00 $data01 $data02 +print $data10 $data11 $data22 +print $data20 $data11 $data22 + +sql_error show accounts; +sql_error create account a pass "a" +sql_error drop account a +sql_error drop account root print =============== create user1 sql create user user1 PASS 'user1' @@ -17,10 +30,23 @@ print $data10 $data11 $data12 print $data20 $data11 $data22 print $data30 $data31 $data32 +print =============== create user2 +sql create user user2 PASS 'user2' +sql show users +if $rows != 3 then + return -1 +endi + +print $data00 $data01 $data02 +print $data10 $data11 $data12 +print $data20 $data11 $data22 +print $data30 $data31 $data32 +print $data40 $data41 $data42 + print =============== drop user1 sql drop user user1 sql show users -if $rows != 1 then +if $rows != 2 then return -1 endi @@ -31,4 +57,18 @@ print $data30 $data31 $data32 print =============== restart taosd system sh/exec.sh -n dnode1 -s stop +sleep 1000 +system sh/exec.sh -n dnode1 -s start +print =============== show users +sql show users +if $rows != 2 then + return -1 +endi + +print $data00 $data01 $data02 +print $data10 $data11 $data22 +print $data20 $data11 $data22 +print $data30 $data31 $data32 + +system sh/exec.sh -n dnode1 -s stop -x SIGINT \ No newline at end of file From 96be7db9b7207f36a5dbcd32a34035078f83676e Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 30 Dec 2021 23:47:01 +0800 Subject: [PATCH 3/3] minor changes --- source/dnode/mnode/impl/src/mndUser.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 0f3dfd2ee3..1619b8e14f 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -242,7 +242,7 @@ static int32_t mndProcessCreateUserMsg(SMnodeMsg *pMsg) { return -1; } - SUserObj *pUser = sdbAcquire(pMnode->pSdb, SDB_USER, pCreate->user); + SUserObj *pUser = mndAcquireUser(pMnode, pCreate->user); if (pUser != NULL) { mndReleaseUser(pMnode, pUser); terrno = TSDB_CODE_MND_USER_ALREADY_EXIST; @@ -250,7 +250,7 @@ static int32_t mndProcessCreateUserMsg(SMnodeMsg *pMsg) { return -1; } - SUserObj *pOperUser = sdbAcquire(pMnode->pSdb, SDB_USER, pMsg->user); + SUserObj *pOperUser = mndAcquireUser(pMnode, pMsg->user); if (pOperUser == NULL) { terrno = TSDB_CODE_MND_NO_USER_FROM_CONN; mError("user:%s, failed to create since %s", pCreate->user, terrstr()); @@ -312,14 +312,14 @@ static int32_t mndProcessAlterUserMsg(SMnodeMsg *pMsg) { return -1; } - SUserObj *pUser = sdbAcquire(pMnode->pSdb, SDB_USER, pAlter->user); + SUserObj *pUser = mndAcquireUser(pMnode, pAlter->user); if (pUser == NULL) { terrno = TSDB_CODE_MND_USER_NOT_EXIST; mError("user:%s, failed to alter since %s", pAlter->user, terrstr()); return -1; } - SUserObj *pOperUser = sdbAcquire(pMnode->pSdb, SDB_USER, pMsg->user); + SUserObj *pOperUser = mndAcquireUser(pMnode, pMsg->user); if (pOperUser == NULL) { mndReleaseUser(pMnode, pUser); terrno = TSDB_CODE_MND_NO_USER_FROM_CONN; @@ -383,14 +383,14 @@ static int32_t mndProcessDropUserMsg(SMnodeMsg *pMsg) { return -1; } - SUserObj *pUser = sdbAcquire(pMnode->pSdb, SDB_USER, pDrop->user); + SUserObj *pUser = mndAcquireUser(pMnode, pDrop->user); if (pUser == NULL) { terrno = TSDB_CODE_MND_USER_NOT_EXIST; mError("user:%s, failed to drop since %s", pDrop->user, terrstr()); return -1; } - SUserObj *pOperUser = sdbAcquire(pMnode->pSdb, SDB_USER, pMsg->user); + SUserObj *pOperUser = mndAcquireUser(pMnode, pMsg->user); if (pOperUser == NULL) { mndReleaseUser(pMnode, pUser); terrno = TSDB_CODE_MND_NO_USER_FROM_CONN;