From 1e1b70540d09b6439631e9b26bf6c380fc240148 Mon Sep 17 00:00:00 2001 From: slguan Date: Sat, 8 Feb 2020 15:39:03 +0800 Subject: [PATCH] #1177 --- src/dnode/src/dnodeService.c | 4 +- src/{mnode => }/inc/mgmt.h | 39 -------------- src/mnode/inc/mgmtAcct.h | 52 +++++++++++++++++++ .../{src/mgmtAcct.spec.c => inc/mgmtGrant.h} | 22 +++++++- src/mnode/src/mgmtAcct.c | 46 ++++++++-------- src/mnode/src/mgmtDb.c | 2 +- src/mnode/src/mgmtGrant.c | 38 ++++++++++++++ src/mnode/src/mgmtMeter.c | 26 ++++++---- src/mnode/src/mgmtShell.c | 5 +- src/mnode/src/mgmtSystem.spec.c | 2 - src/mnode/src/mgmtUser.c | 6 +-- src/vnode/CMakeLists.txt | 3 +- 12 files changed, 158 insertions(+), 87 deletions(-) rename src/{mnode => }/inc/mgmt.h (90%) create mode 100644 src/mnode/inc/mgmtAcct.h rename src/mnode/{src/mgmtAcct.spec.c => inc/mgmtGrant.h} (56%) create mode 100644 src/mnode/src/mgmtGrant.c diff --git a/src/dnode/src/dnodeService.c b/src/dnode/src/dnodeService.c index 9558052458..6a0dfdb63a 100644 --- a/src/dnode/src/dnodeService.c +++ b/src/dnode/src/dnodeService.c @@ -26,10 +26,11 @@ #include "mnodeAccount.h" #include "mnodeBalance.h" #include "mnodeCluster.h" - #include "mnodeReplica.h" + #include "sdbReplica.h" #include "multilevelStorage.h" #include "vnodeCluster.h" #include "vnodeReplica.h" + #include "dnodeGrant.h" void init() { dnodeClusterInit(); httpAdminInit(); @@ -40,6 +41,7 @@ multilevelStorageInit(); vnodeClusterInit(); vnodeReplicaInit(); + dnodeGrantInit(); } #endif diff --git a/src/mnode/inc/mgmt.h b/src/inc/mgmt.h similarity index 90% rename from src/mnode/inc/mgmt.h rename to src/inc/mgmt.h index 24f9822f16..b7edada200 100644 --- a/src/mnode/inc/mgmt.h +++ b/src/inc/mgmt.h @@ -273,25 +273,6 @@ int mgmtInitShell(); void mgmtCleanUpShell(); int mgmtRetriveUserAuthInfo(char *user, char *spi, char *encrypt, uint8_t *secret, uint8_t *ckey); -// acct API -int mgmtInitAccts(); -SAcctObj *mgmtGetAcct(char *name); -int mgmtCreateAcct(char *name, char *pass, SAcctCfg *pCfg); -int mgmtUpdateAcct(SAcctObj *pAcct); -int mgmtDropAcct(char *name); -int mgmtAddDbIntoAcct(SAcctObj *pAcct, SDbObj *pDb); -int mgmtRemoveDbFromAcct(SAcctObj *pAcct, SDbObj *pDb); -int mgmtAddUserIntoAcct(SAcctObj *pAcct, SUserObj *pUser); -int mgmtRemoveUserFromAcct(SAcctObj *pAcct, SUserObj *pUser); -int mgmtAddConnIntoAcct(SConnObj *pConn); -int mgmtRemoveConnFromAcct(SConnObj *pConn); -int mgmtGetAcctMeta(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn); -int mgmtRetrieveAccts(SShowObj *pShow, char *data, int rows, SConnObj *pConn); -void mgmtCheckAcct(); -void mgmtCleanUpAccts(); -int mgmtAlterAcct(char *name, char *pass, SAcctCfg *pCfg); -int64_t mgmtGetAcctStatistic(SAcctObj *pAcct); - // user API int mgmtInitUsers(); SUserObj *mgmtGetUser(char *name); @@ -358,26 +339,6 @@ bool mgmtMeterCreateFromMetric(STabObj *pMeterObj); bool mgmtIsMetric(STabObj *pMeterObj); bool mgmtIsNormalMeter(STabObj *pMeterObj); -// grant API -void grantActiveSystem(const char* cfgFile); -void grantSendMsgToMgmt(); -void grantReset(); -void grantUpdate(void *pGrant); -bool grantCheckExpired(); -void grantRestoreTimeSeries(uint32_t timeseries); -void grantAddTimeSeries(uint32_t timeseries); -int grantCheckTimeSeries(uint32_t timeseries); -void grantResetCurStorage(uint64_t totalStorage); -int grantCheckStorage(); -int grantCheckDatabases(); -int grantCheckUsers(); -int grantCheckAccts(); -int grantCheckDnodes(); -int grantCheckConns(); -int grantCheckStreams(); -int grantCheckCpuCores(); -int grantCheckQueryTime(); - // dnode API int mgmtInitDnodes(); SDnodeObj *mgmtGetDnode(uint32_t ip); diff --git a/src/mnode/inc/mgmtAcct.h b/src/mnode/inc/mgmtAcct.h new file mode 100644 index 0000000000..c5e14979de --- /dev/null +++ b/src/mnode/inc/mgmtAcct.h @@ -0,0 +1,52 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#ifndef TDENGINE_MGMT_ACCT_H +#define TDENGINE_MGMT_ACCT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "mgmt.h" + +int32_t mgmtCreateAcct(char *name, char *pass, SAcctCfg *pCfg); +int32_t mgmtUpdateAcct(SAcctObj *pAcct); +int32_t mgmtDropAcct(char *name); +int32_t mgmtAddDbIntoAcct(SAcctObj *pAcct, SDbObj *pDb); +int32_t mgmtRemoveDbFromAcct(SAcctObj *pAcct, SDbObj *pDb); +int32_t mgmtAddUserIntoAcct(SAcctObj *pAcct, SUserObj *pUser); +int32_t mgmtRemoveUserFromAcct(SAcctObj *pAcct, SUserObj *pUser); +int32_t mgmtAddConnIntoAcct(SConnObj *pConn); +int32_t mgmtRemoveConnFromAcct(SConnObj *pConn); +int32_t mgmtAlterAcct(char *name, char *pass, SAcctCfg *pCfg); +int64_t mgmtGetAcctStatistic(SAcctObj *pAcct); + +extern int32_t (*mgmtInitAccts)(); +extern SAcctObj* (*mgmtGetAcct)(char *acctName); +extern void (*mgmtCreateRootAcct)(); +extern int32_t (*mgmtCheckUserLimit)(SAcctObj *pAcct); +extern int32_t (*mgmtCheckDbLimit)(SAcctObj *pAcct); +extern int32_t (*mgmtCheckTableLimit)(SAcctObj *pAcct); +extern void (*mgmtCheckAcct)(); +extern void (*mgmtCleanUpAccts)(); +extern int32_t (*mgmtGetAcctMeta)(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn); +extern int32_t (*mgmtRetrieveAccts)(SShowObj *pShow, char *data, int rows, SConnObj *pConn); + +#ifdef __cplusplus +} +#endif + +#endif // TDENGINE_MGMTSYSTEM_H diff --git a/src/mnode/src/mgmtAcct.spec.c b/src/mnode/inc/mgmtGrant.h similarity index 56% rename from src/mnode/src/mgmtAcct.spec.c rename to src/mnode/inc/mgmtGrant.h index a1b7438f35..bf19437a17 100644 --- a/src/mnode/src/mgmtAcct.spec.c +++ b/src/mnode/inc/mgmtGrant.h @@ -13,7 +13,25 @@ * along with this program. If not, see . */ -#define _DEFAULT_SOURCE -#include "mgmt.h" +#ifndef TDENGINE_MGMT_GRANT_H +#define TDENGINE_MGMT_GTANT_H +#ifdef __cplusplus +extern "C" { +#endif +#include +#include + +extern bool (*mgmtCheckExpired)(); +extern void (*mgmtAddTimeSeries)(uint32_t timeSeriesNum); +extern void (*mgmtRestoreTimeSeries)(uint32_t timeseries); +extern int32_t (*mgmtCheckTimeSeries)(uint32_t timeseries); +extern int32_t (*mgmtCheckUserGrant)(); +extern int32_t (*mgmtCheckDbGrant)(); + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/src/mnode/src/mgmtAcct.c b/src/mnode/src/mgmtAcct.c index 1605db3c2a..ba6155a606 100644 --- a/src/mnode/src/mgmtAcct.c +++ b/src/mnode/src/mgmtAcct.c @@ -15,15 +15,14 @@ #define _DEFAULT_SOURCE #include "os.h" - #include "mgmt.h" +#include "mgmtAcct.h" #include "tschemautil.h" extern void *userSdb; extern void *dbSdb; SAcctObj acctObj; - int mgmtGetAcctsNum(); SShowObj *mgmtGetNextAcct(SShowObj *pShow, SAcctObj **pAcct); @@ -132,18 +131,16 @@ int mgmtRemoveConnFromAcct(SConnObj *pConn) { return 0; } -/* - * Edge Version Implementation - */ +int32_t mgmtInitAcctsImp() { return 0; } +int32_t (*mgmtInitAccts)() = mgmtInitAcctsImp; -int mgmtInitAcctsImp() { return 0; } -int (*mgmtInitAccts)() = mgmtInitAcctsImp; +void mgmtCreateRootAcctImp() {} +void (*mgmtCreateRootAcct)() = mgmtCreateRootAcctImp; -void mgmtCreateRootAcct() {} +SAcctObj *mgmtGetAcctImp(char *acctName) { return &acctObj; } +SAcctObj* (*mgmtGetAcct)(char *acctName) = mgmtGetAcctImp; -SAcctObj *mgmtGetAcct(char *name) { return &acctObj; } - -int mgmtCheckUserLimit(SAcctObj *pAcct) { +int32_t mgmtCheckUserLimitImp(SAcctObj *pAcct) { int numOfUsers = sdbGetNumOfRows(userSdb); if (numOfUsers >= tsMaxUsers) { mWarn("numOfUsers:%d, exceed tsMaxUsers:%d", numOfUsers, tsMaxUsers); @@ -151,8 +148,9 @@ int mgmtCheckUserLimit(SAcctObj *pAcct) { } return 0; } +int32_t (*mgmtCheckUserLimit)(SAcctObj *pAcct) = mgmtCheckUserLimitImp; -int mgmtCheckDbLimit(SAcctObj *pAcct) { +int32_t mgmtCheckDbLimitImp(SAcctObj *pAcct) { int numOfDbs = sdbGetNumOfRows(dbSdb); if (numOfDbs >= tsMaxDbs) { mWarn("numOfDbs:%d, exceed tsMaxDbs:%d", numOfDbs, tsMaxDbs); @@ -160,18 +158,12 @@ int mgmtCheckDbLimit(SAcctObj *pAcct) { } return 0; } +int32_t (*mgmtCheckDbLimit)(SAcctObj *pAcct) = mgmtCheckDbLimitImp; -int mgmtCheckMeterLimit(SAcctObj *pAcct) { return 0; } +int32_t mgmtCheckTableLimitImp(SAcctObj *pAcct) { return 0; } +int32_t (*mgmtCheckTableLimit)(SAcctObj *pAcct) = mgmtCheckTableLimitImp; -int mgmtCheckUserGrant() { return 0; } - -int mgmtCheckDbGrant() { return 0; } - -int mgmtCheckMeterGrant() { return 0; } - -void grantAddTimeSeries(uint32_t timeSeriesNum) {} - -void mgmtCheckAcct() { +void mgmtCheckAcctImp() { SAcctObj *pAcct = &acctObj; pAcct->acctId = 0; strcpy(pAcct->user, "root"); @@ -180,9 +172,13 @@ void mgmtCheckAcct() { mgmtCreateUser(pAcct, "monitor", tsInternalPass); mgmtCreateUser(pAcct, "_root", tsInternalPass); } +void (*mgmtCheckAcct)() = mgmtCheckAcctImp; -void mgmtCleanUpAccts() {} +void mgmtCleanUpAcctsImp() {} +void (*mgmtCleanUpAccts)() = mgmtCleanUpAcctsImp; -int mgmtGetAcctMeta(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) { return TSDB_CODE_OPS_NOT_SUPPORT; } +int32_t mgmtGetAcctMetaImp(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) { return TSDB_CODE_OPS_NOT_SUPPORT; } +int32_t (*mgmtGetAcctMeta)(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) = mgmtGetAcctMetaImp; -int mgmtRetrieveAccts(SShowObj *pShow, char *data, int rows, SConnObj *pConn) { return 0; } +int32_t mgmtRetrieveAcctsImp(SShowObj *pShow, char *data, int rows, SConnObj *pConn) { return 0; } +int32_t (*mgmtRetrieveAccts)(SShowObj *pShow, char *data, int rows, SConnObj *pConn) = mgmtRetrieveAcctsImp; diff --git a/src/mnode/src/mgmtDb.c b/src/mnode/src/mgmtDb.c index b935b68425..af157d4d2f 100644 --- a/src/mnode/src/mgmtDb.c +++ b/src/mnode/src/mgmtDb.c @@ -17,6 +17,7 @@ #include "os.h" #include "mgmt.h" +#include "mgmtGrant.h" #include "mgmtBalance.h" #include "mgmtUtil.h" #include "tschemautil.h" @@ -37,7 +38,6 @@ void *mgmtDbActionAfterBatchUpdate(void *row, char *str, int size, int *ssize); void *mgmtDbActionReset(void *row, char *str, int size, int *ssize); void *mgmtDbActionDestroy(void *row, char *str, int size, int *ssize); -int mgmtCheckDbGrant(); int mgmtCheckDbLimit(SAcctObj *pAcct); void mgmtDbActionInit() { diff --git a/src/mnode/src/mgmtGrant.c b/src/mnode/src/mgmtGrant.c new file mode 100644 index 0000000000..cf36edfeac --- /dev/null +++ b/src/mnode/src/mgmtGrant.c @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019 TAOS Data, Inc. + * + * This program is free software: you can use, redistribute, and/or modify + * it under the terms of the GNU Affero General Public License, version 3 + * or later ("AGPL"), as published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#define _DEFAULT_SOURCE +#include "os.h" +#include "mgmt.h" +#include "mgmtAcct.h" +#include "mgmtGrant.h" + +int32_t mgmtCheckUserGrantImp() { return 0; } +int32_t (*mgmtCheckUserGrant)() = mgmtCheckUserGrantImp; + +int32_t mgmtCheckDbGrantImp() { return 0; } +int32_t (*mgmtCheckDbGrant)() = mgmtCheckDbGrantImp; + +void mgmtAddTimeSeriesImp(uint32_t timeSeriesNum) {} +void (*mgmtAddTimeSeries)(uint32_t timeSeriesNum) = mgmtAddTimeSeriesImp; + +void mgmtRestoreTimeSeriesImp(uint32_t timeSeriesNum) {} +void (*mgmtRestoreTimeSeries)(uint32_t timeSeriesNum) = mgmtRestoreTimeSeriesImp; + +int32_t mgmtCheckTimeSeriesImp(uint32_t timeseries) { return 0; } +int32_t (*mgmtCheckTimeSeries)(uint32_t timeseries) = mgmtCheckTimeSeriesImp; + +bool mgmtCheckExpiredImp() { return false; } +bool (*mgmtCheckExpired)() = mgmtCheckExpiredImp; \ No newline at end of file diff --git a/src/mnode/src/mgmtMeter.c b/src/mnode/src/mgmtMeter.c index a2a6ed8a7d..e5c484fc2e 100644 --- a/src/mnode/src/mgmtMeter.c +++ b/src/mnode/src/mgmtMeter.c @@ -17,6 +17,8 @@ #include "os.h" #include "mgmt.h" +#include "mgmtAcct.h" +#include "mgmtGrant.h" #include "mgmtUtil.h" #include "taosmsg.h" #include "tast.h" @@ -91,8 +93,7 @@ int32_t mgmtMeterDropColumnByName(STabObj *pMeter, const char *name); static int dropMeterImp(SDbObj *pDb, STabObj * pMeter, SAcctObj *pAcct); static void dropAllMetersOfMetric(SDbObj *pDb, STabObj * pMetric, SAcctObj *pAcct); -int mgmtCheckMeterLimit(SAcctObj *pAcct, SCreateTableMsg *pCreate); -int mgmtCheckMeterGrant(SCreateTableMsg *pCreate, STabObj * pMeter); +int mgmtCheckTableLimit(SAcctObj *pAcct, SCreateTableMsg *pCreate); void mgmtMeterActionInit() { mgmtMeterActionFp[SDB_TYPE_INSERT] = mgmtMeterActionInsert; @@ -540,7 +541,7 @@ int mgmtCreateMeter(SDbObj *pDb, SCreateTableMsg *pCreate) { pAcct = mgmtGetAcct(pDb->cfg.acct); assert(pAcct != NULL); - int code = mgmtCheckMeterLimit(pAcct, pCreate); + int code = mgmtCheckTableLimit(pAcct, pCreate); if (code != 0) { mError("table:%s, exceed the limit", pCreate->meterId); return code; @@ -636,10 +637,17 @@ int mgmtCreateMeter(SDbObj *pDb, SCreateTableMsg *pCreate) { return TSDB_CODE_FAILED_TO_LOCK_RESOURCES; } - code = mgmtCheckMeterGrant(pCreate, pMeter); - if (code != 0) { - mError("table:%s, grant expired", pCreate->meterId); - return code; + if (mgmtCheckExpired()) { + mError("failed to create meter:%s, reason:grant expired", pMeter->meterId); + return TSDB_CODE_GRANT_EXPIRED; + } + + if (pCreate->numOfTags == 0) { + int grantCode = mgmtCheckTimeSeries(pMeter->numOfColumns); + if (grantCode != 0) { + mError("table:%s, grant expired", pCreate->meterId); + return grantCode; + } } if (pCreate->numOfTags == 0) { // handle normal meter creation @@ -704,7 +712,7 @@ int mgmtCreateMeter(SDbObj *pDb, SCreateTableMsg *pCreate) { mTrace("table:%s, send create table msg to dnode, vgId:%d, sid:%d, vnode:%d", pMeter->meterId, pMeter->gid.vgId, pMeter->gid.sid, pVgroup->vnodeGid[0].vnode); - grantAddTimeSeries(pMeter->numOfColumns - 1); + mgmtAddTimeSeries(pMeter->numOfColumns - 1); mgmtSendCreateMsgToVgroup(pMeter, pVgroup); } @@ -805,7 +813,7 @@ static int dropMeterImp(SDbObj *pDb, STabObj * pMeter, SAcctObj *pAcct) { pVgroup = mgmtGetVgroup(pMeter->gid.vgId); if (pVgroup == NULL) return TSDB_CODE_OTHERS; - grantRestoreTimeSeries(pMeter->numOfColumns - 1); + mgmtRestoreTimeSeries(pMeter->numOfColumns - 1); mgmtSendRemoveMeterMsgToDnode(pMeter, pVgroup); sdbDeleteRow(meterSdb, pMeter); diff --git a/src/mnode/src/mgmtShell.c b/src/mnode/src/mgmtShell.c index 06556c817f..14814ce0d9 100644 --- a/src/mnode/src/mgmtShell.c +++ b/src/mnode/src/mgmtShell.c @@ -18,6 +18,7 @@ #include "dnodeSystem.h" #include "mgmt.h" +#include "mgmtGrant.h" #include "mgmtProfile.h" #include "taosmsg.h" #include "tlog.h" @@ -561,7 +562,7 @@ int mgmtProcessCreateDbMsg(char *pMsg, int msgLen, SConnObj *pConn) { pCreate->blocksPerMeter = htons(pCreate->blocksPerMeter); pCreate->rowsInFileBlock = htonl(pCreate->rowsInFileBlock); - if (grantCheckExpired()) { + if (mgmtCheckExpired()) { code = TSDB_CODE_GRANT_EXPIRED; } else if (!pConn->writeAuth) { code = TSDB_CODE_NO_RIGHTS; @@ -1290,7 +1291,7 @@ int mgmtProcessConnectMsg(char *pMsg, int msgLen, SConnObj *pConn) { goto _rsp; } - if (grantCheckExpired()) { + if (mgmtCheckExpired()) { code = TSDB_CODE_GRANT_EXPIRED; goto _rsp; } diff --git a/src/mnode/src/mgmtSystem.spec.c b/src/mnode/src/mgmtSystem.spec.c index 47e36bf1a4..05f80ba54e 100644 --- a/src/mnode/src/mgmtSystem.spec.c +++ b/src/mnode/src/mgmtSystem.spec.c @@ -36,10 +36,8 @@ void mgmtStopSystem() {} void mgmtCleanUpRedirect() {} -bool grantCheckExpired() { return false; } int grantGetGrantsMeta(SMeterMeta *pMeta, SShowObj *pShow, SConnObj *pConn) { return TSDB_CODE_OPS_NOT_SUPPORT; } int grantRetrieveGrants(SShowObj *pShow, char *data, int rows, SConnObj *pConn) { return 0; } -void grantRestoreTimeSeries(uint32_t timeseries) {} \ No newline at end of file diff --git a/src/mnode/src/mgmtUser.c b/src/mnode/src/mgmtUser.c index 89b83e3553..71ef05eb52 100644 --- a/src/mnode/src/mgmtUser.c +++ b/src/mnode/src/mgmtUser.c @@ -17,6 +17,8 @@ #include "os.h" #include "mgmt.h" +#include "mgmtGrant.h" +#include "mgmtAcct.h" #include "tschemautil.h" #include "ttime.h" @@ -35,10 +37,6 @@ void *mgmtUserActionAfterBatchUpdate(void *row, char *str, int size, int *ssize) void *mgmtUserActionReset(void *row, char *str, int size, int *ssize); void *mgmtUserActionDestroy(void *row, char *str, int size, int *ssize); -SAcctObj *mgmtGetAcct(char *name); -void mgmtCreateRootAcct(); -int mgmtCheckUserLimit(SAcctObj *pAcct); -int mgmtCheckUserGrant(); void mgmtUserActionInit() { mgmtUserActionFp[SDB_TYPE_INSERT] = mgmtUserActionInsert; diff --git a/src/vnode/CMakeLists.txt b/src/vnode/CMakeLists.txt index ca14d807b6..5a7b605cb8 100644 --- a/src/vnode/CMakeLists.txt +++ b/src/vnode/CMakeLists.txt @@ -1,5 +1,4 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8) PROJECT(TDengine) -ADD_SUBDIRECTORY(detail) -ADD_SUBDIRECTORY(lite) \ No newline at end of file +ADD_SUBDIRECTORY(detail) \ No newline at end of file