From 05ce45e76ed5aa0b18fa57c5fab455030583d271 Mon Sep 17 00:00:00 2001 From: hjxilinx Date: Tue, 17 Dec 2019 13:46:31 +0800 Subject: [PATCH] fix the bugs in issue #932. [tbase-1353] --- src/client/src/tscServer.c | 105 +++++++++++++++++------------ src/inc/taoserror.h | 3 +- src/inc/taosmsg.h | 4 +- src/rpc/src/tstring.c | 7 +- src/system/detail/src/vnodeRead.c | 4 +- src/system/detail/src/vnodeShell.c | 32 +++++---- 6 files changed, 91 insertions(+), 64 deletions(-) diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 40399d85b7..5b25947dc8 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1482,6 +1482,46 @@ static int32_t tscEstimateQueryMsgSize(SSqlCmd *pCmd) { return size; } +static char* doSerializeTableInfo(SSqlObj* pSql, int32_t numOfMeters, int32_t vnodeId, char* pMsg) { + SMeterMetaInfo *pMeterMetaInfo = tscGetMeterMetaInfo(&pSql->cmd, 0); + + SMeterMeta * pMeterMeta = pMeterMetaInfo->pMeterMeta; + SMetricMeta *pMetricMeta = pMeterMetaInfo->pMetricMeta; + + tscTrace("%p vid:%d, query on %d meters", pSql, htons(vnodeId), numOfMeters); + if (UTIL_METER_IS_NOMRAL_METER(pMeterMetaInfo)) { +#ifdef _DEBUG_VIEW + tscTrace("%p sid:%d, uid:%lld", pSql, pMeterMetaInfo->pMeterMeta->sid, pMeterMetaInfo->pMeterMeta->uid); +#endif + SMeterSidExtInfo *pMeterInfo = (SMeterSidExtInfo *)pMsg; + pMeterInfo->sid = htonl(pMeterMeta->sid); + pMeterInfo->uid = htobe64(pMeterMeta->uid); + + pMsg += sizeof(SMeterSidExtInfo); + } else { + SVnodeSidList *pVnodeSidList = tscGetVnodeSidList(pMetricMeta, pMeterMetaInfo->vnodeIndex); + + for (int32_t i = 0; i < numOfMeters; ++i) { + SMeterSidExtInfo *pMeterInfo = (SMeterSidExtInfo *)pMsg; + SMeterSidExtInfo *pQueryMeterInfo = tscGetMeterSidInfo(pVnodeSidList, i); + + pMeterInfo->sid = htonl(pQueryMeterInfo->sid); + pMeterInfo->uid = htobe64(pQueryMeterInfo->uid); + + pMsg += sizeof(SMeterSidExtInfo); + + memcpy(pMsg, pQueryMeterInfo->tags, pMetricMeta->tagLen); + pMsg += pMetricMeta->tagLen; + +#ifdef _DEBUG_VIEW + tscTrace("%p sid:%d, uid:%lld", pSql, pQueryMeterInfo->sid, pQueryMeterInfo->uid); +#endif + } + } + + return pMsg; +} + int tscBuildQueryMsg(SSqlObj *pSql) { SSqlCmd *pCmd = &pSql->cmd; @@ -1512,7 +1552,7 @@ int tscBuildQueryMsg(SSqlObj *pSql) { pQueryMsg->vnode = htons(pMeterMeta->vpeerDesc[pMeterMeta->index].vnode); pQueryMsg->uid = pMeterMeta->uid; pQueryMsg->numOfTagsCols = 0; - } else { // query on metric + } else { // query on super table if (pMeterMetaInfo->vnodeIndex < 0) { tscError("%p error vnodeIdx:%d", pSql, pMeterMetaInfo->vnodeIndex); return -1; @@ -1699,34 +1739,8 @@ int tscBuildQueryMsg(SSqlObj *pSql) { pQueryMsg->colNameLen = htonl(len); - // set sids list - tscTrace("%p vid:%d, query on %d meters", pSql, htons(pQueryMsg->vnode), numOfMeters); - if (UTIL_METER_IS_NOMRAL_METER(pMeterMetaInfo)) { -#ifdef _DEBUG_VIEW - - tscTrace("%p %d", pSql, pMeterMetaInfo->pMeterMeta->sid); -#endif - SMeterSidExtInfo *pSMeterTagInfo = (SMeterSidExtInfo *)pMsg; - pSMeterTagInfo->sid = htonl(pMeterMeta->sid); - pMsg += sizeof(SMeterSidExtInfo); - } else { - SVnodeSidList *pVnodeSidList = tscGetVnodeSidList(pMetricMeta, pMeterMetaInfo->vnodeIndex); - - for (int32_t i = 0; i < numOfMeters; ++i) { - SMeterSidExtInfo *pMeterTagInfo = (SMeterSidExtInfo *)pMsg; - SMeterSidExtInfo *pQueryMeterInfo = tscGetMeterSidInfo(pVnodeSidList, i); - - pMeterTagInfo->sid = htonl(pQueryMeterInfo->sid); - pMsg += sizeof(SMeterSidExtInfo); - -#ifdef _DEBUG_VIEW - tscTrace("%p %d", pSql, pQueryMeterInfo->sid); -#endif - - memcpy(pMsg, pQueryMeterInfo->tags, pMetricMeta->tagLen); - pMsg += pMetricMeta->tagLen; - } - } + // serialize the table info (sid, uid, tags) + pMsg = doSerializeTableInfo(pSql, numOfMeters, htons(pQueryMsg->vnode), pMsg); // only include the required tag column schema. If a tag is not required, it won't be sent to vnode if (pMeterMetaInfo->numOfTags > 0) { @@ -3226,44 +3240,47 @@ int tscProcessMetricMetaRsp(SSqlObj *pSql) { size += pMeta->numOfVnodes * sizeof(SVnodeSidList *) + pMeta->numOfMeters * sizeof(SMeterSidExtInfo *); - char *pStr = calloc(1, size); - if (pStr == NULL) { + char *pBuf = calloc(1, size); + if (pBuf == NULL) { pSql->res.code = TSDB_CODE_CLI_OUT_OF_MEMORY; goto _error_clean; } - SMetricMeta *pNewMetricMeta = (SMetricMeta *)pStr; + SMetricMeta *pNewMetricMeta = (SMetricMeta *)pBuf; metricMetaList[k] = pNewMetricMeta; pNewMetricMeta->numOfMeters = pMeta->numOfMeters; pNewMetricMeta->numOfVnodes = pMeta->numOfVnodes; pNewMetricMeta->tagLen = pMeta->tagLen; - pStr = pStr + sizeof(SMetricMeta) + pNewMetricMeta->numOfVnodes * sizeof(SVnodeSidList *); + pBuf = pBuf + sizeof(SMetricMeta) + pNewMetricMeta->numOfVnodes * sizeof(SVnodeSidList *); for (int32_t i = 0; i < pMeta->numOfVnodes; ++i) { SVnodeSidList *pSidLists = (SVnodeSidList *)rsp; - memcpy(pStr, pSidLists, sizeof(SVnodeSidList)); + memcpy(pBuf, pSidLists, sizeof(SVnodeSidList)); - pNewMetricMeta->list[i] = pStr - (char *)pNewMetricMeta; // offset value - SVnodeSidList *pLists = (SVnodeSidList *)pStr; + pNewMetricMeta->list[i] = pBuf - (char *)pNewMetricMeta; // offset value + SVnodeSidList *pLists = (SVnodeSidList *)pBuf; tscTrace("%p metricmeta:vid:%d,numOfMeters:%d", pSql, i, pLists->numOfSids); - pStr += sizeof(SVnodeSidList) + sizeof(SMeterSidExtInfo *) * pSidLists->numOfSids; + pBuf += sizeof(SVnodeSidList) + sizeof(SMeterSidExtInfo *) * pSidLists->numOfSids; rsp += sizeof(SVnodeSidList); - size_t sidSize = sizeof(SMeterSidExtInfo) + pNewMetricMeta->tagLen; + size_t elemSize = sizeof(SMeterSidExtInfo) + pNewMetricMeta->tagLen; for (int32_t j = 0; j < pSidLists->numOfSids; ++j) { - pLists->pSidExtInfoList[j] = pStr - (char *)pLists; - memcpy(pStr, rsp, sidSize); - - rsp += sidSize; - pStr += sidSize; + pLists->pSidExtInfoList[j] = pBuf - (char *)pLists; + memcpy(pBuf, rsp, elemSize); + + ((SMeterSidExtInfo*) pBuf)->uid = htobe64(((SMeterSidExtInfo*) pBuf)->uid); + ((SMeterSidExtInfo*) pBuf)->sid = htonl(((SMeterSidExtInfo*) pBuf)->sid); + + rsp += elemSize; + pBuf += elemSize; } } - sizes[k] = pStr - (char *)pNewMetricMeta; + sizes[k] = pBuf - (char *)pNewMetricMeta; } for (int32_t i = 0; i < num; ++i) { diff --git a/src/inc/taoserror.h b/src/inc/taoserror.h index 5fee1d7da5..2bee153955 100644 --- a/src/inc/taoserror.h +++ b/src/inc/taoserror.h @@ -136,8 +136,9 @@ extern "C" { #define TSDB_CODE_INVALID_TABLE_ID 115 #define TSDB_CODE_INVALID_VNODE_STATUS 116 #define TSDB_CODE_FAILED_TO_LOCK_RESOURCES 117 +#define TSDB_CODE_TABLE_ID_MISMATCH 118 -#define TSDB_CODE_MAX_ERROR_CODE 118 +#define TSDB_CODE_MAX_ERROR_CODE 119 #ifdef __cplusplus } diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index 895cf23cf8..8d2121e3de 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -487,7 +487,7 @@ typedef struct SColumnInfo { */ typedef struct SMeterSidExtInfo { int32_t sid; - void * pObj; + int64_t uid; char tags[]; } SMeterSidExtInfo; @@ -724,9 +724,7 @@ typedef struct { int32_t numOfMeters; int32_t join; int32_t joinCondLen; // for join condition - int32_t metaElem[TSDB_MAX_JOIN_TABLE_NUM]; - } SMetricMetaMsg; typedef struct { diff --git a/src/rpc/src/tstring.c b/src/rpc/src/tstring.c index 63f65b882f..a4fc2b2c71 100644 --- a/src/rpc/src/tstring.c +++ b/src/rpc/src/tstring.c @@ -238,8 +238,9 @@ char *tsError[] = {"success", "only super table has metric meta info", "tags value not unique for join", "invalid submit message", - "not active table(not created yet or dropped already)", //114 - "invalid table id", - "invalid vnode status", //116 + "not active table(not created yet or dropped already)", + "invalid table id", // 115 + "invalid vnode status", "failed to lock resources", + "table id/uid mismatch", // 118 }; diff --git a/src/system/detail/src/vnodeRead.c b/src/system/detail/src/vnodeRead.c index d062f1c712..927b5850f3 100644 --- a/src/system/detail/src/vnodeRead.c +++ b/src/system/detail/src/vnodeRead.c @@ -1097,10 +1097,12 @@ int32_t vnodeConvertQueryMeterMsg(SQueryMeterMsg *pQueryMsg) { pSids[0] = (SMeterSidExtInfo *)pMsg; pSids[0]->sid = htonl(pSids[0]->sid); - + pSids[0]->uid = htobe64(pSids[0]->uid); + for (int32_t j = 1; j < pQueryMsg->numOfSids; ++j) { pSids[j] = (SMeterSidExtInfo *)((char *)pSids[j - 1] + sizeof(SMeterSidExtInfo) + pQueryMsg->tagLength); pSids[j]->sid = htonl(pSids[j]->sid); + pSids[j]->uid = htobe64(pSids[j]->uid); } pMsg = (char *)pSids[pQueryMsg->numOfSids - 1]; diff --git a/src/system/detail/src/vnodeShell.c b/src/system/detail/src/vnodeShell.c index 5efbb41014..030bd0cdf4 100644 --- a/src/system/detail/src/vnodeShell.c +++ b/src/system/detail/src/vnodeShell.c @@ -28,7 +28,7 @@ #include "vnodeRead.h" #include "vnodeUtil.h" #include "vnodeStore.h" -#include "tstatus.h" +#include "vnodeStatus.h" extern int tsMaxQueues; @@ -297,7 +297,7 @@ int vnodeProcessQueryRequest(char *pMsg, int msgLen, SShellObj *pObj) { } if (pQueryMsg->vnode >= TSDB_MAX_VNODES || pQueryMsg->vnode < 0) { - dTrace("qmsg:%p,vid:%d is out of range", pQueryMsg, pQueryMsg->vnode); + dError("qmsg:%p,vid:%d is out of range", pQueryMsg, pQueryMsg->vnode); code = TSDB_CODE_INVALID_TABLE_ID; goto _query_over; } @@ -312,31 +312,39 @@ int vnodeProcessQueryRequest(char *pMsg, int msgLen, SShellObj *pObj) { } if (!(pVnode->accessState & TSDB_VN_READ_ACCCESS)) { + dError("qmsg:%p,vid:%d access not allowed", pQueryMsg, pQueryMsg->vnode); code = TSDB_CODE_NO_READ_ACCESS; goto _query_over; } - - if (pQueryMsg->pSidExtInfo == 0) { - dTrace("qmsg:%p,SQueryMeterMsg wrong format", pQueryMsg); - code = TSDB_CODE_INVALID_QUERY_MSG; - goto _query_over; - } - + if (pVnode->meterList == NULL) { dError("qmsg:%p,vid:%d has been closed", pQueryMsg, pQueryMsg->vnode); code = TSDB_CODE_NOT_ACTIVE_VNODE; goto _query_over; } + if (pQueryMsg->pSidExtInfo == 0) { + dError("qmsg:%p,SQueryMeterMsg wrong format", pQueryMsg); + code = TSDB_CODE_INVALID_QUERY_MSG; + goto _query_over; + } + pSids = (SMeterSidExtInfo **)pQueryMsg->pSidExtInfo; for (int32_t i = 0; i < pQueryMsg->numOfSids; ++i) { if (pSids[i]->sid >= pVnode->cfg.maxSessions || pSids[i]->sid < 0) { - dTrace("qmsg:%p sid:%d is out of range, valid range:[%d,%d]", pQueryMsg, pSids[i]->sid, 0, - pVnode->cfg.maxSessions); - + dError("qmsg:%p sid:%d out of range, valid range:[%d,%d]", pQueryMsg, pSids[i]->sid, 0, pVnode->cfg.maxSessions); code = TSDB_CODE_INVALID_TABLE_ID; goto _query_over; } + + SMeterObj* pMeterObj = pVnode->meterList[pSids[i]->sid]; + if (pMeterObj->uid != pSids[i]->uid || pMeterObj->sid != pSids[i]->sid) { // uid/sid not match, error in query msg + dError("qmsg:%p sid/uid mismatch, vid:%d sid:%d id:%s uid:%" ", in msg sid:%d, uid:%lld", pQueryMsg, + pQueryMsg->vnode, pMeterObj->sid, pMeterObj->meterId, pMeterObj->uid, pSids[i]->sid, pSids[i]->uid); + + code = TSDB_CODE_TABLE_ID_MISMATCH; + goto _query_over; + } } // todo optimize for single table query process -- GitLab