diff --git a/src/dnode/src/dnodeWrite.c b/src/dnode/src/dnodeWrite.c index 75169a3fa27b28689ec2c9e6b33d814f56620951..0d6c916703acd71088ad5f78a7d8dacbff18a6df 100644 --- a/src/dnode/src/dnodeWrite.c +++ b/src/dnode/src/dnodeWrite.c @@ -96,6 +96,7 @@ void dnodeWrite(SRpcMsg *pMsg) { SMsgDesc *pDesc = (SMsgDesc *)pCont; pDesc->numOfVnodes = htonl(pDesc->numOfVnodes); pCont += sizeof(SMsgDesc); + leftLen -= sizeof(SMsgDesc); if (pDesc->numOfVnodes > 1) { pRpcContext = calloc(sizeof(SRpcContext), 1); pRpcContext->numOfVnodes = pDesc->numOfVnodes; diff --git a/src/inc/mnode.h b/src/inc/mnode.h index adb1f2788522b81fbd025e393c7bbc8a4fe156e7..2fbceb06dfccf5ebac4d7c461698248bbfa043ef 100644 --- a/src/inc/mnode.h +++ b/src/inc/mnode.h @@ -59,6 +59,7 @@ typedef struct { char mnodeName[TSDB_DNODE_NAME_LEN + 1]; int8_t reserved[15]; int8_t updateEnd[1]; + int32_t refCount; int syncFd; void *hbTimer; void *pSync; @@ -84,6 +85,7 @@ typedef struct { char dnodeName[TSDB_DNODE_NAME_LEN + 1]; int8_t reserved[15]; int8_t updateEnd[1]; + int32_t refCount; SVnodeLoad vload[TSDB_MAX_VNODES]; int32_t status; uint32_t lastReboot; // time stamp for last reboot @@ -102,9 +104,8 @@ typedef struct { } SVnodeGid; typedef struct { - char tableId[TSDB_TABLE_ID_LEN]; + char tableId[TSDB_TABLE_ID_LEN + 1]; int8_t type; - int8_t dirty; } STableInfo; typedef struct SSuperTableObj { @@ -116,6 +117,7 @@ typedef struct SSuperTableObj { int32_t numOfTags; int8_t reserved[15]; int8_t updateEnd[1]; + int32_t refCount; int32_t numOfTables; int16_t nextColId; SSchema * schema; @@ -134,6 +136,7 @@ typedef struct { int8_t reserved[1]; int8_t updateEnd[1]; int16_t nextColId; //used by normal table + int32_t refCount; char* sql; //used by normal table SSchema* schema; //used by normal table SSuperTableObj *superTable; @@ -150,6 +153,7 @@ typedef struct _vg_obj { int8_t lbStatus; int8_t reserved[14]; int8_t updateEnd[1]; + int32_t refCount; struct _vg_obj *prev, *next; struct _db_obj *pDb; int32_t numOfTables; @@ -164,7 +168,7 @@ typedef struct _db_obj { SDbCfg cfg; int8_t reserved[15]; int8_t updateEnd[1]; - struct _db_obj *prev, *next; + int32_t refCount; int32_t numOfVgroups; int32_t numOfTables; int32_t numOfSuperTables; @@ -182,7 +186,7 @@ typedef struct _user_obj { int8_t writeAuth; int8_t reserved[13]; int8_t updateEnd[1]; - struct _user_obj *prev, *next; + int32_t refCount; struct _acctObj * pAcct; SQqueryList * pQList; // query list SStreamList * pSList; // stream list @@ -215,9 +219,8 @@ typedef struct _acctObj { int8_t dirty; int8_t reserved[14]; int8_t updateEnd[1]; + int32_t refCount; SAcctInfo acctInfo; - SDbObj * pHead; - SUserObj * pUser; pthread_mutex_t mutex; } SAcctObj; @@ -247,8 +250,12 @@ typedef struct { void *ahandle; void *thandle; void *pCont; - SDbObj *pDb; + SAcctObj *pAcct; + SDnodeObj*pDnode; SUserObj *pUser; + SDbObj *pDb; + SVgObj *pVgroup; + STableInfo *pTable; } SQueuedMsg; int32_t mgmtInitSystem(); diff --git a/src/mnode/CMakeLists.txt b/src/mnode/CMakeLists.txt index 3d8e712edd913d8fd197d1d569862d91d83c32a0..b830695f520129b919b21b2780b6b6eefc4d9a5b 100644 --- a/src/mnode/CMakeLists.txt +++ b/src/mnode/CMakeLists.txt @@ -14,6 +14,4 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM)) ADD_LIBRARY(mnode ${SRC}) TARGET_LINK_LIBRARIES(mnode trpc tutil pthread) -ENDIF () - - +ENDIF () \ No newline at end of file diff --git a/src/mnode/inc/mgmtAcct.h b/src/mnode/inc/mgmtAcct.h index 967aeb1b3fbce1a35c77ab89f4434ccba7564ed1..1f8dc5c74ae11a3df081411829e46c1ecc34c82d 100644 --- a/src/mnode/inc/mgmtAcct.h +++ b/src/mnode/inc/mgmtAcct.h @@ -30,12 +30,14 @@ typedef enum { int32_t acctInit(); void acctCleanUp(); SAcctObj *acctGetAcct(char *acctName); +void acctIncRef(SAcctObj *pAcct); +void acctDecRef(SAcctObj *pAcct); int32_t acctCheck(SAcctObj *pAcct, EAcctGrantType type); -int32_t acctAddDb(SAcctObj *pAcct, SDbObj *pDb); -int32_t acctRemoveDb(SAcctObj *pAcct, SDbObj *pDb); -int32_t acctAddUser(SAcctObj *pAcct, SUserObj *pUser); -int32_t acctRemoveUser(SAcctObj *pAcct, SUserObj *pUser); +void acctAddDb(SAcctObj *pAcct, SDbObj *pDb); +void acctRemoveDb(SAcctObj *pAcct, SDbObj *pDb); +void acctAddUser(SAcctObj *pAcct, SUserObj *pUser); +void acctRemoveUser(SAcctObj *pAcct, SUserObj *pUser); #ifdef __cplusplus } diff --git a/src/mnode/inc/mgmtChildTable.h b/src/mnode/inc/mgmtChildTable.h deleted file mode 100644 index 3f6b1d8b858a8e9bcbee8f59a65ab07b87c99965..0000000000000000000000000000000000000000 --- a/src/mnode/inc/mgmtChildTable.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 TBASE_MNODE_CHILD_TABLE_H -#define TBASE_MNODE_CHILD_TABLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include "taosdef.h" -#include "mnode.h" - -int32_t mgmtInitChildTables(); -void mgmtCleanUpChildTables(); -void * mgmtGetChildTable(char *tableId); - -void mgmtCreateChildTable(SQueuedMsg *pMsg); -void mgmtDropChildTable(SQueuedMsg *pMsg, SChildTableObj *pTable); -void mgmtGetChildTableMeta(SQueuedMsg *pMsg, SChildTableObj *pTable); -void mgmtAlterChildTable(SQueuedMsg *pMsg, SChildTableObj *pTable); -void mgmtDropAllChildTables(SDbObj *pDropDb); -void mgmtDropAllChildTablesInStable(SSuperTableObj *pStable); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/mnode/inc/mgmtDb.h b/src/mnode/inc/mgmtDb.h index decf25a5c183c9ff56176dbb63558fff3350be38..fb6b8f8b6fd8f7a8ae039b696cfc55d79788a388 100644 --- a/src/mnode/inc/mgmtDb.h +++ b/src/mnode/inc/mgmtDb.h @@ -27,6 +27,8 @@ int32_t mgmtInitDbs(); void mgmtCleanUpDbs(); SDbObj *mgmtGetDb(char *db); SDbObj *mgmtGetDbByTableId(char *db); +void mgmtIncDbRef(SDbObj *pDb); +void mgmtDecDbRef(SDbObj *pDb); bool mgmtCheckIsMonitorDB(char *db, char *monitordb); void mgmtDropAllDbs(SAcctObj *pAcct); diff --git a/src/mnode/inc/mgmtProfile.h b/src/mnode/inc/mgmtProfile.h index a40f572f8bc333aafcb8490a36c5e5c290fa5409..b05877f32cea02d8b0e7084903bd835a7b958659 100644 --- a/src/mnode/inc/mgmtProfile.h +++ b/src/mnode/inc/mgmtProfile.h @@ -28,6 +28,8 @@ bool mgmtCheckQhandle(uint64_t qhandle); void mgmtSaveQhandle(void *qhandle); void mgmtFreeQhandle(void *qhandle); +void * mgmtMallocQueuedMsg(SRpcMsg *rpcMsg); +void * mgmtCloneQueuedMsg(SQueuedMsg *pSrcMsg); void mgmtFreeQueuedMsg(SQueuedMsg *pMsg); #ifdef __cplusplus diff --git a/src/mnode/inc/mgmtSdb.h b/src/mnode/inc/mgmtSdb.h index a598a21173f7c3f9d37752f163925a3b27f60c8f..ecf6887b42d105875add725def872ea1cdebb6fc 100644 --- a/src/mnode/inc/mgmtSdb.h +++ b/src/mnode/inc/mgmtSdb.h @@ -44,6 +44,7 @@ typedef struct { char *tableName; int32_t hashSessions; int32_t maxRowSize; + int32_t refCountPos; ESdbKeyType keyType; int32_t (*insertFp)(SSdbOperDesc *pOper); int32_t (*deleteFp)(SSdbOperDesc *pOper); @@ -62,6 +63,8 @@ int32_t sdbUpdateRow(SSdbOperDesc *pOper); void *sdbGetRow(void *handle, void *key); void *sdbFetchRow(void *handle, void *pNode, void **ppRow); +void sdbIncRef(void *thandle, void *pRow); +void sdbDecRef(void *thandle, void *pRow); int64_t sdbGetNumOfRows(void *handle); int64_t sdbGetId(void *handle); uint64_t sdbGetVersion(); diff --git a/src/mnode/inc/mgmtSuperTable.h b/src/mnode/inc/mgmtSuperTable.h deleted file mode 100644 index 73809148dec89f0e5c97a59164baa6490d0c4689..0000000000000000000000000000000000000000 --- a/src/mnode/inc/mgmtSuperTable.h +++ /dev/null @@ -1,43 +0,0 @@ -/* - * 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 TBASE_MNODE_SUPER_TABLE_H -#define TBASE_MNODE_SUPER_TABLE_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include -#include -#include "taosdef.h" -#include "mnode.h" - -int32_t mgmtInitSuperTables(); -void mgmtCleanUpSuperTables(); -void * mgmtGetSuperTable(char *tableId); - -void mgmtCreateSuperTable(SQueuedMsg *pMsg); -void mgmtDropSuperTable(SQueuedMsg *pMsg, SSuperTableObj *pTable); -void mgmtGetSuperTableMeta(SQueuedMsg *pMsg, SSuperTableObj *pTable); -void mgmtAlterSuperTable(SQueuedMsg *pMsg, SSuperTableObj *pTable); -void mgmtDropAllSuperTables(SDbObj *pDropDb); -int32_t mgmtSetSchemaFromSuperTable(SSchema *pSchema, SSuperTableObj *pTable); - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/src/mnode/inc/mgmtTable.h b/src/mnode/inc/mgmtTable.h index 66557b33621bc1b3d950491009e02cf2799e042a..ddbbfb4a70200ab560cb33db1a9a2d897c152993 100644 --- a/src/mnode/inc/mgmtTable.h +++ b/src/mnode/inc/mgmtTable.h @@ -28,7 +28,10 @@ extern "C" { int32_t mgmtInitTables(); void mgmtCleanUpTables(); STableInfo* mgmtGetTable(char* tableId); -void mgmtExtractTableName(char* tableId, char* tableName); +void mgmtIncTableRef(void *pTable); +void mgmtDecTableRef(void *pTable); +void mgmtDropAllChildTables(SDbObj *pDropDb); +void mgmtDropAllSuperTables(SDbObj *pDropDb); #ifdef __cplusplus } diff --git a/src/mnode/inc/mgmtUser.h b/src/mnode/inc/mgmtUser.h index ff3bfa3be6f5b1e21302a71f48f29b9177a1231d..f5c9b96f03b078ff1c55ef70fc7211aa8a27af31 100644 --- a/src/mnode/inc/mgmtUser.h +++ b/src/mnode/inc/mgmtUser.h @@ -24,6 +24,8 @@ extern "C" { int32_t mgmtInitUsers(); void mgmtCleanUpUsers(); SUserObj *mgmtGetUser(char *name); +void mgmtIncUserRef(SUserObj *pUser); +void mgmtDecUserRef(SUserObj *pUser); SUserObj *mgmtGetUserFromConn(void *pConn, bool *usePublicIp); int32_t mgmtCreateUser(SAcctObj *pAcct, char *name, char *pass); void mgmtDropAllUsers(SAcctObj *pAcct); diff --git a/src/mnode/inc/mgmtVgroup.h b/src/mnode/inc/mgmtVgroup.h index de0648da44bfec3d007fdcdf565c34dd46022650..d0b1e0de971a0adea6f2aec65bb0eeb6da337438 100644 --- a/src/mnode/inc/mgmtVgroup.h +++ b/src/mnode/inc/mgmtVgroup.h @@ -27,9 +27,11 @@ extern "C" { int32_t mgmtInitVgroups(); void mgmtCleanUpVgroups(); SVgObj *mgmtGetVgroup(int32_t vgId); +void mgmtIncVgroupRef(SVgObj *pVgroup); +void mgmtDecVgroupRef(SVgObj *pVgroup); void mgmtDropAllVgroups(SDbObj *pDropDb); -void mgmtCreateVgroup(SQueuedMsg *pMsg); +void mgmtCreateVgroup(SQueuedMsg *pMsg, SDbObj *pDb); void mgmtDropVgroup(SVgObj *pVgroup, void *ahandle); void mgmtAlterVgroup(SVgObj *pVgroup, void *ahandle); SVgObj *mgmtGetAvailableVgroup(SDbObj *pDb); diff --git a/src/mnode/src/mgmtAcct.c b/src/mnode/src/mgmtAcct.c index d3d2ec697d070ca68ab33d7c73210e263bfc72a3..22690c4a44ebdf6bd17755f75bf3b2d405c3fa01 100644 --- a/src/mnode/src/mgmtAcct.c +++ b/src/mnode/src/mgmtAcct.c @@ -18,6 +18,8 @@ #include "taoserror.h" #include "mnode.h" #include "mgmtAcct.h" +#include "mgmtDb.h" +#include "mgmtUser.h" #ifndef _ACCOUNT static SAcctObj tsAcctObj = {0}; @@ -30,79 +32,31 @@ int32_t acctInit() { void acctCleanUp() {} SAcctObj *acctGetAcct(char *acctName) { return &tsAcctObj; } +void acctIncRef(SAcctObj *pAcct) {} +void acctDecRef(SAcctObj *pAcct) {} int32_t acctCheck(SAcctObj *pAcct, EAcctGrantType type) { return TSDB_CODE_SUCCESS; } #endif -int32_t acctAddDb(SAcctObj *pAcct, SDbObj *pDb) { - pthread_mutex_lock(&pAcct->mutex); - pDb->next = pAcct->pHead; - pDb->prev = NULL; +void acctAddDb(SAcctObj *pAcct, SDbObj *pDb) { + atomic_add_fetch_32(&pAcct->acctInfo.numOfDbs, 1); pDb->pAcct = pAcct; - - if (pAcct->pHead) { - pAcct->pHead->prev = pDb; - } - - pAcct->pHead = pDb; - pAcct->acctInfo.numOfDbs++; - pthread_mutex_unlock(&pAcct->mutex); - - return 0; + acctIncRef(pAcct); } -int32_t acctRemoveDb(SAcctObj *pAcct, SDbObj *pDb) { - pthread_mutex_lock(&pAcct->mutex); - if (pDb->prev) { - pDb->prev->next = pDb->next; - } - - if (pDb->next) { - pDb->next->prev = pDb->prev; - } - - if (pDb->prev == NULL) { - pAcct->pHead = pDb->next; - } - - pAcct->acctInfo.numOfDbs--; - pthread_mutex_unlock(&pAcct->mutex); - - return 0; +void acctRemoveDb(SAcctObj *pAcct, SDbObj *pDb) { + atomic_sub_fetch_32(&pAcct->acctInfo.numOfDbs, 1); + pDb->pAcct = NULL; + acctIncRef(pAcct); } -int32_t acctAddUser(SAcctObj *pAcct, SUserObj *pUser) { - pthread_mutex_lock(&pAcct->mutex); - pUser->next = pAcct->pUser; - pUser->prev = NULL; - - if (pAcct->pUser) { - pAcct->pUser->prev = pUser; - } - - pAcct->pUser = pUser; - pAcct->acctInfo.numOfUsers++; +void acctAddUser(SAcctObj *pAcct, SUserObj *pUser) { + atomic_add_fetch_32(&pAcct->acctInfo.numOfUsers, 1); pUser->pAcct = pAcct; - pthread_mutex_unlock(&pAcct->mutex); - - return 0; + acctIncRef(pAcct); } -int32_t acctRemoveUser(SAcctObj *pAcct, SUserObj *pUser) { - pthread_mutex_lock(&pAcct->mutex); - if (pUser->prev) { - pUser->prev->next = pUser->next; - } - - if (pUser->next) { - pUser->next->prev = pUser->prev; - } - - if (pUser->prev == NULL) { - pAcct->pUser = pUser->next; - } - - pAcct->acctInfo.numOfUsers--; - pthread_mutex_unlock(&pAcct->mutex); - - return 0; +void acctRemoveUser(SAcctObj *pAcct, SUserObj *pUser) { + atomic_sub_fetch_32(&pAcct->acctInfo.numOfUsers, 1); + pUser->pAcct = NULL; + acctIncRef(pAcct); } \ No newline at end of file diff --git a/src/mnode/src/mgmtChildTable.c b/src/mnode/src/mgmtChildTable.c deleted file mode 100644 index 48abae3e9df6f5a061c5816607bb729f764b44e7..0000000000000000000000000000000000000000 --- a/src/mnode/src/mgmtChildTable.c +++ /dev/null @@ -1,1226 +0,0 @@ -/* - * 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 "taosmsg.h" -#include "tscompression.h" -#include "tskiplist.h" -#include "ttime.h" -#include "tstatus.h" -#include "tutil.h" -#include "qast.h" -#include "qextbuffer.h" -#include "taoserror.h" -#include "taosmsg.h" -#include "tscompression.h" -#include "tskiplist.h" -#include "tsqlfunction.h" -#include "tstatus.h" -#include "ttime.h" -#include "name.h" -#include "mnode.h" -#include "mgmtAcct.h" -#include "mgmtChildTable.h" -#include "mgmtDb.h" -#include "mgmtDClient.h" -#include "mgmtDnode.h" -#include "mgmtDServer.h" -#include "mgmtGrant.h" -#include "mgmtMnode.h" -#include "mgmtProfile.h" -#include "mgmtSdb.h" -#include "mgmtShell.h" -#include "mgmtSuperTable.h" -#include "mgmtTable.h" -#include "mgmtVgroup.h" -#include "mgmtUser.h" - -void *tsChildTableSdb; -static int32_t tsChildTableUpdateSize; -static void mgmtProcessMultiTableMetaMsg(SQueuedMsg *queueMsg); -static void mgmtProcessCreateTableRsp(SRpcMsg *rpcMsg); -static void mgmtProcessAlterTableRsp(SRpcMsg *rpcMsg); -static void mgmtProcessDropTableRsp(SRpcMsg *rpcMsg); -static void mgmtProcessTableCfgMsg(SRpcMsg *rpcMsg); -static int32_t mgmtGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); -static int32_t mgmtRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows, void *pConn); - -static void mgmtDestroyChildTable(SChildTableObj *pTable) { - tfree(pTable->schema); - tfree(pTable->sql); - tfree(pTable); -} - -static int32_t mgmtChildTableActionDestroy(SSdbOperDesc *pOper) { - mgmtDestroyChildTable(pOper->pObj); - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtChildTableActionInsert(SSdbOperDesc *pOper) { - SChildTableObj *pTable = pOper->pObj; - - SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); - if (pVgroup == NULL) { - mError("ctable:%s, not in vgroup:%d", pTable->info.tableId, pTable->vgId); - return TSDB_CODE_INVALID_VGROUP_ID; - } - - SDbObj *pDb = mgmtGetDb(pVgroup->dbName); - if (pDb == NULL) { - mError("ctable:%s, vgroup:%d not in db:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName); - return TSDB_CODE_INVALID_DB; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("ctable:%s, account:%s not exists", pTable->info.tableId, pDb->cfg.acct); - return TSDB_CODE_INVALID_ACCT; - } - - if (pTable->info.type == TSDB_CHILD_TABLE) { - pTable->superTable = mgmtGetSuperTable(pTable->superTableId); - pTable->superTable->numOfTables++; - grantAdd(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1); - pAcct->acctInfo.numOfTimeSeries += (pTable->superTable->numOfColumns - 1); - } else { - grantAdd(TSDB_GRANT_TIMESERIES, pTable->numOfColumns - 1); - pAcct->acctInfo.numOfTimeSeries += (pTable->numOfColumns - 1); - } - mgmtAddTableIntoDb(pDb); - mgmtAddTableIntoVgroup(pVgroup, pTable); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtChildTableActionDelete(SSdbOperDesc *pOper) { - SChildTableObj *pTable = pOper->pObj; - if (pTable->vgId == 0) { - return TSDB_CODE_INVALID_VGROUP_ID; - } - - SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); - if (pVgroup == NULL) { - return TSDB_CODE_INVALID_VGROUP_ID; - } - - SDbObj *pDb = mgmtGetDb(pVgroup->dbName); - if (pDb == NULL) { - mError("ctable:%s, vgroup:%d not in DB:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName); - return TSDB_CODE_INVALID_DB; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("ctable:%s, account:%s not exists", pTable->info.tableId, pDb->cfg.acct); - return TSDB_CODE_INVALID_ACCT; - } - - if (pTable->info.type == TSDB_CHILD_TABLE) { - grantRestore(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1); - pAcct->acctInfo.numOfTimeSeries -= (pTable->superTable->numOfColumns - 1); - pTable->superTable->numOfTables--; - } else { - grantRestore(TSDB_GRANT_TIMESERIES, pTable->numOfColumns - 1); - pAcct->acctInfo.numOfTimeSeries -= (pTable->numOfColumns - 1); - } - mgmtRemoveTableFromDb(pDb); - mgmtRemoveTableFromVgroup(pVgroup, pTable); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtChildTableActionUpdate(SSdbOperDesc *pOper) { - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtChildTableActionEncode(SSdbOperDesc *pOper) { - SChildTableObj *pTable = pOper->pObj; - assert(pTable != NULL && pOper->rowData != NULL); - - if (pTable->info.type == TSDB_CHILD_TABLE) { - memcpy(pOper->rowData, pTable, tsChildTableUpdateSize); - pOper->rowSize = tsChildTableUpdateSize; - } else { - int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema); - if (pOper->maxRowSize < tsChildTableUpdateSize + schemaSize) { - return TSDB_CODE_INVALID_MSG_LEN; - } - memcpy(pOper->rowData, pTable, tsChildTableUpdateSize); - memcpy(pOper->rowData + tsChildTableUpdateSize, pTable->schema, schemaSize); - memcpy(pOper->rowData + tsChildTableUpdateSize + schemaSize, pTable->sql, pTable->sqlLen); - pOper->rowSize = tsChildTableUpdateSize + schemaSize + pTable->sqlLen; - } - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtChildTableActionDecode(SSdbOperDesc *pOper) { - assert(pOper->rowData != NULL); - SChildTableObj *pTable = calloc(1, sizeof(SChildTableObj)); - if (pTable == NULL) { - return TSDB_CODE_SERV_OUT_OF_MEMORY; - } - - memcpy(pTable, pOper->rowData, tsChildTableUpdateSize); - - if (pTable->info.type != TSDB_CHILD_TABLE) { - int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema); - pTable->schema = (SSchema *)malloc(schemaSize); - if (pTable->schema == NULL) { - mgmtDestroyChildTable(pTable); - return TSDB_CODE_SERV_OUT_OF_MEMORY; - } - memcpy(pTable->schema, pOper->rowData + tsChildTableUpdateSize, schemaSize); - - pTable->sql = (char *)malloc(pTable->sqlLen); - if (pTable->sql == NULL) { - mgmtDestroyChildTable(pTable); - return TSDB_CODE_SERV_OUT_OF_MEMORY; - } - memcpy(pTable->sql, pOper->rowData + tsChildTableUpdateSize + schemaSize, pTable->sqlLen); - } - - pOper->pObj = pTable; - return TSDB_CODE_SUCCESS; -} - -int32_t mgmtInitChildTables() { - void *pNode = NULL; - void *pLastNode = NULL; - SChildTableObj *pTable = NULL; - - SChildTableObj tObj; - tsChildTableUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; - - SSdbTableDesc tableDesc = { - .tableName = "ctables", - .hashSessions = tsMaxTables, - .maxRowSize = sizeof(SChildTableObj) + sizeof(SSchema) * TSDB_MAX_COLUMNS, - .keyType = SDB_KEY_TYPE_STRING, - .insertFp = mgmtChildTableActionInsert, - .deleteFp = mgmtChildTableActionDelete, - .updateFp = mgmtChildTableActionUpdate, - .encodeFp = mgmtChildTableActionEncode, - .decodeFp = mgmtChildTableActionDecode, - .destroyFp = mgmtChildTableActionDestroy, - }; - - tsChildTableSdb = sdbOpenTable(&tableDesc); - if (tsChildTableSdb == NULL) { - mError("failed to init child table data"); - return -1; - } - - pNode = NULL; - while (1) { - pLastNode = pNode; - pNode = sdbFetchRow(tsChildTableSdb, pNode, (void **)&pTable); - if (pTable == NULL) { - break; - } - - SDbObj *pDb = mgmtGetDbByTableId(pTable->info.tableId); - if (pDb == NULL) { - mError("ctable:%s, failed to get db, discard it", pTable->info.tableId); - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_LOCAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - sdbDeleteRow(&desc); - pNode = pLastNode; - continue; - } - - SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); - if (pVgroup == NULL) { - mError("ctable:%s, failed to get vgroup:%d sid:%d, discard it", pTable->info.tableId, pTable->vgId, pTable->sid); - pTable->vgId = 0; - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_LOCAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - sdbDeleteRow(&desc); - pNode = pLastNode; - continue; - } - - if (strcmp(pVgroup->dbName, pDb->name) != 0) { - mError("ctable:%s, db:%s not match with vgroup:%d db:%s sid:%d, discard it", - pTable->info.tableId, pDb->name, pTable->vgId, pVgroup->dbName, pTable->sid); - pTable->vgId = 0; - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_LOCAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - sdbDeleteRow(&desc); - pNode = pLastNode; - continue; - } - - if (pVgroup->tableList == NULL) { - mError("ctable:%s, vgroup:%d tableList is null", pTable->info.tableId, pTable->vgId); - pTable->vgId = 0; - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_LOCAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - sdbDeleteRow(&desc); - pNode = pLastNode; - continue; - } - - if (pTable->info.type == TSDB_CHILD_TABLE) { - SSuperTableObj *pSuperTable = mgmtGetSuperTable(pTable->superTableId); - if (pSuperTable == NULL) { - mError("ctable:%s, stable:%s not exist", pTable->info.tableId, pTable->superTableId); - pTable->vgId = 0; - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_LOCAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - sdbDeleteRow(&desc); - pNode = pLastNode; - continue; - } - } - } - - mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_TABLES_META, mgmtProcessMultiTableMetaMsg); - mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_TABLE, mgmtGetShowTableMeta); - mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_TABLE, mgmtRetrieveShowTables); - mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_CREATE_TABLE_RSP, mgmtProcessCreateTableRsp); - mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_DROP_TABLE_RSP, mgmtProcessDropTableRsp); - mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_ALTER_TABLE_RSP, mgmtProcessAlterTableRsp); - mgmtAddDServerMsgHandle(TSDB_MSG_TYPE_DM_CONFIG_TABLE, mgmtProcessTableCfgMsg); - - mTrace("child table is initialized"); - return 0; -} - -void mgmtCleanUpChildTables() { - sdbCloseTable(tsChildTableSdb); -} - -static void *mgmtBuildCreateChildTableMsg(SCMCreateTableMsg *pMsg, SChildTableObj *pTable) { - char * pTagData = NULL; - int32_t tagDataLen = 0; - int32_t totalCols = 0; - int32_t contLen = 0; - if (pTable->info.type == TSDB_CHILD_TABLE && pMsg != NULL) { - pTagData = pMsg->schema + TSDB_TABLE_ID_LEN + 1; - tagDataLen = htonl(pMsg->contLen) - sizeof(SCMCreateTableMsg) - TSDB_TABLE_ID_LEN - 1; - totalCols = pTable->superTable->numOfColumns + pTable->superTable->numOfTags; - contLen = sizeof(SMDCreateTableMsg) + totalCols * sizeof(SSchema) + tagDataLen + pTable->sqlLen; - } else { - totalCols = pTable->numOfColumns; - contLen = sizeof(SMDCreateTableMsg) + totalCols * sizeof(SSchema) + pTable->sqlLen; - } - - SMDCreateTableMsg *pCreate = rpcMallocCont(contLen); - if (pCreate == NULL) { - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; - return NULL; - } - - memcpy(pCreate->tableId, pTable->info.tableId, TSDB_TABLE_ID_LEN + 1); - pCreate->contLen = htonl(contLen); - pCreate->vgId = htonl(pTable->vgId); - pCreate->tableType = pTable->info.type; - pCreate->createdTime = htobe64(pTable->createdTime); - pCreate->sid = htonl(pTable->sid); - pCreate->sqlDataLen = htonl(pTable->sqlLen); - pCreate->uid = htobe64(pTable->uid); - - if (pTable->info.type == TSDB_CHILD_TABLE) { - memcpy(pCreate->superTableId, pTable->superTable->info.tableId, TSDB_TABLE_ID_LEN + 1); - pCreate->numOfColumns = htons(pTable->superTable->numOfColumns); - pCreate->numOfTags = htons(pTable->superTable->numOfTags); - pCreate->sversion = htonl(pTable->superTable->sversion); - pCreate->tagDataLen = htonl(tagDataLen); - pCreate->superTableUid = htobe64(pTable->superTable->uid); - } else { - pCreate->numOfColumns = htons(pTable->numOfColumns); - pCreate->numOfTags = 0; - pCreate->sversion = htonl(pTable->sversion); - pCreate->tagDataLen = 0; - pCreate->superTableUid = 0; - } - - SSchema *pSchema = (SSchema *) pCreate->data; - if (pTable->info.type == TSDB_CHILD_TABLE) { - memcpy(pSchema, pTable->superTable->schema, totalCols * sizeof(SSchema)); - } else { - memcpy(pSchema, pTable->schema, totalCols * sizeof(SSchema)); - } - for (int32_t col = 0; col < totalCols; ++col) { - pSchema->bytes = htons(pSchema->bytes); - pSchema->colId = htons(pSchema->colId); - pSchema++; - } - - if (pTable->info.type == TSDB_CHILD_TABLE && pMsg != NULL) { - memcpy(pCreate->data + totalCols * sizeof(SSchema), pTagData, tagDataLen); - memcpy(pCreate->data + totalCols * sizeof(SSchema) + tagDataLen, pTable->sql, pTable->sqlLen); - } - - return pCreate; -} - -static SChildTableObj* mgmtDoCreateChildTable(SCMCreateTableMsg *pCreate, SVgObj *pVgroup, int32_t tid) { - SChildTableObj *pTable = (SChildTableObj *) calloc(1, sizeof(SChildTableObj)); - if (pTable == NULL) { - mError("ctable:%s, failed to alloc memory", pCreate->tableId); - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; - return NULL; - } - - if (pCreate->numOfColumns == 0) { - pTable->info.type = TSDB_CHILD_TABLE; - } else { - pTable->info.type = TSDB_NORMAL_TABLE; - } - - strcpy(pTable->info.tableId, pCreate->tableId); - pTable->createdTime = taosGetTimestampMs(); - pTable->sid = tid; - pTable->vgId = pVgroup->vgId; - - if (pTable->info.type == TSDB_CHILD_TABLE) { - char *pTagData = (char *) pCreate->schema; // it is a tag key - SSuperTableObj *pSuperTable = mgmtGetSuperTable(pTagData); - if (pSuperTable == NULL) { - mError("ctable:%s, corresponding super table does not exist", pCreate->tableId); - free(pTable); - terrno = TSDB_CODE_INVALID_TABLE; - return NULL; - } - - strcpy(pTable->superTableId, pSuperTable->info.tableId); - pTable->uid = (((uint64_t) pTable->vgId) << 40) + ((((uint64_t) pTable->sid) & ((1ul << 24) - 1ul)) << 16) + - (sdbGetVersion() & ((1ul << 16) - 1ul)); - pTable->superTable = pSuperTable; - } else { - pTable->uid = (((uint64_t) pTable->createdTime) << 16) + (sdbGetVersion() & ((1ul << 16) - 1ul)); - pTable->sversion = 0; - pTable->numOfColumns = htons(pCreate->numOfColumns); - pTable->sqlLen = htons(pCreate->sqlLen); - - int32_t numOfCols = pTable->numOfColumns; - int32_t schemaSize = numOfCols * sizeof(SSchema); - pTable->schema = (SSchema *) calloc(1, schemaSize); - if (pTable->schema == NULL) { - free(pTable); - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; - return NULL; - } - memcpy(pTable->schema, pCreate->schema, numOfCols * sizeof(SSchema)); - - pTable->nextColId = 0; - for (int32_t col = 0; col < numOfCols; col++) { - SSchema *tschema = pTable->schema; - tschema[col].colId = pTable->nextColId++; - tschema[col].bytes = htons(tschema[col].bytes); - } - - if (pTable->sqlLen != 0) { - pTable->info.type = TSDB_STREAM_TABLE; - pTable->sql = calloc(1, pTable->sqlLen); - if (pTable->sql == NULL) { - free(pTable); - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; - return NULL; - } - memcpy(pTable->sql, (char *) (pCreate->schema) + numOfCols * sizeof(SSchema), pTable->sqlLen); - pTable->sql[pTable->sqlLen - 1] = 0; - mTrace("table:%s, stream sql len:%d sql:%s", pTable->info.tableId, pTable->sqlLen, pTable->sql); - } - } - - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_GLOBAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - - if (sdbInsertRow(&desc) != TSDB_CODE_SUCCESS) { - free(pTable); - mError("ctable:%s, update sdb error", pCreate->tableId); - terrno = TSDB_CODE_SDB_ERROR; - return NULL; - } - - mTrace("ctable:%s, create ctable in vgroup, uid:%" PRIu64 , pTable->info.tableId, pTable->uid); - return pTable; -} - -void mgmtCreateChildTable(SQueuedMsg *pMsg) { - SCMCreateTableMsg *pCreate = pMsg->pCont; - - int32_t code = grantCheck(TSDB_GRANT_TIMESERIES); - if (code != TSDB_CODE_SUCCESS) { - mError("table:%s, failed to create, grant not", pCreate->tableId); - mgmtSendSimpleResp(pMsg->thandle, code); - return; - } - - SQueuedMsg *newMsg = malloc(sizeof(SQueuedMsg)); - memcpy(newMsg, pMsg, sizeof(SQueuedMsg)); - pMsg->pCont = NULL; - - SVgObj *pVgroup = mgmtGetAvailableVgroup(pMsg->pDb); - if (pVgroup == NULL) { - mTrace("table:%s, start to create a new vgroup", pCreate->tableId); - mgmtCreateVgroup(newMsg); - return; - } - - int32_t sid = taosAllocateId(pVgroup->idPool); - if (sid < 0) { - mTrace("tables:%s, no enough sid in vgroup:%d", pVgroup->vgId); - mgmtCreateVgroup(newMsg); - return; - } - - SChildTableObj *pTable = mgmtDoCreateChildTable(pCreate, pVgroup, sid); - if (pTable == NULL) { - mgmtSendSimpleResp(pMsg->thandle, terrno); - mgmtFreeQueuedMsg(newMsg); - return; - } - - SMDCreateTableMsg *pMDCreate = mgmtBuildCreateChildTableMsg(pCreate, (SChildTableObj *) pTable); - if (pMDCreate == NULL) { - mgmtSendSimpleResp(pMsg->thandle, terrno); - mgmtFreeQueuedMsg(newMsg); - return; - } - - SRpcIpSet ipSet = mgmtGetIpSetFromVgroup(pVgroup); - SRpcMsg rpcMsg = { - .handle = newMsg, - .pCont = pMDCreate, - .contLen = htonl(pMDCreate->contLen), - .code = 0, - .msgType = TSDB_MSG_TYPE_MD_CREATE_TABLE - }; - - newMsg->ahandle = pTable; - mgmtSendMsgToDnode(&ipSet, &rpcMsg); -} - -void mgmtDropChildTable(SQueuedMsg *pMsg, SChildTableObj *pTable) { - SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); - if (pVgroup == NULL) { - mError("ctable:%s, failed to drop child table, vgroup not exist", pTable->info.tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_OTHERS); - return; - } - - SMDDropTableMsg *pDrop = rpcMallocCont(sizeof(SMDDropTableMsg)); - if (pDrop == NULL) { - mError("ctable:%s, failed to drop child table, no enough memory", pTable->info.tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); - return; - } - - strcpy(pDrop->tableId, pTable->info.tableId); - pDrop->vgId = htonl(pTable->vgId); - pDrop->contLen = htonl(sizeof(SMDDropTableMsg)); - pDrop->sid = htonl(pTable->sid); - pDrop->uid = htobe64(pTable->uid); - - SRpcIpSet ipSet = mgmtGetIpSetFromVgroup(pVgroup); - - mTrace("ctable:%s, send drop table msg", pDrop->tableId); - SRpcMsg rpcMsg = { - .handle = pMsg, - .pCont = pDrop, - .contLen = sizeof(SMDDropTableMsg), - .code = 0, - .msgType = TSDB_MSG_TYPE_MD_DROP_TABLE - }; - - pMsg->ahandle = pTable; - mgmtSendMsgToDnode(&ipSet, &rpcMsg); -} - -void* mgmtGetChildTable(char *tableId) { - return sdbGetRow(tsChildTableSdb, tableId); -} - -int32_t mgmtModifyChildTableTagValueByName(SChildTableObj *pTable, char *tagName, char *nContent) { -// TODO: send message to dnode -// int32_t col = mgmtFindSuperTableTagIndex(pTable->superTable, tagName); -// if (col < 0 || col > pTable->superTable->numOfTags) { -// return TSDB_CODE_APP_ERROR; -// } -// -// //TODO send msg to dnode -// mTrace("Succeed to modify tag column %d of table %s", col, pTable->info.tableId); -// return TSDB_CODE_SUCCESS; - -// int32_t rowSize = 0; -// SSchema *schema = (SSchema *)(pSuperTable->schema + (pSuperTable->numOfColumns + col) * sizeof(SSchema)); -// -// if (col == 0) { -// pTable->isDirty = 1; -// removeMeterFromMetricIndex(pSuperTable, pTable); -// } -// memcpy(pTable->pTagData + mgmtGetTagsLength(pMetric, col) + TSDB_TABLE_ID_LEN, nContent, schema->bytes); -// if (col == 0) { -// addMeterIntoMetricIndex(pMetric, pTable); -// } -// -// // Encode the string -// int32_t size = sizeof(STabObj) + TSDB_MAX_BYTES_PER_ROW + 1; -// char *msg = (char *)malloc(size); -// if (msg == NULL) { -// mError("failed to allocate message memory while modify tag value"); -// return TSDB_CODE_APP_ERROR; -// } -// memset(msg, 0, size); -// -// mgmtMeterActionEncode(pTable, msg, size, &rowSize); -// -// int32_t ret = sdbUpdateRow(tsChildTableSdb, msg, rowSize, 1); // Need callback function -// tfree(msg); -// -// if (pTable->isDirty) pTable->isDirty = 0; -// -// if (ret < 0) { -// mError("Failed to modify tag column %d of table %s", col, pTable->info.tableId); -// return TSDB_CODE_APP_ERROR; -// } -// -// mTrace("Succeed to modify tag column %d of table %s", col, pTable->info.tableId); -// return TSDB_CODE_SUCCESS; - return 0; -} - - -static int32_t mgmtFindNormalTableColumnIndex(SChildTableObj *pTable, char *colName) { - SSchema *schema = (SSchema *) pTable->schema; - for (int32_t i = 0; i < pTable->numOfColumns; i++) { - if (strcasecmp(schema[i].name, colName) == 0) { - return i; - } - } - - return -1; -} - -static int32_t mgmtAddNormalTableColumn(SChildTableObj *pTable, SSchema schema[], int32_t ncols) { - if (ncols <= 0) { - return TSDB_CODE_APP_ERROR; - } - - for (int32_t i = 0; i < ncols; i++) { - if (mgmtFindNormalTableColumnIndex(pTable, schema[i].name) > 0) { - return TSDB_CODE_APP_ERROR; - } - } - - SDbObj *pDb = mgmtGetDbByTableId(pTable->info.tableId); - if (pDb == NULL) { - mError("table: %s not belongs to any database", pTable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("DB: %s not belongs to andy account", pDb->name); - return TSDB_CODE_APP_ERROR; - } - - int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema); - pTable->schema = realloc(pTable->schema, schemaSize + sizeof(SSchema) * ncols); - - memcpy(pTable->schema + schemaSize, schema, sizeof(SSchema) * ncols); - - SSchema *tschema = (SSchema *) (pTable->schema + sizeof(SSchema) * pTable->numOfColumns); - for (int32_t i = 0; i < ncols; i++) { - tschema[i].colId = pTable->nextColId++; - } - - pTable->numOfColumns += ncols; - pTable->sversion++; - pAcct->acctInfo.numOfTimeSeries += ncols; - - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_GLOBAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - desc.rowData = pTable; - desc.rowSize = tsChildTableUpdateSize; - sdbUpdateRow(&desc); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtDropNormalTableColumnByName(SChildTableObj *pTable, char *colName) { - int32_t col = mgmtFindNormalTableColumnIndex(pTable, colName); - if (col < 0) { - return TSDB_CODE_APP_ERROR; - } - - SDbObj *pDb = mgmtGetDbByTableId(pTable->info.tableId); - if (pDb == NULL) { - mError("table: %s not belongs to any database", pTable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("DB: %s not belongs to any account", pDb->name); - return TSDB_CODE_APP_ERROR; - } - - memmove(pTable->schema + sizeof(SSchema) * col, pTable->schema + sizeof(SSchema) * (col + 1), - sizeof(SSchema) * (pTable->numOfColumns - col - 1)); - - pTable->numOfColumns--; - pTable->sversion++; - - pAcct->acctInfo.numOfTimeSeries--; - - SSdbOperDesc desc = {0}; - desc.type = SDB_OPER_TYPE_GLOBAL; - desc.pObj = pTable; - desc.table = tsChildTableSdb; - desc.rowData = pTable; - desc.rowSize = tsChildTableUpdateSize; - sdbUpdateRow(&desc); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtSetSchemaFromNormalTable(SSchema *pSchema, SChildTableObj *pTable) { - int32_t numOfCols = pTable->numOfColumns; - for (int32_t i = 0; i < numOfCols; ++i) { - strcpy(pSchema->name, pTable->schema[i].name); - pSchema->type = pTable->schema[i].type; - pSchema->bytes = htons(pTable->schema[i].bytes); - pSchema->colId = htons(pTable->schema[i].colId); - pSchema++; - } - - return numOfCols * sizeof(SSchema); -} - -static int32_t mgmtDoGetChildTableMeta(SDbObj *pDb, SChildTableObj *pTable, STableMetaMsg *pMeta, bool usePublicIp) { - pMeta->uid = htobe64(pTable->uid); - pMeta->sid = htonl(pTable->sid); - pMeta->vgId = htonl(pTable->vgId); - pMeta->precision = pDb->cfg.precision; - pMeta->tableType = pTable->info.type; - strncpy(pMeta->tableId, pTable->info.tableId, tListLen(pTable->info.tableId)); - - if (pTable->info.type == TSDB_CHILD_TABLE) { - pMeta->sversion = htons(pTable->superTable->sversion); - pMeta->numOfTags = 0; - pMeta->numOfColumns = htons((int16_t)pTable->superTable->numOfColumns); - pMeta->contLen = sizeof(STableMetaMsg) + mgmtSetSchemaFromSuperTable(pMeta->schema, pTable->superTable); - strncpy(pMeta->stableId, pTable->superTable->info.tableId, tListLen(pMeta->stableId)); - } else { - pMeta->sversion = htons(pTable->sversion); - pMeta->numOfTags = 0; - pMeta->numOfColumns = htons((int16_t)pTable->numOfColumns); - pMeta->contLen = sizeof(STableMetaMsg) + mgmtSetSchemaFromNormalTable(pMeta->schema, pTable); - } - - SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); - if (pVgroup == NULL) { - mError("table:%s, failed to get table meta, db not selected", pTable->info.tableId); - return TSDB_CODE_INVALID_VGROUP_ID; - } - - for (int32_t i = 0; i < TSDB_VNODES_SUPPORT; ++i) { - if (usePublicIp) { - pMeta->vpeerDesc[i].ip = pVgroup->vnodeGid[i].publicIp; - } else { - pMeta->vpeerDesc[i].ip = pVgroup->vnodeGid[i].privateIp; - } - pMeta->vpeerDesc[i].vnode = htonl(pVgroup->vnodeGid[i].vnode); - } - pMeta->numOfVpeers = pVgroup->numOfVnodes; - - mTrace("table:%s, uid:%" PRIu64 " table meta is retrieved", pTable->info.tableId, pTable->uid); - - return TSDB_CODE_SUCCESS; -} - -void mgmtGetChildTableMeta(SQueuedMsg *pMsg, SChildTableObj *pTable) { - SCMTableInfoMsg *pInfo = pMsg->pCont; - SDbObj *pDb = mgmtGetDbByTableId(pInfo->tableId); - if (pDb == NULL || pDb->dirty) { - mError("table:%s, failed to get table meta, db not selected", pInfo->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_DB_NOT_SELECTED); - return; - } - - if (pTable == NULL) { - if (htons(pInfo->createFlag) != 1) { - mError("table:%s, failed to get table meta, table not exist", pInfo->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); - return; - } else { - //TODO: on demand create table from super table if table does not exists - int32_t contLen = sizeof(SCMCreateTableMsg) + sizeof(STagData); - SCMCreateTableMsg *pCreateMsg = rpcMallocCont(contLen); - if (pCreateMsg == NULL) { - mError("table:%s, failed to create table while get meta info, no enough memory", pInfo->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); - return; - } - memcpy(pCreateMsg->schema, pInfo->tags, sizeof(STagData)); - strcpy(pCreateMsg->tableId, pInfo->tableId); - - SQueuedMsg *newMsg = malloc(sizeof(SQueuedMsg)); - memcpy(newMsg, pMsg, sizeof(SQueuedMsg)); - pMsg->pCont = NULL; - - newMsg->ahandle = newMsg->pCont; - newMsg->pCont = pCreateMsg; - mTrace("table:%s, start to create in demand", pInfo->tableId); - mgmtAddToShellQueue(newMsg); - return; - } - } - - STableMetaMsg *pMeta = rpcMallocCont(sizeof(STableMetaMsg) + sizeof(SSchema) * TSDB_MAX_COLUMNS); - if (pMeta == NULL) { - mError("table:%s, failed to get table meta, no enough memory", pTable->info.tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); - return; - } - - mgmtDoGetChildTableMeta(pDb, pTable, pMeta, pMsg->usePublicIp); - - SRpcMsg rpcRsp = { - .handle = pMsg->thandle, - .pCont = pMeta, - .contLen = pMeta->contLen, - }; - pMeta->contLen = htons(pMeta->contLen); - rpcSendResponse(&rpcRsp); -} - -void mgmtDropAllChildTables(SDbObj *pDropDb) { - void *pNode = NULL; - void *pLastNode = NULL; - int32_t numOfTables = 0; - int32_t dbNameLen = strlen(pDropDb->name); - SChildTableObj *pTable = NULL; - - while (1) { - pNode = sdbFetchRow(tsChildTableSdb, pNode, (void **)&pTable); - if (pTable == NULL) { - break; - } - - if (strncmp(pDropDb->name, pTable->info.tableId, dbNameLen) == 0) { - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_LOCAL, - .table = tsChildTableSdb, - .pObj = pTable, - }; - sdbDeleteRow(&oper); - pNode = pLastNode; - numOfTables++; - continue; - } - } - - mTrace("db:%s, all child tables:%d is dropped from sdb", pDropDb->name, numOfTables); -} - -void mgmtDropAllChildTablesInStable(SSuperTableObj *pStable) { - void *pNode = NULL; - void *pLastNode = NULL; - int32_t numOfTables = 0; - SChildTableObj *pTable = NULL; - - while (1) { - pNode = sdbFetchRow(tsChildTableSdb, pNode, (void **)&pTable); - if (pTable == NULL) { - break; - } - - if (pTable->superTable == pStable) { - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_LOCAL, - .table = tsChildTableSdb, - .pObj = pTable, - }; - sdbDeleteRow(&oper); - pNode = pLastNode; - numOfTables++; - continue; - } - } - - mTrace("stable:%s, all child tables:%d is dropped from sdb", pStable->info.tableId, numOfTables); -} - -static STableInfo* mgmtGetTableByPos(uint32_t dnodeId, int32_t vnode, int32_t sid) { - SDnodeObj *pObj = mgmtGetDnode(dnodeId); - SVgObj *pVgroup = mgmtGetVgroup(vnode); - - if (pObj == NULL || pVgroup == NULL) { - return NULL; - } - - return (STableInfo *)pVgroup->tableList[sid]; -} - -static void mgmtProcessTableCfgMsg(SRpcMsg *rpcMsg) { - if (mgmtCheckRedirect(rpcMsg->handle)) return; - - SDMConfigTableMsg *pCfg = (SDMConfigTableMsg *) rpcMsg->pCont; - pCfg->dnode = htonl(pCfg->dnode); - pCfg->vnode = htonl(pCfg->vnode); - pCfg->sid = htonl(pCfg->sid); - mTrace("dnode:%s, vnode:%d, sid:%d, receive table config msg", taosIpStr(pCfg->dnode), pCfg->vnode, pCfg->sid); - - STableInfo *pTable = mgmtGetTableByPos(pCfg->dnode, pCfg->vnode, pCfg->sid); - if (pTable == NULL) { - mError("dnode:%s, vnode:%d, sid:%d, table not found", taosIpStr(pCfg->dnode), pCfg->vnode, pCfg->sid); - mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_NOT_ACTIVE_TABLE); - return; - } - - mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_SUCCESS); - - SMDCreateTableMsg *pMDCreate = NULL; - pMDCreate = mgmtBuildCreateChildTableMsg(NULL, (SChildTableObj *) pTable); - if (pMDCreate == NULL) { - return; - } - - SRpcIpSet ipSet = mgmtGetIpSetFromIp(pCfg->dnode); - SRpcMsg rpcRsp = { - .handle = NULL, - .pCont = pMDCreate, - .contLen = htonl(pMDCreate->contLen), - .code = 0, - .msgType = TSDB_MSG_TYPE_MD_CREATE_TABLE - }; - mgmtSendMsgToDnode(&ipSet, &rpcRsp); -} - -static void mgmtProcessDropTableRsp(SRpcMsg *rpcMsg) { - if (rpcMsg->handle == NULL) return; - - SQueuedMsg *queueMsg = rpcMsg->handle; - queueMsg->received++; - - SChildTableObj *pTable = queueMsg->ahandle; - mTrace("table:%s, drop table rsp received, thandle:%p result:%s", pTable->info.tableId, queueMsg->thandle, tstrerror(rpcMsg->code)); - - if (rpcMsg->code != TSDB_CODE_SUCCESS) { - mError("table:%s, failed to drop in dnode, reason:%s", pTable->info.tableId, tstrerror(rpcMsg->code)); - mgmtSendSimpleResp(queueMsg->thandle, rpcMsg->code); - free(queueMsg); - return; - } - - SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); - if (pVgroup == NULL) { - mError("table:%s, failed to get vgroup", pTable->info.tableId); - mgmtSendSimpleResp(queueMsg->thandle, TSDB_CODE_INVALID_VGROUP_ID); - free(queueMsg); - return; - } - - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_GLOBAL, - .table = tsChildTableSdb, - .pObj = pTable - }; - int32_t code = sdbDeleteRow(&oper); - if (code != TSDB_CODE_SUCCESS) { - mError("table:%s, update ctables sdb error", pTable->info.tableId); - mgmtSendSimpleResp(queueMsg->thandle, TSDB_CODE_SDB_ERROR); - free(queueMsg); - return; - } - - if (pVgroup->numOfTables <= 0) { - mPrint("vgroup:%d, all tables is dropped, drop vgroup", pVgroup->vgId); - mgmtDropVgroup(pVgroup, NULL); - } - - mgmtSendSimpleResp(queueMsg->thandle, TSDB_CODE_SUCCESS); - free(queueMsg); -} - -static void mgmtProcessCreateTableRsp(SRpcMsg *rpcMsg) { - if (rpcMsg->handle == NULL) return; - - SQueuedMsg *queueMsg = rpcMsg->handle; - queueMsg->received++; - - SChildTableObj *pTable = queueMsg->ahandle; - mTrace("table:%s, create table rsp received, thandle:%p ahandle:%p result:%s", pTable->info.tableId, queueMsg->thandle, - rpcMsg->handle, tstrerror(rpcMsg->code)); - - if (rpcMsg->code != TSDB_CODE_SUCCESS) { - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_GLOBAL, - .table = tsChildTableSdb, - .pObj = pTable - }; - sdbDeleteRow(&oper); - - mError("table:%s, failed to create in dnode, reason:%s", pTable->info.tableId, tstrerror(rpcMsg->code)); - mgmtSendSimpleResp(queueMsg->thandle, rpcMsg->code); - } else { - mTrace("table:%s, created in dnode", pTable->info.tableId); - if (queueMsg->msgType != TSDB_MSG_TYPE_CM_CREATE_TABLE) { - SQueuedMsg *newMsg = calloc(1, sizeof(SQueuedMsg)); - newMsg->msgType = queueMsg->msgType; - newMsg->thandle = queueMsg->thandle; - newMsg->pDb = queueMsg->pDb; - newMsg->pUser = queueMsg->pUser; - newMsg->contLen = queueMsg->contLen; - newMsg->pCont = rpcMallocCont(newMsg->contLen); - memcpy(newMsg->pCont, queueMsg->pCont, newMsg->contLen); - mTrace("table:%s, start to get meta", pTable->info.tableId); - mgmtAddToShellQueue(newMsg); - } else { - mgmtSendSimpleResp(queueMsg->thandle, rpcMsg->code); - } - } - - free(queueMsg); -} - -static void mgmtProcessAlterTableRsp(SRpcMsg *rpcMsg) { - mTrace("alter table rsp received, handle:%p code:%d", rpcMsg->handle, rpcMsg->code); -} - -static void mgmtProcessMultiTableMetaMsg(SQueuedMsg *pMsg) { - SRpcConnInfo connInfo; - if (rpcGetConnInfo(pMsg->thandle, &connInfo) != 0) { - mError("conn:%p is already released while get mulit table meta", pMsg->thandle); - return; - } - - bool usePublicIp = (connInfo.serverIp == tsPublicIpInt); - SUserObj *pUser = mgmtGetUser(connInfo.user); - if (pUser == NULL) { - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_USER); - return; - } - - SCMMultiTableInfoMsg *pInfo = pMsg->pCont; - pInfo->numOfTables = htonl(pInfo->numOfTables); - - int32_t totalMallocLen = 4*1024*1024; // first malloc 4 MB, subsequent reallocation as twice - SMultiTableMeta *pMultiMeta = rpcMallocCont(totalMallocLen); - if (pMultiMeta == NULL) { - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); - return; - } - - pMultiMeta->contLen = sizeof(SMultiTableMeta); - pMultiMeta->numOfTables = 0; - - for (int t = 0; t < pInfo->numOfTables; ++t) { - char *tableId = (char*)(pInfo->tableIds + t * TSDB_TABLE_ID_LEN); - SChildTableObj *pTable = mgmtGetChildTable(tableId); - if (pTable == NULL) continue; - - SDbObj *pDb = mgmtGetDbByTableId(tableId); - if (pDb == NULL) continue; - - int availLen = totalMallocLen - pMultiMeta->contLen; - if (availLen <= sizeof(STableMetaMsg) + sizeof(SSchema) * TSDB_MAX_COLUMNS) { - //TODO realloc - //totalMallocLen *= 2; - //pMultiMeta = rpcReMalloc(pMultiMeta, totalMallocLen); - //if (pMultiMeta == NULL) { - /// rpcSendResponse(ahandle, TSDB_CODE_SERV_OUT_OF_MEMORY, NULL, 0); - // return TSDB_CODE_SERV_OUT_OF_MEMORY; - //} else { - // t--; - // continue; - //} - } - - STableMetaMsg *pMeta = (STableMetaMsg *)(pMultiMeta->metas + pMultiMeta->contLen); - int32_t code = mgmtDoGetChildTableMeta(pDb, pTable, pMeta, usePublicIp); - if (code == TSDB_CODE_SUCCESS) { - pMultiMeta->numOfTables ++; - pMultiMeta->contLen += pMeta->contLen; - } - } - - SRpcMsg rpcRsp = {0}; - rpcRsp.handle = pMsg->thandle; - rpcRsp.pCont = pMultiMeta; - rpcRsp.contLen = pMultiMeta->contLen; - rpcSendResponse(&rpcRsp); -} - -static int32_t mgmtGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { - SDbObj *pDb = mgmtGetDb(pShow->db); - if (pDb == NULL) { - return TSDB_CODE_DB_NOT_SELECTED; - } - - int32_t cols = 0; - SSchema *pSchema = pMeta->schema; - - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN; - pSchema[cols].type = TSDB_DATA_TYPE_BINARY; - strcpy(pSchema[cols].name, "table name"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = 8; - pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; - strcpy(pSchema[cols].name, "create time"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = 2; - pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; - strcpy(pSchema[cols].name, "columns"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN; - pSchema[cols].type = TSDB_DATA_TYPE_BINARY; - strcpy(pSchema[cols].name, "stable name"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pMeta->numOfColumns = htons(cols); - 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 = pDb->numOfTables; - pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; - - return 0; -} - -static void mgmtVacuumResult(char *data, int32_t numOfCols, int32_t rows, int32_t capacity, SShowObj *pShow) { - if (rows < capacity) { - for (int32_t i = 0; i < numOfCols; ++i) { - memmove(data + pShow->offset[i] * rows, data + pShow->offset[i] * capacity, pShow->bytes[i] * rows); - } - } -} - -static int32_t mgmtRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows, void *pConn) { - SDbObj *pDb = mgmtGetDb(pShow->db); - if (pDb == NULL) return 0; - - SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); - if (pUser == NULL) return 0; - - if (mgmtCheckIsMonitorDB(pDb->name, tsMonitorDbName)) { - if (strcmp(pUser->user, "root") != 0 && strcmp(pUser->user, "_root") != 0 && - strcmp(pUser->user, "monitor") != 0) { - return 0; - } - } - - int32_t numOfRows = 0; - SChildTableObj *pTable = NULL; - SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; - - char prefix[64] = {0}; - strcpy(prefix, pDb->name); - strcat(prefix, TS_PATH_DELIMITER); - int32_t prefixLen = strlen(prefix); - - while (numOfRows < rows) { - pShow->pNode = sdbFetchRow(tsChildTableSdb, pShow->pNode, (void **) &pTable); - if (pTable == NULL) break; - - // not belong to current db - if (strncmp(pTable->info.tableId, prefix, prefixLen)) { - continue; - } - - char tableName[TSDB_TABLE_NAME_LEN] = {0}; - memset(tableName, 0, tListLen(tableName)); - - // pattern compare for meter name - mgmtExtractTableName(pTable->info.tableId, tableName); - - if (pShow->payloadLen > 0 && - patternMatch(pShow->payload, tableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) { - continue; - } - - int32_t cols = 0; - - char *pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strncpy(pWrite, tableName, TSDB_TABLE_NAME_LEN); - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int64_t *) pWrite = pTable->createdTime; - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - if (pTable->info.type == TSDB_CHILD_TABLE) { - *(int16_t *)pWrite = pTable->superTable->numOfColumns; - } else { - *(int16_t *)pWrite = pTable->numOfColumns; - } - - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - if (pTable->info.type == TSDB_CHILD_TABLE) { - mgmtExtractTableName(pTable->superTableId, pWrite); - } - cols++; - - numOfRows++; - } - - pShow->numOfReads += numOfRows; - const int32_t NUM_OF_COLUMNS = 4; - - mgmtVacuumResult(data, NUM_OF_COLUMNS, numOfRows, rows, pShow); - - return numOfRows; -} - -void mgmtAlterChildTable(SQueuedMsg *pMsg, SChildTableObj *pTable) { - int32_t code = TSDB_CODE_OPS_NOT_SUPPORT; - SCMAlterTableMsg *pAlter = pMsg->pCont;; - - if (pAlter->type == TSDB_ALTER_TABLE_UPDATE_TAG_VAL) { - code = mgmtModifyChildTableTagValueByName(pTable, pAlter->schema[0].name, pAlter->tagVal); - } else if (pAlter->type == TSDB_ALTER_TABLE_ADD_COLUMN) { - code = mgmtAddNormalTableColumn(pTable, pAlter->schema, 1); - } else if (pAlter->type == TSDB_ALTER_TABLE_DROP_COLUMN) { - code = mgmtDropNormalTableColumnByName(pTable, pAlter->schema[0].name); - } else { - } - - mgmtSendSimpleResp(pMsg->thandle, code); -} \ No newline at end of file diff --git a/src/mnode/src/mgmtDb.c b/src/mnode/src/mgmtDb.c index 5f28c30423780be1c12b6478757248ad7fd7bcae..4678247e69e18d38c5aa43694fa4ff2e17046e3d 100644 --- a/src/mnode/src/mgmtDb.c +++ b/src/mnode/src/mgmtDb.c @@ -22,24 +22,22 @@ #include "mnode.h" #include "mgmtAcct.h" #include "mgmtBalance.h" -#include "mgmtChildTable.h" #include "mgmtDb.h" #include "mgmtDnode.h" #include "mgmtGrant.h" #include "mgmtShell.h" #include "mgmtMnode.h" -#include "mgmtChildTable.h" +#include "mgmtProfile.h" #include "mgmtSdb.h" -#include "mgmtSuperTable.h" #include "mgmtTable.h" #include "mgmtUser.h" #include "mgmtVgroup.h" -void * tsDbSdb = NULL; +static void * tsDbSdb = NULL; static int32_t tsDbUpdateSize; static int32_t mgmtCreateDb(SAcctObj *pAcct, SCMCreateDbMsg *pCreate); -static void mgmtDropDb(void *handle, void *tmrId); +static void mgmtDropDb(SQueuedMsg *newMsg); static int32_t mgmtSetDbDirty(SDbObj *pDb); static int32_t mgmtGetDbMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); static int32_t mgmtRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void *pConn); @@ -58,8 +56,6 @@ static int32_t mgmtDbActionInsert(SSdbOperDesc *pOper) { pDb->pHead = NULL; pDb->pTail = NULL; - pDb->prev = NULL; - pDb->next = NULL; pDb->numOfVgroups = 0; pDb->numOfTables = 0; pDb->numOfSuperTables = 0; @@ -120,6 +116,7 @@ int32_t mgmtInitDbs() { .tableName = "dbs", .hashSessions = TSDB_MAX_DBS, .maxRowSize = tsDbUpdateSize, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, .keyType = SDB_KEY_TYPE_STRING, .insertFp = mgmtDbActionInsert, .deleteFp = mgmtDbActionDelete, @@ -149,6 +146,14 @@ SDbObj *mgmtGetDb(char *db) { return (SDbObj *)sdbGetRow(tsDbSdb, db); } +void mgmtIncDbRef(SDbObj *pDb) { + return sdbIncRef(tsDbSdb, pDb); +} + +void mgmtDecDbRef(SDbObj *pDb) { + return sdbDecRef(tsDbSdb, pDb); +} + SDbObj *mgmtGetDbByTableId(char *tableId) { char db[TSDB_TABLE_ID_LEN], *pos; @@ -282,8 +287,9 @@ static int32_t mgmtCreateDb(SAcctObj *pAcct, SCMCreateDbMsg *pCreate) { return code; } - SDbObj *pDb = (SDbObj *)sdbGetRow(tsDbSdb, pCreate->db); + SDbObj *pDb = mgmtGetDb(pCreate->db); if (pDb != NULL) { + mgmtDecDbRef(pDb); return TSDB_CODE_DB_ALREADY_EXIST; } @@ -511,16 +517,14 @@ static int32_t mgmtGetDbMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) } pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; - pShow->numOfRows = pUser->pAcct->acctInfo.numOfDbs; - pShow->pNode = pUser->pAcct->pHead; + mgmtDecUserRef(pUser); return 0; } static char *mgmtGetDbStr(char *src) { char *pos = strstr(src, TS_PATH_DELIMITER); - return ++pos; } @@ -533,14 +537,8 @@ static int32_t mgmtRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void * if (pUser == NULL) return 0; while (numOfRows < rows) { - pDb = (SDbObj *)pShow->pNode; + pShow->pNode = sdbFetchRow(tsDbSdb, pShow->pNode, (void **) &pDb); if (pDb == NULL) break; - pShow->pNode = (void *)pDb->next; - if (mgmtCheckIsMonitorDB(pDb->name, tsMonitorDbName)) { - if (strcmp(pUser->user, "root") != 0 && strcmp(pUser->user, "_root") != 0 && strcmp(pUser->user, "monitor") != 0 ) { - continue; - } - } cols = 0; @@ -637,25 +635,32 @@ static int32_t mgmtRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void * cols++; numOfRows++; + mgmtDecDbRef(pDb); } pShow->numOfReads += numOfRows; + mgmtDecUserRef(pUser); return numOfRows; } void mgmtAddSuperTableIntoDb(SDbObj *pDb) { atomic_add_fetch_32(&pDb->numOfSuperTables, 1); + mgmtIncDbRef(pDb); } void mgmtRemoveSuperTableFromDb(SDbObj *pDb) { atomic_add_fetch_32(&pDb->numOfSuperTables, -1); + mgmtDecDbRef(pDb); } + void mgmtAddTableIntoDb(SDbObj *pDb) { atomic_add_fetch_32(&pDb->numOfTables, 1); + mgmtIncDbRef(pDb); } void mgmtRemoveTableFromDb(SDbObj *pDb) { atomic_add_fetch_32(&pDb->numOfTables, -1); + mgmtDecDbRef(pDb); } static int32_t mgmtSetDbDirty(SDbObj *pDb) { @@ -766,8 +771,6 @@ static int32_t mgmtAlterDb(SDbObj *pDb, SCMAlterDbMsg *pAlter) { } static void mgmtProcessAlterDbMsg(SQueuedMsg *pMsg) { - if (mgmtCheckRedirect(pMsg->thandle)) return; - SCMAlterDbMsg *pAlter = pMsg->pCont; mTrace("db:%s, alter db msg is received from thandle:%p", pAlter->db, pMsg->thandle); @@ -777,13 +780,7 @@ static void mgmtProcessAlterDbMsg(SQueuedMsg *pMsg) { return; } - if (!pMsg->pUser->writeAuth) { - mError("db:%s, failed to alter, no rights", pAlter->db); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); - return; - } - - SDbObj *pDb = mgmtGetDb(pAlter->db); + SDbObj *pDb = pMsg->pDb = mgmtGetDb(pAlter->db); if (pDb == NULL) { mError("db:%s, failed to alter, invalid db", pAlter->db); mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_DB); @@ -794,15 +791,13 @@ static void mgmtProcessAlterDbMsg(SQueuedMsg *pMsg) { if (code != TSDB_CODE_SUCCESS) { mError("db:%s, failed to alter, invalid db option", pAlter->db); mgmtSendSimpleResp(pMsg->thandle, code); + return; } - SQueuedMsg *newMsg = malloc(sizeof(SQueuedMsg)); - memcpy(newMsg, pMsg, sizeof(SQueuedMsg)); - pMsg->pCont = NULL; - SVgObj *pVgroup = pDb->pHead; if (pVgroup != NULL) { mPrint("vgroup:%d, will be altered", pVgroup->vgId); + SQueuedMsg *newMsg = mgmtCloneQueuedMsg(pMsg); newMsg->ahandle = pVgroup; newMsg->expected = pVgroup->numOfVnodes; mgmtAlterVgroup(pVgroup, newMsg); @@ -810,15 +805,11 @@ static void mgmtProcessAlterDbMsg(SQueuedMsg *pMsg) { } mTrace("db:%s, all vgroups is altered", pDb->name); - - mgmtSendSimpleResp(newMsg->thandle, TSDB_CODE_SUCCESS); - rpcFreeCont(newMsg->pCont); - free(newMsg); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SUCCESS); } -static void mgmtDropDb(void *handle, void *tmrId) { - SQueuedMsg *newMsg = handle; - SDbObj *pDb = newMsg->ahandle; +static void mgmtDropDb(SQueuedMsg *pMsg) { + SDbObj *pDb = pMsg->pDb; mPrint("db:%s, drop db from sdb", pDb->name); SSdbOperDesc oper = { @@ -831,14 +822,10 @@ static void mgmtDropDb(void *handle, void *tmrId) { code = TSDB_CODE_SDB_ERROR; } - mgmtSendSimpleResp(newMsg->thandle, code); - rpcFreeCont(newMsg->pCont); - free(newMsg); + mgmtSendSimpleResp(pMsg->thandle, code); } static void mgmtProcessDropDbMsg(SQueuedMsg *pMsg) { - if (mgmtCheckRedirect(pMsg->thandle)) return; - SCMDropDbMsg *pDrop = pMsg->pCont; mTrace("db:%s, drop db msg is received from thandle:%p", pDrop->db, pMsg->thandle); @@ -848,13 +835,7 @@ static void mgmtProcessDropDbMsg(SQueuedMsg *pMsg) { return; } - if (!pMsg->pUser->writeAuth) { - mError("db:%s, failed to drop, no rights", pDrop->db); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); - return; - } - - SDbObj *pDb = mgmtGetDb(pDrop->db); + SDbObj *pDb = pMsg->pDb = mgmtGetDb(pDrop->db); if (pDb == NULL) { if (pDrop->ignoreNotExists) { mTrace("db:%s, db is not exist, think drop success", pDrop->db); @@ -880,13 +861,10 @@ static void mgmtProcessDropDbMsg(SQueuedMsg *pMsg) { return; } - SQueuedMsg *newMsg = malloc(sizeof(SQueuedMsg)); - memcpy(newMsg, pMsg, sizeof(SQueuedMsg)); - pMsg->pCont = NULL; - SVgObj *pVgroup = pDb->pHead; if (pVgroup != NULL) { mPrint("vgroup:%d, will be dropped", pVgroup->vgId); + SQueuedMsg *newMsg = mgmtCloneQueuedMsg(pMsg); newMsg->ahandle = pVgroup; newMsg->expected = pVgroup->numOfVnodes; mgmtDropVgroup(pVgroup, newMsg); @@ -894,10 +872,7 @@ static void mgmtProcessDropDbMsg(SQueuedMsg *pMsg) { } mTrace("db:%s, all vgroups is dropped", pDb->name); - - void *tmpTmr; - newMsg->ahandle = pDb; - taosTmrReset(mgmtDropDb, 10, newMsg, tsMgmtTmr, &tmpTmr); + mgmtDropDb(pMsg); } void mgmtDropAllDbs(SAcctObj *pAcct) { @@ -913,6 +888,7 @@ void mgmtDropAllDbs(SAcctObj *pAcct) { mgmtSetDbDirty(pDb); numOfDbs++; } + mgmtDecDbRef(pDb); } mTrace("acct:%s, all dbs is is set dirty", pAcct->user, numOfDbs); diff --git a/src/mnode/src/mgmtDnode.c b/src/mnode/src/mgmtDnode.c index 9930a3a1148be51b16c54f04e33940d1c96d0c02..d5203200eeeeedf9566d480d176cf3d02554cc21 100644 --- a/src/mnode/src/mgmtDnode.c +++ b/src/mnode/src/mgmtDnode.c @@ -232,6 +232,7 @@ void mgmtProcessDnodeStatusMsg(SRpcMsg *rpcMsg) { mPrint("dnode:%d, vgroup:%d not exist in mnode, drop it", pDnode->dnodeId, pDnode->vload[j].vgId); mgmtSendDropVnodeMsg(pDnode->vload[j].vgId, &ipSet, NULL); } + mgmtDecVgroupRef(pVgroup); } if (pDnode->status != TSDB_DN_STATUS_READY) { diff --git a/src/mnode/src/mgmtProfile.c b/src/mnode/src/mgmtProfile.c index 44bd45faea5fd8d9414e559c2e3bb9c65cdbb8d3..4a8b4b1ea19be0fa1a384caee214b9e440eb6974 100644 --- a/src/mnode/src/mgmtProfile.c +++ b/src/mnode/src/mgmtProfile.c @@ -16,10 +16,13 @@ #define _DEFAULT_SOURCE #include "os.h" #include "taosmsg.h" +#include "mgmtDb.h" #include "mgmtMnode.h" #include "mgmtProfile.h" #include "mgmtShell.h" +#include "mgmtTable.h" #include "mgmtUser.h" +#include "mgmtVgroup.h" int32_t mgmtSaveQueryStreamList(SCMHeartBeatMsg *pHBMsg); @@ -763,12 +766,49 @@ int32_t mgmtInitProfile() { void mgmtCleanUpProfile() { } +void *mgmtMallocQueuedMsg(SRpcMsg *rpcMsg) { + bool usePublicIp = false; + SUserObj *pUser = mgmtGetUserFromConn(rpcMsg->handle, &usePublicIp); + if (pUser == NULL) { + return NULL; + } + + SQueuedMsg *pMsg = calloc(1, sizeof(SQueuedMsg)); + pMsg->thandle = rpcMsg->handle; + pMsg->msgType = rpcMsg->msgType; + pMsg->contLen = rpcMsg->contLen; + pMsg->pCont = rpcMsg->pCont; + pMsg->pUser = pUser; + pMsg->usePublicIp = usePublicIp; + + return pMsg; +} + void mgmtFreeQueuedMsg(SQueuedMsg *pMsg) { if (pMsg != NULL) { - if (pMsg->pCont != NULL) { - rpcFreeCont(pMsg->pCont); - pMsg->pCont = NULL; - } + rpcFreeCont(pMsg->pCont); + if (pMsg->pUser) mgmtDecUserRef(pMsg->pUser); + if (pMsg->pDb) mgmtDecDbRef(pMsg->pDb); + if (pMsg->pVgroup) mgmtDecVgroupRef(pMsg->pVgroup); + if (pMsg->pTable) mgmtDecTableRef(pMsg->pTable); + // if (pMsg->pAcct) acctDecRef(pMsg->pAcct); + // if (pMsg->pDnode) mgmtDecTableRef(pMsg->pDnode); free(pMsg); } +} + +void* mgmtCloneQueuedMsg(SQueuedMsg *pSrcMsg) { + SQueuedMsg *pDestMsg = calloc(1, sizeof(SQueuedMsg)); + + pDestMsg->thandle = pSrcMsg->thandle; + pDestMsg->msgType = pSrcMsg->msgType; + pDestMsg->pCont = pSrcMsg->pCont; + pDestMsg->contLen = pSrcMsg->contLen; + pDestMsg->pUser = pSrcMsg->pUser; + pDestMsg->usePublicIp = pSrcMsg->usePublicIp; + + pSrcMsg->pCont = NULL; + pSrcMsg->pUser = NULL; + + return pDestMsg; } \ No newline at end of file diff --git a/src/mnode/src/mgmtSdb.c b/src/mnode/src/mgmtSdb.c index 0b1ac3be9706ea8c7342914a4fa87e06ca7cb94c..06cb9dca5cd68e56cd2dd8d16388b57792feb7f8 100644 --- a/src/mnode/src/mgmtSdb.c +++ b/src/mnode/src/mgmtSdb.c @@ -24,6 +24,7 @@ #include "tutil.h" #include "hashint.h" #include "hashstr.h" + #include "mgmtSdb.h" #define abs(x) (((x) < 0) ? -(x) : (x)) @@ -46,6 +47,7 @@ typedef struct _SSdbTable { int32_t tableId; int32_t hashSessions; int32_t maxRowSize; + int32_t refCountPos; int32_t autoIndex; int32_t fd; int64_t numOfRows; @@ -318,11 +320,6 @@ static int32_t sdbInitTableByFile(SSdbTable *pTable) { } } else { if (rowHead->version < 0) { - SSdbOperDesc oper = { - .table = pTable, - .pObj = pMetaRow - }; - (*pTable->destroyFp)(&oper); (*sdbDeleteIndexFp[pTable->keyType])(pTable->iHandle, rowHead->data); pTable->numOfRows--; sdbTrace("table:%s, version:%" PRId64 " numOfRows:%d, read deleted record:%s", @@ -338,8 +335,6 @@ static int32_t sdbInitTableByFile(SSdbTable *pTable) { .rowSize = rowHead->rowSize, .pObj = pMetaRow }; - - (*pTable->destroyFp)(&oper); (*sdbDeleteIndexFp[pTable->keyType])(pTable->iHandle, rowHead->data); int32_t code = (*pTable->decodeFp)(&oper); @@ -373,6 +368,7 @@ static int32_t sdbInitTableByFile(SSdbTable *pTable) { .version = pMeta->version, }; + sdbIncRef(pTable, oper.pObj); int32_t code = (*pTable->insertFp)(&oper); if (code != TSDB_CODE_SUCCESS) { sdbError("table:%s, failed to insert record:%s", pTable->tableName, sdbGetkeyStr(pTable, rowHead->data)); @@ -396,6 +392,7 @@ void *sdbOpenTable(SSdbTableDesc *pDesc) { pTable->keyType = pDesc->keyType; pTable->hashSessions = pDesc->hashSessions; pTable->maxRowSize = pDesc->maxRowSize; + pTable->refCountPos = pDesc->refCountPos; pTable->insertFp = pDesc->insertFp; pTable->deleteFp = pDesc->deleteFp; pTable->updateFp = pDesc->updateFp; @@ -433,6 +430,34 @@ static SRowMeta *sdbGetRowMeta(void *handle, void *key) { return pMeta; } +void sdbIncRef(void *handle, void *pRow) { + if (pRow) { + SSdbTable *pTable = handle; + int32_t *pRefCount = (int32_t *)(pRow + pTable->refCountPos); + atomic_add_fetch_32(pRefCount, 1); + if (0) { + sdbTrace("table:%s, add ref to record:%s:%s:%d", pTable->tableName, pTable->tableName, sdbGetkeyStr(pTable, pRow), *pRefCount); + } + } +} + +void sdbDecRef(void *handle, void *pRow) { + if (pRow) { + SSdbTable *pTable = handle; + int32_t *pRefCount = (int32_t *)(pRow + pTable->refCountPos); + int32_t refCount = atomic_sub_fetch_32(pRefCount, 1); + if (0) { + sdbTrace("table:%s, def ref of record:%s:%s:%d", pTable->tableName, pTable->tableName, sdbGetkeyStr(pTable, pRow), *pRefCount); + } + int8_t* updateEnd = pRow + pTable->refCountPos - 1; + if (refCount <= 0 && *updateEnd) { + sdbTrace("table:%s, record:%s:%s:%d is destroyed", pTable->tableName, pTable->tableName, sdbGetkeyStr(pTable, pRow), *pRefCount); + SSdbOperDesc oper = {.pObj = pRow}; + (*pTable->destroyFp)(&oper); + } + } +} + void *sdbGetRow(void *handle, void *key) { SSdbTable *pTable = (SSdbTable *)handle; SRowMeta * pMeta; @@ -441,6 +466,7 @@ void *sdbGetRow(void *handle, void *key) { pthread_mutex_lock(&pTable->mutex); pMeta = (*sdbGetIndexFp[pTable->keyType])(pTable->iHandle, key); + if (pMeta) sdbIncRef(pTable, pMeta->row); pthread_mutex_unlock(&pTable->mutex); if (pMeta == NULL) { @@ -459,6 +485,7 @@ int32_t sdbInsertRow(SSdbOperDesc *pOper) { if (sdbGetRow(pTable, pOper->pObj)) { sdbError("table:%s, failed to insert record:%s, already exist", pTable->tableName, sdbGetkeyStr(pTable, pOper->pObj)); + sdbDecRef(pTable, pOper->pObj); return TSDB_CODE_ALREADY_THERE; } @@ -526,6 +553,7 @@ int32_t sdbInsertRow(SSdbOperDesc *pOper) { rowMeta.rowSize = pOper->rowSize; rowMeta.row = pOper->pObj; (*sdbAddIndexFp[pTable->keyType])(pTable->iHandle, pOper->pObj, &rowMeta); + sdbIncRef(pTable, pOper->pObj); pTable->numOfRows++; @@ -626,8 +654,9 @@ int32_t sdbDeleteRow(SSdbOperDesc *pOper) { pthread_mutex_unlock(&pTable->mutex); (*pTable->deleteFp)(pOper); - (*pTable->destroyFp)(pOper); - + int8_t* updateEnd = pOper->pObj + pTable->refCountPos - 1; + *updateEnd = 1; + sdbDecRef(pTable, pOper->pObj); return 0; } @@ -762,6 +791,7 @@ void *sdbFetchRow(void *handle, void *pNode, void **ppRow) { if (pMeta == NULL) return NULL; *ppRow = pMeta->row; + sdbIncRef(handle, pMeta->row); return pNode; } diff --git a/src/mnode/src/mgmtShell.c b/src/mnode/src/mgmtShell.c index 696403b2fe905b6ff9e004239760cb9b2e642801..b84fe08546ca1be4c6c14acda0222212db3091e1 100644 --- a/src/mnode/src/mgmtShell.c +++ b/src/mnode/src/mgmtShell.c @@ -25,7 +25,6 @@ #include "mnode.h" #include "mgmtAcct.h" #include "mgmtBalance.h" -#include "mgmtChildTable.h" #include "mgmtDb.h" #include "mgmtDnode.h" #include "mgmtGrant.h" @@ -33,7 +32,6 @@ #include "mgmtProfile.h" #include "mgmtSdb.h" #include "mgmtShell.h" -#include "mgmtSuperTable.h" #include "mgmtTable.h" #include "mgmtUser.h" #include "mgmtVgroup.h" @@ -121,8 +119,7 @@ void mgmtAddShellShowRetrieveHandle(uint8_t msgType, SShowRetrieveFp fp) { void mgmtProcessTranRequest(SSchedMsg *sched) { SQueuedMsg *queuedMsg = sched->msg; (*tsMgmtProcessShellMsgFp[queuedMsg->msgType])(queuedMsg); - rpcFreeCont(queuedMsg->pCont); - free(queuedMsg); + mgmtFreeQueuedMsg(queuedMsg); } void mgmtAddToShellQueue(SQueuedMsg *queuedMsg) { @@ -137,6 +134,12 @@ static void mgmtProcessMsgFromShell(SRpcMsg *rpcMsg) { return; } + if (mgmtCheckRedirect(rpcMsg->handle)) { + // send resp in redirect func + rpcFreeCont(rpcMsg->pCont); + return; + } + if (!mgmtInServerStatus()) { mgmtProcessMsgWhileNotReady(rpcMsg); rpcFreeCont(rpcMsg->pCont); @@ -145,6 +148,7 @@ static void mgmtProcessMsgFromShell(SRpcMsg *rpcMsg) { if (grantCheck(TSDB_GRANT_TIME) != TSDB_CODE_SUCCESS) { mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_GRANT_EXPIRED); + rpcFreeCont(rpcMsg->pCont); return; } @@ -154,44 +158,28 @@ static void mgmtProcessMsgFromShell(SRpcMsg *rpcMsg) { return; } - bool usePublicIp = false; - SUserObj *pUser = mgmtGetUserFromConn(rpcMsg->handle, &usePublicIp); - if (pUser == NULL) { + SQueuedMsg *pMsg = mgmtMallocQueuedMsg(rpcMsg); + if (pMsg == NULL) { mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_INVALID_USER); rpcFreeCont(rpcMsg->pCont); return; } - + if (mgmtCheckMsgReadOnly(rpcMsg->msgType, rpcMsg->pCont)) { - SQueuedMsg queuedMsg = {0}; - queuedMsg.thandle = rpcMsg->handle; - queuedMsg.msgType = rpcMsg->msgType; - queuedMsg.contLen = rpcMsg->contLen; - queuedMsg.pCont = rpcMsg->pCont; - queuedMsg.pUser = pUser; - queuedMsg.usePublicIp = usePublicIp; - (*tsMgmtProcessShellMsgFp[rpcMsg->msgType])(&queuedMsg); - rpcFreeCont(rpcMsg->pCont); + (*tsMgmtProcessShellMsgFp[rpcMsg->msgType])(pMsg); + mgmtFreeQueuedMsg(pMsg); } else { - SQueuedMsg *queuedMsg = calloc(1, sizeof(SQueuedMsg)); - queuedMsg->thandle = rpcMsg->handle; - queuedMsg->msgType = rpcMsg->msgType; - queuedMsg->contLen = rpcMsg->contLen; - queuedMsg->pCont = rpcMsg->pCont; - queuedMsg->pUser = pUser; - queuedMsg->usePublicIp = usePublicIp; - mgmtAddToShellQueue(queuedMsg); + if (!pMsg->pUser->writeAuth) { + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); + mgmtFreeQueuedMsg(pMsg); + } else { + mgmtAddToShellQueue(pMsg); + } } } static void mgmtProcessShowMsg(SQueuedMsg *pMsg) { SCMShowMsg *pShowMsg = pMsg->pCont; - if (pShowMsg->type == TSDB_MGMT_TABLE_DNODE || TSDB_MGMT_TABLE_GRANTS || TSDB_MGMT_TABLE_SCORES) { - if (mgmtCheckRedirect(pMsg->thandle)) { - return; - } - } - if (pShowMsg->type >= TSDB_MGMT_TABLE_MAX) { mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_MSG_TYPE); return; @@ -358,9 +346,11 @@ static int mgmtShellRetriveAuth(char *user, char *spi, char *encrypt, char *secr SUserObj *pUser = mgmtGetUser(user); if (pUser == NULL) { *secret = 0; + mgmtDecUserRef(pUser); return TSDB_CODE_INVALID_USER; } else { memcpy(secret, pUser->pass, TSDB_KEY_LEN); + mgmtDecUserRef(pUser); return TSDB_CODE_SUCCESS; } } @@ -376,28 +366,19 @@ static void mgmtProcessConnectMsg(SQueuedMsg *pMsg) { } int32_t code; - SUserObj *pUser = mgmtGetUser(connInfo.user); - if (pUser == NULL) { - code = TSDB_CODE_INVALID_USER; - goto connect_over; - } - if (grantCheck(TSDB_GRANT_TIME) != TSDB_CODE_SUCCESS) { code = TSDB_CODE_GRANT_EXPIRED; goto connect_over; } - SAcctObj *pAcct = acctGetAcct(pUser->acct); - if (pAcct == NULL) { - code = TSDB_CODE_INVALID_ACCT; - goto connect_over; - } - code = taosCheckVersion(pConnectMsg->clientVersion, version, 3); if (code != TSDB_CODE_SUCCESS) { goto connect_over; } + SUserObj *pUser = pMsg->pUser; + SAcctObj *pAcct = pUser->pAcct; + if (pConnectMsg->db[0]) { char dbName[TSDB_TABLE_ID_LEN * 3] = {0}; sprintf(dbName, "%x%s%s", pAcct->acctId, TS_PATH_DELIMITER, pConnectMsg->db); @@ -419,7 +400,7 @@ static void mgmtProcessConnectMsg(SQueuedMsg *pMsg) { pConnectRsp->writeAuth = pUser->writeAuth; pConnectRsp->superAuth = pUser->superAuth; - if (connInfo.serverIp == tsPublicIpInt) { + if (pMsg->usePublicIp) { mgmtGetMnodePublicIpList(&pConnectRsp->ipList); } else { mgmtGetMnodePrivateIpList(&pConnectRsp->ipList); @@ -468,6 +449,7 @@ static bool mgmtCheckMeterMetaMsgType(void *pMsg) { mTrace("table:%s auto created task added", pInfo->tableId); } + mgmtDecTableRef(pTable); return addIntoTranQueue; } diff --git a/src/mnode/src/mgmtSuperTable.c b/src/mnode/src/mgmtSuperTable.c deleted file mode 100644 index a5e79fecf37ae9e8f7608d8016f901b0ab801241..0000000000000000000000000000000000000000 --- a/src/mnode/src/mgmtSuperTable.c +++ /dev/null @@ -1,672 +0,0 @@ -/* - * 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 "name.h" -#include "tsqlfunction.h" -#include "mgmtAcct.h" -#include "mgmtChildTable.h" -#include "mgmtDb.h" -#include "mgmtDClient.h" -#include "mgmtDnode.h" -#include "mgmtGrant.h" -#include "mgmtShell.h" -#include "mgmtSuperTable.h" -#include "mgmtSdb.h" -#include "mgmtTable.h" -#include "mgmtUser.h" -#include "mgmtVgroup.h" - -static void *tsSuperTableSdb; -static int32_t tsSuperTableUpdateSize; -static void mgmtProcessSuperTableVgroupMsg(SQueuedMsg *queueMsg); -static void mgmtProcessDropStableRsp(SRpcMsg *rpcMsg); -static int32_t mgmtRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, void *pConn); -static int32_t mgmtGetShowSuperTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); - -static void mgmtDestroySuperTable(SSuperTableObj *pStable) { - tfree(pStable->schema); - tfree(pStable); -} - -static int32_t mgmtSuperTableActionDestroy(SSdbOperDesc *pOper) { - mgmtDestroySuperTable(pOper->pObj); - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtSuperTableActionInsert(SSdbOperDesc *pOper) { - SSuperTableObj *pStable = pOper->pObj; - SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); - if (pDb != NULL) { - mgmtAddSuperTableIntoDb(pDb); - } - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtSuperTableActionDelete(SSdbOperDesc *pOper) { - SSuperTableObj *pStable = pOper->pObj; - SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); - if (pDb != NULL) { - mgmtRemoveSuperTableFromDb(pDb); - mgmtDropAllChildTablesInStable((SSuperTableObj *)pStable); - } - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtSuperTableActionUpdate(SSdbOperDesc *pOper) { - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtSuperTableActionEncode(SSdbOperDesc *pOper) { - SSuperTableObj *pStable = pOper->pObj; - assert(pOper->pObj != NULL && pOper->rowData != NULL); - - int32_t schemaSize = sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags); - - if (pOper->maxRowSize < tsSuperTableUpdateSize + schemaSize) { - return TSDB_CODE_INVALID_MSG_LEN; - } - - memcpy(pOper->rowData, pStable, tsSuperTableUpdateSize); - memcpy(pOper->rowData + tsSuperTableUpdateSize, pStable->schema, schemaSize); - pOper->rowSize = tsSuperTableUpdateSize + schemaSize; - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtSuperTableActionDecode(SSdbOperDesc *pOper) { - assert(pOper->rowData != NULL); - - SSuperTableObj *pStable = (SSuperTableObj *) calloc(1, sizeof(SSuperTableObj)); - if (pStable == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; - - memcpy(pStable, pOper->rowData, tsSuperTableUpdateSize); - - int32_t schemaSize = sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags); - pStable->schema = malloc(schemaSize); - if (pStable->schema == NULL) { - mgmtDestroySuperTable(pStable); - return -1; - } - - memcpy(pStable->schema, pOper->rowData + tsSuperTableUpdateSize, schemaSize); - pOper->pObj = pStable; - - return TSDB_CODE_SUCCESS; -} - -int32_t mgmtInitSuperTables() { - SSuperTableObj tObj; - tsSuperTableUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; - - SSdbTableDesc tableDesc = { - .tableName = "stables", - .hashSessions = TSDB_MAX_SUPER_TABLES, - .maxRowSize = tsSuperTableUpdateSize + sizeof(SSchema) * TSDB_MAX_COLUMNS, - .keyType = SDB_KEY_TYPE_STRING, - .insertFp = mgmtSuperTableActionInsert, - .deleteFp = mgmtSuperTableActionDelete, - .updateFp = mgmtSuperTableActionUpdate, - .encodeFp = mgmtSuperTableActionEncode, - .decodeFp = mgmtSuperTableActionDecode, - .destroyFp = mgmtSuperTableActionDestroy, - }; - - tsSuperTableSdb = sdbOpenTable(&tableDesc); - if (tsSuperTableSdb == NULL) { - mError("failed to init stables data"); - return -1; - } - - mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_STABLE_VGROUP, mgmtProcessSuperTableVgroupMsg); - mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_METRIC, mgmtGetShowSuperTableMeta); - mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_METRIC, mgmtRetrieveShowSuperTables); - mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_DROP_STABLE_RSP, mgmtProcessDropStableRsp); - - mTrace("stables is initialized"); - return 0; -} - -void mgmtCleanUpSuperTables() { - sdbCloseTable(tsSuperTableSdb); -} - -void mgmtCreateSuperTable(SQueuedMsg *pMsg) { - SCMCreateTableMsg *pCreate = pMsg->pCont; - SSuperTableObj *pStable = (SSuperTableObj *)calloc(1, sizeof(SSuperTableObj)); - if (pStable == NULL) { - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); - return; - } - - strcpy(pStable->info.tableId, pCreate->tableId); - pStable->info.type = TSDB_SUPER_TABLE; - pStable->createdTime = taosGetTimestampMs(); - pStable->uid = (((uint64_t) pStable->createdTime) << 16) + (sdbGetVersion() & ((1ul << 16) - 1ul)); - pStable->sversion = 0; - pStable->numOfColumns = htons(pCreate->numOfColumns); - pStable->numOfTags = htons(pCreate->numOfTags); - - int32_t numOfCols = pCreate->numOfColumns + pCreate->numOfTags; - int32_t schemaSize = numOfCols * sizeof(SSchema); - pStable->schema = (SSchema *)calloc(1, schemaSize); - if (pStable->schema == NULL) { - free(pStable); - mError("stable:%s, no schema input", pCreate->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); - return; - } - memcpy(pStable->schema, pCreate->schema, numOfCols * sizeof(SSchema)); - - pStable->nextColId = 0; - for (int32_t col = 0; col < numOfCols; col++) { - SSchema *tschema = pStable->schema; - tschema[col].colId = pStable->nextColId++; - tschema[col].bytes = htons(tschema[col].bytes); - } - - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_GLOBAL, - .table = tsSuperTableSdb, - .pObj = pStable, - .rowSize = sizeof(SSuperTableObj) + schemaSize - }; - - int32_t code = sdbInsertRow(&oper); - if (code != TSDB_CODE_SUCCESS) { - mgmtDestroySuperTable(pStable); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SDB_ERROR); - } else { - mLPrint("stable:%s, is created, tags:%d cols:%d", pStable->info.tableId, pStable->numOfTags, pStable->numOfColumns); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SUCCESS); - } -} - -void mgmtDropSuperTable(SQueuedMsg *pMsg, SSuperTableObj *pStable) { - if (pStable->numOfTables != 0) { - mError("stable:%s, numOfTables:%d not 0", pStable->info.tableId, pStable->numOfTables); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_OTHERS); - } else { - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_GLOBAL, - .table = tsSuperTableSdb, - .pObj = pStable - }; - int32_t code = sdbDeleteRow(&oper); - mLPrint("stable:%s, is dropped from sdb, result:%s", pStable->info.tableId, tstrerror(code)); - mgmtSendSimpleResp(pMsg->thandle, code); - } -} - -void* mgmtGetSuperTable(char *tableId) { - return sdbGetRow(tsSuperTableSdb, tableId); -} - -static void *mgmtGetSuperTableVgroup(SSuperTableObj *pStable) { - SCMSTableVgroupRspMsg *rsp = rpcMallocCont(sizeof(SCMSTableVgroupRspMsg) + sizeof(uint32_t) * mgmtGetDnodesNum()); - rsp->numOfDnodes = htonl(1); - rsp->dnodeIps[0] = htonl(inet_addr(tsPrivateIp)); - return rsp; -} - -static int32_t mgmtFindSuperTableTagIndex(SSuperTableObj *pStable, const char *tagName) { - for (int32_t i = 0; i < pStable->numOfTags; i++) { - SSchema *schema = (SSchema *)(pStable->schema + (pStable->numOfColumns + i) * sizeof(SSchema)); - if (strcasecmp(tagName, schema->name) == 0) { - return i; - } - } - - return -1; -} - -static int32_t mgmtAddSuperTableTag(SSuperTableObj *pStable, SSchema schema[], int32_t ntags) { - if (pStable->numOfTags + ntags > TSDB_MAX_TAGS) { - return TSDB_CODE_APP_ERROR; - } - - // check if schemas have the same name - for (int32_t i = 1; i < ntags; i++) { - for (int32_t j = 0; j < i; j++) { - if (strcasecmp(schema[i].name, schema[j].name) == 0) { - return TSDB_CODE_APP_ERROR; - } - } - } - - SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); - if (pDb == NULL) { - mError("meter: %s not belongs to any database", pStable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("DB: %s not belongs to andy account", pDb->name); - return TSDB_CODE_APP_ERROR; - } - - int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); - pStable->schema = realloc(pStable->schema, schemaSize + sizeof(SSchema) * ntags); - - memmove(pStable->schema + sizeof(SSchema) * (pStable->numOfColumns + ntags), - pStable->schema + sizeof(SSchema) * pStable->numOfColumns, sizeof(SSchema) * pStable->numOfTags); - memcpy(pStable->schema + sizeof(SSchema) * pStable->numOfColumns, schema, sizeof(SSchema) * ntags); - - SSchema *tschema = (SSchema *) (pStable->schema + sizeof(SSchema) * pStable->numOfColumns); - for (int32_t i = 0; i < ntags; i++) { - tschema[i].colId = pStable->nextColId++; - } - - pStable->numOfColumns += ntags; - pStable->sversion++; - - pAcct->acctInfo.numOfTimeSeries += (ntags * pStable->numOfTables); - // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); - - mTrace("Succeed to add tag column %s to table %s", schema[0].name, pStable->info.tableId); - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtDropSuperTableTag(SSuperTableObj *pStable, char *tagName) { - int32_t col = mgmtFindSuperTableTagIndex(pStable, tagName); - if (col <= 0 || col >= pStable->numOfTags) { - return TSDB_CODE_APP_ERROR; - } - - SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); - if (pDb == NULL) { - mError("table: %s not belongs to any database", pStable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("DB: %s not belongs to any account", pDb->name); - return TSDB_CODE_APP_ERROR; - } - - memmove(pStable->schema + sizeof(SSchema) * col, pStable->schema + sizeof(SSchema) * (col + 1), - sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags - col - 1)); - - pStable->numOfTags--; - pStable->sversion++; - - int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); - pStable->schema = realloc(pStable->schema, schemaSize); - - // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtModifySuperTableTagNameByName(SSuperTableObj *pStable, char *oldTagName, char *newTagName) { - int32_t col = mgmtFindSuperTableTagIndex(pStable, oldTagName); - if (col < 0) { - // Tag name does not exist - mError("Failed to modify table %s tag column, oname: %s, nname: %s", pStable->info.tableId, oldTagName, newTagName); - return TSDB_CODE_INVALID_MSG_TYPE; - } - - // int32_t rowSize = 0; - uint32_t len = strlen(newTagName); - - if (col >= pStable->numOfTags || len >= TSDB_COL_NAME_LEN || mgmtFindSuperTableTagIndex(pStable, newTagName) >= 0) { - return TSDB_CODE_APP_ERROR; - } - - // update - SSchema *schema = (SSchema *) (pStable->schema + (pStable->numOfColumns + col) * sizeof(SSchema)); - strncpy(schema->name, newTagName, TSDB_COL_NAME_LEN); - - // Encode string - int32_t size = 1 + sizeof(SSuperTableObj) + TSDB_MAX_BYTES_PER_ROW; - char *msg = (char *) malloc(size); - if (msg == NULL) return TSDB_CODE_APP_ERROR; - memset(msg, 0, size); - - // mgmtSuperTableActionEncode(pStable, msg, size, &rowSize); - - int32_t ret = 0; - // int32_t ret = sdbUpdateRow(tsSuperTableSdb, msg, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); - tfree(msg); - - if (ret < 0) { - mError("Failed to modify table %s tag column", pStable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - mTrace("Succeed to modify table %s tag column", pStable->info.tableId); - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtFindSuperTableColumnIndex(SSuperTableObj *pStable, char *colName) { - SSchema *schema = (SSchema *) pStable->schema; - for (int32_t i = 0; i < pStable->numOfColumns; i++) { - if (strcasecmp(schema[i].name, colName) == 0) { - return i; - } - } - - return -1; -} - -static int32_t mgmtAddSuperTableColumn(SSuperTableObj *pStable, SSchema schema[], int32_t ncols) { - if (ncols <= 0) { - return TSDB_CODE_APP_ERROR; - } - - for (int32_t i = 0; i < ncols; i++) { - if (mgmtFindSuperTableColumnIndex(pStable, schema[i].name) > 0) { - return TSDB_CODE_APP_ERROR; - } - } - - SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); - if (pDb == NULL) { - mError("meter: %s not belongs to any database", pStable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("DB: %s not belongs to andy account", pDb->name); - return TSDB_CODE_APP_ERROR; - } - - int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); - pStable->schema = realloc(pStable->schema, schemaSize + sizeof(SSchema) * ncols); - - memmove(pStable->schema + sizeof(SSchema) * (pStable->numOfColumns + ncols), - pStable->schema + sizeof(SSchema) * pStable->numOfColumns, sizeof(SSchema) * pStable->numOfTags); - memcpy(pStable->schema + sizeof(SSchema) * pStable->numOfColumns, schema, sizeof(SSchema) * ncols); - - SSchema *tschema = (SSchema *) (pStable->schema + sizeof(SSchema) * pStable->numOfColumns); - for (int32_t i = 0; i < ncols; i++) { - tschema[i].colId = pStable->nextColId++; - } - - pStable->numOfColumns += ncols; - pStable->sversion++; - - pAcct->acctInfo.numOfTimeSeries += (ncols * pStable->numOfTables); - // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtDropSuperTableColumnByName(SSuperTableObj *pStable, char *colName) { - int32_t col = mgmtFindSuperTableColumnIndex(pStable, colName); - if (col < 0) { - return TSDB_CODE_APP_ERROR; - } - - SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); - if (pDb == NULL) { - mError("table: %s not belongs to any database", pStable->info.tableId); - return TSDB_CODE_APP_ERROR; - } - - SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); - if (pAcct == NULL) { - mError("DB: %s not belongs to any account", pDb->name); - return TSDB_CODE_APP_ERROR; - } - - memmove(pStable->schema + sizeof(SSchema) * col, pStable->schema + sizeof(SSchema) * (col + 1), - sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags - col - 1)); - - pStable->numOfColumns--; - pStable->sversion++; - - int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); - pStable->schema = realloc(pStable->schema, schemaSize); - - pAcct->acctInfo.numOfTimeSeries -= (pStable->numOfTables); - // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); - - return TSDB_CODE_SUCCESS; -} - -static int32_t mgmtGetShowSuperTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { - SDbObj *pDb = mgmtGetDb(pShow->db); - if (pDb == NULL) { - return TSDB_CODE_DB_NOT_SELECTED; - } - - int32_t cols = 0; - SSchema *pSchema = pMeta->schema; - - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN; - pSchema[cols].type = TSDB_DATA_TYPE_BINARY; - strcpy(pSchema[cols].name, "name"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = 8; - pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; - strcpy(pSchema[cols].name, "create_time"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = 2; - pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; - strcpy(pSchema[cols].name, "columns"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = 2; - pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; - strcpy(pSchema[cols].name, "tags"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pShow->bytes[cols] = 4; - pSchema[cols].type = TSDB_DATA_TYPE_INT; - strcpy(pSchema[cols].name, "tables"); - pSchema[cols].bytes = htons(pShow->bytes[cols]); - cols++; - - pMeta->numOfColumns = htons(cols); - 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 = pDb->numOfSuperTables; - pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; - - return 0; -} - -int32_t mgmtRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, void *pConn) { - int32_t numOfRows = 0; - char * pWrite; - int32_t cols = 0; - SSuperTableObj *pTable = NULL; - char prefix[20] = {0}; - int32_t prefixLen; - - SDbObj *pDb = mgmtGetDb(pShow->db); - if (pDb == NULL) return 0; - - SUserObj *pUser = mgmtGetUserFromConn(pConn, NULL); - - if (mgmtCheckIsMonitorDB(pDb->name, tsMonitorDbName)) { - if (strcmp(pUser->user, "root") != 0 && strcmp(pUser->user, "_root") != 0 && strcmp(pUser->user, "monitor") != 0 ) { - return 0; - } - } - - strcpy(prefix, pDb->name); - strcat(prefix, TS_PATH_DELIMITER); - prefixLen = strlen(prefix); - - SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; - char stableName[TSDB_TABLE_NAME_LEN] = {0}; - - while (numOfRows < rows) { - pShow->pNode = sdbFetchRow(tsSuperTableSdb, pShow->pNode, (void **) &pTable); - if (pTable == NULL) break; - if (strncmp(pTable->info.tableId, prefix, prefixLen)) { - continue; - } - - memset(stableName, 0, tListLen(stableName)); - mgmtExtractTableName(pTable->info.tableId, stableName); - - if (pShow->payloadLen > 0 && - patternMatch(pShow->payload, stableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) - continue; - - cols = 0; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - strncpy(pWrite, stableName, TSDB_TABLE_NAME_LEN); - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int64_t *)pWrite = pTable->createdTime; - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int16_t *)pWrite = pTable->numOfColumns; - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int16_t *)pWrite = pTable->numOfTags; - cols++; - - pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - *(int32_t *)pWrite = pTable->numOfTables; - cols++; - - numOfRows++; - } - - pShow->numOfReads += numOfRows; - return numOfRows; -} - -void mgmtDropAllSuperTables(SDbObj *pDropDb) { - void *pNode = NULL; - void *pLastNode = NULL; - int32_t numOfTables = 0; - int32_t dbNameLen = strlen(pDropDb->name); - SSuperTableObj *pTable = NULL; - - while (1) { - pNode = sdbFetchRow(tsSuperTableSdb, pNode, (void **)&pTable); - if (pTable == NULL) { - break; - } - - if (strncmp(pDropDb->name, pTable->info.tableId, dbNameLen) == 0) { - SSdbOperDesc oper = { - .type = SDB_OPER_TYPE_LOCAL, - .table = tsSuperTableSdb, - .pObj = pTable, - }; - sdbDeleteRow(&oper); - pNode = pLastNode; - numOfTables ++; - continue; - } - } - - mTrace("db:%s, all super tables:%d is dropped from sdb", pDropDb->name, numOfTables); -} - -int32_t mgmtSetSchemaFromSuperTable(SSchema *pSchema, SSuperTableObj *pTable) { - int32_t numOfCols = pTable->numOfColumns + pTable->numOfTags; - for (int32_t i = 0; i < numOfCols; ++i) { - strcpy(pSchema->name, pTable->schema[i].name); - pSchema->type = pTable->schema[i].type; - pSchema->bytes = htons(pTable->schema[i].bytes); - pSchema->colId = htons(pTable->schema[i].colId); - pSchema++; - } - - return (pTable->numOfColumns + pTable->numOfTags) * sizeof(SSchema); -} - -void mgmtGetSuperTableMeta(SQueuedMsg *pMsg, SSuperTableObj *pTable) { - SDbObj *pDb = pMsg->pDb; - - STableMetaMsg *pMeta = rpcMallocCont(sizeof(STableMetaMsg) + sizeof(SSchema) * TSDB_MAX_COLUMNS); - pMeta->uid = htobe64(pTable->uid); - pMeta->sversion = htons(pTable->sversion); - pMeta->precision = pDb->cfg.precision; - pMeta->numOfTags = (uint8_t)pTable->numOfTags; - pMeta->numOfColumns = htons((int16_t)pTable->numOfColumns); - pMeta->tableType = pTable->info.type; - pMeta->contLen = sizeof(STableMetaMsg) + mgmtSetSchemaFromSuperTable(pMeta->schema, pTable); - strcpy(pMeta->tableId, pTable->info.tableId); - - SRpcMsg rpcRsp = { - .handle = pMsg->thandle, - .pCont = pMeta, - .contLen = pMeta->contLen, - }; - pMeta->contLen = htons(pMeta->contLen); - rpcSendResponse(&rpcRsp); - - mTrace("stable:%%s, uid:%" PRIu64 " table meta is retrieved", pTable->info.tableId, pTable->uid); -} - -static void mgmtProcessSuperTableVgroupMsg(SQueuedMsg *pMsg) { - SCMSTableVgroupMsg *pInfo = pMsg->pCont; - STableInfo *pTable = mgmtGetSuperTable(pInfo->tableId); - if (pTable == NULL) { - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); - return; - } - - SCMSTableVgroupRspMsg *pRsp = mgmtGetSuperTableVgroup((SSuperTableObj *) pTable); - if (pRsp != NULL) { - int32_t msgLen = sizeof(SSuperTableObj) + htonl(pRsp->numOfDnodes) * sizeof(int32_t); - SRpcMsg rpcRsp = {0}; - rpcRsp.handle = pMsg->thandle; - rpcRsp.pCont = pRsp; - rpcRsp.contLen = msgLen; - rpcSendResponse(&rpcRsp); - } else { - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); - } -} - -void mgmtAlterSuperTable(SQueuedMsg *pMsg, SSuperTableObj *pTable) { - int32_t code = TSDB_CODE_OPS_NOT_SUPPORT; - SCMAlterTableMsg *pAlter = pMsg->pCont; - - if (pAlter->type == TSDB_ALTER_TABLE_ADD_TAG_COLUMN) { - code = mgmtAddSuperTableTag((SSuperTableObj *) pTable, pAlter->schema, 1); - } else if (pAlter->type == TSDB_ALTER_TABLE_DROP_TAG_COLUMN) { - code = mgmtDropSuperTableTag((SSuperTableObj *) pTable, pAlter->schema[0].name); - } else if (pAlter->type == TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN) { - code = mgmtModifySuperTableTagNameByName((SSuperTableObj *) pTable, pAlter->schema[0].name, pAlter->schema[1].name); - } else if (pAlter->type == TSDB_ALTER_TABLE_ADD_COLUMN) { - code = mgmtAddSuperTableColumn((SSuperTableObj *) pTable, pAlter->schema, 1); - } else if (pAlter->type == TSDB_ALTER_TABLE_DROP_COLUMN) { - code = mgmtDropSuperTableColumnByName((SSuperTableObj *) pTable, pAlter->schema[0].name); - } else {} - - mgmtSendSimpleResp(pMsg->thandle, code); -} - -static void mgmtProcessDropStableRsp(SRpcMsg *rpcMsg) { - mTrace("drop stable rsp received, handle:%p code:%d", rpcMsg->handle, rpcMsg->code); -} \ No newline at end of file diff --git a/src/mnode/src/mgmtTable.c b/src/mnode/src/mgmtTable.c index 5169f4a8174ae6d88d9a4741fcdfa8f8ac01d629..00328c212a7f5b4e6ee4b10f2f3477481df61dfd 100644 --- a/src/mnode/src/mgmtTable.c +++ b/src/mnode/src/mgmtTable.c @@ -15,8 +15,23 @@ #define _DEFAULT_SOURCE #include "os.h" +#include "taosmsg.h" +#include "tscompression.h" +#include "tskiplist.h" +#include "ttime.h" +#include "tstatus.h" +#include "tutil.h" +#include "qast.h" +#include "qextbuffer.h" +#include "taoserror.h" +#include "taosmsg.h" +#include "tscompression.h" +#include "tskiplist.h" +#include "tsqlfunction.h" +#include "tstatus.h" +#include "ttime.h" +#include "name.h" #include "mgmtAcct.h" -#include "mgmtChildTable.h" #include "mgmtDClient.h" #include "mgmtDb.h" #include "mgmtDnode.h" @@ -26,14 +41,410 @@ #include "mgmtProfile.h" #include "mgmtSdb.h" #include "mgmtShell.h" -#include "mgmtSuperTable.h" #include "mgmtTable.h" #include "mgmtUser.h" +#include "mgmtVgroup.h" + +static void * tsChildTableSdb; +static void * tsSuperTableSdb; +static int32_t tsChildTableUpdateSize; +static int32_t tsSuperTableUpdateSize; +static void * mgmtGetChildTable(char *tableId); +static void * mgmtGetSuperTable(char *tableId); +static void mgmtDropAllChildTablesInStable(SSuperTableObj *pStable); +static int32_t mgmtGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); +static int32_t mgmtRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows, void *pConn); +static int32_t mgmtRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, void *pConn); +static int32_t mgmtGetShowSuperTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); static void mgmtProcessCreateTableMsg(SQueuedMsg *queueMsg); +static void mgmtProcessCreateSuperTableMsg(SQueuedMsg *pMsg); +static void mgmtProcessCreateChildTableMsg(SQueuedMsg *pMsg); +static void mgmtProcessCreateChildTableRsp(SRpcMsg *rpcMsg); + static void mgmtProcessDropTableMsg(SQueuedMsg *queueMsg); -static void mgmtProcessAlterTableMsg(SQueuedMsg *queueMsg); +static void mgmtProcessDropSuperTableMsg(SQueuedMsg *pMsg); +static void mgmtProcessDropSuperTableRsp(SRpcMsg *rpcMsg); +static void mgmtProcessDropChildTableMsg(SQueuedMsg *pMsg); +static void mgmtProcessDropChildTableRsp(SRpcMsg *rpcMsg); + +static void mgmtProcessSuperTableVgroupMsg(SQueuedMsg *queueMsg); +static void mgmtProcessMultiTableMetaMsg(SQueuedMsg *queueMsg); +static void mgmtProcessTableCfgMsg(SRpcMsg *rpcMsg); + static void mgmtProcessTableMetaMsg(SQueuedMsg *queueMsg); +static void mgmtGetSuperTableMeta(SQueuedMsg *pMsg); +static void mgmtGetChildTableMeta(SQueuedMsg *pMsg); + +static void mgmtProcessAlterTableMsg(SQueuedMsg *queueMsg); +static void mgmtAlterChildTable(SQueuedMsg *pMsg); +static void mgmtAlterSuperTable(SQueuedMsg *pMsg); +static void mgmtProcessAlterTableRsp(SRpcMsg *rpcMsg); + +static void mgmtDestroyChildTable(SChildTableObj *pTable) { + tfree(pTable->schema); + tfree(pTable->sql); + tfree(pTable); +} + +static int32_t mgmtChildTableActionDestroy(SSdbOperDesc *pOper) { + mgmtDestroyChildTable(pOper->pObj); + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtChildTableActionInsert(SSdbOperDesc *pOper) { + SChildTableObj *pTable = pOper->pObj; + + SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); + if (pVgroup == NULL) { + mError("ctable:%s, not in vgroup:%d", pTable->info.tableId, pTable->vgId); + return TSDB_CODE_INVALID_VGROUP_ID; + } + mgmtDecVgroupRef(pVgroup); + + SDbObj *pDb = mgmtGetDb(pVgroup->dbName); + if (pDb == NULL) { + mError("ctable:%s, vgroup:%d not in db:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName); + return TSDB_CODE_INVALID_DB; + } + mgmtDecDbRef(pDb); + + SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + if (pAcct == NULL) { + mError("ctable:%s, account:%s not exists", pTable->info.tableId, pDb->cfg.acct); + return TSDB_CODE_INVALID_ACCT; + } + acctDecRef(pAcct); + + if (pTable->info.type == TSDB_CHILD_TABLE) { + pTable->superTable = mgmtGetSuperTable(pTable->superTableId); + pTable->superTable->numOfTables++; + grantAdd(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1); + pAcct->acctInfo.numOfTimeSeries += (pTable->superTable->numOfColumns - 1); + } else { + grantAdd(TSDB_GRANT_TIMESERIES, pTable->numOfColumns - 1); + pAcct->acctInfo.numOfTimeSeries += (pTable->numOfColumns - 1); + } + + mgmtAddTableIntoDb(pDb); + mgmtAddTableIntoVgroup(pVgroup, pTable); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtChildTableActionDelete(SSdbOperDesc *pOper) { + SChildTableObj *pTable = pOper->pObj; + if (pTable->vgId == 0) { + return TSDB_CODE_INVALID_VGROUP_ID; + } + + SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); + if (pVgroup == NULL) { + return TSDB_CODE_INVALID_VGROUP_ID; + } + mgmtDecVgroupRef(pVgroup); + + SDbObj *pDb = mgmtGetDb(pVgroup->dbName); + if (pDb == NULL) { + mError("ctable:%s, vgroup:%d not in DB:%s", pTable->info.tableId, pVgroup->vgId, pVgroup->dbName); + return TSDB_CODE_INVALID_DB; + } + mgmtDecDbRef(pDb); + + SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + if (pAcct == NULL) { + mError("ctable:%s, account:%s not exists", pTable->info.tableId, pDb->cfg.acct); + return TSDB_CODE_INVALID_ACCT; + } + acctDecRef(pAcct); + + if (pTable->info.type == TSDB_CHILD_TABLE) { + grantRestore(TSDB_GRANT_TIMESERIES, pTable->superTable->numOfColumns - 1); + pAcct->acctInfo.numOfTimeSeries -= (pTable->superTable->numOfColumns - 1); + pTable->superTable->numOfTables--; + mgmtDecTableRef(pTable->superTable); + } else { + grantRestore(TSDB_GRANT_TIMESERIES, pTable->numOfColumns - 1); + pAcct->acctInfo.numOfTimeSeries -= (pTable->numOfColumns - 1); + } + mgmtRemoveTableFromDb(pDb); + mgmtRemoveTableFromVgroup(pVgroup, pTable); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtChildTableActionUpdate(SSdbOperDesc *pOper) { + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtChildTableActionEncode(SSdbOperDesc *pOper) { + SChildTableObj *pTable = pOper->pObj; + assert(pTable != NULL && pOper->rowData != NULL); + + if (pTable->info.type == TSDB_CHILD_TABLE) { + memcpy(pOper->rowData, pTable, tsChildTableUpdateSize); + pOper->rowSize = tsChildTableUpdateSize; + } else { + int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema); + if (pOper->maxRowSize < tsChildTableUpdateSize + schemaSize) { + return TSDB_CODE_INVALID_MSG_LEN; + } + memcpy(pOper->rowData, pTable, tsChildTableUpdateSize); + memcpy(pOper->rowData + tsChildTableUpdateSize, pTable->schema, schemaSize); + memcpy(pOper->rowData + tsChildTableUpdateSize + schemaSize, pTable->sql, pTable->sqlLen); + pOper->rowSize = tsChildTableUpdateSize + schemaSize + pTable->sqlLen; + } + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtChildTableActionDecode(SSdbOperDesc *pOper) { + assert(pOper->rowData != NULL); + SChildTableObj *pTable = calloc(1, sizeof(SChildTableObj)); + if (pTable == NULL) { + return TSDB_CODE_SERV_OUT_OF_MEMORY; + } + + memcpy(pTable, pOper->rowData, tsChildTableUpdateSize); + + if (pTable->info.type != TSDB_CHILD_TABLE) { + int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema); + pTable->schema = (SSchema *)malloc(schemaSize); + if (pTable->schema == NULL) { + mgmtDestroyChildTable(pTable); + return TSDB_CODE_SERV_OUT_OF_MEMORY; + } + memcpy(pTable->schema, pOper->rowData + tsChildTableUpdateSize, schemaSize); + + pTable->sql = (char *)malloc(pTable->sqlLen); + if (pTable->sql == NULL) { + mgmtDestroyChildTable(pTable); + return TSDB_CODE_SERV_OUT_OF_MEMORY; + } + memcpy(pTable->sql, pOper->rowData + tsChildTableUpdateSize + schemaSize, pTable->sqlLen); + } + + pOper->pObj = pTable; + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtInitChildTables() { + void *pNode = NULL; + void *pLastNode = NULL; + SChildTableObj *pTable = NULL; + + SChildTableObj tObj; + tsChildTableUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; + + SSdbTableDesc tableDesc = { + .tableName = "ctables", + .hashSessions = tsMaxTables, + .maxRowSize = sizeof(SChildTableObj) + sizeof(SSchema) * TSDB_MAX_COLUMNS, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, + .keyType = SDB_KEY_TYPE_STRING, + .insertFp = mgmtChildTableActionInsert, + .deleteFp = mgmtChildTableActionDelete, + .updateFp = mgmtChildTableActionUpdate, + .encodeFp = mgmtChildTableActionEncode, + .decodeFp = mgmtChildTableActionDecode, + .destroyFp = mgmtChildTableActionDestroy, + }; + + tsChildTableSdb = sdbOpenTable(&tableDesc); + if (tsChildTableSdb == NULL) { + mError("failed to init child table data"); + return -1; + } + + pNode = NULL; + while (1) { + pLastNode = pNode; + mgmtDecTableRef(pTable); + pNode = sdbFetchRow(tsChildTableSdb, pNode, (void **)&pTable); + if (pTable == NULL) break; + + SDbObj *pDb = mgmtGetDbByTableId(pTable->info.tableId); + if (pDb == NULL) { + mError("ctable:%s, failed to get db, discard it", pTable->info.tableId); + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_LOCAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + sdbDeleteRow(&desc); + pNode = pLastNode; + continue; + } + mgmtDecDbRef(pDb); + + SVgObj *pVgroup = mgmtGetVgroup(pTable->vgId); + if (pVgroup == NULL) { + mError("ctable:%s, failed to get vgroup:%d sid:%d, discard it", pTable->info.tableId, pTable->vgId, pTable->sid); + pTable->vgId = 0; + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_LOCAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + sdbDeleteRow(&desc); + pNode = pLastNode; + continue; + } + mgmtDecVgroupRef(pVgroup); + + if (strcmp(pVgroup->dbName, pDb->name) != 0) { + mError("ctable:%s, db:%s not match with vgroup:%d db:%s sid:%d, discard it", + pTable->info.tableId, pDb->name, pTable->vgId, pVgroup->dbName, pTable->sid); + pTable->vgId = 0; + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_LOCAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + sdbDeleteRow(&desc); + pNode = pLastNode; + continue; + } + + if (pVgroup->tableList == NULL) { + mError("ctable:%s, vgroup:%d tableList is null", pTable->info.tableId, pTable->vgId); + pTable->vgId = 0; + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_LOCAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + sdbDeleteRow(&desc); + pNode = pLastNode; + continue; + } + + if (pTable->info.type == TSDB_CHILD_TABLE) { + SSuperTableObj *pSuperTable = mgmtGetSuperTable(pTable->superTableId); + if (pSuperTable == NULL) { + mError("ctable:%s, stable:%s not exist", pTable->info.tableId, pTable->superTableId); + pTable->vgId = 0; + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_LOCAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + sdbDeleteRow(&desc); + pNode = pLastNode; + continue; + } + } + } + + mTrace("child table is initialized"); + return 0; +} + +static void mgmtCleanUpChildTables() { + sdbCloseTable(tsChildTableSdb); +} + +static void mgmtDestroySuperTable(SSuperTableObj *pStable) { + tfree(pStable->schema); + tfree(pStable); +} + +static int32_t mgmtSuperTableActionDestroy(SSdbOperDesc *pOper) { + mgmtDestroySuperTable(pOper->pObj); + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtSuperTableActionInsert(SSdbOperDesc *pOper) { + SSuperTableObj *pStable = pOper->pObj; + SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); + if (pDb != NULL) { + mgmtAddSuperTableIntoDb(pDb); + } + mgmtDecDbRef(pDb); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtSuperTableActionDelete(SSdbOperDesc *pOper) { + SSuperTableObj *pStable = pOper->pObj; + SDbObj *pDb = mgmtGetDbByTableId(pStable->info.tableId); + if (pDb != NULL) { + mgmtRemoveSuperTableFromDb(pDb); + mgmtDropAllChildTablesInStable((SSuperTableObj *)pStable); + } + mgmtDecDbRef(pDb); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtSuperTableActionUpdate(SSdbOperDesc *pOper) { + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtSuperTableActionEncode(SSdbOperDesc *pOper) { + SSuperTableObj *pStable = pOper->pObj; + assert(pOper->pObj != NULL && pOper->rowData != NULL); + + int32_t schemaSize = sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags); + + if (pOper->maxRowSize < tsSuperTableUpdateSize + schemaSize) { + return TSDB_CODE_INVALID_MSG_LEN; + } + + memcpy(pOper->rowData, pStable, tsSuperTableUpdateSize); + memcpy(pOper->rowData + tsSuperTableUpdateSize, pStable->schema, schemaSize); + pOper->rowSize = tsSuperTableUpdateSize + schemaSize; + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtSuperTableActionDecode(SSdbOperDesc *pOper) { + assert(pOper->rowData != NULL); + + SSuperTableObj *pStable = (SSuperTableObj *) calloc(1, sizeof(SSuperTableObj)); + if (pStable == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; + + memcpy(pStable, pOper->rowData, tsSuperTableUpdateSize); + + int32_t schemaSize = sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags); + pStable->schema = malloc(schemaSize); + if (pStable->schema == NULL) { + mgmtDestroySuperTable(pStable); + return -1; + } + + memcpy(pStable->schema, pOper->rowData + tsSuperTableUpdateSize, schemaSize); + pOper->pObj = pStable; + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtInitSuperTables() { + SSuperTableObj tObj; + tsSuperTableUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj; + + SSdbTableDesc tableDesc = { + .tableName = "stables", + .hashSessions = TSDB_MAX_SUPER_TABLES, + .maxRowSize = tsSuperTableUpdateSize + sizeof(SSchema) * TSDB_MAX_COLUMNS, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, + .keyType = SDB_KEY_TYPE_STRING, + .insertFp = mgmtSuperTableActionInsert, + .deleteFp = mgmtSuperTableActionDelete, + .updateFp = mgmtSuperTableActionUpdate, + .encodeFp = mgmtSuperTableActionEncode, + .decodeFp = mgmtSuperTableActionDecode, + .destroyFp = mgmtSuperTableActionDestroy, + }; + + tsSuperTableSdb = sdbOpenTable(&tableDesc); + if (tsSuperTableSdb == NULL) { + mError("failed to init stables data"); + return -1; + } + + mTrace("stables is initialized"); + return 0; +} + +static void mgmtCleanUpSuperTables() { + sdbCloseTable(tsSuperTableSdb); +} int32_t mgmtInitTables() { int32_t code = mgmtInitSuperTables(); @@ -46,21 +457,43 @@ int32_t mgmtInitTables() { return code; } + mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_TABLES_META, mgmtProcessMultiTableMetaMsg); mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_CREATE_TABLE, mgmtProcessCreateTableMsg); mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_DROP_TABLE, mgmtProcessDropTableMsg); mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_ALTER_TABLE, mgmtProcessAlterTableMsg); mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_TABLE_META, mgmtProcessTableMetaMsg); + mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_STABLE_VGROUP, mgmtProcessSuperTableVgroupMsg); + + mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_CREATE_TABLE_RSP, mgmtProcessCreateChildTableRsp); + mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_DROP_TABLE_RSP, mgmtProcessDropChildTableRsp); + mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_DROP_STABLE_RSP, mgmtProcessDropSuperTableRsp); + mgmtAddDClientRspHandle(TSDB_MSG_TYPE_MD_ALTER_TABLE_RSP, mgmtProcessAlterTableRsp); + mgmtAddDServerMsgHandle(TSDB_MSG_TYPE_DM_CONFIG_TABLE, mgmtProcessTableCfgMsg); + + mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_TABLE, mgmtGetShowTableMeta); + mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_TABLE, mgmtRetrieveShowTables); + mgmtAddShellShowMetaHandle(TSDB_MGMT_TABLE_METRIC, mgmtGetShowSuperTableMeta); + mgmtAddShellShowRetrieveHandle(TSDB_MGMT_TABLE_METRIC, mgmtRetrieveShowSuperTables); + return TSDB_CODE_SUCCESS; } +static void *mgmtGetChildTable(char *tableId) { + return sdbGetRow(tsChildTableSdb, tableId); +} + +static void *mgmtGetSuperTable(char *tableId) { + return sdbGetRow(tsSuperTableSdb, tableId); +} + STableInfo *mgmtGetTable(char *tableId) { - STableInfo *tableInfo = mgmtGetSuperTable(tableId); + STableInfo *tableInfo = sdbGetRow(tsSuperTableSdb, tableId); if (tableInfo != NULL) { return tableInfo; } - tableInfo = mgmtGetChildTable(tableId); + tableInfo = sdbGetRow(tsChildTableSdb, tableId); if (tableInfo != NULL) { return tableInfo; } @@ -68,12 +501,32 @@ STableInfo *mgmtGetTable(char *tableId) { return NULL; } +void mgmtIncTableRef(void *p1) { + STableInfo *pTable = (STableInfo *)p1; + if (pTable->type == TSDB_SUPER_TABLE) { + sdbIncRef(tsSuperTableSdb, pTable); + } else { + sdbIncRef(tsChildTableSdb, pTable); + } +} + +void mgmtDecTableRef(void *p1) { + if (p1 == NULL) return; + + STableInfo *pTable = (STableInfo *)p1; + if (pTable->type == TSDB_SUPER_TABLE) { + sdbDecRef(tsSuperTableSdb, pTable); + } else { + sdbDecRef(tsChildTableSdb, pTable); + } +} + void mgmtCleanUpTables() { mgmtCleanUpChildTables(); mgmtCleanUpSuperTables(); } -void mgmtExtractTableName(char* tableId, char* name) { +static void mgmtExtractTableName(char* tableId, char* name) { int pos = -1; int num = 0; for (pos = 0; tableId[pos] != 0; ++pos) { @@ -88,13 +541,16 @@ void mgmtExtractTableName(char* tableId, char* name) { static void mgmtProcessCreateTableMsg(SQueuedMsg *pMsg) { SCMCreateTableMsg *pCreate = pMsg->pCont; - mTrace("table:%s, create msg is received from thandle:%p", pCreate->tableId, pMsg->thandle); - - if (mgmtCheckRedirect(pMsg->thandle)) return; - - if (!pMsg->pUser->writeAuth) { - mError("table:%s, failed to create, no rights", pCreate->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); + + pMsg->pTable = mgmtGetTable(pCreate->tableId); + if (pMsg->pTable != NULL) { + if (pCreate->igExists) { + mTrace("table:%s, is already exist", pCreate->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SUCCESS); + } else { + mError("table:%s, failed to create, table already exist", pCreate->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_TABLE_ALREADY_EXIST); + } return; } @@ -105,40 +561,17 @@ static void mgmtProcessCreateTableMsg(SQueuedMsg *pMsg) { return; } - STableInfo *pTable = mgmtGetTable(pCreate->tableId); - if (pTable != NULL) { - if (pCreate->igExists) { - mTrace("table:%s is already exist", pCreate->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SUCCESS); - return; - } else { - mError("table:%s, failed to create, table already exist", pCreate->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_TABLE_ALREADY_EXIST); - return; - } - } - if (pCreate->numOfTags != 0) { - mTrace("table:%s, is a stable", pCreate->tableId); - mgmtCreateSuperTable(pMsg); + mTrace("table:%s, create msg is received from thandle:%p", pCreate->tableId, pMsg->thandle); + mgmtProcessCreateSuperTableMsg(pMsg); } else { - mTrace("table:%s, is a ctable", pCreate->tableId); - mgmtCreateChildTable(pMsg); + mTrace("table:%s, create msg is received from thandle:%p", pCreate->tableId, pMsg->thandle); + mgmtProcessCreateChildTableMsg(pMsg); } } static void mgmtProcessDropTableMsg(SQueuedMsg *pMsg) { SCMDropTableMsg *pDrop = pMsg->pCont; - mTrace("table:%s, drop table msg is received from thandle:%p", pDrop->tableId, pMsg->thandle); - - if (mgmtCheckRedirect(pMsg->thandle)) return; - - if (!pMsg->pUser->writeAuth) { - mError("table:%s, failed to drop, no rights", pDrop->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); - return; - } - pMsg->pDb = mgmtGetDbByTableId(pDrop->tableId); if (pMsg->pDb == NULL || pMsg->pDb->dirty) { mError("table:%s, failed to drop table, db not selected", pDrop->tableId); @@ -152,8 +585,8 @@ static void mgmtProcessDropTableMsg(SQueuedMsg *pMsg) { return; } - STableInfo *pTable = mgmtGetTable(pDrop->tableId); - if (pTable == NULL) { + pMsg->pTable = mgmtGetTable(pDrop->tableId); + if (pMsg->pTable == NULL) { if (pDrop->igNotExists) { mTrace("table:%s, table is not exist, think drop success", pDrop->tableId); mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SUCCESS); @@ -165,12 +598,12 @@ static void mgmtProcessDropTableMsg(SQueuedMsg *pMsg) { } } - if (pTable->type == TSDB_SUPER_TABLE) { + if (pMsg->pTable->type == TSDB_SUPER_TABLE) { mTrace("table:%s, start to drop stable", pDrop->tableId); - mgmtDropSuperTable(pMsg, (SSuperTableObj *)pTable); + mgmtProcessDropSuperTableMsg(pMsg); } else { mTrace("table:%s, start to drop ctable", pDrop->tableId); - mgmtDropChildTable(pMsg, (SChildTableObj *)pTable); + mgmtProcessDropChildTableMsg(pMsg); } } @@ -178,14 +611,6 @@ static void mgmtProcessAlterTableMsg(SQueuedMsg *pMsg) { SCMAlterTableMsg *pAlter = pMsg->pCont; mTrace("table:%s, alter table msg is received from thandle:%p", pAlter->tableId, pMsg->thandle); - if (mgmtCheckRedirect(pMsg->thandle)) return; - - if (!pMsg->pUser->writeAuth) { - mTrace("table:%s, failed to alter table, no rights", pAlter->tableId); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); - return; - } - pMsg->pDb = mgmtGetDbByTableId(pAlter->tableId); if (pMsg->pDb == NULL || pMsg->pDb->dirty) { mError("table:%s, failed to alter table, db not selected", pAlter->tableId); @@ -199,9 +624,9 @@ static void mgmtProcessAlterTableMsg(SQueuedMsg *pMsg) { return; } - STableInfo *pTable = mgmtGetTable(pAlter->tableId); - if (pTable == NULL) { - mError("table:%s, failed to alter table, table not exist", pTable->tableId); + pMsg->pTable = mgmtGetTable(pAlter->tableId); + if (pMsg->pTable == NULL) { + mError("table:%s, failed to alter table, table not exist", pMsg->pTable->tableId); mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); return; } @@ -217,12 +642,12 @@ static void mgmtProcessAlterTableMsg(SQueuedMsg *pMsg) { pAlter->schema[i].bytes = htons(pAlter->schema[i].bytes); } - if (pTable->type == TSDB_SUPER_TABLE) { + if (pMsg->pTable->type == TSDB_SUPER_TABLE) { mTrace("table:%s, start to alter stable", pAlter->tableId); - mgmtAlterSuperTable(pMsg, (SSuperTableObj *)pTable); + mgmtAlterSuperTable(pMsg); } else { mTrace("table:%s, start to alter ctable", pAlter->tableId); - mgmtAlterChildTable(pMsg, (SChildTableObj *)pTable); + mgmtAlterChildTable(pMsg); } } @@ -237,10 +662,1415 @@ static void mgmtProcessTableMetaMsg(SQueuedMsg *pMsg) { return; } - STableInfo *pTable = mgmtGetTable(pInfo->tableId); - if (pTable == NULL || pTable->type != TSDB_SUPER_TABLE) { - mgmtGetChildTableMeta(pMsg, (SChildTableObj *)pTable); + pMsg->pTable = mgmtGetTable(pInfo->tableId); + if (pMsg->pTable == NULL) { + mgmtGetChildTableMeta(pMsg); + } else { + if (pMsg->pTable->type != TSDB_SUPER_TABLE) { + mgmtGetChildTableMeta(pMsg); + } else { + mgmtGetSuperTableMeta(pMsg); + } + } +} + +static void mgmtProcessCreateSuperTableMsg(SQueuedMsg *pMsg) { + SCMCreateTableMsg *pCreate = pMsg->pCont; + SSuperTableObj *pStable = (SSuperTableObj *)calloc(1, sizeof(SSuperTableObj)); + if (pStable == NULL) { + mError("table:%s, failed to create, no enough memory", pCreate->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); + return; + } + + strcpy(pStable->info.tableId, pCreate->tableId); + pStable->info.type = TSDB_SUPER_TABLE; + pStable->createdTime = taosGetTimestampMs(); + pStable->uid = (((uint64_t) pStable->createdTime) << 16) + (sdbGetVersion() & ((1ul << 16) - 1ul)); + pStable->sversion = 0; + pStable->numOfColumns = htons(pCreate->numOfColumns); + pStable->numOfTags = htons(pCreate->numOfTags); + + int32_t numOfCols = pCreate->numOfColumns + pCreate->numOfTags; + int32_t schemaSize = numOfCols * sizeof(SSchema); + pStable->schema = (SSchema *)calloc(1, schemaSize); + if (pStable->schema == NULL) { + free(pStable); + mError("table:%s, failed to create, no schema input", pCreate->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); + return; + } + memcpy(pStable->schema, pCreate->schema, numOfCols * sizeof(SSchema)); + + pStable->nextColId = 0; + for (int32_t col = 0; col < numOfCols; col++) { + SSchema *tschema = pStable->schema; + tschema[col].colId = pStable->nextColId++; + tschema[col].bytes = htons(tschema[col].bytes); + } + + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_GLOBAL, + .table = tsSuperTableSdb, + .pObj = pStable, + .rowSize = sizeof(SSuperTableObj) + schemaSize + }; + + int32_t code = sdbInsertRow(&oper); + if (code != TSDB_CODE_SUCCESS) { + mgmtDestroySuperTable(pStable); + mError("table:%s, failed to create, sdb error", pCreate->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SDB_ERROR); + } else { + mLPrint("table:%s, is created, tags:%d cols:%d", pStable->info.tableId, pStable->numOfTags, pStable->numOfColumns); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SUCCESS); + } +} + +static void mgmtProcessDropSuperTableMsg(SQueuedMsg *pMsg) { + SSuperTableObj *pStable = (SSuperTableObj *)pMsg->pTable; + if (pStable->numOfTables != 0) { + mError("stable:%s, numOfTables:%d not 0", pStable->info.tableId, pStable->numOfTables); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_OTHERS); } else { - mgmtGetSuperTableMeta(pMsg, (SSuperTableObj *)pTable); + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_GLOBAL, + .table = tsSuperTableSdb, + .pObj = pStable + }; + int32_t code = sdbDeleteRow(&oper); + mLPrint("stable:%s, is dropped from sdb, result:%s", pStable->info.tableId, tstrerror(code)); + mgmtSendSimpleResp(pMsg->thandle, code); + } +} + +static int32_t mgmtFindSuperTableTagIndex(SSuperTableObj *pStable, const char *tagName) { + for (int32_t i = 0; i < pStable->numOfTags; i++) { + SSchema *schema = (SSchema *)(pStable->schema + (pStable->numOfColumns + i) * sizeof(SSchema)); + if (strcasecmp(tagName, schema->name) == 0) { + return i; + } + } + + return -1; +} + +static int32_t mgmtAddSuperTableTag(SSuperTableObj *pStable, SSchema schema[], int32_t ntags) { + if (pStable->numOfTags + ntags > TSDB_MAX_TAGS) { + return TSDB_CODE_APP_ERROR; + } + + // check if schemas have the same name + for (int32_t i = 1; i < ntags; i++) { + for (int32_t j = 0; j < i; j++) { + if (strcasecmp(schema[i].name, schema[j].name) == 0) { + return TSDB_CODE_APP_ERROR; + } + } + } + + int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); + pStable->schema = realloc(pStable->schema, schemaSize + sizeof(SSchema) * ntags); + + memmove(pStable->schema + sizeof(SSchema) * (pStable->numOfColumns + ntags), + pStable->schema + sizeof(SSchema) * pStable->numOfColumns, sizeof(SSchema) * pStable->numOfTags); + memcpy(pStable->schema + sizeof(SSchema) * pStable->numOfColumns, schema, sizeof(SSchema) * ntags); + + SSchema *tschema = (SSchema *) (pStable->schema + sizeof(SSchema) * pStable->numOfColumns); + for (int32_t i = 0; i < ntags; i++) { + tschema[i].colId = pStable->nextColId++; + } + + pStable->numOfColumns += ntags; + pStable->sversion++; + + // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); + + mTrace("Succeed to add tag column %s to table %s", schema[0].name, pStable->info.tableId); + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtProcessDropSuperTableMsgTag(SSuperTableObj *pStable, char *tagName) { + int32_t col = mgmtFindSuperTableTagIndex(pStable, tagName); + if (col <= 0 || col >= pStable->numOfTags) { + return TSDB_CODE_APP_ERROR; + } + + memmove(pStable->schema + sizeof(SSchema) * col, pStable->schema + sizeof(SSchema) * (col + 1), + sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags - col - 1)); + + pStable->numOfTags--; + pStable->sversion++; + + int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); + pStable->schema = realloc(pStable->schema, schemaSize); + + // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtModifySuperTableTagNameByName(SSuperTableObj *pStable, char *oldTagName, char *newTagName) { + int32_t col = mgmtFindSuperTableTagIndex(pStable, oldTagName); + if (col < 0) { + // Tag name does not exist + mError("Failed to modify table %s tag column, oname: %s, nname: %s", pStable->info.tableId, oldTagName, newTagName); + return TSDB_CODE_INVALID_MSG_TYPE; + } + + // int32_t rowSize = 0; + uint32_t len = strlen(newTagName); + + if (col >= pStable->numOfTags || len >= TSDB_COL_NAME_LEN || mgmtFindSuperTableTagIndex(pStable, newTagName) >= 0) { + return TSDB_CODE_APP_ERROR; + } + + // update + SSchema *schema = (SSchema *) (pStable->schema + (pStable->numOfColumns + col) * sizeof(SSchema)); + strncpy(schema->name, newTagName, TSDB_COL_NAME_LEN); + + // Encode string + int32_t size = 1 + sizeof(SSuperTableObj) + TSDB_MAX_BYTES_PER_ROW; + char *msg = (char *) malloc(size); + if (msg == NULL) return TSDB_CODE_APP_ERROR; + memset(msg, 0, size); + + // mgmtSuperTableActionEncode(pStable, msg, size, &rowSize); + + int32_t ret = 0; + // int32_t ret = sdbUpdateRow(tsSuperTableSdb, msg, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); + tfree(msg); + + if (ret < 0) { + mError("Failed to modify table %s tag column", pStable->info.tableId); + return TSDB_CODE_APP_ERROR; + } + + mTrace("Succeed to modify table %s tag column", pStable->info.tableId); + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtFindSuperTableColumnIndex(SSuperTableObj *pStable, char *colName) { + SSchema *schema = (SSchema *) pStable->schema; + for (int32_t i = 0; i < pStable->numOfColumns; i++) { + if (strcasecmp(schema[i].name, colName) == 0) { + return i; + } + } + + return -1; +} + +static int32_t mgmtAddSuperTableColumn(SSuperTableObj *pStable, SSchema schema[], int32_t ncols) { + if (ncols <= 0) { + return TSDB_CODE_APP_ERROR; + } + + for (int32_t i = 0; i < ncols; i++) { + if (mgmtFindSuperTableColumnIndex(pStable, schema[i].name) > 0) { + return TSDB_CODE_APP_ERROR; + } + } + + // pMsg->pDb = mgmtGetDbByTableId(pStable->info.tableId); + // if (pMsg->pDb == NULL) { + // mError("meter: %s not belongs to any database", pStable->info.tableId); + // return TSDB_CODE_APP_ERROR; + // } + + // pMsg->pAcct = acctGetAcct(pMsg->pDb->cfg.acct); + // if (pMsg->pAcct == NULL) { + // mError("DB: %s not belongs to andy account", pMsg->pDb->name); + // return TSDB_CODE_APP_ERROR; + // } + + int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); + pStable->schema = realloc(pStable->schema, schemaSize + sizeof(SSchema) * ncols); + + memmove(pStable->schema + sizeof(SSchema) * (pStable->numOfColumns + ncols), + pStable->schema + sizeof(SSchema) * pStable->numOfColumns, sizeof(SSchema) * pStable->numOfTags); + memcpy(pStable->schema + sizeof(SSchema) * pStable->numOfColumns, schema, sizeof(SSchema) * ncols); + + SSchema *tschema = (SSchema *) (pStable->schema + sizeof(SSchema) * pStable->numOfColumns); + for (int32_t i = 0; i < ncols; i++) { + tschema[i].colId = pStable->nextColId++; } + + pStable->numOfColumns += ncols; + pStable->sversion++; + + // pMsg->pAcct->acctInfo.numOfTimeSeries += (ncols * pStable->numOfTables); + // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtProcessDropSuperTableMsgColumnByName(SSuperTableObj *pStable, char *colName) { + int32_t col = mgmtFindSuperTableColumnIndex(pStable, colName); + if (col < 0) { + return TSDB_CODE_APP_ERROR; + } + + // pMsg->pDb = mgmtGetDbByTableId(pStable->info.tableId); + // if (pMsg->pDb == NULL) { + // mError("meter: %s not belongs to any database", pStable->info.tableId); + // return TSDB_CODE_APP_ERROR; + // } + + // pMsg->pAcct = acctGetAcct(pMsg->pDb->cfg.acct); + // if (pMsg->pAcct == NULL) { + // mError("DB: %s not belongs to andy account", pMsg->pDb->name); + // return TSDB_CODE_APP_ERROR; + // } + + memmove(pStable->schema + sizeof(SSchema) * col, pStable->schema + sizeof(SSchema) * (col + 1), + sizeof(SSchema) * (pStable->numOfColumns + pStable->numOfTags - col - 1)); + + pStable->numOfColumns--; + pStable->sversion++; + + int32_t schemaSize = sizeof(SSchema) * (pStable->numOfTags + pStable->numOfColumns); + pStable->schema = realloc(pStable->schema, schemaSize); + + // pMsg->pAcct->acctInfo.numOfTimeSeries -= (pStable->numOfTables); + // sdbUpdateRow(tsSuperTableSdb, pStable, tsSuperTableUpdateSize, SDB_OPER_GLOBAL); + + return TSDB_CODE_SUCCESS; +} + +// show super tables +static int32_t mgmtGetShowSuperTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { + SDbObj *pDb = mgmtGetDb(pShow->db); + if (pDb == NULL) { + return TSDB_CODE_DB_NOT_SELECTED; + } + + int32_t cols = 0; + SSchema *pSchema = pMeta->schema; + + pShow->bytes[cols] = TSDB_TABLE_NAME_LEN; + pSchema[cols].type = TSDB_DATA_TYPE_BINARY; + strcpy(pSchema[cols].name, "name"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = 8; + pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; + strcpy(pSchema[cols].name, "create_time"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = 2; + pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; + strcpy(pSchema[cols].name, "columns"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = 2; + pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; + strcpy(pSchema[cols].name, "tags"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = 4; + pSchema[cols].type = TSDB_DATA_TYPE_INT; + strcpy(pSchema[cols].name, "tables"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pMeta->numOfColumns = htons(cols); + 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 = pDb->numOfSuperTables; + pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; + + mgmtDecDbRef(pDb); + return 0; +} + +// retrieve super tables +int32_t mgmtRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, void *pConn) { + int32_t numOfRows = 0; + char * pWrite; + int32_t cols = 0; + SSuperTableObj *pTable = NULL; + char prefix[20] = {0}; + int32_t prefixLen; + + SDbObj *pDb = mgmtGetDb(pShow->db); + if (pDb == NULL) return 0; + + strcpy(prefix, pDb->name); + strcat(prefix, TS_PATH_DELIMITER); + prefixLen = strlen(prefix); + + SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; + char stableName[TSDB_TABLE_NAME_LEN] = {0}; + + while (numOfRows < rows) { + mgmtDecTableRef(pTable); + pShow->pNode = sdbFetchRow(tsSuperTableSdb, pShow->pNode, (void **) &pTable); + if (pTable == NULL) break; + if (strncmp(pTable->info.tableId, prefix, prefixLen)) { + continue; + } + + memset(stableName, 0, tListLen(stableName)); + mgmtExtractTableName(pTable->info.tableId, stableName); + + if (pShow->payloadLen > 0 && + patternMatch(pShow->payload, stableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) + continue; + + cols = 0; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + strncpy(pWrite, stableName, TSDB_TABLE_NAME_LEN); + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int64_t *)pWrite = pTable->createdTime; + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int16_t *)pWrite = pTable->numOfColumns; + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int16_t *)pWrite = pTable->numOfTags; + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int32_t *)pWrite = pTable->numOfTables; + cols++; + + numOfRows++; + } + + pShow->numOfReads += numOfRows; + mgmtDecDbRef(pDb); + + return numOfRows; +} + +void mgmtDropAllSuperTables(SDbObj *pDropDb) { + void *pNode = NULL; + void *pLastNode = NULL; + int32_t numOfTables = 0; + int32_t dbNameLen = strlen(pDropDb->name); + SSuperTableObj *pTable = NULL; + + while (1) { + mgmtDecTableRef(pTable); + pNode = sdbFetchRow(tsSuperTableSdb, pNode, (void **)&pTable); + if (pTable == NULL) { + break; + } + + if (strncmp(pDropDb->name, pTable->info.tableId, dbNameLen) == 0) { + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_LOCAL, + .table = tsSuperTableSdb, + .pObj = pTable, + }; + sdbDeleteRow(&oper); + pNode = pLastNode; + numOfTables ++; + continue; + } + } + mTrace("db:%s, all super tables:%d is dropped from sdb", pDropDb->name, numOfTables); +} + +static int32_t mgmtSetSchemaFromSuperTable(SSchema *pSchema, SSuperTableObj *pTable) { + int32_t numOfCols = pTable->numOfColumns + pTable->numOfTags; + for (int32_t i = 0; i < numOfCols; ++i) { + strcpy(pSchema->name, pTable->schema[i].name); + pSchema->type = pTable->schema[i].type; + pSchema->bytes = htons(pTable->schema[i].bytes); + pSchema->colId = htons(pTable->schema[i].colId); + pSchema++; + } + + return (pTable->numOfColumns + pTable->numOfTags) * sizeof(SSchema); +} + +static void mgmtGetSuperTableMeta(SQueuedMsg *pMsg) { + SSuperTableObj *pTable = (SSuperTableObj *)pMsg->pTable; + STableMetaMsg *pMeta = rpcMallocCont(sizeof(STableMetaMsg) + sizeof(SSchema) * TSDB_MAX_COLUMNS); + pMeta->uid = htobe64(pTable->uid); + pMeta->sversion = htons(pTable->sversion); + pMeta->precision = pMsg->pDb->cfg.precision; + pMeta->numOfTags = (uint8_t)pTable->numOfTags; + pMeta->numOfColumns = htons((int16_t)pTable->numOfColumns); + pMeta->tableType = pTable->info.type; + pMeta->contLen = sizeof(STableMetaMsg) + mgmtSetSchemaFromSuperTable(pMeta->schema, pTable); + strcpy(pMeta->tableId, pTable->info.tableId); + + SRpcMsg rpcRsp = { + .handle = pMsg->thandle, + .pCont = pMeta, + .contLen = pMeta->contLen, + }; + pMeta->contLen = htons(pMeta->contLen); + rpcSendResponse(&rpcRsp); + + mTrace("stable:%%s, uid:%" PRIu64 " table meta is retrieved", pTable->info.tableId, pTable->uid); +} + +static void mgmtProcessSuperTableVgroupMsg(SQueuedMsg *pMsg) { + SCMSTableVgroupMsg *pInfo = pMsg->pCont; + pMsg->pTable = mgmtGetSuperTable(pInfo->tableId); + if (pMsg->pTable == NULL) { + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); + return; + } + + SCMSTableVgroupRspMsg *pRsp = rpcMallocCont(sizeof(SCMSTableVgroupRspMsg) + sizeof(uint32_t) * mgmtGetDnodesNum()); + if (pRsp == NULL) { + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); + return; + } + + pRsp->numOfDnodes = htonl(1); + pRsp->dnodeIps[0] = htonl(inet_addr(tsPrivateIp)); + + int32_t msgLen = sizeof(SSuperTableObj) + htonl(pRsp->numOfDnodes) * sizeof(int32_t); + SRpcMsg rpcRsp = {0}; + rpcRsp.handle = pMsg->thandle; + rpcRsp.pCont = pRsp; + rpcRsp.contLen = msgLen; + rpcSendResponse(&rpcRsp); +} + +static void mgmtAlterSuperTable(SQueuedMsg *pMsg) { + SSuperTableObj *pTable = (SSuperTableObj *)pMsg->pTable; + int32_t code = TSDB_CODE_OPS_NOT_SUPPORT; + SCMAlterTableMsg *pAlter = pMsg->pCont; + + if (pAlter->type == TSDB_ALTER_TABLE_ADD_TAG_COLUMN) { + code = mgmtAddSuperTableTag((SSuperTableObj *) pTable, pAlter->schema, 1); + } else if (pAlter->type == TSDB_ALTER_TABLE_DROP_TAG_COLUMN) { + code = mgmtProcessDropSuperTableMsgTag((SSuperTableObj *) pTable, pAlter->schema[0].name); + } else if (pAlter->type == TSDB_ALTER_TABLE_CHANGE_TAG_COLUMN) { + code = mgmtModifySuperTableTagNameByName((SSuperTableObj *) pTable, pAlter->schema[0].name, pAlter->schema[1].name); + } else if (pAlter->type == TSDB_ALTER_TABLE_ADD_COLUMN) { + code = mgmtAddSuperTableColumn((SSuperTableObj *) pTable, pAlter->schema, 1); + } else if (pAlter->type == TSDB_ALTER_TABLE_DROP_COLUMN) { + code = mgmtProcessDropSuperTableMsgColumnByName((SSuperTableObj *) pTable, pAlter->schema[0].name); + } else {} + + mgmtSendSimpleResp(pMsg->thandle, code); +} + +static void mgmtProcessDropSuperTableRsp(SRpcMsg *rpcMsg) { + mTrace("drop stable rsp received, handle:%p code:%d", rpcMsg->handle, rpcMsg->code); +} + +static void *mgmtBuildCreateChildTableMsg(SCMCreateTableMsg *pMsg, SChildTableObj *pTable) { + char * pTagData = NULL; + int32_t tagDataLen = 0; + int32_t totalCols = 0; + int32_t contLen = 0; + if (pTable->info.type == TSDB_CHILD_TABLE && pMsg != NULL) { + pTagData = pMsg->schema + TSDB_TABLE_ID_LEN + 1; + tagDataLen = htonl(pMsg->contLen) - sizeof(SCMCreateTableMsg) - TSDB_TABLE_ID_LEN - 1; + totalCols = pTable->superTable->numOfColumns + pTable->superTable->numOfTags; + contLen = sizeof(SMDCreateTableMsg) + totalCols * sizeof(SSchema) + tagDataLen + pTable->sqlLen; + } else { + totalCols = pTable->numOfColumns; + contLen = sizeof(SMDCreateTableMsg) + totalCols * sizeof(SSchema) + pTable->sqlLen; + } + + SMDCreateTableMsg *pCreate = rpcMallocCont(contLen); + if (pCreate == NULL) { + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + return NULL; + } + + memcpy(pCreate->tableId, pTable->info.tableId, TSDB_TABLE_ID_LEN + 1); + pCreate->contLen = htonl(contLen); + pCreate->vgId = htonl(pTable->vgId); + pCreate->tableType = pTable->info.type; + pCreate->createdTime = htobe64(pTable->createdTime); + pCreate->sid = htonl(pTable->sid); + pCreate->sqlDataLen = htonl(pTable->sqlLen); + pCreate->uid = htobe64(pTable->uid); + + if (pTable->info.type == TSDB_CHILD_TABLE) { + memcpy(pCreate->superTableId, pTable->superTable->info.tableId, TSDB_TABLE_ID_LEN + 1); + pCreate->numOfColumns = htons(pTable->superTable->numOfColumns); + pCreate->numOfTags = htons(pTable->superTable->numOfTags); + pCreate->sversion = htonl(pTable->superTable->sversion); + pCreate->tagDataLen = htonl(tagDataLen); + pCreate->superTableUid = htobe64(pTable->superTable->uid); + } else { + pCreate->numOfColumns = htons(pTable->numOfColumns); + pCreate->numOfTags = 0; + pCreate->sversion = htonl(pTable->sversion); + pCreate->tagDataLen = 0; + pCreate->superTableUid = 0; + } + + SSchema *pSchema = (SSchema *) pCreate->data; + if (pTable->info.type == TSDB_CHILD_TABLE) { + memcpy(pSchema, pTable->superTable->schema, totalCols * sizeof(SSchema)); + } else { + memcpy(pSchema, pTable->schema, totalCols * sizeof(SSchema)); + } + for (int32_t col = 0; col < totalCols; ++col) { + pSchema->bytes = htons(pSchema->bytes); + pSchema->colId = htons(pSchema->colId); + pSchema++; + } + + if (pTable->info.type == TSDB_CHILD_TABLE && pMsg != NULL) { + memcpy(pCreate->data + totalCols * sizeof(SSchema), pTagData, tagDataLen); + memcpy(pCreate->data + totalCols * sizeof(SSchema) + tagDataLen, pTable->sql, pTable->sqlLen); + } + + return pCreate; +} + +static SChildTableObj* mgmtDoCreateChildTable(SCMCreateTableMsg *pCreate, SVgObj *pVgroup, int32_t tid) { + SChildTableObj *pTable = (SChildTableObj *) calloc(1, sizeof(SChildTableObj)); + if (pTable == NULL) { + mError("table:%s, failed to alloc memory", pCreate->tableId); + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + return NULL; + } + + if (pCreate->numOfColumns == 0) { + pTable->info.type = TSDB_CHILD_TABLE; + } else { + pTable->info.type = TSDB_NORMAL_TABLE; + } + + strcpy(pTable->info.tableId, pCreate->tableId); + pTable->createdTime = taosGetTimestampMs(); + pTable->sid = tid; + pTable->vgId = pVgroup->vgId; + + if (pTable->info.type == TSDB_CHILD_TABLE) { + char *pTagData = (char *) pCreate->schema; // it is a tag key + SSuperTableObj *pSuperTable = mgmtGetSuperTable(pTagData); + if (pSuperTable == NULL) { + mError("table:%s, corresponding super table does not exist", pCreate->tableId); + free(pTable); + terrno = TSDB_CODE_INVALID_TABLE; + return NULL; + } + mgmtDecTableRef(pSuperTable); + + strcpy(pTable->superTableId, pSuperTable->info.tableId); + pTable->uid = (((uint64_t) pTable->vgId) << 40) + ((((uint64_t) pTable->sid) & ((1ul << 24) - 1ul)) << 16) + + (sdbGetVersion() & ((1ul << 16) - 1ul)); + pTable->superTable = pSuperTable; + } else { + pTable->uid = (((uint64_t) pTable->createdTime) << 16) + (sdbGetVersion() & ((1ul << 16) - 1ul)); + pTable->sversion = 0; + pTable->numOfColumns = htons(pCreate->numOfColumns); + pTable->sqlLen = htons(pCreate->sqlLen); + + int32_t numOfCols = pTable->numOfColumns; + int32_t schemaSize = numOfCols * sizeof(SSchema); + pTable->schema = (SSchema *) calloc(1, schemaSize); + if (pTable->schema == NULL) { + free(pTable); + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + return NULL; + } + memcpy(pTable->schema, pCreate->schema, numOfCols * sizeof(SSchema)); + + pTable->nextColId = 0; + for (int32_t col = 0; col < numOfCols; col++) { + SSchema *tschema = pTable->schema; + tschema[col].colId = pTable->nextColId++; + tschema[col].bytes = htons(tschema[col].bytes); + } + + if (pTable->sqlLen != 0) { + pTable->info.type = TSDB_STREAM_TABLE; + pTable->sql = calloc(1, pTable->sqlLen); + if (pTable->sql == NULL) { + free(pTable); + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + return NULL; + } + memcpy(pTable->sql, (char *) (pCreate->schema) + numOfCols * sizeof(SSchema), pTable->sqlLen); + pTable->sql[pTable->sqlLen - 1] = 0; + mTrace("table:%s, stream sql len:%d sql:%s", pTable->info.tableId, pTable->sqlLen, pTable->sql); + } + } + + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_GLOBAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + + if (sdbInsertRow(&desc) != TSDB_CODE_SUCCESS) { + free(pTable); + mError("table:%s, update sdb error", pCreate->tableId); + terrno = TSDB_CODE_SDB_ERROR; + return NULL; + } + + mTrace("table:%s, create ctable in vgroup, uid:%" PRIu64 , pTable->info.tableId, pTable->uid); + return pTable; +} + +static void mgmtProcessCreateChildTableMsg(SQueuedMsg *pMsg) { + SCMCreateTableMsg *pCreate = pMsg->pCont; + int32_t code = grantCheck(TSDB_GRANT_TIMESERIES); + if (code != TSDB_CODE_SUCCESS) { + mError("table:%s, failed to create, grant timeseries failed", pCreate->tableId); + mgmtSendSimpleResp(pMsg->thandle, code); + return; + } + + SVgObj *pVgroup = mgmtGetAvailableVgroup(pMsg->pDb); + if (pVgroup == NULL) { + mTrace("table:%s, start to create a new vgroup", pCreate->tableId); + mgmtCreateVgroup(mgmtCloneQueuedMsg(pMsg), pMsg->pDb); + return; + } + + int32_t sid = taosAllocateId(pVgroup->idPool); + if (sid < 0) { + mTrace("tables:%s, no enough sid in vgroup:%d", pVgroup->vgId); + mgmtCreateVgroup(mgmtCloneQueuedMsg(pMsg), pMsg->pDb); + return; + } + + pMsg->pTable = (STableInfo *)mgmtDoCreateChildTable(pCreate, pVgroup, sid); + if (pMsg->pTable == NULL) { + mgmtSendSimpleResp(pMsg->thandle, terrno); + return; + } + + SMDCreateTableMsg *pMDCreate = mgmtBuildCreateChildTableMsg(pCreate, (SChildTableObj *) pMsg->pTable); + if (pMDCreate == NULL) { + mgmtSendSimpleResp(pMsg->thandle, terrno); + return; + } + + SRpcIpSet ipSet = mgmtGetIpSetFromVgroup(pVgroup); + SQueuedMsg *newMsg = mgmtCloneQueuedMsg(pMsg); + newMsg->ahandle = pMsg->pTable; + mgmtIncTableRef(pMsg->pTable); + SRpcMsg rpcMsg = { + .handle = newMsg, + .pCont = pMDCreate, + .contLen = htonl(pMDCreate->contLen), + .code = 0, + .msgType = TSDB_MSG_TYPE_MD_CREATE_TABLE + }; + + mgmtSendMsgToDnode(&ipSet, &rpcMsg); +} + +static void mgmtProcessDropChildTableMsg(SQueuedMsg *pMsg) { + SChildTableObj *pTable = (SChildTableObj *)pMsg->pTable; + SVgObj *pVgroup = pMsg->pVgroup = mgmtGetVgroup(pTable->vgId); + if (pVgroup == NULL) { + mError("table:%s, failed to drop ctable, vgroup not exist", pTable->info.tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_OTHERS); + return; + } + + SMDDropTableMsg *pDrop = rpcMallocCont(sizeof(SMDDropTableMsg)); + if (pDrop == NULL) { + mError("table:%s, failed to drop ctable, no enough memory", pTable->info.tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); + return; + } + + strcpy(pDrop->tableId, pTable->info.tableId); + pDrop->vgId = htonl(pTable->vgId); + pDrop->contLen = htonl(sizeof(SMDDropTableMsg)); + pDrop->sid = htonl(pTable->sid); + pDrop->uid = htobe64(pTable->uid); + + SRpcIpSet ipSet = mgmtGetIpSetFromVgroup(pVgroup); + + mTrace("table:%s, send drop ctable msg", pDrop->tableId); + SQueuedMsg *newMsg = mgmtCloneQueuedMsg(pMsg); + newMsg->ahandle = pMsg->pTable; + SRpcMsg rpcMsg = { + .handle = newMsg, + .pCont = pDrop, + .contLen = sizeof(SMDDropTableMsg), + .code = 0, + .msgType = TSDB_MSG_TYPE_MD_DROP_TABLE + }; + + mgmtSendMsgToDnode(&ipSet, &rpcMsg); +} + +int32_t mgmtModifyChildTableTagValueByName(SChildTableObj *pTable, char *tagName, char *nContent) { +// TODO: send message to dnode +// int32_t col = mgmtFindSuperTableTagIndex(pTable->superTable, tagName); +// if (col < 0 || col > pTable->superTable->numOfTags) { +// return TSDB_CODE_APP_ERROR; +// } +// +// //TODO send msg to dnode +// mTrace("Succeed to modify tag column %d of table %s", col, pTable->info.tableId); +// return TSDB_CODE_SUCCESS; + +// int32_t rowSize = 0; +// SSchema *schema = (SSchema *)(pSuperTable->schema + (pSuperTable->numOfColumns + col) * sizeof(SSchema)); +// +// if (col == 0) { +// pTable->isDirty = 1; +// removeMeterFromMetricIndex(pSuperTable, pTable); +// } +// memcpy(pTable->pTagData + mgmtGetTagsLength(pMetric, col) + TSDB_TABLE_ID_LEN, nContent, schema->bytes); +// if (col == 0) { +// addMeterIntoMetricIndex(pMetric, pTable); +// } +// +// // Encode the string +// int32_t size = sizeof(STabObj) + TSDB_MAX_BYTES_PER_ROW + 1; +// char *msg = (char *)malloc(size); +// if (msg == NULL) { +// mError("failed to allocate message memory while modify tag value"); +// return TSDB_CODE_APP_ERROR; +// } +// memset(msg, 0, size); +// +// mgmtMeterActionEncode(pTable, msg, size, &rowSize); +// +// int32_t ret = sdbUpdateRow(tsChildTableSdb, msg, rowSize, 1); // Need callback function +// tfree(msg); +// +// if (pTable->isDirty) pTable->isDirty = 0; +// +// if (ret < 0) { +// mError("Failed to modify tag column %d of table %s", col, pTable->info.tableId); +// return TSDB_CODE_APP_ERROR; +// } +// +// mTrace("Succeed to modify tag column %d of table %s", col, pTable->info.tableId); +// return TSDB_CODE_SUCCESS; + return 0; +} + +static int32_t mgmtFindNormalTableColumnIndex(SChildTableObj *pTable, char *colName) { + SSchema *schema = (SSchema *) pTable->schema; + for (int32_t i = 0; i < pTable->numOfColumns; i++) { + if (strcasecmp(schema[i].name, colName) == 0) { + return i; + } + } + + return -1; +} + +static int32_t mgmtAddNormalTableColumn(SChildTableObj *pTable, SSchema schema[], int32_t ncols) { + if (ncols <= 0) { + return TSDB_CODE_APP_ERROR; + } + + for (int32_t i = 0; i < ncols; i++) { + if (mgmtFindNormalTableColumnIndex(pTable, schema[i].name) > 0) { + return TSDB_CODE_APP_ERROR; + } + } + + SDbObj *pDb = mgmtGetDbByTableId(pTable->info.tableId); + if (pDb == NULL) { + mError("table: %s not belongs to any database", pTable->info.tableId); + return TSDB_CODE_APP_ERROR; + } + + SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + if (pAcct == NULL) { + mError("DB: %s not belongs to andy account", pDb->name); + return TSDB_CODE_APP_ERROR; + } + + int32_t schemaSize = pTable->numOfColumns * sizeof(SSchema); + pTable->schema = realloc(pTable->schema, schemaSize + sizeof(SSchema) * ncols); + + memcpy(pTable->schema + schemaSize, schema, sizeof(SSchema) * ncols); + + SSchema *tschema = (SSchema *) (pTable->schema + sizeof(SSchema) * pTable->numOfColumns); + for (int32_t i = 0; i < ncols; i++) { + tschema[i].colId = pTable->nextColId++; + } + + pTable->numOfColumns += ncols; + pTable->sversion++; + pAcct->acctInfo.numOfTimeSeries += ncols; + + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_GLOBAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + desc.rowData = pTable; + desc.rowSize = tsChildTableUpdateSize; + sdbUpdateRow(&desc); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtDropNormalTableColumnByName(SChildTableObj *pTable, char *colName) { + int32_t col = mgmtFindNormalTableColumnIndex(pTable, colName); + if (col < 0) { + return TSDB_CODE_APP_ERROR; + } + + SDbObj *pDb = mgmtGetDbByTableId(pTable->info.tableId); + if (pDb == NULL) { + mError("table: %s not belongs to any database", pTable->info.tableId); + return TSDB_CODE_APP_ERROR; + } + + SAcctObj *pAcct = acctGetAcct(pDb->cfg.acct); + if (pAcct == NULL) { + mError("DB: %s not belongs to any account", pDb->name); + return TSDB_CODE_APP_ERROR; + } + + memmove(pTable->schema + sizeof(SSchema) * col, pTable->schema + sizeof(SSchema) * (col + 1), + sizeof(SSchema) * (pTable->numOfColumns - col - 1)); + + pTable->numOfColumns--; + pTable->sversion++; + + pAcct->acctInfo.numOfTimeSeries--; + + SSdbOperDesc desc = {0}; + desc.type = SDB_OPER_TYPE_GLOBAL; + desc.pObj = pTable; + desc.table = tsChildTableSdb; + desc.rowData = pTable; + desc.rowSize = tsChildTableUpdateSize; + sdbUpdateRow(&desc); + + return TSDB_CODE_SUCCESS; +} + +static int32_t mgmtSetSchemaFromNormalTable(SSchema *pSchema, SChildTableObj *pTable) { + int32_t numOfCols = pTable->numOfColumns; + for (int32_t i = 0; i < numOfCols; ++i) { + strcpy(pSchema->name, pTable->schema[i].name); + pSchema->type = pTable->schema[i].type; + pSchema->bytes = htons(pTable->schema[i].bytes); + pSchema->colId = htons(pTable->schema[i].colId); + pSchema++; + } + + return numOfCols * sizeof(SSchema); +} + +static int32_t mgmtDoGetChildTableMeta(SQueuedMsg *pMsg, STableMetaMsg *pMeta) { + SDbObj *pDb = pMsg->pDb; + SChildTableObj *pTable = (SChildTableObj *)pMsg->pTable; + int8_t usePublicIp = pMsg->usePublicIp; + + pMeta->uid = htobe64(pTable->uid); + pMeta->sid = htonl(pTable->sid); + pMeta->vgId = htonl(pTable->vgId); + pMeta->precision = pDb->cfg.precision; + pMeta->tableType = pTable->info.type; + strncpy(pMeta->tableId, pTable->info.tableId, tListLen(pTable->info.tableId)); + + if (pTable->info.type == TSDB_CHILD_TABLE) { + pMeta->sversion = htons(pTable->superTable->sversion); + pMeta->numOfTags = 0; + pMeta->numOfColumns = htons((int16_t)pTable->superTable->numOfColumns); + pMeta->contLen = sizeof(STableMetaMsg) + mgmtSetSchemaFromSuperTable(pMeta->schema, pTable->superTable); + strncpy(pMeta->stableId, pTable->superTable->info.tableId, tListLen(pMeta->stableId)); + } else { + pMeta->sversion = htons(pTable->sversion); + pMeta->numOfTags = 0; + pMeta->numOfColumns = htons((int16_t)pTable->numOfColumns); + pMeta->contLen = sizeof(STableMetaMsg) + mgmtSetSchemaFromNormalTable(pMeta->schema, pTable); + } + + SVgObj *pVgroup = pMsg->pVgroup = mgmtGetVgroup(pTable->vgId); + if (pVgroup == NULL) { + mError("table:%s, failed to get table meta, db not selected", pTable->info.tableId); + return TSDB_CODE_INVALID_VGROUP_ID; + } + + for (int32_t i = 0; i < TSDB_VNODES_SUPPORT; ++i) { + if (usePublicIp) { + pMeta->vpeerDesc[i].ip = pVgroup->vnodeGid[i].publicIp; + } else { + pMeta->vpeerDesc[i].ip = pVgroup->vnodeGid[i].privateIp; + } + pMeta->vpeerDesc[i].vnode = htonl(pVgroup->vnodeGid[i].vnode); + } + pMeta->numOfVpeers = pVgroup->numOfVnodes; + + mTrace("table:%s, uid:%" PRIu64 " table meta is retrieved", pTable->info.tableId, pTable->uid); + + return TSDB_CODE_SUCCESS; +} + +void mgmtGetChildTableMeta(SQueuedMsg *pMsg) { + SChildTableObj *pTable = (SChildTableObj *)pMsg->pTable; + SCMTableInfoMsg *pInfo = pMsg->pCont; + SDbObj *pDb = pMsg->pDb; + if (pDb == NULL || pDb->dirty) { + mError("table:%s, failed to get table meta, db not selected", pInfo->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_DB_NOT_SELECTED); + return; + } + + if (pTable == NULL) { + if (htons(pInfo->createFlag) != 1) { + mError("table:%s, failed to get table meta, table not exist", pInfo->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_TABLE); + return; + } else { + //TODO: on demand create table from super table if table does not exists + int32_t contLen = sizeof(SCMCreateTableMsg) + sizeof(STagData); + SCMCreateTableMsg *pCreateMsg = rpcMallocCont(contLen); + if (pCreateMsg == NULL) { + mError("table:%s, failed to create table while get meta info, no enough memory", pInfo->tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); + return; + } + memcpy(pCreateMsg->schema, pInfo->tags, sizeof(STagData)); + strcpy(pCreateMsg->tableId, pInfo->tableId); + + SQueuedMsg *newMsg = malloc(sizeof(SQueuedMsg)); + memcpy(newMsg, pMsg, sizeof(SQueuedMsg)); + pMsg->pCont = NULL; + + newMsg->ahandle = newMsg->pCont; + newMsg->pCont = pCreateMsg; + mTrace("table:%s, start to create in demand", pInfo->tableId); + mgmtAddToShellQueue(newMsg); + return; + } + } + + STableMetaMsg *pMeta = rpcMallocCont(sizeof(STableMetaMsg) + sizeof(SSchema) * TSDB_MAX_COLUMNS); + if (pMeta == NULL) { + mError("table:%s, failed to get table meta, no enough memory", pTable->info.tableId); + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); + return; + } + + mgmtDoGetChildTableMeta(pMsg, pMeta); + + SRpcMsg rpcRsp = { + .handle = pMsg->thandle, + .pCont = pMeta, + .contLen = pMeta->contLen, + }; + pMeta->contLen = htons(pMeta->contLen); + rpcSendResponse(&rpcRsp); +} + +void mgmtDropAllChildTables(SDbObj *pDropDb) { + void *pNode = NULL; + void *pLastNode = NULL; + int32_t numOfTables = 0; + int32_t dbNameLen = strlen(pDropDb->name); + SChildTableObj *pTable = NULL; + + while (1) { + mgmtDecTableRef(pTable); + pNode = sdbFetchRow(tsChildTableSdb, pNode, (void **)&pTable); + if (pTable == NULL) { + break; + } + + if (strncmp(pDropDb->name, pTable->info.tableId, dbNameLen) == 0) { + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_LOCAL, + .table = tsChildTableSdb, + .pObj = pTable, + }; + sdbDeleteRow(&oper); + pNode = pLastNode; + numOfTables++; + continue; + } + } + + mTrace("db:%s, all child tables:%d is dropped from sdb", pDropDb->name, numOfTables); +} + +static void mgmtDropAllChildTablesInStable(SSuperTableObj *pStable) { + void *pNode = NULL; + void *pLastNode = NULL; + int32_t numOfTables = 0; + SChildTableObj *pTable = NULL; + + while (1) { + mgmtDecTableRef(pTable); + pNode = sdbFetchRow(tsChildTableSdb, pNode, (void **)&pTable); + if (pTable == NULL) { + break; + } + + if (pTable->superTable == pStable) { + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_LOCAL, + .table = tsChildTableSdb, + .pObj = pTable, + }; + sdbDeleteRow(&oper); + pNode = pLastNode; + numOfTables++; + continue; + } + } + + mTrace("stable:%s, all child tables:%d is dropped from sdb", pStable->info.tableId, numOfTables); +} + +static SChildTableObj* mgmtGetTableByPos(uint32_t dnodeId, int32_t vnode, int32_t sid) { + SDnodeObj *pObj = mgmtGetDnode(dnodeId); + SVgObj *pVgroup = mgmtGetVgroup(vnode); + + if (pObj == NULL || pVgroup == NULL) { + return NULL; + } + + SChildTableObj *pTable = pVgroup->tableList[sid]; + mgmtIncTableRef((STableInfo *)pTable); + mgmtDecVgroupRef(pVgroup); + return pTable; +} + +static void mgmtProcessTableCfgMsg(SRpcMsg *rpcMsg) { + if (mgmtCheckRedirect(rpcMsg->handle)) return; + + SDMConfigTableMsg *pCfg = (SDMConfigTableMsg *) rpcMsg->pCont; + pCfg->dnode = htonl(pCfg->dnode); + pCfg->vnode = htonl(pCfg->vnode); + pCfg->sid = htonl(pCfg->sid); + mTrace("dnode:%s, vnode:%d, sid:%d, receive table config msg", taosIpStr(pCfg->dnode), pCfg->vnode, pCfg->sid); + + SChildTableObj *pTable = mgmtGetTableByPos(pCfg->dnode, pCfg->vnode, pCfg->sid); + if (pTable == NULL) { + mError("dnode:%s, vnode:%d, sid:%d, table not found", taosIpStr(pCfg->dnode), pCfg->vnode, pCfg->sid); + mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_NOT_ACTIVE_TABLE); + return; + } + + mgmtSendSimpleResp(rpcMsg->handle, TSDB_CODE_SUCCESS); + + SMDCreateTableMsg *pMDCreate = NULL; + pMDCreate = mgmtBuildCreateChildTableMsg(NULL, (SChildTableObj *) pTable); + if (pMDCreate == NULL) { + mgmtDecTableRef(pTable); + return; + } + + SRpcIpSet ipSet = mgmtGetIpSetFromIp(pCfg->dnode); + SRpcMsg rpcRsp = { + .handle = NULL, + .pCont = pMDCreate, + .contLen = htonl(pMDCreate->contLen), + .code = 0, + .msgType = TSDB_MSG_TYPE_MD_CREATE_TABLE + }; + mgmtSendMsgToDnode(&ipSet, &rpcRsp); + mgmtDecTableRef(pTable); +} + +// handle drop child response +static void mgmtProcessDropChildTableRsp(SRpcMsg *rpcMsg) { + if (rpcMsg->handle == NULL) return; + + SQueuedMsg *queueMsg = rpcMsg->handle; + queueMsg->received++; + + SChildTableObj *pTable = queueMsg->ahandle; + mTrace("table:%s, drop table rsp received, thandle:%p result:%s", pTable->info.tableId, queueMsg->thandle, tstrerror(rpcMsg->code)); + + if (rpcMsg->code != TSDB_CODE_SUCCESS) { + mError("table:%s, failed to drop in dnode, reason:%s", pTable->info.tableId, tstrerror(rpcMsg->code)); + mgmtSendSimpleResp(queueMsg->thandle, rpcMsg->code); + free(queueMsg); + mgmtDecTableRef(pTable); + return; + } + + SVgObj *pVgroup = queueMsg->pVgroup = mgmtGetVgroup(pTable->vgId); + if (pVgroup == NULL) { + mError("table:%s, failed to get vgroup", pTable->info.tableId); + mgmtSendSimpleResp(queueMsg->thandle, TSDB_CODE_INVALID_VGROUP_ID); + return; + } + + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_GLOBAL, + .table = tsChildTableSdb, + .pObj = pTable + }; + + int32_t code = sdbDeleteRow(&oper); + if (code != TSDB_CODE_SUCCESS) { + mError("table:%s, update ctables sdb error", pTable->info.tableId); + mgmtSendSimpleResp(queueMsg->thandle, TSDB_CODE_SDB_ERROR); + return; + } + + if (pVgroup->numOfTables <= 0) { + mPrint("vgroup:%d, all tables is dropped, drop vgroup", pVgroup->vgId); + mgmtDropVgroup(pVgroup, NULL); + } + + mgmtSendSimpleResp(queueMsg->thandle, TSDB_CODE_SUCCESS); + mgmtFreeQueuedMsg(queueMsg); +} + +// handle create table response from dnode +// if failed, drop the table cached +static void mgmtProcessCreateChildTableRsp(SRpcMsg *rpcMsg) { + if (rpcMsg->handle == NULL) return; + + SQueuedMsg *queueMsg = rpcMsg->handle; + queueMsg->received++; + + SChildTableObj *pTable = queueMsg->ahandle; + mTrace("table:%s, create table rsp received, thandle:%p ahandle:%p result:%s", pTable->info.tableId, queueMsg->thandle, + rpcMsg->handle, tstrerror(rpcMsg->code)); + + if (rpcMsg->code != TSDB_CODE_SUCCESS) { + SSdbOperDesc oper = { + .type = SDB_OPER_TYPE_GLOBAL, + .table = tsChildTableSdb, + .pObj = pTable + }; + sdbDeleteRow(&oper); + + mError("table:%s, failed to create in dnode, reason:%s", pTable->info.tableId, tstrerror(rpcMsg->code)); + mgmtSendSimpleResp(queueMsg->thandle, rpcMsg->code); + } else { + mTrace("table:%s, created in dnode", pTable->info.tableId); + if (queueMsg->msgType != TSDB_MSG_TYPE_CM_CREATE_TABLE) { + mTrace("table:%s, start to get meta", pTable->info.tableId); + mgmtAddToShellQueue(mgmtCloneQueuedMsg(queueMsg)); + } else { + mgmtSendSimpleResp(queueMsg->thandle, rpcMsg->code); + } + } + + mgmtFreeQueuedMsg(queueMsg); +} + +// not implemented yet +static void mgmtProcessAlterTableRsp(SRpcMsg *rpcMsg) { + mTrace("alter table rsp received, handle:%p code:%d", rpcMsg->handle, rpcMsg->code); +} + +static void mgmtProcessMultiTableMetaMsg(SQueuedMsg *pMsg) { + SRpcConnInfo connInfo; + if (rpcGetConnInfo(pMsg->thandle, &connInfo) != 0) { + mError("conn:%p is already released while get mulit table meta", pMsg->thandle); + return; + } + + bool usePublicIp = (connInfo.serverIp == tsPublicIpInt); + SUserObj *pUser = mgmtGetUser(connInfo.user); + if (pUser == NULL) { + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_USER); + return; + } + + SCMMultiTableInfoMsg *pInfo = pMsg->pCont; + pInfo->numOfTables = htonl(pInfo->numOfTables); + + int32_t totalMallocLen = 4*1024*1024; // first malloc 4 MB, subsequent reallocation as twice + SMultiTableMeta *pMultiMeta = rpcMallocCont(totalMallocLen); + if (pMultiMeta == NULL) { + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_SERV_OUT_OF_MEMORY); + return; + } + + pMultiMeta->contLen = sizeof(SMultiTableMeta); + pMultiMeta->numOfTables = 0; + + for (int t = 0; t < pInfo->numOfTables; ++t) { + char *tableId = (char*)(pInfo->tableIds + t * TSDB_TABLE_ID_LEN); + SChildTableObj *pTable = mgmtGetChildTable(tableId); + if (pTable == NULL) continue; + + SDbObj *pDb = mgmtGetDbByTableId(tableId); + if (pDb == NULL) continue; + + int availLen = totalMallocLen - pMultiMeta->contLen; + if (availLen <= sizeof(STableMetaMsg) + sizeof(SSchema) * TSDB_MAX_COLUMNS) { + //TODO realloc + //totalMallocLen *= 2; + //pMultiMeta = rpcReMalloc(pMultiMeta, totalMallocLen); + //if (pMultiMeta == NULL) { + /// rpcSendResponse(ahandle, TSDB_CODE_SERV_OUT_OF_MEMORY, NULL, 0); + // return TSDB_CODE_SERV_OUT_OF_MEMORY; + //} else { + // t--; + // continue; + //} + } + + STableMetaMsg *pMeta = (STableMetaMsg *)(pMultiMeta->metas + pMultiMeta->contLen); + int32_t code = mgmtDoGetChildTableMeta(pMsg, pMeta); + if (code == TSDB_CODE_SUCCESS) { + pMultiMeta->numOfTables ++; + pMultiMeta->contLen += pMeta->contLen; + } + } + + SRpcMsg rpcRsp = {0}; + rpcRsp.handle = pMsg->thandle; + rpcRsp.pCont = pMultiMeta; + rpcRsp.contLen = pMultiMeta->contLen; + rpcSendResponse(&rpcRsp); +} + +// show tables +static int32_t mgmtGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { + SDbObj *pDb = mgmtGetDb(pShow->db); + if (pDb == NULL) return TSDB_CODE_DB_NOT_SELECTED; + + int32_t cols = 0; + SSchema *pSchema = pMeta->schema; + + pShow->bytes[cols] = TSDB_TABLE_NAME_LEN; + pSchema[cols].type = TSDB_DATA_TYPE_BINARY; + strcpy(pSchema[cols].name, "table name"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = 8; + pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP; + strcpy(pSchema[cols].name, "create time"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = 2; + pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT; + strcpy(pSchema[cols].name, "columns"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pShow->bytes[cols] = TSDB_TABLE_NAME_LEN; + pSchema[cols].type = TSDB_DATA_TYPE_BINARY; + strcpy(pSchema[cols].name, "stable name"); + pSchema[cols].bytes = htons(pShow->bytes[cols]); + cols++; + + pMeta->numOfColumns = htons(cols); + 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 = pDb->numOfTables; + pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; + + mgmtDecDbRef(pDb); + return 0; +} + +static void mgmtVacuumResult(char *data, int32_t numOfCols, int32_t rows, int32_t capacity, SShowObj *pShow) { + if (rows < capacity) { + for (int32_t i = 0; i < numOfCols; ++i) { + memmove(data + pShow->offset[i] * rows, data + pShow->offset[i] * capacity, pShow->bytes[i] * rows); + } + } +} + +static int32_t mgmtRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows, void *pConn) { + SDbObj *pDb = mgmtGetDb(pShow->db); + if (pDb == NULL) return 0; + + int32_t numOfRows = 0; + SChildTableObj *pTable = NULL; + SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; + + char prefix[64] = {0}; + strcpy(prefix, pDb->name); + strcat(prefix, TS_PATH_DELIMITER); + int32_t prefixLen = strlen(prefix); + + while (numOfRows < rows) { + mgmtDecTableRef(pTable); + pShow->pNode = sdbFetchRow(tsChildTableSdb, pShow->pNode, (void **) &pTable); + if (pTable == NULL) break; + + // not belong to current db + if (strncmp(pTable->info.tableId, prefix, prefixLen)) { + continue; + } + + char tableName[TSDB_TABLE_NAME_LEN] = {0}; + memset(tableName, 0, tListLen(tableName)); + + // pattern compare for meter name + mgmtExtractTableName(pTable->info.tableId, tableName); + + if (pShow->payloadLen > 0 && + patternMatch(pShow->payload, tableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) { + continue; + } + + int32_t cols = 0; + + char *pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + strncpy(pWrite, tableName, TSDB_TABLE_NAME_LEN); + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + *(int64_t *) pWrite = pTable->createdTime; + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + if (pTable->info.type == TSDB_CHILD_TABLE) { + *(int16_t *)pWrite = pTable->superTable->numOfColumns; + } else { + *(int16_t *)pWrite = pTable->numOfColumns; + } + + cols++; + + pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; + if (pTable->info.type == TSDB_CHILD_TABLE) { + mgmtExtractTableName(pTable->superTableId, pWrite); + } + cols++; + + numOfRows++; + } + + pShow->numOfReads += numOfRows; + const int32_t NUM_OF_COLUMNS = 4; + + mgmtVacuumResult(data, NUM_OF_COLUMNS, numOfRows, rows, pShow); + mgmtDecDbRef(pDb); + + return numOfRows; +} + +void mgmtAlterChildTable(SQueuedMsg *pMsg) { + SChildTableObj *pTable = (SChildTableObj *)pMsg->pTable; + int32_t code = TSDB_CODE_OPS_NOT_SUPPORT; + SCMAlterTableMsg *pAlter = pMsg->pCont;; + + if (pAlter->type == TSDB_ALTER_TABLE_UPDATE_TAG_VAL) { + code = mgmtModifyChildTableTagValueByName(pTable, pAlter->schema[0].name, pAlter->tagVal); + } else if (pAlter->type == TSDB_ALTER_TABLE_ADD_COLUMN) { + code = mgmtAddNormalTableColumn(pTable, pAlter->schema, 1); + } else if (pAlter->type == TSDB_ALTER_TABLE_DROP_COLUMN) { + code = mgmtDropNormalTableColumnByName(pTable, pAlter->schema[0].name); + } else { + } + + mgmtSendSimpleResp(pMsg->thandle, code); } \ No newline at end of file diff --git a/src/mnode/src/mgmtUser.c b/src/mnode/src/mgmtUser.c index c497fd6e8fd9182c9790a9f4b9e4c3507e468b92..04b2a9ad2b7d6b20df5f46bc2096027b2b311dfc 100644 --- a/src/mnode/src/mgmtUser.c +++ b/src/mnode/src/mgmtUser.c @@ -25,14 +25,10 @@ #include "mgmtShell.h" #include "mgmtUser.h" -void * tsUserSdb = NULL; +static void * tsUserSdb = NULL; static int32_t tsUserUpdateSize = 0; - -static int32_t mgmtDropUser(SAcctObj *pAcct, char *name); -static int32_t mgmtUpdateUser(SUserObj *pUser); static int32_t mgmtGetUserMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn); static int32_t mgmtRetrieveUsers(SShowObj *pShow, char *data, int32_t rows, void *pConn); - static void mgmtProcessCreateUserMsg(SQueuedMsg *pMsg); static void mgmtProcessAlterUserMsg(SQueuedMsg *pMsg); static void mgmtProcessDropUserMsg(SQueuedMsg *pMsg); @@ -101,6 +97,7 @@ int32_t mgmtInitUsers() { .tableName = "users", .hashSessions = TSDB_MAX_USERS, .maxRowSize = tsUserUpdateSize, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, .keyType = SDB_KEY_TYPE_STRING, .insertFp = mgmtUserActionInsert, .deleteFp = mgmtUserActionDelete, @@ -120,6 +117,7 @@ int32_t mgmtInitUsers() { mgmtCreateUser(pAcct, "root", "taosdata"); mgmtCreateUser(pAcct, "monitor", tsInternalPass); mgmtCreateUser(pAcct, "_root", tsInternalPass); + acctDecRef(pAcct); mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_CREATE_USER, mgmtProcessCreateUserMsg); mgmtAddShellMsgHandle(TSDB_MSG_TYPE_CM_ALTER_USER, mgmtProcessAlterUserMsg); @@ -139,6 +137,14 @@ SUserObj *mgmtGetUser(char *name) { return (SUserObj *)sdbGetRow(tsUserSdb, name); } +void mgmtIncUserRef(SUserObj *pUser) { + return sdbIncRef(tsUserSdb, pUser); +} + +void mgmtDecUserRef(SUserObj *pUser) { + return sdbDecRef(tsUserSdb, pUser); +} + static int32_t mgmtUpdateUser(SUserObj *pUser) { SSdbOperDesc oper = { .type = SDB_OPER_TYPE_GLOBAL, @@ -149,7 +155,6 @@ static int32_t mgmtUpdateUser(SUserObj *pUser) { int32_t code = sdbUpdateRow(&oper); if (code != TSDB_CODE_SUCCESS) { - tfree(pUser); code = TSDB_CODE_SDB_ERROR; } @@ -166,9 +171,10 @@ int32_t mgmtCreateUser(SAcctObj *pAcct, char *name, char *pass) { return TSDB_CODE_INVALID_MSG; } - SUserObj *pUser = (SUserObj *)sdbGetRow(tsUserSdb, name); + SUserObj *pUser = mgmtGetUser(name); if (pUser != NULL) { mTrace("user:%s is already there", name); + mgmtDecUserRef(pUser); return TSDB_CODE_USER_ALREADY_EXIST; } @@ -204,19 +210,7 @@ int32_t mgmtCreateUser(SAcctObj *pAcct, char *name, char *pass) { return code; } -static int32_t mgmtDropUser(SAcctObj *pAcct, char *name) { - SUserObj *pUser; - - pUser = (SUserObj *)sdbGetRow(tsUserSdb, name); - if (pUser == NULL) { - mWarn("user:%s is not there", name); - return TSDB_CODE_INVALID_USER; - } - - if (strcmp(pAcct->user, pUser->acct) != 0) { - return TSDB_CODE_NO_RIGHTS; - } - +static int32_t mgmtDropUser(SUserObj *pUser) { SSdbOperDesc oper = { .type = SDB_OPER_TYPE_GLOBAL, .table = tsUserSdb, @@ -268,9 +262,9 @@ static int32_t mgmtGetUserMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pCon } pShow->numOfRows = pUser->pAcct->acctInfo.numOfUsers; - pShow->pNode = pUser->pAcct->pUser; pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1]; + mgmtDecUserRef(pUser); return 0; } @@ -281,10 +275,9 @@ static int32_t mgmtRetrieveUsers(SShowObj *pShow, char *data, int32_t rows, void char *pWrite; while (numOfRows < rows) { - pUser = (SUserObj *)pShow->pNode; + pShow->pNode = sdbFetchRow(tsUserSdb, pShow->pNode, (void **) &pUser); if (pUser == NULL) break; - pShow->pNode = (void *)pUser->next; - + cols = 0; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; @@ -306,6 +299,7 @@ static int32_t mgmtRetrieveUsers(SShowObj *pShow, char *data, int32_t rows, void cols++; numOfRows++; + mgmtDecUserRef(pUser); } pShow->numOfReads += numOfRows; return numOfRows; @@ -357,6 +351,7 @@ static void mgmtProcessAlterUserMsg(SQueuedMsg *pMsg) { if (strcmp(pUser->user, "monitor") == 0 || (strcmp(pUser->user + 1, pUser->acct) == 0 && pUser->user[0] == '_')) { mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); + mgmtDecUserRef(pUser); return; } @@ -386,10 +381,7 @@ static void mgmtProcessAlterUserMsg(SQueuedMsg *pMsg) { } mgmtSendSimpleResp(pMsg->thandle, code); - return; - } - - if ((pAlter->flag & TSDB_ALTER_USER_PRIVILEGES) != 0) { + } else if ((pAlter->flag & TSDB_ALTER_USER_PRIVILEGES) != 0) { bool hasRight = false; if (strcmp(pUser->user, "root") == 0) { @@ -431,10 +423,11 @@ static void mgmtProcessAlterUserMsg(SQueuedMsg *pMsg) { } mgmtSendSimpleResp(pMsg->thandle, code); - return; + } else { + mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); } - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); + mgmtDecUserRef(pUser); } static void mgmtProcessDropUserMsg(SQueuedMsg *pMsg) { @@ -453,6 +446,7 @@ static void mgmtProcessDropUserMsg(SQueuedMsg *pMsg) { if (strcmp(pUser->user, "monitor") == 0 || strcmp(pUser->user, pUser->acct) == 0 || (strcmp(pUser->user + 1, pUser->acct) == 0 && pUser->user[0] == '_')) { mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_NO_RIGHTS); + mgmtDecUserRef(pUser); return ; } @@ -464,9 +458,7 @@ static void mgmtProcessDropUserMsg(SQueuedMsg *pMsg) { } else if (strcmp(pUser->user, pOperUser->user) == 0) { hasRight = false; } else if (pOperUser->superAuth) { - if (strcmp(pUser->user, "root") == 0) { - hasRight = false; - } else if (strcmp(pOperUser->acct, pUser->acct) != 0) { + if (strcmp(pOperUser->acct, pUser->acct) != 0) { hasRight = false; } else { hasRight = true; @@ -474,22 +466,23 @@ static void mgmtProcessDropUserMsg(SQueuedMsg *pMsg) { } if (hasRight) { - code = mgmtDropUser(pUser->pAcct, pDrop->user); + code = mgmtDropUser(pUser); if (code == TSDB_CODE_SUCCESS) { - mLPrint("user:%s is dropped by %s, result:%d", pUser->user, pOperUser->user, tstrerror(code)); + mLPrint("user:%s is dropped by %s, result:%s", pUser->user, pOperUser->user, tstrerror(code)); } } else { code = TSDB_CODE_NO_RIGHTS; } mgmtSendSimpleResp(pMsg->thandle, code); + mgmtDecUserRef(pUser); } void mgmtDropAllUsers(SAcctObj *pAcct) { - void *pNode = NULL; - void *pLastNode = NULL; - int32_t numOfUsers = 0; - int32_t acctNameLen = strlen(pAcct->user); + void * pNode = NULL; + void * pLastNode = NULL; + int32_t numOfUsers = 0; + int32_t acctNameLen = strlen(pAcct->user); SUserObj *pUser = NULL; while (1) { @@ -506,8 +499,9 @@ void mgmtDropAllUsers(SAcctObj *pAcct) { sdbDeleteRow(&oper); pNode = pLastNode; numOfUsers++; - continue; } + + mgmtDecUserRef(pUser); } mTrace("acct:%s, all users:%d is dropped from sdb", pAcct->user, numOfUsers); diff --git a/src/mnode/src/mgmtVgroup.c b/src/mnode/src/mgmtVgroup.c index 7e46b61d0c4bc1b14035bb56f91f3e56f7bebcb8..9c1ba2326f0e3071104814bcda6084c96b231d48 100644 --- a/src/mnode/src/mgmtVgroup.c +++ b/src/mnode/src/mgmtVgroup.c @@ -20,7 +20,6 @@ #include "tstatus.h" #include "mnode.h" #include "mgmtBalance.h" -#include "mgmtChildTable.h" #include "mgmtDb.h" #include "mgmtDClient.h" #include "mgmtDnode.h" @@ -71,6 +70,7 @@ static int32_t mgmtVgroupActionInsert(SSdbOperDesc *pOper) { if (pDb == NULL) { return TSDB_CODE_INVALID_DB; } + mgmtDecDbRef(pDb); pVgroup->pDb = pDb; pVgroup->prev = NULL; @@ -110,6 +110,7 @@ static int32_t mgmtVgroupActionDelete(SSdbOperDesc *pOper) { mgmtRemoveVgroupFromDb(pVgroup); } + mgmtDecDbRef(pVgroup->pDb); return TSDB_CODE_SUCCESS; } @@ -159,6 +160,7 @@ int32_t mgmtInitVgroups() { .tableName = "vgroups", .hashSessions = TSDB_MAX_VGROUPS, .maxRowSize = tsVgUpdateSize, + .refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj, .keyType = SDB_KEY_TYPE_AUTO, .insertFp = mgmtVgroupActionInsert, .deleteFp = mgmtVgroupActionDelete, @@ -184,6 +186,14 @@ int32_t mgmtInitVgroups() { return 0; } +void mgmtIncVgroupRef(SVgObj *pVgroup) { + return sdbIncRef(tsVgroupSdb, pVgroup); +} + +void mgmtDecVgroupRef(SVgObj *pVgroup) { + return sdbDecRef(tsVgroupSdb, pVgroup); +} + SVgObj *mgmtGetVgroup(int32_t vgId) { return (SVgObj *)sdbGetRow(tsVgroupSdb, &vgId); } @@ -192,15 +202,7 @@ SVgObj *mgmtGetAvailableVgroup(SDbObj *pDb) { return pDb->pHead; } -void mgmtCreateVgroup(SQueuedMsg *pMsg) { - SDbObj *pDb = pMsg->pDb; - if (pDb == NULL) { - mError("failed to create vgroup, db not found"); - mgmtSendSimpleResp(pMsg->thandle, TSDB_CODE_INVALID_DB); - mgmtFreeQueuedMsg(pMsg); - return; - } - +void mgmtCreateVgroup(SQueuedMsg *pMsg, SDbObj *pDb) { SVgObj *pVgroup = (SVgObj *)calloc(1, sizeof(SVgObj)); strcpy(pVgroup->dbName, pDb->name); pVgroup->numOfVnodes = pDb->cfg.replications; @@ -287,16 +289,16 @@ int32_t mgmtGetVgroupMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { int32_t maxReplica = 0; SVgObj *pVgroup = NULL; - SChildTableObj *pTable = NULL; + STableInfo *pTable = NULL; if (pShow->payloadLen > 0 ) { - pTable = mgmtGetChildTable(pShow->payload); - if (NULL == pTable) { + pTable = mgmtGetTable(pShow->payload); + if (NULL == pTable || pTable->type == TSDB_SUPER_TABLE) { return TSDB_CODE_INVALID_TABLE_ID; } - pVgroup = mgmtGetVgroup(pTable->vgId); + pVgroup = mgmtGetVgroup(((SChildTableObj*)pTable)->vgId); if (NULL == pVgroup) return TSDB_CODE_INVALID_TABLE_ID; - + mgmtDecTableRef(pTable); maxReplica = pVgroup->numOfVnodes > maxReplica ? pVgroup->numOfVnodes : maxReplica; } else { SVgObj *pVgroup = pDb->pHead; @@ -445,7 +447,8 @@ void mgmtAddTableIntoVgroup(SVgObj *pVgroup, SChildTableObj *pTable) { taosIdPoolMarkStatus(pVgroup->idPool, pTable->sid); pVgroup->numOfTables++; } - + + mgmtIncVgroupRef(pVgroup); if (pVgroup->numOfTables >= pVgroup->pDb->cfg.maxSessions) mgmtAddVgroupIntoDbTail(pVgroup); } @@ -457,6 +460,7 @@ void mgmtRemoveTableFromVgroup(SVgObj *pVgroup, SChildTableObj *pTable) { pVgroup->numOfTables--; } + mgmtDecVgroupRef(pVgroup); if (pVgroup->numOfTables >= pVgroup->pDb->cfg.maxSessions) mgmtAddVgroupIntoDbTail(pVgroup); } @@ -554,15 +558,7 @@ static void mgmtProcessCreateVnodeRsp(SRpcMsg *rpcMsg) { if (queueMsg->received != queueMsg->expected) return; if (queueMsg->received == queueMsg->successed) { - SQueuedMsg *newMsg = calloc(1, sizeof(SQueuedMsg)); - newMsg->msgType = queueMsg->msgType; - newMsg->thandle = queueMsg->thandle; - newMsg->pDb = queueMsg->pDb; - newMsg->pUser = queueMsg->pUser; - newMsg->contLen = queueMsg->contLen; - newMsg->pCont = rpcMallocCont(newMsg->contLen); - memcpy(newMsg->pCont, queueMsg->pCont, newMsg->contLen); - queueMsg->pCont = NULL; + SQueuedMsg *newMsg = mgmtCloneQueuedMsg(queueMsg); mgmtAddToShellQueue(newMsg); } else { SSdbOperDesc oper = { @@ -641,7 +637,6 @@ static void mgmtProcessDropVnodeRsp(SRpcMsg *rpcMsg) { SQueuedMsg *newMsg = calloc(1, sizeof(SQueuedMsg)); newMsg->msgType = queueMsg->msgType; newMsg->thandle = queueMsg->thandle; - newMsg->pDb = queueMsg->pDb; newMsg->pUser = queueMsg->pUser; newMsg->contLen = queueMsg->contLen; newMsg->pCont = rpcMallocCont(newMsg->contLen); diff --git a/tests/script/basicSuite.sim b/tests/script/basicSuite.sim index e735099181984d5f58fd67d971c080e6216cfd8c..87b504fb969f486744b78161e5b90e961f58641d 100644 --- a/tests/script/basicSuite.sim +++ b/tests/script/basicSuite.sim @@ -1,4 +1,5 @@ ################################# -run general/user/testSuite.sim -run general/table/testSuite.sim +run general/user/basic1.sim +run general/db/basic1.sim +run general/table/basic1.sim ################################## diff --git a/tests/script/general/db/basic1.sim b/tests/script/general/db/basic1.sim new file mode 100644 index 0000000000000000000000000000000000000000..094c1a693012607714cb655e1b0f729666a53634 --- /dev/null +++ b/tests/script/general/db/basic1.sim @@ -0,0 +1,59 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== create database +sql create database d1 +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 0 then + return -1 +endi + +if $data03 != 0 then + return -1 +endi + +print =============== drop database +sql drop database d1 +sql show databases +if $rows != 0 then + return -1 +endi + +print =============== more databases +sql create database d2 +sql create database d3 +sql create database d4 +sql show databases +if $rows != 3 then + return -1 +endi + +print =============== drop database +sql drop database d2 +sql drop database d3 +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d4 then + return -1 +endi + +if $data02 != 0 then + return -1 +endi + +if $data03 != 0 then + return -1 +endi \ No newline at end of file diff --git a/tests/script/general/db/basic2.sim b/tests/script/general/db/basic2.sim new file mode 100644 index 0000000000000000000000000000000000000000..a1e45337076823c6739851976f8a1dea70a180f9 --- /dev/null +++ b/tests/script/general/db/basic2.sim @@ -0,0 +1,51 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== create database d1 +sql create database d1 +sql use d1 +sql create table t1 (ts timestamp, i int); +sql create table t2 (ts timestamp, i int); +sql create table t3 (ts timestamp, i int); +sql create table t4 (ts timestamp, i int); + +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 4 then + return -1 +endi + +if $data03 != 1 then + return -1 +endi + +sql show tables +if $rows != 4 then + return -1 +endi + +print =============== create database d2 +sql create database d2 +sql use d2 +sql create table t1 (ts timestamp, i int); +sql create table t2 (ts timestamp, i int); +sql create table t3 (ts timestamp, i int); + +sql show databases +if $rows != 2 then + return -1 +endi + +sql show tables +if $rows != 3 then + return -1 +endi diff --git a/tests/script/general/db/basic3.sim b/tests/script/general/db/basic3.sim new file mode 100644 index 0000000000000000000000000000000000000000..60ff4b74c73fb5f47022e442819a68b6f130a41e --- /dev/null +++ b/tests/script/general/db/basic3.sim @@ -0,0 +1,49 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== create database d1 +sql create database d1 +sql create table d1.t1 (ts timestamp, i int); +sql create table d1.t2 (ts timestamp, i int); +sql create table d1.t3 (ts timestamp, i int); +sql create table d1.t4 (ts timestamp, i int); + +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 4 then + return -1 +endi + +if $data03 != 1 then + return -1 +endi + +sql show d1.tables +if $rows != 4 then + return -1 +endi + +print =============== create database d2 +sql create database d2 +sql create table d2.t1 (ts timestamp, i int); +sql create table d2.t2 (ts timestamp, i int); +sql create table d2.t3 (ts timestamp, i int); + +sql show databases +if $rows != 2 then + return -1 +endi + +sql show d2.tables +if $rows != 3 then + return -1 +endi diff --git a/tests/script/general/db/basic4.sim b/tests/script/general/db/basic4.sim new file mode 100644 index 0000000000000000000000000000000000000000..f620112cfb71f361d3b6c0e7cbc962bca96b7d7f --- /dev/null +++ b/tests/script/general/db/basic4.sim @@ -0,0 +1,118 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== create database d1 +sql create database d1 +sql create table d1.t1 (ts timestamp, i int); +sql create table d1.t2 (ts timestamp, i int); +sql create table d1.t3 (ts timestamp, i int); +sql create table d1.t4 (ts timestamp, i int); + +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 4 then + return -1 +endi + +if $data03 != 1 then + return -1 +endi + +sql show d1.tables +if $rows != 4 then + return -1 +endi + +sql show d1.vgroups +if $rows != 1 then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data01 != 4 then + return -1 +endi +if $data02 != ready then + return -1 +endi + +print =============== drop table +sql drop table d1.t1 + +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 3 then + return -1 +endi + +if $data03 != 1 then + return -1 +endi + +sql show d1.tables +if $rows != 3 then + return -1 +endi + +sql show d1.vgroups +if $rows != 1 then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data01 != 3 then + return -1 +endi +if $data02 != ready then + return -1 +endi + +print =============== drop all table +sql drop table d1.t2 +sql drop table d1.t3 +sql drop table d1.t4 + +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 0 then + return -1 +endi + +if $data03 != 0 then + return -1 +endi + +sql show d1.tables +if $rows != 0 then + return -1 +endi + +sql show d1.vgroups +if $rows != 0 then + return -1 +endi diff --git a/tests/script/general/db/basic5.sim b/tests/script/general/db/basic5.sim new file mode 100644 index 0000000000000000000000000000000000000000..ec619389bd011132a04c67882b5f5c38561e2c40 --- /dev/null +++ b/tests/script/general/db/basic5.sim @@ -0,0 +1,57 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== create database d1 +sql create database d1 +sql create table d1.t1 (ts timestamp, i int); +sql create table d1.t2 (ts timestamp, i int); +sql create table d1.t3 (ts timestamp, i int); +sql create table d1.t4 (ts timestamp, i int); + +sql show databases +if $rows != 1 then + return -1 +endi + +if $data00 != d1 then + return -1 +endi + +if $data02 != 4 then + return -1 +endi + +if $data03 != 1 then + return -1 +endi + +sql show d1.tables +if $rows != 4 then + return -1 +endi + +sql show d1.vgroups +if $rows != 1 then + return -1 +endi +if $data00 != 1 then + return -1 +endi +if $data01 != 4 then + return -1 +endi +if $data02 != ready then + return -1 +endi + +print =============== drop table +sql drop database d1 + +sql show databases +if $rows != 0 then + return -1 +endi + +sql_error show d1.vgroups diff --git a/tests/script/general/table/basic1.sim b/tests/script/general/table/basic1.sim new file mode 100644 index 0000000000000000000000000000000000000000..00e11483da294ffba06161690f95684552b20ead --- /dev/null +++ b/tests/script/general/table/basic1.sim @@ -0,0 +1,71 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== create database +sql create database d1 +sql show databases +if $rows != 1 then + return -1 +endi + +print $data00 $data01 $data02 + +print =============== create normal table +sql create table d1.n1 (ts timestamp, i int) +sql show d1.tables +if $rows != 1 then + return -1 +endi + +print $data00 $data01 $data02 + +print =============== create super table +sql create table d1.st (ts timestamp, i int) tags (j int) +sql show d1.stables +if $rows != 1 then + return -1 +endi + +print $data00 $data01 $data02 + +print =============== create child table +sql create table d1.c1 using d1.st tags(1) +sql create table d1.c2 using d1.st tags(2) +sql show d1.tables +if $rows != 3 then + return -1 +endi + +print $data00 $data01 $data02 +print $data10 $data11 $data22 +print $data20 $data11 $data22 + +print =============== insert data +sql insert into d1.n1 values(now, 1) +sql insert into d1.n1 values(now, 2) +sql insert into d1.n1 values(now, 3) + +print =============== query data +sql select * from d1.n1 +if $rows != 3 then + return -1 +endi + +print $data00 $data01 +print $data10 $data11 +print $data20 $data11 + +if $data01 != 1 then + return -1 +endi + +if $data11 != 2 then + return -1 +endi + +if $data21 != 3 then + return -1 +endi + diff --git a/tests/script/general/table/basic2.sim b/tests/script/general/table/basic2.sim new file mode 100644 index 0000000000000000000000000000000000000000..7701ca1c1fb5575d0fc6613b948b2bdbcd7a38fa --- /dev/null +++ b/tests/script/general/table/basic2.sim @@ -0,0 +1,66 @@ +system sh/stop_dnodes.sh +system sh/deploy.sh -n dnode1 -m 192.168.0.1 -i 192.168.0.1 +system sh/exec.sh -n dnode1 -s start +sql connect + +print =============== one table +sql create database d1 +sql create table d1.n1 (ts timestamp, i int) +sql create table d1.n2 (ts timestamp, i int) +sql create table d1.n3 (ts timestamp, i int) +sql create table d1.n4 (ts timestamp, i int) + +sql drop table d1.n1 +sql drop table d1.n2 + +sql show d1.tables +if $rows != 2 then + return -1 +endi + +print =============== show +sql show databases +if $data02 != 2 then + return -1 +endi + +if $data03 != 1 then + return -1 +endi + +sql show d1.vgroups +if $data00 != 1 then + return -1 +endi + +if $data01 != 2 then + return -1 +endi + +print =============== insert data1 +sql_error insert into d1.n1 values(now, 1) +sql_error insert into d1.n2 values(now, 1) + +print =============== insert data2 +sql insert into d1.n3 values(now, 1) +sql insert into d1.n3 values(now, 2) +sql insert into d1.n3 values(now, 3) + +print =============== query data +sql select * from d1.n3 +if $rows != 3 then + return -1 +endi + +if $data01 != 1 then + return -1 +endi + +if $data11 != 2 then + return -1 +endi + +if $data21 != 3 then + return -1 +endi + diff --git a/tests/script/general/table/basic.sim b/tests/script/general/table/basic3.sim similarity index 100% rename from tests/script/general/table/basic.sim rename to tests/script/general/table/basic3.sim diff --git a/tests/script/general/table/testSuite.sim b/tests/script/general/table/testSuite.sim deleted file mode 100644 index 32677ab1ac9c4a2916ffe6df4fe8d36deea0b2fe..0000000000000000000000000000000000000000 --- a/tests/script/general/table/testSuite.sim +++ /dev/null @@ -1,3 +0,0 @@ -################################# -run general/table/basic.sim -################################## diff --git a/tests/script/general/user/basic.sim b/tests/script/general/user/basic1.sim similarity index 100% rename from tests/script/general/user/basic.sim rename to tests/script/general/user/basic1.sim diff --git a/tests/script/general/user/testSuite.sim b/tests/script/general/user/testSuite.sim deleted file mode 100644 index 99414f1d293439c0852292f3ede03474e6fde3b9..0000000000000000000000000000000000000000 --- a/tests/script/general/user/testSuite.sim +++ /dev/null @@ -1,3 +0,0 @@ -################################# -#run general/user/basic.sim -################################## diff --git a/tests/script/jenkins/basic1.txt b/tests/script/jenkins/basic1.txt new file mode 100644 index 0000000000000000000000000000000000000000..ef6d4e239b90879f7899bb22e54aa1b60e072266 --- /dev/null +++ b/tests/script/jenkins/basic1.txt @@ -0,0 +1,11 @@ +./test.sh -f general/user/basic1.sim + +./test.sh -f general/db/basic1.sim +./test.sh -f general/db/basic2.sim +./test.sh -f general/db/basic3.sim +./test.sh -f general/db/basic4.sim +./test.sh -f general/db/basic5.sim + +./test.sh -f general/table/basic1.sim +./test.sh -f general/table/basic2.sim +./test.sh -f general/table/basic3.sim \ No newline at end of file diff --git a/tests/script/sh/deploy.sh b/tests/script/sh/deploy.sh index d990adaf5f652729db0a377c996d752ca3f940da..0192b189796d303af88fc8d8f5dbccbb49297bfd 100755 --- a/tests/script/sh/deploy.sh +++ b/tests/script/sh/deploy.sh @@ -92,7 +92,7 @@ echo "internalIp $NODE_IP" >> $TAOS_CFG echo "privateIp $NODE_IP" >> $TAOS_CFG echo "dDebugFlag 135" >> $TAOS_CFG echo "mDebugFlag 199" >> $TAOS_CFG -echo "sdbDebugFlag 135" >> $TAOS_CFG +echo "sdbDebugFlag 199" >> $TAOS_CFG echo "rpcDebugFlag 135" >> $TAOS_CFG echo "tmrDebugFlag 131" >> $TAOS_CFG echo "cDebugFlag 135" >> $TAOS_CFG diff --git a/tests/script/tjenkins b/tests/script/tjenkins new file mode 100755 index 0000000000000000000000000000000000000000..b05ab3c9009be2c79e47f69e4df877cf009bf8c1 Binary files /dev/null and b/tests/script/tjenkins differ