Merge branch '3.0' into cpwu/3.0
This commit is contained in:
commit
e6d76aa46d
12
Jenkinsfile2
12
Jenkinsfile2
|
@ -88,12 +88,6 @@ def pre_test(){
|
||||||
cmake .. > /dev/null
|
cmake .. > /dev/null
|
||||||
make -j4> /dev/null
|
make -j4> /dev/null
|
||||||
'''
|
'''
|
||||||
sh'''
|
|
||||||
cd ${WKPY}
|
|
||||||
git reset --hard
|
|
||||||
git pull
|
|
||||||
pip3 install .
|
|
||||||
'''
|
|
||||||
return 1
|
return 1
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -103,7 +97,6 @@ pipeline {
|
||||||
environment{
|
environment{
|
||||||
WK = '/var/lib/jenkins/workspace/TDinternal'
|
WK = '/var/lib/jenkins/workspace/TDinternal'
|
||||||
WKC= '/var/lib/jenkins/workspace/TDengine'
|
WKC= '/var/lib/jenkins/workspace/TDengine'
|
||||||
WKPY= '/var/lib/jenkins/workspace/taos-connector-python'
|
|
||||||
}
|
}
|
||||||
stages {
|
stages {
|
||||||
stage('pre_build'){
|
stage('pre_build'){
|
||||||
|
@ -124,11 +117,6 @@ pipeline {
|
||||||
./test-all.sh b1fq
|
./test-all.sh b1fq
|
||||||
'''
|
'''
|
||||||
sh'''
|
sh'''
|
||||||
export LD_LIBRARY_PATH=${WKC}/debug/build/lib
|
|
||||||
cd ${WKC}/tests/system-test
|
|
||||||
./fulltest.sh
|
|
||||||
'''
|
|
||||||
sh'''
|
|
||||||
cd ${WKC}/debug
|
cd ${WKC}/debug
|
||||||
ctest
|
ctest
|
||||||
'''
|
'''
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
cmake_minimum_required(VERSION 3.16)
|
cmake_minimum_required(VERSION 3.16)
|
||||||
|
|
||||||
|
set(CMAKE_VERBOSE_MAKEFILE ON)
|
||||||
|
|
||||||
#set output directory
|
#set output directory
|
||||||
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/lib)
|
SET(LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/lib)
|
||||||
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin)
|
SET(EXECUTABLE_OUTPUT_PATH ${PROJECT_BINARY_DIR}/build/bin)
|
||||||
|
@ -43,11 +45,14 @@ ENDIF ()
|
||||||
IF (TD_WINDOWS)
|
IF (TD_WINDOWS)
|
||||||
MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}")
|
MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}")
|
||||||
SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE)
|
SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE)
|
||||||
SET(COMMON_FLAGS "/nologo /WX /wd4018 /wd4999 /Oi /Oy- /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /errorReport:prompt /analyze-")
|
SET(COMMON_FLAGS "/W3 /D_WIN32")
|
||||||
|
|
||||||
IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900))
|
# IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900))
|
||||||
SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18")
|
# SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18")
|
||||||
ENDIF ()
|
# ENDIF ()
|
||||||
|
|
||||||
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${COMMON_FLAGS}")
|
||||||
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
|
||||||
|
|
||||||
ELSE ()
|
ELSE ()
|
||||||
IF (${SANITIZER} MATCHES "true")
|
IF (${SANITIZER} MATCHES "true")
|
||||||
|
|
|
@ -25,9 +25,28 @@ IF(${TD_WINDOWS})
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
ENDIF ()
|
MESSAGE("build msvcregex Win32")
|
||||||
|
option(
|
||||||
|
BUILD_MSVCREGEX
|
||||||
|
"If build msvcregex on Windows"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
IF(${TD_LINUX} MATCHES TRUE)
|
MESSAGE("build wcwidth Win32")
|
||||||
|
option(
|
||||||
|
BUILD_WCWIDTH
|
||||||
|
"If build wcwidth on Windows"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
|
MESSAGE("build wingetopt Win32")
|
||||||
|
option(
|
||||||
|
BUILD_WINGETOPT
|
||||||
|
"If build wingetopt on Windows"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_TEST
|
BUILD_TEST
|
||||||
|
@ -35,8 +54,6 @@ option(
|
||||||
ON
|
ON
|
||||||
)
|
)
|
||||||
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_WITH_LEVELDB
|
BUILD_WITH_LEVELDB
|
||||||
"If build with leveldb"
|
"If build with leveldb"
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# msvcregex
|
||||||
|
ExternalProject_Add(msvcregex
|
||||||
|
GIT_REPOSITORY https://gitee.com/l0km/libgnurx-msvc.git
|
||||||
|
GIT_TAG master
|
||||||
|
SOURCE_DIR "${TD_CONTRIB_DIR}/msvcregex"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -3,7 +3,7 @@
|
||||||
ExternalProject_Add(pthread
|
ExternalProject_Add(pthread
|
||||||
GIT_REPOSITORY https://github.com/GerHobbelt/pthread-win32
|
GIT_REPOSITORY https://github.com/GerHobbelt/pthread-win32
|
||||||
GIT_TAG v3.0.3.1
|
GIT_TAG v3.0.3.1
|
||||||
SOURCE_DIR "${TD_CONTRIB_DIR}/pthread-win32"
|
SOURCE_DIR "${TD_CONTRIB_DIR}/pthread"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
CONFIGURE_COMMAND ""
|
CONFIGURE_COMMAND ""
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# wcwidth
|
||||||
|
ExternalProject_Add(wcwidth
|
||||||
|
GIT_REPOSITORY https://github.com/fumiyas/wcwidth-cjk.git
|
||||||
|
GIT_TAG master
|
||||||
|
SOURCE_DIR "${TD_CONTRIB_DIR}/wcwidth"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -0,0 +1,13 @@
|
||||||
|
|
||||||
|
# wingetopt
|
||||||
|
ExternalProject_Add(wingetopt
|
||||||
|
GIT_REPOSITORY https://github.com/alex85k/wingetopt.git
|
||||||
|
GIT_TAG master
|
||||||
|
SOURCE_DIR "${TD_CONTRIB_DIR}/wingetopt"
|
||||||
|
BINARY_DIR ""
|
||||||
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
CONFIGURE_COMMAND ""
|
||||||
|
BUILD_COMMAND ""
|
||||||
|
INSTALL_COMMAND ""
|
||||||
|
TEST_COMMAND ""
|
||||||
|
)
|
|
@ -14,9 +14,24 @@ if(${BUILD_PTHREAD})
|
||||||
cat("${TD_SUPPORT_DIR}/pthread_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
cat("${TD_SUPPORT_DIR}/pthread_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# gnu regex
|
# iconv
|
||||||
if(${BUILD_GNUREGEX})
|
if(${BUILD_WITH_ICONV})
|
||||||
cat("${TD_SUPPORT_DIR}/gnuregex_CMakeLists.txt.in" ${CONTRIB_TMP_FILE})
|
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})
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
# googletest
|
# googletest
|
||||||
|
@ -99,8 +114,27 @@ if(${BUILD_TEST})
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
gtest
|
gtest
|
||||||
PUBLIC $<BUILD_INTERFACE:${CMAKE_CURRENT_SOURCE_DIR}/cpp-stub/src>
|
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})
|
endif(${BUILD_TEST})
|
||||||
|
|
||||||
# cJson
|
# cJson
|
||||||
|
@ -182,6 +216,53 @@ if(${BUILD_WITH_NURAFT})
|
||||||
add_subdirectory(nuraft)
|
add_subdirectory(nuraft)
|
||||||
endif(${BUILD_WITH_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
|
# CRAFT
|
||||||
if(${BUILD_WITH_CRAFT})
|
if(${BUILD_WITH_CRAFT})
|
||||||
add_library(craft STATIC IMPORTED GLOBAL)
|
add_library(craft STATIC IMPORTED GLOBAL)
|
||||||
|
@ -238,8 +319,12 @@ if(${BUILD_WITH_SQLITE})
|
||||||
target_link_libraries(sqlite
|
target_link_libraries(sqlite
|
||||||
INTERFACE m
|
INTERFACE m
|
||||||
INTERFACE pthread
|
INTERFACE pthread
|
||||||
INTERFACE dl
|
|
||||||
)
|
)
|
||||||
|
if(NOT TD_WINDOWS)
|
||||||
|
target_link_libraries(sqlite
|
||||||
|
INTERFACE dl
|
||||||
|
)
|
||||||
|
endif(NOT TD_WINDOWS)
|
||||||
endif(${BUILD_WITH_SQLITE})
|
endif(${BUILD_WITH_SQLITE})
|
||||||
|
|
||||||
# pthread
|
# pthread
|
||||||
|
|
|
@ -1,2 +1,9 @@
|
||||||
add_executable(simulate_vnode "simulate_vnode.c")
|
add_executable(simulate_vnode "simulate_vnode.c")
|
||||||
target_link_libraries(simulate_vnode PUBLIC craft lz4 uv_a)
|
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()
|
|
@ -6,43 +6,39 @@
|
||||||
#define POINTER_SHIFT(ptr, s) ((void *)(((char *)ptr) + (s)))
|
#define POINTER_SHIFT(ptr, s) ((void *)(((char *)ptr) + (s)))
|
||||||
#define POINTER_DISTANCE(pa, pb) ((char *)(pb) - (char *)(pa))
|
#define POINTER_DISTANCE(pa, pb) ((char *)(pb) - (char *)(pa))
|
||||||
|
|
||||||
#define tPutA(buf, val) \
|
static inline void tPutA(void **buf, uint64_t val) {
|
||||||
({ \
|
memcpy(buf, &val, sizeof(val));
|
||||||
memcpy(buf, &val, sizeof(val)); \
|
*buf = POINTER_SHIFT(buf, sizeof(val));
|
||||||
POINTER_SHIFT(buf, sizeof(val)); \
|
}
|
||||||
})
|
|
||||||
|
|
||||||
#define tPutB(buf, val) \
|
static inline void tPutB(void **buf, uint64_t val) {
|
||||||
({ \
|
((uint8_t *)buf)[7] = ((val) >> 56) & 0xff;
|
||||||
((uint8_t *)buf)[7] = ((val) >> 56) & 0xff; \
|
((uint8_t *)buf)[6] = ((val) >> 48) & 0xff;
|
||||||
((uint8_t *)buf)[6] = ((val) >> 48) & 0xff; \
|
((uint8_t *)buf)[5] = ((val) >> 40) & 0xff;
|
||||||
((uint8_t *)buf)[5] = ((val) >> 40) & 0xff; \
|
((uint8_t *)buf)[4] = ((val) >> 32) & 0xff;
|
||||||
((uint8_t *)buf)[4] = ((val) >> 32) & 0xff; \
|
((uint8_t *)buf)[3] = ((val) >> 24) & 0xff;
|
||||||
((uint8_t *)buf)[3] = ((val) >> 24) & 0xff; \
|
((uint8_t *)buf)[2] = ((val) >> 16) & 0xff;
|
||||||
((uint8_t *)buf)[2] = ((val) >> 16) & 0xff; \
|
((uint8_t *)buf)[1] = ((val) >> 8) & 0xff;
|
||||||
((uint8_t *)buf)[1] = ((val) >> 8) & 0xff; \
|
((uint8_t *)buf)[0] = (val)&0xff;
|
||||||
((uint8_t *)buf)[0] = (val)&0xff; \
|
*buf = POINTER_SHIFT(buf, sizeof(val));
|
||||||
POINTER_SHIFT(buf, sizeof(val)); \
|
}
|
||||||
})
|
|
||||||
|
|
||||||
#define tPutC(buf, val) \
|
static inline void tPutC(void **buf, uint64_t val) {
|
||||||
({ \
|
if (buf) {
|
||||||
if (buf) { \
|
((uint64_t *)buf)[0] = (val);
|
||||||
((uint64_t *)buf)[0] = (val); \
|
POINTER_SHIFT(buf, sizeof(val));
|
||||||
POINTER_SHIFT(buf, sizeof(val)); \
|
}
|
||||||
} \
|
*buf = NULL;
|
||||||
NULL; \
|
}
|
||||||
})
|
|
||||||
|
|
||||||
#define tPutD(buf, val) \
|
static inline void tPutD(void **buf, uint64_t val) {
|
||||||
({ \
|
uint64_t tmp = val;
|
||||||
uint64_t tmp = val; \
|
for (size_t i = 0; i < sizeof(val); i++) {
|
||||||
for (size_t i = 0; i < sizeof(val); i++) { \
|
((uint8_t *)buf)[i] = tmp & 0xff;
|
||||||
((uint8_t *)buf)[i] = tmp & 0xff; \
|
tmp >>= 8;
|
||||||
tmp >>= 8; \
|
}
|
||||||
} \
|
*buf = POINTER_SHIFT(buf, sizeof(val));
|
||||||
POINTER_SHIFT(buf, sizeof(val)); \
|
}
|
||||||
})
|
|
||||||
|
|
||||||
static inline void tPutE(void **buf, uint64_t val) {
|
static inline void tPutE(void **buf, uint64_t val) {
|
||||||
if (buf) {
|
if (buf) {
|
||||||
|
@ -61,7 +57,7 @@ static void func(T t) {
|
||||||
switch (t) {
|
switch (t) {
|
||||||
case A:
|
case A:
|
||||||
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
||||||
pBuf = tPutA(pBuf, val);
|
tPutA(pBuf, val);
|
||||||
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
||||||
pBuf = buf;
|
pBuf = buf;
|
||||||
}
|
}
|
||||||
|
@ -69,7 +65,7 @@ static void func(T t) {
|
||||||
break;
|
break;
|
||||||
case B:
|
case B:
|
||||||
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
||||||
pBuf = tPutB(pBuf, val);
|
tPutB(pBuf, val);
|
||||||
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
||||||
pBuf = buf;
|
pBuf = buf;
|
||||||
}
|
}
|
||||||
|
@ -77,7 +73,7 @@ static void func(T t) {
|
||||||
break;
|
break;
|
||||||
case C:
|
case C:
|
||||||
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
||||||
pBuf = tPutC(pBuf, val);
|
tPutC(pBuf, val);
|
||||||
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
||||||
pBuf = buf;
|
pBuf = buf;
|
||||||
}
|
}
|
||||||
|
@ -85,7 +81,7 @@ static void func(T t) {
|
||||||
break;
|
break;
|
||||||
case D:
|
case D:
|
||||||
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
for (size_t i = 0; i < 10 * 1024l * 1024l * 1024l; i++) {
|
||||||
pBuf = tPutD(pBuf, val);
|
tPutD(pBuf, val);
|
||||||
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
if (POINTER_DISTANCE(buf, pBuf) == 1024) {
|
||||||
pBuf = buf;
|
pBuf = buf;
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,6 +39,7 @@ target_include_directories(tstream
|
||||||
|
|
||||||
target_include_directories(demoapi
|
target_include_directories(demoapi
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/client"
|
PUBLIC "${TD_SOURCE_DIR}/include/client"
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -4,10 +4,12 @@
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <unistd.h>
|
// #include <unistd.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
|
#ifndef WINDOWS
|
||||||
#include <argp.h>
|
#include <argp.h>
|
||||||
|
#endif
|
||||||
|
#include "osSleep.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
#define debugPrint(fmt, ...) \
|
#define debugPrint(fmt, ...) \
|
||||||
|
@ -32,6 +34,7 @@
|
||||||
int64_t g_num_of_tb = 2;
|
int64_t g_num_of_tb = 2;
|
||||||
int64_t g_num_of_rec = 3;
|
int64_t g_num_of_rec = 3;
|
||||||
|
|
||||||
|
#ifndef WINDOWS
|
||||||
static struct argp_option options[] = {
|
static struct argp_option options[] = {
|
||||||
{"tables", 't', "NUMBER", 0, "Number of child tables, default is 10000."},
|
{"tables", 't', "NUMBER", 0, "Number of child tables, default is 10000."},
|
||||||
{"records", 'n', "NUMBER", 0,
|
{"records", 'n', "NUMBER", 0,
|
||||||
|
@ -61,16 +64,16 @@ static error_t parse_opt(int key, char *arg, struct argp_state *state) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static struct argp argp = {options, parse_opt, "", ""};
|
static struct argp argp = {options, parse_opt, "", ""};
|
||||||
|
#endif
|
||||||
static void prepare_data(TAOS* taos) {
|
static void prepare_data(TAOS* taos) {
|
||||||
TAOS_RES *res;
|
TAOS_RES *res;
|
||||||
res = taos_query(taos, "drop database if exists test;");
|
res = taos_query(taos, "drop database if exists test;");
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
usleep(100000);
|
taosMsleep(100);
|
||||||
|
|
||||||
res = taos_query(taos, "create database test;");
|
res = taos_query(taos, "create database test;");
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
usleep(100000);
|
taosMsleep(100);
|
||||||
taos_select_db(taos, "test");
|
taos_select_db(taos, "test");
|
||||||
|
|
||||||
char command[1024] = {0};
|
char command[1024] = {0};
|
||||||
|
@ -87,18 +90,17 @@ static void prepare_data(TAOS* taos) {
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
|
|
||||||
for (int64_t i = 0; i < g_num_of_tb; i ++) {
|
for (int64_t i = 0; i < g_num_of_tb; i ++) {
|
||||||
|
// sprintf(command, "create table t%"PRId64" using meters "
|
||||||
|
// "tags(%"PRId64", '%s', '%s', '%s');",
|
||||||
|
// i, i, (i%2)?"beijing":"shanghai",
|
||||||
|
// (i%2)?"朝阳区":"黄浦区",
|
||||||
|
// (i%2)?"长安街":"中山路");
|
||||||
sprintf(command, "create table t%"PRId64" using meters "
|
sprintf(command, "create table t%"PRId64" using meters "
|
||||||
"tags(%"PRId64", '%s', '%s', '%s');",
|
|
||||||
i, i, (i%2)?"beijing":"shanghai",
|
|
||||||
(i%2)?"朝阳区":"黄浦区",
|
|
||||||
(i%2)?"长安街":"中山路");
|
|
||||||
/* sprintf(command, "create table t%"PRId64" using meters "
|
|
||||||
"tags(%"PRId64", '%s', '%s', '%s');",
|
"tags(%"PRId64", '%s', '%s', '%s');",
|
||||||
i, i,
|
i, i,
|
||||||
(i%2)?"beijing":"shanghai",
|
(i%2)?"beijing":"shanghai",
|
||||||
(i%2)?"chaoyang":"huangpu",
|
(i%2)?"chaoyang":"huangpu",
|
||||||
(i%2?"changan street":"jianguo rd"));
|
(i%2?"changan street":"jianguo rd"));
|
||||||
*/
|
|
||||||
res = taos_query(taos, command);
|
res = taos_query(taos, command);
|
||||||
if ((res) && (0 == taos_errno(res))) {
|
if ((res) && (0 == taos_errno(res))) {
|
||||||
okPrint("t%" PRId64 " created\n", i);
|
okPrint("t%" PRId64 " created\n", i);
|
||||||
|
@ -117,7 +119,8 @@ static void prepare_data(TAOS* taos) {
|
||||||
"'%c%d', '%s%c%d', '%c%d')",
|
"'%c%d', '%s%c%d', '%c%d')",
|
||||||
i, 1650000000000+j, (float)j, j,
|
i, 1650000000000+j, (float)j, j,
|
||||||
'a'+(int)j%25, rand(),
|
'a'+(int)j%25, rand(),
|
||||||
"涛思", 'z' - (int)j%25, rand(),
|
// "涛思", 'z' - (int)j%25, rand(),
|
||||||
|
"TAOS", 'z' - (int)j%25, rand(),
|
||||||
'b' - (int)j%25, rand()
|
'b' - (int)j%25, rand()
|
||||||
);
|
);
|
||||||
res = taos_query(taos, command);
|
res = taos_query(taos, command);
|
||||||
|
@ -196,7 +199,7 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d, row: %"PRId64", "
|
printf("col%d, row: %"PRId64", "
|
||||||
"value: %"PRId64"\n",
|
"value: %"PRId64"\n",
|
||||||
f, c,
|
f, c,
|
||||||
*(int64_t*)(row[f]+c*sizeof(int64_t)));
|
*(int64_t*)((char*)(row[f])+c*sizeof(int64_t)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -208,7 +211,7 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d, row: %"PRId64", "
|
printf("col%d, row: %"PRId64", "
|
||||||
"value: %d\n",
|
"value: %d\n",
|
||||||
f, c,
|
f, c,
|
||||||
*(int32_t*)(row[f]+c*sizeof(int32_t)));
|
*(int32_t*)((char*)(row[f])+c*sizeof(int32_t)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -220,7 +223,7 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d, row: %"PRId64", "
|
printf("col%d, row: %"PRId64", "
|
||||||
"value: %f\n",
|
"value: %f\n",
|
||||||
f, c,
|
f, c,
|
||||||
*(float*)(row[f]+c*sizeof(float)));
|
*(float*)((char*)(row[f])+c*sizeof(float)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -235,9 +238,9 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
if (offsets) {
|
if (offsets) {
|
||||||
for (int c = 0; c < rows; c++) {
|
for (int c = 0; c < rows; c++) {
|
||||||
if (offsets[c] != -1) {
|
if (offsets[c] != -1) {
|
||||||
int length = *(int16_t*)(row[f] + offsets[c]);
|
int length = *(int16_t*)((char*)(row[f]) + offsets[c]);
|
||||||
char *buf = calloc(1, length + 1);
|
char *buf = calloc(1, length + 1);
|
||||||
strncpy(buf, (char *)(row[f] + offsets[c] + 2), length);
|
strncpy(buf, (char *)((char*)(row[f]) + offsets[c] + 2), length);
|
||||||
printf("row: %d, col: %d, offset: %d, length: %d, content: %s\n",
|
printf("row: %d, col: %d, offset: %d, length: %d, content: %s\n",
|
||||||
c, f, offsets[c], length, buf);
|
c, f, offsets[c], length, buf);
|
||||||
free(buf);
|
free(buf);
|
||||||
|
@ -314,8 +317,9 @@ int main(int argc, char *argv[]) {
|
||||||
const char* host = "127.0.0.1";
|
const char* host = "127.0.0.1";
|
||||||
const char* user = "root";
|
const char* user = "root";
|
||||||
const char* passwd = "taosdata";
|
const char* passwd = "taosdata";
|
||||||
|
#ifndef WINDOWS
|
||||||
argp_parse(&argp, argc, argv, 0, 0, NULL);
|
argp_parse(&argp, argc, argv, 0, 0, NULL);
|
||||||
|
#endif
|
||||||
TAOS* taos = taos_connect(host, user, passwd, "", 0);
|
TAOS* taos = taos_connect(host, user, passwd, "", 0);
|
||||||
if (taos == NULL) {
|
if (taos == NULL) {
|
||||||
printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
|
printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
|
||||||
|
|
|
@ -146,6 +146,7 @@ DLL_EXPORT TAOS_RES *taos_stmt_use_result(TAOS_STMT *stmt);
|
||||||
DLL_EXPORT int taos_stmt_close(TAOS_STMT *stmt);
|
DLL_EXPORT int taos_stmt_close(TAOS_STMT *stmt);
|
||||||
DLL_EXPORT char *taos_stmt_errstr(TAOS_STMT *stmt);
|
DLL_EXPORT char *taos_stmt_errstr(TAOS_STMT *stmt);
|
||||||
DLL_EXPORT int taos_stmt_affected_rows(TAOS_STMT *stmt);
|
DLL_EXPORT int taos_stmt_affected_rows(TAOS_STMT *stmt);
|
||||||
|
DLL_EXPORT int taos_stmt_affected_rows_once(TAOS_STMT *stmt);
|
||||||
|
|
||||||
DLL_EXPORT TAOS_RES *taos_query(TAOS *taos, const char *sql);
|
DLL_EXPORT TAOS_RES *taos_query(TAOS *taos, const char *sql);
|
||||||
DLL_EXPORT TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen);
|
DLL_EXPORT TAOS_RES *taos_query_l(TAOS *taos, const char *sql, int sqlLen);
|
||||||
|
|
|
@ -78,13 +78,6 @@ typedef enum {
|
||||||
TSDB_SMA_TYPE_ROLLUP = 2, // Rollup SMA
|
TSDB_SMA_TYPE_ROLLUP = 2, // Rollup SMA
|
||||||
} ETsdbSmaType;
|
} ETsdbSmaType;
|
||||||
|
|
||||||
typedef enum {
|
|
||||||
TSDB_BSMA_TYPE_NONE = 0, // no block-wise SMA
|
|
||||||
TSDB_BSMA_TYPE_I = 1, // sum/min/max(default)
|
|
||||||
} ETsdbBSmaType;
|
|
||||||
|
|
||||||
#define TSDB_BSMA_TYPE_LATEST TSDB_BSMA_TYPE_I
|
|
||||||
|
|
||||||
extern char *qtypeStr[];
|
extern char *qtypeStr[];
|
||||||
|
|
||||||
#define TSDB_PORT_HTTP 11
|
#define TSDB_PORT_HTTP 11
|
||||||
|
|
|
@ -326,6 +326,13 @@ int32_t tDecodeSEpSet(SCoder* pDecoder, SEpSet* pEp);
|
||||||
int32_t taosEncodeSEpSet(void** buf, const SEpSet* pEp);
|
int32_t taosEncodeSEpSet(void** buf, const SEpSet* pEp);
|
||||||
void* taosDecodeSEpSet(const void* buf, SEpSet* pEp);
|
void* taosDecodeSEpSet(const void* buf, SEpSet* pEp);
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
SEpSet epSet;
|
||||||
|
} SMEpSet;
|
||||||
|
|
||||||
|
int32_t tSerializeSMEpSet(void* buf, int32_t bufLen, SMEpSet* pReq);
|
||||||
|
int32_t tDeserializeSMEpSet(void* buf, int32_t buflen, SMEpSet* pReq);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t connType;
|
int8_t connType;
|
||||||
int32_t pid;
|
int32_t pid;
|
||||||
|
@ -682,6 +689,7 @@ int32_t tDeserializeSDropFuncReq(void* buf, int32_t bufLen, SDropFuncReq* pReq);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t numOfFuncs;
|
int32_t numOfFuncs;
|
||||||
|
bool ignoreCodeComment;
|
||||||
SArray* pFuncNames;
|
SArray* pFuncNames;
|
||||||
} SRetrieveFuncReq;
|
} SRetrieveFuncReq;
|
||||||
|
|
||||||
|
@ -710,6 +718,7 @@ typedef struct {
|
||||||
|
|
||||||
int32_t tSerializeSRetrieveFuncRsp(void* buf, int32_t bufLen, SRetrieveFuncRsp* pRsp);
|
int32_t tSerializeSRetrieveFuncRsp(void* buf, int32_t bufLen, SRetrieveFuncRsp* pRsp);
|
||||||
int32_t tDeserializeSRetrieveFuncRsp(void* buf, int32_t bufLen, SRetrieveFuncRsp* pRsp);
|
int32_t tDeserializeSRetrieveFuncRsp(void* buf, int32_t bufLen, SRetrieveFuncRsp* pRsp);
|
||||||
|
void tFreeSFuncInfo(SFuncInfo *pInfo);
|
||||||
void tFreeSRetrieveFuncRsp(SRetrieveFuncRsp* pRsp);
|
void tFreeSRetrieveFuncRsp(SRetrieveFuncRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -982,7 +991,6 @@ int32_t tDeserializeSShowRsp(void* buf, int32_t bufLen, SShowRsp* pRsp);
|
||||||
void tFreeSShowRsp(SShowRsp* pRsp);
|
void tFreeSShowRsp(SShowRsp* pRsp);
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t type;
|
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
char tb[TSDB_TABLE_NAME_LEN];
|
char tb[TSDB_TABLE_NAME_LEN];
|
||||||
int64_t showId;
|
int64_t showId;
|
||||||
|
@ -1275,11 +1283,16 @@ typedef struct {
|
||||||
} SMVCreateStreamRsp, SMSCreateStreamRsp;
|
} SMVCreateStreamRsp, SMSCreateStreamRsp;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char name[TSDB_TOPIC_FNAME_LEN];
|
char name[TSDB_TOPIC_FNAME_LEN];
|
||||||
int8_t igExists;
|
int8_t igExists;
|
||||||
char* sql;
|
int8_t withTbName;
|
||||||
char* ast;
|
int8_t withSchema;
|
||||||
char subscribeDbName[TSDB_DB_NAME_LEN];
|
int8_t withTag;
|
||||||
|
int8_t withTagSchema;
|
||||||
|
char* sql;
|
||||||
|
char* ast;
|
||||||
|
int64_t subDbUid;
|
||||||
|
char subscribeDbName[TSDB_DB_NAME_LEN];
|
||||||
} SCMCreateTopicReq;
|
} SCMCreateTopicReq;
|
||||||
|
|
||||||
int32_t tSerializeSCMCreateTopicReq(void* buf, int32_t bufLen, const SCMCreateTopicReq* pReq);
|
int32_t tSerializeSCMCreateTopicReq(void* buf, int32_t bufLen, const SCMCreateTopicReq* pReq);
|
||||||
|
@ -1473,8 +1486,12 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
float xFilesFactor;
|
float xFilesFactor;
|
||||||
int32_t delay;
|
int32_t delay;
|
||||||
int8_t nFuncIds;
|
int32_t qmsg1Len;
|
||||||
|
int32_t qmsg2Len;
|
||||||
func_id_t* pFuncIds;
|
func_id_t* pFuncIds;
|
||||||
|
char* qmsg1; // not null: pAst1:qmsg1:SRetention1 => trigger aggr task1
|
||||||
|
char* qmsg2; // not null: pAst2:qmsg2:SRetention2 => trigger aggr task2
|
||||||
|
int8_t nFuncIds;
|
||||||
} SRSmaParam;
|
} SRSmaParam;
|
||||||
|
|
||||||
typedef struct SVCreateTbReq {
|
typedef struct SVCreateTbReq {
|
||||||
|
@ -1934,12 +1951,22 @@ static FORCE_INLINE void* taosDecodeSMqMsg(void* buf, SMqHbMsg* pMsg) {
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum {
|
||||||
|
TOPIC_SUB_TYPE__DB = 1,
|
||||||
|
TOPIC_SUB_TYPE__TABLE,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t leftForVer;
|
int64_t leftForVer;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int64_t oldConsumerId;
|
int64_t oldConsumerId;
|
||||||
int64_t newConsumerId;
|
int64_t newConsumerId;
|
||||||
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
||||||
|
int8_t subType;
|
||||||
|
int8_t withTbName;
|
||||||
|
int8_t withSchema;
|
||||||
|
int8_t withTag;
|
||||||
|
int8_t withTagSchema;
|
||||||
char* qmsg;
|
char* qmsg;
|
||||||
} SMqRebVgReq;
|
} SMqRebVgReq;
|
||||||
|
|
||||||
|
@ -1950,7 +1977,14 @@ static FORCE_INLINE int32_t tEncodeSMqRebVgReq(void** buf, const SMqRebVgReq* pR
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId);
|
tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId);
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->newConsumerId);
|
tlen += taosEncodeFixedI64(buf, pReq->newConsumerId);
|
||||||
tlen += taosEncodeString(buf, pReq->subKey);
|
tlen += taosEncodeString(buf, pReq->subKey);
|
||||||
tlen += taosEncodeString(buf, pReq->qmsg);
|
tlen += taosEncodeFixedI8(buf, pReq->subType);
|
||||||
|
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);
|
||||||
|
}
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1960,7 +1994,14 @@ static FORCE_INLINE void* tDecodeSMqRebVgReq(const void* buf, SMqRebVgReq* pReq)
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId);
|
buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId);
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->newConsumerId);
|
buf = taosDecodeFixedI64(buf, &pReq->newConsumerId);
|
||||||
buf = taosDecodeStringTo(buf, pReq->subKey);
|
buf = taosDecodeStringTo(buf, pReq->subKey);
|
||||||
buf = taosDecodeString(buf, &pReq->qmsg);
|
buf = taosDecodeFixedI8(buf, &pReq->subType);
|
||||||
|
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);
|
||||||
|
}
|
||||||
return (void*)buf;
|
return (void*)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2300,9 +2341,10 @@ static FORCE_INLINE void tdDestroyTSmaWrapper(STSmaWrapper* pSW) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE void tdFreeTSmaWrapper(STSmaWrapper* pSW) {
|
static FORCE_INLINE void* tdFreeTSmaWrapper(STSmaWrapper* pSW) {
|
||||||
tdDestroyTSmaWrapper(pSW);
|
tdDestroyTSmaWrapper(pSW);
|
||||||
taosMemoryFreeClear(pSW);
|
taosMemoryFree(pSW);
|
||||||
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeTSma(void** buf, const STSma* pSma) {
|
static FORCE_INLINE int32_t tEncodeTSma(void** buf, const STSma* pSma) {
|
||||||
|
@ -2690,6 +2732,7 @@ static FORCE_INLINE void* tDecodeSMqCMGetSubEpRsp(void* buf, SMqCMGetSubEpRsp* p
|
||||||
}
|
}
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -1359,7 +1359,7 @@ static void tdSRowPrint(STSRow *row, STSchema *pSchema) {
|
||||||
printf(">>>");
|
printf(">>>");
|
||||||
for (int i = 0; i < pSchema->numOfCols; ++i) {
|
for (int i = 0; i < pSchema->numOfCols; ++i) {
|
||||||
STColumn *stCol = pSchema->columns + i;
|
STColumn *stCol = pSchema->columns + i;
|
||||||
SCellVal sVal = {.valType = 255, .val = NULL};
|
SCellVal sVal = { 255, NULL};
|
||||||
if (!tdSTSRowIterNext(&iter, stCol->colId, stCol->type, &sVal)) {
|
if (!tdSTSRowIterNext(&iter, stCol->colId, stCol->type, &sVal)) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,9 @@ extern "C" {
|
||||||
typedef struct SBnode SBnode;
|
typedef struct SBnode SBnode;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
} SBnodeLoad;
|
} SBnodeLoad;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -224,6 +224,8 @@ int32_t catalogGetDBCfg(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, cons
|
||||||
|
|
||||||
int32_t catalogGetIndexInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char* indexName, SIndexInfo* pInfo);
|
int32_t catalogGetIndexInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char* indexName, SIndexInfo* pInfo);
|
||||||
|
|
||||||
|
int32_t catalogGetUdfInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char* funcName, SFuncInfo** pInfo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Destroy catalog and relase all resources
|
* Destroy catalog and relase all resources
|
||||||
|
|
|
@ -166,6 +166,7 @@ typedef struct SInputColumnInfoData {
|
||||||
SColumnInfoData *pPTS; // primary timestamp column
|
SColumnInfoData *pPTS; // primary timestamp column
|
||||||
SColumnInfoData **pData;
|
SColumnInfoData **pData;
|
||||||
SColumnDataAgg **pColumnDataAgg;
|
SColumnDataAgg **pColumnDataAgg;
|
||||||
|
uint64_t uid; // table uid
|
||||||
} SInputColumnInfoData;
|
} SInputColumnInfoData;
|
||||||
|
|
||||||
// sql function runtime context
|
// sql function runtime context
|
||||||
|
@ -191,7 +192,7 @@ typedef struct SqlFunctionCtx {
|
||||||
int16_t functionId; // function id
|
int16_t functionId; // function id
|
||||||
char * pOutput; // final result output buffer, point to sdata->data
|
char * pOutput; // final result output buffer, point to sdata->data
|
||||||
int32_t numOfParams;
|
int32_t numOfParams;
|
||||||
SVariant param[4]; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
|
SFunctParam *param; // input parameter, e.g., top(k, 20), the number of results for top query is kept in param
|
||||||
int64_t *ptsList; // corresponding timestamp array list
|
int64_t *ptsList; // corresponding timestamp array list
|
||||||
SColumnInfoData *pTsOutput; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
SColumnInfoData *pTsOutput; // corresponding output buffer for timestamp of each result, e.g., top/bottom*/
|
||||||
int32_t offset;
|
int32_t offset;
|
||||||
|
|
|
@ -119,12 +119,19 @@ typedef enum EFunctionType {
|
||||||
struct SqlFunctionCtx;
|
struct SqlFunctionCtx;
|
||||||
struct SResultRowEntryInfo;
|
struct SResultRowEntryInfo;
|
||||||
struct STimeWindow;
|
struct STimeWindow;
|
||||||
|
struct SCatalog;
|
||||||
|
|
||||||
|
typedef struct SFmGetFuncInfoParam {
|
||||||
|
struct SCatalog* pCtg;
|
||||||
|
void *pRpc;
|
||||||
|
const SEpSet* pMgmtEps;
|
||||||
|
} SFmGetFuncInfoParam;
|
||||||
|
|
||||||
int32_t fmFuncMgtInit();
|
int32_t fmFuncMgtInit();
|
||||||
|
|
||||||
void fmFuncMgtDestroy();
|
void fmFuncMgtDestroy();
|
||||||
|
|
||||||
int32_t fmGetFuncInfo(const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType);
|
int32_t fmGetFuncInfo(SFmGetFuncInfoParam* pParam, const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType);
|
||||||
|
|
||||||
int32_t fmGetFuncResultType(SFunctionNode* pFunc, char* pErrBuf, int32_t len);
|
int32_t fmGetFuncResultType(SFunctionNode* pFunc, char* pErrBuf, int32_t len);
|
||||||
|
|
||||||
|
|
|
@ -48,6 +48,9 @@ extern "C" {
|
||||||
(NULL == cell1 ? (node1 = NULL, false) : (node1 = cell1->pNode, true)), (NULL == cell2 ? (node2 = NULL, false) : (node2 = cell2->pNode, true)), (node1 != NULL && node2 != NULL); \
|
(NULL == cell1 ? (node1 = NULL, false) : (node1 = cell1->pNode, true)), (NULL == cell2 ? (node2 = NULL, false) : (node2 = cell2->pNode, true)), (node1 != NULL && node2 != NULL); \
|
||||||
cell1 = cell1->pNext, cell2 = cell2->pNext)
|
cell1 = cell1->pNext, cell2 = cell2->pNext)
|
||||||
|
|
||||||
|
#define REPLACE_LIST1_NODE(newNode) cell1->pNode = (SNode*)(newNode)
|
||||||
|
#define REPLACE_LIST2_NODE(newNode) cell2->pNode = (SNode*)(newNode)
|
||||||
|
|
||||||
#define FOREACH_FOR_REWRITE(node, list) \
|
#define FOREACH_FOR_REWRITE(node, list) \
|
||||||
for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); (NULL != cell ? (node = &(cell->pNode), true) : (node = NULL, false)); cell = cell->pNext)
|
for (SListCell* cell = (NULL != (list) ? (list)->pHead : NULL); (NULL != cell ? (node = &(cell->pNode), true) : (node = NULL, false)); cell = cell->pNext)
|
||||||
|
|
||||||
|
|
|
@ -155,7 +155,6 @@ typedef struct SLogicSubplan {
|
||||||
|
|
||||||
typedef struct SQueryLogicPlan {
|
typedef struct SQueryLogicPlan {
|
||||||
ENodeType type;
|
ENodeType type;
|
||||||
int32_t totalLevel;
|
|
||||||
SNodeList* pTopSubplans;
|
SNodeList* pTopSubplans;
|
||||||
} SQueryLogicPlan;
|
} SQueryLogicPlan;
|
||||||
|
|
||||||
|
|
|
@ -229,10 +229,10 @@ typedef struct SFillNode {
|
||||||
typedef struct SSelectStmt {
|
typedef struct SSelectStmt {
|
||||||
ENodeType type; // QUERY_NODE_SELECT_STMT
|
ENodeType type; // QUERY_NODE_SELECT_STMT
|
||||||
bool isDistinct;
|
bool isDistinct;
|
||||||
SNodeList* pProjectionList; // SNode
|
SNodeList* pProjectionList;
|
||||||
SNode* pFromTable;
|
SNode* pFromTable;
|
||||||
SNode* pWhere;
|
SNode* pWhere;
|
||||||
SNodeList* pPartitionByList; // SNode
|
SNodeList* pPartitionByList;
|
||||||
SNode* pWindow;
|
SNode* pWindow;
|
||||||
SNodeList* pGroupByList; // SGroupingSetNode
|
SNodeList* pGroupByList; // SGroupingSetNode
|
||||||
SNode* pHaving;
|
SNode* pHaving;
|
||||||
|
@ -245,12 +245,14 @@ typedef struct SSelectStmt {
|
||||||
} SSelectStmt;
|
} SSelectStmt;
|
||||||
|
|
||||||
typedef enum ESetOperatorType {
|
typedef enum ESetOperatorType {
|
||||||
SET_OP_TYPE_UNION_ALL = 1
|
SET_OP_TYPE_UNION_ALL = 1,
|
||||||
|
SET_OP_TYPE_UNION
|
||||||
} ESetOperatorType;
|
} ESetOperatorType;
|
||||||
|
|
||||||
typedef struct SSetOperator {
|
typedef struct SSetOperator {
|
||||||
ENodeType type; // QUERY_NODE_SET_OPERATOR
|
ENodeType type; // QUERY_NODE_SET_OPERATOR
|
||||||
ESetOperatorType opType;
|
ESetOperatorType opType;
|
||||||
|
SNodeList* pProjectionList;
|
||||||
SNode* pLeft;
|
SNode* pLeft;
|
||||||
SNode* pRight;
|
SNode* pRight;
|
||||||
SNodeList* pOrderByList; // SOrderByExprNode
|
SNodeList* pOrderByList; // SOrderByExprNode
|
||||||
|
|
|
@ -51,6 +51,10 @@ typedef struct STableComInfo {
|
||||||
|
|
||||||
typedef struct SIndexMeta {
|
typedef struct SIndexMeta {
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
|
|
||||||
} SIndexMeta;
|
} SIndexMeta;
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -54,12 +54,13 @@ typedef struct {
|
||||||
uint16_t clientPort;
|
uint16_t clientPort;
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
int32_t rspLen;
|
int32_t rspLen;
|
||||||
void *pRsp;
|
void * pRsp;
|
||||||
void *pNode;
|
void * pNode;
|
||||||
} SNodeMsg;
|
} SNodeMsg;
|
||||||
|
|
||||||
typedef void (*RpcCfp)(void *parent, SRpcMsg *, SEpSet *);
|
typedef void (*RpcCfp)(void *parent, SRpcMsg *, SEpSet *);
|
||||||
typedef int (*RpcAfp)(void *parent, char *tableId, char *spi, char *encrypt, char *secret, char *ckey);
|
typedef int (*RpcAfp)(void *parent, char *tableId, char *spi, char *encrypt, char *secret, char *ckey);
|
||||||
|
typedef int (*RpcRfp)(void *parent, SRpcMsg *, SEpSet *);
|
||||||
|
|
||||||
typedef struct SRpcInit {
|
typedef struct SRpcInit {
|
||||||
uint16_t localPort; // local port
|
uint16_t localPort; // local port
|
||||||
|
@ -80,22 +81,25 @@ typedef struct SRpcInit {
|
||||||
RpcCfp cfp;
|
RpcCfp cfp;
|
||||||
|
|
||||||
// call back to retrieve the client auth info, for server app only
|
// call back to retrieve the client auth info, for server app only
|
||||||
RpcAfp afp;;
|
RpcAfp afp;
|
||||||
|
|
||||||
|
// user defined retry func
|
||||||
|
RpcRfp rfp;
|
||||||
|
|
||||||
void *parent;
|
void *parent;
|
||||||
} SRpcInit;
|
} SRpcInit;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
void *val;
|
void *val;
|
||||||
int32_t (*clone)(void *src, void **dst);
|
int32_t (*clone)(void *src, void **dst);
|
||||||
void (*freeFunc)(const void *arg);
|
void (*freeFunc)(const void *arg);
|
||||||
} SRpcCtxVal;
|
} SRpcCtxVal;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t msgType;
|
int32_t msgType;
|
||||||
void *val;
|
void * val;
|
||||||
int32_t (*clone)(void *src, void **dst);
|
int32_t (*clone)(void *src, void **dst);
|
||||||
void (*freeFunc)(const void *arg);
|
void (*freeFunc)(const void *arg);
|
||||||
} SRpcBrokenlinkVal;
|
} SRpcBrokenlinkVal;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -22,7 +22,6 @@ extern "C" {
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <ctype.h>
|
#include <ctype.h>
|
||||||
#include <semaphore.h>
|
|
||||||
|
|
||||||
#include <regex.h>
|
#include <regex.h>
|
||||||
|
|
||||||
|
@ -51,6 +50,15 @@ extern "C" {
|
||||||
#include <sys/prctl.h>
|
#include <sys/prctl.h>
|
||||||
#include <argp.h>
|
#include <argp.h>
|
||||||
#endif
|
#endif
|
||||||
|
#else
|
||||||
|
|
||||||
|
#include <time.h>
|
||||||
|
#ifndef TD_USE_WINSOCK
|
||||||
|
#include <winsock2.h>
|
||||||
|
#else
|
||||||
|
#include <winsock.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -63,22 +63,22 @@ int8_t atomic_add_fetch_8(int8_t volatile *ptr, int8_t val);
|
||||||
int16_t atomic_add_fetch_16(int16_t volatile *ptr, int16_t val);
|
int16_t atomic_add_fetch_16(int16_t volatile *ptr, int16_t val);
|
||||||
int32_t atomic_add_fetch_32(int32_t volatile *ptr, int32_t val);
|
int32_t atomic_add_fetch_32(int32_t volatile *ptr, int32_t val);
|
||||||
int64_t atomic_add_fetch_64(int64_t volatile *ptr, int64_t val);
|
int64_t atomic_add_fetch_64(int64_t volatile *ptr, int64_t val);
|
||||||
void* atomic_add_fetch_ptr(void *ptr, int32_t val);
|
void* atomic_add_fetch_ptr(void *ptr, void *val);
|
||||||
int8_t atomic_fetch_add_8(int8_t volatile *ptr, int8_t val);
|
int8_t atomic_fetch_add_8(int8_t volatile *ptr, int8_t val);
|
||||||
int16_t atomic_fetch_add_16(int16_t volatile *ptr, int16_t val);
|
int16_t atomic_fetch_add_16(int16_t volatile *ptr, int16_t val);
|
||||||
int32_t atomic_fetch_add_32(int32_t volatile *ptr, int32_t val);
|
int32_t atomic_fetch_add_32(int32_t volatile *ptr, int32_t val);
|
||||||
int64_t atomic_fetch_add_64(int64_t volatile *ptr, int64_t val);
|
int64_t atomic_fetch_add_64(int64_t volatile *ptr, int64_t val);
|
||||||
void* atomic_fetch_add_ptr(void *ptr, int32_t val);
|
void* atomic_fetch_add_ptr(void *ptr, void *val);
|
||||||
int8_t atomic_sub_fetch_8(int8_t volatile *ptr, int8_t val);
|
int8_t atomic_sub_fetch_8(int8_t volatile *ptr, int8_t val);
|
||||||
int16_t atomic_sub_fetch_16(int16_t volatile *ptr, int16_t val);
|
int16_t atomic_sub_fetch_16(int16_t volatile *ptr, int16_t val);
|
||||||
int32_t atomic_sub_fetch_32(int32_t volatile *ptr, int32_t val);
|
int32_t atomic_sub_fetch_32(int32_t volatile *ptr, int32_t val);
|
||||||
int64_t atomic_sub_fetch_64(int64_t volatile *ptr, int64_t val);
|
int64_t atomic_sub_fetch_64(int64_t volatile *ptr, int64_t val);
|
||||||
void* atomic_sub_fetch_ptr(void *ptr, int32_t val);
|
void* atomic_sub_fetch_ptr(void *ptr, void *val);
|
||||||
int8_t atomic_fetch_sub_8(int8_t volatile *ptr, int8_t val);
|
int8_t atomic_fetch_sub_8(int8_t volatile *ptr, int8_t val);
|
||||||
int16_t atomic_fetch_sub_16(int16_t volatile *ptr, int16_t val);
|
int16_t atomic_fetch_sub_16(int16_t volatile *ptr, int16_t val);
|
||||||
int32_t atomic_fetch_sub_32(int32_t volatile *ptr, int32_t val);
|
int32_t atomic_fetch_sub_32(int32_t volatile *ptr, int32_t val);
|
||||||
int64_t atomic_fetch_sub_64(int64_t volatile *ptr, int64_t val);
|
int64_t atomic_fetch_sub_64(int64_t volatile *ptr, int64_t val);
|
||||||
void* atomic_fetch_sub_ptr(void *ptr, int32_t val);
|
void* atomic_fetch_sub_ptr(void *ptr, void *val);
|
||||||
int8_t atomic_and_fetch_8(int8_t volatile *ptr, int8_t val);
|
int8_t atomic_and_fetch_8(int8_t volatile *ptr, int8_t val);
|
||||||
int16_t atomic_and_fetch_16(int16_t volatile *ptr, int16_t val);
|
int16_t atomic_and_fetch_16(int16_t volatile *ptr, int16_t val);
|
||||||
int32_t atomic_and_fetch_32(int32_t volatile *ptr, int32_t val);
|
int32_t atomic_and_fetch_32(int32_t volatile *ptr, int32_t val);
|
||||||
|
|
|
@ -191,7 +191,7 @@ extern "C" {
|
||||||
#define threadlocal __declspec( thread )
|
#define threadlocal __declspec( thread )
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#ifdef WINDOWS
|
||||||
#define PRIzu "ld"
|
#define PRIzu "ld"
|
||||||
#else
|
#else
|
||||||
#define PRIzu "zu"
|
#define PRIzu "zu"
|
||||||
|
|
|
@ -36,12 +36,12 @@ typedef struct TdDirEntry *TdDirEntryPtr;
|
||||||
|
|
||||||
|
|
||||||
void taosRemoveDir(const char *dirname);
|
void taosRemoveDir(const char *dirname);
|
||||||
bool taosDirExist(char *dirname);
|
bool taosDirExist(const char *dirname);
|
||||||
int32_t taosMkDir(const char *dirname);
|
int32_t taosMkDir(const char *dirname);
|
||||||
int32_t taosMulMkDir(const char *dirname);
|
int32_t taosMulMkDir(const char *dirname);
|
||||||
void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
|
void taosRemoveOldFiles(const char *dirname, int32_t keepDays);
|
||||||
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
|
int32_t taosExpandDir(const char *dirname, char *outname, int32_t maxlen);
|
||||||
int32_t taosRealPath(char *dirname, int32_t maxlen);
|
int32_t taosRealPath(char *dirname, char *realPath, int32_t maxlen);
|
||||||
bool taosIsDir(const char *dirname);
|
bool taosIsDir(const char *dirname);
|
||||||
char* taosDirName(char *dirname);
|
char* taosDirName(char *dirname);
|
||||||
char* taosDirEntryBaseName(char *dirname);
|
char* taosDirEntryBaseName(char *dirname);
|
||||||
|
@ -50,7 +50,7 @@ TdDirPtr taosOpenDir(const char *dirname);
|
||||||
TdDirEntryPtr taosReadDir(TdDirPtr pDir);
|
TdDirEntryPtr taosReadDir(TdDirPtr pDir);
|
||||||
bool taosDirEntryIsDir(TdDirEntryPtr pDirEntry);
|
bool taosDirEntryIsDir(TdDirEntryPtr pDirEntry);
|
||||||
char* taosGetDirEntryName(TdDirEntryPtr pDirEntry);
|
char* taosGetDirEntryName(TdDirEntryPtr pDirEntry);
|
||||||
int32_t taosCloseDir(TdDirPtr pDir);
|
int32_t taosCloseDir(TdDirPtr *ppDir);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -34,6 +34,7 @@ extern int64_t tsOpenMax;
|
||||||
extern int64_t tsStreamMax;
|
extern int64_t tsStreamMax;
|
||||||
extern float tsNumOfCores;
|
extern float tsNumOfCores;
|
||||||
extern int64_t tsTotalMemoryKB;
|
extern int64_t tsTotalMemoryKB;
|
||||||
|
extern char* tsProcPath;
|
||||||
|
|
||||||
extern char configDir[];
|
extern char configDir[];
|
||||||
extern char tsDataDir[];
|
extern char tsDataDir[];
|
||||||
|
|
|
@ -93,7 +93,6 @@ void taosGetTmpfilePath(const char *inputTmpDir, const char *fileNamePrefix,
|
||||||
|
|
||||||
int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, int64_t size);
|
int64_t taosFSendFile(TdFilePtr pFileOut, TdFilePtr pFileIn, int64_t *offset, int64_t size);
|
||||||
|
|
||||||
void *taosMmapReadOnlyFile(TdFilePtr pFile, int64_t length);
|
|
||||||
bool taosValidFile(TdFilePtr pFile);
|
bool taosValidFile(TdFilePtr pFile);
|
||||||
|
|
||||||
int32_t taosGetErrorFile(TdFilePtr pFile);
|
int32_t taosGetErrorFile(TdFilePtr pFile);
|
||||||
|
|
|
@ -20,7 +20,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#ifdef WINDOWS
|
||||||
int32_t BUILDIN_CLZL(uint64_t val);
|
int32_t BUILDIN_CLZL(uint64_t val);
|
||||||
int32_t BUILDIN_CLZ(uint32_t val);
|
int32_t BUILDIN_CLZ(uint32_t val);
|
||||||
int32_t BUILDIN_CTZL(uint64_t val);
|
int32_t BUILDIN_CTZL(uint64_t val);
|
||||||
|
|
|
@ -23,7 +23,7 @@ extern "C" {
|
||||||
#define TPOW2(x) ((x) * (x))
|
#define TPOW2(x) ((x) * (x))
|
||||||
#define TABS(x) ((x) > 0 ? (x) : -(x))
|
#define TABS(x) ((x) > 0 ? (x) : -(x))
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#ifdef WINDOWS
|
||||||
|
|
||||||
#define TSWAP(a, b, c) \
|
#define TSWAP(a, b, c) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -33,6 +33,7 @@ extern "C" {
|
||||||
} while (0)
|
} while (0)
|
||||||
#define TMAX(a, b) (((a) > (b)) ? (a) : (b))
|
#define TMAX(a, b) (((a) > (b)) ? (a) : (b))
|
||||||
#define TMIN(a, b) (((a) < (b)) ? (a) : (b))
|
#define TMIN(a, b) (((a) < (b)) ? (a) : (b))
|
||||||
|
#define TRANGE(aa, bb, cc) ((aa) = TMAX((aa), (bb)),(aa) = TMIN((aa), (cc)))
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
|
|
|
@ -19,32 +19,53 @@
|
||||||
// If the error is in a third-party library, place this header file under the third-party library header file.
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
// When you want to use this feature, you should find or add the same function in the following section.
|
// When you want to use this feature, you should find or add the same function in the following section.
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
#define socket SOCKET_FUNC_TAOS_FORBID
|
#define socket SOCKET_FUNC_TAOS_FORBID
|
||||||
#define bind BIND_FUNC_TAOS_FORBID
|
#define bind BIND_FUNC_TAOS_FORBID
|
||||||
#define listen LISTEN_FUNC_TAOS_FORBID
|
#define listen LISTEN_FUNC_TAOS_FORBID
|
||||||
#define accept ACCEPT_FUNC_TAOS_FORBID
|
#define accept ACCEPT_FUNC_TAOS_FORBID
|
||||||
#define epoll_create EPOLL_CREATE_FUNC_TAOS_FORBID
|
#define epoll_create EPOLL_CREATE_FUNC_TAOS_FORBID
|
||||||
#define epoll_ctl EPOLL_CTL_FUNC_TAOS_FORBID
|
#define epoll_ctl EPOLL_CTL_FUNC_TAOS_FORBID
|
||||||
#define epoll_wait EPOLL_WAIT_FUNC_TAOS_FORBID
|
#define epoll_wait EPOLL_WAIT_FUNC_TAOS_FORBID
|
||||||
#define inet_addr INET_ADDR_FUNC_TAOS_FORBID
|
#define inet_addr INET_ADDR_FUNC_TAOS_FORBID
|
||||||
#define inet_ntoa INET_NTOA_FUNC_TAOS_FORBID
|
#define inet_ntoa INET_NTOA_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WINDOWS)
|
#if defined(WINDOWS)
|
||||||
#include "winsock2.h"
|
#if BYTE_ORDER == LITTLE_ENDIAN
|
||||||
#include <WS2tcpip.h>
|
#include <stdlib.h>
|
||||||
#include <winbase.h>
|
#define htobe16(x) _byteswap_ushort(x)
|
||||||
#include <Winsock2.h>
|
#define htole16(x) (x)
|
||||||
#else
|
#define be16toh(x) _byteswap_ushort(x)
|
||||||
#include <netinet/in.h>
|
#define le16toh(x) (x)
|
||||||
#include <sys/socket.h>
|
|
||||||
|
#define htobe32(x) _byteswap_ulong(x)
|
||||||
|
#define htole32(x) (x)
|
||||||
|
#define be32toh(x) _byteswap_ulong(x)
|
||||||
|
#define le32toh(x) (x)
|
||||||
|
|
||||||
|
#define htobe64(x) _byteswap_uint64(x)
|
||||||
|
#define htole64(x) (x)
|
||||||
|
#define be64toh(x) _byteswap_uint64(x)
|
||||||
|
#define le64toh(x) (x)
|
||||||
|
#else
|
||||||
|
#error byte order not supported
|
||||||
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_DARWIN_64)
|
#define __BYTE_ORDER BYTE_ORDER
|
||||||
#include <osEok.h>
|
#define __BIG_ENDIAN BIG_ENDIAN
|
||||||
#else
|
#define __LITTLE_ENDIAN LITTLE_ENDIAN
|
||||||
#include <netinet/in.h>
|
#define __PDP_ENDIAN PDP_ENDIAN
|
||||||
#include <sys/epoll.h>
|
|
||||||
#endif
|
#else
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
#if defined(_TD_DARWIN_64)
|
||||||
|
#include <osEok.h>
|
||||||
|
#else
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
@ -52,14 +73,10 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(WINDOWS)
|
#if defined(WINDOWS)
|
||||||
#define htobe64 htonll
|
typedef int socklen_t;
|
||||||
#endif
|
|
||||||
|
|
||||||
#if defined(WINDOWS)
|
|
||||||
#define TAOS_EPOLL_WAIT_TIME 100
|
#define TAOS_EPOLL_WAIT_TIME 100
|
||||||
typedef SOCKET eventfd_t;
|
typedef SOCKET eventfd_t;
|
||||||
#define eventfd(a, b) -1
|
#define eventfd(a, b) -1
|
||||||
typedef SOCKET EpollFd;
|
|
||||||
#define EpollClose(pollFd) epoll_close(pollFd)
|
#define EpollClose(pollFd) epoll_close(pollFd)
|
||||||
#ifndef EPOLLWAKEUP
|
#ifndef EPOLLWAKEUP
|
||||||
#define EPOLLWAKEUP (1u << 29)
|
#define EPOLLWAKEUP (1u << 29)
|
||||||
|
@ -79,31 +96,29 @@ extern "C" {
|
||||||
#if defined(_TD_DARWIN_64)
|
#if defined(_TD_DARWIN_64)
|
||||||
// #define htobe64 htonll
|
// #define htobe64 htonll
|
||||||
|
|
||||||
# include <libkern/OSByteOrder.h>
|
#include <libkern/OSByteOrder.h>
|
||||||
|
|
||||||
# define htobe16(x) OSSwapHostToBigInt16(x)
|
#define htobe16(x) OSSwapHostToBigInt16(x)
|
||||||
# define htole16(x) OSSwapHostToLittleInt16(x)
|
#define htole16(x) OSSwapHostToLittleInt16(x)
|
||||||
# define be16toh(x) OSSwapBigToHostInt16(x)
|
#define be16toh(x) OSSwapBigToHostInt16(x)
|
||||||
# define le16toh(x) OSSwapLittleToHostInt16(x)
|
#define le16toh(x) OSSwapLittleToHostInt16(x)
|
||||||
|
|
||||||
# define htobe32(x) OSSwapHostToBigInt32(x)
|
#define htobe32(x) OSSwapHostToBigInt32(x)
|
||||||
# define htole32(x) OSSwapHostToLittleInt32(x)
|
#define htole32(x) OSSwapHostToLittleInt32(x)
|
||||||
# define be32toh(x) OSSwapBigToHostInt32(x)
|
#define be32toh(x) OSSwapBigToHostInt32(x)
|
||||||
# define le32toh(x) OSSwapLittleToHostInt32(x)
|
#define le32toh(x) OSSwapLittleToHostInt32(x)
|
||||||
|
|
||||||
# define htobe64(x) OSSwapHostToBigInt64(x)
|
#define htobe64(x) OSSwapHostToBigInt64(x)
|
||||||
# define htole64(x) OSSwapHostToLittleInt64(x)
|
#define htole64(x) OSSwapHostToLittleInt64(x)
|
||||||
# define be64toh(x) OSSwapBigToHostInt64(x)
|
#define be64toh(x) OSSwapBigToHostInt64(x)
|
||||||
# define le64toh(x) OSSwapLittleToHostInt64(x)
|
#define le64toh(x) OSSwapLittleToHostInt64(x)
|
||||||
|
|
||||||
# define __BYTE_ORDER BYTE_ORDER
|
#define __BYTE_ORDER BYTE_ORDER
|
||||||
# define __BIG_ENDIAN BIG_ENDIAN
|
#define __BIG_ENDIAN BIG_ENDIAN
|
||||||
# define __LITTLE_ENDIAN LITTLE_ENDIAN
|
#define __LITTLE_ENDIAN LITTLE_ENDIAN
|
||||||
# define __PDP_ENDIAN PDP_ENDIAN
|
#define __PDP_ENDIAN PDP_ENDIAN
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TAOS_EPOLL_WAIT_TIME 500
|
|
||||||
|
|
||||||
typedef int32_t SocketFd;
|
typedef int32_t SocketFd;
|
||||||
typedef SocketFd EpollFd;
|
typedef SocketFd EpollFd;
|
||||||
|
|
||||||
|
@ -122,7 +137,7 @@ typedef struct TdEpoll *TdEpollPtr;
|
||||||
int32_t taosSendto(TdSocketPtr pSocket, void * msg, int len, unsigned int flags, const struct sockaddr * to, int tolen);
|
int32_t taosSendto(TdSocketPtr pSocket, void * msg, int len, unsigned int flags, const struct sockaddr * to, int tolen);
|
||||||
int32_t taosWriteSocket(TdSocketPtr pSocket, void *msg, int len);
|
int32_t taosWriteSocket(TdSocketPtr pSocket, void *msg, int len);
|
||||||
int32_t taosReadSocket(TdSocketPtr pSocket, void *msg, int len);
|
int32_t taosReadSocket(TdSocketPtr pSocket, void *msg, int len);
|
||||||
int32_t taosReadFromSocket(TdSocketPtr pSocket, void *buf, int32_t len, int32_t flags, struct sockaddr *destAddr, socklen_t *addrLen);
|
int32_t taosReadFromSocket(TdSocketPtr pSocket, void *buf, int32_t len, int32_t flags, struct sockaddr *destAddr, int *addrLen);
|
||||||
int32_t taosCloseSocketNoCheck1(SocketFd fd);
|
int32_t taosCloseSocketNoCheck1(SocketFd fd);
|
||||||
int32_t taosCloseSocket(TdSocketPtr *ppSocket);
|
int32_t taosCloseSocket(TdSocketPtr *ppSocket);
|
||||||
int32_t taosCloseSocketServer(TdSocketServerPtr *ppSocketServer);
|
int32_t taosCloseSocketServer(TdSocketServerPtr *ppSocketServer);
|
||||||
|
@ -139,14 +154,15 @@ int32_t taosWriteMsg(TdSocketPtr pSocket, void *ptr, int32_t nbytes);
|
||||||
int32_t taosReadMsg(TdSocketPtr pSocket, void *ptr, int32_t nbytes);
|
int32_t taosReadMsg(TdSocketPtr pSocket, void *ptr, int32_t nbytes);
|
||||||
int32_t taosNonblockwrite(TdSocketPtr pSocket, char *ptr, int32_t nbytes);
|
int32_t taosNonblockwrite(TdSocketPtr pSocket, char *ptr, int32_t nbytes);
|
||||||
int64_t taosCopyFds(TdSocketPtr pSrcSocket, TdSocketPtr pDestSocket, int64_t len);
|
int64_t taosCopyFds(TdSocketPtr pSrcSocket, TdSocketPtr pDestSocket, int64_t len);
|
||||||
|
void taosWinSocketInit();
|
||||||
|
|
||||||
TdSocketPtr taosOpenUdpSocket(uint32_t localIp, uint16_t localPort);
|
TdSocketPtr taosOpenUdpSocket(uint32_t localIp, uint16_t localPort);
|
||||||
TdSocketPtr taosOpenTcpClientSocket(uint32_t ip, uint16_t port, uint32_t localIp);
|
TdSocketPtr taosOpenTcpClientSocket(uint32_t ip, uint16_t port, uint32_t localIp);
|
||||||
TdSocketServerPtr taosOpenTcpServerSocket(uint32_t ip, uint16_t port);
|
TdSocketServerPtr taosOpenTcpServerSocket(uint32_t ip, uint16_t port);
|
||||||
int32_t taosKeepTcpAlive(TdSocketPtr pSocket);
|
int32_t taosKeepTcpAlive(TdSocketPtr pSocket);
|
||||||
TdSocketPtr taosAcceptTcpConnectSocket(TdSocketServerPtr pServerSocket, struct sockaddr *destAddr, socklen_t *addrLen);
|
TdSocketPtr taosAcceptTcpConnectSocket(TdSocketServerPtr pServerSocket, struct sockaddr *destAddr, int *addrLen);
|
||||||
|
|
||||||
int32_t taosGetSocketName(TdSocketPtr pSocket,struct sockaddr *destAddr, socklen_t *addrLen);
|
int32_t taosGetSocketName(TdSocketPtr pSocket,struct sockaddr *destAddr, int *addrLen);
|
||||||
|
|
||||||
void taosBlockSIGPIPE();
|
void taosBlockSIGPIPE();
|
||||||
uint32_t taosGetIpv4FromFqdn(const char *);
|
uint32_t taosGetIpv4FromFqdn(const char *);
|
||||||
|
|
|
@ -39,7 +39,7 @@ typedef int32_t TdUcs4;
|
||||||
#define wchar_t WCHAR_T_TYPE_TAOS_FORBID
|
#define wchar_t WCHAR_T_TYPE_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#ifdef WINDOWS
|
||||||
#define tstrdup(str) _strdup(str)
|
#define tstrdup(str) _strdup(str)
|
||||||
#else
|
#else
|
||||||
#define tstrdup(str) strdup(str)
|
#define tstrdup(str) strdup(str)
|
||||||
|
|
|
@ -22,9 +22,12 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef WINDOWS
|
||||||
#ifndef __USE_XOPEN2K
|
#ifndef __USE_XOPEN2K
|
||||||
|
#define TD_USE_SPINLOCK_AS_MUTEX
|
||||||
typedef pthread_mutex_t pthread_spinlock_t;
|
typedef pthread_mutex_t pthread_spinlock_t;
|
||||||
#endif
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef pthread_t TdThread;
|
typedef pthread_t TdThread;
|
||||||
typedef pthread_spinlock_t TdThreadSpinlock;
|
typedef pthread_spinlock_t TdThreadSpinlock;
|
||||||
|
@ -41,6 +44,13 @@ typedef pthread_key_t TdThreadKey;
|
||||||
#define taosThreadCleanupPush pthread_cleanup_push
|
#define taosThreadCleanupPush pthread_cleanup_push
|
||||||
#define taosThreadCleanupPop pthread_cleanup_pop
|
#define taosThreadCleanupPop pthread_cleanup_pop
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
#define TD_PTHREAD_MUTEX_INITIALIZER (TdThreadMutex)(-1)
|
||||||
|
#else
|
||||||
|
#define TD_PTHREAD_MUTEX_INITIALIZER PTHREAD_MUTEX_INITIALIZER
|
||||||
|
#endif
|
||||||
|
|
||||||
// If the error is in a third-party library, place this header file under the third-party library header file.
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
// When you want to use this feature, you should find or add the same function in the following section.
|
// When you want to use this feature, you should find or add the same function in the following section.
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
|
@ -218,8 +228,7 @@ int32_t taosThreadSpinLock(TdThreadSpinlock * lock);
|
||||||
int32_t taosThreadSpinTrylock(TdThreadSpinlock * lock);
|
int32_t taosThreadSpinTrylock(TdThreadSpinlock * lock);
|
||||||
int32_t taosThreadSpinUnlock(TdThreadSpinlock * lock);
|
int32_t taosThreadSpinUnlock(TdThreadSpinlock * lock);
|
||||||
void taosThreadTestCancel(void);
|
void taosThreadTestCancel(void);
|
||||||
int32_t taosThreadSigMask(int32_t how, sigset_t const *set, sigset_t * oset);
|
void taosThreadClear(TdThread *thread);
|
||||||
int32_t taosThreadSigWait(const sigset_t * set, int32_t *sig);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,8 +20,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <time.h>
|
|
||||||
|
|
||||||
// If the error is in a third-party library, place this header file under the third-party library header file.
|
// If the error is in a third-party library, place this header file under the third-party library header file.
|
||||||
// When you want to use this feature, you should find or add the same function in the following section.
|
// When you want to use this feature, you should find or add the same function in the following section.
|
||||||
#ifndef ALLOW_FORBID_FUNC
|
#ifndef ALLOW_FORBID_FUNC
|
||||||
|
@ -34,7 +32,7 @@ extern "C" {
|
||||||
#define mktime MKTIME_FUNC_TAOS_FORBID
|
#define mktime MKTIME_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if defined(_TD_WINDOWS_64) || defined(_TD_WINDOWS_32)
|
#ifdef WINDOWS
|
||||||
|
|
||||||
#define CLOCK_REALTIME 0
|
#define CLOCK_REALTIME 0
|
||||||
|
|
||||||
|
@ -58,6 +56,8 @@ extern "C" {
|
||||||
|
|
||||||
int32_t taosGetTimeOfDay(struct timeval *tv);
|
int32_t taosGetTimeOfDay(struct timeval *tv);
|
||||||
|
|
||||||
|
int32_t taosClockGetTime(int clock_id, struct timespec *pTS);
|
||||||
|
|
||||||
//@return timestamp in second
|
//@return timestamp in second
|
||||||
int32_t taosGetTimestampSec();
|
int32_t taosGetTimestampSec();
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ static FORCE_INLINE int64_t taosGetTimestampUs() {
|
||||||
//@return timestamp in nanosecond
|
//@return timestamp in nanosecond
|
||||||
static FORCE_INLINE int64_t taosGetTimestampNs() {
|
static FORCE_INLINE int64_t taosGetTimestampNs() {
|
||||||
struct timespec systemTime = {0};
|
struct timespec systemTime = {0};
|
||||||
clock_gettime(CLOCK_REALTIME, &systemTime);
|
taosClockGetTime(CLOCK_REALTIME, &systemTime);
|
||||||
return (int64_t)systemTime.tv_sec * 1000000000L + (int64_t)systemTime.tv_nsec;
|
return (int64_t)systemTime.tv_sec * 1000000000L + (int64_t)systemTime.tv_nsec;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ void *taosbsearch(const void *key, const void *base, int64_t nmemb, int64_t size
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
void taosheapadjust(void *base, int32_t size, int32_t start, int32_t end, const void *parcompar,
|
void taosheapadjust(void *base, int32_t size, int32_t start, int32_t end, const void *parcompar,
|
||||||
__ext_compar_fn_t compar, const void *parswap, __ext_swap_fn_t swap, bool maxroot);
|
__ext_compar_fn_t compar, char* buf, bool maxroot);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* sort heap to make sure it is a max/min root heap
|
* sort heap to make sure it is a max/min root heap
|
||||||
|
@ -98,7 +98,7 @@ void taosheapadjust(void *base, int32_t size, int32_t start, int32_t end, const
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
void taosheapsort(void *base, int32_t size, int32_t len, const void *parcompar, __ext_compar_fn_t compar,
|
void taosheapsort(void *base, int32_t size, int32_t len, const void *parcompar, __ext_compar_fn_t compar,
|
||||||
const void *parswap, __ext_swap_fn_t swap, bool maxroot);
|
bool maxroot);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -614,6 +614,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_PAR_INTER_SLIDING_TOO_BIG TAOS_DEF_ERROR_CODE(0, 0x2631)
|
#define TSDB_CODE_PAR_INTER_SLIDING_TOO_BIG TAOS_DEF_ERROR_CODE(0, 0x2631)
|
||||||
#define TSDB_CODE_PAR_INTER_SLIDING_TOO_SMALL TAOS_DEF_ERROR_CODE(0, 0x2632)
|
#define TSDB_CODE_PAR_INTER_SLIDING_TOO_SMALL TAOS_DEF_ERROR_CODE(0, 0x2632)
|
||||||
#define TSDB_CODE_PAR_ONLY_ONE_JSON_TAG TAOS_DEF_ERROR_CODE(0, 0x2633)
|
#define TSDB_CODE_PAR_ONLY_ONE_JSON_TAG TAOS_DEF_ERROR_CODE(0, 0x2633)
|
||||||
|
#define TSDB_CODE_PAR_INCORRECT_NUM_OF_COL TAOS_DEF_ERROR_CODE(0, 0x2634)
|
||||||
|
|
||||||
//planner
|
//planner
|
||||||
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
|
#define TSDB_CODE_PLAN_INTERNAL_ERROR TAOS_DEF_ERROR_CODE(0, 0x2700)
|
||||||
|
|
|
@ -236,7 +236,8 @@ static FORCE_INLINE int32_t tEncodeFloat(SCoder* pEncoder, float val) {
|
||||||
union {
|
union {
|
||||||
uint32_t ui;
|
uint32_t ui;
|
||||||
float f;
|
float f;
|
||||||
} v = {.f = val};
|
} v;
|
||||||
|
v.f = val;
|
||||||
|
|
||||||
return tEncodeU32(pEncoder, v.ui);
|
return tEncodeU32(pEncoder, v.ui);
|
||||||
}
|
}
|
||||||
|
@ -245,7 +246,8 @@ static FORCE_INLINE int32_t tEncodeDouble(SCoder* pEncoder, double val) {
|
||||||
union {
|
union {
|
||||||
uint64_t ui;
|
uint64_t ui;
|
||||||
double d;
|
double d;
|
||||||
} v = {.d = val};
|
} v;
|
||||||
|
v.d = val;
|
||||||
|
|
||||||
return tEncodeU64(pEncoder, v.ui);
|
return tEncodeU64(pEncoder, v.ui);
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,9 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
#define tjsonGetNumberValue(pJson, pName, val) -1
|
||||||
|
#else
|
||||||
#define tjsonGetNumberValue(pJson, pName, val) \
|
#define tjsonGetNumberValue(pJson, pName, val) \
|
||||||
({ \
|
({ \
|
||||||
uint64_t _tmp = 0; \
|
uint64_t _tmp = 0; \
|
||||||
|
@ -29,6 +32,7 @@ extern "C" {
|
||||||
val = _tmp; \
|
val = _tmp; \
|
||||||
_code; \
|
_code; \
|
||||||
})
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
typedef void SJson;
|
typedef void SJson;
|
||||||
|
|
||||||
|
|
|
@ -219,6 +219,7 @@ void doSetOneRowPtr(SReqResultInfo* pResultInfo);
|
||||||
void setResPrecision(SReqResultInfo* pResInfo, int32_t precision);
|
void setResPrecision(SReqResultInfo* pResInfo, int32_t precision);
|
||||||
int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp, bool convertUcs4);
|
int32_t setQueryResultFromRsp(SReqResultInfo* pResultInfo, const SRetrieveTableRsp* pRsp, bool convertUcs4);
|
||||||
void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols);
|
void setResSchemaInfo(SReqResultInfo* pResInfo, const SSchema* pSchema, int32_t numOfCols);
|
||||||
|
void doFreeReqResultInfo(SReqResultInfo* pResInfo);
|
||||||
|
|
||||||
static FORCE_INLINE SReqResultInfo* tmqGetCurResInfo(TAOS_RES* res) {
|
static FORCE_INLINE SReqResultInfo* tmqGetCurResInfo(TAOS_RES* res) {
|
||||||
SMqRspObj* msg = (SMqRspObj*)res;
|
SMqRspObj* msg = (SMqRspObj*)res;
|
||||||
|
|
|
@ -60,6 +60,7 @@ typedef struct SStmtBindInfo {
|
||||||
} SStmtBindInfo;
|
} SStmtBindInfo;
|
||||||
|
|
||||||
typedef struct SStmtExecInfo {
|
typedef struct SStmtExecInfo {
|
||||||
|
int32_t affectedRows;
|
||||||
SRequestObj* pRequest;
|
SRequestObj* pRequest;
|
||||||
SHashObj* pVgHash;
|
SHashObj* pVgHash;
|
||||||
SHashObj* pBlockHash;
|
SHashObj* pBlockHash;
|
||||||
|
|
|
@ -30,15 +30,15 @@
|
||||||
#define TSC_VAR_RELEASED 0
|
#define TSC_VAR_RELEASED 0
|
||||||
|
|
||||||
SAppInfo appInfo;
|
SAppInfo appInfo;
|
||||||
int32_t clientReqRefPool = -1;
|
int32_t clientReqRefPool = -1;
|
||||||
int32_t clientConnRefPool = -1;
|
int32_t clientConnRefPool = -1;
|
||||||
|
|
||||||
static TdThreadOnce tscinit = PTHREAD_ONCE_INIT;
|
static TdThreadOnce tscinit = PTHREAD_ONCE_INIT;
|
||||||
volatile int32_t tscInitRes = 0;
|
volatile int32_t tscInitRes = 0;
|
||||||
|
|
||||||
static void registerRequest(SRequestObj *pRequest) {
|
static void registerRequest(SRequestObj *pRequest) {
|
||||||
STscObj *pTscObj = acquireTscObj(pRequest->pTscObj->id);
|
STscObj *pTscObj = acquireTscObj(pRequest->pTscObj->id);
|
||||||
|
|
||||||
assert(pTscObj != NULL);
|
assert(pTscObj != NULL);
|
||||||
|
|
||||||
// connection has been released already, abort creating request.
|
// connection has been released already, abort creating request.
|
||||||
|
@ -49,8 +49,8 @@ static void registerRequest(SRequestObj *pRequest) {
|
||||||
if (pTscObj->pAppInfo) {
|
if (pTscObj->pAppInfo) {
|
||||||
SInstanceSummary *pSummary = &pTscObj->pAppInfo->summary;
|
SInstanceSummary *pSummary = &pTscObj->pAppInfo->summary;
|
||||||
|
|
||||||
int32_t total = atomic_add_fetch_64((int64_t*)&pSummary->totalRequests, 1);
|
int32_t total = atomic_add_fetch_64((int64_t *)&pSummary->totalRequests, 1);
|
||||||
int32_t currentInst = atomic_add_fetch_64((int64_t*)&pSummary->currentRequests, 1);
|
int32_t currentInst = atomic_add_fetch_64((int64_t *)&pSummary->currentRequests, 1);
|
||||||
tscDebug("0x%" PRIx64 " new Request from connObj:0x%" PRIx64
|
tscDebug("0x%" PRIx64 " new Request from connObj:0x%" PRIx64
|
||||||
", current:%d, app current:%d, total:%d, reqId:0x%" PRIx64,
|
", current:%d, app current:%d, total:%d, reqId:0x%" PRIx64,
|
||||||
pRequest->self, pRequest->pTscObj->id, num, currentInst, total, pRequest->requestId);
|
pRequest->self, pRequest->pTscObj->id, num, currentInst, total, pRequest->requestId);
|
||||||
|
@ -60,16 +60,16 @@ static void registerRequest(SRequestObj *pRequest) {
|
||||||
static void deregisterRequest(SRequestObj *pRequest) {
|
static void deregisterRequest(SRequestObj *pRequest) {
|
||||||
assert(pRequest != NULL);
|
assert(pRequest != NULL);
|
||||||
|
|
||||||
STscObj * pTscObj = pRequest->pTscObj;
|
STscObj *pTscObj = pRequest->pTscObj;
|
||||||
SInstanceSummary *pActivity = &pTscObj->pAppInfo->summary;
|
SInstanceSummary *pActivity = &pTscObj->pAppInfo->summary;
|
||||||
|
|
||||||
int32_t currentInst = atomic_sub_fetch_64((int64_t*)&pActivity->currentRequests, 1);
|
int32_t currentInst = atomic_sub_fetch_64((int64_t *)&pActivity->currentRequests, 1);
|
||||||
int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1);
|
int32_t num = atomic_sub_fetch_32(&pTscObj->numOfReqs, 1);
|
||||||
|
|
||||||
int64_t duration = taosGetTimestampUs() - pRequest->metric.start;
|
int64_t duration = taosGetTimestampUs() - pRequest->metric.start;
|
||||||
tscDebug("0x%" PRIx64 " free Request from connObj: 0x%" PRIx64 ", reqId:0x%" PRIx64 " elapsed:%" PRIu64
|
tscDebug("0x%" PRIx64 " free Request from connObj: 0x%" PRIx64 ", reqId:0x%" PRIx64 " elapsed:%" PRIu64
|
||||||
" ms, current:%d, app current:%d",
|
" ms, current:%d, app current:%d",
|
||||||
pRequest->self, pTscObj->id, pRequest->requestId, duration/1000, num, currentInst);
|
pRequest->self, pTscObj->id, pRequest->requestId, duration / 1000, num, currentInst);
|
||||||
releaseTscObj(pTscObj->id);
|
releaseTscObj(pTscObj->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -109,12 +109,12 @@ void *openTransporter(const char *user, const char *auth, int32_t numOfThread) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void closeAllRequests(SHashObj *pRequests) {
|
void closeAllRequests(SHashObj *pRequests) {
|
||||||
void *pIter = taosHashIterate(pRequests, NULL);
|
void *pIter = taosHashIterate(pRequests, NULL);
|
||||||
while (pIter != NULL) {
|
while (pIter != NULL) {
|
||||||
int64_t *rid = pIter;
|
int64_t *rid = pIter;
|
||||||
|
|
||||||
releaseRequest(*rid);
|
releaseRequest(*rid);
|
||||||
|
|
||||||
pIter = taosHashIterate(pRequests, pIter);
|
pIter = taosHashIterate(pRequests, pIter);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -144,7 +144,7 @@ void *createTscObj(const char *user, const char *auth, const char *db, SAppInstI
|
||||||
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pObj->pAppInfo = pAppInfo;
|
pObj->pAppInfo = pAppInfo;
|
||||||
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
tstrncpy(pObj->user, user, sizeof(pObj->user));
|
||||||
memcpy(pObj->pass, auth, TSDB_PASSWORD_LEN);
|
memcpy(pObj->pass, auth, TSDB_PASSWORD_LEN);
|
||||||
|
@ -160,13 +160,9 @@ void *createTscObj(const char *user, const char *auth, const char *db, SAppInstI
|
||||||
return pObj;
|
return pObj;
|
||||||
}
|
}
|
||||||
|
|
||||||
STscObj *acquireTscObj(int64_t rid) {
|
STscObj *acquireTscObj(int64_t rid) { return (STscObj *)taosAcquireRef(clientConnRefPool, rid); }
|
||||||
return (STscObj *)taosAcquireRef(clientConnRefPool, rid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t releaseTscObj(int64_t rid) {
|
int32_t releaseTscObj(int64_t rid) { return taosReleaseRef(clientConnRefPool, rid); }
|
||||||
return taosReleaseRef(clientConnRefPool, rid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *createRequest(STscObj *pObj, __taos_async_fn_t fp, void *param, int32_t type) {
|
void *createRequest(STscObj *pObj, __taos_async_fn_t fp, void *param, int32_t type) {
|
||||||
assert(pObj != NULL);
|
assert(pObj != NULL);
|
||||||
|
@ -190,11 +186,11 @@ void *createRequest(STscObj *pObj, __taos_async_fn_t fp, void *param, int32_t ty
|
||||||
tsem_init(&pRequest->body.rspSem, 0, 0);
|
tsem_init(&pRequest->body.rspSem, 0, 0);
|
||||||
|
|
||||||
registerRequest(pRequest);
|
registerRequest(pRequest);
|
||||||
|
|
||||||
return pRequest;
|
return pRequest;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doFreeReqResultInfo(SReqResultInfo *pResInfo) {
|
void doFreeReqResultInfo(SReqResultInfo *pResInfo) {
|
||||||
taosMemoryFreeClear(pResInfo->pRspMsg);
|
taosMemoryFreeClear(pResInfo->pRspMsg);
|
||||||
taosMemoryFreeClear(pResInfo->length);
|
taosMemoryFreeClear(pResInfo->length);
|
||||||
taosMemoryFreeClear(pResInfo->row);
|
taosMemoryFreeClear(pResInfo->row);
|
||||||
|
@ -217,7 +213,7 @@ static void doDestroyRequest(void *p) {
|
||||||
assert(RID_VALID(pRequest->self));
|
assert(RID_VALID(pRequest->self));
|
||||||
|
|
||||||
taosHashRemove(pRequest->pTscObj->pRequests, &pRequest->self, sizeof(pRequest->self));
|
taosHashRemove(pRequest->pTscObj->pRequests, &pRequest->self, sizeof(pRequest->self));
|
||||||
|
|
||||||
taosMemoryFreeClear(pRequest->msgBuf);
|
taosMemoryFreeClear(pRequest->msgBuf);
|
||||||
taosMemoryFreeClear(pRequest->sqlstr);
|
taosMemoryFreeClear(pRequest->sqlstr);
|
||||||
taosMemoryFreeClear(pRequest->pDb);
|
taosMemoryFreeClear(pRequest->pDb);
|
||||||
|
@ -244,14 +240,9 @@ void destroyRequest(SRequestObj *pRequest) {
|
||||||
taosRemoveRef(clientReqRefPool, pRequest->self);
|
taosRemoveRef(clientReqRefPool, pRequest->self);
|
||||||
}
|
}
|
||||||
|
|
||||||
SRequestObj *acquireRequest(int64_t rid) {
|
SRequestObj *acquireRequest(int64_t rid) { return (SRequestObj *)taosAcquireRef(clientReqRefPool, rid); }
|
||||||
return (SRequestObj *)taosAcquireRef(clientReqRefPool, rid);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t releaseRequest(int64_t rid) {
|
|
||||||
return taosReleaseRef(clientReqRefPool, rid);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
int32_t releaseRequest(int64_t rid) { return taosReleaseRef(clientReqRefPool, rid); }
|
||||||
|
|
||||||
void taos_init_imp(void) {
|
void taos_init_imp(void) {
|
||||||
// In the APIs of other program language, taos_cleanup is not available yet.
|
// In the APIs of other program language, taos_cleanup is not available yet.
|
||||||
|
@ -380,7 +371,7 @@ uint64_t generateRequestId() {
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t id = 0;
|
uint64_t id = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
int64_t ts = taosGetTimestampMs();
|
int64_t ts = taosGetTimestampMs();
|
||||||
uint64_t pid = taosGetPId();
|
uint64_t pid = taosGetPId();
|
||||||
|
|
|
@ -135,6 +135,16 @@ void taos_free_result(TAOS_RES *res) {
|
||||||
if (TD_RES_QUERY(res)) {
|
if (TD_RES_QUERY(res)) {
|
||||||
SRequestObj *pRequest = (SRequestObj *)res;
|
SRequestObj *pRequest = (SRequestObj *)res;
|
||||||
destroyRequest(pRequest);
|
destroyRequest(pRequest);
|
||||||
|
} else if (TD_RES_TMQ(res)) {
|
||||||
|
SMqRspObj *pRsp = (SMqRspObj *)res;
|
||||||
|
if (pRsp->rsp.blockData) taosArrayDestroyP(pRsp->rsp.blockData, taosMemoryFree);
|
||||||
|
if (pRsp->rsp.blockDataLen) taosArrayDestroy(pRsp->rsp.blockDataLen);
|
||||||
|
if (pRsp->rsp.blockSchema) taosArrayDestroy(pRsp->rsp.blockSchema);
|
||||||
|
if (pRsp->rsp.blockTbName) taosArrayDestroy(pRsp->rsp.blockTbName);
|
||||||
|
if (pRsp->rsp.blockTags) taosArrayDestroy(pRsp->rsp.blockTags);
|
||||||
|
if (pRsp->rsp.blockTagSchema) taosArrayDestroy(pRsp->rsp.blockTagSchema);
|
||||||
|
pRsp->resInfo.pRspMsg = NULL;
|
||||||
|
doFreeReqResultInfo(&pRsp->resInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -622,6 +632,10 @@ int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name) {
|
||||||
return stmtSetTbName(stmt, name);
|
return stmtSetTbName(stmt, name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int taos_stmt_set_sub_tbname(TAOS_STMT *stmt, const char *name) {
|
||||||
|
return taos_stmt_set_tbname(stmt, name);
|
||||||
|
}
|
||||||
|
|
||||||
int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_BIND_v2 *bind) {
|
int taos_stmt_bind_param(TAOS_STMT *stmt, TAOS_BIND_v2 *bind) {
|
||||||
if (stmt == NULL || bind == NULL) {
|
if (stmt == NULL || bind == NULL) {
|
||||||
tscError("NULL parameter for %s", __FUNCTION__);
|
tscError("NULL parameter for %s", __FUNCTION__);
|
||||||
|
|
|
@ -486,7 +486,8 @@ int stmtExec(TAOS_STMT *stmt) {
|
||||||
|
|
||||||
STMT_ERR_JRET(pStmt->exec.pRequest->code);
|
STMT_ERR_JRET(pStmt->exec.pRequest->code);
|
||||||
|
|
||||||
pStmt->affectedRows += taos_affected_rows(pStmt->exec.pRequest);
|
pStmt->exec.affectedRows = taos_affected_rows(pStmt->exec.pRequest);
|
||||||
|
pStmt->affectedRows += pStmt->exec.affectedRows;
|
||||||
|
|
||||||
_return:
|
_return:
|
||||||
|
|
||||||
|
|
|
@ -662,7 +662,7 @@ TEST(testCase, agg_query_tables) {
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "select count(*) from tu");
|
pRes = taos_query(pConn, "select now() from m1");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
printf("failed to select from table, reason:%s\n", taos_errstr(pRes));
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
|
@ -5,8 +5,8 @@ target_include_directories(
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/common"
|
PUBLIC "${TD_SOURCE_DIR}/include/common"
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
IF(${TD_WINDOWS})
|
IF(${TD_WINDOWS})
|
||||||
PRIVATE "${TD_SOURCE_DIR}/contrib/pthread-win32"
|
PRIVATE "${TD_SOURCE_DIR}/contrib/pthread"
|
||||||
PRIVATE "${TD_SOURCE_DIR}/contrib/gnuregex"
|
PRIVATE "${TD_SOURCE_DIR}/contrib/msvcregex"
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
)
|
)
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
|
|
|
@ -110,7 +110,7 @@ void *tdDecodeSchema(void *buf, STSchema **pRSchema) {
|
||||||
|
|
||||||
for (int i = 0; i < numOfCols; i++) {
|
for (int i = 0; i < numOfCols; i++) {
|
||||||
col_type_t type = 0;
|
col_type_t type = 0;
|
||||||
int8_t sma = TSDB_BSMA_TYPE_NONE;
|
int8_t sma = 0;
|
||||||
col_id_t colId = 0;
|
col_id_t colId = 0;
|
||||||
col_bytes_t bytes = 0;
|
col_bytes_t bytes = 0;
|
||||||
buf = taosDecodeFixedI8(buf, &type);
|
buf = taosDecodeFixedI8(buf, &type);
|
||||||
|
|
|
@ -434,6 +434,15 @@ int32_t tSerializeSVCreateTbReq(void **buf, SVCreateTbReq *pReq) {
|
||||||
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
tlen += taosEncodeFixedI32(buf, param->pFuncIds[i]);
|
||||||
}
|
}
|
||||||
|
tlen += taosEncodeFixedI32(buf, param->qmsg1Len);
|
||||||
|
if (param->qmsg1Len > 0) {
|
||||||
|
tlen += taosEncodeString(buf, param->qmsg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
tlen += taosEncodeFixedI32(buf, param->qmsg2Len);
|
||||||
|
if (param->qmsg2Len > 0) {
|
||||||
|
tlen += taosEncodeString(buf, param->qmsg2);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case TD_CHILD_TABLE:
|
case TD_CHILD_TABLE:
|
||||||
|
@ -496,18 +505,25 @@ void *tDeserializeSVCreateTbReq(void *buf, SVCreateTbReq *pReq) {
|
||||||
buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
|
buf = taosDecodeStringTo(buf, pReq->stbCfg.pTagSchema[i].name);
|
||||||
}
|
}
|
||||||
if (pReq->rollup) {
|
if (pReq->rollup) {
|
||||||
pReq->stbCfg.pRSmaParam = (SRSmaParam *)taosMemoryMalloc(sizeof(SRSmaParam));
|
pReq->stbCfg.pRSmaParam = (SRSmaParam *)taosMemoryCalloc(1, sizeof(SRSmaParam));
|
||||||
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
SRSmaParam *param = pReq->stbCfg.pRSmaParam;
|
||||||
buf = taosDecodeBinaryTo(buf, (void *)¶m->xFilesFactor, sizeof(param->xFilesFactor));
|
buf = taosDecodeBinaryTo(buf, (void *)¶m->xFilesFactor, sizeof(param->xFilesFactor));
|
||||||
buf = taosDecodeFixedI32(buf, ¶m->delay);
|
buf = taosDecodeFixedI32(buf, ¶m->delay);
|
||||||
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
buf = taosDecodeFixedI8(buf, ¶m->nFuncIds);
|
||||||
if (param->nFuncIds > 0) {
|
if (param->nFuncIds > 0) {
|
||||||
param->pFuncIds = (func_id_t *)taosMemoryMalloc(param->nFuncIds * sizeof(func_id_t));
|
param->pFuncIds = (func_id_t *)taosMemoryCalloc(param->nFuncIds, sizeof(func_id_t));
|
||||||
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
for (int8_t i = 0; i < param->nFuncIds; ++i) {
|
||||||
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
buf = taosDecodeFixedI32(buf, param->pFuncIds + i);
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
param->pFuncIds = NULL;
|
buf = taosDecodeFixedI32(buf, ¶m->qmsg1Len);
|
||||||
|
if (param->qmsg1Len > 0) {
|
||||||
|
buf = taosDecodeString(buf, ¶m->qmsg1);
|
||||||
|
}
|
||||||
|
|
||||||
|
buf = taosDecodeFixedI32(buf, ¶m->qmsg2Len);
|
||||||
|
if (param->qmsg2Len > 0) {
|
||||||
|
buf = taosDecodeString(buf, ¶m->qmsg2);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pReq->stbCfg.pRSmaParam = NULL;
|
pReq->stbCfg.pRSmaParam = NULL;
|
||||||
|
@ -828,6 +844,27 @@ void tFreeSMAltertbReq(SMAltertbReq *pReq) {
|
||||||
taosArrayDestroy(pReq->pFields);
|
taosArrayDestroy(pReq->pFields);
|
||||||
pReq->pFields = NULL;
|
pReq->pFields = NULL;
|
||||||
}
|
}
|
||||||
|
int32_t tSerializeSMEpSet(void *buf, int32_t bufLen, SMEpSet *pReq) {
|
||||||
|
SCoder encoder = {0};
|
||||||
|
tCoderInit(&encoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_ENCODER);
|
||||||
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
|
if (tEncodeSEpSet(&encoder, &pReq->epSet) < 0) return -1;
|
||||||
|
|
||||||
|
tEndEncode(&encoder);
|
||||||
|
int32_t tlen = encoder.pos;
|
||||||
|
tCoderClear(&encoder);
|
||||||
|
return tlen;
|
||||||
|
}
|
||||||
|
int32_t tDeserializeSMEpSet(void *buf, int32_t bufLen, SMEpSet *pReq) {
|
||||||
|
SCoder decoder = {0};
|
||||||
|
tCoderInit(&decoder, TD_LITTLE_ENDIAN, buf, bufLen, TD_DECODER);
|
||||||
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
|
if (tDecodeSEpSet(&decoder, &pReq->epSet) < 0) return -1;
|
||||||
|
|
||||||
|
tEndDecode(&decoder);
|
||||||
|
tCoderClear(&decoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tSerializeSMCreateSmaReq(void *buf, int32_t bufLen, SMCreateSmaReq *pReq) {
|
int32_t tSerializeSMCreateSmaReq(void *buf, int32_t bufLen, SMCreateSmaReq *pReq) {
|
||||||
SCoder encoder = {0};
|
SCoder encoder = {0};
|
||||||
|
@ -1624,6 +1661,7 @@ int32_t tSerializeSRetrieveFuncReq(void *buf, int32_t bufLen, SRetrieveFuncReq *
|
||||||
|
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->numOfFuncs) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->numOfFuncs) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pReq->ignoreCodeComment) < 0) return -1;
|
||||||
|
|
||||||
if (pReq->numOfFuncs != (int32_t)taosArrayGetSize(pReq->pFuncNames)) return -1;
|
if (pReq->numOfFuncs != (int32_t)taosArrayGetSize(pReq->pFuncNames)) return -1;
|
||||||
for (int32_t i = 0; i < pReq->numOfFuncs; ++i) {
|
for (int32_t i = 0; i < pReq->numOfFuncs; ++i) {
|
||||||
|
@ -1644,6 +1682,7 @@ int32_t tDeserializeSRetrieveFuncReq(void *buf, int32_t bufLen, SRetrieveFuncReq
|
||||||
|
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->numOfFuncs) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->numOfFuncs) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, (int8_t *)&pReq->ignoreCodeComment) < 0) return -1;
|
||||||
|
|
||||||
pReq->pFuncNames = taosArrayInit(pReq->numOfFuncs, TSDB_FUNC_NAME_LEN);
|
pReq->pFuncNames = taosArrayInit(pReq->numOfFuncs, TSDB_FUNC_NAME_LEN);
|
||||||
if (pReq->pFuncNames == NULL) return -1;
|
if (pReq->pFuncNames == NULL) return -1;
|
||||||
|
@ -1681,8 +1720,12 @@ int32_t tSerializeSRetrieveFuncRsp(void *buf, int32_t bufLen, SRetrieveFuncRsp *
|
||||||
if (tEncodeI64(&encoder, pInfo->signature) < 0) return -1;
|
if (tEncodeI64(&encoder, pInfo->signature) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pInfo->codeSize) < 0) return -1;
|
if (tEncodeI32(&encoder, pInfo->codeSize) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pInfo->commentSize) < 0) return -1;
|
if (tEncodeI32(&encoder, pInfo->commentSize) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pInfo->pCode) < 0) return -1;
|
if (pInfo->codeSize) {
|
||||||
if (tEncodeCStr(&encoder, pInfo->pComment) < 0) return -1;
|
if (tEncodeCStr(&encoder, pInfo->pCode) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (pInfo->commentSize) {
|
||||||
|
if (tEncodeCStr(&encoder, pInfo->pComment) < 0) return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
@ -1713,15 +1756,23 @@ int32_t tDeserializeSRetrieveFuncRsp(void *buf, int32_t bufLen, SRetrieveFuncRsp
|
||||||
if (tDecodeI64(&decoder, &fInfo.signature) < 0) return -1;
|
if (tDecodeI64(&decoder, &fInfo.signature) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &fInfo.codeSize) < 0) return -1;
|
if (tDecodeI32(&decoder, &fInfo.codeSize) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &fInfo.commentSize) < 0) return -1;
|
if (tDecodeI32(&decoder, &fInfo.commentSize) < 0) return -1;
|
||||||
fInfo.pCode = taosMemoryCalloc(1, fInfo.codeSize);
|
if (fInfo.codeSize) {
|
||||||
fInfo.pComment = taosMemoryCalloc(1, fInfo.commentSize);
|
fInfo.pCode = taosMemoryCalloc(1, fInfo.codeSize);
|
||||||
if (fInfo.pCode == NULL || fInfo.pComment == NULL) {
|
if (fInfo.pCode == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
if (tDecodeCStrTo(&decoder, fInfo.pCode) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (fInfo.commentSize) {
|
||||||
|
fInfo.pComment = taosMemoryCalloc(1, fInfo.commentSize);
|
||||||
|
if (fInfo.pComment == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (tDecodeCStrTo(&decoder, fInfo.pComment) < 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tDecodeCStrTo(&decoder, fInfo.pCode) < 0) return -1;
|
|
||||||
if (tDecodeCStrTo(&decoder, fInfo.pComment) < 0) return -1;
|
|
||||||
taosArrayPush(pRsp->pFuncInfos, &fInfo);
|
taosArrayPush(pRsp->pFuncInfos, &fInfo);
|
||||||
}
|
}
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
@ -1730,12 +1781,20 @@ int32_t tDeserializeSRetrieveFuncRsp(void *buf, int32_t bufLen, SRetrieveFuncRsp
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void tFreeSFuncInfo(SFuncInfo *pInfo) {
|
||||||
|
if (NULL == pInfo) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
taosMemoryFree(pInfo->pCode);
|
||||||
|
taosMemoryFree(pInfo->pComment);
|
||||||
|
}
|
||||||
|
|
||||||
void tFreeSRetrieveFuncRsp(SRetrieveFuncRsp *pRsp) {
|
void tFreeSRetrieveFuncRsp(SRetrieveFuncRsp *pRsp) {
|
||||||
int32_t size = taosArrayGetSize(pRsp->pFuncInfos);
|
int32_t size = taosArrayGetSize(pRsp->pFuncInfos);
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
SFuncInfo *pInfo = taosArrayGet(pRsp->pFuncInfos, i);
|
SFuncInfo *pInfo = taosArrayGet(pRsp->pFuncInfos, i);
|
||||||
taosMemoryFree(pInfo->pCode);
|
tFreeSFuncInfo(pInfo);
|
||||||
taosMemoryFree(pInfo->pComment);
|
|
||||||
}
|
}
|
||||||
taosArrayDestroy(pRsp->pFuncInfos);
|
taosArrayDestroy(pRsp->pFuncInfos);
|
||||||
}
|
}
|
||||||
|
@ -2403,7 +2462,6 @@ int32_t tSerializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableReq
|
||||||
|
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pReq->showId) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->showId) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->type) < 0) return -1;
|
|
||||||
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->tb) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->tb) < 0) return -1;
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
@ -2419,7 +2477,6 @@ int32_t tDeserializeSRetrieveTableReq(void *buf, int32_t bufLen, SRetrieveTableR
|
||||||
|
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pReq->showId) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->showId) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->type) < 0) return -1;
|
|
||||||
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||||
if (tDecodeCStrTo(&decoder, pReq->tb) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->tb) < 0) return -1;
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
@ -2674,6 +2731,10 @@ int32_t tSerializeSCMCreateTopicReq(void *buf, int32_t bufLen, const SCMCreateTo
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->name) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->name) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->igExists) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->igExists) < 0) return -1;
|
||||||
|
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 (tEncodeI8(&encoder, pReq->withTagSchema) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, sqlLen) < 0) return -1;
|
if (tEncodeI32(&encoder, sqlLen) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, astLen) < 0) return -1;
|
if (tEncodeI32(&encoder, astLen) < 0) return -1;
|
||||||
if (sqlLen > 0 && tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
if (sqlLen > 0 && tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
||||||
|
@ -2696,6 +2757,10 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeCStrTo(&decoder, pReq->name) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->name) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->igExists) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->igExists) < 0) return -1;
|
||||||
|
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 (tDecodeI8(&decoder, &pReq->withTagSchema) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &sqlLen) < 0) return -1;
|
if (tDecodeI32(&decoder, &sqlLen) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &astLen) < 0) return -1;
|
if (tDecodeI32(&decoder, &astLen) < 0) return -1;
|
||||||
|
|
||||||
|
|
|
@ -167,7 +167,7 @@ TEST(testCase, Datablock_test) {
|
||||||
printf("the second row of binary:%s, length:%d\n", (char*)varDataVal(pData), varDataLen(pData));
|
printf("the second row of binary:%s, length:%d\n", (char*)varDataVal(pData), varDataLen(pData));
|
||||||
|
|
||||||
SArray* pOrderInfo = taosArrayInit(3, sizeof(SBlockOrderInfo));
|
SArray* pOrderInfo = taosArrayInit(3, sizeof(SBlockOrderInfo));
|
||||||
SBlockOrderInfo order = {.nullFirst = true, .order = TSDB_ORDER_ASC, .slotId = 0};
|
SBlockOrderInfo order = { true, TSDB_ORDER_ASC, 0, NULL };
|
||||||
taosArrayPush(pOrderInfo, &order);
|
taosArrayPush(pOrderInfo, &order);
|
||||||
|
|
||||||
blockDataSort(b, pOrderInfo);
|
blockDataSort(b, pOrderInfo);
|
||||||
|
|
|
@ -40,10 +40,12 @@ static void dmSetSignalHandle() {
|
||||||
taosSetSignal(SIGTERM, dmStopDnode);
|
taosSetSignal(SIGTERM, dmStopDnode);
|
||||||
taosSetSignal(SIGHUP, dmStopDnode);
|
taosSetSignal(SIGHUP, dmStopDnode);
|
||||||
taosSetSignal(SIGINT, dmStopDnode);
|
taosSetSignal(SIGINT, dmStopDnode);
|
||||||
taosSetSignal(SIGTSTP, dmStopDnode);
|
|
||||||
taosSetSignal(SIGABRT, dmStopDnode);
|
taosSetSignal(SIGABRT, dmStopDnode);
|
||||||
taosSetSignal(SIGBREAK, dmStopDnode);
|
taosSetSignal(SIGBREAK, dmStopDnode);
|
||||||
|
#ifndef WINDOWS
|
||||||
|
taosSetSignal(SIGTSTP, dmStopDnode);
|
||||||
taosSetSignal(SIGQUIT, dmStopDnode);
|
taosSetSignal(SIGQUIT, dmStopDnode);
|
||||||
|
#endif
|
||||||
|
|
||||||
if (!tsMultiProcess) {
|
if (!tsMultiProcess) {
|
||||||
} else if (global.ntype == DNODE || global.ntype == NODE_END) {
|
} else if (global.ntype == DNODE || global.ntype == NODE_END) {
|
||||||
|
|
|
@ -216,6 +216,126 @@ static void dmStopMgmt(SMgmtWrapper *pWrapper) {
|
||||||
dmStopStatusThread(pWrapper->pDnode);
|
dmStopStatusThread(pWrapper->pDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t dmSpawnUdfd(SDnode *pDnode);
|
||||||
|
|
||||||
|
void dmUdfdExit(uv_process_t *process, int64_t exitStatus, int termSignal) {
|
||||||
|
dInfo("udfd process exited with status %" PRId64 ", signal %d", exitStatus, termSignal);
|
||||||
|
uv_close((uv_handle_t*)process, NULL);
|
||||||
|
SDnode *pDnode = process->data;
|
||||||
|
SUdfdData *pData = &pDnode->udfdData;
|
||||||
|
if (atomic_load_8(&pData->stopping) != 0) {
|
||||||
|
dDebug("udfd process exit due to stopping");
|
||||||
|
} else {
|
||||||
|
uv_close((uv_handle_t*)&pData->ctrlPipe, NULL);
|
||||||
|
dmSpawnUdfd(pDnode);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t dmSpawnUdfd(SDnode *pDnode) {
|
||||||
|
dInfo("dnode start spawning udfd");
|
||||||
|
uv_process_options_t options = {0};
|
||||||
|
|
||||||
|
char path[PATH_MAX] = {0};
|
||||||
|
if (tsProcPath == NULL) {
|
||||||
|
path[0] = '.';
|
||||||
|
} else {
|
||||||
|
strncpy(path, tsProcPath, strlen(tsProcPath));
|
||||||
|
taosDirName(path);
|
||||||
|
}
|
||||||
|
strcat(path, "/udfd");
|
||||||
|
char* argsUdfd[] = {path, "-c", configDir, NULL};
|
||||||
|
options.args = argsUdfd;
|
||||||
|
options.file = path;
|
||||||
|
|
||||||
|
options.exit_cb = dmUdfdExit;
|
||||||
|
SUdfdData *pData = &pDnode->udfdData;
|
||||||
|
uv_pipe_init(&pData->loop, &pData->ctrlPipe, 1);
|
||||||
|
|
||||||
|
uv_stdio_container_t child_stdio[3];
|
||||||
|
child_stdio[0].flags = UV_CREATE_PIPE | UV_READABLE_PIPE;
|
||||||
|
child_stdio[0].data.stream = (uv_stream_t*) &pData->ctrlPipe;
|
||||||
|
child_stdio[1].flags = UV_IGNORE;
|
||||||
|
child_stdio[2].flags = UV_INHERIT_FD;
|
||||||
|
child_stdio[2].data.fd = 2;
|
||||||
|
options.stdio_count = 3;
|
||||||
|
options.stdio = child_stdio;
|
||||||
|
|
||||||
|
char dnodeIdEnvItem[32] = {0};
|
||||||
|
char thrdPoolSizeEnvItem[32] = {0};
|
||||||
|
snprintf(dnodeIdEnvItem, 32, "%s=%d", "DNODE_ID", pDnode->data.dnodeId);
|
||||||
|
float numCpuCores = 4;
|
||||||
|
taosGetCpuCores(&numCpuCores);
|
||||||
|
snprintf(thrdPoolSizeEnvItem,32, "%s=%d", "UV_THREADPOOL_SIZE", (int)numCpuCores*2);
|
||||||
|
char* envUdfd[] = {dnodeIdEnvItem, thrdPoolSizeEnvItem, NULL};
|
||||||
|
options.env = envUdfd;
|
||||||
|
|
||||||
|
int err = uv_spawn(&pData->loop, &pData->process, &options);
|
||||||
|
pData->process.data = (void*)pDnode;
|
||||||
|
|
||||||
|
if (err != 0) {
|
||||||
|
dError("can not spawn udfd. path: %s, error: %s", path, uv_strerror(err));
|
||||||
|
}
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void dmUdfdCloseWalkCb(uv_handle_t* handle, void* arg) {
|
||||||
|
if (!uv_is_closing(handle)) {
|
||||||
|
uv_close(handle, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void dmWatchUdfd(void *args) {
|
||||||
|
SDnode *pDnode = args;
|
||||||
|
SUdfdData *pData = &pDnode->udfdData;
|
||||||
|
uv_loop_init(&pData->loop);
|
||||||
|
int32_t err = dmSpawnUdfd(pDnode);
|
||||||
|
atomic_store_32(&pData->spawnErr, err);
|
||||||
|
uv_barrier_wait(&pData->barrier);
|
||||||
|
uv_run(&pData->loop, UV_RUN_DEFAULT);
|
||||||
|
err = uv_loop_close(&pData->loop);
|
||||||
|
while (err == UV_EBUSY) {
|
||||||
|
uv_walk(&pData->loop, dmUdfdCloseWalkCb, NULL);
|
||||||
|
uv_run(&pData->loop, UV_RUN_DEFAULT);
|
||||||
|
err = uv_loop_close(&pData->loop);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dmStartUdfd(SDnode *pDnode) {
|
||||||
|
SUdfdData *pData = &pDnode->udfdData;
|
||||||
|
if (pData->startCalled) {
|
||||||
|
dInfo("dnode-mgmt start udfd already called");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
uv_barrier_init(&pData->barrier, 2);
|
||||||
|
pData->stopping = 0;
|
||||||
|
uv_thread_create(&pData->thread, dmWatchUdfd, pDnode);
|
||||||
|
uv_barrier_wait(&pData->barrier);
|
||||||
|
pData->startCalled = true;
|
||||||
|
pData->needCleanUp = true;
|
||||||
|
return pData->spawnErr;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t dmStopUdfd(SDnode *pDnode) {
|
||||||
|
dInfo("dnode-mgmt to stop udfd. need cleanup: %d, spawn err: %d",
|
||||||
|
pDnode->udfdData.needCleanUp, pDnode->udfdData.spawnErr);
|
||||||
|
SUdfdData *pData = &pDnode->udfdData;
|
||||||
|
if (!pData->needCleanUp) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
atomic_store_8(&pData->stopping, 1);
|
||||||
|
|
||||||
|
uv_barrier_destroy(&pData->barrier);
|
||||||
|
if (pData->spawnErr == 0) {
|
||||||
|
uv_process_kill(&pData->process, SIGINT);
|
||||||
|
}
|
||||||
|
uv_stop(&pData->loop);
|
||||||
|
uv_thread_join(&pData->thread);
|
||||||
|
|
||||||
|
atomic_store_8(&pData->stopping, 0);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t dmInitMgmt(SMgmtWrapper *pWrapper) {
|
static int32_t dmInitMgmt(SMgmtWrapper *pWrapper) {
|
||||||
dInfo("dnode-mgmt start to init");
|
dInfo("dnode-mgmt start to init");
|
||||||
SDnode *pDnode = pWrapper->pDnode;
|
SDnode *pDnode = pWrapper->pDnode;
|
||||||
|
@ -247,6 +367,10 @@ static int32_t dmInitMgmt(SMgmtWrapper *pWrapper) {
|
||||||
}
|
}
|
||||||
dmReportStartup(pDnode, "dnode-transport", "initialized");
|
dmReportStartup(pDnode, "dnode-transport", "initialized");
|
||||||
|
|
||||||
|
if (dmStartUdfd(pDnode) != 0) {
|
||||||
|
dError("failed to start udfd");
|
||||||
|
}
|
||||||
|
|
||||||
dInfo("dnode-mgmt is initialized");
|
dInfo("dnode-mgmt is initialized");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -254,6 +378,7 @@ static int32_t dmInitMgmt(SMgmtWrapper *pWrapper) {
|
||||||
static void dmCleanupMgmt(SMgmtWrapper *pWrapper) {
|
static void dmCleanupMgmt(SMgmtWrapper *pWrapper) {
|
||||||
dInfo("dnode-mgmt start to clean up");
|
dInfo("dnode-mgmt start to clean up");
|
||||||
SDnode *pDnode = pWrapper->pDnode;
|
SDnode *pDnode = pWrapper->pDnode;
|
||||||
|
dmStopUdfd(pDnode);
|
||||||
dmStopWorker(pDnode);
|
dmStopWorker(pDnode);
|
||||||
|
|
||||||
taosWLockLatch(&pDnode->data.latch);
|
taosWLockLatch(&pDnode->data.latch);
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
#ifndef _TD_DM_DEF_H_
|
#ifndef _TD_DM_DEF_H_
|
||||||
#define _TD_DM_DEF_H_
|
#define _TD_DM_DEF_H_
|
||||||
|
|
||||||
|
#include "uv.h"
|
||||||
#include "dmLog.h"
|
#include "dmLog.h"
|
||||||
|
|
||||||
#include "cJSON.h"
|
#include "cJSON.h"
|
||||||
|
@ -142,6 +143,18 @@ typedef struct {
|
||||||
char desc[TSDB_STEP_DESC_LEN];
|
char desc[TSDB_STEP_DESC_LEN];
|
||||||
} SStartupInfo;
|
} SStartupInfo;
|
||||||
|
|
||||||
|
typedef struct SUdfdData {
|
||||||
|
bool startCalled;
|
||||||
|
bool needCleanUp;
|
||||||
|
uv_loop_t loop;
|
||||||
|
uv_thread_t thread;
|
||||||
|
uv_barrier_t barrier;
|
||||||
|
uv_process_t process;
|
||||||
|
int spawnErr;
|
||||||
|
int8_t stopping;
|
||||||
|
uv_pipe_t ctrlPipe;
|
||||||
|
} SUdfdData;
|
||||||
|
|
||||||
typedef struct SDnode {
|
typedef struct SDnode {
|
||||||
EDndProcType ptype;
|
EDndProcType ptype;
|
||||||
EDndNodeType ntype;
|
EDndNodeType ntype;
|
||||||
|
@ -150,6 +163,7 @@ typedef struct SDnode {
|
||||||
SStartupInfo startup;
|
SStartupInfo startup;
|
||||||
SDnodeTrans trans;
|
SDnodeTrans trans;
|
||||||
SDnodeData data;
|
SDnodeData data;
|
||||||
|
SUdfdData udfdData;
|
||||||
TdThreadMutex mutex;
|
TdThreadMutex mutex;
|
||||||
SMgmtWrapper wrappers[NODE_END];
|
SMgmtWrapper wrappers[NODE_END];
|
||||||
} SDnode;
|
} SDnode;
|
||||||
|
|
|
@ -89,7 +89,6 @@ int32_t Testbase::SendShowReq(int8_t showType, const char *tb, const char* db) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SRetrieveTableReq retrieveReq = {0};
|
SRetrieveTableReq retrieveReq = {0};
|
||||||
retrieveReq.type = showType;
|
|
||||||
strcpy(retrieveReq.db, db);
|
strcpy(retrieveReq.db, db);
|
||||||
strcpy(retrieveReq.tb, tb);
|
strcpy(retrieveReq.tb, tb);
|
||||||
|
|
||||||
|
|
|
@ -391,7 +391,6 @@ typedef struct {
|
||||||
int16_t numOfColumns;
|
int16_t numOfColumns;
|
||||||
int32_t rowSize;
|
int32_t rowSize;
|
||||||
int32_t numOfRows;
|
int32_t numOfRows;
|
||||||
int32_t payloadLen;
|
|
||||||
void* pIter;
|
void* pIter;
|
||||||
SMnode* pMnode;
|
SMnode* pMnode;
|
||||||
STableMetaRsp* pMeta;
|
STableMetaRsp* pMeta;
|
||||||
|
@ -418,82 +417,6 @@ typedef struct {
|
||||||
char payload[];
|
char payload[];
|
||||||
} SSysTableRetrieveObj;
|
} SSysTableRetrieveObj;
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int32_t vgId; // -1 for unassigned
|
|
||||||
int32_t status;
|
|
||||||
int32_t epoch;
|
|
||||||
SEpSet epSet;
|
|
||||||
int64_t oldConsumerId;
|
|
||||||
int64_t consumerId; // -1 for unassigned
|
|
||||||
char* qmsg;
|
|
||||||
} SMqConsumerEp;
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqConsumerEp(void** buf, const SMqConsumerEp* pConsumerEp) {
|
|
||||||
int32_t tlen = 0;
|
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumerEp->vgId);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumerEp->status);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumerEp->epoch);
|
|
||||||
tlen += taosEncodeSEpSet(buf, &pConsumerEp->epSet);
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumerEp->oldConsumerId);
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumerEp->consumerId);
|
|
||||||
tlen += taosEncodeString(buf, pConsumerEp->qmsg);
|
|
||||||
return tlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqConsumerEp(void** buf, SMqConsumerEp* pConsumerEp) {
|
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumerEp->vgId);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumerEp->status);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumerEp->epoch);
|
|
||||||
buf = taosDecodeSEpSet(buf, &pConsumerEp->epSet);
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumerEp->oldConsumerId);
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumerEp->consumerId);
|
|
||||||
buf = taosDecodeString(buf, &pConsumerEp->qmsg);
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void tDeleteSMqConsumerEp(SMqConsumerEp* pConsumerEp) {
|
|
||||||
if (pConsumerEp) {
|
|
||||||
taosMemoryFreeClear(pConsumerEp->qmsg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int64_t consumerId;
|
|
||||||
SArray* vgInfo; // SArray<SMqConsumerEp>
|
|
||||||
} SMqSubConsumer;
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqSubConsumer(void** buf, const SMqSubConsumer* pConsumer) {
|
|
||||||
int32_t tlen = 0;
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumer->consumerId);
|
|
||||||
int32_t sz = taosArrayGetSize(pConsumer->vgInfo);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqConsumerEp* pCEp = taosArrayGet(pConsumer->vgInfo, i);
|
|
||||||
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
|
||||||
}
|
|
||||||
return tlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqSubConsumer(void** buf, SMqSubConsumer* pConsumer) {
|
|
||||||
int32_t sz;
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumer->consumerId);
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pConsumer->vgInfo = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqConsumerEp consumerEp;
|
|
||||||
buf = tDecodeSMqConsumerEp(buf, &consumerEp);
|
|
||||||
taosArrayPush(pConsumer->vgInfo, &consumerEp);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void tDeleteSMqSubConsumer(SMqSubConsumer* pSubConsumer) {
|
|
||||||
if (pSubConsumer->vgInfo) {
|
|
||||||
taosArrayDestroyEx(pSubConsumer->vgInfo, (void (*)(void*))tDeleteSMqConsumerEp);
|
|
||||||
pSubConsumer->vgInfo = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char key[TSDB_PARTITION_KEY_LEN];
|
char key[TSDB_PARTITION_KEY_LEN];
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
|
@ -512,147 +435,21 @@ static FORCE_INLINE void* tDecodeSMqOffsetObj(void* buf, SMqOffsetObj* pOffset)
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
char name[TSDB_TOPIC_FNAME_LEN];
|
||||||
int32_t status;
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int32_t vgNum;
|
int64_t createTime;
|
||||||
SArray* consumers; // SArray<SMqSubConsumer>
|
int64_t updateTime;
|
||||||
SArray* lostConsumers; // SArray<SMqSubConsumer>
|
int64_t uid;
|
||||||
SArray* unassignedVg; // SArray<SMqConsumerEp>
|
// TODO: use subDbUid
|
||||||
} SMqSubscribeObj;
|
|
||||||
|
|
||||||
static FORCE_INLINE SMqSubscribeObj* tNewSubscribeObj() {
|
|
||||||
SMqSubscribeObj* pSub = taosMemoryCalloc(1, sizeof(SMqSubscribeObj));
|
|
||||||
if (pSub == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSub->consumers = taosArrayInit(0, sizeof(SMqSubConsumer));
|
|
||||||
if (pSub->consumers == NULL) {
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSub->lostConsumers = taosArrayInit(0, sizeof(SMqSubConsumer));
|
|
||||||
if (pSub->lostConsumers == NULL) {
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSub->unassignedVg = taosArrayInit(0, sizeof(SMqConsumerEp));
|
|
||||||
if (pSub->unassignedVg == NULL) {
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
pSub->key[0] = 0;
|
|
||||||
pSub->vgNum = 0;
|
|
||||||
pSub->status = 0;
|
|
||||||
|
|
||||||
return pSub;
|
|
||||||
|
|
||||||
_err:
|
|
||||||
taosMemoryFreeClear(pSub->consumers);
|
|
||||||
taosMemoryFreeClear(pSub->lostConsumers);
|
|
||||||
taosMemoryFreeClear(pSub->unassignedVg);
|
|
||||||
taosMemoryFreeClear(pSub);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSubscribeObj(void** buf, const SMqSubscribeObj* pSub) {
|
|
||||||
int32_t tlen = 0;
|
|
||||||
tlen += taosEncodeString(buf, pSub->key);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pSub->vgNum);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pSub->status);
|
|
||||||
int32_t sz;
|
|
||||||
|
|
||||||
sz = taosArrayGetSize(pSub->consumers);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqSubConsumer* pSubConsumer = taosArrayGet(pSub->consumers, i);
|
|
||||||
tlen += tEncodeSMqSubConsumer(buf, pSubConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
sz = taosArrayGetSize(pSub->lostConsumers);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqSubConsumer* pSubConsumer = taosArrayGet(pSub->lostConsumers, i);
|
|
||||||
tlen += tEncodeSMqSubConsumer(buf, pSubConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
sz = taosArrayGetSize(pSub->unassignedVg);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqConsumerEp* pCEp = taosArrayGet(pSub->unassignedVg, i);
|
|
||||||
tlen += tEncodeSMqConsumerEp(buf, pCEp);
|
|
||||||
}
|
|
||||||
|
|
||||||
return tlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSubscribeObj(void* buf, SMqSubscribeObj* pSub) {
|
|
||||||
buf = taosDecodeStringTo(buf, pSub->key);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pSub->vgNum);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pSub->status);
|
|
||||||
|
|
||||||
int32_t sz;
|
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pSub->consumers = taosArrayInit(sz, sizeof(SMqSubConsumer));
|
|
||||||
if (pSub->consumers == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqSubConsumer subConsumer = {0};
|
|
||||||
buf = tDecodeSMqSubConsumer(buf, &subConsumer);
|
|
||||||
taosArrayPush(pSub->consumers, &subConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pSub->lostConsumers = taosArrayInit(sz, sizeof(SMqSubConsumer));
|
|
||||||
if (pSub->lostConsumers == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqSubConsumer subConsumer = {0};
|
|
||||||
buf = tDecodeSMqSubConsumer(buf, &subConsumer);
|
|
||||||
taosArrayPush(pSub->lostConsumers, &subConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pSub->unassignedVg = taosArrayInit(sz, sizeof(SMqConsumerEp));
|
|
||||||
if (pSub->unassignedVg == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SMqConsumerEp consumerEp = {0};
|
|
||||||
buf = tDecodeSMqConsumerEp(buf, &consumerEp);
|
|
||||||
taosArrayPush(pSub->unassignedVg, &consumerEp);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void tDeleteSMqSubscribeObj(SMqSubscribeObj* pSub) {
|
|
||||||
if (pSub->consumers) {
|
|
||||||
// taosArrayDestroyEx(pSub->consumers, (void (*)(void*))tDeleteSMqSubConsumer);
|
|
||||||
// taosArrayDestroy(pSub->consumers);
|
|
||||||
pSub->consumers = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pSub->unassignedVg) {
|
|
||||||
// taosArrayDestroyEx(pSub->unassignedVg, (void (*)(void*))tDeleteSMqConsumerEp);
|
|
||||||
// taosArrayDestroy(pSub->unassignedVg);
|
|
||||||
pSub->unassignedVg = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
char name[TSDB_TOPIC_FNAME_LEN];
|
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
|
||||||
int64_t createTime;
|
|
||||||
int64_t updateTime;
|
|
||||||
int64_t uid;
|
|
||||||
int64_t dbUid;
|
int64_t dbUid;
|
||||||
|
int64_t subDbUid;
|
||||||
int32_t version;
|
int32_t version;
|
||||||
|
int8_t subType; // db or table
|
||||||
|
int8_t withTbName;
|
||||||
|
int8_t withSchema;
|
||||||
|
int8_t withTag;
|
||||||
|
int8_t withTagSchema;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int32_t sqlLen;
|
int32_t sqlLen;
|
||||||
int32_t astLen;
|
int32_t astLen;
|
||||||
|
@ -662,79 +459,6 @@ typedef struct {
|
||||||
SSchemaWrapper schema;
|
SSchemaWrapper schema;
|
||||||
} SMqTopicObj;
|
} SMqTopicObj;
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef struct {
|
|
||||||
int64_t consumerId;
|
|
||||||
int64_t connId;
|
|
||||||
SRWLatch lock;
|
|
||||||
char cgroup[TSDB_CGROUP_LEN];
|
|
||||||
SArray* currentTopics; // SArray<char*>
|
|
||||||
SArray* recentRemovedTopics; // SArray<char*>
|
|
||||||
int32_t epoch;
|
|
||||||
// stat
|
|
||||||
int64_t pollCnt;
|
|
||||||
// status
|
|
||||||
int32_t status;
|
|
||||||
// heartbeat from the consumer reset hbStatus to 0
|
|
||||||
// each checkConsumerAlive msg add hbStatus by 1
|
|
||||||
// if checkConsumerAlive > CONSUMER_REBALANCE_CNT, mask to lost
|
|
||||||
int32_t hbStatus;
|
|
||||||
} SMqConsumerObj;
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqConsumerObj(void** buf, const SMqConsumerObj* pConsumer) {
|
|
||||||
int32_t sz;
|
|
||||||
int32_t tlen = 0;
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumer->consumerId);
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumer->connId);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumer->epoch);
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumer->pollCnt);
|
|
||||||
tlen += taosEncodeFixedI32(buf, pConsumer->status);
|
|
||||||
tlen += taosEncodeString(buf, pConsumer->cgroup);
|
|
||||||
|
|
||||||
sz = taosArrayGetSize(pConsumer->currentTopics);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char* topic = taosArrayGetP(pConsumer->currentTopics, i);
|
|
||||||
tlen += taosEncodeString(buf, topic);
|
|
||||||
}
|
|
||||||
|
|
||||||
sz = taosArrayGetSize(pConsumer->recentRemovedTopics);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char* topic = taosArrayGetP(pConsumer->recentRemovedTopics, i);
|
|
||||||
tlen += taosEncodeString(buf, topic);
|
|
||||||
}
|
|
||||||
return tlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqConsumerObj(void* buf, SMqConsumerObj* pConsumer) {
|
|
||||||
int32_t sz;
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumer->consumerId);
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumer->connId);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumer->epoch);
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumer->pollCnt);
|
|
||||||
buf = taosDecodeFixedI32(buf, &pConsumer->status);
|
|
||||||
buf = taosDecodeStringTo(buf, pConsumer->cgroup);
|
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pConsumer->currentTopics = taosArrayInit(sz, sizeof(void*));
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char* topic;
|
|
||||||
buf = taosDecodeString(buf, &topic);
|
|
||||||
taosArrayPush(pConsumer->currentTopics, &topic);
|
|
||||||
}
|
|
||||||
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pConsumer->recentRemovedTopics = taosArrayInit(sz, sizeof(void*));
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char* topic;
|
|
||||||
buf = taosDecodeString(buf, &topic);
|
|
||||||
taosArrayPush(pConsumer->recentRemovedTopics, &topic);
|
|
||||||
}
|
|
||||||
return buf;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
CONSUMER_UPDATE__TOUCH = 1,
|
CONSUMER_UPDATE__TOUCH = 1,
|
||||||
CONSUMER_UPDATE__ADD,
|
CONSUMER_UPDATE__ADD,
|
||||||
|
@ -753,12 +477,9 @@ typedef struct {
|
||||||
int32_t hbStatus;
|
int32_t hbStatus;
|
||||||
// lock is used for topics update
|
// lock is used for topics update
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
SArray* currentTopics; // SArray<char*>
|
SArray* currentTopics; // SArray<char*>
|
||||||
#if 0
|
SArray* rebNewTopics; // SArray<char*>
|
||||||
SArray* waitingRebTopics; // SArray<char*>
|
SArray* rebRemovedTopics; // SArray<char*>
|
||||||
#endif
|
|
||||||
SArray* rebNewTopics; // SArray<char*>
|
|
||||||
SArray* rebRemovedTopics; // SArray<char*>
|
|
||||||
} SMqConsumerObj;
|
} SMqConsumerObj;
|
||||||
|
|
||||||
SMqConsumerObj* tNewSMqConsumerObj(int64_t consumerId, char cgroup[TSDB_CGROUP_LEN]);
|
SMqConsumerObj* tNewSMqConsumerObj(int64_t consumerId, char cgroup[TSDB_CGROUP_LEN]);
|
||||||
|
@ -769,8 +490,7 @@ void* tDecodeSMqConsumerObj(const void* buf, SMqConsumerObj* pConsumer
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
char* qmsg;
|
char* qmsg;
|
||||||
// char topic[TSDB_TOPIC_FNAME_LEN];
|
SEpSet epSet;
|
||||||
SEpSet epSet;
|
|
||||||
} SMqVgEp;
|
} SMqVgEp;
|
||||||
|
|
||||||
SMqVgEp* tCloneSMqVgEp(const SMqVgEp* pVgEp);
|
SMqVgEp* tCloneSMqVgEp(const SMqVgEp* pVgEp);
|
||||||
|
@ -792,7 +512,14 @@ typedef struct {
|
||||||
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int32_t vgNum;
|
int32_t vgNum;
|
||||||
|
int8_t subType;
|
||||||
|
int8_t withTbName;
|
||||||
|
int8_t withSchema;
|
||||||
|
int8_t withTag;
|
||||||
|
int8_t withTagSchema;
|
||||||
SHashObj* consumerHash; // consumerId -> SMqConsumerEpInSub
|
SHashObj* consumerHash; // consumerId -> SMqConsumerEpInSub
|
||||||
|
// TODO put -1 into unassignVgs
|
||||||
|
// SArray* unassignedVgs;
|
||||||
} SMqSubscribeObj;
|
} SMqSubscribeObj;
|
||||||
|
|
||||||
SMqSubscribeObj* tNewSubscribeObj(const char key[TSDB_SUBSCRIBE_KEY_LEN]);
|
SMqSubscribeObj* tNewSubscribeObj(const char key[TSDB_SUBSCRIBE_KEY_LEN]);
|
||||||
|
@ -821,18 +548,6 @@ void tDeleteSMqSubActionLogObj(SMqSubActionLogObj* pLog);
|
||||||
int32_t tEncodeSMqSubActionLogObj(void** buf, const SMqSubActionLogObj* pLog);
|
int32_t tEncodeSMqSubActionLogObj(void** buf, const SMqSubActionLogObj* pLog);
|
||||||
void* tDecodeSMqSubActionLogObj(const void* buf, SMqSubActionLogObj* pLog);
|
void* tDecodeSMqSubActionLogObj(const void* buf, SMqSubActionLogObj* pLog);
|
||||||
|
|
||||||
typedef struct {
|
|
||||||
int64_t consumerId;
|
|
||||||
char cgroup[TSDB_CGROUP_LEN];
|
|
||||||
SRWLatch lock;
|
|
||||||
SArray* vgs; // SArray<SMqVgEp*>
|
|
||||||
} SMqConsumerEpObj;
|
|
||||||
|
|
||||||
SMqConsumerEpObj* tCloneSMqConsumerEpObj(const SMqConsumerEpObj* pConsumerEp);
|
|
||||||
void tDeleteSMqConsumerEpObj(SMqConsumerEpObj* pConsumerEp);
|
|
||||||
int32_t tEncodeSMqConsumerEpObj(void** buf, const SMqConsumerEpObj* pConsumerEp);
|
|
||||||
void* tDecodeSMqConsumerEpObj(const void* buf, SMqConsumerEpObj* pConsumerEp);
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
const SMqSubscribeObj* pOldSub;
|
const SMqSubscribeObj* pOldSub;
|
||||||
const SMqTopicObj* pTopic;
|
const SMqTopicObj* pTopic;
|
||||||
|
@ -845,12 +560,6 @@ typedef struct {
|
||||||
SMqVgEp* pVgEp;
|
SMqVgEp* pVgEp;
|
||||||
} SMqRebOutputVg;
|
} SMqRebOutputVg;
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef struct {
|
|
||||||
int64_t consumerId;
|
|
||||||
} SMqRebOutputConsumer;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SArray* rebVgs; // SArray<SMqRebOutputVg>
|
SArray* rebVgs; // SArray<SMqRebOutputVg>
|
||||||
SArray* newConsumers; // SArray<int64_t>
|
SArray* newConsumers; // SArray<int64_t>
|
||||||
|
|
|
@ -851,6 +851,8 @@ static int32_t mndProcessGetDbCfgReq(SNodeMsg *pReq) {
|
||||||
cfgRsp.cacheLastRow = pDb->cfg.cacheLastRow;
|
cfgRsp.cacheLastRow = pDb->cfg.cacheLastRow;
|
||||||
cfgRsp.streamMode = pDb->cfg.streamMode;
|
cfgRsp.streamMode = pDb->cfg.streamMode;
|
||||||
cfgRsp.singleSTable = pDb->cfg.singleSTable;
|
cfgRsp.singleSTable = pDb->cfg.singleSTable;
|
||||||
|
cfgRsp.numOfRetensions = pDb->cfg.numOfRetensions;
|
||||||
|
cfgRsp.pRetensions = pDb->cfg.pRetensions;
|
||||||
|
|
||||||
int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
|
int32_t contLen = tSerializeSDbCfgRsp(NULL, 0, &cfgRsp);
|
||||||
void *pRsp = rpcMallocCont(contLen);
|
void *pRsp = rpcMallocCont(contLen);
|
||||||
|
|
|
@ -32,9 +32,6 @@ SMqConsumerObj *tNewSMqConsumerObj(int64_t consumerId, char cgroup[TSDB_CGROUP_L
|
||||||
taosInitRWLatch(&pConsumer->lock);
|
taosInitRWLatch(&pConsumer->lock);
|
||||||
|
|
||||||
pConsumer->currentTopics = taosArrayInit(0, sizeof(void *));
|
pConsumer->currentTopics = taosArrayInit(0, sizeof(void *));
|
||||||
#if 0
|
|
||||||
pConsumer->waitingRebTopics = NULL;
|
|
||||||
#endif
|
|
||||||
pConsumer->rebNewTopics = taosArrayInit(0, sizeof(void *));
|
pConsumer->rebNewTopics = taosArrayInit(0, sizeof(void *));
|
||||||
pConsumer->rebRemovedTopics = taosArrayInit(0, sizeof(void *));
|
pConsumer->rebRemovedTopics = taosArrayInit(0, sizeof(void *));
|
||||||
|
|
||||||
|
@ -53,11 +50,6 @@ void tDeleteSMqConsumerObj(SMqConsumerObj *pConsumer) {
|
||||||
if (pConsumer->currentTopics) {
|
if (pConsumer->currentTopics) {
|
||||||
taosArrayDestroyP(pConsumer->currentTopics, (FDelete)taosMemoryFree);
|
taosArrayDestroyP(pConsumer->currentTopics, (FDelete)taosMemoryFree);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
if (pConsumer->waitingRebTopics) {
|
|
||||||
taosArrayDestroyP(pConsumer->waitingRebTopics, taosMemoryFree);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
if (pConsumer->rebNewTopics) {
|
if (pConsumer->rebNewTopics) {
|
||||||
taosArrayDestroyP(pConsumer->rebNewTopics, (FDelete)taosMemoryFree);
|
taosArrayDestroyP(pConsumer->rebNewTopics, (FDelete)taosMemoryFree);
|
||||||
}
|
}
|
||||||
|
@ -87,20 +79,6 @@ int32_t tEncodeSMqConsumerObj(void **buf, const SMqConsumerObj *pConsumer) {
|
||||||
tlen += taosEncodeFixedI32(buf, 0);
|
tlen += taosEncodeFixedI32(buf, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// waiting reb topics
|
|
||||||
if (pConsumer->waitingRebTopics) {
|
|
||||||
sz = taosArrayGetSize(pConsumer->waitingRebTopics);
|
|
||||||
tlen += taosEncodeFixedI32(buf, sz);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char *topic = taosArrayGetP(pConsumer->waitingRebTopics, i);
|
|
||||||
tlen += taosEncodeString(buf, topic);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
tlen += taosEncodeFixedI32(buf, 0);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// reb new topics
|
// reb new topics
|
||||||
if (pConsumer->rebNewTopics) {
|
if (pConsumer->rebNewTopics) {
|
||||||
sz = taosArrayGetSize(pConsumer->rebNewTopics);
|
sz = taosArrayGetSize(pConsumer->rebNewTopics);
|
||||||
|
@ -145,17 +123,6 @@ void *tDecodeSMqConsumerObj(const void *buf, SMqConsumerObj *pConsumer) {
|
||||||
taosArrayPush(pConsumer->currentTopics, &topic);
|
taosArrayPush(pConsumer->currentTopics, &topic);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
// waiting reb topics
|
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
|
||||||
pConsumer->waitingRebTopics = taosArrayInit(sz, sizeof(void *));
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char *topic;
|
|
||||||
buf = taosDecodeString(buf, &topic);
|
|
||||||
taosArrayPush(pConsumer->waitingRebTopics, &topic);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// reb new topics
|
// reb new topics
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
pConsumer->rebNewTopics = taosArrayInit(sz, sizeof(void *));
|
pConsumer->rebNewTopics = taosArrayInit(sz, sizeof(void *));
|
||||||
|
@ -182,7 +149,6 @@ SMqVgEp *tCloneSMqVgEp(const SMqVgEp *pVgEp) {
|
||||||
if (pVgEpNew == NULL) return NULL;
|
if (pVgEpNew == NULL) return NULL;
|
||||||
pVgEpNew->vgId = pVgEp->vgId;
|
pVgEpNew->vgId = pVgEp->vgId;
|
||||||
pVgEpNew->qmsg = strdup(pVgEp->qmsg);
|
pVgEpNew->qmsg = strdup(pVgEp->qmsg);
|
||||||
/*memcpy(pVgEpNew->topic, pVgEp->topic, TSDB_TOPIC_FNAME_LEN);*/
|
|
||||||
pVgEpNew->epSet = pVgEp->epSet;
|
pVgEpNew->epSet = pVgEp->epSet;
|
||||||
return pVgEpNew;
|
return pVgEpNew;
|
||||||
}
|
}
|
||||||
|
@ -193,7 +159,6 @@ int32_t tEncodeSMqVgEp(void **buf, const SMqVgEp *pVgEp) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI32(buf, pVgEp->vgId);
|
tlen += taosEncodeFixedI32(buf, pVgEp->vgId);
|
||||||
tlen += taosEncodeString(buf, pVgEp->qmsg);
|
tlen += taosEncodeString(buf, pVgEp->qmsg);
|
||||||
/*tlen += taosEncodeString(buf, pVgEp->topic);*/
|
|
||||||
tlen += taosEncodeSEpSet(buf, &pVgEp->epSet);
|
tlen += taosEncodeSEpSet(buf, &pVgEp->epSet);
|
||||||
return tlen;
|
return tlen;
|
||||||
}
|
}
|
||||||
|
@ -201,40 +166,10 @@ int32_t tEncodeSMqVgEp(void **buf, const SMqVgEp *pVgEp) {
|
||||||
void *tDecodeSMqVgEp(const void *buf, SMqVgEp *pVgEp) {
|
void *tDecodeSMqVgEp(const void *buf, SMqVgEp *pVgEp) {
|
||||||
buf = taosDecodeFixedI32(buf, &pVgEp->vgId);
|
buf = taosDecodeFixedI32(buf, &pVgEp->vgId);
|
||||||
buf = taosDecodeString(buf, &pVgEp->qmsg);
|
buf = taosDecodeString(buf, &pVgEp->qmsg);
|
||||||
/*buf = taosDecodeStringTo(buf, pVgEp->topic);*/
|
|
||||||
buf = taosDecodeSEpSet(buf, &pVgEp->epSet);
|
buf = taosDecodeSEpSet(buf, &pVgEp->epSet);
|
||||||
return (void *)buf;
|
return (void *)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqConsumerEpObj *tCloneSMqConsumerEpObj(const SMqConsumerEpObj *pConsumerEp) {
|
|
||||||
SMqConsumerEpObj *pConsumerEpNew = taosMemoryMalloc(sizeof(SMqConsumerEpObj));
|
|
||||||
if (pConsumerEpNew == NULL) return NULL;
|
|
||||||
pConsumerEpNew->consumerId = pConsumerEp->consumerId;
|
|
||||||
memcpy(pConsumerEpNew->cgroup, pConsumerEp->cgroup, TSDB_CGROUP_LEN);
|
|
||||||
taosInitRWLatch(&pConsumerEpNew->lock);
|
|
||||||
pConsumerEpNew->vgs = taosArrayDeepCopy(pConsumerEpNew->vgs, (FCopy)tCloneSMqVgEp);
|
|
||||||
return pConsumerEpNew;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tDeleteSMqConsumerEpObj(SMqConsumerEpObj *pConsumerEp) {
|
|
||||||
taosArrayDestroyEx(pConsumerEp->vgs, (FDelete)tDeleteSMqVgEp);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tEncodeSMqConsumerEpObj(void **buf, const SMqConsumerEpObj *pConsumerEp) {
|
|
||||||
int32_t tlen = 0;
|
|
||||||
tlen += taosEncodeFixedI64(buf, pConsumerEp->consumerId);
|
|
||||||
tlen += taosEncodeString(buf, pConsumerEp->cgroup);
|
|
||||||
tlen += taosEncodeArray(buf, pConsumerEp->vgs, (FEncode)tEncodeSMqVgEp);
|
|
||||||
return tlen;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *tDecodeSMqConsumerEpObj(const void *buf, SMqConsumerEpObj *pConsumerEp) {
|
|
||||||
buf = taosDecodeFixedI64(buf, &pConsumerEp->consumerId);
|
|
||||||
buf = taosDecodeStringTo(buf, pConsumerEp->cgroup);
|
|
||||||
buf = taosDecodeArray(buf, &pConsumerEp->vgs, (FDecode)tDecodeSMqVgEp, sizeof(SMqSubVgEp));
|
|
||||||
return (void *)buf;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMqConsumerEpInSub *tCloneSMqConsumerEpInSub(const SMqConsumerEpInSub *pEpInSub) {
|
SMqConsumerEpInSub *tCloneSMqConsumerEpInSub(const SMqConsumerEpInSub *pEpInSub) {
|
||||||
SMqConsumerEpInSub *pEpInSubNew = taosMemoryMalloc(sizeof(SMqConsumerEpInSub));
|
SMqConsumerEpInSub *pEpInSubNew = taosMemoryMalloc(sizeof(SMqConsumerEpInSub));
|
||||||
if (pEpInSubNew == NULL) return NULL;
|
if (pEpInSubNew == NULL) return NULL;
|
||||||
|
@ -276,7 +211,7 @@ void *tDecodeSMqConsumerEpInSub(const void *buf, SMqConsumerEpInSub *pEpInSub) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqSubscribeObj *tNewSubscribeObj(const char key[TSDB_SUBSCRIBE_KEY_LEN]) {
|
SMqSubscribeObj *tNewSubscribeObj(const char key[TSDB_SUBSCRIBE_KEY_LEN]) {
|
||||||
SMqSubscribeObj *pSubNew = taosMemoryMalloc(sizeof(SMqSubscribeObj));
|
SMqSubscribeObj *pSubNew = taosMemoryCalloc(1, sizeof(SMqSubscribeObj));
|
||||||
if (pSubNew == NULL) return NULL;
|
if (pSubNew == NULL) return NULL;
|
||||||
memcpy(pSubNew->key, key, TSDB_SUBSCRIBE_KEY_LEN);
|
memcpy(pSubNew->key, key, TSDB_SUBSCRIBE_KEY_LEN);
|
||||||
taosInitRWLatch(&pSubNew->lock);
|
taosInitRWLatch(&pSubNew->lock);
|
||||||
|
@ -297,8 +232,14 @@ SMqSubscribeObj *tCloneSubscribeObj(const SMqSubscribeObj *pSub) {
|
||||||
if (pSubNew == NULL) return NULL;
|
if (pSubNew == NULL) return NULL;
|
||||||
memcpy(pSubNew->key, pSub->key, TSDB_SUBSCRIBE_KEY_LEN);
|
memcpy(pSubNew->key, pSub->key, TSDB_SUBSCRIBE_KEY_LEN);
|
||||||
taosInitRWLatch(&pSubNew->lock);
|
taosInitRWLatch(&pSubNew->lock);
|
||||||
|
|
||||||
|
pSubNew->subType = pSub->subType;
|
||||||
|
pSubNew->withTbName = pSub->withTbName;
|
||||||
|
pSubNew->withSchema = pSub->withSchema;
|
||||||
|
pSubNew->withTag = pSub->withTag;
|
||||||
|
pSubNew->withTagSchema = pSub->withTagSchema;
|
||||||
|
|
||||||
pSubNew->vgNum = pSub->vgNum;
|
pSubNew->vgNum = pSub->vgNum;
|
||||||
/*pSubNew->consumerEps = taosArrayDeepCopy(pSub->consumerEps, (FCopy)tCloneSMqConsumerEpInSub);*/
|
|
||||||
pSubNew->consumerHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
pSubNew->consumerHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||||
/*taosHashSetFreeFp(pSubNew->consumerHash, taosArrayDestroy);*/
|
/*taosHashSetFreeFp(pSubNew->consumerHash, taosArrayDestroy);*/
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
|
@ -325,6 +266,11 @@ int32_t tEncodeSubscribeObj(void **buf, const SMqSubscribeObj *pSub) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeString(buf, pSub->key);
|
tlen += taosEncodeString(buf, pSub->key);
|
||||||
tlen += taosEncodeFixedI32(buf, pSub->vgNum);
|
tlen += taosEncodeFixedI32(buf, pSub->vgNum);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pSub->subType);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pSub->withTbName);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pSub->withSchema);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pSub->withTag);
|
||||||
|
tlen += taosEncodeFixedI8(buf, pSub->withTagSchema);
|
||||||
|
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
int32_t sz = taosHashGetSize(pSub->consumerHash);
|
int32_t sz = taosHashGetSize(pSub->consumerHash);
|
||||||
|
@ -347,6 +293,11 @@ void *tDecodeSubscribeObj(const void *buf, SMqSubscribeObj *pSub) {
|
||||||
//
|
//
|
||||||
buf = taosDecodeStringTo(buf, pSub->key);
|
buf = taosDecodeStringTo(buf, pSub->key);
|
||||||
buf = taosDecodeFixedI32(buf, &pSub->vgNum);
|
buf = taosDecodeFixedI32(buf, &pSub->vgNum);
|
||||||
|
buf = taosDecodeFixedI8(buf, &pSub->subType);
|
||||||
|
buf = taosDecodeFixedI8(buf, &pSub->withTbName);
|
||||||
|
buf = taosDecodeFixedI8(buf, &pSub->withSchema);
|
||||||
|
buf = taosDecodeFixedI8(buf, &pSub->withTag);
|
||||||
|
buf = taosDecodeFixedI8(buf, &pSub->withTagSchema);
|
||||||
|
|
||||||
int32_t sz;
|
int32_t sz;
|
||||||
buf = taosDecodeFixedI32(buf, &sz);
|
buf = taosDecodeFixedI32(buf, &sz);
|
||||||
|
|
|
@ -427,7 +427,6 @@ static int32_t mndProcessRetrieveFuncReq(SNodeMsg *pReq) {
|
||||||
|
|
||||||
SFuncObj *pFunc = mndAcquireFunc(pMnode, funcName);
|
SFuncObj *pFunc = mndAcquireFunc(pMnode, funcName);
|
||||||
if (pFunc == NULL) {
|
if (pFunc == NULL) {
|
||||||
terrno = TSDB_CODE_MND_INVALID_FUNC;
|
|
||||||
goto RETRIEVE_FUNC_OVER;
|
goto RETRIEVE_FUNC_OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -439,21 +438,26 @@ static int32_t mndProcessRetrieveFuncReq(SNodeMsg *pReq) {
|
||||||
funcInfo.outputLen = pFunc->outputLen;
|
funcInfo.outputLen = pFunc->outputLen;
|
||||||
funcInfo.bufSize = pFunc->bufSize;
|
funcInfo.bufSize = pFunc->bufSize;
|
||||||
funcInfo.signature = pFunc->signature;
|
funcInfo.signature = pFunc->signature;
|
||||||
funcInfo.commentSize = pFunc->commentSize;
|
if (retrieveReq.ignoreCodeComment) {
|
||||||
funcInfo.codeSize = pFunc->codeSize;
|
funcInfo.commentSize = 0;
|
||||||
funcInfo.pCode = taosMemoryCalloc(1, funcInfo.codeSize);
|
funcInfo.codeSize = 0;
|
||||||
if (funcInfo.pCode == NULL) {
|
} else {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
funcInfo.commentSize = pFunc->commentSize;
|
||||||
goto RETRIEVE_FUNC_OVER;
|
funcInfo.codeSize = pFunc->codeSize;
|
||||||
}
|
funcInfo.pCode = taosMemoryCalloc(1, funcInfo.codeSize);
|
||||||
memcpy(funcInfo.pCode, pFunc->pCode, pFunc->codeSize);
|
if (funcInfo.pCode == NULL) {
|
||||||
if (funcInfo.commentSize > 0) {
|
|
||||||
funcInfo.pComment = taosMemoryCalloc(1, funcInfo.commentSize);
|
|
||||||
if (funcInfo.pComment == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto RETRIEVE_FUNC_OVER;
|
goto RETRIEVE_FUNC_OVER;
|
||||||
}
|
}
|
||||||
memcpy(funcInfo.pComment, pFunc->pComment, pFunc->commentSize);
|
memcpy(funcInfo.pCode, pFunc->pCode, pFunc->codeSize);
|
||||||
|
if (funcInfo.commentSize > 0) {
|
||||||
|
funcInfo.pComment = taosMemoryCalloc(1, funcInfo.commentSize);
|
||||||
|
if (funcInfo.pComment == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto RETRIEVE_FUNC_OVER;
|
||||||
|
}
|
||||||
|
memcpy(funcInfo.pComment, pFunc->pComment, pFunc->commentSize);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
taosArrayPush(retrieveRsp.pFuncInfos, &funcInfo);
|
taosArrayPush(retrieveRsp.pFuncInfos, &funcInfo);
|
||||||
mndReleaseFunc(pMnode, pFunc);
|
mndReleaseFunc(pMnode, pFunc);
|
||||||
|
@ -518,11 +522,16 @@ static int32_t mndRetrieveFuncs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pB
|
||||||
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)b1, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)b1, false);
|
||||||
|
|
||||||
char *b2 = taosMemoryCalloc(1, pShow->bytes[cols]);
|
if (pFunc->pComment) {
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(b2, pFunc->pComment, pShow->bytes[cols]);
|
char *b2 = taosMemoryCalloc(1, pShow->bytes[cols]);
|
||||||
|
STR_WITH_MAXSIZE_TO_VARSTR(b2, pFunc->pComment, pShow->bytes[cols]);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)b2, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)b2, false);
|
||||||
|
} else {
|
||||||
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
colDataAppend(pColInfo, numOfRows, NULL, true);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t isAgg = (pFunc->funcType == TSDB_FUNC_TYPE_AGGREGATE) ? 1 : 0;
|
int32_t isAgg = (pFunc->funcType == TSDB_FUNC_TYPE_AGGREGATE) ? 1 : 0;
|
||||||
|
|
||||||
|
@ -556,4 +565,4 @@ static int32_t mndRetrieveFuncs(SNodeMsg *pReq, SShowObj *pShow, SSDataBlock *pB
|
||||||
static void mndCancelGetNextFunc(SMnode *pMnode, void *pIter) {
|
static void mndCancelGetNextFunc(SMnode *pMnode, void *pIter) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
sdbCancelFetch(pSdb, pIter);
|
sdbCancelFetch(pSdb, pIter);
|
||||||
}
|
}
|
||||||
|
|
|
@ -98,7 +98,7 @@ static const SInfosTableSchema userFuncSchema[] = {
|
||||||
{.name = "name", .bytes = TSDB_FUNC_NAME_LEN - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "name", .bytes = TSDB_FUNC_NAME_LEN - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "comment", .bytes = PATH_MAX - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "comment", .bytes = PATH_MAX - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "aggregate", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "aggregate", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "comment", .bytes = TSDB_TYPE_STR_MAX_LEN - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
{.name = "output_type", .bytes = TSDB_TYPE_STR_MAX_LEN - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR},
|
||||||
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP},
|
||||||
{.name = "code_len", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "code_len", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
{.name = "bufsize", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
{.name = "bufsize", .bytes = 4, .type = TSDB_DATA_TYPE_INT},
|
||||||
|
|
|
@ -133,9 +133,9 @@ OFFSET_DECODE_OVER:
|
||||||
int32_t mndCreateOffsets(STrans *pTrans, const char *cgroup, const char *topicName, const SArray *vgs) {
|
int32_t mndCreateOffsets(STrans *pTrans, const char *cgroup, const char *topicName, const SArray *vgs) {
|
||||||
int32_t sz = taosArrayGetSize(vgs);
|
int32_t sz = taosArrayGetSize(vgs);
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
SMqConsumerEp *pConsumerEp = taosArrayGet(vgs, i);
|
int32_t vgId = *(int32_t *)taosArrayGet(vgs, i);
|
||||||
SMqOffsetObj offsetObj;
|
SMqOffsetObj offsetObj;
|
||||||
if (mndMakePartitionKey(offsetObj.key, cgroup, topicName, pConsumerEp->vgId) < 0) {
|
if (mndMakePartitionKey(offsetObj.key, cgroup, topicName, vgId) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
offsetObj.offset = -1;
|
offsetObj.offset = -1;
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
|
|
||||||
#define SHOW_STEP_SIZE 100
|
#define SHOW_STEP_SIZE 100
|
||||||
|
|
||||||
static SShowObj *mndCreateShowObj(SMnode *pMnode, SShowReq *pReq);
|
static SShowObj *mndCreateShowObj(SMnode *pMnode, SRetrieveTableReq *pReq);
|
||||||
static void mndFreeShowObj(SShowObj *pShow);
|
static void mndFreeShowObj(SShowObj *pShow);
|
||||||
static SShowObj *mndAcquireShowObj(SMnode *pMnode, int64_t showId);
|
static SShowObj *mndAcquireShowObj(SMnode *pMnode, int64_t showId);
|
||||||
static void mndReleaseShowObj(SShowObj *pShow, bool forceRemove);
|
static void mndReleaseShowObj(SShowObj *pShow, bool forceRemove);
|
||||||
|
@ -47,18 +47,80 @@ void mndCleanupShow(SMnode *pMnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static SShowObj *mndCreateShowObj(SMnode *pMnode, SShowReq *pReq) {
|
static int32_t convertToRetrieveType(char* name, int32_t len) {
|
||||||
|
int32_t type = -1;
|
||||||
|
|
||||||
|
if (strncasecmp(name, TSDB_INS_TABLE_DNODES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_DNODE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_MNODES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_MNODE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_MODULES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_MODULE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_QNODES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_QNODE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_BNODES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_BNODE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_SNODES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_SNODE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_CLUSTER, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_CLUSTER;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_DATABASES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_DB;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_FUNCTIONS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_FUNC;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_INDEXES, len) == 0) {
|
||||||
|
// type = TSDB_MGMT_TABLE_INDEX;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_STABLES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_STB;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_STREAMS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_STREAMS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_TABLE;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED, len) == 0) {
|
||||||
|
// type = TSDB_MGMT_TABLE_DIST;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_USERS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_USER;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_LICENCES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_GRANTS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_VGROUPS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_VGROUP;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_TOPICS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_TOPICS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_CONSUMERS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_CONSUMERS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_SUBSCRIBES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_SUBSCRIBES;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_TRANS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_TRANS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_SMAS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_SMAS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_CONFIGS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_CONFIGS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_CONNS, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_CONNS;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_QUERIES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_QUERIES;
|
||||||
|
} else if (strncasecmp(name, TSDB_INS_TABLE_VNODES, len) == 0) {
|
||||||
|
type = TSDB_MGMT_TABLE_VNODES;
|
||||||
|
} else {
|
||||||
|
// ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return type;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SShowObj *mndCreateShowObj(SMnode *pMnode, SRetrieveTableReq *pReq) {
|
||||||
SShowMgmt *pMgmt = &pMnode->showMgmt;
|
SShowMgmt *pMgmt = &pMnode->showMgmt;
|
||||||
|
|
||||||
int64_t showId = atomic_add_fetch_64(&pMgmt->showId, 1);
|
int64_t showId = atomic_add_fetch_64(&pMgmt->showId, 1);
|
||||||
if (showId == 0) atomic_add_fetch_64(&pMgmt->showId, 1);
|
if (showId == 0) atomic_add_fetch_64(&pMgmt->showId, 1);
|
||||||
|
|
||||||
int32_t size = sizeof(SShowObj) + pReq->payloadLen;
|
int32_t size = sizeof(SShowObj);
|
||||||
|
|
||||||
SShowObj showObj = {0};
|
SShowObj showObj = {0};
|
||||||
showObj.id = showId;
|
showObj.id = showId;
|
||||||
showObj.pMnode = pMnode;
|
showObj.pMnode = pMnode;
|
||||||
showObj.type = pReq->type;
|
showObj.type = convertToRetrieveType(pReq->tb, tListLen(pReq->tb));
|
||||||
showObj.payloadLen = pReq->payloadLen;
|
|
||||||
memcpy(showObj.db, pReq->db, TSDB_DB_FNAME_LEN);
|
memcpy(showObj.db, pReq->db, TSDB_DB_FNAME_LEN);
|
||||||
|
|
||||||
int32_t keepTime = tsShellActivityTimer * 6 * 1000;
|
int32_t keepTime = tsShellActivityTimer * 6 * 1000;
|
||||||
|
@ -127,10 +189,6 @@ static int32_t mndProcessRetrieveSysTableReq(SNodeMsg *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (retrieveReq.showId == 0) {
|
if (retrieveReq.showId == 0) {
|
||||||
SShowReq req = {0};
|
|
||||||
req.type = retrieveReq.type;
|
|
||||||
strncpy(req.db, retrieveReq.db, tListLen(req.db));
|
|
||||||
|
|
||||||
STableMetaRsp *pMeta = (STableMetaRsp *)taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb) + 1);
|
STableMetaRsp *pMeta = (STableMetaRsp *)taosHashGet(pMnode->infosMeta, retrieveReq.tb, strlen(retrieveReq.tb) + 1);
|
||||||
if (pMeta == NULL) {
|
if (pMeta == NULL) {
|
||||||
terrno = TSDB_CODE_MND_INVALID_INFOS_TBL;
|
terrno = TSDB_CODE_MND_INVALID_INFOS_TBL;
|
||||||
|
@ -138,7 +196,7 @@ static int32_t mndProcessRetrieveSysTableReq(SNodeMsg *pReq) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pShow = mndCreateShowObj(pMnode, &req);
|
pShow = mndCreateShowObj(pMnode, &retrieveReq);
|
||||||
if (pShow == NULL) {
|
if (pShow == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
mError("failed to process show-meta req since %s", terrstr());
|
mError("failed to process show-meta req since %s", terrstr());
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
#include "mndInfoSchema.h"
|
#include "mndInfoSchema.h"
|
||||||
#include "mndMnode.h"
|
#include "mndMnode.h"
|
||||||
#include "mndPerfSchema.h"
|
#include "mndPerfSchema.h"
|
||||||
|
#include "mndScheduler.h"
|
||||||
#include "mndShow.h"
|
#include "mndShow.h"
|
||||||
#include "mndTrans.h"
|
#include "mndTrans.h"
|
||||||
#include "mndUser.h"
|
#include "mndUser.h"
|
||||||
|
@ -443,6 +444,25 @@ static void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pSt
|
||||||
for (int32_t f = 0; f < pRSmaParam->nFuncIds; ++f) {
|
for (int32_t f = 0; f < pRSmaParam->nFuncIds; ++f) {
|
||||||
*(pRSmaParam->pFuncIds + f) = pStb->aggregationMethod;
|
*(pRSmaParam->pFuncIds + f) = pStb->aggregationMethod;
|
||||||
}
|
}
|
||||||
|
if (pStb->ast1Len > 0) {
|
||||||
|
if (mndConvertRSmaTask(pStb->pAst1, 0, 0, &pRSmaParam->qmsg1, &pRSmaParam->qmsg1Len) != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFreeClear(pRSmaParam->pFuncIds);
|
||||||
|
taosMemoryFreeClear(req.stbCfg.pRSmaParam);
|
||||||
|
taosMemoryFreeClear(req.stbCfg.pSchema);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (pStb->ast2Len > 0) {
|
||||||
|
int32_t qmsgLen2 = 0;
|
||||||
|
if (mndConvertRSmaTask(pStb->pAst2, 0, 0, &pRSmaParam->qmsg2, &pRSmaParam->qmsg2Len) != TSDB_CODE_SUCCESS) {
|
||||||
|
taosMemoryFreeClear(pRSmaParam->pFuncIds);
|
||||||
|
taosMemoryFreeClear(pRSmaParam->qmsg1);
|
||||||
|
taosMemoryFreeClear(req.stbCfg.pRSmaParam);
|
||||||
|
taosMemoryFreeClear(req.stbCfg.pSchema);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
req.stbCfg.pRSmaParam = pRSmaParam;
|
req.stbCfg.pRSmaParam = pRSmaParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -451,6 +471,8 @@ static void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pSt
|
||||||
if (pHead == NULL) {
|
if (pHead == NULL) {
|
||||||
if (pRSmaParam) {
|
if (pRSmaParam) {
|
||||||
taosMemoryFreeClear(pRSmaParam->pFuncIds);
|
taosMemoryFreeClear(pRSmaParam->pFuncIds);
|
||||||
|
taosMemoryFreeClear(pRSmaParam->qmsg1);
|
||||||
|
taosMemoryFreeClear(pRSmaParam->qmsg2);
|
||||||
taosMemoryFreeClear(pRSmaParam);
|
taosMemoryFreeClear(pRSmaParam);
|
||||||
}
|
}
|
||||||
taosMemoryFreeClear(req.stbCfg.pSchema);
|
taosMemoryFreeClear(req.stbCfg.pSchema);
|
||||||
|
@ -467,6 +489,8 @@ static void *mndBuildVCreateStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pSt
|
||||||
*pContLen = contLen;
|
*pContLen = contLen;
|
||||||
if (pRSmaParam) {
|
if (pRSmaParam) {
|
||||||
taosMemoryFreeClear(pRSmaParam->pFuncIds);
|
taosMemoryFreeClear(pRSmaParam->pFuncIds);
|
||||||
|
taosMemoryFreeClear(pRSmaParam->qmsg1);
|
||||||
|
taosMemoryFreeClear(pRSmaParam->qmsg2);
|
||||||
taosMemoryFreeClear(pRSmaParam);
|
taosMemoryFreeClear(pRSmaParam);
|
||||||
}
|
}
|
||||||
taosMemoryFreeClear(req.stbCfg.pSchema);
|
taosMemoryFreeClear(req.stbCfg.pSchema);
|
||||||
|
|
|
@ -46,16 +46,8 @@ static int32_t mndSubActionInsert(SSdb *pSdb, SMqSubscribeObj *);
|
||||||
static int32_t mndSubActionDelete(SSdb *pSdb, SMqSubscribeObj *);
|
static int32_t mndSubActionDelete(SSdb *pSdb, SMqSubscribeObj *);
|
||||||
static int32_t mndSubActionUpdate(SSdb *pSdb, SMqSubscribeObj *pOldSub, SMqSubscribeObj *pNewSub);
|
static int32_t mndSubActionUpdate(SSdb *pSdb, SMqSubscribeObj *pOldSub, SMqSubscribeObj *pNewSub);
|
||||||
|
|
||||||
/*static int32_t mndProcessSubscribeReq(SNodeMsg *pMsg);*/
|
|
||||||
/*static int32_t mndProcessSubscribeRsp(SNodeMsg *pMsg);*/
|
|
||||||
static int32_t mndProcessSubscribeInternalReq(SNodeMsg *pMsg);
|
|
||||||
static int32_t mndProcessSubscribeInternalRsp(SNodeMsg *pMsg);
|
|
||||||
/*static int32_t mndProcessMqTimerMsg(SNodeMsg *pMsg);*/
|
|
||||||
/*static int32_t mndProcessGetSubEpReq(SNodeMsg *pMsg);*/
|
|
||||||
/*static int32_t mndProcessDoRebalanceMsg(SNodeMsg *pMsg);*/
|
|
||||||
/*static int32_t mndProcessResetOffsetReq(SNodeMsg *pMsg);*/
|
|
||||||
|
|
||||||
static int32_t mndProcessRebalanceReq(SNodeMsg *pMsg);
|
static int32_t mndProcessRebalanceReq(SNodeMsg *pMsg);
|
||||||
|
static int32_t mndProcessSubscribeInternalRsp(SNodeMsg *pMsg);
|
||||||
|
|
||||||
static int32_t mndSetSubRedoLogs(SMnode *pMnode, STrans *pTrans, SMqSubscribeObj *pSub) {
|
static int32_t mndSetSubRedoLogs(SMnode *pMnode, STrans *pTrans, SMqSubscribeObj *pSub) {
|
||||||
SSdbRaw *pRedoRaw = mndSubActionEncode(pSub);
|
SSdbRaw *pRedoRaw = mndSubActionEncode(pSub);
|
||||||
|
@ -73,15 +65,6 @@ static int32_t mndSetSubCommitLogs(SMnode *pMnode, STrans *pTrans, SMqSubscribeO
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*static int32_t mndPersistMqSetConnReq(SMnode *pMnode, STrans *pTrans, const SMqTopicObj *pTopic, const char *cgroup,*/
|
|
||||||
/*const SMqConsumerEp *pConsumerEp);*/
|
|
||||||
|
|
||||||
/*static int32_t mndPersistRebalanceMsg(SMnode *pMnode, STrans *pTrans, const SMqConsumerEp *pConsumerEp,*/
|
|
||||||
/*const char *topicName);*/
|
|
||||||
|
|
||||||
/*static int32_t mndPersistCancelConnReq(SMnode *pMnode, STrans *pTrans, const SMqConsumerEp *pConsumerEp,*/
|
|
||||||
/*const char *oldTopicName);*/
|
|
||||||
|
|
||||||
int32_t mndInitSubscribe(SMnode *pMnode) {
|
int32_t mndInitSubscribe(SMnode *pMnode) {
|
||||||
SSdbTable table = {.sdbType = SDB_SUBSCRIBE,
|
SSdbTable table = {.sdbType = SDB_SUBSCRIBE,
|
||||||
.keyType = SDB_KEY_BINARY,
|
.keyType = SDB_KEY_BINARY,
|
||||||
|
@ -91,13 +74,6 @@ int32_t mndInitSubscribe(SMnode *pMnode) {
|
||||||
.updateFp = (SdbUpdateFp)mndSubActionUpdate,
|
.updateFp = (SdbUpdateFp)mndSubActionUpdate,
|
||||||
.deleteFp = (SdbDeleteFp)mndSubActionDelete};
|
.deleteFp = (SdbDeleteFp)mndSubActionDelete};
|
||||||
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_MND_SUBSCRIBE, mndProcessSubscribeReq);*/
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_VND_MQ_SET_CONN_RSP, mndProcessSubscribeInternalRsp);*/
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_VND_MQ_REB_RSP, mndProcessSubscribeInternalRsp);*/
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_VND_MQ_CANCEL_CONN_RSP, mndProcessSubscribeInternalRsp);*/
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_MND_MQ_TIMER, mndProcessMqTimerMsg);*/
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_MND_GET_SUB_EP, mndProcessGetSubEpReq);*/
|
|
||||||
/*mndSetMsgHandle(pMnode, TDMT_MND_MQ_DO_REBALANCE, mndProcessDoRebalanceMsg);*/
|
|
||||||
mndSetMsgHandle(pMnode, TDMT_VND_MQ_VG_CHANGE_RSP, mndProcessSubscribeInternalRsp);
|
mndSetMsgHandle(pMnode, TDMT_VND_MQ_VG_CHANGE_RSP, mndProcessSubscribeInternalRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_MND_MQ_DO_REBALANCE, mndProcessRebalanceReq);
|
mndSetMsgHandle(pMnode, TDMT_MND_MQ_DO_REBALANCE, mndProcessRebalanceReq);
|
||||||
return sdbSetTable(pMnode->pSdb, table);
|
return sdbSetTable(pMnode->pSdb, table);
|
||||||
|
@ -109,6 +85,12 @@ static SMqSubscribeObj *mndCreateSub(SMnode *pMnode, const SMqTopicObj *pTopic,
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
pSub->subType = pTopic->subType;
|
||||||
|
pSub->withTbName = pTopic->withTbName;
|
||||||
|
pSub->withSchema = pTopic->withSchema;
|
||||||
|
pSub->withTag = pTopic->withTag;
|
||||||
|
pSub->withTagSchema = pTopic->withTagSchema;
|
||||||
|
|
||||||
ASSERT(taosHashGetSize(pSub->consumerHash) == 1);
|
ASSERT(taosHashGetSize(pSub->consumerHash) == 1);
|
||||||
|
|
||||||
if (mndSchedInitSubEp(pMnode, pTopic, pSub) < 0) {
|
if (mndSchedInitSubEp(pMnode, pTopic, pSub) < 0) {
|
||||||
|
@ -122,144 +104,19 @@ static SMqSubscribeObj *mndCreateSub(SMnode *pMnode, const SMqTopicObj *pTopic,
|
||||||
return pSub;
|
return pSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscribeObj *pSub,
|
||||||
static SMqSubscribeObj *mndCreateSubscription(SMnode *pMnode, const SMqTopicObj *pTopic, const char *cgroup) {
|
const SMqRebOutputVg *pRebVg) {
|
||||||
SMqSubscribeObj *pSub = tNewSubscribeObj();
|
|
||||||
if (pSub == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
|
||||||
mndMakeSubscribeKey(key, cgroup, pTopic->name);
|
|
||||||
strcpy(pSub->key, key);
|
|
||||||
|
|
||||||
if (mndSchedInitSubEp(pMnode, pTopic, pSub) < 0) {
|
|
||||||
tDeleteSMqSubscribeObj(pSub);
|
|
||||||
taosMemoryFree(pSub);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: disable alter subscribed table
|
|
||||||
return pSub;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t mndBuildRebalanceMsg(void **pBuf, int32_t *pLen, const SMqConsumerEp *pConsumerEp,
|
|
||||||
const char *topicName) {
|
|
||||||
SMqMVRebReq req = {
|
|
||||||
.vgId = pConsumerEp->vgId,
|
|
||||||
.oldConsumerId = pConsumerEp->oldConsumerId,
|
|
||||||
.newConsumerId = pConsumerEp->consumerId,
|
|
||||||
};
|
|
||||||
req.topic = strdup(topicName);
|
|
||||||
|
|
||||||
int32_t tlen = tEncodeSMqMVRebReq(NULL, &req);
|
|
||||||
void *buf = taosMemoryMalloc(sizeof(SMsgHead) + tlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
SMsgHead *pMsgHead = (SMsgHead *)buf;
|
|
||||||
|
|
||||||
pMsgHead->contLen = htonl(sizeof(SMsgHead) + tlen);
|
|
||||||
pMsgHead->vgId = htonl(pConsumerEp->vgId);
|
|
||||||
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
|
||||||
tEncodeSMqMVRebReq(&abuf, &req);
|
|
||||||
taosMemoryFree(req.topic);
|
|
||||||
|
|
||||||
*pBuf = buf;
|
|
||||||
*pLen = tlen;
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t mndPersistRebalanceMsg(SMnode *pMnode, STrans *pTrans, const SMqConsumerEp *pConsumerEp,
|
|
||||||
const char *topicName) {
|
|
||||||
ASSERT(pConsumerEp->oldConsumerId != -1);
|
|
||||||
|
|
||||||
void *buf;
|
|
||||||
int32_t tlen;
|
|
||||||
if (mndBuildRebalanceMsg(&buf, &tlen, pConsumerEp, topicName) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t vgId = pConsumerEp->vgId;
|
|
||||||
SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
|
|
||||||
|
|
||||||
STransAction action = {0};
|
|
||||||
action.epSet = mndGetVgroupEpset(pMnode, pVgObj);
|
|
||||||
action.pCont = buf;
|
|
||||||
action.contLen = sizeof(SMsgHead) + tlen;
|
|
||||||
action.msgType = TDMT_VND_MQ_REB;
|
|
||||||
|
|
||||||
mndReleaseVgroup(pMnode, pVgObj);
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t mndBuildCancelConnReq(void **pBuf, int32_t *pLen, const SMqConsumerEp *pConsumerEp,
|
|
||||||
const char *oldTopicName) {
|
|
||||||
SMqCancelConnReq req = {0};
|
|
||||||
req.consumerId = pConsumerEp->consumerId;
|
|
||||||
req.vgId = pConsumerEp->vgId;
|
|
||||||
req.epoch = pConsumerEp->epoch;
|
|
||||||
strcpy(req.topicName, oldTopicName);
|
|
||||||
|
|
||||||
int32_t tlen = tEncodeSMqCancelConnReq(NULL, &req);
|
|
||||||
void *buf = taosMemoryMalloc(sizeof(SMsgHead) + tlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
SMsgHead *pMsgHead = (SMsgHead *)buf;
|
|
||||||
|
|
||||||
pMsgHead->contLen = htonl(sizeof(SMsgHead) + tlen);
|
|
||||||
pMsgHead->vgId = htonl(pConsumerEp->vgId);
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
|
||||||
tEncodeSMqCancelConnReq(&abuf, &req);
|
|
||||||
*pBuf = buf;
|
|
||||||
*pLen = tlen;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t mndPersistCancelConnReq(SMnode *pMnode, STrans *pTrans, const SMqConsumerEp *pConsumerEp,
|
|
||||||
const char *oldTopicName) {
|
|
||||||
void *buf;
|
|
||||||
int32_t tlen;
|
|
||||||
if (mndBuildCancelConnReq(&buf, &tlen, pConsumerEp, oldTopicName) < 0) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t vgId = pConsumerEp->vgId;
|
|
||||||
SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
|
|
||||||
|
|
||||||
STransAction action = {0};
|
|
||||||
action.epSet = mndGetVgroupEpset(pMnode, pVgObj);
|
|
||||||
action.pCont = buf;
|
|
||||||
action.contLen = sizeof(SMsgHead) + tlen;
|
|
||||||
action.msgType = TDMT_VND_MQ_CANCEL_CONN;
|
|
||||||
|
|
||||||
mndReleaseVgroup(pMnode, pVgObj);
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const char *subKey, const SMqRebOutputVg *pRebVg) {
|
|
||||||
SMqRebVgReq req = {0};
|
SMqRebVgReq req = {0};
|
||||||
req.oldConsumerId = pRebVg->oldConsumerId;
|
req.oldConsumerId = pRebVg->oldConsumerId;
|
||||||
req.newConsumerId = pRebVg->newConsumerId;
|
req.newConsumerId = pRebVg->newConsumerId;
|
||||||
req.vgId = pRebVg->pVgEp->vgId;
|
req.vgId = pRebVg->pVgEp->vgId;
|
||||||
req.qmsg = pRebVg->pVgEp->qmsg;
|
req.qmsg = pRebVg->pVgEp->qmsg;
|
||||||
strncpy(req.subKey, subKey, TSDB_SUBSCRIBE_KEY_LEN);
|
req.subType = pSub->subType;
|
||||||
|
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);
|
int32_t tlen = sizeof(SMsgHead) + tEncodeSMqRebVgReq(NULL, &req);
|
||||||
void *buf = taosMemoryMalloc(tlen);
|
void *buf = taosMemoryMalloc(tlen);
|
||||||
|
@ -280,13 +137,13 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const char *subK
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndPersistSubChangeVgReq(SMnode *pMnode, STrans *pTrans, const char *subKey,
|
static int32_t mndPersistSubChangeVgReq(SMnode *pMnode, STrans *pTrans, const SMqSubscribeObj *pSub,
|
||||||
const SMqRebOutputVg *pRebVg) {
|
const SMqRebOutputVg *pRebVg) {
|
||||||
ASSERT(pRebVg->oldConsumerId != pRebVg->newConsumerId);
|
ASSERT(pRebVg->oldConsumerId != pRebVg->newConsumerId);
|
||||||
|
|
||||||
void *buf;
|
void *buf;
|
||||||
int32_t tlen;
|
int32_t tlen;
|
||||||
if (mndBuildSubChangeReq(&buf, &tlen, subKey, pRebVg) < 0) {
|
if (mndBuildSubChangeReq(&buf, &tlen, pSub, pRebVg) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -307,108 +164,6 @@ static int32_t mndPersistSubChangeVgReq(SMnode *pMnode, STrans *pTrans, const ch
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int32_t mndProcessGetSubEpReq(SNodeMsg *pMsg) {
|
|
||||||
SMnode *pMnode = pMsg->pNode;
|
|
||||||
SMqCMGetSubEpReq *pReq = (SMqCMGetSubEpReq *)pMsg->rpcMsg.pCont;
|
|
||||||
SMqCMGetSubEpRsp rsp = {0};
|
|
||||||
int64_t consumerId = be64toh(pReq->consumerId);
|
|
||||||
int32_t epoch = ntohl(pReq->epoch);
|
|
||||||
|
|
||||||
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMsg->pNode, consumerId);
|
|
||||||
if (pConsumer == NULL) {
|
|
||||||
terrno = TSDB_CODE_MND_CONSUMER_NOT_EXIST;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
// TODO add lock
|
|
||||||
ASSERT(strcmp(pReq->cgroup, pConsumer->cgroup) == 0);
|
|
||||||
int32_t serverEpoch = pConsumer->epoch;
|
|
||||||
|
|
||||||
// TODO
|
|
||||||
int32_t hbStatus = atomic_load_32(&pConsumer->hbStatus);
|
|
||||||
mDebug("consumer %ld epoch(%d) try to get sub ep, server epoch %d, old val: %d", consumerId, epoch, serverEpoch,
|
|
||||||
hbStatus);
|
|
||||||
atomic_store_32(&pConsumer->hbStatus, 0);
|
|
||||||
/*SSdbRaw *pConsumerRaw = mndConsumerActionEncode(pConsumer);*/
|
|
||||||
/*sdbSetRawStatus(pConsumerRaw, SDB_STATUS_READY);*/
|
|
||||||
/*sdbWrite(pMnode->pSdb, pConsumerRaw);*/
|
|
||||||
|
|
||||||
strcpy(rsp.cgroup, pReq->cgroup);
|
|
||||||
if (epoch != serverEpoch) {
|
|
||||||
mInfo("send new assignment to consumer %ld, consumer epoch %d, server epoch %d", pConsumer->consumerId, epoch,
|
|
||||||
serverEpoch);
|
|
||||||
mDebug("consumer %ld try r lock", consumerId);
|
|
||||||
taosRLockLatch(&pConsumer->lock);
|
|
||||||
mDebug("consumer %ld r locked", consumerId);
|
|
||||||
SArray *pTopics = pConsumer->currentTopics;
|
|
||||||
int32_t sz = taosArrayGetSize(pTopics);
|
|
||||||
rsp.topics = taosArrayInit(sz, sizeof(SMqSubTopicEp));
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char *topicName = taosArrayGetP(pTopics, i);
|
|
||||||
SMqSubscribeObj *pSub = mndAcquireSubscribe(pMnode, pConsumer->cgroup, topicName);
|
|
||||||
ASSERT(pSub);
|
|
||||||
int32_t csz = taosArrayGetSize(pSub->consumers);
|
|
||||||
// TODO: change to bsearch
|
|
||||||
for (int32_t j = 0; j < csz; j++) {
|
|
||||||
SMqSubConsumer *pSubConsumer = taosArrayGet(pSub->consumers, j);
|
|
||||||
if (consumerId == pSubConsumer->consumerId) {
|
|
||||||
int32_t vgsz = taosArrayGetSize(pSubConsumer->vgInfo);
|
|
||||||
mInfo("topic %s has %d vg", topicName, serverEpoch);
|
|
||||||
|
|
||||||
SMqSubTopicEp topicEp;
|
|
||||||
strcpy(topicEp.topic, topicName);
|
|
||||||
|
|
||||||
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, topicName);
|
|
||||||
ASSERT(pTopic != NULL);
|
|
||||||
topicEp.schema = pTopic->schema;
|
|
||||||
mndReleaseTopic(pMnode, pTopic);
|
|
||||||
|
|
||||||
topicEp.vgs = taosArrayInit(vgsz, sizeof(SMqSubVgEp));
|
|
||||||
for (int32_t k = 0; k < vgsz; k++) {
|
|
||||||
char offsetKey[TSDB_PARTITION_KEY_LEN];
|
|
||||||
SMqConsumerEp *pConsumerEp = taosArrayGet(pSubConsumer->vgInfo, k);
|
|
||||||
SMqSubVgEp vgEp = {
|
|
||||||
.epSet = pConsumerEp->epSet,
|
|
||||||
.vgId = pConsumerEp->vgId,
|
|
||||||
.offset = -1,
|
|
||||||
};
|
|
||||||
mndMakePartitionKey(offsetKey, pConsumer->cgroup, topicName, pConsumerEp->vgId);
|
|
||||||
SMqOffsetObj *pOffsetObj = mndAcquireOffset(pMnode, offsetKey);
|
|
||||||
if (pOffsetObj != NULL) {
|
|
||||||
vgEp.offset = pOffsetObj->offset;
|
|
||||||
mndReleaseOffset(pMnode, pOffsetObj);
|
|
||||||
}
|
|
||||||
taosArrayPush(topicEp.vgs, &vgEp);
|
|
||||||
}
|
|
||||||
taosArrayPush(rsp.topics, &topicEp);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mndReleaseSubscribe(pMnode, pSub);
|
|
||||||
}
|
|
||||||
taosRUnLockLatch(&pConsumer->lock);
|
|
||||||
mDebug("consumer %ld r unlock", consumerId);
|
|
||||||
}
|
|
||||||
int32_t tlen = sizeof(SMqRspHead) + tEncodeSMqCMGetSubEpRsp(NULL, &rsp);
|
|
||||||
void *buf = rpcMallocCont(tlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
((SMqRspHead *)buf)->mqMsgType = TMQ_MSG_TYPE__EP_RSP;
|
|
||||||
((SMqRspHead *)buf)->epoch = serverEpoch;
|
|
||||||
((SMqRspHead *)buf)->consumerId = pConsumer->consumerId;
|
|
||||||
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
|
||||||
tEncodeSMqCMGetSubEpRsp(&abuf, &rsp);
|
|
||||||
tDeleteSMqCMGetSubEpRsp(&rsp);
|
|
||||||
mndReleaseConsumer(pMnode, pConsumer);
|
|
||||||
pMsg->pRsp = buf;
|
|
||||||
pMsg->rspLen = tlen;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int32_t mndSplitSubscribeKey(const char *key, char *topic, char *cgroup) {
|
static int32_t mndSplitSubscribeKey(const char *key, char *topic, char *cgroup) {
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
while (key[i] != TMQ_SEPARATOR) {
|
while (key[i] != TMQ_SEPARATOR) {
|
||||||
|
@ -433,235 +188,6 @@ static SMqRebSubscribe *mndGetOrCreateRebSub(SHashObj *pHash, const char *key) {
|
||||||
return pRebSub;
|
return pRebSub;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int32_t mndProcessMqTimerMsg(SNodeMsg *pMsg) {
|
|
||||||
SMnode *pMnode = pMsg->pNode;
|
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
|
||||||
SMqConsumerObj *pConsumer;
|
|
||||||
void *pIter = NULL;
|
|
||||||
SMqDoRebalanceMsg *pRebMsg = rpcMallocCont(sizeof(SMqDoRebalanceMsg));
|
|
||||||
pRebMsg->rebSubHash = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
pIter = sdbFetch(pSdb, SDB_CONSUMER, pIter, (void **)&pConsumer);
|
|
||||||
if (pIter == NULL) break;
|
|
||||||
int32_t hbStatus = atomic_add_fetch_32(&pConsumer->hbStatus, 1);
|
|
||||||
if (hbStatus > MND_SUBSCRIBE_REBALANCE_CNT) {
|
|
||||||
int32_t old =
|
|
||||||
atomic_val_compare_exchange_32(&pConsumer->status, MQ_CONSUMER_STATUS__ACTIVE, MQ_CONSUMER_STATUS__LOST);
|
|
||||||
if (old == MQ_CONSUMER_STATUS__ACTIVE) {
|
|
||||||
// get all topics of that topic
|
|
||||||
int32_t sz = taosArrayGetSize(pConsumer->currentTopics);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char *topic = taosArrayGetP(pConsumer->currentTopics, i);
|
|
||||||
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
|
||||||
mndMakeSubscribeKey(key, pConsumer->cgroup, topic);
|
|
||||||
SMqRebSubscribe *pRebSub = mndGetOrCreateRebSub(pRebMsg->rebSubHash, key);
|
|
||||||
taosArrayPush(pRebSub->lostConsumers, &pConsumer->consumerId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
int32_t status = atomic_load_32(&pConsumer->status);
|
|
||||||
if (status == MQ_CONSUMER_STATUS__INIT || status == MQ_CONSUMER_STATUS__MODIFY) {
|
|
||||||
SArray *rebSubs;
|
|
||||||
if (status == MQ_CONSUMER_STATUS__INIT) {
|
|
||||||
rebSubs = pConsumer->currentTopics;
|
|
||||||
} else {
|
|
||||||
rebSubs = pConsumer->recentRemovedTopics;
|
|
||||||
}
|
|
||||||
int32_t sz = taosArrayGetSize(rebSubs);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
char *topic = taosArrayGetP(rebSubs, i);
|
|
||||||
char key[TSDB_SUBSCRIBE_KEY_LEN];
|
|
||||||
mndMakeSubscribeKey(key, pConsumer->cgroup, topic);
|
|
||||||
SMqRebSubscribe *pRebSub = mndGetOrCreateRebSub(pRebMsg->rebSubHash, key);
|
|
||||||
if (status == MQ_CONSUMER_STATUS__INIT) {
|
|
||||||
taosArrayPush(pRebSub->newConsumers, &pConsumer->consumerId);
|
|
||||||
} else if (status == MQ_CONSUMER_STATUS__MODIFY) {
|
|
||||||
taosArrayPush(pRebSub->removedConsumers, &pConsumer->consumerId);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (status == MQ_CONSUMER_STATUS__MODIFY) {
|
|
||||||
int32_t removeSz = taosArrayGetSize(pConsumer->recentRemovedTopics);
|
|
||||||
for (int32_t i = 0; i < removeSz; i++) {
|
|
||||||
char *topicName = taosArrayGetP(pConsumer->recentRemovedTopics, i);
|
|
||||||
taosMemoryFree(topicName);
|
|
||||||
}
|
|
||||||
taosArrayClear(pConsumer->recentRemovedTopics);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (taosHashGetSize(pRebMsg->rebSubHash) != 0) {
|
|
||||||
mInfo("mq rebalance will be triggered");
|
|
||||||
SRpcMsg rpcMsg = {
|
|
||||||
.msgType = TDMT_MND_MQ_DO_REBALANCE,
|
|
||||||
.pCont = pRebMsg,
|
|
||||||
.contLen = sizeof(SMqDoRebalanceMsg),
|
|
||||||
};
|
|
||||||
tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
|
|
||||||
} else {
|
|
||||||
taosHashCleanup(pRebMsg->rebSubHash);
|
|
||||||
rpcFreeCont(pRebMsg);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int32_t mndProcessDoRebalanceMsg(SNodeMsg *pMsg) {
|
|
||||||
SMnode *pMnode = pMsg->pNode;
|
|
||||||
SMqDoRebalanceMsg *pReq = pMsg->rpcMsg.pCont;
|
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_TYPE_REBALANCE, &pMsg->rpcMsg);
|
|
||||||
void *pIter = NULL;
|
|
||||||
|
|
||||||
mInfo("mq rebalance start");
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
pIter = taosHashIterate(pReq->rebSubHash, pIter);
|
|
||||||
if (pIter == NULL) break;
|
|
||||||
SMqRebSubscribe *pRebSub = (SMqRebSubscribe *)pIter;
|
|
||||||
SMqSubscribeObj *pSub = mndAcquireSubscribeByKey(pMnode, pRebSub->key);
|
|
||||||
|
|
||||||
mInfo("mq rebalance subscription: %s, vgNum: %d, unassignedVg: %d", pSub->key, pSub->vgNum,
|
|
||||||
(int32_t)taosArrayGetSize(pSub->unassignedVg));
|
|
||||||
|
|
||||||
// remove lost consumer
|
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pRebSub->lostConsumers); i++) {
|
|
||||||
int64_t lostConsumerId = *(int64_t *)taosArrayGet(pRebSub->lostConsumers, i);
|
|
||||||
|
|
||||||
mInfo("mq remove lost consumer %" PRId64 "", lostConsumerId);
|
|
||||||
|
|
||||||
for (int32_t j = 0; j < taosArrayGetSize(pSub->consumers); j++) {
|
|
||||||
SMqSubConsumer *pSubConsumer = taosArrayGet(pSub->consumers, j);
|
|
||||||
if (pSubConsumer->consumerId == lostConsumerId) {
|
|
||||||
taosArrayAddAll(pSub->unassignedVg, pSubConsumer->vgInfo);
|
|
||||||
taosArrayPush(pSub->lostConsumers, pSubConsumer);
|
|
||||||
taosArrayRemove(pSub->consumers, j);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// calculate rebalance
|
|
||||||
int32_t consumerNum = taosArrayGetSize(pSub->consumers);
|
|
||||||
if (consumerNum != 0) {
|
|
||||||
int32_t vgNum = pSub->vgNum;
|
|
||||||
int32_t vgEachConsumer = vgNum / consumerNum;
|
|
||||||
int32_t imbalanceVg = vgNum % consumerNum;
|
|
||||||
|
|
||||||
// iterate all consumers, set unassignedVgStash
|
|
||||||
for (int32_t i = 0; i < consumerNum; i++) {
|
|
||||||
SMqSubConsumer *pSubConsumer = taosArrayGet(pSub->consumers, i);
|
|
||||||
int32_t vgThisConsumerBeforeRb = taosArrayGetSize(pSubConsumer->vgInfo);
|
|
||||||
int32_t vgThisConsumerAfterRb;
|
|
||||||
if (i < imbalanceVg)
|
|
||||||
vgThisConsumerAfterRb = vgEachConsumer + 1;
|
|
||||||
else
|
|
||||||
vgThisConsumerAfterRb = vgEachConsumer;
|
|
||||||
|
|
||||||
mInfo("mq consumer:%" PRId64 ", connectted vgroup number change from %d to %d", pSubConsumer->consumerId,
|
|
||||||
vgThisConsumerBeforeRb, vgThisConsumerAfterRb);
|
|
||||||
|
|
||||||
while (taosArrayGetSize(pSubConsumer->vgInfo) > vgThisConsumerAfterRb) {
|
|
||||||
SMqConsumerEp *pConsumerEp = taosArrayPop(pSubConsumer->vgInfo);
|
|
||||||
ASSERT(pConsumerEp != NULL);
|
|
||||||
ASSERT(pConsumerEp->consumerId == pSubConsumer->consumerId);
|
|
||||||
taosArrayPush(pSub->unassignedVg, pConsumerEp);
|
|
||||||
mDebug("mq rebalance: vg %d push to unassignedVg", pConsumerEp->vgId);
|
|
||||||
}
|
|
||||||
|
|
||||||
SMqConsumerObj *pRebConsumer = mndAcquireConsumer(pMnode, pSubConsumer->consumerId);
|
|
||||||
mDebug("consumer %ld try w lock", pRebConsumer->consumerId);
|
|
||||||
taosWLockLatch(&pRebConsumer->lock);
|
|
||||||
mDebug("consumer %ld w locked", pRebConsumer->consumerId);
|
|
||||||
int32_t status = atomic_load_32(&pRebConsumer->status);
|
|
||||||
if (vgThisConsumerAfterRb != vgThisConsumerBeforeRb ||
|
|
||||||
(vgThisConsumerAfterRb != 0 && status != MQ_CONSUMER_STATUS__ACTIVE) ||
|
|
||||||
(vgThisConsumerAfterRb == 0 && status != MQ_CONSUMER_STATUS__LOST)) {
|
|
||||||
/*if (vgThisConsumerAfterRb != vgThisConsumerBeforeRb) {*/
|
|
||||||
/*pRebConsumer->epoch++;*/
|
|
||||||
/*}*/
|
|
||||||
if (vgThisConsumerAfterRb != 0) {
|
|
||||||
atomic_store_32(&pRebConsumer->status, MQ_CONSUMER_STATUS__ACTIVE);
|
|
||||||
} else {
|
|
||||||
atomic_store_32(&pRebConsumer->status, MQ_CONSUMER_STATUS__IDLE);
|
|
||||||
}
|
|
||||||
|
|
||||||
mInfo("mq consumer:%" PRId64 ", status change from %d to %d", pRebConsumer->consumerId, status,
|
|
||||||
pRebConsumer->status);
|
|
||||||
|
|
||||||
SSdbRaw *pConsumerRaw = mndConsumerActionEncode(pRebConsumer);
|
|
||||||
sdbSetRawStatus(pConsumerRaw, SDB_STATUS_READY);
|
|
||||||
mndTransAppendCommitlog(pTrans, pConsumerRaw);
|
|
||||||
}
|
|
||||||
taosWUnLockLatch(&pRebConsumer->lock);
|
|
||||||
mDebug("consumer %ld w unlock", pRebConsumer->consumerId);
|
|
||||||
mndReleaseConsumer(pMnode, pRebConsumer);
|
|
||||||
}
|
|
||||||
|
|
||||||
// assign to vgroup
|
|
||||||
if (taosArrayGetSize(pSub->unassignedVg) != 0) {
|
|
||||||
for (int32_t i = 0; i < consumerNum; i++) {
|
|
||||||
SMqSubConsumer *pSubConsumer = taosArrayGet(pSub->consumers, i);
|
|
||||||
int32_t vgThisConsumerAfterRb;
|
|
||||||
if (i < imbalanceVg)
|
|
||||||
vgThisConsumerAfterRb = vgEachConsumer + 1;
|
|
||||||
else
|
|
||||||
vgThisConsumerAfterRb = vgEachConsumer;
|
|
||||||
|
|
||||||
while (taosArrayGetSize(pSubConsumer->vgInfo) < vgThisConsumerAfterRb) {
|
|
||||||
SMqConsumerEp *pConsumerEp = taosArrayPop(pSub->unassignedVg);
|
|
||||||
mDebug("mq rebalance: vg %d pop from unassignedVg", pConsumerEp->vgId);
|
|
||||||
ASSERT(pConsumerEp != NULL);
|
|
||||||
|
|
||||||
pConsumerEp->oldConsumerId = pConsumerEp->consumerId;
|
|
||||||
pConsumerEp->consumerId = pSubConsumer->consumerId;
|
|
||||||
// TODO
|
|
||||||
pConsumerEp->epoch = 0;
|
|
||||||
taosArrayPush(pSubConsumer->vgInfo, pConsumerEp);
|
|
||||||
|
|
||||||
char topic[TSDB_TOPIC_FNAME_LEN];
|
|
||||||
char cgroup[TSDB_CGROUP_LEN];
|
|
||||||
mndSplitSubscribeKey(pSub->key, topic, cgroup);
|
|
||||||
if (pConsumerEp->oldConsumerId == -1) {
|
|
||||||
SMqTopicObj *pTopic = mndAcquireTopic(pMnode, topic);
|
|
||||||
|
|
||||||
mInfo("mq set conn: assign vgroup %d of topic %s to consumer %" PRId64 " cgroup: %s", pConsumerEp->vgId,
|
|
||||||
topic, pConsumerEp->consumerId, cgroup);
|
|
||||||
|
|
||||||
mndPersistMqSetConnReq(pMnode, pTrans, pTopic, cgroup, pConsumerEp);
|
|
||||||
mndReleaseTopic(pMnode, pTopic);
|
|
||||||
} else {
|
|
||||||
mInfo("mq rebalance: assign vgroup %d, from consumer %" PRId64 " to consumer %" PRId64 "",
|
|
||||||
pConsumerEp->vgId, pConsumerEp->oldConsumerId, pConsumerEp->consumerId);
|
|
||||||
|
|
||||||
mndPersistRebalanceMsg(pMnode, pTrans, pConsumerEp, topic);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
ASSERT(taosArrayGetSize(pSub->unassignedVg) == 0);
|
|
||||||
|
|
||||||
// TODO: log rebalance statistics
|
|
||||||
SSdbRaw *pSubRaw = mndSubActionEncode(pSub);
|
|
||||||
sdbSetRawStatus(pSubRaw, SDB_STATUS_READY);
|
|
||||||
mndTransAppendRedolog(pTrans, pSubRaw);
|
|
||||||
}
|
|
||||||
mndReleaseSubscribe(pMnode, pSub);
|
|
||||||
}
|
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) {
|
|
||||||
mError("mq-rebalance-trans:%d, failed to prepare since %s", pTrans->id, terrstr());
|
|
||||||
taosHashCleanup(pReq->rebSubHash);
|
|
||||||
mndTransDrop(pTrans);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
taosHashCleanup(pReq->rebSubHash);
|
|
||||||
mndTransDrop(pTrans);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqRebOutputObj *pOutput) {
|
static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqRebOutputObj *pOutput) {
|
||||||
if (pInput->pTopic != NULL) {
|
if (pInput->pTopic != NULL) {
|
||||||
// create subscribe
|
// create subscribe
|
||||||
|
@ -825,36 +351,6 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
|
||||||
pRebVg->newConsumerId = pEpInSub->consumerId;
|
pRebVg->newConsumerId = pEpInSub->consumerId;
|
||||||
taosArrayPush(pOutput->rebVgs, pRebVg);
|
taosArrayPush(pOutput->rebVgs, pRebVg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
/*int32_t consumerVgNum = taosArrayGetSize(pEpInSub->vgs);*/
|
|
||||||
if (imbCnt < imbConsumerNum) {
|
|
||||||
imbCnt++;
|
|
||||||
// push until equal minVg + 1
|
|
||||||
while (taosArrayGetSize(pEpInSub->vgs) < minVgCnt + 1) {
|
|
||||||
// iter hash and find one vg
|
|
||||||
pRemovedIter = taosHashIterate(pHash, pRemovedIter);
|
|
||||||
ASSERT(pRemovedIter);
|
|
||||||
pRebVg = (SMqRebOutputVg *)pRemovedIter;
|
|
||||||
// push
|
|
||||||
taosArrayPush(pEpInSub->vgs, &pRebVg->pVgEp);
|
|
||||||
pRebVg->newConsumerId = pEpInSub->consumerId;
|
|
||||||
taosArrayPush(pOutput->rebVgs, pRebVg);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// push until equal minVg
|
|
||||||
while (taosArrayGetSize(pEpInSub->vgs) < minVgCnt) {
|
|
||||||
// iter hash and find one vg
|
|
||||||
pRemovedIter = taosHashIterate(pHash, pRemovedIter);
|
|
||||||
ASSERT(pRemovedIter);
|
|
||||||
pRebVg = (SMqRebOutputVg *)pRemovedIter;
|
|
||||||
// push
|
|
||||||
taosArrayPush(pEpInSub->vgs, &pRebVg->pVgEp);
|
|
||||||
pRebVg->newConsumerId = pEpInSub->consumerId;
|
|
||||||
taosArrayPush(pOutput->rebVgs, pRebVg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 7. handle unassigned vg
|
// 7. handle unassigned vg
|
||||||
|
@ -911,7 +407,7 @@ static int32_t mndPersistRebResult(SMnode *pMnode, SNodeMsg *pMsg, const SMqRebO
|
||||||
int32_t vgNum = taosArrayGetSize(rebVgs);
|
int32_t vgNum = taosArrayGetSize(rebVgs);
|
||||||
for (int32_t i = 0; i < vgNum; i++) {
|
for (int32_t i = 0; i < vgNum; i++) {
|
||||||
SMqRebOutputVg *pRebVg = taosArrayGet(rebVgs, i);
|
SMqRebOutputVg *pRebVg = taosArrayGet(rebVgs, i);
|
||||||
if (mndPersistSubChangeVgReq(pMnode, pTrans, pOutput->pSub->key, pRebVg) < 0) {
|
if (mndPersistSubChangeVgReq(pMnode, pTrans, pOutput->pSub, pRebVg) < 0) {
|
||||||
goto REB_FAIL;
|
goto REB_FAIL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1040,52 +536,6 @@ static int32_t mndProcessRebalanceReq(SNodeMsg *pMsg) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndPersistMqSetConnReq(SMnode *pMnode, STrans *pTrans, const SMqTopicObj *pTopic, const char *cgroup,
|
|
||||||
const SMqConsumerEp *pConsumerEp) {
|
|
||||||
ASSERT(pConsumerEp->oldConsumerId == -1);
|
|
||||||
int32_t vgId = pConsumerEp->vgId;
|
|
||||||
|
|
||||||
SMqSetCVgReq req = {
|
|
||||||
.vgId = vgId,
|
|
||||||
.consumerId = pConsumerEp->consumerId,
|
|
||||||
.sql = pTopic->sql,
|
|
||||||
.physicalPlan = pTopic->physicalPlan,
|
|
||||||
.qmsg = pConsumerEp->qmsg,
|
|
||||||
};
|
|
||||||
|
|
||||||
strcpy(req.cgroup, cgroup);
|
|
||||||
strcpy(req.topicName, pTopic->name);
|
|
||||||
int32_t tlen = tEncodeSMqSetCVgReq(NULL, &req);
|
|
||||||
void *buf = taosMemoryMalloc(sizeof(SMsgHead) + tlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMsgHead *pMsgHead = (SMsgHead *)buf;
|
|
||||||
|
|
||||||
pMsgHead->contLen = htonl(sizeof(SMsgHead) + tlen);
|
|
||||||
pMsgHead->vgId = htonl(vgId);
|
|
||||||
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
|
||||||
tEncodeSMqSetCVgReq(&abuf, &req);
|
|
||||||
|
|
||||||
SVgObj *pVgObj = mndAcquireVgroup(pMnode, vgId);
|
|
||||||
|
|
||||||
STransAction action = {0};
|
|
||||||
action.epSet = mndGetVgroupEpset(pMnode, pVgObj);
|
|
||||||
action.pCont = buf;
|
|
||||||
action.contLen = sizeof(SMsgHead) + tlen;
|
|
||||||
action.msgType = TDMT_VND_MQ_SET_CONN;
|
|
||||||
|
|
||||||
mndReleaseVgroup(pMnode, pVgObj);
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(buf);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mndCleanupSubscribe(SMnode *pMnode) {}
|
void mndCleanupSubscribe(SMnode *pMnode) {}
|
||||||
|
|
||||||
static SSdbRaw *mndSubActionEncode(SMqSubscribeObj *pSub) {
|
static SSdbRaw *mndSubActionEncode(SMqSubscribeObj *pSub) {
|
||||||
|
|
|
@ -76,7 +76,13 @@ SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic) {
|
||||||
SDB_SET_INT64(pRaw, dataPos, pTopic->updateTime, TOPIC_ENCODE_OVER);
|
SDB_SET_INT64(pRaw, dataPos, pTopic->updateTime, TOPIC_ENCODE_OVER);
|
||||||
SDB_SET_INT64(pRaw, dataPos, pTopic->uid, TOPIC_ENCODE_OVER);
|
SDB_SET_INT64(pRaw, dataPos, pTopic->uid, TOPIC_ENCODE_OVER);
|
||||||
SDB_SET_INT64(pRaw, dataPos, pTopic->dbUid, TOPIC_ENCODE_OVER);
|
SDB_SET_INT64(pRaw, dataPos, pTopic->dbUid, TOPIC_ENCODE_OVER);
|
||||||
|
SDB_SET_INT64(pRaw, dataPos, pTopic->subDbUid, TOPIC_ENCODE_OVER);
|
||||||
SDB_SET_INT32(pRaw, dataPos, pTopic->version, TOPIC_ENCODE_OVER);
|
SDB_SET_INT32(pRaw, dataPos, pTopic->version, TOPIC_ENCODE_OVER);
|
||||||
|
SDB_SET_INT8(pRaw, dataPos, pTopic->subType, TOPIC_ENCODE_OVER);
|
||||||
|
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_INT32(pRaw, dataPos, pTopic->sqlLen, TOPIC_ENCODE_OVER);
|
||||||
SDB_SET_BINARY(pRaw, dataPos, pTopic->sql, 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);
|
SDB_SET_INT32(pRaw, dataPos, pTopic->astLen, TOPIC_ENCODE_OVER);
|
||||||
|
@ -134,7 +140,13 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pTopic->updateTime, TOPIC_DECODE_OVER);
|
SDB_GET_INT64(pRaw, dataPos, &pTopic->updateTime, TOPIC_DECODE_OVER);
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pTopic->uid, TOPIC_DECODE_OVER);
|
SDB_GET_INT64(pRaw, dataPos, &pTopic->uid, TOPIC_DECODE_OVER);
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pTopic->dbUid, TOPIC_DECODE_OVER);
|
SDB_GET_INT64(pRaw, dataPos, &pTopic->dbUid, TOPIC_DECODE_OVER);
|
||||||
|
SDB_GET_INT64(pRaw, dataPos, &pTopic->subDbUid, TOPIC_DECODE_OVER);
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pTopic->version, TOPIC_DECODE_OVER);
|
SDB_GET_INT32(pRaw, dataPos, &pTopic->version, TOPIC_DECODE_OVER);
|
||||||
|
SDB_GET_INT8(pRaw, dataPos, &pTopic->subType, TOPIC_DECODE_OVER);
|
||||||
|
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);
|
SDB_GET_INT32(pRaw, dataPos, &pTopic->sqlLen, TOPIC_DECODE_OVER);
|
||||||
pTopic->sql = taosMemoryCalloc(pTopic->sqlLen, sizeof(char));
|
pTopic->sql = taosMemoryCalloc(pTopic->sqlLen, sizeof(char));
|
||||||
|
@ -254,34 +266,14 @@ static int32_t mndCheckCreateTopicReq(SCMCreateTopicReq *pCreate) {
|
||||||
terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
|
terrno = TSDB_CODE_MND_INVALID_TOPIC_OPTION;
|
||||||
return -1;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
static int32_t mndGetPlanString(const SCMCreateTopicReq *pCreate, char **pStr) {
|
|
||||||
if (NULL == pCreate->ast) {
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
SNode *pAst = NULL;
|
|
||||||
int32_t code = nodesStringToNode(pCreate->ast, &pAst);
|
|
||||||
|
|
||||||
SQueryPlan *pPlan = NULL;
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
SPlanContext cxt = {.pAstRoot = pAst, .topicQuery = true};
|
|
||||||
code = qCreateQueryPlan(&cxt, &pPlan, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = nodesNodeToString(pPlan, false, pStr, NULL);
|
|
||||||
}
|
|
||||||
nodesDestroyNode(pAst);
|
|
||||||
nodesDestroyNode(pPlan);
|
|
||||||
terrno = code;
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
static int32_t mndCreateTopic(SMnode *pMnode, SNodeMsg *pReq, SCMCreateTopicReq *pCreate, SDbObj *pDb) {
|
static int32_t mndCreateTopic(SMnode *pMnode, SNodeMsg *pReq, SCMCreateTopicReq *pCreate, SDbObj *pDb) {
|
||||||
mDebug("topic:%s to create", pCreate->name);
|
mDebug("topic:%s to create", pCreate->name);
|
||||||
SMqTopicObj topicObj = {0};
|
SMqTopicObj topicObj = {0};
|
||||||
|
@ -297,28 +289,38 @@ static int32_t mndCreateTopic(SMnode *pMnode, SNodeMsg *pReq, SCMCreateTopicReq
|
||||||
topicObj.ast = strdup(pCreate->ast);
|
topicObj.ast = strdup(pCreate->ast);
|
||||||
topicObj.astLen = strlen(pCreate->ast) + 1;
|
topicObj.astLen = strlen(pCreate->ast) + 1;
|
||||||
|
|
||||||
SNode *pAst = NULL;
|
if (pCreate->ast && pCreate->ast[0]) {
|
||||||
if (nodesStringToNode(pCreate->ast, &pAst) != 0) {
|
topicObj.subType = TOPIC_SUB_TYPE__TABLE;
|
||||||
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
topicObj.withTbName = 0;
|
||||||
return -1;
|
topicObj.withSchema = 0;
|
||||||
}
|
|
||||||
|
|
||||||
SQueryPlan *pPlan = NULL;
|
SNode *pAst = NULL;
|
||||||
|
if (nodesStringToNode(pCreate->ast, &pAst) != 0) {
|
||||||
|
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SPlanContext cxt = {.pAstRoot = pAst, .topicQuery = true};
|
SQueryPlan *pPlan = NULL;
|
||||||
if (qCreateQueryPlan(&cxt, &pPlan, NULL) != 0) {
|
|
||||||
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (qExtractResultSchema(pAst, &topicObj.schema.nCols, &topicObj.schema.pSchema) != 0) {
|
SPlanContext cxt = {.pAstRoot = pAst, .topicQuery = true};
|
||||||
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
if (qCreateQueryPlan(&cxt, &pPlan, NULL) != 0) {
|
||||||
return -1;
|
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
||||||
}
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
if (nodesNodeToString(pPlan, false, &topicObj.physicalPlan, NULL) != 0) {
|
if (qExtractResultSchema(pAst, &topicObj.schema.nCols, &topicObj.schema.pSchema) != 0) {
|
||||||
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodesNodeToString(pPlan, false, &topicObj.physicalPlan, NULL) != 0) {
|
||||||
|
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
topicObj.subType = TOPIC_SUB_TYPE__DB;
|
||||||
|
topicObj.withTbName = 1;
|
||||||
|
topicObj.withSchema = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_TOPIC, &pReq->rpcMsg);
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_TYPE_CREATE_TOPIC, &pReq->rpcMsg);
|
||||||
|
|
|
@ -240,7 +240,7 @@ TEST_F(MndTestFunc, 03_Retrieve_Func) {
|
||||||
|
|
||||||
SRpcMsg* pRsp = test.SendReq(TDMT_MND_RETRIEVE_FUNC, pReq, contLen);
|
SRpcMsg* pRsp = test.SendReq(TDMT_MND_RETRIEVE_FUNC, pReq, contLen);
|
||||||
ASSERT_NE(pRsp, nullptr);
|
ASSERT_NE(pRsp, nullptr);
|
||||||
ASSERT_EQ(pRsp->code, TSDB_CODE_MND_INVALID_FUNC);
|
ASSERT_EQ(pRsp->code, TSDB_CODE_MND_FUNC_NOT_EXIST);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -371,7 +371,7 @@ TEST_F(MndTestFunc, 03_Retrieve_Func) {
|
||||||
|
|
||||||
SRpcMsg* pRsp = test.SendReq(TDMT_MND_RETRIEVE_FUNC, pReq, contLen);
|
SRpcMsg* pRsp = test.SendReq(TDMT_MND_RETRIEVE_FUNC, pReq, contLen);
|
||||||
ASSERT_NE(pRsp, nullptr);
|
ASSERT_NE(pRsp, nullptr);
|
||||||
ASSERT_EQ(pRsp->code, TSDB_CODE_MND_INVALID_FUNC);
|
ASSERT_EQ(pRsp->code, TSDB_CODE_MND_FUNC_NOT_EXIST);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ TEST_F(MndTestShow, 01_ShowMsg_InvalidMsgMax) {
|
||||||
|
|
||||||
SRpcMsg* pRsp = test.SendReq(TDMT_MND_SYSTABLE_RETRIEVE, pReq, contLen);
|
SRpcMsg* pRsp = test.SendReq(TDMT_MND_SYSTABLE_RETRIEVE, pReq, contLen);
|
||||||
ASSERT_NE(pRsp, nullptr);
|
ASSERT_NE(pRsp, nullptr);
|
||||||
ASSERT_EQ(pRsp->code, TSDB_CODE_INVALID_MSG);
|
ASSERT_NE(pRsp->code, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(MndTestShow, 02_ShowMsg_InvalidMsgStart) {
|
TEST_F(MndTestShow, 02_ShowMsg_InvalidMsgStart) {
|
||||||
|
@ -50,7 +50,7 @@ TEST_F(MndTestShow, 02_ShowMsg_InvalidMsgStart) {
|
||||||
|
|
||||||
SRpcMsg* pRsp = test.SendReq(TDMT_MND_SYSTABLE_RETRIEVE, pReq, contLen);
|
SRpcMsg* pRsp = test.SendReq(TDMT_MND_SYSTABLE_RETRIEVE, pReq, contLen);
|
||||||
ASSERT_NE(pRsp, nullptr);
|
ASSERT_NE(pRsp, nullptr);
|
||||||
ASSERT_EQ(pRsp->code, TSDB_CODE_INVALID_MSG);
|
ASSERT_NE(pRsp->code, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F(MndTestShow, 03_ShowMsg_Conn) {
|
TEST_F(MndTestShow, 03_ShowMsg_Conn) {
|
||||||
|
|
|
@ -391,6 +391,7 @@ struct SReadH {
|
||||||
#define TSDB_READ_REPO_ID(rh) REPO_ID(TSDB_READ_REPO(rh))
|
#define TSDB_READ_REPO_ID(rh) REPO_ID(TSDB_READ_REPO(rh))
|
||||||
#define TSDB_READ_FSET(rh) (&((rh)->rSet))
|
#define TSDB_READ_FSET(rh) (&((rh)->rSet))
|
||||||
#define TSDB_READ_TABLE(rh) ((rh)->pTable)
|
#define TSDB_READ_TABLE(rh) ((rh)->pTable)
|
||||||
|
#define TSDB_READ_TABLE_UID(rh) ((rh)->pTable->uid)
|
||||||
#define TSDB_READ_HEAD_FILE(rh) TSDB_DFILE_IN_SET(TSDB_READ_FSET(rh), TSDB_FILE_HEAD)
|
#define TSDB_READ_HEAD_FILE(rh) TSDB_DFILE_IN_SET(TSDB_READ_FSET(rh), TSDB_FILE_HEAD)
|
||||||
#define TSDB_READ_DATA_FILE(rh) TSDB_DFILE_IN_SET(TSDB_READ_FSET(rh), TSDB_FILE_DATA)
|
#define TSDB_READ_DATA_FILE(rh) TSDB_DFILE_IN_SET(TSDB_READ_FSET(rh), TSDB_FILE_DATA)
|
||||||
#define TSDB_READ_LAST_FILE(rh) TSDB_DFILE_IN_SET(TSDB_READ_FSET(rh), TSDB_FILE_LAST)
|
#define TSDB_READ_LAST_FILE(rh) TSDB_DFILE_IN_SET(TSDB_READ_FSET(rh), TSDB_FILE_LAST)
|
||||||
|
|
|
@ -23,6 +23,9 @@ struct SMetaIdx {
|
||||||
SIndex *pIdx;
|
SIndex *pIdx;
|
||||||
#endif
|
#endif
|
||||||
/* data */
|
/* data */
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
int metaOpenIdx(SMeta *pMeta) {
|
int metaOpenIdx(SMeta *pMeta) {
|
||||||
|
|
|
@ -45,10 +45,12 @@ struct SMetaDB {
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct __attribute__((__packed__)) {
|
#pragma pack(push,1)
|
||||||
|
typedef struct {
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
int32_t sver;
|
int32_t sver;
|
||||||
} SSchemaDbKey;
|
} SSchemaDbKey;
|
||||||
|
#pragma pack(pop)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char *name;
|
char *name;
|
||||||
|
@ -626,14 +628,8 @@ STSmaWrapper *metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid) {
|
||||||
#ifdef META_TDB_SMA_TEST
|
#ifdef META_TDB_SMA_TEST
|
||||||
STSmaWrapper *pSW = NULL;
|
STSmaWrapper *pSW = NULL;
|
||||||
|
|
||||||
pSW = taosMemoryCalloc(1, sizeof(*pSW));
|
|
||||||
if (pSW == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SMSmaCursor *pCur = metaOpenSmaCursor(pMeta, uid);
|
SMSmaCursor *pCur = metaOpenSmaCursor(pMeta, uid);
|
||||||
if (pCur == NULL) {
|
if (pCur == NULL) {
|
||||||
taosMemoryFree(pSW);
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -653,6 +649,12 @@ STSmaWrapper *metaGetSmaInfoByTable(SMeta *pMeta, tb_uid_t uid) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((pSW == NULL) && ((pSW = taosMemoryCalloc(1, sizeof(*pSW))) == NULL)) {
|
||||||
|
TDB_FREE(pSmaVal);
|
||||||
|
metaCloseSmaCursor(pCur);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
++pSW->number;
|
++pSW->number;
|
||||||
STSma *tptr = (STSma *)taosMemoryRealloc(pSW->tSma, pSW->number * sizeof(STSma));
|
STSma *tptr = (STSma *)taosMemoryRealloc(pSW->tSma, pSW->number * sizeof(STSma));
|
||||||
if (tptr == NULL) {
|
if (tptr == NULL) {
|
||||||
|
|
|
@ -618,127 +618,6 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
int32_t tqProcessRebReq(STQ* pTq, char* msg) {
|
|
||||||
SMqMVRebReq req = {0};
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
|
||||||
tDecodeSMqMVRebReq(msg, &req);
|
|
||||||
|
|
||||||
vDebug("vg %d set from consumer %ld to consumer %ld", req.vgId, req.oldConsumerId, req.newConsumerId);
|
|
||||||
STqConsumer* pConsumer = tqHandleGet(pTq->tqMeta, req.oldConsumerId);
|
|
||||||
ASSERT(pConsumer);
|
|
||||||
ASSERT(pConsumer->consumerId == req.oldConsumerId);
|
|
||||||
int32_t numOfTopics = taosArrayGetSize(pConsumer->topics);
|
|
||||||
if (numOfTopics == 1) {
|
|
||||||
STqTopic* pTopic = taosArrayGet(pConsumer->topics, 0);
|
|
||||||
ASSERT(strcmp(pTopic->topicName, req.topic) == 0);
|
|
||||||
STqConsumer* pNewConsumer = tqHandleGet(pTq->tqMeta, req.newConsumerId);
|
|
||||||
if (pNewConsumer == NULL) {
|
|
||||||
pConsumer->consumerId = req.newConsumerId;
|
|
||||||
tqHandleMovePut(pTq->tqMeta, req.newConsumerId, pConsumer);
|
|
||||||
tqHandleCommit(pTq->tqMeta, req.newConsumerId);
|
|
||||||
tqHandlePurge(pTq->tqMeta, req.oldConsumerId);
|
|
||||||
return 0;
|
|
||||||
} else {
|
|
||||||
taosArrayPush(pNewConsumer->topics, pTopic);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
for (int32_t i = 0; i < numOfTopics; i++) {
|
|
||||||
STqTopic* pTopic = taosArrayGet(pConsumer->topics, i);
|
|
||||||
if (strcmp(pTopic->topicName, req.topic) == 0) {
|
|
||||||
STqConsumer* pNewConsumer = tqHandleGet(pTq->tqMeta, req.newConsumerId);
|
|
||||||
if (pNewConsumer == NULL) {
|
|
||||||
pNewConsumer = taosMemoryCalloc(1, sizeof(STqConsumer));
|
|
||||||
if (pNewConsumer == NULL) {
|
|
||||||
terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
strcpy(pNewConsumer->cgroup, pConsumer->cgroup);
|
|
||||||
pNewConsumer->topics = taosArrayInit(0, sizeof(STqTopic));
|
|
||||||
pNewConsumer->consumerId = req.newConsumerId;
|
|
||||||
pNewConsumer->epoch = 0;
|
|
||||||
|
|
||||||
taosArrayPush(pNewConsumer->topics, pTopic);
|
|
||||||
tqHandleMovePut(pTq->tqMeta, req.newConsumerId, pConsumer);
|
|
||||||
tqHandleCommit(pTq->tqMeta, req.newConsumerId);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
ASSERT(pNewConsumer->consumerId == req.newConsumerId);
|
|
||||||
taosArrayPush(pNewConsumer->topics, pTopic);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
//
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqProcessSetConnReq(STQ* pTq, char* msg) {
|
|
||||||
SMqSetCVgReq req = {0};
|
|
||||||
tDecodeSMqSetCVgReq(msg, &req);
|
|
||||||
bool create = false;
|
|
||||||
|
|
||||||
vDebug("vg %d set to consumer %ld", req.vgId, req.consumerId);
|
|
||||||
STqConsumer* pConsumer = tqHandleGet(pTq->tqMeta, req.consumerId);
|
|
||||||
if (pConsumer == NULL) {
|
|
||||||
pConsumer = taosMemoryCalloc(1, sizeof(STqConsumer));
|
|
||||||
if (pConsumer == NULL) {
|
|
||||||
terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
strcpy(pConsumer->cgroup, req.cgroup);
|
|
||||||
pConsumer->topics = taosArrayInit(0, sizeof(STqTopic));
|
|
||||||
pConsumer->consumerId = req.consumerId;
|
|
||||||
pConsumer->epoch = 0;
|
|
||||||
create = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
STqTopic* pTopic = taosMemoryCalloc(1, sizeof(STqTopic));
|
|
||||||
if (pTopic == NULL) {
|
|
||||||
taosArrayDestroy(pConsumer->topics);
|
|
||||||
taosMemoryFree(pConsumer);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
strcpy(pTopic->topicName, req.topicName);
|
|
||||||
pTopic->sql = req.sql;
|
|
||||||
pTopic->physicalPlan = req.physicalPlan;
|
|
||||||
pTopic->qmsg = req.qmsg;
|
|
||||||
/*pTopic->committedOffset = -1;*/
|
|
||||||
/*pTopic->currentOffset = -1;*/
|
|
||||||
|
|
||||||
pTopic->buffer.firstOffset = -1;
|
|
||||||
pTopic->buffer.lastOffset = -1;
|
|
||||||
pTopic->pReadhandle = walOpenReadHandle(pTq->pWal);
|
|
||||||
if (pTopic->pReadhandle == NULL) {
|
|
||||||
ASSERT(false);
|
|
||||||
}
|
|
||||||
for (int i = 0; i < TQ_BUFFER_SIZE; i++) {
|
|
||||||
pTopic->buffer.output[i].status = 0;
|
|
||||||
STqReadHandle* pReadHandle = tqInitSubmitMsgScanner(pTq->pVnodeMeta);
|
|
||||||
SReadHandle handle = {
|
|
||||||
.reader = pReadHandle,
|
|
||||||
.meta = pTq->pVnodeMeta,
|
|
||||||
};
|
|
||||||
pTopic->buffer.output[i].pReadHandle = pReadHandle;
|
|
||||||
pTopic->buffer.output[i].task = qCreateStreamExecTaskInfo(req.qmsg, &handle);
|
|
||||||
ASSERT(pTopic->buffer.output[i].task);
|
|
||||||
}
|
|
||||||
vDebug("set topic %s to consumer %ld on vg %d", pTopic->topicName, req.consumerId, TD_VID(pTq->pVnode));
|
|
||||||
taosArrayPush(pConsumer->topics, pTopic);
|
|
||||||
if (create) {
|
|
||||||
tqHandleMovePut(pTq->tqMeta, req.consumerId, pConsumer);
|
|
||||||
tqHandleCommit(pTq->tqMeta, req.consumerId);
|
|
||||||
}
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqProcessCancelConnReq(STQ* pTq, char* msg) {
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int32_t parallel) {
|
int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int32_t parallel) {
|
||||||
if (pTask->execType == TASK_EXEC__NONE) return 0;
|
if (pTask->execType == TASK_EXEC__NONE) return 0;
|
||||||
|
|
||||||
|
|
|
@ -86,7 +86,7 @@ STqMetaStore* tqStoreOpen(STQ* pTq, const char* path, FTqSerialize serializer, F
|
||||||
}
|
}
|
||||||
strcpy(pMeta->dirPath, path);
|
strcpy(pMeta->dirPath, path);
|
||||||
|
|
||||||
char name[pathLen + 10];
|
char *name = taosMemoryMalloc(pathLen + 10) ;
|
||||||
|
|
||||||
strcpy(name, path);
|
strcpy(name, path);
|
||||||
if (!taosDirExist(name) && taosMkDir(name) != 0) {
|
if (!taosDirExist(name) && taosMkDir(name) != 0) {
|
||||||
|
@ -99,6 +99,7 @@ STqMetaStore* tqStoreOpen(STQ* pTq, const char* path, FTqSerialize serializer, F
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
tqError("failed to open file:%s since %s ", name, terrstr());
|
tqError("failed to open file:%s since %s ", name, terrstr());
|
||||||
// free memory
|
// free memory
|
||||||
|
taosMemoryFree(name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -106,6 +107,7 @@ STqMetaStore* tqStoreOpen(STQ* pTq, const char* path, FTqSerialize serializer, F
|
||||||
pMeta->unpersistHead = taosMemoryCalloc(1, sizeof(STqMetaList));
|
pMeta->unpersistHead = taosMemoryCalloc(1, sizeof(STqMetaList));
|
||||||
if (pMeta->unpersistHead == NULL) {
|
if (pMeta->unpersistHead == NULL) {
|
||||||
terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_TQ_OUT_OF_MEMORY;
|
||||||
|
taosMemoryFree(name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pMeta->unpersistHead->unpersistNext = pMeta->unpersistHead->unpersistPrev = pMeta->unpersistHead;
|
pMeta->unpersistHead->unpersistNext = pMeta->unpersistHead->unpersistPrev = pMeta->unpersistHead;
|
||||||
|
@ -116,8 +118,10 @@ STqMetaStore* tqStoreOpen(STQ* pTq, const char* path, FTqSerialize serializer, F
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
tqError("failed to open file:%s since %s", name, terrstr());
|
tqError("failed to open file:%s since %s", name, terrstr());
|
||||||
|
taosMemoryFree(name);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
taosMemoryFree(name);
|
||||||
|
|
||||||
pMeta->pFile = pFile;
|
pMeta->pFile = pFile;
|
||||||
|
|
||||||
|
|
|
@ -3260,6 +3260,9 @@ int32_t tsdbRetrieveDataBlockStatisInfo(tsdbReaderT* pTsdbReadHandle, SColumnDat
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tsdbDebug("vgId:%d succeed to load block statis part for uid %" PRIu64, REPO_ID(pHandle->pTsdb),
|
||||||
|
TSDB_READ_TABLE_UID(&pHandle->rhelper));
|
||||||
|
|
||||||
int16_t* colIds = pHandle->defaultLoadColumn->pData;
|
int16_t* colIds = pHandle->defaultLoadColumn->pData;
|
||||||
|
|
||||||
size_t numOfCols = QH_GET_NUM_OF_COLS(pHandle);
|
size_t numOfCols = QH_GET_NUM_OF_COLS(pHandle);
|
||||||
|
|
|
@ -322,15 +322,18 @@ int tsdbLoadBlockStatis(SReadH *pReadh, SBlock *pBlock) {
|
||||||
ASSERT(pBlock->numOfSubBlocks <= 1);
|
ASSERT(pBlock->numOfSubBlocks <= 1);
|
||||||
|
|
||||||
if (!pBlock->aggrStat) {
|
if (!pBlock->aggrStat) {
|
||||||
|
tsdbDebug("vgId:%d no need to load block statis part for uid %" PRIu64 " since not exist", REPO_ID(pReadh->pRepo),
|
||||||
|
TSDB_READ_TABLE_UID(pReadh));
|
||||||
return TSDB_STATIS_NONE;
|
return TSDB_STATIS_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SDFile *pDFileAggr = pBlock->last ? TSDB_READ_SMAL_FILE(pReadh) : TSDB_READ_SMAD_FILE(pReadh);
|
SDFile *pDFileAggr = pBlock->last ? TSDB_READ_SMAL_FILE(pReadh) : TSDB_READ_SMAD_FILE(pReadh);
|
||||||
|
|
||||||
if (tsdbSeekDFile(pDFileAggr, pBlock->aggrOffset, SEEK_SET) < 0) {
|
if (tsdbSeekDFile(pDFileAggr, pBlock->aggrOffset, SEEK_SET) < 0) {
|
||||||
tsdbError("vgId:%d failed to load block aggr part while seek file %s to offset %" PRIu64 " since %s",
|
tsdbError("vgId:%d failed to load block statis part for uid %" PRIu64 " while seek file %s to offset %" PRIu64
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr), (uint64_t)pBlock->aggrOffset,
|
" since %s",
|
||||||
tstrerror(terrno));
|
TSDB_READ_REPO_ID(pReadh), TSDB_READ_TABLE_UID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr),
|
||||||
|
(uint64_t)pBlock->aggrOffset, tstrerror(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -339,25 +342,28 @@ int tsdbLoadBlockStatis(SReadH *pReadh, SBlock *pBlock) {
|
||||||
|
|
||||||
int64_t nreadAggr = tsdbReadDFile(pDFileAggr, (void *)(pReadh->pAggrBlkData), sizeAggr);
|
int64_t nreadAggr = tsdbReadDFile(pDFileAggr, (void *)(pReadh->pAggrBlkData), sizeAggr);
|
||||||
if (nreadAggr < 0) {
|
if (nreadAggr < 0) {
|
||||||
tsdbError("vgId:%d failed to load block aggr part while read file %s since %s, offset:%" PRIu64 " len :%" PRIzu,
|
tsdbError("vgId:%d failed to load block statis part for uid %" PRIu64
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr), tstrerror(terrno),
|
" while read file %s since %s, offset:%" PRIu64 " len :%" PRIzu,
|
||||||
(uint64_t)pBlock->aggrOffset, sizeAggr);
|
TSDB_READ_REPO_ID(pReadh), TSDB_READ_TABLE_UID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr),
|
||||||
|
tstrerror(terrno), (uint64_t)pBlock->aggrOffset, sizeAggr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nreadAggr < sizeAggr) {
|
if (nreadAggr < sizeAggr) {
|
||||||
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
||||||
tsdbError("vgId:%d block aggr part in file %s is corrupted, offset:%" PRIu64 " expected bytes:%" PRIzu
|
tsdbError("vgId:%d block statis part for uid %" PRIu64 " in file %s is corrupted, offset:%" PRIu64
|
||||||
" read bytes: %" PRId64,
|
" expected bytes:%" PRIzu " read bytes: %" PRId64,
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr), (uint64_t)pBlock->aggrOffset, sizeAggr,
|
TSDB_READ_REPO_ID(pReadh), TSDB_READ_TABLE_UID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr),
|
||||||
nreadAggr);
|
(uint64_t)pBlock->aggrOffset, sizeAggr, nreadAggr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!taosCheckChecksumWhole((uint8_t *)(pReadh->pAggrBlkData), (uint32_t)sizeAggr)) {
|
if (!taosCheckChecksumWhole((uint8_t *)(pReadh->pAggrBlkData), (uint32_t)sizeAggr)) {
|
||||||
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
||||||
tsdbError("vgId:%d block aggr part in file %s is corrupted since wrong checksum, offset:%" PRIu64 " len :%" PRIzu,
|
tsdbError("vgId:%d block statis part for uid %" PRIu64
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr), (uint64_t)pBlock->aggrOffset, sizeAggr);
|
"in file %s is corrupted since wrong checksum, offset:%" PRIu64 " len :%" PRIzu,
|
||||||
|
TSDB_READ_REPO_ID(pReadh), TSDB_READ_TABLE_UID(pReadh), TSDB_FILE_FULL_NAME(pDFileAggr),
|
||||||
|
(uint64_t)pBlock->aggrOffset, sizeAggr);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -367,7 +373,7 @@ static int tsdbLoadBlockOffset(SReadH *pReadh, SBlock *pBlock) {
|
||||||
ASSERT(pBlock->numOfSubBlocks <= 1);
|
ASSERT(pBlock->numOfSubBlocks <= 1);
|
||||||
SDFile *pDFile = (pBlock->last) ? TSDB_READ_LAST_FILE(pReadh) : TSDB_READ_DATA_FILE(pReadh);
|
SDFile *pDFile = (pBlock->last) ? TSDB_READ_LAST_FILE(pReadh) : TSDB_READ_DATA_FILE(pReadh);
|
||||||
if (tsdbSeekDFile(pDFile, pBlock->offset, SEEK_SET) < 0) {
|
if (tsdbSeekDFile(pDFile, pBlock->offset, SEEK_SET) < 0) {
|
||||||
tsdbError("vgId:%d failed to load block statis part while seek file %s to offset %" PRId64 " since %s",
|
tsdbError("vgId:%d failed to load block head part while seek file %s to offset %" PRId64 " since %s",
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, tstrerror(terrno));
|
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, tstrerror(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -377,14 +383,14 @@ static int tsdbLoadBlockOffset(SReadH *pReadh, SBlock *pBlock) {
|
||||||
|
|
||||||
int64_t nread = tsdbReadDFile(pDFile, (void *)(pReadh->pBlkData), size);
|
int64_t nread = tsdbReadDFile(pDFile, (void *)(pReadh->pBlkData), size);
|
||||||
if (nread < 0) {
|
if (nread < 0) {
|
||||||
tsdbError("vgId:%d failed to load block statis part while read file %s since %s, offset:%" PRId64 " len :%" PRIzu,
|
tsdbError("vgId:%d failed to load block head part while read file %s since %s, offset:%" PRId64 " len :%" PRIzu,
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), tstrerror(terrno), (int64_t)pBlock->offset, size);
|
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), tstrerror(terrno), (int64_t)pBlock->offset, size);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (nread < size) {
|
if (nread < size) {
|
||||||
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
||||||
tsdbError("vgId:%d block statis part in file %s is corrupted, offset:%" PRId64 " expected bytes:%" PRIzu
|
tsdbError("vgId:%d block head part in file %s is corrupted, offset:%" PRId64 " expected bytes:%" PRIzu
|
||||||
" read bytes: %" PRId64,
|
" read bytes: %" PRId64,
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, size, nread);
|
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, size, nread);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -392,7 +398,7 @@ static int tsdbLoadBlockOffset(SReadH *pReadh, SBlock *pBlock) {
|
||||||
|
|
||||||
if (!taosCheckChecksumWhole((uint8_t *)(pReadh->pBlkData), (uint32_t)size)) {
|
if (!taosCheckChecksumWhole((uint8_t *)(pReadh->pBlkData), (uint32_t)size)) {
|
||||||
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
||||||
tsdbError("vgId:%d block statis part in file %s is corrupted since wrong checksum, offset:%" PRId64 " len :%" PRIzu,
|
tsdbError("vgId:%d block head part in file %s is corrupted since wrong checksum, offset:%" PRId64 " len :%" PRIzu,
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, size);
|
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, size);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -546,7 +552,7 @@ static int tsdbLoadBlockDataImpl(SReadH *pReadh, SBlock *pBlock, SDataCols *pDat
|
||||||
int32_t tsize = (int32_t)tsdbBlockStatisSize(pBlock->numOfCols, (uint32_t)pBlock->blkVer);
|
int32_t tsize = (int32_t)tsdbBlockStatisSize(pBlock->numOfCols, (uint32_t)pBlock->blkVer);
|
||||||
if (!taosCheckChecksumWhole((uint8_t *)TSDB_READ_BUF(pReadh), tsize)) {
|
if (!taosCheckChecksumWhole((uint8_t *)TSDB_READ_BUF(pReadh), tsize)) {
|
||||||
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
|
||||||
tsdbError("vgId:%d block statis part in file %s is corrupted since wrong checksum, offset:%" PRId64 " len :%d",
|
tsdbError("vgId:%d block head part in file %s is corrupted since wrong checksum, offset:%" PRId64 " len :%d",
|
||||||
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, tsize);
|
TSDB_READ_REPO_ID(pReadh), TSDB_FILE_FULL_NAME(pDFile), (int64_t)pBlock->offset, tsize);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -643,6 +643,7 @@ int32_t tsdbUpdateExpiredWindowImpl(STsdb *pTsdb, SSubmitReq *pMsg, int64_t vers
|
||||||
SSubmitMsgIter msgIter = {0};
|
SSubmitMsgIter msgIter = {0};
|
||||||
SSubmitBlk *pBlock = NULL;
|
SSubmitBlk *pBlock = NULL;
|
||||||
SInterval interval = {0};
|
SInterval interval = {0};
|
||||||
|
TSKEY lastWinSKey = INT64_MIN;
|
||||||
|
|
||||||
if (tInitSubmitMsgIter(pMsg, &msgIter) != TSDB_CODE_SUCCESS) {
|
if (tInitSubmitMsgIter(pMsg, &msgIter) != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
|
@ -657,7 +658,7 @@ int32_t tsdbUpdateExpiredWindowImpl(STsdb *pTsdb, SSubmitReq *pMsg, int64_t vers
|
||||||
|
|
||||||
SSubmitBlkIter blkIter = {0};
|
SSubmitBlkIter blkIter = {0};
|
||||||
if (tInitSubmitBlkIter(pBlock, &blkIter) != TSDB_CODE_SUCCESS) {
|
if (tInitSubmitBlkIter(pBlock, &blkIter) != TSDB_CODE_SUCCESS) {
|
||||||
tdFreeTSmaWrapper(pSW);
|
pSW = tdFreeTSmaWrapper(pSW);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -667,31 +668,37 @@ int32_t tsdbUpdateExpiredWindowImpl(STsdb *pTsdb, SSubmitReq *pMsg, int64_t vers
|
||||||
tdFreeTSmaWrapper(pSW);
|
tdFreeTSmaWrapper(pSW);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (pSW == NULL) {
|
if (!pSW || (pTSma->tableUid != pBlock->suid)) {
|
||||||
|
if (pSW) {
|
||||||
|
pSW = tdFreeTSmaWrapper(pSW);
|
||||||
|
}
|
||||||
if ((pSW = metaGetSmaInfoByTable(REPO_META(pTsdb), pBlock->suid)) == NULL) {
|
if ((pSW = metaGetSmaInfoByTable(REPO_META(pTsdb), pBlock->suid)) == NULL) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if ((pSW->number) <= 0 || (pSW->tSma == NULL)) {
|
if ((pSW->number) <= 0 || (pSW->tSma == NULL)) {
|
||||||
tdFreeTSmaWrapper(pSW);
|
pSW = tdFreeTSmaWrapper(pSW);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pTSma = pSW->tSma;
|
|
||||||
}
|
|
||||||
|
|
||||||
interval.interval = pTSma->interval;
|
pTSma = pSW->tSma;
|
||||||
interval.intervalUnit = pTSma->intervalUnit;
|
|
||||||
interval.offset = pTSma->offset;
|
interval.interval = pTSma->interval;
|
||||||
interval.precision = REPO_CFG(pTsdb)->precision;
|
interval.intervalUnit = pTSma->intervalUnit;
|
||||||
interval.sliding = pTSma->sliding;
|
interval.offset = pTSma->offset;
|
||||||
interval.slidingUnit = pTSma->slidingUnit;
|
interval.precision = REPO_CFG(pTsdb)->precision;
|
||||||
|
interval.sliding = pTSma->sliding;
|
||||||
|
interval.slidingUnit = pTSma->slidingUnit;
|
||||||
|
}
|
||||||
|
|
||||||
TSKEY winSKey = taosTimeTruncate(TD_ROW_KEY(row), &interval, interval.precision);
|
TSKEY winSKey = taosTimeTruncate(TD_ROW_KEY(row), &interval, interval.precision);
|
||||||
|
|
||||||
tsdbSetExpiredWindow(pTsdb, pItemsHash, pTSma->indexUid, winSKey, version);
|
if (lastWinSKey != winSKey) {
|
||||||
|
lastWinSKey = winSKey;
|
||||||
// TODO: release only when suid changes.
|
tsdbSetExpiredWindow(pTsdb, pItemsHash, pTSma->indexUid, winSKey, version);
|
||||||
tdDestroyTSmaWrapper(pSW);
|
} else {
|
||||||
taosMemoryFreeClear(pSW);
|
tsdbDebug("vgId:%d smaIndex %" PRIi64 ", put skey %" PRIi64 " to expire window ignore as duplicated",
|
||||||
|
REPO_ID(pTsdb), pTSma->indexUid, winSKey);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -215,10 +215,21 @@ static int vnodeProcessCreateStbReq(SVnode *pVnode, void *pReq) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: remove the debug log
|
||||||
|
SRSmaParam *param = vCreateTbReq.stbCfg.pRSmaParam;
|
||||||
|
if (param) {
|
||||||
|
printf("qmsg1 len = %d, body = %s\n", param->qmsg1 ? (int32_t)strlen(param->qmsg1) : 0,
|
||||||
|
param->qmsg1 ? param->qmsg1 : "");
|
||||||
|
printf("qmsg1 len = %d, body = %s\n", param->qmsg2 ? (int32_t)strlen(param->qmsg2) : 0,
|
||||||
|
param->qmsg2 ? param->qmsg2 : "");
|
||||||
|
}
|
||||||
|
|
||||||
taosMemoryFree(vCreateTbReq.stbCfg.pSchema);
|
taosMemoryFree(vCreateTbReq.stbCfg.pSchema);
|
||||||
taosMemoryFree(vCreateTbReq.stbCfg.pTagSchema);
|
taosMemoryFree(vCreateTbReq.stbCfg.pTagSchema);
|
||||||
if (vCreateTbReq.stbCfg.pRSmaParam) {
|
if (vCreateTbReq.stbCfg.pRSmaParam) {
|
||||||
taosMemoryFree(vCreateTbReq.stbCfg.pRSmaParam->pFuncIds);
|
taosMemoryFree(vCreateTbReq.stbCfg.pRSmaParam->pFuncIds);
|
||||||
|
taosMemoryFree(vCreateTbReq.stbCfg.pRSmaParam->qmsg1);
|
||||||
|
taosMemoryFree(vCreateTbReq.stbCfg.pRSmaParam->qmsg2);
|
||||||
taosMemoryFree(vCreateTbReq.stbCfg.pRSmaParam);
|
taosMemoryFree(vCreateTbReq.stbCfg.pRSmaParam);
|
||||||
}
|
}
|
||||||
taosMemoryFree(vCreateTbReq.name);
|
taosMemoryFree(vCreateTbReq.name);
|
||||||
|
|
|
@ -104,6 +104,10 @@ typedef struct SCatalog {
|
||||||
|
|
||||||
typedef struct SCtgApiStat {
|
typedef struct SCtgApiStat {
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
|
|
||||||
} SCtgApiStat;
|
} SCtgApiStat;
|
||||||
|
|
||||||
typedef struct SCtgRuntimeStat {
|
typedef struct SCtgRuntimeStat {
|
||||||
|
|
|
@ -643,6 +643,49 @@ int32_t ctgGetIndexInfoFromMnode(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmt
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t ctgGetUdfInfoFromMnode(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char *funcName, SFuncInfo **out) {
|
||||||
|
char *msg = NULL;
|
||||||
|
int32_t msgLen = 0;
|
||||||
|
|
||||||
|
ctgDebug("try to get udf info from mnode, funcName:%s", funcName);
|
||||||
|
|
||||||
|
int32_t code = queryBuildMsg[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)]((void *)funcName, &msg, 0, &msgLen);
|
||||||
|
if (code) {
|
||||||
|
ctgError("Build get udf msg failed, code:%x, db:%s", code, funcName);
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
SRpcMsg rpcMsg = {
|
||||||
|
.msgType = TDMT_MND_RETRIEVE_FUNC,
|
||||||
|
.pCont = msg,
|
||||||
|
.contLen = msgLen,
|
||||||
|
};
|
||||||
|
|
||||||
|
SRpcMsg rpcRsp = {0};
|
||||||
|
|
||||||
|
rpcSendRecv(pRpc, (SEpSet*)pMgmtEps, &rpcMsg, &rpcRsp);
|
||||||
|
if (TSDB_CODE_SUCCESS != rpcRsp.code) {
|
||||||
|
if (TSDB_CODE_MND_FUNC_NOT_EXIST == rpcRsp.code) {
|
||||||
|
ctgDebug("funcName %s not exist in mnode", funcName);
|
||||||
|
taosMemoryFreeClear(*out);
|
||||||
|
CTG_RET(TSDB_CODE_SUCCESS);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgError("error rsp for get udf, error:%s, funcName:%s", tstrerror(rpcRsp.code), funcName);
|
||||||
|
CTG_ERR_RET(rpcRsp.code);
|
||||||
|
}
|
||||||
|
|
||||||
|
code = queryProcessMsgRsp[TMSG_INDEX(TDMT_MND_RETRIEVE_FUNC)](*out, rpcRsp.pCont, rpcRsp.contLen);
|
||||||
|
if (code) {
|
||||||
|
ctgError("Process get udf rsp failed, code:%x, funcName:%s", code, funcName);
|
||||||
|
CTG_ERR_RET(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
ctgDebug("Got udf from mnode, funcName:%s", funcName);
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t ctgIsTableMetaExistInCache(SCatalog* pCtg, char *dbFName, char* tbName, int32_t *exist) {
|
int32_t ctgIsTableMetaExistInCache(SCatalog* pCtg, char *dbFName, char* tbName, int32_t *exist) {
|
||||||
if (NULL == pCtg->dbCache) {
|
if (NULL == pCtg->dbCache) {
|
||||||
|
@ -2811,6 +2854,30 @@ int32_t catalogGetIndexInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps,
|
||||||
CTG_API_LEAVE(ctgGetIndexInfoFromMnode(pCtg, pRpc, pMgmtEps, indexName, pInfo));
|
CTG_API_LEAVE(ctgGetIndexInfoFromMnode(pCtg, pRpc, pMgmtEps, indexName, pInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t catalogGetUdfInfo(SCatalog* pCtg, void *pRpc, const SEpSet* pMgmtEps, const char* funcName, SFuncInfo** pInfo) {
|
||||||
|
CTG_API_ENTER();
|
||||||
|
|
||||||
|
if (NULL == pCtg || NULL == pRpc || NULL == pMgmtEps || NULL == funcName || NULL == pInfo) {
|
||||||
|
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = 0;
|
||||||
|
*pInfo = taosMemoryMalloc(sizeof(SFuncInfo));
|
||||||
|
if (NULL == *pInfo) {
|
||||||
|
CTG_API_LEAVE(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_ERR_JRET(ctgGetUdfInfoFromMnode(pCtg, pRpc, pMgmtEps, funcName, pInfo));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
|
if (code) {
|
||||||
|
taosMemoryFreeClear(*pInfo);
|
||||||
|
}
|
||||||
|
|
||||||
|
CTG_API_LEAVE(code);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void catalogDestroy(void) {
|
void catalogDestroy(void) {
|
||||||
qInfo("start to destroy catalog");
|
qInfo("start to destroy catalog");
|
||||||
|
|
|
@ -24,6 +24,9 @@
|
||||||
#pragma GCC diagnostic ignored "-Wformat"
|
#pragma GCC diagnostic ignored "-Wformat"
|
||||||
#include <addr_any.h>
|
#include <addr_any.h>
|
||||||
|
|
||||||
|
#ifdef WINDOWS
|
||||||
|
#define TD_USE_WINSOCK
|
||||||
|
#endif
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
|
@ -155,11 +158,11 @@ int32_t ctgTestGetVgNumFromVgVersion(int32_t vgVersion) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctgTestBuildCTableMetaOutput(STableMetaOutput *output) {
|
void ctgTestBuildCTableMetaOutput(STableMetaOutput *output) {
|
||||||
SName cn = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName cn = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(cn.dbname, "db1");
|
strcpy(cn.dbname, "db1");
|
||||||
strcpy(cn.tname, ctgTestCTablename);
|
strcpy(cn.tname, ctgTestCTablename);
|
||||||
|
|
||||||
SName sn = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName sn = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(sn.dbname, "db1");
|
strcpy(sn.dbname, "db1");
|
||||||
strcpy(sn.tname, ctgTestSTablename);
|
strcpy(sn.tname, ctgTestSTablename);
|
||||||
|
|
||||||
|
@ -577,9 +580,16 @@ void ctgTestSetRspDbVgroups() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspDbVgroups);
|
stub.set(rpcSendRecv, ctgTestRspDbVgroups);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspDbVgroups);
|
stub.set(f.second, ctgTestRspDbVgroups);
|
||||||
}
|
}
|
||||||
|
@ -590,9 +600,16 @@ void ctgTestSetRspTableMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspTableMeta);
|
stub.set(rpcSendRecv, ctgTestRspTableMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspTableMeta);
|
stub.set(f.second, ctgTestRspTableMeta);
|
||||||
}
|
}
|
||||||
|
@ -603,9 +620,16 @@ void ctgTestSetRspCTableMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspCTableMeta);
|
stub.set(rpcSendRecv, ctgTestRspCTableMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspCTableMeta);
|
stub.set(f.second, ctgTestRspCTableMeta);
|
||||||
}
|
}
|
||||||
|
@ -616,9 +640,16 @@ void ctgTestSetRspSTableMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspSTableMeta);
|
stub.set(rpcSendRecv, ctgTestRspSTableMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspSTableMeta);
|
stub.set(f.second, ctgTestRspSTableMeta);
|
||||||
}
|
}
|
||||||
|
@ -629,9 +660,16 @@ void ctgTestSetRspMultiSTableMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspMultiSTableMeta);
|
stub.set(rpcSendRecv, ctgTestRspMultiSTableMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspMultiSTableMeta);
|
stub.set(f.second, ctgTestRspMultiSTableMeta);
|
||||||
}
|
}
|
||||||
|
@ -642,9 +680,16 @@ void ctgTestSetRspByIdx() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspByIdx);
|
stub.set(rpcSendRecv, ctgTestRspByIdx);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspByIdx);
|
stub.set(f.second, ctgTestRspByIdx);
|
||||||
}
|
}
|
||||||
|
@ -656,9 +701,16 @@ void ctgTestSetRspDbVgroupsAndNormalMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndNormalMeta);
|
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndNormalMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspDbVgroupsAndNormalMeta);
|
stub.set(f.second, ctgTestRspDbVgroupsAndNormalMeta);
|
||||||
}
|
}
|
||||||
|
@ -669,9 +721,16 @@ void ctgTestSetRspDbVgroupsAndChildMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndChildMeta);
|
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndChildMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspDbVgroupsAndChildMeta);
|
stub.set(f.second, ctgTestRspDbVgroupsAndChildMeta);
|
||||||
}
|
}
|
||||||
|
@ -682,9 +741,16 @@ void ctgTestSetRspDbVgroupsAndSuperMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndSuperMeta);
|
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndSuperMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspDbVgroupsAndSuperMeta);
|
stub.set(f.second, ctgTestRspDbVgroupsAndSuperMeta);
|
||||||
}
|
}
|
||||||
|
@ -695,9 +761,16 @@ void ctgTestSetRspDbVgroupsAndMultiSuperMeta() {
|
||||||
static Stub stub;
|
static Stub stub;
|
||||||
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndMultiSuperMeta);
|
stub.set(rpcSendRecv, ctgTestRspDbVgroupsAndMultiSuperMeta);
|
||||||
{
|
{
|
||||||
|
#ifdef WINDOWS
|
||||||
|
AddrAny any;
|
||||||
|
std::map<std::string,void*> result;
|
||||||
|
any.get_func_addr("rpcSendRecv", result);
|
||||||
|
#endif
|
||||||
|
#ifdef LINUX
|
||||||
AddrAny any("libtransport.so");
|
AddrAny any("libtransport.so");
|
||||||
std::map<std::string, void *> result;
|
std::map<std::string, void *> result;
|
||||||
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
any.get_global_func_addr_dynsym("^rpcSendRecv$", result);
|
||||||
|
#endif
|
||||||
for (const auto &f : result) {
|
for (const auto &f : result) {
|
||||||
stub.set(f.second, ctgTestRspDbVgroupsAndMultiSuperMeta);
|
stub.set(f.second, ctgTestRspDbVgroupsAndMultiSuperMeta);
|
||||||
}
|
}
|
||||||
|
@ -789,7 +862,7 @@ void *ctgTestGetCtableMetaThread(void *param) {
|
||||||
STableMeta *tbMeta = NULL;
|
STableMeta *tbMeta = NULL;
|
||||||
bool inCache = false;
|
bool inCache = false;
|
||||||
|
|
||||||
SName cn = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName cn = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(cn.dbname, "db1");
|
strcpy(cn.dbname, "db1");
|
||||||
strcpy(cn.tname, ctgTestCTablename);
|
strcpy(cn.tname, ctgTestCTablename);
|
||||||
|
|
||||||
|
@ -871,7 +944,7 @@ TEST(tableMeta, normalTable) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -978,7 +1051,7 @@ TEST(tableMeta, childTableCase) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestCTablename);
|
strcpy(n.tname, ctgTestCTablename);
|
||||||
|
|
||||||
|
@ -1085,7 +1158,7 @@ TEST(tableMeta, superTableCase) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestSTablename);
|
strcpy(n.tname, ctgTestSTablename);
|
||||||
|
|
||||||
|
@ -1210,7 +1283,7 @@ TEST(tableMeta, rmStbMeta) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestSTablename);
|
strcpy(n.tname, ctgTestSTablename);
|
||||||
|
|
||||||
|
@ -1280,7 +1353,7 @@ TEST(tableMeta, updateStbMeta) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestSTablename);
|
strcpy(n.tname, ctgTestSTablename);
|
||||||
|
|
||||||
|
@ -1378,7 +1451,7 @@ TEST(refreshGetMeta, normal2normal) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -1457,7 +1530,7 @@ TEST(refreshGetMeta, normal2notexist) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -1529,7 +1602,7 @@ TEST(refreshGetMeta, normal2child) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
ctgTestCurrentCTableName = ctgTestTablename;
|
ctgTestCurrentCTableName = ctgTestTablename;
|
||||||
|
@ -1613,7 +1686,7 @@ TEST(refreshGetMeta, stable2child) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
ctgTestCurrentSTableName = ctgTestTablename;
|
ctgTestCurrentSTableName = ctgTestTablename;
|
||||||
|
@ -1699,7 +1772,7 @@ TEST(refreshGetMeta, stable2stable) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
ctgTestCurrentSTableName = ctgTestTablename;
|
ctgTestCurrentSTableName = ctgTestTablename;
|
||||||
|
@ -1786,7 +1859,7 @@ TEST(refreshGetMeta, child2stable) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
ctgTestCurrentCTableName = ctgTestTablename;
|
ctgTestCurrentCTableName = ctgTestTablename;
|
||||||
|
@ -1871,7 +1944,7 @@ TEST(tableDistVgroup, normalTable) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -1913,7 +1986,7 @@ TEST(tableDistVgroup, childTableCase) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestCTablename);
|
strcpy(n.tname, ctgTestCTablename);
|
||||||
|
|
||||||
|
@ -1956,7 +2029,7 @@ TEST(tableDistVgroup, superTableCase) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestSTablename);
|
strcpy(n.tname, ctgTestSTablename);
|
||||||
|
|
||||||
|
@ -2006,7 +2079,7 @@ TEST(dbVgroup, getSetDbVgroupCase) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -2091,7 +2164,7 @@ TEST(multiThread, getSetRmSameDbVgroup) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -2143,7 +2216,7 @@ TEST(multiThread, getSetRmDiffDbVgroup) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -2195,7 +2268,7 @@ TEST(multiThread, ctableMeta) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
strcpy(n.tname, ctgTestTablename);
|
strcpy(n.tname, ctgTestTablename);
|
||||||
|
|
||||||
|
@ -2247,7 +2320,7 @@ TEST(rentTest, allRent) {
|
||||||
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
code = catalogGetHandle(ctgTestClusterId, &pCtg);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SName n = {.type = TSDB_TABLE_NAME_T, .acctId = 1};
|
SName n = { TSDB_TABLE_NAME_T, 1, {0}, {0} };
|
||||||
strcpy(n.dbname, "db1");
|
strcpy(n.dbname, "db1");
|
||||||
|
|
||||||
for (int32_t i = 1; i <= 10; ++i) {
|
for (int32_t i = 1; i <= 10; ++i) {
|
||||||
|
|
|
@ -382,7 +382,7 @@ typedef struct SSysTableScanInfo {
|
||||||
void* pCur; // cursor for iterate the local table meta store.
|
void* pCur; // cursor for iterate the local table meta store.
|
||||||
SArray* scanCols; // SArray<int16_t> scan column id list
|
SArray* scanCols; // SArray<int16_t> scan column id list
|
||||||
|
|
||||||
int32_t type; // show type, TODO remove it
|
// int32_t type; // show type, TODO remove it
|
||||||
SName name;
|
SName name;
|
||||||
SSDataBlock* pRes;
|
SSDataBlock* pRes;
|
||||||
int32_t capacity;
|
int32_t capacity;
|
||||||
|
@ -479,7 +479,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct SGroupbyOperatorInfo {
|
typedef struct SGroupbyOperatorInfo {
|
||||||
SOptrBasicInfo binfo;
|
SOptrBasicInfo binfo;
|
||||||
SArray* pGroupCols;
|
SArray* pGroupCols; // group by columns, SArray<SColumn>
|
||||||
SArray* pGroupColVals; // current group column values, SArray<SGroupKeys>
|
SArray* pGroupColVals; // current group column values, SArray<SGroupKeys>
|
||||||
SNode* pCondition;
|
SNode* pCondition;
|
||||||
bool isInit; // denote if current val is initialized or not
|
bool isInit; // denote if current val is initialized or not
|
||||||
|
@ -600,7 +600,6 @@ typedef struct SJoinOperatorInfo {
|
||||||
int32_t rightPos;
|
int32_t rightPos;
|
||||||
SColumnInfo rightCol;
|
SColumnInfo rightCol;
|
||||||
SNode *pOnCondition;
|
SNode *pOnCondition;
|
||||||
// SRspResultInfo resultInfo;
|
|
||||||
} SJoinOperatorInfo;
|
} SJoinOperatorInfo;
|
||||||
|
|
||||||
int32_t operatorDummyOpenFn(SOperatorInfo* pOperator);
|
int32_t operatorDummyOpenFn(SOperatorInfo* pOperator);
|
||||||
|
|
|
@ -1087,6 +1087,7 @@ static int32_t doSetInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCt
|
||||||
pCtx[i].currentStage = MAIN_SCAN;
|
pCtx[i].currentStage = MAIN_SCAN;
|
||||||
|
|
||||||
SInputColumnInfoData* pInput = &pCtx[i].input;
|
SInputColumnInfoData* pInput = &pCtx[i].input;
|
||||||
|
pInput->uid = pBlock->info.uid;
|
||||||
|
|
||||||
SExprInfo* pOneExpr = &pOperator->pExpr[i];
|
SExprInfo* pOneExpr = &pOperator->pExpr[i];
|
||||||
for (int32_t j = 0; j < pOneExpr->base.numOfParams; ++j) {
|
for (int32_t j = 0; j < pOneExpr->base.numOfParams; ++j) {
|
||||||
|
@ -1101,7 +1102,9 @@ static int32_t doSetInputDataBlock(SOperatorInfo* pOperator, SqlFunctionCtx* pCt
|
||||||
pInput->pPTS = taosArrayGet(pBlock->pDataBlock, 0); // todo set the correct timestamp column
|
pInput->pPTS = taosArrayGet(pBlock->pDataBlock, 0); // todo set the correct timestamp column
|
||||||
ASSERT(pInput->pData[j] != NULL);
|
ASSERT(pInput->pData[j] != NULL);
|
||||||
} else if (pFuncParam->type == FUNC_PARAM_TYPE_VALUE) {
|
} else if (pFuncParam->type == FUNC_PARAM_TYPE_VALUE) {
|
||||||
if (createDummyCol) {
|
// todo avoid case: top(k, 12), 12 is the value parameter.
|
||||||
|
// sum(11), 11 is also the value parameter.
|
||||||
|
if (createDummyCol && pOneExpr->base.numOfParams == 1) {
|
||||||
code = doCreateConstantValColumnInfo(pInput, pFuncParam, pFuncParam->param.nType, j, pBlock->info.rows);
|
code = doCreateConstantValColumnInfo(pInput, pFuncParam, pFuncParam->param.nType, j, pBlock->info.rows);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
@ -1876,67 +1879,58 @@ SqlFunctionCtx* createSqlFunctionCtx(SExprInfo* pExprInfo, int32_t numOfOutput,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
pCtx->resDataInfo.interBufSize = env.calcMemSize;
|
pCtx->resDataInfo.interBufSize = env.calcMemSize;
|
||||||
} else if (pExpr->pExpr->nodeType == QUERY_NODE_COLUMN || pExpr->pExpr->nodeType == QUERY_NODE_OPERATOR || pExpr->pExpr->nodeType == QUERY_NODE_VALUE) {
|
} else if (pExpr->pExpr->nodeType == QUERY_NODE_COLUMN || pExpr->pExpr->nodeType == QUERY_NODE_OPERATOR ||
|
||||||
pCtx->resDataInfo.interBufSize = pFunct->resSchema.bytes; // for simple column, the intermediate buffer needs to hold one element.
|
pExpr->pExpr->nodeType == QUERY_NODE_VALUE) {
|
||||||
|
// for simple column, the intermediate buffer needs to hold one element.
|
||||||
|
pCtx->resDataInfo.interBufSize = pFunct->resSchema.bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->input.numOfInputCols = pFunct->numOfParams;
|
pCtx->input.numOfInputCols = pFunct->numOfParams;
|
||||||
pCtx->input.pData = taosMemoryCalloc(pFunct->numOfParams, POINTER_BYTES);
|
pCtx->input.pData = taosMemoryCalloc(pFunct->numOfParams, POINTER_BYTES);
|
||||||
pCtx->input.pColumnDataAgg = taosMemoryCalloc(pFunct->numOfParams, POINTER_BYTES);
|
pCtx->input.pColumnDataAgg = taosMemoryCalloc(pFunct->numOfParams, POINTER_BYTES);
|
||||||
|
|
||||||
pCtx->pTsOutput = NULL;
|
pCtx->pTsOutput = NULL;
|
||||||
pCtx->resDataInfo.bytes = pFunct->resSchema.bytes;
|
pCtx->resDataInfo.bytes = pFunct->resSchema.bytes;
|
||||||
pCtx->resDataInfo.type = pFunct->resSchema.type;
|
pCtx->resDataInfo.type = pFunct->resSchema.type;
|
||||||
pCtx->order = TSDB_ORDER_ASC;
|
pCtx->order = TSDB_ORDER_ASC;
|
||||||
pCtx->start.key = INT64_MIN;
|
pCtx->start.key = INT64_MIN;
|
||||||
pCtx->end.key = INT64_MIN;
|
pCtx->end.key = INT64_MIN;
|
||||||
#if 0
|
pCtx->numOfParams = pExpr->base.numOfParams;
|
||||||
for (int32_t j = 0; j < pCtx->numOfParams; ++j) {
|
|
||||||
// int16_t type = pFunct->param[j].nType;
|
|
||||||
// int16_t bytes = pFunct->param[j].nLen;
|
|
||||||
|
|
||||||
// if (type == TSDB_DATA_TYPE_BINARY || type == TSDB_DATA_TYPE_NCHAR) {
|
pCtx->param = pFunct->pParam;
|
||||||
// taosVariantCreateFromBinary(&pCtx->param[j], pFunct->param[j].pz, bytes, type);
|
// for (int32_t j = 0; j < pCtx->numOfParams; ++j) {
|
||||||
// } else {
|
// // set the order information for top/bottom query
|
||||||
// taosVariantCreateFromBinary(&pCtx->param[j], (char *)&pFunct->param[j].i, bytes, type);
|
// int32_t functionId = pCtx->functionId;
|
||||||
|
// if (functionId == FUNCTION_TOP || functionId == FUNCTION_BOTTOM || functionId == FUNCTION_DIFF) {
|
||||||
|
// int32_t f = getExprFunctionId(&pExpr[0]);
|
||||||
|
// assert(f == FUNCTION_TS || f == FUNCTION_TS_DUMMY);
|
||||||
|
//
|
||||||
|
// // pCtx->param[2].i = pQueryAttr->order.order;
|
||||||
|
// // pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
// // pCtx->param[3].i = functionId;
|
||||||
|
// // pCtx->param[3].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
//
|
||||||
|
// // pCtx->param[1].i = pQueryAttr->order.col.info.colId;
|
||||||
|
// } else if (functionId == FUNCTION_INTERP) {
|
||||||
|
// // pCtx->param[2].i = (int8_t)pQueryAttr->fillType;
|
||||||
|
// // if (pQueryAttr->fillVal != NULL) {
|
||||||
|
// // if (isNull((const char *)&pQueryAttr->fillVal[i], pCtx->inputType)) {
|
||||||
|
// // pCtx->param[1].nType = TSDB_DATA_TYPE_NULL;
|
||||||
|
// // } else { // todo refactor, taosVariantCreateFromBinary should handle the NULL value
|
||||||
|
// // if (pCtx->inputType != TSDB_DATA_TYPE_BINARY && pCtx->inputType != TSDB_DATA_TYPE_NCHAR) {
|
||||||
|
// // taosVariantCreateFromBinary(&pCtx->param[1], (char *)&pQueryAttr->fillVal[i], pCtx->inputBytes, pCtx->inputType);
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// // }
|
||||||
|
// } else if (functionId == FUNCTION_TWA) {
|
||||||
|
// // pCtx->param[1].i = pQueryAttr->window.skey;
|
||||||
|
// // pCtx->param[1].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
// // pCtx->param[2].i = pQueryAttr->window.ekey;
|
||||||
|
// // pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
||||||
|
// } else if (functionId == FUNCTION_ARITHM) {
|
||||||
|
// // pCtx->param[1].pz = (char*) getScalarFuncSupport(pRuntimeEnv->scalarSup, i);
|
||||||
// }
|
// }
|
||||||
}
|
// }
|
||||||
|
|
||||||
// set the order information for top/bottom query
|
|
||||||
int32_t functionId = pCtx->functionId;
|
|
||||||
if (functionId == FUNCTION_TOP || functionId == FUNCTION_BOTTOM || functionId == FUNCTION_DIFF) {
|
|
||||||
int32_t f = getExprFunctionId(&pExpr[0]);
|
|
||||||
assert(f == FUNCTION_TS || f == FUNCTION_TS_DUMMY);
|
|
||||||
|
|
||||||
// pCtx->param[2].i = pQueryAttr->order.order;
|
|
||||||
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
|
||||||
pCtx->param[3].i = functionId;
|
|
||||||
pCtx->param[3].nType = TSDB_DATA_TYPE_BIGINT;
|
|
||||||
|
|
||||||
// pCtx->param[1].i = pQueryAttr->order.col.info.colId;
|
|
||||||
} else if (functionId == FUNCTION_INTERP) {
|
|
||||||
// pCtx->param[2].i = (int8_t)pQueryAttr->fillType;
|
|
||||||
// if (pQueryAttr->fillVal != NULL) {
|
|
||||||
// if (isNull((const char *)&pQueryAttr->fillVal[i], pCtx->inputType)) {
|
|
||||||
// pCtx->param[1].nType = TSDB_DATA_TYPE_NULL;
|
|
||||||
// } else { // todo refactor, taosVariantCreateFromBinary should handle the NULL value
|
|
||||||
// if (pCtx->inputType != TSDB_DATA_TYPE_BINARY && pCtx->inputType != TSDB_DATA_TYPE_NCHAR) {
|
|
||||||
// taosVariantCreateFromBinary(&pCtx->param[1], (char *)&pQueryAttr->fillVal[i], pCtx->inputBytes, pCtx->inputType);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
} else if (functionId == FUNCTION_TS_COMP) {
|
|
||||||
// pCtx->param[0].i = pQueryAttr->vgId; //TODO this should be the parameter from client
|
|
||||||
pCtx->param[0].nType = TSDB_DATA_TYPE_BIGINT;
|
|
||||||
} else if (functionId == FUNCTION_TWA) {
|
|
||||||
// pCtx->param[1].i = pQueryAttr->window.skey;
|
|
||||||
pCtx->param[1].nType = TSDB_DATA_TYPE_BIGINT;
|
|
||||||
// pCtx->param[2].i = pQueryAttr->window.ekey;
|
|
||||||
pCtx->param[2].nType = TSDB_DATA_TYPE_BIGINT;
|
|
||||||
} else if (functionId == FUNCTION_ARITHM) {
|
|
||||||
// pCtx->param[1].pz = (char*) getScalarFuncSupport(pRuntimeEnv->scalarSup, i);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 1; i < numOfOutput; ++i) {
|
for (int32_t i = 1; i < numOfOutput; ++i) {
|
||||||
|
@ -1955,7 +1949,7 @@ static void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < numOfOutput; ++i) {
|
for (int32_t i = 0; i < numOfOutput; ++i) {
|
||||||
for (int32_t j = 0; j < pCtx[i].numOfParams; ++j) {
|
for (int32_t j = 0; j < pCtx[i].numOfParams; ++j) {
|
||||||
taosVariantDestroy(&pCtx[i].param[j]);
|
taosVariantDestroy(&pCtx[i].param[j].param);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosVariantDestroy(&pCtx[i].tag);
|
taosVariantDestroy(&pCtx[i].tag);
|
||||||
|
@ -6487,9 +6481,6 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
|
||||||
|
|
||||||
int32_t numOfCols = 0;
|
int32_t numOfCols = 0;
|
||||||
tsdbReaderT pDataReader = doCreateDataReader(pTableScanNode, pHandle, pTableGroupInfo, (uint64_t)queryId, taskId);
|
tsdbReaderT pDataReader = doCreateDataReader(pTableScanNode, pHandle, pTableGroupInfo, (uint64_t)queryId, taskId);
|
||||||
if (pDataReader == NULL) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
SArray* pColList = extractColMatchInfo(pScanPhyNode->pScanCols, pScanPhyNode->node.pOutputDataBlockDesc, &numOfCols);
|
SArray* pColList = extractColMatchInfo(pScanPhyNode->pScanCols, pScanPhyNode->node.pOutputDataBlockDesc, &numOfCols);
|
||||||
SSDataBlock* pResBlock = createResDataBlock(pScanPhyNode->node.pOutputDataBlockDesc);
|
SSDataBlock* pResBlock = createResDataBlock(pScanPhyNode->node.pOutputDataBlockDesc);
|
||||||
|
|
|
@ -410,8 +410,8 @@ static void doHashPartition(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
|
||||||
int32_t contentLen = 0;
|
int32_t contentLen = 0;
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
if (IS_VAR_DATA_TYPE(pColInfoData->info.type)) {
|
||||||
int32_t* offset = pPage + startOffset;
|
int32_t* offset = (int32_t*)((char*)pPage + startOffset);
|
||||||
columnLen = pPage + startOffset + sizeof(int32_t) * pInfo->rowCapacity;
|
columnLen = (char*)pPage + startOffset + sizeof(int32_t) * pInfo->rowCapacity;
|
||||||
char* data = (char*)(columnLen + sizeof(int32_t));
|
char* data = (char*)(columnLen + sizeof(int32_t));
|
||||||
|
|
||||||
if (colDataIsNull_s(pColInfoData, j)) {
|
if (colDataIsNull_s(pColInfoData, j)) {
|
||||||
|
@ -424,8 +424,8 @@ static void doHashPartition(SOperatorInfo* pOperator, SSDataBlock* pBlock) {
|
||||||
contentLen = varDataTLen(src);
|
contentLen = varDataTLen(src);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
char* bitmap = pPage + startOffset;
|
char* bitmap = (char*)pPage + startOffset;
|
||||||
columnLen = pPage + startOffset + BitmapLen(pInfo->rowCapacity);
|
columnLen = (char*)pPage + startOffset + BitmapLen(pInfo->rowCapacity);
|
||||||
char* data = (char*) columnLen + sizeof(int32_t);
|
char* data = (char*) columnLen + sizeof(int32_t);
|
||||||
|
|
||||||
bool isNull = colDataIsNull_f(pColInfoData->nullbitmap, j);
|
bool isNull = colDataIsNull_f(pColInfoData->nullbitmap, j);
|
||||||
|
|
|
@ -319,7 +319,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
|
|
||||||
// The read handle is not initialized yet, since no qualified tables exists
|
// The read handle is not initialized yet, since no qualified tables exists
|
||||||
if (pTableScanInfo->dataReader == NULL) {
|
if (pTableScanInfo->dataReader == NULL || pOperator->status == OP_EXEC_DONE) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -375,10 +375,9 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
return p;
|
return p;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order, int32_t numOfOutput,
|
SOperatorInfo* createTableScanOperatorInfo(void* pDataReader, int32_t order, int32_t numOfOutput, int32_t dataLoadFlag,
|
||||||
int32_t dataLoadFlag, int32_t repeatTime, int32_t reverseTime,
|
int32_t repeatTime, int32_t reverseTime, SArray* pColMatchInfo, SSDataBlock* pResBlock,
|
||||||
SArray* pColMatchInfo, SSDataBlock* pResBlock, SNode* pCondition,
|
SNode* pCondition, SInterval* pInterval, double sampleRatio, SExecTaskInfo* pTaskInfo) {
|
||||||
SInterval* pInterval, double sampleRatio, SExecTaskInfo* pTaskInfo) {
|
|
||||||
assert(repeatTime > 0);
|
assert(repeatTime > 0);
|
||||||
|
|
||||||
STableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableScanInfo));
|
STableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableScanInfo));
|
||||||
|
@ -391,19 +390,19 @@ SOperatorInfo* createTableScanOperatorInfo(void* pTsdbReadHandle, int32_t order,
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->interval = *pInterval;
|
pInfo->interval = *pInterval;
|
||||||
pInfo->sampleRatio = sampleRatio;
|
pInfo->sampleRatio = sampleRatio;
|
||||||
pInfo->dataBlockLoadFlag = dataLoadFlag;
|
pInfo->dataBlockLoadFlag= dataLoadFlag;
|
||||||
pInfo->pResBlock = pResBlock;
|
pInfo->pResBlock = pResBlock;
|
||||||
pInfo->pFilterNode = pCondition;
|
pInfo->pFilterNode = pCondition;
|
||||||
pInfo->dataReader = pTsdbReadHandle;
|
pInfo->dataReader = pDataReader;
|
||||||
pInfo->times = repeatTime;
|
pInfo->times = repeatTime;
|
||||||
pInfo->reverseTimes = reverseTime;
|
pInfo->reverseTimes = reverseTime;
|
||||||
pInfo->order = order;
|
pInfo->order = order;
|
||||||
pInfo->current = 0;
|
pInfo->current = 0;
|
||||||
pInfo->scanFlag = MAIN_SCAN;
|
pInfo->scanFlag = MAIN_SCAN;
|
||||||
pInfo->pColMatchInfo = pColMatchInfo;
|
pInfo->pColMatchInfo = pColMatchInfo;
|
||||||
pOperator->name = "TableScanOperator";
|
pOperator->name = "TableScanOperator";
|
||||||
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
|
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
|
||||||
pOperator->blockingOptr = false;
|
pOperator->blockingOptr = false;
|
||||||
pOperator->status = OP_NOT_OPENED;
|
pOperator->status = OP_NOT_OPENED;
|
||||||
|
@ -677,7 +676,8 @@ static void destroySysScanOperator(void* param, int32_t numOfOutput) {
|
||||||
tsem_destroy(&pInfo->ready);
|
tsem_destroy(&pInfo->ready);
|
||||||
blockDataDestroy(pInfo->pRes);
|
blockDataDestroy(pInfo->pRes);
|
||||||
|
|
||||||
if (pInfo->type == TSDB_MGMT_TABLE_TABLE) {
|
const char* name = tNameGetTableName(&pInfo->name);
|
||||||
|
if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||||
metaCloseTbCursor(pInfo->pCur);
|
metaCloseTbCursor(pInfo->pCur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -812,7 +812,8 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
SSysTableScanInfo* pInfo = pOperator->info;
|
SSysTableScanInfo* pInfo = pOperator->info;
|
||||||
|
|
||||||
// retrieve local table list info from vnode
|
// retrieve local table list info from vnode
|
||||||
if (pInfo->type == TSDB_MGMT_TABLE_TABLE) {
|
const char* name = tNameGetTableName(&pInfo->name);
|
||||||
|
if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||||
if (pInfo->pCur == NULL) {
|
if (pInfo->pCur == NULL) {
|
||||||
pInfo->pCur = metaOpenTbCursor(pInfo->readHandle);
|
pInfo->pCur = metaOpenTbCursor(pInfo->readHandle);
|
||||||
}
|
}
|
||||||
|
@ -864,8 +865,6 @@ static SSDataBlock* doSysTableScan(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
int64_t startTs = taosGetTimestampUs();
|
int64_t startTs = taosGetTimestampUs();
|
||||||
|
|
||||||
pInfo->req.type = pInfo->type;
|
|
||||||
strncpy(pInfo->req.tb, tNameGetTableName(&pInfo->name), tListLen(pInfo->req.tb));
|
strncpy(pInfo->req.tb, tNameGetTableName(&pInfo->name), tListLen(pInfo->req.tb));
|
||||||
|
|
||||||
if (pInfo->showRewrite) {
|
if (pInfo->showRewrite) {
|
||||||
|
@ -947,68 +946,9 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* pSysTableReadHandle, SSDataB
|
||||||
pInfo->pCondition = pCondition;
|
pInfo->pCondition = pCondition;
|
||||||
pInfo->scanCols = colList;
|
pInfo->scanCols = colList;
|
||||||
|
|
||||||
// TODO remove it
|
|
||||||
int32_t tableType = 0;
|
|
||||||
const char* name = tNameGetTableName(pName);
|
|
||||||
if (strncasecmp(name, TSDB_INS_TABLE_DNODES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_DNODE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_MNODES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_MNODE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_MODULES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_MODULE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_QNODES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_QNODE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_BNODES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_BNODE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_SNODES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_SNODE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_CLUSTER, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_CLUSTER;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_DATABASES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_DB;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_FUNCTIONS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_FUNC;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_INDEXES, tListLen(pName->tname)) == 0) {
|
|
||||||
// tableType = TSDB_MGMT_TABLE_INDEX;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_STABLES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_STB;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_STREAMS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_STREAMS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_TABLE;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLE_DISTRIBUTED, tListLen(pName->tname)) == 0) {
|
|
||||||
// tableType = TSDB_MGMT_TABLE_DIST;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_USER_USERS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_USER;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_LICENCES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_GRANTS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_VGROUPS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_VGROUP;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_TOPICS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_TOPICS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_CONSUMERS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_CONSUMERS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_SUBSCRIBES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_SUBSCRIBES;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_TRANS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_TRANS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_SMAS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_SMAS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_CONFIGS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_CONFIGS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_CONNS, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_CONNS;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_QUERIES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_QUERIES;
|
|
||||||
} else if (strncasecmp(name, TSDB_INS_TABLE_VNODES, tListLen(pName->tname)) == 0) {
|
|
||||||
tableType = TSDB_MGMT_TABLE_VNODES;
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
tNameAssign(&pInfo->name, pName);
|
tNameAssign(&pInfo->name, pName);
|
||||||
pInfo->type = tableType;
|
const char* name = tNameGetTableName(&pInfo->name);
|
||||||
if (pInfo->type == TSDB_MGMT_TABLE_TABLE) {
|
if (strncasecmp(name, TSDB_INS_TABLE_USER_TABLES, TSDB_TABLE_FNAME_LEN) == 0) {
|
||||||
pInfo->readHandle = pSysTableReadHandle;
|
pInfo->readHandle = pSysTableReadHandle;
|
||||||
blockDataEnsureCapacity(pInfo->pRes, pInfo->capacity);
|
blockDataEnsureCapacity(pInfo->pRes, pInfo->capacity);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -48,7 +48,7 @@ struct SSHashObj {
|
||||||
};
|
};
|
||||||
|
|
||||||
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
|
static FORCE_INLINE int32_t taosHashCapacity(int32_t length) {
|
||||||
int32_t len = MIN(length, HASH_MAX_CAPACITY);
|
int32_t len = (length < HASH_MAX_CAPACITY ? length : HASH_MAX_CAPACITY);
|
||||||
|
|
||||||
int32_t i = 4;
|
int32_t i = 4;
|
||||||
while (i < len) i = (i << 1u);
|
while (i < len) i = (i << 1u);
|
||||||
|
@ -127,7 +127,7 @@ static void taosHashTableResize(SSHashObj *pHashObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t inc = newCapacity - pHashObj->capacity;
|
size_t inc = newCapacity - pHashObj->capacity;
|
||||||
memset(pNewEntryList + pHashObj->capacity * sizeof(void*), 0, inc);
|
memset((char*)pNewEntryList + pHashObj->capacity * sizeof(void*), 0, inc);
|
||||||
|
|
||||||
pHashObj->hashList = pNewEntryList;
|
pHashObj->hashList = pNewEntryList;
|
||||||
pHashObj->capacity = newCapacity;
|
pHashObj->capacity = newCapacity;
|
||||||
|
@ -301,7 +301,7 @@ size_t tSimpleHashGetMemSize(const SSHashObj *pHashObj) {
|
||||||
|
|
||||||
void *tSimpleHashGetKey(const SSHashObj* pHashObj, void *data, size_t* keyLen) {
|
void *tSimpleHashGetKey(const SSHashObj* pHashObj, void *data, size_t* keyLen) {
|
||||||
int32_t offset = offsetof(SHNode, data);
|
int32_t offset = offsetof(SHNode, data);
|
||||||
SHNode *node = data - offset;
|
SHNode *node = ((SHNode*)(char*)data - offset);
|
||||||
if (keyLen != NULL) {
|
if (keyLen != NULL) {
|
||||||
*keyLen = pHashObj->keyLen;
|
*keyLen = pHashObj->keyLen;
|
||||||
}
|
}
|
||||||
|
|
|
@ -102,7 +102,7 @@ SSDataBlock* getDummyBlock(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
} else if (pInfo->type == data_asc) {
|
} else if (pInfo->type == data_asc) {
|
||||||
v = ++pInfo->startVal;
|
v = ++pInfo->startVal;
|
||||||
} else if (pInfo->type == data_rand) {
|
} else if (pInfo->type == data_rand) {
|
||||||
v = random();
|
v = taosRand();
|
||||||
}
|
}
|
||||||
|
|
||||||
colDataAppend(pColInfo, i, reinterpret_cast<const char*>(&v), false);
|
colDataAppend(pColInfo, i, reinterpret_cast<const char*>(&v), false);
|
||||||
|
@ -172,7 +172,7 @@ SSDataBlock* get2ColsDummyBlock(SOperatorInfo* pOperator, bool* newgroup) {
|
||||||
} else if (pInfo->type == data_asc) {
|
} else if (pInfo->type == data_asc) {
|
||||||
v = ++pInfo->startVal;
|
v = ++pInfo->startVal;
|
||||||
} else if (pInfo->type == data_rand) {
|
} else if (pInfo->type == data_rand) {
|
||||||
v = random();
|
v = taosRand();
|
||||||
}
|
}
|
||||||
|
|
||||||
colDataAppend(pColInfo1, i, reinterpret_cast<const char*>(&v), false);
|
colDataAppend(pColInfo1, i, reinterpret_cast<const char*>(&v), false);
|
||||||
|
@ -938,7 +938,7 @@ TEST(testCase, build_executor_tree_Test) {
|
||||||
|
|
||||||
SExecTaskInfo* pTaskInfo = nullptr;
|
SExecTaskInfo* pTaskInfo = nullptr;
|
||||||
DataSinkHandle sinkHandle = nullptr;
|
DataSinkHandle sinkHandle = nullptr;
|
||||||
SReadHandle handle = {.reader = reinterpret_cast<void*>(0x1), .meta = reinterpret_cast<void*>(0x1)};
|
SReadHandle handle = { reinterpret_cast<void*>(0x1), reinterpret_cast<void*>(0x1), NULL };
|
||||||
|
|
||||||
struct SSubplan *plan = NULL;
|
struct SSubplan *plan = NULL;
|
||||||
int32_t code = qStringToSubplan(msg, &plan);
|
int32_t code = qStringToSubplan(msg, &plan);
|
||||||
|
|
|
@ -47,6 +47,9 @@ target_include_directories(
|
||||||
"${TD_SOURCE_DIR}/include/os"
|
"${TD_SOURCE_DIR}/include/os"
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
)
|
)
|
||||||
|
target_link_libraries(
|
||||||
|
udf1 PUBLIC os
|
||||||
|
)
|
||||||
|
|
||||||
#SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/build/bin)
|
#SET(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/build/bin)
|
||||||
add_executable(udfd src/udfd.c)
|
add_executable(udfd src/udfd.c)
|
||||||
|
|
|
@ -58,6 +58,9 @@ bool getFirstLastFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv);
|
||||||
int32_t firstFunction(SqlFunctionCtx *pCtx);
|
int32_t firstFunction(SqlFunctionCtx *pCtx);
|
||||||
int32_t lastFunction(SqlFunctionCtx *pCtx);
|
int32_t lastFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
|
bool getTopBotFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv);
|
||||||
|
int32_t topFunction(SqlFunctionCtx *pCtx);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,41 +27,31 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define UDF_LISTEN_PIPE_NAME_LEN 32
|
#define UDF_LISTEN_PIPE_NAME_LEN 32
|
||||||
#define UDF_LISTEN_PIPE_NAME_PREFIX "udf.sock."
|
#define UDF_LISTEN_PIPE_NAME_PREFIX "udfd.sock."
|
||||||
|
|
||||||
//======================================================================================
|
//======================================================================================
|
||||||
//begin API to taosd and qworker
|
//begin API to taosd and qworker
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
UDFC_CODE_STOPPING = -1,
|
UDFC_CODE_STOPPING = -1,
|
||||||
UDFC_CODE_RESTARTING = -2,
|
|
||||||
UDFC_CODE_PIPE_READ_ERR = -3,
|
UDFC_CODE_PIPE_READ_ERR = -3,
|
||||||
};
|
};
|
||||||
|
|
||||||
/*TODO: no api for dnode startudfd/stopudfd*/
|
typedef void *UdfcHandle;
|
||||||
/**
|
typedef void *UdfcFuncHandle;
|
||||||
* start udfd dameon service
|
|
||||||
*/
|
|
||||||
int32_t startUdfd(int32_t dnodeId);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* stop udfd dameon service
|
|
||||||
*/
|
|
||||||
int32_t stopUdfd(int32_t dnodeId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create udfd proxy, called once in process that call setupUdf/callUdfxxx/teardownUdf
|
* create udfd proxy, called once in process that call setupUdf/callUdfxxx/teardownUdf
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t createUdfdProxy(int32_t dnodeId);
|
int32_t udfcOpen(int32_t dnodeId, UdfcHandle* proxyHandle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* destroy udfd proxy
|
* destroy udfd proxy
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t destroyUdfdProxy(int32_t dnodeId);
|
int32_t udfcClose(UdfcHandle proxyhandle);
|
||||||
|
|
||||||
typedef void *UdfHandle;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* setup udf
|
* setup udf
|
||||||
|
@ -69,7 +59,7 @@ typedef void *UdfHandle;
|
||||||
* @param handle, out
|
* @param handle, out
|
||||||
* @return error code
|
* @return error code
|
||||||
*/
|
*/
|
||||||
int32_t setupUdf(char udfName[], SEpSet *epSet, UdfHandle *handle);
|
int32_t setupUdf(UdfcHandle proxyHandle, char udfName[], SEpSet *epSet, UdfcFuncHandle *handle);
|
||||||
|
|
||||||
typedef struct SUdfColumnMeta {
|
typedef struct SUdfColumnMeta {
|
||||||
int16_t type;
|
int16_t type;
|
||||||
|
@ -116,26 +106,26 @@ typedef struct SUdfInterBuf {
|
||||||
} SUdfInterBuf;
|
} SUdfInterBuf;
|
||||||
|
|
||||||
// output: interBuf
|
// output: interBuf
|
||||||
int32_t callUdfAggInit(UdfHandle handle, SUdfInterBuf *interBuf);
|
int32_t callUdfAggInit(UdfcFuncHandle handle, SUdfInterBuf *interBuf);
|
||||||
// input: block, state
|
// input: block, state
|
||||||
// output: newState
|
// output: newState
|
||||||
int32_t callUdfAggProcess(UdfHandle handle, SSDataBlock *block, SUdfInterBuf *state, SUdfInterBuf *newState);
|
int32_t callUdfAggProcess(UdfcFuncHandle handle, SSDataBlock *block, SUdfInterBuf *state, SUdfInterBuf *newState);
|
||||||
// input: interBuf
|
// input: interBuf
|
||||||
// output: resultData
|
// output: resultData
|
||||||
int32_t callUdfAggFinalize(UdfHandle handle, SUdfInterBuf *interBuf, SUdfInterBuf *resultData);
|
int32_t callUdfAggFinalize(UdfcFuncHandle handle, SUdfInterBuf *interBuf, SUdfInterBuf *resultData);
|
||||||
// input: interbuf1, interbuf2
|
// input: interbuf1, interbuf2
|
||||||
// output: resultBuf
|
// output: resultBuf
|
||||||
int32_t callUdfAggMerge(UdfHandle handle, SUdfInterBuf *interBuf1, SUdfInterBuf *interBuf2, SUdfInterBuf *resultBuf);
|
int32_t callUdfAggMerge(UdfcFuncHandle handle, SUdfInterBuf *interBuf1, SUdfInterBuf *interBuf2, SUdfInterBuf *resultBuf);
|
||||||
// input: block
|
// input: block
|
||||||
// output: resultData
|
// output: resultData
|
||||||
int32_t callUdfScalaProcess(UdfHandle handle, SSDataBlock *block, SSDataBlock *resultData);
|
int32_t callUdfScalaProcess(UdfcFuncHandle handle, SSDataBlock *block, SSDataBlock *resultData);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* tearn down udf
|
* tearn down udf
|
||||||
* @param handle
|
* @param handle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t teardownUdf(UdfHandle handle);
|
int32_t teardownUdf(UdfcFuncHandle handle);
|
||||||
|
|
||||||
// end API to taosd and qworker
|
// end API to taosd and qworker
|
||||||
//=============================================================================================================================
|
//=============================================================================================================================
|
||||||
|
|
|
@ -69,6 +69,9 @@ typedef struct SUdfTeardownRequest {
|
||||||
|
|
||||||
|
|
||||||
typedef struct SUdfTeardownResponse {
|
typedef struct SUdfTeardownResponse {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
} SUdfTeardownResponse;
|
} SUdfTeardownResponse;
|
||||||
|
|
||||||
typedef struct SUdfRequest {
|
typedef struct SUdfRequest {
|
||||||
|
|
|
@ -30,20 +30,20 @@ typedef struct SUdfInfo {
|
||||||
char *path;
|
char *path;
|
||||||
} SUdfInfo;
|
} SUdfInfo;
|
||||||
|
|
||||||
typedef void *UdfHandle;
|
typedef void *UdfcFuncHandle;
|
||||||
|
|
||||||
int32_t createUdfdProxy();
|
int32_t createUdfdProxy();
|
||||||
|
|
||||||
int32_t destroyUdfdProxy();
|
int32_t destroyUdfdProxy();
|
||||||
|
|
||||||
//int32_t setupUdf(SUdfInfo *udf, int32_t numOfUdfs, UdfHandle *handles);
|
//int32_t setupUdf(SUdfInfo *udf, int32_t numOfUdfs, UdfcFuncHandle *handles);
|
||||||
|
|
||||||
int32_t setupUdf(SUdfInfo* udf, UdfHandle* handle);
|
int32_t setupUdf(SUdfInfo* udf, UdfcFuncHandle* handle);
|
||||||
|
|
||||||
int32_t callUdf(UdfHandle handle, int8_t step, char *state, int32_t stateSize, SSDataBlock input, char **newstate,
|
int32_t callUdf(UdfcFuncHandle handle, int8_t step, char *state, int32_t stateSize, SSDataBlock input, char **newstate,
|
||||||
int32_t *newStateSize, SSDataBlock *output);
|
int32_t *newStateSize, SSDataBlock *output);
|
||||||
|
|
||||||
int32_t teardownUdf(UdfHandle handle);
|
int32_t teardownUdf(UdfcFuncHandle handle);
|
||||||
|
|
||||||
typedef struct SUdfSetupRequest {
|
typedef struct SUdfSetupRequest {
|
||||||
char udfName[16]; //
|
char udfName[16]; //
|
||||||
|
@ -84,6 +84,9 @@ typedef struct SUdfTeardownRequest {
|
||||||
|
|
||||||
|
|
||||||
typedef struct SUdfTeardownResponse {
|
typedef struct SUdfTeardownResponse {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
} SUdfTeardownResponse;
|
} SUdfTeardownResponse;
|
||||||
|
|
||||||
typedef struct SUdfRequest {
|
typedef struct SUdfRequest {
|
||||||
|
|
|
@ -193,8 +193,15 @@ static int32_t translateApercentile(SFunctionNode* pFunc, char* pErrBuf, int32_t
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t translateTbnameColumn(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
|
// pseudo column do not need to check parameters
|
||||||
|
pFunc->node.resType = (SDataType){.bytes = TSDB_TABLE_FNAME_LEN - 1 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR};
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t translateTop(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
static int32_t translateTop(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
|
||||||
// todo
|
SDataType* pType = &((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType;
|
||||||
|
pFunc->node.resType = (SDataType){.bytes = pType->bytes, .type = pType->type};
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -497,9 +504,9 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.type = FUNCTION_TYPE_TOP,
|
.type = FUNCTION_TYPE_TOP,
|
||||||
.classification = FUNC_MGT_AGG_FUNC,
|
.classification = FUNC_MGT_AGG_FUNC,
|
||||||
.translateFunc = translateTop,
|
.translateFunc = translateTop,
|
||||||
.getEnvFunc = getMinmaxFuncEnv,
|
.getEnvFunc = getTopBotFuncEnv,
|
||||||
.initFunc = maxFunctionSetup,
|
.initFunc = functionSetup,
|
||||||
.processFunc = maxFunction,
|
.processFunc = topFunction,
|
||||||
.finalizeFunc = functionFinalize
|
.finalizeFunc = functionFinalize
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -876,7 +883,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
.name = "tbname",
|
.name = "tbname",
|
||||||
.type = FUNCTION_TYPE_TBNAME,
|
.type = FUNCTION_TYPE_TBNAME,
|
||||||
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC,
|
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC,
|
||||||
.translateFunc = NULL,
|
.translateFunc = translateTbnameColumn,
|
||||||
.getEnvFunc = NULL,
|
.getEnvFunc = NULL,
|
||||||
.initFunc = NULL,
|
.initFunc = NULL,
|
||||||
.sprocessFunc = NULL,
|
.sprocessFunc = NULL,
|
||||||
|
@ -914,7 +921,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
.name = "_wendts",
|
.name = "_wendts",
|
||||||
.type = FUNCTION_TYPE_QENDTS,
|
.type = FUNCTION_TYPE_WENDTS,
|
||||||
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
|
.classification = FUNC_MGT_PSEUDO_COLUMN_FUNC | FUNC_MGT_WINDOW_PC_FUNC,
|
||||||
.translateFunc = translateTimePseudoColumn,
|
.translateFunc = translateTimePseudoColumn,
|
||||||
.getEnvFunc = getTimePseudoFuncEnv,
|
.getEnvFunc = getTimePseudoFuncEnv,
|
||||||
|
|
|
@ -14,10 +14,11 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "builtinsimpl.h"
|
#include "builtinsimpl.h"
|
||||||
#include "tpercentile.h"
|
#include <libs/nodes/querynodes.h>
|
||||||
#include "querynodes.h"
|
#include "querynodes.h"
|
||||||
#include "taggfunction.h"
|
#include "taggfunction.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
#include "tpercentile.h"
|
||||||
|
|
||||||
#define SET_VAL(_info, numOfElem, res) \
|
#define SET_VAL(_info, numOfElem, res) \
|
||||||
do { \
|
do { \
|
||||||
|
@ -472,17 +473,6 @@ int32_t maxFunction(SqlFunctionCtx *pCtx) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct STopBotRes {
|
|
||||||
int32_t num;
|
|
||||||
} STopBotRes;
|
|
||||||
|
|
||||||
bool getTopBotFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
|
||||||
SColumnNode* pColNode = (SColumnNode*) nodesListGetNode(pFunc->pParameterList, 0);
|
|
||||||
int32_t bytes = pColNode->node.resType.bytes;
|
|
||||||
SValueNode* pkNode = (SValueNode*) nodesListGetNode(pFunc->pParameterList, 1);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct SStddevRes {
|
typedef struct SStddevRes {
|
||||||
double result;
|
double result;
|
||||||
int64_t count;
|
int64_t count;
|
||||||
|
@ -523,7 +513,7 @@ int32_t stddevFunction(SqlFunctionCtx* pCtx) {
|
||||||
switch (type) {
|
switch (type) {
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t* plist = (int8_t*)pCol->pData;
|
int8_t* plist = (int8_t*)pCol->pData;
|
||||||
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
|
for (int32_t i = start; i < numOfRows + start; ++i) {
|
||||||
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -749,9 +739,9 @@ int32_t percentileFunction(SqlFunctionCtx *pCtx) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO set the correct parameter.
|
|
||||||
void percentileFinalize(SqlFunctionCtx* pCtx) {
|
void percentileFinalize(SqlFunctionCtx* pCtx) {
|
||||||
double v = 50;//pCtx->param[0].nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].i64 : pCtx->param[0].dKey;
|
SVariant* pVal = &pCtx->param[1].param;
|
||||||
|
double v = pVal->nType == TSDB_DATA_TYPE_INT ? pVal->i : pVal->d;
|
||||||
|
|
||||||
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -1173,3 +1163,130 @@ int32_t diffFunction(SqlFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
typedef struct STopBotResItem {
|
||||||
|
SVariant v;
|
||||||
|
uint64_t uid; // it is a table uid, used to extract tag data during building of the final result for the tag data
|
||||||
|
struct {
|
||||||
|
int32_t pageId;
|
||||||
|
int32_t offset;
|
||||||
|
} tuplePos; // tuple data of this chosen row
|
||||||
|
} STopBotResItem;
|
||||||
|
|
||||||
|
typedef struct STopBotRes {
|
||||||
|
int32_t num;
|
||||||
|
STopBotResItem *pItems;
|
||||||
|
} STopBotRes;
|
||||||
|
|
||||||
|
bool getTopBotFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
|
||||||
|
SColumnNode* pColNode = (SColumnNode*) nodesListGetNode(pFunc->pParameterList, 0);
|
||||||
|
int32_t bytes = pColNode->node.resType.bytes;
|
||||||
|
SValueNode* pkNode = (SValueNode*) nodesListGetNode(pFunc->pParameterList, 1);
|
||||||
|
|
||||||
|
pEnv->calcMemSize = sizeof(STopBotRes) + pkNode->datum.i * bytes;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
static STopBotRes *getTopBotOutputInfo(SqlFunctionCtx *pCtx) {
|
||||||
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
STopBotRes* pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
pRes->pItems = (STopBotResItem*)((char*) pRes + sizeof(STopBotRes));
|
||||||
|
|
||||||
|
return pRes;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void doAddIntoResult(STopBotRes *pRes, int32_t maxSize, void *pData, uint16_t type, uint64_t uid);
|
||||||
|
|
||||||
|
int32_t topFunction(SqlFunctionCtx *pCtx) {
|
||||||
|
int32_t numOfElems = 0;
|
||||||
|
|
||||||
|
STopBotRes *pRes = getTopBotOutputInfo(pCtx);
|
||||||
|
assert(pRes->num >= 0);
|
||||||
|
|
||||||
|
// if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotRes) + POINTER_BYTES * pCtx->param[0].i)) {
|
||||||
|
// buildTopBotStruct(pRes, pCtx);
|
||||||
|
// }
|
||||||
|
|
||||||
|
SInputColumnInfoData* pInput = &pCtx->input;
|
||||||
|
SColumnInfoData* pCol = pInput->pData[0];
|
||||||
|
|
||||||
|
int32_t type = pInput->pData[0]->info.type;
|
||||||
|
|
||||||
|
int32_t start = pInput->startRowIndex;
|
||||||
|
int32_t numOfRows = pInput->numOfRows;
|
||||||
|
|
||||||
|
for (int32_t i = start; i < numOfRows + start; ++i) {
|
||||||
|
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
numOfElems++;
|
||||||
|
|
||||||
|
char* data = colDataGetData(pCol, i);
|
||||||
|
doAddIntoResult(pRes, pCtx->param[1].param.i, data, type, pInput->uid);
|
||||||
|
}
|
||||||
|
|
||||||
|
// treat the result as only one result
|
||||||
|
SET_VAL(GET_RES_INFO(pCtx), numOfElems, 1);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t topBotResComparFn(const void *p1, const void *p2, const void *param) {
|
||||||
|
uint16_t type = *(uint16_t *) param;
|
||||||
|
|
||||||
|
STopBotResItem *val1 = (STopBotResItem *) p1;
|
||||||
|
STopBotResItem *val2 = (STopBotResItem *) p2;
|
||||||
|
|
||||||
|
if (IS_SIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (val1->v.i == val2->v.i) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val1->v.i > val2->v.i) ? 1 : -1;
|
||||||
|
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
|
||||||
|
if (val1->v.u == val2->v.u) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val1->v.u > val2->v.u) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (val1->v.d == val2->v.d) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (val1->v.d > val2->v.d) ? 1 : -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
void doAddIntoResult(STopBotRes *pRes, int32_t maxSize, void *pData, uint16_t type, uint64_t uid) {
|
||||||
|
SVariant val = {0};
|
||||||
|
taosVariantCreateFromBinary(&val, pData, tDataTypes[type].bytes, type);
|
||||||
|
|
||||||
|
STopBotResItem *pItems = pRes->pItems;
|
||||||
|
assert(pItems != NULL);
|
||||||
|
|
||||||
|
// not full yet
|
||||||
|
if (pRes->num < maxSize) {
|
||||||
|
STopBotResItem* pItem = &pItems[pRes->num];
|
||||||
|
pItem->v = val;
|
||||||
|
pItem->uid = uid;
|
||||||
|
pItem->tuplePos.pageId = -1; // todo set the corresponding tuple data in the disk-based buffer
|
||||||
|
|
||||||
|
pRes->num++;
|
||||||
|
taosheapsort((void *) pItem, sizeof(STopBotResItem), pRes->num, (const void *) &type, topBotResComparFn, false);
|
||||||
|
} else { // replace the minimum value in the result
|
||||||
|
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)) {
|
||||||
|
STopBotResItem* pItem = &pItems[pRes->num];
|
||||||
|
pItem->v = val;
|
||||||
|
pItem->uid = uid;
|
||||||
|
pItem->tuplePos.pageId = -1; // todo set the corresponding tuple data in the disk-based buffer
|
||||||
|
|
||||||
|
taosheapadjust((void *) pItem, sizeof(STopBotResItem), 0, pRes->num - 1, (const void *) &type, topBotResComparFn, NULL, false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void topBotFinalize(SqlFunctionCtx* pCtx) {
|
||||||
|
functionFinalize(pCtx);
|
||||||
|
|
||||||
|
}
|
|
@ -29,6 +29,7 @@ typedef struct SFuncMgtService {
|
||||||
|
|
||||||
typedef struct SUdfInfo {
|
typedef struct SUdfInfo {
|
||||||
SDataType outputDt;
|
SDataType outputDt;
|
||||||
|
int8_t funcType;
|
||||||
} SUdfInfo;
|
} SUdfInfo;
|
||||||
|
|
||||||
static SFuncMgtService gFunMgtService;
|
static SFuncMgtService gFunMgtService;
|
||||||
|
@ -52,30 +53,41 @@ static void doInitFunctionTable() {
|
||||||
gFunMgtService.pUdfTable = NULL;
|
gFunMgtService.pUdfTable = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int8_t getUdfType(int32_t funcId) {
|
||||||
|
SUdfInfo* pUdf = taosArrayGet(gFunMgtService.pUdfTable, funcId - FUNC_UDF_ID_START_OFFSET_VAL - 1);
|
||||||
|
return pUdf->funcType;
|
||||||
|
}
|
||||||
|
|
||||||
static bool isSpecificClassifyFunc(int32_t funcId, uint64_t classification) {
|
static bool isSpecificClassifyFunc(int32_t funcId, uint64_t classification) {
|
||||||
|
if (fmIsUserDefinedFunc(funcId)) {
|
||||||
|
return getUdfType(funcId);
|
||||||
|
}
|
||||||
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
if (funcId < 0 || funcId >= funcMgtBuiltinsNum) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return FUNC_MGT_TEST_MASK(funcMgtBuiltins[funcId].classification, classification);
|
return FUNC_MGT_TEST_MASK(funcMgtBuiltins[funcId].classification, classification);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getUdfId(const char* pFuncName) {
|
static int32_t getUdfId(SFmGetFuncInfoParam* pParam, const char* pFuncName) {
|
||||||
// todo: udf by call catalog
|
SFuncInfo* pInfo = NULL;
|
||||||
if (1) {
|
int32_t code = catalogGetUdfInfo(pParam->pCtg, pParam->pRpc, pParam->pMgmtEps, pFuncName, &pInfo);
|
||||||
|
if (TSDB_CODE_SUCCESS != code || NULL == pInfo) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (NULL == gFunMgtService.pUdfTable) {
|
if (NULL == gFunMgtService.pUdfTable) {
|
||||||
gFunMgtService.pUdfTable = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SUdfInfo));
|
gFunMgtService.pUdfTable = taosArrayInit(TARRAY_MIN_SIZE, sizeof(SUdfInfo));
|
||||||
}
|
}
|
||||||
SUdfInfo info = {0}; //todo
|
SUdfInfo info = { .outputDt.type = pInfo->outputType, .outputDt.bytes = pInfo->outputLen, .funcType = pInfo->funcType };
|
||||||
taosArrayPush(gFunMgtService.pUdfTable, &info);
|
taosArrayPush(gFunMgtService.pUdfTable, &info);
|
||||||
|
tFreeSFuncInfo(pInfo);
|
||||||
|
taosMemoryFree(pInfo);
|
||||||
return taosArrayGetSize(gFunMgtService.pUdfTable) + FUNC_UDF_ID_START_OFFSET_VAL;
|
return taosArrayGetSize(gFunMgtService.pUdfTable) + FUNC_UDF_ID_START_OFFSET_VAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getFuncId(const char* pFuncName) {
|
static int32_t getFuncId(SFmGetFuncInfoParam* pParam, const char* pFuncName) {
|
||||||
void* pVal = taosHashGet(gFunMgtService.pFuncNameHashTable, pFuncName, strlen(pFuncName));
|
void* pVal = taosHashGet(gFunMgtService.pFuncNameHashTable, pFuncName, strlen(pFuncName));
|
||||||
if (NULL == pVal) {
|
if (NULL == pVal) {
|
||||||
return getUdfId(pFuncName);
|
return getUdfId(pParam, pFuncName);
|
||||||
}
|
}
|
||||||
return *(int32_t*)pVal;
|
return *(int32_t*)pVal;
|
||||||
}
|
}
|
||||||
|
@ -91,8 +103,8 @@ int32_t fmFuncMgtInit() {
|
||||||
return initFunctionCode;
|
return initFunctionCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t fmGetFuncInfo(const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType) {
|
int32_t fmGetFuncInfo(SFmGetFuncInfoParam* pParam, const char* pFuncName, int32_t* pFuncId, int32_t* pFuncType) {
|
||||||
*pFuncId = getFuncId(pFuncName);
|
*pFuncId = getFuncId(pParam, pFuncName);
|
||||||
if (*pFuncId < 0) {
|
if (*pFuncId < 0) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
|
@ -765,9 +765,9 @@ static int32_t firstFuncRequired(SqlFunctionCtx *pCtx, STimeWindow* w, int32_t c
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t lastFuncRequired(SqlFunctionCtx *pCtx, STimeWindow* w, int32_t colId) {
|
static int32_t lastFuncRequired(SqlFunctionCtx *pCtx, STimeWindow* w, int32_t colId) {
|
||||||
if (pCtx->order != pCtx->param[0].i) {
|
// if (pCtx->order != pCtx->param[0].param.i) {
|
||||||
return BLK_DATA_NOT_LOAD;
|
// return BLK_DATA_NOT_LOAD;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (GET_RES_INFO(pCtx) == NULL || GET_RES_INFO(pCtx)->numOfRes <= 0) {
|
if (GET_RES_INFO(pCtx) == NULL || GET_RES_INFO(pCtx)->numOfRes <= 0) {
|
||||||
return BLK_DATA_DATA_LOAD;
|
return BLK_DATA_DATA_LOAD;
|
||||||
|
@ -797,9 +797,9 @@ static int32_t firstDistFuncRequired(SqlFunctionCtx *pCtx, STimeWindow* w, int32
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t lastDistFuncRequired(SqlFunctionCtx *pCtx, STimeWindow* w, int32_t colId) {
|
static int32_t lastDistFuncRequired(SqlFunctionCtx *pCtx, STimeWindow* w, int32_t colId) {
|
||||||
if (pCtx->order != pCtx->param[0].i) {
|
// if (pCtx->order != pCtx->param[0].param.i) {
|
||||||
return BLK_DATA_NOT_LOAD;
|
// return BLK_DATA_NOT_LOAD;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// not initialized yet, it is the first block, load it.
|
// not initialized yet, it is the first block, load it.
|
||||||
if (pCtx->pOutput == NULL) {
|
if (pCtx->pOutput == NULL) {
|
||||||
|
@ -1261,128 +1261,6 @@ int32_t tsCompare(const void* p1, const void* p2) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void stddev_dst_function(SqlFunctionCtx *pCtx) {
|
|
||||||
SStddevdstInfo *pStd = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
|
|
||||||
|
|
||||||
// the second stage to calculate standard deviation
|
|
||||||
double *retVal = &pStd->res;
|
|
||||||
|
|
||||||
// all data are null, no need to proceed
|
|
||||||
SArray* resList = (SArray*) pCtx->param[0].pz;
|
|
||||||
if (resList == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// find the correct group average results according to the tag value
|
|
||||||
int32_t len = (int32_t) taosArrayGetSize(resList);
|
|
||||||
assert(len > 0);
|
|
||||||
|
|
||||||
double avg = 0;
|
|
||||||
if (len == 1) {
|
|
||||||
SResPair* p = taosArrayGet(resList, 0);
|
|
||||||
avg = p->avg;
|
|
||||||
} else { // todo opt performance by using iterator since the timestamp lsit is matched with the output result
|
|
||||||
SResPair* p = bsearch(&pCtx->startTs, resList->pData, len, sizeof(SResPair), tsCompare);
|
|
||||||
if (p == NULL) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
avg = p->avg;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *pData = GET_INPUT_DATA_LIST(pCtx);
|
|
||||||
int32_t num = 0;
|
|
||||||
|
|
||||||
switch (pCtx->inputType) {
|
|
||||||
case TSDB_DATA_TYPE_INT: {
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
|
||||||
if (pCtx->hasNull && isNull((const char*) (&((int32_t *)pData)[i]), pCtx->inputType)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
num += 1;
|
|
||||||
*retVal += TPOW2(((int32_t *)pData)[i] - avg);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
|
||||||
LOOP_STDDEV_IMPL(float, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
|
||||||
LOOP_STDDEV_IMPL(double, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
|
||||||
LOOP_STDDEV_IMPL(int8_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_UTINYINT: {
|
|
||||||
LOOP_STDDEV_IMPL(int8_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
|
||||||
LOOP_STDDEV_IMPL(int16_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT: {
|
|
||||||
LOOP_STDDEV_IMPL(uint16_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_UINT: {
|
|
||||||
LOOP_STDDEV_IMPL(uint32_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
|
||||||
LOOP_STDDEV_IMPL(int64_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT: {
|
|
||||||
LOOP_STDDEV_IMPL(uint64_t, *retVal, pData, pCtx, avg, pCtx->inputType, num);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
// qError("stddev function not support data type:%d", pCtx->inputType);
|
|
||||||
}
|
|
||||||
|
|
||||||
pStd->num += num;
|
|
||||||
SET_VAL(pCtx, num, 1);
|
|
||||||
|
|
||||||
// copy to the final output buffer for super table
|
|
||||||
memcpy(pCtx->pOutput, GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx)), sizeof(SAvgInfo));
|
|
||||||
}
|
|
||||||
|
|
||||||
static void stddev_dst_merge(SqlFunctionCtx *pCtx) {
|
|
||||||
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
|
||||||
SStddevdstInfo* pRes = GET_ROWCELL_INTERBUF(pResInfo);
|
|
||||||
|
|
||||||
char *input = GET_INPUT_DATA_LIST(pCtx);
|
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i, input += pCtx->inputBytes) {
|
|
||||||
SStddevdstInfo *pInput = (SStddevdstInfo *)input;
|
|
||||||
if (pInput->num == 0) { // current input is null
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
pRes->num += pInput->num;
|
|
||||||
pRes->res += pInput->res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void stddev_dst_finalizer(SqlFunctionCtx *pCtx) {
|
|
||||||
SStddevdstInfo *pStd = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
|
|
||||||
|
|
||||||
if (pStd->num <= 0) {
|
|
||||||
setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
|
||||||
} else {
|
|
||||||
double *retValue = (double *)pCtx->pOutput;
|
|
||||||
SET_DOUBLE_VAL(retValue, sqrt(pStd->res / pStd->num));
|
|
||||||
SET_VAL(pCtx, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
doFinalizer(pCtx);
|
|
||||||
}
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
static bool first_last_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
static bool first_last_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResInfo) {
|
||||||
if (!function_setup(pCtx, pResInfo)) {
|
if (!function_setup(pCtx, pResInfo)) {
|
||||||
|
@ -1390,8 +1268,8 @@ static bool first_last_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInfo*
|
||||||
}
|
}
|
||||||
|
|
||||||
// used to keep the timestamp for comparison
|
// used to keep the timestamp for comparison
|
||||||
pCtx->param[1].nType = 0;
|
// pCtx->param[1].param.nType = 0;
|
||||||
pCtx->param[1].i = 0;
|
// pCtx->param[1].param.i = 0;
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1487,13 +1365,13 @@ static void first_dist_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// The param[1] is used to keep the initial value of max ts value
|
// The param[1] is used to keep the initial value of max ts value
|
||||||
if (pCtx->param[1].nType != pCtx->resDataInfo.type || pCtx->param[1].i > pInput->ts) {
|
// if (pCtx->param[1].param.nType != pCtx->resDataInfo.type || pCtx->param[1].param.i > pInput->ts) {
|
||||||
memcpy(pCtx->pOutput, pData, pCtx->resDataInfo.bytes);
|
// memcpy(pCtx->pOutput, pData, pCtx->resDataInfo.bytes);
|
||||||
pCtx->param[1].i = pInput->ts;
|
// pCtx->param[1].param.i = pInput->ts;
|
||||||
pCtx->param[1].nType = pCtx->resDataInfo.type;
|
// pCtx->param[1].param.nType = pCtx->resDataInfo.type;
|
||||||
|
//
|
||||||
// DO_UPDATE_TAG_COLUMNS(pCtx, pInput->ts);
|
//// DO_UPDATE_TAG_COLUMNS(pCtx, pInput->ts);
|
||||||
}
|
// }
|
||||||
|
|
||||||
SET_VAL(pCtx, 1, 1);
|
SET_VAL(pCtx, 1, 1);
|
||||||
// GET_RES_INFO(pCtx)->hasResult = DATA_SET_FLAG;
|
// GET_RES_INFO(pCtx)->hasResult = DATA_SET_FLAG;
|
||||||
|
@ -1508,9 +1386,9 @@ static void first_dist_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
* least one data in this block that is not null.(TODO opt for this case)
|
* least one data in this block that is not null.(TODO opt for this case)
|
||||||
*/
|
*/
|
||||||
static void last_function(SqlFunctionCtx *pCtx) {
|
static void last_function(SqlFunctionCtx *pCtx) {
|
||||||
if (pCtx->order != pCtx->param[0].i) {
|
// if (pCtx->order != pCtx->param[0].param.i) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
|
||||||
|
@ -1582,9 +1460,9 @@ static void last_dist_function(SqlFunctionCtx *pCtx) {
|
||||||
* 1. for scan data is not the required order
|
* 1. for scan data is not the required order
|
||||||
* 2. for data blocks that are not loaded, no need to check data
|
* 2. for data blocks that are not loaded, no need to check data
|
||||||
*/
|
*/
|
||||||
if (pCtx->order != pCtx->param[0].i) {
|
// if (pCtx->order != pCtx->param[0].param.i) {
|
||||||
return;
|
// return;
|
||||||
}
|
// }
|
||||||
|
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
for (int32_t i = pCtx->size - 1; i >= 0; --i) {
|
for (int32_t i = pCtx->size - 1; i >= 0; --i) {
|
||||||
|
@ -1624,10 +1502,10 @@ static void last_dist_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
* param[1] used to keep the corresponding timestamp to decide if current result is
|
* param[1] used to keep the corresponding timestamp to decide if current result is
|
||||||
* the true last result
|
* the true last result
|
||||||
*/
|
*/
|
||||||
if (pCtx->param[1].nType != pCtx->resDataInfo.type || pCtx->param[1].i < pInput->ts) {
|
if (pCtx->param[1].param.nType != pCtx->resDataInfo.type || pCtx->param[1].param.i < pInput->ts) {
|
||||||
memcpy(pCtx->pOutput, pData, pCtx->resDataInfo.bytes);
|
memcpy(pCtx->pOutput, pData, pCtx->resDataInfo.bytes);
|
||||||
pCtx->param[1].i = pInput->ts;
|
pCtx->param[1].param.i = pInput->ts;
|
||||||
pCtx->param[1].nType = pCtx->resDataInfo.type;
|
pCtx->param[1].param.nType = pCtx->resDataInfo.type;
|
||||||
|
|
||||||
// DO_UPDATE_TAG_COLUMNS(pCtx, pInput->ts);
|
// DO_UPDATE_TAG_COLUMNS(pCtx, pInput->ts);
|
||||||
}
|
}
|
||||||
|
@ -1955,11 +1833,11 @@ static STopBotInfo *getTopBotOutputInfo(SqlFunctionCtx *pCtx) {
|
||||||
static void buildTopBotStruct(STopBotInfo *pTopBotInfo, SqlFunctionCtx *pCtx) {
|
static void buildTopBotStruct(STopBotInfo *pTopBotInfo, SqlFunctionCtx *pCtx) {
|
||||||
char *tmp = (char *)pTopBotInfo + sizeof(STopBotInfo);
|
char *tmp = (char *)pTopBotInfo + sizeof(STopBotInfo);
|
||||||
pTopBotInfo->res = (tValuePair**) tmp;
|
pTopBotInfo->res = (tValuePair**) tmp;
|
||||||
tmp += POINTER_BYTES * pCtx->param[0].i;
|
// tmp += POINTER_BYTES * pCtx->param[0].param.i;
|
||||||
|
|
||||||
// size_t size = sizeof(tValuePair) + pCtx->tagInfo.tagsLen;
|
// size_t size = sizeof(tValuePair) + pCtx->tagInfo.tagsLen;
|
||||||
|
|
||||||
// for (int32_t i = 0; i < pCtx->param[0].i; ++i) {
|
// for (int32_t i = 0; i < pCtx->param[0].param.i; ++i) {
|
||||||
// pTopBotInfo->res[i] = (tValuePair*) tmp;
|
// pTopBotInfo->res[i] = (tValuePair*) tmp;
|
||||||
// pTopBotInfo->res[i]->pTags = tmp + sizeof(tValuePair);
|
// pTopBotInfo->res[i]->pTags = tmp + sizeof(tValuePair);
|
||||||
// tmp += size;
|
// tmp += size;
|
||||||
|
@ -1975,13 +1853,13 @@ bool topbot_datablock_filter(SqlFunctionCtx *pCtx, const char *minval, const cha
|
||||||
STopBotInfo *pTopBotInfo = getTopBotOutputInfo(pCtx);
|
STopBotInfo *pTopBotInfo = getTopBotOutputInfo(pCtx);
|
||||||
|
|
||||||
// required number of results are not reached, continue load data block
|
// required number of results are not reached, continue load data block
|
||||||
if (pTopBotInfo->num < pCtx->param[0].i) {
|
// if (pTopBotInfo->num < pCtx->param[0].param.i) {
|
||||||
return true;
|
// return true;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if ((void *)pTopBotInfo->res[0] != (void *)((char *)pTopBotInfo + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].i)) {
|
// if ((void *)pTopBotInfo->res[0] != (void *)((char *)pTopBotInfo + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].param.i)) {
|
||||||
buildTopBotStruct(pTopBotInfo, pCtx);
|
// buildTopBotStruct(pTopBotInfo, pCtx);
|
||||||
}
|
// }
|
||||||
|
|
||||||
tValuePair **pRes = (tValuePair**) pTopBotInfo->res;
|
tValuePair **pRes = (tValuePair**) pTopBotInfo->res;
|
||||||
|
|
||||||
|
@ -2038,9 +1916,9 @@ static void top_function(SqlFunctionCtx *pCtx) {
|
||||||
STopBotInfo *pRes = getTopBotOutputInfo(pCtx);
|
STopBotInfo *pRes = getTopBotOutputInfo(pCtx);
|
||||||
assert(pRes->num >= 0);
|
assert(pRes->num >= 0);
|
||||||
|
|
||||||
if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].i)) {
|
// if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].param.i)) {
|
||||||
buildTopBotStruct(pRes, pCtx);
|
// buildTopBotStruct(pRes, pCtx);
|
||||||
}
|
// }
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
for (int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
char *data = GET_INPUT_DATA(pCtx, i);
|
char *data = GET_INPUT_DATA(pCtx, i);
|
||||||
|
@ -2052,7 +1930,7 @@ static void top_function(SqlFunctionCtx *pCtx) {
|
||||||
|
|
||||||
// NOTE: Set the default timestamp if it is missing [todo refactor]
|
// NOTE: Set the default timestamp if it is missing [todo refactor]
|
||||||
TSKEY ts = (pCtx->ptsList != NULL)? GET_TS_DATA(pCtx, i):0;
|
TSKEY ts = (pCtx->ptsList != NULL)? GET_TS_DATA(pCtx, i):0;
|
||||||
// do_top_function_add(pRes, (int32_t)pCtx->param[0].i, data, ts, pCtx->inputType, &pCtx->tagInfo, NULL, 0);
|
// do_top_function_add(pRes, (int32_t)pCtx->param[0].param.i, data, ts, pCtx->inputType, &pCtx->tagInfo, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pCtx->hasNull) {
|
if (!pCtx->hasNull) {
|
||||||
|
@ -2079,7 +1957,7 @@ static void top_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
// the intermediate result is binary, we only use the output data type
|
// the intermediate result is binary, we only use the output data type
|
||||||
for (int32_t i = 0; i < pInput->num; ++i) {
|
for (int32_t i = 0; i < pInput->num; ++i) {
|
||||||
int16_t type = (pCtx->resDataInfo.type == TSDB_DATA_TYPE_FLOAT)? TSDB_DATA_TYPE_DOUBLE:pCtx->resDataInfo.type;
|
int16_t type = (pCtx->resDataInfo.type == TSDB_DATA_TYPE_FLOAT)? TSDB_DATA_TYPE_DOUBLE:pCtx->resDataInfo.type;
|
||||||
// do_top_function_add(pOutput, (int32_t)pCtx->param[0].i, &pInput->res[i]->v.i, pInput->res[i]->timestamp,
|
// do_top_function_add(pOutput, (int32_t)pCtx->param[0].param.i, &pInput->res[i]->v.i, pInput->res[i]->timestamp,
|
||||||
// type, &pCtx->tagInfo, pInput->res[i]->pTags, pCtx->currentStage);
|
// type, &pCtx->tagInfo, pInput->res[i]->pTags, pCtx->currentStage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2096,9 +1974,9 @@ static void bottom_function(SqlFunctionCtx *pCtx) {
|
||||||
|
|
||||||
STopBotInfo *pRes = getTopBotOutputInfo(pCtx);
|
STopBotInfo *pRes = getTopBotOutputInfo(pCtx);
|
||||||
|
|
||||||
if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].i)) {
|
// if ((void *)pRes->res[0] != (void *)((char *)pRes + sizeof(STopBotInfo) + POINTER_BYTES * pCtx->param[0].param.i)) {
|
||||||
buildTopBotStruct(pRes, pCtx);
|
// buildTopBotStruct(pRes, pCtx);
|
||||||
}
|
// }
|
||||||
|
|
||||||
for (int32_t i = 0; i < pCtx->size; ++i) {
|
for (int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
char *data = GET_INPUT_DATA(pCtx, i);
|
char *data = GET_INPUT_DATA(pCtx, i);
|
||||||
|
@ -2109,7 +1987,7 @@ static void bottom_function(SqlFunctionCtx *pCtx) {
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
// NOTE: Set the default timestamp if it is missing [todo refactor]
|
// NOTE: Set the default timestamp if it is missing [todo refactor]
|
||||||
TSKEY ts = (pCtx->ptsList != NULL)? GET_TS_DATA(pCtx, i):0;
|
TSKEY ts = (pCtx->ptsList != NULL)? GET_TS_DATA(pCtx, i):0;
|
||||||
// do_bottom_function_add(pRes, (int32_t)pCtx->param[0].i, data, ts, pCtx->inputType, &pCtx->tagInfo, NULL, 0);
|
// do_bottom_function_add(pRes, (int32_t)pCtx->param[0].param.i, data, ts, pCtx->inputType, &pCtx->tagInfo, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pCtx->hasNull) {
|
if (!pCtx->hasNull) {
|
||||||
|
@ -2136,7 +2014,7 @@ static void bottom_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
// the intermediate result is binary, we only use the output data type
|
// the intermediate result is binary, we only use the output data type
|
||||||
for (int32_t i = 0; i < pInput->num; ++i) {
|
for (int32_t i = 0; i < pInput->num; ++i) {
|
||||||
int16_t type = (pCtx->resDataInfo.type == TSDB_DATA_TYPE_FLOAT) ? TSDB_DATA_TYPE_DOUBLE : pCtx->resDataInfo.type;
|
int16_t type = (pCtx->resDataInfo.type == TSDB_DATA_TYPE_FLOAT) ? TSDB_DATA_TYPE_DOUBLE : pCtx->resDataInfo.type;
|
||||||
// do_bottom_function_add(pOutput, (int32_t)pCtx->param[0].i, &pInput->res[i]->v.i, pInput->res[i]->timestamp, type,
|
// do_bottom_function_add(pOutput, (int32_t)pCtx->param[0].param.i, &pInput->res[i]->v.i, pInput->res[i]->timestamp, type,
|
||||||
// &pCtx->tagInfo, pInput->res[i]->pTags, pCtx->currentStage);
|
// &pCtx->tagInfo, pInput->res[i]->pTags, pCtx->currentStage);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2162,11 +2040,11 @@ static void top_bottom_func_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
tValuePair **tvp = pRes->res;
|
tValuePair **tvp = pRes->res;
|
||||||
|
|
||||||
// user specify the order of output by sort the result according to timestamp
|
// user specify the order of output by sort the result according to timestamp
|
||||||
if (pCtx->param[1].i == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
if (pCtx->param[1].param.i == PRIMARYKEY_TIMESTAMP_COL_ID) {
|
||||||
__compar_fn_t comparator = (pCtx->param[2].i == TSDB_ORDER_ASC) ? resAscComparFn : resDescComparFn;
|
__compar_fn_t comparator = (pCtx->param[2].param.i == TSDB_ORDER_ASC) ? resAscComparFn : resDescComparFn;
|
||||||
qsort(tvp, (size_t)pResInfo->numOfRes, POINTER_BYTES, comparator);
|
qsort(tvp, (size_t)pResInfo->numOfRes, POINTER_BYTES, comparator);
|
||||||
} else /*if (pCtx->param[1].i > PRIMARYKEY_TIMESTAMP_COL_ID)*/ {
|
} else /*if (pCtx->param[1].param.i > PRIMARYKEY_TIMESTAMP_COL_ID)*/ {
|
||||||
__compar_fn_t comparator = (pCtx->param[2].i == TSDB_ORDER_ASC) ? resDataAscComparFn : resDataDescComparFn;
|
__compar_fn_t comparator = (pCtx->param[2].param.i == TSDB_ORDER_ASC) ? resDataAscComparFn : resDataDescComparFn;
|
||||||
qsort(tvp, (size_t)pResInfo->numOfRes, POINTER_BYTES, comparator);
|
qsort(tvp, (size_t)pResInfo->numOfRes, POINTER_BYTES, comparator);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2277,7 +2155,7 @@ static void percentile_function(SqlFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void percentile_finalizer(SqlFunctionCtx *pCtx) {
|
static void percentile_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
double v = pCtx->param[0].nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].i : pCtx->param[0].d;
|
// double v = pCtx->param[0].param.nType == TSDB_DATA_TYPE_INT ? pCtx->param[0].param.i : pCtx->param[0].param.d;
|
||||||
|
|
||||||
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
SPercentileInfo* ppInfo = (SPercentileInfo *) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -2287,7 +2165,7 @@ static void percentile_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
assert(ppInfo->numOfElems == 0);
|
assert(ppInfo->numOfElems == 0);
|
||||||
setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
||||||
} else {
|
} else {
|
||||||
SET_DOUBLE_VAL((double *)pCtx->pOutput, getPercentile(pMemBucket, v));
|
// SET_DOUBLE_VAL((double *)pCtx->pOutput, getPercentile(pMemBucket, v));
|
||||||
}
|
}
|
||||||
|
|
||||||
tMemBucketDestroy(pMemBucket);
|
tMemBucketDestroy(pMemBucket);
|
||||||
|
@ -2389,7 +2267,7 @@ static void apercentile_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static void apercentile_finalizer(SqlFunctionCtx *pCtx) {
|
static void apercentile_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
double v = (pCtx->param[0].nType == TSDB_DATA_TYPE_INT) ? pCtx->param[0].i : pCtx->param[0].d;
|
double v = (pCtx->param[0].param.nType == TSDB_DATA_TYPE_INT) ? pCtx->param[0].param.i : pCtx->param[0].param.d;
|
||||||
|
|
||||||
SResultRowEntryInfo * pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo * pResInfo = GET_RES_INFO(pCtx);
|
||||||
SAPercentileInfo *pOutput = GET_ROWCELL_INTERBUF(pResInfo);
|
SAPercentileInfo *pOutput = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
@ -2432,7 +2310,7 @@ static bool leastsquares_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInf
|
||||||
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
SLeastsquaresInfo *pInfo = GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
// 2*3 matrix
|
// 2*3 matrix
|
||||||
pInfo->startVal = pCtx->param[0].d;
|
// pInfo->startVal = pCtx->param[0].param.d;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2478,54 +2356,54 @@ static void leastsquares_function(SqlFunctionCtx *pCtx) {
|
||||||
param[0][2] += x * p[i];
|
param[0][2] += x * p[i];
|
||||||
param[1][2] += p[i];
|
param[1][2] += p[i];
|
||||||
|
|
||||||
x += pCtx->param[1].d;
|
x += pCtx->param[1].param.d;
|
||||||
numOfElem++;
|
numOfElem++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
int64_t *p = pData;
|
int64_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_DOUBLE: {
|
case TSDB_DATA_TYPE_DOUBLE: {
|
||||||
double *p = pData;
|
double *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_FLOAT: {
|
case TSDB_DATA_TYPE_FLOAT: {
|
||||||
float *p = pData;
|
float *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
};
|
};
|
||||||
case TSDB_DATA_TYPE_SMALLINT: {
|
case TSDB_DATA_TYPE_SMALLINT: {
|
||||||
int16_t *p = pData;
|
int16_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TINYINT: {
|
case TSDB_DATA_TYPE_TINYINT: {
|
||||||
int8_t *p = pData;
|
int8_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UTINYINT: {
|
case TSDB_DATA_TYPE_UTINYINT: {
|
||||||
uint8_t *p = pData;
|
uint8_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_USMALLINT: {
|
case TSDB_DATA_TYPE_USMALLINT: {
|
||||||
uint16_t *p = pData;
|
uint16_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UINT: {
|
case TSDB_DATA_TYPE_UINT: {
|
||||||
uint32_t *p = pData;
|
uint32_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UBIGINT: {
|
case TSDB_DATA_TYPE_UBIGINT: {
|
||||||
uint64_t *p = pData;
|
uint64_t *p = pData;
|
||||||
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].d);
|
LEASTSQR_CAL_LOOP(pCtx, param, x, p, pCtx->inputType, numOfElem, pCtx->param[1].param.d);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2584,16 +2462,16 @@ static void col_project_function(SqlFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// only one row is required.
|
// only one row is required.
|
||||||
if (pCtx->param[0].i == 1) {
|
// if (pCtx->param[0].param.i == 1) {
|
||||||
SET_VAL(pCtx, pCtx->size, 1);
|
// SET_VAL(pCtx, pCtx->size, 1);
|
||||||
} else {
|
// } else {
|
||||||
INC_INIT_VAL(pCtx, pCtx->size);
|
// INC_INIT_VAL(pCtx, pCtx->size);
|
||||||
}
|
// }
|
||||||
|
|
||||||
char *pData = GET_INPUT_DATA_LIST(pCtx);
|
char *pData = GET_INPUT_DATA_LIST(pCtx);
|
||||||
if (pCtx->order == TSDB_ORDER_ASC) {
|
if (pCtx->order == TSDB_ORDER_ASC) {
|
||||||
int32_t numOfRows = (pCtx->param[0].i == 1)? 1:pCtx->size;
|
// int32_t numOfRows = (pCtx->param[0].param.i == 1)? 1:pCtx->size;
|
||||||
memcpy(pCtx->pOutput, pData, (size_t) numOfRows * pCtx->inputBytes);
|
// memcpy(pCtx->pOutput, pData, (size_t) numOfRows * pCtx->inputBytes);
|
||||||
} else {
|
} else {
|
||||||
for(int32_t i = 0; i < pCtx->size; ++i) {
|
for(int32_t i = 0; i < pCtx->size; ++i) {
|
||||||
memcpy(pCtx->pOutput + (pCtx->size - 1 - i) * pCtx->inputBytes, pData + i * pCtx->inputBytes,
|
memcpy(pCtx->pOutput + (pCtx->size - 1 - i) * pCtx->inputBytes, pData + i * pCtx->inputBytes,
|
||||||
|
@ -2658,7 +2536,7 @@ static bool diff_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pResI
|
||||||
}
|
}
|
||||||
|
|
||||||
// diff function require the value is set to -1
|
// diff function require the value is set to -1
|
||||||
pCtx->param[1].nType = INITIAL_VALUE_NOT_ASSIGNED;
|
pCtx->param[1].param.nType = INITIAL_VALUE_NOT_ASSIGNED;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2670,9 +2548,9 @@ static bool deriv_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pRes
|
||||||
// diff function require the value is set to -1
|
// diff function require the value is set to -1
|
||||||
SDerivInfo* pDerivInfo = GET_ROWCELL_INTERBUF(pResultInfo);
|
SDerivInfo* pDerivInfo = GET_ROWCELL_INTERBUF(pResultInfo);
|
||||||
|
|
||||||
pDerivInfo->ignoreNegative = pCtx->param[1].i;
|
// pDerivInfo->ignoreNegative = pCtx->param[1].param.i;
|
||||||
pDerivInfo->prevTs = -1;
|
pDerivInfo->prevTs = -1;
|
||||||
pDerivInfo->tsWindow = pCtx->param[0].i;
|
// pDerivInfo->tsWindow = pCtx->param[0].param.i;
|
||||||
pDerivInfo->valueSet = false;
|
pDerivInfo->valueSet = false;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -2861,12 +2739,12 @@ static void deriv_function(SqlFunctionCtx *pCtx) {
|
||||||
|
|
||||||
#define DIFF_IMPL(ctx, d, type) \
|
#define DIFF_IMPL(ctx, d, type) \
|
||||||
do { \
|
do { \
|
||||||
if ((ctx)->param[1].nType == INITIAL_VALUE_NOT_ASSIGNED) { \
|
if ((ctx)->param[1].param.nType == INITIAL_VALUE_NOT_ASSIGNED) { \
|
||||||
(ctx)->param[1].nType = (ctx)->inputType; \
|
(ctx)->param[1].param.nType = (ctx)->inputType; \
|
||||||
*(type *)&(ctx)->param[1].i = *(type *)(d); \
|
*(type *)&(ctx)->param[1].param.i = *(type *)(d); \
|
||||||
} else { \
|
} else { \
|
||||||
*(type *)(ctx)->pOutput = *(type *)(d) - (*(type *)(&(ctx)->param[1].i)); \
|
*(type *)(ctx)->pOutput = *(type *)(d) - (*(type *)(&(ctx)->param[1].param.i)); \
|
||||||
*(type *)(&(ctx)->param[1].i) = *(type *)(d); \
|
*(type *)(&(ctx)->param[1].param.i) = *(type *)(d); \
|
||||||
*(int64_t *)(ctx)->pTsOutput = GET_TS_DATA(ctx, index); \
|
*(int64_t *)(ctx)->pTsOutput = GET_TS_DATA(ctx, index); \
|
||||||
} \
|
} \
|
||||||
} while (0);
|
} while (0);
|
||||||
|
@ -2874,7 +2752,7 @@ static void deriv_function(SqlFunctionCtx *pCtx) {
|
||||||
// TODO difference in date column
|
// TODO difference in date column
|
||||||
static void diff_function(SqlFunctionCtx *pCtx) {
|
static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
void *data = GET_INPUT_DATA_LIST(pCtx);
|
void *data = GET_INPUT_DATA_LIST(pCtx);
|
||||||
bool isFirstBlock = (pCtx->param[1].nType == INITIAL_VALUE_NOT_ASSIGNED);
|
bool isFirstBlock = (pCtx->param[1].param.nType == INITIAL_VALUE_NOT_ASSIGNED);
|
||||||
|
|
||||||
int32_t notNullElems = 0;
|
int32_t notNullElems = 0;
|
||||||
|
|
||||||
|
@ -2894,15 +2772,15 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
if (pCtx->param[1].param.nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
||||||
*pOutput = (int32_t)(pData[i] - pCtx->param[1].i); // direct previous may be null
|
*pOutput = (int32_t)(pData[i] - pCtx->param[1].param.i); // direct previous may be null
|
||||||
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
||||||
pOutput += 1;
|
pOutput += 1;
|
||||||
pTimestamp += 1;
|
pTimestamp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->param[1].i = pData[i];
|
pCtx->param[1].param.i = pData[i];
|
||||||
pCtx->param[1].nType = pCtx->inputType;
|
pCtx->param[1].param.nType = pCtx->inputType;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2916,15 +2794,15 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
if (pCtx->param[1].param.nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
||||||
*pOutput = pData[i] - pCtx->param[1].i; // direct previous may be null
|
*pOutput = pData[i] - pCtx->param[1].param.i; // direct previous may be null
|
||||||
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
||||||
pOutput += 1;
|
pOutput += 1;
|
||||||
pTimestamp += 1;
|
pTimestamp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->param[1].i = pData[i];
|
pCtx->param[1].param.i = pData[i];
|
||||||
pCtx->param[1].nType = pCtx->inputType;
|
pCtx->param[1].param.nType = pCtx->inputType;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2938,15 +2816,15 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
if (pCtx->param[1].param.nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
||||||
SET_DOUBLE_VAL(pOutput, pData[i] - pCtx->param[1].d); // direct previous may be null
|
SET_DOUBLE_VAL(pOutput, pData[i] - pCtx->param[1].param.d); // direct previous may be null
|
||||||
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
||||||
pOutput += 1;
|
pOutput += 1;
|
||||||
pTimestamp += 1;
|
pTimestamp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->param[1].d = pData[i];
|
pCtx->param[1].param.d = pData[i];
|
||||||
pCtx->param[1].nType = pCtx->inputType;
|
pCtx->param[1].param.nType = pCtx->inputType;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2960,15 +2838,15 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
if (pCtx->param[1].param.nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
||||||
*pOutput = (float)(pData[i] - pCtx->param[1].d); // direct previous may be null
|
*pOutput = (float)(pData[i] - pCtx->param[1].param.d); // direct previous may be null
|
||||||
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
||||||
pOutput += 1;
|
pOutput += 1;
|
||||||
pTimestamp += 1;
|
pTimestamp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->param[1].d = pData[i];
|
pCtx->param[1].param.d = pData[i];
|
||||||
pCtx->param[1].nType = pCtx->inputType;
|
pCtx->param[1].param.nType = pCtx->inputType;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -2982,15 +2860,15 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
if (pCtx->param[1].param.nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
||||||
*pOutput = (int16_t)(pData[i] - pCtx->param[1].i); // direct previous may be null
|
*pOutput = (int16_t)(pData[i] - pCtx->param[1].param.i); // direct previous may be null
|
||||||
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
||||||
pOutput += 1;
|
pOutput += 1;
|
||||||
pTimestamp += 1;
|
pTimestamp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->param[1].i = pData[i];
|
pCtx->param[1].param.i = pData[i];
|
||||||
pCtx->param[1].nType = pCtx->inputType;
|
pCtx->param[1].param.nType = pCtx->inputType;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -3005,15 +2883,15 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[1].nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
if (pCtx->param[1].param.nType != INITIAL_VALUE_NOT_ASSIGNED) { // initial value is not set yet
|
||||||
*pOutput = (int8_t)(pData[i] - pCtx->param[1].i); // direct previous may be null
|
*pOutput = (int8_t)(pData[i] - pCtx->param[1].param.i); // direct previous may be null
|
||||||
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
*pTimestamp = (tsList != NULL)? tsList[i]:0;
|
||||||
pOutput += 1;
|
pOutput += 1;
|
||||||
pTimestamp += 1;
|
pTimestamp += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->param[1].i = pData[i];
|
pCtx->param[1].param.i = pData[i];
|
||||||
pCtx->param[1].nType = pCtx->inputType;
|
pCtx->param[1].param.nType = pCtx->inputType;
|
||||||
notNullElems++;
|
notNullElems++;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
@ -3024,7 +2902,7 @@ static void diff_function(SqlFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// initial value is not set yet
|
// initial value is not set yet
|
||||||
if (pCtx->param[1].nType == INITIAL_VALUE_NOT_ASSIGNED || notNullElems <= 0) {
|
if (pCtx->param[1].param.nType == INITIAL_VALUE_NOT_ASSIGNED || notNullElems <= 0) {
|
||||||
/*
|
/*
|
||||||
* 1. current block and blocks before are full of null
|
* 1. current block and blocks before are full of null
|
||||||
* 2. current block may be null value
|
* 2. current block may be null value
|
||||||
|
@ -3091,8 +2969,8 @@ static bool spread_function_setup(SqlFunctionCtx *pCtx, SResultRowEntryInfo* pRe
|
||||||
|
|
||||||
// this is the server-side setup function in client-side, the secondary merge do not need this procedure
|
// this is the server-side setup function in client-side, the secondary merge do not need this procedure
|
||||||
if (pCtx->currentStage == MERGE_STAGE) {
|
if (pCtx->currentStage == MERGE_STAGE) {
|
||||||
pCtx->param[0].d = DBL_MAX;
|
// pCtx->param[0].param.d = DBL_MAX;
|
||||||
pCtx->param[3].d = -DBL_MAX;
|
// pCtx->param[3].param.d = -DBL_MAX;
|
||||||
} else {
|
} else {
|
||||||
pInfo->min = DBL_MAX;
|
pInfo->min = DBL_MAX;
|
||||||
pInfo->max = -DBL_MAX;
|
pInfo->max = -DBL_MAX;
|
||||||
|
@ -3192,13 +3070,13 @@ void spread_func_merge(SqlFunctionCtx *pCtx) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCtx->param[0].d > pData->min) {
|
// if (pCtx->param[0].param.d > pData->min) {
|
||||||
pCtx->param[0].d = pData->min;
|
// pCtx->param[0].param.d = pData->min;
|
||||||
}
|
// }
|
||||||
|
|
||||||
if (pCtx->param[3].d < pData->max) {
|
// if (pCtx->param[3].param.d < pData->max) {
|
||||||
pCtx->param[3].d = pData->max;
|
// pCtx->param[3].param.d = pData->max;
|
||||||
}
|
// }
|
||||||
|
|
||||||
// GET_RES_INFO(pCtx)->hasResult = DATA_SET_FLAG;
|
// GET_RES_INFO(pCtx)->hasResult = DATA_SET_FLAG;
|
||||||
}
|
}
|
||||||
|
@ -3218,7 +3096,7 @@ void spread_function_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
// return;
|
// return;
|
||||||
// }
|
// }
|
||||||
|
|
||||||
SET_DOUBLE_VAL((double *)pCtx->pOutput, pCtx->param[3].d - pCtx->param[0].d);
|
// SET_DOUBLE_VAL((double *)pCtx->pOutput, pCtx->param[3].param.d - pCtx->param[0].param.d);
|
||||||
} else {
|
} else {
|
||||||
assert(IS_NUMERIC_TYPE(pCtx->inputType) || (pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP));
|
assert(IS_NUMERIC_TYPE(pCtx->inputType) || (pCtx->inputType == TSDB_DATA_TYPE_TIMESTAMP));
|
||||||
|
|
||||||
|
@ -3571,7 +3449,7 @@ void twa_function_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static void interp_function_impl(SqlFunctionCtx *pCtx) {
|
static void interp_function_impl(SqlFunctionCtx *pCtx) {
|
||||||
int32_t type = (int32_t) pCtx->param[2].i;
|
int32_t type = (int32_t) pCtx->param[2].param.i;
|
||||||
if (type == TSDB_FILL_NONE) {
|
if (type == TSDB_FILL_NONE) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -3583,7 +3461,7 @@ static void interp_function_impl(SqlFunctionCtx *pCtx) {
|
||||||
} else if (type == TSDB_FILL_NULL) {
|
} else if (type == TSDB_FILL_NULL) {
|
||||||
setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
setNull(pCtx->pOutput, pCtx->resDataInfo.type, pCtx->resDataInfo.bytes);
|
||||||
} else if (type == TSDB_FILL_SET_VALUE) {
|
} else if (type == TSDB_FILL_SET_VALUE) {
|
||||||
taosVariantDump(&pCtx->param[1], pCtx->pOutput, pCtx->inputType, true);
|
// taosVariantDump(&pCtx->param[1], pCtx->pOutput, pCtx->inputType, true);
|
||||||
} else {
|
} else {
|
||||||
if (pCtx->start.key != INT64_MIN && ((ascQuery && pCtx->start.key <= pCtx->startTs && pCtx->end.key >= pCtx->startTs) || ((!ascQuery) && pCtx->start.key >= pCtx->startTs && pCtx->end.key <= pCtx->startTs))) {
|
if (pCtx->start.key != INT64_MIN && ((ascQuery && pCtx->start.key <= pCtx->startTs && pCtx->end.key >= pCtx->startTs) || ((!ascQuery) && pCtx->start.key >= pCtx->startTs && pCtx->end.key <= pCtx->startTs))) {
|
||||||
if (type == TSDB_FILL_PREV) {
|
if (type == TSDB_FILL_PREV) {
|
||||||
|
@ -3755,11 +3633,11 @@ static void ts_comp_function(SqlFunctionCtx *pCtx) {
|
||||||
|
|
||||||
// primary ts must be existed, so no need to check its existance
|
// primary ts must be existed, so no need to check its existance
|
||||||
if (pCtx->order == TSDB_ORDER_ASC) {
|
if (pCtx->order == TSDB_ORDER_ASC) {
|
||||||
tsBufAppend(pTSbuf, (int32_t)pCtx->param[0].i, &pCtx->tag, input, pCtx->size * TSDB_KEYSIZE);
|
// tsBufAppend(pTSbuf, (int32_t)pCtx->param[0].param.i, &pCtx->tag, input, pCtx->size * TSDB_KEYSIZE);
|
||||||
} else {
|
} else {
|
||||||
for (int32_t i = pCtx->size - 1; i >= 0; --i) {
|
for (int32_t i = pCtx->size - 1; i >= 0; --i) {
|
||||||
char *d = GET_INPUT_DATA(pCtx, i);
|
char *d = GET_INPUT_DATA(pCtx, i);
|
||||||
tsBufAppend(pTSbuf, (int32_t)pCtx->param[0].i, &pCtx->tag, d, (int32_t)TSDB_KEYSIZE);
|
// tsBufAppend(pTSbuf, (int32_t)pCtx->param[0].param.i, &pCtx->tag, d, (int32_t)TSDB_KEYSIZE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3911,7 +3789,7 @@ static void rate_finalizer(SqlFunctionCtx *pCtx) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SET_DOUBLE_VAL((double*) pCtx->pOutput, do_calc_rate(pRateInfo, (double) TSDB_TICK_PER_SECOND(pCtx->param[0].i)));
|
// SET_DOUBLE_VAL((double*) pCtx->pOutput, do_calc_rate(pRateInfo, (double) TSDB_TICK_PER_SECOND(pCtx->param[0].param.i)));
|
||||||
|
|
||||||
// cannot set the numOfIteratedElems again since it is set during previous iteration
|
// cannot set the numOfIteratedElems again since it is set during previous iteration
|
||||||
pResInfo->numOfRes = 1;
|
pResInfo->numOfRes = 1;
|
||||||
|
@ -4008,7 +3886,7 @@ static void blockInfo_func(SqlFunctionCtx* pCtx) {
|
||||||
|
|
||||||
int32_t len = *(int32_t*) pCtx->pInput;
|
int32_t len = *(int32_t*) pCtx->pInput;
|
||||||
blockDistInfoFromBinary((char*)pCtx->pInput + sizeof(int32_t), len, pDist);
|
blockDistInfoFromBinary((char*)pCtx->pInput + sizeof(int32_t), len, pDist);
|
||||||
pDist->rowSize = (uint16_t)pCtx->param[0].i;
|
// pDist->rowSize = (uint16_t)pCtx->param[0].param.i;
|
||||||
|
|
||||||
memcpy(pCtx->pOutput, pCtx->pInput, sizeof(int32_t) + len);
|
memcpy(pCtx->pOutput, pCtx->pInput, sizeof(int32_t) + len);
|
||||||
|
|
||||||
|
@ -4160,7 +4038,7 @@ void blockinfo_func_finalizer(SqlFunctionCtx* pCtx) {
|
||||||
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
SResultRowEntryInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
STableBlockDistInfo* pDist = (STableBlockDistInfo*) GET_ROWCELL_INTERBUF(pResInfo);
|
STableBlockDistInfo* pDist = (STableBlockDistInfo*) GET_ROWCELL_INTERBUF(pResInfo);
|
||||||
|
|
||||||
pDist->rowSize = (uint16_t)pCtx->param[0].i;
|
// pDist->rowSize = (uint16_t)pCtx->param[0].param.i;
|
||||||
generateBlockDistResult(pDist, pCtx->pOutput);
|
generateBlockDistResult(pDist, pCtx->pOutput);
|
||||||
|
|
||||||
if (pDist->dataBlockInfos != NULL) {
|
if (pDist->dataBlockInfos != NULL) {
|
||||||
|
@ -4557,9 +4435,9 @@ SAggFunctionInfo aggFunc[35] = {{
|
||||||
FUNCTION_AVG,
|
FUNCTION_AVG,
|
||||||
FUNCSTATE_SO | FUNCSTATE_STABLE,
|
FUNCSTATE_SO | FUNCSTATE_STABLE,
|
||||||
function_setup,
|
function_setup,
|
||||||
stddev_dst_function,
|
NULL,
|
||||||
stddev_dst_finalizer,
|
NULL,
|
||||||
stddev_dst_merge,
|
NULL,
|
||||||
dataBlockRequired,
|
dataBlockRequired,
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
|
|
@ -14,19 +14,15 @@
|
||||||
*/
|
*/
|
||||||
#include "uv.h"
|
#include "uv.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tlog.h"
|
|
||||||
#include "tudf.h"
|
#include "tudf.h"
|
||||||
#include "tudfInt.h"
|
#include "tudfInt.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
|
||||||
//TODO: when startup, set thread poll size. add it to cfg
|
|
||||||
//TODO: test for udfd restart
|
|
||||||
//TODO: udfd restart when exist or aborts
|
|
||||||
//TODO: deal with uv task that has been started and then udfd core dumped
|
|
||||||
//TODO: network error processing.
|
//TODO: network error processing.
|
||||||
//TODO: add unit test
|
//TODO: add unit test
|
||||||
//TODO: include all global variable under context struct
|
//TODO: include all global variable under context struct
|
||||||
|
|
||||||
/* Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
|
/* Copyright (c) 2013, Ben Noordhuis <info@bnoordhuis.nl>
|
||||||
* The QUEUE is copied from queue.h under libuv
|
* The QUEUE is copied from queue.h under libuv
|
||||||
* */
|
* */
|
||||||
|
@ -125,12 +121,35 @@ enum {
|
||||||
UV_TASK_DISCONNECT = 2
|
UV_TASK_DISCONNECT = 2
|
||||||
};
|
};
|
||||||
|
|
||||||
|
int64_t gUdfTaskSeqNum = 0;
|
||||||
|
typedef struct SUdfdProxy {
|
||||||
|
int32_t dnodeId;
|
||||||
|
uv_barrier_t gUdfInitBarrier;
|
||||||
|
|
||||||
|
uv_loop_t gUdfdLoop;
|
||||||
|
uv_thread_t gUdfLoopThread;
|
||||||
|
uv_async_t gUdfLoopTaskAync;
|
||||||
|
|
||||||
|
uv_async_t gUdfLoopStopAsync;
|
||||||
|
|
||||||
|
uv_mutex_t gUdfTaskQueueMutex;
|
||||||
|
int8_t gUdfcState;
|
||||||
|
QUEUE gUdfTaskQueue;
|
||||||
|
QUEUE gUvProcTaskQueue;
|
||||||
|
// int8_t gUdfcState = UDFC_STATE_INITAL;
|
||||||
|
// QUEUE gUdfTaskQueue = {0};
|
||||||
|
// QUEUE gUvProcTaskQueue = {0};
|
||||||
|
} SUdfdProxy;
|
||||||
|
|
||||||
|
|
||||||
typedef struct SUdfUvSession {
|
typedef struct SUdfUvSession {
|
||||||
|
SUdfdProxy *udfc;
|
||||||
int64_t severHandle;
|
int64_t severHandle;
|
||||||
uv_pipe_t *udfSvcPipe;
|
uv_pipe_t *udfSvcPipe;
|
||||||
} SUdfUvSession;
|
} SUdfUvSession;
|
||||||
|
|
||||||
typedef struct SClientUvTaskNode {
|
typedef struct SClientUvTaskNode {
|
||||||
|
SUdfdProxy *udfc;
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int errCode;
|
int errCode;
|
||||||
|
|
||||||
|
@ -169,7 +188,6 @@ typedef struct SClientUdfTask {
|
||||||
} _teardown;
|
} _teardown;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
} SClientUdfTask;
|
} SClientUdfTask;
|
||||||
|
|
||||||
typedef struct SClientConnBuf {
|
typedef struct SClientConnBuf {
|
||||||
|
@ -185,34 +203,13 @@ typedef struct SClientUvConn {
|
||||||
SClientConnBuf readBuf;
|
SClientConnBuf readBuf;
|
||||||
} SClientUvConn;
|
} SClientUvConn;
|
||||||
|
|
||||||
uv_process_t gUdfdProcess;
|
|
||||||
|
|
||||||
uv_barrier_t gUdfInitBarrier;
|
|
||||||
|
|
||||||
uv_loop_t gUdfdLoop;
|
|
||||||
uv_thread_t gUdfLoopThread;
|
|
||||||
uv_async_t gUdfLoopTaskAync;
|
|
||||||
|
|
||||||
uv_async_t gUdfLoopStopAsync;
|
|
||||||
|
|
||||||
uv_mutex_t gUdfTaskQueueMutex;
|
|
||||||
int64_t gUdfTaskSeqNum = 0;
|
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
UDFC_STATE_INITAL = 0, // initial state
|
UDFC_STATE_INITAL = 0, // initial state
|
||||||
UDFC_STATE_STARTNG, // starting after createUdfdProxy
|
UDFC_STATE_STARTNG, // starting after udfcOpen
|
||||||
UDFC_STATE_READY, // started and begin to receive quests
|
UDFC_STATE_READY, // started and begin to receive quests
|
||||||
UDFC_STATE_RESTARTING, // udfd abnormal exit. cleaning up and restart.
|
UDFC_STATE_STOPPING, // stopping after udfcClose
|
||||||
UDFC_STATE_STOPPING, // stopping after destroyUdfdProxy
|
|
||||||
UDFC_STATUS_FINAL, // stopped
|
UDFC_STATUS_FINAL, // stopped
|
||||||
};
|
};
|
||||||
int8_t gUdfcState = UDFC_STATE_INITAL;
|
|
||||||
|
|
||||||
//double circular linked list
|
|
||||||
|
|
||||||
QUEUE gUdfTaskQueue = {0};
|
|
||||||
|
|
||||||
QUEUE gUvProcTaskQueue = {0};
|
|
||||||
|
|
||||||
int32_t encodeUdfSetupRequest(void **buf, const SUdfSetupRequest *setup) {
|
int32_t encodeUdfSetupRequest(void **buf, const SUdfSetupRequest *setup) {
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
|
@ -777,13 +774,14 @@ void onUdfClientConnect(uv_connect_t *connect, int status) {
|
||||||
int32_t createUdfcUvTask(SClientUdfTask *task, int8_t uvTaskType, SClientUvTaskNode **pUvTask) {
|
int32_t createUdfcUvTask(SClientUdfTask *task, int8_t uvTaskType, SClientUvTaskNode **pUvTask) {
|
||||||
SClientUvTaskNode *uvTask = taosMemoryCalloc(1, sizeof(SClientUvTaskNode));
|
SClientUvTaskNode *uvTask = taosMemoryCalloc(1, sizeof(SClientUvTaskNode));
|
||||||
uvTask->type = uvTaskType;
|
uvTask->type = uvTaskType;
|
||||||
|
uvTask->udfc = task->session->udfc;
|
||||||
|
|
||||||
if (uvTaskType == UV_TASK_CONNECT) {
|
if (uvTaskType == UV_TASK_CONNECT) {
|
||||||
} else if (uvTaskType == UV_TASK_REQ_RSP) {
|
} else if (uvTaskType == UV_TASK_REQ_RSP) {
|
||||||
uvTask->pipe = task->session->udfSvcPipe;
|
uvTask->pipe = task->session->udfSvcPipe;
|
||||||
SUdfRequest request;
|
SUdfRequest request;
|
||||||
request.type = task->type;
|
request.type = task->type;
|
||||||
request.seqNum = gUdfTaskSeqNum++;
|
request.seqNum = atomic_fetch_add_64(&gUdfTaskSeqNum, 1);
|
||||||
|
|
||||||
if (task->type == UDF_TASK_SETUP) {
|
if (task->type == UDF_TASK_SETUP) {
|
||||||
request.setup = task->_setup.req;
|
request.setup = task->_setup.req;
|
||||||
|
@ -815,11 +813,11 @@ int32_t createUdfcUvTask(SClientUdfTask *task, int8_t uvTaskType, SClientUvTaskN
|
||||||
|
|
||||||
int32_t queueUvUdfTask(SClientUvTaskNode *uvTask) {
|
int32_t queueUvUdfTask(SClientUvTaskNode *uvTask) {
|
||||||
debugPrint("%s, %d", "queue uv task", uvTask->type);
|
debugPrint("%s, %d", "queue uv task", uvTask->type);
|
||||||
|
SUdfdProxy *udfc = uvTask->udfc;
|
||||||
uv_mutex_lock(&gUdfTaskQueueMutex);
|
uv_mutex_lock(&udfc->gUdfTaskQueueMutex);
|
||||||
QUEUE_INSERT_TAIL(&gUdfTaskQueue, &uvTask->recvTaskQueue);
|
QUEUE_INSERT_TAIL(&udfc->gUdfTaskQueue, &uvTask->recvTaskQueue);
|
||||||
uv_mutex_unlock(&gUdfTaskQueueMutex);
|
uv_mutex_unlock(&udfc->gUdfTaskQueueMutex);
|
||||||
uv_async_send(&gUdfLoopTaskAync);
|
uv_async_send(&udfc->gUdfLoopTaskAync);
|
||||||
|
|
||||||
uv_sem_wait(&uvTask->taskSem);
|
uv_sem_wait(&uvTask->taskSem);
|
||||||
uv_sem_destroy(&uvTask->taskSem);
|
uv_sem_destroy(&uvTask->taskSem);
|
||||||
|
@ -832,7 +830,7 @@ int32_t startUvUdfTask(SClientUvTaskNode *uvTask) {
|
||||||
switch (uvTask->type) {
|
switch (uvTask->type) {
|
||||||
case UV_TASK_CONNECT: {
|
case UV_TASK_CONNECT: {
|
||||||
uv_pipe_t *pipe = taosMemoryMalloc(sizeof(uv_pipe_t));
|
uv_pipe_t *pipe = taosMemoryMalloc(sizeof(uv_pipe_t));
|
||||||
uv_pipe_init(&gUdfdLoop, pipe, 0);
|
uv_pipe_init(&uvTask->udfc->gUdfdLoop, pipe, 0);
|
||||||
uvTask->pipe = pipe;
|
uvTask->pipe = pipe;
|
||||||
|
|
||||||
SClientUvConn *conn = taosMemoryMalloc(sizeof(SClientUvConn));
|
SClientUvConn *conn = taosMemoryMalloc(sizeof(SClientUvConn));
|
||||||
|
@ -873,142 +871,98 @@ int32_t startUvUdfTask(SClientUvTaskNode *uvTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfClientAsyncCb(uv_async_t *async) {
|
void udfClientAsyncCb(uv_async_t *async) {
|
||||||
|
SUdfdProxy *udfc = async->data;
|
||||||
QUEUE wq;
|
QUEUE wq;
|
||||||
|
|
||||||
uv_mutex_lock(&gUdfTaskQueueMutex);
|
uv_mutex_lock(&udfc->gUdfTaskQueueMutex);
|
||||||
QUEUE_MOVE(&gUdfTaskQueue, &wq);
|
QUEUE_MOVE(&udfc->gUdfTaskQueue, &wq);
|
||||||
uv_mutex_unlock(&gUdfTaskQueueMutex);
|
uv_mutex_unlock(&udfc->gUdfTaskQueueMutex);
|
||||||
|
|
||||||
while (!QUEUE_EMPTY(&wq)) {
|
while (!QUEUE_EMPTY(&wq)) {
|
||||||
QUEUE* h = QUEUE_HEAD(&wq);
|
QUEUE* h = QUEUE_HEAD(&wq);
|
||||||
QUEUE_REMOVE(h);
|
QUEUE_REMOVE(h);
|
||||||
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, recvTaskQueue);
|
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, recvTaskQueue);
|
||||||
startUvUdfTask(task);
|
startUvUdfTask(task);
|
||||||
QUEUE_INSERT_TAIL(&gUvProcTaskQueue, &task->procTaskQueue);
|
QUEUE_INSERT_TAIL(&udfc->gUvProcTaskQueue, &task->procTaskQueue);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void cleanUpUvTasks() {
|
void cleanUpUvTasks(SUdfdProxy *udfc) {
|
||||||
QUEUE wq;
|
QUEUE wq;
|
||||||
|
|
||||||
uv_mutex_lock(&gUdfTaskQueueMutex);
|
uv_mutex_lock(&udfc->gUdfTaskQueueMutex);
|
||||||
QUEUE_MOVE(&gUdfTaskQueue, &wq);
|
QUEUE_MOVE(&udfc->gUdfTaskQueue, &wq);
|
||||||
uv_mutex_unlock(&gUdfTaskQueueMutex);
|
uv_mutex_unlock(&udfc->gUdfTaskQueueMutex);
|
||||||
|
|
||||||
while (!QUEUE_EMPTY(&wq)) {
|
while (!QUEUE_EMPTY(&wq)) {
|
||||||
QUEUE* h = QUEUE_HEAD(&wq);
|
QUEUE* h = QUEUE_HEAD(&wq);
|
||||||
QUEUE_REMOVE(h);
|
QUEUE_REMOVE(h);
|
||||||
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, recvTaskQueue);
|
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, recvTaskQueue);
|
||||||
if (gUdfcState == UDFC_STATE_STOPPING) {
|
if (udfc->gUdfcState == UDFC_STATE_STOPPING) {
|
||||||
task->errCode = UDFC_CODE_STOPPING;
|
task->errCode = UDFC_CODE_STOPPING;
|
||||||
} else if (gUdfcState == UDFC_STATE_RESTARTING) {
|
|
||||||
task->errCode = UDFC_CODE_RESTARTING;
|
|
||||||
}
|
}
|
||||||
uv_sem_post(&task->taskSem);
|
uv_sem_post(&task->taskSem);
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: deal with tasks that are waiting result.
|
// TODO: deal with tasks that are waiting result.
|
||||||
while (!QUEUE_EMPTY(&gUvProcTaskQueue)) {
|
while (!QUEUE_EMPTY(&udfc->gUvProcTaskQueue)) {
|
||||||
QUEUE* h = QUEUE_HEAD(&gUvProcTaskQueue);
|
QUEUE* h = QUEUE_HEAD(&udfc->gUvProcTaskQueue);
|
||||||
QUEUE_REMOVE(h);
|
QUEUE_REMOVE(h);
|
||||||
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, procTaskQueue);
|
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, procTaskQueue);
|
||||||
if (gUdfcState == UDFC_STATE_STOPPING) {
|
if (udfc->gUdfcState == UDFC_STATE_STOPPING) {
|
||||||
task->errCode = UDFC_CODE_STOPPING;
|
task->errCode = UDFC_CODE_STOPPING;
|
||||||
} else if (gUdfcState == UDFC_STATE_RESTARTING) {
|
|
||||||
task->errCode = UDFC_CODE_RESTARTING;
|
|
||||||
}
|
}
|
||||||
uv_sem_post(&task->taskSem);
|
uv_sem_post(&task->taskSem);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfStopAsyncCb(uv_async_t *async) {
|
void udfStopAsyncCb(uv_async_t *async) {
|
||||||
cleanUpUvTasks();
|
SUdfdProxy *udfc = async->data;
|
||||||
if (gUdfcState == UDFC_STATE_STOPPING) {
|
cleanUpUvTasks(udfc);
|
||||||
uv_stop(&gUdfdLoop);
|
if (udfc->gUdfcState == UDFC_STATE_STOPPING) {
|
||||||
|
uv_stop(&udfc->gUdfdLoop);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t udfcSpawnUdfd();
|
|
||||||
|
|
||||||
void onUdfdExit(uv_process_t *req, int64_t exit_status, int term_signal) {
|
|
||||||
//TODO: pipe close will be first received
|
|
||||||
debugPrint("Process exited with status %" PRId64 ", signal %d", exit_status, term_signal);
|
|
||||||
uv_close((uv_handle_t *) req, NULL);
|
|
||||||
//TODO: restart the udfd process
|
|
||||||
if (gUdfcState == UDFC_STATE_STOPPING) {
|
|
||||||
if (term_signal != SIGINT) {
|
|
||||||
//TODO: log error
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (gUdfcState == UDFC_STATE_READY) {
|
|
||||||
gUdfcState = UDFC_STATE_RESTARTING;
|
|
||||||
//TODO: asynchronous without blocking. how to do it
|
|
||||||
//cleanUpUvTasks();
|
|
||||||
udfcSpawnUdfd();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t udfcSpawnUdfd() {
|
|
||||||
//TODO: path
|
|
||||||
uv_process_options_t options = {0};
|
|
||||||
static char path[256] = {0};
|
|
||||||
size_t cwdSize;
|
|
||||||
uv_cwd(path, &cwdSize);
|
|
||||||
strcat(path, "/udfd");
|
|
||||||
char* args[2] = {path, NULL};
|
|
||||||
options.args = args;
|
|
||||||
options.file = path;
|
|
||||||
options.exit_cb = onUdfdExit;
|
|
||||||
options.stdio_count = 3;
|
|
||||||
uv_stdio_container_t child_stdio[3];
|
|
||||||
child_stdio[0].flags = UV_IGNORE;
|
|
||||||
child_stdio[1].flags = UV_INHERIT_FD;
|
|
||||||
child_stdio[1].data.fd = 1;
|
|
||||||
child_stdio[2].flags = UV_INHERIT_FD;
|
|
||||||
child_stdio[2].data.fd = 2;
|
|
||||||
options.stdio = child_stdio;
|
|
||||||
//TODO spawn error
|
|
||||||
int err = uv_spawn(&gUdfdLoop, &gUdfdProcess, &options);
|
|
||||||
if (err != 0) {
|
|
||||||
debugPrint("can not spawn udfd. path: %s, error: %s", path, uv_strerror(err));
|
|
||||||
}
|
|
||||||
return err;
|
|
||||||
}
|
|
||||||
|
|
||||||
void constructUdfService(void *argsThread) {
|
void constructUdfService(void *argsThread) {
|
||||||
uv_loop_init(&gUdfdLoop);
|
SUdfdProxy *udfc = (SUdfdProxy*)argsThread;
|
||||||
|
uv_loop_init(&udfc->gUdfdLoop);
|
||||||
|
|
||||||
uv_async_init(&gUdfdLoop, &gUdfLoopTaskAync, udfClientAsyncCb);
|
uv_async_init(&udfc->gUdfdLoop, &udfc->gUdfLoopTaskAync, udfClientAsyncCb);
|
||||||
uv_async_init(&gUdfdLoop, &gUdfLoopStopAsync, udfStopAsyncCb);
|
udfc->gUdfLoopTaskAync.data = udfc;
|
||||||
uv_mutex_init(&gUdfTaskQueueMutex);
|
uv_async_init(&udfc->gUdfdLoop, &udfc->gUdfLoopStopAsync, udfStopAsyncCb);
|
||||||
QUEUE_INIT(&gUdfTaskQueue);
|
udfc->gUdfLoopStopAsync.data = udfc;
|
||||||
QUEUE_INIT(&gUvProcTaskQueue);
|
uv_mutex_init(&udfc->gUdfTaskQueueMutex);
|
||||||
uv_barrier_wait(&gUdfInitBarrier);
|
QUEUE_INIT(&udfc->gUdfTaskQueue);
|
||||||
|
QUEUE_INIT(&udfc->gUvProcTaskQueue);
|
||||||
|
uv_barrier_wait(&udfc->gUdfInitBarrier);
|
||||||
//TODO return value of uv_run
|
//TODO return value of uv_run
|
||||||
uv_run(&gUdfdLoop, UV_RUN_DEFAULT);
|
uv_run(&udfc->gUdfdLoop, UV_RUN_DEFAULT);
|
||||||
uv_loop_close(&gUdfdLoop);
|
uv_loop_close(&udfc->gUdfdLoop);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t udfcOpen(int32_t dnodeId, UdfcHandle *udfc) {
|
||||||
int32_t createUdfdProxy(int32_t dnodeId) {
|
SUdfdProxy *proxy = taosMemoryCalloc(1, sizeof(SUdfdProxy));
|
||||||
gUdfcState = UDFC_STATE_STARTNG;
|
proxy->dnodeId = dnodeId;
|
||||||
uv_barrier_init(&gUdfInitBarrier, 2);
|
proxy->gUdfcState = UDFC_STATE_STARTNG;
|
||||||
uv_thread_create(&gUdfLoopThread, constructUdfService, 0);
|
uv_barrier_init(&proxy->gUdfInitBarrier, 2);
|
||||||
uv_barrier_wait(&gUdfInitBarrier); gUdfcState = UDFC_STATE_READY;
|
uv_thread_create(&proxy->gUdfLoopThread, constructUdfService, proxy);
|
||||||
|
uv_barrier_wait(&proxy->gUdfInitBarrier);
|
||||||
|
proxy->gUdfcState = UDFC_STATE_READY;
|
||||||
|
*udfc = proxy;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t destroyUdfdProxy(int32_t dnodeId) {
|
int32_t udfcClose(UdfcHandle udfcHandle) {
|
||||||
gUdfcState = UDFC_STATE_STOPPING;
|
SUdfdProxy *udfc = udfcHandle;
|
||||||
uv_barrier_destroy(&gUdfInitBarrier);
|
udfc->gUdfcState = UDFC_STATE_STOPPING;
|
||||||
// if (gUdfcState == UDFC_STATE_STOPPING) {
|
uv_async_send(&udfc->gUdfLoopStopAsync);
|
||||||
// uv_process_kill(&gUdfdProcess, SIGINT);
|
uv_thread_join(&udfc->gUdfLoopThread);
|
||||||
// }
|
uv_mutex_destroy(&udfc->gUdfTaskQueueMutex);
|
||||||
uv_async_send(&gUdfLoopStopAsync);
|
uv_barrier_destroy(&udfc->gUdfInitBarrier);
|
||||||
uv_thread_join(&gUdfLoopThread);
|
udfc->gUdfcState = UDFC_STATUS_FINAL;
|
||||||
uv_mutex_destroy(&gUdfTaskQueueMutex);
|
taosMemoryFree(udfc);
|
||||||
gUdfcState = UDFC_STATUS_FINAL;
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1026,11 +980,12 @@ int32_t udfcRunUvTask(SClientUdfTask *task, int8_t uvTaskType) {
|
||||||
return task->errCode;
|
return task->errCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t setupUdf(char udfName[], SEpSet *epSet, UdfHandle *handle) {
|
int32_t setupUdf(UdfcHandle udfc, char udfName[], SEpSet *epSet, UdfcFuncHandle *funcHandle) {
|
||||||
debugPrint("%s", "client setup udf");
|
debugPrint("%s", "client setup udf");
|
||||||
SClientUdfTask *task = taosMemoryMalloc(sizeof(SClientUdfTask));
|
SClientUdfTask *task = taosMemoryMalloc(sizeof(SClientUdfTask));
|
||||||
task->errCode = 0;
|
task->errCode = 0;
|
||||||
task->session = taosMemoryMalloc(sizeof(SUdfUvSession));
|
task->session = taosMemoryMalloc(sizeof(SUdfUvSession));
|
||||||
|
task->session->udfc = udfc;
|
||||||
task->type = UDF_TASK_SETUP;
|
task->type = UDF_TASK_SETUP;
|
||||||
|
|
||||||
SUdfSetupRequest *req = &task->_setup.req;
|
SUdfSetupRequest *req = &task->_setup.req;
|
||||||
|
@ -1046,13 +1001,13 @@ int32_t setupUdf(char udfName[], SEpSet *epSet, UdfHandle *handle) {
|
||||||
|
|
||||||
SUdfSetupResponse *rsp = &task->_setup.rsp;
|
SUdfSetupResponse *rsp = &task->_setup.rsp;
|
||||||
task->session->severHandle = rsp->udfHandle;
|
task->session->severHandle = rsp->udfHandle;
|
||||||
*handle = task->session;
|
*funcHandle = task->session;
|
||||||
int32_t err = task->errCode;
|
int32_t err = task->errCode;
|
||||||
taosMemoryFree(task);
|
taosMemoryFree(task);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t callUdf(UdfHandle handle, int8_t callType, SSDataBlock *input, SUdfInterBuf *state, SUdfInterBuf *state2,
|
int32_t callUdf(UdfcFuncHandle handle, int8_t callType, SSDataBlock *input, SUdfInterBuf *state, SUdfInterBuf *state2,
|
||||||
SSDataBlock* output, SUdfInterBuf *newState) {
|
SSDataBlock* output, SUdfInterBuf *newState) {
|
||||||
debugPrint("%s", "client call udf");
|
debugPrint("%s", "client call udf");
|
||||||
|
|
||||||
|
@ -1121,7 +1076,7 @@ int32_t callUdf(UdfHandle handle, int8_t callType, SSDataBlock *input, SUdfInter
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: translate these calls to callUdf
|
//TODO: translate these calls to callUdf
|
||||||
int32_t callUdfAggInit(UdfHandle handle, SUdfInterBuf *interBuf) {
|
int32_t callUdfAggInit(UdfcFuncHandle handle, SUdfInterBuf *interBuf) {
|
||||||
int8_t callType = TSDB_UDF_CALL_AGG_INIT;
|
int8_t callType = TSDB_UDF_CALL_AGG_INIT;
|
||||||
|
|
||||||
int32_t err = callUdf(handle, callType, NULL, NULL, NULL, NULL, interBuf);
|
int32_t err = callUdf(handle, callType, NULL, NULL, NULL, NULL, interBuf);
|
||||||
|
@ -1131,7 +1086,7 @@ int32_t callUdfAggInit(UdfHandle handle, SUdfInterBuf *interBuf) {
|
||||||
|
|
||||||
// input: block, state
|
// input: block, state
|
||||||
// output: interbuf,
|
// output: interbuf,
|
||||||
int32_t callUdfAggProcess(UdfHandle handle, SSDataBlock *block, SUdfInterBuf *state, SUdfInterBuf *newState) {
|
int32_t callUdfAggProcess(UdfcFuncHandle handle, SSDataBlock *block, SUdfInterBuf *state, SUdfInterBuf *newState) {
|
||||||
int8_t callType = TSDB_UDF_CALL_AGG_PROC;
|
int8_t callType = TSDB_UDF_CALL_AGG_PROC;
|
||||||
int32_t err = callUdf(handle, callType, block, state, NULL, NULL, newState);
|
int32_t err = callUdf(handle, callType, block, state, NULL, NULL, newState);
|
||||||
return err;
|
return err;
|
||||||
|
@ -1139,7 +1094,7 @@ int32_t callUdfAggProcess(UdfHandle handle, SSDataBlock *block, SUdfInterBuf *st
|
||||||
|
|
||||||
// input: interbuf1, interbuf2
|
// input: interbuf1, interbuf2
|
||||||
// output: resultBuf
|
// output: resultBuf
|
||||||
int32_t callUdfAggMerge(UdfHandle handle, SUdfInterBuf *interBuf1, SUdfInterBuf *interBuf2, SUdfInterBuf *resultBuf) {
|
int32_t callUdfAggMerge(UdfcFuncHandle handle, SUdfInterBuf *interBuf1, SUdfInterBuf *interBuf2, SUdfInterBuf *resultBuf) {
|
||||||
int8_t callType = TSDB_UDF_CALL_AGG_MERGE;
|
int8_t callType = TSDB_UDF_CALL_AGG_MERGE;
|
||||||
int32_t err = callUdf(handle, callType, NULL, interBuf1, interBuf2, NULL, resultBuf);
|
int32_t err = callUdf(handle, callType, NULL, interBuf1, interBuf2, NULL, resultBuf);
|
||||||
return err;
|
return err;
|
||||||
|
@ -1147,7 +1102,7 @@ int32_t callUdfAggMerge(UdfHandle handle, SUdfInterBuf *interBuf1, SUdfInterBuf
|
||||||
|
|
||||||
// input: interBuf
|
// input: interBuf
|
||||||
// output: resultData
|
// output: resultData
|
||||||
int32_t callUdfAggFinalize(UdfHandle handle, SUdfInterBuf *interBuf, SUdfInterBuf *resultData) {
|
int32_t callUdfAggFinalize(UdfcFuncHandle handle, SUdfInterBuf *interBuf, SUdfInterBuf *resultData) {
|
||||||
int8_t callType = TSDB_UDF_CALL_AGG_PROC;
|
int8_t callType = TSDB_UDF_CALL_AGG_PROC;
|
||||||
int32_t err = callUdf(handle, callType, NULL, interBuf, NULL, NULL, resultData);
|
int32_t err = callUdf(handle, callType, NULL, interBuf, NULL, NULL, resultData);
|
||||||
return err;
|
return err;
|
||||||
|
@ -1155,13 +1110,13 @@ int32_t callUdfAggFinalize(UdfHandle handle, SUdfInterBuf *interBuf, SUdfInterBu
|
||||||
|
|
||||||
// input: block
|
// input: block
|
||||||
// output: resultData
|
// output: resultData
|
||||||
int32_t callUdfScalaProcess(UdfHandle handle, SSDataBlock *block, SSDataBlock *resultData) {
|
int32_t callUdfScalaProcess(UdfcFuncHandle handle, SSDataBlock *block, SSDataBlock *resultData) {
|
||||||
int8_t callType = TSDB_UDF_CALL_SCALA_PROC;
|
int8_t callType = TSDB_UDF_CALL_SCALA_PROC;
|
||||||
int32_t err = callUdf(handle, callType, block, NULL, NULL, resultData, NULL);
|
int32_t err = callUdf(handle, callType, block, NULL, NULL, resultData, NULL);
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t teardownUdf(UdfHandle handle) {
|
int32_t teardownUdf(UdfcFuncHandle handle) {
|
||||||
debugPrint("%s", "client teardown udf");
|
debugPrint("%s", "client teardown udf");
|
||||||
|
|
||||||
SClientUdfTask *task = taosMemoryMalloc(sizeof(SClientUdfTask));
|
SClientUdfTask *task = taosMemoryMalloc(sizeof(SClientUdfTask));
|
||||||
|
|
|
@ -27,7 +27,10 @@
|
||||||
|
|
||||||
typedef struct SUdfdContext {
|
typedef struct SUdfdContext {
|
||||||
uv_loop_t *loop;
|
uv_loop_t *loop;
|
||||||
|
uv_pipe_t ctrlPipe;
|
||||||
|
uv_signal_t intrSignal;
|
||||||
char listenPipeName[UDF_LISTEN_PIPE_NAME_LEN];
|
char listenPipeName[UDF_LISTEN_PIPE_NAME_LEN];
|
||||||
|
uv_pipe_t listeningPipe;
|
||||||
void *clientRpc;
|
void *clientRpc;
|
||||||
|
|
||||||
uv_mutex_t udfsMutex;
|
uv_mutex_t udfsMutex;
|
||||||
|
@ -76,9 +79,9 @@ typedef struct SUdf {
|
||||||
|
|
||||||
// TODO: low priority: change name onxxx to xxxCb, and udfc or udfd as prefix
|
// TODO: low priority: change name onxxx to xxxCb, and udfc or udfd as prefix
|
||||||
// TODO: add private udf structure.
|
// TODO: add private udf structure.
|
||||||
typedef struct SUdfHandle {
|
typedef struct SUdfcFuncHandle {
|
||||||
SUdf *udf;
|
SUdf *udf;
|
||||||
} SUdfHandle;
|
} SUdfcFuncHandle;
|
||||||
|
|
||||||
int32_t udfdLoadUdf(char* udfName, SUdf* udf) {
|
int32_t udfdLoadUdf(char* udfName, SUdf* udf) {
|
||||||
strcpy(udf->name, udfName);
|
strcpy(udf->name, udfName);
|
||||||
|
@ -143,7 +146,7 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
}
|
}
|
||||||
uv_mutex_unlock(&udf->lock);
|
uv_mutex_unlock(&udf->lock);
|
||||||
}
|
}
|
||||||
SUdfHandle *handle = taosMemoryMalloc(sizeof(SUdfHandle));
|
SUdfcFuncHandle *handle = taosMemoryMalloc(sizeof(SUdfcFuncHandle));
|
||||||
handle->udf = udf;
|
handle->udf = udf;
|
||||||
// TODO: allocate private structure and call init function and set it to handle
|
// TODO: allocate private structure and call init function and set it to handle
|
||||||
SUdfResponse rsp;
|
SUdfResponse rsp;
|
||||||
|
@ -166,7 +169,7 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
case UDF_TASK_CALL: {
|
case UDF_TASK_CALL: {
|
||||||
SUdfCallRequest *call = &request.call;
|
SUdfCallRequest *call = &request.call;
|
||||||
fnDebug("%"PRId64 "call request. call type %d, handle: %"PRIx64, request.seqNum, call->callType, call->udfHandle);
|
fnDebug("%"PRId64 "call request. call type %d, handle: %"PRIx64, request.seqNum, call->callType, call->udfHandle);
|
||||||
SUdfHandle *handle = (SUdfHandle *)(call->udfHandle);
|
SUdfcFuncHandle *handle = (SUdfcFuncHandle *)(call->udfHandle);
|
||||||
SUdf *udf = handle->udf;
|
SUdf *udf = handle->udf;
|
||||||
|
|
||||||
SUdfDataBlock input = {0};
|
SUdfDataBlock input = {0};
|
||||||
|
@ -204,7 +207,7 @@ void udfdProcessRequest(uv_work_t *req) {
|
||||||
case UDF_TASK_TEARDOWN: {
|
case UDF_TASK_TEARDOWN: {
|
||||||
SUdfTeardownRequest *teardown = &request.teardown;
|
SUdfTeardownRequest *teardown = &request.teardown;
|
||||||
fnInfo("teardown. %"PRId64"handle:%"PRIx64, request.seqNum, teardown->udfHandle)
|
fnInfo("teardown. %"PRId64"handle:%"PRIx64, request.seqNum, teardown->udfHandle)
|
||||||
SUdfHandle *handle = (SUdfHandle *)(teardown->udfHandle);
|
SUdfcFuncHandle *handle = (SUdfcFuncHandle *)(teardown->udfHandle);
|
||||||
SUdf *udf = handle->udf;
|
SUdf *udf = handle->udf;
|
||||||
bool unloadUdf = false;
|
bool unloadUdf = false;
|
||||||
uv_mutex_lock(&global.udfsMutex);
|
uv_mutex_lock(&global.udfsMutex);
|
||||||
|
@ -380,10 +383,12 @@ void udfdOnNewConnection(uv_stream_t *server, int status) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void removeListeningPipe(int sig) {
|
void udfdIntrSignalHandler(uv_signal_t *handle, int signum) {
|
||||||
|
fnInfo("udfd signal received: %d\n", signum);
|
||||||
uv_fs_t req;
|
uv_fs_t req;
|
||||||
uv_fs_unlink(global.loop, &req, "udf.sock", NULL);
|
uv_fs_unlink(global.loop, &req, global.listenPipeName, NULL);
|
||||||
exit(0);
|
uv_signal_stop(handle);
|
||||||
|
uv_stop(global.loop);
|
||||||
}
|
}
|
||||||
|
|
||||||
void udfdProcessRpcRsp(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) { return; }
|
void udfdProcessRpcRsp(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) { return; }
|
||||||
|
@ -492,37 +497,67 @@ static int32_t udfdInitLog() {
|
||||||
return taosCreateLog(logName, 1, configDir, NULL, NULL, NULL, 0);
|
return taosCreateLog(logName, 1, configDir, NULL, NULL, NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void udfdCtrlAllocBufCb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
|
||||||
|
buf->base = taosMemoryMalloc(suggested_size);
|
||||||
|
buf->len = suggested_size;
|
||||||
|
}
|
||||||
|
|
||||||
|
void udfdCtrlReadCb(uv_stream_t *q, ssize_t nread, const uv_buf_t *buf) {
|
||||||
|
if (nread < 0) {
|
||||||
|
fnError("udfd ctrl pipe read error. %s", uv_err_name(nread));
|
||||||
|
uv_close((uv_handle_t*)q, NULL);
|
||||||
|
uv_stop(global.loop);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fnError("udfd ctrl pipe read %zu bytes", nread);
|
||||||
|
taosMemoryFree(buf->base);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t removeListeningPipe() {
|
||||||
|
uv_fs_t req;
|
||||||
|
int err = uv_fs_unlink(global.loop, &req, global.listenPipeName, NULL);
|
||||||
|
uv_fs_req_cleanup(&req);
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t udfdUvInit() {
|
static int32_t udfdUvInit() {
|
||||||
uv_loop_t* loop = taosMemoryMalloc(sizeof(uv_loop_t));
|
uv_loop_t* loop = taosMemoryMalloc(sizeof(uv_loop_t));
|
||||||
if (loop) {
|
if (loop) {
|
||||||
uv_loop_init(loop);
|
uv_loop_init(loop);
|
||||||
}
|
}
|
||||||
global.loop = loop;
|
global.loop = loop;
|
||||||
|
|
||||||
|
uv_pipe_init(global.loop, &global.ctrlPipe, 1);
|
||||||
|
uv_pipe_open(&global.ctrlPipe, 0);
|
||||||
|
uv_read_start((uv_stream_t*)&global.ctrlPipe, udfdCtrlAllocBufCb, udfdCtrlReadCb);
|
||||||
|
|
||||||
char dnodeId[8] = {0};
|
char dnodeId[8] = {0};
|
||||||
size_t dnodeIdSize;
|
size_t dnodeIdSize;
|
||||||
uv_os_getenv("DNODE_ID", dnodeId, &dnodeIdSize);
|
int32_t err = uv_os_getenv("DNODE_ID", dnodeId, &dnodeIdSize);
|
||||||
|
if (err != 0) {
|
||||||
|
dnodeId[0] = '1';
|
||||||
|
}
|
||||||
char listenPipeName[32] = {0};
|
char listenPipeName[32] = {0};
|
||||||
snprintf(listenPipeName, sizeof(listenPipeName), "%s%s", UDF_LISTEN_PIPE_NAME_PREFIX, dnodeId);
|
snprintf(listenPipeName, sizeof(listenPipeName), "%s%s", UDF_LISTEN_PIPE_NAME_PREFIX, dnodeId);
|
||||||
strcpy(global.listenPipeName, listenPipeName);
|
strcpy(global.listenPipeName, listenPipeName);
|
||||||
|
|
||||||
uv_fs_t req;
|
removeListeningPipe();
|
||||||
uv_fs_unlink(global.loop, &req, global.listenPipeName, NULL);
|
|
||||||
|
|
||||||
uv_pipe_t server;
|
uv_pipe_init(global.loop, &global.listeningPipe, 0);
|
||||||
uv_pipe_init(global.loop, &server, 0);
|
|
||||||
|
|
||||||
signal(SIGINT, removeListeningPipe);
|
uv_signal_init(global.loop, &global.intrSignal);
|
||||||
|
uv_signal_start(&global.intrSignal, udfdIntrSignalHandler, SIGINT);
|
||||||
|
|
||||||
int r;
|
int r;
|
||||||
fnInfo("bind to pipe %s", global.listenPipeName);
|
fnInfo("bind to pipe %s", global.listenPipeName);
|
||||||
if ((r = uv_pipe_bind(&server, listenPipeName))) {
|
if ((r = uv_pipe_bind(&global.listeningPipe, listenPipeName))) {
|
||||||
fnError("Bind error %s", uv_err_name(r));
|
fnError("Bind error %s", uv_err_name(r));
|
||||||
removeListeningPipe(0);
|
removeListeningPipe();
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if ((r = uv_listen((uv_stream_t *)&server, 128, udfdOnNewConnection))) {
|
if ((r = uv_listen((uv_stream_t *)&global.listeningPipe, 128, udfdOnNewConnection))) {
|
||||||
fnError("Listen error %s", uv_err_name(r));
|
fnError("Listen error %s", uv_err_name(r));
|
||||||
removeListeningPipe(0);
|
removeListeningPipe();
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -8,7 +8,8 @@
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
|
|
||||||
int main(int argc, char *argv[]) {
|
int main(int argc, char *argv[]) {
|
||||||
createUdfdProxy(1);
|
UdfcHandle udfc;
|
||||||
|
udfcOpen(1, &udfc);
|
||||||
uv_sleep(1000);
|
uv_sleep(1000);
|
||||||
char path[256] = {0};
|
char path[256] = {0};
|
||||||
size_t cwdSize = 256;
|
size_t cwdSize = 256;
|
||||||
|
@ -20,9 +21,9 @@ int main(int argc, char *argv[]) {
|
||||||
fprintf(stdout, "current working directory:%s\n", path);
|
fprintf(stdout, "current working directory:%s\n", path);
|
||||||
strcat(path, "/libudf1.so");
|
strcat(path, "/libudf1.so");
|
||||||
|
|
||||||
UdfHandle handle;
|
UdfcFuncHandle handle;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
setupUdf("udf1", &epSet, &handle);
|
setupUdf(udfc, "udf1", &epSet, &handle);
|
||||||
|
|
||||||
SSDataBlock block = {0};
|
SSDataBlock block = {0};
|
||||||
SSDataBlock* pBlock = █
|
SSDataBlock* pBlock = █
|
||||||
|
@ -53,5 +54,5 @@ int main(int argc, char *argv[]) {
|
||||||
}
|
}
|
||||||
teardownUdf(handle);
|
teardownUdf(handle);
|
||||||
|
|
||||||
destroyUdfdProxy(1);
|
udfcClose(udfc);
|
||||||
}
|
}
|
||||||
|
|
|
@ -31,6 +31,9 @@ extern "C" {
|
||||||
typedef enum { MATCH, JUMP, SPLIT, RANGE } InstType;
|
typedef enum { MATCH, JUMP, SPLIT, RANGE } InstType;
|
||||||
|
|
||||||
typedef struct MatchValue {
|
typedef struct MatchValue {
|
||||||
|
#ifdef WINDOWS
|
||||||
|
size_t avoidCompilationErrors;
|
||||||
|
#endif
|
||||||
} MatchValue;
|
} MatchValue;
|
||||||
typedef struct JumpValue {
|
typedef struct JumpValue {
|
||||||
uint32_t step;
|
uint32_t step;
|
||||||
|
|
|
@ -748,7 +748,7 @@ static SArray* tfileGetFileList(const char* path) {
|
||||||
sprintf(buf, "%s/%s", path, file);
|
sprintf(buf, "%s/%s", path, file);
|
||||||
taosArrayPush(files, &buf);
|
taosArrayPush(files, &buf);
|
||||||
}
|
}
|
||||||
taosCloseDir(pDir);
|
taosCloseDir(&pDir);
|
||||||
|
|
||||||
taosArraySort(files, tfileCompare);
|
taosArraySort(files, tfileCompare);
|
||||||
tfileRmExpireFile(files);
|
tfileRmExpireFile(files);
|
||||||
|
|
|
@ -485,7 +485,7 @@ TEST_F(IndexTFileEnv, test_tfile_write) {
|
||||||
std::string colVal("ab");
|
std::string colVal("ab");
|
||||||
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(1, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
|
SIndexTermQuery query = { term, QUERY_TERM};
|
||||||
|
|
||||||
SArray* result = (SArray*)taosArrayInit(1, sizeof(uint64_t));
|
SArray* result = (SArray*)taosArrayInit(1, sizeof(uint64_t));
|
||||||
fObj->Get(&query, result);
|
fObj->Get(&query, result);
|
||||||
|
@ -625,7 +625,7 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
std::string colVal("v3");
|
std::string colVal("v3");
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
|
SIndexTermQuery query = { term, QUERY_TERM };
|
||||||
SArray* ret = (SArray*)taosArrayInit(4, sizeof(suid));
|
SArray* ret = (SArray*)taosArrayInit(4, sizeof(suid));
|
||||||
STermValueType valType;
|
STermValueType valType;
|
||||||
|
|
||||||
|
@ -640,7 +640,7 @@ TEST_F(IndexCacheEnv, cache_test) {
|
||||||
std::string colVal("v2");
|
std::string colVal("v2");
|
||||||
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
SIndexTerm* term = indexTermCreate(0, ADD_VALUE, TSDB_DATA_TYPE_BINARY, colName.c_str(), colName.size(),
|
||||||
colVal.c_str(), colVal.size());
|
colVal.c_str(), colVal.size());
|
||||||
SIndexTermQuery query = {.term = term, .qType = QUERY_TERM};
|
SIndexTermQuery query = { term, QUERY_TERM };
|
||||||
SArray* ret = (SArray*)taosArrayInit(4, sizeof(suid));
|
SArray* ret = (SArray*)taosArrayInit(4, sizeof(suid));
|
||||||
STermValueType valType;
|
STermValueType valType;
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue