Merge remote-tracking branch 'origin/develop' into feature/crash_gen
This commit is contained in:
commit
b115abf1bc
|
@ -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)
|
||||||
|
|
|
@ -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 ()
|
||||||
|
|
|
@ -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})
|
||||||
|
|
|
@ -33,20 +33,23 @@ IF (${CPUTYPE} MATCHES "aarch32")
|
||||||
SET(TD_PAGMODE_LITE TRUE)
|
SET(TD_PAGMODE_LITE TRUE)
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_)
|
ADD_DEFINITIONS(-D_TD_ARM_)
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_32_)
|
ADD_DEFINITIONS(-D_TD_ARM_32_)
|
||||||
|
MESSAGE(STATUS "input cpuType: aarch32")
|
||||||
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_)
|
ADD_DEFINITIONS(-D_TD_ARM_)
|
||||||
ADD_DEFINITIONS(-D_TD_ARM_64_)
|
ADD_DEFINITIONS(-D_TD_ARM_64_)
|
||||||
|
MESSAGE(STATUS "input cpuType: aarch64")
|
||||||
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_)
|
ADD_DEFINITIONS(-D_TD_MIPS_)
|
||||||
ADD_DEFINITIONS(-D_TD_MIPS_64_)
|
ADD_DEFINITIONS(-D_TD_MIPS_64_)
|
||||||
|
MESSAGE(STATUS "input cpuType: mips64")
|
||||||
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: " ${CPUTYPE})
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
@ -61,13 +64,13 @@ MESSAGE(STATUS "The current os is " ${TD_OS_INFO})
|
||||||
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
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)
|
ADD_DEFINITIONS(-D_M_X64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_LINUX_64)
|
||||||
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)
|
||||||
|
SET(TD_LINUX_32 TRUE)
|
||||||
|
ADD_DEFINITIONS(-D_TD_LINUX_32)
|
||||||
IF (TD_ARM)
|
IF (TD_ARM)
|
||||||
SET(TD_LINUX_32 TRUE)
|
|
||||||
SET(TD_OS_DIR ${TD_COMMUNITY_DIR}/src/os/linux)
|
|
||||||
#ADD_DEFINITIONS(-D_M_IX86)
|
#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 ()
|
||||||
|
@ -81,7 +84,7 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux")
|
||||||
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)
|
ADD_DEFINITIONS(-D_TD_DARWIN_64)
|
||||||
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")
|
||||||
|
@ -90,10 +93,12 @@ ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Darwin")
|
||||||
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
ELSEIF (${CMAKE_SYSTEM_NAME} MATCHES "Windows")
|
||||||
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)
|
ADD_DEFINITIONS(-D_M_X64)
|
||||||
|
ADD_DEFINITIONS(-D_TD_WINDOWS_64)
|
||||||
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)
|
||||||
|
ADD_DEFINITIONS(-D_TD_WINDOWS_32)
|
||||||
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 ()
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
|
@ -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);
|
||||||
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -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_COMMUNITY_DIR}/src/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/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;
|
||||||
|
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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_COMMUNITY_DIR}/src/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/os/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/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(${TD_COMMUNITY_DIR}/src/cq/inc)
|
||||||
INCLUDE_DIRECTORIES(../inc)
|
|
||||||
|
|
||||||
LIST(APPEND CQTEST_SRC ./cqtest.c)
|
|
||||||
ADD_EXECUTABLE(cqtest ${CQTEST_SRC})
|
|
||||||
TARGET_LINK_LIBRARIES(cqtest tcq)
|
|
||||||
|
|
||||||
ENDIF ()
|
|
||||||
|
|
||||||
|
|
||||||
|
LIST(APPEND CQTEST_SRC ./cqtest.c)
|
||||||
|
ADD_EXECUTABLE(cqtest ${CQTEST_SRC})
|
||||||
|
TARGET_LINK_LIBRARIES(cqtest tcq)
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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,10 +206,14 @@ 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 {
|
} else {
|
||||||
dnodeDispatchNonRspMsg(pVnode, pReadMsg, code);
|
if (code == TSDB_CODE_QRY_HAS_RSP) {
|
||||||
|
dnodeSendRpcReadRsp(pVnode, pReadMsg, TSDB_CODE_SUCCESS);
|
||||||
|
} else {
|
||||||
|
dnodeDispatchNonRspMsg(pVnode, pReadMsg, code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosFreeQitem(pReadMsg);
|
taosFreeQitem(pReadMsg);
|
||||||
|
|
|
@ -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,10 @@ 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);
|
||||||
|
|
||||||
|
void* pGetRspMsg(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 +51,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 +63,9 @@ 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);
|
||||||
|
|
||||||
/**
|
void* qGetResultRetrieveMsg(qinfo_t qinfo);
|
||||||
* 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
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
bool qHasMoreResultsToRetrieve(qinfo_t qinfo);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* kill current ongoing query and free query handle automatically
|
* kill current ongoing query and free query handle automatically
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -216,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")
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
|
|
@ -301,13 +301,6 @@ static int32_t mnodeCheckDbCfg(SDbCfg *pCfg) {
|
||||||
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef _SYNC
|
|
||||||
if (pCfg->replications != 1) {
|
|
||||||
mError("invalid db option replications:%d can only be 1 in this version", pCfg->replications);
|
|
||||||
return TSDB_CODE_MND_INVALID_DB_OPTION;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -79,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();
|
||||||
|
|
||||||
|
@ -552,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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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,6 +201,8 @@ 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);
|
char *taosCharsetReplace(char *charsetstr);
|
||||||
|
@ -233,6 +235,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 +259,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,240 @@
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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
|
||||||
|
|
||||||
|
#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();
|
||||||
|
|
||||||
|
#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
|
|
@ -78,10 +78,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
|
|
@ -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,98 @@
|
||||||
|
/*
|
||||||
|
* 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 "tutil.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
|
|
@ -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,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,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,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,13 +15,14 @@
|
||||||
|
|
||||||
#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 "tutil.h"
|
||||||
#include "tsystem.h"
|
#include "tsystem.h"
|
||||||
|
|
||||||
|
#ifndef TAOS_OS_FUNC_SYSINFO
|
||||||
|
|
||||||
#define PROCESS_ITEM 12
|
#define PROCESS_ITEM 12
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -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));
|
|
||||||
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) {
|
if ((res = pclose(fp)) == -1) {
|
||||||
uInfo("the new unlimited para: rlim_cur=%" PRIu64 ", rlim_max=%" PRIu64, rlim.rlim_cur, rlim.rlim_max);
|
uError("close popen file pointer fp error!\n");
|
||||||
}
|
} else {
|
||||||
|
uDebug("popen res is :%d\n", res);
|
||||||
#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
|
|
||||||
|
|
||||||
#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));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif
|
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "os.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
#include "ttimer.h"
|
||||||
|
#include "tulog.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
#include <signal.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,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)
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
/*
|
||||||
|
* 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"
|
||||||
|
|
||||||
|
void osInit() {
|
||||||
|
strcpy(configDir, "/etc/taos");
|
||||||
|
strcpy(tsVnodeDir, "");
|
||||||
|
strcpy(tsDnodeDir, "");
|
||||||
|
strcpy(tsMnodeDir, "");
|
||||||
|
strcpy(tsDataDir, "/var/lib/taos");
|
||||||
|
strcpy(tsLogDir, "/var/log/taos");
|
||||||
|
strcpy(tsScriptDir, "/etc/taos");
|
||||||
|
strcpy(tsOsName, "Linux");
|
||||||
|
}
|
|
@ -398,7 +398,7 @@ char *strndup(const char *s, size_t n) {
|
||||||
void taosSetCoreDump() {}
|
void taosSetCoreDump() {}
|
||||||
|
|
||||||
#ifdef _TD_GO_DLL_
|
#ifdef _TD_GO_DLL_
|
||||||
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);
|
||||||
}
|
}
|
|
@ -3,6 +3,7 @@ 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_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_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
|
@ -10,7 +11,6 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/zlib-1.2.11/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/zlib-1.2.11/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/lz4/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/lz4/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
ADD_LIBRARY(http ${SRC})
|
ADD_LIBRARY(http ${SRC})
|
||||||
|
|
|
@ -58,7 +58,7 @@ static void httpDestroyContext(void *data) {
|
||||||
}
|
}
|
||||||
|
|
||||||
bool httpInitContexts() {
|
bool httpInitContexts() {
|
||||||
tsHttpServer.contextCache = taosCacheInit(TSDB_DATA_TYPE_BIGINT, 2, false, httpDestroyContext, "restc");
|
tsHttpServer.contextCache = taosCacheInit(TSDB_DATA_TYPE_BIGINT, 2, true, httpDestroyContext, "restc");
|
||||||
if (tsHttpServer.contextCache == NULL) {
|
if (tsHttpServer.contextCache == NULL) {
|
||||||
httpError("failed to init context cache");
|
httpError("failed to init context cache");
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -45,7 +45,7 @@ int httpWriteBufByFd(struct HttpContext* pContext, const char* buf, int sz) {
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (pContext->fd > 2){
|
if (pContext->fd > 2){
|
||||||
len = (int)send(pContext->fd, buf + writeLen, (size_t)(sz - writeLen), MSG_NOSIGNAL);
|
len = (int)taosSend(pContext->fd, buf + writeLen, (size_t)(sz - writeLen), MSG_NOSIGNAL);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
return sz;
|
return sz;
|
||||||
|
|
|
@ -3,11 +3,11 @@ 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_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_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)
|
||||||
AUX_SOURCE_DIRECTORY(./src SRC)
|
AUX_SOURCE_DIRECTORY(./src SRC)
|
||||||
ADD_LIBRARY(monitor ${SRC})
|
ADD_LIBRARY(monitor ${SRC})
|
||||||
|
|
|
@ -3,6 +3,7 @@ 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_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_COMMUNITY_DIR}/src/query/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/query/inc)
|
||||||
|
@ -10,7 +11,6 @@ IF ((TD_LINUX_64) OR (TD_LINUX_32 AND TD_ARM))
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/MQTT-C/include)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/MQTT-C/include)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/MQTT-C/examples/templates)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/MQTT-C/examples/templates)
|
||||||
INCLUDE_DIRECTORIES(${TD_OS_DIR}/inc)
|
|
||||||
INCLUDE_DIRECTORIES(inc)
|
INCLUDE_DIRECTORIES(inc)
|
||||||
AUX_SOURCE_DIRECTORY(src SRC)
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
ADD_LIBRARY(mqtt ${SRC})
|
ADD_LIBRARY(mqtt ${SRC})
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
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/util/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/common/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/tsdb/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/tsdb/inc)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/src/client/inc)
|
||||||
|
|
|
@ -20,8 +20,8 @@
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "qFill.h"
|
#include "qFill.h"
|
||||||
#include "qResultbuf.h"
|
#include "qResultbuf.h"
|
||||||
|
#include "qSqlparser.h"
|
||||||
#include "qTsbuf.h"
|
#include "qTsbuf.h"
|
||||||
#include "qsqlparser.h"
|
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
|
@ -43,7 +43,7 @@ typedef struct SSqlGroupbyExpr {
|
||||||
|
|
||||||
typedef struct SPosInfo {
|
typedef struct SPosInfo {
|
||||||
int32_t pageId;
|
int32_t pageId;
|
||||||
int16_t rowId;
|
int32_t rowId;
|
||||||
} SPosInfo;
|
} SPosInfo;
|
||||||
|
|
||||||
typedef struct SWindowStatus {
|
typedef struct SWindowStatus {
|
||||||
|
@ -177,13 +177,18 @@ typedef struct SQueryRuntimeEnv {
|
||||||
SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file
|
SDiskbasedResultBuf* pResultBuf; // query result buffer based on blocked-wised disk file
|
||||||
} SQueryRuntimeEnv;
|
} SQueryRuntimeEnv;
|
||||||
|
|
||||||
|
enum {
|
||||||
|
QUERY_RESULT_NOT_READY = 1,
|
||||||
|
QUERY_RESULT_READY = 2,
|
||||||
|
};
|
||||||
|
|
||||||
typedef struct SQInfo {
|
typedef struct SQInfo {
|
||||||
void* signature;
|
void* signature;
|
||||||
int32_t pointsInterpo;
|
int32_t pointsInterpo;
|
||||||
int32_t code; // error code to returned to client
|
int32_t code; // error code to returned to client
|
||||||
sem_t dataReady;
|
// sem_t dataReady;
|
||||||
|
|
||||||
void* tsdb;
|
void* tsdb;
|
||||||
void* param;
|
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
STableGroupInfo tableGroupInfo; // table id list < only includes the STable list>
|
STableGroupInfo tableGroupInfo; // table id list < only includes the STable list>
|
||||||
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
STableGroupInfo tableqinfoGroupInfo; // this is a group array list, including SArray<STableQueryInfo*> structure
|
||||||
|
@ -200,8 +205,11 @@ typedef struct SQInfo {
|
||||||
*/
|
*/
|
||||||
int32_t tableIndex;
|
int32_t tableIndex;
|
||||||
int32_t numOfGroupResultPages;
|
int32_t numOfGroupResultPages;
|
||||||
void* pBuf; // allocated buffer for STableQueryInfo, sizeof(STableQueryInfo)*numOfTables;
|
void* pBuf; // allocated buffer for STableQueryInfo, sizeof(STableQueryInfo)*numOfTables;
|
||||||
|
|
||||||
|
pthread_mutex_t lock; // used to synchronize the rsp/query threads
|
||||||
|
int32_t dataReady; // denote if query result is ready or not
|
||||||
|
void* rspContext; // response context
|
||||||
} SQInfo;
|
} SQInfo;
|
||||||
|
|
||||||
#endif // TDENGINE_QUERYEXECUTOR_H
|
#endif // TDENGINE_QUERYEXECUTOR_H
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
|
|
||||||
|
@ -28,9 +27,9 @@ extern "C" {
|
||||||
#include "tdataformat.h"
|
#include "tdataformat.h"
|
||||||
#include "talgo.h"
|
#include "talgo.h"
|
||||||
|
|
||||||
#define DEFAULT_PAGE_SIZE (1024L*4) // 16k larger than the SHistoInfo
|
#define MAX_TMPFILE_PATH_LENGTH PATH_MAX
|
||||||
#define MAX_TMPFILE_PATH_LENGTH PATH_MAX
|
|
||||||
#define INITIAL_ALLOCATION_BUFFER_SIZE 64
|
#define INITIAL_ALLOCATION_BUFFER_SIZE 64
|
||||||
|
#define DEFAULT_PAGE_SIZE (4096L) // 16k larger than the SHistoInfo
|
||||||
|
|
||||||
typedef enum EXT_BUFFER_FLUSH_MODEL {
|
typedef enum EXT_BUFFER_FLUSH_MODEL {
|
||||||
/*
|
/*
|
||||||
|
@ -126,7 +125,7 @@ typedef struct tExtMemBuffer {
|
||||||
* @param pModel
|
* @param pModel
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
tExtMemBuffer *createExtMemBuffer(int32_t inMemSize, int32_t elemSize, SColumnModel *pModel);
|
tExtMemBuffer *createExtMemBuffer(int32_t inMemSize, int32_t elemSize, int32_t pagesize, SColumnModel *pModel);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -13,50 +13,85 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef TDENGINE_VNODEQUERYUTIL_H
|
#ifndef TDENGINE_QRESULTBUF_H
|
||||||
#define TDENGINE_VNODEQUERYUTIL_H
|
#define TDENGINE_QRESULTBUF_H
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <tlist.h>
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qExtbuffer.h"
|
#include "qExtbuffer.h"
|
||||||
|
#include "tlockfree.h"
|
||||||
|
|
||||||
typedef struct SArray* SIDList;
|
typedef struct SArray* SIDList;
|
||||||
|
|
||||||
|
typedef struct SPageDiskInfo {
|
||||||
|
int32_t offset;
|
||||||
|
int32_t length;
|
||||||
|
} SPageDiskInfo;
|
||||||
|
|
||||||
|
typedef struct SPageInfo {
|
||||||
|
SListNode* pn; // point to list node
|
||||||
|
int32_t pageId;
|
||||||
|
SPageDiskInfo info;
|
||||||
|
void* pData;
|
||||||
|
bool used; // set current page is in used
|
||||||
|
} SPageInfo;
|
||||||
|
|
||||||
|
typedef struct SFreeListItem {
|
||||||
|
int32_t offset;
|
||||||
|
int32_t len;
|
||||||
|
} SFreeListItem;
|
||||||
|
|
||||||
|
typedef struct SResultBufStatis {
|
||||||
|
int32_t flushBytes;
|
||||||
|
int32_t loadBytes;
|
||||||
|
int32_t getPages;
|
||||||
|
int32_t releasePages;
|
||||||
|
int32_t flushPages;
|
||||||
|
} SResultBufStatis;
|
||||||
|
|
||||||
typedef struct SDiskbasedResultBuf {
|
typedef struct SDiskbasedResultBuf {
|
||||||
int32_t numOfRowsPerPage;
|
int32_t numOfRowsPerPage;
|
||||||
int32_t numOfPages;
|
int32_t numOfPages;
|
||||||
int64_t totalBufSize;
|
int64_t totalBufSize;
|
||||||
int32_t fd; // data file fd
|
int64_t fileSize; // disk file size
|
||||||
|
FILE* file;
|
||||||
int32_t allocateId; // allocated page id
|
int32_t allocateId; // allocated page id
|
||||||
int32_t incStep; // minimum allocated pages
|
|
||||||
void* pBuf; // mmap buffer pointer
|
|
||||||
char* path; // file path
|
char* path; // file path
|
||||||
int32_t pageSize; // current used page size
|
int32_t pageSize; // current used page size
|
||||||
int32_t inMemPages; // numOfPages that are allocated in memory
|
int32_t inMemPages; // numOfPages that are allocated in memory
|
||||||
SHashObj* idsTable; // id hash table
|
SHashObj* groupSet; // id hash table
|
||||||
SIDList list; // for each id, there is a page id list
|
SHashObj* all;
|
||||||
|
SList* lruList;
|
||||||
void* iBuf; // inmemory buf
|
|
||||||
void* handle; // for debug purpose
|
|
||||||
void* emptyDummyIdList; // dummy id list
|
void* emptyDummyIdList; // dummy id list
|
||||||
|
void* assistBuf; // assistant buffer for compress/decompress data
|
||||||
|
SArray* pFree; // free area in file
|
||||||
|
bool comp; // compressed before flushed to disk
|
||||||
|
int32_t nextPos; // next page flush position
|
||||||
|
|
||||||
|
const void* handle; // for debug purpose
|
||||||
|
SResultBufStatis statis;
|
||||||
} SDiskbasedResultBuf;
|
} SDiskbasedResultBuf;
|
||||||
|
|
||||||
#define DEFAULT_INTERN_BUF_PAGE_SIZE (1024L)
|
#define DEFAULT_INTERN_BUF_PAGE_SIZE (4096L)
|
||||||
#define DEFAULT_INMEM_BUF_PAGES 10
|
#define DEFAULT_INMEM_BUF_PAGES 10
|
||||||
|
#define PAGE_INFO_INITIALIZER (SPageDiskInfo){-1, -1}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* create disk-based result buffer
|
* create disk-based result buffer
|
||||||
* @param pResultBuf
|
* @param pResultBuf
|
||||||
* @param size
|
|
||||||
* @param rowSize
|
* @param rowSize
|
||||||
|
* @param pagesize
|
||||||
|
* @param inMemPages
|
||||||
|
* @param handle
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t createDiskbasedResultBuffer(SDiskbasedResultBuf** pResultBuf, int32_t numOfPages, int32_t rowSize, int32_t pagesize,
|
int32_t createDiskbasedResultBuffer(SDiskbasedResultBuf** pResultBuf, int32_t rowSize, int32_t pagesize,
|
||||||
int32_t inMemPages, void* handle);
|
int32_t inMemBufSize, const void* handle);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -72,7 +107,7 @@ tFilePage* getNewDataBuf(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32
|
||||||
* @param pResultBuf
|
* @param pResultBuf
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t getNumOfRowsPerPage(SDiskbasedResultBuf* pResultBuf);
|
size_t getNumOfRowsPerPage(const SDiskbasedResultBuf* pResultBuf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -88,42 +123,52 @@ SIDList getDataBufPagesIdList(SDiskbasedResultBuf* pResultBuf, int32_t groupId);
|
||||||
* @param id
|
* @param id
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
static FORCE_INLINE tFilePage* getResBufPage(SDiskbasedResultBuf* pResultBuf, int32_t id) {
|
tFilePage* getResBufPage(SDiskbasedResultBuf* pResultBuf, int32_t id);
|
||||||
if (id < pResultBuf->inMemPages) {
|
|
||||||
return (tFilePage*) ((char*) pResultBuf->iBuf + id * pResultBuf->pageSize);
|
/**
|
||||||
} else {
|
* release the referenced buf pages
|
||||||
return (tFilePage*) ((char*) pResultBuf->pBuf + (id - pResultBuf->inMemPages) * pResultBuf->pageSize);
|
* @param pResultBuf
|
||||||
}
|
* @param page
|
||||||
}
|
*/
|
||||||
|
void releaseResBufPage(SDiskbasedResultBuf* pResultBuf, void* page);
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @param pResultBuf
|
||||||
|
* @param pi
|
||||||
|
*/
|
||||||
|
void releaseResBufPageInfo(SDiskbasedResultBuf* pResultBuf, SPageInfo* pi);
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the total buffer size in the format of disk file
|
* get the total buffer size in the format of disk file
|
||||||
* @param pResultBuf
|
* @param pResultBuf
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t getResBufSize(SDiskbasedResultBuf* pResultBuf);
|
size_t getResBufSize(const SDiskbasedResultBuf* pResultBuf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* get the number of groups in the result buffer
|
* get the number of groups in the result buffer
|
||||||
* @param pResultBuf
|
* @param pResultBuf
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t getNumOfResultBufGroupId(SDiskbasedResultBuf* pResultBuf);
|
size_t getNumOfResultBufGroupId(const SDiskbasedResultBuf* pResultBuf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* destroy result buffer
|
* destroy result buffer
|
||||||
* @param pResultBuf
|
* @param pResultBuf
|
||||||
*/
|
*/
|
||||||
void destroyResultBuf(SDiskbasedResultBuf* pResultBuf, void* handle);
|
void destroyResultBuf(SDiskbasedResultBuf* pResultBuf);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param pList
|
* @param pList
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
int32_t getLastPageId(SIDList pList);
|
SPageInfo* getLastPageInfo(SIDList pList);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif // TDENGINE_VNODEQUERYUTIL_H
|
#endif // TDENGINE_QRESULTBUF_H
|
||||||
|
|
|
@ -45,13 +45,14 @@ bool isWindowResClosed(SWindowResInfo *pWindowResInfo, int32_t slot);
|
||||||
|
|
||||||
int32_t createQueryResultInfo(SQuery *pQuery, SWindowResult *pResultRow, bool isSTableQuery, size_t interBufSize);
|
int32_t createQueryResultInfo(SQuery *pQuery, SWindowResult *pResultRow, bool isSTableQuery, size_t interBufSize);
|
||||||
|
|
||||||
static FORCE_INLINE char *getPosInResultPage(SQueryRuntimeEnv *pRuntimeEnv, int32_t columnIndex, SWindowResult *pResult) {
|
static FORCE_INLINE char *getPosInResultPage(SQueryRuntimeEnv *pRuntimeEnv, int32_t columnIndex, SWindowResult *pResult,
|
||||||
|
tFilePage* page) {
|
||||||
assert(pResult != NULL && pRuntimeEnv != NULL);
|
assert(pResult != NULL && pRuntimeEnv != NULL);
|
||||||
|
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pResult->pos.pageId);
|
// tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pResult->pos.pageId);
|
||||||
int32_t realRowId = pResult->pos.rowId * GET_ROW_PARAM_FOR_MULTIOUTPUT(pQuery, pRuntimeEnv->topBotQuery, pRuntimeEnv->stableQuery);
|
|
||||||
|
|
||||||
|
int32_t realRowId = pResult->pos.rowId * GET_ROW_PARAM_FOR_MULTIOUTPUT(pQuery, pRuntimeEnv->topBotQuery, pRuntimeEnv->stableQuery);
|
||||||
return ((char *)page->data) + pRuntimeEnv->offset[columnIndex] * pRuntimeEnv->numOfRowsPerPage +
|
return ((char *)page->data) + pRuntimeEnv->offset[columnIndex] * pRuntimeEnv->numOfRowsPerPage +
|
||||||
pQuery->pSelectExpr[columnIndex].bytes * realRowId;
|
pQuery->pSelectExpr[columnIndex].bytes * realRowId;
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,8 +18,8 @@
|
||||||
|
|
||||||
#include "exception.h"
|
#include "exception.h"
|
||||||
#include "qAst.h"
|
#include "qAst.h"
|
||||||
|
#include "qSqlparser.h"
|
||||||
#include "qSyntaxtreefunction.h"
|
#include "qSyntaxtreefunction.h"
|
||||||
#include "qsqlparser.h"
|
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
|
|
|
@ -221,7 +221,7 @@ void updateNumOfResult(SQueryRuntimeEnv *pRuntimeEnv, int32_t numOfRes) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getGroupResultId(int32_t groupIndex) {
|
static int32_t getGroupResultId(int32_t groupIndex) {
|
||||||
int32_t base = 200000;
|
int32_t base = 20000000;
|
||||||
return base + (groupIndex * 10000);
|
return base + (groupIndex * 10000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -478,10 +478,14 @@ static int32_t addNewWindowResultBuf(SWindowResult *pWindowRes, SDiskbasedResult
|
||||||
if (taosArrayGetSize(list) == 0) {
|
if (taosArrayGetSize(list) == 0) {
|
||||||
pData = getNewDataBuf(pResultBuf, sid, &pageId);
|
pData = getNewDataBuf(pResultBuf, sid, &pageId);
|
||||||
} else {
|
} else {
|
||||||
pageId = getLastPageId(list);
|
SPageInfo* pi = getLastPageInfo(list);
|
||||||
pData = getResBufPage(pResultBuf, pageId);
|
pData = getResBufPage(pResultBuf, pi->pageId);
|
||||||
|
pageId = pi->pageId;
|
||||||
|
|
||||||
if (pData->num >= numOfRowsPerPage) {
|
if (pData->num >= numOfRowsPerPage) {
|
||||||
|
// release current page first, and prepare the next one
|
||||||
|
releaseResBufPageInfo(pResultBuf, pi);
|
||||||
|
|
||||||
pData = getNewDataBuf(pResultBuf, sid, &pageId);
|
pData = getNewDataBuf(pResultBuf, sid, &pageId);
|
||||||
if (pData != NULL) {
|
if (pData != NULL) {
|
||||||
assert(pData->num == 0); // number of elements must be 0 for new allocated buffer
|
assert(pData->num == 0); // number of elements must be 0 for new allocated buffer
|
||||||
|
@ -497,6 +501,8 @@ static int32_t addNewWindowResultBuf(SWindowResult *pWindowRes, SDiskbasedResult
|
||||||
if (pWindowRes->pos.pageId == -1) { // not allocated yet, allocate new buffer
|
if (pWindowRes->pos.pageId == -1) { // not allocated yet, allocate new buffer
|
||||||
pWindowRes->pos.pageId = pageId;
|
pWindowRes->pos.pageId = pageId;
|
||||||
pWindowRes->pos.rowId = pData->num++;
|
pWindowRes->pos.rowId = pData->num++;
|
||||||
|
|
||||||
|
assert(pWindowRes->pos.pageId >= 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1490,8 +1496,6 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
goto _clean;
|
goto _clean;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%p setup runtime env1", GET_QINFO_ADDR(pRuntimeEnv));
|
|
||||||
|
|
||||||
pRuntimeEnv->offset[0] = 0;
|
pRuntimeEnv->offset[0] = 0;
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
SSqlFuncMsg *pSqlFuncMsg = &pQuery->pSelectExpr[i].base;
|
SSqlFuncMsg *pSqlFuncMsg = &pQuery->pSelectExpr[i].base;
|
||||||
|
@ -1536,8 +1540,6 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%p setup runtime env2", GET_QINFO_ADDR(pRuntimeEnv));
|
|
||||||
|
|
||||||
// set the order information for top/bottom query
|
// set the order information for top/bottom query
|
||||||
int32_t functionId = pCtx->functionId;
|
int32_t functionId = pCtx->functionId;
|
||||||
|
|
||||||
|
@ -1558,25 +1560,19 @@ static int32_t setupQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv, int16_t order
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%p setup runtime env3", GET_QINFO_ADDR(pRuntimeEnv));
|
|
||||||
|
|
||||||
char* buf = (char*) pRuntimeEnv->resultInfo + sizeof(SResultInfo) * pQuery->numOfOutput;
|
char* buf = (char*) pRuntimeEnv->resultInfo + sizeof(SResultInfo) * pQuery->numOfOutput;
|
||||||
|
|
||||||
// set the intermediate result output buffer
|
// set the intermediate result output buffer
|
||||||
setWindowResultInfo(pRuntimeEnv->resultInfo, pQuery, pRuntimeEnv->stableQuery, buf);
|
setWindowResultInfo(pRuntimeEnv->resultInfo, pQuery, pRuntimeEnv->stableQuery, buf);
|
||||||
|
|
||||||
qDebug("QInfo:%p setup runtime env4", GET_QINFO_ADDR(pRuntimeEnv));
|
|
||||||
|
|
||||||
// if it is group by normal column, do not set output buffer, the output buffer is pResult
|
// if it is group by normal column, do not set output buffer, the output buffer is pResult
|
||||||
if (!pRuntimeEnv->groupbyNormalCol && !pRuntimeEnv->stableQuery) {
|
if (!pRuntimeEnv->groupbyNormalCol && !pRuntimeEnv->stableQuery) {
|
||||||
resetCtxOutputBuf(pRuntimeEnv);
|
resetCtxOutputBuf(pRuntimeEnv);
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%p setup runtime env5", GET_QINFO_ADDR(pRuntimeEnv));
|
|
||||||
|
|
||||||
setCtxTagColumnInfo(pRuntimeEnv, pRuntimeEnv->pCtx);
|
setCtxTagColumnInfo(pRuntimeEnv, pRuntimeEnv->pCtx);
|
||||||
|
|
||||||
qDebug("QInfo:%p init completed", GET_QINFO_ADDR(pRuntimeEnv));
|
qDebug("QInfo:%p init runtime completed", GET_QINFO_ADDR(pRuntimeEnv));
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
_clean:
|
_clean:
|
||||||
|
@ -1615,7 +1611,7 @@ static void teardownQueryRuntimeEnv(SQueryRuntimeEnv *pRuntimeEnv) {
|
||||||
|
|
||||||
pRuntimeEnv->pFillInfo = taosDestoryFillInfo(pRuntimeEnv->pFillInfo);
|
pRuntimeEnv->pFillInfo = taosDestoryFillInfo(pRuntimeEnv->pFillInfo);
|
||||||
|
|
||||||
destroyResultBuf(pRuntimeEnv->pResultBuf, pQInfo);
|
destroyResultBuf(pRuntimeEnv->pResultBuf);
|
||||||
tsdbCleanupQueryHandle(pRuntimeEnv->pQueryHandle);
|
tsdbCleanupQueryHandle(pRuntimeEnv->pQueryHandle);
|
||||||
tsdbCleanupQueryHandle(pRuntimeEnv->pSecQueryHandle);
|
tsdbCleanupQueryHandle(pRuntimeEnv->pSecQueryHandle);
|
||||||
|
|
||||||
|
@ -2111,9 +2107,6 @@ int32_t loadDataBlockOnDemand(SQueryRuntimeEnv *pRuntimeEnv, void* pQueryHandle,
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!needToLoadDataBlock(pRuntimeEnv, *pStatis, pRuntimeEnv->pCtx, pBlockInfo->rows)) {
|
if (!needToLoadDataBlock(pRuntimeEnv, *pStatis, pRuntimeEnv->pCtx, pBlockInfo->rows)) {
|
||||||
#if defined(_DEBUG_VIEW)
|
|
||||||
qDebug("QInfo:%p block discarded by per-filter", GET_QINFO_ADDR(pRuntimeEnv));
|
|
||||||
#endif
|
|
||||||
// current block has been discard due to filter applied
|
// current block has been discard due to filter applied
|
||||||
pRuntimeEnv->summary.discardBlocks += 1;
|
pRuntimeEnv->summary.discardBlocks += 1;
|
||||||
qDebug("QInfo:%p data block discard, brange:%"PRId64 "-%"PRId64", rows:%d", GET_QINFO_ADDR(pRuntimeEnv),
|
qDebug("QInfo:%p data block discard, brange:%"PRId64 "-%"PRId64", rows:%d", GET_QINFO_ADDR(pRuntimeEnv),
|
||||||
|
@ -2446,6 +2439,8 @@ static void doMerge(SQueryRuntimeEnv *pRuntimeEnv, int64_t timestamp, SWindowRes
|
||||||
SQuery * pQuery = pRuntimeEnv->pQuery;
|
SQuery * pQuery = pRuntimeEnv->pQuery;
|
||||||
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
|
SQLFunctionCtx *pCtx = pRuntimeEnv->pCtx;
|
||||||
|
|
||||||
|
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes->pos.pageId);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
||||||
if (!mergeFlag) {
|
if (!mergeFlag) {
|
||||||
|
@ -2458,7 +2453,7 @@ static void doMerge(SQueryRuntimeEnv *pRuntimeEnv, int64_t timestamp, SWindowRes
|
||||||
|
|
||||||
pCtx[i].hasNull = true;
|
pCtx[i].hasNull = true;
|
||||||
pCtx[i].nStartQueryTimestamp = timestamp;
|
pCtx[i].nStartQueryTimestamp = timestamp;
|
||||||
pCtx[i].aInputElemBuf = getPosInResultPage(pRuntimeEnv, i, pWindowRes);
|
pCtx[i].aInputElemBuf = getPosInResultPage(pRuntimeEnv, i, pWindowRes, page);
|
||||||
|
|
||||||
// in case of tag column, the tag information should be extracted from input buffer
|
// in case of tag column, the tag information should be extracted from input buffer
|
||||||
if (functionId == TSDB_FUNC_TAG_DUMMY || functionId == TSDB_FUNC_TAG) {
|
if (functionId == TSDB_FUNC_TAG_DUMMY || functionId == TSDB_FUNC_TAG) {
|
||||||
|
@ -2615,14 +2610,16 @@ int32_t tableResultComparFn(const void *pLeft, const void *pRight, void *param)
|
||||||
|
|
||||||
SWindowResInfo *pWindowResInfo1 = &supporter->pTableQueryInfo[left]->windowResInfo;
|
SWindowResInfo *pWindowResInfo1 = &supporter->pTableQueryInfo[left]->windowResInfo;
|
||||||
SWindowResult * pWindowRes1 = getWindowResult(pWindowResInfo1, leftPos);
|
SWindowResult * pWindowRes1 = getWindowResult(pWindowResInfo1, leftPos);
|
||||||
|
tFilePage *page1 = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes1->pos.pageId);
|
||||||
|
|
||||||
char *b1 = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes1);
|
char *b1 = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes1, page1);
|
||||||
TSKEY leftTimestamp = GET_INT64_VAL(b1);
|
TSKEY leftTimestamp = GET_INT64_VAL(b1);
|
||||||
|
|
||||||
SWindowResInfo *pWindowResInfo2 = &supporter->pTableQueryInfo[right]->windowResInfo;
|
SWindowResInfo *pWindowResInfo2 = &supporter->pTableQueryInfo[right]->windowResInfo;
|
||||||
SWindowResult * pWindowRes2 = getWindowResult(pWindowResInfo2, rightPos);
|
SWindowResult * pWindowRes2 = getWindowResult(pWindowResInfo2, rightPos);
|
||||||
|
tFilePage *page2 = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes2->pos.pageId);
|
||||||
|
|
||||||
char *b2 = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes2);
|
char *b2 = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes2, page2);
|
||||||
TSKEY rightTimestamp = GET_INT64_VAL(b2);
|
TSKEY rightTimestamp = GET_INT64_VAL(b2);
|
||||||
|
|
||||||
if (leftTimestamp == rightTimestamp) {
|
if (leftTimestamp == rightTimestamp) {
|
||||||
|
@ -2685,35 +2682,26 @@ void copyResToQueryResultBuf(SQInfo *pQInfo, SQuery *pQuery) {
|
||||||
int32_t id = getGroupResultId(pQInfo->groupIndex - 1);
|
int32_t id = getGroupResultId(pQInfo->groupIndex - 1);
|
||||||
SIDList list = getDataBufPagesIdList(pResultBuf, pQInfo->offset + id);
|
SIDList list = getDataBufPagesIdList(pResultBuf, pQInfo->offset + id);
|
||||||
|
|
||||||
int32_t total = 0;
|
|
||||||
int32_t size = taosArrayGetSize(list);
|
int32_t size = taosArrayGetSize(list);
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
|
||||||
int32_t* pgId = taosArrayGet(list, i);
|
|
||||||
tFilePage *pData = getResBufPage(pResultBuf, *pgId);
|
|
||||||
total += pData->num;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t rows = total;
|
|
||||||
|
|
||||||
int32_t offset = 0;
|
int32_t offset = 0;
|
||||||
for (int32_t j = 0; j < size; ++j) {
|
for (int32_t j = 0; j < size; ++j) {
|
||||||
int32_t* pgId = taosArrayGet(list, j);
|
SPageInfo* pi = *(SPageInfo**) taosArrayGet(list, j);
|
||||||
tFilePage *pData = getResBufPage(pResultBuf, *pgId);
|
tFilePage *pData = getResBufPage(pResultBuf, pi->pageId);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes;
|
int32_t bytes = pRuntimeEnv->pCtx[i].outputBytes;
|
||||||
char * pDest = pQuery->sdata[i]->data;
|
char * pDest = pQuery->sdata[i]->data;
|
||||||
|
memcpy(pDest + offset * bytes, pData->data + pRuntimeEnv->offset[i] * pData->num, bytes * pData->num);
|
||||||
memcpy(pDest + offset * bytes, pData->data + pRuntimeEnv->offset[i] * pData->num,
|
|
||||||
bytes * pData->num);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// rows += pData->num;
|
||||||
offset += pData->num;
|
offset += pData->num;
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pQuery->rec.rows == 0);
|
assert(pQuery->rec.rows == 0);
|
||||||
|
|
||||||
pQuery->rec.rows += rows;
|
pQuery->rec.rows += offset;
|
||||||
pQInfo->offset += 1;
|
pQInfo->offset += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2777,7 +2765,6 @@ int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *pGroup) {
|
||||||
assert(pQInfo->numOfGroupResultPages == 0);
|
assert(pQInfo->numOfGroupResultPages == 0);
|
||||||
return 0;
|
return 0;
|
||||||
} else if (numOfTables == 1) { // no need to merge results since only one table in each group
|
} else if (numOfTables == 1) { // no need to merge results since only one table in each group
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SCompSupporter cs = {pTableList, posList, pQInfo};
|
SCompSupporter cs = {pTableList, posList, pQInfo};
|
||||||
|
@ -2802,8 +2789,9 @@ int32_t mergeIntoGroupResultImpl(SQInfo *pQInfo, SArray *pGroup) {
|
||||||
|
|
||||||
SWindowResInfo *pWindowResInfo = &pTableList[pos]->windowResInfo;
|
SWindowResInfo *pWindowResInfo = &pTableList[pos]->windowResInfo;
|
||||||
SWindowResult * pWindowRes = getWindowResult(pWindowResInfo, cs.position[pos]);
|
SWindowResult * pWindowRes = getWindowResult(pWindowResInfo, cs.position[pos]);
|
||||||
|
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes->pos.pageId);
|
||||||
|
|
||||||
char *b = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes);
|
char *b = getPosInResultPage(pRuntimeEnv, PRIMARYKEY_TIMESTAMP_COL_INDEX, pWindowRes, page);
|
||||||
TSKEY ts = GET_INT64_VAL(b);
|
TSKEY ts = GET_INT64_VAL(b);
|
||||||
|
|
||||||
assert(ts == pWindowRes->window.skey);
|
assert(ts == pWindowRes->window.skey);
|
||||||
|
@ -3517,9 +3505,11 @@ void setWindowResOutputBuf(SQueryRuntimeEnv *pRuntimeEnv, SWindowResult *pResult
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
|
|
||||||
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
||||||
|
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pResult->pos.pageId);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
||||||
pCtx->aOutputBuf = getPosInResultPage(pRuntimeEnv, i, pResult);
|
pCtx->aOutputBuf = getPosInResultPage(pRuntimeEnv, i, pResult, page);
|
||||||
|
|
||||||
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
int32_t functionId = pQuery->pSelectExpr[i].base.functionId;
|
||||||
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
|
if (functionId == TSDB_FUNC_TOP || functionId == TSDB_FUNC_BOTTOM || functionId == TSDB_FUNC_DIFF) {
|
||||||
|
@ -3542,6 +3532,8 @@ void setWindowResOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SWindowResult *
|
||||||
SQuery *pQuery = pRuntimeEnv->pQuery;
|
SQuery *pQuery = pRuntimeEnv->pQuery;
|
||||||
|
|
||||||
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
// Note: pResult->pos[i]->num == 0, there is only fixed number of results for each group
|
||||||
|
tFilePage* bufPage = getResBufPage(pRuntimeEnv->pResultBuf, pResult->pos.pageId);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfOutput; ++i) {
|
||||||
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
SQLFunctionCtx *pCtx = &pRuntimeEnv->pCtx[i];
|
||||||
|
|
||||||
|
@ -3550,7 +3542,7 @@ void setWindowResOutputBufInitCtx(SQueryRuntimeEnv *pRuntimeEnv, SWindowResult *
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
pCtx->aOutputBuf = getPosInResultPage(pRuntimeEnv, i, pResult);
|
pCtx->aOutputBuf = getPosInResultPage(pRuntimeEnv, i, pResult, bufPage);
|
||||||
pCtx->currentStage = 0;
|
pCtx->currentStage = 0;
|
||||||
|
|
||||||
int32_t functionId = pCtx->functionId;
|
int32_t functionId = pCtx->functionId;
|
||||||
|
@ -3713,11 +3705,13 @@ static int32_t doCopyToSData(SQInfo *pQInfo, SWindowResInfo *pResultInfo, int32_
|
||||||
pQInfo->groupIndex += 1;
|
pQInfo->groupIndex += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, result[i].pos.pageId);
|
||||||
|
|
||||||
for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
for (int32_t j = 0; j < pQuery->numOfOutput; ++j) {
|
||||||
int32_t size = pRuntimeEnv->pCtx[j].outputBytes;
|
int32_t size = pRuntimeEnv->pCtx[j].outputBytes;
|
||||||
|
|
||||||
char *out = pQuery->sdata[j]->data + numOfResult * size;
|
char *out = pQuery->sdata[j]->data + numOfResult * size;
|
||||||
char *in = getPosInResultPage(pRuntimeEnv, j, &result[i]);
|
char *in = getPosInResultPage(pRuntimeEnv, j, &result[i], page);
|
||||||
memcpy(out, in + oldOffset * size, size * numOfRowsToCopy);
|
memcpy(out, in + oldOffset * size, size * numOfRowsToCopy);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4238,10 +4232,10 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
int32_t ps = DEFAULT_PAGE_SIZE;
|
int32_t ps = DEFAULT_PAGE_SIZE;
|
||||||
int32_t rowsize = 0;
|
int32_t rowsize = 0;
|
||||||
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
||||||
|
int32_t TWOMB = 1024*1024*2;
|
||||||
|
|
||||||
if (isSTableQuery && !onlyQueryTags(pRuntimeEnv->pQuery)) {
|
if (isSTableQuery && !onlyQueryTags(pRuntimeEnv->pQuery)) {
|
||||||
int32_t numOfPages = getInitialPageNum(pQInfo);
|
code = createDiskbasedResultBuffer(&pRuntimeEnv->pResultBuf, rowsize, ps, TWOMB, pQInfo);
|
||||||
code = createDiskbasedResultBuffer(&pRuntimeEnv->pResultBuf, numOfPages, rowsize, ps, numOfPages, pQInfo);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -4269,8 +4263,7 @@ int32_t doInitQInfo(SQInfo *pQInfo, STSBuf *pTsBuf, void *tsdb, int32_t vgId, bo
|
||||||
} else if (pRuntimeEnv->groupbyNormalCol || QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
} else if (pRuntimeEnv->groupbyNormalCol || QUERY_IS_INTERVAL_QUERY(pQuery)) {
|
||||||
int32_t numOfResultRows = getInitialPageNum(pQInfo);
|
int32_t numOfResultRows = getInitialPageNum(pQInfo);
|
||||||
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
getIntermediateBufInfo(pRuntimeEnv, &ps, &rowsize);
|
||||||
|
code = createDiskbasedResultBuffer(&pRuntimeEnv->pResultBuf, rowsize, ps, TWOMB, pQInfo);
|
||||||
code = createDiskbasedResultBuffer(&pRuntimeEnv->pResultBuf, numOfResultRows, rowsize, ps, numOfResultRows, pQInfo);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -5894,16 +5887,11 @@ static SQInfo *createQInfoImpl(SQueryTableMsg *pQueryMsg, SArray* pTableIdList,
|
||||||
}
|
}
|
||||||
|
|
||||||
pQInfo->arrTableIdInfo = taosArrayInit(tableIndex, sizeof(STableIdInfo));
|
pQInfo->arrTableIdInfo = taosArrayInit(tableIndex, sizeof(STableIdInfo));
|
||||||
|
pQInfo->dataReady = QUERY_RESULT_NOT_READY;
|
||||||
|
pthread_mutex_init(&pQInfo->lock, NULL);
|
||||||
|
|
||||||
pQuery->pos = -1;
|
pQuery->pos = -1;
|
||||||
pQuery->window = pQueryMsg->window;
|
pQuery->window = pQueryMsg->window;
|
||||||
|
|
||||||
if (sem_init(&pQInfo->dataReady, 0, 0) != 0) {
|
|
||||||
int32_t code = TAOS_SYSTEM_ERROR(errno);
|
|
||||||
qError("QInfo:%p init dataReady sem failed, reason:%s", pQInfo, tstrerror(code));
|
|
||||||
goto _cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
colIdCheck(pQuery);
|
colIdCheck(pQuery);
|
||||||
|
|
||||||
qDebug("qmsg:%p QInfo:%p created", pQueryMsg, pQInfo);
|
qDebug("qmsg:%p QInfo:%p created", pQueryMsg, pQInfo);
|
||||||
|
@ -5945,7 +5933,7 @@ static bool isValidQInfo(void *param) {
|
||||||
return (sig == (uint64_t)pQInfo);
|
return (sig == (uint64_t)pQInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQInfo *pQInfo, bool isSTable, void* param) {
|
static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQInfo *pQInfo, bool isSTable) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
|
|
||||||
|
@ -5965,18 +5953,12 @@ static int32_t initQInfo(SQueryTableMsg *pQueryMsg, void *tsdb, int32_t vgId, SQ
|
||||||
pQuery->window.ekey, pQuery->order.order);
|
pQuery->window.ekey, pQuery->order.order);
|
||||||
setQueryStatus(pQuery, QUERY_COMPLETED);
|
setQueryStatus(pQuery, QUERY_COMPLETED);
|
||||||
pQInfo->tableqinfoGroupInfo.numOfTables = 0;
|
pQInfo->tableqinfoGroupInfo.numOfTables = 0;
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
pQInfo->param = param;
|
|
||||||
|
|
||||||
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
||||||
qDebug("QInfo:%p no table qualified for tag filter, abort query", pQInfo);
|
qDebug("QInfo:%p no table qualified for tag filter, abort query", pQInfo);
|
||||||
setQueryStatus(pQuery, QUERY_COMPLETED);
|
setQueryStatus(pQuery, QUERY_COMPLETED);
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6018,7 +6000,6 @@ static void freeQInfo(SQInfo *pQInfo) {
|
||||||
tfree(pQuery->sdata[col]);
|
tfree(pQuery->sdata[col]);
|
||||||
}
|
}
|
||||||
|
|
||||||
sem_destroy(&(pQInfo->dataReady));
|
|
||||||
teardownQueryRuntimeEnv(&pQInfo->runtimeEnv);
|
teardownQueryRuntimeEnv(&pQInfo->runtimeEnv);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pQuery->numOfFilterCols; ++i) {
|
for (int32_t i = 0; i < pQuery->numOfFilterCols; ++i) {
|
||||||
|
@ -6170,7 +6151,7 @@ typedef struct SQueryMgmt {
|
||||||
pthread_mutex_t lock;
|
pthread_mutex_t lock;
|
||||||
} SQueryMgmt;
|
} SQueryMgmt;
|
||||||
|
|
||||||
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, void* param, qinfo_t* pQInfo) {
|
int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, qinfo_t* pQInfo) {
|
||||||
assert(pQueryMsg != NULL && tsdb != NULL);
|
assert(pQueryMsg != NULL && tsdb != NULL);
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
@ -6266,7 +6247,7 @@ int32_t qCreateQueryInfo(void* tsdb, int32_t vgId, SQueryTableMsg* pQueryMsg, vo
|
||||||
goto _over;
|
goto _over;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = initQInfo(pQueryMsg, tsdb, vgId, *pQInfo, isSTableQuery, param);
|
code = initQInfo(pQueryMsg, tsdb, vgId, *pQInfo, isSTableQuery);
|
||||||
|
|
||||||
_over:
|
_over:
|
||||||
free(tagCond);
|
free(tagCond);
|
||||||
|
@ -6306,24 +6287,32 @@ void qDestroyQueryInfo(qinfo_t qHandle) {
|
||||||
freeQInfo(pQInfo);
|
freeQInfo(pQInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void qTableQuery(qinfo_t qinfo) {
|
static void setQueryResultReady(SQInfo* pQInfo) {
|
||||||
|
pthread_mutex_lock(&pQInfo->lock);
|
||||||
|
pQInfo->dataReady = QUERY_RESULT_READY;
|
||||||
|
pthread_mutex_unlock(&pQInfo->lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
bool qTableQuery(qinfo_t qinfo) {
|
||||||
SQInfo *pQInfo = (SQInfo *)qinfo;
|
SQInfo *pQInfo = (SQInfo *)qinfo;
|
||||||
|
|
||||||
if (pQInfo == NULL || pQInfo->signature != pQInfo) {
|
if (pQInfo == NULL || pQInfo->signature != pQInfo) {
|
||||||
qDebug("QInfo:%p has been freed, no need to execute", pQInfo);
|
qDebug("QInfo:%p has been freed, no need to execute", pQInfo);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_QUERY_KILLED(pQInfo)) {
|
if (IS_QUERY_KILLED(pQInfo)) {
|
||||||
qDebug("QInfo:%p it is already killed, abort", pQInfo);
|
qDebug("QInfo:%p it is already killed, abort", pQInfo);
|
||||||
sem_post(&pQInfo->dataReady);
|
setQueryResultReady(pQInfo);
|
||||||
return;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
if (pQInfo->tableqinfoGroupInfo.numOfTables == 0) {
|
||||||
|
setQueryStatus(pQInfo->runtimeEnv.pQuery, QUERY_COMPLETED);
|
||||||
|
setQueryResultReady(pQInfo);
|
||||||
|
|
||||||
qDebug("QInfo:%p no table exists for query, abort", pQInfo);
|
qDebug("QInfo:%p no table exists for query, abort", pQInfo);
|
||||||
sem_post(&pQInfo->dataReady);
|
return false;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// error occurs, record the error code and return to client
|
// error occurs, record the error code and return to client
|
||||||
|
@ -6331,8 +6320,9 @@ void qTableQuery(qinfo_t qinfo) {
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
pQInfo->code = ret;
|
pQInfo->code = ret;
|
||||||
qDebug("QInfo:%p query abort due to error/cancel occurs, code:%s", pQInfo, tstrerror(pQInfo->code));
|
qDebug("QInfo:%p query abort due to error/cancel occurs, code:%s", pQInfo, tstrerror(pQInfo->code));
|
||||||
sem_post(&pQInfo->dataReady);
|
|
||||||
return;
|
setQueryResultReady(pQInfo);
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("QInfo:%p query task is launched", pQInfo);
|
qDebug("QInfo:%p query task is launched", pQInfo);
|
||||||
|
@ -6357,10 +6347,20 @@ void qTableQuery(qinfo_t qinfo) {
|
||||||
pQInfo, pQuery->rec.rows, pQuery->rec.total + pQuery->rec.rows);
|
pQInfo, pQuery->rec.rows, pQuery->rec.total + pQuery->rec.rows);
|
||||||
}
|
}
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
bool buildRes = false;
|
||||||
|
pthread_mutex_lock(&pQInfo->lock);
|
||||||
|
pQInfo->dataReady = QUERY_RESULT_READY;
|
||||||
|
|
||||||
|
if (pQInfo->rspContext != NULL) {
|
||||||
|
buildRes = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&pQInfo->lock);
|
||||||
|
return buildRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qRetrieveQueryResultInfo(qinfo_t qinfo) {
|
int32_t qRetrieveQueryResultInfo(qinfo_t qinfo, bool* buildRes, void* pRspContext) {
|
||||||
SQInfo *pQInfo = (SQInfo *)qinfo;
|
SQInfo *pQInfo = (SQInfo *)qinfo;
|
||||||
|
|
||||||
if (pQInfo == NULL || !isValidQInfo(pQInfo)) {
|
if (pQInfo == NULL || !isValidQInfo(pQInfo)) {
|
||||||
|
@ -6373,11 +6373,21 @@ int32_t qRetrieveQueryResultInfo(qinfo_t qinfo) {
|
||||||
return pQInfo->code;
|
return pQInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
sem_wait(&pQInfo->dataReady);
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
qDebug("QInfo:%p retrieve result info, rowsize:%d, rows:%"PRId64", code:%d", pQInfo, pQuery->rowSize, pQuery->rec.rows,
|
pthread_mutex_lock(&pQInfo->lock);
|
||||||
pQInfo->code);
|
if (pQInfo->dataReady == QUERY_RESULT_READY) {
|
||||||
|
*buildRes = true;
|
||||||
|
qDebug("QInfo:%p retrieve result info, rowsize:%d, rows:%"PRId64", code:%d", pQInfo, pQuery->rowSize, pQuery->rec.rows,
|
||||||
|
pQInfo->code);
|
||||||
|
} else {
|
||||||
|
*buildRes = false;
|
||||||
|
qDebug("QInfo:%p retrieve req set query return result after paused", pQInfo);
|
||||||
|
pQInfo->rspContext = pRspContext;
|
||||||
|
}
|
||||||
|
|
||||||
return pQInfo->code;
|
code = pQInfo->code;
|
||||||
|
pthread_mutex_unlock(&pQInfo->lock);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool qHasMoreResultsToRetrieve(qinfo_t qinfo) {
|
bool qHasMoreResultsToRetrieve(qinfo_t qinfo) {
|
||||||
|
@ -6389,6 +6399,7 @@ bool qHasMoreResultsToRetrieve(qinfo_t qinfo) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
|
|
||||||
bool ret = false;
|
bool ret = false;
|
||||||
if (Q_STATUS_EQUAL(pQuery->status, QUERY_OVER)) {
|
if (Q_STATUS_EQUAL(pQuery->status, QUERY_OVER)) {
|
||||||
ret = false;
|
ret = false;
|
||||||
|
@ -6407,7 +6418,7 @@ bool qHasMoreResultsToRetrieve(qinfo_t qinfo) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *contLen) {
|
int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *contLen, bool* continueExec) {
|
||||||
SQInfo *pQInfo = (SQInfo *)qinfo;
|
SQInfo *pQInfo = (SQInfo *)qinfo;
|
||||||
|
|
||||||
if (pQInfo == NULL || !isValidQInfo(pQInfo)) {
|
if (pQInfo == NULL || !isValidQInfo(pQInfo)) {
|
||||||
|
@ -6417,8 +6428,10 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
|
||||||
SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv;
|
SQueryRuntimeEnv* pRuntimeEnv = &pQInfo->runtimeEnv;
|
||||||
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
SQuery *pQuery = pQInfo->runtimeEnv.pQuery;
|
||||||
size_t size = getResultSize(pQInfo, &pQuery->rec.rows);
|
size_t size = getResultSize(pQInfo, &pQuery->rec.rows);
|
||||||
|
|
||||||
size += sizeof(int32_t);
|
size += sizeof(int32_t);
|
||||||
size += sizeof(STableIdInfo) * taosArrayGetSize(pQInfo->arrTableIdInfo);
|
size += sizeof(STableIdInfo) * taosArrayGetSize(pQInfo->arrTableIdInfo);
|
||||||
|
|
||||||
*contLen = size + sizeof(SRetrieveTableRsp);
|
*contLen = size + sizeof(SRetrieveTableRsp);
|
||||||
|
|
||||||
// todo proper handle failed to allocate memory,
|
// todo proper handle failed to allocate memory,
|
||||||
|
@ -6427,6 +6440,7 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
|
||||||
if (*pRsp == NULL) {
|
if (*pRsp == NULL) {
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*pRsp)->numOfRows = htonl(pQuery->rec.rows);
|
(*pRsp)->numOfRows = htonl(pQuery->rec.rows);
|
||||||
|
|
||||||
int32_t code = pQInfo->code;
|
int32_t code = pQInfo->code;
|
||||||
|
@ -6434,8 +6448,8 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
|
||||||
(*pRsp)->offset = htobe64(pQuery->limit.offset);
|
(*pRsp)->offset = htobe64(pQuery->limit.offset);
|
||||||
(*pRsp)->useconds = htobe64(pRuntimeEnv->summary.elapsedTime);
|
(*pRsp)->useconds = htobe64(pRuntimeEnv->summary.elapsedTime);
|
||||||
} else {
|
} else {
|
||||||
(*pRsp)->offset = 0;
|
|
||||||
(*pRsp)->useconds = 0;
|
(*pRsp)->useconds = 0;
|
||||||
|
(*pRsp)->offset = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
(*pRsp)->precision = htons(pQuery->precision);
|
(*pRsp)->precision = htons(pQuery->precision);
|
||||||
|
@ -6446,10 +6460,20 @@ int32_t qDumpRetrieveResult(qinfo_t qinfo, SRetrieveTableRsp **pRsp, int32_t *co
|
||||||
code = pQInfo->code;
|
code = pQInfo->code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pQInfo->rspContext = NULL;
|
||||||
|
pQInfo->dataReady = QUERY_RESULT_NOT_READY;
|
||||||
|
|
||||||
if (IS_QUERY_KILLED(pQInfo) || Q_STATUS_EQUAL(pQuery->status, QUERY_OVER)) {
|
if (IS_QUERY_KILLED(pQInfo) || Q_STATUS_EQUAL(pQuery->status, QUERY_OVER)) {
|
||||||
(*pRsp)->completed = 1; // notify no more result to client
|
(*pRsp)->completed = 1; // notify no more result to client
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (qHasMoreResultsToRetrieve(pQInfo)) {
|
||||||
|
*continueExec = true;
|
||||||
|
} else { // failed to dump result, free qhandle immediately
|
||||||
|
*continueExec = false;
|
||||||
|
qKillQuery(pQInfo);
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6460,7 +6484,7 @@ int32_t qKillQuery(qinfo_t qinfo) {
|
||||||
return TSDB_CODE_QRY_INVALID_QHANDLE;
|
return TSDB_CODE_QRY_INVALID_QHANDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
sem_post(&pQInfo->dataReady);
|
// sem_post(&pQInfo->dataReady);
|
||||||
setQueryKilled(pQInfo);
|
setQueryKilled(pQInfo);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -6607,6 +6631,13 @@ static void buildTagQueryResult(SQInfo* pQInfo) {
|
||||||
setQueryStatus(pQuery, QUERY_COMPLETED);
|
setQueryStatus(pQuery, QUERY_COMPLETED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void* qGetResultRetrieveMsg(qinfo_t qinfo) {
|
||||||
|
SQInfo* pQInfo = (SQInfo*) qinfo;
|
||||||
|
assert(pQInfo != NULL);
|
||||||
|
|
||||||
|
return pQInfo->rspContext;
|
||||||
|
}
|
||||||
|
|
||||||
void freeqinfoFn(void *qhandle) {
|
void freeqinfoFn(void *qhandle) {
|
||||||
void** handle = qhandle;
|
void** handle = qhandle;
|
||||||
if (handle == NULL || *handle == NULL) {
|
if (handle == NULL || *handle == NULL) {
|
||||||
|
@ -6618,19 +6649,21 @@ void freeqinfoFn(void *qhandle) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void* qOpenQueryMgmt(int32_t vgId) {
|
void* qOpenQueryMgmt(int32_t vgId) {
|
||||||
const int32_t REFRESH_HANDLE_INTERVAL = 2; // every 2 seconds, refresh handle pool
|
const int32_t REFRESH_HANDLE_INTERVAL = 30; // every 30 seconds, refresh handle pool
|
||||||
|
|
||||||
char cacheName[128] = {0};
|
char cacheName[128] = {0};
|
||||||
sprintf(cacheName, "qhandle_%d", vgId);
|
sprintf(cacheName, "qhandle_%d", vgId);
|
||||||
|
|
||||||
SQueryMgmt* pQueryHandle = calloc(1, sizeof(SQueryMgmt));
|
SQueryMgmt* pQueryMgmt = calloc(1, sizeof(SQueryMgmt));
|
||||||
|
|
||||||
pQueryHandle->qinfoPool = taosCacheInit(TSDB_DATA_TYPE_BIGINT, REFRESH_HANDLE_INTERVAL, true, freeqinfoFn, cacheName);
|
pQueryMgmt->qinfoPool = taosCacheInit(TSDB_DATA_TYPE_BIGINT, REFRESH_HANDLE_INTERVAL, true, freeqinfoFn, cacheName);
|
||||||
pQueryHandle->closed = false;
|
pQueryMgmt->closed = false;
|
||||||
pthread_mutex_init(&pQueryHandle->lock, NULL);
|
pQueryMgmt->vgId = vgId;
|
||||||
|
|
||||||
|
pthread_mutex_init(&pQueryMgmt->lock, NULL);
|
||||||
|
|
||||||
qDebug("vgId:%d, open querymgmt success", vgId);
|
qDebug("vgId:%d, open querymgmt success", vgId);
|
||||||
return pQueryHandle;
|
return pQueryMgmt;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void queryMgmtKillQueryFn(void* handle) {
|
static void queryMgmtKillQueryFn(void* handle) {
|
||||||
|
@ -6670,7 +6703,7 @@ void qCleanupQueryMgmt(void* pQMgmt) {
|
||||||
pthread_mutex_destroy(&pQueryMgmt->lock);
|
pthread_mutex_destroy(&pQueryMgmt->lock);
|
||||||
tfree(pQueryMgmt);
|
tfree(pQueryMgmt);
|
||||||
|
|
||||||
qDebug("vgId:%d querymgmt cleanup completed", vgId);
|
qDebug("vgId:%d queryMgmt cleanup completed", vgId);
|
||||||
}
|
}
|
||||||
|
|
||||||
void** qRegisterQInfo(void* pMgmt, uint64_t qInfo) {
|
void** qRegisterQInfo(void* pMgmt, uint64_t qInfo) {
|
||||||
|
@ -6727,3 +6760,4 @@ void** qReleaseQInfo(void* pMgmt, void* pQInfo, bool needFree) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -28,10 +28,10 @@
|
||||||
/*
|
/*
|
||||||
* SColumnModel is deeply copy
|
* SColumnModel is deeply copy
|
||||||
*/
|
*/
|
||||||
tExtMemBuffer* createExtMemBuffer(int32_t inMemSize, int32_t elemSize, SColumnModel *pModel) {
|
tExtMemBuffer* createExtMemBuffer(int32_t inMemSize, int32_t elemSize, int32_t pagesize, SColumnModel *pModel) {
|
||||||
tExtMemBuffer* pMemBuffer = (tExtMemBuffer *)calloc(1, sizeof(tExtMemBuffer));
|
tExtMemBuffer* pMemBuffer = (tExtMemBuffer *)calloc(1, sizeof(tExtMemBuffer));
|
||||||
|
|
||||||
pMemBuffer->pageSize = DEFAULT_PAGE_SIZE;
|
pMemBuffer->pageSize = pagesize;
|
||||||
pMemBuffer->inMemCapacity = ALIGN8(inMemSize) / pMemBuffer->pageSize;
|
pMemBuffer->inMemCapacity = ALIGN8(inMemSize) / pMemBuffer->pageSize;
|
||||||
pMemBuffer->nElemSize = elemSize;
|
pMemBuffer->nElemSize = elemSize;
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "qsqlparser.h"
|
#include "qSqlparser.h"
|
||||||
#include "queryLog.h"
|
#include "queryLog.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "taosmsg.h"
|
#include "taosmsg.h"
|
||||||
|
|
|
@ -535,7 +535,7 @@ void tMemBucketPut(tMemBucket *pBucket, void *data, int32_t numOfRows) {
|
||||||
|
|
||||||
if (pSeg->pBuffer[slotIdx] == NULL) {
|
if (pSeg->pBuffer[slotIdx] == NULL) {
|
||||||
pSeg->pBuffer[slotIdx] = createExtMemBuffer(pBucket->numOfTotalPages * pBucket->pageSize, pBucket->nElemSize,
|
pSeg->pBuffer[slotIdx] = createExtMemBuffer(pBucket->numOfTotalPages * pBucket->pageSize, pBucket->nElemSize,
|
||||||
pBucket->pOrderDesc->pColumnModel);
|
pBucket->pageSize, pBucket->pOrderDesc->pColumnModel);
|
||||||
pSeg->pBuffer[slotIdx]->flushModel = SINGLE_APPEND_MODEL;
|
pSeg->pBuffer[slotIdx]->flushModel = SINGLE_APPEND_MODEL;
|
||||||
pBucket->pOrderDesc->pColumnModel->capacity = pSeg->pBuffer[slotIdx]->numOfElemsPerPage;
|
pBucket->pOrderDesc->pColumnModel->capacity = pSeg->pBuffer[slotIdx]->numOfElemsPerPage;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,221 +1,439 @@
|
||||||
#include "qResultbuf.h"
|
#include "qResultbuf.h"
|
||||||
|
#include "stddef.h"
|
||||||
|
#include "tscompression.h"
|
||||||
#include "hash.h"
|
#include "hash.h"
|
||||||
#include "qExtbuffer.h"
|
#include "qExtbuffer.h"
|
||||||
#include "queryLog.h"
|
#include "queryLog.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
|
||||||
int32_t createDiskbasedResultBuffer(SDiskbasedResultBuf** pResultBuf, int32_t numOfPages, int32_t rowSize,
|
#define GET_DATA_PAYLOAD(_p) ((_p)->pData + POINTER_BYTES)
|
||||||
int32_t pagesize, int32_t inMemPages, void* handle) {
|
|
||||||
|
|
||||||
|
int32_t createDiskbasedResultBuffer(SDiskbasedResultBuf** pResultBuf, int32_t rowSize, int32_t pagesize,
|
||||||
|
int32_t inMemBufSize, const void* handle) {
|
||||||
*pResultBuf = calloc(1, sizeof(SDiskbasedResultBuf));
|
*pResultBuf = calloc(1, sizeof(SDiskbasedResultBuf));
|
||||||
|
|
||||||
SDiskbasedResultBuf* pResBuf = *pResultBuf;
|
SDiskbasedResultBuf* pResBuf = *pResultBuf;
|
||||||
if (pResBuf == NULL) {
|
if (pResBuf == NULL) {
|
||||||
return TSDB_CODE_COM_OUT_OF_MEMORY;
|
return TSDB_CODE_COM_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pResBuf->pageSize = pagesize;
|
pResBuf->pageSize = pagesize;
|
||||||
pResBuf->numOfPages = inMemPages; // all pages are in buffer in the first place
|
pResBuf->numOfPages = 0; // all pages are in buffer in the first place
|
||||||
pResBuf->inMemPages = inMemPages;
|
pResBuf->totalBufSize = 0;
|
||||||
assert(inMemPages <= numOfPages);
|
pResBuf->inMemPages = inMemBufSize/pagesize; // maximum allowed pages, it is a soft limit.
|
||||||
|
pResBuf->allocateId = -1;
|
||||||
|
pResBuf->comp = true;
|
||||||
|
pResBuf->file = NULL;
|
||||||
|
pResBuf->handle = handle;
|
||||||
|
pResBuf->fileSize = 0;
|
||||||
|
|
||||||
|
// at least more than 2 pages must be in memory
|
||||||
|
assert(inMemBufSize >= pagesize * 2);
|
||||||
|
|
||||||
pResBuf->numOfRowsPerPage = (pagesize - sizeof(tFilePage)) / rowSize;
|
pResBuf->numOfRowsPerPage = (pagesize - sizeof(tFilePage)) / rowSize;
|
||||||
|
pResBuf->lruList = tdListNew(POINTER_BYTES);
|
||||||
pResBuf->totalBufSize = pResBuf->numOfPages * pagesize;
|
|
||||||
pResBuf->incStep = 4;
|
|
||||||
pResBuf->allocateId = -1;
|
|
||||||
|
|
||||||
pResBuf->iBuf = calloc(pResBuf->inMemPages, pResBuf->pageSize);
|
|
||||||
|
|
||||||
// init id hash table
|
// init id hash table
|
||||||
pResBuf->idsTable = taosHashInit(numOfPages, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false);
|
pResBuf->groupSet = taosHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false);
|
||||||
pResBuf->list = taosArrayInit(numOfPages, POINTER_BYTES);
|
pResBuf->assistBuf = malloc(pResBuf->pageSize + 2); // EXTRA BYTES
|
||||||
|
pResBuf->all = taosHashInit(10, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false);
|
||||||
|
|
||||||
char path[PATH_MAX] = {0};
|
char path[PATH_MAX] = {0};
|
||||||
getTmpfilePath("tsdb_qbuf", path);
|
getTmpfilePath("qbuf", path);
|
||||||
pResBuf->path = strdup(path);
|
pResBuf->path = strdup(path);
|
||||||
|
|
||||||
pResBuf->fd = FD_INITIALIZER;
|
|
||||||
pResBuf->pBuf = NULL;
|
|
||||||
pResBuf->emptyDummyIdList = taosArrayInit(1, sizeof(int32_t));
|
pResBuf->emptyDummyIdList = taosArrayInit(1, sizeof(int32_t));
|
||||||
|
|
||||||
qDebug("QInfo:%p create resBuf for output, page size:%d, initial pages:%d, %" PRId64 "bytes", handle,
|
qDebug("QInfo:%p create resBuf for output, page size:%d, inmem buf pages:%d, file:%s", handle, pResBuf->pageSize,
|
||||||
pResBuf->pageSize, pResBuf->numOfPages, pResBuf->totalBufSize);
|
pResBuf->inMemPages, pResBuf->path);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getNumOfResultBufGroupId(SDiskbasedResultBuf* pResultBuf) { return taosHashGetSize(pResultBuf->idsTable); }
|
static int32_t createDiskFile(SDiskbasedResultBuf* pResultBuf) {
|
||||||
|
pResultBuf->file = fopen(pResultBuf->path, "wb+");
|
||||||
int32_t getResBufSize(SDiskbasedResultBuf* pResultBuf) { return pResultBuf->totalBufSize; }
|
if (pResultBuf->file == NULL) {
|
||||||
|
|
||||||
#define NUM_OF_PAGES_ON_DISK(_r) ((_r)->numOfPages - (_r)->inMemPages)
|
|
||||||
#define FILE_SIZE_ON_DISK(_r) (NUM_OF_PAGES_ON_DISK(_r) * (_r)->pageSize)
|
|
||||||
|
|
||||||
static int32_t createDiskResidesBuf(SDiskbasedResultBuf* pResultBuf) {
|
|
||||||
pResultBuf->fd = open(pResultBuf->path, O_CREAT | O_RDWR | O_TRUNC, 0666);
|
|
||||||
if (!FD_VALID(pResultBuf->fd)) {
|
|
||||||
qError("failed to create tmp file: %s on disk. %s", pResultBuf->path, strerror(errno));
|
qError("failed to create tmp file: %s on disk. %s", pResultBuf->path, strerror(errno));
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
return TAOS_SYSTEM_ERROR(errno);
|
||||||
}
|
}
|
||||||
|
|
||||||
assert(pResultBuf->numOfPages == pResultBuf->inMemPages);
|
|
||||||
pResultBuf->numOfPages += pResultBuf->incStep;
|
|
||||||
|
|
||||||
int32_t ret = ftruncate(pResultBuf->fd, NUM_OF_PAGES_ON_DISK(pResultBuf) * pResultBuf->pageSize);
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
|
||||||
qError("failed to create tmp file: %s on disk. %s", pResultBuf->path, strerror(errno));
|
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
pResultBuf->pBuf = mmap(NULL, FILE_SIZE_ON_DISK(pResultBuf), PROT_READ | PROT_WRITE, MAP_SHARED, pResultBuf->fd, 0);
|
|
||||||
if (pResultBuf->pBuf == MAP_FAILED) {
|
|
||||||
qError("QInfo:%p failed to map temp file: %s. %s", pResultBuf->handle, pResultBuf->path, strerror(errno));
|
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
pResultBuf->totalBufSize = pResultBuf->numOfPages * pResultBuf->pageSize;
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t extendDiskFileSize(SDiskbasedResultBuf* pResultBuf, int32_t incNumOfPages) {
|
static char* doCompressData(void* data, int32_t srcSize, int32_t *dst, SDiskbasedResultBuf* pResultBuf) { // do nothing
|
||||||
assert(pResultBuf->numOfPages * pResultBuf->pageSize == pResultBuf->totalBufSize);
|
if (!pResultBuf->comp) {
|
||||||
int32_t ret = TSDB_CODE_SUCCESS;
|
*dst = srcSize;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
if (pResultBuf->pBuf == NULL) {
|
*dst = tsCompressString(data, srcSize, 1, pResultBuf->assistBuf, srcSize, ONE_STAGE_COMP, NULL, 0);
|
||||||
assert(pResultBuf->fd == FD_INITIALIZER);
|
|
||||||
|
|
||||||
if ((ret = createDiskResidesBuf(pResultBuf)) != TSDB_CODE_SUCCESS) {
|
memcpy(data, pResultBuf->assistBuf, *dst);
|
||||||
return ret;
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char* doDecompressData(void* data, int32_t srcSize, int32_t *dst, SDiskbasedResultBuf* pResultBuf) { // do nothing
|
||||||
|
if (!pResultBuf->comp) {
|
||||||
|
*dst = srcSize;
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
*dst = tsDecompressString(data, srcSize, 1, pResultBuf->assistBuf, pResultBuf->pageSize, ONE_STAGE_COMP, NULL, 0);
|
||||||
|
|
||||||
|
memcpy(data, pResultBuf->assistBuf, *dst);
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t allocatePositionInFile(SDiskbasedResultBuf* pResultBuf, size_t size) {
|
||||||
|
if (pResultBuf->pFree == NULL) {
|
||||||
|
return pResultBuf->nextPos;
|
||||||
|
} else {
|
||||||
|
int32_t offset = -1;
|
||||||
|
|
||||||
|
size_t num = taosArrayGetSize(pResultBuf->pFree);
|
||||||
|
for(int32_t i = 0; i < num; ++i) {
|
||||||
|
SFreeListItem* pi = taosArrayGet(pResultBuf->pFree, i);
|
||||||
|
if (pi->len >= size) {
|
||||||
|
offset = pi->offset;
|
||||||
|
pi->offset += size;
|
||||||
|
pi->len -= size;
|
||||||
|
|
||||||
|
return offset;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// no available recycle space, allocate new area in file
|
||||||
|
return pResultBuf->nextPos;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static char* doFlushPageToDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
|
||||||
|
assert(!pg->used && pg->pData != NULL);
|
||||||
|
|
||||||
|
int32_t size = -1;
|
||||||
|
char* t = doCompressData(GET_DATA_PAYLOAD(pg), pResultBuf->pageSize, &size, pResultBuf);
|
||||||
|
|
||||||
|
// this page is flushed to disk for the first time
|
||||||
|
if (pg->info.offset == -1) {
|
||||||
|
pg->info.offset = allocatePositionInFile(pResultBuf, size);
|
||||||
|
pResultBuf->nextPos += size;
|
||||||
|
|
||||||
|
fseek(pResultBuf->file, pg->info.offset, SEEK_SET);
|
||||||
|
/*int32_t ret =*/ fwrite(t, 1, size, pResultBuf->file);
|
||||||
|
|
||||||
|
if (pResultBuf->fileSize < pg->info.offset + pg->info.length) {
|
||||||
|
pResultBuf->fileSize = pg->info.offset + pg->info.length;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
ret = munmap(pResultBuf->pBuf, FILE_SIZE_ON_DISK(pResultBuf));
|
// length becomes greater, current space is not enough, allocate new place, otherwise, do nothing
|
||||||
pResultBuf->numOfPages += incNumOfPages;
|
if (pg->info.length < size) {
|
||||||
|
// 1. add current space to free list
|
||||||
|
taosArrayPush(pResultBuf->pFree, &pg->info);
|
||||||
|
|
||||||
/*
|
// 2. allocate new position, and update the info
|
||||||
* disk-based output buffer is exhausted, try to extend the disk-based buffer, the available disk space may
|
pg->info.offset = allocatePositionInFile(pResultBuf, size);
|
||||||
* be insufficient
|
pResultBuf->nextPos += size;
|
||||||
*/
|
|
||||||
ret = ftruncate(pResultBuf->fd, NUM_OF_PAGES_ON_DISK(pResultBuf) * pResultBuf->pageSize);
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
|
||||||
// dError("QInfo:%p failed to create intermediate result output file:%s. %s", pQInfo, pSupporter->extBufFile,
|
|
||||||
// strerror(errno));
|
|
||||||
return TSDB_CODE_QRY_NO_DISKSPACE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pResultBuf->totalBufSize = pResultBuf->numOfPages * pResultBuf->pageSize;
|
//3. write to disk.
|
||||||
pResultBuf->pBuf = mmap(NULL, FILE_SIZE_ON_DISK(pResultBuf), PROT_READ | PROT_WRITE, MAP_SHARED, pResultBuf->fd, 0);
|
fseek(pResultBuf->file, pg->info.offset, SEEK_SET);
|
||||||
|
fwrite(t, size, 1, pResultBuf->file);
|
||||||
|
|
||||||
if (pResultBuf->pBuf == MAP_FAILED) {
|
if (pResultBuf->fileSize < pg->info.offset + pg->info.length) {
|
||||||
// dError("QInfo:%p failed to map temp file: %s. %s", pQInfo, pSupporter->extBufFile, strerror(errno));
|
pResultBuf->fileSize = pg->info.offset + pg->info.length;
|
||||||
return TSDB_CODE_QRY_OUT_OF_MEMORY;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
char* ret = pg->pData;
|
||||||
|
memset(ret, 0, pResultBuf->pageSize);
|
||||||
|
|
||||||
|
pg->pData = NULL;
|
||||||
|
pg->info.length = size;
|
||||||
|
|
||||||
|
pResultBuf->statis.flushBytes += pg->info.length;
|
||||||
|
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define NO_AVAILABLE_PAGES(_b) ((_b)->allocateId == (_b)->numOfPages - 1)
|
static char* flushPageToDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
|
||||||
|
int32_t ret = TSDB_CODE_SUCCESS;
|
||||||
|
assert(pResultBuf->numOfPages * pResultBuf->pageSize == pResultBuf->totalBufSize && pResultBuf->numOfPages >= pResultBuf->inMemPages);
|
||||||
|
|
||||||
static FORCE_INLINE int32_t getGroupIndex(SDiskbasedResultBuf* pResultBuf, int32_t groupId) {
|
if (pResultBuf->file == NULL) {
|
||||||
assert(pResultBuf != NULL);
|
if ((ret = createDiskFile(pResultBuf)) != TSDB_CODE_SUCCESS) {
|
||||||
|
terrno = ret;
|
||||||
char* p = taosHashGet(pResultBuf->idsTable, (const char*)&groupId, sizeof(int32_t));
|
|
||||||
if (p == NULL) { // it is a new group id
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t slot = GET_INT32_VAL(p);
|
|
||||||
assert(slot >= 0 && slot < taosHashGetSize(pResultBuf->idsTable));
|
|
||||||
|
|
||||||
return slot;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t addNewGroupId(SDiskbasedResultBuf* pResultBuf, int32_t groupId) {
|
|
||||||
int32_t num = getNumOfResultBufGroupId(pResultBuf); // the num is the newest allocated group id slot
|
|
||||||
taosHashPut(pResultBuf->idsTable, (const char*)&groupId, sizeof(int32_t), &num, sizeof(int32_t));
|
|
||||||
|
|
||||||
SArray* pa = taosArrayInit(1, sizeof(int32_t));
|
|
||||||
taosArrayPush(pResultBuf->list, &pa);
|
|
||||||
|
|
||||||
assert(taosArrayGetSize(pResultBuf->list) == taosHashGetSize(pResultBuf->idsTable));
|
|
||||||
return num;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void registerPageId(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32_t pageId) {
|
|
||||||
int32_t slot = getGroupIndex(pResultBuf, groupId);
|
|
||||||
if (slot < 0) {
|
|
||||||
slot = addNewGroupId(pResultBuf, groupId);
|
|
||||||
}
|
|
||||||
|
|
||||||
SIDList pList = taosArrayGetP(pResultBuf->list, slot);
|
|
||||||
taosArrayPush(pList, &pageId);
|
|
||||||
}
|
|
||||||
|
|
||||||
tFilePage* getNewDataBuf(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32_t* pageId) {
|
|
||||||
if (NO_AVAILABLE_PAGES(pResultBuf)) {
|
|
||||||
if (extendDiskFileSize(pResultBuf, pResultBuf->incStep) != TSDB_CODE_SUCCESS) {
|
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// register new id in this group
|
return doFlushPageToDisk(pResultBuf, pg);
|
||||||
*pageId = (++pResultBuf->allocateId);
|
|
||||||
registerPageId(pResultBuf, groupId, *pageId);
|
|
||||||
|
|
||||||
// clear memory for the new page
|
|
||||||
tFilePage* page = getResBufPage(pResultBuf, *pageId);
|
|
||||||
memset(page, 0, pResultBuf->pageSize);
|
|
||||||
|
|
||||||
return page;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getNumOfRowsPerPage(SDiskbasedResultBuf* pResultBuf) { return pResultBuf->numOfRowsPerPage; }
|
// load file block data in disk
|
||||||
|
static char* loadPageFromDisk(SDiskbasedResultBuf* pResultBuf, SPageInfo* pg) {
|
||||||
|
int32_t ret = fseek(pResultBuf->file, pg->info.offset, SEEK_SET);
|
||||||
|
ret = fread(GET_DATA_PAYLOAD(pg), 1, pg->info.length, pResultBuf->file);
|
||||||
|
if (ret != pg->info.length) {
|
||||||
|
terrno = errno;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
SIDList getDataBufPagesIdList(SDiskbasedResultBuf* pResultBuf, int32_t groupId) {
|
pResultBuf->statis.loadBytes += pg->info.length;
|
||||||
int32_t slot = getGroupIndex(pResultBuf, groupId);
|
|
||||||
if (slot < 0) {
|
int32_t fullSize = 0;
|
||||||
return pResultBuf->emptyDummyIdList;
|
doDecompressData(GET_DATA_PAYLOAD(pg), pg->info.length, &fullSize, pResultBuf);
|
||||||
|
|
||||||
|
return GET_DATA_PAYLOAD(pg);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define NO_AVAILABLE_PAGES(_b) ((_b)->numOfPages >= (_b)->inMemPages)
|
||||||
|
|
||||||
|
static SIDList addNewGroup(SDiskbasedResultBuf* pResultBuf, int32_t groupId) {
|
||||||
|
assert(taosHashGet(pResultBuf->groupSet, (const char*) &groupId, sizeof(int32_t)) == NULL);
|
||||||
|
|
||||||
|
SArray* pa = taosArrayInit(1, POINTER_BYTES);
|
||||||
|
int32_t ret = taosHashPut(pResultBuf->groupSet, (const char*)&groupId, sizeof(int32_t), &pa, POINTER_BYTES);
|
||||||
|
assert(ret == 0);
|
||||||
|
|
||||||
|
return pa;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SPageInfo* registerPage(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32_t pageId) {
|
||||||
|
SIDList list = NULL;
|
||||||
|
|
||||||
|
char** p = taosHashGet(pResultBuf->groupSet, (const char*)&groupId, sizeof(int32_t));
|
||||||
|
if (p == NULL) { // it is a new group id
|
||||||
|
list = addNewGroup(pResultBuf, groupId);
|
||||||
} else {
|
} else {
|
||||||
return taosArrayGetP(pResultBuf->list, slot);
|
list = (SIDList) (*p);
|
||||||
|
}
|
||||||
|
|
||||||
|
pResultBuf->numOfPages += 1;
|
||||||
|
|
||||||
|
SPageInfo* ppi = malloc(sizeof(SPageInfo));//{ .info = PAGE_INFO_INITIALIZER, .pageId = pageId, .pn = NULL};
|
||||||
|
ppi->info = PAGE_INFO_INITIALIZER;
|
||||||
|
ppi->pageId = pageId;
|
||||||
|
ppi->pData = NULL;
|
||||||
|
ppi->pn = NULL;
|
||||||
|
ppi->used = true;
|
||||||
|
|
||||||
|
return *(SPageInfo**) taosArrayPush(list, &ppi);
|
||||||
|
}
|
||||||
|
|
||||||
|
static SListNode* getEldestUnrefedPage(SDiskbasedResultBuf* pResultBuf) {
|
||||||
|
SListIter iter = {0};
|
||||||
|
tdListInitIter(pResultBuf->lruList, &iter, TD_LIST_BACKWARD);
|
||||||
|
|
||||||
|
SListNode* pn = NULL;
|
||||||
|
while((pn = tdListNext(&iter)) != NULL) {
|
||||||
|
assert(pn != NULL);
|
||||||
|
|
||||||
|
SPageInfo* pageInfo = *(SPageInfo**) pn->data;
|
||||||
|
assert(pageInfo->pageId >= 0 && pageInfo->pn == pn);
|
||||||
|
|
||||||
|
if (!pageInfo->used) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return pn;
|
||||||
|
}
|
||||||
|
|
||||||
|
static char* evicOneDataPage(SDiskbasedResultBuf* pResultBuf) {
|
||||||
|
char* bufPage = NULL;
|
||||||
|
SListNode* pn = getEldestUnrefedPage(pResultBuf);
|
||||||
|
|
||||||
|
// all pages are referenced by user, try to allocate new space
|
||||||
|
if (pn == NULL) {
|
||||||
|
int32_t prev = pResultBuf->inMemPages;
|
||||||
|
pResultBuf->inMemPages = pResultBuf->inMemPages * 1.5;
|
||||||
|
|
||||||
|
qWarn("%p in memory buf page not sufficient, expand from %d to %d, page size:%d", pResultBuf, prev,
|
||||||
|
pResultBuf->inMemPages, pResultBuf->pageSize);
|
||||||
|
} else {
|
||||||
|
pResultBuf->statis.flushPages += 1;
|
||||||
|
tdListPopNode(pResultBuf->lruList, pn);
|
||||||
|
|
||||||
|
SPageInfo* d = *(SPageInfo**) pn->data;
|
||||||
|
assert(d->pn == pn);
|
||||||
|
|
||||||
|
d->pn = NULL;
|
||||||
|
tfree(pn);
|
||||||
|
|
||||||
|
bufPage = flushPageToDisk(pResultBuf, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
return bufPage;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lruListPushFront(SList *pList, SPageInfo* pi) {
|
||||||
|
tdListPrepend(pList, &pi);
|
||||||
|
SListNode* front = tdListGetHead(pList);
|
||||||
|
pi->pn = front;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void lruListMoveToFront(SList *pList, SPageInfo* pi) {
|
||||||
|
tdListPopNode(pList, pi->pn);
|
||||||
|
tdListPrependNode(pList, pi->pn);
|
||||||
|
}
|
||||||
|
|
||||||
|
tFilePage* getNewDataBuf(SDiskbasedResultBuf* pResultBuf, int32_t groupId, int32_t* pageId) {
|
||||||
|
pResultBuf->statis.getPages += 1;
|
||||||
|
|
||||||
|
char* availablePage = NULL;
|
||||||
|
if (NO_AVAILABLE_PAGES(pResultBuf)) {
|
||||||
|
availablePage = evicOneDataPage(pResultBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
// register new id in this group
|
||||||
|
*pageId = (++pResultBuf->allocateId);
|
||||||
|
|
||||||
|
// register page id info
|
||||||
|
SPageInfo* pi = registerPage(pResultBuf, groupId, *pageId);
|
||||||
|
|
||||||
|
// add to LRU list
|
||||||
|
assert(listNEles(pResultBuf->lruList) < pResultBuf->inMemPages && pResultBuf->inMemPages > 0);
|
||||||
|
|
||||||
|
lruListPushFront(pResultBuf->lruList, pi);
|
||||||
|
|
||||||
|
// add to hash map
|
||||||
|
taosHashPut(pResultBuf->all, pageId, sizeof(int32_t), &pi, POINTER_BYTES);
|
||||||
|
|
||||||
|
// allocate buf
|
||||||
|
if (availablePage == NULL) {
|
||||||
|
pi->pData = calloc(1, pResultBuf->pageSize + POINTER_BYTES);
|
||||||
|
} else {
|
||||||
|
pi->pData = availablePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
pResultBuf->totalBufSize += pResultBuf->pageSize;
|
||||||
|
|
||||||
|
((void**)pi->pData)[0] = pi;
|
||||||
|
pi->used = true;
|
||||||
|
|
||||||
|
return GET_DATA_PAYLOAD(pi);
|
||||||
|
}
|
||||||
|
|
||||||
|
tFilePage* getResBufPage(SDiskbasedResultBuf* pResultBuf, int32_t id) {
|
||||||
|
assert(pResultBuf != NULL && id >= 0);
|
||||||
|
pResultBuf->statis.getPages += 1;
|
||||||
|
|
||||||
|
SPageInfo** pi = taosHashGet(pResultBuf->all, &id, sizeof(int32_t));
|
||||||
|
assert(pi != NULL && *pi != NULL);
|
||||||
|
|
||||||
|
if ((*pi)->pData != NULL) { // it is in memory
|
||||||
|
// no need to update the LRU list if only one page exists
|
||||||
|
if (pResultBuf->numOfPages == 1) {
|
||||||
|
(*pi)->used = true;
|
||||||
|
return GET_DATA_PAYLOAD(*pi);
|
||||||
|
}
|
||||||
|
|
||||||
|
SPageInfo** pInfo = (SPageInfo**) ((*pi)->pn->data);
|
||||||
|
assert(*pInfo == *pi);
|
||||||
|
|
||||||
|
lruListMoveToFront(pResultBuf->lruList, (*pi));
|
||||||
|
(*pi)->used = true;
|
||||||
|
|
||||||
|
return GET_DATA_PAYLOAD(*pi);
|
||||||
|
|
||||||
|
} else { // not in memory
|
||||||
|
assert((*pi)->pData == NULL && (*pi)->pn == NULL && (*pi)->info.length >= 0 && (*pi)->info.offset >= 0);
|
||||||
|
|
||||||
|
char* availablePage = NULL;
|
||||||
|
if (NO_AVAILABLE_PAGES(pResultBuf)) {
|
||||||
|
availablePage = evicOneDataPage(pResultBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (availablePage == NULL) {
|
||||||
|
(*pi)->pData = calloc(1, pResultBuf->pageSize + POINTER_BYTES);
|
||||||
|
} else {
|
||||||
|
(*pi)->pData = availablePage;
|
||||||
|
}
|
||||||
|
|
||||||
|
((void**)((*pi)->pData))[0] = (*pi);
|
||||||
|
|
||||||
|
lruListPushFront(pResultBuf->lruList, *pi);
|
||||||
|
loadPageFromDisk(pResultBuf, *pi);
|
||||||
|
return GET_DATA_PAYLOAD(*pi);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyResultBuf(SDiskbasedResultBuf* pResultBuf, void* handle) {
|
void releaseResBufPage(SDiskbasedResultBuf* pResultBuf, void* page) {
|
||||||
|
assert(pResultBuf != NULL && page != NULL);
|
||||||
|
char* p = (char*) page - POINTER_BYTES;
|
||||||
|
|
||||||
|
SPageInfo* ppi = ((SPageInfo**) p)[0];
|
||||||
|
releaseResBufPageInfo(pResultBuf, ppi);
|
||||||
|
}
|
||||||
|
|
||||||
|
void releaseResBufPageInfo(SDiskbasedResultBuf* pResultBuf, SPageInfo* pi) {
|
||||||
|
assert(pi->pData != NULL && pi->used);
|
||||||
|
|
||||||
|
pi->used = false;
|
||||||
|
pResultBuf->statis.releasePages += 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t getNumOfRowsPerPage(const SDiskbasedResultBuf* pResultBuf) { return pResultBuf->numOfRowsPerPage; }
|
||||||
|
|
||||||
|
size_t getNumOfResultBufGroupId(const SDiskbasedResultBuf* pResultBuf) { return taosHashGetSize(pResultBuf->groupSet); }
|
||||||
|
|
||||||
|
size_t getResBufSize(const SDiskbasedResultBuf* pResultBuf) { return pResultBuf->totalBufSize; }
|
||||||
|
|
||||||
|
SIDList getDataBufPagesIdList(SDiskbasedResultBuf* pResultBuf, int32_t groupId) {
|
||||||
|
assert(pResultBuf != NULL);
|
||||||
|
|
||||||
|
char** p = taosHashGet(pResultBuf->groupSet, (const char*)&groupId, sizeof(int32_t));
|
||||||
|
if (p == NULL) { // it is a new group id
|
||||||
|
return pResultBuf->emptyDummyIdList;
|
||||||
|
} else {
|
||||||
|
return (SArray*) (*p);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void destroyResultBuf(SDiskbasedResultBuf* pResultBuf) {
|
||||||
if (pResultBuf == NULL) {
|
if (pResultBuf == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FD_VALID(pResultBuf->fd)) {
|
if (pResultBuf->file != NULL) {
|
||||||
qDebug("QInfo:%p disk-based output buffer closed, total:%" PRId64 " bytes, file created:%s, file size:%d", handle,
|
qDebug("QInfo:%p disk-based output buffer closed, total:%" PRId64 " bytes, file size:%"PRId64" bytes",
|
||||||
pResultBuf->totalBufSize, pResultBuf->path, FILE_SIZE_ON_DISK(pResultBuf));
|
pResultBuf->handle, pResultBuf->totalBufSize, pResultBuf->fileSize);
|
||||||
|
|
||||||
close(pResultBuf->fd);
|
fclose(pResultBuf->file);
|
||||||
munmap(pResultBuf->pBuf, FILE_SIZE_ON_DISK(pResultBuf));
|
|
||||||
pResultBuf->pBuf = NULL;
|
|
||||||
} else {
|
} else {
|
||||||
qDebug("QInfo:%p disk-based output buffer closed, total:%" PRId64 " bytes, no file created", handle,
|
qDebug("QInfo:%p disk-based output buffer closed, total:%" PRId64 " bytes, no file created", pResultBuf->handle,
|
||||||
pResultBuf->totalBufSize);
|
pResultBuf->totalBufSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
unlink(pResultBuf->path);
|
unlink(pResultBuf->path);
|
||||||
tfree(pResultBuf->path);
|
tfree(pResultBuf->path);
|
||||||
|
|
||||||
size_t size = taosArrayGetSize(pResultBuf->list);
|
SHashMutableIterator* iter = taosHashCreateIter(pResultBuf->groupSet);
|
||||||
for (int32_t i = 0; i < size; ++i) {
|
while(taosHashIterNext(iter)) {
|
||||||
SArray* pa = taosArrayGetP(pResultBuf->list, i);
|
SArray** p = (SArray**) taosHashIterGet(iter);
|
||||||
taosArrayDestroy(pa);
|
size_t n = taosArrayGetSize(*p);
|
||||||
|
for(int32_t i = 0; i < n; ++i) {
|
||||||
|
SPageInfo* pi = taosArrayGetP(*p, i);
|
||||||
|
tfree(pi->pData);
|
||||||
|
tfree(pi);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(*p);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pResultBuf->list);
|
taosHashDestroyIter(iter);
|
||||||
taosArrayDestroy(pResultBuf->emptyDummyIdList);
|
|
||||||
taosHashCleanup(pResultBuf->idsTable);
|
|
||||||
|
|
||||||
tfree(pResultBuf->iBuf);
|
tdListFree(pResultBuf->lruList);
|
||||||
|
taosArrayDestroy(pResultBuf->emptyDummyIdList);
|
||||||
|
taosHashCleanup(pResultBuf->groupSet);
|
||||||
|
taosHashCleanup(pResultBuf->all);
|
||||||
|
|
||||||
|
tfree(pResultBuf->assistBuf);
|
||||||
tfree(pResultBuf);
|
tfree(pResultBuf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getLastPageId(SIDList pList) {
|
SPageInfo* getLastPageInfo(SIDList pList) {
|
||||||
size_t size = taosArrayGetSize(pList);
|
size_t size = taosArrayGetSize(pList);
|
||||||
return *(int32_t*) taosArrayGet(pList, size - 1);
|
return (SPageInfo*) taosArrayGetP(pList, size - 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -740,7 +740,7 @@ int32_t tsBufMerge(STSBuf* pDestBuf, const STSBuf* pSrcBuf, int32_t vnodeId) {
|
||||||
int32_t size = pSrcBuf->fileSize - offset;
|
int32_t size = pSrcBuf->fileSize - offset;
|
||||||
|
|
||||||
#ifdef LINUX
|
#ifdef LINUX
|
||||||
ssize_t rc = tsendfile(fileno(pDestBuf->f), fileno(pSrcBuf->f), &offset, size);
|
ssize_t rc = taosTSendFile(fileno(pDestBuf->f), fileno(pSrcBuf->f), &offset, size);
|
||||||
#else
|
#else
|
||||||
ssize_t rc = fsendfile(pDestBuf->f, pSrcBuf->f, &offset, size);
|
ssize_t rc = fsendfile(pDestBuf->f, pSrcBuf->f, &offset, size);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -236,11 +236,13 @@ void clearTimeWindowResBuf(SQueryRuntimeEnv *pRuntimeEnv, SWindowResult *pWindow
|
||||||
if (pWindowRes == NULL) {
|
if (pWindowRes == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tFilePage *page = getResBufPage(pRuntimeEnv->pResultBuf, pWindowRes->pos.pageId);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pRuntimeEnv->pQuery->numOfOutput; ++i) {
|
for (int32_t i = 0; i < pRuntimeEnv->pQuery->numOfOutput; ++i) {
|
||||||
SResultInfo *pResultInfo = &pWindowRes->resultInfo[i];
|
SResultInfo *pResultInfo = &pWindowRes->resultInfo[i];
|
||||||
|
|
||||||
char * s = getPosInResultPage(pRuntimeEnv, i, pWindowRes);
|
char * s = getPosInResultPage(pRuntimeEnv, i, pWindowRes, page);
|
||||||
size_t size = pRuntimeEnv->pQuery->pSelectExpr[i].bytes;
|
size_t size = pRuntimeEnv->pQuery->pSelectExpr[i].bytes;
|
||||||
memset(s, 0, size);
|
memset(s, 0, size);
|
||||||
|
|
||||||
|
@ -277,8 +279,11 @@ void copyTimeWindowResBuf(SQueryRuntimeEnv *pRuntimeEnv, SWindowResult *dst, con
|
||||||
memcpy(pDst->interResultBuf, pSrc->interResultBuf, pDst->bufLen);
|
memcpy(pDst->interResultBuf, pSrc->interResultBuf, pDst->bufLen);
|
||||||
|
|
||||||
// copy the output buffer data from src to dst, the position info keep unchanged
|
// copy the output buffer data from src to dst, the position info keep unchanged
|
||||||
char * dstBuf = getPosInResultPage(pRuntimeEnv, i, dst);
|
tFilePage *dstpage = getResBufPage(pRuntimeEnv->pResultBuf, dst->pos.pageId);
|
||||||
char * srcBuf = getPosInResultPage(pRuntimeEnv, i, (SWindowResult *)src);
|
char * dstBuf = getPosInResultPage(pRuntimeEnv, i, dst, dstpage);
|
||||||
|
|
||||||
|
tFilePage *srcpage = getResBufPage(pRuntimeEnv->pResultBuf, src->pos.pageId);
|
||||||
|
char * srcBuf = getPosInResultPage(pRuntimeEnv, i, (SWindowResult *)src, srcpage);
|
||||||
size_t s = pRuntimeEnv->pQuery->pSelectExpr[i].bytes;
|
size_t s = pRuntimeEnv->pQuery->pSelectExpr[i].bytes;
|
||||||
|
|
||||||
memcpy(dstBuf, srcBuf, s);
|
memcpy(dstBuf, srcBuf, s);
|
||||||
|
|
|
@ -30,7 +30,7 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
#include "qsqlparser.h"
|
#include "qSqlparser.h"
|
||||||
#include "tcmdtype.h"
|
#include "tcmdtype.h"
|
||||||
#include "tstoken.h"
|
#include "tstoken.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
|
|
|
@ -18,17 +18,144 @@ void simpleTest() {
|
||||||
tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId);
|
tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
ASSERT_TRUE(pBufPage != NULL);
|
ASSERT_TRUE(pBufPage != NULL);
|
||||||
|
|
||||||
ASSERT_EQ(getNumOfRowsPerPage(pResultBuf), (16384L - sizeof(int64_t))/64);
|
ASSERT_EQ(getResBufSize(pResultBuf), 1024);
|
||||||
ASSERT_EQ(getResBufSize(pResultBuf), 1000*16384L);
|
|
||||||
|
|
||||||
SIDList list = getDataBufPagesIdList(pResultBuf, groupId);
|
SIDList list = getDataBufPagesIdList(pResultBuf, groupId);
|
||||||
ASSERT_EQ(taosArrayGetSize(list), 1);
|
ASSERT_EQ(taosArrayGetSize(list), 1);
|
||||||
ASSERT_EQ(getNumOfResultBufGroupId(pResultBuf), 1);
|
ASSERT_EQ(getNumOfResultBufGroupId(pResultBuf), 1);
|
||||||
|
|
||||||
destroyResultBuf(pResultBuf, NULL);
|
releaseResBufPage(pResultBuf, pBufPage);
|
||||||
|
|
||||||
|
tFilePage* pBufPage1 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
|
||||||
|
tFilePage* t = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t == pBufPage1);
|
||||||
|
|
||||||
|
tFilePage* pBufPage2 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t1 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t1 == pBufPage2);
|
||||||
|
|
||||||
|
tFilePage* pBufPage3 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t2 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t2 == pBufPage3);
|
||||||
|
|
||||||
|
tFilePage* pBufPage4 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t3 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t3 == pBufPage4);
|
||||||
|
|
||||||
|
tFilePage* pBufPage5 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t4 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t4 == pBufPage5);
|
||||||
|
|
||||||
|
destroyResultBuf(pResultBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void writeDownTest() {
|
||||||
|
SDiskbasedResultBuf* pResultBuf = NULL;
|
||||||
|
int32_t ret = createDiskbasedResultBuffer(&pResultBuf, 1000, 64, 1024, 4, NULL);
|
||||||
|
|
||||||
|
int32_t pageId = 0;
|
||||||
|
int32_t writePageId = 0;
|
||||||
|
int32_t groupId = 0;
|
||||||
|
int32_t nx = 12345;
|
||||||
|
|
||||||
|
tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
ASSERT_TRUE(pBufPage != NULL);
|
||||||
|
|
||||||
|
*(int32_t*)(pBufPage->data) = nx;
|
||||||
|
writePageId = pageId;
|
||||||
|
releaseResBufPage(pResultBuf, pBufPage);
|
||||||
|
|
||||||
|
tFilePage* pBufPage1 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t1 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t1 == pBufPage1);
|
||||||
|
ASSERT_TRUE(pageId == 1);
|
||||||
|
|
||||||
|
tFilePage* pBufPage2 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t2 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t2 == pBufPage2);
|
||||||
|
ASSERT_TRUE(pageId == 2);
|
||||||
|
|
||||||
|
tFilePage* pBufPage3 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t3 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t3 == pBufPage3);
|
||||||
|
ASSERT_TRUE(pageId == 3);
|
||||||
|
|
||||||
|
tFilePage* pBufPage4 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t4 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t4 == pBufPage4);
|
||||||
|
ASSERT_TRUE(pageId == 4);
|
||||||
|
releaseResBufPage(pResultBuf, t4);
|
||||||
|
|
||||||
|
// flush the written page to disk, and read it out again
|
||||||
|
tFilePage* pBufPagex = getResBufPage(pResultBuf, writePageId);
|
||||||
|
ASSERT_EQ(*(int32_t*)pBufPagex->data, nx);
|
||||||
|
|
||||||
|
SArray* pa = getDataBufPagesIdList(pResultBuf, groupId);
|
||||||
|
ASSERT_EQ(taosArrayGetSize(pa), 5);
|
||||||
|
|
||||||
|
destroyResultBuf(pResultBuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
void recyclePageTest() {
|
||||||
|
SDiskbasedResultBuf* pResultBuf = NULL;
|
||||||
|
int32_t ret = createDiskbasedResultBuffer(&pResultBuf, 1000, 64, 1024, 4, NULL);
|
||||||
|
|
||||||
|
int32_t pageId = 0;
|
||||||
|
int32_t writePageId = 0;
|
||||||
|
int32_t groupId = 0;
|
||||||
|
int32_t nx = 12345;
|
||||||
|
|
||||||
|
tFilePage* pBufPage = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
ASSERT_TRUE(pBufPage != NULL);
|
||||||
|
releaseResBufPage(pResultBuf, pBufPage);
|
||||||
|
|
||||||
|
tFilePage* pBufPage1 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t1 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t1 == pBufPage1);
|
||||||
|
ASSERT_TRUE(pageId == 1);
|
||||||
|
|
||||||
|
tFilePage* pBufPage2 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t2 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t2 == pBufPage2);
|
||||||
|
ASSERT_TRUE(pageId == 2);
|
||||||
|
|
||||||
|
tFilePage* pBufPage3 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t3 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t3 == pBufPage3);
|
||||||
|
ASSERT_TRUE(pageId == 3);
|
||||||
|
|
||||||
|
tFilePage* pBufPage4 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t4 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t4 == pBufPage4);
|
||||||
|
ASSERT_TRUE(pageId == 4);
|
||||||
|
releaseResBufPage(pResultBuf, t4);
|
||||||
|
releaseResBufPage(pResultBuf, t4);
|
||||||
|
|
||||||
|
tFilePage* pBufPage5 = getNewDataBuf(pResultBuf, groupId, &pageId);
|
||||||
|
tFilePage* t5 = getResBufPage(pResultBuf, pageId);
|
||||||
|
ASSERT_TRUE(t5 == pBufPage5);
|
||||||
|
ASSERT_TRUE(pageId == 5);
|
||||||
|
|
||||||
|
// flush the written page to disk, and read it out again
|
||||||
|
tFilePage* pBufPagex = getResBufPage(pResultBuf, writePageId);
|
||||||
|
*(int32_t*)(pBufPagex->data) = nx;
|
||||||
|
writePageId = pageId; // update the data
|
||||||
|
releaseResBufPage(pResultBuf, pBufPagex);
|
||||||
|
|
||||||
|
tFilePage* pBufPagex1 = getResBufPage(pResultBuf, 1);
|
||||||
|
|
||||||
|
SArray* pa = getDataBufPagesIdList(pResultBuf, groupId);
|
||||||
|
ASSERT_EQ(taosArrayGetSize(pa), 6);
|
||||||
|
|
||||||
|
destroyResultBuf(pResultBuf);
|
||||||
}
|
}
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
|
|
||||||
TEST(testCase, resultBufferTest) {
|
TEST(testCase, resultBufferTest) {
|
||||||
|
srand(time(NULL));
|
||||||
simpleTest();
|
simpleTest();
|
||||||
|
writeDownTest();
|
||||||
|
recyclePageTest();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/cJson/inc)
|
||||||
|
@ -12,10 +12,11 @@ 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))
|
||||||
AUX_SOURCE_DIRECTORY(./src SRC)
|
AUX_SOURCE_DIRECTORY(./src SRC)
|
||||||
ELSEIF (TD_DARWIN_64)
|
ELSEIF (TD_DARWIN_64)
|
||||||
LIST(APPEND SRC ./src/thaship.c)
|
#LIST(APPEND SRC ./src/thaship.c)
|
||||||
LIST(APPEND SRC ./src/trpc.c)
|
#LIST(APPEND SRC ./src/trpc.c)
|
||||||
LIST(APPEND SRC ./src/tstring.c)
|
#LIST(APPEND SRC ./src/tstring.c)
|
||||||
LIST(APPEND SRC ./src/tudp.c)
|
#LIST(APPEND SRC ./src/tudp.c)
|
||||||
|
AUX_SOURCE_DIRECTORY(src SRC)
|
||||||
ELSEIF (TD_WINDOWS_64)
|
ELSEIF (TD_WINDOWS_64)
|
||||||
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/pthread)
|
INCLUDE_DIRECTORIES(${TD_COMMUNITY_DIR}/deps/pthread)
|
||||||
LIST(APPEND SRC ./src/thaship.c)
|
LIST(APPEND SRC ./src/thaship.c)
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue