Merge branch 'develop' into coverity_scan
This commit is contained in:
commit
c42761a78e
|
@ -52,7 +52,8 @@ matrix:
|
||||||
cd ${TRAVIS_BUILD_DIR}/debug
|
cd ${TRAVIS_BUILD_DIR}/debug
|
||||||
make install > /dev/null || travis_terminate $?
|
make install > /dev/null || travis_terminate $?
|
||||||
|
|
||||||
pip3 install numpy
|
py3ver=`python3 --version|awk '{print $2}'|cut -d "." -f 1,2` && apt install python$py3ver-dev
|
||||||
|
pip3 install psutil
|
||||||
pip3 install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python3/
|
pip3 install --user ${TRAVIS_BUILD_DIR}/src/connector/python/linux/python3/
|
||||||
|
|
||||||
cd ${TRAVIS_BUILD_DIR}/tests
|
cd ${TRAVIS_BUILD_DIR}/tests
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
SET(TD_SYNC FALSE)
|
|
||||||
SET(TD_ACCOUNT FALSE)
|
SET(TD_ACCOUNT FALSE)
|
||||||
SET(TD_ADMIN FALSE)
|
SET(TD_ADMIN FALSE)
|
||||||
SET(TD_GRANT FALSE)
|
SET(TD_GRANT FALSE)
|
||||||
|
@ -17,8 +16,8 @@ MESSAGE(STATUS "Community directory: " ${TD_COMMUNITY_DIR})
|
||||||
|
|
||||||
INCLUDE(cmake/input.inc)
|
INCLUDE(cmake/input.inc)
|
||||||
INCLUDE(cmake/platform.inc)
|
INCLUDE(cmake/platform.inc)
|
||||||
INCLUDE(cmake/env.inc)
|
|
||||||
INCLUDE(cmake/define.inc)
|
INCLUDE(cmake/define.inc)
|
||||||
|
INCLUDE(cmake/env.inc)
|
||||||
INCLUDE(cmake/install.inc)
|
INCLUDE(cmake/install.inc)
|
||||||
|
|
||||||
ADD_SUBDIRECTORY(deps)
|
ADD_SUBDIRECTORY(deps)
|
||||||
|
|
108
cmake/define.inc
108
cmake/define.inc
|
@ -1,10 +1,6 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF (TD_SYNC)
|
|
||||||
ADD_DEFINITIONS(-D_SYNC)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
IF (TD_ACCOUNT)
|
IF (TD_ACCOUNT)
|
||||||
ADD_DEFINITIONS(-D_ACCT)
|
ADD_DEFINITIONS(-D_ACCT)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
@ -32,3 +28,107 @@ ENDIF ()
|
||||||
IF (TD_RANDOM_NETWORK_FAIL)
|
IF (TD_RANDOM_NETWORK_FAIL)
|
||||||
ADD_DEFINITIONS(-DTAOS_RANDOM_NETWORK_FAIL)
|
ADD_DEFINITIONS(-DTAOS_RANDOM_NETWORK_FAIL)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_ARM)
|
||||||
|
ADD_DEFINITIONS(-D_TD_ARM_)
|
||||||
|
IF (TD_ARM_64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_ARM_64_)
|
||||||
|
ENDIF ()
|
||||||
|
IF (TD_ARM_32)
|
||||||
|
ADD_DEFINITIONS(-D_TD_ARM_32_)
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_MIPS)
|
||||||
|
ADD_DEFINITIONS(-D_TD_MIPS_)
|
||||||
|
IF (TD_MIPS_64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_MIPS_64_)
|
||||||
|
ENDIF ()
|
||||||
|
IF (TD_MIPS_32)
|
||||||
|
ADD_DEFINITIONS(-D_TD_MIPS_32_)
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_LINUX_64)
|
||||||
|
ADD_DEFINITIONS(-D_M_X64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_LINUX_64)
|
||||||
|
IF (NOT TD_ARM)
|
||||||
|
IF (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
||||||
|
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -Wno-missing-braces -fPIC -g3 -gdwarf-2 -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||||
|
ELSE ()
|
||||||
|
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -fPIC -malign-double -g3 -gdwarf-2 -malign-stringops -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||||
|
ENDIF ()
|
||||||
|
ELSE ()
|
||||||
|
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -fPIC -g -fsigned-char -fpack-struct=8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||||
|
ENDIF ()
|
||||||
|
FIND_PATH(ICONV_INCLUDE_EXIST iconv.h /usr/include/ /usr/local/include/)
|
||||||
|
IF (ICONV_INCLUDE_EXIST)
|
||||||
|
ADD_DEFINITIONS(-DUSE_LIBICONV)
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_LINUX_32)
|
||||||
|
ADD_DEFINITIONS(-D_TD_LINUX_32)
|
||||||
|
ADD_DEFINITIONS(-DUSE_LIBICONV)
|
||||||
|
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -fPIC -g -fsigned-char -munaligned-access -fpack-struct=8 -latomic -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||||
|
IF (NOT TD_ARM)
|
||||||
|
EXIT ()
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_LINUX)
|
||||||
|
ADD_DEFINITIONS(-DLINUX)
|
||||||
|
ADD_DEFINITIONS(-D_TD_LINUX)
|
||||||
|
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
||||||
|
|
||||||
|
SET(DEBUG_FLAGS "-O0 -DDEBUG")
|
||||||
|
SET(RELEASE_FLAGS "-O0")
|
||||||
|
|
||||||
|
IF (${COVER} MATCHES "true")
|
||||||
|
MESSAGE(STATUS "Test coverage mode, add extra flags")
|
||||||
|
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
|
||||||
|
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage")
|
||||||
|
SET(COMMON_FLAGS "${COMMON_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_APLHINE)
|
||||||
|
SET(COMMON_FLAGS "${COMMON_FLAGS} -largp")
|
||||||
|
link_libraries(/usr/lib/libargp.a)
|
||||||
|
ADD_DEFINITIONS(-D_ALPINE)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_DARWIN_64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_DARWIN_64)
|
||||||
|
ADD_DEFINITIONS(-DDARWIN)
|
||||||
|
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
||||||
|
ADD_DEFINITIONS(-DUSE_LIBICONV)
|
||||||
|
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -Wno-missing-braces -fPIC -g -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
||||||
|
SET(DEBUG_FLAGS "-O0 -DDEBUG")
|
||||||
|
SET(RELEASE_FLAGS "-O0")
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_WINDOWS)
|
||||||
|
ADD_DEFINITIONS(-DWINDOWS)
|
||||||
|
ADD_DEFINITIONS(-D__CLEANUP_C)
|
||||||
|
ADD_DEFINITIONS(-DPTW32_STATIC_LIB)
|
||||||
|
ADD_DEFINITIONS(-DPTW32_BUILD)
|
||||||
|
ADD_DEFINITIONS(-D_MBCS -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
|
||||||
|
SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE)
|
||||||
|
IF (NOT TD_GODLL)
|
||||||
|
SET(COMMON_FLAGS "/nologo /WX /Oi /Oy- /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /errorReport:prompt /analyze-")
|
||||||
|
SET(DEBUG_FLAGS "/Zi /W3 /GL")
|
||||||
|
SET(RELEASE_FLAGS "/W0 /GL")
|
||||||
|
ENDIF ()
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_WINDOWS_64)
|
||||||
|
ADD_DEFINITIONS(-D_M_X64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_WINDOWS_64)
|
||||||
|
ADD_DEFINITIONS(-DUSE_LIBICONV)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (TD_WINDOWS_32)
|
||||||
|
ADD_DEFINITIONS(-D_TD_WINDOWS_32)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,6 @@ 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)
|
||||||
SET(TD_TESTS_OUTPUT_DIR ${PROJECT_BINARY_DIR}/test)
|
SET(TD_TESTS_OUTPUT_DIR ${PROJECT_BINARY_DIR}/test)
|
||||||
|
|
||||||
MESSAGE(STATUS "Operating system dependency directory: " ${TD_OS_DIR})
|
|
||||||
MESSAGE(STATUS "Project source directory: " ${PROJECT_SOURCE_DIR})
|
MESSAGE(STATUS "Project source directory: " ${PROJECT_SOURCE_DIR})
|
||||||
MESSAGE(STATUS "Project binary files output path: " ${PROJECT_BINARY_DIR})
|
MESSAGE(STATUS "Project binary files output path: " ${PROJECT_BINARY_DIR})
|
||||||
MESSAGE(STATUS "Project executable files output path: " ${EXECUTABLE_OUTPUT_PATH})
|
MESSAGE(STATUS "Project executable files output path: " ${EXECUTABLE_OUTPUT_PATH})
|
||||||
|
|
|
@ -14,6 +14,7 @@ PROJECT(TDengine)
|
||||||
#
|
#
|
||||||
|
|
||||||
# Set macro definitions according to os platform
|
# Set macro definitions according to os platform
|
||||||
|
SET(TD_LINUX FALSE)
|
||||||
SET(TD_LINUX_64 FALSE)
|
SET(TD_LINUX_64 FALSE)
|
||||||
SET(TD_LINUX_32 FALSE)
|
SET(TD_LINUX_32 FALSE)
|
||||||
SET(TD_ARM FALSE)
|
SET(TD_ARM FALSE)
|
||||||
|
@ -22,8 +23,11 @@ SET(TD_ARM_32 FALSE)
|
||||||
SET(TD_MIPS FALSE)
|
SET(TD_MIPS FALSE)
|
||||||
SET(TD_MIPS_64 FALSE)
|
SET(TD_MIPS_64 FALSE)
|
||||||
SET(TD_MIPS_32 FALSE)
|
SET(TD_MIPS_32 FALSE)
|
||||||
SET(TD_DARWIN_64 FALSE)
|
SET(TD_WINDOWS FALSE)
|
||||||
SET(TD_WINDOWS_64 FALSE)
|
SET(TD_WINDOWS_64 FALSE)
|
||||||
|
SET(TD_WINDOWS_32 FALSE)
|
||||||
|
SET(TD_DARWIN_64 FALSE)
|
||||||
|
SET(TD_APLHINE FALSE)
|
||||||
|
|
||||||
# if generate ARM version:
|
# if generate ARM version:
|
||||||
# cmake -DCPUTYPE=aarch32 .. or cmake -DCPUTYPE=aarch64
|
# cmake -DCPUTYPE=aarch32 .. or cmake -DCPUTYPE=aarch64
|
||||||
|
@ -31,24 +35,21 @@ IF (${CPUTYPE} MATCHES "aarch32")
|
||||||
SET(TD_ARM TRUE)
|
SET(TD_ARM TRUE)
|
||||||
SET(TD_ARM_32 TRUE)
|
SET(TD_ARM_32 TRUE)
|
||||||
SET(TD_PAGMODE_LITE TRUE)
|
SET(TD_PAGMODE_LITE TRUE)
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_)
|
MESSAGE(STATUS "input cpuType: aarch32")
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_32_)
|
|
||||||
ELSEIF (${CPUTYPE} MATCHES "aarch64")
|
ELSEIF (${CPUTYPE} MATCHES "aarch64")
|
||||||
SET(TD_ARM TRUE)
|
SET(TD_ARM TRUE)
|
||||||
SET(TD_ARM_64 TRUE)
|
SET(TD_ARM_64 TRUE)
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_)
|
MESSAGE(STATUS "input cpuType: aarch64")
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_64_)
|
|
||||||
ELSEIF (${CPUTYPE} MATCHES "mips64")
|
ELSEIF (${CPUTYPE} MATCHES "mips64")
|
||||||
SET(TD_MIPS TRUE)
|
SET(TD_MIPS TRUE)
|
||||||
SET(TD_MIPS_64 TRUE)
|
SET(TD_MIPS_64 TRUE)
|
||||||
ADD_DEFINITIONS(-D_TD_MIPS_)
|
MESSAGE(STATUS "input cpuType: mips64")
|
||||||
ADD_DEFINITIONS(-D_TD_MIPS_64_)
|
|
||||||
ELSEIF (${CPUTYPE} MATCHES "x64")
|
ELSEIF (${CPUTYPE} MATCHES "x64")
|
||||||
MESSAGE(STATUS "input cpuType: " ${CPUTYPE})
|
MESSAGE(STATUS "input cpuType: x64")
|
||||||
ELSEIF (${CPUTYPE} MATCHES "x86")
|
ELSEIF (${CPUTYPE} MATCHES "x86")
|
||||||
MESSAGE(STATUS "input cpuType: " ${CPUTYPE})
|
MESSAGE(STATUS "input cpuType: x86")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
MESSAGE(STATUS "input cpuType: " ${CPUTYPE})
|
MESSAGE(STATUS "input cpuType unknown " ${CPUTYPE})
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -59,16 +60,13 @@ execute_process(COMMAND ${TD_COMMUNITY_DIR}/packaging/tools/get_os.sh "" OUTPUT_
|
||||||
MESSAGE(STATUS "The current os is " ${TD_OS_INFO})
|
MESSAGE(STATUS "The current os is " ${TD_OS_INFO})
|
||||||
|
|
||||||
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
|
SET(TD_LINUX TRUE)
|
||||||
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
||||||
SET(TD_LINUX_64 TRUE)
|
SET(TD_LINUX_64 TRUE)
|
||||||
SET(TD_OS_DIR ${TD_COMMUNITY_DIR}/src/os/linux)
|
|
||||||
ADD_DEFINITIONS(-D_M_X64)
|
|
||||||
MESSAGE(STATUS "The current platform is Linux 64-bit")
|
MESSAGE(STATUS "The current platform is Linux 64-bit")
|
||||||
ELSEIF (${CMAKE_SIZEOF_VOID_P} MATCHES 4)
|
ELSEIF (${CMAKE_SIZEOF_VOID_P} MATCHES 4)
|
||||||
IF (TD_ARM)
|
|
||||||
SET(TD_LINUX_32 TRUE)
|
SET(TD_LINUX_32 TRUE)
|
||||||
SET(TD_OS_DIR ${TD_COMMUNITY_DIR}/src/os/linux)
|
IF (TD_ARM)
|
||||||
#ADD_DEFINITIONS(-D_M_IX86)
|
|
||||||
MESSAGE(STATUS "The current platform is Linux 32-bit")
|
MESSAGE(STATUS "The current platform is Linux 32-bit")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
MESSAGE(FATAL_ERROR "The current platform is Linux 32-bit, but no ARM not supported yet")
|
MESSAGE(FATAL_ERROR "The current platform is Linux 32-bit, but no ARM not supported yet")
|
||||||
|
@ -78,22 +76,26 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
MESSAGE(FATAL_ERROR "The current platform is Linux neither 32-bit nor 64-bit, not supported yet")
|
MESSAGE(FATAL_ERROR "The current platform is Linux neither 32-bit nor 64-bit, not supported yet")
|
||||||
EXIT ()
|
EXIT ()
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
|
IF (${TD_OS_INFO} MATCHES "Alpine")
|
||||||
|
SET(TD_APLHINE TRUE)
|
||||||
|
MESSAGE(STATUS "The current OS is Alpine, append extra flags")
|
||||||
|
ENDIF()
|
||||||
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
||||||
SET(TD_DARWIN_64 TRUE)
|
SET(TD_DARWIN_64 TRUE)
|
||||||
SET(TD_OS_DIR ${TD_COMMUNITY_DIR}/src/os/darwin)
|
|
||||||
MESSAGE(STATUS "The current platform is Darwin 64-bit")
|
MESSAGE(STATUS "The current platform is Darwin 64-bit")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
MESSAGE(FATAL_ERROR "The current platform is Darwin 32-bit, not supported yet")
|
MESSAGE(FATAL_ERROR "The current platform is Darwin 32-bit, not supported yet")
|
||||||
EXIT ()
|
EXIT ()
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
|
SET(TD_WINDOWS TRUE)
|
||||||
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
IF (${CMAKE_SIZEOF_VOID_P} MATCHES 8)
|
||||||
SET(TD_WINDOWS_64 TRUE)
|
SET(TD_WINDOWS_64 TRUE)
|
||||||
SET(TD_OS_DIR ${TD_COMMUNITY_DIR}/src/os/windows)
|
|
||||||
ADD_DEFINITIONS(-D_M_X64)
|
|
||||||
MESSAGE(STATUS "The current platform is Windows 64-bit")
|
MESSAGE(STATUS "The current platform is Windows 64-bit")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
|
SET(TD_WINDOWS_32 TRUE)
|
||||||
MESSAGE(FATAL_ERROR "The current platform is Windows 32-bit, not supported yet")
|
MESSAGE(FATAL_ERROR "The current platform is Windows 32-bit, not supported yet")
|
||||||
EXIT ()
|
EXIT ()
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
@ -101,74 +103,3 @@ ELSE()
|
||||||
MESSAGE(FATAL_ERROR "The current platform is not Linux/Darwin/Windows, stop compile")
|
MESSAGE(FATAL_ERROR "The current platform is not Linux/Darwin/Windows, stop compile")
|
||||||
EXIT ()
|
EXIT ()
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (TD_LINUX_64)
|
|
||||||
SET(DEBUG_FLAGS "-O0 -DDEBUG")
|
|
||||||
SET(RELEASE_FLAGS "-O0")
|
|
||||||
IF (NOT TD_ARM)
|
|
||||||
IF (${CMAKE_CXX_COMPILER_ID} MATCHES "Clang")
|
|
||||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -Wno-missing-braces -fPIC -g3 -gdwarf-2 -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
|
||||||
ELSE ()
|
|
||||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -fPIC -malign-double -g3 -gdwarf-2 -malign-stringops -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
|
||||||
ENDIF ()
|
|
||||||
ELSE ()
|
|
||||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -fPIC -g -fsigned-char -fpack-struct=8 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
|
||||||
ENDIF ()
|
|
||||||
ADD_DEFINITIONS(-DLINUX)
|
|
||||||
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
|
||||||
IF (${TD_OS_INFO} MATCHES "Alpine")
|
|
||||||
MESSAGE(STATUS "The current OS is Alpine, append extra flags")
|
|
||||||
SET(COMMON_FLAGS "${COMMON_FLAGS} -largp")
|
|
||||||
link_libraries(/usr/lib/libargp.a)
|
|
||||||
ADD_DEFINITIONS(-D_ALPINE)
|
|
||||||
ENDIF ()
|
|
||||||
IF (${COVER} MATCHES "true")
|
|
||||||
MESSAGE(STATUS "Test coverage mode, add extra flags")
|
|
||||||
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
|
|
||||||
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage")
|
|
||||||
SET(COMMON_FLAGS "${COMMON_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
|
|
||||||
ENDIF ()
|
|
||||||
ELSEIF (TD_LINUX_32)
|
|
||||||
IF (NOT TD_ARM)
|
|
||||||
EXIT ()
|
|
||||||
ENDIF ()
|
|
||||||
SET(DEBUG_FLAGS "-O0 -DDEBUG")
|
|
||||||
SET(RELEASE_FLAGS "-O0")
|
|
||||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -fPIC -g -fsigned-char -munaligned-access -fpack-struct=8 -latomic -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
|
||||||
ADD_DEFINITIONS(-DLINUX)
|
|
||||||
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
|
||||||
ADD_DEFINITIONS(-DUSE_LIBICONV)
|
|
||||||
IF (${TD_OS_INFO} MATCHES "Alpine")
|
|
||||||
MESSAGE(STATUS "The current OS is Alpine, add extra flags")
|
|
||||||
SET(COMMON_FLAGS "${COMMON_FLAGS} -largp")
|
|
||||||
link_library(/usr/lib/libargp.a)
|
|
||||||
ADD_DEFINITIONS(-D_ALPINE)
|
|
||||||
ENDIF ()
|
|
||||||
IF (${COVER} MATCHES "true")
|
|
||||||
MESSAGE(STATUS "Test coverage mode, add extra flags")
|
|
||||||
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
|
|
||||||
SET(GCC_COVERAGE_LINK_FLAGS "-lgcov --coverage")
|
|
||||||
SET(COMMON_FLAGS "${COMMON_FLAGS} ${GCC_COVERAGE_COMPILE_FLAGS} ${GCC_COVERAGE_LINK_FLAGS}")
|
|
||||||
ENDIF ()
|
|
||||||
ELSEIF (TD_WINDOWS_64)
|
|
||||||
SET(CMAKE_GENERATOR "NMake Makefiles" CACHE INTERNAL "" FORCE)
|
|
||||||
IF (NOT TD_GODLL)
|
|
||||||
SET(COMMON_FLAGS "/nologo /WX /Oi /Oy- /Gm- /EHsc /MT /GS /Gy /fp:precise /Zc:wchar_t /Zc:forScope /Gd /errorReport:prompt /analyze-")
|
|
||||||
SET(DEBUG_FLAGS "/Zi /W3 /GL")
|
|
||||||
SET(RELEASE_FLAGS "/W0 /GL")
|
|
||||||
ENDIF ()
|
|
||||||
ADD_DEFINITIONS(-DWINDOWS)
|
|
||||||
ADD_DEFINITIONS(-D__CLEANUP_C)
|
|
||||||
ADD_DEFINITIONS(-DPTW32_STATIC_LIB)
|
|
||||||
ADD_DEFINITIONS(-DPTW32_BUILD)
|
|
||||||
ADD_DEFINITIONS(-D_MBCS -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE)
|
|
||||||
ELSEIF (TD_DARWIN_64)
|
|
||||||
SET(COMMON_FLAGS "-std=gnu99 -Wall -Werror -Wno-missing-braces -fPIC -g -msse4.2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILE")
|
|
||||||
SET(DEBUG_FLAGS "-O0 -DDEBUG")
|
|
||||||
SET(RELEASE_FLAGS "-O0")
|
|
||||||
ADD_DEFINITIONS(-DDARWIN)
|
|
||||||
ADD_DEFINITIONS(-D_REENTRANT -D__USE_POSIX -D_LIBC_REENTRANT)
|
|
||||||
ELSE ()
|
|
||||||
MESSAGE(FATAL_ERROR "The current platform is not support yet, stop compile")
|
|
||||||
EXIT ()
|
|
||||||
ENDIF ()
|
|
||||||
|
|
|
@ -4,7 +4,7 @@ TDengine要求每个数据采集点单独建表。独立建表的模式能够避
|
||||||
|
|
||||||
## 什么是超级表
|
## 什么是超级表
|
||||||
|
|
||||||
STable是同一类型数据采集点的抽象,是同类型采集实例的集合,包含多张数据结构一样的子表。每个STable为其子表定义了表结构和一组标签:表结构即表中记录的数据列及其数据类型;标签名和数据类型由STable定义,标签值记录着每个子表的静态信息,用以对子表进行分组过滤。子表本质上就是普通的表,由一个时间戳主键和若干个数据列组成,每行记录着具体的数据,数据查询操作与普通表完全相同;但子表与普通表的区别在于每个子表从属于一张超级表,并带有一组由STable定义的标签值。每种类型的采集设备可以定义一个STable。数据模型定义表的每列数据的类型,如温度、压力、电压、电流、GPS实时位置等,而标签信息属于Meta Data,如采集设备的序列号、型号、位置等,是静态的,是表的元数据。用户在创建表(数据采集点)时指定STable(采集类型)外,还可以指定标签的值,也可事后增加或修改。
|
超级表是同一类型数据采集点的抽象,是同类型采集实例的集合,包含多张数据结构一样的子表。每个STable为其子表定义了表结构和一组标签:表结构即表中记录的数据列及其数据类型;标签名和数据类型由STable定义,标签值记录着每个子表的静态信息,用以对子表进行分组过滤。子表本质上就是普通的表,由一个时间戳主键和若干个数据列组成,每行记录着具体的数据,数据查询操作与普通表完全相同;但子表与普通表的区别在于每个子表从属于一张超级表,并带有一组由STable定义的标签值。每种类型的采集设备可以定义一个STable。数据模型定义表的每列数据的类型,如温度、压力、电压、电流、GPS实时位置等,而标签信息属于Meta Data,如采集设备的序列号、型号、位置等,是静态的,是表的元数据。用户在创建表(数据采集点)时指定STable(采集类型)外,还可以指定标签的值,也可事后增加或修改。
|
||||||
|
|
||||||
TDengine扩展标准SQL语法用于定义STable,使用关键词tags指定标签信息。语法如下:
|
TDengine扩展标准SQL语法用于定义STable,使用关键词tags指定标签信息。语法如下:
|
||||||
|
|
||||||
|
|
|
@ -556,7 +556,7 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数
|
||||||
功能说明:统计表中某列的值百分比分位数。
|
功能说明:统计表中某列的值百分比分位数。
|
||||||
返回结果数据类型: 双精度浮点数Double。
|
返回结果数据类型: 双精度浮点数Double。
|
||||||
应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
|
应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
|
||||||
说明:*k*值取值范围0≤*k*≤100,为0的时候等同于MIN,为100的时候等同于MAX。
|
说明:*k*值取值范围0≤*P*≤100,为0的时候等同于MIN,为100的时候等同于MAX。
|
||||||
|
|
||||||
- **APERCENTILE**
|
- **APERCENTILE**
|
||||||
```mysql
|
```mysql
|
||||||
|
@ -565,7 +565,7 @@ TDengine支持针对数据的聚合查询。提供支持的聚合和选择函数
|
||||||
功能说明:统计表中某列的值百分比分位数,与PERCENTILE函数相似,但是返回近似结果。
|
功能说明:统计表中某列的值百分比分位数,与PERCENTILE函数相似,但是返回近似结果。
|
||||||
返回结果数据类型: 双精度浮点数Double。
|
返回结果数据类型: 双精度浮点数Double。
|
||||||
应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
|
应用字段:不能应用在timestamp、binary、nchar、bool类型字段。
|
||||||
说明:*k*值取值范围0≤*k*≤100,为0的时候等同于MIN,为100的时候等同于MAX。推荐使用```APERCENTILE```函数,该函数性能远胜于```PERCENTILE```函数
|
说明:*k*值取值范围0≤*P*≤100,为0的时候等同于MIN,为100的时候等同于MAX。推荐使用```APERCENTILE```函数,该函数性能远胜于```PERCENTILE```函数
|
||||||
|
|
||||||
- **LAST_ROW**
|
- **LAST_ROW**
|
||||||
```mysql
|
```mysql
|
||||||
|
|
|
@ -289,10 +289,10 @@ TDengine supports aggregations over numerical values, they are listed below:
|
||||||
Applied to: table/STable.
|
Applied to: table/STable.
|
||||||
|
|
||||||
|
|
||||||
- **WAVG**
|
- **TWA**
|
||||||
|
|
||||||
```mysql
|
```mysql
|
||||||
SELECT WAVG(field_name) FROM tb_name WHERE clause
|
SELECT TWA(field_name) FROM tb_name WHERE clause
|
||||||
```
|
```
|
||||||
Function: return the time-weighted average value of a specific column
|
Function: return the time-weighted average value of a specific column
|
||||||
Return Data Type: `double`
|
Return Data Type: `double`
|
||||||
|
@ -324,7 +324,7 @@ TDengine supports aggregations over numerical values, they are listed below:
|
||||||
|
|
||||||
- **LEASTSQUARES**
|
- **LEASTSQUARES**
|
||||||
```mysql
|
```mysql
|
||||||
SELECT LEASTSQUARES(field_name) FROM tb_name [WHERE clause]
|
SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause]
|
||||||
```
|
```
|
||||||
Function: performs a linear fit to the primary timestamp and the specified column.
|
Function: performs a linear fit to the primary timestamp and the specified column.
|
||||||
Return Data Type: return a string of the coefficient and the interception of the fitted line.
|
Return Data Type: return a string of the coefficient and the interception of the fitted line.
|
||||||
|
@ -417,6 +417,15 @@ TDengine supports aggregations over numerical values, they are listed below:
|
||||||
Applied to: table/STable.
|
Applied to: table/STable.
|
||||||
Note: The range of `P` is `[0, 100]`. When `P=0` , `PERCENTILE` returns the equal value as `MIN`; when `P=100`, `PERCENTILE` returns the equal value as `MAX`.
|
Note: The range of `P` is `[0, 100]`. When `P=0` , `PERCENTILE` returns the equal value as `MIN`; when `P=100`, `PERCENTILE` returns the equal value as `MAX`.
|
||||||
|
|
||||||
|
- **APERCENTILE**
|
||||||
|
```mysql
|
||||||
|
SELECT APERCENTILE(field_name, P) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
|
```
|
||||||
|
Function: the value of the specified column below which `P` percent of the data points fall, it returns approximate value of percentile.
|
||||||
|
Return Data Type: double.
|
||||||
|
Applicable Data Types: all types except `timestamp`, `binary`, `nchar`, `bool`.
|
||||||
|
Applied to: table/STable.
|
||||||
|
Note: The range of `P` is `[0, 100]`. When `P=0` , `APERCENTILE` returns the equal value as `MIN`; when `P=100`, `APERCENTILE` returns the equal value as `MAX`. `APERCENTILE` has a much better performance than `PERCENTILE`.
|
||||||
|
|
||||||
- **LAST_ROW**
|
- **LAST_ROW**
|
||||||
```mysql
|
```mysql
|
||||||
|
|
|
@ -16,9 +16,9 @@
|
||||||
|
|
||||||
TDengine的所有可执行文件默认存放在 _/usr/local/taos/bin_ 目录下。其中包括:
|
TDengine的所有可执行文件默认存放在 _/usr/local/taos/bin_ 目录下。其中包括:
|
||||||
|
|
||||||
- _taosd_:TDengine服务端可执行文件
|
- _taosd_:TDengine服务端可执行文件。
|
||||||
- _taos_: TDengine Shell可执行文件
|
- _taos_: TDengine Shell可执行文件。
|
||||||
- _taosdump_:数据导出工具
|
- _taosdump_:数据导出工具。
|
||||||
- *rmtaos*: 卸载TDengine的脚本, 该脚本会删除全部的程序和数据文件。请务必谨慎执行,如非必须不建议使用。
|
- *rmtaos*: 卸载TDengine的脚本, 该脚本会删除全部的程序和数据文件。请务必谨慎执行,如非必须不建议使用。
|
||||||
|
|
||||||
您可以通过修改系统配置文件taos.cfg来配置不同的数据目录和日志目录
|
您可以通过修改系统配置文件taos.cfg来配置不同的数据目录和日志目录
|
||||||
|
|
|
@ -11,73 +11,66 @@
|
||||||
# second full-qualified domain name (FQDN) for TDengine system, for cluster edition only
|
# second full-qualified domain name (FQDN) for TDengine system, for cluster edition only
|
||||||
# second cluster_hostname2:6030
|
# second cluster_hostname2:6030
|
||||||
|
|
||||||
# the arbitrator's full-qualified domain name (FQDN) for TDengine system, for cluster edition only
|
|
||||||
# arbitrator arbitrator_hostname:6030
|
|
||||||
|
|
||||||
# the full-qualified domain name (FQDN) of dnode
|
# the full-qualified domain name (FQDN) of dnode
|
||||||
# fqdn hostname:6030
|
# fqdn hostname
|
||||||
|
|
||||||
# port for MNode connect to Client, default udp[6030-6055] tcp[6030]
|
# port for MNode connect to Client, default udp/tcp [6030-6040]
|
||||||
# serverPort 6030
|
# serverPort 6030
|
||||||
|
|
||||||
# http service port, default tcp [6020]
|
# http service port, default tcp [6020]
|
||||||
# httpPort 6020
|
# httpPort 6020
|
||||||
|
|
||||||
# set socket type ("udp" and "tcp")
|
|
||||||
# the server and client should have the same socket type. Otherwise, connect will fail
|
|
||||||
# sockettype udp
|
|
||||||
|
|
||||||
# for the cluster version, data file's directory is configured this way
|
|
||||||
# option mount_path tier_level
|
|
||||||
# dataDir /mnt/disk1/taos 0
|
|
||||||
# dataDir /mnt/disk2/taos 0
|
|
||||||
# dataDir /mnt/disk3/taos 0
|
|
||||||
# dataDir /mnt/disk4/taos 0
|
|
||||||
# dataDir /mnt/disk5/taos 0
|
|
||||||
# dataDir /mnt/disk6/taos 1
|
|
||||||
# dataDir /mnt/disk7/taos 1
|
|
||||||
# for the stand-alone version, data file's directory is configured this way
|
|
||||||
# dataDir /var/lib/taos
|
|
||||||
|
|
||||||
# log file's directory
|
# log file's directory
|
||||||
# logDir /var/log/taos
|
# logDir /var/log/taos
|
||||||
|
|
||||||
# number of management nodes in the system
|
# scriptDir file's directory
|
||||||
# numOfMnodes 3
|
# scriptDir /var/log/taos
|
||||||
|
|
||||||
# optional roles for dnode. 0 - any, 1 - mnode, 2 - dnode
|
# data file's directory
|
||||||
# alternativeRole 0
|
# dataDir /var/lib/taos
|
||||||
|
|
||||||
|
# the arbitrator's full-qualified domain name (FQDN) for TDengine system, for cluster edition only
|
||||||
|
# arbitrator arbitrator_hostname:6030
|
||||||
|
|
||||||
# number of threads per CPU core
|
# number of threads per CPU core
|
||||||
# numOfThreadsPerCore 1.0
|
# numOfThreadsPerCore 1.0
|
||||||
|
|
||||||
# number of vgroups per db
|
|
||||||
# maxVgroupsPerDb 0
|
|
||||||
|
|
||||||
# max number of tables per vnode
|
|
||||||
# maxTablesPerVnode 1000000
|
|
||||||
|
|
||||||
# the ratio of threads responsible for querying in the total thread
|
# the ratio of threads responsible for querying in the total thread
|
||||||
# ratioOfQueryThreads 0.5
|
# ratioOfQueryThreads 0.5
|
||||||
|
|
||||||
# interval of check load balance when the management node is in normal operation
|
# number of management nodes in the system
|
||||||
# balanceInterval 300
|
# numOfMnodes 3
|
||||||
|
|
||||||
# interval of DNode report status to MNode, unit is Second, for cluster version only
|
# if backup vnode directory when remove dnode
|
||||||
# statusInterval 1
|
# vnodeBak 1
|
||||||
|
|
||||||
# interval of Shell send HB to MNode, unit is Second
|
# Whether to start load balancing
|
||||||
# shellActivityTimer 3
|
# balance 1
|
||||||
|
|
||||||
|
# optional roles for dnode. 0 - any, 1 - mnode, 2 - dnode
|
||||||
|
# role 0
|
||||||
|
|
||||||
|
# max timer control block
|
||||||
|
# maxTmrCtrl 512
|
||||||
|
|
||||||
# interval of system monitor
|
# interval of system monitor
|
||||||
# monitorInterval 30
|
# monitorInterval 30
|
||||||
|
|
||||||
|
# number of seconds allowed for a dnode to be offline, for cluster version only
|
||||||
|
# offlineThreshold 8640000
|
||||||
|
|
||||||
# RPC re-try timer, millisecond
|
# RPC re-try timer, millisecond
|
||||||
# rpcTimer 300
|
# rpcTimer 300
|
||||||
|
|
||||||
# RPC maximum time for ack, seconds
|
# RPC maximum time for ack, seconds
|
||||||
# rpcMaxTime 600
|
# rpcMaxTime 600
|
||||||
|
|
||||||
|
# interval of DNode report status to MNode, unit is Second, for cluster version only
|
||||||
|
# statusInterval 1
|
||||||
|
|
||||||
|
# interval of Shell send HB to MNode, unit is Second
|
||||||
|
# shellActivityTimer 3
|
||||||
|
|
||||||
# duration of to keep tableMeta kept in Cache, seconds
|
# duration of to keep tableMeta kept in Cache, seconds
|
||||||
# tableMetaKeepTimer 7200
|
# tableMetaKeepTimer 7200
|
||||||
|
|
||||||
|
@ -87,38 +80,38 @@
|
||||||
# Time window minimum
|
# Time window minimum
|
||||||
# minIntervalTime 10
|
# minIntervalTime 10
|
||||||
|
|
||||||
# max length of an SQL
|
# the max allowed delayed time for launching continuous query. 20ms by default
|
||||||
# maxSQLLength 65380
|
# maxStreamCompDelay 20000
|
||||||
|
|
||||||
# Support the maximum number of records allowed for super table time sorting
|
# The minimum time to wait before the first stream execution
|
||||||
# maxNumOfOrderedRes 100000
|
# maxFirstStreamCompDelay 10000
|
||||||
|
|
||||||
# system locale
|
# Retry wait time benchmark
|
||||||
# locale en_US.UTF-8
|
# retryStreamCompDelay 10
|
||||||
|
|
||||||
# default system charset
|
# the delayed time for launching each continuous query. 10% of the whole computing time window by default.
|
||||||
# charset UTF-8
|
# streamCompDelayRatio 0.1
|
||||||
|
|
||||||
# system time zone
|
# max number of vgroups per db
|
||||||
# timezone Asia/Shanghai (CST, +0800)
|
# maxVgroupsPerDb 0
|
||||||
|
|
||||||
# set write ahead log (WAL) level
|
# max number of tables per vnode
|
||||||
# walLevel 1
|
# maxTablesPerVnode 1000000
|
||||||
|
|
||||||
# enable/disable async log
|
# Step size of increasing table number in vnode
|
||||||
# asyncLog 1
|
# tableIncStepPerVnode 1000
|
||||||
|
|
||||||
# the compressed rpc message, option:
|
|
||||||
# -1 (no compression)
|
|
||||||
# 0 (all message compressed),
|
|
||||||
# > 0 (rpc message body which larger than this value will be compressed)
|
|
||||||
# compressMsgSize -1
|
|
||||||
|
|
||||||
# cache block size (Mbyte)
|
# cache block size (Mbyte)
|
||||||
# cache 16
|
# cache 16
|
||||||
|
|
||||||
# number of cache blocks per vnode
|
# number of cache blocks per vnode
|
||||||
# blocks 4
|
# blocks 6
|
||||||
|
|
||||||
|
# number of days per DB file
|
||||||
|
# days 10
|
||||||
|
|
||||||
|
# number of days to keep DB file
|
||||||
|
# keep 3650
|
||||||
|
|
||||||
# min row of records in file block
|
# min row of records in file block
|
||||||
# minRows 100
|
# minRows 100
|
||||||
|
@ -127,17 +120,44 @@
|
||||||
# maxRows 4096
|
# maxRows 4096
|
||||||
|
|
||||||
# enable/disable compression
|
# enable/disable compression
|
||||||
# comp 1
|
# comp 2
|
||||||
|
|
||||||
# number of days per DB file
|
# set write ahead log (WAL) level
|
||||||
# days 10
|
# walLevel 1
|
||||||
|
|
||||||
# number of days to keep DB file
|
# When walLevel is set to 2, the cycle of fsync is executed
|
||||||
# keep 3650
|
# fsync 3000
|
||||||
|
|
||||||
# number of replications, for cluster version only
|
# number of replications, for cluster version only
|
||||||
# replica 1
|
# replica 1
|
||||||
|
|
||||||
|
# mqtt uri
|
||||||
|
# mqttBrokerAddress mqtt://username:password@hostname:1883/taos/
|
||||||
|
|
||||||
|
# mqtt client name
|
||||||
|
# mqttBrokerClientId taos_mqtt
|
||||||
|
|
||||||
|
# the compressed rpc message, option:
|
||||||
|
# -1 (no compression)
|
||||||
|
# 0 (all message compressed),
|
||||||
|
# > 0 (rpc message body which larger than this value will be compressed)
|
||||||
|
# compressMsgSize -1
|
||||||
|
|
||||||
|
# max length of an SQL
|
||||||
|
# maxSQLLength 65480
|
||||||
|
|
||||||
|
# Support the maximum number of records allowed for super table time sorting
|
||||||
|
# maxNumOfOrderedRes 100000
|
||||||
|
|
||||||
|
# system time zone
|
||||||
|
# timezone Asia/Shanghai (CST, +0800)
|
||||||
|
|
||||||
|
# system locale
|
||||||
|
# locale en_US.UTF-8
|
||||||
|
|
||||||
|
# default system charset
|
||||||
|
# charset UTF-8
|
||||||
|
|
||||||
# max number of connections from client for dnode
|
# max number of connections from client for dnode
|
||||||
# maxShellConns 5000
|
# maxShellConns 5000
|
||||||
|
|
||||||
|
@ -153,67 +173,53 @@
|
||||||
# Stop writing data when the disk size of the log folder is less than this value
|
# Stop writing data when the disk size of the log folder is less than this value
|
||||||
# minimalDataDirGB 0.1
|
# minimalDataDirGB 0.1
|
||||||
|
|
||||||
# mnode take into account while balance, for cluster version only
|
|
||||||
# mnodeEqualVnodeNum 4
|
|
||||||
|
|
||||||
# number of seconds allowed for a dnode to be offline, for cluster version only
|
|
||||||
# offlineThreshold 864000
|
|
||||||
|
|
||||||
# start http service
|
# start http service
|
||||||
# http 1
|
# http 1
|
||||||
|
|
||||||
|
# start muqq service
|
||||||
|
# mqtt 0
|
||||||
|
|
||||||
# start system monitor module
|
# start system monitor module
|
||||||
# monitor 1
|
# monitor 1
|
||||||
|
|
||||||
# start http service
|
# Record the SQL through restful interface
|
||||||
# mqtt 0
|
# httpEnableRecordSql 0
|
||||||
|
|
||||||
# mqtt uri
|
|
||||||
# mqttBrokerAddress mqtt://username:password@hostname:1883/taos/
|
|
||||||
|
|
||||||
# mqtt client name
|
|
||||||
# mqttBrokerClientId taos_mqtt
|
|
||||||
|
|
||||||
# maximum number of rows returned by the restful interface
|
|
||||||
# restfulRowLimit 10240
|
|
||||||
|
|
||||||
# number of threads used to process http requests
|
# number of threads used to process http requests
|
||||||
# httpMaxThreads 2
|
# httpMaxThreads 2
|
||||||
|
|
||||||
# The minimum time to wait before the first stream execution
|
# maximum number of rows returned by the restful interface
|
||||||
# maxFirstStreamCompDelay 10000
|
# restfulRowLimit 10240
|
||||||
|
|
||||||
# Retry wait time benchmark
|
|
||||||
# retryStreamCompDelay 10
|
|
||||||
|
|
||||||
# the delayed time for launching each continuous query. 10% of the whole computing time window by default.
|
|
||||||
# streamCompDelayRatio 0.1
|
|
||||||
|
|
||||||
# the max allowed delayed time for launching continuous query. 20ms by default
|
|
||||||
# maxStreamCompDelay 20000
|
|
||||||
|
|
||||||
# The following parameter is used to limit the maximum number of lines in log files.
|
# The following parameter is used to limit the maximum number of lines in log files.
|
||||||
# max number of rows per log filters
|
# max number of rows per log filters
|
||||||
# numOfLogLines 10000000
|
# numOfLogLines 10000000
|
||||||
|
|
||||||
|
# enable/disable async log
|
||||||
|
# asyncLog 1
|
||||||
|
|
||||||
# The following parameters are used for debug purpose only.
|
# The following parameters are used for debug purpose only.
|
||||||
# debugFlag 8 bits mask: FILE-SCREEN-UNUSED-HeartBeat-DUMP-TRACE_WARN-ERROR
|
# debugFlag 8 bits mask: FILE-SCREEN-UNUSED-HeartBeat-DUMP-TRACE_WARN-ERROR
|
||||||
# 131: output warning and error,135: output info, warning and error to log.
|
# 131: output warning and error, 135: output debug, warning and error, 143 : output trace, debug, warning and error to log.
|
||||||
# 199: output debug, info, warning and error to both screen and file
|
# 199: output debug, warning and error to both screen and file
|
||||||
|
# 207: output trace, debug, warning and error to both screen and file
|
||||||
|
|
||||||
# debug flag for basic utils
|
# debug flag for all log type, take effect when non-zero value
|
||||||
# debugFlag 131
|
# debugFlag 0
|
||||||
|
|
||||||
# debug flag for meta management messages
|
# debug flag for meta management messages
|
||||||
# mDebugFlag 135
|
# mDebugFlag 135
|
||||||
|
|
||||||
# debug flag for dnode messages
|
# debug flag for dnode messages
|
||||||
# dDebugFlag 131
|
# dDebugFlag 135
|
||||||
|
|
||||||
# debug flag for TDengine SDB
|
# debug flag for sync module
|
||||||
# sDebugFlag 135
|
# sDebugFlag 135
|
||||||
|
|
||||||
# debug flag for TDengine SDB
|
# debug flag for WAL
|
||||||
|
# wDebugFlag 135
|
||||||
|
|
||||||
|
# debug flag for SDB
|
||||||
# sdbDebugFlag 135
|
# sdbDebugFlag 135
|
||||||
|
|
||||||
# debug flag for RPC
|
# debug flag for RPC
|
||||||
|
@ -246,12 +252,12 @@
|
||||||
# debug flag for query
|
# debug flag for query
|
||||||
# qDebugflag 131
|
# qDebugflag 131
|
||||||
|
|
||||||
|
# debug flag for vnode
|
||||||
|
# vDebugflag 131
|
||||||
|
|
||||||
# debug flag for http server
|
# debug flag for http server
|
||||||
# tsdbDebugFlag 131
|
# tsdbDebugFlag 131
|
||||||
|
|
||||||
# Record the SQL through restful interface
|
|
||||||
# httpEnableRecordSql 0
|
|
||||||
|
|
||||||
# Record the SQL in taos client
|
# Record the SQL in taos client
|
||||||
# tscEnableRecordSql 0
|
# tscEnableRecordSql 0
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,88 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# Modified from original source: Elastic Search
|
||||||
|
# https://github.com/elasticsearch/elasticsearch
|
||||||
|
# Thank you to the Elastic Search authors
|
||||||
|
#
|
||||||
|
# chkconfig: 2345 99 01
|
||||||
|
#
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: TDEngine
|
||||||
|
# Required-Start: $local_fs $network $syslog
|
||||||
|
# Required-Stop: $local_fs $network $syslog
|
||||||
|
# Default-Start: 2 3 4 5
|
||||||
|
# Default-Stop: 0 1 6
|
||||||
|
# Short-Description: Starts TDEngine tarbitrator
|
||||||
|
# Description: Starts TDEngine tarbitrator, a arbitrator
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
PATH="/bin:/usr/bin:/sbin:/usr/sbin"
|
||||||
|
NAME="tarbitrator"
|
||||||
|
USER="root"
|
||||||
|
GROUP="root"
|
||||||
|
DAEMON="/usr/local/taos/bin/tarbitrator"
|
||||||
|
DAEMON_OPTS=""
|
||||||
|
PID_FILE="/var/run/$NAME.pid"
|
||||||
|
APPARGS=""
|
||||||
|
|
||||||
|
# Maximum number of open files
|
||||||
|
MAX_OPEN_FILES=65535
|
||||||
|
|
||||||
|
. /lib/lsb/init-functions
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
|
||||||
|
log_action_begin_msg "Starting tarbitrator..."
|
||||||
|
if start-stop-daemon --test --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile "$PID_FILE" --exec "$DAEMON" -- $APPARGS &> /dev/null; then
|
||||||
|
|
||||||
|
touch "$PID_FILE" && chown "$USER":"$GROUP" "$PID_FILE"
|
||||||
|
|
||||||
|
if [ -n "$MAX_OPEN_FILES" ]; then
|
||||||
|
ulimit -n $MAX_OPEN_FILES
|
||||||
|
fi
|
||||||
|
|
||||||
|
start-stop-daemon --start --chuid "$USER:$GROUP" --background --make-pidfile --pidfile "$PID_FILE" --exec "$DAEMON" -- $APPARGS
|
||||||
|
|
||||||
|
log_end_msg $?
|
||||||
|
fi
|
||||||
|
;;
|
||||||
|
|
||||||
|
stop)
|
||||||
|
log_action_begin_msg "Stopping tarbitrator..."
|
||||||
|
set +e
|
||||||
|
if [ -f "$PID_FILE" ]; then
|
||||||
|
start-stop-daemon --stop --pidfile "$PID_FILE" --user "$USER" --retry=TERM/120/KILL/5 > /dev/null
|
||||||
|
if [ $? -eq 1 ]; then
|
||||||
|
log_action_cont_msg "TSD is not running but pid file exists, cleaning up"
|
||||||
|
elif [ $? -eq 3 ]; then
|
||||||
|
PID="`cat $PID_FILE`"
|
||||||
|
log_failure_msg "Failed to stop tarbitrator (pid $PID)"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
rm -f "$PID_FILE"
|
||||||
|
else
|
||||||
|
log_action_cont_msg "tarbitrator was not running"
|
||||||
|
fi
|
||||||
|
log_action_end_msg 0
|
||||||
|
set -e
|
||||||
|
;;
|
||||||
|
|
||||||
|
restart|force-reload)
|
||||||
|
if [ -f "$PID_FILE" ]; then
|
||||||
|
$0 stop
|
||||||
|
sleep 1
|
||||||
|
fi
|
||||||
|
$0 start
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
status_of_proc -p "$PID_FILE" "$DAEMON" "$NAME"
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit 0
|
|
@ -0,0 +1,141 @@
|
||||||
|
#!/bin/bash
|
||||||
|
#
|
||||||
|
# tarbitratord This shell script takes care of starting and stopping tarbitrator.
|
||||||
|
#
|
||||||
|
# chkconfig: 2345 99 01
|
||||||
|
# description: tarbitrator is a arbitrator used in TDengine cluster.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
### BEGIN INIT INFO
|
||||||
|
# Provides: TDEngine
|
||||||
|
# Required-Start: $network $local_fs $remote_fs
|
||||||
|
# Required-Stop: $network $local_fs $remote_fs
|
||||||
|
# Short-Description: start and stop taosd
|
||||||
|
# Description: tarbitrator is a arbitrator used in TDengine cluster.
|
||||||
|
### END INIT INFO
|
||||||
|
|
||||||
|
# Source init functions
|
||||||
|
. /etc/init.d/functions
|
||||||
|
|
||||||
|
# Maximum number of open files
|
||||||
|
MAX_OPEN_FILES=65535
|
||||||
|
|
||||||
|
# Default program options
|
||||||
|
NAME=tarbitrator
|
||||||
|
PROG=/usr/local/taos/bin/tarbitrator
|
||||||
|
USER=root
|
||||||
|
GROUP=root
|
||||||
|
|
||||||
|
# Default directories
|
||||||
|
LOCK_DIR=/var/lock/subsys
|
||||||
|
PID_DIR=/var/run/$NAME
|
||||||
|
|
||||||
|
# Set file names
|
||||||
|
LOCK_FILE=$LOCK_DIR/$NAME
|
||||||
|
PID_FILE=$PID_DIR/$NAME.pid
|
||||||
|
|
||||||
|
[ -e $PID_DIR ] || mkdir -p $PID_DIR
|
||||||
|
|
||||||
|
PROG_OPTS=""
|
||||||
|
|
||||||
|
start() {
|
||||||
|
echo -n "Starting ${NAME}: "
|
||||||
|
# check identity
|
||||||
|
curid="`id -u -n`"
|
||||||
|
if [ "$curid" != root ] && [ "$curid" != "$USER" ] ; then
|
||||||
|
echo "Must be run as root or $USER, but was run as $curid"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
# Sets the maximum number of open file descriptors allowed.
|
||||||
|
ulimit -n $MAX_OPEN_FILES
|
||||||
|
curulimit="`ulimit -n`"
|
||||||
|
if [ "$curulimit" -lt $MAX_OPEN_FILES ] ; then
|
||||||
|
echo "'ulimit -n' must be greater than or equal to $MAX_OPEN_FILES, is $curulimit"
|
||||||
|
return 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [ "`id -u -n`" == root ] ; then
|
||||||
|
# Changes the owner of the lock, and the pid files to allow
|
||||||
|
# non-root OpenTSDB daemons to run /usr/share/opentsdb/bin/opentsdb_restart.py.
|
||||||
|
touch $LOCK_FILE && chown $USER:$GROUP $LOCK_FILE
|
||||||
|
touch $PID_FILE && chown $USER:$GROUP $PID_FILE
|
||||||
|
daemon --user $USER --pidfile $PID_FILE "$PROG $PROG_OPTS &> /dev/null &"
|
||||||
|
else
|
||||||
|
# Don't have to change user.
|
||||||
|
daemon --pidfile $PID_FILE "$PROG $PROG_OPTS &> /dev/null &"
|
||||||
|
fi
|
||||||
|
retval=$?
|
||||||
|
sleep 2
|
||||||
|
echo
|
||||||
|
[ $retval -eq 0 ] && (findproc > $PID_FILE && touch $LOCK_FILE)
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
stop() {
|
||||||
|
echo -n "Stopping ${NAME}: "
|
||||||
|
killproc -p $PID_FILE $NAME
|
||||||
|
retval=$?
|
||||||
|
echo
|
||||||
|
# Non-root users don't have enough permission to remove pid and lock files.
|
||||||
|
# So, the opentsdb_restart.py cannot get rid of the files, and the command
|
||||||
|
# "service opentsdb status" will complain about the existing pid file.
|
||||||
|
# Makes the pid file empty.
|
||||||
|
echo > $PID_FILE
|
||||||
|
[ $retval -eq 0 ] && (rm -f $PID_FILE && rm -f $LOCK_FILE)
|
||||||
|
return $retval
|
||||||
|
}
|
||||||
|
|
||||||
|
restart() {
|
||||||
|
stop
|
||||||
|
start
|
||||||
|
}
|
||||||
|
|
||||||
|
reload() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
force_reload() {
|
||||||
|
restart
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status() {
|
||||||
|
# run checks to determine if the service is running or use generic status
|
||||||
|
status -p $PID_FILE -l $LOCK_FILE $NAME
|
||||||
|
}
|
||||||
|
|
||||||
|
rh_status_q() {
|
||||||
|
rh_status >/dev/null 2>&1
|
||||||
|
}
|
||||||
|
|
||||||
|
case "$1" in
|
||||||
|
start)
|
||||||
|
rh_status_q && exit 0
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
rh_status_q || exit 0
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
restart)
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
reload)
|
||||||
|
rh_status_q || exit 7
|
||||||
|
$1
|
||||||
|
;;
|
||||||
|
force-reload)
|
||||||
|
force_reload
|
||||||
|
;;
|
||||||
|
status)
|
||||||
|
rh_status
|
||||||
|
;;
|
||||||
|
condrestart|try-restart)
|
||||||
|
rh_status_q || exit 0
|
||||||
|
restart
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload}"
|
||||||
|
exit 2
|
||||||
|
esac
|
||||||
|
|
||||||
|
exit $?
|
|
@ -99,6 +99,44 @@ else
|
||||||
os_type=1
|
os_type=1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
# ============================= get input parameters =================================================
|
||||||
|
|
||||||
|
# install.sh -v [server | client] -e [yes | no] -i [systemd | service | ...]
|
||||||
|
|
||||||
|
# set parameters by default value
|
||||||
|
interactiveFqdn=yes # [yes | no]
|
||||||
|
verType=server # [server | client]
|
||||||
|
initType=systemd # [systemd | service | ...]
|
||||||
|
|
||||||
|
while getopts "hv:e:i:" arg
|
||||||
|
do
|
||||||
|
case $arg in
|
||||||
|
e)
|
||||||
|
#echo "interactiveFqdn=$OPTARG"
|
||||||
|
interactiveFqdn=$( echo $OPTARG )
|
||||||
|
;;
|
||||||
|
v)
|
||||||
|
#echo "verType=$OPTARG"
|
||||||
|
verType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
|
i)
|
||||||
|
#echo "initType=$OPTARG"
|
||||||
|
initType=$(echo $OPTARG)
|
||||||
|
;;
|
||||||
|
h)
|
||||||
|
echo "Usage: `basename $0` -v [server | client] -e [yes | no]"
|
||||||
|
exit 0
|
||||||
|
;;
|
||||||
|
?) #unknow option
|
||||||
|
echo "unkonw argument"
|
||||||
|
exit 1
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "verType=${verType} interactiveFqdn=${interactiveFqdn}"
|
||||||
|
|
||||||
function kill_taosd() {
|
function kill_taosd() {
|
||||||
pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}')
|
pid=$(ps -ef | grep "taosd" | grep -v "grep" | awk '{print $2}')
|
||||||
if [ -n "$pid" ]; then
|
if [ -n "$pid" ]; then
|
||||||
|
@ -129,6 +167,7 @@ function install_bin() {
|
||||||
${csudo} rm -f ${bin_link_dir}/taosdemo || :
|
${csudo} rm -f ${bin_link_dir}/taosdemo || :
|
||||||
${csudo} rm -f ${bin_link_dir}/taosdump || :
|
${csudo} rm -f ${bin_link_dir}/taosdump || :
|
||||||
${csudo} rm -f ${bin_link_dir}/rmtaos || :
|
${csudo} rm -f ${bin_link_dir}/rmtaos || :
|
||||||
|
${csudo} rm -f ${bin_link_dir}/tarbitrator || :
|
||||||
|
|
||||||
${csudo} cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo} chmod 0555 ${install_main_dir}/bin/*
|
${csudo} cp -r ${script_dir}/bin/* ${install_main_dir}/bin && ${csudo} chmod 0555 ${install_main_dir}/bin/*
|
||||||
|
|
||||||
|
@ -138,6 +177,7 @@ function install_bin() {
|
||||||
[ -x ${install_main_dir}/bin/taosdump ] && ${csudo} ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || :
|
[ -x ${install_main_dir}/bin/taosdump ] && ${csudo} ln -s ${install_main_dir}/bin/taosdump ${bin_link_dir}/taosdump || :
|
||||||
[ -x ${install_main_dir}/bin/taosdemo ] && ${csudo} ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || :
|
[ -x ${install_main_dir}/bin/taosdemo ] && ${csudo} ln -s ${install_main_dir}/bin/taosdemo ${bin_link_dir}/taosdemo || :
|
||||||
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo} ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/rmtaos || :
|
[ -x ${install_main_dir}/bin/remove.sh ] && ${csudo} ln -s ${install_main_dir}/bin/remove.sh ${bin_link_dir}/rmtaos || :
|
||||||
|
[ -x ${install_main_dir}/bin/tarbitrator ] && ${csudo} ln -s ${install_main_dir}/bin/tarbitrator ${bin_link_dir}/tarbitrator || :
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
if [ "$verMode" == "cluster" ]; then
|
||||||
${csudo} cp -r ${script_dir}/nginxd/* ${nginx_dir} && ${csudo} chmod 0555 ${nginx_dir}/*
|
${csudo} cp -r ${script_dir}/nginxd/* ${nginx_dir} && ${csudo} chmod 0555 ${nginx_dir}/*
|
||||||
|
@ -190,43 +230,48 @@ function install_config() {
|
||||||
return 0
|
return 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
IP_FORMAT="(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
|
if [ "$interactiveFqdn" == "no" ]; then
|
||||||
IP_PATTERN="\b$IP_FORMAT\.$IP_FORMAT\.$IP_FORMAT\.$IP_FORMAT\b"
|
return 0
|
||||||
|
|
||||||
echo
|
|
||||||
echo -e -n "${GREEN}Enter the IP address of an existing TDengine cluster node to join${NC} OR ${GREEN}leave it blank to build one${NC} :"
|
|
||||||
read masterIp
|
|
||||||
while true; do
|
|
||||||
if [ ! -z "$masterIp" ]; then
|
|
||||||
# check the format of the masterIp
|
|
||||||
if [[ $masterIp =~ $IP_PATTERN ]]; then
|
|
||||||
# Write the first IP to configuration file
|
|
||||||
sudo sed -i -r "s/#*\s*(masterIp\s*).*/\1$masterIp/" ${cfg_dir}/taos.cfg
|
|
||||||
|
|
||||||
# Get the second IP address
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo -e -n "${GREEN}Enter the IP address of another node in cluster${NC} OR ${GREEN}leave it blank to skip${NC}: "
|
|
||||||
read secondIp
|
|
||||||
while true; do
|
|
||||||
|
|
||||||
if [ ! -z "$secondIp" ]; then
|
|
||||||
if [[ $secondIp =~ $IP_PATTERN ]]; then
|
|
||||||
# Write the second IP to configuration file
|
|
||||||
sudo sed -i -r "s/#*\s*(secondIp\s*).*/\1$secondIp/" ${cfg_dir}/taos.cfg
|
|
||||||
break
|
|
||||||
else
|
|
||||||
read -p "Please enter the correct IP address: " secondIp
|
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
#FQDN_FORMAT="(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)"
|
||||||
|
#FQDN_FORMAT="(:[1-6][0-9][0-9][0-9][0-9]$)"
|
||||||
|
#PORT_FORMAT="(/[1-6][0-9][0-9][0-9][0-9]?/)"
|
||||||
|
#FQDN_PATTERN=":[0-9]{1,5}$"
|
||||||
|
|
||||||
|
# first full-qualified domain name (FQDN) for TDengine cluster system
|
||||||
|
echo
|
||||||
|
echo -e -n "${GREEN}Enter the FQDN of an existing TDengine cluster node to join${NC} OR ${GREEN}leave it blank to build one${NC} :"
|
||||||
|
read firstFqdn
|
||||||
|
while true; do
|
||||||
|
if [ ! -z "$firstFqdn" ]; then
|
||||||
|
# check the format of the firstFqdn
|
||||||
|
#if [[ $firstFqdn == $FQDN_PATTERN ]]; then
|
||||||
|
# Write the first FQDN to configuration file
|
||||||
|
${csudo} sed -i -r "s/#*\s*(first\s*).*/\1$firstFqdn/" ${cfg_install_dir}/taos.cfg
|
||||||
|
|
||||||
|
# Get the second FQDN
|
||||||
|
echo
|
||||||
|
echo -e -n "${GREEN}Enter the FQDN of another node in cluster${NC} OR ${GREEN}leave it blank to skip${NC}: "
|
||||||
|
read secondFqdn
|
||||||
|
while true; do
|
||||||
|
if [ ! -z "$secondFqdn" ]; then
|
||||||
|
#if [[ $secondFqdn == $FQDN_PATTERN ]]; then
|
||||||
|
# Write the second FQDN to configuration file
|
||||||
|
${csudo} sed -i -r "s/#*\s*(second\s*).*/\1$secondFqdn/" ${cfg_install_dir}/taos.cfg
|
||||||
|
break
|
||||||
|
#else
|
||||||
|
# read -p "Please enter the correct FQDN: " secondFqdn
|
||||||
|
#fi
|
||||||
else
|
else
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
done
|
done
|
||||||
|
|
||||||
break
|
break
|
||||||
else
|
#else
|
||||||
read -p "Please enter the correct IP address: " masterIp
|
# read -p "Please enter the correct FQDN: " firstFqdn
|
||||||
fi
|
#fi
|
||||||
else
|
else
|
||||||
break
|
break
|
||||||
fi
|
fi
|
||||||
|
@ -267,15 +312,23 @@ function clean_service_on_sysvinit() {
|
||||||
${csudo} service taosd stop || :
|
${csudo} service taosd stop || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if pidof tarbitrator &> /dev/null; then
|
||||||
|
${csudo} service tarbitratord stop || :
|
||||||
|
fi
|
||||||
|
|
||||||
if ((${initd_mod}==1)); then
|
if ((${initd_mod}==1)); then
|
||||||
${csudo} chkconfig --del taosd || :
|
${csudo} chkconfig --del taosd || :
|
||||||
|
${csudo} chkconfig --del tarbitratord || :
|
||||||
elif ((${initd_mod}==2)); then
|
elif ((${initd_mod}==2)); then
|
||||||
${csudo} insserv -r taosd || :
|
${csudo} insserv -r taosd || :
|
||||||
|
${csudo} insserv -r tarbitratord || :
|
||||||
elif ((${initd_mod}==3)); then
|
elif ((${initd_mod}==3)); then
|
||||||
${csudo} update-rc.d -f taosd remove || :
|
${csudo} update-rc.d -f taosd remove || :
|
||||||
|
${csudo} update-rc.d -f tarbitratord remove || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${csudo} rm -f ${service_config_dir}/taosd || :
|
${csudo} rm -f ${service_config_dir}/taosd || :
|
||||||
|
${csudo} rm -f ${service_config_dir}/tarbitratord || :
|
||||||
|
|
||||||
if $(which init &> /dev/null); then
|
if $(which init &> /dev/null); then
|
||||||
${csudo} init q || :
|
${csudo} init q || :
|
||||||
|
@ -292,9 +345,13 @@ function install_service_on_sysvinit() {
|
||||||
if ((${os_type}==1)); then
|
if ((${os_type}==1)); then
|
||||||
${csudo} cp -f ${script_dir}/init.d/taosd.deb ${install_main_dir}/init.d/taosd
|
${csudo} cp -f ${script_dir}/init.d/taosd.deb ${install_main_dir}/init.d/taosd
|
||||||
${csudo} cp ${script_dir}/init.d/taosd.deb ${service_config_dir}/taosd && ${csudo} chmod a+x ${service_config_dir}/taosd
|
${csudo} cp ${script_dir}/init.d/taosd.deb ${service_config_dir}/taosd && ${csudo} chmod a+x ${service_config_dir}/taosd
|
||||||
|
${csudo} cp -f ${script_dir}/init.d/tarbitratord.deb ${install_main_dir}/init.d/tarbitratord
|
||||||
|
${csudo} cp ${script_dir}/init.d/tarbitratord.deb ${service_config_dir}/tarbitratord && ${csudo} chmod a+x ${service_config_dir}/tarbitratord
|
||||||
elif ((${os_type}==2)); then
|
elif ((${os_type}==2)); then
|
||||||
${csudo} cp -f ${script_dir}/init.d/taosd.rpm ${install_main_dir}/init.d/taosd
|
${csudo} cp -f ${script_dir}/init.d/taosd.rpm ${install_main_dir}/init.d/taosd
|
||||||
${csudo} cp ${script_dir}/init.d/taosd.rpm ${service_config_dir}/taosd && ${csudo} chmod a+x ${service_config_dir}/taosd
|
${csudo} cp ${script_dir}/init.d/taosd.rpm ${service_config_dir}/taosd && ${csudo} chmod a+x ${service_config_dir}/taosd
|
||||||
|
${csudo} cp -f ${script_dir}/init.d/tarbitratord.rpm ${install_main_dir}/init.d/tarbitratord
|
||||||
|
${csudo} cp ${script_dir}/init.d/tarbitratord.rpm ${service_config_dir}/tarbitratord && ${csudo} chmod a+x ${service_config_dir}/tarbitratord
|
||||||
fi
|
fi
|
||||||
|
|
||||||
#restart_config_str="taos:2345:respawn:${service_config_dir}/taosd start"
|
#restart_config_str="taos:2345:respawn:${service_config_dir}/taosd start"
|
||||||
|
@ -303,11 +360,16 @@ function install_service_on_sysvinit() {
|
||||||
if ((${initd_mod}==1)); then
|
if ((${initd_mod}==1)); then
|
||||||
${csudo} chkconfig --add taosd || :
|
${csudo} chkconfig --add taosd || :
|
||||||
${csudo} chkconfig --level 2345 taosd on || :
|
${csudo} chkconfig --level 2345 taosd on || :
|
||||||
|
${csudo} chkconfig --add tarbitratord || :
|
||||||
|
${csudo} chkconfig --level 2345 tarbitratord on || :
|
||||||
elif ((${initd_mod}==2)); then
|
elif ((${initd_mod}==2)); then
|
||||||
${csudo} insserv taosd || :
|
${csudo} insserv taosd || :
|
||||||
${csudo} insserv -d taosd || :
|
${csudo} insserv -d taosd || :
|
||||||
|
${csudo} insserv tarbitratord || :
|
||||||
|
${csudo} insserv -d tarbitratord || :
|
||||||
elif ((${initd_mod}==3)); then
|
elif ((${initd_mod}==3)); then
|
||||||
${csudo} update-rc.d taosd defaults || :
|
${csudo} update-rc.d taosd defaults || :
|
||||||
|
${csudo} update-rc.d tarbitratord defaults || :
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -332,6 +394,15 @@ function clean_service_on_systemd() {
|
||||||
${csudo} systemctl disable nginxd &> /dev/null || echo &> /dev/null
|
${csudo} systemctl disable nginxd &> /dev/null || echo &> /dev/null
|
||||||
|
|
||||||
${csudo} rm -f ${nginx_service_config}
|
${csudo} rm -f ${nginx_service_config}
|
||||||
|
|
||||||
|
tarbitratord_service_config="${service_config_dir}/tarbitratord.service"
|
||||||
|
if systemctl is-active --quiet tarbitratord; then
|
||||||
|
echo "tarbitrator is running, stopping it..."
|
||||||
|
${csudo} systemctl stop tarbitratord &> /dev/null || echo &> /dev/null
|
||||||
|
fi
|
||||||
|
${csudo} systemctl disable tarbitratord &> /dev/null || echo &> /dev/null
|
||||||
|
|
||||||
|
${csudo} rm -f ${tarbitratord_service_config}
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -364,6 +435,30 @@ function install_service_on_systemd() {
|
||||||
${csudo} systemctl enable taosd
|
${csudo} systemctl enable taosd
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
if [ "$verMode" == "cluster" ]; then
|
||||||
|
|
||||||
|
tarbitratord_service_config="${service_config_dir}/tarbitratord.service"
|
||||||
|
|
||||||
|
${csudo} bash -c "echo '[Unit]' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Description=TDengine arbitrator service' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'After=network-online.target' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Wants=network-online.target' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo '[Service]' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Type=simple' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'ExecStart=/usr/bin/tarbitrator' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'LimitNOFILE=infinity' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'LimitNPROC=infinity' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'LimitCORE=infinity' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'TimeoutStartSec=0' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'StandardOutput=null' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'Restart=always' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'StartLimitBurst=3' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'StartLimitInterval=60s' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo '[Install]' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} bash -c "echo 'WantedBy=multi-user.target' >> ${tarbitratord_service_config}"
|
||||||
|
${csudo} systemctl enable tarbitratord
|
||||||
|
|
||||||
nginx_service_config="${service_config_dir}/nginxd.service"
|
nginx_service_config="${service_config_dir}/nginxd.service"
|
||||||
${csudo} bash -c "echo '[Unit]' >> ${nginx_service_config}"
|
${csudo} bash -c "echo '[Unit]' >> ${nginx_service_config}"
|
||||||
${csudo} bash -c "echo 'Description=Nginx For TDengine Service' >> ${nginx_service_config}"
|
${csudo} bash -c "echo 'Description=Nginx For TDengine Service' >> ${nginx_service_config}"
|
||||||
|
@ -620,7 +715,7 @@ function install_TDengine() {
|
||||||
|
|
||||||
|
|
||||||
## ==============================Main program starts from here============================
|
## ==============================Main program starts from here============================
|
||||||
if [ -z $1 ]; then
|
if [ "$verType" == "server" ]; then
|
||||||
# Install server and client
|
# Install server and client
|
||||||
if [ -x ${bin_dir}/taosd ]; then
|
if [ -x ${bin_dir}/taosd ]; then
|
||||||
update_flag=1
|
update_flag=1
|
||||||
|
@ -628,7 +723,8 @@ if [ -z $1 ]; then
|
||||||
else
|
else
|
||||||
install_TDengine
|
install_TDengine
|
||||||
fi
|
fi
|
||||||
else
|
elif [ "$verType" == "client" ]; then
|
||||||
|
interactiveFqdn=no
|
||||||
# Only install client
|
# Only install client
|
||||||
if [ -x ${bin_dir}/taos ]; then
|
if [ -x ${bin_dir}/taos ]; then
|
||||||
update_flag=1
|
update_flag=1
|
||||||
|
@ -636,4 +732,6 @@ else
|
||||||
else
|
else
|
||||||
install_TDengine client
|
install_TDengine client
|
||||||
fi
|
fi
|
||||||
|
else
|
||||||
|
echo "please input correct verType"
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -36,7 +36,7 @@ if [ "$pagMode" == "lite" ]; then
|
||||||
strip ${build_dir}/bin/taos
|
strip ${build_dir}/bin/taos
|
||||||
bin_files="${build_dir}/bin/taosd ${build_dir}/bin/taos ${script_dir}/remove.sh"
|
bin_files="${build_dir}/bin/taosd ${build_dir}/bin/taos ${script_dir}/remove.sh"
|
||||||
else
|
else
|
||||||
bin_files="${build_dir}/bin/taosd ${build_dir}/bin/taos ${build_dir}/bin/taosdemo ${build_dir}/bin/taosdump ${script_dir}/remove.sh"
|
bin_files="${build_dir}/bin/taosd ${build_dir}/bin/taos ${build_dir}/bin/taosdemo ${build_dir}/bin/taosdump ${build_dir}/bin/tarbitrator ${script_dir}/remove.sh"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
lib_files="${build_dir}/lib/libtaos.so.${version}"
|
lib_files="${build_dir}/lib/libtaos.so.${version}"
|
||||||
|
@ -54,14 +54,18 @@ nginx_dir="${code_dir}/../../enterprise/src/plugins/web"
|
||||||
# temp use rpm's taosd. TODO: later modify according to os type
|
# temp use rpm's taosd. TODO: later modify according to os type
|
||||||
init_file_deb=${script_dir}/../deb/taosd
|
init_file_deb=${script_dir}/../deb/taosd
|
||||||
init_file_rpm=${script_dir}/../rpm/taosd
|
init_file_rpm=${script_dir}/../rpm/taosd
|
||||||
|
init_file_tarbitrator_deb=${script_dir}/../deb/tarbitratord
|
||||||
|
init_file_tarbitrator_rpm=${script_dir}/../rpm/tarbitratord
|
||||||
|
|
||||||
# make directories.
|
# make directories.
|
||||||
mkdir -p ${install_dir}
|
mkdir -p ${install_dir}
|
||||||
mkdir -p ${install_dir}/inc && cp ${header_files} ${install_dir}/inc
|
mkdir -p ${install_dir}/inc && cp ${header_files} ${install_dir}/inc
|
||||||
mkdir -p ${install_dir}/cfg && cp ${cfg_dir}/taos.cfg ${install_dir}/cfg/taos.cfg
|
mkdir -p ${install_dir}/cfg && cp ${cfg_dir}/taos.cfg ${install_dir}/cfg/taos.cfg
|
||||||
mkdir -p ${install_dir}/bin && cp ${bin_files} ${install_dir}/bin && chmod a+x ${install_dir}/bin/*
|
mkdir -p ${install_dir}/bin && cp ${bin_files} ${install_dir}/bin && chmod a+x ${install_dir}/bin/* || :
|
||||||
mkdir -p ${install_dir}/init.d && cp ${init_file_deb} ${install_dir}/init.d/taosd.deb
|
mkdir -p ${install_dir}/init.d && cp ${init_file_deb} ${install_dir}/init.d/taosd.deb
|
||||||
mkdir -p ${install_dir}/init.d && cp ${init_file_rpm} ${install_dir}/init.d/taosd.rpm
|
mkdir -p ${install_dir}/init.d && cp ${init_file_rpm} ${install_dir}/init.d/taosd.rpm
|
||||||
|
mkdir -p ${install_dir}/init.d && cp ${init_file_tarbitrator_deb} ${install_dir}/init.d/tarbitratord.deb || :
|
||||||
|
mkdir -p ${install_dir}/init.d && cp ${init_file_tarbitrator_rpm} ${install_dir}/init.d/tarbitratord.rpm || :
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
if [ "$verMode" == "cluster" ]; then
|
||||||
sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove.sh >> remove_temp.sh
|
sed 's/verMode=edge/verMode=cluster/g' ${install_dir}/bin/remove.sh >> remove_temp.sh
|
||||||
|
|
|
@ -26,6 +26,7 @@ v15_java_app_dir="/usr/local/lib/taos"
|
||||||
|
|
||||||
service_config_dir="/etc/systemd/system"
|
service_config_dir="/etc/systemd/system"
|
||||||
taos_service_name="taosd"
|
taos_service_name="taosd"
|
||||||
|
tarbitrator_service_name="tarbitratord"
|
||||||
nginx_service_name="nginxd"
|
nginx_service_name="nginxd"
|
||||||
csudo=""
|
csudo=""
|
||||||
if command -v sudo > /dev/null; then
|
if command -v sudo > /dev/null; then
|
||||||
|
@ -59,6 +60,12 @@ function kill_taosd() {
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function kill_tarbitrator() {
|
||||||
|
pid=$(ps -ef | grep "tarbitrator" | grep -v "grep" | awk '{print $2}')
|
||||||
|
if [ -n "$pid" ]; then
|
||||||
|
${csudo} kill -9 $pid || :
|
||||||
|
fi
|
||||||
|
}
|
||||||
function clean_bin() {
|
function clean_bin() {
|
||||||
# Remove link
|
# Remove link
|
||||||
${csudo} rm -f ${bin_link_dir}/taos || :
|
${csudo} rm -f ${bin_link_dir}/taos || :
|
||||||
|
@ -102,8 +109,17 @@ function clean_service_on_systemd() {
|
||||||
${csudo} rm -f ${taosd_service_config}
|
${csudo} rm -f ${taosd_service_config}
|
||||||
|
|
||||||
if [ "$verMode" == "cluster" ]; then
|
if [ "$verMode" == "cluster" ]; then
|
||||||
nginx_service_config="${service_config_dir}/${nginx_service_name}.service"
|
tarbitratord_service_config="${service_config_dir}/${tarbitrator_service_name}.service"
|
||||||
|
|
||||||
|
if systemctl is-active --quiet ${tarbitrator_service_name}; then
|
||||||
|
echo "TDengine tarbitrator is running, stopping it..."
|
||||||
|
${csudo} systemctl stop ${tarbitrator_service_name} &> /dev/null || echo &> /dev/null
|
||||||
|
fi
|
||||||
|
${csudo} systemctl disable ${tarbitrator_service_name} &> /dev/null || echo &> /dev/null
|
||||||
|
|
||||||
|
${csudo} rm -f ${tarbitratord_service_config}
|
||||||
|
|
||||||
|
nginx_service_config="${service_config_dir}/${nginx_service_name}.service"
|
||||||
if [ -d ${bin_dir}/web ]; then
|
if [ -d ${bin_dir}/web ]; then
|
||||||
if systemctl is-active --quiet ${nginx_service_name}; then
|
if systemctl is-active --quiet ${nginx_service_name}; then
|
||||||
echo "Nginx for TDengine is running, stopping it..."
|
echo "Nginx for TDengine is running, stopping it..."
|
||||||
|
@ -125,15 +141,24 @@ function clean_service_on_sysvinit() {
|
||||||
${csudo} service taosd stop || :
|
${csudo} service taosd stop || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
if pidof tarbitrator &> /dev/null; then
|
||||||
|
echo "TDengine tarbitrator is running, stopping it..."
|
||||||
|
${csudo} service tarbitratord stop || :
|
||||||
|
fi
|
||||||
|
|
||||||
if ((${initd_mod}==1)); then
|
if ((${initd_mod}==1)); then
|
||||||
${csudo} chkconfig --del taosd || :
|
${csudo} chkconfig --del taosd || :
|
||||||
|
${csudo} chkconfig --del tarbitratord || :
|
||||||
elif ((${initd_mod}==2)); then
|
elif ((${initd_mod}==2)); then
|
||||||
${csudo} insserv -r taosd || :
|
${csudo} insserv -r taosd || :
|
||||||
|
${csudo} insserv -r tarbitratord || :
|
||||||
elif ((${initd_mod}==3)); then
|
elif ((${initd_mod}==3)); then
|
||||||
${csudo} update-rc.d -f taosd remove || :
|
${csudo} update-rc.d -f taosd remove || :
|
||||||
|
${csudo} update-rc.d -f tarbitratord remove || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
${csudo} rm -f ${service_config_dir}/taosd || :
|
${csudo} rm -f ${service_config_dir}/taosd || :
|
||||||
|
${csudo} rm -f ${service_config_dir}/tarbitratord || :
|
||||||
|
|
||||||
if $(which init &> /dev/null); then
|
if $(which init &> /dev/null); then
|
||||||
${csudo} init q || :
|
${csudo} init q || :
|
||||||
|
@ -148,6 +173,7 @@ function clean_service() {
|
||||||
else
|
else
|
||||||
# must manual stop taosd
|
# must manual stop taosd
|
||||||
kill_taosd
|
kill_taosd
|
||||||
|
kill_tarbitrator
|
||||||
fi
|
fi
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,8 @@ ADD_SUBDIRECTORY(client)
|
||||||
ADD_SUBDIRECTORY(query)
|
ADD_SUBDIRECTORY(query)
|
||||||
ADD_SUBDIRECTORY(kit)
|
ADD_SUBDIRECTORY(kit)
|
||||||
ADD_SUBDIRECTORY(plugins)
|
ADD_SUBDIRECTORY(plugins)
|
||||||
|
ADD_SUBDIRECTORY(sync)
|
||||||
|
ADD_SUBDIRECTORY(balance)
|
||||||
ADD_SUBDIRECTORY(mnode)
|
ADD_SUBDIRECTORY(mnode)
|
||||||
ADD_SUBDIRECTORY(vnode)
|
ADD_SUBDIRECTORY(vnode)
|
||||||
ADD_SUBDIRECTORY(tsdb)
|
ADD_SUBDIRECTORY(tsdb)
|
||||||
|
|
|
@ -0,0 +1,16 @@
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
PROJECT(TDengine)
|
||||||
|
|
||||||
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/mnode/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/dnode/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/sdb/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(inc)
|
||||||
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
|
ADD_LIBRARY(balance ${SRC})
|
||||||
|
ENDIF ()
|
File diff suppressed because it is too large
Load Diff
|
@ -4,11 +4,11 @@ PROJECT(TDengine)
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
INCLUDE_DIRECTORIES(jni)
|
INCLUDE_DIRECTORIES(jni)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_ENTERPRISE_DIR}/src/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
|
|
|
@ -31,8 +31,8 @@ extern "C" {
|
||||||
#include "tutil.h"
|
#include "tutil.h"
|
||||||
|
|
||||||
#include "qExecutor.h"
|
#include "qExecutor.h"
|
||||||
|
#include "qSqlparser.h"
|
||||||
#include "qTsbuf.h"
|
#include "qTsbuf.h"
|
||||||
#include "qsqlparser.h"
|
|
||||||
#include "tcmdtype.h"
|
#include "tcmdtype.h"
|
||||||
|
|
||||||
// forward declaration
|
// forward declaration
|
||||||
|
@ -66,8 +66,7 @@ typedef struct STableMeta {
|
||||||
int16_t tversion;
|
int16_t tversion;
|
||||||
SCMVgroupInfo vgroupInfo;
|
SCMVgroupInfo vgroupInfo;
|
||||||
SCMCorVgroupInfo corVgroupInfo;
|
SCMCorVgroupInfo corVgroupInfo;
|
||||||
int32_t sid; // the index of one table in a virtual node
|
STableId id;
|
||||||
uint64_t uid; // unique id of a table
|
|
||||||
SSchema schema[]; // if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
|
SSchema schema[]; // if the table is TSDB_CHILD_TABLE, schema is acquired by super table meta info
|
||||||
} STableMeta;
|
} STableMeta;
|
||||||
|
|
||||||
|
|
|
@ -430,7 +430,7 @@ void tscTableMetaCallBack(void *param, TAOS_RES *res, int code) {
|
||||||
pRes->code = code;
|
pRes->code = code;
|
||||||
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tscError("%p ge tableMeta failed, code:%s", pSql, tstrerror(code));
|
tscError("%p get tableMeta failed, code:%s", pSql, tstrerror(code));
|
||||||
goto _error;
|
goto _error;
|
||||||
} else {
|
} else {
|
||||||
tscDebug("%p get tableMeta successfully", pSql);
|
tscDebug("%p get tableMeta successfully", pSql);
|
||||||
|
|
|
@ -2131,6 +2131,11 @@ static STopBotInfo *getTopBotOutputInfo(SQLFunctionCtx *pCtx) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, int32_t functionId, const char *minval, const char *maxval) {
|
bool topbot_datablock_filter(SQLFunctionCtx *pCtx, int32_t functionId, const char *minval, const char *maxval) {
|
||||||
|
SResultInfo *pResInfo = GET_RES_INFO(pCtx);
|
||||||
|
if (pResInfo == NULL) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
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
|
||||||
|
|
|
@ -691,9 +691,15 @@ int32_t tscLocalReducerEnvCreate(SSqlObj *pSql, tExtMemBuffer ***pMemBuffer, tOr
|
||||||
|
|
||||||
pModel = createColumnModel(pSchema, size, capacity);
|
pModel = createColumnModel(pSchema, size, capacity);
|
||||||
|
|
||||||
|
int32_t pg = DEFAULT_PAGE_SIZE;
|
||||||
|
int32_t overhead = sizeof(tFilePage);
|
||||||
|
while((pg - overhead) < pModel->rowSize * 2) {
|
||||||
|
pg *= 2;
|
||||||
|
}
|
||||||
|
|
||||||
size_t numOfSubs = pTableMetaInfo->vgroupList->numOfVgroups;
|
size_t numOfSubs = pTableMetaInfo->vgroupList->numOfVgroups;
|
||||||
for (int32_t i = 0; i < numOfSubs; ++i) {
|
for (int32_t i = 0; i < numOfSubs; ++i) {
|
||||||
(*pMemBuffer)[i] = createExtMemBuffer(nBufferSizes, rlen, pModel);
|
(*pMemBuffer)[i] = createExtMemBuffer(nBufferSizes, rlen, pg, pModel);
|
||||||
(*pMemBuffer)[i]->flushModel = MULTIPLE_APPEND_MODEL;
|
(*pMemBuffer)[i]->flushModel = MULTIPLE_APPEND_MODEL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -104,7 +104,7 @@ int tsParseTime(SSQLToken *pToken, int64_t *time, char **next, char *error, int1
|
||||||
} else if (strncmp(pToken->z, "0", 1) == 0 && pToken->n == 1) {
|
} else if (strncmp(pToken->z, "0", 1) == 0 && pToken->n == 1) {
|
||||||
// do nothing
|
// do nothing
|
||||||
} else if (pToken->type == TK_INTEGER) {
|
} else if (pToken->type == TK_INTEGER) {
|
||||||
useconds = str2int64(pToken->z);
|
useconds = tsosStr2int64(pToken->z);
|
||||||
} else {
|
} else {
|
||||||
// strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
|
// strptime("2001-11-12 18:31:01", "%Y-%m-%d %H:%M:%S", &tm);
|
||||||
if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
|
if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -629,8 +629,8 @@ int32_t tscAllocateMemIfNeed(STableDataBlocks *pDataBlock, int32_t rowSize, int3
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tsSetBlockInfo(SSubmitBlk *pBlocks, const STableMeta *pTableMeta, int32_t numOfRows) {
|
static void tsSetBlockInfo(SSubmitBlk *pBlocks, const STableMeta *pTableMeta, int32_t numOfRows) {
|
||||||
pBlocks->tid = pTableMeta->sid;
|
pBlocks->tid = pTableMeta->id.tid;
|
||||||
pBlocks->uid = pTableMeta->uid;
|
pBlocks->uid = pTableMeta->id.uid;
|
||||||
pBlocks->sversion = pTableMeta->sversion;
|
pBlocks->sversion = pTableMeta->sversion;
|
||||||
pBlocks->numOfRows += numOfRows;
|
pBlocks->numOfRows += numOfRows;
|
||||||
}
|
}
|
||||||
|
@ -686,7 +686,7 @@ static int32_t doParseInsertStatement(SSqlObj *pSql, void *pTableList, char **st
|
||||||
STableComInfo tinfo = tscGetTableInfo(pTableMeta);
|
STableComInfo tinfo = tscGetTableInfo(pTableMeta);
|
||||||
|
|
||||||
STableDataBlocks *dataBuf = NULL;
|
STableDataBlocks *dataBuf = NULL;
|
||||||
int32_t ret = tscGetDataBlockFromList(pTableList, pCmd->pDataBlocks, pTableMeta->uid, TSDB_DEFAULT_PAYLOAD_SIZE,
|
int32_t ret = tscGetDataBlockFromList(pTableList, pCmd->pDataBlocks, pTableMeta->id.uid, TSDB_DEFAULT_PAYLOAD_SIZE,
|
||||||
sizeof(SSubmitBlk), tinfo.rowSize, pTableMetaInfo->name,
|
sizeof(SSubmitBlk), tinfo.rowSize, pTableMetaInfo->name,
|
||||||
pTableMeta, &dataBuf);
|
pTableMeta, &dataBuf);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
|
|
@ -635,7 +635,7 @@ int32_t parseIntervalClause(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SQuerySQL* pQ
|
||||||
int32_t tableIndex = COLUMN_INDEX_INITIAL_VAL;
|
int32_t tableIndex = COLUMN_INDEX_INITIAL_VAL;
|
||||||
for (int32_t i = 0; i < pQueryInfo->numOfTables; ++i) {
|
for (int32_t i = 0; i < pQueryInfo->numOfTables; ++i) {
|
||||||
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, i);
|
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, i);
|
||||||
if (pTableMetaInfo->pTableMeta->uid == uid) {
|
if (pTableMetaInfo->pTableMeta->id.uid == uid) {
|
||||||
tableIndex = i;
|
tableIndex = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3053,7 +3053,7 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr*
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||||
SSchema* pTagSchema1 = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
SSchema* pTagSchema1 = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
||||||
|
|
||||||
pLeft->uid = pTableMetaInfo->pTableMeta->uid;
|
pLeft->uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
pLeft->tagColId = pTagSchema1->colId;
|
pLeft->tagColId = pTagSchema1->colId;
|
||||||
strcpy(pLeft->tableId, pTableMetaInfo->name);
|
strcpy(pLeft->tableId, pTableMetaInfo->name);
|
||||||
|
|
||||||
|
@ -3065,7 +3065,7 @@ static int32_t getJoinCondInfo(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, tSQLExpr*
|
||||||
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
pTableMetaInfo = tscGetMetaInfo(pQueryInfo, index.tableIndex);
|
||||||
SSchema* pTagSchema2 = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
SSchema* pTagSchema2 = tscGetTableColumnSchema(pTableMetaInfo->pTableMeta, index.columnIndex);
|
||||||
|
|
||||||
pRight->uid = pTableMetaInfo->pTableMeta->uid;
|
pRight->uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
pRight->tagColId = pTagSchema2->colId;
|
pRight->tagColId = pTagSchema2->colId;
|
||||||
strcpy(pRight->tableId, pTableMetaInfo->name);
|
strcpy(pRight->tableId, pTableMetaInfo->name);
|
||||||
|
|
||||||
|
@ -3603,7 +3603,7 @@ static int32_t setTableCondForSTableQuery(SSqlCmd* pCmd, SQueryInfo* pQueryInfo,
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableCondIndex);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableCondIndex);
|
||||||
|
|
||||||
STagCond* pTagCond = &pQueryInfo->tagCond;
|
STagCond* pTagCond = &pQueryInfo->tagCond;
|
||||||
pTagCond->tbnameCond.uid = pTableMetaInfo->pTableMeta->uid;
|
pTagCond->tbnameCond.uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
|
|
||||||
assert(pExpr->nSQLOptr == TK_LIKE || pExpr->nSQLOptr == TK_IN);
|
assert(pExpr->nSQLOptr == TK_LIKE || pExpr->nSQLOptr == TK_IN);
|
||||||
|
|
||||||
|
@ -3840,7 +3840,7 @@ static int32_t getTagQueryCondExpr(SSqlCmd* pCmd, SQueryInfo* pQueryInfo, SCondE
|
||||||
|
|
||||||
// add to source column list
|
// add to source column list
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, i);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, i);
|
||||||
int64_t uid = pTableMetaInfo->pTableMeta->uid;
|
int64_t uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
int32_t numOfCols = tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
int32_t numOfCols = tscGetNumOfColumns(pTableMetaInfo->pTableMeta);
|
||||||
|
|
||||||
size_t num = taosArrayGetSize(colList);
|
size_t num = taosArrayGetSize(colList);
|
||||||
|
@ -4506,8 +4506,8 @@ int32_t setAlterTableInfo(SSqlObj* pSql, struct SSqlInfo* pInfo) {
|
||||||
|
|
||||||
SUpdateTableTagValMsg* pUpdateMsg = (SUpdateTableTagValMsg*) pCmd->payload;
|
SUpdateTableTagValMsg* pUpdateMsg = (SUpdateTableTagValMsg*) pCmd->payload;
|
||||||
pUpdateMsg->head.vgId = htonl(pTableMeta->vgroupInfo.vgId);
|
pUpdateMsg->head.vgId = htonl(pTableMeta->vgroupInfo.vgId);
|
||||||
pUpdateMsg->tid = htonl(pTableMeta->sid);
|
pUpdateMsg->tid = htonl(pTableMeta->id.tid);
|
||||||
pUpdateMsg->uid = htobe64(pTableMeta->uid);
|
pUpdateMsg->uid = htobe64(pTableMeta->id.uid);
|
||||||
pUpdateMsg->colId = htons(pTagsSchema->colId);
|
pUpdateMsg->colId = htons(pTagsSchema->colId);
|
||||||
pUpdateMsg->type = pTagsSchema->type;
|
pUpdateMsg->type = pTagsSchema->type;
|
||||||
pUpdateMsg->bytes = htons(pTagsSchema->bytes);
|
pUpdateMsg->bytes = htons(pTagsSchema->bytes);
|
||||||
|
@ -4992,6 +4992,7 @@ static void setCreateDBOption(SCMCreateDbMsg* pMsg, SCreateDBInfo* pCreateDb) {
|
||||||
pMsg->compression = pCreateDb->compressionLevel;
|
pMsg->compression = pCreateDb->compressionLevel;
|
||||||
pMsg->walLevel = (char)pCreateDb->walLevel;
|
pMsg->walLevel = (char)pCreateDb->walLevel;
|
||||||
pMsg->replications = pCreateDb->replica;
|
pMsg->replications = pCreateDb->replica;
|
||||||
|
pMsg->quorum = pCreateDb->quorum;
|
||||||
pMsg->ignoreExist = pCreateDb->ignoreExists;
|
pMsg->ignoreExist = pCreateDb->ignoreExists;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5045,7 +5046,7 @@ void addGroupInfoForSubquery(SSqlObj* pParentObj, SSqlObj* pSql, int32_t subClau
|
||||||
|
|
||||||
if (pExpr->functionId != TSDB_FUNC_TAG) {
|
if (pExpr->functionId != TSDB_FUNC_TAG) {
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableIndex);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, tableIndex);
|
||||||
int16_t columnInfo = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->uid);
|
int16_t columnInfo = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
SColumnIndex index = {.tableIndex = 0, .columnIndex = columnInfo};
|
SColumnIndex index = {.tableIndex = 0, .columnIndex = columnInfo};
|
||||||
SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta);
|
SSchema* pSchema = tscGetTableTagSchema(pTableMetaInfo->pTableMeta);
|
||||||
|
|
||||||
|
@ -5522,6 +5523,13 @@ int32_t tscCheckCreateDbParams(SSqlCmd* pCmd, SCMCreateDbMsg* pCreate) {
|
||||||
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg);
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pCreate->quorum != -1 &&
|
||||||
|
(pCreate->quorum < TSDB_MIN_DB_REPLICA_OPTION || pCreate->quorum > TSDB_MAX_DB_REPLICA_OPTION)) {
|
||||||
|
snprintf(msg, tListLen(msg), "invalid db option quorum: %d valid range: [%d, %d]", pCreate->quorum,
|
||||||
|
TSDB_MIN_DB_REPLICA_OPTION, TSDB_MAX_DB_REPLICA_OPTION);
|
||||||
|
return invalidSqlErrMsg(tscGetErrorMsgPayload(pCmd), msg);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t val = htonl(pCreate->daysPerFile);
|
int32_t val = htonl(pCreate->daysPerFile);
|
||||||
if (val != -1 && (val < TSDB_MIN_DAYS_PER_FILE || val > TSDB_MAX_DAYS_PER_FILE)) {
|
if (val != -1 && (val < TSDB_MIN_DAYS_PER_FILE || val > TSDB_MAX_DAYS_PER_FILE)) {
|
||||||
snprintf(msg, tListLen(msg), "invalid db option daysPerFile: %d valid range: [%d, %d]", val,
|
snprintf(msg, tListLen(msg), "invalid db option daysPerFile: %d valid range: [%d, %d]", val,
|
||||||
|
|
|
@ -162,8 +162,8 @@ STableMeta* tscCreateTableMetaFromMsg(STableMetaMsg* pTableMetaMsg, size_t* size
|
||||||
.numOfColumns = pTableMetaMsg->numOfColumns,
|
.numOfColumns = pTableMetaMsg->numOfColumns,
|
||||||
};
|
};
|
||||||
|
|
||||||
pTableMeta->sid = pTableMetaMsg->sid;
|
pTableMeta->id.tid = pTableMetaMsg->sid;
|
||||||
pTableMeta->uid = pTableMetaMsg->uid;
|
pTableMeta->id.uid = pTableMetaMsg->uid;
|
||||||
pTableMeta->vgroupInfo = pTableMetaMsg->vgroup;
|
pTableMeta->vgroupInfo = pTableMetaMsg->vgroup;
|
||||||
|
|
||||||
tscInitCorVgroupInfo(&pTableMeta->corVgroupInfo, &pTableMeta->vgroupInfo);
|
tscInitCorVgroupInfo(&pTableMeta->corVgroupInfo, &pTableMeta->vgroupInfo);
|
||||||
|
|
|
@ -605,9 +605,9 @@ static char *doSerializeTableInfo(SQueryTableMsg* pQueryMsg, SSqlObj *pSql, char
|
||||||
}
|
}
|
||||||
|
|
||||||
STableIdInfo *pTableIdInfo = (STableIdInfo *)pMsg;
|
STableIdInfo *pTableIdInfo = (STableIdInfo *)pMsg;
|
||||||
pTableIdInfo->tid = htonl(pTableMeta->sid);
|
pTableIdInfo->tid = htonl(pTableMeta->id.tid);
|
||||||
pTableIdInfo->uid = htobe64(pTableMeta->uid);
|
pTableIdInfo->uid = htobe64(pTableMeta->id.uid);
|
||||||
pTableIdInfo->key = htobe64(tscGetSubscriptionProgress(pSql->pSubscription, pTableMeta->uid, dfltKey));
|
pTableIdInfo->key = htobe64(tscGetSubscriptionProgress(pSql->pSubscription, pTableMeta->id.uid, dfltKey));
|
||||||
|
|
||||||
pQueryMsg->numOfTables = htonl(1); // set the number of tables
|
pQueryMsg->numOfTables = htonl(1); // set the number of tables
|
||||||
pMsg += sizeof(STableIdInfo);
|
pMsg += sizeof(STableIdInfo);
|
||||||
|
@ -640,7 +640,7 @@ static char *doSerializeTableInfo(SQueryTableMsg* pQueryMsg, SSqlObj *pSql, char
|
||||||
}
|
}
|
||||||
|
|
||||||
tscDebug("%p vgId:%d, query on table:%s, tid:%d, uid:%" PRIu64, pSql, htonl(pQueryMsg->head.vgId), pTableMetaInfo->name,
|
tscDebug("%p vgId:%d, query on table:%s, tid:%d, uid:%" PRIu64, pSql, htonl(pQueryMsg->head.vgId), pTableMetaInfo->name,
|
||||||
pTableMeta->sid, pTableMeta->uid);
|
pTableMeta->id.tid, pTableMeta->id.uid);
|
||||||
|
|
||||||
return pMsg;
|
return pMsg;
|
||||||
}
|
}
|
||||||
|
@ -714,8 +714,8 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
|
|
||||||
if (pCol->colIndex.columnIndex >= tscGetNumOfColumns(pTableMeta) || pColSchema->type < TSDB_DATA_TYPE_BOOL ||
|
if (pCol->colIndex.columnIndex >= tscGetNumOfColumns(pTableMeta) || pColSchema->type < TSDB_DATA_TYPE_BOOL ||
|
||||||
pColSchema->type > TSDB_DATA_TYPE_NCHAR) {
|
pColSchema->type > TSDB_DATA_TYPE_NCHAR) {
|
||||||
tscError("%p sid:%d uid:%" PRIu64" id:%s, column index out of range, numOfColumns:%d, index:%d, column name:%s",
|
tscError("%p tid:%d uid:%" PRIu64" id:%s, column index out of range, numOfColumns:%d, index:%d, column name:%s",
|
||||||
pSql, pTableMeta->sid, pTableMeta->uid, pTableMetaInfo->name, tscGetNumOfColumns(pTableMeta), pCol->colIndex.columnIndex,
|
pSql, pTableMeta->id.tid, pTableMeta->id.uid, pTableMetaInfo->name, tscGetNumOfColumns(pTableMeta), pCol->colIndex.columnIndex,
|
||||||
pColSchema->name);
|
pColSchema->name);
|
||||||
|
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
|
@ -833,8 +833,8 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
|
|
||||||
if ((pCol->colIndex.columnIndex >= numOfTagColumns || pCol->colIndex.columnIndex < -1) ||
|
if ((pCol->colIndex.columnIndex >= numOfTagColumns || pCol->colIndex.columnIndex < -1) ||
|
||||||
(pColSchema->type < TSDB_DATA_TYPE_BOOL || pColSchema->type > TSDB_DATA_TYPE_NCHAR)) {
|
(pColSchema->type < TSDB_DATA_TYPE_BOOL || pColSchema->type > TSDB_DATA_TYPE_NCHAR)) {
|
||||||
tscError("%p sid:%d uid:%" PRIu64 " id:%s, tag index out of range, totalCols:%d, numOfTags:%d, index:%d, column name:%s",
|
tscError("%p tid:%d uid:%" PRIu64 " id:%s, tag index out of range, totalCols:%d, numOfTags:%d, index:%d, column name:%s",
|
||||||
pSql, pTableMeta->sid, pTableMeta->uid, pTableMetaInfo->name, total, numOfTagColumns,
|
pSql, pTableMeta->id.tid, pTableMeta->id.uid, pTableMetaInfo->name, total, numOfTagColumns,
|
||||||
pCol->colIndex.columnIndex, pColSchema->name);
|
pCol->colIndex.columnIndex, pColSchema->name);
|
||||||
|
|
||||||
return TSDB_CODE_TSC_INVALID_SQL;
|
return TSDB_CODE_TSC_INVALID_SQL;
|
||||||
|
@ -855,7 +855,7 @@ int tscBuildQueryMsg(SSqlObj *pSql, SSqlInfo *pInfo) {
|
||||||
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0) {
|
if (pQueryInfo->tagCond.pCond != NULL && taosArrayGetSize(pQueryInfo->tagCond.pCond) > 0) {
|
||||||
STagCond* pTagCond = &pQueryInfo->tagCond;
|
STagCond* pTagCond = &pQueryInfo->tagCond;
|
||||||
|
|
||||||
SCond *pCond = tsGetSTableQueryCond(pTagCond, pTableMeta->uid);
|
SCond *pCond = tsGetSTableQueryCond(pTagCond, pTableMeta->id.uid);
|
||||||
if (pCond != NULL && pCond->cond != NULL) {
|
if (pCond != NULL && pCond->cond != NULL) {
|
||||||
pQueryMsg->tagCondLen = htons(pCond->len);
|
pQueryMsg->tagCondLen = htons(pCond->len);
|
||||||
memcpy(pMsg, pCond->cond, pCond->len);
|
memcpy(pMsg, pCond->cond, pCond->len);
|
||||||
|
@ -1739,7 +1739,7 @@ int tscProcessTableMetaRsp(SSqlObj *pSql) {
|
||||||
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
return TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
tscDebug("%p recv table meta, uid:%"PRId64 ", tid:%d, name:%s", pSql, pTableMeta->uid, pTableMeta->sid, pTableMetaInfo->name);
|
tscDebug("%p recv table meta, uid:%"PRId64 ", tid:%d, name:%s", pSql, pTableMeta->id.uid, pTableMeta->id.tid, pTableMetaInfo->name);
|
||||||
free(pTableMeta);
|
free(pTableMeta);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -2215,7 +2215,7 @@ int tscRenewTableMeta(SSqlObj *pSql, char *tableId) {
|
||||||
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
|
STableMeta* pTableMeta = pTableMetaInfo->pTableMeta;
|
||||||
if (pTableMetaInfo->pTableMeta) {
|
if (pTableMetaInfo->pTableMeta) {
|
||||||
tscDebug("%p update table meta, old meta numOfTags:%d, numOfCols:%d, uid:%" PRId64 ", addr:%p", pSql,
|
tscDebug("%p update table meta, old meta numOfTags:%d, numOfCols:%d, uid:%" PRId64 ", addr:%p", pSql,
|
||||||
tscGetNumOfTags(pTableMeta), tscGetNumOfColumns(pTableMeta), pTableMeta->uid, pTableMeta);
|
tscGetNumOfTags(pTableMeta), tscGetNumOfColumns(pTableMeta), pTableMeta->id.uid, pTableMeta);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosCacheRelease(tscCacheHandle, (void **)&(pTableMetaInfo->pTableMeta), true);
|
taosCacheRelease(tscCacheHandle, (void **)&(pTableMetaInfo->pTableMeta), true);
|
||||||
|
|
|
@ -241,7 +241,7 @@ static int tscUpdateSubscription(STscObj* pObj, SSub* pSub) {
|
||||||
STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0);
|
STableMetaInfo *pTableMetaInfo = tscGetTableMetaInfoFromCmd(pCmd, pCmd->clauseIndex, 0);
|
||||||
if (UTIL_TABLE_IS_NORMAL_TABLE(pTableMetaInfo)) {
|
if (UTIL_TABLE_IS_NORMAL_TABLE(pTableMetaInfo)) {
|
||||||
STableMeta * pTableMeta = pTableMetaInfo->pTableMeta;
|
STableMeta * pTableMeta = pTableMetaInfo->pTableMeta;
|
||||||
SSubscriptionProgress target = {.uid = pTableMeta->uid, .key = 0};
|
SSubscriptionProgress target = {.uid = pTableMeta->id.uid, .key = 0};
|
||||||
SSubscriptionProgress* p = taosArraySearch(pSub->progress, &target, tscCompareSubscriptionProgress);
|
SSubscriptionProgress* p = taosArraySearch(pSub->progress, &target, tscCompareSubscriptionProgress);
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
taosArrayClear(pSub->progress);
|
taosArrayClear(pSub->progress);
|
||||||
|
@ -334,7 +334,7 @@ void tscSaveSubscriptionProgress(void* sub) {
|
||||||
|
|
||||||
char path[256];
|
char path[256];
|
||||||
sprintf(path, "%s/subscribe", tsDataDir);
|
sprintf(path, "%s/subscribe", tsDataDir);
|
||||||
if (tmkdir(path, 0777) != 0) {
|
if (taosMkDir(path, 0777) != 0) {
|
||||||
tscError("failed to create subscribe dir: %s", path);
|
tscError("failed to create subscribe dir: %s", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -180,7 +180,7 @@ SJoinSupporter* tscCreateJoinSupporter(SSqlObj* pSql, SSubqueryState* pState, in
|
||||||
pSupporter->limit = pQueryInfo->limit;
|
pSupporter->limit = pQueryInfo->limit;
|
||||||
|
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pSql->cmd, pSql->cmd.clauseIndex, index);
|
STableMetaInfo* pTableMetaInfo = tscGetTableMetaInfoFromCmd(&pSql->cmd, pSql->cmd.clauseIndex, index);
|
||||||
pSupporter->uid = pTableMetaInfo->pTableMeta->uid;
|
pSupporter->uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
assert (pSupporter->uid != 0);
|
assert (pSupporter->uid != 0);
|
||||||
|
|
||||||
getTmpfilePath("join-", pSupporter->path);
|
getTmpfilePath("join-", pSupporter->path);
|
||||||
|
@ -355,7 +355,7 @@ static int32_t tscLaunchRealSubqueries(SSqlObj* pSql) {
|
||||||
// set the join condition tag column info, to do extract method
|
// set the join condition tag column info, to do extract method
|
||||||
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
assert(pQueryInfo->tagCond.joinInfo.hasJoin);
|
assert(pQueryInfo->tagCond.joinInfo.hasJoin);
|
||||||
int16_t colId = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->uid);
|
int16_t colId = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
|
|
||||||
pExpr->param[0].i64Key = colId;
|
pExpr->param[0].i64Key = colId;
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
|
@ -499,7 +499,7 @@ static void issueTSCompQuery(SSqlObj* pSql, SJoinSupporter* pSupporter, SSqlObj*
|
||||||
// set the tags value for ts_comp function
|
// set the tags value for ts_comp function
|
||||||
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, 0);
|
SSqlExpr *pExpr = tscSqlExprGet(pQueryInfo, 0);
|
||||||
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->uid);
|
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
pExpr->param->i64Key = tagColId;
|
pExpr->param->i64Key = tagColId;
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
}
|
}
|
||||||
|
@ -560,7 +560,7 @@ static int32_t getIntersectionOfTableTuple(SQueryInfo* pQueryInfo, SSqlObj* pPar
|
||||||
qsort(p2->pIdTagList, p2->num, p2->tagSize, tscCompareTidTags);
|
qsort(p2->pIdTagList, p2->num, p2->tagSize, tscCompareTidTags);
|
||||||
|
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, 0);
|
||||||
int16_t tagColId = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->uid);
|
int16_t tagColId = tscGetJoinTagColIdByUid(&pQueryInfo->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
|
|
||||||
SSchema* pColSchema = tscGetTableColumnSchemaById(pTableMetaInfo->pTableMeta, tagColId);
|
SSchema* pColSchema = tscGetTableColumnSchemaById(pTableMetaInfo->pTableMeta, tagColId);
|
||||||
|
|
||||||
|
@ -1034,7 +1034,7 @@ void tscSetupOutputColumnIndex(SSqlObj* pSql) {
|
||||||
int32_t tableIndexOfSub = -1;
|
int32_t tableIndexOfSub = -1;
|
||||||
for (int32_t j = 0; j < pQueryInfo->numOfTables; ++j) {
|
for (int32_t j = 0; j < pQueryInfo->numOfTables; ++j) {
|
||||||
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, j);
|
STableMetaInfo* pTableMetaInfo = tscGetMetaInfo(pQueryInfo, j);
|
||||||
if (pTableMetaInfo->pTableMeta->uid == pExpr->uid) {
|
if (pTableMetaInfo->pTableMeta->id.uid == pExpr->uid) {
|
||||||
tableIndexOfSub = j;
|
tableIndexOfSub = j;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1205,7 +1205,7 @@ int32_t tscLaunchJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
|
||||||
STagCond* pTagCond = &pSupporter->tagCond;
|
STagCond* pTagCond = &pSupporter->tagCond;
|
||||||
assert(pTagCond->joinInfo.hasJoin);
|
assert(pTagCond->joinInfo.hasJoin);
|
||||||
|
|
||||||
int32_t tagColId = tscGetJoinTagColIdByUid(pTagCond, pTableMetaInfo->pTableMeta->uid);
|
int32_t tagColId = tscGetJoinTagColIdByUid(pTagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
SSchema* s = tscGetTableColumnSchemaById(pTableMetaInfo->pTableMeta, tagColId);
|
SSchema* s = tscGetTableColumnSchemaById(pTableMetaInfo->pTableMeta, tagColId);
|
||||||
|
|
||||||
int16_t bytes = 0;
|
int16_t bytes = 0;
|
||||||
|
@ -1237,7 +1237,7 @@ int32_t tscLaunchJoinSubquery(SSqlObj *pSql, int16_t tableIndex, SJoinSupporter
|
||||||
SSqlExpr *pExpr = tscSqlExprGet(pNewQueryInfo, 0);
|
SSqlExpr *pExpr = tscSqlExprGet(pNewQueryInfo, 0);
|
||||||
|
|
||||||
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
if (UTIL_TABLE_IS_SUPER_TABLE(pTableMetaInfo)) {
|
||||||
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->uid);
|
int16_t tagColId = tscGetJoinTagColIdByUid(&pSupporter->tagCond, pTableMetaInfo->pTableMeta->id.uid);
|
||||||
pExpr->param->i64Key = tagColId;
|
pExpr->param->i64Key = tagColId;
|
||||||
pExpr->numOfParams = 1;
|
pExpr->numOfParams = 1;
|
||||||
}
|
}
|
||||||
|
@ -1505,12 +1505,11 @@ static int32_t tscReissueSubquery(SRetrieveSupport *trsupport, SSqlObj *pSql, in
|
||||||
|
|
||||||
SSqlObj *pNew = tscCreateSqlObjForSubquery(trsupport->pParentSql, trsupport, pSql);
|
SSqlObj *pNew = tscCreateSqlObjForSubquery(trsupport->pParentSql, trsupport, pSql);
|
||||||
|
|
||||||
// todo add to async res or not??
|
|
||||||
if (pNew == NULL) {
|
if (pNew == NULL) {
|
||||||
tscError("%p sub:%p failed to create new subquery due to out of memory, abort retry, vgId:%d, orderOfSub:%d",
|
tscError("%p sub:%p failed to create new subquery due to error:%s, abort retry, vgId:%d, orderOfSub:%d",
|
||||||
trsupport->pParentSql, pSql, pVgroup->vgId, trsupport->subqueryIndex);
|
trsupport->pParentSql, pSql, tstrerror(terrno), pVgroup->vgId, trsupport->subqueryIndex);
|
||||||
|
|
||||||
pParentSql->res.code = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
pParentSql->res.code = terrno;
|
||||||
trsupport->numOfRetry = MAX_NUM_OF_SUBQUERY_RETRY;
|
trsupport->numOfRetry = MAX_NUM_OF_SUBQUERY_RETRY;
|
||||||
|
|
||||||
return pParentSql->res.code;
|
return pParentSql->res.code;
|
||||||
|
|
|
@ -148,7 +148,7 @@ void taos_init_imp() {
|
||||||
refreshTime = refreshTime < 10 ? 10 : refreshTime;
|
refreshTime = refreshTime < 10 ? 10 : refreshTime;
|
||||||
|
|
||||||
if (tscCacheHandle == NULL) {
|
if (tscCacheHandle == NULL) {
|
||||||
tscCacheHandle = taosCacheInit(TSDB_DATA_TYPE_BINARY, refreshTime, false, NULL, "client");
|
tscCacheHandle = taosCacheInit(TSDB_DATA_TYPE_BINARY, refreshTime, false, NULL, "tableMeta");
|
||||||
}
|
}
|
||||||
|
|
||||||
tscDebug("client is initialized successfully");
|
tscDebug("client is initialized successfully");
|
||||||
|
@ -220,7 +220,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) {
|
||||||
|
|
||||||
if (strlen(tsLocale) == 0) { // locale does not set yet
|
if (strlen(tsLocale) == 0) { // locale does not set yet
|
||||||
char* defaultLocale = setlocale(LC_CTYPE, "");
|
char* defaultLocale = setlocale(LC_CTYPE, "");
|
||||||
tstrncpy(tsLocale, defaultLocale, sizeof(tsLocale));
|
tstrncpy(tsLocale, defaultLocale, TSDB_LOCALE_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the user specified locale
|
// set the user specified locale
|
||||||
|
@ -234,7 +234,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) {
|
||||||
tscInfo("failed to set locale:%s, current locale:%s", pStr, tsLocale);
|
tscInfo("failed to set locale:%s, current locale:%s", pStr, tsLocale);
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(tsLocale, locale, sizeof(tsLocale));
|
tstrncpy(tsLocale, locale, TSDB_LOCALE_LEN);
|
||||||
|
|
||||||
char *charset = strrchr(tsLocale, sep);
|
char *charset = strrchr(tsLocale, sep);
|
||||||
if (charset != NULL) {
|
if (charset != NULL) {
|
||||||
|
@ -249,7 +249,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) {
|
||||||
tscInfo("charset changed from %s to %s", tsCharset, charset);
|
tscInfo("charset changed from %s to %s", tsCharset, charset);
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(tsCharset, charset, sizeof(tsCharset));
|
tstrncpy(tsCharset, charset, TSDB_LOCALE_LEN);
|
||||||
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
|
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
|
@ -286,7 +286,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) {
|
||||||
tscInfo("charset changed from %s to %s", tsCharset, pStr);
|
tscInfo("charset changed from %s to %s", tsCharset, pStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
tstrncpy(tsCharset, pStr, sizeof(tsCharset));
|
tstrncpy(tsCharset, pStr, TSDB_LOCALE_LEN);
|
||||||
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
|
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
|
||||||
} else {
|
} else {
|
||||||
tscInfo("charset:%s not valid", pStr);
|
tscInfo("charset:%s not valid", pStr);
|
||||||
|
@ -304,7 +304,7 @@ static int taos_options_imp(TSDB_OPTION option, const char *pStr) {
|
||||||
assert(cfg != NULL);
|
assert(cfg != NULL);
|
||||||
|
|
||||||
if (cfg->cfgStatus <= TAOS_CFG_CSTATUS_OPTION) {
|
if (cfg->cfgStatus <= TAOS_CFG_CSTATUS_OPTION) {
|
||||||
tstrncpy(tsTimezone, pStr, sizeof(tsTimezone));
|
tstrncpy(tsTimezone, pStr, TSDB_TIMEZONE_LEN);
|
||||||
tsSetTimeZone();
|
tsSetTimeZone();
|
||||||
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
|
cfg->cfgStatus = TAOS_CFG_CSTATUS_OPTION;
|
||||||
tscDebug("timezone set:%s, input:%s by taos_options", tsTimezone, pStr);
|
tscDebug("timezone set:%s, input:%s by taos_options", tsTimezone, pStr);
|
||||||
|
|
|
@ -356,9 +356,9 @@ void tscPartiallyFreeSqlObj(SSqlObj* pSql) {
|
||||||
|
|
||||||
// pSql->sqlstr will be used by tscBuildQueryStreamDesc
|
// pSql->sqlstr will be used by tscBuildQueryStreamDesc
|
||||||
if (pObj->signature == pObj) {
|
if (pObj->signature == pObj) {
|
||||||
pthread_mutex_lock(&pObj->mutex);
|
//pthread_mutex_lock(&pObj->mutex);
|
||||||
tfree(pSql->sqlstr);
|
tfree(pSql->sqlstr);
|
||||||
pthread_mutex_unlock(&pObj->mutex);
|
//pthread_mutex_unlock(&pObj->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
tscFreeSqlResult(pSql);
|
tscFreeSqlResult(pSql);
|
||||||
|
@ -955,7 +955,7 @@ static SSqlExpr* doBuildSqlExpr(SQueryInfo* pQueryInfo, int16_t functionId, SCol
|
||||||
pExpr->interBytes = interSize;
|
pExpr->interBytes = interSize;
|
||||||
|
|
||||||
if (pTableMetaInfo->pTableMeta) {
|
if (pTableMetaInfo->pTableMeta) {
|
||||||
pExpr->uid = pTableMetaInfo->pTableMeta->uid;
|
pExpr->uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pExpr;
|
return pExpr;
|
||||||
|
@ -1482,7 +1482,7 @@ STableMetaInfo* tscGetTableMetaInfoByUid(SQueryInfo* pQueryInfo, uint64_t uid, i
|
||||||
int32_t k = -1;
|
int32_t k = -1;
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQueryInfo->numOfTables; ++i) {
|
for (int32_t i = 0; i < pQueryInfo->numOfTables; ++i) {
|
||||||
if (pQueryInfo->pTableMetaInfo[i]->pTableMeta->uid == uid) {
|
if (pQueryInfo->pTableMetaInfo[i]->pTableMeta->id.uid == uid) {
|
||||||
k = i;
|
k = i;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1675,6 +1675,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
SSqlObj* pNew = (SSqlObj*)calloc(1, sizeof(SSqlObj));
|
SSqlObj* pNew = (SSqlObj*)calloc(1, sizeof(SSqlObj));
|
||||||
if (pNew == NULL) {
|
if (pNew == NULL) {
|
||||||
tscError("%p new subquery failed, tableIndex:%d", pSql, tableIndex);
|
tscError("%p new subquery failed, tableIndex:%d", pSql, tableIndex);
|
||||||
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1688,6 +1689,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
tscError("%p new subquery failed, tableIndex:%d, vgroupIndex:%d", pSql, tableIndex, pTableMetaInfo->vgroupIndex);
|
tscError("%p new subquery failed, tableIndex:%d, vgroupIndex:%d", pSql, tableIndex, pTableMetaInfo->vgroupIndex);
|
||||||
|
|
||||||
free(pNew);
|
free(pNew);
|
||||||
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1706,6 +1708,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
|
|
||||||
if (tscAddSubqueryInfo(pnCmd) != TSDB_CODE_SUCCESS) {
|
if (tscAddSubqueryInfo(pnCmd) != TSDB_CODE_SUCCESS) {
|
||||||
tscFreeSqlObj(pNew);
|
tscFreeSqlObj(pNew);
|
||||||
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1743,6 +1746,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
if (tscAllocPayload(pnCmd, TSDB_DEFAULT_PAYLOAD_SIZE) != TSDB_CODE_SUCCESS) {
|
if (tscAllocPayload(pnCmd, TSDB_DEFAULT_PAYLOAD_SIZE) != TSDB_CODE_SUCCESS) {
|
||||||
tscError("%p new subquery failed, tableIndex:%d, vgroupIndex:%d", pSql, tableIndex, pTableMetaInfo->vgroupIndex);
|
tscError("%p new subquery failed, tableIndex:%d, vgroupIndex:%d", pSql, tableIndex, pTableMetaInfo->vgroupIndex);
|
||||||
tscFreeSqlObj(pNew);
|
tscFreeSqlObj(pNew);
|
||||||
|
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1756,7 +1760,7 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
TSDB_QUERY_SET_TYPE(pNewQueryInfo->type, TSDB_QUERY_TYPE_SUBQUERY);// it must be the subquery
|
TSDB_QUERY_SET_TYPE(pNewQueryInfo->type, TSDB_QUERY_TYPE_SUBQUERY);// it must be the subquery
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t uid = pTableMetaInfo->pTableMeta->uid;
|
uint64_t uid = pTableMetaInfo->pTableMeta->id.uid;
|
||||||
tscSqlExprCopy(pNewQueryInfo->exprList, pQueryInfo->exprList, uid, true);
|
tscSqlExprCopy(pNewQueryInfo->exprList, pQueryInfo->exprList, uid, true);
|
||||||
|
|
||||||
int32_t numOfOutput = tscSqlExprNumOfExprs(pNewQueryInfo);
|
int32_t numOfOutput = tscSqlExprNumOfExprs(pNewQueryInfo);
|
||||||
|
@ -1827,8 +1831,16 @@ SSqlObj* createSubqueryObj(SSqlObj* pSql, int16_t tableIndex, void (*fp)(), void
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pFinalInfo->pTableMeta == NULL) {
|
if (pFinalInfo->pTableMeta == NULL) {
|
||||||
tscError("%p new subquery failed for get tableMeta is NULL from cache", pSql);
|
tscError("%p new subquery failed since no tableMeta in cache, name:%s", pSql, name);
|
||||||
tscFreeSqlObj(pNew);
|
tscFreeSqlObj(pNew);
|
||||||
|
|
||||||
|
if (pPrevSql != NULL) {
|
||||||
|
assert(pPrevSql->res.code != TSDB_CODE_SUCCESS);
|
||||||
|
terrno = pPrevSql->res.code;
|
||||||
|
} else {
|
||||||
|
terrno = TSDB_CODE_TSC_APP_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,12 +1,11 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
|
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
ADD_LIBRARY(common ${SRC})
|
ADD_LIBRARY(common ${SRC})
|
||||||
TARGET_LINK_LIBRARIES(common tutil)
|
TARGET_LINK_LIBRARIES(common tutil)
|
||||||
ENDIF ()
|
|
||||||
|
|
|
@ -43,9 +43,9 @@ extern uint32_t tsMaxTmrCtrl;
|
||||||
extern float tsNumOfThreadsPerCore;
|
extern float tsNumOfThreadsPerCore;
|
||||||
extern float tsRatioOfQueryThreads;
|
extern float tsRatioOfQueryThreads;
|
||||||
extern int8_t tsDaylight;
|
extern int8_t tsDaylight;
|
||||||
extern char tsTimezone[64];
|
extern char tsTimezone[];
|
||||||
extern char tsLocale[64];
|
extern char tsLocale[];
|
||||||
extern char tsCharset[64]; // default encode string
|
extern char tsCharset[]; // default encode string
|
||||||
extern int32_t tsEnableCoreFile;
|
extern int32_t tsEnableCoreFile;
|
||||||
extern int32_t tsCompressMsgSize;
|
extern int32_t tsCompressMsgSize;
|
||||||
|
|
||||||
|
@ -80,6 +80,7 @@ extern int16_t tsCompression;
|
||||||
extern int16_t tsWAL;
|
extern int16_t tsWAL;
|
||||||
extern int32_t tsFsyncPeriod;
|
extern int32_t tsFsyncPeriod;
|
||||||
extern int32_t tsReplications;
|
extern int32_t tsReplications;
|
||||||
|
extern int32_t tsQuorum;
|
||||||
|
|
||||||
// balance
|
// balance
|
||||||
extern int32_t tsEnableBalance;
|
extern int32_t tsEnableBalance;
|
||||||
|
|
|
@ -50,7 +50,7 @@ int32_t tsShellActivityTimer = 3; // second
|
||||||
float tsNumOfThreadsPerCore = 1.0;
|
float tsNumOfThreadsPerCore = 1.0;
|
||||||
float tsRatioOfQueryThreads = 0.5;
|
float tsRatioOfQueryThreads = 0.5;
|
||||||
int8_t tsDaylight = 0;
|
int8_t tsDaylight = 0;
|
||||||
char tsTimezone[64] = {0};
|
char tsTimezone[TSDB_TIMEZONE_LEN] = {0};
|
||||||
char tsLocale[TSDB_LOCALE_LEN] = {0};
|
char tsLocale[TSDB_LOCALE_LEN] = {0};
|
||||||
char tsCharset[TSDB_LOCALE_LEN] = {0}; // default encode string
|
char tsCharset[TSDB_LOCALE_LEN] = {0}; // default encode string
|
||||||
int32_t tsEnableCoreFile = 0;
|
int32_t tsEnableCoreFile = 0;
|
||||||
|
@ -109,6 +109,7 @@ int16_t tsCompression = TSDB_DEFAULT_COMP_LEVEL;
|
||||||
int16_t tsWAL = TSDB_DEFAULT_WAL_LEVEL;
|
int16_t tsWAL = TSDB_DEFAULT_WAL_LEVEL;
|
||||||
int32_t tsFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
int32_t tsFsyncPeriod = TSDB_DEFAULT_FSYNC_PERIOD;
|
||||||
int32_t tsReplications = TSDB_DEFAULT_DB_REPLICA_OPTION;
|
int32_t tsReplications = TSDB_DEFAULT_DB_REPLICA_OPTION;
|
||||||
|
int32_t tsQuorum = TSDB_DEFAULT_DB_QUORUM_OPTION;
|
||||||
int32_t tsMaxVgroupsPerDb = 0;
|
int32_t tsMaxVgroupsPerDb = 0;
|
||||||
int32_t tsMinTablePerVnode = 100;
|
int32_t tsMinTablePerVnode = 100;
|
||||||
int32_t tsMaxTablePerVnode = TSDB_DEFAULT_TABLES;
|
int32_t tsMaxTablePerVnode = TSDB_DEFAULT_TABLES;
|
||||||
|
@ -742,6 +743,16 @@ static void doInitGlobalConfig() {
|
||||||
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
taosInitConfigOption(cfg);
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
|
cfg.option = "quorum";
|
||||||
|
cfg.ptr = &tsQuorum;
|
||||||
|
cfg.valType = TAOS_CFG_VTYPE_INT32;
|
||||||
|
cfg.cfgType = TSDB_CFG_CTYPE_B_CONFIG | TSDB_CFG_CTYPE_B_SHOW;
|
||||||
|
cfg.minValue = TSDB_MIN_DB_REPLICA_OPTION;
|
||||||
|
cfg.maxValue = TSDB_MAX_DB_REPLICA_OPTION;
|
||||||
|
cfg.ptrLength = 0;
|
||||||
|
cfg.unitType = TAOS_CFG_UTYPE_NONE;
|
||||||
|
taosInitConfigOption(cfg);
|
||||||
|
|
||||||
cfg.option = "mqttBrokerAddress";
|
cfg.option = "mqttBrokerAddress";
|
||||||
cfg.ptr = tsMqttBrokerAddress;
|
cfg.ptr = tsMqttBrokerAddress;
|
||||||
cfg.valType = TAOS_CFG_VTYPE_STRING;
|
cfg.valType = TAOS_CFG_VTYPE_STRING;
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
|
|
|
@ -1,17 +1,12 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(../inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/cq/inc)
|
||||||
|
|
||||||
LIST(APPEND CQTEST_SRC ./cqtest.c)
|
LIST(APPEND CQTEST_SRC ./cqtest.c)
|
||||||
ADD_EXECUTABLE(cqtest ${CQTEST_SRC})
|
ADD_EXECUTABLE(cqtest ${CQTEST_SRC})
|
||||||
TARGET_LINK_LIBRARIES(cqtest tcq)
|
TARGET_LINK_LIBRARIES(cqtest tcq)
|
||||||
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/mnode/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/mnode/inc)
|
||||||
|
@ -16,7 +16,7 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
|
|
||||||
ADD_EXECUTABLE(taosd ${SRC})
|
ADD_EXECUTABLE(taosd ${SRC})
|
||||||
TARGET_LINK_LIBRARIES(taosd mnode taos_static monitor http mqtt tsdb twal vnode cJson lz4)
|
TARGET_LINK_LIBRARIES(taosd mnode taos_static monitor http mqtt tsdb twal vnode cJson lz4 balance sync)
|
||||||
|
|
||||||
IF (TD_ACCOUNT)
|
IF (TD_ACCOUNT)
|
||||||
TARGET_LINK_LIBRARIES(taosd account)
|
TARGET_LINK_LIBRARIES(taosd account)
|
||||||
|
@ -26,10 +26,6 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
TARGET_LINK_LIBRARIES(taosd grant)
|
TARGET_LINK_LIBRARIES(taosd grant)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
IF (TD_SYNC)
|
|
||||||
TARGET_LINK_LIBRARIES(taosd balance sync)
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
SET(PREPARE_ENV_CMD "prepare_env_cmd")
|
SET(PREPARE_ENV_CMD "prepare_env_cmd")
|
||||||
SET(PREPARE_ENV_TARGET "prepare_env_target")
|
SET(PREPARE_ENV_TARGET "prepare_env_target")
|
||||||
ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
|
ADD_CUSTOM_COMMAND(OUTPUT ${PREPARE_ENV_CMD}
|
||||||
|
|
|
@ -492,6 +492,7 @@ static void dnodeProcessStatusRsp(SRpcMsg *pMsg) {
|
||||||
pCfg->numOfVnodes = htonl(pCfg->numOfVnodes);
|
pCfg->numOfVnodes = htonl(pCfg->numOfVnodes);
|
||||||
pCfg->moduleStatus = htonl(pCfg->moduleStatus);
|
pCfg->moduleStatus = htonl(pCfg->moduleStatus);
|
||||||
pCfg->dnodeId = htonl(pCfg->dnodeId);
|
pCfg->dnodeId = htonl(pCfg->dnodeId);
|
||||||
|
pCfg->clusterId = htonl(pCfg->clusterId);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pMnodes->nodeNum; ++i) {
|
for (int32_t i = 0; i < pMnodes->nodeNum; ++i) {
|
||||||
SDMMnodeInfo *pMnodeInfo = &pMnodes->nodeInfos[i];
|
SDMMnodeInfo *pMnodeInfo = &pMnodes->nodeInfos[i];
|
||||||
|
@ -697,6 +698,7 @@ static void dnodeSendStatusMsg(void *handle, void *tmrId) {
|
||||||
//strcpy(pStatus->dnodeName, tsDnodeName);
|
//strcpy(pStatus->dnodeName, tsDnodeName);
|
||||||
pStatus->version = htonl(tsVersion);
|
pStatus->version = htonl(tsVersion);
|
||||||
pStatus->dnodeId = htonl(tsDnodeCfg.dnodeId);
|
pStatus->dnodeId = htonl(tsDnodeCfg.dnodeId);
|
||||||
|
pStatus->clusterId = htonl(tsDnodeCfg.clusterId);
|
||||||
strcpy(pStatus->dnodeEp, tsLocalEp);
|
strcpy(pStatus->dnodeEp, tsLocalEp);
|
||||||
pStatus->lastReboot = htonl(tsRebootTime);
|
pStatus->lastReboot = htonl(tsRebootTime);
|
||||||
pStatus->numOfCores = htons((uint16_t) tsNumOfCores);
|
pStatus->numOfCores = htons((uint16_t) tsNumOfCores);
|
||||||
|
@ -767,6 +769,13 @@ static bool dnodeReadDnodeCfg() {
|
||||||
}
|
}
|
||||||
tsDnodeCfg.dnodeId = dnodeId->valueint;
|
tsDnodeCfg.dnodeId = dnodeId->valueint;
|
||||||
|
|
||||||
|
cJSON* clusterId = cJSON_GetObjectItem(root, "clusterId");
|
||||||
|
if (!clusterId || clusterId->type != cJSON_Number) {
|
||||||
|
dError("failed to read dnodeCfg.json, clusterId not found");
|
||||||
|
goto PARSE_CFG_OVER;
|
||||||
|
}
|
||||||
|
tsDnodeCfg.clusterId = clusterId->valueint;
|
||||||
|
|
||||||
ret = true;
|
ret = true;
|
||||||
|
|
||||||
dInfo("read numOfVnodes successed, dnodeId:%d", tsDnodeCfg.dnodeId);
|
dInfo("read numOfVnodes successed, dnodeId:%d", tsDnodeCfg.dnodeId);
|
||||||
|
@ -790,7 +799,8 @@ static void dnodeSaveDnodeCfg() {
|
||||||
char * content = calloc(1, maxLen + 1);
|
char * content = calloc(1, maxLen + 1);
|
||||||
|
|
||||||
len += snprintf(content + len, maxLen - len, "{\n");
|
len += snprintf(content + len, maxLen - len, "{\n");
|
||||||
len += snprintf(content + len, maxLen - len, " \"dnodeId\": %d\n", tsDnodeCfg.dnodeId);
|
len += snprintf(content + len, maxLen - len, " \"dnodeId\": %d,\n", tsDnodeCfg.dnodeId);
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"clusterId\": %d\n", tsDnodeCfg.clusterId);
|
||||||
len += snprintf(content + len, maxLen - len, "}\n");
|
len += snprintf(content + len, maxLen - len, "}\n");
|
||||||
|
|
||||||
fwrite(content, 1, len, fp);
|
fwrite(content, 1, len, fp);
|
||||||
|
@ -803,8 +813,9 @@ static void dnodeSaveDnodeCfg() {
|
||||||
|
|
||||||
void dnodeUpdateDnodeCfg(SDMDnodeCfg *pCfg) {
|
void dnodeUpdateDnodeCfg(SDMDnodeCfg *pCfg) {
|
||||||
if (tsDnodeCfg.dnodeId == 0) {
|
if (tsDnodeCfg.dnodeId == 0) {
|
||||||
dInfo("dnodeId is set to %d", pCfg->dnodeId);
|
dInfo("dnodeId is set to %d, clusterId is set to %d", pCfg->dnodeId, pCfg->clusterId);
|
||||||
tsDnodeCfg.dnodeId = pCfg->dnodeId;
|
tsDnodeCfg.dnodeId = pCfg->dnodeId;
|
||||||
|
tsDnodeCfg.clusterId = pCfg->clusterId;
|
||||||
dnodeSaveDnodeCfg();
|
dnodeSaveDnodeCfg();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,7 +20,6 @@
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "dnodeInt.h"
|
#include "dnodeInt.h"
|
||||||
#include "dnodeMain.h"
|
#include "dnodeMain.h"
|
||||||
#include "tfile.h"
|
|
||||||
|
|
||||||
static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context);
|
static void signal_handler(int32_t signum, siginfo_t *sigInfo, void *context);
|
||||||
static sem_t exitSem;
|
static sem_t exitSem;
|
||||||
|
@ -40,7 +39,7 @@ int32_t main(int32_t argc, char *argv[]) {
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
} else if (strcmp(argv[i], "-V") == 0) {
|
} else if (strcmp(argv[i], "-V") == 0) {
|
||||||
#ifdef _SYNC
|
#ifdef _ACCT
|
||||||
char *versionStr = "enterprise";
|
char *versionStr = "enterprise";
|
||||||
#else
|
#else
|
||||||
char *versionStr = "community";
|
char *versionStr = "community";
|
||||||
|
|
|
@ -49,7 +49,7 @@ static taos_qset readQset;
|
||||||
int32_t dnodeInitVnodeRead() {
|
int32_t dnodeInitVnodeRead() {
|
||||||
readQset = taosOpenQset();
|
readQset = taosOpenQset();
|
||||||
|
|
||||||
readPool.min = 2;
|
readPool.min = tsNumOfCores;
|
||||||
readPool.max = tsNumOfCores * tsNumOfThreadsPerCore;
|
readPool.max = tsNumOfCores * tsNumOfThreadsPerCore;
|
||||||
if (readPool.max <= readPool.min * 2) readPool.max = 2 * readPool.min;
|
if (readPool.max <= readPool.min * 2) readPool.max = 2 * readPool.min;
|
||||||
readPool.readWorker = (SReadWorker *)calloc(sizeof(SReadWorker), readPool.max);
|
readPool.readWorker = (SReadWorker *)calloc(sizeof(SReadWorker), readPool.max);
|
||||||
|
@ -206,11 +206,15 @@ static void *dnodeProcessReadQueue(void *param) {
|
||||||
taosMsg[pReadMsg->rpcMsg.msgType], type);
|
taosMsg[pReadMsg->rpcMsg.msgType], type);
|
||||||
int32_t code = vnodeProcessRead(pVnode, pReadMsg);
|
int32_t code = vnodeProcessRead(pVnode, pReadMsg);
|
||||||
|
|
||||||
if (type == TAOS_QTYPE_RPC) {
|
if (type == TAOS_QTYPE_RPC && code != TSDB_CODE_QRY_NOT_READY) {
|
||||||
dnodeSendRpcReadRsp(pVnode, pReadMsg, code);
|
dnodeSendRpcReadRsp(pVnode, pReadMsg, code);
|
||||||
|
} else {
|
||||||
|
if (code == TSDB_CODE_QRY_HAS_RSP) {
|
||||||
|
dnodeSendRpcReadRsp(pVnode, pReadMsg, TSDB_CODE_SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
dnodeDispatchNonRspMsg(pVnode, pReadMsg, code);
|
dnodeDispatchNonRspMsg(pVnode, pReadMsg, code);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
taosFreeQitem(pReadMsg);
|
taosFreeQitem(pReadMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,6 +38,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SRspRet rspRet;
|
SRspRet rspRet;
|
||||||
|
int32_t processedCount;
|
||||||
|
int32_t code;
|
||||||
void *pCont;
|
void *pCont;
|
||||||
int32_t contLen;
|
int32_t contLen;
|
||||||
SRpcMsg rpcMsg;
|
SRpcMsg rpcMsg;
|
||||||
|
@ -187,13 +189,16 @@ void dnodeFreeVnodeWqueue(void *wqueue) {
|
||||||
void dnodeSendRpcVnodeWriteRsp(void *pVnode, void *param, int32_t code) {
|
void dnodeSendRpcVnodeWriteRsp(void *pVnode, void *param, int32_t code) {
|
||||||
SWriteMsg *pWrite = (SWriteMsg *)param;
|
SWriteMsg *pWrite = (SWriteMsg *)param;
|
||||||
|
|
||||||
if (code > 0) return;
|
if (code < 0) pWrite->code = code;
|
||||||
|
int32_t count = atomic_add_fetch_32(&pWrite->processedCount, 1);
|
||||||
|
|
||||||
|
if (count <= 1) return;
|
||||||
|
|
||||||
SRpcMsg rpcRsp = {
|
SRpcMsg rpcRsp = {
|
||||||
.handle = pWrite->rpcMsg.handle,
|
.handle = pWrite->rpcMsg.handle,
|
||||||
.pCont = pWrite->rspRet.rsp,
|
.pCont = pWrite->rspRet.rsp,
|
||||||
.contLen = pWrite->rspRet.len,
|
.contLen = pWrite->rspRet.len,
|
||||||
.code = code,
|
.code = pWrite->code,
|
||||||
};
|
};
|
||||||
|
|
||||||
rpcSendResponse(&rpcRsp);
|
rpcSendResponse(&rpcRsp);
|
||||||
|
@ -239,7 +244,10 @@ static void *dnodeProcessWriteQueue(void *param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = vnodeProcessWrite(pVnode, type, pHead, pRspRet);
|
int32_t code = vnodeProcessWrite(pVnode, type, pHead, pRspRet);
|
||||||
if (pWrite) pWrite->rpcMsg.code = code;
|
if (pWrite) {
|
||||||
|
pWrite->rpcMsg.code = code;
|
||||||
|
if (code <= 0) pWrite->processedCount = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
walFsync(vnodeGetWal(pVnode));
|
walFsync(vnodeGetWal(pVnode));
|
||||||
|
|
|
@ -28,7 +28,7 @@ typedef void* qinfo_t;
|
||||||
* @param qinfo
|
* @param qinfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryTableMsg, void* param, qinfo_t* qinfo);
|
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryTableMsg, qinfo_t* qinfo);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -38,7 +38,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryTableMs
|
||||||
* @param qinfo
|
* @param qinfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
void qTableQuery(qinfo_t qinfo);
|
bool qTableQuery(qinfo_t qinfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Retrieve the produced results information, if current query is not paused or completed,
|
* Retrieve the produced results information, if current query is not paused or completed,
|
||||||
|
@ -48,7 +48,7 @@ void qTableQuery(qinfo_t qinfo);
|
||||||
* @param qinfo
|
* @param qinfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qRetrieveQueryResultInfo(qinfo_t qinfo);
|
int32_t qRetrieveQueryResultInfo(qinfo_t qinfo, bool* buildRes, void* pRspContext);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -60,16 +60,14 @@ int32_t qRetrieveQueryResultInfo(qinfo_t qinfo);
|
||||||
* @param contLen payload length
|
* @param contLen payload length
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp** pRsp, int32_t* contLen);
|
int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp** pRsp, int32_t* contLen, bool* continueExec);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Decide if more results will be produced or not, NOTE: this function will increase the ref count of QInfo,
|
|
||||||
* so it can be only called once for each retrieve
|
|
||||||
*
|
*
|
||||||
* @param qinfo
|
* @param qinfo
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
bool qHasMoreResultsToRetrieve(qinfo_t qinfo);
|
void* qGetResultRetrieveMsg(qinfo_t qinfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kill current ongoing query and free query handle automatically
|
* kill current ongoing query and free query handle automatically
|
||||||
|
@ -89,7 +87,7 @@ void qQueryMgmtNotifyClosed(void* pExecutor);
|
||||||
void qCleanupQueryMgmt(void* pExecutor);
|
void qCleanupQueryMgmt(void* pExecutor);
|
||||||
void** qRegisterQInfo(void* pMgmt, uint64_t qInfo);
|
void** qRegisterQInfo(void* pMgmt, uint64_t qInfo);
|
||||||
void** qAcquireQInfo(void* pMgmt, uint64_t key);
|
void** qAcquireQInfo(void* pMgmt, uint64_t key);
|
||||||
void** qReleaseQInfo(void* pMgmt, void* pQInfo, bool needFree);
|
void** qReleaseQInfo(void* pMgmt, void* pQInfo, bool freeHandle);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -250,7 +250,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size);
|
||||||
#define TSDB_STATE_LEN 20
|
#define TSDB_STATE_LEN 20
|
||||||
#define TSDB_COUNTRY_LEN 20
|
#define TSDB_COUNTRY_LEN 20
|
||||||
#define TSDB_LOCALE_LEN 64
|
#define TSDB_LOCALE_LEN 64
|
||||||
#define TSDB_TIMEZONE_LEN 64
|
#define TSDB_TIMEZONE_LEN 96
|
||||||
#define TSDB_LABEL_LEN 8
|
#define TSDB_LABEL_LEN 8
|
||||||
|
|
||||||
#define TSDB_FQDN_LEN 128
|
#define TSDB_FQDN_LEN 128
|
||||||
|
@ -338,6 +338,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size);
|
||||||
#define TSDB_MIN_DB_REPLICA_OPTION 1
|
#define TSDB_MIN_DB_REPLICA_OPTION 1
|
||||||
#define TSDB_MAX_DB_REPLICA_OPTION 3
|
#define TSDB_MAX_DB_REPLICA_OPTION 3
|
||||||
#define TSDB_DEFAULT_DB_REPLICA_OPTION 1
|
#define TSDB_DEFAULT_DB_REPLICA_OPTION 1
|
||||||
|
#define TSDB_DEFAULT_DB_QUORUM_OPTION 1
|
||||||
|
|
||||||
#define TSDB_MAX_JOIN_TABLE_NUM 5
|
#define TSDB_MAX_JOIN_TABLE_NUM 5
|
||||||
#define TSDB_MAX_UNION_CLAUSE 5
|
#define TSDB_MAX_UNION_CLAUSE 5
|
||||||
|
@ -377,6 +378,7 @@ void tsDataSwap(void *pLeft, void *pRight, int32_t type, int32_t size);
|
||||||
#define TSDB_ORDER_ASC 1
|
#define TSDB_ORDER_ASC 1
|
||||||
#define TSDB_ORDER_DESC 2
|
#define TSDB_ORDER_DESC 2
|
||||||
|
|
||||||
|
#define TSDB_DEFAULT_CLUSTER_HASH_SIZE 1
|
||||||
#define TSDB_DEFAULT_MNODES_HASH_SIZE 5
|
#define TSDB_DEFAULT_MNODES_HASH_SIZE 5
|
||||||
#define TSDB_DEFAULT_DNODES_HASH_SIZE 10
|
#define TSDB_DEFAULT_DNODES_HASH_SIZE 10
|
||||||
#define TSDB_DEFAULT_ACCOUNTS_HASH_SIZE 10
|
#define TSDB_DEFAULT_ACCOUNTS_HASH_SIZE 10
|
||||||
|
|
|
@ -131,6 +131,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_BALANCE_ENABLED, 0, 0x0337, "balance al
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_VGROUP_NOT_IN_DNODE, 0, 0x0338, "vgroup not in dnode")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_VGROUP_NOT_IN_DNODE, 0, 0x0338, "vgroup not in dnode")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_VGROUP_ALREADY_IN_DNODE, 0, 0x0339, "vgroup already in dnode")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_VGROUP_ALREADY_IN_DNODE, 0, 0x0339, "vgroup already in dnode")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DNODE_NOT_FREE, 0, 0x033A, "dnode not avaliable")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_DNODE_NOT_FREE, 0, 0x033A, "dnode not avaliable")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_CLUSTER_ID, 0, 0x033B, "cluster id not match")
|
||||||
|
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_ACCT_ALREADY_EXIST, 0, 0x0340, "mnode accounts already exist")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_ACCT_ALREADY_EXIST, 0, 0x0340, "mnode accounts already exist")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ACCT, 0, 0x0341, "mnode invalid account")
|
TAOS_DEFINE_ERROR(TSDB_CODE_MND_INVALID_ACCT, 0, 0x0341, "mnode invalid account")
|
||||||
|
@ -215,6 +216,8 @@ TAOS_DEFINE_ERROR(TSDB_CODE_QRY_OUT_OF_MEMORY, 0, 0x0703, "query out
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_APP_ERROR, 0, 0x0704, "query app error")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_APP_ERROR, 0, 0x0704, "query app error")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_DUP_JOIN_KEY, 0, 0x0705, "query duplicated join key")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_DUP_JOIN_KEY, 0, 0x0705, "query duplicated join key")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_EXCEED_TAGS_LIMIT, 0, 0x0706, "query tag conditon too many")
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_EXCEED_TAGS_LIMIT, 0, 0x0706, "query tag conditon too many")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_NOT_READY, 0, 0x0707, "query not ready")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_QRY_HAS_RSP, 0, 0x0708, "query should response")
|
||||||
|
|
||||||
// grant
|
// grant
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_EXPIRED, 0, 0x0800, "grant expired")
|
TAOS_DEFINE_ERROR(TSDB_CODE_GRANT_EXPIRED, 0, 0x0800, "grant expired")
|
||||||
|
|
|
@ -139,6 +139,7 @@ enum _mgmt_table {
|
||||||
TSDB_MGMT_TABLE_GRANTS,
|
TSDB_MGMT_TABLE_GRANTS,
|
||||||
TSDB_MGMT_TABLE_VNODES,
|
TSDB_MGMT_TABLE_VNODES,
|
||||||
TSDB_MGMT_TABLE_STREAMTABLES,
|
TSDB_MGMT_TABLE_STREAMTABLES,
|
||||||
|
TSDB_MGMT_TABLE_CLUSTER,
|
||||||
TSDB_MGMT_TABLE_MAX,
|
TSDB_MGMT_TABLE_MAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -521,6 +522,7 @@ typedef struct {
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t replications;
|
int8_t replications;
|
||||||
|
int8_t quorum;
|
||||||
int8_t ignoreExist;
|
int8_t ignoreExist;
|
||||||
} SCMCreateDbMsg, SCMAlterDbMsg;
|
} SCMCreateDbMsg, SCMAlterDbMsg;
|
||||||
|
|
||||||
|
@ -546,6 +548,7 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
|
int32_t clusterId;
|
||||||
uint32_t moduleStatus;
|
uint32_t moduleStatus;
|
||||||
uint32_t numOfVnodes;
|
uint32_t numOfVnodes;
|
||||||
uint32_t reserved;
|
uint32_t reserved;
|
||||||
|
@ -586,6 +589,7 @@ typedef struct {
|
||||||
uint16_t openVnodes;
|
uint16_t openVnodes;
|
||||||
uint16_t numOfCores;
|
uint16_t numOfCores;
|
||||||
float diskAvailable; // GB
|
float diskAvailable; // GB
|
||||||
|
int32_t clusterId;
|
||||||
uint8_t alternativeRole;
|
uint8_t alternativeRole;
|
||||||
uint8_t reserve2[15];
|
uint8_t reserve2[15];
|
||||||
SClusterCfg clusterCfg;
|
SClusterCfg clusterCfg;
|
||||||
|
|
|
@ -26,6 +26,7 @@ extern "C" {
|
||||||
typedef enum _TAOS_SYNC_ROLE {
|
typedef enum _TAOS_SYNC_ROLE {
|
||||||
TAOS_SYNC_ROLE_OFFLINE,
|
TAOS_SYNC_ROLE_OFFLINE,
|
||||||
TAOS_SYNC_ROLE_UNSYNCED,
|
TAOS_SYNC_ROLE_UNSYNCED,
|
||||||
|
TAOS_SYNC_ROLE_SYNCING,
|
||||||
TAOS_SYNC_ROLE_SLAVE,
|
TAOS_SYNC_ROLE_SLAVE,
|
||||||
TAOS_SYNC_ROLE_MASTER,
|
TAOS_SYNC_ROLE_MASTER,
|
||||||
} ESyncRole;
|
} ESyncRole;
|
||||||
|
@ -78,6 +79,9 @@ typedef void (*FConfirmForward)(void *ahandle, void *mhandle, int32_t code);
|
||||||
// when role is changed, call this to notify app
|
// when role is changed, call this to notify app
|
||||||
typedef void (*FNotifyRole)(void *ahandle, int8_t role);
|
typedef void (*FNotifyRole)(void *ahandle, int8_t role);
|
||||||
|
|
||||||
|
// if a number of retrieving data failed, call this to start flow control
|
||||||
|
typedef void (*FNotifyFlowCtrl)(void *ahandle, int32_t mseconds);
|
||||||
|
|
||||||
// when data file is synced successfully, notity app
|
// when data file is synced successfully, notity app
|
||||||
typedef int (*FNotifyFileSynced)(void *ahandle, uint64_t fversion);
|
typedef int (*FNotifyFileSynced)(void *ahandle, uint64_t fversion);
|
||||||
|
|
||||||
|
@ -93,6 +97,7 @@ typedef struct {
|
||||||
FWriteToCache writeToCache;
|
FWriteToCache writeToCache;
|
||||||
FConfirmForward confirmForward;
|
FConfirmForward confirmForward;
|
||||||
FNotifyRole notifyRole;
|
FNotifyRole notifyRole;
|
||||||
|
FNotifyFlowCtrl notifyFlowCtrl;
|
||||||
FNotifyFileSynced notifyFileSynced;
|
FNotifyFileSynced notifyFileSynced;
|
||||||
} SSyncInfo;
|
} SSyncInfo;
|
||||||
|
|
||||||
|
|
|
@ -104,123 +104,125 @@
|
||||||
#define TK_MAXTABLES 86
|
#define TK_MAXTABLES 86
|
||||||
#define TK_CACHE 87
|
#define TK_CACHE 87
|
||||||
#define TK_REPLICA 88
|
#define TK_REPLICA 88
|
||||||
#define TK_DAYS 89
|
#define TK_QUORUM 89
|
||||||
#define TK_MINROWS 90
|
#define TK_DAYS 90
|
||||||
#define TK_MAXROWS 91
|
#define TK_MINROWS 91
|
||||||
#define TK_BLOCKS 92
|
#define TK_MAXROWS 92
|
||||||
#define TK_CTIME 93
|
#define TK_BLOCKS 93
|
||||||
#define TK_WAL 94
|
#define TK_CTIME 94
|
||||||
#define TK_FSYNC 95
|
#define TK_WAL 95
|
||||||
#define TK_COMP 96
|
#define TK_FSYNC 96
|
||||||
#define TK_PRECISION 97
|
#define TK_COMP 97
|
||||||
#define TK_LP 98
|
#define TK_PRECISION 98
|
||||||
#define TK_RP 99
|
#define TK_LP 99
|
||||||
#define TK_TAGS 100
|
#define TK_RP 100
|
||||||
#define TK_USING 101
|
#define TK_TAGS 101
|
||||||
#define TK_AS 102
|
#define TK_USING 102
|
||||||
#define TK_COMMA 103
|
#define TK_AS 103
|
||||||
#define TK_NULL 104
|
#define TK_COMMA 104
|
||||||
#define TK_SELECT 105
|
#define TK_NULL 105
|
||||||
#define TK_UNION 106
|
#define TK_SELECT 106
|
||||||
#define TK_ALL 107
|
#define TK_UNION 107
|
||||||
#define TK_FROM 108
|
#define TK_ALL 108
|
||||||
#define TK_VARIABLE 109
|
#define TK_FROM 109
|
||||||
#define TK_INTERVAL 110
|
#define TK_VARIABLE 110
|
||||||
#define TK_FILL 111
|
#define TK_INTERVAL 111
|
||||||
#define TK_SLIDING 112
|
#define TK_FILL 112
|
||||||
#define TK_ORDER 113
|
#define TK_SLIDING 113
|
||||||
#define TK_BY 114
|
#define TK_ORDER 114
|
||||||
#define TK_ASC 115
|
#define TK_BY 115
|
||||||
#define TK_DESC 116
|
#define TK_ASC 116
|
||||||
#define TK_GROUP 117
|
#define TK_DESC 117
|
||||||
#define TK_HAVING 118
|
#define TK_GROUP 118
|
||||||
#define TK_LIMIT 119
|
#define TK_HAVING 119
|
||||||
#define TK_OFFSET 120
|
#define TK_LIMIT 120
|
||||||
#define TK_SLIMIT 121
|
#define TK_OFFSET 121
|
||||||
#define TK_SOFFSET 122
|
#define TK_SLIMIT 122
|
||||||
#define TK_WHERE 123
|
#define TK_SOFFSET 123
|
||||||
#define TK_NOW 124
|
#define TK_WHERE 124
|
||||||
#define TK_RESET 125
|
#define TK_NOW 125
|
||||||
#define TK_QUERY 126
|
#define TK_RESET 126
|
||||||
#define TK_ADD 127
|
#define TK_QUERY 127
|
||||||
#define TK_COLUMN 128
|
#define TK_ADD 128
|
||||||
#define TK_TAG 129
|
#define TK_COLUMN 129
|
||||||
#define TK_CHANGE 130
|
#define TK_TAG 130
|
||||||
#define TK_SET 131
|
#define TK_CHANGE 131
|
||||||
#define TK_KILL 132
|
#define TK_SET 132
|
||||||
#define TK_CONNECTION 133
|
#define TK_KILL 133
|
||||||
#define TK_STREAM 134
|
#define TK_CONNECTION 134
|
||||||
#define TK_COLON 135
|
#define TK_STREAM 135
|
||||||
#define TK_ABORT 136
|
#define TK_COLON 136
|
||||||
#define TK_AFTER 137
|
#define TK_ABORT 137
|
||||||
#define TK_ATTACH 138
|
#define TK_AFTER 138
|
||||||
#define TK_BEFORE 139
|
#define TK_ATTACH 139
|
||||||
#define TK_BEGIN 140
|
#define TK_BEFORE 140
|
||||||
#define TK_CASCADE 141
|
#define TK_BEGIN 141
|
||||||
#define TK_CLUSTER 142
|
#define TK_CASCADE 142
|
||||||
#define TK_CONFLICT 143
|
#define TK_CLUSTER 143
|
||||||
#define TK_COPY 144
|
#define TK_CONFLICT 144
|
||||||
#define TK_DEFERRED 145
|
#define TK_COPY 145
|
||||||
#define TK_DELIMITERS 146
|
#define TK_DEFERRED 146
|
||||||
#define TK_DETACH 147
|
#define TK_DELIMITERS 147
|
||||||
#define TK_EACH 148
|
#define TK_DETACH 148
|
||||||
#define TK_END 149
|
#define TK_EACH 149
|
||||||
#define TK_EXPLAIN 150
|
#define TK_END 150
|
||||||
#define TK_FAIL 151
|
#define TK_EXPLAIN 151
|
||||||
#define TK_FOR 152
|
#define TK_FAIL 152
|
||||||
#define TK_IGNORE 153
|
#define TK_FOR 153
|
||||||
#define TK_IMMEDIATE 154
|
#define TK_IGNORE 154
|
||||||
#define TK_INITIALLY 155
|
#define TK_IMMEDIATE 155
|
||||||
#define TK_INSTEAD 156
|
#define TK_INITIALLY 156
|
||||||
#define TK_MATCH 157
|
#define TK_INSTEAD 157
|
||||||
#define TK_KEY 158
|
#define TK_MATCH 158
|
||||||
#define TK_OF 159
|
#define TK_KEY 159
|
||||||
#define TK_RAISE 160
|
#define TK_OF 160
|
||||||
#define TK_REPLACE 161
|
#define TK_RAISE 161
|
||||||
#define TK_RESTRICT 162
|
#define TK_REPLACE 162
|
||||||
#define TK_ROW 163
|
#define TK_RESTRICT 163
|
||||||
#define TK_STATEMENT 164
|
#define TK_ROW 164
|
||||||
#define TK_TRIGGER 165
|
#define TK_STATEMENT 165
|
||||||
#define TK_VIEW 166
|
#define TK_TRIGGER 166
|
||||||
#define TK_COUNT 167
|
#define TK_VIEW 167
|
||||||
#define TK_SUM 168
|
#define TK_COUNT 168
|
||||||
#define TK_AVG 169
|
#define TK_SUM 169
|
||||||
#define TK_MIN 170
|
#define TK_AVG 170
|
||||||
#define TK_MAX 171
|
#define TK_MIN 171
|
||||||
#define TK_FIRST 172
|
#define TK_MAX 172
|
||||||
#define TK_LAST 173
|
#define TK_FIRST 173
|
||||||
#define TK_TOP 174
|
#define TK_LAST 174
|
||||||
#define TK_BOTTOM 175
|
#define TK_TOP 175
|
||||||
#define TK_STDDEV 176
|
#define TK_BOTTOM 176
|
||||||
#define TK_PERCENTILE 177
|
#define TK_STDDEV 177
|
||||||
#define TK_APERCENTILE 178
|
#define TK_PERCENTILE 178
|
||||||
#define TK_LEASTSQUARES 179
|
#define TK_APERCENTILE 179
|
||||||
#define TK_HISTOGRAM 180
|
#define TK_LEASTSQUARES 180
|
||||||
#define TK_DIFF 181
|
#define TK_HISTOGRAM 181
|
||||||
#define TK_SPREAD 182
|
#define TK_DIFF 182
|
||||||
#define TK_TWA 183
|
#define TK_SPREAD 183
|
||||||
#define TK_INTERP 184
|
#define TK_TWA 184
|
||||||
#define TK_LAST_ROW 185
|
#define TK_INTERP 185
|
||||||
#define TK_RATE 186
|
#define TK_LAST_ROW 186
|
||||||
#define TK_IRATE 187
|
#define TK_RATE 187
|
||||||
#define TK_SUM_RATE 188
|
#define TK_IRATE 188
|
||||||
#define TK_SUM_IRATE 189
|
#define TK_SUM_RATE 189
|
||||||
#define TK_AVG_RATE 190
|
#define TK_SUM_IRATE 190
|
||||||
#define TK_AVG_IRATE 191
|
#define TK_AVG_RATE 191
|
||||||
#define TK_TBID 192
|
#define TK_AVG_IRATE 192
|
||||||
#define TK_SEMI 193
|
#define TK_TBID 193
|
||||||
#define TK_NONE 194
|
#define TK_SEMI 194
|
||||||
#define TK_PREV 195
|
#define TK_NONE 195
|
||||||
#define TK_LINEAR 196
|
#define TK_PREV 196
|
||||||
#define TK_IMPORT 197
|
#define TK_LINEAR 197
|
||||||
#define TK_METRIC 198
|
#define TK_IMPORT 198
|
||||||
#define TK_TBNAME 199
|
#define TK_METRIC 199
|
||||||
#define TK_JOIN 200
|
#define TK_TBNAME 200
|
||||||
#define TK_METRICS 201
|
#define TK_JOIN 201
|
||||||
#define TK_STABLE 202
|
#define TK_METRICS 202
|
||||||
#define TK_INSERT 203
|
#define TK_STABLE 203
|
||||||
#define TK_INTO 204
|
#define TK_INSERT 204
|
||||||
#define TK_VALUES 205
|
#define TK_INTO 205
|
||||||
|
#define TK_VALUES 206
|
||||||
|
|
||||||
|
|
||||||
#define TK_SPACE 300
|
#define TK_SPACE 300
|
||||||
#define TK_COMMENT 301
|
#define TK_COMMENT 301
|
||||||
|
|
|
@ -2,11 +2,11 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
|
|
|
@ -2,9 +2,9 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
|
|
|
@ -2,11 +2,11 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
|
|
|
@ -545,7 +545,7 @@ int32_t taosSaveAllNormalTableToTempFile(TAOS *taosCon, char*meter, char* metric
|
||||||
strcpy(tableRecord.name, meter);
|
strcpy(tableRecord.name, meter);
|
||||||
strcpy(tableRecord.metric, metric);
|
strcpy(tableRecord.metric, metric);
|
||||||
|
|
||||||
twrite(*fd, &tableRecord, sizeof(STableRecord));
|
taosTWrite(*fd, &tableRecord, sizeof(STableRecord));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -600,7 +600,7 @@ int32_t taosSaveTableOfMetricToTempFile(TAOS *taosCon, char* metric, struct argu
|
||||||
strncpy(tableRecord.name, (char *)row[0], fields[0].bytes);
|
strncpy(tableRecord.name, (char *)row[0], fields[0].bytes);
|
||||||
strcpy(tableRecord.metric, metric);
|
strcpy(tableRecord.metric, metric);
|
||||||
|
|
||||||
twrite(fd, &tableRecord, sizeof(STableRecord));
|
taosTWrite(fd, &tableRecord, sizeof(STableRecord));
|
||||||
|
|
||||||
numOfTable++;
|
numOfTable++;
|
||||||
|
|
||||||
|
@ -1196,7 +1196,7 @@ int32_t taosDumpCreateSuperTableClause(TAOS* taosCon, char* dbName, FILE *fp)
|
||||||
while ((row = taos_fetch_row(tmpResult)) != NULL) {
|
while ((row = taos_fetch_row(tmpResult)) != NULL) {
|
||||||
memset(&tableRecord, 0, sizeof(STableRecord));
|
memset(&tableRecord, 0, sizeof(STableRecord));
|
||||||
strncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
strncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
||||||
twrite(fd, &tableRecord, sizeof(STableRecord));
|
taosTWrite(fd, &tableRecord, sizeof(STableRecord));
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_free_result(tmpResult);
|
taos_free_result(tmpResult);
|
||||||
|
@ -1282,7 +1282,7 @@ int taosDumpDb(SDbInfo *dbInfo, struct arguments *arguments, FILE *fp, TAOS *tao
|
||||||
strncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
strncpy(tableRecord.name, (char *)row[TSDB_SHOW_TABLES_NAME_INDEX], fields[TSDB_SHOW_TABLES_NAME_INDEX].bytes);
|
||||||
strncpy(tableRecord.metric, (char *)row[TSDB_SHOW_TABLES_METRIC_INDEX], fields[TSDB_SHOW_TABLES_METRIC_INDEX].bytes);
|
strncpy(tableRecord.metric, (char *)row[TSDB_SHOW_TABLES_METRIC_INDEX], fields[TSDB_SHOW_TABLES_METRIC_INDEX].bytes);
|
||||||
|
|
||||||
twrite(fd, &tableRecord, sizeof(STableRecord));
|
taosTWrite(fd, &tableRecord, sizeof(STableRecord));
|
||||||
|
|
||||||
numOfTable++;
|
numOfTable++;
|
||||||
|
|
||||||
|
|
|
@ -2,8 +2,8 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/mnode/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/mnode/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/vnode/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/vnode/inc)
|
||||||
|
|
|
@ -2,8 +2,8 @@ CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_MNODE_CLUSTER_H
|
||||||
|
#define TDENGINE_MNODE_CLUSTER_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
struct SClusterObj;
|
||||||
|
|
||||||
|
int32_t mnodeInitCluster();
|
||||||
|
void mnodeCleanupCluster();
|
||||||
|
int32_t mnodeGetClusterId();
|
||||||
|
void mnodeUpdateClusterId();
|
||||||
|
void * mnodeGetCluster(int32_t clusterId);
|
||||||
|
void * mnodeGetNextCluster(void *pIter, struct SClusterObj **pCluster);
|
||||||
|
void mnodeIncClusterRef(struct SClusterObj *pCluster);
|
||||||
|
void mnodeDecClusterRef(struct SClusterObj *pCluster);
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -36,6 +36,14 @@ struct define notes:
|
||||||
3. The fields behind the updataEnd field can be changed;
|
3. The fields behind the updataEnd field can be changed;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
typedef struct SClusterObj {
|
||||||
|
int32_t clusterId;
|
||||||
|
int64_t createdTime;
|
||||||
|
int8_t reserved[36];
|
||||||
|
int8_t updateEnd[4];
|
||||||
|
int32_t refCount;
|
||||||
|
} SClusterObj;
|
||||||
|
|
||||||
typedef struct SDnodeObj {
|
typedef struct SDnodeObj {
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
int32_t openVnodes;
|
int32_t openVnodes;
|
||||||
|
@ -163,6 +171,7 @@ typedef struct {
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t replications;
|
int8_t replications;
|
||||||
|
int8_t quorum;
|
||||||
int8_t reserved[12];
|
int8_t reserved[12];
|
||||||
} SDbCfg;
|
} SDbCfg;
|
||||||
|
|
||||||
|
|
|
@ -23,15 +23,16 @@ extern "C" {
|
||||||
struct SMnodeMsg;
|
struct SMnodeMsg;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
SDB_TABLE_DNODE = 0,
|
SDB_TABLE_CLUSTER = 0,
|
||||||
SDB_TABLE_MNODE = 1,
|
SDB_TABLE_DNODE = 1,
|
||||||
SDB_TABLE_ACCOUNT = 2,
|
SDB_TABLE_MNODE = 2,
|
||||||
SDB_TABLE_USER = 3,
|
SDB_TABLE_ACCOUNT = 3,
|
||||||
SDB_TABLE_DB = 4,
|
SDB_TABLE_USER = 4,
|
||||||
SDB_TABLE_VGROUP = 5,
|
SDB_TABLE_DB = 5,
|
||||||
SDB_TABLE_STABLE = 6,
|
SDB_TABLE_VGROUP = 6,
|
||||||
SDB_TABLE_CTABLE = 7,
|
SDB_TABLE_STABLE = 7,
|
||||||
SDB_TABLE_MAX = 8
|
SDB_TABLE_CTABLE = 8,
|
||||||
|
SDB_TABLE_MAX = 9
|
||||||
} ESdbTable;
|
} ESdbTable;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -64,7 +64,7 @@ static int32_t mnodeAcctActionUpdate(SSdbOper *pOper) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeActionActionEncode(SSdbOper *pOper) {
|
static int32_t mnodeAcctActionEncode(SSdbOper *pOper) {
|
||||||
SAcctObj *pAcct = pOper->pObj;
|
SAcctObj *pAcct = pOper->pObj;
|
||||||
memcpy(pOper->rowData, pAcct, tsAcctUpdateSize);
|
memcpy(pOper->rowData, pAcct, tsAcctUpdateSize);
|
||||||
pOper->rowSize = tsAcctUpdateSize;
|
pOper->rowSize = tsAcctUpdateSize;
|
||||||
|
@ -109,7 +109,7 @@ int32_t mnodeInitAccts() {
|
||||||
.insertFp = mnodeAcctActionInsert,
|
.insertFp = mnodeAcctActionInsert,
|
||||||
.deleteFp = mnodeAcctActionDelete,
|
.deleteFp = mnodeAcctActionDelete,
|
||||||
.updateFp = mnodeAcctActionUpdate,
|
.updateFp = mnodeAcctActionUpdate,
|
||||||
.encodeFp = mnodeActionActionEncode,
|
.encodeFp = mnodeAcctActionEncode,
|
||||||
.decodeFp = mnodeAcctActionDecode,
|
.decodeFp = mnodeAcctActionDecode,
|
||||||
.destroyFp = mnodeAcctActionDestroy,
|
.destroyFp = mnodeAcctActionDestroy,
|
||||||
.restoredFp = mnodeAcctActionRestored
|
.restoredFp = mnodeAcctActionRestored
|
||||||
|
|
|
@ -1,70 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "os.h"
|
|
||||||
#include "tglobal.h"
|
|
||||||
#include "mnodeDef.h"
|
|
||||||
#include "mnodeInt.h"
|
|
||||||
#include "mnodeDnode.h"
|
|
||||||
#include "mnodeSdb.h"
|
|
||||||
|
|
||||||
#ifndef _SYNC
|
|
||||||
|
|
||||||
int32_t balanceInit() { return TSDB_CODE_SUCCESS; }
|
|
||||||
void balanceCleanUp() {}
|
|
||||||
void balanceAsyncNotify() {}
|
|
||||||
void balanceSyncNotify() {}
|
|
||||||
void balanceReset() {}
|
|
||||||
int32_t balanceAlterDnode(struct SDnodeObj *pDnode, int32_t vnodeId, int32_t dnodeId) { return TSDB_CODE_SYN_NOT_ENABLED; }
|
|
||||||
|
|
||||||
int32_t balanceAllocVnodes(SVgObj *pVgroup) {
|
|
||||||
void * pIter = NULL;
|
|
||||||
SDnodeObj *pDnode = NULL;
|
|
||||||
SDnodeObj *pSelDnode = NULL;
|
|
||||||
float vnodeUsage = 1000.0;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
pIter = mnodeGetNextDnode(pIter, &pDnode);
|
|
||||||
if (pDnode == NULL) break;
|
|
||||||
|
|
||||||
if (pDnode->numOfCores > 0 && pDnode->openVnodes < TSDB_MAX_VNODES) {
|
|
||||||
float openVnodes = pDnode->openVnodes;
|
|
||||||
if (pDnode->isMgmt) openVnodes += tsMnodeEqualVnodeNum;
|
|
||||||
|
|
||||||
float usage = openVnodes / pDnode->numOfCores;
|
|
||||||
if (usage <= vnodeUsage) {
|
|
||||||
pSelDnode = pDnode;
|
|
||||||
vnodeUsage = usage;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mnodeDecDnodeRef(pDnode);
|
|
||||||
}
|
|
||||||
|
|
||||||
sdbFreeIter(pIter);
|
|
||||||
|
|
||||||
if (pSelDnode == NULL) {
|
|
||||||
mError("failed to alloc vnode to vgroup");
|
|
||||||
return TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
|
||||||
}
|
|
||||||
|
|
||||||
pVgroup->vnodeGid[0].dnodeId = pSelDnode->dnodeId;
|
|
||||||
pVgroup->vnodeGid[0].pDnode = pSelDnode;
|
|
||||||
|
|
||||||
mDebug("dnode:%d, alloc one vnode to vgroup, openVnodes:%d", pSelDnode->dnodeId, pSelDnode->openVnodes);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -0,0 +1,230 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "taoserror.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
#include "dnode.h"
|
||||||
|
#include "mnodeDef.h"
|
||||||
|
#include "mnodeInt.h"
|
||||||
|
#include "mnodeCluster.h"
|
||||||
|
#include "mnodeSdb.h"
|
||||||
|
#include "mnodeShow.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
|
||||||
|
static void * tsClusterSdb = NULL;
|
||||||
|
static int32_t tsClusterUpdateSize;
|
||||||
|
static int32_t tsClusterId;
|
||||||
|
static int32_t mnodeCreateCluster();
|
||||||
|
|
||||||
|
static int32_t mnodeGetClusterMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn);
|
||||||
|
static int32_t mnodeRetrieveClusters(SShowObj *pShow, char *data, int32_t rows, void *pConn);
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionDestroy(SSdbOper *pOper) {
|
||||||
|
tfree(pOper->pObj);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionInsert(SSdbOper *pOper) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionDelete(SSdbOper *pOper) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionUpdate(SSdbOper *pOper) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionEncode(SSdbOper *pOper) {
|
||||||
|
SClusterObj *pCluster = pOper->pObj;
|
||||||
|
memcpy(pOper->rowData, pCluster, tsClusterUpdateSize);
|
||||||
|
pOper->rowSize = tsClusterUpdateSize;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionDecode(SSdbOper *pOper) {
|
||||||
|
SClusterObj *pCluster = (SClusterObj *) calloc(1, sizeof(SClusterObj));
|
||||||
|
if (pCluster == NULL) return TSDB_CODE_MND_OUT_OF_MEMORY;
|
||||||
|
|
||||||
|
memcpy(pCluster, pOper->rowData, tsClusterUpdateSize);
|
||||||
|
pOper->pObj = pCluster;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeClusterActionRestored() {
|
||||||
|
int32_t numOfRows = sdbGetNumOfRows(tsClusterSdb);
|
||||||
|
if (numOfRows <= 0 && dnodeIsFirstDeploy()) {
|
||||||
|
mInfo("dnode first deploy, create cluster");
|
||||||
|
int32_t code = mnodeCreateCluster();
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
mError("failed to create cluster, reason:%s", tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
mnodeUpdateClusterId();
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t mnodeInitCluster() {
|
||||||
|
SClusterObj tObj;
|
||||||
|
tsClusterUpdateSize = (int8_t *)tObj.updateEnd - (int8_t *)&tObj;
|
||||||
|
|
||||||
|
SSdbTableDesc tableDesc = {
|
||||||
|
.tableId = SDB_TABLE_CLUSTER,
|
||||||
|
.tableName = "cluster",
|
||||||
|
.hashSessions = TSDB_DEFAULT_CLUSTER_HASH_SIZE,
|
||||||
|
.maxRowSize = tsClusterUpdateSize,
|
||||||
|
.refCountPos = (int8_t *)(&tObj.refCount) - (int8_t *)&tObj,
|
||||||
|
.keyType = SDB_KEY_INT,
|
||||||
|
.insertFp = mnodeClusterActionInsert,
|
||||||
|
.deleteFp = mnodeClusterActionDelete,
|
||||||
|
.updateFp = mnodeClusterActionUpdate,
|
||||||
|
.encodeFp = mnodeClusterActionEncode,
|
||||||
|
.decodeFp = mnodeClusterActionDecode,
|
||||||
|
.destroyFp = mnodeClusterActionDestroy,
|
||||||
|
.restoredFp = mnodeClusterActionRestored
|
||||||
|
};
|
||||||
|
|
||||||
|
tsClusterSdb = sdbOpenTable(&tableDesc);
|
||||||
|
if (tsClusterSdb == NULL) {
|
||||||
|
mError("table:%s, failed to create hash", tableDesc.tableName);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
mnodeAddShowMetaHandle(TSDB_MGMT_TABLE_CLUSTER, mnodeGetClusterMeta);
|
||||||
|
mnodeAddShowRetrieveHandle(TSDB_MGMT_TABLE_CLUSTER, mnodeRetrieveClusters);
|
||||||
|
|
||||||
|
mDebug("table:%s, hash is created", tableDesc.tableName);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mnodeCleanupCluster() {
|
||||||
|
sdbCloseTable(tsClusterSdb);
|
||||||
|
tsClusterSdb = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *mnodeGetCluster(int32_t clusterId) {
|
||||||
|
return sdbGetRow(tsClusterSdb, &clusterId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void *mnodeGetNextCluster(void *pIter, SClusterObj **pCluster) {
|
||||||
|
return sdbFetchRow(tsClusterSdb, pIter, (void **)pCluster);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mnodeIncClusterRef(SClusterObj *pCluster) {
|
||||||
|
sdbIncRef(tsClusterSdb, pCluster);
|
||||||
|
}
|
||||||
|
|
||||||
|
void mnodeDecClusterRef(SClusterObj *pCluster) {
|
||||||
|
sdbDecRef(tsClusterSdb, pCluster);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeCreateCluster() {
|
||||||
|
int32_t numOfClusters = sdbGetNumOfRows(tsClusterSdb);
|
||||||
|
if (numOfClusters != 0) return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
SClusterObj *pCluster = malloc(sizeof(SClusterObj));
|
||||||
|
memset(pCluster, 0, sizeof(SClusterObj));
|
||||||
|
pCluster->createdTime = taosGetTimestampMs();
|
||||||
|
pCluster->clusterId = labs((pCluster->createdTime >> 32) & (pCluster->createdTime)) | (*(int32_t*)tsFirst);
|
||||||
|
|
||||||
|
SSdbOper oper = {
|
||||||
|
.type = SDB_OPER_GLOBAL,
|
||||||
|
.table = tsClusterSdb,
|
||||||
|
.pObj = pCluster,
|
||||||
|
};
|
||||||
|
|
||||||
|
return sdbInsertRow(&oper);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t mnodeGetClusterId() {
|
||||||
|
return tsClusterId;
|
||||||
|
}
|
||||||
|
|
||||||
|
void mnodeUpdateClusterId() {
|
||||||
|
SClusterObj *pCluster = NULL;
|
||||||
|
mnodeGetNextCluster(NULL, &pCluster);
|
||||||
|
if (pCluster != NULL) {
|
||||||
|
tsClusterId = pCluster->clusterId;
|
||||||
|
mnodeDecClusterRef(pCluster);
|
||||||
|
mInfo("cluster id is %d", tsClusterId);
|
||||||
|
} else {
|
||||||
|
//assert(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int32_t mnodeGetClusterMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn) {
|
||||||
|
int32_t cols = 0;
|
||||||
|
SSchema *pSchema = pMeta->schema;
|
||||||
|
|
||||||
|
pShow->bytes[cols] = 4;
|
||||||
|
pSchema[cols].type = TSDB_DATA_TYPE_INT;
|
||||||
|
strcpy(pSchema[cols].name, "clusterId");
|
||||||
|
pSchema[cols].bytes = htons(pShow->bytes[cols]);
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pShow->bytes[cols] = 8;
|
||||||
|
pSchema[cols].type = TSDB_DATA_TYPE_TIMESTAMP;
|
||||||
|
strcpy(pSchema[cols].name, "create_time");
|
||||||
|
pSchema[cols].bytes = htons(pShow->bytes[cols]);
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pMeta->numOfColumns = htons(cols);
|
||||||
|
strcpy(pMeta->tableId, "show cluster");
|
||||||
|
pShow->numOfColumns = cols;
|
||||||
|
|
||||||
|
pShow->offset[0] = 0;
|
||||||
|
for (int32_t i = 1; i < cols; ++i) {
|
||||||
|
pShow->offset[i] = pShow->offset[i - 1] + pShow->bytes[i - 1];
|
||||||
|
}
|
||||||
|
|
||||||
|
pShow->numOfRows = 1;
|
||||||
|
pShow->rowSize = pShow->offset[cols - 1] + pShow->bytes[cols - 1];
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mnodeRetrieveClusters(SShowObj *pShow, char *data, int32_t rows, void *pConn) {
|
||||||
|
int32_t numOfRows = 0;
|
||||||
|
int32_t cols = 0;
|
||||||
|
char * pWrite;
|
||||||
|
SClusterObj *pCluster = NULL;
|
||||||
|
|
||||||
|
while (numOfRows < rows) {
|
||||||
|
pShow->pIter = mnodeGetNextCluster(pShow->pIter, &pCluster);
|
||||||
|
if (pCluster == NULL) break;
|
||||||
|
|
||||||
|
cols = 0;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int32_t *) pWrite = pCluster->clusterId;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int32_t *) pWrite = pCluster->createdTime;
|
||||||
|
cols++;
|
||||||
|
|
||||||
|
mnodeDecClusterRef(pCluster);
|
||||||
|
numOfRows++;
|
||||||
|
}
|
||||||
|
|
||||||
|
pShow->numOfReads += numOfRows;
|
||||||
|
return numOfRows;
|
||||||
|
}
|
|
@ -301,12 +301,11 @@ static int32_t mnodeCheckDbCfg(SDbCfg *pCfg) {
|
||||||
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _SYNC
|
if (pCfg->quorum < TSDB_MIN_DB_REPLICA_OPTION || pCfg->quorum > TSDB_MAX_DB_REPLICA_OPTION) {
|
||||||
if (pCfg->replications != 1) {
|
mError("invalid db option quorum:%d valid range: [%d, %d]", pCfg->quorum, TSDB_MIN_DB_REPLICA_OPTION,
|
||||||
mError("invalid db option replications:%d can only be 1 in this version", pCfg->replications);
|
TSDB_MAX_DB_REPLICA_OPTION);
|
||||||
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -327,6 +326,7 @@ static void mnodeSetDefaultDbCfg(SDbCfg *pCfg) {
|
||||||
if (pCfg->compression < 0) pCfg->compression = tsCompression;
|
if (pCfg->compression < 0) pCfg->compression = tsCompression;
|
||||||
if (pCfg->walLevel < 0) pCfg->walLevel = tsWAL;
|
if (pCfg->walLevel < 0) pCfg->walLevel = tsWAL;
|
||||||
if (pCfg->replications < 0) pCfg->replications = tsReplications;
|
if (pCfg->replications < 0) pCfg->replications = tsReplications;
|
||||||
|
if (pCfg->quorum < 0) pCfg->quorum = tsQuorum;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mnodeCreateDbCb(SMnodeMsg *pMsg, int32_t code) {
|
static int32_t mnodeCreateDbCb(SMnodeMsg *pMsg, int32_t code) {
|
||||||
|
@ -376,7 +376,8 @@ static int32_t mnodeCreateDb(SAcctObj *pAcct, SCMCreateDbMsg *pCreate, void *pMs
|
||||||
.precision = pCreate->precision,
|
.precision = pCreate->precision,
|
||||||
.compression = pCreate->compression,
|
.compression = pCreate->compression,
|
||||||
.walLevel = pCreate->walLevel,
|
.walLevel = pCreate->walLevel,
|
||||||
.replications = pCreate->replications
|
.replications = pCreate->replications,
|
||||||
|
.quorum = pCreate->quorum
|
||||||
};
|
};
|
||||||
|
|
||||||
mnodeSetDefaultDbCfg(&pDb->cfg);
|
mnodeSetDefaultDbCfg(&pDb->cfg);
|
||||||
|
@ -515,6 +516,12 @@ static int32_t mnodeGetDbMeta(STableMetaMsg *pMeta, SShowObj *pShow, void *pConn
|
||||||
pSchema[cols].bytes = htons(pShow->bytes[cols]);
|
pSchema[cols].bytes = htons(pShow->bytes[cols]);
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
pShow->bytes[cols] = 2;
|
||||||
|
pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
|
||||||
|
strcpy(pSchema[cols].name, "quorum");
|
||||||
|
pSchema[cols].bytes = htons(pShow->bytes[cols]);
|
||||||
|
cols++;
|
||||||
|
|
||||||
pShow->bytes[cols] = 2;
|
pShow->bytes[cols] = 2;
|
||||||
pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
|
pSchema[cols].type = TSDB_DATA_TYPE_SMALLINT;
|
||||||
strcpy(pSchema[cols].name, "days");
|
strcpy(pSchema[cols].name, "days");
|
||||||
|
@ -661,6 +668,10 @@ static int32_t mnodeRetrieveDbs(SShowObj *pShow, char *data, int32_t rows, void
|
||||||
*(int16_t *)pWrite = pDb->cfg.replications;
|
*(int16_t *)pWrite = pDb->cfg.replications;
|
||||||
cols++;
|
cols++;
|
||||||
|
|
||||||
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
|
*(int16_t *)pWrite = pDb->cfg.quorum;
|
||||||
|
cols++;
|
||||||
|
|
||||||
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
pWrite = data + pShow->offset[cols] * rows + pShow->bytes[cols] * numOfRows;
|
||||||
*(int16_t *)pWrite = pDb->cfg.daysPerFile;
|
*(int16_t *)pWrite = pDb->cfg.daysPerFile;
|
||||||
cols++;
|
cols++;
|
||||||
|
@ -810,6 +821,7 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SCMAlterDbMsg *pAlter) {
|
||||||
int8_t compression = pAlter->compression;
|
int8_t compression = pAlter->compression;
|
||||||
int8_t walLevel = pAlter->walLevel;
|
int8_t walLevel = pAlter->walLevel;
|
||||||
int8_t replications = pAlter->replications;
|
int8_t replications = pAlter->replications;
|
||||||
|
int8_t quorum = pAlter->quorum;
|
||||||
int8_t precision = pAlter->precision;
|
int8_t precision = pAlter->precision;
|
||||||
|
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
terrno = TSDB_CODE_SUCCESS;
|
||||||
|
@ -908,6 +920,11 @@ static SDbCfg mnodeGetAlterDbOption(SDbObj *pDb, SCMAlterDbMsg *pAlter) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (quorum >= 0 && quorum != pDb->cfg.quorum) {
|
||||||
|
mDebug("db:%s, quorum:%d change to %d", pDb->name, pDb->cfg.quorum, quorum);
|
||||||
|
newCfg.compression = quorum;
|
||||||
|
}
|
||||||
|
|
||||||
return newCfg;
|
return newCfg;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@
|
||||||
#include "mnodeVgroup.h"
|
#include "mnodeVgroup.h"
|
||||||
#include "mnodeWrite.h"
|
#include "mnodeWrite.h"
|
||||||
#include "mnodePeer.h"
|
#include "mnodePeer.h"
|
||||||
|
#include "mnodeCluster.h"
|
||||||
|
|
||||||
int32_t tsAccessSquence = 0;
|
int32_t tsAccessSquence = 0;
|
||||||
static void *tsDnodeSdb = NULL;
|
static void *tsDnodeSdb = NULL;
|
||||||
|
@ -78,9 +79,6 @@ static int32_t mnodeDnodeActionInsert(SSdbOper *pOper) {
|
||||||
static int32_t mnodeDnodeActionDelete(SSdbOper *pOper) {
|
static int32_t mnodeDnodeActionDelete(SSdbOper *pOper) {
|
||||||
SDnodeObj *pDnode = pOper->pObj;
|
SDnodeObj *pDnode = pOper->pObj;
|
||||||
|
|
||||||
#ifndef _SYNC
|
|
||||||
mnodeDropAllDnodeVgroups(pDnode);
|
|
||||||
#endif
|
|
||||||
mnodeDropMnodeLocal(pDnode->dnodeId);
|
mnodeDropMnodeLocal(pDnode->dnodeId);
|
||||||
balanceAsyncNotify();
|
balanceAsyncNotify();
|
||||||
|
|
||||||
|
@ -355,6 +353,7 @@ static int32_t mnodeProcessDnodeStatusMsg(SMnodeMsg *pMsg) {
|
||||||
pStatus->moduleStatus = htonl(pStatus->moduleStatus);
|
pStatus->moduleStatus = htonl(pStatus->moduleStatus);
|
||||||
pStatus->lastReboot = htonl(pStatus->lastReboot);
|
pStatus->lastReboot = htonl(pStatus->lastReboot);
|
||||||
pStatus->numOfCores = htons(pStatus->numOfCores);
|
pStatus->numOfCores = htons(pStatus->numOfCores);
|
||||||
|
pStatus->clusterId = htonl(pStatus->clusterId);
|
||||||
|
|
||||||
uint32_t version = htonl(pStatus->version);
|
uint32_t version = htonl(pStatus->version);
|
||||||
if (version != tsVersion) {
|
if (version != tsVersion) {
|
||||||
|
@ -384,10 +383,16 @@ static int32_t mnodeProcessDnodeStatusMsg(SMnodeMsg *pMsg) {
|
||||||
pDnode->moduleStatus = pStatus->moduleStatus;
|
pDnode->moduleStatus = pStatus->moduleStatus;
|
||||||
|
|
||||||
if (pStatus->dnodeId == 0) {
|
if (pStatus->dnodeId == 0) {
|
||||||
mDebug("dnode:%d %s, first access", pDnode->dnodeId, pDnode->dnodeEp);
|
mDebug("dnode:%d %s, first access, set clusterId %d", pDnode->dnodeId, pDnode->dnodeEp, mnodeGetClusterId());
|
||||||
|
} else {
|
||||||
|
if (pStatus->clusterId != mnodeGetClusterId()) {
|
||||||
|
mError("dnode:%d, input clusterId %d not match with exist %d", pDnode->dnodeId, pStatus->clusterId,
|
||||||
|
mnodeGetClusterId());
|
||||||
|
return TSDB_CODE_MND_INVALID_CLUSTER_ID;
|
||||||
} else {
|
} else {
|
||||||
mTrace("dnode:%d, status received, access times %d", pDnode->dnodeId, pDnode->lastAccess);
|
mTrace("dnode:%d, status received, access times %d", pDnode->dnodeId, pDnode->lastAccess);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t openVnodes = htons(pStatus->openVnodes);
|
int32_t openVnodes = htons(pStatus->openVnodes);
|
||||||
int32_t contLen = sizeof(SDMStatusRsp) + openVnodes * sizeof(SDMVgroupAccess);
|
int32_t contLen = sizeof(SDMStatusRsp) + openVnodes * sizeof(SDMVgroupAccess);
|
||||||
|
@ -400,6 +405,7 @@ static int32_t mnodeProcessDnodeStatusMsg(SMnodeMsg *pMsg) {
|
||||||
pRsp->dnodeCfg.dnodeId = htonl(pDnode->dnodeId);
|
pRsp->dnodeCfg.dnodeId = htonl(pDnode->dnodeId);
|
||||||
pRsp->dnodeCfg.moduleStatus = htonl((int32_t)pDnode->isMgmt);
|
pRsp->dnodeCfg.moduleStatus = htonl((int32_t)pDnode->isMgmt);
|
||||||
pRsp->dnodeCfg.numOfVnodes = htonl(openVnodes);
|
pRsp->dnodeCfg.numOfVnodes = htonl(openVnodes);
|
||||||
|
pRsp->dnodeCfg.clusterId = htonl(mnodeGetClusterId());
|
||||||
SDMVgroupAccess *pAccess = (SDMVgroupAccess *)((char *)pRsp + sizeof(SDMStatusRsp));
|
SDMVgroupAccess *pAccess = (SDMVgroupAccess *)((char *)pRsp + sizeof(SDMStatusRsp));
|
||||||
|
|
||||||
for (int32_t j = 0; j < openVnodes; ++j) {
|
for (int32_t j = 0; j < openVnodes; ++j) {
|
||||||
|
@ -543,12 +549,7 @@ static int32_t mnodeDropDnodeByEp(char *ep, SMnodeMsg *pMsg) {
|
||||||
|
|
||||||
mInfo("dnode:%d, start to drop it", pDnode->dnodeId);
|
mInfo("dnode:%d, start to drop it", pDnode->dnodeId);
|
||||||
|
|
||||||
#ifndef _SYNC
|
|
||||||
int32_t code = mnodeDropDnode(pDnode, pMsg);
|
|
||||||
#else
|
|
||||||
int32_t code = balanceDropDnode(pDnode);
|
int32_t code = balanceDropDnode(pDnode);
|
||||||
#endif
|
|
||||||
|
|
||||||
mnodeDecDnodeRef(pDnode);
|
mnodeDecDnodeRef(pDnode);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "mnodeVgroup.h"
|
#include "mnodeVgroup.h"
|
||||||
#include "mnodeUser.h"
|
#include "mnodeUser.h"
|
||||||
#include "mnodeTable.h"
|
#include "mnodeTable.h"
|
||||||
|
#include "mnodeCluster.h"
|
||||||
#include "mnodeShow.h"
|
#include "mnodeShow.h"
|
||||||
#include "mnodeProfile.h"
|
#include "mnodeProfile.h"
|
||||||
|
|
||||||
|
@ -46,6 +47,7 @@ static bool tsMgmtIsRunning = false;
|
||||||
|
|
||||||
static const SMnodeComponent tsMnodeComponents[] = {
|
static const SMnodeComponent tsMnodeComponents[] = {
|
||||||
{"profile", mnodeInitProfile, mnodeCleanupProfile},
|
{"profile", mnodeInitProfile, mnodeCleanupProfile},
|
||||||
|
{"cluster", mnodeInitCluster, mnodeCleanupCluster},
|
||||||
{"accts", mnodeInitAccts, mnodeCleanupAccts},
|
{"accts", mnodeInitAccts, mnodeCleanupAccts},
|
||||||
{"users", mnodeInitUsers, mnodeCleanupUsers},
|
{"users", mnodeInitUsers, mnodeCleanupUsers},
|
||||||
{"dnodes", mnodeInitDnodes, mnodeCleanupDnodes},
|
{"dnodes", mnodeInitDnodes, mnodeCleanupDnodes},
|
||||||
|
|
|
@ -190,18 +190,7 @@ void *mnodeGetNextMnode(void *pIter, SMnodeObj **pMnode) {
|
||||||
}
|
}
|
||||||
|
|
||||||
char *mnodeGetMnodeRoleStr(int32_t role) {
|
char *mnodeGetMnodeRoleStr(int32_t role) {
|
||||||
switch (role) {
|
return syncRole[role];
|
||||||
case TAOS_SYNC_ROLE_OFFLINE:
|
|
||||||
return "offline";
|
|
||||||
case TAOS_SYNC_ROLE_UNSYNCED:
|
|
||||||
return "unsynced";
|
|
||||||
case TAOS_SYNC_ROLE_SLAVE:
|
|
||||||
return "slave";
|
|
||||||
case TAOS_SYNC_ROLE_MASTER:
|
|
||||||
return "master";
|
|
||||||
default:
|
|
||||||
return "undefined";
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void mnodeUpdateMnodeEpSet() {
|
void mnodeUpdateMnodeEpSet() {
|
||||||
|
|
|
@ -68,7 +68,7 @@ int32_t mnodeInitProfile() {
|
||||||
mnodeAddWriteMsgHandle(TSDB_MSG_TYPE_CM_KILL_STREAM, mnodeProcessKillStreamMsg);
|
mnodeAddWriteMsgHandle(TSDB_MSG_TYPE_CM_KILL_STREAM, mnodeProcessKillStreamMsg);
|
||||||
mnodeAddWriteMsgHandle(TSDB_MSG_TYPE_CM_KILL_CONN, mnodeProcessKillConnectionMsg);
|
mnodeAddWriteMsgHandle(TSDB_MSG_TYPE_CM_KILL_CONN, mnodeProcessKillConnectionMsg);
|
||||||
|
|
||||||
tsMnodeConnCache = taosCacheInit(TSDB_DATA_TYPE_INT, CONN_CHECK_TIME, false, mnodeFreeConn, "conn");
|
tsMnodeConnCache = taosCacheInit(TSDB_DATA_TYPE_INT, CONN_CHECK_TIME, true, mnodeFreeConn, "conn");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,7 +119,7 @@ SConnObj *mnodeAccquireConn(int32_t connId, char *user, uint32_t ip, uint16_t po
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pConn->ip != ip || pConn->port != port /* || strcmp(pConn->user, user) != 0 */) {
|
if (/* pConn->ip != ip || */ pConn->port != port /* || strcmp(pConn->user, user) != 0 */) {
|
||||||
mError("connId:%d, incoming conn user:%s ip:%s:%u, not match exist conn user:%s ip:%s:%u", connId, user,
|
mError("connId:%d, incoming conn user:%s ip:%s:%u, not match exist conn user:%s ip:%s:%u", connId, user,
|
||||||
taosIpStr(ip), port, pConn->user, taosIpStr(pConn->ip), pConn->port);
|
taosIpStr(ip), port, pConn->user, taosIpStr(pConn->ip), pConn->port);
|
||||||
taosCacheRelease(tsMnodeConnCache, (void **)&pConn, false);
|
taosCacheRelease(tsMnodeConnCache, (void **)&pConn, false);
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "mnodeInt.h"
|
#include "mnodeInt.h"
|
||||||
#include "mnodeMnode.h"
|
#include "mnodeMnode.h"
|
||||||
#include "mnodeDnode.h"
|
#include "mnodeDnode.h"
|
||||||
|
#include "mnodeCluster.h"
|
||||||
#include "mnodeSdb.h"
|
#include "mnodeSdb.h"
|
||||||
|
|
||||||
#define SDB_TABLE_LEN 12
|
#define SDB_TABLE_LEN 12
|
||||||
|
@ -214,6 +215,7 @@ void sdbUpdateMnodeRoles() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mnodeUpdateClusterId();
|
||||||
mnodeUpdateMnodeEpSet();
|
mnodeUpdateMnodeEpSet();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -103,6 +103,8 @@ static char *mnodeGetShowType(int32_t showType) {
|
||||||
case TSDB_MGMT_TABLE_SCORES: return "show scores";
|
case TSDB_MGMT_TABLE_SCORES: return "show scores";
|
||||||
case TSDB_MGMT_TABLE_GRANTS: return "show grants";
|
case TSDB_MGMT_TABLE_GRANTS: return "show grants";
|
||||||
case TSDB_MGMT_TABLE_VNODES: return "show vnodes";
|
case TSDB_MGMT_TABLE_VNODES: return "show vnodes";
|
||||||
|
case TSDB_MGMT_TABLE_CLUSTER: return "show clusters";
|
||||||
|
case TSDB_MGMT_TABLE_STREAMTABLES : return "show streamtables";
|
||||||
default: return "undefined";
|
default: return "undefined";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -784,7 +784,7 @@ static SMDCreateVnodeMsg *mnodeBuildVnodeMsg(SVgObj *pVgroup) {
|
||||||
pCfg->walLevel = pDb->cfg.walLevel;
|
pCfg->walLevel = pDb->cfg.walLevel;
|
||||||
pCfg->replications = (int8_t) pVgroup->numOfVnodes;
|
pCfg->replications = (int8_t) pVgroup->numOfVnodes;
|
||||||
pCfg->wals = 3;
|
pCfg->wals = 3;
|
||||||
pCfg->quorum = 1;
|
pCfg->quorum = pDb->cfg.quorum;
|
||||||
|
|
||||||
SMDVnodeDesc *pNodes = pVnode->nodes;
|
SMDVnodeDesc *pNodes = pVnode->nodes;
|
||||||
for (int32_t j = 0; j < pVgroup->numOfVnodes; ++j) {
|
for (int32_t j = 0; j < pVgroup->numOfVnodes; ++j) {
|
||||||
|
|
|
@ -1,6 +1,16 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
ADD_SUBDIRECTORY(linux)
|
IF (TD_LINUX_64)
|
||||||
ADD_SUBDIRECTORY(windows)
|
ADD_SUBDIRECTORY(src/linux64)
|
||||||
ADD_SUBDIRECTORY(darwin)
|
ELSEIF (TD_LINUX_32)
|
||||||
|
ADD_SUBDIRECTORY(src/linux32)
|
||||||
|
ELSEIF (TD_DARWIN_64)
|
||||||
|
ADD_SUBDIRECTORY(src/darwin64)
|
||||||
|
ELSEIF (TD_WINDOWS_64)
|
||||||
|
ADD_SUBDIRECTORY(src/windows64)
|
||||||
|
ELSEIF (TD_WINDOWS_32)
|
||||||
|
ADD_SUBDIRECTORY(src/windows32)
|
||||||
|
ENDIF ()
|
||||||
|
|
||||||
|
ADD_SUBDIRECTORY(src/detail)
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
|
||||||
PROJECT(TDengine)
|
|
||||||
|
|
||||||
IF (TD_DARWIN_64)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
|
||||||
INCLUDE_DIRECTORIES(inc)
|
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
|
||||||
ADD_LIBRARY(os ${SRC})
|
|
||||||
ENDIF ()
|
|
|
@ -0,0 +1,53 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_OS_H
|
||||||
|
#define TDENGINE_OS_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TD_DARWIN_64
|
||||||
|
#include "osDarwin64.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TD_LINUX_64
|
||||||
|
#include "osLinux64.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TD_LINUX_32
|
||||||
|
#include "osLinux32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TD_ALPINE
|
||||||
|
#include "osAlpine.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TD_WINDOWS_64
|
||||||
|
#include "osWindows64.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef _TD_WINDOWS_32
|
||||||
|
#include "osWindows32.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include "osSpec.h"
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_OS_LINUX64_H
|
||||||
|
#define TDENGINE_OS_LINUX64_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <argp.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <endian.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#include <netinet/udp.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <sys/eventfd.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <wordexp.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
|
||||||
|
typedef int(*__compar_fn_t)(const void *, const void *);
|
||||||
|
void error (int, int, const char *);
|
||||||
|
#ifndef PTHREAD_MUTEX_RECURSIVE_NP
|
||||||
|
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -201,9 +201,10 @@ int tsem_destroy(dispatch_semaphore_t *sem);
|
||||||
|
|
||||||
void osInit();
|
void osInit();
|
||||||
|
|
||||||
|
ssize_t tread(int fd, void *buf, size_t count);
|
||||||
|
|
||||||
ssize_t twrite(int fd, void *buf, size_t n);
|
ssize_t twrite(int fd, void *buf, size_t n);
|
||||||
|
|
||||||
char *taosCharsetReplace(char *charsetstr);
|
|
||||||
|
|
||||||
bool taosCheckPthreadValid(pthread_t thread);
|
bool taosCheckPthreadValid(pthread_t thread);
|
||||||
|
|
||||||
|
@ -217,8 +218,6 @@ int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optle
|
||||||
|
|
||||||
void taosPrintOsInfo();
|
void taosPrintOsInfo();
|
||||||
|
|
||||||
char *taosCharsetReplace(char *charsetstr);
|
|
||||||
|
|
||||||
void taosPrintOsInfo();
|
void taosPrintOsInfo();
|
||||||
|
|
||||||
void taosGetSystemInfo();
|
void taosGetSystemInfo();
|
||||||
|
@ -233,6 +232,8 @@ int fsendfile(FILE* out_file, FILE* in_file, int64_t* offset, int32_t count);
|
||||||
|
|
||||||
void taosSetCoreDump();
|
void taosSetCoreDump();
|
||||||
|
|
||||||
|
int tSystem(const char * cmd);
|
||||||
|
|
||||||
typedef int(*__compar_fn_t)(const void *, const void *);
|
typedef int(*__compar_fn_t)(const void *, const void *);
|
||||||
|
|
||||||
// for send function in tsocket.c
|
// for send function in tsocket.c
|
||||||
|
@ -255,6 +256,17 @@ typedef int(*__compar_fn_t)(const void *, const void *);
|
||||||
#define BUILDIN_CLZ(val) __builtin_clz(val)
|
#define BUILDIN_CLZ(val) __builtin_clz(val)
|
||||||
#define BUILDIN_CTZ(val) __builtin_ctz(val)
|
#define BUILDIN_CTZ(val) __builtin_ctz(val)
|
||||||
|
|
||||||
|
#undef threadlocal
|
||||||
|
#ifdef _ISOC11_SOURCE
|
||||||
|
#define threadlocal _Thread_local
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#define threadlocal
|
||||||
|
#elif defined(__GNUC__) && !defined(threadlocal)
|
||||||
|
#define threadlocal __thread
|
||||||
|
#else
|
||||||
|
#define threadlocal
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_OS_LINUX64_H
|
||||||
|
#define TDENGINE_OS_LINUX64_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
|
||||||
|
#include <argp.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <endian.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#include <netinet/udp.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <sys/eventfd.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <wordexp.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <error.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,85 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_OS_LINUX64_H
|
||||||
|
#define TDENGINE_OS_LINUX64_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <argp.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <dirent.h>
|
||||||
|
#include <endian.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <ifaddrs.h>
|
||||||
|
#include <libgen.h>
|
||||||
|
#include <limits.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netinet/ip.h>
|
||||||
|
#include <netinet/tcp.h>
|
||||||
|
#include <netinet/udp.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <pwd.h>
|
||||||
|
#include <regex.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <strings.h>
|
||||||
|
#include <sys/epoll.h>
|
||||||
|
#include <sys/eventfd.h>
|
||||||
|
#include <sys/file.h>
|
||||||
|
#include <sys/ioctl.h>
|
||||||
|
#include <sys/mman.h>
|
||||||
|
#include <sys/sendfile.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/syscall.h>
|
||||||
|
#include <sys/statvfs.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/uio.h>
|
||||||
|
#include <sys/un.h>
|
||||||
|
#include <syslog.h>
|
||||||
|
#include <termios.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <wchar.h>
|
||||||
|
#include <wordexp.h>
|
||||||
|
#include <wctype.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/utsname.h>
|
||||||
|
#include <sys/resource.h>
|
||||||
|
#include <error.h>
|
||||||
|
#include <linux/sysctl.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,386 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_OS_SPEC_H
|
||||||
|
#define TDENGINE_OS_SPEC_H
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define tclose(x) taosCloseSocket(x)
|
||||||
|
#define tfree(x) \
|
||||||
|
do { \
|
||||||
|
if (x) { \
|
||||||
|
free((void *)(x)); \
|
||||||
|
x = 0; \
|
||||||
|
} \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
#define tstrncpy(dst, src, size) \
|
||||||
|
do { \
|
||||||
|
strncpy((dst), (src), (size)); \
|
||||||
|
(dst)[(size)-1] = 0; \
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
#ifndef STDERR_FILENO
|
||||||
|
#define STDERR_FILENO (2)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define FD_VALID(x) ((x) > STDERR_FILENO)
|
||||||
|
#define FD_INITIALIZER ((int32_t)-1)
|
||||||
|
|
||||||
|
#define WCHAR wchar_t
|
||||||
|
|
||||||
|
#define POINTER_SHIFT(p, b) ((void *)((char *)(p) + (b)))
|
||||||
|
#define POINTER_DISTANCE(p1, p2) ((char *)(p1) - (char *)(p2))
|
||||||
|
|
||||||
|
#ifndef NDEBUG
|
||||||
|
#define ASSERT(x) assert(x)
|
||||||
|
#else
|
||||||
|
#define ASSERT(x)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef UNUSED
|
||||||
|
#undefine UNUSED
|
||||||
|
#endif
|
||||||
|
#define UNUSED(x) ((void)(x))
|
||||||
|
|
||||||
|
#ifdef UNUSED_FUNC
|
||||||
|
#undefine UNUSED_FUNC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef UNUSED_PARAM
|
||||||
|
#undef UNUSED_PARAM
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define UNUSED_PARAM(x) _UNUSED##x __attribute__((unused))
|
||||||
|
#define UNUSED_FUNC __attribute__((unused))
|
||||||
|
#else
|
||||||
|
#define UNUSED_PARAM(x) x
|
||||||
|
#define UNUSED_FUNC
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef tListLen
|
||||||
|
#undefine tListLen
|
||||||
|
#endif
|
||||||
|
#define tListLen(x) (sizeof(x) / sizeof((x)[0]))
|
||||||
|
|
||||||
|
#if defined(__GNUC__)
|
||||||
|
#define FORCE_INLINE inline __attribute__((always_inline))
|
||||||
|
#else
|
||||||
|
#define FORCE_INLINE
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define DEFAULT_UNICODE_ENCODEC "UCS-4LE"
|
||||||
|
|
||||||
|
#define DEFAULT_COMP(x, y) \
|
||||||
|
do { \
|
||||||
|
if ((x) == (y)) { \
|
||||||
|
return 0; \
|
||||||
|
} else { \
|
||||||
|
return (x) < (y) ? -1 : 1; \
|
||||||
|
} \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define ALIGN_NUM(n, align) (((n) + ((align)-1)) & (~((align)-1)))
|
||||||
|
|
||||||
|
// align to 8bytes
|
||||||
|
#define ALIGN8(n) ALIGN_NUM(n, 8)
|
||||||
|
|
||||||
|
#define POW2(x) ((x) * (x))
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_MATH
|
||||||
|
#define SWAP(a, b, c) \
|
||||||
|
do { \
|
||||||
|
typeof(a) __tmp = (a); \
|
||||||
|
(a) = (b); \
|
||||||
|
(b) = __tmp; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define MAX(a, b) \
|
||||||
|
({ \
|
||||||
|
typeof(a) __a = (a); \
|
||||||
|
typeof(b) __b = (b); \
|
||||||
|
(__a > __b) ? __a : __b; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define MIN(a, b) \
|
||||||
|
({ \
|
||||||
|
typeof(a) __a = (a); \
|
||||||
|
typeof(b) __b = (b); \
|
||||||
|
(__a < __b) ? __a : __b; \
|
||||||
|
})
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_DEF_TIME
|
||||||
|
#define MILLISECOND_PER_SECOND ((int64_t)1000L)
|
||||||
|
#endif
|
||||||
|
#define MILLISECOND_PER_MINUTE (MILLISECOND_PER_SECOND * 60)
|
||||||
|
#define MILLISECOND_PER_HOUR (MILLISECOND_PER_MINUTE * 60)
|
||||||
|
#define MILLISECOND_PER_DAY (MILLISECOND_PER_HOUR * 24)
|
||||||
|
#define MILLISECOND_PER_WEEK (MILLISECOND_PER_DAY * 7)
|
||||||
|
#define MILLISECOND_PER_MONTH (MILLISECOND_PER_DAY * 30)
|
||||||
|
#define MILLISECOND_PER_YEAR (MILLISECOND_PER_DAY * 365)
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_SEMPHONE
|
||||||
|
#define tsem_t sem_t
|
||||||
|
#define tsem_init sem_init
|
||||||
|
#define tsem_wait sem_wait
|
||||||
|
#define tsem_post sem_post
|
||||||
|
#define tsem_destroy sem_destroy
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_ATOMIC
|
||||||
|
#define atomic_load_8(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_load_16(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_load_32(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_load_64(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_load_ptr(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_store_8(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_store_16(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_store_32(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_store_64(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_store_ptr(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_exchange_8(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_exchange_16(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_exchange_32(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_exchange_64(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_exchange_ptr(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_val_compare_exchange_8 __sync_val_compare_and_swap
|
||||||
|
#define atomic_val_compare_exchange_16 __sync_val_compare_and_swap
|
||||||
|
#define atomic_val_compare_exchange_32 __sync_val_compare_and_swap
|
||||||
|
#define atomic_val_compare_exchange_64 __sync_val_compare_and_swap
|
||||||
|
#define atomic_val_compare_exchange_ptr __sync_val_compare_and_swap
|
||||||
|
|
||||||
|
#define atomic_add_fetch_8(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_add_fetch_16(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_add_fetch_32(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_add_fetch_64(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_add_fetch_ptr(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_fetch_add_8(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_add_16(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_add_32(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_add_64(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_add_ptr(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_sub_fetch_8(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_sub_fetch_16(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_sub_fetch_32(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_sub_fetch_64(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_sub_fetch_ptr(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_fetch_sub_8(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_sub_16(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_sub_32(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_sub_64(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_sub_ptr(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_and_fetch_8(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_and_fetch_16(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_and_fetch_32(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_and_fetch_64(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_and_fetch_ptr(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_fetch_and_8(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_and_16(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_and_32(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_and_64(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_and_ptr(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_or_fetch_8(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_or_fetch_16(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_or_fetch_32(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_or_fetch_64(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_or_fetch_ptr(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_fetch_or_8(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_or_16(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_or_32(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_or_64(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_or_ptr(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_xor_fetch_8(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_xor_fetch_16(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_xor_fetch_32(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_xor_fetch_64(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_xor_fetch_ptr(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
|
||||||
|
#define atomic_fetch_xor_8(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_xor_16(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_xor_32(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_xor_64(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#define atomic_fetch_xor_ptr(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
ssize_t taosTReadImp(int fd, void *buf, size_t count);
|
||||||
|
ssize_t taosTWriteImp(int fd, void *buf, size_t count);
|
||||||
|
ssize_t taosTSendFileImp(int dfd, int sfd, off_t *offset, size_t size);
|
||||||
|
#ifndef TAOS_OS_FUNC_FILE_OP
|
||||||
|
#define taosTRead(fd, buf, count) taosTReadImp(fd, buf, count)
|
||||||
|
#define taosTWrite(fd, buf, count) taosTWriteImp(fd, buf, count)
|
||||||
|
#define taosLSeek(fd, offset, whence) lseek(fd, offset, whence)
|
||||||
|
#define taosTSendFile(dfd, sfd, offset, size) taosTSendFileImp(dfd, sfd, offset, size)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_NETWORK
|
||||||
|
#define taosSend(sockfd, buf, len, flags) send(sockfd, buf, len, flags)
|
||||||
|
#define taosSendto(sockfd, buf, len, flags, dest_addr, addrlen) sendto(sockfd, buf, len, flags, dest_addr, addrlen)
|
||||||
|
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
|
||||||
|
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
|
||||||
|
#define taosCloseSocket(x) \
|
||||||
|
{ \
|
||||||
|
if (FD_VALID(x)) { \
|
||||||
|
close(x); \
|
||||||
|
x = FD_INITIALIZER; \
|
||||||
|
} \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_LZ4
|
||||||
|
#define BUILDIN_CLZL(val) __builtin_clzl(val)
|
||||||
|
#define BUILDIN_CTZL(val) __builtin_ctzl(val)
|
||||||
|
#define BUILDIN_CLZ(val) __builtin_clz(val)
|
||||||
|
#define BUILDIN_CTZ(val) __builtin_ctz(val)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_WCHAR
|
||||||
|
#define twcslen wcslen
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#undef threadlocal
|
||||||
|
#ifdef _ISOC11_SOURCE
|
||||||
|
#define threadlocal _Thread_local
|
||||||
|
#elif defined(__APPLE__)
|
||||||
|
#define threadlocal
|
||||||
|
#elif defined(__GNUC__) && !defined(threadlocal)
|
||||||
|
#define threadlocal __thread
|
||||||
|
#else
|
||||||
|
#define threadlocal
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void osInit();
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_PTHREAD
|
||||||
|
bool taosCheckPthreadValid(pthread_t thread);
|
||||||
|
int64_t taosGetPthreadId();
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_SOCKET
|
||||||
|
int taosSetNonblocking(int sock, int on);
|
||||||
|
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen);
|
||||||
|
void taosBlockSIGPIPE();
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_SYSINFO
|
||||||
|
void taosGetSystemInfo();
|
||||||
|
void taosPrintOsInfo();
|
||||||
|
void taosKillSystem();
|
||||||
|
int tSystem(const char * cmd) ;
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_CORE
|
||||||
|
void taosSetCoreDump();
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_UTIL
|
||||||
|
int64_t tsosStr2int64(char *str);
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_TIMER
|
||||||
|
void taosMsleep(int mseconds);
|
||||||
|
int taosInitTimer(void (*callback)(int), int ms);
|
||||||
|
void taosUninitTimer();
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_RAND
|
||||||
|
uint32_t taosRand(void);
|
||||||
|
void taosRandStr(char* str, int32_t size);
|
||||||
|
uint32_t trand(void);
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_FILE
|
||||||
|
void getTmpfilePath(const char *fileNamePrefix, char *dstPath);
|
||||||
|
int32_t taosFileRename(char *fullPath, char *suffix, char delimiter, char **dstPath);
|
||||||
|
|
||||||
|
// USE_LIBICONV
|
||||||
|
int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs);
|
||||||
|
bool taosMbsToUcs4(char *mbs, size_t mbs_len, char *ucs4, int32_t ucs4_max_len, size_t *len);
|
||||||
|
int tasoUcs4Compare(void *f1_ucs4, void *f2_ucs4, int bytes);
|
||||||
|
bool taosValidateEncodec(const char *encodec);
|
||||||
|
char * taosCharsetReplace(char *charsetstr);
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_MALLOC
|
||||||
|
#define TAOS_ALLOC_MODE_DEFAULT 0
|
||||||
|
#define TAOS_ALLOC_MODE_RANDOM_FAIL 1
|
||||||
|
#define TAOS_ALLOC_MODE_DETECT_LEAK 2
|
||||||
|
void taosSetAllocMode(int mode, const char *path, bool autoDump);
|
||||||
|
void taosDumpMemoryLeak();
|
||||||
|
void * tmalloc(size_t size);
|
||||||
|
void * tcalloc(size_t nmemb, size_t size);
|
||||||
|
size_t tsizeof(void *ptr);
|
||||||
|
void tmemset(void *ptr, int c);
|
||||||
|
void * trealloc(void *ptr, size_t size);
|
||||||
|
void tzfree(void *ptr);
|
||||||
|
|
||||||
|
// TAOS_OS_FUNC_DIR
|
||||||
|
void taosRemoveDir(char *rootDir);
|
||||||
|
int taosMkDir(const char *pathname, mode_t mode);
|
||||||
|
void taosMvDir(char* destDir, char *srcDir);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
void taosSetRandomFileFailFactor(int factor);
|
||||||
|
void taosSetRandomFileFailOutput(const char *path);
|
||||||
|
ssize_t taosReadFileRandomFail(int fd, void *buf, size_t count, const char *file, uint32_t line);
|
||||||
|
ssize_t taosWriteFileRandomFail(int fd, void *buf, size_t count, const char *file, uint32_t line);
|
||||||
|
off_t taosLSeekRandomFail(int fd, off_t offset, int whence, const char *file, uint32_t line);
|
||||||
|
#define taosTRead(fd, buf, count) taosReadFileRandomFail(fd, buf, count, __FILE__, __LINE__)
|
||||||
|
#define taosTWrite(fd, buf, count) taosWriteFileRandomFail(fd, buf, count, __FILE__, __LINE__)
|
||||||
|
#define taosLSeek(fd, offset, whence) taosLSeekRandomFail(fd, offset, whence, __FILE__, __LINE__)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
||||||
|
ssize_t taosSendRandomFail(int sockfd, const void *buf, size_t len, int flags);
|
||||||
|
ssize_t taosSendToRandomFail(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
|
||||||
|
ssize_t taosReadSocketRandomFail(int fd, void *buf, size_t count);
|
||||||
|
ssize_t taosWriteSocketRandomFail(int fd, const void *buf, size_t count);
|
||||||
|
#define taosSend(sockfd, buf, len, flags) taosSendRandomFail(sockfd, buf, len, flags)
|
||||||
|
#define taosSendto(sockfd, buf, len, flags, dest_addr, addrlen) taosSendToRandomFail(sockfd, buf, len, flags, dest_addr, addrlen)
|
||||||
|
#define taosReadSocket(fd, buf, len) taosReadSocketRandomFail(fd, buf, len)
|
||||||
|
#define taosWriteSocket(fd, buf, len) taosWriteSocketRandomFail(fd, buf, len)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef TAOS_MEM_CHECK
|
||||||
|
void * taos_malloc(size_t size, const char *file, uint32_t line);
|
||||||
|
void * taos_calloc(size_t num, size_t size, const char *file, uint32_t line);
|
||||||
|
void * taos_realloc(void *ptr, size_t size, const char *file, uint32_t line);
|
||||||
|
void taos_free(void *ptr, const char *file, uint32_t line);
|
||||||
|
char * taos_strdup(const char *str, const char *file, uint32_t line);
|
||||||
|
char * taos_strndup(const char *str, size_t size, const char *file, uint32_t line);
|
||||||
|
ssize_t taos_getline(char **lineptr, size_t *n, FILE *stream, const char *file, uint32_t line);
|
||||||
|
#define malloc(size) taos_malloc(size, __FILE__, __LINE__)
|
||||||
|
#define calloc(num, size) taos_calloc(num, size, __FILE__, __LINE__)
|
||||||
|
#define realloc(ptr, size) taos_realloc(ptr, size, __FILE__, __LINE__)
|
||||||
|
#define free(ptr) taos_free(ptr, __FILE__, __LINE__)
|
||||||
|
#define strdup(str) taos_strdup(str, __FILE__, __LINE__)
|
||||||
|
#define strndup(str, size) taos_strndup(str, size, __FILE__, __LINE__)
|
||||||
|
#define getline(lineptr, n, stream) taos_getline(lineptr, n, stream, __FILE__, __LINE__)
|
||||||
|
#endif // TAOS_MEM_CHECK
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,54 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef TDENGINE_PLATFORM_WINDOWS32_H
|
||||||
|
#define TDENGINE_PLATFORM_WINDOWS32_H
|
||||||
|
|
||||||
|
#include <assert.h>
|
||||||
|
#include <ctype.h>
|
||||||
|
#include <direct.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <float.h>
|
||||||
|
#include <locale.h>
|
||||||
|
#include <intrin.h>
|
||||||
|
#include <io.h>
|
||||||
|
#include <math.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <semaphore.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <time.h>
|
||||||
|
#include <inttypes.h>
|
||||||
|
#include "winsock2.h"
|
||||||
|
#include <WS2tcpip.h>
|
||||||
|
#include <winbase.h>
|
||||||
|
#include <Winsock2.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#endif
|
|
@ -48,6 +48,8 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#define TAOS_OS_FUNC_WCHAR
|
||||||
|
|
||||||
// for function open in stat.h
|
// for function open in stat.h
|
||||||
#define S_IRWXU _S_IREAD
|
#define S_IRWXU _S_IREAD
|
||||||
#define S_IRWXG _S_IWRITE
|
#define S_IRWXG _S_IWRITE
|
||||||
|
@ -78,10 +80,10 @@ extern "C" {
|
||||||
#define wcsncasecmp _wcsnicmp
|
#define wcsncasecmp _wcsnicmp
|
||||||
#define strtok_r strtok_s
|
#define strtok_r strtok_s
|
||||||
#ifdef _TD_GO_DLL_
|
#ifdef _TD_GO_DLL_
|
||||||
int64_t str2int64(char *str);
|
int64_t tsosStr2int64(char *str);
|
||||||
uint64_t htonll(uint64_t val);
|
uint64_t htonll(uint64_t val);
|
||||||
#else
|
#else
|
||||||
#define str2int64 _atoi64
|
#define tsosStr2int64 _atoi64
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define snprintf _snprintf
|
#define snprintf _snprintf
|
||||||
|
@ -359,7 +361,6 @@ int taosSetNonblocking(int sock, int on);
|
||||||
|
|
||||||
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen);
|
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen);
|
||||||
|
|
||||||
char *taosCharsetReplace(char *charsetstr);
|
|
||||||
|
|
||||||
void taosPrintOsInfo();
|
void taosPrintOsInfo();
|
||||||
|
|
|
@ -1,294 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef TDENGINE_PLATFORM_LINUX_H
|
|
||||||
#define TDENGINE_PLATFORM_LINUX_H
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C" {
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
|
|
||||||
#include <argp.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <assert.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <dirent.h>
|
|
||||||
#include <endian.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <float.h>
|
|
||||||
#include <ifaddrs.h>
|
|
||||||
#include <libgen.h>
|
|
||||||
#include <limits.h>
|
|
||||||
#include <locale.h>
|
|
||||||
#include <math.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <netinet/in.h>
|
|
||||||
#include <netinet/ip.h>
|
|
||||||
#include <netinet/tcp.h>
|
|
||||||
#include <netinet/udp.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
#include <pwd.h>
|
|
||||||
#include <regex.h>
|
|
||||||
#include <semaphore.h>
|
|
||||||
#include <signal.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <stdbool.h>
|
|
||||||
#include <stddef.h>
|
|
||||||
#include <stdint.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <sys/epoll.h>
|
|
||||||
#include <sys/eventfd.h>
|
|
||||||
#include <sys/file.h>
|
|
||||||
#include <sys/ioctl.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/sendfile.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/syscall.h>
|
|
||||||
#include <sys/statvfs.h>
|
|
||||||
#include <sys/time.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/uio.h>
|
|
||||||
#include <sys/un.h>
|
|
||||||
#include <syslog.h>
|
|
||||||
#include <termios.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <wchar.h>
|
|
||||||
#include <wordexp.h>
|
|
||||||
#include <wctype.h>
|
|
||||||
#include <inttypes.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
#include <sys/utsname.h>
|
|
||||||
#include <sys/resource.h>
|
|
||||||
#include <error.h>
|
|
||||||
|
|
||||||
#define taosCloseSocket(x) \
|
|
||||||
{ \
|
|
||||||
if (FD_VALID(x)) { \
|
|
||||||
close(x); \
|
|
||||||
x = FD_INITIALIZER; \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
|
||||||
|
|
||||||
ssize_t taos_send_random_fail(int sockfd, const void *buf, size_t len, int flags);
|
|
||||||
|
|
||||||
ssize_t taos_sendto_random_fail(int sockfd, const void *buf, size_t len, int flags,
|
|
||||||
const struct sockaddr *dest_addr, socklen_t addrlen);
|
|
||||||
ssize_t taos_read_random_fail(int fd, void *buf, size_t count);
|
|
||||||
ssize_t taos_write_random_fail(int fd, const void *buf, size_t count);
|
|
||||||
|
|
||||||
#define send(sockfd, buf, len, flags) taos_send_random_fail(sockfd, buf, len, flags)
|
|
||||||
#define sendto(sockfd, buf, len, flags, dest_addr, addrlen) \
|
|
||||||
taos_sendto_random_fail(sockfd, buf, len, flags, dest_addr, addrlen)
|
|
||||||
#define taosWriteSocket(fd, buf, len) taos_write_random_fail(fd, buf, len)
|
|
||||||
#define taosReadSocket(fd, buf, len) taos_read_random_fail(fd, buf, len)
|
|
||||||
|
|
||||||
#else
|
|
||||||
|
|
||||||
#define taosWriteSocket(fd, buf, len) write(fd, buf, len)
|
|
||||||
#define taosReadSocket(fd, buf, len) read(fd, buf, len)
|
|
||||||
|
|
||||||
#endif /* TAOS_RANDOM_NETWORK_FAIL */
|
|
||||||
|
|
||||||
#define atomic_load_8(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_load_16(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_load_32(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_load_64(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_load_ptr(ptr) __atomic_load_n((ptr), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_store_8(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_store_16(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_store_32(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_store_64(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_store_ptr(ptr, val) __atomic_store_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_exchange_8(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_exchange_16(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_exchange_32(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_exchange_64(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_exchange_ptr(ptr, val) __atomic_exchange_n((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_val_compare_exchange_8 __sync_val_compare_and_swap
|
|
||||||
#define atomic_val_compare_exchange_16 __sync_val_compare_and_swap
|
|
||||||
#define atomic_val_compare_exchange_32 __sync_val_compare_and_swap
|
|
||||||
#define atomic_val_compare_exchange_64 __sync_val_compare_and_swap
|
|
||||||
#define atomic_val_compare_exchange_ptr __sync_val_compare_and_swap
|
|
||||||
|
|
||||||
#define atomic_add_fetch_8(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_add_fetch_16(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_add_fetch_32(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_add_fetch_64(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_add_fetch_ptr(ptr, val) __atomic_add_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_fetch_add_8(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_add_16(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_add_32(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_add_64(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_add_ptr(ptr, val) __atomic_fetch_add((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_sub_fetch_8(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_sub_fetch_16(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_sub_fetch_32(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_sub_fetch_64(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_sub_fetch_ptr(ptr, val) __atomic_sub_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_fetch_sub_8(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_sub_16(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_sub_32(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_sub_64(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_sub_ptr(ptr, val) __atomic_fetch_sub((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_and_fetch_8(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_and_fetch_16(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_and_fetch_32(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_and_fetch_64(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_and_fetch_ptr(ptr, val) __atomic_and_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_fetch_and_8(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_and_16(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_and_32(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_and_64(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_and_ptr(ptr, val) __atomic_fetch_and((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_or_fetch_8(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_or_fetch_16(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_or_fetch_32(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_or_fetch_64(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_or_fetch_ptr(ptr, val) __atomic_or_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_fetch_or_8(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_or_16(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_or_32(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_or_64(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_or_ptr(ptr, val) __atomic_fetch_or((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_xor_fetch_8(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_xor_fetch_16(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_xor_fetch_32(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_xor_fetch_64(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_xor_fetch_ptr(ptr, val) __atomic_xor_fetch((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define atomic_fetch_xor_8(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_xor_16(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_xor_32(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_xor_64(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
#define atomic_fetch_xor_ptr(ptr, val) __atomic_fetch_xor((ptr), (val), __ATOMIC_SEQ_CST)
|
|
||||||
|
|
||||||
#define SWAP(a, b, c) \
|
|
||||||
do { \
|
|
||||||
typeof(a) __tmp = (a); \
|
|
||||||
(a) = (b); \
|
|
||||||
(b) = __tmp; \
|
|
||||||
} while (0)
|
|
||||||
|
|
||||||
#define MAX(a, b) \
|
|
||||||
({ \
|
|
||||||
typeof(a) __a = (a); \
|
|
||||||
typeof(b) __b = (b); \
|
|
||||||
(__a > __b) ? __a : __b; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define MIN(a, b) \
|
|
||||||
({ \
|
|
||||||
typeof(a) __a = (a); \
|
|
||||||
typeof(b) __b = (b); \
|
|
||||||
(__a < __b) ? __a : __b; \
|
|
||||||
})
|
|
||||||
|
|
||||||
#define MILLISECOND_PER_SECOND ((int64_t)1000L)
|
|
||||||
|
|
||||||
#define tsem_t sem_t
|
|
||||||
#define tsem_init sem_init
|
|
||||||
#define tsem_wait sem_wait
|
|
||||||
#define tsem_post sem_post
|
|
||||||
#define tsem_destroy sem_destroy
|
|
||||||
|
|
||||||
void osInit();
|
|
||||||
|
|
||||||
ssize_t tsendfile(int dfd, int sfd, off_t *offset, size_t size);
|
|
||||||
|
|
||||||
ssize_t twrite(int fd, void *buf, size_t n);
|
|
||||||
|
|
||||||
ssize_t tread(int fd, void *buf, size_t count);
|
|
||||||
|
|
||||||
bool taosCheckPthreadValid(pthread_t thread);
|
|
||||||
|
|
||||||
void taosResetPthread(pthread_t *thread);
|
|
||||||
|
|
||||||
int64_t taosGetPthreadId();
|
|
||||||
|
|
||||||
int taosSetNonblocking(int sock, int on);
|
|
||||||
|
|
||||||
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen);
|
|
||||||
|
|
||||||
void taosPrintOsInfo();
|
|
||||||
|
|
||||||
char *taosCharsetReplace(char *charsetstr);
|
|
||||||
|
|
||||||
void taosGetSystemInfo();
|
|
||||||
|
|
||||||
void taosKillSystem();
|
|
||||||
|
|
||||||
bool taosSkipSocketCheck();
|
|
||||||
|
|
||||||
int64_t str2int64(char *str);
|
|
||||||
|
|
||||||
void taosSetCoreDump();
|
|
||||||
|
|
||||||
void taosBlockSIGPIPE();
|
|
||||||
|
|
||||||
int tSystem(const char * cmd) ;
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef _ALPINE
|
|
||||||
typedef int(*__compar_fn_t)(const void *, const void *);
|
|
||||||
void error (int, int, const char *);
|
|
||||||
#ifndef PTHREAD_MUTEX_RECURSIVE_NP
|
|
||||||
#define PTHREAD_MUTEX_RECURSIVE_NP PTHREAD_MUTEX_RECURSIVE
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef _TD_ARM_32_
|
|
||||||
#define BUILDIN_CLZL(val) __builtin_clzl(val)
|
|
||||||
#define BUILDIN_CTZL(val) __builtin_ctzl(val)
|
|
||||||
#else
|
|
||||||
#define BUILDIN_CLZL(val) __builtin_clzll(val)
|
|
||||||
#define BUILDIN_CTZL(val) __builtin_ctzll(val)
|
|
||||||
#endif
|
|
||||||
#define BUILDIN_CLZ(val) __builtin_clz(val)
|
|
||||||
#define BUILDIN_CTZ(val) __builtin_ctz(val)
|
|
||||||
|
|
||||||
#undef threadlocal
|
|
||||||
#ifdef _ISOC11_SOURCE
|
|
||||||
#define threadlocal _Thread_local
|
|
||||||
#elif defined(__APPLE__)
|
|
||||||
#define threadlocal
|
|
||||||
#elif defined(__GNUC__) && !defined(threadlocal)
|
|
||||||
#define threadlocal __thread
|
|
||||||
#else
|
|
||||||
#define threadlocal
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,318 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
|
||||||
*
|
|
||||||
* This program is free software: you can use, redistribute, and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3
|
|
||||||
* or later ("AGPL"), as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
|
||||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
||||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
|
||||||
#include "os.h"
|
|
||||||
#include "taosdef.h"
|
|
||||||
#include "tglobal.h"
|
|
||||||
#include "ttimer.h"
|
|
||||||
#include "tulog.h"
|
|
||||||
#include "tutil.h"
|
|
||||||
|
|
||||||
int64_t str2int64(char *str) {
|
|
||||||
char *endptr = NULL;
|
|
||||||
return strtoll(str, &endptr, 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
to make taosMsleep work,
|
|
||||||
signal SIGALRM shall be blocked in the calling thread,
|
|
||||||
|
|
||||||
sigset_t set;
|
|
||||||
sigemptyset(&set);
|
|
||||||
sigaddset(&set, SIGALRM);
|
|
||||||
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
|
||||||
*/
|
|
||||||
void taosMsleep(int mseconds) {
|
|
||||||
struct timeval timeout;
|
|
||||||
int seconds, useconds;
|
|
||||||
|
|
||||||
seconds = mseconds / 1000;
|
|
||||||
useconds = (mseconds % 1000) * 1000;
|
|
||||||
timeout.tv_sec = seconds;
|
|
||||||
timeout.tv_usec = useconds;
|
|
||||||
|
|
||||||
/* sigset_t set; */
|
|
||||||
/* sigemptyset(&set); */
|
|
||||||
/* sigaddset(&set, SIGALRM); */
|
|
||||||
/* pthread_sigmask(SIG_BLOCK, &set, NULL); */
|
|
||||||
|
|
||||||
select(0, NULL, NULL, NULL, &timeout);
|
|
||||||
|
|
||||||
/* pthread_sigmask(SIG_UNBLOCK, &set, NULL); */
|
|
||||||
}
|
|
||||||
|
|
||||||
bool taosCheckPthreadValid(pthread_t thread) { return thread != 0; }
|
|
||||||
|
|
||||||
int64_t taosGetPthreadId() { return (int64_t)pthread_self(); }
|
|
||||||
|
|
||||||
int taosSetNonblocking(int sock, int on) {
|
|
||||||
int flags = 0;
|
|
||||||
if ((flags = fcntl(sock, F_GETFL, 0)) < 0) {
|
|
||||||
uError("fcntl(F_GETFL) error: %d (%s)\n", errno, strerror(errno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (on)
|
|
||||||
flags |= O_NONBLOCK;
|
|
||||||
else
|
|
||||||
flags &= ~O_NONBLOCK;
|
|
||||||
|
|
||||||
if ((flags = fcntl(sock, F_SETFL, flags)) < 0) {
|
|
||||||
uError("fcntl(F_SETFL) error: %d (%s)\n", errno, strerror(errno));
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) {
|
|
||||||
return setsockopt(socketfd, level, optname, optval, (socklen_t)optlen);
|
|
||||||
}
|
|
||||||
static void taosDeleteTimer(void *tharg) {
|
|
||||||
timer_t *pTimer = tharg;
|
|
||||||
timer_delete(*pTimer);
|
|
||||||
}
|
|
||||||
|
|
||||||
static pthread_t timerThread;
|
|
||||||
static timer_t timerId;
|
|
||||||
static volatile bool stopTimer = false;
|
|
||||||
|
|
||||||
void *taosProcessAlarmSignal(void *tharg) {
|
|
||||||
// Block the signal
|
|
||||||
sigset_t sigset;
|
|
||||||
sigemptyset(&sigset);
|
|
||||||
sigaddset(&sigset, SIGALRM);
|
|
||||||
sigprocmask(SIG_BLOCK, &sigset, NULL);
|
|
||||||
void (*callback)(int) = tharg;
|
|
||||||
|
|
||||||
struct sigevent sevent = {{0}};
|
|
||||||
|
|
||||||
#ifdef _ALPINE
|
|
||||||
sevent.sigev_notify = SIGEV_THREAD;
|
|
||||||
sevent.sigev_value.sival_int = syscall(__NR_gettid);
|
|
||||||
#else
|
|
||||||
sevent.sigev_notify = SIGEV_THREAD_ID;
|
|
||||||
sevent._sigev_un._tid = syscall(__NR_gettid);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
sevent.sigev_signo = SIGALRM;
|
|
||||||
|
|
||||||
if (timer_create(CLOCK_REALTIME, &sevent, &timerId) == -1) {
|
|
||||||
uError("Failed to create timer");
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_cleanup_push(taosDeleteTimer, &timerId);
|
|
||||||
|
|
||||||
struct itimerspec ts;
|
|
||||||
ts.it_value.tv_sec = 0;
|
|
||||||
ts.it_value.tv_nsec = 1000000 * MSECONDS_PER_TICK;
|
|
||||||
ts.it_interval.tv_sec = 0;
|
|
||||||
ts.it_interval.tv_nsec = 1000000 * MSECONDS_PER_TICK;
|
|
||||||
|
|
||||||
if (timer_settime(timerId, 0, &ts, NULL)) {
|
|
||||||
uError("Failed to init timer");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int signo;
|
|
||||||
while (!stopTimer) {
|
|
||||||
if (sigwait(&sigset, &signo)) {
|
|
||||||
uError("Failed to wait signal: number %d", signo);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
/* printf("Signal handling: number %d ......\n", signo); */
|
|
||||||
|
|
||||||
callback(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_cleanup_pop(1);
|
|
||||||
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int taosInitTimer(void (*callback)(int), int ms) {
|
|
||||||
pthread_attr_t tattr;
|
|
||||||
pthread_attr_init(&tattr);
|
|
||||||
int code = pthread_create(&timerThread, &tattr, taosProcessAlarmSignal, callback);
|
|
||||||
pthread_attr_destroy(&tattr);
|
|
||||||
if (code != 0) {
|
|
||||||
uError("failed to create timer thread");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void taosUninitTimer() {
|
|
||||||
stopTimer = true;
|
|
||||||
pthread_join(timerThread, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t tread(int fd, void *buf, size_t count) {
|
|
||||||
size_t leftbytes = count;
|
|
||||||
ssize_t readbytes;
|
|
||||||
char * tbuf = (char *)buf;
|
|
||||||
|
|
||||||
while (leftbytes > 0) {
|
|
||||||
readbytes = read(fd, (void *)tbuf, leftbytes);
|
|
||||||
if (readbytes < 0) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
} else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else if (readbytes == 0) {
|
|
||||||
return (ssize_t)(count - leftbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
leftbytes -= readbytes;
|
|
||||||
tbuf += readbytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (ssize_t)count;
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t tsendfile(int dfd, int sfd, off_t *offset, size_t size) {
|
|
||||||
size_t leftbytes = size;
|
|
||||||
ssize_t sentbytes;
|
|
||||||
|
|
||||||
while (leftbytes > 0) {
|
|
||||||
/*
|
|
||||||
* TODO : Think to check if file is larger than 1GB
|
|
||||||
*/
|
|
||||||
//if (leftbytes > 1000000000) leftbytes = 1000000000;
|
|
||||||
sentbytes = sendfile(dfd, sfd, offset, leftbytes);
|
|
||||||
if (sentbytes == -1) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
} else if (sentbytes == 0) {
|
|
||||||
return (ssize_t)(size - leftbytes);
|
|
||||||
}
|
|
||||||
|
|
||||||
leftbytes -= sentbytes;
|
|
||||||
}
|
|
||||||
|
|
||||||
return size;
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t twrite(int fd, void *buf, size_t n) {
|
|
||||||
size_t nleft = n;
|
|
||||||
ssize_t nwritten = 0;
|
|
||||||
char *tbuf = (char *)buf;
|
|
||||||
|
|
||||||
while (nleft > 0) {
|
|
||||||
nwritten = write(fd, (void *)tbuf, nleft);
|
|
||||||
if (nwritten < 0) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
nleft -= nwritten;
|
|
||||||
tbuf += nwritten;
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
void taosBlockSIGPIPE() {
|
|
||||||
sigset_t signal_mask;
|
|
||||||
sigemptyset(&signal_mask);
|
|
||||||
sigaddset(&signal_mask, SIGPIPE);
|
|
||||||
int rc = pthread_sigmask(SIG_BLOCK, &signal_mask, NULL);
|
|
||||||
if (rc != 0) {
|
|
||||||
uError("failed to block SIGPIPE");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int tSystem(const char * cmd)
|
|
||||||
{
|
|
||||||
FILE * fp;
|
|
||||||
int res;
|
|
||||||
char buf[1024];
|
|
||||||
if (cmd == NULL) {
|
|
||||||
uError("tSystem cmd is NULL!\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((fp = popen(cmd, "r") ) == NULL) {
|
|
||||||
uError("popen cmd:%s error: %s/n", cmd, strerror(errno));
|
|
||||||
return -1;
|
|
||||||
} else {
|
|
||||||
while(fgets(buf, sizeof(buf), fp)) {
|
|
||||||
uDebug("popen result:%s", buf);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((res = pclose(fp)) == -1) {
|
|
||||||
uError("close popen file pointer fp error!\n");
|
|
||||||
} else {
|
|
||||||
uDebug("popen res is :%d\n", res);
|
|
||||||
}
|
|
||||||
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
|
||||||
|
|
||||||
#define RANDOM_NETWORK_FAIL_FACTOR 20
|
|
||||||
|
|
||||||
ssize_t taos_send_random_fail(int sockfd, const void *buf, size_t len, int flags)
|
|
||||||
{
|
|
||||||
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
|
||||||
errno = ECONNRESET;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return send(sockfd, buf, len, flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t taos_sendto_random_fail(int sockfd, const void *buf, size_t len, int flags,
|
|
||||||
const struct sockaddr *dest_addr, socklen_t addrlen)
|
|
||||||
{
|
|
||||||
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
|
||||||
errno = ECONNRESET;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return sendto(sockfd, buf, len, flags, dest_addr, addrlen);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t taos_read_random_fail(int fd, void *buf, size_t count)
|
|
||||||
{
|
|
||||||
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
|
||||||
errno = ECONNRESET;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return read(fd, buf, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
ssize_t taos_write_random_fail(int fd, const void *buf, size_t count)
|
|
||||||
{
|
|
||||||
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
|
||||||
errno = EINTR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return write(fd, buf, count);
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* TAOS_RANDOM_NETWORK_FAIL */
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
PROJECT(TDengine)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
|
|
||||||
|
ADD_LIBRARY(os ${SRC})
|
||||||
|
TARGET_LINK_LIBRARIES(os m rt)
|
||||||
|
|
|
@ -1,16 +1,13 @@
|
||||||
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
PROJECT(TDengine)
|
PROJECT(TDengine)
|
||||||
|
|
||||||
IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
IF (TD_DARWIN_64)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
|
|
||||||
ADD_LIBRARY(os ${SRC})
|
ADD_LIBRARY(os ${SRC})
|
||||||
TARGET_LINK_LIBRARIES(os m rt)
|
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
SET_SOURCE_FILES_PROPERTIES(src/linuxSysPara.c PROPERTIES COMPILE_FLAGS -w)
|
|
|
@ -15,12 +15,15 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tglobal.h"
|
#include "os.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "tutil.h"
|
#include "tglobal.h"
|
||||||
|
#include "tconfig.h"
|
||||||
|
#include "ttimer.h"
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
int64_t str2int64(char *str) {
|
int64_t tsosStr2int64(char *str) {
|
||||||
char *endptr = NULL;
|
char *endptr = NULL;
|
||||||
return strtoll(str, &endptr, 10);
|
return strtoll(str, &endptr, 10);
|
||||||
}
|
}
|
||||||
|
@ -159,12 +162,14 @@ int taosInitTimer(void (*callback)(int), int ms) {
|
||||||
tv.it_interval.tv_usec = 1000 * ms; // resolution is in msecond
|
tv.it_interval.tv_usec = 1000 * ms; // resolution is in msecond
|
||||||
tv.it_value = tv.it_interval;
|
tv.it_value = tv.it_interval;
|
||||||
|
|
||||||
return setitimer(ITIMER_REAL, &tv, NULL);
|
setitimer(ITIMER_REAL, &tv, NULL);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosUninitTimer() {
|
void taosUninitTimer() {
|
||||||
struct itimerval tv = { 0 };
|
struct itimerval tv = { 0 };
|
||||||
return setitimer(ITIMER_REAL, &tv, NULL);
|
setitimer(ITIMER_REAL, &tv, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosGetSystemTimezone() {
|
void taosGetSystemTimezone() {
|
||||||
|
@ -207,7 +212,7 @@ void taosGetSystemLocale() {
|
||||||
void taosPrintOsInfo() {}
|
void taosPrintOsInfo() {}
|
||||||
|
|
||||||
void taosKillSystem() {
|
void taosKillSystem() {
|
||||||
tError("function taosKillSystem, exit!");
|
uError("function taosKillSystem, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -221,95 +226,75 @@ void taosGetSystemInfo() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosInitTcpClient(char *ip, uint16_t port, char *flabel, int num, void *fp, void *shandle) {
|
void *taosInitTcpClient(char *ip, uint16_t port, char *flabel, int num, void *fp, void *shandle) {
|
||||||
tError("function taosInitTcpClient is not implemented in darwin system, exit!");
|
uError("function taosInitTcpClient is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosCloseTcpClientConnection(void *chandle) {
|
void taosCloseTcpClientConnection(void *chandle) {
|
||||||
tError("function taosCloseTcpClientConnection is not implemented in darwin system, exit!");
|
uError("function taosCloseTcpClientConnection is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosOpenTcpClientConnection(void *shandle, void *thandle, char *ip, uint16_t port) {
|
void *taosOpenTcpClientConnection(void *shandle, void *thandle, char *ip, uint16_t port) {
|
||||||
tError("function taosOpenTcpClientConnection is not implemented in darwin system, exit!");
|
uError("function taosOpenTcpClientConnection is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int taosSendTcpClientData(unsigned int ip, uint16_t port, char *data, int len, void *chandle) {
|
int taosSendTcpClientData(unsigned int ip, uint16_t port, char *data, int len, void *chandle) {
|
||||||
tError("function taosSendTcpClientData is not implemented in darwin system, exit!");
|
uError("function taosSendTcpClientData is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosCleanUpTcpClient(void *chandle) {
|
void taosCleanUpTcpClient(void *chandle) {
|
||||||
tError("function taosCleanUpTcpClient is not implemented in darwin system, exit!");
|
uError("function taosCleanUpTcpClient is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosCloseTcpServerConnection(void *chandle) {
|
void taosCloseTcpServerConnection(void *chandle) {
|
||||||
tError("function taosCloseTcpServerConnection is not implemented in darwin system, exit!");
|
uError("function taosCloseTcpServerConnection is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosCleanUpTcpServer(void *handle) {
|
void taosCleanUpTcpServer(void *handle) {
|
||||||
tError("function taosCleanUpTcpServer is not implemented in darwin system, exit!");
|
uError("function taosCleanUpTcpServer is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *taosInitTcpServer(char *ip, uint16_t port, char *label, int numOfThreads, void *fp, void *shandle) {
|
void *taosInitTcpServer(char *ip, uint16_t port, char *label, int numOfThreads, void *fp, void *shandle) {
|
||||||
tError("function taosInitTcpServer is not implemented in darwin system, exit!");
|
uError("function taosInitTcpServer is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int taosSendTcpServerData(unsigned int ip, uint16_t port, char *data, int len, void *chandle) {
|
int taosSendTcpServerData(unsigned int ip, uint16_t port, char *data, int len, void *chandle) {
|
||||||
tError("function taosSendTcpServerData is not implemented in darwin system, exit!");
|
uError("function taosSendTcpServerData is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosFreeMsgHdr(void *hdr) {
|
void taosFreeMsgHdr(void *hdr) {
|
||||||
tError("function taosFreeMsgHdr is not implemented in darwin system, exit!");
|
uError("function taosFreeMsgHdr is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int taosMsgHdrSize(void *hdr) {
|
int taosMsgHdrSize(void *hdr) {
|
||||||
tError("function taosMsgHdrSize is not implemented in darwin system, exit!");
|
uError("function taosMsgHdrSize is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosSendMsgHdr(void *hdr, int fd) {
|
void taosSendMsgHdr(void *hdr, int fd) {
|
||||||
tError("function taosSendMsgHdr is not implemented in darwin system, exit!");
|
uError("function taosSendMsgHdr is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosInitMsgHdr(void **hdr, void *dest, int maxPkts) {
|
void taosInitMsgHdr(void **hdr, void *dest, int maxPkts) {
|
||||||
tError("function taosInitMsgHdr is not implemented in darwin system, exit!");
|
uError("function taosInitMsgHdr is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosSetMsgHdrData(void *hdr, char *data, int dataLen) {
|
void taosSetMsgHdrData(void *hdr, char *data, int dataLen) {
|
||||||
tError("function taosSetMsgHdrData is not implemented in darwin system, exit!");
|
uError("function taosSetMsgHdrData is not implemented in darwin system, exit!");
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t twrite(int fd, void *buf, size_t n) {
|
|
||||||
size_t nleft = n;
|
|
||||||
ssize_t nwritten = 0;
|
|
||||||
char *tbuf = (char *)buf;
|
|
||||||
|
|
||||||
while (nleft > 0) {
|
|
||||||
nwritten = write(fd, (void *)tbuf, nleft);
|
|
||||||
if (nwritten < 0) {
|
|
||||||
if (errno == EINTR) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
nleft -= nwritten;
|
|
||||||
tbuf += nwritten;
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool taosSkipSocketCheck() {
|
bool taosSkipSocketCheck() {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
PROJECT(TDengine)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
|
INCLUDE_DIRECTORIES(.)
|
||||||
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(osSysinfo.c PROPERTIES COMPILE_FLAGS -w)
|
||||||
|
SET_SOURCE_FILES_PROPERTIES(osCoredump.c PROPERTIES COMPILE_FLAGS -w)
|
||||||
|
|
||||||
|
ADD_LIBRARY(osdetail ${SRC})
|
||||||
|
TARGET_LINK_LIBRARIES(osdetail os)
|
|
@ -0,0 +1,97 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "tconfig.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "tulog.h"
|
||||||
|
#include "tsystem.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_CORE
|
||||||
|
|
||||||
|
int _sysctl(struct __sysctl_args *args );
|
||||||
|
|
||||||
|
void taosSetCoreDump() {
|
||||||
|
if (0 == tsEnableCoreFile) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 1. set ulimit -c unlimited
|
||||||
|
struct rlimit rlim;
|
||||||
|
struct rlimit rlim_new;
|
||||||
|
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
||||||
|
uInfo("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
||||||
|
rlim_new.rlim_cur = RLIM_INFINITY;
|
||||||
|
rlim_new.rlim_max = RLIM_INFINITY;
|
||||||
|
if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) {
|
||||||
|
uInfo("set unlimited fail, error: %s", strerror(errno));
|
||||||
|
rlim_new.rlim_cur = rlim.rlim_max;
|
||||||
|
rlim_new.rlim_max = rlim.rlim_max;
|
||||||
|
(void)setrlimit(RLIMIT_CORE, &rlim_new);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
||||||
|
uInfo("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifndef _TD_ARM_
|
||||||
|
// 2. set the path for saving core file
|
||||||
|
struct __sysctl_args args;
|
||||||
|
int old_usespid = 0;
|
||||||
|
size_t old_len = 0;
|
||||||
|
int new_usespid = 1;
|
||||||
|
size_t new_len = sizeof(new_usespid);
|
||||||
|
|
||||||
|
int name[] = {CTL_KERN, KERN_CORE_USES_PID};
|
||||||
|
|
||||||
|
memset(&args, 0, sizeof(struct __sysctl_args));
|
||||||
|
args.name = name;
|
||||||
|
args.nlen = sizeof(name)/sizeof(name[0]);
|
||||||
|
args.oldval = &old_usespid;
|
||||||
|
args.oldlenp = &old_len;
|
||||||
|
args.newval = &new_usespid;
|
||||||
|
args.newlen = new_len;
|
||||||
|
|
||||||
|
old_len = sizeof(old_usespid);
|
||||||
|
|
||||||
|
if (syscall(SYS__sysctl, &args) == -1) {
|
||||||
|
uInfo("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
uInfo("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
||||||
|
|
||||||
|
|
||||||
|
old_usespid = 0;
|
||||||
|
old_len = 0;
|
||||||
|
memset(&args, 0, sizeof(struct __sysctl_args));
|
||||||
|
args.name = name;
|
||||||
|
args.nlen = sizeof(name)/sizeof(name[0]);
|
||||||
|
args.oldval = &old_usespid;
|
||||||
|
args.oldlenp = &old_len;
|
||||||
|
|
||||||
|
old_len = sizeof(old_usespid);
|
||||||
|
|
||||||
|
if (syscall(SYS__sysctl, &args) == -1) {
|
||||||
|
uInfo("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
|
||||||
|
}
|
||||||
|
|
||||||
|
uInfo("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "tulog.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_DIR
|
||||||
|
|
||||||
|
void taosRemoveDir(char *rootDir) {
|
||||||
|
DIR *dir = opendir(rootDir);
|
||||||
|
if (dir == NULL) return;
|
||||||
|
|
||||||
|
struct dirent *de = NULL;
|
||||||
|
while ((de = readdir(dir)) != NULL) {
|
||||||
|
if (strcmp(de->d_name, ".") == 0 || strcmp(de->d_name, "..") == 0) continue;
|
||||||
|
|
||||||
|
char filename[1024];
|
||||||
|
snprintf(filename, 1023, "%s/%s", rootDir, de->d_name);
|
||||||
|
if (de->d_type & DT_DIR) {
|
||||||
|
taosRemoveDir(filename);
|
||||||
|
} else {
|
||||||
|
(void)remove(filename);
|
||||||
|
uInfo("file:%s is removed", filename);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
closedir(dir);
|
||||||
|
rmdir(rootDir);
|
||||||
|
|
||||||
|
uInfo("dir:%s is removed", rootDir);
|
||||||
|
}
|
||||||
|
|
||||||
|
int taosMkDir(const char *path, mode_t mode) {
|
||||||
|
int code = mkdir(path, 0755);
|
||||||
|
if (code < 0 && errno == EEXIST) code = 0;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void taosMvDir(char* destDir, char *srcDir) {
|
||||||
|
if (0 == tsEnableVnodeBak) {
|
||||||
|
uInfo("vnode backup not enabled");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
char shellCmd[1024+1] = {0};
|
||||||
|
|
||||||
|
//(void)snprintf(shellCmd, 1024, "cp -rf %s %s", srcDir, destDir);
|
||||||
|
(void)snprintf(shellCmd, 1024, "mv %s %s", srcDir, destDir);
|
||||||
|
tSystem(shellCmd);
|
||||||
|
uInfo("shell cmd:%s is executed", shellCmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,31 +13,62 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#define _DEFAULT_SOURCE
|
||||||
#include <stdlib.h>
|
|
||||||
#include <error.h>
|
|
||||||
#include <errno.h>
|
|
||||||
#include <stdarg.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <fcntl.h>
|
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
|
||||||
|
#define RANDOM_NETWORK_FAIL_FACTOR 20
|
||||||
|
|
||||||
|
#ifdef TAOS_RANDOM_NETWORK_FAIL
|
||||||
|
|
||||||
|
ssize_t taosSendRandomFail(int sockfd, const void *buf, size_t len, int flags) {
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = ECONNRESET;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return send(sockfd, buf, len, flags);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taosSendToRandomFail(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr,
|
||||||
|
socklen_t addrlen) {
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = ECONNRESET;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return sendto(sockfd, buf, len, flags, dest_addr, addrlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taosReadSocketRandomFail(int fd, void *buf, size_t count) {
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = ECONNRESET;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return read(fd, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taosWriteSocketRandomFail(int fd, const void *buf, size_t count) {
|
||||||
|
if (rand() % RANDOM_NETWORK_FAIL_FACTOR == 0) {
|
||||||
|
errno = EINTR;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return write(fd, buf, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif //TAOS_RANDOM_NETWORK_FAIL
|
||||||
|
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
#ifdef TAOS_RANDOM_FILE_FAIL
|
||||||
|
|
||||||
static int random_file_fail_factor = 20;
|
static int random_file_fail_factor = 20;
|
||||||
static FILE *fpRandomFileFailOutput = NULL;
|
static FILE *fpRandomFileFailOutput = NULL;
|
||||||
|
|
||||||
void taosSetRandomFileFailFactor(int factor)
|
void taosSetRandomFileFailFactor(int factor) {
|
||||||
{
|
|
||||||
random_file_fail_factor = factor;
|
random_file_fail_factor = factor;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void close_random_file_fail_output()
|
static void close_random_file_fail_output() {
|
||||||
{
|
|
||||||
if (fpRandomFileFailOutput != NULL) {
|
if (fpRandomFileFailOutput != NULL) {
|
||||||
if (fpRandomFileFailOutput != stdout) {
|
if (fpRandomFileFailOutput != stdout) {
|
||||||
fclose(fpRandomFileFailOutput);
|
fclose(fpRandomFileFailOutput);
|
||||||
|
@ -46,8 +77,7 @@ static void close_random_file_fail_output()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void random_file_fail_output_sig(int sig)
|
static void random_file_fail_output_sig(int sig) {
|
||||||
{
|
|
||||||
fprintf(fpRandomFileFailOutput, "signal %d received.\n", sig);
|
fprintf(fpRandomFileFailOutput, "signal %d received.\n", sig);
|
||||||
|
|
||||||
struct sigaction act = {0};
|
struct sigaction act = {0};
|
||||||
|
@ -58,8 +88,7 @@ static void random_file_fail_output_sig(int sig)
|
||||||
exit(EXIT_FAILURE);
|
exit(EXIT_FAILURE);
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosSetRandomFileFailOutput(const char *path)
|
void taosSetRandomFileFailOutput(const char *path) {
|
||||||
{
|
|
||||||
if (path == NULL) {
|
if (path == NULL) {
|
||||||
fpRandomFileFailOutput = stdout;
|
fpRandomFileFailOutput = stdout;
|
||||||
} else if ((fpRandomFileFailOutput = fopen(path, "w")) != NULL) {
|
} else if ((fpRandomFileFailOutput = fopen(path, "w")) != NULL) {
|
||||||
|
@ -75,43 +104,38 @@ void taosSetRandomFileFailOutput(const char *path)
|
||||||
sigaction(SIGSEGV, &act, NULL);
|
sigaction(SIGSEGV, &act, NULL);
|
||||||
sigaction(SIGILL, &act, NULL);
|
sigaction(SIGILL, &act, NULL);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
ssize_t taos_tread(int fd, void *buf, size_t count, const char *file, uint32_t line)
|
ssize_t taosReadFileRandomFail(int fd, void *buf, size_t count, const char *file, uint32_t line) {
|
||||||
{
|
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
|
||||||
if (random_file_fail_factor > 0) {
|
if (random_file_fail_factor > 0) {
|
||||||
if (rand() % random_file_fail_factor == 0) {
|
if (rand() % random_file_fail_factor == 0) {
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return tread(fd, buf, count);
|
return taosTReadImp(fd, buf, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
ssize_t taos_twrite(int fd, void *buf, size_t count, const char *file, uint32_t line)
|
ssize_t taosWriteFileRandomFail(int fd, void *buf, size_t count, const char *file, uint32_t line) {
|
||||||
{
|
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
|
||||||
if (random_file_fail_factor > 0) {
|
if (random_file_fail_factor > 0) {
|
||||||
if (rand() % random_file_fail_factor == 0) {
|
if (rand() % random_file_fail_factor == 0) {
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return twrite(fd, buf, count);
|
return taosTWriteImp(fd, buf, count);
|
||||||
}
|
}
|
||||||
|
|
||||||
off_t taos_lseek(int fd, off_t offset, int whence, const char *file, uint32_t line)
|
off_t taosLSeekRandomFail(int fd, off_t offset, int whence, const char *file, uint32_t line) {
|
||||||
{
|
|
||||||
#ifdef TAOS_RANDOM_FILE_FAIL
|
|
||||||
if (random_file_fail_factor > 0) {
|
if (random_file_fail_factor > 0) {
|
||||||
if (rand() % random_file_fail_factor == 0) {
|
if (rand() % random_file_fail_factor == 0) {
|
||||||
errno = EIO;
|
errno = EIO;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
return lseek(fd, offset, whence);
|
return lseek(fd, offset, whence);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif //TAOS_RANDOM_FILE_FAIL
|
|
@ -0,0 +1,68 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "ttime.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_FILE
|
||||||
|
|
||||||
|
void getTmpfilePath(const char *fileNamePrefix, char *dstPath) {
|
||||||
|
const char* tdengineTmpFileNamePrefix = "tdengine-";
|
||||||
|
|
||||||
|
char tmpPath[PATH_MAX];
|
||||||
|
char *tmpDir = "/tmp/";
|
||||||
|
|
||||||
|
strcpy(tmpPath, tmpDir);
|
||||||
|
strcat(tmpPath, tdengineTmpFileNamePrefix);
|
||||||
|
if (strlen(tmpPath) + strlen(fileNamePrefix) + strlen("-%d-%s") < PATH_MAX) {
|
||||||
|
strcat(tmpPath, fileNamePrefix);
|
||||||
|
strcat(tmpPath, "-%d-%s");
|
||||||
|
}
|
||||||
|
|
||||||
|
char rand[8] = {0};
|
||||||
|
taosRandStr(rand, tListLen(rand) - 1);
|
||||||
|
snprintf(dstPath, PATH_MAX, tmpPath, getpid(), rand);
|
||||||
|
}
|
||||||
|
|
||||||
|
// rename file name
|
||||||
|
int32_t taosFileRename(char *fullPath, char *suffix, char delimiter, char **dstPath) {
|
||||||
|
int32_t ts = taosGetTimestampSec();
|
||||||
|
|
||||||
|
char fname[PATH_MAX] = {0}; // max file name length must be less than 255
|
||||||
|
|
||||||
|
char *delimiterPos = strrchr(fullPath, delimiter);
|
||||||
|
if (delimiterPos == NULL) return -1;
|
||||||
|
|
||||||
|
int32_t fileNameLen = 0;
|
||||||
|
if (suffix)
|
||||||
|
fileNameLen = snprintf(fname, PATH_MAX, "%s.%d.%s", delimiterPos + 1, ts, suffix);
|
||||||
|
else
|
||||||
|
fileNameLen = snprintf(fname, PATH_MAX, "%s.%d", delimiterPos + 1, ts);
|
||||||
|
|
||||||
|
size_t len = (size_t)((delimiterPos - fullPath) + fileNameLen + 1);
|
||||||
|
if (*dstPath == NULL) {
|
||||||
|
*dstPath = calloc(1, len + 1);
|
||||||
|
if (*dstPath == NULL) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
strncpy(*dstPath, fullPath, (size_t)(delimiterPos - fullPath + 1));
|
||||||
|
strncat(*dstPath, fname, (size_t)fileNameLen);
|
||||||
|
(*dstPath)[len] = 0;
|
||||||
|
|
||||||
|
return rename(fullPath, *dstPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,88 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
ssize_t taosTReadImp(int fd, void *buf, size_t count) {
|
||||||
|
size_t leftbytes = count;
|
||||||
|
ssize_t readbytes;
|
||||||
|
char * tbuf = (char *)buf;
|
||||||
|
|
||||||
|
while (leftbytes > 0) {
|
||||||
|
readbytes = read(fd, (void *)tbuf, leftbytes);
|
||||||
|
if (readbytes < 0) {
|
||||||
|
if (errno == EINTR) {
|
||||||
|
continue;
|
||||||
|
} else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (readbytes == 0) {
|
||||||
|
return (ssize_t)(count - leftbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
leftbytes -= readbytes;
|
||||||
|
tbuf += readbytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (ssize_t)count;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taosTSendFileImp(int dfd, int sfd, off_t *offset, size_t size) {
|
||||||
|
size_t leftbytes = size;
|
||||||
|
ssize_t sentbytes;
|
||||||
|
|
||||||
|
while (leftbytes > 0) {
|
||||||
|
/*
|
||||||
|
* TODO : Think to check if file is larger than 1GB
|
||||||
|
*/
|
||||||
|
//if (leftbytes > 1000000000) leftbytes = 1000000000;
|
||||||
|
sentbytes = sendfile(dfd, sfd, offset, leftbytes);
|
||||||
|
if (sentbytes == -1) {
|
||||||
|
if (errno == EINTR) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
} else if (sentbytes == 0) {
|
||||||
|
return (ssize_t)(size - leftbytes);
|
||||||
|
}
|
||||||
|
|
||||||
|
leftbytes -= sentbytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
return size;
|
||||||
|
}
|
||||||
|
|
||||||
|
ssize_t taosTWriteImp(int fd, void *buf, size_t n) {
|
||||||
|
size_t nleft = n;
|
||||||
|
ssize_t nwritten = 0;
|
||||||
|
char *tbuf = (char *)buf;
|
||||||
|
|
||||||
|
while (nleft > 0) {
|
||||||
|
nwritten = write(fd, (void *)tbuf, nleft);
|
||||||
|
if (nwritten < 0) {
|
||||||
|
if (errno == EINTR) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
nleft -= nwritten;
|
||||||
|
tbuf += nwritten;
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
|
@ -0,0 +1,66 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_MALLOC
|
||||||
|
|
||||||
|
void *tmalloc(size_t size) {
|
||||||
|
if (size <= 0) return NULL;
|
||||||
|
|
||||||
|
void *ret = malloc(size + sizeof(size_t));
|
||||||
|
if (ret == NULL) return NULL;
|
||||||
|
|
||||||
|
*(size_t *)ret = size;
|
||||||
|
|
||||||
|
return (void *)((char *)ret + sizeof(size_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void *tcalloc(size_t nmemb, size_t size) {
|
||||||
|
size_t tsize = nmemb * size;
|
||||||
|
void * ret = tmalloc(tsize);
|
||||||
|
if (ret == NULL) return NULL;
|
||||||
|
|
||||||
|
tmemset(ret, 0);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t tsizeof(void *ptr) { return (ptr) ? (*(size_t *)((char *)ptr - sizeof(size_t))) : 0; }
|
||||||
|
|
||||||
|
void tmemset(void *ptr, int c) { memset(ptr, c, tsizeof(ptr)); }
|
||||||
|
|
||||||
|
void * trealloc(void *ptr, size_t size) {
|
||||||
|
if (ptr == NULL) return tmalloc(size);
|
||||||
|
|
||||||
|
if (size <= tsizeof(ptr)) return ptr;
|
||||||
|
|
||||||
|
void * tptr = (void *)((char *)ptr - sizeof(size_t));
|
||||||
|
size_t tsize = size + sizeof(size_t);
|
||||||
|
tptr = realloc(tptr, tsize);
|
||||||
|
if (tptr == NULL) return NULL;
|
||||||
|
|
||||||
|
*(size_t *)tptr = size;
|
||||||
|
|
||||||
|
return (void *)((char *)tptr + sizeof(size_t));
|
||||||
|
}
|
||||||
|
|
||||||
|
void tzfree(void *ptr) {
|
||||||
|
if (ptr) {
|
||||||
|
free((void *)((char *)ptr - sizeof(size_t)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -13,13 +13,10 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
|
|
||||||
#define TAOS_MEM_CHECK_IMPL
|
|
||||||
#include "tutil.h"
|
|
||||||
|
|
||||||
|
|
||||||
#ifdef TAOS_MEM_CHECK
|
#ifdef TAOS_MEM_CHECK
|
||||||
|
|
||||||
static int allocMode = TAOS_ALLOC_MODE_DEFAULT;
|
static int allocMode = TAOS_ALLOC_MODE_DEFAULT;
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_PTHREAD
|
||||||
|
|
||||||
|
bool taosCheckPthreadValid(pthread_t thread) { return thread != 0; }
|
||||||
|
int64_t taosGetPthreadId() { return (int64_t)pthread_self(); }
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,50 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_RAND
|
||||||
|
|
||||||
|
uint32_t taosRand(void) { return rand(); }
|
||||||
|
|
||||||
|
uint32_t trand(void) {
|
||||||
|
int fd;
|
||||||
|
int seed;
|
||||||
|
|
||||||
|
fd = open("/dev/urandom", 0);
|
||||||
|
if (fd < 0) {
|
||||||
|
seed = time(0);
|
||||||
|
} else {
|
||||||
|
int len = read(fd, &seed, sizeof(seed));
|
||||||
|
if (len < 0) {
|
||||||
|
seed = time(0);
|
||||||
|
}
|
||||||
|
close(fd);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (uint32_t)seed;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void taosRandStr(char* str, int32_t size) {
|
||||||
|
const char* set = "abcdefghijklmnopqrstuvwxyz0123456789-_.";
|
||||||
|
int32_t len = 39;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < size; ++i) {
|
||||||
|
str[i] = set[taosRand() % len];
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,56 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "tulog.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_SOCKET
|
||||||
|
|
||||||
|
int taosSetNonblocking(int sock, int on) {
|
||||||
|
int flags = 0;
|
||||||
|
if ((flags = fcntl(sock, F_GETFL, 0)) < 0) {
|
||||||
|
uError("fcntl(F_GETFL) error: %d (%s)\n", errno, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (on)
|
||||||
|
flags |= O_NONBLOCK;
|
||||||
|
else
|
||||||
|
flags &= ~O_NONBLOCK;
|
||||||
|
|
||||||
|
if ((flags = fcntl(sock, F_SETFL, flags)) < 0) {
|
||||||
|
uError("fcntl(F_SETFL) error: %d (%s)\n", errno, strerror(errno));
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int taosSetSockOpt(int socketfd, int level, int optname, void *optval, int optlen) {
|
||||||
|
return setsockopt(socketfd, level, optname, optval, (socklen_t)optlen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void taosBlockSIGPIPE() {
|
||||||
|
sigset_t signal_mask;
|
||||||
|
sigemptyset(&signal_mask);
|
||||||
|
sigaddset(&signal_mask, SIGPIPE);
|
||||||
|
int rc = pthread_sigmask(SIG_BLOCK, &signal_mask, NULL);
|
||||||
|
if (rc != 0) {
|
||||||
|
uError("failed to block SIGPIPE");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -15,12 +15,13 @@
|
||||||
|
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tsysctl.h"
|
|
||||||
#include "tconfig.h"
|
#include "tconfig.h"
|
||||||
#include "tglobal.h"
|
#include "tglobal.h"
|
||||||
#include "tulog.h"
|
#include "tulog.h"
|
||||||
#include "tutil.h"
|
|
||||||
#include "tsystem.h"
|
#include "tsystem.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_SYSINFO
|
||||||
|
|
||||||
#define PROCESS_ITEM 12
|
#define PROCESS_ITEM 12
|
||||||
|
|
||||||
|
@ -200,7 +201,7 @@ static void taosGetSystemTimezone() {
|
||||||
* Asia/Shanghai (CST, +0800)
|
* Asia/Shanghai (CST, +0800)
|
||||||
* Europe/London (BST, +0100)
|
* Europe/London (BST, +0100)
|
||||||
*/
|
*/
|
||||||
sprintf(tsTimezone, "%s (%s, %s%02d00)", buf, tzname[daylight], tz >= 0 ? "+" : "-", abs(tz));
|
snprintf(tsTimezone, TSDB_TIMEZONE_LEN, "%s (%s, %s%02d00)", buf, tzname[daylight], tz >= 0 ? "+" : "-", abs(tz));
|
||||||
|
|
||||||
// cfg_timezone->cfgStatus = TAOS_CFG_CSTATUS_DEFAULT;
|
// cfg_timezone->cfgStatus = TAOS_CFG_CSTATUS_DEFAULT;
|
||||||
uInfo("timezone not configured, set to system default:%s", tsTimezone);
|
uInfo("timezone not configured, set to system default:%s", tsTimezone);
|
||||||
|
@ -234,7 +235,7 @@ static void taosGetSystemLocale() { // get and set default locale
|
||||||
uError("can't get locale from system, set it to en_US.UTF-8");
|
uError("can't get locale from system, set it to en_US.UTF-8");
|
||||||
strcpy(tsLocale, "en_US.UTF-8");
|
strcpy(tsLocale, "en_US.UTF-8");
|
||||||
} else {
|
} else {
|
||||||
tstrncpy(tsLocale, locale, sizeof(tsLocale));
|
tstrncpy(tsLocale, locale, TSDB_LOCALE_LEN);
|
||||||
uError("locale not configured, set to system default:%s", tsLocale);
|
uError("locale not configured, set to system default:%s", tsLocale);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -247,7 +248,7 @@ static void taosGetSystemLocale() { // get and set default locale
|
||||||
str++;
|
str++;
|
||||||
|
|
||||||
char *revisedCharset = taosCharsetReplace(str);
|
char *revisedCharset = taosCharsetReplace(str);
|
||||||
tstrncpy(tsCharset, revisedCharset, sizeof(tsCharset));
|
tstrncpy(tsCharset, revisedCharset, TSDB_LOCALE_LEN);
|
||||||
|
|
||||||
free(revisedCharset);
|
free(revisedCharset);
|
||||||
uWarn("charset not configured, set to system default:%s", tsCharset);
|
uWarn("charset not configured, set to system default:%s", tsCharset);
|
||||||
|
@ -542,126 +543,31 @@ void taosKillSystem() {
|
||||||
kill(tsProcId, 2);
|
kill(tsProcId, 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int _sysctl(struct __sysctl_args *args );
|
int tSystem(const char *cmd) {
|
||||||
void taosSetCoreDump() {
|
FILE *fp;
|
||||||
if (0 == tsEnableCoreFile) {
|
int res;
|
||||||
return;
|
char buf[1024];
|
||||||
|
if (cmd == NULL) {
|
||||||
|
uError("tSystem cmd is NULL!\n");
|
||||||
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 1. set ulimit -c unlimited
|
if ((fp = popen(cmd, "r")) == NULL) {
|
||||||
struct rlimit rlim;
|
uError("popen cmd:%s error: %s/n", cmd, strerror(errno));
|
||||||
struct rlimit rlim_new;
|
return -1;
|
||||||
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
} else {
|
||||||
uInfo("the old unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
while (fgets(buf, sizeof(buf), fp)) {
|
||||||
rlim_new.rlim_cur = RLIM_INFINITY;
|
uDebug("popen result:%s", buf);
|
||||||
rlim_new.rlim_max = RLIM_INFINITY;
|
}
|
||||||
if (setrlimit(RLIMIT_CORE, &rlim_new) != 0) {
|
|
||||||
uInfo("set unlimited fail, error: %s", strerror(errno));
|
if ((res = pclose(fp)) == -1) {
|
||||||
rlim_new.rlim_cur = rlim.rlim_max;
|
uError("close popen file pointer fp error!\n");
|
||||||
rlim_new.rlim_max = rlim.rlim_max;
|
} else {
|
||||||
(void)setrlimit(RLIMIT_CORE, &rlim_new);
|
uDebug("popen res is :%d\n", res);
|
||||||
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getrlimit(RLIMIT_CORE, &rlim) == 0) {
|
|
||||||
uInfo("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifndef _TD_ARM_
|
|
||||||
// 2. set the path for saving core file
|
|
||||||
struct __sysctl_args args;
|
|
||||||
int old_usespid = 0;
|
|
||||||
size_t old_len = 0;
|
|
||||||
int new_usespid = 1;
|
|
||||||
size_t new_len = sizeof(new_usespid);
|
|
||||||
|
|
||||||
int name[] = {CTL_KERN, KERN_CORE_USES_PID};
|
|
||||||
|
|
||||||
memset(&args, 0, sizeof(struct __sysctl_args));
|
|
||||||
args.name = name;
|
|
||||||
args.nlen = sizeof(name)/sizeof(name[0]);
|
|
||||||
args.oldval = &old_usespid;
|
|
||||||
args.oldlenp = &old_len;
|
|
||||||
args.newval = &new_usespid;
|
|
||||||
args.newlen = new_len;
|
|
||||||
|
|
||||||
old_len = sizeof(old_usespid);
|
|
||||||
|
|
||||||
if (syscall(SYS__sysctl, &args) == -1) {
|
|
||||||
uInfo("_sysctl(kern_core_uses_pid) set fail: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
uInfo("The old core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
|
||||||
|
|
||||||
|
|
||||||
old_usespid = 0;
|
|
||||||
old_len = 0;
|
|
||||||
memset(&args, 0, sizeof(struct __sysctl_args));
|
|
||||||
args.name = name;
|
|
||||||
args.nlen = sizeof(name)/sizeof(name[0]);
|
|
||||||
args.oldval = &old_usespid;
|
|
||||||
args.oldlenp = &old_len;
|
|
||||||
|
|
||||||
old_len = sizeof(old_usespid);
|
|
||||||
|
|
||||||
if (syscall(SYS__sysctl, &args) == -1) {
|
|
||||||
uInfo("_sysctl(kern_core_uses_pid) get fail: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
uInfo("The new core_uses_pid[%" PRIu64 "]: %d", old_len, old_usespid);
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if 0
|
|
||||||
// 3. create the path for saving core file
|
|
||||||
int status;
|
|
||||||
char coredump_dir[32] = "/var/log/taosdump";
|
|
||||||
if (opendir(coredump_dir) == NULL) {
|
|
||||||
status = mkdir(coredump_dir, S_IRWXU | S_IRWXG | S_IRWXO);
|
|
||||||
if (status) {
|
|
||||||
uInfo("mkdir fail, error: %s\n", strerror(errno));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. set kernel.core_pattern
|
|
||||||
struct __sysctl_args args;
|
|
||||||
char old_corefile[128];
|
|
||||||
size_t old_len;
|
|
||||||
char new_corefile[128] = "/var/log/taosdump/core-%e-%p";
|
|
||||||
size_t new_len = sizeof(new_corefile);
|
|
||||||
|
|
||||||
int name[] = {CTL_KERN, KERN_CORE_PATTERN};
|
|
||||||
|
|
||||||
memset(&args, 0, sizeof(struct __sysctl_args));
|
|
||||||
args.name = name;
|
|
||||||
args.nlen = sizeof(name)/sizeof(name[0]);
|
|
||||||
args.oldval = old_corefile;
|
|
||||||
args.oldlenp = &old_len;
|
|
||||||
args.newval = new_corefile;
|
|
||||||
args.newlen = new_len;
|
|
||||||
|
|
||||||
old_len = sizeof(old_corefile);
|
|
||||||
|
|
||||||
if (syscall(SYS__sysctl, &args) == -1) {
|
|
||||||
uInfo("_sysctl(kern_core_pattern) set fail: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
uInfo("The old kern_core_pattern: %*s\n", old_len, old_corefile);
|
|
||||||
|
|
||||||
|
|
||||||
memset(&args, 0, sizeof(struct __sysctl_args));
|
|
||||||
args.name = name;
|
|
||||||
args.nlen = sizeof(name)/sizeof(name[0]);
|
|
||||||
args.oldval = old_corefile;
|
|
||||||
args.oldlenp = &old_len;
|
|
||||||
|
|
||||||
old_len = sizeof(old_corefile);
|
|
||||||
|
|
||||||
if (syscall(SYS__sysctl, &args) == -1) {
|
|
||||||
uInfo("_sysctl(kern_core_pattern) get fail: %s", strerror(errno));
|
|
||||||
}
|
|
||||||
|
|
||||||
uInfo("The new kern_core_pattern: %*s\n", old_len, old_corefile);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "ttimer.h"
|
||||||
|
#include "tulog.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_TIMER
|
||||||
|
|
||||||
|
/*
|
||||||
|
to make taosMsleep work,
|
||||||
|
signal SIGALRM shall be blocked in the calling thread,
|
||||||
|
|
||||||
|
sigset_t set;
|
||||||
|
sigemptyset(&set);
|
||||||
|
sigaddset(&set, SIGALRM);
|
||||||
|
pthread_sigmask(SIG_BLOCK, &set, NULL);
|
||||||
|
*/
|
||||||
|
void taosMsleep(int mseconds) {
|
||||||
|
struct timeval timeout;
|
||||||
|
int seconds, useconds;
|
||||||
|
|
||||||
|
seconds = mseconds / 1000;
|
||||||
|
useconds = (mseconds % 1000) * 1000;
|
||||||
|
timeout.tv_sec = seconds;
|
||||||
|
timeout.tv_usec = useconds;
|
||||||
|
|
||||||
|
/* sigset_t set; */
|
||||||
|
/* sigemptyset(&set); */
|
||||||
|
/* sigaddset(&set, SIGALRM); */
|
||||||
|
/* pthread_sigmask(SIG_BLOCK, &set, NULL); */
|
||||||
|
|
||||||
|
select(0, NULL, NULL, NULL, &timeout);
|
||||||
|
|
||||||
|
/* pthread_sigmask(SIG_UNBLOCK, &set, NULL); */
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void taosDeleteTimer(void *tharg) {
|
||||||
|
timer_t *pTimer = tharg;
|
||||||
|
timer_delete(*pTimer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static pthread_t timerThread;
|
||||||
|
static timer_t timerId;
|
||||||
|
static volatile bool stopTimer = false;
|
||||||
|
static void *taosProcessAlarmSignal(void *tharg) {
|
||||||
|
// Block the signal
|
||||||
|
sigset_t sigset;
|
||||||
|
sigemptyset(&sigset);
|
||||||
|
sigaddset(&sigset, SIGALRM);
|
||||||
|
sigprocmask(SIG_BLOCK, &sigset, NULL);
|
||||||
|
void (*callback)(int) = tharg;
|
||||||
|
|
||||||
|
struct sigevent sevent = {{0}};
|
||||||
|
|
||||||
|
#ifdef _ALPINE
|
||||||
|
sevent.sigev_notify = SIGEV_THREAD;
|
||||||
|
sevent.sigev_value.sival_int = syscall(__NR_gettid);
|
||||||
|
#else
|
||||||
|
sevent.sigev_notify = SIGEV_THREAD_ID;
|
||||||
|
sevent._sigev_un._tid = syscall(__NR_gettid);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
sevent.sigev_signo = SIGALRM;
|
||||||
|
|
||||||
|
if (timer_create(CLOCK_REALTIME, &sevent, &timerId) == -1) {
|
||||||
|
uError("Failed to create timer");
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_cleanup_push(taosDeleteTimer, &timerId);
|
||||||
|
|
||||||
|
struct itimerspec ts;
|
||||||
|
ts.it_value.tv_sec = 0;
|
||||||
|
ts.it_value.tv_nsec = 1000000 * MSECONDS_PER_TICK;
|
||||||
|
ts.it_interval.tv_sec = 0;
|
||||||
|
ts.it_interval.tv_nsec = 1000000 * MSECONDS_PER_TICK;
|
||||||
|
|
||||||
|
if (timer_settime(timerId, 0, &ts, NULL)) {
|
||||||
|
uError("Failed to init timer");
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int signo;
|
||||||
|
while (!stopTimer) {
|
||||||
|
if (sigwait(&sigset, &signo)) {
|
||||||
|
uError("Failed to wait signal: number %d", signo);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
/* printf("Signal handling: number %d ......\n", signo); */
|
||||||
|
|
||||||
|
callback(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
pthread_cleanup_pop(1);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int taosInitTimer(void (*callback)(int), int ms) {
|
||||||
|
pthread_attr_t tattr;
|
||||||
|
pthread_attr_init(&tattr);
|
||||||
|
int code = pthread_create(&timerThread, &tattr, taosProcessAlarmSignal, callback);
|
||||||
|
pthread_attr_destroy(&tattr);
|
||||||
|
if (code != 0) {
|
||||||
|
uError("failed to create timer thread");
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void taosUninitTimer() {
|
||||||
|
stopTimer = true;
|
||||||
|
pthread_join(timerThread, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,26 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_UTIL
|
||||||
|
|
||||||
|
int64_t tsosStr2int64(char *str) {
|
||||||
|
char *endptr = NULL;
|
||||||
|
return strtoll(str, &endptr, 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,123 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define _DEFAULT_SOURCE
|
||||||
|
#include "os.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_WCHAR
|
||||||
|
|
||||||
|
int tasoUcs4Compare(void* f1_ucs4, void *f2_ucs4, int bytes) {
|
||||||
|
return wcsncmp((wchar_t *)f1_ucs4, (wchar_t *)f2_ucs4, bytes / TSDB_NCHAR_SIZE);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef USE_LIBICONV
|
||||||
|
#include "iconv.h"
|
||||||
|
|
||||||
|
int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) {
|
||||||
|
iconv_t cd = iconv_open(tsCharset, DEFAULT_UNICODE_ENCODEC);
|
||||||
|
size_t ucs4_input_len = ucs4_max_len;
|
||||||
|
size_t outLen = ucs4_max_len;
|
||||||
|
if (iconv(cd, (char **)&ucs4, &ucs4_input_len, &mbs, &outLen) == -1) {
|
||||||
|
iconv_close(cd);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv_close(cd);
|
||||||
|
return (int32_t)(ucs4_max_len - outLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, size_t *len) {
|
||||||
|
memset(ucs4, 0, ucs4_max_len);
|
||||||
|
iconv_t cd = iconv_open(DEFAULT_UNICODE_ENCODEC, tsCharset);
|
||||||
|
size_t ucs4_input_len = mbsLength;
|
||||||
|
size_t outLeft = ucs4_max_len;
|
||||||
|
if (iconv(cd, &mbs, &ucs4_input_len, &ucs4, &outLeft) == -1) {
|
||||||
|
iconv_close(cd);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv_close(cd);
|
||||||
|
if (len != NULL) {
|
||||||
|
*len = ucs4_max_len - outLeft;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool taosValidateEncodec(const char *encodec) {
|
||||||
|
iconv_t cd = iconv_open(encodec, DEFAULT_UNICODE_ENCODEC);
|
||||||
|
if (cd == (iconv_t)(-1)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
iconv_close(cd);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#else
|
||||||
|
|
||||||
|
int32_t taosUcs4ToMbs(void *ucs4, int32_t ucs4_max_len, char *mbs) {
|
||||||
|
mbstate_t state = {0};
|
||||||
|
int32_t len = (int32_t)wcsnrtombs(NULL, (const wchar_t **)&ucs4, ucs4_max_len / 4, 0, &state);
|
||||||
|
if (len < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
memset(&state, 0, sizeof(state));
|
||||||
|
len = wcsnrtombs(mbs, (const wchar_t **)&ucs4, ucs4_max_len / 4, (size_t)len, &state);
|
||||||
|
if (len < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return len;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool taosMbsToUcs4(char *mbs, size_t mbsLength, char *ucs4, int32_t ucs4_max_len, size_t *len) {
|
||||||
|
memset(ucs4, 0, ucs4_max_len);
|
||||||
|
mbstate_t state = {0};
|
||||||
|
int32_t retlen = mbsnrtowcs((wchar_t *)ucs4, (const char **)&mbs, mbsLength, ucs4_max_len / 4, &state);
|
||||||
|
*len = retlen;
|
||||||
|
|
||||||
|
return retlen >= 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool taosValidateEncodec(const char *encodec) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
typedef struct CharsetPair {
|
||||||
|
char *oldCharset;
|
||||||
|
char *newCharset;
|
||||||
|
} CharsetPair;
|
||||||
|
|
||||||
|
char *taosCharsetReplace(char *charsetstr) {
|
||||||
|
CharsetPair charsetRep[] = {
|
||||||
|
{ "utf8", "UTF-8" }, { "936", "CP936" },
|
||||||
|
};
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < tListLen(charsetRep); ++i) {
|
||||||
|
if (strcasecmp(charsetRep[i].oldCharset, charsetstr) == 0) {
|
||||||
|
return strdup(charsetRep[i].newCharset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return strdup(charsetstr);
|
||||||
|
}
|
|
@ -0,0 +1,12 @@
|
||||||
|
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
|
||||||
|
PROJECT(TDengine)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/util/inc)
|
||||||
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/common/inc)
|
||||||
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
|
|
||||||
|
ADD_LIBRARY(os ${SRC})
|
||||||
|
TARGET_LINK_LIBRARIES(os m rt)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue