From 6693b5fa2d0f0b99b795e37fdb3ec42826f64337 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Thu, 10 Feb 2022 22:49:53 +0800 Subject: [PATCH] reserve data structures for user auth --- source/dnode/mnode/impl/inc/mndDef.h | 4 +- source/dnode/mnode/impl/src/mndDb.c | 2 + source/dnode/mnode/impl/src/mndStb.c | 2 + source/dnode/mnode/impl/src/mndUser.c | 68 ++++++++++++++++++++++----- 4 files changed, 63 insertions(+), 13 deletions(-) diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h index bf21c4ea7b..7c346edbea 100644 --- a/source/dnode/mnode/impl/inc/mndDef.h +++ b/source/dnode/mnode/impl/inc/mndDef.h @@ -233,7 +233,8 @@ typedef struct { int64_t updateTime; int8_t superUser; int32_t acctId; - SHashObj* prohibitDbHash; + SHashObj* readDbs; + SHashObj* writeDbs; } SUserObj; typedef struct { @@ -260,6 +261,7 @@ typedef struct { typedef struct { char name[TSDB_DB_FNAME_LEN]; char acct[TSDB_USER_LEN]; + char createdUser[TSDB_USER_LEN]; int64_t createdTime; int64_t updateTime; uint64_t uid; diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c index 1bfe8c9d9a..04c6c3dfa8 100644 --- a/source/dnode/mnode/impl/src/mndDb.c +++ b/source/dnode/mnode/impl/src/mndDb.c @@ -73,6 +73,7 @@ static SSdbRaw *mndDbActionEncode(SDbObj *pDb) { int32_t dataPos = 0; SDB_SET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, DB_ENCODE_OVER) SDB_SET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, DB_ENCODE_OVER) + SDB_SET_BINARY(pRaw, dataPos, pDb->createdUser, TSDB_USER_LEN, DB_ENCODE_OVER) SDB_SET_INT64(pRaw, dataPos, pDb->createdTime, DB_ENCODE_OVER) SDB_SET_INT64(pRaw, dataPos, pDb->updateTime, DB_ENCODE_OVER) SDB_SET_INT64(pRaw, dataPos, pDb->uid, DB_ENCODE_OVER) @@ -133,6 +134,7 @@ static SSdbRow *mndDbActionDecode(SSdbRaw *pRaw) { int32_t dataPos = 0; SDB_GET_BINARY(pRaw, dataPos, pDb->name, TSDB_DB_FNAME_LEN, DB_DECODE_OVER) SDB_GET_BINARY(pRaw, dataPos, pDb->acct, TSDB_USER_LEN, DB_DECODE_OVER) + SDB_GET_BINARY(pRaw, dataPos, pDb->createdUser, TSDB_USER_LEN, DB_DECODE_OVER) SDB_GET_INT64(pRaw, dataPos, &pDb->createdTime, DB_DECODE_OVER) SDB_GET_INT64(pRaw, dataPos, &pDb->updateTime, DB_DECODE_OVER) SDB_GET_INT64(pRaw, dataPos, &pDb->uid, DB_DECODE_OVER) diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c index 6749fdb877..9b0bad9827 100644 --- a/source/dnode/mnode/impl/src/mndStb.c +++ b/source/dnode/mnode/impl/src/mndStb.c @@ -180,6 +180,8 @@ static SSdbRow *mndStbActionDecode(SSdbRaw *pRaw) { STB_DECODE_OVER: if (terrno != 0) { mError("stb:%s, failed to decode from raw:%p since %s", pStb->name, pRaw, terrstr()); + tfree(pStb->pColumns); + tfree(pStb->pTags); tfree(pRow); return NULL; } diff --git a/source/dnode/mnode/impl/src/mndUser.c b/source/dnode/mnode/impl/src/mndUser.c index 3040cd8a28..65d73dd697 100644 --- a/source/dnode/mnode/impl/src/mndUser.c +++ b/source/dnode/mnode/impl/src/mndUser.c @@ -105,6 +105,24 @@ static SSdbRaw *mndUserActionEncode(SUserObj *pUser) { SDB_SET_INT64(pRaw, dataPos, pUser->createdTime, USER_ENCODE_OVER) SDB_SET_INT64(pRaw, dataPos, pUser->updateTime, USER_ENCODE_OVER) SDB_SET_INT8(pRaw, dataPos, pUser->superUser, USER_ENCODE_OVER) + + int32_t numOfReadDbs = taosHashGetSize(pUser->readDbs); + int32_t numOfWriteDbs = taosHashGetSize(pUser->writeDbs); + SDB_SET_INT32(pRaw, dataPos, numOfReadDbs, USER_ENCODE_OVER) + SDB_SET_INT32(pRaw, dataPos, numOfWriteDbs, USER_ENCODE_OVER) + + char *db = taosHashIterate(pUser->readDbs, NULL); + while (db != NULL) { + SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, USER_ENCODE_OVER); + db = taosHashIterate(pUser->readDbs, db); + } + + db = taosHashIterate(pUser->writeDbs, NULL); + while (db != NULL) { + SDB_SET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, USER_ENCODE_OVER); + db = taosHashIterate(pUser->writeDbs, db); + } + SDB_SET_RESERVE(pRaw, dataPos, TSDB_USER_RESERVE_SIZE, USER_ENCODE_OVER) SDB_SET_DATALEN(pRaw, dataPos, USER_ENCODE_OVER) @@ -138,6 +156,10 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { SUserObj *pUser = sdbGetRowObj(pRow); if (pUser == NULL) goto USER_DECODE_OVER; + pUser->readDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, true); + pUser->writeDbs = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, true); + if (pUser->readDbs == NULL || pUser->writeDbs == NULL) goto USER_DECODE_OVER; + int32_t dataPos = 0; SDB_GET_BINARY(pRaw, dataPos, pUser->user, TSDB_USER_LEN, USER_DECODE_OVER) SDB_GET_BINARY(pRaw, dataPos, pUser->pass, TSDB_PASSWORD_LEN, USER_DECODE_OVER) @@ -145,6 +167,26 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { SDB_GET_INT64(pRaw, dataPos, &pUser->createdTime, USER_DECODE_OVER) SDB_GET_INT64(pRaw, dataPos, &pUser->updateTime, USER_DECODE_OVER) SDB_GET_INT8(pRaw, dataPos, &pUser->superUser, USER_DECODE_OVER) + + int32_t numOfReadDbs = 0; + int32_t numOfWriteDbs = 0; + SDB_GET_INT32(pRaw, dataPos, &numOfReadDbs, USER_DECODE_OVER) + SDB_GET_INT32(pRaw, dataPos, &numOfWriteDbs, USER_DECODE_OVER) + + for (int32_t i = 0; i < numOfReadDbs; ++i) { + char db[TSDB_DB_FNAME_LEN] = {0}; + SDB_GET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, USER_DECODE_OVER) + int32_t len = strlen(db) + 1; + taosHashPut(pUser->readDbs, db, len, db, TSDB_DB_FNAME_LEN); + } + + for (int32_t i = 0; i < numOfWriteDbs; ++i) { + char db[TSDB_DB_FNAME_LEN] = {0}; + SDB_GET_BINARY(pRaw, dataPos, db, TSDB_DB_FNAME_LEN, USER_DECODE_OVER) + int32_t len = strlen(db) + 1; + taosHashPut(pUser->writeDbs, db, len, db, TSDB_DB_FNAME_LEN); + } + SDB_GET_RESERVE(pRaw, dataPos, TSDB_USER_RESERVE_SIZE, USER_DECODE_OVER) terrno = 0; @@ -152,6 +194,8 @@ static SSdbRow *mndUserActionDecode(SSdbRaw *pRaw) { USER_DECODE_OVER: if (terrno != 0) { mError("user:%s, failed to decode from raw:%p since %s", pUser->user, pRaw, terrstr()); + taosHashCleanup(pUser->readDbs); + taosHashCleanup(pUser->writeDbs); tfree(pRow); return NULL; } @@ -162,13 +206,7 @@ USER_DECODE_OVER: static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) { 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; - mError("user:%s, failed to perform insert action since %s", pUser->user, terrstr()); - return -1; - } - + SAcctObj *pAcct = sdbAcquire(pSdb, SDB_ACCT, pUser->acct); if (pAcct == NULL) { terrno = TSDB_CODE_MND_ACCT_NOT_EXIST; @@ -183,11 +221,8 @@ static int32_t mndUserActionInsert(SSdb *pSdb, SUserObj *pUser) { static int32_t mndUserActionDelete(SSdb *pSdb, SUserObj *pUser) { mTrace("user:%s, perform delete action, row:%p", pUser->user, pUser); - if (pUser->prohibitDbHash) { - taosHashCleanup(pUser->prohibitDbHash); - pUser->prohibitDbHash = NULL; - } - + taosHashCleanup(pUser->readDbs); + taosHashCleanup(pUser->writeDbs); return 0; } @@ -195,6 +230,15 @@ static int32_t mndUserActionUpdate(SSdb *pSdb, SUserObj *pOld, SUserObj *pNew) { mTrace("user:%s, perform update action, old row:%p new row:%p", pOld->user, pOld, pNew); memcpy(pOld->pass, pNew->pass, TSDB_PASSWORD_LEN); pOld->updateTime = pNew->updateTime; + + void *tmp1 = pOld->readDbs; + pOld->readDbs = pNew->readDbs; + pNew->readDbs = tmp1; + + void *tmp2 = pOld->writeDbs; + pOld->writeDbs = pNew->writeDbs; + pNew->writeDbs = tmp2; + return 0; } -- GitLab