TDengine/source/dnode/mnode/impl/src/mndTopic.c

608 lines
20 KiB
C
Raw Normal View History

2021-12-23 12:28:08 +00:00
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* 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 <http://www.gnu.org/licenses/>.
*/
2022-01-06 02:28:34 +00:00
#include "mndTopic.h"
2022-02-16 12:18:18 +00:00
#include "mndAuth.h"
2021-12-23 12:28:08 +00:00
#include "mndDb.h"
#include "mndDnode.h"
#include "mndMnode.h"
#include "mndShow.h"
2021-12-25 05:27:37 +00:00
#include "mndStb.h"
2021-12-23 12:28:08 +00:00
#include "mndTrans.h"
#include "mndUser.h"
#include "mndVgroup.h"
2022-03-26 12:12:45 +00:00
#include "parser.h"
2021-12-23 12:28:08 +00:00
#include "tname.h"
2022-02-16 13:22:07 +00:00
#define MND_TOPIC_VER_NUMBER 1
2021-12-25 05:27:37 +00:00
#define MND_TOPIC_RESERVE_SIZE 64
2021-12-23 12:28:08 +00:00
2022-01-06 02:28:34 +00:00
static int32_t mndTopicActionInsert(SSdb *pSdb, SMqTopicObj *pTopic);
static int32_t mndTopicActionDelete(SSdb *pSdb, SMqTopicObj *pTopic);
static int32_t mndTopicActionUpdate(SSdb *pSdb, SMqTopicObj *pTopic, SMqTopicObj *pNewTopic);
2022-03-15 12:53:29 +00:00
static int32_t mndProcessCreateTopicReq(SNodeMsg *pReq);
static int32_t mndProcessDropTopicReq(SNodeMsg *pReq);
static int32_t mndProcessDropTopicInRsp(SNodeMsg *pRsp);
static int32_t mndProcessTopicMetaReq(SNodeMsg *pReq);
static int32_t mndGetTopicMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
static int32_t mndRetrieveTopic(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows);
2022-01-06 02:28:34 +00:00
static void mndCancelGetNextTopic(SMnode *pMnode, void *pIter);
2021-12-23 12:28:08 +00:00
int32_t mndInitTopic(SMnode *pMnode) {
SSdbTable table = {.sdbType = SDB_TOPIC,
.keyType = SDB_KEY_BINARY,
.encodeFp = (SdbEncodeFp)mndTopicActionEncode,
.decodeFp = (SdbDecodeFp)mndTopicActionDecode,
.insertFp = (SdbInsertFp)mndTopicActionInsert,
.updateFp = (SdbUpdateFp)mndTopicActionUpdate,
.deleteFp = (SdbDeleteFp)mndTopicActionDelete};
2022-02-16 02:25:14 +00:00
mndSetMsgHandle(pMnode, TDMT_MND_CREATE_TOPIC, mndProcessCreateTopicReq);
mndSetMsgHandle(pMnode, TDMT_MND_DROP_TOPIC, mndProcessDropTopicReq);
2021-12-24 07:31:14 +00:00
mndSetMsgHandle(pMnode, TDMT_VND_DROP_TOPIC_RSP, mndProcessDropTopicInRsp);
2021-12-23 12:28:08 +00:00
2022-02-16 12:18:18 +00:00
mndAddShowMetaHandle(pMnode, TSDB_MGMT_TABLE_TP, mndGetTopicMeta);
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_TP, mndRetrieveTopic);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_TP, mndCancelGetNextTopic);
2021-12-23 12:28:08 +00:00
return sdbSetTable(pMnode->pSdb, table);
}
void mndCleanupTopic(SMnode *pMnode) {}
2022-01-06 02:56:25 +00:00
SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic) {
2022-01-06 10:17:08 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY;
2022-03-29 08:30:09 +00:00
int32_t logicalPlanLen = strlen(pTopic->logicalPlan) + 1;
int32_t physicalPlanLen = strlen(pTopic->physicalPlan) + 1;
int32_t swLen = taosEncodeSSchemaWrapper(NULL, &pTopic->schema);
int32_t size =
sizeof(SMqTopicObj) + logicalPlanLen + physicalPlanLen + pTopic->sqlLen + swLen + MND_TOPIC_RESERVE_SIZE;
2021-12-25 05:27:37 +00:00
SSdbRaw *pRaw = sdbAllocRaw(SDB_TOPIC, MND_TOPIC_VER_NUMBER, size);
2022-01-06 10:17:08 +00:00
if (pRaw == NULL) goto TOPIC_ENCODE_OVER;
2021-12-23 12:28:08 +00:00
int32_t dataPos = 0;
2022-02-28 12:46:23 +00:00
SDB_SET_BINARY(pRaw, dataPos, pTopic->name, TSDB_TOPIC_FNAME_LEN, TOPIC_ENCODE_OVER);
2022-01-06 10:17:08 +00:00
SDB_SET_BINARY(pRaw, dataPos, pTopic->db, TSDB_DB_FNAME_LEN, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->createTime, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->updateTime, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->uid, TOPIC_ENCODE_OVER);
SDB_SET_INT64(pRaw, dataPos, pTopic->dbUid, TOPIC_ENCODE_OVER);
SDB_SET_INT32(pRaw, dataPos, pTopic->version, TOPIC_ENCODE_OVER);
SDB_SET_INT32(pRaw, dataPos, pTopic->sqlLen, TOPIC_ENCODE_OVER);
SDB_SET_BINARY(pRaw, dataPos, pTopic->sql, pTopic->sqlLen, TOPIC_ENCODE_OVER);
2022-01-24 10:21:25 +00:00
SDB_SET_INT32(pRaw, dataPos, logicalPlanLen, TOPIC_ENCODE_OVER);
2022-01-18 01:53:11 +00:00
SDB_SET_BINARY(pRaw, dataPos, pTopic->logicalPlan, logicalPlanLen, TOPIC_ENCODE_OVER);
2022-01-24 10:21:25 +00:00
SDB_SET_INT32(pRaw, dataPos, physicalPlanLen, TOPIC_ENCODE_OVER);
2022-01-18 01:53:11 +00:00
SDB_SET_BINARY(pRaw, dataPos, pTopic->physicalPlan, physicalPlanLen, TOPIC_ENCODE_OVER);
2022-01-06 10:17:08 +00:00
2022-03-29 08:30:09 +00:00
void *swBuf = taosMemoryMalloc(swLen);
2022-03-26 12:12:45 +00:00
if (swBuf == NULL) {
goto TOPIC_ENCODE_OVER;
}
void *aswBuf = swBuf;
taosEncodeSSchemaWrapper(&aswBuf, &pTopic->schema);
SDB_SET_INT32(pRaw, dataPos, swLen, TOPIC_ENCODE_OVER);
SDB_SET_BINARY(pRaw, dataPos, swBuf, swLen, TOPIC_ENCODE_OVER);
2022-01-06 10:17:08 +00:00
SDB_SET_RESERVE(pRaw, dataPos, MND_TOPIC_RESERVE_SIZE, TOPIC_ENCODE_OVER);
SDB_SET_DATALEN(pRaw, dataPos, TOPIC_ENCODE_OVER);
terrno = TSDB_CODE_SUCCESS;
TOPIC_ENCODE_OVER:
if (terrno != TSDB_CODE_SUCCESS) {
mError("topic:%s, failed to encode to raw:%p since %s", pTopic->name, pRaw, terrstr());
sdbFreeRaw(pRaw);
return NULL;
}
mTrace("topic:%s, encode to raw:%p, row:%p", pTopic->name, pRaw, pTopic);
2021-12-23 12:28:08 +00:00
return pRaw;
}
2022-01-06 02:28:34 +00:00
SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
2021-12-31 06:22:50 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY;
2021-12-23 12:28:08 +00:00
int8_t sver = 0;
2021-12-31 06:22:50 +00:00
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto TOPIC_DECODE_OVER;
2021-12-23 12:28:08 +00:00
2021-12-25 05:27:37 +00:00
if (sver != MND_TOPIC_VER_NUMBER) {
2021-12-23 12:28:08 +00:00
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
2021-12-31 06:22:50 +00:00
goto TOPIC_DECODE_OVER;
2021-12-23 12:28:08 +00:00
}
2022-01-06 10:17:08 +00:00
int32_t size = sizeof(SMqTopicObj);
SSdbRow *pRow = sdbAllocRow(size);
2021-12-31 06:22:50 +00:00
if (pRow == NULL) goto TOPIC_DECODE_OVER;
2022-01-06 02:28:34 +00:00
SMqTopicObj *pTopic = sdbGetRowObj(pRow);
2021-12-31 06:22:50 +00:00
if (pTopic == NULL) goto TOPIC_DECODE_OVER;
2021-12-23 12:28:08 +00:00
2022-01-06 02:28:34 +00:00
int32_t len;
2021-12-23 12:28:08 +00:00
int32_t dataPos = 0;
2022-02-28 12:46:23 +00:00
SDB_GET_BINARY(pRaw, dataPos, pTopic->name, TSDB_TOPIC_FNAME_LEN, TOPIC_DECODE_OVER);
2022-01-06 02:44:34 +00:00
SDB_GET_BINARY(pRaw, dataPos, pTopic->db, TSDB_DB_FNAME_LEN, TOPIC_DECODE_OVER);
SDB_GET_INT64(pRaw, dataPos, &pTopic->createTime, TOPIC_DECODE_OVER);
SDB_GET_INT64(pRaw, dataPos, &pTopic->updateTime, TOPIC_DECODE_OVER);
SDB_GET_INT64(pRaw, dataPos, &pTopic->uid, TOPIC_DECODE_OVER);
SDB_GET_INT64(pRaw, dataPos, &pTopic->dbUid, TOPIC_DECODE_OVER);
SDB_GET_INT32(pRaw, dataPos, &pTopic->version, TOPIC_DECODE_OVER);
SDB_GET_INT32(pRaw, dataPos, &pTopic->sqlLen, TOPIC_DECODE_OVER);
2022-01-14 10:35:57 +00:00
2022-03-25 16:29:53 +00:00
pTopic->sql = taosMemoryCalloc(pTopic->sqlLen + 1, sizeof(char));
2022-02-15 02:11:34 +00:00
SDB_GET_BINARY(pRaw, dataPos, pTopic->sql, pTopic->sqlLen, TOPIC_DECODE_OVER);
2022-01-18 01:53:11 +00:00
SDB_GET_INT32(pRaw, dataPos, &len, TOPIC_DECODE_OVER);
2022-03-25 16:29:53 +00:00
pTopic->logicalPlan = taosMemoryCalloc(len + 1, sizeof(char));
2022-01-18 01:53:11 +00:00
if (pTopic->logicalPlan == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto TOPIC_DECODE_OVER;
}
2022-01-24 10:21:25 +00:00
SDB_GET_BINARY(pRaw, dataPos, pTopic->logicalPlan, len, TOPIC_DECODE_OVER);
2022-01-18 01:53:11 +00:00
SDB_GET_INT32(pRaw, dataPos, &len, TOPIC_DECODE_OVER);
2022-03-25 16:29:53 +00:00
pTopic->physicalPlan = taosMemoryCalloc(len + 1, sizeof(char));
2022-01-18 01:53:11 +00:00
if (pTopic->physicalPlan == NULL) {
2022-03-25 16:29:53 +00:00
taosMemoryFree(pTopic->logicalPlan);
2022-01-18 01:53:11 +00:00
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto TOPIC_DECODE_OVER;
}
2022-01-24 10:21:25 +00:00
SDB_GET_BINARY(pRaw, dataPos, pTopic->physicalPlan, len, TOPIC_DECODE_OVER);
2021-12-31 06:22:50 +00:00
2022-03-26 12:12:45 +00:00
SDB_GET_INT32(pRaw, dataPos, &len, TOPIC_DECODE_OVER);
void *buf = taosMemoryMalloc(len);
if (buf == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto TOPIC_DECODE_OVER;
}
SDB_GET_BINARY(pRaw, dataPos, buf, len, TOPIC_DECODE_OVER);
if (taosDecodeSSchemaWrapper(buf, &pTopic->schema) == NULL) {
goto TOPIC_DECODE_OVER;
}
2022-01-19 08:28:13 +00:00
SDB_GET_RESERVE(pRaw, dataPos, MND_TOPIC_RESERVE_SIZE, TOPIC_DECODE_OVER);
2021-12-31 06:22:50 +00:00
2022-01-06 10:17:08 +00:00
terrno = TSDB_CODE_SUCCESS;
2021-12-31 06:22:50 +00:00
TOPIC_DECODE_OVER:
2022-01-06 10:17:08 +00:00
if (terrno != TSDB_CODE_SUCCESS) {
2021-12-31 06:22:50 +00:00
mError("topic:%s, failed to decode from raw:%p since %s", pTopic->name, pRaw, terrstr());
2022-03-25 16:29:53 +00:00
taosMemoryFreeClear(pRow);
2021-12-31 06:22:50 +00:00
return NULL;
}
2021-12-23 12:28:08 +00:00
2021-12-31 06:22:50 +00:00
mTrace("topic:%s, decode from raw:%p, row:%p", pTopic->name, pRaw, pTopic);
2021-12-23 12:28:08 +00:00
return pRow;
}
2022-01-06 02:28:34 +00:00
static int32_t mndTopicActionInsert(SSdb *pSdb, SMqTopicObj *pTopic) {
2021-12-23 12:28:08 +00:00
mTrace("topic:%s, perform insert action", pTopic->name);
return 0;
}
2022-01-06 02:28:34 +00:00
static int32_t mndTopicActionDelete(SSdb *pSdb, SMqTopicObj *pTopic) {
2021-12-23 12:28:08 +00:00
mTrace("topic:%s, perform delete action", pTopic->name);
return 0;
}
2022-01-06 02:28:34 +00:00
static int32_t mndTopicActionUpdate(SSdb *pSdb, SMqTopicObj *pOldTopic, SMqTopicObj *pNewTopic) {
2021-12-23 12:28:08 +00:00
mTrace("topic:%s, perform update action", pOldTopic->name);
2022-03-21 16:54:21 +00:00
atomic_exchange_64(&pOldTopic->updateTime, pNewTopic->updateTime);
2021-12-23 12:28:08 +00:00
atomic_exchange_32(&pOldTopic->version, pNewTopic->version);
taosWLockLatch(&pOldTopic->lock);
2022-01-06 02:28:34 +00:00
// TODO handle update
2021-12-23 12:28:08 +00:00
taosWUnLockLatch(&pOldTopic->lock);
return 0;
}
2022-01-06 02:28:34 +00:00
SMqTopicObj *mndAcquireTopic(SMnode *pMnode, char *topicName) {
SSdb *pSdb = pMnode->pSdb;
SMqTopicObj *pTopic = sdbAcquire(pSdb, SDB_TOPIC, topicName);
2022-02-16 12:18:18 +00:00
if (pTopic == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
2021-12-23 12:28:08 +00:00
terrno = TSDB_CODE_MND_TOPIC_NOT_EXIST;
}
return pTopic;
}
2022-01-06 02:28:34 +00:00
void mndReleaseTopic(SMnode *pMnode, SMqTopicObj *pTopic) {
2021-12-23 12:28:08 +00:00
SSdb *pSdb = pMnode->pSdb;
sdbRelease(pSdb, pTopic);
}
static SDbObj *mndAcquireDbByTopic(SMnode *pMnode, char *topicName) {
SName name = {0};
2022-01-14 10:35:57 +00:00
tNameFromString(&name, topicName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
2021-12-23 12:28:08 +00:00
2022-02-28 12:46:23 +00:00
char db[TSDB_TOPIC_FNAME_LEN] = {0};
2021-12-23 12:28:08 +00:00
tNameGetFullDbName(&name, db);
return mndAcquireDb(pMnode, db);
}
2022-01-10 12:44:11 +00:00
static SDDropTopicReq *mndBuildDropTopicMsg(SMnode *pMnode, SVgObj *pVgroup, SMqTopicObj *pTopic) {
int32_t contLen = sizeof(SDDropTopicReq);
2021-12-23 12:28:08 +00:00
2022-03-25 16:29:53 +00:00
SDDropTopicReq *pDrop = taosMemoryCalloc(1, contLen);
2021-12-23 12:28:08 +00:00
if (pDrop == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
pDrop->head.contLen = htonl(contLen);
pDrop->head.vgId = htonl(pVgroup->vgId);
2022-02-28 12:46:23 +00:00
memcpy(pDrop->name, pTopic->name, TSDB_TOPIC_FNAME_LEN);
2021-12-23 12:28:08 +00:00
pDrop->tuid = htobe64(pTopic->uid);
return pDrop;
}
2022-03-10 09:15:45 +00:00
static int32_t mndCheckCreateTopicReq(SCMCreateTopicReq *pCreate) {
2022-02-16 12:18:18 +00:00
if (pCreate->name[0] == 0 || pCreate->sql == NULL || pCreate->sql[0] == 0) {
terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
return -1;
}
2021-12-23 12:28:08 +00:00
return 0;
}
2022-03-23 06:47:24 +00:00
static int32_t mndGetPlanString(const SCMCreateTopicReq *pCreate, char **pStr) {
if (NULL == pCreate->ast) {
return TSDB_CODE_SUCCESS;
}
2022-03-21 15:36:21 +00:00
SNode *pAst = NULL;
int32_t code = nodesStringToNode(pCreate->ast, &pAst);
2022-03-21 15:36:21 +00:00
SQueryPlan *pPlan = NULL;
if (TSDB_CODE_SUCCESS == code) {
2022-03-21 15:36:21 +00:00
SPlanContext cxt = {.pAstRoot = pAst, .topicQuery = true};
code = qCreateQueryPlan(&cxt, &pPlan, NULL);
}
if (TSDB_CODE_SUCCESS == code) {
code = nodesNodeToString(pPlan, false, pStr, NULL);
}
nodesDestroyNode(pAst);
nodesDestroyNode(pPlan);
terrno = code;
return code;
}
2022-03-15 12:53:29 +00:00
static int32_t mndCreateTopic(SMnode *pMnode, SNodeMsg *pReq, SCMCreateTopicReq *pCreate, SDbObj *pDb) {
2022-01-24 10:21:25 +00:00
mDebug("topic:%s to create", pCreate->name);
2022-01-06 02:28:34 +00:00
SMqTopicObj topicObj = {0};
2022-01-14 10:35:57 +00:00
tstrncpy(topicObj.name, pCreate->name, TSDB_TOPIC_FNAME_LEN);
2021-12-28 08:06:01 +00:00
tstrncpy(topicObj.db, pDb->name, TSDB_DB_FNAME_LEN);
2021-12-23 12:28:08 +00:00
topicObj.createTime = taosGetTimestampMs();
topicObj.updateTime = topicObj.createTime;
2022-01-25 10:19:51 +00:00
topicObj.uid = mndGenerateUid(pCreate->name, strlen(pCreate->name));
2021-12-23 12:28:08 +00:00
topicObj.dbUid = pDb->uid;
topicObj.version = 1;
2022-01-28 11:58:56 +00:00
topicObj.sql = pCreate->sql;
topicObj.physicalPlan = "";
topicObj.logicalPlan = "";
2022-01-14 10:35:57 +00:00
topicObj.sqlLen = strlen(pCreate->sql);
2021-12-23 12:28:08 +00:00
2022-03-21 15:36:21 +00:00
char *pPlanStr = NULL;
if (TSDB_CODE_SUCCESS != mndGetPlanString(pCreate, &pPlanStr)) {
mError("topic:%s, failed to get plan since %s", pCreate->name, terrstr());
return -1;
}
if (NULL != pPlanStr) {
topicObj.physicalPlan = pPlanStr;
}
2022-03-26 12:12:45 +00:00
SNode *pAst = NULL;
if (nodesStringToNode(pCreate->ast, &pAst) < 0) {
return -1;
}
if (qExtractResultSchema(pAst, &topicObj.schema.nCols, &topicObj.schema.pSchema) != 0) {
return -1;
}
2022-02-18 03:49:15 +00:00
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_TOPIC, &pReq->rpcMsg);
2022-02-16 12:18:18 +00:00
if (pTrans == NULL) {
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
2022-03-25 16:29:53 +00:00
taosMemoryFreeClear(pPlanStr);
2022-02-16 12:18:18 +00:00
return -1;
}
mDebug("trans:%d, used to create topic:%s", pTrans->id, pCreate->name);
SSdbRaw *pRedoRaw = mndTopicActionEncode(&topicObj);
if (pRedoRaw == NULL || mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr());
2022-03-25 16:29:53 +00:00
taosMemoryFreeClear(pPlanStr);
2022-02-16 12:18:18 +00:00
mndTransDrop(pTrans);
return -1;
}
sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY);
if (mndTransPrepare(pMnode, pTrans) != 0) {
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
2022-03-25 16:29:53 +00:00
taosMemoryFreeClear(pPlanStr);
2022-02-16 12:18:18 +00:00
mndTransDrop(pTrans);
return -1;
}
2022-03-25 16:29:53 +00:00
taosMemoryFreeClear(pPlanStr);
2022-02-16 12:18:18 +00:00
mndTransDrop(pTrans);
return 0;
2021-12-23 12:28:08 +00:00
}
2022-03-15 12:53:29 +00:00
static int32_t mndProcessCreateTopicReq(SNodeMsg *pReq) {
SMnode *pMnode = pReq->pNode;
2022-03-10 09:15:45 +00:00
int32_t code = -1;
SMqTopicObj *pTopic = NULL;
SDbObj *pDb = NULL;
SUserObj *pUser = NULL;
SCMCreateTopicReq createTopicReq = {0};
if (tDeserializeSCMCreateTopicReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &createTopicReq) != 0) {
2022-02-16 12:18:18 +00:00
terrno = TSDB_CODE_INVALID_MSG;
goto CREATE_TOPIC_OVER;
}
2022-01-14 10:35:57 +00:00
mDebug("topic:%s, start to create, sql:%s", createTopicReq.name, createTopicReq.sql);
2021-12-23 12:28:08 +00:00
2022-02-16 12:18:18 +00:00
if (mndCheckCreateTopicReq(&createTopicReq) != 0) {
2022-01-14 10:35:57 +00:00
mError("topic:%s, failed to create since %s", createTopicReq.name, terrstr());
2022-02-16 12:18:18 +00:00
goto CREATE_TOPIC_OVER;
2021-12-23 12:28:08 +00:00
}
2022-02-16 12:18:18 +00:00
pTopic = mndAcquireTopic(pMnode, createTopicReq.name);
2021-12-23 12:28:08 +00:00
if (pTopic != NULL) {
2022-01-14 10:35:57 +00:00
if (createTopicReq.igExists) {
mDebug("topic:%s, already exist, ignore exist is set", createTopicReq.name);
2022-02-16 12:18:18 +00:00
code = 0;
goto CREATE_TOPIC_OVER;
2021-12-23 12:28:08 +00:00
} else {
terrno = TSDB_CODE_MND_TOPIC_ALREADY_EXIST;
2022-02-16 12:18:18 +00:00
goto CREATE_TOPIC_OVER;
2021-12-23 12:28:08 +00:00
}
2022-02-16 12:18:18 +00:00
} else if (terrno != TSDB_CODE_MND_TOPIC_NOT_EXIST) {
goto CREATE_TOPIC_OVER;
2021-12-23 12:28:08 +00:00
}
2022-02-16 12:18:18 +00:00
pDb = mndAcquireDbByTopic(pMnode, createTopicReq.name);
2021-12-23 12:28:08 +00:00
if (pDb == NULL) {
terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
2022-02-16 12:18:18 +00:00
goto CREATE_TOPIC_OVER;
}
pUser = mndAcquireUser(pMnode, pReq->user);
if (pUser == NULL) {
goto CREATE_TOPIC_OVER;
}
if (mndCheckWriteAuth(pUser, pDb) != 0) {
goto CREATE_TOPIC_OVER;
}
code = mndCreateTopic(pMnode, pReq, &createTopicReq, pDb);
if (code == 0) code = TSDB_CODE_MND_ACTION_IN_PROGRESS;
CREATE_TOPIC_OVER:
if (code != 0 && code != TSDB_CODE_MND_ACTION_IN_PROGRESS) {
2022-01-14 10:35:57 +00:00
mError("topic:%s, failed to create since %s", createTopicReq.name, terrstr());
2021-12-23 12:28:08 +00:00
}
2022-02-16 12:18:18 +00:00
mndReleaseTopic(pMnode, pTopic);
2021-12-23 12:28:08 +00:00
mndReleaseDb(pMnode, pDb);
2022-02-16 12:18:18 +00:00
mndReleaseUser(pMnode, pUser);
2021-12-23 12:28:08 +00:00
2022-03-10 09:15:45 +00:00
tFreeSCMCreateTopicReq(&createTopicReq);
2022-02-16 12:18:18 +00:00
return code;
}
2022-03-15 12:53:29 +00:00
static int32_t mndDropTopic(SMnode *pMnode, SNodeMsg *pReq, SMqTopicObj *pTopic) {
2022-02-28 12:46:23 +00:00
// TODO: cannot drop when subscribed
2022-02-18 03:49:15 +00:00
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_DROP_TOPIC, &pReq->rpcMsg);
2022-02-16 12:18:18 +00:00
if (pTrans == NULL) {
mError("topic:%s, failed to drop since %s", pTopic->name, terrstr());
return -1;
}
mDebug("trans:%d, used to drop topic:%s", pTrans->id, pTopic->name);
SSdbRaw *pRedoRaw = mndTopicActionEncode(pTopic);
if (pRedoRaw == NULL || mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
mError("trans:%d, failed to append redo log since %s", pTrans->id, terrstr());
mndTransDrop(pTrans);
return -1;
}
sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPED);
if (mndTransPrepare(pMnode, pTrans) != 0) {
mError("trans:%d, failed to prepare since %s", pTrans->id, terrstr());
mndTransDrop(pTrans);
2021-12-23 12:28:08 +00:00
return -1;
}
2022-02-16 12:18:18 +00:00
mndTransDrop(pTrans);
2022-02-15 02:11:34 +00:00
return 0;
2021-12-23 12:28:08 +00:00
}
2022-03-15 12:53:29 +00:00
static int32_t mndProcessDropTopicReq(SNodeMsg *pReq) {
SMnode *pMnode = pReq->pNode;
2022-02-16 02:25:14 +00:00
SMDropTopicReq dropReq = {0};
2021-12-23 12:28:08 +00:00
2022-02-16 02:25:14 +00:00
if (tDeserializeSMDropTopicReq(pReq->rpcMsg.pCont, pReq->rpcMsg.contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
mDebug("topic:%s, start to drop", dropReq.name);
2021-12-23 12:28:08 +00:00
2022-02-16 02:25:14 +00:00
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, dropReq.name);
2021-12-23 12:28:08 +00:00
if (pTopic == NULL) {
2022-02-16 02:25:14 +00:00
if (dropReq.igNotExists) {
mDebug("topic:%s, not exist, ignore not exist is set", dropReq.name);
2021-12-23 12:28:08 +00:00
return 0;
} else {
terrno = TSDB_CODE_MND_TOPIC_NOT_EXIST;
2022-02-16 02:25:14 +00:00
mError("topic:%s, failed to drop since %s", dropReq.name, terrstr());
2021-12-23 12:28:08 +00:00
return -1;
}
}
2022-02-16 02:25:14 +00:00
int32_t code = mndDropTopic(pMnode, pReq, pTopic);
2021-12-23 12:28:08 +00:00
mndReleaseTopic(pMnode, pTopic);
if (code != 0) {
terrno = code;
2022-02-16 02:25:14 +00:00
mError("topic:%s, failed to drop since %s", dropReq.name, terrstr());
2021-12-23 12:28:08 +00:00
return -1;
}
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
}
2022-03-15 12:53:29 +00:00
static int32_t mndProcessDropTopicInRsp(SNodeMsg *pRsp) {
2022-02-16 02:25:14 +00:00
mndTransProcessRsp(pRsp);
2021-12-23 12:28:08 +00:00
return 0;
}
2022-03-01 07:56:11 +00:00
static int32_t mndGetNumOfTopics(SMnode *pMnode, char *dbName, int32_t *pNumOfTopics) {
SSdb *pSdb = pMnode->pSdb;
SDbObj *pDb = mndAcquireDb(pMnode, dbName);
if (pDb == NULL) {
terrno = TSDB_CODE_MND_DB_NOT_SELECTED;
return -1;
}
int32_t numOfTopics = 0;
void *pIter = NULL;
while (1) {
SMqTopicObj *pTopic = NULL;
pIter = sdbFetch(pSdb, SDB_TOPIC, pIter, (void **)&pTopic);
if (pIter == NULL) break;
if (pTopic->dbUid == pDb->uid) {
numOfTopics++;
}
sdbRelease(pSdb, pTopic);
}
*pNumOfTopics = numOfTopics;
mndReleaseDb(pMnode, pDb);
return 0;
}
2022-03-15 12:53:29 +00:00
static int32_t mndGetTopicMeta(SNodeMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta) {
SMnode *pMnode = pReq->pNode;
2021-12-23 12:28:08 +00:00
SSdb *pSdb = pMnode->pSdb;
if (mndGetNumOfTopics(pMnode, pShow->db, &pShow->numOfRows) != 0) {
return -1;
}
int32_t cols = 0;
2022-02-15 07:24:27 +00:00
SSchema *pSchema = pMeta->pSchemas;
2021-12-23 12:28:08 +00:00
pShow->bytes[cols] = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE;
pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
strcpy(pSchema[cols].name, "name");
2022-02-15 07:24:27 +00:00
pSchema[cols].bytes = pShow->bytes[cols];
2021-12-23 12:28:08 +00:00
cols++;
pShow->bytes[cols] = 8;
pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP;
strcpy(pSchema[cols].name, "create_time");
2022-02-15 07:24:27 +00:00
pSchema[cols].bytes = pShow->bytes[cols];
2021-12-23 12:28:08 +00:00
cols++;
2022-02-16 12:18:18 +00:00
pShow->bytes[cols] = TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE;
pSchema[cols].type = TSDB_DATA_TYPE_BINARY;
strcpy(pSchema[cols].name, "sql");
pSchema[cols].bytes = pShow->bytes[cols];
cols++;
2022-02-15 07:24:27 +00:00
pMeta->numOfColumns = cols;
2021-12-23 12:28:08 +00:00
pShow->numOfColumns = cols;
pShow->offset[0] = 0;
for (int32_t i = 1; i < cols; ++i) {
pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1];
}
pShow->numOfRows = sdbGetSize(pSdb, SDB_TOPIC);
pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
2022-01-28 09:50:16 +00:00
strcpy(pMeta->tbName, mndShowStr(pShow->type));
2021-12-23 12:28:08 +00:00
return 0;
}
2022-03-15 12:53:29 +00:00
static int32_t mndRetrieveTopic(SNodeMsg *pReq, SShowObj *pShow, char *data, int32_t rows) {
SMnode *pMnode = pReq->pNode;
2022-01-06 02:28:34 +00:00
SSdb *pSdb = pMnode->pSdb;
int32_t numOfRows = 0;
SMqTopicObj *pTopic = NULL;
int32_t cols = 0;
char *pWrite;
2022-02-16 02:34:29 +00:00
char prefix[TSDB_DB_FNAME_LEN] = {0};
SDbObj *pDb = mndAcquireDb(pMnode, pShow->db);
if (pDb == NULL) return 0;
2021-12-23 12:28:08 +00:00
2022-02-16 02:34:29 +00:00
tstrncpy(prefix, pShow->db, TSDB_DB_FNAME_LEN);
2021-12-23 12:28:08 +00:00
strcat(prefix, TS_PATH_DELIMITER);
int32_t prefixLen = (int32_t)strlen(prefix);
while (numOfRows < rows) {
pShow->pIter = sdbFetch(pSdb, SDB_TOPIC, pShow->pIter, (void **)&pTopic);
if (pShow->pIter == NULL) break;
2022-02-16 02:34:29 +00:00
if (pTopic->dbUid != pDb->uid) {
if (strncmp(pTopic->name, prefix, prefixLen) != 0) {
2022-02-28 12:46:23 +00:00
mError("Inconsistent topic data, name:%s, db:%s, dbUid:%" PRIu64, pTopic->name, pDb->name, pDb->uid);
2022-02-16 02:34:29 +00:00
}
2021-12-23 12:28:08 +00:00
sdbRelease(pSdb, pTopic);
continue;
}
cols = 0;
2022-02-28 12:46:23 +00:00
char topicName[TSDB_TOPIC_NAME_LEN] = {0};
tstrncpy(topicName, pTopic->name + prefixLen, TSDB_TOPIC_NAME_LEN);
2021-12-23 12:28:08 +00:00
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
STR_TO_VARSTR(pWrite, topicName);
cols++;
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
*(int64_t *)pWrite = pTopic->createTime;
cols++;
2022-02-16 12:18:18 +00:00
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
STR_WITH_MAXSIZE_TO_VARSTR(pWrite, pTopic->sql, pShow->bytes[cols]);
cols++;
2021-12-23 12:28:08 +00:00
numOfRows++;
sdbRelease(pSdb, pTopic);
}
2022-02-16 02:34:29 +00:00
mndReleaseDb(pMnode, pDb);
2021-12-23 12:28:08 +00:00
pShow->numOfReads += numOfRows;
mndVacuumResult(data, pShow->numOfColumns, numOfRows, rows, pShow);
return numOfRows;
}
static void mndCancelGetNextTopic(SMnode *pMnode, void *pIter) {
SSdb *pSdb = pMnode->pSdb;
sdbCancelFetch(pSdb, pIter);
}