Merge branch 'develop' into xiaoping/add_test_case
This commit is contained in:
commit
457544b8cd
|
@ -5,7 +5,7 @@ go 1.14
|
||||||
require (
|
require (
|
||||||
github.com/jmoiron/sqlx v1.2.0
|
github.com/jmoiron/sqlx v1.2.0
|
||||||
github.com/mattn/go-sqlite3 v2.0.3+incompatible
|
github.com/mattn/go-sqlite3 v2.0.3+incompatible
|
||||||
github.com/taosdata/driver-go v0.0.0-20200727182616-1a3b1941c206
|
github.com/taosdata/driver-go v0.0.0-20201113094317-050667e5b4d0
|
||||||
go.uber.org/zap v1.14.1
|
go.uber.org/zap v1.14.1
|
||||||
google.golang.org/appengine v1.6.5 // indirect
|
google.golang.org/appengine v1.6.5 // indirect
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c
|
||||||
|
|
|
@ -39,10 +39,10 @@
|
||||||
# number of management nodes in the system
|
# number of management nodes in the system
|
||||||
# numOfMnodes 3
|
# numOfMnodes 3
|
||||||
|
|
||||||
# enable/disable backuping vnode directory when removing dnode
|
# enable/disable backuping vnode directory when removing vnode
|
||||||
# vnodeBak 1
|
# vnodeBak 1
|
||||||
|
|
||||||
# if report installation / use information
|
# enable/disable installation / usage report
|
||||||
# telemetryReporting 1
|
# telemetryReporting 1
|
||||||
|
|
||||||
# enable/disable load balancing
|
# enable/disable load balancing
|
||||||
|
@ -81,7 +81,7 @@
|
||||||
# minimum time window, milli-second
|
# minimum time window, milli-second
|
||||||
# minIntervalTime 10
|
# minIntervalTime 10
|
||||||
|
|
||||||
# maximum delay before launching a stream compution, milli-second
|
# maximum delay before launching a stream computation, milli-second
|
||||||
# maxStreamCompDelay 20000
|
# maxStreamCompDelay 20000
|
||||||
|
|
||||||
# maximum delay before launching a stream computation for the first time, milli-second
|
# maximum delay before launching a stream computation for the first time, milli-second
|
||||||
|
@ -156,7 +156,7 @@
|
||||||
# max number of connections allowed in dnode
|
# max number of connections allowed in dnode
|
||||||
# maxShellConns 5000
|
# maxShellConns 5000
|
||||||
|
|
||||||
# max numerber of connections allowed in client
|
# max number of connections allowed in client
|
||||||
# maxConnections 5000
|
# maxConnections 5000
|
||||||
|
|
||||||
# stop writing logs when the disk size of the log folder is less than this value
|
# stop writing logs when the disk size of the log folder is less than this value
|
||||||
|
@ -187,7 +187,7 @@
|
||||||
# restfulRowLimit 10240
|
# restfulRowLimit 10240
|
||||||
|
|
||||||
# The following parameter is used to limit the maximum number of lines in log files.
|
# The following parameter is used to limit the maximum number of lines in log files.
|
||||||
# max number of rows per log filters
|
# max number of lines per log filters
|
||||||
# numOfLogLines 10000000
|
# numOfLogLines 10000000
|
||||||
|
|
||||||
# enable/disable async log
|
# enable/disable async log
|
||||||
|
@ -199,7 +199,9 @@
|
||||||
|
|
||||||
# The following parameters are used for debug purpose only.
|
# The following parameters are used for debug purpose only.
|
||||||
# debugFlag 8 bits mask: FILE-SCREEN-UNUSED-HeartBeat-DUMP-TRACE_WARN-ERROR
|
# debugFlag 8 bits mask: FILE-SCREEN-UNUSED-HeartBeat-DUMP-TRACE_WARN-ERROR
|
||||||
# 131: output warning and error, 135: output debug, warning and error, 143 : output trace, debug, warning and error to log.
|
# 131: output warning and error
|
||||||
|
# 135: output debug, warning and error
|
||||||
|
# 143: output trace, debug, warning and error to log
|
||||||
# 199: output debug, warning and error to both screen and file
|
# 199: output debug, warning and error to both screen and file
|
||||||
# 207: output trace, debug, warning and error to both screen and file
|
# 207: output trace, debug, warning and error to both screen and file
|
||||||
|
|
||||||
|
@ -231,10 +233,10 @@
|
||||||
# cDebugFlag 131
|
# cDebugFlag 131
|
||||||
|
|
||||||
# debug flag for JNI
|
# debug flag for JNI
|
||||||
# jniDebugflag 131
|
# jniDebugFlag 131
|
||||||
|
|
||||||
# debug flag for storage
|
# debug flag for storage
|
||||||
# uDebugflag 131
|
# uDebugFlag 131
|
||||||
|
|
||||||
# debug flag for http server
|
# debug flag for http server
|
||||||
# httpDebugFlag 131
|
# httpDebugFlag 131
|
||||||
|
@ -243,12 +245,12 @@
|
||||||
# monDebugFlag 131
|
# monDebugFlag 131
|
||||||
|
|
||||||
# debug flag for query
|
# debug flag for query
|
||||||
# qDebugflag 131
|
# qDebugFlag 131
|
||||||
|
|
||||||
# debug flag for vnode
|
# debug flag for vnode
|
||||||
# vDebugflag 131
|
# vDebugFlag 131
|
||||||
|
|
||||||
# debug flag for http server
|
# debug flag for TSDB
|
||||||
# tsdbDebugFlag 131
|
# tsdbDebugFlag 131
|
||||||
|
|
||||||
# debug flag for continue query
|
# debug flag for continue query
|
||||||
|
|
|
@ -265,8 +265,14 @@ function install_config() {
|
||||||
[ -f ${cfg_dir}/taos.cfg ] && ${csudo} cp ${cfg_dir}/taos.cfg ${cfg_install_dir}
|
[ -f ${cfg_dir}/taos.cfg ] && ${csudo} cp ${cfg_dir}/taos.cfg ${cfg_install_dir}
|
||||||
${csudo} chmod 644 ${cfg_install_dir}/*
|
${csudo} chmod 644 ${cfg_install_dir}/*
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Save standard input to 6 and open / dev / TTY on standard input
|
||||||
|
exec 6<&0 0</dev/tty
|
||||||
|
|
||||||
local_fqdn_check
|
local_fqdn_check
|
||||||
|
|
||||||
|
# restore the backup standard input, and turn off 6
|
||||||
|
exec 0<&6 6<&-
|
||||||
|
|
||||||
${csudo} mv ${cfg_dir}/taos.cfg ${cfg_dir}/taos.cfg.org
|
${csudo} mv ${cfg_dir}/taos.cfg ${cfg_dir}/taos.cfg.org
|
||||||
${csudo} ln -s ${cfg_install_dir}/taos.cfg ${cfg_dir}
|
${csudo} ln -s ${cfg_install_dir}/taos.cfg ${cfg_dir}
|
||||||
|
@ -422,7 +428,7 @@ function install_service() {
|
||||||
}
|
}
|
||||||
|
|
||||||
function install_TDengine() {
|
function install_TDengine() {
|
||||||
echo -e "${GREEN}Start to install TDEngine...${NC}"
|
echo -e "${GREEN}Start to install TDengine...${NC}"
|
||||||
|
|
||||||
#install log and data dir , then ln to /usr/local/taos
|
#install log and data dir , then ln to /usr/local/taos
|
||||||
${csudo} mkdir -p ${log_dir} && ${csudo} chmod 777 ${log_dir}
|
${csudo} mkdir -p ${log_dir} && ${csudo} chmod 777 ${log_dir}
|
||||||
|
|
|
@ -119,4 +119,4 @@ if ((${service_mod}==2)); then
|
||||||
kill_taosd
|
kill_taosd
|
||||||
fi
|
fi
|
||||||
|
|
||||||
echo -e "${GREEN}TDEngine is removed successfully!${NC}"
|
echo -e "${GREEN}TDengine is removed successfully!${NC}"
|
||||||
|
|
|
@ -307,7 +307,6 @@ typedef struct STscObj {
|
||||||
SRpcCorEpSet *tscCorMgmtEpSet;
|
SRpcCorEpSet *tscCorMgmtEpSet;
|
||||||
void* pDnodeConn;
|
void* pDnodeConn;
|
||||||
pthread_mutex_t mutex;
|
pthread_mutex_t mutex;
|
||||||
T_REF_DECLARE()
|
|
||||||
} STscObj;
|
} STscObj;
|
||||||
|
|
||||||
typedef struct SSubqueryState {
|
typedef struct SSubqueryState {
|
||||||
|
@ -483,7 +482,6 @@ extern int tscObjRef;
|
||||||
extern void * tscTmr;
|
extern void * tscTmr;
|
||||||
extern void * tscQhandle;
|
extern void * tscQhandle;
|
||||||
extern int tscKeepConn[];
|
extern int tscKeepConn[];
|
||||||
extern int tsInsertHeadSize;
|
|
||||||
extern int tscNumOfThreads;
|
extern int tscNumOfThreads;
|
||||||
extern int tscRefId;
|
extern int tscRefId;
|
||||||
|
|
||||||
|
|
|
@ -388,10 +388,10 @@ void tscQueueAsyncRes(SSqlObj *pSql) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert(pSql->res.code != TSDB_CODE_SUCCESS);
|
||||||
tscError("%p add into queued async res, code:%s", pSql, tstrerror(pSql->res.code));
|
tscError("%p add into queued async res, code:%s", pSql, tstrerror(pSql->res.code));
|
||||||
|
|
||||||
SSqlRes *pRes = &pSql->res;
|
SSqlRes *pRes = &pSql->res;
|
||||||
|
|
||||||
if (pSql->fp == NULL || pSql->fetchFp == NULL){
|
if (pSql->fp == NULL || pSql->fetchFp == NULL){
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2597,14 +2597,23 @@ static void percentile_next_step(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////
|
||||||
|
static void buildHistogramInfo(SAPercentileInfo* pInfo) {
|
||||||
|
pInfo->pHisto = (SHistogramInfo*) ((char*) pInfo + sizeof(SAPercentileInfo));
|
||||||
|
pInfo->pHisto->elems = (SHistBin*) ((char*)pInfo->pHisto + sizeof(SHistogramInfo));
|
||||||
|
}
|
||||||
|
|
||||||
static SAPercentileInfo *getAPerctInfo(SQLFunctionCtx *pCtx) {
|
static SAPercentileInfo *getAPerctInfo(SQLFunctionCtx *pCtx) {
|
||||||
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
SAPercentileInfo* pInfo = NULL;
|
||||||
|
|
||||||
if (pCtx->stableQuery && pCtx->currentStage != SECONDARY_STAGE_MERGE) {
|
if (pCtx->stableQuery && pCtx->currentStage != SECONDARY_STAGE_MERGE) {
|
||||||
return (SAPercentileInfo*) pCtx->aOutputBuf;
|
pInfo = (SAPercentileInfo*) pCtx->aOutputBuf;
|
||||||
} else {
|
} else {
|
||||||
return GET_ROWCELL_INTERBUF(pResInfo);
|
pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
buildHistogramInfo(pInfo);
|
||||||
|
return pInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool apercentile_function_setup(SQLFunctionCtx *pCtx) {
|
static bool apercentile_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
|
@ -2616,6 +2625,7 @@ static bool apercentile_function_setup(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
char *tmp = (char *)pInfo + sizeof(SAPercentileInfo);
|
char *tmp = (char *)pInfo + sizeof(SAPercentileInfo);
|
||||||
pInfo->pHisto = tHistogramCreateFrom(tmp, MAX_HISTOGRAM_BIN);
|
pInfo->pHisto = tHistogramCreateFrom(tmp, MAX_HISTOGRAM_BIN);
|
||||||
|
printf("%p, %p\n", pInfo->pHisto, pInfo->pHisto->elems);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2624,6 +2634,8 @@ static void apercentile_function(SQLFunctionCtx *pCtx) {
|
||||||
|
|
||||||
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowCellInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SAPercentileInfo *pInfo = getAPerctInfo(pCtx);
|
SAPercentileInfo *pInfo = getAPerctInfo(pCtx);
|
||||||
|
|
||||||
|
assert(pInfo->pHisto->elems != NULL);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
for (int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
char *data = GET_INPUT_CHAR_INDEX(pCtx, i);
|
char *data = GET_INPUT_CHAR_INDEX(pCtx, i);
|
||||||
|
|
|
@ -911,6 +911,13 @@ static void genFinalResWithoutFill(SSqlRes* pRes, SLocalReducer *pLocalReducer,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pRes->numOfRowsGroup >= pQueryInfo->limit.limit && pQueryInfo->limit.limit > 0) {
|
||||||
|
pRes->numOfRows = 0;
|
||||||
|
pBeforeFillData->num = 0;
|
||||||
|
pLocalReducer->discard = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
pRes->numOfRowsGroup += pRes->numOfRows;
|
pRes->numOfRowsGroup += pRes->numOfRows;
|
||||||
|
|
||||||
// impose the limitation of output rows on the final result
|
// impose the limitation of output rows on the final result
|
||||||
|
|
|
@ -996,33 +996,6 @@ static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pC
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t nLen = 0;
|
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
|
||||||
TAOS_FIELD* p = taosArrayGet(pTagsList, i);
|
|
||||||
if (p->bytes == 0) {
|
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg7);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
nLen += p->bytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
// max tag row length must be less than TSDB_MAX_TAGS_LEN
|
|
||||||
if (nLen > TSDB_MAX_TAGS_LEN) {
|
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// field name must be unique
|
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
|
||||||
TAOS_FIELD* p = taosArrayGet(pTagsList, i);
|
|
||||||
|
|
||||||
if (has(pFieldList, 0, p->name) == true) {
|
|
||||||
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* timestamp in tag is not allowed */
|
/* timestamp in tag is not allowed */
|
||||||
for (int32_t i = 0; i < numOfTags; ++i) {
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
TAOS_FIELD* p = taosArrayGet(pTagsList, i);
|
TAOS_FIELD* p = taosArrayGet(pTagsList, i);
|
||||||
|
@ -1054,6 +1027,33 @@ static bool validateTagParams(SArray* pTagsList, SArray* pFieldList, SSqlCmd* pC
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t nLen = 0;
|
||||||
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
|
TAOS_FIELD* p = taosArrayGet(pTagsList, i);
|
||||||
|
if (p->bytes == 0) {
|
||||||
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg7);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
nLen += p->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
// max tag row length must be less than TSDB_MAX_TAGS_LEN
|
||||||
|
if (nLen > TSDB_MAX_TAGS_LEN) {
|
||||||
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg2);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// field name must be unique
|
||||||
|
for (int32_t i = 0; i < numOfTags; ++i) {
|
||||||
|
TAOS_FIELD* p = taosArrayGet(pTagsList, i);
|
||||||
|
|
||||||
|
if (has(pFieldList, 0, p->name) == true) {
|
||||||
|
invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg3);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -115,9 +115,7 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
|
|
||||||
pObj->signature = pObj;
|
pObj->signature = pObj;
|
||||||
pObj->pDnodeConn = pDnodeConn;
|
pObj->pDnodeConn = pDnodeConn;
|
||||||
T_REF_INIT_VAL(pObj, 1);
|
|
||||||
|
|
||||||
|
|
||||||
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
||||||
secretEncryptLen = MIN(secretEncryptLen, sizeof(pObj->pass));
|
secretEncryptLen = MIN(secretEncryptLen, sizeof(pObj->pass));
|
||||||
memcpy(pObj->pass, secretEncrypt, secretEncryptLen);
|
memcpy(pObj->pass, secretEncrypt, secretEncryptLen);
|
||||||
|
@ -172,11 +170,9 @@ static SSqlObj *taosConnectImpl(const char *ip, const char *user, const char *pa
|
||||||
if (taos != NULL) {
|
if (taos != NULL) {
|
||||||
*taos = pObj;
|
*taos = pObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
registerSqlObj(pSql);
|
|
||||||
tsInsertHeadSize = sizeof(SMsgDesc) + sizeof(SSubmitMsg);
|
|
||||||
|
|
||||||
pObj->rid = taosAddRef(tscRefId, pObj);
|
pObj->rid = taosAddRef(tscRefId, pObj);
|
||||||
|
registerSqlObj(pSql);
|
||||||
|
|
||||||
return pSql;
|
return pSql;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -288,34 +284,21 @@ void taos_close(TAOS *taos) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// make sure that the close connection can only be executed once.
|
if (RID_VALID(pObj->hbrid)) {
|
||||||
pObj->signature = NULL;
|
|
||||||
taosTmrStopA(&(pObj->pTimer));
|
|
||||||
|
|
||||||
if (pObj->hbrid > 0) {
|
|
||||||
SSqlObj* pHb = (SSqlObj*)taosAcquireRef(tscObjRef, pObj->hbrid);
|
SSqlObj* pHb = (SSqlObj*)taosAcquireRef(tscObjRef, pObj->hbrid);
|
||||||
if (pHb != NULL) {
|
if (pHb != NULL) {
|
||||||
if (pHb->rpcRid > 0) { // wait for rsp from dnode
|
if (RID_VALID(pHb->rpcRid)) { // wait for rsp from dnode
|
||||||
rpcCancelRequest(pHb->rpcRid);
|
rpcCancelRequest(pHb->rpcRid);
|
||||||
pHb->rpcRid = -1;
|
pHb->rpcRid = -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
tscDebug("%p HB is freed", pHb);
|
tscDebug("%p HB is freed", pHb);
|
||||||
taos_free_result(pHb);
|
|
||||||
taosReleaseRef(tscObjRef, pHb->self);
|
taosReleaseRef(tscObjRef, pHb->self);
|
||||||
|
taos_free_result(pHb);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t ref = T_REF_DEC(pObj);
|
|
||||||
assert(ref >= 0);
|
|
||||||
|
|
||||||
if (ref > 0) {
|
|
||||||
tscDebug("%p %d remain sqlObjs, not free tscObj and dnodeConn:%p", pObj, ref, pObj->pDnodeConn);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
tscDebug("%p all sqlObj are freed, free tscObj and close dnodeConn:%p", pObj, pObj->pDnodeConn);
|
tscDebug("%p all sqlObj are freed, free tscObj and close dnodeConn:%p", pObj, pObj->pDnodeConn);
|
||||||
|
|
||||||
taosRemoveRef(tscRefId, pObj->rid);
|
taosRemoveRef(tscRefId, pObj->rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,6 @@ int tscObjRef = -1;
|
||||||
void * tscTmr;
|
void * tscTmr;
|
||||||
void * tscQhandle;
|
void * tscQhandle;
|
||||||
void * tscCheckDiskUsageTmr;
|
void * tscCheckDiskUsageTmr;
|
||||||
int tsInsertHeadSize;
|
|
||||||
int tscRefId = -1;
|
int tscRefId = -1;
|
||||||
|
|
||||||
int tscNumOfThreads;
|
int tscNumOfThreads;
|
||||||
|
|
|
@ -460,15 +460,7 @@ void tscFreeRegisteredSqlObj(void *pSql) {
|
||||||
|
|
||||||
assert(p->self != 0);
|
assert(p->self != 0);
|
||||||
tscFreeSqlObj(p);
|
tscFreeSqlObj(p);
|
||||||
|
taosReleaseRef(tscRefId, pTscObj->rid);
|
||||||
int32_t ref = T_REF_DEC(pTscObj);
|
|
||||||
assert(ref >= 0);
|
|
||||||
|
|
||||||
tscDebug("%p free sqlObj completed, tscObj:%p ref:%d", p, pTscObj, ref);
|
|
||||||
if (ref == 0) {
|
|
||||||
tscDebug("%p all sqlObj freed, free tscObj:%p", p, pTscObj);
|
|
||||||
taosRemoveRef(tscRefId, pTscObj->rid);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tscFreeTableMetaHelper(void *pTableMeta) {
|
void tscFreeTableMetaHelper(void *pTableMeta) {
|
||||||
|
@ -810,6 +802,7 @@ static void extractTableMeta(SSqlCmd* pCmd) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tscMergeTableDataBlocks(SSqlObj* pSql) {
|
int32_t tscMergeTableDataBlocks(SSqlObj* pSql) {
|
||||||
|
const int INSERT_HEAD_SIZE = sizeof(SMsgDesc) + sizeof(SSubmitMsg);
|
||||||
SSqlCmd* pCmd = &pSql->cmd;
|
SSqlCmd* pCmd = &pSql->cmd;
|
||||||
|
|
||||||
void* pVnodeDataBlockHashList = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, false);
|
void* pVnodeDataBlockHashList = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, false);
|
||||||
|
@ -824,7 +817,7 @@ int32_t tscMergeTableDataBlocks(SSqlObj* pSql) {
|
||||||
STableDataBlocks* dataBuf = NULL;
|
STableDataBlocks* dataBuf = NULL;
|
||||||
|
|
||||||
int32_t ret = tscGetDataBlockFromList(pVnodeDataBlockHashList, pOneTableBlock->vgId, TSDB_PAYLOAD_SIZE,
|
int32_t ret = tscGetDataBlockFromList(pVnodeDataBlockHashList, pOneTableBlock->vgId, TSDB_PAYLOAD_SIZE,
|
||||||
tsInsertHeadSize, 0, pOneTableBlock->tableId, pOneTableBlock->pTableMeta, &dataBuf, pVnodeDataBlockList);
|
INSERT_HEAD_SIZE, 0, pOneTableBlock->tableId, pOneTableBlock->pTableMeta, &dataBuf, pVnodeDataBlockList);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
tscError("%p failed to prepare the data block buffer for merging table data, code:%d", pSql, ret);
|
tscError("%p failed to prepare the data block buffer for merging table data, code:%d", pSql, ret);
|
||||||
taosHashCleanup(pVnodeDataBlockHashList);
|
taosHashCleanup(pVnodeDataBlockHashList);
|
||||||
|
@ -1917,9 +1910,7 @@ void tscResetForNextRetrieve(SSqlRes* pRes) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void registerSqlObj(SSqlObj* pSql) {
|
void registerSqlObj(SSqlObj* pSql) {
|
||||||
int32_t ref = T_REF_INC(pSql->pTscObj);
|
taosAcquireRef(tscRefId, pSql->pTscObj->rid);
|
||||||
tscDebug("%p add to tscObj:%p, ref:%d", pSql, pSql->pTscObj, ref);
|
|
||||||
|
|
||||||
pSql->self = taosAddRef(tscObjRef, pSql);
|
pSql->self = taosAddRef(tscObjRef, pSql);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2629,4 +2620,4 @@ int32_t copyTagData(STagData* dst, const STagData* src) {
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -221,7 +221,7 @@ int32_t uDebugFlag = 131;
|
||||||
int32_t debugFlag = 0;
|
int32_t debugFlag = 0;
|
||||||
int32_t sDebugFlag = 135;
|
int32_t sDebugFlag = 135;
|
||||||
int32_t wDebugFlag = 135;
|
int32_t wDebugFlag = 135;
|
||||||
int32_t tsdbDebugFlag = 131;
|
uint32_t tsdbDebugFlag = 131;
|
||||||
int32_t cqDebugFlag = 131;
|
int32_t cqDebugFlag = 131;
|
||||||
|
|
||||||
int32_t (*monStartSystemFp)() = NULL;
|
int32_t (*monStartSystemFp)() = NULL;
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit 32e2c97a4cf7bedaa99f5d6dd8cb036e7f4470df
|
Subproject commit ec77d9049a719dabfd1a7c1122a209e201861944
|
|
@ -349,11 +349,12 @@ CTaosInterface.prototype.useResult = function useResult(result) {
|
||||||
return fields;
|
return fields;
|
||||||
}
|
}
|
||||||
CTaosInterface.prototype.fetchBlock = function fetchBlock(result, fields) {
|
CTaosInterface.prototype.fetchBlock = function fetchBlock(result, fields) {
|
||||||
let pblock = ref.ref(ref.ref(ref.NULL)); // equal to our raw data
|
//let pblock = ref.ref(ref.ref(ref.NULL)); // equal to our raw data
|
||||||
let num_of_rows = this.libtaos.taos_fetch_block(result, pblock)
|
let pblock = this.libtaos.taos_fetch_row(result);
|
||||||
if (num_of_rows == 0) {
|
if (pblock == null) {
|
||||||
return {block:null, num_of_rows:0};
|
return {block:null, num_of_rows:0};
|
||||||
}
|
}
|
||||||
|
|
||||||
var fieldL = this.libtaos.taos_fetch_lengths(result);
|
var fieldL = this.libtaos.taos_fetch_lengths(result);
|
||||||
|
|
||||||
let isMicro = (this.libtaos.taos_result_precision(result) == FieldTypes.C_TIMESTAMP_MICRO);
|
let isMicro = (this.libtaos.taos_result_precision(result) == FieldTypes.C_TIMESTAMP_MICRO);
|
||||||
|
@ -361,7 +362,6 @@ CTaosInterface.prototype.fetchBlock = function fetchBlock(result, fields) {
|
||||||
var fieldlens = [];
|
var fieldlens = [];
|
||||||
|
|
||||||
if (ref.isNull(fieldL) == false) {
|
if (ref.isNull(fieldL) == false) {
|
||||||
|
|
||||||
for (let i = 0; i < fields.length; i ++) {
|
for (let i = 0; i < fields.length; i ++) {
|
||||||
let plen = ref.reinterpret(fieldL, 4, i*4);
|
let plen = ref.reinterpret(fieldL, 4, i*4);
|
||||||
let len = plen.readInt32LE(0);
|
let len = plen.readInt32LE(0);
|
||||||
|
|
|
@ -28,7 +28,7 @@ extern "C" {
|
||||||
default: \
|
default: \
|
||||||
(_v) = (_finalType)GET_INT32_VAL(_data); \
|
(_v) = (_finalType)GET_INT32_VAL(_data); \
|
||||||
break; \
|
break; \
|
||||||
};
|
}
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -136,7 +136,7 @@ void httpSendErrorResp(HttpContext *pContext, int32_t errNo) {
|
||||||
else
|
else
|
||||||
httpCode = 400;
|
httpCode = 400;
|
||||||
|
|
||||||
if (pContext->parser->httpCode != 0) {
|
if (pContext->parser && pContext->parser->httpCode != 0) {
|
||||||
httpCode = pContext->parser->httpCode;
|
httpCode = pContext->parser->httpCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -33,13 +33,6 @@ struct SColumnFilterElem;
|
||||||
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, char* val1, char* val2);
|
typedef bool (*__filter_func_t)(struct SColumnFilterElem* pFilter, char* val1, char* val2);
|
||||||
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
|
typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int32_t order);
|
||||||
|
|
||||||
typedef struct SGroupResInfo {
|
|
||||||
int32_t groupId;
|
|
||||||
int32_t numOfDataPages;
|
|
||||||
int32_t pageId;
|
|
||||||
int32_t rowId;
|
|
||||||
} SGroupResInfo;
|
|
||||||
|
|
||||||
typedef struct SResultRowPool {
|
typedef struct SResultRowPool {
|
||||||
int32_t elemSize;
|
int32_t elemSize;
|
||||||
int32_t blockSize;
|
int32_t blockSize;
|
||||||
|
@ -72,6 +65,12 @@ typedef struct SResultRow {
|
||||||
union {STimeWindow win; char* key;}; // start key of current time window
|
union {STimeWindow win; char* key;}; // start key of current time window
|
||||||
} SResultRow;
|
} SResultRow;
|
||||||
|
|
||||||
|
typedef struct SGroupResInfo {
|
||||||
|
int32_t rowId;
|
||||||
|
int32_t index;
|
||||||
|
SArray* pRows; // SArray<SResultRow*>
|
||||||
|
} SGroupResInfo;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If the number of generated results is greater than this value,
|
* If the number of generated results is greater than this value,
|
||||||
* query query will be halt and return results to client immediate.
|
* query query will be halt and return results to client immediate.
|
||||||
|
@ -89,7 +88,6 @@ typedef struct SResultRowInfo {
|
||||||
int32_t size:24; // number of result set
|
int32_t size:24; // number of result set
|
||||||
int32_t capacity; // max capacity
|
int32_t capacity; // max capacity
|
||||||
int32_t curIndex; // current start active index
|
int32_t curIndex; // current start active index
|
||||||
int64_t startTime; // start time of the first time window for sliding query
|
|
||||||
int64_t prevSKey; // previous (not completed) sliding window start key
|
int64_t prevSKey; // previous (not completed) sliding window start key
|
||||||
} SResultRowInfo;
|
} SResultRowInfo;
|
||||||
|
|
||||||
|
|
|
@ -67,7 +67,7 @@ void tHistogramDestroy(SHistogramInfo** pHisto);
|
||||||
|
|
||||||
void tHistogramPrint(SHistogramInfo* pHisto);
|
void tHistogramPrint(SHistogramInfo* pHisto);
|
||||||
|
|
||||||
int32_t vnodeHistobinarySearch(SHistBin* pEntry, int32_t len, double val);
|
int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val);
|
||||||
|
|
||||||
SHeapEntry* tHeapCreate(int32_t numOfEntries);
|
SHeapEntry* tHeapCreate(int32_t numOfEntries);
|
||||||
void tHeapSort(SHeapEntry* pEntry, int32_t len);
|
void tHeapSort(SHeapEntry* pEntry, int32_t len);
|
||||||
|
|
|
@ -77,7 +77,6 @@ void* destroyResultRowPool(SResultRowPool* p);
|
||||||
int32_t getNumOfAllocatedResultRows(SResultRowPool* p);
|
int32_t getNumOfAllocatedResultRows(SResultRowPool* p);
|
||||||
int32_t getNumOfUsedResultRows(SResultRowPool* p);
|
int32_t getNumOfUsedResultRows(SResultRowPool* p);
|
||||||
|
|
||||||
uint64_t getResultInfoUId(SQueryRuntimeEnv* pRuntimeEnv);
|
|
||||||
bool isPointInterpoQuery(SQuery *pQuery);
|
bool isPointInterpoQuery(SQuery *pQuery);
|
||||||
|
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -158,8 +158,8 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) {
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(USE_ARRAYLIST)
|
#if defined(USE_ARRAYLIST)
|
||||||
int32_t idx = vnodeHistobinarySearch((*pHisto)->elems, (*pHisto)->numOfEntries, val);
|
int32_t idx = histoBinarySearch((*pHisto)->elems, (*pHisto)->numOfEntries, val);
|
||||||
assert(idx >= 0 && idx <= (*pHisto)->maxEntries);
|
assert(idx >= 0 && idx <= (*pHisto)->maxEntries && (*pHisto)->elems != NULL);
|
||||||
|
|
||||||
if ((*pHisto)->elems[idx].val == val && idx >= 0) {
|
if ((*pHisto)->elems[idx].val == val && idx >= 0) {
|
||||||
(*pHisto)->elems[idx].num += 1;
|
(*pHisto)->elems[idx].num += 1;
|
||||||
|
@ -356,7 +356,7 @@ int32_t tHistogramAdd(SHistogramInfo** pHisto, double val) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vnodeHistobinarySearch(SHistBin* pEntry, int32_t len, double val) {
|
int32_t histoBinarySearch(SHistBin* pEntry, int32_t len, double val) {
|
||||||
int32_t end = len - 1;
|
int32_t end = len - 1;
|
||||||
int32_t start = 0;
|
int32_t start = 0;
|
||||||
|
|
||||||
|
@ -466,7 +466,7 @@ void tHistogramPrint(SHistogramInfo* pHisto) {
|
||||||
*/
|
*/
|
||||||
int64_t tHistogramSum(SHistogramInfo* pHisto, double v) {
|
int64_t tHistogramSum(SHistogramInfo* pHisto, double v) {
|
||||||
#if defined(USE_ARRAYLIST)
|
#if defined(USE_ARRAYLIST)
|
||||||
int32_t slotIdx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, v);
|
int32_t slotIdx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, v);
|
||||||
if (pHisto->elems[slotIdx].val != v) {
|
if (pHisto->elems[slotIdx].val != v) {
|
||||||
slotIdx -= 1;
|
slotIdx -= 1;
|
||||||
|
|
||||||
|
|
|
@ -384,7 +384,12 @@ void tSqlSetColumnInfo(TAOS_FIELD *pField, SStrToken *pName, TAOS_FIELD *pType)
|
||||||
pField->name[pName->n] = 0;
|
pField->name[pName->n] = 0;
|
||||||
|
|
||||||
pField->type = pType->type;
|
pField->type = pType->type;
|
||||||
pField->bytes = pType->bytes;
|
if(pField->type < TSDB_DATA_TYPE_BOOL || pField->type > TSDB_DATA_TYPE_NCHAR){
|
||||||
|
pField->bytes = 0;
|
||||||
|
} else {
|
||||||
|
pField->bytes = pType->bytes;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
void tSqlSetColumnType(TAOS_FIELD *pField, SStrToken *type) {
|
||||||
|
|
|
@ -96,8 +96,6 @@ void resetResultRowInfo(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRo
|
||||||
|
|
||||||
pResultRowInfo->curIndex = -1;
|
pResultRowInfo->curIndex = -1;
|
||||||
pResultRowInfo->size = 0;
|
pResultRowInfo->size = 0;
|
||||||
|
|
||||||
pResultRowInfo->startTime = TSKEY_INITIAL_VAL;
|
|
||||||
pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
|
pResultRowInfo->prevSKey = TSKEY_INITIAL_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -110,7 +108,7 @@ void popFrontResultRow(SQueryRuntimeEnv *pRuntimeEnv, SResultRowInfo *pResultRow
|
||||||
assert(num >= 0 && num <= numOfClosed);
|
assert(num >= 0 && num <= numOfClosed);
|
||||||
|
|
||||||
int16_t type = pResultRowInfo->type;
|
int16_t type = pResultRowInfo->type;
|
||||||
int64_t uid = getResultInfoUId(pRuntimeEnv);
|
int64_t uid = 0;
|
||||||
|
|
||||||
char *key = NULL;
|
char *key = NULL;
|
||||||
int16_t bytes = -1;
|
int16_t bytes = -1;
|
||||||
|
@ -181,11 +179,12 @@ void closeAllResultRows(SResultRowInfo *pResultRowInfo) {
|
||||||
assert(pResultRowInfo->size >= 0 && pResultRowInfo->capacity >= pResultRowInfo->size);
|
assert(pResultRowInfo->size >= 0 && pResultRowInfo->capacity >= pResultRowInfo->size);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
for (int32_t i = 0; i < pResultRowInfo->size; ++i) {
|
||||||
if (pResultRowInfo->pResult[i]->closed) {
|
SResultRow* pRow = pResultRowInfo->pResult[i];
|
||||||
|
if (pRow->closed) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pResultRowInfo->pResult[i]->closed = true;
|
pRow->closed = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -383,18 +382,4 @@ void* destroyResultRowPool(SResultRowPool* p) {
|
||||||
|
|
||||||
tfree(p);
|
tfree(p);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
|
||||||
|
|
||||||
uint64_t getResultInfoUId(SQueryRuntimeEnv* pRuntimeEnv) {
|
|
||||||
if (!pRuntimeEnv->stableQuery) {
|
|
||||||
return 0; // for simple table query, the uid is always set to be 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SQuery* pQuery = pRuntimeEnv->pQuery;
|
|
||||||
if (pQuery->interval.interval == 0 || isPointInterpoQuery(pQuery) || pRuntimeEnv->groupbyNormalCol) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
STableId* id = TSDB_TABLEID(pRuntimeEnv->pQuery->current->pTable);
|
|
||||||
return id->uid;
|
|
||||||
}
|
}
|
|
@ -21,19 +21,19 @@ TEST(testCase, histogram_binary_search) {
|
||||||
pHisto->elems[i].val = i;
|
pHisto->elems[i].val = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 1);
|
int32_t idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 1);
|
||||||
assert(idx == 1);
|
assert(idx == 1);
|
||||||
|
|
||||||
idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 9);
|
idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 9);
|
||||||
assert(idx == 9);
|
assert(idx == 9);
|
||||||
|
|
||||||
idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 20);
|
idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 20);
|
||||||
assert(idx == 10);
|
assert(idx == 10);
|
||||||
|
|
||||||
idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, -1);
|
idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, -1);
|
||||||
assert(idx == 0);
|
assert(idx == 0);
|
||||||
|
|
||||||
idx = vnodeHistobinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9);
|
idx = histoBinarySearch(pHisto->elems, pHisto->numOfEntries, 3.9);
|
||||||
assert(idx == 4);
|
assert(idx == 4);
|
||||||
|
|
||||||
free(pHisto);
|
free(pHisto);
|
||||||
|
|
|
@ -31,19 +31,19 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int tsdbDebugFlag;
|
extern uint32_t tsdbDebugFlag;
|
||||||
|
|
||||||
#define tsdbFatal(...) { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TDB FATAL ", 255, __VA_ARGS__); }}
|
#define tsdbFatal(...) do { if (tsdbDebugFlag & DEBUG_FATAL) { taosPrintLog("TDB FATAL ", 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbError(...) { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TDB ERROR ", 255, __VA_ARGS__); }}
|
#define tsdbError(...) do { if (tsdbDebugFlag & DEBUG_ERROR) { taosPrintLog("TDB ERROR ", 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbWarn(...) { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("TDB WARN ", 255, __VA_ARGS__); }}
|
#define tsdbWarn(...) do { if (tsdbDebugFlag & DEBUG_WARN) { taosPrintLog("TDB WARN ", 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbInfo(...) { if (tsdbDebugFlag & DEBUG_INFO) { taosPrintLog("TDB ", 255, __VA_ARGS__); }}
|
#define tsdbInfo(...) do { if (tsdbDebugFlag & DEBUG_INFO) { taosPrintLog("TDB ", 255, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbDebug(...) { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }}
|
#define tsdbDebug(...) do { if (tsdbDebugFlag & DEBUG_DEBUG) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
#define tsdbTrace(...) { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }}
|
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TDB ", tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
|
|
||||||
#define TSDB_MAX_TABLE_SCHEMAS 16
|
#define TSDB_MAX_TABLE_SCHEMAS 16
|
||||||
#define TSDB_FILE_HEAD_SIZE 512
|
#define TSDB_FILE_HEAD_SIZE 512
|
||||||
#define TSDB_FILE_DELIMITER 0xF00AFA0F
|
#define TSDB_FILE_DELIMITER 0xF00AFA0F
|
||||||
#define TSDB_FILE_INIT_MAGIC 0xFFFFFFFF
|
#define TSDB_FILE_INIT_MAGIC 0xFFFFFFFF
|
||||||
|
|
||||||
#define TAOS_IN_RANGE(key, keyMin, keyLast) (((key) >= (keyMin)) && ((key) <= (keyMax)))
|
#define TAOS_IN_RANGE(key, keyMin, keyLast) (((key) >= (keyMin)) && ((key) <= (keyMax)))
|
||||||
|
|
||||||
|
|
|
@ -956,9 +956,9 @@ static int32_t loadFileDataBlock(STsdbQueryHandle* pQueryHandle, SCompBlock* pBl
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDataCols* pTSCol = pQueryHandle->rhelper.pDataCols[0];
|
SDataCols* pTsCol = pQueryHandle->rhelper.pDataCols[0];
|
||||||
if (pCheckInfo->lastKey < pBlock->keyLast) {
|
if (pCheckInfo->lastKey < pBlock->keyLast) {
|
||||||
cur->pos = binarySearchForKey(pTSCol->cols[0].pData, pBlock->numOfRows, pCheckInfo->lastKey, pQueryHandle->order);
|
cur->pos = binarySearchForKey(pTsCol->cols[0].pData, pBlock->numOfRows, pCheckInfo->lastKey, pQueryHandle->order);
|
||||||
} else {
|
} else {
|
||||||
cur->pos = pBlock->numOfRows - 1;
|
cur->pos = pBlock->numOfRows - 1;
|
||||||
}
|
}
|
||||||
|
@ -1704,7 +1704,32 @@ static int32_t createDataBlocksInfo(STsdbQueryHandle* pQueryHandle, int32_t numO
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getDataBlocksInFilesImpl(STsdbQueryHandle* pQueryHandle, bool* exists) {
|
static int32_t getFirstFileDataBlock(STsdbQueryHandle* pQueryHandle, bool* exists);
|
||||||
|
|
||||||
|
static int32_t getDataBlockRv(STsdbQueryHandle* pQueryHandle, STableBlockInfo* pNext, bool *exists) {
|
||||||
|
int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1 : -1;
|
||||||
|
SQueryFilePos* cur = &pQueryHandle->cur;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
int32_t code = loadFileDataBlock(pQueryHandle, pNext->compBlock, pNext->pTableCheckInfo, exists);
|
||||||
|
if (code != TSDB_CODE_SUCCESS || *exists) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((cur->slot == pQueryHandle->numOfBlocks - 1 && ASCENDING_TRAVERSE(pQueryHandle->order)) ||
|
||||||
|
(cur->slot == 0 && !ASCENDING_TRAVERSE(pQueryHandle->order))) {
|
||||||
|
// all data blocks in current file has been checked already, try next file if exists
|
||||||
|
return getFirstFileDataBlock(pQueryHandle, exists);
|
||||||
|
} else { // next block of the same file
|
||||||
|
cur->slot += step;
|
||||||
|
cur->mixBlock = false;
|
||||||
|
cur->blockCompleted = false;
|
||||||
|
pNext = &pQueryHandle->pDataBlockInfo[cur->slot];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t getFirstFileDataBlock(STsdbQueryHandle* pQueryHandle, bool* exists) {
|
||||||
pQueryHandle->numOfBlocks = 0;
|
pQueryHandle->numOfBlocks = 0;
|
||||||
SQueryFilePos* cur = &pQueryHandle->cur;
|
SQueryFilePos* cur = &pQueryHandle->cur;
|
||||||
|
|
||||||
|
@ -1789,7 +1814,23 @@ static int32_t getDataBlocksInFilesImpl(STsdbQueryHandle* pQueryHandle, bool* ex
|
||||||
cur->fid = pQueryHandle->pFileGroup->fileId;
|
cur->fid = pQueryHandle->pFileGroup->fileId;
|
||||||
|
|
||||||
STableBlockInfo* pBlockInfo = &pQueryHandle->pDataBlockInfo[cur->slot];
|
STableBlockInfo* pBlockInfo = &pQueryHandle->pDataBlockInfo[cur->slot];
|
||||||
return loadFileDataBlock(pQueryHandle, pBlockInfo->compBlock, pBlockInfo->pTableCheckInfo, exists);
|
return getDataBlockRv(pQueryHandle, pBlockInfo, exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool isEndFileDataBlock(SQueryFilePos* cur, int32_t numOfBlocks, bool ascTrav) {
|
||||||
|
assert(cur != NULL && numOfBlocks > 0);
|
||||||
|
return (cur->slot == numOfBlocks - 1 && ascTrav) || (cur->slot == 0 && !ascTrav);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void moveToNextDataBlockInCurrentFile(STsdbQueryHandle* pQueryHandle) {
|
||||||
|
int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order)? 1 : -1;
|
||||||
|
|
||||||
|
SQueryFilePos* cur = &pQueryHandle->cur;
|
||||||
|
assert(cur->slot < pQueryHandle->numOfBlocks && cur->slot >= 0);
|
||||||
|
|
||||||
|
cur->slot += step;
|
||||||
|
cur->mixBlock = false;
|
||||||
|
cur->blockCompleted = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists) {
|
static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists) {
|
||||||
|
@ -1800,14 +1841,14 @@ static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists
|
||||||
if (!pQueryHandle->locateStart) {
|
if (!pQueryHandle->locateStart) {
|
||||||
pQueryHandle->locateStart = true;
|
pQueryHandle->locateStart = true;
|
||||||
STsdbCfg* pCfg = &pQueryHandle->pTsdb->config;
|
STsdbCfg* pCfg = &pQueryHandle->pTsdb->config;
|
||||||
int32_t fid = getFileIdFromKey(pQueryHandle->window.skey, pCfg->daysPerFile, pCfg->precision);
|
int32_t fid = getFileIdFromKey(pQueryHandle->window.skey, pCfg->daysPerFile, pCfg->precision);
|
||||||
|
|
||||||
pthread_rwlock_rdlock(&pQueryHandle->pTsdb->tsdbFileH->fhlock);
|
pthread_rwlock_rdlock(&pQueryHandle->pTsdb->tsdbFileH->fhlock);
|
||||||
tsdbInitFileGroupIter(pFileHandle, &pQueryHandle->fileIter, pQueryHandle->order);
|
tsdbInitFileGroupIter(pFileHandle, &pQueryHandle->fileIter, pQueryHandle->order);
|
||||||
tsdbSeekFileGroupIter(&pQueryHandle->fileIter, fid);
|
tsdbSeekFileGroupIter(&pQueryHandle->fileIter, fid);
|
||||||
pthread_rwlock_unlock(&pQueryHandle->pTsdb->tsdbFileH->fhlock);
|
pthread_rwlock_unlock(&pQueryHandle->pTsdb->tsdbFileH->fhlock);
|
||||||
|
|
||||||
return getDataBlocksInFilesImpl(pQueryHandle, exists);
|
return getFirstFileDataBlock(pQueryHandle, exists);
|
||||||
} else {
|
} else {
|
||||||
// check if current file block is all consumed
|
// check if current file block is all consumed
|
||||||
STableBlockInfo* pBlockInfo = &pQueryHandle->pDataBlockInfo[cur->slot];
|
STableBlockInfo* pBlockInfo = &pQueryHandle->pDataBlockInfo[cur->slot];
|
||||||
|
@ -1815,27 +1856,26 @@ static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists
|
||||||
|
|
||||||
// current block is done, try next
|
// current block is done, try next
|
||||||
if ((!cur->mixBlock) || cur->blockCompleted) {
|
if ((!cur->mixBlock) || cur->blockCompleted) {
|
||||||
if ((cur->slot == pQueryHandle->numOfBlocks - 1 && ASCENDING_TRAVERSE(pQueryHandle->order)) ||
|
// all data blocks in current file has been checked already, try next file if exists
|
||||||
(cur->slot == 0 && !ASCENDING_TRAVERSE(pQueryHandle->order))) {
|
|
||||||
// all data blocks in current file has been checked already, try next file if exists
|
|
||||||
return getDataBlocksInFilesImpl(pQueryHandle, exists);
|
|
||||||
} else {
|
|
||||||
// next block of the same file
|
|
||||||
int32_t step = ASCENDING_TRAVERSE(pQueryHandle->order) ? 1 : -1;
|
|
||||||
cur->slot += step;
|
|
||||||
|
|
||||||
cur->mixBlock = false;
|
|
||||||
cur->blockCompleted = false;
|
|
||||||
|
|
||||||
STableBlockInfo* pNext = &pQueryHandle->pDataBlockInfo[cur->slot];
|
|
||||||
return loadFileDataBlock(pQueryHandle, pNext->compBlock, pNext->pTableCheckInfo, exists);
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
tsdbDebug("%p continue in current data block, index:%d, pos:%d, %p", pQueryHandle, cur->slot, cur->pos, pQueryHandle->qinfo);
|
tsdbDebug("%p continue in current data block, index:%d, pos:%d, %p", pQueryHandle, cur->slot, cur->pos,
|
||||||
|
pQueryHandle->qinfo);
|
||||||
int32_t code = handleDataMergeIfNeeded(pQueryHandle, pBlockInfo->compBlock, pCheckInfo);
|
int32_t code = handleDataMergeIfNeeded(pQueryHandle, pBlockInfo->compBlock, pCheckInfo);
|
||||||
*exists = pQueryHandle->realNumOfRows > 0;
|
*exists = (pQueryHandle->realNumOfRows > 0);
|
||||||
|
|
||||||
return code;
|
if (code != TSDB_CODE_SUCCESS || *exists) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// current block is empty, try next block in file
|
||||||
|
// all data blocks in current file has been checked already, try next file if exists
|
||||||
|
if (isEndFileDataBlock(cur, pQueryHandle->numOfBlocks, ASCENDING_TRAVERSE(pQueryHandle->order))) {
|
||||||
|
return getFirstFileDataBlock(pQueryHandle, exists);
|
||||||
|
} else {
|
||||||
|
moveToNextDataBlockInCurrentFile(pQueryHandle);
|
||||||
|
STableBlockInfo* pNext = &pQueryHandle->pDataBlockInfo[cur->slot];
|
||||||
|
return getDataBlockRv(pQueryHandle, pNext, exists);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,6 +52,8 @@ void *taosIterateRef(int rsetId, int64_t rid);
|
||||||
// return the number of references in system
|
// return the number of references in system
|
||||||
int taosListRef();
|
int taosListRef();
|
||||||
|
|
||||||
|
#define RID_VALID(x) ((x) > 0)
|
||||||
|
|
||||||
/* sample code to iterate the refs
|
/* sample code to iterate the refs
|
||||||
|
|
||||||
void demoIterateRefs(int rsetId) {
|
void demoIterateRefs(int rsetId) {
|
||||||
|
|
|
@ -547,13 +547,14 @@ void taosAddToTrashcan(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
__cache_wr_lock(pCacheObj);
|
||||||
STrashElem *pElem = calloc(1, sizeof(STrashElem));
|
STrashElem *pElem = calloc(1, sizeof(STrashElem));
|
||||||
pElem->pData = pNode;
|
pElem->pData = pNode;
|
||||||
pElem->prev = NULL;
|
pElem->prev = NULL;
|
||||||
|
pElem->next = NULL;
|
||||||
pNode->inTrashcan = true;
|
pNode->inTrashcan = true;
|
||||||
pNode->pTNodeHeader = pElem;
|
pNode->pTNodeHeader = pElem;
|
||||||
|
|
||||||
__cache_wr_lock(pCacheObj);
|
|
||||||
pElem->next = pCacheObj->pTrash;
|
pElem->next = pCacheObj->pTrash;
|
||||||
if (pCacheObj->pTrash) {
|
if (pCacheObj->pTrash) {
|
||||||
pCacheObj->pTrash->prev = pElem;
|
pCacheObj->pTrash->prev = pElem;
|
||||||
|
@ -563,8 +564,8 @@ void taosAddToTrashcan(SCacheObj *pCacheObj, SCacheDataNode *pNode) {
|
||||||
pCacheObj->numOfElemsInTrash++;
|
pCacheObj->numOfElemsInTrash++;
|
||||||
__cache_unlock(pCacheObj);
|
__cache_unlock(pCacheObj);
|
||||||
|
|
||||||
uDebug("cache:%s key:%p, %p move to trashcan, pTrashElem:%p, numOfElem in trashcan:%d", pCacheObj->name,
|
uDebug("cache:%s key:%p, %p move to trashcan, pTrashElem:%p, numOfElem in trashcan:%d", pCacheObj->name, pNode->key,
|
||||||
pNode->key, pNode->data, pElem, pCacheObj->numOfElemsInTrash);
|
pNode->data, pElem, pCacheObj->numOfElemsInTrash);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosTrashcanEmpty(SCacheObj *pCacheObj, bool force) {
|
void taosTrashcanEmpty(SCacheObj *pCacheObj, bool force) {
|
||||||
|
|
|
@ -280,10 +280,13 @@ bool tSkipListIterNext(SSkipListIterator *iter) {
|
||||||
tSkipListRLock(pSkipList);
|
tSkipListRLock(pSkipList);
|
||||||
|
|
||||||
if (iter->order == TSDB_ORDER_ASC) {
|
if (iter->order == TSDB_ORDER_ASC) {
|
||||||
if (iter->cur == pSkipList->pTail) {
|
// no data in the skip list
|
||||||
|
if (iter->cur == pSkipList->pTail || iter->next == NULL) {
|
||||||
|
iter->cur = pSkipList->pTail;
|
||||||
tSkipListUnlock(pSkipList);
|
tSkipListUnlock(pSkipList);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter->cur = SL_NODE_GET_FORWARD_POINTER(iter->cur, 0);
|
iter->cur = SL_NODE_GET_FORWARD_POINTER(iter->cur, 0);
|
||||||
|
|
||||||
// a new node is inserted into between iter->cur and iter->next, ignore it
|
// a new node is inserted into between iter->cur and iter->next, ignore it
|
||||||
|
@ -295,9 +298,11 @@ bool tSkipListIterNext(SSkipListIterator *iter) {
|
||||||
iter->step++;
|
iter->step++;
|
||||||
} else {
|
} else {
|
||||||
if (iter->cur == pSkipList->pHead) {
|
if (iter->cur == pSkipList->pHead) {
|
||||||
|
iter->cur = pSkipList->pHead;
|
||||||
tSkipListUnlock(pSkipList);
|
tSkipListUnlock(pSkipList);
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
iter->cur = SL_NODE_GET_BACKWARD_POINTER(iter->cur, 0);
|
iter->cur = SL_NODE_GET_BACKWARD_POINTER(iter->cur, 0);
|
||||||
|
|
||||||
// a new node is inserted into between iter->cur and iter->next, ignore it
|
// a new node is inserted into between iter->cur and iter->next, ignore it
|
||||||
|
|
|
@ -303,8 +303,11 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) {
|
||||||
// NOTE: set return code to be TSDB_CODE_QRY_HAS_RSP to notify dnode to return msg to client
|
// NOTE: set return code to be TSDB_CODE_QRY_HAS_RSP to notify dnode to return msg to client
|
||||||
code = TSDB_CODE_QRY_HAS_RSP;
|
code = TSDB_CODE_QRY_HAS_RSP;
|
||||||
} else {
|
} else {
|
||||||
void *h1 = qGetResultRetrieveMsg(*qhandle);
|
//void *h1 = qGetResultRetrieveMsg(*qhandle);
|
||||||
assert(h1 == NULL);
|
|
||||||
|
/* remove this assert, one possible case that will cause h1 not NULL: query thread unlock pQInfo->lock, and then FETCH thread execute twice before query thread reach here */
|
||||||
|
//assert(h1 == NULL);
|
||||||
|
|
||||||
freehandle = qQueryCompleted(*qhandle);
|
freehandle = qQueryCompleted(*qhandle);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,12 +50,7 @@ pipeline {
|
||||||
agent{label 'master'}
|
agent{label 'master'}
|
||||||
steps {
|
steps {
|
||||||
pre_test()
|
pre_test()
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
|
||||||
sh '''
|
|
||||||
cd ${WKC}/tests/pytest
|
|
||||||
python3 concurrent_inquiry.py -c 1
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
sh '''
|
sh '''
|
||||||
cd ${WKC}/tests
|
cd ${WKC}/tests
|
||||||
./test-all.sh b1
|
./test-all.sh b1
|
||||||
|
@ -82,7 +77,37 @@ pipeline {
|
||||||
./handle_crash_gen_val_log.sh
|
./handle_crash_gen_val_log.sh
|
||||||
'''
|
'''
|
||||||
}
|
}
|
||||||
|
sh'''
|
||||||
|
systemctl start taosd
|
||||||
|
sleep 10
|
||||||
|
'''
|
||||||
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
|
sh '''
|
||||||
|
cd ${WKC}/tests/gotest
|
||||||
|
bash batchtest.sh
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
|
sh '''
|
||||||
|
cd ${WKC}/tests/examples/python/PYTHONConnectorChecker
|
||||||
|
python3 PythonChecker.py
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
|
sh '''
|
||||||
|
cd ${WKC}/tests/examples/JDBC/JDBCDemo/
|
||||||
|
mvn clean package assembly:single -DskipTests >/dev/null
|
||||||
|
java -jar target/jdbcChecker-SNAPSHOT-jar-with-dependencies.jar -host 127.0.0.1
|
||||||
|
'''
|
||||||
|
}
|
||||||
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
|
sh '''
|
||||||
|
cd ${JENKINS_HOME}/workspace/C#NET/src/CheckC#
|
||||||
|
dotnet run
|
||||||
|
'''
|
||||||
|
}
|
||||||
sh '''
|
sh '''
|
||||||
|
systemctl stop taosd
|
||||||
cd ${WKC}/tests
|
cd ${WKC}/tests
|
||||||
./test-all.sh b2
|
./test-all.sh b2
|
||||||
date
|
date
|
||||||
|
@ -95,6 +120,15 @@ pipeline {
|
||||||
|
|
||||||
steps {
|
steps {
|
||||||
pre_test()
|
pre_test()
|
||||||
|
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
||||||
|
sh '''
|
||||||
|
cd ${WKC}/tests/pytest
|
||||||
|
nohup taosd >/dev/null &
|
||||||
|
sleep 10
|
||||||
|
python3 concurrent_inquiry.py -c 1
|
||||||
|
|
||||||
|
'''
|
||||||
|
}
|
||||||
sh '''
|
sh '''
|
||||||
cd ${WKC}/tests/pytest
|
cd ${WKC}/tests/pytest
|
||||||
./valgrind-test.sh 2>&1 > mem-error-out.log
|
./valgrind-test.sh 2>&1 > mem-error-out.log
|
||||||
|
@ -106,41 +140,7 @@ pipeline {
|
||||||
date'''
|
date'''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stage('connector'){
|
|
||||||
agent{label "release"}
|
|
||||||
steps{
|
|
||||||
sh'''
|
|
||||||
cd ${WORKSPACE}
|
|
||||||
git checkout develop
|
|
||||||
'''
|
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
|
||||||
sh '''
|
|
||||||
cd ${WORKSPACE}/tests/gotest
|
|
||||||
bash batchtest.sh
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
|
||||||
sh '''
|
|
||||||
cd ${WORKSPACE}/tests/examples/python/PYTHONConnectorChecker
|
|
||||||
python3 PythonChecker.py
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
|
||||||
sh '''
|
|
||||||
cd ${WORKSPACE}/tests/examples/JDBC/JDBCDemo/
|
|
||||||
mvn clean package assembly:single >/dev/null
|
|
||||||
java -jar target/jdbcChecker-SNAPSHOT-jar-with-dependencies.jar -host 127.0.0.1
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
catchError(buildResult: 'SUCCESS', stageResult: 'FAILURE') {
|
|
||||||
sh '''
|
|
||||||
cd ${JENKINS_HOME}/workspace/C#NET/src/CheckC#
|
|
||||||
dotnet run
|
|
||||||
'''
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
stage('arm64_build'){
|
stage('arm64_build'){
|
||||||
agent{label 'arm64'}
|
agent{label 'arm64'}
|
||||||
steps{
|
steps{
|
||||||
|
|
|
@ -388,7 +388,9 @@ class ConcurrentInquiry:
|
||||||
print(
|
print(
|
||||||
"Failure thread%d, sql: %s \nexception: %s" %
|
"Failure thread%d, sql: %s \nexception: %s" %
|
||||||
(threadID, str(sql),str(e)))
|
(threadID, str(sql),str(e)))
|
||||||
#exit(-1)
|
err_uec='Unable to establish connection'
|
||||||
|
if err_uec in str(e) and loop >0:
|
||||||
|
exit(-1)
|
||||||
loop -= 1
|
loop -= 1
|
||||||
if loop == 0: break
|
if loop == 0: break
|
||||||
|
|
||||||
|
@ -415,7 +417,9 @@ class ConcurrentInquiry:
|
||||||
print(
|
print(
|
||||||
"Failure thread%d, sql: %s \nexception: %s" %
|
"Failure thread%d, sql: %s \nexception: %s" %
|
||||||
(threadID, str(sql),str(e)))
|
(threadID, str(sql),str(e)))
|
||||||
#exit(-1)
|
err_uec='Unable to establish connection'
|
||||||
|
if err_uec in str(e) and loop >0:
|
||||||
|
exit(-1)
|
||||||
loop -= 1
|
loop -= 1
|
||||||
if loop == 0: break
|
if loop == 0: break
|
||||||
|
|
||||||
|
|
|
@ -5,9 +5,10 @@ GREEN='\033[1;32m'
|
||||||
GREEN_DARK='\033[0;32m'
|
GREEN_DARK='\033[0;32m'
|
||||||
GREEN_UNDERLINE='\033[4;32m'
|
GREEN_UNDERLINE='\033[4;32m'
|
||||||
NC='\033[0m'
|
NC='\033[0m'
|
||||||
nohup /var/lib/jenkins/workspace/TDinternal/debug/build/bin/taosd -c /var/lib/jenkins/workspace/TDinternal/community/sim/dnode1/cfg >/dev/null &
|
#nohup /var/lib/jenkins/workspace/TDinternal/debug/build/bin/taosd -c /var/lib/jenkins/workspace/TDinternal/community/sim/dnode1/cfg >/dev/null &
|
||||||
|
nohup /root/TDinternal/debug/build/bin/taosd -c /root/TDinternal/community/sim/dnode1/cfg >/dev/null &
|
||||||
./crash_gen.sh --valgrind -p -t 10 -s 250 -b 4
|
./crash_gen.sh --valgrind -p -t 10 -s 250 -b 4
|
||||||
pidof taosd|xargs kill
|
pidof taosd|xargs kill -9
|
||||||
grep 'start to execute\|ERROR SUMMARY' valgrind.err|grep -v 'grep'|uniq|tee crash_gen_mem_err.log
|
grep 'start to execute\|ERROR SUMMARY' valgrind.err|grep -v 'grep'|uniq|tee crash_gen_mem_err.log
|
||||||
|
|
||||||
for memError in `grep 'ERROR SUMMARY' crash_gen_mem_err.log | awk '{print $4}'`
|
for memError in `grep 'ERROR SUMMARY' crash_gen_mem_err.log | awk '{print $4}'`
|
||||||
|
@ -31,4 +32,4 @@ if [ -n "$defiMemError" ]; then
|
||||||
exit 8
|
exit 8
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
|
@ -144,4 +144,20 @@ if $data03 != 319 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
|
|
||||||
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
print ===================> TD-2488
|
||||||
|
sql create table m1(ts timestamp, k int) tags(a int);
|
||||||
|
sql create table t1 using m1 tags(1);
|
||||||
|
sql create table t2 using m1 tags(2);
|
||||||
|
sql insert into t1 values('2020-1-1 1:1:1', 1);
|
||||||
|
sql insert into t1 values('2020-1-1 1:10:1', 2);
|
||||||
|
sql insert into t2 values('2020-1-1 1:5:1', 99);
|
||||||
|
|
||||||
|
print ================== restart server to commit data into disk
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
sleep 3000
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
print ================== server restart completed
|
||||||
|
sql select ts from m1 where ts='2020-1-1 1:5:1'
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
|
@ -31,11 +31,17 @@ function runSimCaseOneByOnefq {
|
||||||
case=`echo $line | grep sim$ |awk '{print $NF}'`
|
case=`echo $line | grep sim$ |awk '{print $NF}'`
|
||||||
|
|
||||||
start_time=`date +%s`
|
start_time=`date +%s`
|
||||||
./test.sh -f $case > /dev/null 2>&1 && \
|
IN_TDINTERNAL="community"
|
||||||
|
if [[ "$tests_dir" == *"$IN_TDINTERNAL"* ]]; then
|
||||||
|
./test.sh -f $case > /dev/null 2>&1 && \
|
||||||
echo -e "${GREEN}$case success${NC}" | tee -a out.log || \
|
echo -e "${GREEN}$case success${NC}" | tee -a out.log || \
|
||||||
( grep 'script.*success.*m$' ../../../sim/tsim/log/taoslog0.0 && echo -e "${GREEN}$case success${NC}" | tee -a out.log ) || echo -e "${RED}$case failed${NC}" | tee -a out.log
|
( grep 'script.*success.*m$' ../../../sim/tsim/log/taoslog0.0 && echo -e "${GREEN}$case success${NC}" | tee -a out.log ) || echo -e "${RED}$case failed${NC}" | tee -a out.log
|
||||||
|
else
|
||||||
|
./test.sh -f $case > /dev/null 2>&1 && \
|
||||||
|
echo -e "${GREEN}$case success${NC}" | tee -a out.log || \
|
||||||
|
( grep 'script.*success.*m$' ../../sim/tsim/log/taoslog0.0 && echo -e "${GREEN}$case success${NC}" | tee -a out.log ) || echo -e "${RED}$case failed${NC}" | tee -a out.log
|
||||||
|
fi
|
||||||
|
|
||||||
out_log=`tail -1 out.log `
|
out_log=`tail -1 out.log `
|
||||||
if [[ $out_log =~ 'failed' ]];then
|
if [[ $out_log =~ 'failed' ]];then
|
||||||
exit 8
|
exit 8
|
||||||
|
|
Loading…
Reference in New Issue