Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
20085fea
T
TDengine
项目概览
taosdata
/
TDengine
大约 2 年 前同步成功
通知
1192
Star
22018
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
提交
20085fea
编写于
4月 25, 2022
作者:
C
Cary Xu
浏览文件
操作
浏览文件
下载
差异文件
Merge branch '3.0' into feature/TD-14481-3.0
上级
6f292094
9122fb07
变更
88
展开全部
隐藏空白更改
内联
并排
Showing
88 changed file
with
2157 addition
and
1253 deletion
+2157
-1253
CMakeLists.txt
CMakeLists.txt
+1
-1
Jenkinsfile
Jenkinsfile
+1
-1
Jenkinsfile2
Jenkinsfile2
+1
-1
contrib/CMakeLists.txt
contrib/CMakeLists.txt
+5
-90
contrib/test/craft/CMakeLists.txt
contrib/test/craft/CMakeLists.txt
+1
-8
contrib/test/tdev/src/main.c
contrib/test/tdev/src/main.c
+38
-34
example/src/tmq.c
example/src/tmq.c
+6
-2
examples/c/CMakeLists.txt
examples/c/CMakeLists.txt
+2
-2
include/common/tdatablock.h
include/common/tdatablock.h
+11
-2
include/common/tglobal.h
include/common/tglobal.h
+3
-3
include/common/tmsg.h
include/common/tmsg.h
+10
-12
include/libs/catalog/catalog.h
include/libs/catalog/catalog.h
+1
-1
include/libs/function/function.h
include/libs/function/function.h
+26
-9
include/libs/wal/wal.h
include/libs/wal/wal.h
+7
-1
include/util/taoserror.h
include/util/taoserror.h
+1
-1
include/util/tconfig.h
include/util/tconfig.h
+4
-1
include/util/tenv.h
include/util/tenv.h
+33
-0
include/util/tjson.h
include/util/tjson.h
+3
-0
source/client/src/clientEnv.c
source/client/src/clientEnv.c
+2
-2
source/client/src/clientImpl.c
source/client/src/clientImpl.c
+15
-4
source/client/src/clientMsgHandler.c
source/client/src/clientMsgHandler.c
+19
-11
source/client/src/tmq.c
source/client/src/tmq.c
+7
-5
source/common/src/tdatablock.c
source/common/src/tdatablock.c
+2
-3
source/common/src/tglobal.c
source/common/src/tglobal.c
+15
-8
source/common/src/tmsg.c
source/common/src/tmsg.c
+14
-16
source/dnode/mgmt/exe/dmMain.c
source/dnode/mgmt/exe/dmMain.c
+22
-4
source/dnode/mgmt/implement/src/dmHandle.c
source/dnode/mgmt/implement/src/dmHandle.c
+18
-6
source/dnode/mgmt/interface/src/dmFile.c
source/dnode/mgmt/interface/src/dmFile.c
+1
-1
source/dnode/mgmt/interface/src/dmInt.c
source/dnode/mgmt/interface/src/dmInt.c
+6
-2
source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
+1
-0
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
+6
-1
source/dnode/mnode/impl/inc/mndDef.h
source/dnode/mnode/impl/inc/mndDef.h
+0
-2
source/dnode/mnode/impl/src/mndDef.c
source/dnode/mnode/impl/src/mndDef.c
+0
-3
source/dnode/mnode/impl/src/mndFunc.c
source/dnode/mnode/impl/src/mndFunc.c
+4
-4
source/dnode/mnode/impl/src/mndInfoSchema.c
source/dnode/mnode/impl/src/mndInfoSchema.c
+3
-3
source/dnode/mnode/impl/src/mndPerfSchema.c
source/dnode/mnode/impl/src/mndPerfSchema.c
+1
-1
source/dnode/mnode/impl/src/mndQnode.c
source/dnode/mnode/impl/src/mndQnode.c
+3
-2
source/dnode/mnode/impl/src/mndShow.c
source/dnode/mnode/impl/src/mndShow.c
+9
-4
source/dnode/mnode/impl/src/mndSubscribe.c
source/dnode/mnode/impl/src/mndSubscribe.c
+2
-177
source/dnode/mnode/impl/src/mndTopic.c
source/dnode/mnode/impl/src/mndTopic.c
+10
-11
source/dnode/mnode/impl/test/func/func.cpp
source/dnode/mnode/impl/test/func/func.cpp
+77
-11
source/dnode/qnode/src/qnode.c
source/dnode/qnode/src/qnode.c
+6
-1
source/dnode/vnode/src/inc/tq.h
source/dnode/vnode/src/inc/tq.h
+0
-1
source/dnode/vnode/src/tq/tq.c
source/dnode/vnode/src/tq/tq.c
+33
-3
source/dnode/vnode/src/tsdb/tsdbRead.c
source/dnode/vnode/src/tsdb/tsdbRead.c
+7
-2
source/dnode/vnode/src/vnd/vnodeSvr.c
source/dnode/vnode/src/vnd/vnodeSvr.c
+1
-1
source/libs/catalog/src/catalog.c
source/libs/catalog/src/catalog.c
+5
-4
source/libs/command/src/explain.c
source/libs/command/src/explain.c
+23
-19
source/libs/executor/inc/executil.h
source/libs/executor/inc/executil.h
+7
-4
source/libs/executor/inc/executorimpl.h
source/libs/executor/inc/executorimpl.h
+10
-11
source/libs/executor/src/dataDispatcher.c
source/libs/executor/src/dataDispatcher.c
+4
-4
source/libs/executor/src/executil.c
source/libs/executor/src/executil.c
+40
-2
source/libs/executor/src/executorimpl.c
source/libs/executor/src/executorimpl.c
+95
-300
source/libs/executor/src/groupoperator.c
source/libs/executor/src/groupoperator.c
+1
-1
source/libs/executor/src/scanoperator.c
source/libs/executor/src/scanoperator.c
+175
-23
source/libs/function/inc/builtinsimpl.h
source/libs/function/inc/builtinsimpl.h
+5
-5
source/libs/function/inc/tudf.h
source/libs/function/inc/tudf.h
+6
-15
source/libs/function/inc/tudfInt.h
source/libs/function/inc/tudfInt.h
+1
-1
source/libs/function/src/builtinsimpl.c
source/libs/function/src/builtinsimpl.c
+178
-54
source/libs/function/src/tudf.c
source/libs/function/src/tudf.c
+93
-68
source/libs/function/src/udfd.c
source/libs/function/src/udfd.c
+77
-30
source/libs/function/test/runUdf.c
source/libs/function/test/runUdf.c
+70
-47
source/libs/parser/src/parTranslater.c
source/libs/parser/src/parTranslater.c
+73
-58
source/libs/qcom/src/querymsg.c
source/libs/qcom/src/querymsg.c
+4
-12
source/libs/qworker/src/qworkerMsg.c
source/libs/qworker/src/qworkerMsg.c
+8
-8
source/libs/scalar/inc/sclInt.h
source/libs/scalar/inc/sclInt.h
+3
-0
source/libs/scalar/src/scalar.c
source/libs/scalar/src/scalar.c
+120
-38
source/libs/scalar/src/sclfunc.c
source/libs/scalar/src/sclfunc.c
+4
-1
source/libs/scalar/test/scalar/scalarTests.cpp
source/libs/scalar/test/scalar/scalarTests.cpp
+116
-0
source/libs/sync/CMakeLists.txt
source/libs/sync/CMakeLists.txt
+1
-1
source/libs/sync/test/CMakeLists.txt
source/libs/sync/test/CMakeLists.txt
+39
-39
source/libs/wal/src/walRead.c
source/libs/wal/src/walRead.c
+87
-0
source/libs/wal/src/walWrite.c
source/libs/wal/src/walWrite.c
+3
-5
source/util/src/tarray.c
source/util/src/tarray.c
+1
-0
source/util/src/tconfig.c
source/util/src/tconfig.c
+344
-7
source/util/src/tenv.c
source/util/src/tenv.c
+78
-0
source/util/src/terror.c
source/util/src/terror.c
+1
-1
source/util/src/tjson.c
source/util/src/tjson.c
+19
-1
source/util/test/CMakeLists.txt
source/util/test/CMakeLists.txt
+1
-1
source/util/test/cfgTest.cpp
source/util/test/cfgTest.cpp
+1
-0
tests/script/sh/massiveTable/compileVersion.sh
tests/script/sh/massiveTable/compileVersion.sh
+2
-16
tests/script/tsim/parser/groupby-basic.sim
tests/script/tsim/parser/groupby-basic.sim
+9
-9
tests/script/tsim/stable/disk.sim
tests/script/tsim/stable/disk.sim
+1
-0
tests/system-test/2-query/cast.py
tests/system-test/2-query/cast.py
+3
-3
tests/system-test/fulltest.sh
tests/system-test/fulltest.sh
+1
-1
tests/tsim/src/simSystem.c
tests/tsim/src/simSystem.c
+2
-2
tools/shell/CMakeLists.txt
tools/shell/CMakeLists.txt
+1
-1
tools/shell/src/shellNettest.c
tools/shell/src/shellNettest.c
+7
-3
未找到文件。
CMakeLists.txt
浏览文件 @
20085fea
...
...
@@ -7,7 +7,7 @@ project(
)
if
(
NOT DEFINED TD_SOURCE_DIR
)
set
(
TD_SOURCE_DIR
${
CMAKE
_SOURCE_DIR
}
)
set
(
TD_SOURCE_DIR
${
PROJECT
_SOURCE_DIR
}
)
endif
()
set
(
TD_SUPPORT_DIR
"
${
TD_SOURCE_DIR
}
/cmake"
)
...
...
Jenkinsfile
浏览文件 @
20085fea
...
...
@@ -113,7 +113,7 @@ pipeline {
'''
sh
'''
cd ${WKC}/debug
ctest
ctest
-VV
'''
}
}
...
...
Jenkinsfile2
浏览文件 @
20085fea
...
...
@@ -121,7 +121,7 @@ pipeline {
pre_test()
sh'''
cd ${WKC}/debug
ctest
ctest
-VV
'''
sh'''
export LD_LIBRARY_PATH=${WKC}/debug/build/lib
...
...
contrib/CMakeLists.txt
浏览文件 @
20085fea
...
...
@@ -14,24 +14,9 @@ if(${BUILD_PTHREAD})
cat
(
"
${
TD_SUPPORT_DIR
}
/pthread_CMakeLists.txt.in"
${
CONTRIB_TMP_FILE
}
)
endif
()
# iconv
if
(
${
BUILD_WITH_ICONV
}
)
cat
(
"
${
TD_SUPPORT_DIR
}
/iconv_CMakeLists.txt.in"
${
CONTRIB_TMP_FILE
}
)
endif
()
# msvc regex
if
(
${
BUILD_MSVCREGEX
}
)
cat
(
"
${
TD_SUPPORT_DIR
}
/msvcregex_CMakeLists.txt.in"
${
CONTRIB_TMP_FILE
}
)
endif
()
# wcwidth
if
(
${
BUILD_WCWIDTH
}
)
cat
(
"
${
TD_SUPPORT_DIR
}
/wcwidth_CMakeLists.txt.in"
${
CONTRIB_TMP_FILE
}
)
endif
()
# wingetopt
if
(
${
BUILD_WINGETOPT
}
)
cat
(
"
${
TD_SUPPORT_DIR
}
/wingetopt_CMakeLists.txt.in"
${
CONTRIB_TMP_FILE
}
)
# gnu regex
if
(
${
BUILD_GNUREGEX
}
)
cat
(
"
${
TD_SUPPORT_DIR
}
/gnuregex_CMakeLists.txt.in"
${
CONTRIB_TMP_FILE
}
)
endif
()
# googletest
...
...
@@ -114,27 +99,8 @@ if(${BUILD_TEST})
target_include_directories
(
gtest
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/cpp-stub/src>
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/cpp-stub/src_linux>
)
if
(
${
TD_WINDOWS
}
)
target_include_directories
(
gtest
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/cpp-stub/src_win>
)
endif
(
${
TD_WINDOWS
}
)
if
(
${
TD_LINUX
}
)
target_include_directories
(
gtest
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/cpp-stub/src_linux>
)
endif
(
${
TD_LINUX
}
)
if
(
${
TD_DARWIN
}
)
target_include_directories
(
gtest
PUBLIC $<BUILD_INTERFACE:
${
CMAKE_CURRENT_SOURCE_DIR
}
/cpp-stub/src_darwin>
)
endif
(
${
TD_DARWIN
}
)
endif
(
${
BUILD_TEST
}
)
# cJson
...
...
@@ -216,53 +182,6 @@ if(${BUILD_WITH_NURAFT})
add_subdirectory
(
nuraft
)
endif
(
${
BUILD_WITH_NURAFT
}
)
# pthread
if
(
${
BUILD_PTHREAD
}
)
set
(
CMAKE_BUILD_TYPE release
)
add_definitions
(
-DPTW32_STATIC_LIB
)
add_subdirectory
(
pthread
)
set_target_properties
(
libpthreadVC3 PROPERTIES OUTPUT_NAME pthread
)
add_library
(
pthread STATIC IMPORTED GLOBAL
)
SET_PROPERTY
(
TARGET pthread PROPERTY IMPORTED_LOCATION
${
LIBRARY_OUTPUT_PATH
}
/pthread.lib
)
endif
()
# iconv
if
(
${
BUILD_WITH_ICONV
}
)
add_subdirectory
(
iconv
)
endif
(
${
BUILD_WITH_ICONV
}
)
# wingetopt
if
(
${
BUILD_WINGETOPT
}
)
add_subdirectory
(
wingetopt
)
endif
(
${
BUILD_WINGETOPT
}
)
# msvcregex
if
(
${
BUILD_MSVCREGEX
}
)
add_library
(
msvcregex STATIC
""
)
target_sources
(
msvcregex
PRIVATE
"msvcregex/regex.c"
)
target_include_directories
(
msvcregex
PRIVATE
"msvcregex"
)
target_link_libraries
(
msvcregex
INTERFACE Shell32
)
SET_TARGET_PROPERTIES
(
msvcregex PROPERTIES OUTPUT_NAME msvcregex
)
endif
(
${
BUILD_MSVCREGEX
}
)
# msvcregex
if
(
${
BUILD_WCWIDTH
}
)
add_library
(
wcwidth STATIC
""
)
target_sources
(
wcwidth
PRIVATE
"wcwidth/wcwidth.c"
)
target_include_directories
(
wcwidth
PRIVATE
"wcwidth"
)
SET_TARGET_PROPERTIES
(
wcwidth PROPERTIES OUTPUT_NAME wcwidth
)
endif
(
${
BUILD_WCWIDTH
}
)
# CRAFT
if
(
${
BUILD_WITH_CRAFT
}
)
add_library
(
craft STATIC IMPORTED GLOBAL
)
...
...
@@ -319,12 +238,8 @@ if(${BUILD_WITH_SQLITE})
target_link_libraries
(
sqlite
INTERFACE m
INTERFACE pthread
INTERFACE dl
)
if
(
NOT TD_WINDOWS
)
target_link_libraries
(
sqlite
INTERFACE dl
)
endif
(
NOT TD_WINDOWS
)
endif
(
${
BUILD_WITH_SQLITE
}
)
# pthread
...
...
contrib/test/craft/CMakeLists.txt
浏览文件 @
20085fea
add_executable
(
simulate_vnode
"simulate_vnode.c"
)
target_link_libraries
(
simulate_vnode PUBLIC craft lz4 uv_a
)
if
(
${
BUILD_WINGETOPT
}
)
target_link_libraries
(
simulate_vnode PUBLIC wingetopt
)
target_include_directories
(
simulate_vnode
PUBLIC
"
${
TD_SOURCE_DIR
}
/contrib/wingetopt/src"
)
endif
()
\ No newline at end of file
target_link_libraries
(
simulate_vnode PUBLIC craft lz4 uv_a
)
\ No newline at end of file
contrib/test/tdev/src/main.c
浏览文件 @
20085fea
...
...
@@ -6,39 +6,43 @@
#define POINTER_SHIFT(ptr, s) ((void *)(((char *)ptr) + (s)))
#define POINTER_DISTANCE(pa, pb) ((char *)(pb) - (char *)(pa))
static
inline
void
tPutA
(
void
**
buf
,
uint64_t
val
)
{
memcpy
(
buf
,
&
val
,
sizeof
(
val
));
*
buf
=
POINTER_SHIFT
(
buf
,
sizeof
(
val
));
}
#define tPutA(buf, val) \
({ \
memcpy(buf, &val, sizeof(val)); \
POINTER_SHIFT(buf, sizeof(val)); \
})
static
inline
void
tPutB
(
void
**
buf
,
uint64_t
val
)
{
((
uint8_t
*
)
buf
)[
7
]
=
((
val
)
>>
56
)
&
0xff
;
((
uint8_t
*
)
buf
)[
6
]
=
((
val
)
>>
48
)
&
0xff
;
((
uint8_t
*
)
buf
)[
5
]
=
((
val
)
>>
40
)
&
0xff
;
((
uint8_t
*
)
buf
)[
4
]
=
((
val
)
>>
32
)
&
0xff
;
((
uint8_t
*
)
buf
)[
3
]
=
((
val
)
>>
24
)
&
0xff
;
((
uint8_t
*
)
buf
)[
2
]
=
((
val
)
>>
16
)
&
0xff
;
((
uint8_t
*
)
buf
)[
1
]
=
((
val
)
>>
8
)
&
0xff
;
((
uint8_t
*
)
buf
)[
0
]
=
(
val
)
&
0xff
;
*
buf
=
POINTER_SHIFT
(
buf
,
sizeof
(
val
));
}
#define tPutB(buf, val) \
({ \
((uint8_t *)buf)[7] = ((val) >> 56) & 0xff; \
((uint8_t *)buf)[6] = ((val) >> 48) & 0xff; \
((uint8_t *)buf)[5] = ((val) >> 40) & 0xff; \
((uint8_t *)buf)[4] = ((val) >> 32) & 0xff; \
((uint8_t *)buf)[3] = ((val) >> 24) & 0xff; \
((uint8_t *)buf)[2] = ((val) >> 16) & 0xff; \
((uint8_t *)buf)[1] = ((val) >> 8) & 0xff; \
((uint8_t *)buf)[0] = (val)&0xff; \
POINTER_SHIFT(buf, sizeof(val)); \
})
static
inline
void
tPutC
(
void
**
buf
,
uint64_t
val
)
{
if
(
buf
)
{
((
uint64_t
*
)
buf
)[
0
]
=
(
val
);
POINTER_SHIFT
(
buf
,
sizeof
(
val
));
}
*
buf
=
NULL
;
}
#define tPutC(buf, val) \
({ \
if (buf) { \
((uint64_t *)buf)[0] = (val); \
POINTER_SHIFT(buf, sizeof(val)); \
} \
NULL; \
})
static
inline
void
tPutD
(
void
**
buf
,
uint64_t
val
)
{
uint64_t
tmp
=
val
;
for
(
size_t
i
=
0
;
i
<
sizeof
(
val
);
i
++
)
{
((
uint8_t
*
)
buf
)[
i
]
=
tmp
&
0xff
;
tmp
>>=
8
;
}
*
buf
=
POINTER_SHIFT
(
buf
,
sizeof
(
val
));
}
#define tPutD(buf, val) \
({ \
uint64_t tmp = val; \
for (size_t i = 0; i < sizeof(val); i++) { \
((uint8_t *)buf)[i] = tmp & 0xff; \
tmp >>= 8; \
} \
POINTER_SHIFT(buf, sizeof(val)); \
})
static
inline
void
tPutE
(
void
**
buf
,
uint64_t
val
)
{
if
(
buf
)
{
...
...
@@ -57,7 +61,7 @@ static void func(T t) {
switch
(
t
)
{
case
A
:
for
(
size_t
i
=
0
;
i
<
10
*
1024l
*
1024l
*
1024l
;
i
++
)
{
tPutA
(
pBuf
,
val
);
pBuf
=
tPutA
(
pBuf
,
val
);
if
(
POINTER_DISTANCE
(
buf
,
pBuf
)
==
1024
)
{
pBuf
=
buf
;
}
...
...
@@ -65,7 +69,7 @@ static void func(T t) {
break
;
case
B
:
for
(
size_t
i
=
0
;
i
<
10
*
1024l
*
1024l
*
1024l
;
i
++
)
{
tPutB
(
pBuf
,
val
);
pBuf
=
tPutB
(
pBuf
,
val
);
if
(
POINTER_DISTANCE
(
buf
,
pBuf
)
==
1024
)
{
pBuf
=
buf
;
}
...
...
@@ -73,7 +77,7 @@ static void func(T t) {
break
;
case
C
:
for
(
size_t
i
=
0
;
i
<
10
*
1024l
*
1024l
*
1024l
;
i
++
)
{
tPutC
(
pBuf
,
val
);
pBuf
=
tPutC
(
pBuf
,
val
);
if
(
POINTER_DISTANCE
(
buf
,
pBuf
)
==
1024
)
{
pBuf
=
buf
;
}
...
...
@@ -81,7 +85,7 @@ static void func(T t) {
break
;
case
D
:
for
(
size_t
i
=
0
;
i
<
10
*
1024l
*
1024l
*
1024l
;
i
++
)
{
tPutD
(
pBuf
,
val
);
pBuf
=
tPutD
(
pBuf
,
val
);
if
(
POINTER_DISTANCE
(
buf
,
pBuf
)
==
1024
)
{
pBuf
=
buf
;
}
...
...
example/src/tmq.c
浏览文件 @
20085fea
...
...
@@ -17,6 +17,7 @@
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "taos.h"
static
int
running
=
1
;
...
...
@@ -47,6 +48,7 @@ int32_t init_env() {
return
-
1
;
}
taos_free_result
(
pRes
);
sleep
(
1
);
pRes
=
taos_query
(
pConn
,
"use abc1"
);
if
(
taos_errno
(
pRes
)
!=
0
)
{
...
...
@@ -58,6 +60,7 @@ int32_t init_env() {
pRes
=
taos_query
(
pConn
,
"create stable if not exists st1 (ts timestamp, c1 int, c2 float, c3 binary(10)) tags(t1 int)"
);
if
(
taos_errno
(
pRes
)
!=
0
)
{
assert
(
0
);
printf
(
"failed to create super table st1, reason:%s
\n
"
,
taos_errstr
(
pRes
));
return
-
1
;
}
...
...
@@ -265,10 +268,11 @@ void perf_loop(tmq_t* tmq, tmq_list_t* topics) {
}
int
main
(
int
argc
,
char
*
argv
[])
{
int
code
;
if
(
argc
>
1
)
{
printf
(
"env init
\n
"
);
code
=
init_env
();
if
(
init_env
()
<
0
)
{
return
-
1
;
}
create_topic
();
}
tmq_t
*
tmq
=
build_consumer
();
...
...
examples/c/CMakeLists.txt
浏览文件 @
20085fea
PROJECT
(
TDengine
)
IF
(
TD_LINUX
)
INCLUDE_DIRECTORIES
(
.
${
TD_
COMMUNITY_DIR
}
/src/inc
${
TD_COMMUNITY_DIR
}
/src/client/inc
${
TD_COMMUNITY
_DIR
}
/inc
)
INCLUDE_DIRECTORIES
(
.
${
TD_
SOURCE_DIR
}
/src/inc
${
TD_SOURCE_DIR
}
/src/client/inc
${
TD_SOURCE
_DIR
}
/inc
)
AUX_SOURCE_DIRECTORY
(
. SRC
)
ADD_EXECUTABLE
(
demo apitest.c
)
TARGET_LINK_LIBRARIES
(
demo taos_static trpc tutil pthread
)
...
...
@@ -13,7 +13,7 @@ IF (TD_LINUX)
TARGET_LINK_LIBRARIES
(
epoll taos_static trpc tutil pthread lua
)
ENDIF
()
IF
(
TD_DARWIN
)
INCLUDE_DIRECTORIES
(
.
${
TD_
COMMUNITY_DIR
}
/src/inc
${
TD_COMMUNITY_DIR
}
/src/client/inc
${
TD_COMMUNITY
_DIR
}
/inc
)
INCLUDE_DIRECTORIES
(
.
${
TD_
SOURCE_DIR
}
/src/inc
${
TD_SOURCE_DIR
}
/src/client/inc
${
TD_SOURCE
_DIR
}
/inc
)
AUX_SOURCE_DIRECTORY
(
. SRC
)
ADD_EXECUTABLE
(
demo demo.c
)
TARGET_LINK_LIBRARIES
(
demo taos_static trpc tutil pthread lua
)
...
...
include/common/tdatablock.h
浏览文件 @
20085fea
...
...
@@ -238,10 +238,16 @@ static FORCE_INLINE int32_t blockCompressColData(SColumnInfoData* pColRes, int32
static
FORCE_INLINE
void
blockCompressEncode
(
const
SSDataBlock
*
pBlock
,
char
*
data
,
int32_t
*
dataLen
,
int32_t
numOfCols
,
int8_t
needCompress
)
{
int32_t
*
colSizes
=
(
int32_t
*
)
data
;
int32_t
*
actualLen
=
(
int32_t
*
)
data
;
data
+=
sizeof
(
int32_t
);
uint64_t
*
groupId
=
(
uint64_t
*
)
data
;
data
+=
sizeof
(
uint64_t
);
int32_t
*
colSizes
=
(
int32_t
*
)
data
;
data
+=
numOfCols
*
sizeof
(
int32_t
);
*
dataLen
=
(
numOfCols
*
sizeof
(
int32_t
));
*
dataLen
=
(
numOfCols
*
sizeof
(
int32_t
)
+
sizeof
(
uint64_t
)
+
sizeof
(
int32_t
));
int32_t
numOfRows
=
pBlock
->
info
.
rows
;
for
(
int32_t
col
=
0
;
col
<
numOfCols
;
++
col
)
{
...
...
@@ -273,6 +279,9 @@ static FORCE_INLINE void blockCompressEncode(const SSDataBlock* pBlock, char* da
colSizes
[
col
]
=
htonl
(
colSizes
[
col
]);
}
*
actualLen
=
*
dataLen
;
*
groupId
=
pBlock
->
info
.
groupId
;
}
#ifdef __cplusplus
...
...
include/common/tglobal.h
浏览文件 @
20085fea
...
...
@@ -123,9 +123,9 @@ extern SDiskCfg tsDiskCfg[];
#define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize)
int32_t
taosCreateLog
(
const
char
*
logname
,
int32_t
logFileNum
,
const
char
*
cfgDir
,
const
char
*
envFile
,
c
onst
c
har
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
);
int32_t
taosInitCfg
(
const
char
*
cfgDir
,
const
char
*
envFile
,
const
char
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
);
int32_t
taosCreateLog
(
const
char
*
logname
,
int32_t
logFileNum
,
const
char
*
cfgDir
,
const
char
*
*
envCmd
,
const
char
*
envFile
,
char
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
);
int32_t
taosInitCfg
(
const
char
*
cfgDir
,
const
char
*
*
envCmd
,
const
char
*
envFile
,
char
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
);
void
taosCleanupCfg
();
void
taosCfgDynamicOptions
(
const
char
*
option
,
const
char
*
value
);
void
taosAddDataDir
(
int32_t
index
,
char
*
v1
,
int32_t
level
,
int32_t
primary
);
...
...
include/common/tmsg.h
浏览文件 @
20085fea
...
...
@@ -1331,7 +1331,6 @@ typedef struct {
}
SMqConsumerLostMsg
;
typedef
struct
{
int32_t
topicNum
;
int64_t
consumerId
;
char
cgroup
[
TSDB_CGROUP_LEN
];
SArray
*
topicNames
;
// SArray<char*>
...
...
@@ -1339,22 +1338,27 @@ typedef struct {
static
FORCE_INLINE
int32_t
tSerializeSCMSubscribeReq
(
void
**
buf
,
const
SCMSubscribeReq
*
pReq
)
{
int32_t
tlen
=
0
;
tlen
+=
taosEncodeFixedI32
(
buf
,
pReq
->
topicNum
);
tlen
+=
taosEncodeFixedI64
(
buf
,
pReq
->
consumerId
);
tlen
+=
taosEncodeString
(
buf
,
pReq
->
cgroup
);
for
(
int32_t
i
=
0
;
i
<
pReq
->
topicNum
;
i
++
)
{
int32_t
topicNum
=
taosArrayGetSize
(
pReq
->
topicNames
);
tlen
+=
taosEncodeFixedI32
(
buf
,
topicNum
);
for
(
int32_t
i
=
0
;
i
<
topicNum
;
i
++
)
{
tlen
+=
taosEncodeString
(
buf
,
(
char
*
)
taosArrayGetP
(
pReq
->
topicNames
,
i
));
}
return
tlen
;
}
static
FORCE_INLINE
void
*
tDeserializeSCMSubscribeReq
(
void
*
buf
,
SCMSubscribeReq
*
pReq
)
{
buf
=
taosDecodeFixedI32
(
buf
,
&
pReq
->
topicNum
);
buf
=
taosDecodeFixedI64
(
buf
,
&
pReq
->
consumerId
);
buf
=
taosDecodeStringTo
(
buf
,
pReq
->
cgroup
);
pReq
->
topicNames
=
taosArrayInit
(
pReq
->
topicNum
,
sizeof
(
void
*
));
for
(
int32_t
i
=
0
;
i
<
pReq
->
topicNum
;
i
++
)
{
int32_t
topicNum
;
buf
=
taosDecodeFixedI32
(
buf
,
&
topicNum
);
pReq
->
topicNames
=
taosArrayInit
(
topicNum
,
sizeof
(
void
*
));
for
(
int32_t
i
=
0
;
i
<
topicNum
;
i
++
)
{
char
*
name
;
buf
=
taosDecodeString
(
buf
,
&
name
);
taosArrayPush
(
pReq
->
topicNames
,
&
name
);
...
...
@@ -1986,7 +1990,6 @@ typedef struct {
int8_t
withTbName
;
int8_t
withSchema
;
int8_t
withTag
;
int8_t
withTagSchema
;
char
*
qmsg
;
}
SMqRebVgReq
;
...
...
@@ -2001,7 +2004,6 @@ static FORCE_INLINE int32_t tEncodeSMqRebVgReq(void** buf, const SMqRebVgReq* pR
tlen
+=
taosEncodeFixedI8
(
buf
,
pReq
->
withTbName
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pReq
->
withSchema
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pReq
->
withTag
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pReq
->
withTagSchema
);
if
(
pReq
->
subType
==
TOPIC_SUB_TYPE__TABLE
)
{
tlen
+=
taosEncodeString
(
buf
,
pReq
->
qmsg
);
}
...
...
@@ -2018,7 +2020,6 @@ static FORCE_INLINE void* tDecodeSMqRebVgReq(const void* buf, SMqRebVgReq* pReq)
buf
=
taosDecodeFixedI8
(
buf
,
&
pReq
->
withTbName
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pReq
->
withSchema
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pReq
->
withTag
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pReq
->
withTagSchema
);
if
(
pReq
->
subType
==
TOPIC_SUB_TYPE__TABLE
)
{
buf
=
taosDecodeString
(
buf
,
&
pReq
->
qmsg
);
}
...
...
@@ -2607,7 +2608,6 @@ typedef struct {
int8_t
withTbName
;
int8_t
withSchema
;
int8_t
withTag
;
int8_t
withTagSchema
;
SArray
*
blockDataLen
;
// SArray<int32_t>
SArray
*
blockData
;
// SArray<SRetrieveTableRsp*>
SArray
*
blockTbName
;
// SArray<char*>
...
...
@@ -2626,7 +2626,6 @@ static FORCE_INLINE int32_t tEncodeSMqDataBlkRsp(void** buf, const SMqDataBlkRsp
tlen
+=
taosEncodeFixedI8
(
buf
,
pRsp
->
withTbName
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pRsp
->
withSchema
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pRsp
->
withTag
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pRsp
->
withTagSchema
);
for
(
int32_t
i
=
0
;
i
<
pRsp
->
blockNum
;
i
++
)
{
int32_t
bLen
=
*
(
int32_t
*
)
taosArrayGet
(
pRsp
->
blockDataLen
,
i
);
...
...
@@ -2649,7 +2648,6 @@ static FORCE_INLINE void* tDecodeSMqDataBlkRsp(const void* buf, SMqDataBlkRsp* p
buf
=
taosDecodeFixedI8
(
buf
,
&
pRsp
->
withTbName
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pRsp
->
withSchema
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pRsp
->
withTag
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pRsp
->
withTagSchema
);
for
(
int32_t
i
=
0
;
i
<
pRsp
->
blockNum
;
i
++
)
{
int32_t
bLen
=
0
;
...
...
include/libs/catalog/catalog.h
浏览文件 @
20085fea
...
...
@@ -51,7 +51,7 @@ typedef struct SMetaData {
SArray
*
pTableMeta
;
// STableMeta array
SArray
*
pVgroupInfo
;
// SVgroupInfo list
SArray
*
pUdfList
;
// udf info list
SArray
*
p
EpSetList
;
// qnode epset list, SArray<SEpSet
>
SArray
*
p
QnodeList
;
// qnode list, SArray<SQueryNodeAddr
>
}
SMetaData
;
typedef
struct
SCatalogCfg
{
...
...
include/libs/function/function.h
浏览文件 @
20085fea
...
...
@@ -37,7 +37,7 @@ typedef struct SFuncExecEnv {
typedef
bool
(
*
FExecGetEnv
)(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
typedef
bool
(
*
FExecInit
)(
struct
SqlFunctionCtx
*
pCtx
,
struct
SResultRowEntryInfo
*
pResultCellInfo
);
typedef
int32_t
(
*
FExecProcess
)(
struct
SqlFunctionCtx
*
pCtx
);
typedef
int32_t
(
*
FExecFinalize
)(
struct
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
);
typedef
int32_t
(
*
FExecFinalize
)(
struct
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
typedef
int32_t
(
*
FScalarExecProcess
)(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
);
typedef
struct
SScalarFuncExecFuncs
{
...
...
@@ -141,8 +141,7 @@ struct SResultRowEntryInfo;
//for selectivity query, the corresponding tag value is assigned if the data is qualified
typedef
struct
SSubsidiaryResInfo
{
int16_t
bufLen
;
// keep the tags data for top/bottom query result
int16_t
numOfCols
;
int16_t
num
;
struct
SqlFunctionCtx
**
pCtx
;
}
SSubsidiaryResInfo
;
...
...
@@ -187,8 +186,8 @@ typedef struct SqlFunctionCtx {
uint8_t
currentStage
;
// record current running step, default: 0
bool
isAggSet
;
int64_t
startTs
;
// timestamp range of current query when function is executed on a specific data block, TODO remove it
/////////////////////////////////////////////////////////////////
bool
stableQuery
;
/////////////////////////////////////////////////////////////////
int16_t
functionId
;
// function id
char
*
pOutput
;
// final result output buffer, point to sdata->data
int32_t
numOfParams
;
...
...
@@ -198,11 +197,15 @@ typedef struct SqlFunctionCtx {
int32_t
offset
;
SVariant
tag
;
struct
SResultRowEntryInfo
*
resultInfo
;
SSubsidiaryResInfo
subsidiaryRes
;
SPoint1
start
;
SPoint1
end
;
SFuncExecFuncs
fpSet
;
SScalarFuncExecFuncs
sfp
;
SSubsidiaryResInfo
subsidiaries
;
SPoint1
start
;
SPoint1
end
;
SFuncExecFuncs
fpSet
;
SScalarFuncExecFuncs
sfp
;
SExprInfo
*
pExpr
;
struct
SDiskbasedBuf
*
pBuf
;
struct
SSDataBlock
*
pSrcBlock
;
int32_t
curBufPage
;
}
SqlFunctionCtx
;
enum
{
...
...
@@ -319,6 +322,20 @@ struct SUdfInfo;
void
qAddUdfInfo
(
uint64_t
id
,
struct
SUdfInfo
*
pUdfInfo
);
void
qRemoveUdfInfo
(
uint64_t
id
,
struct
SUdfInfo
*
pUdfInfo
);
/**
* create udfd proxy, called once in process that call setupUdf/callUdfxxx/teardownUdf
* @return error code
*/
int32_t
udfcOpen
();
/**
* destroy udfd proxy
* @return error code
*/
int32_t
udfcClose
();
typedef
void
*
UdfcFuncHandle
;
#ifdef __cplusplus
}
#endif
...
...
include/libs/wal/wal.h
浏览文件 @
20085fea
...
...
@@ -192,7 +192,13 @@ int32_t walEndSnapshot(SWal *);
SWalReadHandle
*
walOpenReadHandle
(
SWal
*
);
void
walCloseReadHandle
(
SWalReadHandle
*
);
int32_t
walReadWithHandle
(
SWalReadHandle
*
pRead
,
int64_t
ver
);
int32_t
walReadWithHandle_s
(
SWalReadHandle
*
pRead
,
int64_t
ver
,
SWalReadHead
**
ppHead
);
// only for tq usage
// int32_t walReadWithHandle_s(SWalReadHandle *pRead, int64_t ver, SWalReadHead **ppHead);
void
walSetReaderCapacity
(
SWalReadHandle
*
pRead
,
int32_t
capacity
);
int32_t
walFetchHead
(
SWalReadHandle
*
pRead
,
int64_t
ver
,
SWalHead
*
pHead
);
int32_t
walFetchBody
(
SWalReadHandle
*
pRead
,
SWalHead
**
ppHead
);
int32_t
walSkipFetchBody
(
SWalReadHandle
*
pRead
,
const
SWalHead
*
pHead
);
// deprecated
#if 0
...
...
include/util/taoserror.h
浏览文件 @
20085fea
...
...
@@ -252,7 +252,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_MND_COLUMN_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x03AE)
// mnode-infoSchema
#define TSDB_CODE_MND_INVALID_
INFOS_TBL
TAOS_DEF_ERROR_CODE(0, 0x03B0)
#define TSDB_CODE_MND_INVALID_
SYS_TABLENAME
TAOS_DEF_ERROR_CODE(0, 0x03B0)
// mnode-func
#define TSDB_CODE_MND_FUNC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x03C0)
...
...
include/util/tconfig.h
浏览文件 @
20085fea
...
...
@@ -30,6 +30,7 @@ typedef enum {
CFG_STYPE_CFG_FILE
,
CFG_STYPE_ENV_FILE
,
CFG_STYPE_ENV_VAR
,
CFG_STYPE_ENV_CMD
,
CFG_STYPE_APOLLO_URL
,
CFG_STYPE_ARG_LIST
,
CFG_STYPE_TAOS_OPTIONS
...
...
@@ -82,7 +83,7 @@ typedef struct SConfig {
}
SConfig
;
SConfig
*
cfgInit
();
int32_t
cfgLoad
(
SConfig
*
pCfg
,
ECfgSrcType
cfgType
,
const
char
*
sourceStr
);
int32_t
cfgLoad
(
SConfig
*
pCfg
,
ECfgSrcType
cfgType
,
const
void
*
sourceStr
);
int32_t
cfgLoadFromArray
(
SConfig
*
pCfg
,
SArray
*
pArgs
);
// SConfigPair
void
cfgCleanup
(
SConfig
*
pCfg
);
...
...
@@ -105,6 +106,8 @@ const char *cfgDtypeStr(ECfgDataType type);
void
cfgDumpCfg
(
SConfig
*
pCfg
,
bool
tsc
,
bool
dump
);
int32_t
cfgGetApollUrl
(
const
char
**
envCmd
,
const
char
*
envFile
,
char
*
apolloUrl
);
#ifdef __cplusplus
}
#endif
...
...
include/util/tenv.h
0 → 100644
浏览文件 @
20085fea
/*
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
*
* This program is free software: you can use, redistribute, and/or modify
* it under the terms of the GNU Affero General Public License, version 3
* or later ("AGPL"), as published by the Free Software Foundation.
*
* This program is distributed in the hope that it will be useful, but WITHOUT
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
* FITNESS FOR A PARTICULAR PURPOSE.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef _TD_ENV_H_
#define _TD_ENV_H_
#include "os.h"
#ifdef __cplusplus
extern
"C"
{
#endif
int32_t
taosEnvNameToCfgName
(
const
char
*
envNameStr
,
char
*
cfgNameStr
,
int32_t
cfgNameMaxLen
);
int32_t
taosEnvToCfg
(
const
char
*
envStr
,
char
*
cfgStr
);
#ifdef __cplusplus
}
#endif
#endif
/*_TD_ENV_H_*/
include/util/tjson.h
浏览文件 @
20085fea
...
...
@@ -49,6 +49,8 @@ int32_t tjsonAddItemToObject(SJson* pJson, const char* pName, SJson* pItem);
int32_t
tjsonAddItemToArray
(
SJson
*
pJson
,
SJson
*
pItem
);
SJson
*
tjsonGetObjectItem
(
const
SJson
*
pJson
,
const
char
*
pName
);
int32_t
tjsonGetObjectName
(
const
SJson
*
pJson
,
char
**
pName
);
int32_t
tjsonGetObjectValueString
(
const
SJson
*
pJson
,
char
**
pStringValue
);
int32_t
tjsonGetStringValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
char
*
pVal
);
int32_t
tjsonDupStringValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
char
**
pVal
);
int32_t
tjsonGetBigIntValue
(
const
SJson
*
pJson
,
const
char
*
pName
,
int64_t
*
pVal
);
...
...
@@ -81,6 +83,7 @@ char* tjsonToUnformattedString(const SJson* pJson);
SJson
*
tjsonParse
(
const
char
*
pStr
);
bool
tjsonValidateJson
(
const
char
*
pJson
);
const
char
*
tjsonGetError
();
#ifdef __cplusplus
}
...
...
source/client/src/clientEnv.c
浏览文件 @
20085fea
...
...
@@ -254,12 +254,12 @@ void taos_init_imp(void) {
deltaToUtcInitOnce
();
if
(
taosCreateLog
(
"taoslog"
,
10
,
configDir
,
NULL
,
NULL
,
NULL
,
1
)
!=
0
)
{
if
(
taosCreateLog
(
"taoslog"
,
10
,
configDir
,
NULL
,
NULL
,
NULL
,
NULL
,
1
)
!=
0
)
{
tscInitRes
=
-
1
;
return
;
}
if
(
taosInitCfg
(
configDir
,
NULL
,
NULL
,
NULL
,
1
)
!=
0
)
{
if
(
taosInitCfg
(
configDir
,
NULL
,
NULL
,
NULL
,
NULL
,
1
)
!=
0
)
{
tscInitRes
=
-
1
;
return
;
}
...
...
source/client/src/clientImpl.c
浏览文件 @
20085fea
...
...
@@ -105,9 +105,9 @@ TAOS* taos_connect_internal(const char* ip, const char* user, const char* pass,
epSet
.
epSet
.
eps
[
0
].
port
=
port
;
}
char
*
key
=
getClusterKey
(
user
,
secretEncrypt
,
ip
,
port
);
SAppInstInfo
**
pInst
=
NULL
;
char
*
key
=
getClusterKey
(
user
,
secretEncrypt
,
ip
,
port
);
SAppInstInfo
**
pInst
=
NULL
;
taosThreadMutexLock
(
&
appInfo
.
mutex
);
pInst
=
taosHashGet
(
appInfo
.
pInstMap
,
key
,
strlen
(
key
));
...
...
@@ -840,10 +840,21 @@ int32_t setResultDataPtr(SReqResultInfo* pResultInfo, TAOS_FIELD* pFields, int32
return
code
;
}
int32_t
*
colLength
=
(
int32_t
*
)
pResultInfo
->
pData
;
char
*
pStart
=
((
char
*
)
pResultInfo
->
pData
)
+
sizeof
(
int32_t
)
*
numOfCols
;
char
*
p
=
(
char
*
)
pResultInfo
->
pData
;
int32_t
dataLen
=
*
(
int32_t
*
)
p
;
p
+=
sizeof
(
int32_t
);
uint64_t
groupId
=
*
(
uint64_t
*
)
p
;
p
+=
sizeof
(
uint64_t
);
int32_t
*
colLength
=
(
int32_t
*
)
p
;
p
+=
sizeof
(
int32_t
)
*
numOfCols
;
char
*
pStart
=
p
;
for
(
int32_t
i
=
0
;
i
<
numOfCols
;
++
i
)
{
colLength
[
i
]
=
htonl
(
colLength
[
i
]);
ASSERT
(
colLength
[
i
]
<
dataLen
);
if
(
IS_VAR_DATA_TYPE
(
pResultInfo
->
fields
[
i
].
type
))
{
pResultInfo
->
pCol
[
i
].
offset
=
(
int32_t
*
)
pStart
;
...
...
source/client/src/clientMsgHandler.c
浏览文件 @
20085fea
...
...
@@ -13,13 +13,13 @@
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "os.h"
#include "tdef.h"
#include "tname.h"
#include "catalog.h"
#include "clientInt.h"
#include "clientLog.h"
#include "
catalog
.h"
#include "
os
.h"
#include "query.h"
#include "tdef.h"
#include "tname.h"
int32_t
(
*
handleRequestRspFp
[
TDMT_MAX
])(
void
*
,
const
SDataBuf
*
pMsg
,
int32_t
code
);
...
...
@@ -50,7 +50,13 @@ int32_t processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) {
SConnectRsp
connectRsp
=
{
0
};
tDeserializeSConnectRsp
(
pMsg
->
pData
,
pMsg
->
len
,
&
connectRsp
);
assert
(
connectRsp
.
epSet
.
numOfEps
>
0
);
/*assert(connectRsp.epSet.numOfEps > 0);*/
if
(
connectRsp
.
epSet
.
numOfEps
==
0
)
{
taosMemoryFree
(
pMsg
->
pData
);
setErrno
(
pRequest
,
TSDB_CODE_MND_APP_ERROR
);
tsem_post
(
&
pRequest
->
body
.
rspSem
);
return
code
;
}
if
(
!
isEpsetEqual
(
&
pTscObj
->
pAppInfo
->
mgmtEp
.
epSet
,
&
connectRsp
.
epSet
))
{
updateEpSet_s
(
&
pTscObj
->
pAppInfo
->
mgmtEp
,
&
connectRsp
.
epSet
);
...
...
@@ -82,18 +88,20 @@ int32_t processConnectRsp(void* param, const SDataBuf* pMsg, int32_t code) {
return
0
;
}
SMsgSendInfo
*
buildMsgInfoImpl
(
SRequestObj
*
pRequest
)
{
SMsgSendInfo
*
buildMsgInfoImpl
(
SRequestObj
*
pRequest
)
{
SMsgSendInfo
*
pMsgSendInfo
=
taosMemoryCalloc
(
1
,
sizeof
(
SMsgSendInfo
));
pMsgSendInfo
->
requestObjRefId
=
pRequest
->
self
;
pMsgSendInfo
->
requestId
=
pRequest
->
requestId
;
pMsgSendInfo
->
param
=
pRequest
;
pMsgSendInfo
->
msgType
=
pRequest
->
type
;
pMsgSendInfo
->
requestId
=
pRequest
->
requestId
;
pMsgSendInfo
->
param
=
pRequest
;
pMsgSendInfo
->
msgType
=
pRequest
->
type
;
assert
(
pRequest
!=
NULL
);
pMsgSendInfo
->
msgInfo
=
pRequest
->
body
.
requestMsg
;
pMsgSendInfo
->
fp
=
(
handleRequestRspFp
[
TMSG_INDEX
(
pRequest
->
type
)]
==
NULL
)
?
genericRspCallback
:
handleRequestRspFp
[
TMSG_INDEX
(
pRequest
->
type
)];
pMsgSendInfo
->
fp
=
(
handleRequestRspFp
[
TMSG_INDEX
(
pRequest
->
type
)]
==
NULL
)
?
genericRspCallback
:
handleRequestRspFp
[
TMSG_INDEX
(
pRequest
->
type
)];
return
pMsgSendInfo
;
}
...
...
@@ -114,7 +122,7 @@ int32_t processUseDbRsp(void* param, const SDataBuf* pMsg, int32_t code) {
if
(
TSDB_CODE_MND_DB_NOT_EXIST
==
code
)
{
SUseDbRsp
usedbRsp
=
{
0
};
tDeserializeSUseDbRsp
(
pMsg
->
pData
,
pMsg
->
len
,
&
usedbRsp
);
struct
SCatalog
*
pCatalog
=
NULL
;
struct
SCatalog
*
pCatalog
=
NULL
;
if
(
usedbRsp
.
vgVersion
>=
0
)
{
int32_t
code1
=
catalogGetHandle
(
pRequest
->
pTscObj
->
pAppInfo
->
clusterId
,
&
pCatalog
);
...
...
source/client/src/tmq.c
浏览文件 @
20085fea
...
...
@@ -382,12 +382,9 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
pTmq
->
pTscObj
=
taos_connect_internal
(
conf
->
ip
,
user
,
pass
,
NULL
,
conf
->
db
,
conf
->
port
,
CONN_TYPE__TMQ
);
if
(
pTmq
->
pTscObj
==
NULL
)
return
NULL
;
/*pTmq->inWaiting = 0;*/
pTmq
->
status
=
0
;
pTmq
->
pollCnt
=
0
;
pTmq
->
epoch
=
0
;
/*pTmq->waitingRequest = 0;*/
/*pTmq->readyRequest = 0;*/
pTmq
->
epStatus
=
0
;
pTmq
->
epSkipCnt
=
0
;
// set conf
...
...
@@ -509,7 +506,6 @@ tmq_resp_err_t tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
tmq
->
clientTopics
=
taosArrayInit
(
sz
,
sizeof
(
SMqClientTopic
));
SCMSubscribeReq
req
;
req
.
topicNum
=
sz
;
req
.
consumerId
=
tmq
->
consumerId
;
strcpy
(
req
.
cgroup
,
tmq
->
groupId
);
req
.
topicNames
=
taosArrayInit
(
sz
,
sizeof
(
void
*
));
...
...
@@ -519,12 +515,16 @@ tmq_resp_err_t tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
char
*
topicName
=
taosArrayGetP
(
container
,
i
);
SName
name
=
{
0
};
#if 0
char* dbName = getDbOfConnection(tmq->pTscObj);
if (dbName == NULL) {
return TMQ_RESP_ERR__FAIL;
}
tNameSetDbName
(
&
name
,
tmq
->
pTscObj
->
acctId
,
dbName
,
strlen
(
dbName
));
#endif
tNameSetDbName
(
&
name
,
tmq
->
pTscObj
->
acctId
,
topicName
,
strlen
(
topicName
));
#if 0
tNameFromString(&name, topicName, T_NAME_TABLE);
#endif
char
*
topicFname
=
taosMemoryCalloc
(
1
,
TSDB_TOPIC_FNAME_LEN
);
if
(
topicFname
==
NULL
)
{
...
...
@@ -542,7 +542,9 @@ tmq_resp_err_t tmq_subscribe(tmq_t* tmq, tmq_list_t* topic_list) {
topic
.
vgs
=
taosArrayInit
(
0
,
sizeof
(
SMqClientVg
));
taosArrayPush
(
tmq
->
clientTopics
,
&
topic
);
taosArrayPush
(
req
.
topicNames
,
&
topicFname
);
#if 0
taosMemoryFree(dbName);
#endif
}
int
tlen
=
tSerializeSCMSubscribeReq
(
NULL
,
&
req
);
...
...
source/common/src/tdatablock.c
浏览文件 @
20085fea
...
...
@@ -644,12 +644,12 @@ size_t blockDataGetRowSize(SSDataBlock* pBlock) {
/**
* @refitem blockDataToBuf for the meta size
*
* @param pBlock
* @return
*/
size_t
blockDataGetSerialMetaSize
(
const
SSDataBlock
*
pBlock
)
{
return
sizeof
(
int32_t
)
+
pBlock
->
info
.
numOfCols
*
sizeof
(
int32_t
);
// | total rows/total length | block group id | each column length |
return
sizeof
(
int32_t
)
+
sizeof
(
uint64_t
)
+
pBlock
->
info
.
numOfCols
*
sizeof
(
int32_t
);
}
double
blockDataGetSerialRowSize
(
const
SSDataBlock
*
pBlock
)
{
...
...
@@ -1219,7 +1219,6 @@ void colDataDestroy(SColumnInfoData* pColData) {
taosMemoryFree
(
pColData
->
pData
);
}
static
void
doShiftBitmap
(
char
*
nullBitmap
,
size_t
n
,
size_t
total
)
{
int32_t
len
=
BitmapLen
(
total
);
...
...
source/common/src/tglobal.c
浏览文件 @
20085fea
...
...
@@ -220,7 +220,7 @@ struct SConfig *taosGetCfg() {
return
tsCfg
;
}
static
int32_t
taosLoadCfg
(
SConfig
*
pCfg
,
const
char
*
inputCfgDir
,
const
char
*
envFile
,
const
char
*
apolloUrl
)
{
static
int32_t
taosLoadCfg
(
SConfig
*
pCfg
,
const
char
*
*
envCmd
,
const
char
*
inputCfgDir
,
const
char
*
envFile
,
char
*
apolloUrl
)
{
char
cfgDir
[
PATH_MAX
]
=
{
0
};
char
cfgFile
[
PATH_MAX
+
100
]
=
{
0
};
...
...
@@ -231,6 +231,8 @@ static int32_t taosLoadCfg(SConfig *pCfg, const char *inputCfgDir, const char *e
tstrncpy
(
cfgFile
,
cfgDir
,
sizeof
(
cfgDir
));
}
if
(
apolloUrl
==
NULL
||
apolloUrl
[
0
]
==
'\0'
)
cfgGetApollUrl
(
envCmd
,
envFile
,
apolloUrl
);
if
(
cfgLoad
(
pCfg
,
CFG_STYPE_APOLLO_URL
,
apolloUrl
)
!=
0
)
{
uError
(
"failed to load from apollo url:%s since %s"
,
apolloUrl
,
terrstr
());
return
-
1
;
...
...
@@ -251,6 +253,11 @@ static int32_t taosLoadCfg(SConfig *pCfg, const char *inputCfgDir, const char *e
return
-
1
;
}
if
(
cfgLoad
(
pCfg
,
CFG_STYPE_ENV_CMD
,
envCmd
)
!=
0
)
{
uError
(
"failed to load from cmd env variables since %s"
,
terrstr
());
return
-
1
;
}
return
0
;
}
...
...
@@ -325,8 +332,8 @@ static int32_t taosAddSystemCfg(SConfig *pCfg) {
if
(
cfgAddFloat
(
pCfg
,
"numOfCores"
,
tsNumOfCores
,
0
,
100000
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt64
(
pCfg
,
"openMax"
,
tsOpenMax
,
0
,
INT64_MAX
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt64
(
pCfg
,
"streamMax"
,
tsStreamMax
,
0
,
INT64_MAX
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"pageSize
(KB)
"
,
tsPageSizeKB
,
0
,
INT64_MAX
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt64
(
pCfg
,
"totalMemory
(KB)
"
,
tsTotalMemoryKB
,
0
,
INT64_MAX
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt32
(
pCfg
,
"pageSize
KB
"
,
tsPageSizeKB
,
0
,
INT64_MAX
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddInt64
(
pCfg
,
"totalMemory
KB
"
,
tsTotalMemoryKB
,
0
,
INT64_MAX
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddString
(
pCfg
,
"os sysname"
,
info
.
sysname
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddString
(
pCfg
,
"os nodename"
,
info
.
nodename
,
1
)
!=
0
)
return
-
1
;
if
(
cfgAddString
(
pCfg
,
"os release"
,
info
.
release
,
1
)
!=
0
)
return
-
1
;
...
...
@@ -572,8 +579,8 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
return
0
;
}
int32_t
taosCreateLog
(
const
char
*
logname
,
int32_t
logFileNum
,
const
char
*
cfgDir
,
const
char
*
envFile
,
c
onst
c
har
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
)
{
int32_t
taosCreateLog
(
const
char
*
logname
,
int32_t
logFileNum
,
const
char
*
cfgDir
,
const
char
*
*
envCmd
,
const
char
*
envFile
,
char
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
)
{
osDefaultInit
();
SConfig
*
pCfg
=
cfgInit
();
...
...
@@ -588,7 +595,7 @@ int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDi
if
(
taosAddServerLogCfg
(
pCfg
)
!=
0
)
return
-
1
;
}
if
(
taosLoadCfg
(
pCfg
,
cfgDir
,
envFile
,
apolloUrl
)
!=
0
)
{
if
(
taosLoadCfg
(
pCfg
,
envCmd
,
cfgDir
,
envFile
,
apolloUrl
)
!=
0
)
{
uError
(
"failed to load cfg since %s"
,
terrstr
());
cfgCleanup
(
pCfg
);
return
-
1
;
...
...
@@ -625,7 +632,7 @@ int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDi
return
0
;
}
int32_t
taosInitCfg
(
const
char
*
cfgDir
,
const
char
*
envFile
,
const
char
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
)
{
int32_t
taosInitCfg
(
const
char
*
cfgDir
,
const
char
*
*
envCmd
,
const
char
*
envFile
,
char
*
apolloUrl
,
SArray
*
pArgs
,
bool
tsc
)
{
if
(
tsCfg
!=
NULL
)
return
0
;
tsCfg
=
cfgInit
();
...
...
@@ -640,7 +647,7 @@ int32_t taosInitCfg(const char *cfgDir, const char *envFile, const char *apolloU
}
taosAddSystemCfg
(
tsCfg
);
if
(
taosLoadCfg
(
tsCfg
,
cfgDir
,
envFile
,
apolloUrl
)
!=
0
)
{
if
(
taosLoadCfg
(
tsCfg
,
envCmd
,
cfgDir
,
envFile
,
apolloUrl
)
!=
0
)
{
uError
(
"failed to load cfg since %s"
,
terrstr
());
cfgCleanup
(
tsCfg
);
tsCfg
=
NULL
;
...
...
source/common/src/tmsg.c
浏览文件 @
20085fea
...
...
@@ -1647,13 +1647,8 @@ int32_t tSerializeSCreateFuncReq(void *buf, int32_t bufLen, SCreateFuncReq *pReq
if
(
tEncodeI32
(
&
encoder
,
pReq
->
codeLen
)
<
0
)
return
-
1
;
if
(
tEncodeI64
(
&
encoder
,
pReq
->
signature
)
<
0
)
return
-
1
;
int32_t
codeSize
=
0
;
if
(
pReq
->
pCode
!=
NULL
)
{
codeSize
=
strlen
(
pReq
->
pCode
)
+
1
;
}
if
(
tEncodeI32
(
&
encoder
,
codeSize
)
<
0
)
return
-
1
;
if
(
pReq
->
pCode
!=
NULL
)
{
if
(
tEncodeCStr
(
&
encoder
,
pReq
->
pCode
)
<
0
)
return
-
1
;
if
(
tEncodeBinary
(
&
encoder
,
pReq
->
pCode
,
pReq
->
codeLen
)
<
0
)
return
-
1
;
}
int32_t
commentSize
=
0
;
...
...
@@ -1687,10 +1682,8 @@ int32_t tDeserializeSCreateFuncReq(void *buf, int32_t bufLen, SCreateFuncReq *pR
if
(
tDecodeI32
(
&
decoder
,
&
pReq
->
codeLen
)
<
0
)
return
-
1
;
if
(
tDecodeI64
(
&
decoder
,
&
pReq
->
signature
)
<
0
)
return
-
1
;
int32_t
codeSize
=
0
;
if
(
tDecodeI32
(
&
decoder
,
&
codeSize
)
<
0
)
return
-
1
;
if
(
codeSize
>
0
)
{
pReq
->
pCode
=
taosMemoryCalloc
(
1
,
codeSize
);
if
(
pReq
->
codeLen
>
0
)
{
pReq
->
pCode
=
taosMemoryCalloc
(
1
,
pReq
->
codeLen
);
if
(
pReq
->
pCode
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
...
...
@@ -1813,7 +1806,7 @@ int32_t tSerializeSRetrieveFuncRsp(void *buf, int32_t bufLen, SRetrieveFuncRsp *
if
(
tEncodeI32
(
&
encoder
,
pInfo
->
codeSize
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
&
encoder
,
pInfo
->
commentSize
)
<
0
)
return
-
1
;
if
(
pInfo
->
codeSize
)
{
if
(
tEncode
CStr
(
&
encoder
,
pInfo
->
pCod
e
)
<
0
)
return
-
1
;
if
(
tEncode
Binary
(
&
encoder
,
pInfo
->
pCode
,
pInfo
->
codeSiz
e
)
<
0
)
return
-
1
;
}
if
(
pInfo
->
commentSize
)
{
if
(
tEncodeCStr
(
&
encoder
,
pInfo
->
pComment
)
<
0
)
return
-
1
;
...
...
@@ -2170,10 +2163,15 @@ int32_t tDeserializeSQnodeListRsp(void *buf, int32_t bufLen, SQnodeListRsp *pRsp
if
(
tStartDecode
(
&
decoder
)
<
0
)
return
-
1
;
int32_t
num
=
0
;
if
(
tDecodeI32
(
&
decoder
,
&
num
)
<
0
)
return
-
1
;
pRsp
->
addrsList
=
taosArrayInit
(
num
,
sizeof
(
SQueryNodeAddr
));
if
(
NULL
==
pRsp
->
addrsList
)
return
-
1
;
if
(
NULL
==
pRsp
->
addrsList
)
{
pRsp
->
addrsList
=
taosArrayInit
(
num
,
sizeof
(
SQueryNodeAddr
));
if
(
NULL
==
pRsp
->
addrsList
)
return
-
1
;
}
for
(
int32_t
i
=
0
;
i
<
num
;
++
i
)
{
if
(
tDecodeSQueryNodeAddr
(
&
decoder
,
TARRAY_GET_ELEM
(
pRsp
->
addrsList
,
i
))
<
0
)
return
-
1
;
SQueryNodeAddr
addr
=
{
0
};
if
(
tDecodeSQueryNodeAddr
(
&
decoder
,
&
addr
)
<
0
)
return
-
1
;
taosArrayPush
(
pRsp
->
addrsList
,
&
addr
);
}
tEndDecode
(
&
decoder
);
...
...
@@ -2826,11 +2824,11 @@ int32_t tSerializeSCMCreateTopicReq(void *buf, int32_t bufLen, const SCMCreateTo
if
(
tEncodeI8
(
&
encoder
,
pReq
->
withTbName
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
&
encoder
,
pReq
->
withSchema
)
<
0
)
return
-
1
;
if
(
tEncodeI8
(
&
encoder
,
pReq
->
withTag
)
<
0
)
return
-
1
;
if
(
tEncodeCStr
(
&
encoder
,
pReq
->
subscribeDbName
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
&
encoder
,
sqlLen
)
<
0
)
return
-
1
;
if
(
tEncodeI32
(
&
encoder
,
astLen
)
<
0
)
return
-
1
;
if
(
sqlLen
>
0
&&
tEncodeCStr
(
&
encoder
,
pReq
->
sql
)
<
0
)
return
-
1
;
if
(
astLen
>
0
&&
tEncodeCStr
(
&
encoder
,
pReq
->
ast
)
<
0
)
return
-
1
;
if
(
0
==
astLen
&&
tEncodeCStr
(
&
encoder
,
pReq
->
subscribeDbName
)
<
0
)
return
-
1
;
tEndEncode
(
&
encoder
);
...
...
@@ -2852,6 +2850,7 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
withTbName
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
withSchema
)
<
0
)
return
-
1
;
if
(
tDecodeI8
(
&
decoder
,
&
pReq
->
withTag
)
<
0
)
return
-
1
;
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
subscribeDbName
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
&
sqlLen
)
<
0
)
return
-
1
;
if
(
tDecodeI32
(
&
decoder
,
&
astLen
)
<
0
)
return
-
1
;
...
...
@@ -2866,7 +2865,6 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR
if
(
pReq
->
ast
==
NULL
)
return
-
1
;
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
ast
)
<
0
)
return
-
1
;
}
else
{
if
(
tDecodeCStrTo
(
&
decoder
,
pReq
->
subscribeDbName
)
<
0
)
return
-
1
;
}
tEndDecode
(
&
decoder
);
...
...
source/dnode/mgmt/exe/dmMain.c
浏览文件 @
20085fea
...
...
@@ -24,6 +24,7 @@ static struct {
bool
printVersion
;
char
envFile
[
PATH_MAX
];
char
apolloUrl
[
PATH_MAX
];
const
char
**
envCmd
;
SArray
*
pArgs
;
// SConfigPair
SDnode
*
pDnode
;
EDndNodeType
ntype
;
...
...
@@ -56,6 +57,9 @@ static void dmSetSignalHandle() {
}
static
int32_t
dmParseArgs
(
int32_t
argc
,
char
const
*
argv
[])
{
int32_t
cmdEnvIndex
=
0
;
global
.
envCmd
=
taosMemoryMalloc
(
argc
-
1
);
memset
(
global
.
envCmd
,
0
,
argc
-
1
);
for
(
int32_t
i
=
1
;
i
<
argc
;
++
i
)
{
if
(
strcmp
(
argv
[
i
],
"-c"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
...
...
@@ -70,7 +74,7 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
}
}
else
if
(
strcmp
(
argv
[
i
],
"-a"
)
==
0
)
{
tstrncpy
(
global
.
apolloUrl
,
argv
[
++
i
],
PATH_MAX
);
}
else
if
(
strcmp
(
argv
[
i
],
"-
e
"
)
==
0
)
{
}
else
if
(
strcmp
(
argv
[
i
],
"-
E
"
)
==
0
)
{
tstrncpy
(
global
.
envFile
,
argv
[
++
i
],
PATH_MAX
);
}
else
if
(
strcmp
(
argv
[
i
],
"-n"
)
==
0
)
{
global
.
ntype
=
atoi
(
argv
[
++
i
]);
...
...
@@ -84,6 +88,9 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
global
.
dumpConfig
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"-V"
)
==
0
)
{
global
.
printVersion
=
true
;
}
else
if
(
strcmp
(
argv
[
i
],
"-e"
)
==
0
)
{
global
.
envCmd
[
cmdEnvIndex
]
=
argv
[
++
i
];
cmdEnvIndex
++
;
}
else
{
}
}
...
...
@@ -129,7 +136,7 @@ static SDnodeOpt dmGetOpt() {
static
int32_t
dmInitLog
()
{
char
logName
[
12
]
=
{
0
};
snprintf
(
logName
,
sizeof
(
logName
),
"%slog"
,
dmLogName
(
global
.
ntype
));
return
taosCreateLog
(
logName
,
1
,
configDir
,
global
.
envFile
,
global
.
apolloUrl
,
global
.
pArgs
,
0
);
return
taosCreateLog
(
logName
,
1
,
configDir
,
global
.
env
Cmd
,
global
.
env
File
,
global
.
apolloUrl
,
global
.
pArgs
,
0
);
}
static
void
dmSetProcInfo
(
int32_t
argc
,
char
**
argv
)
{
...
...
@@ -168,6 +175,10 @@ static int32_t dmRunDnode() {
return
code
;
}
static
void
taosCleanupArgs
()
{
if
(
global
.
envCmd
!=
NULL
)
taosMemoryFree
(
global
.
envCmd
);
}
int
main
(
int
argc
,
char
const
*
argv
[])
{
if
(
!
taosCheckSystemIsSmallEnd
())
{
printf
(
"failed to start since on non-small-end machines
\n
"
);
...
...
@@ -176,26 +187,31 @@ int main(int argc, char const *argv[]) {
if
(
dmParseArgs
(
argc
,
argv
)
!=
0
)
{
printf
(
"failed to start since parse args error
\n
"
);
taosCleanupArgs
();
return
-
1
;
}
if
(
global
.
generateGrant
)
{
dmGenerateGrant
();
taosCleanupArgs
();
return
0
;
}
if
(
global
.
printVersion
)
{
dmPrintVersion
();
taosCleanupArgs
();
return
0
;
}
if
(
dmInitLog
()
!=
0
)
{
dError
(
"failed to start since init log error"
);
printf
(
"failed to start since init log error"
);
taosCleanupArgs
();
return
-
1
;
}
if
(
taosInitCfg
(
configDir
,
global
.
envFile
,
global
.
apolloUrl
,
global
.
pArgs
,
0
)
!=
0
)
{
if
(
taosInitCfg
(
configDir
,
global
.
env
Cmd
,
global
.
env
File
,
global
.
apolloUrl
,
global
.
pArgs
,
0
)
!=
0
)
{
dError
(
"failed to start since read config error"
);
taosCleanupArgs
();
return
-
1
;
}
...
...
@@ -203,9 +219,11 @@ int main(int argc, char const *argv[]) {
dmDumpCfg
();
taosCleanupCfg
();
taosCloseLog
();
taosCleanupArgs
();
return
0
;
}
dmSetProcInfo
(
argc
,
(
char
**
)
argv
);
taosCleanupArgs
();
return
dmRunDnode
();
}
source/dnode/mgmt/implement/src/dmHandle.c
浏览文件 @
20085fea
...
...
@@ -311,6 +311,9 @@ static void dmWatchUdfd(void *args) {
}
static
int32_t
dmStartUdfd
(
SDnode
*
pDnode
)
{
char
dnodeId
[
8
]
=
{
0
};
snprintf
(
dnodeId
,
sizeof
(
dnodeId
),
"%d"
,
pDnode
->
data
.
dnodeId
);
uv_os_setenv
(
"DNODE_ID"
,
dnodeId
);
SUdfdData
*
pData
=
&
pDnode
->
udfdData
;
if
(
pData
->
startCalled
)
{
dInfo
(
"dnode-mgmt start udfd already called"
);
...
...
@@ -320,8 +323,17 @@ static int32_t dmStartUdfd(SDnode *pDnode) {
uv_barrier_init
(
&
pData
->
barrier
,
2
);
uv_thread_create
(
&
pData
->
thread
,
dmWatchUdfd
,
pDnode
);
uv_barrier_wait
(
&
pData
->
barrier
);
pData
->
needCleanUp
=
true
;
return
pData
->
spawnErr
;
int32_t
err
=
atomic_load_32
(
&
pData
->
spawnErr
);
if
(
err
!=
0
)
{
uv_barrier_destroy
(
&
pData
->
barrier
);
uv_async_send
(
&
pData
->
stopAsync
);
uv_thread_join
(
&
pData
->
thread
);
pData
->
needCleanUp
=
false
;
dInfo
(
"dnode-mgmt udfd cleaned up after spawn err"
);
}
else
{
pData
->
needCleanUp
=
true
;
}
return
err
;
}
static
int32_t
dmStopUdfd
(
SDnode
*
pDnode
)
{
...
...
@@ -336,7 +348,7 @@ static int32_t dmStopUdfd(SDnode *pDnode) {
uv_barrier_destroy
(
&
pData
->
barrier
);
uv_async_send
(
&
pData
->
stopAsync
);
uv_thread_join
(
&
pData
->
thread
);
dInfo
(
"dnode-mgmt udfd cleaned up"
);
return
0
;
}
...
...
@@ -371,9 +383,9 @@ static int32_t dmInitMgmt(SMgmtWrapper *pWrapper) {
}
dmReportStartup
(
pDnode
,
"dnode-transport"
,
"initialized"
);
//
if (dmStartUdfd(pDnode) != 0) {
//
dError("failed to start udfd");
//
}
if
(
dmStartUdfd
(
pDnode
)
!=
0
)
{
dError
(
"failed to start udfd"
);
}
dInfo
(
"dnode-mgmt is initialized"
);
return
0
;
...
...
source/dnode/mgmt/interface/src/dmFile.c
浏览文件 @
20085fea
...
...
@@ -124,7 +124,7 @@ TdFilePtr dmCheckRunning(const char *dataDir) {
TdFilePtr
pFile
=
taosOpenFile
(
filepath
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_TRUNC
);
if
(
pFile
==
NULL
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
dError
(
"failed to
lock
file:%s since %s"
,
filepath
,
terrstr
());
dError
(
"failed to
open
file:%s since %s"
,
filepath
,
terrstr
());
return
NULL
;
}
...
...
source/dnode/mgmt/interface/src/dmInt.c
浏览文件 @
20085fea
...
...
@@ -173,9 +173,13 @@ static void dmGetServerStatus(SDnode *pDnode, SServerStatusRsp *pStatus) {
void
dmProcessNettestReq
(
SDnode
*
pDnode
,
SRpcMsg
*
pRpc
)
{
dDebug
(
"net test req is received"
);
SRpcMsg
rsp
=
{.
handle
=
pRpc
->
handle
,
.
ahandle
=
pRpc
->
ahandle
,
.
code
=
0
};
SRpcMsg
rsp
=
{.
handle
=
pRpc
->
handle
,
.
refId
=
pRpc
->
refId
,
.
ahandle
=
pRpc
->
ahandle
,
.
code
=
0
};
rsp
.
pCont
=
rpcMallocCont
(
pRpc
->
contLen
);
rsp
.
contLen
=
pRpc
->
contLen
;
if
(
rsp
.
pCont
==
NULL
)
{
rsp
.
code
=
TSDB_CODE_OUT_OF_MEMORY
;
}
else
{
rsp
.
contLen
=
pRpc
->
contLen
;
}
rpcSendResponse
(
&
rsp
);
}
...
...
source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
浏览文件 @
20085fea
...
...
@@ -177,6 +177,7 @@ void mmInitMsgHandle(SMgmtWrapper *pWrapper) {
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_DROP_MNODE
,
mmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_CREATE_QNODE
,
mmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_DROP_QNODE
,
mmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_QNODE_LIST
,
mmProcessReadMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_CREATE_SNODE
,
mmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_DROP_SNODE
,
mmProcessWriteMsg
,
DEFAULT_HANDLE
);
dmSetMsgHandle
(
pWrapper
,
TDMT_MND_CREATE_BNODE
,
mmProcessWriteMsg
,
DEFAULT_HANDLE
);
...
...
source/dnode/mgmt/mgmt_vnode/src/vmInt.c
浏览文件 @
20085fea
...
...
@@ -15,6 +15,7 @@
#define _DEFAULT_SOURCE
#include "vmInt.h"
#include "libs/function/function.h"
SVnodeObj
*
vmAcquireVnode
(
SVnodesMgmt
*
pMgmt
,
int32_t
vgId
)
{
SVnodeObj
*
pVnode
=
NULL
;
...
...
@@ -275,7 +276,7 @@ static void vmCleanup(SMgmtWrapper *pWrapper) {
pWrapper
->
pMgmt
=
NULL
;
// syncCleanUp();
udfcClose
();
dInfo
(
"vnode-mgmt is cleaned up"
);
}
...
...
@@ -339,6 +340,10 @@ static int32_t vmInit(SMgmtWrapper *pWrapper) {
}
dmReportStartup
(
pDnode
,
"vnode-vnodes"
,
"initialized"
);
if
(
udfcOpen
()
!=
0
)
{
dError
(
"failed to open udfc in dnode"
);
}
code
=
0
;
_OVER:
...
...
source/dnode/mnode/impl/inc/mndDef.h
浏览文件 @
20085fea
...
...
@@ -450,7 +450,6 @@ typedef struct {
int8_t
withTbName
;
int8_t
withSchema
;
int8_t
withTag
;
int8_t
withTagSchema
;
SRWLatch
lock
;
int32_t
sqlLen
;
int32_t
astLen
;
...
...
@@ -517,7 +516,6 @@ typedef struct {
int8_t
withTbName
;
int8_t
withSchema
;
int8_t
withTag
;
int8_t
withTagSchema
;
SHashObj
*
consumerHash
;
// consumerId -> SMqConsumerEpInSub
// TODO put -1 into unassignVgs
// SArray* unassignedVgs;
...
...
source/dnode/mnode/impl/src/mndDef.c
浏览文件 @
20085fea
...
...
@@ -237,7 +237,6 @@ SMqSubscribeObj *tCloneSubscribeObj(const SMqSubscribeObj *pSub) {
pSubNew
->
withTbName
=
pSub
->
withTbName
;
pSubNew
->
withSchema
=
pSub
->
withSchema
;
pSubNew
->
withTag
=
pSub
->
withTag
;
pSubNew
->
withTagSchema
=
pSub
->
withTagSchema
;
pSubNew
->
vgNum
=
pSub
->
vgNum
;
pSubNew
->
consumerHash
=
taosHashInit
(
64
,
taosGetDefaultHashFunction
(
TSDB_DATA_TYPE_BIGINT
),
false
,
HASH_NO_LOCK
);
...
...
@@ -270,7 +269,6 @@ int32_t tEncodeSubscribeObj(void **buf, const SMqSubscribeObj *pSub) {
tlen
+=
taosEncodeFixedI8
(
buf
,
pSub
->
withTbName
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pSub
->
withSchema
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pSub
->
withTag
);
tlen
+=
taosEncodeFixedI8
(
buf
,
pSub
->
withTagSchema
);
void
*
pIter
=
NULL
;
int32_t
sz
=
taosHashGetSize
(
pSub
->
consumerHash
);
...
...
@@ -297,7 +295,6 @@ void *tDecodeSubscribeObj(const void *buf, SMqSubscribeObj *pSub) {
buf
=
taosDecodeFixedI8
(
buf
,
&
pSub
->
withTbName
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pSub
->
withSchema
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pSub
->
withTag
);
buf
=
taosDecodeFixedI8
(
buf
,
&
pSub
->
withTagSchema
);
int32_t
sz
;
buf
=
taosDecodeFixedI32
(
buf
,
&
sz
);
...
...
source/dnode/mnode/impl/src/mndFunc.c
浏览文件 @
20085fea
...
...
@@ -309,10 +309,10 @@ static int32_t mndProcessCreateFuncReq(SNodeMsg *pReq) {
goto
_OVER
;
}
if
(
createReq
.
pCode
[
0
]
==
0
)
{
terrno
=
TSDB_CODE_MND_INVALID_FUNC_CODE
;
goto
_OVER
;
}
if
(
createReq
.
codeLen
<=
1
)
{
terrno
=
TSDB_CODE_MND_INVALID_FUNC_CODE
;
goto
_OVER
;
}
if
(
createReq
.
bufSize
<=
0
||
createReq
.
bufSize
>
TSDB_FUNC_BUF_SIZE
)
{
terrno
=
TSDB_CODE_MND_INVALID_FUNC_BUFSIZE
;
...
...
source/dnode/mnode/impl/src/mndInfoSchema.c
浏览文件 @
20085fea
...
...
@@ -325,7 +325,7 @@ static int32_t mndInsInitMeta(SHashObj *hash) {
return
-
1
;
}
if
(
taosHashPut
(
hash
,
meta
.
tbName
,
strlen
(
meta
.
tbName
)
+
1
,
&
meta
,
sizeof
(
meta
)))
{
if
(
taosHashPut
(
hash
,
meta
.
tbName
,
strlen
(
meta
.
tbName
),
&
meta
,
sizeof
(
meta
)))
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
-
1
;
}
...
...
@@ -340,10 +340,10 @@ int32_t mndBuildInsTableSchema(SMnode *pMnode, const char *dbFName, const char *
return
-
1
;
}
STableMetaRsp
*
pMeta
=
taosHashGet
(
pMnode
->
infosMeta
,
tbName
,
strlen
(
tbName
)
+
1
);
STableMetaRsp
*
pMeta
=
taosHashGet
(
pMnode
->
infosMeta
,
tbName
,
strlen
(
tbName
));
if
(
NULL
==
pMeta
)
{
mError
(
"invalid information schema table name:%s"
,
tbName
);
terrno
=
TSDB_CODE_MND_INVALID_
INFOS_TBL
;
terrno
=
TSDB_CODE_MND_INVALID_
SYS_TABLENAME
;
return
-
1
;
}
...
...
source/dnode/mnode/impl/src/mndPerfSchema.c
浏览文件 @
20085fea
...
...
@@ -128,7 +128,7 @@ int32_t mndBuildPerfsTableSchema(SMnode *pMnode, const char *dbFName, const char
STableMetaRsp
*
meta
=
(
STableMetaRsp
*
)
taosHashGet
(
pMnode
->
perfsMeta
,
tbName
,
strlen
(
tbName
));
if
(
NULL
==
meta
)
{
mError
(
"invalid performance schema table name:%s"
,
tbName
);
terrno
=
TSDB_CODE_MND_INVALID_
INFOS_TBL
;
terrno
=
TSDB_CODE_MND_INVALID_
SYS_TABLENAME
;
return
-
1
;
}
...
...
source/dnode/mnode/impl/src/mndQnode.c
浏览文件 @
20085fea
...
...
@@ -451,8 +451,9 @@ static int32_t mndProcessQnodeListReq(SNodeMsg *pReq) {
goto
_OVER
;
}
void
*
pIter
=
NULL
;
while
(
1
)
{
void
*
pIter
=
sdbFetch
(
pSdb
,
SDB_QNODE
,
NULL
,
(
void
**
)
&
pObj
);
pIter
=
sdbFetch
(
pSdb
,
SDB_QNODE
,
pIter
,
(
void
**
)
&
pObj
);
if
(
pIter
==
NULL
)
break
;
SQueryNodeAddr
nodeAddr
=
{
0
};
...
...
@@ -472,7 +473,7 @@ static int32_t mndProcessQnodeListReq(SNodeMsg *pReq) {
}
int32_t
rspLen
=
tSerializeSQnodeListRsp
(
NULL
,
0
,
&
qlistRsp
);
void
*
pRsp
=
taosMemoryMalloc
(
rspLen
);
void
*
pRsp
=
rpcMallocCont
(
rspLen
);
if
(
pRsp
==
NULL
)
{
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
goto
_OVER
;
...
...
source/dnode/mnode/impl/src/mndShow.c
浏览文件 @
20085fea
...
...
@@ -100,6 +100,8 @@ static int32_t convertToRetrieveType(char* name, int32_t len) {
type
=
TSDB_MGMT_TABLE_QUERIES
;
}
else
if
(
strncasecmp
(
name
,
TSDB_INS_TABLE_VNODES
,
len
)
==
0
)
{
type
=
TSDB_MGMT_TABLE_VNODES
;
}
else
if
(
strncasecmp
(
name
,
TSDB_PERFS_TABLE_TOPICS
,
len
)
==
0
)
{
type
=
TSDB_MGMT_TABLE_TOPICS
;
}
else
{
// ASSERT(0);
}
...
...
@@ -187,11 +189,14 @@ static int32_t mndProcessRetrieveSysTableReq(SNodeMsg *pReq) {
}
if
(
retrieveReq
.
showId
==
0
)
{
STableMetaRsp
*
pMeta
=
(
STableMetaRsp
*
)
taosHashGet
(
pMnode
->
infosMeta
,
retrieveReq
.
tb
,
strlen
(
retrieveReq
.
tb
)
+
1
);
STableMetaRsp
*
pMeta
=
(
STableMetaRsp
*
)
taosHashGet
(
pMnode
->
infosMeta
,
retrieveReq
.
tb
,
strlen
(
retrieveReq
.
tb
));
if
(
pMeta
==
NULL
)
{
terrno
=
TSDB_CODE_MND_INVALID_INFOS_TBL
;
mError
(
"failed to process show-retrieve req:%p since %s"
,
pShow
,
terrstr
());
return
-
1
;
pMeta
=
(
STableMetaRsp
*
)
taosHashGet
(
pMnode
->
perfsMeta
,
retrieveReq
.
tb
,
strlen
(
retrieveReq
.
tb
));
if
(
pMeta
==
NULL
)
{
terrno
=
TSDB_CODE_MND_INVALID_SYS_TABLENAME
;
mError
(
"failed to process show-retrieve req:%p since %s"
,
pShow
,
terrstr
());
return
-
1
;
}
}
pShow
=
mndCreateShowObj
(
pMnode
,
&
retrieveReq
);
...
...
source/dnode/mnode/impl/src/mndSubscribe.c
浏览文件 @
20085fea
...
...
@@ -35,11 +35,6 @@
#define MND_SUBSCRIBE_REBALANCE_CNT 3
enum
{
MQ_SUBSCRIBE_STATUS__ACTIVE
=
1
,
MQ_SUBSCRIBE_STATUS__DELETED
,
};
static
SSdbRaw
*
mndSubActionEncode
(
SMqSubscribeObj
*
);
static
SSdbRow
*
mndSubActionDecode
(
SSdbRaw
*
pRaw
);
static
int32_t
mndSubActionInsert
(
SSdb
*
pSdb
,
SMqSubscribeObj
*
);
...
...
@@ -89,7 +84,6 @@ static SMqSubscribeObj *mndCreateSub(SMnode *pMnode, const SMqTopicObj *pTopic,
pSub
->
withTbName
=
pTopic
->
withTbName
;
pSub
->
withSchema
=
pTopic
->
withSchema
;
pSub
->
withTag
=
pTopic
->
withTag
;
pSub
->
withTagSchema
=
pTopic
->
withTagSchema
;
ASSERT
(
taosHashGetSize
(
pSub
->
consumerHash
)
==
1
);
...
...
@@ -115,7 +109,6 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscri
req
.
withTbName
=
pSub
->
withTbName
;
req
.
withSchema
=
pSub
->
withSchema
;
req
.
withTag
=
pSub
->
withTag
;
req
.
withTagSchema
=
pSub
->
withTagSchema
;
strncpy
(
req
.
subKey
,
pSub
->
key
,
TSDB_SUBSCRIBE_KEY_LEN
);
int32_t
tlen
=
sizeof
(
SMsgHead
)
+
tEncodeSMqRebVgReq
(
NULL
,
&
req
);
...
...
@@ -514,9 +507,11 @@ static int32_t mndProcessRebalanceReq(SNodeMsg *pMsg) {
// TODO replace assert with error check
ASSERT
(
mndDoRebalance
(
pMnode
,
&
rebInput
,
&
rebOutput
)
==
0
);
// if add more consumer to balanced subscribe,
// possibly no vg is changed
/*ASSERT(taosArrayGetSize(rebOutput.rebVgs) != 0);*/
ASSERT
(
mndPersistRebResult
(
pMnode
,
pMsg
,
&
rebOutput
)
==
0
);
if
(
rebInput
.
pTopic
)
{
...
...
@@ -673,177 +668,7 @@ void mndReleaseSubscribe(SMnode *pMnode, SMqSubscribeObj *pSub) {
sdbRelease
(
pSdb
,
pSub
);
}
#if 0
static int32_t mndProcessSubscribeReq(SNodeMsg *pMsg) {
SMnode *pMnode = pMsg->pNode;
char *msgStr = pMsg->rpcMsg.pCont;
SCMSubscribeReq subscribe;
tDeserializeSCMSubscribeReq(msgStr, &subscribe);
int64_t consumerId = subscribe.consumerId;
char *cgroup = subscribe.consumerGroup;
SArray *newSub = subscribe.topicNames;
int32_t newTopicNum = subscribe.topicNum;
taosArraySortString(newSub, taosArrayCompareString);
SArray *oldSub = NULL;
int32_t oldTopicNum = 0;
bool createConsumer = false;
// create consumer if not exist
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
// create consumer
pConsumer = mndCreateConsumer(consumerId, cgroup);
createConsumer = true;
} else {
pConsumer->epoch++;
oldSub = pConsumer->currentTopics;
}
pConsumer->currentTopics = newSub;
if (oldSub != NULL) {
oldTopicNum = taosArrayGetSize(oldSub);
}
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_SUBSCRIBE, &pMsg->rpcMsg);
if (pTrans == NULL) {
// TODO: free memory
return -1;
}
int32_t i = 0, j = 0;
while (i < newTopicNum || j < oldTopicNum) {
char *newTopicName = NULL;
char *oldTopicName = NULL;
if (i >= newTopicNum) {
// encode unset topic msg to all vnodes related to that topic
oldTopicName = taosArrayGetP(oldSub, j);
j++;
} else if (j >= oldTopicNum) {
newTopicName = taosArrayGetP(newSub, i);
i++;
} else {
newTopicName = taosArrayGetP(newSub, i);
oldTopicName = taosArrayGetP(oldSub, j);
int32_t comp = compareLenPrefixedStr(newTopicName, oldTopicName);
if (comp == 0) {
// do nothing
oldTopicName = newTopicName = NULL;
i++;
j++;
continue;
} else if (comp < 0) {
oldTopicName = NULL;
i++;
} else {
newTopicName = NULL;
j++;
}
}
if (oldTopicName != NULL) {
ASSERT(newTopicName == NULL);
// cancel subscribe of old topic
SMqSubscribeObj *pSub = mndAcquireSubscribe(pMnode, cgroup, oldTopicName);
ASSERT(pSub);
int32_t csz = taosArrayGetSize(pSub->consumers);
for (int32_t ci = 0; ci < csz; ci++) {
SMqSubConsumer *pSubConsumer = taosArrayGet(pSub->consumers, ci);
if (pSubConsumer->consumerId == consumerId) {
int32_t vgsz = taosArrayGetSize(pSubConsumer->vgInfo);
for (int32_t vgi = 0; vgi < vgsz; vgi++) {
SMqConsumerEp *pConsumerEp = taosArrayGet(pSubConsumer->vgInfo, vgi);
mndPersistCancelConnReq(pMnode, pTrans, pConsumerEp, oldTopicName);
taosArrayPush(pSub->unassignedVg, pConsumerEp);
}
taosArrayRemove(pSub->consumers, ci);
break;
}
}
char *oldTopicNameDup = strdup(oldTopicName);
taosArrayPush(pConsumer->recentRemovedTopics, &oldTopicNameDup);
atomic_store_32(&pConsumer->status, MQ_CONSUMER_STATUS__MODIFY);
/*pSub->status = MQ_SUBSCRIBE_STATUS__DELETED;*/
} else if (newTopicName != NULL) {
ASSERT(oldTopicName == NULL);
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, newTopicName);
if (pTopic == NULL) {
mError("topic being subscribed not exist: %s", newTopicName);
continue;
}
SMqSubscribeObj *pSub = mndAcquireSubscribe(pMnode, cgroup, newTopicName);
bool createSub = false;
if (pSub == NULL) {
mDebug("create new subscription by consumer %" PRId64 ", group: %s, topic %s", consumerId, cgroup,
newTopicName);
pSub = mndCreateSubscription(pMnode, pTopic, cgroup);
createSub = true;
mndCreateOffset(pTrans, cgroup, newTopicName, pSub->unassignedVg);
}
SMqSubConsumer mqSubConsumer;
mqSubConsumer.consumerId = consumerId;
mqSubConsumer.vgInfo = taosArrayInit(0, sizeof(SMqConsumerEp));
taosArrayPush(pSub->consumers, &mqSubConsumer);
// if have un assigned vg, assign one to the consumer
if (taosArrayGetSize(pSub->unassignedVg) > 0) {
SMqConsumerEp *pConsumerEp = taosArrayPop(pSub->unassignedVg);
pConsumerEp->oldConsumerId = pConsumerEp->consumerId;
pConsumerEp->consumerId = consumerId;
taosArrayPush(mqSubConsumer.vgInfo, pConsumerEp);
if (pConsumerEp->oldConsumerId == -1) {
mInfo("mq set conn: assign vgroup %d of topic %s to consumer %" PRId64 "", pConsumerEp->vgId, newTopicName,
pConsumerEp->consumerId);
mndPersistMqSetConnReq(pMnode, pTrans, pTopic, cgroup, pConsumerEp);
} else {
mndPersistRebalanceMsg(pMnode, pTrans, pConsumerEp, newTopicName);
}
// to trigger rebalance at once, do not set status active
/*atomic_store_32(&pConsumer->status, MQ_CONSUMER_STATUS__ACTIVE);*/
}
SSdbRaw *pRaw = mndSubActionEncode(pSub);
sdbSetRawStatus(pRaw, SDB_STATUS_READY);
mndTransAppendRedolog(pTrans, pRaw);
if (!createSub) mndReleaseSubscribe(pMnode, pSub);
mndReleaseTopic(pMnode, pTopic);
}
}
/*if (oldSub) taosArrayDestroyEx(oldSub, (void (*)(void *))taosMemoryFree);*/
// persist consumerObj
SSdbRaw *pConsumerRaw = mndConsumerActionEncode(pConsumer);
sdbSetRawStatus(pConsumerRaw, SDB_STATUS_READY);
mndTransAppendRedolog(pTrans, pConsumerRaw);
if (mndTransPrepare(pMnode, pTrans) != 0) {
mError("mq-subscribe-trans:%d, failed to prepare since %s", pTrans->id, terrstr());
mndTransDrop(pTrans);
if (!createConsumer) mndReleaseConsumer(pMnode, pConsumer);
return -1;
}
mndTransDrop(pTrans);
if (!createConsumer) mndReleaseConsumer(pMnode, pConsumer);
return TSDB_CODE_MND_ACTION_IN_PROGRESS;
}
#endif
static
int32_t
mndProcessSubscribeInternalRsp
(
SNodeMsg
*
pRsp
)
{
mndTransProcessRsp
(
pRsp
);
return
0
;
}
static
void
mndCancelGetNextConsumer
(
SMnode
*
pMnode
,
void
*
pIter
)
{
SSdb
*
pSdb
=
pMnode
->
pSdb
;
sdbCancelFetch
(
pSdb
,
pIter
);
}
source/dnode/mnode/impl/src/mndTopic.c
浏览文件 @
20085fea
...
...
@@ -82,7 +82,6 @@ SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic) {
SDB_SET_INT8
(
pRaw
,
dataPos
,
pTopic
->
withTbName
,
TOPIC_ENCODE_OVER
);
SDB_SET_INT8
(
pRaw
,
dataPos
,
pTopic
->
withSchema
,
TOPIC_ENCODE_OVER
);
SDB_SET_INT8
(
pRaw
,
dataPos
,
pTopic
->
withTag
,
TOPIC_ENCODE_OVER
);
SDB_SET_INT8
(
pRaw
,
dataPos
,
pTopic
->
withTagSchema
,
TOPIC_ENCODE_OVER
);
SDB_SET_INT32
(
pRaw
,
dataPos
,
pTopic
->
sqlLen
,
TOPIC_ENCODE_OVER
);
SDB_SET_BINARY
(
pRaw
,
dataPos
,
pTopic
->
sql
,
pTopic
->
sqlLen
,
TOPIC_ENCODE_OVER
);
SDB_SET_INT32
(
pRaw
,
dataPos
,
pTopic
->
astLen
,
TOPIC_ENCODE_OVER
);
...
...
@@ -146,7 +145,6 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
SDB_GET_INT8
(
pRaw
,
dataPos
,
&
pTopic
->
withTbName
,
TOPIC_DECODE_OVER
);
SDB_GET_INT8
(
pRaw
,
dataPos
,
&
pTopic
->
withSchema
,
TOPIC_DECODE_OVER
);
SDB_GET_INT8
(
pRaw
,
dataPos
,
&
pTopic
->
withTag
,
TOPIC_DECODE_OVER
);
SDB_GET_INT8
(
pRaw
,
dataPos
,
&
pTopic
->
withTagSchema
,
TOPIC_DECODE_OVER
);
SDB_GET_INT32
(
pRaw
,
dataPos
,
&
pTopic
->
sqlLen
,
TOPIC_DECODE_OVER
);
pTopic
->
sql
=
taosMemoryCalloc
(
pTopic
->
sqlLen
,
sizeof
(
char
));
...
...
@@ -234,6 +232,7 @@ void mndReleaseTopic(SMnode *pMnode, SMqTopicObj *pTopic) {
sdbRelease
(
pSdb
,
pTopic
);
}
#if 0
static SDbObj *mndAcquireDbByTopic(SMnode *pMnode, char *topicName) {
SName name = {0};
tNameFromString(&name, topicName, T_NAME_ACCT | T_NAME_DB | T_NAME_TABLE);
...
...
@@ -243,6 +242,7 @@ static SDbObj *mndAcquireDbByTopic(SMnode *pMnode, char *topicName) {
return mndAcquireDb(pMnode, db);
}
#endif
static
SDDropTopicReq
*
mndBuildDropTopicMsg
(
SMnode
*
pMnode
,
SVgObj
*
pVgroup
,
SMqTopicObj
*
pTopic
)
{
int32_t
contLen
=
sizeof
(
SDDropTopicReq
);
...
...
@@ -262,15 +262,11 @@ static SDDropTopicReq *mndBuildDropTopicMsg(SMnode *pMnode, SVgObj *pVgroup, SMq
}
static
int32_t
mndCheckCreateTopicReq
(
SCMCreateTopicReq
*
pCreate
)
{
if
(
pCreate
->
name
[
0
]
==
0
||
pCreate
->
sql
==
NULL
||
pCreate
->
sql
[
0
]
==
0
)
{
if
(
pCreate
->
name
[
0
]
==
0
||
pCreate
->
sql
==
NULL
||
pCreate
->
sql
[
0
]
==
0
||
pCreate
->
subscribeDbName
[
0
]
==
0
)
{
terrno
=
TSDB_CODE_MND_INVALID_TOPIC_OPTION
;
return
-
1
;
}
if
((
pCreate
->
ast
==
NULL
||
pCreate
->
ast
[
0
]
==
0
)
&&
pCreate
->
subscribeDbName
[
0
]
==
0
)
{
terrno
=
TSDB_CODE_MND_INVALID_TOPIC_OPTION
;
return
-
1
;
}
return
0
;
}
...
...
@@ -386,7 +382,7 @@ static int32_t mndProcessCreateTopicReq(SNodeMsg *pReq) {
goto
CREATE_TOPIC_OVER
;
}
pDb
=
mndAcquireDb
ByTopic
(
pMnode
,
createTopicReq
.
n
ame
);
pDb
=
mndAcquireDb
(
pMnode
,
createTopicReq
.
subscribeDbN
ame
);
if
(
pDb
==
NULL
)
{
terrno
=
TSDB_CODE_MND_DB_NOT_SELECTED
;
goto
CREATE_TOPIC_OVER
;
...
...
@@ -524,8 +520,11 @@ static int32_t mndRetrieveTopic(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pB
int32_t
cols
=
0
;
char
topicName
[
TSDB_TOPIC_NAME_LEN
+
VARSTR_HEADER_SIZE
]
=
{
0
};
tstrncpy
(
&
topicName
[
VARSTR_HEADER_SIZE
],
pTopic
->
name
,
TSDB_TOPIC_NAME_LEN
);
varDataSetLen
(
topicName
,
strlen
(
&
topicName
[
VARSTR_HEADER_SIZE
]));
SName
n
;
tNameFromString
(
&
n
,
pTopic
->
name
,
T_NAME_ACCT
|
T_NAME_DB
);
tNameGetDbName
(
&
n
,
varDataVal
(
topicName
));
varDataSetLen
(
topicName
,
strlen
(
varDataVal
(
topicName
)));
SColumnInfoData
*
pColInfo
=
taosArrayGet
(
pBlock
->
pDataBlock
,
cols
++
);
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
topicName
,
false
);
...
...
@@ -539,7 +538,7 @@ static int32_t mndRetrieveTopic(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pB
varDataSetLen
(
sql
,
strlen
(
&
sql
[
VARSTR_HEADER_SIZE
]));
colDataAppend
(
pColInfo
,
numOfRows
,
(
const
char
*
)
sql
,
false
);
taosMemoryFree
(
sql
);
//
taosMemoryFree(sql);
numOfRows
++
;
sdbRelease
(
pSdb
,
pTopic
);
...
...
source/dnode/mnode/impl/test/func/func.cpp
浏览文件 @
20085fea
...
...
@@ -22,17 +22,16 @@ class MndTestFunc : public ::testing::Test {
void
SetUp
()
override
{}
void
TearDown
()
override
{}
void
SetCode
(
SCreateFuncReq
*
pReq
,
const
char
*
pCode
);
void
SetCode
(
SCreateFuncReq
*
pReq
,
const
char
*
pCode
,
int32_t
size
);
void
SetComment
(
SCreateFuncReq
*
pReq
,
const
char
*
pComment
);
};
Testbase
MndTestFunc
::
test
;
void
MndTestFunc
::
SetCode
(
SCreateFuncReq
*
pReq
,
const
char
*
pCode
)
{
int32_t
len
=
strlen
(
pCode
);
pReq
->
pCode
=
(
char
*
)
taosMemoryCalloc
(
1
,
len
+
1
);
strcpy
(
pReq
->
pCode
,
pCode
);
pReq
->
codeLen
=
len
;
void
MndTestFunc
::
SetCode
(
SCreateFuncReq
*
pReq
,
const
char
*
pCode
,
int32_t
size
)
{
pReq
->
pCode
=
(
char
*
)
taosMemoryMalloc
(
size
);
memcpy
(
pReq
->
pCode
,
pCode
,
size
);
pReq
->
codeLen
=
size
;
}
void
MndTestFunc
::
SetComment
(
SCreateFuncReq
*
pReq
,
const
char
*
pComment
)
{
...
...
@@ -79,7 +78,7 @@ TEST_F(MndTestFunc, 02_Create_Func) {
{
SCreateFuncReq
createReq
=
{
0
};
strcpy
(
createReq
.
name
,
"f1"
);
SetCode
(
&
createReq
,
""
);
SetCode
(
&
createReq
,
""
,
1
);
SetComment
(
&
createReq
,
"comment1"
);
int32_t
contLen
=
tSerializeSCreateFuncReq
(
NULL
,
0
,
&
createReq
);
...
...
@@ -95,7 +94,7 @@ TEST_F(MndTestFunc, 02_Create_Func) {
{
SCreateFuncReq
createReq
=
{
0
};
strcpy
(
createReq
.
name
,
"f1"
);
SetCode
(
&
createReq
,
"code1"
);
SetCode
(
&
createReq
,
"code1"
,
6
);
SetComment
(
&
createReq
,
"comment1"
);
int32_t
contLen
=
tSerializeSCreateFuncReq
(
NULL
,
0
,
&
createReq
);
...
...
@@ -111,7 +110,7 @@ TEST_F(MndTestFunc, 02_Create_Func) {
{
SCreateFuncReq
createReq
=
{
0
};
strcpy
(
createReq
.
name
,
"f1"
);
SetCode
(
&
createReq
,
"code1"
);
SetCode
(
&
createReq
,
"code1"
,
6
);
SetComment
(
&
createReq
,
"comment1"
);
createReq
.
bufSize
=
TSDB_FUNC_BUF_SIZE
+
1
;
...
...
@@ -128,7 +127,7 @@ TEST_F(MndTestFunc, 02_Create_Func) {
for
(
int32_t
i
=
0
;
i
<
3
;
++
i
)
{
SCreateFuncReq
createReq
=
{
0
};
strcpy
(
createReq
.
name
,
"f1"
);
SetCode
(
&
createReq
,
"code1"
);
SetCode
(
&
createReq
,
"code1"
,
6
);
SetComment
(
&
createReq
,
"comment1"
);
createReq
.
bufSize
=
TSDB_FUNC_BUF_SIZE
+
1
;
createReq
.
igExists
=
0
;
...
...
@@ -253,7 +252,7 @@ TEST_F(MndTestFunc, 03_Retrieve_Func) {
createReq
.
outputLen
=
24
;
createReq
.
bufSize
=
6
;
createReq
.
signature
=
18
;
SetCode
(
&
createReq
,
"code2"
);
SetCode
(
&
createReq
,
"code2"
,
6
);
SetComment
(
&
createReq
,
"comment2"
);
int32_t
contLen
=
tSerializeSCreateFuncReq
(
NULL
,
0
,
&
createReq
);
...
...
@@ -439,3 +438,70 @@ TEST_F(MndTestFunc, 04_Drop_Func) {
test
.
SendShowReq
(
TSDB_MGMT_TABLE_FUNC
,
"user_functions"
,
""
);
EXPECT_EQ
(
test
.
GetShowRows
(),
1
);
}
TEST_F
(
MndTestFunc
,
05
_Actual_code
)
{
{
SCreateFuncReq
createReq
=
{
0
};
strcpy
(
createReq
.
name
,
"udf1"
);
char
code
[
300
]
=
{
0
};
for
(
int32_t
i
=
0
;
i
<
sizeof
(
code
);
++
i
)
{
code
[
i
]
=
(
i
)
%
20
;
}
SetCode
(
&
createReq
,
code
,
300
);
SetComment
(
&
createReq
,
"comment1"
);
createReq
.
bufSize
=
8
;
createReq
.
igExists
=
0
;
createReq
.
funcType
=
1
;
createReq
.
scriptType
=
2
;
createReq
.
outputType
=
TSDB_DATA_TYPE_SMALLINT
;
createReq
.
outputLen
=
12
;
createReq
.
bufSize
=
4
;
createReq
.
signature
=
5
;
int32_t
contLen
=
tSerializeSCreateFuncReq
(
NULL
,
0
,
&
createReq
);
void
*
pReq
=
rpcMallocCont
(
contLen
);
tSerializeSCreateFuncReq
(
pReq
,
contLen
,
&
createReq
);
tFreeSCreateFuncReq
(
&
createReq
);
SRpcMsg
*
pRsp
=
test
.
SendReq
(
TDMT_MND_CREATE_FUNC
,
pReq
,
contLen
);
ASSERT_NE
(
pRsp
,
nullptr
);
ASSERT_EQ
(
pRsp
->
code
,
0
);
}
{
SRetrieveFuncReq
retrieveReq
=
{
0
};
retrieveReq
.
numOfFuncs
=
1
;
retrieveReq
.
pFuncNames
=
taosArrayInit
(
1
,
TSDB_FUNC_NAME_LEN
);
taosArrayPush
(
retrieveReq
.
pFuncNames
,
"udf1"
);
int32_t
contLen
=
tSerializeSRetrieveFuncReq
(
NULL
,
0
,
&
retrieveReq
);
void
*
pReq
=
rpcMallocCont
(
contLen
);
tSerializeSRetrieveFuncReq
(
pReq
,
contLen
,
&
retrieveReq
);
tFreeSRetrieveFuncReq
(
&
retrieveReq
);
SRpcMsg
*
pRsp
=
test
.
SendReq
(
TDMT_MND_RETRIEVE_FUNC
,
pReq
,
contLen
);
ASSERT_NE
(
pRsp
,
nullptr
);
ASSERT_EQ
(
pRsp
->
code
,
0
);
SRetrieveFuncRsp
retrieveRsp
=
{
0
};
tDeserializeSRetrieveFuncRsp
(
pRsp
->
pCont
,
pRsp
->
contLen
,
&
retrieveRsp
);
EXPECT_EQ
(
retrieveRsp
.
numOfFuncs
,
1
);
EXPECT_EQ
(
retrieveRsp
.
numOfFuncs
,
(
int32_t
)
taosArrayGetSize
(
retrieveRsp
.
pFuncInfos
));
SFuncInfo
*
pFuncInfo
=
(
SFuncInfo
*
)
taosArrayGet
(
retrieveRsp
.
pFuncInfos
,
0
);
EXPECT_STREQ
(
pFuncInfo
->
name
,
"udf1"
);
EXPECT_EQ
(
pFuncInfo
->
funcType
,
1
);
EXPECT_EQ
(
pFuncInfo
->
scriptType
,
2
);
EXPECT_EQ
(
pFuncInfo
->
outputType
,
TSDB_DATA_TYPE_SMALLINT
);
EXPECT_EQ
(
pFuncInfo
->
outputLen
,
12
);
EXPECT_EQ
(
pFuncInfo
->
bufSize
,
4
);
EXPECT_EQ
(
pFuncInfo
->
signature
,
5
);
EXPECT_STREQ
(
"comment1"
,
pFuncInfo
->
pComment
);
for
(
int32_t
i
=
0
;
i
<
300
;
++
i
)
{
EXPECT_EQ
(
pFuncInfo
->
pCode
[
i
],
(
i
)
%
20
);
}
tFreeSRetrieveFuncRsp
(
&
retrieveRsp
);
}
}
\ No newline at end of file
source/dnode/qnode/src/qnode.c
浏览文件 @
20085fea
...
...
@@ -17,6 +17,7 @@
#include "qndInt.h"
#include "query.h"
#include "qworker.h"
//#include "tudf.h"
SQnode
*
qndOpen
(
const
SQnodeOpt
*
pOption
)
{
SQnode
*
pQnode
=
taosMemoryCalloc
(
1
,
sizeof
(
SQnode
));
...
...
@@ -25,6 +26,8 @@ SQnode *qndOpen(const SQnodeOpt *pOption) {
return
NULL
;
}
//udfcOpen();
if
(
qWorkerInit
(
NODE_TYPE_QNODE
,
pQnode
->
qndId
,
NULL
,
(
void
**
)
&
pQnode
->
pQuery
,
&
pOption
->
msgCb
))
{
taosMemoryFreeClear
(
pQnode
);
return
NULL
;
...
...
@@ -37,13 +40,15 @@ SQnode *qndOpen(const SQnodeOpt *pOption) {
void
qndClose
(
SQnode
*
pQnode
)
{
qWorkerDestroy
((
void
**
)
&
pQnode
->
pQuery
);
//udfcClose();
taosMemoryFree
(
pQnode
);
}
int32_t
qndGetLoad
(
SQnode
*
pQnode
,
SQnodeLoad
*
pLoad
)
{
return
0
;
}
int32_t
qndProcessQueryMsg
(
SQnode
*
pQnode
,
SRpcMsg
*
pMsg
)
{
qTrace
(
"message in query queue is processing"
);
qTrace
(
"message in q
node q
uery queue is processing"
);
SReadHandle
handle
=
{
0
};
switch
(
pMsg
->
msgType
)
{
...
...
source/dnode/vnode/src/inc/tq.h
浏览文件 @
20085fea
...
...
@@ -159,7 +159,6 @@ typedef struct {
int8_t
withTbName
;
int8_t
withSchema
;
int8_t
withTag
;
int8_t
withTagSchema
;
char
*
qmsg
;
STqPushHandle
pushHandle
;
// SRWLatch lock;
...
...
source/dnode/vnode/src/tq/tq.c
浏览文件 @
20085fea
...
...
@@ -31,6 +31,7 @@ STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
pTq
->
path
=
strdup
(
path
);
pTq
->
pVnode
=
pVnode
;
pTq
->
pWal
=
pWal
;
#if 0
pTq->tqMeta = tqStoreOpen(pTq, path, (FTqSerialize)tqSerializeConsumer, (FTqDeserialize)tqDeserializeConsumer,
(FTqDelete)taosMemoryFree, 0);
...
...
@@ -401,6 +402,13 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
consumerEpoch
=
atomic_val_compare_exchange_32
(
&
pExec
->
epoch
,
consumerEpoch
,
reqEpoch
);
}
SWalHead
*
pHeadWithCkSum
=
taosMemoryMalloc
(
sizeof
(
SWalHead
)
+
2048
);
if
(
pHeadWithCkSum
==
NULL
)
{
return
-
1
;
}
walSetReaderCapacity
(
pExec
->
pWalReader
,
2048
);
SMqDataBlkRsp
rsp
=
{
0
};
rsp
.
reqOffset
=
pReq
->
currentOffset
;
rsp
.
blockData
=
taosArrayInit
(
0
,
sizeof
(
void
*
));
...
...
@@ -414,6 +422,26 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
break
;
}
taosThreadMutexLock
(
&
pExec
->
pWalReader
->
mutex
);
if
(
walFetchHead
(
pExec
->
pWalReader
,
fetchOffset
,
pHeadWithCkSum
)
<
0
)
{
vDebug
(
"tmq poll: consumer %ld (epoch %d) vg %d offset %ld, no more log to return"
,
consumerId
,
pReq
->
epoch
,
TD_VID
(
pTq
->
pVnode
),
fetchOffset
);
taosThreadMutexUnlock
(
&
pExec
->
pWalReader
->
mutex
);
break
;
}
if
(
pHeadWithCkSum
->
head
.
msgType
!=
TDMT_VND_SUBMIT
)
{
walSkipFetchBody
(
pExec
->
pWalReader
,
pHeadWithCkSum
);
}
else
{
walFetchBody
(
pExec
->
pWalReader
,
&
pHeadWithCkSum
);
}
SWalReadHead
*
pHead
=
&
pHeadWithCkSum
->
head
;
taosThreadMutexUnlock
(
&
pExec
->
pWalReader
->
mutex
);
#if 0
SWalReadHead* pHead;
if (walReadWithHandle_s(pExec->pWalReader, fetchOffset, &pHead) < 0) {
// TODO: no more log, set timer to wait blocking time
...
...
@@ -443,14 +471,16 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
return 0;
#endif
break
;
}
break;
}
#endif
vDebug
(
"tmq poll: consumer %ld (epoch %d) iter log, vg %d offset %ld msgType %d"
,
consumerId
,
pReq
->
epoch
,
TD_VID
(
pTq
->
pVnode
),
fetchOffset
,
pHead
->
msgType
);
if
(
pHead
->
msgType
==
TDMT_VND_SUBMIT
)
{
SSubmitReq
*
pCont
=
(
SSubmitReq
*
)
&
pHead
->
body
;
// table subscribe
if
(
pExec
->
subType
==
TOPIC_SUB_TYPE__TABLE
)
{
qTaskInfo_t
task
=
pExec
->
task
[
workerId
];
ASSERT
(
task
);
...
...
@@ -484,6 +514,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
taosArrayPush
(
rsp
.
blockData
,
&
buf
);
rsp
.
blockNum
++
;
}
// db subscribe
}
else
if
(
pExec
->
subType
==
TOPIC_SUB_TYPE__DB
)
{
STqReadHandle
*
pReader
=
pExec
->
pExecReader
[
workerId
];
tqReadHandleSetMsg
(
pReader
,
pCont
,
0
);
...
...
@@ -789,7 +820,6 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
pExec
->
withTbName
=
req
.
withTbName
;
pExec
->
withSchema
=
req
.
withSchema
;
pExec
->
withTag
=
req
.
withTag
;
pExec
->
withTagSchema
=
req
.
withTagSchema
;
pExec
->
qmsg
=
req
.
qmsg
;
req
.
qmsg
=
NULL
;
...
...
source/dnode/vnode/src/tsdb/tsdbRead.c
浏览文件 @
20085fea
...
...
@@ -3223,8 +3223,13 @@ void tsdbRetrieveDataBlockInfo(tsdbReaderT* pTsdbReadHandle, SDataBlockInfo* pDa
tsdbDebug
(
"data block generated, uid:%"
PRIu64
" numOfRows:%d, tsrange:%"
PRId64
" - %"
PRId64
" %s"
,
uid
,
cur
->
rows
,
cur
->
win
.
skey
,
cur
->
win
.
ekey
,
pHandle
->
idStr
);
// pDataBlockInfo->uid = uid; // block Id may be over write by assigning uid fro this data block. Do NOT assign
// the table uid
pDataBlockInfo
->
uid
=
uid
;
#if 0
// for multi-group data query processing test purpose
pDataBlockInfo->groupId = uid;
#endif
pDataBlockInfo
->
rows
=
cur
->
rows
;
pDataBlockInfo
->
window
=
cur
->
win
;
pDataBlockInfo
->
numOfCols
=
(
int32_t
)(
QH_GET_NUM_OF_COLS
(
pHandle
));
...
...
source/dnode/vnode/src/vnd/vnodeSvr.c
浏览文件 @
20085fea
...
...
@@ -135,7 +135,7 @@ int vnodeProcessWriteReq(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRpcMsg
}
int
vnodeProcessQueryMsg
(
SVnode
*
pVnode
,
SRpcMsg
*
pMsg
)
{
vTrace
(
"message in query queue is processing"
);
vTrace
(
"message in
vnode
query queue is processing"
);
SReadHandle
handle
=
{.
reader
=
pVnode
->
pTsdb
,
.
meta
=
pVnode
->
pMeta
,
.
config
=
&
pVnode
->
config
};
switch
(
pMsg
->
msgType
)
{
...
...
source/libs/catalog/src/catalog.c
浏览文件 @
20085fea
...
...
@@ -494,7 +494,7 @@ _return:
return
TSDB_CODE_SUCCESS
;
}
int32_t
ctgGetQnodeListFromMnode
(
SCatalog
*
pCtg
,
void
*
pRpc
,
const
SEpSet
*
pMgmtEps
,
SArray
*
*
out
)
{
int32_t
ctgGetQnodeListFromMnode
(
SCatalog
*
pCtg
,
void
*
pRpc
,
const
SEpSet
*
pMgmtEps
,
SArray
*
out
)
{
char
*
msg
=
NULL
;
int32_t
msgLen
=
0
;
...
...
@@ -526,7 +526,7 @@ int32_t ctgGetQnodeListFromMnode(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmt
CTG_ERR_RET
(
code
);
}
ctgDebug
(
"Got qnode list from mnode, listNum:%d"
,
(
int32_t
)
taosArrayGetSize
(
*
out
));
ctgDebug
(
"Got qnode list from mnode, listNum:%d"
,
(
int32_t
)
taosArrayGetSize
(
out
));
return
TSDB_CODE_SUCCESS
;
}
...
...
@@ -2778,7 +2778,8 @@ int32_t catalogGetAllMeta(SCatalog* pCtg, void *pTrans, const SEpSet* pMgmtEps,
}
if
(
pReq
->
qNodeRequired
)
{
CTG_ERR_JRET
(
ctgGetQnodeListFromMnode
(
pCtg
,
pTrans
,
pMgmtEps
,
&
pRsp
->
pEpSetList
));
pRsp
->
pQnodeList
=
taosArrayInit
(
10
,
sizeof
(
SQueryNodeAddr
));
CTG_ERR_JRET
(
ctgGetQnodeListFromMnode
(
pCtg
,
pTrans
,
pMgmtEps
,
pRsp
->
pQnodeList
));
}
CTG_API_LEAVE
(
TSDB_CODE_SUCCESS
);
...
...
@@ -2807,7 +2808,7 @@ int32_t catalogGetQnodeList(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps,
CTG_API_LEAVE
(
TSDB_CODE_CTG_INVALID_INPUT
);
}
CTG_ERR_JRET
(
ctgGetQnodeListFromMnode
(
pCtg
,
pRpc
,
pMgmtEps
,
&
pQnodeList
));
CTG_ERR_JRET
(
ctgGetQnodeListFromMnode
(
pCtg
,
pRpc
,
pMgmtEps
,
pQnodeList
));
_return:
...
...
source/libs/command/src/explain.c
浏览文件 @
20085fea
...
...
@@ -304,8 +304,8 @@ int32_t qExplainResAppendRow(SExplainCtx *ctx, char *tbuf, int32_t len, int32_t
memcpy
(
row
.
buf
,
tbuf
,
len
);
row
.
level
=
level
;
row
.
len
=
len
;
ctx
->
dataSize
+=
len
;
row
.
len
=
len
;
ctx
->
dataSize
+=
row
.
len
;
if
(
NULL
==
taosArrayPush
(
ctx
->
rows
,
&
row
))
{
qError
(
"taosArrayPush row to explain res rows failed"
);
...
...
@@ -756,7 +756,7 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
}
int32_t
colNum
=
1
;
int32_t
rspSize
=
sizeof
(
SRetrieveTableRsp
)
+
sizeof
(
int32_t
)
*
colNum
+
sizeof
(
int32_t
)
*
rowNum
+
pCtx
->
dataSize
;
int32_t
rspSize
=
sizeof
(
SRetrieveTableRsp
)
+
sizeof
(
int32_t
)
+
sizeof
(
uint64_t
)
+
sizeof
(
int32_t
)
*
colNum
+
sizeof
(
int32_t
)
*
rowNum
+
pCtx
->
dataSize
;
SRetrieveTableRsp
*
rsp
=
(
SRetrieveTableRsp
*
)
taosMemoryCalloc
(
1
,
rspSize
);
if
(
NULL
==
rsp
)
{
qError
(
"malloc SRetrieveTableRsp failed, size:%d"
,
rspSize
);
...
...
@@ -766,29 +766,38 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
rsp
->
completed
=
1
;
rsp
->
numOfRows
=
htonl
(
rowNum
);
*
(
int32_t
*
)
rsp
->
data
=
htonl
(
pCtx
->
dataSize
);
// payload length
*
(
int32_t
*
)
rsp
->
data
=
sizeof
(
int32_t
)
+
sizeof
(
uint64_t
)
+
sizeof
(
int32_t
)
*
colNum
+
sizeof
(
int32_t
)
*
rowNum
+
pCtx
->
dataSize
;
int32_t
*
offset
=
(
int32_t
*
)((
char
*
)
rsp
->
data
+
sizeof
(
int32_t
));
// group id
*
(
uint64_t
*
)(
rsp
->
data
+
sizeof
(
int32_t
))
=
0
;
// column length
int32_t
*
colLength
=
(
int32_t
*
)(
rsp
->
data
+
sizeof
(
int32_t
)
+
sizeof
(
uint64_t
));
// varchar column offset segment
int32_t
*
offset
=
(
int32_t
*
)((
char
*
)
colLength
+
sizeof
(
int32_t
));
// varchar data real payload
char
*
data
=
(
char
*
)(
offset
+
rowNum
);
int32_t
tOffset
=
0
;
char
*
start
=
data
;
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
SQueryExplainRowInfo
*
row
=
taosArrayGet
(
pCtx
->
rows
,
i
);
*
offset
=
tOffset
;
tOffset
+=
row
->
len
;
offset
[
i
]
=
data
-
start
;
memcpy
(
data
,
row
->
buf
,
row
->
len
);
++
offset
;
varDataCopy
(
data
,
row
->
buf
);
ASSERT
(
varDataTLen
(
row
->
buf
)
==
row
->
len
);
data
+=
row
->
len
;
}
*
pRsp
=
rsp
;
*
colLength
=
htonl
(
data
-
start
);
rsp
->
compLen
=
htonl
(
rspSize
);
*
pRsp
=
rsp
;
return
TSDB_CODE_SUCCESS
;
}
int32_t
qExplainPrepareCtx
(
SQueryPlan
*
pDag
,
SExplainCtx
**
pCtx
)
{
int32_t
code
=
0
;
SNodeListNode
*
plans
=
NULL
;
...
...
@@ -895,9 +904,7 @@ int32_t qExplainAppendPlanRows(SExplainCtx *pCtx) {
int32_t
qExplainGenerateRsp
(
SExplainCtx
*
pCtx
,
SRetrieveTableRsp
**
pRsp
)
{
QRY_ERR_RET
(
qExplainAppendGroupResRows
(
pCtx
,
pCtx
->
rootGroupId
,
0
));
QRY_ERR_RET
(
qExplainAppendPlanRows
(
pCtx
));
QRY_ERR_RET
(
qExplainGetRspFromCtx
(
pCtx
,
pRsp
));
return
TSDB_CODE_SUCCESS
;
...
...
@@ -967,13 +974,10 @@ int32_t qExecStaticExplain(SQueryPlan *pDag, SRetrieveTableRsp **pRsp) {
SExplainCtx
*
pCtx
=
NULL
;
QRY_ERR_RET
(
qExplainPrepareCtx
(
pDag
,
&
pCtx
));
QRY_ERR_JRET
(
qExplainGenerateRsp
(
pCtx
,
pRsp
));
_return:
qExplainFreeCtx
(
pCtx
);
QRY_RET
(
code
);
}
...
...
source/libs/executor/inc/executil.h
浏览文件 @
20085fea
...
...
@@ -40,8 +40,6 @@
#define GET_TASKID(_t) (((SExecTaskInfo*)(_t))->id.str)
#define curTimeWindowIndex(_winres) ((_winres)->curIndex)
typedef
struct
SGroupResInfo
{
int32_t
totalGroup
;
int32_t
currentGroup
;
...
...
@@ -68,11 +66,16 @@ typedef struct SResultRowPosition {
int32_t
offset
;
}
SResultRowPosition
;
typedef
struct
SResKeyPos
{
SResultRowPosition
pos
;
uint64_t
groupId
;
char
key
[];
}
SResKeyPos
;
typedef
struct
SResultRowInfo
{
SResultRowPosition
*
pPosition
;
int32_t
size
;
// number of result set
int32_t
capacity
;
// max capacity
// int32_t curPos; // current active result row index of pResult list
SResultRowPosition
cur
;
}
SResultRowInfo
;
...
...
@@ -135,7 +138,7 @@ typedef struct {
int32_t
colId
;
}
SStddevInterResult
;
void
initGroup
ResInfo
(
SGroupResInfo
*
pGroupResInfo
,
SResultRowInfo
*
pResultInfo
);
void
initGroup
edResultInfo
(
SGroupResInfo
*
pGroupResInfo
,
SHashObj
*
pHashmap
,
bool
sortGroupResult
);
void
initMultiResInfoFromArrayList
(
SGroupResInfo
*
pGroupResInfo
,
SArray
*
pArrayList
);
void
cleanupGroupResInfo
(
SGroupResInfo
*
pGroupResInfo
);
...
...
source/libs/executor/inc/executorimpl.h
浏览文件 @
20085fea
...
...
@@ -347,10 +347,11 @@ typedef struct STableScanInfo {
}
STableScanInfo
;
typedef
struct
STagScanInfo
{
SColumnInfo
*
pCols
;
SSDataBlock
*
pRes
;
SColumnInfo
*
pCols
;
SSDataBlock
*
pRes
;
int32_t
totalTables
;
int32_t
curPos
;
void
*
pReader
;
}
STagScanInfo
;
typedef
struct
SStreamBlockScanInfo
{
...
...
@@ -376,13 +377,11 @@ typedef struct SSysTableScanInfo {
SEpSet
epSet
;
tsem_t
ready
;
int32_t
accountId
;
bool
showRewrite
;
SNode
*
pCondition
;
// db_name filter condition, to discard data that are not in current database
void
*
pCur
;
// cursor for iterate the local table meta store.
SArray
*
scanCols
;
// SArray<int16_t> scan column id list
// int32_t type; // show type, TODO remove it
int32_t
accountId
;
bool
showRewrite
;
SNode
*
pCondition
;
// db_name filter condition, to discard data that are not in current database
void
*
pCur
;
// cursor for iterate the local table meta store.
SArray
*
scanCols
;
// SArray<int16_t> scan column id list
SName
name
;
SSDataBlock
*
pRes
;
int32_t
capacity
;
...
...
@@ -628,7 +627,7 @@ SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput,
SOperatorInfo
*
createExchangeOperatorInfo
(
const
SNodeList
*
pSources
,
SSDataBlock
*
pBlock
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createTableScanOperatorInfo
(
void
*
p
TsdbRead
Handle
,
int32_t
order
,
int32_t
numOfCols
,
int32_t
dataLoadFlag
,
int32_t
repeatTime
,
SOperatorInfo
*
createTableScanOperatorInfo
(
void
*
p
Reader
Handle
,
int32_t
order
,
int32_t
numOfCols
,
int32_t
dataLoadFlag
,
int32_t
repeatTime
,
int32_t
reverseTime
,
SArray
*
pColMatchInfo
,
SSDataBlock
*
pResBlock
,
SNode
*
pCondition
,
SInterval
*
pInterval
,
double
ratio
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createAggregateOperatorInfo
(
SOperatorInfo
*
downstream
,
SExprInfo
*
pExprInfo
,
int32_t
numOfCols
,
SSDataBlock
*
pResultBlock
,
SExprInfo
*
pScalarExprInfo
,
...
...
@@ -668,12 +667,12 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SExprInfo*
SSDataBlock
*
pResultBlock
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createJoinOperatorInfo
(
SOperatorInfo
**
pDownstream
,
int32_t
numOfDownstream
,
SExprInfo
*
pExprInfo
,
int32_t
numOfCols
,
SSDataBlock
*
pResBlock
,
SNode
*
pOnCondition
,
SExecTaskInfo
*
pTaskInfo
);
SOperatorInfo
*
createTagScanOperatorInfo
(
void
*
pReaderHandle
,
SExprInfo
*
pExpr
,
int32_t
numOfOutput
,
SExecTaskInfo
*
pTaskInfo
);
#if 0
SOperatorInfo* createTableSeqScanOperatorInfo(void* pTsdbReadHandle, STaskRuntimeEnv* pRuntimeEnv);
SOperatorInfo* createMultiTableTimeIntervalOperatorInfo(STaskRuntimeEnv* pRuntimeEnv, SOperatorInfo* downstream,
SExprInfo* pExpr, int32_t numOfOutput);
SOperatorInfo* createTagScanOperatorInfo(SReaderHandle* pReaderHandle, SExprInfo* pExpr, int32_t numOfOutput);
#endif
void
projectApplyFunctions
(
SExprInfo
*
pExpr
,
SSDataBlock
*
pResult
,
SSDataBlock
*
pSrcBlock
,
SqlFunctionCtx
*
pCtx
,
...
...
source/libs/executor/src/dataDispatcher.c
浏览文件 @
20085fea
...
...
@@ -64,10 +64,10 @@ static bool needCompress(const SSDataBlock* pData, int32_t numOfCols) {
}
// data format:
// +----------------+--------------------------------------+-------------+-----------+-------------+-----------+
// |SDataCacheEntry | column#1 length, column#2 length ... | col1 bitmap | col1 data | col2 bitmap | col2 data | ....
// | |
sizeof(int32_t) * numOfCols
| actual size | | actual size | |
// +----------------+--------------------------------------+-------------+-----------+-------------+-----------+
// +----------------+--------------
+----------+--------------
------------------------+-------------+-----------+-------------+-----------+
// |SDataCacheEntry |
total length | group id |
column#1 length, column#2 length ... | col1 bitmap | col1 data | col2 bitmap | col2 data | ....
// | |
(4 bytes) |(8 bytes) | sizeof(int32_t) * numOfCols
| actual size | | actual size | |
// +----------------+--------------
+----------+--------------
------------------------+-------------+-----------+-------------+-----------+
// The length of bitmap is decided by number of rows of this data block, and the length of each column data is
// recorded in the first segment, next to the struct header
static
void
toDataCacheEntry
(
const
SDataDispatchHandle
*
pHandle
,
const
SInputData
*
pInput
,
SDataDispatchBuf
*
pBuf
)
{
...
...
source/libs/executor/src/executil.c
浏览文件 @
20085fea
...
...
@@ -186,12 +186,50 @@ void cleanupGroupResInfo(SGroupResInfo* pGroupResInfo) {
pGroupResInfo
->
index
=
0
;
}
void
initGroupResInfo
(
SGroupResInfo
*
pGroupResInfo
,
SResultRowInfo
*
pResultInfo
)
{
static
int32_t
resultrowCompar1
(
const
void
*
p1
,
const
void
*
p2
)
{
SResKeyPos
*
pp1
=
*
(
SResKeyPos
**
)
p1
;
SResKeyPos
*
pp2
=
*
(
SResKeyPos
**
)
p2
;
if
(
pp1
->
groupId
==
pp2
->
groupId
)
{
int64_t
pts1
=
*
(
int64_t
*
)
pp1
->
key
;
int64_t
pts2
=
*
(
int64_t
*
)
pp2
->
key
;
if
(
pts1
==
pts2
)
{
return
0
;
}
else
{
return
pts1
<
pts2
?
-
1
:
1
;
}
}
else
{
return
pp1
->
groupId
<
pp2
->
groupId
?
-
1
:
1
;
}
}
void
initGroupedResultInfo
(
SGroupResInfo
*
pGroupResInfo
,
SHashObj
*
pHashmap
,
bool
sortGroupResult
)
{
if
(
pGroupResInfo
->
pRows
!=
NULL
)
{
taosArrayDestroy
(
pGroupResInfo
->
pRows
);
}
pGroupResInfo
->
pRows
=
taosArrayFromList
(
pResultInfo
->
pPosition
,
pResultInfo
->
size
,
sizeof
(
SResultRowPosition
));
// extract the result rows information from the hash map
void
*
pData
=
NULL
;
pGroupResInfo
->
pRows
=
taosArrayInit
(
10
,
POINTER_BYTES
);
size_t
keyLen
=
0
;
while
((
pData
=
taosHashIterate
(
pHashmap
,
pData
))
!=
NULL
)
{
void
*
key
=
taosHashGetKey
(
pData
,
&
keyLen
);
SResKeyPos
*
p
=
taosMemoryMalloc
(
keyLen
+
sizeof
(
SResultRowPosition
));
p
->
groupId
=
*
(
uint64_t
*
)
key
;
p
->
pos
=
*
(
SResultRowPosition
*
)
pData
;
memcpy
(
p
->
key
,
key
+
sizeof
(
uint64_t
),
keyLen
-
sizeof
(
uint64_t
));
taosArrayPush
(
pGroupResInfo
->
pRows
,
&
p
);
}
if
(
sortGroupResult
)
{
qsort
(
pGroupResInfo
->
pRows
->
pData
,
taosArrayGetSize
(
pGroupResInfo
->
pRows
),
POINTER_BYTES
,
resultrowCompar1
);
}
pGroupResInfo
->
index
=
0
;
assert
(
pGroupResInfo
->
index
<=
getNumOfTotalRes
(
pGroupResInfo
));
}
...
...
source/libs/executor/src/executorimpl.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/libs/executor/src/groupoperator.c
浏览文件 @
20085fea
...
...
@@ -308,7 +308,7 @@ static SSDataBlock* hashGroupbyAggregate(SOperatorInfo* pOperator, bool* newgrou
// }
blockDataEnsureCapacity
(
pRes
,
pOperator
->
resultInfo
.
capacity
);
initGroup
ResInfo
(
&
pInfo
->
groupResInfo
,
&
pInfo
->
binfo
.
resultRowInfo
);
initGroup
edResultInfo
(
&
pInfo
->
groupResInfo
,
pInfo
->
aggSup
.
pResultRowHashTable
,
false
);
while
(
1
)
{
doBuildResultDatablock
(
pRes
,
&
pInfo
->
groupResInfo
,
pOperator
->
pExpr
,
pInfo
->
aggSup
.
pResultBuf
,
pInfo
->
binfo
.
rowCellInfoOffset
,
pInfo
->
binfo
.
pCtx
);
...
...
source/libs/executor/src/scanoperator.c
浏览文件 @
20085fea
...
...
@@ -271,9 +271,7 @@ static void setupEnvForReverseScan(STableScanInfo* pTableScanInfo, SqlFunctionCt
static
SSDataBlock
*
doTableScanImpl
(
SOperatorInfo
*
pOperator
,
bool
*
newgroup
)
{
STableScanInfo
*
pTableScanInfo
=
pOperator
->
info
;
SSDataBlock
*
pBlock
=
pTableScanInfo
->
pResBlock
;
STableGroupInfo
*
pTableGroupInfo
=
&
pOperator
->
pTaskInfo
->
tableqinfoGroupInfo
;
SSDataBlock
*
pBlock
=
pTableScanInfo
->
pResBlock
;
*
newgroup
=
false
;
while
(
tsdbNextDataBlock
(
pTableScanInfo
->
dataReader
))
{
...
...
@@ -284,18 +282,6 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator, bool* newgroup) {
pTableScanInfo
->
numOfBlocks
+=
1
;
tsdbRetrieveDataBlockInfo
(
pTableScanInfo
->
dataReader
,
&
pBlock
->
info
);
// todo opt
// if (pTableGroupInfo->numOfTables > 1 || (pRuntimeEnv->current == NULL && pTableGroupInfo->numOfTables == 1)) {
// STableQueryInfo** pTableQueryInfo =
// (STableQueryInfo**)taosHashGet(pTableGroupInfo->map, &pBlock->info.uid, sizeof(pBlock->info.uid));
// if (pTableQueryInfo == NULL) {
// break;
// }
//
// doTableQueryInfoTimeWindowCheck(pTaskInfo, *pTableQueryInfo, pTableScanInfo->order);
// }
// this function never returns error?
uint32_t
status
=
0
;
int32_t
code
=
loadDataBlock
(
pOperator
,
pTableScanInfo
,
pBlock
,
&
status
);
// int32_t code = loadDataBlockOnDemand(pOperator->pRuntimeEnv, pTableScanInfo, pBlock, &status);
...
...
@@ -308,6 +294,8 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator, bool* newgroup) {
continue
;
}
// reset the block to be 0 by default, this blockId is assigned by physical plan and is used by direct upstream operator.
pBlock
->
info
.
blockId
=
0
;
return
pBlock
;
}
...
...
@@ -405,11 +393,11 @@ SOperatorInfo* createTableScanOperatorInfo(void* pDataReader, int32_t order, int
pOperator
->
name
=
"TableScanOperator"
;
pOperator
->
operatorType
=
QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN
;
pOperator
->
blockingOptr
=
false
;
pOperator
->
status
=
OP_NOT_OPENED
;
pOperator
->
info
=
pInfo
;
pOperator
->
numOfOutput
=
numOfOutput
;
pOperator
->
getNextFn
=
doTableScan
;
pOperator
->
pTaskInfo
=
pTaskInfo
;
pOperator
->
status
=
OP_NOT_OPENED
;
pOperator
->
info
=
pInfo
;
pOperator
->
numOfOutput
=
numOfOutput
;
pOperator
->
getNextFn
=
doTableScan
;
pOperator
->
pTaskInfo
=
pTaskInfo
;
static
int32_t
cost
=
0
;
pOperator
->
cost
.
openCost
=
++
cost
;
...
...
@@ -824,12 +812,12 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator, bool* newgroup) {
int32_t
tableNameSlotId
=
1
;
SColumnInfoData
*
pTableNameCol
=
taosArrayGet
(
pInfo
->
pRes
->
pDataBlock
,
tableNameSlotId
);
char
*
name
=
NULL
;
char
*
tb
=
NULL
;
int32_t
numOfRows
=
0
;
char
n
[
TSDB_TABLE_NAME_LEN
]
=
{
0
};
while
((
name
=
metaTbCursorNext
(
pInfo
->
pCur
))
!=
NULL
)
{
STR_TO_VARSTR
(
n
,
name
);
while
((
tb
=
metaTbCursorNext
(
pInfo
->
pCur
))
!=
NULL
)
{
STR_TO_VARSTR
(
n
,
tb
);
colDataAppend
(
pTableNameCol
,
numOfRows
,
n
,
false
);
numOfRows
+=
1
;
if
(
numOfRows
>=
pInfo
->
capacity
)
{
...
...
@@ -992,3 +980,167 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, SSDataB
return
pOperator
;
}
static
SSDataBlock
*
doTagScan
(
SOperatorInfo
*
pOperator
,
bool
*
newgroup
)
{
#if 0
SOperatorInfo* pOperator = (SOperatorInfo*) param;
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
}
int32_t maxNumOfTables = (int32_t)pResultInfo->capacity;
STagScanInfo *pInfo = pOperator->info;
SSDataBlock *pRes = pInfo->pRes;
*newgroup = false;
int32_t count = 0;
SArray* pa = GET_TABLEGROUP(pRuntimeEnv, 0);
int32_t functionId = getExprFunctionId(&pOperator->pExpr[0]);
if (functionId == FUNCTION_TID_TAG) { // return the tags & table Id
assert(pQueryAttr->numOfOutput == 1);
SExprInfo* pExprInfo = &pOperator->pExpr[0];
int32_t rsize = pExprInfo->base.resSchema.bytes;
count = 0;
int16_t bytes = pExprInfo->base.resSchema.bytes;
int16_t type = pExprInfo->base.resSchema.type;
for(int32_t i = 0; i < pQueryAttr->numOfTags; ++i) {
if (pQueryAttr->tagColList[i].colId == pExprInfo->base.pColumns->info.colId) {
bytes = pQueryAttr->tagColList[i].bytes;
type = pQueryAttr->tagColList[i].type;
break;
}
}
SColumnInfoData* pColInfo = taosArrayGet(pRes->pDataBlock, 0);
while(pInfo->curPos < pInfo->totalTables && count < maxNumOfTables) {
int32_t i = pInfo->curPos++;
STableQueryInfo *item = taosArrayGetP(pa, i);
char *output = pColInfo->pData + count * rsize;
varDataSetLen(output, rsize - VARSTR_HEADER_SIZE);
output = varDataVal(output);
STableId* id = TSDB_TABLEID(item->pTable);
*(int16_t *)output = 0;
output += sizeof(int16_t);
*(int64_t *)output = id->uid; // memory align problem, todo serialize
output += sizeof(id->uid);
*(int32_t *)output = id->tid;
output += sizeof(id->tid);
*(int32_t *)output = pQueryAttr->vgId;
output += sizeof(pQueryAttr->vgId);
char* data = NULL;
if (pExprInfo->base.pColumns->info.colId == TSDB_TBNAME_COLUMN_INDEX) {
data = tsdbGetTableName(item->pTable);
} else {
data = tsdbGetTableTagVal(item->pTable, pExprInfo->base.pColumns->info.colId, type, bytes);
}
doSetTagValueToResultBuf(output, data, type, bytes);
count += 1;
}
//qDebug("QInfo:0x%"PRIx64" create (tableId, tag) info completed, rows:%d", GET_TASKID(pRuntimeEnv), count);
} else if (functionId == FUNCTION_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:0x%"PRIx64" create count(tbname) query, res:%d rows:1", GET_TASKID(pRuntimeEnv), count);
} else { // return only the tags|table name etc.
SExprInfo* pExprInfo = &pOperator->pExpr[0]; // todo use the column list instead of exprinfo
count = 0;
while(pInfo->curPos < pInfo->totalTables && count < maxNumOfTables) {
int32_t i = pInfo->curPos++;
STableQueryInfo* item = taosArrayGetP(pa, i);
char *data = NULL, *dst = NULL;
int16_t type = 0, bytes = 0;
for(int32_t j = 0; j < pOperator->numOfOutput; ++j) {
// not assign value in case of user defined constant output column
if (TSDB_COL_IS_UD_COL(pExprInfo[j].base.pColumns->flag)) {
continue;
}
SColumnInfoData* pColInfo = taosArrayGet(pRes->pDataBlock, j);
type = pExprInfo[j].base.resSchema.type;
bytes = pExprInfo[j].base.resSchema.bytes;
if (pExprInfo[j].base.pColumns->info.colId == TSDB_TBNAME_COLUMN_INDEX) {
data = tsdbGetTableName(item->pTable);
} else {
data = tsdbGetTableTagVal(item->pTable, pExprInfo[j].base.pColumns->info.colId, type, bytes);
}
dst = pColInfo->pData + count * pExprInfo[j].base.resSchema.bytes;
doSetTagValueToResultBuf(dst, data, type, bytes);
}
count += 1;
}
if (pInfo->curPos >= pInfo->totalTables) {
pOperator->status = OP_EXEC_DONE;
}
//qDebug("QInfo:0x%"PRIx64" create tag values results completed, rows:%d", GET_TASKID(pRuntimeEnv), count);
}
if (pOperator->status == OP_EXEC_DONE) {
setTaskStatus(pOperator->pRuntimeEnv, TASK_COMPLETED);
}
pRes->info.rows = count;
return (pRes->info.rows == 0)? NULL:pInfo->pRes;
#endif
return
TSDB_CODE_SUCCESS
;
}
static
void
destroyTagScanOperatorInfo
(
void
*
param
,
int32_t
numOfOutput
)
{
STagScanInfo
*
pInfo
=
(
STagScanInfo
*
)
param
;
pInfo
->
pRes
=
blockDataDestroy
(
pInfo
->
pRes
);
}
SOperatorInfo
*
createTagScanOperatorInfo
(
void
*
pReaderHandle
,
SExprInfo
*
pExpr
,
int32_t
numOfOutput
,
SExecTaskInfo
*
pTaskInfo
)
{
STagScanInfo
*
pInfo
=
taosMemoryCalloc
(
1
,
sizeof
(
STagScanInfo
));
SOperatorInfo
*
pOperator
=
taosMemoryCalloc
(
1
,
sizeof
(
SOperatorInfo
));
if
(
pInfo
==
NULL
||
pOperator
==
NULL
)
{
goto
_error
;
}
pInfo
->
pReader
=
pReaderHandle
;
pInfo
->
curPos
=
0
;
pOperator
->
name
=
"TagScanOperator"
;
pOperator
->
operatorType
=
QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN
;
pOperator
->
blockingOptr
=
false
;
pOperator
->
status
=
OP_NOT_OPENED
;
pOperator
->
info
=
pInfo
;
pOperator
->
getNextFn
=
doTagScan
;
pOperator
->
pExpr
=
pExpr
;
pOperator
->
numOfOutput
=
numOfOutput
;
pOperator
->
pTaskInfo
=
pTaskInfo
;
pOperator
->
closeFn
=
destroyTagScanOperatorInfo
;
return
pOperator
;
_error:
taosMemoryFree
(
pInfo
);
taosMemoryFree
(
pOperator
);
terrno
=
TSDB_CODE_OUT_OF_MEMORY
;
return
NULL
;
}
source/libs/function/inc/builtinsimpl.h
浏览文件 @
20085fea
...
...
@@ -24,7 +24,7 @@ extern "C" {
#include "functionMgt.h"
bool
functionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
int32_t
functionFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
);
int32_t
functionFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
EFuncDataRequired
countDataRequired
(
SFunctionNode
*
pFunc
,
STimeWindow
*
pTimeWindow
);
bool
getCountFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
...
...
@@ -43,17 +43,17 @@ int32_t maxFunction(SqlFunctionCtx *pCtx);
bool
getAvgFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
bool
avgFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
int32_t
avgFunction
(
SqlFunctionCtx
*
pCtx
);
int32_t
avgFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
);
int32_t
avgFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
bool
getStddevFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
bool
stddevFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
int32_t
stddevFunction
(
SqlFunctionCtx
*
pCtx
);
int32_t
stddevFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
);
int32_t
stddevFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
bool
getPercentileFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
bool
percentileFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResultInfo
);
int32_t
percentileFunction
(
SqlFunctionCtx
*
pCtx
);
int32_t
percentileFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
);
int32_t
percentileFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
bool
getDiffFuncEnv
(
struct
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
);
bool
diffFunctionSetup
(
SqlFunctionCtx
*
pCtx
,
SResultRowEntryInfo
*
pResInfo
);
...
...
@@ -65,7 +65,7 @@ int32_t lastFunction(SqlFunctionCtx *pCtx);
bool
getTopBotFuncEnv
(
SFunctionNode
*
UNUSED_PARAM
(
pFunc
),
SFuncExecEnv
*
pEnv
);
int32_t
topFunction
(
SqlFunctionCtx
*
pCtx
);
int32_t
topBotFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
);
int32_t
topBotFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
);
#ifdef __cplusplus
}
...
...
source/libs/function/inc/tudf.h
浏览文件 @
20085fea
...
...
@@ -29,29 +29,20 @@ extern "C" {
#define UDF_LISTEN_PIPE_NAME_LEN 32
#define UDF_LISTEN_PIPE_NAME_PREFIX "udfd.sock."
#define UDF_DNODE_ID_ENV_NAME "DNODE_ID"
//======================================================================================
//begin API to taosd and qworker
enum
{
UDFC_CODE_STOPPING
=
-
1
,
UDFC_CODE_PIPE_READ_ERR
=
-
3
,
UDFC_CODE_PIPE_READ_ERR
=
-
2
,
UDFC_CODE_CONNECT_PIPE_ERR
=
-
3
,
UDFC_CODE_LOAD_UDF_FAILURE
=
-
4
,
UDFC_CODE_INVALID_STATE
=
-
5
};
typedef
void
*
UdfcHandle
;
typedef
void
*
UdfcFuncHandle
;
/**
* create udfd proxy, called once in process that call setupUdf/callUdfxxx/teardownUdf
* @return error code
*/
int32_t
udfcOpen
(
int32_t
dnodeId
,
UdfcHandle
*
proxyHandle
);
/**
* destroy udfd proxy
* @return error code
*/
int32_t
udfcClose
(
UdfcHandle
proxyhandle
);
/**
...
...
@@ -60,7 +51,7 @@ int32_t udfcClose(UdfcHandle proxyhandle);
* @param handle, out
* @return error code
*/
int32_t
setupUdf
(
UdfcHandle
proxyHandle
,
char
udfName
[],
SEpSet
*
epSet
,
UdfcFuncHandle
*
handle
);
int32_t
setupUdf
(
char
udfName
[]
,
UdfcFuncHandle
*
handle
);
typedef
struct
SUdfColumnMeta
{
int16_t
type
;
...
...
source/libs/function/inc/tudfInt.h
浏览文件 @
20085fea
...
...
@@ -39,7 +39,6 @@ enum {
typedef
struct
SUdfSetupRequest
{
char
udfName
[
TSDB_FUNC_NAME_LEN
];
SEpSet
epSet
;
}
SUdfSetupRequest
;
typedef
struct
SUdfSetupResponse
{
...
...
@@ -112,6 +111,7 @@ void freeUdfDataDataBlock(SUdfDataBlock *block);
int32_t
convertDataBlockToUdfDataBlock
(
SSDataBlock
*
block
,
SUdfDataBlock
*
udfBlock
);
int32_t
convertUdfColumnToDataBlock
(
SUdfColumn
*
udfCol
,
SSDataBlock
*
block
);
int32_t
getUdfdPipeName
(
char
*
pipeName
,
int32_t
size
);
#ifdef __cplusplus
}
#endif
...
...
source/libs/function/src/builtinsimpl.c
浏览文件 @
20085fea
...
...
@@ -14,7 +14,7 @@
*/
#include "builtinsimpl.h"
#include
<libs/nodes/querynodes.h>
#include
"function.h"
#include "querynodes.h"
#include "taggfunction.h"
#include "tdatablock.h"
...
...
@@ -44,8 +44,6 @@ typedef struct STopBotResItem {
}
STopBotResItem
;
typedef
struct
STopBotRes
{
int32_t
pageId
;
// int32_t num;
STopBotResItem
*
pItems
;
}
STopBotRes
;
...
...
@@ -92,18 +90,6 @@ typedef struct SDiffInfo {
} \
} while (0);
#define DO_UPDATE_SUBSID_RES(ctx, ts) \
do { \
for (int32_t _i = 0; _i < (ctx)->subsidiaryRes.numOfCols; ++_i) { \
SqlFunctionCtx *__ctx = (ctx)->subsidiaryRes.pCtx[_i]; \
if (__ctx->functionId == FUNCTION_TS_DUMMY) { \
__ctx->tag.i = (ts); \
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
} \
__ctx->fpSet.process(__ctx); \
} \
} while (0)
#define UPDATE_DATA(ctx, left, right, num, sign, _ts) \
do { \
if (((left) < (right)) ^ (sign)) { \
...
...
@@ -139,7 +125,8 @@ bool functionSetup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResultInfo) {
return
true
;
}
int32_t
functionFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
)
{
int32_t
functionFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
int32_t
slotId
=
pCtx
->
pExpr
->
base
.
resSchema
.
slotId
;
SColumnInfoData
*
pCol
=
taosArrayGet
(
pBlock
->
pDataBlock
,
slotId
);
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
...
...
@@ -406,7 +393,7 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
avgFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
)
{
int32_t
avgFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SInputColumnInfoData
*
pInput
=
&
pCtx
->
input
;
int32_t
type
=
pInput
->
pData
[
0
]
->
info
.
type
;
SAvgRes
*
pAvgRes
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
...
...
@@ -416,7 +403,7 @@ int32_t avgFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t slotId) {
pAvgRes
->
result
=
pAvgRes
->
sum
.
dsum
/
((
double
)
pAvgRes
->
count
);
}
return
functionFinalize
(
pCtx
,
pBlock
,
slotId
);
return
functionFinalize
(
pCtx
,
pBlock
);
}
EFuncDataRequired
statisDataRequired
(
SFunctionNode
*
pFunc
,
STimeWindow
*
pTimeWindow
){
...
...
@@ -521,6 +508,49 @@ bool getMinmaxFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
return
true
;
}
#define GET_TS_LIST(x) ((TSKEY*)((x)->ptsList))
#define GET_TS_DATA(x, y) (GET_TS_LIST(x)[(y)])
#define DO_UPDATE_TAG_COLUMNS_WITHOUT_TS(ctx) \
do { \
for (int32_t _i = 0; _i < (ctx)->tagInfo.numOfTagCols; ++_i) { \
SqlFunctionCtx *__ctx = (ctx)->tagInfo.pTagCtxList[_i]; \
__ctx->fpSet.process(__ctx); \
} \
} while (0);
#define DO_UPDATE_SUBSID_RES(ctx, ts) \
do { \
for (int32_t _i = 0; _i < (ctx)->subsidiaries.num; ++_i) { \
SqlFunctionCtx* __ctx = (ctx)->subsidiaries.pCtx[_i]; \
if (__ctx->functionId == FUNCTION_TS_DUMMY) { \
__ctx->tag.i = (ts); \
__ctx->tag.nType = TSDB_DATA_TYPE_BIGINT; \
} \
__ctx->fpSet.process(__ctx); \
} \
} while (0)
#define UPDATE_DATA(ctx, left, right, num, sign, _ts) \
do { \
if (((left) < (right)) ^ (sign)) { \
(left) = (right); \
DO_UPDATE_SUBSID_RES(ctx, _ts); \
(num) += 1; \
} \
} while (0)
#define LOOPCHECK_N(val, _col, ctx, _t, _nrow, _start, sign, num) \
do { \
_t *d = (_t *)((_col)->pData); \
for (int32_t i = (_start); i < (_nrow) + (_start); ++i) { \
if (((_col)->hasNull) && colDataIsNull_f((_col)->nullbitmap, i)) { \
continue; \
} \
TSKEY ts = (ctx)->ptsList != NULL ? GET_TS_DATA(ctx, i) : 0; \
UPDATE_DATA(ctx, val, d[i], num, sign, ts); \
} \
} while (0)
int32_t
doMinMaxHelper
(
SqlFunctionCtx
*
pCtx
,
int32_t
isMinFunc
)
{
int32_t
numOfElems
=
0
;
...
...
@@ -564,8 +594,8 @@ int32_t doMinMaxHelper(SqlFunctionCtx *pCtx, int32_t isMinFunc) {
int64_t
val
=
GET_INT64_VAL
(
tval
);
if
((
prev
<
val
)
^
isMinFunc
)
{
*
(
int64_t
*
)
buf
=
val
;
for
(
int32_t
i
=
0
;
i
<
(
pCtx
)
->
subsidiar
yRes
.
numOfCols
;
++
i
)
{
SqlFunctionCtx
*
__ctx
=
pCtx
->
subsidiar
yR
es
.
pCtx
[
i
];
for
(
int32_t
i
=
0
;
i
<
(
pCtx
)
->
subsidiar
ies
.
num
;
++
i
)
{
SqlFunctionCtx
*
__ctx
=
pCtx
->
subsidiar
i
es
.
pCtx
[
i
];
if
(
__ctx
->
functionId
==
FUNCTION_TS_DUMMY
)
{
// TODO refactor
__ctx
->
tag
.
i
=
key
;
__ctx
->
tag
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
...
...
@@ -581,8 +611,8 @@ int32_t doMinMaxHelper(SqlFunctionCtx *pCtx, int32_t isMinFunc) {
uint64_t
val
=
GET_UINT64_VAL
(
tval
);
if
((
prev
<
val
)
^
isMinFunc
)
{
*
(
uint64_t
*
)
buf
=
val
;
for
(
int32_t
i
=
0
;
i
<
(
pCtx
)
->
subsidiar
yRes
.
numOfCols
;
++
i
)
{
SqlFunctionCtx
*
__ctx
=
pCtx
->
subsidiar
yR
es
.
pCtx
[
i
];
for
(
int32_t
i
=
0
;
i
<
(
pCtx
)
->
subsidiar
ies
.
num
;
++
i
)
{
SqlFunctionCtx
*
__ctx
=
pCtx
->
subsidiar
i
es
.
pCtx
[
i
];
if
(
__ctx
->
functionId
==
FUNCTION_TS_DUMMY
)
{
// TODO refactor
__ctx
->
tag
.
i
=
key
;
__ctx
->
tag
.
nType
=
TSDB_DATA_TYPE_BIGINT
;
...
...
@@ -797,7 +827,7 @@ int32_t stddevFunction(SqlFunctionCtx* pCtx) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
stddevFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
)
{
int32_t
stddevFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SInputColumnInfoData
*
pInput
=
&
pCtx
->
input
;
int32_t
type
=
pInput
->
pData
[
0
]
->
info
.
type
;
SStddevRes
*
pStddevRes
=
GET_ROWCELL_INTERBUF
(
GET_RES_INFO
(
pCtx
));
...
...
@@ -810,7 +840,7 @@ int32_t stddevFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t slotId
pStddevRes
->
result
=
sqrt
(
pStddevRes
->
quadraticDSum
/
((
double
)
pStddevRes
->
count
)
-
avg
*
avg
);
}
return
functionFinalize
(
pCtx
,
pBlock
,
slotId
);
return
functionFinalize
(
pCtx
,
pBlock
);
}
bool
getPercentileFuncEnv
(
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
)
{
...
...
@@ -923,7 +953,7 @@ int32_t percentileFunction(SqlFunctionCtx *pCtx) {
return
TSDB_CODE_SUCCESS
;
}
int32_t
percentileFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
)
{
int32_t
percentileFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SVariant
*
pVal
=
&
pCtx
->
param
[
1
].
param
;
double
v
=
pVal
->
nType
==
TSDB_DATA_TYPE_INT
?
pVal
->
i
:
pVal
->
d
;
...
...
@@ -936,7 +966,7 @@ int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t sl
}
tMemBucketDestroy
(
pMemBucket
);
return
functionFinalize
(
pCtx
,
pBlock
,
slotId
);
return
functionFinalize
(
pCtx
,
pBlock
);
}
bool
getFirstLastFuncEnv
(
SFunctionNode
*
pFunc
,
SFuncExecEnv
*
pEnv
)
{
...
...
@@ -1353,15 +1383,16 @@ static STopBotRes *getTopBotOutputInfo(SqlFunctionCtx *pCtx) {
return
pRes
;
}
static
void
doAddIntoResult
(
S
TopBotRes
*
pRes
,
int32_t
maxSize
,
void
*
pData
,
int32_t
rowIndex
,
SSDataBlock
*
pSrcBlock
,
static
void
doAddIntoResult
(
S
qlFunctionCtx
*
pCtx
,
void
*
pData
,
int32_t
rowIndex
,
SSDataBlock
*
pSrcBlock
,
uint16_t
type
,
uint64_t
uid
,
SResultRowEntryInfo
*
pEntryInfo
);
static
void
saveTupleData
(
SqlFunctionCtx
*
pCtx
,
int32_t
rowIndex
,
const
SSDataBlock
*
pSrcBlock
,
STopBotResItem
*
pItem
);
static
void
copyTupleData
(
SqlFunctionCtx
*
pCtx
,
int32_t
rowIndex
,
const
SSDataBlock
*
pSrcBlock
,
STopBotResItem
*
pItem
);
int32_t
topFunction
(
SqlFunctionCtx
*
pCtx
)
{
int32_t
numOfElems
=
0
;
SResultRowEntryInfo
*
pResInfo
=
GET_RES_INFO
(
pCtx
);
STopBotRes
*
pRes
=
getTopBotOutputInfo
(
pCtx
);
// if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotRes) + POINTER_BYTES * pCtx->param[0].i)) {
// buildTopBotStruct(pRes, pCtx);
// }
...
...
@@ -1381,7 +1412,7 @@ int32_t topFunction(SqlFunctionCtx *pCtx) {
numOfElems
++
;
char
*
data
=
colDataGetData
(
pCol
,
i
);
doAddIntoResult
(
p
Res
,
pCtx
->
param
[
1
].
param
.
i
,
data
,
i
,
NULL
,
type
,
pInput
->
uid
,
pResInfo
);
doAddIntoResult
(
p
Ctx
,
data
,
i
,
pCtx
->
pSrcBlock
,
type
,
pInput
->
uid
,
pResInfo
);
}
return
TSDB_CODE_SUCCESS
;
...
...
@@ -1414,9 +1445,11 @@ static int32_t topBotResComparFn(const void *p1, const void *p2, const void *par
return
(
val1
->
v
.
d
>
val2
->
v
.
d
)
?
1
:
-
1
;
}
void
doAddIntoResult
(
SqlFunctionCtx
*
pCtx
,
void
*
pData
,
int32_t
rowIndex
,
SSDataBlock
*
pSrcBlock
,
uint16_t
type
,
uint64_t
uid
,
SResultRowEntryInfo
*
pEntryInfo
)
{
STopBotRes
*
pRes
=
getTopBotOutputInfo
(
pCtx
);
int32_t
maxSize
=
pCtx
->
param
[
1
].
param
.
i
;
void
doAddIntoResult
(
STopBotRes
*
pRes
,
int32_t
maxSize
,
void
*
pData
,
int32_t
rowIndex
,
SSDataBlock
*
pSrcBlock
,
uint16_t
type
,
uint64_t
uid
,
SResultRowEntryInfo
*
pEntryInfo
)
{
SVariant
val
=
{
0
};
taosVariantCreateFromBinary
(
&
val
,
pData
,
tDataTypes
[
type
].
bytes
,
type
);
...
...
@@ -1428,22 +1461,9 @@ void doAddIntoResult(STopBotRes *pRes, int32_t maxSize, void *pData, int32_t row
STopBotResItem
*
pItem
=
&
pItems
[
pEntryInfo
->
numOfRes
];
pItem
->
v
=
val
;
pItem
->
uid
=
uid
;
pItem
->
tuplePos
.
pageId
=
-
1
;
// todo set the corresponding tuple data in the disk-based buffer
if
(
pRes
->
pageId
==
-
1
)
{
SFilePage
*
pPage
=
getNewBufPage
(
NULL
,
0
,
&
pRes
->
pageId
);
pPage
->
num
=
sizeof
(
SFilePage
);
// keep the current row data
for
(
int32_t
i
=
0
;
i
<
pSrcBlock
->
info
.
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pSrcBlock
->
pDataBlock
,
i
);
bool
isNull
=
colDataIsNull_s
(
pCol
,
rowIndex
);
colDataGetData
(
pCol
,
rowIndex
);
}
}
// save the data of this tuple
saveTupleData
(
pCtx
,
rowIndex
,
pSrcBlock
,
pItem
);
// allocate the buffer and keep the data of this row into the new allocated buffer
pEntryInfo
->
numOfRes
++
;
...
...
@@ -1452,22 +1472,100 @@ void doAddIntoResult(STopBotRes *pRes, int32_t maxSize, void *pData, int32_t row
if
((
IS_SIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
i
>
pItems
[
0
].
v
.
i
)
||
(
IS_UNSIGNED_NUMERIC_TYPE
(
type
)
&&
val
.
u
>
pItems
[
0
].
v
.
u
)
||
(
IS_FLOAT_TYPE
(
type
)
&&
val
.
d
>
pItems
[
0
].
v
.
d
))
{
// replace the old data and the coresponding tuple data
STopBotResItem
*
pItem
=
&
pItems
[
0
];
pItem
->
v
=
val
;
pItem
->
uid
=
uid
;
pItem
->
tuplePos
.
pageId
=
-
1
;
// todo set the corresponding tuple data in the disk-based buffer
// save the data of this tuple by over writing the old data
copyTupleData
(
pCtx
,
rowIndex
,
pSrcBlock
,
pItem
);
taosheapadjust
((
void
*
)
pItems
,
sizeof
(
STopBotResItem
),
0
,
pEntryInfo
->
numOfRes
-
1
,
(
const
void
*
)
&
type
,
topBotResComparFn
,
NULL
,
false
);
}
}
}
int32_t
topBotFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
,
int32_t
slotId
)
{
void
saveTupleData
(
SqlFunctionCtx
*
pCtx
,
int32_t
rowIndex
,
const
SSDataBlock
*
pSrcBlock
,
STopBotResItem
*
pItem
)
{
SFilePage
*
pPage
=
NULL
;
int32_t
completeRowSize
=
pSrcBlock
->
info
.
rowSize
+
pSrcBlock
->
info
.
numOfCols
*
sizeof
(
bool
);
if
(
pCtx
->
curBufPage
==
-
1
)
{
pPage
=
getNewBufPage
(
pCtx
->
pBuf
,
0
,
&
pCtx
->
curBufPage
);
pPage
->
num
=
sizeof
(
SFilePage
);
}
else
{
pPage
=
getBufPage
(
pCtx
->
pBuf
,
pCtx
->
curBufPage
);
if
(
pPage
->
num
+
completeRowSize
>
getBufPageSize
(
pCtx
->
pBuf
))
{
pPage
=
getNewBufPage
(
pCtx
->
pBuf
,
0
,
&
pCtx
->
curBufPage
);
pPage
->
num
=
sizeof
(
SFilePage
);
}
}
pItem
->
tuplePos
.
pageId
=
pCtx
->
curBufPage
;
// keep the current row data, extract method
int32_t
offset
=
0
;
bool
*
nullList
=
(
bool
*
)((
char
*
)
pPage
+
pPage
->
num
);
char
*
pStart
=
(
char
*
)(
nullList
+
sizeof
(
bool
)
*
pSrcBlock
->
info
.
numOfCols
);
for
(
int32_t
i
=
0
;
i
<
pSrcBlock
->
info
.
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pSrcBlock
->
pDataBlock
,
i
);
bool
isNull
=
colDataIsNull_s
(
pCol
,
rowIndex
);
if
(
isNull
)
{
nullList
[
i
]
=
true
;
continue
;
}
char
*
p
=
colDataGetData
(
pCol
,
rowIndex
);
if
(
IS_VAR_DATA_TYPE
(
pCol
->
info
.
type
))
{
memcpy
(
pStart
+
offset
,
p
,
varDataTLen
(
p
));
}
else
{
memcpy
(
pStart
+
offset
,
p
,
pCol
->
info
.
bytes
);
}
offset
+=
pCol
->
info
.
bytes
;
}
pItem
->
tuplePos
.
offset
=
pPage
->
num
;
pPage
->
num
+=
completeRowSize
;
setBufPageDirty
(
pPage
,
true
);
releaseBufPage
(
pCtx
->
pBuf
,
pPage
);
}
void
copyTupleData
(
SqlFunctionCtx
*
pCtx
,
int32_t
rowIndex
,
const
SSDataBlock
*
pSrcBlock
,
STopBotResItem
*
pItem
)
{
SFilePage
*
pPage
=
getBufPage
(
pCtx
->
pBuf
,
pItem
->
tuplePos
.
pageId
);
bool
*
nullList
=
(
bool
*
)((
char
*
)
pPage
+
pItem
->
tuplePos
.
offset
);
char
*
pStart
=
(
char
*
)(
nullList
+
pSrcBlock
->
info
.
numOfCols
*
sizeof
(
bool
));
int32_t
offset
=
0
;
for
(
int32_t
i
=
0
;
i
<
pSrcBlock
->
info
.
numOfCols
;
++
i
)
{
SColumnInfoData
*
pCol
=
taosArrayGet
(
pSrcBlock
->
pDataBlock
,
i
);
if
((
nullList
[
i
]
=
colDataIsNull_s
(
pCol
,
rowIndex
))
==
true
)
{
continue
;
}
char
*
p
=
colDataGetData
(
pCol
,
rowIndex
);
if
(
IS_VAR_DATA_TYPE
(
pCol
->
info
.
type
))
{
memcpy
(
pStart
+
offset
,
p
,
varDataTLen
(
p
));
}
else
{
memcpy
(
pStart
+
offset
,
p
,
pCol
->
info
.
bytes
);
}
offset
+=
pCol
->
info
.
bytes
;
}
setBufPageDirty
(
pPage
,
true
);
releaseBufPage
(
pCtx
->
pBuf
,
pPage
);
}
int32_t
topBotFinalize
(
SqlFunctionCtx
*
pCtx
,
SSDataBlock
*
pBlock
)
{
SResultRowEntryInfo
*
pEntryInfo
=
GET_RES_INFO
(
pCtx
);
STopBotRes
*
pRes
=
GET_ROWCELL_INTERBUF
(
pEntryInfo
);
pEntryInfo
->
complete
=
true
;
int32_t
type
=
pCtx
->
input
.
pData
[
0
]
->
info
.
type
;
int32_t
slotId
=
pCtx
->
pExpr
->
base
.
resSchema
.
slotId
;
SColumnInfoData
*
pCol
=
taosArrayGet
(
pBlock
->
pDataBlock
,
slotId
);
// todo assign the tag value and the corresponding row data
...
...
@@ -1476,19 +1574,45 @@ int32_t topBotFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock, int32_t slotId
case
TSDB_DATA_TYPE_INT
:
{
for
(
int32_t
i
=
0
;
i
<
pEntryInfo
->
numOfRes
;
++
i
)
{
STopBotResItem
*
pItem
=
&
pRes
->
pItems
[
i
];
colDataAppendInt32
(
pCol
,
currentRow
++
,
(
int32_t
*
)
&
pItem
->
v
.
i
);
colDataAppendInt32
(
pCol
,
currentRow
,
(
int32_t
*
)
&
pItem
->
v
.
i
);
int32_t
pageId
=
pItem
->
tuplePos
.
pageId
;
int32_t
offset
=
pItem
->
tuplePos
.
offset
;
if
(
pageId
!=
-
1
)
{
// todo
if
(
pItem
->
tuplePos
.
pageId
!=
-
1
)
{
SFilePage
*
pPage
=
getBufPage
(
pCtx
->
pBuf
,
pageId
);
bool
*
nullList
=
(
bool
*
)((
char
*
)
pPage
+
offset
);
char
*
pStart
=
(
char
*
)(
nullList
+
pCtx
->
pSrcBlock
->
info
.
numOfCols
*
sizeof
(
bool
));
// todo set the offset value to optimize the performance.
for
(
int32_t
j
=
0
;
j
<
pCtx
->
subsidiaries
.
num
;
++
j
)
{
SqlFunctionCtx
*
pc
=
pCtx
->
subsidiaries
.
pCtx
[
j
];
SFunctParam
*
pFuncParam
=
&
pc
->
pExpr
->
base
.
pParam
[
0
];
int32_t
srcSlotId
=
pFuncParam
->
pCol
->
slotId
;
int32_t
dstSlotId
=
pCtx
->
pExpr
->
base
.
resSchema
.
slotId
;
int32_t
ps
=
0
;
for
(
int32_t
k
=
0
;
k
<
srcSlotId
;
++
k
)
{
SColumnInfoData
*
pSrcCol
=
taosArrayGet
(
pCtx
->
pSrcBlock
->
pDataBlock
,
k
);
ps
+=
pSrcCol
->
info
.
bytes
;
}
SColumnInfoData
*
pDstCol
=
taosArrayGet
(
pBlock
->
pDataBlock
,
dstSlotId
);
if
(
nullList
[
srcSlotId
])
{
colDataAppendNULL
(
pDstCol
,
currentRow
);
}
else
{
colDataAppend
(
pDstCol
,
currentRow
,
(
pStart
+
ps
),
false
);
}
}
}
currentRow
+=
1
;
}
break
;
}
}
return
pEntryInfo
->
numOfRes
;
// return functionFinalize(pCtx, pBlock, slotId);
}
source/libs/function/src/tudf.c
浏览文件 @
20085fea
...
...
@@ -124,7 +124,7 @@ enum {
int64_t
gUdfTaskSeqNum
=
0
;
typedef
struct
SUdfdProxy
{
int32_t
dnodeId
;
char
udfdPipeName
[
UDF_LISTEN_PIPE_NAME_LEN
]
;
uv_barrier_t
gUdfInitBarrier
;
uv_loop_t
gUdfdLoop
;
...
...
@@ -137,11 +137,11 @@ typedef struct SUdfdProxy {
int8_t
gUdfcState
;
QUEUE
gUdfTaskQueue
;
QUEUE
gUvProcTaskQueue
;
// int8_t gUdfcState = UDFC_STATE_INITAL;
// QUEUE gUdfTaskQueue = {0};
// QUEUE gUvProcTaskQueue = {0};
int8_t
initialized
;
}
SUdfdProxy
;
SUdfdProxy
gUdfdProxy
=
{
0
};
typedef
struct
SUdfUvSession
{
SUdfdProxy
*
udfc
;
...
...
@@ -209,19 +209,27 @@ enum {
UDFC_STATE_STARTNG
,
// starting after udfcOpen
UDFC_STATE_READY
,
// started and begin to receive quests
UDFC_STATE_STOPPING
,
// stopping after udfcClose
UDFC_STATUS_FINAL
,
// stopped
};
int32_t
getUdfdPipeName
(
char
*
pipeName
,
int32_t
size
)
{
char
dnodeId
[
8
]
=
{
0
};
size_t
dnodeIdSize
;
int32_t
err
=
uv_os_getenv
(
UDF_DNODE_ID_ENV_NAME
,
dnodeId
,
&
dnodeIdSize
);
if
(
err
!=
0
)
{
dnodeId
[
0
]
=
'1'
;
}
snprintf
(
pipeName
,
size
,
"%s%s"
,
UDF_LISTEN_PIPE_NAME_PREFIX
,
dnodeId
);
return
0
;
}
int32_t
encodeUdfSetupRequest
(
void
**
buf
,
const
SUdfSetupRequest
*
setup
)
{
int32_t
len
=
0
;
len
+=
taosEncodeBinary
(
buf
,
setup
->
udfName
,
TSDB_FUNC_NAME_LEN
);
len
+=
taosEncodeSEpSet
(
buf
,
&
setup
->
epSet
);
return
len
;
}
void
*
decodeUdfSetupRequest
(
const
void
*
buf
,
SUdfSetupRequest
*
request
)
{
buf
=
taosDecodeBinaryTo
(
buf
,
request
->
udfName
,
TSDB_FUNC_NAME_LEN
);
buf
=
taosDecodeSEpSet
((
void
*
)
buf
,
&
request
->
epSet
);
return
(
void
*
)
buf
;
}
...
...
@@ -604,7 +612,7 @@ void onUdfcPipeClose(uv_handle_t *handle) {
}
int32_t
udfcGetUvTaskResponseResult
(
SClientUdfTask
*
task
,
SClientUvTaskNode
*
uvTask
)
{
debugPrint
(
"%s"
,
"get uv task result"
);
fnDebug
(
"udfc get uv task result. task: %p"
,
task
);
if
(
uvTask
->
type
==
UV_TASK_REQ_RSP
)
{
if
(
uvTask
->
rspBuf
.
base
!=
NULL
)
{
SUdfResponse
rsp
;
...
...
@@ -647,7 +655,6 @@ int32_t udfcGetUvTaskResponseResult(SClientUdfTask *task, SClientUvTaskNode *uvT
}
void
udfcAllocateBuffer
(
uv_handle_t
*
handle
,
size_t
suggestedSize
,
uv_buf_t
*
buf
)
{
debugPrint
(
"%s"
,
"client allocate buffer to receive from pipe"
);
SClientUvConn
*
conn
=
handle
->
data
;
SClientConnBuf
*
connBuf
=
&
conn
->
readBuf
;
...
...
@@ -662,7 +669,7 @@ void udfcAllocateBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf
buf
->
base
=
connBuf
->
buf
;
buf
->
len
=
connBuf
->
cap
;
}
else
{
//TODO: log error
fnError
(
"udfc allocate buffer failure. size: %d"
,
msgHeadSize
);
buf
->
base
=
NULL
;
buf
->
len
=
0
;
}
...
...
@@ -674,13 +681,13 @@ void udfcAllocateBuffer(uv_handle_t *handle, size_t suggestedSize, uv_buf_t *buf
buf
->
base
=
connBuf
->
buf
+
connBuf
->
len
;
buf
->
len
=
connBuf
->
cap
-
connBuf
->
len
;
}
else
{
//TODO: log error free connBuf->buf
fnError
(
"udfc re-allocate buffer failure. size: %d"
,
connBuf
->
cap
);
buf
->
base
=
NULL
;
buf
->
len
=
0
;
}
}
debugPrint
(
"
\t
conn buf cap - len - total : %d - %d - %d"
,
connBuf
->
cap
,
connBuf
->
len
,
connBuf
->
total
);
fnTrace
(
"
conn buf cap - len - total : %d - %d - %d"
,
connBuf
->
cap
,
connBuf
->
len
,
connBuf
->
total
);
}
...
...
@@ -689,6 +696,7 @@ bool isUdfcUvMsgComplete(SClientConnBuf *connBuf) {
connBuf
->
total
=
*
(
int32_t
*
)
(
connBuf
->
buf
);
}
if
(
connBuf
->
len
==
connBuf
->
cap
&&
connBuf
->
total
==
connBuf
->
cap
)
{
fnTrace
(
"udfc complete message is received, now handle it"
);
return
true
;
}
return
false
;
...
...
@@ -696,10 +704,10 @@ bool isUdfcUvMsgComplete(SClientConnBuf *connBuf) {
void
udfcUvHandleRsp
(
SClientUvConn
*
conn
)
{
SClientConnBuf
*
connBuf
=
&
conn
->
readBuf
;
int64_t
seqNum
=
*
(
int64_t
*
)
(
connBuf
->
buf
+
sizeof
(
int32_t
));
// msglen
int32_t
then seqnum
int64_t
seqNum
=
*
(
int64_t
*
)
(
connBuf
->
buf
+
sizeof
(
int32_t
));
// msglen then seqnum
if
(
QUEUE_EMPTY
(
&
conn
->
taskQueue
))
{
//LOG error
fnError
(
"udfc no task waiting for response on connection"
);
return
;
}
bool
found
=
false
;
...
...
@@ -713,7 +721,7 @@ void udfcUvHandleRsp(SClientUvConn *conn) {
found
=
true
;
taskFound
=
task
;
}
else
{
//LOG error
;
fnError
(
"udfc more than one task waiting for the same response"
)
;
continue
;
}
}
...
...
@@ -727,7 +735,7 @@ void udfcUvHandleRsp(SClientUvConn *conn) {
uv_sem_post
(
&
taskFound
->
taskSem
);
QUEUE_REMOVE
(
&
taskFound
->
procTaskQueue
);
}
else
{
//TODO: LOG error
fnError
(
"no task is waiting for the response."
);
}
connBuf
->
buf
=
NULL
;
connBuf
->
total
=
-
1
;
...
...
@@ -751,7 +759,7 @@ void udfcUvHandleError(SClientUvConn *conn) {
}
void
onUdfcRead
(
uv_stream_t
*
client
,
ssize_t
nread
,
const
uv_buf_t
*
buf
)
{
debugPrint
(
"%s, nread: %zd"
,
"client read from pipe"
,
nread
);
fnTrace
(
"udfc client %p, client read from pipe. nread: %zd"
,
client
,
nread
);
if
(
nread
==
0
)
return
;
SClientUvConn
*
conn
=
client
->
data
;
...
...
@@ -764,9 +772,9 @@ void onUdfcRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
}
if
(
nread
<
0
)
{
debugPrint
(
"
\t
client read error: %s"
,
uv_strerror
(
nread
));
fnError
(
"udfc client pipe %p read error: %s"
,
client
,
uv_strerror
(
nread
));
if
(
nread
==
UV_EOF
)
{
//TODO:
fnError
(
"udfc client pipe %p closed"
,
client
);
}
udfcUvHandleError
(
conn
);
}
...
...
@@ -774,16 +782,15 @@ void onUdfcRead(uv_stream_t *client, ssize_t nread, const uv_buf_t *buf) {
}
void
onUdfClientWrite
(
uv_write_t
*
write
,
int
status
)
{
debugPrint
(
"%s"
,
"after writing to pipe"
);
SClientUvTaskNode
*
uvTask
=
write
->
data
;
uv_pipe_t
*
pipe
=
uvTask
->
pipe
;
if
(
status
==
0
)
{
uv_pipe_t
*
pipe
=
uvTask
->
pipe
;
SClientUvConn
*
conn
=
pipe
->
data
;
QUEUE_INSERT_TAIL
(
&
conn
->
taskQueue
,
&
uvTask
->
connTaskQueue
);
}
else
{
//TODO Log error
;
fnError
(
"udfc client %p write error."
,
pipe
)
;
}
debugPrint
(
"
\t
length:%zu"
,
uvTask
->
reqBuf
.
len
);
fnTrace
(
"udfc client %p write length:%zu"
,
pipe
,
uvTask
->
reqBuf
.
len
);
taosMemoryFree
(
write
);
taosMemoryFree
(
uvTask
->
reqBuf
.
base
);
}
...
...
@@ -841,7 +848,7 @@ int32_t createUdfcUvTask(SClientUdfTask *task, int8_t uvTaskType, SClientUvTaskN
}
int32_t
queueUvUdfTask
(
SClientUvTaskNode
*
uvTask
)
{
debugPrint
(
"%s, %d"
,
"queue uv task"
,
uvTask
->
type
);
fnTrace
(
"queue uv task to event loop, task: %d, %p"
,
uvTask
->
type
,
uvTask
);
SUdfdProxy
*
udfc
=
uvTask
->
udfc
;
uv_mutex_lock
(
&
udfc
->
gUdfTaskQueueMutex
);
QUEUE_INSERT_TAIL
(
&
udfc
->
gUdfTaskQueue
,
&
uvTask
->
recvTaskQueue
);
...
...
@@ -855,7 +862,7 @@ int32_t queueUvUdfTask(SClientUvTaskNode *uvTask) {
}
int32_t
startUvUdfTask
(
SClientUvTaskNode
*
uvTask
)
{
debugPrint
(
"%s, type %d"
,
"start uv task "
,
uvTask
->
type
);
fnTrace
(
"event loop start uv task. task: %d, %p"
,
uvTask
->
type
,
uvTask
);
switch
(
uvTask
->
type
)
{
case
UV_TASK_CONNECT
:
{
uv_pipe_t
*
pipe
=
taosMemoryMalloc
(
sizeof
(
uv_pipe_t
));
...
...
@@ -874,8 +881,7 @@ int32_t startUvUdfTask(SClientUvTaskNode *uvTask) {
uv_connect_t
*
connReq
=
taosMemoryMalloc
(
sizeof
(
uv_connect_t
));
connReq
->
data
=
uvTask
;
uv_pipe_connect
(
connReq
,
pipe
,
"udf.sock"
,
onUdfClientConnect
);
uv_pipe_connect
(
connReq
,
pipe
,
uvTask
->
udfc
->
udfdPipeName
,
onUdfClientConnect
);
break
;
}
case
UV_TASK_REQ_RSP
:
{
...
...
@@ -971,27 +977,37 @@ void constructUdfService(void *argsThread) {
uv_loop_close
(
&
udfc
->
gUdfdLoop
);
}
int32_t
udfcOpen
(
int32_t
dnodeId
,
UdfcHandle
*
udfc
)
{
SUdfdProxy
*
proxy
=
taosMemoryCalloc
(
1
,
sizeof
(
SUdfdProxy
));
proxy
->
dnodeId
=
dnodeId
;
int32_t
udfcOpen
()
{
int8_t
old
=
atomic_val_compare_exchange_8
(
&
gUdfdProxy
.
initialized
,
0
,
1
);
if
(
old
==
1
)
{
return
0
;
}
SUdfdProxy
*
proxy
=
&
gUdfdProxy
;
getUdfdPipeName
(
proxy
->
udfdPipeName
,
UDF_LISTEN_PIPE_NAME_LEN
);
proxy
->
gUdfcState
=
UDFC_STATE_STARTNG
;
uv_barrier_init
(
&
proxy
->
gUdfInitBarrier
,
2
);
uv_thread_create
(
&
proxy
->
gUdfLoopThread
,
constructUdfService
,
proxy
);
uv_barrier_wait
(
&
proxy
->
gUdfInitBarrier
);
atomic_store_8
(
&
proxy
->
gUdfcState
,
UDFC_STATE_READY
);
proxy
->
gUdfcState
=
UDFC_STATE_READY
;
*
udfc
=
proxy
;
uv_barrier_wait
(
&
proxy
->
gUdfInitBarrier
);
fnInfo
(
"udfc initialized"
)
return
0
;
}
int32_t
udfcClose
(
UdfcHandle
udfcHandle
)
{
SUdfdProxy
*
udfc
=
udfcHandle
;
int32_t
udfcClose
()
{
int8_t
old
=
atomic_val_compare_exchange_8
(
&
gUdfdProxy
.
initialized
,
1
,
0
);
if
(
old
==
0
)
{
return
0
;
}
SUdfdProxy
*
udfc
=
&
gUdfdProxy
;
udfc
->
gUdfcState
=
UDFC_STATE_STOPPING
;
uv_async_send
(
&
udfc
->
gUdfLoopStopAsync
);
uv_thread_join
(
&
udfc
->
gUdfLoopThread
);
uv_mutex_destroy
(
&
udfc
->
gUdfTaskQueueMutex
);
uv_barrier_destroy
(
&
udfc
->
gUdfInitBarrier
);
udfc
->
gUdfcState
=
UDFC_STAT
US_FIN
AL
;
taosMemoryFree
(
udfc
);
udfc
->
gUdfcState
=
UDFC_STAT
E_INIT
AL
;
fnInfo
(
"udfc cleaned up"
);
return
0
;
}
...
...
@@ -1009,12 +1025,15 @@ int32_t udfcRunUvTask(SClientUdfTask *task, int8_t uvTaskType) {
return
task
->
errCode
;
}
int32_t
setupUdf
(
UdfcHandle
udfc
,
char
udfName
[],
SEpSet
*
epSet
,
UdfcFuncHandle
*
funcHandle
)
{
debugPrint
(
"%s"
,
"client setup udf"
);
int32_t
setupUdf
(
char
udfName
[],
UdfcFuncHandle
*
funcHandle
)
{
fnInfo
(
"udfc setup udf. udfName: %s"
,
udfName
);
if
(
gUdfdProxy
.
gUdfcState
!=
UDFC_STATE_READY
)
{
return
UDFC_CODE_INVALID_STATE
;
}
SClientUdfTask
*
task
=
taosMemoryMalloc
(
sizeof
(
SClientUdfTask
));
task
->
errCode
=
0
;
task
->
session
=
taosMemoryMalloc
(
sizeof
(
SUdfUvSession
));
task
->
session
->
udfc
=
udfc
;
task
->
session
->
udfc
=
&
gUdfdProxy
;
task
->
type
=
UDF_TASK_SETUP
;
SUdfSetupRequest
*
req
=
&
task
->
_setup
.
req
;
...
...
@@ -1022,15 +1041,20 @@ int32_t setupUdf(UdfcHandle udfc, char udfName[], SEpSet *epSet, UdfcFuncHandle
int32_t
errCode
=
udfcRunUvTask
(
task
,
UV_TASK_CONNECT
);
if
(
errCode
!=
0
)
{
//TODO: log error
return
-
1
;
fnError
(
"failed to connect to pipe. udfName: %s, pipe: %s"
,
udfName
,
(
&
gUdfdProxy
)
->
udfdPipeName
);
return
UDFC_CODE_CONNECT_PIPE_ERR
;
}
udfcRunUvTask
(
task
,
UV_TASK_REQ_RSP
);
SUdfSetupResponse
*
rsp
=
&
task
->
_setup
.
rsp
;
task
->
session
->
severHandle
=
rsp
->
udfHandle
;
*
funcHandle
=
task
->
session
;
if
(
task
->
errCode
!=
0
)
{
fnError
(
"failed to setup udf. err: %d"
,
task
->
errCode
)
}
else
{
fnInfo
(
"sucessfully setup udf func handle. handle: %p"
,
task
->
session
);
*
funcHandle
=
task
->
session
;
}
int32_t
err
=
task
->
errCode
;
taosMemoryFree
(
task
);
return
err
;
...
...
@@ -1038,7 +1062,7 @@ int32_t setupUdf(UdfcHandle udfc, char udfName[], SEpSet *epSet, UdfcFuncHandle
int32_t
callUdf
(
UdfcFuncHandle
handle
,
int8_t
callType
,
SSDataBlock
*
input
,
SUdfInterBuf
*
state
,
SUdfInterBuf
*
state2
,
SSDataBlock
*
output
,
SUdfInterBuf
*
newState
)
{
debugPrint
(
"%s"
,
"client call udf"
);
fnTrace
(
"udfc call udf. callType: %d, funcHandle: %p"
,
callType
,
handle
);
SClientUdfTask
*
task
=
taosMemoryMalloc
(
sizeof
(
SClientUdfTask
));
task
->
errCode
=
0
;
...
...
@@ -1076,35 +1100,37 @@ int32_t callUdf(UdfcFuncHandle handle, int8_t callType, SSDataBlock *input, SUdf
udfcRunUvTask
(
task
,
UV_TASK_REQ_RSP
);
SUdfCallResponse
*
rsp
=
&
task
->
_call
.
rsp
;
switch
(
callType
)
{
case
TSDB_UDF_CALL_AGG_INIT
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_AGG_PROC
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_AGG_MERGE
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_AGG_FIN
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_SCALA_PROC
:
{
*
output
=
rsp
->
resultData
;
break
;
if
(
task
->
errCode
!=
0
)
{
fnError
(
"call udf failure. err: %d"
,
task
->
errCode
);
}
else
{
SUdfCallResponse
*
rsp
=
&
task
->
_call
.
rsp
;
switch
(
callType
)
{
case
TSDB_UDF_CALL_AGG_INIT
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_AGG_PROC
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_AGG_MERGE
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_AGG_FIN
:
{
*
newState
=
rsp
->
resultBuf
;
break
;
}
case
TSDB_UDF_CALL_SCALA_PROC
:
{
*
output
=
rsp
->
resultData
;
break
;
}
}
}
taosMemoryFree
(
task
);
return
task
->
errCode
;
}
//TODO: translate these calls to callUdf
int32_t
callUdfAggInit
(
UdfcFuncHandle
handle
,
SUdfInterBuf
*
interBuf
)
{
int8_t
callType
=
TSDB_UDF_CALL_AGG_INIT
;
...
...
@@ -1148,7 +1174,7 @@ int32_t callUdfScalarFunc(UdfcFuncHandle handle, SScalarParam *input, int32_t nu
}
int32_t
teardownUdf
(
UdfcFuncHandle
handle
)
{
debugPrint
(
"%s"
,
"client teardown udf"
);
fnInfo
(
"tear down udf. udf func handle: %p"
,
handle
);
SClientUdfTask
*
task
=
taosMemoryMalloc
(
sizeof
(
SClientUdfTask
));
task
->
errCode
=
0
;
...
...
@@ -1160,7 +1186,6 @@ int32_t teardownUdf(UdfcFuncHandle handle) {
udfcRunUvTask
(
task
,
UV_TASK_REQ_RSP
);
SUdfTeardownResponse
*
rsp
=
&
task
->
_teardown
.
rsp
;
int32_t
err
=
task
->
errCode
;
...
...
source/libs/function/src/udfd.c
浏览文件 @
20085fea
...
...
@@ -20,6 +20,7 @@
#include "tudf.h"
#include "tudfInt.h"
#include "tdatablock.h"
#include "tdataformat.h"
#include "tglobal.h"
#include "tmsg.h"
...
...
@@ -31,8 +32,9 @@ typedef struct SUdfdContext {
uv_signal_t
intrSignal
;
char
listenPipeName
[
UDF_LISTEN_PIPE_NAME_LEN
];
uv_pipe_t
listeningPipe
;
void
*
clientRpc
;
void
*
clientRpc
;
SCorEpSet
mgmtEp
;
uv_mutex_t
udfsMutex
;
SHashObj
*
udfsHash
;
...
...
@@ -63,8 +65,13 @@ typedef struct SUdf {
uv_mutex_t
lock
;
uv_cond_t
condReady
;
char
name
[
16
];
int8_t
type
;
char
name
[
TSDB_FUNC_NAME_LEN
];
int8_t
funcType
;
int8_t
scriptType
;
int8_t
outputType
;
int32_t
outputLen
;
int32_t
bufSize
;
char
path
[
PATH_MAX
];
uv_lib_t
lib
;
...
...
@@ -78,17 +85,17 @@ typedef struct SUdfcFuncHandle {
SUdf
*
udf
;
}
SUdfcFuncHandle
;
int32_t
udfdFillUdfInfoFromMNode
(
void
*
clientRpc
,
SEpSet
*
pEpSet
,
char
*
udfName
,
SUdf
*
udf
);
int32_t
udfdFillUdfInfoFromMNode
(
void
*
clientRpc
,
char
*
udfName
,
SUdf
*
udf
);
int32_t
udfdLoadUdf
(
char
*
udfName
,
S
EpSet
*
pEpSet
,
S
Udf
*
udf
)
{
int32_t
udfdLoadUdf
(
char
*
udfName
,
SUdf
*
udf
)
{
strcpy
(
udf
->
name
,
udfName
);
udfdFillUdfInfoFromMNode
(
global
.
clientRpc
,
pEpSet
,
udf
->
name
,
udf
);
udfdFillUdfInfoFromMNode
(
global
.
clientRpc
,
udf
->
name
,
udf
);
//strcpy(udf->path, "/home/slzhou/TDengine/debug/build/lib/libudf1.so");
int
err
=
uv_dlopen
(
udf
->
path
,
&
udf
->
lib
);
if
(
err
!=
0
)
{
fnError
(
"can not load library %s. error: %s"
,
udf
->
path
,
uv_strerror
(
err
));
// TODO set error
return
UDFC_CODE_LOAD_UDF_FAILURE
;
}
// TODO: find all the functions
char
normalFuncName
[
TSDB_FUNC_NAME_LEN
]
=
{
0
};
...
...
@@ -115,8 +122,8 @@ void udfdProcessRequest(uv_work_t *req) {
SUdf
*
udf
=
NULL
;
uv_mutex_lock
(
&
global
.
udfsMutex
);
SUdf
**
udfInHash
=
taosHashGet
(
global
.
udfsHash
,
request
.
setup
.
udfName
,
TSDB_FUNC_NAME_LEN
);
if
(
*
udfInHash
)
{
SUdf
**
udfInHash
=
taosHashGet
(
global
.
udfsHash
,
request
.
setup
.
udfName
,
strlen
(
request
.
setup
.
udfName
)
);
if
(
udfInHash
)
{
++
(
*
udfInHash
)
->
refCount
;
udf
=
*
udfInHash
;
uv_mutex_unlock
(
&
global
.
udfsMutex
);
...
...
@@ -128,14 +135,14 @@ void udfdProcessRequest(uv_work_t *req) {
uv_mutex_init
(
&
udfNew
->
lock
);
uv_cond_init
(
&
udfNew
->
condReady
);
udf
=
udfNew
;
taosHashPut
(
global
.
udfsHash
,
request
.
setup
.
udfName
,
TSDB_FUNC_NAME_LEN
,
&
udfNew
,
sizeof
(
&
udfNew
));
taosHashPut
(
global
.
udfsHash
,
request
.
setup
.
udfName
,
strlen
(
request
.
setup
.
udfName
)
,
&
udfNew
,
sizeof
(
&
udfNew
));
uv_mutex_unlock
(
&
global
.
udfsMutex
);
}
uv_mutex_lock
(
&
udf
->
lock
);
if
(
udf
->
state
==
UDF_STATE_INIT
)
{
udf
->
state
=
UDF_STATE_LOADING
;
udfdLoadUdf
(
setup
->
udfName
,
&
setup
->
epSet
,
udf
);
udfdLoadUdf
(
setup
->
udfName
,
udf
);
udf
->
state
=
UDF_STATE_READY
;
uv_cond_broadcast
(
&
udf
->
condReady
);
uv_mutex_unlock
(
&
udf
->
lock
);
...
...
@@ -214,7 +221,7 @@ void udfdProcessRequest(uv_work_t *req) {
udf
->
refCount
--
;
if
(
udf
->
refCount
==
0
)
{
unloadUdf
=
true
;
taosHashRemove
(
global
.
udfsHash
,
udf
->
name
,
TSDB_FUNC_NAME_LEN
);
taosHashRemove
(
global
.
udfsHash
,
udf
->
name
,
strlen
(
udf
->
name
)
);
}
uv_mutex_unlock
(
&
global
.
udfsMutex
);
if
(
unloadUdf
)
{
...
...
@@ -393,7 +400,48 @@ void udfdIntrSignalHandler(uv_signal_t *handle, int signum) {
void
udfdProcessRpcRsp
(
void
*
parent
,
SRpcMsg
*
pMsg
,
SEpSet
*
pEpSet
)
{
return
;
}
int32_t
udfdFillUdfInfoFromMNode
(
void
*
clientRpc
,
SEpSet
*
pEpSet
,
char
*
udfName
,
SUdf
*
udf
)
{
int
initEpSetFromCfg
(
const
char
*
firstEp
,
const
char
*
secondEp
,
SCorEpSet
*
pEpSet
)
{
pEpSet
->
version
=
0
;
// init mnode ip set
SEpSet
*
mgmtEpSet
=
&
(
pEpSet
->
epSet
);
mgmtEpSet
->
numOfEps
=
0
;
mgmtEpSet
->
inUse
=
0
;
if
(
firstEp
&&
firstEp
[
0
]
!=
0
)
{
if
(
strlen
(
firstEp
)
>=
TSDB_EP_LEN
)
{
terrno
=
TSDB_CODE_TSC_INVALID_FQDN
;
return
-
1
;
}
int32_t
code
=
taosGetFqdnPortFromEp
(
firstEp
,
&
mgmtEpSet
->
eps
[
0
]);
if
(
code
!=
TSDB_CODE_SUCCESS
)
{
terrno
=
TSDB_CODE_TSC_INVALID_FQDN
;
return
terrno
;
}
mgmtEpSet
->
numOfEps
++
;
}
if
(
secondEp
&&
secondEp
[
0
]
!=
0
)
{
if
(
strlen
(
secondEp
)
>=
TSDB_EP_LEN
)
{
terrno
=
TSDB_CODE_TSC_INVALID_FQDN
;
return
-
1
;
}
taosGetFqdnPortFromEp
(
secondEp
,
&
mgmtEpSet
->
eps
[
mgmtEpSet
->
numOfEps
]);
mgmtEpSet
->
numOfEps
++
;
}
if
(
mgmtEpSet
->
numOfEps
==
0
)
{
terrno
=
TSDB_CODE_TSC_INVALID_FQDN
;
return
-
1
;
}
return
0
;
}
int32_t
udfdFillUdfInfoFromMNode
(
void
*
clientRpc
,
char
*
udfName
,
SUdf
*
udf
)
{
SRetrieveFuncReq
retrieveReq
=
{
0
};
retrieveReq
.
numOfFuncs
=
1
;
retrieveReq
.
pFuncNames
=
taosArrayInit
(
1
,
TSDB_FUNC_NAME_LEN
);
...
...
@@ -410,15 +458,21 @@ int32_t udfdFillUdfInfoFromMNode(void *clientRpc, SEpSet *pEpSet, char *udfName,
rpcMsg
.
msgType
=
TDMT_MND_RETRIEVE_FUNC
;
SRpcMsg
rpcRsp
=
{
0
};
rpcSendRecv
(
clientRpc
,
pE
pSet
,
&
rpcMsg
,
&
rpcRsp
);
rpcSendRecv
(
clientRpc
,
&
global
.
mgmtEp
.
e
pSet
,
&
rpcMsg
,
&
rpcRsp
);
SRetrieveFuncRsp
retrieveRsp
=
{
0
};
tDeserializeSRetrieveFuncRsp
(
rpcRsp
.
pCont
,
rpcRsp
.
contLen
,
&
retrieveRsp
);
SFuncInfo
*
pFuncInfo
=
(
SFuncInfo
*
)
taosArrayGet
(
retrieveRsp
.
pFuncInfos
,
0
);
udf
->
funcType
=
pFuncInfo
->
funcType
;
udf
->
scriptType
=
pFuncInfo
->
scriptType
;
udf
->
outputType
=
pFuncInfo
->
funcType
;
udf
->
outputLen
=
pFuncInfo
->
outputLen
;
udf
->
bufSize
=
pFuncInfo
->
bufSize
;
char
path
[
PATH_MAX
]
=
{
0
};
taosGetTmpfilePath
(
"/tmp"
,
"libudf"
,
path
);
TdFilePtr
file
=
taosOpenFile
(
path
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_READ
|
TD_FILE_TRUNC
);
snprintf
(
path
,
sizeof
(
path
),
"%s/lib%s.so"
,
"/tmp"
,
udfName
);
TdFilePtr
file
=
taosOpenFile
(
path
,
TD_FILE_CREATE
|
TD_FILE_WRITE
|
TD_FILE_READ
|
TD_FILE_TRUNC
|
TD_FILE_AUTO_DEL
);
// TODO check for failure of flush to disk
taosWriteFile
(
file
,
pFuncInfo
->
pCode
,
pFuncInfo
->
codeSize
);
taosCloseFile
(
&
file
);
...
...
@@ -494,7 +548,7 @@ static int32_t udfdParseArgs(int32_t argc, char *argv[]) {
static
int32_t
udfdInitLog
()
{
char
logName
[
12
]
=
{
0
};
snprintf
(
logName
,
sizeof
(
logName
),
"%slog"
,
"udfd"
);
return
taosCreateLog
(
logName
,
1
,
configDir
,
NULL
,
NULL
,
NULL
,
0
);
return
taosCreateLog
(
logName
,
1
,
configDir
,
NULL
,
NULL
,
NULL
,
NULL
,
0
);
}
void
udfdCtrlAllocBufCb
(
uv_handle_t
*
handle
,
size_t
suggested_size
,
uv_buf_t
*
buf
)
{
...
...
@@ -531,15 +585,7 @@ static int32_t udfdUvInit() {
uv_pipe_open
(
&
global
.
ctrlPipe
,
0
);
uv_read_start
((
uv_stream_t
*
)
&
global
.
ctrlPipe
,
udfdCtrlAllocBufCb
,
udfdCtrlReadCb
);
char
dnodeId
[
8
]
=
{
0
};
size_t
dnodeIdSize
;
int32_t
err
=
uv_os_getenv
(
"DNODE_ID"
,
dnodeId
,
&
dnodeIdSize
);
if
(
err
!=
0
)
{
dnodeId
[
0
]
=
'1'
;
}
char
listenPipeName
[
32
]
=
{
0
};
snprintf
(
listenPipeName
,
sizeof
(
listenPipeName
),
"%s%s"
,
UDF_LISTEN_PIPE_NAME_PREFIX
,
dnodeId
);
strcpy
(
global
.
listenPipeName
,
listenPipeName
);
getUdfdPipeName
(
global
.
listenPipeName
,
UDF_LISTEN_PIPE_NAME_LEN
);
removeListeningPipe
();
...
...
@@ -550,7 +596,7 @@ static int32_t udfdUvInit() {
int
r
;
fnInfo
(
"bind to pipe %s"
,
global
.
listenPipeName
);
if
((
r
=
uv_pipe_bind
(
&
global
.
listeningPipe
,
listenPipeName
)))
{
if
((
r
=
uv_pipe_bind
(
&
global
.
listeningPipe
,
global
.
listenPipeName
)))
{
fnError
(
"Bind error %s"
,
uv_err_name
(
r
));
removeListeningPipe
();
return
-
1
;
...
...
@@ -580,7 +626,7 @@ static int32_t udfdRun() {
fnInfo
(
"start the udfd"
);
int
code
=
uv_run
(
global
.
loop
,
UV_RUN_DEFAULT
);
fnInfo
(
"udfd stopped. result: %s
"
,
uv_err_name
(
code
)
);
fnInfo
(
"udfd stopped. result: %s
, code: %d"
,
uv_err_name
(
code
),
code
);
int
codeClose
=
uv_loop_close
(
global
.
loop
);
fnDebug
(
"uv loop close. result: %s"
,
uv_err_name
(
codeClose
));
udfdCloseClientRpc
();
...
...
@@ -610,10 +656,11 @@ int main(int argc, char *argv[]) {
return
-
1
;
}
if
(
taosInitCfg
(
configDir
,
NULL
,
NULL
,
NULL
,
0
)
!=
0
)
{
if
(
taosInitCfg
(
configDir
,
NULL
,
NULL
,
NULL
,
NULL
,
0
)
!=
0
)
{
fnError
(
"failed to start since read config error"
);
return
-
1
;
}
initEpSetFromCfg
(
tsFirst
,
tsSecond
,
&
global
.
mgmtEp
);
return
udfdRun
();
}
source/libs/function/test/runUdf.c
浏览文件 @
20085fea
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "uv.h"
#include "fnLog.h"
#include "os.h"
#include "tudf.h"
#include "tdatablock.h"
#include "tglobal.h"
#include "tudf.h"
int
main
(
int
argc
,
char
*
argv
[])
{
UdfcHandle
udfc
;
udfcOpen
(
1
,
&
udfc
);
uv_sleep
(
1000
);
char
path
[
256
]
=
{
0
};
size_t
cwdSize
=
256
;
int
err
=
uv_cwd
(
path
,
&
cwdSize
);
if
(
err
!=
0
)
{
fprintf
(
stderr
,
"err cwd: %s
\n
"
,
uv_strerror
(
err
));
return
err
;
}
fprintf
(
stdout
,
"current working directory:%s
\n
"
,
path
);
strcat
(
path
,
"/libudf1.so"
);
UdfcFuncHandle
handle
;
SEpSet
epSet
;
setupUdf
(
udfc
,
"udf1"
,
&
epSet
,
&
handle
);
SSDataBlock
block
=
{
0
};
SSDataBlock
*
pBlock
=
&
block
;
pBlock
->
pDataBlock
=
taosArrayInit
(
1
,
sizeof
(
SColumnInfoData
));
pBlock
->
info
.
numOfCols
=
1
;
pBlock
->
info
.
rows
=
4
;
char
data
[
16
]
=
{
0
};
char
bitmap
[
4
]
=
{
0
};
for
(
int32_t
i
=
0
;
i
<
pBlock
->
info
.
numOfCols
;
++
i
)
{
SColumnInfoData
colInfo
=
{
0
};
colInfo
.
info
.
type
=
TSDB_DATA_TYPE_INT
;
colInfo
.
info
.
bytes
=
sizeof
(
int32_t
);
colInfo
.
info
.
colId
=
1
;
colInfo
.
pData
=
data
;
colInfo
.
nullbitmap
=
bitmap
;
for
(
int32_t
j
=
0
;
j
<
pBlock
->
info
.
rows
;
++
j
)
{
colDataAppendInt32
(
&
colInfo
,
j
,
&
j
);
static
int32_t
parseArgs
(
int32_t
argc
,
char
*
argv
[])
{
for
(
int32_t
i
=
1
;
i
<
argc
;
++
i
)
{
if
(
strcmp
(
argv
[
i
],
"-c"
)
==
0
)
{
if
(
i
<
argc
-
1
)
{
if
(
strlen
(
argv
[
++
i
])
>=
PATH_MAX
)
{
printf
(
"config file path overflow"
);
return
-
1
;
}
tstrncpy
(
configDir
,
argv
[
i
],
PATH_MAX
);
}
else
{
printf
(
"'-c' requires a parameter, default is %s
\n
"
,
configDir
);
return
-
1
;
}
taosArrayPush
(
pBlock
->
pDataBlock
,
&
colInfo
);
}
}
SScalarParam
input
=
{
0
};
input
.
numOfRows
=
pBlock
->
info
.
rows
;
input
.
columnData
=
taosArrayGet
(
pBlock
->
pDataBlock
,
0
);
SScalarParam
output
=
{
0
};
callUdfScalarFunc
(
handle
,
&
input
,
1
,
&
output
);
return
0
;
}
SColumnInfoData
*
col
=
output
.
columnData
;
for
(
int32_t
i
=
0
;
i
<
output
.
numOfRows
;
++
i
)
{
fprintf
(
stderr
,
"%d
\t
%d
\n
"
,
i
,
*
(
int32_t
*
)(
col
->
pData
+
i
*
sizeof
(
int32_t
)));
static
int32_t
initLog
()
{
char
logName
[
12
]
=
{
0
};
snprintf
(
logName
,
sizeof
(
logName
),
"%slog"
,
"udfc"
);
return
taosCreateLog
(
logName
,
1
,
configDir
,
NULL
,
NULL
,
NULL
,
NULL
,
0
);
}
int
main
(
int
argc
,
char
*
argv
[])
{
parseArgs
(
argc
,
argv
);
initLog
();
if
(
taosInitCfg
(
configDir
,
NULL
,
NULL
,
NULL
,
NULL
,
0
)
!=
0
)
{
fnError
(
"failed to start since read config error"
);
return
-
1
;
}
udfcOpen
();
uv_sleep
(
1000
);
UdfcFuncHandle
handle
;
setupUdf
(
"udf1"
,
&
handle
);
SSDataBlock
block
=
{
0
};
SSDataBlock
*
pBlock
=
&
block
;
pBlock
->
pDataBlock
=
taosArrayInit
(
1
,
sizeof
(
SColumnInfoData
));
pBlock
->
info
.
numOfCols
=
1
;
pBlock
->
info
.
rows
=
4
;
char
data
[
16
]
=
{
0
};
char
bitmap
[
4
]
=
{
0
};
for
(
int32_t
i
=
0
;
i
<
pBlock
->
info
.
numOfCols
;
++
i
)
{
SColumnInfoData
colInfo
=
{
0
};
colInfo
.
info
.
type
=
TSDB_DATA_TYPE_INT
;
colInfo
.
info
.
bytes
=
sizeof
(
int32_t
);
colInfo
.
info
.
colId
=
1
;
colInfo
.
pData
=
data
;
colInfo
.
nullbitmap
=
bitmap
;
for
(
int32_t
j
=
0
;
j
<
pBlock
->
info
.
rows
;
++
j
)
{
colDataAppendInt32
(
&
colInfo
,
j
,
&
j
);
}
teardownUdf
(
handle
);
taosArrayPush
(
pBlock
->
pDataBlock
,
&
colInfo
);
}
SScalarParam
input
=
{
0
};
input
.
numOfRows
=
pBlock
->
info
.
rows
;
input
.
columnData
=
taosArrayGet
(
pBlock
->
pDataBlock
,
0
);
SScalarParam
output
=
{
0
};
callUdfScalarFunc
(
handle
,
&
input
,
1
,
&
output
);
udfcClose
(
udfc
);
SColumnInfoData
*
col
=
output
.
columnData
;
for
(
int32_t
i
=
0
;
i
<
output
.
numOfRows
;
++
i
)
{
fprintf
(
stderr
,
"%d
\t
%d
\n
"
,
i
,
*
(
int32_t
*
)(
col
->
pData
+
i
*
sizeof
(
int32_t
)));
}
teardownUdf
(
handle
);
udfcClose
();
}
source/libs/parser/src/parTranslater.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/libs/qcom/src/querymsg.c
浏览文件 @
20085fea
...
...
@@ -342,28 +342,20 @@ PROCESS_META_OVER:
int32_t
queryProcessQnodeListRsp
(
void
*
output
,
char
*
msg
,
int32_t
msgSize
)
{
SQnodeListRsp
out
=
{
0
};
int32_t
code
=
-
1
;
int32_t
code
=
0
;
if
(
NULL
==
output
||
NULL
==
msg
||
msgSize
<=
0
)
{
code
=
TSDB_CODE_TSC_INVALID_INPUT
;
goto
PROCESS_QLIST_OVER
;
return
code
;
}
out
.
addrsList
=
(
SArray
*
)
output
;
if
(
tDeserializeSQnodeListRsp
(
msg
,
msgSize
,
&
out
)
!=
0
)
{
qError
(
"invalid qnode list rsp msg, msgSize:%d"
,
msgSize
);
code
=
TSDB_CODE_INVALID_MSG
;
goto
PROCESS_QLIST_OVER
;
return
code
;
}
PROCESS_QLIST_OVER:
if
(
code
!=
0
)
{
tFreeSQnodeListRsp
(
&
out
);
out
.
addrsList
=
NULL
;
}
*
(
SArray
**
)
output
=
out
.
addrsList
;
return
code
;
}
...
...
source/libs/qworker/src/qworkerMsg.c
浏览文件 @
20085fea
...
...
@@ -46,7 +46,7 @@ int32_t qwBuildAndSendQueryRsp(SQWConnInfo *pConn, int32_t code) {
SQueryTableRsp
rsp
=
{.
code
=
code
};
int32_t
contLen
=
tSerializeSQueryTableRsp
(
NULL
,
0
,
&
rsp
);
void
*
msg
=
rpcMallocCont
(
contLen
);
void
*
msg
=
rpcMallocCont
(
contLen
);
tSerializeSQueryTableRsp
(
msg
,
contLen
,
&
rsp
);
SRpcMsg
rpcRsp
=
{
...
...
@@ -87,7 +87,7 @@ int32_t qwBuildAndSendExplainRsp(SQWConnInfo *pConn, SExplainExecInfo *execInfo,
SExplainRsp
rsp
=
{.
numOfPlans
=
num
,
.
subplanInfo
=
execInfo
};
int32_t
contLen
=
tSerializeSExplainRsp
(
NULL
,
0
,
&
rsp
);
void
*
pRsp
=
rpcMallocCont
(
contLen
);
void
*
pRsp
=
rpcMallocCont
(
contLen
);
tSerializeSExplainRsp
(
pRsp
,
contLen
,
&
rsp
);
SRpcMsg
rpcRsp
=
{
...
...
@@ -107,7 +107,7 @@ int32_t qwBuildAndSendExplainRsp(SQWConnInfo *pConn, SExplainExecInfo *execInfo,
int32_t
qwBuildAndSendHbRsp
(
SQWConnInfo
*
pConn
,
SSchedulerHbRsp
*
pStatus
,
int32_t
code
)
{
int32_t
contLen
=
tSerializeSSchedulerHbRsp
(
NULL
,
0
,
pStatus
);
void
*
pRsp
=
rpcMallocCont
(
contLen
);
void
*
pRsp
=
rpcMallocCont
(
contLen
);
tSerializeSSchedulerHbRsp
(
pRsp
,
contLen
,
pStatus
);
SRpcMsg
rpcRsp
=
{
...
...
@@ -223,7 +223,7 @@ int32_t qwBuildAndSendShowRsp(SRpcMsg *pMsg, int32_t code) {
showRsp
.
tableMeta
.
numOfColumns
=
cols
;
int32_t
bufLen
=
tSerializeSShowRsp
(
NULL
,
0
,
&
showRsp
);
void
*
pBuf
=
rpcMallocCont
(
bufLen
);
void
*
pBuf
=
rpcMallocCont
(
bufLen
);
tSerializeSShowRsp
(
pBuf
,
bufLen
,
&
showRsp
);
SRpcMsg
rpcMsg
=
{
...
...
@@ -403,8 +403,8 @@ int32_t qWorkerProcessCQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
bool
queryDone
=
false
;
SQueryContinueReq
*
msg
=
(
SQueryContinueReq
*
)
pMsg
->
pCont
;
bool
needStop
=
false
;
SQWTaskCtx
*
handles
=
NULL
;
SQWorkerMgmt
*
mgmt
=
(
SQWorkerMgmt
*
)
qWorkerMgmt
;
SQWTaskCtx
*
handles
=
NULL
;
SQWorkerMgmt
*
mgmt
=
(
SQWorkerMgmt
*
)
qWorkerMgmt
;
if
(
NULL
==
msg
||
pMsg
->
contLen
<
sizeof
(
*
msg
))
{
QW_ELOG
(
"invalid cquery msg, msg:%p, msgLen:%d"
,
msg
,
pMsg
->
contLen
);
...
...
@@ -538,7 +538,7 @@ int32_t qWorkerProcessCancelMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
return
TSDB_CODE_QRY_INVALID_INPUT
;
}
SQWorkerMgmt
*
mgmt
=
(
SQWorkerMgmt
*
)
qWorkerMgmt
;
SQWorkerMgmt
*
mgmt
=
(
SQWorkerMgmt
*
)
qWorkerMgmt
;
int32_t
code
=
0
;
STaskCancelReq
*
msg
=
pMsg
->
pCont
;
if
(
NULL
==
msg
||
pMsg
->
contLen
<
sizeof
(
*
msg
))
{
...
...
@@ -620,7 +620,7 @@ int32_t qWorkerProcessHbMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg) {
int32_t
code
=
0
;
SSchedulerHbReq
req
=
{
0
};
SQWorkerMgmt
*
mgmt
=
(
SQWorkerMgmt
*
)
qWorkerMgmt
;
SQWorkerMgmt
*
mgmt
=
(
SQWorkerMgmt
*
)
qWorkerMgmt
;
if
(
NULL
==
pMsg
->
pCont
)
{
QW_ELOG
(
"invalid hb msg, msg:%p, msgLen:%d"
,
pMsg
->
pCont
,
pMsg
->
contLen
);
...
...
source/libs/scalar/inc/sclInt.h
浏览文件 @
20085fea
...
...
@@ -32,6 +32,9 @@ typedef struct SScalarCtx {
#define SCL_DATA_TYPE_DUMMY_HASH 9000
#define SCL_DEFAULT_OP_NUM 10
#define SCL_IS_CONST_NODE(_node) ((NULL == (_node)) || (QUERY_NODE_VALUE == (_node)->type) || (QUERY_NODE_NODE_LIST == (_node)->type))
#define SCL_IS_CONST_CALC(_ctx) (NULL == (_ctx)->pBlockList)
#define sclFatal(...) qFatal(__VA_ARGS__)
#define sclError(...) qError(__VA_ARGS__)
#define sclWarn(...) qWarn(__VA_ARGS__)
...
...
source/libs/scalar/src/scalar.c
浏览文件 @
20085fea
...
...
@@ -244,23 +244,53 @@ int32_t sclInitParam(SNode* node, SScalarParam *param, SScalarCtx *ctx, int32_t
return
TSDB_CODE_SUCCESS
;
}
int32_t
sclInitParamList
(
SScalarParam
**
pParams
,
SNodeList
*
pParamList
,
SScalarCtx
*
ctx
,
int32_t
*
rowNum
)
{
int32_t
sclInitParamList
(
SScalarParam
**
pParams
,
SNodeList
*
pParamList
,
SScalarCtx
*
ctx
,
int32_t
*
paramNum
,
int32_t
*
rowNum
)
{
int32_t
code
=
0
;
SScalarParam
*
paramList
=
taosMemoryCalloc
(
pParamList
->
length
,
sizeof
(
SScalarParam
));
if
(
NULL
==
pParamList
)
{
if
(
ctx
->
pBlockList
)
{
SSDataBlock
*
pBlock
=
taosArrayGet
(
ctx
->
pBlockList
,
0
);
*
rowNum
=
pBlock
->
info
.
rows
;
}
else
{
*
rowNum
=
1
;
}
*
paramNum
=
1
;
}
else
{
*
paramNum
=
pParamList
->
length
;
}
SScalarParam
*
paramList
=
taosMemoryCalloc
(
*
paramNum
,
sizeof
(
SScalarParam
));
if
(
NULL
==
paramList
)
{
sclError
(
"calloc %d failed"
,
(
int32_t
)(
pParamList
->
length
*
sizeof
(
SScalarParam
)));
sclError
(
"calloc %d failed"
,
(
int32_t
)(
(
*
paramNum
)
*
sizeof
(
SScalarParam
)));
SCL_ERR_RET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
SListCell
*
cell
=
pParamList
->
pHead
;
for
(
int32_t
i
=
0
;
i
<
pParamList
->
length
;
++
i
)
{
if
(
NULL
==
cell
||
NULL
==
cell
->
pNode
)
{
sclError
(
"invalid cell, cell:%p, pNode:%p"
,
cell
,
cell
->
pNode
);
SCL_ERR_JRET
(
TSDB_CODE_QRY_INVALID_INPUT
);
if
(
pParamList
)
{
SNode
*
tnode
=
NULL
;
int32_t
i
=
0
;
if
(
SCL_IS_CONST_CALC
(
ctx
))
{
WHERE_EACH
(
tnode
,
pParamList
)
{
if
(
!
SCL_IS_CONST_NODE
(
tnode
))
{
WHERE_NEXT
;
}
else
{
SCL_ERR_JRET
(
sclInitParam
(
tnode
,
&
paramList
[
i
],
ctx
,
rowNum
));
ERASE_NODE
(
pParamList
);
}
++
i
;
}
}
else
{
FOREACH
(
tnode
,
pParamList
)
{
SCL_ERR_JRET
(
sclInitParam
(
tnode
,
&
paramList
[
i
],
ctx
,
rowNum
));
++
i
;
}
}
}
else
{
paramList
[
0
].
numOfRows
=
*
rowNum
;
}
SCL_ERR_JRET
(
sclInitParam
(
cell
->
pNode
,
&
paramList
[
i
],
ctx
,
rowNum
));
cell
=
cell
->
pNext
;
if
(
0
==
*
rowNum
)
{
taosMemoryFreeClear
(
paramList
);
}
*
pParams
=
paramList
;
...
...
@@ -299,37 +329,45 @@ _return:
}
int32_t
sclExecFunction
(
SFunctionNode
*
node
,
SScalarCtx
*
ctx
,
SScalarParam
*
output
)
{
if
(
NULL
==
node
->
pParameterList
||
node
->
pParameterList
->
length
<=
0
)
{
sclError
(
"invalid function parameter list, list:%p, paramNum:%d"
,
node
->
pParameterList
,
node
->
pParameterList
?
node
->
pParameterList
->
length
:
0
);
SCL_ERR_RET
(
TSDB_CODE_QRY_INVALID_INPUT
);
}
SScalarFuncExecFuncs
ffpSet
=
{
0
};
int32_t
code
=
fmGetScalarFuncExecFuncs
(
node
->
funcId
,
&
ffpSet
);
if
(
code
)
{
sclError
(
"fmGetFuncExecFuncs failed, funcId:%d, code:%s"
,
node
->
funcId
,
tstrerror
(
code
));
SCL_ERR_RET
(
code
);
}
SScalarParam
*
params
=
NULL
;
int32_t
rowNum
=
0
;
SCL_ERR_RET
(
sclInitParamList
(
&
params
,
node
->
pParameterList
,
ctx
,
&
rowNum
));
output
->
columnData
=
createColumnInfoData
(
&
node
->
node
.
resType
,
rowNum
);
if
(
output
->
columnData
==
NULL
)
{
sclError
(
"calloc %d failed"
,
(
int32_t
)(
rowNum
*
output
->
columnData
->
info
.
bytes
));
SCL_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
int32_t
paramNum
=
0
;
int32_t
code
=
0
;
SCL_ERR_RET
(
sclInitParamList
(
&
params
,
node
->
pParameterList
,
ctx
,
&
paramNum
,
&
rowNum
));
code
=
(
*
ffpSet
.
process
)(
params
,
node
->
pParameterList
->
length
,
output
);
if
(
code
)
{
sclError
(
"scalar function exec failed, funcId:%d, code:%s"
,
node
->
funcId
,
tstrerror
(
code
));
if
(
fmIsUserDefinedFunc
(
node
->
funcId
))
{
#if 0
UdfcFuncHandle udfHandle = NULL;
SCL_ERR_JRET(setupUdf(node->functionName, &udfHandle));
code = callUdfScalarFunc(udfHandle, params, paramNum, output);
teardownUdf(udfHandle);
SCL_ERR_JRET(code);
#endif
}
else
{
SScalarFuncExecFuncs
ffpSet
=
{
0
};
code
=
fmGetScalarFuncExecFuncs
(
node
->
funcId
,
&
ffpSet
);
if
(
code
)
{
sclError
(
"fmGetFuncExecFuncs failed, funcId:%d, code:%s"
,
node
->
funcId
,
tstrerror
(
code
));
SCL_ERR_JRET
(
code
);
}
output
->
columnData
=
createColumnInfoData
(
&
node
->
node
.
resType
,
rowNum
);
if
(
output
->
columnData
==
NULL
)
{
sclError
(
"calloc %d failed"
,
(
int32_t
)(
rowNum
*
output
->
columnData
->
info
.
bytes
));
SCL_ERR_JRET
(
TSDB_CODE_QRY_OUT_OF_MEMORY
);
}
code
=
(
*
ffpSet
.
process
)(
params
,
paramNum
,
output
);
if
(
code
)
{
sclError
(
"scalar function exec failed, funcId:%d, code:%s"
,
node
->
funcId
,
tstrerror
(
code
));
SCL_ERR_JRET
(
code
);
}
}
_return:
for
(
int32_t
i
=
0
;
i
<
node
->
pParameterList
->
length
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
paramNum
;
++
i
)
{
// sclFreeParamNoData(params + i);
}
...
...
@@ -355,8 +393,13 @@ int32_t sclExecLogic(SLogicConditionNode *node, SScalarCtx *ctx, SScalarParam *o
SScalarParam
*
params
=
NULL
;
int32_t
rowNum
=
0
;
int32_t
paramNum
=
0
;
int32_t
code
=
0
;
SCL_ERR_RET
(
sclInitParamList
(
&
params
,
node
->
pParameterList
,
ctx
,
&
rowNum
));
SCL_ERR_RET
(
sclInitParamList
(
&
params
,
node
->
pParameterList
,
ctx
,
&
paramNum
,
&
rowNum
));
if
(
NULL
==
params
)
{
output
->
numOfRows
=
0
;
return
TSDB_CODE_SUCCESS
;
}
int32_t
type
=
node
->
node
.
resType
.
type
;
output
->
numOfRows
=
rowNum
;
...
...
@@ -369,25 +412,41 @@ int32_t sclExecLogic(SLogicConditionNode *node, SScalarCtx *ctx, SScalarParam *o
}
bool
value
=
false
;
bool
complete
=
true
;
for
(
int32_t
i
=
0
;
i
<
rowNum
;
++
i
)
{
for
(
int32_t
m
=
0
;
m
<
node
->
pParameterList
->
length
;
++
m
)
{
complete
=
true
;
for
(
int32_t
m
=
0
;
m
<
paramNum
;
++
m
)
{
if
(
NULL
==
params
[
m
].
columnData
)
{
complete
=
false
;
continue
;
}
char
*
p
=
colDataGetData
(
params
[
m
].
columnData
,
i
);
GET_TYPED_DATA
(
value
,
bool
,
params
[
m
].
columnData
->
info
.
type
,
p
);
if
(
LOGIC_COND_TYPE_AND
==
node
->
condType
&&
(
false
==
value
))
{
complete
=
true
;
break
;
}
else
if
(
LOGIC_COND_TYPE_OR
==
node
->
condType
&&
value
)
{
complete
=
true
;
break
;
}
else
if
(
LOGIC_COND_TYPE_NOT
==
node
->
condType
)
{
value
=
!
value
;
}
}
colDataAppend
(
output
->
columnData
,
i
,
(
char
*
)
&
value
,
false
);
if
(
complete
)
{
colDataAppend
(
output
->
columnData
,
i
,
(
char
*
)
&
value
,
false
);
}
}
if
(
SCL_IS_CONST_CALC
(
ctx
)
&&
(
false
==
complete
))
{
sclFreeParam
(
output
);
output
->
numOfRows
=
0
;
}
_return:
for
(
int32_t
i
=
0
;
i
<
node
->
pParameterList
->
length
;
++
i
)
{
for
(
int32_t
i
=
0
;
i
<
paramNum
;
++
i
)
{
// sclFreeParamNoData(params + i);
}
...
...
@@ -426,6 +485,17 @@ _return:
EDealRes
sclRewriteFunction
(
SNode
**
pNode
,
SScalarCtx
*
ctx
)
{
SFunctionNode
*
node
=
(
SFunctionNode
*
)
*
pNode
;
SNode
*
tnode
=
NULL
;
if
(
fmIsUserDefinedFunc
(
node
->
funcId
))
{
return
DEAL_RES_CONTINUE
;
}
FOREACH
(
tnode
,
node
->
pParameterList
)
{
if
(
!
SCL_IS_CONST_NODE
(
tnode
))
{
return
DEAL_RES_CONTINUE
;
}
}
SScalarParam
output
=
{
0
};
ctx
->
code
=
sclExecFunction
(
node
,
ctx
,
&
output
);
...
...
@@ -470,6 +540,10 @@ EDealRes sclRewriteLogic(SNode** pNode, SScalarCtx *ctx) {
return
DEAL_RES_ERROR
;
}
if
(
0
==
output
.
numOfRows
)
{
return
DEAL_RES_CONTINUE
;
}
SValueNode
*
res
=
(
SValueNode
*
)
nodesMakeNode
(
QUERY_NODE_VALUE
);
if
(
NULL
==
res
)
{
sclError
(
"make value node failed"
);
...
...
@@ -498,6 +572,14 @@ EDealRes sclRewriteLogic(SNode** pNode, SScalarCtx *ctx) {
EDealRes
sclRewriteOperator
(
SNode
**
pNode
,
SScalarCtx
*
ctx
)
{
SOperatorNode
*
node
=
(
SOperatorNode
*
)
*
pNode
;
if
(
!
SCL_IS_CONST_NODE
(
node
->
pLeft
))
{
return
DEAL_RES_CONTINUE
;
}
if
(
!
SCL_IS_CONST_NODE
(
node
->
pRight
))
{
return
DEAL_RES_CONTINUE
;
}
SScalarParam
output
=
{.
columnData
=
taosMemoryCalloc
(
1
,
sizeof
(
SColumnInfoData
))};
ctx
->
code
=
sclExecOperator
(
node
,
ctx
,
&
output
);
if
(
ctx
->
code
)
{
...
...
@@ -530,7 +612,7 @@ EDealRes sclRewriteOperator(SNode** pNode, SScalarCtx *ctx) {
}
EDealRes
sclConstantsRewriter
(
SNode
**
pNode
,
void
*
pContext
)
{
if
(
QUERY_NODE_VALUE
==
nodeType
(
*
pNode
)
||
QUERY_NODE_NODE_LIST
==
nodeType
(
*
pNode
))
{
if
(
QUERY_NODE_VALUE
==
nodeType
(
*
pNode
)
||
QUERY_NODE_
COLUMN
==
nodeType
(
*
pNode
)
||
QUERY_NODE_
NODE_LIST
==
nodeType
(
*
pNode
))
{
return
DEAL_RES_CONTINUE
;
}
...
...
source/libs/scalar/src/sclfunc.c
浏览文件 @
20085fea
...
...
@@ -1265,8 +1265,11 @@ int32_t todayFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOut
}
int32_t
timezoneFunction
(
SScalarParam
*
pInput
,
int32_t
inputNum
,
SScalarParam
*
pOutput
)
{
char
output
[
TD_TIMEZONE_LEN
+
VARSTR_HEADER_SIZE
]
=
{
0
};
memcpy
(
varDataVal
(
output
),
tsTimezoneStr
,
TD_TIMEZONE_LEN
);
varDataSetLen
(
output
,
strlen
(
tsTimezoneStr
));
for
(
int32_t
i
=
0
;
i
<
pInput
->
numOfRows
;
++
i
)
{
colDataAppend
(
pOutput
->
columnData
,
i
,
tsTimezoneStr
,
false
);
colDataAppend
(
pOutput
->
columnData
,
i
,
output
,
false
);
}
pOutput
->
numOfRows
=
pInput
->
numOfRows
;
return
TSDB_CODE_SUCCESS
;
...
...
source/libs/scalar/test/scalar/scalarTests.cpp
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/libs/sync/CMakeLists.txt
浏览文件 @
20085fea
...
...
@@ -11,7 +11,7 @@ target_link_libraries(
target_include_directories
(
sync
PUBLIC
"
${
CMAKE
_SOURCE_DIR
}
/include/libs/sync"
PUBLIC
"
${
TD
_SOURCE_DIR
}
/include/libs/sync"
PRIVATE
"
${
CMAKE_CURRENT_SOURCE_DIR
}
/inc"
)
...
...
source/libs/sync/test/CMakeLists.txt
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/libs/wal/src/walRead.c
浏览文件 @
20085fea
...
...
@@ -138,6 +138,91 @@ static int32_t walReadSeekVer(SWalReadHandle *pRead, int64_t ver) {
return
0
;
}
void
walSetReaderCapacity
(
SWalReadHandle
*
pRead
,
int32_t
capacity
)
{
pRead
->
capacity
=
capacity
;
}
int32_t
walFetchHead
(
SWalReadHandle
*
pRead
,
int64_t
ver
,
SWalHead
*
pHead
)
{
int32_t
code
;
// TODO: valid ver
if
(
pRead
->
curVersion
!=
ver
)
{
code
=
walReadSeekVer
(
pRead
,
ver
);
if
(
code
<
0
)
return
-
1
;
}
if
(
!
taosValidFile
(
pRead
->
pReadLogTFile
))
{
return
-
1
;
}
code
=
taosReadFile
(
pRead
->
pReadLogTFile
,
pHead
,
sizeof
(
SWalHead
));
if
(
code
!=
sizeof
(
SWalHead
))
{
return
-
1
;
}
code
=
walValidHeadCksum
(
pHead
);
if
(
code
!=
0
)
{
wError
(
"unexpected wal log version: % "
PRId64
", since head checksum not passed"
,
ver
);
terrno
=
TSDB_CODE_WAL_FILE_CORRUPTED
;
return
-
1
;
}
return
0
;
}
int32_t
walSkipFetchBody
(
SWalReadHandle
*
pRead
,
const
SWalHead
*
pHead
)
{
int32_t
code
;
ASSERT
(
pRead
->
curVersion
==
pHead
->
head
.
version
);
code
=
taosLSeekFile
(
pRead
->
pReadLogTFile
,
pHead
->
head
.
bodyLen
,
SEEK_CUR
);
if
(
code
<
0
)
{
terrno
=
TAOS_SYSTEM_ERROR
(
errno
);
pRead
->
curVersion
=
-
1
;
return
-
1
;
}
pRead
->
curVersion
++
;
return
0
;
}
int32_t
walFetchBody
(
SWalReadHandle
*
pRead
,
SWalHead
**
ppHead
)
{
SWalReadHead
*
pReadHead
=
&
((
*
ppHead
)
->
head
);
int64_t
ver
=
pReadHead
->
version
;
if
(
pRead
->
capacity
<
pReadHead
->
bodyLen
)
{
void
*
ptr
=
taosMemoryRealloc
(
*
ppHead
,
sizeof
(
SWalHead
)
+
pReadHead
->
bodyLen
);
if
(
ptr
==
NULL
)
{
terrno
=
TSDB_CODE_WAL_OUT_OF_MEMORY
;
return
-
1
;
}
*
ppHead
=
ptr
;
pRead
->
capacity
=
pReadHead
->
bodyLen
;
}
if
(
pReadHead
->
bodyLen
!=
taosReadFile
(
pRead
->
pReadLogTFile
,
pReadHead
->
body
,
pReadHead
->
bodyLen
))
{
return
-
1
;
}
if
(
pReadHead
->
version
!=
ver
)
{
wError
(
"unexpected wal log version: %"
PRId64
", read request version:%"
PRId64
""
,
pRead
->
pHead
->
head
.
version
,
ver
);
pRead
->
curVersion
=
-
1
;
terrno
=
TSDB_CODE_WAL_FILE_CORRUPTED
;
return
-
1
;
}
if
(
walValidBodyCksum
(
*
ppHead
)
!=
0
)
{
wError
(
"unexpected wal log version: % "
PRId64
", since body checksum not passed"
,
ver
);
pRead
->
curVersion
=
-
1
;
terrno
=
TSDB_CODE_WAL_FILE_CORRUPTED
;
return
-
1
;
}
pRead
->
curVersion
=
ver
+
1
;
return
0
;
}
int32_t
walReadWithHandle_s
(
SWalReadHandle
*
pRead
,
int64_t
ver
,
SWalReadHead
**
ppHead
)
{
taosThreadMutexLock
(
&
pRead
->
mutex
);
if
(
walReadWithHandle
(
pRead
,
ver
)
<
0
)
{
...
...
@@ -172,12 +257,14 @@ int32_t walReadWithHandle(SWalReadHandle *pRead, int64_t ver) {
if
(
code
!=
sizeof
(
SWalHead
))
{
return
-
1
;
}
code
=
walValidHeadCksum
(
pRead
->
pHead
);
if
(
code
!=
0
)
{
wError
(
"unexpected wal log version: % "
PRId64
", since head checksum not passed"
,
ver
);
terrno
=
TSDB_CODE_WAL_FILE_CORRUPTED
;
return
-
1
;
}
if
(
pRead
->
capacity
<
pRead
->
pHead
->
head
.
bodyLen
)
{
void
*
ptr
=
taosMemoryRealloc
(
pRead
->
pHead
,
sizeof
(
SWalHead
)
+
pRead
->
pHead
->
head
.
bodyLen
);
if
(
ptr
==
NULL
)
{
...
...
source/libs/wal/src/walWrite.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/util/src/tarray.c
浏览文件 @
20085fea
...
...
@@ -476,6 +476,7 @@ void* taosDecodeArray(const void* buf, SArray** pArray, FDecode decode, int32_t
return
(
void
*
)
buf
;
}
// todo remove it
// order array<type *>
void
taosArraySortPWithExt
(
SArray
*
pArray
,
__ext_compar_fn_t
fn
,
const
void
*
param
)
{
taosArrayGetSize
(
pArray
)
>
8
?
taosArrayQuickSort
(
pArray
,
fn
,
param
)
:
taosArrayInsertSort
(
pArray
,
fn
,
param
);
...
...
source/util/src/tconfig.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/util/src/tenv.c
0 → 100644
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/util/src/terror.c
浏览文件 @
20085fea
...
...
@@ -258,7 +258,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_COLUMN_ALREADY_EXIST, "Column already exists
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_COLUMN_NOT_EXIST
,
"Column does not exist"
)
// mnode-infoSchema
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_INVALID_
INFOS_TBL
,
"Invalid information schema
table name"
)
TAOS_DEFINE_ERROR
(
TSDB_CODE_MND_INVALID_
SYS_TABLENAME
,
"Invalid system
table name"
)
// mnode-func
...
...
source/util/src/tjson.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/util/test/CMakeLists.txt
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
source/util/test/cfgTest.cpp
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tests/script/sh/massiveTable/compileVersion.sh
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tests/script/tsim/parser/groupby-basic.sim
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tests/script/tsim/stable/disk.sim
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tests/system-test/2-query/cast.py
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tests/system-test/fulltest.sh
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tests/tsim/src/simSystem.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tools/shell/CMakeLists.txt
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
tools/shell/src/shellNettest.c
浏览文件 @
20085fea
此差异已折叠。
点击以展开。
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录