Resolve small conflicts with crash_gen tool
This commit is contained in:
commit
a75721ff00
16
.travis.yml
16
.travis.yml
|
@ -13,7 +13,7 @@ branches:
|
||||||
|
|
||||||
matrix:
|
matrix:
|
||||||
- os: linux
|
- os: linux
|
||||||
dist: bionic
|
dist: focal
|
||||||
language: c
|
language: c
|
||||||
|
|
||||||
git:
|
git:
|
||||||
|
@ -28,8 +28,6 @@ matrix:
|
||||||
- build-essential
|
- build-essential
|
||||||
- cmake
|
- cmake
|
||||||
- net-tools
|
- net-tools
|
||||||
- python-pip
|
|
||||||
- python-setuptools
|
|
||||||
- python3-pip
|
- python3-pip
|
||||||
- python3-setuptools
|
- python3-setuptools
|
||||||
- valgrind
|
- valgrind
|
||||||
|
@ -54,13 +52,19 @@ matrix:
|
||||||
cd ${TRAVIS_BUILD_DIR}/debug
|
cd ${TRAVIS_BUILD_DIR}/debug
|
||||||
make install > /dev/null || travis_terminate $?
|
make install > /dev/null || travis_terminate $?
|
||||||
|
|
||||||
pip install numpy
|
|
||||||
pip install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python2/
|
|
||||||
pip3 install numpy
|
pip3 install numpy
|
||||||
pip3 install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python3/
|
pip3 install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python3/
|
||||||
|
|
||||||
cd ${TRAVIS_BUILD_DIR}/tests
|
cd ${TRAVIS_BUILD_DIR}/tests
|
||||||
./test-all.sh smoke || travis_terminate $?
|
./test-all.sh smoke || travis_terminate $?
|
||||||
|
sleep 1
|
||||||
|
|
||||||
|
cd ${TRAVIS_BUILD_DIR}/tests/pytest
|
||||||
|
pkill -TERM -x taosd
|
||||||
|
fuser -k -n tcp 6030
|
||||||
|
sleep 1
|
||||||
|
./crash_gen.sh -a -p -t 4 -s 25|| travis_terminate $?
|
||||||
|
sleep 1
|
||||||
|
|
||||||
cd ${TRAVIS_BUILD_DIR}/tests/pytest
|
cd ${TRAVIS_BUILD_DIR}/tests/pytest
|
||||||
./valgrind-test.sh 2>&1 > mem-error-out.log
|
./valgrind-test.sh 2>&1 > mem-error-out.log
|
||||||
|
@ -160,7 +164,7 @@ matrix:
|
||||||
|
|
||||||
script:
|
script:
|
||||||
- cmake .. > /dev/null
|
- cmake .. > /dev/null
|
||||||
- make > /dev/null
|
- make
|
||||||
|
|
||||||
- os: linux
|
- os: linux
|
||||||
dist: bionic
|
dist: bionic
|
||||||
|
|
|
@ -160,7 +160,9 @@ void tscFieldInfoUpdateOffsetForInterResult(SQueryInfo* pQueryInfo);
|
||||||
|
|
||||||
int16_t tscFieldInfoGetOffset(SQueryInfo* pQueryInfo, int32_t index);
|
int16_t tscFieldInfoGetOffset(SQueryInfo* pQueryInfo, int32_t index);
|
||||||
void tscFieldInfoClear(SFieldInfo* pFieldInfo);
|
void tscFieldInfoClear(SFieldInfo* pFieldInfo);
|
||||||
int32_t tscNumOfFields(SQueryInfo* pQueryInfo);
|
|
||||||
|
static FORCE_INLINE int32_t tscNumOfFields(SQueryInfo* pQueryInfo) { return pQueryInfo->fieldsInfo.numOfOutput; }
|
||||||
|
|
||||||
int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2);
|
int32_t tscFieldInfoCompare(const SFieldInfo* pFieldInfo1, const SFieldInfo* pFieldInfo2);
|
||||||
|
|
||||||
void addExprParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes, int16_t tableIndex);
|
void addExprParams(SSqlExpr* pExpr, char* argument, int32_t type, int32_t bytes, int16_t tableIndex);
|
||||||
|
|
|
@ -412,7 +412,44 @@ char *tscGetErrorMsgPayload(SSqlCmd *pCmd);
|
||||||
int32_t tscInvalidSQLErrMsg(char *msg, const char *additionalInfo, const char *sql);
|
int32_t tscInvalidSQLErrMsg(char *msg, const char *additionalInfo, const char *sql);
|
||||||
|
|
||||||
int32_t tscToSQLCmd(SSqlObj *pSql, struct SSqlInfo *pInfo);
|
int32_t tscToSQLCmd(SSqlObj *pSql, struct SSqlInfo *pInfo);
|
||||||
void tscGetResultColumnChr(SSqlRes *pRes, SFieldInfo* pFieldInfo, int32_t column);
|
//void tscGetResultColumnChr(SSqlRes *pRes, SFieldInfo* pFieldInfo, int32_t column);
|
||||||
|
|
||||||
|
static FORCE_INLINE void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pFieldInfo, int32_t columnIndex) {
|
||||||
|
SFieldSupInfo* pInfo = TARRAY_GET_ELEM(pFieldInfo->pSupportInfo, columnIndex);
|
||||||
|
assert(pInfo->pSqlExpr != NULL);
|
||||||
|
|
||||||
|
int32_t type = pInfo->pSqlExpr->resType;
|
||||||
|
int32_t bytes = pInfo->pSqlExpr->resBytes;
|
||||||
|
|
||||||
|
char* pData = pRes->data + pInfo->pSqlExpr->offset * pRes->numOfRows + bytes * pRes->row;
|
||||||
|
|
||||||
|
if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
int32_t realLen = varDataLen(pData);
|
||||||
|
assert(realLen <= bytes - VARSTR_HEADER_SIZE);
|
||||||
|
|
||||||
|
if (isNull(pData, type)) {
|
||||||
|
pRes->tsrow[columnIndex] = NULL;
|
||||||
|
} else {
|
||||||
|
pRes->tsrow[columnIndex] = ((tstr*)pData)->data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (realLen < pInfo->pSqlExpr->resBytes - VARSTR_HEADER_SIZE) { // todo refactor
|
||||||
|
*(pData + realLen + VARSTR_HEADER_SIZE) = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRes->length[columnIndex] = realLen;
|
||||||
|
} else {
|
||||||
|
assert(bytes == tDataTypeDesc[type].nSize);
|
||||||
|
|
||||||
|
if (isNull(pData, type)) {
|
||||||
|
pRes->tsrow[columnIndex] = NULL;
|
||||||
|
} else {
|
||||||
|
pRes->tsrow[columnIndex] = pData;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRes->length[columnIndex] = bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
extern void * tscCacheHandle;
|
extern void * tscCacheHandle;
|
||||||
extern void * tscTmr;
|
extern void * tscTmr;
|
||||||
|
|
|
@ -2952,10 +2952,14 @@ static void tag_project_function(SQLFunctionCtx *pCtx) {
|
||||||
INC_INIT_VAL(pCtx, pCtx->size);
|
INC_INIT_VAL(pCtx, pCtx->size);
|
||||||
|
|
||||||
assert(pCtx->inputBytes == pCtx->outputBytes);
|
assert(pCtx->inputBytes == pCtx->outputBytes);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
tVariantDump(&pCtx->tag, pCtx->aOutputBuf, pCtx->outputType, true);
|
||||||
tVariantDump(&pCtx->tag, pCtx->aOutputBuf, pCtx->outputType, true);
|
char* data = pCtx->aOutputBuf;
|
||||||
|
pCtx->aOutputBuf += pCtx->outputBytes;
|
||||||
|
|
||||||
|
// directly copy from the first one
|
||||||
|
for (int32_t i = 1; i < pCtx->size; ++i) {
|
||||||
|
memmove(pCtx->aOutputBuf, data, pCtx->outputBytes);
|
||||||
pCtx->aOutputBuf += pCtx->outputBytes;
|
pCtx->aOutputBuf += pCtx->outputBytes;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3941,7 +3945,7 @@ static void ts_comp_finalize(SQLFunctionCtx *pCtx) {
|
||||||
tsBufFlush(pTSbuf);
|
tsBufFlush(pTSbuf);
|
||||||
strcpy(pCtx->aOutputBuf, pTSbuf->path);
|
strcpy(pCtx->aOutputBuf, pTSbuf->path);
|
||||||
|
|
||||||
tsBufDestory(pTSbuf);
|
tsBufDestroy(pTSbuf);
|
||||||
doFinalizer(pCtx);
|
doFinalizer(pCtx);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -274,6 +274,10 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd
|
||||||
pReducer->numOfBuffer = idx;
|
pReducer->numOfBuffer = idx;
|
||||||
|
|
||||||
SCompareParam *param = malloc(sizeof(SCompareParam));
|
SCompareParam *param = malloc(sizeof(SCompareParam));
|
||||||
|
if (param == NULL) {
|
||||||
|
tfree(pReducer);
|
||||||
|
return;
|
||||||
|
}
|
||||||
param->pLocalData = pReducer->pLocalDataSrc;
|
param->pLocalData = pReducer->pLocalDataSrc;
|
||||||
param->pDesc = pReducer->pDesc;
|
param->pDesc = pReducer->pDesc;
|
||||||
param->num = pReducer->pLocalDataSrc[0]->pMemBuffer->numOfElemsPerPage;
|
param->num = pReducer->pLocalDataSrc[0]->pMemBuffer->numOfElemsPerPage;
|
||||||
|
@ -284,6 +288,7 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd
|
||||||
|
|
||||||
pRes->code = tLoserTreeCreate(&pReducer->pLoserTree, pReducer->numOfBuffer, param, treeComparator);
|
pRes->code = tLoserTreeCreate(&pReducer->pLoserTree, pReducer->numOfBuffer, param, treeComparator);
|
||||||
if (pReducer->pLoserTree == NULL || pRes->code != 0) {
|
if (pReducer->pLoserTree == NULL || pRes->code != 0) {
|
||||||
|
tfree(param);
|
||||||
tfree(pReducer);
|
tfree(pReducer);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -332,6 +337,8 @@ void tscCreateLocalReducer(tExtMemBuffer **pMemBuffer, int32_t numOfBuffer, tOrd
|
||||||
tfree(pReducer->pResultBuf);
|
tfree(pReducer->pResultBuf);
|
||||||
tfree(pReducer->pFinalRes);
|
tfree(pReducer->pFinalRes);
|
||||||
tfree(pReducer->prevRowOfInput);
|
tfree(pReducer->prevRowOfInput);
|
||||||
|
tfree(pReducer->pLoserTree);
|
||||||
|
tfree(param);
|
||||||
tfree(pReducer);
|
tfree(pReducer);
|
||||||
pRes->code = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
pRes->code = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -175,7 +175,6 @@ static int32_t handlePassword(SSqlCmd* pCmd, SSQLToken* pPwd) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo handle memory leak in error handle function
|
|
||||||
int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
int32_t tscToSQLCmd(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
||||||
if (pInfo == NULL || pSql == NULL || pSql->signature != pSql) {
|
if (pInfo == NULL || pSql == NULL || pSql->signature != pSql) {
|
||||||
return TSDB_CODE_TSC_APP_ERROR;
|
return TSDB_CODE_TSC_APP_ERROR;
|
||||||
|
|
|
@ -403,7 +403,7 @@ TAOS_ROW taos_fetch_row(TAOS_RES *res) {
|
||||||
taos_fetch_rows_a(res, waitForRetrieveRsp, pSql->pTscObj);
|
taos_fetch_rows_a(res, waitForRetrieveRsp, pSql->pTscObj);
|
||||||
sem_wait(&pSql->rspSem);
|
sem_wait(&pSql->rspSem);
|
||||||
}
|
}
|
||||||
|
|
||||||
return doSetResultRowData(pSql, true);
|
return doSetResultRowData(pSql, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -255,6 +255,9 @@ static void tscProcessStreamRetrieveResult(void *param, TAOS_RES *res, int numOf
|
||||||
// release the metric/meter meta information reference, so data in cache can be updated
|
// release the metric/meter meta information reference, so data in cache can be updated
|
||||||
|
|
||||||
taosCacheRelease(tscCacheHandle, (void**)&(pTableMetaInfo->pTableMeta), false);
|
taosCacheRelease(tscCacheHandle, (void**)&(pTableMetaInfo->pTableMeta), false);
|
||||||
|
tscFreeSqlResult(pSql);
|
||||||
|
tfree(pSql->pSubs);
|
||||||
|
pSql->numOfSubs = 0;
|
||||||
tfree(pTableMetaInfo->vgroupList);
|
tfree(pTableMetaInfo->vgroupList);
|
||||||
tscSetNextLaunchTimer(pStream, pSql);
|
tscSetNextLaunchTimer(pStream, pSql);
|
||||||
}
|
}
|
||||||
|
|
|
@ -152,8 +152,8 @@ static int64_t doTSBlockIntersect(SSqlObj* pSql, SJoinSupporter* pSupporter1, SJ
|
||||||
tsBufFlush(output1);
|
tsBufFlush(output1);
|
||||||
tsBufFlush(output2);
|
tsBufFlush(output2);
|
||||||
|
|
||||||
tsBufDestory(pSupporter1->pTSBuf);
|
tsBufDestroy(pSupporter1->pTSBuf);
|
||||||
tsBufDestory(pSupporter2->pTSBuf);
|
tsBufDestroy(pSupporter2->pTSBuf);
|
||||||
|
|
||||||
tscDebug("%p input1:%" PRId64 ", input2:%" PRId64 ", final:%" PRId64 " for secondary query after ts blocks "
|
tscDebug("%p input1:%" PRId64 ", input2:%" PRId64 ", final:%" PRId64 " for secondary query after ts blocks "
|
||||||
"intersecting, skey:%" PRId64 ", ekey:%" PRId64, pSql, numOfInput1, numOfInput2, output1->numOfTotal,
|
"intersecting, skey:%" PRId64 ", ekey:%" PRId64, pSql, numOfInput1, numOfInput2, output1->numOfTotal,
|
||||||
|
@ -762,7 +762,7 @@ static void tsCompRetrieveCallback(void* param, TAOS_RES* tres, int32_t numOfRow
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
|
|
||||||
tsBufMerge(pSupporter->pTSBuf, pBuf, pTableMetaInfo->vgroupIndex);
|
tsBufMerge(pSupporter->pTSBuf, pBuf, pTableMetaInfo->vgroupIndex);
|
||||||
tsBufDestory(pBuf);
|
tsBufDestroy(pBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// continue to retrieve ts-comp data from vnode
|
// continue to retrieve ts-comp data from vnode
|
||||||
|
@ -1447,9 +1447,7 @@ int32_t tscHandleMasterSTableQuery(SSqlObj *pSql) {
|
||||||
static void tscFreeSubSqlObj(SRetrieveSupport *trsupport, SSqlObj *pSql) {
|
static void tscFreeSubSqlObj(SRetrieveSupport *trsupport, SSqlObj *pSql) {
|
||||||
tscDebug("%p start to free subquery result", pSql);
|
tscDebug("%p start to free subquery result", pSql);
|
||||||
|
|
||||||
if (pSql->res.code == TSDB_CODE_SUCCESS) {
|
taos_free_result(pSql);
|
||||||
taos_free_result(pSql);
|
|
||||||
}
|
|
||||||
|
|
||||||
tfree(trsupport->localBuffer);
|
tfree(trsupport->localBuffer);
|
||||||
|
|
||||||
|
@ -1780,6 +1778,7 @@ static SSqlObj *tscCreateSqlObjForSubquery(SSqlObj *pSql, SRetrieveSupport *trsu
|
||||||
pSql->pSubs[trsupport->subqueryIndex] = pNew;
|
pSql->pSubs[trsupport->subqueryIndex] = pNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
printf("------------alloc:%p\n", pNew);
|
||||||
return pNew;
|
return pNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2108,9 +2107,9 @@ static char *getArithemicInputSrc(void *param, const char *name, int32_t colId)
|
||||||
void **doSetResultRowData(SSqlObj *pSql, bool finalResult) {
|
void **doSetResultRowData(SSqlObj *pSql, bool finalResult) {
|
||||||
SSqlCmd *pCmd = &pSql->cmd;
|
SSqlCmd *pCmd = &pSql->cmd;
|
||||||
SSqlRes *pRes = &pSql->res;
|
SSqlRes *pRes = &pSql->res;
|
||||||
|
|
||||||
assert(pRes->row >= 0 && pRes->row <= pRes->numOfRows);
|
assert(pRes->row >= 0 && pRes->row <= pRes->numOfRows);
|
||||||
|
|
||||||
if(pCmd->command == TSDB_SQL_TABLE_JOIN_RETRIEVE) {
|
if(pCmd->command == TSDB_SQL_TABLE_JOIN_RETRIEVE) {
|
||||||
if (pRes->completed) {
|
if (pRes->completed) {
|
||||||
tfree(pRes->tsrow);
|
tfree(pRes->tsrow);
|
||||||
|
@ -2118,29 +2117,31 @@ void **doSetResultRowData(SSqlObj *pSql, bool finalResult) {
|
||||||
|
|
||||||
return pRes->tsrow;
|
return pRes->tsrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRes->row >= pRes->numOfRows) { // all the results has returned to invoker
|
if (pRes->row >= pRes->numOfRows) { // all the results has returned to invoker
|
||||||
tfree(pRes->tsrow);
|
tfree(pRes->tsrow);
|
||||||
return pRes->tsrow;
|
return pRes->tsrow;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex);
|
SQueryInfo *pQueryInfo = tscGetQueryInfoDetail(pCmd, pCmd->clauseIndex);
|
||||||
|
|
||||||
size_t size = tscNumOfFields(pQueryInfo);
|
size_t size = tscNumOfFields(pQueryInfo);
|
||||||
for (int i = 0; i < size; ++i) {
|
for (int i = 0; i < size; ++i) {
|
||||||
SFieldSupInfo* pSup = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, i);
|
SFieldSupInfo* pSup = TARRAY_GET_ELEM(pQueryInfo->fieldsInfo.pSupportInfo, i);
|
||||||
if (pSup->pSqlExpr != NULL) {
|
if (pSup->pSqlExpr != NULL) {
|
||||||
tscGetResultColumnChr(pRes, &pQueryInfo->fieldsInfo, i);
|
tscGetResultColumnChr(pRes, &pQueryInfo->fieldsInfo, i);
|
||||||
}
|
}
|
||||||
|
|
||||||
// primary key column cannot be null in interval query, no need to check
|
// primary key column cannot be null in interval query, no need to check
|
||||||
if (i == 0 && pQueryInfo->intervalTime > 0) {
|
if (i == 0 && pQueryInfo->intervalTime > 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_FIELD *pField = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
|
TAOS_FIELD *pField = TARRAY_GET_ELEM(pQueryInfo->fieldsInfo.pFields, i);
|
||||||
transferNcharData(pSql, i, pField);
|
if (pRes->tsrow[i] != NULL && pField->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
transferNcharData(pSql, i, pField);
|
||||||
|
}
|
||||||
|
|
||||||
// calculate the result from several other columns
|
// calculate the result from several other columns
|
||||||
if (pSup->pArithExprInfo != NULL) {
|
if (pSup->pArithExprInfo != NULL) {
|
||||||
if (pRes->pArithSup == NULL) {
|
if (pRes->pArithSup == NULL) {
|
||||||
|
@ -2150,10 +2151,10 @@ void **doSetResultRowData(SSqlObj *pSql, bool finalResult) {
|
||||||
sas->numOfCols = tscSqlExprNumOfExprs(pQueryInfo);
|
sas->numOfCols = tscSqlExprNumOfExprs(pQueryInfo);
|
||||||
sas->exprList = pQueryInfo->exprList;
|
sas->exprList = pQueryInfo->exprList;
|
||||||
sas->data = calloc(sas->numOfCols, POINTER_BYTES);
|
sas->data = calloc(sas->numOfCols, POINTER_BYTES);
|
||||||
|
|
||||||
pRes->pArithSup = sas;
|
pRes->pArithSup = sas;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pRes->buffer[i] == NULL) {
|
if (pRes->buffer[i] == NULL) {
|
||||||
TAOS_FIELD* field = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
|
TAOS_FIELD* field = tscFieldInfoGetField(&pQueryInfo->fieldsInfo, i);
|
||||||
pRes->buffer[i] = malloc(field->bytes);
|
pRes->buffer[i] = malloc(field->bytes);
|
||||||
|
@ -2163,13 +2164,13 @@ void **doSetResultRowData(SSqlObj *pSql, bool finalResult) {
|
||||||
SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, k);
|
SSqlExpr* pExpr = tscSqlExprGet(pQueryInfo, k);
|
||||||
pRes->pArithSup->data[k] = (pRes->data + pRes->numOfRows* pExpr->offset) + pRes->row*pExpr->resBytes;
|
pRes->pArithSup->data[k] = (pRes->data + pRes->numOfRows* pExpr->offset) + pRes->row*pExpr->resBytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
tExprTreeCalcTraverse(pRes->pArithSup->pArithExpr->pExpr, 1, pRes->buffer[i], pRes->pArithSup,
|
tExprTreeCalcTraverse(pRes->pArithSup->pArithExpr->pExpr, 1, pRes->buffer[i], pRes->pArithSup,
|
||||||
TSDB_ORDER_ASC, getArithemicInputSrc);
|
TSDB_ORDER_ASC, getArithemicInputSrc);
|
||||||
pRes->tsrow[i] = pRes->buffer[i];
|
pRes->tsrow[i] = pRes->buffer[i];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes->row++; // index increase one-step
|
pRes->row++; // index increase one-step
|
||||||
return pRes->tsrow;
|
return pRes->tsrow;
|
||||||
}
|
}
|
||||||
|
|
|
@ -794,7 +794,7 @@ SFieldSupInfo* tscFieldInfoAppend(SFieldInfo* pFieldInfo, TAOS_FIELD* pField) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SFieldSupInfo* tscFieldInfoGetSupp(SFieldInfo* pFieldInfo, int32_t index) {
|
SFieldSupInfo* tscFieldInfoGetSupp(SFieldInfo* pFieldInfo, int32_t index) {
|
||||||
return taosArrayGet(pFieldInfo->pSupportInfo, index);
|
return TARRAY_GET_ELEM(pFieldInfo->pSupportInfo, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
SFieldSupInfo* tscFieldInfoInsert(SFieldInfo* pFieldInfo, int32_t index, TAOS_FIELD* field) {
|
SFieldSupInfo* tscFieldInfoInsert(SFieldInfo* pFieldInfo, int32_t index, TAOS_FIELD* field) {
|
||||||
|
@ -858,11 +858,9 @@ void tscFieldInfoCopy(SFieldInfo* dst, const SFieldInfo* src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TAOS_FIELD* tscFieldInfoGetField(SFieldInfo* pFieldInfo, int32_t index) {
|
TAOS_FIELD* tscFieldInfoGetField(SFieldInfo* pFieldInfo, int32_t index) {
|
||||||
return taosArrayGet(pFieldInfo->pFields, index);
|
return TARRAY_GET_ELEM(pFieldInfo->pFields, index);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tscNumOfFields(SQueryInfo* pQueryInfo) { return pQueryInfo->fieldsInfo.numOfOutput; }
|
|
||||||
|
|
||||||
int16_t tscFieldInfoGetOffset(SQueryInfo* pQueryInfo, int32_t index) {
|
int16_t tscFieldInfoGetOffset(SQueryInfo* pQueryInfo, int32_t index) {
|
||||||
SFieldSupInfo* pInfo = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, index);
|
SFieldSupInfo* pInfo = tscFieldInfoGetSupp(&pQueryInfo->fieldsInfo, index);
|
||||||
assert(pInfo != NULL);
|
assert(pInfo != NULL);
|
||||||
|
@ -1546,7 +1544,7 @@ static void freeQueryInfoImpl(SQueryInfo* pQueryInfo) {
|
||||||
pQueryInfo->groupbyExpr.columnInfo = NULL;
|
pQueryInfo->groupbyExpr.columnInfo = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryInfo->tsBuf = tsBufDestory(pQueryInfo->tsBuf);
|
pQueryInfo->tsBuf = tsBufDestroy(pQueryInfo->tsBuf);
|
||||||
|
|
||||||
tfree(pQueryInfo->fillVal);
|
tfree(pQueryInfo->fillVal);
|
||||||
}
|
}
|
||||||
|
@ -1822,7 +1820,6 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
STableMeta* pPrevTableMeta = taosCacheTransfer(tscCacheHandle, (void**)&pPrevInfo->pTableMeta);
|
STableMeta* pPrevTableMeta = taosCacheTransfer(tscCacheHandle, (void**)&pPrevInfo->pTableMeta);
|
||||||
|
|
||||||
SVgroupsInfo* pVgroupsInfo = pPrevInfo->vgroupList;
|
SVgroupsInfo* pVgroupsInfo = pPrevInfo->vgroupList;
|
||||||
pPrevInfo->vgroupList = NULL;
|
|
||||||
pFinalInfo = tscAddTableMetaInfo(pNewQueryInfo, name, pPrevTableMeta, pVgroupsInfo, pTableMetaInfo->tagColList);
|
pFinalInfo = tscAddTableMetaInfo(pNewQueryInfo, name, pPrevTableMeta, pVgroupsInfo, pTableMetaInfo->tagColList);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2086,42 +2083,42 @@ void tscTryQueryNextClause(SSqlObj* pSql, void (*queryFp)()) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pFieldInfo, int32_t columnIndex) {
|
//void tscGetResultColumnChr(SSqlRes* pRes, SFieldInfo* pFieldInfo, int32_t columnIndex) {
|
||||||
SFieldSupInfo* pInfo = taosArrayGet(pFieldInfo->pSupportInfo, columnIndex);
|
// SFieldSupInfo* pInfo = TARRAY_GET_ELEM(pFieldInfo->pSupportInfo, columnIndex);
|
||||||
assert(pInfo->pSqlExpr != NULL);
|
// assert(pInfo->pSqlExpr != NULL);
|
||||||
|
//
|
||||||
int32_t type = pInfo->pSqlExpr->resType;
|
// int32_t type = pInfo->pSqlExpr->resType;
|
||||||
int32_t bytes = pInfo->pSqlExpr->resBytes;
|
// int32_t bytes = pInfo->pSqlExpr->resBytes;
|
||||||
|
//
|
||||||
char* pData = pRes->data + pInfo->pSqlExpr->offset * pRes->numOfRows + bytes * pRes->row;
|
// char* pData = pRes->data + pInfo->pSqlExpr->offset * pRes->numOfRows + bytes * pRes->row;
|
||||||
|
//
|
||||||
if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
|
// if (type == TSDB_DATA_TYPE_NCHAR || type == TSDB_DATA_TYPE_BINARY) {
|
||||||
int32_t realLen = varDataLen(pData);
|
// int32_t realLen = varDataLen(pData);
|
||||||
assert(realLen <= bytes - VARSTR_HEADER_SIZE);
|
// assert(realLen <= bytes - VARSTR_HEADER_SIZE);
|
||||||
|
//
|
||||||
if (isNull(pData, type)) {
|
// if (isNull(pData, type)) {
|
||||||
pRes->tsrow[columnIndex] = NULL;
|
// pRes->tsrow[columnIndex] = NULL;
|
||||||
} else {
|
// } else {
|
||||||
pRes->tsrow[columnIndex] = ((tstr*)pData)->data;
|
// pRes->tsrow[columnIndex] = ((tstr*)pData)->data;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
if (realLen < pInfo->pSqlExpr->resBytes - VARSTR_HEADER_SIZE) { // todo refactor
|
// if (realLen < pInfo->pSqlExpr->resBytes - VARSTR_HEADER_SIZE) { // todo refactor
|
||||||
*(pData + realLen + VARSTR_HEADER_SIZE) = 0;
|
// *(pData + realLen + VARSTR_HEADER_SIZE) = 0;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
pRes->length[columnIndex] = realLen;
|
// pRes->length[columnIndex] = realLen;
|
||||||
} else {
|
// } else {
|
||||||
assert(bytes == tDataTypeDesc[type].nSize);
|
// assert(bytes == tDataTypeDesc[type].nSize);
|
||||||
|
//
|
||||||
if (isNull(pData, type)) {
|
// if (isNull(pData, type)) {
|
||||||
pRes->tsrow[columnIndex] = NULL;
|
// pRes->tsrow[columnIndex] = NULL;
|
||||||
} else {
|
// } else {
|
||||||
pRes->tsrow[columnIndex] = pData;
|
// pRes->tsrow[columnIndex] = pData;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
pRes->length[columnIndex] = bytes;
|
// pRes->length[columnIndex] = bytes;
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
void* malloc_throw(size_t size) {
|
void* malloc_throw(size_t size) {
|
||||||
void* p = malloc(size);
|
void* p = malloc(size);
|
||||||
|
|
|
@ -129,7 +129,7 @@ int32_t tsMnodeEqualVnodeNum = 4;
|
||||||
int32_t tsEnableHttpModule = 1;
|
int32_t tsEnableHttpModule = 1;
|
||||||
int32_t tsRestRowLimit = 10240;
|
int32_t tsRestRowLimit = 10240;
|
||||||
uint16_t tsHttpPort = 6020; // only tcp, range tcp[6020]
|
uint16_t tsHttpPort = 6020; // only tcp, range tcp[6020]
|
||||||
int32_t tsHttpCacheSessions = 100;
|
int32_t tsHttpCacheSessions = 1000;
|
||||||
int32_t tsHttpSessionExpire = 36000;
|
int32_t tsHttpSessionExpire = 36000;
|
||||||
int32_t tsHttpMaxThreads = 2;
|
int32_t tsHttpMaxThreads = 2;
|
||||||
int32_t tsHttpEnableCompress = 0;
|
int32_t tsHttpEnableCompress = 0;
|
||||||
|
@ -560,7 +560,7 @@ static void doInitGlobalConfig() {
|
||||||
cfg.ptr = &tsMinIntervalTime;
|
cfg.ptr = &tsMinIntervalTime;
|
||||||
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
|
||||||
cfg.minValue = 10;
|
cfg.minValue = 1;
|
||||||
cfg.maxValue = 1000000;
|
cfg.maxValue = 1000000;
|
||||||
cfg.ptrLength = 0;
|
cfg.ptrLength = 0;
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_MS;
|
cfg.unitType = TAOS_CFG_UTYPE_MS;
|
||||||
|
|
|
@ -82,7 +82,7 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, in
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t start = ((startTime - intervalTime) / slidingTime + 1) * slidingTime;
|
int64_t start = ((startTime - intervalTime) / slidingTime + 1) * slidingTime;
|
||||||
if (!(timeUnit == 'a' || timeUnit == 'm' || timeUnit == 's' || timeUnit == 'h')) {
|
if (!(timeUnit == 'u' || timeUnit == 'a' || timeUnit == 'm' || timeUnit == 's' || timeUnit == 'h')) {
|
||||||
/*
|
/*
|
||||||
* here we revised the start time of day according to the local time zone,
|
* here we revised the start time of day according to the local time zone,
|
||||||
* but in case of DST, the start time of one day need to be dynamically decided.
|
* but in case of DST, the start time of one day need to be dynamically decided.
|
||||||
|
|
|
@ -367,31 +367,31 @@ bool isValidDataType(int32_t type) {
|
||||||
return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_NCHAR;
|
return type >= TSDB_DATA_TYPE_NULL && type <= TSDB_DATA_TYPE_NCHAR;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isNull(const char *val, int32_t type) {
|
//bool isNull(const char *val, int32_t type) {
|
||||||
switch (type) {
|
// switch (type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
// case TSDB_DATA_TYPE_BOOL:
|
||||||
return *(uint8_t *)val == TSDB_DATA_BOOL_NULL;
|
// return *(uint8_t *)val == TSDB_DATA_BOOL_NULL;
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
// case TSDB_DATA_TYPE_TINYINT:
|
||||||
return *(uint8_t *)val == TSDB_DATA_TINYINT_NULL;
|
// return *(uint8_t *)val == TSDB_DATA_TINYINT_NULL;
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
// case TSDB_DATA_TYPE_SMALLINT:
|
||||||
return *(uint16_t *)val == TSDB_DATA_SMALLINT_NULL;
|
// return *(uint16_t *)val == TSDB_DATA_SMALLINT_NULL;
|
||||||
case TSDB_DATA_TYPE_INT:
|
// case TSDB_DATA_TYPE_INT:
|
||||||
return *(uint32_t *)val == TSDB_DATA_INT_NULL;
|
// return *(uint32_t *)val == TSDB_DATA_INT_NULL;
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
// case TSDB_DATA_TYPE_BIGINT:
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
// case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
return *(uint64_t *)val == TSDB_DATA_BIGINT_NULL;
|
// return *(uint64_t *)val == TSDB_DATA_BIGINT_NULL;
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
// case TSDB_DATA_TYPE_FLOAT:
|
||||||
return *(uint32_t *)val == TSDB_DATA_FLOAT_NULL;
|
// return *(uint32_t *)val == TSDB_DATA_FLOAT_NULL;
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
// case TSDB_DATA_TYPE_DOUBLE:
|
||||||
return *(uint64_t *)val == TSDB_DATA_DOUBLE_NULL;
|
// return *(uint64_t *)val == TSDB_DATA_DOUBLE_NULL;
|
||||||
case TSDB_DATA_TYPE_NCHAR:
|
// case TSDB_DATA_TYPE_NCHAR:
|
||||||
return *(uint32_t*) varDataVal(val) == TSDB_DATA_NCHAR_NULL;
|
// return *(uint32_t*) varDataVal(val) == TSDB_DATA_NCHAR_NULL;
|
||||||
case TSDB_DATA_TYPE_BINARY:
|
// case TSDB_DATA_TYPE_BINARY:
|
||||||
return *(uint8_t *) varDataVal(val) == TSDB_DATA_BINARY_NULL;
|
// return *(uint8_t *) varDataVal(val) == TSDB_DATA_BINARY_NULL;
|
||||||
default:
|
// default:
|
||||||
return false;
|
// return false;
|
||||||
};
|
// };
|
||||||
}
|
//}
|
||||||
|
|
||||||
void setVardataNull(char* val, int32_t type) {
|
void setVardataNull(char* val, int32_t type) {
|
||||||
if (type == TSDB_DATA_TYPE_BINARY) {
|
if (type == TSDB_DATA_TYPE_BINARY) {
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
ulimit -c unlimited
|
|
||||||
|
|
||||||
function buildTDengine {
|
|
||||||
cd /root/TDengine
|
|
||||||
|
|
||||||
git remote update
|
|
||||||
REMOTE_COMMIT=`git rev-parse --short remotes/origin/develop`
|
|
||||||
LOCAL_COMMIT=`git rev-parse --short @`
|
|
||||||
|
|
||||||
echo " LOCAL: $LOCAL_COMMIT"
|
|
||||||
echo "REMOTE: $REMOTE_COMMIT"
|
|
||||||
if [ "$LOCAL_COMMIT" == "$REMOTE_COMMIT" ]; then
|
|
||||||
echo "repo up-to-date"
|
|
||||||
else
|
|
||||||
echo "repo need to pull"
|
|
||||||
git pull
|
|
||||||
|
|
||||||
LOCAL_COMMIT=`git rev-parse --short @`
|
|
||||||
cd /root/TDengine/debug
|
|
||||||
rm -rf /root/TDengine/debug/*
|
|
||||||
cmake ..
|
|
||||||
make > /dev/null
|
|
||||||
make install
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
function restartTaosd {
|
|
||||||
systemctl stop taosd
|
|
||||||
pkill -KILL -x taosd
|
|
||||||
sleep 10
|
|
||||||
|
|
||||||
logDir=`grep 'logDir' /etc/taos/taos.cfg|awk 'END{print $2}'`
|
|
||||||
dataDir=`grep 'dataDir' /etc/taos/taos.cfg|awk '{print $2}'`
|
|
||||||
|
|
||||||
rm -rf $logDir/*
|
|
||||||
rm -rf $dataDir/*
|
|
||||||
|
|
||||||
taosd 2>&1 > /dev/null &
|
|
||||||
sleep 10
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTDengine
|
|
||||||
restartTaosd
|
|
|
@ -0,0 +1,236 @@
|
||||||
|
package com.taosdata.jdbc.utils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
|
|
||||||
|
public class TDNode {
|
||||||
|
|
||||||
|
private int index;
|
||||||
|
private int running;
|
||||||
|
private int deployed;
|
||||||
|
private boolean testCluster;
|
||||||
|
private String path;
|
||||||
|
private String cfgDir;
|
||||||
|
private String dataDir;
|
||||||
|
private String logDir;
|
||||||
|
private String cfgPath;
|
||||||
|
|
||||||
|
public TDNode(int index) {
|
||||||
|
this.index = index;
|
||||||
|
running = 0;
|
||||||
|
deployed = 0;
|
||||||
|
testCluster = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPath(String path) {
|
||||||
|
this.path = path;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTestCluster(boolean testCluster) {
|
||||||
|
this.testCluster = testCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void searchTaosd(File dir, ArrayList<String> taosdPath) {
|
||||||
|
File[] fileList = dir.listFiles();
|
||||||
|
|
||||||
|
if(fileList == null || fileList.length == 0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
for(File file : fileList) {
|
||||||
|
if(file.isFile()) {
|
||||||
|
if(file.getName().equals("taosd")) {
|
||||||
|
taosdPath.add(file.getAbsolutePath());
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
searchTaosd(file, taosdPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start() {
|
||||||
|
String selfPath = System.getProperty("user.dir");
|
||||||
|
String binPath = "";
|
||||||
|
String projDir = selfPath + "/../../../";
|
||||||
|
|
||||||
|
try {
|
||||||
|
ArrayList<String> taosdPath = new ArrayList<>();
|
||||||
|
|
||||||
|
File dir = new File(projDir);
|
||||||
|
String realProjDir = dir.getCanonicalPath();
|
||||||
|
dir = new File(realProjDir);
|
||||||
|
System.out.println("project Dir: " + projDir);
|
||||||
|
searchTaosd(dir, taosdPath);
|
||||||
|
|
||||||
|
if(taosdPath.size() == 0) {
|
||||||
|
System.out.println("The project path doens't exist");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
for(String p : taosdPath) {
|
||||||
|
if(!p.contains("packaging")) {
|
||||||
|
binPath = p;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(binPath.isEmpty()) {
|
||||||
|
System.out.println("taosd not found");
|
||||||
|
return;
|
||||||
|
} else {
|
||||||
|
System.out.println("taosd found in " + binPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.deployed == 0) {
|
||||||
|
System.out.println("dnode" + index + "is not deployed");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
String cmd = "nohup " + binPath + " -c " + cfgDir + " > /dev/null 2>&1 & ";
|
||||||
|
System.out.println("start taosd cmd: " + cmd);
|
||||||
|
|
||||||
|
try{
|
||||||
|
Runtime.getRuntime().exec(cmd);
|
||||||
|
TimeUnit.SECONDS.sleep(5);
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.running = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop() {
|
||||||
|
String toBeKilled = "taosd";
|
||||||
|
|
||||||
|
if (this.running != 0) {
|
||||||
|
String killCmd = "pkill -kill -x " + toBeKilled;
|
||||||
|
String[] killCmds = {"sh", "-c", killCmd};
|
||||||
|
try {
|
||||||
|
Runtime.getRuntime().exec(killCmds).waitFor();
|
||||||
|
|
||||||
|
for(int port = 6030; port < 6041; port ++) {
|
||||||
|
String fuserCmd = "fuser -k -n tcp " + port;
|
||||||
|
Runtime.getRuntime().exec(fuserCmd).waitFor();
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.running = 0;
|
||||||
|
System.out.println("dnode:" + this.index + " is stopped by pkill");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startIP() {
|
||||||
|
try{
|
||||||
|
String cmd = "sudo ifconfig lo:" + index + "192.168.0." + index + " up";
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopIP() {
|
||||||
|
try{
|
||||||
|
String cmd = "sudo ifconfig lo:" + index + "192.168.0." + index + " down";
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setCfgConfig(String option, String value) {
|
||||||
|
try{
|
||||||
|
String cmd = "echo " + option + " " + value + " >> " + this.cfgPath;
|
||||||
|
String[] cmdLine = {"sh", "-c", cmd};
|
||||||
|
Process ps = Runtime.getRuntime().exec(cmdLine);
|
||||||
|
ps.waitFor();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDnodeRootDir() {
|
||||||
|
String dnodeRootDir = this.path + "/sim/psim/dnode" + this.index;
|
||||||
|
return dnodeRootDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDnodesRootDir() {
|
||||||
|
String dnodesRootDir = this.path + "/sim/psim" + this.index;
|
||||||
|
return dnodesRootDir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deploy() {
|
||||||
|
this.logDir = this.path + "/sim/dnode" + this.index + "/log";
|
||||||
|
this.dataDir = this.path + "/sim/dnode" + this.index + "/data";
|
||||||
|
this.cfgDir = this.path + "/sim/dnode" + this.index + "/cfg";
|
||||||
|
this.cfgPath = this.path + "/sim/dnode" + this.index + "/cfg/taos.cfg";
|
||||||
|
|
||||||
|
try {
|
||||||
|
String cmd = "rm -rf " + this.logDir;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
|
||||||
|
cmd = "rm -rf " + this.cfgDir;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
|
||||||
|
cmd = "rm -rf " + this.dataDir;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + this.logDir;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + this.cfgDir;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + this.dataDir;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
|
||||||
|
cmd = "touch " + this.cfgPath;
|
||||||
|
Runtime.getRuntime().exec(cmd).waitFor();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(this.testCluster) {
|
||||||
|
startIP();
|
||||||
|
setCfgConfig("masterIp", "192.168.0.1");
|
||||||
|
setCfgConfig("secondIp", "192.168.0.2");
|
||||||
|
setCfgConfig("publicIp", "192.168.0." + this.index);
|
||||||
|
setCfgConfig("internalIp", "192.168.0." + this.index);
|
||||||
|
setCfgConfig("privateIp", "192.168.0." + this.index);
|
||||||
|
}
|
||||||
|
setCfgConfig("dataDir", this.dataDir);
|
||||||
|
setCfgConfig("logDir", this.logDir);
|
||||||
|
setCfgConfig("numOfLogLines", "1000000/00");
|
||||||
|
setCfgConfig("mnodeEqualVnodeNum", "0");
|
||||||
|
setCfgConfig("walLevel", "1");
|
||||||
|
setCfgConfig("statusInterval", "1");
|
||||||
|
setCfgConfig("numOfTotalVnodes", "64");
|
||||||
|
setCfgConfig("numOfMnodes", "3");
|
||||||
|
setCfgConfig("numOfThreadsPerCore", "2.0");
|
||||||
|
setCfgConfig("monitor", "0");
|
||||||
|
setCfgConfig("maxVnodeConnections", "30000");
|
||||||
|
setCfgConfig("maxMgmtConnections", "30000");
|
||||||
|
setCfgConfig("maxMeterConnections", "30000");
|
||||||
|
setCfgConfig("maxShellConns", "30000");
|
||||||
|
setCfgConfig("locale", "en_US.UTF-8");
|
||||||
|
setCfgConfig("charset", "UTF-8");
|
||||||
|
setCfgConfig("asyncLog", "0");
|
||||||
|
setCfgConfig("anyIp", "0");
|
||||||
|
setCfgConfig("dDebugFlag", "135");
|
||||||
|
setCfgConfig("mDebugFlag", "135");
|
||||||
|
setCfgConfig("sdbDebugFlag", "135");
|
||||||
|
setCfgConfig("rpcDebugFlag", "135");
|
||||||
|
setCfgConfig("tmrDebugFlag", "131");
|
||||||
|
setCfgConfig("cDebugFlag", "135");
|
||||||
|
setCfgConfig("httpDebugFlag", "135");
|
||||||
|
setCfgConfig("monitorDebugFlag", "135");
|
||||||
|
setCfgConfig("udebugFlag", "135");
|
||||||
|
setCfgConfig("jnidebugFlag", "135");
|
||||||
|
setCfgConfig("qdebugFlag", "135");
|
||||||
|
this.deployed = 1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,94 @@
|
||||||
|
package com.taosdata.jdbc.utils;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
public class TDNodes {
|
||||||
|
private ArrayList<TDNode> tdNodes;
|
||||||
|
private boolean testCluster;
|
||||||
|
|
||||||
|
public TDNodes () {
|
||||||
|
tdNodes = new ArrayList<>();
|
||||||
|
for(int i = 1; i < 11; i ++) {
|
||||||
|
tdNodes.add(new TDNode(i));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPath(String path) {
|
||||||
|
try {
|
||||||
|
String killCmd = "pkill -kill -x taosd";
|
||||||
|
String[] killCmds = {"sh", "-c", killCmd};
|
||||||
|
Runtime.getRuntime().exec(killCmds).waitFor();
|
||||||
|
|
||||||
|
String binPath = System.getProperty("user.dir");
|
||||||
|
binPath += "/../../../debug";
|
||||||
|
System.out.println("binPath: " + binPath);
|
||||||
|
|
||||||
|
File file = new File(path);
|
||||||
|
binPath = file.getCanonicalPath();
|
||||||
|
System.out.println("binPath real path: " + binPath);
|
||||||
|
|
||||||
|
if(path.isEmpty()){
|
||||||
|
file = new File(path + "/../../");
|
||||||
|
path = file.getCanonicalPath();
|
||||||
|
}
|
||||||
|
|
||||||
|
for(int i = 0; i < tdNodes.size(); i++) {
|
||||||
|
tdNodes.get(i).setPath(path);
|
||||||
|
}
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTestCluster(boolean testCluster) {
|
||||||
|
this.testCluster = testCluster;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void check(int index) {
|
||||||
|
if(index < 1 || index > 10) {
|
||||||
|
System.out.println("index: " + index + " should on a scale of [1, 10]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void deploy(int index) {
|
||||||
|
try {
|
||||||
|
File file = new File(System.getProperty("user.dir") + "/../../../");
|
||||||
|
String projectRealPath = file.getCanonicalPath();
|
||||||
|
check(index);
|
||||||
|
tdNodes.get(index - 1).setTestCluster(this.testCluster);
|
||||||
|
tdNodes.get(index - 1).setPath(projectRealPath);
|
||||||
|
tdNodes.get(index - 1).deploy();
|
||||||
|
} catch (Exception e) {
|
||||||
|
e.printStackTrace();
|
||||||
|
System.out.println("deploy Test Exception");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void cfg(int index, String option, String value) {
|
||||||
|
check(index);
|
||||||
|
tdNodes.get(index - 1).setCfgConfig(option, value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void start(int index) {
|
||||||
|
check(index);
|
||||||
|
tdNodes.get(index - 1).start();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stop(int index) {
|
||||||
|
check(index);
|
||||||
|
tdNodes.get(index - 1).stop();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void startIP(int index) {
|
||||||
|
check(index);
|
||||||
|
tdNodes.get(index - 1).startIP();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void stopIP(int index) {
|
||||||
|
check(index);
|
||||||
|
tdNodes.get(index - 1).stopIP();
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -1,27 +1,38 @@
|
||||||
package com.taosdata.jdbc;
|
package com.taosdata.jdbc;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.File;
|
||||||
import java.io.InputStreamReader;
|
import com.taosdata.jdbc.utils.TDNodes;
|
||||||
|
|
||||||
|
import org.junit.AfterClass;
|
||||||
import org.junit.BeforeClass;
|
import org.junit.BeforeClass;
|
||||||
|
|
||||||
public class BaseTest {
|
public class BaseTest {
|
||||||
|
|
||||||
|
private static boolean testCluster = false;
|
||||||
|
private static String deployPath = System.getProperty("user.dir");
|
||||||
|
private static TDNodes tdNodes = new TDNodes();
|
||||||
|
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void setupEnv() {
|
public static void setupEnv() {
|
||||||
try{
|
try{
|
||||||
String path = System.getProperty("user.dir");
|
File file = new File(deployPath + "/../../../");
|
||||||
String bashPath = path + "/buildTDengine.sh";
|
String rootPath = file.getCanonicalPath();
|
||||||
|
|
||||||
|
tdNodes.setPath(rootPath);
|
||||||
|
tdNodes.setTestCluster(testCluster);
|
||||||
|
|
||||||
Process ps = Runtime.getRuntime().exec(bashPath);
|
tdNodes.deploy(1);
|
||||||
ps.waitFor();
|
tdNodes.start(1);
|
||||||
|
|
||||||
BufferedReader br = new BufferedReader(new InputStreamReader(ps.getInputStream()));
|
|
||||||
while(br.readLine() != null) {
|
|
||||||
System.out.println(br.readLine());
|
|
||||||
}
|
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
System.out.println("Base Test Exception");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@AfterClass
|
||||||
|
public static void cleanUpEnv() {
|
||||||
|
tdNodes.stop(1);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -22,6 +22,8 @@ extern "C" {
|
||||||
|
|
||||||
int32_t dnodeInitMgmt();
|
int32_t dnodeInitMgmt();
|
||||||
void dnodeCleanupMgmt();
|
void dnodeCleanupMgmt();
|
||||||
|
int32_t dnodeInitMgmtTimer();
|
||||||
|
void dnodeCleanupMgmtTimer();
|
||||||
void dnodeDispatchToMgmtQueue(SRpcMsg *rpcMsg);
|
void dnodeDispatchToMgmtQueue(SRpcMsg *rpcMsg);
|
||||||
|
|
||||||
void* dnodeGetVnode(int32_t vgId);
|
void* dnodeGetVnode(int32_t vgId);
|
||||||
|
|
|
@ -57,6 +57,7 @@ static const SDnodeComponent tsDnodeComponents[] = {
|
||||||
{"server", dnodeInitServer, dnodeCleanupServer},
|
{"server", dnodeInitServer, dnodeCleanupServer},
|
||||||
{"mgmt", dnodeInitMgmt, dnodeCleanupMgmt},
|
{"mgmt", dnodeInitMgmt, dnodeCleanupMgmt},
|
||||||
{"modules", dnodeInitModules, dnodeCleanupModules},
|
{"modules", dnodeInitModules, dnodeCleanupModules},
|
||||||
|
{"mgmt-tmr",dnodeInitMgmtTimer, dnodeCleanupMgmtTimer},
|
||||||
{"shell", dnodeInitShell, dnodeCleanupShell}
|
{"shell", dnodeInitShell, dnodeCleanupShell}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -147,6 +147,12 @@ int32_t dnodeInitMgmt() {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dInfo("dnode mgmt is initialized");
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dnodeInitMgmtTimer() {
|
||||||
tsDnodeTmr = taosTmrInit(100, 200, 60000, "DND-DM");
|
tsDnodeTmr = taosTmrInit(100, 200, 60000, "DND-DM");
|
||||||
if (tsDnodeTmr == NULL) {
|
if (tsDnodeTmr == NULL) {
|
||||||
dError("failed to init dnode timer");
|
dError("failed to init dnode timer");
|
||||||
|
@ -155,13 +161,11 @@ int32_t dnodeInitMgmt() {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosTmrReset(dnodeSendStatusMsg, 500, NULL, tsDnodeTmr, &tsStatusTimer);
|
taosTmrReset(dnodeSendStatusMsg, 500, NULL, tsDnodeTmr, &tsStatusTimer);
|
||||||
|
dInfo("dnode mgmt timer is initialized");
|
||||||
dInfo("dnode mgmt is initialized");
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void dnodeCleanupMgmt() {
|
void dnodeCleanupMgmtTimer() {
|
||||||
if (tsStatusTimer != NULL) {
|
if (tsStatusTimer != NULL) {
|
||||||
taosTmrStopA(&tsStatusTimer);
|
taosTmrStopA(&tsStatusTimer);
|
||||||
tsStatusTimer = NULL;
|
tsStatusTimer = NULL;
|
||||||
|
@ -171,7 +175,10 @@ void dnodeCleanupMgmt() {
|
||||||
taosTmrCleanUp(tsDnodeTmr);
|
taosTmrCleanUp(tsDnodeTmr);
|
||||||
tsDnodeTmr = NULL;
|
tsDnodeTmr = NULL;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dnodeCleanupMgmt() {
|
||||||
|
dnodeCleanupMgmtTimer();
|
||||||
dnodeCloseVnodes();
|
dnodeCloseVnodes();
|
||||||
|
|
||||||
if (tsMgmtQset) taosQsetThreadResume(tsMgmtQset);
|
if (tsMgmtQset) taosQsetThreadResume(tsMgmtQset);
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "dnodeInt.h"
|
#include "dnodeInt.h"
|
||||||
#include "dnodeMain.h"
|
#include "dnodeMain.h"
|
||||||
|
#include "tfile.h"
|
||||||
|
|
||||||
static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context);
|
static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context);
|
||||||
static sem_t exitSem;
|
static sem_t exitSem;
|
||||||
|
@ -67,6 +68,18 @@ int32_t main(int32_t argc, char *argv[]) {
|
||||||
taosSetAllocMode(TAOS_ALLOC_MODE_DETECT_LEAK, NULL, true);
|
taosSetAllocMode(TAOS_ALLOC_MODE_DETECT_LEAK, NULL, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
else if (strcmp(argv[i], "--random-file-fail-factor") == 0) {
|
||||||
|
if ( (i+1) < argc ) {
|
||||||
|
int factor = atoi(argv[i+1]);
|
||||||
|
printf("The factor of random failure is %d\n", factor);
|
||||||
|
taosSetRandomFileFailFactor(factor);
|
||||||
|
} else {
|
||||||
|
printf("Please specify a number for random failure factor!");
|
||||||
|
exit(EXIT_FAILURE);
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,7 +20,6 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef void* qinfo_t;
|
typedef void* qinfo_t;
|
||||||
typedef void (*_qinfo_free_fn_t)(void*);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create the qinfo object according to QueryTableMsg
|
* create the qinfo object according to QueryTableMsg
|
||||||
|
@ -29,13 +28,8 @@ typedef void (*_qinfo_free_fn_t)(void*);
|
||||||
* @param qinfo
|
* @param qinfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryTableMsg, void* param, _qinfo_free_fn_t fn, qinfo_t* qinfo);
|
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryTableMsg, void* param, qinfo_t* qinfo);
|
||||||
|
|
||||||
/**
|
|
||||||
* Destroy QInfo object
|
|
||||||
* @param qinfo qhandle
|
|
||||||
*/
|
|
||||||
void qDestroyQueryInfo(qinfo_t qinfo);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* the main query execution function, including query on both table and multitables,
|
* the main query execution function, including query on both table and multitables,
|
||||||
|
@ -84,8 +78,14 @@ bool qHasMoreResultsToRetrieve(qinfo_t qinfo);
|
||||||
*/
|
*/
|
||||||
int32_t qKillQuery(qinfo_t qinfo);
|
int32_t qKillQuery(qinfo_t qinfo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* destroy query info structure
|
||||||
|
* @param qHandle
|
||||||
|
*/
|
||||||
|
void qDestroyQueryInfo(qinfo_t qHandle);
|
||||||
|
|
||||||
void* qOpenQueryMgmt(int32_t vgId);
|
void* qOpenQueryMgmt(int32_t vgId);
|
||||||
void qSetQueryMgmtClosed(void* pExecutor);
|
void qQueryMgmtNotifyClosed(void* pExecutor);
|
||||||
void qCleanupQueryMgmt(void* pExecutor);
|
void qCleanupQueryMgmt(void* pExecutor);
|
||||||
void** qRegisterQInfo(void* pMgmt, uint64_t qInfo);
|
void** qRegisterQInfo(void* pMgmt, uint64_t qInfo);
|
||||||
void** qAcquireQInfo(void* pMgmt, uint64_t key);
|
void** qAcquireQInfo(void* pMgmt, uint64_t key);
|
||||||
|
|
|
@ -160,7 +160,32 @@ extern tDataTypeDescriptor tDataTypeDesc[11];
|
||||||
#define POINTER_BYTES sizeof(void *) // 8 by default assert(sizeof(ptrdiff_t) == sizseof(void*)
|
#define POINTER_BYTES sizeof(void *) // 8 by default assert(sizeof(ptrdiff_t) == sizseof(void*)
|
||||||
|
|
||||||
bool isValidDataType(int32_t type);
|
bool isValidDataType(int32_t type);
|
||||||
bool isNull(const char *val, int32_t type);
|
//bool isNull(const char *val, int32_t type);
|
||||||
|
static inline __attribute__((always_inline)) bool isNull(const char *val, int32_t type) {
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
return *(uint8_t *)val == TSDB_DATA_BOOL_NULL;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
return *(uint8_t *)val == TSDB_DATA_TINYINT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
return *(uint16_t *)val == TSDB_DATA_SMALLINT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
return *(uint32_t *)val == TSDB_DATA_INT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
return *(uint64_t *)val == TSDB_DATA_BIGINT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
return *(uint32_t *)val == TSDB_DATA_FLOAT_NULL;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
return *(uint64_t *)val == TSDB_DATA_DOUBLE_NULL;
|
||||||
|
case TSDB_DATA_TYPE_NCHAR:
|
||||||
|
return *(uint32_t*) varDataVal(val) == TSDB_DATA_NCHAR_NULL;
|
||||||
|
case TSDB_DATA_TYPE_BINARY:
|
||||||
|
return *(uint8_t *) varDataVal(val) == TSDB_DATA_BINARY_NULL;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
void setVardataNull(char* val, int32_t type);
|
void setVardataNull(char* val, int32_t type);
|
||||||
void setNull(char *val, int32_t type, int32_t bytes);
|
void setNull(char *val, int32_t type, int32_t bytes);
|
||||||
|
|
|
@ -179,9 +179,14 @@ void mnodeDecDbRef(SDbObj *pDb) {
|
||||||
|
|
||||||
SDbObj *mnodeGetDbByTableId(char *tableId) {
|
SDbObj *mnodeGetDbByTableId(char *tableId) {
|
||||||
char db[TSDB_TABLE_ID_LEN], *pos;
|
char db[TSDB_TABLE_ID_LEN], *pos;
|
||||||
|
|
||||||
|
// tableId format should be : acct.db.table
|
||||||
pos = strstr(tableId, TS_PATH_DELIMITER);
|
pos = strstr(tableId, TS_PATH_DELIMITER);
|
||||||
|
assert(NULL != pos);
|
||||||
|
|
||||||
pos = strstr(pos + 1, TS_PATH_DELIMITER);
|
pos = strstr(pos + 1, TS_PATH_DELIMITER);
|
||||||
|
assert(NULL != pos);
|
||||||
|
|
||||||
memset(db, 0, sizeof(db));
|
memset(db, 0, sizeof(db));
|
||||||
strncpy(db, tableId, pos - tableId);
|
strncpy(db, tableId, pos - tableId);
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ typedef struct {
|
||||||
void (*cleanup)();
|
void (*cleanup)();
|
||||||
} SMnodeComponent;
|
} SMnodeComponent;
|
||||||
|
|
||||||
void *tsMnodeTmr;
|
void *tsMnodeTmr = NULL;
|
||||||
static bool tsMgmtIsRunning = false;
|
static bool tsMgmtIsRunning = false;
|
||||||
|
|
||||||
static const SMnodeComponent tsMnodeComponents[] = {
|
static const SMnodeComponent tsMnodeComponents[] = {
|
||||||
|
|
|
@ -372,7 +372,6 @@ static int32_t mnodeCreateVgroupCb(SMnodeMsg *pMsg, int32_t code) {
|
||||||
pVgroup->vnodeGid[i].dnodeId);
|
pVgroup->vnodeGid[i].dnodeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
mnodeIncVgroupRef(pVgroup);
|
|
||||||
pMsg->expected = pVgroup->numOfVnodes;
|
pMsg->expected = pVgroup->numOfVnodes;
|
||||||
mnodeSendCreateVgroupMsg(pVgroup, pMsg);
|
mnodeSendCreateVgroupMsg(pVgroup, pMsg);
|
||||||
|
|
||||||
|
@ -393,6 +392,9 @@ int32_t mnodeCreateVgroup(SMnodeMsg *pMsg, SDbObj *pDb) {
|
||||||
return TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
return TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pMsg->pVgroup = pVgroup;
|
||||||
|
mnodeIncVgroupRef(pVgroup);
|
||||||
|
|
||||||
SSdbOper oper = {
|
SSdbOper oper = {
|
||||||
.type = SDB_OPER_GLOBAL,
|
.type = SDB_OPER_GLOBAL,
|
||||||
.table = tsVgroupSdb,
|
.table = tsVgroupSdb,
|
||||||
|
@ -402,8 +404,6 @@ int32_t mnodeCreateVgroup(SMnodeMsg *pMsg, SDbObj *pDb) {
|
||||||
.cb = mnodeCreateVgroupCb
|
.cb = mnodeCreateVgroupCb
|
||||||
};
|
};
|
||||||
|
|
||||||
pMsg->pVgroup = pVgroup;
|
|
||||||
|
|
||||||
int32_t code = sdbInsertRow(&oper);
|
int32_t code = sdbInsertRow(&oper);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
pMsg->pVgroup = NULL;
|
pMsg->pVgroup = NULL;
|
||||||
|
@ -814,19 +814,20 @@ static int32_t mnodeProcessVnodeCfgMsg(SMnodeMsg *pMsg) {
|
||||||
mDebug("dnode:%s, vgId:%d, invalid dnode", taosIpStr(pCfg->dnodeId), pCfg->vgId);
|
mDebug("dnode:%s, vgId:%d, invalid dnode", taosIpStr(pCfg->dnodeId), pCfg->vgId);
|
||||||
return TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
return TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
||||||
}
|
}
|
||||||
mnodeDecDnodeRef(pDnode);
|
|
||||||
|
|
||||||
SVgObj *pVgroup = mnodeGetVgroup(pCfg->vgId);
|
SVgObj *pVgroup = mnodeGetVgroup(pCfg->vgId);
|
||||||
if (pVgroup == NULL) {
|
if (pVgroup == NULL) {
|
||||||
mDebug("dnode:%s, vgId:%d, no vgroup info", taosIpStr(pCfg->dnodeId), pCfg->vgId);
|
mDebug("dnode:%s, vgId:%d, no vgroup info", taosIpStr(pCfg->dnodeId), pCfg->vgId);
|
||||||
|
mnodeDecDnodeRef(pDnode);
|
||||||
return TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
return TSDB_CODE_MND_VGROUP_NOT_EXIST;
|
||||||
}
|
}
|
||||||
mnodeDecVgroupRef(pVgroup);
|
|
||||||
|
|
||||||
mDebug("vgId:%d, send create vnode msg to dnode %s for vnode cfg msg", pVgroup->vgId, pDnode->dnodeEp);
|
mDebug("vgId:%d, send create vnode msg to dnode %s for vnode cfg msg", pVgroup->vgId, pDnode->dnodeEp);
|
||||||
SRpcIpSet ipSet = mnodeGetIpSetFromIp(pDnode->dnodeEp);
|
SRpcIpSet ipSet = mnodeGetIpSetFromIp(pDnode->dnodeEp);
|
||||||
mnodeSendCreateVnodeMsg(pVgroup, &ipSet, NULL);
|
mnodeSendCreateVnodeMsg(pVgroup, &ipSet, NULL);
|
||||||
|
|
||||||
|
mnodeDecDnodeRef(pDnode);
|
||||||
|
mnodeDecVgroupRef(pVgroup);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -206,7 +206,7 @@ typedef struct HttpThread {
|
||||||
pthread_mutex_t threadMutex;
|
pthread_mutex_t threadMutex;
|
||||||
bool stop;
|
bool stop;
|
||||||
int pollFd;
|
int pollFd;
|
||||||
int numOfFds;
|
int numOfContexts;
|
||||||
int threadId;
|
int threadId;
|
||||||
char label[HTTP_LABEL_SIZE];
|
char label[HTTP_LABEL_SIZE];
|
||||||
bool (*processData)(HttpContext *pContext);
|
bool (*processData)(HttpContext *pContext);
|
||||||
|
|
|
@ -44,7 +44,7 @@ static void httpDestroyContext(void *data) {
|
||||||
HttpThread *pThread = pContext->pThread;
|
HttpThread *pThread = pContext->pThread;
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpReleaseSession(pContext);
|
httpReleaseSession(pContext);
|
||||||
atomic_sub_fetch_32(&pThread->numOfFds, 1);
|
atomic_sub_fetch_32(&pThread->numOfContexts, 1);
|
||||||
|
|
||||||
pContext->pThread = 0;
|
pContext->pThread = 0;
|
||||||
pContext->state = HTTP_CONTEXT_STATE_CLOSED;
|
pContext->state = HTTP_CONTEXT_STATE_CLOSED;
|
||||||
|
@ -171,38 +171,39 @@ bool httpInitContext(HttpContext *pContext) {
|
||||||
|
|
||||||
void httpCloseContextByApp(HttpContext *pContext) {
|
void httpCloseContextByApp(HttpContext *pContext) {
|
||||||
pContext->parsed = false;
|
pContext->parsed = false;
|
||||||
|
|
||||||
bool keepAlive = true;
|
bool keepAlive = true;
|
||||||
|
|
||||||
if (pContext->httpVersion == HTTP_VERSION_10 && pContext->httpKeepAlive != HTTP_KEEPALIVE_ENABLE) {
|
if (pContext->httpVersion == HTTP_VERSION_10 && pContext->httpKeepAlive != HTTP_KEEPALIVE_ENABLE) {
|
||||||
keepAlive = false;
|
keepAlive = false;
|
||||||
} else if (pContext->httpVersion != HTTP_VERSION_10 && pContext->httpKeepAlive == HTTP_KEEPALIVE_DISABLE) {
|
} else if (pContext->httpVersion != HTTP_VERSION_10 && pContext->httpKeepAlive == HTTP_KEEPALIVE_DISABLE) {
|
||||||
keepAlive = false;
|
keepAlive = false;
|
||||||
} else {}
|
} else {
|
||||||
|
}
|
||||||
|
|
||||||
if (keepAlive) {
|
if (keepAlive) {
|
||||||
if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_HANDLING, HTTP_CONTEXT_STATE_READY)) {
|
if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_HANDLING, HTTP_CONTEXT_STATE_READY)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:handling, keepAlive:true, reuse connect",
|
httpDebug("context:%p, fd:%d, ip:%s, last state:handling, keepAlive:true, reuse context", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr);
|
pContext->ipstr);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:dropping, keepAlive:true, close connect",
|
httpDebug("context:%p, fd:%d, ip:%s, last state:dropping, keepAlive:true, close connect", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr);
|
pContext->ipstr);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_READY)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_READY)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:ready, keepAlive:true, reuse connect",
|
httpDebug("context:%p, fd:%d, ip:%s, last state:ready, keepAlive:true, reuse context", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr);
|
pContext->ipstr);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:ready, keepAlive:true, close connect",
|
httpDebug("context:%p, fd:%d, ip:%s, last state:ready, keepAlive:true, close connect", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr);
|
pContext->ipstr);
|
||||||
} else {
|
} else {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpError("context:%p, fd:%d, ip:%s, last state:%s:%d, keepAlive:true, close connect",
|
httpError("context:%p, fd:%d, ip:%s, last state:%s:%d, keepAlive:true, close connect", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->state);
|
pContext->ipstr, httpContextStateStr(pContext->state), pContext->state);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
httpRemoveContextFromEpoll(pContext);
|
httpRemoveContextFromEpoll(pContext);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, last state:%s:%d, keepAlive:false, close connect",
|
httpDebug("context:%p, fd:%d, ip:%s, last state:%s:%d, keepAlive:false, close context", pContext, pContext->fd,
|
||||||
pContext, pContext->fd, pContext->ipstr, httpContextStateStr(pContext->state), pContext->state);
|
pContext->ipstr, httpContextStateStr(pContext->state), pContext->state);
|
||||||
}
|
}
|
||||||
|
|
||||||
httpReleaseContext(pContext);
|
httpReleaseContext(pContext);
|
||||||
|
@ -214,7 +215,7 @@ void httpCloseContextByServer(HttpContext *pContext) {
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_DROPPING)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_DROPPING, HTTP_CONTEXT_STATE_DROPPING)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll already finished, wait app finished", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, ip:%s, epoll already finished, wait app finished", pContext, pContext->fd, pContext->ipstr);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_READY, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, close context", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, close connect", pContext, pContext->fd, pContext->ipstr);
|
||||||
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
} else if (httpAlterContextState(pContext, HTTP_CONTEXT_STATE_CLOSED, HTTP_CONTEXT_STATE_CLOSED)) {
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, will be closed soon", pContext, pContext->fd, pContext->ipstr);
|
httpDebug("context:%p, fd:%d, ip:%s, epoll finished, will be closed soon", pContext, pContext->fd, pContext->ipstr);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -313,9 +313,9 @@ bool httpParseRequest(HttpContext* pContext) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
httpTraceL("context:%p, fd:%d, ip:%s, thread:%s, numOfFds:%d, read size:%d, raw data:\n%s", pContext, pContext->fd,
|
httpTraceL("context:%p, fd:%d, ip:%s, thread:%s, numOfContexts:%d, read size:%d, raw data:\n%s", pContext,
|
||||||
pContext->ipstr, pContext->pThread->label, pContext->pThread->numOfFds, pContext->parser.bufsize,
|
pContext->fd, pContext->ipstr, pContext->pThread->label, pContext->pThread->numOfContexts,
|
||||||
pContext->parser.buffer);
|
pContext->parser.bufsize, pContext->parser.buffer);
|
||||||
|
|
||||||
if (!httpGetHttpMethod(pContext)) {
|
if (!httpGetHttpMethod(pContext)) {
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -293,7 +293,7 @@ static void *httpAcceptHttpConnection(void *arg) {
|
||||||
|
|
||||||
totalFds = 1;
|
totalFds = 1;
|
||||||
for (int i = 0; i < pServer->numOfThreads; ++i) {
|
for (int i = 0; i < pServer->numOfThreads; ++i) {
|
||||||
totalFds += pServer->pThreads[i].numOfFds;
|
totalFds += pServer->pThreads[i].numOfContexts;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (totalFds > tsHttpCacheSessions * 100) {
|
if (totalFds > tsHttpCacheSessions * 100) {
|
||||||
|
@ -332,9 +332,9 @@ static void *httpAcceptHttpConnection(void *arg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// notify the data process, add into the FdObj list
|
// notify the data process, add into the FdObj list
|
||||||
atomic_add_fetch_32(&pThread->numOfFds, 1);
|
atomic_add_fetch_32(&pThread->numOfContexts, 1);
|
||||||
httpDebug("context:%p, fd:%d, ip:%s, thread:%s numOfFds:%d totalFds:%d, accept a new connection", pContext, connFd,
|
httpDebug("context:%p, fd:%d, ip:%s, thread:%s numOfContexts:%d totalFds:%d, accept a new connection", pContext,
|
||||||
pContext->ipstr, pThread->label, pThread->numOfFds, totalFds);
|
connFd, pContext->ipstr, pThread->label, pThread->numOfContexts, totalFds);
|
||||||
|
|
||||||
// pick up next thread for next connection
|
// pick up next thread for next connection
|
||||||
threadId++;
|
threadId++;
|
||||||
|
|
|
@ -233,10 +233,11 @@ void httpProcessSingleSqlRetrieveCallBack(void *param, TAOS_RES *result, int num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void httpProcessSingleSqlCallBack(void *param, TAOS_RES *result, int code) {
|
void httpProcessSingleSqlCallBack(void *param, TAOS_RES *result, int unUsedCode) {
|
||||||
HttpContext *pContext = (HttpContext *)param;
|
HttpContext *pContext = (HttpContext *)param;
|
||||||
if (pContext == NULL) return;
|
if (pContext == NULL) return;
|
||||||
|
|
||||||
|
int32_t code = taos_errno(result);
|
||||||
HttpEncodeMethod *encode = pContext->encodeMethod;
|
HttpEncodeMethod *encode = pContext->encodeMethod;
|
||||||
|
|
||||||
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
if (code == TSDB_CODE_TSC_ACTION_IN_PROGRESS) {
|
||||||
|
@ -260,8 +261,8 @@ void httpProcessSingleSqlCallBack(void *param, TAOS_RES *result, int code) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int num_fields = taos_field_count(result);
|
bool isUpdate = tscIsUpdateQuery(result);
|
||||||
if (num_fields == 0) {
|
if (isUpdate) {
|
||||||
// not select or show commands
|
// not select or show commands
|
||||||
int affectRows = taos_affected_rows(result);
|
int affectRows = taos_affected_rows(result);
|
||||||
|
|
||||||
|
|
|
@ -192,7 +192,6 @@ typedef struct SQInfo {
|
||||||
int32_t offset; // offset in group result set of subgroup, todo refactor
|
int32_t offset; // offset in group result set of subgroup, todo refactor
|
||||||
SArray* arrTableIdInfo;
|
SArray* arrTableIdInfo;
|
||||||
|
|
||||||
T_REF_DECLARE()
|
|
||||||
/*
|
/*
|
||||||
* the query is executed position on which meter of the whole list.
|
* the query is executed position on which meter of the whole list.
|
||||||
* when the index reaches the last one of the list, it means the query is completed.
|
* when the index reaches the last one of the list, it means the query is completed.
|
||||||
|
@ -201,8 +200,6 @@ typedef struct SQInfo {
|
||||||
*/
|
*/
|
||||||
int32_t tableIndex;
|
int32_t tableIndex;
|
||||||
int32_t numOfGroupResultPages;
|
int32_t numOfGroupResultPages;
|
||||||
_qinfo_free_fn_t freeFn; //todo remove it
|
|
||||||
|
|
||||||
void* pBuf; // allocated buffer for STableQueryInfo, sizeof(STableQueryInfo)*numOfTables;
|
void* pBuf; // allocated buffer for STableQueryInfo, sizeof(STableQueryInfo)*numOfTables;
|
||||||
|
|
||||||
} SQInfo;
|
} SQInfo;
|
||||||
|
|
|
@ -107,7 +107,7 @@ STSBuf* tsBufCreate(bool autoDelete, int32_t order);
|
||||||
STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete);
|
STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete);
|
||||||
STSBuf* tsBufCreateFromCompBlocks(const char* pData, int32_t numOfBlocks, int32_t len, int32_t tsOrder);
|
STSBuf* tsBufCreateFromCompBlocks(const char* pData, int32_t numOfBlocks, int32_t len, int32_t tsOrder);
|
||||||
|
|
||||||
void* tsBufDestory(STSBuf* pTSBuf);
|
void* tsBufDestroy(STSBuf* pTSBuf);
|
||||||
|
|
||||||
void tsBufAppend(STSBuf* pTSBuf, int32_t vnodeId, int64_t tag, const char* pData, int32_t len);
|
void tsBufAppend(STSBuf* pTSBuf, int32_t vnodeId, int64_t tag, const char* pData, int32_t len);
|
||||||
int32_t tsBufMerge(STSBuf* pDestBuf, const STSBuf* pSrcBuf, int32_t vnodeIdx);
|
int32_t tsBufMerge(STSBuf* pDestBuf, const STSBuf* pSrcBuf, int32_t vnodeIdx);
|
||||||
|
|
|
@ -187,7 +187,7 @@ typedef struct SQLFunctionCtx {
|
||||||
} SQLFunctionCtx;
|
} SQLFunctionCtx;
|
||||||
|
|
||||||
typedef struct SQLAggFuncElem {
|
typedef struct SQLAggFuncElem {
|
||||||
char aName[TSDB_FUNCTIONS_NAME_MAX_LENGTH];
|
char aName[TSDB_FUNCTIONS_NAME_MAX_LENGTH];
|
||||||
|
|
||||||
uint8_t nAggIdx; // index of function in aAggs
|
uint8_t nAggIdx; // index of function in aAggs
|
||||||
int8_t stableFuncId; // transfer function for super table query
|
int8_t stableFuncId; // transfer function for super table query
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
#define SET_MASTER_SCAN_FLAG(runtime) ((runtime)->scanFlag = MASTER_SCAN)
|
#define SET_MASTER_SCAN_FLAG(runtime) ((runtime)->scanFlag = MASTER_SCAN)
|
||||||
#define SET_REVERSE_SCAN_FLAG(runtime) ((runtime)->scanFlag = REVERSE_SCAN)
|
#define SET_REVERSE_SCAN_FLAG(runtime) ((runtime)->scanFlag = REVERSE_SCAN)
|
||||||
|
|
||||||
#define GET_QINFO_ADDR(x) ((void *)((char *)(x)-offsetof(SQInfo, runtimeEnv)))
|
#define GET_QINFO_ADDR(x) ((SQInfo *)((char *)(x)-offsetof(SQInfo, runtimeEnv)))
|
||||||
|
|
||||||
#define GET_COL_DATA_POS(query, index, step) ((query)->pos + (index) * (step))
|
#define GET_COL_DATA_POS(query, index, step) ((query)->pos + (index) * (step))
|
||||||
#define SWITCH_ORDER(n) (((n) = ((n) == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC))
|
#define SWITCH_ORDER(n) (((n) = ((n) == TSDB_ORDER_ASC) ? TSDB_ORDER_DESC : TSDB_ORDER_ASC))
|
||||||
|
@ -120,6 +120,7 @@ static UNUSED_FUNC void* u_calloc(size_t num, size_t __size) {
|
||||||
#define GET_TABLEGROUP(q, _index) ((SArray*) taosArrayGetP((q)->tableqinfoGroupInfo.pGroupList, (_index)))
|
#define GET_TABLEGROUP(q, _index) ((SArray*) taosArrayGetP((q)->tableqinfoGroupInfo.pGroupList, (_index)))
|
||||||
|
|
||||||
static void setQueryStatus(SQuery *pQuery, int8_t status);
|
static void setQueryStatus(SQuery *pQuery, int8_t status);
|
||||||
|
static void finalizeQueryResult(SQueryRuntimeEnv *pRuntimeEnv);
|
||||||
|
|
||||||
#define QUERY_IS_INTERVAL_QUERY(_q) ((_q)->intervalTime > 0)
|
#define QUERY_IS_INTERVAL_QUERY(_q) ((_q)->intervalTime > 0)
|
||||||
|
|
||||||
|
@ -351,27 +352,6 @@ static bool hasTagValOutput(SQuery* pQuery) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SDataStatis *getStatisInfo(SQuery *pQuery, SDataStatis *pStatis, int32_t numOfCols, int32_t index) {
|
|
||||||
// for a tag column, no corresponding field info
|
|
||||||
SColIndex *pColIndex = &pQuery->pSelectExpr[index].base.colInfo;
|
|
||||||
if (TSDB_COL_IS_TAG(pColIndex->flag)) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Choose the right column field info by field id, since the file block may be out of date,
|
|
||||||
* which means the newest table schema is not equalled to the schema of this block.
|
|
||||||
* TODO: speedup by using bsearch
|
|
||||||
*/
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
|
||||||
if (pColIndex->colId == pStatis[i].colId) {
|
|
||||||
return &pStatis[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param pQuery
|
* @param pQuery
|
||||||
* @param col
|
* @param col
|
||||||
|
@ -380,19 +360,14 @@ static SDataStatis *getStatisInfo(SQuery *pQuery, SDataStatis *pStatis, int32_t
|
||||||
* @param pColStatis
|
* @param pColStatis
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
static bool hasNullValue(SQuery *pQuery, int32_t col, int32_t numOfCols, SDataStatis *pStatis, SDataStatis **pColStatis) {
|
static bool hasNullValue(SColIndex* pColIndex, SDataStatis *pStatis, SDataStatis **pColStatis) {
|
||||||
SColIndex *pColIndex = &pQuery->pSelectExpr[col].base.colInfo;
|
if (TSDB_COL_IS_TAG(pColIndex->flag) || pColIndex->colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
||||||
if (TSDB_COL_IS_TAG(pColIndex->flag)) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// query on primary timestamp column, not null value at all
|
|
||||||
if (pColIndex->colId == PRIMARYKEY_TIMESTAMP_COL_INDEX) {
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pStatis != NULL) {
|
if (pStatis != NULL) {
|
||||||
*pColStatis = getStatisInfo(pQuery, pStatis, numOfCols, col);
|
*pColStatis = &pStatis[pColIndex->colIndex];
|
||||||
|
assert((*pColStatis)->colId == pColIndex->colId);
|
||||||
} else {
|
} else {
|
||||||
*pColStatis = NULL;
|
*pColStatis = NULL;
|
||||||
}
|
}
|
||||||
|
@ -842,8 +817,8 @@ static char *getDataBlock(SQueryRuntimeEnv *pRuntimeEnv, SArithmeticSupport *sas
|
||||||
if (pDataBlock == NULL) {
|
if (pDataBlock == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
char *dataBlock = NULL;
|
|
||||||
|
|
||||||
|
char *dataBlock = NULL;
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
|
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
|
||||||
|
|
||||||
|
@ -864,6 +839,7 @@ static char *getDataBlock(SQueryRuntimeEnv *pRuntimeEnv, SArithmeticSupport *sas
|
||||||
sas->data = calloc(pQuery->numOfCols, POINTER_BYTES);
|
sas->data = calloc(pQuery->numOfCols, POINTER_BYTES);
|
||||||
|
|
||||||
if (sas->data == NULL) {
|
if (sas->data == NULL) {
|
||||||
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -887,10 +863,14 @@ static char *getDataBlock(SQueryRuntimeEnv *pRuntimeEnv, SArithmeticSupport *sas
|
||||||
|
|
||||||
} else { // other type of query function
|
} else { // other type of query function
|
||||||
SColIndex *pCol = &pQuery->pSelectExpr[col].base.colInfo;
|
SColIndex *pCol = &pQuery->pSelectExpr[col].base.colInfo;
|
||||||
if (TSDB_COL_IS_TAG(pCol->flag) || pDataBlock == NULL) {
|
if (TSDB_COL_IS_TAG(pCol->flag)) {
|
||||||
dataBlock = NULL;
|
dataBlock = NULL;
|
||||||
} else {
|
} else {
|
||||||
dataBlock = getDataBlockImpl(pDataBlock, pCol->colId);
|
SColIndex* pColIndex = &pQuery->pSelectExpr[col].base.colInfo;
|
||||||
|
SColumnInfoData *p = taosArrayGet(pDataBlock, pColIndex->colIndex);
|
||||||
|
assert(p->info.colId == pColIndex->colId);
|
||||||
|
|
||||||
|
dataBlock = p->pData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -922,6 +902,7 @@ static void blockwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *
|
||||||
|
|
||||||
SArithmeticSupport *sasArray = calloc((size_t)pQuery->numOfOutput, sizeof(SArithmeticSupport));
|
SArithmeticSupport *sasArray = calloc((size_t)pQuery->numOfOutput, sizeof(SArithmeticSupport));
|
||||||
if (sasArray == NULL) {
|
if (sasArray == NULL) {
|
||||||
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1168,6 +1149,7 @@ static void rowwiseApplyFunctions(SQueryRuntimeEnv *pRuntimeEnv, SDataStatis *pS
|
||||||
|
|
||||||
SArithmeticSupport *sasArray = calloc((size_t)pQuery->numOfOutput, sizeof(SArithmeticSupport));
|
SArithmeticSupport *sasArray = calloc((size_t)pQuery->numOfOutput, sizeof(SArithmeticSupport));
|
||||||
if (sasArray == NULL) {
|
if (sasArray == NULL) {
|
||||||
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
longjmp(pRuntimeEnv->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1365,7 +1347,7 @@ void setExecParams(SQuery *pQuery, SQLFunctionCtx *pCtx, void* inputData, TSKEY
|
||||||
int32_t colId = pQuery->pSelectExpr[colIndex].base.colInfo.colId;
|
int32_t colId = pQuery->pSelectExpr[colIndex].base.colInfo.colId;
|
||||||
|
|
||||||
SDataStatis *tpField = NULL;
|
SDataStatis *tpField = NULL;
|
||||||
pCtx->hasNull = hasNullValue(pQuery, colIndex, pBlockInfo->numOfCols, pStatis, &tpField);
|
pCtx->hasNull = hasNullValue(&pQuery->pSelectExpr[colIndex].base.colInfo, pStatis, &tpField);
|
||||||
pCtx->aInputElemBuf = inputData;
|
pCtx->aInputElemBuf = inputData;
|
||||||
|
|
||||||
if (tpField != NULL) {
|
if (tpField != NULL) {
|
||||||
|
@ -1619,22 +1601,21 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
tsdbCleanupQueryHandle(pRuntimeEnv->pQueryHandle);
|
tsdbCleanupQueryHandle(pRuntimeEnv->pQueryHandle);
|
||||||
tsdbCleanupQueryHandle(pRuntimeEnv->pSecQueryHandle);
|
tsdbCleanupQueryHandle(pRuntimeEnv->pSecQueryHandle);
|
||||||
|
|
||||||
pRuntimeEnv->pTSBuf = tsBufDestory(pRuntimeEnv->pTSBuf);
|
pRuntimeEnv->pTSBuf = tsBufDestroy(pRuntimeEnv->pTSBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool isQueryKilled(SQInfo *pQInfo) {
|
#define IS_QUERY_KILLED(_q) ((_q)->code == TSDB_CODE_TSC_QUERY_CANCELLED)
|
||||||
return (pQInfo->code == TSDB_CODE_TSC_QUERY_CANCELLED);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void setQueryKilled(SQInfo *pQInfo) { pQInfo->code = TSDB_CODE_TSC_QUERY_CANCELLED; }
|
static void setQueryKilled(SQInfo *pQInfo) { pQInfo->code = TSDB_CODE_TSC_QUERY_CANCELLED; }
|
||||||
|
|
||||||
static bool isFixedOutputQuery(SQuery *pQuery) {
|
static bool isFixedOutputQuery(SQueryRuntimeEnv* pRuntimeEnv) {
|
||||||
if (pQuery->intervalTime != 0) {
|
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||||
|
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Note:top/bottom query is fixed output query
|
// Note:top/bottom query is fixed output query
|
||||||
if (isTopBottomQuery(pQuery) || isGroupbyNormalCol(pQuery->pGroupbyExpr)) {
|
if (pRuntimeEnv->topBotQuery || pRuntimeEnv->groupbyNormalCol) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2054,7 +2035,7 @@ SArray *loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, void* pQueryHandle,
|
||||||
// check if this data block is required to load
|
// check if this data block is required to load
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
SSqlFuncMsg* pSqlFunc = &pQuery->pSelectExpr[i].base;
|
SSqlFuncMsg* pSqlFunc = &pQuery->pSelectExpr[i].base;
|
||||||
|
|
||||||
int32_t functionId = pSqlFunc->functionId;
|
int32_t functionId = pSqlFunc->functionId;
|
||||||
int32_t colId = pSqlFunc->colInfo.colId;
|
int32_t colId = pSqlFunc->colInfo.colId;
|
||||||
r |= aAggs[functionId].dataReqFunc(&pRuntimeEnv->pCtx[i], pQuery->window.skey, pQuery->window.ekey, colId);
|
r |= aAggs[functionId].dataReqFunc(&pRuntimeEnv->pCtx[i], pQuery->window.skey, pQuery->window.ekey, colId);
|
||||||
|
@ -2066,8 +2047,7 @@ SArray *loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, void* pQueryHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (r == BLK_DATA_NO_NEEDED) {
|
if (r == BLK_DATA_NO_NEEDED) {
|
||||||
qDebug("QInfo:%p data block discard, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_QINFO_ADDR(pRuntimeEnv),
|
qDebug("QInfo:%p data block discard, rows:%d", GET_QINFO_ADDR(pRuntimeEnv), pBlockInfo->rows);
|
||||||
pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
|
|
||||||
pRuntimeEnv->summary.discardBlocks += 1;
|
pRuntimeEnv->summary.discardBlocks += 1;
|
||||||
} else if (r == BLK_DATA_STATIS_NEEDED) {
|
} else if (r == BLK_DATA_STATIS_NEEDED) {
|
||||||
if (tsdbRetrieveDataBlockStatisInfo(pQueryHandle, pStatis) != TSDB_CODE_SUCCESS) {
|
if (tsdbRetrieveDataBlockStatisInfo(pQueryHandle, pStatis) != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -2199,7 +2179,7 @@ static void ensureOutputBufferSimple(SQueryRuntimeEnv* pRuntimeEnv, int32_t capa
|
||||||
static void ensureOutputBuffer(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pBlockInfo) {
|
static void ensureOutputBuffer(SQueryRuntimeEnv* pRuntimeEnv, SDataBlockInfo* pBlockInfo) {
|
||||||
// in case of prj/diff query, ensure the output buffer is sufficient to accommodate the results of current block
|
// in case of prj/diff query, ensure the output buffer is sufficient to accommodate the results of current block
|
||||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||||
if (!QUERY_IS_INTERVAL_QUERY(pQuery) && !pRuntimeEnv->groupbyNormalCol && !isFixedOutputQuery(pQuery)) {
|
if (!QUERY_IS_INTERVAL_QUERY(pQuery) && !pRuntimeEnv->groupbyNormalCol && !isFixedOutputQuery(pRuntimeEnv)) {
|
||||||
SResultRec *pRec = &pQuery->rec;
|
SResultRec *pRec = &pQuery->rec;
|
||||||
|
|
||||||
if (pQuery->rec.capacity - pQuery->rec.rows < pBlockInfo->rows) {
|
if (pQuery->rec.capacity - pQuery->rec.rows < pBlockInfo->rows) {
|
||||||
|
@ -2249,8 +2229,10 @@ static int64_t doScanAllDataBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
SDataBlockInfo blockInfo = SDATA_BLOCK_INITIALIZER;
|
SDataBlockInfo blockInfo = SDATA_BLOCK_INITIALIZER;
|
||||||
while (tsdbNextDataBlock(pQueryHandle)) {
|
while (tsdbNextDataBlock(pQueryHandle)) {
|
||||||
summary->totalBlocks += 1;
|
summary->totalBlocks += 1;
|
||||||
if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) {
|
|
||||||
return 0;
|
if (IS_QUERY_KILLED(GET_QINFO_ADDR(pRuntimeEnv))) {
|
||||||
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
|
tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
|
||||||
|
@ -3304,8 +3286,9 @@ void scanOneTableDataBlocks(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start) {
|
||||||
cond.twindow.skey, cond.twindow.ekey);
|
cond.twindow.skey, cond.twindow.ekey);
|
||||||
|
|
||||||
// check if query is killed or not
|
// check if query is killed or not
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
return;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3695,23 +3678,24 @@ void copyFromWindowResToSData(SQInfo *pQInfo, SWindowResInfo *pResultInfo) {
|
||||||
assert(pQuery->rec.rows <= pQuery->rec.capacity);
|
assert(pQuery->rec.rows <= pQuery->rec.capacity);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void updateWindowResNumOfRes(SQueryRuntimeEnv *pRuntimeEnv, STableQueryInfo *pTableQueryInfo) {
|
static void updateWindowResNumOfRes(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
|
|
||||||
// update the number of result for each, only update the number of rows for the corresponding window result.
|
// update the number of result for each, only update the number of rows for the corresponding window result.
|
||||||
if (!QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
if (QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pRuntimeEnv->windowResInfo.size; ++i) {
|
for (int32_t i = 0; i < pRuntimeEnv->windowResInfo.size; ++i) {
|
||||||
SWindowResult *pResult = &pRuntimeEnv->windowResInfo.pResult[i];
|
SWindowResult *pResult = &pRuntimeEnv->windowResInfo.pResult[i];
|
||||||
|
|
||||||
for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
||||||
int32_t functionId = pRuntimeEnv->pCtx[j].functionId;
|
int32_t functionId = pRuntimeEnv->pCtx[j].functionId;
|
||||||
if (functionId == TSDB_FUNC_TS || functionId == TSDB_FUNC_TAG || functionId == TSDB_FUNC_TAGPRJ) {
|
if (functionId == TSDB_FUNC_TS || functionId == TSDB_FUNC_TAG || functionId == TSDB_FUNC_TAGPRJ) {
|
||||||
continue;
|
continue;
|
||||||
}
|
|
||||||
|
|
||||||
pResult->numOfRows = MAX(pResult->numOfRows, pResult->resultInfo[j].numOfRes);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pResult->numOfRows = MAX(pResult->numOfRows, pResult->resultInfo[j].numOfRes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -3729,8 +3713,6 @@ void stableApplyFunctionsOnBlock(SQueryRuntimeEnv *pRuntimeEnv, SDataBlockInfo *
|
||||||
} else {
|
} else {
|
||||||
blockwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pWindowResInfo, searchFn, pDataBlock);
|
blockwiseApplyFunctions(pRuntimeEnv, pStatis, pDataBlockInfo, pWindowResInfo, searchFn, pDataBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
updateWindowResNumOfRes(pRuntimeEnv, pTableQueryInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool queryHasRemainResults(SQueryRuntimeEnv* pRuntimeEnv) {
|
bool queryHasRemainResults(SQueryRuntimeEnv* pRuntimeEnv) {
|
||||||
|
@ -3950,8 +3932,9 @@ void skipBlocks(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
|
|
||||||
SDataBlockInfo blockInfo = SDATA_BLOCK_INITIALIZER;
|
SDataBlockInfo blockInfo = SDATA_BLOCK_INITIALIZER;
|
||||||
while (tsdbNextDataBlock(pQueryHandle)) {
|
while (tsdbNextDataBlock(pQueryHandle)) {
|
||||||
if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) {
|
if (IS_QUERY_KILLED(GET_QINFO_ADDR(pRuntimeEnv))) {
|
||||||
return;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
|
tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
|
||||||
|
@ -4099,7 +4082,7 @@ static void setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isSTableQuery && (!QUERY_IS_INTERVAL_QUERY(pQuery)) && (!isFixedOutputQuery(pQuery))) {
|
if (isSTableQuery && (!QUERY_IS_INTERVAL_QUERY(pQuery)) && (!isFixedOutputQuery(pRuntimeEnv))) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4115,7 +4098,7 @@ static void setupQueryHandle(void* tsdb, SQInfo* pQInfo, bool isSTableQuery) {
|
||||||
&& (cond.order == TSDB_ORDER_ASC)
|
&& (cond.order == TSDB_ORDER_ASC)
|
||||||
&& (!QUERY_IS_INTERVAL_QUERY(pQuery))
|
&& (!QUERY_IS_INTERVAL_QUERY(pQuery))
|
||||||
&& (!isGroupbyNormalCol(pQuery->pGroupbyExpr))
|
&& (!isGroupbyNormalCol(pQuery->pGroupbyExpr))
|
||||||
&& (!isFixedOutputQuery(pQuery))
|
&& (!isFixedOutputQuery(pRuntimeEnv))
|
||||||
) {
|
) {
|
||||||
SArray* pa = GET_TABLEGROUP(pQInfo, 0);
|
SArray* pa = GET_TABLEGROUP(pQInfo, 0);
|
||||||
STableQueryInfo* pCheckInfo = taosArrayGetP(pa, 0);
|
STableQueryInfo* pCheckInfo = taosArrayGetP(pa, 0);
|
||||||
|
@ -4158,7 +4141,10 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
SQueryRuntimeEnv *pRuntimeEnv = &pQInfo->runtimeEnv;
|
||||||
|
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
|
|
||||||
pQuery->precision = tsdbGetCfg(tsdb)->precision;
|
pQuery->precision = tsdbGetCfg(tsdb)->precision;
|
||||||
|
pRuntimeEnv->topBotQuery = isTopBottomQuery(pQuery);
|
||||||
|
pRuntimeEnv->hasTagResults = hasTagValOutput(pQuery);
|
||||||
|
|
||||||
setScanLimitationByResultBuffer(pQuery);
|
setScanLimitationByResultBuffer(pQuery);
|
||||||
changeExecuteScanOrder(pQInfo, false);
|
changeExecuteScanOrder(pQInfo, false);
|
||||||
|
@ -4236,10 +4222,6 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
pQuery->fillType, pColInfo);
|
pQuery->fillType, pColInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
// todo refactor
|
|
||||||
pRuntimeEnv->topBotQuery = isTopBottomQuery(pQuery);
|
|
||||||
pRuntimeEnv->hasTagResults = hasTagValOutput(pQuery);
|
|
||||||
|
|
||||||
setQueryStatus(pQuery, QUERY_NOT_COMPLETED);
|
setQueryStatus(pQuery, QUERY_NOT_COMPLETED);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -4267,8 +4249,9 @@ static int64_t scanMultiTableDataBlocks(SQInfo *pQInfo) {
|
||||||
|
|
||||||
while (tsdbNextDataBlock(pQueryHandle)) {
|
while (tsdbNextDataBlock(pQueryHandle)) {
|
||||||
summary->totalBlocks += 1;
|
summary->totalBlocks += 1;
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
break;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
|
tsdbRetrieveDataBlockInfo(pQueryHandle, &blockInfo);
|
||||||
|
@ -4304,6 +4287,8 @@ static int64_t scanMultiTableDataBlocks(SQInfo *pQInfo) {
|
||||||
pQInfo, blockInfo.uid, blockInfo.tid, blockInfo.window.skey, blockInfo.window.ekey, blockInfo.rows, pQuery->current->lastKey);
|
pQInfo, blockInfo.uid, blockInfo.tid, blockInfo.window.skey, blockInfo.window.ekey, blockInfo.rows, pQuery->current->lastKey);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
updateWindowResNumOfRes(pRuntimeEnv);
|
||||||
|
|
||||||
int64_t et = taosGetTimestampMs();
|
int64_t et = taosGetTimestampMs();
|
||||||
return et - st;
|
return et - st;
|
||||||
}
|
}
|
||||||
|
@ -4316,7 +4301,9 @@ static bool multiTableMultioutputHelper(SQInfo *pQInfo, int32_t index) {
|
||||||
SArray *group = GET_TABLEGROUP(pQInfo, 0);
|
SArray *group = GET_TABLEGROUP(pQInfo, 0);
|
||||||
STableQueryInfo* pCheckInfo = taosArrayGetP(group, index);
|
STableQueryInfo* pCheckInfo = taosArrayGetP(group, index);
|
||||||
|
|
||||||
setTagVal(pRuntimeEnv, pCheckInfo->pTable, pQInfo->tsdb);
|
if (pRuntimeEnv->hasTagResults || pRuntimeEnv->pTSBuf != NULL) {
|
||||||
|
setTagVal(pRuntimeEnv, pCheckInfo->pTable, pQInfo->tsdb);
|
||||||
|
}
|
||||||
|
|
||||||
STableId* id = TSDB_TABLEID(pCheckInfo->pTable);
|
STableId* id = TSDB_TABLEID(pCheckInfo->pTable);
|
||||||
qDebug("QInfo:%p query on (%d): uid:%" PRIu64 ", tid:%d, qrange:%" PRId64 "-%" PRId64, pQInfo, index,
|
qDebug("QInfo:%p query on (%d): uid:%" PRIu64 ", tid:%d, qrange:%" PRId64 "-%" PRId64, pQInfo, index,
|
||||||
|
@ -4475,6 +4462,8 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pRuntimeEnv->pQueryHandle = tsdbQueryTables(pQInfo->tsdb, &cond, &gp, pQInfo);
|
pRuntimeEnv->pQueryHandle = tsdbQueryTables(pQInfo->tsdb, &cond, &gp, pQInfo);
|
||||||
|
taosArrayDestroy(g1);
|
||||||
|
taosArrayDestroy(tx);
|
||||||
|
|
||||||
SArray* s = tsdbGetQueriedTableList(pRuntimeEnv->pQueryHandle);
|
SArray* s = tsdbGetQueriedTableList(pRuntimeEnv->pQueryHandle);
|
||||||
assert(taosArrayGetSize(s) >= 1);
|
assert(taosArrayGetSize(s) >= 1);
|
||||||
|
@ -4547,8 +4536,9 @@ static void sequentialTableProcess(SQInfo *pQInfo) {
|
||||||
1 == taosArrayGetSize(pQInfo->tableqinfoGroupInfo.pGroupList));
|
1 == taosArrayGetSize(pQInfo->tableqinfoGroupInfo.pGroupList));
|
||||||
|
|
||||||
while (pQInfo->tableIndex < pQInfo->tableqinfoGroupInfo.numOfTables) {
|
while (pQInfo->tableIndex < pQInfo->tableqinfoGroupInfo.numOfTables) {
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
return;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
pQuery->current = taosArrayGetP(group, pQInfo->tableIndex);
|
pQuery->current = taosArrayGetP(group, pQInfo->tableIndex);
|
||||||
|
@ -4742,9 +4732,10 @@ static void multiTableQueryProcess(SQInfo *pQInfo) {
|
||||||
qDebug("QInfo:%p master scan completed, elapsed time: %" PRId64 "ms, reverse scan start", pQInfo, el);
|
qDebug("QInfo:%p master scan completed, elapsed time: %" PRId64 "ms, reverse scan start", pQInfo, el);
|
||||||
|
|
||||||
// query error occurred or query is killed, abort current execution
|
// query error occurred or query is killed, abort current execution
|
||||||
if (pQInfo->code != TSDB_CODE_SUCCESS || isQueryKilled(pQInfo)) {
|
if (pQInfo->code != TSDB_CODE_SUCCESS || IS_QUERY_KILLED(pQInfo)) {
|
||||||
qDebug("QInfo:%p query killed or error occurred, code:%s, abort", pQInfo, tstrerror(pQInfo->code));
|
qDebug("QInfo:%p query killed or error occurred, code:%s, abort", pQInfo, tstrerror(pQInfo->code));
|
||||||
return;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
// close all time window results
|
// close all time window results
|
||||||
|
@ -4764,9 +4755,10 @@ static void multiTableQueryProcess(SQInfo *pQInfo) {
|
||||||
|
|
||||||
setQueryStatus(pQuery, QUERY_COMPLETED);
|
setQueryStatus(pQuery, QUERY_COMPLETED);
|
||||||
|
|
||||||
if (pQInfo->code != TSDB_CODE_SUCCESS || isQueryKilled(pQInfo)) {
|
if (pQInfo->code != TSDB_CODE_SUCCESS || IS_QUERY_KILLED(pQInfo)) {
|
||||||
qDebug("QInfo:%p query killed or error occurred, code:%s, abort", pQInfo, tstrerror(pQInfo->code));
|
qDebug("QInfo:%p query killed or error occurred, code:%s, abort", pQInfo, tstrerror(pQInfo->code));
|
||||||
return;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QUERY_IS_INTERVAL_QUERY(pQuery) || isSumAvgRateQuery(pQuery)) {
|
if (QUERY_IS_INTERVAL_QUERY(pQuery) || isSumAvgRateQuery(pQuery)) {
|
||||||
|
@ -4804,8 +4796,9 @@ static void tableFixedOutputProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo)
|
||||||
scanOneTableDataBlocks(pRuntimeEnv, pTableInfo->lastKey);
|
scanOneTableDataBlocks(pRuntimeEnv, pTableInfo->lastKey);
|
||||||
finalizeQueryResult(pRuntimeEnv);
|
finalizeQueryResult(pRuntimeEnv);
|
||||||
|
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
return;
|
finalizeQueryResult(pRuntimeEnv); // clean up allocated resource during query
|
||||||
|
longjmp(pRuntimeEnv->env, TSDB_CODE_TSC_QUERY_CANCELLED);
|
||||||
}
|
}
|
||||||
|
|
||||||
// since the numOfRows must be identical for all sql functions that are allowed to be executed simutaneously.
|
// since the numOfRows must be identical for all sql functions that are allowed to be executed simutaneously.
|
||||||
|
@ -4837,10 +4830,6 @@ static void tableMultiOutputProcess(SQInfo *pQInfo, STableQueryInfo* pTableInfo)
|
||||||
scanOneTableDataBlocks(pRuntimeEnv, pQuery->current->lastKey);
|
scanOneTableDataBlocks(pRuntimeEnv, pQuery->current->lastKey);
|
||||||
finalizeQueryResult(pRuntimeEnv);
|
finalizeQueryResult(pRuntimeEnv);
|
||||||
|
|
||||||
if (isQueryKilled(pQInfo)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
pQuery->rec.rows = getNumOfResult(pRuntimeEnv);
|
pQuery->rec.rows = getNumOfResult(pRuntimeEnv);
|
||||||
if (pQuery->limit.offset > 0 && pQuery->numOfFilterCols > 0 && pQuery->rec.rows > 0) {
|
if (pQuery->limit.offset > 0 && pQuery->numOfFilterCols > 0 && pQuery->rec.rows > 0) {
|
||||||
skipResults(pRuntimeEnv);
|
skipResults(pRuntimeEnv);
|
||||||
|
@ -4885,10 +4874,6 @@ static void tableIntervalProcessImpl(SQueryRuntimeEnv *pRuntimeEnv, TSKEY start)
|
||||||
while (1) {
|
while (1) {
|
||||||
scanOneTableDataBlocks(pRuntimeEnv, start);
|
scanOneTableDataBlocks(pRuntimeEnv, start);
|
||||||
|
|
||||||
if (isQueryKilled(GET_QINFO_ADDR(pRuntimeEnv))) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(!Q_STATUS_EQUAL(pQuery->status, QUERY_NOT_COMPLETED));
|
assert(!Q_STATUS_EQUAL(pQuery->status, QUERY_NOT_COMPLETED));
|
||||||
finalizeQueryResult(pRuntimeEnv);
|
finalizeQueryResult(pRuntimeEnv);
|
||||||
|
|
||||||
|
@ -5022,7 +5007,7 @@ static void tableQueryImpl(SQInfo *pQInfo) {
|
||||||
// group by normal column, sliding window query, interval query are handled by interval query processor
|
// group by normal column, sliding window query, interval query are handled by interval query processor
|
||||||
if (QUERY_IS_INTERVAL_QUERY(pQuery) || pRuntimeEnv->groupbyNormalCol) { // interval (down sampling operation)
|
if (QUERY_IS_INTERVAL_QUERY(pQuery) || pRuntimeEnv->groupbyNormalCol) { // interval (down sampling operation)
|
||||||
tableIntervalProcess(pQInfo, item);
|
tableIntervalProcess(pQInfo, item);
|
||||||
} else if (isFixedOutputQuery(pQuery)) {
|
} else if (isFixedOutputQuery(pRuntimeEnv)) {
|
||||||
tableFixedOutputProcess(pQInfo, item);
|
tableFixedOutputProcess(pQInfo, item);
|
||||||
} else { // diff/add/multiply/subtract/division
|
} else { // diff/add/multiply/subtract/division
|
||||||
assert(pQuery->checkBuffer == 1);
|
assert(pQuery->checkBuffer == 1);
|
||||||
|
@ -5042,7 +5027,7 @@ static void stableQueryImpl(SQInfo *pQInfo) {
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
if (QUERY_IS_INTERVAL_QUERY(pQuery) ||
|
if (QUERY_IS_INTERVAL_QUERY(pQuery) ||
|
||||||
(isFixedOutputQuery(pQuery) && (!isPointInterpoQuery(pQuery)) && !pRuntimeEnv->groupbyNormalCol &&
|
(isFixedOutputQuery(pRuntimeEnv) && (!isPointInterpoQuery(pQuery)) && !pRuntimeEnv->groupbyNormalCol &&
|
||||||
!isFirstLastRowQuery(pQuery))) {
|
!isFirstLastRowQuery(pQuery))) {
|
||||||
multiTableQueryProcess(pQInfo);
|
multiTableQueryProcess(pQInfo);
|
||||||
} else {
|
} else {
|
||||||
|
@ -5809,7 +5794,7 @@ static bool isValidQInfo(void *param) {
|
||||||
return (sig == (uint64_t)pQInfo);
|
return (sig == (uint64_t)pQInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQInfo *pQInfo, bool isSTable, void* param, _qinfo_free_fn_t fn) {
|
static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQInfo *pQInfo, bool isSTable, void* param) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
|
|
||||||
|
@ -5834,7 +5819,6 @@ static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQ
|
||||||
}
|
}
|
||||||
|
|
||||||
pQInfo->param = param;
|
pQInfo->param = param;
|
||||||
pQInfo->freeFn = fn;
|
|
||||||
|
|
||||||
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
||||||
qDebug("QInfo:%p no table qualified for tag filter, abort query", pQInfo);
|
qDebug("QInfo:%p no table qualified for tag filter, abort query", pQInfo);
|
||||||
|
@ -5857,6 +5841,18 @@ _error:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void freeColumnFilterInfo(SColumnFilterInfo* pFilter, int32_t numOfFilters) {
|
||||||
|
if (pFilter == NULL) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
for (int32_t i = 0; i < numOfFilters; i++) {
|
||||||
|
if (pFilter[i].filterstr) {
|
||||||
|
free((void*)(pFilter[i].pz));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
free(pFilter);
|
||||||
|
}
|
||||||
|
|
||||||
static void freeQInfo(SQInfo *pQInfo) {
|
static void freeQInfo(SQInfo *pQInfo) {
|
||||||
if (!isValidQInfo(pQInfo)) {
|
if (!isValidQInfo(pQInfo)) {
|
||||||
return;
|
return;
|
||||||
|
@ -5925,7 +5921,15 @@ static void freeQInfo(SQInfo *pQInfo) {
|
||||||
|
|
||||||
tfree(pQuery->tagColList);
|
tfree(pQuery->tagColList);
|
||||||
tfree(pQuery->pFilterInfo);
|
tfree(pQuery->pFilterInfo);
|
||||||
tfree(pQuery->colList);
|
|
||||||
|
if (pQuery->colList != NULL) {
|
||||||
|
for (int32_t i = 0; i < pQuery->numOfCols; i++) {
|
||||||
|
SColumnInfo* column = pQuery->colList + i;
|
||||||
|
freeColumnFilterInfo(column->filters, column->numOfFilters);
|
||||||
|
}
|
||||||
|
tfree(pQuery->colList);
|
||||||
|
}
|
||||||
|
|
||||||
tfree(pQuery->sdata);
|
tfree(pQuery->sdata);
|
||||||
|
|
||||||
tfree(pQuery);
|
tfree(pQuery);
|
||||||
|
@ -6016,8 +6020,7 @@ typedef struct SQueryMgmt {
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
} SQueryMgmt;
|
} SQueryMgmt;
|
||||||
|
|
||||||
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, void* param, _qinfo_free_fn_t fn,
|
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, void* param, qinfo_t* pQInfo) {
|
||||||
qinfo_t* pQInfo) {
|
|
||||||
assert(pQueryMsg != NULL && tsdb != NULL);
|
assert(pQueryMsg != NULL && tsdb != NULL);
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
@ -6107,7 +6110,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, vo
|
||||||
goto _over;
|
goto _over;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = initQInfo(pQueryMsg, tsdb, vgId, *pQInfo, isSTableQuery, param, fn);
|
code = initQInfo(pQueryMsg, tsdb, vgId, *pQInfo, isSTableQuery, param);
|
||||||
|
|
||||||
_over:
|
_over:
|
||||||
free(tagCond);
|
free(tagCond);
|
||||||
|
@ -6122,47 +6125,34 @@ _over:
|
||||||
free(pExprMsg);
|
free(pExprMsg);
|
||||||
taosArrayDestroy(pTableIdList);
|
taosArrayDestroy(pTableIdList);
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < pQueryMsg->numOfCols; i++) {
|
||||||
|
SColumnInfo* column = pQueryMsg->colList + i;
|
||||||
|
freeColumnFilterInfo(column->filters, column->numOfFilters);
|
||||||
|
}
|
||||||
|
|
||||||
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
|
//pQInfo already freed in initQInfo, but *pQInfo may not pointer to null;
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
*pQInfo = NULL;
|
*pQInfo = NULL;
|
||||||
} else {
|
} else {
|
||||||
SQInfo* pq = (SQInfo*) (*pQInfo);
|
// SQInfo* pq = (SQInfo*) (*pQInfo);
|
||||||
|
|
||||||
T_REF_INC(pq);
|
// T_REF_INC(pq);
|
||||||
T_REF_INC(pq);
|
// T_REF_INC(pq);
|
||||||
}
|
}
|
||||||
|
|
||||||
// if failed to add ref for all meters in this query, abort current query
|
// if failed to add ref for all meters in this query, abort current query
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doDestoryQueryInfo(SQInfo* pQInfo) {
|
|
||||||
assert(pQInfo != NULL);
|
|
||||||
qDebug("QInfo:%p query completed", pQInfo);
|
|
||||||
queryCostStatis(pQInfo); // print the query cost summary
|
|
||||||
freeQInfo(pQInfo);
|
|
||||||
}
|
|
||||||
|
|
||||||
void qDestroyQueryInfo(qinfo_t qHandle) {
|
void qDestroyQueryInfo(qinfo_t qHandle) {
|
||||||
SQInfo* pQInfo = (SQInfo*) qHandle;
|
SQInfo* pQInfo = (SQInfo*) qHandle;
|
||||||
if (!isValidQInfo(pQInfo)) {
|
if (!isValidQInfo(pQInfo)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ref = T_REF_DEC(pQInfo);
|
qDebug("QInfo:%p query completed", pQInfo);
|
||||||
qDebug("QInfo:%p dec refCount, value:%d", pQInfo, ref);
|
queryCostStatis(pQInfo); // print the query cost summary
|
||||||
|
freeQInfo(pQInfo);
|
||||||
if (ref == 0) {
|
|
||||||
_qinfo_free_fn_t freeFp = pQInfo->freeFn;
|
|
||||||
void* param = pQInfo->param;
|
|
||||||
|
|
||||||
doDestoryQueryInfo(pQInfo);
|
|
||||||
if (freeFp != NULL) {
|
|
||||||
assert(param != NULL);
|
|
||||||
freeFp(param);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void qTableQuery(qinfo_t qinfo) {
|
void qTableQuery(qinfo_t qinfo) {
|
||||||
|
@ -6173,31 +6163,24 @@ void qTableQuery(qinfo_t qinfo) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
qDebug("QInfo:%p it is already killed, abort", pQInfo);
|
qDebug("QInfo:%p it is already killed, abort", pQInfo);
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
sem_post(&pQInfo->dataReady);
|
||||||
qDestroyQueryInfo(pQInfo);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
||||||
qDebug("QInfo:%p no table exists for query, abort", pQInfo);
|
qDebug("QInfo:%p no table exists for query, abort", pQInfo);
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
sem_post(&pQInfo->dataReady);
|
||||||
qDestroyQueryInfo(pQInfo);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ret = setjmp(pQInfo->runtimeEnv.env);
|
|
||||||
|
|
||||||
// error occurs, record the error code and return to client
|
// error occurs, record the error code and return to client
|
||||||
|
int32_t ret = setjmp(pQInfo->runtimeEnv.env);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
pQInfo->code = ret;
|
pQInfo->code = ret;
|
||||||
qDebug("QInfo:%p query abort due to error occurs, code:%s", pQInfo, tstrerror(pQInfo->code));
|
qDebug("QInfo:%p query abort due to error/cancel occurs, code:%s", pQInfo, tstrerror(pQInfo->code));
|
||||||
sem_post(&pQInfo->dataReady);
|
sem_post(&pQInfo->dataReady);
|
||||||
qDestroyQueryInfo(pQInfo);
|
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6214,7 +6197,7 @@ void qTableQuery(qinfo_t qinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
SQuery* pQuery = pRuntimeEnv->pQuery;
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
qDebug("QInfo:%p query is killed", pQInfo);
|
qDebug("QInfo:%p query is killed", pQInfo);
|
||||||
} else if (pQuery->rec.rows == 0) {
|
} else if (pQuery->rec.rows == 0) {
|
||||||
qDebug("QInfo:%p over, %zu tables queried, %"PRId64" rows are returned", pQInfo, pQInfo->tableqinfoGroupInfo.numOfTables, pQuery->rec.total);
|
qDebug("QInfo:%p over, %zu tables queried, %"PRId64" rows are returned", pQInfo, pQInfo->tableqinfoGroupInfo.numOfTables, pQuery->rec.total);
|
||||||
|
@ -6224,7 +6207,6 @@ void qTableQuery(qinfo_t qinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
sem_post(&pQInfo->dataReady);
|
||||||
qDestroyQueryInfo(pQInfo);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qRetrieveQueryResultInfo(qinfo_t qinfo) {
|
int32_t qRetrieveQueryResultInfo(qinfo_t qinfo) {
|
||||||
|
@ -6235,7 +6217,7 @@ int32_t qRetrieveQueryResultInfo(qinfo_t qinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
if (isQueryKilled(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
qDebug("QInfo:%p query is killed, code:%d", pQInfo, pQInfo->code);
|
qDebug("QInfo:%p query is killed, code:%d", pQInfo, pQInfo->code);
|
||||||
return pQInfo->code;
|
return pQInfo->code;
|
||||||
}
|
}
|
||||||
|
@ -6268,7 +6250,7 @@ bool qHasMoreResultsToRetrieve(qinfo_t qinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret) {
|
if (ret) {
|
||||||
T_REF_INC(pQInfo);
|
// T_REF_INC(pQInfo);
|
||||||
qDebug("QInfo:%p has more results waits for client retrieve", pQInfo);
|
qDebug("QInfo:%p has more results waits for client retrieve", pQInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6310,7 +6292,7 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
|
||||||
code = pQInfo->code;
|
code = pQInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isQueryKilled(pQInfo) || Q_STATUS_EQUAL(pQuery->status, QUERY_OVER)) {
|
if (IS_QUERY_KILLED(pQInfo) || Q_STATUS_EQUAL(pQuery->status, QUERY_OVER)) {
|
||||||
(*pRsp)->completed = 1; // notify no more result to client
|
(*pRsp)->completed = 1; // notify no more result to client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6325,7 +6307,6 @@ int32_t qKillQuery(qinfo_t qinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
setQueryKilled(pQInfo);
|
setQueryKilled(pQInfo);
|
||||||
qDestroyQueryInfo(pQInfo);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6470,6 +6451,7 @@ void freeqinfoFn(void *qhandle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
qKillQuery(*handle);
|
qKillQuery(*handle);
|
||||||
|
qDestroyQueryInfo(*handle);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qOpenQueryMgmt(int32_t vgId) {
|
void* qOpenQueryMgmt(int32_t vgId) {
|
||||||
|
@ -6488,7 +6470,11 @@ void* qOpenQueryMgmt(int32_t vgId) {
|
||||||
return pQueryHandle;
|
return pQueryHandle;
|
||||||
}
|
}
|
||||||
|
|
||||||
void qSetQueryMgmtClosed(void* pQMgmt) {
|
static void queryMgmtKillQueryFn(void* handle) {
|
||||||
|
qKillQuery(handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void qQueryMgmtNotifyClosed(void* pQMgmt) {
|
||||||
if (pQMgmt == NULL) {
|
if (pQMgmt == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -6500,7 +6486,7 @@ void qSetQueryMgmtClosed(void* pQMgmt) {
|
||||||
pQueryMgmt->closed = true;
|
pQueryMgmt->closed = true;
|
||||||
pthread_mutex_unlock(&pQueryMgmt->lock);
|
pthread_mutex_unlock(&pQueryMgmt->lock);
|
||||||
|
|
||||||
taosCacheRefresh(pQueryMgmt->qinfoPool, freeqinfoFn);
|
taosCacheRefresh(pQueryMgmt->qinfoPool, queryMgmtKillQueryFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qCleanupQueryMgmt(void* pQMgmt) {
|
void qCleanupQueryMgmt(void* pQMgmt) {
|
||||||
|
|
|
@ -509,10 +509,11 @@ uint32_t tSQLGetToken(char* z, uint32_t* tokenType) {
|
||||||
for (i = 1; isdigit(z[i]); i++) {
|
for (i = 1; isdigit(z[i]); i++) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* here is the 1a/2s/3m/9y */
|
/* here is the 1u/1a/2s/3m/9y */
|
||||||
if ((z[i] == 'a' || z[i] == 's' || z[i] == 'm' || z[i] == 'h' || z[i] == 'd' || z[i] == 'n' || z[i] == 'y' ||
|
if ((z[i] == 'u' || z[i] == 'a' || z[i] == 's' || z[i] == 'm' || z[i] == 'h' || z[i] == 'd' || z[i] == 'n' ||
|
||||||
z[i] == 'w' || z[i] == 'A' || z[i] == 'S' || z[i] == 'M' || z[i] == 'H' || z[i] == 'D' || z[i] == 'N' ||
|
z[i] == 'y' || z[i] == 'w' ||
|
||||||
z[i] == 'Y' || z[i] == 'W') &&
|
z[i] == 'U' || z[i] == 'A' || z[i] == 'S' || z[i] == 'M' || z[i] == 'H' || z[i] == 'D' || z[i] == 'N' ||
|
||||||
|
z[i] == 'Y' || z[i] == 'W') &&
|
||||||
(isIdChar[(uint8_t)z[i + 1]] == 0)) {
|
(isIdChar[(uint8_t)z[i + 1]] == 0)) {
|
||||||
*tokenType = TK_VARIABLE;
|
*tokenType = TK_VARIABLE;
|
||||||
i += 1;
|
i += 1;
|
||||||
|
|
|
@ -79,7 +79,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) {
|
||||||
pTSBuf->numOfAlloc = header.numOfVnode;
|
pTSBuf->numOfAlloc = header.numOfVnode;
|
||||||
STSVnodeBlockInfoEx* tmp = realloc(pTSBuf->pData, sizeof(STSVnodeBlockInfoEx) * pTSBuf->numOfAlloc);
|
STSVnodeBlockInfoEx* tmp = realloc(pTSBuf->pData, sizeof(STSVnodeBlockInfoEx) * pTSBuf->numOfAlloc);
|
||||||
if (tmp == NULL) {
|
if (tmp == NULL) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,7 +92,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) {
|
||||||
pTSBuf->tsOrder = header.tsOrder;
|
pTSBuf->tsOrder = header.tsOrder;
|
||||||
if (pTSBuf->tsOrder != TSDB_ORDER_ASC && pTSBuf->tsOrder != TSDB_ORDER_DESC) {
|
if (pTSBuf->tsOrder != TSDB_ORDER_ASC && pTSBuf->tsOrder != TSDB_ORDER_DESC) {
|
||||||
// tscError("invalid order info in buf:%d", pTSBuf->tsOrder);
|
// tscError("invalid order info in buf:%d", pTSBuf->tsOrder);
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -100,7 +100,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) {
|
||||||
|
|
||||||
STSVnodeBlockInfo* buf = (STSVnodeBlockInfo*)calloc(1, infoSize);
|
STSVnodeBlockInfo* buf = (STSVnodeBlockInfo*)calloc(1, infoSize);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,7 +120,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) {
|
||||||
|
|
||||||
struct stat fileStat;
|
struct stat fileStat;
|
||||||
if (fstat(fileno(pTSBuf->f), &fileStat) != 0) {
|
if (fstat(fileno(pTSBuf->f), &fileStat) != 0) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -137,7 +137,7 @@ STSBuf* tsBufCreateFromFile(const char* path, bool autoDelete) {
|
||||||
return pTSBuf;
|
return pTSBuf;
|
||||||
}
|
}
|
||||||
|
|
||||||
void* tsBufDestory(STSBuf* pTSBuf) {
|
void* tsBufDestroy(STSBuf* pTSBuf) {
|
||||||
if (pTSBuf == NULL) {
|
if (pTSBuf == NULL) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
@ -920,13 +920,13 @@ static STSBuf* allocResForTSBuf(STSBuf* pTSBuf) {
|
||||||
pTSBuf->numOfAlloc = INITIAL_VNODEINFO_SIZE;
|
pTSBuf->numOfAlloc = INITIAL_VNODEINFO_SIZE;
|
||||||
pTSBuf->pData = calloc(pTSBuf->numOfAlloc, sizeof(STSVnodeBlockInfoEx));
|
pTSBuf->pData = calloc(pTSBuf->numOfAlloc, sizeof(STSVnodeBlockInfoEx));
|
||||||
if (pTSBuf->pData == NULL) {
|
if (pTSBuf->pData == NULL) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTSBuf->tsData.rawBuf = malloc(MEM_BUF_SIZE);
|
pTSBuf->tsData.rawBuf = malloc(MEM_BUF_SIZE);
|
||||||
if (pTSBuf->tsData.rawBuf == NULL) {
|
if (pTSBuf->tsData.rawBuf == NULL) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -936,13 +936,13 @@ static STSBuf* allocResForTSBuf(STSBuf* pTSBuf) {
|
||||||
|
|
||||||
pTSBuf->assistBuf = malloc(MEM_BUF_SIZE);
|
pTSBuf->assistBuf = malloc(MEM_BUF_SIZE);
|
||||||
if (pTSBuf->assistBuf == NULL) {
|
if (pTSBuf->assistBuf == NULL) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTSBuf->block.payload = malloc(MEM_BUF_SIZE);
|
pTSBuf->block.payload = malloc(MEM_BUF_SIZE);
|
||||||
if (pTSBuf->block.payload == NULL) {
|
if (pTSBuf->block.payload == NULL) {
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -47,7 +47,7 @@ void simpleTest() {
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
||||||
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
||||||
|
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
// one large list of ts, the ts list need to be split into several small blocks
|
// one large list of ts, the ts list need to be split into several small blocks
|
||||||
|
@ -71,7 +71,7 @@ void largeTSTest() {
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
||||||
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
||||||
|
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void multiTagsTest() {
|
void multiTagsTest() {
|
||||||
|
@ -101,7 +101,7 @@ void multiTagsTest() {
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
||||||
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
||||||
|
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void multiVnodeTagsTest() {
|
void multiVnodeTagsTest() {
|
||||||
|
@ -139,7 +139,7 @@ void multiVnodeTagsTest() {
|
||||||
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
EXPECT_EQ(pTSBuf->tsData.len, 0);
|
||||||
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
EXPECT_EQ(pTSBuf->block.numOfElem, num);
|
||||||
|
|
||||||
tsBufDestory(pTSBuf);
|
tsBufDestroy(pTSBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadDataTest() {
|
void loadDataTest() {
|
||||||
|
@ -386,8 +386,8 @@ void mergeDiffVnodeBufferTest() {
|
||||||
|
|
||||||
tsBufDisplay(pTSBuf1);
|
tsBufDisplay(pTSBuf1);
|
||||||
|
|
||||||
tsBufDestory(pTSBuf2);
|
tsBufDestroy(pTSBuf2);
|
||||||
tsBufDestory(pTSBuf1);
|
tsBufDestroy(pTSBuf1);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mergeIdenticalVnodeBufferTest() {
|
void mergeIdenticalVnodeBufferTest() {
|
||||||
|
@ -432,8 +432,8 @@ void mergeIdenticalVnodeBufferTest() {
|
||||||
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.vnode, elem.tag, elem.ts);
|
printf("%d-%" PRIu64 "-%" PRIu64 "\n", elem.vnode, elem.tag, elem.ts);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsBufDestory(pTSBuf1);
|
tsBufDestroy(pTSBuf1);
|
||||||
tsBufDestory(pTSBuf2);
|
tsBufDestroy(pTSBuf2);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
|
@ -119,7 +119,8 @@ int tsdbInsertRowToMem(STsdbRepo *pRepo, SDataRow row, STable *pTable) {
|
||||||
|
|
||||||
int tsdbRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
|
int tsdbRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
|
||||||
if (pMemTable == NULL) return 0;
|
if (pMemTable == NULL) return 0;
|
||||||
T_REF_INC(pMemTable);
|
int ref = T_REF_INC(pMemTable);
|
||||||
|
tsdbDebug("vgId:%d ref memtable %p ref %d", REPO_ID(pRepo), pMemTable, ref);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,7 +128,9 @@ int tsdbRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
|
||||||
int tsdbUnRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
|
int tsdbUnRefMemTable(STsdbRepo *pRepo, SMemTable *pMemTable) {
|
||||||
if (pMemTable == NULL) return 0;
|
if (pMemTable == NULL) return 0;
|
||||||
|
|
||||||
if (T_REF_DEC(pMemTable) == 0) {
|
int ref = T_REF_DEC(pMemTable);
|
||||||
|
tsdbDebug("vgId:%d unref memtable %p ref %d", REPO_ID(pRepo), pMemTable, ref);
|
||||||
|
if (ref == 0) {
|
||||||
STsdbCfg * pCfg = &pRepo->config;
|
STsdbCfg * pCfg = &pRepo->config;
|
||||||
STsdbBufPool *pBufPool = pRepo->pPool;
|
STsdbBufPool *pBufPool = pRepo->pPool;
|
||||||
|
|
||||||
|
@ -167,6 +170,7 @@ int tsdbTakeMemSnapshot(STsdbRepo *pRepo, SMemTable **pMem, SMemTable **pIMem) {
|
||||||
tsdbRefMemTable(pRepo, *pIMem);
|
tsdbRefMemTable(pRepo, *pIMem);
|
||||||
|
|
||||||
if (tsdbUnlockRepo(pRepo) < 0) return -1;
|
if (tsdbUnlockRepo(pRepo) < 0) return -1;
|
||||||
|
tsdbDebug("vgId:%d take memory snapshot, pMem %p pIMem %p", REPO_ID(pRepo), *pMem, *pIMem);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -110,9 +110,10 @@ typedef struct STsdbQueryHandle {
|
||||||
SFileGroupIter fileIter;
|
SFileGroupIter fileIter;
|
||||||
SRWHelper rhelper;
|
SRWHelper rhelper;
|
||||||
STableBlockInfo* pDataBlockInfo;
|
STableBlockInfo* pDataBlockInfo;
|
||||||
|
int32_t allocSize; // allocated data block size
|
||||||
SMemTable* mem; // mem-table
|
SMemTable* mem; // mem-table
|
||||||
SMemTable* imem; // imem-table, acquired from snapshot
|
SMemTable* imem; // imem-table, acquired from snapshot
|
||||||
|
SArray* defaultLoadColumn;// default load column
|
||||||
SDataBlockLoadInfo dataBlockLoadInfo; /* record current block load information */
|
SDataBlockLoadInfo dataBlockLoadInfo; /* record current block load information */
|
||||||
SLoadCompBlockInfo compBlockLoadInfo; /* record current compblock information in SQuery */
|
SLoadCompBlockInfo compBlockLoadInfo; /* record current compblock information in SQuery */
|
||||||
} STsdbQueryHandle;
|
} STsdbQueryHandle;
|
||||||
|
@ -136,6 +137,34 @@ static void tsdbInitCompBlockLoadInfo(SLoadCompBlockInfo* pCompBlockLoadInfo) {
|
||||||
pCompBlockLoadInfo->fileId = -1;
|
pCompBlockLoadInfo->fileId = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SArray* getColumnIdList(STsdbQueryHandle* pQueryHandle) {
|
||||||
|
size_t numOfCols = QH_GET_NUM_OF_COLS(pQueryHandle);
|
||||||
|
assert(numOfCols <= TSDB_MAX_COLUMNS);
|
||||||
|
|
||||||
|
SArray* pIdList = taosArrayInit(numOfCols, sizeof(int16_t));
|
||||||
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
|
SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
|
||||||
|
taosArrayPush(pIdList, &pCol->info.colId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pIdList;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SArray* getDefaultLoadColumns(STsdbQueryHandle* pQueryHandle, bool loadTS) {
|
||||||
|
SArray* pLocalIdList = getColumnIdList(pQueryHandle);
|
||||||
|
|
||||||
|
// check if the primary time stamp column needs to load
|
||||||
|
int16_t colId = *(int16_t*)taosArrayGet(pLocalIdList, 0);
|
||||||
|
|
||||||
|
// the primary timestamp column does not be included in the the specified load column list, add it
|
||||||
|
if (loadTS && colId != 0) {
|
||||||
|
int16_t columnId = 0;
|
||||||
|
taosArrayInsert(pLocalIdList, 0, &columnId);
|
||||||
|
}
|
||||||
|
|
||||||
|
return pLocalIdList;
|
||||||
|
}
|
||||||
|
|
||||||
TsdbQueryHandleT* tsdbQueryTables(TSDB_REPO_T* tsdb, STsdbQueryCond* pCond, STableGroupInfo* groupList, void* qinfo) {
|
TsdbQueryHandleT* tsdbQueryTables(TSDB_REPO_T* tsdb, STsdbQueryCond* pCond, STableGroupInfo* groupList, void* qinfo) {
|
||||||
STsdbQueryHandle* pQueryHandle = calloc(1, sizeof(STsdbQueryHandle));
|
STsdbQueryHandle* pQueryHandle = calloc(1, sizeof(STsdbQueryHandle));
|
||||||
pQueryHandle->order = pCond->order;
|
pQueryHandle->order = pCond->order;
|
||||||
|
@ -148,7 +177,8 @@ TsdbQueryHandleT* tsdbQueryTables(TSDB_REPO_T* tsdb, STsdbQueryCond* pCond, STab
|
||||||
pQueryHandle->activeIndex = 0; // current active table index
|
pQueryHandle->activeIndex = 0; // current active table index
|
||||||
pQueryHandle->qinfo = qinfo;
|
pQueryHandle->qinfo = qinfo;
|
||||||
pQueryHandle->outputCapacity = ((STsdbRepo*)tsdb)->config.maxRowsPerFileBlock;
|
pQueryHandle->outputCapacity = ((STsdbRepo*)tsdb)->config.maxRowsPerFileBlock;
|
||||||
|
pQueryHandle->allocSize = 0;
|
||||||
|
|
||||||
tsdbInitReadHelper(&pQueryHandle->rhelper, (STsdbRepo*) tsdb);
|
tsdbInitReadHelper(&pQueryHandle->rhelper, (STsdbRepo*) tsdb);
|
||||||
tsdbTakeMemSnapshot(pQueryHandle->pTsdb, &pQueryHandle->mem, &pQueryHandle->imem);
|
tsdbTakeMemSnapshot(pQueryHandle->pTsdb, &pQueryHandle->mem, &pQueryHandle->imem);
|
||||||
|
|
||||||
|
@ -195,7 +225,9 @@ TsdbQueryHandleT* tsdbQueryTables(TSDB_REPO_T* tsdb, STsdbQueryCond* pCond, STab
|
||||||
taosArrayPush(pQueryHandle->pTableCheckInfo, &info);
|
taosArrayPush(pQueryHandle->pTableCheckInfo, &info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pQueryHandle->defaultLoadColumn = getDefaultLoadColumns(pQueryHandle, true);
|
||||||
|
|
||||||
tsdbDebug("%p total numOfTable:%zu in query", pQueryHandle, taosArrayGetSize(pQueryHandle->pTableCheckInfo));
|
tsdbDebug("%p total numOfTable:%zu in query", pQueryHandle, taosArrayGetSize(pQueryHandle->pTableCheckInfo));
|
||||||
|
|
||||||
tsdbInitDataBlockLoadInfo(&pQueryHandle->dataBlockLoadInfo);
|
tsdbInitDataBlockLoadInfo(&pQueryHandle->dataBlockLoadInfo);
|
||||||
|
@ -546,33 +578,7 @@ static int32_t getFileCompInfo(STsdbQueryHandle* pQueryHandle, int32_t* numOfBlo
|
||||||
.tid = (_checkInfo)->tableId.tid, \
|
.tid = (_checkInfo)->tableId.tid, \
|
||||||
.uid = (_checkInfo)->tableId.uid})
|
.uid = (_checkInfo)->tableId.uid})
|
||||||
|
|
||||||
static SArray* getColumnIdList(STsdbQueryHandle* pQueryHandle) {
|
|
||||||
size_t numOfCols = QH_GET_NUM_OF_COLS(pQueryHandle);
|
|
||||||
assert(numOfCols <= TSDB_MAX_COLUMNS);
|
|
||||||
|
|
||||||
SArray* pIdList = taosArrayInit(numOfCols, sizeof(int16_t));
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
|
||||||
SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
|
|
||||||
taosArrayPush(pIdList, &pCol->info.colId);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pIdList;
|
|
||||||
}
|
|
||||||
|
|
||||||
static SArray* getDefaultLoadColumns(STsdbQueryHandle* pQueryHandle, bool loadTS) {
|
|
||||||
SArray* pLocalIdList = getColumnIdList(pQueryHandle);
|
|
||||||
|
|
||||||
// check if the primary time stamp column needs to load
|
|
||||||
int16_t colId = *(int16_t*)taosArrayGet(pLocalIdList, 0);
|
|
||||||
|
|
||||||
// the primary timestamp column does not be included in the the specified load column list, add it
|
|
||||||
if (loadTS && colId != 0) {
|
|
||||||
int16_t columnId = 0;
|
|
||||||
taosArrayInsert(pLocalIdList, 0, &columnId);
|
|
||||||
}
|
|
||||||
|
|
||||||
return pLocalIdList;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock, STableCheckInfo* pCheckInfo) {
|
static bool doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock, STableCheckInfo* pCheckInfo) {
|
||||||
STsdbRepo *pRepo = pQueryHandle->pTsdb;
|
STsdbRepo *pRepo = pQueryHandle->pTsdb;
|
||||||
|
@ -584,8 +590,6 @@ static bool doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlo
|
||||||
data->uid = pCheckInfo->pTableObj->tableId.uid;
|
data->uid = pCheckInfo->pTableObj->tableId.uid;
|
||||||
|
|
||||||
bool blockLoaded = false;
|
bool blockLoaded = false;
|
||||||
SArray* sa = getDefaultLoadColumns(pQueryHandle, true);
|
|
||||||
|
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
if (pCheckInfo->pDataCols == NULL) {
|
if (pCheckInfo->pDataCols == NULL) {
|
||||||
|
@ -613,7 +617,6 @@ static bool doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlo
|
||||||
assert(pCols->numOfRows != 0 && pCols->numOfRows <= pBlock->numOfRows);
|
assert(pCols->numOfRows != 0 && pCols->numOfRows <= pBlock->numOfRows);
|
||||||
|
|
||||||
pBlock->numOfRows = pCols->numOfRows;
|
pBlock->numOfRows = pCols->numOfRows;
|
||||||
taosArrayDestroy(sa);
|
|
||||||
tfree(data);
|
tfree(data);
|
||||||
|
|
||||||
int64_t et = taosGetTimestampUs() - st;
|
int64_t et = taosGetTimestampUs() - st;
|
||||||
|
@ -656,12 +659,8 @@ static void handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SCompBlock*
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* sa = getDefaultLoadColumns(pQueryHandle, true);
|
|
||||||
|
|
||||||
doLoadFileDataBlock(pQueryHandle, pBlock, pCheckInfo);
|
doLoadFileDataBlock(pQueryHandle, pBlock, pCheckInfo);
|
||||||
doMergeTwoLevelData(pQueryHandle, pCheckInfo, pBlock, sa);
|
doMergeTwoLevelData(pQueryHandle, pCheckInfo, pBlock, pQueryHandle->defaultLoadColumn);
|
||||||
taosArrayDestroy(sa);
|
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
/*
|
/*
|
||||||
* no data in cache, only load data from file
|
* no data in cache, only load data from file
|
||||||
|
@ -681,14 +680,12 @@ static void handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SCompBlock*
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock, STableCheckInfo* pCheckInfo) {
|
static bool loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock, STableCheckInfo* pCheckInfo) {
|
||||||
SArray* sa = getDefaultLoadColumns(pQueryHandle, true);
|
|
||||||
SQueryFilePos* cur = &pQueryHandle->cur;
|
SQueryFilePos* cur = &pQueryHandle->cur;
|
||||||
|
|
||||||
if (ASCENDING_TRAVERSE(pQueryHandle->order)) {
|
if (ASCENDING_TRAVERSE(pQueryHandle->order)) {
|
||||||
// query ended in current block
|
// query ended in current block
|
||||||
if (pQueryHandle->window.ekey < pBlock->keyLast || pCheckInfo->lastKey > pBlock->keyFirst) {
|
if (pQueryHandle->window.ekey < pBlock->keyLast || pCheckInfo->lastKey > pBlock->keyFirst) {
|
||||||
if (!doLoadFileDataBlock(pQueryHandle, pBlock, pCheckInfo)) {
|
if (!doLoadFileDataBlock(pQueryHandle, pBlock, pCheckInfo)) {
|
||||||
taosArrayDestroy(sa);
|
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -702,7 +699,7 @@ static bool loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock
|
||||||
cur->pos = 0;
|
cur->pos = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
doMergeTwoLevelData(pQueryHandle, pCheckInfo, pBlock, sa);
|
doMergeTwoLevelData(pQueryHandle, pCheckInfo, pBlock, pQueryHandle->defaultLoadColumn);
|
||||||
} else { // the whole block is loaded in to buffer
|
} else { // the whole block is loaded in to buffer
|
||||||
handleDataMergeIfNeeded(pQueryHandle, pBlock, pCheckInfo);
|
handleDataMergeIfNeeded(pQueryHandle, pBlock, pCheckInfo);
|
||||||
}
|
}
|
||||||
|
@ -719,13 +716,12 @@ static bool loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBlock
|
||||||
cur->pos = pBlock->numOfRows - 1;
|
cur->pos = pBlock->numOfRows - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
doMergeTwoLevelData(pQueryHandle, pCheckInfo, pBlock, sa);
|
doMergeTwoLevelData(pQueryHandle, pCheckInfo, pBlock, pQueryHandle->defaultLoadColumn);
|
||||||
} else {
|
} else {
|
||||||
handleDataMergeIfNeeded(pQueryHandle, pBlock, pCheckInfo);
|
handleDataMergeIfNeeded(pQueryHandle, pBlock, pCheckInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(sa);
|
|
||||||
return pQueryHandle->realNumOfRows > 0;
|
return pQueryHandle->realNumOfRows > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1250,13 +1246,19 @@ static int32_t dataBlockOrderCompar(const void* pLeft, const void* pRight, void*
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t createDataBlocksInfo(STsdbQueryHandle* pQueryHandle, int32_t numOfBlocks, int32_t* numOfAllocBlocks) {
|
static int32_t createDataBlocksInfo(STsdbQueryHandle* pQueryHandle, int32_t numOfBlocks, int32_t* numOfAllocBlocks) {
|
||||||
char* tmp = realloc(pQueryHandle->pDataBlockInfo, sizeof(STableBlockInfo) * numOfBlocks);
|
size_t size = sizeof(STableBlockInfo) * numOfBlocks;
|
||||||
if (tmp == NULL) {
|
|
||||||
return TSDB_CODE_TDB_OUT_OF_MEMORY;
|
if (pQueryHandle->allocSize < size) {
|
||||||
|
pQueryHandle->allocSize = size;
|
||||||
|
char* tmp = realloc(pQueryHandle->pDataBlockInfo, pQueryHandle->allocSize);
|
||||||
|
if (tmp == NULL) {
|
||||||
|
return TSDB_CODE_TDB_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pQueryHandle->pDataBlockInfo = (STableBlockInfo*) tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
pQueryHandle->pDataBlockInfo = (STableBlockInfo*) tmp;
|
memset(pQueryHandle->pDataBlockInfo, 0, size);
|
||||||
memset(pQueryHandle->pDataBlockInfo, 0, sizeof(STableBlockInfo) * numOfBlocks);
|
|
||||||
*numOfAllocBlocks = numOfBlocks;
|
*numOfAllocBlocks = numOfBlocks;
|
||||||
|
|
||||||
int32_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
|
int32_t numOfTables = taosArrayGetSize(pQueryHandle->pTableCheckInfo);
|
||||||
|
@ -1492,9 +1494,8 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* sa = getDefaultLoadColumns(pQueryHandle, true);
|
|
||||||
/*SDataBlockInfo* pBlockInfo =*/ tsdbRetrieveDataBlockInfo(pHandle, &blockInfo);
|
/*SDataBlockInfo* pBlockInfo =*/ tsdbRetrieveDataBlockInfo(pHandle, &blockInfo);
|
||||||
/*SArray *pDataBlock = */tsdbRetrieveDataBlock(pHandle, sa);
|
/*SArray *pDataBlock = */tsdbRetrieveDataBlock(pHandle, pQueryHandle->defaultLoadColumn);
|
||||||
|
|
||||||
if (pQueryHandle->cur.win.ekey == pQueryHandle->window.skey) {
|
if (pQueryHandle->cur.win.ekey == pQueryHandle->window.skey) {
|
||||||
// data already retrieve, discard other data rows and return
|
// data already retrieve, discard other data rows and return
|
||||||
|
@ -1508,7 +1509,6 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
|
||||||
pQueryHandle->window = pQueryHandle->cur.win;
|
pQueryHandle->window = pQueryHandle->cur.win;
|
||||||
pQueryHandle->cur.rows = 1;
|
pQueryHandle->cur.rows = 1;
|
||||||
pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL;
|
pQueryHandle->type = TSDB_QUERY_TYPE_EXTERNAL;
|
||||||
taosArrayDestroy(sa);
|
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
STsdbQueryHandle* pSecQueryHandle = calloc(1, sizeof(STsdbQueryHandle));
|
STsdbQueryHandle* pSecQueryHandle = calloc(1, sizeof(STsdbQueryHandle));
|
||||||
|
@ -1565,7 +1565,7 @@ bool tsdbNextDataBlock(TsdbQueryHandleT* pHandle) {
|
||||||
assert(ret);
|
assert(ret);
|
||||||
|
|
||||||
/*SDataBlockInfo* pBlockInfo =*/ tsdbRetrieveDataBlockInfo((void*) pSecQueryHandle, &blockInfo);
|
/*SDataBlockInfo* pBlockInfo =*/ tsdbRetrieveDataBlockInfo((void*) pSecQueryHandle, &blockInfo);
|
||||||
/*SArray *pDataBlock = */tsdbRetrieveDataBlock((void*) pSecQueryHandle, sa);
|
/*SArray *pDataBlock = */tsdbRetrieveDataBlock((void*) pSecQueryHandle, pSecQueryHandle->defaultLoadColumn);
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfCols; ++i) {
|
for (int32_t i = 0; i < numOfCols; ++i) {
|
||||||
SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
|
SColumnInfoData* pCol = taosArrayGet(pQueryHandle->pColumns, i);
|
||||||
|
@ -2333,6 +2333,7 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pQueryHandle->pColumns);
|
taosArrayDestroy(pQueryHandle->pColumns);
|
||||||
|
taosArrayDestroy(pQueryHandle->defaultLoadColumn);
|
||||||
tfree(pQueryHandle->pDataBlockInfo);
|
tfree(pQueryHandle->pDataBlockInfo);
|
||||||
tfree(pQueryHandle->statis);
|
tfree(pQueryHandle->statis);
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ extern "C" {
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#define TARRAY_MIN_SIZE 8
|
#define TARRAY_MIN_SIZE 8
|
||||||
#define TARRAY_GET_ELEM(array, index) ((array)->pData + (index) * (array)->elemSize)
|
#define TARRAY_GET_ELEM(array, index) ((void*)((array)->pData + (index) * (array)->elemSize))
|
||||||
|
|
||||||
typedef struct SArray {
|
typedef struct SArray {
|
||||||
size_t size;
|
size_t size;
|
||||||
|
|
|
@ -33,17 +33,20 @@ typedef struct SCacheStatis {
|
||||||
int64_t refreshCount;
|
int64_t refreshCount;
|
||||||
} SCacheStatis;
|
} SCacheStatis;
|
||||||
|
|
||||||
|
struct STrashElem;
|
||||||
|
|
||||||
typedef struct SCacheDataNode {
|
typedef struct SCacheDataNode {
|
||||||
uint64_t addedTime; // the added time when this element is added or updated into cache
|
uint64_t addedTime; // the added time when this element is added or updated into cache
|
||||||
uint64_t lifespan; // expiredTime expiredTime when this element should be remove from cache
|
uint64_t lifespan; // life duration when this element should be remove from cache
|
||||||
uint64_t signature;
|
uint64_t expireTime; // expire time
|
||||||
uint32_t size; // allocated size for current SCacheDataNode
|
uint64_t signature;
|
||||||
|
struct STrashElem *pTNodeHeader; // point to trash node head
|
||||||
|
uint16_t keySize: 15; // max key size: 32kb
|
||||||
|
bool inTrashCan: 1;// denote if it is in trash or not
|
||||||
|
uint32_t size; // allocated size for current SCacheDataNode
|
||||||
T_REF_DECLARE()
|
T_REF_DECLARE()
|
||||||
uint16_t keySize: 15; // max key size: 32kb
|
char *key;
|
||||||
bool inTrashCan: 1;// denote if it is in trash or not
|
char data[];
|
||||||
int32_t extendFactor; // number of life span extend
|
|
||||||
char *key;
|
|
||||||
char data[];
|
|
||||||
} SCacheDataNode;
|
} SCacheDataNode;
|
||||||
|
|
||||||
typedef struct STrashElem {
|
typedef struct STrashElem {
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
|
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
|
||||||
|
void taosSetRandomFileFailFactor(int factor);
|
||||||
ssize_t taos_tread(int fd, void *buf, size_t count);
|
ssize_t taos_tread(int fd, void *buf, size_t count);
|
||||||
ssize_t taos_twrite(int fd, void *buf, size_t count);
|
ssize_t taos_twrite(int fd, void *buf, size_t count);
|
||||||
off_t taos_lseek(int fd, off_t offset, int whence);
|
off_t taos_lseek(int fd, off_t offset, int whence);
|
||||||
|
|
|
@ -116,11 +116,13 @@ static FORCE_INLINE void taosCacheReleaseNode(SCacheObj *pCacheObj, SCacheDataNo
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t size = pNode->size;
|
|
||||||
taosHashRemove(pCacheObj->pHashTable, pNode->key, pNode->keySize);
|
taosHashRemove(pCacheObj->pHashTable, pNode->key, pNode->keySize);
|
||||||
|
|
||||||
|
pCacheObj->totalSize -= pNode->size;
|
||||||
uDebug("cache:%s, key:%p, %p is destroyed from cache, totalNum:%d totalSize:%" PRId64 "bytes size:%dbytes",
|
uDebug("cache:%s, key:%p, %p is destroyed from cache, totalNum:%d totalSize:%" PRId64 "bytes size:%dbytes",
|
||||||
pCacheObj->name, pNode->key, pNode->data, (int32_t)taosHashGetSize(pCacheObj->pHashTable), pCacheObj->totalSize, size);
|
pCacheObj->name, pNode->key, pNode->data, (int32_t)taosHashGetSize(pCacheObj->pHashTable), pCacheObj->totalSize,
|
||||||
|
pNode->size);
|
||||||
|
|
||||||
if (pCacheObj->freeFp) pCacheObj->freeFp(pNode->data);
|
if (pCacheObj->freeFp) pCacheObj->freeFp(pNode->data);
|
||||||
free(pNode);
|
free(pNode);
|
||||||
}
|
}
|
||||||
|
@ -285,7 +287,7 @@ void *taosCachePut(SCacheObj *pCacheObj, const void *key, size_t keyLen, const v
|
||||||
|
|
||||||
uDebug("cache:%s, key:%p, %p added into cache, added:%" PRIu64 ", expire:%" PRIu64 ", totalNum:%d totalSize:%" PRId64
|
uDebug("cache:%s, key:%p, %p added into cache, added:%" PRIu64 ", expire:%" PRIu64 ", totalNum:%d totalSize:%" PRId64
|
||||||
"bytes size:%" PRId64 "bytes",
|
"bytes size:%" PRId64 "bytes",
|
||||||
pCacheObj->name, key, pNode->data, pNode->addedTime, (pNode->lifespan * pNode->extendFactor + pNode->addedTime),
|
pCacheObj->name, key, pNode->data, pNode->addedTime, pNode->expireTime,
|
||||||
(int32_t)taosHashGetSize(pCacheObj->pHashTable), pCacheObj->totalSize, dataSize);
|
(int32_t)taosHashGetSize(pCacheObj->pHashTable), pCacheObj->totalSize, dataSize);
|
||||||
} else {
|
} else {
|
||||||
uError("cache:%s, key:%p, failed to added into cache, out of memory", pCacheObj->name, key);
|
uError("cache:%s, key:%p, failed to added into cache, out of memory", pCacheObj->name, key);
|
||||||
|
@ -312,16 +314,6 @@ void *taosCacheAcquireByKey(SCacheObj *pCacheObj, const void *key, size_t keyLen
|
||||||
int32_t ref = 0;
|
int32_t ref = 0;
|
||||||
if (ptNode != NULL) {
|
if (ptNode != NULL) {
|
||||||
ref = T_REF_INC(*ptNode);
|
ref = T_REF_INC(*ptNode);
|
||||||
|
|
||||||
// if the remained life span is less then the (*ptNode)->lifeSpan, add up one lifespan
|
|
||||||
if (pCacheObj->extendLifespan) {
|
|
||||||
int64_t now = taosGetTimestampMs();
|
|
||||||
|
|
||||||
if ((now - (*ptNode)->addedTime) < (*ptNode)->lifespan * (*ptNode)->extendFactor) {
|
|
||||||
(*ptNode)->extendFactor += 1;
|
|
||||||
uDebug("key:%p extend life time to %"PRId64, key, (*ptNode)->lifespan * (*ptNode)->extendFactor + (*ptNode)->addedTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
__cache_unlock(pCacheObj);
|
__cache_unlock(pCacheObj);
|
||||||
|
|
||||||
|
@ -347,8 +339,7 @@ void* taosCacheUpdateExpireTimeByName(SCacheObj *pCacheObj, void *key, size_t ke
|
||||||
SCacheDataNode **ptNode = (SCacheDataNode **)taosHashGet(pCacheObj->pHashTable, key, keyLen);
|
SCacheDataNode **ptNode = (SCacheDataNode **)taosHashGet(pCacheObj->pHashTable, key, keyLen);
|
||||||
if (ptNode != NULL) {
|
if (ptNode != NULL) {
|
||||||
T_REF_INC(*ptNode);
|
T_REF_INC(*ptNode);
|
||||||
(*ptNode)->extendFactor += 1;
|
(*ptNode)->expireTime = taosGetTimestampMs() + (*ptNode)->lifespan;
|
||||||
// (*ptNode)->lifespan = expireTime;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
__cache_unlock(pCacheObj);
|
__cache_unlock(pCacheObj);
|
||||||
|
@ -380,17 +371,6 @@ void *taosCacheAcquireByData(SCacheObj *pCacheObj, void *data) {
|
||||||
int32_t ref = T_REF_INC(ptNode);
|
int32_t ref = T_REF_INC(ptNode);
|
||||||
uDebug("cache:%s, data: %p acquired by data in cache, refcnt:%d", pCacheObj->name, ptNode->data, ref);
|
uDebug("cache:%s, data: %p acquired by data in cache, refcnt:%d", pCacheObj->name, ptNode->data, ref);
|
||||||
|
|
||||||
// if the remained life span is less then the (*ptNode)->lifeSpan, add up one lifespan
|
|
||||||
if (pCacheObj->extendLifespan) {
|
|
||||||
int64_t now = taosGetTimestampMs();
|
|
||||||
|
|
||||||
if ((now - ptNode->addedTime) < ptNode->lifespan * ptNode->extendFactor) {
|
|
||||||
ptNode->extendFactor += 1;
|
|
||||||
uDebug("cache:%s, %p extend life time to %" PRId64, pCacheObj->name, ptNode->data,
|
|
||||||
ptNode->lifespan * ptNode->extendFactor + ptNode->addedTime);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// the data if referenced by at least one object, so the reference count must be greater than the value of 2.
|
// the data if referenced by at least one object, so the reference count must be greater than the value of 2.
|
||||||
assert(ref >= 2);
|
assert(ref >= 2);
|
||||||
return data;
|
return data;
|
||||||
|
@ -431,22 +411,58 @@ void taosCacheRelease(SCacheObj *pCacheObj, void **data, bool _remove) {
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = NULL;
|
*data = NULL;
|
||||||
int16_t ref = T_REF_DEC(pNode);
|
|
||||||
uDebug("cache:%s, key:%p, %p is released, refcnt:%d", pCacheObj->name, pNode->key, pNode->data, ref);
|
|
||||||
|
|
||||||
if (_remove && (!pNode->inTrashCan)) {
|
// note: extend lifespan before dec ref count
|
||||||
__cache_wr_lock(pCacheObj);
|
if (pCacheObj->extendLifespan) {
|
||||||
|
atomic_store_64(&pNode->expireTime, pNode->lifespan + taosGetTimestampMs());
|
||||||
|
uDebug("cache:%s data:%p extend life time to %"PRId64 " before release", pCacheObj->name, pNode->data, pNode->expireTime);
|
||||||
|
}
|
||||||
|
|
||||||
if (T_REF_VAL_GET(pNode) == 0) {
|
bool inTrashCan = pNode->inTrashCan;
|
||||||
// remove directly, if not referenced by other users
|
uDebug("cache:%s, key:%p, %p is released, refcnt:%d", pCacheObj->name, pNode->key, pNode->data, T_REF_VAL_GET(pNode) - 1);
|
||||||
taosCacheReleaseNode(pCacheObj, pNode);
|
|
||||||
} else {
|
// NOTE: once refcount is decrease, pNode may be free by other thread immediately.
|
||||||
// pNode may be released immediately by other thread after the reference count of pNode is set to 0,
|
int32_t ref = T_REF_DEC(pNode);
|
||||||
// So we need to lock it in the first place.
|
|
||||||
taosCacheMoveToTrash(pCacheObj, pNode);
|
if (inTrashCan) {
|
||||||
|
// Remove it if the ref count is 0.
|
||||||
|
// The ref count does not need to load and check again after lock acquired, since ref count can not be increased when
|
||||||
|
// the node is in trashcan.
|
||||||
|
if (ref == 0) {
|
||||||
|
__cache_wr_lock(pCacheObj);
|
||||||
|
assert(pNode->pTNodeHeader->pData == pNode);
|
||||||
|
taosRemoveFromTrashCan(pCacheObj, pNode->pTNodeHeader);
|
||||||
|
__cache_unlock(pCacheObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
__cache_unlock(pCacheObj);
|
} else {
|
||||||
|
assert(pNode->pTNodeHeader == NULL);
|
||||||
|
|
||||||
|
if (_remove) { // not in trash can, but need to remove it
|
||||||
|
__cache_wr_lock(pCacheObj);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If not referenced by other users. Otherwise move this node to trashcan wait for all users
|
||||||
|
* releasing this resources.
|
||||||
|
*
|
||||||
|
* NOTE: previous ref is 0, and current ref is still 0, remove it. If previous is not 0, there is another thread
|
||||||
|
* that tries to do the same thing.
|
||||||
|
*/
|
||||||
|
if (ref == 0) {
|
||||||
|
if (T_REF_VAL_GET(pNode) == 0) {
|
||||||
|
taosCacheReleaseNode(pCacheObj, pNode);
|
||||||
|
} else {
|
||||||
|
taosCacheMoveToTrash(pCacheObj, pNode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
__cache_unlock(pCacheObj);
|
||||||
|
// } else { // extend its life time
|
||||||
|
// if (pCacheObj->extendLifespan) {
|
||||||
|
// atomic_store_64(&pNode->expireTime, pNode->lifespan + taosGetTimestampMs());
|
||||||
|
// uDebug("cache:%s data:%p extend life time to %"PRId64 " after release", pCacheObj->name, pNode->data, pNode->expireTime);
|
||||||
|
// }
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -486,7 +502,7 @@ void taosCacheCleanup(SCacheObj *pCacheObj) {
|
||||||
|
|
||||||
SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *pData, size_t size,
|
SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *pData, size_t size,
|
||||||
uint64_t duration) {
|
uint64_t duration) {
|
||||||
size_t totalSize = size + sizeof(SCacheDataNode) + keyLen + 1;
|
size_t totalSize = size + sizeof(SCacheDataNode) + keyLen;
|
||||||
|
|
||||||
SCacheDataNode *pNewNode = calloc(1, totalSize);
|
SCacheDataNode *pNewNode = calloc(1, totalSize);
|
||||||
if (pNewNode == NULL) {
|
if (pNewNode == NULL) {
|
||||||
|
@ -503,7 +519,7 @@ SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *
|
||||||
|
|
||||||
pNewNode->addedTime = (uint64_t)taosGetTimestampMs();
|
pNewNode->addedTime = (uint64_t)taosGetTimestampMs();
|
||||||
pNewNode->lifespan = duration;
|
pNewNode->lifespan = duration;
|
||||||
pNewNode->extendFactor = 1;
|
pNewNode->expireTime = pNewNode->addedTime + pNewNode->lifespan;
|
||||||
pNewNode->signature = (uint64_t)pNewNode;
|
pNewNode->signature = (uint64_t)pNewNode;
|
||||||
pNewNode->size = (uint32_t)totalSize;
|
pNewNode->size = (uint32_t)totalSize;
|
||||||
|
|
||||||
|
@ -512,6 +528,7 @@ SCacheDataNode *taosCreateCacheNode(const char *key, size_t keyLen, const char *
|
||||||
|
|
||||||
void taosAddToTrash(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
|
void taosAddToTrash(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
|
||||||
if (pNode->inTrashCan) { /* node is already in trash */
|
if (pNode->inTrashCan) { /* node is already in trash */
|
||||||
|
assert(pNode->pTNodeHeader != NULL && pNode->pTNodeHeader->pData == pNode);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -527,6 +544,7 @@ void taosAddToTrash(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
|
||||||
pCacheObj->pTrash = pElem;
|
pCacheObj->pTrash = pElem;
|
||||||
|
|
||||||
pNode->inTrashCan = true;
|
pNode->inTrashCan = true;
|
||||||
|
pNode->pTNodeHeader = pElem;
|
||||||
pCacheObj->numOfElemsInTrash++;
|
pCacheObj->numOfElemsInTrash++;
|
||||||
|
|
||||||
uDebug("key:%p, %p move to trash, numOfElem in trash:%d", pNode->key, pNode->data, pCacheObj->numOfElemsInTrash);
|
uDebug("key:%p, %p move to trash, numOfElem in trash:%d", pNode->key, pNode->data, pCacheObj->numOfElemsInTrash);
|
||||||
|
@ -629,7 +647,7 @@ static void doCacheRefresh(SCacheObj* pCacheObj, int64_t time, __cache_free_fn_t
|
||||||
__cache_wr_lock(pCacheObj);
|
__cache_wr_lock(pCacheObj);
|
||||||
while (taosHashIterNext(pIter)) {
|
while (taosHashIterNext(pIter)) {
|
||||||
SCacheDataNode *pNode = *(SCacheDataNode **)taosHashIterGet(pIter);
|
SCacheDataNode *pNode = *(SCacheDataNode **)taosHashIterGet(pIter);
|
||||||
if ((pNode->addedTime + pNode->lifespan * pNode->extendFactor) <= time && T_REF_VAL_GET(pNode) <= 0) {
|
if (pNode->expireTime < time && T_REF_VAL_GET(pNode) <= 0) {
|
||||||
taosCacheReleaseNode(pCacheObj, pNode);
|
taosCacheReleaseNode(pCacheObj, pNode);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,40 +26,51 @@
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
#define RANDOM_FILE_FAIL_FACTOR 5
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
|
||||||
|
static int random_file_fail_factor = 20;
|
||||||
|
|
||||||
|
void taosSetRandomFileFailFactor(int factor)
|
||||||
|
{
|
||||||
|
random_file_fail_factor = factor;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
ssize_t taos_tread(int fd, void *buf, size_t count)
|
ssize_t taos_tread(int fd, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
if (rand() % RANDOM_FILE_FAIL_FACTOR == 0) {
|
if (random_file_fail_factor > 0) {
|
||||||
errno = EIO;
|
if (rand() % random_file_fail_factor == 0) {
|
||||||
return -1;
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return tread(fd, buf, count);
|
return tread(fd, buf, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t taos_twrite(int fd, void *buf, size_t count)
|
ssize_t taos_twrite(int fd, void *buf, size_t count)
|
||||||
{
|
{
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
if (rand() % RANDOM_FILE_FAIL_FACTOR == 0) {
|
if (random_file_fail_factor > 0) {
|
||||||
errno = EIO;
|
if (rand() % random_file_fail_factor == 0) {
|
||||||
return -1;
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return twrite(fd, buf, count);
|
return twrite(fd, buf, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
off_t taos_lseek(int fd, off_t offset, int whence)
|
off_t taos_lseek(int fd, off_t offset, int whence)
|
||||||
{
|
{
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
if (rand() % RANDOM_FILE_FAIL_FACTOR == 0) {
|
if (random_file_fail_factor > 0) {
|
||||||
errno = EIO;
|
if (rand() % random_file_fail_factor == 0) {
|
||||||
return -1;
|
errno = EIO;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
return lseek(fd, offset, whence);
|
return lseek(fd, offset, whence);
|
||||||
}
|
}
|
||||||
|
|
|
@ -317,29 +317,34 @@ int32_t parseLocaltimeWithDst(char* timestr, int64_t* time, int32_t timePrec) {
|
||||||
static int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t* result) {
|
static int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t* result) {
|
||||||
*result = val;
|
*result = val;
|
||||||
|
|
||||||
|
int64_t factor = 1000L;
|
||||||
|
|
||||||
switch (unit) {
|
switch (unit) {
|
||||||
case 's':
|
case 's':
|
||||||
(*result) *= MILLISECOND_PER_SECOND;
|
(*result) *= MILLISECOND_PER_SECOND*factor;
|
||||||
break;
|
break;
|
||||||
case 'm':
|
case 'm':
|
||||||
(*result) *= MILLISECOND_PER_MINUTE;
|
(*result) *= MILLISECOND_PER_MINUTE*factor;
|
||||||
break;
|
break;
|
||||||
case 'h':
|
case 'h':
|
||||||
(*result) *= MILLISECOND_PER_HOUR;
|
(*result) *= MILLISECOND_PER_HOUR*factor;
|
||||||
break;
|
break;
|
||||||
case 'd':
|
case 'd':
|
||||||
(*result) *= MILLISECOND_PER_DAY;
|
(*result) *= MILLISECOND_PER_DAY*factor;
|
||||||
break;
|
break;
|
||||||
case 'w':
|
case 'w':
|
||||||
(*result) *= MILLISECOND_PER_WEEK;
|
(*result) *= MILLISECOND_PER_WEEK*factor;
|
||||||
break;
|
break;
|
||||||
case 'n':
|
case 'n':
|
||||||
(*result) *= MILLISECOND_PER_MONTH;
|
(*result) *= MILLISECOND_PER_MONTH*factor;
|
||||||
break;
|
break;
|
||||||
case 'y':
|
case 'y':
|
||||||
(*result) *= MILLISECOND_PER_YEAR;
|
(*result) *= MILLISECOND_PER_YEAR*factor;
|
||||||
break;
|
break;
|
||||||
case 'a':
|
case 'a':
|
||||||
|
(*result) *= factor;
|
||||||
|
break;
|
||||||
|
case 'u':
|
||||||
break;
|
break;
|
||||||
default: {
|
default: {
|
||||||
;
|
;
|
||||||
|
@ -348,7 +353,6 @@ static int32_t getTimestampInUsFromStrImpl(int64_t val, char unit, int64_t* resu
|
||||||
}
|
}
|
||||||
|
|
||||||
/* get the value in microsecond */
|
/* get the value in microsecond */
|
||||||
(*result) *= 1000L;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -508,7 +508,7 @@ static void vnodeCleanUp(SVnodeObj *pVnode) {
|
||||||
vTrace("vgId:%d, vnode will cleanup, refCount:%d", pVnode->vgId, pVnode->refCount);
|
vTrace("vgId:%d, vnode will cleanup, refCount:%d", pVnode->vgId, pVnode->refCount);
|
||||||
|
|
||||||
// release local resources only after cutting off outside connections
|
// release local resources only after cutting off outside connections
|
||||||
qSetQueryMgmtClosed(pVnode->qMgmt);
|
qQueryMgmtNotifyClosed(pVnode->qMgmt);
|
||||||
vnodeRelease(pVnode);
|
vnodeRelease(pVnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
vWarn("QInfo:%p invalid qhandle, no matched query handle, conn:%p", (void*) killQueryMsg->qhandle, pReadMsg->rpcMsg.handle);
|
vWarn("QInfo:%p invalid qhandle, no matched query handle, conn:%p", (void*) killQueryMsg->qhandle, pReadMsg->rpcMsg.handle);
|
||||||
} else {
|
} else {
|
||||||
assert(*qhandle == (void*) killQueryMsg->qhandle);
|
assert(*qhandle == (void*) killQueryMsg->qhandle);
|
||||||
|
qKillQuery(*qhandle);
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void**) &qhandle, true);
|
qReleaseQInfo(pVnode->qMgmt, (void**) &qhandle, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -93,7 +94,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
|
|
||||||
if (contLen != 0) {
|
if (contLen != 0) {
|
||||||
qinfo_t pQInfo = NULL;
|
qinfo_t pQInfo = NULL;
|
||||||
code = qCreateQueryInfo(pVnode->tsdb, pVnode->vgId, pQueryTableMsg, pVnode, NULL, &pQInfo);
|
code = qCreateQueryInfo(pVnode->tsdb, pVnode->vgId, pQueryTableMsg, pVnode, &pQInfo);
|
||||||
|
|
||||||
SQueryTableRsp *pRsp = (SQueryTableRsp *) rpcMallocCont(sizeof(SQueryTableRsp));
|
SQueryTableRsp *pRsp = (SQueryTableRsp *) rpcMallocCont(sizeof(SQueryTableRsp));
|
||||||
pRsp->code = code;
|
pRsp->code = code;
|
||||||
|
@ -108,9 +109,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
handle = qRegisterQInfo(pVnode->qMgmt, (uint64_t) pQInfo);
|
handle = qRegisterQInfo(pVnode->qMgmt, (uint64_t) pQInfo);
|
||||||
if (handle == NULL) { // failed to register qhandle
|
if (handle == NULL) { // failed to register qhandle
|
||||||
pRsp->code = TSDB_CODE_QRY_INVALID_QHANDLE;
|
pRsp->code = TSDB_CODE_QRY_INVALID_QHANDLE;
|
||||||
|
qDestroyQueryInfo(pQInfo); // destroy it directly
|
||||||
qKillQuery(pQInfo);
|
|
||||||
qKillQuery(pQInfo);
|
|
||||||
} else {
|
} else {
|
||||||
assert(*handle == pQInfo);
|
assert(*handle == pQInfo);
|
||||||
pRsp->qhandle = htobe64((uint64_t) pQInfo);
|
pRsp->qhandle = htobe64((uint64_t) pQInfo);
|
||||||
|
@ -120,10 +119,6 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
if (handle != NULL && vnodeNotifyCurrentQhandle(pReadMsg->rpcMsg.handle, *handle, pVnode->vgId) != TSDB_CODE_SUCCESS) {
|
if (handle != NULL && vnodeNotifyCurrentQhandle(pReadMsg->rpcMsg.handle, *handle, pVnode->vgId) != TSDB_CODE_SUCCESS) {
|
||||||
vError("vgId:%d, QInfo:%p, query discarded since link is broken, %p", pVnode->vgId, *handle, pReadMsg->rpcMsg.handle);
|
vError("vgId:%d, QInfo:%p, query discarded since link is broken, %p", pVnode->vgId, *handle, pReadMsg->rpcMsg.handle);
|
||||||
pRsp->code = TSDB_CODE_RPC_NETWORK_UNAVAIL;
|
pRsp->code = TSDB_CODE_RPC_NETWORK_UNAVAIL;
|
||||||
|
|
||||||
// NOTE: there two refcount, needs to kill twice
|
|
||||||
// query has not been put into qhandle pool, kill it directly.
|
|
||||||
qKillQuery(*handle);
|
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void**) &handle, true);
|
qReleaseQInfo(pVnode->qMgmt, (void**) &handle, true);
|
||||||
return pRsp->code;
|
return pRsp->code;
|
||||||
}
|
}
|
||||||
|
@ -134,6 +129,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
dnodePutItemIntoReadQueue(pVnode, *handle);
|
dnodePutItemIntoReadQueue(pVnode, *handle);
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void**) &handle, false);
|
qReleaseQInfo(pVnode->qMgmt, (void**) &handle, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
vDebug("vgId:%d, QInfo:%p, dnode query msg disposed", vgId, pQInfo);
|
vDebug("vgId:%d, QInfo:%p, dnode query msg disposed", vgId, pQInfo);
|
||||||
} else {
|
} else {
|
||||||
assert(pCont != NULL);
|
assert(pCont != NULL);
|
||||||
|
@ -183,6 +179,7 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
|
|
||||||
if (pRetrieve->free == 1) {
|
if (pRetrieve->free == 1) {
|
||||||
vDebug("vgId:%d, QInfo:%p, retrieve msg received to kill query and free qhandle", pVnode->vgId, *handle);
|
vDebug("vgId:%d, QInfo:%p, retrieve msg received to kill query and free qhandle", pVnode->vgId, *handle);
|
||||||
|
qKillQuery(*handle);
|
||||||
qReleaseQInfo(pVnode->qMgmt, (void**) &handle, true);
|
qReleaseQInfo(pVnode->qMgmt, (void**) &handle, true);
|
||||||
|
|
||||||
pRet->rsp = (SRetrieveTableRsp *)rpcMallocCont(sizeof(SRetrieveTableRsp));
|
pRet->rsp = (SRetrieveTableRsp *)rpcMallocCont(sizeof(SRetrieveTableRsp));
|
||||||
|
@ -209,6 +206,9 @@ static int32_t vnodeProcessFetchMsg(SVnodeObj *pVnode, SReadMsg *pReadMsg) {
|
||||||
dnodePutItemIntoReadQueue(pVnode, *handle);
|
dnodePutItemIntoReadQueue(pVnode, *handle);
|
||||||
pRet->qhandle = *handle;
|
pRet->qhandle = *handle;
|
||||||
freeHandle = false;
|
freeHandle = false;
|
||||||
|
} else {
|
||||||
|
qKillQuery(*handle);
|
||||||
|
freeHandle = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
#include "twal.h"
|
#include "twal.h"
|
||||||
#include "tqueue.h"
|
#include "tqueue.h"
|
||||||
|
#include "tfile.h"
|
||||||
|
|
||||||
#define walPrefix "wal"
|
#define walPrefix "wal"
|
||||||
|
|
||||||
|
@ -180,7 +181,7 @@ int walWrite(void *handle, SWalHead *pHead) {
|
||||||
taosCalcChecksumAppend(0, (uint8_t *)pHead, sizeof(SWalHead));
|
taosCalcChecksumAppend(0, (uint8_t *)pHead, sizeof(SWalHead));
|
||||||
int contLen = pHead->len + sizeof(SWalHead);
|
int contLen = pHead->len + sizeof(SWalHead);
|
||||||
|
|
||||||
if(write(pWal->fd, pHead, contLen) != contLen) {
|
if(twrite(pWal->fd, pHead, contLen) != contLen) {
|
||||||
wError("wal:%s, failed to write(%s)", pWal->name, strerror(errno));
|
wError("wal:%s, failed to write(%s)", pWal->name, strerror(errno));
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
} else {
|
} else {
|
||||||
|
@ -325,7 +326,7 @@ static int walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp) {
|
||||||
wDebug("wal:%s, start to restore", name);
|
wDebug("wal:%s, start to restore", name);
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int ret = read(fd, pHead, sizeof(SWalHead));
|
int ret = tread(fd, pHead, sizeof(SWalHead));
|
||||||
if ( ret == 0) break;
|
if ( ret == 0) break;
|
||||||
|
|
||||||
if (ret != sizeof(SWalHead)) {
|
if (ret != sizeof(SWalHead)) {
|
||||||
|
@ -340,7 +341,7 @@ static int walRestoreWalFile(SWal *pWal, void *pVnode, FWalWrite writeFp) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = read(fd, pHead->cont, pHead->len);
|
ret = tread(fd, pHead->cont, pHead->len);
|
||||||
if ( ret != pHead->len) {
|
if ( ret != pHead->len) {
|
||||||
wWarn("wal:%s, failed to read body, skip, len:%d ret:%d", name, pHead->len, ret);
|
wWarn("wal:%s, failed to read body, skip, len:%d ret:%d", name, pHead->len, ret);
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -31,11 +31,22 @@ then
|
||||||
exit -1
|
exit -1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
CURR_DIR=`pwd`
|
||||||
|
IN_TDINTERNAL="community"
|
||||||
|
if [[ "$CURR_DIR" == *"$IN_TDINTERNAL"* ]]; then
|
||||||
|
TAOS_DIR=$CURR_DIR/../../..
|
||||||
|
else
|
||||||
|
TAOS_DIR=$CURR_DIR/../..
|
||||||
|
fi
|
||||||
|
TAOSD_DIR=`find $TAOS_DIR -name "taosd"|grep bin|head -n1`
|
||||||
|
|
||||||
|
LIB_DIR=`echo $TAOSD_DIR|rev|cut -d '/' -f 3,4,5,6|rev`/lib
|
||||||
|
|
||||||
# First we need to set up a path for Python to find our own TAOS modules, so that "import" can work.
|
# First we need to set up a path for Python to find our own TAOS modules, so that "import" can work.
|
||||||
export PYTHONPATH=$(pwd)/../../src/connector/python/linux/python3
|
export PYTHONPATH=$(pwd)/../../src/connector/python/linux/python3
|
||||||
|
|
||||||
# Then let us set up the library path so that our compiled SO file can be loaded by Python
|
# Then let us set up the library path so that our compiled SO file can be loaded by Python
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$(pwd)/../../build/build/lib
|
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$LIB_DIR
|
||||||
|
|
||||||
# Now we are all let, and let's see if we can find a crash. Note we pass all params
|
# Now we are all let, and let's see if we can find a crash. Note we pass all params
|
||||||
python3 ./crash_gen.py $@
|
python3 ./crash_gen.py $@
|
||||||
|
|
|
@ -121,7 +121,7 @@ python3 ./test.py -f import_merge/importTORestart.py
|
||||||
python3 ./test.py -f import_merge/importTPORestart.py
|
python3 ./test.py -f import_merge/importTPORestart.py
|
||||||
python3 ./test.py -f import_merge/importTRestart.py
|
python3 ./test.py -f import_merge/importTRestart.py
|
||||||
python3 ./test.py -f import_merge/importInsertThenImport.py
|
python3 ./test.py -f import_merge/importInsertThenImport.py
|
||||||
|
python3 ./test.py -f import_merge/importCSV.py
|
||||||
# user
|
# user
|
||||||
python3 ./test.py -f user/user_create.py
|
python3 ./test.py -f user/user_create.py
|
||||||
python3 ./test.py -f user/pass_len.py
|
python3 ./test.py -f user/pass_len.py
|
||||||
|
@ -156,3 +156,7 @@ python3 ./test.py -f alter/alter_table_crash.py
|
||||||
|
|
||||||
# client
|
# client
|
||||||
python3 ./test.py -f client/client.py
|
python3 ./test.py -f client/client.py
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
python3 testCompress.py
|
||||||
|
python3 testNoCompress.py
|
||||||
|
|
|
@ -121,7 +121,7 @@ python3 ./test.py -f import_merge/importTORestart.py
|
||||||
python3 ./test.py -f import_merge/importTPORestart.py
|
python3 ./test.py -f import_merge/importTPORestart.py
|
||||||
python3 ./test.py -f import_merge/importTRestart.py
|
python3 ./test.py -f import_merge/importTRestart.py
|
||||||
python3 ./test.py -f import_merge/importInsertThenImport.py
|
python3 ./test.py -f import_merge/importInsertThenImport.py
|
||||||
|
python3 ./test.py -f import_merge/importCSV.py
|
||||||
# user
|
# user
|
||||||
python3 ./test.py -f user/user_create.py
|
python3 ./test.py -f user/user_create.py
|
||||||
python3 ./test.py -f user/pass_len.py
|
python3 ./test.py -f user/pass_len.py
|
||||||
|
@ -150,3 +150,7 @@ python3 ./test.py -f alter/alter_table_crash.py
|
||||||
|
|
||||||
# client
|
# client
|
||||||
python3 ./test.py -f client/client.py
|
python3 ./test.py -f client/client.py
|
||||||
|
|
||||||
|
# Misc
|
||||||
|
python3 testCompress.py
|
||||||
|
python3 testNoCompress.py
|
||||||
|
|
|
@ -37,17 +37,8 @@ class TDTestCase:
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
tdLog.exit(e)
|
tdLog.exit(e)
|
||||||
|
|
||||||
try:
|
tdSql.error("select * from db.st")
|
||||||
tdSql.execute("select * from db.st")
|
tdSql.error("select * from db.tb")
|
||||||
except Exception as e:
|
|
||||||
if e.args[0] != 'mnode invalid table name':
|
|
||||||
tdLog.exit(e)
|
|
||||||
|
|
||||||
try:
|
|
||||||
tdSql.execute("select * from db.tb")
|
|
||||||
except Exception as e:
|
|
||||||
if e.args[0] != 'mnode invalid table name':
|
|
||||||
tdLog.exit(e)
|
|
||||||
|
|
||||||
def stop(self):
|
def stop(self):
|
||||||
tdSql.close()
|
tdSql.close()
|
||||||
|
|
|
@ -0,0 +1,500 @@
|
||||||
|
###################################################################
|
||||||
|
# Copyright (c) 2016 by TAOS Technologies, Inc.
|
||||||
|
# All rights reserved.
|
||||||
|
#
|
||||||
|
# This file is proprietary and confidential to TAOS Technologies.
|
||||||
|
# No part of this file may be reproduced, stored, transmitted,
|
||||||
|
# disclosed or used in any form or by any means other than as
|
||||||
|
# expressly provided by the written permission from Jianhui Tao
|
||||||
|
#
|
||||||
|
###################################################################
|
||||||
|
|
||||||
|
# -*- coding: utf-8 -*-
|
||||||
|
|
||||||
|
import sys
|
||||||
|
import os
|
||||||
|
import os.path
|
||||||
|
import subprocess
|
||||||
|
from util.log import *
|
||||||
|
|
||||||
|
|
||||||
|
class TDSimClient:
|
||||||
|
def __init__(self):
|
||||||
|
self.testCluster = False
|
||||||
|
|
||||||
|
self.cfgDict = {
|
||||||
|
"numOfLogLines": "100000000",
|
||||||
|
"numOfThreadsPerCore": "2.0",
|
||||||
|
"locale": "en_US.UTF-8",
|
||||||
|
"charset": "UTF-8",
|
||||||
|
"asyncLog": "0",
|
||||||
|
"anyIp": "0",
|
||||||
|
"sdbDebugFlag": "135",
|
||||||
|
"rpcDebugFlag": "135",
|
||||||
|
"tmrDebugFlag": "131",
|
||||||
|
"cDebugFlag": "135",
|
||||||
|
"udebugFlag": "135",
|
||||||
|
"jnidebugFlag": "135",
|
||||||
|
"qdebugFlag": "135",
|
||||||
|
}
|
||||||
|
|
||||||
|
def init(self, path):
|
||||||
|
self.__init__()
|
||||||
|
self.path = path
|
||||||
|
|
||||||
|
def getLogDir(self):
|
||||||
|
self.logDir = "%s/sim/psim/log" % (self.path)
|
||||||
|
return self.logDir
|
||||||
|
|
||||||
|
def getCfgDir(self):
|
||||||
|
self.cfgDir = "%s/sim/psim/cfg" % (self.path)
|
||||||
|
return self.cfgDir
|
||||||
|
|
||||||
|
def setTestCluster(self, value):
|
||||||
|
self.testCluster = value
|
||||||
|
|
||||||
|
def addExtraCfg(self, option, value):
|
||||||
|
self.cfgDict.update({option: value})
|
||||||
|
|
||||||
|
def cfg(self, option, value):
|
||||||
|
cmd = "echo '%s %s' >> %s" % (option, value, self.cfgPath)
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
def deploy(self):
|
||||||
|
self.logDir = "%s/sim/psim/log" % (self.path)
|
||||||
|
self.cfgDir = "%s/sim/psim/cfg" % (self.path)
|
||||||
|
self.cfgPath = "%s/sim/psim/cfg/taos.cfg" % (self.path)
|
||||||
|
|
||||||
|
cmd = "rm -rf " + self.logDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + self.logDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "rm -rf " + self.cfgDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + self.cfgDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "touch " + self.cfgPath
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
if self.testCluster:
|
||||||
|
self.cfg("masterIp", "192.168.0.1")
|
||||||
|
self.cfg("secondIp", "192.168.0.2")
|
||||||
|
self.cfg("logDir", self.logDir)
|
||||||
|
|
||||||
|
for key, value in self.cfgDict.items():
|
||||||
|
self.cfg(key, value)
|
||||||
|
|
||||||
|
tdLog.debug("psim is deployed and configured by %s" % (self.cfgPath))
|
||||||
|
|
||||||
|
|
||||||
|
class TDDnode:
|
||||||
|
def __init__(self, index):
|
||||||
|
self.index = index
|
||||||
|
self.running = 0
|
||||||
|
self.deployed = 0
|
||||||
|
self.testCluster = False
|
||||||
|
self.valgrind = 0
|
||||||
|
|
||||||
|
def init(self, path):
|
||||||
|
self.path = path
|
||||||
|
|
||||||
|
def setTestCluster(self, value):
|
||||||
|
self.testCluster = value
|
||||||
|
|
||||||
|
def setValgrind(self, value):
|
||||||
|
self.valgrind = value
|
||||||
|
|
||||||
|
def getDataSize(self):
|
||||||
|
totalSize = 0
|
||||||
|
|
||||||
|
if (self.deployed == 1):
|
||||||
|
for dirpath, dirnames, filenames in os.walk(self.dataDir):
|
||||||
|
for f in filenames:
|
||||||
|
fp = os.path.join(dirpath, f)
|
||||||
|
|
||||||
|
if not os.path.islink(fp):
|
||||||
|
totalSize = totalSize + os.path.getsize(fp)
|
||||||
|
|
||||||
|
return totalSize
|
||||||
|
|
||||||
|
def deploy(self):
|
||||||
|
self.logDir = "%s/sim/dnode%d/log" % (self.path, self.index)
|
||||||
|
self.dataDir = "%s/sim/dnode%d/data" % (self.path, self.index)
|
||||||
|
self.cfgDir = "%s/sim/dnode%d/cfg" % (self.path, self.index)
|
||||||
|
self.cfgPath = "%s/sim/dnode%d/cfg/taos.cfg" % (
|
||||||
|
self.path, self.index)
|
||||||
|
|
||||||
|
cmd = "rm -rf " + self.dataDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "rm -rf " + self.logDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "rm -rf " + self.cfgDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + self.dataDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + self.logDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "mkdir -p " + self.cfgDir
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
cmd = "touch " + self.cfgPath
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
if self.testCluster:
|
||||||
|
self.startIP()
|
||||||
|
|
||||||
|
if self.testCluster:
|
||||||
|
self.cfg("masterIp", "192.168.0.1")
|
||||||
|
self.cfg("secondIp", "192.168.0.2")
|
||||||
|
self.cfg("publicIp", "192.168.0.%d" % (self.index))
|
||||||
|
self.cfg("internalIp", "192.168.0.%d" % (self.index))
|
||||||
|
self.cfg("privateIp", "192.168.0.%d" % (self.index))
|
||||||
|
self.cfg("dataDir", self.dataDir)
|
||||||
|
self.cfg("logDir", self.logDir)
|
||||||
|
self.cfg("numOfLogLines", "100000000")
|
||||||
|
self.cfg("mnodeEqualVnodeNum", "0")
|
||||||
|
self.cfg("walLevel", "1")
|
||||||
|
self.cfg("statusInterval", "1")
|
||||||
|
self.cfg("numOfTotalVnodes", "64")
|
||||||
|
self.cfg("numOfMnodes", "3")
|
||||||
|
self.cfg("numOfThreadsPerCore", "2.0")
|
||||||
|
self.cfg("monitor", "0")
|
||||||
|
self.cfg("maxVnodeConnections", "30000")
|
||||||
|
self.cfg("maxMgmtConnections", "30000")
|
||||||
|
self.cfg("maxMeterConnections", "30000")
|
||||||
|
self.cfg("maxShellConns", "30000")
|
||||||
|
self.cfg("locale", "en_US.UTF-8")
|
||||||
|
self.cfg("charset", "UTF-8")
|
||||||
|
self.cfg("asyncLog", "0")
|
||||||
|
self.cfg("anyIp", "0")
|
||||||
|
self.cfg("dDebugFlag", "135")
|
||||||
|
self.cfg("mDebugFlag", "135")
|
||||||
|
self.cfg("sdbDebugFlag", "135")
|
||||||
|
self.cfg("rpcDebugFlag", "135")
|
||||||
|
self.cfg("tmrDebugFlag", "131")
|
||||||
|
self.cfg("cDebugFlag", "135")
|
||||||
|
self.cfg("httpDebugFlag", "135")
|
||||||
|
self.cfg("monitorDebugFlag", "135")
|
||||||
|
self.cfg("udebugFlag", "135")
|
||||||
|
self.cfg("jnidebugFlag", "135")
|
||||||
|
self.cfg("qdebugFlag", "135")
|
||||||
|
self.deployed = 1
|
||||||
|
tdLog.debug(
|
||||||
|
"dnode:%d is deployed and configured by %s" %
|
||||||
|
(self.index, self.cfgPath))
|
||||||
|
|
||||||
|
def getBuildPath(self):
|
||||||
|
selfPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
|
||||||
|
if ("community" in selfPath):
|
||||||
|
projPath = selfPath[:selfPath.find("community")]
|
||||||
|
else:
|
||||||
|
projPath = selfPath[:selfPath.find("tests")]
|
||||||
|
|
||||||
|
for root, dirs, files in os.walk(projPath):
|
||||||
|
if ("taosd" in files):
|
||||||
|
rootRealPath = os.path.dirname(os.path.realpath(root))
|
||||||
|
if ("packaging" not in rootRealPath):
|
||||||
|
buildPath = root[:len(root)-len("/build/bin")]
|
||||||
|
break
|
||||||
|
return buildPath
|
||||||
|
|
||||||
|
def start(self):
|
||||||
|
buildPath = self.getBuildPath()
|
||||||
|
|
||||||
|
if (buildPath == ""):
|
||||||
|
tdLog.exit("taosd not found!")
|
||||||
|
else:
|
||||||
|
tdLog.info("taosd found in %s" % buildPath)
|
||||||
|
|
||||||
|
binPath = buildPath + "/build/bin/taosd"
|
||||||
|
|
||||||
|
if self.deployed == 0:
|
||||||
|
tdLog.exit("dnode:%d is not deployed" % (self.index))
|
||||||
|
|
||||||
|
if self.valgrind == 0:
|
||||||
|
cmd = "nohup %s -c %s > /dev/null 2>&1 & " % (
|
||||||
|
binPath, self.cfgDir)
|
||||||
|
else:
|
||||||
|
valgrindCmdline = "valgrind --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes"
|
||||||
|
|
||||||
|
cmd = "nohup %s %s -c %s --random-file-fail-factor 5 2>&1 & " % (
|
||||||
|
valgrindCmdline, binPath, self.cfgDir)
|
||||||
|
|
||||||
|
print(cmd)
|
||||||
|
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
self.running = 1
|
||||||
|
tdLog.debug("dnode:%d is running with %s " % (self.index, cmd))
|
||||||
|
|
||||||
|
tdLog.debug("wait 5 seconds for the dnode:%d to start." % (self.index))
|
||||||
|
time.sleep(5)
|
||||||
|
|
||||||
|
def stop(self):
|
||||||
|
if self.valgrind == 0:
|
||||||
|
toBeKilled = "taosd"
|
||||||
|
else:
|
||||||
|
toBeKilled = "valgrind.bin"
|
||||||
|
|
||||||
|
if self.running != 0:
|
||||||
|
psCmd = "ps -ef|grep -w %s| grep -v grep | awk '{print $2}'" % toBeKilled
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
while(processID):
|
||||||
|
killCmd = "kill -INT %s > /dev/null 2>&1" % processID
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
for port in range(6030, 6041):
|
||||||
|
fuserCmd = "fuser -k -n tcp %d" % port
|
||||||
|
os.system(fuserCmd)
|
||||||
|
if self.valgrind:
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
self.running = 0
|
||||||
|
tdLog.debug("dnode:%d is stopped by kill -INT" % (self.index))
|
||||||
|
|
||||||
|
def forcestop(self):
|
||||||
|
if self.valgrind == 0:
|
||||||
|
toBeKilled = "taosd"
|
||||||
|
else:
|
||||||
|
toBeKilled = "valgrind.bin"
|
||||||
|
|
||||||
|
if self.running != 0:
|
||||||
|
psCmd = "ps -ef|grep -w %s| grep -v grep | awk '{print $2}'" % toBeKilled
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
while(processID):
|
||||||
|
killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
for port in range(6030, 6041):
|
||||||
|
fuserCmd = "fuser -k -n tcp %d" % port
|
||||||
|
os.system(fuserCmd)
|
||||||
|
if self.valgrind:
|
||||||
|
time.sleep(2)
|
||||||
|
|
||||||
|
self.running = 0
|
||||||
|
tdLog.debug("dnode:%d is stopped by kill -KILL" % (self.index))
|
||||||
|
|
||||||
|
def startIP(self):
|
||||||
|
cmd = "sudo ifconfig lo:%d 192.168.0.%d up" % (self.index, self.index)
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
def stopIP(self):
|
||||||
|
cmd = "sudo ifconfig lo:%d 192.168.0.%d down" % (
|
||||||
|
self.index, self.index)
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
def cfg(self, option, value):
|
||||||
|
cmd = "echo '%s %s' >> %s" % (option, value, self.cfgPath)
|
||||||
|
if os.system(cmd) != 0:
|
||||||
|
tdLog.exit(cmd)
|
||||||
|
|
||||||
|
def getDnodeRootDir(self, index):
|
||||||
|
dnodeRootDir = "%s/sim/psim/dnode%d" % (self.path, index)
|
||||||
|
return dnodeRootDir
|
||||||
|
|
||||||
|
def getDnodesRootDir(self):
|
||||||
|
dnodesRootDir = "%s/sim/psim" % (self.path)
|
||||||
|
return dnodesRootDir
|
||||||
|
|
||||||
|
|
||||||
|
class TDDnodes:
|
||||||
|
def __init__(self):
|
||||||
|
self.dnodes = []
|
||||||
|
self.dnodes.append(TDDnode(1))
|
||||||
|
self.dnodes.append(TDDnode(2))
|
||||||
|
self.dnodes.append(TDDnode(3))
|
||||||
|
self.dnodes.append(TDDnode(4))
|
||||||
|
self.dnodes.append(TDDnode(5))
|
||||||
|
self.dnodes.append(TDDnode(6))
|
||||||
|
self.dnodes.append(TDDnode(7))
|
||||||
|
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}'"
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
||||||
|
while(processID):
|
||||||
|
killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
psCmd = "ps -ef|grep -w valgrind.bin| grep -v grep | awk '{print $2}'"
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
||||||
|
while(processID):
|
||||||
|
killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
binPath = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
binPath = binPath + "/../../../debug/"
|
||||||
|
tdLog.debug("binPath %s" % (binPath))
|
||||||
|
binPath = os.path.realpath(binPath)
|
||||||
|
tdLog.debug("binPath real path %s" % (binPath))
|
||||||
|
|
||||||
|
# cmd = "sudo cp %s/build/lib/libtaos.so /usr/local/lib/taos/" % (binPath)
|
||||||
|
# tdLog.debug(cmd)
|
||||||
|
# os.system(cmd)
|
||||||
|
|
||||||
|
# cmd = "sudo cp %s/build/bin/taos /usr/local/bin/taos/" % (binPath)
|
||||||
|
# if os.system(cmd) != 0 :
|
||||||
|
# tdLog.exit(cmd)
|
||||||
|
# tdLog.debug("execute %s" % (cmd))
|
||||||
|
|
||||||
|
# cmd = "sudo cp %s/build/bin/taosd /usr/local/bin/taos/" % (binPath)
|
||||||
|
# if os.system(cmd) != 0 :
|
||||||
|
# tdLog.exit(cmd)
|
||||||
|
# tdLog.debug("execute %s" % (cmd))
|
||||||
|
|
||||||
|
if path == "":
|
||||||
|
# self.path = os.path.expanduser('~')
|
||||||
|
self.path = os.path.abspath(binPath + "../../")
|
||||||
|
else:
|
||||||
|
self.path = os.path.realpath(path)
|
||||||
|
|
||||||
|
for i in range(len(self.dnodes)):
|
||||||
|
self.dnodes[i].init(self.path)
|
||||||
|
|
||||||
|
self.sim = TDSimClient()
|
||||||
|
self.sim.init(self.path)
|
||||||
|
|
||||||
|
def setTestCluster(self, value):
|
||||||
|
self.testCluster = value
|
||||||
|
|
||||||
|
def setValgrind(self, value):
|
||||||
|
self.valgrind = value
|
||||||
|
|
||||||
|
def deploy(self, index):
|
||||||
|
self.sim.setTestCluster(self.testCluster)
|
||||||
|
|
||||||
|
if (self.simDeployed == False):
|
||||||
|
self.sim.deploy()
|
||||||
|
self.simDeployed = True
|
||||||
|
|
||||||
|
self.check(index)
|
||||||
|
self.dnodes[index - 1].setTestCluster(self.testCluster)
|
||||||
|
self.dnodes[index - 1].setValgrind(self.valgrind)
|
||||||
|
self.dnodes[index - 1].deploy()
|
||||||
|
|
||||||
|
def cfg(self, index, option, value):
|
||||||
|
self.check(index)
|
||||||
|
self.dnodes[index - 1].cfg(option, value)
|
||||||
|
|
||||||
|
def start(self, index):
|
||||||
|
self.check(index)
|
||||||
|
self.dnodes[index - 1].start()
|
||||||
|
|
||||||
|
def stop(self, index):
|
||||||
|
self.check(index)
|
||||||
|
self.dnodes[index - 1].stop()
|
||||||
|
|
||||||
|
def getDataSize(self, index):
|
||||||
|
self.check(index)
|
||||||
|
return self.dnodes[index - 1].getDataSize()
|
||||||
|
|
||||||
|
def forcestop(self, index):
|
||||||
|
self.check(index)
|
||||||
|
self.dnodes[index - 1].forcestop()
|
||||||
|
|
||||||
|
def startIP(self, index):
|
||||||
|
self.check(index)
|
||||||
|
|
||||||
|
if self.testCluster:
|
||||||
|
self.dnodes[index - 1].startIP()
|
||||||
|
|
||||||
|
def stopIP(self, index):
|
||||||
|
self.check(index)
|
||||||
|
|
||||||
|
if self.dnodes[index - 1].testCluster:
|
||||||
|
self.dnodes[index - 1].stopIP()
|
||||||
|
|
||||||
|
def check(self, index):
|
||||||
|
if index < 1 or index > 10:
|
||||||
|
tdLog.exit("index:%d should on a scale of [1, 10]" % (index))
|
||||||
|
|
||||||
|
def stopAll(self):
|
||||||
|
tdLog.info("stop all dnodes")
|
||||||
|
for i in range(len(self.dnodes)):
|
||||||
|
self.dnodes[i].stop()
|
||||||
|
|
||||||
|
psCmd = "ps -ef | grep -w taosd | grep 'root' | grep -v grep | awk '{print $2}'"
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
||||||
|
if processID:
|
||||||
|
cmd = "sudo systemctl stop taosd"
|
||||||
|
os.system(cmd)
|
||||||
|
# if os.system(cmd) != 0 :
|
||||||
|
# tdLog.exit(cmd)
|
||||||
|
psCmd = "ps -ef|grep -w taosd| grep -v grep | awk '{print $2}'"
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
||||||
|
while(processID):
|
||||||
|
killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
psCmd = "ps -ef|grep -w valgrind.bin| grep -v grep | awk '{print $2}'"
|
||||||
|
processID = subprocess.check_output(psCmd, shell=True).decode("utf-8")
|
||||||
|
while(processID):
|
||||||
|
killCmd = "kill -KILL %s > /dev/null 2>&1" % processID
|
||||||
|
os.system(killCmd)
|
||||||
|
time.sleep(1)
|
||||||
|
processID = subprocess.check_output(
|
||||||
|
psCmd, shell=True).decode("utf-8")
|
||||||
|
|
||||||
|
# if os.system(cmd) != 0 :
|
||||||
|
# tdLog.exit(cmd)
|
||||||
|
|
||||||
|
def getDnodesRootDir(self):
|
||||||
|
dnodesRootDir = "%s/sim" % (self.path)
|
||||||
|
return dnodesRootDir
|
||||||
|
|
||||||
|
def getSimCfgPath(self):
|
||||||
|
return self.sim.getCfgDir()
|
||||||
|
|
||||||
|
def getSimLogPath(self):
|
||||||
|
return self.sim.getLogDir()
|
||||||
|
|
||||||
|
def addSimExtraCfg(self, option, value):
|
||||||
|
self.sim.addExtraCfg(option, value)
|
||||||
|
|
||||||
|
|
||||||
|
tdDnodes = TDDnodes()
|
|
@ -652,25 +652,25 @@ endi
|
||||||
if $data01 != 1 then
|
if $data01 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != null then
|
if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != null then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 1 then
|
if $data41 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != null then
|
if $data51 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data61 != 1 then
|
if $data61 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data71 != null then
|
if $data71 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data81 != 1 then
|
if $data81 != 1 then
|
||||||
|
@ -689,25 +689,25 @@ endi
|
||||||
if $data01 != 0.000000000 then
|
if $data01 != 0.000000000 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != null then
|
if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 1.000000000 then
|
if $data21 != 1.000000000 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != null then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 2.000000000 then
|
if $data41 != 2.000000000 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != null then
|
if $data51 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data61 != 3.000000000 then
|
if $data61 != 3.000000000 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data71 != null then
|
if $data71 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data81 != 4.000000000 then
|
if $data81 != 4.000000000 then
|
||||||
|
@ -722,25 +722,25 @@ endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != null then
|
if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != null then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != null then
|
if $data51 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data61 != 3 then
|
if $data61 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data71 != null then
|
if $data71 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data81 != 4 then
|
if $data81 != 4 then
|
||||||
|
@ -755,25 +755,25 @@ endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != null then
|
if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != null then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != null then
|
if $data51 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data61 != 3 then
|
if $data61 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data71 != null then
|
if $data71 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data81 != 4 then
|
if $data81 != 4 then
|
||||||
|
@ -788,25 +788,25 @@ endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != null then
|
if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != null then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != null then
|
if $data51 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data61 != 3 then
|
if $data61 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data71 != null then
|
if $data71 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data81 != 4 then
|
if $data81 != 4 then
|
||||||
|
@ -821,25 +821,25 @@ endi
|
||||||
if $data01 != 0 then
|
if $data01 != 0 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data11 != null then
|
if $data11 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data21 != 1 then
|
if $data21 != 1 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data31 != null then
|
if $data31 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data41 != 2 then
|
if $data41 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data51 != null then
|
if $data51 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data61 != 3 then
|
if $data61 != 3 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data71 != null then
|
if $data71 != NULL then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data81 != 4 then
|
if $data81 != 4 then
|
||||||
|
|
|
@ -117,8 +117,6 @@ cd ../../../debug; make
|
||||||
./test.sh -f general/parser/import_commit3.sim
|
./test.sh -f general/parser/import_commit3.sim
|
||||||
./test.sh -f general/parser/insert_tb.sim
|
./test.sh -f general/parser/insert_tb.sim
|
||||||
./test.sh -f general/parser/first_last.sim
|
./test.sh -f general/parser/first_last.sim
|
||||||
# dyh is processing this script
|
|
||||||
#./test.sh -f general/parser/import_file.sim
|
|
||||||
./test.sh -f general/parser/lastrow.sim
|
./test.sh -f general/parser/lastrow.sim
|
||||||
./test.sh -f general/parser/nchar.sim
|
./test.sh -f general/parser/nchar.sim
|
||||||
./test.sh -f general/parser/null_char.sim
|
./test.sh -f general/parser/null_char.sim
|
||||||
|
@ -145,7 +143,6 @@ cd ../../../debug; make
|
||||||
./test.sh -f general/parser/groupby.sim
|
./test.sh -f general/parser/groupby.sim
|
||||||
./test.sh -f general/parser/set_tag_vals.sim
|
./test.sh -f general/parser/set_tag_vals.sim
|
||||||
#./test.sh -f general/parser/sliding.sim
|
#./test.sh -f general/parser/sliding.sim
|
||||||
./test.sh -f general/parser/tags_dynamically_specifiy.sim
|
|
||||||
./test.sh -f general/parser/tags_filter.sim
|
./test.sh -f general/parser/tags_filter.sim
|
||||||
./test.sh -f general/parser/slimit_alter_tags.sim
|
./test.sh -f general/parser/slimit_alter_tags.sim
|
||||||
./test.sh -f general/parser/join.sim
|
./test.sh -f general/parser/join.sim
|
||||||
|
|
|
@ -125,7 +125,6 @@ echo "mqttDebugFlag 131" >> $TAOS_CFG
|
||||||
echo "qdebugFlag 135" >> $TAOS_CFG
|
echo "qdebugFlag 135" >> $TAOS_CFG
|
||||||
echo "rpcDebugFlag 135" >> $TAOS_CFG
|
echo "rpcDebugFlag 135" >> $TAOS_CFG
|
||||||
echo "tmrDebugFlag 131" >> $TAOS_CFG
|
echo "tmrDebugFlag 131" >> $TAOS_CFG
|
||||||
echo "cDebugFlag 135" >> $TAOS_CFG
|
|
||||||
echo "udebugFlag 135" >> $TAOS_CFG
|
echo "udebugFlag 135" >> $TAOS_CFG
|
||||||
echo "sdebugFlag 135" >> $TAOS_CFG
|
echo "sdebugFlag 135" >> $TAOS_CFG
|
||||||
echo "wdebugFlag 135" >> $TAOS_CFG
|
echo "wdebugFlag 135" >> $TAOS_CFG
|
||||||
|
|
|
@ -0,0 +1,113 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# if [ $# != 4 || $# != 5 ]; then
|
||||||
|
# echo "argument list need input : "
|
||||||
|
# echo " -n nodeName"
|
||||||
|
# echo " -s start/stop"
|
||||||
|
# echo " -c clear"
|
||||||
|
# exit 1
|
||||||
|
# fi
|
||||||
|
|
||||||
|
NODE_NAME=
|
||||||
|
EXEC_OPTON=
|
||||||
|
CLEAR_OPTION="false"
|
||||||
|
while getopts "n:s:u:x:ct" arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
n)
|
||||||
|
NODE_NAME=$OPTARG
|
||||||
|
;;
|
||||||
|
s)
|
||||||
|
EXEC_OPTON=$OPTARG
|
||||||
|
;;
|
||||||
|
c)
|
||||||
|
CLEAR_OPTION="clear"
|
||||||
|
;;
|
||||||
|
t)
|
||||||
|
SHELL_OPTION="true"
|
||||||
|
;;
|
||||||
|
u)
|
||||||
|
USERS=$OPTARG
|
||||||
|
;;
|
||||||
|
x)
|
||||||
|
SIGNAL=$OPTARG
|
||||||
|
;;
|
||||||
|
?)
|
||||||
|
echo "unkown argument"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
SCRIPT_DIR=`dirname $0`
|
||||||
|
cd $SCRIPT_DIR/../
|
||||||
|
SCRIPT_DIR=`pwd`
|
||||||
|
|
||||||
|
IN_TDINTERNAL="community"
|
||||||
|
if [[ "$SCRIPT_DIR" == *"$IN_TDINTERNAL"* ]]; then
|
||||||
|
cd ../../..
|
||||||
|
else
|
||||||
|
cd ../../
|
||||||
|
fi
|
||||||
|
|
||||||
|
TAOS_DIR=`pwd`
|
||||||
|
TAOSD_DIR=`find . -name "taosd"|grep bin|head -n1`
|
||||||
|
|
||||||
|
if [[ "$TAOSD_DIR" == *"$IN_TDINTERNAL"* ]]; then
|
||||||
|
BIN_DIR=`find . -name "taosd"|grep bin|head -n1|cut -d '/' --fields=2,3`
|
||||||
|
else
|
||||||
|
BIN_DIR=`find . -name "taosd"|grep bin|head -n1|cut -d '/' --fields=2`
|
||||||
|
fi
|
||||||
|
|
||||||
|
BUILD_DIR=$TAOS_DIR/$BIN_DIR/build
|
||||||
|
|
||||||
|
SIM_DIR=$TAOS_DIR/sim
|
||||||
|
NODE_DIR=$SIM_DIR/$NODE_NAME
|
||||||
|
EXE_DIR=$BUILD_DIR/bin
|
||||||
|
CFG_DIR=$NODE_DIR/cfg
|
||||||
|
LOG_DIR=$NODE_DIR/log
|
||||||
|
DATA_DIR=$NODE_DIR/data
|
||||||
|
MGMT_DIR=$NODE_DIR/data/mgmt
|
||||||
|
TSDB_DIR=$NODE_DIR/data/tsdb
|
||||||
|
|
||||||
|
TAOS_CFG=$NODE_DIR/cfg/taos.cfg
|
||||||
|
|
||||||
|
echo ------------ $EXEC_OPTON $NODE_NAME
|
||||||
|
|
||||||
|
TAOS_FLAG=$SIM_DIR/tsim/flag
|
||||||
|
if [ -f "$TAOS_FLAG" ]; then
|
||||||
|
EXE_DIR=/usr/local/bin/taos
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$CLEAR_OPTION" = "clear" ]; then
|
||||||
|
echo rm -rf $MGMT_DIR $TSDB_DIR
|
||||||
|
rm -rf $TSDB_DIR
|
||||||
|
rm -rf $MGMT_DIR
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "$EXEC_OPTON" = "start" ]; then
|
||||||
|
echo "ExcuteCmd:" $EXE_DIR/taosd -c $CFG_DIR
|
||||||
|
|
||||||
|
if [ "$SHELL_OPTION" = "true" ]; then
|
||||||
|
nohup valgrind --log-file=${LOG_DIR}/valgrind.log --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --show-leak-kinds=all -v --workaround-gcc296-bugs=yes $EXE_DIR/taosd -c $CFG_DIR > /dev/null 2>&1 &
|
||||||
|
else
|
||||||
|
nohup $EXE_DIR/taosd -c $CFG_DIR --random-file-fail-factor 5 > /dev/null 2>&1 &
|
||||||
|
fi
|
||||||
|
|
||||||
|
else
|
||||||
|
#relative path
|
||||||
|
RCFG_DIR=sim/$NODE_NAME/cfg
|
||||||
|
PID=`ps -ef|grep taosd | grep $RCFG_DIR | grep -v grep | awk '{print $2}'`
|
||||||
|
while [ -n "$PID" ]
|
||||||
|
do
|
||||||
|
if [ "$SIGNAL" = "SIGINT" ]; then
|
||||||
|
echo try to kill by signal SIGINT
|
||||||
|
kill -SIGINT $PID
|
||||||
|
else
|
||||||
|
echo try to kill by signal SIGKILL
|
||||||
|
kill -9 $PID
|
||||||
|
fi
|
||||||
|
sleep 1
|
||||||
|
PID=`ps -ef|grep taosd | grep $RCFG_DIR | grep -v grep | awk '{print $2}'`
|
||||||
|
done
|
||||||
|
fi
|
||||||
|
|
Loading…
Reference in New Issue