From d232d7133cd32176b6b6371424a41436833a4235 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Fri, 5 Jun 2020 06:50:29 +0000 Subject: [PATCH 01/55] extract KV store --- src/util/inc/tkvstore.h | 60 +++++++++ src/util/src/tkvstore.c | 288 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 348 insertions(+) create mode 100644 src/util/inc/tkvstore.h create mode 100644 src/util/src/tkvstore.c diff --git a/src/util/inc/tkvstore.h b/src/util/inc/tkvstore.h new file mode 100644 index 0000000000..724c94e21d --- /dev/null +++ b/src/util/inc/tkvstore.h @@ -0,0 +1,60 @@ +/* + * 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 _TD_KVSTORE_H_ +#define _TD_KVSTORE_H_ + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +typedef int (*iterFunc)(void *, void *cont, int contLen); +typedef void (*afterFunc)(void *); + +typedef struct { + int64_t size; + int64_t tombSize; + int64_t nRecords; + int64_t nDels; +} SStoreInfo; + +typedef struct { + char * fname; + int fd; + char * fsnap; + int sfd; + char * fnew; + int nfd; + SHashObj * map; + iterFunc iFunc; + afterFunc aFunc; + void * appH; + SStoreInfo info; +} SKVStore; + +int tdCreateKVStore(char *fname); +int tdDestroyKVStore(); +SKVStore *tdOpenKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH); +void tdCloseKVStore(SKVStore *pStore); +int tdKVStoreStartCommit(SKVStore *pStore); +int tdUpdateRecordInKVStore(SKVStore *pStore, uint64_t uid, void *cont, int contLen); +int tdKVStoreEndCommit(SKVStore *pStore); + +#ifdef __cplusplus +} +#endif + +#endif \ No newline at end of file diff --git a/src/util/src/tkvstore.c b/src/util/src/tkvstore.c new file mode 100644 index 0000000000..30052a379f --- /dev/null +++ b/src/util/src/tkvstore.c @@ -0,0 +1,288 @@ +/* + * 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 . + */ +#include +#include +#include +#include +#include +#include +#include + +#include "hash.h" +#include "os.h" +#include "taoserror.h" +#include "tchecksum.h" +#include "tcoding.h" +#include "tkvstore.h" +#include "tulog.h" + +#define TD_KVSTORE_HEADER_SIZE 512 +#define TD_KVSTORE_MAJOR_VERSION 1 +#define TD_KVSTORE_MAINOR_VERSION 0 +#define TD_KVSTORE_SNAP_SUFFIX ".snap" +#define TD_KVSTORE_NEW_SUFFIX ".new" + +static int tdInitKVStoreHeader(int fd, char *fname); +static void * tdEncodeStoreInfo(void *buf, SStoreInfo *pInfo); +// static void * tdDecodeStoreInfo(void *buf, SStoreInfo *pInfo); +static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH); +static char * tdGetKVStoreSnapshotFname(char *fdata); +static char * tdGetKVStoreNewFname(char *fdata); +static void tdFreeKVStore(SKVStore *pStore); + +int tdCreateKVStore(char *fname) { + char *tname = strdup(fname); + if (tname == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; + + int fd = open(fname, O_RDWR | O_CREAT, 0755); + if (fd < 0) { + uError("failed to open file %s since %s", fname, strerror(errno)); + return TAOS_SYSTEM_ERROR(errno); + } + + int code = tdInitKVStoreHeader(fd, fname); + if (code != TSDB_CODE_SUCCESS) return code; + + if (fsync(fd) < 0) { + uError("failed to fsync file %s since %s", fname, strerror(errno)); + return TAOS_SYSTEM_ERROR(errno); + } + + if (close(fd) < 0) { + uError("failed to close file %s since %s", fname, strerror(errno)); + return TAOS_SYSTEM_ERROR(errno); + } + + return TSDB_CODE_SUCCESS; +} + +SKVStore *tdOpenKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH) { + SKVStore *pStore = tdNewKVStore(fname, iFunc, aFunc, appH); + if (pStore == NULL) return NULL; + + pStore->fd = open(pStore->fname, O_RDWR); + if (pStore->fd < 0) { + uError("failed to open file %s since %s", pStore->fname, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + if (access(pStore->fsnap, F_OK) == 0) { + uTrace("file %s exists, try to recover the KV store", pStore->fsnap); + pStore->sfd = open(pStore->fsnap, O_RDONLY); + if (pStore->sfd < 0) { + uError("failed to open file %s since %s", pStore->fsnap, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + // TODO: rewind the file + + close(pStore->sfd); + pStore->sfd = -1; + remove(pStore->fsnap); + } + + // TODO: Recover from the file + + return pStore; + +_err: + if (pStore->fd > 0) { + close(pStore->fd); + pStore->fd = -1; + } + if (pStore->sfd > 0) { + close(pStore->sfd); + pStore->sfd = -1; + } + tdFreeKVStore(pStore); + return NULL; +} + +int tdKVStoreStartCommit(SKVStore *pStore) { + pStore->fd = open(pStore->fname, O_RDWR); + if (pStore->fd < 0) { + uError("failed to open file %s since %s", pStore->fname, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + pStore->sfd = open(pStore->fsnap, O_WRONLY | O_CREAT, 0755); + if (pStore->sfd < 0) { + uError("failed to open file %s since %s", pStore->fsnap, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + if (tsendfile(pStore->sfd, pStore->fd, NULL, TD_KVSTORE_HEADER_SIZE) < TD_KVSTORE_HEADER_SIZE) { + uError("failed to send file %d bytes since %s", TD_KVSTORE_HEADER_SIZE, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + if (fsync(pStore->sfd) < 0) { + uError("failed to fsync file %s since %s", pStore->fsnap, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + + if (close(pStore->sfd) < 0) { + uError("failed to close file %s since %s", pStore->fsnap, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + goto _err; + } + pStore->sfd = -1; + + return 0; + +_err: + if (pStore->sfd > 0) { + close(pStore->sfd); + pStore->sfd = -1; + remove(pStore->fsnap); + } + if (pStore->fd > 0) { + close(pStore->fd); + pStore->fd = -1; + } + return -1; +} + +int tdKVStoreEndCommit(SKVStore *pStore) { + ASSERT(pStore->fd > 0); + + if (fsync(pStore->fd) < 0) { + uError("failed to fsync file %s since %s", pStore->fname, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; + } + + if (close(pStore->fd) < 0) { + uError("failed to close file %s since %s", pStore->fname, strerror(errno)); + terrno = TAOS_SYSTEM_ERROR(errno); + return -1; + } + + remove(pStore->fsnap); + return 0; +} + +static int tdUpdateKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo) { + char buf[TD_KVSTORE_HEADER_SIZE] = "\0"; + + if (lseek(fd, 0, SEEK_SET) < 0) { + uError("failed to lseek file %s since %s", fname, strerror(errno)); + return TAOS_SYSTEM_ERROR(errno); + } + + tdEncodeStoreInfo(buf, pInfo); + taosCalcChecksumAppend(0, (uint8_t *)buf, TD_KVSTORE_HEADER_SIZE); + if (twrite(fd, buf, TD_KVSTORE_HEADER_SIZE) < TD_KVSTORE_HEADER_SIZE) { + uError("failed to write file %s %d bytes since %s", fname, TD_KVSTORE_HEADER_SIZE, strerror(errno)); + return TAOS_SYSTEM_ERROR(errno); + } + + return TSDB_CODE_SUCCESS; +} + +static int tdInitKVStoreHeader(int fd, char *fname) { + SStoreInfo info = {TD_KVSTORE_HEADER_SIZE, 0, 0, 0}; + + return tdUpdateKVStoreHeader(fd, fname, &info); +} + +static void *tdEncodeStoreInfo(void *buf, SStoreInfo *pInfo) { + buf = taosEncodeVariantI64(buf, pInfo->size); + buf = taosEncodeVariantI64(buf, pInfo->tombSize); + buf = taosEncodeVariantI64(buf, pInfo->nRecords); + buf = taosEncodeVariantI64(buf, pInfo->nDels); + + return buf; +} + +// static void *tdDecodeStoreInfo(void *buf, SStoreInfo *pInfo) { +// buf = taosDecodeVariantI64(buf, &(pInfo->size)); +// buf = taosDecodeVariantI64(buf, &(pInfo->tombSize)); +// buf = taosDecodeVariantI64(buf, &(pInfo->nRecords)); +// buf = taosDecodeVariantI64(buf, &(pInfo->nDels)); + +// return buf; +// } + +static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void *appH) { + SKVStore *pStore = (SKVStore *)malloc(sizeof(SKVStore)); + if (pStore == NULL) goto _err; + + pStore->fname = strdup(fname); + if (pStore->map == NULL) goto _err; + + pStore->fsnap = tdGetKVStoreSnapshotFname(fname); + if (pStore->fsnap == NULL) goto _err; + + pStore->fnew = tdGetKVStoreNewFname(fname); + if (pStore->fnew == NULL) goto _err; + + pStore->fd = -1; + pStore->sfd = -1; + pStore->nfd = -1; + pStore->iFunc = iFunc; + pStore->aFunc = aFunc; + pStore->appH = appH; + pStore->map = taosHashInit(4096, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false); + if (pStore->map == NULL) { + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + goto _err; + } + + return pStore; + +_err: + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + tdFreeKVStore(pStore); + return NULL; +} + +static void tdFreeKVStore(SKVStore *pStore) { + if (pStore) { + tfree(pStore->fname); + tfree(pStore->fsnap); + tfree(pStore->fnew); + taosHashCleanup(pStore->map); + free(pStore); + } +} + +static char *tdGetKVStoreSnapshotFname(char *fdata) { + size_t size = strlen(fdata) + strlen(TD_KVSTORE_SNAP_SUFFIX) + 1; + char * fname = malloc(size); + if (fname == NULL) { + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + return NULL; + } + sprintf(fname, "%s%s", fdata, TD_KVSTORE_SNAP_SUFFIX); + return fname; +} + +static char *tdGetKVStoreNewFname(char *fdata) { + size_t size = strlen(fdata) + strlen(TD_KVSTORE_NEW_SUFFIX) + 1; + char * fname = malloc(size); + if (fname == NULL) { + terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + return NULL; + } + sprintf(fname, "%s%s", fdata, TD_KVSTORE_NEW_SUFFIX); + return fname; +} \ No newline at end of file From 6520c28514cfacf88eacc69f3e9d5931d836ad1c Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Sat, 6 Jun 2020 07:17:57 +0000 Subject: [PATCH 02/55] update kv store header --- src/util/src/tkvstore.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/util/src/tkvstore.c b/src/util/src/tkvstore.c index 30052a379f..741f953310 100644 --- a/src/util/src/tkvstore.c +++ b/src/util/src/tkvstore.c @@ -41,6 +41,7 @@ static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void static char * tdGetKVStoreSnapshotFname(char *fdata); static char * tdGetKVStoreNewFname(char *fdata); static void tdFreeKVStore(SKVStore *pStore); +static int tdUpdateKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo); int tdCreateKVStore(char *fname) { char *tname = strdup(fname); @@ -164,6 +165,9 @@ _err: int tdKVStoreEndCommit(SKVStore *pStore) { ASSERT(pStore->fd > 0); + terrno = tdUpdateKVStoreHeader(pStore->fd, pStore->fname, &(pStore->info)); + if (terrno != TSDB_CODE_SUCCESS) return -1; + if (fsync(pStore->fd) < 0) { uError("failed to fsync file %s since %s", pStore->fname, strerror(errno)); terrno = TAOS_SYSTEM_ERROR(errno); From b3389e268c83992012adbd5eecfc9bcca84eb341 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 8 Jun 2020 14:25:18 +0800 Subject: [PATCH 03/55] [td-535] --- src/client/src/tscAsync.c | 47 +++++++++++++++++++--------------- src/client/src/tscServer.c | 52 ++++++++------------------------------ 2 files changed, 38 insertions(+), 61 deletions(-) diff --git a/src/client/src/tscAsync.c b/src/client/src/tscAsync.c index ebcdddffde..6d591f3615 100644 --- a/src/client/src/tscAsync.c +++ b/src/client/src/tscAsync.c @@ -443,15 +443,17 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) { } if (pSql->pStream == NULL) { - // check if it is a sub-query of super table query first, if true, enter another routine SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex); - - if ((pQueryInfo->type & TSDB_QUERY_TYPE_STABLE_SUBQUERY) == TSDB_QUERY_TYPE_STABLE_SUBQUERY) { + + // check if it is a sub-query of super table query first, if true, enter another routine + if (TSDB_QUERY_HAS_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_STABLE_SUBQUERY)) { + tscTrace("%p update table meta in local cache, continue to process sql and send corresponding subquery", pSql); + STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); if (pTableMetaInfo->pTableMeta == NULL){ code = tscGetTableMeta(pSql, pTableMetaInfo); assert(code == TSDB_CODE_SUCCESS); - } + } assert((tscGetNumOfTags(pTableMetaInfo->pTableMeta) != 0) && pTableMetaInfo->vgroupIndex >= 0 && pSql->param != NULL); @@ -461,32 +463,37 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) { assert(pParObj->signature == pParObj && trs->subqueryIndex == pTableMetaInfo->vgroupIndex && tscGetNumOfTags(pTableMetaInfo->pTableMeta) != 0); - tscTrace("%p get metricMeta during super table query successfully", pSql); - - code = tscGetSTableVgroupInfo(pSql, 0); - pRes->code = code; - - if (code == TSDB_CODE_ACTION_IN_PROGRESS) return; - } else { // normal async query continues + // NOTE: the vgroupInfo for the queried super table must be existed here. + assert(pTableMetaInfo->vgroupList != NULL); + if ((code = tscProcessSql(pSql)) == TSDB_CODE_SUCCESS) { + return; + } + } else { // continue to process normal async query if (pCmd->parseFinished) { - tscTrace("%p re-send data to vnode in table Meta callback since sql parsed completed", pSql); - + tscTrace("%p update table meta in local cache, continue to process sql and send corresponding query", pSql); + STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); code = tscGetTableMeta(pSql, pTableMetaInfo); assert(code == TSDB_CODE_SUCCESS); - - if (pTableMetaInfo->pTableMeta) { - // todo update the submit message according to the new table meta - // 1. table uid, 2. ip address - code = tscSendMsgToServer(pSql); - if (code == TSDB_CODE_SUCCESS) return; + + // if failed to process sql, go to error handler + if ((code = tscProcessSql(pSql)) == TSDB_CODE_SUCCESS) { + return; } +// // todo update the submit message according to the new table meta +// // 1. table uid, 2. ip address +// code = tscSendMsgToServer(pSql); +// if (code == TSDB_CODE_SUCCESS) return; +// } } else { + tscTrace("%p continue parse sql after get table meta", pSql); + code = tsParseSql(pSql, false); - if ((pQueryInfo->type & TSDB_QUERY_TYPE_STMT_INSERT) == TSDB_QUERY_TYPE_STMT_INSERT) { + if (TSDB_QUERY_HAS_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_STMT_INSERT)) { STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); code = tscGetTableMeta(pSql, pTableMetaInfo); assert(code == TSDB_CODE_SUCCESS && pTableMetaInfo->pTableMeta != NULL); + (*pSql->fp)(pSql->param, pSql, code); return; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 39b9350284..d0f6d6f171 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -430,7 +430,7 @@ void tscKillSTableQuery(SSqlObj *pSql) { /* * here, we cannot set the command = TSDB_SQL_KILL_QUERY. Otherwise, it may cause - * sub-queries not correctly released and master sql object of metric query reaches an abnormal state. + * sub-queries not correctly released and master sql object of super table query reaches an abnormal state. */ pSql->pSubs[i]->res.code = TSDB_CODE_QUERY_CANCELLED; //taosStopRpcConn(pSql->pSubs[i]->thandle); @@ -564,7 +564,7 @@ static char *doSerializeTableInfo(SQueryTableMsg* pQueryMsg, SSqlObj *pSql, char pQueryMsg->numOfTables = htonl(1); // set the number of tables pMsg += sizeof(STableIdInfo); - } else { + } else { // it is a subquery of the super table query, this IP info is acquired from vgroupInfo int32_t index = pTableMetaInfo->vgroupIndex; int32_t numOfVgroups = taosArrayGetSize(pTableMetaInfo->pVgroupTables); assert(index >= 0 && index < numOfVgroups); @@ -1821,7 +1821,7 @@ int tscProcessTableMetaRsp(SSqlObj *pSql) { return TSDB_CODE_CLI_OUT_OF_MEMORY; } - tscTrace("%p recv table meta: %"PRId64 ", tid:%d, name:%s", pSql, pTableMeta->uid, pTableMeta->sid, pTableMetaInfo->name); + tscTrace("%p recv table meta, uid:%"PRId64 ", tid:%d, name:%s", pSql, pTableMeta->uid, pTableMeta->sid, pTableMetaInfo->name); free(pTableMeta); return TSDB_CODE_SUCCESS; @@ -2388,56 +2388,26 @@ int tscGetMeterMetaEx(SSqlObj *pSql, STableMetaInfo *pTableMetaInfo, bool create return tscGetTableMeta(pSql, pTableMetaInfo); } -/* - * in handling the renew metermeta problem during insertion, - * - * If the meter is created on demand during insertion, the routine usually waits for a short - * period to re-issue the getMeterMeta msg, in which makes a greater change that vnode has - * successfully created the corresponding table. - */ -static void tscWaitingForCreateTable(SSqlCmd *pCmd) { - if (pCmd->command == TSDB_SQL_INSERT) { - taosMsleep(50); // todo: global config - } -} - /** - * in renew metermeta, do not retrieve metadata in cache. + * retrieve table meta from mnode, and update the local table meta cache. * @param pSql sql object - * @param tableId meter id + * @param tableId table full name * @return status code */ int tscRenewMeterMeta(SSqlObj *pSql, char *tableId) { - int code = 0; - - // handle table meta renew process SSqlCmd *pCmd = &pSql->cmd; SQueryInfo * pQueryInfo = tscGetQueryInfoDetail(pCmd, 0); STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); - /* - * 1. only update the metermeta in force model metricmeta is not updated - * 2. if get metermeta failed, still get the metermeta - */ - if (pTableMetaInfo->pTableMeta == NULL || !tscQueryOnSTable(pCmd)) { - STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; - if (pTableMetaInfo->pTableMeta) { - tscTrace("%p update table meta, old: numOfTags:%d, numOfCols:%d, uid:%" PRId64 ", addr:%p", pSql, - tscGetNumOfTags(pTableMeta), tscGetNumOfColumns(pTableMeta), pTableMeta->uid, pTableMeta); - } - - tscWaitingForCreateTable(pCmd); - taosCacheRelease(tscCacheHandle, (void **)&(pTableMetaInfo->pTableMeta), true); - - code = getTableMetaFromMgmt(pSql, pTableMetaInfo); // todo ?? - } else { - tscTrace("%p metric query not update metric meta, numOfTags:%d, numOfCols:%d, uid:%" PRId64 ", addr:%p", pSql, - tscGetNumOfTags(pTableMetaInfo->pTableMeta), pCmd->numOfCols, pTableMetaInfo->pTableMeta->uid, - pTableMetaInfo->pTableMeta); + STableMeta* pTableMeta = pTableMetaInfo->pTableMeta; + if (pTableMetaInfo->pTableMeta) { + tscTrace("%p update table meta, old meta numOfTags:%d, numOfCols:%d, uid:%" PRId64 ", addr:%p", pSql, + tscGetNumOfTags(pTableMeta), tscGetNumOfColumns(pTableMeta), pTableMeta->uid, pTableMeta); } - return code; + taosCacheRelease(tscCacheHandle, (void **)&(pTableMetaInfo->pTableMeta), true); + return getTableMetaFromMgmt(pSql, pTableMetaInfo); } static bool allVgroupInfoRetrieved(SSqlCmd* pCmd, int32_t clauseIndex) { From a3b1dbb8458058828cb5f7ee13c51de889af332b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 8 Jun 2020 14:50:47 +0800 Subject: [PATCH 04/55] [td-225] fix bugs in group by normal columns --- src/client/inc/tsclient.h | 37 +++++----- src/client/src/tscFunctionImpl.c | 4 +- src/client/src/tscParseInsert.c | 8 +-- src/client/src/tscPrepare.c | 4 +- src/client/src/tscSQLParser.c | 2 + src/client/src/tscSecondaryMerge.c | 4 +- src/client/src/tscStream.c | 5 +- src/query/inc/qsqlparser.h | 2 +- src/query/src/qExecutor.c | 95 ++----------------------- src/query/src/qparserImpl.c | 20 +++--- tests/script/general/parser/groupby.sim | 18 ++++- 11 files changed, 63 insertions(+), 136 deletions(-) diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index d7f1881209..4e42bcfdf7 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -191,14 +191,14 @@ typedef struct SDataBlockList { // todo remove } SDataBlockList; typedef struct SQueryInfo { - int16_t command; // the command may be different for each subclause, so keep it seperately. - uint32_t type; // query/insert/import type - char slidingTimeUnit; - - STimeWindow window; - int64_t intervalTime; // aggregation time interval - int64_t slidingTime; // sliding window in mseconds - SSqlGroupbyExpr groupbyExpr; // group by tags info + int16_t command; // the command may be different for each subclause, so keep it seperately. + uint32_t type; // query/insert/import type + char slidingTimeUnit; + + STimeWindow window; + int64_t intervalTime; // aggregation time interval + int64_t slidingTime; // sliding window in mseconds + SSqlGroupbyExpr groupbyExpr; // group by tags info SArray * colList; // SArray SFieldInfo fieldsInfo; @@ -207,11 +207,11 @@ typedef struct SQueryInfo { SLimitVal slimit; STagCond tagCond; SOrderVal order; - int16_t fillType; // interpolate type + int16_t fillType; // final result fill type int16_t numOfTables; STableMetaInfo **pTableMetaInfo; struct STSBuf * tsBuf; - int64_t * fillVal; // default value for interpolation + int64_t * fillVal; // default value for fill char * msg; // pointer to the pCmd->payload to keep error message temporarily int64_t clauseLimit; // limit for current sub clause @@ -222,15 +222,15 @@ typedef struct SQueryInfo { typedef struct { int command; uint8_t msgType; - - bool autoCreated; // if the table is missing, on-the-fly create it. during getmeterMeta - int8_t dataSourceType; // load data from file or not + bool autoCreated; // if the table is missing, on-the-fly create it. during getmeterMeta + int8_t dataSourceType; // load data from file or not union { int32_t count; int32_t numOfTablesInSubmit; }; + int32_t insertType; int32_t clauseIndex; // index of multiple subclause query int8_t parseFinished; short numOfCols; @@ -239,14 +239,12 @@ typedef struct { int32_t payloadLen; SQueryInfo **pQueryInfo; int32_t numOfClause; + char * curSql; // current sql, resume position of sql after parsing paused + void * pTableList; // referred table involved in sql + int32_t batchSize; // for parameter ('?') binding and batch processing + int32_t numOfParams; SDataBlockList *pDataBlocks; // submit data blocks after parsing sql - char * curSql; // current sql, resume position of sql after parsing paused - void * pTableList; // referred table involved in sql - - // for parameter ('?') binding and batch processing - int32_t batchSize; - int32_t numOfParams; } SSqlCmd; typedef struct SResRec { @@ -316,7 +314,6 @@ typedef struct SSqlObj { SRpcIpSet ipList; char freed : 4; char listed : 4; - uint32_t insertType; tsem_t rspSem; SSqlCmd cmd; SSqlRes res; diff --git a/src/client/src/tscFunctionImpl.c b/src/client/src/tscFunctionImpl.c index 1cb9ef0d10..b05e82b39a 100644 --- a/src/client/src/tscFunctionImpl.c +++ b/src/client/src/tscFunctionImpl.c @@ -1293,7 +1293,7 @@ static void max_function_f(SQLFunctionCtx *pCtx, int32_t index) { minMax_function_f(pCtx, index, 0); SResultInfo *pResInfo = GET_RES_INFO(pCtx); - if (pResInfo->hasResult == DATA_SET_FLAG) { + if (pResInfo->hasResult == DATA_SET_FLAG && pResInfo->superTableQ) { char *flag = pCtx->aOutputBuf + pCtx->inputBytes; *flag = DATA_SET_FLAG; } @@ -1309,7 +1309,7 @@ static void min_function_f(SQLFunctionCtx *pCtx, int32_t index) { minMax_function_f(pCtx, index, 1); SResultInfo *pResInfo = GET_RES_INFO(pCtx); - if (pResInfo->hasResult == DATA_SET_FLAG) { + if (pResInfo->hasResult == DATA_SET_FLAG && pResInfo->superTableQ) { char *flag = pCtx->aOutputBuf + pCtx->inputBytes; *flag = DATA_SET_FLAG; } diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index e058483781..cbc83c6e75 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -1314,7 +1314,7 @@ int tsParseInsertSql(SSqlObj *pSql) { tscGetQueryInfoDetailSafely(pCmd, pCmd->clauseIndex, &pQueryInfo); TSDB_QUERY_SET_TYPE(pQueryInfo->type, TSDB_QUERY_TYPE_INSERT); - TSDB_QUERY_SET_TYPE(pQueryInfo->type, pSql->insertType); + TSDB_QUERY_SET_TYPE(pQueryInfo->type, pCmd->insertType); sToken = tStrGetToken(pSql->sqlstr, &index, false, 0, NULL); if (sToken.type != TK_INTO) { @@ -1342,7 +1342,7 @@ int tsParseSql(SSqlObj *pSql, bool initialParse) { * Set the fp before parse the sql string, in case of getTableMeta failed, in which * the error handle callback function can rightfully restore the user-defined callback function (fp). */ - if (initialParse && (pSql->insertType != TSDB_QUERY_TYPE_STMT_INSERT)) { + if (initialParse && (pSql->cmd.insertType != TSDB_QUERY_TYPE_STMT_INSERT)) { pSql->fetchFp = pSql->fp; pSql->fp = (void(*)())tscHandleMultivnodeInsert; } @@ -1354,9 +1354,7 @@ int tsParseSql(SSqlObj *pSql, bool initialParse) { return ret; } - SSqlInfo SQLInfo = {0}; - tSQLParse(&SQLInfo, pSql->sqlstr); - + SSqlInfo SQLInfo = qSQLParse(pSql->sqlstr); ret = tscToSQLCmd(pSql, &SQLInfo); SQLInfoDestroy(&SQLInfo); } diff --git a/src/client/src/tscPrepare.c b/src/client/src/tscPrepare.c index 12d2980038..3c9e0cdd3b 100644 --- a/src/client/src/tscPrepare.c +++ b/src/client/src/tscPrepare.c @@ -451,7 +451,7 @@ static int insertStmtExecute(STscStmt* stmt) { pRes->qhandle = 0; - pSql->insertType = 0; + pSql->cmd.insertType = 0; pSql->fetchFp = waitForQueryRsp; pSql->fp = (void(*)())tscHandleMultivnodeInsert; @@ -515,7 +515,7 @@ int taos_stmt_prepare(TAOS_STMT* stmt, const char* sql, unsigned long length) { SSqlRes *pRes = &pSql->res; pSql->param = (void*) pSql; pSql->fp = waitForQueryRsp; - pSql->insertType = TSDB_QUERY_TYPE_STMT_INSERT; + pSql->cmd.insertType = TSDB_QUERY_TYPE_STMT_INSERT; if (TSDB_CODE_SUCCESS != tscAllocPayload(pCmd, TSDB_DEFAULT_PAYLOAD_SIZE)) { tscError("%p failed to malloc payload buffer", pSql); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 15706e3235..8375552b93 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -517,6 +517,7 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { } } + pSql->cmd.parseFinished = true; return TSDB_CODE_SUCCESS; // do not build query message here } @@ -542,6 +543,7 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), "not support sql expression"); } + pSql->cmd.parseFinished = true; return tscBuildMsg[pCmd->command](pSql, pInfo); } diff --git a/src/client/src/tscSecondaryMerge.c b/src/client/src/tscSecondaryMerge.c index 5114f97f8f..95d559b4fa 100644 --- a/src/client/src/tscSecondaryMerge.c +++ b/src/client/src/tscSecondaryMerge.c @@ -1185,7 +1185,9 @@ bool needToMerge(SQueryInfo *pQueryInfo, SLocalReducer *pLocalReducer, tFilePage int32_t ret = 0; // merge all result by default int16_t functionId = pLocalReducer->pCtx[0].functionId; - if (functionId == TSDB_FUNC_PRJ || functionId == TSDB_FUNC_ARITHM) { // column projection query + + // todo opt performance + if ((/*functionId == TSDB_FUNC_PRJ || */functionId == TSDB_FUNC_ARITHM) || (tscIsProjectionQueryOnSTable(pQueryInfo, 0))) { // column projection query ret = 1; // disable merge procedure } else { tOrderDescriptor *pDesc = pLocalReducer->pDesc; diff --git a/src/client/src/tscStream.c b/src/client/src/tscStream.c index 4e92e9dd70..b8b2a0f8eb 100644 --- a/src/client/src/tscStream.c +++ b/src/client/src/tscStream.c @@ -505,10 +505,9 @@ TAOS_STREAM *taos_open_stream(TAOS *taos, const char *sqlstr, void (*fp)(void *p tsem_init(&pSql->rspSem, 0, 0); - SSqlInfo SQLInfo = {0}; - tSQLParse(&SQLInfo, pSql->sqlstr); - + SSqlInfo SQLInfo = qSQLParse(pSql->sqlstr); tscResetSqlCmdObj(&pSql->cmd); + ret = tscAllocPayload(&pSql->cmd, TSDB_DEFAULT_PAYLOAD_SIZE); if (TSDB_CODE_SUCCESS != ret) { setErrorInfo(pSql, ret, NULL); diff --git a/src/query/inc/qsqlparser.h b/src/query/inc/qsqlparser.h index d2fad227e6..704f3e7418 100644 --- a/src/query/inc/qsqlparser.h +++ b/src/query/inc/qsqlparser.h @@ -322,7 +322,7 @@ enum { #define NORMAL_ARITHMETIC 1 #define AGG_ARIGHTMEIC 2 -int32_t tSQLParse(SSqlInfo *pSQLInfo, const char *pSql); +SSqlInfo qSQLParse(const char *str); #ifdef __cplusplus } diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 5dff47121b..0ff9a7e480 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -373,7 +373,6 @@ static SWindowResult *doSetTimeWindowFromKey(SQueryRuntimeEnv *pRuntimeEnv, SWin SPosInfo pos = {-1, -1}; createQueryResultInfo(pQuery, &pWindowResInfo->pResult[i], pRuntimeEnv->stableQuery, &pos); } - pWindowResInfo->capacity = newCap; } @@ -1566,11 +1565,6 @@ static bool isFirstLastRowQuery(SQuery *pQuery) { return false; } -static UNUSED_FUNC bool notHasQueryTimeRange(SQuery *pQuery) { - return (pQuery->window.skey == 0 && pQuery->window.ekey == INT64_MAX && QUERY_IS_ASC_QUERY(pQuery)) || - (pQuery->window.skey == INT64_MAX && pQuery->window.ekey == 0 && (!QUERY_IS_ASC_QUERY(pQuery))); -} - static bool needReverseScan(SQuery *pQuery) { for (int32_t i = 0; i < pQuery->numOfOutput; ++i) { int32_t functionId = pQuery->pSelectExpr[i].base.functionId; @@ -1768,61 +1762,6 @@ static void changeExecuteScanOrder(SQuery *pQuery, bool stableQuery) { } } -static UNUSED_FUNC void doSetInterpVal(SQLFunctionCtx *pCtx, TSKEY ts, int16_t type, int32_t index, char *data) { - assert(pCtx->param[index].pz == NULL); - - int32_t len = 0; - size_t t = 0; - - if (type == TSDB_DATA_TYPE_BINARY) { - t = strlen(data); - - len = t + 1 + TSDB_KEYSIZE; - pCtx->param[index].pz = calloc(1, len); - } else if (type == TSDB_DATA_TYPE_NCHAR) { - t = wcslen((const wchar_t *)data); - - len = (t + 1) * TSDB_NCHAR_SIZE + TSDB_KEYSIZE; - pCtx->param[index].pz = calloc(1, len); - } else { - len = TSDB_KEYSIZE * 2; - pCtx->param[index].pz = malloc(len); - } - - pCtx->param[index].nType = TSDB_DATA_TYPE_BINARY; - - char *z = pCtx->param[index].pz; - *(TSKEY *)z = ts; - z += TSDB_KEYSIZE; - - switch (type) { - case TSDB_DATA_TYPE_FLOAT: - *(double *)z = GET_FLOAT_VAL(data); - break; - case TSDB_DATA_TYPE_DOUBLE: - *(double *)z = GET_DOUBLE_VAL(data); - break; - case TSDB_DATA_TYPE_INT: - case TSDB_DATA_TYPE_BOOL: - case TSDB_DATA_TYPE_BIGINT: - case TSDB_DATA_TYPE_TINYINT: - case TSDB_DATA_TYPE_SMALLINT: - case TSDB_DATA_TYPE_TIMESTAMP: - *(int64_t *)z = GET_INT64_VAL(data); - break; - case TSDB_DATA_TYPE_BINARY: - strncpy(z, data, t); - break; - case TSDB_DATA_TYPE_NCHAR: { - wcsncpy((wchar_t *)z, (const wchar_t *)data, t); - } break; - default: - assert(0); - } - - pCtx->param[index].nLen = len; -} - static int32_t getInitialPageNum(SQInfo *pQInfo) { SQuery *pQuery = pQInfo->runtimeEnv.pQuery; int32_t INITIAL_RESULT_ROWS_VALUE = 16; @@ -4071,45 +4010,19 @@ int32_t doInitQInfo(SQInfo *pQInfo, void *param, void *tsdb, int32_t vgId, bool initWindowResInfo(&pRuntimeEnv->windowResInfo, pRuntimeEnv, rows, 4096, type); } - setQueryStatus(pQuery, QUERY_NOT_COMPLETED); - - /* - * in case of last_row query without query range, we set the query timestamp to be - * STable->lastKey. Otherwise, keep the initial query time range unchanged. - */ -// if (isFirstLastRowQuery(pQuery)) { -// if (!normalizeUnBoundLastRowQuery(pQInfo, &interpInfo)) { -// sem_post(&pQInfo->dataReady); -// pointInterpSupporterDestroy(&interpInfo); -// return TSDB_CODE_SUCCESS; -// } -// } - if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) { SFillColInfo* pColInfo = taosCreateFillColInfo(pQuery); pRuntimeEnv->pFillInfo = taosInitFillInfo(pQuery->order.order, 0, 0, pQuery->rec.capacity, pQuery->numOfOutput, pQuery->slidingTime, pQuery->fillType, pColInfo); } - + + // todo refactor pRuntimeEnv->topBotQuery = isTopBottomQuery(pQuery); + setQueryStatus(pQuery, QUERY_NOT_COMPLETED); + return TSDB_CODE_SUCCESS; } -static UNUSED_FUNC bool isGroupbyEachTable(SSqlGroupbyExpr *pGroupbyExpr, STableGroupInfo *pSidset) { - if (pGroupbyExpr == NULL || pGroupbyExpr->numOfGroupCols == 0) { - return false; - } - - for (int32_t i = 0; i < pGroupbyExpr->numOfGroupCols; ++i) { - SColIndex* pColIndex = taosArrayGet(pGroupbyExpr->columnInfo, i); - if (pColIndex->flag == TSDB_COL_TAG) { - return true; - } - } - - return false; -} - static void enableExecutionForNextTable(SQueryRuntimeEnv *pRuntimeEnv) { SQuery *pQuery = pRuntimeEnv->pQuery; diff --git a/src/query/src/qparserImpl.c b/src/query/src/qparserImpl.c index 9589be86e4..4a3cb8adda 100644 --- a/src/query/src/qparserImpl.c +++ b/src/query/src/qparserImpl.c @@ -26,16 +26,18 @@ #include "tstrbuild.h" #include "queryLog.h" -int32_t tSQLParse(SSqlInfo *pSQLInfo, const char *pStr) { +SSqlInfo qSQLParse(const char *pStr) { void *pParser = ParseAlloc(malloc); - pSQLInfo->valid = true; + + SSqlInfo sqlInfo = {0}; + sqlInfo.valid = true; int32_t i = 0; while (1) { SSQLToken t0 = {0}; if (pStr[i] == 0) { - Parse(pParser, 0, t0, pSQLInfo); + Parse(pParser, 0, t0, &sqlInfo); goto abort_parse; } @@ -49,19 +51,19 @@ int32_t tSQLParse(SSqlInfo *pSQLInfo, const char *pStr) { break; } case TK_SEMI: { - Parse(pParser, 0, t0, pSQLInfo); + Parse(pParser, 0, t0, &sqlInfo); goto abort_parse; } case TK_QUESTION: case TK_ILLEGAL: { - snprintf(pSQLInfo->pzErrMsg, tListLen(pSQLInfo->pzErrMsg), "unrecognized token: \"%s\"", t0.z); - pSQLInfo->valid = false; + snprintf(sqlInfo.pzErrMsg, tListLen(sqlInfo.pzErrMsg), "unrecognized token: \"%s\"", t0.z); + sqlInfo.valid = false; goto abort_parse; } default: - Parse(pParser, t0.type, t0, pSQLInfo); - if (pSQLInfo->valid == false) { + Parse(pParser, t0.type, t0, &sqlInfo); + if (sqlInfo.valid == false) { goto abort_parse; } } @@ -69,7 +71,7 @@ int32_t tSQLParse(SSqlInfo *pSQLInfo, const char *pStr) { abort_parse: ParseFree(pParser, free); - return 0; + return sqlInfo; } tSQLExprList *tSQLExprListAppend(tSQLExprList *pList, tSQLExpr *pNode, SSQLToken *pToken) { diff --git a/tests/script/general/parser/groupby.sim b/tests/script/general/parser/groupby.sim index 9788e4d484..513b3cbbbe 100644 --- a/tests/script/general/parser/groupby.sim +++ b/tests/script/general/parser/groupby.sim @@ -180,7 +180,7 @@ if $data03 != 0 then endi print $data04 -if $data04 != 0.0000 then +if $data04 != 0.00000 then return -1 endi @@ -201,7 +201,8 @@ if $data13 != 1 then return -1 endi -if $data14 != 1.0000 then +if $data14 != 1.00000 then + print expect 1.00000, actual:$data14 return -1 endi @@ -345,6 +346,19 @@ if $data94 != 9 then return -1 endi +sql select c1,sum(c1),avg(c1),count(*) from group_mt0 where c1<5 group by c1; +if $row != 5 then + return -1 +endi + +if $data00 != 0 then + return -1 +endi + +if $data01 != 800 then + return -1 +endi + sql select first(c1), last(ts), first(ts), last(c1),sum(c1),avg(c1),count(*) from group_mt0 where c1<20 group by tbname,c1; if $row != 160 then return -1 From ddb82b1dfc5bdc47bf5885fe7da66e87213d8e3b Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 8 Jun 2020 07:27:35 +0000 Subject: [PATCH 05/55] fix a commit bug --- src/tsdb/src/tsdbRWHelper.c | 21 +++++++++++---------- src/util/src/tkvstore.c | 10 +++++----- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/tsdb/src/tsdbRWHelper.c b/src/tsdb/src/tsdbRWHelper.c index eab70b5913..ed0122b6eb 100644 --- a/src/tsdb/src/tsdbRWHelper.c +++ b/src/tsdb/src/tsdbRWHelper.c @@ -764,8 +764,8 @@ static bool tsdbShouldCreateNewLast(SRWHelper *pHelper) { static int tsdbWriteBlockToFile(SRWHelper *pHelper, SFile *pFile, SDataCols *pDataCols, int rowsToWrite, SCompBlock *pCompBlock, bool isLast, bool isSuperBlock) { - ASSERT(rowsToWrite > 0 && rowsToWrite <= pDataCols->numOfRows && - rowsToWrite <= pHelper->config.maxRowsPerFileBlock); + ASSERT(rowsToWrite > 0 && rowsToWrite <= pDataCols->numOfRows && rowsToWrite <= pHelper->config.maxRowsPerFileBlock); + ASSERT(isLast ? rowsToWrite < pHelper->config.minRowsPerFileBlock : true); SCompData *pCompData = (SCompData *)(pHelper->pBuffer); int64_t offset = 0; @@ -905,7 +905,8 @@ static int tsdbMergeDataWithBlock(SRWHelper *pHelper, int blkIdx, SDataCols *pDa rowsWritten = MIN((defaultRowsToWrite - blockAtIdx(pHelper, blkIdx)->numOfRows), pDataCols->numOfRows); if ((blockAtIdx(pHelper, blkIdx)->numOfSubBlocks < TSDB_MAX_SUBBLOCKS) && - (blockAtIdx(pHelper, blkIdx)->numOfRows + rowsWritten < pHelper->config.minRowsPerFileBlock) && (pHelper->files.nLastF.fd) > 0) { + (blockAtIdx(pHelper, blkIdx)->numOfRows + rowsWritten < pHelper->config.minRowsPerFileBlock) && + (pHelper->files.nLastF.fd) < 0) { if (tsdbWriteBlockToFile(pHelper, &(pHelper->files.lastF), pDataCols, rowsWritten, &compBlock, true, false) < 0) goto _err; if (tsdbAddSubBlock(pHelper, &compBlock, blkIdx, rowsWritten) < 0) goto _err; @@ -936,21 +937,21 @@ static int tsdbMergeDataWithBlock(SRWHelper *pHelper, int blkIdx, SDataCols *pDa // Key must overlap with the block ASSERT(keyFirst <= blockAtIdx(pHelper, blkIdx)->keyLast); - TSKEY keyLimit = - (blkIdx == pIdx->numOfBlocks - 1) ? INT64_MAX : pHelper->pCompInfo->blocks[blkIdx + 1].keyFirst - 1; + TSKEY keyLimit = (blkIdx == pIdx->numOfBlocks - 1) ? INT64_MAX : blockAtIdx(pHelper, blkIdx + 1)->keyFirst - 1; // rows1: number of rows must merge in this block int rows1 = tsdbGetRowsInRange(pDataCols, blockAtIdx(pHelper, blkIdx)->keyFirst, blockAtIdx(pHelper, blkIdx)->keyLast); - // rows2: max nuber of rows the block can have more + // rows2: max number of rows the block can have more int rows2 = pHelper->config.maxRowsPerFileBlock - blockAtIdx(pHelper, blkIdx)->numOfRows; // rows3: number of rows between this block and the next block int rows3 = tsdbGetRowsInRange(pDataCols, blockAtIdx(pHelper, blkIdx)->keyFirst, keyLimit); ASSERT(rows3 >= rows1); - if ((rows2 >= rows1) && - (( blockAtIdx(pHelper, blkIdx)->last) || - ((rows1 + blockAtIdx(pHelper, blkIdx)->numOfRows < pHelper->config.minRowsPerFileBlock) && (pHelper->files.nLastF.fd < 0)))) { + if ((rows2 >= rows1) && (blockAtIdx(pHelper, blkIdx)->numOfSubBlocks < TSDB_MAX_SUBBLOCKS) && + ((!blockAtIdx(pHelper, blkIdx)->last) || + ((rows1 + blockAtIdx(pHelper, blkIdx)->numOfRows < pHelper->config.minRowsPerFileBlock) && + (pHelper->files.nLastF.fd < 0)))) { rowsWritten = rows1; bool isLast = false; SFile *pFile = NULL; @@ -964,7 +965,7 @@ static int tsdbMergeDataWithBlock(SRWHelper *pHelper, int blkIdx, SDataCols *pDa if (tsdbWriteBlockToFile(pHelper, pFile, pDataCols, rows1, &compBlock, isLast, false) < 0) goto _err; if (tsdbAddSubBlock(pHelper, &compBlock, blkIdx, rowsWritten) < 0) goto _err; - } else { // Load-Merge-Write + } else { // Load-Merge-Write // Load if (tsdbLoadBlockData(pHelper, blockAtIdx(pHelper, blkIdx), NULL) < 0) goto _err; if (blockAtIdx(pHelper, blkIdx)->last) pHelper->hasOldLastBlock = false; diff --git a/src/util/src/tkvstore.c b/src/util/src/tkvstore.c index 741f953310..148d8235a6 100644 --- a/src/util/src/tkvstore.c +++ b/src/util/src/tkvstore.c @@ -45,7 +45,7 @@ static int tdUpdateKVStoreHeader(int fd, char *fname, SStoreInfo *pInfo); int tdCreateKVStore(char *fname) { char *tname = strdup(fname); - if (tname == NULL) return TSDB_CODE_SERV_OUT_OF_MEMORY; + if (tname == NULL) return TSDB_CODE_COM_OUT_OF_MEMORY; int fd = open(fname, O_RDWR | O_CREAT, 0755); if (fd < 0) { @@ -247,14 +247,14 @@ static SKVStore *tdNewKVStore(char *fname, iterFunc iFunc, afterFunc aFunc, void pStore->appH = appH; pStore->map = taosHashInit(4096, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false); if (pStore->map == NULL) { - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + terrno = TSDB_CODE_COM_OUT_OF_MEMORY; goto _err; } return pStore; _err: - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + terrno = TSDB_CODE_COM_OUT_OF_MEMORY; tdFreeKVStore(pStore); return NULL; } @@ -273,7 +273,7 @@ static char *tdGetKVStoreSnapshotFname(char *fdata) { size_t size = strlen(fdata) + strlen(TD_KVSTORE_SNAP_SUFFIX) + 1; char * fname = malloc(size); if (fname == NULL) { - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + terrno = TSDB_CODE_COM_OUT_OF_MEMORY; return NULL; } sprintf(fname, "%s%s", fdata, TD_KVSTORE_SNAP_SUFFIX); @@ -284,7 +284,7 @@ static char *tdGetKVStoreNewFname(char *fdata) { size_t size = strlen(fdata) + strlen(TD_KVSTORE_NEW_SUFFIX) + 1; char * fname = malloc(size); if (fname == NULL) { - terrno = TSDB_CODE_SERV_OUT_OF_MEMORY; + terrno = TSDB_CODE_COM_OUT_OF_MEMORY; return NULL; } sprintf(fname, "%s%s", fdata, TD_KVSTORE_NEW_SUFFIX); From 2241cf0629fa677ff5513ecdb6794606c66b5bba Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 07:48:18 +0000 Subject: [PATCH 06/55] [TD-543] fix erro in coverity scan --- .gitignore | 3 ++- src/mnode/src/mnodeAcct.c | 15 ++++++++++----- src/mnode/src/mnodeMain.c | 6 +++--- src/mnode/src/mnodeShow.c | 2 +- src/vnode/src/vnodeMain.c | 24 +++++++++++++++++------- 5 files changed, 33 insertions(+), 17 deletions(-) diff --git a/.gitignore b/.gitignore index bb9a70e9b2..77c52b2ee2 100644 --- a/.gitignore +++ b/.gitignore @@ -64,4 +64,5 @@ CMakeError.log /out/isenseconfig/WSL-Clang-Debug /out/isenseconfig/WSL-GCC-Debug /test/cfg -/src/.vs +/src/.vs +*.o diff --git a/src/mnode/src/mnodeAcct.c b/src/mnode/src/mnodeAcct.c index 9634d2c645..7ea5188b96 100644 --- a/src/mnode/src/mnodeAcct.c +++ b/src/mnode/src/mnodeAcct.c @@ -27,7 +27,7 @@ void * tsAcctSdb = NULL; static int32_t tsAcctUpdateSize; -static void mnodeCreateRootAcct(); +static int32_t mnodeCreateRootAcct(); static int32_t mnodeAcctActionDestroy(SSdbOper *pOper) { SAcctObj *pAcct = pOper->pObj; @@ -79,7 +79,11 @@ static int32_t mnodeAcctActionDecode(SSdbOper *pOper) { static int32_t mnodeAcctActionRestored() { if (dnodeIsFirstDeploy()) { - mnodeCreateRootAcct(); + int32_t code = mnodeCreateRootAcct(); + if (code != TSDB_CODE_SUCCESS) { + mError("failed to create root account, reason:%s", tstrerror(code)); + return code; + } } acctInit(); @@ -161,9 +165,9 @@ void mnodeDropUserFromAcct(SAcctObj *pAcct, SUserObj *pUser) { mnodeDecAcctRef(pAcct); } -static void mnodeCreateRootAcct() { +static int32_t mnodeCreateRootAcct() { int32_t numOfAccts = sdbGetNumOfRows(tsAcctSdb); - if (numOfAccts != 0) return; + if (numOfAccts != 0) return TSDB_CODE_SUCCESS; SAcctObj *pAcct = malloc(sizeof(SAcctObj)); memset(pAcct, 0, sizeof(SAcctObj)); @@ -190,7 +194,8 @@ static void mnodeCreateRootAcct() { .table = tsAcctSdb, .pObj = pAcct, }; - sdbInsertRow(&oper); + + return sdbInsertRow(&oper); } #ifndef _ACCT diff --git a/src/mnode/src/mnodeMain.c b/src/mnode/src/mnodeMain.c index 298d10993b..57bb1b2bac 100644 --- a/src/mnode/src/mnodeMain.c +++ b/src/mnode/src/mnodeMain.c @@ -88,9 +88,9 @@ int32_t mnodeStartSystem() { } mPrint("starting to initialize mnode ..."); - struct stat dirstat; - if (stat(tsMnodeDir, &dirstat) < 0) { - mkdir(tsMnodeDir, 0755); + if (mkdir(tsMnodeDir, 0755) != 0 && errno != EEXIST) { + mError("failed to init mnode dir:%s, reason:%s", tsMnodeDir, strerror(errno)); + return -1; } dnodeAllocateMnodeWqueue(); diff --git a/src/mnode/src/mnodeShow.c b/src/mnode/src/mnodeShow.c index 36e7d13a86..30f491ec03 100644 --- a/src/mnode/src/mnodeShow.c +++ b/src/mnode/src/mnodeShow.c @@ -316,7 +316,7 @@ static int32_t mnodeProcessConnectMsg(SMnodeMsg *pMsg) { } sprintf(pConnectRsp->acctId, "%x", pAcct->acctId); - strcpy(pConnectRsp->serverVersion, version); + memcpy(pConnectRsp->serverVersion, version, TSDB_VERSION_LEN); pConnectRsp->writeAuth = pUser->writeAuth; pConnectRsp->superAuth = pUser->superAuth; diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c index 256ef3c72b..9ec982b1de 100644 --- a/src/vnode/src/vnodeMain.c +++ b/src/vnode/src/vnodeMain.c @@ -75,19 +75,29 @@ int32_t vnodeCreate(SMDCreateVnodeMsg *pVnodeCfg) { return TSDB_CODE_SUCCESS; } - mkdir(tsVnodeDir, 0755); - - char rootDir[TSDB_FILENAME_LEN] = {0}; - sprintf(rootDir, "%s/vnode%d", tsVnodeDir, pVnodeCfg->cfg.vgId); - if (mkdir(rootDir, 0755) != 0) { - vPrint("vgId:%d, failed to create vnode, reason:%s dir:%s", pVnodeCfg->cfg.vgId, strerror(errno), rootDir); + if (mkdir(tsVnodeDir, 0755) != 0 && errno != EEXIST) { + vError("vgId:%d, failed to create vnode, reason:%s dir:%s", pVnodeCfg->cfg.vgId, strerror(errno), tsVnodeDir); + if (errno == EACCES) { + return TSDB_CODE_VND_NO_DISK_PERMISSIONS; + } else if (errno == ENOSPC) { + return TSDB_CODE_VND_NO_DISKSPACE; + } else if (errno == ENOENT) { + return TSDB_CODE_VND_NO_SUCH_FILE_OR_DIR; + } else { + return TSDB_CODE_VND_INIT_FAILED; + } + } + + char rootDir[TSDB_FILENAME_LEN] = {0}; + sprintf(rootDir, "%s/vnode%d", tsVnodeDir, pVnodeCfg->cfg.vgId); + if (mkdir(rootDir, 0755) != 0 && errno != EEXIST) { + vError("vgId:%d, failed to create vnode, reason:%s dir:%s", pVnodeCfg->cfg.vgId, strerror(errno), rootDir); if (errno == EACCES) { return TSDB_CODE_VND_NO_DISK_PERMISSIONS; } else if (errno == ENOSPC) { return TSDB_CODE_VND_NO_DISKSPACE; } else if (errno == ENOENT) { return TSDB_CODE_VND_NO_SUCH_FILE_OR_DIR; - } else if (errno == EEXIST) { } else { return TSDB_CODE_VND_INIT_FAILED; } From 47b3df8cdd21f65b879cafeba1c429f6ff13a755 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 8 Jun 2020 15:50:21 +0800 Subject: [PATCH 07/55] [td-225] --- tests/examples/c/demo.c | 30 +++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/tests/examples/c/demo.c b/tests/examples/c/demo.c index 89dd3527c6..55a19eb5f9 100644 --- a/tests/examples/c/demo.c +++ b/tests/examples/c/demo.c @@ -21,14 +21,16 @@ #include #include #include // TAOS header file -#include - -void taosMsleep(int mseconds); +#include +#include static int32_t doQuery(TAOS* taos, const char* sql) { + struct timeval t1 = {0}; + gettimeofday(&t1, NULL); + TAOS_RES* res = taos_query(taos, sql); if (taos_errno(res) != 0) { - printf("failed to execute query, reason:%s\n", taos_errstr(taos)); + printf("failed to execute query, reason:%s\n", taos_errstr(res)); return -1; } @@ -38,13 +40,19 @@ static int32_t doQuery(TAOS* taos, const char* sql) { int32_t numOfFields = taos_num_fields(res); TAOS_FIELD* pFields = taos_fetch_fields(res); + int32_t i = 0; while((row = taos_fetch_row(res)) != NULL) { taos_print_row(buf, row, pFields, numOfFields); - printf("%s\n", buf); + printf("%d:%s\n", ++i, buf); memset(buf, 0, 512); } taos_free_result(res); + + struct timeval t2 = {0}; + gettimeofday(&t2, NULL); + + printf("elapsed time:%"PRId64 " ms\n", ((t2.tv_sec*1000000 + t2.tv_usec) - (t1.tv_sec*1000000 + t1.tv_usec))/1000); return 0; } @@ -101,14 +109,18 @@ int main(int argc, char *argv[]) { taos = taos_connect(argv[1], "root", "taosdata", NULL, 0); if (taos == NULL) { - printf("failed to connect to server, reason:%s\n", taos_errstr(taos)); + printf("failed to connect to server, reason:%s\n", taos_errstr(NULL)); exit(1); } - printf("success to connect to server\n"); + printf("success to connect to server\n"); +// doQuery(taos, "select c1,count(*) from group_db0.group_mt0 where c1<8 group by c1"); + doQuery(taos, "select * from test.m1"); + // multiThreadTest(1, taos); - doQuery(taos, "use test"); - doQuery(taos, "alter table tm99 set tag a=99"); +// doQuery(taos, "select tbname from test.m1"); +// doQuery(taos, "select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from lm2_db0.lm2_stb0 where ts >= 1537146000000 and ts <= 1543145400000 and tbname in ('lm2_tb0') interval(1s) group by t1"); +// doQuery(taos, "select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from lm2_db0.lm2_stb0 where ts >= 1537146000000 and ts <= 1543145400000 and tbname in ('lm2_tb0', 'lm2_tb1', 'lm2_tb2') interval(1s)"); // for(int32_t i = 0; i < 100000; ++i) { // doQuery(taos, "insert into t1 values(now, 2)"); // } From a3744f28b35f30ceb977f964d5d28d27d00683c5 Mon Sep 17 00:00:00 2001 From: Tao Liu Date: Mon, 8 Jun 2020 07:56:42 +0000 Subject: [PATCH 08/55] [TD-553] add usage stastics --- src/vnode/inc/vnodeInt.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/vnode/inc/vnodeInt.h b/src/vnode/inc/vnodeInt.h index 7c95e81cf5..af7f764717 100644 --- a/src/vnode/inc/vnodeInt.h +++ b/src/vnode/inc/vnodeInt.h @@ -39,6 +39,9 @@ typedef struct { int8_t role; int64_t version; // current version int64_t fversion; // version on saved data file + int64_t totalStorage; //total bytes occupie + int64_t compStorage; + int64_t pointsWritten; //total data points written void *wqueue; void *rqueue; void *wal; From 95986f9de295f479fd4c9764051f2733ce25e356 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 08:38:19 +0000 Subject: [PATCH 09/55] [TD_543] fix coverity scan, cid:267715 --- src/kit/taosdemo/taosdemo.c | 37 ++++++++++++++++++------------------- 1 file changed, 18 insertions(+), 19 deletions(-) diff --git a/src/kit/taosdemo/taosdemo.c b/src/kit/taosdemo/taosdemo.c index 81426b683a..ca0af96145 100644 --- a/src/kit/taosdemo/taosdemo.c +++ b/src/kit/taosdemo/taosdemo.c @@ -43,6 +43,7 @@ extern char configDir[]; #define MAX_DATA_SIZE 1024 #define MAX_NUM_DATATYPE 8 #define OPT_ABORT 1 /* –abort */ +#define STRING_LEN 512 /* The options we understand. */ static struct argp_option options[] = { @@ -380,10 +381,11 @@ int main(int argc, char *argv[]) { bool insert_only = arguments.insert_only; char **data_type = arguments.datatype; int count_data_type = 0; - char dataString[512]; + char dataString[STRING_LEN]; bool do_aggreFunc = true; - memset(dataString, 0, 512); + memset(dataString, 0, STRING_LEN); + int len = 0; if (strcasecmp(data_type[0], "BINARY") == 0 || strcasecmp(data_type[0], "BOOL") == 0) { do_aggreFunc = false; @@ -392,8 +394,8 @@ int main(int argc, char *argv[]) { if (strcasecmp(data_type[count_data_type], "") == 0) { break; } - strcat(dataString, data_type[count_data_type]); - strcat(dataString, " "); + + len += snprintf(dataString + len, STRING_LEN - len, "%s ", data_type[count_data_type]); } FILE *fp = fopen(arguments.output_file, "a"); @@ -473,32 +475,29 @@ int main(int argc, char *argv[]) { sprintf(command, "create database %s;", db_name); taos_query(taos, command); - char cols[512] = "\0"; + char cols[STRING_LEN] = "\0"; int colIndex = 0; + len = 0; for (; colIndex < ncols_per_record - 1; colIndex++) { if (strcasecmp(data_type[colIndex % count_data_type], "BINARY") != 0) { - sprintf(command, ",f%d %s", colIndex + 1, data_type[colIndex % count_data_type]); - strcat(cols, command); + len += snprintf(cols + len, STRING_LEN - len, ",f%d %s", colIndex + 1, data_type[colIndex % count_data_type]); } else { - sprintf(command, ",f%d %s(%d)", colIndex + 1, data_type[colIndex % count_data_type], len_of_binary); - strcat(cols, command); + len += snprintf(cols + len, STRING_LEN - len, ",f%d %s(%d)", colIndex + 1, data_type[colIndex % count_data_type], len_of_binary); } } if (strcasecmp(data_type[colIndex % count_data_type], "BINARY") != 0) { - sprintf(command, ",f%d %s)", colIndex + 1, data_type[colIndex % count_data_type]); + len += snprintf(cols + len, STRING_LEN - len, ",f%d %s)", colIndex + 1, data_type[colIndex % count_data_type]); } else { - sprintf(command, ",f%d %s(%d))", colIndex + 1, data_type[colIndex % count_data_type], len_of_binary); + len += snprintf(cols + len, STRING_LEN - len, ",f%d %s(%d))", colIndex + 1, data_type[colIndex % count_data_type], len_of_binary); } - strcat(cols, command); - if (!use_metric) { /* Create all the tables; */ printf("Creating %d table(s)......\n", ntables); for (int i = 0; i < ntables; i++) { - sprintf(command, "create table %s.%s%d (ts timestamp%s;", db_name, tb_prefix, i, cols); + snprintf(command, BUFFER_SIZE, "create table %s.%s%d (ts timestamp%s;", db_name, tb_prefix, i, cols); queryDB(taos, command); } @@ -508,7 +507,7 @@ int main(int argc, char *argv[]) { } else { /* Create metric table */ printf("Creating meters super table...\n"); - sprintf(command, "create table %s.meters (ts timestamp%s tags (areaid int, loc binary(10))", db_name, cols); + snprintf(command, BUFFER_SIZE, "create table %s.meters (ts timestamp%s tags (areaid int, loc binary(10))", db_name, cols); queryDB(taos, command); printf("meters created!\n"); @@ -522,10 +521,10 @@ int main(int argc, char *argv[]) { j = i % 10; } if (j % 2 == 0) { - sprintf(command, "create table %s.%s%d using %s.meters tags (%d,\"%s\");", db_name, tb_prefix, i, db_name, j,"shanghai"); - } else { - sprintf(command, "create table %s.%s%d using %s.meters tags (%d,\"%s\");", db_name, tb_prefix, i, db_name, j,"beijing"); - } + snprintf(command, BUFFER_SIZE, "create table %s.%s%d using %s.meters tags (%d,\"%s\");", db_name, tb_prefix, i, db_name, j, "shanghai"); + } else { + snprintf(command, BUFFER_SIZE, "create table %s.%s%d using %s.meters tags (%d,\"%s\");", db_name, tb_prefix, i, db_name, j, "beijing"); + } queryDB(taos, command); } From 3c14c89b49511c4e4097c9ceb22ec7ae93400990 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 8 Jun 2020 09:01:04 +0000 Subject: [PATCH 10/55] fix another commit bug --- src/tsdb/src/tsdbRWHelper.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/tsdb/src/tsdbRWHelper.c b/src/tsdb/src/tsdbRWHelper.c index ed0122b6eb..add484b5f4 100644 --- a/src/tsdb/src/tsdbRWHelper.c +++ b/src/tsdb/src/tsdbRWHelper.c @@ -913,7 +913,7 @@ static int tsdbMergeDataWithBlock(SRWHelper *pHelper, int blkIdx, SDataCols *pDa } else { // Load if (tsdbLoadBlockData(pHelper, blockAtIdx(pHelper, blkIdx), NULL) < 0) goto _err; - ASSERT(pHelper->pDataCols[0]->numOfRows == blockAtIdx(pHelper, blkIdx)->numOfRows); + ASSERT(pHelper->pDataCols[0]->numOfRows <= blockAtIdx(pHelper, blkIdx)->numOfRows); // Merge if (tdMergeDataCols(pHelper->pDataCols[0], pDataCols, rowsWritten) < 0) goto _err; // Write @@ -1107,16 +1107,16 @@ static int tsdbAddSubBlock(SRWHelper *pHelper, SCompBlock *pCompBlock, int blkId for (int i = blkIdx + 1; i < pIdx->numOfBlocks; i++) { SCompBlock *pTCompBlock = pHelper->pCompInfo->blocks + i; if (pTCompBlock->numOfSubBlocks > 1) { - ptr = (void *)((char *)(pHelper->pCompInfo) + pTCompBlock->offset + pTCompBlock->len); + ptr = POINTER_SHIFT(pHelper->pCompInfo, pTCompBlock->offset); break; } } - if (ptr == NULL) ptr = (void *)((char *)(pHelper->pCompInfo) + pIdx->len - sizeof(TSCKSUM)); + if (ptr == NULL) ptr = POINTER_SHIFT(pHelper->pCompInfo, pIdx->len-sizeof(TSCKSUM)); size_t tsize = pIdx->len - ((char *)ptr - (char *)(pHelper->pCompInfo)); if (tsize > 0) { - memmove((void *)((char *)ptr + sizeof(SCompBlock) * 2), ptr, tsize); + memmove(POINTER_SHIFT(ptr, sizeof(SCompBlock) * 2), ptr, tsize); for (int i = blkIdx + 1; i < pIdx->numOfBlocks; i++) { SCompBlock *pTCompBlock = pHelper->pCompInfo->blocks + i; if (pTCompBlock->numOfSubBlocks > 1) pTCompBlock->offset += (sizeof(SCompBlock) * 2); From 5711ef3efd7da28ee96aa4a8fe18290b23c2611c Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:01:46 +0000 Subject: [PATCH 11/55] [TD_543] fix coverity scan, cid:267728 --- src/util/src/tnote.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/util/src/tnote.c b/src/util/src/tnote.c index 91d586322d..31ed6e2f7b 100644 --- a/src/util/src/tnote.c +++ b/src/util/src/tnote.c @@ -87,6 +87,10 @@ void *taosThreadToOpenNewNote(void *param) umask(0); int fd = open(name, O_WRONLY | O_CREAT | O_TRUNC, S_IRWXU | S_IRWXG | S_IRWXO); + if (fd < 0) { + return NULL; + } + taosLockNote(fd, pNote); lseek(fd, 0, SEEK_SET); From 894ad481f452340be399070f9ae4f2dcf1fa2313 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:01:52 +0000 Subject: [PATCH 12/55] [TD_543] fix coverity scan, cid:267731 --- src/kit/shell/src/shellImport.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/kit/shell/src/shellImport.c b/src/kit/shell/src/shellImport.c index 1dea6bca70..cd8b06c91c 100644 --- a/src/kit/shell/src/shellImport.c +++ b/src/kit/shell/src/shellImport.c @@ -169,6 +169,7 @@ static void shellSourceFile(TAOS *con, char *fptr) { if (f == NULL) { fprintf(stderr, "ERROR: failed to open file %s\n", fname); wordfree(&full_path); + free(cmd); return; } From 9e221b8a53c10d94b086730af3937bc92ac5c4c1 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:09:34 +0000 Subject: [PATCH 13/55] [TD_543] fix coverity scan, cid:267747 --- src/kit/shell/src/shellImport.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/kit/shell/src/shellImport.c b/src/kit/shell/src/shellImport.c index cd8b06c91c..347f99671d 100644 --- a/src/kit/shell/src/shellImport.c +++ b/src/kit/shell/src/shellImport.c @@ -148,7 +148,11 @@ static void shellSourceFile(TAOS *con, char *fptr) { } char *fname = full_path.we_wordv[0]; - + if (fname == NULL) { + fprintf(stderr, "ERROR: invalid filename\n"); + return; + } + if (access(fname, F_OK) != 0) { fprintf(stderr, "ERROR: file %s is not exist\n", fptr); From 73cdb81e1259147e37f318ba6d208d95de1627d0 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:10:49 +0000 Subject: [PATCH 14/55] [TD_543] fix coverity scan, cid:267750 --- src/os/linux/src/linuxSysPara.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/os/linux/src/linuxSysPara.c b/src/os/linux/src/linuxSysPara.c index af2d3c2633..ca244dcd94 100644 --- a/src/os/linux/src/linuxSysPara.c +++ b/src/os/linux/src/linuxSysPara.c @@ -229,7 +229,7 @@ static void taosGetSystemLocale() { // get and set default locale uError("can't get locale from system, set it to en_US.UTF-8"); strcpy(tsLocale, "en_US.UTF-8"); } else { - strncpy(tsLocale, locale, tListLen(tsLocale)); + tstrncpy(tsLocale, locale, tListLen(tsLocale)); uError("locale not configured, set to system default:%s", tsLocale); } } From ac26d4ab4dd2ad8ae3f70803c61bd87eec1b1dfc Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:11:46 +0000 Subject: [PATCH 15/55] [TD_543] fix coverity scan, cid:267752 --- src/plugins/http/src/tgHandle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/http/src/tgHandle.c b/src/plugins/http/src/tgHandle.c index 61f9da6368..ffb2ccb2f9 100644 --- a/src/plugins/http/src/tgHandle.c +++ b/src/plugins/http/src/tgHandle.c @@ -313,7 +313,7 @@ bool tgGetPassFromUrl(HttpContext *pContext) { return false; } - strcpy(pContext->pass, pParser->path[TG_PASS_URL_POS].pos); + tstrncpy(pContext->pass, pParser->path[TG_PASS_URL_POS].pos, TSDB_PASSWORD_LEN); return true; } From b56bac84e8a9c9df3df3df2b1e3b20ccaba14a0c Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 8 Jun 2020 09:12:36 +0000 Subject: [PATCH 16/55] TD-546 --- src/tsdb/src/tsdbMeta.c | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/tsdb/src/tsdbMeta.c b/src/tsdb/src/tsdbMeta.c index 05c3b30377..820d2df888 100644 --- a/src/tsdb/src/tsdbMeta.c +++ b/src/tsdb/src/tsdbMeta.c @@ -620,7 +620,10 @@ static int tsdbFreeTable(STable *pTable) { if (pTable->type == TSDB_CHILD_TABLE) { kvRowFree(pTable->tagVal); } else { - for (int i = 0; i < pTable->numOfSchemas; i++) tdFreeSchema(pTable->schema[i]); + if (pTable->schema) { + for (int i = 0; i < pTable->numOfSchemas; i++) tdFreeSchema(pTable->schema[i]); + free(pTable->schema); + } } if (pTable->type == TSDB_STREAM_TABLE) { From d27dcd5e358daf7c94eae8be77626f3c1ec85d2f Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:22:50 +0000 Subject: [PATCH 17/55] [TD_543] fix coverity scan, cid:267764 --- src/kit/taosdump/taosdump.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c index 7875ef732c..f03b46ac47 100644 --- a/src/kit/taosdump/taosdump.c +++ b/src/kit/taosdump/taosdump.c @@ -117,8 +117,8 @@ typedef struct { } SDbInfo; typedef struct { - char name[TSDB_TABLE_NAME_LEN + 1]; - char metric[TSDB_TABLE_NAME_LEN + 1]; + char name[TSDB_TABLE_NAME_LEN]; + char metric[TSDB_TABLE_NAME_LEN]; } STableRecord; typedef struct { @@ -871,7 +871,7 @@ int32_t taosDumpMetric(char *metric, SDumpArguments *arguments, FILE *fp) { int fd = -1; STableRecord tableRecord; - strcpy(tableRecord.metric, metric); + tstrncpy(tableRecord.metric, metric, TSDB_TABLE_NAME_LEN); sprintf(command, "select tbname from %s", metric); result = taos_query(taos, command); From 86a63d250ef9d42570058e18f44df131eaa5d30b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 8 Jun 2020 17:23:45 +0800 Subject: [PATCH 18/55] [td-225] --- src/client/inc/tsclient.h | 2 +- src/client/src/tscServer.c | 35 +++++++++++++---------------------- 2 files changed, 14 insertions(+), 23 deletions(-) diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index 4e42bcfdf7..b82551dd94 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -358,7 +358,7 @@ int tsParseSql(SSqlObj *pSql, bool multiVnodeInsertion); void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet); int tscProcessSql(SSqlObj *pSql); -int tscRenewMeterMeta(SSqlObj *pSql, char *tableId); +int tscRenewTableMeta(SSqlObj *pSql, char *tableId); void tscQueueAsyncRes(SSqlObj *pSql); void tscQueueAsyncError(void(*fp), void *param, int32_t code); diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 089c951af3..e9daf1dfc1 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -239,16 +239,6 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet) { STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); if (rpcMsg->code == TSDB_CODE_TDB_INVALID_TABLE_ID || rpcMsg->code == TSDB_CODE_VND_INVALID_VGROUP_ID || rpcMsg->code == TSDB_CODE_RPC_NETWORK_UNAVAIL) { - /* - * not_active_table: 1. the virtual node may fail to create table, since the procedure of create table is asynchronized, - * the virtual node may have not create table till now, so try again by using the new metermeta. - * 2. this requested table may have been removed by other client, so we need to renew the - * metermeta here. - * - * not_active_vnode: current vnode is move to other node due to node balance procedure or virtual node have been - * removed. So, renew metermeta and try again. - * not_active_session: db has been move to other node, the vnode does not exist on this dnode anymore. - */ if (pCmd->command == TSDB_SQL_CONNECT) { rpcMsg->code = TSDB_CODE_RPC_NETWORK_UNAVAIL; rpcFreeCont(rpcMsg->pCont); @@ -258,8 +248,7 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet) { rpcFreeCont(rpcMsg->pCont); return; } else if (pCmd->command == TSDB_SQL_META) { -// rpcFreeCont(rpcMsg->pCont); -// return; + // get table meta query will not retry, do nothing } else { tscWarn("%p it shall renew table meta, code:%s, retry:%d", pSql, tstrerror(rpcMsg->code), ++pSql->retry); @@ -267,13 +256,14 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet) { if (pSql->retry > pSql->maxRetry) { tscError("%p max retry %d reached, give up", pSql, pSql->maxRetry); } else { - rpcMsg->code = tscRenewMeterMeta(pSql, pTableMetaInfo->name); - if (pTableMetaInfo->pTableMeta) { - tscSendMsgToServer(pSql); + rpcMsg->code = tscRenewTableMeta(pSql, pTableMetaInfo->name); + + // if there is an error occurring, proceed to the following error handling procedure. + // todo add test cases + if (rpcMsg->code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) { + rpcFreeCont(rpcMsg->pCont); + return; } - - rpcFreeCont(rpcMsg->pCont); - return; } } } @@ -330,9 +320,10 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet) { } } - if (pRes->code == TSDB_CODE_SUCCESS && tscProcessMsgRsp[pCmd->command]) + if (pRes->code == TSDB_CODE_SUCCESS && tscProcessMsgRsp[pCmd->command]) { + assert(pRes->pRsp != NULL); rpcMsg->code = (*tscProcessMsgRsp[pCmd->command])(pSql); - + } if (rpcMsg->code != TSDB_CODE_TSC_ACTION_IN_PROGRESS) { rpcMsg->code = (pRes->code == TSDB_CODE_SUCCESS) ? pRes->numOfRows: pRes->code; @@ -2358,7 +2349,7 @@ static int32_t getTableMetaFromMgmt(SSqlObj *pSql, STableMetaInfo *pTableMetaInf int32_t code = tscProcessSql(pNew); if (code == TSDB_CODE_SUCCESS) { - code = TSDB_CODE_TSC_ACTION_IN_PROGRESS; + code = TSDB_CODE_TSC_ACTION_IN_PROGRESS; // notify upper application that current process need to be terminated } return code; @@ -2395,7 +2386,7 @@ int tscGetMeterMetaEx(SSqlObj *pSql, STableMetaInfo *pTableMetaInfo, bool create * @param tableId table full name * @return status code */ -int tscRenewMeterMeta(SSqlObj *pSql, char *tableId) { +int tscRenewTableMeta(SSqlObj *pSql, char *tableId) { SSqlCmd *pCmd = &pSql->cmd; SQueryInfo * pQueryInfo = tscGetQueryInfoDetail(pCmd, 0); From aab502f2710971df305697a25382e29ccae6ad52 Mon Sep 17 00:00:00 2001 From: Hongze Cheng Date: Mon, 8 Jun 2020 09:25:48 +0000 Subject: [PATCH 19/55] TD-545 --- src/tsdb/src/tsdbMeta.c | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/src/tsdb/src/tsdbMeta.c b/src/tsdb/src/tsdbMeta.c index 820d2df888..40e5667893 100644 --- a/src/tsdb/src/tsdbMeta.c +++ b/src/tsdb/src/tsdbMeta.c @@ -74,14 +74,16 @@ void tsdbEncodeTable(STable *pTable, char *buf, int *contLen) { STable *tsdbDecodeTable(void *cont, int contLen) { STable *pTable = (STable *)calloc(1, sizeof(STable)); if (pTable == NULL) return NULL; - pTable->schema = (STSchema **)malloc(sizeof(STSchema *) * TSDB_MAX_TABLE_SCHEMAS); - if (pTable->schema == NULL) { - free(pTable); - return NULL; - } void *ptr = cont; T_READ_MEMBER(ptr, int8_t, pTable->type); + if (pTable->type != TSDB_CHILD_TABLE) { + pTable->schema = (STSchema **)malloc(sizeof(STSchema *) * TSDB_MAX_TABLE_SCHEMAS); + if (pTable->schema == NULL) { + free(pTable); + return NULL; + } + } int len = *(int *)ptr; ptr = (char *)ptr + sizeof(int); pTable->name = calloc(1, len + VARSTR_HEADER_SIZE + 1); From fb9057648bf4849f8e772110e0f1c8748b01b6fa Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:26:57 +0000 Subject: [PATCH 20/55] [TD_543] fix coverity scan, cid:267767 --- src/plugins/http/src/httpUtil.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/plugins/http/src/httpUtil.c b/src/plugins/http/src/httpUtil.c index 77fc399272..b91b89e21c 100644 --- a/src/plugins/http/src/httpUtil.c +++ b/src/plugins/http/src/httpUtil.c @@ -32,12 +32,12 @@ bool httpCheckUsedbSql(char *sql) { void httpTimeToString(time_t t, char *buf, int buflen) { memset(buf, 0, (size_t)buflen); - char ts[30] = {0}; + char ts[32] = {0}; struct tm *ptm; time_t tt = t / 1000; ptm = localtime(&tt); - strftime(ts, 64, "%Y-%m-%d %H:%M:%S", ptm); + strftime(ts, 31, "%Y-%m-%d %H:%M:%S", ptm); sprintf(buf, "%s.%03ld", ts, t % 1000); } From 422e45bd250697994538b9c70ea03fb0d58c7aa2 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:30:57 +0000 Subject: [PATCH 21/55] [TD_543] fix coverity scan, cid:267773 --- src/util/src/tdes.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/util/src/tdes.c b/src/util/src/tdes.c index 00474e4ae2..3112fb4111 100644 --- a/src/util/src/tdes.c +++ b/src/util/src/tdes.c @@ -18,6 +18,7 @@ void generate_key(unsigned char* key); void generate_sub_keys(unsigned char* main_key, key_set* key_sets); void process_message(unsigned char* message_piece, unsigned char* processed_piece, key_set* key_sets, int mode); +#if 0 int64_t taosDesGenKey() { unsigned int iseed = (unsigned int)time(NULL); srand(iseed); @@ -27,6 +28,7 @@ int64_t taosDesGenKey() { return *((int64_t*)key); } +#endif char* taosDesImp(unsigned char* key, char* src, unsigned int len, int process_mode) { unsigned int number_of_blocks = len / 8; From 06467c3e937322271afbbdd5863bfb313dfae391 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 8 Jun 2020 17:36:49 +0800 Subject: [PATCH 22/55] [td-547] --- src/query/src/qExecutor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 0ff9a7e480..26502a7408 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -5820,10 +5820,11 @@ int32_t qCreateQueryInfo(void *tsdb, int32_t vgId, SQueryTableMsg *pQueryMsg, qi _over: tfree(tagCond); tfree(tbnameCond); + tfree(pGroupColIndex); taosArrayDestroy(pTableIdList); + //pQInfo already freed in initQInfo, but *pQInfo may not pointer to null; if (code != TSDB_CODE_SUCCESS) { - //pQInfo already freed in initQInfo, but *pQInfo may not pointer to null; *pQInfo = NULL; } From 628bb01969186927ef4902e77b927bfec300688e Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 09:46:21 +0000 Subject: [PATCH 23/55] [TD_543] fix coverity scan, cid:267787 --- src/client/src/tscSub.c | 4 +++- src/client/src/tscSystem.c | 9 +++++---- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/client/src/tscSub.c b/src/client/src/tscSub.c index 9baf49ff21..1a1305825b 100644 --- a/src/client/src/tscSub.c +++ b/src/client/src/tscSub.c @@ -301,7 +301,9 @@ void tscSaveSubscriptionProgress(void* sub) { char path[256]; sprintf(path, "%s/subscribe", tsDataDir); if (access(path, 0) != 0) { - mkdir(path, 0777); + if (mkdir(path, 0777) != 0 && errno != EEXIST) { + tscError("failed to create subscribe dir: %s", path); + } } sprintf(path, "%s/subscribe/%s", tsDataDir, pSub->topic); diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index 75249e44ee..d3c8eefbb9 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -80,9 +80,8 @@ int32_t tscInitRpc(const char *user, const char *secret, void** pDnodeConn) { } void taos_init_imp() { - char temp[128]; - struct stat dirstat; - + char temp[128]; + errno = TSDB_CODE_SUCCESS; srand(taosGetTimestampSec()); deltaToUtcInitOnce(); @@ -94,7 +93,9 @@ void taos_init_imp() { taosReadGlobalLogCfg(); // For log directory - if (stat(tsLogDir, &dirstat) < 0) mkdir(tsLogDir, 0755); + if (mkdir(tsLogDir, 0755) != 0 && errno != EEXIST) { + printf("failed to create log dir:%s\n", tsLogDir); + } sprintf(temp, "%s/taoslog", tsLogDir); if (taosInitLog(temp, tsNumOfLogLines, 10) < 0) { From cf0a90ceee78696466ba17b6ba601e9113daad1b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Mon, 8 Jun 2020 18:16:23 +0800 Subject: [PATCH 24/55] [td-225] remove an assert --- src/client/src/tscServer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index e9daf1dfc1..f96b979105 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -321,7 +321,6 @@ void tscProcessMsgFromServer(SRpcMsg *rpcMsg, SRpcIpSet *pIpSet) { } if (pRes->code == TSDB_CODE_SUCCESS && tscProcessMsgRsp[pCmd->command]) { - assert(pRes->pRsp != NULL); rpcMsg->code = (*tscProcessMsgRsp[pCmd->command])(pSql); } From 49eeb2abdbecf4df736ca1e796291178e361c881 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Mon, 8 Jun 2020 18:32:21 +0800 Subject: [PATCH 25/55] fix delete_datafiles issue. --- .../random-test-multi-threading-3.py | 2 +- .../random-test-multi-threading.py | 2 +- tests/pytest/stream/stream1.py | 25 +++++++++++++------ tests/pytest/stream/stream2.py | 24 +++++++++++------- 4 files changed, 34 insertions(+), 19 deletions(-) diff --git a/tests/pytest/random-test/random-test-multi-threading-3.py b/tests/pytest/random-test/random-test-multi-threading-3.py index db85ce2fe0..cab17c4c1a 100644 --- a/tests/pytest/random-test/random-test-multi-threading-3.py +++ b/tests/pytest/random-test/random-test-multi-threading-3.py @@ -205,7 +205,7 @@ class Test (Thread): global written dnodesDir = tdDnodes.getDnodesRootDir() - dataDir = dnodesDir + '/dnode1/*' + dataDir = dnodesDir + '/dnode1/data/*' deleteCmd = 'rm -rf %s' % dataDir os.system(deleteCmd) diff --git a/tests/pytest/random-test/random-test-multi-threading.py b/tests/pytest/random-test/random-test-multi-threading.py index 7d1a8a155d..1d8a5c3c82 100644 --- a/tests/pytest/random-test/random-test-multi-threading.py +++ b/tests/pytest/random-test/random-test-multi-threading.py @@ -208,7 +208,7 @@ class Test (threading.Thread): global written dnodesDir = tdDnodes.getDnodesRootDir() - dataDir = dnodesDir + '/dnode1/*' + dataDir = dnodesDir + '/dnode1/data/*' deleteCmd = 'rm -rf %s' % dataDir os.system(deleteCmd) diff --git a/tests/pytest/stream/stream1.py b/tests/pytest/stream/stream1.py index 7a9d88da3b..3b88b4f9f3 100644 --- a/tests/pytest/stream/stream1.py +++ b/tests/pytest/stream/stream1.py @@ -31,21 +31,26 @@ class TDTestCase: tdSql.prepare() tdLog.info("===== step1 =====") - tdSql.execute("create table stb0(ts timestamp, col1 int, col2 float) tags(tgcol int)") + tdSql.execute( + "create table stb0(ts timestamp, col1 int, col2 float) tags(tgcol int)") for i in range(tbNum): tdSql.execute("create table tb%d using stb0 tags(%d)" % (i, i)) for j in range(rowNum): - tdSql.execute("insert into tb%d values (now - %dm, %d, %d)" % (i, 1440 - j, j, j)) + tdSql.execute( + "insert into tb%d values (now - %dm, %d, %d)" % + (i, 1440 - j, j, j)) time.sleep(0.1) tdLog.info("===== step2 =====") - tdSql.query("select count(*), count(col1), count(col2) from tb0 interval(1d)") + tdSql.query( + "select count(*), count(col1), count(col2) from tb0 interval(1d)") tdSql.checkData(0, 1, rowNum) tdSql.checkData(0, 2, rowNum) tdSql.checkData(0, 3, rowNum) tdSql.query("show tables") tdSql.checkRows(tbNum) - tdSql.execute("create table s0 as select count(*), count(col1), count(col2) from tb0 interval(1d)") + tdSql.execute( + "create table s0 as select count(*), count(col1), count(col2) from tb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 1) @@ -67,7 +72,8 @@ class TDTestCase: tdLog.info("===== step6 =====") time.sleep(0.1) - tdSql.execute("create table s0 as select count(*), count(col1), count(col2) from tb0 interval(1d)") + tdSql.execute( + "create table s0 as select count(*), count(col1), count(col2) from tb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 1) @@ -81,14 +87,16 @@ class TDTestCase: tdSql.checkData(0, 3, rowNum) tdLog.info("===== step8 =====") - tdSql.query("select count(*), count(col1), count(col2) from stb0 interval(1d)") + tdSql.query( + "select count(*), count(col1), count(col2) from stb0 interval(1d)") tdSql.checkData(0, 1, rowNum * tbNum) tdSql.checkData(0, 2, rowNum * tbNum) tdSql.checkData(0, 3, rowNum * tbNum) tdSql.query("show tables") tdSql.checkRows(tbNum + 1) - tdSql.execute("create table s1 as select count(*), count(col1), count(col2) from stb0 interval(1d)") + tdSql.execute( + "create table s1 as select count(*), count(col1), count(col2) from stb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 2) @@ -110,7 +118,8 @@ class TDTestCase: tdSql.error("select * from s1") tdLog.info("===== step12 =====") - tdSql.execute("create table s1 as select count(*), count(col1), count(col2) from stb0 interval(1d)") + tdSql.execute( + "create table s1 as select count(*), count(col1), count(col2) from stb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 2) diff --git a/tests/pytest/stream/stream2.py b/tests/pytest/stream/stream2.py index 96eff3131d..7b77dc7793 100644 --- a/tests/pytest/stream/stream2.py +++ b/tests/pytest/stream/stream2.py @@ -24,7 +24,6 @@ class TDTestCase: tdLog.debug("start to execute %s" % __file__) tdSql.init(conn.cursor(), logSql) - def run(self): tbNum = 10 rowNum = 20 @@ -33,11 +32,14 @@ class TDTestCase: tdSql.prepare() tdLog.info("===== step1 =====") - tdSql.execute("create table stb0(ts timestamp, col1 int, col2 float) tags(tgcol int)") + tdSql.execute( + "create table stb0(ts timestamp, col1 int, col2 float) tags(tgcol int)") for i in range(tbNum): tdSql.execute("create table tb%d using stb0 tags(%d)" % (i, i)) for j in range(rowNum): - tdSql.execute("insert into tb%d values (now - %dm, %d, %d)" % (i, 1440 - j, j, j)) + tdSql.execute( + "insert into tb%d values (now - %dm, %d, %d)" % + (i, 1440 - j, j, j)) time.sleep(0.1) tdLog.info("===== step2 =====") @@ -45,7 +47,8 @@ class TDTestCase: tdSql.checkData(0, 1, rowNum) tdSql.query("show tables") tdSql.checkRows(tbNum) - tdSql.execute("create table s0 as select count(col1) from tb0 interval(1d)") + tdSql.execute( + "create table s0 as select count(col1) from tb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 1) @@ -63,7 +66,8 @@ class TDTestCase: tdSql.error("select * from s0") tdLog.info("===== step6 =====") - tdSql.execute("create table s0 as select count(*), count(col1), count(col2) from tb0 interval(1d)") + tdSql.execute( + "create table s0 as select count(*), count(col1), count(col2) from tb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 1) @@ -75,13 +79,15 @@ class TDTestCase: tdSql.checkData(0, 3, rowNum) tdLog.info("===== step8 =====") - tdSql.query("select count(*), count(col1), count(col2) from stb0 interval(1d)") + tdSql.query( + "select count(*), count(col1), count(col2) from stb0 interval(1d)") tdSql.checkData(0, 1, totalNum) tdSql.checkData(0, 2, totalNum) tdSql.checkData(0, 3, totalNum) tdSql.query("show tables") tdSql.checkRows(tbNum + 1) - tdSql.execute("create table s1 as select count(*), count(col1), count(col2) from stb0 interval(1d)") + tdSql.execute( + "create table s1 as select count(*), count(col1), count(col2) from stb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 2) @@ -101,7 +107,8 @@ class TDTestCase: tdSql.error("select * from s1") tdLog.info("===== step12 =====") - tdSql.execute("create table s1 as select count(col1) from stb0 interval(1d)") + tdSql.execute( + "create table s1 as select count(col1) from stb0 interval(1d)") tdSql.query("show tables") tdSql.checkRows(tbNum + 2) @@ -112,7 +119,6 @@ class TDTestCase: #tdSql.checkData(0, 2, None) #tdSql.checkData(0, 3, None) - def stop(self): tdSql.close() tdLog.success("%s successfully executed" % __file__) From 4dea07b26fd0bee54d046ba58593de52c0a56a04 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 10:43:55 +0000 Subject: [PATCH 26/55] [TD_543] change invalid table id to invalid table name --- src/inc/taoserror.h | 21 +++++++++++---------- src/mnode/src/mnodeTable.c | 12 ++++++------ src/mnode/src/mnodeVgroup.c | 4 ++-- src/plugins/http/src/httpJson.c | 2 +- src/plugins/http/src/tgJson.c | 2 +- tests/script/general/http/restful_full.sim | 2 +- 6 files changed, 22 insertions(+), 21 deletions(-) diff --git a/src/inc/taoserror.h b/src/inc/taoserror.h index 6012efa359..5379b371ef 100644 --- a/src/inc/taoserror.h +++ b/src/inc/taoserror.h @@ -136,16 +136,17 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_USERS, 0, 0x0355, "mnode too TAOS_DEFINE_ERROR(TSDB_CODE_MND_TABLE_ALREADY_EXIST, 0, 0x0360, "mnode table already exist") TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_TABLE_ID, 0, 0x0361, "mnode invalid table id") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_TABLE_TYPE, 0, 0x0362, "mnode invalid table type") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_TAGS, 0, 0x0363, "mnode too many tags") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_TABLES, 0, 0x0364, "mnode too many tables") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_TIMESERIES, 0, 0x0365, "mnode not enough time series") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_NOT_SUPER_TABLE, 0, 0x0366, "mnode no super table") // operation only available for super table -TAOS_DEFINE_ERROR(TSDB_CODE_MND_COL_NAME_TOO_LONG, 0, 0x0367, "mnode column name too long") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TAG_ALREAY_EXIST, 0, 0x0368, "mnode tag already exist") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_TAG_NOT_EXIST, 0, 0x0369, "mnode tag not exist") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_ALREAY_EXIST, 0, 0x036A, "mnode field already exist") -TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_NOT_EXIST, 0, 0x036B, "mnode field not exist") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_TABLE_NAME, 0, 0x0362, "mnode invalid table name") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_TABLE_TYPE, 0, 0x0363, "mnode invalid table type") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_TAGS, 0, 0x0364, "mnode too many tags") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_TABLES, 0, 0x0365, "mnode too many tables") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_TIMESERIES, 0, 0x0366, "mnode not enough time series") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_NOT_SUPER_TABLE, 0, 0x0367, "mnode no super table") // operation only available for super table +TAOS_DEFINE_ERROR(TSDB_CODE_MND_COL_NAME_TOO_LONG, 0, 0x0368, "mnode column name too long") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TAG_ALREAY_EXIST, 0, 0x0369, "mnode tag already exist") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_TAG_NOT_EXIST, 0, 0x036A, "mnode tag not exist") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_ALREAY_EXIST, 0, 0x036B, "mnode field already exist") +TAOS_DEFINE_ERROR(TSDB_CODE_MND_FIELD_NOT_EXIST, 0, 0x036C, "mnode field not exist") TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_NOT_SELECTED, 0, 0x0380, "mnode db not selected") TAOS_DEFINE_ERROR(TSDB_CODE_MND_DB_ALREADY_EXIST, 0, 0x0381, "mnode database aleady exist") diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index 2077d6f43e..119ba1627d 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -714,7 +714,7 @@ static int32_t mnodeProcessDropTableMsg(SMnodeMsg *pMsg) { return TSDB_CODE_SUCCESS; } else { mError("table:%s, failed to drop table, table not exist", pDrop->tableId); - return TSDB_CODE_MND_INVALID_TABLE_ID; + return TSDB_CODE_MND_INVALID_TABLE_NAME; } } @@ -742,7 +742,7 @@ static int32_t mnodeProcessTableMetaMsg(SMnodeMsg *pMsg) { if (pMsg->pTable == NULL) { if (!pInfo->createFlag) { mError("table:%s, failed to get table meta, table not exist", pInfo->tableId); - return TSDB_CODE_MND_INVALID_TABLE_ID; + return TSDB_CODE_MND_INVALID_TABLE_NAME; } else { mTrace("table:%s, failed to get table meta, start auto create table ", pInfo->tableId); return mnodeAutoCreateChildTable(pMsg); @@ -779,7 +779,7 @@ static int32_t mnodeProcessCreateSuperTableMsg(SMnodeMsg *pMsg) { if (pStable->schema == NULL) { free(pStable); mError("table:%s, failed to create, no schema input", pCreate->tableId); - return TSDB_CODE_MND_INVALID_TABLE_ID; + return TSDB_CODE_MND_INVALID_TABLE_NAME; } memcpy(pStable->schema, pCreate->schema, numOfCols * sizeof(SSchema)); @@ -1340,7 +1340,7 @@ static int32_t mnodeProcessSuperTableVgroupMsg(SMnodeMsg *pMsg) { if (pRsp->numOfTables != numOfTable) { rpcFreeCont(pRsp); - return TSDB_CODE_MND_INVALID_TABLE_ID; + return TSDB_CODE_MND_INVALID_TABLE_NAME; } else { pRsp->numOfTables = htonl(pRsp->numOfTables); pMsg->rpcRsp.rsp = pRsp; @@ -1452,7 +1452,7 @@ static SChildTableObj* mnodeDoCreateChildTable(SCMCreateTableMsg *pCreate, SVgOb if (pSuperTable == NULL) { mError("table:%s, corresponding super table:%s does not exist", pCreate->tableId, pTagData->name); mnodeDestroyChildTable(pTable); - terrno = TSDB_CODE_MND_INVALID_TABLE_ID; + terrno = TSDB_CODE_MND_INVALID_TABLE_NAME; return NULL; } mnodeDecTableRef(pSuperTable); @@ -2212,7 +2212,7 @@ static int32_t mnodeProcessAlterTableMsg(SMnodeMsg *pMsg) { if (pMsg->pTable == NULL) pMsg->pTable = mnodeGetTable(pAlter->tableId); if (pMsg->pTable == NULL) { mError("table:%s, failed to alter table, table not exist", pMsg->pTable->tableId); - return TSDB_CODE_MND_INVALID_TABLE_ID; + return TSDB_CODE_MND_INVALID_TABLE_NAME; } pAlter->type = htons(pAlter->type); diff --git a/src/mnode/src/mnodeVgroup.c b/src/mnode/src/mnodeVgroup.c index 7274c879c6..25b9daf00c 100644 --- a/src/mnode/src/mnodeVgroup.c +++ b/src/mnode/src/mnodeVgroup.c @@ -383,11 +383,11 @@ int32_t mnodeGetVgroupMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) { pTable = mnodeGetTable(pShow->payload); if (NULL == pTable || pTable->type == TSDB_SUPER_TABLE) { mnodeDecTableRef(pTable); - return TSDB_CODE_MND_INVALID_TABLE_ID; + return TSDB_CODE_MND_INVALID_TABLE_NAME; } mnodeDecTableRef(pTable); pVgroup = mnodeGetVgroup(((SChildTableObj*)pTable)->vgId); - if (NULL == pVgroup) return TSDB_CODE_MND_INVALID_TABLE_ID; + if (NULL == pVgroup) return TSDB_CODE_MND_INVALID_TABLE_NAME; mnodeDecVgroupRef(pVgroup); maxReplica = pVgroup->numOfVnodes > maxReplica ? pVgroup->numOfVnodes : maxReplica; } else { diff --git a/src/plugins/http/src/httpJson.c b/src/plugins/http/src/httpJson.c index 950258533f..e5e69ae02a 100644 --- a/src/plugins/http/src/httpJson.c +++ b/src/plugins/http/src/httpJson.c @@ -445,7 +445,7 @@ void httpJsonPairStatus(JsonBuf* buf, int code) { httpJsonItemToken(buf); if (code == TSDB_CODE_MND_DB_NOT_SELECTED) { httpJsonPair(buf, "desc", 4, "failed to create database", 23); - } else if (code == TSDB_CODE_MND_INVALID_TABLE_ID) { + } else if (code == TSDB_CODE_MND_INVALID_TABLE_NAME) { httpJsonPair(buf, "desc", 4, "failed to create table", 22); } else httpJsonPair(buf, "desc", 4, (char*)tstrerror(code), (int)strlen(tstrerror(code))); diff --git a/src/plugins/http/src/tgJson.c b/src/plugins/http/src/tgJson.c index 6c0b3c8663..ed33f51d46 100644 --- a/src/plugins/http/src/tgJson.c +++ b/src/plugins/http/src/tgJson.c @@ -111,7 +111,7 @@ bool tgCheckFinished(struct HttpContext *pContext, HttpSqlCmd *cmd, int code) { pContext->ipstr); return false; } - } else if (code == TSDB_CODE_MND_INVALID_TABLE_ID) { + } else if (code == TSDB_CODE_MND_INVALID_TABLE_NAME) { cmd->cmdState = HTTP_CMD_STATE_RUN_FINISHED; if (multiCmds->cmds[multiCmds->pos - 1].cmdState == HTTP_CMD_STATE_NOT_RUN_YET) { multiCmds->pos = (int16_t)(multiCmds->pos - 2); diff --git a/tests/script/general/http/restful_full.sim b/tests/script/general/http/restful_full.sim index 7194f7cbe0..aa667daee4 100644 --- a/tests/script/general/http/restful_full.sim +++ b/tests/script/general/http/restful_full.sim @@ -147,7 +147,7 @@ print =============== step3 - db system_content curl -H 'Authorization: Taosd /KfeAzX/f9na8qdtNZmtONryp201ma04bEl8LcvLUd7a8qdtNZmtONryp201ma04' -d ' select * from d1.t1;' 127.0.0.1:6020/rest/sql print 21-> $system_content -if $system_content != @{"status":"error","code":1000,"desc":"mnode invalid table id"}@ then +if $system_content != @{"status":"error","code":1000,"desc":"mnode invalid table name"}@ then return -1 endi From aaba26a52e0864ef0777b8e91ee7b0a0f568da44 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Mon, 8 Jun 2020 11:27:28 +0000 Subject: [PATCH 27/55] fix issue that dnodes reploy delete psim log file [TD-561] --- tests/pytest/util/dnodes.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tests/pytest/util/dnodes.py b/tests/pytest/util/dnodes.py index f3ccd58432..e24af473f3 100644 --- a/tests/pytest/util/dnodes.py +++ b/tests/pytest/util/dnodes.py @@ -319,6 +319,7 @@ class TDDnodes: self.dnodes.append(TDDnode(8)) self.dnodes.append(TDDnode(9)) self.dnodes.append(TDDnode(10)) + self.simDeployed = False def init(self, path): psCmd = "ps -ef|grep -w taosd| grep -v grep | awk '{print $2}'" @@ -378,7 +379,10 @@ class TDDnodes: self.sim = TDSimClient() self.sim.init(self.path) self.sim.setTestCluster(self.testCluster) - self.sim.deploy() + + if (self.simDeployed == False): + self.sim.deploy() + self.simDeployed = True self.check(index) self.dnodes[index - 1].setTestCluster(self.testCluster) From d887fb34add603760f2bec77fd5c0b528753d5ae Mon Sep 17 00:00:00 2001 From: dengyihao Date: Mon, 8 Jun 2020 21:57:52 +0800 Subject: [PATCH 28/55] fix compile error on centos7 --- src/util/src/tcache.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/util/src/tcache.c b/src/util/src/tcache.c index 3ce051fcee..ac06cf4f3f 100644 --- a/src/util/src/tcache.c +++ b/src/util/src/tcache.c @@ -254,7 +254,7 @@ SCacheObj *taosCacheInitWithCb(int64_t refreshTime, void (*freeCb)(void *data)) return NULL; } - pthread_attr_t thattr = {0}; + pthread_attr_t thattr; pthread_attr_init(&thattr); pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE); @@ -625,4 +625,4 @@ void* taosCacheRefresh(void *handle) { } return NULL; -} \ No newline at end of file +} From 0f928893e0afbcaade07743a4fa73c0369dc5cb1 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 14:27:37 +0000 Subject: [PATCH 29/55] [TD_543] fix coverity scan, cid:267815 --- src/plugins/http/src/tgHandle.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/plugins/http/src/tgHandle.c b/src/plugins/http/src/tgHandle.c index ffb2ccb2f9..ac3df051fd 100644 --- a/src/plugins/http/src/tgHandle.c +++ b/src/plugins/http/src/tgHandle.c @@ -303,7 +303,7 @@ bool tgGetUserFromUrl(HttpContext *pContext) { return false; } - strcpy(pContext->user, pParser->path[TG_USER_URL_POS].pos); + tstrncpy(pContext->user, pParser->path[TG_USER_URL_POS].pos, TSDB_USER_LEN); return true; } From dadb3adecc12178a97b4521680f3108c8507259e Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 14:29:43 +0000 Subject: [PATCH 30/55] [TD_543] fix coverity scan, cid:267813 --- src/kit/taosdump/taosdump.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c index f03b46ac47..d96f80ed20 100644 --- a/src/kit/taosdump/taosdump.c +++ b/src/kit/taosdump/taosdump.c @@ -646,10 +646,9 @@ int taosDumpDb(SDbInfo *dbInfo, SDumpArguments *arguments, FILE *fp) { taosDumpTable(tableRecord.name, tableRecord.metric, arguments, fp); } - tclose(fd); - remove(".table.tmp"); + close(fd); - return 0; + return remove(".table.tmp"); } void taosDumpCreateTableClause(STableDef *tableDes, int numOfCols, SDumpArguments *arguments, FILE *fp) { From a8d35dbc49785d280866d61dfaecc942a594b063 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 14:44:55 +0000 Subject: [PATCH 31/55] [TD_543] fix coverity scan, cid:267820 267853 --- src/kit/shell/src/shellEngine.c | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/kit/shell/src/shellEngine.c b/src/kit/shell/src/shellEngine.c index 954f2cb8a3..f04607f6fa 100644 --- a/src/kit/shell/src/shellEngine.c +++ b/src/kit/shell/src/shellEngine.c @@ -727,10 +727,6 @@ void read_history() { char f_history[TSDB_FILENAME_LEN]; get_history_path(f_history); - if (access(f_history, R_OK) == -1) { - return; - } - FILE *f = fopen(f_history, "r"); if (f == NULL) { fprintf(stderr, "Opening file %s\n", f_history); @@ -809,14 +805,6 @@ void source_file(TAOS *con, char *fptr) { return; } - if (access(fname, R_OK) != 0) { - fprintf(stderr, "ERROR: file %s is not readable\n", fptr); - - wordfree(&full_path); - free(cmd); - return; - } - FILE *f = fopen(fname, "r"); if (f == NULL) { fprintf(stderr, "ERROR: failed to open file %s\n", fname); From 45f66a9498267ac106cf1a478fd9b00b07c09377 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Mon, 8 Jun 2020 15:07:48 +0000 Subject: [PATCH 32/55] [TD_543] fix coverity scan, cid:267826 --- src/util/src/tlog.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/src/util/src/tlog.c b/src/util/src/tlog.c index 47521fc36e..01a0eabbca 100644 --- a/src/util/src/tlog.c +++ b/src/util/src/tlog.c @@ -191,15 +191,14 @@ void taosResetLog() { } static bool taosCheckFileIsOpen(char *logFileName) { - int32_t exist = access(logFileName, F_OK); - if (exist != 0) { - return false; - } - - int32_t fd = open(logFileName, O_WRONLY | O_CREAT, S_IRWXU | S_IRWXG | S_IRWXO); + int32_t fd = open(logFileName, O_WRONLY, S_IRWXU | S_IRWXG | S_IRWXO); if (fd < 0) { - printf("\nfailed to open log file:%s, reason:%s\n", logFileName, strerror(errno)); - return true; + if (errno == ENOENT) { + return false; + } else { + printf("\nfailed to open log file:%s, reason:%s\n", logFileName, strerror(errno)); + return true; + } } if (taosLockFile(fd)) { From 5580212d045b825999ebac3a6b1b3a25d02588f3 Mon Sep 17 00:00:00 2001 From: Steven Li Date: Mon, 8 Jun 2020 17:37:31 -0700 Subject: [PATCH 33/55] Added errno to Python client, plus minor tweaks --- src/connector/python/linux/python2/taos/cursor.py | 2 +- src/connector/python/linux/python3/taos/cursor.py | 2 +- src/connector/python/windows/python2/taos/cursor.py | 2 +- src/connector/python/windows/python3/taos/cursor.py | 2 +- tests/pytest/crash_gen.py | 10 ++++++---- 5 files changed, 10 insertions(+), 8 deletions(-) diff --git a/src/connector/python/linux/python2/taos/cursor.py b/src/connector/python/linux/python2/taos/cursor.py index f7c840442e..8c268d8afb 100644 --- a/src/connector/python/linux/python2/taos/cursor.py +++ b/src/connector/python/linux/python2/taos/cursor.py @@ -137,7 +137,7 @@ class TDengineCursor(object): else: raise ProgrammingError( CTaosInterface.errStr( - self._result )) + self._result ), errno) def executemany(self, operation, seq_of_parameters): """Prepare a database operation (query or command) and then execute it against all parameter sequences or mappings found in the sequence seq_of_parameters. diff --git a/src/connector/python/linux/python3/taos/cursor.py b/src/connector/python/linux/python3/taos/cursor.py index 5db5365eb3..06d6a19462 100644 --- a/src/connector/python/linux/python3/taos/cursor.py +++ b/src/connector/python/linux/python3/taos/cursor.py @@ -139,7 +139,7 @@ class TDengineCursor(object): else: raise ProgrammingError( CTaosInterface.errStr( - self._result )) + self._result), errno) def executemany(self, operation, seq_of_parameters): """Prepare a database operation (query or command) and then execute it against all parameter sequences or mappings found in the sequence seq_of_parameters. diff --git a/src/connector/python/windows/python2/taos/cursor.py b/src/connector/python/windows/python2/taos/cursor.py index 1da726638a..7eee3bfc8f 100644 --- a/src/connector/python/windows/python2/taos/cursor.py +++ b/src/connector/python/windows/python2/taos/cursor.py @@ -117,7 +117,7 @@ class TDengineCursor(object): self._fields = CTaosInterface.useResult(self._result) return self._handle_result() else: - raise ProgrammingError(CTaosInterface.errStr(self._result)) + raise ProgrammingError(CTaosInterface.errStr(self._result), errno) def executemany(self, operation, seq_of_parameters): """Prepare a database operation (query or command) and then execute it against all parameter sequences or mappings found in the sequence seq_of_parameters. diff --git a/src/connector/python/windows/python3/taos/cursor.py b/src/connector/python/windows/python3/taos/cursor.py index 2dcd0aaccb..5f5aa4e1d7 100644 --- a/src/connector/python/windows/python3/taos/cursor.py +++ b/src/connector/python/windows/python3/taos/cursor.py @@ -117,7 +117,7 @@ class TDengineCursor(object): self._fields = CTaosInterface.useResult(self._result ) return self._handle_result() else: - raise ProgrammingError(CTaosInterface.errStr(self._result )) + raise ProgrammingError(CTaosInterface.errStr(self._result ), errno) def executemany(self, operation, seq_of_parameters): """Prepare a database operation (query or command) and then execute it against all parameter sequences or mappings found in the sequence seq_of_parameters. diff --git a/tests/pytest/crash_gen.py b/tests/pytest/crash_gen.py index dfd2034f7e..c88683aa09 100755 --- a/tests/pytest/crash_gen.py +++ b/tests/pytest/crash_gen.py @@ -730,13 +730,15 @@ class DbState(): # when we re-run the test in 3 minutes (180 seconds), basically we should expand time duration # by a factor of 500. # TODO: what if it goes beyond 10 years into the future + # TODO: fix the error as result of above: "tsdb timestamp is out of range" def setupLastTick(self): - t1 = datetime.datetime(2020, 5, 30) + t1 = datetime.datetime(2020, 6, 1) t2 = datetime.datetime.now() - elSec = t2.timestamp() - t1.timestamp() + elSec = int(t2.timestamp() - t1.timestamp()) # maybe a very large number, takes 69 years to exceed Python int range + elSec2 = ( elSec % (8 * 12 * 30 * 24 * 60 * 60 / 500 ) ) * 500 # a number representing seconds within 10 years # print("elSec = {}".format(elSec)) t3 = datetime.datetime(2012, 1, 1) # default "keep" is 10 years - t4 = datetime.datetime.fromtimestamp( t3.timestamp() + elSec * 500) # see explanation above + t4 = datetime.datetime.fromtimestamp( t3.timestamp() + elSec2) # see explanation above logger.info("Setting up TICKS to start from: {}".format(t4)) return t4 @@ -963,7 +965,7 @@ class Task(): try: self._executeInternal(te, wt) # TODO: no return value? except taos.error.ProgrammingError as err: - self.logDebug("[=] Taos library exception: errno={}, msg: {}".format(err.errno, err)) + self.logDebug("[=] Taos library exception: errno={:X}, msg: {}".format(err.errno, err)) self._err = err except: self.logDebug("[=] Unexpected exception") From 78c1351f9932ea20dccb4dc3385cda253282e80d Mon Sep 17 00:00:00 2001 From: Jeff Tao Date: Tue, 9 Jun 2020 00:58:04 +0000 Subject: [PATCH 34/55] failed to open TCP server socket, return error for RPC initialization --- src/dnode/src/dnodeSystem.c | 1 + src/rpc/src/rpcTcp.c | 25 +++++++++-------- src/rpc/src/rpcUdp.c | 54 ++++++++++++++++++++----------------- 3 files changed, 45 insertions(+), 35 deletions(-) diff --git a/src/dnode/src/dnodeSystem.c b/src/dnode/src/dnodeSystem.c index 97cf6f7eeb..0a983362c2 100644 --- a/src/dnode/src/dnodeSystem.c +++ b/src/dnode/src/dnodeSystem.c @@ -92,6 +92,7 @@ int32_t main(int32_t argc, char *argv[]) { // Initialize the system if (dnodeInitSystem() < 0) { syslog(LOG_ERR, "Error initialize TDengine system"); + dPrint("Failed to start TDengine, please check the log at:%s", tsLogDir); closelog(); exit(EXIT_FAILURE); } diff --git a/src/rpc/src/rpcTcp.c b/src/rpc/src/rpcTcp.c index 04a269502e..7035b30b66 100644 --- a/src/rpc/src/rpcTcp.c +++ b/src/rpc/src/rpcTcp.c @@ -67,7 +67,7 @@ static void *taosProcessTcpData(void *param); static SFdObj *taosMallocFdObj(SThreadObj *pThreadObj, int fd); static void taosFreeFdObj(SFdObj *pFdObj); static void taosReportBrokenLink(SFdObj *pFdObj); -static void* taosAcceptTcpConnection(void *arg); +static void *taosAcceptTcpConnection(void *arg); void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThreads, void *fp, void *shandle) { SServerObj *pServerObj; @@ -80,6 +80,7 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread return NULL; } + pServerObj->fd = -1; pServerObj->thread = 0; pServerObj->ip = ip; pServerObj->port = port; @@ -99,6 +100,7 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread pthread_attr_init(&thattr); pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE); + // initialize parameters in case it may encounter error later pThreadObj = pServerObj->pThreadObj; for (int i = 0; i < numOfThreads; ++i) { pThreadObj->pollFd = -1; @@ -106,18 +108,21 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread pThreadObj->processData = fp; tstrncpy(pThreadObj->label, label, sizeof(pThreadObj->label)); pThreadObj->shandle = shandle; + pThreadObj++; + } + // initialize mutex, thread, fd which may fail + pThreadObj = pServerObj->pThreadObj; + for (int i = 0; i < numOfThreads; ++i) { code = pthread_mutex_init(&(pThreadObj->mutex), NULL); if (code < 0) { tError("%s failed to init TCP process data mutex(%s)", label, strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); break;; } pThreadObj->pollFd = epoll_create(10); // size does not matter if (pThreadObj->pollFd < 0) { tError("%s failed to create TCP epoll", label); - terrno = TAOS_SYSTEM_ERROR(errno); code = -1; break; } @@ -125,7 +130,6 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread code = pthread_create(&(pThreadObj->thread), &thattr, taosProcessTcpData, (void *)(pThreadObj)); if (code != 0) { tError("%s failed to create TCP process data thread(%s)", label, strerror(errno)); - terrno = TAOS_SYSTEM_ERROR(errno); break; } @@ -133,15 +137,18 @@ void *taosInitTcpServer(uint32_t ip, uint16_t port, char *label, int numOfThread pThreadObj++; } + pServerObj->fd = taosOpenTcpServerSocket(pServerObj->ip, pServerObj->port); + if (pServerObj->fd < 0) code = -1; + if (code == 0) { - code = pthread_create(&(pServerObj->thread), &thattr, (void *)taosAcceptTcpConnection, (void *)(pServerObj)); + code = pthread_create(&pServerObj->thread, &thattr, taosAcceptTcpConnection, (void *)pServerObj); if (code != 0) { - terrno = TAOS_SYSTEM_ERROR(errno); tError("%s failed to create TCP accept thread(%s)", label, strerror(errno)); } } if (code != 0) { + terrno = TAOS_SYSTEM_ERROR(errno); taosCleanUpTcpServer(pServerObj); pServerObj = NULL; } else { @@ -204,7 +211,7 @@ void taosCleanUpTcpServer(void *handle) { tfree(pServerObj); } -static void* taosAcceptTcpConnection(void *arg) { +static void *taosAcceptTcpConnection(void *arg) { int connFd = -1; struct sockaddr_in caddr; int threadId = 0; @@ -212,10 +219,6 @@ static void* taosAcceptTcpConnection(void *arg) { SServerObj *pServerObj; pServerObj = (SServerObj *)arg; - - pServerObj->fd = taosOpenTcpServerSocket(pServerObj->ip, pServerObj->port); - if (pServerObj->fd < 0) return NULL; - tTrace("%s TCP server is ready, ip:0x%x:%hu", pServerObj->label, pServerObj->ip, pServerObj->port); while (1) { diff --git a/src/rpc/src/rpcUdp.c b/src/rpc/src/rpcUdp.c index 7e2fe0db61..279cf7ed49 100644 --- a/src/rpc/src/rpcUdp.c +++ b/src/rpc/src/rpcUdp.c @@ -19,6 +19,7 @@ #include "ttimer.h" #include "tutil.h" #include "taosdef.h" +#include "taoserror.h" #include "rpcLog.h" #include "rpcUdp.h" #include "rpcHead.h" @@ -65,6 +66,7 @@ void *taosInitUdpConnection(uint32_t ip, uint16_t port, char *label, int threads pSet = (SUdpConnSet *)malloc((size_t)size); if (pSet == NULL) { tError("%s failed to allocate UdpConn", label); + terrno = TAOS_SYSTEM_ERROR(errno); return NULL; } @@ -73,30 +75,34 @@ void *taosInitUdpConnection(uint32_t ip, uint16_t port, char *label, int threads pSet->port = port; pSet->shandle = shandle; pSet->fp = fp; + pSet->threads = threads; tstrncpy(pSet->label, label, sizeof(pSet->label)); + pthread_attr_t thAttr; + pthread_attr_init(&thAttr); + pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE); + + int i; uint16_t ownPort; - for (int i = 0; i < threads; ++i) { + for (i = 0; i < threads; ++i) { pConn = pSet->udpConn + i; ownPort = (port ? port + i : 0); pConn->fd = taosOpenUdpSocket(ip, ownPort); if (pConn->fd < 0) { tError("%s failed to open UDP socket %x:%hu", label, ip, port); - taosCleanUpUdpConnection(pSet); - return NULL; + break; } pConn->buffer = malloc(RPC_MAX_UDP_SIZE); if (NULL == pConn->buffer) { tError("%s failed to malloc recv buffer", label); - taosCleanUpUdpConnection(pSet); - return NULL; + break; } struct sockaddr_in sin; unsigned int addrlen = sizeof(sin); - if (getsockname(pConn->fd, (struct sockaddr *)&sin, &addrlen) == 0 && sin.sin_family == AF_INET && - addrlen == sizeof(sin)) { + if (getsockname(pConn->fd, (struct sockaddr *)&sin, &addrlen) == 0 && + sin.sin_family == AF_INET && addrlen == sizeof(sin)) { pConn->localPort = (uint16_t)ntohs(sin.sin_port); } @@ -107,23 +113,22 @@ void *taosInitUdpConnection(uint32_t ip, uint16_t port, char *label, int threads pConn->pSet = pSet; pConn->signature = pConn; - pthread_attr_t thAttr; - pthread_attr_init(&thAttr); - pthread_attr_setdetachstate(&thAttr, PTHREAD_CREATE_JOINABLE); int code = pthread_create(&pConn->thread, &thAttr, taosRecvUdpData, pConn); - pthread_attr_destroy(&thAttr); if (code != 0) { - tError("%s failed to create thread to process UDP data, reason:%s", label, strerror(errno)); - taosCloseSocket(pConn->fd); - taosCleanUpUdpConnection(pSet); - return NULL; + tError("%s failed to create thread to process UDP data(%s)", label, strerror(errno)); + break; } - - ++pSet->threads; } - tTrace("%s UDP connection is initialized, ip:%x port:%hu threads:%d", label, ip, port, threads); + pthread_attr_destroy(&thAttr); + if (i != threads) { + terrno = TAOS_SYSTEM_ERROR(errno); + taosCleanUpUdpConnection(pSet); + return NULL; + } + + tTrace("%s UDP connection is initialized, ip:%x:%hu threads:%d", label, ip, port, threads); return pSet; } @@ -136,16 +141,17 @@ void taosCleanUpUdpConnection(void *handle) { for (int i = 0; i < pSet->threads; ++i) { pConn = pSet->udpConn + i; pConn->signature = NULL; + // shutdown to signal the thread to exit - shutdown(pConn->fd, SHUT_RD); + if ( pConn->fd >=0) shutdown(pConn->fd, SHUT_RD); } for (int i = 0; i < pSet->threads; ++i) { pConn = pSet->udpConn + i; - pthread_join(pConn->thread, NULL); - free(pConn->buffer); - taosCloseSocket(pConn->fd); - tTrace("chandle:%p is closed", pConn); + if (pConn->thread) pthread_join(pConn->thread, NULL); + if (pConn->fd >=0) taosCloseSocket(pConn->fd); + tfree(pConn->buffer); + tTrace("UDP chandle:%p is closed", pConn); } tfree(pSet); @@ -159,7 +165,7 @@ void *taosOpenUdpConnection(void *shandle, void *thandle, uint32_t ip, uint16_t SUdpConn *pConn = pSet->udpConn + pSet->index; pConn->port = port; - tTrace("%s UDP connection is setup, ip:%x:%hu, local:%x:%d", pConn->label, ip, port, pSet->ip, pConn->localPort); + tTrace("%s UDP connection is setup, ip:%x:%hu", pConn->label, ip, port); return pConn; } From da7fd6459a955b21942f567eb1c8b76d079bea4d Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 9 Jun 2020 02:40:31 +0000 Subject: [PATCH 35/55] [TD_543] fix coverity scan, cid:267831 --- src/plugins/http/src/gcHandle.c | 22 +++++++++++++++++++-- src/plugins/http/src/httpSql.c | 2 +- src/plugins/http/src/restHandle.c | 32 ++++++++++++++++++++++++++++--- src/plugins/http/src/tgHandle.c | 13 ++++++++++--- 4 files changed, 60 insertions(+), 9 deletions(-) diff --git a/src/plugins/http/src/gcHandle.c b/src/plugins/http/src/gcHandle.c index fbe6757ccb..4120980123 100644 --- a/src/plugins/http/src/gcHandle.c +++ b/src/plugins/http/src/gcHandle.c @@ -22,9 +22,27 @@ #include "taosdef.h" static HttpDecodeMethod gcDecodeMethod = {"grafana", gcProcessRequest}; -static HttpEncodeMethod gcHeartBeatMethod = {NULL, gcSendHeartBeatResp, NULL, NULL, NULL, NULL, NULL, NULL}; +static HttpEncodeMethod gcHeartBeatMethod = { + .startJsonFp = NULL, + .stopJsonFp = gcSendHeartBeatResp, + .buildQueryJsonFp = NULL, + .buildAffectRowJsonFp = NULL, + .initJsonFp = NULL, + .cleanJsonFp = NULL, + .checkFinishedFp = NULL, + .setNextCmdFp = NULL +}; + static HttpEncodeMethod gcQueryMethod = { - NULL, gcStopQueryJson, gcBuildQueryJson, NULL, gcInitQueryJson, gcCleanQueryJson, NULL, NULL}; + .startJsonFp = NULL, + .stopJsonFp = gcStopQueryJson, + .buildQueryJsonFp = gcBuildQueryJson, + .buildAffectRowJsonFp = NULL, + .initJsonFp = gcInitQueryJson, + .cleanJsonFp = gcCleanQueryJson, + .checkFinishedFp = NULL, + .setNextCmdFp = NULL +}; void gcInitHandle(HttpServer* pServer) { httpAddMethod(pServer, &gcDecodeMethod); } diff --git a/src/plugins/http/src/httpSql.c b/src/plugins/http/src/httpSql.c index af9ad8e38a..6ff93b3e8a 100644 --- a/src/plugins/http/src/httpSql.c +++ b/src/plugins/http/src/httpSql.c @@ -87,7 +87,7 @@ void httpProcessMultiSqlCallBack(void *param, TAOS_RES *result, int code) { } if (code < 0) { - if (encode->checkFinishedFp != NULL && !encode->checkFinishedFp(pContext, singleCmd, code >= 0 ? 0 : code)) { + if (encode->checkFinishedFp != NULL && !encode->checkFinishedFp(pContext, singleCmd, -code)) { singleCmd->code = code; httpTrace("context:%p, fd:%d, ip:%s, user:%s, process pos jump to:%d, last code:%s, last sql:%s", pContext, pContext->fd, pContext->ipstr, pContext->user, multiCmds->pos + 1, tstrerror(code), sql); diff --git a/src/plugins/http/src/restHandle.c b/src/plugins/http/src/restHandle.c index a2dc7d06a1..d481a654d8 100644 --- a/src/plugins/http/src/restHandle.c +++ b/src/plugins/http/src/restHandle.c @@ -22,11 +22,37 @@ static HttpDecodeMethod restDecodeMethod = {"rest", restProcessRequest}; static HttpDecodeMethod restDecodeMethod2 = {"restful", restProcessRequest}; static HttpEncodeMethod restEncodeSqlTimestampMethod = { - restStartSqlJson, restStopSqlJson, restBuildSqlTimestampJson, restBuildSqlAffectRowsJson, NULL, NULL, NULL, NULL}; + .startJsonFp = restStartSqlJson, + .stopJsonFp = restStopSqlJson, + .buildQueryJsonFp = restBuildSqlTimestampJson, + .buildAffectRowJsonFp = restBuildSqlAffectRowsJson, + .initJsonFp = NULL, + .cleanJsonFp = NULL, + .checkFinishedFp = NULL, + .setNextCmdFp = NULL +}; + static HttpEncodeMethod restEncodeSqlLocalTimeStringMethod = { - restStartSqlJson, restStopSqlJson, restBuildSqlLocalTimeStringJson, restBuildSqlAffectRowsJson, NULL, NULL, NULL, NULL}; + .startJsonFp = restStartSqlJson, + .stopJsonFp = restStopSqlJson, + .buildQueryJsonFp = restBuildSqlLocalTimeStringJson, + .buildAffectRowJsonFp = restBuildSqlAffectRowsJson, + .initJsonFp = NULL, + .cleanJsonFp = NULL, + .checkFinishedFp = NULL, + .setNextCmdFp = NULL +}; + static HttpEncodeMethod restEncodeSqlUtcTimeStringMethod = { - restStartSqlJson, restStopSqlJson, restBuildSqlUtcTimeStringJson, restBuildSqlAffectRowsJson, NULL, NULL, NULL, NULL}; + .startJsonFp = restStartSqlJson, + .stopJsonFp = restStopSqlJson, + .buildQueryJsonFp = restBuildSqlUtcTimeStringJson, + .buildAffectRowJsonFp = restBuildSqlAffectRowsJson, + .initJsonFp = NULL, + .cleanJsonFp = NULL, + .checkFinishedFp = NULL, + .setNextCmdFp = NULL +}; void restInitHandle(HttpServer* pServer) { httpAddMethod(pServer, &restDecodeMethod); diff --git a/src/plugins/http/src/tgHandle.c b/src/plugins/http/src/tgHandle.c index ac3df051fd..c6a2230bfb 100644 --- a/src/plugins/http/src/tgHandle.c +++ b/src/plugins/http/src/tgHandle.c @@ -62,9 +62,16 @@ #define TG_MAX_SORT_TAG_SIZE 20 static HttpDecodeMethod tgDecodeMethod = {"telegraf", tgProcessRquest}; -static HttpEncodeMethod tgQueryMethod = {tgStartQueryJson, tgStopQueryJson, NULL, - tgBuildSqlAffectRowsJson, tgInitQueryJson, tgCleanQueryJson, - tgCheckFinished, tgSetNextCmd}; +static HttpEncodeMethod tgQueryMethod = { + .startJsonFp = tgStartQueryJson, + .stopJsonFp = tgStopQueryJson, + .buildQueryJsonFp = NULL, + .buildAffectRowJsonFp = tgBuildSqlAffectRowsJson, + .initJsonFp = tgInitQueryJson, + .cleanJsonFp = tgCleanQueryJson, + .checkFinishedFp = tgCheckFinished, + .setNextCmdFp = tgSetNextCmd +}; static const char DEFAULT_TELEGRAF_CFG[] = "{\"metrics\":[" From 5d1a1e2b2d06de4a2b059d3e61f5fcb5f00b630e Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 9 Jun 2020 11:00:08 +0800 Subject: [PATCH 36/55] [td-225] refactor code for fill --- src/client/src/tscSecondaryMerge.c | 41 +++++-------------- src/query/inc/qfill.h | 14 +++---- src/query/src/qExecutor.c | 20 ++++----- src/query/src/qfill.c | 66 ++++++++++++++++-------------- 4 files changed, 62 insertions(+), 79 deletions(-) diff --git a/src/client/src/tscSecondaryMerge.c b/src/client/src/tscSecondaryMerge.c index 95d559b4fa..b159ffc5a1 100644 --- a/src/client/src/tscSecondaryMerge.c +++ b/src/client/src/tscSecondaryMerge.c @@ -324,7 +324,6 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd tfree(pReducer->discardData); tfree(pReducer->pResultBuf); tfree(pReducer->pFinalRes); -// tfree(pReducer->pBufForInterpo); tfree(pReducer->prevRowOfInput); pRes->code = TSDB_CODE_TSC_OUT_OF_MEMORY; @@ -363,7 +362,8 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd if (pQueryInfo->fillType != TSDB_FILL_NONE) { SFillColInfo* pFillCol = createFillColInfo(pQueryInfo); pReducer->pFillInfo = taosInitFillInfo(pQueryInfo->order.order, revisedSTime, pQueryInfo->groupbyExpr.numOfGroupCols, - 4096, numOfCols, pQueryInfo->slidingTime, pQueryInfo->fillType, pFillCol); + 4096, numOfCols, pQueryInfo->slidingTime, pQueryInfo->slidingTimeUnit, + tinfo.precision, pQueryInfo->fillType, pFillCol); } int32_t startIndex = pQueryInfo->fieldsInfo.numOfOutput - pQueryInfo->groupbyExpr.numOfGroupCols; @@ -494,7 +494,7 @@ void tscDestroyLocalReducer(SSqlObj *pSql) { tscTrace("%p waiting for delete procedure, status: %d", pSql, status); } - taosDestoryFillInfo(pLocalReducer->pFillInfo); + pLocalReducer->pFillInfo = taosDestoryFillInfo(pLocalReducer->pFillInfo); if (pLocalReducer->pCtx != NULL) { for (int32_t i = 0; i < pQueryInfo->fieldsInfo.numOfOutput; ++i) { @@ -980,8 +980,7 @@ static void doFillResult(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool doneO } /* all output for current group are completed */ - int32_t totalRemainRows = - taosGetNumOfResultWithFill(pFillInfo, rpoints, pFillInfo->slidingTime, actualETime); + int32_t totalRemainRows = getFilledNumOfRes(pFillInfo, actualETime, pLocalReducer->resColModel->capacity); if (totalRemainRows <= 0) { break; } @@ -1267,13 +1266,7 @@ bool doGenerateFinalResults(SSqlObj *pSql, SLocalReducer *pLocalReducer, bool no SFillInfo* pFillInfo = pLocalReducer->pFillInfo; if (pFillInfo != NULL) { - STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); - STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta); - - TSKEY ekey = taosGetRevisedEndKey(pQueryInfo->window.ekey, pFillInfo->order, pFillInfo->slidingTime, - pQueryInfo->slidingTimeUnit, tinfo.precision); - - taosFillSetStartInfo(pFillInfo, pResBuf->num, ekey); + taosFillSetStartInfo(pFillInfo, pResBuf->num, pQueryInfo->window.ekey); taosFillCopyInputDataFromOneFilePage(pFillInfo, pResBuf); } @@ -1327,23 +1320,15 @@ static bool doBuildFilledResultForGroup(SSqlObj *pSql) { SLocalReducer *pLocalReducer = pRes->pLocalReducer; SFillInfo *pFillInfo = pLocalReducer->pFillInfo; - STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); - STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta); - - int8_t p = tinfo.precision; - if (pFillInfo != NULL && taosNumOfRemainRows(pFillInfo) > 0) { assert(pQueryInfo->fillType != TSDB_FILL_NONE); tFilePage *pFinalDataBuf = pLocalReducer->pResultBuf; - int64_t etime = *(int64_t *)(pFinalDataBuf->data + TSDB_KEYSIZE * (pFillInfo->numOfRows - 1)); + int64_t etime = *(int64_t *)(pFinalDataBuf->data + TSDB_KEYSIZE * (pFillInfo->numOfRows - 1)); - int32_t remain = taosNumOfRemainRows(pFillInfo); - TSKEY ekey = taosGetRevisedEndKey(etime, pQueryInfo->order.order, pQueryInfo->slidingTime, pQueryInfo->slidingTimeUnit, p); - // the first column must be the timestamp column - int32_t rows = taosGetNumOfResultWithFill(pFillInfo, remain, ekey, pLocalReducer->resColModel->capacity); - if (rows > 0) { // do interpo + int32_t rows = getFilledNumOfRes(pFillInfo, etime, pLocalReducer->resColModel->capacity); + if (rows > 0) { // do fill gap doFillResult(pSql, pLocalReducer, false); } @@ -1362,10 +1347,7 @@ static bool doHandleLastRemainData(SSqlObj *pSql) { bool prevGroupCompleted = (!pLocalReducer->discard) && pLocalReducer->hasUnprocessedRow; - SQueryInfo * pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex); - STableMetaInfo *pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0); - - STableComInfo tinfo = tscGetTableInfo(pTableMetaInfo->pTableMeta); + SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex); if ((isAllSourcesCompleted(pLocalReducer) && !pLocalReducer->hasPrevRow) || pLocalReducer->pLocalDataSrc[0] == NULL || prevGroupCompleted) { @@ -1373,9 +1355,8 @@ static bool doHandleLastRemainData(SSqlObj *pSql) { if (pQueryInfo->fillType != TSDB_FILL_NONE) { int64_t etime = (pQueryInfo->window.skey < pQueryInfo->window.ekey) ? pQueryInfo->window.ekey : pQueryInfo->window.skey; - etime = taosGetRevisedEndKey(etime, pQueryInfo->order.order, pQueryInfo->intervalTime, - pQueryInfo->slidingTimeUnit, tinfo.precision); - int32_t rows = taosGetNumOfResultWithFill(pFillInfo, 0, etime, pLocalReducer->resColModel->capacity); + assert(pFillInfo->numOfRows == 0); + int32_t rows = getFilledNumOfRes(pFillInfo, etime, pLocalReducer->resColModel->capacity); if (rows > 0) { // do interpo doFillResult(pSql, pLocalReducer, true); } diff --git a/src/query/inc/qfill.h b/src/query/inc/qfill.h index 9ea9c8f7cf..da1cd8e5de 100644 --- a/src/query/inc/qfill.h +++ b/src/query/inc/qfill.h @@ -50,7 +50,8 @@ typedef struct SFillInfo { char * nextValues; // next row of data char** pData; // original result data block involved in filling data int32_t capacityInRows; // data buffer size in rows - + int8_t slidingUnit; // sliding time unit + int8_t precision; // time resoluation SFillColInfo* pFillCol; // column info for fill operations } SFillInfo; @@ -61,12 +62,13 @@ typedef struct SPoint { int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, char timeUnit, int16_t precision); -SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, - int32_t numOfCols, int64_t slidingTime, int32_t fillType, SFillColInfo* pFillCol); +SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols, + int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType, + SFillColInfo* pFillCol); void taosResetFillInfo(SFillInfo* pFillInfo, TSKEY startTimestamp); -void taosDestoryFillInfo(SFillInfo *pFillInfo); +void* taosDestoryFillInfo(SFillInfo *pFillInfo); void taosFillSetStartInfo(SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey); @@ -74,9 +76,7 @@ void taosFillCopyInputDataFromFilePage(SFillInfo* pFillInfo, tFilePage** pInput) void taosFillCopyInputDataFromOneFilePage(SFillInfo* pFillInfo, tFilePage* pInput); -TSKEY taosGetRevisedEndKey(TSKEY ekey, int32_t order, int64_t timeInterval, int8_t slidingTimeUnit, int8_t precision); - -int64_t taosGetNumOfResultWithFill(SFillInfo* pFillInfo, int32_t numOfRows, int64_t ekey, int32_t maxNumOfRows); +int64_t getFilledNumOfRes(SFillInfo* pFillInfo, int64_t ekey, int32_t maxNumOfRows); int32_t taosNumOfRemainRows(SFillInfo *pFillInfo); diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 26502a7408..18f6ea0f7c 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -1466,7 +1466,7 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) { tfree(pRuntimeEnv->pCtx); } - taosDestoryFillInfo(pRuntimeEnv->pFillInfo); + pRuntimeEnv->pFillInfo = taosDestoryFillInfo(pRuntimeEnv->pFillInfo); destroyResultBuf(pRuntimeEnv->pResultBuf, pQInfo); tsdbCleanupQueryHandle(pRuntimeEnv->pQueryHandle); @@ -3557,9 +3557,7 @@ bool queryHasRemainResults(SQueryRuntimeEnv* pRuntimeEnv) { * first result row in the actual result set will fill nothing. */ if (Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED)) { - TSKEY ekey = taosGetRevisedEndKey(pQuery->window.ekey, pQuery->order.order, pQuery->slidingTime, - pQuery->slidingTimeUnit, pQuery->precision); - int32_t numOfTotal = taosGetNumOfResultWithFill(pFillInfo, remain, ekey, pQuery->rec.capacity); + int32_t numOfTotal = getFilledNumOfRes(pFillInfo, pQuery->window.ekey, pQuery->rec.capacity); return numOfTotal > 0; } @@ -3601,7 +3599,7 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data } } -int32_t doFillGapsInResults(SQueryRuntimeEnv* pRuntimeEnv, tFilePage **pDst, int32_t numOfRows, int32_t *numOfInterpo) { +int32_t doFillGapsInResults(SQueryRuntimeEnv* pRuntimeEnv, tFilePage **pDst, int32_t *numOfInterpo) { SQInfo* pQInfo = GET_QINFO_ADDR(pRuntimeEnv); SQuery *pQuery = pRuntimeEnv->pQuery; SFillInfo* pFillInfo = pRuntimeEnv->pFillInfo; @@ -4013,7 +4011,8 @@ int32_t doInitQInfo(SQInfo *pQInfo, void *param, void *tsdb, int32_t vgId, bool if (pQuery->fillType != TSDB_FILL_NONE && !isPointInterpoQuery(pQuery)) { SFillColInfo* pColInfo = taosCreateFillColInfo(pQuery); pRuntimeEnv->pFillInfo = taosInitFillInfo(pQuery->order.order, 0, 0, pQuery->rec.capacity, pQuery->numOfOutput, - pQuery->slidingTime, pQuery->fillType, pColInfo); + pQuery->slidingTime, pQuery->slidingTimeUnit, pQuery->precision, + pQuery->fillType, pColInfo); } // todo refactor @@ -4666,13 +4665,11 @@ static void tableIntervalProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo) { limitResults(pRuntimeEnv); break; } else { - TSKEY ekey = taosGetRevisedEndKey(pQuery->window.ekey, pQuery->order.order, pQuery->slidingTime, - pQuery->slidingTimeUnit, pQuery->precision); - taosFillSetStartInfo(pRuntimeEnv->pFillInfo, pQuery->rec.rows, ekey); + taosFillSetStartInfo(pRuntimeEnv->pFillInfo, pQuery->rec.rows, pQuery->window.ekey); taosFillCopyInputDataFromFilePage(pRuntimeEnv->pFillInfo, (tFilePage**) pQuery->sdata); numOfInterpo = 0; - pQuery->rec.rows = doFillGapsInResults(pRuntimeEnv, (tFilePage **)pQuery->sdata, pQuery->rec.rows, &numOfInterpo); + pQuery->rec.rows = doFillGapsInResults(pRuntimeEnv, (tFilePage **)pQuery->sdata, &numOfInterpo); if (pQuery->rec.rows > 0 || Q_STATUS_EQUAL(pQuery->status, QUERY_COMPLETED)) { limitResults(pRuntimeEnv); break; @@ -4704,8 +4701,7 @@ static void tableQueryImpl(SQInfo *pQInfo) { * So, we do keep in this procedure instead of launching retrieve procedure for next results. */ int32_t numOfInterpo = 0; - int32_t remain = taosNumOfRemainRows(pRuntimeEnv->pFillInfo); - pQuery->rec.rows = doFillGapsInResults(pRuntimeEnv, (tFilePage **)pQuery->sdata, remain, &numOfInterpo); + pQuery->rec.rows = doFillGapsInResults(pRuntimeEnv, (tFilePage **)pQuery->sdata, &numOfInterpo); if (pQuery->rec.rows > 0) { limitResults(pRuntimeEnv); diff --git a/src/query/src/qfill.c b/src/query/src/qfill.c index 7b3ea5c1f0..59bf7b423c 100644 --- a/src/query/src/qfill.c +++ b/src/query/src/qfill.c @@ -13,8 +13,8 @@ * along with this program. If not, see . */ -#include "qfill.h" #include "os.h" +#include "qfill.h" #include "qextbuffer.h" #include "taosdef.h" #include "taosmsg.h" @@ -58,7 +58,7 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, ch } SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_t capacity, int32_t numOfCols, - int64_t slidingTime, int32_t fillType, SFillColInfo* pFillCol) { + int64_t slidingTime, int8_t slidingUnit, int8_t precision, int32_t fillType, SFillColInfo* pFillCol) { if (fillType == TSDB_FILL_NONE) { return NULL; } @@ -72,8 +72,10 @@ SFillInfo* taosInitFillInfo(int32_t order, TSKEY skey, int32_t numOfTags, int32_ pFillInfo->pFillCol = pFillCol; pFillInfo->numOfTags = numOfTags; pFillInfo->numOfCols = numOfCols; + pFillInfo->precision = precision; pFillInfo->slidingTime = slidingTime; - + pFillInfo->slidingUnit = slidingUnit; + pFillInfo->pData = malloc(POINTER_BYTES * numOfCols); int32_t rowsize = 0; @@ -102,9 +104,9 @@ void taosResetFillInfo(SFillInfo* pFillInfo, TSKEY startTimestamp) { pFillInfo->numOfTotal = 0; } -void taosDestoryFillInfo(SFillInfo* pFillInfo) { +void* taosDestoryFillInfo(SFillInfo* pFillInfo) { if (pFillInfo == NULL) { - return; + return NULL; } tfree(pFillInfo->prevValues); @@ -119,6 +121,15 @@ void taosDestoryFillInfo(SFillInfo* pFillInfo) { tfree(pFillInfo->pFillCol); tfree(pFillInfo); + return NULL; +} + +static TSKEY taosGetRevisedEndKey(TSKEY ekey, int32_t order, int64_t timeInterval, int8_t slidingTimeUnit, int8_t precision) { + if (order == TSDB_ORDER_ASC) { + return ekey; + } else { + return taosGetIntervalStartTimestamp(ekey, timeInterval, slidingTimeUnit, precision); + } } void taosFillSetStartInfo(SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey) { @@ -126,8 +137,10 @@ void taosFillSetStartInfo(SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey) return; } + pFillInfo->endKey = taosGetRevisedEndKey(endKey, pFillInfo->order, pFillInfo->slidingTime, pFillInfo->slidingUnit, + pFillInfo->precision); + pFillInfo->rowIdx = 0; - pFillInfo->endKey = endKey; pFillInfo->numOfRows = numOfRows; // ensure the space @@ -165,36 +178,29 @@ void taosFillCopyInputDataFromOneFilePage(SFillInfo* pFillInfo, tFilePage* pInpu } } -TSKEY taosGetRevisedEndKey(TSKEY ekey, int32_t order, int64_t timeInterval, int8_t slidingTimeUnit, int8_t precision) { - if (order == TSDB_ORDER_ASC) { - return ekey; - } else { - return taosGetIntervalStartTimestamp(ekey, timeInterval, slidingTimeUnit, precision); - } -} +int64_t getFilledNumOfRes(SFillInfo* pFillInfo, TSKEY ekey, int32_t maxNumOfRows) { + int64_t* tsList = (int64_t*) pFillInfo->pData[0]; -static int32_t taosGetTotalNumOfFilledRes(SFillInfo* pFillInfo, const TSKEY* tsArray, int32_t remain, - int64_t nInterval, int64_t ekey) { - - if (remain > 0) { // still fill gap within current data block, not generating data after the result set. - TSKEY lastKey = tsArray[pFillInfo->numOfRows - 1]; - int32_t total = (int32_t)(labs(lastKey - pFillInfo->start) / nInterval) + 1; + int32_t numOfRows = taosNumOfRemainRows(pFillInfo); - assert(total >= remain); - return total; + TSKEY ekey1 = taosGetRevisedEndKey(ekey, pFillInfo->order, pFillInfo->slidingTime, pFillInfo->slidingUnit, + pFillInfo->precision); + + int64_t numOfRes = -1; + if (numOfRows > 0) { // still fill gap within current data block, not generating data after the result set. + TSKEY lastKey = tsList[pFillInfo->numOfRows - 1]; + + numOfRes = (int64_t)(labs(lastKey - pFillInfo->start) / pFillInfo->slidingTime) + 1; + assert(numOfRes >= numOfRows); } else { // reach the end of data - if ((ekey < pFillInfo->start && FILL_IS_ASC_FILL(pFillInfo)) || - (ekey > pFillInfo->start && !FILL_IS_ASC_FILL(pFillInfo))) { + if ((ekey1 < pFillInfo->start && FILL_IS_ASC_FILL(pFillInfo)) || + (ekey1 > pFillInfo->start && !FILL_IS_ASC_FILL(pFillInfo))) { return 0; - } else { - return (int32_t)(labs(ekey - pFillInfo->start) / nInterval) + 1; + } else { // the numOfRes rows are all filled with specified policy + numOfRes = (labs(ekey1 - pFillInfo->start) / pFillInfo->slidingTime) + 1; } } -} -int64_t taosGetNumOfResultWithFill(SFillInfo* pFillInfo, int32_t numOfRows, int64_t ekey, int32_t maxNumOfRows) { - int32_t numOfRes = taosGetTotalNumOfFilledRes(pFillInfo, (int64_t*) pFillInfo->pData[0], numOfRows, - pFillInfo->slidingTime, ekey); return (numOfRes > maxNumOfRows) ? maxNumOfRows : numOfRes; } @@ -496,8 +502,8 @@ int32_t generateDataBlockImpl(SFillInfo* pFillInfo, tFilePage** data, int32_t nu int64_t taosGenerateDataBlock(SFillInfo* pFillInfo, tFilePage** output, int32_t capacity) { int32_t remain = taosNumOfRemainRows(pFillInfo); // todo use iterator? - int32_t rows = taosGetNumOfResultWithFill(pFillInfo, remain, pFillInfo->endKey, capacity); + int32_t rows = getFilledNumOfRes(pFillInfo, pFillInfo->endKey, capacity); int32_t numOfRes = generateDataBlockImpl(pFillInfo, output, remain, rows, pFillInfo->pData); assert(numOfRes == rows); From d700090c1afc6e56e3956c0361c94a87a904fff9 Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 9 Jun 2020 11:03:42 +0800 Subject: [PATCH 37/55] [td-225] fix bugs in taosdemo --- src/kit/taosdemo/taosdemo.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/kit/taosdemo/taosdemo.c b/src/kit/taosdemo/taosdemo.c index 81426b683a..595beea641 100644 --- a/src/kit/taosdemo/taosdemo.c +++ b/src/kit/taosdemo/taosdemo.c @@ -711,7 +711,7 @@ void *readTable(void *sarg) { int32_t code = taos_errno(pSql); if (code != 0) { - fprintf(stderr, "Failed to query:%s\n", taos_errstr(taos)); + fprintf(stderr, "Failed to query:%s\n", taos_errstr(pSql)); taos_free_result(pSql); taos_close(taos); exit(EXIT_FAILURE); @@ -780,7 +780,7 @@ void *readMetric(void *sarg) { int32_t code = taos_errno(pSql); if (code != 0) { - fprintf(stderr, "Failed to query:%s\n", taos_errstr(taos)); + fprintf(stderr, "Failed to query:%s\n", taos_errstr(pSql)); taos_free_result(pSql); taos_close(taos); exit(1); @@ -819,7 +819,9 @@ void queryDB(TAOS *taos, char *command) { } if (i == 0) { - fprintf(stderr, "Failed to run %s, reason: %s\n", command, taos_errstr(taos)); + fprintf(stderr, "Failed to run %s, reason: %s\n", command, taos_errstr(pSql)); + taos_free_result(pSql); + taos_close(taos); exit(EXIT_FAILURE); } @@ -915,7 +917,7 @@ void callBack(void *param, TAOS_RES *res, int code) { int64_t tmp_time = tb_info->timestamp; if (code < 0) { - fprintf(stderr, "failed to insert data %d:reason; %s\n", code, taos_errstr(tb_info->taos)); + fprintf(stderr, "failed to insert data %d:reason; %s\n", code, taos_errstr(res)); exit(EXIT_FAILURE); } From fe8b9e03c317ca9ba82345c17ec1b6b2f60df539 Mon Sep 17 00:00:00 2001 From: Tao Liu Date: Tue, 9 Jun 2020 03:13:58 +0000 Subject: [PATCH 38/55] [TD-553] add usage statistics function --- src/common/inc/tdataformat.h | 7 +++++-- src/common/src/tdataformat.c | 10 +++++++++- src/inc/tsdb.h | 16 ++++++++++++++++ src/tsdb/inc/tsdbMain.h | 2 ++ src/tsdb/src/tsdbMain.c | 16 +++++++++++++++- src/vnode/inc/vnodeInt.h | 3 --- src/vnode/src/vnodeMain.c | 10 ++++++---- 7 files changed, 53 insertions(+), 11 deletions(-) diff --git a/src/common/inc/tdataformat.h b/src/common/inc/tdataformat.h index ec4e544e18..441af9a215 100644 --- a/src/common/inc/tdataformat.h +++ b/src/common/inc/tdataformat.h @@ -69,7 +69,8 @@ typedef struct { int version; // version int numOfCols; // Number of columns appended int tlen; // maximum length of a SDataRow without the header part - int flen; // First part length in a SDataRow after the header part + int16_t flen; // First part length in a SDataRow after the header part + int16_t vlen; // pure value part length, excluded the overhead STColumn columns[]; } STSchema; @@ -77,6 +78,7 @@ typedef struct { #define schemaVersion(s) ((s)->version) #define schemaTLen(s) ((s)->tlen) #define schemaFLen(s) ((s)->flen) +#define schemaVLen(s) ((s)->vlen) #define schemaColAt(s, i) ((s)->columns + i) #define tdFreeSchema(s) tfree((s)) @@ -105,7 +107,8 @@ typedef struct { int tCols; int nCols; int tlen; - int flen; + int16_t flen; + int16_t vlen; int version; STColumn *columns; } STSchemaBuilder; diff --git a/src/common/src/tdataformat.c b/src/common/src/tdataformat.c index 7880a4b302..cb84c376eb 100644 --- a/src/common/src/tdataformat.c +++ b/src/common/src/tdataformat.c @@ -37,6 +37,7 @@ void *tdEncodeSchema(void *dst, STSchema *pSchema) { T_APPEND_MEMBER(dst, pSchema, STSchema, version); T_APPEND_MEMBER(dst, pSchema, STSchema, numOfCols); + T_APPEND_MEMBER(dst, pSchema, STSchema, vlen); for (int i = 0; i < schemaNCols(pSchema); i++) { STColumn *pCol = schemaColAt(pSchema, i); T_APPEND_MEMBER(dst, pCol, STColumn, type); @@ -53,10 +54,12 @@ void *tdEncodeSchema(void *dst, STSchema *pSchema) { STSchema *tdDecodeSchema(void **psrc) { int totalCols = 0; int version = 0; + int16_t vlen = 0; STSchemaBuilder schemaBuilder = {0}; T_READ_MEMBER(*psrc, int, version); T_READ_MEMBER(*psrc, int, totalCols); + T_READ_MEMBER(*psrc, int16_t, vlen); if (tdInitTSchemaBuilder(&schemaBuilder, version) < 0) return NULL; @@ -75,6 +78,7 @@ STSchema *tdDecodeSchema(void **psrc) { } STSchema *pSchema = tdGetSchemaFromBuilder(&schemaBuilder); + pSchema->vlen = vlen; tdDestroyTSchemaBuilder(&schemaBuilder); return pSchema; } @@ -100,6 +104,7 @@ void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, int32_t version) { pBuilder->nCols = 0; pBuilder->tlen = 0; pBuilder->flen = 0; + pBuilder->vlen = 0; pBuilder->version = version; } @@ -124,10 +129,12 @@ int tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int16_t colId, int3 if (IS_VAR_DATA_TYPE(type)) { colSetBytes(pCol, bytes); - pBuilder->tlen += (TYPE_BYTES[type] + sizeof(VarDataLenT) + bytes); + pBuilder->tlen += (TYPE_BYTES[type] + bytes); + pBuilder->vlen += bytes - sizeof(VarDataLenT); } else { colSetBytes(pCol, TYPE_BYTES[type]); pBuilder->tlen += TYPE_BYTES[type]; + pBuilder->vlen += TYPE_BYTES[type]; } pBuilder->nCols++; @@ -150,6 +157,7 @@ STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder) { schemaNCols(pSchema) = pBuilder->nCols; schemaTLen(pSchema) = pBuilder->tlen; schemaFLen(pSchema) = pBuilder->flen; + schemaVLen(pSchema) = pBuilder->vlen; memcpy(schemaColAt(pSchema, 0), pBuilder->columns, sizeof(STColumn) * pBuilder->nCols); diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h index a678f213bb..bdb61e6ee1 100644 --- a/src/inc/tsdb.h +++ b/src/inc/tsdb.h @@ -65,6 +65,13 @@ typedef struct { int8_t compression; } STsdbCfg; +// --------- TSDB REPOSITORY USAGE STATISTICS +typedef struct { + int64_t totalStorage; //total bytes occupie + int64_t compStorage; + int64_t pointsWritten; //total data points written +}STsdbStat; + typedef void TsdbRepoT; // use void to hide implementation details from outside void tsdbSetDefaultCfg(STsdbCfg *pCfg); @@ -306,6 +313,15 @@ int32_t tsdbGetOneTableGroup(TsdbRepoT *tsdb, uint64_t uid, STableGroupInfo *pGr */ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle); +/** + * get the statistics of repo usage + * @param repo. point to the tsdbrepo + * @param totalPoints. total data point written + * @param totalStorage. total bytes took by the tsdb + * @param compStorage. total bytes took by the tsdb after compressed + */ +void tsdbReportStat(void *repo, int64_t *totalPoints, int64_t *totalStorage, int64_t *compStorage); + #ifdef __cplusplus } #endif diff --git a/src/tsdb/inc/tsdbMain.h b/src/tsdb/inc/tsdbMain.h index e06778a872..5926f2f243 100644 --- a/src/tsdb/inc/tsdbMain.h +++ b/src/tsdb/inc/tsdbMain.h @@ -357,6 +357,8 @@ typedef struct STsdbRepo { STsdbAppH appH; + STsdbStat stat; + // The meter meta handle of this TSDB repository STsdbMeta *tsdbMeta; diff --git a/src/tsdb/src/tsdbMain.c b/src/tsdb/src/tsdbMain.c index 5e32a9e7d7..5526ad0d6e 100644 --- a/src/tsdb/src/tsdbMain.c +++ b/src/tsdb/src/tsdbMain.c @@ -953,6 +953,7 @@ static int32_t tdInsertRowToTable(STsdbRepo *pRepo, SDataRow row, STable *pTable static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock, TSKEY now, int32_t *affectedrows) { STsdbRepo *pRepo = (STsdbRepo *)repo; STsdbMeta *pMeta = pRepo->tsdbMeta; + int64_t points = 0; STableId tableId = {.uid = pBlock->uid, .tid = pBlock->tid}; STable *pTable = tsdbIsValidTableToInsert(pRepo->tsdbMeta, tableId); @@ -964,7 +965,9 @@ static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock, TSKEY // Check schema version int32_t tversion = pBlock->sversion; - int16_t nversion = schemaVersion(tsdbGetTableSchema(pMeta, pTable)); + STSchema * pSchema = tsdbGetTableSchema(pMeta, pTable); + ASSERT(pSchema != NULL); + int16_t nversion = schemaVersion(pSchema); if (tversion > nversion) { tsdbTrace("vgId:%d table:%s tid:%d server schema version %d is older than clien version %d, try to config.", pRepo->config.tsdbId, varDataVal(pTable->name), pTable->tableId.tid, nversion, tversion); @@ -1014,7 +1017,10 @@ static int32_t tsdbInsertDataToTable(TsdbRepoT *repo, SSubmitBlk *pBlock, TSKEY return -1; } (*affectedrows)++; + points++; } + atomic_fetch_add_64(&(pRepo->stat.pointsWritten), points * (pSchema->numOfCols)); + atomic_fetch_add_64(&(pRepo->stat.totalStorage), points * pSchema->vlen); return TSDB_CODE_SUCCESS; } @@ -1381,3 +1387,11 @@ uint32_t tsdbGetFileInfo(TsdbRepoT *repo, char *name, uint32_t *index, uint32_t return magic; } + +void tsdbReportStat(void *repo, int64_t *totalPoints, int64_t *totalStorage, int64_t *compStorage){ + ASSERT(repo != NULL); + STsdbRepo * pRepo = repo; + *totalPoints = pRepo->stat.pointsWritten; + *totalStorage = pRepo->stat.totalStorage; + *compStorage = pRepo->stat.compStorage; +} \ No newline at end of file diff --git a/src/vnode/inc/vnodeInt.h b/src/vnode/inc/vnodeInt.h index af7f764717..7c95e81cf5 100644 --- a/src/vnode/inc/vnodeInt.h +++ b/src/vnode/inc/vnodeInt.h @@ -39,9 +39,6 @@ typedef struct { int8_t role; int64_t version; // current version int64_t fversion; // version on saved data file - int64_t totalStorage; //total bytes occupie - int64_t compStorage; - int64_t pointsWritten; //total data points written void *wqueue; void *rqueue; void *wal; diff --git a/src/vnode/src/vnodeMain.c b/src/vnode/src/vnodeMain.c index 256ef3c72b..59f2a21b37 100644 --- a/src/vnode/src/vnodeMain.c +++ b/src/vnode/src/vnodeMain.c @@ -371,16 +371,18 @@ void *vnodeGetWal(void *pVnode) { static void vnodeBuildVloadMsg(SVnodeObj *pVnode, SDMStatusMsg *pStatus) { if (pVnode->status == TAOS_VN_STATUS_DELETING) return; if (pStatus->openVnodes >= TSDB_MAX_VNODES) return; + int64_t totalStorage, compStorage, pointsWritten = 0; + tsdbReportStat(pVnode->tsdb, &pointsWritten, &totalStorage, &compStorage); SVnodeLoad *pLoad = &pStatus->load[pStatus->openVnodes++]; pLoad->vgId = htonl(pVnode->vgId); pLoad->cfgVersion = htonl(pVnode->cfgVersion); - pLoad->totalStorage = htobe64(pLoad->totalStorage); - pLoad->compStorage = htobe64(pLoad->compStorage); - pLoad->pointsWritten = htobe64(pLoad->pointsWritten); + pLoad->totalStorage = htobe64(totalStorage); + pLoad->compStorage = htobe64(compStorage); + pLoad->pointsWritten = htobe64(pointsWritten); pLoad->status = pVnode->status; pLoad->role = pVnode->role; - pLoad->replica = pVnode->syncCfg.replica; + pLoad->replica = pVnode->syncCfg.replica; } void vnodeBuildStatusMsg(void *param) { From 0495644242a932c29699b1143a6b2f3307151e73 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 9 Jun 2020 03:18:51 +0000 Subject: [PATCH 39/55] [TD_543] fix coverity scan, cid:267845 267846 --- src/client/src/tscSystem.c | 2 +- src/os/linux/src/linuxSysPara.c | 93 ++++++--------------------------- 2 files changed, 18 insertions(+), 77 deletions(-) diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index d3c8eefbb9..fd7d31aa9f 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -201,7 +201,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) { tscPrint("set shellActivityTimer:%d", tsShellActivityTimer); } else { tscWarn("config option:%s, input value:%s, is configured by %s, use %d", cfg->option, pStr, - tsCfgStatusStr[cfg->cfgStatus], (int32_t *)cfg->ptr); + tsCfgStatusStr[cfg->cfgStatus], *(int32_t *)cfg->ptr); } break; diff --git a/src/os/linux/src/linuxSysPara.c b/src/os/linux/src/linuxSysPara.c index ca244dcd94..b270eb14cf 100644 --- a/src/os/linux/src/linuxSysPara.c +++ b/src/os/linux/src/linuxSysPara.c @@ -331,66 +331,7 @@ bool taosGetDisk() { return true; } -static bool taosGetCardName(char *ip, char *name) { - struct ifaddrs *ifaddr, *ifa; - int family, s; - char host[NI_MAXHOST]; - bool ret = false; - - if (getifaddrs(&ifaddr) == -1) { - return false; - } - - /* Walk through linked list, maintaining head pointer so we can free list - * later */ - for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) { - if (ifa->ifa_addr == NULL) continue; - - family = ifa->ifa_addr->sa_family; - if (family != AF_INET) { - continue; - } - - s = getnameinfo(ifa->ifa_addr, (family == AF_INET) ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6), host, - NI_MAXHOST, NULL, 0, NI_NUMERICHOST); - if (s != 0) { - break; - } - - if (strcmp(host, "127.0.0.1") == 0) { - continue; - } - - // TODO: the ip not config - // if (strcmp(host, ip) == 0) { - strcpy(name, ifa->ifa_name); - ret = true; - // } - } - - freeifaddrs(ifaddr); - return ret; -} - static bool taosGetCardInfo(int64_t *bytes) { - static char tsPublicCard[1000] = {0}; - static char tsPrivateIp[40]; - - if (tsPublicCard[0] == 0) { - if (!taosGetCardName(tsPrivateIp, tsPublicCard)) { - uError("can't get card name from ip:%s", tsPrivateIp); - return false; - } - int cardNameLen = (int)strlen(tsPublicCard); - for (int i = 0; i < cardNameLen; ++i) { - if (tsPublicCard[i] == ':') { - tsPublicCard[i] = 0; - break; - } - } - // uTrace("card name of public ip:%s is %s", tsPublicIp, tsPublicCard); - } - FILE *fp = fopen(tsSysNetFile, "r"); if (fp == NULL) { uError("open file:%s failed", tsSysNetFile); @@ -403,6 +344,7 @@ static bool taosGetCardInfo(int64_t *bytes) { size_t len; char * line = NULL; + *bytes = 0; while (!feof(fp)) { tfree(line); @@ -411,23 +353,20 @@ static bool taosGetCardInfo(int64_t *bytes) { if (line == NULL) { break; } - if (strstr(line, tsPublicCard) != NULL) { - break; + if (strstr(line, "lo:") != NULL) { + continue; } + + sscanf(line, + "%s %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64, + nouse0, &rbytes, &rpackts, &nouse1, &nouse2, &nouse3, &nouse4, &nouse5, &nouse6, &tbytes, &tpackets); + *bytes += (rbytes + tbytes); } - if (line != NULL) { - sscanf(line, "%s %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64 " %" PRId64, nouse0, &rbytes, &rpackts, &nouse1, &nouse2, &nouse3, - &nouse4, &nouse5, &nouse6, &tbytes, &tpackets); - *bytes = rbytes + tbytes; - tfree(line); - fclose(fp); - return true; - } else { - uWarn("can't get card:%s info from device:%s", tsPublicCard, tsSysNetFile); - *bytes = 0; - fclose(fp); - return false; - } + + tfree(line); + fclose(fp); + + return true; } bool taosGetBandSpeed(float *bandSpeedKb) { @@ -443,13 +382,15 @@ bool taosGetBandSpeed(float *bandSpeedKb) { if (lastTime == 0 || lastBytes == 0) { lastTime = curTime; lastBytes = curBytes; - return false; + *bandSpeedKb = 0; + return true; } if (lastTime >= curTime || lastBytes > curBytes) { lastTime = curTime; lastBytes = curBytes; - return false; + *bandSpeedKb = 0; + return true; } double totalBytes = (double)(curBytes - lastBytes) / 1024 * 8; // Kb From 5e8969d6614837345f972428f0aa32f4c0d48461 Mon Sep 17 00:00:00 2001 From: Bomin Zhang Date: Thu, 4 Jun 2020 15:00:54 +0800 Subject: [PATCH 40/55] td-459: TSDB_TABLE_NAME_LEN --- src/client/src/tscSQLParser.c | 8 +++---- src/client/src/tscServer.c | 6 ++--- src/common/src/tname.c | 3 +-- src/inc/taosdef.h | 4 ++-- src/mnode/src/mnodeTable.c | 28 ++++++++++++------------ src/plugins/http/src/httpUtil.c | 4 ++-- src/plugins/http/src/tgHandle.c | 6 ++--- src/query/src/qExecutor.c | 11 +++++----- src/query/src/qast.c | 4 ++-- src/tsdb/src/tsdbMeta.c | 4 ++-- src/tsdb/src/tsdbRead.c | 2 +- src/util/src/tutil.c | 8 +++---- tests/pytest/table/boundary.py | 8 +++---- tests/pytest/table/tablename-boundary.py | 4 +--- 14 files changed, 49 insertions(+), 51 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index f29c886cba..ba714f10e4 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -348,7 +348,7 @@ int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg1); } - if (pToken->n > TSDB_TABLE_NAME_LEN) { + if (pToken->n >= TSDB_TABLE_NAME_LEN) { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2); } @@ -1401,7 +1401,7 @@ int32_t addProjectionExprAndResultField(SQueryInfo* pQueryInfo, tSQLExprItem* pI } if (index.columnIndex == TSDB_TBNAME_COLUMN_INDEX) { - SSchema colSchema = {.type = TSDB_DATA_TYPE_BINARY, .bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE}; + SSchema colSchema = {.type = TSDB_DATA_TYPE_BINARY, .bytes = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE}; strcpy(colSchema.name, TSQL_TBNAME_L); tscAddSpecialColumnForSelect(pQueryInfo, startPos, TSDB_FUNC_TAGPRJ, &index, &colSchema, true); @@ -2229,7 +2229,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg6); } - if (pCmd->payloadLen > TSDB_TABLE_NAME_LEN) { + if (pCmd->payloadLen >= TSDB_TABLE_NAME_LEN) { return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2); } } @@ -5232,7 +5232,7 @@ static int32_t doAddGroupbyColumnsOnDemand(SQueryInfo* pQueryInfo) { int16_t colIndex = pColIndex->colIndex; if (colIndex == TSDB_TBNAME_COLUMN_INDEX) { type = TSDB_DATA_TYPE_BINARY; - bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; // todo extract method + bytes = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; // todo extract method name = TSQL_TBNAME_L; } else { if (TSDB_COL_IS_TAG(pColIndex->flag)) { diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index f96b979105..e0febc0e95 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1430,9 +1430,9 @@ int tscBuildConnectMsg(SSqlObj *pSql, SSqlInfo *pInfo) { char *db; // ugly code to move the space db = strstr(pObj->db, TS_PATH_DELIMITER); db = (db == NULL) ? pObj->db : db + 1; - strcpy(pConnect->db, db); - strcpy(pConnect->clientVersion, version); - strcpy(pConnect->msgVersion, ""); + tstrncpy(pConnect->db, db, sizeof(pConnect->db)); + tstrncpy(pConnect->clientVersion, version, sizeof(pConnect->clientVersion)); + tstrncpy(pConnect->msgVersion, "", sizeof(pConnect->msgVersion)); return TSDB_CODE_SUCCESS; } diff --git a/src/common/src/tname.c b/src/common/src/tname.c index 3566f26abd..d2f5dfc4f7 100644 --- a/src/common/src/tname.c +++ b/src/common/src/tname.c @@ -28,8 +28,7 @@ void extractTableName(const char* tableId, char* name) { size_t s1 = strcspn(tableId, &TS_PATH_DELIMITER[0]); size_t s2 = strcspn(&tableId[s1 + 1], &TS_PATH_DELIMITER[0]); - strncpy(name, &tableId[s1 + s2 + 2], TSDB_TABLE_NAME_LEN); - name[TSDB_TABLE_NAME_LEN] = 0; + tstrncpy(name, &tableId[s1 + s2 + 2], TSDB_TABLE_NAME_LEN); } char* extractDBName(const char* tableId, char* name) { diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index c75fc70d75..c1d0e5ae47 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -189,7 +189,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size); #define TSDB_USERID_LEN 9 #define TS_PATH_DELIMITER_LEN 1 -#define TSDB_METER_ID_LEN_MARGIN 10 +#define TSDB_METER_ID_LEN_MARGIN 9 #define TSDB_TABLE_ID_LEN (TSDB_DB_NAME_LEN+TSDB_TABLE_NAME_LEN+2*TS_PATH_DELIMITER_LEN+TSDB_USERID_LEN+TSDB_METER_ID_LEN_MARGIN) //TSDB_DB_NAME_LEN+TSDB_TABLE_NAME_LEN+2*strlen(TS_PATH_DELIMITER)+strlen(USERID) #define TSDB_UNI_LEN 24 #define TSDB_USER_LEN TSDB_UNI_LEN @@ -200,7 +200,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size); #define TSDB_MIN_COLUMNS 2 //PRIMARY COLUMN(timestamp) + other columns #define TSDB_NODE_NAME_LEN 64 -#define TSDB_TABLE_NAME_LEN 192 +#define TSDB_TABLE_NAME_LEN 193 #define TSDB_DB_NAME_LEN 32 #define TSDB_COL_NAME_LEN 64 #define TSDB_MAX_SAVED_SQL_LEN TSDB_MAX_COLUMNS * 64 diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index 119ba1627d..54a6c2c7c0 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1078,7 +1078,7 @@ static int32_t mnodeGetShowSuperTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, int32_t cols = 0; SSchema *pSchema = pMeta->schema; - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + pShow->bytes[cols] = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "name"); pSchema[cols].bytes = htons(pShow->bytes[cols]); @@ -1138,7 +1138,7 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, prefixLen = strlen(prefix); SPatternCompareInfo info = PATTERN_COMPARE_INFO_INITIALIZER; - char stableName[TSDB_TABLE_NAME_LEN + 1] = {0}; + char stableName[TSDB_TABLE_NAME_LEN] = {0}; while (numOfRows < rows) { pShow->pIter = mnodeGetNextSuperTable(pShow->pIter, &pTable); @@ -1151,7 +1151,7 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, memset(stableName, 0, tListLen(stableName)); mnodeExtractTableName(pTable->info.tableId, stableName); - if (pShow->payloadLen > 0 && patternMatch(pShow->payload, stableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) { + if (pShow->payloadLen > 0 && patternMatch(pShow->payload, stableName, sizeof(stableName) - 1, &info) != TSDB_PATTERN_MATCH) { mnodeDecTableRef(pTable); continue; } @@ -2079,7 +2079,7 @@ static int32_t mnodeGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void int32_t cols = 0; SSchema *pSchema = pMeta->schema; - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + pShow->bytes[cols] = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "table_name"); pSchema[cols].bytes = htons(pShow->bytes[cols]); @@ -2097,7 +2097,7 @@ static int32_t mnodeGetShowTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, void pSchema[cols].bytes = htons(pShow->bytes[cols]); cols++; - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + pShow->bytes[cols] = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "stable_name"); pSchema[cols].bytes = htons(pShow->bytes[cols]); @@ -2141,12 +2141,12 @@ static int32_t mnodeRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows continue; } - char tableName[TSDB_TABLE_NAME_LEN + 1] = {0}; + char tableName[TSDB_TABLE_NAME_LEN] = {0}; // pattern compare for table name mnodeExtractTableName(pTable->info.tableId, tableName); - if (pShow->payloadLen > 0 && patternMatch(pShow->payload, tableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) { + if (pShow->payloadLen > 0 && patternMatch(pShow->payload, tableName, sizeof(tableName) - 1, &info) != TSDB_PATTERN_MATCH) { mnodeDecTableRef(pTable); continue; } @@ -2155,7 +2155,7 @@ static int32_t mnodeRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows char *pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - STR_WITH_MAXSIZE_TO_VARSTR(pWrite, tableName, TSDB_TABLE_NAME_LEN); + STR_WITH_MAXSIZE_TO_VARSTR(pWrite, tableName, sizeof(tableName) - 1); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; @@ -2173,10 +2173,10 @@ static int32_t mnodeRetrieveShowTables(SShowObj *pShow, char *data, int32_t rows pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - memset(tableName, 0, tListLen(tableName)); + memset(tableName, 0, sizeof(tableName)); if (pTable->info.type == TSDB_CHILD_TABLE) { mnodeExtractTableName(pTable->superTable->info.tableId, tableName); - STR_WITH_MAXSIZE_TO_VARSTR(pWrite, tableName, TSDB_TABLE_NAME_LEN); + STR_WITH_MAXSIZE_TO_VARSTR(pWrite, tableName, sizeof(tableName) - 1); } cols++; @@ -2268,7 +2268,7 @@ static int32_t mnodeGetStreamTableMeta(STableMetaMsg *pMeta, SShowObj *pShow, vo int32_t cols = 0; SSchema *pSchema = pMeta->schema; - pShow->bytes[cols] = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + pShow->bytes[cols] = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "table_name"); pSchema[cols].bytes = htons(pShow->bytes[cols]); @@ -2331,12 +2331,12 @@ static int32_t mnodeRetrieveStreamTables(SShowObj *pShow, char *data, int32_t ro continue; } - char tableName[TSDB_TABLE_NAME_LEN + 1] = {0}; + char tableName[TSDB_TABLE_NAME_LEN] = {0}; // pattern compare for table name mnodeExtractTableName(pTable->info.tableId, tableName); - if (pShow->payloadLen > 0 && patternMatch(pShow->payload, tableName, TSDB_TABLE_NAME_LEN, &info) != TSDB_PATTERN_MATCH) { + if (pShow->payloadLen > 0 && patternMatch(pShow->payload, tableName, sizeof(tableName) - 1, &info) != TSDB_PATTERN_MATCH) { mnodeDecTableRef(pTable); continue; } @@ -2345,7 +2345,7 @@ static int32_t mnodeRetrieveStreamTables(SShowObj *pShow, char *data, int32_t ro char *pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - STR_WITH_MAXSIZE_TO_VARSTR(pWrite, tableName, TSDB_TABLE_NAME_LEN); + STR_WITH_MAXSIZE_TO_VARSTR(pWrite, tableName, sizeof(tableName) - 1); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; diff --git a/src/plugins/http/src/httpUtil.c b/src/plugins/http/src/httpUtil.c index b91b89e21c..1fb63ea2fc 100644 --- a/src/plugins/http/src/httpUtil.c +++ b/src/plugins/http/src/httpUtil.c @@ -307,7 +307,7 @@ void httpTrimTableName(char *name) { for (int i = 0; name[i] != 0; i++) { if (name[i] == ' ' || name[i] == ':' || name[i] == '.' || name[i] == '-' || name[i] == '/' || name[i] == '\'') name[i] = '_'; - if (i == TSDB_TABLE_NAME_LEN + 1) { + if (i == TSDB_TABLE_NAME_LEN) { name[i] = 0; break; } @@ -323,7 +323,7 @@ int httpShrinkTableName(HttpContext *pContext, int pos, char *name) { len++; } - if (len < TSDB_TABLE_NAME_LEN) { + if (len < TSDB_TABLE_NAME_LEN - 1) { return pos; } diff --git a/src/plugins/http/src/tgHandle.c b/src/plugins/http/src/tgHandle.c index c6a2230bfb..945eff7611 100644 --- a/src/plugins/http/src/tgHandle.c +++ b/src/plugins/http/src/tgHandle.c @@ -209,7 +209,7 @@ void tgParseSchemaMetric(cJSON *metric) { goto ParseEnd; } int nameLen = (int)strlen(field->valuestring); - if (nameLen == 0 || nameLen > TSDB_TABLE_NAME_LEN) { + if (nameLen == 0 || nameLen >= TSDB_TABLE_NAME_LEN) { parsedOk = false; goto ParseEnd; } @@ -409,7 +409,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) { httpSendErrorResp(pContext, HTTP_TG_METRIC_NAME_NULL); return false; } - if (nameLen >= TSDB_TABLE_NAME_LEN - 7) { + if (nameLen >= TSDB_TABLE_NAME_LEN - 8) { httpSendErrorResp(pContext, HTTP_TG_METRIC_NAME_LONG); return false; } @@ -498,7 +498,7 @@ bool tgProcessSingleMetric(HttpContext *pContext, cJSON *metric, char *db) { return false; } - if (strlen(host->valuestring) >= TSDB_TABLE_NAME_LEN) { + if (strlen(host->valuestring) >= TSDB_TABLE_NAME_LEN - 1) { httpSendErrorResp(pContext, HTTP_TG_TABLE_SIZE); return false; } diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 26502a7408..b080de87f2 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -1368,7 +1368,7 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order int32_t index = pSqlFuncMsg->colInfo.colIndex; if (TSDB_COL_IS_TAG(pIndex->flag)) { if (pIndex->colId == TSDB_TBNAME_COLUMN_INDEX) { // todo refactor - pCtx->inputBytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + pCtx->inputBytes = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; pCtx->inputType = TSDB_DATA_TYPE_BINARY; } else { pCtx->inputBytes = pQuery->tagColList[index].bytes; @@ -5148,8 +5148,8 @@ static int32_t createQFunctionExprFromMsg(SQueryTableMsg *pQueryMsg, SExprInfo * bytes = tDataTypeDesc[type].nSize; } else if (pExprs[i].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX && pExprs[i].base.functionId == TSDB_FUNC_TAGPRJ) { // parse the normal column type = TSDB_DATA_TYPE_BINARY; - bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; - } else { + bytes = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; + } else{ int32_t j = getColumnIndexInSource(pQueryMsg, &pExprs[i].base, pTagCols); assert(j < pQueryMsg->numOfCols || j < pQueryMsg->numOfTags || j == TSDB_TBNAME_COLUMN_INDEX); @@ -6037,8 +6037,9 @@ static void buildTagQueryResult(SQInfo* pQInfo) { for(int32_t j = 0; j < pQuery->numOfOutput; ++j) { if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) { - char* data = tsdbGetTableName(pQInfo->tsdb, &item->id); - char* dst = pQuery->sdata[j]->data + count * (TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE); + data = tsdbGetTableName(pQInfo->tsdb, &item->id, &bytes); + + char* dst = pQuery->sdata[j]->data + i * ((TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE); memcpy(dst, data, varDataTLen(data)); } else {// todo refactor int16_t type = pExprInfo[j].type; diff --git a/src/query/src/qast.c b/src/query/src/qast.c index 0a0fe56ebd..1db965e8a3 100644 --- a/src/query/src/qast.c +++ b/src/query/src/qast.c @@ -138,7 +138,7 @@ static tExprNode *tExprNodeCreate(SSchema *pSchema, int32_t numOfCols, SSQLToken memcpy(pNode->pSchema, &pSchema[i], sizeof(SSchema)); } else { pNode->pSchema->type = TSDB_DATA_TYPE_BINARY; - pNode->pSchema->bytes = TSDB_TABLE_NAME_LEN; + pNode->pSchema->bytes = TSDB_TABLE_NAME_LEN - 1; strcpy(pNode->pSchema->name, TSQL_TBNAME_L); pNode->pSchema->colId = -1; } @@ -1127,7 +1127,7 @@ tExprNode* exprTreeFromTableName(const char* tbnameCond) { left->pSchema = pSchema; pSchema->type = TSDB_DATA_TYPE_BINARY; - pSchema->bytes = TSDB_TABLE_NAME_LEN; + pSchema->bytes = TSDB_TABLE_NAME_LEN - 1; strcpy(pSchema->name, TSQL_TBNAME_L); pSchema->colId = -1; diff --git a/src/tsdb/src/tsdbMeta.c b/src/tsdb/src/tsdbMeta.c index 40e5667893..8eb259d38c 100644 --- a/src/tsdb/src/tsdbMeta.c +++ b/src/tsdb/src/tsdbMeta.c @@ -334,7 +334,7 @@ static STable *tsdbNewTable(STableCfg *pCfg, bool isSuper) { pTable->schema[0] = tdDupSchema(pCfg->schema); pTable->tagSchema = tdDupSchema(pCfg->tagSchema); - tsize = strnlen(pCfg->sname, TSDB_TABLE_NAME_LEN); + tsize = strnlen(pCfg->sname, TSDB_TABLE_NAME_LEN - 1); pTable->name = calloc(1, tsize + VARSTR_HEADER_SIZE + 1); if (pTable->name == NULL) { terrno = TSDB_CODE_TDB_OUT_OF_MEMORY; @@ -355,7 +355,7 @@ static STable *tsdbNewTable(STableCfg *pCfg, bool isSuper) { pTable->tableId.tid = pCfg->tableId.tid; pTable->lastKey = TSKEY_INITIAL_VAL; - tsize = strnlen(pCfg->name, TSDB_TABLE_NAME_LEN); + tsize = strnlen(pCfg->name, TSDB_TABLE_NAME_LEN - 1); pTable->name = calloc(1, tsize + VARSTR_HEADER_SIZE + 1); if (pTable->name == NULL) { terrno = TSDB_CODE_TDB_OUT_OF_MEMORY; diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index 86ce44ad7b..d3a909a162 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -2011,7 +2011,7 @@ int32_t tableGroupComparFn(const void *p1, const void *p2, const void *param) { f1 = (char*) pTable1->name; f2 = (char*) pTable2->name; type = TSDB_DATA_TYPE_BINARY; - bytes = TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE; + bytes = (TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE; } else { STColumn* pCol = schemaColAt(pTableGroupSupp->pTagSchema, colIndex); bytes = pCol->bytes; diff --git a/src/util/src/tutil.c b/src/util/src/tutil.c index c524a61591..9209117415 100644 --- a/src/util/src/tutil.c +++ b/src/util/src/tutil.c @@ -582,13 +582,13 @@ bool taosGetVersionNumber(char *versionStr, int *versionNubmer) { } int taosCheckVersion(char *input_client_version, char *input_server_version, int comparedSegments) { - char client_version[64] = {0}; - char server_version[64] = {0}; + char client_version[TSDB_VERSION_LEN] = {0}; + char server_version[TSDB_VERSION_LEN] = {0}; int clientVersionNumber[4] = {0}; int serverVersionNumber[4] = {0}; - strcpy(client_version, input_client_version); - strcpy(server_version, input_server_version); + tstrncpy(client_version, input_client_version, sizeof(client_version)); + tstrncpy(server_version, input_server_version, sizeof(server_version)); if (!taosGetVersionNumber(client_version, clientVersionNumber)) { uError("invalid client version:%s", client_version); diff --git a/tests/pytest/table/boundary.py b/tests/pytest/table/boundary.py index bb5e187f0d..d9f0490ed4 100644 --- a/tests/pytest/table/boundary.py +++ b/tests/pytest/table/boundary.py @@ -96,14 +96,14 @@ class TDTestCase: tdLog.notice("table name max length is %d" % maxTableNameLen) # create a super table with name exceed max length - sname = self.generateString(maxTableNameLen + 1) + sname = self.generateString(maxTableNameLen) tdLog.info("create a super table with length %d" % len(sname)) tdSql.error( "create table %s (ts timestamp, value int) tags(id int)" % sname) # create a super table with name of max length - sname = self.generateString(maxTableNameLen) + sname = self.generateString(maxTableNameLen - 1) tdLog.info("create a super table with length %d" % len(sname)) tdSql.execute( "create table %s (ts timestamp, value int) tags(id int)" % @@ -113,12 +113,12 @@ class TDTestCase: tdSql.checkRows(1) # create a child table with name exceed max length - name = self.generateString(maxTableNameLen + 1) + name = self.generateString(maxTableNameLen) tdLog.info("create a child table with length %d" % len(name)) tdSql.error("create table %s using %s tags(0)" % (name, sname)) # create a child table with name of max length - name = self.generateString(maxTableNameLen) + name = self.generateString(maxTableNameLen - 1) tdLog.info("create a child table with length %d" % len(name)) tdSql.execute("create table %s using %s tags(0)" % (name, sname)) tdSql.query('show tables') diff --git a/tests/pytest/table/tablename-boundary.py b/tests/pytest/table/tablename-boundary.py index ce843c3fe7..6ce986c51e 100644 --- a/tests/pytest/table/tablename-boundary.py +++ b/tests/pytest/table/tablename-boundary.py @@ -18,9 +18,7 @@ class TDTestCase: tdSql.prepare() getTableNameLen = "grep -w '#define TSDB_TABLE_NAME_LEN' ../../src/inc/taosdef.h|awk '{print $3}'" - tableNameMaxLen = int( - subprocess.check_output( - getTableNameLen, shell=True)) + tableNameMaxLen = int( subprocess.check_output(getTableNameLen, shell=True)) - 1 tdLog.info("table name max length is %d" % tableNameMaxLen) chars = string.ascii_uppercase + string.ascii_lowercase tb_name = ''.join(random.choices(chars, k=tableNameMaxLen)) From 18c92c1cf4d7573210f866457428dd7bff13a9e0 Mon Sep 17 00:00:00 2001 From: Tao Liu Date: Tue, 9 Jun 2020 04:16:09 +0000 Subject: [PATCH 41/55] [TD-188] adjust format and remove some unnecessary code --- src/common/inc/tdataformat.h | 4 ++-- src/common/src/tdataformat.c | 4 ---- src/inc/tsdb.h | 8 ++++---- 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/src/common/inc/tdataformat.h b/src/common/inc/tdataformat.h index 441af9a215..e1f17b09a9 100644 --- a/src/common/inc/tdataformat.h +++ b/src/common/inc/tdataformat.h @@ -69,8 +69,8 @@ typedef struct { int version; // version int numOfCols; // Number of columns appended int tlen; // maximum length of a SDataRow without the header part - int16_t flen; // First part length in a SDataRow after the header part - int16_t vlen; // pure value part length, excluded the overhead + int16_t flen; // First part length in a SDataRow after the header part + int16_t vlen; // pure value part length, excluded the overhead STColumn columns[]; } STSchema; diff --git a/src/common/src/tdataformat.c b/src/common/src/tdataformat.c index cb84c376eb..0e4ffda78b 100644 --- a/src/common/src/tdataformat.c +++ b/src/common/src/tdataformat.c @@ -37,7 +37,6 @@ void *tdEncodeSchema(void *dst, STSchema *pSchema) { T_APPEND_MEMBER(dst, pSchema, STSchema, version); T_APPEND_MEMBER(dst, pSchema, STSchema, numOfCols); - T_APPEND_MEMBER(dst, pSchema, STSchema, vlen); for (int i = 0; i < schemaNCols(pSchema); i++) { STColumn *pCol = schemaColAt(pSchema, i); T_APPEND_MEMBER(dst, pCol, STColumn, type); @@ -54,12 +53,10 @@ void *tdEncodeSchema(void *dst, STSchema *pSchema) { STSchema *tdDecodeSchema(void **psrc) { int totalCols = 0; int version = 0; - int16_t vlen = 0; STSchemaBuilder schemaBuilder = {0}; T_READ_MEMBER(*psrc, int, version); T_READ_MEMBER(*psrc, int, totalCols); - T_READ_MEMBER(*psrc, int16_t, vlen); if (tdInitTSchemaBuilder(&schemaBuilder, version) < 0) return NULL; @@ -78,7 +75,6 @@ STSchema *tdDecodeSchema(void **psrc) { } STSchema *pSchema = tdGetSchemaFromBuilder(&schemaBuilder); - pSchema->vlen = vlen; tdDestroyTSchemaBuilder(&schemaBuilder); return pSchema; } diff --git a/src/inc/tsdb.h b/src/inc/tsdb.h index bdb61e6ee1..add85d9438 100644 --- a/src/inc/tsdb.h +++ b/src/inc/tsdb.h @@ -67,10 +67,10 @@ typedef struct { // --------- TSDB REPOSITORY USAGE STATISTICS typedef struct { - int64_t totalStorage; //total bytes occupie - int64_t compStorage; - int64_t pointsWritten; //total data points written -}STsdbStat; + int64_t totalStorage; // total bytes occupie + int64_t compStorage; + int64_t pointsWritten; // total data points written +} STsdbStat; typedef void TsdbRepoT; // use void to hide implementation details from outside From 376809ace94c7703f605d09ecb4f052afa2bdadb Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 9 Jun 2020 14:30:35 +0800 Subject: [PATCH 42/55] [td-225] fix invalid read when free taosCache object. --- src/client/src/tscSystem.c | 6 +- src/mnode/src/mnodeProfile.c | 2 +- src/mnode/src/mnodeShow.c | 2 +- src/util/inc/tcache.h | 57 ++--- src/util/src/tcache.c | 403 ++++++++++++++++++----------------- 5 files changed, 243 insertions(+), 227 deletions(-) diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index 75249e44ee..ea1c656a5f 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -143,11 +143,11 @@ void taos_init_imp() { } int64_t refreshTime = tsTableMetaKeepTimer; - refreshTime = refreshTime > 2 ? 2 : refreshTime; - refreshTime = refreshTime < 1 ? 1 : refreshTime; + refreshTime = refreshTime > 10 ? 10 : refreshTime; + refreshTime = refreshTime < 10 ? 10 : refreshTime; if (tscCacheHandle == NULL) { - tscCacheHandle = taosCacheInit(tscTmr, refreshTime); + tscCacheHandle = taosCacheInit(refreshTime); } tscTrace("client is initialized successfully"); diff --git a/src/mnode/src/mnodeProfile.c b/src/mnode/src/mnodeProfile.c index ed0e717c43..85999f80e7 100644 --- a/src/mnode/src/mnodeProfile.c +++ b/src/mnode/src/mnodeProfile.c @@ -67,7 +67,7 @@ int32_t mnodeInitProfile() { mnodeAddWriteMsgHandle(TSDB_MSG_TYPE_CM_KILL_STREAM, mnodeProcessKillStreamMsg); mnodeAddWriteMsgHandle(TSDB_MSG_TYPE_CM_KILL_CONN, mnodeProcessKillConnectionMsg); - tsMnodeConnCache = taosCacheInitWithCb(tsMnodeTmr, CONN_CHECK_TIME, mnodeFreeConn); + tsMnodeConnCache = taosCacheInitWithCb(CONN_CHECK_TIME, mnodeFreeConn); return 0; } diff --git a/src/mnode/src/mnodeShow.c b/src/mnode/src/mnodeShow.c index 36e7d13a86..920ec3843b 100644 --- a/src/mnode/src/mnodeShow.c +++ b/src/mnode/src/mnodeShow.c @@ -65,7 +65,7 @@ int32_t mnodeInitShow() { mnodeAddReadMsgHandle(TSDB_MSG_TYPE_CM_CONNECT, mnodeProcessConnectMsg); mnodeAddReadMsgHandle(TSDB_MSG_TYPE_CM_USE_DB, mnodeProcessUseMsg); - tsMnodeShowCache = taosCacheInitWithCb(tsMnodeTmr, 10, mnodeFreeShowObj); + tsMnodeShowCache = taosCacheInitWithCb(10, mnodeFreeShowObj); return 0; } diff --git a/src/util/inc/tcache.h b/src/util/inc/tcache.h index 2369f63f16..17b3823831 100644 --- a/src/util/inc/tcache.h +++ b/src/util/inc/tcache.h @@ -37,8 +37,8 @@ typedef struct SCacheDataNode { uint64_t expiredTime; // expiredTime expiredTime when this element should be remove from cache uint64_t signature; uint32_t size; // allocated size for current SCacheDataNode - uint16_t keySize : 15; - bool inTrash : 1; // denote if it is in trash or not + uint16_t keySize: 15; + bool inTrashCan: 1;// denote if it is in trash or not T_REF_DECLARE() char *key; char data[]; @@ -50,46 +50,49 @@ typedef struct STrashElem { SCacheDataNode *pData; } STrashElem; +/* + * to accommodate the old data which has the same key value of new one in hashList + * when an new node is put into cache, if an existed one with the same key: + * 1. if the old one does not be referenced, update it. + * 2. otherwise, move the old one to pTrash, addedTime the new one. + * + * when the node in pTrash does not be referenced, it will be release at the expired expiredTime + */ typedef struct { - int64_t totalSize; // total allocated buffer in this hash table, SCacheObj is not included. - int64_t refreshTime; - - /* - * to accommodate the old datanode which has the same key value of new one in hashList - * when an new node is put into cache, if an existed one with the same key: - * 1. if the old one does not be referenced, update it. - * 2. otherwise, move the old one to pTrash, addedTime the new one. - * - * when the node in pTrash does not be referenced, it will be release at the expired expiredTime - */ - STrashElem * pTrash; - void * tmrCtrl; - void * pTimer; - SCacheStatis statistics; - SHashObj * pHashTable; + int64_t totalSize; // total allocated buffer in this hash table, SCacheObj is not included. + int64_t refreshTime; + STrashElem * pTrash; + void * tmrCtrl; + void * pTimer; + SCacheStatis statistics; + SHashObj * pHashTable; _hash_free_fn_t freeFp; - int numOfElemsInTrash; // number of element in trash - int16_t deleting; // set the deleting flag to stop refreshing ASAP. - T_REF_DECLARE() + uint32_t numOfElemsInTrash; // number of element in trash + uint8_t deleting; // set the deleting flag to stop refreshing ASAP. + pthread_t refreshWorker; #if defined(LINUX) pthread_rwlock_t lock; #else pthread_mutex_t lock; #endif - } SCacheObj; /** - * - * @param maxSessions maximum slots available for hash elements - * @param tmrCtrl timer ctrl + * initialize the cache object * @param refreshTime refresh operation interval time, the maximum survival time when one element is expired and * not referenced by other objects * @return */ -SCacheObj *taosCacheInit(void *tmrCtrl, int64_t refreshTimeInSeconds); -SCacheObj *taosCacheInitWithCb(void *tmrCtrl, int64_t refreshTimeInSeconds, void (*freeCb)(void *data)); +SCacheObj *taosCacheInit(int64_t refreshTimeInSeconds); + +/** + * initialize the cache object and set the free object callback function + * @param refreshTimeInSeconds + * @param freeCb + * @return + */ +SCacheObj *taosCacheInitWithCb(int64_t refreshTimeInSeconds, void (*freeCb)(void *data)); /** * add data into cache diff --git a/src/util/src/tcache.c b/src/util/src/tcache.c index b0291b5cc0..3ce051fcee 100644 --- a/src/util/src/tcache.c +++ b/src/util/src/tcache.c @@ -77,31 +77,7 @@ static FORCE_INLINE void taosFreeNode(void *data) { * @param lifespan total survial expiredTime from now * @return SCacheDataNode */ -static SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *pData, size_t size, - uint64_t duration) { - size_t totalSize = size + sizeof(SCacheDataNode) + keyLen + 1; - - SCacheDataNode *pNewNode = calloc(1, totalSize); - if (pNewNode == NULL) { - uError("failed to allocate memory, reason:%s", strerror(errno)); - return NULL; - } - - memcpy(pNewNode->data, pData, size); - - pNewNode->key = (char *)pNewNode + sizeof(SCacheDataNode) + size; - pNewNode->keySize = keyLen; - - memcpy(pNewNode->key, key, keyLen); - - pNewNode->addedTime = (uint64_t)taosGetTimestampMs(); - pNewNode->expiredTime = pNewNode->addedTime + duration; - - pNewNode->signature = (uint64_t)pNewNode; - pNewNode->size = (uint32_t)totalSize; - - return pNewNode; -} +static SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *pData, size_t size, uint64_t duration); /** * addedTime object node into trash, and this object is closed for referencing if it is addedTime to trash @@ -109,50 +85,15 @@ static SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const * @param pCacheObj Cache object * @param pNode Cache slot object */ -static void taosAddToTrash(SCacheObj *pCacheObj, SCacheDataNode *pNode) { - if (pNode->inTrash) { /* node is already in trash */ - return; - } - - STrashElem *pElem = calloc(1, sizeof(STrashElem)); - pElem->pData = pNode; - - pElem->next = pCacheObj->pTrash; - if (pCacheObj->pTrash) { - pCacheObj->pTrash->prev = pElem; - } - - pElem->prev = NULL; - pCacheObj->pTrash = pElem; - - pNode->inTrash = true; - pCacheObj->numOfElemsInTrash++; - - uTrace("key:%s %p move to trash, numOfElem in trash:%d", pNode->key, pNode, pCacheObj->numOfElemsInTrash); -} +static void taosAddToTrash(SCacheObj *pCacheObj, SCacheDataNode *pNode); + +/** + * remove node in trash can + * @param pCacheObj + * @param pElem + */ +static void taosRemoveFromTrashCan(SCacheObj *pCacheObj, STrashElem *pElem); -static void taosRemoveFromTrash(SCacheObj *pCacheObj, STrashElem *pElem) { - if (pElem->pData->signature != (uint64_t)pElem->pData) { - uError("key:sig:%d %p data has been released, ignore", pElem->pData->signature, pElem->pData); - return; - } - - pCacheObj->numOfElemsInTrash--; - if (pElem->prev) { - pElem->prev->next = pElem->next; - } else { /* pnode is the header, update header */ - pCacheObj->pTrash = pElem->next; - } - - if (pElem->next) { - pElem->next->prev = pElem->prev; - } - - pElem->pData->signature = 0; - if (pCacheObj->freeFp) pCacheObj->freeFp(pElem->pData->data); - free(pElem->pData); - free(pElem); -} /** * remove nodes in trash with refCount == 0 in cache * @param pNode @@ -160,42 +101,7 @@ static void taosRemoveFromTrash(SCacheObj *pCacheObj, STrashElem *pElem) { * @param force force model, if true, remove data in trash without check refcount. * may cause corruption. So, forece model only applys before cache is closed */ -static void taosTrashEmpty(SCacheObj *pCacheObj, bool force) { - __cache_wr_lock(pCacheObj); - - if (pCacheObj->numOfElemsInTrash == 0) { - if (pCacheObj->pTrash != NULL) { - uError("key:inconsistency data in cache, numOfElem in trash:%d", pCacheObj->numOfElemsInTrash); - } - pCacheObj->pTrash = NULL; - - __cache_unlock(pCacheObj); - return; - } - - STrashElem *pElem = pCacheObj->pTrash; - - while (pElem) { - T_REF_VAL_CHECK(pElem->pData); - if (pElem->next == pElem) { - pElem->next = NULL; - } - - if (force || (T_REF_VAL_GET(pElem->pData) == 0)) { - uTrace("key:%s %p removed from trash. numOfElem in trash:%d", pElem->pData->key, pElem->pData, - pCacheObj->numOfElemsInTrash - 1); - STrashElem *p = pElem; - - pElem = pElem->next; - taosRemoveFromTrash(pCacheObj, p); - } else { - pElem = pElem->next; - } - } - - assert(pCacheObj->numOfElemsInTrash >= 0); - __cache_unlock(pCacheObj); -} +static void taosTrashCanEmpty(SCacheObj *pCacheObj, bool force); /** * release node @@ -304,87 +210,20 @@ static FORCE_INLINE SCacheDataNode *taosAddToCacheImpl(SCacheObj *pCacheObj, con return pNode; } -static void doCleanupDataCache(SCacheObj *pCacheObj) { - __cache_wr_lock(pCacheObj); - - //if (taosHashGetSize(pCacheObj->pHashTable) > 0) { - taosHashCleanup(pCacheObj->pHashTable); - //} - - __cache_unlock(pCacheObj); - - taosTrashEmpty(pCacheObj, true); - __cache_lock_destroy(pCacheObj); - - memset(pCacheObj, 0, sizeof(SCacheObj)); - free(pCacheObj); -} +/** + * do cleanup the taos cache + * @param pCacheObj + */ +static void doCleanupDataCache(SCacheObj *pCacheObj); /** * refresh cache to remove data in both hash list and trash, if any nodes' refcount == 0, every pCacheObj->refreshTime * @param handle Cache object handle */ -static void taosCacheRefresh(void *handle, void *tmrId) { - SCacheObj *pCacheObj = (SCacheObj *)handle; - - if (pCacheObj == NULL || T_REF_VAL_GET(pCacheObj) == 0) { - uTrace("object is destroyed. no refresh retry"); - return; - } - - int16_t ref = T_REF_INC(pCacheObj); - if (ref == 1) { - T_REF_DEC(pCacheObj); - return; - } - - // todo add the ref before start the timer - int32_t num = taosHashGetSize(pCacheObj->pHashTable); - if (num == 0) { - ref = T_REF_DEC(pCacheObj); - if (ref == 0) { - doCleanupDataCache(pCacheObj); - } else { - taosTmrReset(taosCacheRefresh, pCacheObj->refreshTime, pCacheObj, pCacheObj->tmrCtrl, &pCacheObj->pTimer); - } - return; - } - - uint64_t expiredTime = taosGetTimestampMs(); - pCacheObj->statistics.refreshCount++; - - SHashMutableIterator *pIter = taosHashCreateIter(pCacheObj->pHashTable); - - __cache_wr_lock(pCacheObj); - while (taosHashIterNext(pIter)) { - if (pCacheObj->deleting == 1) { - taosHashDestroyIter(pIter); - break; - } - - SCacheDataNode *pNode = *(SCacheDataNode **)taosHashIterGet(pIter); - if (pNode->expiredTime <= expiredTime && T_REF_VAL_GET(pNode) <= 0) { - taosCacheReleaseNode(pCacheObj, pNode); - } - } - - __cache_unlock(pCacheObj); - - taosHashDestroyIter(pIter); +static void* taosCacheRefresh(void *handle); - taosTrashEmpty(pCacheObj, false); - - ref = T_REF_DEC(pCacheObj); - if (ref == 0) { - doCleanupDataCache(pCacheObj); - return; - } else { - taosTmrReset(taosCacheRefresh, pCacheObj->refreshTime, pCacheObj, pCacheObj->tmrCtrl, &pCacheObj->pTimer); - } -} - -SCacheObj *taosCacheInitWithCb(void *tmrCtrl, int64_t refreshTime, void (*freeCb)(void *data)) { - if (tmrCtrl == NULL || refreshTime <= 0) { +SCacheObj *taosCacheInitWithCb(int64_t refreshTime, void (*freeCb)(void *data)) { + if (refreshTime <= 0) { return NULL; } @@ -394,7 +233,7 @@ SCacheObj *taosCacheInitWithCb(void *tmrCtrl, int64_t refreshTime, void (*freeCb return NULL; } - pCacheObj->pHashTable = taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false); + pCacheObj->pHashTable = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false); if (pCacheObj->pHashTable == NULL) { free(pCacheObj); uError("failed to allocate memory, reason:%s", strerror(errno)); @@ -406,25 +245,27 @@ SCacheObj *taosCacheInitWithCb(void *tmrCtrl, int64_t refreshTime, void (*freeCb pCacheObj->freeFp = freeCb; pCacheObj->refreshTime = refreshTime * 1000; - pCacheObj->tmrCtrl = tmrCtrl; - - taosTmrReset(taosCacheRefresh, pCacheObj->refreshTime, pCacheObj, pCacheObj->tmrCtrl, &pCacheObj->pTimer); - + if (__cache_lock_init(pCacheObj) != 0) { - taosTmrStopA(&pCacheObj->pTimer); taosHashCleanup(pCacheObj->pHashTable); free(pCacheObj); uError("failed to init lock, reason:%s", strerror(errno)); return NULL; } - - T_REF_INC(pCacheObj); + + pthread_attr_t thattr = {0}; + pthread_attr_init(&thattr); + pthread_attr_setdetachstate(&thattr, PTHREAD_CREATE_JOINABLE); + + pthread_create(&pCacheObj->refreshWorker, &thattr, taosCacheRefresh, pCacheObj); + + pthread_attr_destroy(&thattr); return pCacheObj; } -SCacheObj *taosCacheInit(void *tmrCtrl, int64_t refreshTime) { - return taosCacheInitWithCb(tmrCtrl, refreshTime, NULL); +SCacheObj *taosCacheInit(int64_t refreshTime) { + return taosCacheInitWithCb(refreshTime, NULL); } void *taosCachePut(SCacheObj *pCacheObj, const char *key, const void *pData, size_t dataSize, int duration) { @@ -600,16 +441,188 @@ void taosCacheEmpty(SCacheObj *pCacheObj) { __cache_unlock(pCacheObj); taosHashDestroyIter(pIter); - taosTrashEmpty(pCacheObj, false); + taosTrashCanEmpty(pCacheObj, false); } void taosCacheCleanup(SCacheObj *pCacheObj) { if (pCacheObj == NULL) { return; } - - int32_t ref = T_REF_DEC(pCacheObj); - if (ref == 0) { - doCleanupDataCache(pCacheObj); - } + + pCacheObj->deleting = 1; + pthread_join(pCacheObj->refreshWorker, NULL); + + doCleanupDataCache(pCacheObj); } + +SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *pData, size_t size, + uint64_t duration) { + size_t totalSize = size + sizeof(SCacheDataNode) + keyLen + 1; + + SCacheDataNode *pNewNode = calloc(1, totalSize); + if (pNewNode == NULL) { + uError("failed to allocate memory, reason:%s", strerror(errno)); + return NULL; + } + + memcpy(pNewNode->data, pData, size); + + pNewNode->key = (char *)pNewNode + sizeof(SCacheDataNode) + size; + pNewNode->keySize = keyLen; + + memcpy(pNewNode->key, key, keyLen); + + pNewNode->addedTime = (uint64_t)taosGetTimestampMs(); + pNewNode->expiredTime = pNewNode->addedTime + duration; + + pNewNode->signature = (uint64_t)pNewNode; + pNewNode->size = (uint32_t)totalSize; + + return pNewNode; +} + +void taosAddToTrash(SCacheObj *pCacheObj, SCacheDataNode *pNode) { + if (pNode->inTrashCan) { /* node is already in trash */ + return; + } + + STrashElem *pElem = calloc(1, sizeof(STrashElem)); + pElem->pData = pNode; + + pElem->next = pCacheObj->pTrash; + if (pCacheObj->pTrash) { + pCacheObj->pTrash->prev = pElem; + } + + pElem->prev = NULL; + pCacheObj->pTrash = pElem; + + pNode->inTrashCan = true; + pCacheObj->numOfElemsInTrash++; + + uTrace("key:%s %p move to trash, numOfElem in trash:%d", pNode->key, pNode, pCacheObj->numOfElemsInTrash); +} + +void taosRemoveFromTrashCan(SCacheObj *pCacheObj, STrashElem *pElem) { + if (pElem->pData->signature != (uint64_t)pElem->pData) { + uError("key:sig:%d %p data has been released, ignore", pElem->pData->signature, pElem->pData); + return; + } + + pCacheObj->numOfElemsInTrash--; + if (pElem->prev) { + pElem->prev->next = pElem->next; + } else { /* pnode is the header, update header */ + pCacheObj->pTrash = pElem->next; + } + + if (pElem->next) { + pElem->next->prev = pElem->prev; + } + + pElem->pData->signature = 0; + if (pCacheObj->freeFp) pCacheObj->freeFp(pElem->pData->data); + free(pElem->pData); + free(pElem); +} + +void taosTrashCanEmpty(SCacheObj *pCacheObj, bool force) { + __cache_wr_lock(pCacheObj); + + if (pCacheObj->numOfElemsInTrash == 0) { + if (pCacheObj->pTrash != NULL) { + uError("key:inconsistency data in cache, numOfElem in trash:%d", pCacheObj->numOfElemsInTrash); + } + pCacheObj->pTrash = NULL; + + __cache_unlock(pCacheObj); + return; + } + + STrashElem *pElem = pCacheObj->pTrash; + + while (pElem) { + T_REF_VAL_CHECK(pElem->pData); + if (pElem->next == pElem) { + pElem->next = NULL; + } + + if (force || (T_REF_VAL_GET(pElem->pData) == 0)) { + uTrace("key:%s %p removed from trash. numOfElem in trash:%d", pElem->pData->key, pElem->pData, + pCacheObj->numOfElemsInTrash - 1); + STrashElem *p = pElem; + + pElem = pElem->next; + taosRemoveFromTrashCan(pCacheObj, p); + } else { + pElem = pElem->next; + } + } + + assert(pCacheObj->numOfElemsInTrash >= 0); + __cache_unlock(pCacheObj); +} + +void doCleanupDataCache(SCacheObj *pCacheObj) { + __cache_wr_lock(pCacheObj); + taosHashCleanup(pCacheObj->pHashTable); + __cache_unlock(pCacheObj); + + taosTrashCanEmpty(pCacheObj, true); + __cache_lock_destroy(pCacheObj); + + memset(pCacheObj, 0, sizeof(SCacheObj)); + free(pCacheObj); +} + +void* taosCacheRefresh(void *handle) { + SCacheObj *pCacheObj = (SCacheObj *)handle; + if (pCacheObj == NULL) { + uTrace("object is destroyed. no refresh retry"); + return NULL; + } + + const int32_t SLEEP_DURATION = 500; //500 ms + int64_t totalTick = pCacheObj->refreshTime / SLEEP_DURATION; + + int64_t count = 0; + while(1) { + taosMsleep(500); + + // check if current cache object will be deleted every 500ms. + if (pCacheObj->deleting) { + break; + } + + if (++count < totalTick) { + continue; + } + + // reset the count value + count = 0; + size_t num = taosHashGetSize(pCacheObj->pHashTable); + if (num == 0) { + continue; + } + + uint64_t expiredTime = taosGetTimestampMs(); + pCacheObj->statistics.refreshCount++; + + SHashMutableIterator *pIter = taosHashCreateIter(pCacheObj->pHashTable); + + __cache_wr_lock(pCacheObj); + while (taosHashIterNext(pIter)) { + SCacheDataNode *pNode = *(SCacheDataNode **)taosHashIterGet(pIter); + if (pNode->expiredTime <= expiredTime && T_REF_VAL_GET(pNode) <= 0) { + taosCacheReleaseNode(pCacheObj, pNode); + } + } + + __cache_unlock(pCacheObj); + + taosHashDestroyIter(pIter); + taosTrashCanEmpty(pCacheObj, false); + } + + return NULL; +} \ No newline at end of file From fa827250c4254ca693058e56afddfbefa6df637f Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 9 Jun 2020 14:31:07 +0800 Subject: [PATCH 43/55] [td-225] update the unit test --- src/util/tests/cacheTest.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/src/util/tests/cacheTest.cpp b/src/util/tests/cacheTest.cpp index b636bcfac0..5762d5700b 100644 --- a/src/util/tests/cacheTest.cpp +++ b/src/util/tests/cacheTest.cpp @@ -19,8 +19,7 @@ int32_t tsMaxMeterConnections = 200; // test cache TEST(testCase, client_cache_test) { const int32_t REFRESH_TIME_IN_SEC = 2; - void* tscTmr = taosTmrInit (tsMaxMgmtConnections*2, 200, 6000, "TSC"); - SCacheObj* tscCacheHandle = taosCacheInit(tscTmr, REFRESH_TIME_IN_SEC); + SCacheObj* tscCacheHandle = taosCacheInit(REFRESH_TIME_IN_SEC); const char* key1 = "test1"; char data1[] = "test11"; @@ -106,9 +105,7 @@ TEST(testCase, client_cache_test) { TEST(testCase, cache_resize_test) { const int32_t REFRESH_TIME_IN_SEC = 2; - void* tscTmr = taosTmrInit (1000*2, 200, 6000, "TSC"); - - auto* pCache = taosCacheInit(tscTmr, REFRESH_TIME_IN_SEC); + auto* pCache = taosCacheInit(REFRESH_TIME_IN_SEC); char key[256] = {0}; char data[1024] = "abcdefghijk"; From daafb42e0887d4d655eacb4eb50a6f26cf7abbc4 Mon Sep 17 00:00:00 2001 From: Bomin Zhang Date: Thu, 4 Jun 2020 16:19:14 +0800 Subject: [PATCH 44/55] td-459: TSDB_DB_NAME_LEN --- src/client/inc/tsclient.h | 4 ++-- src/client/src/tscLocal.c | 2 +- src/client/src/tscSQLParser.c | 6 +++--- src/client/src/tscSql.c | 6 +++--- src/common/src/tglobal.c | 4 ++-- src/inc/taosdef.h | 4 ++-- src/inc/taosmsg.h | 10 +++++----- src/kit/taosdump/taosdump.c | 2 +- src/mnode/inc/mnodeDef.h | 6 +++--- src/mnode/src/mnodeDb.c | 10 +++++----- src/mnode/src/mnodeSdb.c | 2 +- src/mnode/src/mnodeTable.c | 2 +- src/query/src/qExecutor.c | 4 ++-- src/vnode/inc/vnodeInt.h | 2 +- 14 files changed, 32 insertions(+), 32 deletions(-) diff --git a/src/client/inc/tsclient.h b/src/client/inc/tsclient.h index c03e3be4ed..24e0f48ec9 100644 --- a/src/client/inc/tsclient.h +++ b/src/client/inc/tsclient.h @@ -285,8 +285,8 @@ typedef struct STscObj { void * pTimer; char user[TSDB_USER_LEN]; char pass[TSDB_KEY_LEN]; - char acctId[TSDB_DB_NAME_LEN]; - char db[TSDB_TABLE_ID_LEN]; + char acctId[TSDB_ACCT_LEN]; + char db[TSDB_DB_NAME_LEN]; char sversion[TSDB_VERSION_LEN]; char writeAuth : 1; char superAuth : 1; diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index 91e51f16ed..295b691275 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -286,7 +286,7 @@ static void tscProcessCurrentUser(SSqlObj *pSql) { } static void tscProcessCurrentDB(SSqlObj *pSql) { - char db[TSDB_DB_NAME_LEN + 1] = {0}; + char db[TSDB_DB_NAME_LEN] = {0}; extractDBName(pSql->pTscObj->db, db); SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index ba714f10e4..ef22333836 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1041,7 +1041,7 @@ int32_t setObjFullName(char* fullName, const char* account, SSQLToken* pDB, SSQL /* db name is not specified, the tableName dose not include db name */ if (pDB != NULL) { - if (pDB->n > TSDB_DB_NAME_LEN) { + if (pDB->n >= TSDB_DB_NAME_LEN) { return TSDB_CODE_TSC_INVALID_SQL; } @@ -1060,7 +1060,7 @@ int32_t setObjFullName(char* fullName, const char* account, SSQLToken* pDB, SSQL } } else { // pDB == NULL, the db prefix name is specified in tableName /* the length limitation includes tablename + dbname + sep */ - if (tableName->n > TSDB_TABLE_NAME_LEN + TSDB_DB_NAME_LEN + tListLen(TS_PATH_DELIMITER)) { + if (tableName->n > (TSDB_TABLE_NAME_LEN - 1) + (TSDB_DB_NAME_LEN - 1) + sizeof(TS_PATH_DELIMITER)) { return TSDB_CODE_TSC_INVALID_SQL; } } @@ -2202,7 +2202,7 @@ int32_t setShowInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { if (pDbPrefixToken->type != 0) { assert(pDbPrefixToken->n >= 0); - if (pDbPrefixToken->n > TSDB_DB_NAME_LEN) { // db name is too long + if (pDbPrefixToken->n >= TSDB_DB_NAME_LEN) { // db name is too long return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3); } diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index aab931cf93..723f03e964 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -92,15 +92,15 @@ SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pass, con if (db) { int32_t len = strlen(db); /* db name is too long */ - if (len > TSDB_DB_NAME_LEN) { + if (len >= TSDB_DB_NAME_LEN) { terrno = TSDB_CODE_TSC_INVALID_DB_LENGTH; rpcClose(pDnodeConn); free(pObj); return NULL; } - char tmp[TSDB_DB_NAME_LEN + 1] = {0}; - strcpy(tmp, db); + char tmp[TSDB_DB_NAME_LEN] = {0}; + tstrncpy(tmp, db, sizeof(tmp)); strdequote(tmp); strtolower(pObj->db, tmp); diff --git a/src/common/src/tglobal.c b/src/common/src/tglobal.c index e010f7fe56..12754b164b 100644 --- a/src/common/src/tglobal.c +++ b/src/common/src/tglobal.c @@ -708,7 +708,7 @@ static void doInitGlobalConfig() { cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_CLIENT; cfg.minValue = 0; cfg.maxValue = 0; - cfg.ptrLength = TSDB_DB_NAME_LEN; + cfg.ptrLength = TSDB_DB_NAME_LEN - 1; cfg.unitType = TAOS_CFG_UTYPE_NONE; taosInitConfigOption(cfg); @@ -923,7 +923,7 @@ static void doInitGlobalConfig() { cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW; cfg.minValue = 0; cfg.maxValue = 0; - cfg.ptrLength = TSDB_DB_NAME_LEN; + cfg.ptrLength = TSDB_DB_NAME_LEN - 1; cfg.unitType = TAOS_CFG_UTYPE_NONE; taosInitConfigOption(cfg); diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index c1d0e5ae47..b0e01e087e 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -189,7 +189,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size); #define TSDB_USERID_LEN 9 #define TS_PATH_DELIMITER_LEN 1 -#define TSDB_METER_ID_LEN_MARGIN 9 +#define TSDB_METER_ID_LEN_MARGIN 8 #define TSDB_TABLE_ID_LEN (TSDB_DB_NAME_LEN+TSDB_TABLE_NAME_LEN+2*TS_PATH_DELIMITER_LEN+TSDB_USERID_LEN+TSDB_METER_ID_LEN_MARGIN) //TSDB_DB_NAME_LEN+TSDB_TABLE_NAME_LEN+2*strlen(TS_PATH_DELIMITER)+strlen(USERID) #define TSDB_UNI_LEN 24 #define TSDB_USER_LEN TSDB_UNI_LEN @@ -201,7 +201,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size); #define TSDB_NODE_NAME_LEN 64 #define TSDB_TABLE_NAME_LEN 193 -#define TSDB_DB_NAME_LEN 32 +#define TSDB_DB_NAME_LEN 33 #define TSDB_COL_NAME_LEN 64 #define TSDB_MAX_SAVED_SQL_LEN TSDB_MAX_COLUMNS * 64 #define TSDB_MAX_SQL_LEN TSDB_PAYLOAD_SIZE diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index 88c6f9cf26..c85bb229b9 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -250,7 +250,7 @@ typedef struct { typedef struct { char tableId[TSDB_TABLE_ID_LEN + 1]; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; int8_t igExists; int8_t getMeta; int16_t numOfTags; @@ -268,7 +268,7 @@ typedef struct { typedef struct { char tableId[TSDB_TABLE_ID_LEN + 1]; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; int16_t type; /* operation type */ int16_t numOfCols; /* number of schema */ int32_t tagValLen; @@ -502,7 +502,7 @@ typedef struct { typedef struct { char acct[TSDB_USER_LEN + 1]; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; int32_t cacheBlockSize; //MB int32_t totalBlocks; int32_t maxTables; @@ -606,7 +606,7 @@ typedef struct { } SMDVnodeDesc; typedef struct { - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; SMDVnodeCfg cfg; SMDVnodeDesc nodes[TSDB_MAX_REPLICA]; } SMDCreateVnodeMsg; @@ -671,7 +671,7 @@ typedef struct { */ typedef struct { int8_t type; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; uint16_t payloadLen; char payload[]; } SCMShowMsg; diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c index d96f80ed20..c588dce20d 100644 --- a/src/kit/taosdump/taosdump.c +++ b/src/kit/taosdump/taosdump.c @@ -102,7 +102,7 @@ typedef struct { extern char version[]; typedef struct { - char name[TSDB_DB_NAME_LEN + 1]; + char name[TSDB_DB_NAME_LEN]; int32_t replica; int32_t days; int32_t keep; diff --git a/src/mnode/inc/mnodeDef.h b/src/mnode/inc/mnodeDef.h index cf9058b9cf..35ae9aad33 100644 --- a/src/mnode/inc/mnodeDef.h +++ b/src/mnode/inc/mnodeDef.h @@ -115,7 +115,7 @@ typedef struct { typedef struct SVgObj { uint32_t vgId; - char dbName[TSDB_DB_NAME_LEN + 1]; + char dbName[TSDB_DB_NAME_LEN]; int64_t createdTime; SVnodeGid vnodeGid[TSDB_MAX_REPLICA]; int32_t numOfVnodes; @@ -154,7 +154,7 @@ typedef struct { } SDbCfg; typedef struct SDbObj { - char name[TSDB_DB_NAME_LEN + 1]; + char name[TSDB_DB_NAME_LEN]; char acct[TSDB_USER_LEN + 1]; int64_t createdTime; int32_t cfgVersion; @@ -219,7 +219,7 @@ typedef struct SAcctObj { typedef struct { int8_t type; int32_t index; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; void * pIter; int16_t numOfColumns; int32_t rowSize; diff --git a/src/mnode/src/mnodeDb.c b/src/mnode/src/mnodeDb.c index 90569b4a95..c80dc3036f 100644 --- a/src/mnode/src/mnodeDb.c +++ b/src/mnode/src/mnodeDb.c @@ -328,8 +328,8 @@ static int32_t mnodeCreateDb(SAcctObj *pAcct, SCMCreateDbMsg *pCreate) { if (code != 0) return code; pDb = calloc(1, sizeof(SDbObj)); - strncpy(pDb->name, pCreate->db, TSDB_DB_NAME_LEN); - strncpy(pDb->acct, pAcct->user, TSDB_USER_LEN); + tstrncpy(pDb->name, pCreate->db, sizeof(pDb->name)); + tstrncpy(pDb->acct, pAcct->user, sizeof(pDb->acct)); pDb->createdTime = taosGetTimestampMs(); pDb->cfg = (SDbCfg) { .cacheBlockSize = pCreate->cacheBlockSize, @@ -373,7 +373,7 @@ static int32_t mnodeCreateDb(SAcctObj *pAcct, SCMCreateDbMsg *pCreate) { } bool mnodeCheckIsMonitorDB(char *db, char *monitordb) { - char dbName[TSDB_DB_NAME_LEN + 1] = {0}; + char dbName[TSDB_DB_NAME_LEN] = {0}; extractDBName(db, dbName); size_t len = strlen(dbName); @@ -453,7 +453,7 @@ static int32_t mnodeGetDbMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn SUserObj *pUser = mnodeGetUserFromConn(pConn); if (pUser == NULL) return 0; - pShow->bytes[cols] = TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE; + pShow->bytes[cols] = (TSDB_DB_NAME_LEN - 1) + VARSTR_HEADER_SIZE; pSchema[cols].type = TSDB_DATA_TYPE_BINARY; strcpy(pSchema[cols].name, "name"); pSchema[cols].bytes = htons(pShow->bytes[cols]); @@ -610,7 +610,7 @@ static int32_t mnodeRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; char* name = mnodeGetDbStr(pDb->name); - STR_WITH_MAXSIZE_TO_VARSTR(pWrite, name, TSDB_DB_NAME_LEN); + STR_WITH_MAXSIZE_TO_VARSTR(pWrite, name, TSDB_DB_NAME_LEN - 1); cols++; pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; diff --git a/src/mnode/src/mnodeSdb.c b/src/mnode/src/mnodeSdb.c index b9033cdf3c..8d74827841 100644 --- a/src/mnode/src/mnodeSdb.c +++ b/src/mnode/src/mnodeSdb.c @@ -43,7 +43,7 @@ typedef enum { } ESdbStatus; typedef struct _SSdbTable { - char tableName[TSDB_DB_NAME_LEN + 1]; + char tableName[TSDB_DB_NAME_LEN]; ESdbTable tableId; ESdbKey keyType; int32_t hashSessions; diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index 54a6c2c7c0..ac826c9781 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1160,7 +1160,7 @@ int32_t mnodeRetrieveShowSuperTables(SShowObj *pShow, char *data, int32_t rows, pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows; - int16_t len = strnlen(stableName, TSDB_DB_NAME_LEN); + int16_t len = strnlen(stableName, TSDB_DB_NAME_LEN - 1); *(int16_t*) pWrite = len; pWrite += sizeof(int16_t); // todo refactor diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index b080de87f2..09fed07573 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -6037,9 +6037,9 @@ static void buildTagQueryResult(SQInfo* pQInfo) { for(int32_t j = 0; j < pQuery->numOfOutput; ++j) { if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) { - data = tsdbGetTableName(pQInfo->tsdb, &item->id, &bytes); + char* data = tsdbGetTableName(pQInfo->tsdb, &item->id); - char* dst = pQuery->sdata[j]->data + i * ((TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE); + char* dst = pQuery->sdata[j]->data + count * ((TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE); memcpy(dst, data, varDataTLen(data)); } else {// todo refactor int16_t type = pExprInfo[j].type; diff --git a/src/vnode/inc/vnodeInt.h b/src/vnode/inc/vnodeInt.h index 7c95e81cf5..ab74e329e6 100644 --- a/src/vnode/inc/vnodeInt.h +++ b/src/vnode/inc/vnodeInt.h @@ -51,7 +51,7 @@ typedef struct { SSyncCfg syncCfg; SWalCfg walCfg; char *rootDir; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; } SVnodeObj; int vnodeWriteToQueue(void *param, void *pHead, int type); From 1e7fd87dcbdf7c44b5f9c517fad80c027a6cd5c0 Mon Sep 17 00:00:00 2001 From: Bomin Zhang Date: Thu, 4 Jun 2020 16:47:41 +0800 Subject: [PATCH 45/55] td-459: TSDB_COL_NAME_LEN --- src/client/src/tscLocal.c | 18 +++++----- src/client/src/tscSQLParser.c | 35 ++++++++++--------- src/client/src/tscSchemaUtil.c | 2 +- src/client/src/tscSubquery.c | 2 +- src/client/src/tscUtil.c | 6 ++-- .../python/linux/python3/taos/cinterface.py | 6 ++-- src/inc/taos.h | 4 +-- src/inc/taosdef.h | 2 +- src/inc/taosmsg.h | 2 +- src/kit/taosdump/taosdump.c | 4 +-- src/mnode/src/mnodeTable.c | 4 +-- 11 files changed, 43 insertions(+), 42 deletions(-) diff --git a/src/client/src/tscLocal.c b/src/client/src/tscLocal.c index 295b691275..52240941f2 100644 --- a/src/client/src/tscLocal.c +++ b/src/client/src/tscLocal.c @@ -132,7 +132,7 @@ static int32_t tscSetValueToResObj(SSqlObj *pSql, int32_t rowLen) { for (int32_t i = 0; i < numOfRows; ++i) { TAOS_FIELD *pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, 0); char* dst = pRes->data + tscFieldInfoGetOffset(pQueryInfo, 0) * totalNumOfRows + pField->bytes * i; - STR_WITH_MAXSIZE_TO_VARSTR(dst, pSchema[i].name, TSDB_COL_NAME_LEN); + STR_WITH_MAXSIZE_TO_VARSTR(dst, pSchema[i].name, TSDB_COL_NAME_LEN - 1); char *type = tDataTypeDesc[pSchema[i].type].aName; @@ -171,7 +171,7 @@ static int32_t tscSetValueToResObj(SSqlObj *pSql, int32_t rowLen) { // field name TAOS_FIELD *pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, 0); char* output = pRes->data + tscFieldInfoGetOffset(pQueryInfo, 0) * totalNumOfRows + pField->bytes * i; - STR_WITH_MAXSIZE_TO_VARSTR(output, pSchema[i].name, TSDB_COL_NAME_LEN); + STR_WITH_MAXSIZE_TO_VARSTR(output, pSchema[i].name, TSDB_COL_NAME_LEN - 1); // type name pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, 1); @@ -211,18 +211,18 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols, SQueryInfo* pQueryInfo = tscGetQueryInfoDetail(&pSql->cmd, 0); pQueryInfo->order.order = TSDB_ORDER_ASC; - TAOS_FIELD f = {.type = TSDB_DATA_TYPE_BINARY, .bytes = TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE}; - strncpy(f.name, "Field", TSDB_COL_NAME_LEN); + TAOS_FIELD f = {.type = TSDB_DATA_TYPE_BINARY, .bytes = (TSDB_COL_NAME_LEN - 1) + VARSTR_HEADER_SIZE}; + tstrncpy(f.name, "Field", sizeof(f.name)); SFieldSupInfo* pInfo = tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); pInfo->pSqlExpr = tscSqlExprAppend(pQueryInfo, TSDB_FUNC_TS_DUMMY, &index, TSDB_DATA_TYPE_BINARY, - TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE, TSDB_COL_NAME_LEN, false); + (TSDB_COL_NAME_LEN - 1) + VARSTR_HEADER_SIZE, (TSDB_COL_NAME_LEN - 1), false); - rowLen += (TSDB_COL_NAME_LEN + VARSTR_HEADER_SIZE); + rowLen += ((TSDB_COL_NAME_LEN - 1) + VARSTR_HEADER_SIZE); f.bytes = typeColLength; f.type = TSDB_DATA_TYPE_BINARY; - strncpy(f.name, "Type", TSDB_COL_NAME_LEN); + tstrncpy(f.name, "Type", sizeof(f.name)); pInfo = tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); pInfo->pSqlExpr = tscSqlExprAppend(pQueryInfo, TSDB_FUNC_TS_DUMMY, &index, TSDB_DATA_TYPE_BINARY, typeColLength, @@ -232,7 +232,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols, f.bytes = sizeof(int32_t); f.type = TSDB_DATA_TYPE_INT; - strncpy(f.name, "Length", TSDB_COL_NAME_LEN); + tstrncpy(f.name, "Length", sizeof(f.name)); pInfo = tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); pInfo->pSqlExpr = tscSqlExprAppend(pQueryInfo, TSDB_FUNC_TS_DUMMY, &index, TSDB_DATA_TYPE_INT, sizeof(int32_t), @@ -242,7 +242,7 @@ static int32_t tscBuildTableSchemaResultFields(SSqlObj *pSql, int32_t numOfCols, f.bytes = noteColLength; f.type = TSDB_DATA_TYPE_BINARY; - strncpy(f.name, "Note", TSDB_COL_NAME_LEN); + tstrncpy(f.name, "Note", sizeof(f.name)); pInfo = tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); pInfo->pSqlExpr = tscSqlExprAppend(pQueryInfo, TSDB_FUNC_TS_DUMMY, &index, TSDB_DATA_TYPE_BINARY, noteColLength, diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index ef22333836..5167add6cb 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -933,7 +933,7 @@ bool validateOneTags(SSqlCmd* pCmd, TAOS_FIELD* pTagField) { SSchema* pSchema = tscGetTableSchema(pTableMeta); for (int32_t i = 0; i < numOfTags + numOfCols; ++i) { - if (strncasecmp(pTagField->name, pSchema[i].name, TSDB_COL_NAME_LEN) == 0) { + if (strncasecmp(pTagField->name, pSchema[i].name, sizeof(pTagField->name) - 1) == 0) { invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2); return false; } @@ -993,7 +993,7 @@ bool validateOneColumn(SSqlCmd* pCmd, TAOS_FIELD* pColField) { // field name must be unique for (int32_t i = 0; i < numOfTags + numOfCols; ++i) { - if (strncasecmp(pColField->name, pSchema[i].name, TSDB_COL_NAME_LEN) == 0) { + if (strncasecmp(pColField->name, pSchema[i].name, sizeof(pColField->name) - 1) == 0) { invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2); return false; } @@ -1005,7 +1005,8 @@ bool validateOneColumn(SSqlCmd* pCmd, TAOS_FIELD* pColField) { /* is contained in pFieldList or not */ static bool has(tFieldList* pFieldList, int32_t startIdx, const char* name) { for (int32_t j = startIdx; j < pFieldList->nField; ++j) { - if (strncasecmp(name, pFieldList->p[j].name, TSDB_COL_NAME_LEN) == 0) return true; + TAOS_FIELD* field = pFieldList->p + j; + if (strncasecmp(name, field->name, sizeof(field->name) - 1) == 0) return true; } return false; @@ -1166,7 +1167,7 @@ int32_t parseSelectClause(SSqlCmd* pCmd, int32_t clauseIndex, tSQLExprList* pSel /* todo alias name should use the original sql string */ char* name = (pItem->aliasName != NULL)? pItem->aliasName:arithmeticExprStr; - strncpy(pExpr->aliasName, name, TSDB_COL_NAME_LEN); + tstrncpy(pExpr->aliasName, name, sizeof(pExpr->aliasName)); tExprNode* pNode = NULL; SArray* colList = taosArrayInit(10, sizeof(SColIndex)); @@ -1448,7 +1449,7 @@ static int32_t setExprInfoForFunctions(SQueryInfo* pQueryInfo, SSchema* pSchema, if (aliasName != NULL) { strcpy(columnName, aliasName); } else { - getRevisedName(columnName, functionID, TSDB_COL_NAME_LEN, pSchema[pColIndex->columnIndex].name); + getRevisedName(columnName, functionID, sizeof(columnName) - 1, pSchema[pColIndex->columnIndex].name); } SSqlExpr* pExpr = tscSqlExprAppend(pQueryInfo, functionID, pColIndex, type, bytes, bytes, false); @@ -1536,7 +1537,7 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIndex, tSQLExpr } memset(pExpr->aliasName, 0, tListLen(pExpr->aliasName)); - getColumnName(pItem, pExpr->aliasName, TSDB_COL_NAME_LEN); + getColumnName(pItem, pExpr->aliasName, sizeof(pExpr->aliasName) - 1); SColumnList ids = getColumnList(1, index.tableIndex, index.columnIndex); if (finalResult) { @@ -1651,7 +1652,7 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIndex, tSQLExpr ids.ids[0] = index; memset(pExpr->aliasName, 0, tListLen(pExpr->aliasName)); - getColumnName(pItem, pExpr->aliasName, TSDB_COL_NAME_LEN); + getColumnName(pItem, pExpr->aliasName, sizeof(pExpr->aliasName) - 1); if (finalResult) { int32_t numOfOutput = tscNumOfFields(pQueryInfo); @@ -1851,7 +1852,7 @@ int32_t addExprAndResultField(SQueryInfo* pQueryInfo, int32_t colIndex, tSQLExpr } memset(pExpr->aliasName, 0, tListLen(pExpr->aliasName)); - getColumnName(pItem, pExpr->aliasName, TSDB_COL_NAME_LEN); + getColumnName(pItem, pExpr->aliasName, sizeof(pExpr->aliasName) - 1); SColumnList ids = getColumnList(1, 0, index.columnIndex); if (finalResult) { @@ -3997,7 +3998,7 @@ int32_t tsRewriteFieldNameIfNecessary(SQueryInfo* pQueryInfo) { for (int32_t i = 0; i < pQueryInfo->fieldsInfo.numOfOutput; ++i) { char* fieldName = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i)->name; - for (int32_t j = 0; j < TSDB_COL_NAME_LEN && fieldName[j] != 0; ++j) { + for (int32_t j = 0; j < (TSDB_COL_NAME_LEN - 1) && fieldName[j] != 0; ++j) { for (int32_t k = 0; k < tListLen(rep); ++k) { if (fieldName[j] == rep[k]) { fieldName[j] = '_'; @@ -4013,7 +4014,7 @@ int32_t tsRewriteFieldNameIfNecessary(SQueryInfo* pQueryInfo) { for (int32_t i = 0; i < pQueryInfo->fieldsInfo.numOfOutput; ++i) { char* fieldName = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i)->name; for (int32_t j = i + 1; j < pQueryInfo->fieldsInfo.numOfOutput; ++j) { - if (strncasecmp(fieldName, tscFieldInfoGetField(&pQueryInfo->fieldsInfo, j)->name, TSDB_COL_NAME_LEN) == 0) { + if (strncasecmp(fieldName, tscFieldInfoGetField(&pQueryInfo->fieldsInfo, j)->name, (TSDB_COL_NAME_LEN - 1)) == 0) { const char* msg = "duplicated column name in new table"; return invalidSqlErrMsg(pQueryInfo->msg, msg); } @@ -4368,7 +4369,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { } tVariantListItem* pItem = &pAlterSQL->varList->a[0]; - if (pItem->pVar.nLen > TSDB_COL_NAME_LEN) { + if (pItem->pVar.nLen >= TSDB_COL_NAME_LEN) { return invalidSqlErrMsg(pQueryInfo->msg, msg9); } @@ -4420,7 +4421,7 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { return TSDB_CODE_TSC_INVALID_SQL; } - char name[TSDB_COL_NAME_LEN + 1] = {0}; + char name[TSDB_COL_NAME_LEN] = {0}; strncpy(name, pVarList->a[0].pVar.pz, pVarList->a[0].pVar.nLen); TAOS_FIELD f = tscCreateField(TSDB_DATA_TYPE_INT, name, tDataTypeDesc[TSDB_DATA_TYPE_INT].nSize); tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); @@ -4522,8 +4523,8 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) { return invalidSqlErrMsg(pQueryInfo->msg, msg18); } - char name1[TSDB_COL_NAME_LEN + 1] = {0}; - strncpy(name1, pItem->pVar.pz, pItem->pVar.nLen); + char name1[TSDB_COL_NAME_LEN] = {0}; + tstrncpy(name1, pItem->pVar.pz, sizeof(name1)); TAOS_FIELD f = tscCreateField(TSDB_DATA_TYPE_INT, name1, tDataTypeDesc[TSDB_DATA_TYPE_INT].nSize); tscFieldInfoAppend(&pQueryInfo->fieldsInfo, &f); } @@ -5254,8 +5255,8 @@ static int32_t doAddGroupbyColumnsOnDemand(SQueryInfo* pQueryInfo) { SColumnIndex index = {.tableIndex = pQueryInfo->groupbyExpr.tableIndex, .columnIndex = colIndex}; SSqlExpr* pExpr = tscSqlExprAppend(pQueryInfo, TSDB_FUNC_TAG, &index, type, bytes, bytes, true); - memset(pExpr->aliasName, 0, tListLen(pExpr->aliasName)); - strncpy(pExpr->aliasName, name, TSDB_COL_NAME_LEN); + memset(pExpr->aliasName, 0, sizeof(pExpr->aliasName)); + tstrncpy(pExpr->aliasName, name, sizeof(pExpr->aliasName)); pExpr->colInfo.flag = TSDB_COL_TAG; @@ -6019,7 +6020,7 @@ int32_t exprTreeFromSqlExpr(tExprNode **pExpr, const tSQLExpr* pSqlExpr, SArray* if (pCols != NULL) { // record the involved columns SColIndex colIndex = {0}; - strncpy(colIndex.name, pSchema->name, TSDB_COL_NAME_LEN); + tstrncpy(colIndex.name, pSchema->name, sizeof(colIndex.name)); colIndex.colId = pSchema->colId; colIndex.colIndex = index.columnIndex; diff --git a/src/client/src/tscSchemaUtil.c b/src/client/src/tscSchemaUtil.c index 59415f842e..88417addf6 100644 --- a/src/client/src/tscSchemaUtil.c +++ b/src/client/src/tscSchemaUtil.c @@ -115,7 +115,7 @@ bool isValidSchema(struct SSchema* pSchema, int32_t numOfCols) { // 3. valid column names for (int32_t j = i + 1; j < numOfCols; ++j) { - if (strncasecmp(pSchema[i].name, pSchema[j].name, TSDB_COL_NAME_LEN) == 0) { + if (strncasecmp(pSchema[i].name, pSchema[j].name, sizeof(pSchema[i].name) - 1) == 0) { return false; } } diff --git a/src/client/src/tscSubquery.c b/src/client/src/tscSubquery.c index 84daf63b42..ddc41e52e5 100644 --- a/src/client/src/tscSubquery.c +++ b/src/client/src/tscSubquery.c @@ -1921,7 +1921,7 @@ static char *getArithemicInputSrc(void *param, const char *name, int32_t colId) for (int32_t i = 0; i < pSupport->numOfCols; ++i) { pExpr = taosArrayGetP(pSupport->exprList, i); - if (strncmp(name, pExpr->aliasName, TSDB_COL_NAME_LEN) == 0) { + if (strncmp(name, pExpr->aliasName, sizeof(pExpr->aliasName) - 1) == 0) { index = i; break; } diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index caf424080d..a810e5d4be 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -801,7 +801,7 @@ int tscAllocPayload(SSqlCmd* pCmd, int size) { TAOS_FIELD tscCreateField(int8_t type, const char* name, int16_t bytes) { TAOS_FIELD f = { .type = type, .bytes = bytes, }; - strncpy(f.name, name, TSDB_COL_NAME_LEN); + tstrncpy(f.name, name, sizeof(f.name)); return f; } @@ -966,12 +966,12 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol if (isTagCol) { SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta); pExpr->colInfo.colId = pSchema[pColIndex->columnIndex].colId; - strncpy(pExpr->colInfo.name, pSchema[pColIndex->columnIndex].name, TSDB_COL_NAME_LEN); + tstrncpy(pExpr->colInfo.name, pSchema[pColIndex->columnIndex].name, sizeof(pExpr->colInfo.name)); } else if (pTableMetaInfo->pTableMeta != NULL) { // in handling select database/version/server_status(), the pTableMeta is NULL SSchema* pSchema = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, pColIndex->columnIndex); pExpr->colInfo.colId = pSchema->colId; - strncpy(pExpr->colInfo.name, pSchema->name, TSDB_COL_NAME_LEN); + tstrncpy(pExpr->colInfo.name, pSchema->name, sizeof(pExpr->colInfo.name)); } } diff --git a/src/connector/python/linux/python3/taos/cinterface.py b/src/connector/python/linux/python3/taos/cinterface.py index c3c8a4603a..568e73e355 100644 --- a/src/connector/python/linux/python3/taos/cinterface.py +++ b/src/connector/python/linux/python3/taos/cinterface.py @@ -130,9 +130,9 @@ _CONVERT_FUNC = { # Corresponding TAOS_FIELD structure in C class TaosField(ctypes.Structure): - _fields_ = [('name', ctypes.c_char * 64), - ('bytes', ctypes.c_short), - ('type', ctypes.c_char)] + _fields_ = [('name', ctypes.c_char * 65), + ('type', ctypes.c_char), + ('bytes', ctypes.c_short)] # C interface class class CTaosInterface(object): diff --git a/src/inc/taos.h b/src/inc/taos.h index 947cbe6759..bf6942be8b 100644 --- a/src/inc/taos.h +++ b/src/inc/taos.h @@ -53,9 +53,9 @@ typedef enum { } TSDB_OPTION; typedef struct taosField { - char name[64]; - short bytes; + char name[65]; uint8_t type; + short bytes; } TAOS_FIELD; #ifdef _TD_GO_DLL_ diff --git a/src/inc/taosdef.h b/src/inc/taosdef.h index b0e01e087e..1e0ddf0f9f 100644 --- a/src/inc/taosdef.h +++ b/src/inc/taosdef.h @@ -202,7 +202,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size); #define TSDB_NODE_NAME_LEN 64 #define TSDB_TABLE_NAME_LEN 193 #define TSDB_DB_NAME_LEN 33 -#define TSDB_COL_NAME_LEN 64 +#define TSDB_COL_NAME_LEN 65 #define TSDB_MAX_SAVED_SQL_LEN TSDB_MAX_COLUMNS * 64 #define TSDB_MAX_SQL_LEN TSDB_PAYLOAD_SIZE #define TSDB_MAX_SQL_SHOW_LEN 256 diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index c85bb229b9..dca8287394 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -224,7 +224,7 @@ typedef struct { typedef struct SSchema { uint8_t type; - char name[TSDB_COL_NAME_LEN + 1]; + char name[TSDB_COL_NAME_LEN]; int16_t colId; int16_t bytes; } SSchema; diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c index c588dce20d..417de629aa 100644 --- a/src/kit/taosdump/taosdump.c +++ b/src/kit/taosdump/taosdump.c @@ -88,14 +88,14 @@ enum _describe_table_index { }; typedef struct { - char field[TSDB_COL_NAME_LEN + 1]; + char field[TSDB_COL_NAME_LEN]; char type[16]; int length; char note[128]; } SColDes; typedef struct { - char name[TSDB_COL_NAME_LEN + 1]; + char name[TSDB_COL_NAME_LEN]; SColDes cols[]; } STableDef; diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index ac826c9781..cde94c39b5 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -951,7 +951,7 @@ static int32_t mnodeModifySuperTableTagName(SSuperTableObj *pStable, char *oldTa // update SSchema *schema = (SSchema *) (pStable->schema + pStable->numOfColumns + col); - strncpy(schema->name, newTagName, TSDB_COL_NAME_LEN); + tstrncpy(schema->name, newTagName, sizeof(schema->name)); SSdbOper oper = { .type = SDB_OPER_GLOBAL, @@ -1228,7 +1228,7 @@ static int32_t mnodeSetSchemaFromSuperTable(SSchema *pSchema, SSuperTableObj *pT assert(numOfCols <= TSDB_MAX_COLUMNS); for (int32_t i = 0; i < numOfCols; ++i) { - strncpy(pSchema->name, pTable->schema[i].name, TSDB_COL_NAME_LEN); + tstrncpy(pSchema->name, pTable->schema[i].name, sizeof(pSchema->name)); pSchema->type = pTable->schema[i].type; pSchema->bytes = htons(pTable->schema[i].bytes); pSchema->colId = htons(pTable->schema[i].colId); From 88f0d2c83680ddfa765ab5a6f1bf9a8fb1e537a3 Mon Sep 17 00:00:00 2001 From: Bomin Zhang Date: Tue, 9 Jun 2020 10:05:41 +0800 Subject: [PATCH 46/55] TD-459: fix some strncpy --- src/client/src/tscParseInsert.c | 8 ++++---- src/client/src/tscProfile.c | 6 ++---- src/client/src/tscSQLParser.c | 6 +++--- src/client/src/tscServer.c | 8 ++++---- src/client/src/tscSql.c | 2 +- src/client/src/tscSystem.c | 10 +++++----- src/os/darwin/src/darwinPlatform.c | 2 +- src/os/linux/src/linuxSysPara.c | 4 ++-- src/os/windows/src/twindows.c | 2 +- src/query/src/qExecutor.c | 1 - src/query/src/qtsbuf.c | 2 +- src/rpc/src/rpcMain.c | 2 +- src/util/src/tsched.c | 4 ++-- src/util/src/ttimer.c | 3 +-- tests/tsim/src/simParse.c | 2 +- 15 files changed, 29 insertions(+), 33 deletions(-) diff --git a/src/client/src/tscParseInsert.c b/src/client/src/tscParseInsert.c index cbc83c6e75..c4749e4611 100644 --- a/src/client/src/tscParseInsert.c +++ b/src/client/src/tscParseInsert.c @@ -795,7 +795,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql) { STableMetaInfo *pSTableMeterMetaInfo = tscGetMetaInfo(pQueryInfo, STABLE_INDEX); tscSetTableFullName(pSTableMeterMetaInfo, &sToken, pSql); - strncpy(pTag->name, pSTableMeterMetaInfo->name, TSDB_TABLE_ID_LEN); + tstrncpy(pTag->name, pSTableMeterMetaInfo->name, sizeof(pTag->name)); code = tscGetTableMeta(pSql, pSTableMeterMetaInfo); if (code != TSDB_CODE_SUCCESS) { return code; @@ -989,7 +989,7 @@ static int32_t tscCheckIfCreateTable(char **sqlstr, SSqlObj *pSql) { int validateTableName(char *tblName, int len) { char buf[TSDB_TABLE_ID_LEN] = {0}; - strncpy(buf, tblName, len); + tstrncpy(buf, tblName, sizeof(buf)); SSQLToken token = {.n = len, .type = TK_ID, .z = buf}; tSQLGetToken(buf, &token.type); @@ -1512,7 +1512,7 @@ void tscProcessMultiVnodesInsertFromFile(SSqlObj *pSql) { } pCmd->count = 1; - strncpy(path, pDataBlock->filename, PATH_MAX); + tstrncpy(path, pDataBlock->filename, sizeof(path)); FILE *fp = fopen(path, "r"); if (fp == NULL) { @@ -1520,7 +1520,7 @@ void tscProcessMultiVnodesInsertFromFile(SSqlObj *pSql) { continue; } - strncpy(pTableMetaInfo->name, pDataBlock->tableId, TSDB_TABLE_ID_LEN); + tstrncpy(pTableMetaInfo->name, pDataBlock->tableId, sizeof(pTableMetaInfo->name)); memset(pDataBlock->pData, 0, pDataBlock->nAllocSize); int32_t ret = tscGetTableMeta(pSql, pTableMetaInfo); diff --git a/src/client/src/tscProfile.c b/src/client/src/tscProfile.c index 79d00bf5dc..55243c4382 100644 --- a/src/client/src/tscProfile.c +++ b/src/client/src/tscProfile.c @@ -239,8 +239,7 @@ int tscBuildQueryStreamDesc(void *pMsg, STscObj *pObj) { continue; } - strncpy(pQdesc->sql, pSql->sqlstr, TSDB_SHOW_SQL_LEN - 1); - pQdesc->sql[TSDB_SHOW_SQL_LEN - 1] = 0; + tstrncpy(pQdesc->sql, pSql->sqlstr, sizeof(pQdesc->sql)); pQdesc->stime = htobe64(pSql->stime); pQdesc->queryId = htonl(pSql->queryId); pQdesc->useconds = htobe64(pSql->res.useconds); @@ -256,8 +255,7 @@ int tscBuildQueryStreamDesc(void *pMsg, STscObj *pObj) { SSqlStream *pStream = pObj->streamList; while (pStream) { - strncpy(pSdesc->sql, pStream->pSql->sqlstr, TSDB_SHOW_SQL_LEN - 1); - pSdesc->sql[TSDB_SHOW_SQL_LEN - 1] = 0; + tstrncpy(pSdesc->sql, pStream->pSql->sqlstr, sizeof(pSdesc->sql)); pSdesc->streamId = htonl(pStream->streamId); pSdesc->num = htobe64(pStream->num); diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index 5167add6cb..ab2d7d7830 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -1309,7 +1309,7 @@ static void addProjectQueryCol(SQueryInfo* pQueryInfo, int32_t startPos, SColumn SSchema* pSchema = tscGetTableColumnSchema(pTableMeta, pIndex->columnIndex); char* colName = (pItem->aliasName == NULL) ? pSchema->name : pItem->aliasName; - strncpy(pExpr->aliasName, colName, tListLen(pExpr->aliasName)); + tstrncpy(pExpr->aliasName, colName, sizeof(pExpr->aliasName)); SColumnList ids = {0}; ids.num = 1; @@ -1359,7 +1359,7 @@ static int32_t doAddProjectionExprAndResultFields(SQueryInfo* pQueryInfo, SColum for (int32_t j = 0; j < numOfTotalColumns; ++j) { SSqlExpr* pExpr = doAddProjectCol(pQueryInfo, startPos + j, j, pIndex->tableIndex); - strncpy(pExpr->aliasName, pSchema[j].name, tListLen(pExpr->aliasName)); + tstrncpy(pExpr->aliasName, pSchema[j].name, sizeof(pExpr->aliasName)); pIndex->columnIndex = j; SColumnList ids = {0}; @@ -1453,7 +1453,7 @@ static int32_t setExprInfoForFunctions(SQueryInfo* pQueryInfo, SSchema* pSchema, } SSqlExpr* pExpr = tscSqlExprAppend(pQueryInfo, functionID, pColIndex, type, bytes, bytes, false); - strncpy(pExpr->aliasName, columnName, tListLen(pExpr->aliasName)); + tstrncpy(pExpr->aliasName, columnName, sizeof(pExpr->aliasName)); // for all queries, the timestamp column needs to be loaded SColumnIndex index = {.tableIndex = pColIndex->tableIndex, .columnIndex = PRIMARYKEY_TIMESTAMP_COL_INDEX}; diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index e0febc0e95..8815e463ad 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -866,7 +866,7 @@ int32_t tscBuildCreateDbMsg(SSqlObj *pSql, SSqlInfo *pInfo) { assert(pCmd->numOfClause == 1); STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); - strncpy(pCreateDbMsg->db, pTableMetaInfo->name, tListLen(pCreateDbMsg->db)); + tstrncpy(pCreateDbMsg->db, pTableMetaInfo->name, sizeof(pCreateDbMsg->db)); return TSDB_CODE_SUCCESS; } @@ -2153,8 +2153,8 @@ int tscProcessConnectRsp(SSqlObj *pSql) { strcpy(pObj->acctId, pConnect->acctId); // copy acctId from response int32_t len = sprintf(temp, "%s%s%s", pObj->acctId, TS_PATH_DELIMITER, pObj->db); - assert(len <= tListLen(pObj->db)); - strncpy(pObj->db, temp, tListLen(pObj->db)); + assert(len <= sizeof(pObj->db)); + tstrncpy(pObj->db, temp, sizeof(pObj->db)); if (pConnect->ipList.numOfIps > 0) tscSetMgmtIpList(&pConnect->ipList); @@ -2338,7 +2338,7 @@ static int32_t getTableMetaFromMgmt(SSqlObj *pSql, STableMetaInfo *pTableMetaInf STableMetaInfo *pNewMeterMetaInfo = tscAddEmptyMetaInfo(pNewQueryInfo); assert(pNew->cmd.numOfClause == 1 && pNewQueryInfo->numOfTables == 1); - strncpy(pNewMeterMetaInfo->name, pTableMetaInfo->name, tListLen(pNewMeterMetaInfo->name)); + tstrncpy(pNewMeterMetaInfo->name, pTableMetaInfo->name, sizeof(pNewMeterMetaInfo->name)); memcpy(pNew->cmd.payload, pSql->cmd.payload, pSql->cmd.payloadLen); // tag information if table does not exists. pNew->cmd.payloadLen = pSql->cmd.payloadLen; tscTrace("%p new pSqlObj:%p to get tableMeta, auto create:%d", pSql, pNew, pNew->cmd.autoCreated); diff --git a/src/client/src/tscSql.c b/src/client/src/tscSql.c index 723f03e964..5f2a8598db 100644 --- a/src/client/src/tscSql.c +++ b/src/client/src/tscSql.c @@ -86,7 +86,7 @@ SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pass, con pObj->signature = pObj; - strncpy(pObj->user, user, TSDB_USER_LEN); + tstrncpy(pObj->user, user, sizeof(pObj->user)); taosEncryptPass((uint8_t *)pass, strlen(pass), pObj->pass); if (db) { diff --git a/src/client/src/tscSystem.c b/src/client/src/tscSystem.c index fd7d31aa9f..66fbf9fc97 100644 --- a/src/client/src/tscSystem.c +++ b/src/client/src/tscSystem.c @@ -180,7 +180,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) { assert(cfg != NULL); if (cfg->cfgStatus <= TAOS_CFG_CSTATUS_OPTION) { - strncpy(configDir, pStr, TSDB_FILENAME_LEN); + tstrncpy(configDir, pStr, TSDB_FILENAME_LEN); cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION; tscPrint("set config file directory:%s", pStr); } else { @@ -234,7 +234,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) { tscPrint("failed to set locale:%s, current locale:%s", pStr, tsLocale); } - strncpy(tsLocale, locale, tListLen(tsLocale)); + tstrncpy(tsLocale, locale, sizeof(tsLocale)); char *charset = strrchr(tsLocale, sep); if (charset != NULL) { @@ -249,7 +249,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) { tscPrint("charset changed from %s to %s", tsCharset, charset); } - strncpy(tsCharset, charset, tListLen(tsCharset)); + tstrncpy(tsCharset, charset, sizeof(tsCharset)); cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION; } else { @@ -286,7 +286,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) { tscPrint("charset changed from %s to %s", tsCharset, pStr); } - strncpy(tsCharset, pStr, tListLen(tsCharset)); + tstrncpy(tsCharset, pStr, sizeof(tsCharset)); cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION; } else { tscPrint("charset:%s not valid", pStr); @@ -324,7 +324,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) { // return -1; // } - strncpy(tsSocketType, pStr, tListLen(tsSocketType)); + tstrncpy(tsSocketType, pStr, sizeof(tsSocketType)); cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION; tscPrint("socket type is set:%s", tsSocketType); } diff --git a/src/os/darwin/src/darwinPlatform.c b/src/os/darwin/src/darwinPlatform.c index 05290c43f4..cae65a2927 100644 --- a/src/os/darwin/src/darwinPlatform.c +++ b/src/os/darwin/src/darwinPlatform.c @@ -189,7 +189,7 @@ void taosGetSystemLocale() { if (cfg_locale && cfg_locale->cfgStatus < TAOS_CFG_CSTATUS_DEFAULT) { char *locale = setlocale(LC_CTYPE, "chs"); if (locale != NULL) { - strncpy(tsLocale, locale, sizeof(tsLocale) / sizeof(tsLocale[0])); + tstrncpy(tsLocale, locale, sizeof(tsLocale)); cfg_locale->cfgStatus = TAOS_CFG_CSTATUS_DEFAULT; uPrint("locale not configured, set to default:%s", tsLocale); } diff --git a/src/os/linux/src/linuxSysPara.c b/src/os/linux/src/linuxSysPara.c index b270eb14cf..3ec7de3b63 100644 --- a/src/os/linux/src/linuxSysPara.c +++ b/src/os/linux/src/linuxSysPara.c @@ -229,7 +229,7 @@ static void taosGetSystemLocale() { // get and set default locale uError("can't get locale from system, set it to en_US.UTF-8"); strcpy(tsLocale, "en_US.UTF-8"); } else { - tstrncpy(tsLocale, locale, tListLen(tsLocale)); + tstrncpy(tsLocale, locale, sizeof(tsLocale)); uError("locale not configured, set to system default:%s", tsLocale); } } @@ -242,7 +242,7 @@ static void taosGetSystemLocale() { // get and set default locale str++; char *revisedCharset = taosCharsetReplace(str); - strncpy(tsCharset, revisedCharset, tListLen(tsCharset)); + tstrncpy(tsCharset, revisedCharset, sizeof(tsCharset)); free(revisedCharset); uWarn("charset not configured, set to system default:%s", tsCharset); diff --git a/src/os/windows/src/twindows.c b/src/os/windows/src/twindows.c index 76b354f784..82bcc69b11 100644 --- a/src/os/windows/src/twindows.c +++ b/src/os/windows/src/twindows.c @@ -226,7 +226,7 @@ void taosGetSystemLocale() { if (cfg_locale && cfg_locale->cfgStatus < TAOS_CFG_CSTATUS_DEFAULT) { char *locale = setlocale(LC_CTYPE, "chs"); if (locale != NULL) { - strncpy(tsLocale, locale, sizeof(tsLocale) / sizeof(tsLocale[0])); + tstrncpy(tsLocale, locale, sizeof(tsLocale)); cfg_locale->cfgStatus = TAOS_CFG_CSTATUS_DEFAULT; uPrint("locale not configured, set to default:%s", tsLocale); } diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 09fed07573..92c23f6b83 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -6038,7 +6038,6 @@ static void buildTagQueryResult(SQInfo* pQInfo) { for(int32_t j = 0; j < pQuery->numOfOutput; ++j) { if (pExprInfo[j].base.colInfo.colId == TSDB_TBNAME_COLUMN_INDEX) { char* data = tsdbGetTableName(pQInfo->tsdb, &item->id); - char* dst = pQuery->sdata[j]->data + count * ((TSDB_TABLE_NAME_LEN - 1) + VARSTR_HEADER_SIZE); memcpy(dst, data, varDataTLen(data)); } else {// todo refactor diff --git a/src/query/src/qtsbuf.c b/src/query/src/qtsbuf.c index 555ccb7318..869299f309 100644 --- a/src/query/src/qtsbuf.c +++ b/src/query/src/qtsbuf.c @@ -51,7 +51,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) { return NULL; } - strncpy(pTSBuf->path, path, PATH_MAX); + tstrncpy(pTSBuf->path, path, sizeof(pTSBuf->path)); pTSBuf->f = fopen(pTSBuf->path, "r+"); if (pTSBuf->f == NULL) { diff --git a/src/rpc/src/rpcMain.c b/src/rpc/src/rpcMain.c index b0a5a0bfc0..6044061127 100644 --- a/src/rpc/src/rpcMain.c +++ b/src/rpc/src/rpcMain.c @@ -458,7 +458,7 @@ int rpcGetConnInfo(void *thandle, SRpcConnInfo *pInfo) { pInfo->clientPort = pConn->peerPort; // pInfo->serverIp = pConn->destIp; - strncpy(pInfo->user, pConn->user, sizeof(pInfo->user)); + tstrncpy(pInfo->user, pConn->user, sizeof(pInfo->user)); return 0; } diff --git a/src/util/src/tsched.c b/src/util/src/tsched.c index 898ab70876..6fc767fd3b 100644 --- a/src/util/src/tsched.c +++ b/src/util/src/tsched.c @@ -15,6 +15,7 @@ #include "os.h" #include "taosdef.h" +#include "tutil.h" #include "tulog.h" #include "tsched.h" #include "ttimer.h" @@ -62,8 +63,7 @@ void *taosInitScheduler(int queueSize, int numOfThreads, const char *label) { } pSched->queueSize = queueSize; - strncpy(pSched->label, label, sizeof(pSched->label)); // fix buffer overflow - pSched->label[sizeof(pSched->label)-1] = '\0'; + tstrncpy(pSched->label, label, sizeof(pSched->label)); // fix buffer overflow pSched->fullSlot = 0; pSched->emptySlot = 0; diff --git a/src/util/src/ttimer.c b/src/util/src/ttimer.c index 68db574d82..cdb2c6c0be 100644 --- a/src/util/src/ttimer.c +++ b/src/util/src/ttimer.c @@ -552,8 +552,7 @@ void* taosTmrInit(int maxNumOfTmrs, int resolution, int longest, const char* lab return NULL; } - strncpy(ctrl->label, label, sizeof(ctrl->label)); - ctrl->label[sizeof(ctrl->label) - 1] = 0; + tstrncpy(ctrl->label, label, sizeof(ctrl->label)); tmrTrace("%s timer controller is initialized, number of timer controllers: %d.", label, numOfTmrCtrl); return ctrl; } diff --git a/tests/tsim/src/simParse.c b/tests/tsim/src/simParse.c index fddda679c6..9fea1f115b 100644 --- a/tests/tsim/src/simParse.c +++ b/tests/tsim/src/simParse.c @@ -165,7 +165,7 @@ SScript *simBuildScriptObj(char *fileName) { script->type = SIM_SCRIPT_TYPE_MAIN; script->numOfLines = numOfLines; - strncpy(script->fileName, fileName, MAX_FILE_NAME_LEN); + tstrncpy(script->fileName, fileName, sizeof(script->fileName)); script->optionBuffer = malloc(optionOffset); memcpy(script->optionBuffer, optionBuffer, optionOffset); From c7813ea59bb94c23aff67a6eef65e660fbcc5b21 Mon Sep 17 00:00:00 2001 From: Ping Xiao Date: Tue, 9 Jun 2020 15:54:07 +0800 Subject: [PATCH 47/55] =?UTF-8?q?TD-556:=20Stream=E6=B5=8B=E8=AF=95?= =?UTF-8?q?=E5=90=88=E5=B9=B6=E5=88=B0=E5=B8=B8=E8=A7=84=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/pytest/fulltest.sh | 4 ++++ tests/pytest/regressiontest.sh | 11 ++++++++--- tests/script/fullGeneralSuite.sim | 12 ++++++++++++ tests/script/regressionSuite.sim | 11 +++++++++++ 4 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tests/pytest/fulltest.sh b/tests/pytest/fulltest.sh index 99dc658d71..a157100236 100755 --- a/tests/pytest/fulltest.sh +++ b/tests/pytest/fulltest.sh @@ -134,3 +134,7 @@ python3 ./test.py -f query/filter.py python3 ./test.py -f query/filterCombo.py python3 ./test.py -f query/queryNormal.py python3 ./test.py -f query/queryError.py + +#stream +python3 ./test.py -f stream/stream1.py +python3 ./test.py -f stream/stream2.py diff --git a/tests/pytest/regressiontest.sh b/tests/pytest/regressiontest.sh index e1d4c6348b..61407b49e3 100755 --- a/tests/pytest/regressiontest.sh +++ b/tests/pytest/regressiontest.sh @@ -131,6 +131,11 @@ python3 ./test.py -f user/pass_len.py #query python3 ./test.py -f query/filter.py -# python3 ./test.py -f query/filterCombo.py -# python3 ./test.py -f query/queryNormal.py -# python3 ./test.py -f query/queryError.py + + +#stream +python3 ./test.py -f stream/stream1.py +python3 ./test.py -f stream/stream2.py + + + diff --git a/tests/script/fullGeneralSuite.sim b/tests/script/fullGeneralSuite.sim index aa32fe4008..a7d6707e7d 100644 --- a/tests/script/fullGeneralSuite.sim +++ b/tests/script/fullGeneralSuite.sim @@ -211,3 +211,15 @@ run general/vector/table_field.sim run general/vector/table_mix.sim run general/vector/table_query.sim run general/vector/table_time.sim +run general/stream/stream_1.sim +run general/stream/stream_2.sim +run general/stream/stream_3.sim +run general/stream/stream_restart.sim +run general/stream/table_1.sim +run general/stream/metrics_1.sim +run general/stream/table_n.sim +run general/stream/metrics_n.sim +run general/stream/table_del.sim +run general/stream/metrics_del.sim +run general/stream/table_replica1_vnoden.sim +run general/stream/metrics_replica1_vnoden.sim diff --git a/tests/script/regressionSuite.sim b/tests/script/regressionSuite.sim index 67f54523df..683918ee54 100644 --- a/tests/script/regressionSuite.sim +++ b/tests/script/regressionSuite.sim @@ -211,3 +211,14 @@ run general/vector/table_field.sim run general/vector/table_mix.sim run general/vector/table_query.sim run general/vector/table_time.sim +run general/stream/stream_1.sim +run general/stream/stream_2.sim +run general/stream/stream_3.sim +run general/stream/table_1.sim +run general/stream/metrics_1.sim +run general/stream/table_n.sim +run general/stream/metrics_n.sim +run general/stream/table_del.sim +run general/stream/metrics_del.sim +run general/stream/table_replica1_vnoden.sim +run general/stream/metrics_replica1_vnoden.sim From 53683446d65766073c365787fa68a10d58645ab5 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Tue, 9 Jun 2020 16:16:53 +0800 Subject: [PATCH 48/55] fix random-test delete datafiles bug. --- tests/pytest/random-test/random-test-multi-threading-3.py | 3 ++- tests/pytest/random-test/random-test-multi-threading.py | 2 +- tests/pytest/random-test/random-test.py | 3 ++- 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/tests/pytest/random-test/random-test-multi-threading-3.py b/tests/pytest/random-test/random-test-multi-threading-3.py index cab17c4c1a..91f35ea7a5 100644 --- a/tests/pytest/random-test/random-test-multi-threading-3.py +++ b/tests/pytest/random-test/random-test-multi-threading-3.py @@ -205,6 +205,7 @@ class Test (Thread): global written dnodesDir = tdDnodes.getDnodesRootDir() + tdDnodes.forcestop(1) dataDir = dnodesDir + '/dnode1/data/*' deleteCmd = 'rm -rf %s' % dataDir os.system(deleteCmd) @@ -261,7 +262,7 @@ class Test (Thread): while True: self.queryEvent.wait() tdLog.notice("third thread") - randQueryOp = random.randint(1, 9) + randQueryOp = random.randint(1, 2) queryOp.get(randQueryOp, lambda: "ERROR")() self.queryEvent.clear() self.dbEvent.clear() diff --git a/tests/pytest/random-test/random-test-multi-threading.py b/tests/pytest/random-test/random-test-multi-threading.py index 1d8a5c3c82..997001157e 100644 --- a/tests/pytest/random-test/random-test-multi-threading.py +++ b/tests/pytest/random-test/random-test-multi-threading.py @@ -208,12 +208,12 @@ class Test (threading.Thread): global written dnodesDir = tdDnodes.getDnodesRootDir() + tdDnodes.forcestop(1) dataDir = dnodesDir + '/dnode1/data/*' deleteCmd = 'rm -rf %s' % dataDir os.system(deleteCmd) tdDnodes.start(1) -# tdLog.sleep(10) tdSql.prepare() last_tb = "" last_stb = "" diff --git a/tests/pytest/random-test/random-test.py b/tests/pytest/random-test/random-test.py index 855cabdedd..9cfc24f404 100644 --- a/tests/pytest/random-test/random-test.py +++ b/tests/pytest/random-test/random-test.py @@ -166,7 +166,8 @@ class Test: def delete_datafiles(self): tdLog.info("delete_datafiles") dnodesDir = tdDnodes.getDnodesRootDir() - dataDir = dnodesDir + '/dnode1/*' + tdDnodes.forcestop(1) + dataDir = dnodesDir + '/dnode1/data/*' deleteCmd = 'rm -rf %s' % dataDir os.system(deleteCmd) From 5d0cc08e9a0e2c5020cd8a12b180d1b3aef7ada4 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 9 Jun 2020 08:52:36 +0000 Subject: [PATCH 49/55] [TD_543] fix coverity scan, cid:290455 286428 286450 287977 287995 290226 --- src/dnode/src/dnodeMain.c | 8 +++----- src/dnode/src/dnodeMgmt.c | 18 ++++++++++++------ 2 files changed, 15 insertions(+), 11 deletions(-) diff --git a/src/dnode/src/dnodeMain.c b/src/dnode/src/dnodeMain.c index 73bc2923b2..91f146dde4 100644 --- a/src/dnode/src/dnodeMain.c +++ b/src/dnode/src/dnodeMain.c @@ -61,12 +61,10 @@ static const SDnodeComponent tsDnodeComponents[] = { }; static int dnodeCreateDir(const char *dir) { - struct stat dirstat; - if (stat(dir, &dirstat) < 0) { - if (mkdir(dir, 0755) != 0 && errno != EEXIST) { - return -1; - } + if (mkdir(dir, 0755) != 0 && errno != EEXIST) { + return -1; } + return 0; } diff --git a/src/dnode/src/dnodeMgmt.c b/src/dnode/src/dnodeMgmt.c index 4b448837fe..e260e7ec81 100644 --- a/src/dnode/src/dnodeMgmt.c +++ b/src/dnode/src/dnodeMgmt.c @@ -177,10 +177,12 @@ void dnodeDispatchToMgmtQueue(SRpcMsg *pMsg) { memcpy(item, pMsg, sizeof(SRpcMsg)); taosWriteQitem(tsMgmtQueue, 1, item); } else { - SRpcMsg rsp; - rsp.handle = pMsg->handle; - rsp.pCont = NULL; - rsp.code = TSDB_CODE_DND_OUT_OF_MEMORY; + SRpcMsg rsp = { + .handle = pMsg->handle, + .pCont = NULL, + .code = TSDB_CODE_DND_OUT_OF_MEMORY + }; + rpcSendResponse(&rsp); rpcFreeCont(pMsg->pCont); } @@ -188,9 +190,9 @@ void dnodeDispatchToMgmtQueue(SRpcMsg *pMsg) { static void *dnodeProcessMgmtQueue(void *param) { SRpcMsg *pMsg; - SRpcMsg rsp; + SRpcMsg rsp = {0}; int type; - void *handle; + void * handle; while (1) { if (taosReadQitemFromQset(tsMgmtQset, &type, (void **) &pMsg, &handle) == 0) { @@ -251,6 +253,7 @@ static int32_t dnodeOpenVnodes() { if (status != TSDB_CODE_SUCCESS) { dPrint("Get dnode list failed"); + free(vnodeList); return status; } @@ -290,6 +293,7 @@ static void dnodeCloseVnodes() { if (status != TSDB_CODE_SUCCESS) { dPrint("Get dnode list failed"); + free(vnodeList); return; } @@ -456,6 +460,7 @@ static bool dnodeReadMnodeInfos() { return false; } + content[len] = 0; cJSON* root = cJSON_Parse(content); if (root == NULL) { dError("failed to read mnodeIpList.json, invalid json format"); @@ -628,6 +633,7 @@ static bool dnodeReadDnodeCfg() { return false; } + content[len] = 0; cJSON* root = cJSON_Parse(content); if (root == NULL) { dError("failed to read dnodeCfg.json, invalid json format"); From 4b9a53c6d24b449c15a0416350e9e65180493695 Mon Sep 17 00:00:00 2001 From: Shuduo Sang Date: Tue, 9 Jun 2020 16:59:14 +0800 Subject: [PATCH 50/55] comment off general/http/telegraf.sim as not stable. --- tests/script/regressionSuite.sim | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/script/regressionSuite.sim b/tests/script/regressionSuite.sim index 683918ee54..40aacd4e98 100644 --- a/tests/script/regressionSuite.sim +++ b/tests/script/regressionSuite.sim @@ -70,7 +70,7 @@ run general/http/restful_insert.sim run general/http/restful_limit.sim run general/http/restful_full.sim run general/http/prepare.sim -run general/http/telegraf.sim +# run general/http/telegraf.sim # run general/http/grafana_bug.sim # run general/http/grafana.sim run general/import/basic.sim From 6d717a2b571e1e0e8dcfb19d0417e4bdf50fd358 Mon Sep 17 00:00:00 2001 From: Bomin Zhang Date: Tue, 9 Jun 2020 15:48:49 +0800 Subject: [PATCH 51/55] TD-459: fix coverity issues 290707 288014 290195 290193 290186 288205 288005 286989 286970 286967 278634 268232 268153 268075 267950 267940 267724 267855 267732 --- src/client/src/tscSQLParser.c | 2 +- src/client/src/tscServer.c | 10 +++++----- src/client/src/tscUtil.c | 4 ++-- src/cq/src/cqMain.c | 8 ++++---- src/inc/tcq.h | 2 +- src/kit/taosdemo/taosdemo.c | 2 +- src/kit/taosdump/taosdump.c | 4 ++++ src/mnode/inc/mnodeDef.h | 4 ++-- src/mnode/src/mnodeTable.c | 4 ++-- src/os/linux/src/linuxSysPara.c | 2 +- src/plugins/http/src/httpAuth.c | 4 ++-- src/plugins/monitor/src/monitorMain.c | 2 +- src/query/src/qExecutor.c | 2 +- tests/tsim/src/simMain.c | 2 +- 14 files changed, 28 insertions(+), 24 deletions(-) diff --git a/src/client/src/tscSQLParser.c b/src/client/src/tscSQLParser.c index ab2d7d7830..372e81d737 100644 --- a/src/client/src/tscSQLParser.c +++ b/src/client/src/tscSQLParser.c @@ -5420,7 +5420,7 @@ int32_t doLocalQueryProcess(SQueryInfo* pQueryInfo, SQuerySQL* pQuerySql) { tDataTypeDesc[TSDB_DATA_TYPE_INT].nSize, tDataTypeDesc[TSDB_DATA_TYPE_INT].nSize, false); const char* name = (pExprList->a[0].aliasName != NULL)? pExprList->a[0].aliasName:functionsInfo[index].name; - strncpy(pExpr1->aliasName, name, tListLen(pExpr1->aliasName)); + tstrncpy(pExpr1->aliasName, name, tListLen(pExpr1->aliasName)); return TSDB_CODE_SUCCESS; } diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index 8815e463ad..f01ec1bece 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -1018,7 +1018,7 @@ int32_t tscBuildDropDnodeMsg(SSqlObj *pSql, SSqlInfo *pInfo) { SCMDropDnodeMsg *pDrop = (SCMDropDnodeMsg *)pCmd->payload; STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); - strcpy(pDrop->ep, pTableMetaInfo->name); + tstrncpy(pDrop->ep, pTableMetaInfo->name, sizeof(pDrop->ep)); pCmd->msgType = TSDB_MSG_TYPE_CM_DROP_DNODE; return TSDB_CODE_SUCCESS; @@ -1036,7 +1036,7 @@ int32_t tscBuildDropUserMsg(SSqlObj *pSql, SSqlInfo *pInfo) { SCMDropUserMsg *pDropMsg = (SCMDropUserMsg*)pCmd->payload; STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); - strcpy(pDropMsg->user, pTableMetaInfo->name); + tstrncpy(pDropMsg->user, pTableMetaInfo->name, sizeof(pDropMsg->user)); return TSDB_CODE_SUCCESS; } @@ -1091,9 +1091,9 @@ int32_t tscBuildShowMsg(SSqlObj *pSql, SSqlInfo *pInfo) { STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); size_t nameLen = strlen(pTableMetaInfo->name); if (nameLen > 0) { - strcpy(pShowMsg->db, pTableMetaInfo->name); // prefix is set here + tstrncpy(pShowMsg->db, pTableMetaInfo->name, sizeof(pShowMsg->db)); // prefix is set here } else { - strcpy(pShowMsg->db, pObj->db); + tstrncpy(pShowMsg->db, pObj->db, sizeof(pShowMsg->db)); } SShowInfo *pShowInfo = &pInfo->pDCLInfo->showOpt; @@ -1300,7 +1300,7 @@ int tscAlterDbMsg(SSqlObj *pSql, SSqlInfo *pInfo) { SCMAlterDbMsg *pAlterDbMsg = (SCMAlterDbMsg*)pCmd->payload; STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0); - strcpy(pAlterDbMsg->db, pTableMetaInfo->name); + tstrncpy(pAlterDbMsg->db, pTableMetaInfo->name, sizeof(pAlterDbMsg->db)); return TSDB_CODE_SUCCESS; } diff --git a/src/client/src/tscUtil.c b/src/client/src/tscUtil.c index a810e5d4be..2701d2b572 100644 --- a/src/client/src/tscUtil.c +++ b/src/client/src/tscUtil.c @@ -593,7 +593,7 @@ int32_t tscCreateDataBlock(size_t initialSize, int32_t rowSize, int32_t startOff dataBuf->size = startOffset; dataBuf->tsSource = -1; - strncpy(dataBuf->tableId, name, TSDB_TABLE_ID_LEN); + tstrncpy(dataBuf->tableId, name, sizeof(dataBuf->tableId)); /* * The table meta may be released since the table meta cache are completed clean by other thread @@ -1666,7 +1666,7 @@ STableMetaInfo* tscAddTableMetaInfo(SQueryInfo* pQueryInfo, const char* name, ST assert(pTableMetaInfo != NULL); if (name != NULL) { - strncpy(pTableMetaInfo->name, name, TSDB_TABLE_ID_LEN); + tstrncpy(pTableMetaInfo->name, name, sizeof(pTableMetaInfo->name)); } pTableMetaInfo->pTableMeta = pTableMeta; diff --git a/src/cq/src/cqMain.c b/src/cq/src/cqMain.c index edb588b554..13f3c0a2b0 100644 --- a/src/cq/src/cqMain.c +++ b/src/cq/src/cqMain.c @@ -73,8 +73,8 @@ void *cqOpen(void *ahandle, const SCqCfg *pCfg) { return NULL; } - strcpy(pContext->user, pCfg->user); - strcpy(pContext->pass, pCfg->pass); + tstrncpy(pContext->user, pCfg->user, sizeof(pContext->user)); + tstrncpy(pContext->pass, pCfg->pass, sizeof(pContext->pass)); const char* db = pCfg->db; for (const char* p = db; *p != 0; p++) { if (*p == '.') { @@ -82,7 +82,7 @@ void *cqOpen(void *ahandle, const SCqCfg *pCfg) { break; } } - strcpy(pContext->db, db); + tstrncpy(pContext->db, db, sizeof(pContext->db)); pContext->vgId = pCfg->vgId; pContext->cqWrite = pCfg->cqWrite; pContext->ahandle = ahandle; @@ -215,7 +215,7 @@ void cqDrop(void *handle) { cTrace("vgId:%d, id:%d CQ:%s is dropped", pContext->vgId, pObj->tid, pObj->sqlStr); free(pObj); - pthread_mutex_lock(&pContext->mutex); + pthread_mutex_unlock(&pContext->mutex); } static void cqCreateStream(SCqContext *pContext, SCqObj *pObj) { diff --git a/src/inc/tcq.h b/src/inc/tcq.h index 9d987da468..32b75674c3 100644 --- a/src/inc/tcq.h +++ b/src/inc/tcq.h @@ -27,7 +27,7 @@ typedef struct { int vgId; char user[TSDB_USER_LEN]; char pass[TSDB_PASSWORD_LEN]; - char db[TSDB_DB_NAME_LEN + 1]; + char db[TSDB_DB_NAME_LEN]; FCqWrite cqWrite; } SCqCfg; diff --git a/src/kit/taosdemo/taosdemo.c b/src/kit/taosdemo/taosdemo.c index ca0af96145..8fb894a588 100644 --- a/src/kit/taosdemo/taosdemo.c +++ b/src/kit/taosdemo/taosdemo.c @@ -756,7 +756,7 @@ void *readMetric(void *sarg) { for (int j = 0; j < n; j++) { char condition[BUFFER_SIZE - 30] = "\0"; - char tempS[BUFFER_SIZE] = "\0"; + char tempS[64] = "\0"; int m = 10 < num_of_tables ? 10 : num_of_tables; diff --git a/src/kit/taosdump/taosdump.c b/src/kit/taosdump/taosdump.c index 417de629aa..6cb57ef0d5 100644 --- a/src/kit/taosdump/taosdump.c +++ b/src/kit/taosdump/taosdump.c @@ -643,6 +643,8 @@ int taosDumpDb(SDbInfo *dbInfo, SDumpArguments *arguments, FILE *fp) { lseek(fd, 0, SEEK_SET); while (read(fd, &tableRecord, sizeof(STableRecord)) > 0) { + tableRecord.name[sizeof(tableRecord.name) - 1] = 0; + tableRecord.metric[sizeof(tableRecord.metric) - 1] = 0; taosDumpTable(tableRecord.name, tableRecord.metric, arguments, fp); } @@ -902,6 +904,8 @@ int32_t taosDumpMetric(char *metric, SDumpArguments *arguments, FILE *fp) { lseek(fd, 0, SEEK_SET); while (read(fd, &tableRecord, sizeof(STableRecord)) > 0) { + tableRecord.name[sizeof(tableRecord.name) - 1] = 0; + tableRecord.metric[sizeof(tableRecord.metric) - 1] = 0; taosDumpTable(tableRecord.name, tableRecord.metric, arguments, fp); } diff --git a/src/mnode/inc/mnodeDef.h b/src/mnode/inc/mnodeDef.h index 35ae9aad33..14cd405763 100644 --- a/src/mnode/inc/mnodeDef.h +++ b/src/mnode/inc/mnodeDef.h @@ -32,8 +32,8 @@ struct SMnodeObj; typedef struct SDnodeObj { int32_t dnodeId; uint16_t dnodePort; - char dnodeFqdn[TSDB_FQDN_LEN + 1]; - char dnodeEp[TSDB_EP_LEN + 1]; + char dnodeFqdn[TSDB_FQDN_LEN]; + char dnodeEp[TSDB_EP_LEN]; int64_t createdTime; uint32_t lastAccess; int32_t openVnodes; diff --git a/src/mnode/src/mnodeTable.c b/src/mnode/src/mnodeTable.c index cde94c39b5..a2ddd9893f 100644 --- a/src/mnode/src/mnodeTable.c +++ b/src/mnode/src/mnodeTable.c @@ -1769,8 +1769,8 @@ static int32_t mnodeAutoCreateChildTable(SMnodeMsg *pMsg) { return TSDB_CODE_MND_OUT_OF_MEMORY; } - strncpy(pCreateMsg->tableId, pInfo->tableId, tListLen(pInfo->tableId)); - strcpy(pCreateMsg->db, pMsg->pDb->name); + tstrncpy(pCreateMsg->tableId, pInfo->tableId, sizeof(pInfo->tableId)); + tstrncpy(pCreateMsg->db, pMsg->pDb->name, sizeof(pCreateMsg->db)); pCreateMsg->igExists = 1; pCreateMsg->getMeta = 1; pCreateMsg->contLen = htonl(contLen); diff --git a/src/os/linux/src/linuxSysPara.c b/src/os/linux/src/linuxSysPara.c index 3ec7de3b63..8ae2630a15 100644 --- a/src/os/linux/src/linuxSysPara.c +++ b/src/os/linux/src/linuxSysPara.c @@ -160,7 +160,7 @@ static void taosGetSystemTimezone() { /* load time zone string from /etc/timezone */ FILE *f = fopen("/etc/timezone", "r"); - char buf[64] = {0}; + char buf[65] = {0}; if (f != NULL) { fread(buf, 64, 1, f); fclose(f); diff --git a/src/plugins/http/src/httpAuth.c b/src/plugins/http/src/httpAuth.c index 594f51e275..ccf39642c9 100644 --- a/src/plugins/http/src/httpAuth.c +++ b/src/plugins/http/src/httpAuth.c @@ -88,8 +88,8 @@ bool httpParseTaosdAuthToken(HttpContext *pContext, char *token, int len) { free(base64); return false; } else { - strncpy(pContext->user, descrypt, TSDB_USER_LEN); - strncpy(pContext->pass, descrypt + TSDB_USER_LEN, TSDB_PASSWORD_LEN); + tstrncpy(pContext->user, descrypt, sizeof(pContext->user)); + tstrncpy(pContext->pass, descrypt + TSDB_USER_LEN, TSDB_PASSWORD_LEN); httpTrace("context:%p, fd:%d, ip:%s, taosd token:%s parsed success, user:%s", pContext, pContext->fd, pContext->ipstr, token, pContext->user); diff --git a/src/plugins/monitor/src/monitorMain.c b/src/plugins/monitor/src/monitorMain.c index 01e276da64..ff9faa845c 100644 --- a/src/plugins/monitor/src/monitorMain.c +++ b/src/plugins/monitor/src/monitorMain.c @@ -156,7 +156,7 @@ static void dnodeBuildMonitorSql(char *sql, int32_t cmd) { ", io_read float, io_write float" ", req_http int, req_select int, req_insert int" ") tags (dnodeid int, fqdn binary(%d))", - tsMonitorDbName, TSDB_FQDN_LEN + 1); + tsMonitorDbName, TSDB_FQDN_LEN); } else if (cmd == MONITOR_CMD_CREATE_TB_DN) { snprintf(sql, SQL_LENGTH, "create table if not exists %s.dn%d using %s.dn tags(%d, '%s')", tsMonitorDbName, dnodeGetDnodeId(), tsMonitorDbName, dnodeGetDnodeId(), tsLocalEp); diff --git a/src/query/src/qExecutor.c b/src/query/src/qExecutor.c index 92c23f6b83..65a5ef45d3 100644 --- a/src/query/src/qExecutor.c +++ b/src/query/src/qExecutor.c @@ -5242,7 +5242,7 @@ static int32_t createFilterInfo(void *pQInfo, SQuery *pQuery) { if (pQuery->colList[i].numOfFilters > 0) { SSingleColumnFilterInfo *pFilterInfo = &pQuery->pFilterInfo[j]; - memcpy(&pFilterInfo->info, &pQuery->colList[i], sizeof(SColumnInfoData)); + memcpy(&pFilterInfo->info, &pQuery->colList[i], sizeof(SColumnInfo)); pFilterInfo->info = pQuery->colList[i]; pFilterInfo->numOfFilters = pQuery->colList[i].numOfFilters; diff --git a/tests/tsim/src/simMain.c b/tests/tsim/src/simMain.c index 2540851634..f016e36d41 100644 --- a/tests/tsim/src/simMain.c +++ b/tests/tsim/src/simMain.c @@ -29,7 +29,7 @@ int main(int argc, char *argv[]) { for (int i = 1; i < argc; ++i) { if (strcmp(argv[i], "-c") == 0 && i < argc - 1) { - strncpy(configDir, argv[++i], MAX_FILE_NAME_LEN); + tstrncpy(configDir, argv[++i], MAX_FILE_NAME_LEN); } else if (strcmp(argv[i], "-f") == 0 && i < argc - 1) { strcpy(scriptFile, argv[++i]); } else if (strcmp(argv[i], "-a") == 0) { From fbf249f28c6ec4a76cc7e728a5c75bd5ef3edd0f Mon Sep 17 00:00:00 2001 From: Bomin Zhang Date: Tue, 9 Jun 2020 17:15:06 +0800 Subject: [PATCH 52/55] fix coverity 290758, 267837 --- src/client/src/tscServer.c | 4 ++-- src/inc/taosmsg.h | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/client/src/tscServer.c b/src/client/src/tscServer.c index f01ec1bece..33ab93d113 100644 --- a/src/client/src/tscServer.c +++ b/src/client/src/tscServer.c @@ -2150,7 +2150,7 @@ int tscProcessConnectRsp(SSqlObj *pSql) { SSqlRes *pRes = &pSql->res; SCMConnectRsp *pConnect = (SCMConnectRsp *)pRes->pRsp; - strcpy(pObj->acctId, pConnect->acctId); // copy acctId from response + tstrncpy(pObj->acctId, pConnect->acctId, sizeof(pObj->acctId)); // copy acctId from response int32_t len = sprintf(temp, "%s%s%s", pObj->acctId, TS_PATH_DELIMITER, pObj->db); assert(len <= sizeof(pObj->db)); @@ -2172,7 +2172,7 @@ int tscProcessUseDbRsp(SSqlObj *pSql) { STscObj * pObj = pSql->pTscObj; STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pSql->cmd, 0, 0); - strcpy(pObj->db, pTableMetaInfo->name); + tstrncpy(pObj->db, pTableMetaInfo->name, sizeof(pObj->db)); return 0; } diff --git a/src/inc/taosmsg.h b/src/inc/taosmsg.h index dca8287394..6a0219d6fc 100644 --- a/src/inc/taosmsg.h +++ b/src/inc/taosmsg.h @@ -296,7 +296,7 @@ typedef struct { } SCMConnectMsg; typedef struct { - char acctId[TSDB_ACCT_LEN + 1]; + char acctId[TSDB_ACCT_LEN]; char serverVersion[TSDB_VERSION_LEN]; int8_t writeAuth; int8_t superAuth; From c29ff049f2365f3988fabb5418ea0a05321ecf6b Mon Sep 17 00:00:00 2001 From: Haojun Liao Date: Tue, 9 Jun 2020 17:19:30 +0800 Subject: [PATCH 53/55] [td-90] support multi-version SDataRow in cache --- src/common/src/tdataformat.c | 3 +- src/tsdb/src/tsdbRead.c | 243 +++++++++++++---------------------- 2 files changed, 88 insertions(+), 158 deletions(-) diff --git a/src/common/src/tdataformat.c b/src/common/src/tdataformat.c index 7880a4b302..15877ff541 100644 --- a/src/common/src/tdataformat.c +++ b/src/common/src/tdataformat.c @@ -269,8 +269,7 @@ void dataColSetNullAt(SDataCol *pCol, int index) { if (IS_VAR_DATA_TYPE(pCol->type)) { pCol->dataOff[index] = pCol->len; char *ptr = POINTER_SHIFT(pCol->pData, pCol->len); - varDataLen(ptr) = (pCol->type == TSDB_DATA_TYPE_BINARY) ? sizeof(char) : TSDB_NCHAR_SIZE; - setNull(varDataVal(ptr), pCol->type, pCol->bytes); + setVardataNull(ptr, pCol->type); pCol->len += varDataTLen(ptr); } else { setNull(POINTER_SHIFT(pCol->pData, TYPE_BYTES[pCol->type] * index), pCol->type, pCol->bytes); diff --git a/src/tsdb/src/tsdbRead.c b/src/tsdb/src/tsdbRead.c index 86ce44ad7b..7dc87363e4 100644 --- a/src/tsdb/src/tsdbRead.c +++ b/src/tsdb/src/tsdbRead.c @@ -233,8 +233,6 @@ TsdbQueryHandleT tsdbQueryRowsInExternalWindow(TsdbRepoT *tsdb, STsdbQueryCond* STsdbQueryHandle *pQueryHandle = (STsdbQueryHandle*) tsdbQueryTables(tsdb, pCond, groupList, qinfo); pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL; -// pQueryHandle->outputCapacity = 2; // only allowed two rows to be loaded - changeQueryHandleForInterpQuery(pQueryHandle); return pQueryHandle; } @@ -618,54 +616,19 @@ static bool doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlo static void handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock, STableCheckInfo* pCheckInfo){ SQueryFilePos* cur = &pQueryHandle->cur; SDataBlockInfo binfo = getTrueDataBlockInfo(pCheckInfo, pBlock); + /*bool hasData = */ initTableMemIterator(pQueryHandle, pCheckInfo); - - TSKEY k1 = TSKEY_INITIAL_VAL, k2 = TSKEY_INITIAL_VAL; - if (pCheckInfo->iter != NULL && tSkipListIterGet(pCheckInfo->iter) != NULL) { - SSkipListNode* node = tSkipListIterGet(pCheckInfo->iter); - - SDataRow row = SL_GET_NODE_DATA(node); - k1 = dataRowKey(row); - - if (k1 == binfo.window.skey) { - if (tSkipListIterNext(pCheckInfo->iter)) { - node = tSkipListIterGet(pCheckInfo->iter); - row = SL_GET_NODE_DATA(node); - k1 = dataRowKey(row); - } else { - k1 = TSKEY_INITIAL_VAL; - } - } - } - - if (pCheckInfo->iiter != NULL && tSkipListIterGet(pCheckInfo->iiter) != NULL) { - SSkipListNode* node = tSkipListIterGet(pCheckInfo->iiter); - - SDataRow row = SL_GET_NODE_DATA(node); - k2 = dataRowKey(row); - - if (k2 == binfo.window.skey) { - if (tSkipListIterNext(pCheckInfo->iiter)) { - node = tSkipListIterGet(pCheckInfo->iiter); - row = SL_GET_NODE_DATA(node); - k2 = dataRowKey(row); - } else { - k2 = TSKEY_INITIAL_VAL; - } - } - } - + SDataRow row = getSDataRowInTableMem(pCheckInfo); + + TSKEY key = (row != NULL)? dataRowKey(row):TSKEY_INITIAL_VAL; cur->pos = ASCENDING_TRAVERSE(pQueryHandle->order)? 0:(binfo.rows-1); - if ((ASCENDING_TRAVERSE(pQueryHandle->order) && - ((k1 != TSKEY_INITIAL_VAL && k1 <= binfo.window.ekey) || (k2 != TSKEY_INITIAL_VAL && k2 <= binfo.window.ekey))) || - (!ASCENDING_TRAVERSE(pQueryHandle->order) && - ((k1 != TSKEY_INITIAL_VAL && k1 >= binfo.window.skey) || (k2 != TSKEY_INITIAL_VAL && k2 >= binfo.window.skey)))) { + if ((ASCENDING_TRAVERSE(pQueryHandle->order) && (key != TSKEY_INITIAL_VAL && key <= binfo.window.ekey)) || + (!ASCENDING_TRAVERSE(pQueryHandle->order) && (key != TSKEY_INITIAL_VAL && key >= binfo.window.skey))) { - if ((ASCENDING_TRAVERSE(pQueryHandle->order) && - ((k1 != TSKEY_INITIAL_VAL && k1 < binfo.window.skey) || (k2 != TSKEY_INITIAL_VAL && k2 < binfo.window.skey))) || - (!ASCENDING_TRAVERSE(pQueryHandle->order) && - (((k1 != TSKEY_INITIAL_VAL && k1 > binfo.window.skey) || (k2 != TSKEY_INITIAL_VAL && k2 > binfo.window.skey))))) { + if ((ASCENDING_TRAVERSE(pQueryHandle->order) && (key != TSKEY_INITIAL_VAL && key < binfo.window.skey)) || + (!ASCENDING_TRAVERSE(pQueryHandle->order) && (key != TSKEY_INITIAL_VAL && key > binfo.window.ekey))) { + // do not load file block into buffer int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order) ? 1 : -1; @@ -756,7 +719,7 @@ static bool loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock return pQueryHandle->realNumOfRows > 0; } -static int vnodeBinarySearchKey(char* pValue, int num, TSKEY key, int order) { +static int doBinarySearchKey(char* pValue, int num, TSKEY key, int order) { int firstPos, lastPos, midPos = -1; int numOfRows; TSKEY* keyList; @@ -868,37 +831,63 @@ static int32_t copyDataFromFileBlock(STsdbQueryHandle* pQueryHandle, int32_t cap return numOfRows + num; } -static void copyOneRowFromMem(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pCheckInfo, int32_t capacity, - int32_t numOfRows, SDataRow row, STSchema* pSchema) { - int32_t numOfCols = taosArrayGetSize(pQueryHandle->pColumns); - int32_t numOfTableCols = schemaNCols(pSchema); - +static void copyOneRowFromMem(STsdbQueryHandle* pQueryHandle, int32_t capacity, int32_t numOfRows, SDataRow row, + STsdbMeta *pMeta, int32_t numOfCols, STable* pTable) { char* pData = NULL; - for (int32_t i = 0; i < numOfCols; ++i) { + + // the schema version info is embeded in SDataRow + STSchema* pSchema = tsdbGetTableSchemaByVersion(pMeta, pTable, dataRowVersion(row)); + int32_t numOfRowCols = schemaNCols(pSchema); + + int32_t i = 0, j = 0; + while(i < numOfCols && j < numOfRowCols) { SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i); - + if (pSchema->columns[j].colId < pColInfo->info.colId) { + j++; + continue; + } + if (ASCENDING_TRAVERSE(pQueryHandle->order)) { pData = pColInfo->pData + numOfRows * pColInfo->info.bytes; } else { pData = pColInfo->pData + (capacity - numOfRows - 1) * pColInfo->info.bytes; } - - int32_t offset = 0; - for (int32_t j = 0; j < numOfTableCols; ++j) { - if (pColInfo->info.colId == pSchema->columns[j].colId) { - offset = pSchema->columns[j].offset; - break; + + if (pSchema->columns[j].colId == pColInfo->info.colId) { + void* value = tdGetRowDataOfCol(row, pColInfo->info.type, TD_DATA_ROW_HEAD_SIZE + pSchema->columns[j].offset); + if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { + memcpy(pData, value, varDataTLen(value)); + } else { + memcpy(pData, value, pColInfo->info.bytes); } + + j++; + i++; + } else { // pColInfo->info.colId < pSchema->columns[j].colId, it is a NULL data + if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { + setVardataNull(pData, pColInfo->info.type); + } else { + setNull(pData, pColInfo->info.type, pColInfo->info.bytes); + } + i++; } - - assert(offset != -1); // todo handle error - void* value = tdGetRowDataOfCol(row, pColInfo->info.type, TD_DATA_ROW_HEAD_SIZE + offset); - - if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { - memcpy(pData, value, varDataTLen(value)); + } + + while (i < numOfCols) { // the remain columns are all null data + SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i); + if (ASCENDING_TRAVERSE(pQueryHandle->order)) { + pData = pColInfo->pData + numOfRows * pColInfo->info.bytes; } else { - memcpy(pData, value, pColInfo->info.bytes); + pData = pColInfo->pData + (capacity - numOfRows - 1) * pColInfo->info.bytes; } + + if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { + setVardataNull(pData, pColInfo->info.type); + } else { + setNull(pData, pColInfo->info.type, pColInfo->info.bytes); + } + + i++; } } @@ -911,7 +900,16 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* initTableMemIterator(pQueryHandle, pCheckInfo); SDataCols* pCols = pQueryHandle->rhelper.pDataCols[0]; - + + // for search the endPos, so the order needs to reverse + int32_t order = (pQueryHandle->order == TSDB_ORDER_ASC)? TSDB_ORDER_DESC:TSDB_ORDER_ASC; + + int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1:-1; + int32_t numOfCols = taosArrayGetSize(pQueryHandle->pColumns); + + STsdbMeta* pMeta = tsdbGetMeta(pQueryHandle->pTsdb); + STable* pTable = pCheckInfo->pTableObj; + int32_t endPos = cur->pos; if (ASCENDING_TRAVERSE(pQueryHandle->order) && pQueryHandle->window.ekey > blockInfo.window.ekey) { endPos = blockInfo.rows - 1; @@ -920,8 +918,8 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* endPos = 0; cur->mixBlock = (cur->pos != blockInfo.rows - 1); } else { - int32_t order = (pQueryHandle->order == TSDB_ORDER_ASC)? TSDB_ORDER_DESC:TSDB_ORDER_ASC; - endPos = vnodeBinarySearchKey(pCols->cols[0].pData, pCols->numOfRows, pQueryHandle->window.ekey, order); + assert(pCols->numOfRows > 0); + endPos = doBinarySearchKey(pCols->cols[0].pData, pCols->numOfRows, pQueryHandle->window.ekey, order); cur->mixBlock = true; } @@ -933,8 +931,7 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* int32_t numOfRows = 0; pQueryHandle->cur.win = TSWINDOW_INITIALIZER; - int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1:-1; - + // no data in buffer, load data from file directly if (pCheckInfo->iiter == NULL && pCheckInfo->iter == NULL) { int32_t start = cur->pos; @@ -950,12 +947,11 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* // todo opt in case of no data in buffer numOfRows = copyDataFromFileBlock(pQueryHandle, pQueryHandle->outputCapacity, numOfRows, start, end); - // if the buffer is not full in case of descending order query, move the data in the front of the buffer + // if the buffer is not full in case of descending order query, move the data in the front of the buffer if (!ASCENDING_TRAVERSE(pQueryHandle->order) && numOfRows < pQueryHandle->outputCapacity) { int32_t emptySize = pQueryHandle->outputCapacity - numOfRows; - int32_t reqNumOfCols = taosArrayGetSize(pQueryHandle->pColumns); - - for(int32_t i = 0; i < reqNumOfCols; ++i) { + + for(int32_t i = 0; i < numOfCols; ++i) { SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i); memmove(pColInfo->pData, pColInfo->pData + emptySize * pColInfo->info.bytes, numOfRows * pColInfo->info.bytes); } @@ -969,20 +965,15 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* pQueryHandle->realNumOfRows = numOfRows; cur->rows = numOfRows; return; - } else if (pCheckInfo->iter != NULL && pCheckInfo->iiter == NULL) { - // } else if (pCheckInfo->iter == NULL && pCheckInfo->iiter != NULL) { - // } else { // iter and iiter are all not NULL, three-way merge data block - STSchema* pSchema = tsdbGetTableSchema(tsdbGetMeta(pQueryHandle->pTsdb), pCheckInfo->pTableObj); + } else if (pCheckInfo->iter != NULL || pCheckInfo->iiter != NULL) { SSkipListNode* node = NULL; - do { - node = tSkipListIterGet(pCheckInfo->iter); - if (node == NULL) { + SDataRow row = getSDataRowInTableMem(pCheckInfo); + if (row == NULL) { break; } - SDataRow row = SL_GET_NODE_DATA(node); - TSKEY key = dataRowKey(row); + TSKEY key = dataRowKey(row); if ((key > pQueryHandle->window.ekey && ASCENDING_TRAVERSE(pQueryHandle->order)) || (key < pQueryHandle->window.ekey && !ASCENDING_TRAVERSE(pQueryHandle->order))) { break; @@ -995,7 +986,7 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* if ((key < tsArray[pos] && ASCENDING_TRAVERSE(pQueryHandle->order)) || (key > tsArray[pos] && !ASCENDING_TRAVERSE(pQueryHandle->order))) { - copyOneRowFromMem(pQueryHandle, pCheckInfo, pQueryHandle->outputCapacity, numOfRows, row, pSchema); + copyOneRowFromMem(pQueryHandle, pQueryHandle->outputCapacity, numOfRows, row, pMeta, numOfCols, pTable); numOfRows += 1; if (cur->win.skey == TSKEY_INITIAL_VAL) { cur->win.skey = key; @@ -1005,17 +996,16 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* cur->lastKey = key + step; cur->mixBlock = true; - tSkipListIterNext(pCheckInfo->iter); + moveToNextRow(pCheckInfo); } else if (key == tsArray[pos]) { // data in buffer has the same timestamp of data in file block, ignore it - tSkipListIterNext(pCheckInfo->iter); + moveToNextRow(pCheckInfo); } else if ((key > tsArray[pos] && ASCENDING_TRAVERSE(pQueryHandle->order)) || (key < tsArray[pos] && !ASCENDING_TRAVERSE(pQueryHandle->order))) { if (cur->win.skey == TSKEY_INITIAL_VAL) { cur->win.skey = tsArray[pos]; } - int32_t order = ASCENDING_TRAVERSE(pQueryHandle->order) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC; - int32_t end = vnodeBinarySearchKey(pCols->cols[0].pData, pCols->numOfRows, key, order); + int32_t end = doBinarySearchKey(pCols->cols[0].pData, pCols->numOfRows, key, order); if (tsArray[end] == key) { // the value of key in cache equals to the end timestamp value, ignore it tSkipListIterNext(pCheckInfo->iter); } @@ -1093,9 +1083,7 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo* // if the buffer is not full in case of descending order query, move the data in the front of the buffer if (numOfRows < pQueryHandle->outputCapacity) { int32_t emptySize = pQueryHandle->outputCapacity - numOfRows; - - int32_t requiredNumOfCols = taosArrayGetSize(pQueryHandle->pColumns); - for(int32_t i = 0; i < requiredNumOfCols; ++i) { + for(int32_t i = 0; i < numOfCols; ++i) { SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i); memmove(pColInfo->pData, pColInfo->pData + emptySize * pColInfo->info.bytes, numOfRows * pColInfo->info.bytes); } @@ -1567,9 +1555,6 @@ void changeQueryHandleForLastrowQuery(TsdbQueryHandleT pqHandle) { for(int32_t i = 0; i < numOfTables; ++i) { STableCheckInfo* pCheckInfo = taosArrayGet(pQueryHandle->pTableCheckInfo, i); - if (pCheckInfo->pTableObj->tableId.uid == 12094628167747) { - printf("abc\n"); - } if (pCheckInfo->pTableObj->lastKey > key) { key = pCheckInfo->pTableObj->lastKey; index = i; @@ -1652,9 +1637,9 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int *skey = TSKEY_INITIAL_VAL; int64_t st = taosGetTimestampUs(); - STSchema* pSchema = tsdbGetTableSchema(tsdbGetMeta(pQueryHandle->pTsdb), pCheckInfo->pTableObj); - int32_t numOfTableCols = schemaNCols(pSchema); - + STsdbMeta* pMeta = tsdbGetMeta(pQueryHandle->pTsdb); + STable* pTable = pCheckInfo->pTableObj; + do { SDataRow row = getSDataRowInTableMem(pCheckInfo); if (row == NULL) { @@ -1662,10 +1647,7 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int } TSKEY key = dataRowKey(row); - - if ((key > maxKey && ASCENDING_TRAVERSE(pQueryHandle->order)) || - (key < maxKey && !ASCENDING_TRAVERSE(pQueryHandle->order))) { - + if ((key > maxKey && ASCENDING_TRAVERSE(pQueryHandle->order)) || (key < maxKey && !ASCENDING_TRAVERSE(pQueryHandle->order))) { tsdbTrace("%p key:%"PRIu64" beyond qrange:%"PRId64" - %"PRId64", no more data in buffer", pQueryHandle, key, pQueryHandle->window.skey, pQueryHandle->window.ekey); @@ -1677,59 +1659,8 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int } *ekey = key; - char* pData = NULL; - - int32_t i = 0, j = 0; - while(i < numOfCols && j < numOfTableCols) { - SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i); - if (pSchema->columns[j].colId < pColInfo->info.colId) { - j++; - continue; - } - - if (ASCENDING_TRAVERSE(pQueryHandle->order)) { - pData = pColInfo->pData + numOfRows * pColInfo->info.bytes; - } else { - pData = pColInfo->pData + (maxRowsToRead - numOfRows - 1) * pColInfo->info.bytes; - } - - if (pSchema->columns[j].colId == pColInfo->info.colId) { - void* value = tdGetRowDataOfCol(row, pColInfo->info.type, TD_DATA_ROW_HEAD_SIZE + pSchema->columns[j].offset); - if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { - memcpy(pData, value, varDataTLen(value)); - } else { - memcpy(pData, value, pColInfo->info.bytes); - } - - j++; - i++; - } else { // pColInfo->info.colId < pSchema->columns[j].colId, it is a NULL data - if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { - setVardataNull(pData, pColInfo->info.type); - } else { - setNull(pData, pColInfo->info.type, pColInfo->info.bytes); - } - i++; - } - } - - while (i < numOfCols) { // the remain columns are all null data - SColumnInfoData* pColInfo = taosArrayGet(pQueryHandle->pColumns, i); - if (ASCENDING_TRAVERSE(pQueryHandle->order)) { - pData = pColInfo->pData + numOfRows * pColInfo->info.bytes; - } else { - pData = pColInfo->pData + (maxRowsToRead - numOfRows - 1) * pColInfo->info.bytes; - } - - if (pColInfo->info.type == TSDB_DATA_TYPE_BINARY || pColInfo->info.type == TSDB_DATA_TYPE_NCHAR) { - setVardataNull(pData, pColInfo->info.type); - } else { - setNull(pData, pColInfo->info.type, pColInfo->info.bytes); - } - - i++; - } - + copyOneRowFromMem(pQueryHandle, maxRowsToRead, numOfRows, row, pMeta, numOfCols, pTable); + if (++numOfRows >= maxRowsToRead) { moveToNextRow(pCheckInfo); break; From c96f11e808742f4e2ad796cfbb9b6cb39db099fb Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 9 Jun 2020 10:35:07 +0000 Subject: [PATCH 54/55] [TD_543] fix coverity scan issues in dnode module --- src/dnode/src/dnodePeer.c | 11 ++++++----- src/dnode/src/dnodeShell.c | 14 ++++++++------ src/dnode/src/dnodeSystem.c | 2 +- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/dnode/src/dnodePeer.c b/src/dnode/src/dnodePeer.c index eb017c335e..851e895f83 100644 --- a/src/dnode/src/dnodePeer.c +++ b/src/dnode/src/dnodePeer.c @@ -83,11 +83,12 @@ void dnodeCleanupServer() { } static void dnodeProcessReqMsgFromDnode(SRpcMsg *pMsg, SRpcIpSet *pIpSet) { - SRpcMsg rspMsg; - rspMsg.handle = pMsg->handle; - rspMsg.pCont = NULL; - rspMsg.contLen = 0; - + SRpcMsg rspMsg = { + .handle = pMsg->handle, + .pCont = NULL, + .contLen = 0 + }; + if (dnodeGetRunStatus() != TSDB_DNODE_RUN_STATUS_RUNING) { rspMsg.code = TSDB_CODE_RPC_NOT_READY; rpcSendResponse(&rspMsg); diff --git a/src/dnode/src/dnodeShell.c b/src/dnode/src/dnodeShell.c index 8eba1f3775..95e4c49422 100644 --- a/src/dnode/src/dnodeShell.c +++ b/src/dnode/src/dnodeShell.c @@ -19,6 +19,7 @@ #include "taosdef.h" #include "taosmsg.h" #include "tglobal.h" +#include "tutil.h" #include "http.h" #include "mnode.h" #include "dnode.h" @@ -108,10 +109,11 @@ void dnodeCleanupShell() { } void dnodeProcessMsgFromShell(SRpcMsg *pMsg, SRpcIpSet *pIpSet) { - SRpcMsg rpcMsg; - rpcMsg.handle = pMsg->handle; - rpcMsg.pCont = NULL; - rpcMsg.contLen = 0; + SRpcMsg rpcMsg = { + .handle = pMsg->handle, + .pCont = NULL, + .contLen = 0 + }; if (dnodeGetRunStatus() != TSDB_DNODE_RUN_STATUS_RUNING) { dError("RPC %p, shell msg:%s is ignored since dnode not running", pMsg->handle, taosMsg[pMsg->msgType]); @@ -143,7 +145,7 @@ static int dnodeRetrieveUserAuthInfo(char *user, char *spi, char *encrypt, char if (code != TSDB_CODE_RPC_NOT_READY) return code; SDMAuthMsg *pMsg = rpcMallocCont(sizeof(SDMAuthMsg)); - strcpy(pMsg->user, user); + tstrncpy(pMsg->user, user, TSDB_USER_LEN); SRpcMsg rpcMsg = {0}; rpcMsg.pCont = pMsg; @@ -201,7 +203,7 @@ void *dnodeSendCfgTableToRecv(int32_t vgId, int32_t sid) { int16_t numOfTags = htons(pTable->numOfTags); int32_t sid = htonl(pTable->sid); uint64_t uid = htobe64(pTable->uid); - dPrint("table:%s, numOfColumns:%d numOfTags:%d sid:%d uid:%d", pTable->tableId, numOfColumns, numOfTags, sid, uid); + dPrint("table:%s, numOfColumns:%d numOfTags:%d sid:%d uid:" PRIu64, pTable->tableId, numOfColumns, numOfTags, sid, uid); return rpcRsp.pCont; } diff --git a/src/dnode/src/dnodeSystem.c b/src/dnode/src/dnodeSystem.c index 0a983362c2..3efa1c728d 100644 --- a/src/dnode/src/dnodeSystem.c +++ b/src/dnode/src/dnodeSystem.c @@ -33,7 +33,7 @@ int32_t main(int32_t argc, char *argv[]) { printf("config file path overflow"); exit(EXIT_FAILURE); } - strcpy(configDir, argv[i]); + tstrncpy(configDir, argv[i], TSDB_FILENAME_LEN); } else { printf("'-c' requires a parameter, default:%s\n", configDir); exit(EXIT_FAILURE); From f4f75a0c229a2c848ac41b51abde1380955cebe1 Mon Sep 17 00:00:00 2001 From: Shengliang Guan Date: Tue, 9 Jun 2020 15:23:40 +0000 Subject: [PATCH 55/55] [TD_543] fix coverity scan issues in mnode module --- src/common/inc/tdataformat.h | 4 ++-- src/dnode/src/dnodeShell.c | 2 +- src/mnode/src/mnodeDb.c | 2 +- src/mnode/src/mnodeDnode.c | 8 +++++--- src/mnode/src/mnodeMain.c | 8 ++++++-- src/mnode/src/mnodeProfile.c | 2 +- src/mnode/src/mnodeSdb.c | 16 +++++++++------- src/mnode/src/mnodeShow.c | 1 + 8 files changed, 26 insertions(+), 17 deletions(-) diff --git a/src/common/inc/tdataformat.h b/src/common/inc/tdataformat.h index e1f17b09a9..0e57c7317e 100644 --- a/src/common/inc/tdataformat.h +++ b/src/common/inc/tdataformat.h @@ -31,7 +31,7 @@ extern "C" { do { \ VarDataLenT __len = strlen(str); \ *(VarDataLenT *)(x) = __len; \ - strncpy(varDataVal(x), (str), __len); \ + memcpy(varDataVal(x), (str), __len); \ } while (0); #define STR_WITH_MAXSIZE_TO_VARSTR(x, str, _maxs) \ @@ -43,7 +43,7 @@ extern "C" { #define STR_WITH_SIZE_TO_VARSTR(x, str, _size) \ do { \ *(VarDataLenT *)(x) = (_size); \ - strncpy(varDataVal(x), (str), (_size)); \ + memcpy(varDataVal(x), (str), (_size)); \ } while (0); // ----------------- TSDB COLUMN DEFINITION diff --git a/src/dnode/src/dnodeShell.c b/src/dnode/src/dnodeShell.c index 95e4c49422..117059ae66 100644 --- a/src/dnode/src/dnodeShell.c +++ b/src/dnode/src/dnodeShell.c @@ -203,7 +203,7 @@ void *dnodeSendCfgTableToRecv(int32_t vgId, int32_t sid) { int16_t numOfTags = htons(pTable->numOfTags); int32_t sid = htonl(pTable->sid); uint64_t uid = htobe64(pTable->uid); - dPrint("table:%s, numOfColumns:%d numOfTags:%d sid:%d uid:" PRIu64, pTable->tableId, numOfColumns, numOfTags, sid, uid); + dPrint("table:%s, numOfColumns:%d numOfTags:%d sid:%d uid:%" PRIu64, pTable->tableId, numOfColumns, numOfTags, sid, uid); return rpcRsp.pCont; } diff --git a/src/mnode/src/mnodeDb.c b/src/mnode/src/mnodeDb.c index c80dc3036f..3666d61adc 100644 --- a/src/mnode/src/mnodeDb.c +++ b/src/mnode/src/mnodeDb.c @@ -882,7 +882,7 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SCMAlterDbMsg *pAlter) { } if (pDb->cfg.replications - replications >= 2) { - mError("db:%s, replica number can't change from 3 to 1", pDb->name, replications); + mError("db:%s, replica number can't change from %d to %d", pDb->name, pDb->cfg.replications, replications); terrno = TSDB_CODE_MND_INVALID_DB_OPTION; } } diff --git a/src/mnode/src/mnodeDnode.c b/src/mnode/src/mnodeDnode.c index 6fd565b5e6..d2af86badb 100644 --- a/src/mnode/src/mnodeDnode.c +++ b/src/mnode/src/mnodeDnode.c @@ -90,7 +90,7 @@ static int32_t mnodeDnodeActionDelete(SSdbOper *pOper) { static int32_t mnodeDnodeActionUpdate(SSdbOper *pOper) { SDnodeObj *pDnode = pOper->pObj; SDnodeObj *pSaved = mnodeGetDnode(pDnode->dnodeId); - if (pDnode != pSaved) { + if (pDnode != pSaved && pDnode != NULL && pSaved != NULL) { memcpy(pSaved, pDnode, pOper->rowSize); free(pDnode); } @@ -237,7 +237,9 @@ void mnodeUpdateDnode(SDnodeObj *pDnode) { .pObj = pDnode }; - sdbUpdateRow(&oper); + if (sdbUpdateRow(&oper) != 0) { + mError("dnodeId:%d, failed update", pDnode->dnodeId); + } } static int32_t mnodeProcessCfgDnodeMsg(SMnodeMsg *pMsg) { @@ -383,7 +385,7 @@ static int32_t mnodeCreateDnode(char *ep) { pDnode->createdTime = taosGetTimestampMs(); pDnode->status = TAOS_DN_STATUS_OFFLINE; pDnode->totalVnodes = TSDB_INVALID_VNODE_NUM; - strcpy(pDnode->dnodeEp, ep); + tstrncpy(pDnode->dnodeEp, ep, TSDB_EP_LEN); taosGetFqdnPortFromEp(ep, pDnode->dnodeFqdn, &pDnode->dnodePort); SSdbOper oper = { diff --git a/src/mnode/src/mnodeMain.c b/src/mnode/src/mnodeMain.c index 57bb1b2bac..96dc700783 100644 --- a/src/mnode/src/mnodeMain.c +++ b/src/mnode/src/mnodeMain.c @@ -134,8 +134,12 @@ void mnodeStopSystem() { } mnodeCleanupSystem(); - mPrint("mnode file is removed"); - remove(tsMnodeDir); + + if (remove(tsMnodeDir) != 0) { + mPrint("failed to remove mnode file, reason:%s", strerror(errno)); + } else { + mPrint("mnode file is removed"); + } } static void mnodeInitTimer() { diff --git a/src/mnode/src/mnodeProfile.c b/src/mnode/src/mnodeProfile.c index 85999f80e7..bfb92096ec 100644 --- a/src/mnode/src/mnodeProfile.c +++ b/src/mnode/src/mnodeProfile.c @@ -97,7 +97,7 @@ SConnObj *mnodeCreateConn(char *user, uint32_t ip, uint16_t port) { .connId = connId, .stime = taosGetTimestampMs() }; - strcpy(connObj.user, user); + tstrncpy(connObj.user, user, TSDB_USER_LEN); char key[10]; sprintf(key, "%u", connId); diff --git a/src/mnode/src/mnodeSdb.c b/src/mnode/src/mnodeSdb.c index 8d74827841..a13c6ca129 100644 --- a/src/mnode/src/mnodeSdb.c +++ b/src/mnode/src/mnodeSdb.c @@ -30,6 +30,8 @@ #include "mnodeDnode.h" #include "mnodeSdb.h" +#define SDB_TABLE_LEN 12 + typedef enum { SDB_ACTION_INSERT, SDB_ACTION_DELETE, @@ -43,7 +45,7 @@ typedef enum { } ESdbStatus; typedef struct _SSdbTable { - char tableName[TSDB_DB_NAME_LEN]; + char tableName[SDB_TABLE_LEN]; ESdbTable tableId; ESdbKey keyType; int32_t hashSessions; @@ -174,10 +176,10 @@ static void sdbRestoreTables() { totalRows += pTable->numOfRows; numOfTables++; - sdbTrace("table:%s, is restored, numOfRows:%d", pTable->tableName, pTable->numOfRows); + sdbTrace("table:%s, is restored, numOfRows:%" PRId64, pTable->tableName, pTable->numOfRows); } - sdbTrace("sdb is restored, version:%d totalRows:%d numOfTables:%d", tsSdbObj.version, totalRows, numOfTables); + sdbTrace("sdb is restored, version:%" PRId64 " totalRows:%d numOfTables:%d", tsSdbObj.version, totalRows, numOfTables); } void sdbUpdateMnodeRoles() { @@ -449,7 +451,7 @@ static int32_t sdbInsertHash(SSdbTable *pTable, SSdbOper *pOper) { pthread_mutex_unlock(&pTable->mutex); - sdbTrace("table:%s, insert record:%s to hash, rowSize:%d vnumOfRows:%d version:%" PRIu64, pTable->tableName, + sdbTrace("table:%s, insert record:%s to hash, rowSize:%d vnumOfRows:%" PRId64 " version:%" PRIu64, pTable->tableName, sdbGetKeyStrFromObj(pTable, pOper->pObj), pOper->rowSize, pTable->numOfRows, sdbGetVersion()); (*pTable->insertFp)(pOper); @@ -473,7 +475,7 @@ static int32_t sdbDeleteHash(SSdbTable *pTable, SSdbOper *pOper) { pTable->numOfRows--; pthread_mutex_unlock(&pTable->mutex); - sdbTrace("table:%s, delete record:%s from hash, numOfRows:%d version:%" PRIu64, pTable->tableName, + sdbTrace("table:%s, delete record:%s from hash, numOfRows:%d" PRId64 "version:%" PRIu64, pTable->tableName, sdbGetKeyStrFromObj(pTable, pOper->pObj), pTable->numOfRows, sdbGetVersion()); int8_t *updateEnd = pOper->pObj + pTable->refCountPos - 1; @@ -484,7 +486,7 @@ static int32_t sdbDeleteHash(SSdbTable *pTable, SSdbOper *pOper) { } static int32_t sdbUpdateHash(SSdbTable *pTable, SSdbOper *pOper) { - sdbTrace("table:%s, update record:%s in hash, numOfRows:%d version:%" PRIu64, pTable->tableName, + sdbTrace("table:%s, update record:%s in hash, numOfRows:%" PRId64 " version:%" PRIu64, pTable->tableName, sdbGetKeyStrFromObj(pTable, pOper->pObj), pTable->numOfRows, sdbGetVersion()); (*pTable->updateFp)(pOper); @@ -717,7 +719,7 @@ void *sdbOpenTable(SSdbTableDesc *pDesc) { if (pTable == NULL) return NULL; - strcpy(pTable->tableName, pDesc->tableName); + tstrncpy(pTable->tableName, pDesc->tableName, SDB_TABLE_LEN); pTable->keyType = pDesc->keyType; pTable->tableId = pDesc->tableId; pTable->hashSessions = pDesc->hashSessions; diff --git a/src/mnode/src/mnodeShow.c b/src/mnode/src/mnodeShow.c index cb448bb564..deb297610d 100644 --- a/src/mnode/src/mnodeShow.c +++ b/src/mnode/src/mnodeShow.c @@ -324,6 +324,7 @@ static int32_t mnodeProcessConnectMsg(SMnodeMsg *pMsg) { connect_over: if (code != TSDB_CODE_SUCCESS) { + rpcFreeCont(pConnectRsp); mLError("user:%s login from %s, result:%s", connInfo.user, taosIpStr(connInfo.clientIp), tstrerror(code)); } else { mLPrint("user:%s login from %s, result:%s", connInfo.user, taosIpStr(connInfo.clientIp), tstrerror(code));