fix:fix length error in tag insert
This commit is contained in:
commit
478fa8b601
|
@ -35,7 +35,7 @@ endif(${BUILD_TEST})
|
||||||
add_subdirectory(source)
|
add_subdirectory(source)
|
||||||
add_subdirectory(tools)
|
add_subdirectory(tools)
|
||||||
add_subdirectory(tests)
|
add_subdirectory(tests)
|
||||||
add_subdirectory(example)
|
add_subdirectory(examples/c)
|
||||||
|
|
||||||
# docs
|
# docs
|
||||||
add_subdirectory(docs)
|
add_subdirectory(docs)
|
||||||
|
|
|
@ -46,7 +46,7 @@ ENDIF ()
|
||||||
|
|
||||||
IF (TD_WINDOWS)
|
IF (TD_WINDOWS)
|
||||||
MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}")
|
MESSAGE("${Yellow} set compiler flag for Windows! ${ColourReset}")
|
||||||
SET(COMMON_FLAGS "/w /D_WIN32 /Zi")
|
SET(COMMON_FLAGS "/w /D_WIN32 /DWIN32 /Zi")
|
||||||
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /MANIFEST:NO")
|
||||||
# IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900))
|
# IF (MSVC AND (MSVC_VERSION GREATER_EQUAL 1900))
|
||||||
# SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18")
|
# SET(COMMON_FLAGS "${COMMON_FLAGS} /Wv:18")
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
sidebar_label: SQL 函数
|
sidebar_label: 函数
|
||||||
title: SQL 函数
|
title: 函数
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
---
|
---
|
||||||
|
|
||||||
|
@ -20,7 +20,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
**返回结果类型**:如果输入值为整数,输出值是 UBIGINT 类型。如果输入值是 FLOAT/DOUBLE 数据类型,输出值是 DOUBLE 数据类型。
|
**返回结果类型**:如果输入值为整数,输出值是 UBIGINT 类型。如果输入值是 FLOAT/DOUBLE 数据类型,输出值是 DOUBLE 数据类型。
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -38,7 +38,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -75,7 +75,7 @@ toc_max_heading_level: 4
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -94,7 +94,7 @@ SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:与指定列的原始数据类型一致。例如,如果指定列的原始数据类型为 Float,那么返回的数据类型也为 Float;如果指定列的原始数据类型为 Double,那么返回的数据类型也为 Double。
|
**返回结果类型**:与指定列的原始数据类型一致。例如,如果指定列的原始数据类型为 Float,那么返回的数据类型也为 Float;如果指定列的原始数据类型为 Double,那么返回的数据类型也为 Double。
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列,无论 tag 列的类型是什么类型。
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**适用于**: 普通表、超级表。
|
**适用于**: 普通表、超级表。
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ SELECT CEIL(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -142,7 +142,7 @@ SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -161,7 +161,7 @@ SELECT FLOOR(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -190,7 +190,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -208,7 +208,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -226,7 +226,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
**返回结果类型**:DOUBLE。如果输入值为 NULL,输出值也为 NULL
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在 tag 列
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -248,7 +248,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:INT。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:INT。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。
|
**适用数据类型**:VARCHAR, NCHAR
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -262,9 +262,9 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**功能说明**:字符串连接函数。
|
**功能说明**:字符串连接函数。
|
||||||
|
|
||||||
**返回结果类型**:如果所有参数均为BINARY类型,则结果类型为BINARY。如果参数包含NCHAR类型,则结果类型为NCHAR。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:如果所有参数均为 VARCHAR 类型,则结果类型为 VARCHAR。如果参数包含NCHAR类型,则结果类型为NCHAR。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:BINARY, NCHAR。不能应用在 TAG 列。 该函数最小参数个数为2个,最大参数个数为8个。
|
**适用数据类型**:VARCHAR, NCHAR。 该函数最小参数个数为2个,最大参数个数为8个。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -279,9 +279,9 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**功能说明**:带分隔符的字符串连接函数。
|
**功能说明**:带分隔符的字符串连接函数。
|
||||||
|
|
||||||
**返回结果类型**:如果所有参数均为BINARY类型,则结果类型为BINARY。如果参数包含NCHAR类型,则结果类型为NCHAR。如果输入值为NULL,输出值为NULL。如果separator值不为NULL,其他输入为NULL,输出为空串。
|
**返回结果类型**:如果所有参数均为VARCHAR类型,则结果类型为VARCHAR。如果参数包含NCHAR类型,则结果类型为NCHAR。如果输入值为NULL,输出值为NULL。如果separator值不为NULL,其他输入为NULL,输出为空串。
|
||||||
|
|
||||||
**适用数据类型**:BINARY, NCHAR。不能应用在 TAG 列。 该函数最小参数个数为3个,最大参数个数为9个。
|
**适用数据类型**:VARCHAR, NCHAR。 该函数最小参数个数为3个,最大参数个数为9个。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -298,7 +298,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:INT。
|
**返回结果类型**:INT。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。
|
**适用数据类型**:输入参数是 VARCHAR 类型或者 NCHAR 类型的字符串或者列。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -315,7 +315,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。
|
**适用数据类型**:输入参数是 VARCHAR 类型或者 NCHAR 类型的字符串或者列。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -332,7 +332,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。
|
**适用数据类型**:输入参数是 VARCHAR 类型或者 NCHAR 类型的字符串或者列。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -349,7 +349,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。
|
**适用数据类型**:输入参数是 VARCHAR 类型或者 NCHAR 类型的字符串或者列。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -366,7 +366,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。输入参数pos可以为正数,也可以为负数。如果pos是正数,表示开始位置从字符串开头正数计算。如果pos为负数,表示开始位置从字符串结尾倒数计算。如果输入参数len被忽略,返回的子串包含从pos开始的整个字串。
|
**适用数据类型**:输入参数是 VARCHAR 类型或者 NCHAR 类型的字符串或者列。输入参数pos可以为正数,也可以为负数。如果pos是正数,表示开始位置从字符串开头正数计算。如果pos为负数,表示开始位置从字符串结尾倒数计算。如果输入参数len被忽略,返回的子串包含从pos开始的整个字串。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -383,7 +383,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
**返回结果类型**:同输入类型。如果输入值为NULL,输出值为NULL。
|
||||||
|
|
||||||
**适用数据类型**:输入参数是 BINARY 类型或者 NCHAR 类型的字符串或者列。不能应用在 TAG 列。
|
**适用数据类型**:输入参数是 VARCHAR 类型或者 NCHAR 类型的字符串或者列。
|
||||||
|
|
||||||
**嵌套子查询支持**:适用于内层查询和外层查询。
|
**嵌套子查询支持**:适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -400,7 +400,7 @@ SELECT ROUND(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]
|
SELECT CAST(expression AS type_name) FROM { tb_name | stb_name } [WHERE clause]
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:数据类型转换函数,输入参数 expression 支持普通列、常量、标量函数及它们之间的四则运算,不支持 tag 列,只适用于 select 子句中。
|
**功能说明**:数据类型转换函数,输入参数 expression 支持普通列、常量、标量函数及它们之间的四则运算,只适用于 select 子句中。
|
||||||
|
|
||||||
**返回结果类型**:CAST 中指定的类型(type_name),可以是 BIGINT、BIGINT UNSIGNED、BINARY、VARCHAR、NCHAR和TIMESTAMP。
|
**返回结果类型**:CAST 中指定的类型(type_name),可以是 BIGINT、BIGINT UNSIGNED、BINARY、VARCHAR、NCHAR和TIMESTAMP。
|
||||||
|
|
||||||
|
@ -423,7 +423,7 @@ SELECT TO_ISO8601(ts_val | ts_col) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**功能说明**:将 UNIX 时间戳转换成为 ISO8601 标准的日期时间格式,并附加客户端时区信息。
|
**功能说明**:将 UNIX 时间戳转换成为 ISO8601 标准的日期时间格式,并附加客户端时区信息。
|
||||||
|
|
||||||
**返回结果数据类型**:BINARY 类型。
|
**返回结果数据类型**:VARCHAR 类型。
|
||||||
|
|
||||||
**适用数据类型**:UNIX 时间戳常量或是 TIMESTAMP 类型的列
|
**适用数据类型**:UNIX 时间戳常量或是 TIMESTAMP 类型的列
|
||||||
|
|
||||||
|
@ -462,7 +462,7 @@ SELECT TO_UNIXTIMESTAMP(datetime_string | ts_col) FROM { tb_name | stb_name } [W
|
||||||
|
|
||||||
**返回结果数据类型**:长整型 INT64。
|
**返回结果数据类型**:长整型 INT64。
|
||||||
|
|
||||||
**应用字段**:字符串常量或是 BINARY/NCHAR 类型的列。
|
**应用字段**:字符串常量或是 VARCHAR/NCHAR 类型的列。
|
||||||
|
|
||||||
**适用于**:表、超级表。
|
**适用于**:表、超级表。
|
||||||
|
|
||||||
|
@ -549,7 +549,7 @@ SELECT TIMEZONE() FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
|
||||||
**功能说明**:返回客户端当前时区信息。
|
**功能说明**:返回客户端当前时区信息。
|
||||||
|
|
||||||
**返回结果数据类型**:BINARY 类型。
|
**返回结果数据类型**:VARCHAR 类型。
|
||||||
|
|
||||||
**应用字段**:无
|
**应用字段**:无
|
||||||
|
|
||||||
|
@ -668,7 +668,7 @@ SELECT LEASTSQUARES(field_name, start_val, step_val) FROM tb_name [WHERE clause]
|
||||||
SELECT MODE(field_name) FROM tb_name [WHERE clause];
|
SELECT MODE(field_name) FROM tb_name [WHERE clause];
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:返回出现频率最高的值,若存在多个频率相同的最高值,输出空。不能匹配标签、时间戳输出。
|
**功能说明**:返回出现频率最高的值,若存在多个频率相同的最高值,输出空。
|
||||||
|
|
||||||
**返回数据类型**:同应用的字段。
|
**返回数据类型**:同应用的字段。
|
||||||
|
|
||||||
|
@ -808,6 +808,25 @@ SELECT BOTTOM(field_name, K) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
- 系统同时返回该记录关联的时间戳列;
|
- 系统同时返回该记录关联的时间戳列;
|
||||||
- 限制:BOTTOM 函数不支持 FILL 子句。
|
- 限制:BOTTOM 函数不支持 FILL 子句。
|
||||||
|
|
||||||
|
### FIRST
|
||||||
|
|
||||||
|
```
|
||||||
|
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
||||||
|
```
|
||||||
|
|
||||||
|
**功能说明**:统计表/超级表中某列的值最先写入的非 NULL 值。
|
||||||
|
|
||||||
|
**返回数据类型**:同应用的字段。
|
||||||
|
|
||||||
|
**适用数据类型**:所有字段。
|
||||||
|
|
||||||
|
**适用于**:表和超级表。
|
||||||
|
|
||||||
|
**使用说明**:
|
||||||
|
|
||||||
|
- 如果要返回各个列的首个(时间戳最小)非 NULL 值,可以使用 FIRST(\*);
|
||||||
|
- 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL;
|
||||||
|
- 如果结果集中所有列全部为 NULL 值,则不返回结果。
|
||||||
|
|
||||||
### INTERP
|
### INTERP
|
||||||
|
|
||||||
|
@ -919,25 +938,6 @@ SELECT PERCENTILE(field_name, P) FROM { tb_name } [WHERE clause];
|
||||||
|
|
||||||
**使用说明**:*P*值取值范围 0≤*P*≤100,为 0 的时候等同于 MIN,为 100 的时候等同于 MAX。
|
**使用说明**:*P*值取值范围 0≤*P*≤100,为 0 的时候等同于 MIN,为 100 的时候等同于 MAX。
|
||||||
|
|
||||||
### FIRST
|
|
||||||
|
|
||||||
```
|
|
||||||
SELECT FIRST(field_name) FROM { tb_name | stb_name } [WHERE clause];
|
|
||||||
```
|
|
||||||
|
|
||||||
**功能说明**:统计表/超级表中某列的值最先写入的非 NULL 值。
|
|
||||||
|
|
||||||
**返回数据类型**:同应用的字段。
|
|
||||||
|
|
||||||
**适用数据类型**:所有字段。
|
|
||||||
|
|
||||||
**适用于**:表和超级表。
|
|
||||||
|
|
||||||
**使用说明**:
|
|
||||||
|
|
||||||
- 如果要返回各个列的首个(时间戳最小)非 NULL 值,可以使用 FIRST(\*);
|
|
||||||
- 如果结果集中的某列全部为 NULL 值,则该列的返回结果也是 NULL;
|
|
||||||
- 如果结果集中所有列全部为 NULL 值,则不返回结果。
|
|
||||||
|
|
||||||
### TAIL
|
### TAIL
|
||||||
|
|
||||||
|
@ -1005,7 +1005,7 @@ SELECT UNIQUE(field_name) FROM {tb_name | stb_name} [WHERE clause];
|
||||||
|
|
||||||
**返回结果类型**: 输入列如果是整数类型返回值为长整型 (int64_t),浮点数返回值为双精度浮点数(Double)。无符号整数类型返回值为无符号长整型(uint64_t)。 返回结果中同时带有每行记录对应的时间戳。
|
**返回结果类型**: 输入列如果是整数类型返回值为长整型 (int64_t),浮点数返回值为双精度浮点数(Double)。无符号整数类型返回值为无符号长整型(uint64_t)。 返回结果中同时带有每行记录对应的时间戳。
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上;在超级表查询中使用时,不能应用在标签之上。
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**: 适用于内层查询和外层查询。
|
**嵌套子查询支持**: 适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -1076,7 +1076,7 @@ SELECT IRATE(field_name) FROM tb_name WHERE clause;
|
||||||
|
|
||||||
**返回结果类型**: 返回双精度浮点数类型。
|
**返回结果类型**: 返回双精度浮点数类型。
|
||||||
|
|
||||||
**适用数据类型**: 不能应用在 timestamp、binary、nchar、bool 类型上;在超级表查询中使用时,不能应用在标签之上。
|
**适用数据类型**: 数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**: 适用于内层查询和外层查询。
|
**嵌套子查询支持**: 适用于内层查询和外层查询。
|
||||||
|
|
||||||
|
@ -1124,7 +1124,7 @@ SELECT STATECOUNT(field_name, oper, val) FROM { tb_name | stb_name } [WHERE clau
|
||||||
|
|
||||||
**返回结果类型**:整形。
|
**返回结果类型**:整形。
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上。
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:不支持应用在子查询上。
|
**嵌套子查询支持**:不支持应用在子查询上。
|
||||||
|
|
||||||
|
@ -1152,7 +1152,7 @@ SELECT stateDuration(field_name, oper, val, unit) FROM { tb_name | stb_name } [W
|
||||||
|
|
||||||
**返回结果类型**:整形。
|
**返回结果类型**:整形。
|
||||||
|
|
||||||
**适用数据类型**:不能应用在 timestamp、binary、nchar、bool 类型字段上。
|
**适用数据类型**:数值类型。
|
||||||
|
|
||||||
**嵌套子查询支持**:不支持应用在子查询上。
|
**嵌套子查询支持**:不支持应用在子查询上。
|
||||||
|
|
||||||
|
|
|
@ -35,8 +35,8 @@ TDengine 支持 `UNION ALL` 和 `UNION` 操作符。UNION ALL 将查询返回的
|
||||||
| --- | :---------------: | -------------------------------------------------------------------- | -------------------- |
|
| --- | :---------------: | -------------------------------------------------------------------- | -------------------- |
|
||||||
| 1 | = | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 相等 |
|
| 1 | = | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 相等 |
|
||||||
| 2 | <\>, != | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 不相等 |
|
| 2 | <\>, != | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 不相等 |
|
||||||
| 3 | \>, \< | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于,小于 |
|
| 3 | \>, < | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于,小于 |
|
||||||
| 4 | \>=, \<= | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于等于,小于等于 |
|
| 4 | \>=, <= | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 大于等于,小于等于 |
|
||||||
| 5 | IS [NOT] NULL | 所有类型 | 是否为空值 |
|
| 5 | IS [NOT] NULL | 所有类型 | 是否为空值 |
|
||||||
| 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 闭区间比较 |
|
| 6 | [NOT] BETWEEN AND | 除 BOOL、BLOB、MEDIUMBLOB 和 JSON 外的所有类型 | 闭区间比较 |
|
||||||
| 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 |
|
| 7 | IN | 除 BLOB、MEDIUMBLOB 和 JSON 外的所有类型,且不可以为表的时间戳主键列 | 与列表内的任意值相等 |
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -35,8 +35,8 @@ TDengine provides 2 set operators: `UNION ALL` and `UNION`. `UNION ALL` combines
|
||||||
| --- | :---------------: | ------------------------------------------------------------------- | ----------------------------------------------- |
|
| --- | :---------------: | ------------------------------------------------------------------- | ----------------------------------------------- |
|
||||||
| 1 | = | Except for BLOB, MEDIUMBLOB and JSON | Equal |
|
| 1 | = | Except for BLOB, MEDIUMBLOB and JSON | Equal |
|
||||||
| 2 | <\>, != | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | Not equal |
|
| 2 | <\>, != | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | Not equal |
|
||||||
| 3 | \>, \< | Except for BLOB, MEDIUMBLOB and JSON | Greater than, less than |
|
| 3 | \>, < | Except for BLOB, MEDIUMBLOB and JSON | Greater than, less than |
|
||||||
| 4 | \>=, \<= | Except for BLOB, MEDIUMBLOB and JSON | Greater than or equal to, less than or equal to |
|
| 4 | \>=, <= | Except for BLOB, MEDIUMBLOB and JSON | Greater than or equal to, less than or equal to |
|
||||||
| 5 | IS [NOT] NULL | Any types | Is NULL or NOT |
|
| 5 | IS [NOT] NULL | Any types | Is NULL or NOT |
|
||||||
| 6 | [NOT] BETWEEN AND | Except for BLOB, MEDIUMBLOB and JSON | In a value range or not |
|
| 6 | [NOT] BETWEEN AND | Except for BLOB, MEDIUMBLOB and JSON | In a value range or not |
|
||||||
| 7 | IN | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | In a list of values or not |
|
| 7 | IN | Except for BLOB, MEDIUMBLOB, JSON and primary key of timestamp type | In a list of values or not |
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
add_executable(tmq "")
|
|
||||||
add_executable(tstream "")
|
|
||||||
add_executable(demoapi "")
|
|
||||||
|
|
||||||
target_sources(tmq
|
|
||||||
PRIVATE
|
|
||||||
"src/tmq.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_sources(tstream
|
|
||||||
PRIVATE
|
|
||||||
"src/tstream.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_sources(demoapi
|
|
||||||
PRIVATE
|
|
||||||
"src/demoapi.c"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(tmq
|
|
||||||
taos_static
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(tstream
|
|
||||||
taos_static
|
|
||||||
)
|
|
||||||
|
|
||||||
target_link_libraries(demoapi
|
|
||||||
taos_static
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(tmq
|
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(tstream
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
|
|
||||||
target_include_directories(demoapi
|
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/client"
|
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
|
||||||
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
|
||||||
)
|
|
||||||
|
|
||||||
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
|
|
||||||
SET_TARGET_PROPERTIES(tstream PROPERTIES OUTPUT_NAME tstream)
|
|
||||||
SET_TARGET_PROPERTIES(demoapi PROPERTIES OUTPUT_NAME demoapi)
|
|
|
@ -3,20 +3,70 @@ PROJECT(TDengine)
|
||||||
IF (TD_LINUX)
|
IF (TD_LINUX)
|
||||||
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
||||||
AUX_SOURCE_DIRECTORY(. SRC)
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
ADD_EXECUTABLE(demo apitest.c)
|
# ADD_EXECUTABLE(demo apitest.c)
|
||||||
TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread )
|
#TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread )
|
||||||
ADD_EXECUTABLE(sml schemaless.c)
|
#ADD_EXECUTABLE(sml schemaless.c)
|
||||||
TARGET_LINK_LIBRARIES(sml taos_static trpc tutil pthread )
|
#TARGET_LINK_LIBRARIES(sml taos_static trpc tutil pthread )
|
||||||
ADD_EXECUTABLE(subscribe subscribe.c)
|
#ADD_EXECUTABLE(subscribe subscribe.c)
|
||||||
TARGET_LINK_LIBRARIES(subscribe taos_static trpc tutil pthread )
|
#TARGET_LINK_LIBRARIES(subscribe taos_static trpc tutil pthread )
|
||||||
ADD_EXECUTABLE(epoll epoll.c)
|
#ADD_EXECUTABLE(epoll epoll.c)
|
||||||
TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
#TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
||||||
|
|
||||||
|
add_executable(tmq "")
|
||||||
|
add_executable(tstream "")
|
||||||
|
add_executable(demoapi "")
|
||||||
|
|
||||||
|
target_sources(tmq
|
||||||
|
PRIVATE
|
||||||
|
"tmq.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(tstream
|
||||||
|
PRIVATE
|
||||||
|
"tstream.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_sources(demoapi
|
||||||
|
PRIVATE
|
||||||
|
"demoapi.c"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(tmq
|
||||||
|
taos_static
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(tstream
|
||||||
|
taos_static
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries(demoapi
|
||||||
|
taos_static
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(tmq
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(tstream
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
target_include_directories(demoapi
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/client"
|
||||||
|
PUBLIC "${TD_SOURCE_DIR}/include/os"
|
||||||
|
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
|
||||||
|
)
|
||||||
|
|
||||||
|
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
|
||||||
|
SET_TARGET_PROPERTIES(tstream PROPERTIES OUTPUT_NAME tstream)
|
||||||
|
SET_TARGET_PROPERTIES(demoapi PROPERTIES OUTPUT_NAME demoapi)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
IF (TD_DARWIN)
|
IF (TD_DARWIN)
|
||||||
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
|
||||||
AUX_SOURCE_DIRECTORY(. SRC)
|
AUX_SOURCE_DIRECTORY(. SRC)
|
||||||
ADD_EXECUTABLE(demo demo.c)
|
#ADD_EXECUTABLE(demo demo.c)
|
||||||
TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread lua)
|
#TARGET_LINK_LIBRARIES(demo taos_static trpc tutil pthread lua)
|
||||||
ADD_EXECUTABLE(epoll epoll.c)
|
#ADD_EXECUTABLE(epoll epoll.c)
|
||||||
TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
#TARGET_LINK_LIBRARIES(epoll taos_static trpc tutil pthread lua)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
|
@ -165,7 +165,6 @@ tmq_t* build_consumer() {
|
||||||
tmq_conf_set(conf, "group.id", "tg2");
|
tmq_conf_set(conf, "group.id", "tg2");
|
||||||
tmq_conf_set(conf, "td.connect.user", "root");
|
tmq_conf_set(conf, "td.connect.user", "root");
|
||||||
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
tmq_conf_set(conf, "td.connect.pass", "taosdata");
|
||||||
/*tmq_conf_set(conf, "td.connect.db", "abc1");*/
|
|
||||||
tmq_conf_set(conf, "msg.with.table.name", "true");
|
tmq_conf_set(conf, "msg.with.table.name", "true");
|
||||||
tmq_conf_set(conf, "enable.auto.commit", "false");
|
tmq_conf_set(conf, "enable.auto.commit", "false");
|
||||||
tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL);
|
tmq_conf_set_auto_commit_cb(conf, tmq_commit_cb_print, NULL);
|
||||||
|
@ -191,7 +190,6 @@ void basic_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int32_t cnt = 0;
|
int32_t cnt = 0;
|
||||||
/*clock_t startTime = clock();*/
|
|
||||||
while (running) {
|
while (running) {
|
||||||
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 0);
|
TAOS_RES* tmqmessage = tmq_consumer_poll(tmq, 0);
|
||||||
if (tmqmessage) {
|
if (tmqmessage) {
|
||||||
|
@ -204,8 +202,6 @@ void basic_consume_loop(tmq_t* tmq, tmq_list_t* topics) {
|
||||||
/*break;*/
|
/*break;*/
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
/*clock_t endTime = clock();*/
|
|
||||||
/*printf("log cnt: %d %f s\n", cnt, (double)(endTime - startTime) / CLOCKS_PER_SEC);*/
|
|
||||||
|
|
||||||
err = tmq_consumer_close(tmq);
|
err = tmq_consumer_close(tmq);
|
||||||
if (err)
|
if (err)
|
|
@ -30,6 +30,7 @@ extern "C" {
|
||||||
typedef struct SSchema SSchema;
|
typedef struct SSchema SSchema;
|
||||||
typedef struct STColumn STColumn;
|
typedef struct STColumn STColumn;
|
||||||
typedef struct STSchema STSchema;
|
typedef struct STSchema STSchema;
|
||||||
|
typedef struct SValue SValue;
|
||||||
typedef struct SColVal SColVal;
|
typedef struct SColVal SColVal;
|
||||||
typedef struct STSRow2 STSRow2;
|
typedef struct STSRow2 STSRow2;
|
||||||
typedef struct STSRowBuilder STSRowBuilder;
|
typedef struct STSRowBuilder STSRowBuilder;
|
||||||
|
@ -40,24 +41,26 @@ typedef struct STag STag;
|
||||||
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
|
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema **ppTSchema);
|
||||||
void tTSchemaDestroy(STSchema *pTSchema);
|
void tTSchemaDestroy(STSchema *pTSchema);
|
||||||
|
|
||||||
// SColVal
|
|
||||||
#define ColValNONE ((SColVal){.type = COL_VAL_NONE, .nData = 0, .pData = NULL})
|
|
||||||
#define ColValNULL ((SColVal){.type = COL_VAL_NULL, .nData = 0, .pData = NULL})
|
|
||||||
#define ColValDATA(nData, pData) ((SColVal){.type = COL_VAL_DATA, .nData = (nData), .pData = (pData)})
|
|
||||||
|
|
||||||
// STSRow2
|
// STSRow2
|
||||||
|
#define COL_VAL_NONE(CID) ((SColVal){.cid = (CID), .isNone = 1})
|
||||||
|
#define COL_VAL_NULL(CID) ((SColVal){.cid = (CID), .isNull = 1})
|
||||||
|
#define COL_VAL_VALUE(CID, V) ((SColVal){.cid = (CID), .value = (V)})
|
||||||
|
|
||||||
|
int32_t tTSRowClone(const STSRow2 *pRow, STSRow2 **ppRow);
|
||||||
|
void tTSRowFree(STSRow2 *pRow);
|
||||||
|
void tTSRowGet(STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
|
||||||
|
int32_t tTSRowToArray(STSRow2 *pRow, STSchema *pTSchema, SArray **ppArray);
|
||||||
int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow);
|
int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow);
|
||||||
int32_t tGetTSRow(uint8_t *p, STSRow2 *pRow);
|
int32_t tGetTSRow(uint8_t *p, STSRow2 *pRow);
|
||||||
int32_t tTSRowDup(const STSRow2 *pRow, STSRow2 **ppRow);
|
|
||||||
void tTSRowFree(STSRow2 *pRow);
|
|
||||||
int32_t tTSRowGet(const STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
|
|
||||||
|
|
||||||
// STSRowBuilder
|
// STSRowBuilder
|
||||||
|
#if 0
|
||||||
int32_t tTSRowBuilderInit(STSRowBuilder *pBuilder, int32_t sver, int32_t nCols, SSchema *pSchema);
|
int32_t tTSRowBuilderInit(STSRowBuilder *pBuilder, int32_t sver, int32_t nCols, SSchema *pSchema);
|
||||||
void tTSRowBuilderClear(STSRowBuilder *pBuilder);
|
void tTSRowBuilderClear(STSRowBuilder *pBuilder);
|
||||||
void tTSRowBuilderReset(STSRowBuilder *pBuilder);
|
void tTSRowBuilderReset(STSRowBuilder *pBuilder);
|
||||||
int32_t tTSRowBuilderPut(STSRowBuilder *pBuilder, int32_t cid, uint8_t *pData, uint32_t nData);
|
int32_t tTSRowBuilderPut(STSRowBuilder *pBuilder, int32_t cid, uint8_t *pData, uint32_t nData);
|
||||||
int32_t tTSRowBuilderGetRow(STSRowBuilder *pBuilder, const STSRow2 **ppRow);
|
int32_t tTSRowBuilderGetRow(STSRowBuilder *pBuilder, const STSRow2 **ppRow);
|
||||||
|
#endif
|
||||||
|
|
||||||
// STag
|
// STag
|
||||||
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag);
|
int32_t tTagNew(SArray *pArray, int32_t version, int8_t isJson, STag **ppTag);
|
||||||
|
@ -90,7 +93,9 @@ struct STSchema {
|
||||||
#define TSROW_HAS_NONE ((uint8_t)0x1)
|
#define TSROW_HAS_NONE ((uint8_t)0x1)
|
||||||
#define TSROW_HAS_NULL ((uint8_t)0x2U)
|
#define TSROW_HAS_NULL ((uint8_t)0x2U)
|
||||||
#define TSROW_HAS_VAL ((uint8_t)0x4U)
|
#define TSROW_HAS_VAL ((uint8_t)0x4U)
|
||||||
#define TSROW_KV_ROW ((uint8_t)0x10U)
|
#define TSROW_KV_SMALL ((uint8_t)0x10U)
|
||||||
|
#define TSROW_KV_MID ((uint8_t)0x20U)
|
||||||
|
#define TSROW_KV_BIG ((uint8_t)0x40U)
|
||||||
struct STSRow2 {
|
struct STSRow2 {
|
||||||
TSKEY ts;
|
TSKEY ts;
|
||||||
uint8_t flags;
|
uint8_t flags;
|
||||||
|
@ -113,11 +118,31 @@ struct STSRowBuilder {
|
||||||
STSRow2 row;
|
STSRow2 row;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef enum { COL_VAL_NONE = 0, COL_VAL_NULL = 1, COL_VAL_DATA = 2 } EColValT;
|
struct SValue {
|
||||||
|
union {
|
||||||
|
int8_t i8; // TSDB_DATA_TYPE_BOOL||TSDB_DATA_TYPE_TINYINT
|
||||||
|
uint8_t u8; // TSDB_DATA_TYPE_UTINYINT
|
||||||
|
int16_t i16; // TSDB_DATA_TYPE_SMALLINT
|
||||||
|
uint16_t u16; // TSDB_DATA_TYPE_USMALLINT
|
||||||
|
int32_t i32; // TSDB_DATA_TYPE_INT
|
||||||
|
uint32_t u32; // TSDB_DATA_TYPE_UINT
|
||||||
|
int64_t i64; // TSDB_DATA_TYPE_BIGINT
|
||||||
|
uint64_t u64; // TSDB_DATA_TYPE_UBIGINT
|
||||||
|
TSKEY ts; // TSDB_DATA_TYPE_TIMESTAMP
|
||||||
|
float f; // TSDB_DATA_TYPE_FLOAT
|
||||||
|
double d; // TSDB_DATA_TYPE_DOUBLE
|
||||||
|
struct {
|
||||||
|
uint32_t nData;
|
||||||
|
uint8_t *pData;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
struct SColVal {
|
struct SColVal {
|
||||||
EColValT type;
|
int16_t cid;
|
||||||
uint32_t nData;
|
int8_t isNone;
|
||||||
uint8_t *pData;
|
int8_t isNull;
|
||||||
|
SValue value;
|
||||||
};
|
};
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
|
|
|
@ -244,7 +244,7 @@ typedef struct {
|
||||||
const void* pMsg;
|
const void* pMsg;
|
||||||
} SSubmitMsgIter;
|
} SSubmitMsgIter;
|
||||||
|
|
||||||
int32_t tInitSubmitMsgIter(SSubmitReq* pMsg, SSubmitMsgIter* pIter);
|
int32_t tInitSubmitMsgIter(const SSubmitReq* pMsg, SSubmitMsgIter* pIter);
|
||||||
int32_t tGetSubmitMsgNext(SSubmitMsgIter* pIter, SSubmitBlk** pPBlock);
|
int32_t tGetSubmitMsgNext(SSubmitMsgIter* pIter, SSubmitBlk** pPBlock);
|
||||||
int32_t tInitSubmitBlkIter(SSubmitMsgIter* pMsgIter, SSubmitBlk* pBlock, SSubmitBlkIter* pIter);
|
int32_t tInitSubmitBlkIter(SSubmitMsgIter* pMsgIter, SSubmitBlk* pBlock, SSubmitBlkIter* pIter);
|
||||||
STSRow* tGetSubmitBlkNext(SSubmitBlkIter* pIter);
|
STSRow* tGetSubmitBlkNext(SSubmitBlkIter* pIter);
|
||||||
|
@ -945,7 +945,6 @@ typedef struct {
|
||||||
int64_t timeInFetchQueue;
|
int64_t timeInFetchQueue;
|
||||||
} SQnodeLoad;
|
} SQnodeLoad;
|
||||||
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t sver; // software version
|
int32_t sver; // software version
|
||||||
int64_t dnodeVer; // dnode table version in sdb
|
int64_t dnodeVer; // dnode table version in sdb
|
||||||
|
@ -1002,7 +1001,6 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int32_t dnodeId;
|
|
||||||
char db[TSDB_DB_FNAME_LEN];
|
char db[TSDB_DB_FNAME_LEN];
|
||||||
int64_t dbUid;
|
int64_t dbUid;
|
||||||
int32_t vgVersion;
|
int32_t vgVersion;
|
||||||
|
@ -1025,16 +1023,14 @@ typedef struct {
|
||||||
int8_t compression;
|
int8_t compression;
|
||||||
int8_t strict;
|
int8_t strict;
|
||||||
int8_t cacheLastRow;
|
int8_t cacheLastRow;
|
||||||
|
int8_t isTsma;
|
||||||
|
int8_t standby;
|
||||||
int8_t replica;
|
int8_t replica;
|
||||||
int8_t selfIndex;
|
int8_t selfIndex;
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
int32_t numOfRetensions;
|
int32_t numOfRetensions;
|
||||||
SArray* pRetensions; // SRetention
|
SArray* pRetensions; // SRetention
|
||||||
|
void* pTsma;
|
||||||
// for tsma
|
|
||||||
int8_t isTsma;
|
|
||||||
void* pTsma;
|
|
||||||
|
|
||||||
} SCreateVnodeReq;
|
} SCreateVnodeReq;
|
||||||
|
|
||||||
int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq);
|
int32_t tSerializeSCreateVnodeReq(void* buf, int32_t bufLen, SCreateVnodeReq* pReq);
|
||||||
|
@ -1072,8 +1068,8 @@ typedef struct {
|
||||||
int8_t walLevel;
|
int8_t walLevel;
|
||||||
int8_t strict;
|
int8_t strict;
|
||||||
int8_t cacheLastRow;
|
int8_t cacheLastRow;
|
||||||
int8_t replica;
|
|
||||||
int8_t selfIndex;
|
int8_t selfIndex;
|
||||||
|
int8_t replica;
|
||||||
SReplica replicas[TSDB_MAX_REPLICA];
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
} SAlterVnodeReq;
|
} SAlterVnodeReq;
|
||||||
|
|
||||||
|
@ -1977,7 +1973,7 @@ typedef struct {
|
||||||
int8_t killConnection;
|
int8_t killConnection;
|
||||||
int8_t align[3];
|
int8_t align[3];
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
SArray *pQnodeList;
|
SArray* pQnodeList;
|
||||||
} SQueryHbRspBasic;
|
} SQueryHbRspBasic;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -2305,6 +2301,7 @@ typedef struct {
|
||||||
int8_t intervalUnit; // MACRO: TIME_UNIT_XXX
|
int8_t intervalUnit; // MACRO: TIME_UNIT_XXX
|
||||||
int8_t slidingUnit; // MACRO: TIME_UNIT_XXX
|
int8_t slidingUnit; // MACRO: TIME_UNIT_XXX
|
||||||
int8_t timezoneInt; // sma data expired if timezone changes.
|
int8_t timezoneInt; // sma data expired if timezone changes.
|
||||||
|
int32_t dstVgId;
|
||||||
char indexName[TSDB_INDEX_NAME_LEN];
|
char indexName[TSDB_INDEX_NAME_LEN];
|
||||||
int32_t exprLen;
|
int32_t exprLen;
|
||||||
int32_t tagsFilterLen;
|
int32_t tagsFilterLen;
|
||||||
|
@ -2662,6 +2659,23 @@ typedef struct {
|
||||||
int32_t tEncodeSVSubmitReq(SEncoder* pCoder, const SVSubmitReq* pReq);
|
int32_t tEncodeSVSubmitReq(SEncoder* pCoder, const SVSubmitReq* pReq);
|
||||||
int32_t tDecodeSVSubmitReq(SDecoder* pCoder, SVSubmitReq* pReq);
|
int32_t tDecodeSVSubmitReq(SDecoder* pCoder, SVSubmitReq* pReq);
|
||||||
|
|
||||||
|
// TDMT_VND_DELETE
|
||||||
|
typedef struct {
|
||||||
|
TSKEY sKey;
|
||||||
|
TSKEY eKey;
|
||||||
|
|
||||||
|
// super table
|
||||||
|
char* stbName;
|
||||||
|
|
||||||
|
// child/normal
|
||||||
|
char* tbName;
|
||||||
|
} SVDeleteReq;
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
int32_t code;
|
||||||
|
// TODO
|
||||||
|
} SVDeleteRsp;
|
||||||
|
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -221,9 +221,11 @@ enum {
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SYNC_APPLY_MSG, "vnode-sync-apply-msg", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_SYNC_APPLY_MSG, "vnode-sync-apply-msg", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SYNC_CONFIG_CHANGE, "vnode-sync-config-change", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_SYNC_CONFIG_CHANGE, "vnode-sync-config-change", NULL, NULL)
|
||||||
|
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_SYNC_VNODE, "vnode-sync-vnode", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_CONFIG, "vnode-alter-config", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_VNODE, "vnode-alter-vnode", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_ALTER_REPLICA, "vnode-alter-replica", NULL, NULL)
|
||||||
TD_DEF_MSG_TYPE(TDMT_VND_COMPACT_VNODE, "vnode-compact-vnode", NULL, NULL)
|
TD_DEF_MSG_TYPE(TDMT_VND_COMPACT, "vnode-compact", NULL, NULL)
|
||||||
|
|
||||||
|
TD_DEF_MSG_TYPE(TDMT_VND_DELETE, "vnode-delete-data", SVDeleteReq, SVDeleteRsp)
|
||||||
|
|
||||||
// Requests handled by QNODE
|
// Requests handled by QNODE
|
||||||
TD_NEW_MSG_SEG(TDMT_QND_MSG)
|
TD_NEW_MSG_SEG(TDMT_QND_MSG)
|
||||||
|
|
|
@ -61,11 +61,8 @@ enum {
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t type;
|
int8_t type;
|
||||||
|
int64_t ver;
|
||||||
int32_t sourceVg;
|
|
||||||
int64_t sourceVer;
|
|
||||||
|
|
||||||
int32_t* dataRef;
|
int32_t* dataRef;
|
||||||
SSubmitReq* data;
|
SSubmitReq* data;
|
||||||
} SStreamDataSubmit;
|
} SStreamDataSubmit;
|
||||||
|
@ -111,6 +108,8 @@ static FORCE_INLINE void streamDataSubmitRefDec(SStreamDataSubmit* pDataSubmit)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SStreamDataSubmit* streamSubmitRefClone(SStreamDataSubmit* pSubmit);
|
||||||
|
|
||||||
int32_t streamDataBlockEncode(void** buf, const SStreamDataBlock* pOutput);
|
int32_t streamDataBlockEncode(void** buf, const SStreamDataBlock* pOutput);
|
||||||
void* streamDataBlockDecode(const void* buf, SStreamDataBlock* pInput);
|
void* streamDataBlockDecode(const void* buf, SStreamDataBlock* pInput);
|
||||||
|
|
||||||
|
@ -209,8 +208,6 @@ struct SStreamTask {
|
||||||
int32_t nodeId;
|
int32_t nodeId;
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
|
|
||||||
// source preprocess
|
|
||||||
|
|
||||||
// exec
|
// exec
|
||||||
STaskExec exec;
|
STaskExec exec;
|
||||||
|
|
||||||
|
@ -318,8 +315,6 @@ int32_t streamDequeueOutput(SStreamTask* pTask, void** output);
|
||||||
|
|
||||||
int32_t streamTaskRun(SStreamTask* pTask);
|
int32_t streamTaskRun(SStreamTask* pTask);
|
||||||
|
|
||||||
int32_t streamTaskHandleInput(SStreamTask* pTask, void* data);
|
|
||||||
|
|
||||||
int32_t streamTaskProcessRunReq(SStreamTask* pTask, SMsgCb* pMsgCb);
|
int32_t streamTaskProcessRunReq(SStreamTask* pTask, SMsgCb* pMsgCb);
|
||||||
int32_t streamProcessDispatchReq(SStreamTask* pTask, SMsgCb* pMsgCb, SStreamDispatchReq* pReq, SRpcMsg* pMsg);
|
int32_t streamProcessDispatchReq(SStreamTask* pTask, SMsgCb* pMsgCb, SStreamDispatchReq* pReq, SRpcMsg* pMsg);
|
||||||
int32_t streamProcessDispatchRsp(SStreamTask* pTask, SMsgCb* pMsgCb, SStreamDispatchRsp* pRsp);
|
int32_t streamProcessDispatchRsp(SStreamTask* pTask, SMsgCb* pMsgCb, SStreamDispatchRsp* pRsp);
|
||||||
|
|
|
@ -33,8 +33,19 @@ extern "C" {
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
#define TD_TMP_DIR_PATH "C:\\Windows\\Temp\\"
|
#define TD_TMP_DIR_PATH "C:\\Windows\\Temp\\"
|
||||||
|
#define TD_CFG_DIR_PATH "C:\\TDengine\\cfg\\"
|
||||||
|
#define TD_DATA_DIR_PATH "C:\\TDengine\\data\\"
|
||||||
|
#define TD_LOG_DIR_PATH "C:\\TDengine\\log\\"
|
||||||
|
#elif defined(_TD_DARWIN_64)
|
||||||
|
#define TD_TMP_DIR_PATH "/tmp/taosd/"
|
||||||
|
#define TD_CFG_DIR_PATH "/usr/local/etc/taos/"
|
||||||
|
#define TD_DATA_DIR_PATH "/usr/local/var/lib/taos/"
|
||||||
|
#define TD_LOG_DIR_PATH "/usr/local/var/log/taos/"
|
||||||
#else
|
#else
|
||||||
#define TD_TMP_DIR_PATH "/tmp/"
|
#define TD_TMP_DIR_PATH "/tmp/"
|
||||||
|
#define TD_CFG_DIR_PATH "/etc/taos/"
|
||||||
|
#define TD_DATA_DIR_PATH "/var/lib/taos/"
|
||||||
|
#define TD_LOG_DIR_PATH "/var/log/taos/"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct TdDir *TdDirPtr;
|
typedef struct TdDir *TdDirPtr;
|
||||||
|
|
|
@ -70,6 +70,7 @@ int32_t* taosGetErrno();
|
||||||
#define TSDB_CODE_NEED_RETRY TAOS_DEF_ERROR_CODE(0, 0x0028)
|
#define TSDB_CODE_NEED_RETRY TAOS_DEF_ERROR_CODE(0, 0x0028)
|
||||||
#define TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE TAOS_DEF_ERROR_CODE(0, 0x0029)
|
#define TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE TAOS_DEF_ERROR_CODE(0, 0x0029)
|
||||||
#define TSDB_CODE_INVALID_TIMESTAMP TAOS_DEF_ERROR_CODE(0, 0x0030)
|
#define TSDB_CODE_INVALID_TIMESTAMP TAOS_DEF_ERROR_CODE(0, 0x0030)
|
||||||
|
#define TSDB_CODE_MSG_DECODE_ERROR TAOS_DEF_ERROR_CODE(0, 0x0031)
|
||||||
|
|
||||||
#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0040)
|
#define TSDB_CODE_REF_NO_MEMORY TAOS_DEF_ERROR_CODE(0, 0x0040)
|
||||||
#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0041)
|
#define TSDB_CODE_REF_FULL TAOS_DEF_ERROR_CODE(0, 0x0041)
|
||||||
|
|
|
@ -461,64 +461,153 @@ static FORCE_INLINE void* tDecoderMalloc(SDecoder* pCoder, int32_t size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ===========================================
|
// ===========================================
|
||||||
#define tPutV(p, v) \
|
#define tPutV(p, v) \
|
||||||
int32_t n = 0; \
|
do { \
|
||||||
for (;;) { \
|
int32_t n = 0; \
|
||||||
if (v <= 0x7f) { \
|
for (;;) { \
|
||||||
if (p) p[n] = v; \
|
if (v <= 0x7f) { \
|
||||||
n++; \
|
if (p) p[n] = v; \
|
||||||
break; \
|
n++; \
|
||||||
} \
|
break; \
|
||||||
if (p) p[n] = (v & 0x7f) | 0x80; \
|
} \
|
||||||
n++; \
|
if (p) p[n] = (v & 0x7f) | 0x80; \
|
||||||
v >>= 7; \
|
n++; \
|
||||||
} \
|
v >>= 7; \
|
||||||
return n;
|
} \
|
||||||
|
return n; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
#define tGetV(p, v) \
|
#define tGetV(p, v) \
|
||||||
int32_t n = 0; \
|
do { \
|
||||||
if (v) *v = 0; \
|
int32_t n = 0; \
|
||||||
for (;;) { \
|
if (v) *v = 0; \
|
||||||
if (p[n] <= 0x7f) { \
|
for (;;) { \
|
||||||
if (v) (*v) |= (p[n] << (7 * n)); \
|
if (p[n] <= 0x7f) { \
|
||||||
n++; \
|
if (v) (*v) |= (p[n] << (7 * n)); \
|
||||||
break; \
|
n++; \
|
||||||
} \
|
break; \
|
||||||
if (v) (*v) |= ((p[n] & 0x7f) << (7 * n)); \
|
} \
|
||||||
n++; \
|
if (v) (*v) |= ((p[n] & 0x7f) << (7 * n)); \
|
||||||
} \
|
n++; \
|
||||||
return n;
|
} \
|
||||||
|
return n; \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
// PUT
|
// PUT
|
||||||
|
static FORCE_INLINE int32_t tPutU8(uint8_t* p, uint8_t v) {
|
||||||
|
if (p) ((uint8_t*)p)[0] = v;
|
||||||
|
return sizeof(uint8_t);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutI8(uint8_t* p, int8_t v) {
|
static FORCE_INLINE int32_t tPutI8(uint8_t* p, int8_t v) {
|
||||||
if (p) ((int8_t*)p)[0] = v;
|
if (p) ((int8_t*)p)[0] = v;
|
||||||
return sizeof(int8_t);
|
return sizeof(int8_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutU16(uint8_t* p, uint16_t v) {
|
||||||
|
if (p) ((uint16_t*)p)[0] = v;
|
||||||
|
return sizeof(uint16_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutI16(uint8_t* p, int16_t v) {
|
||||||
|
if (p) ((int16_t*)p)[0] = v;
|
||||||
|
return sizeof(int16_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutU32(uint8_t* p, uint32_t v) {
|
||||||
|
if (p) ((uint32_t*)p)[0] = v;
|
||||||
|
return sizeof(uint32_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutI32(uint8_t* p, int32_t v) {
|
||||||
|
if (p) ((int32_t*)p)[0] = v;
|
||||||
|
return sizeof(int32_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutU64(uint8_t* p, uint64_t v) {
|
||||||
|
if (p) ((uint64_t*)p)[0] = v;
|
||||||
|
return sizeof(uint64_t);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutI64(uint8_t* p, int64_t v) {
|
static FORCE_INLINE int32_t tPutI64(uint8_t* p, int64_t v) {
|
||||||
if (p) ((int64_t*)p)[0] = v;
|
if (p) ((int64_t*)p)[0] = v;
|
||||||
return sizeof(int64_t);
|
return sizeof(int64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutU16v(uint8_t* p, uint16_t v) { tPutV(p, v) }
|
static FORCE_INLINE int32_t tPutFloat(uint8_t* p, float f) {
|
||||||
|
union {
|
||||||
|
uint32_t ui;
|
||||||
|
float f;
|
||||||
|
} v;
|
||||||
|
v.f = f;
|
||||||
|
|
||||||
|
return tPutU32(p, v.ui);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutDouble(uint8_t* p, double d) {
|
||||||
|
union {
|
||||||
|
uint64_t ui;
|
||||||
|
double d;
|
||||||
|
} v;
|
||||||
|
v.d = d;
|
||||||
|
|
||||||
|
return tPutU64(p, v.ui);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutU16v(uint8_t* p, uint16_t v) { tPutV(p, v); }
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutI16v(uint8_t* p, int16_t v) { return tPutU16v(p, ZIGZAGE(int16_t, v)); }
|
static FORCE_INLINE int32_t tPutI16v(uint8_t* p, int16_t v) { return tPutU16v(p, ZIGZAGE(int16_t, v)); }
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutU32v(uint8_t* p, uint32_t v) { tPutV(p, v) }
|
static FORCE_INLINE int32_t tPutU32v(uint8_t* p, uint32_t v) { tPutV(p, v); }
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tPutI32v(uint8_t* p, int32_t v) { return tPutU32v(p, ZIGZAGE(int32_t, v)); }
|
static FORCE_INLINE int32_t tPutI32v(uint8_t* p, int32_t v) { return tPutU32v(p, ZIGZAGE(int32_t, v)); }
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutU64v(uint8_t* p, uint64_t v) { tPutV(p, v); }
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tPutI64v(uint8_t* p, int64_t v) { return tPutU64v(p, ZIGZAGE(int64_t, v)); }
|
||||||
|
|
||||||
|
// GET
|
||||||
|
static FORCE_INLINE int32_t tGetU8(uint8_t* p, uint8_t* v) {
|
||||||
|
if (v) *v = ((uint8_t*)p)[0];
|
||||||
|
return sizeof(uint8_t);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tGetI8(uint8_t* p, int8_t* v) {
|
static FORCE_INLINE int32_t tGetI8(uint8_t* p, int8_t* v) {
|
||||||
if (v) *v = ((int8_t*)p)[0];
|
if (v) *v = ((int8_t*)p)[0];
|
||||||
return sizeof(int8_t);
|
return sizeof(int8_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetU16(uint8_t* p, uint16_t* v) {
|
||||||
|
if (v) *v = ((uint16_t*)p)[0];
|
||||||
|
return sizeof(uint16_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetI16(uint8_t* p, int16_t* v) {
|
||||||
|
if (v) *v = ((int16_t*)p)[0];
|
||||||
|
return sizeof(int16_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetU32(uint8_t* p, uint32_t* v) {
|
||||||
|
if (v) *v = ((uint32_t*)p)[0];
|
||||||
|
return sizeof(uint32_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetI32(uint8_t* p, int32_t* v) {
|
||||||
|
if (v) *v = ((int32_t*)p)[0];
|
||||||
|
return sizeof(int32_t);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetU64(uint8_t* p, uint64_t* v) {
|
||||||
|
if (v) *v = ((uint64_t*)p)[0];
|
||||||
|
return sizeof(uint64_t);
|
||||||
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tGetI64(uint8_t* p, int64_t* v) {
|
static FORCE_INLINE int32_t tGetI64(uint8_t* p, int64_t* v) {
|
||||||
if (v) *v = ((int64_t*)p)[0];
|
if (v) *v = ((int64_t*)p)[0];
|
||||||
return sizeof(int64_t);
|
return sizeof(int64_t);
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tGetU16v(uint8_t* p, uint16_t* v) { tGetV(p, v) }
|
static FORCE_INLINE int32_t tGetU16v(uint8_t* p, uint16_t* v) { tGetV(p, v); }
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tGetI16v(uint8_t* p, int16_t* v) {
|
static FORCE_INLINE int32_t tGetI16v(uint8_t* p, int16_t* v) {
|
||||||
int32_t n;
|
int32_t n;
|
||||||
|
@ -530,7 +619,7 @@ static FORCE_INLINE int32_t tGetI16v(uint8_t* p, int16_t* v) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tGetU32v(uint8_t* p, uint32_t* v) { tGetV(p, v) }
|
static FORCE_INLINE int32_t tGetU32v(uint8_t* p, uint32_t* v) { tGetV(p, v); }
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tGetI32v(uint8_t* p, int32_t* v) {
|
static FORCE_INLINE int32_t tGetI32v(uint8_t* p, int32_t* v) {
|
||||||
int32_t n;
|
int32_t n;
|
||||||
|
@ -542,6 +631,46 @@ static FORCE_INLINE int32_t tGetI32v(uint8_t* p, int32_t* v) {
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetU64v(uint8_t* p, uint64_t* v) { tGetV(p, v); }
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetI64v(uint8_t* p, int64_t* v) {
|
||||||
|
int32_t n;
|
||||||
|
uint64_t tv;
|
||||||
|
|
||||||
|
n = tGetU64v(p, &tv);
|
||||||
|
if (v) *v = ZIGZAGD(int64_t, tv);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetFloat(uint8_t* p, float* f) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint32_t ui;
|
||||||
|
float f;
|
||||||
|
} v;
|
||||||
|
|
||||||
|
n = tGetU32(p, &v.ui);
|
||||||
|
|
||||||
|
*f = v.f;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetDouble(uint8_t* p, double* d) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
union {
|
||||||
|
uint64_t ui;
|
||||||
|
double d;
|
||||||
|
} v;
|
||||||
|
|
||||||
|
n = tGetU64(p, &v.ui);
|
||||||
|
|
||||||
|
*d = v.d;
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
// =====================
|
// =====================
|
||||||
static FORCE_INLINE int32_t tPutBinary(uint8_t* p, uint8_t* pData, uint32_t nData) {
|
static FORCE_INLINE int32_t tPutBinary(uint8_t* p, uint8_t* pData, uint32_t nData) {
|
||||||
int n = 0;
|
int n = 0;
|
||||||
|
|
|
@ -21,15 +21,10 @@
|
||||||
|
|
||||||
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson);
|
static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson);
|
||||||
|
|
||||||
typedef struct SKVIdx {
|
|
||||||
int32_t cid;
|
|
||||||
int32_t offset;
|
|
||||||
} SKVIdx;
|
|
||||||
|
|
||||||
#pragma pack(push, 1)
|
#pragma pack(push, 1)
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int16_t nCols;
|
int16_t nCols;
|
||||||
SKVIdx idx[];
|
uint8_t idx[];
|
||||||
} STSKVRow;
|
} STSKVRow;
|
||||||
#pragma pack(pop)
|
#pragma pack(pop)
|
||||||
|
|
||||||
|
@ -43,7 +38,507 @@ typedef struct {
|
||||||
|
|
||||||
static FORCE_INLINE int tSKVIdxCmprFn(const void *p1, const void *p2);
|
static FORCE_INLINE int tSKVIdxCmprFn(const void *p1, const void *p2);
|
||||||
|
|
||||||
// STSRow2
|
// SValue
|
||||||
|
static FORCE_INLINE int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
|
n += tPutBinary(p ? p + n : p, pValue->pData, pValue->nData);
|
||||||
|
} else {
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
n += tPutI8(p ? p + n : p, pValue->i8 ? 1 : 0);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
n += tPutI8(p ? p + n : p, pValue->i8);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
n += tPutI16(p ? p + n : p, pValue->i16);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
n += tPutI32(p ? p + n : p, pValue->i32);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
n += tPutI64(p ? p + n : p, pValue->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
n += tPutFloat(p ? p + n : p, pValue->f);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
n += tPutDouble(p ? p + n : p, pValue->d);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
n += tPutI64(p ? p + n : p, pValue->ts);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
n += tPutU8(p ? p + n : p, pValue->u8);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
n += tPutU16(p ? p + n : p, pValue->u16);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
n += tPutU32(p ? p + n : p, pValue->u32);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
n += tPutU64(p ? p + n : p, pValue->u64);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
if (IS_VAR_DATA_TYPE(type)) {
|
||||||
|
n += tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL);
|
||||||
|
} else {
|
||||||
|
switch (type) {
|
||||||
|
case TSDB_DATA_TYPE_BOOL:
|
||||||
|
n += tGetI8(p, &pValue->i8);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TINYINT:
|
||||||
|
n += tGetI8(p, &pValue->i8);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_SMALLINT:
|
||||||
|
n += tGetI16(p, &pValue->i16);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_INT:
|
||||||
|
n += tGetI32(p, &pValue->i32);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_BIGINT:
|
||||||
|
n += tGetI64(p, &pValue->i64);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_FLOAT:
|
||||||
|
n += tGetFloat(p, &pValue->f);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_DOUBLE:
|
||||||
|
n += tGetDouble(p, &pValue->d);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
|
n += tGetI64(p, &pValue->ts);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
n += tGetU8(p, &pValue->u8);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_USMALLINT:
|
||||||
|
n += tGetU16(p, &pValue->u16);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UINT:
|
||||||
|
n += tGetU32(p, &pValue->u32);
|
||||||
|
break;
|
||||||
|
case TSDB_DATA_TYPE_UBIGINT:
|
||||||
|
n += tGetU64(p, &pValue->u64);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
// STSRow2 ========================================================================
|
||||||
|
static void tTupleTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow2 *pRow) {
|
||||||
|
int32_t nColVal = taosArrayGetSize(pArray);
|
||||||
|
STColumn *pTColumn;
|
||||||
|
SColVal *pColVal;
|
||||||
|
|
||||||
|
ASSERT(nColVal > 0);
|
||||||
|
|
||||||
|
pRow->sver = pTSchema->version;
|
||||||
|
|
||||||
|
// ts
|
||||||
|
pTColumn = &pTSchema->columns[0];
|
||||||
|
pColVal = (SColVal *)taosArrayGet(pArray, 0);
|
||||||
|
|
||||||
|
ASSERT(pTColumn->colId == 0 && pColVal->cid == 0);
|
||||||
|
ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
|
|
||||||
|
pRow->ts = pColVal->value.ts;
|
||||||
|
|
||||||
|
// other fields
|
||||||
|
int32_t iColVal = 1;
|
||||||
|
int32_t bidx;
|
||||||
|
uint32_t nv = 0;
|
||||||
|
uint8_t *pb = NULL;
|
||||||
|
uint8_t *pf = NULL;
|
||||||
|
uint8_t *pv = NULL;
|
||||||
|
uint8_t flags = 0;
|
||||||
|
for (int32_t iColumn = 1; iColumn < pTSchema->numOfCols; iColumn++) {
|
||||||
|
bidx = iColumn - 1;
|
||||||
|
pTColumn = &pTSchema->columns[iColumn];
|
||||||
|
|
||||||
|
if (iColVal < nColVal) {
|
||||||
|
pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
|
||||||
|
} else {
|
||||||
|
pColVal = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pColVal) {
|
||||||
|
if (pColVal->cid == pTColumn->colId) {
|
||||||
|
iColVal++;
|
||||||
|
if (pColVal->isNone) {
|
||||||
|
goto _set_none;
|
||||||
|
} else if (pColVal->isNull) {
|
||||||
|
goto _set_null;
|
||||||
|
} else {
|
||||||
|
goto _set_value;
|
||||||
|
}
|
||||||
|
} else if (pColVal->cid > pTColumn->colId) {
|
||||||
|
goto _set_none;
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto _set_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
_set_none:
|
||||||
|
flags |= TSROW_HAS_NONE;
|
||||||
|
// SET_BIT2(pb, bidx, 0); (todo)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_set_null:
|
||||||
|
flags != TSROW_HAS_NULL;
|
||||||
|
// SET_BIT2(pb, bidx, 1); (todo)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_set_value:
|
||||||
|
flags != TSROW_HAS_VAL;
|
||||||
|
// SET_BIT2(pb, bidx, 2); (todo)
|
||||||
|
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
||||||
|
// nv += tPutColVal(pv ? pv + nv : pv, pColVal, pTColumn->type, 1);
|
||||||
|
} else {
|
||||||
|
// tPutColVal(pf ? pf + pTColumn->offset : pf, pColVal, pTColumn->type, 1);
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(flags);
|
||||||
|
switch (flags & 0xf) {
|
||||||
|
case TSROW_HAS_NONE:
|
||||||
|
case TSROW_HAS_NULL:
|
||||||
|
pRow->nData = 0;
|
||||||
|
break;
|
||||||
|
case TSROW_HAS_VAL:
|
||||||
|
pRow->nData = pTSchema->flen + nv;
|
||||||
|
break;
|
||||||
|
case TSROW_HAS_NULL | TSROW_HAS_NONE:
|
||||||
|
pRow->nData = BIT1_SIZE(pTSchema->numOfCols - 1);
|
||||||
|
break;
|
||||||
|
case TSROW_HAS_VAL | TSROW_HAS_NONE:
|
||||||
|
case TSROW_HAS_VAL | TSROW_HAS_NULL:
|
||||||
|
pRow->nData = BIT1_SIZE(pTSchema->numOfCols - 1) + pTSchema->flen + nv;
|
||||||
|
break;
|
||||||
|
case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
|
||||||
|
pRow->nData = BIT2_SIZE(pTSchema->numOfCols - 1) + pTSchema->flen + nv;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void tMapTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow2 *pRow) {
|
||||||
|
int32_t nColVal = taosArrayGetSize(pArray);
|
||||||
|
STColumn *pTColumn;
|
||||||
|
SColVal *pColVal;
|
||||||
|
|
||||||
|
ASSERT(nColVal > 0);
|
||||||
|
|
||||||
|
pRow->sver = pTSchema->version;
|
||||||
|
|
||||||
|
// ts
|
||||||
|
pTColumn = &pTSchema->columns[0];
|
||||||
|
pColVal = (SColVal *)taosArrayGet(pArray, 0);
|
||||||
|
|
||||||
|
ASSERT(pTColumn->colId == 0 && pColVal->cid == 0);
|
||||||
|
ASSERT(pTColumn->type == TSDB_DATA_TYPE_TIMESTAMP);
|
||||||
|
|
||||||
|
pRow->ts = pColVal->value.ts;
|
||||||
|
|
||||||
|
// other fields
|
||||||
|
int32_t iColVal = 1;
|
||||||
|
uint32_t nv = 0;
|
||||||
|
uint8_t *pv = NULL;
|
||||||
|
uint8_t *pidx = NULL;
|
||||||
|
uint8_t flags = 0;
|
||||||
|
int16_t nCol = 0;
|
||||||
|
for (int32_t iColumn = 1; iColumn < pTSchema->numOfCols; iColumn++) {
|
||||||
|
pTColumn = &pTSchema->columns[iColumn];
|
||||||
|
|
||||||
|
if (iColVal < nColVal) {
|
||||||
|
pColVal = (SColVal *)taosArrayGet(pArray, iColVal);
|
||||||
|
} else {
|
||||||
|
pColVal = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pColVal) {
|
||||||
|
if (pColVal->cid == pTColumn->colId) {
|
||||||
|
iColVal++;
|
||||||
|
if (pColVal->isNone) {
|
||||||
|
goto _set_none;
|
||||||
|
} else if (pColVal->isNull) {
|
||||||
|
goto _set_null;
|
||||||
|
} else {
|
||||||
|
goto _set_value;
|
||||||
|
}
|
||||||
|
} else if (pColVal->cid > pTColumn->colId) {
|
||||||
|
goto _set_none;
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
goto _set_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
_set_none:
|
||||||
|
flags |= TSROW_HAS_NONE;
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_set_null:
|
||||||
|
flags != TSROW_HAS_NULL;
|
||||||
|
pidx[nCol++] = nv;
|
||||||
|
// nv += tPutColVal(pv ? pv + nv : pv, pColVal, pTColumn->type, 0);
|
||||||
|
continue;
|
||||||
|
|
||||||
|
_set_value:
|
||||||
|
flags != TSROW_HAS_VAL;
|
||||||
|
pidx[nCol++] = nv;
|
||||||
|
// nv += tPutColVal(pv ? pv + nv : pv, pColVal, pTColumn->type, 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nv <= UINT8_MAX) {
|
||||||
|
// small
|
||||||
|
} else if (nv <= UINT16_MAX) {
|
||||||
|
// mid
|
||||||
|
} else {
|
||||||
|
// large
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// try-decide-build
|
||||||
|
int32_t tTSRowNew(SArray *pArray, STSchema *pTSchema, STSRow2 **ppRow) {
|
||||||
|
int32_t code = 0;
|
||||||
|
STSRow2 rowT = {0};
|
||||||
|
STSRow2 rowM = {0};
|
||||||
|
|
||||||
|
// try
|
||||||
|
tTupleTSRowNew(pArray, pTSchema, &rowT);
|
||||||
|
tMapTSRowNew(pArray, pTSchema, &rowM);
|
||||||
|
|
||||||
|
// decide & build
|
||||||
|
if (rowT.nData <= rowM.nData) {
|
||||||
|
tTupleTSRowNew(pArray, pTSchema, &rowT);
|
||||||
|
} else {
|
||||||
|
tMapTSRowNew(pArray, pTSchema, &rowM);
|
||||||
|
}
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tTSRowClone(const STSRow2 *pRow, STSRow2 **ppRow) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
(*ppRow) = (STSRow2 *)taosMemoryMalloc(sizeof(**ppRow));
|
||||||
|
if (*ppRow == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
**ppRow = *pRow;
|
||||||
|
(*ppRow)->pData = NULL;
|
||||||
|
|
||||||
|
if (pRow->nData) {
|
||||||
|
(*ppRow)->pData = taosMemoryMalloc(pRow->nData);
|
||||||
|
if ((*ppRow)->pData == NULL) {
|
||||||
|
taosMemoryFree(*ppRow);
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
memcpy((*ppRow)->pData, pRow->pData, pRow->nData);
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tTSRowFree(STSRow2 *pRow) {
|
||||||
|
if (pRow) {
|
||||||
|
if (pRow->pData) taosMemoryFree(pRow->pData);
|
||||||
|
taosMemoryFree(pRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void tTSRowGet(STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
|
||||||
|
uint8_t isTuple = (pRow->flags & 0xf0 == 0) ? 1 : 0;
|
||||||
|
STColumn *pTColumn = &pTSchema->columns[iCol];
|
||||||
|
uint8_t flags = pRow->flags & (uint8_t)0xf;
|
||||||
|
SValue value;
|
||||||
|
|
||||||
|
ASSERT(iCol < pTSchema->numOfCols);
|
||||||
|
ASSERT(flags);
|
||||||
|
ASSERT(pRow->sver == pTSchema->version);
|
||||||
|
|
||||||
|
if (iCol == 0) {
|
||||||
|
value.ts = pRow->ts;
|
||||||
|
goto _return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flags == TSROW_HAS_NONE) {
|
||||||
|
goto _return_none;
|
||||||
|
} else if (flags == TSROW_HAS_NONE) {
|
||||||
|
goto _return_null;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(pRow->nData && pRow->pData);
|
||||||
|
|
||||||
|
if (isTuple) {
|
||||||
|
uint8_t *pb = pRow->pData;
|
||||||
|
uint8_t *pf = NULL;
|
||||||
|
uint8_t *pv = NULL;
|
||||||
|
uint8_t *p;
|
||||||
|
uint8_t b;
|
||||||
|
|
||||||
|
// bit
|
||||||
|
switch (flags) {
|
||||||
|
case TSROW_HAS_VAL:
|
||||||
|
pf = pb;
|
||||||
|
break;
|
||||||
|
case TSROW_HAS_NULL | TSROW_HAS_NONE:
|
||||||
|
b = GET_BIT1(pb, iCol - 1);
|
||||||
|
if (b == 0) {
|
||||||
|
goto _return_none;
|
||||||
|
} else {
|
||||||
|
goto _return_null;
|
||||||
|
}
|
||||||
|
case TSROW_HAS_VAL | TSROW_HAS_NONE:
|
||||||
|
b = GET_BIT1(pb, iCol - 1);
|
||||||
|
if (b == 0) {
|
||||||
|
goto _return_none;
|
||||||
|
} else {
|
||||||
|
pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSROW_HAS_VAL | TSROW_HAS_NULL:
|
||||||
|
b = GET_BIT1(pb, iCol - 1);
|
||||||
|
if (b == 0) {
|
||||||
|
goto _return_null;
|
||||||
|
} else {
|
||||||
|
pf = pb + BIT1_SIZE(pTSchema->numOfCols - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
|
||||||
|
b = GET_BIT2(pb, iCol - 1);
|
||||||
|
if (b == 0) {
|
||||||
|
goto _return_none;
|
||||||
|
} else if (b == 1) {
|
||||||
|
goto _return_null;
|
||||||
|
} else {
|
||||||
|
pf = pb + BIT2_SIZE(pTSchema->numOfCols - 1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(pf);
|
||||||
|
|
||||||
|
p = pf + pTColumn->offset;
|
||||||
|
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
||||||
|
pv = pf + pTSchema->flen;
|
||||||
|
p = pv + *(VarDataOffsetT *)p;
|
||||||
|
}
|
||||||
|
tGetValue(p, &value, pTColumn->type);
|
||||||
|
goto _return_value;
|
||||||
|
} else {
|
||||||
|
STSKVRow *pRowK = (STSKVRow *)pRow->pData;
|
||||||
|
int16_t lidx = 0;
|
||||||
|
int16_t ridx = pRowK->nCols - 1;
|
||||||
|
uint8_t *p;
|
||||||
|
int16_t midx;
|
||||||
|
uint32_t n;
|
||||||
|
int16_t cid;
|
||||||
|
|
||||||
|
ASSERT(pRowK->nCols > 0);
|
||||||
|
|
||||||
|
if (pRow->flags & TSROW_KV_SMALL) {
|
||||||
|
p = pRow->pData + sizeof(STSKVRow) + sizeof(uint8_t) * pRowK->nCols;
|
||||||
|
} else if (pRow->flags & TSROW_KV_MID) {
|
||||||
|
p = pRow->pData + sizeof(STSKVRow) + sizeof(uint16_t) * pRowK->nCols;
|
||||||
|
} else if (pRow->flags & TSROW_KV_BIG) {
|
||||||
|
p = pRow->pData + sizeof(STSKVRow) + sizeof(uint32_t) * pRowK->nCols;
|
||||||
|
} else {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
while (lidx <= ridx) {
|
||||||
|
midx = (lidx + ridx) / 2;
|
||||||
|
|
||||||
|
if (pRow->flags & TSROW_KV_SMALL) {
|
||||||
|
n = ((uint8_t *)pRowK->idx)[midx];
|
||||||
|
} else if (pRow->flags & TSROW_KV_MID) {
|
||||||
|
n = ((uint16_t *)pRowK->idx)[midx];
|
||||||
|
} else {
|
||||||
|
n = ((uint32_t *)pRowK->idx)[midx];
|
||||||
|
}
|
||||||
|
|
||||||
|
n += tGetI16v(p + n, &cid);
|
||||||
|
|
||||||
|
if (TABS(cid) == pTColumn->colId) {
|
||||||
|
if (cid < 0) {
|
||||||
|
goto _return_null;
|
||||||
|
} else {
|
||||||
|
n += tGetValue(p + n, &value, pTColumn->type);
|
||||||
|
goto _return_value;
|
||||||
|
}
|
||||||
|
|
||||||
|
return;
|
||||||
|
} else if (TABS(cid) > pTColumn->colId) {
|
||||||
|
ridx = midx - 1;
|
||||||
|
} else {
|
||||||
|
lidx = midx + 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// not found, return NONE
|
||||||
|
goto _return_none;
|
||||||
|
}
|
||||||
|
|
||||||
|
_return_none:
|
||||||
|
*pColVal = COL_VAL_NONE(pTColumn->colId);
|
||||||
|
return;
|
||||||
|
|
||||||
|
_return_null:
|
||||||
|
*pColVal = COL_VAL_NULL(pTColumn->colId);
|
||||||
|
return;
|
||||||
|
|
||||||
|
_return_value:
|
||||||
|
*pColVal = COL_VAL_VALUE(pTColumn->colId, value);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tTSRowToArray(STSRow2 *pRow, STSchema *pTSchema, SArray **ppArray) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SColVal cv;
|
||||||
|
|
||||||
|
(*ppArray) = taosArrayInit(pTSchema->numOfCols, sizeof(SColVal));
|
||||||
|
if (*ppArray == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t iColumn = 0; iColumn < pTSchema->numOfCols; iColumn++) {
|
||||||
|
tTSRowGet(pRow, pTSchema, iColumn, &cv);
|
||||||
|
taosArrayPush(*ppArray, &cv);
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow) {
|
int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow) {
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
|
|
||||||
|
@ -56,8 +551,11 @@ int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow) {
|
||||||
switch (pRow->flags & 0xf) {
|
switch (pRow->flags & 0xf) {
|
||||||
case TSROW_HAS_NONE:
|
case TSROW_HAS_NONE:
|
||||||
case TSROW_HAS_NULL:
|
case TSROW_HAS_NULL:
|
||||||
|
ASSERT(pRow->nData == 0);
|
||||||
|
ASSERT(pRow->pData == NULL);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
ASSERT(pRow->nData && pRow->pData);
|
||||||
n += tPutBinary(p ? p + n : p, pRow->pData, pRow->nData);
|
n += tPutBinary(p ? p + n : p, pRow->pData, pRow->nData);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -67,149 +565,26 @@ int32_t tPutTSRow(uint8_t *p, STSRow2 *pRow) {
|
||||||
|
|
||||||
int32_t tGetTSRow(uint8_t *p, STSRow2 *pRow) {
|
int32_t tGetTSRow(uint8_t *p, STSRow2 *pRow) {
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
uint8_t flags;
|
|
||||||
|
|
||||||
n += tGetI64(p + n, pRow ? &pRow->ts : NULL);
|
n += tGetI64(p + n, &pRow->ts);
|
||||||
n += tGetI8(p + n, pRow ? &pRow->flags : &flags);
|
n += tGetI8(p + n, &pRow->flags);
|
||||||
n += tGetI32v(p + n, pRow ? &pRow->sver : NULL);
|
n += tGetI32v(p + n, &pRow->sver);
|
||||||
|
|
||||||
if (pRow) flags = pRow->flags;
|
ASSERT(pRow->flags);
|
||||||
switch (flags & 0xf) {
|
switch (pRow->flags & 0xf) {
|
||||||
case TSROW_HAS_NONE:
|
case TSROW_HAS_NONE:
|
||||||
case TSROW_HAS_NULL:
|
case TSROW_HAS_NULL:
|
||||||
|
pRow->nData = 0;
|
||||||
|
pRow->pData = NULL;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
n += tGetBinary(p + n, pRow ? &pRow->pData : NULL, pRow ? &pRow->nData : NULL);
|
n += tGetBinary(p + n, &pRow->pData, &pRow->nData);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tTSRowDup(const STSRow2 *pRow, STSRow2 **ppRow) {
|
|
||||||
(*ppRow) = taosMemoryMalloc(sizeof(*pRow) + pRow->nData);
|
|
||||||
if (*ppRow == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
(*ppRow)->ts = pRow->ts;
|
|
||||||
(*ppRow)->flags = pRow->flags;
|
|
||||||
(*ppRow)->sver = pRow->sver;
|
|
||||||
(*ppRow)->nData = pRow->nData;
|
|
||||||
if (pRow->nData) {
|
|
||||||
(*ppRow)->pData = (uint8_t *)(&(*ppRow)[1]);
|
|
||||||
memcpy((*ppRow)->pData, pRow->pData, pRow->nData);
|
|
||||||
} else {
|
|
||||||
(*ppRow)->pData = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void tTSRowFree(STSRow2 *pRow) {
|
|
||||||
if (pRow) taosMemoryFree(pRow);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tTSRowGet(const STSRow2 *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal) {
|
|
||||||
uint32_t n;
|
|
||||||
uint8_t *p;
|
|
||||||
uint8_t v;
|
|
||||||
int32_t bidx = iCol - 1;
|
|
||||||
STColumn *pTColumn = &pTSchema->columns[iCol];
|
|
||||||
STSKVRow *pTSKVRow;
|
|
||||||
SKVIdx *pKVIdx;
|
|
||||||
|
|
||||||
ASSERT(iCol != 0);
|
|
||||||
ASSERT(pTColumn->colId != 0);
|
|
||||||
|
|
||||||
ASSERT((pRow->flags & 0xf) != 0);
|
|
||||||
switch (pRow->flags & 0xf) {
|
|
||||||
case TSROW_HAS_NONE:
|
|
||||||
*pColVal = ColValNONE;
|
|
||||||
return 0;
|
|
||||||
case TSROW_HAS_NULL:
|
|
||||||
*pColVal = ColValNULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (TSROW_IS_KV_ROW(pRow)) {
|
|
||||||
ASSERT((pRow->flags & 0xf) != TSROW_HAS_VAL);
|
|
||||||
|
|
||||||
pTSKVRow = (STSKVRow *)pRow->pData;
|
|
||||||
pKVIdx =
|
|
||||||
bsearch(&((SKVIdx){.cid = pTColumn->colId}), pTSKVRow->idx, pTSKVRow->nCols, sizeof(SKVIdx), tSKVIdxCmprFn);
|
|
||||||
if (pKVIdx == NULL) {
|
|
||||||
*pColVal = ColValNONE;
|
|
||||||
} else if (pKVIdx->offset < 0) {
|
|
||||||
*pColVal = ColValNULL;
|
|
||||||
} else {
|
|
||||||
p = pRow->pData + sizeof(STSKVRow) + sizeof(SKVIdx) * pTSKVRow->nCols + pKVIdx->offset;
|
|
||||||
pColVal->type = COL_VAL_DATA;
|
|
||||||
tGetBinary(p, &pColVal->pData, &pColVal->nData);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// get bitmap
|
|
||||||
p = pRow->pData;
|
|
||||||
switch (pRow->flags & 0xf) {
|
|
||||||
case TSROW_HAS_NULL | TSROW_HAS_NONE:
|
|
||||||
v = GET_BIT1(p, bidx);
|
|
||||||
if (v == 0) {
|
|
||||||
*pColVal = ColValNONE;
|
|
||||||
} else {
|
|
||||||
*pColVal = ColValNULL;
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
case TSROW_HAS_VAL | TSROW_HAS_NONE:
|
|
||||||
v = GET_BIT1(p, bidx);
|
|
||||||
if (v == 1) {
|
|
||||||
p = p + BIT1_SIZE(pTSchema->numOfCols - 1);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*pColVal = ColValNONE;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
case TSROW_HAS_VAL | TSROW_HAS_NULL:
|
|
||||||
v = GET_BIT1(p, bidx);
|
|
||||||
if (v == 1) {
|
|
||||||
p = p + BIT1_SIZE(pTSchema->numOfCols - 1);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
*pColVal = ColValNULL;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
case TSROW_HAS_VAL | TSROW_HAS_NULL | TSROW_HAS_NONE:
|
|
||||||
v = GET_BIT2(p, bidx);
|
|
||||||
if (v == 0) {
|
|
||||||
*pColVal = ColValNONE;
|
|
||||||
return 0;
|
|
||||||
} else if (v == 1) {
|
|
||||||
*pColVal = ColValNULL;
|
|
||||||
return 0;
|
|
||||||
} else if (v == 2) {
|
|
||||||
p = p + BIT2_SIZE(pTSchema->numOfCols - 1);
|
|
||||||
break;
|
|
||||||
} else {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// get real value
|
|
||||||
p = p + pTColumn->offset;
|
|
||||||
pColVal->type = COL_VAL_DATA;
|
|
||||||
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
|
|
||||||
tGetBinary(p + pTSchema->flen + *(int32_t *)p, &pColVal->pData, &pColVal->nData);
|
|
||||||
} else {
|
|
||||||
pColVal->pData = p;
|
|
||||||
pColVal->nData = pTColumn->bytes;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// STSchema
|
// STSchema
|
||||||
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t ncols, STSchema **ppTSchema) {
|
int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t ncols, STSchema **ppTSchema) {
|
||||||
*ppTSchema = (STSchema *)taosMemoryMalloc(sizeof(STSchema) + sizeof(STColumn) * ncols);
|
*ppTSchema = (STSchema *)taosMemoryMalloc(sizeof(STSchema) + sizeof(STColumn) * ncols);
|
||||||
|
@ -251,6 +626,7 @@ void tTSchemaDestroy(STSchema *pTSchema) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// STSRowBuilder
|
// STSRowBuilder
|
||||||
|
#if 0
|
||||||
int32_t tTSRowBuilderInit(STSRowBuilder *pBuilder, int32_t sver, int32_t nCols, SSchema *pSchema) {
|
int32_t tTSRowBuilderInit(STSRowBuilder *pBuilder, int32_t sver, int32_t nCols, SSchema *pSchema) {
|
||||||
if (tTSchemaCreate(sver, pSchema, nCols, &pBuilder->pTSchema) < 0) return -1;
|
if (tTSchemaCreate(sver, pSchema, nCols, &pBuilder->pTSchema) < 0) return -1;
|
||||||
|
|
||||||
|
@ -508,6 +884,7 @@ int32_t tTSRowBuilderGetRow(STSRowBuilder *pBuilder, const STSRow2 **ppRow) {
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int tTagValCmprFn(const void *p1, const void *p2) {
|
static int tTagValCmprFn(const void *p1, const void *p2) {
|
||||||
if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
|
if (((STagVal *)p1)->cid < ((STagVal *)p2)->cid) {
|
||||||
|
@ -622,9 +999,9 @@ void debugPrintSTag(STag *pTag, const char *tag, int32_t ln) {
|
||||||
}
|
}
|
||||||
printf("%s:%d loop[%d-%d] offset=%d\n", __func__, __LINE__, (int32_t)pTag->nTag, (int32_t)n, (int32_t)offset);
|
printf("%s:%d loop[%d-%d] offset=%d\n", __func__, __LINE__, (int32_t)pTag->nTag, (int32_t)n, (int32_t)offset);
|
||||||
tGetTagVal(p + offset, &tagVal, isJson);
|
tGetTagVal(p + offset, &tagVal, isJson);
|
||||||
if(IS_VAR_DATA_TYPE(tagVal.type)){
|
if (IS_VAR_DATA_TYPE(tagVal.type)) {
|
||||||
debugPrintTagVal(tagVal.type, tagVal.pData, tagVal.nData, __func__, __LINE__);
|
debugPrintTagVal(tagVal.type, tagVal.pData, tagVal.nData, __func__, __LINE__);
|
||||||
}else{
|
} else {
|
||||||
debugPrintTagVal(tagVal.type, &tagVal.i64, tDataTypes[tagVal.type].bytes, __func__, __LINE__);
|
debugPrintTagVal(tagVal.type, &tagVal.i64, tDataTypes[tagVal.type].bytes, __func__, __LINE__);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -650,7 +1027,7 @@ static int32_t tPutTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
|
||||||
} else {
|
} else {
|
||||||
p = p ? p + n : p;
|
p = p ? p + n : p;
|
||||||
n += tDataTypes[pTagVal->type].bytes;
|
n += tDataTypes[pTagVal->type].bytes;
|
||||||
if(p) memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
|
if (p) memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
@ -750,21 +1127,21 @@ void tTagFree(STag *pTag) {
|
||||||
if (pTag) taosMemoryFree(pTag);
|
if (pTag) taosMemoryFree(pTag);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *tTagValToData(const STagVal *value, bool isJson){
|
char *tTagValToData(const STagVal *value, bool isJson) {
|
||||||
if(!value) return NULL;
|
if (!value) return NULL;
|
||||||
char *data = NULL;
|
char *data = NULL;
|
||||||
int8_t typeBytes = 0;
|
int8_t typeBytes = 0;
|
||||||
if (isJson) {
|
if (isJson) {
|
||||||
typeBytes = CHAR_BYTES;
|
typeBytes = CHAR_BYTES;
|
||||||
}
|
}
|
||||||
if(IS_VAR_DATA_TYPE(value->type)){
|
if (IS_VAR_DATA_TYPE(value->type)) {
|
||||||
data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
|
data = taosMemoryCalloc(1, typeBytes + VARSTR_HEADER_SIZE + value->nData);
|
||||||
if(data == NULL) return NULL;
|
if (data == NULL) return NULL;
|
||||||
if(isJson) *data = value->type;
|
if (isJson) *data = value->type;
|
||||||
varDataLen(data + typeBytes) = value->nData;
|
varDataLen(data + typeBytes) = value->nData;
|
||||||
memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
|
memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
|
||||||
}else{
|
} else {
|
||||||
data = ((char*)&(value->i64)) - typeBytes; // json with type
|
data = ((char *)&(value->i64)) - typeBytes; // json with type
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#undef TD_MSG_SEG_CODE_
|
#undef TD_MSG_SEG_CODE_
|
||||||
#include "tmsgdef.h"
|
#include "tmsgdef.h"
|
||||||
|
|
||||||
int32_t tInitSubmitMsgIter(SSubmitReq *pMsg, SSubmitMsgIter *pIter) {
|
int32_t tInitSubmitMsgIter(const SSubmitReq *pMsg, SSubmitMsgIter *pIter) {
|
||||||
if (pMsg == NULL) {
|
if (pMsg == NULL) {
|
||||||
terrno = TSDB_CODE_TDB_SUBMIT_MSG_MSSED_UP;
|
terrno = TSDB_CODE_TDB_SUBMIT_MSG_MSSED_UP;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -165,7 +165,6 @@ int32_t tDecodeSQueryNodeLoad(SDecoder *pDecoder, SQueryNodeLoad *pLoad) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t taosEncodeSEpSet(void **buf, const SEpSet *pEp) {
|
int32_t taosEncodeSEpSet(void **buf, const SEpSet *pEp) {
|
||||||
int32_t tlen = 0;
|
int32_t tlen = 0;
|
||||||
tlen += taosEncodeFixedI8(buf, pEp->inUse);
|
tlen += taosEncodeFixedI8(buf, pEp->inUse);
|
||||||
|
@ -2934,7 +2933,6 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR
|
||||||
|
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->vgId) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->vgId) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->dnodeId) < 0) return -1;
|
|
||||||
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->db) < 0) return -1;
|
||||||
if (tEncodeI64(&encoder, pReq->dbUid) < 0) return -1;
|
if (tEncodeI64(&encoder, pReq->dbUid) < 0) return -1;
|
||||||
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
|
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
|
||||||
|
@ -2957,6 +2955,7 @@ int32_t tSerializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *pR
|
||||||
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->compression) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pReq->standby) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->replica) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->replica) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1;
|
||||||
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
||||||
|
@ -2991,7 +2990,6 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
|
|
||||||
if (tStartDecode(&decoder) < 0) return -1;
|
if (tStartDecode(&decoder) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->vgId) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->vgId) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->dnodeId) < 0) return -1;
|
|
||||||
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->db) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pReq->dbUid) < 0) return -1;
|
if (tDecodeI64(&decoder, &pReq->dbUid) < 0) return -1;
|
||||||
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
|
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
|
||||||
|
@ -3014,6 +3012,7 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->compression) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pReq->standby) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1;
|
||||||
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
||||||
|
@ -3053,7 +3052,7 @@ int32_t tDeserializeSCreateVnodeReq(void *buf, int32_t bufLen, SCreateVnodeReq *
|
||||||
int32_t tFreeSCreateVnodeReq(SCreateVnodeReq *pReq) {
|
int32_t tFreeSCreateVnodeReq(SCreateVnodeReq *pReq) {
|
||||||
taosArrayDestroy(pReq->pRetensions);
|
taosArrayDestroy(pReq->pRetensions);
|
||||||
pReq->pRetensions = NULL;
|
pReq->pRetensions = NULL;
|
||||||
if(pReq->isTsma) {
|
if (pReq->isTsma) {
|
||||||
taosMemoryFreeClear(pReq->pTsma);
|
taosMemoryFreeClear(pReq->pTsma);
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -3134,8 +3133,8 @@ int32_t tSerializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pReq
|
||||||
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->walLevel) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->strict) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->cacheLastRow) < 0) return -1;
|
||||||
if (tEncodeI8(&encoder, pReq->replica) < 0) return -1;
|
|
||||||
if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->selfIndex) < 0) return -1;
|
||||||
|
if (tEncodeI8(&encoder, pReq->replica) < 0) return -1;
|
||||||
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
||||||
SReplica *pReplica = &pReq->replicas[i];
|
SReplica *pReplica = &pReq->replicas[i];
|
||||||
if (tEncodeSReplica(&encoder, pReplica) < 0) return -1;
|
if (tEncodeSReplica(&encoder, pReplica) < 0) return -1;
|
||||||
|
@ -3165,8 +3164,8 @@ int32_t tDeserializeSAlterVnodeReq(void *buf, int32_t bufLen, SAlterVnodeReq *pR
|
||||||
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->walLevel) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->strict) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->cacheLastRow) < 0) return -1;
|
||||||
if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1;
|
|
||||||
if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->selfIndex) < 0) return -1;
|
||||||
|
if (tDecodeI8(&decoder, &pReq->replica) < 0) return -1;
|
||||||
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
|
||||||
SReplica *pReplica = &pReq->replicas[i];
|
SReplica *pReplica = &pReq->replicas[i];
|
||||||
if (tDecodeSReplica(&decoder, pReplica) < 0) return -1;
|
if (tDecodeSReplica(&decoder, pReplica) < 0) return -1;
|
||||||
|
@ -3654,6 +3653,7 @@ int32_t tEncodeTSma(SEncoder *pCoder, const STSma *pSma) {
|
||||||
if (tEncodeI8(pCoder, pSma->intervalUnit) < 0) return -1;
|
if (tEncodeI8(pCoder, pSma->intervalUnit) < 0) return -1;
|
||||||
if (tEncodeI8(pCoder, pSma->slidingUnit) < 0) return -1;
|
if (tEncodeI8(pCoder, pSma->slidingUnit) < 0) return -1;
|
||||||
if (tEncodeI8(pCoder, pSma->timezoneInt) < 0) return -1;
|
if (tEncodeI8(pCoder, pSma->timezoneInt) < 0) return -1;
|
||||||
|
if (tEncodeI32(pCoder, pSma->dstVgId) < 0) return -1;
|
||||||
if (tEncodeCStr(pCoder, pSma->indexName) < 0) return -1;
|
if (tEncodeCStr(pCoder, pSma->indexName) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pSma->exprLen) < 0) return -1;
|
if (tEncodeI32(pCoder, pSma->exprLen) < 0) return -1;
|
||||||
if (tEncodeI32(pCoder, pSma->tagsFilterLen) < 0) return -1;
|
if (tEncodeI32(pCoder, pSma->tagsFilterLen) < 0) return -1;
|
||||||
|
@ -3676,6 +3676,7 @@ int32_t tDecodeTSma(SDecoder *pCoder, STSma *pSma) {
|
||||||
if (tDecodeI8(pCoder, &pSma->version) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->version) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pSma->intervalUnit) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->intervalUnit) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pSma->slidingUnit) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->slidingUnit) < 0) return -1;
|
||||||
|
if (tDecodeI32(pCoder, &pSma->dstVgId) < 0) return -1;
|
||||||
if (tDecodeI8(pCoder, &pSma->timezoneInt) < 0) return -1;
|
if (tDecodeI8(pCoder, &pSma->timezoneInt) < 0) return -1;
|
||||||
if (tDecodeCStrTo(pCoder, pSma->indexName) < 0) return -1;
|
if (tDecodeCStrTo(pCoder, pSma->indexName) < 0) return -1;
|
||||||
if (tDecodeI32(pCoder, &pSma->exprLen) < 0) return -1;
|
if (tDecodeI32(pCoder, &pSma->exprLen) < 0) return -1;
|
||||||
|
|
|
@ -219,9 +219,9 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_TASK, mmPutNodeMsgToQueryQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_DROP_TASK, mmPutNodeMsgToQueryQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_QUERY_HEARTBEAT, mmPutNodeMsgToQueryQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_QUERY_HEARTBEAT, mmPutNodeMsgToQueryQueue, 1) == NULL) goto _OVER;
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_VNODE_RSP, mmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_CONFIG_RSP, mmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_SYNC_VNODE_RSP, mmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_REPLICA_RSP, mmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT_VNODE_RSP, mmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT_RSP, mmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_SYNC_TIMEOUT, mmPutNodeMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_SYNC_TIMEOUT, mmPutNodeMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_SYNC_PING, mmPutNodeMsgToSyncQueue, 1) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_SYNC_PING, mmPutNodeMsgToSyncQueue, 1) == NULL) goto _OVER;
|
||||||
|
|
|
@ -150,20 +150,26 @@ static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
|
||||||
pCfg->tsdbCfg.minRows = pCreate->minRows;
|
pCfg->tsdbCfg.minRows = pCreate->minRows;
|
||||||
pCfg->tsdbCfg.maxRows = pCreate->maxRows;
|
pCfg->tsdbCfg.maxRows = pCreate->maxRows;
|
||||||
for (size_t i = 0; i < taosArrayGetSize(pCreate->pRetensions); ++i) {
|
for (size_t i = 0; i < taosArrayGetSize(pCreate->pRetensions); ++i) {
|
||||||
memcpy(&pCfg->tsdbCfg.retentions[i], taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention));
|
SRetention *pRetention = &pCfg->tsdbCfg.retentions[i];
|
||||||
|
memcpy(pRetention, taosArrayGet(pCreate->pRetensions, i), sizeof(SRetention));
|
||||||
|
if (i == 0) {
|
||||||
|
if ((pRetention->freq > 0 && pRetention->keep > 0)) pCfg->isRsma = 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pCfg->walCfg.vgId = pCreate->vgId;
|
pCfg->walCfg.vgId = pCreate->vgId;
|
||||||
pCfg->hashBegin = pCreate->hashBegin;
|
pCfg->hashBegin = pCreate->hashBegin;
|
||||||
pCfg->hashEnd = pCreate->hashEnd;
|
pCfg->hashEnd = pCreate->hashEnd;
|
||||||
pCfg->hashMethod = pCreate->hashMethod;
|
pCfg->hashMethod = pCreate->hashMethod;
|
||||||
|
|
||||||
|
pCfg->standby = pCfg->standby;
|
||||||
pCfg->syncCfg.myIndex = pCreate->selfIndex;
|
pCfg->syncCfg.myIndex = pCreate->selfIndex;
|
||||||
pCfg->syncCfg.replicaNum = pCreate->replica;
|
pCfg->syncCfg.replicaNum = pCreate->replica;
|
||||||
memset(&pCfg->syncCfg.nodeInfo, 0, sizeof(pCfg->syncCfg.nodeInfo));
|
memset(&pCfg->syncCfg.nodeInfo, 0, sizeof(pCfg->syncCfg.nodeInfo));
|
||||||
for (int i = 0; i < pCreate->replica; ++i) {
|
for (int i = 0; i < pCreate->replica; ++i) {
|
||||||
pCfg->syncCfg.nodeInfo[i].nodePort = pCreate->replicas[i].port;
|
SNodeInfo *pNode = &pCfg->syncCfg.nodeInfo[i];
|
||||||
snprintf(pCfg->syncCfg.nodeInfo[i].nodeFqdn, sizeof(pCfg->syncCfg.nodeInfo[i].nodeFqdn), "%s",
|
pNode->nodePort = pCreate->replicas[i].port;
|
||||||
pCreate->replicas[i].fqdn);
|
tstrncpy(pNode->nodeFqdn, pCreate->replicas[i].fqdn, sizeof(pNode->nodeFqdn));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -176,6 +182,8 @@ static void vmGenerateWrapperCfg(SVnodeMgmt *pMgmt, SCreateVnodeReq *pCreate, SW
|
||||||
|
|
||||||
int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
SCreateVnodeReq createReq = {0};
|
SCreateVnodeReq createReq = {0};
|
||||||
|
SVnodeCfg vnodeCfg = {0};
|
||||||
|
SWrapperCfg wrapperCfg = {0};
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
char path[TSDB_FILENAME_LEN] = {0};
|
char path[TSDB_FILENAME_LEN] = {0};
|
||||||
|
|
||||||
|
@ -184,12 +192,9 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("vgId:%d, create vnode req is received, tsma:%d", createReq.vgId, createReq.isTsma);
|
dDebug("vgId:%d, create vnode req is received, tsma:%d standby:%d", createReq.vgId, createReq.isTsma,
|
||||||
|
createReq.standby);
|
||||||
SVnodeCfg vnodeCfg = {0};
|
|
||||||
vmGenerateVnodeCfg(&createReq, &vnodeCfg);
|
vmGenerateVnodeCfg(&createReq, &vnodeCfg);
|
||||||
|
|
||||||
SWrapperCfg wrapperCfg = {0};
|
|
||||||
vmGenerateWrapperCfg(pMgmt, &createReq, &wrapperCfg);
|
vmGenerateWrapperCfg(pMgmt, &createReq, &wrapperCfg);
|
||||||
|
|
||||||
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, createReq.vgId);
|
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, createReq.vgId);
|
||||||
|
@ -218,9 +223,20 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
code = vmOpenVnode(pMgmt, &wrapperCfg, pImpl);
|
code = vmOpenVnode(pMgmt, &wrapperCfg, pImpl);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr());
|
dError("vgId:%d, failed to open vnode since %s", createReq.vgId, terrstr());
|
||||||
|
code = terrno;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (createReq.isTsma) {
|
||||||
|
SMsgHead *smaMsg = createReq.pTsma;
|
||||||
|
uint32_t contLen = (uint32_t)(htonl(smaMsg->contLen) - sizeof(SMsgHead));
|
||||||
|
if (vnodeProcessCreateTSma(pImpl, POINTER_SHIFT(smaMsg, sizeof(SMsgHead)), contLen) < 0) {
|
||||||
|
dError("vgId:%d, failed to create tsma since %s", createReq.vgId, terrstr());
|
||||||
|
code = terrno;
|
||||||
|
goto _OVER;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
code = vnodeStart(pImpl);
|
code = vnodeStart(pImpl);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
dError("vgId:%d, failed to start sync since %s", createReq.vgId, terrstr());
|
dError("vgId:%d, failed to start sync since %s", createReq.vgId, terrstr());
|
||||||
|
@ -228,7 +244,10 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
code = vmWriteVnodeListToFile(pMgmt);
|
code = vmWriteVnodeListToFile(pMgmt);
|
||||||
if (code != 0) goto _OVER;
|
if (code != 0) {
|
||||||
|
code = terrno;
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
|
@ -314,8 +333,9 @@ SArray *vmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_TASK_DISPATCH, vmPutNodeMsgToFetchQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_TASK_DISPATCH, vmPutNodeMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_TASK_RECOVER, vmPutNodeMsgToFetchQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_TASK_RECOVER, vmPutNodeMsgToFetchQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_VNODE, vmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_REPLICA, vmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT_VNODE, vmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_CONFIG, vmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
|
if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT, vmPutNodeMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE, vmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE, vmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE, vmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE, vmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
||||||
|
|
|
@ -61,7 +61,7 @@ int32_t mndTransAppendRedoAction(STrans *pTrans, STransAction *pAction);
|
||||||
int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction);
|
int32_t mndTransAppendUndoAction(STrans *pTrans, STransAction *pAction);
|
||||||
void mndTransSetRpcRsp(STrans *pTrans, void *pCont, int32_t contLen);
|
void mndTransSetRpcRsp(STrans *pTrans, void *pCont, int32_t contLen);
|
||||||
void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, void *param, int32_t paramLen);
|
void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, void *param, int32_t paramLen);
|
||||||
void mndTransSetDbInfo(STrans *pTrans, SDbObj *pDb);
|
void mndTransSetDbName(STrans *pTrans, const char *dbname);
|
||||||
void mndTransSetSerial(STrans *pTrans);
|
void mndTransSetSerial(STrans *pTrans);
|
||||||
|
|
||||||
int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans);
|
int32_t mndTransPrepare(SMnode *pMnode, STrans *pTrans);
|
||||||
|
|
|
@ -36,7 +36,7 @@ SArray *mndBuildDnodesArray(SMnode *pMnode);
|
||||||
int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray);
|
int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray);
|
||||||
int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray, SVnodeGid *del1, SVnodeGid *del2);
|
int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray, SVnodeGid *del1, SVnodeGid *del2);
|
||||||
|
|
||||||
void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen);
|
void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen, bool standby);
|
||||||
void *mndBuildDropVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen);
|
void *mndBuildDropVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen);
|
||||||
void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen);
|
void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen);
|
||||||
|
|
||||||
|
|
|
@ -261,7 +261,7 @@ void mndReleaseDb(SMnode *pMnode, SDbObj *pDb) {
|
||||||
sdbRelease(pSdb, pDb);
|
sdbRelease(pSdb, pDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid) {
|
static int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SVnodeGid *pVgid, bool standby) {
|
||||||
STransAction action = {0};
|
STransAction action = {0};
|
||||||
|
|
||||||
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
|
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
|
||||||
|
@ -270,7 +270,7 @@ static int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *p
|
||||||
mndReleaseDnode(pMnode, pDnode);
|
mndReleaseDnode(pMnode, pDnode);
|
||||||
|
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
|
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen, standby);
|
||||||
if (pReq == NULL) return -1;
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
action.pCont = pReq;
|
action.pCont = pReq;
|
||||||
|
@ -286,7 +286,7 @@ static int32_t mndAddCreateVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *p
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndAddAlterVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup) {
|
static int32_t mndAddAlterVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, tmsg_t msgType) {
|
||||||
STransAction action = {0};
|
STransAction action = {0};
|
||||||
action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
action.epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
||||||
|
|
||||||
|
@ -296,7 +296,7 @@ static int32_t mndAddAlterVnodeAction(SMnode *pMnode, STrans *pTrans, SDbObj *pD
|
||||||
|
|
||||||
action.pCont = pReq;
|
action.pCont = pReq;
|
||||||
action.contLen = contLen;
|
action.contLen = contLen;
|
||||||
action.msgType = TDMT_VND_ALTER_VNODE;
|
action.msgType = msgType;
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
taosMemoryFree(pReq);
|
taosMemoryFree(pReq);
|
||||||
|
@ -388,7 +388,7 @@ static int32_t mndCheckDbCfg(SMnode *pMnode, SDbCfg *pCfg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
terrno = 0;
|
terrno = 0;
|
||||||
return TSDB_CODE_SUCCESS;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
|
static void mndSetDefaultDbCfg(SDbCfg *pCfg) {
|
||||||
|
@ -467,7 +467,7 @@ static int32_t mndSetCreateDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj
|
||||||
|
|
||||||
for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
|
for (int32_t vn = 0; vn < pVgroup->replica; ++vn) {
|
||||||
SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
|
SVnodeGid *pVgid = pVgroup->vnodeGid + vn;
|
||||||
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid) != 0) {
|
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pVgid, false) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -550,7 +550,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate,
|
||||||
|
|
||||||
mDebug("trans:%d, used to create db:%s", pTrans->id, pCreate->db);
|
mDebug("trans:%d, used to create db:%s", pTrans->id, pCreate->db);
|
||||||
|
|
||||||
mndTransSetDbInfo(pTrans, &dbObj);
|
mndTransSetDbName(pTrans, dbObj.name);
|
||||||
if (mndSetCreateDbRedoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbRedoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
if (mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
if (mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
|
@ -688,29 +688,37 @@ static int32_t mndSetDbCfgFromAlterDbReq(SDbObj *pDb, SAlterDbReq *pAlter) {
|
||||||
static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
|
static int32_t mndSetAlterDbRedoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
|
||||||
SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
|
SSdbRaw *pRedoRaw = mndDbActionEncode(pOld);
|
||||||
if (pRedoRaw == NULL) return -1;
|
if (pRedoRaw == NULL) return -1;
|
||||||
if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
|
if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) {
|
||||||
if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY) != 0) return -1;
|
sdbFreeRaw(pRedoRaw);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbSetRawStatus(pRedoRaw, SDB_STATUS_READY);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
|
static int32_t mndSetAlterDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pOld, SDbObj *pNew) {
|
||||||
SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
|
SSdbRaw *pCommitRaw = mndDbActionEncode(pNew);
|
||||||
if (pCommitRaw == NULL) return -1;
|
if (pCommitRaw == NULL) return -1;
|
||||||
if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
|
if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) {
|
||||||
if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
|
sdbFreeRaw(pCommitRaw);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SArray *pArray) {
|
static int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroup, SArray *pArray) {
|
||||||
if (pVgroup->replica <= 0 || pVgroup->replica == pDb->cfg.replications) {
|
if (pVgroup->replica <= 0 || pVgroup->replica == pDb->cfg.replications) {
|
||||||
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup) != 0) {
|
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup, TDMT_VND_ALTER_CONFIG) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SVgObj newVgroup = {0};
|
SVgObj newVgroup = {0};
|
||||||
memcpy(&newVgroup, pVgroup, sizeof(SVgObj));
|
memcpy(&newVgroup, pVgroup, sizeof(SVgObj));
|
||||||
|
mndTransSetSerial(pTrans);
|
||||||
|
|
||||||
if (newVgroup.replica < pDb->cfg.replications) {
|
if (newVgroup.replica < pDb->cfg.replications) {
|
||||||
mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId,
|
mInfo("db:%s, vgId:%d, will add 2 vnodes, vn:0 dnode:%d", pVgroup->dbName, pVgroup->vgId,
|
||||||
pVgroup->vnodeGid[0].dnodeId);
|
pVgroup->vnodeGid[0].dnodeId);
|
||||||
|
@ -720,9 +728,9 @@ static int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
newVgroup.replica = pDb->cfg.replications;
|
newVgroup.replica = pDb->cfg.replications;
|
||||||
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup) != 0) return -1;
|
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[1], true) != 0) return -1;
|
||||||
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[1]) != 0) return -1;
|
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[2], true) != 0) return -1;
|
||||||
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, &newVgroup, &newVgroup.vnodeGid[2]) != 0) return -1;
|
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1;
|
||||||
} else {
|
} else {
|
||||||
mInfo("db:%s, vgId:%d, will remove 2 vnodes", pVgroup->dbName, pVgroup->vgId);
|
mInfo("db:%s, vgId:%d, will remove 2 vnodes", pVgroup->dbName, pVgroup->vgId);
|
||||||
|
|
||||||
|
@ -733,15 +741,18 @@ static int32_t mndBuildAlterVgroupAction(SMnode *pMnode, STrans *pTrans, SDbObj
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
newVgroup.replica = pDb->cfg.replications;
|
newVgroup.replica = pDb->cfg.replications;
|
||||||
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup) != 0) return -1;
|
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, &newVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1;
|
||||||
if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del1, true) != 0) return -1;
|
if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del1, true) != 0) return -1;
|
||||||
if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del2, true) != 0) return -1;
|
if (mndAddDropVnodeAction(pMnode, pTrans, pDb, &newVgroup, &del2, true) != 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup);
|
SSdbRaw *pVgRaw = mndVgroupActionEncode(&newVgroup);
|
||||||
if (pVgRaw == NULL) return -1;
|
if (pVgRaw == NULL) return -1;
|
||||||
if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) return -1;
|
if (mndTransAppendCommitlog(pTrans, pVgRaw) != 0) {
|
||||||
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
|
sdbFreeRaw(pVgRaw);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
sdbSetRawStatus(pVgRaw, SDB_STATUS_READY);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -774,18 +785,16 @@ static int32_t mndSetAlterDbRedoActions(SMnode *pMnode, STrans *pTrans, SDbObj *
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
|
static int32_t mndAlterDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pOld, SDbObj *pNew) {
|
||||||
int32_t code = -1;
|
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq);
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) return -1;
|
||||||
|
|
||||||
mDebug("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
|
mDebug("trans:%d, used to alter db:%s", pTrans->id, pOld->name);
|
||||||
|
|
||||||
mndTransSetDbInfo(pTrans, pOld);
|
int32_t code = -1;
|
||||||
|
mndTransSetDbName(pTrans, pOld->name);
|
||||||
if (mndSetAlterDbRedoLogs(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
|
if (mndSetAlterDbRedoLogs(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
|
||||||
if (mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
|
if (mndSetAlterDbCommitLogs(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
|
||||||
if (mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
|
if (mndSetAlterDbRedoActions(pMnode, pTrans, pOld, pNew) != 0) goto _OVER;
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
||||||
|
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
|
@ -1040,7 +1049,7 @@ static int32_t mndDropDb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb) {
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to drop db:%s", pTrans->id, pDb->name);
|
mDebug("trans:%d, used to drop db:%s", pTrans->id, pDb->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
|
|
||||||
if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
|
if (mndSetDropDbRedoLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
|
||||||
if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
|
if (mndSetDropDbCommitLogs(pMnode, pTrans, pDb) != 0) goto _OVER;
|
||||||
|
|
|
@ -426,7 +426,7 @@ static int32_t mndSetCreateSmaVgroupRedoActions(SMnode *pMnode, STrans *pTrans,
|
||||||
pVgroup->pTsma = pSmaReq;
|
pVgroup->pTsma = pSmaReq;
|
||||||
|
|
||||||
int32_t contLen = 0;
|
int32_t contLen = 0;
|
||||||
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen);
|
void *pReq = mndBuildCreateVnodeReq(pMnode, pDnode, pDb, pVgroup, &contLen, false);
|
||||||
taosMemoryFreeClear(pSmaReq);
|
taosMemoryFreeClear(pSmaReq);
|
||||||
if (pReq == NULL) return -1;
|
if (pReq == NULL) return -1;
|
||||||
|
|
||||||
|
@ -512,7 +512,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to create sma:%s", pTrans->id, pCreate->name);
|
mDebug("trans:%d, used to create sma:%s", pTrans->id, pCreate->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
mndTransSetSerial(pTrans);
|
mndTransSetSerial(pTrans);
|
||||||
|
|
||||||
if (mndSetCreateSmaRedoLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
if (mndSetCreateSmaRedoLogs(pMnode, pTrans, &smaObj) != 0) goto _OVER;
|
||||||
|
@ -757,7 +757,7 @@ static int32_t mndDropSma(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SSmaObj *p
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to drop sma:%s", pTrans->id, pSma->name);
|
mDebug("trans:%d, used to drop sma:%s", pTrans->id, pSma->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
|
|
||||||
if (mndSetDropSmaRedoLogs(pMnode, pTrans, pSma) != 0) goto _OVER;
|
if (mndSetDropSmaRedoLogs(pMnode, pTrans, pSma) != 0) goto _OVER;
|
||||||
if (mndSetDropSmaVgroupRedoLogs(pMnode, pTrans, pVgroup) != 0) goto _OVER;
|
if (mndSetDropSmaVgroupRedoLogs(pMnode, pTrans, pVgroup) != 0) goto _OVER;
|
||||||
|
|
|
@ -754,7 +754,7 @@ _OVER:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
|
int32_t mndAddStbToTrans(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SStbObj *pStb) {
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
if (mndSetCreateStbRedoLogs(pMnode, pTrans, pDb, pStb) != 0) return -1;
|
if (mndSetCreateStbRedoLogs(pMnode, pTrans, pDb, pStb) != 0) return -1;
|
||||||
if (mndSetCreateStbUndoLogs(pMnode, pTrans, pDb, pStb) != 0) return -1;
|
if (mndSetCreateStbUndoLogs(pMnode, pTrans, pDb, pStb) != 0) return -1;
|
||||||
if (mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) return -1;
|
if (mndSetCreateStbCommitLogs(pMnode, pTrans, pDb, pStb) != 0) return -1;
|
||||||
|
@ -1261,7 +1261,7 @@ static int32_t mndAlterStb(SMnode *pMnode, SRpcMsg *pReq, const SMAlterStbReq *p
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to alter stb:%s", pTrans->id, pAlter->name);
|
mDebug("trans:%d, used to alter stb:%s", pTrans->id, pAlter->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
|
|
||||||
if (mndSetAlterStbRedoLogs(pMnode, pTrans, pDb, &stbObj) != 0) goto _OVER;
|
if (mndSetAlterStbRedoLogs(pMnode, pTrans, pDb, &stbObj) != 0) goto _OVER;
|
||||||
if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, &stbObj) != 0) goto _OVER;
|
if (mndSetAlterStbCommitLogs(pMnode, pTrans, pDb, &stbObj) != 0) goto _OVER;
|
||||||
|
@ -1407,7 +1407,7 @@ static int32_t mndDropStb(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SStbObj *p
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
|
||||||
mDebug("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
|
mDebug("trans:%d, used to drop stb:%s", pTrans->id, pStb->name);
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
|
|
||||||
if (mndSetDropStbRedoLogs(pMnode, pTrans, pStb) != 0) goto _OVER;
|
if (mndSetDropStbRedoLogs(pMnode, pTrans, pStb) != 0) goto _OVER;
|
||||||
if (mndSetDropStbCommitLogs(pMnode, pTrans, pStb) != 0) goto _OVER;
|
if (mndSetDropStbCommitLogs(pMnode, pTrans, pStb) != 0) goto _OVER;
|
||||||
|
|
|
@ -619,8 +619,8 @@ void mndTransSetCb(STrans *pTrans, ETrnFunc startFunc, ETrnFunc stopFunc, void *
|
||||||
pTrans->paramLen = paramLen;
|
pTrans->paramLen = paramLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void mndTransSetDbInfo(STrans *pTrans, SDbObj *pDb) {
|
void mndTransSetDbName(STrans *pTrans, const char *dbname) {
|
||||||
memcpy(pTrans->dbname, pDb->name, TSDB_DB_FNAME_LEN);
|
memcpy(pTrans->dbname, dbname, TSDB_DB_FNAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mndTransSetSerial(STrans *pTrans) { pTrans->exec = TRN_EXEC_SERIAL; }
|
void mndTransSetSerial(STrans *pTrans) { pTrans->exec = TRN_EXEC_SERIAL; }
|
||||||
|
|
|
@ -51,9 +51,10 @@ int32_t mndInitVgroup(SMnode *pMnode) {
|
||||||
};
|
};
|
||||||
|
|
||||||
mndSetMsgHandle(pMnode, TDMT_DND_CREATE_VNODE_RSP, mndProcessCreateVnodeRsp);
|
mndSetMsgHandle(pMnode, TDMT_DND_CREATE_VNODE_RSP, mndProcessCreateVnodeRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_VND_ALTER_VNODE_RSP, mndProcessAlterVnodeRsp);
|
mndSetMsgHandle(pMnode, TDMT_VND_ALTER_REPLICA_RSP, mndProcessAlterVnodeRsp);
|
||||||
|
mndSetMsgHandle(pMnode, TDMT_VND_ALTER_CONFIG_RSP, mndProcessAlterVnodeRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_DND_DROP_VNODE_RSP, mndProcessDropVnodeRsp);
|
mndSetMsgHandle(pMnode, TDMT_DND_DROP_VNODE_RSP, mndProcessDropVnodeRsp);
|
||||||
mndSetMsgHandle(pMnode, TDMT_VND_COMPACT_VNODE_RSP, mndProcessCompactVnodeRsp);
|
mndSetMsgHandle(pMnode, TDMT_VND_COMPACT_RSP, mndProcessCompactVnodeRsp);
|
||||||
|
|
||||||
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndRetrieveVgroups);
|
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndRetrieveVgroups);
|
||||||
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndCancelGetNextVgroup);
|
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_VGROUP, mndCancelGetNextVgroup);
|
||||||
|
@ -188,10 +189,10 @@ void mndReleaseVgroup(SMnode *pMnode, SVgObj *pVgroup) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen) {
|
void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVgObj *pVgroup, int32_t *pContLen,
|
||||||
|
bool standby) {
|
||||||
SCreateVnodeReq createReq = {0};
|
SCreateVnodeReq createReq = {0};
|
||||||
createReq.vgId = pVgroup->vgId;
|
createReq.vgId = pVgroup->vgId;
|
||||||
createReq.dnodeId = pDnode->id;
|
|
||||||
memcpy(createReq.db, pDb->name, TSDB_DB_FNAME_LEN);
|
memcpy(createReq.db, pDb->name, TSDB_DB_FNAME_LEN);
|
||||||
createReq.dbUid = pDb->uid;
|
createReq.dbUid = pDb->uid;
|
||||||
createReq.vgVersion = pVgroup->version;
|
createReq.vgVersion = pVgroup->version;
|
||||||
|
@ -218,6 +219,7 @@ void *mndBuildCreateVnodeReq(SMnode *pMnode, SDnodeObj *pDnode, SDbObj *pDb, SVg
|
||||||
createReq.hashMethod = pDb->cfg.hashMethod;
|
createReq.hashMethod = pDb->cfg.hashMethod;
|
||||||
createReq.numOfRetensions = pDb->cfg.numOfRetensions;
|
createReq.numOfRetensions = pDb->cfg.numOfRetensions;
|
||||||
createReq.pRetensions = pDb->cfg.pRetensions;
|
createReq.pRetensions = pDb->cfg.pRetensions;
|
||||||
|
createReq.standby = standby;
|
||||||
createReq.isTsma = pVgroup->isTsma;
|
createReq.isTsma = pVgroup->isTsma;
|
||||||
createReq.pTsma = pVgroup->pTsma;
|
createReq.pTsma = pVgroup->pTsma;
|
||||||
|
|
||||||
|
@ -276,7 +278,6 @@ void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_
|
||||||
alterReq.strict = pDb->cfg.strict;
|
alterReq.strict = pDb->cfg.strict;
|
||||||
alterReq.cacheLastRow = pDb->cfg.cacheLastRow;
|
alterReq.cacheLastRow = pDb->cfg.cacheLastRow;
|
||||||
alterReq.replica = pVgroup->replica;
|
alterReq.replica = pVgroup->replica;
|
||||||
alterReq.selfIndex = -1;
|
|
||||||
|
|
||||||
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
for (int32_t v = 0; v < pVgroup->replica; ++v) {
|
||||||
SReplica *pReplica = &alterReq.replicas[v];
|
SReplica *pReplica = &alterReq.replicas[v];
|
||||||
|
@ -292,13 +293,6 @@ void *mndBuildAlterVnodeReq(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup, int32_
|
||||||
mndReleaseDnode(pMnode, pVgidDnode);
|
mndReleaseDnode(pMnode, pVgidDnode);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0
|
|
||||||
if (alterReq.selfIndex == -1) {
|
|
||||||
terrno = TSDB_CODE_MND_APP_ERROR;
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int32_t contLen = tSerializeSAlterVnodeReq(NULL, 0, &alterReq);
|
int32_t contLen = tSerializeSAlterVnodeReq(NULL, 0, &alterReq);
|
||||||
if (contLen < 0) {
|
if (contLen < 0) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -510,7 +504,7 @@ _OVER:
|
||||||
taosArrayDestroy(pArray);
|
taosArrayDestroy(pArray);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
//--->
|
||||||
int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
|
int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
|
||||||
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
||||||
|
@ -538,7 +532,7 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
|
||||||
|
|
||||||
SVnodeGid *pVgid = &pVgroup->vnodeGid[maxPos];
|
SVnodeGid *pVgid = &pVgroup->vnodeGid[maxPos];
|
||||||
pVgid->dnodeId = pDnode->id;
|
pVgid->dnodeId = pDnode->id;
|
||||||
pVgid->role = TAOS_SYNC_STATE_FOLLOWER;
|
pVgid->role = TAOS_SYNC_STATE_ERROR;
|
||||||
pDnode->numOfVnodes++;
|
pDnode->numOfVnodes++;
|
||||||
|
|
||||||
mInfo("db:%s, vgId:%d, vnode_index:%d dnode:%d is added", pVgroup->dbName, pVgroup->vgId, maxPos, pVgid->dnodeId);
|
mInfo("db:%s, vgId:%d, vnode_index:%d dnode:%d is added", pVgroup->dbName, pVgroup->vgId, maxPos, pVgid->dnodeId);
|
||||||
|
@ -549,16 +543,15 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
|
||||||
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
terrno = TSDB_CODE_MND_NO_ENOUGH_DNODES;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
//--->
|
||||||
int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray, SVnodeGid *del1, SVnodeGid *del2) {
|
int32_t mndRemoveVnodeFromVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray, SVnodeGid *del1, SVnodeGid *del2) {
|
||||||
int32_t removedNum = 0;
|
|
||||||
|
|
||||||
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
taosArraySort(pArray, (__compar_fn_t)mndCompareDnodeVnodes);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pArray); ++i) {
|
||||||
SDnodeObj *pDnode = taosArrayGet(pArray, i);
|
SDnodeObj *pDnode = taosArrayGet(pArray, i);
|
||||||
mDebug("dnode:%d, equivalent vnodes:%d", pDnode->id, pDnode->numOfVnodes);
|
mDebug("dnode:%d, equivalent vnodes:%d", pDnode->id, pDnode->numOfVnodes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t removedNum = 0;
|
||||||
for (int32_t d = taosArrayGetSize(pArray) - 1; d >= 0; --d) {
|
for (int32_t d = taosArrayGetSize(pArray) - 1; d >= 0; --d) {
|
||||||
SDnodeObj *pDnode = taosArrayGet(pArray, d);
|
SDnodeObj *pDnode = taosArrayGet(pArray, d);
|
||||||
|
|
||||||
|
@ -664,6 +657,7 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
SVgObj *pVgroup = NULL;
|
SVgObj *pVgroup = NULL;
|
||||||
int32_t cols = 0;
|
int32_t cols = 0;
|
||||||
|
int64_t curMs = taosGetTimestampMs();
|
||||||
|
|
||||||
SDbObj *pDb = NULL;
|
SDbObj *pDb = NULL;
|
||||||
if (strlen(pShow->db) > 0) {
|
if (strlen(pShow->db) > 0) {
|
||||||
|
@ -703,12 +697,15 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
|
||||||
if (i < pVgroup->replica) {
|
if (i < pVgroup->replica) {
|
||||||
colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->vnodeGid[i].dnodeId, false);
|
colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->vnodeGid[i].dnodeId, false);
|
||||||
|
|
||||||
|
bool online = false;
|
||||||
|
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgroup->vnodeGid[i].dnodeId);
|
||||||
|
if (pDnode != NULL) {
|
||||||
|
online = mndIsDnodeOnline(pMnode, pDnode, curMs);
|
||||||
|
mndReleaseDnode(pMnode, pDnode);
|
||||||
|
}
|
||||||
|
|
||||||
char buf1[20] = {0};
|
char buf1[20] = {0};
|
||||||
SDnodeObj *pDnodeObj = mndAcquireDnode(pMnode, pVgroup->vnodeGid[i].dnodeId);
|
const char *role = online ? syncStr(pVgroup->vnodeGid[i].role) : "OFFLINE";
|
||||||
ASSERT(pDnodeObj != NULL);
|
|
||||||
bool isOffLine = !mndIsDnodeOnline(pMnode, pDnodeObj, taosGetTimestampMs());
|
|
||||||
const char *role = isOffLine ? "OFFLINE" : syncStr(pVgroup->vnodeGid[i].role);
|
|
||||||
|
|
||||||
STR_WITH_MAXSIZE_TO_VARSTR(buf1, role, pShow->pMeta->pSchemas[cols].bytes);
|
STR_WITH_MAXSIZE_TO_VARSTR(buf1, role, pShow->pMeta->pSchemas[cols].bytes);
|
||||||
|
|
||||||
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
|
||||||
|
|
|
@ -128,7 +128,7 @@ class MndTestTrans2 : public ::testing::Test {
|
||||||
mndTransSetCb(pTrans, TRANS_START_FUNC_TEST, TRANS_STOP_FUNC_TEST, param, strlen(param) + 1);
|
mndTransSetCb(pTrans, TRANS_START_FUNC_TEST, TRANS_STOP_FUNC_TEST, param, strlen(param) + 1);
|
||||||
|
|
||||||
if (pDb != NULL) {
|
if (pDb != NULL) {
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = mndTransPrepare(pMnode, pTrans);
|
int32_t code = mndTransPrepare(pMnode, pTrans);
|
||||||
|
@ -201,7 +201,7 @@ class MndTestTrans2 : public ::testing::Test {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pDb != NULL) {
|
if (pDb != NULL) {
|
||||||
mndTransSetDbInfo(pTrans, pDb);
|
mndTransSetDbName(pTrans, pDb->name);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = mndTransPrepare(pMnode, pTrans);
|
int32_t code = mndTransPrepare(pMnode, pTrans);
|
||||||
|
|
|
@ -35,7 +35,6 @@ target_sources(
|
||||||
"src/sma/smaTimeRange.c"
|
"src/sma/smaTimeRange.c"
|
||||||
|
|
||||||
# tsdb
|
# tsdb
|
||||||
# "src/tsdb/tsdbTDBImpl.c"
|
|
||||||
"src/tsdb/tsdbCommit.c"
|
"src/tsdb/tsdbCommit.c"
|
||||||
"src/tsdb/tsdbCommit2.c"
|
"src/tsdb/tsdbCommit2.c"
|
||||||
"src/tsdb/tsdbFile.c"
|
"src/tsdb/tsdbFile.c"
|
||||||
|
@ -45,17 +44,18 @@ target_sources(
|
||||||
"src/tsdb/tsdbMemTable2.c"
|
"src/tsdb/tsdbMemTable2.c"
|
||||||
"src/tsdb/tsdbRead.c"
|
"src/tsdb/tsdbRead.c"
|
||||||
"src/tsdb/tsdbReadImpl.c"
|
"src/tsdb/tsdbReadImpl.c"
|
||||||
# "src/tsdb/tsdbSma.c"
|
|
||||||
"src/tsdb/tsdbWrite.c"
|
"src/tsdb/tsdbWrite.c"
|
||||||
"src/tsdb/tsdbSnapshot.c"
|
"src/tsdb/tsdbSnapshot.c"
|
||||||
|
|
||||||
# tq
|
# tq
|
||||||
"src/tq/tq.c"
|
"src/tq/tq.c"
|
||||||
"src/tq/tqExec.c"
|
"src/tq/tqExec.c"
|
||||||
"src/tq/tqCommit.c"
|
"src/tq/tqMeta.c"
|
||||||
|
"src/tq/tqRead.c"
|
||||||
"src/tq/tqOffset.c"
|
"src/tq/tqOffset.c"
|
||||||
"src/tq/tqPush.c"
|
"src/tq/tqPush.c"
|
||||||
"src/tq/tqRead.c"
|
"src/tq/tqSink.c"
|
||||||
|
"src/tq/tqCommit.c"
|
||||||
)
|
)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
vnode
|
vnode
|
||||||
|
|
|
@ -68,6 +68,7 @@ void vnodeGetInfo(SVnode *pVnode, const char **dbname, int32_t *vgId);
|
||||||
int32_t vnodeSnapshotReaderOpen(SVnode *pVnode, SVSnapshotReader **ppReader, int64_t sver, int64_t ever);
|
int32_t vnodeSnapshotReaderOpen(SVnode *pVnode, SVSnapshotReader **ppReader, int64_t sver, int64_t ever);
|
||||||
int32_t vnodeSnapshotReaderClose(SVSnapshotReader *pReader);
|
int32_t vnodeSnapshotReaderClose(SVSnapshotReader *pReader);
|
||||||
int32_t vnodeSnapshotRead(SVSnapshotReader *pReader, const void **ppData, uint32_t *nData);
|
int32_t vnodeSnapshotRead(SVSnapshotReader *pReader, const void **ppData, uint32_t *nData);
|
||||||
|
int32_t vnodeProcessCreateTSma(SVnode *pVnode, void *pCont, uint32_t contLen);
|
||||||
|
|
||||||
// meta
|
// meta
|
||||||
typedef struct SMeta SMeta; // todo: remove
|
typedef struct SMeta SMeta; // todo: remove
|
||||||
|
@ -172,7 +173,9 @@ struct SVnodeCfg {
|
||||||
bool isHeap;
|
bool isHeap;
|
||||||
bool isWeak;
|
bool isWeak;
|
||||||
int8_t isTsma;
|
int8_t isTsma;
|
||||||
|
int8_t isRsma;
|
||||||
int8_t hashMethod;
|
int8_t hashMethod;
|
||||||
|
int8_t standby;
|
||||||
STsdbCfg tsdbCfg;
|
STsdbCfg tsdbCfg;
|
||||||
SWalCfg walCfg;
|
SWalCfg walCfg;
|
||||||
SSyncCfg syncCfg;
|
SSyncCfg syncCfg;
|
||||||
|
|
|
@ -219,7 +219,7 @@ static int32_t tdInitSmaEnv(SSma *pSma, int8_t smaType, const char *path, SDisk
|
||||||
void *tdFreeRSmaInfo(SRSmaInfo *pInfo);
|
void *tdFreeRSmaInfo(SRSmaInfo *pInfo);
|
||||||
|
|
||||||
int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg);
|
int32_t tdProcessTSmaCreateImpl(SSma *pSma, int64_t version, const char *pMsg);
|
||||||
int32_t tdUpdateExpiredWindowImpl(SSma *pSma, SSubmitReq *pMsg, int64_t version);
|
int32_t tdUpdateExpiredWindowImpl(SSma *pSma, const SSubmitReq *pMsg, int64_t version);
|
||||||
// TODO: This is the basic params, and should wrap the params to a queryHandle.
|
// TODO: This is the basic params, and should wrap the params to a queryHandle.
|
||||||
int32_t tdGetTSmaDataImpl(SSma *pSma, char *pData, int64_t indexUid, TSKEY querySKey, int32_t nMaxResult);
|
int32_t tdGetTSmaDataImpl(SSma *pSma, char *pData, int64_t indexUid, TSKEY querySKey, int32_t nMaxResult);
|
||||||
|
|
||||||
|
@ -227,4 +227,4 @@ int32_t tdGetTSmaDataImpl(SSma *pSma, char *pData, int64_t indexUid, TSKEY query
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /*_TD_VNODE_SMA_H_*/
|
#endif /*_TD_VNODE_SMA_H_*/
|
||||||
|
|
|
@ -66,33 +66,27 @@ struct STqReadHandle {
|
||||||
// tqPush
|
// tqPush
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t consumerId;
|
STaosQueue* queue;
|
||||||
int32_t epoch;
|
STaosQall* qall;
|
||||||
int32_t skipLogNum;
|
void* qItem;
|
||||||
int64_t reqOffset;
|
} STqInputQ;
|
||||||
SRpcHandleInfo info;
|
|
||||||
SRWLatch lock;
|
|
||||||
} STqPushHandle;
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
// msg info
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
|
int64_t reqOffset;
|
||||||
|
int64_t processedVer;
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
int8_t subType;
|
int32_t skipLogNum;
|
||||||
// int8_t withTbName;
|
// rpc info
|
||||||
// int8_t withSchema;
|
int64_t reqId;
|
||||||
// int8_t withTag;
|
SRpcHandleInfo rpcInfo;
|
||||||
char* qmsg;
|
// exec
|
||||||
SHashObj* pDropTbUid;
|
int8_t inputStatus;
|
||||||
STqPushHandle pushHandle;
|
int8_t execStatus;
|
||||||
// SRWLatch lock;
|
STqInputQ inputQ;
|
||||||
SWalReadHandle* pWalReader;
|
SRWLatch lock;
|
||||||
// task number should be the same with fetch thread
|
} STqPushHandle;
|
||||||
STqReadHandle* pExecReader[5];
|
|
||||||
qTaskInfo_t task[5];
|
|
||||||
} STqExec;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// tqExec
|
// tqExec
|
||||||
|
|
||||||
|
@ -154,20 +148,21 @@ typedef struct {
|
||||||
|
|
||||||
static STqMgmt tqMgmt = {0};
|
static STqMgmt tqMgmt = {0};
|
||||||
|
|
||||||
// init once
|
// tqRead
|
||||||
int tqInit();
|
|
||||||
void tqCleanUp();
|
|
||||||
|
|
||||||
// int32_t tEncodeSTqExec(SEncoder* pEncoder, const STqExec* pExec);
|
|
||||||
// int32_t tDecodeSTqExec(SDecoder* pDecoder, STqExec* pExec);
|
|
||||||
|
|
||||||
int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle);
|
|
||||||
int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle);
|
|
||||||
|
|
||||||
int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalHead** pHeadWithCkSum);
|
int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalHead** pHeadWithCkSum);
|
||||||
|
|
||||||
|
// tqExec
|
||||||
int32_t tqDataExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataBlkRsp* pRsp, int32_t workerId);
|
int32_t tqDataExec(STQ* pTq, STqExecHandle* pExec, SSubmitReq* pReq, SMqDataBlkRsp* pRsp, int32_t workerId);
|
||||||
|
|
||||||
|
// tqMeta
|
||||||
|
int32_t tqMetaOpen(STQ* pTq);
|
||||||
|
int32_t tqMetaClose(STQ* pTq);
|
||||||
|
int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle);
|
||||||
|
int32_t tqMetaDeleteHandle(STQ* pTq, const char* key);
|
||||||
|
|
||||||
|
// tqSink
|
||||||
|
void tqTableSink(SStreamTask* pTask, void* vnode, int64_t ver, void* data);
|
||||||
|
|
||||||
// tqOffset
|
// tqOffset
|
||||||
STqOffsetStore* STqOffsetOpen(STqOffsetCfg*);
|
STqOffsetStore* STqOffsetOpen(STqOffsetCfg*);
|
||||||
void STqOffsetClose(STqOffsetStore*);
|
void STqOffsetClose(STqOffsetStore*);
|
||||||
|
|
|
@ -32,14 +32,27 @@ extern "C" {
|
||||||
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSDB ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
|
typedef struct TSDBROW TSDBROW;
|
||||||
|
typedef struct TSDBKEY TSDBKEY;
|
||||||
|
typedef struct SDelOp SDelOp;
|
||||||
|
|
||||||
|
static int tsdbKeyCmprFn(const void *p1, const void *p2);
|
||||||
|
|
||||||
|
// tsdbMemTable2.c ==============================================================================================
|
||||||
|
typedef struct SMemTable SMemTable;
|
||||||
|
|
||||||
|
int32_t tsdbMemTableCreate2(STsdb *pTsdb, SMemTable **ppMemTable);
|
||||||
|
void tsdbMemTableDestroy2(SMemTable *pMemTable);
|
||||||
|
|
||||||
// tsdbMemTable ================
|
// tsdbMemTable ================
|
||||||
|
typedef struct STsdbRow STsdbRow;
|
||||||
typedef struct STbData STbData;
|
typedef struct STbData STbData;
|
||||||
typedef struct STsdbMemTable STsdbMemTable;
|
typedef struct STsdbMemTable STsdbMemTable;
|
||||||
typedef struct SMergeInfo SMergeInfo;
|
typedef struct SMergeInfo SMergeInfo;
|
||||||
typedef struct STable STable;
|
typedef struct STable STable;
|
||||||
|
|
||||||
int tsdbMemTableCreate(STsdb *pTsdb, STsdbMemTable **ppMemTable);
|
int tsdbMemTableCreate(STsdb *pTsdb, STsdbMemTable **ppMemTable);
|
||||||
void tsdbMemTableDestroy(STsdb *pTsdb, STsdbMemTable *pMemTable);
|
void tsdbMemTableDestroy(STsdbMemTable *pMemTable);
|
||||||
int tsdbLoadDataFromCache(STsdb *pTsdb, STable *pTable, SSkipListIterator *pIter, TSKEY maxKey, int maxRowsToRead,
|
int tsdbLoadDataFromCache(STsdb *pTsdb, STable *pTable, SSkipListIterator *pIter, TSKEY maxKey, int maxRowsToRead,
|
||||||
SDataCols *pCols, TKEY *filterKeys, int nFilterKeys, bool keepDup, SMergeInfo *pMergeInfo);
|
SDataCols *pCols, TKEY *filterKeys, int nFilterKeys, bool keepDup, SMergeInfo *pMergeInfo);
|
||||||
|
|
||||||
|
@ -845,6 +858,42 @@ static FORCE_INLINE int tsdbUnLockFS(STsdbFS *pFs) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct TSDBROW {
|
||||||
|
int64_t version;
|
||||||
|
STSRow2 tsRow;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct TSDBKEY {
|
||||||
|
int64_t version;
|
||||||
|
TSKEY ts;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SDelOp {
|
||||||
|
int64_t version;
|
||||||
|
TSKEY sKey; // included
|
||||||
|
TSKEY eKey; // included
|
||||||
|
SDelOp *pNext;
|
||||||
|
};
|
||||||
|
|
||||||
|
static FORCE_INLINE int tsdbKeyCmprFn(const void *p1, const void *p2) {
|
||||||
|
TSDBKEY *pKey1 = (TSDBKEY *)p1;
|
||||||
|
TSDBKEY *pKey2 = (TSDBKEY *)p2;
|
||||||
|
|
||||||
|
if (pKey1->ts < pKey2->ts) {
|
||||||
|
return -1;
|
||||||
|
} else if (pKey1->ts > pKey2->ts) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pKey1->version < pKey2->version) {
|
||||||
|
return -1;
|
||||||
|
} else if (pKey1->version > pKey2->version) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -81,9 +81,10 @@ int32_t vnodeSyncCommit(SVnode* pVnode);
|
||||||
int32_t vnodeAsyncCommit(SVnode* pVnode);
|
int32_t vnodeAsyncCommit(SVnode* pVnode);
|
||||||
|
|
||||||
// vnodeSync.c
|
// vnodeSync.c
|
||||||
int32_t vnodeSyncOpen(SVnode* pVnode, char* path);
|
int32_t vnodeSyncOpen(SVnode* pVnode, char* path);
|
||||||
void vnodeSyncStart(SVnode* pVnode);
|
void vnodeSyncStart(SVnode* pVnode);
|
||||||
void vnodeSyncClose(SVnode* pVnode);
|
void vnodeSyncClose(SVnode* pVnode);
|
||||||
|
void vnodeSyncAlter(SVnode* pVnode, SRpcMsg* pMsg);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -125,6 +125,8 @@ int32_t tsdbSnapshotReaderClose(STsdbSnapshotReader* pReader);
|
||||||
int32_t tsdbSnapshotRead(STsdbSnapshotReader* pReader, void** ppData, uint32_t* nData);
|
int32_t tsdbSnapshotRead(STsdbSnapshotReader* pReader, void** ppData, uint32_t* nData);
|
||||||
|
|
||||||
// tq
|
// tq
|
||||||
|
int tqInit();
|
||||||
|
void tqCleanUp();
|
||||||
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal);
|
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal);
|
||||||
void tqClose(STQ*);
|
void tqClose(STQ*);
|
||||||
int tqPushMsg(STQ*, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver);
|
int tqPushMsg(STQ*, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver);
|
||||||
|
@ -145,11 +147,11 @@ int32_t tqProcessTaskRecoverRsp(STQ* pTq, SRpcMsg* pMsg);
|
||||||
int32_t smaOpen(SVnode* pVnode);
|
int32_t smaOpen(SVnode* pVnode);
|
||||||
int32_t smaClose(SSma* pSma);
|
int32_t smaClose(SSma* pSma);
|
||||||
|
|
||||||
int32_t tdUpdateExpireWindow(SSma* pSma, SSubmitReq* pMsg, int64_t version);
|
int32_t tdUpdateExpireWindow(SSma* pSma, const SSubmitReq* pMsg, int64_t version);
|
||||||
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
|
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
|
||||||
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg);
|
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg);
|
||||||
|
|
||||||
int32_t tdProcessRSmaCreate(SVnode *pVnode, SVCreateStbReq* pReq);
|
int32_t tdProcessRSmaCreate(SVnode* pVnode, SVCreateStbReq* pReq);
|
||||||
int32_t tdProcessRSmaSubmit(SSma* pSma, void* pMsg, int32_t inputType);
|
int32_t tdProcessRSmaSubmit(SSma* pSma, void* pMsg, int32_t inputType);
|
||||||
int32_t tdFetchTbUidList(SSma* pSma, STbUidStore** ppStore, tb_uid_t suid, tb_uid_t uid);
|
int32_t tdFetchTbUidList(SSma* pSma, STbUidStore** ppStore, tb_uid_t suid, tb_uid_t uid);
|
||||||
int32_t tdUpdateTbUidList(SSma* pSma, STbUidStore* pUidStore);
|
int32_t tdUpdateTbUidList(SSma* pSma, STbUidStore* pUidStore);
|
||||||
|
@ -239,6 +241,8 @@ struct SVnode {
|
||||||
#define VND_RSMA1(vnd) ((vnd)->pSma->pRSmaTsdb1)
|
#define VND_RSMA1(vnd) ((vnd)->pSma->pRSmaTsdb1)
|
||||||
#define VND_RSMA2(vnd) ((vnd)->pSma->pRSmaTsdb2)
|
#define VND_RSMA2(vnd) ((vnd)->pSma->pRSmaTsdb2)
|
||||||
#define VND_RETENTIONS(vnd) (&(vnd)->config.tsdbCfg.retentions)
|
#define VND_RETENTIONS(vnd) (&(vnd)->config.tsdbCfg.retentions)
|
||||||
|
#define VND_IS_RSMA(v) ((v)->config.isRsma == 1)
|
||||||
|
#define VND_IS_TSMA(v) ((v)->config.isTsma == 1)
|
||||||
|
|
||||||
struct STbUidStore {
|
struct STbUidStore {
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
|
@ -271,11 +275,6 @@ struct SSma {
|
||||||
#define SMA_RSMA_TSDB1(s) ((s)->pRSmaTsdb1)
|
#define SMA_RSMA_TSDB1(s) ((s)->pRSmaTsdb1)
|
||||||
#define SMA_RSMA_TSDB2(s) ((s)->pRSmaTsdb2)
|
#define SMA_RSMA_TSDB2(s) ((s)->pRSmaTsdb2)
|
||||||
|
|
||||||
static FORCE_INLINE bool vnodeIsRollup(SVnode* pVnode) {
|
|
||||||
SRetention* pRetention = &(pVnode->config.tsdbCfg.retentions[0]);
|
|
||||||
return (pRetention->freq > 0 && pRetention->keep > 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// sma
|
// sma
|
||||||
void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
|
void smaHandleRes(void* pVnode, int64_t smaId, const SArray* data);
|
||||||
|
|
||||||
|
|
|
@ -31,9 +31,9 @@ int metaCreateSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
int vLen = 0;
|
int vLen = 0;
|
||||||
const void *pKey = NULL;
|
const void *pKey = NULL;
|
||||||
const void *pVal = NULL;
|
const void *pVal = NULL;
|
||||||
void * pBuf = NULL;
|
void *pBuf = NULL;
|
||||||
int32_t szBuf = 0;
|
int32_t szBuf = 0;
|
||||||
void * p = NULL;
|
void *p = NULL;
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
|
|
||||||
// validate req
|
// validate req
|
||||||
|
@ -87,7 +87,7 @@ int metaDropSTable(SMeta *pMeta, int64_t verison, SVDropStbReq *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// drop all child tables
|
// drop all child tables
|
||||||
TBC * pCtbIdxc = NULL;
|
TBC *pCtbIdxc = NULL;
|
||||||
SArray *pArray = taosArrayInit(8, sizeof(tb_uid_t));
|
SArray *pArray = taosArrayInit(8, sizeof(tb_uid_t));
|
||||||
|
|
||||||
tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
|
tdbTbcOpen(pMeta->pCtbIdx, &pCtbIdxc, &pMeta->txn);
|
||||||
|
@ -142,8 +142,8 @@ _exit:
|
||||||
int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
|
||||||
SMetaEntry oStbEntry = {0};
|
SMetaEntry oStbEntry = {0};
|
||||||
SMetaEntry nStbEntry = {0};
|
SMetaEntry nStbEntry = {0};
|
||||||
TBC * pUidIdxc = NULL;
|
TBC *pUidIdxc = NULL;
|
||||||
TBC * pTbDbc = NULL;
|
TBC *pTbDbc = NULL;
|
||||||
const void *pData;
|
const void *pData;
|
||||||
int nData;
|
int nData;
|
||||||
int64_t oversion;
|
int64_t oversion;
|
||||||
|
@ -262,7 +262,7 @@ _err:
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids) {
|
int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUids) {
|
||||||
void * pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
|
@ -288,7 +288,7 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
void * pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
int rc = 0;
|
int rc = 0;
|
||||||
int64_t version;
|
int64_t version;
|
||||||
|
@ -324,14 +324,14 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int nVal = 0;
|
int nVal = 0;
|
||||||
const void * pData = NULL;
|
const void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
int64_t oversion;
|
int64_t oversion;
|
||||||
SSchema * pColumn = NULL;
|
SSchema *pColumn = NULL;
|
||||||
SMetaEntry entry = {0};
|
SMetaEntry entry = {0};
|
||||||
SSchemaWrapper *pSchema;
|
SSchemaWrapper *pSchema;
|
||||||
int c;
|
int c;
|
||||||
|
@ -479,7 +479,7 @@ _err:
|
||||||
static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pAlterTbReq) {
|
||||||
SMetaEntry ctbEntry = {0};
|
SMetaEntry ctbEntry = {0};
|
||||||
SMetaEntry stbEntry = {0};
|
SMetaEntry stbEntry = {0};
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int nVal = 0;
|
int nVal = 0;
|
||||||
int ret;
|
int ret;
|
||||||
int c;
|
int c;
|
||||||
|
@ -510,7 +510,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
oversion = *(int64_t *)pData;
|
oversion = *(int64_t *)pData;
|
||||||
|
|
||||||
// search table.db
|
// search table.db
|
||||||
TBC * pTbDbc = NULL;
|
TBC *pTbDbc = NULL;
|
||||||
SDecoder dc1 = {0};
|
SDecoder dc1 = {0};
|
||||||
SDecoder dc2 = {0};
|
SDecoder dc2 = {0};
|
||||||
|
|
||||||
|
@ -534,7 +534,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
metaDecodeEntry(&dc2, &stbEntry);
|
metaDecodeEntry(&dc2, &stbEntry);
|
||||||
|
|
||||||
SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag;
|
SSchemaWrapper *pTagSchema = &stbEntry.stbEntry.schemaTag;
|
||||||
SSchema * pColumn = NULL;
|
SSchema *pColumn = NULL;
|
||||||
int32_t iCol = 0;
|
int32_t iCol = 0;
|
||||||
for (;;) {
|
for (;;) {
|
||||||
pColumn = NULL;
|
pColumn = NULL;
|
||||||
|
@ -579,7 +579,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
val.pData = pAlterTbReq->pTagVal;
|
val.pData = pAlterTbReq->pTagVal;
|
||||||
val.nData = pAlterTbReq->nTagVal;
|
val.nData = pAlterTbReq->nTagVal;
|
||||||
}else{
|
} else {
|
||||||
memcpy(&val.i64, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
|
memcpy(&val.i64, pAlterTbReq->pTagVal, pAlterTbReq->nTagVal);
|
||||||
}
|
}
|
||||||
taosArrayPush(pTagArray, &val);
|
taosArrayPush(pTagArray, &val);
|
||||||
|
@ -649,8 +649,8 @@ int metaAlterTable(SMeta *pMeta, int64_t version, SVAlterTbReq *pReq) {
|
||||||
|
|
||||||
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
|
static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
STbDbKey tbDbKey;
|
STbDbKey tbDbKey;
|
||||||
void * pKey = NULL;
|
void *pKey = NULL;
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int kLen = 0;
|
int kLen = 0;
|
||||||
int vLen = 0;
|
int vLen = 0;
|
||||||
SEncoder coder = {0};
|
SEncoder coder = {0};
|
||||||
|
@ -732,7 +732,7 @@ static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
|
int metaCreateTagIdxKey(tb_uid_t suid, int32_t cid, const void *pTagData, int32_t nTagData, int8_t type, tb_uid_t uid,
|
||||||
STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
|
STagIdxKey **ppTagIdxKey, int32_t *nTagIdxKey) {
|
||||||
// int32_t nTagData = 0;
|
// int32_t nTagData = 0;
|
||||||
|
|
||||||
// if (pTagData) {
|
// if (pTagData) {
|
||||||
|
@ -765,11 +765,11 @@ static void metaDestroyTagIdxKey(STagIdxKey *pTagIdxKey) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
void * pData = NULL;
|
void *pData = NULL;
|
||||||
int nData = 0;
|
int nData = 0;
|
||||||
STbDbKey tbDbKey = {0};
|
STbDbKey tbDbKey = {0};
|
||||||
SMetaEntry stbEntry = {0};
|
SMetaEntry stbEntry = {0};
|
||||||
STagIdxKey * pTagIdxKey = NULL;
|
STagIdxKey *pTagIdxKey = NULL;
|
||||||
int32_t nTagIdxKey;
|
int32_t nTagIdxKey;
|
||||||
const SSchema *pTagColumn; // = &stbEntry.stbEntry.schema.pSchema[0];
|
const SSchema *pTagColumn; // = &stbEntry.stbEntry.schema.pSchema[0];
|
||||||
const void *pTagData = NULL; //
|
const void *pTagData = NULL; //
|
||||||
|
@ -788,21 +788,20 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
|
pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
|
||||||
|
|
||||||
STagVal tagVal = {.cid = pTagColumn->colId};
|
STagVal tagVal = {.cid = pTagColumn->colId};
|
||||||
if(pTagColumn->type != TSDB_DATA_TYPE_JSON){
|
if (pTagColumn->type != TSDB_DATA_TYPE_JSON) {
|
||||||
tTagGet((const STag *)pCtbEntry->ctbEntry.pTags, &tagVal);
|
tTagGet((const STag *)pCtbEntry->ctbEntry.pTags, &tagVal);
|
||||||
if(IS_VAR_DATA_TYPE(pTagColumn->type)){
|
if (IS_VAR_DATA_TYPE(pTagColumn->type)) {
|
||||||
pTagData = tagVal.pData;
|
pTagData = tagVal.pData;
|
||||||
nTagData = (int32_t)tagVal.nData;
|
nTagData = (int32_t)tagVal.nData;
|
||||||
}else{
|
} else {
|
||||||
pTagData = &(tagVal.i64);
|
pTagData = &(tagVal.i64);
|
||||||
nTagData = tDataTypes[pTagColumn->type].bytes;
|
nTagData = tDataTypes[pTagColumn->type].bytes;
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
//pTagData = pCtbEntry->ctbEntry.pTags;
|
// pTagData = pCtbEntry->ctbEntry.pTags;
|
||||||
//nTagData = ((const STag *)pCtbEntry->ctbEntry.pTags)->len;
|
// nTagData = ((const STag *)pCtbEntry->ctbEntry.pTags)->len;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// update tag index
|
// update tag index
|
||||||
#ifdef USE_INVERTED_INDEX
|
#ifdef USE_INVERTED_INDEX
|
||||||
tb_uid_t suid = pCtbEntry->ctbEntry.suid;
|
tb_uid_t suid = pCtbEntry->ctbEntry.suid;
|
||||||
|
@ -816,8 +815,8 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
int ret = indexPut((SIndex *)pMeta->pTagIvtIdx, tmGroup, tuid);
|
int ret = indexPut((SIndex *)pMeta->pTagIvtIdx, tmGroup, tuid);
|
||||||
indexMultiTermDestroy(tmGroup);
|
indexMultiTermDestroy(tmGroup);
|
||||||
#else
|
#else
|
||||||
if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type, pCtbEntry->uid,
|
if (metaCreateTagIdxKey(pCtbEntry->ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type,
|
||||||
&pTagIdxKey, &nTagIdxKey) < 0) {
|
pCtbEntry->uid, &pTagIdxKey, &nTagIdxKey) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
|
tdbTbInsert(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, NULL, 0, &pMeta->txn);
|
||||||
|
@ -830,7 +829,7 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
|
||||||
|
|
||||||
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
|
static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME) {
|
||||||
SEncoder coder = {0};
|
SEncoder coder = {0};
|
||||||
void * pVal = NULL;
|
void *pVal = NULL;
|
||||||
int vLen = 0;
|
int vLen = 0;
|
||||||
int rcode = 0;
|
int rcode = 0;
|
||||||
SSkmDbKey skmDbKey = {0};
|
SSkmDbKey skmDbKey = {0};
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
|
|
||||||
#include "sma.h"
|
#include "sma.h"
|
||||||
|
|
||||||
|
|
||||||
// TODO: Who is responsible for resource allocate and release?
|
// TODO: Who is responsible for resource allocate and release?
|
||||||
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg) {
|
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
@ -37,7 +36,7 @@ int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tdUpdateExpireWindow(SSma* pSma, SSubmitReq* pMsg, int64_t version) {
|
int32_t tdUpdateExpireWindow(SSma* pSma, const SSubmitReq* pMsg, int64_t version) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if ((code = tdUpdateExpiredWindowImpl(pSma, pMsg, version)) < 0) {
|
if ((code = tdUpdateExpiredWindowImpl(pSma, pMsg, version)) < 0) {
|
||||||
smaWarn("vgId:%d update expired sma window failed since %s", SMA_VID(pSma), tstrerror(terrno));
|
smaWarn("vgId:%d update expired sma window failed since %s", SMA_VID(pSma), tstrerror(terrno));
|
||||||
|
|
|
@ -104,7 +104,7 @@ int32_t smaOpen(SVnode *pVnode) {
|
||||||
taosThreadMutexInit(&pSma->mutex, NULL);
|
taosThreadMutexInit(&pSma->mutex, NULL);
|
||||||
pSma->locked = false;
|
pSma->locked = false;
|
||||||
|
|
||||||
if (vnodeIsRollup(pVnode)) {
|
if (VND_IS_RSMA(pVnode)) {
|
||||||
STsdbKeepCfg keepCfg = {0};
|
STsdbKeepCfg keepCfg = {0};
|
||||||
for (int i = 0; i < TSDB_RETENTION_MAX; ++i) {
|
for (int i = 0; i < TSDB_RETENTION_MAX; ++i) {
|
||||||
if (i == TSDB_RETENTION_L0) {
|
if (i == TSDB_RETENTION_L0) {
|
||||||
|
|
|
@ -932,7 +932,7 @@ static int32_t tdSetExpiredWindow(SSma *pSma, SHashObj *pItemsHash, int64_t inde
|
||||||
* @param msg SSubmitReq
|
* @param msg SSubmitReq
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
int32_t tdUpdateExpiredWindowImpl(SSma *pSma, SSubmitReq *pMsg, int64_t version) {
|
int32_t tdUpdateExpiredWindowImpl(SSma *pSma, const SSubmitReq *pMsg, int64_t version) {
|
||||||
// no time-range-sma, just return success
|
// no time-range-sma, just return success
|
||||||
if (atomic_load_16(&SMA_TSMA_NUM(pSma)) <= 0) {
|
if (atomic_load_16(&SMA_TSMA_NUM(pSma)) <= 0) {
|
||||||
smaTrace("vgId:%d not update expire window since no tSma", SMA_VID(pSma));
|
smaTrace("vgId:%d not update expire window since no tSma", SMA_VID(pSma));
|
||||||
|
|
|
@ -14,7 +14,6 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tq.h"
|
#include "tq.h"
|
||||||
#include "tdbInt.h"
|
|
||||||
|
|
||||||
int32_t tqInit() {
|
int32_t tqInit() {
|
||||||
int8_t old;
|
int8_t old;
|
||||||
|
@ -47,51 +46,6 @@ void tqCleanUp() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int tqExecKeyCompare(const void* pKey1, int32_t kLen1, const void* pKey2, int32_t kLen2) {
|
|
||||||
return strcmp(pKey1, pKey2);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqStoreHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
|
|
||||||
int32_t code;
|
|
||||||
int32_t vlen;
|
|
||||||
tEncodeSize(tEncodeSTqHandle, pHandle, vlen, code);
|
|
||||||
ASSERT(code == 0);
|
|
||||||
|
|
||||||
void* buf = taosMemoryCalloc(1, vlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
SEncoder encoder;
|
|
||||||
tEncoderInit(&encoder, buf, vlen);
|
|
||||||
|
|
||||||
if (tEncodeSTqHandle(&encoder, pHandle) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TXN txn;
|
|
||||||
|
|
||||||
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTbUpsert(pTq->pExecStore, key, (int)strlen(key), buf, vlen, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
tEncoderClear(&encoder);
|
|
||||||
taosMemoryFree(buf);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
|
STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
|
||||||
STQ* pTq = taosMemoryMalloc(sizeof(STQ));
|
STQ* pTq = taosMemoryMalloc(sizeof(STQ));
|
||||||
if (pTq == NULL) {
|
if (pTq == NULL) {
|
||||||
|
@ -108,60 +62,7 @@ STQ* tqOpen(const char* path, SVnode* pVnode, SWal* pWal) {
|
||||||
|
|
||||||
pTq->pushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_ENTRY_LOCK);
|
pTq->pushMgr = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_ENTRY_LOCK);
|
||||||
|
|
||||||
if (tdbOpen(path, 16 * 1024, 1, &pTq->pMetaStore) < 0) {
|
if (tqMetaOpen(pTq) < 0) {
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTbOpen("handles", -1, -1, tqExecKeyCompare, pTq->pMetaStore, &pTq->pExecStore) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TXN txn;
|
|
||||||
|
|
||||||
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
TBC* pCur;
|
|
||||||
if (tdbTbcOpen(pTq->pExecStore, &pCur, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void* pKey;
|
|
||||||
int kLen;
|
|
||||||
void* pVal;
|
|
||||||
int vLen;
|
|
||||||
|
|
||||||
tdbTbcMoveToFirst(pCur);
|
|
||||||
SDecoder decoder;
|
|
||||||
|
|
||||||
while (tdbTbcNext(pCur, &pKey, &kLen, &pVal, &vLen) == 0) {
|
|
||||||
STqHandle handle;
|
|
||||||
tDecoderInit(&decoder, (uint8_t*)pVal, vLen);
|
|
||||||
tDecodeSTqHandle(&decoder, &handle);
|
|
||||||
handle.pWalReader = walOpenReadHandle(pTq->pVnode->pWal);
|
|
||||||
for (int32_t i = 0; i < 5; i++) {
|
|
||||||
handle.execHandle.pExecReader[i] = tqInitSubmitMsgScanner(pTq->pVnode->pMeta);
|
|
||||||
}
|
|
||||||
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
for (int32_t i = 0; i < 5; i++) {
|
|
||||||
SReadHandle reader = {
|
|
||||||
.reader = handle.execHandle.pExecReader[i],
|
|
||||||
.meta = pTq->pVnode->pMeta,
|
|
||||||
.pMsgCb = &pTq->pVnode->msgCb,
|
|
||||||
};
|
|
||||||
handle.execHandle.exec.execCol.task[i] =
|
|
||||||
qCreateStreamExecTaskInfo(handle.execHandle.exec.execCol.qmsg, &reader);
|
|
||||||
ASSERT(handle.execHandle.exec.execCol.task[i]);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
handle.execHandle.exec.execDb.pFilterOutTbUid =
|
|
||||||
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
|
||||||
}
|
|
||||||
taosHashPut(pTq->handles, pKey, kLen, &handle, sizeof(STqHandle));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTxnClose(&txn) < 0) {
|
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -174,179 +75,16 @@ void tqClose(STQ* pTq) {
|
||||||
taosHashCleanup(pTq->handles);
|
taosHashCleanup(pTq->handles);
|
||||||
taosHashCleanup(pTq->pStreamTasks);
|
taosHashCleanup(pTq->pStreamTasks);
|
||||||
taosHashCleanup(pTq->pushMgr);
|
taosHashCleanup(pTq->pushMgr);
|
||||||
tdbClose(pTq->pMetaStore);
|
tqMetaClose(pTq);
|
||||||
taosMemoryFree(pTq);
|
taosMemoryFree(pTq);
|
||||||
}
|
}
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) {
|
|
||||||
if (tStartEncode(pEncoder) < 0) return -1;
|
|
||||||
if (tEncodeCStr(pEncoder, pHandle->subKey) < 0) return -1;
|
|
||||||
if (tEncodeI64(pEncoder, pHandle->consumerId) < 0) return -1;
|
|
||||||
if (tEncodeI32(pEncoder, pHandle->epoch) < 0) return -1;
|
|
||||||
if (tEncodeI8(pEncoder, pHandle->execHandle.subType) < 0) return -1;
|
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
if (tEncodeCStr(pEncoder, pHandle->execHandle.exec.execCol.qmsg) < 0) return -1;
|
|
||||||
}
|
|
||||||
tEndEncode(pEncoder);
|
|
||||||
return pEncoder->pos;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) {
|
|
||||||
if (tStartDecode(pDecoder) < 0) return -1;
|
|
||||||
if (tDecodeCStrTo(pDecoder, pHandle->subKey) < 0) return -1;
|
|
||||||
if (tDecodeI64(pDecoder, &pHandle->consumerId) < 0) return -1;
|
|
||||||
if (tDecodeI32(pDecoder, &pHandle->epoch) < 0) return -1;
|
|
||||||
if (tDecodeI8(pDecoder, &pHandle->execHandle.subType) < 0) return -1;
|
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.exec.execCol.qmsg) < 0) return -1;
|
|
||||||
}
|
|
||||||
tEndDecode(pDecoder);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
|
||||||
void* pIter = NULL;
|
|
||||||
while (1) {
|
|
||||||
pIter = taosHashIterate(pTq->handles, pIter);
|
|
||||||
if (pIter == NULL) break;
|
|
||||||
STqHandle* pExec = (STqHandle*)pIter;
|
|
||||||
if (pExec->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
|
||||||
for (int32_t i = 0; i < 5; i++) {
|
|
||||||
int32_t code = qUpdateQualifiedTableId(pExec->execHandle.exec.execCol.task[i], tbUidList, isAdd);
|
|
||||||
ASSERT(code == 0);
|
|
||||||
}
|
|
||||||
} else if (pExec->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
|
||||||
if (!isAdd) {
|
|
||||||
int32_t sz = taosArrayGetSize(tbUidList);
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i);
|
|
||||||
taosHashPut(pExec->execHandle.exec.execDb.pFilterOutTbUid, &tbUid, sizeof(int64_t), NULL, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// tq update id
|
|
||||||
}
|
|
||||||
}
|
|
||||||
while (1) {
|
|
||||||
pIter = taosHashIterate(pTq->pStreamTasks, pIter);
|
|
||||||
if (pIter == NULL) break;
|
|
||||||
SStreamTask* pTask = (SStreamTask*)pIter;
|
|
||||||
if (pTask->inputType == STREAM_INPUT__DATA_SUBMIT) {
|
|
||||||
int32_t code = qUpdateQualifiedTableId(pTask->exec.executor, tbUidList, isAdd);
|
|
||||||
ASSERT(code == 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver, SRpcHandleInfo handleInfo) {
|
|
||||||
if (msgType != TDMT_VND_SUBMIT) return 0;
|
|
||||||
void* pIter = NULL;
|
|
||||||
STqHandle* pHandle = NULL;
|
|
||||||
SSubmitReq* pReq = (SSubmitReq*)msg;
|
|
||||||
int32_t workerId = 4;
|
|
||||||
int64_t fetchOffset = ver;
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
pIter = taosHashIterate(pTq->pushMgr, pIter);
|
|
||||||
if (pIter == NULL) break;
|
|
||||||
pHandle = *(STqHandle**)pIter;
|
|
||||||
|
|
||||||
taosWLockLatch(&pHandle->pushHandle.lock);
|
|
||||||
|
|
||||||
/*SRpcHandleInfo* pInfo = atomic_load_ptr(&pHandle->pushHandle.pInfo);*/
|
|
||||||
/*ASSERT(pInfo);*/
|
|
||||||
|
|
||||||
SMqDataBlkRsp rsp = {0};
|
|
||||||
rsp.reqOffset = pHandle->pushHandle.reqOffset;
|
|
||||||
rsp.blockData = taosArrayInit(0, sizeof(void*));
|
|
||||||
rsp.blockDataLen = taosArrayInit(0, sizeof(int32_t));
|
|
||||||
|
|
||||||
if (msgType == TDMT_VND_SUBMIT) {
|
|
||||||
tqDataExec(pTq, &pHandle->execHandle, pReq, &rsp, workerId);
|
|
||||||
} else {
|
|
||||||
// TODO
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (rsp.blockNum == 0) {
|
|
||||||
taosWUnLockLatch(&pHandle->pushHandle.lock);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(taosArrayGetSize(rsp.blockData) == rsp.blockNum);
|
|
||||||
ASSERT(taosArrayGetSize(rsp.blockDataLen) == rsp.blockNum);
|
|
||||||
|
|
||||||
rsp.rspOffset = fetchOffset;
|
|
||||||
|
|
||||||
int32_t tlen = sizeof(SMqRspHead) + tEncodeSMqDataBlkRsp(NULL, &rsp);
|
|
||||||
void* buf = rpcMallocCont(tlen);
|
|
||||||
if (buf == NULL) {
|
|
||||||
// todo free
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
((SMqRspHead*)buf)->mqMsgType = TMQ_MSG_TYPE__POLL_RSP;
|
|
||||||
((SMqRspHead*)buf)->epoch = pHandle->pushHandle.epoch;
|
|
||||||
((SMqRspHead*)buf)->consumerId = pHandle->pushHandle.consumerId;
|
|
||||||
|
|
||||||
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
|
||||||
tEncodeSMqDataBlkRsp(&abuf, &rsp);
|
|
||||||
|
|
||||||
SRpcMsg resp = {
|
|
||||||
.info = pHandle->pushHandle.info,
|
|
||||||
.pCont = buf,
|
|
||||||
.contLen = tlen,
|
|
||||||
.code = 0,
|
|
||||||
};
|
|
||||||
tmsgSendRsp(&resp);
|
|
||||||
|
|
||||||
/*atomic_store_ptr(&pHandle->pushHandle.pInfo, NULL);*/
|
|
||||||
memset(&pHandle->pushHandle.info, 0, sizeof(SRpcHandleInfo));
|
|
||||||
taosWUnLockLatch(&pHandle->pushHandle.lock);
|
|
||||||
|
|
||||||
tqDebug("vg %d offset %ld from consumer %ld (epoch %d) send rsp, block num: %d, reqOffset: %ld, rspOffset: %ld",
|
|
||||||
TD_VID(pTq->pVnode), fetchOffset, pHandle->pushHandle.consumerId, pHandle->pushHandle.epoch, rsp.blockNum,
|
|
||||||
rsp.reqOffset, rsp.rspOffset);
|
|
||||||
|
|
||||||
// TODO destroy
|
|
||||||
taosArrayDestroy(rsp.blockData);
|
|
||||||
taosArrayDestroy(rsp.blockDataLen);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) {
|
|
||||||
if (msgType == TDMT_VND_SUBMIT) {
|
|
||||||
if (taosHashGetSize(pTq->pStreamTasks) == 0) return 0;
|
|
||||||
|
|
||||||
if (tdUpdateExpireWindow(pTq->pVnode->pSma, msg, ver) != 0) {
|
|
||||||
// TODO handle sma error
|
|
||||||
}
|
|
||||||
void* data = taosMemoryMalloc(msgLen);
|
|
||||||
if (data == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
memcpy(data, msg, msgLen);
|
|
||||||
|
|
||||||
tqProcessStreamTrigger(pTq, data);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tqCommit(STQ* pTq) {
|
|
||||||
// do nothing
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
SMqPollReq* pReq = pMsg->pCont;
|
SMqPollReq* pReq = pMsg->pCont;
|
||||||
int64_t consumerId = pReq->consumerId;
|
int64_t consumerId = pReq->consumerId;
|
||||||
int64_t waitTime = pReq->timeout;
|
int64_t timeout = pReq->timeout;
|
||||||
int32_t reqEpoch = pReq->epoch;
|
int32_t reqEpoch = pReq->epoch;
|
||||||
int64_t fetchOffset;
|
int64_t fetchOffset;
|
||||||
|
|
||||||
|
@ -389,20 +127,18 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
}
|
}
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
rsp.withSchema = false;
|
rsp.withSchema = false;
|
||||||
|
|
||||||
rsp.withTag = false;
|
rsp.withTag = false;
|
||||||
} else {
|
} else {
|
||||||
rsp.withSchema = true;
|
rsp.withSchema = true;
|
||||||
rsp.blockSchema = taosArrayInit(0, sizeof(void*));
|
|
||||||
|
|
||||||
rsp.withTag = false;
|
rsp.withTag = false;
|
||||||
|
rsp.blockSchema = taosArrayInit(0, sizeof(void*));
|
||||||
}
|
}
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
consumerEpoch = atomic_load_32(&pHandle->epoch);
|
consumerEpoch = atomic_load_32(&pHandle->epoch);
|
||||||
if (consumerEpoch > reqEpoch) {
|
if (consumerEpoch > reqEpoch) {
|
||||||
tqDebug("tmq poll: consumer %ld (epoch %d) vg %d offset %ld, found new consumer epoch %d discard req epoch %d",
|
tqWarn("tmq poll: consumer %ld (epoch %d) vg %d offset %ld, found new consumer epoch %d, discard req epoch %d",
|
||||||
consumerId, pReq->epoch, TD_VID(pTq->pVnode), fetchOffset, consumerEpoch, reqEpoch);
|
consumerId, pReq->epoch, TD_VID(pTq->pVnode), fetchOffset, consumerEpoch, reqEpoch);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -413,27 +149,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg, int32_t workerId) {
|
||||||
|
|
||||||
SWalReadHead* pHead = &pHeadWithCkSum->head;
|
SWalReadHead* pHead = &pHeadWithCkSum->head;
|
||||||
|
|
||||||
#if 0
|
|
||||||
// add to pushMgr
|
|
||||||
taosWLockLatch(&pExec->pushHandle.lock);
|
|
||||||
|
|
||||||
pExec->pushHandle.consumerId = consumerId;
|
|
||||||
pExec->pushHandle.epoch = reqEpoch;
|
|
||||||
pExec->pushHandle.reqOffset = rsp.reqOffset;
|
|
||||||
pExec->pushHandle.skipLogNum = rsp.skipLogNum;
|
|
||||||
pExec->pushHandle.handle = pMsg;
|
|
||||||
|
|
||||||
taosWUnLockLatch(&pExec->pushHandle.lock);
|
|
||||||
|
|
||||||
// TODO add timer
|
|
||||||
|
|
||||||
// TODO: the pointer will always be valid?
|
|
||||||
taosHashPut(pTq->pushMgr, &consumerId, sizeof(int64_t), &pExec, sizeof(void*));
|
|
||||||
taosArrayDestroy(rsp.blockData);
|
|
||||||
taosArrayDestroy(rsp.blockDataLen);
|
|
||||||
return 0;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
tqDebug("tmq poll: consumer %ld (epoch %d) iter log, vg %d offset %ld msgType %d", consumerId, pReq->epoch,
|
tqDebug("tmq poll: consumer %ld (epoch %d) iter log, vg %d offset %ld msgType %d", consumerId, pReq->epoch,
|
||||||
TD_VID(pTq->pVnode), fetchOffset, pHead->msgType);
|
TD_VID(pTq->pVnode), fetchOffset, pHead->msgType);
|
||||||
|
|
||||||
|
@ -508,24 +223,9 @@ int32_t tqProcessVgDeleteReq(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
int32_t code = taosHashRemove(pTq->handles, pReq->subKey, strlen(pReq->subKey));
|
int32_t code = taosHashRemove(pTq->handles, pReq->subKey, strlen(pReq->subKey));
|
||||||
ASSERT(code == 0);
|
ASSERT(code == 0);
|
||||||
|
|
||||||
TXN txn;
|
if (tqMetaDeleteHandle(pTq, pReq->subKey) < 0) {
|
||||||
|
|
||||||
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbTbDelete(pTq->pExecStore, pReq->subKey, (int)strlen(pReq->subKey), &txn) < 0) {
|
|
||||||
/*ASSERT(0);*/
|
|
||||||
}
|
|
||||||
|
|
||||||
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
|
||||||
ASSERT(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -583,30 +283,12 @@ int32_t tqProcessVgChangeReq(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
atomic_add_fetch_32(&pHandle->epoch, 1);
|
atomic_add_fetch_32(&pHandle->epoch, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tqStoreHandle(pTq, req.subKey, pHandle) < 0) {
|
if (tqMetaSaveHandle(pTq, req.subKey, pHandle) < 0) {
|
||||||
// TODO
|
// TODO
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tqTableSink(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
|
|
||||||
const SArray* pRes = (const SArray*)data;
|
|
||||||
SVnode* pVnode = (SVnode*)vnode;
|
|
||||||
|
|
||||||
ASSERT(pTask->tbSink.pTSchema);
|
|
||||||
SSubmitReq* pReq = tdBlockToSubmit(pRes, pTask->tbSink.pTSchema, true, pTask->tbSink.stbUid,
|
|
||||||
pTask->tbSink.stbFullName, pVnode->config.vgId);
|
|
||||||
/*tPrintFixedSchemaSubmitReq(pReq, pTask->tbSink.pTSchema);*/
|
|
||||||
// build write msg
|
|
||||||
SRpcMsg msg = {
|
|
||||||
.msgType = TDMT_VND_SUBMIT,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = ntohl(pReq->length),
|
|
||||||
};
|
|
||||||
|
|
||||||
ASSERT(tmsgPutToQueue(&pVnode->msgCb, WRITE_QUEUE, &msg) == 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen) {
|
int32_t tqProcessTaskDeploy(STQ* pTq, char* msg, int32_t msgLen) {
|
||||||
SStreamTask* pTask = taosMemoryCalloc(1, sizeof(SStreamTask));
|
SStreamTask* pTask = taosMemoryCalloc(1, sizeof(SStreamTask));
|
||||||
if (pTask == NULL) {
|
if (pTask == NULL) {
|
||||||
|
@ -697,9 +379,11 @@ int32_t tqProcessStreamTrigger(STQ* pTq, SSubmitReq* pReq) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
streamDataSubmitRefInc(pSubmit);
|
SStreamDataSubmit* pSubmitClone = streamSubmitRefClone(pSubmit);
|
||||||
SStreamDataSubmit* pSubmitClone = taosAllocateQitem(sizeof(SStreamDataSubmit), DEF_QITEM);
|
if (pSubmitClone == NULL) {
|
||||||
memcpy(pSubmitClone, pSubmit, sizeof(SStreamDataSubmit));
|
atomic_store_8(&pTask->inputStatus, TASK_INPUT_STATUS__FAILED);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
taosWriteQitem(pTask->inputQ, pSubmitClone);
|
taosWriteQitem(pTask->inputQ, pSubmitClone);
|
||||||
|
|
||||||
int8_t execStatus = atomic_load_8(&pTask->status);
|
int8_t execStatus = atomic_load_8(&pTask->status);
|
||||||
|
|
|
@ -14,3 +14,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "tq.h"
|
#include "tq.h"
|
||||||
|
|
||||||
|
int tqCommit(STQ* pTq) {
|
||||||
|
// do nothing
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -12,3 +12,163 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
#include "tdbInt.h"
|
||||||
|
#include "tq.h"
|
||||||
|
|
||||||
|
static int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) {
|
||||||
|
if (tStartEncode(pEncoder) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pEncoder, pHandle->subKey) < 0) return -1;
|
||||||
|
if (tEncodeI64(pEncoder, pHandle->consumerId) < 0) return -1;
|
||||||
|
if (tEncodeI32(pEncoder, pHandle->epoch) < 0) return -1;
|
||||||
|
if (tEncodeI8(pEncoder, pHandle->execHandle.subType) < 0) return -1;
|
||||||
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
|
if (tEncodeCStr(pEncoder, pHandle->execHandle.exec.execCol.qmsg) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndEncode(pEncoder);
|
||||||
|
return pEncoder->pos;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) {
|
||||||
|
if (tStartDecode(pDecoder) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(pDecoder, pHandle->subKey) < 0) return -1;
|
||||||
|
if (tDecodeI64(pDecoder, &pHandle->consumerId) < 0) return -1;
|
||||||
|
if (tDecodeI32(pDecoder, &pHandle->epoch) < 0) return -1;
|
||||||
|
if (tDecodeI8(pDecoder, &pHandle->execHandle.subType) < 0) return -1;
|
||||||
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
|
if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.exec.execCol.qmsg) < 0) return -1;
|
||||||
|
}
|
||||||
|
tEndDecode(pDecoder);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tqExecKeyCompare(const void* pKey1, int32_t kLen1, const void* pKey2, int32_t kLen2) {
|
||||||
|
return strcmp(pKey1, pKey2);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaOpen(STQ* pTq) {
|
||||||
|
if (tdbOpen(pTq->path, 16 * 1024, 1, &pTq->pMetaStore) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbOpen("handles", -1, -1, tqExecKeyCompare, pTq->pMetaStore, &pTq->pExecStore) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, 0) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TBC* pCur;
|
||||||
|
if (tdbTbcOpen(pTq->pExecStore, &pCur, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
void* pKey;
|
||||||
|
int kLen;
|
||||||
|
void* pVal;
|
||||||
|
int vLen;
|
||||||
|
|
||||||
|
tdbTbcMoveToFirst(pCur);
|
||||||
|
SDecoder decoder;
|
||||||
|
|
||||||
|
while (tdbTbcNext(pCur, &pKey, &kLen, &pVal, &vLen) == 0) {
|
||||||
|
STqHandle handle;
|
||||||
|
tDecoderInit(&decoder, (uint8_t*)pVal, vLen);
|
||||||
|
tDecodeSTqHandle(&decoder, &handle);
|
||||||
|
handle.pWalReader = walOpenReadHandle(pTq->pVnode->pWal);
|
||||||
|
for (int32_t i = 0; i < 5; i++) {
|
||||||
|
handle.execHandle.pExecReader[i] = tqInitSubmitMsgScanner(pTq->pVnode->pMeta);
|
||||||
|
}
|
||||||
|
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
|
for (int32_t i = 0; i < 5; i++) {
|
||||||
|
SReadHandle reader = {
|
||||||
|
.reader = handle.execHandle.pExecReader[i],
|
||||||
|
.meta = pTq->pVnode->pMeta,
|
||||||
|
.pMsgCb = &pTq->pVnode->msgCb,
|
||||||
|
};
|
||||||
|
handle.execHandle.exec.execCol.task[i] =
|
||||||
|
qCreateStreamExecTaskInfo(handle.execHandle.exec.execCol.qmsg, &reader);
|
||||||
|
ASSERT(handle.execHandle.exec.execCol.task[i]);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
handle.execHandle.exec.execDb.pFilterOutTbUid =
|
||||||
|
taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
|
||||||
|
}
|
||||||
|
taosHashPut(pTq->handles, pKey, kLen, &handle, sizeof(STqHandle));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTxnClose(&txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaClose(STQ* pTq) {
|
||||||
|
tdbClose(pTq->pMetaStore);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
|
||||||
|
int32_t code;
|
||||||
|
int32_t vlen;
|
||||||
|
tEncodeSize(tEncodeSTqHandle, pHandle, vlen, code);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
|
||||||
|
void* buf = taosMemoryCalloc(1, vlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
SEncoder encoder;
|
||||||
|
tEncoderInit(&encoder, buf, vlen);
|
||||||
|
|
||||||
|
if (tEncodeSTqHandle(&encoder, pHandle) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbUpsert(pTq->pExecStore, key, (int)strlen(key), buf, vlen, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
taosMemoryFree(buf);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqMetaDeleteHandle(STQ* pTq, const char* key) {
|
||||||
|
TXN txn;
|
||||||
|
|
||||||
|
if (tdbTxnOpen(&txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbBegin(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbTbDelete(pTq->pExecStore, key, (int)strlen(key), &txn) < 0) {
|
||||||
|
/*ASSERT(0);*/
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tdbCommit(pTq->pMetaStore, &txn) < 0) {
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -12,3 +12,185 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* 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/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "tq.h"
|
||||||
|
|
||||||
|
int32_t tqExecFromInputQ(STQ* pTq, STqHandle* pHandle) {
|
||||||
|
// 1. guard and set status executing
|
||||||
|
// 2. check processedVer
|
||||||
|
// 2.1. if not missed, get msg from queue
|
||||||
|
// 2.2. if missed, scan wal
|
||||||
|
//
|
||||||
|
// 3. exec, after each success, update processed ver
|
||||||
|
// first run
|
||||||
|
// set exec status closing
|
||||||
|
// second run
|
||||||
|
// set exec status idle
|
||||||
|
//
|
||||||
|
// 4. if get result
|
||||||
|
// 4.1 set exec input status blocked and exec status idle
|
||||||
|
// 4.2 rpc send
|
||||||
|
// 4.3 clear rpc info
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqOpenPushHandle(STQ* pTq, STqHandle* pHandle) {
|
||||||
|
memset(&pHandle->pushHandle, 0, sizeof(STqPushHandle));
|
||||||
|
pHandle->pushHandle.inputQ.queue = taosOpenQueue();
|
||||||
|
pHandle->pushHandle.inputQ.qall = taosAllocateQall();
|
||||||
|
if (pHandle->pushHandle.inputQ.queue == NULL || pHandle->pushHandle.inputQ.qall == NULL) {
|
||||||
|
if (pHandle->pushHandle.inputQ.queue) {
|
||||||
|
taosCloseQueue(pHandle->pushHandle.inputQ.queue);
|
||||||
|
}
|
||||||
|
if (pHandle->pushHandle.inputQ.qall) {
|
||||||
|
taosFreeQall(pHandle->pushHandle.inputQ.qall);
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tqPreparePush(STQ* pTq, STqHandle* pHandle, int64_t reqId, const SRpcHandleInfo* pInfo, int64_t processedVer) {
|
||||||
|
memcpy(&pHandle->pushHandle.rpcInfo, pInfo, sizeof(SRpcHandleInfo));
|
||||||
|
atomic_store_64(&pHandle->pushHandle.reqId, reqId);
|
||||||
|
atomic_store_64(&pHandle->pushHandle.processedVer, processedVer);
|
||||||
|
atomic_store_8(&pHandle->pushHandle.inputStatus, TASK_INPUT_STATUS__NORMAL);
|
||||||
|
// set timeout timer
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqEnqueue(STqHandle* pHandle, SStreamDataSubmit* pSubmit) {
|
||||||
|
int8_t inputStatus = atomic_load_8(&pHandle->pushHandle.inputStatus);
|
||||||
|
if (inputStatus == TASK_INPUT_STATUS__NORMAL) {
|
||||||
|
SStreamDataSubmit* pSubmitClone = streamSubmitRefClone(pSubmit);
|
||||||
|
if (pSubmitClone == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
taosWriteQitem(pHandle->pushHandle.inputQ.queue, pSubmitClone);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqSendExecReq(STQ* pTq, STqHandle* pHandle) {
|
||||||
|
//
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqEnqueueAll(STQ* pTq, SSubmitReq* pReq) {
|
||||||
|
void* pIter = NULL;
|
||||||
|
SStreamDataSubmit* pSubmit = streamDataSubmitNew(pReq);
|
||||||
|
if (pSubmit == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
pIter = taosHashIterate(pTq->handles, pIter);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
STqHandle* pHandle = (STqHandle*)pIter;
|
||||||
|
if (tqEnqueue(pHandle, pSubmit) < 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
int8_t execStatus = atomic_load_8(&pHandle->pushHandle.execStatus);
|
||||||
|
if (execStatus == TASK_STATUS__IDLE || execStatus == TASK_STATUS__CLOSING) {
|
||||||
|
tqSendExecReq(pTq, pHandle);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
streamDataSubmitRefDec(pSubmit);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver, SRpcHandleInfo handleInfo) {
|
||||||
|
if (msgType != TDMT_VND_SUBMIT) return 0;
|
||||||
|
void* pIter = NULL;
|
||||||
|
STqHandle* pHandle = NULL;
|
||||||
|
SSubmitReq* pReq = (SSubmitReq*)msg;
|
||||||
|
int32_t workerId = 4;
|
||||||
|
int64_t fetchOffset = ver;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
pIter = taosHashIterate(pTq->pushMgr, pIter);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
pHandle = *(STqHandle**)pIter;
|
||||||
|
|
||||||
|
taosWLockLatch(&pHandle->pushHandle.lock);
|
||||||
|
|
||||||
|
SMqDataBlkRsp rsp = {0};
|
||||||
|
rsp.reqOffset = pHandle->pushHandle.reqOffset;
|
||||||
|
rsp.blockData = taosArrayInit(0, sizeof(void*));
|
||||||
|
rsp.blockDataLen = taosArrayInit(0, sizeof(int32_t));
|
||||||
|
|
||||||
|
if (msgType == TDMT_VND_SUBMIT) {
|
||||||
|
tqDataExec(pTq, &pHandle->execHandle, pReq, &rsp, workerId);
|
||||||
|
} else {
|
||||||
|
// TODO
|
||||||
|
ASSERT(0);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rsp.blockNum == 0) {
|
||||||
|
taosWUnLockLatch(&pHandle->pushHandle.lock);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
ASSERT(taosArrayGetSize(rsp.blockData) == rsp.blockNum);
|
||||||
|
ASSERT(taosArrayGetSize(rsp.blockDataLen) == rsp.blockNum);
|
||||||
|
|
||||||
|
rsp.rspOffset = fetchOffset;
|
||||||
|
|
||||||
|
int32_t tlen = sizeof(SMqRspHead) + tEncodeSMqDataBlkRsp(NULL, &rsp);
|
||||||
|
void* buf = rpcMallocCont(tlen);
|
||||||
|
if (buf == NULL) {
|
||||||
|
// todo free
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
((SMqRspHead*)buf)->mqMsgType = TMQ_MSG_TYPE__POLL_RSP;
|
||||||
|
((SMqRspHead*)buf)->epoch = pHandle->pushHandle.epoch;
|
||||||
|
((SMqRspHead*)buf)->consumerId = pHandle->pushHandle.consumerId;
|
||||||
|
|
||||||
|
void* abuf = POINTER_SHIFT(buf, sizeof(SMqRspHead));
|
||||||
|
tEncodeSMqDataBlkRsp(&abuf, &rsp);
|
||||||
|
|
||||||
|
SRpcMsg resp = {
|
||||||
|
.info = pHandle->pushHandle.rpcInfo,
|
||||||
|
.pCont = buf,
|
||||||
|
.contLen = tlen,
|
||||||
|
.code = 0,
|
||||||
|
};
|
||||||
|
tmsgSendRsp(&resp);
|
||||||
|
|
||||||
|
memset(&pHandle->pushHandle.rpcInfo, 0, sizeof(SRpcHandleInfo));
|
||||||
|
taosWUnLockLatch(&pHandle->pushHandle.lock);
|
||||||
|
|
||||||
|
tqDebug("vg %d offset %ld from consumer %ld (epoch %d) send rsp, block num: %d, reqOffset: %ld, rspOffset: %ld",
|
||||||
|
TD_VID(pTq->pVnode), fetchOffset, pHandle->pushHandle.consumerId, pHandle->pushHandle.epoch, rsp.blockNum,
|
||||||
|
rsp.reqOffset, rsp.rspOffset);
|
||||||
|
|
||||||
|
// TODO destroy
|
||||||
|
taosArrayDestroy(rsp.blockData);
|
||||||
|
taosArrayDestroy(rsp.blockDataLen);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) {
|
||||||
|
if (msgType == TDMT_VND_SUBMIT) {
|
||||||
|
if (taosHashGetSize(pTq->pStreamTasks) == 0) return 0;
|
||||||
|
|
||||||
|
if (tdUpdateExpireWindow(pTq->pVnode->pSma, msg, ver) != 0) {
|
||||||
|
// TODO handle sma error
|
||||||
|
}
|
||||||
|
void* data = taosMemoryMalloc(msgLen);
|
||||||
|
if (data == NULL) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
memcpy(data, msg, msgLen);
|
||||||
|
|
||||||
|
tqProcessStreamTrigger(pTq, data);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -298,3 +298,38 @@ int tqReadHandleRemoveTbUidList(STqReadHandle* pHandle, const SArray* tbUidList)
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
||||||
|
void* pIter = NULL;
|
||||||
|
while (1) {
|
||||||
|
pIter = taosHashIterate(pTq->handles, pIter);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
STqHandle* pExec = (STqHandle*)pIter;
|
||||||
|
if (pExec->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
|
for (int32_t i = 0; i < 5; i++) {
|
||||||
|
int32_t code = qUpdateQualifiedTableId(pExec->execHandle.exec.execCol.task[i], tbUidList, isAdd);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
}
|
||||||
|
} else if (pExec->execHandle.subType == TOPIC_SUB_TYPE__DB) {
|
||||||
|
if (!isAdd) {
|
||||||
|
int32_t sz = taosArrayGetSize(tbUidList);
|
||||||
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
|
int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i);
|
||||||
|
taosHashPut(pExec->execHandle.exec.execDb.pFilterOutTbUid, &tbUid, sizeof(int64_t), NULL, 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// tq update id
|
||||||
|
}
|
||||||
|
}
|
||||||
|
while (1) {
|
||||||
|
pIter = taosHashIterate(pTq->pStreamTasks, pIter);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
SStreamTask* pTask = (SStreamTask*)pIter;
|
||||||
|
if (pTask->inputType == STREAM_INPUT__DATA_SUBMIT) {
|
||||||
|
int32_t code = qUpdateQualifiedTableId(pTask->exec.executor, tbUidList, isAdd);
|
||||||
|
ASSERT(code == 0);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,34 @@
|
||||||
|
/*
|
||||||
|
* 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 "tq.h"
|
||||||
|
|
||||||
|
void tqTableSink(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
|
||||||
|
const SArray* pRes = (const SArray*)data;
|
||||||
|
SVnode* pVnode = (SVnode*)vnode;
|
||||||
|
|
||||||
|
ASSERT(pTask->tbSink.pTSchema);
|
||||||
|
SSubmitReq* pReq = tdBlockToSubmit(pRes, pTask->tbSink.pTSchema, true, pTask->tbSink.stbUid,
|
||||||
|
pTask->tbSink.stbFullName, pVnode->config.vgId);
|
||||||
|
/*tPrintFixedSchemaSubmitReq(pReq, pTask->tbSink.pTSchema);*/
|
||||||
|
// build write msg
|
||||||
|
SRpcMsg msg = {
|
||||||
|
.msgType = TDMT_VND_SUBMIT,
|
||||||
|
.pCont = pReq,
|
||||||
|
.contLen = ntohl(pReq->length),
|
||||||
|
};
|
||||||
|
|
||||||
|
ASSERT(tmsgPutToQueue(&pVnode->msgCb, WRITE_QUEUE, &msg) == 0);
|
||||||
|
}
|
|
@ -238,7 +238,7 @@ static void tsdbStartCommit(STsdb *pRepo) {
|
||||||
|
|
||||||
static void tsdbEndCommit(STsdb *pTsdb, int eno) {
|
static void tsdbEndCommit(STsdb *pTsdb, int eno) {
|
||||||
tsdbEndFSTxn(pTsdb);
|
tsdbEndFSTxn(pTsdb);
|
||||||
tsdbMemTableDestroy(pTsdb, pTsdb->imem);
|
tsdbMemTableDestroy(pTsdb->imem);
|
||||||
pTsdb->imem = NULL;
|
pTsdb->imem = NULL;
|
||||||
tsdbInfo("vgId:%d commit over, %s", REPO_ID(pTsdb), (eno == TSDB_CODE_SUCCESS) ? "succeed" : "failed");
|
tsdbInfo("vgId:%d commit over, %s", REPO_ID(pTsdb), (eno == TSDB_CODE_SUCCESS) ? "succeed" : "failed");
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,14 @@
|
||||||
|
/*
|
||||||
|
* 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/>.
|
||||||
|
*/
|
|
@ -60,7 +60,7 @@ int tsdbMemTableCreate(STsdb *pTsdb, STsdbMemTable **ppMemTable) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tsdbMemTableDestroy(STsdb *pTsdb, STsdbMemTable *pMemTable) {
|
void tsdbMemTableDestroy(STsdbMemTable *pMemTable) {
|
||||||
if (pMemTable) {
|
if (pMemTable) {
|
||||||
taosHashCleanup(pMemTable->pHashIdx);
|
taosHashCleanup(pMemTable->pHashIdx);
|
||||||
SSkipListIterator *pIter = tSkipListCreateIter(pMemTable->pSlIdx);
|
SSkipListIterator *pIter = tSkipListCreateIter(pMemTable->pSlIdx);
|
||||||
|
@ -142,69 +142,6 @@ int tsdbLoadDataFromCache(STsdb *pTsdb, STable *pTable, SSkipListIterator *pIter
|
||||||
} else {
|
} else {
|
||||||
fKey = tdGetKey(filterKeys[filterIter]);
|
fKey = tdGetKey(filterKeys[filterIter]);
|
||||||
}
|
}
|
||||||
#if 0
|
|
||||||
} else if (fKey > rowKey) {
|
|
||||||
if (isRowDel) {
|
|
||||||
pMergeInfo->rowsDeleteFailed++;
|
|
||||||
} else {
|
|
||||||
if (pMergeInfo->rowsInserted - pMergeInfo->rowsDeleteSucceed >= maxRowsToRead) break;
|
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
|
||||||
|
|
||||||
pMergeInfo->rowsInserted++;
|
|
||||||
pMergeInfo->nOperations++;
|
|
||||||
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
|
||||||
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
|
||||||
}
|
|
||||||
|
|
||||||
tSkipListIterNext(pIter);
|
|
||||||
row = tsdbNextIterRow(pIter);
|
|
||||||
if (row == NULL || TD_ROW_KEY(row) > maxKey) {
|
|
||||||
rowKey = INT64_MAX;
|
|
||||||
isRowDel = false;
|
|
||||||
} else {
|
|
||||||
rowKey = TD_ROW_KEY(row);
|
|
||||||
isRowDel = TD_ROW_IS_DELETED(row);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (isRowDel) {
|
|
||||||
ASSERT(!keepDup);
|
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
|
||||||
pMergeInfo->rowsDeleteSucceed++;
|
|
||||||
pMergeInfo->nOperations++;
|
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
|
||||||
} else {
|
|
||||||
if (keepDup) {
|
|
||||||
if (pCols && pMergeInfo->nOperations >= pCols->maxPoints) break;
|
|
||||||
pMergeInfo->rowsUpdated++;
|
|
||||||
pMergeInfo->nOperations++;
|
|
||||||
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, rowKey);
|
|
||||||
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, rowKey);
|
|
||||||
tsdbAppendTableRowToCols(pTable, pCols, &pSchema, row);
|
|
||||||
} else {
|
|
||||||
pMergeInfo->keyFirst = TMIN(pMergeInfo->keyFirst, fKey);
|
|
||||||
pMergeInfo->keyLast = TMAX(pMergeInfo->keyLast, fKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
tSkipListIterNext(pIter);
|
|
||||||
row = tsdbNextIterRow(pIter);
|
|
||||||
if (row == NULL || TD_ROW_KEY(row) > maxKey) {
|
|
||||||
rowKey = INT64_MAX;
|
|
||||||
isRowDel = false;
|
|
||||||
} else {
|
|
||||||
rowKey = TD_ROW_KEY(row);
|
|
||||||
isRowDel = TD_ROW_IS_DELETED(row);
|
|
||||||
}
|
|
||||||
|
|
||||||
filterIter++;
|
|
||||||
if (filterIter >= nFilterKeys) {
|
|
||||||
fKey = INT64_MAX;
|
|
||||||
} else {
|
|
||||||
fKey = tdGetKey(filterKeys[filterIter]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
#if 1
|
#if 1
|
||||||
} else if (fKey > rowKey) {
|
} else if (fKey > rowKey) {
|
||||||
if (isRowDel) {
|
if (isRowDel) {
|
||||||
|
@ -321,7 +258,7 @@ int tsdbInsertTableData(STsdb *pTsdb, SSubmitMsgIter *pMsgIter, SSubmitBlk *pBlo
|
||||||
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if(pRsp->tblFName) strcat(pRsp->tblFName, mr.me.name);
|
if (pRsp->tblFName) strcat(pRsp->tblFName, mr.me.name);
|
||||||
|
|
||||||
if (mr.me.type == TSDB_NORMAL_TABLE) {
|
if (mr.me.type == TSDB_NORMAL_TABLE) {
|
||||||
sverNew = mr.me.ntbEntry.schemaRow.version;
|
sverNew = mr.me.ntbEntry.schemaRow.version;
|
||||||
|
|
|
@ -15,52 +15,308 @@
|
||||||
|
|
||||||
#include "tsdb.h"
|
#include "tsdb.h"
|
||||||
|
|
||||||
typedef struct SMemTable SMemTable;
|
typedef struct SMemData SMemData;
|
||||||
typedef struct SMemData SMemData;
|
typedef struct SMemSkipList SMemSkipList;
|
||||||
typedef struct SMemSkipList SMemSkipList;
|
typedef struct SMemSkipListNode SMemSkipListNode;
|
||||||
typedef struct SMemSkipListNode SMemSkipListNode;
|
|
||||||
typedef struct SMemSkipListCurosr SMemSkipListCurosr;
|
|
||||||
|
|
||||||
#define SL_MAX_LEVEL 5
|
|
||||||
|
|
||||||
struct SMemTable {
|
|
||||||
STsdb *pTsdb;
|
|
||||||
TSKEY minKey;
|
|
||||||
TSKEY maxKey;
|
|
||||||
int64_t minVer;
|
|
||||||
int64_t maxVer;
|
|
||||||
int64_t nRows;
|
|
||||||
int32_t nHash;
|
|
||||||
int32_t nBucket;
|
|
||||||
SMemData **pBuckets;
|
|
||||||
SMemSkipListCurosr *pSlc;
|
|
||||||
};
|
|
||||||
|
|
||||||
struct SMemSkipListNode {
|
struct SMemSkipListNode {
|
||||||
int8_t level;
|
int8_t level;
|
||||||
SMemSkipListNode *forwards[1]; // Windows does not allow 0
|
SMemSkipListNode *forwards[0];
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemSkipList {
|
struct SMemSkipList {
|
||||||
uint32_t seed;
|
uint32_t seed;
|
||||||
int8_t maxLevel;
|
int32_t size;
|
||||||
int8_t level;
|
int8_t maxLevel;
|
||||||
int32_t size;
|
int8_t level;
|
||||||
SMemSkipListNode pHead[1]; // Windows does not allow 0
|
SMemSkipListNode *pHead;
|
||||||
|
SMemSkipListNode *pTail;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SMemData {
|
struct SMemData {
|
||||||
SMemData *pHashNext;
|
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
TSKEY minKey;
|
TSDBKEY minKey;
|
||||||
TSKEY maxKey;
|
TSDBKEY maxKey;
|
||||||
int64_t minVer;
|
SDelOp *delOpHead;
|
||||||
int64_t maxVer;
|
SDelOp *delOpTail;
|
||||||
int64_t nRows;
|
|
||||||
SMemSkipList sl;
|
SMemSkipList sl;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
struct SMemTable {
|
||||||
|
STsdb *pTsdb;
|
||||||
|
int32_t nRef;
|
||||||
|
TSDBKEY minKey;
|
||||||
|
TSDBKEY maxKey;
|
||||||
|
int64_t nRows;
|
||||||
|
SArray *pArray; // SArray<SMemData>
|
||||||
|
};
|
||||||
|
|
||||||
|
#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
|
||||||
|
#define SL_NODE_HALF_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l))
|
||||||
|
#define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
|
||||||
|
#define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
|
||||||
|
#define SL_NODE_DATA(n) (&SL_NODE_BACKWARD(n, (n)->level))
|
||||||
|
|
||||||
|
#define SL_HEAD_FORWARD(sl, l) SL_NODE_FORWARD((sl)->pHead, l)
|
||||||
|
#define SL_TAIL_BACKWARD(sl, l) SL_NODE_FORWARD((sl)->pTail, l)
|
||||||
|
|
||||||
|
static int32_t tsdbGetOrCreateMemData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, SMemData **ppMemData);
|
||||||
|
static int memDataPCmprFn(const void *p1, const void *p2);
|
||||||
|
static int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow);
|
||||||
|
static int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow);
|
||||||
|
static int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl);
|
||||||
|
|
||||||
|
// SMemTable ==============================================
|
||||||
|
int32_t tsdbMemTableCreate2(STsdb *pTsdb, SMemTable **ppMemTable) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SMemTable *pMemTable = NULL;
|
||||||
|
|
||||||
|
pMemTable = (SMemTable *)taosMemoryCalloc(1, sizeof(*pMemTable));
|
||||||
|
if (pMemTable == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pMemTable->pTsdb = pTsdb;
|
||||||
|
pMemTable->nRef = 1;
|
||||||
|
pMemTable->minKey = (TSDBKEY){.version = INT64_MAX, .ts = TSKEY_MAX};
|
||||||
|
pMemTable->maxKey = (TSDBKEY){.version = -1, .ts = TSKEY_MIN};
|
||||||
|
pMemTable->nRows = 0;
|
||||||
|
pMemTable->pArray = taosArrayInit(512, sizeof(SMemData *));
|
||||||
|
if (pMemTable->pArray == NULL) {
|
||||||
|
taosMemoryFree(pMemTable);
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
*ppMemTable = pMemTable;
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
*ppMemTable = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void tsdbMemTableDestroy2(SMemTable *pMemTable) {
|
||||||
|
taosArrayDestroyEx(pMemTable->pArray, NULL /*TODO*/);
|
||||||
|
taosMemoryFree(pMemTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbInsertTableData2(STsdb *pTsdb, int64_t version, SVSubmitBlk *pSubmitBlk) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SMemTable *pMemTable = (SMemTable *)pTsdb->mem; // TODO
|
||||||
|
SMemData *pMemData;
|
||||||
|
TSDBROW row = {.version = version};
|
||||||
|
|
||||||
|
ASSERT(pMemTable);
|
||||||
|
|
||||||
|
{
|
||||||
|
// check if table exists (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbGetOrCreateMemData(pMemTable, pSubmitBlk->suid, pSubmitBlk->uid, &pMemData);
|
||||||
|
if (code) {
|
||||||
|
tsdbError("vgId:%d failed to create/get table data since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do insert
|
||||||
|
int32_t nt;
|
||||||
|
uint8_t *pt;
|
||||||
|
int32_t n = 0;
|
||||||
|
uint8_t *p = pSubmitBlk->pData;
|
||||||
|
SVBufPool *pPool = pTsdb->pVnode->inUse;
|
||||||
|
int8_t level;
|
||||||
|
SMemSkipListNode *pNode;
|
||||||
|
while (n < pSubmitBlk->nData) {
|
||||||
|
nt = tGetTSRow(p + n, &row.tsRow);
|
||||||
|
n += nt;
|
||||||
|
|
||||||
|
ASSERT(n <= pSubmitBlk->nData);
|
||||||
|
|
||||||
|
// build the node
|
||||||
|
level = tsdbMemSkipListRandLevel(&pMemData->sl);
|
||||||
|
pNode = (SMemSkipListNode *)vnodeBufPoolMalloc(pPool, SL_NODE_SIZE(level) + nt + sizeof(version));
|
||||||
|
if (pNode == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pNode->level = level;
|
||||||
|
tPutTSDBRow((uint8_t *)SL_NODE_DATA(pNode), &row);
|
||||||
|
|
||||||
|
// put the node (todo)
|
||||||
|
|
||||||
|
// set info
|
||||||
|
if (tsdbKeyCmprFn(&row, &pMemData->minKey) < 0) pMemData->minKey = *(TSDBKEY *)&row;
|
||||||
|
if (tsdbKeyCmprFn(&row, &pMemData->maxKey) > 0) pMemData->maxKey = *(TSDBKEY *)&row;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tsdbKeyCmprFn(&pMemTable->minKey, &pMemData->minKey) < 0) pMemTable->minKey = pMemData->minKey;
|
||||||
|
if (tsdbKeyCmprFn(&pMemTable->maxKey, &pMemData->maxKey) > 0) pMemTable->maxKey = pMemData->maxKey;
|
||||||
|
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbDeleteTableData2(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid_t uid, TSKEY sKey, TSKEY eKey) {
|
||||||
|
int32_t code = 0;
|
||||||
|
SMemTable *pMemTable = (SMemTable *)pTsdb->mem; // TODO
|
||||||
|
SMemData *pMemData;
|
||||||
|
SVBufPool *pPool = pTsdb->pVnode->inUse;
|
||||||
|
|
||||||
|
ASSERT(pMemTable);
|
||||||
|
|
||||||
|
{
|
||||||
|
// check if table exists (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tsdbGetOrCreateMemData(pMemTable, suid, uid, &pMemData);
|
||||||
|
if (code) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
// do delete
|
||||||
|
SDelOp *pDelOp = (SDelOp *)vnodeBufPoolMalloc(pPool, sizeof(*pDelOp));
|
||||||
|
if (pDelOp == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pDelOp->version = version;
|
||||||
|
pDelOp->sKey = sKey;
|
||||||
|
pDelOp->eKey = eKey;
|
||||||
|
pDelOp->pNext = NULL;
|
||||||
|
if (pMemData->delOpHead == NULL) {
|
||||||
|
ASSERT(pMemData->delOpTail == NULL);
|
||||||
|
pMemData->delOpHead = pMemData->delOpTail = pDelOp;
|
||||||
|
} else {
|
||||||
|
pMemData->delOpTail->pNext = pDelOp;
|
||||||
|
pMemData->delOpTail = pDelOp;
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
// update the state of pMemTable, pMemData, last and lastrow (todo)
|
||||||
|
}
|
||||||
|
|
||||||
|
tsdbDebug("vgId:%d delete data from table suid:%" PRId64 " uid:%" PRId64 " sKey:%" PRId64 " eKey:%" PRId64
|
||||||
|
" since %s",
|
||||||
|
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
tsdbError("vgId:%d failed to delete data from table suid:%" PRId64 " uid:%" PRId64 " sKey:%" PRId64 " eKey:%" PRId64
|
||||||
|
" since %s",
|
||||||
|
TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tsdbGetOrCreateMemData(SMemTable *pMemTable, tb_uid_t suid, tb_uid_t uid, SMemData **ppMemData) {
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t idx = 0;
|
||||||
|
SMemData *pMemDataT = &(SMemData){.suid = suid, .uid = uid};
|
||||||
|
SMemData *pMemData = NULL;
|
||||||
|
SVBufPool *pPool = pMemTable->pTsdb->pVnode->inUse;
|
||||||
|
int8_t maxLevel = pMemTable->pTsdb->pVnode->config.tsdbCfg.slLevel;
|
||||||
|
|
||||||
|
// get
|
||||||
|
idx = taosArraySearchIdx(pMemTable->pArray, &pMemDataT, memDataPCmprFn, TD_GE);
|
||||||
|
if (idx >= 0) {
|
||||||
|
pMemData = (SMemData *)taosArrayGet(pMemTable->pArray, idx);
|
||||||
|
if (memDataPCmprFn(&pMemDataT, &pMemData) == 0) goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
// create
|
||||||
|
pMemData = vnodeBufPoolMalloc(pPool, sizeof(*pMemData) + SL_NODE_HALF_SIZE(maxLevel) * 2);
|
||||||
|
if (pMemData == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
pMemData->suid = suid;
|
||||||
|
pMemData->uid = uid;
|
||||||
|
pMemData->minKey = (TSDBKEY){.version = INT64_MAX, .ts = TSKEY_MAX};
|
||||||
|
pMemData->maxKey = (TSDBKEY){.version = -1, .ts = TSKEY_MIN};
|
||||||
|
pMemData->delOpHead = pMemData->delOpTail = NULL;
|
||||||
|
pMemData->sl.seed = taosRand();
|
||||||
|
pMemData->sl.size = 0;
|
||||||
|
pMemData->sl.maxLevel = maxLevel;
|
||||||
|
pMemData->sl.level = 0;
|
||||||
|
pMemData->sl.pHead = (SMemSkipListNode *)&pMemData[1];
|
||||||
|
pMemData->sl.pTail = (SMemSkipListNode *)POINTER_SHIFT(pMemData->sl.pHead, SL_NODE_HALF_SIZE(maxLevel));
|
||||||
|
|
||||||
|
for (int8_t iLevel = 0; iLevel < pMemData->sl.maxLevel; iLevel++) {
|
||||||
|
SL_HEAD_FORWARD(&pMemData->sl, iLevel) = pMemData->sl.pTail;
|
||||||
|
SL_TAIL_BACKWARD(&pMemData->sl, iLevel) = pMemData->sl.pHead;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (idx < 0) idx = 0;
|
||||||
|
if (taosArrayInsert(pMemTable->pArray, idx, &pMemData) == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
|
_exit:
|
||||||
|
*ppMemData = pMemData;
|
||||||
|
return code;
|
||||||
|
|
||||||
|
_err:
|
||||||
|
*ppMemData = NULL;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int memDataPCmprFn(const void *p1, const void *p2) {
|
||||||
|
SMemData *pMemData1 = *(SMemData **)p1;
|
||||||
|
SMemData *pMemData2 = *(SMemData **)p2;
|
||||||
|
|
||||||
|
if (pMemData1->suid < pMemData2->suid) {
|
||||||
|
return -1;
|
||||||
|
} else if (pMemData1->suid > pMemData2->suid) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pMemData1->uid < pMemData2->uid) {
|
||||||
|
return -1;
|
||||||
|
} else if (pMemData1->uid > pMemData2->uid) {
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
n += tPutI64(p ? p + n : p, pRow->version);
|
||||||
|
n += tPutTSRow(p ? p + n : p, &pRow->tsRow);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow) {
|
||||||
|
int32_t n = 0;
|
||||||
|
|
||||||
|
n += tGetI64(p + n, &pRow->version);
|
||||||
|
n += tGetTSRow(p + n, &pRow->tsRow);
|
||||||
|
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl) {
|
||||||
|
int8_t level = 1;
|
||||||
|
int8_t tlevel = TMIN(pSl->maxLevel, pSl->level + 1);
|
||||||
|
const uint32_t factor = 4;
|
||||||
|
|
||||||
|
while ((taosRandR(&pSl->seed) % factor) == 0 && level < tlevel) {
|
||||||
|
level++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return level;
|
||||||
|
}
|
||||||
|
|
||||||
|
#if 0 //====================================================================================
|
||||||
|
|
||||||
|
#define SL_MAX_LEVEL 5
|
||||||
|
|
||||||
struct SMemSkipListCurosr {
|
struct SMemSkipListCurosr {
|
||||||
SMemSkipList *pSl;
|
SMemSkipList *pSl;
|
||||||
SMemSkipListNode *pNodes[SL_MAX_LEVEL];
|
SMemSkipListNode *pNodes[SL_MAX_LEVEL];
|
||||||
|
@ -74,12 +330,6 @@ typedef struct {
|
||||||
|
|
||||||
#define HASH_BUCKET(SUID, UID, NBUCKET) (TABS((SUID) + (UID)) % (NBUCKET))
|
#define HASH_BUCKET(SUID, UID, NBUCKET) (TABS((SUID) + (UID)) % (NBUCKET))
|
||||||
|
|
||||||
#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
|
|
||||||
#define SL_NODE_HALF_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l))
|
|
||||||
#define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
|
|
||||||
#define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
|
|
||||||
#define SL_NODE_DATA(n) (&SL_NODE_BACKWARD(n, (n)->level))
|
|
||||||
|
|
||||||
#define SL_HEAD_NODE(sl) ((sl)->pHead)
|
#define SL_HEAD_NODE(sl) ((sl)->pHead)
|
||||||
#define SL_TAIL_NODE(sl) ((SMemSkipListNode *)&SL_NODE_FORWARD(SL_HEAD_NODE(sl), (sl)->maxLevel))
|
#define SL_TAIL_NODE(sl) ((SMemSkipListNode *)&SL_NODE_FORWARD(SL_HEAD_NODE(sl), (sl)->maxLevel))
|
||||||
#define SL_HEAD_NODE_FORWARD(n, l) SL_NODE_FORWARD(n, l)
|
#define SL_HEAD_NODE_FORWARD(n, l) SL_NODE_FORWARD(n, l)
|
||||||
|
@ -99,50 +349,7 @@ static int32_t tsdbMemSkipListCursorMoveToNext(SMemSkipListCurosr *pSlc);
|
||||||
static int32_t tsdbMemSkipListCursorMoveToPrev(SMemSkipListCurosr *pSlc);
|
static int32_t tsdbMemSkipListCursorMoveToPrev(SMemSkipListCurosr *pSlc);
|
||||||
static SMemSkipListNode *tsdbMemSkipListNodeCreate(SVBufPool *pPool, SMemSkipList *pSl, const STsdbRow *pTRow);
|
static SMemSkipListNode *tsdbMemSkipListNodeCreate(SVBufPool *pPool, SMemSkipList *pSl, const STsdbRow *pTRow);
|
||||||
|
|
||||||
// SMemTable
|
// SMemTable ========================
|
||||||
int32_t tsdbMemTableCreate2(STsdb *pTsdb, SMemTable **ppMemTb) {
|
|
||||||
SMemTable *pMemTb = NULL;
|
|
||||||
|
|
||||||
pMemTb = taosMemoryCalloc(1, sizeof(*pMemTb));
|
|
||||||
if (pMemTb == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
pMemTb->pTsdb = pTsdb;
|
|
||||||
pMemTb->minKey = TSKEY_MAX;
|
|
||||||
pMemTb->maxKey = TSKEY_MIN;
|
|
||||||
pMemTb->minVer = -1;
|
|
||||||
pMemTb->maxVer = -1;
|
|
||||||
pMemTb->nRows = 0;
|
|
||||||
pMemTb->nHash = 0;
|
|
||||||
pMemTb->nBucket = 1024;
|
|
||||||
pMemTb->pBuckets = taosMemoryCalloc(pMemTb->nBucket, sizeof(*pMemTb->pBuckets));
|
|
||||||
if (pMemTb->pBuckets == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
taosMemoryFree(pMemTb);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (tsdbMemSkipListCursorCreate(pTsdb->pVnode->config.tsdbCfg.slLevel, &pMemTb->pSlc) < 0) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
taosMemoryFree(pMemTb->pBuckets);
|
|
||||||
taosMemoryFree(pMemTb);
|
|
||||||
}
|
|
||||||
|
|
||||||
*ppMemTb = pMemTb;
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbMemTableDestroy2(STsdb *pTsdb, SMemTable *pMemTb) {
|
|
||||||
if (pMemTb) {
|
|
||||||
// loop to destroy the contents (todo)
|
|
||||||
tsdbMemSkipListCursorDestroy(pMemTb->pSlc);
|
|
||||||
taosMemoryFree(pMemTb->pBuckets);
|
|
||||||
taosMemoryFree(pMemTb);
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbInsertData2(SMemTable *pMemTb, int64_t version, const SVSubmitBlk *pSubmitBlk) {
|
int32_t tsdbInsertData2(SMemTable *pMemTb, int64_t version, const SVSubmitBlk *pSubmitBlk) {
|
||||||
SMemData *pMemData;
|
SMemData *pMemData;
|
||||||
STsdb *pTsdb = pMemTb->pTsdb;
|
STsdb *pTsdb = pMemTb->pTsdb;
|
||||||
|
@ -253,18 +460,6 @@ int32_t tsdbInsertData2(SMemTable *pMemTb, int64_t version, const SVSubmitBlk *p
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl) {
|
|
||||||
int8_t level = 1;
|
|
||||||
int8_t tlevel = TMIN(pSl->maxLevel, pSl->level + 1);
|
|
||||||
const uint32_t factor = 4;
|
|
||||||
|
|
||||||
while ((taosRandR(&pSl->seed) % factor) == 0 && level < tlevel) {
|
|
||||||
level++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return level;
|
|
||||||
}
|
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tsdbEncodeRow(SEncoder *pEncoder, const STsdbRow *pRow) {
|
static FORCE_INLINE int32_t tsdbEncodeRow(SEncoder *pEncoder, const STsdbRow *pRow) {
|
||||||
if (tEncodeI64(pEncoder, pRow->version) < 0) return -1;
|
if (tEncodeI64(pEncoder, pRow->version) < 0) return -1;
|
||||||
if (tEncodeBinary(pEncoder, (const uint8_t *)pRow->pRow, pRow->szRow) < 0) return -1;
|
if (tEncodeBinary(pEncoder, (const uint8_t *)pRow->pRow, pRow->szRow) < 0) return -1;
|
||||||
|
@ -377,4 +572,5 @@ static SMemSkipListNode *tsdbMemSkipListNodeCreate(SVBufPool *pPool, SMemSkipLis
|
||||||
}
|
}
|
||||||
|
|
||||||
return pNode;
|
return pNode;
|
||||||
}
|
}
|
||||||
|
#endif
|
|
@ -333,7 +333,7 @@ static void setQueryTimewindow(STsdbReadHandle* pTsdbReadHandle, SQueryTableData
|
||||||
}
|
}
|
||||||
|
|
||||||
static STsdb* getTsdbByRetentions(SVnode* pVnode, STsdbReadHandle* pReadHandle, TSKEY winSKey, SRetention* retentions) {
|
static STsdb* getTsdbByRetentions(SVnode* pVnode, STsdbReadHandle* pReadHandle, TSKEY winSKey, SRetention* retentions) {
|
||||||
if (vnodeIsRollup(pVnode)) {
|
if (VND_IS_RSMA(pVnode)) {
|
||||||
int level = 0;
|
int level = 0;
|
||||||
int64_t now = taosGetTimestamp(pVnode->config.tsdbCfg.precision);
|
int64_t now = taosGetTimestamp(pVnode->config.tsdbCfg.precision);
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,128 +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 ALLOW_FORBID_FUNC
|
|
||||||
|
|
||||||
#include "tsdb.h"
|
|
||||||
|
|
||||||
int32_t tsdbOpenDBEnv(TDB **ppEnv, const char *path) {
|
|
||||||
int ret = 0;
|
|
||||||
|
|
||||||
if (path == NULL) return -1;
|
|
||||||
|
|
||||||
ret = tdbOpen(path, 4096, 256, ppEnv); // use as param
|
|
||||||
|
|
||||||
if (ret != 0) {
|
|
||||||
tsdbError("Failed to create tsdb db env, ret = %d", ret);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbCloseDBEnv(TDB *pEnv) { return tdbClose(pEnv); }
|
|
||||||
|
|
||||||
static inline int tsdbSmaKeyCmpr(const void *arg1, int len1, const void *arg2, int len2) {
|
|
||||||
const SSmaKey *pKey1 = (const SSmaKey *)arg1;
|
|
||||||
const SSmaKey *pKey2 = (const SSmaKey *)arg2;
|
|
||||||
|
|
||||||
ASSERT(len1 == len2 && len1 == sizeof(SSmaKey));
|
|
||||||
|
|
||||||
if (pKey1->skey < pKey2->skey) {
|
|
||||||
return -1;
|
|
||||||
} else if (pKey1->skey > pKey2->skey) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
if (pKey1->groupId < pKey2->groupId) {
|
|
||||||
return -1;
|
|
||||||
} else if (pKey1->groupId > pKey2->groupId) {
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbOpenDBDb(TTB **ppDB, TDB *pEnv, const char *pFName) {
|
|
||||||
int ret;
|
|
||||||
tdb_cmpr_fn_t compFunc;
|
|
||||||
|
|
||||||
// Create a database
|
|
||||||
compFunc = tsdbSmaKeyCmpr;
|
|
||||||
ret = tdbTbOpen(pFName, -1, -1, compFunc, pEnv, ppDB);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t tsdbCloseDBDb(TTB *pDB) { return tdbTbClose(pDB); }
|
|
||||||
|
|
||||||
int32_t tsdbOpenDBF(TDB *pEnv, SDBFile *pDBF) {
|
|
||||||
// TEnv is shared by a group of SDBFile
|
|
||||||
if (!pEnv || !pDBF) {
|
|
||||||
terrno = TSDB_CODE_INVALID_PTR;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Open DBF
|
|
||||||
if (tsdbOpenDBDb(&(pDBF->pDB), pEnv, pDBF->path) < 0) {
|
|
||||||
terrno = TSDB_CODE_TDB_INIT_FAILED;
|
|
||||||
tsdbCloseDBDb(pDBF->pDB);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbCloseDBF(SDBFile *pDBF) {
|
|
||||||
int32_t ret = 0;
|
|
||||||
if (pDBF->pDB) {
|
|
||||||
ret = tsdbCloseDBDb(pDBF->pDB);
|
|
||||||
pDBF->pDB = NULL;
|
|
||||||
}
|
|
||||||
taosMemoryFreeClear(pDBF->path);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tsdbSaveSmaToDB(SDBFile *pDBF, void *pKey, int32_t keyLen, void *pVal, int32_t valLen, TXN *txn) {
|
|
||||||
int32_t ret;
|
|
||||||
|
|
||||||
ret = tdbTbInsert(pDBF->pDB, pKey, keyLen, pVal, valLen, txn);
|
|
||||||
if (ret < 0) {
|
|
||||||
tsdbError("Failed to create insert sma data into db, ret = %d", ret);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
void *tsdbGetSmaDataByKey(SDBFile *pDBF, const void *pKey, int32_t keyLen, int32_t *valLen) {
|
|
||||||
void *pVal = NULL;
|
|
||||||
int ret;
|
|
||||||
|
|
||||||
ret = tdbTbGet(pDBF->pDB, pKey, keyLen, &pVal, valLen);
|
|
||||||
|
|
||||||
if (ret < 0) {
|
|
||||||
tsdbError("Failed to get sma data from db, ret = %d", ret);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
ASSERT(*valLen >= 0);
|
|
||||||
|
|
||||||
// TODO: lock?
|
|
||||||
// TODO: Would the key/value be destoryed during return the data?
|
|
||||||
// TODO: How about the key is updated while value length is changed? The original value buffer would be freed
|
|
||||||
// automatically?
|
|
||||||
|
|
||||||
return pVal;
|
|
||||||
}
|
|
|
@ -57,6 +57,7 @@ int vnodeEncodeConfig(const void *pObj, SJson *pJson) {
|
||||||
if (tjsonAddIntegerToObject(pJson, "isHeap", pCfg->isHeap) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "isHeap", pCfg->isHeap) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "isWeak", pCfg->isWeak) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "isWeak", pCfg->isWeak) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "isTsma", pCfg->isTsma) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "isTsma", pCfg->isTsma) < 0) return -1;
|
||||||
|
if (tjsonAddIntegerToObject(pJson, "isRsma", pCfg->isRsma) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "precision", pCfg->tsdbCfg.precision) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "precision", pCfg->tsdbCfg.precision) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "update", pCfg->tsdbCfg.update) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "update", pCfg->tsdbCfg.update) < 0) return -1;
|
||||||
if (tjsonAddIntegerToObject(pJson, "compression", pCfg->tsdbCfg.compression) < 0) return -1;
|
if (tjsonAddIntegerToObject(pJson, "compression", pCfg->tsdbCfg.compression) < 0) return -1;
|
||||||
|
@ -133,6 +134,8 @@ int vnodeDecodeConfig(const SJson *pJson, void *pObj) {
|
||||||
if(code < 0) return -1;
|
if(code < 0) return -1;
|
||||||
tjsonGetNumberValue(pJson, "isTsma", pCfg->isTsma, code);
|
tjsonGetNumberValue(pJson, "isTsma", pCfg->isTsma, code);
|
||||||
if(code < 0) return -1;
|
if(code < 0) return -1;
|
||||||
|
tjsonGetNumberValue(pJson, "isRsma", pCfg->isRsma, code);
|
||||||
|
if(code < 0) return -1;
|
||||||
tjsonGetNumberValue(pJson, "precision", pCfg->tsdbCfg.precision, code);
|
tjsonGetNumberValue(pJson, "precision", pCfg->tsdbCfg.precision, code);
|
||||||
if(code < 0) return -1;
|
if(code < 0) return -1;
|
||||||
tjsonGetNumberValue(pJson, "update", pCfg->tsdbCfg.update, code);
|
tjsonGetNumberValue(pJson, "update", pCfg->tsdbCfg.update, code);
|
||||||
|
|
|
@ -230,7 +230,7 @@ int vnodeCommit(SVnode *pVnode) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(vnodeIsRollup(pVnode)) {
|
if (VND_IS_RSMA(pVnode)) {
|
||||||
if (tsdbCommit(VND_RSMA0(pVnode)) < 0) {
|
if (tsdbCommit(VND_RSMA0(pVnode)) < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -250,7 +250,6 @@ int vnodeCommit(SVnode *pVnode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (tqCommit(pVnode->pTq) < 0) {
|
if (tqCommit(pVnode->pTq) < 0) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -97,7 +97,7 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// open tsdb
|
// open tsdb
|
||||||
if (!vnodeIsRollup(pVnode) && tsdbOpen(pVnode, &VND_TSDB(pVnode), VNODE_TSDB_DIR, NULL) < 0) {
|
if (!VND_IS_RSMA(pVnode) && tsdbOpen(pVnode, &VND_TSDB(pVnode), VNODE_TSDB_DIR, NULL) < 0) {
|
||||||
vError("vgId:%d failed to open vnode tsdb since %s", TD_VID(pVnode), tstrerror(terrno));
|
vError("vgId:%d failed to open vnode tsdb since %s", TD_VID(pVnode), tstrerror(terrno));
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -189,4 +189,4 @@ void vnodeStop(SVnode *pVnode) {}
|
||||||
|
|
||||||
int64_t vnodeGetSyncHandle(SVnode *pVnode) { return pVnode->sync; }
|
int64_t vnodeGetSyncHandle(SVnode *pVnode) { return pVnode->sync; }
|
||||||
|
|
||||||
void vnodeGetSnapshot(SVnode *pVnode, SSnapshot *pSnapshot) { pSnapshot->lastApplyIndex = pVnode->state.committed; }
|
void vnodeGetSnapshot(SVnode *pVnode, SSnapshot *pSnapshot) { pSnapshot->lastApplyIndex = pVnode->state.committed; }
|
||||||
|
|
|
@ -22,7 +22,7 @@ static int vnodeProcessCreateTbReq(SVnode *pVnode, int64_t version, void *pReq,
|
||||||
static int vnodeProcessAlterTbReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
static int vnodeProcessAlterTbReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
||||||
static int vnodeProcessDropTbReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
static int vnodeProcessDropTbReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
||||||
static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
static int vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
||||||
static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq, int len, SRpcMsg *pRsp);
|
static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp);
|
||||||
|
|
||||||
int32_t vnodePreprocessReq(SVnode *pVnode, SRpcMsg *pMsg) {
|
int32_t vnodePreprocessReq(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
SDecoder dc = {0};
|
SDecoder dc = {0};
|
||||||
|
@ -88,6 +88,9 @@ int32_t vnodePreprocessReq(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
} break;
|
} break;
|
||||||
|
case TDMT_VND_ALTER_REPLICA: {
|
||||||
|
vnodeSyncAlter(pVnode, pMsg);
|
||||||
|
} break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -154,7 +157,7 @@ int vnodeProcessWriteReq(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRpcMsg
|
||||||
pMsg->contLen - sizeof(SMsgHead)) < 0) {
|
pMsg->contLen - sizeof(SMsgHead)) < 0) {
|
||||||
}
|
}
|
||||||
} break;
|
} break;
|
||||||
case TDMT_VND_ALTER_VNODE:
|
case TDMT_VND_ALTER_CONFIG:
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -776,28 +779,30 @@ _exit:
|
||||||
|
|
||||||
// TODO: the partial success scenario and the error case
|
// TODO: the partial success scenario and the error case
|
||||||
// TODO: refactor
|
// TODO: refactor
|
||||||
if ((terrno == TSDB_CODE_SUCCESS || terrno == TSDB_CODE_TDB_TABLE_ALREADY_EXIST) &&
|
if ((terrno == TSDB_CODE_SUCCESS) && (pRsp->code == TSDB_CODE_SUCCESS)) {
|
||||||
(pRsp->code == TSDB_CODE_SUCCESS)) {
|
|
||||||
tdProcessRSmaSubmit(pVnode->pSma, pReq, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
tdProcessRSmaSubmit(pVnode->pSma, pReq, STREAM_DATA_TYPE_SUBMIT_BLOCK);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq, int len, SRpcMsg *pRsp) {
|
static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq, int32_t len, SRpcMsg *pRsp) {
|
||||||
SVCreateTSmaReq req = {0};
|
SVCreateTSmaReq req = {0};
|
||||||
SDecoder coder;
|
SDecoder coder;
|
||||||
|
|
||||||
pRsp->msgType = TDMT_VND_CREATE_SMA_RSP;
|
if (pRsp) {
|
||||||
pRsp->code = TSDB_CODE_SUCCESS;
|
pRsp->msgType = TDMT_VND_CREATE_SMA_RSP;
|
||||||
pRsp->pCont = NULL;
|
pRsp->code = TSDB_CODE_SUCCESS;
|
||||||
pRsp->contLen = 0;
|
pRsp->pCont = NULL;
|
||||||
|
pRsp->contLen = 0;
|
||||||
|
}
|
||||||
|
|
||||||
// decode and process req
|
// decode and process req
|
||||||
tDecoderInit(&coder, pReq, len);
|
tDecoderInit(&coder, pReq, len);
|
||||||
|
|
||||||
if (tDecodeSVCreateTSmaReq(&coder, &req) < 0) {
|
if (tDecodeSVCreateTSmaReq(&coder, &req) < 0) {
|
||||||
pRsp->code = terrno;
|
terrno = TSDB_CODE_MSG_DECODE_ERROR;
|
||||||
|
if (pRsp) pRsp->code = terrno;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -805,18 +810,30 @@ static int vnodeProcessCreateTSmaReq(SVnode *pVnode, int64_t version, void *pReq
|
||||||
req.timezoneInt = tsTimezone;
|
req.timezoneInt = tsTimezone;
|
||||||
|
|
||||||
if (tdProcessTSmaCreate(pVnode->pSma, version, (const char *)&req) < 0) {
|
if (tdProcessTSmaCreate(pVnode->pSma, version, (const char *)&req) < 0) {
|
||||||
pRsp->code = terrno;
|
if (pRsp) pRsp->code = terrno;
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
vDebug("vgId:%d success to create tsma %s:%" PRIi64 " for table %" PRIi64, TD_VID(pVnode), req.indexName,
|
vDebug("vgId:%d success to create tsma %s:%" PRIi64 " version %" PRIi64 " for table %" PRIi64, TD_VID(pVnode),
|
||||||
req.indexUid, req.tableUid);
|
req.indexName, req.indexUid, version, req.tableUid);
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
vError("vgId:%d failed to create tsma %s:%" PRIi64 " for table %" PRIi64 " since %s", TD_VID(pVnode), req.indexName,
|
vError("vgId:%d failed to create tsma %s:%" PRIi64 " version %" PRIi64 "for table %" PRIi64 " since %s",
|
||||||
req.indexUid, req.tableUid, terrstr(terrno));
|
TD_VID(pVnode), req.indexName, req.indexUid, version, req.tableUid, terrstr(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief specific for smaDstVnode
|
||||||
|
*
|
||||||
|
* @param pVnode
|
||||||
|
* @param pCont
|
||||||
|
* @param contLen
|
||||||
|
* @return int32_t
|
||||||
|
*/
|
||||||
|
int32_t vnodeProcessCreateTSma(SVnode *pVnode, void *pCont, uint32_t contLen) {
|
||||||
|
return vnodeProcessCreateTSmaReq(pVnode, 1, pCont, contLen, NULL);
|
||||||
|
}
|
||||||
|
|
|
@ -27,6 +27,7 @@ static int32_t vnodeSyncGetSnapshot(SSyncFSM *pFsm, SSnapshot *pSnapshot);
|
||||||
int32_t vnodeSyncOpen(SVnode *pVnode, char *path) {
|
int32_t vnodeSyncOpen(SVnode *pVnode, char *path) {
|
||||||
SSyncInfo syncInfo = {
|
SSyncInfo syncInfo = {
|
||||||
.vgId = pVnode->config.vgId,
|
.vgId = pVnode->config.vgId,
|
||||||
|
.isStandBy = pVnode->config.standby,
|
||||||
.syncCfg = pVnode->config.syncCfg,
|
.syncCfg = pVnode->config.syncCfg,
|
||||||
.pWal = pVnode->pWal,
|
.pWal = pVnode->pWal,
|
||||||
.msgcb = NULL,
|
.msgcb = NULL,
|
||||||
|
@ -49,28 +50,72 @@ int32_t vnodeSyncOpen(SVnode *pVnode, char *path) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnodeSyncAlter(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
|
SAlterVnodeReq req = {0};
|
||||||
|
if (tDeserializeSAlterVnodeReq((char *)pMsg->pCont + sizeof(SMsgHead), pMsg->contLen - sizeof(SMsgHead), &req) != 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
vError("vgId:%d, failed to alter replica since %s", TD_VID(pVnode), terrstr());
|
||||||
|
SRpcMsg rsp = {.info = pMsg->info, .code = terrno};
|
||||||
|
tmsgSendRsp(&rsp);
|
||||||
|
}
|
||||||
|
|
||||||
|
vInfo("vgId:%d, start to alter vnode replica to %d", TD_VID(pVnode), req.replica);
|
||||||
|
SSyncCfg cfg = {.replicaNum = req.replica, .myIndex = req.selfIndex};
|
||||||
|
for (int32_t r = 0; r < req.replica; ++r) {
|
||||||
|
SNodeInfo *pNode = &cfg.nodeInfo[r];
|
||||||
|
tstrncpy(pNode->nodeFqdn, req.replicas[r].fqdn, sizeof(pNode->nodeFqdn));
|
||||||
|
pNode->nodePort = req.replicas[r].port;
|
||||||
|
vInfo("vgId:%d, replica:%d %s:%u", TD_VID(pVnode), r, pNode->nodeFqdn, pNode->nodePort);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (syncReconfig(pVnode->sync, &cfg) != 0) {
|
||||||
|
vError("vgId:%d, failed to propose sync reconfig since %s", TD_VID(pVnode), terrstr());
|
||||||
|
SRpcMsg rsp = {.info = pMsg->info, .code = terrno};
|
||||||
|
tmsgSendRsp(&rsp);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void vnodeSyncStart(SVnode *pVnode) {
|
void vnodeSyncStart(SVnode *pVnode) {
|
||||||
syncSetMsgCb(pVnode->sync, &pVnode->msgCb);
|
syncSetMsgCb(pVnode->sync, &pVnode->msgCb);
|
||||||
syncStart(pVnode->sync);
|
if (pVnode->config.standby) {
|
||||||
|
syncStartStandBy(pVnode->sync);
|
||||||
|
} else {
|
||||||
|
syncStart(pVnode->sync);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void vnodeSyncClose(SVnode *pVnode) { syncStop(pVnode->sync); }
|
void vnodeSyncClose(SVnode *pVnode) { syncStop(pVnode->sync); }
|
||||||
|
|
||||||
int32_t vnodeSyncEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
int32_t vnodeSyncEqMsg(const SMsgCb *msgcb, SRpcMsg *pMsg) {
|
||||||
int32_t code = tmsgPutToQueue(msgcb, SYNC_QUEUE, pMsg);
|
int32_t code = tmsgPutToQueue(msgcb, SYNC_QUEUE, pMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
pMsg->pCont = NULL;
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t vnodeSyncSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) { return tmsgSendReq(pEpSet, pMsg); }
|
int32_t vnodeSyncSendMsg(const SEpSet *pEpSet, SRpcMsg *pMsg) {
|
||||||
|
int32_t code = tmsgSendReq(pEpSet, pMsg);
|
||||||
|
if (code != 0) {
|
||||||
|
rpcFreeCont(pMsg->pCont);
|
||||||
|
pMsg->pCont = NULL;
|
||||||
|
}
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t vnodeSyncGetSnapshot(SSyncFSM *pFsm, SSnapshot *pSnapshot) {
|
int32_t vnodeSyncGetSnapshot(SSyncFSM *pFsm, SSnapshot *pSnapshot) {
|
||||||
vnodeGetSnapshot(pFsm->data, pSnapshot);
|
vnodeGetSnapshot(pFsm->data, pSnapshot);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void vnodeSyncReconfig(struct SSyncFSM *pFsm, SSyncCfg newCfg, SReConfigCbMeta cbMeta) {
|
||||||
|
SVnode *pVnode = pFsm->data;
|
||||||
|
vInfo("vgId:%d, sync reconfig is confirmed", TD_VID(pVnode));
|
||||||
|
|
||||||
|
// todo rpc response here
|
||||||
|
}
|
||||||
|
|
||||||
void vnodeSyncCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) {
|
void vnodeSyncCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta) {
|
||||||
SyncIndex beginIndex = SYNC_INDEX_INVALID;
|
SyncIndex beginIndex = SYNC_INDEX_INVALID;
|
||||||
if (pFsm->FpGetSnapshot != NULL) {
|
if (pFsm->FpGetSnapshot != NULL) {
|
||||||
|
@ -87,20 +132,12 @@ void vnodeSyncCommitMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta)
|
||||||
pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), beginIndex);
|
pFsm, cbMeta.index, cbMeta.isWeak, cbMeta.code, cbMeta.state, syncUtilState2String(cbMeta.state), beginIndex);
|
||||||
syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg);
|
syncRpcMsgLog2(logBuf, (SRpcMsg *)pMsg);
|
||||||
|
|
||||||
SVnode *pVnode = (SVnode *)(pFsm->data);
|
SVnode *pVnode = pFsm->data;
|
||||||
SyncApplyMsg *pSyncApplyMsg = syncApplyMsgBuild2(pMsg, pVnode->config.vgId, &cbMeta);
|
SyncApplyMsg *pSyncApplyMsg = syncApplyMsgBuild2(pMsg, pVnode->config.vgId, &cbMeta);
|
||||||
SRpcMsg applyMsg;
|
SRpcMsg applyMsg;
|
||||||
syncApplyMsg2RpcMsg(pSyncApplyMsg, &applyMsg);
|
syncApplyMsg2RpcMsg(pSyncApplyMsg, &applyMsg);
|
||||||
syncApplyMsgDestroy(pSyncApplyMsg);
|
syncApplyMsgDestroy(pSyncApplyMsg);
|
||||||
|
|
||||||
/*
|
|
||||||
SRpcMsg applyMsg;
|
|
||||||
applyMsg = *pMsg;
|
|
||||||
applyMsg.pCont = rpcMallocCont(applyMsg.contLen);
|
|
||||||
assert(applyMsg.contLen == pMsg->contLen);
|
|
||||||
memcpy(applyMsg.pCont, pMsg->pCont, applyMsg.contLen);
|
|
||||||
*/
|
|
||||||
|
|
||||||
// recover handle for response
|
// recover handle for response
|
||||||
SRpcMsg saveRpcMsg;
|
SRpcMsg saveRpcMsg;
|
||||||
int32_t ret = syncGetAndDelRespRpc(pVnode->sync, cbMeta.seqNum, &saveRpcMsg);
|
int32_t ret = syncGetAndDelRespRpc(pVnode->sync, cbMeta.seqNum, &saveRpcMsg);
|
||||||
|
@ -142,14 +179,13 @@ void vnodeSyncRollBackMsg(SSyncFSM *pFsm, const SRpcMsg *pMsg, SFsmCbMeta cbMeta
|
||||||
|
|
||||||
SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
|
SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
|
||||||
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
|
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
|
||||||
memset(pFsm, 0, sizeof(*pFsm));
|
|
||||||
pFsm->data = pVnode;
|
pFsm->data = pVnode;
|
||||||
pFsm->FpCommitCb = vnodeSyncCommitMsg;
|
pFsm->FpCommitCb = vnodeSyncCommitMsg;
|
||||||
pFsm->FpPreCommitCb = vnodeSyncPreCommitMsg;
|
pFsm->FpPreCommitCb = vnodeSyncPreCommitMsg;
|
||||||
pFsm->FpRollBackCb = vnodeSyncRollBackMsg;
|
pFsm->FpRollBackCb = vnodeSyncRollBackMsg;
|
||||||
pFsm->FpGetSnapshot = vnodeSyncGetSnapshot;
|
pFsm->FpGetSnapshot = vnodeSyncGetSnapshot;
|
||||||
pFsm->FpRestoreFinishCb = NULL;
|
pFsm->FpRestoreFinishCb = NULL;
|
||||||
pFsm->FpReConfigCb = NULL;
|
pFsm->FpReConfigCb = vnodeSyncReconfig;
|
||||||
|
|
||||||
return pFsm;
|
return pFsm;
|
||||||
}
|
}
|
|
@ -368,7 +368,7 @@ TEST(testCase, tSma_Data_Insert_Query_Test) {
|
||||||
SDiskCfg pDisks = {0};
|
SDiskCfg pDisks = {0};
|
||||||
pDisks.level = 0;
|
pDisks.level = 0;
|
||||||
pDisks.primary = 1;
|
pDisks.primary = 1;
|
||||||
strncpy(pDisks.dir, "/var/lib/taos", TSDB_FILENAME_LEN);
|
strncpy(pDisks.dir, TD_DATA_DIR_PATH, TSDB_FILENAME_LEN);
|
||||||
int32_t numOfDisks = 1;
|
int32_t numOfDisks = 1;
|
||||||
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
pTsdb->pTfs = tfsOpen(&pDisks, numOfDisks);
|
||||||
EXPECT_NE(pTsdb->pTfs, nullptr);
|
EXPECT_NE(pTsdb->pTfs, nullptr);
|
||||||
|
|
|
@ -137,7 +137,7 @@ void ctgTestInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
ctgdEnableDebug("api");
|
ctgdEnableDebug("api");
|
||||||
ctgdEnableDebug("meta");
|
ctgdEnableDebug("meta");
|
||||||
|
|
|
@ -15,11 +15,15 @@
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
|
|
||||||
|
#define ALLOW_FORBID_FUNC
|
||||||
|
|
||||||
#include "functionMgt.h"
|
#include "functionMgt.h"
|
||||||
#include "nodes.h"
|
#include "nodes.h"
|
||||||
#include "parToken.h"
|
#include "parToken.h"
|
||||||
#include "ttokendef.h"
|
#include "ttokendef.h"
|
||||||
#include "parAst.h"
|
#include "parAst.h"
|
||||||
|
|
||||||
|
#define YYSTACKDEPTH 0
|
||||||
}
|
}
|
||||||
|
|
||||||
%syntax_error {
|
%syntax_error {
|
||||||
|
|
|
@ -780,8 +780,8 @@ static void buildCreateTbReq(SVCreateTbReq* pTbReq, const char* tname, STag* pTa
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema,
|
static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, STagVal* val,
|
||||||
int16_t timePrec, STagVal *val, SMsgBuf* pMsgBuf) {
|
SMsgBuf* pMsgBuf) {
|
||||||
int64_t iv;
|
int64_t iv;
|
||||||
uint64_t uv;
|
uint64_t uv;
|
||||||
char* endptr = NULL;
|
char* endptr = NULL;
|
||||||
|
@ -937,8 +937,8 @@ static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema,
|
||||||
|
|
||||||
case TSDB_DATA_TYPE_NCHAR: {
|
case TSDB_DATA_TYPE_NCHAR: {
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
void *p = taosMemoryCalloc(1, pToken->n * TSDB_NCHAR_SIZE);
|
void* p = taosMemoryCalloc(1, pToken->n * TSDB_NCHAR_SIZE);
|
||||||
if(p == NULL){
|
if (p == NULL) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
if (!taosMbsToUcs4(pToken->z, pToken->n, (TdUcs4*)(p), pToken->n * TSDB_NCHAR_SIZE, &output)) {
|
if (!taosMbsToUcs4(pToken->z, pToken->n, (TdUcs4*)(p), pToken->n * TSDB_NCHAR_SIZE, &output)) {
|
||||||
|
@ -971,11 +971,11 @@ static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema,
|
||||||
// pSql -> tag1_value, ...)
|
// pSql -> tag1_value, ...)
|
||||||
static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint8_t precision, const char* tName) {
|
static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint8_t precision, const char* tName) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SArray *pTagVals = taosArrayInit(pCxt->tags.numOfBound, sizeof(STagVal));
|
SArray* pTagVals = taosArrayInit(pCxt->tags.numOfBound, sizeof(STagVal));
|
||||||
SToken sToken;
|
SToken sToken;
|
||||||
bool isParseBindParam = false;
|
bool isParseBindParam = false;
|
||||||
bool isJson = false;
|
bool isJson = false;
|
||||||
STag* pTag = NULL;
|
STag* pTag = NULL;
|
||||||
for (int i = 0; i < pCxt->tags.numOfBound; ++i) {
|
for (int i = 0; i < pCxt->tags.numOfBound; ++i) {
|
||||||
NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
|
NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
|
||||||
|
|
||||||
|
@ -995,13 +995,13 @@ static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = &pSchema[pCxt->tags.boundColumns[i]];
|
SSchema* pTagSchema = &pSchema[pCxt->tags.boundColumns[i]];
|
||||||
char *tmpTokenBuf = taosMemoryCalloc(1, sToken.n); // this can be optimize with parse column
|
char* tmpTokenBuf = taosMemoryCalloc(1, sToken.n); // this can be optimize with parse column
|
||||||
code = checkAndTrimValue(&sToken, tmpTokenBuf, &pCxt->msg);
|
code = checkAndTrimValue(&sToken, tmpTokenBuf, &pCxt->msg);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
taosMemoryFree(tmpTokenBuf);
|
taosMemoryFree(tmpTokenBuf);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if(pTagSchema->type == TSDB_DATA_TYPE_JSON){
|
if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
|
||||||
if (sToken.n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
if (sToken.n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
|
||||||
code = buildSyntaxErrMsg(&pCxt->msg, "json string too long than 4095", sToken.z);
|
code = buildSyntaxErrMsg(&pCxt->msg, "json string too long than 4095", sToken.z);
|
||||||
taosMemoryFree(tmpTokenBuf);
|
taosMemoryFree(tmpTokenBuf);
|
||||||
|
@ -1009,18 +1009,18 @@ static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint
|
||||||
}
|
}
|
||||||
code = parseJsontoTagData(sToken.z, pTagVals, &pTag, &pCxt->msg);
|
code = parseJsontoTagData(sToken.z, pTagVals, &pTag, &pCxt->msg);
|
||||||
taosMemoryFree(tmpTokenBuf);
|
taosMemoryFree(tmpTokenBuf);
|
||||||
if(code != TSDB_CODE_SUCCESS){
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
isJson = true;
|
isJson = true;
|
||||||
}else{
|
} else {
|
||||||
STagVal val = {0};
|
STagVal val = {0};
|
||||||
code = parseTagToken(&pCxt->pSql, &sToken, pTagSchema, precision, &val, &pCxt->msg);
|
code = parseTagToken(&pCxt->pSql, &sToken, pTagSchema, precision, &val, &pCxt->msg);
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
taosMemoryFree(tmpTokenBuf);
|
taosMemoryFree(tmpTokenBuf);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
if (pTagSchema->type != TSDB_DATA_TYPE_BINARY){
|
if (pTagSchema->type != TSDB_DATA_TYPE_BINARY) {
|
||||||
taosMemoryFree(tmpTokenBuf);
|
taosMemoryFree(tmpTokenBuf);
|
||||||
}
|
}
|
||||||
taosArrayPush(pTagVals, &val);
|
taosArrayPush(pTagVals, &val);
|
||||||
|
@ -1032,7 +1032,7 @@ static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(!isJson && (code = tTagNew(pTagVals, 1, false, &pTag)) != TSDB_CODE_SUCCESS) {
|
if (!isJson && (code = tTagNew(pTagVals, 1, false, &pTag)) != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1040,8 +1040,8 @@ static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint
|
||||||
|
|
||||||
end:
|
end:
|
||||||
for (int i = 0; i < taosArrayGetSize(pTagVals); ++i) {
|
for (int i = 0; i < taosArrayGetSize(pTagVals); ++i) {
|
||||||
STagVal *p = (STagVal *)taosArrayGet(pTagVals, i);
|
STagVal* p = (STagVal*)taosArrayGet(pTagVals, i);
|
||||||
if(IS_VAR_DATA_TYPE(p->type)){
|
if (IS_VAR_DATA_TYPE(p->type)) {
|
||||||
taosMemoryFree(p->pData);
|
taosMemoryFree(p->pData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1701,10 +1701,10 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tN
|
||||||
return buildInvalidOperationMsg(&pBuf, "out of memory");
|
return buildInvalidOperationMsg(&pBuf, "out of memory");
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SSchema* pSchema = pDataBlock->pTableMeta->schema;
|
SSchema* pSchema = pDataBlock->pTableMeta->schema;
|
||||||
|
|
||||||
bool isJson = false;
|
bool isJson = false;
|
||||||
STag* pTag = NULL;
|
STag* pTag = NULL;
|
||||||
|
|
||||||
for (int c = 0; c < tags->numOfBound; ++c) {
|
for (int c = 0; c < tags->numOfBound; ++c) {
|
||||||
|
@ -1713,7 +1713,7 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tN
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchema* pTagSchema = &pSchema[tags->boundColumns[c]];
|
SSchema* pTagSchema = &pSchema[tags->boundColumns[c]];
|
||||||
int32_t colLen = pTagSchema->bytes;
|
int32_t colLen = pTagSchema->bytes;
|
||||||
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
|
if (IS_VAR_DATA_TYPE(pTagSchema->type)) {
|
||||||
colLen = bind[c].length[0];
|
colLen = bind[c].length[0];
|
||||||
}
|
}
|
||||||
|
@ -1724,22 +1724,22 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tN
|
||||||
}
|
}
|
||||||
|
|
||||||
isJson = true;
|
isJson = true;
|
||||||
char *tmp = taosMemoryCalloc(1, colLen + 1);
|
char* tmp = taosMemoryCalloc(1, colLen + 1);
|
||||||
memcpy(tmp, bind[c].buffer, colLen);
|
memcpy(tmp, bind[c].buffer, colLen);
|
||||||
code = parseJsontoTagData(tmp, pTagArray, &pTag, &pBuf);
|
code = parseJsontoTagData(tmp, pTagArray, &pTag, &pBuf);
|
||||||
taosMemoryFree(tmp);
|
taosMemoryFree(tmp);
|
||||||
if(code != TSDB_CODE_SUCCESS){
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
}else{
|
} else {
|
||||||
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
if(pTagSchema->type == TSDB_DATA_TYPE_BINARY){
|
if (pTagSchema->type == TSDB_DATA_TYPE_BINARY) {
|
||||||
val.pData = (uint8_t*)bind[c].buffer;
|
val.pData = (uint8_t*)bind[c].buffer;
|
||||||
val.nData = colLen;
|
val.nData = colLen;
|
||||||
}else if(pTagSchema->type == TSDB_DATA_TYPE_NCHAR){
|
} else if (pTagSchema->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
void *p = taosMemoryCalloc(1, colLen * TSDB_NCHAR_SIZE);
|
void* p = taosMemoryCalloc(1, colLen * TSDB_NCHAR_SIZE);
|
||||||
if(p == NULL){
|
if (p == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
@ -1757,7 +1757,7 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tN
|
||||||
}
|
}
|
||||||
val.pData = p;
|
val.pData = p;
|
||||||
val.nData = output;
|
val.nData = output;
|
||||||
}else{
|
} else {
|
||||||
memcpy(&val.i64, bind[c].buffer, colLen);
|
memcpy(&val.i64, bind[c].buffer, colLen);
|
||||||
}
|
}
|
||||||
taosArrayPush(pTagArray, &val);
|
taosArrayPush(pTagArray, &val);
|
||||||
|
@ -1775,8 +1775,8 @@ int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, char* tN
|
||||||
|
|
||||||
end:
|
end:
|
||||||
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
||||||
STagVal *p = (STagVal *)taosArrayGet(pTagArray, i);
|
STagVal* p = (STagVal*)taosArrayGet(pTagArray, i);
|
||||||
if(p->type == TSDB_DATA_TYPE_NCHAR){
|
if (p->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
taosMemoryFree(p->pData);
|
taosMemoryFree(p->pData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1951,7 +1951,8 @@ int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBu
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t buildBoundFields(SParsedDataColInfo* boundInfo, SSchema* pSchema, int32_t* fieldNum, TAOS_FIELD_E** fields, uint8_t timePrec) {
|
int32_t buildBoundFields(SParsedDataColInfo* boundInfo, SSchema* pSchema, int32_t* fieldNum, TAOS_FIELD_E** fields,
|
||||||
|
uint8_t timePrec) {
|
||||||
if (fields) {
|
if (fields) {
|
||||||
*fields = taosMemoryCalloc(boundInfo->numOfBound, sizeof(TAOS_FIELD));
|
*fields = taosMemoryCalloc(boundInfo->numOfBound, sizeof(TAOS_FIELD));
|
||||||
if (NULL == *fields) {
|
if (NULL == *fields) {
|
||||||
|
@ -1962,7 +1963,7 @@ int32_t buildBoundFields(SParsedDataColInfo* boundInfo, SSchema* pSchema, int32_
|
||||||
if (TSDB_DATA_TYPE_TIMESTAMP == schema->type) {
|
if (TSDB_DATA_TYPE_TIMESTAMP == schema->type) {
|
||||||
(*fields)[0].precision = timePrec;
|
(*fields)[0].precision = timePrec;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < boundInfo->numOfBound; ++i) {
|
for (int32_t i = 0; i < boundInfo->numOfBound; ++i) {
|
||||||
schema = &pSchema[boundInfo->boundColumns[i]];
|
schema = &pSchema[boundInfo->boundColumns[i]];
|
||||||
strcpy((*fields)[i].name, schema->name);
|
strcpy((*fields)[i].name, schema->name);
|
||||||
|
@ -2008,7 +2009,8 @@ int32_t qBuildStmtColFields(void* pBlock, int32_t* fieldNum, TAOS_FIELD_E** fiel
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
CHECK_CODE(buildBoundFields(&pDataBlock->boundColumnInfo, pSchema, fieldNum, fields, pDataBlock->pTableMeta->tableInfo.precision));
|
CHECK_CODE(buildBoundFields(&pDataBlock->boundColumnInfo, pSchema, fieldNum, fields,
|
||||||
|
pDataBlock->pTableMeta->tableInfo.precision));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -2122,13 +2124,13 @@ static int32_t smlBuildTagRow(SArray* cols, SParsedDataColInfo* tags, SSchema* p
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
for (int i = 0; i < tags->numOfBound; ++i) {
|
for (int i = 0; i < tags->numOfBound; ++i) {
|
||||||
SSchema* pTagSchema = &pSchema[tags->boundColumns[i]];
|
SSchema* pTagSchema = &pSchema[tags->boundColumns[i]];
|
||||||
SSmlKv* kv = taosArrayGetP(cols, i);
|
SSmlKv* kv = taosArrayGetP(cols, i);
|
||||||
|
|
||||||
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
if(pTagSchema->type == TSDB_DATA_TYPE_BINARY){
|
if (pTagSchema->type == TSDB_DATA_TYPE_BINARY) {
|
||||||
val.pData = (uint8_t *)kv->value;
|
val.pData = (uint8_t*)kv->value;
|
||||||
val.nData = kv->length;
|
val.nData = kv->length;
|
||||||
}else if(pTagSchema->type == TSDB_DATA_TYPE_NCHAR){
|
} else if (pTagSchema->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
int32_t output = 0;
|
int32_t output = 0;
|
||||||
void *p = taosMemoryCalloc(1, kv->length * TSDB_NCHAR_SIZE);
|
void *p = taosMemoryCalloc(1, kv->length * TSDB_NCHAR_SIZE);
|
||||||
if(p == NULL){
|
if(p == NULL){
|
||||||
|
@ -2149,7 +2151,7 @@ static int32_t smlBuildTagRow(SArray* cols, SParsedDataColInfo* tags, SSchema* p
|
||||||
}
|
}
|
||||||
val.pData = p;
|
val.pData = p;
|
||||||
val.nData = output;
|
val.nData = output;
|
||||||
}else{
|
} else {
|
||||||
memcpy(&val.i64, &(kv->value), kv->length);
|
memcpy(&val.i64, &(kv->value), kv->length);
|
||||||
}
|
}
|
||||||
taosArrayPush(pTagArray, &val);
|
taosArrayPush(pTagArray, &val);
|
||||||
|
@ -2158,8 +2160,8 @@ static int32_t smlBuildTagRow(SArray* cols, SParsedDataColInfo* tags, SSchema* p
|
||||||
code = tTagNew(pTagArray, 1, false, ppTag);
|
code = tTagNew(pTagArray, 1, false, ppTag);
|
||||||
end:
|
end:
|
||||||
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
for (int i = 0; i < taosArrayGetSize(pTagArray); ++i) {
|
||||||
STagVal *p = (STagVal *)taosArrayGet(pTagArray, i);
|
STagVal* p = (STagVal*)taosArrayGet(pTagArray, i);
|
||||||
if(p->type == TSDB_DATA_TYPE_NCHAR){
|
if (p->type == TSDB_DATA_TYPE_NCHAR) {
|
||||||
taosMemoryFree(p->pData);
|
taosMemoryFree(p->pData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -76,28 +76,8 @@ static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam) {
|
||||||
int32_t inputSize = (NULL != pParam->length ? *(pParam->length) : tDataTypes[pParam->buffer_type].bytes);
|
int32_t inputSize = (NULL != pParam->length ? *(pParam->length) : tDataTypes[pParam->buffer_type].bytes);
|
||||||
pVal->node.resType.type = pParam->buffer_type;
|
pVal->node.resType.type = pParam->buffer_type;
|
||||||
pVal->node.resType.bytes = inputSize;
|
pVal->node.resType.bytes = inputSize;
|
||||||
|
|
||||||
switch (pParam->buffer_type) {
|
switch (pParam->buffer_type) {
|
||||||
case TSDB_DATA_TYPE_BOOL:
|
|
||||||
pVal->datum.b = *((bool*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_TINYINT:
|
|
||||||
pVal->datum.i = *((int8_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_SMALLINT:
|
|
||||||
pVal->datum.i = *((int16_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_INT:
|
|
||||||
pVal->datum.i = *((int32_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_BIGINT:
|
|
||||||
pVal->datum.i = *((int64_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_FLOAT:
|
|
||||||
pVal->datum.d = *((float*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_DOUBLE:
|
|
||||||
pVal->datum.d = *((double*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_VARCHAR:
|
case TSDB_DATA_TYPE_VARCHAR:
|
||||||
case TSDB_DATA_TYPE_VARBINARY:
|
case TSDB_DATA_TYPE_VARBINARY:
|
||||||
pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
|
pVal->datum.p = taosMemoryCalloc(1, pVal->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
|
||||||
|
@ -124,28 +104,13 @@ static int32_t setValueByBindParam(SValueNode* pVal, TAOS_MULTI_BIND* pParam) {
|
||||||
pVal->node.resType.bytes = output + VARSTR_HEADER_SIZE;
|
pVal->node.resType.bytes = output + VARSTR_HEADER_SIZE;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
default: {
|
||||||
pVal->datum.i = *((int64_t*)pParam->buffer);
|
int32_t code = nodesSetValueNodeValue(pVal, pParam->buffer);
|
||||||
break;
|
if (code) {
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
return code;
|
||||||
pVal->datum.u = *((uint8_t*)pParam->buffer);
|
}
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_USMALLINT:
|
|
||||||
pVal->datum.u = *((uint16_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_UINT:
|
|
||||||
pVal->datum.u = *((uint32_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_UBIGINT:
|
|
||||||
pVal->datum.u = *((uint64_t*)pParam->buffer);
|
|
||||||
break;
|
|
||||||
case TSDB_DATA_TYPE_JSON:
|
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
|
||||||
case TSDB_DATA_TYPE_BLOB:
|
|
||||||
case TSDB_DATA_TYPE_MEDIUMBLOB:
|
|
||||||
// todo
|
|
||||||
default:
|
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
pVal->translate = true;
|
pVal->translate = true;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -108,7 +108,7 @@ void qwtInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -60,7 +60,7 @@ void flttInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -17,9 +17,7 @@ TARGET_INCLUDE_DIRECTORIES(
|
||||||
PUBLIC "${TD_SOURCE_DIR}/source/libs/parser/inc"
|
PUBLIC "${TD_SOURCE_DIR}/source/libs/parser/inc"
|
||||||
PRIVATE "${TD_SOURCE_DIR}/source/libs/scalar/inc"
|
PRIVATE "${TD_SOURCE_DIR}/source/libs/scalar/inc"
|
||||||
)
|
)
|
||||||
if(NOT TD_WINDOWS)
|
add_test(
|
||||||
add_test(
|
NAME scalarTest
|
||||||
NAME scalarTest
|
COMMAND scalarTest
|
||||||
COMMAND scalarTest
|
)
|
||||||
)
|
|
||||||
endif(NOT TD_WINDOWS)
|
|
||||||
|
|
|
@ -74,7 +74,7 @@ void scltInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -79,7 +79,7 @@ void schtInitLogFile() {
|
||||||
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, "/var/log/taos");
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
if (taosInitLog(defaultLogFileNamePrefix, maxLogFileNum) < 0) {
|
||||||
printf("failed to open log file in directory:%s\n", tsLogDir);
|
printf("failed to open log file in directory:%s\n", tsLogDir);
|
||||||
|
|
|
@ -35,6 +35,16 @@ void* streamDataBlockDecode(const void* buf, SStreamDataBlock* pInput) {
|
||||||
return (void*)buf;
|
return (void*)buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SStreamDataSubmit* streamSubmitRefClone(SStreamDataSubmit* pSubmit) {
|
||||||
|
SStreamDataSubmit* pSubmitClone = taosAllocateQitem(sizeof(SStreamDataSubmit), DEF_QITEM);
|
||||||
|
if (pSubmitClone == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
streamDataSubmitRefInc(pSubmit);
|
||||||
|
memcpy(pSubmitClone, pSubmit, sizeof(SStreamDataSubmit));
|
||||||
|
return pSubmitClone;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t streamBuildDispatchMsg(SStreamTask* pTask, SArray* data, SRpcMsg* pMsg, SEpSet** ppEpSet) {
|
static int32_t streamBuildDispatchMsg(SStreamTask* pTask, SArray* data, SRpcMsg* pMsg, SEpSet** ppEpSet) {
|
||||||
SStreamDispatchReq req = {
|
SStreamDispatchReq req = {
|
||||||
.streamId = pTask->streamId,
|
.streamId = pTask->streamId,
|
||||||
|
@ -207,7 +217,6 @@ int32_t streamExec(SStreamTask* pTask, SMsgCb* pMsgCb) {
|
||||||
if (pRes == NULL) return -1;
|
if (pRes == NULL) return -1;
|
||||||
while (1) {
|
while (1) {
|
||||||
int8_t execStatus = atomic_val_compare_exchange_8(&pTask->status, TASK_STATUS__IDLE, TASK_STATUS__EXECUTING);
|
int8_t execStatus = atomic_val_compare_exchange_8(&pTask->status, TASK_STATUS__IDLE, TASK_STATUS__EXECUTING);
|
||||||
void* exec = pTask->exec.executor;
|
|
||||||
if (execStatus == TASK_STATUS__IDLE) {
|
if (execStatus == TASK_STATUS__IDLE) {
|
||||||
// first run, from qall, handle failure from last exec
|
// first run, from qall, handle failure from last exec
|
||||||
pRes = streamExecForQall(pTask, pRes);
|
pRes = streamExecForQall(pTask, pRes);
|
||||||
|
|
|
@ -70,11 +70,11 @@ void osDefaultInit() {
|
||||||
|
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
if (configDir[0] == 0) {
|
if (configDir[0] == 0) {
|
||||||
strcpy(configDir, "/tmp/taosd");
|
strcpy(configDir, "/usr/local/etc/taos");
|
||||||
}
|
}
|
||||||
strcpy(tsDataDir, "/usr/local/var/lib/taos");
|
strcpy(tsDataDir, "/usr/local/var/lib/taos");
|
||||||
strcpy(tsLogDir, "/usr/local/var/log/taos");
|
strcpy(tsLogDir, "/usr/local/var/log/taos");
|
||||||
strcpy(tsTempDir, "/usr/local/etc/taos");
|
strcpy(tsTempDir, "/tmp/taosd");
|
||||||
strcpy(tsOsName, "Darwin");
|
strcpy(tsOsName, "Darwin");
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -75,6 +75,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_DUP_KEY, "Cannot add duplicate
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_NEED_RETRY, "Retry needed")
|
TAOS_DEFINE_ERROR(TSDB_CODE_NEED_RETRY, "Retry needed")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE, "Out of memory in rpc queue")
|
TAOS_DEFINE_ERROR(TSDB_CODE_OUT_OF_RPC_MEMORY_QUEUE, "Out of memory in rpc queue")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TIMESTAMP, "Invalid timestamp format")
|
TAOS_DEFINE_ERROR(TSDB_CODE_INVALID_TIMESTAMP, "Invalid timestamp format")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_MSG_DECODE_ERROR, "Msg decode error")
|
||||||
|
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_REF_NO_MEMORY, "Ref out of memory")
|
TAOS_DEFINE_ERROR(TSDB_CODE_REF_NO_MEMORY, "Ref out of memory")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_REF_FULL, "too many Ref Objs")
|
TAOS_DEFINE_ERROR(TSDB_CODE_REF_FULL, "too many Ref Objs")
|
||||||
|
|
|
@ -397,6 +397,7 @@ class TDDnode:
|
||||||
def stop(self):
|
def stop(self):
|
||||||
if (not self.remoteIP == ""):
|
if (not self.remoteIP == ""):
|
||||||
self.remoteExec(self.cfgDict, "tdDnodes.stop(%d)"%self.index)
|
self.remoteExec(self.cfgDict, "tdDnodes.stop(%d)"%self.index)
|
||||||
|
tdLog.info("stop dnode%d"%self.index)
|
||||||
return
|
return
|
||||||
if self.valgrind == 0:
|
if self.valgrind == 0:
|
||||||
toBeKilled = "taosd"
|
toBeKilled = "taosd"
|
||||||
|
|
|
@ -0,0 +1,124 @@
|
||||||
|
system sh/stop_dnodes.sh
|
||||||
|
system sh/deploy.sh -n dnode1 -i 1
|
||||||
|
system sh/deploy.sh -n dnode2 -i 2
|
||||||
|
system sh/deploy.sh -n dnode3 -i 3
|
||||||
|
system sh/deploy.sh -n dnode4 -i 4
|
||||||
|
system sh/exec.sh -n dnode1 -s start
|
||||||
|
system sh/exec.sh -n dnode2 -s start
|
||||||
|
system sh/exec.sh -n dnode3 -s start
|
||||||
|
system sh/exec.sh -n dnode4 -s start
|
||||||
|
sql connect
|
||||||
|
|
||||||
|
print =============== step1: create dnodes
|
||||||
|
sql create dnode $hostname port 7200
|
||||||
|
|
||||||
|
$loop_cnt = 0
|
||||||
|
step1:
|
||||||
|
$loop_cnt = $loop_cnt + 1
|
||||||
|
sleep 1000
|
||||||
|
if $loop_cnt == 10 then
|
||||||
|
print ====> dnode not ready!
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql show dnodes
|
||||||
|
print ===> $data00 $data01 $data02 $data03 $data04 $data05
|
||||||
|
print ===> $data10 $data11 $data12 $data13 $data14 $data15
|
||||||
|
if $rows != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(1)[4] != ready then
|
||||||
|
goto step1
|
||||||
|
endi
|
||||||
|
if $data(2)[4] != ready then
|
||||||
|
goto step1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print =============== step2: create database
|
||||||
|
sql create database db vgroups 1
|
||||||
|
sql show databases
|
||||||
|
if $rows != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(db)[4] != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql show dnodes
|
||||||
|
if $data(2)[2] != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
# vnodes
|
||||||
|
sql show dnodes
|
||||||
|
if $data(2)[2] != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
# v1_dnode
|
||||||
|
sql show db.vgroups
|
||||||
|
if $data(2)[3] != 2 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql_error alter database db replica 3
|
||||||
|
sql create table db.stb (ts timestamp, c1 int, c2 binary(4)) tags(t1 int, t2 binary(16)) comment "abd"
|
||||||
|
sql create table db.ctb using db.stb tags(101, "102")
|
||||||
|
sql insert into db.ctb values(now, 1, "2")
|
||||||
|
sql select * from db.stb
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
print =============== step3: create dnodes
|
||||||
|
sql create dnode $hostname port 7300
|
||||||
|
sql create dnode $hostname port 7400
|
||||||
|
|
||||||
|
$loop_cnt = 0
|
||||||
|
step3:
|
||||||
|
$loop_cnt = $loop_cnt + 1
|
||||||
|
sleep 1000
|
||||||
|
if $loop_cnt == 10 then
|
||||||
|
print ====> dnode not ready!
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
sql show dnodes
|
||||||
|
print ===> rows: $rows
|
||||||
|
print ===> $data00 $data01 $data02 $data03 $data04 $data05
|
||||||
|
print ===> $data10 $data11 $data12 $data13 $data14 $data15
|
||||||
|
print ===> $data20 $data21 $data22 $data23 $data24 $data25
|
||||||
|
print ===> $data30 $data31 $data32 $data33 $data24 $data35
|
||||||
|
if $rows != 4 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(1)[4] != ready then
|
||||||
|
goto step3
|
||||||
|
endi
|
||||||
|
if $data(2)[4] != ready then
|
||||||
|
goto step3
|
||||||
|
endi
|
||||||
|
if $data(3)[4] != ready then
|
||||||
|
goto step3
|
||||||
|
endi
|
||||||
|
if $data(4)[4] != ready then
|
||||||
|
goto step3
|
||||||
|
endi
|
||||||
|
|
||||||
|
return
|
||||||
|
print ============= step4: alter database
|
||||||
|
sql alter database db replica 3
|
||||||
|
if $rows != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
if $data(db)[4] != 3 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
sql select * from db.stb
|
||||||
|
if $rows != 1 then
|
||||||
|
return -1
|
||||||
|
endi
|
||||||
|
|
||||||
|
|
||||||
|
system sh/exec.sh -n dnode1 -s stop -x SIGINT
|
||||||
|
system sh/exec.sh -n dnode2 -s stop -x SIGINT
|
||||||
|
system sh/exec.sh -n dnode3 -s stop -x SIGINT
|
|
@ -84,6 +84,12 @@ class TDTestCase:
|
||||||
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
||||||
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
|
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
|
||||||
|
try:
|
||||||
|
config = eval(tdDnodes.dnodes[0].remoteIP)
|
||||||
|
hostname = config["host"]
|
||||||
|
except Exception:
|
||||||
|
hostname = tdDnodes.dnodes[0].remoteIP
|
||||||
serverPort = '7080'
|
serverPort = '7080'
|
||||||
rpcDebugFlagVal = '143'
|
rpcDebugFlagVal = '143'
|
||||||
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
|
|
@ -86,6 +86,12 @@ class TDTestCase:
|
||||||
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
||||||
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
|
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
|
||||||
|
try:
|
||||||
|
config = eval(tdDnodes.dnodes[0].remoteIP)
|
||||||
|
hostname = config["host"]
|
||||||
|
except Exception:
|
||||||
|
hostname = tdDnodes.dnodes[0].remoteIP
|
||||||
serverPort = '7080'
|
serverPort = '7080'
|
||||||
rpcDebugFlagVal = '143'
|
rpcDebugFlagVal = '143'
|
||||||
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
|
|
@ -86,6 +86,12 @@ class TDTestCase:
|
||||||
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
#updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
|
||||||
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
# 'serverPort': 7080, 'firstEp': 'trd02:7080'}
|
||||||
hostname = socket.gethostname()
|
hostname = socket.gethostname()
|
||||||
|
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
|
||||||
|
try:
|
||||||
|
config = eval(tdDnodes.dnodes[0].remoteIP )
|
||||||
|
hostname = config["host"]
|
||||||
|
except Exception:
|
||||||
|
hostname = tdDnodes.dnodes[0].remoteIP
|
||||||
serverPort = '7080'
|
serverPort = '7080'
|
||||||
rpcDebugFlagVal = '143'
|
rpcDebugFlagVal = '143'
|
||||||
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
|
||||||
|
@ -196,7 +202,7 @@ class TDTestCase:
|
||||||
pktNum = '10'
|
pktNum = '10'
|
||||||
role = 'client'
|
role = 'client'
|
||||||
if platform.system().lower() == 'windows':
|
if platform.system().lower() == 'windows':
|
||||||
taosCmd = buildPath + '\\build\\bin\\taos.exe -c ' + keyDict['c']
|
taosCmd = buildPath + '\\build\\bin\\taos.exe -h 127.0.0.1 -c ' + keyDict['c']
|
||||||
taosCmd = taosCmd.replace('\\','\\\\')
|
taosCmd = taosCmd.replace('\\','\\\\')
|
||||||
else:
|
else:
|
||||||
taosCmd = buildPath + '/build/bin/taos -c ' + keyDict['c']
|
taosCmd = buildPath + '/build/bin/taos -c ' + keyDict['c']
|
||||||
|
|
Loading…
Reference in New Issue