Merge branch '3.0' of https://github.com/taosdata/TDengine into enh/TD-30987-3
This commit is contained in:
commit
35606a5658
|
@ -49,6 +49,7 @@ table_option: {
|
||||||
7. Escape character "\`" can be used to avoid the conflict between table names and reserved keywords, above rules will be bypassed when using escape character on table names, but the upper limit for the name length is still valid. The table names specified using escape character are case sensitive.
|
7. Escape character "\`" can be used to avoid the conflict between table names and reserved keywords, above rules will be bypassed when using escape character on table names, but the upper limit for the name length is still valid. The table names specified using escape character are case sensitive.
|
||||||
For example \`aBc\` and \`abc\` are different table names but `abc` and `aBc` are same table names because they are both converted to `abc` internally.
|
For example \`aBc\` and \`abc\` are different table names but `abc` and `aBc` are same table names because they are both converted to `abc` internally.
|
||||||
Only ASCII visible characters can be used with escape character.
|
Only ASCII visible characters can be used with escape character.
|
||||||
|
8. For the details of using `ENCODE` and `COMPRESS`, please refer to [Encode and Compress for Column](../compress).
|
||||||
|
|
||||||
**Parameter description**
|
**Parameter description**
|
||||||
|
|
||||||
|
|
|
@ -13,17 +13,29 @@ create_definition:
|
||||||
col_name column_definition
|
col_name column_definition
|
||||||
|
|
||||||
column_definition:
|
column_definition:
|
||||||
type_name
|
type_name [comment 'string_value'] [PRIMARY KEY] [ENCODE 'encode_type'] [COMPRESS 'compress_type'] [LEVEL 'level_type']
|
||||||
|
|
||||||
|
table_options:
|
||||||
|
table_option ...
|
||||||
|
|
||||||
|
table_option: {
|
||||||
|
COMMENT 'string_value'
|
||||||
|
| SMA(col_name [, col_name] ...)
|
||||||
|
| TTL value
|
||||||
|
}
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
**More explanations**
|
**More explanations**
|
||||||
- Each supertable can have a maximum of 4096 columns, including tags. The minimum number of columns is 3: a timestamp column used as the key, one tag column, and one data column.
|
1. Each supertable can have a maximum of 4096 columns, including tags. The minimum number of columns is 3: a timestamp column used as the key, one tag column, and one data column.
|
||||||
- The TAGS keyword defines the tag columns for the supertable. The following restrictions apply to tag columns:
|
2. Since version 3.3.0.0, besides the timestamp, you can specify another column as primary key using `PRIMARY KEY` keyword, the column specified using `primary key` must be type of integer or varchar.
|
||||||
|
2. The TAGS keyword defines the tag columns for the supertable. The following restrictions apply to tag columns:
|
||||||
- A tag column can use the TIMESTAMP data type, but the values in the column must be fixed numbers. Timestamps including formulae, such as "now + 10s", cannot be stored in a tag column.
|
- A tag column can use the TIMESTAMP data type, but the values in the column must be fixed numbers. Timestamps including formulae, such as "now + 10s", cannot be stored in a tag column.
|
||||||
- The name of a tag column cannot be the same as the name of any other column.
|
- The name of a tag column cannot be the same as the name of any other column.
|
||||||
- The name of a tag column cannot be a reserved keyword.
|
- The name of a tag column cannot be a reserved keyword.
|
||||||
- Each supertable must contain between 1 and 128 tags. The total length of the TAGS keyword cannot exceed 16 KB.
|
- Each supertable must contain between 1 and 128 tags. The total length of the TAGS keyword cannot exceed 16 KB.
|
||||||
- For more information about table parameters, see Create a Table.
|
3. Regarding how to use `ENCODE` and `COMPRESS`, please refer to [Encode and Compress for Column](../compress).
|
||||||
|
3. For more information about table parameters, see [Create a Table](../table).
|
||||||
|
|
||||||
## View a Supertable
|
## View a Supertable
|
||||||
|
|
||||||
|
|
|
@ -729,6 +729,57 @@ The charset that takes effect is UTF-8.
|
||||||
| Value Range | -1: none message is compressed; 0: all messages are compressed; N (N>0): messages exceeding N bytes are compressed |
|
| Value Range | -1: none message is compressed; 0: all messages are compressed; N (N>0): messages exceeding N bytes are compressed |
|
||||||
| Default | -1 |
|
| Default | -1 |
|
||||||
|
|
||||||
|
### fPrecision
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| Application | Server Only |
|
||||||
|
| Meaning | Compression precision for float data type |
|
||||||
|
| Value Range | 0.1 ~ 0.00000001 |
|
||||||
|
| Default | 0.00000001 |
|
||||||
|
| Note | The floating value below this setting will be cut off |
|
||||||
|
|
||||||
|
### dPrecision
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| Applicable | Server Only |
|
||||||
|
| Meaning | Compression precision for double data type |
|
||||||
|
| Value Range | 0.1 ~ 0.0000000000000001 |
|
||||||
|
| Default | 0.0000000000000001 |
|
||||||
|
| Note | The floating value below this setting will be cut off |
|
||||||
|
|
||||||
|
### lossyColumn
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| Applicable | Server Only |
|
||||||
|
| Meaning | Enable TSZ lossy compression for float and/or double |
|
||||||
|
| Value Range | float, double |
|
||||||
|
| Default | none: disable TSZ lossy compression |
|
||||||
|
|
||||||
|
**补充说明**
|
||||||
|
1. It's only available since 3.2.0.0 version, and can't downgrade to previous version once upgrading to 3.2.0.0 and enabling this parameter
|
||||||
|
2. TSZ compression algorithm compresses data based on data prediction technique, so it's more suitable for data with specific pattern
|
||||||
|
3. TSZ compression algorithm may take longer time but it has better compression ratio, so it's suitable when you have enough CPU resources and are more sensitive to disk occupation
|
||||||
|
4. Example: enable TSZ for both float and double
|
||||||
|
```shell
|
||||||
|
lossyColumns float|double
|
||||||
|
```
|
||||||
|
5. After configuring, taosd service needs to restarted. After restarting, if you see the following output in taosd logfile, it means the function has been enabled
|
||||||
|
```sql
|
||||||
|
02/22 10:49:27.607990 00002933 UTL lossyColumns float|double
|
||||||
|
```
|
||||||
|
|
||||||
|
### ifAdtFse
|
||||||
|
|
||||||
|
| Attribute | Description |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| Applicable | Server Only |
|
||||||
|
| Meaning | Replace HUFFMAN with FSE in TSZ, FSE is faster when compressing but slower when uncompressing |
|
||||||
|
| Value Range | 0: Use HUFFMAN, 1: Use FSE |
|
||||||
|
| Default | 0: Use HUFFMAN |
|
||||||
|
|
||||||
|
|
||||||
## Other Parameters
|
## Other Parameters
|
||||||
|
|
||||||
|
|
|
@ -49,6 +49,7 @@ table_option: {
|
||||||
6. 使用数据类型 BINARY/NCHAR/GEOMETRY,需指定其最长的字节数,如 BINARY(20),表示 20 字节。
|
6. 使用数据类型 BINARY/NCHAR/GEOMETRY,需指定其最长的字节数,如 BINARY(20),表示 20 字节。
|
||||||
7. 为了兼容支持更多形式的表名,TDengine 引入新的转义符 "\`",可以让表名与关键词不冲突,同时不受限于上述表名称合法性约束检查。但是同样具有长度限制要求。使用转义字符以后,不再对转义字符中的内容进行大小写统一,
|
7. 为了兼容支持更多形式的表名,TDengine 引入新的转义符 "\`",可以让表名与关键词不冲突,同时不受限于上述表名称合法性约束检查。但是同样具有长度限制要求。使用转义字符以后,不再对转义字符中的内容进行大小写统一,
|
||||||
例如:\`aBc\` 和 \`abc\` 是不同的表名,但是 abc 和 aBc 是相同的表名。
|
例如:\`aBc\` 和 \`abc\` 是不同的表名,但是 abc 和 aBc 是相同的表名。
|
||||||
|
8. 关于 `ENCODE` 和 `COMPRESS` 的使用,请参考[按列压缩](../compress)
|
||||||
|
|
||||||
**参数说明**
|
**参数说明**
|
||||||
|
|
||||||
|
|
|
@ -13,17 +13,28 @@ create_definition:
|
||||||
col_name column_definition
|
col_name column_definition
|
||||||
|
|
||||||
column_definition:
|
column_definition:
|
||||||
type_name
|
type_name [comment 'string_value'] [PRIMARY KEY] [ENCODE 'encode_type'] [COMPRESS 'compress_type'] [LEVEL 'level_type']
|
||||||
|
|
||||||
|
table_options:
|
||||||
|
table_option ...
|
||||||
|
|
||||||
|
table_option: {
|
||||||
|
COMMENT 'string_value'
|
||||||
|
| SMA(col_name [, col_name] ...)
|
||||||
|
| TTL value
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
**使用说明**
|
**使用说明**
|
||||||
- 超级表中列的最大个数为 4096,需要注意,这里的 4096 是包含 TAG 列在内的,最小个数为 3,包含一个时间戳主键、一个 TAG 列和一个数据列。
|
1. 超级表中列的最大个数为 4096,需要注意,这里的 4096 是包含 TAG 列在内的,最小个数为 3,包含一个时间戳主键、一个 TAG 列和一个数据列。
|
||||||
- TAGS语法指定超级表的标签列,标签列需要遵循以下约定:
|
2. 除时间戳主键列之外,还可以通过 PRIMARY KEY 关键字指定第二列为额外的主键列。被指定为主键列的第二列必须为整型或字符串类型(varchar)
|
||||||
|
3. TAGS语法指定超级表的标签列,标签列需要遵循以下约定:
|
||||||
- TAGS 中的 TIMESTAMP 列写入数据时需要提供给定值,而暂不支持四则运算,例如 NOW + 10s 这类表达式。
|
- TAGS 中的 TIMESTAMP 列写入数据时需要提供给定值,而暂不支持四则运算,例如 NOW + 10s 这类表达式。
|
||||||
- TAGS 列名不能与其他列名相同。
|
- TAGS 列名不能与其他列名相同。
|
||||||
- TAGS 列名不能为预留关键字。
|
- TAGS 列名不能为预留关键字。
|
||||||
- TAGS 最多允许 128 个,至少 1 个,总长度不超过 16 KB。
|
- TAGS 最多允许 128 个,至少 1 个,总长度不超过 16 KB。
|
||||||
- 关于表参数的详细说明,参见 CREATE TABLE 中的介绍。
|
4. 关于 `ENCODE` 和 `COMPRESS` 的使用,请参考 [按列压缩](../compress)
|
||||||
|
5. 关于 table_option 中的参数说明,请参考 [建表 SQL 说明](../table)
|
||||||
|
|
||||||
## 查看超级表
|
## 查看超级表
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
---
|
---
|
||||||
title: 可配置压缩算法
|
title: 可配置压缩算法
|
||||||
|
sidebar_label: 可配置压缩
|
||||||
description: 可配置压缩算法
|
description: 可配置压缩算法
|
||||||
---
|
---
|
||||||
|
|
|
@ -784,6 +784,57 @@ charset 的有效值是 UTF-8。
|
||||||
| 取值范围 | -1: 所有消息都不压缩; 0: 所有消息都压缩; N (N>0): 只有大于 N 个字节的消息才压缩 |
|
| 取值范围 | -1: 所有消息都不压缩; 0: 所有消息都压缩; N (N>0): 只有大于 N 个字节的消息才压缩 |
|
||||||
| 缺省值 | -1 |
|
| 缺省值 | -1 |
|
||||||
|
|
||||||
|
### fPrecision
|
||||||
|
FLOAT 类型压缩精度控制:
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| 适用范围 | 服务器端 |
|
||||||
|
| 含义 | 设置 float 类型浮点数压缩精度 |
|
||||||
|
| 取值范围 | 0.1 ~ 0.00000001 |
|
||||||
|
| 缺省值 | 0.00000001 |
|
||||||
|
| 补充说明 | 小于此值的浮点数尾数部分将被截取 |
|
||||||
|
|
||||||
|
### dPrecision
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| 适用范围 | 服务器端 |
|
||||||
|
| 含义 | 设置 double 类型浮点数压缩精度 |
|
||||||
|
| 取值范围 | 0.1 ~ 0.0000000000000001 |
|
||||||
|
| 缺省值 | 0.0000000000000001 |
|
||||||
|
| 补充说明 | 小于此值的浮点数尾数部分将被截取 |
|
||||||
|
|
||||||
|
### lossyColumn
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| 适用范围 | 服务器端 |
|
||||||
|
| 含义 | 对 float 和/或 double 类型启用 TSZ 有损压缩 |
|
||||||
|
| 取值范围 | float, double |
|
||||||
|
| 缺省值 | none:表示关闭无损压缩 |
|
||||||
|
|
||||||
|
**补充说明**
|
||||||
|
1. 在 3.2.0.0 及以后版本生效,启用该参数后不能回退到升级前的版本
|
||||||
|
2. TSZ 压缩算法是通过数据预测技术完成的压缩,所以更适合有规律变化的数据
|
||||||
|
3. TSZ 压缩时间会更长一些,如果您的服务器 CPU 空闲多,存储空间小的情况下适合选用
|
||||||
|
4. 示例:对 float 和 double 类型都启用有损压缩
|
||||||
|
```shell
|
||||||
|
lossyColumns float|double
|
||||||
|
```
|
||||||
|
5. 配置需重启服务生效,重启如果在 taosd 日志中看到以下内容,表明配置已生效:
|
||||||
|
```sql
|
||||||
|
02/22 10:49:27.607990 00002933 UTL lossyColumns float|double
|
||||||
|
```
|
||||||
|
|
||||||
|
### ifAdtFse
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | -------------------------------- |
|
||||||
|
| 适用范围 | 服务器端 |
|
||||||
|
| 含义 | 在启用 TSZ 有损压缩时,使用 FSE 算法替换 HUFFMAN 算法, FSE 算法压缩速度更快,但解压稍慢,追求压缩速度可选用此算法 |
|
||||||
|
| 取值范围 | 0:关闭 1:打开 |
|
||||||
|
| 缺省值 | 0:关闭 |
|
||||||
|
|
||||||
## 3.0 中有效的配置参数列表
|
## 3.0 中有效的配置参数列表
|
||||||
|
|
||||||
| # | **参数** | **适用于 2.X ** | **适用于 3.0 ** | 3.0 版本的当前行为 |
|
| # | **参数** | **适用于 2.X ** | **适用于 3.0 ** | 3.0 版本的当前行为 |
|
||||||
|
@ -922,8 +973,5 @@ charset 的有效值是 UTF-8。
|
||||||
| 73 | probeSeconds | 是 | 否 | 3.0 行为未知 |
|
| 73 | probeSeconds | 是 | 否 | 3.0 行为未知 |
|
||||||
| 74 | probeKillSeconds | 是 | 否 | 3.0 行为未知 |
|
| 74 | probeKillSeconds | 是 | 否 | 3.0 行为未知 |
|
||||||
| 75 | probeInterval | 是 | 否 | 3.0 行为未知 |
|
| 75 | probeInterval | 是 | 否 | 3.0 行为未知 |
|
||||||
| 76 | lossyColumns | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 77 | fPrecision | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 78 | dPrecision | 是 | 否 | 3.0 行为未知 |
|
|
||||||
| 79 | maxRange | 是 | 否 | 3.0 行为未知 |
|
| 79 | maxRange | 是 | 否 | 3.0 行为未知 |
|
||||||
| 80 | range | 是 | 否 | 3.0 行为未知 |
|
| 80 | range | 是 | 否 | 3.0 行为未知 |
|
||||||
|
|
|
@ -1,69 +0,0 @@
|
||||||
---
|
|
||||||
title: TSZ 压缩算法
|
|
||||||
description: TDengine 对浮点数进行高效压缩的算法
|
|
||||||
---
|
|
||||||
|
|
||||||
TSZ 压缩算法是 TDengine 为浮点数据类型提供的可选压缩算法,可以实现浮点数有损至无损全状态压缩,相比默认压缩算法, TSZ 压缩算法压缩率更高,即使切至无损状态,压缩率也会比默认压缩高一倍。
|
|
||||||
|
|
||||||
## 适合场景
|
|
||||||
|
|
||||||
- TSZ 压缩算法是通过数据预测技术完成的压缩,所以更适合有规律变化的数据
|
|
||||||
- TSZ 压缩时间会更长一些,如果您的服务器 CPU 空闲多,存储空间小的情况下适合选用
|
|
||||||
|
|
||||||
## 使用步骤
|
|
||||||
- TDengine 支持版本为 3.2.0.0 或以上
|
|
||||||
- 开启选项
|
|
||||||
在 taos.cfg 配置中增加以下内容,即可开启 TSZ 压缩算法,功能打开后,会替换默认算法。
|
|
||||||
以下表示字段类型是 float 及 double 类型都使用此压缩算法,也可以单独只配置一个
|
|
||||||
|
|
||||||
```sql
|
|
||||||
lossyColumns float|double
|
|
||||||
```
|
|
||||||
|
|
||||||
- 配置需重启服务生效
|
|
||||||
- Taosd 日志输出以下内容,表明功能已生效:
|
|
||||||
|
|
||||||
```sql
|
|
||||||
02/22 10:49:27.607990 00002933 UTL lossyColumns float|double
|
|
||||||
```
|
|
||||||
|
|
||||||
## 配置参数
|
|
||||||
|
|
||||||
### fPrecision
|
|
||||||
FLOAT 类型精度控制:
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | -------------------------------- |
|
|
||||||
| 适用范围 | 服务器端 |
|
|
||||||
| 含义 | 设置 float 类型浮点数压缩精度 |
|
|
||||||
| 取值范围 | 0.1 ~ 0.00000001 |
|
|
||||||
| 缺省值 | 0.00000001 |
|
|
||||||
| 补充说明 | 小于此值的浮点数尾数部分将被截取 |
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
### dPrecision
|
|
||||||
DOUBLE 类型精度控制:
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | -------------------------------- |
|
|
||||||
| 适用范围 | 服务器端 |
|
|
||||||
| 含义 | 设置 double 类型浮点数压缩精度 |
|
|
||||||
| 取值范围 | 0.1 ~ 0.0000000000000001 |
|
|
||||||
| 缺省值 | 0.0000000000000001 |
|
|
||||||
| 补充说明 | 小于此值的浮点数尾数部分将被截取 |
|
|
||||||
|
|
||||||
|
|
||||||
### ifAdtFse
|
|
||||||
TSZ 压缩中可选择的算法 FSE,默认为 HUFFMAN:
|
|
||||||
|
|
||||||
| 属性 | 说明 |
|
|
||||||
| -------- | -------------------------------- |
|
|
||||||
| 适用范围 | 服务器端 |
|
|
||||||
| 含义 | 使用 FSE 算法替换 HUFFMAN 算法, FSE 算法压缩速度更快,但解压稍慢,追求压缩速度可选用此算法 |
|
|
||||||
| 取值范围 | 0:关闭 1:打开 |
|
|
||||||
| 缺省值 | 0:关闭 |
|
|
||||||
|
|
||||||
|
|
||||||
## 注意事项
|
|
||||||
- 打开 TSZ 后生成的存储数据格式,回退至 3.2.0.0 之前的版本,数据将不能被识别
|
|
|
@ -136,7 +136,7 @@ int32_t tRowMerge(SArray *aRowP, STSchema *pTSchema, int8_t flag);
|
||||||
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag);
|
int32_t tRowUpsertColData(SRow *pRow, STSchema *pTSchema, SColData *aColData, int32_t nColData, int32_t flag);
|
||||||
void tRowGetPrimaryKey(SRow *pRow, SRowKey *key);
|
void tRowGetPrimaryKey(SRow *pRow, SRowKey *key);
|
||||||
int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2);
|
int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2);
|
||||||
int32_t tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc);
|
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc);
|
||||||
|
|
||||||
// SRowIter ================================
|
// SRowIter ================================
|
||||||
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter);
|
int32_t tRowIterOpen(SRow *pRow, STSchema *pTSchema, SRowIter **ppIter);
|
||||||
|
|
|
@ -17,13 +17,13 @@
|
||||||
#define _TD_COMMON_MSG_CB_H_
|
#define _TD_COMMON_MSG_CB_H_
|
||||||
|
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
|
#include "tmsg.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SRpcMsg SRpcMsg;
|
typedef struct SRpcMsg SRpcMsg;
|
||||||
typedef struct SEpSet SEpSet;
|
|
||||||
typedef struct SMgmtWrapper SMgmtWrapper;
|
typedef struct SMgmtWrapper SMgmtWrapper;
|
||||||
typedef struct SRpcHandleInfo SRpcHandleInfo;
|
typedef struct SRpcHandleInfo SRpcHandleInfo;
|
||||||
|
|
||||||
|
@ -46,7 +46,7 @@ typedef int32_t (*PutToQueueFp)(void* pMgmt, EQueueType qtype, SRpcMsg* pMsg);
|
||||||
typedef int32_t (*GetQueueSizeFp)(void* pMgmt, int32_t vgId, EQueueType qtype);
|
typedef int32_t (*GetQueueSizeFp)(void* pMgmt, int32_t vgId, EQueueType qtype);
|
||||||
typedef int32_t (*SendReqFp)(const SEpSet* pEpSet, SRpcMsg* pMsg);
|
typedef int32_t (*SendReqFp)(const SEpSet* pEpSet, SRpcMsg* pMsg);
|
||||||
typedef void (*SendRspFp)(SRpcMsg* pMsg);
|
typedef void (*SendRspFp)(SRpcMsg* pMsg);
|
||||||
typedef void (*RegisterBrokenLinkArgFp)(SRpcMsg* pMsg);
|
typedef void (*RegisterBrokenLinkArgFp)(struct SRpcMsg* pMsg);
|
||||||
typedef void (*ReleaseHandleFp)(SRpcHandleInfo* pHandle, int8_t type);
|
typedef void (*ReleaseHandleFp)(SRpcHandleInfo* pHandle, int8_t type);
|
||||||
typedef void (*ReportStartup)(const char* name, const char* desc);
|
typedef void (*ReportStartup)(const char* name, const char* desc);
|
||||||
|
|
||||||
|
|
|
@ -81,7 +81,7 @@ typedef struct {
|
||||||
// uint64_t uid; // child table uid, may be useful
|
// uint64_t uid; // child table uid, may be useful
|
||||||
} RandTableName;
|
} RandTableName;
|
||||||
|
|
||||||
void buildChildTableName(RandTableName* rName);
|
int32_t buildChildTableName(RandTableName* rName);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -105,7 +105,7 @@ typedef struct SMTbCursor {
|
||||||
} SMTbCursor;
|
} SMTbCursor;
|
||||||
|
|
||||||
typedef struct SMCtbCursor {
|
typedef struct SMCtbCursor {
|
||||||
SMeta* pMeta;
|
struct SMeta* pMeta;
|
||||||
void* pCur;
|
void* pCur;
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
void* pKey;
|
void* pKey;
|
||||||
|
@ -134,7 +134,7 @@ typedef struct SMetaTableInfo {
|
||||||
} SMetaTableInfo;
|
} SMetaTableInfo;
|
||||||
|
|
||||||
typedef struct SSnapContext {
|
typedef struct SSnapContext {
|
||||||
SMeta* pMeta;
|
struct SMeta* pMeta;
|
||||||
int64_t snapVersion;
|
int64_t snapVersion;
|
||||||
void* pCur;
|
void* pCur;
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
|
@ -178,7 +178,7 @@ typedef struct TsdReader {
|
||||||
int32_t (*tsdNextDataBlock)();
|
int32_t (*tsdNextDataBlock)();
|
||||||
|
|
||||||
int32_t (*tsdReaderRetrieveBlockSMAInfo)();
|
int32_t (*tsdReaderRetrieveBlockSMAInfo)();
|
||||||
SSDataBlock *(*tsdReaderRetrieveDataBlock)();
|
int32_t (*tsdReaderRetrieveDataBlock)();
|
||||||
|
|
||||||
void (*tsdReaderReleaseDataBlock)();
|
void (*tsdReaderReleaseDataBlock)();
|
||||||
|
|
||||||
|
@ -381,7 +381,7 @@ typedef struct SStateStore {
|
||||||
void** ppVal, int32_t* pVLen);
|
void** ppVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateCountWinAdd)(SStreamState* pState, SSessionKey* pKey, void** pVal, int32_t* pVLen);
|
int32_t (*streamStateCountWinAdd)(SStreamState* pState, SSessionKey* pKey, void** pVal, int32_t* pVLen);
|
||||||
|
|
||||||
SUpdateInfo* (*updateInfoInit)(int64_t interval, int32_t precision, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen);
|
int32_t (*updateInfoInit)(int64_t interval, int32_t precision, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen, SUpdateInfo** ppInfo);
|
||||||
TSKEY (*updateInfoFillBlockData)(SUpdateInfo* pInfo, SSDataBlock* pBlock, int32_t primaryTsCol, int32_t primaryKeyCol);
|
TSKEY (*updateInfoFillBlockData)(SUpdateInfo* pInfo, SSDataBlock* pBlock, int32_t primaryTsCol, int32_t primaryKeyCol);
|
||||||
bool (*updateInfoIsUpdated)(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len);
|
bool (*updateInfoIsUpdated)(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len);
|
||||||
bool (*updateInfoIsTableInserted)(SUpdateInfo* pInfo, int64_t tbUid);
|
bool (*updateInfoIsTableInserted)(SUpdateInfo* pInfo, int64_t tbUid);
|
||||||
|
@ -389,12 +389,12 @@ typedef struct SStateStore {
|
||||||
|
|
||||||
void (*updateInfoDestroy)(SUpdateInfo* pInfo);
|
void (*updateInfoDestroy)(SUpdateInfo* pInfo);
|
||||||
void (*windowSBfDelete)(SUpdateInfo* pInfo, uint64_t count);
|
void (*windowSBfDelete)(SUpdateInfo* pInfo, uint64_t count);
|
||||||
void (*windowSBfAdd)(SUpdateInfo* pInfo, uint64_t count);
|
int32_t (*windowSBfAdd)(SUpdateInfo* pInfo, uint64_t count);
|
||||||
|
|
||||||
SUpdateInfo* (*updateInfoInitP)(SInterval* pInterval, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen);
|
int32_t (*updateInfoInitP)(SInterval* pInterval, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen, SUpdateInfo** ppInfo);
|
||||||
void (*updateInfoAddCloseWindowSBF)(SUpdateInfo* pInfo);
|
void (*updateInfoAddCloseWindowSBF)(SUpdateInfo* pInfo);
|
||||||
void (*updateInfoDestoryColseWinSBF)(SUpdateInfo* pInfo);
|
void (*updateInfoDestoryColseWinSBF)(SUpdateInfo* pInfo);
|
||||||
int32_t (*updateInfoSerialize)(void* buf, int32_t bufLen, const SUpdateInfo* pInfo);
|
int32_t (*updateInfoSerialize)(void* buf, int32_t bufLen, const SUpdateInfo* pInfo, int32_t* pLen);
|
||||||
int32_t (*updateInfoDeserialize)(void* buf, int32_t bufLen, SUpdateInfo* pInfo);
|
int32_t (*updateInfoDeserialize)(void* buf, int32_t bufLen, SUpdateInfo* pInfo);
|
||||||
|
|
||||||
SStreamStateCur* (*streamStateSessionSeekKeyNext)(SStreamState* pState, const SSessionKey* key);
|
SStreamStateCur* (*streamStateSessionSeekKeyNext)(SStreamState* pState, const SSessionKey* key);
|
||||||
|
|
|
@ -149,10 +149,10 @@ int32_t qCreateSName(SName* pName, const char* pTableName, int32_t acctId, char*
|
||||||
|
|
||||||
void qDestroyBoundColInfo(void* pInfo);
|
void qDestroyBoundColInfo(void* pInfo);
|
||||||
|
|
||||||
SQuery* smlInitHandle();
|
int32_t smlInitHandle(SQuery** query);
|
||||||
int32_t smlBuildRow(STableDataCxt* pTableCxt);
|
int32_t smlBuildRow(STableDataCxt* pTableCxt);
|
||||||
int32_t smlBuildCol(STableDataCxt* pTableCxt, SSchema* schema, void* kv, int32_t index);
|
int32_t smlBuildCol(STableDataCxt* pTableCxt, SSchema* schema, void* kv, int32_t index);
|
||||||
STableDataCxt* smlInitTableDataCtx(SQuery* query, STableMeta* pTableMeta);
|
int32_t smlInitTableDataCtx(SQuery* query, STableMeta* pTableMeta, STableDataCxt** cxt);
|
||||||
|
|
||||||
void clearColValArraySml(SArray* pCols);
|
void clearColValArraySml(SArray* pCols);
|
||||||
int32_t smlBindData(SQuery* handle, bool dataFormat, SArray* tags, SArray* colsSchema, SArray* cols,
|
int32_t smlBindData(SQuery* handle, bool dataFormat, SArray* tags, SArray* colsSchema, SArray* cols,
|
||||||
|
|
|
@ -237,6 +237,8 @@ typedef struct {
|
||||||
int64_t stbUid;
|
int64_t stbUid;
|
||||||
char stbFullName[TSDB_TABLE_FNAME_LEN];
|
char stbFullName[TSDB_TABLE_FNAME_LEN];
|
||||||
SSchemaWrapper* pSchemaWrapper;
|
SSchemaWrapper* pSchemaWrapper;
|
||||||
|
SSchemaWrapper* pTagSchema;
|
||||||
|
bool autoCreateCtb;
|
||||||
void* vnode; // not available to encoder and decoder
|
void* vnode; // not available to encoder and decoder
|
||||||
FTbSink* tbSinkFunc;
|
FTbSink* tbSinkFunc;
|
||||||
STSchema* pTSchema;
|
STSchema* pTSchema;
|
||||||
|
|
|
@ -15,29 +15,29 @@
|
||||||
#ifndef _TSTREAMUPDATE_H_
|
#ifndef _TSTREAMUPDATE_H_
|
||||||
#define _TSTREAMUPDATE_H_
|
#define _TSTREAMUPDATE_H_
|
||||||
|
|
||||||
|
#include "storageapi.h"
|
||||||
#include "taosdef.h"
|
#include "taosdef.h"
|
||||||
#include "tarray.h"
|
#include "tarray.h"
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "storageapi.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
SUpdateInfo *updateInfoInitP(SInterval *pInterval, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen);
|
int32_t updateInfoInitP(SInterval* pInterval, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen, SUpdateInfo** ppInfo);
|
||||||
SUpdateInfo *updateInfoInit(int64_t interval, int32_t precision, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen);
|
int32_t updateInfoInit(int64_t interval, int32_t precision, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen, SUpdateInfo** ppInfo);
|
||||||
TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol, int32_t primaryKeyCol);
|
TSKEY updateInfoFillBlockData(SUpdateInfo* pInfo, SSDataBlock* pBlock, int32_t primaryTsCol, int32_t primaryKeyCol);
|
||||||
bool updateInfoIsUpdated(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len);
|
bool updateInfoIsUpdated(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len);
|
||||||
bool updateInfoIsTableInserted(SUpdateInfo *pInfo, int64_t tbUid);
|
bool updateInfoIsTableInserted(SUpdateInfo* pInfo, int64_t tbUid);
|
||||||
void updateInfoDestroy(SUpdateInfo *pInfo);
|
void updateInfoDestroy(SUpdateInfo* pInfo);
|
||||||
void updateInfoAddCloseWindowSBF(SUpdateInfo *pInfo);
|
void updateInfoAddCloseWindowSBF(SUpdateInfo* pInfo);
|
||||||
void updateInfoDestoryColseWinSBF(SUpdateInfo *pInfo);
|
void updateInfoDestoryColseWinSBF(SUpdateInfo* pInfo);
|
||||||
int32_t updateInfoSerialize(void *buf, int32_t bufLen, const SUpdateInfo *pInfo);
|
int32_t updateInfoSerialize(void* buf, int32_t bufLen, const SUpdateInfo* pInfo, int32_t* pLen);
|
||||||
int32_t updateInfoDeserialize(void *buf, int32_t bufLen, SUpdateInfo *pInfo);
|
int32_t updateInfoDeserialize(void* buf, int32_t bufLen, SUpdateInfo* pInfo);
|
||||||
void windowSBfDelete(SUpdateInfo *pInfo, uint64_t count);
|
void windowSBfDelete(SUpdateInfo* pInfo, uint64_t count);
|
||||||
void windowSBfAdd(SUpdateInfo *pInfo, uint64_t count);
|
int32_t windowSBfAdd(SUpdateInfo* pInfo, uint64_t count);
|
||||||
bool isIncrementalTimeStamp(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len);
|
bool isIncrementalTimeStamp(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -70,7 +70,6 @@ typedef int64_t SyncIndex;
|
||||||
typedef int64_t SyncTerm;
|
typedef int64_t SyncTerm;
|
||||||
|
|
||||||
typedef struct SSyncNode SSyncNode;
|
typedef struct SSyncNode SSyncNode;
|
||||||
typedef struct SWal SWal;
|
|
||||||
typedef struct SSyncRaftEntry SSyncRaftEntry;
|
typedef struct SSyncRaftEntry SSyncRaftEntry;
|
||||||
|
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
@ -238,7 +237,7 @@ typedef struct SSyncInfo {
|
||||||
int32_t batchSize;
|
int32_t batchSize;
|
||||||
SSyncCfg syncCfg;
|
SSyncCfg syncCfg;
|
||||||
char path[TSDB_FILENAME_LEN];
|
char path[TSDB_FILENAME_LEN];
|
||||||
SWal* pWal;
|
struct SWal* pWal;
|
||||||
SSyncFSM* pFsm;
|
SSyncFSM* pFsm;
|
||||||
SMsgCb* msgcb;
|
SMsgCb* msgcb;
|
||||||
int32_t pingMs;
|
int32_t pingMs;
|
||||||
|
|
|
@ -32,9 +32,9 @@ extern "C" {
|
||||||
#define TSWAP(a, b) \
|
#define TSWAP(a, b) \
|
||||||
do { \
|
do { \
|
||||||
char *__tmp = (char*)alloca(sizeof(a)); \
|
char *__tmp = (char*)alloca(sizeof(a)); \
|
||||||
memcpy(__tmp, &(a), sizeof(a)); \
|
(void)memcpy(__tmp, &(a), sizeof(a)); \
|
||||||
memcpy(&(a), &(b), sizeof(a)); \
|
(void)memcpy(&(a), &(b), sizeof(a)); \
|
||||||
memcpy(&(b), __tmp, sizeof(a)); \
|
(void)memcpy(&(b), __tmp, sizeof(a)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
|
|
|
@ -54,6 +54,7 @@ void taosMemoryTrim(int32_t size);
|
||||||
void *taosMemoryMallocAlign(uint32_t alignment, int64_t size);
|
void *taosMemoryMallocAlign(uint32_t alignment, int64_t size);
|
||||||
|
|
||||||
#define TAOS_MEMSET(_s, _c, _n) ((void)memset(_s, _c, _n))
|
#define TAOS_MEMSET(_s, _c, _n) ((void)memset(_s, _c, _n))
|
||||||
|
#define TAOS_MEMCPY(_d, _s, _n) ((void)memcpy(_d, _s, _n))
|
||||||
|
|
||||||
#define taosMemoryFreeClear(ptr) \
|
#define taosMemoryFreeClear(ptr) \
|
||||||
do { \
|
do { \
|
||||||
|
|
|
@ -55,7 +55,7 @@ typedef enum { M2C = 0, C2M } ConvType;
|
||||||
|
|
||||||
#define tstrncpy(dst, src, size) \
|
#define tstrncpy(dst, src, size) \
|
||||||
do { \
|
do { \
|
||||||
strncpy((dst), (src), (size)); \
|
(void)strncpy((dst), (src), (size)); \
|
||||||
(dst)[(size)-1] = 0; \
|
(dst)[(size)-1] = 0; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tencode.h"
|
#include "tencode.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
|
#include "tlog.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -35,19 +37,19 @@ typedef struct SBloomFilter {
|
||||||
uint64_t size;
|
uint64_t size;
|
||||||
_hash_fn_t hashFn1;
|
_hash_fn_t hashFn1;
|
||||||
_hash_fn_t hashFn2;
|
_hash_fn_t hashFn2;
|
||||||
void *buffer;
|
void* buffer;
|
||||||
double errorRate;
|
double errorRate;
|
||||||
} SBloomFilter;
|
} SBloomFilter;
|
||||||
|
|
||||||
SBloomFilter *tBloomFilterInit(uint64_t expectedEntries, double errorRate);
|
int32_t tBloomFilterInit(uint64_t expectedEntries, double errorRate, SBloomFilter** ppBF);
|
||||||
int32_t tBloomFilterPutHash(SBloomFilter *pBF, uint64_t hash1, uint64_t hash2);
|
int32_t tBloomFilterPutHash(SBloomFilter* pBF, uint64_t hash1, uint64_t hash2);
|
||||||
int32_t tBloomFilterPut(SBloomFilter *pBF, const void *keyBuf, uint32_t len);
|
int32_t tBloomFilterPut(SBloomFilter* pBF, const void* keyBuf, uint32_t len);
|
||||||
int32_t tBloomFilterNoContain(const SBloomFilter *pBF, uint64_t h1, uint64_t h2);
|
int32_t tBloomFilterNoContain(const SBloomFilter* pBF, uint64_t h1, uint64_t h2);
|
||||||
void tBloomFilterDestroy(SBloomFilter *pBF);
|
void tBloomFilterDestroy(SBloomFilter* pBF);
|
||||||
void tBloomFilterDump(const SBloomFilter *pBF);
|
void tBloomFilterDump(const SBloomFilter* pBF);
|
||||||
bool tBloomFilterIsFull(const SBloomFilter *pBF);
|
bool tBloomFilterIsFull(const SBloomFilter* pBF);
|
||||||
int32_t tBloomFilterEncode(const SBloomFilter *pBF, SEncoder *pEncoder);
|
int32_t tBloomFilterEncode(const SBloomFilter* pBF, SEncoder* pEncoder);
|
||||||
SBloomFilter *tBloomFilterDecode(SDecoder *pDecoder);
|
int32_t tBloomFilterDecode(SDecoder* pDecoder, SBloomFilter** ppBF);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SScalableBf {
|
typedef struct SScalableBf {
|
||||||
SArray *bfArray; // array of bloom filters
|
SArray* bfArray; // array of bloom filters
|
||||||
uint32_t growth;
|
uint32_t growth;
|
||||||
uint64_t numBits;
|
uint64_t numBits;
|
||||||
uint32_t maxBloomFilters;
|
uint32_t maxBloomFilters;
|
||||||
|
@ -32,13 +32,13 @@ typedef struct SScalableBf {
|
||||||
_hash_fn_t hashFn2;
|
_hash_fn_t hashFn2;
|
||||||
} SScalableBf;
|
} SScalableBf;
|
||||||
|
|
||||||
SScalableBf *tScalableBfInit(uint64_t expectedEntries, double errorRate);
|
int32_t tScalableBfInit(uint64_t expectedEntries, double errorRate, SScalableBf** ppSBf);
|
||||||
int32_t tScalableBfPutNoCheck(SScalableBf *pSBf, const void *keyBuf, uint32_t len);
|
int32_t tScalableBfPutNoCheck(SScalableBf* pSBf, const void* keyBuf, uint32_t len);
|
||||||
int32_t tScalableBfPut(SScalableBf *pSBf, const void *keyBuf, uint32_t len);
|
int32_t tScalableBfPut(SScalableBf* pSBf, const void* keyBuf, uint32_t len);
|
||||||
int32_t tScalableBfNoContain(const SScalableBf *pSBf, const void *keyBuf, uint32_t len);
|
int32_t tScalableBfNoContain(const SScalableBf* pSBf, const void* keyBuf, uint32_t len);
|
||||||
void tScalableBfDestroy(SScalableBf *pSBf);
|
void tScalableBfDestroy(SScalableBf* pSBf);
|
||||||
int32_t tScalableBfEncode(const SScalableBf *pSBf, SEncoder *pEncoder);
|
int32_t tScalableBfEncode(const SScalableBf* pSBf, SEncoder* pEncoder);
|
||||||
SScalableBf *tScalableBfDecode(SDecoder *pDecoder);
|
int32_t tScalableBfDecode(SDecoder* pDecoder, SScalableBf** ppSBf);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#include "tdef.h"
|
#include "tdef.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "tmd5.h"
|
#include "tmd5.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|
|
@ -82,7 +82,7 @@ extern "C" {
|
||||||
#define IS_SLASH_LETTER_IN_MEASUREMENT(sql) \
|
#define IS_SLASH_LETTER_IN_MEASUREMENT(sql) \
|
||||||
(*((sql)-1) == SLASH && (*(sql) == COMMA || *(sql) == SPACE || *(sql) == SLASH))
|
(*((sql)-1) == SLASH && (*(sql) == COMMA || *(sql) == SPACE || *(sql) == SLASH))
|
||||||
|
|
||||||
#define MOVE_FORWARD_ONE(sql, len) (memmove((void *)((sql)-1), (sql), len))
|
#define MOVE_FORWARD_ONE(sql, len) ((void)memmove((void *)((sql)-1), (sql), len))
|
||||||
|
|
||||||
#define PROCESS_SLASH_IN_MEASUREMENT(key, keyLen) \
|
#define PROCESS_SLASH_IN_MEASUREMENT(key, keyLen) \
|
||||||
for (int i = 1; i < keyLen; ++i) { \
|
for (int i = 1; i < keyLen; ++i) { \
|
||||||
|
@ -211,19 +211,19 @@ extern int64_t smlFactorS[];
|
||||||
|
|
||||||
typedef int32_t (*_equal_fn_sml)(const void *, const void *);
|
typedef int32_t (*_equal_fn_sml)(const void *, const void *);
|
||||||
|
|
||||||
SSmlHandle *smlBuildSmlInfo(TAOS *taos);
|
int32_t smlBuildSmlInfo(TAOS *taos, SSmlHandle **handle);
|
||||||
void smlDestroyInfo(SSmlHandle *info);
|
void smlDestroyInfo(SSmlHandle *info);
|
||||||
int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset);
|
int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset);
|
||||||
int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset);
|
int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset);
|
||||||
bool smlParseNumberOld(SSmlKv *kvVal, SSmlMsgBuf *msg);
|
bool smlParseNumberOld(SSmlKv *kvVal, SSmlMsgBuf *msg);
|
||||||
int32_t smlBuildInvalidDataMsg(SSmlMsgBuf *pBuf, const char *msg1, const char *msg2);
|
void smlBuildInvalidDataMsg(SSmlMsgBuf *pBuf, const char *msg1, const char *msg2);
|
||||||
bool smlParseNumber(SSmlKv *kvVal, SSmlMsgBuf *msg);
|
int32_t smlParseNumber(SSmlKv *kvVal, SSmlMsgBuf *msg);
|
||||||
int64_t smlGetTimeValue(const char *value, int32_t len, uint8_t fromPrecision, uint8_t toPrecision);
|
int64_t smlGetTimeValue(const char *value, int32_t len, uint8_t fromPrecision, uint8_t toPrecision);
|
||||||
SSmlTableInfo* smlBuildTableInfo(int numRows, const char* measure, int32_t measureLen);
|
int32_t smlBuildTableInfo(int numRows, const char* measure, int32_t measureLen, SSmlTableInfo** tInfo);
|
||||||
SSmlSTableMeta* smlBuildSTableMeta(bool isDataFormat);
|
int32_t smlBuildSTableMeta(bool isDataFormat, SSmlSTableMeta** sMeta);
|
||||||
int32_t smlSetCTableName(SSmlTableInfo *oneTable);
|
int32_t smlSetCTableName(SSmlTableInfo *oneTable);
|
||||||
void getTableUid(SSmlHandle *info, SSmlLineInfo *currElement, SSmlTableInfo *tinfo);
|
int32_t getTableUid(SSmlHandle *info, SSmlLineInfo *currElement, SSmlTableInfo *tinfo);
|
||||||
STableMeta* smlGetMeta(SSmlHandle *info, const void* measure, int32_t measureLen);
|
int32_t smlGetMeta(SSmlHandle *info, const void* measure, int32_t measureLen, STableMeta **pTableMeta);
|
||||||
int32_t is_same_child_table_telnet(const void *a, const void *b);
|
int32_t is_same_child_table_telnet(const void *a, const void *b);
|
||||||
int64_t smlParseOpenTsdbTime(SSmlHandle *info, const char *data, int32_t len);
|
int64_t smlParseOpenTsdbTime(SSmlHandle *info, const char *data, int32_t len);
|
||||||
int32_t smlClearForRerun(SSmlHandle *info);
|
int32_t smlClearForRerun(SSmlHandle *info);
|
||||||
|
@ -236,7 +236,7 @@ int32_t smlParseInfluxString(SSmlHandle *info, char *sql, char *sqlEnd, SSmlLine
|
||||||
int32_t smlParseTelnetString(SSmlHandle *info, char *sql, char *sqlEnd, SSmlLineInfo *elements);
|
int32_t smlParseTelnetString(SSmlHandle *info, char *sql, char *sqlEnd, SSmlLineInfo *elements);
|
||||||
int32_t smlParseJSON(SSmlHandle *info, char *payload);
|
int32_t smlParseJSON(SSmlHandle *info, char *payload);
|
||||||
|
|
||||||
SSmlSTableMeta* smlBuildSuperTableInfo(SSmlHandle *info, SSmlLineInfo *currElement);
|
int32_t smlBuildSuperTableInfo(SSmlHandle *info, SSmlLineInfo *currElement, SSmlSTableMeta** sMeta);
|
||||||
bool isSmlTagAligned(SSmlHandle *info, int cnt, SSmlKv *kv);
|
bool isSmlTagAligned(SSmlHandle *info, int cnt, SSmlKv *kv);
|
||||||
bool isSmlColAligned(SSmlHandle *info, int cnt, SSmlKv *kv);
|
bool isSmlColAligned(SSmlHandle *info, int cnt, SSmlKv *kv);
|
||||||
int32_t smlProcessChildTable(SSmlHandle *info, SSmlLineInfo *elements);
|
int32_t smlProcessChildTable(SSmlHandle *info, SSmlLineInfo *elements);
|
||||||
|
|
|
@ -1572,9 +1572,8 @@ int taos_write_raw_block_with_fields_with_reqid(TAOS* taos, int rows, char* pDat
|
||||||
}
|
}
|
||||||
// uError("td23101 0vgId:%d, vgId:%d, name:%s, uid:%"PRIu64, vgData.vgId, pTableMeta->vgId, tbname, pTableMeta->uid);
|
// uError("td23101 0vgId:%d, vgId:%d, name:%s, uid:%"PRIu64, vgData.vgId, pTableMeta->vgId, tbname, pTableMeta->uid);
|
||||||
|
|
||||||
pQuery = smlInitHandle();
|
code = smlInitHandle(&pQuery);
|
||||||
if (pQuery == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
||||||
|
@ -1656,9 +1655,9 @@ int taos_write_raw_block_with_reqid(TAOS* taos, int rows, char* pData, const cha
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
pQuery = smlInitHandle();
|
|
||||||
if (pQuery == NULL) {
|
code = smlInitHandle(&pQuery);
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
||||||
|
@ -1755,12 +1754,12 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
|
||||||
conn.requestObjRefId = pRequest->self;
|
conn.requestObjRefId = pRequest->self;
|
||||||
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
pQuery = smlInitHandle();
|
code = smlInitHandle(&pQuery);
|
||||||
if (pQuery == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
SET_ERROR_MSG("init sml handle failed");
|
SET_ERROR_MSG("init sml handle failed");
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
||||||
while (++rspObj.common.resIter < rspObj.rsp.common.blockNum) {
|
while (++rspObj.common.resIter < rspObj.rsp.common.blockNum) {
|
||||||
void* pRetrieve = taosArrayGetP(rspObj.rsp.common.blockData, rspObj.common.resIter);
|
void* pRetrieve = taosArrayGetP(rspObj.rsp.common.blockData, rspObj.common.resIter);
|
||||||
|
@ -1903,12 +1902,12 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
|
||||||
conn.requestObjRefId = pRequest->self;
|
conn.requestObjRefId = pRequest->self;
|
||||||
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
conn.mgmtEps = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp);
|
||||||
|
|
||||||
pQuery = smlInitHandle();
|
code = smlInitHandle(&pQuery);
|
||||||
if (pQuery == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
SET_ERROR_MSG("init sml handle failed");
|
SET_ERROR_MSG("init sml handle failed");
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
pVgHash = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
|
||||||
|
|
||||||
uDebug(LOG_ID_TAG " write raw metadata block num:%d", LOG_ID_VALUE, rspObj.rsp.common.blockNum);
|
uDebug(LOG_ID_TAG " write raw metadata block num:%d", LOG_ID_VALUE, rspObj.rsp.common.blockNum);
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -29,29 +29,29 @@
|
||||||
(start)++; \
|
(start)++; \
|
||||||
}
|
}
|
||||||
|
|
||||||
static char *smlJsonGetObj(char *payload) {
|
static int32_t smlJsonGetObj(char **payload) {
|
||||||
int leftBracketCnt = 0;
|
int leftBracketCnt = 0;
|
||||||
bool isInQuote = false;
|
bool isInQuote = false;
|
||||||
while (*payload) {
|
while (**payload) {
|
||||||
if (*payload == '"' && *(payload - 1) != '\\') {
|
if (**payload == '"' && *((*payload) - 1) != '\\') {
|
||||||
isInQuote = !isInQuote;
|
isInQuote = !isInQuote;
|
||||||
} else if (!isInQuote && unlikely(*payload == '{')) {
|
} else if (!isInQuote && unlikely(**payload == '{')) {
|
||||||
leftBracketCnt++;
|
leftBracketCnt++;
|
||||||
payload++;
|
(*payload)++;
|
||||||
continue;
|
continue;
|
||||||
} else if (!isInQuote && unlikely(*payload == '}')) {
|
} else if (!isInQuote && unlikely(**payload == '}')) {
|
||||||
leftBracketCnt--;
|
leftBracketCnt--;
|
||||||
payload++;
|
(*payload)++;
|
||||||
if (leftBracketCnt == 0) {
|
if (leftBracketCnt == 0) {
|
||||||
return payload;
|
return 0;
|
||||||
} else if (leftBracketCnt < 0) {
|
} else if (leftBracketCnt < 0) {
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
payload++;
|
(*payload)++;
|
||||||
}
|
}
|
||||||
return NULL;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset) {
|
int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
|
@ -99,8 +99,9 @@ int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
offset[index++] = *start - sTmp;
|
offset[index++] = *start - sTmp;
|
||||||
element->timestamp = (*start);
|
element->timestamp = (*start);
|
||||||
if (*(*start) == '{') {
|
if (*(*start) == '{') {
|
||||||
char *tmp = smlJsonGetObj((*start));
|
char *tmp = *start;
|
||||||
if (tmp) {
|
int32_t code = smlJsonGetObj(&tmp);
|
||||||
|
if (code == 0) {
|
||||||
element->timestampLen = tmp - (*start);
|
element->timestampLen = tmp - (*start);
|
||||||
*start = tmp;
|
*start = tmp;
|
||||||
}
|
}
|
||||||
|
@ -127,8 +128,9 @@ int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
offset[index++] = *start - sTmp;
|
offset[index++] = *start - sTmp;
|
||||||
element->cols = (*start);
|
element->cols = (*start);
|
||||||
if (*(*start) == '{') {
|
if (*(*start) == '{') {
|
||||||
char *tmp = smlJsonGetObj((*start));
|
char *tmp = *start;
|
||||||
if (tmp) {
|
int32_t code = smlJsonGetObj(&tmp);
|
||||||
|
if (code == 0) {
|
||||||
element->colsLen = tmp - (*start);
|
element->colsLen = tmp - (*start);
|
||||||
*start = tmp;
|
*start = tmp;
|
||||||
}
|
}
|
||||||
|
@ -153,8 +155,9 @@ int smlJsonParseObjFirst(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
JUMP_JSON_SPACE((*start))
|
JUMP_JSON_SPACE((*start))
|
||||||
offset[index++] = *start - sTmp;
|
offset[index++] = *start - sTmp;
|
||||||
element->tags = (*start);
|
element->tags = (*start);
|
||||||
char *tmp = smlJsonGetObj((*start));
|
char *tmp = *start;
|
||||||
if (tmp) {
|
int32_t code = smlJsonGetObj(&tmp);
|
||||||
|
if (code == 0) {
|
||||||
element->tagsLen = tmp - (*start);
|
element->tagsLen = tmp - (*start);
|
||||||
*start = tmp;
|
*start = tmp;
|
||||||
}
|
}
|
||||||
|
@ -209,8 +212,9 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
(*start) += offset[index++];
|
(*start) += offset[index++];
|
||||||
element->timestamp = *start;
|
element->timestamp = *start;
|
||||||
if (*(*start) == '{') {
|
if (*(*start) == '{') {
|
||||||
char *tmp = smlJsonGetObj((*start));
|
char *tmp = *start;
|
||||||
if (tmp) {
|
int32_t code = smlJsonGetObj(&tmp);
|
||||||
|
if (code == 0) {
|
||||||
element->timestampLen = tmp - (*start);
|
element->timestampLen = tmp - (*start);
|
||||||
*start = tmp;
|
*start = tmp;
|
||||||
}
|
}
|
||||||
|
@ -227,8 +231,9 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
(*start) += offset[index++];
|
(*start) += offset[index++];
|
||||||
element->cols = *start;
|
element->cols = *start;
|
||||||
if (*(*start) == '{') {
|
if (*(*start) == '{') {
|
||||||
char *tmp = smlJsonGetObj((*start));
|
char *tmp = *start;
|
||||||
if (tmp) {
|
int32_t code = smlJsonGetObj(&tmp);
|
||||||
|
if (code == 0) {
|
||||||
element->colsLen = tmp - (*start);
|
element->colsLen = tmp - (*start);
|
||||||
*start = tmp;
|
*start = tmp;
|
||||||
}
|
}
|
||||||
|
@ -244,8 +249,9 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
} else if ((*start)[1] == 't' && (*start)[2] == 'a') {
|
} else if ((*start)[1] == 't' && (*start)[2] == 'a') {
|
||||||
(*start) += offset[index++];
|
(*start) += offset[index++];
|
||||||
element->tags = (*start);
|
element->tags = (*start);
|
||||||
char *tmp = smlJsonGetObj((*start));
|
char *tmp = *start;
|
||||||
if (tmp) {
|
int32_t code = smlJsonGetObj(&tmp);
|
||||||
|
if (code == 0) {
|
||||||
element->tagsLen = tmp - (*start);
|
element->tagsLen = tmp - (*start);
|
||||||
*start = tmp;
|
*start = tmp;
|
||||||
}
|
}
|
||||||
|
@ -261,7 +267,7 @@ int smlJsonParseObj(char **start, SSmlLineInfo *element, int8_t *offset) {
|
||||||
uError("elements != %d", OTD_JSON_FIELDS_NUM);
|
uError("elements != %d", OTD_JSON_FIELDS_NUM);
|
||||||
return TSDB_CODE_TSC_INVALID_JSON;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
}
|
}
|
||||||
return 0;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int32_t smlParseMetricFromJSON(SSmlHandle *info, cJSON *metric, SSmlLineInfo *elements) {
|
static inline int32_t smlParseMetricFromJSON(SSmlHandle *info, cJSON *metric, SSmlLineInfo *elements) {
|
||||||
|
@ -466,7 +472,11 @@ static int32_t smlParseValueFromJSON(cJSON *root, SSmlKv *kv) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case cJSON_String: {
|
case cJSON_String: {
|
||||||
smlConvertJSONString(kv, "binary", root);
|
int32_t ret = smlConvertJSONString(kv, "binary", root);
|
||||||
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("OTD:Failed to parse binary value from JSON Obj");
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case cJSON_Object: {
|
case cJSON_Object: {
|
||||||
|
@ -492,20 +502,17 @@ static int32_t smlProcessTagJson(SSmlHandle *info, cJSON *tags){
|
||||||
int32_t tagNum = cJSON_GetArraySize(tags);
|
int32_t tagNum = cJSON_GetArraySize(tags);
|
||||||
if (unlikely(tagNum == 0)) {
|
if (unlikely(tagNum == 0)) {
|
||||||
uError("SML:Tag should not be empty");
|
uError("SML:Tag should not be empty");
|
||||||
terrno = TSDB_CODE_TSC_INVALID_JSON;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
for (int32_t i = 0; i < tagNum; ++i) {
|
for (int32_t i = 0; i < tagNum; ++i) {
|
||||||
cJSON *tag = cJSON_GetArrayItem(tags, i);
|
cJSON *tag = cJSON_GetArrayItem(tags, i);
|
||||||
if (unlikely(tag == NULL)) {
|
if (unlikely(tag == NULL)) {
|
||||||
terrno = TSDB_CODE_TSC_INVALID_JSON;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
size_t keyLen = strlen(tag->string);
|
size_t keyLen = strlen(tag->string);
|
||||||
if (unlikely(IS_INVALID_COL_LEN(keyLen))) {
|
if (unlikely(IS_INVALID_COL_LEN(keyLen))) {
|
||||||
uError("OTD:Tag key length is 0 or too large than 64");
|
uError("OTD:Tag key length is 0 or too large than 64");
|
||||||
terrno = TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
|
return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// add kv to SSmlKv
|
// add kv to SSmlKv
|
||||||
|
@ -516,19 +523,19 @@ static int32_t smlProcessTagJson(SSmlHandle *info, cJSON *tags){
|
||||||
// value
|
// value
|
||||||
int32_t ret = smlParseValueFromJSON(tag, &kv);
|
int32_t ret = smlParseValueFromJSON(tag, &kv);
|
||||||
if (unlikely(ret != TSDB_CODE_SUCCESS)) {
|
if (unlikely(ret != TSDB_CODE_SUCCESS)) {
|
||||||
terrno = ret;
|
return ret;
|
||||||
return -1;
|
}
|
||||||
|
if (taosArrayPush(preLineKV, &kv) == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
taosArrayPush(preLineKV, &kv);
|
|
||||||
|
|
||||||
if (info->dataFormat && !isSmlTagAligned(info, cnt, &kv)) {
|
if (info->dataFormat && !isSmlTagAligned(info, cnt, &kv)) {
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
return 0;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlParseTagsFromJSON(SSmlHandle *info, cJSON *tags, SSmlLineInfo *elements) {
|
static int32_t smlParseTagsFromJSON(SSmlHandle *info, cJSON *tags, SSmlLineInfo *elements) {
|
||||||
|
@ -536,12 +543,18 @@ static int32_t smlParseTagsFromJSON(SSmlHandle *info, cJSON *tags, SSmlLineInfo
|
||||||
if(info->dataFormat){
|
if(info->dataFormat){
|
||||||
ret = smlProcessSuperTable(info, elements);
|
ret = smlProcessSuperTable(info, elements);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
return terrno;
|
if(info->reRun){
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ret = smlProcessTagJson(info, tags);
|
ret = smlProcessTagJson(info, tags);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
return terrno;
|
if(info->reRun){
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
ret = smlJoinMeasureTag(elements);
|
ret = smlJoinMeasureTag(elements);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
|
@ -703,6 +716,9 @@ static int32_t smlParseJSONStringExt(SSmlHandle *info, cJSON *root, SSmlLineInfo
|
||||||
// Parse tags
|
// Parse tags
|
||||||
bool needFree = info->dataFormat;
|
bool needFree = info->dataFormat;
|
||||||
elements->tags = cJSON_PrintUnformatted(tagsJson);
|
elements->tags = cJSON_PrintUnformatted(tagsJson);
|
||||||
|
if (elements->tags == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
elements->tagsLen = strlen(elements->tags);
|
elements->tagsLen = strlen(elements->tags);
|
||||||
if (is_same_child_table_telnet(elements, &info->preLine) != 0) {
|
if (is_same_child_table_telnet(elements, &info->preLine) != 0) {
|
||||||
ret = smlParseTagsFromJSON(info, tagsJson, elements);
|
ret = smlParseTagsFromJSON(info, tagsJson, elements);
|
||||||
|
@ -729,7 +745,8 @@ static int32_t smlParseJSONStringExt(SSmlHandle *info, cJSON *root, SSmlLineInfo
|
||||||
// notice!!! put ts back to tag to ensure get meta->precision
|
// notice!!! put ts back to tag to ensure get meta->precision
|
||||||
int64_t ts = smlParseTSFromJSON(info, tsJson);
|
int64_t ts = smlParseTSFromJSON(info, tsJson);
|
||||||
if (unlikely(ts < 0)) {
|
if (unlikely(ts < 0)) {
|
||||||
uError("OTD:0x%" PRIx64 " Unable to parse timestamp from JSON payload", info->id);
|
char* tmp = cJSON_PrintUnformatted(tsJson);
|
||||||
|
uError("OTD:0x%" PRIx64 " Unable to parse timestamp from JSON payload %s %s %" PRId64, info->id, info->msgBuf.buf,tmp, ts);
|
||||||
return TSDB_CODE_INVALID_TIMESTAMP;
|
return TSDB_CODE_INVALID_TIMESTAMP;
|
||||||
}
|
}
|
||||||
SSmlKv kvTs = {0};
|
SSmlKv kvTs = {0};
|
||||||
|
@ -823,7 +840,7 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(**start == '\0' && elements->measure == NULL)) return TSDB_CODE_SUCCESS;
|
if (unlikely(**start == '\0' && elements->measure == NULL)) return TSDB_CODE_SUCCESS;
|
||||||
|
@ -844,18 +861,23 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
|
||||||
cJSON *valueJson = cJSON_Parse(elements->cols);
|
cJSON *valueJson = cJSON_Parse(elements->cols);
|
||||||
if (unlikely(valueJson == NULL)) {
|
if (unlikely(valueJson == NULL)) {
|
||||||
uError("SML:0x%" PRIx64 " parse json cols failed:%s", info->id, elements->cols);
|
uError("SML:0x%" PRIx64 " parse json cols failed:%s", info->id, elements->cols);
|
||||||
|
elements->cols[elements->colsLen] = tmp;
|
||||||
return TSDB_CODE_TSC_INVALID_JSON;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
}
|
}
|
||||||
taosArrayPush(info->tagJsonArray, &valueJson);
|
if (taosArrayPush(info->tagJsonArray, &valueJson) == NULL){
|
||||||
|
cJSON_Delete(valueJson);
|
||||||
|
elements->cols[elements->colsLen] = tmp;
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
ret = smlParseValueFromJSONObj(valueJson, &kv);
|
ret = smlParseValueFromJSONObj(valueJson, &kv);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:Failed to parse value from JSON Obj:%s", elements->cols);
|
uError("SML:0x%" PRIx64 " Failed to parse value from JSON Obj:%s", info->id, elements->cols);
|
||||||
elements->cols[elements->colsLen] = tmp;
|
elements->cols[elements->colsLen] = tmp;
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
elements->cols[elements->colsLen] = tmp;
|
elements->cols[elements->colsLen] = tmp;
|
||||||
} else if (smlParseValue(&kv, &info->msgBuf) != TSDB_CODE_SUCCESS) {
|
} else if (smlParseValue(&kv, &info->msgBuf) != TSDB_CODE_SUCCESS) {
|
||||||
uError("SML:cols invalidate:%s", elements->cols);
|
uError("SML:0x%" PRIx64 " cols invalidate:%s", info->id, elements->cols);
|
||||||
return TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -870,7 +892,11 @@ static int32_t smlParseJSONString(SSmlHandle *info, char **start, SSmlLineInfo *
|
||||||
return TSDB_CODE_TSC_INVALID_JSON;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayPush(info->tagJsonArray, &tagsJson);
|
if (taosArrayPush(info->tagJsonArray, &tagsJson) == NULL){
|
||||||
|
cJSON_Delete(tagsJson);
|
||||||
|
uError("SML:0x%" PRIx64 " taosArrayPush failed", info->id);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
ret = smlParseTagsFromJSON(info, tagsJson, elements);
|
ret = smlParseTagsFromJSON(info, tagsJson, elements);
|
||||||
if (unlikely(ret)) {
|
if (unlikely(ret)) {
|
||||||
uError("OTD:0x%" PRIx64 " Unable to parse tags from JSON payload", info->id);
|
uError("OTD:0x%" PRIx64 " Unable to parse tags from JSON payload", info->id);
|
||||||
|
@ -937,7 +963,7 @@ int32_t smlParseJSON(SSmlHandle *info, char *payload) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
info->lines = (SSmlLineInfo *)tmp;
|
info->lines = (SSmlLineInfo *)tmp;
|
||||||
memset(info->lines + cnt, 0, (payloadNum - cnt) * sizeof(SSmlLineInfo));
|
(void)memset(info->lines + cnt, 0, (payloadNum - cnt) * sizeof(SSmlLineInfo));
|
||||||
}
|
}
|
||||||
ret = smlParseJSONString(info, &dataPointStart, info->lines + cnt);
|
ret = smlParseJSONString(info, &dataPointStart, info->lines + cnt);
|
||||||
if ((info->lines + cnt)->measure == NULL) break;
|
if ((info->lines + cnt)->measure == NULL) break;
|
||||||
|
|
|
@ -103,7 +103,10 @@ int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
char* tmp = taosMemoryCalloc(pVal->length, 1);
|
char* tmp = taosMemoryCalloc(pVal->length, 1);
|
||||||
memcpy(tmp, pVal->value + NCHAR_ADD_LEN - 1, pVal->length - NCHAR_ADD_LEN);
|
if (tmp == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(void)memcpy(tmp, pVal->value + NCHAR_ADD_LEN - 1, pVal->length - NCHAR_ADD_LEN);
|
||||||
code = doGeomFromText(tmp, (unsigned char **)&pVal->value, &pVal->length);
|
code = doGeomFromText(tmp, (unsigned char **)&pVal->value, &pVal->length);
|
||||||
taosMemoryFree(tmp);
|
taosMemoryFree(tmp);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -149,7 +152,7 @@ int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) {
|
||||||
if(data == NULL){
|
if(data == NULL){
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
memcpy(data, pVal->value + (NCHAR_ADD_LEN - 1), pVal->length);
|
(void)memcpy(data, pVal->value + (NCHAR_ADD_LEN - 1), pVal->length);
|
||||||
pVal->value = data;
|
pVal->value = data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -212,8 +215,7 @@ static int32_t smlProcessTagLine(SSmlHandle *info, char **sql, char *sqlEnd){
|
||||||
while (*sql < sqlEnd) {
|
while (*sql < sqlEnd) {
|
||||||
if (unlikely(IS_SPACE(*sql,escapeChar) || IS_COMMA(*sql,escapeChar))) {
|
if (unlikely(IS_SPACE(*sql,escapeChar) || IS_COMMA(*sql,escapeChar))) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql);
|
||||||
terrno = TSDB_CODE_SML_INVALID_DATA;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
if (unlikely(IS_EQUAL(*sql,escapeChar))) {
|
if (unlikely(IS_EQUAL(*sql,escapeChar))) {
|
||||||
keyLen = *sql - key;
|
keyLen = *sql - key;
|
||||||
|
@ -230,8 +232,7 @@ static int32_t smlProcessTagLine(SSmlHandle *info, char **sql, char *sqlEnd){
|
||||||
|
|
||||||
if (unlikely(IS_INVALID_COL_LEN(keyLen - keyLenEscaped))) {
|
if (unlikely(IS_INVALID_COL_LEN(keyLen - keyLenEscaped))) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid key or key is too long than 64", key);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid key or key is too long than 64", key);
|
||||||
terrno = TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
|
return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse value
|
// parse value
|
||||||
|
@ -245,8 +246,7 @@ static int32_t smlProcessTagLine(SSmlHandle *info, char **sql, char *sqlEnd){
|
||||||
break;
|
break;
|
||||||
} else if (unlikely(IS_EQUAL(*sql,escapeChar))) {
|
} else if (unlikely(IS_EQUAL(*sql,escapeChar))) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", *sql);
|
||||||
terrno = TSDB_CODE_SML_INVALID_DATA;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_SLASH_LETTER_IN_TAG_FIELD_KEY(*sql)) {
|
if (IS_SLASH_LETTER_IN_TAG_FIELD_KEY(*sql)) {
|
||||||
|
@ -261,24 +261,28 @@ static int32_t smlProcessTagLine(SSmlHandle *info, char **sql, char *sqlEnd){
|
||||||
|
|
||||||
if (unlikely(valueLen == 0)) {
|
if (unlikely(valueLen == 0)) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid value", value);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid value", value);
|
||||||
terrno = TSDB_CODE_SML_INVALID_DATA;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(valueLen - valueLenEscaped > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)) {
|
if (unlikely(valueLen - valueLenEscaped > (TSDB_MAX_NCHAR_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)) {
|
||||||
terrno = TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN;
|
return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (keyEscaped) {
|
if (keyEscaped) {
|
||||||
char *tmp = (char *)taosMemoryMalloc(keyLen);
|
char *tmp = (char *)taosMemoryMalloc(keyLen);
|
||||||
memcpy(tmp, key, keyLen);
|
if (tmp == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(void)memcpy(tmp, key, keyLen);
|
||||||
PROCESS_SLASH_IN_TAG_FIELD_KEY(tmp, keyLen);
|
PROCESS_SLASH_IN_TAG_FIELD_KEY(tmp, keyLen);
|
||||||
key = tmp;
|
key = tmp;
|
||||||
}
|
}
|
||||||
if (valueEscaped) {
|
if (valueEscaped) {
|
||||||
char *tmp = (char *)taosMemoryMalloc(valueLen);
|
char *tmp = (char *)taosMemoryMalloc(valueLen);
|
||||||
memcpy(tmp, value, valueLen);
|
if (tmp == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(void)memcpy(tmp, value, valueLen);
|
||||||
PROCESS_SLASH_IN_TAG_FIELD_KEY(tmp, valueLen);
|
PROCESS_SLASH_IN_TAG_FIELD_KEY(tmp, valueLen);
|
||||||
value = tmp;
|
value = tmp;
|
||||||
}
|
}
|
||||||
|
@ -289,11 +293,12 @@ static int32_t smlProcessTagLine(SSmlHandle *info, char **sql, char *sqlEnd){
|
||||||
.length = valueLen,
|
.length = valueLen,
|
||||||
.keyEscaped = keyEscaped,
|
.keyEscaped = keyEscaped,
|
||||||
.valueEscaped = valueEscaped};
|
.valueEscaped = valueEscaped};
|
||||||
taosArrayPush(preLineKV, &kv);
|
if(taosArrayPush(preLineKV, &kv) == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
if (info->dataFormat && !isSmlTagAligned(info, cnt, &kv)) {
|
if (info->dataFormat && !isSmlTagAligned(info, cnt, &kv)) {
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
return TSDB_CODE_TSC_INVALID_JSON;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt++;
|
cnt++;
|
||||||
|
@ -302,7 +307,7 @@ static int32_t smlProcessTagLine(SSmlHandle *info, char **sql, char *sqlEnd){
|
||||||
}
|
}
|
||||||
(*sql)++;
|
(*sql)++;
|
||||||
}
|
}
|
||||||
return 0;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlParseTagLine(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLineInfo *elements) {
|
static int32_t smlParseTagLine(SSmlHandle *info, char **sql, char *sqlEnd, SSmlLineInfo *elements) {
|
||||||
|
@ -315,13 +320,19 @@ static int32_t smlParseTagLine(SSmlHandle *info, char **sql, char *sqlEnd, SSmlL
|
||||||
if(info->dataFormat){
|
if(info->dataFormat){
|
||||||
ret = smlProcessSuperTable(info, elements);
|
ret = smlProcessSuperTable(info, elements);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
return terrno;
|
if(info->reRun){
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = smlProcessTagLine(info, sql, sqlEnd);
|
ret = smlProcessTagLine(info, sql, sqlEnd);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
return terrno;
|
if (info->reRun){
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
return smlProcessChildTable(info, elements);
|
return smlProcessChildTable(info, elements);
|
||||||
|
@ -410,7 +421,10 @@ static int32_t smlParseColLine(SSmlHandle *info, char **sql, char *sqlEnd, SSmlL
|
||||||
|
|
||||||
if (keyEscaped) {
|
if (keyEscaped) {
|
||||||
char *tmp = (char *)taosMemoryMalloc(kv.keyLen);
|
char *tmp = (char *)taosMemoryMalloc(kv.keyLen);
|
||||||
memcpy(tmp, key, kv.keyLen);
|
if (tmp == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(void)memcpy(tmp, key, kv.keyLen);
|
||||||
PROCESS_SLASH_IN_TAG_FIELD_KEY(tmp, kv.keyLen);
|
PROCESS_SLASH_IN_TAG_FIELD_KEY(tmp, kv.keyLen);
|
||||||
kv.key = tmp;
|
kv.key = tmp;
|
||||||
kv.keyEscaped = keyEscaped;
|
kv.keyEscaped = keyEscaped;
|
||||||
|
@ -418,7 +432,10 @@ static int32_t smlParseColLine(SSmlHandle *info, char **sql, char *sqlEnd, SSmlL
|
||||||
|
|
||||||
if (valueEscaped) {
|
if (valueEscaped) {
|
||||||
char *tmp = (char *)taosMemoryMalloc(kv.length);
|
char *tmp = (char *)taosMemoryMalloc(kv.length);
|
||||||
memcpy(tmp, kv.value, kv.length);
|
if (tmp == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
(void)memcpy(tmp, kv.value, kv.length);
|
||||||
PROCESS_SLASH_IN_FIELD_VALUE(tmp, kv.length);
|
PROCESS_SLASH_IN_FIELD_VALUE(tmp, kv.length);
|
||||||
ASSERT(kv.type != TSDB_DATA_TYPE_GEOMETRY);
|
ASSERT(kv.type != TSDB_DATA_TYPE_GEOMETRY);
|
||||||
if(kv.type == TSDB_DATA_TYPE_VARBINARY){
|
if(kv.type == TSDB_DATA_TYPE_VARBINARY){
|
||||||
|
@ -437,8 +454,13 @@ static int32_t smlParseColLine(SSmlHandle *info, char **sql, char *sqlEnd, SSmlL
|
||||||
} else {
|
} else {
|
||||||
if (currElement->colArray == NULL) {
|
if (currElement->colArray == NULL) {
|
||||||
currElement->colArray = taosArrayInit_s(sizeof(SSmlKv), 1);
|
currElement->colArray = taosArrayInit_s(sizeof(SSmlKv), 1);
|
||||||
|
if (currElement->colArray == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (taosArrayPush(currElement->colArray, &kv) == NULL){ // reserve for timestamp
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
taosArrayPush(currElement->colArray, &kv); // reserve for timestamp
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cnt++;
|
cnt++;
|
||||||
|
|
|
@ -84,8 +84,7 @@ static int32_t smlProcessTagTelnet(SSmlHandle *info, char *data, char *sqlEnd){
|
||||||
while (sql < sqlEnd) {
|
while (sql < sqlEnd) {
|
||||||
if (unlikely(*sql == SPACE)) {
|
if (unlikely(*sql == SPACE)) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", sql);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", sql);
|
||||||
terrno = TSDB_CODE_SML_INVALID_DATA;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
if (unlikely(*sql == EQUAL)) {
|
if (unlikely(*sql == EQUAL)) {
|
||||||
keyLen = sql - key;
|
keyLen = sql - key;
|
||||||
|
@ -97,8 +96,7 @@ static int32_t smlProcessTagTelnet(SSmlHandle *info, char *data, char *sqlEnd){
|
||||||
|
|
||||||
if (unlikely(IS_INVALID_COL_LEN(keyLen))) {
|
if (unlikely(IS_INVALID_COL_LEN(keyLen))) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid key or key is too long than 64", key);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid key or key is too long than 64", key);
|
||||||
terrno = TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
|
return TSDB_CODE_TSC_INVALID_COLUMN_LENGTH;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse value
|
// parse value
|
||||||
|
@ -111,8 +109,7 @@ static int32_t smlProcessTagTelnet(SSmlHandle *info, char *data, char *sqlEnd){
|
||||||
}
|
}
|
||||||
if (unlikely(*sql == EQUAL)) {
|
if (unlikely(*sql == EQUAL)) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", sql);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", sql);
|
||||||
terrno = TSDB_CODE_SML_INVALID_DATA;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
sql++;
|
sql++;
|
||||||
}
|
}
|
||||||
|
@ -120,13 +117,11 @@ static int32_t smlProcessTagTelnet(SSmlHandle *info, char *data, char *sqlEnd){
|
||||||
|
|
||||||
if (unlikely(valueLen == 0)) {
|
if (unlikely(valueLen == 0)) {
|
||||||
smlBuildInvalidDataMsg(&info->msgBuf, "invalid value", value);
|
smlBuildInvalidDataMsg(&info->msgBuf, "invalid value", value);
|
||||||
terrno = TSDB_CODE_TSC_INVALID_VALUE;
|
return TSDB_CODE_TSC_INVALID_VALUE;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely(valueLen > (TSDB_MAX_TAGS_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)) {
|
if (unlikely(valueLen > (TSDB_MAX_TAGS_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE)) {
|
||||||
terrno = TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN;
|
return TSDB_CODE_PAR_INVALID_VAR_COLUMN_LEN;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
SSmlKv kv = {.key = key,
|
SSmlKv kv = {.key = key,
|
||||||
|
@ -136,14 +131,15 @@ static int32_t smlProcessTagTelnet(SSmlHandle *info, char *data, char *sqlEnd){
|
||||||
.length = valueLen,
|
.length = valueLen,
|
||||||
.keyEscaped = false,
|
.keyEscaped = false,
|
||||||
.valueEscaped = false};
|
.valueEscaped = false};
|
||||||
taosArrayPush(preLineKV, &kv);
|
if (taosArrayPush(preLineKV, &kv) == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
if (info->dataFormat && !isSmlTagAligned(info, cnt, &kv)) {
|
if (info->dataFormat && !isSmlTagAligned(info, cnt, &kv)) {
|
||||||
terrno = TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
return -1;
|
|
||||||
}
|
}
|
||||||
cnt++;
|
cnt++;
|
||||||
}
|
}
|
||||||
return 0;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t smlParseTelnetTags(SSmlHandle *info, char *data, char *sqlEnd, SSmlLineInfo *elements) {
|
static int32_t smlParseTelnetTags(SSmlHandle *info, char *data, char *sqlEnd, SSmlLineInfo *elements) {
|
||||||
|
@ -156,13 +152,19 @@ static int32_t smlParseTelnetTags(SSmlHandle *info, char *data, char *sqlEnd, SS
|
||||||
if(info->dataFormat){
|
if(info->dataFormat){
|
||||||
ret = smlProcessSuperTable(info, elements);
|
ret = smlProcessSuperTable(info, elements);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
return terrno;
|
if(info->reRun){
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = smlProcessTagTelnet(info, data, sqlEnd);
|
ret = smlProcessTagTelnet(info, data, sqlEnd);
|
||||||
if(ret != 0){
|
if(ret != 0){
|
||||||
return terrno;
|
if (info->reRun){
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = smlJoinMeasureTag(elements);
|
ret = smlJoinMeasureTag(elements);
|
||||||
|
|
|
@ -40,13 +40,16 @@ TEST(testCase, smlParseInfluxString_Test) {
|
||||||
msgBuf.len = 256;
|
msgBuf.len = 256;
|
||||||
SSmlLineInfo elements = {0};
|
SSmlLineInfo elements = {0};
|
||||||
|
|
||||||
SSmlHandle *info = smlBuildSmlInfo(NULL);
|
SSmlHandle *info = nullptr;
|
||||||
|
int32_t code = smlBuildSmlInfo(nullptr, &info);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
info->protocol = TSDB_SML_LINE_PROTOCOL;
|
info->protocol = TSDB_SML_LINE_PROTOCOL;
|
||||||
info->dataFormat = false;
|
info->dataFormat = false;
|
||||||
// case 1
|
// case 1
|
||||||
char *tmp = "\\,st,t1=3,t2=4,t3=t3 c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000 ,32,c=3";
|
char *tmp = "\\,st,t1=3,t2=4,t3=t3 c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000 ,32,c=3";
|
||||||
char *sql = (char *)taosMemoryCalloc(256, 1);
|
char *sql = (char *)taosMemoryCalloc(256, 1);
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
ASSERT_NE(sql, nullptr);
|
||||||
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
int ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
int ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(elements.measure, sql);
|
ASSERT_EQ(elements.measure, sql);
|
||||||
|
@ -62,22 +65,22 @@ TEST(testCase, smlParseInfluxString_Test) {
|
||||||
|
|
||||||
ASSERT_EQ(elements.timestamp, sql + elements.measureTagsLen + 1 + elements.colsLen + 1);
|
ASSERT_EQ(elements.timestamp, sql + elements.measureTagsLen + 1 + elements.colsLen + 1);
|
||||||
ASSERT_EQ(elements.timestampLen, strlen("1626006833639000000"));
|
ASSERT_EQ(elements.timestampLen, strlen("1626006833639000000"));
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
|
|
||||||
// case 2 false
|
// case 2 false
|
||||||
tmp = "st,t1=3,t2=4,t3=t3 c1=3i64,c3=\"passit hello,c1=2,c2=false,c4=4f64 1626006833639000000";
|
tmp = "st,t1=3,t2=4,t3=t3 c1=3i64,c3=\"passit hello,c1=2,c2=false,c4=4f64 1626006833639000000";
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
memset(&elements, 0, sizeof(SSmlLineInfo));
|
(void)memset(&elements, 0, sizeof(SSmlLineInfo));
|
||||||
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_NE(ret, 0);
|
ASSERT_NE(ret, 0);
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
|
|
||||||
// case 4 tag is null
|
// case 4 tag is null
|
||||||
tmp = "st, c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000";
|
tmp = "st, c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000";
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
memset(&elements, 0, sizeof(SSmlLineInfo));
|
(void)memset(&elements, 0, sizeof(SSmlLineInfo));
|
||||||
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(elements.measure, sql);
|
ASSERT_EQ(elements.measure, sql);
|
||||||
|
@ -92,13 +95,13 @@ TEST(testCase, smlParseInfluxString_Test) {
|
||||||
|
|
||||||
ASSERT_EQ(elements.timestamp, sql + elements.measureTagsLen + 1 + elements.colsLen + 1);
|
ASSERT_EQ(elements.timestamp, sql + elements.measureTagsLen + 1 + elements.colsLen + 1);
|
||||||
ASSERT_EQ(elements.timestampLen, strlen("1626006833639000000"));
|
ASSERT_EQ(elements.timestampLen, strlen("1626006833639000000"));
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
|
|
||||||
// case 5 tag is null
|
// case 5 tag is null
|
||||||
tmp = " st c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000 ";
|
tmp = " st c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000 ";
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
memset(&elements, 0, sizeof(SSmlLineInfo));
|
(void)memset(&elements, 0, sizeof(SSmlLineInfo));
|
||||||
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
ASSERT_EQ(elements.measure, sql + 1);
|
ASSERT_EQ(elements.measure, sql + 1);
|
||||||
|
@ -112,36 +115,36 @@ TEST(testCase, smlParseInfluxString_Test) {
|
||||||
|
|
||||||
ASSERT_EQ(elements.timestamp, sql + 1 + elements.measureTagsLen + 3 + elements.colsLen + 2);
|
ASSERT_EQ(elements.timestamp, sql + 1 + elements.measureTagsLen + 3 + elements.colsLen + 2);
|
||||||
ASSERT_EQ(elements.timestampLen, strlen("1626006833639000000"));
|
ASSERT_EQ(elements.timestampLen, strlen("1626006833639000000"));
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
|
|
||||||
// case 6
|
// case 6
|
||||||
tmp = " st c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 ";
|
tmp = " st c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 ";
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
memset(&elements, 0, sizeof(SSmlLineInfo));
|
(void)memset(&elements, 0, sizeof(SSmlLineInfo));
|
||||||
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_EQ(ret, 0);
|
ASSERT_EQ(ret, 0);
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
smlClearForRerun(info);
|
ASSERT_EQ(smlClearForRerun(info), 0);
|
||||||
|
|
||||||
// case 7
|
// case 7
|
||||||
tmp = " st , ";
|
tmp = " st , ";
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
memset(&elements, 0, sizeof(SSmlLineInfo));
|
(void)memset(&elements, 0, sizeof(SSmlLineInfo));
|
||||||
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_NE(ret, 0);
|
ASSERT_NE(ret, 0);
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
|
|
||||||
// case 8 false
|
// case 8 false
|
||||||
tmp = ", st , ";
|
tmp = ", st , ";
|
||||||
memcpy(sql, tmp, strlen(tmp) + 1);
|
(void)memcpy(sql, tmp, strlen(tmp) + 1);
|
||||||
memset(&elements, 0, sizeof(SSmlLineInfo));
|
(void)memset(&elements, 0, sizeof(SSmlLineInfo));
|
||||||
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
ret = smlParseInfluxString(info, sql, sql + strlen(sql), &elements);
|
||||||
ASSERT_NE(ret, 0);
|
ASSERT_NE(ret, 0);
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
elements.colArray = NULL;
|
elements.colArray = nullptr;
|
||||||
|
|
||||||
taosMemoryFree(sql);
|
taosMemoryFree(sql);
|
||||||
smlDestroyInfo(info);
|
smlDestroyInfo(info);
|
||||||
|
@ -228,7 +231,9 @@ TEST(testCase, smlParseCols_Error_Test) {
|
||||||
"escape_test,tag1=\"tag1_value\",tag2=\"tag2_value\" col0=\"co\"l\"0_value\",col1=\"col1_value\" 1680918783010000000"
|
"escape_test,tag1=\"tag1_value\",tag2=\"tag2_value\" col0=\"co\"l\"0_value\",col1=\"col1_value\" 1680918783010000000"
|
||||||
};
|
};
|
||||||
|
|
||||||
SSmlHandle *info = smlBuildSmlInfo(NULL);
|
SSmlHandle *info = nullptr;
|
||||||
|
int32_t code = smlBuildSmlInfo(nullptr, &info);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
info->protocol = TSDB_SML_LINE_PROTOCOL;
|
info->protocol = TSDB_SML_LINE_PROTOCOL;
|
||||||
info->dataFormat = false;
|
info->dataFormat = false;
|
||||||
for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
|
for (int i = 0; i < sizeof(data) / sizeof(data[0]); i++) {
|
||||||
|
@ -238,13 +243,14 @@ TEST(testCase, smlParseCols_Error_Test) {
|
||||||
msgBuf.len = 256;
|
msgBuf.len = 256;
|
||||||
int32_t len = strlen(data[i]);
|
int32_t len = strlen(data[i]);
|
||||||
char *sql = (char *)taosMemoryCalloc(256, 1);
|
char *sql = (char *)taosMemoryCalloc(256, 1);
|
||||||
memcpy(sql, data[i], len + 1);
|
ASSERT_NE(sql, nullptr);
|
||||||
|
(void)memcpy(sql, data[i], len + 1);
|
||||||
SSmlLineInfo elements = {0};
|
SSmlLineInfo elements = {0};
|
||||||
int32_t ret = smlParseInfluxString(info, sql, sql + len, &elements);
|
int32_t ret = smlParseInfluxString(info, sql, sql + len, &elements);
|
||||||
// printf("i:%d\n", i);
|
// printf("i:%d\n", i);
|
||||||
ASSERT_NE(ret, TSDB_CODE_SUCCESS);
|
ASSERT_NE(ret, TSDB_CODE_SUCCESS);
|
||||||
taosMemoryFree(sql);
|
taosMemoryFree(sql);
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
}
|
}
|
||||||
smlDestroyInfo(info);
|
smlDestroyInfo(info);
|
||||||
}
|
}
|
||||||
|
@ -254,7 +260,9 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
SSmlMsgBuf msgBuf;
|
SSmlMsgBuf msgBuf;
|
||||||
msgBuf.buf = msg;
|
msgBuf.buf = msg;
|
||||||
msgBuf.len = 256;
|
msgBuf.len = 256;
|
||||||
SSmlHandle *info = smlBuildSmlInfo(NULL);
|
SSmlHandle *info = nullptr;
|
||||||
|
int32_t code = smlBuildSmlInfo(nullptr, &info);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
info->protocol = TSDB_SML_LINE_PROTOCOL;
|
info->protocol = TSDB_SML_LINE_PROTOCOL;
|
||||||
info->dataFormat = false;
|
info->dataFormat = false;
|
||||||
SSmlLineInfo elements = {0};
|
SSmlLineInfo elements = {0};
|
||||||
|
@ -267,7 +275,8 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
"cboolf=f,cnch_=l\"iuwq\" 1626006833639000000";
|
"cboolf=f,cnch_=l\"iuwq\" 1626006833639000000";
|
||||||
int32_t len = strlen(data);
|
int32_t len = strlen(data);
|
||||||
char *sql = (char *)taosMemoryCalloc(1024, 1);
|
char *sql = (char *)taosMemoryCalloc(1024, 1);
|
||||||
memcpy(sql, data, len + 1);
|
ASSERT_NE(sql, nullptr);
|
||||||
|
(void)memcpy(sql, data, len + 1);
|
||||||
int32_t ret = smlParseInfluxString(info, sql, sql + len, &elements);
|
int32_t ret = smlParseInfluxString(info, sql, sql + len, &elements);
|
||||||
ASSERT_EQ(ret, TSDB_CODE_SUCCESS);
|
ASSERT_EQ(ret, TSDB_CODE_SUCCESS);
|
||||||
int32_t size = taosArrayGetSize(elements.colArray);
|
int32_t size = taosArrayGetSize(elements.colArray);
|
||||||
|
@ -275,6 +284,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// binary
|
// binary
|
||||||
SSmlKv *kv = (SSmlKv *)taosArrayGet(elements.colArray, 1);
|
SSmlKv *kv = (SSmlKv *)taosArrayGet(elements.colArray, 1);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cb=in", 5), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cb=in", 5), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 5);
|
ASSERT_EQ(kv->keyLen, 5);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BINARY);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BINARY);
|
||||||
|
@ -285,6 +295,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// nchar
|
// nchar
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 2);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 2);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cnch", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cnch", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_NCHAR);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_NCHAR);
|
||||||
|
@ -293,6 +304,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// bool
|
// bool
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 3);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 3);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cbool", 5), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cbool", 5), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 5);
|
ASSERT_EQ(kv->keyLen, 5);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
@ -301,6 +313,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// double
|
// double
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 4);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 4);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cf64", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cf64", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_DOUBLE);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_DOUBLE);
|
||||||
|
@ -310,6 +323,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// float
|
// float
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 5);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 5);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cf64_", 5), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cf64_", 5), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 5);
|
ASSERT_EQ(kv->keyLen, 5);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_DOUBLE);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_DOUBLE);
|
||||||
|
@ -319,6 +333,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// float
|
// float
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 6);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 6);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cf32", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cf32", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_FLOAT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_FLOAT);
|
||||||
|
@ -328,6 +343,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// tiny int
|
// tiny int
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 7);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 7);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "ci8", 3), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "ci8", 3), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 3);
|
ASSERT_EQ(kv->keyLen, 3);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_TINYINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_TINYINT);
|
||||||
|
@ -336,6 +352,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// unsigned tiny int
|
// unsigned tiny int
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 8);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 8);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cu8", 3), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cu8", 3), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 3);
|
ASSERT_EQ(kv->keyLen, 3);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_UTINYINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_UTINYINT);
|
||||||
|
@ -344,6 +361,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// small int
|
// small int
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 9);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 9);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "ci16", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "ci16", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_SMALLINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_SMALLINT);
|
||||||
|
@ -352,6 +370,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// unsigned smallint
|
// unsigned smallint
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 10);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 10);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cu16", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cu16", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_USMALLINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_USMALLINT);
|
||||||
|
@ -360,6 +379,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// int
|
// int
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 11);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 11);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "ci32", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "ci32", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_INT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_INT);
|
||||||
|
@ -368,6 +388,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// unsigned int
|
// unsigned int
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 12);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 12);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cu32", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cu32", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_UINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_UINT);
|
||||||
|
@ -376,6 +397,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// bigint
|
// bigint
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 13);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 13);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "ci64", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "ci64", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BIGINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
@ -384,6 +406,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// bigint
|
// bigint
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 14);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 14);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "ci", 2), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "ci", 2), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 2);
|
ASSERT_EQ(kv->keyLen, 2);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BIGINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BIGINT);
|
||||||
|
@ -392,6 +415,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// unsigned bigint
|
// unsigned bigint
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 15);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 15);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cu64", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cu64", 4), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 4);
|
ASSERT_EQ(kv->keyLen, 4);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_UBIGINT);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_UBIGINT);
|
||||||
|
@ -400,6 +424,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// bool
|
// bool
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 16);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 16);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cbooltrue", 9), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cbooltrue", 9), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 9);
|
ASSERT_EQ(kv->keyLen, 9);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
@ -408,6 +433,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// bool
|
// bool
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 17);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 17);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cboolt", 6), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cboolt", 6), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 6);
|
ASSERT_EQ(kv->keyLen, 6);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
@ -416,6 +442,7 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// bool
|
// bool
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 18);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 18);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cboolf", 6), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cboolf", 6), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 6);
|
ASSERT_EQ(kv->keyLen, 6);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_BOOL);
|
||||||
|
@ -424,13 +451,14 @@ TEST(testCase, smlParseCols_Test) {
|
||||||
|
|
||||||
// nchar
|
// nchar
|
||||||
kv = (SSmlKv *)taosArrayGet(elements.colArray, 19);
|
kv = (SSmlKv *)taosArrayGet(elements.colArray, 19);
|
||||||
|
ASSERT_NE(kv, nullptr);
|
||||||
ASSERT_EQ(strncasecmp(kv->key, "cnch_", 5), 0);
|
ASSERT_EQ(strncasecmp(kv->key, "cnch_", 5), 0);
|
||||||
ASSERT_EQ(kv->keyLen, 5);
|
ASSERT_EQ(kv->keyLen, 5);
|
||||||
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_NCHAR);
|
ASSERT_EQ(kv->type, TSDB_DATA_TYPE_NCHAR);
|
||||||
ASSERT_EQ(kv->length, 4);
|
ASSERT_EQ(kv->length, 4);
|
||||||
ASSERT_EQ(strncasecmp(kv->value, "iuwq", 4), 0);
|
ASSERT_EQ(strncasecmp(kv->value, "iuwq", 4), 0);
|
||||||
|
|
||||||
taosArrayDestroy(elements.colArray);
|
(void)taosArrayDestroy(elements.colArray);
|
||||||
taosMemoryFree(sql);
|
taosMemoryFree(sql);
|
||||||
smlDestroyInfo(info);
|
smlDestroyInfo(info);
|
||||||
}
|
}
|
||||||
|
@ -471,7 +499,9 @@ TEST(testCase, smlParseNumber_Test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, smlParseTelnetLine_error_Test) {
|
TEST(testCase, smlParseTelnetLine_error_Test) {
|
||||||
SSmlHandle *info = smlBuildSmlInfo(NULL);
|
SSmlHandle *info = nullptr;
|
||||||
|
int32_t code = smlBuildSmlInfo(nullptr, &info);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
info->dataFormat = false;
|
info->dataFormat = false;
|
||||||
info->protocol = TSDB_SML_TELNET_PROTOCOL;
|
info->protocol = TSDB_SML_TELNET_PROTOCOL;
|
||||||
ASSERT_NE(info, nullptr);
|
ASSERT_NE(info, nullptr);
|
||||||
|
@ -509,7 +539,9 @@ TEST(testCase, smlParseTelnetLine_error_Test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST(testCase, smlParseTelnetLine_Test) {
|
TEST(testCase, smlParseTelnetLine_Test) {
|
||||||
SSmlHandle *info = smlBuildSmlInfo(NULL);
|
SSmlHandle *info = nullptr;
|
||||||
|
int32_t code = smlBuildSmlInfo(nullptr, &info);
|
||||||
|
ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
info->dataFormat = false;
|
info->dataFormat = false;
|
||||||
info->protocol = TSDB_SML_TELNET_PROTOCOL;
|
info->protocol = TSDB_SML_TELNET_PROTOCOL;
|
||||||
ASSERT_NE(info, nullptr);
|
ASSERT_NE(info, nullptr);
|
||||||
|
@ -528,7 +560,9 @@ TEST(testCase, smlParseTelnetLine_Test) {
|
||||||
}
|
}
|
||||||
|
|
||||||
//TEST(testCase, smlParseTelnetLine_diff_json_type2_Test) {
|
//TEST(testCase, smlParseTelnetLine_diff_json_type2_Test) {
|
||||||
// SSmlHandle *info = smlBuildSmlInfo(NULL);
|
// SSmlHandle *info = nullptr;
|
||||||
|
// int32_t code = smlBuildSmlInfo(nullptr, &info);
|
||||||
|
// ASSERT_EQ(code, TSDB_CODE_SUCCESS);
|
||||||
// info->protocol = TSDB_SML_JSON_PROTOCOL;
|
// info->protocol = TSDB_SML_JSON_PROTOCOL;
|
||||||
// ASSERT_NE(info, nullptr);
|
// ASSERT_NE(info, nullptr);
|
||||||
//
|
//
|
||||||
|
@ -568,7 +602,7 @@ TEST(testCase, smlParseNumber_performance_Test) {
|
||||||
for (int j = 0; j < 10000000; ++j) {
|
for (int j = 0; j < 10000000; ++j) {
|
||||||
kv.value = str[i];
|
kv.value = str[i];
|
||||||
kv.length = strlen(str[i]);
|
kv.length = strlen(str[i]);
|
||||||
smlParseNumber(&kv, &msgBuf);
|
(void)smlParseNumber(&kv, &msgBuf); //ignore result
|
||||||
}
|
}
|
||||||
printf("smlParseNumber:%s cost:%" PRId64, str[i], taosGetTimestampUs() - t1);
|
printf("smlParseNumber:%s cost:%" PRId64, str[i], taosGetTimestampUs() - t1);
|
||||||
printf("\n");
|
printf("\n");
|
||||||
|
@ -576,7 +610,7 @@ TEST(testCase, smlParseNumber_performance_Test) {
|
||||||
for (int j = 0; j < 10000000; ++j) {
|
for (int j = 0; j < 10000000; ++j) {
|
||||||
kv.value = str[i];
|
kv.value = str[i];
|
||||||
kv.length = strlen(str[i]);
|
kv.length = strlen(str[i]);
|
||||||
smlParseNumberOld(&kv, &msgBuf);
|
(void)smlParseNumberOld(&kv, &msgBuf); //ignore result
|
||||||
}
|
}
|
||||||
printf("smlParseNumberOld:%s cost:%" PRId64, str[i], taosGetTimestampUs() - t2);
|
printf("smlParseNumberOld:%s cost:%" PRId64, str[i], taosGetTimestampUs() - t2);
|
||||||
printf("\n\n");
|
printf("\n\n");
|
||||||
|
|
|
@ -615,6 +615,10 @@ int32_t blockDataUpdateTsWindow(SSDataBlock* pDataBlock, int32_t tsColumnIndex)
|
||||||
int32_t index = (tsColumnIndex == -1) ? 0 : tsColumnIndex;
|
int32_t index = (tsColumnIndex == -1) ? 0 : tsColumnIndex;
|
||||||
|
|
||||||
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, index);
|
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, index);
|
||||||
|
if (pColInfoData == NULL) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
if (pColInfoData->info.type != TSDB_DATA_TYPE_TIMESTAMP) {
|
if (pColInfoData->info.type != TSDB_DATA_TYPE_TIMESTAMP) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -2488,7 +2492,10 @@ int32_t buildCtbNameByGroupIdImpl(const char* stbFullName, uint64_t groupId, cha
|
||||||
RandTableName rname = {
|
RandTableName rname = {
|
||||||
.tags = tags, .stbFullName = stbFullName, .stbFullNameLen = strlen(stbFullName), .ctbShortName = cname};
|
.tags = tags, .stbFullName = stbFullName, .stbFullNameLen = strlen(stbFullName), .ctbShortName = cname};
|
||||||
|
|
||||||
buildChildTableName(&rname);
|
int32_t code = buildChildTableName(&rname);
|
||||||
|
if(code != TSDB_CODE_SUCCESS){
|
||||||
|
return code;
|
||||||
|
}
|
||||||
taosArrayDestroy(tags);
|
taosArrayDestroy(tags);
|
||||||
|
|
||||||
if ((rname.ctbShortName && rname.ctbShortName[0]) == 0) {
|
if ((rname.ctbShortName && rname.ctbShortName[0]) == 0) {
|
||||||
|
|
|
@ -305,11 +305,11 @@ static int32_t tRowBuildTupleRow(SArray *aColVal, const SRowBuildScanInfo *sinfo
|
||||||
*(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
|
*(int32_t *)(fixed + schema->columns[i].offset) = varlen - fixed - sinfo->tupleFixedSize;
|
||||||
varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
|
varlen += tPutU32v(varlen, colValArray[colValIndex].value.nData);
|
||||||
if (colValArray[colValIndex].value.nData) {
|
if (colValArray[colValIndex].value.nData) {
|
||||||
memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
|
(void)memcpy(varlen, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
|
||||||
varlen += colValArray[colValIndex].value.nData;
|
varlen += colValArray[colValIndex].value.nData;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(fixed + schema->columns[i].offset, &colValArray[colValIndex].value.val,
|
(void)memcpy(fixed + schema->columns[i].offset, &colValArray[colValIndex].value.val,
|
||||||
tDataTypes[schema->columns[i].type].bytes);
|
tDataTypes[schema->columns[i].type].bytes);
|
||||||
}
|
}
|
||||||
} else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) { // NULL
|
} else if (COL_VAL_IS_NULL(&colValArray[colValIndex])) { // NULL
|
||||||
|
@ -384,12 +384,12 @@ static int32_t tRowBuildKVRow(SArray *aColVal, const SRowBuildScanInfo *sinfo, c
|
||||||
payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
|
payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
|
||||||
payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
|
payloadSize += tPutU32v(payload + payloadSize, colValArray[colValIndex].value.nData);
|
||||||
if (colValArray[colValIndex].value.nData > 0) {
|
if (colValArray[colValIndex].value.nData > 0) {
|
||||||
memcpy(payload + payloadSize, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
|
(void)memcpy(payload + payloadSize, colValArray[colValIndex].value.pData, colValArray[colValIndex].value.nData);
|
||||||
}
|
}
|
||||||
payloadSize += colValArray[colValIndex].value.nData;
|
payloadSize += colValArray[colValIndex].value.nData;
|
||||||
} else {
|
} else {
|
||||||
payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
|
payloadSize += tPutI16v(payload + payloadSize, colValArray[colValIndex].cid);
|
||||||
memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
|
(void)memcpy(payload + payloadSize, &colValArray[colValIndex].value.val,
|
||||||
tDataTypes[schema->columns[i].type].bytes);
|
tDataTypes[schema->columns[i].type].bytes);
|
||||||
payloadSize += tDataTypes[schema->columns[i].type].bytes;
|
payloadSize += tDataTypes[schema->columns[i].type].bytes;
|
||||||
}
|
}
|
||||||
|
@ -475,7 +475,7 @@ int32_t tRowBuildFromBind(SBindInfo *infos, int32_t numOfInfos, bool infoSorted,
|
||||||
value.nData = infos[iInfo].bind->length[iRow];
|
value.nData = infos[iInfo].bind->length[iRow];
|
||||||
value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
|
value.pData = (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow;
|
||||||
} else {
|
} else {
|
||||||
memcpy(&value.val, (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
|
(void)memcpy(&value.val, (uint8_t *)infos[iInfo].bind->buffer + infos[iInfo].bind->buffer_length * iRow,
|
||||||
infos[iInfo].bind->buffer_length);
|
infos[iInfo].bind->buffer_length);
|
||||||
}
|
}
|
||||||
colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
|
colVal = COL_VAL_VALUE(infos[iInfo].columnId, value);
|
||||||
|
@ -509,7 +509,7 @@ int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal)
|
||||||
pColVal->cid = pTColumn->colId;
|
pColVal->cid = pTColumn->colId;
|
||||||
pColVal->value.type = pTColumn->type;
|
pColVal->value.type = pTColumn->type;
|
||||||
pColVal->flag = CV_FLAG_VALUE;
|
pColVal->flag = CV_FLAG_VALUE;
|
||||||
memcpy(&pColVal->value.val, &pRow->ts, sizeof(TSKEY));
|
(void)memcpy(&pColVal->value.val, &pRow->ts, sizeof(TSKEY));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -573,7 +573,7 @@ int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal)
|
||||||
pColVal->value.pData = NULL;
|
pColVal->value.pData = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pColVal->value.val, pData, pTColumn->bytes);
|
(void)memcpy(&pColVal->value.val, pData, pTColumn->bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -624,7 +624,7 @@ int32_t tRowGet(SRow *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal)
|
||||||
pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
|
pColVal->value.pData = varlen + *(int32_t *)(fixed + pTColumn->offset);
|
||||||
pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
|
pColVal->value.pData += tGetU32v(pColVal->value.pData, &pColVal->value.nData);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pColVal->value.val, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
|
(void)memcpy(&pColVal->value.val, fixed + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -861,7 +861,7 @@ SColVal *tRowIterNext(SRowIter *pIter) {
|
||||||
pIter->cv.cid = pTColumn->colId;
|
pIter->cv.cid = pTColumn->colId;
|
||||||
pIter->cv.value.type = pTColumn->type;
|
pIter->cv.value.type = pTColumn->type;
|
||||||
pIter->cv.flag = CV_FLAG_VALUE;
|
pIter->cv.flag = CV_FLAG_VALUE;
|
||||||
memcpy(&pIter->cv.value.val, &pIter->pRow->ts, sizeof(TSKEY));
|
(void)memcpy(&pIter->cv.value.val, &pIter->pRow->ts, sizeof(TSKEY));
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -906,7 +906,7 @@ SColVal *tRowIterNext(SRowIter *pIter) {
|
||||||
pIter->cv.value.pData = NULL;
|
pIter->cv.value.pData = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pIter->cv.value.val, pData, pTColumn->bytes);
|
(void)memcpy(&pIter->cv.value.val, pData, pTColumn->bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -965,7 +965,7 @@ SColVal *tRowIterNext(SRowIter *pIter) {
|
||||||
pIter->cv.value.pData = NULL;
|
pIter->cv.value.pData = NULL;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pIter->cv.value.val, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
|
(void)memcpy(&pIter->cv.value.val, pIter->pf + pTColumn->offset, TYPE_BYTES[pTColumn->type]);
|
||||||
}
|
}
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
@ -1288,7 +1288,7 @@ void tRowGetPrimaryKey(SRow *row, SRowKey *key) {
|
||||||
key->pks[i].pData = tdata;
|
key->pks[i].pData = tdata;
|
||||||
key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
|
key->pks[i].pData += tGetU32v(key->pks[i].pData, &key->pks[i].nData);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&key->pks[i].val, tdata, tDataTypes[indices[i].type].bytes);
|
(void)memcpy(&key->pks[i].val, tdata, tDataTypes[indices[i].type].bytes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1378,7 +1378,7 @@ FORCE_INLINE int32_t tRowKeyCompare(const SRowKey *key1, const SRowKey *key2) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
|
void tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
|
||||||
pDst->ts = pSrc->ts;
|
pDst->ts = pSrc->ts;
|
||||||
pDst->numOfPKs = pSrc->numOfPKs;
|
pDst->numOfPKs = pSrc->numOfPKs;
|
||||||
|
|
||||||
|
@ -1392,12 +1392,10 @@ int32_t tRowKeyAssign(SRowKey *pDst, SRowKey *pSrc) {
|
||||||
} else {
|
} else {
|
||||||
pVal->nData = pSrc->pks[i].nData;
|
pVal->nData = pSrc->pks[i].nData;
|
||||||
ASSERT(pSrc->pks[i].pData != NULL);
|
ASSERT(pSrc->pks[i].pData != NULL);
|
||||||
memcpy(pVal->pData, pSrc->pks[i].pData, pVal->nData);
|
(void)memcpy(pVal->pData, pSrc->pks[i].pData, pVal->nData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// STag ========================================
|
// STag ========================================
|
||||||
|
@ -1528,7 +1526,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) (void)memcpy(p, &(pTagVal->i64), tDataTypes[pTagVal->type].bytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
return n;
|
return n;
|
||||||
|
@ -1550,7 +1548,7 @@ static int32_t tGetTagVal(uint8_t *p, STagVal *pTagVal, int8_t isJson) {
|
||||||
if (IS_VAR_DATA_TYPE(pTagVal->type)) {
|
if (IS_VAR_DATA_TYPE(pTagVal->type)) {
|
||||||
n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
|
n += tGetBinary(p + n, &pTagVal->pData, &pTagVal->nData);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
|
(void)memcpy(&(pTagVal->i64), p + n, tDataTypes[pTagVal->type].bytes);
|
||||||
n += tDataTypes[pTagVal->type].bytes;
|
n += tDataTypes[pTagVal->type].bytes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1661,7 +1659,7 @@ char *tTagValToData(const STagVal *value, bool isJson) {
|
||||||
}
|
}
|
||||||
|
|
||||||
varDataLen(data + typeBytes) = value->nData;
|
varDataLen(data + typeBytes) = value->nData;
|
||||||
memcpy(varDataVal(data + typeBytes), value->pData, value->nData);
|
(void)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
|
||||||
}
|
}
|
||||||
|
@ -1713,7 +1711,7 @@ bool tTagGet(const STag *pTag, STagVal *pTagVal) {
|
||||||
} else if (c > 0) {
|
} else if (c > 0) {
|
||||||
lidx = midx + 1;
|
lidx = midx + 1;
|
||||||
} else {
|
} else {
|
||||||
memcpy(pTagVal, &tv, sizeof(tv));
|
(void)memcpy(pTagVal, &tv, sizeof(tv));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1892,7 +1890,7 @@ static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData,
|
||||||
if (nData) {
|
if (nData) {
|
||||||
code = tRealloc(&pColData->pData, pColData->nData + nData);
|
code = tRealloc(&pColData->pData, pColData->nData + nData);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
memcpy(pColData->pData + pColData->nData, pData, nData);
|
(void)memcpy(pColData->pData + pColData->nData, pData, nData);
|
||||||
pColData->nData += nData;
|
pColData->nData += nData;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -1900,7 +1898,7 @@ static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, uint8_t *pData,
|
||||||
code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
|
code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
if (pData) {
|
if (pData) {
|
||||||
memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
|
(void)memcpy(pColData->pData + pColData->nData, pData, TYPE_BYTES[pColData->type]);
|
||||||
} else {
|
} else {
|
||||||
memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
|
memset(pColData->pData + pColData->nData, 0, TYPE_BYTES[pColData->type]);
|
||||||
}
|
}
|
||||||
|
@ -2594,7 +2592,7 @@ static FORCE_INLINE void tColDataGetValue4(SColData *pColData, int32_t iVal, SCo
|
||||||
}
|
}
|
||||||
value.pData = pColData->pData + pColData->aOffset[iVal];
|
value.pData = pColData->pData + pColData->aOffset[iVal];
|
||||||
} else {
|
} else {
|
||||||
memcpy(&value.val, pColData->pData + tDataTypes[pColData->type].bytes * iVal, tDataTypes[pColData->type].bytes);
|
(void)memcpy(&value.val, pColData->pData + tDataTypes[pColData->type].bytes * iVal, tDataTypes[pColData->type].bytes);
|
||||||
}
|
}
|
||||||
*pColVal = COL_VAL_VALUE(pColData->cid, value);
|
*pColVal = COL_VAL_VALUE(pColData->cid, value);
|
||||||
}
|
}
|
||||||
|
@ -2692,7 +2690,7 @@ int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMall
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
|
(void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT1_SIZE(pColData->nVal));
|
||||||
break;
|
break;
|
||||||
case (HAS_VALUE | HAS_NULL | HAS_NONE):
|
case (HAS_VALUE | HAS_NULL | HAS_NONE):
|
||||||
pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
|
pColData->pBitMap = xMalloc(arg, BIT2_SIZE(pColData->nVal));
|
||||||
|
@ -2700,7 +2698,7 @@ int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMall
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
|
(void)memcpy(pColData->pBitMap, pColDataFrom->pBitMap, BIT2_SIZE(pColData->nVal));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
pColData->pBitMap = NULL;
|
pColData->pBitMap = NULL;
|
||||||
|
@ -2714,7 +2712,7 @@ int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMall
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
|
(void)memcpy(pColData->aOffset, pColDataFrom->aOffset, pColData->nVal << 2);
|
||||||
} else {
|
} else {
|
||||||
pColData->aOffset = NULL;
|
pColData->aOffset = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2727,7 +2725,7 @@ int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMall
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
|
(void)memcpy(pColData->pData, pColDataFrom->pData, pColData->nData);
|
||||||
} else {
|
} else {
|
||||||
pColData->pData = NULL;
|
pColData->pData = NULL;
|
||||||
}
|
}
|
||||||
|
@ -3119,10 +3117,10 @@ static int32_t tColDataCopyRowCell(SColData *pFromColData, int32_t iFromRow, SCo
|
||||||
pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
|
pToColData->aOffset[iToRow + 1] = pToColData->aOffset[iToRow] + nData;
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
|
(void)memcpy(pToColData->pData + pToColData->aOffset[iToRow], pFromColData->pData + pFromColData->aOffset[iFromRow],
|
||||||
nData);
|
nData);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
|
(void)memcpy(&pToColData->pData[TYPE_BYTES[pToColData->type] * iToRow],
|
||||||
&pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
|
&pFromColData->pData[TYPE_BYTES[pToColData->type] * iFromRow], TYPE_BYTES[pToColData->type]);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
|
@ -3361,7 +3359,7 @@ static void tColDataMergeImpl(SColData *pColData, int32_t iStart, int32_t iEnd /
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
} else {
|
} else {
|
||||||
if (iv != iStart) {
|
if (iv != iStart) {
|
||||||
memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * iStart],
|
(void)memcpy(&pColData->pData[TYPE_BYTES[pColData->type] * iStart],
|
||||||
&pColData->pData[TYPE_BYTES[pColData->type] * iv], TYPE_BYTES[pColData->type]);
|
&pColData->pData[TYPE_BYTES[pColData->type] * iv], TYPE_BYTES[pColData->type]);
|
||||||
}
|
}
|
||||||
memmove(&pColData->pData[TYPE_BYTES[pColData->type] * (iStart + 1)],
|
memmove(&pColData->pData[TYPE_BYTES[pColData->type] * (iStart + 1)],
|
||||||
|
@ -3579,11 +3577,11 @@ static int32_t tPutColDataVersion0(uint8_t *pBuf, SColData *pColData) {
|
||||||
case (HAS_NULL | HAS_NONE):
|
case (HAS_NULL | HAS_NONE):
|
||||||
case (HAS_VALUE | HAS_NONE):
|
case (HAS_VALUE | HAS_NONE):
|
||||||
case (HAS_VALUE | HAS_NULL):
|
case (HAS_VALUE | HAS_NULL):
|
||||||
if (pBuf) memcpy(pBuf + n, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
|
if (pBuf) (void)memcpy(pBuf + n, pColData->pBitMap, BIT1_SIZE(pColData->nVal));
|
||||||
n += BIT1_SIZE(pColData->nVal);
|
n += BIT1_SIZE(pColData->nVal);
|
||||||
break;
|
break;
|
||||||
case (HAS_VALUE | HAS_NULL | HAS_NONE):
|
case (HAS_VALUE | HAS_NULL | HAS_NONE):
|
||||||
if (pBuf) memcpy(pBuf + n, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
|
if (pBuf) (void)memcpy(pBuf + n, pColData->pBitMap, BIT2_SIZE(pColData->nVal));
|
||||||
n += BIT2_SIZE(pColData->nVal);
|
n += BIT2_SIZE(pColData->nVal);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -3593,14 +3591,14 @@ static int32_t tPutColDataVersion0(uint8_t *pBuf, SColData *pColData) {
|
||||||
// value
|
// value
|
||||||
if (pColData->flag & HAS_VALUE) {
|
if (pColData->flag & HAS_VALUE) {
|
||||||
if (IS_VAR_DATA_TYPE(pColData->type)) {
|
if (IS_VAR_DATA_TYPE(pColData->type)) {
|
||||||
if (pBuf) memcpy(pBuf + n, pColData->aOffset, pColData->nVal << 2);
|
if (pBuf) (void)memcpy(pBuf + n, pColData->aOffset, pColData->nVal << 2);
|
||||||
n += (pColData->nVal << 2);
|
n += (pColData->nVal << 2);
|
||||||
|
|
||||||
n += tPutI32v(pBuf ? pBuf + n : NULL, pColData->nData);
|
n += tPutI32v(pBuf ? pBuf + n : NULL, pColData->nData);
|
||||||
if (pBuf) memcpy(pBuf + n, pColData->pData, pColData->nData);
|
if (pBuf) (void)memcpy(pBuf + n, pColData->pData, pColData->nData);
|
||||||
n += pColData->nData;
|
n += pColData->nData;
|
||||||
} else {
|
} else {
|
||||||
if (pBuf) memcpy(pBuf + n, pColData->pData, pColData->nData);
|
if (pBuf) (void)memcpy(pBuf + n, pColData->pData, pColData->nData);
|
||||||
n += pColData->nData;
|
n += pColData->nData;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4348,7 +4346,7 @@ int32_t tCompressData(void *input, // input
|
||||||
ASSERT(outputSize >= extraSizeNeeded);
|
ASSERT(outputSize >= extraSizeNeeded);
|
||||||
|
|
||||||
if (info->cmprAlg == NO_COMPRESSION) {
|
if (info->cmprAlg == NO_COMPRESSION) {
|
||||||
memcpy(output, input, info->originalSize);
|
(void)memcpy(output, input, info->originalSize);
|
||||||
info->compressedSize = info->originalSize;
|
info->compressedSize = info->originalSize;
|
||||||
} else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
|
} else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
|
||||||
SBuffer local;
|
SBuffer local;
|
||||||
|
@ -4385,7 +4383,7 @@ int32_t tCompressData(void *input, // input
|
||||||
} else {
|
} else {
|
||||||
DEFINE_VAR(info->cmprAlg)
|
DEFINE_VAR(info->cmprAlg)
|
||||||
if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
|
if ((l1 == L1_UNKNOWN && l2 == L2_UNKNOWN) || (l1 == L1_DISABLED && l2 == L2_DISABLED)) {
|
||||||
memcpy(output, input, info->originalSize);
|
(void)memcpy(output, input, info->originalSize);
|
||||||
info->compressedSize = info->originalSize;
|
info->compressedSize = info->originalSize;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -4431,7 +4429,7 @@ int32_t tDecompressData(void *input, // input
|
||||||
|
|
||||||
if (info->cmprAlg == NO_COMPRESSION) {
|
if (info->cmprAlg == NO_COMPRESSION) {
|
||||||
ASSERT(info->compressedSize == info->originalSize);
|
ASSERT(info->compressedSize == info->originalSize);
|
||||||
memcpy(output, input, info->compressedSize);
|
(void)memcpy(output, input, info->compressedSize);
|
||||||
} else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
|
} else if (info->cmprAlg == ONE_STAGE_COMP || info->cmprAlg == TWO_STAGE_COMP) {
|
||||||
SBuffer local;
|
SBuffer local;
|
||||||
|
|
||||||
|
@ -4468,7 +4466,7 @@ int32_t tDecompressData(void *input, // input
|
||||||
} else {
|
} else {
|
||||||
DEFINE_VAR(info->cmprAlg);
|
DEFINE_VAR(info->cmprAlg);
|
||||||
if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
|
if (l1 == L1_DISABLED && l2 == L2_DISABLED) {
|
||||||
memcpy(output, input, info->compressedSize);
|
(void)memcpy(output, input, info->compressedSize);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
SBuffer local;
|
SBuffer local;
|
||||||
|
|
|
@ -504,7 +504,7 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
||||||
if (cfgAddString(pCfg, "secondEp", "", CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddString(pCfg, "secondEp", "", CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "fqdn", defaultFqdn, CFG_SCOPE_SERVER, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddString(pCfg, "fqdn", defaultFqdn, CFG_SCOPE_SERVER, CFG_DYN_CLIENT) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "serverPort", defaultServerPort, 1, 65056, CFG_SCOPE_SERVER, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddInt32(pCfg, "serverPort", defaultServerPort, 1, 65056, CFG_SCOPE_SERVER, CFG_DYN_CLIENT) != 0) return -1;
|
||||||
if (cfgAddDir(pCfg, "tempDir", tsTempDir, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddDir(pCfg, "tempDir", tsTempDir, CFG_SCOPE_BOTH, CFG_DYN_NONE) != 0) return -1;
|
||||||
if (cfgAddFloat(pCfg, "minimalTmpDirGB", 1.0f, 0.001f, 10000000, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0) return -1;
|
if (cfgAddFloat(pCfg, "minimalTmpDirGB", 1.0f, 0.001f, 10000000, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "shellActivityTimer", tsShellActivityTimer, 1, 120, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0)
|
if (cfgAddInt32(pCfg, "shellActivityTimer", tsShellActivityTimer, 1, 120, CFG_SCOPE_BOTH, CFG_DYN_CLIENT) != 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
|
@ -293,17 +293,19 @@ static int compareKv(const void* p1, const void* p2) {
|
||||||
/*
|
/*
|
||||||
* use stable name and tags to grearate child table name
|
* use stable name and tags to grearate child table name
|
||||||
*/
|
*/
|
||||||
void buildChildTableName(RandTableName* rName) {
|
int32_t buildChildTableName(RandTableName* rName) {
|
||||||
SStringBuilder sb = {0};
|
SStringBuilder sb = {0};
|
||||||
taosStringBuilderAppendStringLen(&sb, rName->stbFullName, rName->stbFullNameLen);
|
taosStringBuilderAppendStringLen(&sb, rName->stbFullName, rName->stbFullNameLen);
|
||||||
if (sb.buf == NULL) {
|
if (sb.buf == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
taosArraySort(rName->tags, compareKv);
|
taosArraySort(rName->tags, compareKv);
|
||||||
for (int j = 0; j < taosArrayGetSize(rName->tags); ++j) {
|
for (int j = 0; j < taosArrayGetSize(rName->tags); ++j) {
|
||||||
taosStringBuilderAppendChar(&sb, ',');
|
taosStringBuilderAppendChar(&sb, ',');
|
||||||
SSmlKv* tagKv = taosArrayGet(rName->tags, j);
|
SSmlKv* tagKv = taosArrayGet(rName->tags, j);
|
||||||
|
if(tagKv == NULL) {
|
||||||
|
return TSDB_CODE_SML_INVALID_DATA;
|
||||||
|
}
|
||||||
taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen);
|
taosStringBuilderAppendStringLen(&sb, tagKv->key, tagKv->keyLen);
|
||||||
taosStringBuilderAppendChar(&sb, '=');
|
taosStringBuilderAppendChar(&sb, '=');
|
||||||
if (IS_VAR_DATA_TYPE(tagKv->type)) {
|
if (IS_VAR_DATA_TYPE(tagKv->type)) {
|
||||||
|
@ -323,8 +325,9 @@ void buildChildTableName(RandTableName* rName) {
|
||||||
rName->ctbShortName[0] = 't';
|
rName->ctbShortName[0] = 't';
|
||||||
rName->ctbShortName[1] = '_';
|
rName->ctbShortName[1] = '_';
|
||||||
for (int i = 0; i < 16; i++) {
|
for (int i = 0; i < 16; i++) {
|
||||||
sprintf(temp, "%02x", context.digest[i]);
|
(void)sprintf(temp, "%02x", context.digest[i]);
|
||||||
strcat(rName->ctbShortName, temp);
|
(void)strcat(rName->ctbShortName, temp);
|
||||||
}
|
}
|
||||||
taosStringBuilderDestroy(&sb);
|
taosStringBuilderDestroy(&sb);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -167,7 +167,7 @@ void tsdbReaderClose2(STsdbReader *pReader);
|
||||||
int32_t tsdbNextDataBlock2(STsdbReader *pReader, bool *hasNext);
|
int32_t tsdbNextDataBlock2(STsdbReader *pReader, bool *hasNext);
|
||||||
int32_t tsdbRetrieveDatablockSMA2(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave, bool *hasNullSMA);
|
int32_t tsdbRetrieveDatablockSMA2(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave, bool *hasNullSMA);
|
||||||
void tsdbReleaseDataBlock2(STsdbReader *pReader);
|
void tsdbReleaseDataBlock2(STsdbReader *pReader);
|
||||||
SSDataBlock *tsdbRetrieveDataBlock2(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
int32_t tsdbRetrieveDataBlock2(STsdbReader *pReader, SSDataBlock **pBlock, SArray *pIdList);
|
||||||
int32_t tsdbReaderReset2(STsdbReader *pReader, SQueryTableDataCond *pCond);
|
int32_t tsdbReaderReset2(STsdbReader *pReader, SQueryTableDataCond *pCond);
|
||||||
int32_t tsdbGetFileBlocksDistInfo2(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo);
|
int32_t tsdbGetFileBlocksDistInfo2(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo);
|
||||||
int64_t tsdbGetNumOfRowsInMemTable2(STsdbReader *pHandle);
|
int64_t tsdbGetNumOfRowsInMemTable2(STsdbReader *pHandle);
|
||||||
|
|
|
@ -909,9 +909,9 @@ void tMergeTreeUnpinSttBlock(SMergeTree *pMTree);
|
||||||
bool tMergeTreeIgnoreEarlierTs(SMergeTree *pMTree);
|
bool tMergeTreeIgnoreEarlierTs(SMergeTree *pMTree);
|
||||||
void tMergeTreeClose(SMergeTree *pMTree);
|
void tMergeTreeClose(SMergeTree *pMTree);
|
||||||
|
|
||||||
SSttBlockLoadInfo *tCreateSttBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols);
|
int32_t tCreateSttBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols, SSttBlockLoadInfo **pInfo);
|
||||||
void * destroySttBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
|
void destroySttBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
|
||||||
void * destroySttBlockReader(SArray *pLDataIterArray, SSttBlockLoadCostInfo *pLoadCost);
|
void destroySttBlockReader(SArray *pLDataIterArray, SSttBlockLoadCostInfo *pLoadCost);
|
||||||
|
|
||||||
// tsdbCache ==============================================================================================
|
// tsdbCache ==============================================================================================
|
||||||
typedef enum {
|
typedef enum {
|
||||||
|
|
|
@ -54,7 +54,6 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
typedef struct SVnodeInfo SVnodeInfo;
|
typedef struct SVnodeInfo SVnodeInfo;
|
||||||
typedef struct SMeta SMeta;
|
|
||||||
typedef struct SSma SSma;
|
typedef struct SSma SSma;
|
||||||
typedef struct STsdb STsdb;
|
typedef struct STsdb STsdb;
|
||||||
typedef struct STQ STQ;
|
typedef struct STQ STQ;
|
||||||
|
@ -153,7 +152,6 @@ int32_t vnodeBufPoolRegisterQuery(SVBufPool* pPool, SQueryNode* pQNode);
|
||||||
void vnodeBufPoolDeregisterQuery(SVBufPool* pPool, SQueryNode* pQNode, bool proactive);
|
void vnodeBufPoolDeregisterQuery(SVBufPool* pPool, SQueryNode* pQNode, bool proactive);
|
||||||
|
|
||||||
// meta
|
// meta
|
||||||
typedef struct SMCtbCursor SMCtbCursor;
|
|
||||||
typedef struct SMStbCursor SMStbCursor;
|
typedef struct SMStbCursor SMStbCursor;
|
||||||
typedef struct STbUidStore STbUidStore;
|
typedef struct STbUidStore STbUidStore;
|
||||||
|
|
||||||
|
|
|
@ -725,6 +725,7 @@ int32_t setDstTableDataUid(SVnode* pVnode, SStreamTask* pTask, SSDataBlock* pDat
|
||||||
if (metaGetTableEntryByName(&mr, dstTableName) < 0) {
|
if (metaGetTableEntryByName(&mr, dstTableName) < 0) {
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
|
||||||
|
if (pTask->outputInfo.tbSink.autoCreateCtb) {
|
||||||
tqDebug("s-task:%s stream write into table:%s, table auto created", id, dstTableName);
|
tqDebug("s-task:%s stream write into table:%s, table auto created", id, dstTableName);
|
||||||
|
|
||||||
SArray* pTagArray = taosArrayInit(pTSchema->numOfCols + 1, sizeof(STagVal));
|
SArray* pTagArray = taosArrayInit(pTSchema->numOfCols + 1, sizeof(STagVal));
|
||||||
|
@ -736,13 +737,21 @@ int32_t setDstTableDataUid(SVnode* pVnode, SStreamTask* pTask, SSDataBlock* pDat
|
||||||
taosArrayDestroy(pTagArray);
|
taosArrayDestroy(pTagArray);
|
||||||
|
|
||||||
if (pTableData->pCreateTbReq == NULL) {
|
if (pTableData->pCreateTbReq == NULL) {
|
||||||
tqError("s-task:%s failed to build auto create table req, code:%s", id, tstrerror(terrno));
|
tqError("s-task:%s failed to build auto create dst-table req:%s, code:%s", id, dstTableName,
|
||||||
|
tstrerror(terrno));
|
||||||
taosMemoryFree(pTableSinkInfo);
|
taosMemoryFree(pTableSinkInfo);
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
pTableSinkInfo->uid = 0;
|
pTableSinkInfo->uid = 0;
|
||||||
doPutIntoCache(pTask->outputInfo.tbSink.pTblInfo, pTableSinkInfo, groupId, id);
|
doPutIntoCache(pTask->outputInfo.tbSink.pTblInfo, pTableSinkInfo, groupId, id);
|
||||||
|
} else {
|
||||||
|
metaReaderClear(&mr);
|
||||||
|
|
||||||
|
tqError("s-task:%s vgId:%d dst-table:%s not auto-created, and not create in tsdb, discard data", id,
|
||||||
|
vgId, dstTableName);
|
||||||
|
return TSDB_CODE_TDB_TABLE_NOT_EXIST;
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
bool isValid = isValidDstChildTable(&mr, vgId, dstTableName, suid);
|
bool isValid = isValidDstChildTable(&mr, vgId, dstTableName, suid);
|
||||||
if (!isValid) {
|
if (!isValid) {
|
||||||
|
@ -798,6 +807,24 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
const char* id = pTask->id.idStr;
|
const char* id = pTask->id.idStr;
|
||||||
int64_t earlyTs = tsdbGetEarliestTs(pVnode->pTsdb);
|
int64_t earlyTs = tsdbGetEarliestTs(pVnode->pTsdb);
|
||||||
|
STaskOutputInfo* pOutputInfo = &pTask->outputInfo;
|
||||||
|
|
||||||
|
if (pTask->outputInfo.tbSink.pTagSchema == NULL) {
|
||||||
|
SMetaReader mer1 = {0};
|
||||||
|
metaReaderDoInit(&mer1, pVnode->pMeta, META_READER_LOCK);
|
||||||
|
|
||||||
|
code = metaReaderGetTableEntryByUid(&mer1, pOutputInfo->tbSink.stbUid);
|
||||||
|
pOutputInfo->tbSink.pTagSchema = tCloneSSchemaWrapper(&mer1.me.stbEntry.schemaTag);
|
||||||
|
metaReaderClear(&mer1);
|
||||||
|
|
||||||
|
SSchemaWrapper* pTagSchema = pOutputInfo->tbSink.pTagSchema;
|
||||||
|
SSchema* pCol1 = &pTagSchema->pSchema[0];
|
||||||
|
if (pTagSchema->nCols == 1 && pCol1->type == TSDB_DATA_TYPE_UBIGINT && strcmp(pCol1->name, "group_id") == 0) {
|
||||||
|
pOutputInfo->tbSink.autoCreateCtb = true;
|
||||||
|
} else {
|
||||||
|
pOutputInfo->tbSink.autoCreateCtb = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool onlySubmitData = hasOnlySubmitData(pBlocks, numOfBlocks);
|
bool onlySubmitData = hasOnlySubmitData(pBlocks, numOfBlocks);
|
||||||
if (!onlySubmitData) {
|
if (!onlySubmitData) {
|
||||||
|
@ -829,6 +856,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) {
|
||||||
SSubmitTbData tbData = {.suid = suid, .uid = 0, .sver = pTSchema->version, .flags = TD_REQ_FROM_APP};
|
SSubmitTbData tbData = {.suid = suid, .uid = 0, .sver = pTSchema->version, .flags = TD_REQ_FROM_APP};
|
||||||
code = setDstTableDataUid(pVnode, pTask, pDataBlock, stbFullName, &tbData);
|
code = setDstTableDataUid(pVnode, pTask, pDataBlock, stbFullName, &tbData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tqError("vgId:%d s-task:%s dst-table not exist, stb:%s discard stream results", vgId, id, stbFullName);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -882,6 +910,7 @@ void tqSinkDataIntoDstTable(SStreamTask* pTask, void* vnode, void* data) {
|
||||||
if (index == NULL) { // no data yet, append it
|
if (index == NULL) { // no data yet, append it
|
||||||
code = setDstTableDataUid(pVnode, pTask, pDataBlock, stbFullName, &tbData);
|
code = setDstTableDataUid(pVnode, pTask, pDataBlock, stbFullName, &tbData);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tqError("vgId:%d dst-table gid:%" PRId64 " not exist, discard stream results", vgId, groupId);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2579,7 +2579,7 @@ typedef struct {
|
||||||
static int32_t lastIterOpen(SFSLastIter *iter, STFileSet *pFileSet, STsdb *pTsdb, STSchema *pTSchema, tb_uid_t suid,
|
static int32_t lastIterOpen(SFSLastIter *iter, STFileSet *pFileSet, STsdb *pTsdb, STSchema *pTSchema, tb_uid_t suid,
|
||||||
tb_uid_t uid, SCacheRowsReader *pr, int64_t lastTs, int16_t *aCols, int nCols) {
|
tb_uid_t uid, SCacheRowsReader *pr, int64_t lastTs, int16_t *aCols, int nCols) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
pr->pLDataIterArray = destroySttBlockReader(pr->pLDataIterArray, NULL);
|
destroySttBlockReader(pr->pLDataIterArray, NULL);
|
||||||
pr->pLDataIterArray = taosArrayInit(4, POINTER_BYTES);
|
pr->pLDataIterArray = taosArrayInit(4, POINTER_BYTES);
|
||||||
|
|
||||||
SMergeTreeConf conf = {
|
SMergeTreeConf conf = {
|
||||||
|
@ -3212,7 +3212,10 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
|
|
||||||
pIter->pMemDelData = NULL;
|
pIter->pMemDelData = NULL;
|
||||||
|
|
||||||
loadMemTombData(&pIter->pMemDelData, pMem, pIMem, pr->info.verRange.maxVer);
|
code = loadMemTombData(&pIter->pMemDelData, pMem, pIMem, pr->info.verRange.maxVer);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
pIter->idx = (SBlockIdx){.suid = suid, .uid = uid};
|
pIter->idx = (SBlockIdx){.suid = suid, .uid = uid};
|
||||||
|
|
||||||
|
|
|
@ -203,7 +203,7 @@ int32_t tsdbReuseCacherowsReader(void* reader, void* pTableIdList, int32_t numOf
|
||||||
pReader->pTableList = pTableIdList;
|
pReader->pTableList = pTableIdList;
|
||||||
pReader->numOfTables = numOfTables;
|
pReader->numOfTables = numOfTables;
|
||||||
pReader->lastTs = INT64_MIN;
|
pReader->lastTs = INT64_MIN;
|
||||||
pReader->pLDataIterArray = destroySttBlockReader(pReader->pLDataIterArray, NULL);
|
destroySttBlockReader(pReader->pLDataIterArray, NULL);
|
||||||
pReader->pLDataIterArray = taosArrayInit(4, POINTER_BYTES);
|
pReader->pLDataIterArray = taosArrayInit(4, POINTER_BYTES);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
|
@ -23,11 +23,12 @@
|
||||||
static void tLDataIterClose2(SLDataIter *pIter);
|
static void tLDataIterClose2(SLDataIter *pIter);
|
||||||
|
|
||||||
// SLDataIter =================================================
|
// SLDataIter =================================================
|
||||||
SSttBlockLoadInfo *tCreateSttBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols) {
|
int32_t tCreateSttBlockLoadInfo(STSchema *pSchema, int16_t *colList, int32_t numOfCols, SSttBlockLoadInfo **pInfo) {
|
||||||
|
*pInfo = NULL;
|
||||||
|
|
||||||
SSttBlockLoadInfo *pLoadInfo = taosMemoryCalloc(1, sizeof(SSttBlockLoadInfo));
|
SSttBlockLoadInfo *pLoadInfo = taosMemoryCalloc(1, sizeof(SSttBlockLoadInfo));
|
||||||
if (pLoadInfo == NULL) {
|
if (pLoadInfo == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pLoadInfo->blockData[0].sttBlockIndex = -1;
|
pLoadInfo->blockData[0].sttBlockIndex = -1;
|
||||||
|
@ -37,26 +38,29 @@ SSttBlockLoadInfo *tCreateSttBlockLoadInfo(STSchema *pSchema, int16_t *colList,
|
||||||
|
|
||||||
int32_t code = tBlockDataCreate(&pLoadInfo->blockData[0].data);
|
int32_t code = tBlockDataCreate(&pLoadInfo->blockData[0].data);
|
||||||
if (code) {
|
if (code) {
|
||||||
terrno = code;
|
taosMemoryFreeClear(pLoadInfo);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tBlockDataCreate(&pLoadInfo->blockData[1].data);
|
code = tBlockDataCreate(&pLoadInfo->blockData[1].data);
|
||||||
if (code) {
|
if (code) {
|
||||||
terrno = code;
|
taosMemoryFreeClear(pLoadInfo);
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
pLoadInfo->aSttBlk = taosArrayInit(4, sizeof(SSttBlk));
|
pLoadInfo->aSttBlk = taosArrayInit(4, sizeof(SSttBlk));
|
||||||
if (pLoadInfo->aSttBlk == NULL) {
|
if (pLoadInfo->aSttBlk == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
taosMemoryFreeClear(pLoadInfo);
|
taosMemoryFreeClear(pLoadInfo);
|
||||||
return NULL;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
pLoadInfo->pSchema = pSchema;
|
pLoadInfo->pSchema = pSchema;
|
||||||
pLoadInfo->colIds = colList;
|
pLoadInfo->colIds = colList;
|
||||||
pLoadInfo->numOfCols = numOfCols;
|
pLoadInfo->numOfCols = numOfCols;
|
||||||
|
|
||||||
return pLoadInfo;
|
*pInfo = pLoadInfo;
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void freeItem(void* pValue) {
|
static void freeItem(void* pValue) {
|
||||||
|
@ -66,9 +70,9 @@ static void freeItem(void* pValue) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void *destroySttBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo) {
|
void destroySttBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo) {
|
||||||
if (pLoadInfo == NULL) {
|
if (pLoadInfo == NULL) {
|
||||||
return NULL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pLoadInfo->currentLoadBlockIndex = 1;
|
pLoadInfo->currentLoadBlockIndex = 1;
|
||||||
|
@ -94,7 +98,6 @@ void *destroySttBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo) {
|
||||||
|
|
||||||
taosArrayDestroy(pLoadInfo->aSttBlk);
|
taosArrayDestroy(pLoadInfo->aSttBlk);
|
||||||
taosMemoryFree(pLoadInfo);
|
taosMemoryFree(pLoadInfo);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyLDataIter(SLDataIter *pIter) {
|
void destroyLDataIter(SLDataIter *pIter) {
|
||||||
|
@ -103,9 +106,9 @@ void destroyLDataIter(SLDataIter *pIter) {
|
||||||
taosMemoryFree(pIter);
|
taosMemoryFree(pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
void *destroySttBlockReader(SArray *pLDataIterArray, SSttBlockLoadCostInfo *pLoadCost) {
|
void destroySttBlockReader(SArray *pLDataIterArray, SSttBlockLoadCostInfo *pLoadCost) {
|
||||||
if (pLDataIterArray == NULL) {
|
if (pLDataIterArray == NULL) {
|
||||||
return NULL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfLevel = taosArrayGetSize(pLDataIterArray);
|
int32_t numOfLevel = taosArrayGetSize(pLDataIterArray);
|
||||||
|
@ -132,7 +135,6 @@ void *destroySttBlockReader(SArray *pLDataIterArray, SSttBlockLoadCostInfo *pLoa
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayDestroy(pLDataIterArray);
|
taosArrayDestroy(pLDataIterArray);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// choose the unpinned slot to load next data block
|
// choose the unpinned slot to load next data block
|
||||||
|
@ -914,9 +916,8 @@ int32_t tMergeTreeOpen2(SMergeTree *pMTree, SMergeTreeConf *pConf, SSttDataInfoF
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pLoadInfo == NULL) {
|
if (pLoadInfo == NULL) {
|
||||||
pLoadInfo = tCreateSttBlockLoadInfo(pConf->pSchema, pConf->pCols, pConf->numOfCols);
|
code = tCreateSttBlockLoadInfo(pConf->pSchema, pConf->pCols, pConf->numOfCols, &pLoadInfo);
|
||||||
if (pLoadInfo == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
code = terrno;
|
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -112,22 +112,28 @@ void clearBlockScanInfoBuf(SBlockInfoBuf* pBuf) {
|
||||||
taosArrayDestroy(pBuf->pData);
|
taosArrayDestroy(pBuf->pData);
|
||||||
}
|
}
|
||||||
|
|
||||||
void* getPosInBlockInfoBuf(SBlockInfoBuf* pBuf, int32_t index) {
|
int32_t getPosInBlockInfoBuf(SBlockInfoBuf* pBuf, int32_t index, STableBlockScanInfo** pInfo) {
|
||||||
|
*pInfo = NULL;
|
||||||
|
|
||||||
int32_t bucketIndex = index / pBuf->numPerBucket;
|
int32_t bucketIndex = index / pBuf->numPerBucket;
|
||||||
char** pBucket = taosArrayGet(pBuf->pData, bucketIndex);
|
char** pBucket = taosArrayGet(pBuf->pData, bucketIndex);
|
||||||
return (*pBucket) + (index % pBuf->numPerBucket) * sizeof(STableBlockScanInfo);
|
if (pBucket == NULL) {
|
||||||
}
|
return TSDB_CODE_FAILED;
|
||||||
|
|
||||||
STableBlockScanInfo* getTableBlockScanInfo(SSHashObj* pTableMap, uint64_t uid, const char* id) {
|
|
||||||
STableBlockScanInfo** p = tSimpleHashGet(pTableMap, &uid, sizeof(uid));
|
|
||||||
if (p == NULL || *p == NULL) {
|
|
||||||
terrno = TSDB_CODE_INVALID_PARA;
|
|
||||||
int32_t size = tSimpleHashGetSize(pTableMap);
|
|
||||||
tsdbError("failed to locate the uid:%" PRIu64 " in query table uid list, total tables:%d, %s", uid, size, id);
|
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return *p;
|
*pInfo = (STableBlockScanInfo*)((*pBucket) + (index % pBuf->numPerBucket) * sizeof(STableBlockScanInfo));
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t getTableBlockScanInfo(SSHashObj* pTableMap, uint64_t uid, STableBlockScanInfo** pInfo, const char* id) {
|
||||||
|
*pInfo = *(STableBlockScanInfo**)tSimpleHashGet(pTableMap, &uid, sizeof(uid));
|
||||||
|
if (pInfo == NULL) {
|
||||||
|
int32_t size = tSimpleHashGetSize(pTableMap);
|
||||||
|
tsdbError("failed to locate the uid:%" PRIu64 " in query table uid list, total tables:%d, %s", uid, size, id);
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t initRowKey(SRowKey* pKey, int64_t ts, int32_t numOfPks, int32_t type, int32_t len, bool asc) {
|
int32_t initRowKey(SRowKey* pKey, int64_t ts, int32_t numOfPks, int32_t type, int32_t len, bool asc) {
|
||||||
|
@ -146,17 +152,17 @@ int32_t initRowKey(SRowKey* pKey, int64_t ts, int32_t numOfPks, int32_t type, in
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_INT:{
|
case TSDB_DATA_TYPE_INT:{
|
||||||
int32_t min = INT32_MIN;
|
int32_t min = INT32_MIN;
|
||||||
memcpy(&pKey->pks[0].val, &min, tDataTypes[type].bytes);
|
(void)memcpy(&pKey->pks[0].val, &min, tDataTypes[type].bytes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_SMALLINT:{
|
case TSDB_DATA_TYPE_SMALLINT:{
|
||||||
int16_t min = INT16_MIN;
|
int16_t min = INT16_MIN;
|
||||||
memcpy(&pKey->pks[0].val, &min, tDataTypes[type].bytes);
|
(void)memcpy(&pKey->pks[0].val, &min, tDataTypes[type].bytes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_TINYINT:{
|
case TSDB_DATA_TYPE_TINYINT:{
|
||||||
int8_t min = INT8_MIN;
|
int8_t min = INT8_MIN;
|
||||||
memcpy(&pKey->pks[0].val, &min, tDataTypes[type].bytes);
|
(void)memcpy(&pKey->pks[0].val, &min, tDataTypes[type].bytes);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_UTINYINT:
|
case TSDB_DATA_TYPE_UTINYINT:
|
||||||
|
@ -245,20 +251,27 @@ int32_t initTableBlockScanInfo(STableBlockScanInfo* pScanInfo, uint64_t uid, SSH
|
||||||
initLastProcKey(pScanInfo, pReader);
|
initLastProcKey(pScanInfo, pReader);
|
||||||
|
|
||||||
pScanInfo->sttKeyInfo.status = STT_FILE_READER_UNINIT;
|
pScanInfo->sttKeyInfo.status = STT_FILE_READER_UNINIT;
|
||||||
tSimpleHashPut(pTableMap, &pScanInfo->uid, sizeof(uint64_t), &pScanInfo, POINTER_BYTES);
|
int32_t code = tSimpleHashPut(pTableMap, &pScanInfo->uid, sizeof(uint64_t), &pScanInfo, POINTER_BYTES);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
tsdbTrace("%p check table uid:%" PRId64 " from lastKey:%" PRId64 " %s", pReader, pScanInfo->uid,
|
tsdbTrace("%p check table uid:%" PRId64 " from lastKey:%" PRId64 " %s", pReader, pScanInfo->uid,
|
||||||
pScanInfo->lastProcKey.ts, pReader->idStr);
|
pScanInfo->lastProcKey.ts, pReader->idStr);
|
||||||
return TSDB_CODE_SUCCESS;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: speedup the whole processing by preparing the buffer for STableBlockScanInfo in batch model
|
// NOTE: speedup the whole processing by preparing the buffer for STableBlockScanInfo in batch model
|
||||||
SSHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, SBlockInfoBuf* pBuf, const STableKeyInfo* idList,
|
int32_t createDataBlockScanInfo(STsdbReader* pTsdbReader, SBlockInfoBuf* pBuf, const STableKeyInfo* idList,
|
||||||
STableUidList* pUidList, int32_t numOfTables) {
|
STableUidList* pUidList, int32_t numOfTables, SSHashObj** pHashObj) {
|
||||||
|
int32_t code = 0;
|
||||||
|
*pHashObj = NULL;
|
||||||
|
|
||||||
// allocate buffer in order to load data blocks from file
|
// allocate buffer in order to load data blocks from file
|
||||||
// todo use simple hash instead, optimize the memory consumption
|
// todo use simple hash instead, optimize the memory consumption
|
||||||
SSHashObj* pTableMap = tSimpleHashInit(numOfTables, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT));
|
SSHashObj* pTableMap = tSimpleHashInit(numOfTables, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT));
|
||||||
if (pTableMap == NULL) {
|
if (pTableMap == NULL) {
|
||||||
return NULL;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
|
@ -267,7 +280,7 @@ SSHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, SBlockInfoBuf* pBuf
|
||||||
pUidList->tableUidList = taosMemoryMalloc(numOfTables * sizeof(uint64_t));
|
pUidList->tableUidList = taosMemoryMalloc(numOfTables * sizeof(uint64_t));
|
||||||
if (pUidList->tableUidList == NULL) {
|
if (pUidList->tableUidList == NULL) {
|
||||||
tSimpleHashCleanup(pTableMap);
|
tSimpleHashCleanup(pTableMap);
|
||||||
return NULL;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pUidList->currentIndex = 0;
|
pUidList->currentIndex = 0;
|
||||||
|
@ -275,8 +288,16 @@ SSHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, SBlockInfoBuf* pBuf
|
||||||
for (int32_t j = 0; j < numOfTables; ++j) {
|
for (int32_t j = 0; j < numOfTables; ++j) {
|
||||||
pUidList->tableUidList[j] = idList[j].uid;
|
pUidList->tableUidList[j] = idList[j].uid;
|
||||||
|
|
||||||
STableBlockScanInfo* pScanInfo = getPosInBlockInfoBuf(pBuf, j);
|
STableBlockScanInfo* pScanInfo = NULL;
|
||||||
initTableBlockScanInfo(pScanInfo, idList[j].uid, pTableMap, pTsdbReader);
|
code = getPosInBlockInfoBuf(pBuf, j, &pScanInfo);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = initTableBlockScanInfo(pScanInfo, idList[j].uid, pTableMap, pTsdbReader);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosSort(pUidList->tableUidList, numOfTables, sizeof(uint64_t), uidComparFunc);
|
taosSort(pUidList->tableUidList, numOfTables, sizeof(uint64_t), uidComparFunc);
|
||||||
|
@ -286,7 +307,8 @@ SSHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, SBlockInfoBuf* pBuf
|
||||||
(sizeof(STableBlockScanInfo) * numOfTables) / 1024.0, pTsdbReader->cost.createScanInfoList,
|
(sizeof(STableBlockScanInfo) * numOfTables) / 1024.0, pTsdbReader->cost.createScanInfoList,
|
||||||
pTsdbReader->idStr);
|
pTsdbReader->idStr);
|
||||||
|
|
||||||
return pTableMap;
|
*pHashObj = pTableMap;
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void resetAllDataBlockScanInfo(SSHashObj* pTableMap, int64_t ts, int32_t step) {
|
void resetAllDataBlockScanInfo(SSHashObj* pTableMap, int64_t ts, int32_t step) {
|
||||||
|
@ -391,11 +413,13 @@ void initBrinRecordIter(SBrinRecordIter* pIter, SDataFileReader* pReader, SArray
|
||||||
pIter->pBrinBlockList = pList;
|
pIter->pBrinBlockList = pList;
|
||||||
}
|
}
|
||||||
|
|
||||||
SBrinRecord* getNextBrinRecord(SBrinRecordIter* pIter) {
|
int32_t getNextBrinRecord(SBrinRecordIter* pIter, SBrinRecord** pRecord) {
|
||||||
|
*pRecord = NULL;
|
||||||
|
|
||||||
if (pIter->blockIndex == -1 || (pIter->recordIndex + 1) >= pIter->block.numOfRecords) {
|
if (pIter->blockIndex == -1 || (pIter->recordIndex + 1) >= pIter->block.numOfRecords) {
|
||||||
pIter->blockIndex += 1;
|
pIter->blockIndex += 1;
|
||||||
if (pIter->blockIndex >= taosArrayGetSize(pIter->pBrinBlockList)) {
|
if (pIter->blockIndex >= taosArrayGetSize(pIter->pBrinBlockList)) {
|
||||||
return NULL;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
pIter->pCurrentBlk = taosArrayGet(pIter->pBrinBlockList, pIter->blockIndex);
|
pIter->pCurrentBlk = taosArrayGet(pIter->pBrinBlockList, pIter->blockIndex);
|
||||||
|
@ -404,7 +428,7 @@ SBrinRecord* getNextBrinRecord(SBrinRecordIter* pIter) {
|
||||||
int32_t code = tsdbDataFileReadBrinBlock(pIter->pReader, pIter->pCurrentBlk, &pIter->block);
|
int32_t code = tsdbDataFileReadBrinBlock(pIter->pReader, pIter->pCurrentBlk, &pIter->block);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tsdbError("failed to read brinBlock from file, code:%s", tstrerror(code));
|
tsdbError("failed to read brinBlock from file, code:%s", tstrerror(code));
|
||||||
return NULL;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
pIter->recordIndex = -1;
|
pIter->recordIndex = -1;
|
||||||
|
@ -412,7 +436,9 @@ SBrinRecord* getNextBrinRecord(SBrinRecordIter* pIter) {
|
||||||
|
|
||||||
pIter->recordIndex += 1;
|
pIter->recordIndex += 1;
|
||||||
tBrinBlockGet(&pIter->block, pIter->recordIndex, &pIter->record);
|
tBrinBlockGet(&pIter->block, pIter->recordIndex, &pIter->record);
|
||||||
return &pIter->record;
|
*pRecord = &pIter->record;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearBrinBlockIter(SBrinRecordIter* pIter) { tBrinBlockDestroy(&pIter->block); }
|
void clearBrinBlockIter(SBrinRecordIter* pIter) { tBrinBlockDestroy(&pIter->block); }
|
||||||
|
@ -670,7 +696,13 @@ static int32_t doCheckTombBlock(STombBlock* pBlock, STsdbReader* pReader, int32_
|
||||||
STombRecord record = {0};
|
STombRecord record = {0};
|
||||||
|
|
||||||
uint64_t uid = pReader->status.uidList.tableUidList[*j];
|
uint64_t uid = pReader->status.uidList.tableUidList[*j];
|
||||||
STableBlockScanInfo* pScanInfo = getTableBlockScanInfo(pReader->status.pTableMap, uid, pReader->idStr);
|
STableBlockScanInfo* pScanInfo = NULL;
|
||||||
|
|
||||||
|
code = getTableBlockScanInfo(pReader->status.pTableMap, uid, &pScanInfo, pReader->idStr);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (pScanInfo->pFileDelData == NULL) {
|
if (pScanInfo->pFileDelData == NULL) {
|
||||||
pScanInfo->pFileDelData = taosArrayInit(4, sizeof(SDelData));
|
pScanInfo->pFileDelData = taosArrayInit(4, sizeof(SDelData));
|
||||||
}
|
}
|
||||||
|
@ -702,7 +734,11 @@ static int32_t doCheckTombBlock(STombBlock* pBlock, STsdbReader* pReader, int32_
|
||||||
}
|
}
|
||||||
|
|
||||||
uid = pReader->status.uidList.tableUidList[*j];
|
uid = pReader->status.uidList.tableUidList[*j];
|
||||||
pScanInfo = getTableBlockScanInfo(pReader->status.pTableMap, uid, pReader->idStr);
|
code = getTableBlockScanInfo(pReader->status.pTableMap, uid, &pScanInfo, pReader->idStr);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
if (pScanInfo->pFileDelData == NULL) {
|
if (pScanInfo->pFileDelData == NULL) {
|
||||||
pScanInfo->pFileDelData = taosArrayInit(4, sizeof(SDelData));
|
pScanInfo->pFileDelData = taosArrayInit(4, sizeof(SDelData));
|
||||||
}
|
}
|
||||||
|
@ -806,9 +842,12 @@ int32_t loadSttTombDataForAll(STsdbReader* pReader, SSttFileReader* pSttFileRead
|
||||||
return doLoadTombDataFromTombBlk(pBlkArray, pReader, pSttFileReader, false);
|
return doLoadTombDataFromTombBlk(pBlkArray, pReader, pSttFileReader, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
void loadMemTombData(SArray** ppMemDelData, STbData* pMemTbData, STbData* piMemTbData, int64_t ver) {
|
int32_t loadMemTombData(SArray** ppMemDelData, STbData* pMemTbData, STbData* piMemTbData, int64_t ver) {
|
||||||
if (*ppMemDelData == NULL) {
|
if (*ppMemDelData == NULL) {
|
||||||
*ppMemDelData = taosArrayInit(4, sizeof(SDelData));
|
*ppMemDelData = taosArrayInit(4, sizeof(SDelData));
|
||||||
|
if (*ppMemDelData == NULL) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* pMemDelData = *ppMemDelData;
|
SArray* pMemDelData = *ppMemDelData;
|
||||||
|
@ -836,6 +875,8 @@ void loadMemTombData(SArray** ppMemDelData, STbData* pMemTbData, STbData* piMemT
|
||||||
p = p->pNext;
|
p = p->pNext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getNumOfRowsInSttBlock(SSttFileReader* pSttFileReader, SSttBlockLoadInfo* pBlockLoadInfo,
|
int32_t getNumOfRowsInSttBlock(SSttFileReader* pSttFileReader, SSttBlockLoadInfo* pBlockLoadInfo,
|
||||||
|
@ -960,6 +1001,7 @@ int32_t adjustSttDataIters(SArray* pSttFileBlockIterArray, STFileSet* pFileSet)
|
||||||
int32_t tsdbGetRowsInSttFiles(STFileSet* pFileSet, SArray* pSttFileBlockIterArray, STsdb* pTsdb, SMergeTreeConf* pConf,
|
int32_t tsdbGetRowsInSttFiles(STFileSet* pFileSet, SArray* pSttFileBlockIterArray, STsdb* pTsdb, SMergeTreeConf* pConf,
|
||||||
const char* pstr) {
|
const char* pstr) {
|
||||||
int32_t numOfRows = 0;
|
int32_t numOfRows = 0;
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
// no data exists, go to end
|
// no data exists, go to end
|
||||||
int32_t numOfLevels = pFileSet->lvlArr->size;
|
int32_t numOfLevels = pFileSet->lvlArr->size;
|
||||||
|
@ -984,7 +1026,7 @@ int32_t tsdbGetRowsInSttFiles(STFileSet* pFileSet, SArray* pSttFileBlockIterArra
|
||||||
conf.file[0] = *pSttLevel->fobjArr->data[i]->f;
|
conf.file[0] = *pSttLevel->fobjArr->data[i]->f;
|
||||||
|
|
||||||
const char* pName = pSttLevel->fobjArr->data[i]->fname;
|
const char* pName = pSttLevel->fobjArr->data[i]->fname;
|
||||||
int32_t code = tsdbSttFileReaderOpen(pName, &conf, &pIter->pReader);
|
code = tsdbSttFileReaderOpen(pName, &conf, &pIter->pReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tsdbError("open stt file reader error. file:%s, code %s, %s", pName, tstrerror(code), pstr);
|
tsdbError("open stt file reader error. file:%s, code %s, %s", pName, tstrerror(code), pstr);
|
||||||
continue;
|
continue;
|
||||||
|
@ -992,8 +1034,8 @@ int32_t tsdbGetRowsInSttFiles(STFileSet* pFileSet, SArray* pSttFileBlockIterArra
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pIter->pBlockLoadInfo == NULL) {
|
if (pIter->pBlockLoadInfo == NULL) {
|
||||||
pIter->pBlockLoadInfo = tCreateSttBlockLoadInfo(pConf->pSchema, pConf->pCols, pConf->numOfCols);
|
code = tCreateSttBlockLoadInfo(pConf->pSchema, pConf->pCols, pConf->numOfCols, &pIter->pBlockLoadInfo);
|
||||||
if (pIter->pBlockLoadInfo == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tsdbError("failed to create block load info, code: out of memory, %s", pstr);
|
tsdbError("failed to create block load info, code: out of memory, %s", pstr);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1001,7 +1043,7 @@ int32_t tsdbGetRowsInSttFiles(STFileSet* pFileSet, SArray* pSttFileBlockIterArra
|
||||||
|
|
||||||
// load stt blocks statis for all stt-blocks, to decide if the data of queried table exists in current stt file
|
// load stt blocks statis for all stt-blocks, to decide if the data of queried table exists in current stt file
|
||||||
TStatisBlkArray* pStatisBlkArray = NULL;
|
TStatisBlkArray* pStatisBlkArray = NULL;
|
||||||
int32_t code = tsdbSttFileReadStatisBlk(pIter->pReader, (const TStatisBlkArray**)&pStatisBlkArray);
|
code = tsdbSttFileReadStatisBlk(pIter->pReader, (const TStatisBlkArray**)&pStatisBlkArray);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tsdbError("failed to load stt block statistics, code:%s, %s", tstrerror(code), pstr);
|
tsdbError("failed to load stt block statistics, code:%s, %s", tstrerror(code), pstr);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -315,11 +315,10 @@ typedef struct SBrinRecordIter {
|
||||||
} SBrinRecordIter;
|
} SBrinRecordIter;
|
||||||
|
|
||||||
int32_t uidComparFunc(const void* p1, const void* p2);
|
int32_t uidComparFunc(const void* p1, const void* p2);
|
||||||
|
int32_t getTableBlockScanInfo(SSHashObj* pTableMap, uint64_t uid, STableBlockScanInfo** pInfo, const char* id);
|
||||||
|
|
||||||
STableBlockScanInfo* getTableBlockScanInfo(SSHashObj* pTableMap, uint64_t uid, const char* id);
|
int32_t createDataBlockScanInfo(STsdbReader* pTsdbReader, SBlockInfoBuf* pBuf, const STableKeyInfo* idList,
|
||||||
|
STableUidList* pUidList, int32_t numOfTables, SSHashObj** pHashObj);
|
||||||
SSHashObj* createDataBlockScanInfo(STsdbReader* pReader, SBlockInfoBuf* pBuf, const STableKeyInfo* idList,
|
|
||||||
STableUidList* pUidList, int32_t numOfTables);
|
|
||||||
int32_t initTableBlockScanInfo(STableBlockScanInfo* pScanInfo, uint64_t uid, SSHashObj* pTableMap,
|
int32_t initTableBlockScanInfo(STableBlockScanInfo* pScanInfo, uint64_t uid, SSHashObj* pTableMap,
|
||||||
STsdbReader* pReader);
|
STsdbReader* pReader);
|
||||||
void clearBlockScanInfo(STableBlockScanInfo* p);
|
void clearBlockScanInfo(STableBlockScanInfo* p);
|
||||||
|
@ -328,11 +327,11 @@ void resetAllDataBlockScanInfo(SSHashObj* pTableMap, int64_t ts, int32_t s
|
||||||
void cleanupInfoForNextFileset(SSHashObj* pTableMap);
|
void cleanupInfoForNextFileset(SSHashObj* pTableMap);
|
||||||
int32_t ensureBlockScanInfoBuf(SBlockInfoBuf* pBuf, int32_t numOfTables);
|
int32_t ensureBlockScanInfoBuf(SBlockInfoBuf* pBuf, int32_t numOfTables);
|
||||||
void clearBlockScanInfoBuf(SBlockInfoBuf* pBuf);
|
void clearBlockScanInfoBuf(SBlockInfoBuf* pBuf);
|
||||||
void* getPosInBlockInfoBuf(SBlockInfoBuf* pBuf, int32_t index);
|
int32_t getPosInBlockInfoBuf(SBlockInfoBuf* pBuf, int32_t index, STableBlockScanInfo** pRes);
|
||||||
|
|
||||||
// brin records iterator
|
// brin records iterator
|
||||||
void initBrinRecordIter(SBrinRecordIter* pIter, SDataFileReader* pReader, SArray* pList);
|
void initBrinRecordIter(SBrinRecordIter* pIter, SDataFileReader* pReader, SArray* pList);
|
||||||
SBrinRecord* getNextBrinRecord(SBrinRecordIter* pIter);
|
int32_t getNextBrinRecord(SBrinRecordIter* pIter, SBrinRecord** pRecord);
|
||||||
void clearBrinBlockIter(SBrinRecordIter* pIter);
|
void clearBrinBlockIter(SBrinRecordIter* pIter);
|
||||||
|
|
||||||
// initialize block iterator API
|
// initialize block iterator API
|
||||||
|
@ -340,7 +339,7 @@ int32_t initBlockIterator(STsdbReader* pReader, SDataBlockIter* pBlockIter, int3
|
||||||
bool blockIteratorNext(SDataBlockIter* pBlockIter, const char* idStr);
|
bool blockIteratorNext(SDataBlockIter* pBlockIter, const char* idStr);
|
||||||
|
|
||||||
// load tomb data API (stt/mem only for one table each, tomb data from data files are load for all tables at one time)
|
// load tomb data API (stt/mem only for one table each, tomb data from data files are load for all tables at one time)
|
||||||
void loadMemTombData(SArray** ppMemDelData, STbData* pMemTbData, STbData* piMemTbData, int64_t ver);
|
int32_t loadMemTombData(SArray** ppMemDelData, STbData* pMemTbData, STbData* piMemTbData, int64_t ver);
|
||||||
int32_t loadDataFileTombDataForAll(STsdbReader* pReader);
|
int32_t loadDataFileTombDataForAll(STsdbReader* pReader);
|
||||||
int32_t loadSttTombDataForAll(STsdbReader* pReader, SSttFileReader* pSttFileReader, SSttBlockLoadInfo* pLoadInfo);
|
int32_t loadSttTombDataForAll(STsdbReader* pReader, SSttFileReader* pSttFileReader, SSttBlockLoadInfo* pLoadInfo);
|
||||||
int32_t getNumOfRowsInSttBlock(SSttFileReader* pSttFileReader, SSttBlockLoadInfo* pBlockLoadInfo,
|
int32_t getNumOfRowsInSttBlock(SSttFileReader* pSttFileReader, SSttBlockLoadInfo* pBlockLoadInfo,
|
||||||
|
@ -358,8 +357,8 @@ int32_t pkCompEx(SRowKey* p1, SRowKey* p2);
|
||||||
int32_t initRowKey(SRowKey* pKey, int64_t ts, int32_t numOfPks, int32_t type, int32_t len, bool asc);
|
int32_t initRowKey(SRowKey* pKey, int64_t ts, int32_t numOfPks, int32_t type, int32_t len, bool asc);
|
||||||
void clearRowKey(SRowKey* pKey);
|
void clearRowKey(SRowKey* pKey);
|
||||||
|
|
||||||
bool shouldFreePkBuf(SBlockLoadSuppInfo *pSupp);
|
bool shouldFreePkBuf(SBlockLoadSuppInfo* pSupp);
|
||||||
void resetDataBlockIterator(SDataBlockIter* pIter, int32_t order, bool hasPk);
|
int32_t resetDataBlockIterator(SDataBlockIter* pIter, int32_t order, bool hasPk);
|
||||||
void clearDataBlockIterator(SDataBlockIter* pIter, bool needFree);
|
void clearDataBlockIterator(SDataBlockIter* pIter, bool needFree);
|
||||||
void cleanupDataBlockIterator(SDataBlockIter* pIter, bool hasPk);
|
void cleanupDataBlockIterator(SDataBlockIter* pIter, bool hasPk);
|
||||||
|
|
||||||
|
|
|
@ -929,7 +929,7 @@ int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, SExprSupp* pExpSup, i
|
||||||
SStreamState* pState, int32_t keySize, int16_t keyType, SStateStore* pStore,
|
SStreamState* pState, int32_t keySize, int16_t keyType, SStateStore* pStore,
|
||||||
SReadHandle* pHandle, STimeWindowAggSupp* pTwAggSup, const char* taskIdStr,
|
SReadHandle* pHandle, STimeWindowAggSupp* pTwAggSup, const char* taskIdStr,
|
||||||
SStorageAPI* pApi, int32_t tsIndex);
|
SStorageAPI* pApi, int32_t tsIndex);
|
||||||
void initDownStream(struct SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uint16_t type, int32_t tsColIndex,
|
int32_t initDownStream(struct SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uint16_t type, int32_t tsColIndex,
|
||||||
STimeWindowAggSupp* pTwSup, struct SSteamOpBasicInfo* pBasic);
|
STimeWindowAggSupp* pTwSup, struct SSteamOpBasicInfo* pBasic);
|
||||||
void getMaxTsWins(const SArray* pAllWins, SArray* pMaxWins);
|
void getMaxTsWins(const SArray* pAllWins, SArray* pMaxWins);
|
||||||
void initGroupResInfoFromArrayList(SGroupResInfo* pGroupResInfo, SArray* pArrayList);
|
void initGroupResInfoFromArrayList(SGroupResInfo* pGroupResInfo, SArray* pArrayList);
|
||||||
|
|
|
@ -20,6 +20,7 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "executorInt.h"
|
#include "executorInt.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
void setStreamOperatorState(SSteamOpBasicInfo* pBasicInfo, EStreamType type);
|
void setStreamOperatorState(SSteamOpBasicInfo* pBasicInfo, EStreamType type);
|
||||||
bool needSaveStreamOperatorInfo(SSteamOpBasicInfo* pBasicInfo);
|
bool needSaveStreamOperatorInfo(SSteamOpBasicInfo* pBasicInfo);
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
#include "os.h"
|
#include "os.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
|
@ -1357,11 +1358,13 @@ static void destroyStreamPartitionOperatorInfo(void* param) {
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initParDownStream(SOperatorInfo* downstream, SPartitionBySupporter* pParSup, SExprSupp* pExpr, SExprSupp* pTbnameExpr) {
|
int32_t initParDownStream(SOperatorInfo* downstream, SPartitionBySupporter* pParSup, SExprSupp* pExpr, SExprSupp* pTbnameExpr) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
SStorageAPI* pAPI = &downstream->pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &downstream->pTaskInfo->storageAPI;
|
||||||
|
|
||||||
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
return;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamScanInfo* pScanInfo = downstream->info;
|
SStreamScanInfo* pScanInfo = downstream->info;
|
||||||
|
@ -1369,8 +1372,9 @@ void initParDownStream(SOperatorInfo* downstream, SPartitionBySupporter* pParSup
|
||||||
pScanInfo->pPartScalarSup = pExpr;
|
pScanInfo->pPartScalarSup = pExpr;
|
||||||
pScanInfo->pPartTbnameSup = pTbnameExpr;
|
pScanInfo->pPartTbnameSup = pTbnameExpr;
|
||||||
if (!pScanInfo->pUpdateInfo) {
|
if (!pScanInfo->pUpdateInfo) {
|
||||||
pScanInfo->pUpdateInfo = pAPI->stateStore.updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, 0, pScanInfo->igCheckUpdate, pScanInfo->pkColType, pScanInfo->pkColLen);
|
code = pAPI->stateStore.updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, 0, pScanInfo->igCheckUpdate, pScanInfo->pkColType, pScanInfo->pkColLen, &pScanInfo->pUpdateInfo);
|
||||||
}
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* buildCreateTableBlock(SExprSupp* tbName, SExprSupp* tag) {
|
SSDataBlock* buildCreateTableBlock(SExprSupp* tbName, SExprSupp* tag) {
|
||||||
|
@ -1421,6 +1425,7 @@ void freePartItem(void* ptr) {
|
||||||
SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStreamPartitionPhysiNode* pPartNode,
|
SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStreamPartitionPhysiNode* pPartNode,
|
||||||
SExecTaskInfo* pTaskInfo) {
|
SExecTaskInfo* pTaskInfo) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
SStreamPartitionOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamPartitionOperatorInfo));
|
SStreamPartitionOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamPartitionOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
|
@ -1511,14 +1516,19 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr
|
||||||
destroyStreamPartitionOperatorInfo, optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
destroyStreamPartitionOperatorInfo, optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
||||||
setOperatorStreamStateFn(pOperator, streamOpReleaseState, streamOpReloadState);
|
setOperatorStreamStateFn(pOperator, streamOpReleaseState, streamOpReloadState);
|
||||||
|
|
||||||
initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup, &pInfo->tbnameCalSup);
|
code = initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup, &pInfo->tbnameCalSup);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
pTaskInfo->code = code;
|
pTaskInfo->code = code;
|
||||||
destroyStreamPartitionOperatorInfo(pInfo);
|
destroyStreamPartitionOperatorInfo(pInfo);
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -388,9 +388,10 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableSca
|
||||||
pCost->totalCheckedRows += pBlock->info.rows;
|
pCost->totalCheckedRows += pBlock->info.rows;
|
||||||
pCost->loadBlocks += 1;
|
pCost->loadBlocks += 1;
|
||||||
|
|
||||||
SSDataBlock* p = pAPI->tsdReader.tsdReaderRetrieveDataBlock(pTableScanInfo->dataReader, NULL);
|
SSDataBlock* p = NULL;
|
||||||
if (p == NULL) {
|
int32_t code = pAPI->tsdReader.tsdReaderRetrieveDataBlock(pTableScanInfo->dataReader, &p, NULL);
|
||||||
return terrno;
|
if (p == NULL || code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(p == pBlock);
|
ASSERT(p == pBlock);
|
||||||
|
@ -1351,7 +1352,12 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasNext) {
|
if (hasNext) {
|
||||||
/*SSDataBlock* p = */ pAPI->tsdReader.tsdReaderRetrieveDataBlock(pReader, NULL);
|
SSDataBlock* p = NULL;
|
||||||
|
code = pAPI->tsdReader.tsdReaderRetrieveDataBlock(pReader, &p, NULL);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, pBlock->info.rows);
|
doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, pBlock->info.rows);
|
||||||
pBlock->info.id.groupId = tableListGetTableGroupId(pTableScanInfo->base.pTableListInfo, pBlock->info.id.uid);
|
pBlock->info.id.groupId = tableListGetTableGroupId(pTableScanInfo->base.pTableListInfo, pBlock->info.id.uid);
|
||||||
}
|
}
|
||||||
|
@ -2477,27 +2483,54 @@ static void doCheckUpdate(SStreamScanInfo* pInfo, TSKEY endKey, SSDataBlock* pBl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t streamScanOperatorEncode(SStreamScanInfo* pInfo, void** pBuff) {
|
int32_t streamScanOperatorEncode(SStreamScanInfo* pInfo, void** pBuff, int32_t* pLen) {
|
||||||
int32_t len = pInfo->stateStore.updateInfoSerialize(NULL, 0, pInfo->pUpdateInfo);
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
int32_t len = 0;
|
||||||
|
code = pInfo->stateStore.updateInfoSerialize(NULL, 0, pInfo->pUpdateInfo, &len);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
len += encodeSTimeWindowAggSupp(NULL, &pInfo->twAggSup);
|
len += encodeSTimeWindowAggSupp(NULL, &pInfo->twAggSup);
|
||||||
*pBuff = taosMemoryCalloc(1, len);
|
*pBuff = taosMemoryCalloc(1, len);
|
||||||
|
if (!(*pBuff)) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
void* buf = *pBuff;
|
void* buf = *pBuff;
|
||||||
encodeSTimeWindowAggSupp(&buf, &pInfo->twAggSup);
|
encodeSTimeWindowAggSupp(&buf, &pInfo->twAggSup);
|
||||||
pInfo->stateStore.updateInfoSerialize(buf, len, pInfo->pUpdateInfo);
|
int32_t tmp = 0;
|
||||||
return len;
|
code = pInfo->stateStore.updateInfoSerialize(buf, len, pInfo->pUpdateInfo, &tmp);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
|
*pLen = len;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void streamScanOperatorSaveCheckpoint(SStreamScanInfo* pInfo) {
|
void streamScanOperatorSaveCheckpoint(SStreamScanInfo* pInfo) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (!pInfo->pState) {
|
if (!pInfo->pState) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
if (needSaveStreamOperatorInfo(&pInfo->basic)) {
|
||||||
void* pBuf = NULL;
|
void* pBuf = NULL;
|
||||||
int32_t len = streamScanOperatorEncode(pInfo, &pBuf);
|
int32_t len = 0;
|
||||||
|
code = streamScanOperatorEncode(pInfo, &pBuf, &len);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_SCAN_OP_CHECKPOINT_NAME, strlen(STREAM_SCAN_OP_CHECKPOINT_NAME), pBuf, len);
|
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_SCAN_OP_CHECKPOINT_NAME, strlen(STREAM_SCAN_OP_CHECKPOINT_NAME), pBuf, len);
|
||||||
taosMemoryFree(pBuf);
|
taosMemoryFree(pBuf);
|
||||||
saveStreamOperatorStateComplete(&pInfo->basic);
|
saveStreamOperatorStateComplete(&pInfo->basic);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// other properties are recovered from the execution plan
|
// other properties are recovered from the execution plan
|
||||||
|
@ -2929,8 +2962,9 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
|
||||||
T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
|
T_LONG_JMP(pTaskInfo->env, pTaskInfo->code);
|
||||||
}
|
}
|
||||||
|
|
||||||
SSDataBlock* pBlock = pAPI->tsdReader.tsdReaderRetrieveDataBlock(pInfo->dataReader, NULL);
|
SSDataBlock* pBlock = NULL;
|
||||||
if (pBlock == NULL) {
|
code = pAPI->tsdReader.tsdReaderRetrieveDataBlock(pInfo->dataReader, &pBlock, NULL);
|
||||||
|
if (pBlock == NULL || code != TSDB_CODE_SUCCESS) {
|
||||||
T_LONG_JMP(pTaskInfo->env, terrno);
|
T_LONG_JMP(pTaskInfo->env, terrno);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3094,17 +3128,35 @@ static void destroyStreamScanOperatorInfo(void* param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void streamScanReleaseState(SOperatorInfo* pOperator) {
|
void streamScanReleaseState(SOperatorInfo* pOperator) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
|
void* pBuff = NULL;
|
||||||
if (!pInfo->pState) {
|
if (!pInfo->pState) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!pInfo->pUpdateInfo) {
|
if (!pInfo->pUpdateInfo) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int32_t len = pInfo->stateStore.updateInfoSerialize(NULL, 0, pInfo->pUpdateInfo);
|
int32_t len = 0;
|
||||||
void* pBuff = taosMemoryCalloc(1, len);
|
code = pInfo->stateStore.updateInfoSerialize(NULL, 0, pInfo->pUpdateInfo, &len);
|
||||||
pInfo->stateStore.updateInfoSerialize(pBuff, len, pInfo->pUpdateInfo);
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
|
pBuff = taosMemoryCalloc(1, len);
|
||||||
|
if (!pBuff) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tmp = 0;
|
||||||
|
code = pInfo->stateStore.updateInfoSerialize(pBuff, len, pInfo->pUpdateInfo, &tmp);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_SCAN_OP_STATE_NAME, strlen(STREAM_SCAN_OP_STATE_NAME), pBuff, len);
|
pInfo->stateStore.streamStateSaveInfo(pInfo->pState, STREAM_SCAN_OP_STATE_NAME, strlen(STREAM_SCAN_OP_STATE_NAME), pBuff, len);
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
taosMemoryFree(pBuff);
|
taosMemoryFree(pBuff);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -68,9 +68,7 @@ void destroyStreamCountAggOperatorInfo(void* param) {
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isSlidingCountWindow(SStreamAggSupporter* pAggSup) {
|
bool isSlidingCountWindow(SStreamAggSupporter* pAggSup) { return pAggSup->windowCount != pAggSup->windowSliding; }
|
||||||
return pAggSup->windowCount != pAggSup->windowSliding;
|
|
||||||
}
|
|
||||||
|
|
||||||
void setCountOutputBuf(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId, SCountWindowInfo* pCurWin,
|
void setCountOutputBuf(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId, SCountWindowInfo* pCurWin,
|
||||||
SBuffInfo* pBuffInfo) {
|
SBuffInfo* pBuffInfo) {
|
||||||
|
@ -95,7 +93,8 @@ void setCountOutputBuf(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId,
|
||||||
(void**)&pCurWin->winInfo.pStatePos, &size);
|
(void**)&pCurWin->winInfo.pStatePos, &size);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pBuffInfo->pCur = pAggSup->stateStore.streamStateCountSeekKeyPrev(pAggSup->pState, &pCurWin->winInfo.sessionWin, pAggSup->windowCount);
|
pBuffInfo->pCur = pAggSup->stateStore.streamStateCountSeekKeyPrev(pAggSup->pState, &pCurWin->winInfo.sessionWin,
|
||||||
|
pAggSup->windowCount);
|
||||||
code = pAggSup->stateStore.streamStateSessionGetKVByCur(pBuffInfo->pCur, &pCurWin->winInfo.sessionWin,
|
code = pAggSup->stateStore.streamStateSessionGetKVByCur(pBuffInfo->pCur, &pCurWin->winInfo.sessionWin,
|
||||||
(void**)&pCurWin->winInfo.pStatePos, &size);
|
(void**)&pCurWin->winInfo.pStatePos, &size);
|
||||||
if (code == TSDB_CODE_FAILED) {
|
if (code == TSDB_CODE_FAILED) {
|
||||||
|
@ -107,15 +106,16 @@ void setCountOutputBuf(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId,
|
||||||
pBuffInfo->rebuildWindow = true;
|
pBuffInfo->rebuildWindow = true;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
code = pAggSup->stateStore.streamStateCountWinAddIfNotExist(
|
code = pAggSup->stateStore.streamStateCountWinAddIfNotExist(pAggSup->pState, &pCurWin->winInfo.sessionWin,
|
||||||
pAggSup->pState, &pCurWin->winInfo.sessionWin, pAggSup->windowCount, (void**)&pCurWin->winInfo.pStatePos, &size);
|
pAggSup->windowCount,
|
||||||
|
(void**)&pCurWin->winInfo.pStatePos, &size);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
pCurWin->winInfo.isOutput = true;
|
pCurWin->winInfo.isOutput = true;
|
||||||
}
|
}
|
||||||
pCurWin->pWindowCount=
|
pCurWin->pWindowCount =
|
||||||
(COUNT_TYPE*) ((char*)pCurWin->winInfo.pStatePos->pRowBuff + (pAggSup->resultRowSize - sizeof(COUNT_TYPE)));
|
(COUNT_TYPE*)((char*)pCurWin->winInfo.pStatePos->pRowBuff + (pAggSup->resultRowSize - sizeof(COUNT_TYPE)));
|
||||||
|
|
||||||
if (*pCurWin->pWindowCount == pAggSup->windowCount) {
|
if (*pCurWin->pWindowCount == pAggSup->windowCount) {
|
||||||
pBuffInfo->rebuildWindow = true;
|
pBuffInfo->rebuildWindow = true;
|
||||||
|
@ -269,7 +269,7 @@ static void doStreamCountAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
}
|
}
|
||||||
getCountWinRange(pAggSup, &curWin.winInfo.sessionWin, STREAM_DELETE_DATA, &range);
|
getCountWinRange(pAggSup, &curWin.winInfo.sessionWin, STREAM_DELETE_DATA, &range);
|
||||||
range.win.skey = TMIN(startTsCols[i], range.win.skey);
|
range.win.skey = TMIN(startTsCols[i], range.win.skey);
|
||||||
range.win.ekey = TMAX(startTsCols[rows-1], range.win.ekey);
|
range.win.ekey = TMAX(startTsCols[rows - 1], range.win.ekey);
|
||||||
uint64_t uid = 0;
|
uint64_t uid = 0;
|
||||||
appendDataToSpecialBlock(pAggSup->pScanBlock, &range.win.skey, &range.win.ekey, &uid, &range.groupId, NULL);
|
appendDataToSpecialBlock(pAggSup->pScanBlock, &range.win.skey, &range.win.ekey, &uid, &range.groupId, NULL);
|
||||||
break;
|
break;
|
||||||
|
@ -289,8 +289,7 @@ static void doStreamCountAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pStUpdated) {
|
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pStUpdated) {
|
||||||
code = saveResult(curWin.winInfo, pStUpdated);
|
code = saveResult(curWin.winInfo, pStUpdated);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("%s do stream count aggregate impl, set result error, code %s", GET_TASKID(pTaskInfo),
|
qError("%s do stream count aggregate impl, set result error, code %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
||||||
tstrerror(code));
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -403,7 +402,8 @@ void* doStreamCountDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
||||||
SBuffInfo buffInfo = {.rebuildWindow = false, .winBuffOp = NONE_WINDOW, .pCur = NULL};
|
SBuffInfo buffInfo = {.rebuildWindow = false, .winBuffOp = NONE_WINDOW, .pCur = NULL};
|
||||||
setCountOutputBuf(&pInfo->streamAggSup, key.win.skey, key.groupId, &curWin, &buffInfo);
|
setCountOutputBuf(&pInfo->streamAggSup, key.win.skey, key.groupId, &curWin, &buffInfo);
|
||||||
buf = decodeSResultWindowInfo(buf, &curWin.winInfo, pInfo->streamAggSup.resultRowSize);
|
buf = decodeSResultWindowInfo(buf, &curWin.winInfo, pInfo->streamAggSup.resultRowSize);
|
||||||
tSimpleHashPut(pInfo->streamAggSup.pResultRows, &key, sizeof(SSessionKey), &curWin.winInfo, sizeof(SResultWindowInfo));
|
tSimpleHashPut(pInfo->streamAggSup.pResultRows, &key, sizeof(SSessionKey), &curWin.winInfo,
|
||||||
|
sizeof(SResultWindowInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2.twAggSup
|
// 2.twAggSup
|
||||||
|
@ -452,7 +452,7 @@ void doResetCountWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock) {
|
||||||
}
|
}
|
||||||
while (1) {
|
while (1) {
|
||||||
SSessionKey tmpKey = {.groupId = gpDatas[i], .win.skey = INT64_MIN, .win.ekey = INT64_MIN};
|
SSessionKey tmpKey = {.groupId = gpDatas[i], .win.skey = INT64_MIN, .win.ekey = INT64_MIN};
|
||||||
int32_t code = pAggSup->stateStore.streamStateSessionGetKVByCur(pCur, &tmpKey, (void **)&pPos, &size);
|
int32_t code = pAggSup->stateStore.streamStateSessionGetKVByCur(pCur, &tmpKey, (void**)&pPos, &size);
|
||||||
if (code != TSDB_CODE_SUCCESS || tmpKey.win.skey > endDatas[i]) {
|
if (code != TSDB_CODE_SUCCESS || tmpKey.win.skey > endDatas[i]) {
|
||||||
pAggSup->stateStore.streamStateFreeCur(pCur);
|
pAggSup->stateStore.streamStateFreeCur(pCur);
|
||||||
break;
|
break;
|
||||||
|
@ -650,11 +650,13 @@ SOperatorInfo* createStreamCountAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
SExecTaskInfo* pTaskInfo, SReadHandle* pHandle) {
|
SExecTaskInfo* pTaskInfo, SReadHandle* pHandle) {
|
||||||
SCountWinodwPhysiNode* pCountNode = (SCountWinodwPhysiNode*)pPhyNode;
|
SCountWinodwPhysiNode* pCountNode = (SCountWinodwPhysiNode*)pPhyNode;
|
||||||
int32_t numOfCols = 0;
|
int32_t numOfCols = 0;
|
||||||
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
SStreamCountAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamCountAggOperatorInfo));
|
SStreamCountAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamCountAggOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
goto _error;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
|
|
||||||
pOperator->pTaskInfo = pTaskInfo;
|
pOperator->pTaskInfo = pTaskInfo;
|
||||||
|
@ -664,18 +666,14 @@ SOperatorInfo* createStreamCountAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
int32_t numOfScalar = 0;
|
int32_t numOfScalar = 0;
|
||||||
SExprInfo* pScalarExprInfo = createExprInfo(pCountNode->window.pExprs, NULL, &numOfScalar);
|
SExprInfo* pScalarExprInfo = createExprInfo(pCountNode->window.pExprs, NULL, &numOfScalar);
|
||||||
code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar, &pTaskInfo->storageAPI.functionStore);
|
code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar, &pTaskInfo->storageAPI.functionStore);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
SExprSupp* pExpSup = &pOperator->exprSupp;
|
SExprSupp* pExpSup = &pOperator->exprSupp;
|
||||||
|
|
||||||
SExprInfo* pExprInfo = createExprInfo(pCountNode->window.pFuncs, NULL, &numOfCols);
|
SExprInfo* pExprInfo = createExprInfo(pCountNode->window.pFuncs, NULL, &numOfCols);
|
||||||
SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
|
SSDataBlock* pResBlock = createDataBlockFromDescNode(pPhyNode->pOutputDataBlockDesc);
|
||||||
code = initBasicInfoEx(&pInfo->binfo, pExpSup, pExprInfo, numOfCols, pResBlock, &pTaskInfo->storageAPI.functionStore);
|
code = initBasicInfoEx(&pInfo->binfo, pExpSup, pExprInfo, numOfCols, pResBlock, &pTaskInfo->storageAPI.functionStore);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
|
|
||||||
pInfo->twAggSup = (STimeWindowAggSupp){
|
pInfo->twAggSup = (STimeWindowAggSupp){
|
||||||
.waterMark = pCountNode->window.watermark,
|
.waterMark = pCountNode->window.watermark,
|
||||||
|
@ -686,12 +684,11 @@ SOperatorInfo* createStreamCountAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
};
|
};
|
||||||
|
|
||||||
pInfo->primaryTsIndex = ((SColumnNode*)pCountNode->window.pTspk)->slotId;
|
pInfo->primaryTsIndex = ((SColumnNode*)pCountNode->window.pTspk)->slotId;
|
||||||
code = initStreamAggSupporter(&pInfo->streamAggSup, pExpSup, numOfCols, 0,
|
code = initStreamAggSupporter(&pInfo->streamAggSup, pExpSup, numOfCols, 0, pTaskInfo->streamInfo.pState,
|
||||||
pTaskInfo->streamInfo.pState, sizeof(COUNT_TYPE), 0, &pTaskInfo->storageAPI.stateStore, pHandle,
|
sizeof(COUNT_TYPE), 0, &pTaskInfo->storageAPI.stateStore, pHandle, &pInfo->twAggSup,
|
||||||
&pInfo->twAggSup, GET_TASKID(pTaskInfo), &pTaskInfo->storageAPI, pInfo->primaryTsIndex);
|
GET_TASKID(pTaskInfo), &pTaskInfo->storageAPI, pInfo->primaryTsIndex);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
pInfo->streamAggSup.windowCount = pCountNode->windowCount;
|
pInfo->streamAggSup.windowCount = pCountNode->windowCount;
|
||||||
pInfo->streamAggSup.windowSliding = pCountNode->windowSliding;
|
pInfo->streamAggSup.windowSliding = pCountNode->windowSliding;
|
||||||
|
|
||||||
|
@ -709,7 +706,8 @@ SOperatorInfo* createStreamCountAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
pInfo->dataVersion = 0;
|
pInfo->dataVersion = 0;
|
||||||
pInfo->historyWins = taosArrayInit(4, sizeof(SSessionKey));
|
pInfo->historyWins = taosArrayInit(4, sizeof(SSessionKey));
|
||||||
if (!pInfo->historyWins) {
|
if (!pInfo->historyWins) {
|
||||||
goto _error;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->pCheckpointRes = createSpecialDataBlock(STREAM_CHECKPOINT);
|
pInfo->pCheckpointRes = createSpecialDataBlock(STREAM_CHECKPOINT);
|
||||||
|
@ -735,8 +733,12 @@ SOperatorInfo* createStreamCountAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
setOperatorStreamStateFn(pOperator, streamCountReleaseState, streamCountReloadState);
|
setOperatorStreamStateFn(pOperator, streamCountReleaseState, streamCountReloadState);
|
||||||
|
|
||||||
if (downstream) {
|
if (downstream) {
|
||||||
initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex, &pInfo->twAggSup, &pInfo->basic);
|
code = initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex,
|
||||||
|
&pInfo->twAggSup, &pInfo->basic);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
||||||
|
@ -747,6 +749,6 @@ _error:
|
||||||
|
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
pTaskInfo->code = code;
|
pTaskInfo->code = code;
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -86,10 +86,11 @@ void destroyStreamEventOperatorInfo(void* param) {
|
||||||
|
|
||||||
void setEventWindowFlag(SStreamAggSupporter* pAggSup, SEventWindowInfo* pWinInfo) {
|
void setEventWindowFlag(SStreamAggSupporter* pAggSup, SEventWindowInfo* pWinInfo) {
|
||||||
char* pFlagInfo = (char*)pWinInfo->winInfo.pStatePos->pRowBuff + (pAggSup->resultRowSize - pAggSup->stateKeySize);
|
char* pFlagInfo = (char*)pWinInfo->winInfo.pStatePos->pRowBuff + (pAggSup->resultRowSize - pAggSup->stateKeySize);
|
||||||
pWinInfo->pWinFlag = (SEventWinfowFlag*) pFlagInfo;
|
pWinInfo->pWinFlag = (SEventWinfowFlag*)pFlagInfo;
|
||||||
}
|
}
|
||||||
|
|
||||||
void setEventWindowInfo(SStreamAggSupporter* pAggSup, SSessionKey* pKey, SRowBuffPos* pPos, SEventWindowInfo* pWinInfo) {
|
void setEventWindowInfo(SStreamAggSupporter* pAggSup, SSessionKey* pKey, SRowBuffPos* pPos,
|
||||||
|
SEventWindowInfo* pWinInfo) {
|
||||||
pWinInfo->winInfo.sessionWin = *pKey;
|
pWinInfo->winInfo.sessionWin = *pKey;
|
||||||
pWinInfo->winInfo.pStatePos = pPos;
|
pWinInfo->winInfo.pStatePos = pPos;
|
||||||
setEventWindowFlag(pAggSup, pWinInfo);
|
setEventWindowFlag(pAggSup, pWinInfo);
|
||||||
|
@ -122,15 +123,16 @@ void setEventOutputBuf(SStreamAggSupporter* pAggSup, TSKEY* pTs, uint64_t groupI
|
||||||
pCurWin->winInfo.sessionWin.groupId = groupId;
|
pCurWin->winInfo.sessionWin.groupId = groupId;
|
||||||
pCurWin->winInfo.sessionWin.win.skey = ts;
|
pCurWin->winInfo.sessionWin.win.skey = ts;
|
||||||
pCurWin->winInfo.sessionWin.win.ekey = ts;
|
pCurWin->winInfo.sessionWin.win.ekey = ts;
|
||||||
SStreamStateCur* pCur = pAggSup->stateStore.streamStateSessionSeekKeyCurrentPrev(pAggSup->pState, &pCurWin->winInfo.sessionWin);
|
SStreamStateCur* pCur =
|
||||||
|
pAggSup->stateStore.streamStateSessionSeekKeyCurrentPrev(pAggSup->pState, &pCurWin->winInfo.sessionWin);
|
||||||
SSessionKey leftWinKey = {.groupId = groupId};
|
SSessionKey leftWinKey = {.groupId = groupId};
|
||||||
void* pVal = NULL;
|
void* pVal = NULL;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
code = pAggSup->stateStore.streamStateSessionGetKVByCur(pCur, &leftWinKey, &pVal, &len);
|
code = pAggSup->stateStore.streamStateSessionGetKVByCur(pCur, &leftWinKey, &pVal, &len);
|
||||||
if (code == TSDB_CODE_SUCCESS && inWinRange(&pAggSup->winRange, &leftWinKey.win) ) {
|
if (code == TSDB_CODE_SUCCESS && inWinRange(&pAggSup->winRange, &leftWinKey.win)) {
|
||||||
bool inWin = isInTimeWindow(&leftWinKey.win, ts, 0);
|
bool inWin = isInTimeWindow(&leftWinKey.win, ts, 0);
|
||||||
setEventWindowInfo(pAggSup, &leftWinKey, pVal, pCurWin);
|
setEventWindowInfo(pAggSup, &leftWinKey, pVal, pCurWin);
|
||||||
if(inWin || (pCurWin->pWinFlag->startFlag && !pCurWin->pWinFlag->endFlag) ) {
|
if (inWin || (pCurWin->pWinFlag->startFlag && !pCurWin->pWinFlag->endFlag)) {
|
||||||
pCurWin->winInfo.isOutput = !isWindowIncomplete(pCurWin);
|
pCurWin->winInfo.isOutput = !isWindowIncomplete(pCurWin);
|
||||||
goto _end;
|
goto _end;
|
||||||
}
|
}
|
||||||
|
@ -164,7 +166,7 @@ _end:
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
SET_SESSION_WIN_KEY_INVALID(pNextWinKey);
|
SET_SESSION_WIN_KEY_INVALID(pNextWinKey);
|
||||||
}
|
}
|
||||||
if(pCurWin->winInfo.pStatePos->needFree) {
|
if (pCurWin->winInfo.pStatePos->needFree) {
|
||||||
pAggSup->stateStore.streamStateSessionDel(pAggSup->pState, &pCurWin->winInfo.sessionWin);
|
pAggSup->stateStore.streamStateSessionDel(pAggSup->pState, &pCurWin->winInfo.sessionWin);
|
||||||
}
|
}
|
||||||
pAggSup->stateStore.streamStateFreeCur(pCur);
|
pAggSup->stateStore.streamStateFreeCur(pCur);
|
||||||
|
@ -173,10 +175,10 @@ _end:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t updateEventWindowInfo(SStreamAggSupporter* pAggSup, SEventWindowInfo* pWinInfo, SSessionKey* pNextWinKey,
|
int32_t updateEventWindowInfo(SStreamAggSupporter* pAggSup, SEventWindowInfo* pWinInfo, SSessionKey* pNextWinKey,
|
||||||
TSKEY* pTsData, bool* starts, bool* ends, int32_t rows, int32_t start, SSHashObj* pResultRows,
|
TSKEY* pTsData, bool* starts, bool* ends, int32_t rows, int32_t start,
|
||||||
SSHashObj* pStUpdated, SSHashObj* pStDeleted, bool* pRebuild) {
|
SSHashObj* pResultRows, SSHashObj* pStUpdated, SSHashObj* pStDeleted, bool* pRebuild) {
|
||||||
*pRebuild = false;
|
*pRebuild = false;
|
||||||
if (!pWinInfo->pWinFlag->startFlag && !(starts[start]) ) {
|
if (!pWinInfo->pWinFlag->startFlag && !(starts[start])) {
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +221,7 @@ int32_t updateEventWindowInfo(SStreamAggSupporter* pAggSup, SEventWindowInfo* pW
|
||||||
memcpy(pWinInfo->winInfo.pStatePos->pKey, &pWinInfo->winInfo.sessionWin, sizeof(SSessionKey));
|
memcpy(pWinInfo->winInfo.pStatePos->pKey, &pWinInfo->winInfo.sessionWin, sizeof(SSessionKey));
|
||||||
|
|
||||||
if (ends[i]) {
|
if (ends[i]) {
|
||||||
if (pWinInfo->pWinFlag->endFlag && pWin->skey <= pTsData[i] && pTsData[i] < pWin->ekey ) {
|
if (pWinInfo->pWinFlag->endFlag && pWin->skey <= pTsData[i] && pTsData[i] < pWin->ekey) {
|
||||||
*pRebuild = true;
|
*pRebuild = true;
|
||||||
}
|
}
|
||||||
return i + 1 - start;
|
return i + 1 - start;
|
||||||
|
@ -244,12 +246,14 @@ static int32_t compactEventWindow(SOperatorInfo* pOperator, SEventWindowInfo* pC
|
||||||
}
|
}
|
||||||
SEventWindowInfo nextWinInfo = {0};
|
SEventWindowInfo nextWinInfo = {0};
|
||||||
getNextSessionWinInfo(pAggSup, pStUpdated, &pCurWin->winInfo, &nextWinInfo.winInfo);
|
getNextSessionWinInfo(pAggSup, pStUpdated, &pCurWin->winInfo, &nextWinInfo.winInfo);
|
||||||
if (!IS_VALID_SESSION_WIN(nextWinInfo.winInfo) || !inWinRange(&pAggSup->winRange, &nextWinInfo.winInfo.sessionWin.win)) {
|
if (!IS_VALID_SESSION_WIN(nextWinInfo.winInfo) ||
|
||||||
|
!inWinRange(&pAggSup->winRange, &nextWinInfo.winInfo.sessionWin.win)) {
|
||||||
releaseOutputBuf(pAggSup->pState, nextWinInfo.winInfo.pStatePos, &pAggSup->pSessionAPI->stateStore);
|
releaseOutputBuf(pAggSup->pState, nextWinInfo.winInfo.pStatePos, &pAggSup->pSessionAPI->stateStore);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
setEventWindowFlag(pAggSup, &nextWinInfo);
|
setEventWindowFlag(pAggSup, &nextWinInfo);
|
||||||
compactTimeWindow(pSup, pAggSup, &pInfo->twAggSup, pTaskInfo, &pCurWin->winInfo, &nextWinInfo.winInfo, pStUpdated, pStDeleted, false);
|
compactTimeWindow(pSup, pAggSup, &pInfo->twAggSup, pTaskInfo, &pCurWin->winInfo, &nextWinInfo.winInfo, pStUpdated,
|
||||||
|
pStDeleted, false);
|
||||||
pCurWin->pWinFlag->endFlag = nextWinInfo.pWinFlag->endFlag;
|
pCurWin->pWinFlag->endFlag = nextWinInfo.pWinFlag->endFlag;
|
||||||
winNum++;
|
winNum++;
|
||||||
}
|
}
|
||||||
|
@ -290,7 +294,8 @@ static void doStreamEventAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SFilterColumnParam paramStart = {.numOfCols = taosArrayGetSize(pSDataBlock->pDataBlock), .pDataBlock = pSDataBlock->pDataBlock};
|
SFilterColumnParam paramStart = {.numOfCols = taosArrayGetSize(pSDataBlock->pDataBlock),
|
||||||
|
.pDataBlock = pSDataBlock->pDataBlock};
|
||||||
code = filterSetDataFromSlotId(pInfo->pStartCondInfo, ¶mStart);
|
code = filterSetDataFromSlotId(pInfo->pStartCondInfo, ¶mStart);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("set data from start slotId error.");
|
qError("set data from start slotId error.");
|
||||||
|
@ -299,7 +304,8 @@ static void doStreamEventAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
int32_t statusStart = 0;
|
int32_t statusStart = 0;
|
||||||
filterExecute(pInfo->pStartCondInfo, pSDataBlock, &pColStart, NULL, paramStart.numOfCols, &statusStart);
|
filterExecute(pInfo->pStartCondInfo, pSDataBlock, &pColStart, NULL, paramStart.numOfCols, &statusStart);
|
||||||
|
|
||||||
SFilterColumnParam paramEnd = {.numOfCols = taosArrayGetSize(pSDataBlock->pDataBlock), .pDataBlock = pSDataBlock->pDataBlock};
|
SFilterColumnParam paramEnd = {.numOfCols = taosArrayGetSize(pSDataBlock->pDataBlock),
|
||||||
|
.pDataBlock = pSDataBlock->pDataBlock};
|
||||||
code = filterSetDataFromSlotId(pInfo->pEndCondInfo, ¶mEnd);
|
code = filterSetDataFromSlotId(pInfo->pEndCondInfo, ¶mEnd);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
qError("set data from end slotId error.");
|
qError("set data from end slotId error.");
|
||||||
|
@ -321,11 +327,13 @@ static void doStreamEventAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
bool allEqual = true;
|
bool allEqual = true;
|
||||||
SEventWindowInfo curWin = {0};
|
SEventWindowInfo curWin = {0};
|
||||||
SSessionKey nextWinKey = {0};
|
SSessionKey nextWinKey = {0};
|
||||||
setEventOutputBuf(pAggSup, tsCols, groupId, (bool*)pColStart->pData, (bool*)pColEnd->pData, i, rows, &curWin, &nextWinKey);
|
setEventOutputBuf(pAggSup, tsCols, groupId, (bool*)pColStart->pData, (bool*)pColEnd->pData, i, rows, &curWin,
|
||||||
|
&nextWinKey);
|
||||||
setSessionWinOutputInfo(pSeUpdated, &curWin.winInfo);
|
setSessionWinOutputInfo(pSeUpdated, &curWin.winInfo);
|
||||||
bool rebuild = false;
|
bool rebuild = false;
|
||||||
winRows = updateEventWindowInfo(pAggSup, &curWin, &nextWinKey, tsCols, (bool*)pColStart->pData, (bool*)pColEnd->pData, rows, i,
|
winRows =
|
||||||
pAggSup->pResultRows, pSeUpdated, pStDeleted, &rebuild);
|
updateEventWindowInfo(pAggSup, &curWin, &nextWinKey, tsCols, (bool*)pColStart->pData, (bool*)pColEnd->pData,
|
||||||
|
rows, i, pAggSup->pResultRows, pSeUpdated, pStDeleted, &rebuild);
|
||||||
ASSERT(winRows >= 1);
|
ASSERT(winRows >= 1);
|
||||||
if (rebuild) {
|
if (rebuild) {
|
||||||
uint64_t uid = 0;
|
uint64_t uid = 0;
|
||||||
|
@ -333,7 +341,8 @@ static void doStreamEventAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
|
||||||
&curWin.winInfo.sessionWin.win.ekey, &uid, &groupId, NULL);
|
&curWin.winInfo.sessionWin.win.ekey, &uid, &groupId, NULL);
|
||||||
tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey));
|
tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey));
|
||||||
doDeleteEventWindow(pAggSup, pSeUpdated, &curWin.winInfo.sessionWin);
|
doDeleteEventWindow(pAggSup, pSeUpdated, &curWin.winInfo.sessionWin);
|
||||||
if (pInfo->destHasPrimaryKey && curWin.winInfo.isOutput && IS_NORMAL_EVENT_OP(pOperator) && !isWindowIncomplete(&curWin)) {
|
if (pInfo->destHasPrimaryKey && curWin.winInfo.isOutput && IS_NORMAL_EVENT_OP(pOperator) &&
|
||||||
|
!isWindowIncomplete(&curWin)) {
|
||||||
saveDeleteRes(pInfo->pPkDeleted, curWin.winInfo.sessionWin);
|
saveDeleteRes(pInfo->pPkDeleted, curWin.winInfo.sessionWin);
|
||||||
}
|
}
|
||||||
releaseOutputBuf(pAggSup->pState, curWin.winInfo.pStatePos, &pAPI->stateStore);
|
releaseOutputBuf(pAggSup->pState, curWin.winInfo.pStatePos, &pAPI->stateStore);
|
||||||
|
@ -603,7 +612,8 @@ void streamEventReleaseState(SOperatorInfo* pOperator) {
|
||||||
char* pBuff = taosMemoryCalloc(1, resSize);
|
char* pBuff = taosMemoryCalloc(1, resSize);
|
||||||
memcpy(pBuff, pInfo->historyWins->pData, winSize);
|
memcpy(pBuff, pInfo->historyWins->pData, winSize);
|
||||||
memcpy(pBuff + winSize, &pInfo->twAggSup.maxTs, sizeof(TSKEY));
|
memcpy(pBuff + winSize, &pInfo->twAggSup.maxTs, sizeof(TSKEY));
|
||||||
qDebug("===stream=== event window operator relase state. save result count:%d", (int32_t)taosArrayGetSize(pInfo->historyWins));
|
qDebug("===stream=== event window operator relase state. save result count:%d",
|
||||||
|
(int32_t)taosArrayGetSize(pInfo->historyWins));
|
||||||
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_EVENT_OP_STATE_NAME,
|
pInfo->streamAggSup.stateStore.streamStateSaveInfo(pInfo->streamAggSup.pState, STREAM_EVENT_OP_STATE_NAME,
|
||||||
strlen(STREAM_EVENT_OP_STATE_NAME), pBuff, resSize);
|
strlen(STREAM_EVENT_OP_STATE_NAME), pBuff, resSize);
|
||||||
pInfo->streamAggSup.stateStore.streamStateCommit(pInfo->streamAggSup.pState);
|
pInfo->streamAggSup.stateStore.streamStateCommit(pInfo->streamAggSup.pState);
|
||||||
|
@ -647,7 +657,7 @@ void streamEventReloadState(SOperatorInfo* pOperator) {
|
||||||
qDebug("===stream=== reload state. try process result %" PRId64 ", %" PRIu64 ", index:%d", pSeKeyBuf[i].win.skey,
|
qDebug("===stream=== reload state. try process result %" PRId64 ", %" PRIu64 ", index:%d", pSeKeyBuf[i].win.skey,
|
||||||
pSeKeyBuf[i].groupId, i);
|
pSeKeyBuf[i].groupId, i);
|
||||||
getSessionWindowInfoByKey(pAggSup, pSeKeyBuf + i, &curInfo.winInfo);
|
getSessionWindowInfoByKey(pAggSup, pSeKeyBuf + i, &curInfo.winInfo);
|
||||||
//event window has been deleted
|
// event window has been deleted
|
||||||
if (!IS_VALID_SESSION_WIN(curInfo.winInfo)) {
|
if (!IS_VALID_SESSION_WIN(curInfo.winInfo)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -693,6 +703,7 @@ SOperatorInfo* createStreamEventAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
SStreamEventWinodwPhysiNode* pEventNode = (SStreamEventWinodwPhysiNode*)pPhyNode;
|
SStreamEventWinodwPhysiNode* pEventNode = (SStreamEventWinodwPhysiNode*)pPhyNode;
|
||||||
int32_t tsSlotId = ((SColumnNode*)pEventNode->window.pTspk)->slotId;
|
int32_t tsSlotId = ((SColumnNode*)pEventNode->window.pTspk)->slotId;
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
SStreamEventAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamEventAggOperatorInfo));
|
SStreamEventAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamEventAggOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
|
@ -783,20 +794,18 @@ SOperatorInfo* createStreamEventAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamEventAgg, NULL, destroyStreamEventOperatorInfo,
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamEventAgg, NULL, destroyStreamEventOperatorInfo,
|
||||||
optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
||||||
setOperatorStreamStateFn(pOperator, streamEventReleaseState, streamEventReloadState);
|
setOperatorStreamStateFn(pOperator, streamEventReleaseState, streamEventReloadState);
|
||||||
initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex, &pInfo->twAggSup, &pInfo->basic);
|
code = initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex,
|
||||||
|
&pInfo->twAggSup, &pInfo->basic);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
|
|
||||||
code = filterInitFromNode((SNode*)pEventNode->pStartCond, &pInfo->pStartCondInfo, 0);
|
code = filterInitFromNode((SNode*)pEventNode->pStartCond, &pInfo->pStartCondInfo, 0);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
code = filterInitFromNode((SNode*)pEventNode->pEndCond, &pInfo->pEndCondInfo, 0);
|
code = filterInitFromNode((SNode*)pEventNode->pEndCond, &pInfo->pEndCondInfo, 0);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
|
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
||||||
|
@ -804,5 +813,6 @@ _error:
|
||||||
destroyStreamEventOperatorInfo(pInfo);
|
destroyStreamEventOperatorInfo(pInfo);
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
pTaskInfo->code = code;
|
pTaskInfo->code = code;
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,10 +30,14 @@
|
||||||
|
|
||||||
#define IS_FINAL_INTERVAL_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL)
|
#define IS_FINAL_INTERVAL_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL)
|
||||||
#define IS_MID_INTERVAL_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_MID_INTERVAL)
|
#define IS_MID_INTERVAL_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_MID_INTERVAL)
|
||||||
#define IS_NORMAL_INTERVAL_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL || (op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL)
|
#define IS_NORMAL_INTERVAL_OP(op) \
|
||||||
|
((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL || \
|
||||||
|
(op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_INTERVAL)
|
||||||
|
|
||||||
#define IS_FINAL_SESSION_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION)
|
#define IS_FINAL_SESSION_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION)
|
||||||
#define IS_NORMAL_SESSION_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION || (op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION)
|
#define IS_NORMAL_SESSION_OP(op) \
|
||||||
|
((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION || \
|
||||||
|
(op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION)
|
||||||
|
|
||||||
#define IS_NORMAL_STATE_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE)
|
#define IS_NORMAL_STATE_OP(op) ((op)->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE)
|
||||||
|
|
||||||
|
@ -263,14 +267,16 @@ static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, SSDa
|
||||||
if (chIds) {
|
if (chIds) {
|
||||||
int32_t childId = getChildIndex(pBlock);
|
int32_t childId = getChildIndex(pBlock);
|
||||||
if (pInvalidWins) {
|
if (pInvalidWins) {
|
||||||
qDebug("===stream===save invalid delete window:%" PRId64 ",groupId:%" PRId64 ",chId:%d", winRes.ts, winRes.groupId, childId);
|
qDebug("===stream===save invalid delete window:%" PRId64 ",groupId:%" PRId64 ",chId:%d", winRes.ts,
|
||||||
|
winRes.groupId, childId);
|
||||||
taosHashPut(pInvalidWins, &winRes, sizeof(SWinKey), NULL, 0);
|
taosHashPut(pInvalidWins, &winRes, sizeof(SWinKey), NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
SArray* chArray = *(void**)chIds;
|
SArray* chArray = *(void**)chIds;
|
||||||
int32_t index = taosArraySearchIdx(chArray, &childId, compareInt32Val, TD_EQ);
|
int32_t index = taosArraySearchIdx(chArray, &childId, compareInt32Val, TD_EQ);
|
||||||
if (index != -1) {
|
if (index != -1) {
|
||||||
qDebug("===stream===try push delete window:%" PRId64 ",groupId:%" PRId64 ",chId:%d ,continue", win.skey, winGpId, childId);
|
qDebug("===stream===try push delete window:%" PRId64 ",groupId:%" PRId64 ",chId:%d ,continue", win.skey,
|
||||||
|
winGpId, childId);
|
||||||
getNextTimeWindow(pInterval, &win, TSDB_ORDER_ASC);
|
getNextTimeWindow(pInterval, &win, TSDB_ORDER_ASC);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -390,7 +396,7 @@ static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWin
|
||||||
}
|
}
|
||||||
|
|
||||||
void destroyFlusedPos(void* pRes) {
|
void destroyFlusedPos(void* pRes) {
|
||||||
SRowBuffPos* pPos = (SRowBuffPos*) pRes;
|
SRowBuffPos* pPos = (SRowBuffPos*)pRes;
|
||||||
if (!pPos->needFree && !pPos->pRowBuff) {
|
if (!pPos->needFree && !pPos->pRowBuff) {
|
||||||
taosMemoryFreeClear(pPos->pKey);
|
taosMemoryFreeClear(pPos->pKey);
|
||||||
taosMemoryFree(pPos);
|
taosMemoryFree(pPos);
|
||||||
|
@ -488,8 +494,11 @@ void initIntervalDownStream(SOperatorInfo* downstream, uint16_t type, SStreamInt
|
||||||
pScanInfo->windowSup.parentType = type;
|
pScanInfo->windowSup.parentType = type;
|
||||||
pScanInfo->windowSup.pIntervalAggSup = &pInfo->aggSup;
|
pScanInfo->windowSup.pIntervalAggSup = &pInfo->aggSup;
|
||||||
if (!pScanInfo->pUpdateInfo) {
|
if (!pScanInfo->pUpdateInfo) {
|
||||||
pScanInfo->pUpdateInfo =
|
int32_t code = pAPI->updateInfoInitP(&pInfo->interval, pInfo->twAggSup.waterMark, pScanInfo->igCheckUpdate,
|
||||||
pAPI->updateInfoInitP(&pInfo->interval, pInfo->twAggSup.waterMark, pScanInfo->igCheckUpdate, pScanInfo->pkColType, pScanInfo->pkColLen);
|
pScanInfo->pkColType, pScanInfo->pkColLen, &pScanInfo->pUpdateInfo);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at %d since %s", __func__, __LINE__, tstrerror(code));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pScanInfo->interval = pInfo->interval;
|
pScanInfo->interval = pInfo->interval;
|
||||||
|
@ -624,8 +633,8 @@ static void doBuildPullDataBlock(SArray* array, int32_t* pIndex, SSDataBlock* pB
|
||||||
blockDataUpdateTsWindow(pBlock, 0);
|
blockDataUpdateTsWindow(pBlock, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SHashObj* pFinalMap, SInterval* pInterval, SArray* pPullWins,
|
static bool processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SHashObj* pFinalMap, SInterval* pInterval,
|
||||||
int32_t numOfCh, SOperatorInfo* pOperator) {
|
SArray* pPullWins, int32_t numOfCh, SOperatorInfo* pOperator) {
|
||||||
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
|
||||||
SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX);
|
SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX);
|
||||||
TSKEY* tsData = (TSKEY*)pStartCol->pData;
|
TSKEY* tsData = (TSKEY*)pStartCol->pData;
|
||||||
|
@ -650,7 +659,7 @@ static bool processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SHashObj* pFina
|
||||||
// pull data is over
|
// pull data is over
|
||||||
taosArrayDestroy(chArray);
|
taosArrayDestroy(chArray);
|
||||||
taosHashRemove(pMap, &winRes, sizeof(SWinKey));
|
taosHashRemove(pMap, &winRes, sizeof(SWinKey));
|
||||||
res =true;
|
res = true;
|
||||||
qDebug("===stream===retrive pull data over.window %" PRId64, winRes.ts);
|
qDebug("===stream===retrive pull data over.window %" PRId64, winRes.ts);
|
||||||
|
|
||||||
void* pFinalCh = taosHashGet(pFinalMap, &winRes, sizeof(SWinKey));
|
void* pFinalCh = taosHashGet(pFinalMap, &winRes, sizeof(SWinKey));
|
||||||
|
@ -663,7 +672,8 @@ static bool processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SHashObj* pFina
|
||||||
.calWin.skey = nextWin.skey,
|
.calWin.skey = nextWin.skey,
|
||||||
.calWin.ekey = nextWin.skey};
|
.calWin.ekey = nextWin.skey};
|
||||||
// add pull data request
|
// add pull data request
|
||||||
qDebug("===stream===prepare final retrive for delete window:%" PRId64 ",groupId:%" PRId64 ", size:%d", winRes.ts, winRes.groupId, numOfCh);
|
qDebug("===stream===prepare final retrive for delete window:%" PRId64 ",groupId:%" PRId64 ", size:%d",
|
||||||
|
winRes.ts, winRes.groupId, numOfCh);
|
||||||
if (IS_MID_INTERVAL_OP(pOperator)) {
|
if (IS_MID_INTERVAL_OP(pOperator)) {
|
||||||
SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)pOperator->info;
|
SStreamIntervalOperatorInfo* pInfo = (SStreamIntervalOperatorInfo*)pOperator->info;
|
||||||
taosArrayPush(pInfo->pMidPullDatas, &winRes);
|
taosArrayPush(pInfo->pMidPullDatas, &winRes);
|
||||||
|
@ -671,7 +681,7 @@ static bool processPullOver(SSDataBlock* pBlock, SHashObj* pMap, SHashObj* pFina
|
||||||
taosArrayPush(pInfo->pDelWins, &winRes);
|
taosArrayPush(pInfo->pDelWins, &winRes);
|
||||||
addPullWindow(pMap, &winRes, numOfCh);
|
addPullWindow(pMap, &winRes, numOfCh);
|
||||||
if (pInfo->destHasPrimaryKey) {
|
if (pInfo->destHasPrimaryKey) {
|
||||||
tSimpleHashPut(pInfo->pDeletedMap,&winRes, sizeof(SWinKey), NULL, 0);
|
tSimpleHashPut(pInfo->pDeletedMap, &winRes, sizeof(SWinKey), NULL, 0);
|
||||||
}
|
}
|
||||||
qDebug("===stream===prepare final retrive for delete %" PRId64 ", size:%d", winRes.ts, numOfCh);
|
qDebug("===stream===prepare final retrive for delete %" PRId64 ", size:%d", winRes.ts, numOfCh);
|
||||||
}
|
}
|
||||||
|
@ -698,7 +708,7 @@ static void addRetriveWindow(SArray* wins, SStreamIntervalOperatorInfo* pInfo, i
|
||||||
if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
|
if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
|
||||||
addPullWindow(pInfo->pPullDataMap, winKey, pInfo->numOfChild);
|
addPullWindow(pInfo->pPullDataMap, winKey, pInfo->numOfChild);
|
||||||
if (pInfo->destHasPrimaryKey) {
|
if (pInfo->destHasPrimaryKey) {
|
||||||
tSimpleHashPut(pInfo->pDeletedMap,winKey, sizeof(SWinKey), NULL, 0);
|
tSimpleHashPut(pInfo->pDeletedMap, winKey, sizeof(SWinKey), NULL, 0);
|
||||||
}
|
}
|
||||||
qDebug("===stream===prepare retrive for delete %" PRId64 ", size:%d", winKey->ts, pInfo->numOfChild);
|
qDebug("===stream===prepare retrive for delete %" PRId64 ", size:%d", winKey->ts, pInfo->numOfChild);
|
||||||
}
|
}
|
||||||
|
@ -751,7 +761,8 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, void* pState, SSDat
|
||||||
if (pBlock->info.id.groupId == 0) {
|
if (pBlock->info.id.groupId == 0) {
|
||||||
pBlock->info.id.groupId = groupId;
|
pBlock->info.id.groupId = groupId;
|
||||||
void* tbname = NULL;
|
void* tbname = NULL;
|
||||||
if (pAPI->stateStore.streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname, false) < 0) {
|
if (pAPI->stateStore.streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname,
|
||||||
|
false) < 0) {
|
||||||
pBlock->info.parTbName[0] = 0;
|
pBlock->info.parTbName[0] = 0;
|
||||||
} else {
|
} else {
|
||||||
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
|
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
|
||||||
|
@ -829,9 +840,7 @@ static int32_t getNextQualifiedFinalWindow(SInterval* pInterval, STimeWindow* pN
|
||||||
return startPos;
|
return startPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool hasSrcPrimaryKeyCol(SSteamOpBasicInfo* pInfo) {
|
bool hasSrcPrimaryKeyCol(SSteamOpBasicInfo* pInfo) { return pInfo->primaryPkIndex != -1; }
|
||||||
return pInfo->primaryPkIndex != -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void doStreamIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, uint64_t groupId,
|
static void doStreamIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, uint64_t groupId,
|
||||||
SSHashObj* pUpdatedMap, SSHashObj* pDeletedMap) {
|
SSHashObj* pUpdatedMap, SSHashObj* pDeletedMap) {
|
||||||
|
@ -860,8 +869,7 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDat
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pSDataBlock->info.window.skey != tsCols[0] || pSDataBlock->info.window.ekey != tsCols[endRowId]) {
|
if (pSDataBlock->info.window.skey != tsCols[0] || pSDataBlock->info.window.ekey != tsCols[endRowId]) {
|
||||||
qError("table uid %" PRIu64 " data block timestamp range may not be calculated! minKey %" PRId64
|
qError("table uid %" PRIu64 " data block timestamp range may not be calculated! minKey %" PRId64 ",maxKey %" PRId64,
|
||||||
",maxKey %" PRId64,
|
|
||||||
pSDataBlock->info.id.uid, pSDataBlock->info.window.skey, pSDataBlock->info.window.ekey);
|
pSDataBlock->info.id.uid, pSDataBlock->info.window.skey, pSDataBlock->info.window.ekey);
|
||||||
blockDataUpdateTsWindow(pSDataBlock, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pSDataBlock, pInfo->primaryTsIndex);
|
||||||
|
|
||||||
|
@ -916,7 +924,7 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDat
|
||||||
if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
|
if (savePullWindow(&pull, pInfo->pPullWins) == TSDB_CODE_SUCCESS) {
|
||||||
addPullWindow(pInfo->pPullDataMap, &winRes, pInfo->numOfChild);
|
addPullWindow(pInfo->pPullDataMap, &winRes, pInfo->numOfChild);
|
||||||
if (pInfo->destHasPrimaryKey) {
|
if (pInfo->destHasPrimaryKey) {
|
||||||
tSimpleHashPut(pInfo->pDeletedMap,&winRes, sizeof(SWinKey), NULL, 0);
|
tSimpleHashPut(pInfo->pDeletedMap, &winRes, sizeof(SWinKey), NULL, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -962,7 +970,7 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDat
|
||||||
};
|
};
|
||||||
|
|
||||||
if (pInfo->destHasPrimaryKey && code == TSDB_CODE_SUCCESS && IS_NORMAL_INTERVAL_OP(pOperator)) {
|
if (pInfo->destHasPrimaryKey && code == TSDB_CODE_SUCCESS && IS_NORMAL_INTERVAL_OP(pOperator)) {
|
||||||
tSimpleHashPut(pDeletedMap,&key, sizeof(SWinKey), NULL, 0);
|
tSimpleHashPut(pDeletedMap, &key, sizeof(SWinKey), NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) {
|
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) {
|
||||||
|
@ -1399,7 +1407,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pInfo->pUpdatedMap);
|
getAllIntervalWindow(pInfo->aggSup.pResultRowHashTable, pInfo->pUpdatedMap);
|
||||||
continue;
|
continue;
|
||||||
} else if (pBlock->info.type == STREAM_RETRIEVE) {
|
} else if (pBlock->info.type == STREAM_RETRIEVE) {
|
||||||
if(!IS_FINAL_INTERVAL_OP(pOperator)) {
|
if (!IS_FINAL_INTERVAL_OP(pOperator)) {
|
||||||
pInfo->recvRetrive = true;
|
pInfo->recvRetrive = true;
|
||||||
copyDataBlock(pInfo->pMidRetriveRes, pBlock);
|
copyDataBlock(pInfo->pMidRetriveRes, pBlock);
|
||||||
pInfo->pMidRetriveRes->info.type = STREAM_MID_RETRIEVE;
|
pInfo->pMidRetriveRes->info.type = STREAM_MID_RETRIEVE;
|
||||||
|
@ -1755,27 +1763,37 @@ void initDummyFunction(SqlFunctionCtx* pDummy, SqlFunctionCtx* pCtx, int32_t num
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uint16_t type, int32_t tsColIndex,
|
int32_t initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, uint16_t type, int32_t tsColIndex,
|
||||||
STimeWindowAggSupp* pTwSup, struct SSteamOpBasicInfo* pBasic) {
|
STimeWindowAggSupp* pTwSup, struct SSteamOpBasicInfo* pBasic) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION) {
|
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION) {
|
||||||
SStreamPartitionOperatorInfo* pScanInfo = downstream->info;
|
SStreamPartitionOperatorInfo* pScanInfo = downstream->info;
|
||||||
pScanInfo->tsColIndex = tsColIndex;
|
pScanInfo->tsColIndex = tsColIndex;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
|
||||||
initDownStream(downstream->pDownstream[0], pAggSup, type, tsColIndex, pTwSup, pBasic);
|
code = initDownStream(downstream->pDownstream[0], pAggSup, type, tsColIndex, pTwSup, pBasic);
|
||||||
return;
|
return code;
|
||||||
}
|
}
|
||||||
SStreamScanInfo* pScanInfo = downstream->info;
|
SStreamScanInfo* pScanInfo = downstream->info;
|
||||||
pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type};
|
pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type};
|
||||||
pScanInfo->pState = pAggSup->pState;
|
pScanInfo->pState = pAggSup->pState;
|
||||||
if (!pScanInfo->pUpdateInfo) {
|
if (!pScanInfo->pUpdateInfo) {
|
||||||
pScanInfo->pUpdateInfo = pAggSup->stateStore.updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, pTwSup->waterMark,
|
code = pAggSup->stateStore.updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, pTwSup->waterMark,
|
||||||
pScanInfo->igCheckUpdate, pScanInfo->pkColType, pScanInfo->pkColLen);
|
pScanInfo->igCheckUpdate, pScanInfo->pkColType, pScanInfo->pkColLen,
|
||||||
|
&pScanInfo->pUpdateInfo);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
pScanInfo->twAggSup = *pTwSup;
|
pScanInfo->twAggSup = *pTwSup;
|
||||||
pAggSup->pUpdateInfo = pScanInfo->pUpdateInfo;
|
pAggSup->pUpdateInfo = pScanInfo->pUpdateInfo;
|
||||||
pBasic->primaryPkIndex = pScanInfo->primaryKeyIndex;
|
pBasic->primaryPkIndex = pScanInfo->primaryKeyIndex;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static TSKEY sesionTs(void* pKey) {
|
static TSKEY sesionTs(void* pKey) {
|
||||||
|
@ -2454,8 +2472,8 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, void* pState, SSDa
|
||||||
pBlock->info.id.groupId = pKey->groupId;
|
pBlock->info.id.groupId = pKey->groupId;
|
||||||
|
|
||||||
void* tbname = NULL;
|
void* tbname = NULL;
|
||||||
if (pAPI->stateStore.streamStateGetParName((void*)pTaskInfo->streamInfo.pState, pBlock->info.id.groupId,
|
if (pAPI->stateStore.streamStateGetParName((void*)pTaskInfo->streamInfo.pState, pBlock->info.id.groupId, &tbname,
|
||||||
&tbname, false) < 0) {
|
false) < 0) {
|
||||||
pBlock->info.parTbName[0] = 0;
|
pBlock->info.parTbName[0] = 0;
|
||||||
} else {
|
} else {
|
||||||
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
|
memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
|
||||||
|
@ -3018,6 +3036,7 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
|
||||||
SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
|
SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
|
||||||
int32_t numOfCols = 0;
|
int32_t numOfCols = 0;
|
||||||
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
|
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
int32_t lino = 0;
|
||||||
SStreamSessionAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
|
SStreamSessionAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
|
@ -3112,8 +3131,12 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
|
||||||
setOperatorStreamStateFn(pOperator, streamSessionReleaseState, streamSessionReloadState);
|
setOperatorStreamStateFn(pOperator, streamSessionReleaseState, streamSessionReloadState);
|
||||||
|
|
||||||
if (downstream) {
|
if (downstream) {
|
||||||
initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex, &pInfo->twAggSup, &pInfo->basic);
|
code = initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex,
|
||||||
|
&pInfo->twAggSup, &pInfo->basic);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
||||||
|
@ -3124,6 +3147,7 @@ _error:
|
||||||
|
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
pTaskInfo->code = code;
|
pTaskInfo->code = code;
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3681,9 +3705,9 @@ void* doStreamStateDecodeOpState(void* buf, int32_t len, SOperatorInfo* pOperato
|
||||||
SSessionKey key = {0};
|
SSessionKey key = {0};
|
||||||
SResultWindowInfo winfo = {0};
|
SResultWindowInfo winfo = {0};
|
||||||
buf = decodeSSessionKey(buf, &key);
|
buf = decodeSSessionKey(buf, &key);
|
||||||
pAggSup->stateStore.streamStateStateAddIfNotExist(pAggSup->pState, &winfo.sessionWin, NULL,
|
pAggSup->stateStore.streamStateStateAddIfNotExist(pAggSup->pState, &winfo.sessionWin, NULL, pAggSup->stateKeySize,
|
||||||
pAggSup->stateKeySize, compareStateKey,
|
compareStateKey, (void**)&winfo.pStatePos,
|
||||||
(void**)&winfo.pStatePos, &pAggSup->resultRowSize);
|
&pAggSup->resultRowSize);
|
||||||
buf = decodeSResultWindowInfo(buf, &winfo, pInfo->streamAggSup.resultRowSize);
|
buf = decodeSResultWindowInfo(buf, &winfo, pInfo->streamAggSup.resultRowSize);
|
||||||
tSimpleHashPut(pInfo->streamAggSup.pResultRows, &key, sizeof(SSessionKey), &winfo, sizeof(SResultWindowInfo));
|
tSimpleHashPut(pInfo->streamAggSup.pResultRows, &key, sizeof(SSessionKey), &winfo, sizeof(SResultWindowInfo));
|
||||||
}
|
}
|
||||||
|
@ -3941,12 +3965,13 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
int32_t tsSlotId = ((SColumnNode*)pStateNode->window.pTspk)->slotId;
|
int32_t tsSlotId = ((SColumnNode*)pStateNode->window.pTspk)->slotId;
|
||||||
SColumnNode* pColNode = (SColumnNode*)(pStateNode->pStateKey);
|
SColumnNode* pColNode = (SColumnNode*)(pStateNode->pStateKey);
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
|
||||||
SStreamStateAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamStateAggOperatorInfo));
|
SStreamStateAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamStateAggOperatorInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _error;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->stateCol = extractColumnFromColumnNode(pColNode);
|
pInfo->stateCol = extractColumnFromColumnNode(pColNode);
|
||||||
|
@ -3955,9 +3980,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
int32_t numOfScalar = 0;
|
int32_t numOfScalar = 0;
|
||||||
SExprInfo* pScalarExprInfo = createExprInfo(pStateNode->window.pExprs, NULL, &numOfScalar);
|
SExprInfo* pScalarExprInfo = createExprInfo(pStateNode->window.pExprs, NULL, &numOfScalar);
|
||||||
code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar, &pTaskInfo->storageAPI.functionStore);
|
code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar, &pTaskInfo->storageAPI.functionStore);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->twAggSup = (STimeWindowAggSupp){
|
pInfo->twAggSup = (STimeWindowAggSupp){
|
||||||
|
@ -3984,9 +4007,8 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
code = initStreamAggSupporter(&pInfo->streamAggSup, pExpSup, numOfCols, 0, pTaskInfo->streamInfo.pState, keySize,
|
code = initStreamAggSupporter(&pInfo->streamAggSup, pExpSup, numOfCols, 0, pTaskInfo->streamInfo.pState, keySize,
|
||||||
type, &pTaskInfo->storageAPI.stateStore, pHandle, &pInfo->twAggSup,
|
type, &pTaskInfo->storageAPI.stateStore, pHandle, &pInfo->twAggSup,
|
||||||
GET_TASKID(pTaskInfo), &pTaskInfo->storageAPI, pInfo->primaryTsIndex);
|
GET_TASKID(pTaskInfo), &pTaskInfo->storageAPI, pInfo->primaryTsIndex);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
||||||
pInfo->pSeDeleted = tSimpleHashInit(64, hashFn);
|
pInfo->pSeDeleted = tSimpleHashInit(64, hashFn);
|
||||||
pInfo->pDelIterator = NULL;
|
pInfo->pDelIterator = NULL;
|
||||||
|
@ -3999,7 +4021,8 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
pInfo->dataVersion = 0;
|
pInfo->dataVersion = 0;
|
||||||
pInfo->historyWins = taosArrayInit(4, sizeof(SSessionKey));
|
pInfo->historyWins = taosArrayInit(4, sizeof(SSessionKey));
|
||||||
if (!pInfo->historyWins) {
|
if (!pInfo->historyWins) {
|
||||||
goto _error;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
if (pHandle) {
|
if (pHandle) {
|
||||||
pInfo->isHistoryOp = pHandle->fillHistory;
|
pInfo->isHistoryOp = pHandle->fillHistory;
|
||||||
|
@ -4026,17 +4049,20 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamStateAgg, NULL, destroyStreamStateOperatorInfo,
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doStreamStateAgg, NULL, destroyStreamStateOperatorInfo,
|
||||||
optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
optrDefaultBufFn, NULL, optrDefaultGetNextExtFn, NULL);
|
||||||
setOperatorStreamStateFn(pOperator, streamStateReleaseState, streamStateReloadState);
|
setOperatorStreamStateFn(pOperator, streamStateReleaseState, streamStateReloadState);
|
||||||
initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex, &pInfo->twAggSup, &pInfo->basic);
|
code = initDownStream(downstream, &pInfo->streamAggSup, pOperator->operatorType, pInfo->primaryTsIndex,
|
||||||
|
&pInfo->twAggSup, &pInfo->basic);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
code = appendDownstream(pOperator, &downstream, 1);
|
code = appendDownstream(pOperator, &downstream, 1);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
goto _error;
|
|
||||||
}
|
|
||||||
return pOperator;
|
return pOperator;
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
destroyStreamStateOperatorInfo(pInfo);
|
destroyStreamStateOperatorInfo(pInfo);
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
pTaskInfo->code = code;
|
pTaskInfo->code = code;
|
||||||
|
qError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4203,7 +4229,8 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
|
||||||
.precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision,
|
.precision = ((SColumnNode*)pIntervalPhyNode->window.pTspk)->node.resType.precision,
|
||||||
};
|
};
|
||||||
|
|
||||||
pInfo->twAggSup = (STimeWindowAggSupp){.waterMark = pIntervalPhyNode->window.watermark,
|
pInfo->twAggSup =
|
||||||
|
(STimeWindowAggSupp){.waterMark = pIntervalPhyNode->window.watermark,
|
||||||
.calTrigger = pIntervalPhyNode->window.triggerType,
|
.calTrigger = pIntervalPhyNode->window.triggerType,
|
||||||
.maxTs = INT64_MIN,
|
.maxTs = INT64_MIN,
|
||||||
.minTs = INT64_MAX,
|
.minTs = INT64_MAX,
|
||||||
|
@ -4611,5 +4638,6 @@ static SSDataBlock* doStreamMidIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
void setStreamOperatorCompleted(SOperatorInfo* pOperator) {
|
void setStreamOperatorCompleted(SOperatorInfo* pOperator) {
|
||||||
setOperatorCompleted(pOperator);
|
setOperatorCompleted(pOperator);
|
||||||
qDebug("stask:%s %s status: %d. set completed", GET_TASKID(pOperator->pTaskInfo), getStreamOpName(pOperator->operatorType), pOperator->status);
|
qDebug("stask:%s %s status: %d. set completed", GET_TASKID(pOperator->pTaskInfo),
|
||||||
|
getStreamOpName(pOperator->operatorType), pOperator->status);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1139,7 +1139,6 @@ void destroyIntervalOperatorInfo(void* param) {
|
||||||
taosArrayDestroy(pInfo->pInterpCols);
|
taosArrayDestroy(pInfo->pInterpCols);
|
||||||
pInfo->pInterpCols = NULL;
|
pInfo->pInterpCols = NULL;
|
||||||
taosArrayDestroyEx(pInfo->pPrevValues, freeItem);
|
taosArrayDestroyEx(pInfo->pPrevValues, freeItem);
|
||||||
|
|
||||||
pInfo->pPrevValues = NULL;
|
pInfo->pPrevValues = NULL;
|
||||||
|
|
||||||
cleanupGroupResInfo(&pInfo->groupResInfo);
|
cleanupGroupResInfo(&pInfo->groupResInfo);
|
||||||
|
|
|
@ -112,7 +112,11 @@ static int32_t smlBuildTagRow(SArray* cols, SBoundColInfo* tags, SSchema* pSchem
|
||||||
for (int i = 0; i < tags->numOfBound; ++i) {
|
for (int i = 0; i < tags->numOfBound; ++i) {
|
||||||
SSchema* pTagSchema = &pSchema[tags->pColIndex[i]];
|
SSchema* pTagSchema = &pSchema[tags->pColIndex[i]];
|
||||||
SSmlKv* kv = taosArrayGet(cols, i);
|
SSmlKv* kv = taosArrayGet(cols, i);
|
||||||
|
if (kv == NULL){
|
||||||
|
code = TSDB_CODE_SML_INVALID_DATA;
|
||||||
|
uError("SML smlBuildTagRow error kv is null");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
if (kv->keyLen != strlen(pTagSchema->name) || memcmp(kv->key, pTagSchema->name, kv->keyLen) != 0 ||
|
if (kv->keyLen != strlen(pTagSchema->name) || memcmp(kv->key, pTagSchema->name, kv->keyLen) != 0 ||
|
||||||
kv->type != pTagSchema->type) {
|
kv->type != pTagSchema->type) {
|
||||||
code = TSDB_CODE_SML_INVALID_DATA;
|
code = TSDB_CODE_SML_INVALID_DATA;
|
||||||
|
@ -120,7 +124,11 @@ static int32_t smlBuildTagRow(SArray* cols, SBoundColInfo* tags, SSchema* pSchem
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosArrayPush(*tagName, pTagSchema->name);
|
if (taosArrayPush(*tagName, pTagSchema->name) == NULL){
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
uError("SML smlBuildTagRow error push tag name");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
STagVal val = {.cid = pTagSchema->colId, .type = pTagSchema->type};
|
||||||
// strcpy(val.colName, pTagSchema->name);
|
// strcpy(val.colName, pTagSchema->name);
|
||||||
if (pTagSchema->type == TSDB_DATA_TYPE_BINARY || pTagSchema->type == TSDB_DATA_TYPE_VARBINARY ||
|
if (pTagSchema->type == TSDB_DATA_TYPE_BINARY || pTagSchema->type == TSDB_DATA_TYPE_VARBINARY ||
|
||||||
|
@ -141,7 +149,7 @@ static int32_t smlBuildTagRow(SArray* cols, SBoundColInfo* tags, SSchema* pSchem
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
char buf[512] = {0};
|
char buf[512] = {0};
|
||||||
snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
(void)snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
|
||||||
taosMemoryFree(p);
|
taosMemoryFree(p);
|
||||||
code = buildSyntaxErrMsg(msg, buf, kv->value);
|
code = buildSyntaxErrMsg(msg, buf, kv->value);
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -149,9 +157,13 @@ static int32_t smlBuildTagRow(SArray* cols, SBoundColInfo* tags, SSchema* pSchem
|
||||||
val.pData = p;
|
val.pData = p;
|
||||||
val.nData = output;
|
val.nData = output;
|
||||||
} else {
|
} else {
|
||||||
memcpy(&val.i64, &(kv->value), kv->length);
|
(void)memcpy(&val.i64, &(kv->value), kv->length);
|
||||||
|
}
|
||||||
|
if (taosArrayPush(pTagArray, &val) == NULL){
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
uError("SML smlBuildTagRow error push tag array");
|
||||||
|
goto end;
|
||||||
}
|
}
|
||||||
taosArrayPush(pTagArray, &val);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tTagNew(pTagArray, 1, false, ppTag);
|
code = tTagNew(pTagArray, 1, false, ppTag);
|
||||||
|
@ -166,20 +178,19 @@ end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
STableDataCxt* smlInitTableDataCtx(SQuery* query, STableMeta* pTableMeta) {
|
int32_t smlInitTableDataCtx(SQuery* query, STableMeta* pTableMeta, STableDataCxt** cxt) {
|
||||||
STableDataCxt* pTableCxt = NULL;
|
|
||||||
SVCreateTbReq* pCreateTbReq = NULL;
|
SVCreateTbReq* pCreateTbReq = NULL;
|
||||||
int ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid,
|
int ret = insGetTableDataCxt(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj, &pTableMeta->uid,
|
||||||
sizeof(pTableMeta->uid), pTableMeta, &pCreateTbReq, &pTableCxt, false, false);
|
sizeof(pTableMeta->uid), pTableMeta, &pCreateTbReq, cxt, false, false);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return NULL;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = initTableColSubmitData(pTableCxt);
|
ret = initTableColSubmitData(*cxt);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
return NULL;
|
return ret;
|
||||||
}
|
}
|
||||||
return pTableCxt;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
void clearColValArraySml(SArray* pCols) {
|
void clearColValArraySml(SArray* pCols) {
|
||||||
|
@ -197,6 +208,9 @@ void clearColValArraySml(SArray* pCols) {
|
||||||
|
|
||||||
int32_t smlBuildRow(STableDataCxt* pTableCxt) {
|
int32_t smlBuildRow(STableDataCxt* pTableCxt) {
|
||||||
SRow** pRow = taosArrayReserve(pTableCxt->pData->aRowP, 1);
|
SRow** pRow = taosArrayReserve(pTableCxt->pData->aRowP, 1);
|
||||||
|
if (pRow == NULL){
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
int ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow);
|
int ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow);
|
||||||
if (TSDB_CODE_SUCCESS != ret) {
|
if (TSDB_CODE_SUCCESS != ret) {
|
||||||
return ret;
|
return ret;
|
||||||
|
@ -211,18 +225,22 @@ int32_t smlBuildCol(STableDataCxt* pTableCxt, SSchema* schema, void* data, int32
|
||||||
int ret = TSDB_CODE_SUCCESS;
|
int ret = TSDB_CODE_SUCCESS;
|
||||||
SSchema* pColSchema = schema + index;
|
SSchema* pColSchema = schema + index;
|
||||||
SColVal* pVal = taosArrayGet(pTableCxt->pValues, index);
|
SColVal* pVal = taosArrayGet(pTableCxt->pValues, index);
|
||||||
|
if (pVal == NULL) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
SSmlKv* kv = (SSmlKv*)data;
|
SSmlKv* kv = (SSmlKv*)data;
|
||||||
if (kv->keyLen != strlen(pColSchema->name) || memcmp(kv->key, pColSchema->name, kv->keyLen) != 0 ||
|
if (kv->keyLen != strlen(pColSchema->name) || memcmp(kv->key, pColSchema->name, kv->keyLen) != 0 ||
|
||||||
kv->type != pColSchema->type) {
|
kv->type != pColSchema->type) {
|
||||||
ret = TSDB_CODE_SML_INVALID_DATA;
|
ret = TSDB_CODE_SML_INVALID_DATA;
|
||||||
char* tmp = taosMemoryCalloc(kv->keyLen + 1, 1);
|
char* tmp = taosMemoryCalloc(kv->keyLen + 1, 1);
|
||||||
if (tmp) {
|
if (tmp) {
|
||||||
memcpy(tmp, kv->key, kv->keyLen);
|
(void)memcpy(tmp, kv->key, kv->keyLen);
|
||||||
uInfo("SML data(name:%s type:%s) is not same like the db data(name:%s type:%s)", tmp, tDataTypes[kv->type].name,
|
uInfo("SML data(name:%s type:%s) is not same like the db data(name:%s type:%s)", tmp, tDataTypes[kv->type].name,
|
||||||
pColSchema->name, tDataTypes[pColSchema->type].name);
|
pColSchema->name, tDataTypes[pColSchema->type].name);
|
||||||
taosMemoryFree(tmp);
|
taosMemoryFree(tmp);
|
||||||
} else {
|
} else {
|
||||||
uError("SML smlBuildCol out of memory");
|
uError("SML smlBuildCol out of memory");
|
||||||
|
ret = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
@ -256,9 +274,9 @@ int32_t smlBuildCol(STableDataCxt* pTableCxt, SSchema* schema, void* data, int32
|
||||||
} else if (kv->type == TSDB_DATA_TYPE_GEOMETRY || kv->type == TSDB_DATA_TYPE_VARBINARY) {
|
} else if (kv->type == TSDB_DATA_TYPE_GEOMETRY || kv->type == TSDB_DATA_TYPE_VARBINARY) {
|
||||||
pVal->value.nData = kv->length;
|
pVal->value.nData = kv->length;
|
||||||
pVal->value.pData = taosMemoryMalloc(kv->length);
|
pVal->value.pData = taosMemoryMalloc(kv->length);
|
||||||
memcpy(pVal->value.pData, (uint8_t*)kv->value, kv->length);
|
(void)memcpy(pVal->value.pData, (uint8_t*)kv->value, kv->length);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pVal->value.val, &(kv->value), kv->length);
|
(void)memcpy(&pVal->value.val, &(kv->value), kv->length);
|
||||||
}
|
}
|
||||||
pVal->flag = CV_FLAG_VALUE;
|
pVal->flag = CV_FLAG_VALUE;
|
||||||
|
|
||||||
|
@ -276,8 +294,13 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc
|
||||||
SVCreateTbReq* pCreateTblReq = NULL;
|
SVCreateTbReq* pCreateTblReq = NULL;
|
||||||
SArray* tagName = NULL;
|
SArray* tagName = NULL;
|
||||||
|
|
||||||
insInitBoundColsInfo(getNumOfTags(pTableMeta), &bindTags);
|
int ret = insInitBoundColsInfo(getNumOfTags(pTableMeta), &bindTags);
|
||||||
int ret = smlBoundColumnData(tags, &bindTags, pTagsSchema, true);
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
|
buildInvalidOperationMsg(&pBuf, "init bound cols error");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = smlBoundColumnData(tags, &bindTags, pTagsSchema, true);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
buildInvalidOperationMsg(&pBuf, "bound tags error");
|
buildInvalidOperationMsg(&pBuf, "bound tags error");
|
||||||
goto end;
|
goto end;
|
||||||
|
@ -299,7 +322,11 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc
|
||||||
ttl);
|
ttl);
|
||||||
|
|
||||||
pCreateTblReq->ctb.stbName = taosMemoryCalloc(1, sTableNameLen + 1);
|
pCreateTblReq->ctb.stbName = taosMemoryCalloc(1, sTableNameLen + 1);
|
||||||
memcpy(pCreateTblReq->ctb.stbName, sTableName, sTableNameLen);
|
if (pCreateTblReq->ctb.stbName == NULL){
|
||||||
|
ret = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
(void)memcpy(pCreateTblReq->ctb.stbName, sTableName, sTableNameLen);
|
||||||
|
|
||||||
if (dataFormat) {
|
if (dataFormat) {
|
||||||
STableDataCxt** pTableCxt = (STableDataCxt**)taosHashGet(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj,
|
STableDataCxt** pTableCxt = (STableDataCxt**)taosHashGet(((SVnodeModifyOpStmt*)(query->pRoot))->pTableBlockHashObj,
|
||||||
|
@ -345,11 +372,18 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc
|
||||||
|
|
||||||
for (int32_t r = 0; r < rowNum; ++r) {
|
for (int32_t r = 0; r < rowNum; ++r) {
|
||||||
void* rowData = taosArrayGetP(cols, r);
|
void* rowData = taosArrayGetP(cols, r);
|
||||||
|
if (rowData == NULL) {
|
||||||
|
ret = TSDB_CODE_SML_INVALID_DATA;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
// 1. set the parsed value from sql string
|
// 1. set the parsed value from sql string
|
||||||
for (int c = 0; c < pTableCxt->boundColsInfo.numOfBound; ++c) {
|
for (int c = 0; c < pTableCxt->boundColsInfo.numOfBound; ++c) {
|
||||||
SSchema* pColSchema = &pSchema[pTableCxt->boundColsInfo.pColIndex[c]];
|
SSchema* pColSchema = &pSchema[pTableCxt->boundColsInfo.pColIndex[c]];
|
||||||
SColVal* pVal = taosArrayGet(pTableCxt->pValues, pTableCxt->boundColsInfo.pColIndex[c]);
|
SColVal* pVal = taosArrayGet(pTableCxt->pValues, pTableCxt->boundColsInfo.pColIndex[c]);
|
||||||
|
if (pVal == NULL) {
|
||||||
|
ret = TSDB_CODE_SML_INVALID_DATA;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
void** p = taosHashGet(rowData, pColSchema->name, strlen(pColSchema->name));
|
void** p = taosHashGet(rowData, pColSchema->name, strlen(pColSchema->name));
|
||||||
if (p == NULL) {
|
if (p == NULL) {
|
||||||
continue;
|
continue;
|
||||||
|
@ -388,14 +422,22 @@ int32_t smlBindData(SQuery* query, bool dataFormat, SArray* tags, SArray* colsSc
|
||||||
} else if (kv->type == TSDB_DATA_TYPE_GEOMETRY || kv->type == TSDB_DATA_TYPE_VARBINARY) {
|
} else if (kv->type == TSDB_DATA_TYPE_GEOMETRY || kv->type == TSDB_DATA_TYPE_VARBINARY) {
|
||||||
pVal->value.nData = kv->length;
|
pVal->value.nData = kv->length;
|
||||||
pVal->value.pData = taosMemoryMalloc(kv->length);
|
pVal->value.pData = taosMemoryMalloc(kv->length);
|
||||||
memcpy(pVal->value.pData, (uint8_t*)kv->value, kv->length);
|
if (NULL == pVal->value.pData) {
|
||||||
|
ret = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
(void)memcpy(pVal->value.pData, (uint8_t*)kv->value, kv->length);
|
||||||
} else {
|
} else {
|
||||||
memcpy(&pVal->value.val, &(kv->value), kv->length);
|
(void)memcpy(&pVal->value.val, &(kv->value), kv->length);
|
||||||
}
|
}
|
||||||
pVal->flag = CV_FLAG_VALUE;
|
pVal->flag = CV_FLAG_VALUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
SRow** pRow = taosArrayReserve(pTableCxt->pData->aRowP, 1);
|
SRow** pRow = taosArrayReserve(pTableCxt->pData->aRowP, 1);
|
||||||
|
if (NULL == pRow) {
|
||||||
|
ret = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow);
|
ret = tRowBuild(pTableCxt->pValues, pTableCxt->pSchema, pRow);
|
||||||
if (TSDB_CODE_SUCCESS != ret) {
|
if (TSDB_CODE_SUCCESS != ret) {
|
||||||
buildInvalidOperationMsg(&pBuf, "tRowBuild error");
|
buildInvalidOperationMsg(&pBuf, "tRowBuild error");
|
||||||
|
@ -415,11 +457,12 @@ end:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
SQuery* smlInitHandle() {
|
int32_t smlInitHandle(SQuery** query) {
|
||||||
|
*query = NULL;
|
||||||
SQuery* pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
|
SQuery* pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
|
||||||
if (NULL == pQuery) {
|
if (NULL == pQuery) {
|
||||||
uError("create pQuery error");
|
uError("create pQuery error");
|
||||||
return NULL;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
|
||||||
pQuery->haveResultSet = false;
|
pQuery->haveResultSet = false;
|
||||||
|
@ -428,14 +471,22 @@ SQuery* smlInitHandle() {
|
||||||
if (NULL == stmt) {
|
if (NULL == stmt) {
|
||||||
uError("create SVnodeModifyOpStmt error");
|
uError("create SVnodeModifyOpStmt error");
|
||||||
qDestroyQuery(pQuery);
|
qDestroyQuery(pQuery);
|
||||||
return NULL;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
stmt->pTableBlockHashObj = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
|
stmt->pTableBlockHashObj = taosHashInit(16, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
|
||||||
|
if (stmt->pTableBlockHashObj == NULL){
|
||||||
|
uError("create pTableBlockHashObj error");
|
||||||
|
qDestroyQuery(pQuery);
|
||||||
|
nodesDestroyNode((SNode*)stmt);
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
stmt->freeHashFunc = insDestroyTableDataCxtHashMap;
|
stmt->freeHashFunc = insDestroyTableDataCxtHashMap;
|
||||||
stmt->freeArrayFunc = insDestroyVgroupDataCxtList;
|
stmt->freeArrayFunc = insDestroyVgroupDataCxtList;
|
||||||
|
|
||||||
pQuery->pRoot = (SNode*)stmt;
|
pQuery->pRoot = (SNode*)stmt;
|
||||||
return pQuery;
|
*query = pQuery;
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t smlBuildOutput(SQuery* handle, SHashObj* pVgHash) {
|
int32_t smlBuildOutput(SQuery* handle, SHashObj* pVgHash) {
|
||||||
|
|
|
@ -12815,6 +12815,7 @@ static int32_t parseOneStbRow(SMsgBuf* pMsgBuf, SParseFileContext* pParFileCxt)
|
||||||
int32_t numOfTags = getNumOfTags(pParFileCxt->pStbMeta);
|
int32_t numOfTags = getNumOfTags(pParFileCxt->pStbMeta);
|
||||||
uint8_t precision = getTableInfo(pParFileCxt->pStbMeta).precision;
|
uint8_t precision = getTableInfo(pParFileCxt->pStbMeta).precision;
|
||||||
SSchema* pSchemas = getTableTagSchema(pParFileCxt->pStbMeta);
|
SSchema* pSchemas = getTableTagSchema(pParFileCxt->pStbMeta);
|
||||||
|
bool isJson = false;
|
||||||
for (int i = 0; i < sz; i++) {
|
for (int i = 0; i < sz; i++) {
|
||||||
const char* pSql = pParFileCxt->pSql;
|
const char* pSql = pParFileCxt->pSql;
|
||||||
|
|
||||||
|
@ -12832,6 +12833,7 @@ static int32_t parseOneStbRow(SMsgBuf* pMsgBuf, SParseFileContext* pParFileCxt)
|
||||||
// parse tag
|
// parse tag
|
||||||
const SSchema* pTagSchema = &pSchemas[index];
|
const SSchema* pTagSchema = &pSchemas[index];
|
||||||
|
|
||||||
|
isJson = (pTagSchema->type == TSDB_DATA_TYPE_JSON);
|
||||||
code = checkAndTrimValue(&token, pParFileCxt->tmpTokenBuf, pMsgBuf, pTagSchema->type);
|
code = checkAndTrimValue(&token, pParFileCxt->tmpTokenBuf, pMsgBuf, pTagSchema->type);
|
||||||
if (TSDB_CODE_SUCCESS == code && TK_NK_VARIABLE == token.type) {
|
if (TSDB_CODE_SUCCESS == code && TK_NK_VARIABLE == token.type) {
|
||||||
code = buildInvalidOperationMsg(pMsgBuf, "not expected row value");
|
code = buildInvalidOperationMsg(pMsgBuf, "not expected row value");
|
||||||
|
@ -12859,8 +12861,10 @@ static int32_t parseOneStbRow(SMsgBuf* pMsgBuf, SParseFileContext* pParFileCxt)
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
pParFileCxt->tagNameFilled = true;
|
pParFileCxt->tagNameFilled = true;
|
||||||
|
if (!isJson) {
|
||||||
code = tTagNew(pParFileCxt->aTagVals, 1, false, &pParFileCxt->pTag);
|
code = tTagNew(pParFileCxt->aTagVals, 1, false, &pParFileCxt->pTag);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -336,7 +336,7 @@ extern SSchedulerMgmt schMgmt;
|
||||||
((_job)->attr.localExec && SCH_IS_QUERY_JOB(_job) && (!SCH_IS_INSERT_JOB(_job)) && \
|
((_job)->attr.localExec && SCH_IS_QUERY_JOB(_job) && (!SCH_IS_INSERT_JOB(_job)) && \
|
||||||
(!SCH_IS_DATA_BIND_QRY_TASK(_task)))
|
(!SCH_IS_DATA_BIND_QRY_TASK(_task)))
|
||||||
|
|
||||||
#define SCH_UPDATE_REDIRECT_CODE(job, _code) atomic_val_compare_exchange_32(&((job)->redirectCode), 0, _code)
|
#define SCH_UPDATE_REDIRECT_CODE(job, _code) (void)atomic_val_compare_exchange_32(&((job)->redirectCode), 0, _code)
|
||||||
#define SCH_GET_REDIRECT_CODE(job, _code) \
|
#define SCH_GET_REDIRECT_CODE(job, _code) \
|
||||||
(((!NO_RET_REDIRECT_ERROR(_code)) || (job)->redirectCode == 0) ? (_code) : (job)->redirectCode)
|
(((!NO_RET_REDIRECT_ERROR(_code)) || (job)->redirectCode == 0) ? (_code) : (job)->redirectCode)
|
||||||
|
|
||||||
|
@ -413,7 +413,7 @@ extern SSchedulerMgmt schMgmt;
|
||||||
#define SCH_LOG_TASK_START_TS(_task) \
|
#define SCH_LOG_TASK_START_TS(_task) \
|
||||||
do { \
|
do { \
|
||||||
int64_t us = taosGetTimestampUs(); \
|
int64_t us = taosGetTimestampUs(); \
|
||||||
taosArrayPush((_task)->profile.execTime, &us); \
|
(void)taosArrayPush((_task)->profile.execTime, &us); \
|
||||||
if (0 == (_task)->execId) { \
|
if (0 == (_task)->execId) { \
|
||||||
(_task)->profile.startTs = us; \
|
(_task)->profile.startTs = us; \
|
||||||
} \
|
} \
|
||||||
|
@ -422,7 +422,10 @@ extern SSchedulerMgmt schMgmt;
|
||||||
#define SCH_LOG_TASK_WAIT_TS(_task) \
|
#define SCH_LOG_TASK_WAIT_TS(_task) \
|
||||||
do { \
|
do { \
|
||||||
int64_t us = taosGetTimestampUs(); \
|
int64_t us = taosGetTimestampUs(); \
|
||||||
(_task)->profile.waitTime += us - *(int64_t *)taosArrayGet((_task)->profile.execTime, (_task)->execId); \
|
int64_t* startus = (int64_t*)taosArrayGet((_task)->profile.execTime, (_task)->execId); \
|
||||||
|
if (NULL != startus) { \
|
||||||
|
(_task)->profile.waitTime += us - *startus; \
|
||||||
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
#define SCH_LOG_TASK_END_TS(_task) \
|
#define SCH_LOG_TASK_END_TS(_task) \
|
||||||
|
@ -430,7 +433,9 @@ extern SSchedulerMgmt schMgmt;
|
||||||
int64_t us = taosGetTimestampUs(); \
|
int64_t us = taosGetTimestampUs(); \
|
||||||
int32_t idx = (_task)->execId % (_task)->maxExecTimes; \
|
int32_t idx = (_task)->execId % (_task)->maxExecTimes; \
|
||||||
int64_t *startts = taosArrayGet((_task)->profile.execTime, (_task)->execId); \
|
int64_t *startts = taosArrayGet((_task)->profile.execTime, (_task)->execId); \
|
||||||
|
if (NULL != startts) { \
|
||||||
*startts = us - *startts; \
|
*startts = us - *startts; \
|
||||||
|
} \
|
||||||
(_task)->profile.endTs = us; \
|
(_task)->profile.endTs = us; \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
@ -538,7 +543,7 @@ void schCleanClusterHb(void *pTrans);
|
||||||
int32_t schLaunchTask(SSchJob *job, SSchTask *task);
|
int32_t schLaunchTask(SSchJob *job, SSchTask *task);
|
||||||
int32_t schDelayLaunchTask(SSchJob *pJob, SSchTask *pTask);
|
int32_t schDelayLaunchTask(SSchJob *pJob, SSchTask *pTask);
|
||||||
int32_t schBuildAndSendMsg(SSchJob *job, SSchTask *task, SQueryNodeAddr *addr, int32_t msgType, void *param);
|
int32_t schBuildAndSendMsg(SSchJob *job, SSchTask *task, SQueryNodeAddr *addr, int32_t msgType, void *param);
|
||||||
SSchJob *schAcquireJob(int64_t refId);
|
int32_t schAcquireJob(int64_t refId, SSchJob **ppJob);
|
||||||
int32_t schReleaseJob(int64_t refId);
|
int32_t schReleaseJob(int64_t refId);
|
||||||
void schFreeFlowCtrl(SSchJob *pJob);
|
void schFreeFlowCtrl(SSchJob *pJob);
|
||||||
int32_t schChkJobNeedFlowCtrl(SSchJob *pJob, SSchLevel *pLevel);
|
int32_t schChkJobNeedFlowCtrl(SSchJob *pJob, SSchLevel *pLevel);
|
||||||
|
@ -578,7 +583,7 @@ int32_t schJobFetchRows(SSchJob *pJob);
|
||||||
int32_t schJobFetchRowsA(SSchJob *pJob);
|
int32_t schJobFetchRowsA(SSchJob *pJob);
|
||||||
int32_t schUpdateTaskHandle(SSchJob *pJob, SSchTask *pTask, bool dropExecNode, void *handle, int32_t execId);
|
int32_t schUpdateTaskHandle(SSchJob *pJob, SSchTask *pTask, bool dropExecNode, void *handle, int32_t execId);
|
||||||
int32_t schProcessOnTaskStatusRsp(SQueryNodeEpId *pEpId, SArray *pStatusList);
|
int32_t schProcessOnTaskStatusRsp(SQueryNodeEpId *pEpId, SArray *pStatusList);
|
||||||
char *schDumpEpSet(SEpSet *pEpSet);
|
int32_t schDumpEpSet(SEpSet *pEpSet, char** ppRes);
|
||||||
char *schGetOpStr(SCH_OP_TYPE type);
|
char *schGetOpStr(SCH_OP_TYPE type);
|
||||||
int32_t schBeginOperation(SSchJob *pJob, SCH_OP_TYPE type, bool sync);
|
int32_t schBeginOperation(SSchJob *pJob, SCH_OP_TYPE type, bool sync);
|
||||||
int32_t schInitJob(int64_t *pJobId, SSchedulerReq *pReq);
|
int32_t schInitJob(int64_t *pJobId, SSchedulerReq *pReq);
|
||||||
|
|
|
@ -1165,7 +1165,9 @@ int32_t schProcessOnCbBegin(SSchJob **job, SSchTask **task, uint64_t qId, int64_
|
||||||
int8_t status = 0;
|
int8_t status = 0;
|
||||||
|
|
||||||
SSchTask *pTask = NULL;
|
SSchTask *pTask = NULL;
|
||||||
SSchJob *pJob = schAcquireJob(rId);
|
SSchJob *pJob = NULL;
|
||||||
|
|
||||||
|
(void)schAcquireJob(rId, &pJob);
|
||||||
if (NULL == pJob) {
|
if (NULL == pJob) {
|
||||||
qWarn("QID:0x%" PRIx64 ",TID:0x%" PRIx64 "job no exist, may be dropped, refId:0x%" PRIx64, qId, tId, rId);
|
qWarn("QID:0x%" PRIx64 ",TID:0x%" PRIx64 "job no exist, may be dropped, refId:0x%" PRIx64, qId, tId, rId);
|
||||||
SCH_ERR_RET(TSDB_CODE_QRY_JOB_NOT_EXIST);
|
SCH_ERR_RET(TSDB_CODE_QRY_JOB_NOT_EXIST);
|
||||||
|
|
|
@ -113,7 +113,7 @@ int32_t schProcessFetchRsp(SSchJob *pJob, SSchTask *pTask, char *msg, int32_t rs
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_ptr(&pJob->fetchRes, rsp);
|
atomic_store_ptr(&pJob->fetchRes, rsp);
|
||||||
atomic_add_fetch_64(&pJob->resNumOfRows, htobe64(rsp->numOfRows));
|
(void)atomic_add_fetch_64(&pJob->resNumOfRows, htobe64(rsp->numOfRows));
|
||||||
|
|
||||||
if (rsp->completed) {
|
if (rsp->completed) {
|
||||||
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_SUCC);
|
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_SUCC);
|
||||||
|
@ -166,13 +166,27 @@ int32_t schProcessResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SD
|
||||||
SCH_LOCK(SCH_WRITE, &pJob->resLock);
|
SCH_LOCK(SCH_WRITE, &pJob->resLock);
|
||||||
if (NULL == pJob->execRes.res) {
|
if (NULL == pJob->execRes.res) {
|
||||||
pJob->execRes.res = (void*)taosArrayInit(batchRsp.nRsps, POINTER_BYTES);
|
pJob->execRes.res = (void*)taosArrayInit(batchRsp.nRsps, POINTER_BYTES);
|
||||||
|
if (NULL == pJob->execRes.res) {
|
||||||
|
code = terrno;
|
||||||
|
SCH_UNLOCK(SCH_WRITE, &pJob->resLock);
|
||||||
|
|
||||||
|
tDecoderClear(&coder);
|
||||||
|
SCH_ERR_JRET(code);
|
||||||
|
}
|
||||||
|
|
||||||
pJob->execRes.msgType = TDMT_VND_CREATE_TABLE;
|
pJob->execRes.msgType = TDMT_VND_CREATE_TABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < batchRsp.nRsps; ++i) {
|
for (int32_t i = 0; i < batchRsp.nRsps; ++i) {
|
||||||
SVCreateTbRsp *rsp = batchRsp.pRsps + i;
|
SVCreateTbRsp *rsp = batchRsp.pRsps + i;
|
||||||
if (rsp->pMeta) {
|
if (rsp->pMeta) {
|
||||||
taosArrayPush((SArray*)pJob->execRes.res, &rsp->pMeta);
|
if (NULL == taosArrayPush((SArray*)pJob->execRes.res, &rsp->pMeta)) {
|
||||||
|
code = terrno;
|
||||||
|
SCH_UNLOCK(SCH_WRITE, &pJob->resLock);
|
||||||
|
|
||||||
|
tDecoderClear(&coder);
|
||||||
|
SCH_ERR_JRET(code);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS != rsp->code) {
|
if (TSDB_CODE_SUCCESS != rsp->code) {
|
||||||
|
@ -264,7 +278,7 @@ int32_t schProcessResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SD
|
||||||
SCH_ERR_JRET(code);
|
SCH_ERR_JRET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_add_fetch_64(&pJob->resNumOfRows, rsp->affectedRows);
|
(void)atomic_add_fetch_64(&pJob->resNumOfRows, rsp->affectedRows);
|
||||||
|
|
||||||
int32_t createTbRspNum = taosArrayGetSize(rsp->aCreateTbRsp);
|
int32_t createTbRspNum = taosArrayGetSize(rsp->aCreateTbRsp);
|
||||||
SCH_TASK_DLOG("submit succeed, affectedRows:%d, createTbRspNum:%d", rsp->affectedRows, createTbRspNum);
|
SCH_TASK_DLOG("submit succeed, affectedRows:%d, createTbRspNum:%d", rsp->affectedRows, createTbRspNum);
|
||||||
|
@ -275,7 +289,12 @@ int32_t schProcessResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SD
|
||||||
SSubmitRsp2 *sum = pJob->execRes.res;
|
SSubmitRsp2 *sum = pJob->execRes.res;
|
||||||
sum->affectedRows += rsp->affectedRows;
|
sum->affectedRows += rsp->affectedRows;
|
||||||
if (sum->aCreateTbRsp) {
|
if (sum->aCreateTbRsp) {
|
||||||
taosArrayAddAll(sum->aCreateTbRsp, rsp->aCreateTbRsp);
|
if (NULL == taosArrayAddAll(sum->aCreateTbRsp, rsp->aCreateTbRsp)) {
|
||||||
|
code = terrno;
|
||||||
|
SCH_UNLOCK(SCH_WRITE, &pJob->resLock);
|
||||||
|
SCH_ERR_JRET(code);
|
||||||
|
}
|
||||||
|
|
||||||
taosArrayDestroy(rsp->aCreateTbRsp);
|
taosArrayDestroy(rsp->aCreateTbRsp);
|
||||||
} else {
|
} else {
|
||||||
TSWAP(sum->aCreateTbRsp, rsp->aCreateTbRsp);
|
TSWAP(sum->aCreateTbRsp, rsp->aCreateTbRsp);
|
||||||
|
@ -313,10 +332,14 @@ int32_t schProcessResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SD
|
||||||
SDecoder coder = {0};
|
SDecoder coder = {0};
|
||||||
SVDeleteRsp rsp = {0};
|
SVDeleteRsp rsp = {0};
|
||||||
tDecoderInit(&coder, msg, msgSize);
|
tDecoderInit(&coder, msg, msgSize);
|
||||||
tDecodeSVDeleteRsp(&coder, &rsp);
|
if (tDecodeSVDeleteRsp(&coder, &rsp) < 0) {
|
||||||
|
code = terrno;
|
||||||
|
tDecoderClear(&coder);
|
||||||
|
SCH_ERR_JRET(code);
|
||||||
|
}
|
||||||
tDecoderClear(&coder);
|
tDecoderClear(&coder);
|
||||||
|
|
||||||
atomic_add_fetch_64(&pJob->resNumOfRows, rsp.affectedRows);
|
(void)atomic_add_fetch_64(&pJob->resNumOfRows, rsp.affectedRows);
|
||||||
SCH_TASK_DLOG("delete succeed, affectedRows:%" PRId64, rsp.affectedRows);
|
SCH_TASK_DLOG("delete succeed, affectedRows:%" PRId64, rsp.affectedRows);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -351,7 +374,7 @@ int32_t schProcessResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SD
|
||||||
|
|
||||||
SCH_ERR_JRET(schSaveJobExecRes(pJob, &rsp));
|
SCH_ERR_JRET(schSaveJobExecRes(pJob, &rsp));
|
||||||
|
|
||||||
atomic_add_fetch_64(&pJob->resNumOfRows, rsp.affectedRows);
|
(void)atomic_add_fetch_64(&pJob->resNumOfRows, rsp.affectedRows);
|
||||||
|
|
||||||
taosMemoryFreeClear(msg);
|
taosMemoryFreeClear(msg);
|
||||||
|
|
||||||
|
@ -479,7 +502,7 @@ int32_t schHandleDropCallback(void *param, SDataBuf *pMsg, int32_t code) {
|
||||||
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 " drop task rsp received, code:0x%x", pParam->queryId, pParam->taskId,
|
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 " drop task rsp received, code:0x%x", pParam->queryId, pParam->taskId,
|
||||||
code);
|
code);
|
||||||
// called if drop task rsp received code
|
// called if drop task rsp received code
|
||||||
rpcReleaseHandle(pMsg->handle, TAOS_CONN_CLIENT);
|
(void)rpcReleaseHandle(pMsg->handle, TAOS_CONN_CLIENT); // ignore error
|
||||||
if (pMsg) {
|
if (pMsg) {
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
taosMemoryFree(pMsg->pEpSet);
|
taosMemoryFree(pMsg->pEpSet);
|
||||||
|
@ -501,7 +524,7 @@ int32_t schHandleNotifyCallback(void *param, SDataBuf *pMsg, int32_t code) {
|
||||||
|
|
||||||
int32_t schHandleLinkBrokenCallback(void *param, SDataBuf *pMsg, int32_t code) {
|
int32_t schHandleLinkBrokenCallback(void *param, SDataBuf *pMsg, int32_t code) {
|
||||||
SSchCallbackParamHeader *head = (SSchCallbackParamHeader *)param;
|
SSchCallbackParamHeader *head = (SSchCallbackParamHeader *)param;
|
||||||
rpcReleaseHandle(pMsg->handle, TAOS_CONN_CLIENT);
|
(void)rpcReleaseHandle(pMsg->handle, TAOS_CONN_CLIENT); // ignore error
|
||||||
|
|
||||||
qDebug("handle %p is broken", pMsg->handle);
|
qDebug("handle %p is broken", pMsg->handle);
|
||||||
|
|
||||||
|
@ -531,7 +554,7 @@ int32_t schHandleHbCallback(void *param, SDataBuf *pMsg, int32_t code) {
|
||||||
|
|
||||||
if (code) {
|
if (code) {
|
||||||
qError("hb rsp error:%s", tstrerror(code));
|
qError("hb rsp error:%s", tstrerror(code));
|
||||||
rpcReleaseHandle(pMsg->handle, TAOS_CONN_CLIENT);
|
(void)rpcReleaseHandle(pMsg->handle, TAOS_CONN_CLIENT); // ignore error
|
||||||
SCH_ERR_JRET(code);
|
SCH_ERR_JRET(code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -585,9 +608,14 @@ int32_t schMakeCallbackParam(SSchJob *pJob, SSchTask *pTask, int32_t msgType, bo
|
||||||
param->head.isHbParam = true;
|
param->head.isHbParam = true;
|
||||||
|
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
taosMemoryFree(param);
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth condidateAddr, totalNum: %d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
param->nodeEpId.nodeId = addr->nodeId;
|
param->nodeEpId.nodeId = addr->nodeId;
|
||||||
SEp *pEp = SCH_GET_CUR_EP(addr);
|
SEp *pEp = SCH_GET_CUR_EP(addr);
|
||||||
strcpy(param->nodeEpId.ep.fqdn, pEp->fqdn);
|
TAOS_STRCPY(param->nodeEpId.ep.fqdn, pEp->fqdn);
|
||||||
param->nodeEpId.ep.port = pEp->port;
|
param->nodeEpId.ep.port = pEp->port;
|
||||||
param->pTrans = trans->pTrans;
|
param->pTrans = trans->pTrans;
|
||||||
*pParam = param;
|
*pParam = param;
|
||||||
|
@ -712,7 +740,7 @@ int32_t schMakeHbCallbackParam(SSchJob *pJob, SSchTask *pTask, void **pParam) {
|
||||||
|
|
||||||
int32_t schCloneHbRpcCtx(SRpcCtx *pSrc, SRpcCtx *pDst) {
|
int32_t schCloneHbRpcCtx(SRpcCtx *pSrc, SRpcCtx *pDst) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
memcpy(pDst, pSrc, sizeof(SRpcCtx));
|
TAOS_MEMCPY(pDst, pSrc, sizeof(SRpcCtx));
|
||||||
pDst->brokenVal.val = NULL;
|
pDst->brokenVal.val = NULL;
|
||||||
pDst->args = NULL;
|
pDst->args = NULL;
|
||||||
|
|
||||||
|
@ -760,7 +788,7 @@ int32_t schMakeHbRpcCtx(SSchJob *pJob, SSchTask *pTask, SRpcCtx *pCtx) {
|
||||||
SQueryNodeEpId epId = {0};
|
SQueryNodeEpId epId = {0};
|
||||||
|
|
||||||
epId.nodeId = addr->nodeId;
|
epId.nodeId = addr->nodeId;
|
||||||
memcpy(&epId.ep, SCH_GET_CUR_EP(addr), sizeof(SEp));
|
TAOS_MEMCPY(&epId.ep, SCH_GET_CUR_EP(addr), sizeof(SEp));
|
||||||
|
|
||||||
pCtx->args = taosHashInit(1, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_ENTRY_LOCK);
|
pCtx->args = taosHashInit(1, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_ENTRY_LOCK);
|
||||||
if (NULL == pCtx->args) {
|
if (NULL == pCtx->args) {
|
||||||
|
@ -877,7 +905,7 @@ int32_t schCloneCallbackParam(SSchCallbackParamHeader *pSrc, SSchCallbackParamHe
|
||||||
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(dst, pSrc, sizeof(*dst));
|
TAOS_MEMCPY(dst, pSrc, sizeof(*dst));
|
||||||
*pDst = (SSchCallbackParamHeader *)dst;
|
*pDst = (SSchCallbackParamHeader *)dst;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -889,7 +917,7 @@ int32_t schCloneCallbackParam(SSchCallbackParamHeader *pSrc, SSchCallbackParamHe
|
||||||
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(dst, pSrc, sizeof(*dst));
|
TAOS_MEMCPY(dst, pSrc, sizeof(*dst));
|
||||||
*pDst = (SSchCallbackParamHeader *)dst;
|
*pDst = (SSchCallbackParamHeader *)dst;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -904,7 +932,7 @@ int32_t schCloneSMsgSendInfo(void *src, void **dst) {
|
||||||
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(pDst, pSrc, sizeof(*pSrc));
|
TAOS_MEMCPY(pDst, pSrc, sizeof(*pSrc));
|
||||||
pDst->param = NULL;
|
pDst->param = NULL;
|
||||||
|
|
||||||
SCH_ERR_JRET(schCloneCallbackParam(pSrc->param, (SSchCallbackParamHeader **)&pDst->param));
|
SCH_ERR_JRET(schCloneCallbackParam(pSrc->param, (SSchCallbackParamHeader **)&pDst->param));
|
||||||
|
@ -948,6 +976,10 @@ int32_t schAsyncSendMsg(SSchJob *pJob, SSchTask *pTask, SSchTrans *trans, SQuery
|
||||||
|
|
||||||
if (isHb && persistHandle && trans->pHandle == 0) {
|
if (isHb && persistHandle && trans->pHandle == 0) {
|
||||||
trans->pHandle = rpcAllocHandle();
|
trans->pHandle = rpcAllocHandle();
|
||||||
|
if (NULL == trans->pHandle) {
|
||||||
|
SCH_TASK_ELOG("rpcAllocHandle failed, code:%x", terrno);
|
||||||
|
SCH_ERR_JRET(terrno);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pJob && pTask) {
|
if (pJob && pTask) {
|
||||||
|
@ -1000,7 +1032,7 @@ int32_t schBuildAndSendHbMsg(SQueryNodeEpId *nodeEpId, SArray *taskAction) {
|
||||||
|
|
||||||
req.header.vgId = nodeEpId->nodeId;
|
req.header.vgId = nodeEpId->nodeId;
|
||||||
req.sId = schMgmt.sId;
|
req.sId = schMgmt.sId;
|
||||||
memcpy(&req.epId, nodeEpId, sizeof(SQueryNodeEpId));
|
TAOS_MEMCPY(&req.epId, nodeEpId, sizeof(SQueryNodeEpId));
|
||||||
|
|
||||||
SCH_LOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_LOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
SSchHbTrans *hb = taosHashGet(schMgmt.hbConnections, nodeEpId, sizeof(SQueryNodeEpId));
|
SSchHbTrans *hb = taosHashGet(schMgmt.hbConnections, nodeEpId, sizeof(SQueryNodeEpId));
|
||||||
|
@ -1013,7 +1045,7 @@ int32_t schBuildAndSendHbMsg(SQueryNodeEpId *nodeEpId, SArray *taskAction) {
|
||||||
|
|
||||||
SCH_LOCK(SCH_WRITE, &hb->lock);
|
SCH_LOCK(SCH_WRITE, &hb->lock);
|
||||||
code = schCloneHbRpcCtx(&hb->rpcCtx, &rpcCtx);
|
code = schCloneHbRpcCtx(&hb->rpcCtx, &rpcCtx);
|
||||||
memcpy(&trans, &hb->trans, sizeof(trans));
|
TAOS_MEMCPY(&trans, &hb->trans, sizeof(trans));
|
||||||
SCH_UNLOCK(SCH_WRITE, &hb->lock);
|
SCH_UNLOCK(SCH_WRITE, &hb->lock);
|
||||||
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
|
|
||||||
|
@ -1039,7 +1071,7 @@ int32_t schBuildAndSendHbMsg(SQueryNodeEpId *nodeEpId, SArray *taskAction) {
|
||||||
SQueryNodeAddr addr = {.nodeId = nodeEpId->nodeId};
|
SQueryNodeAddr addr = {.nodeId = nodeEpId->nodeId};
|
||||||
addr.epSet.inUse = 0;
|
addr.epSet.inUse = 0;
|
||||||
addr.epSet.numOfEps = 1;
|
addr.epSet.numOfEps = 1;
|
||||||
memcpy(&addr.epSet.eps[0], &nodeEpId->ep, sizeof(nodeEpId->ep));
|
TAOS_MEMCPY(&addr.epSet.eps[0], &nodeEpId->ep, sizeof(nodeEpId->ep));
|
||||||
|
|
||||||
code = schAsyncSendMsg(NULL, NULL, &trans, &addr, msgType, msg, msgSize, true, &rpcCtx);
|
code = schAsyncSendMsg(NULL, NULL, &trans, &addr, msgType, msg, msgSize, true, &rpcCtx);
|
||||||
msg = NULL;
|
msg = NULL;
|
||||||
|
@ -1064,6 +1096,11 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
|
|
||||||
if (NULL == addr) {
|
if (NULL == addr) {
|
||||||
addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("fail to get condidateAddr, candidateIdx %d, totalNum: %d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_JRET(terrno);
|
||||||
|
}
|
||||||
|
|
||||||
isCandidateAddr = true;
|
isCandidateAddr = true;
|
||||||
SCH_TASK_DLOG("target candidateIdx %d, epInUse %d/%d", pTask->candidateIdx, addr->epSet.inUse,
|
SCH_TASK_DLOG("target candidateIdx %d, epInUse %d/%d", pTask->candidateIdx, addr->epSet.inUse,
|
||||||
addr->epSet.numOfEps);
|
addr->epSet.numOfEps);
|
||||||
|
@ -1082,7 +1119,7 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
memcpy(msg, pTask->msg, msgSize);
|
TAOS_MEMCPY(msg, pTask->msg, msgSize);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1098,13 +1135,21 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
req.msg = pTask->msg;
|
req.msg = pTask->msg;
|
||||||
req.source = pJob->source;
|
req.source = pJob->source;
|
||||||
msgSize = tSerializeSVDeleteReq(NULL, 0, &req);
|
msgSize = tSerializeSVDeleteReq(NULL, 0, &req);
|
||||||
|
if (msgSize < 0) {
|
||||||
|
SCH_TASK_ELOG("tSerializeSVDeleteReq failed, code:%x", terrno);
|
||||||
|
SCH_ERR_JRET(terrno);
|
||||||
|
}
|
||||||
msg = taosMemoryCalloc(1, msgSize);
|
msg = taosMemoryCalloc(1, msgSize);
|
||||||
if (NULL == msg) {
|
if (NULL == msg) {
|
||||||
SCH_TASK_ELOG("calloc %d failed", msgSize);
|
SCH_TASK_ELOG("calloc %d failed", msgSize);
|
||||||
SCH_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
|
SCH_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
|
||||||
}
|
}
|
||||||
|
|
||||||
tSerializeSVDeleteReq(msg, msgSize, &req);
|
msgSize = tSerializeSVDeleteReq(msg, msgSize, &req);
|
||||||
|
if (msgSize < 0) {
|
||||||
|
SCH_TASK_ELOG("tSerializeSVDeleteReq second failed, code:%x", terrno);
|
||||||
|
SCH_ERR_JRET(terrno);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TDMT_SCH_QUERY:
|
case TDMT_SCH_QUERY:
|
||||||
|
@ -1221,7 +1266,7 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
|
||||||
req.sId = schMgmt.sId;
|
req.sId = schMgmt.sId;
|
||||||
req.header.vgId = addr->nodeId;
|
req.header.vgId = addr->nodeId;
|
||||||
req.epId.nodeId = addr->nodeId;
|
req.epId.nodeId = addr->nodeId;
|
||||||
memcpy(&req.epId.ep, SCH_GET_CUR_EP(addr), sizeof(SEp));
|
TAOS_MEMCPY(&req.epId.ep, SCH_GET_CUR_EP(addr), sizeof(SEp));
|
||||||
|
|
||||||
msgSize = tSerializeSSchedulerHbReq(NULL, 0, &req);
|
msgSize = tSerializeSSchedulerHbReq(NULL, 0, &req);
|
||||||
if (msgSize < 0) {
|
if (msgSize < 0) {
|
||||||
|
|
|
@ -43,7 +43,7 @@ int32_t schSwitchJobStatus(SSchJob* pJob, int32_t status, void* param) {
|
||||||
SCH_RET(schProcessOnJobFailure(pJob, (param ? *(int32_t*)param : 0)));
|
SCH_RET(schProcessOnJobFailure(pJob, (param ? *(int32_t*)param : 0)));
|
||||||
break;
|
break;
|
||||||
case JOB_TASK_STATUS_DROP:
|
case JOB_TASK_STATUS_DROP:
|
||||||
schProcessOnJobDropped(pJob, *(int32_t*)param);
|
(void)schProcessOnJobDropped(pJob, *(int32_t*)param); // ignore error
|
||||||
|
|
||||||
if (taosRemoveRef(schMgmt.jobRef, pJob->refId)) {
|
if (taosRemoveRef(schMgmt.jobRef, pJob->refId)) {
|
||||||
SCH_JOB_ELOG("remove job from job list failed, refId:0x%" PRIx64, pJob->refId);
|
SCH_JOB_ELOG("remove job from job list failed, refId:0x%" PRIx64, pJob->refId);
|
||||||
|
@ -65,7 +65,8 @@ _return:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schHandleOpBeginEvent(int64_t jobId, SSchJob** job, SCH_OP_TYPE type, SSchedulerReq* pReq) {
|
int32_t schHandleOpBeginEvent(int64_t jobId, SSchJob** job, SCH_OP_TYPE type, SSchedulerReq* pReq) {
|
||||||
SSchJob* pJob = schAcquireJob(jobId);
|
SSchJob* pJob = NULL;
|
||||||
|
(void)schAcquireJob(jobId, &pJob);
|
||||||
if (NULL == pJob) {
|
if (NULL == pJob) {
|
||||||
qDebug("Acquire sch job failed, may be dropped, jobId:0x%" PRIx64, jobId);
|
qDebug("Acquire sch job failed, may be dropped, jobId:0x%" PRIx64, jobId);
|
||||||
SCH_ERR_RET(TSDB_CODE_SCH_JOB_NOT_EXISTS);
|
SCH_ERR_RET(TSDB_CODE_SCH_JOB_NOT_EXISTS);
|
||||||
|
@ -90,7 +91,7 @@ int32_t schHandleOpEndEvent(SSchJob* pJob, SCH_OP_TYPE type, SSchedulerReq* pReq
|
||||||
code = pJob->errCode;
|
code = pJob->errCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
schReleaseJob(pJob->refId);
|
(void)schReleaseJob(pJob->refId); // ignore error
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -165,7 +165,7 @@ int32_t schUpdateTaskHandle(SSchJob *pJob, SSchTask *pTask, bool dropExecNode, v
|
||||||
SCH_RET(schDropTaskExecNode(pJob, pTask, handle, execId));
|
SCH_RET(schDropTaskExecNode(pJob, pTask, handle, execId));
|
||||||
}
|
}
|
||||||
|
|
||||||
schUpdateTaskExecNode(pJob, pTask, handle, execId);
|
SCH_ERR_RET(schUpdateTaskExecNode(pJob, pTask, handle, execId));
|
||||||
|
|
||||||
if ((execId != pTask->execId || execId <= pTask->failedExecId) || pTask->waitRetry) { // ignore it
|
if ((execId != pTask->execId || execId <= pTask->failedExecId) || pTask->waitRetry) { // ignore it
|
||||||
SCH_TASK_DLOG("handle not updated since execId %d is already not current execId %d, waitRetry %d", execId,
|
SCH_TASK_DLOG("handle not updated since execId %d is already not current execId %d, waitRetry %d", execId,
|
||||||
|
@ -297,6 +297,10 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < parentNum; ++i) {
|
for (int32_t i = 0; i < parentNum; ++i) {
|
||||||
SSchTask *parent = *(SSchTask **)taosArrayGet(pTask->parents, i);
|
SSchTask *parent = *(SSchTask **)taosArrayGet(pTask->parents, i);
|
||||||
|
if (NULL == parent) {
|
||||||
|
SCH_TASK_ELOG("fail to get task %d parent, parentNum: %d", i, parentNum);
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SCH_LOCK(SCH_WRITE, &parent->planLock);
|
SCH_LOCK(SCH_WRITE, &parent->planLock);
|
||||||
SDownstreamSourceNode source = {
|
SDownstreamSourceNode source = {
|
||||||
|
@ -308,9 +312,14 @@ int32_t schProcessOnTaskSuccess(SSchJob *pJob, SSchTask *pTask) {
|
||||||
.fetchMsgType = SCH_FETCH_TYPE(pTask),
|
.fetchMsgType = SCH_FETCH_TYPE(pTask),
|
||||||
.localExec = SCH_IS_LOCAL_EXEC_TASK(pJob, pTask),
|
.localExec = SCH_IS_LOCAL_EXEC_TASK(pJob, pTask),
|
||||||
};
|
};
|
||||||
qSetSubplanExecutionNode(parent->plan, pTask->plan->id.groupId, &source);
|
code = qSetSubplanExecutionNode(parent->plan, pTask->plan->id.groupId, &source);
|
||||||
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
|
SCH_TASK_ELOG("qSetSubplanExecutionNode failed, groupId: %d", pTask->plan->id.groupId);
|
||||||
|
}
|
||||||
SCH_UNLOCK(SCH_WRITE, &parent->planLock);
|
SCH_UNLOCK(SCH_WRITE, &parent->planLock);
|
||||||
|
|
||||||
|
SCH_ERR_RET(code);
|
||||||
|
|
||||||
int32_t readyNum = atomic_add_fetch_32(&parent->childReady, 1);
|
int32_t readyNum = atomic_add_fetch_32(&parent->childReady, 1);
|
||||||
|
|
||||||
if (SCH_TASK_READY_FOR_LAUNCH(readyNum, parent)) {
|
if (SCH_TASK_READY_FOR_LAUNCH(readyNum, parent)) {
|
||||||
|
@ -413,16 +422,16 @@ void schResetTaskForRetry(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
schDropTaskOnExecNode(pJob, pTask);
|
schDropTaskOnExecNode(pJob, pTask);
|
||||||
if (pTask->delayTimer) {
|
if (pTask->delayTimer) {
|
||||||
taosTmrStopA(&pTask->delayTimer);
|
(void)taosTmrStopA(&pTask->delayTimer); // ignore error
|
||||||
}
|
}
|
||||||
taosHashClear(pTask->execNodes);
|
taosHashClear(pTask->execNodes);
|
||||||
schRemoveTaskFromExecList(pJob, pTask);
|
(void)schRemoveTaskFromExecList(pJob, pTask); // ignore error
|
||||||
schDeregisterTaskHb(pJob, pTask);
|
schDeregisterTaskHb(pJob, pTask);
|
||||||
taosMemoryFreeClear(pTask->msg);
|
taosMemoryFreeClear(pTask->msg);
|
||||||
pTask->msgLen = 0;
|
pTask->msgLen = 0;
|
||||||
pTask->lastMsgType = 0;
|
pTask->lastMsgType = 0;
|
||||||
pTask->childReady = 0;
|
pTask->childReady = 0;
|
||||||
memset(&pTask->succeedAddr, 0, sizeof(pTask->succeedAddr));
|
TAOS_MEMSET(&pTask->succeedAddr, 0, sizeof(pTask->succeedAddr));
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32_t rspCode) {
|
int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32_t rspCode) {
|
||||||
|
@ -443,11 +452,21 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32
|
||||||
SCH_ERR_JRET(schUpdateTaskCandidateAddr(pJob, pTask, pData->pEpSet));
|
SCH_ERR_JRET(schUpdateTaskCandidateAddr(pJob, pTask, pData->pEpSet));
|
||||||
} else if (SYNC_SELF_LEADER_REDIRECT_ERROR(rspCode)) {
|
} else if (SYNC_SELF_LEADER_REDIRECT_ERROR(rspCode)) {
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth condidateAddr, totalNum:%d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_JRET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SEp *pEp = &addr->epSet.eps[addr->epSet.inUse];
|
SEp *pEp = &addr->epSet.eps[addr->epSet.inUse];
|
||||||
SCH_TASK_DLOG("task retry node %d current ep, idx:%d/%d,%s:%d, code:%s", addr->nodeId, addr->epSet.inUse,
|
SCH_TASK_DLOG("task retry node %d current ep, idx:%d/%d,%s:%d, code:%s", addr->nodeId, addr->epSet.inUse,
|
||||||
addr->epSet.numOfEps, pEp->fqdn, pEp->port, tstrerror(rspCode));
|
addr->epSet.numOfEps, pEp->fqdn, pEp->port, tstrerror(rspCode));
|
||||||
} else {
|
} else {
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth condidateAddr, totalNum:%d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_JRET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SCH_SWITCH_EPSET(addr);
|
SCH_SWITCH_EPSET(addr);
|
||||||
SCH_TASK_DLOG("switch task target node %d epset to %d/%d", addr->nodeId, addr->epSet.inUse, addr->epSet.numOfEps);
|
SCH_TASK_DLOG("switch task target node %d epset to %d/%d", addr->nodeId, addr->epSet.inUse, addr->epSet.numOfEps);
|
||||||
}
|
}
|
||||||
|
@ -476,7 +495,7 @@ int32_t schDoTaskRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32
|
||||||
for (int32_t i = 0; i < childrenNum; ++i) {
|
for (int32_t i = 0; i < childrenNum; ++i) {
|
||||||
SSchTask *pChild = taosArrayGetP(pTask->children, i);
|
SSchTask *pChild = taosArrayGetP(pTask->children, i);
|
||||||
SCH_LOCK_TASK(pChild);
|
SCH_LOCK_TASK(pChild);
|
||||||
schDoTaskRedirect(pJob, pChild, NULL, rspCode);
|
(void)schDoTaskRedirect(pJob, pChild, NULL, rspCode); // error handled internal
|
||||||
SCH_UNLOCK_TASK(pChild);
|
SCH_UNLOCK_TASK(pChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -494,18 +513,23 @@ int32_t schResetTaskSetLevelInfo(SSchJob *pJob, SSchTask *pTask) {
|
||||||
atomic_load_32(&pLevel->taskExecDoneNum), atomic_load_32(&pLevel->taskLaunchedNum));
|
atomic_load_32(&pLevel->taskExecDoneNum), atomic_load_32(&pLevel->taskLaunchedNum));
|
||||||
|
|
||||||
if (SCH_GET_TASK_STATUS(pTask) >= JOB_TASK_STATUS_PART_SUCC) {
|
if (SCH_GET_TASK_STATUS(pTask) >= JOB_TASK_STATUS_PART_SUCC) {
|
||||||
atomic_sub_fetch_32(&pLevel->taskExecDoneNum, 1);
|
(void)atomic_sub_fetch_32(&pLevel->taskExecDoneNum, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_sub_fetch_32(&pLevel->taskLaunchedNum, 1);
|
(void)atomic_sub_fetch_32(&pLevel->taskLaunchedNum, 1);
|
||||||
|
|
||||||
int32_t childrenNum = taosArrayGetSize(pTask->children);
|
int32_t childrenNum = taosArrayGetSize(pTask->children);
|
||||||
for (int32_t i = 0; i < childrenNum; ++i) {
|
for (int32_t i = 0; i < childrenNum; ++i) {
|
||||||
SSchTask *pChild = taosArrayGetP(pTask->children, i);
|
SSchTask *pChild = taosArrayGetP(pTask->children, i);
|
||||||
|
if (NULL == pChild) {
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth child, childrenNum:%d", i, childrenNum);
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SCH_LOCK_TASK(pChild);
|
SCH_LOCK_TASK(pChild);
|
||||||
pLevel = pChild->level;
|
pLevel = pChild->level;
|
||||||
atomic_sub_fetch_32(&pLevel->taskExecDoneNum, 1);
|
(void)atomic_sub_fetch_32(&pLevel->taskExecDoneNum, 1);
|
||||||
atomic_sub_fetch_32(&pLevel->taskLaunchedNum, 1);
|
(void)atomic_sub_fetch_32(&pLevel->taskLaunchedNum, 1);
|
||||||
SCH_UNLOCK_TASK(pChild);
|
SCH_UNLOCK_TASK(pChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -711,9 +735,9 @@ int32_t schTaskCheckSetRetry(SSchJob *pJob, SSchTask *pTask, int32_t errCode, bo
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) {
|
int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) {
|
||||||
atomic_sub_fetch_32(&pTask->level->taskLaunchedNum, 1);
|
(void)atomic_sub_fetch_32(&pTask->level->taskLaunchedNum, 1);
|
||||||
|
|
||||||
schRemoveTaskFromExecList(pJob, pTask);
|
(void)schRemoveTaskFromExecList(pJob, pTask); // ignore error
|
||||||
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_INIT);
|
SCH_SET_TASK_STATUS(pTask, JOB_TASK_STATUS_INIT);
|
||||||
|
|
||||||
if (SCH_TASK_NEED_FLOW_CTRL(pJob, pTask)) {
|
if (SCH_TASK_NEED_FLOW_CTRL(pJob, pTask)) {
|
||||||
|
@ -724,6 +748,11 @@ int32_t schHandleTaskRetry(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
if (SCH_IS_DATA_BIND_TASK(pTask)) {
|
if (SCH_IS_DATA_BIND_TASK(pTask)) {
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("fail to the %dth condidateAddr, totalNum:%d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SCH_SWITCH_EPSET(addr);
|
SCH_SWITCH_EPSET(addr);
|
||||||
} else {
|
} else {
|
||||||
SCH_ERR_RET(schSwitchTaskCandidateAddr(pJob, pTask));
|
SCH_ERR_RET(schSwitchTaskCandidateAddr(pJob, pTask));
|
||||||
|
@ -743,6 +772,11 @@ int32_t schSetAddrsFromNodeList(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < nodeNum; ++i) {
|
for (int32_t i = 0; i < nodeNum; ++i) {
|
||||||
SQueryNodeLoad *nload = taosArrayGet(pJob->nodeList, i);
|
SQueryNodeLoad *nload = taosArrayGet(pJob->nodeList, i);
|
||||||
|
if (NULL == nload) {
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth node in nodeList, nodeNum:%d", i, nodeNum);
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
SQueryNodeAddr *naddr = &nload->addr;
|
SQueryNodeAddr *naddr = &nload->addr;
|
||||||
|
|
||||||
if (NULL == taosArrayPush(pTask->candidateAddrs, naddr)) {
|
if (NULL == taosArrayPush(pTask->candidateAddrs, naddr)) {
|
||||||
|
@ -810,6 +844,7 @@ int32_t schSetTaskCandidateAddrs(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schUpdateTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask, SEpSet *pEpSet) {
|
int32_t schUpdateTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask, SEpSet *pEpSet) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (NULL == pTask->candidateAddrs || 1 != taosArrayGetSize(pTask->candidateAddrs)) {
|
if (NULL == pTask->candidateAddrs || 1 != taosArrayGetSize(pTask->candidateAddrs)) {
|
||||||
SCH_TASK_ELOG("not able to update cndidate addr, addr num %d",
|
SCH_TASK_ELOG("not able to update cndidate addr, addr num %d",
|
||||||
(int32_t)(pTask->candidateAddrs ? taosArrayGetSize(pTask->candidateAddrs) : 0));
|
(int32_t)(pTask->candidateAddrs ? taosArrayGetSize(pTask->candidateAddrs) : 0));
|
||||||
|
@ -817,18 +852,27 @@ int32_t schUpdateTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask, SEpSet *pEpSe
|
||||||
}
|
}
|
||||||
|
|
||||||
SQueryNodeAddr *pAddr = taosArrayGet(pTask->candidateAddrs, 0);
|
SQueryNodeAddr *pAddr = taosArrayGet(pTask->candidateAddrs, 0);
|
||||||
|
if (NULL == pAddr) {
|
||||||
|
SCH_TASK_ELOG("fail to get task 0th condidataAddr, totalNum:%d", (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
SCH_ERR_RET(TSDB_CODE_SCH_INTERNAL_ERROR);
|
||||||
|
}
|
||||||
|
|
||||||
char *origEpset = schDumpEpSet(&pAddr->epSet);
|
char *origEpset = NULL;
|
||||||
char *newEpset = schDumpEpSet(pEpSet);
|
char *newEpset = NULL;
|
||||||
|
|
||||||
|
SCH_ERR_RET(schDumpEpSet(&pAddr->epSet, &origEpset));
|
||||||
|
SCH_ERR_JRET(schDumpEpSet(pEpSet, &newEpset));
|
||||||
|
|
||||||
SCH_TASK_DLOG("update task target node %d epset from %s to %s", pAddr->nodeId, origEpset, newEpset);
|
SCH_TASK_DLOG("update task target node %d epset from %s to %s", pAddr->nodeId, origEpset, newEpset);
|
||||||
|
|
||||||
|
TAOS_MEMCPY(&pAddr->epSet, pEpSet, sizeof(pAddr->epSet));
|
||||||
|
|
||||||
|
_return:
|
||||||
|
|
||||||
taosMemoryFree(origEpset);
|
taosMemoryFree(origEpset);
|
||||||
taosMemoryFree(newEpset);
|
taosMemoryFree(newEpset);
|
||||||
|
|
||||||
memcpy(&pAddr->epSet, pEpSet, sizeof(pAddr->epSet));
|
return code;
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schSwitchTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask) {
|
int32_t schSwitchTaskCandidateAddr(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
@ -877,7 +921,6 @@ void schDropTaskOnExecNode(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t size = (int32_t)taosHashGetSize(pTask->execNodes);
|
int32_t size = (int32_t)taosHashGetSize(pTask->execNodes);
|
||||||
|
|
||||||
if (size <= 0) {
|
if (size <= 0) {
|
||||||
SCH_TASK_DLOG("task has no execNodes, no need to drop it, status:%s", SCH_GET_TASK_STATUS_STR(pTask));
|
SCH_TASK_DLOG("task has no execNodes, no need to drop it, status:%s", SCH_GET_TASK_STATUS_STR(pTask));
|
||||||
return;
|
return;
|
||||||
|
@ -889,7 +932,7 @@ void schDropTaskOnExecNode(SSchJob *pJob, SSchTask *pTask) {
|
||||||
if (nodeInfo->handle) {
|
if (nodeInfo->handle) {
|
||||||
SCH_SET_TASK_HANDLE(pTask, nodeInfo->handle);
|
SCH_SET_TASK_HANDLE(pTask, nodeInfo->handle);
|
||||||
void *pExecId = taosHashGetKey(nodeInfo, NULL);
|
void *pExecId = taosHashGetKey(nodeInfo, NULL);
|
||||||
schBuildAndSendMsg(pJob, pTask, &nodeInfo->addr, TDMT_SCH_DROP_TASK, pExecId);
|
(void)schBuildAndSendMsg(pJob, pTask, &nodeInfo->addr, TDMT_SCH_DROP_TASK, pExecId); // ignore error and continue
|
||||||
|
|
||||||
SCH_TASK_DLOG("start to drop task's %dth execNode", i);
|
SCH_TASK_DLOG("start to drop task's %dth execNode", i);
|
||||||
} else {
|
} else {
|
||||||
|
@ -939,6 +982,11 @@ int32_t schProcessOnTaskStatusRsp(SQueryNodeEpId *pEpId, SArray *pStatusList) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < taskNum; ++i) {
|
for (int32_t i = 0; i < taskNum; ++i) {
|
||||||
STaskStatus *pStatus = taosArrayGet(pStatusList, i);
|
STaskStatus *pStatus = taosArrayGet(pStatusList, i);
|
||||||
|
if (NULL == pStatus) {
|
||||||
|
qError("fail to get the %dth task status in hb rsp, taskNum:%d", i, taskNum);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ",EID:%d task status in server: %s", pStatus->queryId, pStatus->taskId,
|
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ",EID:%d task status in server: %s", pStatus->queryId, pStatus->taskId,
|
||||||
|
@ -983,10 +1031,15 @@ int32_t schHandleExplainRes(SArray *pExplainRes) {
|
||||||
|
|
||||||
for (int32_t i = 0; i < resNum; ++i) {
|
for (int32_t i = 0; i < resNum; ++i) {
|
||||||
SExplainLocalRsp *localRsp = taosArrayGet(pExplainRes, i);
|
SExplainLocalRsp *localRsp = taosArrayGet(pExplainRes, i);
|
||||||
|
if (NULL == localRsp) {
|
||||||
|
qError("fail to get the %dth LOCAL explain rsp msg, total:%d", i, resNum);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ", begin to handle LOCAL explain rsp msg", localRsp->qId, localRsp->tId);
|
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ", begin to handle LOCAL explain rsp msg", localRsp->qId, localRsp->tId);
|
||||||
|
|
||||||
pJob = schAcquireJob(localRsp->rId);
|
pJob = NULL;
|
||||||
|
(void)schAcquireJob(localRsp->rId, &pJob);
|
||||||
if (NULL == pJob) {
|
if (NULL == pJob) {
|
||||||
qWarn("QID:0x%" PRIx64 ",TID:0x%" PRIx64 "job no exist, may be dropped, refId:0x%" PRIx64, localRsp->qId,
|
qWarn("QID:0x%" PRIx64 ",TID:0x%" PRIx64 "job no exist, may be dropped, refId:0x%" PRIx64, localRsp->qId,
|
||||||
localRsp->tId, localRsp->rId);
|
localRsp->tId, localRsp->rId);
|
||||||
|
@ -996,7 +1049,7 @@ int32_t schHandleExplainRes(SArray *pExplainRes) {
|
||||||
int8_t status = 0;
|
int8_t status = 0;
|
||||||
if (schJobNeedToStop(pJob, &status)) {
|
if (schJobNeedToStop(pJob, &status)) {
|
||||||
SCH_TASK_DLOG("will not do further processing cause of job status %s", jobTaskStatusStr(status));
|
SCH_TASK_DLOG("will not do further processing cause of job status %s", jobTaskStatusStr(status));
|
||||||
schReleaseJob(pJob->refId);
|
(void)schReleaseJob(pJob->refId);
|
||||||
SCH_ERR_JRET(TSDB_CODE_SCH_IGNORE_ERROR);
|
SCH_ERR_JRET(TSDB_CODE_SCH_IGNORE_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1006,7 +1059,7 @@ int32_t schHandleExplainRes(SArray *pExplainRes) {
|
||||||
code = schProcessExplainRsp(pJob, pTask, &localRsp->rsp);
|
code = schProcessExplainRsp(pJob, pTask, &localRsp->rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
schReleaseJob(pJob->refId);
|
(void)schReleaseJob(pJob->refId);
|
||||||
|
|
||||||
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ", end to handle LOCAL explain rsp msg, code:%x", localRsp->qId,
|
qDebug("QID:0x%" PRIx64 ",TID:0x%" PRIx64 ", end to handle LOCAL explain rsp msg, code:%x", localRsp->qId,
|
||||||
localRsp->tId, code);
|
localRsp->tId, code);
|
||||||
|
@ -1022,6 +1075,11 @@ _return:
|
||||||
|
|
||||||
for (int32_t i = 0; i < resNum; ++i) {
|
for (int32_t i = 0; i < resNum; ++i) {
|
||||||
SExplainLocalRsp *localRsp = taosArrayGet(pExplainRes, i);
|
SExplainLocalRsp *localRsp = taosArrayGet(pExplainRes, i);
|
||||||
|
if (NULL == localRsp) {
|
||||||
|
qError("in _return fail to get the %dth LOCAL explain rsp msg, total:%d", i, resNum);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
tFreeSExplainRsp(&localRsp->rsp);
|
tFreeSExplainRsp(&localRsp->rsp);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1076,6 +1134,9 @@ int32_t schLaunchLocalTask(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
if (SCH_IS_EXPLAIN_JOB(pJob)) {
|
if (SCH_IS_EXPLAIN_JOB(pJob)) {
|
||||||
explainRes = taosArrayInit(pJob->taskNum, sizeof(SExplainLocalRsp));
|
explainRes = taosArrayInit(pJob->taskNum, sizeof(SExplainLocalRsp));
|
||||||
|
if (NULL == explainRes) {
|
||||||
|
SCH_ERR_RET(terrno);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_JRET(qWorkerProcessLocalQuery(schMgmt.queryMgmt, schMgmt.sId, pJob->queryId, pTask->taskId, pJob->refId,
|
SCH_ERR_JRET(qWorkerProcessLocalQuery(schMgmt.queryMgmt, schMgmt.sId, pJob->queryId, pTask->taskId, pJob->refId,
|
||||||
|
@ -1097,7 +1158,9 @@ _return:
|
||||||
|
|
||||||
int32_t schLaunchTaskImpl(void *param) {
|
int32_t schLaunchTaskImpl(void *param) {
|
||||||
SSchTaskCtx *pCtx = (SSchTaskCtx *)param;
|
SSchTaskCtx *pCtx = (SSchTaskCtx *)param;
|
||||||
SSchJob *pJob = schAcquireJob(pCtx->jobRid);
|
SSchJob *pJob = NULL;
|
||||||
|
|
||||||
|
(void)schAcquireJob(pCtx->jobRid, &pJob);
|
||||||
if (NULL == pJob) {
|
if (NULL == pJob) {
|
||||||
qDebug("job refId 0x%" PRIx64 " already not exist", pCtx->jobRid);
|
qDebug("job refId 0x%" PRIx64 " already not exist", pCtx->jobRid);
|
||||||
taosMemoryFree(param);
|
taosMemoryFree(param);
|
||||||
|
@ -1113,7 +1176,7 @@ int32_t schLaunchTaskImpl(void *param) {
|
||||||
int8_t status = 0;
|
int8_t status = 0;
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
atomic_add_fetch_32(&pTask->level->taskLaunchedNum, 1);
|
(void)atomic_add_fetch_32(&pTask->level->taskLaunchedNum, 1);
|
||||||
pTask->execId++;
|
pTask->execId++;
|
||||||
pTask->retryTimes++;
|
pTask->retryTimes++;
|
||||||
pTask->waitRetry = false;
|
pTask->waitRetry = false;
|
||||||
|
@ -1160,7 +1223,7 @@ _return:
|
||||||
SCH_UNLOCK_TASK(pTask);
|
SCH_UNLOCK_TASK(pTask);
|
||||||
}
|
}
|
||||||
|
|
||||||
schReleaseJob(pJob->refId);
|
(void)schReleaseJob(pJob->refId);
|
||||||
|
|
||||||
taosMemoryFree(param);
|
taosMemoryFree(param);
|
||||||
|
|
||||||
|
@ -1178,7 +1241,7 @@ int32_t schAsyncLaunchTaskImpl(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
if (pJob->taskNum >= SCH_MIN_AYSNC_EXEC_NUM) {
|
if (pJob->taskNum >= SCH_MIN_AYSNC_EXEC_NUM) {
|
||||||
param->asyncLaunch = true;
|
param->asyncLaunch = true;
|
||||||
taosAsyncExec(schLaunchTaskImpl, param, NULL);
|
SCH_ERR_RET(taosAsyncExec(schLaunchTaskImpl, param, NULL));
|
||||||
} else {
|
} else {
|
||||||
SCH_ERR_RET(schLaunchTaskImpl(param));
|
SCH_ERR_RET(schLaunchTaskImpl(param));
|
||||||
}
|
}
|
||||||
|
@ -1252,7 +1315,7 @@ int32_t schDelayLaunchTask(SSchJob *pJob, SSchTask *pTask) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosTmrReset(schHandleTimerEvent, pTask->delayExecMs, (void *)param, schMgmt.timer, &pTask->delayTimer);
|
(void)taosTmrReset(schHandleTimerEvent, pTask->delayExecMs, (void *)param, schMgmt.timer, &pTask->delayTimer);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -1283,7 +1346,7 @@ void schDropTaskInHashList(SSchJob *pJob, SHashObj *list) {
|
||||||
|
|
||||||
SCH_LOCK_TASK(pTask);
|
SCH_LOCK_TASK(pTask);
|
||||||
if (pTask->delayTimer) {
|
if (pTask->delayTimer) {
|
||||||
taosTmrStopA(&pTask->delayTimer);
|
(void)taosTmrStopA(&pTask->delayTimer);
|
||||||
}
|
}
|
||||||
schDropTaskOnExecNode(pJob, pTask);
|
schDropTaskOnExecNode(pJob, pTask);
|
||||||
SCH_UNLOCK_TASK(pTask);
|
SCH_UNLOCK_TASK(pTask);
|
||||||
|
@ -1327,6 +1390,9 @@ int32_t schExecLocalFetch(SSchJob *pJob, SSchTask *pTask) {
|
||||||
|
|
||||||
if (SCH_IS_EXPLAIN_JOB(pJob)) {
|
if (SCH_IS_EXPLAIN_JOB(pJob)) {
|
||||||
explainRes = taosArrayInit(pJob->taskNum, sizeof(SExplainLocalRsp));
|
explainRes = taosArrayInit(pJob->taskNum, sizeof(SExplainLocalRsp));
|
||||||
|
if (NULL == explainRes) {
|
||||||
|
SCH_ERR_RET(terrno);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_ERR_JRET(qWorkerProcessLocalFetch(schMgmt.queryMgmt, schMgmt.sId, pJob->queryId, pTask->taskId, pJob->refId,
|
SCH_ERR_JRET(qWorkerProcessLocalFetch(schMgmt.queryMgmt, schMgmt.sId, pJob->queryId, pTask->taskId, pJob->refId,
|
||||||
|
|
|
@ -22,9 +22,14 @@
|
||||||
#include "tref.h"
|
#include "tref.h"
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
|
|
||||||
FORCE_INLINE SSchJob *schAcquireJob(int64_t refId) {
|
FORCE_INLINE int32_t schAcquireJob(int64_t refId, SSchJob** ppJob) {
|
||||||
qDebug("sch acquire jobId:0x%" PRIx64, refId);
|
qDebug("sch acquire jobId:0x%" PRIx64, refId);
|
||||||
return (SSchJob *)taosAcquireRef(schMgmt.jobRef, refId);
|
*ppJob = (SSchJob *)taosAcquireRef(schMgmt.jobRef, refId);
|
||||||
|
if (NULL == *ppJob) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE int32_t schReleaseJob(int64_t refId) {
|
FORCE_INLINE int32_t schReleaseJob(int64_t refId) {
|
||||||
|
@ -36,15 +41,16 @@ FORCE_INLINE int32_t schReleaseJob(int64_t refId) {
|
||||||
return taosReleaseRef(schMgmt.jobRef, refId);
|
return taosReleaseRef(schMgmt.jobRef, refId);
|
||||||
}
|
}
|
||||||
|
|
||||||
char *schDumpEpSet(SEpSet *pEpSet) {
|
int32_t schDumpEpSet(SEpSet *pEpSet, char** ppRes) {
|
||||||
|
*ppRes = NULL;
|
||||||
if (NULL == pEpSet) {
|
if (NULL == pEpSet) {
|
||||||
return NULL;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t maxSize = 1024;
|
int32_t maxSize = 1024;
|
||||||
char *str = taosMemoryMalloc(maxSize);
|
char *str = taosMemoryMalloc(maxSize);
|
||||||
if (NULL == str) {
|
if (NULL == str) {
|
||||||
return NULL;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
|
@ -54,7 +60,8 @@ char *schDumpEpSet(SEpSet *pEpSet) {
|
||||||
n += snprintf(str + n, maxSize - n, "[%s:%d]", pEp->fqdn, pEp->port);
|
n += snprintf(str + n, maxSize - n, "[%s:%d]", pEp->fqdn, pEp->port);
|
||||||
}
|
}
|
||||||
|
|
||||||
return str;
|
*ppRes = str;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
char *schGetOpStr(SCH_OP_TYPE type) {
|
char *schGetOpStr(SCH_OP_TYPE type) {
|
||||||
|
@ -73,7 +80,7 @@ char *schGetOpStr(SCH_OP_TYPE type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void schFreeHbTrans(SSchHbTrans *pTrans) {
|
void schFreeHbTrans(SSchHbTrans *pTrans) {
|
||||||
rpcReleaseHandle((void *)pTrans->trans.pHandleId, TAOS_CONN_CLIENT);
|
(void)rpcReleaseHandle((void *)pTrans->trans.pHandleId, TAOS_CONN_CLIENT);
|
||||||
|
|
||||||
schFreeRpcCtx(&pTrans->rpcCtx);
|
schFreeRpcCtx(&pTrans->rpcCtx);
|
||||||
}
|
}
|
||||||
|
@ -86,7 +93,7 @@ void schCleanClusterHb(void *pTrans) {
|
||||||
if (hb->trans.pTrans == pTrans) {
|
if (hb->trans.pTrans == pTrans) {
|
||||||
SQueryNodeEpId *pEpId = taosHashGetKey(hb, NULL);
|
SQueryNodeEpId *pEpId = taosHashGetKey(hb, NULL);
|
||||||
schFreeHbTrans(hb);
|
schFreeHbTrans(hb);
|
||||||
taosHashRemove(schMgmt.hbConnections, pEpId, sizeof(SQueryNodeEpId));
|
(void)taosHashRemove(schMgmt.hbConnections, pEpId, sizeof(SQueryNodeEpId));
|
||||||
}
|
}
|
||||||
|
|
||||||
hb = taosHashIterate(schMgmt.hbConnections, hb);
|
hb = taosHashIterate(schMgmt.hbConnections, hb);
|
||||||
|
@ -109,7 +116,7 @@ int32_t schRemoveHbConnection(SSchJob *pJob, SSchTask *pTask, SQueryNodeEpId *ep
|
||||||
int64_t taskNum = atomic_load_64(&hb->taskNum);
|
int64_t taskNum = atomic_load_64(&hb->taskNum);
|
||||||
if (taskNum <= 0) {
|
if (taskNum <= 0) {
|
||||||
schFreeHbTrans(hb);
|
schFreeHbTrans(hb);
|
||||||
taosHashRemove(schMgmt.hbConnections, epId, sizeof(SQueryNodeEpId));
|
(void)taosHashRemove(schMgmt.hbConnections, epId, sizeof(SQueryNodeEpId));
|
||||||
}
|
}
|
||||||
SCH_UNLOCK(SCH_WRITE, &schMgmt.hbLock);
|
SCH_UNLOCK(SCH_WRITE, &schMgmt.hbLock);
|
||||||
|
|
||||||
|
@ -165,7 +172,7 @@ int32_t schRegisterHbConnection(SSchJob *pJob, SSchTask *pTask, SQueryNodeEpId *
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_add_fetch_64(&hb->taskNum, 1);
|
(void)atomic_add_fetch_64(&hb->taskNum, 1);
|
||||||
|
|
||||||
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
|
|
||||||
|
@ -178,12 +185,17 @@ void schDeregisterTaskHb(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth condidateAddr in task, totalNum:%d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SQueryNodeEpId epId = {0};
|
SQueryNodeEpId epId = {0};
|
||||||
|
|
||||||
epId.nodeId = addr->nodeId;
|
epId.nodeId = addr->nodeId;
|
||||||
|
|
||||||
SEp *pEp = SCH_GET_CUR_EP(addr);
|
SEp *pEp = SCH_GET_CUR_EP(addr);
|
||||||
strcpy(epId.ep.fqdn, pEp->fqdn);
|
TAOS_STRCPY(epId.ep.fqdn, pEp->fqdn);
|
||||||
epId.ep.port = pEp->port;
|
epId.ep.port = pEp->port;
|
||||||
|
|
||||||
SCH_LOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_LOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
|
@ -197,7 +209,7 @@ void schDeregisterTaskHb(SSchJob *pJob, SSchTask *pTask) {
|
||||||
int64_t taskNum = atomic_sub_fetch_64(&hb->taskNum, 1);
|
int64_t taskNum = atomic_sub_fetch_64(&hb->taskNum, 1);
|
||||||
if (0 == taskNum) {
|
if (0 == taskNum) {
|
||||||
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
schRemoveHbConnection(pJob, pTask, &epId);
|
(void)schRemoveHbConnection(pJob, pTask, &epId);
|
||||||
} else {
|
} else {
|
||||||
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
}
|
}
|
||||||
|
@ -211,12 +223,17 @@ int32_t schEnsureHbConnection(SSchJob *pJob, SSchTask *pTask) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
SQueryNodeAddr *addr = taosArrayGet(pTask->candidateAddrs, pTask->candidateIdx);
|
||||||
|
if (NULL == addr) {
|
||||||
|
SCH_TASK_ELOG("fail to get the %dth condidateAddr in task, totalNum:%d", pTask->candidateIdx, (int32_t)taosArrayGetSize(pTask->candidateAddrs));
|
||||||
|
return TSDB_CODE_SCH_INTERNAL_ERROR;
|
||||||
|
}
|
||||||
|
|
||||||
SQueryNodeEpId epId = {0};
|
SQueryNodeEpId epId = {0};
|
||||||
|
|
||||||
epId.nodeId = addr->nodeId;
|
epId.nodeId = addr->nodeId;
|
||||||
|
|
||||||
SEp *pEp = SCH_GET_CUR_EP(addr);
|
SEp *pEp = SCH_GET_CUR_EP(addr);
|
||||||
strcpy(epId.ep.fqdn, pEp->fqdn);
|
TAOS_STRCPY(epId.ep.fqdn, pEp->fqdn);
|
||||||
epId.ep.port = pEp->port;
|
epId.ep.port = pEp->port;
|
||||||
|
|
||||||
SCH_ERR_RET(schRegisterHbConnection(pJob, pTask, &epId));
|
SCH_ERR_RET(schRegisterHbConnection(pJob, pTask, &epId));
|
||||||
|
@ -240,7 +257,7 @@ int32_t schUpdateHbConnection(SQueryNodeEpId *epId, SSchTrans *trans) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SCH_LOCK(SCH_WRITE, &hb->lock);
|
SCH_LOCK(SCH_WRITE, &hb->lock);
|
||||||
memcpy(&hb->trans, trans, sizeof(*trans));
|
TAOS_MEMCPY(&hb->trans, trans, sizeof(*trans));
|
||||||
SCH_UNLOCK(SCH_WRITE, &hb->lock);
|
SCH_UNLOCK(SCH_WRITE, &hb->lock);
|
||||||
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
SCH_UNLOCK(SCH_READ, &schMgmt.hbLock);
|
||||||
|
|
||||||
|
@ -256,7 +273,7 @@ void schCloseJobRef(void) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (schMgmt.jobRef >= 0) {
|
if (schMgmt.jobRef >= 0) {
|
||||||
taosCloseRef(schMgmt.jobRef);
|
(void)taosCloseRef(schMgmt.jobRef);
|
||||||
schMgmt.jobRef = -1;
|
schMgmt.jobRef = -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -169,7 +169,8 @@ void schedulerFreeJob(int64_t *jobId, int32_t errCode) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSchJob *pJob = schAcquireJob(*jobId);
|
SSchJob *pJob = NULL;
|
||||||
|
(void)schAcquireJob(*jobId, &pJob);
|
||||||
if (NULL == pJob) {
|
if (NULL == pJob) {
|
||||||
qWarn("Acquire sch job failed, may be dropped, jobId:0x%" PRIx64, *jobId);
|
qWarn("Acquire sch job failed, may be dropped, jobId:0x%" PRIx64, *jobId);
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -75,9 +75,7 @@ int32_t schtStartFetch = 0;
|
||||||
void schtInitLogFile() {
|
void schtInitLogFile() {
|
||||||
const char *defaultLogFileNamePrefix = "taoslog";
|
const char *defaultLogFileNamePrefix = "taoslog";
|
||||||
const int32_t maxLogFileNum = 10;
|
const int32_t maxLogFileNum = 10;
|
||||||
rpcInit();
|
|
||||||
tsAsyncLog = 0;
|
tsAsyncLog = 0;
|
||||||
rpcInit();
|
|
||||||
qDebugFlag = 159;
|
qDebugFlag = 159;
|
||||||
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
strcpy(tsLogDir, TD_LOG_DIR_PATH);
|
||||||
|
|
||||||
|
@ -136,8 +134,13 @@ int32_t schtBuildSubmitRspMsg(uint32_t *msize, void **rspMsg) {
|
||||||
|
|
||||||
tEncodeSize(tEncodeSSubmitRsp2, &submitRsp, msgSize, ret);
|
tEncodeSize(tEncodeSSubmitRsp2, &submitRsp, msgSize, ret);
|
||||||
void *msg = taosMemoryCalloc(1, msgSize);
|
void *msg = taosMemoryCalloc(1, msgSize);
|
||||||
|
if (NULL == msg) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
tEncoderInit(&ec, (uint8_t *)msg, msgSize);
|
tEncoderInit(&ec, (uint8_t *)msg, msgSize);
|
||||||
tEncodeSSubmitRsp2(&ec, &submitRsp);
|
if (tEncodeSSubmitRsp2(&ec, &submitRsp) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
tEncoderClear(&ec);
|
tEncoderClear(&ec);
|
||||||
|
|
||||||
*rspMsg = msg;
|
*rspMsg = msg;
|
||||||
|
@ -152,11 +155,26 @@ void schtBuildQueryDag(SQueryPlan *dag) {
|
||||||
dag->queryId = qId;
|
dag->queryId = qId;
|
||||||
dag->numOfSubplans = 2;
|
dag->numOfSubplans = 2;
|
||||||
dag->pSubplans = nodesMakeList();
|
dag->pSubplans = nodesMakeList();
|
||||||
|
if (NULL == dag->pSubplans) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SNodeListNode *scan = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode *scan = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
if (NULL == scan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SNodeListNode *merge = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode *merge = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
if (NULL == merge) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SSubplan *scanPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
SSubplan *scanPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
||||||
|
if (NULL == scanPlan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SSubplan *mergePlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
SSubplan *mergePlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
||||||
|
if (NULL == mergePlan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
scanPlan->id.queryId = qId;
|
scanPlan->id.queryId = qId;
|
||||||
scanPlan->id.groupId = 0x0000000000000002;
|
scanPlan->id.groupId = 0x0000000000000002;
|
||||||
|
@ -170,7 +188,13 @@ void schtBuildQueryDag(SQueryPlan *dag) {
|
||||||
scanPlan->pChildren = NULL;
|
scanPlan->pChildren = NULL;
|
||||||
scanPlan->level = 1;
|
scanPlan->level = 1;
|
||||||
scanPlan->pParents = nodesMakeList();
|
scanPlan->pParents = nodesMakeList();
|
||||||
|
if (NULL == scanPlan->pParents) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scanPlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN);
|
scanPlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN);
|
||||||
|
if (NULL == scanPlan->pNode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scanPlan->msgType = TDMT_SCH_QUERY;
|
scanPlan->msgType = TDMT_SCH_QUERY;
|
||||||
|
|
||||||
mergePlan->id.queryId = qId;
|
mergePlan->id.queryId = qId;
|
||||||
|
@ -181,21 +205,33 @@ void schtBuildQueryDag(SQueryPlan *dag) {
|
||||||
mergePlan->execNode.epSet.numOfEps = 0;
|
mergePlan->execNode.epSet.numOfEps = 0;
|
||||||
|
|
||||||
mergePlan->pChildren = nodesMakeList();
|
mergePlan->pChildren = nodesMakeList();
|
||||||
|
if (NULL == mergePlan->pChildren) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
mergePlan->pParents = NULL;
|
mergePlan->pParents = NULL;
|
||||||
mergePlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE);
|
mergePlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE);
|
||||||
|
if (NULL == mergePlan->pNode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
mergePlan->msgType = TDMT_SCH_QUERY;
|
mergePlan->msgType = TDMT_SCH_QUERY;
|
||||||
|
|
||||||
merge->pNodeList = nodesMakeList();
|
merge->pNodeList = nodesMakeList();
|
||||||
|
if (NULL == merge->pNodeList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scan->pNodeList = nodesMakeList();
|
scan->pNodeList = nodesMakeList();
|
||||||
|
if (NULL == scan->pNodeList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
nodesListAppend(merge->pNodeList, (SNode *)mergePlan);
|
(void)nodesListAppend(merge->pNodeList, (SNode *)mergePlan);
|
||||||
nodesListAppend(scan->pNodeList, (SNode *)scanPlan);
|
(void)nodesListAppend(scan->pNodeList, (SNode *)scanPlan);
|
||||||
|
|
||||||
nodesListAppend(mergePlan->pChildren, (SNode *)scanPlan);
|
(void)nodesListAppend(mergePlan->pChildren, (SNode *)scanPlan);
|
||||||
nodesListAppend(scanPlan->pParents, (SNode *)mergePlan);
|
(void)nodesListAppend(scanPlan->pParents, (SNode *)mergePlan);
|
||||||
|
|
||||||
nodesListAppend(dag->pSubplans, (SNode *)merge);
|
(void)nodesListAppend(dag->pSubplans, (SNode *)merge);
|
||||||
nodesListAppend(dag->pSubplans, (SNode *)scan);
|
(void)nodesListAppend(dag->pSubplans, (SNode *)scan);
|
||||||
}
|
}
|
||||||
|
|
||||||
void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) {
|
void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) {
|
||||||
|
@ -205,18 +241,42 @@ void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) {
|
||||||
dag->queryId = qId;
|
dag->queryId = qId;
|
||||||
dag->numOfSubplans = 2;
|
dag->numOfSubplans = 2;
|
||||||
dag->pSubplans = nodesMakeList();
|
dag->pSubplans = nodesMakeList();
|
||||||
|
if (NULL == dag->pSubplans) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SNodeListNode *scan = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode *scan = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
if (NULL == scan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SNodeListNode *merge = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode *merge = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
if (NULL == merge) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SSubplan *mergePlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
SSubplan *mergePlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
||||||
|
if (NULL == mergePlan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
merge->pNodeList = nodesMakeList();
|
merge->pNodeList = nodesMakeList();
|
||||||
|
if (NULL == merge->pNodeList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scan->pNodeList = nodesMakeList();
|
scan->pNodeList = nodesMakeList();
|
||||||
|
if (NULL == scan->pNodeList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
mergePlan->pChildren = nodesMakeList();
|
mergePlan->pChildren = nodesMakeList();
|
||||||
|
if (NULL == mergePlan->pChildren) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < scanPlanNum; ++i) {
|
for (int32_t i = 0; i < scanPlanNum; ++i) {
|
||||||
SSubplan *scanPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
SSubplan *scanPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
||||||
|
if (NULL == scanPlan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scanPlan->id.queryId = qId;
|
scanPlan->id.queryId = qId;
|
||||||
scanPlan->id.groupId = 0x0000000000000002;
|
scanPlan->id.groupId = 0x0000000000000002;
|
||||||
scanPlan->id.subplanId = 0x0000000000000003 + i;
|
scanPlan->id.subplanId = 0x0000000000000003 + i;
|
||||||
|
@ -233,13 +293,19 @@ void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) {
|
||||||
scanPlan->pChildren = NULL;
|
scanPlan->pChildren = NULL;
|
||||||
scanPlan->level = 1;
|
scanPlan->level = 1;
|
||||||
scanPlan->pParents = nodesMakeList();
|
scanPlan->pParents = nodesMakeList();
|
||||||
|
if (NULL == scanPlan->pParents) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scanPlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN);
|
scanPlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN);
|
||||||
|
if (NULL == scanPlan->pNode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
scanPlan->msgType = TDMT_SCH_QUERY;
|
scanPlan->msgType = TDMT_SCH_QUERY;
|
||||||
|
|
||||||
nodesListAppend(scanPlan->pParents, (SNode *)mergePlan);
|
(void)nodesListAppend(scanPlan->pParents, (SNode *)mergePlan);
|
||||||
nodesListAppend(mergePlan->pChildren, (SNode *)scanPlan);
|
(void)nodesListAppend(mergePlan->pChildren, (SNode *)scanPlan);
|
||||||
|
|
||||||
nodesListAppend(scan->pNodeList, (SNode *)scanPlan);
|
(void)nodesListAppend(scan->pNodeList, (SNode *)scanPlan);
|
||||||
}
|
}
|
||||||
|
|
||||||
mergePlan->id.queryId = qId;
|
mergePlan->id.queryId = qId;
|
||||||
|
@ -251,12 +317,15 @@ void schtBuildQueryFlowCtrlDag(SQueryPlan *dag) {
|
||||||
|
|
||||||
mergePlan->pParents = NULL;
|
mergePlan->pParents = NULL;
|
||||||
mergePlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE);
|
mergePlan->pNode = (SPhysiNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_MERGE);
|
||||||
|
if (NULL == mergePlan->pNode) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
mergePlan->msgType = TDMT_SCH_QUERY;
|
mergePlan->msgType = TDMT_SCH_QUERY;
|
||||||
|
|
||||||
nodesListAppend(merge->pNodeList, (SNode *)mergePlan);
|
(void)nodesListAppend(merge->pNodeList, (SNode *)mergePlan);
|
||||||
|
|
||||||
nodesListAppend(dag->pSubplans, (SNode *)merge);
|
(void)nodesListAppend(dag->pSubplans, (SNode *)merge);
|
||||||
nodesListAppend(dag->pSubplans, (SNode *)scan);
|
(void)nodesListAppend(dag->pSubplans, (SNode *)scan);
|
||||||
}
|
}
|
||||||
|
|
||||||
void schtFreeQueryDag(SQueryPlan *dag) {}
|
void schtFreeQueryDag(SQueryPlan *dag) {}
|
||||||
|
@ -267,10 +336,22 @@ void schtBuildInsertDag(SQueryPlan *dag) {
|
||||||
dag->queryId = qId;
|
dag->queryId = qId;
|
||||||
dag->numOfSubplans = 2;
|
dag->numOfSubplans = 2;
|
||||||
dag->pSubplans = nodesMakeList();
|
dag->pSubplans = nodesMakeList();
|
||||||
|
if (NULL == dag->pSubplans) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
SNodeListNode *inserta = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
SNodeListNode *inserta = (SNodeListNode *)nodesMakeNode(QUERY_NODE_NODE_LIST);
|
||||||
|
if (NULL == inserta) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
inserta->pNodeList = nodesMakeList();
|
inserta->pNodeList = nodesMakeList();
|
||||||
|
if (NULL == inserta->pNodeList) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
SSubplan *insertPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
SSubplan *insertPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
||||||
|
if (NULL == insertPlan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
insertPlan->id.queryId = qId;
|
insertPlan->id.queryId = qId;
|
||||||
insertPlan->id.groupId = 0x0000000000000003;
|
insertPlan->id.groupId = 0x0000000000000003;
|
||||||
|
@ -286,13 +367,22 @@ void schtBuildInsertDag(SQueryPlan *dag) {
|
||||||
insertPlan->pParents = NULL;
|
insertPlan->pParents = NULL;
|
||||||
insertPlan->pNode = NULL;
|
insertPlan->pNode = NULL;
|
||||||
insertPlan->pDataSink = (SDataSinkNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT);
|
insertPlan->pDataSink = (SDataSinkNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT);
|
||||||
|
if (NULL == insertPlan->pDataSink) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
((SDataInserterNode *)insertPlan->pDataSink)->size = 1;
|
((SDataInserterNode *)insertPlan->pDataSink)->size = 1;
|
||||||
((SDataInserterNode *)insertPlan->pDataSink)->pData = taosMemoryCalloc(1, 1);
|
((SDataInserterNode *)insertPlan->pDataSink)->pData = taosMemoryCalloc(1, 1);
|
||||||
|
if (NULL == ((SDataInserterNode *)insertPlan->pDataSink)->pData) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
insertPlan->msgType = TDMT_VND_SUBMIT;
|
insertPlan->msgType = TDMT_VND_SUBMIT;
|
||||||
|
|
||||||
nodesListAppend(inserta->pNodeList, (SNode *)insertPlan);
|
(void)nodesListAppend(inserta->pNodeList, (SNode *)insertPlan);
|
||||||
|
|
||||||
insertPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
insertPlan = (SSubplan *)nodesMakeNode(QUERY_NODE_PHYSICAL_SUBPLAN);
|
||||||
|
if (NULL == insertPlan) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
insertPlan->id.queryId = qId;
|
insertPlan->id.queryId = qId;
|
||||||
insertPlan->id.groupId = 0x0000000000000003;
|
insertPlan->id.groupId = 0x0000000000000003;
|
||||||
|
@ -308,22 +398,31 @@ void schtBuildInsertDag(SQueryPlan *dag) {
|
||||||
insertPlan->pParents = NULL;
|
insertPlan->pParents = NULL;
|
||||||
insertPlan->pNode = NULL;
|
insertPlan->pNode = NULL;
|
||||||
insertPlan->pDataSink = (SDataSinkNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT);
|
insertPlan->pDataSink = (SDataSinkNode *)nodesMakeNode(QUERY_NODE_PHYSICAL_PLAN_INSERT);
|
||||||
|
if (NULL == insertPlan->pDataSink) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
((SDataInserterNode *)insertPlan->pDataSink)->size = 1;
|
((SDataInserterNode *)insertPlan->pDataSink)->size = 1;
|
||||||
((SDataInserterNode *)insertPlan->pDataSink)->pData = taosMemoryCalloc(1, 1);
|
((SDataInserterNode *)insertPlan->pDataSink)->pData = taosMemoryCalloc(1, 1);
|
||||||
|
if (NULL == ((SDataInserterNode *)insertPlan->pDataSink)->pData) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
insertPlan->msgType = TDMT_VND_SUBMIT;
|
insertPlan->msgType = TDMT_VND_SUBMIT;
|
||||||
|
|
||||||
nodesListAppend(inserta->pNodeList, (SNode *)insertPlan);
|
(void)nodesListAppend(inserta->pNodeList, (SNode *)insertPlan);
|
||||||
|
|
||||||
nodesListAppend(dag->pSubplans, (SNode *)inserta);
|
(void)nodesListAppend(dag->pSubplans, (SNode *)inserta);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t schtPlanToString(const SSubplan *subplan, char **str, int32_t *len) {
|
int32_t schtPlanToString(const SSubplan *subplan, char **str, int32_t *len) {
|
||||||
*str = (char *)taosMemoryCalloc(1, 20);
|
*str = (char *)taosMemoryCalloc(1, 20);
|
||||||
|
if (NULL == *str) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
*len = 20;
|
*len = 20;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void schtExecNode(SSubplan *subplan, uint64_t groupId, SQueryNodeAddr *ep) {}
|
int32_t schtExecNode(SSubplan *subplan, uint64_t groupId, SQueryNodeAddr *ep) { return 0; }
|
||||||
|
|
||||||
void schtRpcSendRequest(void *shandle, const SEpSet *pEpSet, SRpcMsg *pMsg, int64_t *pRid) {}
|
void schtRpcSendRequest(void *shandle, const SEpSet *pEpSet, SRpcMsg *pMsg, int64_t *pRid) {}
|
||||||
|
|
||||||
|
@ -431,7 +530,10 @@ void *schtSendRsp(void *param) {
|
||||||
taosMsleep(1);
|
taosMsleep(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
pJob = schAcquireJob(job);
|
code = schAcquireJob(job, &pJob);
|
||||||
|
if (code) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
|
@ -439,16 +541,16 @@ void *schtSendRsp(void *param) {
|
||||||
|
|
||||||
SDataBuf msg = {0};
|
SDataBuf msg = {0};
|
||||||
void *rmsg = NULL;
|
void *rmsg = NULL;
|
||||||
schtBuildSubmitRspMsg(&msg.len, &rmsg);
|
(void)schtBuildSubmitRspMsg(&msg.len, &rmsg);
|
||||||
msg.msgType = TDMT_VND_SUBMIT_RSP;
|
msg.msgType = TDMT_VND_SUBMIT_RSP;
|
||||||
msg.pData = rmsg;
|
msg.pData = rmsg;
|
||||||
|
|
||||||
schHandleResponseMsg(pJob, task, task->execId, &msg, 0);
|
(void)schHandleResponseMsg(pJob, task, task->execId, &msg, 0);
|
||||||
|
|
||||||
pIter = taosHashIterate(pJob->execTasks, pIter);
|
pIter = taosHashIterate(pJob->execTasks, pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
schReleaseJob(job);
|
(void)schReleaseJob(job);
|
||||||
|
|
||||||
schtJobDone = true;
|
schtJobDone = true;
|
||||||
|
|
||||||
|
@ -457,20 +559,25 @@ void *schtSendRsp(void *param) {
|
||||||
|
|
||||||
void *schtCreateFetchRspThread(void *param) {
|
void *schtCreateFetchRspThread(void *param) {
|
||||||
int64_t job = *(int64_t *)param;
|
int64_t job = *(int64_t *)param;
|
||||||
SSchJob *pJob = schAcquireJob(job);
|
SSchJob *pJob = NULL;
|
||||||
|
|
||||||
|
(void)schAcquireJob(job, &pJob);
|
||||||
|
if (NULL == pJob) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
taosSsleep(1);
|
taosSsleep(1);
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SDataBuf msg = {0};
|
SDataBuf msg = {0};
|
||||||
void *rmsg = NULL;
|
void *rmsg = NULL;
|
||||||
schtBuildFetchRspMsg(&msg.len, &rmsg);
|
(void)schtBuildFetchRspMsg(&msg.len, &rmsg);
|
||||||
msg.msgType = TDMT_SCH_MERGE_FETCH_RSP;
|
msg.msgType = TDMT_SCH_MERGE_FETCH_RSP;
|
||||||
msg.pData = rmsg;
|
msg.pData = rmsg;
|
||||||
|
|
||||||
code = schHandleResponseMsg(pJob, pJob->fetchTask, pJob->fetchTask->execId, &msg, 0);
|
code = schHandleResponseMsg(pJob, pJob->fetchTask, pJob->fetchTask->execId, &msg, 0);
|
||||||
|
|
||||||
schReleaseJob(job);
|
(void)schReleaseJob(job);
|
||||||
|
|
||||||
assert(code == 0);
|
assert(code == 0);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -488,12 +595,17 @@ void *schtFetchRspThread(void *aa) {
|
||||||
taosUsleep(100);
|
taosUsleep(100);
|
||||||
|
|
||||||
param = (SSchTaskCallbackParam *)taosMemoryCalloc(1, sizeof(*param));
|
param = (SSchTaskCallbackParam *)taosMemoryCalloc(1, sizeof(*param));
|
||||||
|
if (NULL == param) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
param->queryId = schtQueryId;
|
param->queryId = schtQueryId;
|
||||||
param->taskId = schtFetchTaskId;
|
param->taskId = schtFetchTaskId;
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, sizeof(SRetrieveTableRsp));
|
SRetrieveTableRsp *rsp = (SRetrieveTableRsp *)taosMemoryCalloc(1, sizeof(SRetrieveTableRsp));
|
||||||
|
if (NULL == rsp) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
rsp->completed = 1;
|
rsp->completed = 1;
|
||||||
rsp->numOfRows = 10;
|
rsp->numOfRows = 10;
|
||||||
|
|
||||||
|
@ -549,12 +661,17 @@ void *schtRunJobThread(void *aa) {
|
||||||
schtBuildQueryDag(dag);
|
schtBuildQueryDag(dag);
|
||||||
|
|
||||||
SArray *qnodeList = taosArrayInit(1, sizeof(SQueryNodeLoad));
|
SArray *qnodeList = taosArrayInit(1, sizeof(SQueryNodeLoad));
|
||||||
|
if (NULL == qnodeList) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
SQueryNodeLoad load = {0};
|
SQueryNodeLoad load = {0};
|
||||||
load.addr.epSet.numOfEps = 1;
|
load.addr.epSet.numOfEps = 1;
|
||||||
strcpy(load.addr.epSet.eps[0].fqdn, "qnode0.ep");
|
strcpy(load.addr.epSet.eps[0].fqdn, "qnode0.ep");
|
||||||
load.addr.epSet.eps[0].port = 6031;
|
load.addr.epSet.eps[0].port = 6031;
|
||||||
taosArrayPush(qnodeList, &load);
|
if (NULL == taosArrayPush(qnodeList, &load)) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
|
|
||||||
queryDone = 0;
|
queryDone = 0;
|
||||||
|
|
||||||
|
@ -572,7 +689,9 @@ void *schtRunJobThread(void *aa) {
|
||||||
code = schedulerExecJob(&req, &queryJobRefId);
|
code = schedulerExecJob(&req, &queryJobRefId);
|
||||||
assert(code == 0);
|
assert(code == 0);
|
||||||
|
|
||||||
pJob = schAcquireJob(queryJobRefId);
|
pJob = NULL;
|
||||||
|
code = schAcquireJob(queryJobRefId, &pJob);
|
||||||
|
|
||||||
if (NULL == pJob) {
|
if (NULL == pJob) {
|
||||||
taosArrayDestroy(qnodeList);
|
taosArrayDestroy(qnodeList);
|
||||||
schtFreeQueryDag(dag);
|
schtFreeQueryDag(dag);
|
||||||
|
@ -580,16 +699,24 @@ void *schtRunJobThread(void *aa) {
|
||||||
}
|
}
|
||||||
|
|
||||||
execTasks = taosHashInit(5, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_ENTRY_LOCK);
|
execTasks = taosHashInit(5, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_ENTRY_LOCK);
|
||||||
|
if (NULL == execTasks) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
SSchTask *task = *(SSchTask **)pIter;
|
SSchTask *task = *(SSchTask **)pIter;
|
||||||
schtFetchTaskId = task->taskId - 1;
|
schtFetchTaskId = task->taskId - 1;
|
||||||
|
|
||||||
taosHashPut(execTasks, &task->taskId, sizeof(task->taskId), task, sizeof(*task));
|
if (taosHashPut(execTasks, &task->taskId, sizeof(task->taskId), task, sizeof(*task))) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
pIter = taosHashIterate(pJob->execTasks, pIter);
|
pIter = taosHashIterate(pJob->execTasks, pIter);
|
||||||
}
|
}
|
||||||
|
|
||||||
param = (SSchTaskCallbackParam *)taosMemoryCalloc(1, sizeof(*param));
|
param = (SSchTaskCallbackParam *)taosMemoryCalloc(1, sizeof(*param));
|
||||||
|
if (NULL == param) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
param->refId = queryJobRefId;
|
param->refId = queryJobRefId;
|
||||||
param->queryId = pJob->queryId;
|
param->queryId = pJob->queryId;
|
||||||
|
|
||||||
|
@ -601,7 +728,9 @@ void *schtRunJobThread(void *aa) {
|
||||||
|
|
||||||
SDataBuf msg = {0};
|
SDataBuf msg = {0};
|
||||||
void *rmsg = NULL;
|
void *rmsg = NULL;
|
||||||
schtBuildQueryRspMsg(&msg.len, &rmsg);
|
if (schtBuildQueryRspMsg(&msg.len, &rmsg)) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
msg.msgType = TDMT_SCH_QUERY_RSP;
|
msg.msgType = TDMT_SCH_QUERY_RSP;
|
||||||
msg.pData = rmsg;
|
msg.pData = rmsg;
|
||||||
|
|
||||||
|
@ -612,6 +741,9 @@ void *schtRunJobThread(void *aa) {
|
||||||
}
|
}
|
||||||
|
|
||||||
param = (SSchTaskCallbackParam *)taosMemoryCalloc(1, sizeof(*param));
|
param = (SSchTaskCallbackParam *)taosMemoryCalloc(1, sizeof(*param));
|
||||||
|
if (NULL == param) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
param->refId = queryJobRefId;
|
param->refId = queryJobRefId;
|
||||||
param->queryId = pJob->queryId;
|
param->queryId = pJob->queryId;
|
||||||
|
|
||||||
|
@ -622,7 +754,9 @@ void *schtRunJobThread(void *aa) {
|
||||||
param->taskId = task->taskId - 1;
|
param->taskId = task->taskId - 1;
|
||||||
SDataBuf msg = {0};
|
SDataBuf msg = {0};
|
||||||
void *rmsg = NULL;
|
void *rmsg = NULL;
|
||||||
schtBuildQueryRspMsg(&msg.len, &rmsg);
|
if (schtBuildQueryRspMsg(&msg.len, &rmsg)) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
msg.msgType = TDMT_SCH_QUERY_RSP;
|
msg.msgType = TDMT_SCH_QUERY_RSP;
|
||||||
msg.pData = rmsg;
|
msg.pData = rmsg;
|
||||||
|
|
||||||
|
@ -728,7 +862,9 @@ TEST(queryTest, normalCase) {
|
||||||
code = schedulerExecJob(&req, &job);
|
code = schedulerExecJob(&req, &job);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SSchJob *pJob = schAcquireJob(job);
|
SSchJob *pJob = NULL;
|
||||||
|
code = schAcquireJob(job, &pJob);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
|
@ -839,7 +975,9 @@ TEST(queryTest, readyFirstCase) {
|
||||||
code = schedulerExecJob(&req, &job);
|
code = schedulerExecJob(&req, &job);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SSchJob *pJob = schAcquireJob(job);
|
SSchJob *pJob = NULL;
|
||||||
|
code = schAcquireJob(job, &pJob);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
||||||
while (pIter) {
|
while (pIter) {
|
||||||
|
@ -956,7 +1094,9 @@ TEST(queryTest, flowCtrlCase) {
|
||||||
code = schedulerExecJob(&req, &job);
|
code = schedulerExecJob(&req, &job);
|
||||||
ASSERT_EQ(code, 0);
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
SSchJob *pJob = schAcquireJob(job);
|
SSchJob *pJob = NULL;
|
||||||
|
code = schAcquireJob(job, &pJob);
|
||||||
|
ASSERT_EQ(code, 0);
|
||||||
|
|
||||||
while (!queryDone) {
|
while (!queryDone) {
|
||||||
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
void *pIter = taosHashIterate(pJob->execTasks, NULL);
|
||||||
|
@ -1094,13 +1234,17 @@ TEST(otherTest, otherCase) {
|
||||||
schReleaseJob(0);
|
schReleaseJob(0);
|
||||||
schFreeRpcCtx(NULL);
|
schFreeRpcCtx(NULL);
|
||||||
|
|
||||||
ASSERT_EQ(schDumpEpSet(NULL), (char *)NULL);
|
char* ep = NULL;
|
||||||
|
ASSERT_EQ(schDumpEpSet(NULL, &ep), TSDB_CODE_SUCCESS);
|
||||||
ASSERT_EQ(strcmp(schGetOpStr(SCH_OP_NULL), "NULL"), 0);
|
ASSERT_EQ(strcmp(schGetOpStr(SCH_OP_NULL), "NULL"), 0);
|
||||||
ASSERT_EQ(strcmp(schGetOpStr((SCH_OP_TYPE)100), "UNKNOWN"), 0);
|
ASSERT_EQ(strcmp(schGetOpStr((SCH_OP_TYPE)100), "UNKNOWN"), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
int main(int argc, char **argv) {
|
int main(int argc, char **argv) {
|
||||||
schtInitLogFile();
|
schtInitLogFile();
|
||||||
|
if (rpcInit()) {
|
||||||
|
assert(0);
|
||||||
|
}
|
||||||
taosSeedRand(taosGetTimestampSec());
|
taosSeedRand(taosGetTimestampSec());
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
|
|
|
@ -1162,10 +1162,10 @@ void streamClearChkptReadyMsg(SActiveCheckpointInfo* pActiveInfo) {
|
||||||
static int32_t handleDispatchSuccessRsp(SStreamTask* pTask, int32_t downstreamId, int32_t downstreamNodeId) {
|
static int32_t handleDispatchSuccessRsp(SStreamTask* pTask, int32_t downstreamId, int32_t downstreamNodeId) {
|
||||||
stDebug("s-task:%s destroy dispatch msg:%p", pTask->id.idStr, pTask->msgInfo.pData);
|
stDebug("s-task:%s destroy dispatch msg:%p", pTask->id.idStr, pTask->msgInfo.pData);
|
||||||
|
|
||||||
bool delayDispatch = (pTask->msgInfo.dispatchMsgType == STREAM_INPUT__CHECKPOINT_TRIGGER);
|
|
||||||
clearBufferedDispatchMsg(pTask);
|
|
||||||
|
|
||||||
int64_t el = taosGetTimestampMs() - pTask->msgInfo.startTs;
|
int64_t el = taosGetTimestampMs() - pTask->msgInfo.startTs;
|
||||||
|
bool delayDispatch = (pTask->msgInfo.dispatchMsgType == STREAM_INPUT__CHECKPOINT_TRIGGER);
|
||||||
|
|
||||||
|
clearBufferedDispatchMsg(pTask);
|
||||||
|
|
||||||
// put data into inputQ of current task is also allowed
|
// put data into inputQ of current task is also allowed
|
||||||
if (pTask->inputq.status == TASK_INPUT_STATUS__BLOCKED) {
|
if (pTask->inputq.status == TASK_INPUT_STATUS__BLOCKED) {
|
||||||
|
@ -1189,13 +1189,24 @@ static int32_t handleDispatchSuccessRsp(SStreamTask* pTask, int32_t downstreamId
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t setDispatchRspInfo(SDispatchMsgInfo* pMsgInfo, int32_t vgId, int32_t code, int64_t now, const char* id) {
|
static bool setDispatchRspInfo(SDispatchMsgInfo* pMsgInfo, int32_t vgId, int32_t code, int64_t now, int32_t* pNotRsp, const char* id) {
|
||||||
int32_t numOfRsp = 0;
|
int32_t numOfRsp = 0;
|
||||||
bool alreadySet = false;
|
bool alreadySet = false;
|
||||||
bool updated = false;
|
bool updated = false;
|
||||||
|
bool allRsp = false;
|
||||||
|
*pNotRsp = 0;
|
||||||
|
|
||||||
taosThreadMutexLock(&pMsgInfo->lock);
|
taosThreadMutexLock(&pMsgInfo->lock);
|
||||||
for (int32_t j = 0; j < taosArrayGetSize(pMsgInfo->pSendInfo); ++j) {
|
int32_t numOfDispatchBranch = taosArrayGetSize(pMsgInfo->pSendInfo);
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < numOfDispatchBranch; ++i) {
|
||||||
|
SDispatchEntry* pEntry = taosArrayGet(pMsgInfo->pSendInfo, i);
|
||||||
|
if (pEntry->rspTs != -1) {
|
||||||
|
numOfRsp += 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t j = 0; j < numOfDispatchBranch; ++j) {
|
||||||
SDispatchEntry* pEntry = taosArrayGet(pMsgInfo->pSendInfo, j);
|
SDispatchEntry* pEntry = taosArrayGet(pMsgInfo->pSendInfo, j);
|
||||||
if (pEntry->nodeId == vgId) {
|
if (pEntry->nodeId == vgId) {
|
||||||
ASSERT(!alreadySet);
|
ASSERT(!alreadySet);
|
||||||
|
@ -1203,18 +1214,20 @@ static int32_t setDispatchRspInfo(SDispatchMsgInfo* pMsgInfo, int32_t vgId, int3
|
||||||
pEntry->status = code;
|
pEntry->status = code;
|
||||||
alreadySet = true;
|
alreadySet = true;
|
||||||
updated = true;
|
updated = true;
|
||||||
stDebug("s-task:%s record the rsp recv, ts:%" PRId64 " code:%d, idx:%d", id, now, code, j);
|
numOfRsp += 1;
|
||||||
|
|
||||||
|
stDebug("s-task:%s record the rsp recv, ts:%" PRId64 " code:%d, idx:%d, total recv:%d/%d", id, now, code, j,
|
||||||
|
numOfRsp, numOfDispatchBranch);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pEntry->rspTs != -1) {
|
*pNotRsp = numOfDispatchBranch - numOfRsp;
|
||||||
numOfRsp += 1;
|
allRsp = (numOfRsp == numOfDispatchBranch);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
taosThreadMutexUnlock(&pMsgInfo->lock);
|
taosThreadMutexUnlock(&pMsgInfo->lock);
|
||||||
ASSERT(updated);
|
|
||||||
|
|
||||||
return numOfRsp;
|
ASSERT(updated);
|
||||||
|
return allRsp;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isDispatchRspTimeout(SDispatchEntry* pEntry, int64_t now) {
|
bool isDispatchRspTimeout(SDispatchEntry* pEntry, int64_t now) {
|
||||||
|
@ -1240,7 +1253,8 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i
|
||||||
int32_t vgId = pTask->pMeta->vgId;
|
int32_t vgId = pTask->pMeta->vgId;
|
||||||
SDispatchMsgInfo* pMsgInfo = &pTask->msgInfo;
|
SDispatchMsgInfo* pMsgInfo = &pTask->msgInfo;
|
||||||
int64_t now = taosGetTimestampMs();
|
int64_t now = taosGetTimestampMs();
|
||||||
int32_t totalRsp = 0;
|
bool allRsp = false;
|
||||||
|
int32_t notRsp = 0;
|
||||||
|
|
||||||
taosThreadMutexLock(&pMsgInfo->lock);
|
taosThreadMutexLock(&pMsgInfo->lock);
|
||||||
int32_t msgId = pMsgInfo->msgId;
|
int32_t msgId = pMsgInfo->msgId;
|
||||||
|
@ -1269,18 +1283,18 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i
|
||||||
if (code == TSDB_CODE_STREAM_TASK_NOT_EXIST) { // destination task does not exist, not retry anymore
|
if (code == TSDB_CODE_STREAM_TASK_NOT_EXIST) { // destination task does not exist, not retry anymore
|
||||||
stError("s-task:%s failed to dispatch msg to task:0x%x(vgId:%d), msgId:%d no retry, since task destroyed already",
|
stError("s-task:%s failed to dispatch msg to task:0x%x(vgId:%d), msgId:%d no retry, since task destroyed already",
|
||||||
id, pRsp->downstreamTaskId, pRsp->downstreamNodeId, msgId);
|
id, pRsp->downstreamTaskId, pRsp->downstreamNodeId, msgId);
|
||||||
totalRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, TSDB_CODE_SUCCESS, now, id);
|
allRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, TSDB_CODE_SUCCESS, now, ¬Rsp, id);
|
||||||
} else {
|
} else {
|
||||||
stError("s-task:%s failed to dispatch msgId:%d to task:0x%x(vgId:%d), code:%s, add to retry list", id, msgId,
|
stError("s-task:%s failed to dispatch msgId:%d to task:0x%x(vgId:%d), code:%s, add to retry list", id, msgId,
|
||||||
pRsp->downstreamTaskId, pRsp->downstreamNodeId, tstrerror(code));
|
pRsp->downstreamTaskId, pRsp->downstreamNodeId, tstrerror(code));
|
||||||
totalRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, code, now, id);
|
allRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, code, now, ¬Rsp, id);
|
||||||
}
|
}
|
||||||
|
|
||||||
} else { // code == 0
|
} else { // code == 0
|
||||||
if (pRsp->inputStatus == TASK_INPUT_STATUS__BLOCKED) {
|
if (pRsp->inputStatus == TASK_INPUT_STATUS__BLOCKED) {
|
||||||
pTask->inputq.status = TASK_INPUT_STATUS__BLOCKED;
|
pTask->inputq.status = TASK_INPUT_STATUS__BLOCKED;
|
||||||
// block the input of current task, to push pressure to upstream
|
// block the input of current task, to push pressure to upstream
|
||||||
totalRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, pRsp->inputStatus, now, id);
|
allRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, pRsp->inputStatus, now, ¬Rsp, id);
|
||||||
stTrace("s-task:%s inputQ of downstream task:0x%x(vgId:%d) is full, wait for retry dispatch", id,
|
stTrace("s-task:%s inputQ of downstream task:0x%x(vgId:%d) is full, wait for retry dispatch", id,
|
||||||
pRsp->downstreamTaskId, pRsp->downstreamNodeId);
|
pRsp->downstreamTaskId, pRsp->downstreamNodeId);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1292,7 +1306,7 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i
|
||||||
id, pRsp->downstreamTaskId, pRsp->downstreamNodeId);
|
id, pRsp->downstreamTaskId, pRsp->downstreamNodeId);
|
||||||
}
|
}
|
||||||
|
|
||||||
totalRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, TSDB_CODE_SUCCESS, now, id);
|
allRsp = setDispatchRspInfo(pMsgInfo, pRsp->downstreamNodeId, TSDB_CODE_SUCCESS, now, ¬Rsp, id);
|
||||||
|
|
||||||
{
|
{
|
||||||
bool delayDispatch = (pMsgInfo->dispatchMsgType == STREAM_INPUT__CHECKPOINT_TRIGGER);
|
bool delayDispatch = (pMsgInfo->dispatchMsgType == STREAM_INPUT__CHECKPOINT_TRIGGER);
|
||||||
|
@ -1317,13 +1331,11 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t notRsp = taosArrayGetSize(pMsgInfo->pSendInfo) - totalRsp;
|
|
||||||
if (pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH) {
|
if (pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH) {
|
||||||
if (notRsp > 0) {
|
if (!allRsp) {
|
||||||
stDebug(
|
stDebug(
|
||||||
"s-task:%s recv dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%s, "
|
"s-task:%s recv dispatch rsp, msgId:%d from 0x%x(vgId:%d), downstream task input status:%d code:%s, "
|
||||||
"waiting "
|
"waiting for %d rsp",
|
||||||
"for %d rsp",
|
|
||||||
id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, tstrerror(code), notRsp);
|
id, msgId, pRsp->downstreamTaskId, pRsp->downstreamNodeId, pRsp->inputStatus, tstrerror(code), notRsp);
|
||||||
} else {
|
} else {
|
||||||
stDebug(
|
stDebug(
|
||||||
|
@ -1337,7 +1349,7 @@ int32_t streamProcessDispatchRsp(SStreamTask* pTask, SStreamDispatchRsp* pRsp, i
|
||||||
}
|
}
|
||||||
|
|
||||||
// all msg rsp already, continue
|
// all msg rsp already, continue
|
||||||
if (notRsp == 0) {
|
if (allRsp) {
|
||||||
ASSERT(pTask->outputq.status == TASK_OUTPUT_STATUS__WAIT);
|
ASSERT(pTask->outputq.status == TASK_OUTPUT_STATUS__WAIT);
|
||||||
|
|
||||||
// we need to re-try send dispatch msg to downstream tasks
|
// we need to re-try send dispatch msg to downstream tasks
|
||||||
|
|
|
@ -263,6 +263,7 @@ void tFreeStreamTask(SStreamTask* pTask) {
|
||||||
tDeleteSchemaWrapper(pTask->outputInfo.tbSink.pSchemaWrapper);
|
tDeleteSchemaWrapper(pTask->outputInfo.tbSink.pSchemaWrapper);
|
||||||
taosMemoryFree(pTask->outputInfo.tbSink.pTSchema);
|
taosMemoryFree(pTask->outputInfo.tbSink.pTSchema);
|
||||||
tSimpleHashCleanup(pTask->outputInfo.tbSink.pTblInfo);
|
tSimpleHashCleanup(pTask->outputInfo.tbSink.pTblInfo);
|
||||||
|
tDeleteSchemaWrapper(pTask->outputInfo.tbSink.pTagSchema);
|
||||||
} else if (pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH) {
|
} else if (pTask->outputInfo.type == TASK_OUTPUT__SHUFFLE_DISPATCH) {
|
||||||
taosArrayDestroy(pTask->outputInfo.shuffleDispatcher.dbInfo.pVgroupInfos);
|
taosArrayDestroy(pTask->outputInfo.shuffleDispatcher.dbInfo.pVgroupInfos);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
#include "tencode.h"
|
#include "tencode.h"
|
||||||
#include "tstreamUpdate.h"
|
#include "tstreamUpdate.h"
|
||||||
#include "ttime.h"
|
#include "ttime.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
#define DEFAULT_FALSE_POSITIVE 0.01
|
#define DEFAULT_FALSE_POSITIVE 0.01
|
||||||
#define DEFAULT_BUCKET_SIZE 131072
|
#define DEFAULT_BUCKET_SIZE 131072
|
||||||
|
@ -34,7 +35,8 @@
|
||||||
static int64_t adjustExpEntries(int64_t entries) { return TMIN(DEFAULT_EXPECTED_ENTRIES, entries); }
|
static int64_t adjustExpEntries(int64_t entries) { return TMIN(DEFAULT_EXPECTED_ENTRIES, entries); }
|
||||||
|
|
||||||
int compareKeyTs(void* pTs1, void* pTs2, void* pPkVal, __compar_fn_t cmpPkFn) {
|
int compareKeyTs(void* pTs1, void* pTs2, void* pPkVal, __compar_fn_t cmpPkFn) {
|
||||||
return compareInt64Val(pTs1, pTs2);;
|
return compareInt64Val(pTs1, pTs2);
|
||||||
|
;
|
||||||
}
|
}
|
||||||
|
|
||||||
int compareKeyTsAndPk(void* pValue1, void* pTs, void* pPkVal, __compar_fn_t cmpPkFn) {
|
int compareKeyTsAndPk(void* pValue1, void* pTs, void* pPkVal, __compar_fn_t cmpPkFn) {
|
||||||
|
@ -49,7 +51,7 @@ int compareKeyTsAndPk(void* pValue1, void* pTs, void* pPkVal, __compar_fn_t cmpP
|
||||||
|
|
||||||
int32_t getKeyBuff(TSKEY ts, int64_t tbUid, void* pVal, int32_t len, char* buff) {
|
int32_t getKeyBuff(TSKEY ts, int64_t tbUid, void* pVal, int32_t len, char* buff) {
|
||||||
*(TSKEY*)buff = ts;
|
*(TSKEY*)buff = ts;
|
||||||
memcpy(buff+ sizeof(TSKEY), &tbUid, sizeof(int64_t));
|
memcpy(buff + sizeof(TSKEY), &tbUid, sizeof(int64_t));
|
||||||
if (len == 0) {
|
if (len == 0) {
|
||||||
return sizeof(TSKEY) + sizeof(int64_t);
|
return sizeof(TSKEY) + sizeof(int64_t);
|
||||||
}
|
}
|
||||||
|
@ -66,26 +68,40 @@ int32_t getValueBuff(TSKEY ts, char* pVal, int32_t len, char* buff) {
|
||||||
return sizeof(TSKEY) + len;
|
return sizeof(TSKEY) + len;
|
||||||
}
|
}
|
||||||
|
|
||||||
void windowSBfAdd(SUpdateInfo *pInfo, uint64_t count) {
|
int32_t windowSBfAdd(SUpdateInfo* pInfo, uint64_t count) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (pInfo->numSBFs < count) {
|
if (pInfo->numSBFs < count) {
|
||||||
count = pInfo->numSBFs;
|
count = pInfo->numSBFs;
|
||||||
}
|
}
|
||||||
for (uint64_t i = 0; i < count; ++i) {
|
for (uint64_t i = 0; i < count; ++i) {
|
||||||
int64_t rows = adjustExpEntries(pInfo->interval * ROWS_PER_MILLISECOND);
|
int64_t rows = adjustExpEntries(pInfo->interval * ROWS_PER_MILLISECOND);
|
||||||
SScalableBf *tsSBF = tScalableBfInit(rows, DEFAULT_FALSE_POSITIVE);
|
SScalableBf* tsSBF = NULL;
|
||||||
taosArrayPush(pInfo->pTsSBFs, &tsSBF);
|
code = tScalableBfInit(rows, DEFAULT_FALSE_POSITIVE, &tsSBF);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
void* res = taosArrayPush(pInfo->pTsSBFs, &tsSBF);
|
||||||
|
if (!res) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
_error:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void clearItemHelper(void *p) {
|
static void clearItemHelper(void* p) {
|
||||||
SScalableBf **pBf = p;
|
SScalableBf** pBf = p;
|
||||||
tScalableBfDestroy(*pBf);
|
tScalableBfDestroy(*pBf);
|
||||||
}
|
}
|
||||||
|
|
||||||
void windowSBfDelete(SUpdateInfo *pInfo, uint64_t count) {
|
void windowSBfDelete(SUpdateInfo* pInfo, uint64_t count) {
|
||||||
if (count < pInfo->numSBFs) {
|
if (count < pInfo->numSBFs) {
|
||||||
for (uint64_t i = 0; i < count; ++i) {
|
for (uint64_t i = 0; i < count; ++i) {
|
||||||
SScalableBf *pTsSBFs = taosArrayGetP(pInfo->pTsSBFs, 0);
|
SScalableBf* pTsSBFs = taosArrayGetP(pInfo->pTsSBFs, 0);
|
||||||
tScalableBfDestroy(pTsSBFs);
|
tScalableBfDestroy(pTsSBFs);
|
||||||
taosArrayRemove(pInfo->pTsSBFs, 0);
|
taosArrayRemove(pInfo->pTsSBFs, 0);
|
||||||
}
|
}
|
||||||
|
@ -124,14 +140,19 @@ static int64_t adjustWatermark(int64_t adjInterval, int64_t originInt, int64_t w
|
||||||
return watermark;
|
return watermark;
|
||||||
}
|
}
|
||||||
|
|
||||||
SUpdateInfo *updateInfoInitP(SInterval *pInterval, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen) {
|
int32_t updateInfoInitP(SInterval* pInterval, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen,
|
||||||
return updateInfoInit(pInterval->interval, pInterval->precision, watermark, igUp, pkType, pkLen);
|
SUpdateInfo** ppInfo) {
|
||||||
|
return updateInfoInit(pInterval->interval, pInterval->precision, watermark, igUp, pkType, pkLen, ppInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
SUpdateInfo *updateInfoInit(int64_t interval, int32_t precision, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen) {
|
int32_t updateInfoInit(int64_t interval, int32_t precision, int64_t watermark, bool igUp, int8_t pkType, int32_t pkLen,
|
||||||
SUpdateInfo *pInfo = taosMemoryCalloc(1, sizeof(SUpdateInfo));
|
SUpdateInfo** ppInfo) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
SUpdateInfo* pInfo = taosMemoryCalloc(1, sizeof(SUpdateInfo));
|
||||||
if (pInfo == NULL) {
|
if (pInfo == NULL) {
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
pInfo->pTsBuckets = NULL;
|
pInfo->pTsBuckets = NULL;
|
||||||
pInfo->pTsSBFs = NULL;
|
pInfo->pTsSBFs = NULL;
|
||||||
|
@ -145,17 +166,19 @@ SUpdateInfo *updateInfoInit(int64_t interval, int32_t precision, int64_t waterma
|
||||||
bfSize = (uint64_t)(pInfo->watermark / pInfo->interval);
|
bfSize = (uint64_t)(pInfo->watermark / pInfo->interval);
|
||||||
pInfo->numSBFs = bfSize;
|
pInfo->numSBFs = bfSize;
|
||||||
|
|
||||||
pInfo->pTsSBFs = taosArrayInit(bfSize, sizeof(void *));
|
pInfo->pTsSBFs = taosArrayInit(bfSize, sizeof(void*));
|
||||||
if (pInfo->pTsSBFs == NULL) {
|
if (pInfo->pTsSBFs == NULL) {
|
||||||
updateInfoDestroy(pInfo);
|
updateInfoDestroy(pInfo);
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
windowSBfAdd(pInfo, bfSize);
|
windowSBfAdd(pInfo, bfSize);
|
||||||
|
|
||||||
pInfo->pTsBuckets = taosArrayInit(DEFAULT_BUCKET_SIZE, sizeof(TSKEY));
|
pInfo->pTsBuckets = taosArrayInit(DEFAULT_BUCKET_SIZE, sizeof(TSKEY));
|
||||||
if (pInfo->pTsBuckets == NULL) {
|
if (pInfo->pTsBuckets == NULL) {
|
||||||
updateInfoDestroy(pInfo);
|
updateInfoDestroy(pInfo);
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
|
|
||||||
TSKEY dumy = 0;
|
TSKEY dumy = 0;
|
||||||
|
@ -167,31 +190,54 @@ SUpdateInfo *updateInfoInit(int64_t interval, int32_t precision, int64_t waterma
|
||||||
}
|
}
|
||||||
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT);
|
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT);
|
||||||
pInfo->pMap = taosHashInit(DEFAULT_MAP_CAPACITY, hashFn, true, HASH_NO_LOCK);
|
pInfo->pMap = taosHashInit(DEFAULT_MAP_CAPACITY, hashFn, true, HASH_NO_LOCK);
|
||||||
|
if (!pInfo->pMap) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
pInfo->maxDataVersion = 0;
|
pInfo->maxDataVersion = 0;
|
||||||
pInfo->pkColLen = pkLen;
|
pInfo->pkColLen = pkLen;
|
||||||
pInfo->pkColType = pkType;
|
pInfo->pkColType = pkType;
|
||||||
pInfo->pKeyBuff = taosMemoryCalloc(1, sizeof(TSKEY) + sizeof(int64_t) + pkLen);
|
pInfo->pKeyBuff = taosMemoryCalloc(1, sizeof(TSKEY) + sizeof(int64_t) + pkLen);
|
||||||
|
if (!pInfo->pKeyBuff) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
pInfo->pValueBuff = taosMemoryCalloc(1, sizeof(TSKEY) + pkLen);
|
pInfo->pValueBuff = taosMemoryCalloc(1, sizeof(TSKEY) + pkLen);
|
||||||
|
if (!pInfo->pValueBuff) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
if (pkLen != 0) {
|
if (pkLen != 0) {
|
||||||
pInfo->comparePkRowFn = compareKeyTsAndPk;
|
pInfo->comparePkRowFn = compareKeyTsAndPk;
|
||||||
pInfo->comparePkCol = getKeyComparFunc(pkType, TSDB_ORDER_ASC);;
|
pInfo->comparePkCol = getKeyComparFunc(pkType, TSDB_ORDER_ASC);
|
||||||
|
;
|
||||||
} else {
|
} else {
|
||||||
pInfo->comparePkRowFn = compareKeyTs;
|
pInfo->comparePkRowFn = compareKeyTs;
|
||||||
pInfo->comparePkCol = NULL;
|
pInfo->comparePkCol = NULL;
|
||||||
}
|
}
|
||||||
return pInfo;
|
(*ppInfo) = pInfo;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SScalableBf *getSBf(SUpdateInfo *pInfo, TSKEY ts) {
|
static int32_t getSBf(SUpdateInfo* pInfo, TSKEY ts, SScalableBf** ppSBf) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (ts <= 0) {
|
if (ts <= 0) {
|
||||||
return NULL;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
if (pInfo->minTS < 0) {
|
if (pInfo->minTS < 0) {
|
||||||
pInfo->minTS = (TSKEY)(ts / pInfo->interval * pInfo->interval);
|
pInfo->minTS = (TSKEY)(ts / pInfo->interval * pInfo->interval);
|
||||||
}
|
}
|
||||||
int64_t index = (int64_t)((ts - pInfo->minTS) / pInfo->interval);
|
int64_t index = (int64_t)((ts - pInfo->minTS) / pInfo->interval);
|
||||||
if (index < 0) {
|
if (index < 0) {
|
||||||
return NULL;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
}
|
}
|
||||||
if (index >= pInfo->numSBFs) {
|
if (index >= pInfo->numSBFs) {
|
||||||
uint64_t count = index + 1 - pInfo->numSBFs;
|
uint64_t count = index + 1 - pInfo->numSBFs;
|
||||||
|
@ -199,22 +245,31 @@ static SScalableBf *getSBf(SUpdateInfo *pInfo, TSKEY ts) {
|
||||||
windowSBfAdd(pInfo, count);
|
windowSBfAdd(pInfo, count);
|
||||||
index = pInfo->numSBFs - 1;
|
index = pInfo->numSBFs - 1;
|
||||||
}
|
}
|
||||||
SScalableBf *res = taosArrayGetP(pInfo->pTsSBFs, index);
|
SScalableBf* res = taosArrayGetP(pInfo->pTsSBFs, index);
|
||||||
if (res == NULL) {
|
if (res == NULL) {
|
||||||
int64_t rows = adjustExpEntries(pInfo->interval * ROWS_PER_MILLISECOND);
|
int64_t rows = adjustExpEntries(pInfo->interval * ROWS_PER_MILLISECOND);
|
||||||
res = tScalableBfInit(rows, DEFAULT_FALSE_POSITIVE);
|
code = tScalableBfInit(rows, DEFAULT_FALSE_POSITIVE, &res);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
|
||||||
taosArrayPush(pInfo->pTsSBFs, &res);
|
taosArrayPush(pInfo->pTsSBFs, &res);
|
||||||
}
|
}
|
||||||
return res;
|
(*ppSBf) = res;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool updateInfoIsTableInserted(SUpdateInfo *pInfo, int64_t tbUid) {
|
bool updateInfoIsTableInserted(SUpdateInfo* pInfo, int64_t tbUid) {
|
||||||
void *pVal = taosHashGet(pInfo->pMap, &tbUid, sizeof(int64_t));
|
void* pVal = taosHashGet(pInfo->pMap, &tbUid, sizeof(int64_t));
|
||||||
if (pVal || taosHashGetSize(pInfo->pMap) >= DEFAULT_MAP_SIZE) return true;
|
if (pVal || taosHashGetSize(pInfo->pMap) >= DEFAULT_MAP_SIZE) return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol, int32_t primaryKeyCol) {
|
TSKEY updateInfoFillBlockData(SUpdateInfo* pInfo, SSDataBlock* pBlock, int32_t primaryTsCol, int32_t primaryKeyCol) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (pBlock == NULL || pBlock->info.rows == 0) return INT64_MIN;
|
if (pBlock == NULL || pBlock->info.rows == 0) return INT64_MIN;
|
||||||
TSKEY maxTs = INT64_MIN;
|
TSKEY maxTs = INT64_MIN;
|
||||||
void* pPkVal = NULL;
|
void* pPkVal = NULL;
|
||||||
|
@ -223,14 +278,14 @@ TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t p
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
int64_t tbUid = pBlock->info.id.uid;
|
int64_t tbUid = pBlock->info.id.uid;
|
||||||
|
|
||||||
SColumnInfoData *pColDataInfo = taosArrayGet(pBlock->pDataBlock, primaryTsCol);
|
SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, primaryTsCol);
|
||||||
SColumnInfoData *pPkDataInfo = NULL;
|
SColumnInfoData* pPkDataInfo = NULL;
|
||||||
if (primaryKeyCol >= 0) {
|
if (primaryKeyCol >= 0) {
|
||||||
pPkDataInfo = taosArrayGet(pBlock->pDataBlock, primaryKeyCol);
|
pPkDataInfo = taosArrayGet(pBlock->pDataBlock, primaryKeyCol);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
for (int32_t i = 0; i < pBlock->info.rows; i++) {
|
||||||
TSKEY ts = ((TSKEY *)pColDataInfo->pData)[i];
|
TSKEY ts = ((TSKEY*)pColDataInfo->pData)[i];
|
||||||
if (maxTs < ts) {
|
if (maxTs < ts) {
|
||||||
maxTs = ts;
|
maxTs = ts;
|
||||||
if (primaryKeyCol >= 0) {
|
if (primaryKeyCol >= 0) {
|
||||||
|
@ -238,17 +293,22 @@ TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t p
|
||||||
maxLen = colDataGetRowLength(pPkDataInfo, i);
|
maxLen = colDataGetRowLength(pPkDataInfo, i);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
SScalableBf *pSBf = getSBf(pInfo, ts);
|
SScalableBf* pSBf = NULL;
|
||||||
|
int32_t code = getSBf(pInfo, ts, &pSBf);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uWarn("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
|
||||||
|
}
|
||||||
if (pSBf) {
|
if (pSBf) {
|
||||||
if (primaryKeyCol >= 0) {
|
if (primaryKeyCol >= 0) {
|
||||||
pPkVal = colDataGetData(pPkDataInfo, i);
|
pPkVal = colDataGetData(pPkDataInfo, i);
|
||||||
len = colDataGetRowLength(pPkDataInfo, i);
|
len = colDataGetRowLength(pPkDataInfo, i);
|
||||||
}
|
}
|
||||||
int32_t buffLen = getKeyBuff(ts, tbUid, pPkVal, len, pInfo->pKeyBuff);
|
int32_t buffLen = getKeyBuff(ts, tbUid, pPkVal, len, pInfo->pKeyBuff);
|
||||||
|
// we don't care whether the data is updated or not
|
||||||
tScalableBfPut(pSBf, pInfo->pKeyBuff, buffLen);
|
tScalableBfPut(pSBf, pInfo->pKeyBuff, buffLen);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
void *pMaxTs = taosHashGet(pInfo->pMap, &tbUid, sizeof(int64_t));
|
void* pMaxTs = taosHashGet(pInfo->pMap, &tbUid, sizeof(int64_t));
|
||||||
if (pMaxTs == NULL || pInfo->comparePkRowFn(pMaxTs, &maxTs, pMaxPkVal, pInfo->comparePkCol) == -1) {
|
if (pMaxTs == NULL || pInfo->comparePkRowFn(pMaxTs, &maxTs, pMaxPkVal, pInfo->comparePkCol) == -1) {
|
||||||
int32_t valueLen = getValueBuff(maxTs, pMaxPkVal, maxLen, pInfo->pValueBuff);
|
int32_t valueLen = getValueBuff(maxTs, pMaxPkVal, maxLen, pInfo->pValueBuff);
|
||||||
taosHashPut(pInfo->pMap, &tbUid, sizeof(int64_t), pInfo->pValueBuff, valueLen);
|
taosHashPut(pInfo->pMap, &tbUid, sizeof(int64_t), pInfo->pValueBuff, valueLen);
|
||||||
|
@ -256,14 +316,14 @@ TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t p
|
||||||
return maxTs;
|
return maxTs;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool updateInfoIsUpdated(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len) {
|
bool updateInfoIsUpdated(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len) {
|
||||||
int32_t res = TSDB_CODE_FAILED;
|
int32_t res = TSDB_CODE_FAILED;
|
||||||
int32_t buffLen = 0;
|
int32_t buffLen = 0;
|
||||||
|
|
||||||
buffLen = getKeyBuff(ts, tableId, pPkVal, len, pInfo->pKeyBuff);
|
buffLen = getKeyBuff(ts, tableId, pPkVal, len, pInfo->pKeyBuff);
|
||||||
void* *pMapMaxTs = taosHashGet(pInfo->pMap, &tableId, sizeof(uint64_t));
|
void** pMapMaxTs = taosHashGet(pInfo->pMap, &tableId, sizeof(uint64_t));
|
||||||
uint64_t index = ((uint64_t)tableId) % pInfo->numBuckets;
|
uint64_t index = ((uint64_t)tableId) % pInfo->numBuckets;
|
||||||
TSKEY maxTs = *(TSKEY *)taosArrayGet(pInfo->pTsBuckets, index);
|
TSKEY maxTs = *(TSKEY*)taosArrayGet(pInfo->pTsBuckets, index);
|
||||||
if (ts < maxTs - pInfo->watermark) {
|
if (ts < maxTs - pInfo->watermark) {
|
||||||
// this window has been closed.
|
// this window has been closed.
|
||||||
if (pInfo->pCloseWinSBF) {
|
if (pInfo->pCloseWinSBF) {
|
||||||
|
@ -277,10 +337,15 @@ bool updateInfoIsUpdated(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts, void* p
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
SScalableBf *pSBf = getSBf(pInfo, ts);
|
SScalableBf* pSBf = NULL;
|
||||||
|
int32_t code = getSBf(pInfo, ts, &pSBf);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uWarn("%s failed at line %d since %s", __func__, __LINE__, tstrerror(code));
|
||||||
|
}
|
||||||
|
|
||||||
int32_t size = taosHashGetSize(pInfo->pMap);
|
int32_t size = taosHashGetSize(pInfo->pMap);
|
||||||
if ((!pMapMaxTs && size < DEFAULT_MAP_SIZE) || (pMapMaxTs && pInfo->comparePkRowFn(pMapMaxTs, &ts, pPkVal, pInfo->comparePkCol) == -1 )) {
|
if ((!pMapMaxTs && size < DEFAULT_MAP_SIZE) ||
|
||||||
|
(pMapMaxTs && pInfo->comparePkRowFn(pMapMaxTs, &ts, pPkVal, pInfo->comparePkCol) == -1)) {
|
||||||
int32_t valueLen = getValueBuff(ts, pPkVal, len, pInfo->pValueBuff);
|
int32_t valueLen = getValueBuff(ts, pPkVal, len, pInfo->pValueBuff);
|
||||||
taosHashPut(pInfo->pMap, &tableId, sizeof(uint64_t), pInfo->pValueBuff, valueLen);
|
taosHashPut(pInfo->pMap, &tableId, sizeof(uint64_t), pInfo->pValueBuff, valueLen);
|
||||||
// pSBf may be a null pointer
|
// pSBf may be a null pointer
|
||||||
|
@ -309,7 +374,7 @@ bool updateInfoIsUpdated(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts, void* p
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateInfoDestroy(SUpdateInfo *pInfo) {
|
void updateInfoDestroy(SUpdateInfo* pInfo) {
|
||||||
if (pInfo == NULL) {
|
if (pInfo == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -317,7 +382,7 @@ void updateInfoDestroy(SUpdateInfo *pInfo) {
|
||||||
|
|
||||||
uint64_t size = taosArrayGetSize(pInfo->pTsSBFs);
|
uint64_t size = taosArrayGetSize(pInfo->pTsSBFs);
|
||||||
for (uint64_t i = 0; i < size; i++) {
|
for (uint64_t i = 0; i < size; i++) {
|
||||||
SScalableBf *pSBF = taosArrayGetP(pInfo->pTsSBFs, i);
|
SScalableBf* pSBF = taosArrayGetP(pInfo->pTsSBFs, i);
|
||||||
tScalableBfDestroy(pSBF);
|
tScalableBfDestroy(pSBF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -329,15 +394,19 @@ void updateInfoDestroy(SUpdateInfo *pInfo) {
|
||||||
taosMemoryFree(pInfo);
|
taosMemoryFree(pInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateInfoAddCloseWindowSBF(SUpdateInfo *pInfo) {
|
void updateInfoAddCloseWindowSBF(SUpdateInfo* pInfo) {
|
||||||
if (pInfo->pCloseWinSBF) {
|
if (pInfo->pCloseWinSBF) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
int64_t rows = adjustExpEntries(pInfo->interval * ROWS_PER_MILLISECOND);
|
int64_t rows = adjustExpEntries(pInfo->interval * ROWS_PER_MILLISECOND);
|
||||||
pInfo->pCloseWinSBF = tScalableBfInit(rows, DEFAULT_FALSE_POSITIVE);
|
int32_t code = tScalableBfInit(rows, DEFAULT_FALSE_POSITIVE, &pInfo->pCloseWinSBF);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
pInfo->pCloseWinSBF = NULL;
|
||||||
|
uError("%s failed to add close window SBF since %s", __func__, tstrerror(code));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void updateInfoDestoryColseWinSBF(SUpdateInfo *pInfo) {
|
void updateInfoDestoryColseWinSBF(SUpdateInfo* pInfo) {
|
||||||
if (!pInfo || !pInfo->pCloseWinSBF) {
|
if (!pInfo || !pInfo->pCloseWinSBF) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -345,62 +414,124 @@ void updateInfoDestoryColseWinSBF(SUpdateInfo *pInfo) {
|
||||||
pInfo->pCloseWinSBF = NULL;
|
pInfo->pCloseWinSBF = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t updateInfoSerialize(void *buf, int32_t bufLen, const SUpdateInfo *pInfo) {
|
int32_t updateInfoSerialize(void* buf, int32_t bufLen, const SUpdateInfo* pInfo, int32_t* pLen) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (!pInfo) {
|
if (!pInfo) {
|
||||||
return 0;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEncoder encoder = {0};
|
SEncoder encoder = {0};
|
||||||
tEncoderInit(&encoder, buf, bufLen);
|
tEncoderInit(&encoder, buf, bufLen);
|
||||||
if (tStartEncode(&encoder) < 0) return -1;
|
if (tStartEncode(&encoder) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t size = taosArrayGetSize(pInfo->pTsBuckets);
|
int32_t size = taosArrayGetSize(pInfo->pTsBuckets);
|
||||||
if (tEncodeI32(&encoder, size) < 0) return -1;
|
if (tEncodeI32(&encoder, size) < 0) {
|
||||||
for (int32_t i = 0; i < size; i++) {
|
code = TSDB_CODE_FAILED;
|
||||||
TSKEY *pTs = (TSKEY *)taosArrayGet(pInfo->pTsBuckets, i);
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
if (tEncodeI64(&encoder, *pTs) < 0) return -1;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tEncodeU64(&encoder, pInfo->numBuckets) < 0) return -1;
|
for (int32_t i = 0; i < size; i++) {
|
||||||
|
TSKEY* pTs = (TSKEY*)taosArrayGet(pInfo->pTsBuckets, i);
|
||||||
|
if (tEncodeI64(&encoder, *pTs) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (tEncodeU64(&encoder, pInfo->numBuckets) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t sBfSize = taosArrayGetSize(pInfo->pTsSBFs);
|
int32_t sBfSize = taosArrayGetSize(pInfo->pTsSBFs);
|
||||||
if (tEncodeI32(&encoder, sBfSize) < 0) return -1;
|
if (tEncodeI32(&encoder, sBfSize) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
for (int32_t i = 0; i < sBfSize; i++) {
|
for (int32_t i = 0; i < sBfSize; i++) {
|
||||||
SScalableBf *pSBf = taosArrayGetP(pInfo->pTsSBFs, i);
|
SScalableBf* pSBf = taosArrayGetP(pInfo->pTsSBFs, i);
|
||||||
if (tScalableBfEncode(pSBf, &encoder) < 0) return -1;
|
if (tScalableBfEncode(pSBf, &encoder) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tEncodeU64(&encoder, pInfo->numSBFs) < 0) return -1;
|
if (tEncodeU64(&encoder, pInfo->numSBFs) < 0) {
|
||||||
if (tEncodeI64(&encoder, pInfo->interval) < 0) return -1;
|
code = TSDB_CODE_FAILED;
|
||||||
if (tEncodeI64(&encoder, pInfo->watermark) < 0) return -1;
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
if (tEncodeI64(&encoder, pInfo->minTS) < 0) return -1;
|
}
|
||||||
|
if (tEncodeI64(&encoder, pInfo->interval) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
if (tEncodeI64(&encoder, pInfo->watermark) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
if (tEncodeI64(&encoder, pInfo->minTS) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
if (tScalableBfEncode(pInfo->pCloseWinSBF, &encoder) < 0) return -1;
|
if (tScalableBfEncode(pInfo->pCloseWinSBF, &encoder) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mapSize = taosHashGetSize(pInfo->pMap);
|
int32_t mapSize = taosHashGetSize(pInfo->pMap);
|
||||||
if (tEncodeI32(&encoder, mapSize) < 0) return -1;
|
if (tEncodeI32(&encoder, mapSize) < 0) {
|
||||||
void *pIte = NULL;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
void* pIte = NULL;
|
||||||
size_t keyLen = 0;
|
size_t keyLen = 0;
|
||||||
while ((pIte = taosHashIterate(pInfo->pMap, pIte)) != NULL) {
|
while ((pIte = taosHashIterate(pInfo->pMap, pIte)) != NULL) {
|
||||||
void *key = taosHashGetKey(pIte, &keyLen);
|
void* key = taosHashGetKey(pIte, &keyLen);
|
||||||
if (tEncodeU64(&encoder, *(uint64_t *)key) < 0) return -1;
|
if (tEncodeU64(&encoder, *(uint64_t*)key) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
int32_t valueSize = taosHashGetValueSize(pIte);
|
int32_t valueSize = taosHashGetValueSize(pIte);
|
||||||
if (tEncodeBinary(&encoder, (const uint8_t *)pIte, valueSize) < 0) return -1;
|
if (tEncodeBinary(&encoder, (const uint8_t*)pIte, valueSize) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tEncodeU64(&encoder, pInfo->maxDataVersion) < 0) return -1;
|
if (tEncodeU64(&encoder, pInfo->maxDataVersion) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
if (tEncodeI32(&encoder, pInfo->pkColLen) < 0) return -1;
|
if (tEncodeI32(&encoder, pInfo->pkColLen) < 0) {
|
||||||
if (tEncodeI8(&encoder, pInfo->pkColType) < 0) return -1;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
if (tEncodeI8(&encoder, pInfo->pkColType) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _end);
|
||||||
|
}
|
||||||
|
|
||||||
tEndEncode(&encoder);
|
tEndEncode(&encoder);
|
||||||
|
|
||||||
int32_t tlen = encoder.pos;
|
int32_t tlen = encoder.pos;
|
||||||
tEncoderClear(&encoder);
|
tEncoderClear(&encoder);
|
||||||
return tlen;
|
*pLen = tlen;
|
||||||
|
|
||||||
|
_end:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t updateInfoDeserialize(void *buf, int32_t bufLen, SUpdateInfo *pInfo) {
|
int32_t updateInfoDeserialize(void* buf, int32_t bufLen, SUpdateInfo* pInfo) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
ASSERT(pInfo);
|
ASSERT(pInfo);
|
||||||
SDecoder decoder = {0};
|
SDecoder decoder = {0};
|
||||||
tDecoderInit(&decoder, buf, bufLen);
|
tDecoderInit(&decoder, buf, bufLen);
|
||||||
|
@ -419,10 +550,12 @@ int32_t updateInfoDeserialize(void *buf, int32_t bufLen, SUpdateInfo *pInfo) {
|
||||||
|
|
||||||
int32_t sBfSize = 0;
|
int32_t sBfSize = 0;
|
||||||
if (tDecodeI32(&decoder, &sBfSize) < 0) return -1;
|
if (tDecodeI32(&decoder, &sBfSize) < 0) return -1;
|
||||||
pInfo->pTsSBFs = taosArrayInit(sBfSize, sizeof(void *));
|
pInfo->pTsSBFs = taosArrayInit(sBfSize, sizeof(void*));
|
||||||
for (int32_t i = 0; i < sBfSize; i++) {
|
for (int32_t i = 0; i < sBfSize; i++) {
|
||||||
SScalableBf *pSBf = tScalableBfDecode(&decoder);
|
SScalableBf* pSBf = NULL;
|
||||||
if (!pSBf) return -1;
|
code = tScalableBfDecode(&decoder, &pSBf);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
|
||||||
taosArrayPush(pInfo->pTsSBFs, &pSBf);
|
taosArrayPush(pInfo->pTsSBFs, &pSBf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -430,7 +563,12 @@ int32_t updateInfoDeserialize(void *buf, int32_t bufLen, SUpdateInfo *pInfo) {
|
||||||
if (tDecodeI64(&decoder, &pInfo->interval) < 0) return -1;
|
if (tDecodeI64(&decoder, &pInfo->interval) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pInfo->watermark) < 0) return -1;
|
if (tDecodeI64(&decoder, &pInfo->watermark) < 0) return -1;
|
||||||
if (tDecodeI64(&decoder, &pInfo->minTS) < 0) return -1;
|
if (tDecodeI64(&decoder, &pInfo->minTS) < 0) return -1;
|
||||||
pInfo->pCloseWinSBF = tScalableBfDecode(&decoder);
|
|
||||||
|
code = tScalableBfDecode(&decoder, &pInfo->pCloseWinSBF);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
pInfo->pCloseWinSBF = NULL;
|
||||||
|
code = TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mapSize = 0;
|
int32_t mapSize = 0;
|
||||||
if (tDecodeI32(&decoder, &mapSize) < 0) return -1;
|
if (tDecodeI32(&decoder, &mapSize) < 0) return -1;
|
||||||
|
@ -454,7 +592,8 @@ int32_t updateInfoDeserialize(void *buf, int32_t bufLen, SUpdateInfo *pInfo) {
|
||||||
pInfo->pValueBuff = taosMemoryCalloc(1, sizeof(TSKEY) + pInfo->pkColLen);
|
pInfo->pValueBuff = taosMemoryCalloc(1, sizeof(TSKEY) + pInfo->pkColLen);
|
||||||
if (pInfo->pkColLen != 0) {
|
if (pInfo->pkColLen != 0) {
|
||||||
pInfo->comparePkRowFn = compareKeyTsAndPk;
|
pInfo->comparePkRowFn = compareKeyTsAndPk;
|
||||||
pInfo->comparePkCol = getKeyComparFunc(pInfo->pkColType, TSDB_ORDER_ASC);;
|
pInfo->comparePkCol = getKeyComparFunc(pInfo->pkColType, TSDB_ORDER_ASC);
|
||||||
|
;
|
||||||
} else {
|
} else {
|
||||||
pInfo->comparePkRowFn = compareKeyTs;
|
pInfo->comparePkRowFn = compareKeyTs;
|
||||||
pInfo->comparePkCol = NULL;
|
pInfo->comparePkCol = NULL;
|
||||||
|
@ -463,11 +602,16 @@ int32_t updateInfoDeserialize(void *buf, int32_t bufLen, SUpdateInfo *pInfo) {
|
||||||
tEndDecode(&decoder);
|
tEndDecode(&decoder);
|
||||||
|
|
||||||
tDecoderClear(&decoder);
|
tDecoderClear(&decoder);
|
||||||
return 0;
|
|
||||||
|
_error:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isIncrementalTimeStamp(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len) {
|
bool isIncrementalTimeStamp(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts, void* pPkVal, int32_t len) {
|
||||||
TSKEY *pMapMaxTs = taosHashGet(pInfo->pMap, &tableId, sizeof(uint64_t));
|
TSKEY* pMapMaxTs = taosHashGet(pInfo->pMap, &tableId, sizeof(uint64_t));
|
||||||
bool res = true;
|
bool res = true;
|
||||||
if (pMapMaxTs && pInfo->comparePkRowFn(pMapMaxTs, &ts, pPkVal, pInfo->comparePkCol) == 1) {
|
if (pMapMaxTs && pInfo->comparePkRowFn(pMapMaxTs, &ts, pPkVal, pInfo->comparePkCol) == 1) {
|
||||||
res = false;
|
res = false;
|
||||||
|
|
|
@ -74,16 +74,16 @@ typedef struct SRaftStore {
|
||||||
TdThreadMutex mutex;
|
TdThreadMutex mutex;
|
||||||
} SRaftStore;
|
} SRaftStore;
|
||||||
|
|
||||||
typedef struct SSyncHbTimerData {
|
struct SSyncHbTimerData {
|
||||||
int64_t syncNodeRid;
|
int64_t syncNodeRid;
|
||||||
SSyncTimer* pTimer;
|
SSyncTimer* pTimer;
|
||||||
SRaftId destId;
|
SRaftId destId;
|
||||||
uint64_t logicClock;
|
uint64_t logicClock;
|
||||||
int64_t execTime;
|
int64_t execTime;
|
||||||
int64_t rid;
|
int64_t rid;
|
||||||
} SSyncHbTimerData;
|
};
|
||||||
|
|
||||||
typedef struct SSyncTimer {
|
struct SSyncTimer {
|
||||||
void* pTimer;
|
void* pTimer;
|
||||||
TAOS_TMR_CALLBACK timerCb;
|
TAOS_TMR_CALLBACK timerCb;
|
||||||
uint64_t logicClock;
|
uint64_t logicClock;
|
||||||
|
@ -92,7 +92,7 @@ typedef struct SSyncTimer {
|
||||||
int64_t timeStamp;
|
int64_t timeStamp;
|
||||||
SRaftId destId;
|
SRaftId destId;
|
||||||
int64_t hbDataRid;
|
int64_t hbDataRid;
|
||||||
} SSyncTimer;
|
};
|
||||||
|
|
||||||
typedef struct SElectTimerParam {
|
typedef struct SElectTimerParam {
|
||||||
uint64_t logicClock;
|
uint64_t logicClock;
|
||||||
|
@ -106,7 +106,7 @@ typedef struct SPeerState {
|
||||||
int64_t lastSendTime;
|
int64_t lastSendTime;
|
||||||
} SPeerState;
|
} SPeerState;
|
||||||
|
|
||||||
typedef struct SSyncNode {
|
struct SSyncNode {
|
||||||
// init by SSyncInfo
|
// init by SSyncInfo
|
||||||
SyncGroupId vgId;
|
SyncGroupId vgId;
|
||||||
SRaftCfg raftCfg;
|
SRaftCfg raftCfg;
|
||||||
|
@ -116,7 +116,7 @@ typedef struct SSyncNode {
|
||||||
|
|
||||||
// sync io
|
// sync io
|
||||||
SSyncLogBuffer* pLogBuf;
|
SSyncLogBuffer* pLogBuf;
|
||||||
SWal* pWal;
|
struct SWal* pWal;
|
||||||
const SMsgCb* msgcb;
|
const SMsgCb* msgcb;
|
||||||
int32_t (*syncSendMSg)(const SEpSet* pEpSet, SRpcMsg* pMsg);
|
int32_t (*syncSendMSg)(const SEpSet* pEpSet, SRpcMsg* pMsg);
|
||||||
int32_t (*syncEqMsg)(const SMsgCb* msgcb, SRpcMsg* pMsg);
|
int32_t (*syncEqMsg)(const SMsgCb* msgcb, SRpcMsg* pMsg);
|
||||||
|
@ -234,7 +234,7 @@ typedef struct SSyncNode {
|
||||||
|
|
||||||
bool isStart;
|
bool isStart;
|
||||||
|
|
||||||
} SSyncNode;
|
};
|
||||||
|
|
||||||
// open/close --------------
|
// open/close --------------
|
||||||
SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion);
|
SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo, int32_t vnodeVersion);
|
||||||
|
|
|
@ -103,7 +103,7 @@ typedef void* queue[2];
|
||||||
#define TRANS_MAGIC_NUM 0x5f375a86
|
#define TRANS_MAGIC_NUM 0x5f375a86
|
||||||
#define TRANS_NOVALID_PACKET(src) ((src) != TRANS_MAGIC_NUM ? 1 : 0)
|
#define TRANS_NOVALID_PACKET(src) ((src) != TRANS_MAGIC_NUM ? 1 : 0)
|
||||||
|
|
||||||
typedef SRpcMsg STransMsg;
|
typedef struct SRpcMsg STransMsg;
|
||||||
typedef SRpcCtx STransCtx;
|
typedef SRpcCtx STransCtx;
|
||||||
typedef SRpcCtxVal STransCtxVal;
|
typedef SRpcCtxVal STransCtxVal;
|
||||||
typedef SRpcInfo STrans;
|
typedef SRpcInfo STrans;
|
||||||
|
|
|
@ -22,26 +22,30 @@
|
||||||
#define UNIT_NUM_BITS 64ULL
|
#define UNIT_NUM_BITS 64ULL
|
||||||
#define UNIT_ADDR_NUM_BITS 6ULL
|
#define UNIT_ADDR_NUM_BITS 6ULL
|
||||||
|
|
||||||
static FORCE_INLINE bool setBit(uint64_t *buf, uint64_t index) {
|
static FORCE_INLINE bool setBit(uint64_t* buf, uint64_t index) {
|
||||||
uint64_t unitIndex = index >> UNIT_ADDR_NUM_BITS;
|
uint64_t unitIndex = index >> UNIT_ADDR_NUM_BITS;
|
||||||
uint64_t old = buf[unitIndex];
|
uint64_t old = buf[unitIndex];
|
||||||
buf[unitIndex] |= (1ULL << (index % UNIT_NUM_BITS));
|
buf[unitIndex] |= (1ULL << (index % UNIT_NUM_BITS));
|
||||||
return buf[unitIndex] != old;
|
return buf[unitIndex] != old;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE bool getBit(uint64_t *buf, uint64_t index) {
|
static FORCE_INLINE bool getBit(uint64_t* buf, uint64_t index) {
|
||||||
uint64_t unitIndex = index >> UNIT_ADDR_NUM_BITS;
|
uint64_t unitIndex = index >> UNIT_ADDR_NUM_BITS;
|
||||||
uint64_t mask = 1ULL << (index % UNIT_NUM_BITS);
|
uint64_t mask = 1ULL << (index % UNIT_NUM_BITS);
|
||||||
return buf[unitIndex] & mask;
|
return buf[unitIndex] & mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
SBloomFilter *tBloomFilterInit(uint64_t expectedEntries, double errorRate) {
|
int32_t tBloomFilterInit(uint64_t expectedEntries, double errorRate, SBloomFilter** ppBF) {
|
||||||
|
int32_t code = 0;
|
||||||
|
int32_t lino = 0;
|
||||||
if (expectedEntries < 1 || errorRate <= 0 || errorRate >= 1.0) {
|
if (expectedEntries < 1 || errorRate <= 0 || errorRate >= 1.0) {
|
||||||
return NULL;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
SBloomFilter *pBF = taosMemoryCalloc(1, sizeof(SBloomFilter));
|
SBloomFilter* pBF = taosMemoryCalloc(1, sizeof(SBloomFilter));
|
||||||
if (pBF == NULL) {
|
if (pBF == NULL) {
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
pBF->expectedEntries = expectedEntries;
|
pBF->expectedEntries = expectedEntries;
|
||||||
pBF->errorRate = errorRate;
|
pBF->errorRate = errorRate;
|
||||||
|
@ -61,12 +65,19 @@ SBloomFilter *tBloomFilterInit(uint64_t expectedEntries, double errorRate) {
|
||||||
pBF->buffer = taosMemoryCalloc(pBF->numUnits, sizeof(uint64_t));
|
pBF->buffer = taosMemoryCalloc(pBF->numUnits, sizeof(uint64_t));
|
||||||
if (pBF->buffer == NULL) {
|
if (pBF->buffer == NULL) {
|
||||||
tBloomFilterDestroy(pBF);
|
tBloomFilterDestroy(pBF);
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
return pBF;
|
(*ppBF) = pBF;
|
||||||
|
|
||||||
|
_error:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBloomFilterPutHash(SBloomFilter *pBF, uint64_t hash1, uint64_t hash2) {
|
int32_t tBloomFilterPutHash(SBloomFilter* pBF, uint64_t hash1, uint64_t hash2) {
|
||||||
ASSERT(!tBloomFilterIsFull(pBF));
|
ASSERT(!tBloomFilterIsFull(pBF));
|
||||||
bool hasChange = false;
|
bool hasChange = false;
|
||||||
const register uint64_t size = pBF->numBits;
|
const register uint64_t size = pBF->numBits;
|
||||||
|
@ -82,7 +93,7 @@ int32_t tBloomFilterPutHash(SBloomFilter *pBF, uint64_t hash1, uint64_t hash2) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBloomFilterPut(SBloomFilter *pBF, const void *keyBuf, uint32_t len) {
|
int32_t tBloomFilterPut(SBloomFilter* pBF, const void* keyBuf, uint32_t len) {
|
||||||
uint64_t h1 = (uint64_t)pBF->hashFn1(keyBuf, len);
|
uint64_t h1 = (uint64_t)pBF->hashFn1(keyBuf, len);
|
||||||
uint64_t h2 = (uint64_t)pBF->hashFn2(keyBuf, len);
|
uint64_t h2 = (uint64_t)pBF->hashFn2(keyBuf, len);
|
||||||
bool hasChange = false;
|
bool hasChange = false;
|
||||||
|
@ -99,7 +110,7 @@ int32_t tBloomFilterPut(SBloomFilter *pBF, const void *keyBuf, uint32_t len) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBloomFilterNoContain(const SBloomFilter *pBF, uint64_t hash1, uint64_t hash2) {
|
int32_t tBloomFilterNoContain(const SBloomFilter* pBF, uint64_t hash1, uint64_t hash2) {
|
||||||
const register uint64_t size = pBF->numBits;
|
const register uint64_t size = pBF->numBits;
|
||||||
uint64_t cbHash = hash1;
|
uint64_t cbHash = hash1;
|
||||||
for (uint32_t i = 0; i < pBF->hashFunctions; ++i) {
|
for (uint32_t i = 0; i < pBF->hashFunctions; ++i) {
|
||||||
|
@ -111,7 +122,7 @@ int32_t tBloomFilterNoContain(const SBloomFilter *pBF, uint64_t hash1, uint64_t
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tBloomFilterDestroy(SBloomFilter *pBF) {
|
void tBloomFilterDestroy(SBloomFilter* pBF) {
|
||||||
if (pBF == NULL) {
|
if (pBF == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -119,41 +130,70 @@ void tBloomFilterDestroy(SBloomFilter *pBF) {
|
||||||
taosMemoryFree(pBF);
|
taosMemoryFree(pBF);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tBloomFilterEncode(const SBloomFilter *pBF, SEncoder *pEncoder) {
|
int32_t tBloomFilterEncode(const SBloomFilter* pBF, SEncoder* pEncoder) {
|
||||||
if (tEncodeU32(pEncoder, pBF->hashFunctions) < 0) return -1;
|
if (tEncodeU32(pEncoder, pBF->hashFunctions) < 0) return -1;
|
||||||
if (tEncodeU64(pEncoder, pBF->expectedEntries) < 0) return -1;
|
if (tEncodeU64(pEncoder, pBF->expectedEntries) < 0) return -1;
|
||||||
if (tEncodeU64(pEncoder, pBF->numUnits) < 0) return -1;
|
if (tEncodeU64(pEncoder, pBF->numUnits) < 0) return -1;
|
||||||
if (tEncodeU64(pEncoder, pBF->numBits) < 0) return -1;
|
if (tEncodeU64(pEncoder, pBF->numBits) < 0) return -1;
|
||||||
if (tEncodeU64(pEncoder, pBF->size) < 0) return -1;
|
if (tEncodeU64(pEncoder, pBF->size) < 0) return -1;
|
||||||
for (uint64_t i = 0; i < pBF->numUnits; i++) {
|
for (uint64_t i = 0; i < pBF->numUnits; i++) {
|
||||||
uint64_t *pUnits = (uint64_t *)pBF->buffer;
|
uint64_t* pUnits = (uint64_t*)pBF->buffer;
|
||||||
if (tEncodeU64(pEncoder, pUnits[i]) < 0) return -1;
|
if (tEncodeU64(pEncoder, pUnits[i]) < 0) return -1;
|
||||||
}
|
}
|
||||||
if (tEncodeDouble(pEncoder, pBF->errorRate) < 0) return -1;
|
if (tEncodeDouble(pEncoder, pBF->errorRate) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SBloomFilter *tBloomFilterDecode(SDecoder *pDecoder) {
|
int32_t tBloomFilterDecode(SDecoder* pDecoder, SBloomFilter** ppBF) {
|
||||||
SBloomFilter *pBF = taosMemoryCalloc(1, sizeof(SBloomFilter));
|
int32_t code = 0;
|
||||||
|
int32_t lino = 0;
|
||||||
|
SBloomFilter* pBF = taosMemoryCalloc(1, sizeof(SBloomFilter));
|
||||||
|
if (!pBF) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
pBF->buffer = NULL;
|
pBF->buffer = NULL;
|
||||||
if (tDecodeU32(pDecoder, &pBF->hashFunctions) < 0) goto _error;
|
if (tDecodeU32(pDecoder, &pBF->hashFunctions) < 0) {
|
||||||
if (tDecodeU64(pDecoder, &pBF->expectedEntries) < 0) goto _error;
|
code = TSDB_CODE_FAILED;
|
||||||
if (tDecodeU64(pDecoder, &pBF->numUnits) < 0) goto _error;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
if (tDecodeU64(pDecoder, &pBF->numBits) < 0) goto _error;
|
}
|
||||||
if (tDecodeU64(pDecoder, &pBF->size) < 0) goto _error;
|
if (tDecodeU64(pDecoder, &pBF->expectedEntries) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
if (tDecodeU64(pDecoder, &pBF->numUnits) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
if (tDecodeU64(pDecoder, &pBF->numBits) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
if (tDecodeU64(pDecoder, &pBF->size) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
pBF->buffer = taosMemoryCalloc(pBF->numUnits, sizeof(uint64_t));
|
pBF->buffer = taosMemoryCalloc(pBF->numUnits, sizeof(uint64_t));
|
||||||
for (int32_t i = 0; i < pBF->numUnits; i++) {
|
for (int32_t i = 0; i < pBF->numUnits; i++) {
|
||||||
uint64_t *pUnits = (uint64_t *)pBF->buffer;
|
uint64_t* pUnits = (uint64_t*)pBF->buffer;
|
||||||
if (tDecodeU64(pDecoder, pUnits + i) < 0) goto _error;
|
if (tDecodeU64(pDecoder, pUnits + i) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (tDecodeDouble(pDecoder, &pBF->errorRate) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
if (tDecodeDouble(pDecoder, &pBF->errorRate) < 0) goto _error;
|
|
||||||
pBF->hashFn1 = HASH_FUNCTION_1;
|
pBF->hashFn1 = HASH_FUNCTION_1;
|
||||||
pBF->hashFn2 = HASH_FUNCTION_2;
|
pBF->hashFn2 = HASH_FUNCTION_2;
|
||||||
return pBF;
|
(*ppBF) = pBF;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
tBloomFilterDestroy(pBF);
|
tBloomFilterDestroy(pBF);
|
||||||
return NULL;
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool tBloomFilterIsFull(const SBloomFilter *pBF) { return pBF->size >= pBF->expectedEntries; }
|
bool tBloomFilterIsFull(const SBloomFilter* pBF) { return pBF->size >= pBF->expectedEntries; }
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
|
|
||||||
#include "tscalablebf.h"
|
#include "tscalablebf.h"
|
||||||
#include "taoserror.h"
|
#include "taoserror.h"
|
||||||
|
#include "tutil.h"
|
||||||
|
|
||||||
#define DEFAULT_GROWTH 2
|
#define DEFAULT_GROWTH 2
|
||||||
#define DEFAULT_TIGHTENING_RATIO 0.5
|
#define DEFAULT_TIGHTENING_RATIO 0.5
|
||||||
|
@ -24,52 +25,84 @@
|
||||||
#define SBF_INVALID -1
|
#define SBF_INVALID -1
|
||||||
#define SBF_VALID 0
|
#define SBF_VALID 0
|
||||||
|
|
||||||
static SBloomFilter *tScalableBfAddFilter(SScalableBf *pSBf, uint64_t expectedEntries, double errorRate);
|
static int32_t tScalableBfAddFilter(SScalableBf* pSBf, uint64_t expectedEntries, double errorRate,
|
||||||
|
SBloomFilter** ppNormalBf);
|
||||||
|
|
||||||
SScalableBf *tScalableBfInit(uint64_t expectedEntries, double errorRate) {
|
int32_t tScalableBfInit(uint64_t expectedEntries, double errorRate, SScalableBf** ppSBf) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
const uint32_t defaultSize = 8;
|
const uint32_t defaultSize = 8;
|
||||||
if (expectedEntries < 1 || errorRate <= 0 || errorRate >= 1.0) {
|
if (expectedEntries < 1 || errorRate <= 0 || errorRate >= 1.0) {
|
||||||
return NULL;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
SScalableBf *pSBf = taosMemoryCalloc(1, sizeof(SScalableBf));
|
SScalableBf* pSBf = taosMemoryCalloc(1, sizeof(SScalableBf));
|
||||||
if (pSBf == NULL) {
|
if (pSBf == NULL) {
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
pSBf->maxBloomFilters = DEFAULT_MAX_BLOOMFILTERS;
|
pSBf->maxBloomFilters = DEFAULT_MAX_BLOOMFILTERS;
|
||||||
pSBf->status = SBF_VALID;
|
pSBf->status = SBF_VALID;
|
||||||
pSBf->numBits = 0;
|
pSBf->numBits = 0;
|
||||||
pSBf->bfArray = taosArrayInit(defaultSize, sizeof(void *));
|
pSBf->bfArray = taosArrayInit(defaultSize, sizeof(void*));
|
||||||
if (tScalableBfAddFilter(pSBf, expectedEntries, errorRate * DEFAULT_TIGHTENING_RATIO) == NULL) {
|
if (!pSBf->bfArray) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
|
||||||
|
SBloomFilter* pNormalBf = NULL;
|
||||||
|
code = tScalableBfAddFilter(pSBf, expectedEntries, errorRate * DEFAULT_TIGHTENING_RATIO, &pNormalBf);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tScalableBfDestroy(pSBf);
|
tScalableBfDestroy(pSBf);
|
||||||
return NULL;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
pSBf->growth = DEFAULT_GROWTH;
|
pSBf->growth = DEFAULT_GROWTH;
|
||||||
pSBf->hashFn1 = HASH_FUNCTION_1;
|
pSBf->hashFn1 = HASH_FUNCTION_1;
|
||||||
pSBf->hashFn2 = HASH_FUNCTION_2;
|
pSBf->hashFn2 = HASH_FUNCTION_2;
|
||||||
return pSBf;
|
(*ppSBf) = pSBf;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
_error:
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tScalableBfPutNoCheck(SScalableBf *pSBf, const void *keyBuf, uint32_t len) {
|
int32_t tScalableBfPutNoCheck(SScalableBf* pSBf, const void* keyBuf, uint32_t len) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (pSBf->status == SBF_INVALID) {
|
if (pSBf->status == SBF_INVALID) {
|
||||||
return TSDB_CODE_FAILED;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
int32_t size = taosArrayGetSize(pSBf->bfArray);
|
int32_t size = taosArrayGetSize(pSBf->bfArray);
|
||||||
SBloomFilter *pNormalBf = taosArrayGetP(pSBf->bfArray, size - 1);
|
SBloomFilter* pNormalBf = taosArrayGetP(pSBf->bfArray, size - 1);
|
||||||
ASSERT(pNormalBf);
|
if (!pNormalBf) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
if (tBloomFilterIsFull(pNormalBf)) {
|
if (tBloomFilterIsFull(pNormalBf)) {
|
||||||
pNormalBf = tScalableBfAddFilter(pSBf, pNormalBf->expectedEntries * pSBf->growth,
|
code = tScalableBfAddFilter(pSBf, pNormalBf->expectedEntries * pSBf->growth,
|
||||||
pNormalBf->errorRate * DEFAULT_TIGHTENING_RATIO);
|
pNormalBf->errorRate * DEFAULT_TIGHTENING_RATIO, &pNormalBf);
|
||||||
if (pNormalBf == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
pSBf->status = SBF_INVALID;
|
pSBf->status = SBF_INVALID;
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tBloomFilterPut(pNormalBf, keyBuf, len);
|
return tBloomFilterPut(pNormalBf, keyBuf, len);
|
||||||
|
|
||||||
|
_error:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tScalableBfPut(SScalableBf *pSBf, const void *keyBuf, uint32_t len) {
|
int32_t tScalableBfPut(SScalableBf* pSBf, const void* keyBuf, uint32_t len) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (pSBf->status == SBF_INVALID) {
|
if (pSBf->status == SBF_INVALID) {
|
||||||
return TSDB_CODE_FAILED;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
uint64_t h1 = (uint64_t)pSBf->hashFn1(keyBuf, len);
|
uint64_t h1 = (uint64_t)pSBf->hashFn1(keyBuf, len);
|
||||||
uint64_t h2 = (uint64_t)pSBf->hashFn2(keyBuf, len);
|
uint64_t h2 = (uint64_t)pSBf->hashFn2(keyBuf, len);
|
||||||
|
@ -80,20 +113,26 @@ int32_t tScalableBfPut(SScalableBf *pSBf, const void *keyBuf, uint32_t len) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SBloomFilter *pNormalBf = taosArrayGetP(pSBf->bfArray, size - 1);
|
SBloomFilter* pNormalBf = taosArrayGetP(pSBf->bfArray, size - 1);
|
||||||
ASSERT(pNormalBf);
|
ASSERT(pNormalBf);
|
||||||
if (tBloomFilterIsFull(pNormalBf)) {
|
if (tBloomFilterIsFull(pNormalBf)) {
|
||||||
pNormalBf = tScalableBfAddFilter(pSBf, pNormalBf->expectedEntries * pSBf->growth,
|
code = tScalableBfAddFilter(pSBf, pNormalBf->expectedEntries * pSBf->growth,
|
||||||
pNormalBf->errorRate * DEFAULT_TIGHTENING_RATIO);
|
pNormalBf->errorRate * DEFAULT_TIGHTENING_RATIO, &pNormalBf);
|
||||||
if (pNormalBf == NULL) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
pSBf->status = SBF_INVALID;
|
pSBf->status = SBF_INVALID;
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return tBloomFilterPutHash(pNormalBf, h1, h2);
|
return tBloomFilterPutHash(pNormalBf, h1, h2);
|
||||||
|
|
||||||
|
_error:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tScalableBfNoContain(const SScalableBf *pSBf, const void *keyBuf, uint32_t len) {
|
int32_t tScalableBfNoContain(const SScalableBf* pSBf, const void* keyBuf, uint32_t len) {
|
||||||
if (pSBf->status == SBF_INVALID) {
|
if (pSBf->status == SBF_INVALID) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
@ -108,24 +147,35 @@ int32_t tScalableBfNoContain(const SScalableBf *pSBf, const void *keyBuf, uint32
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SBloomFilter *tScalableBfAddFilter(SScalableBf *pSBf, uint64_t expectedEntries, double errorRate) {
|
static int32_t tScalableBfAddFilter(SScalableBf* pSBf, uint64_t expectedEntries, double errorRate,
|
||||||
|
SBloomFilter** ppNormalBf) {
|
||||||
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
if (taosArrayGetSize(pSBf->bfArray) >= pSBf->maxBloomFilters) {
|
if (taosArrayGetSize(pSBf->bfArray) >= pSBf->maxBloomFilters) {
|
||||||
return NULL;
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
|
|
||||||
SBloomFilter *pNormalBf = tBloomFilterInit(expectedEntries, errorRate);
|
SBloomFilter* pNormalBf = NULL;
|
||||||
if (pNormalBf == NULL) {
|
code = tBloomFilterInit(expectedEntries, errorRate, &pNormalBf);
|
||||||
return NULL;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
|
||||||
if (taosArrayPush(pSBf->bfArray, &pNormalBf) == NULL) {
|
if (taosArrayPush(pSBf->bfArray, &pNormalBf) == NULL) {
|
||||||
tBloomFilterDestroy(pNormalBf);
|
tBloomFilterDestroy(pNormalBf);
|
||||||
return NULL;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
}
|
}
|
||||||
pSBf->numBits += pNormalBf->numBits;
|
pSBf->numBits += pNormalBf->numBits;
|
||||||
return pNormalBf;
|
(*ppNormalBf) = pNormalBf;
|
||||||
|
|
||||||
|
_error:
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
void tScalableBfDestroy(SScalableBf *pSBf) {
|
void tScalableBfDestroy(SScalableBf* pSBf) {
|
||||||
if (pSBf == NULL) {
|
if (pSBf == NULL) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -135,7 +185,7 @@ void tScalableBfDestroy(SScalableBf *pSBf) {
|
||||||
taosMemoryFree(pSBf);
|
taosMemoryFree(pSBf);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tScalableBfEncode(const SScalableBf *pSBf, SEncoder *pEncoder) {
|
int32_t tScalableBfEncode(const SScalableBf* pSBf, SEncoder* pEncoder) {
|
||||||
if (!pSBf) {
|
if (!pSBf) {
|
||||||
if (tEncodeI32(pEncoder, 0) < 0) return -1;
|
if (tEncodeI32(pEncoder, 0) < 0) return -1;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -143,7 +193,7 @@ int32_t tScalableBfEncode(const SScalableBf *pSBf, SEncoder *pEncoder) {
|
||||||
int32_t size = taosArrayGetSize(pSBf->bfArray);
|
int32_t size = taosArrayGetSize(pSBf->bfArray);
|
||||||
if (tEncodeI32(pEncoder, size) < 0) return -1;
|
if (tEncodeI32(pEncoder, size) < 0) return -1;
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
SBloomFilter *pBF = taosArrayGetP(pSBf->bfArray, i);
|
SBloomFilter* pBF = taosArrayGetP(pSBf->bfArray, i);
|
||||||
if (tBloomFilterEncode(pBF, pEncoder) < 0) return -1;
|
if (tBloomFilterEncode(pBF, pEncoder) < 0) return -1;
|
||||||
}
|
}
|
||||||
if (tEncodeU32(pEncoder, pSBf->growth) < 0) return -1;
|
if (tEncodeU32(pEncoder, pSBf->growth) < 0) return -1;
|
||||||
|
@ -153,30 +203,61 @@ int32_t tScalableBfEncode(const SScalableBf *pSBf, SEncoder *pEncoder) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SScalableBf *tScalableBfDecode(SDecoder *pDecoder) {
|
int32_t tScalableBfDecode(SDecoder* pDecoder, SScalableBf** ppSBf) {
|
||||||
SScalableBf *pSBf = taosMemoryCalloc(1, sizeof(SScalableBf));
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
int32_t lino = 0;
|
||||||
|
SScalableBf* pSBf = taosMemoryCalloc(1, sizeof(SScalableBf));
|
||||||
|
if (!pSBf) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
pSBf->hashFn1 = HASH_FUNCTION_1;
|
pSBf->hashFn1 = HASH_FUNCTION_1;
|
||||||
pSBf->hashFn2 = HASH_FUNCTION_2;
|
pSBf->hashFn2 = HASH_FUNCTION_2;
|
||||||
pSBf->bfArray = NULL;
|
pSBf->bfArray = NULL;
|
||||||
int32_t size = 0;
|
int32_t size = 0;
|
||||||
if (tDecodeI32(pDecoder, &size) < 0) goto _error;
|
if (tDecodeI32(pDecoder, &size) < 0) {
|
||||||
if (size == 0) {
|
code = TSDB_CODE_FAILED;
|
||||||
tScalableBfDestroy(pSBf);
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
return NULL;
|
|
||||||
}
|
}
|
||||||
pSBf->bfArray = taosArrayInit(size * 2, sizeof(void *));
|
if (size == 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
pSBf->bfArray = taosArrayInit(size * 2, POINTER_BYTES);
|
||||||
|
if (!pSBf->bfArray) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
|
||||||
for (int32_t i = 0; i < size; i++) {
|
for (int32_t i = 0; i < size; i++) {
|
||||||
SBloomFilter *pBF = tBloomFilterDecode(pDecoder);
|
SBloomFilter* pBF = NULL;
|
||||||
if (!pBF) goto _error;
|
code = tBloomFilterDecode(pDecoder, &pBF);
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
taosArrayPush(pSBf->bfArray, &pBF);
|
taosArrayPush(pSBf->bfArray, &pBF);
|
||||||
}
|
}
|
||||||
if (tDecodeU32(pDecoder, &pSBf->growth) < 0) goto _error;
|
if (tDecodeU32(pDecoder, &pSBf->growth) < 0) {
|
||||||
if (tDecodeU64(pDecoder, &pSBf->numBits) < 0) goto _error;
|
code = TSDB_CODE_FAILED;
|
||||||
if (tDecodeU32(pDecoder, &pSBf->maxBloomFilters) < 0) goto _error;
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
if (tDecodeI8(pDecoder, &pSBf->status) < 0) goto _error;
|
}
|
||||||
return pSBf;
|
if (tDecodeU64(pDecoder, &pSBf->numBits) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
if (tDecodeU32(pDecoder, &pSBf->maxBloomFilters) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
if (tDecodeI8(pDecoder, &pSBf->status) < 0) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
TSDB_CHECK_CODE(code, lino, _error);
|
||||||
|
}
|
||||||
|
(*ppSBf) = pSBf;
|
||||||
|
|
||||||
_error:
|
_error:
|
||||||
|
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
tScalableBfDestroy(pSBf);
|
tScalableBfDestroy(pSBf);
|
||||||
return NULL;
|
uError("%s failed at line %d since %s", __func__, lino, tstrerror(code));
|
||||||
|
}
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -8,12 +8,15 @@ using namespace std;
|
||||||
TEST(TD_UTIL_BLOOMFILTER_TEST, normal_bloomFilter) {
|
TEST(TD_UTIL_BLOOMFILTER_TEST, normal_bloomFilter) {
|
||||||
int64_t ts1 = 1650803518000;
|
int64_t ts1 = 1650803518000;
|
||||||
|
|
||||||
GTEST_ASSERT_EQ(NULL, tBloomFilterInit(100, 0));
|
SBloomFilter* pBFTmp = NULL;
|
||||||
GTEST_ASSERT_EQ(NULL, tBloomFilterInit(100, 1));
|
GTEST_ASSERT_NE(0, tBloomFilterInit(100, 0, &pBFTmp));
|
||||||
GTEST_ASSERT_EQ(NULL, tBloomFilterInit(100, -0.1));
|
GTEST_ASSERT_NE(0, tBloomFilterInit(100, 1, &pBFTmp));
|
||||||
GTEST_ASSERT_EQ(NULL, tBloomFilterInit(0, 0.01));
|
GTEST_ASSERT_NE(0, tBloomFilterInit(100, -0.1, &pBFTmp));
|
||||||
|
GTEST_ASSERT_NE(0, tBloomFilterInit(0, 0.01, &pBFTmp));
|
||||||
|
|
||||||
SBloomFilter *pBF1 = tBloomFilterInit(100, 0.005);
|
SBloomFilter *pBF1 = NULL;
|
||||||
|
int32_t code = tBloomFilterInit(100, 0.005, &pBF1);
|
||||||
|
GTEST_ASSERT_EQ(0, code);
|
||||||
GTEST_ASSERT_EQ(pBF1->numBits, 1152);
|
GTEST_ASSERT_EQ(pBF1->numBits, 1152);
|
||||||
GTEST_ASSERT_EQ(pBF1->numUnits, 1152 / 64);
|
GTEST_ASSERT_EQ(pBF1->numUnits, 1152 / 64);
|
||||||
int64_t count = 0;
|
int64_t count = 0;
|
||||||
|
@ -25,16 +28,19 @@ TEST(TD_UTIL_BLOOMFILTER_TEST, normal_bloomFilter) {
|
||||||
}
|
}
|
||||||
ASSERT_TRUE(tBloomFilterIsFull(pBF1));
|
ASSERT_TRUE(tBloomFilterIsFull(pBF1));
|
||||||
|
|
||||||
SBloomFilter *pBF2 = tBloomFilterInit(1000 * 10000, 0.1);
|
SBloomFilter* pBF2 = NULL;
|
||||||
|
GTEST_ASSERT_EQ(0, tBloomFilterInit(1000 * 10000, 0.1, &pBF2));
|
||||||
GTEST_ASSERT_EQ(pBF2->numBits, 47925312);
|
GTEST_ASSERT_EQ(pBF2->numBits, 47925312);
|
||||||
GTEST_ASSERT_EQ(pBF2->numUnits, 47925312 / 64);
|
GTEST_ASSERT_EQ(pBF2->numUnits, 47925312 / 64);
|
||||||
|
|
||||||
SBloomFilter *pBF3 = tBloomFilterInit(10000 * 10000, 0.001);
|
SBloomFilter* pBF3 = NULL;
|
||||||
|
GTEST_ASSERT_EQ(0, tBloomFilterInit(10000 * 10000, 0.001, &pBF3));
|
||||||
GTEST_ASSERT_EQ(pBF3->numBits, 1437758784);
|
GTEST_ASSERT_EQ(pBF3->numBits, 1437758784);
|
||||||
GTEST_ASSERT_EQ(pBF3->numUnits, 1437758784 / 64);
|
GTEST_ASSERT_EQ(pBF3->numUnits, 1437758784 / 64);
|
||||||
|
|
||||||
int64_t size = 10000;
|
int64_t size = 10000;
|
||||||
SBloomFilter *pBF4 = tBloomFilterInit(size, 0.001);
|
SBloomFilter* pBF4 = NULL;
|
||||||
|
GTEST_ASSERT_EQ(0, tBloomFilterInit(size, 0.001, &pBF4));
|
||||||
for (int64_t i = 0; i < 1000; i++) {
|
for (int64_t i = 0; i < 1000; i++) {
|
||||||
int64_t ts = i + ts1;
|
int64_t ts = i + ts1;
|
||||||
GTEST_ASSERT_EQ(tBloomFilterPut(pBF4, &ts, sizeof(int64_t)), TSDB_CODE_SUCCESS);
|
GTEST_ASSERT_EQ(tBloomFilterPut(pBF4, &ts, sizeof(int64_t)), TSDB_CODE_SUCCESS);
|
||||||
|
@ -43,15 +49,15 @@ TEST(TD_UTIL_BLOOMFILTER_TEST, normal_bloomFilter) {
|
||||||
|
|
||||||
for (int64_t i = 0; i < 1000; i++) {
|
for (int64_t i = 0; i < 1000; i++) {
|
||||||
int64_t ts = i + ts1;
|
int64_t ts = i + ts1;
|
||||||
uint64_t h1 = (uint64_t) pBF4->hashFn1((const char*)&ts, sizeof(int64_t));
|
uint64_t h1 = (uint64_t)pBF4->hashFn1((const char*)&ts, sizeof(int64_t));
|
||||||
uint64_t h2 = (uint64_t) pBF4->hashFn2((const char*)&ts, sizeof(int64_t));
|
uint64_t h2 = (uint64_t)pBF4->hashFn2((const char*)&ts, sizeof(int64_t));
|
||||||
GTEST_ASSERT_EQ(tBloomFilterNoContain(pBF4, h1, h2), TSDB_CODE_FAILED);
|
GTEST_ASSERT_EQ(tBloomFilterNoContain(pBF4, h1, h2), TSDB_CODE_FAILED);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (int64_t i = 2000; i < 3000; i++) {
|
for (int64_t i = 2000; i < 3000; i++) {
|
||||||
int64_t ts = i + ts1;
|
int64_t ts = i + ts1;
|
||||||
uint64_t h1 = (uint64_t) pBF4->hashFn1((const char*)&ts, sizeof(int64_t));
|
uint64_t h1 = (uint64_t)pBF4->hashFn1((const char*)&ts, sizeof(int64_t));
|
||||||
uint64_t h2 = (uint64_t) pBF4->hashFn2((const char*)&ts, sizeof(int64_t));
|
uint64_t h2 = (uint64_t)pBF4->hashFn2((const char*)&ts, sizeof(int64_t));
|
||||||
GTEST_ASSERT_EQ(tBloomFilterNoContain(pBF4, h1, h2), TSDB_CODE_SUCCESS);
|
GTEST_ASSERT_EQ(tBloomFilterNoContain(pBF4, h1, h2), TSDB_CODE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -64,12 +70,14 @@ TEST(TD_UTIL_BLOOMFILTER_TEST, normal_bloomFilter) {
|
||||||
TEST(TD_UTIL_BLOOMFILTER_TEST, scalable_bloomFilter) {
|
TEST(TD_UTIL_BLOOMFILTER_TEST, scalable_bloomFilter) {
|
||||||
int64_t ts1 = 1650803518000;
|
int64_t ts1 = 1650803518000;
|
||||||
|
|
||||||
GTEST_ASSERT_EQ(NULL, tScalableBfInit(100, 0));
|
SScalableBf* tsSBF = NULL;
|
||||||
GTEST_ASSERT_EQ(NULL, tScalableBfInit(100, 1));
|
GTEST_ASSERT_NE(0, tScalableBfInit(100, 0, &tsSBF));
|
||||||
GTEST_ASSERT_EQ(NULL, tScalableBfInit(100, -0.1));
|
GTEST_ASSERT_NE(0, tScalableBfInit(100, 1, &tsSBF));
|
||||||
GTEST_ASSERT_EQ(NULL, tScalableBfInit(0, 0.01));
|
GTEST_ASSERT_NE(0, tScalableBfInit(100, -0.1, &tsSBF));
|
||||||
|
GTEST_ASSERT_NE(0, tScalableBfInit(0, 0.01, &tsSBF));
|
||||||
|
|
||||||
SScalableBf *pSBF1 = tScalableBfInit(100, 0.01);
|
SScalableBf* pSBF1 = NULL;
|
||||||
|
GTEST_ASSERT_EQ(0, tScalableBfInit(100, 0.01, &pSBF1));
|
||||||
GTEST_ASSERT_EQ(pSBF1->numBits, 1152);
|
GTEST_ASSERT_EQ(pSBF1->numBits, 1152);
|
||||||
int64_t count = 0;
|
int64_t count = 0;
|
||||||
int64_t index = 0;
|
int64_t index = 0;
|
||||||
|
@ -108,7 +116,7 @@ TEST(TD_UTIL_BLOOMFILTER_TEST, scalable_bloomFilter) {
|
||||||
int32_t aSize = taosArrayGetSize(pSBF1->bfArray);
|
int32_t aSize = taosArrayGetSize(pSBF1->bfArray);
|
||||||
int64_t totalBits = 0;
|
int64_t totalBits = 0;
|
||||||
for (int64_t i = 0; i < aSize; i++) {
|
for (int64_t i = 0; i < aSize; i++) {
|
||||||
SBloomFilter *pBF = (SBloomFilter *)taosArrayGetP(pSBF1->bfArray, i);
|
SBloomFilter* pBF = (SBloomFilter*)taosArrayGetP(pSBF1->bfArray, i);
|
||||||
ASSERT_TRUE(tBloomFilterIsFull(pBF));
|
ASSERT_TRUE(tBloomFilterIsFull(pBF));
|
||||||
totalBits += pBF->numBits;
|
totalBits += pBF->numBits;
|
||||||
}
|
}
|
||||||
|
@ -120,7 +128,8 @@ TEST(TD_UTIL_BLOOMFILTER_TEST, scalable_bloomFilter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t size = 10000;
|
int64_t size = 10000;
|
||||||
SScalableBf *pSBF4 = tScalableBfInit(size, 0.001);
|
SScalableBf* pSBF4 = NULL;
|
||||||
|
GTEST_ASSERT_EQ(0, tScalableBfInit(size, 0.001, &pSBF4));
|
||||||
for (int64_t i = 0; i < 1000; i++) {
|
for (int64_t i = 0; i < 1000; i++) {
|
||||||
int64_t ts = i + ts1;
|
int64_t ts = i + ts1;
|
||||||
GTEST_ASSERT_EQ(tScalableBfPut(pSBF4, &ts, sizeof(int64_t)), TSDB_CODE_SUCCESS);
|
GTEST_ASSERT_EQ(tScalableBfPut(pSBF4, &ts, sizeof(int64_t)), TSDB_CODE_SUCCESS);
|
||||||
|
|
|
@ -71,7 +71,6 @@ class TDTestCase(TBase):
|
||||||
"smlTsDefaultName tsdef",
|
"smlTsDefaultName tsdef",
|
||||||
"serverPort 6030",
|
"serverPort 6030",
|
||||||
"timezone tz",
|
"timezone tz",
|
||||||
"tempDir /var/tmp"
|
|
||||||
]
|
]
|
||||||
# exec
|
# exec
|
||||||
for option in options:
|
for option in options:
|
||||||
|
|
|
@ -121,6 +121,7 @@ if $data01 != 2 then
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data02 != 1 then
|
if $data02 != 1 then
|
||||||
|
print expect 1 , actual $data02
|
||||||
return -1
|
return -1
|
||||||
endi
|
endi
|
||||||
if $data03 != 1 then
|
if $data03 != 1 then
|
||||||
|
|
|
@ -121,7 +121,8 @@ int smlProcess_json1_Test() {
|
||||||
char *sql1[1] = {0};
|
char *sql1[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql1[i] = taosMemoryCalloc(1, 1024);
|
sql1[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql1[i], sql[i], 1023);
|
ASSERT(sql1[i] != NULL);
|
||||||
|
(void)strncpy(sql1[i], sql[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -149,7 +150,8 @@ int smlProcess_json1_Test() {
|
||||||
char *sql3[1] = {0};
|
char *sql3[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql3[i] = taosMemoryCalloc(1, 1024);
|
sql3[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql3[i], sql2[i], 1023);
|
ASSERT(sql3[i] != NULL);
|
||||||
|
(void)strncpy(sql3[i], sql2[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql3, sizeof(sql3) / sizeof(sql3[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql3, sizeof(sql3) / sizeof(sql3[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -176,7 +178,8 @@ int smlProcess_json1_Test() {
|
||||||
char *sql5[1] = {0};
|
char *sql5[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql5[i] = taosMemoryCalloc(1, 1024);
|
sql5[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql5[i], sql4[i], 1023);
|
ASSERT(sql5[i] != NULL);
|
||||||
|
(void)strncpy(sql5[i], sql4[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql5, sizeof(sql5) / sizeof(sql5[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql5, sizeof(sql5) / sizeof(sql5[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -215,7 +218,8 @@ int smlProcess_json2_Test() {
|
||||||
char *sql1[1] = {0};
|
char *sql1[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql1[i] = taosMemoryCalloc(1, 1024);
|
sql1[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql1[i], sql[i], 1023);
|
ASSERT(sql1[i] != NULL);
|
||||||
|
(void)strncpy(sql1[i], sql[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -249,7 +253,8 @@ int smlProcess_json3_Test() {
|
||||||
char *sql1[1] = {0};
|
char *sql1[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql1[i] = taosMemoryCalloc(1, 1024);
|
sql1[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql1[i], sql[i], 1023);
|
ASSERT(sql1[i] != NULL);
|
||||||
|
(void)strncpy(sql1[i], sql[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -286,7 +291,8 @@ int smlProcess_json_tag_not_same_Test() {
|
||||||
char *sql1[1] = {0};
|
char *sql1[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql1[i] = taosMemoryCalloc(1, 1024);
|
sql1[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql1[i], sql[i], 1023);
|
ASSERT(sql1[i] != NULL);
|
||||||
|
(void)strncpy(sql1[i], sql[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql1, sizeof(sql1) / sizeof(sql1[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -312,7 +318,8 @@ int smlProcess_json_tag_not_same_Test() {
|
||||||
char *sql3[1] = {0};
|
char *sql3[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql3[i] = taosMemoryCalloc(1, 1024);
|
sql3[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql3[i], sql2[i], 1023);
|
ASSERT(sql3[i] != NULL);
|
||||||
|
(void)strncpy(sql3[i], sql2[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql3, sizeof(sql3) / sizeof(sql3[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql3, sizeof(sql3) / sizeof(sql3[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -338,7 +345,8 @@ int smlProcess_json_tag_not_same_Test() {
|
||||||
char *sql5[1] = {0};
|
char *sql5[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql5[i] = taosMemoryCalloc(1, 1024);
|
sql5[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql5[i], sql4[i], 1023);
|
ASSERT(sql5[i] != NULL);
|
||||||
|
(void)strncpy(sql5[i], sql4[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql5, sizeof(sql5) / sizeof(sql5[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql5, sizeof(sql5) / sizeof(sql5[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
@ -1147,7 +1155,8 @@ int sml_19221_Test() {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
char *tmp = (char *)taosMemoryCalloc(1024, 1);
|
char *tmp = (char *)taosMemoryCalloc(1024, 1);
|
||||||
memcpy(tmp, sql[0], strlen(sql[0]));
|
ASSERT(tmp != NULL);
|
||||||
|
(void)memcpy(tmp, sql[0], strlen(sql[0]));
|
||||||
*(char *)(tmp + 44) = 0;
|
*(char *)(tmp + 44) = 0;
|
||||||
int32_t totalRows = 0;
|
int32_t totalRows = 0;
|
||||||
pRes = taos_schemaless_insert_raw(taos, tmp, strlen(sql[0]), &totalRows, TSDB_SML_LINE_PROTOCOL,
|
pRes = taos_schemaless_insert_raw(taos, tmp, strlen(sql[0]), &totalRows, TSDB_SML_LINE_PROTOCOL,
|
||||||
|
@ -1218,7 +1227,8 @@ int sml_ts3116_Test() {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
int32_t totalRows = 0;
|
int32_t totalRows = 0;
|
||||||
char *tmp = (char *)taosMemoryCalloc(1024, 1);
|
char *tmp = (char *)taosMemoryCalloc(1024, 1);
|
||||||
memcpy(tmp, sql, strlen(sql));
|
ASSERT(tmp != NULL);
|
||||||
|
(void)memcpy(tmp, sql, strlen(sql));
|
||||||
totalRows = 0;
|
totalRows = 0;
|
||||||
pRes = taos_schemaless_insert_raw(taos, tmp, strlen(tmp), &totalRows, TSDB_SML_LINE_PROTOCOL,
|
pRes = taos_schemaless_insert_raw(taos, tmp, strlen(tmp), &totalRows, TSDB_SML_LINE_PROTOCOL,
|
||||||
TSDB_SML_TIMESTAMP_MILLI_SECONDS);
|
TSDB_SML_TIMESTAMP_MILLI_SECONDS);
|
||||||
|
@ -1235,7 +1245,8 @@ int sml_ts3116_Test() {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
tmp = (char *)taosMemoryCalloc(1024, 1);
|
tmp = (char *)taosMemoryCalloc(1024, 1);
|
||||||
memcpy(tmp, sql1, strlen(sql1));
|
ASSERT(tmp != NULL);
|
||||||
|
(void)memcpy(tmp, sql1, strlen(sql1));
|
||||||
totalRows = 0;
|
totalRows = 0;
|
||||||
pRes = taos_schemaless_insert_raw(taos, tmp, strlen(tmp), &totalRows, TSDB_SML_LINE_PROTOCOL,
|
pRes = taos_schemaless_insert_raw(taos, tmp, strlen(tmp), &totalRows, TSDB_SML_LINE_PROTOCOL,
|
||||||
TSDB_SML_TIMESTAMP_MILLI_SECONDS);
|
TSDB_SML_TIMESTAMP_MILLI_SECONDS);
|
||||||
|
@ -2049,7 +2060,8 @@ int sml_td29373_Test() {
|
||||||
char *sql3[1] = {0};
|
char *sql3[1] = {0};
|
||||||
for (int i = 0; i < 1; i++) {
|
for (int i = 0; i < 1; i++) {
|
||||||
sql3[i] = taosMemoryCalloc(1, 1024);
|
sql3[i] = taosMemoryCalloc(1, 1024);
|
||||||
strncpy(sql3[i], sql2[i], 1023);
|
ASSERT(sql3[i] != NULL);
|
||||||
|
(void)strncpy(sql3[i], sql2[i], 1023);
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes = taos_schemaless_insert(taos, (char **)sql3, sizeof(sql3) / sizeof(sql3[0]), TSDB_SML_JSON_PROTOCOL,
|
pRes = taos_schemaless_insert(taos, (char **)sql3, sizeof(sql3) / sizeof(sql3[0]), TSDB_SML_JSON_PROTOCOL,
|
||||||
|
|
Loading…
Reference in New Issue