diff --git a/include/common/tgrant.h b/include/common/tgrant.h index 52f81e5b80..e0fc499fea 100644 --- a/include/common/tgrant.h +++ b/include/common/tgrant.h @@ -62,6 +62,7 @@ typedef struct { } SGrantedInfo; int32_t grantCheck(EGrantType grant); +int32_t grantAlterActiveCode(const char* active); char* grantGetMachineId(); #ifndef GRANTS_CFG diff --git a/include/common/tmsg.h b/include/common/tmsg.h index f815d689c5..2be158789f 100644 --- a/include/common/tmsg.h +++ b/include/common/tmsg.h @@ -1600,6 +1600,7 @@ typedef struct { SEp ep; char active[TSDB_ACTIVE_KEY_LEN]; char connActive[TSDB_CONN_ACTIVE_KEY_LEN]; + char machineId[TSDB_MACHINE_ID_LEN + 1]; } SDnodeInfo; typedef struct { diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h index bdee3934fe..bd711002ae 100644 --- a/include/common/ttokendef.h +++ b/include/common/ttokendef.h @@ -74,111 +74,111 @@ #define TK_NK_IPTOKEN 55 #define TK_FORCE 56 #define TK_UNSAFE 57 -#define TK_LOCAL 58 -#define TK_QNODE 59 -#define TK_BNODE 60 -#define TK_SNODE 61 -#define TK_MNODE 62 -#define TK_VNODE 63 -#define TK_DATABASE 64 -#define TK_USE 65 -#define TK_FLUSH 66 -#define TK_TRIM 67 -#define TK_COMPACT 68 -#define TK_IF 69 -#define TK_NOT 70 -#define TK_EXISTS 71 -#define TK_BUFFER 72 -#define TK_CACHEMODEL 73 -#define TK_CACHESIZE 74 -#define TK_COMP 75 -#define TK_DURATION 76 -#define TK_NK_VARIABLE 77 -#define TK_MAXROWS 78 -#define TK_MINROWS 79 -#define TK_KEEP 80 -#define TK_PAGES 81 -#define TK_PAGESIZE 82 -#define TK_TSDB_PAGESIZE 83 -#define TK_PRECISION 84 -#define TK_REPLICA 85 -#define TK_VGROUPS 86 -#define TK_SINGLE_STABLE 87 -#define TK_RETENTIONS 88 -#define TK_SCHEMALESS 89 -#define TK_WAL_LEVEL 90 -#define TK_WAL_FSYNC_PERIOD 91 -#define TK_WAL_RETENTION_PERIOD 92 -#define TK_WAL_RETENTION_SIZE 93 -#define TK_WAL_ROLL_PERIOD 94 -#define TK_WAL_SEGMENT_SIZE 95 -#define TK_STT_TRIGGER 96 -#define TK_TABLE_PREFIX 97 -#define TK_TABLE_SUFFIX 98 -#define TK_KEEP_TIME_OFFSET 99 -#define TK_NK_COLON 100 -#define TK_BWLIMIT 101 -#define TK_START 102 -#define TK_TIMESTAMP 103 -#define TK_END 104 -#define TK_TABLE 105 -#define TK_NK_LP 106 -#define TK_NK_RP 107 -#define TK_STABLE 108 -#define TK_COLUMN 109 -#define TK_MODIFY 110 -#define TK_RENAME 111 -#define TK_TAG 112 -#define TK_SET 113 -#define TK_NK_EQ 114 -#define TK_USING 115 -#define TK_TAGS 116 -#define TK_BOOL 117 -#define TK_TINYINT 118 -#define TK_SMALLINT 119 -#define TK_INT 120 -#define TK_INTEGER 121 -#define TK_BIGINT 122 -#define TK_FLOAT 123 -#define TK_DOUBLE 124 -#define TK_BINARY 125 -#define TK_NCHAR 126 -#define TK_UNSIGNED 127 -#define TK_JSON 128 -#define TK_VARCHAR 129 -#define TK_MEDIUMBLOB 130 -#define TK_BLOB 131 -#define TK_VARBINARY 132 -#define TK_GEOMETRY 133 -#define TK_DECIMAL 134 -#define TK_COMMENT 135 -#define TK_MAX_DELAY 136 -#define TK_WATERMARK 137 -#define TK_ROLLUP 138 -#define TK_TTL 139 -#define TK_SMA 140 -#define TK_DELETE_MARK 141 -#define TK_FIRST 142 -#define TK_LAST 143 -#define TK_SHOW 144 -#define TK_PRIVILEGES 145 -#define TK_DATABASES 146 -#define TK_TABLES 147 -#define TK_STABLES 148 -#define TK_MNODES 149 -#define TK_QNODES 150 -#define TK_FUNCTIONS 151 -#define TK_INDEXES 152 -#define TK_ACCOUNTS 153 -#define TK_APPS 154 -#define TK_CONNECTIONS 155 -#define TK_LICENCES 156 -#define TK_GRANTS 157 -#define TK_QUERIES 158 -#define TK_SCORES 159 -#define TK_TOPICS 160 -#define TK_VARIABLES 161 -#define TK_CLUSTER 162 +#define TK_CLUSTER 58 +#define TK_LOCAL 59 +#define TK_QNODE 60 +#define TK_BNODE 61 +#define TK_SNODE 62 +#define TK_MNODE 63 +#define TK_VNODE 64 +#define TK_DATABASE 65 +#define TK_USE 66 +#define TK_FLUSH 67 +#define TK_TRIM 68 +#define TK_COMPACT 69 +#define TK_IF 70 +#define TK_NOT 71 +#define TK_EXISTS 72 +#define TK_BUFFER 73 +#define TK_CACHEMODEL 74 +#define TK_CACHESIZE 75 +#define TK_COMP 76 +#define TK_DURATION 77 +#define TK_NK_VARIABLE 78 +#define TK_MAXROWS 79 +#define TK_MINROWS 80 +#define TK_KEEP 81 +#define TK_PAGES 82 +#define TK_PAGESIZE 83 +#define TK_TSDB_PAGESIZE 84 +#define TK_PRECISION 85 +#define TK_REPLICA 86 +#define TK_VGROUPS 87 +#define TK_SINGLE_STABLE 88 +#define TK_RETENTIONS 89 +#define TK_SCHEMALESS 90 +#define TK_WAL_LEVEL 91 +#define TK_WAL_FSYNC_PERIOD 92 +#define TK_WAL_RETENTION_PERIOD 93 +#define TK_WAL_RETENTION_SIZE 94 +#define TK_WAL_ROLL_PERIOD 95 +#define TK_WAL_SEGMENT_SIZE 96 +#define TK_STT_TRIGGER 97 +#define TK_TABLE_PREFIX 98 +#define TK_TABLE_SUFFIX 99 +#define TK_KEEP_TIME_OFFSET 100 +#define TK_NK_COLON 101 +#define TK_BWLIMIT 102 +#define TK_START 103 +#define TK_TIMESTAMP 104 +#define TK_END 105 +#define TK_TABLE 106 +#define TK_NK_LP 107 +#define TK_NK_RP 108 +#define TK_STABLE 109 +#define TK_COLUMN 110 +#define TK_MODIFY 111 +#define TK_RENAME 112 +#define TK_TAG 113 +#define TK_SET 114 +#define TK_NK_EQ 115 +#define TK_USING 116 +#define TK_TAGS 117 +#define TK_BOOL 118 +#define TK_TINYINT 119 +#define TK_SMALLINT 120 +#define TK_INT 121 +#define TK_INTEGER 122 +#define TK_BIGINT 123 +#define TK_FLOAT 124 +#define TK_DOUBLE 125 +#define TK_BINARY 126 +#define TK_NCHAR 127 +#define TK_UNSIGNED 128 +#define TK_JSON 129 +#define TK_VARCHAR 130 +#define TK_MEDIUMBLOB 131 +#define TK_BLOB 132 +#define TK_VARBINARY 133 +#define TK_GEOMETRY 134 +#define TK_DECIMAL 135 +#define TK_COMMENT 136 +#define TK_MAX_DELAY 137 +#define TK_WATERMARK 138 +#define TK_ROLLUP 139 +#define TK_TTL 140 +#define TK_SMA 141 +#define TK_DELETE_MARK 142 +#define TK_FIRST 143 +#define TK_LAST 144 +#define TK_SHOW 145 +#define TK_PRIVILEGES 146 +#define TK_DATABASES 147 +#define TK_TABLES 148 +#define TK_STABLES 149 +#define TK_MNODES 150 +#define TK_QNODES 151 +#define TK_FUNCTIONS 152 +#define TK_INDEXES 153 +#define TK_ACCOUNTS 154 +#define TK_APPS 155 +#define TK_CONNECTIONS 156 +#define TK_LICENCES 157 +#define TK_GRANTS 158 +#define TK_QUERIES 159 +#define TK_SCORES 160 +#define TK_TOPICS 161 +#define TK_VARIABLES 162 #define TK_BNODES 163 #define TK_SNODES 164 #define TK_TRANSACTIONS 165 diff --git a/include/util/taoserror.h b/include/util/taoserror.h index b53b138e79..da93e25bed 100644 --- a/include/util/taoserror.h +++ b/include/util/taoserror.h @@ -562,6 +562,7 @@ int32_t* taosGetErrno(); #define TSDB_CODE_GRANT_GEN_APP_LIMIT TAOS_DEF_ERROR_CODE(0, 0x0813) #define TSDB_CODE_GRANT_GEN_ENC_IVLD_KLEN TAOS_DEF_ERROR_CODE(0, 0x0814) #define TSDB_CODE_GRANT_PAR_IVLD_DIST TAOS_DEF_ERROR_CODE(0, 0x0815) +#define TSDB_CODE_GRANT_INVALID_HW TAOS_DEF_ERROR_CODE(0, 0x0816) // sync // #define TSDB_CODE_SYN_INVALID_CONFIG TAOS_DEF_ERROR_CODE(0, 0x0900) // 2.x diff --git a/source/dnode/mnode/impl/inc/mndInt.h b/source/dnode/mnode/impl/inc/mndInt.h index 72f9ec1735..3c05c9e258 100644 --- a/source/dnode/mnode/impl/inc/mndInt.h +++ b/source/dnode/mnode/impl/inc/mndInt.h @@ -25,6 +25,7 @@ #include "tglobal.h" #include "tgrant.h" #include "tqueue.h" +#include "tref.h" #include "ttime.h" #include "version.h" #include "wal.h" @@ -106,6 +107,7 @@ typedef struct { typedef struct SMnode { int32_t selfDnodeId; + int32_t refMgmt; int64_t clusterId; TdThread thread; TdThreadRwlock lock; @@ -133,6 +135,10 @@ typedef struct SMnode { int64_t ipWhiteVer; } SMnode; +typedef struct { + RefFp freeFp; +} SMnodeRefInfo; + void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp); int64_t mndGenerateUid(const char *name, int32_t len); diff --git a/source/dnode/mnode/impl/src/mndCluster.c b/source/dnode/mnode/impl/src/mndCluster.c index d44e3cbbbc..9e18063ee3 100644 --- a/source/dnode/mnode/impl/src/mndCluster.c +++ b/source/dnode/mnode/impl/src/mndCluster.c @@ -434,6 +434,7 @@ static int32_t mndProcessConfigClusterReq(SRpcMsg *pReq) { goto _exit; } // code = xxx; + code = grantAlterActiveCode(cfgReq.value); #else code = TSDB_CODE_OPS_NOT_SUPPORT; goto _exit; @@ -447,11 +448,11 @@ _exit: tFreeSMCfgClusterReq(&cfgReq); if (code != 0) { terrno = code; - mError("cluster: failed to config:%s, %s since %s", cfgReq.config, cfgReq.value, terrstr()); + mError("cluster: failed to config:%s %s since %s", cfgReq.config, cfgReq.value, terrstr()); } else { - mError("cluster: success to config:%s, %s", cfgReq.config, cfgReq.value); + mInfo("cluster: success to config:%s %s", cfgReq.config, cfgReq.value); } - return -1; + return code; } static int32_t mndProcessConfigClusterRsp(SRpcMsg *pRsp) { diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c index 856d2a1e1e..414de7513e 100644 --- a/source/dnode/mnode/impl/src/mndDnode.c +++ b/source/dnode/mnode/impl/src/mndDnode.c @@ -59,8 +59,10 @@ enum { }; typedef struct { - char machineId[TSDB_MACHINE_ID_LEN + 1]; - tsem_t sem; + SMnodeRefInfo refInfo; + int64_t refId; + tsem_t sem; + char machineId[TSDB_MACHINE_ID_LEN + 1]; } SMachineInfo; static int32_t mndCreateDefaultDnode(SMnode *pMnode); @@ -416,6 +418,7 @@ void mndGetDnodeData(SMnode *pMnode, SArray *pDnodeInfo) { tstrncpy(dInfo.ep.fqdn, pDnode->fqdn, TSDB_FQDN_LEN); tstrncpy(dInfo.active, pDnode->active, TSDB_ACTIVE_KEY_LEN); tstrncpy(dInfo.connActive, pDnode->connActive, TSDB_CONN_ACTIVE_KEY_LEN); + tstrncpy(dInfo.machineId, pDnode->machineId, TSDB_MACHINE_ID_LEN + 1); sdbRelease(pSdb, pDnode); if (mndIsMnode(pMnode, pDnode->id)) { dInfo.isMnode = 1; @@ -743,13 +746,19 @@ _OVER: } static int32_t mndSendGetMachineToDnode(SMnode *pMnode, SDnodeObj *pObj, SMachineInfo *pInfo) { - SRpcMsg rpcMsg = {.pCont = NULL, .contLen = 0, .msgType = TDMT_MND_GET_MACHINE, .info.ahandle = pInfo}; + SRpcMsg rpcMsg = {.pCont = NULL, .contLen = 0, .msgType = TDMT_MND_GET_MACHINE, .info.ahandle = (void*)pInfo->refId}; SEpSet epSet = {.numOfEps = 1}; strncpy(epSet.eps[0].fqdn, pObj->fqdn, TSDB_FQDN_LEN); epSet.eps[0].port = pObj->port; return tmsgSendReq(&epSet, &rpcMsg); } +static void mndDestroyMachineInfo(void *pInfo) { + if (pInfo) { + tsem_destroy(&((SMachineInfo *)pInfo)->sem); + } +} + static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pCreate) { int32_t code = -1; SSdbRaw *pRaw = NULL; @@ -767,7 +776,11 @@ static int32_t mndCreateDnode(SMnode *pMnode, SRpcMsg *pReq, SCreateDnodeReq *pC terrno = TSDB_CODE_OUT_OF_MEMORY; goto _OVER; } + pInfo->refInfo.freeFp = mndDestroyMachineInfo; tsem_init(&pInfo->sem, 0, 0); + if((pInfo->refId = taosAddRef(pMnode->refMgmt, pInfo)) < 0) { + goto _OVER; + } if ((terrno = mndSendGetMachineToDnode(pMnode, &dnodeObj, pInfo)) != 0) { goto _OVER; } @@ -798,8 +811,7 @@ _OVER: mndTransDrop(pTrans); sdbFreeRaw(pRaw); if (pInfo) { - tsem_destroy(&pInfo->sem); - taosMemoryFree(pInfo); + taosRemoveRef(pMnode->refMgmt, pInfo->refId); } return code; } @@ -1280,10 +1292,16 @@ static int32_t mndProcessGetMachineRsp(SRpcMsg *pRsp) { return -1; } - SMachineInfo *pInfo = pRsp->info.ahandle; - if (pInfo) { - memcpy(pInfo->machineId, pRsp->pCont, TSDB_MACHINE_ID_LEN); - tsem_post(&pInfo->sem); + SMnode *pMnode = pRsp->info.node; + int64_t refId = (int64_t)pRsp->info.ahandle; + + if (pMnode) { + SMachineInfo *pInfo = taosAcquireRef(pMnode->refMgmt, refId); + if (pInfo) { + memcpy(pInfo->machineId, pRsp->pCont, TSDB_MACHINE_ID_LEN); + tsem_post(&pInfo->sem); + taosReleaseRef(pMnode->refMgmt, refId); + } } return 0; diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c index 38a92b43e7..1bcd44c9cc 100644 --- a/source/dnode/mnode/impl/src/mndMain.c +++ b/source/dnode/mnode/impl/src/mndMain.c @@ -543,6 +543,14 @@ static void mndSetOptions(SMnode *pMnode, const SMnodeOpt *pOption) { memcpy(pMnode->syncMgmt.nodeRoles, pOption->nodeRoles, sizeof(pOption->nodeRoles)); } +static void mndDestroyRefInfo(void *pInfo) { + SMnodeRefInfo *pRefInfo = pInfo; + if (pRefInfo && pRefInfo->freeFp) { + (*pRefInfo->freeFp)(pInfo); + } + taosMemoryFree(pInfo); +} + SMnode *mndOpen(const char *path, const SMnodeOpt *pOption) { mInfo("start to open mnode in %s", path); @@ -567,7 +575,16 @@ SMnode *mndOpen(const char *path, const SMnodeOpt *pOption) { return NULL; } - int32_t code = mndCreateDir(pMnode, path); + int32_t code = 0; + if ((pMnode->refMgmt = taosOpenRef(200, mndDestroyRefInfo)) < 0) { + code = terrno; + mError("failed to open mnode since %s", terrstr()); + mndClose(pMnode); + terrno = code; + return NULL; + } + + code = mndCreateDir(pMnode, path); if (code != 0) { code = terrno; mError("failed to open mnode since %s", terrstr()); @@ -610,6 +627,7 @@ void mndClose(SMnode *pMnode) { if (pMnode != NULL) { mInfo("start to close mnode"); mndCleanupSteps(pMnode, -1); + taosCloseRef(pMnode->refMgmt); taosMemoryFreeClear(pMnode->path); taosMemoryFreeClear(pMnode); mInfo("mnode is closed"); diff --git a/source/util/src/terror.c b/source/util/src/terror.c index c29af8bc7e..6837d5e401 100644 --- a/source/util/src/terror.c +++ b/source/util/src/terror.c @@ -449,6 +449,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_GEN_IVLD_KEY, "Invalid key to gen ac TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_GEN_APP_LIMIT, "Limited app num to gen active code") TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_GEN_ENC_IVLD_KLEN, "Invalid klen to encode active code") TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_PAR_IVLD_DIST, "Invalid dist to parse active code") +TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_INVALID_HW, "Invalid hardware") // sync TAOS_DEFINE_ERROR(TSDB_CODE_SYN_TIMEOUT, "Sync timeout")