Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
Tonvia
TDengine
提交
f6296b06
T
TDengine
项目概览
Tonvia
/
TDengine
与 Fork 源项目一致
Fork自
taosdata / TDengine
通知
1
Star
1
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
f6296b06
编写于
4月 21, 2021
作者:
H
Haojun Liao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
[td-3902]update the log.
上级
328c8d4c
变更
5
隐藏空白更改
内联
并排
Showing
5 changed file
with
96 addition
and
95 deletion
+96
-95
src/client/src/tscServer.c
src/client/src/tscServer.c
+5
-4
src/query/src/qExecutor.c
src/query/src/qExecutor.c
+42
-42
src/query/src/queryMain.c
src/query/src/queryMain.c
+18
-18
src/tsdb/src/tsdbRead.c
src/tsdb/src/tsdbRead.c
+26
-26
src/vnode/src/vnodeRead.c
src/vnode/src/vnodeRead.c
+5
-5
未找到文件。
src/client/src/tscServer.c
浏览文件 @
f6296b06
...
...
@@ -562,11 +562,12 @@ int tscBuildFetchMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
}
pRetrieveMsg
->
header
.
vgId
=
htonl
(
vgId
);
tscDebug
(
"0x%"
PRIx64
" build fetch msg from vgId:%d, vgIndex:%d, qId:
%"
PRIu
64
,
pSql
->
self
,
vgId
,
vgIndex
,
pSql
->
res
.
qId
);
tscDebug
(
"0x%"
PRIx64
" build fetch msg from vgId:%d, vgIndex:%d, qId:
0x%"
PRIx
64
,
pSql
->
self
,
vgId
,
vgIndex
,
pSql
->
res
.
qId
);
}
else
{
STableMeta
*
pTableMeta
=
pTableMetaInfo
->
pTableMeta
;
pRetrieveMsg
->
header
.
vgId
=
htonl
(
pTableMeta
->
vgId
);
tscDebug
(
"0x%"
PRIx64
" build fetch msg from only one vgroup, vgId:%d, qId:%"
PRIu64
,
pSql
->
self
,
pTableMeta
->
vgId
,
pSql
->
res
.
qId
);
tscDebug
(
"0x%"
PRIx64
" build fetch msg from only one vgroup, vgId:%d, qId:0x%"
PRIx64
,
pSql
->
self
,
pTableMeta
->
vgId
,
pSql
->
res
.
qId
);
}
pSql
->
cmd
.
payloadLen
=
sizeof
(
SRetrieveTableMsg
);
...
...
@@ -2405,7 +2406,7 @@ int tscProcessQueryRsp(SSqlObj *pSql) {
pRes
->
data
=
NULL
;
tscResetForNextRetrieve
(
pRes
);
tscDebug
(
"0x%"
PRIx64
" query rsp received, qId:
%"
PRIu
64
,
pSql
->
self
,
pRes
->
qId
);
tscDebug
(
"0x%"
PRIx64
" query rsp received, qId:
0x%"
PRIx
64
,
pSql
->
self
,
pRes
->
qId
);
return
0
;
}
...
...
@@ -2463,7 +2464,7 @@ int tscProcessRetrieveRspFromNode(SSqlObj *pSql) {
}
pRes
->
row
=
0
;
tscDebug
(
"0x%"
PRIx64
" numOfRows:%d, offset:%"
PRId64
", complete:%d, qId:
%"
PRIu
64
,
pSql
->
self
,
pRes
->
numOfRows
,
pRes
->
offset
,
tscDebug
(
"0x%"
PRIx64
" numOfRows:%d, offset:%"
PRId64
", complete:%d, qId:
0x%"
PRIx
64
,
pSql
->
self
,
pRes
->
numOfRows
,
pRes
->
offset
,
pRes
->
completed
,
pRes
->
qId
);
return
0
;
...
...
src/query/src/qExecutor.c
浏览文件 @
f6296b06
...
...
@@ -1359,7 +1359,7 @@ static void doHashGroupbyAgg(SOperatorInfo* pOperator, SGroupbyOperatorInfo *pIn
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
if
(
type
==
TSDB_DATA_TYPE_FLOAT
||
type
==
TSDB_DATA_TYPE_DOUBLE
)
{
qError
(
"QInfo:
%"
PRIu
64
" group by not supported on double/float columns, abort"
,
GET_QID
(
pRuntimeEnv
));
qError
(
"QInfo:
0x%"
PRIx
64
" group by not supported on double/float columns, abort"
,
GET_QID
(
pRuntimeEnv
));
return
;
}
...
...
@@ -1746,7 +1746,7 @@ static void* destroySQLFunctionCtx(SQLFunctionCtx* pCtx, int32_t numOfOutput) {
}
static
int32_t
setupQueryRuntimeEnv
(
SQueryRuntimeEnv
*
pRuntimeEnv
,
int32_t
numOfTables
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" setup runtime env"
,
GET_QID
(
pRuntimeEnv
));
qDebug
(
"QInfo:
0x%"
PRIx
64
" setup runtime env"
,
GET_QID
(
pRuntimeEnv
));
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
pRuntimeEnv
->
prevGroupId
=
INT32_MIN
;
...
...
@@ -1779,7 +1779,7 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOf
*
(
int64_t
*
)
pRuntimeEnv
->
prevRow
[
0
]
=
INT64_MIN
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" init runtime environment completed"
,
GET_QID
(
pRuntimeEnv
));
qDebug
(
"QInfo:
0x%"
PRIx
64
" init runtime environment completed"
,
GET_QID
(
pRuntimeEnv
));
// group by normal column, sliding window query, interval query are handled by interval query processor
// interval (down sampling operation)
...
...
@@ -1895,7 +1895,7 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) {
SQuery
*
pQuery
=
pRuntimeEnv
->
pQuery
;
SQInfo
*
pQInfo
=
(
SQInfo
*
)
pRuntimeEnv
->
qinfo
;
qDebug
(
"QInfo:
%"
PRIu
64
" teardown runtime env"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" teardown runtime env"
,
pQInfo
->
qId
);
if
(
pRuntimeEnv
->
sasArray
!=
NULL
)
{
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfOutput
;
++
i
)
{
...
...
@@ -2121,7 +2121,7 @@ bool colIdCheck(SQuery *pQuery, uint64_t qId) {
// load data column information is incorrect
for
(
int32_t
i
=
0
;
i
<
pQuery
->
numOfCols
-
1
;
++
i
)
{
if
(
pQuery
->
colList
[
i
].
colId
==
pQuery
->
colList
[
i
+
1
].
colId
)
{
qError
(
"QInfo:
%"
PRIu
64
" invalid data load column for query"
,
qId
);
qError
(
"QInfo:
0x%"
PRIx
64
" invalid data load column for query"
,
qId
);
return
false
;
}
}
...
...
@@ -2208,13 +2208,13 @@ static void changeExecuteScanOrder(SQInfo *pQInfo, SQueryTableMsg* pQueryMsg, bo
SQuery
*
pQuery
=
pQInfo
->
runtimeEnv
.
pQuery
;
// in case of point-interpolation query, use asc order scan
char
msg
[]
=
"QInfo:
%"
PRIu
64
" scan order changed for %s query, old:%d, new:%d, qrange exchanged, old qrange:%"
PRId64
char
msg
[]
=
"QInfo:
0x%"
PRIx
64
" scan order changed for %s query, old:%d, new:%d, qrange exchanged, old qrange:%"
PRId64
"-%"
PRId64
", new qrange:%"
PRId64
"-%"
PRId64
;
// todo handle the case the the order irrelevant query type mixed up with order critical query type
// descending order query for last_row query
if
(
isFirstLastRowQuery
(
pQuery
))
{
qDebug
(
"QInfo:
%"
PRIu
64
" scan order changed for last_row query, old:%d, new:%d"
,
pQInfo
->
qId
,
pQuery
->
order
.
order
,
TSDB_ORDER_ASC
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" scan order changed for last_row query, old:%d, new:%d"
,
pQInfo
->
qId
,
pQuery
->
order
.
order
,
TSDB_ORDER_ASC
);
pQuery
->
order
.
order
=
TSDB_ORDER_ASC
;
if
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
)
{
...
...
@@ -2692,7 +2692,7 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
*
status
=
updateBlockLoadStatus
(
pRuntimeEnv
->
pQuery
,
*
status
);
if
((
*
status
)
==
BLK_DATA_NO_NEEDED
||
(
*
status
)
==
BLK_DATA_DISCARD
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" data block discard, brange:%"
PRId64
"-%"
PRId64
", rows:%d"
,
pQInfo
->
qId
,
pBlockInfo
->
window
.
skey
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" data block discard, brange:%"
PRId64
"-%"
PRId64
", rows:%d"
,
pQInfo
->
qId
,
pBlockInfo
->
window
.
skey
,
pBlockInfo
->
window
.
ekey
,
pBlockInfo
->
rows
);
pCost
->
discardBlocks
+=
1
;
}
else
if
((
*
status
)
==
BLK_DATA_STATIS_NEEDED
)
{
...
...
@@ -2735,7 +2735,7 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
(
char
*
)
&
(
pBlock
->
pBlockStatis
[
i
].
max
));
if
(
!
load
)
{
// current block has been discard due to filter applied
pCost
->
discardBlocks
+=
1
;
qDebug
(
"QInfo:
%"
PRIu
64
" data block discard, brange:%"
PRId64
"-%"
PRId64
", rows:%d"
,
pQInfo
->
qId
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" data block discard, brange:%"
PRId64
"-%"
PRId64
", rows:%d"
,
pQInfo
->
qId
,
pBlockInfo
->
window
.
skey
,
pBlockInfo
->
window
.
ekey
,
pBlockInfo
->
rows
);
(
*
status
)
=
BLK_DATA_DISCARD
;
return
TSDB_CODE_SUCCESS
;
...
...
@@ -2747,7 +2747,7 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv* pRuntimeEnv, STableScanInfo* pTa
// current block has been discard due to filter applied
if
(
!
doFilterByBlockStatistics
(
pRuntimeEnv
,
pBlock
->
pBlockStatis
,
pTableScanInfo
->
pCtx
,
pBlockInfo
->
rows
))
{
pCost
->
discardBlocks
+=
1
;
qDebug
(
"QInfo:
%"
PRIu
64
" data block discard, brange:%"
PRId64
"-%"
PRId64
", rows:%d"
,
pQInfo
->
qId
,
pBlockInfo
->
window
.
skey
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" data block discard, brange:%"
PRId64
"-%"
PRId64
", rows:%d"
,
pQInfo
->
qId
,
pBlockInfo
->
window
.
skey
,
pBlockInfo
->
window
.
ekey
,
pBlockInfo
->
rows
);
(
*
status
)
=
BLK_DATA_DISCARD
;
return
TSDB_CODE_SUCCESS
;
...
...
@@ -3414,10 +3414,10 @@ void setCtxTagForJoin(SQueryRuntimeEnv* pRuntimeEnv, SQLFunctionCtx* pCtx, SExpr
int16_t
tagType
=
pCtx
[
0
].
tag
.
nType
;
if
(
tagType
==
TSDB_DATA_TYPE_BINARY
||
tagType
==
TSDB_DATA_TYPE_NCHAR
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" set tag value for join comparison, colId:%"
PRId64
", val:%s"
,
GET_QID
(
pRuntimeEnv
),
qDebug
(
"QInfo:
0x%"
PRIx
64
" set tag value for join comparison, colId:%"
PRId64
", val:%s"
,
GET_QID
(
pRuntimeEnv
),
pExprInfo
->
base
.
arg
->
argValue
.
i64
,
pCtx
[
0
].
tag
.
pz
);
}
else
{
qDebug
(
"QInfo:
%"
PRIu
64
" set tag value for join comparison, colId:%"
PRId64
", val:%"
PRId64
,
GET_QID
(
pRuntimeEnv
),
qDebug
(
"QInfo:
0x%"
PRIx
64
" set tag value for join comparison, colId:%"
PRId64
", val:%"
PRId64
,
GET_QID
(
pRuntimeEnv
),
pExprInfo
->
base
.
arg
->
argValue
.
i64
,
pCtx
[
0
].
tag
.
i64
);
}
}
...
...
@@ -3437,9 +3437,9 @@ int32_t setTimestampListJoinInfo(SQueryRuntimeEnv* pRuntimeEnv, tVariant* pTag,
// failed to find data with the specified tag value and vnodeId
if
(
!
tsBufIsValidElem
(
&
elem
))
{
if
(
pTag
->
nType
==
TSDB_DATA_TYPE_BINARY
||
pTag
->
nType
==
TSDB_DATA_TYPE_NCHAR
)
{
qError
(
"QInfo:
%"
PRIu
64
" failed to find tag:%s in ts_comp"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
pz
);
qError
(
"QInfo:
0x%"
PRIx
64
" failed to find tag:%s in ts_comp"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
pz
);
}
else
{
qError
(
"QInfo:
%"
PRIu
64
" failed to find tag:%"
PRId64
" in ts_comp"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
i64
);
qError
(
"QInfo:
0x%"
PRIx
64
" failed to find tag:%"
PRId64
" in ts_comp"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
i64
);
}
return
-
1
;
...
...
@@ -3448,17 +3448,17 @@ int32_t setTimestampListJoinInfo(SQueryRuntimeEnv* pRuntimeEnv, tVariant* pTag,
// Keep the cursor info of current table
pTableQueryInfo
->
cur
=
tsBufGetCursor
(
pRuntimeEnv
->
pTsBuf
);
if
(
pTag
->
nType
==
TSDB_DATA_TYPE_BINARY
||
pTag
->
nType
==
TSDB_DATA_TYPE_NCHAR
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
pz
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
pz
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
}
else
{
qDebug
(
"QInfo:
%"
PRIu
64
" find tag:%"
PRId64
" start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
i64
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" find tag:%"
PRId64
" start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
i64
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
}
}
else
{
tsBufSetCursor
(
pRuntimeEnv
->
pTsBuf
,
&
pTableQueryInfo
->
cur
);
if
(
pTag
->
nType
==
TSDB_DATA_TYPE_BINARY
||
pTag
->
nType
==
TSDB_DATA_TYPE_NCHAR
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
pz
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" find tag:%s start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
pz
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
}
else
{
qDebug
(
"QInfo:
%"
PRIu
64
" find tag:%"
PRId64
" start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
i64
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" find tag:%"
PRId64
" start pos in ts_comp, blockIndex:%d, tsIndex:%d"
,
GET_QID
(
pRuntimeEnv
),
pTag
->
i64
,
pTableQueryInfo
->
cur
.
blockIndex
,
pTableQueryInfo
->
cur
.
tsIndex
);
}
}
...
...
@@ -3596,7 +3596,7 @@ static int32_t doCopyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo*
int32_t
start
=
0
;
int32_t
step
=
-
1
;
qDebug
(
"QInfo:
%"
PRIu
64
" start to copy data from windowResInfo to output buf"
,
GET_QID
(
pRuntimeEnv
));
qDebug
(
"QInfo:
0x%"
PRIx
64
" start to copy data from windowResInfo to output buf"
,
GET_QID
(
pRuntimeEnv
));
if
(
orderType
==
TSDB_ORDER_ASC
)
{
start
=
pGroupResInfo
->
index
;
step
=
1
;
...
...
@@ -3636,7 +3636,7 @@ static int32_t doCopyToSDataBlock(SQueryRuntimeEnv* pRuntimeEnv, SGroupResInfo*
}
}
qDebug
(
"QInfo:
%"
PRIu
64
" copy data to query buf completed"
,
GET_QID
(
pRuntimeEnv
));
qDebug
(
"QInfo:
0x%"
PRIx
64
" copy data to query buf completed"
,
GET_QID
(
pRuntimeEnv
));
pBlock
->
info
.
rows
=
numOfResult
;
return
0
;
}
...
...
@@ -3722,11 +3722,11 @@ static void doCopyQueryResultToMsg(SQInfo *pQInfo, int32_t numOfRows, char *data
data
+=
sizeof
(
STableIdInfo
);
total
++
;
qDebug
(
"QInfo:
%"
PRIu
64
" set subscribe info, tid:%d, uid:%"
PRIu64
", skey:%"
PRId64
,
pQInfo
->
qId
,
item
->
tid
,
item
->
uid
,
item
->
key
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" set subscribe info, tid:%d, uid:%"
PRIu64
", skey:%"
PRId64
,
pQInfo
->
qId
,
item
->
tid
,
item
->
uid
,
item
->
key
);
item
=
taosHashIterate
(
pRuntimeEnv
->
pTableRetrieveTsMap
,
item
);
}
qDebug
(
"QInfo:
%"
PRIu
64
" set %d subscribe info"
,
pQInfo
->
qId
,
total
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" set %d subscribe info"
,
pQInfo
->
qId
,
total
);
// Check if query is completed or not for stable query or normal table query respectively.
if
(
Q_STATUS_EQUAL
(
pRuntimeEnv
->
status
,
QUERY_COMPLETED
)
&&
pRuntimeEnv
->
proot
->
status
==
OP_EXEC_DONE
)
{
setQueryStatus
(
pRuntimeEnv
,
QUERY_OVER
);
...
...
@@ -3765,12 +3765,12 @@ void queryCostStatis(SQInfo *pQInfo) {
pSummary
->
numOfTimeWindows
=
0
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" :cost summary: elapsed time:%"
PRId64
" us, first merge:%"
PRId64
" us, total blocks:%d, "
qDebug
(
"QInfo:
0x%"
PRIx
64
" :cost summary: elapsed time:%"
PRId64
" us, first merge:%"
PRId64
" us, total blocks:%d, "
"load block statis:%d, load data block:%d, total rows:%"
PRId64
", check rows:%"
PRId64
,
pQInfo
->
qId
,
pSummary
->
elapsedTime
,
pSummary
->
firstStageMergeTime
,
pSummary
->
totalBlocks
,
pSummary
->
loadBlockStatis
,
pSummary
->
loadBlocks
,
pSummary
->
totalRows
,
pSummary
->
totalCheckedRows
);
qDebug
(
"QInfo:
%"
PRIu
64
" :cost summary: winResPool size:%.2f Kb, numOfWin:%"
PRId64
", tableInfoSize:%.2f Kb, hashTable:%.2f Kb"
,
pQInfo
->
qId
,
pSummary
->
winInfoSize
/
1024
.
0
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" :cost summary: winResPool size:%.2f Kb, numOfWin:%"
PRId64
", tableInfoSize:%.2f Kb, hashTable:%.2f Kb"
,
pQInfo
->
qId
,
pSummary
->
winInfoSize
/
1024
.
0
,
pSummary
->
numOfTimeWindows
,
pSummary
->
tableInfoSize
/
1024
.
0
,
pSummary
->
hashSize
/
1024
.
0
);
}
...
...
@@ -3806,7 +3806,7 @@ void queryCostStatis(SQInfo *pQInfo) {
//
// int32_t numOfRes = tableApplyFunctionsOnBlock(pRuntimeEnv, pBlockInfo, NULL, binarySearchForKey, pDataBlock);
//
// qDebug("QInfo:
%"PRIu
64" check data block, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, numOfRes:%d, lastKey:%"PRId64, GET_QID(pRuntimeEnv),
// qDebug("QInfo:
0x%"PRIx
64" check data block, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, numOfRes:%d, lastKey:%"PRId64, GET_QID(pRuntimeEnv),
// pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, numOfRes, pQuery->current->lastKey);
//}
...
...
@@ -3836,7 +3836,7 @@ void queryCostStatis(SQInfo *pQInfo) {
// pTableQueryInfo->lastKey = (QUERY_IS_ASC_QUERY(pQuery)) ? blockInfo.window.ekey : blockInfo.window.skey;
// pTableQueryInfo->lastKey += step;
//
// qDebug("QInfo:
%"PRIu
64" skip rows:%d, offset:%" PRId64, GET_QID(pRuntimeEnv), blockInfo.rows,
// qDebug("QInfo:
0x%"PRIx
64" skip rows:%d, offset:%" PRId64, GET_QID(pRuntimeEnv), blockInfo.rows,
// pQuery->limit.offset);
// } else { // find the appropriated start position in current block
// updateOffsetVal(pRuntimeEnv, &blockInfo);
...
...
@@ -3884,7 +3884,7 @@ void queryCostStatis(SQInfo *pQInfo) {
// int32_t numOfRes = tableApplyFunctionsOnBlock(pRuntimeEnv, pBlockInfo, NULL, binarySearchForKey, pDataBlock);
// pRuntimeEnv->resultRowInfo.curIndex = index; // restore the window index
//
// qDebug("QInfo:
%"PRIu
64" check data block, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, numOfRes:%d, lastKey:%" PRId64,
// qDebug("QInfo:
0x%"PRIx
64" check data block, brange:%" PRId64 "-%" PRId64 ", numOfRows:%d, numOfRes:%d, lastKey:%" PRId64,
// GET_QID(pRuntimeEnv), pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, numOfRes,
// pQuery->current->lastKey);
//
...
...
@@ -4315,7 +4315,7 @@ static SSDataBlock* doTableScan(void* param) {
pResultRowInfo
->
prevSKey
=
pResultRowInfo
->
pResult
[
0
]
->
win
.
skey
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" start to repeat scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" start to repeat scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
GET_QID
(
pRuntimeEnv
),
cond
.
twindow
.
skey
,
cond
.
twindow
.
ekey
);
}
...
...
@@ -4325,7 +4325,7 @@ static SSDataBlock* doTableScan(void* param) {
STsdbQueryCond
cond
=
createTsdbQueryCond
(
pQuery
,
&
pQuery
->
window
);
tsdbResetQueryHandle
(
pTableScanInfo
->
pQueryHandle
,
&
cond
);
qDebug
(
"QInfo:
%"
PRIu
64
" start to reverse scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" start to reverse scan data blocks due to query func required, qrange:%"
PRId64
"-%"
PRId64
,
GET_QID
(
pRuntimeEnv
),
cond
.
twindow
.
skey
,
cond
.
twindow
.
ekey
);
pRuntimeEnv
->
scanFlag
=
REVERSE_SCAN
;
...
...
@@ -5584,14 +5584,14 @@ static SSDataBlock* doTagScan(void* param) {
count
+=
1
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" create (tableId, tag) info completed, rows:%d"
,
GET_QID
(
pRuntimeEnv
),
count
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" create (tableId, tag) info completed, rows:%d"
,
GET_QID
(
pRuntimeEnv
),
count
);
}
else
if
(
functionId
==
TSDB_FUNC_COUNT
)
{
// handle the "count(tbname)" query
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pRes
->
pDataBlock
,
0
);
*
(
int64_t
*
)
pColInfo
->
pData
=
pInfo
->
totalTables
;
count
=
1
;
pOperator
->
status
=
OP_EXEC_DONE
;
qDebug
(
"QInfo:
%"
PRIu
64
" create count(tbname) query, res:%d rows:1"
,
GET_QID
(
pRuntimeEnv
),
count
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" create count(tbname) query, res:%d rows:1"
,
GET_QID
(
pRuntimeEnv
),
count
);
}
else
{
// return only the tags|table name etc.
SExprInfo
*
pExprInfo
=
pOperator
->
pExpr
;
// todo use the column list instead of exprinfo
...
...
@@ -5630,7 +5630,7 @@ static SSDataBlock* doTagScan(void* param) {
pOperator
->
status
=
OP_EXEC_DONE
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" create tag values results completed, rows:%d"
,
GET_QID
(
pRuntimeEnv
),
count
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" create tag values results completed, rows:%d"
,
GET_QID
(
pRuntimeEnv
),
count
);
}
pRes
->
info
.
rows
=
count
;
...
...
@@ -6422,13 +6422,13 @@ static int32_t createFilterInfo(SQuery *pQuery, uint64_t qId) {
int32_t
lower
=
pSingleColFilter
->
filterInfo
.
lowerRelOptr
;
int32_t
upper
=
pSingleColFilter
->
filterInfo
.
upperRelOptr
;
if
(
lower
==
TSDB_RELATION_INVALID
&&
upper
==
TSDB_RELATION_INVALID
)
{
qError
(
"QInfo:
%"
PRIu
64
" invalid filter info"
,
qId
);
qError
(
"QInfo:
0x%"
PRIx
64
" invalid filter info"
,
qId
);
return
TSDB_CODE_QRY_INVALID_MSG
;
}
pSingleColFilter
->
fp
=
getFilterOperator
(
lower
,
upper
);
if
(
pSingleColFilter
->
fp
==
NULL
)
{
qError
(
"QInfo:
%"
PRIu
64
" invalid filter info"
,
qId
);
qError
(
"QInfo:
0x%"
PRIx
64
" invalid filter info"
,
qId
);
return
TSDB_CODE_QRY_INVALID_MSG
;
}
...
...
@@ -6659,7 +6659,7 @@ SQInfo* createQInfoImpl(SQueryTableMsg* pQueryMsg, SSqlGroupbyExpr* pGroupbyExpr
// todo refactor
pQInfo
->
query
.
queryBlockDist
=
(
numOfOutput
==
1
&&
pExprs
[
0
].
base
.
colInfo
.
colId
==
TSDB_BLOCK_DIST_COLUMN_INDEX
);
qDebug
(
"qmsg:%p QInfo:
%"
PRIu
64
"-%p created"
,
pQueryMsg
,
pQInfo
->
qId
,
pQInfo
);
qDebug
(
"qmsg:%p QInfo:
0x%"
PRIx
64
"-%p created"
,
pQueryMsg
,
pQInfo
->
qId
,
pQInfo
);
return
pQInfo
;
_cleanup_qinfo:
...
...
@@ -6734,7 +6734,7 @@ int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQInfo *p
if
((
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
skey
>
pQuery
->
window
.
ekey
))
||
(
!
QUERY_IS_ASC_QUERY
(
pQuery
)
&&
(
pQuery
->
window
.
ekey
>
pQuery
->
window
.
skey
)))
{
qDebug
(
"QInfo:
%"
PRIu
64
" no result in time range %"
PRId64
"-%"
PRId64
", order %d"
,
pQInfo
->
qId
,
pQuery
->
window
.
skey
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" no result in time range %"
PRId64
"-%"
PRId64
", order %d"
,
pQInfo
->
qId
,
pQuery
->
window
.
skey
,
pQuery
->
window
.
ekey
,
pQuery
->
order
.
order
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
=
0
;
...
...
@@ -6743,7 +6743,7 @@ int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQInfo *p
}
if
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
==
0
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" no table qualified for tag filter, abort query"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" no table qualified for tag filter, abort query"
,
pQInfo
->
qId
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -6824,7 +6824,7 @@ void freeQInfo(SQInfo *pQInfo) {
return
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" start to free QInfo"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" start to free QInfo"
,
pQInfo
->
qId
);
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
releaseQueryBuf
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
);
...
...
@@ -6875,7 +6875,7 @@ void freeQInfo(SQInfo *pQInfo) {
taosArrayDestroy
(
pRuntimeEnv
->
groupResInfo
.
pRows
);
pQInfo
->
signature
=
0
;
qDebug
(
"QInfo:
%"
PRIu
64
" QInfo is freed"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" QInfo is freed"
,
pQInfo
->
qId
);
tfree
(
pQInfo
);
}
...
...
@@ -6895,7 +6895,7 @@ int32_t doDumpQueryResult(SQInfo *pQInfo, char *data) {
off_t
s
=
lseek
(
fileno
(
f
),
0
,
SEEK_END
);
assert
(
s
==
pRuntimeEnv
->
outputBuf
->
info
.
rows
);
qDebug
(
"QInfo:
%"
PRIu
64
" ts comp data return, file:%p, size:%"
PRId64
,
pQInfo
->
qId
,
f
,
(
uint64_t
)
s
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" ts comp data return, file:%p, size:%"
PRId64
,
pQInfo
->
qId
,
f
,
(
uint64_t
)
s
);
if
(
fseek
(
f
,
0
,
SEEK_SET
)
>=
0
)
{
size_t
sz
=
fread
(
data
,
1
,
s
,
f
);
if
(
sz
<
s
)
{
// todo handle error
...
...
@@ -6927,11 +6927,11 @@ int32_t doDumpQueryResult(SQInfo *pQInfo, char *data) {
}
pRuntimeEnv
->
resultInfo
.
total
+=
pRuntimeEnv
->
outputBuf
->
info
.
rows
;
qDebug
(
"QInfo:
%"
PRIu
64
" current numOfRes rows:%d, total:%"
PRId64
,
pQInfo
->
qId
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" current numOfRes rows:%d, total:%"
PRId64
,
pQInfo
->
qId
,
pRuntimeEnv
->
outputBuf
->
info
.
rows
,
pRuntimeEnv
->
resultInfo
.
total
);
if
(
pQuery
->
limit
.
limit
>
0
&&
pQuery
->
limit
.
limit
==
pRuntimeEnv
->
resultInfo
.
total
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" results limitation reached, limitation:%"
PRId64
,
pQInfo
->
qId
,
pQuery
->
limit
.
limit
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" results limitation reached, limitation:%"
PRId64
,
pQInfo
->
qId
,
pQuery
->
limit
.
limit
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_OVER
);
}
...
...
src/query/src/queryMain.c
浏览文件 @
f6296b06
...
...
@@ -205,7 +205,7 @@ bool qTableQuery(qinfo_t qinfo, uint64_t *qId) {
int64_t
curOwner
=
0
;
if
((
curOwner
=
atomic_val_compare_exchange_64
(
&
pQInfo
->
owner
,
0
,
threadId
))
!=
0
)
{
qError
(
"QInfo:
%"
PRIu
64
"-%p qhandle is now executed by thread:%p"
,
pQInfo
->
qId
,
pQInfo
,
(
void
*
)
curOwner
);
qError
(
"QInfo:
0x%"
PRIx
64
"-%p qhandle is now executed by thread:%p"
,
pQInfo
->
qId
,
pQInfo
,
(
void
*
)
curOwner
);
pQInfo
->
code
=
TSDB_CODE_QRY_IN_EXEC
;
return
false
;
}
...
...
@@ -215,13 +215,13 @@ bool qTableQuery(qinfo_t qinfo, uint64_t *qId) {
pQInfo
->
startExecTs
=
taosGetTimestampSec
();
if
(
isQueryKilled
(
pQInfo
))
{
qDebug
(
"QInfo:
%"
PRIu
64
" it is already killed, abort"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" it is already killed, abort"
,
pQInfo
->
qId
);
return
doBuildResCheck
(
pQInfo
);
}
SQueryRuntimeEnv
*
pRuntimeEnv
=
&
pQInfo
->
runtimeEnv
;
if
(
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
==
0
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" no table exists for query, abort"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" no table exists for query, abort"
,
pQInfo
->
qId
);
setQueryStatus
(
pRuntimeEnv
,
QUERY_COMPLETED
);
return
doBuildResCheck
(
pQInfo
);
}
...
...
@@ -230,21 +230,21 @@ bool qTableQuery(qinfo_t qinfo, uint64_t *qId) {
int32_t
ret
=
setjmp
(
pQInfo
->
runtimeEnv
.
env
);
if
(
ret
!=
TSDB_CODE_SUCCESS
)
{
pQInfo
->
code
=
ret
;
qDebug
(
"QInfo:
%"
PRIu
64
" query abort due to error/cancel occurs, code:%s"
,
pQInfo
->
qId
,
tstrerror
(
pQInfo
->
code
));
qDebug
(
"QInfo:
0x%"
PRIx
64
" query abort due to error/cancel occurs, code:%s"
,
pQInfo
->
qId
,
tstrerror
(
pQInfo
->
code
));
return
doBuildResCheck
(
pQInfo
);
}
qDebug
(
"QInfo:
%"
PRIu
64
" query task is launched"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" query task is launched"
,
pQInfo
->
qId
);
pRuntimeEnv
->
outputBuf
=
pRuntimeEnv
->
proot
->
exec
(
pRuntimeEnv
->
proot
);
if
(
isQueryKilled
(
pQInfo
))
{
qDebug
(
"QInfo:
%"
PRIu
64
" query is killed"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" query is killed"
,
pQInfo
->
qId
);
}
else
if
(
GET_NUM_OF_RESULTS
(
pRuntimeEnv
)
==
0
)
{
qDebug
(
"QInfo:
%"
PRIu
64
" over, %u tables queried, %"
PRId64
" rows are returned"
,
pQInfo
->
qId
,
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" over, %u tables queried, %"
PRId64
" rows are returned"
,
pQInfo
->
qId
,
pRuntimeEnv
->
tableqinfoGroupInfo
.
numOfTables
,
pRuntimeEnv
->
resultInfo
.
total
);
}
else
{
qDebug
(
"QInfo:
%"
PRIu
64
" query paused, %d rows returned, numOfTotal:%"
PRId64
" rows"
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" query paused, %d rows returned, numOfTotal:%"
PRId64
" rows"
,
pQInfo
->
qId
,
GET_NUM_OF_RESULTS
(
pRuntimeEnv
),
pRuntimeEnv
->
resultInfo
.
total
+
GET_NUM_OF_RESULTS
(
pRuntimeEnv
));
}
...
...
@@ -255,13 +255,13 @@ int32_t qRetrieveQueryResultInfo(qinfo_t qinfo, bool* buildRes, void* pRspContex
SQInfo
*
pQInfo
=
(
SQInfo
*
)
qinfo
;
if
(
pQInfo
==
NULL
||
!
isValidQInfo
(
pQInfo
))
{
qError
(
"QInfo:
%"
PRIu
64
" invalid qhandle"
,
pQInfo
->
qId
);
qError
(
"QInfo:
0x%"
PRIx
64
" invalid qhandle"
,
pQInfo
->
qId
);
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
*
buildRes
=
false
;
if
(
IS_QUERY_KILLED
(
pQInfo
))
{
qDebug
(
"QInfo:
%"
PRIu
64
" query is killed, code:0x%08x"
,
pQInfo
->
qId
,
pQInfo
->
code
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" query is killed, code:0x%08x"
,
pQInfo
->
qId
,
pQInfo
->
code
);
return
pQInfo
->
code
;
}
...
...
@@ -281,11 +281,11 @@ int32_t qRetrieveQueryResultInfo(qinfo_t qinfo, bool* buildRes, void* pRspContex
assert
(
pQInfo
->
rspContext
==
NULL
);
if
(
pQInfo
->
dataReady
==
QUERY_RESULT_READY
)
{
*
buildRes
=
true
;
qDebug
(
"QInfo:
%"
PRIu
64
" retrieve result info, rowsize:%d, rows:%d, code:%s"
,
pQInfo
->
qId
,
pQuery
->
resultRowSize
,
qDebug
(
"QInfo:
0x%"
PRIx
64
" retrieve result info, rowsize:%d, rows:%d, code:%s"
,
pQInfo
->
qId
,
pQuery
->
resultRowSize
,
GET_NUM_OF_RESULTS
(
pRuntimeEnv
),
tstrerror
(
pQInfo
->
code
));
}
else
{
*
buildRes
=
false
;
qDebug
(
"QInfo:
%"
PRIu
64
" retrieve req set query return result after paused"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" retrieve req set query return result after paused"
,
pQInfo
->
qId
);
pQInfo
->
rspContext
=
pRspContext
;
assert
(
pQInfo
->
rspContext
!=
NULL
);
}
...
...
@@ -344,10 +344,10 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
// here current thread hold the refcount, so it is safe to free tsdbQueryHandle.
*
continueExec
=
false
;
(
*
pRsp
)
->
completed
=
1
;
// notify no more result to client
qDebug
(
"QInfo:
%"
PRIu
64
" no more results to retrieve"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" no more results to retrieve"
,
pQInfo
->
qId
);
}
else
{
*
continueExec
=
true
;
qDebug
(
"QInfo:
%"
PRIu
64
" has more results to retrieve"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" has more results to retrieve"
,
pQInfo
->
qId
);
}
// the memory should be freed if the code of pQInfo is not TSDB_CODE_SUCCESS
...
...
@@ -373,7 +373,7 @@ int32_t qKillQuery(qinfo_t qinfo) {
return
TSDB_CODE_QRY_INVALID_QHANDLE
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" query killed"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" query killed"
,
pQInfo
->
qId
);
setQueryKilled
(
pQInfo
);
// Wait for the query executing thread being stopped/
...
...
@@ -401,7 +401,7 @@ void qDestroyQueryInfo(qinfo_t qHandle) {
return
;
}
qDebug
(
"QInfo:
%"
PRIu
64
" query completed"
,
pQInfo
->
qId
);
qDebug
(
"QInfo:
0x%"
PRIx
64
" query completed"
,
pQInfo
->
qId
);
queryCostStatis
(
pQInfo
);
// print the query cost summary
freeQInfo
(
pQInfo
);
}
...
...
@@ -484,7 +484,7 @@ void** qRegisterQInfo(void* pMgmt, uint64_t qId, void *qInfo) {
SQueryMgmt
*
pQueryMgmt
=
pMgmt
;
if
(
pQueryMgmt
->
qinfoPool
==
NULL
)
{
qError
(
"QInfo:
%"
PRIu
64
"-%p failed to add qhandle into qMgmt, since qMgmt is closed"
,
qId
,
(
void
*
)
qInfo
);
qError
(
"QInfo:
0x%"
PRIx
64
"-%p failed to add qhandle into qMgmt, since qMgmt is closed"
,
qId
,
(
void
*
)
qInfo
);
terrno
=
TSDB_CODE_VND_INVALID_VGROUP_ID
;
return
NULL
;
}
...
...
@@ -492,7 +492,7 @@ void** qRegisterQInfo(void* pMgmt, uint64_t qId, void *qInfo) {
pthread_mutex_lock
(
&
pQueryMgmt
->
lock
);
if
(
pQueryMgmt
->
closed
)
{
pthread_mutex_unlock
(
&
pQueryMgmt
->
lock
);
qError
(
"QInfo:
%"
PRIu
64
"-%p failed to add qhandle into cache, since qMgmt is colsing"
,
qId
,
(
void
*
)
qInfo
);
qError
(
"QInfo:
0x%"
PRIx
64
"-%p failed to add qhandle into cache, since qMgmt is colsing"
,
qId
,
(
void
*
)
qInfo
);
terrno
=
TSDB_CODE_VND_INVALID_VGROUP_ID
;
return
NULL
;
}
else
{
...
...
src/tsdb/src/tsdbRead.c
浏览文件 @
f6296b06
...
...
@@ -286,7 +286,7 @@ static SArray* createCheckInfoFromTableGroup(STsdbQueryHandle* pQueryHandle, STa
}
taosArrayPush
(
pTableCheckInfo
,
&
info
);
tsdbDebug
(
"%p check table uid:%"
PRId64
", tid:%d from lastKey:%"
PRId64
"
%"
PRIu
64
,
pQueryHandle
,
info
.
tableId
.
uid
,
tsdbDebug
(
"%p check table uid:%"
PRId64
", tid:%d from lastKey:%"
PRId64
"
0x%"
PRIx
64
,
pQueryHandle
,
info
.
tableId
.
uid
,
info
.
tableId
.
tid
,
info
.
lastKey
,
pQueryHandle
->
qId
);
}
}
...
...
@@ -440,7 +440,7 @@ TsdbQueryHandleT* tsdbQueryTables(STsdbRepo* tsdb, STsdbQueryCond* pCond, STable
tsdbMayTakeMemSnapshot
(
pQueryHandle
,
psTable
);
tsdbDebug
(
"%p total numOfTable:%"
PRIzu
" in query,
%"
PRIu
64
,
pQueryHandle
,
taosArrayGetSize
(
pQueryHandle
->
pTableCheckInfo
),
pQueryHandle
->
qId
);
tsdbDebug
(
"%p total numOfTable:%"
PRIzu
" in query,
0x%"
PRIx
64
,
pQueryHandle
,
taosArrayGetSize
(
pQueryHandle
->
pTableCheckInfo
),
pQueryHandle
->
qId
);
return
(
TsdbQueryHandleT
)
pQueryHandle
;
}
...
...
@@ -651,7 +651,7 @@ static bool initTableMemIterator(STsdbQueryHandle* pHandle, STableCheckInfo* pCh
SDataRow
row
=
(
SDataRow
)
SL_GET_NODE_DATA
(
node
);
TSKEY
key
=
dataRowKey
(
row
);
// first timestamp in buffer
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d check data in mem from skey:%"
PRId64
", order:%d, ts range in buf:%"
PRId64
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
%"
PRIu
64
,
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
0x%"
PRIx
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
key
,
order
,
pMem
->
keyFirst
,
pMem
->
keyLast
,
pCheckInfo
->
lastKey
,
pMem
->
numOfRows
,
pHandle
->
qId
);
...
...
@@ -662,7 +662,7 @@ static bool initTableMemIterator(STsdbQueryHandle* pHandle, STableCheckInfo* pCh
}
}
else
{
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d no data in mem,
%"
PRIu
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d no data in mem,
0x%"
PRIx
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
pHandle
->
qId
);
}
...
...
@@ -673,7 +673,7 @@ static bool initTableMemIterator(STsdbQueryHandle* pHandle, STableCheckInfo* pCh
SDataRow
row
=
(
SDataRow
)
SL_GET_NODE_DATA
(
node
);
TSKEY
key
=
dataRowKey
(
row
);
// first timestamp in buffer
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d check data in imem from skey:%"
PRId64
", order:%d, ts range in buf:%"
PRId64
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
%"
PRIu
64
,
"-%"
PRId64
", lastKey:%"
PRId64
", numOfRows:%"
PRId64
",
0x%"
PRIx
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
key
,
order
,
pIMem
->
keyFirst
,
pIMem
->
keyLast
,
pCheckInfo
->
lastKey
,
pIMem
->
numOfRows
,
pHandle
->
qId
);
...
...
@@ -683,7 +683,7 @@ static bool initTableMemIterator(STsdbQueryHandle* pHandle, STableCheckInfo* pCh
assert
(
pCheckInfo
->
lastKey
>=
key
);
}
}
else
{
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d no data in imem,
%"
PRIu
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d no data in imem,
0x%"
PRIx
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
pHandle
->
qId
);
}
...
...
@@ -811,7 +811,7 @@ static bool hasMoreDataInCache(STsdbQueryHandle* pHandle) {
}
pCheckInfo
->
lastKey
=
dataRowKey
(
row
);
// first timestamp in buffer
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d check data in buffer from skey:%"
PRId64
", order:%d,
%"
PRIu
64
,
pHandle
,
tsdbDebug
(
"%p uid:%"
PRId64
", tid:%d check data in buffer from skey:%"
PRId64
", order:%d,
0x%"
PRIx
64
,
pHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
pCheckInfo
->
lastKey
,
pHandle
->
order
,
pHandle
->
qId
);
// all data in mem are checked already.
...
...
@@ -986,21 +986,21 @@ static int32_t doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SBlock* pBloc
STSchema
*
pSchema
=
tsdbGetTableSchema
(
pCheckInfo
->
pTableObj
);
int32_t
code
=
tdInitDataCols
(
pQueryHandle
->
pDataCols
,
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tsdbError
(
"%p failed to malloc buf for pDataCols,
%"
PRIu
64
,
pQueryHandle
,
pQueryHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for pDataCols,
0x%"
PRIx
64
,
pQueryHandle
,
pQueryHandle
->
qId
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_error
;
}
code
=
tdInitDataCols
(
pQueryHandle
->
rhelper
.
pDCols
[
0
],
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[0],
%"
PRIu
64
,
pQueryHandle
,
pQueryHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[0],
0x%"
PRIx
64
,
pQueryHandle
,
pQueryHandle
->
qId
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_error
;
}
code
=
tdInitDataCols
(
pQueryHandle
->
rhelper
.
pDCols
[
1
],
pSchema
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[1],
%"
PRIu
64
,
pQueryHandle
,
pQueryHandle
->
qId
);
tsdbError
(
"%p failed to malloc buf for rhelper.pDataCols[1],
0x%"
PRIx
64
,
pQueryHandle
,
pQueryHandle
->
qId
);
terrno
=
TSDB_CODE_TDB_OUT_OF_MEMORY
;
goto
_error
;
}
...
...
@@ -1036,14 +1036,14 @@ static int32_t doLoadFileDataBlock(STsdbQueryHandle* pQueryHandle, SBlock* pBloc
int64_t
elapsedTime
=
(
taosGetTimestampUs
()
-
st
);
pQueryHandle
->
cost
.
blockLoadTime
+=
elapsedTime
;
tsdbDebug
(
"%p load file block into buffer, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d, elapsed time:%"
PRId64
" us,
%"
PRIu
64
,
tsdbDebug
(
"%p load file block into buffer, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d, elapsed time:%"
PRId64
" us,
0x%"
PRIx
64
,
pQueryHandle
,
slotIndex
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfRows
,
elapsedTime
,
pQueryHandle
->
qId
);
return
TSDB_CODE_SUCCESS
;
_error:
pBlock
->
numOfRows
=
0
;
tsdbError
(
"%p error occurs in loading file block, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d,
%"
PRIu
64
,
tsdbError
(
"%p error occurs in loading file block, index:%d, brange:%"
PRId64
"-%"
PRId64
", rows:%d,
0x%"
PRIx
64
,
pQueryHandle
,
slotIndex
,
pBlock
->
keyFirst
,
pBlock
->
keyLast
,
pBlock
->
numOfRows
,
pQueryHandle
->
qId
);
return
terrno
;
}
...
...
@@ -1066,7 +1066,7 @@ static int32_t handleDataMergeIfNeeded(STsdbQueryHandle* pQueryHandle, SBlock* p
assert
(
cur
->
pos
>=
0
&&
cur
->
pos
<=
binfo
.
rows
);
TSKEY
key
=
(
row
!=
NULL
)
?
dataRowKey
(
row
)
:
TSKEY_INITIAL_VAL
;
tsdbDebug
(
"%p key in mem:%"
PRId64
",
%"
PRIu
64
,
pQueryHandle
,
key
,
pQueryHandle
->
qId
);
tsdbDebug
(
"%p key in mem:%"
PRId64
",
0x%"
PRIx
64
,
pQueryHandle
,
key
,
pQueryHandle
->
qId
);
if
((
ASCENDING_TRAVERSE
(
pQueryHandle
->
order
)
&&
(
key
!=
TSKEY_INITIAL_VAL
&&
key
<=
binfo
.
window
.
ekey
))
||
(
!
ASCENDING_TRAVERSE
(
pQueryHandle
->
order
)
&&
(
key
!=
TSKEY_INITIAL_VAL
&&
key
>=
binfo
.
window
.
skey
)))
{
...
...
@@ -1551,7 +1551,7 @@ static void copyAllRemainRowsFromFileBlock(STsdbQueryHandle* pQueryHandle, STabl
updateInfoAfterMerge
(
pQueryHandle
,
pCheckInfo
,
numOfRows
,
pos
);
doCheckGeneratedBlockRange
(
pQueryHandle
);
tsdbDebug
(
"%p uid:%"
PRIu64
",tid:%d data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
%"
PRIu
64
,
tsdbDebug
(
"%p uid:%"
PRIu64
",tid:%d data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
0x%"
PRIx
64
,
pQueryHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
cur
->
mixBlock
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
pQueryHandle
->
qId
);
}
...
...
@@ -1605,7 +1605,7 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo*
int32_t
endPos
=
getEndPosInDataBlock
(
pQueryHandle
,
&
blockInfo
);
tsdbDebug
(
"%p uid:%"
PRIu64
",tid:%d start merge data block, file block range:%"
PRIu64
"-%"
PRIu64
" rows:%d, start:%d,"
"end:%d,
%"
PRIu
64
,
"end:%d,
0x%"
PRIx
64
,
pQueryHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
blockInfo
.
window
.
skey
,
blockInfo
.
window
.
ekey
,
blockInfo
.
rows
,
cur
->
pos
,
endPos
,
pQueryHandle
->
qId
);
...
...
@@ -1747,7 +1747,7 @@ static void doMergeTwoLevelData(STsdbQueryHandle* pQueryHandle, STableCheckInfo*
updateInfoAfterMerge
(
pQueryHandle
,
pCheckInfo
,
numOfRows
,
pos
);
doCheckGeneratedBlockRange
(
pQueryHandle
);
tsdbDebug
(
"%p uid:%"
PRIu64
",tid:%d data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
%"
PRIu
64
,
tsdbDebug
(
"%p uid:%"
PRIu64
",tid:%d data block created, mixblock:%d, brange:%"
PRIu64
"-%"
PRIu64
" rows:%d,
0x%"
PRIx
64
,
pQueryHandle
,
pCheckInfo
->
tableId
.
uid
,
pCheckInfo
->
tableId
.
tid
,
cur
->
mixBlock
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
cur
->
rows
,
pQueryHandle
->
qId
);
}
...
...
@@ -1923,12 +1923,12 @@ static int32_t createDataBlocksInfo(STsdbQueryHandle* pQueryHandle, int32_t numO
memcpy
(
pQueryHandle
->
pDataBlockInfo
,
sup
.
pDataBlockInfo
[
0
],
sizeof
(
STableBlockInfo
)
*
numOfBlocks
);
cleanBlockOrderSupporter
(
&
sup
,
numOfQualTables
);
tsdbDebug
(
"%p create data blocks info struct completed for 1 table, %d blocks not sorted
%"
PRIu
64
,
pQueryHandle
,
cnt
,
tsdbDebug
(
"%p create data blocks info struct completed for 1 table, %d blocks not sorted
0x%"
PRIx
64
,
pQueryHandle
,
cnt
,
pQueryHandle
->
qId
);
return
TSDB_CODE_SUCCESS
;
}
tsdbDebug
(
"%p create data blocks info struct completed, %d blocks in %d tables
%"
PRIu
64
,
pQueryHandle
,
cnt
,
tsdbDebug
(
"%p create data blocks info struct completed, %d blocks in %d tables
0x%"
PRIx
64
,
pQueryHandle
,
cnt
,
numOfQualTables
,
pQueryHandle
->
qId
);
assert
(
cnt
<=
numOfBlocks
&&
numOfQualTables
<=
numOfTables
);
// the pTableQueryInfo[j]->numOfBlocks may be 0
...
...
@@ -1965,7 +1965,7 @@ static int32_t createDataBlocksInfo(STsdbQueryHandle* pQueryHandle, int32_t numO
* }
*/
tsdbDebug
(
"%p %d data blocks sort completed,
%"
PRIu
64
,
pQueryHandle
,
cnt
,
pQueryHandle
->
qId
);
tsdbDebug
(
"%p %d data blocks sort completed,
0x%"
PRIx
64
,
pQueryHandle
,
cnt
,
pQueryHandle
->
qId
);
cleanBlockOrderSupporter
(
&
sup
,
numOfTables
);
free
(
pTree
);
...
...
@@ -2023,7 +2023,7 @@ static int32_t getFirstFileDataBlock(STsdbQueryHandle* pQueryHandle, bool* exist
if
((
ASCENDING_TRAVERSE
(
pQueryHandle
->
order
)
&&
win
.
skey
>
pQueryHandle
->
window
.
ekey
)
||
(
!
ASCENDING_TRAVERSE
(
pQueryHandle
->
order
)
&&
win
.
ekey
<
pQueryHandle
->
window
.
ekey
))
{
tsdbUnLockFS
(
REPO_FS
(
pQueryHandle
->
pTsdb
));
tsdbDebug
(
"%p remain files are not qualified for qrange:%"
PRId64
"-%"
PRId64
", ignore,
%"
PRIu
64
,
pQueryHandle
,
tsdbDebug
(
"%p remain files are not qualified for qrange:%"
PRId64
"-%"
PRId64
", ignore,
0x%"
PRIx
64
,
pQueryHandle
,
pQueryHandle
->
window
.
skey
,
pQueryHandle
->
window
.
ekey
,
pQueryHandle
->
qId
);
pQueryHandle
->
pFileGroup
=
NULL
;
assert
(
pQueryHandle
->
numOfBlocks
==
0
);
...
...
@@ -2047,7 +2047,7 @@ static int32_t getFirstFileDataBlock(STsdbQueryHandle* pQueryHandle, bool* exist
break
;
}
tsdbDebug
(
"%p %d blocks found in file for %d table(s), fid:%d,
%"
PRIu
64
,
pQueryHandle
,
numOfBlocks
,
numOfTables
,
tsdbDebug
(
"%p %d blocks found in file for %d table(s), fid:%d,
0x%"
PRIx
64
,
pQueryHandle
,
numOfBlocks
,
numOfTables
,
pQueryHandle
->
pFileGroup
->
fid
,
pQueryHandle
->
qId
);
assert
(
numOfBlocks
>=
0
);
...
...
@@ -2139,7 +2139,7 @@ int32_t tsdbGetFileBlocksDistInfo(TsdbQueryHandleT* queryHandle, STableBlockDist
if
((
ASCENDING_TRAVERSE
(
pQueryHandle
->
order
)
&&
win
.
skey
>
pQueryHandle
->
window
.
ekey
)
||
(
!
ASCENDING_TRAVERSE
(
pQueryHandle
->
order
)
&&
win
.
ekey
<
pQueryHandle
->
window
.
ekey
))
{
tsdbUnLockFS
(
REPO_FS
(
pQueryHandle
->
pTsdb
));
tsdbDebug
(
"%p remain files are not qualified for qrange:%"
PRId64
"-%"
PRId64
", ignore,
%"
PRIu
64
,
pQueryHandle
,
tsdbDebug
(
"%p remain files are not qualified for qrange:%"
PRId64
"-%"
PRId64
", ignore,
0x%"
PRIx
64
,
pQueryHandle
,
pQueryHandle
->
window
.
skey
,
pQueryHandle
->
window
.
ekey
,
pQueryHandle
->
qId
);
pQueryHandle
->
pFileGroup
=
NULL
;
break
;
...
...
@@ -2163,7 +2163,7 @@ int32_t tsdbGetFileBlocksDistInfo(TsdbQueryHandleT* queryHandle, STableBlockDist
break
;
}
tsdbDebug
(
"%p %d blocks found in file for %d table(s), fid:%d,
%"
PRIu
64
,
pQueryHandle
,
numOfBlocks
,
numOfTables
,
tsdbDebug
(
"%p %d blocks found in file for %d table(s), fid:%d,
0x%"
PRIx
64
,
pQueryHandle
,
numOfBlocks
,
numOfTables
,
pQueryHandle
->
pFileGroup
->
fid
,
pQueryHandle
->
qId
);
if
(
numOfBlocks
==
0
)
{
...
...
@@ -2211,7 +2211,7 @@ static int32_t getDataBlocksInFiles(STsdbQueryHandle* pQueryHandle, bool* exists
if
((
!
cur
->
mixBlock
)
||
cur
->
blockCompleted
)
{
// all data blocks in current file has been checked already, try next file if exists
}
else
{
tsdbDebug
(
"%p continue in current data block, index:%d, pos:%d,
%"
PRIu
64
,
pQueryHandle
,
cur
->
slot
,
cur
->
pos
,
tsdbDebug
(
"%p continue in current data block, index:%d, pos:%d,
0x%"
PRIx
64
,
pQueryHandle
,
cur
->
slot
,
cur
->
pos
,
pQueryHandle
->
qId
);
int32_t
code
=
handleDataMergeIfNeeded
(
pQueryHandle
,
pBlockInfo
->
compBlock
,
pCheckInfo
);
*
exists
=
(
pQueryHandle
->
realNumOfRows
>
0
);
...
...
@@ -2340,7 +2340,7 @@ static int tsdbReadRowsFromCache(STableCheckInfo* pCheckInfo, TSKEY maxKey, int
}
int64_t
elapsedTime
=
taosGetTimestampUs
()
-
st
;
tsdbDebug
(
"%p build data block from cache completed, elapsed time:%"
PRId64
" us, numOfRows:%d, numOfCols:%d,
%"
PRIu
64
,
pQueryHandle
,
tsdbDebug
(
"%p build data block from cache completed, elapsed time:%"
PRId64
" us, numOfRows:%d, numOfCols:%d,
0x%"
PRIx
64
,
pQueryHandle
,
elapsedTime
,
numOfRows
,
numOfCols
,
pQueryHandle
->
qId
);
return
numOfRows
;
...
...
@@ -3396,7 +3396,7 @@ void tsdbCleanupQueryHandle(TsdbQueryHandleT queryHandle) {
pQueryHandle
->
next
=
doFreeColumnInfoData
(
pQueryHandle
->
next
);
SIOCostSummary
*
pCost
=
&
pQueryHandle
->
cost
;
tsdbDebug
(
"%p :io-cost summary: statis-info:%"
PRId64
" us, datablock:%"
PRId64
" us, check data:%"
PRId64
" us,
%"
PRIu
64
,
tsdbDebug
(
"%p :io-cost summary: statis-info:%"
PRId64
" us, datablock:%"
PRId64
" us, check data:%"
PRId64
" us,
0x%"
PRIx
64
,
pQueryHandle
,
pCost
->
statisInfoLoadTime
,
pCost
->
blockLoadTime
,
pCost
->
checkForNextTime
,
pQueryHandle
->
qId
);
tfree
(
pQueryHandle
);
...
...
src/vnode/src/vnodeRead.c
浏览文件 @
f6296b06
...
...
@@ -183,7 +183,7 @@ static int32_t vnodeDumpQueryResult(SRspRet *pRet, void *pVnode, uint64_t qId, v
}
}
else
{
*
freeHandle
=
true
;
vTrace
(
"QInfo:
%"
PRIu
64
"-%p exec completed, free handle:%d"
,
qId
,
*
handle
,
*
freeHandle
);
vTrace
(
"QInfo:
0x%"
PRIx
64
"-%p exec completed, free handle:%d"
,
qId
,
*
handle
,
*
freeHandle
);
}
}
else
{
SRetrieveTableRsp
*
pRsp
=
(
SRetrieveTableRsp
*
)
rpcMallocCont
(
sizeof
(
SRetrieveTableRsp
));
...
...
@@ -244,7 +244,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) {
if
(
handle
==
NULL
)
{
// failed to register qhandle
pRsp
->
code
=
terrno
;
terrno
=
0
;
vError
(
"vgId:%d, QInfo:
%"
PRIu
64
"-%p register qhandle failed, return to app, code:%s"
,
pVnode
->
vgId
,
qId
,
(
void
*
)
pQInfo
,
vError
(
"vgId:%d, QInfo:
0x%"
PRIx
64
"-%p register qhandle failed, return to app, code:%s"
,
pVnode
->
vgId
,
qId
,
(
void
*
)
pQInfo
,
tstrerror
(
pRsp
->
code
));
qDestroyQueryInfo
(
pQInfo
);
// destroy it directly
return
pRsp
->
code
;
...
...
@@ -255,7 +255,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) {
if
(
handle
!=
NULL
&&
vnodeNotifyCurrentQhandle
(
pRead
->
rpcHandle
,
qId
,
*
handle
,
pVnode
->
vgId
)
!=
TSDB_CODE_SUCCESS
)
{
vError
(
"vgId:%d, QInfo:
%"
PRIu
64
"-%p, query discarded since link is broken, %p"
,
pVnode
->
vgId
,
qId
,
*
handle
,
vError
(
"vgId:%d, QInfo:
0x%"
PRIx
64
"-%p, query discarded since link is broken, %p"
,
pVnode
->
vgId
,
qId
,
*
handle
,
pRead
->
rpcHandle
);
pRsp
->
code
=
TSDB_CODE_RPC_NETWORK_UNAVAIL
;
qReleaseQInfo
(
pVnode
->
qMgmt
,
(
void
**
)
&
handle
,
true
);
...
...
@@ -266,7 +266,7 @@ static int32_t vnodeProcessQueryMsg(SVnodeObj *pVnode, SVReadMsg *pRead) {
}
if
(
handle
!=
NULL
)
{
vTrace
(
"vgId:%d, QInfo:
%"
PRIu
64
"-%p, dnode query msg disposed, create qhandle and returns to app"
,
vgId
,
qId
,
*
handle
);
vTrace
(
"vgId:%d, QInfo:
0x%"
PRIx
64
"-%p, dnode query msg disposed, create qhandle and returns to app"
,
vgId
,
qId
,
*
handle
);
code
=
vnodePutItemIntoReadQueue
(
pVnode
,
handle
,
pRead
->
rpcHandle
);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
pRsp
->
code
=
code
;
...
...
@@ -414,7 +414,7 @@ int32_t vnodeNotifyCurrentQhandle(void *handle, uint64_t qId, void *qhandle, int
pMsg
->
header
.
vgId
=
htonl
(
vgId
);
pMsg
->
header
.
contLen
=
htonl
(
sizeof
(
SRetrieveTableMsg
));
vTrace
(
"QInfo:
%"
PRIu
64
"-%p register qhandle to connect:%p"
,
qId
,
qhandle
,
handle
);
vTrace
(
"QInfo:
0x%"
PRIx
64
"-%p register qhandle to connect:%p"
,
qId
,
qhandle
,
handle
);
return
rpcReportProgress
(
handle
,
(
char
*
)
pMsg
,
sizeof
(
SRetrieveTableMsg
));
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录