diff --git a/cmake/cmake.define b/cmake/cmake.define
index 5d64815a9aa90741a0d6aca7e51518d2263932a2..78eab0a59ad091bbded966700f5d734dd5412321 100644
--- a/cmake/cmake.define
+++ b/cmake/cmake.define
@@ -117,8 +117,8 @@ ELSE ()
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -fsanitize=address -fsanitize=undefined -fsanitize-recover=all -fsanitize=float-divide-by-zero -fsanitize=float-cast-overflow -fno-sanitize=shift-base -fno-sanitize=alignment -g3 -Wformat=0")
MESSAGE(STATUS "Will compile with Address Sanitizer!")
ELSE ()
- SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=0")
- SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=0")
+ SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
+ SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
ENDIF ()
MESSAGE("System processor ID: ${CMAKE_SYSTEM_PROCESSOR}")
diff --git a/cmake/cmake.version b/cmake/cmake.version
index 05094f10cccea02ecb6a9cc4b9283335cb4424b6..1a83126cd7d1ce3257cc6d3c811bd4e2f49a0371 100644
--- a/cmake/cmake.version
+++ b/cmake/cmake.version
@@ -2,7 +2,7 @@
IF (DEFINED VERNUMBER)
SET(TD_VER_NUMBER ${VERNUMBER})
ELSE ()
- SET(TD_VER_NUMBER "3.0.1.4")
+ SET(TD_VER_NUMBER "3.0.1.5")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in
index 73409a950a848662afc87a14b9f4c96dec4a625d..c19928c7a917aa4f2da8014f53168d29626087a3 100644
--- a/cmake/taostools_CMakeLists.txt.in
+++ b/cmake/taostools_CMakeLists.txt.in
@@ -2,7 +2,7 @@
# taos-tools
ExternalProject_Add(taos-tools
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
- GIT_TAG 4d02980
+ GIT_TAG cc973e0
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
BINARY_DIR ""
#BUILD_IN_SOURCE TRUE
diff --git a/docs/en/12-taos-sql/05-insert.md b/docs/en/12-taos-sql/05-insert.md
index da21896866d74c141b933f85cbe87952f53c7fc4..9141211db5239cb6a035f4a01a831adf9f50aa77 100644
--- a/docs/en/12-taos-sql/05-insert.md
+++ b/docs/en/12-taos-sql/05-insert.md
@@ -108,11 +108,11 @@ INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) VALUES ('202
## Insert Rows From A File
-Besides using `VALUES` to insert one or multiple rows, the data to be inserted can also be prepared in a CSV file with comma as separator and each field value quoted by single quotes. Table definition is not required in the CSV file. For example, if file "/tmp/csvfile.csv" contains the below data:
+Besides using `VALUES` to insert one or multiple rows, the data to be inserted can also be prepared in a CSV file with comma as separator and timestamp and string field value quoted by single quotes. Table definition is not required in the CSV file. For example, if file "/tmp/csvfile.csv" contains the below data:
```
-'2021-07-13 14:07:34.630', '10.2', '219', '0.32'
-'2021-07-13 14:07:35.779', '10.15', '217', '0.33'
+'2021-07-13 14:07:34.630', 10.2, 219, 0.32
+'2021-07-13 14:07:35.779', 10.15, 217, 0.33
```
Then data in this file can be inserted by the SQL statement below:
diff --git a/docs/en/12-taos-sql/10-function.md b/docs/en/12-taos-sql/10-function.md
index 2b39c4b9e529e7dd3d9acd8b1d9107cf02038063..6145d8c00c97a411699f7decf731399c238ff84e 100644
--- a/docs/en/12-taos-sql/10-function.md
+++ b/docs/en/12-taos-sql/10-function.md
@@ -863,6 +863,7 @@ INTERP(expr)
- `INTERP` is used to get the value that matches the specified time slice from a column. If no such value exists an interpolation value will be returned based on `FILL` parameter.
- The input data of `INTERP` is the value of the specified column and a `where` clause can be used to filter the original data. If no `where` condition is specified then all original data is the input.
+- `INTERP` must be used along with `RANGE`, `EVERY`, `FILL` keywords.
- The output time range of `INTERP` is specified by `RANGE(timestamp1,timestamp2)` parameter, with timestamp1<=timestamp2. timestamp1 is the starting point of the output time range and must be specified. timestamp2 is the ending point of the output time range and must be specified.
- The number of rows in the result set of `INTERP` is determined by the parameter `EVERY`. Starting from timestamp1, one interpolation is performed for every time interval specified `EVERY` parameter. The parameter `EVERY` must be an integer, with no quotes, with a time unit of: b(nanosecond), u(microsecond), a(millisecond)), s(second), m(minute), h(hour), d(day), or w(week). For example, `EVERY(500a)` will interpolate every 500 milliseconds.
- Interpolation is performed based on `FILL` parameter.
@@ -945,7 +946,7 @@ MIN(expr)
MODE(expr)
```
-**Description**:The value which has the highest frequency of occurrence. NULL is returned if there are multiple values which have highest frequency of occurrence.
+**Description**:The value which has the highest frequency of occurrence. One random value is returned if there are multiple values which have highest frequency of occurrence.
**Return value type**: Same as the input data
diff --git a/docs/en/12-taos-sql/21-node.md b/docs/en/12-taos-sql/21-node.md
index 81a7931cbfbc25d7be5f6cadd345631c4145bd7f..d9d06a00a4ab3d6b836239c1054db6c238ab16b5 100644
--- a/docs/en/12-taos-sql/21-node.md
+++ b/docs/en/12-taos-sql/21-node.md
@@ -64,6 +64,12 @@ dnode_option: {
The parameters that you can modify through this statement are the same as those located in the dnode configuration file. Modifications that you make through this statement take effect immediately, while modifications to the configuration file take effect when the dnode restarts.
+`value` is the value of the parameter, which needs to be in character format. For example, modify the log output level of dnode 1 to debug:
+
+```sql
+ALTER DNODE 1 'debugFlag' '143';
+```
+
## Add an Mnode
```sql
diff --git a/docs/en/14-reference/03-connector/05-go.mdx b/docs/en/14-reference/03-connector/05-go.mdx
index f00e635af9bdda737f752208f4b34c9ff634d075..a33b302a9201737bda83a0536ffd76c4594aa283 100644
--- a/docs/en/14-reference/03-connector/05-go.mdx
+++ b/docs/en/14-reference/03-connector/05-go.mdx
@@ -7,7 +7,6 @@ title: TDengine Go Connector
import Tabs from '@theme/Tabs';
import TabItem from '@theme/TabItem';
-import Preparition from "./_preparation.mdx"
import GoInsert from "../../07-develop/03-insert-data/_go_sql.mdx"
import GoInfluxLine from "../../07-develop/03-insert-data/_go_line.mdx"
import GoOpenTSDBTelnet from "../../07-develop/03-insert-data/_go_opts_telnet.mdx"
@@ -176,6 +175,37 @@ func main() {
}
```
+
+
+_taosRestful_ implements Go's `database/sql/driver` interface via `http client`. You can use the [`database/sql`](https://golang.org/pkg/database/sql/) interface by simply introducing the driver (driver-go minimum version 3.0.2).
+
+Use `taosWS` as `driverName` and use a correct [DSN](#DSN) as `dataSourceName` with the following parameters supported by the DSN.
+
+* `writeTimeout` The timeout to send data via WebSocket.
+* `readTimeout` The timeout to receive response data via WebSocket.
+
+For example:
+
+```go
+package main
+
+import (
+ "database/sql"
+ "fmt"
+
+ _ "github.com/taosdata/driver-go/v3/taosWS"
+)
+
+func main() {
+ var taosUri = "root:taosdata@ws(localhost:6041)/"
+ taos, err := sql.Open("taosWS", taosUri)
+ if err != nil {
+ fmt.Println("failed to connect TDengine, err:", err)
+ return
+ }
+}
+```
+
## Usage examples
@@ -331,7 +361,7 @@ Creates consumer group.
* `func (c *Consumer) Subscribe(topics []string) error`
-Subscribes to a topic.
+Subscribes to topics.
* `func (c *Consumer) Poll(timeout time.Duration) (*Result, error)`
@@ -409,6 +439,30 @@ Close consumer.
Closes the parameter binding.
+### Subscribe via WebSocket
+
+* `func NewConsumer(config *Config) (*Consumer, error)`
+
+ Creates consumer group.
+
+* `func (c *Consumer) Subscribe(topic []string) error`
+
+ Subscribes to topics.
+
+* `func (c *Consumer) Poll(timeout time.Duration) (*Result, error)`
+
+ Polling information.
+
+* `func (c *Consumer) Commit(messageID uint64) error`
+
+ Commit information.
+
+* `func (c *Consumer) Close() error`
+
+ Close consumer.
+
+For a complete example see [GitHub sample file](https://github.com/taosdata/driver-go/blob/3.0/examples/tmqoverws/main.go)
+
## API Reference
Full API see [driver-go documentation](https://pkg.go.dev/github.com/taosdata/driver-go/v3)
diff --git a/docs/en/14-reference/03-connector/_macos_install.mdx b/docs/en/14-reference/03-connector/_macos_install.mdx
index 8813d658698aa15633e811cd2e532fde12b5a4f6..effabbbebef6f2fbe19ece6d3361972a1d8c4491 100644
--- a/docs/en/14-reference/03-connector/_macos_install.mdx
+++ b/docs/en/14-reference/03-connector/_macos_install.mdx
@@ -2,7 +2,7 @@ import PkgListV3 from "/components/PkgListV3";
1. Download the client installation package
-
+
[All Downloads](../../releases/tdengine)
diff --git a/docs/en/14-reference/05-taosbenchmark.md b/docs/en/14-reference/05-taosbenchmark.md
index 6295d8553d54033ee08413696d45503416394f27..b114f92a41241bd21f5dc7ca5ea5709b8c2ffbd3 100644
--- a/docs/en/14-reference/05-taosbenchmark.md
+++ b/docs/en/14-reference/05-taosbenchmark.md
@@ -112,6 +112,9 @@ taosBenchmark -f
- **-u/--user ** :
User name to connect to the TDengine server. Default is root.
+- **-U/--supplement-insert ** :
+ Supplementally insert data without create database and table, optional, default is off.
+
- **-p/--password ** :
The default password to connect to the TDengine server is `taosdata`.
@@ -148,6 +151,9 @@ taosBenchmark -f
- **-l/--columns ** :
specify the number of columns in the super table. If both this parameter and `-b/--data-type` is set, the final result number of columns is the greater of the two. If the number specified by this parameter is greater than the number of columns specified by `-b/--data-type`, the unspecified column type defaults to INT, for example: `-l 5 -b float,double`, then the final column is `FLOAT,DOUBLE,INT,INT,INT`. If the number of columns specified is less than or equal to the number of columns specified by `-b/--data-type`, then the result is the column and type specified by `-b/--data-type`, e.g.: `-l 3 -b float,double,float,bigint`. The last column is `FLOAT,DOUBLE, FLOAT,BIGINT`.
+- **-L/--partial-col-num ** :
+ Specify first numbers of columns has data. Rest of columns' data are NULL. Default is all columns have data.
+
- **-A/--tag-type ** :
The tag column type of the super table. nchar and binary types can both set the length, for example:
diff --git a/docs/en/28-releases/01-tdengine.md b/docs/en/28-releases/01-tdengine.md
index 808a21474ebc843b2e6b6081507b64c510f79797..14096bd40011ef514b522fe29060c85a69ab0670 100644
--- a/docs/en/28-releases/01-tdengine.md
+++ b/docs/en/28-releases/01-tdengine.md
@@ -6,6 +6,10 @@ description: TDengine release history, Release Notes and download links.
import Release from "/components/ReleaseV3";
+## 3.0.1.5
+
+
+
## 3.0.1.4
diff --git a/docs/en/28-releases/02-tools.md b/docs/en/28-releases/02-tools.md
index 5d6693ae73dbe9348c6dcfad6f88ed1602acd957..a7446be4e39489e02e333f03c2c4f6f47503617a 100644
--- a/docs/en/28-releases/02-tools.md
+++ b/docs/en/28-releases/02-tools.md
@@ -6,6 +6,10 @@ description: taosTools release history, Release Notes, download links.
import Release from "/components/ReleaseV3";
+## 2.2.6
+
+
+
## 2.2.4
diff --git a/docs/zh/07-develop/07-tmq.mdx b/docs/zh/07-develop/07-tmq.mdx
index d9a35ab4eb545872a0f9a8e10e6e40dcf6ee4ec7..1f5a089aaa2a051e238eedc0315c37cad643b33f 100644
--- a/docs/zh/07-develop/07-tmq.mdx
+++ b/docs/zh/07-develop/07-tmq.mdx
@@ -247,7 +247,7 @@ CREATE TOPIC topic_name as subquery
- 该类型 TOPIC 一旦创建则订阅数据的结构确定。
- 被订阅或用于计算的列或标签不可被删除(`ALTER table DROP`)、修改(`ALTER table MODIFY`)。
-- 若发生表结构变更,新增的列不出现在结果中,若发生列删除则会报错。
+- 若发生表结构变更,新增的列不出现在结果中。
### 超级表订阅
@@ -269,10 +269,10 @@ CREATE TOPIC topic_name AS STABLE stb_name
语法:
```sql
-CREATE TOPIC topic_name [WITH META] AS DATABASE db_name;
+CREATE TOPIC topic_name AS DATABASE db_name;
```
-通过该语句可创建一个包含数据库所有表数据的订阅,`WITH META` 可选择将数据库结构变动信息加入到订阅消息流,TMQ 将消费当前数据库下所有表结构的变动,包括超级表的创建与删除,列添加、删除或修改,子表的创建、删除及 TAG 变动信息等等。消费者可通过 API 来判断具体的消息类型。这一点也是与 Kafka 不同的地方。
+通过该语句可创建一个包含数据库所有表数据的订阅
## 创建消费者 *consumer*
@@ -282,16 +282,16 @@ CREATE TOPIC topic_name [WITH META] AS DATABASE db_name;
| :----------------------------: | :-----: | -------------------------------------------------------- | ------------------------------------------- |
| `td.connect.ip` | string | 用于创建连接,同 `taos_connect` | |
| `td.connect.user` | string | 用于创建连接,同 `taos_connect` | |
-| `td.connect.pass` | string | 用于创建连接,同 `taos_connect` |
-| `td.connect.port` | integer | 用于创建连接,同 `taos_connect` |
+| `td.connect.pass` | string | 用于创建连接,同 `taos_connect` | |
+| `td.connect.port` | integer | 用于创建连接,同 `taos_connect` | |
| `group.id` | string | 消费组 ID,同一消费组共享消费进度 | **必填项**。最大长度:192。 |
| `client.id` | string | 客户端 ID | 最大长度:192。 |
-| `auto.offset.reset` | enum | 消费组订阅的初始位置 | 可选:`earliest`, `latest`, `none`(default) |
-| `enable.auto.commit` | boolean | 启用自动提交 | 合法值:`true`, `false`。 |
-| `auto.commit.interval.ms` | integer | 以毫秒为单位的自动提交时间间隔 |
-| `enable.heartbeat.background` | boolean | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | |
-| `experimental.snapshot.enable` | boolean | 从 WAL 开始消费,还是从 TSBS 开始消费 | |
-| `msg.with.table.name` | boolean | 是否允许从消息中解析表名 |
+| `auto.offset.reset` | enum | 消费组订阅的初始位置 | 可选:`earliest`(default), `latest`, `none` |
+| `enable.auto.commit` | boolean | 是否启用消费位点自动提交 | 合法值:`true`, `false`。 |
+| `auto.commit.interval.ms` | integer | 以毫秒为单位的消费记录自动提交消费位点时间间 | 默认 5000 m |
+| `enable.heartbeat.background` | boolean | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | 默认开启 |
+| `experimental.snapshot.enable` | boolean | 是否允许从 TSDB 消费数据 | 实验功能,默认关闭 |
+| `msg.with.table.name` | boolean | 是否允许从消息中解析表名, 不适用于列订阅(列订阅时可将 tbname 作为列写入 subquery 语句) | |
对于不同编程语言,其设置方式如下:
@@ -420,7 +420,18 @@ let mut consumer = tmq.build()?;
-Python 使用以下配置项创建一个 Consumer 实例。
+Python 语言下引入 `taos` 库的 `TaosConsumer` 类,创建一个 Consumer 示例:
+
+```python
+from taos.tmq import TaosConsumer
+
+# Syntax: `consumer = TaosConsumer(*topics, **args)`
+#
+# Example:
+consumer = TaosConsumer('topic1', 'topic2', td_connect_ip = "127.0.0.1", group_id = "local")
+```
+
+其中,元组类型参数被视为 *Topics*,字典类型参数用于以下订阅配置设置:
| 参数名称 | 类型 | 参数说明 | 备注 |
| :----------------------------: | :----: | -------------------------------------------------------- | ------------------------------------------- |
@@ -430,13 +441,13 @@ Python 使用以下配置项创建一个 Consumer 实例。
| `td_connect_port` | string | 用于创建连接,同 `taos_connect` | |
| `group_id` | string | 消费组 ID,同一消费组共享消费进度 | **必填项**。最大长度:192。 |
| `client_id` | string | 客户端 ID | 最大长度:192。 |
-| `auto_offset_reset` | string | 消费组订阅的初始位置 | 可选:`earliest`, `latest`, `none`(default) |
-| `enable_auto_commit` | string | 启用自动提交 | 合法值:`true`, `false`。 |
-| `auto_commit_interval_ms` | string | 以毫秒为单位的自动提交时间间隔 | |
+| `auto_offset_reset` | string | 消费组订阅的初始位置 | 可选:`earliest`(default), `latest`, `none` |
+| `enable_auto_commit` | string | 启用自动提交 | 合法值:`true`, `false`,默认为 true |
+| `auto_commit_interval_ms` | string | 以毫秒为单位的自动提交时间间隔 | 默认值:5000 ms |
| `enable_heartbeat_background` | string | 启用后台心跳,启用后即使长时间不 poll 消息也不会造成离线 | 合法值:`true`, `false` |
-| `experimental_snapshot_enable` | string | 从 WAL 开始消费,还是从 TSBS 开始消费 | 合法值:`true`, `false` |
-| `msg_with_table_name` | string | 是否允许从消息中解析表名 | 合法值:`true`, `false` |
-| `timeout` | int | 消费者拉去的超时时间 | |
+| `experimental_snapshot_enable` | string | 是否允许从 TSDB 消费数据 | 合法值:`true`, `false` |
+| `msg_with_table_name` | string | 是否允许从消息中解析表名,不适用于列订阅 | 合法值:`true`, `false` |
+| `timeout` | int | 消费者拉取数据的超时时间 | |
diff --git a/docs/zh/08-connector/20-go.mdx b/docs/zh/08-connector/20-go.mdx
index 515d1b030b24f36defb32ee9f59fde421eec8a9c..7a6058db3c60f876b850e78e8dcb76e1be6b4f15 100644
--- a/docs/zh/08-connector/20-go.mdx
+++ b/docs/zh/08-connector/20-go.mdx
@@ -177,6 +177,37 @@ func main() {
}
```
+
+
+_taosWS_ 通过 `WebSocket` 实现了 Go 的 `database/sql/driver` 接口。只需要引入驱动(driver-go 最低版本 3.0.2)就可以使用[`database/sql`](https://golang.org/pkg/database/sql/)的接口。
+
+使用 `taosWS` 作为 `driverName` 并且使用一个正确的 [DSN](#DSN) 作为 `dataSourceName`,DSN 支持的参数:
+
+* `writeTimeout` 通过 WebSocket 发送数据的超时时间。
+* `readTimeout` 通过 WebSocket 接收响应数据的超时时间。
+
+示例:
+
+```go
+package main
+
+import (
+ "database/sql"
+ "fmt"
+
+ _ "github.com/taosdata/driver-go/v3/taosWS"
+)
+
+func main() {
+ var taosUri = "root:taosdata@ws(localhost:6041)/"
+ taos, err := sql.Open("taosWS", taosUri)
+ if err != nil {
+ fmt.Println("failed to connect TDengine, err:", err)
+ return
+ }
+}
+```
+
## 使用示例
@@ -410,6 +441,30 @@ func main() {
结束参数绑定。
+### 通过 WebSocket 订阅
+
+* `func NewConsumer(config *Config) (*Consumer, error)`
+
+ 创建消费者。
+
+* `func (c *Consumer) Subscribe(topic []string) error`
+
+ 订阅主题。
+
+* `func (c *Consumer) Poll(timeout time.Duration) (*Result, error)`
+
+ 轮询消息。
+
+* `func (c *Consumer) Commit(messageID uint64) error`
+
+ 提交消息。
+
+* `func (c *Consumer) Close() error`
+
+ 关闭消费者。
+
+完整订阅示例参见 [GitHub 示例文件](https://github.com/taosdata/driver-go/blob/3.0/examples/tmqoverws/main.go)
+
## API 参考
全部 API 见 [driver-go 文档](https://pkg.go.dev/github.com/taosdata/driver-go/v3)
diff --git a/docs/zh/08-connector/_macos_install.mdx b/docs/zh/08-connector/_macos_install.mdx
index 4925ffabcd34c161369175a7c9e14fb831770416..081134dfee05951589216fea49f7a1ff85695905 100644
--- a/docs/zh/08-connector/_macos_install.mdx
+++ b/docs/zh/08-connector/_macos_install.mdx
@@ -2,7 +2,7 @@ import PkgListV3 from "/components/PkgListV3";
1. 下载客户端安装包
-
+
[所有下载](../../releases/tdengine)
diff --git a/docs/zh/12-taos-sql/05-insert.md b/docs/zh/12-taos-sql/05-insert.md
index 5e64827a8f13cd9fd5de1f27129ad4859ad3cd27..ccb8f40b21f7f0082f7bf420643e88a618d83f0e 100644
--- a/docs/zh/12-taos-sql/05-insert.md
+++ b/docs/zh/12-taos-sql/05-insert.md
@@ -109,11 +109,11 @@ INSERT INTO d21001 USING meters TAGS ('California.SanFrancisco', 2) VALUES ('202
## 插入来自文件的数据记录
-除了使用 VALUES 关键字插入一行或多行数据外,也可以把要写入的数据放在 CSV 文件中(英文逗号分隔、英文单引号括住每个值)供 SQL 指令读取。其中 CSV 文件无需表头。例如,如果 /tmp/csvfile.csv 文件的内容为:
+除了使用 VALUES 关键字插入一行或多行数据外,也可以把要写入的数据放在 CSV 文件中(英文逗号分隔、时间戳和字符串类型的值需要用英文单引号括住)供 SQL 指令读取。其中 CSV 文件无需表头。例如,如果 /tmp/csvfile.csv 文件的内容为:
```
-'2021-07-13 14:07:34.630', '10.2', '219', '0.32'
-'2021-07-13 14:07:35.779', '10.15', '217', '0.33'
+'2021-07-13 14:07:34.630', 10.2, 219, 0.32
+'2021-07-13 14:07:35.779', 10.15, 217, 0.33
```
那么通过如下指令可以把这个文件中的数据写入子表中:
diff --git a/docs/zh/12-taos-sql/10-function.md b/docs/zh/12-taos-sql/10-function.md
index 9346c3f76393cb4c6a36b129078c1c65e6869c28..68c7fe6f3082e06cd8539df32bbf5ac8bbce6cee 100644
--- a/docs/zh/12-taos-sql/10-function.md
+++ b/docs/zh/12-taos-sql/10-function.md
@@ -864,8 +864,9 @@ INTERP(expr)
- INTERP 用于在指定时间断面获取指定列的记录值,如果该时间断面不存在符合条件的行数据,那么会根据 FILL 参数的设定进行插值。
- INTERP 的输入数据为指定列的数据,可以通过条件语句(where 子句)来对原始列数据进行过滤,如果没有指定过滤条件则输入为全部数据。
+- INTERP 需要同时与 RANGE,EVERY 和 FILL 关键字一起使用。
- INTERP 的输出时间范围根据 RANGE(timestamp1,timestamp2)字段来指定,需满足 timestamp1<=timestamp2。其中 timestamp1(必选值)为输出时间范围的起始值,即如果 timestamp1 时刻符合插值条件则 timestamp1 为输出的第一条记录,timestamp2(必选值)为输出时间范围的结束值,即输出的最后一条记录的 timestamp 不能大于 timestamp2。
-- INTERP 根据 EVERY 字段来确定输出时间范围内的结果条数,即从 timestamp1 开始每隔固定长度的时间(EVERY 值)进行插值。如果没有指定 EVERY,则默认窗口大小为无穷大,即从 timestamp1 开始只有一个窗口。
+- INTERP 根据 EVERY 字段来确定输出时间范围内的结果条数,即从 timestamp1 开始每隔固定长度的时间(EVERY 值)进行插值。
- INTERP 根据 FILL 字段来决定在每个符合输出条件的时刻如何进行插值。
- INTERP 只能在一个时间序列内进行插值,因此当作用于超级表时必须跟 partition by tbname 一起使用。
- INTERP 可以与伪列 _irowts 一起使用,返回插值点所对应的时间戳(3.0.1.4版本以后支持)。
@@ -946,7 +947,7 @@ MIN(expr)
MODE(expr)
```
-**功能说明**:返回出现频率最高的值,若存在多个频率相同的最高值,输出NULL。
+**功能说明**:返回出现频率最高的值,若存在多个频率相同的最高值,则随机输出其中某个值。
**返回数据类型**:与输入数据类型一致。
diff --git a/docs/zh/12-taos-sql/21-node.md b/docs/zh/12-taos-sql/21-node.md
index ab6a49ea96ccaabb5a0f09a4a90d91835c2ef319..5b9279406ab6e96c57d59bcf7c4cd4193fb83058 100644
--- a/docs/zh/12-taos-sql/21-node.md
+++ b/docs/zh/12-taos-sql/21-node.md
@@ -65,6 +65,12 @@ dnode_option: {
上面语法中的这些可修改配置项其配置方式与 dnode 配置文件中的配置方式相同,区别是修改是动态的立即生效,且不需要重启 dnode。
+value 是参数的值,需要是字符格式。如修改 dnode 1 的日志输出级别为 debug:
+
+```sql
+ALTER DNODE 1 'debugFlag' '143';
+```
+
## 添加管理节点
```sql
diff --git a/docs/zh/14-reference/05-taosbenchmark.md b/docs/zh/14-reference/05-taosbenchmark.md
index e067c646b23db8080251ab7b51e693337436cfcc..afc050298f3be6c09fa0c09fbc3ba678cdd2e89d 100644
--- a/docs/zh/14-reference/05-taosbenchmark.md
+++ b/docs/zh/14-reference/05-taosbenchmark.md
@@ -112,6 +112,9 @@ taosBenchmark -f
- **-u/--user ** :
用于连接 TDengine 服务端的用户名,默认为 root 。
+- **-U/--supplement-insert ** :
+ 写入数据而不提前建数据库和表,默认关闭。
+
- **-p/--password ** :
用于连接 TDengine 服务端的密码,默认值为 taosdata。
@@ -148,6 +151,9 @@ taosBenchmark -f
- **-l/--columns ** :
超级表的数据列的总数量。如果同时设置了该参数和 `-b/--data-type`,则最后的结果列数为两者取大。如果本参数指定的数量大于 `-b/--data-type` 指定的列数,则未指定的列类型默认为 INT, 例如: `-l 5 -b float,double`, 那么最后的列为 `FLOAT,DOUBLE,INT,INT,INT`。如果 columns 指定的数量小于或等于 `-b/--data-type` 指定的列数,则结果为 `-b/--data-type` 指定的列和类型,例如: `-l 3 -b float,double,float,bigint`,那么最后的列为 `FLOAT,DOUBLE,FLOAT,BIGINT` 。
+- **-L/--partial-col-num **:
+ 指定某些列写入数据,其他列数据为 NULL。默认所有列都写入数据。
+
- **-A/--tag-type ** :
超级表的标签列类型。nchar 和 binary 类型可以同时设置长度,例如:
diff --git a/docs/zh/21-tdinternal/01-arch.md b/docs/zh/21-tdinternal/01-arch.md
index 782e4bcdd8bd3451ce2558567ed5faf2002327ce..6150f2e7579fdd64c562b0c18f9963a6eed20d9d 100644
--- a/docs/zh/21-tdinternal/01-arch.md
+++ b/docs/zh/21-tdinternal/01-arch.md
@@ -240,7 +240,7 @@ dataDir /mnt/data6 2 0
## 数据查询
-TDengine 提供了多种多样针对表和超级表的查询处理功能,除了常规的聚合查询之外,还提供针对时序数据的窗口查询、统计聚合等功能。TDengine 的查询处理需要客户端、vnode、qnode、mnode 节点协同完成,一个复杂的超级表聚合查询可能需要多个 vnode 和 qnode 节点公共分担查询和计算任务。
+TDengine 提供了多种多样针对表和超级表的查询处理功能,除了常规的聚合查询之外,还提供针对时序数据的窗口查询、统计聚合等功能。TDengine 的查询处理需要客户端、vnode、qnode、mnode 节点协同完成,一个复杂的超级表聚合查询可能需要多个 vnode 和 qnode 节点共同分担查询和计算任务。
### 查询基本流程
diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md
index 59e0d0f76174d567eeb5b597256a78ff098a351e..a5b35342508d2e9f234bdf9fb9daae48ee3e90c7 100644
--- a/docs/zh/28-releases/01-tdengine.md
+++ b/docs/zh/28-releases/01-tdengine.md
@@ -6,6 +6,10 @@ description: TDengine 发布历史、Release Notes 及下载链接
import Release from "/components/ReleaseV3";
+## 3.0.1.5
+
+
+
## 3.0.1.4
diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md
index 83ccdec3873bd6df23beaddd3408b3a3ede6559e..e86481435c1a9cc8c7c99fdae11464fcb4d87caf 100644
--- a/docs/zh/28-releases/02-tools.md
+++ b/docs/zh/28-releases/02-tools.md
@@ -6,6 +6,10 @@ description: taosTools 的发布历史、Release Notes 和下载链接
import Release from "/components/ReleaseV3";
+## 2.2.6
+
+
+
## 2.2.4
diff --git a/include/client/taos.h b/include/client/taos.h
index 270b647a77d18fd10e97954e435000799bdd6007..1182a9c2f7d4ff085d04ae72238644314d50e03b 100644
--- a/include/client/taos.h
+++ b/include/client/taos.h
@@ -198,6 +198,7 @@ DLL_EXPORT const void *taos_get_raw_block(TAOS_RES *res);
DLL_EXPORT int taos_load_table_info(TAOS *taos, const char *tableNameList);
DLL_EXPORT TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw(TAOS* taos, char* lines, int len, int32_t *totalRows, int protocol, int precision);
/* --------------------------TMQ INTERFACE------------------------------- */
diff --git a/include/common/systable.h b/include/common/systable.h
index 102465c8c2006d9026a22c67909008b03a7db3ac..8b29525db384744adac072a0cda3b07e4f66012c 100644
--- a/include/common/systable.h
+++ b/include/common/systable.h
@@ -27,7 +27,7 @@ extern "C" {
#define TSDB_INS_TABLE_MNODES "ins_mnodes"
#define TSDB_INS_TABLE_MODULES "ins_modules"
#define TSDB_INS_TABLE_QNODES "ins_qnodes"
-#define TSDB_INS_TABLE_BNODES "ins_bnodes"
+#define TSDB_INS_TABLE_BNODES "ins_bnodes" // no longer used
#define TSDB_INS_TABLE_SNODES "ins_snodes"
#define TSDB_INS_TABLE_CLUSTER "ins_cluster"
#define TSDB_INS_TABLE_DATABASES "ins_databases"
diff --git a/include/common/tcommon.h b/include/common/tcommon.h
index eaddf4e98398c7356cb98787e8c1b12e86fc6fa9..bb2519bea329bd21a185361c39c5660b8bb2b35c 100644
--- a/include/common/tcommon.h
+++ b/include/common/tcommon.h
@@ -44,12 +44,17 @@ enum {
)
// clang-format on
-typedef struct {
+typedef struct SWinKey {
uint64_t groupId;
TSKEY ts;
} SWinKey;
-static inline int sWinKeyCmprImpl(const void* pKey1, const void* pKey2) {
+typedef struct SSessionKey {
+ STimeWindow win;
+ uint64_t groupId;
+} SSessionKey;
+
+static inline int winKeyCmprImpl(const void* pKey1, const void* pKey2) {
SWinKey* pWin1 = (SWinKey*)pKey1;
SWinKey* pWin2 = (SWinKey*)pKey2;
@@ -69,7 +74,7 @@ static inline int sWinKeyCmprImpl(const void* pKey1, const void* pKey2) {
}
static inline int winKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) {
- return sWinKeyCmprImpl(pKey1, pKey2);
+ return winKeyCmprImpl(pKey1, pKey2);
}
typedef struct {
diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h
index a1fefa6902b60d3c25f67d34e6c4fd09ad741104..c0c3fc7fbc931246597a2d7c3fed8bc0febdf96f 100644
--- a/include/common/tdataformat.h
+++ b/include/common/tdataformat.h
@@ -234,8 +234,6 @@ struct STag {
// Imported since 3.0 and use bitmap to demonstrate None/Null/Norm, while use Null/Norm below 3.0 without of bitmap.
#define TD_SUPPORT_BITMAP
-#define TASSERT(x) ASSERT(x)
-
#define STR_TO_VARSTR(x, str) \
do { \
VarDataLenT __len = (VarDataLenT)strlen(str); \
diff --git a/include/common/tglobal.h b/include/common/tglobal.h
index fd0521af3b96933dec7064483578e06d00731ce8..4a2e14eb78a6d79aff12279c4170167ea6e80b0b 100644
--- a/include/common/tglobal.h
+++ b/include/common/tglobal.h
@@ -45,15 +45,6 @@ extern bool tsPrintAuth;
extern int64_t tsTickPerMin[3];
extern int32_t tsCountAlwaysReturnValue;
-// multi-process
-extern int32_t tsMultiProcess;
-extern int32_t tsMnodeShmSize;
-extern int32_t tsVnodeShmSize;
-extern int32_t tsQnodeShmSize;
-extern int32_t tsSnodeShmSize;
-extern int32_t tsBnodeShmSize;
-extern int32_t tsNumOfShmThreads;
-
// queue & threads
extern int32_t tsNumOfRpcThreads;
extern int32_t tsNumOfCommitThreads;
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index 5e2ca8896a9b304729de6548100446d30e4d0ec5..34090719327d3321eee668e0609196583e3cc5d0 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -95,7 +95,7 @@ typedef enum _mgmt_table {
TSDB_MGMT_TABLE_MODULE,
TSDB_MGMT_TABLE_QNODE,
TSDB_MGMT_TABLE_SNODE,
- TSDB_MGMT_TABLE_BNODE,
+ TSDB_MGMT_TABLE_BNODE, // no longer used
TSDB_MGMT_TABLE_CLUSTER,
TSDB_MGMT_TABLE_DB,
TSDB_MGMT_TABLE_FUNC,
@@ -343,6 +343,8 @@ typedef struct {
} SSchemaWrapper;
static FORCE_INLINE SSchemaWrapper* tCloneSSchemaWrapper(const SSchemaWrapper* pSchemaWrapper) {
+ if (pSchemaWrapper->pSchema == NULL) return NULL;
+
SSchemaWrapper* pSW = (SSchemaWrapper*)taosMemoryMalloc(sizeof(SSchemaWrapper));
if (pSW == NULL) return pSW;
pSW->nCols = pSchemaWrapper->nCols;
@@ -352,6 +354,7 @@ static FORCE_INLINE SSchemaWrapper* tCloneSSchemaWrapper(const SSchemaWrapper* p
taosMemoryFree(pSW);
return NULL;
}
+
memcpy(pSW->pSchema, pSchemaWrapper->pSchema, pSW->nCols * sizeof(SSchema));
return pSW;
}
@@ -1071,7 +1074,8 @@ typedef struct {
typedef struct {
int32_t vgId;
- int32_t syncState;
+ int8_t syncState;
+ int8_t syncRestore;
int64_t cacheUsage;
int64_t numOfTables;
int64_t numOfTimeSeries;
@@ -1086,7 +1090,8 @@ typedef struct {
} SVnodeLoad;
typedef struct {
- int32_t syncState;
+ int8_t syncState;
+ int8_t syncRestore;
} SMnodeLoad;
typedef struct {
@@ -1485,11 +1490,10 @@ int32_t tDeserializeSDCfgDnodeReq(void* buf, int32_t bufLen, SDCfgDnodeReq* pReq
typedef struct {
int32_t dnodeId;
} SMCreateMnodeReq, SMDropMnodeReq, SDDropMnodeReq, SMCreateQnodeReq, SMDropQnodeReq, SDCreateQnodeReq, SDDropQnodeReq,
- SMCreateSnodeReq, SMDropSnodeReq, SDCreateSnodeReq, SDDropSnodeReq, SMCreateBnodeReq, SMDropBnodeReq,
- SDCreateBnodeReq, SDDropBnodeReq;
+ SMCreateSnodeReq, SMDropSnodeReq, SDCreateSnodeReq, SDDropSnodeReq;
-int32_t tSerializeSCreateDropMQSBNodeReq(void* buf, int32_t bufLen, SMCreateQnodeReq* pReq);
-int32_t tDeserializeSCreateDropMQSBNodeReq(void* buf, int32_t bufLen, SMCreateQnodeReq* pReq);
+int32_t tSerializeSCreateDropMQSNodeReq(void* buf, int32_t bufLen, SMCreateQnodeReq* pReq);
+int32_t tDeserializeSCreateDropMQSNodeReq(void* buf, int32_t bufLen, SMCreateQnodeReq* pReq);
typedef struct {
int8_t replica;
diff --git a/include/common/tmsgcb.h b/include/common/tmsgcb.h
index c13c50e1616146e43d3a74dc4145a5e7c7ffccf3..b5b997dac0a18c6ca83e07d5f5c597004df8a913 100644
--- a/include/common/tmsgcb.h
+++ b/include/common/tmsgcb.h
@@ -34,6 +34,7 @@ typedef enum {
WRITE_QUEUE,
APPLY_QUEUE,
SYNC_QUEUE,
+ SYNC_CTRL_QUEUE,
STREAM_QUEUE,
QUEUE_MAX,
} EQueueType;
diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h
index 3f917ff0d1665d90de079dfc3eae884412ed0e7f..7b4e930485ccee575c0ad7e1b84e080610cfc169 100644
--- a/include/common/tmsgdef.h
+++ b/include/common/tmsgdef.h
@@ -74,8 +74,8 @@ enum {
TD_DEF_MSG_TYPE(TDMT_DND_DROP_QNODE, "dnode-drop-qnode", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_DND_CREATE_SNODE, "dnode-create-snode", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_DND_DROP_SNODE, "dnode-drop-snode", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_DND_CREATE_BNODE, "dnode-create-bnode", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_DND_DROP_BNODE, "dnode-drop-bnode", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_DND_CREATE_BNODE, "dnode-create-bnode", NULL, NULL) // no longer used
+ TD_DEF_MSG_TYPE(TDMT_DND_DROP_BNODE, "dnode-drop-bnode", NULL, NULL) // no longer used
TD_DEF_MSG_TYPE(TDMT_DND_CREATE_VNODE, "create-vnode", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_DND_DROP_VNODE, "drop-vnode", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_DND_SERVER_STATUS, "server-status", NULL, NULL)
@@ -107,9 +107,9 @@ enum {
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_SNODE, "create-snode", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_ALTER_SNODE, "alter-snode", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_DROP_SNODE, "drop-snode", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MND_CREATE_BNODE, "create-bnode", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MND_ALTER_BNODE, "alter-bnode", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MND_DROP_BNODE, "drop-bnode", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_MND_CREATE_BNODE, "create-bnode", NULL, NULL) // no longer used
+ TD_DEF_MSG_TYPE(TDMT_MND_ALTER_BNODE, "alter-bnode", NULL, NULL) // no longer used
+ TD_DEF_MSG_TYPE(TDMT_MND_DROP_BNODE, "drop-bnode", NULL, NULL) // no longer used
TD_DEF_MSG_TYPE(TDMT_MND_CREATE_DB, "create-db", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_DROP_DB, "drop-db", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_USE_DB, "use-db", NULL, NULL)
@@ -239,14 +239,6 @@ enum {
TD_DEF_MSG_TYPE(TDMT_STREAM_MAX_MSG, "stream-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_MON_MSG)
- TD_DEF_MSG_TYPE(TDMT_MON_MM_INFO, "monitor-minfo", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_VM_INFO, "monitor-vinfo", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_QM_INFO, "monitor-qinfo", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_SM_INFO, "monitor-sinfo", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_BM_INFO, "monitor-binfo", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_VM_LOAD, "monitor-vload", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_MM_LOAD, "monitor-mload", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MON_QM_LOAD, "monitor-qload", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MON_MAX_MSG, "monitor-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_SYNC_MSG)
diff --git a/include/common/trow.h b/include/common/trow.h
index 3680a82594c2fb679ae0b1d9afbb294f247b82d0..c5293fa45fde603c74da3416db4108e3c2f196aa 100644
--- a/include/common/trow.h
+++ b/include/common/trow.h
@@ -30,7 +30,7 @@
extern "C" {
#endif
-typedef struct {
+typedef struct STSRow {
TSKEY ts;
union {
uint32_t info;
@@ -255,7 +255,7 @@ static FORCE_INLINE void *tdGetBitmapAddrKv(STSRow *pRow, col_id_t nKvCols) {
void *tdGetBitmapAddr(STSRow *pRow, uint8_t rowType, uint32_t flen, col_id_t nKvCols);
int32_t tdSetBitmapValType(void *pBitmap, int16_t colIdx, TDRowValT valType, int8_t bitmapMode);
int32_t tdSetBitmapValTypeII(void *pBitmap, int16_t colIdx, TDRowValT valType);
-bool tdIsBitmapValTypeNorm(const void *pBitmap, int16_t idx, int8_t bitmapMode);
+// bool tdIsBitmapValTypeNorm(const void *pBitmap, int16_t idx, int8_t bitmapMode);
int32_t tdGetBitmapValType(const void *pBitmap, int16_t colIdx, TDRowValT *pValType, int8_t bitmapMode);
// ----------------- Tuple row structure(STpRow)
diff --git a/include/dnode/bnode/bnode.h b/include/dnode/bnode/bnode.h
deleted file mode 100644
index d5958d432bf494b82bccd608364a461302327a2d..0000000000000000000000000000000000000000
--- a/include/dnode/bnode/bnode.h
+++ /dev/null
@@ -1,77 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _TD_BNODE_H_
-#define _TD_BNODE_H_
-
-#include "tmsgcb.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* ------------------------ TYPES EXPOSED ------------------------ */
-typedef struct SBnode SBnode;
-
-typedef struct {
-#ifdef WINDOWS
- size_t avoidCompilationErrors;
-#endif
-} SBnodeLoad;
-
-typedef struct {
- SMsgCb msgCb;
-} SBnodeOpt;
-
-/* ------------------------ SBnode ------------------------ */
-/**
- * @brief Start one Bnode in Dnode.
- *
- * @param path Path of the bnode.
- * @param pOption Option of the bnode.
- * @return SBnode* The bnode object.
- */
-SBnode *bndOpen(const char *path, const SBnodeOpt *pOption);
-
-/**
- * @brief Stop Bnode in Dnode.
- *
- * @param pBnode The bnode object to close.
- */
-void bndClose(SBnode *pBnode);
-
-/**
- * @brief Get the statistical information of Bnode
- *
- * @param pBnode The bnode object.
- * @param pLoad Statistics of the bnode.
- * @return int32_t 0 for success, -1 for failure.
- */
-int32_t bndGetLoad(SBnode *pBnode, SBnodeLoad *pLoad);
-
-/**
- * @brief Process a query message.
- *
- * @param pBnode The bnode object.
- * @param pMsgs The array of SRpcMsg
- * @return int32_t 0 for success, -1 for failure
- */
-int32_t bndProcessWMsgs(SBnode *pBnode, SArray *pMsgs);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_TD_BNODE_H_*/
\ No newline at end of file
diff --git a/include/dnode/mgmt/dnode.h b/include/dnode/mgmt/dnode.h
index fe1692c50fc181c969b3dcea0dd751868666468d..82823e3f5762cf96479f740554e1520801969351 100644
--- a/include/dnode/mgmt/dnode.h
+++ b/include/dnode/mgmt/dnode.h
@@ -25,10 +25,9 @@ extern "C" {
/**
* @brief Initialize the dnode
*
- * @param rtype for internal debug usage, default is 0
* @return int32_t 0 for success and -1 for failure
*/
-int32_t dmInit(int8_t rtype);
+int32_t dmInit();
/**
* @brief Cleanup the dnode
diff --git a/include/libs/monitor/monitor.h b/include/libs/monitor/monitor.h
index 30254d61a9fd0b53509b89eab01d63422f5f835e..3dee59ab14a0ac780f18f731a5abb6dbe559b6fd 100644
--- a/include/libs/monitor/monitor.h
+++ b/include/libs/monitor/monitor.h
@@ -80,7 +80,6 @@ typedef struct {
int8_t has_mnode;
int8_t has_qnode;
int8_t has_snode;
- int8_t has_bnode;
SMonDiskDesc logdir;
SMonDiskDesc tempdir;
} SMonDnodeInfo;
@@ -162,10 +161,6 @@ typedef struct {
SMonLogs log;
} SMonMmInfo;
-int32_t tSerializeSMonMmInfo(void *buf, int32_t bufLen, SMonMmInfo *pInfo);
-int32_t tDeserializeSMonMmInfo(void *buf, int32_t bufLen, SMonMmInfo *pInfo);
-void tFreeSMonMmInfo(SMonMmInfo *pInfo);
-
typedef struct {
SArray *datadirs; // array of SMonDiskDesc
} SMonDiskInfo;
@@ -177,56 +172,31 @@ typedef struct {
SMonLogs log;
} SMonVmInfo;
-int32_t tSerializeSMonVmInfo(void *buf, int32_t bufLen, SMonVmInfo *pInfo);
-int32_t tDeserializeSMonVmInfo(void *buf, int32_t bufLen, SMonVmInfo *pInfo);
-void tFreeSMonVmInfo(SMonVmInfo *pInfo);
-
typedef struct {
SMonSysInfo sys;
SMonLogs log;
SQnodeLoad load;
} SMonQmInfo;
-int32_t tSerializeSMonQmInfo(void *buf, int32_t bufLen, SMonQmInfo *pInfo);
-int32_t tDeserializeSMonQmInfo(void *buf, int32_t bufLen, SMonQmInfo *pInfo);
-void tFreeSMonQmInfo(SMonQmInfo *pInfo);
-
typedef struct {
SMonSysInfo sys;
SMonLogs log;
} SMonSmInfo;
-int32_t tSerializeSMonSmInfo(void *buf, int32_t bufLen, SMonSmInfo *pInfo);
-int32_t tDeserializeSMonSmInfo(void *buf, int32_t bufLen, SMonSmInfo *pInfo);
-void tFreeSMonSmInfo(SMonSmInfo *pInfo);
typedef struct {
SMonSysInfo sys;
SMonLogs log;
} SMonBmInfo;
-int32_t tSerializeSMonBmInfo(void *buf, int32_t bufLen, SMonBmInfo *pInfo);
-int32_t tDeserializeSMonBmInfo(void *buf, int32_t bufLen, SMonBmInfo *pInfo);
-void tFreeSMonBmInfo(SMonBmInfo *pInfo);
-
typedef struct {
SArray *pVloads; // SVnodeLoad
} SMonVloadInfo;
-int32_t tSerializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo);
-int32_t tDeserializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo);
-void tFreeSMonVloadInfo(SMonVloadInfo *pInfo);
-
typedef struct {
int8_t isMnode;
SMnodeLoad load;
} SMonMloadInfo;
-int32_t tSerializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInfo);
-int32_t tDeserializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInfo);
-
-int32_t tSerializeSQnodeLoad(void *buf, int32_t bufLen, SQnodeLoad *pInfo);
-int32_t tDeserializeSQnodeLoad(void *buf, int32_t bufLen, SQnodeLoad *pInfo);
-
typedef struct {
const char *server;
uint16_t port;
@@ -246,6 +216,12 @@ void monSetSmInfo(SMonSmInfo *pInfo);
void monSetBmInfo(SMonBmInfo *pInfo);
void monSendReport();
+void tFreeSMonMmInfo(SMonMmInfo *pInfo);
+void tFreeSMonVmInfo(SMonVmInfo *pInfo);
+void tFreeSMonQmInfo(SMonQmInfo *pInfo);
+void tFreeSMonSmInfo(SMonSmInfo *pInfo);
+void tFreeSMonBmInfo(SMonBmInfo *pInfo);
+
#ifdef __cplusplus
}
#endif
diff --git a/include/libs/stream/streamState.h b/include/libs/stream/streamState.h
index 9445a0baa5302a7529e8d2d75ca89db6b96d6374..3d59a69deaa7e45fb4e68d663b7f60934462dec4 100644
--- a/include/libs/stream/streamState.h
+++ b/include/libs/stream/streamState.h
@@ -25,6 +25,8 @@ extern "C" {
typedef struct SStreamTask SStreamTask;
+typedef bool (*state_key_cmpr_fn)(void* pKey1, void* pKey2);
+
// incremental state storage
typedef struct {
SStreamTask* pOwner;
@@ -32,6 +34,7 @@ typedef struct {
TTB* pStateDb;
TTB* pFuncStateDb;
TTB* pFillStateDb; // todo refactor
+ TTB* pSessionStateDb;
TXN txn;
int32_t number;
} SStreamState;
@@ -57,6 +60,20 @@ int32_t streamStateDel(SStreamState* pState, const SWinKey* key);
int32_t streamStateClear(SStreamState* pState);
void streamStateSetNumber(SStreamState* pState, int32_t number);
+int32_t streamStateSessionAddIfNotExist(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen);
+int32_t streamStateSessionPut(SStreamState* pState, const SSessionKey* key, const void* value, int32_t vLen);
+int32_t streamStateSessionGet(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen);
+int32_t streamStateSessionDel(SStreamState* pState, const SSessionKey* key);
+int32_t streamStateSessionClear(SStreamState* pState);
+int32_t streamStateSessionGetKVByCur(SStreamStateCur* pCur, SSessionKey* pKey, const void** pVal, int32_t* pVLen);
+int32_t streamStateStateAddIfNotExist(SStreamState* pState, SSessionKey* key, char* pKeyData, int32_t keyDataLen,
+ state_key_cmpr_fn fn, void** pVal, int32_t* pVLen);
+int32_t streamStateSessionGetKey(SStreamState* pState, const SSessionKey* key, SSessionKey* curKey);
+
+SStreamStateCur* streamStateSessionSeekKeyNext(SStreamState* pState, const SSessionKey* key);
+SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, const SSessionKey* key);
+SStreamStateCur* streamStateSessionGetCur(SStreamState* pState, const SSessionKey* key);
+
int32_t streamStateFillPut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen);
int32_t streamStateFillGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
int32_t streamStateFillDel(SStreamState* pState, const SWinKey* key);
diff --git a/include/libs/sync/syncTools.h b/include/libs/sync/syncTools.h
index de2271554d2b9166ec240ea07e91dea9d017ef92..b2c743831a225a6c1ae1f9363ca0f93b014ddfb6 100644
--- a/include/libs/sync/syncTools.h
+++ b/include/libs/sync/syncTools.h
@@ -695,6 +695,9 @@ int32_t syncNodeOnAppendEntriesReplySnapshot2Cb(SSyncNode* ths, SyncAppendEntrie
int32_t syncNodeOnSnapshotSendCb(SSyncNode* ths, SyncSnapshotSend* pMsg);
int32_t syncNodeOnSnapshotRspCb(SSyncNode* ths, SyncSnapshotRsp* pMsg);
+int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg);
+int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg);
+
// -----------------------------------------
typedef int32_t (*FpOnPingCb)(SSyncNode* ths, SyncPing* pMsg);
typedef int32_t (*FpOnPingReplyCb)(SSyncNode* ths, SyncPingReply* pMsg);
diff --git a/include/os/os.h b/include/os/os.h
index 28a3ebee81228380c35f5d400235641ae6df2b6f..e780611c41235b159c119780ee60cd0a0eb5593f 100644
--- a/include/os/os.h
+++ b/include/os/os.h
@@ -94,10 +94,8 @@ extern "C" {
#include "osLz4.h"
#include "osMath.h"
#include "osMemory.h"
-#include "osProc.h"
#include "osRand.h"
#include "osSemaphore.h"
-#include "osShm.h"
#include "osSignal.h"
#include "osSleep.h"
#include "osSocket.h"
diff --git a/include/os/osEnv.h b/include/os/osEnv.h
index d4e94d6173a813e44e68355bb6a0ead964823ba1..c1fdc9e404c35dba510dafb76e2130ecbcc6ae05 100644
--- a/include/os/osEnv.h
+++ b/include/os/osEnv.h
@@ -60,6 +60,7 @@ bool osTempSpaceSufficient();
void osSetTimezone(const char *timezone);
void osSetSystemLocale(const char *inLocale, const char *inCharSet);
+void osSetProcPath(int32_t argc, char **argv);
#ifdef __cplusplus
}
diff --git a/include/os/osProc.h b/include/os/osProc.h
deleted file mode 100644
index f09b695ef4e55f0ab9bb9b0113cc1befff58daa0..0000000000000000000000000000000000000000
--- a/include/os/osProc.h
+++ /dev/null
@@ -1,34 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _TD_OS_PROC_H_
-#define _TD_OS_PROC_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int32_t taosNewProc(char **args);
-void taosWaitProc(int32_t pid);
-void taosKillProc(int32_t pid);
-bool taosProcExist(int32_t pid);
-void taosSetProcName(int32_t argc, char **argv, const char *name);
-void taosSetProcPath(int32_t argc, char **argv);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_TD_OS_PROC_H_*/
diff --git a/include/os/osShm.h b/include/os/osShm.h
deleted file mode 100644
index 87efb1ab16e8978294b2a286d8c1093d406c82a8..0000000000000000000000000000000000000000
--- a/include/os/osShm.h
+++ /dev/null
@@ -1,37 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _TD_OS_SHM_H_
-#define _TD_OS_SHM_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct {
- int32_t id;
- int32_t size;
- void *ptr;
-} SShm;
-
-int32_t taosCreateShm(SShm *pShm, int32_t key, int32_t shmsize);
-void taosDropShm(SShm *pShm);
-int32_t taosAttachShm(SShm *pShm);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_TD_OS_SHM_H_*/
diff --git a/include/util/tdef.h b/include/util/tdef.h
index e4ebfc380d9ab8dd39e732655c6fd1cf9f8e4303..936fbdf0d58656f61c2f1019d70f71e604636363 100644
--- a/include/util/tdef.h
+++ b/include/util/tdef.h
@@ -473,7 +473,6 @@ enum {
#define QNODE_HANDLE -1
#define SNODE_HANDLE -2
#define VNODE_HANDLE -3
-#define BNODE_HANDLE -4
#define CLIENT_HANDLE -5
#define TSDB_CONFIG_OPTION_LEN 32
@@ -488,6 +487,7 @@ enum {
#define MAX_NUM_STR_SIZE 40
#define MAX_META_MSG_IN_BATCH 1048576
+#define MAX_META_BATCH_RSP_SIZE (1 * 1048576 * 1024)
#ifdef __cplusplus
}
diff --git a/include/util/tutil.h b/include/util/tutil.h
index 2a3f0dcb020666fc3b80b8d4f3d304dc13c8544c..de963001557519b7dd9355187122535c77b3f17a 100644
--- a/include/util/tutil.h
+++ b/include/util/tutil.h
@@ -83,6 +83,12 @@ static FORCE_INLINE int32_t taosGetTbHashVal(const char *tbname, int32_t tblen,
}
}
+#define TSDB_CHECK_CODE(CODE, LINO, LABEL) \
+ if (CODE) { \
+ LINO = __LINE__; \
+ goto LABEL; \
+ }
+
#ifdef __cplusplus
}
#endif
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index df717bda23abb8a887afd80e9cfe03a9e7a7d121..f2223346050a4a723ad28aa93317f418685b2c7d 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -186,8 +186,8 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
STscObj* pTscObj = (*pRequest)->pTscObj;
if (taosHashPut(pTscObj->pRequests, &(*pRequest)->self, sizeof((*pRequest)->self), &(*pRequest)->self,
sizeof((*pRequest)->self))) {
- tscError("%" PRIx64 " failed to add to request container, reqId:0x%" PRIu64 ", conn:%" PRIx64 ", %s", (*pRequest)->self,
- (*pRequest)->requestId, pTscObj->id, sql);
+ tscError("%" PRId64 " failed to add to request container, reqId:0x%" PRIx64 ", conn:%" PRId64 ", %s",
+ (*pRequest)->self, (*pRequest)->requestId, pTscObj->id, sql);
taosMemoryFree(param);
destroyRequest(*pRequest);
@@ -199,9 +199,8 @@ int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param,
if (tsQueryUseNodeAllocator && !qIsInsertValuesSql((*pRequest)->sqlstr, (*pRequest)->sqlLen)) {
if (TSDB_CODE_SUCCESS !=
nodesCreateAllocator((*pRequest)->requestId, tsQueryNodeChunkSize, &((*pRequest)->allocatorRefId))) {
- tscError("%d failed to create node allocator, reqId:0x%" PRIx64 ", conn:%d, %s", (*pRequest)->self,
- (*pRequest)->requestId, pTscObj->id, sql);
-
+ tscError("%" PRId64 " failed to create node allocator, reqId:0x%" PRIx64 ", conn:%" PRId64 ", %s",
+ (*pRequest)->self, (*pRequest)->requestId, pTscObj->id, sql);
destroyRequest(*pRequest);
*pRequest = NULL;
return TSDB_CODE_TSC_OUT_OF_MEMORY;
@@ -370,8 +369,8 @@ int32_t updateQnodeList(SAppInstInfo* pInfo, SArray* pNodeList) {
if (pNodeList) {
pInfo->pQnodeList = taosArrayDup(pNodeList);
taosArraySort(pInfo->pQnodeList, compareQueryNodeLoad);
- tscDebug("QnodeList updated in cluster 0x%" PRIx64 ", num:%d", pInfo->clusterId,
- (int)taosArrayGetSize(pInfo->pQnodeList));
+ tscDebug("QnodeList updated in cluster 0x%" PRIx64 ", num:%ld", pInfo->clusterId,
+ taosArrayGetSize(pInfo->pQnodeList));
}
taosThreadMutexUnlock(&pInfo->qnodeMutex);
@@ -955,7 +954,12 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue
switch (pQuery->execMode) {
case QUERY_EXEC_MODE_LOCAL:
if (!pRequest->validateOnly) {
- code = execLocalCmd(pRequest, pQuery);
+ if (NULL == pQuery->pRoot) {
+ terrno = TSDB_CODE_INVALID_PARA;
+ code = terrno;
+ } else {
+ code = execLocalCmd(pRequest, pQuery);
+ }
}
break;
case QUERY_EXEC_MODE_RPC:
@@ -997,7 +1001,7 @@ SRequestObj* launchQueryImpl(SRequestObj* pRequest, SQuery* pQuery, bool keepQue
handleQueryExecRsp(pRequest);
- if (NULL != pRequest && TSDB_CODE_SUCCESS != code) {
+ if (TSDB_CODE_SUCCESS != code) {
pRequest->code = terrno;
}
@@ -1035,39 +1039,39 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
SSqlCallbackWrapper* pWrapper) {
pRequest->type = pQuery->msgType;
- SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad));
+ SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad));
SPlanContext cxt = {.queryId = pRequest->requestId,
- .acctId = pRequest->pTscObj->acctId,
- .mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp),
- .pAstRoot = pQuery->pRoot,
- .showRewrite = pQuery->showRewrite,
- .pMsg = pRequest->msgBuf,
- .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE,
- .pUser = pRequest->pTscObj->user,
- .sysInfo = pRequest->pTscObj->sysInfo,
- .allocatorId = pRequest->allocatorRefId};
-
- SAppInstInfo* pAppInfo = getAppInfo(pRequest);
- SQueryPlan* pDag = NULL;
+ .acctId = pRequest->pTscObj->acctId,
+ .mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp),
+ .pAstRoot = pQuery->pRoot,
+ .showRewrite = pQuery->showRewrite,
+ .pMsg = pRequest->msgBuf,
+ .msgLen = ERROR_MSG_BUF_DEFAULT_SIZE,
+ .pUser = pRequest->pTscObj->user,
+ .sysInfo = pRequest->pTscObj->sysInfo,
+ .allocatorId = pRequest->allocatorRefId};
+
+ SAppInstInfo* pAppInfo = getAppInfo(pRequest);
+ SQueryPlan* pDag = NULL;
int64_t st = taosGetTimestampUs();
int32_t code = qCreateQueryPlan(&cxt, &pDag, pMnodeList);
- if (code) {
- tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code),
- pRequest->requestId);
- } else {
- pRequest->body.subplanNum = pDag->numOfSubplans;
- }
+ if (code) {
+ tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code),
+ pRequest->requestId);
+ } else {
+ pRequest->body.subplanNum = pDag->numOfSubplans;
+ }
- pRequest->metric.planEnd = taosGetTimestampUs();
+ pRequest->metric.planEnd = taosGetTimestampUs();
if (code == TSDB_CODE_SUCCESS) {
tscDebug("0x%" PRIx64 " create query plan success, elapsed time:%.2f ms, 0x%" PRIx64, pRequest->self,
- (pRequest->metric.planEnd - st)/1000.0, pRequest->requestId);
+ (pRequest->metric.planEnd - st) / 1000.0, pRequest->requestId);
}
- if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
- SArray* pNodeList = NULL;
- buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
+ if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
+ SArray* pNodeList = NULL;
+ buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter,
.requestId = pRequest->requestId,
@@ -2254,7 +2258,10 @@ void syncQueryFn(void* param, void* res, int32_t code) {
void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly) {
if (sql == NULL || NULL == fp) {
terrno = TSDB_CODE_INVALID_PARA;
- fp(param, NULL, terrno);
+ if (fp) {
+ fp(param, NULL, terrno);
+ }
+
return;
}
diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c
index 6126817ececa647dacd220031163464ae57d854e..286fb853734ff6721871cf9679087d85bd8e881f 100644
--- a/source/client/src/clientMain.c
+++ b/source/client/src/clientMain.c
@@ -944,7 +944,6 @@ void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) {
if (pResultInfo->completed) {
// it is a local executed query, no need to do async fetch
if (QUERY_EXEC_MODE_LOCAL == pRequest->body.execMode) {
- ASSERT(pResultInfo->numOfRows >= 0);
if (pResultInfo->localResultFetched) {
pResultInfo->numOfRows = 0;
pResultInfo->current = 0;
diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c
index cdf977bea328a0bdf35789f24edb0addce46e087..945562ef36499e5bdfe34ed2e375b78fa7b0cea7 100644
--- a/source/client/src/clientMsgHandler.c
+++ b/source/client/src/clientMsgHandler.c
@@ -194,6 +194,10 @@ int32_t processUseDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
SUseDbRsp usedbRsp = {0};
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
+ if(strlen(usedbRsp.db) == 0){
+ return TSDB_CODE_MND_DB_NOT_EXIST;
+ }
+
SName name = {0};
tNameFromString(&name, usedbRsp.db, T_NAME_ACCT | T_NAME_DB);
@@ -288,8 +292,10 @@ int32_t processDropDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
tDeserializeSDropDbRsp(pMsg->pData, pMsg->len, &dropdbRsp);
struct SCatalog* pCatalog = NULL;
- catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog);
- catalogRemoveDB(pCatalog, dropdbRsp.db, dropdbRsp.uid);
+ int32_t code = catalogGetHandle(pRequest->pTscObj->pAppInfo->clusterId, &pCatalog);
+ if (TSDB_CODE_SUCCESS == code) {
+ catalogRemoveDB(pCatalog, dropdbRsp.db, dropdbRsp.uid);
+ }
}
taosMemoryFree(pMsg->pData);
@@ -393,6 +399,7 @@ static int32_t buildShowVariablesRsp(SArray* pVars, SRetrieveTableRsp** pRsp) {
size_t rspSize = sizeof(SRetrieveTableRsp) + blockGetEncodeSize(pBlock);
*pRsp = taosMemoryCalloc(1, rspSize);
if (NULL == *pRsp) {
+ blockDataDestroy(pBlock);
return TSDB_CODE_OUT_OF_MEMORY;
}
diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c
index 1dc319be94e8ab880aaf87259f8b7166a900e871..dfcd8c4a7901e510d2caf70d7b807e732eeb802c 100644
--- a/source/client/src/clientRawBlockWrite.c
+++ b/source/client/src/clientRawBlockWrite.c
@@ -1071,8 +1071,8 @@ static int32_t taosDeleteData(TAOS* taos, void* meta, int32_t metaLen) {
// getTbName(req.tableFName);
char sql[256] = {0};
- sprintf(sql, "delete from `%s` where `%s` >= %" PRId64 " and `%s` <= %" PRId64, req.tableFName, req.tsColName,
- req.skey, req.tsColName, req.ekey);
+ snprintf(sql, sizeof(sql), "delete from `%s` where `%s` >= %" PRId64 " and `%s` <= %" PRId64, req.tableFName,
+ req.tsColName, req.skey, req.tsColName, req.ekey);
printf("delete sql:%s\n", sql);
TAOS_RES* res = taos_query(taos, sql);
diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c
index 5c37822222ece2e83db0d958074d7e36913a35ea..2c48eae59f7ba412759c6aa94b75ba8171dc1b12 100644
--- a/source/client/src/clientSml.c
+++ b/source/client/src/clientSml.c
@@ -28,8 +28,8 @@
#define QUOTE '"'
#define SLASH '\\'
-#define JUMP_SPACE(sql) \
- while (*sql != '\0') { \
+#define JUMP_SPACE(sql, sqlEnd) \
+ while (sql < sqlEnd) { \
if (*sql == SPACE) \
sql++; \
else \
@@ -917,16 +917,17 @@ static int32_t smlParseValue(SSmlKv *pVal, SSmlMsgBuf *msg) {
return TSDB_CODE_TSC_INVALID_VALUE;
}
-static int32_t smlParseInfluxString(const char *sql, SSmlLineInfo *elements, SSmlMsgBuf *msg) {
+static int32_t smlParseInfluxString(const char *sql, const char *sqlEnd, SSmlLineInfo *elements, SSmlMsgBuf *msg) {
if (!sql) return TSDB_CODE_SML_INVALID_DATA;
- JUMP_SPACE(sql)
+ JUMP_SPACE(sql, sqlEnd)
if (*sql == COMMA) return TSDB_CODE_SML_INVALID_DATA;
elements->measure = sql;
// parse measure
- while (*sql != '\0') {
+ while (sql < sqlEnd) {
if ((sql != elements->measure) && IS_SLASH_LETTER(sql)) {
- MOVE_FORWARD_ONE(sql, strlen(sql) + 1);
+ MOVE_FORWARD_ONE(sql, sqlEnd - sql);
+ sqlEnd--;
continue;
}
if (IS_COMMA(sql)) {
@@ -950,7 +951,7 @@ static int32_t smlParseInfluxString(const char *sql, SSmlLineInfo *elements, SSm
} else {
if (*sql == COMMA) sql++;
elements->tags = sql;
- while (*sql != '\0') {
+ while (sql < sqlEnd) {
if (IS_SPACE(sql)) {
break;
}
@@ -961,10 +962,10 @@ static int32_t smlParseInfluxString(const char *sql, SSmlLineInfo *elements, SSm
elements->measureTagsLen = sql - elements->measure;
// parse cols
- JUMP_SPACE(sql)
+ JUMP_SPACE(sql, sqlEnd)
elements->cols = sql;
bool isInQuote = false;
- while (*sql != '\0') {
+ while (sql < sqlEnd) {
if (IS_QUOTE(sql)) {
isInQuote = !isInQuote;
}
@@ -984,10 +985,10 @@ static int32_t smlParseInfluxString(const char *sql, SSmlLineInfo *elements, SSm
}
// parse timestamp
- JUMP_SPACE(sql)
+ JUMP_SPACE(sql, sqlEnd)
elements->timestamp = sql;
- while (*sql != '\0') {
- if (*sql == SPACE) {
+ while (sql < sqlEnd) {
+ if (isspace(*sql)) {
break;
}
sql++;
@@ -997,8 +998,8 @@ static int32_t smlParseInfluxString(const char *sql, SSmlLineInfo *elements, SSm
return TSDB_CODE_SUCCESS;
}
-static void smlParseTelnetElement(const char **sql, const char **data, int32_t *len) {
- while (**sql != '\0') {
+static void smlParseTelnetElement(const char **sql, const char *sqlEnd, const char **data, int32_t *len) {
+ while (*sql < sqlEnd) {
if (**sql != SPACE && !(*data)) {
*data = *sql;
} else if (**sql == SPACE && *data) {
@@ -1009,20 +1010,20 @@ static void smlParseTelnetElement(const char **sql, const char **data, int32_t *
}
}
-static int32_t smlParseTelnetTags(const char *data, SArray *cols, char *childTableName, SHashObj *dumplicateKey,
+static int32_t smlParseTelnetTags(const char *data, const char *sqlEnd, SArray *cols, char *childTableName, SHashObj *dumplicateKey,
SSmlMsgBuf *msg) {
if(!cols) return TSDB_CODE_OUT_OF_MEMORY;
const char *sql = data;
size_t childTableNameLen = strlen(tsSmlChildTableName);
- while (*sql != '\0') {
- JUMP_SPACE(sql)
+ while (sql < sqlEnd) {
+ JUMP_SPACE(sql, sqlEnd)
if (*sql == '\0') break;
const char *key = sql;
int32_t keyLen = 0;
// parse key
- while (*sql != '\0') {
+ while (sql < sqlEnd) {
if (*sql == SPACE) {
smlBuildInvalidDataMsg(msg, "invalid data", sql);
return TSDB_CODE_SML_INVALID_DATA;
@@ -1047,7 +1048,7 @@ static int32_t smlParseTelnetTags(const char *data, SArray *cols, char *childTab
// parse value
const char *value = sql;
int32_t valueLen = 0;
- while (*sql != '\0') {
+ while (sql < sqlEnd) {
// parse value
if (*sql == SPACE) {
break;
@@ -1092,11 +1093,11 @@ static int32_t smlParseTelnetTags(const char *data, SArray *cols, char *childTab
}
// format: =[ =]
-static int32_t smlParseTelnetString(SSmlHandle *info, const char *sql, SSmlTableInfo *tinfo, SArray *cols) {
+static int32_t smlParseTelnetString(SSmlHandle *info, const char *sql, const char *sqlEnd, SSmlTableInfo *tinfo, SArray *cols) {
if (!sql) return TSDB_CODE_SML_INVALID_DATA;
// parse metric
- smlParseTelnetElement(&sql, &tinfo->sTableName, &tinfo->sTableNameLen);
+ smlParseTelnetElement(&sql, sqlEnd, &tinfo->sTableName, &tinfo->sTableNameLen);
if (!(tinfo->sTableName) || IS_INVALID_TABLE_LEN(tinfo->sTableNameLen)) {
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", sql);
return TSDB_CODE_TSC_INVALID_TABLE_ID_LENGTH;
@@ -1105,7 +1106,7 @@ static int32_t smlParseTelnetString(SSmlHandle *info, const char *sql, SSmlTable
// parse timestamp
const char *timestamp = NULL;
int32_t tLen = 0;
- smlParseTelnetElement(&sql, ×tamp, &tLen);
+ smlParseTelnetElement(&sql, sqlEnd, ×tamp, &tLen);
if (!timestamp || tLen == 0) {
smlBuildInvalidDataMsg(&info->msgBuf, "invalid timestamp", sql);
return TSDB_CODE_SML_INVALID_DATA;
@@ -1120,7 +1121,7 @@ static int32_t smlParseTelnetString(SSmlHandle *info, const char *sql, SSmlTable
// parse value
const char *value = NULL;
int32_t valueLen = 0;
- smlParseTelnetElement(&sql, &value, &valueLen);
+ smlParseTelnetElement(&sql, sqlEnd, &value, &valueLen);
if (!value || valueLen == 0) {
smlBuildInvalidDataMsg(&info->msgBuf, "invalid value", sql);
return TSDB_CODE_TSC_INVALID_VALUE;
@@ -1138,7 +1139,7 @@ static int32_t smlParseTelnetString(SSmlHandle *info, const char *sql, SSmlTable
}
// parse tags
- ret = smlParseTelnetTags(sql, tinfo->tags, tinfo->childTableName, info->dumplicateKey, &info->msgBuf);
+ ret = smlParseTelnetTags(sql, sqlEnd, tinfo->tags, tinfo->childTableName, info->dumplicateKey, &info->msgBuf);
if (ret != TSDB_CODE_SUCCESS) {
smlBuildInvalidDataMsg(&info->msgBuf, "invalid data", sql);
return ret;
@@ -1371,8 +1372,14 @@ static int32_t smlKvTimeArrayCompare(const void *key1, const void *key2) {
static int32_t smlKvTimeHashCompare(const void *key1, const void *key2) {
SHashObj *s1 = *(SHashObj **)key1;
SHashObj *s2 = *(SHashObj **)key2;
- SSmlKv *kv1 = *(SSmlKv **)taosHashGet(s1, TS, TS_LEN);
- SSmlKv *kv2 = *(SSmlKv **)taosHashGet(s2, TS, TS_LEN);
+ SSmlKv **kv1pp = (SSmlKv **)taosHashGet(s1, TS, TS_LEN);
+ SSmlKv **kv2pp = (SSmlKv **)taosHashGet(s2, TS, TS_LEN);
+ if(!kv1pp || !kv2pp){
+ uError("smlKvTimeHashCompare kv is null");
+ return -1;
+ }
+ SSmlKv *kv1 = *kv1pp;
+ SSmlKv *kv2 = *kv2pp;
if(!kv1 || kv1->type != TSDB_DATA_TYPE_TIMESTAMP){
uError("smlKvTimeHashCompare kv1");
return -1;
@@ -2073,11 +2080,11 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo *
}
/************* TSDB_SML_JSON_PROTOCOL function end **************/
-static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql) {
+static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql, const int len) {
SSmlLineInfo elements = {0};
uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql:%s, hello", info->id, sql);
- int ret = smlParseInfluxString(sql, &elements, &info->msgBuf);
+ int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf);
if (ret != TSDB_CODE_SUCCESS) {
uError("SML:0x%" PRIx64 " smlParseInfluxLine failed", info->id);
return ret;
@@ -2184,7 +2191,7 @@ static int32_t smlParseInfluxLine(SSmlHandle *info, const char *sql) {
return TSDB_CODE_SUCCESS;
}
-static int32_t smlParseTelnetLine(SSmlHandle *info, void *data) {
+static int32_t smlParseTelnetLine(SSmlHandle *info, void *data, const int len) {
int ret = TSDB_CODE_SUCCESS;
SSmlTableInfo *tinfo = smlBuildTableInfo();
if (!tinfo) {
@@ -2198,7 +2205,7 @@ static int32_t smlParseTelnetLine(SSmlHandle *info, void *data) {
}
if (info->protocol == TSDB_SML_TELNET_PROTOCOL) {
- ret = smlParseTelnetString(info, (const char *)data, tinfo, cols);
+ ret = smlParseTelnetString(info, (const char *)data, (char*)data + len, tinfo, cols);
} else if (info->protocol == TSDB_SML_JSON_PROTOCOL) {
ret = smlParseJSONString(info, (cJSON *)data, tinfo, cols);
} else {
@@ -2289,7 +2296,7 @@ static int32_t smlParseJSON(SSmlHandle *info, char *payload) {
for (int32_t i = 0; i < payloadNum; ++i) {
cJSON *dataPoint = (payloadNum == 1 && cJSON_IsObject(root)) ? root : cJSON_GetArrayItem(root, i);
- ret = smlParseTelnetLine(info, dataPoint);
+ ret = smlParseTelnetLine(info, dataPoint, -1);
if (ret != TSDB_CODE_SUCCESS) {
uError("SML:0x%" PRIx64 " Invalid JSON Payload", info->id);
goto end;
@@ -2378,10 +2385,14 @@ static void smlPrintStatisticInfo(SSmlHandle *info) {
info->cost.endTime - info->cost.insertRpcTime, info->cost.endTime - info->cost.parseTime);
}
-static int32_t smlParseLine(SSmlHandle *info, char *lines[], int numLines) {
+static int32_t smlParseLine(SSmlHandle *info, char *lines[], char* rawLine, char* rawLineEnd, int numLines) {
int32_t code = TSDB_CODE_SUCCESS;
if (info->protocol == TSDB_SML_JSON_PROTOCOL) {
- code = smlParseJSON(info, *lines);
+ if(lines){
+ code = smlParseJSON(info, *lines);
+ }else if(rawLine){
+ code = smlParseJSON(info, rawLine);
+ }
if (code != TSDB_CODE_SUCCESS) {
uError("SML:0x%" PRIx64 " smlParseJSON failed:%s", info->id, *lines);
return code;
@@ -2390,28 +2401,46 @@ static int32_t smlParseLine(SSmlHandle *info, char *lines[], int numLines) {
}
for (int32_t i = 0; i < numLines; ++i) {
+ char *tmp = NULL;
+ int len = 0;
+ if(lines){
+ tmp = lines[i];
+ len = strlen(tmp);
+ }else if(rawLine){
+ tmp = rawLine;
+ while(rawLine < rawLineEnd){
+ if(*(rawLine++) == '\n'){
+ break;
+ }
+ len++;
+ }
+ if(info->protocol == TSDB_SML_LINE_PROTOCOL && tmp[0] == '#'){ // this line is comment
+ continue;
+ }
+ }
+
if (info->protocol == TSDB_SML_LINE_PROTOCOL) {
- code = smlParseInfluxLine(info, lines[i]);
+ code = smlParseInfluxLine(info, tmp, len);
} else if (info->protocol == TSDB_SML_TELNET_PROTOCOL) {
- code = smlParseTelnetLine(info, lines[i]);
+ code = smlParseTelnetLine(info, tmp, len);
} else {
ASSERT(0);
}
if (code != TSDB_CODE_SUCCESS) {
- uError("SML:0x%" PRIx64 " smlParseLine failed. line %d : %s", info->id, i, lines[i]);
+ uError("SML:0x%" PRIx64 " smlParseLine failed. line %d : %s", info->id, i, tmp);
return code;
}
}
return code;
}
-static int smlProcess(SSmlHandle *info, char *lines[], int numLines) {
+static int smlProcess(SSmlHandle *info, char *lines[], char* rawLine, char* rawLineEnd, int numLines) {
int32_t code = TSDB_CODE_SUCCESS;
int32_t retryNum = 0;
info->cost.parseTime = taosGetTimestampUs();
- code = smlParseLine(info, lines, numLines);
+ code = smlParseLine(info, lines, rawLine, rawLineEnd, numLines);
if (code != 0) {
uError("SML:0x%" PRIx64 " smlParseLine error : %s", info->id, tstrerror(code));
return code;
@@ -2504,39 +2533,8 @@ static void smlInsertCallback(void *param, void *res, int32_t code) {
smlDestroyInfo(info);
}
-/**
- * taos_schemaless_insert() parse and insert data points into database according to
- * different protocol.
- *
- * @param $lines input array may contain multiple lines, each line indicates a data point.
- * If protocol=2 is used input array should contain single JSON
- * string(e.g. char *lines[] = {"$JSON_string"}). If need to insert
- * multiple data points in JSON format, should include them in $JSON_string
- * as a JSON array.
- * @param $numLines indicates how many data points in $lines.
- * If protocol = 2 is used this param will be ignored as $lines should
- * contain single JSON string.
- * @param $protocol indicates which protocol to use for parsing:
- * 0 - influxDB line protocol
- * 1 - OpenTSDB telnet line protocol
- * 2 - OpenTSDB JSON format protocol
- * @return return zero for successful insertion. Otherwise return none-zero error code of
- * failure reason.
- *
- */
-
-TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) {
- if (NULL == taos) {
- terrno = TSDB_CODE_TSC_DISCONNECTED;
- return NULL;
- }
-
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT);
- if (!request) {
- uError("SML:taos_schemaless_insert error request is null");
- return NULL;
- }
+TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char *rawLine, char *rawLineEnd, int numLines, int protocol, int precision) {
int batchs = 0;
STscObj *pTscObj = request->pTscObj;
@@ -2560,12 +2558,6 @@ TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int pr
goto end;
}
- if (!lines) {
- request->code = TSDB_CODE_SML_INVALID_DATA;
- smlBuildInvalidDataMsg(&msg, "lines is null", NULL);
- goto end;
- }
-
if (protocol < TSDB_SML_LINE_PROTOCOL || protocol > TSDB_SML_JSON_PROTOCOL) {
request->code = TSDB_CODE_SML_INVALID_PROTOCOL_TYPE;
smlBuildInvalidDataMsg(&msg, "protocol invalidate", NULL);
@@ -2616,15 +2608,28 @@ TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int pr
info->affectedRows = perBatch;
info->pRequest->body.queryFp = smlInsertCallback;
info->pRequest->body.param = info;
- int32_t code = smlProcess(info, lines, perBatch);
- lines += perBatch;
+ int32_t code = smlProcess(info, lines, rawLine, rawLineEnd, perBatch);
+ if(lines){
+ lines += perBatch;
+ }
+ if(rawLine){
+ int num = 0;
+ while(rawLine < rawLineEnd){
+ if(*(rawLine++) == '\n'){
+ num++;
+ }
+ if(num == perBatch){
+ break;
+ }
+ }
+ }
if (code != TSDB_CODE_SUCCESS) {
info->pRequest->body.queryFp(info, req, code);
}
}
tsem_wait(¶ms.sem);
-end:
+ end:
taosThreadSpinDestroy(¶ms.lock);
tsem_destroy(¶ms.sem);
// ((STscObj *)taos)->schemalessType = 0;
@@ -2632,3 +2637,80 @@ end:
uDebug("resultend:%s", request->msgBuf);
return (TAOS_RES *)request;
}
+
+/**
+ * taos_schemaless_insert() parse and insert data points into database according to
+ * different protocol.
+ *
+ * @param $lines input array may contain multiple lines, each line indicates a data point.
+ * If protocol=2 is used input array should contain single JSON
+ * string(e.g. char *lines[] = {"$JSON_string"}). If need to insert
+ * multiple data points in JSON format, should include them in $JSON_string
+ * as a JSON array.
+ * @param $numLines indicates how many data points in $lines.
+ * If protocol = 2 is used this param will be ignored as $lines should
+ * contain single JSON string.
+ * @param $protocol indicates which protocol to use for parsing:
+ * 0 - influxDB line protocol
+ * 1 - OpenTSDB telnet line protocol
+ * 2 - OpenTSDB JSON format protocol
+ * @return return zero for successful insertion. Otherwise return none-zero error code of
+ * failure reason.
+ *
+ */
+
+TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) {
+ if (NULL == taos) {
+ terrno = TSDB_CODE_TSC_DISCONNECTED;
+ return NULL;
+ }
+
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT);
+ if (!request) {
+ uError("SML:taos_schemaless_insert error request is null");
+ return NULL;
+ }
+
+ if (!lines) {
+ SSmlMsgBuf msg = {ERROR_MSG_BUF_DEFAULT_SIZE, request->msgBuf};
+ request->code = TSDB_CODE_SML_INVALID_DATA;
+ smlBuildInvalidDataMsg(&msg, "lines is null", NULL);
+ return (TAOS_RES *)request;
+ }
+
+ return taos_schemaless_insert_inner(request, lines, NULL, NULL, numLines, protocol, precision);
+}
+
+TAOS_RES *taos_schemaless_insert_raw(TAOS* taos, char* lines, int len, int32_t *totalRows, int protocol, int precision){
+ if (NULL == taos) {
+ terrno = TSDB_CODE_TSC_DISCONNECTED;
+ return NULL;
+ }
+
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT);
+ if (!request) {
+ uError("SML:taos_schemaless_insert error request is null");
+ return NULL;
+ }
+
+ if (!lines || len <= 0) {
+ SSmlMsgBuf msg = {ERROR_MSG_BUF_DEFAULT_SIZE, request->msgBuf};
+ request->code = TSDB_CODE_SML_INVALID_DATA;
+ smlBuildInvalidDataMsg(&msg, "lines is null", NULL);
+ return (TAOS_RES *)request;
+ }
+
+ int numLines = 0;
+ *totalRows = 0;
+ char *tmp = lines;
+ for(int i = 0; i < len; i++){
+ if(lines[i] == '\n' || i == len - 1){
+ numLines++;
+ if(tmp[0] != '#' || protocol != TSDB_SML_LINE_PROTOCOL){ //ignore comment
+ (*totalRows)++;
+ }
+ tmp = lines + i + 1;
+ }
+ }
+ return taos_schemaless_insert_inner(request, NULL, lines, lines + len, numLines, protocol, precision);
+}
diff --git a/source/client/src/clientStmt.c b/source/client/src/clientStmt.c
index bf3fd00f1445aef67a7f8336271976dc539035b6..81d0d616c995bdb71ba73fff8387a1ea67bc7c8b 100644
--- a/source/client/src/clientStmt.c
+++ b/source/client/src/clientStmt.c
@@ -152,7 +152,7 @@ int32_t stmtUpdateBindInfo(TAOS_STMT* stmt, STableMeta* pTableMeta, void* tags,
pStmt->bInfo.tbType = pTableMeta->tableType;
pStmt->bInfo.boundTags = tags;
pStmt->bInfo.tagsCached = false;
- strcpy(pStmt->bInfo.stbFName, sTableName);
+ tstrncpy(pStmt->bInfo.stbFName, sTableName, sizeof(pStmt->bInfo.stbFName));
return TSDB_CODE_SUCCESS;
}
diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c
index 8f94d88b1c9fd74d8151bb8489e4d7c203d3ff8d..0b7b80649e758e084b26c9f173038efd271723cf 100644
--- a/source/client/src/clientTmq.c
+++ b/source/client/src/clientTmq.c
@@ -210,6 +210,8 @@ typedef struct {
typedef struct {
SMqCommitCbParamSet* params;
STqOffset* pOffset;
+ /*char topicName[TSDB_TOPIC_FNAME_LEN];*/
+ /*int32_t vgId;*/
} SMqCommitCbParam;
tmq_conf_t* tmq_conf_new() {
@@ -407,6 +409,14 @@ int32_t tmqCommitDone(SMqCommitCbParamSet* pParamSet) {
return 0;
}
+static void tmqCommitRspCountDown(SMqCommitCbParamSet* pParamSet) {
+ int32_t waitingRspNum = atomic_sub_fetch_32(&pParamSet->waitingRspNum, 1);
+ ASSERT(waitingRspNum >= 0);
+ if (waitingRspNum == 0) {
+ tmqCommitDone(pParamSet);
+ }
+}
+
int32_t tmqCommitCb(void* param, SDataBuf* pBuf, int32_t code) {
SMqCommitCbParam* pParam = (SMqCommitCbParam*)param;
SMqCommitCbParamSet* pParamSet = (SMqCommitCbParamSet*)pParam->params;
@@ -420,18 +430,13 @@ int32_t tmqCommitCb(void* param, SDataBuf* pBuf, int32_t code) {
#endif
taosMemoryFree(pParam->pOffset);
- if (pBuf->pData) taosMemoryFree(pBuf->pData);
+ taosMemoryFree(pBuf->pData);
/*tscDebug("receive offset commit cb of %s on vgId:%d, offset is %" PRId64, pParam->pOffset->subKey, pParam->->vgId,
* pOffset->version);*/
- // count down waiting rsp
- int32_t waitingRspNum = atomic_sub_fetch_32(&pParamSet->waitingRspNum, 1);
- ASSERT(waitingRspNum >= 0);
+ tmqCommitRspCountDown(pParamSet);
- if (waitingRspNum == 0) {
- tmqCommitDone(pParamSet);
- }
return 0;
}
@@ -455,7 +460,10 @@ static int32_t tmqSendCommitReq(tmq_t* tmq, SMqClientVg* pVg, SMqClientTopic* pT
return -1;
}
void* buf = taosMemoryCalloc(1, sizeof(SMsgHead) + len);
- if (buf == NULL) return -1;
+ if (buf == NULL) {
+ taosMemoryFree(pOffset);
+ return -1;
+ }
((SMsgHead*)buf)->vgId = htonl(pVg->vgId);
void* abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
@@ -468,6 +476,7 @@ static int32_t tmqSendCommitReq(tmq_t* tmq, SMqClientVg* pVg, SMqClientTopic* pT
// build param
SMqCommitCbParam* pParam = taosMemoryCalloc(1, sizeof(SMqCommitCbParam));
if (pParam == NULL) {
+ taosMemoryFree(pOffset);
taosMemoryFree(buf);
return -1;
}
@@ -477,6 +486,7 @@ static int32_t tmqSendCommitReq(tmq_t* tmq, SMqClientVg* pVg, SMqClientTopic* pT
// build send info
SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (pMsgSendInfo == NULL) {
+ taosMemoryFree(pOffset);
taosMemoryFree(buf);
taosMemoryFree(pParam);
return -1;
@@ -586,14 +596,10 @@ FAIL:
return 0;
}
-int32_t tmqCommitInner(tmq_t* tmq, const TAOS_RES* msg, int8_t automatic, int8_t async, tmq_commit_cb* userCb,
- void* userParam) {
+static int32_t tmqCommitConsumerImpl(tmq_t* tmq, int8_t automatic, int8_t async, tmq_commit_cb* userCb,
+ void* userParam) {
int32_t code = -1;
- if (msg != NULL) {
- return tmqCommitMsgImpl(tmq, msg, async, userCb, userParam);
- }
-
SMqCommitCbParamSet* pParamSet = taosMemoryCalloc(1, sizeof(SMqCommitCbParamSet));
if (pParamSet == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
@@ -632,7 +638,7 @@ int32_t tmqCommitInner(tmq_t* tmq, const TAOS_RES* msg, int8_t automatic, int8_t
pVg->vgId);
if (pVg->currentOffset.type > 0 && !tOffsetEqual(&pVg->currentOffset, &pVg->committedOffset)) {
- tscDebug("consumer: %ld, vg:%d, current %ld, committed %ld", tmq->consumerId, pVg->vgId,
+ tscDebug("consumer: %" PRId64 ", vg:%d, current %" PRId64 ", committed %" PRId64 "", tmq->consumerId, pVg->vgId,
pVg->currentOffset.version, pVg->committedOffset.version);
if (tmqSendCommitReq(tmq, pVg, pTopic, pParamSet) < 0) {
continue;
@@ -641,33 +647,37 @@ int32_t tmqCommitInner(tmq_t* tmq, const TAOS_RES* msg, int8_t automatic, int8_t
}
}
+ // no request is sent
if (pParamSet->totalRspNum == 0) {
tsem_destroy(&pParamSet->rspSem);
taosMemoryFree(pParamSet);
return 0;
}
- int32_t waitingRspNum = atomic_sub_fetch_32(&pParamSet->waitingRspNum, 1);
- ASSERT(waitingRspNum >= 0);
- if (waitingRspNum == 0) {
- tmqCommitDone(pParamSet);
- }
+ // count down since waiting rsp num init as 1
+ tmqCommitRspCountDown(pParamSet);
if (!async) {
tsem_wait(&pParamSet->rspSem);
code = pParamSet->rspErr;
tsem_destroy(&pParamSet->rspSem);
taosMemoryFree(pParamSet);
- }
-
#if 0
- if (!async) {
taosArrayDestroyP(pParamSet->successfulOffsets, taosMemoryFree);
taosArrayDestroyP(pParamSet->failedOffsets, taosMemoryFree);
- }
#endif
+ }
- return 0;
+ return code;
+}
+
+int32_t tmqCommitInner(tmq_t* tmq, const TAOS_RES* msg, int8_t automatic, int8_t async, tmq_commit_cb* userCb,
+ void* userParam) {
+ if (msg) {
+ return tmqCommitMsgImpl(tmq, msg, async, userCb, userParam);
+ } else {
+ return tmqCommitConsumerImpl(tmq, automatic, async, userCb, userParam);
+ }
}
void tmqAssignAskEpTask(void* param, void* tmrId) {
@@ -969,10 +979,11 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
const SArray* container = &topic_list->container;
int32_t sz = taosArrayGetSize(container);
void* buf = NULL;
+ SMsgSendInfo* sendInfo = NULL;
SCMSubscribeReq req = {0};
int32_t code = -1;
- tscDebug("call tmq subscribe, consumer: %ld, topic num %d", tmq->consumerId, sz);
+ tscDebug("call tmq subscribe, consumer: %" PRId64 ", topic num %d", tmq->consumerId, sz);
req.consumerId = tmq->consumerId;
tstrncpy(req.clientId, tmq->clientId, 256);
@@ -980,6 +991,8 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
req.topicNames = taosArrayInit(sz, sizeof(void*));
if (req.topicNames == NULL) goto FAIL;
+ tscDebug("call tmq subscribe, consumer: %" PRId64 ", topic num %d", tmq->consumerId, sz);
+
for (int32_t i = 0; i < sz; i++) {
char* topic = taosArrayGetP(container, i);
@@ -1004,7 +1017,7 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
void* abuf = buf;
tSerializeSCMSubscribeReq(&abuf, &req);
- SMsgSendInfo* sendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
+ sendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (sendInfo == NULL) goto FAIL;
SMqSubscribeCbParam param = {
@@ -1034,6 +1047,7 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
// avoid double free if msg is sent
buf = NULL;
+ sendInfo = NULL;
tsem_wait(¶m.rspSem);
tsem_destroy(¶m.rspSem);
@@ -1066,8 +1080,9 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
code = 0;
FAIL:
- if (req.topicNames != NULL) taosArrayDestroyP(req.topicNames, taosMemoryFree);
+ taosArrayDestroyP(req.topicNames, taosMemoryFree);
taosMemoryFree(buf);
+ taosMemoryFree(sendInfo);
return code;
}
@@ -1601,7 +1616,11 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
if (rspWrapper == NULL) {
taosReadAllQitems(tmq->mqueue, tmq->qall);
taosGetQitem(tmq->qall, (void**)&rspWrapper);
- if (rspWrapper == NULL) return NULL;
+
+ if (rspWrapper == NULL) {
+ tscDebug("consumer %" PRId64 " mqueue empty", tmq->consumerId);
+ return NULL;
+ }
}
if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__END_RSP) {
@@ -1610,7 +1629,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
return NULL;
} else if (rspWrapper->tmqRspType == TMQ_MSG_TYPE__POLL_RSP) {
SMqPollRspWrapper* pollRspWrapper = (SMqPollRspWrapper*)rspWrapper;
- tscDebug("consumer %ld actual process poll rsp", tmq->consumerId);
+ tscDebug("consumer %" PRId64 " actual process poll rsp", tmq->consumerId);
/*atomic_sub_fetch_32(&tmq->readyRequest, 1);*/
int32_t consumerEpoch = atomic_load_32(&tmq->epoch);
if (pollRspWrapper->dataRsp.head.epoch == consumerEpoch) {
@@ -1699,6 +1718,8 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
void* rspObj;
int64_t startTime = taosGetTimestampMs();
+ tscDebug("consumer:%" PRId64 ", start poll at %" PRId64, tmq->consumerId, startTime);
+
#if 0
tmqHandleAllDelayedTask(tmq);
tmqPollImpl(tmq, timeout);
@@ -1733,15 +1754,18 @@ TAOS_RES* tmq_consumer_poll(tmq_t* tmq, int64_t timeout) {
rspObj = tmqHandleAllRsp(tmq, timeout, false);
if (rspObj) {
+ tscDebug("consumer:%" PRId64 ", return rsp", tmq->consumerId);
return (TAOS_RES*)rspObj;
} else if (terrno == TSDB_CODE_TQ_NO_COMMITTED_OFFSET) {
+ tscDebug("consumer:%" PRId64 ", return null since no committed offset", tmq->consumerId);
return NULL;
}
if (timeout != -1) {
int64_t endTime = taosGetTimestampMs();
int64_t leftTime = endTime - startTime;
if (leftTime > timeout) {
- tscDebug("consumer:%" PRId64 ", (epoch %d) timeout, no rsp", tmq->consumerId, tmq->epoch);
+ tscDebug("consumer:%" PRId64 ", (epoch %d) timeout, no rsp, start time %" PRId64 ", end time %" PRId64,
+ tmq->consumerId, tmq->epoch, startTime, endTime);
return NULL;
}
tsem_timewait(&tmq->rspSem, leftTime * 1000);
diff --git a/source/client/test/smlTest.cpp b/source/client/test/smlTest.cpp
index ab4442eca7abda74f851aedf2926cdb3f64ec7a7..54778e87a788190c55fafc0e4d0db732677d795d 100644
--- a/source/client/test/smlTest.cpp
+++ b/source/client/test/smlTest.cpp
@@ -44,7 +44,7 @@ TEST(testCase, smlParseInfluxString_Test) {
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);
memcpy(sql, tmp, strlen(tmp) + 1);
- int ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ int ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_EQ(ret, 0);
ASSERT_EQ(elements.measure, sql);
ASSERT_EQ(elements.measureLen, strlen(",st"));
@@ -63,14 +63,14 @@ TEST(testCase, smlParseInfluxString_Test) {
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);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_NE(ret, 0);
// case 3 false
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);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_EQ(ret, 0);
ASSERT_EQ(elements.cols, sql + elements.measureTagsLen + 1);
ASSERT_EQ(elements.colsLen, strlen("t1=3,t2=4,t3=t3"));
@@ -79,7 +79,7 @@ TEST(testCase, smlParseInfluxString_Test) {
tmp = "st, c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000";
memcpy(sql, tmp, strlen(tmp) + 1);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_EQ(ret, 0);
ASSERT_EQ(elements.measure, sql);
ASSERT_EQ(elements.measureLen, strlen("st"));
@@ -98,7 +98,7 @@ TEST(testCase, smlParseInfluxString_Test) {
tmp = " st c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 1626006833639000000 ";
memcpy(sql, tmp, strlen(tmp) + 1);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_EQ(ret, 0);
ASSERT_EQ(elements.measure, sql + 1);
ASSERT_EQ(elements.measureLen, strlen("st"));
@@ -116,21 +116,21 @@ TEST(testCase, smlParseInfluxString_Test) {
tmp = " st c1=3i64,c3=\"passit hello,c1=2\",c2=false,c4=4f64 ";
memcpy(sql, tmp, strlen(tmp) + 1);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_EQ(ret, 0);
// case 7
tmp = " st , ";
memcpy(sql, tmp, strlen(tmp) + 1);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_EQ(ret, 0);
// case 8 false
tmp = ", st , ";
memcpy(sql, tmp, strlen(tmp) + 1);
memset(&elements, 0, sizeof(SSmlLineInfo));
- ret = smlParseInfluxString(sql, &elements, &msgBuf);
+ ret = smlParseInfluxString(sql, sql + strlen(sql), &elements, &msgBuf);
ASSERT_NE(ret, 0);
taosMemoryFree(sql);
}
@@ -542,7 +542,7 @@ TEST(testCase, smlParseTelnetLine_error_Test) {
"sys.procs.running 1479496100 42 host= web01",
};
for (int i = 0; i < sizeof(sql) / sizeof(sql[0]); i++) {
- int ret = smlParseTelnetLine(info, (void *)sql[i]);
+ int ret = smlParseTelnetLine(info, (void *)sql[i], strlen(sql[i]));
ASSERT_NE(ret, 0);
}
@@ -561,7 +561,7 @@ TEST(testCase, smlParseTelnetLine_diff_type_Test) {
int ret = TSDB_CODE_SUCCESS;
for (int i = 0; i < sizeof(sql) / sizeof(sql[0]); i++) {
- ret = smlParseTelnetLine(info, (void *)sql[i]);
+ ret = smlParseTelnetLine(info, (void *)sql[i], strlen(sql[i]));
if (ret != TSDB_CODE_SUCCESS) break;
}
ASSERT_NE(ret, 0);
@@ -617,7 +617,7 @@ TEST(testCase, smlParseTelnetLine_json_error_Test) {
int ret = TSDB_CODE_SUCCESS;
for (int i = 0; i < sizeof(sql) / sizeof(sql[0]); i++) {
- ret = smlParseTelnetLine(info, (void *)sql[i]);
+ ret = smlParseTelnetLine(info, (void *)sql[i], strlen(sql[i]));
ASSERT_NE(ret, 0);
}
@@ -653,7 +653,7 @@ TEST(testCase, smlParseTelnetLine_diff_json_type1_Test) {
int ret = TSDB_CODE_SUCCESS;
for (int i = 0; i < sizeof(sql) / sizeof(sql[0]); i++) {
- ret = smlParseTelnetLine(info, (void *)sql[i]);
+ ret = smlParseTelnetLine(info, (void *)sql[i], strlen(sql[i]));
if (ret != TSDB_CODE_SUCCESS) break;
}
ASSERT_NE(ret, 0);
@@ -688,7 +688,7 @@ TEST(testCase, smlParseTelnetLine_diff_json_type2_Test) {
};
int ret = TSDB_CODE_SUCCESS;
for (int i = 0; i < sizeof(sql) / sizeof(sql[0]); i++) {
- ret = smlParseTelnetLine(info, (void *)sql[i]);
+ ret = smlParseTelnetLine(info, (void *)sql[i], strlen(sql[i]));
if (ret != TSDB_CODE_SUCCESS) break;
}
ASSERT_NE(ret, 0);
@@ -1002,7 +1002,7 @@ TEST(testCase, sml_col_4096_Test) {
int ret = TSDB_CODE_SUCCESS;
for (int i = 0; i < sizeof(sql) / sizeof(sql[0]); i++) {
- ret = smlParseInfluxLine(info, sql[i]);
+ ret = smlParseInfluxLine(info, sql[i], strlen(sql[i]));
if (ret != TSDB_CODE_SUCCESS) break;
}
ASSERT_NE(ret, 0);
diff --git a/source/common/src/systable.c b/source/common/src/systable.c
index a45f7b2913938ae9884940f45631d0f7c49ed1e8..28a4732abd98d52976cc75a0d7e26320f7aeb5a2 100644
--- a/source/common/src/systable.c
+++ b/source/common/src/systable.c
@@ -62,12 +62,6 @@ static const SSysDbTableSchema snodesSchema[] = {
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = true},
};
-static const SSysDbTableSchema bnodesSchema[] = {
- {.name = "id", .bytes = 4, .type = TSDB_DATA_TYPE_INT, .sysInfo = true},
- {.name = "endpoint", .bytes = TSDB_EP_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
- {.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = true},
-};
-
static const SSysDbTableSchema clusterSchema[] = {
{.name = "id", .bytes = 8, .type = TSDB_DATA_TYPE_BIGINT, .sysInfo = true},
{.name = "name", .bytes = TSDB_CLUSTER_ID_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = true},
@@ -277,7 +271,6 @@ static const SSysTableMeta infosMeta[] = {
{TSDB_INS_TABLE_MODULES, modulesSchema, tListLen(modulesSchema), true},
{TSDB_INS_TABLE_QNODES, qnodesSchema, tListLen(qnodesSchema), true},
// {TSDB_INS_TABLE_SNODES, snodesSchema, tListLen(snodesSchema)},
- // {TSDB_INS_TABLE_BNODES, bnodesSchema, tListLen(bnodesSchema)},
{TSDB_INS_TABLE_CLUSTER, clusterSchema, tListLen(clusterSchema), true},
{TSDB_INS_TABLE_DATABASES, userDBSchema, tListLen(userDBSchema), false},
{TSDB_INS_TABLE_FUNCTIONS, userFuncSchema, tListLen(userFuncSchema), false},
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index 1028a899b68853cfdd5b29042237ee5a1a73b992..fda1a0529014bd8aaf996f2488422de1051b968a 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -1836,10 +1836,10 @@ void blockDebugShowDataBlocks(const SArray* dataBlocks, const char* flag) {
printf(" %15u |", *(uint32_t*)var);
break;
case TSDB_DATA_TYPE_BIGINT:
- printf(" %15ld |", *(int64_t*)var);
+ printf(" %15" PRId64 " |", *(int64_t*)var);
break;
case TSDB_DATA_TYPE_UBIGINT:
- printf(" %15lu |", *(uint64_t*)var);
+ printf(" %15" PRIu64 " |", *(uint64_t*)var);
break;
case TSDB_DATA_TYPE_FLOAT:
printf(" %15f |", *(float*)var);
@@ -1858,7 +1858,7 @@ void blockDebugShowDataBlocks(const SArray* dataBlocks, const char* flag) {
char* pData = colDataGetVarData(pColInfoData, j);
int32_t dataSize = TMIN(sizeof(pBuf), varDataLen(pData));
memset(pBuf, 0, dataSize);
- taosUcs4ToMbs((TdUcs4*)varDataVal(pData), dataSize, pBuf);
+ (void)taosUcs4ToMbs((TdUcs4*)varDataVal(pData), dataSize, pBuf);
printf(" %15s |", pBuf);
} break;
default:
@@ -1892,12 +1892,13 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
for (int32_t k = 0; k < colNum; k++) {
SColumnInfoData* pColInfoData = taosArrayGet(pDataBlock->pDataBlock, k);
- void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
if (colDataIsNull(pColInfoData, rows, j, NULL) || !pColInfoData->pData) {
len += snprintf(dumpBuf + len, size - len, " %15s |", "NULL");
if (len >= size - 1) return dumpBuf;
continue;
}
+
+ void* var = colDataGetData(pColInfoData, j);
switch (pColInfoData->info.type) {
case TSDB_DATA_TYPE_TIMESTAMP:
memset(pBuf, 0, sizeof(pBuf));
@@ -1914,11 +1915,11 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
if (len >= size - 1) return dumpBuf;
break;
case TSDB_DATA_TYPE_BIGINT:
- len += snprintf(dumpBuf + len, size - len, " %15ld |", *(int64_t*)var);
+ len += snprintf(dumpBuf + len, size - len, " %15" PRId64 " |", *(int64_t*)var);
if (len >= size - 1) return dumpBuf;
break;
case TSDB_DATA_TYPE_UBIGINT:
- len += snprintf(dumpBuf + len, size - len, " %15lu |", *(uint64_t*)var);
+ len += snprintf(dumpBuf + len, size - len, " %15" PRIu64 " |", *(uint64_t*)var);
if (len >= size - 1) return dumpBuf;
break;
case TSDB_DATA_TYPE_FLOAT:
@@ -1926,8 +1927,8 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
if (len >= size - 1) return dumpBuf;
break;
case TSDB_DATA_TYPE_DOUBLE:
- len += snprintf(dumpBuf + len, size - len, " %15lf |", *(double*)var);
- if (len >= size - 1) return dumpBuf;
+ // len += snprintf(dumpBuf + len, size - len, " %15lf |", *(double*)var);
+ // if (len >= size - 1) return dumpBuf;
break;
case TSDB_DATA_TYPE_BOOL:
len += snprintf(dumpBuf + len, size - len, " %15d |", *(bool*)var);
@@ -1945,7 +1946,7 @@ char* dumpBlockData(SSDataBlock* pDataBlock, const char* flag, char** pDataBuf)
char* pData = colDataGetVarData(pColInfoData, j);
int32_t dataSize = TMIN(sizeof(pBuf), varDataLen(pData));
memset(pBuf, 0, sizeof(pBuf));
- taosUcs4ToMbs((TdUcs4*)varDataVal(pData), dataSize, pBuf);
+ (void)taosUcs4ToMbs((TdUcs4*)varDataVal(pData), dataSize, pBuf);
len += snprintf(dumpBuf + len, size - len, " %15s |", pBuf);
if (len >= size - 1) return dumpBuf;
} break;
@@ -2052,7 +2053,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB
case TSDB_DATA_TYPE_JSON:
case TSDB_DATA_TYPE_MEDIUMBLOB:
uError("the column type %" PRIi16 " is defined but not implemented yet", pColInfoData->info.type);
- TASSERT(0);
+ ASSERT(0);
break;
default:
if (pColInfoData->info.type < TSDB_DATA_TYPE_MAX && pColInfoData->info.type > TSDB_DATA_TYPE_NULL) {
@@ -2083,7 +2084,7 @@ int32_t buildSubmitReqFromDataBlock(SSubmitReq** pReq, const SSDataBlock* pDataB
}
} else {
uError("the column type %" PRIi16 " is undefined\n", pColInfoData->info.type);
- TASSERT(0);
+ ASSERT(0);
}
break;
}
diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c
index 56daa4075a4ca244da17bbd6d32a51b906856393..3edeeee49a166c250a9cb4d2c280d51b34fd0347 100644
--- a/source/common/src/tglobal.c
+++ b/source/common/src/tglobal.c
@@ -40,15 +40,6 @@ int32_t tsMaxShellConns = 50000;
int32_t tsShellActivityTimer = 3; // second
bool tsPrintAuth = false;
-// multi process
-int32_t tsMultiProcess = 0;
-int32_t tsMnodeShmSize = TSDB_MAX_MSG_SIZE * 2 + 1024;
-int32_t tsVnodeShmSize = TSDB_MAX_MSG_SIZE * 10 + 1024;
-int32_t tsQnodeShmSize = TSDB_MAX_MSG_SIZE * 4 + 1024;
-int32_t tsSnodeShmSize = TSDB_MAX_MSG_SIZE * 4 + 1024;
-int32_t tsBnodeShmSize = TSDB_MAX_MSG_SIZE * 4 + 1024;
-int32_t tsNumOfShmThreads = 1;
-
// queue & threads
int32_t tsNumOfRpcThreads = 1;
int32_t tsNumOfCommitThreads = 2;
@@ -353,14 +344,6 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
if (cfgAddBool(pCfg, "printAuth", tsPrintAuth, 0) != 0) return -1;
if (cfgAddInt32(pCfg, "queryRspPolicy", tsQueryRspPolicy, 0, 1, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "multiProcess", tsMultiProcess, 0, 2, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "mnodeShmSize", tsMnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "vnodeShmSize", tsVnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "qnodeShmSize", tsQnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "snodeShmSize", tsSnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "bnodeShmSize", tsBnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
- if (cfgAddInt32(pCfg, "numOfShmThreads", tsNumOfShmThreads, 1, 1024, 0) != 0) return -1;
-
tsNumOfRpcThreads = tsNumOfCores / 2;
tsNumOfRpcThreads = TRANGE(tsNumOfRpcThreads, 1, 4);
if (cfgAddInt32(pCfg, "numOfRpcThreads", tsNumOfRpcThreads, 1, 1024, 0) != 0) return -1;
@@ -700,15 +683,6 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
tsQueryBufferSize = cfgGetItem(pCfg, "queryBufferSize")->i32;
tsPrintAuth = cfgGetItem(pCfg, "printAuth")->bval;
-#if !defined(WINDOWS) && !defined(DARWIN)
- tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval;
-#endif
- tsMnodeShmSize = cfgGetItem(pCfg, "mnodeShmSize")->i32;
- tsVnodeShmSize = cfgGetItem(pCfg, "vnodeShmSize")->i32;
- tsQnodeShmSize = cfgGetItem(pCfg, "qnodeShmSize")->i32;
- tsSnodeShmSize = cfgGetItem(pCfg, "snodeShmSize")->i32;
- tsBnodeShmSize = cfgGetItem(pCfg, "bnodeShmSize")->i32;
-
tsNumOfRpcThreads = cfgGetItem(pCfg, "numOfRpcThreads")->i32;
tsNumOfCommitThreads = cfgGetItem(pCfg, "numOfCommitThreads")->i32;
tsNumOfMnodeReadThreads = cfgGetItem(pCfg, "numOfMnodeReadThreads")->i32;
@@ -780,12 +754,6 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
}
break;
}
- case 'b': {
- if (strcasecmp("bnodeShmSize", name) == 0) {
- tsBnodeShmSize = cfgGetItem(pCfg, "bnodeShmSize")->i32;
- }
- break;
- }
case 'c': {
if (strcasecmp("charset", name) == 0) {
const char *locale = cfgGetItem(pCfg, "locale")->str;
@@ -912,12 +880,6 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
}
break;
}
- case 'n': {
- if (strcasecmp("mnodeShmSize", name) == 0) {
- tsMnodeShmSize = cfgGetItem(pCfg, "mnodeShmSize")->i32;
- }
- break;
- }
case 'o': {
if (strcasecmp("monitor", name) == 0) {
tsEnableMonitor = cfgGetItem(pCfg, "monitor")->bval;
@@ -941,11 +903,7 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
break;
}
case 'u': {
- if (strcasecmp("multiProcess", name) == 0) {
-#if !defined(WINDOWS) && !defined(DARWIN)
- tsMultiProcess = cfgGetItem(pCfg, "multiProcess")->bval;
-#endif
- } else if (strcasecmp("udfDebugFlag", name) == 0) {
+ if (strcasecmp("udfDebugFlag", name) == 0) {
udfDebugFlag = cfgGetItem(pCfg, "udfDebugFlag")->i32;
}
break;
@@ -1008,8 +966,6 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
if (tsQueryBufferSize >= 0) {
tsQueryBufferSizeBytes = tsQueryBufferSize * 1048576UL;
}
- } else if (strcasecmp("qnodeShmSize", name) == 0) {
- tsQnodeShmSize = cfgGetItem(pCfg, "qnodeShmSize")->i32;
} else if (strcasecmp("qDebugFlag", name) == 0) {
qDebugFlag = cfgGetItem(pCfg, "qDebugFlag")->i32;
} else if (strcasecmp("queryPlannerTrace", name) == 0) {
@@ -1050,8 +1006,6 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
tsNumOfSupportVnodes = cfgGetItem(pCfg, "supportVnodes")->i32;
} else if (strcasecmp("statusInterval", name) == 0) {
tsStatusInterval = cfgGetItem(pCfg, "statusInterval")->i32;
- } else if (strcasecmp("snodeShmSize", name) == 0) {
- tsSnodeShmSize = cfgGetItem(pCfg, "snodeShmSize")->i32;
} else if (strcasecmp("serverPort", name) == 0) {
tstrncpy(tsLocalFqdn, cfgGetItem(pCfg, "fqdn")->str, TSDB_FQDN_LEN);
tsServerPort = (uint16_t)cfgGetItem(pCfg, "serverPort")->i32;
@@ -1119,9 +1073,7 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
break;
}
case 'v': {
- if (strcasecmp("vnodeShmSize", name) == 0) {
- tsVnodeShmSize = cfgGetItem(pCfg, "vnodeShmSize")->i32;
- } else if (strcasecmp("vDebugFlag", name) == 0) {
+ if (strcasecmp("vDebugFlag", name) == 0) {
vDebugFlag = cfgGetItem(pCfg, "vDebugFlag")->i32;
}
break;
@@ -1244,6 +1196,7 @@ int32_t taosInitCfg(const char *cfgDir, const char **envCmd, const char *envFile
if (cfgLoadFromArray(tsCfg, pArgs) != 0) {
uError("failed to load cfg from array since %s", terrstr());
cfgCleanup(tsCfg);
+ tsCfg = NULL;
return -1;
}
diff --git a/source/common/src/tmisce.c b/source/common/src/tmisce.c
index f1713cfd98c87d7c20f2d3de0c8e41c6a8709245..dfaebc99f682301ce788a343e50331b9a6be93a7 100644
--- a/source/common/src/tmisce.c
+++ b/source/common/src/tmisce.c
@@ -21,7 +21,8 @@
int32_t taosGetFqdnPortFromEp(const char* ep, SEp* pEp) {
pEp->port = 0;
- strcpy(pEp->fqdn, ep);
+ memset(pEp->fqdn, 0, TSDB_FQDN_LEN);
+ strncpy(pEp->fqdn, ep, TSDB_FQDN_LEN - 1);
char* temp = strchr(pEp->fqdn, ':');
if (temp) {
diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c
index 55e5616dd501c2b947ccabd28b7864c8bf440614..65541ca9cc50486bf7f1ad2b385ded7eea04032a 100644
--- a/source/common/src/tmsg.c
+++ b/source/common/src/tmsg.c
@@ -993,7 +993,8 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
for (int32_t i = 0; i < vlen; ++i) {
SVnodeLoad *pload = taosArrayGet(pReq->pVloads, i);
if (tEncodeI32(&encoder, pload->vgId) < 0) return -1;
- if (tEncodeI32(&encoder, pload->syncState) < 0) return -1;
+ if (tEncodeI8(&encoder, pload->syncState) < 0) return -1;
+ if (tEncodeI8(&encoder, pload->syncRestore) < 0) return -1;
if (tEncodeI64(&encoder, pload->cacheUsage) < 0) return -1;
if (tEncodeI64(&encoder, pload->numOfTables) < 0) return -1;
if (tEncodeI64(&encoder, pload->numOfTimeSeries) < 0) return -1;
@@ -1003,7 +1004,8 @@ int32_t tSerializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
}
// mnode loads
- if (tEncodeI32(&encoder, pReq->mload.syncState) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->mload.syncState) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->mload.syncRestore) < 0) return -1;
if (tEncodeI32(&encoder, pReq->qload.dnodeId) < 0) return -1;
if (tEncodeI64(&encoder, pReq->qload.numOfProcessedQuery) < 0) return -1;
@@ -1063,7 +1065,8 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
for (int32_t i = 0; i < vlen; ++i) {
SVnodeLoad vload = {0};
if (tDecodeI32(&decoder, &vload.vgId) < 0) return -1;
- if (tDecodeI32(&decoder, &vload.syncState) < 0) return -1;
+ if (tDecodeI8(&decoder, &vload.syncState) < 0) return -1;
+ if (tDecodeI8(&decoder, &vload.syncRestore) < 0) return -1;
if (tDecodeI64(&decoder, &vload.cacheUsage) < 0) return -1;
if (tDecodeI64(&decoder, &vload.numOfTables) < 0) return -1;
if (tDecodeI64(&decoder, &vload.numOfTimeSeries) < 0) return -1;
@@ -1076,7 +1079,8 @@ int32_t tDeserializeSStatusReq(void *buf, int32_t bufLen, SStatusReq *pReq) {
}
}
- if (tDecodeI32(&decoder, &pReq->mload.syncState) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->mload.syncState) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->mload.syncRestore) < 0) return -1;
if (tDecodeI32(&decoder, &pReq->qload.dnodeId) < 0) return -1;
if (tDecodeI64(&decoder, &pReq->qload.numOfProcessedQuery) < 0) return -1;
@@ -1448,7 +1452,7 @@ void tFreeSGetUserAuthRsp(SGetUserAuthRsp *pRsp) {
taosHashCleanup(pRsp->writeDbs);
}
-int32_t tSerializeSCreateDropMQSBNodeReq(void *buf, int32_t bufLen, SMCreateQnodeReq *pReq) {
+int32_t tSerializeSCreateDropMQSNodeReq(void *buf, int32_t bufLen, SMCreateQnodeReq *pReq) {
SEncoder encoder = {0};
tEncoderInit(&encoder, buf, bufLen);
@@ -1461,7 +1465,7 @@ int32_t tSerializeSCreateDropMQSBNodeReq(void *buf, int32_t bufLen, SMCreateQnod
return tlen;
}
-int32_t tDeserializeSCreateDropMQSBNodeReq(void *buf, int32_t bufLen, SMCreateQnodeReq *pReq) {
+int32_t tDeserializeSCreateDropMQSNodeReq(void *buf, int32_t bufLen, SMCreateQnodeReq *pReq) {
SDecoder decoder = {0};
tDecoderInit(&decoder, buf, bufLen);
diff --git a/source/common/src/tname.c b/source/common/src/tname.c
index 887c449c56e9758412dbc201bf625f3a80281c2c..70682d6cd4efbf621668197d1b40da3f453c4c50 100644
--- a/source/common/src/tname.c
+++ b/source/common/src/tname.c
@@ -90,8 +90,10 @@ int64_t taosGetIntervalStartTimestamp(int64_t startTime, int64_t slidingTime, in
SName* toName(int32_t acctId, const char* pDbName, const char* pTableName, SName* pName) {
pName->type = TSDB_TABLE_NAME_T;
pName->acctId = acctId;
- strcpy(pName->dbname, pDbName);
- strcpy(pName->tname, pTableName);
+ memset(pName->dbname, 0, TSDB_DB_NAME_LEN);
+ strncpy(pName->dbname, pDbName, TSDB_DB_NAME_LEN - 1);
+ memset(pName->tname, 0, TSDB_TABLE_NAME_LEN);
+ strncpy(pName->tname, pTableName, TSDB_TABLE_NAME_LEN - 1);
return pName;
}
diff --git a/source/common/src/trow.c b/source/common/src/trow.c
index d5c0f2ddf8ae12ab7601de8a623d2adce7d73aa2..b007075efe863943020f9d2bc4f1b771c93115c4 100644
--- a/source/common/src/trow.c
+++ b/source/common/src/trow.c
@@ -481,7 +481,7 @@ bool tdSTSRowGetVal(STSRowIter *pIter, col_id_t colId, col_type_t colType, SCell
int32_t tdGetBitmapValTypeII(const void *pBitmap, int16_t colIdx, TDRowValT *pValType) {
if (!pBitmap || colIdx < 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -503,7 +503,7 @@ int32_t tdGetBitmapValTypeII(const void *pBitmap, int16_t colIdx, TDRowValT *pVa
*pValType = ((*pDestByte) & 0x03);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -512,7 +512,7 @@ int32_t tdGetBitmapValTypeII(const void *pBitmap, int16_t colIdx, TDRowValT *pVa
int32_t tdGetBitmapValTypeI(const void *pBitmap, int16_t colIdx, TDRowValT *pValType) {
if (!pBitmap || colIdx < 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -546,7 +546,7 @@ int32_t tdGetBitmapValTypeI(const void *pBitmap, int16_t colIdx, TDRowValT *pVal
*pValType = ((*pDestByte) & 0x01);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -555,7 +555,7 @@ int32_t tdGetBitmapValTypeI(const void *pBitmap, int16_t colIdx, TDRowValT *pVal
int32_t tdSetBitmapValTypeI(void *pBitmap, int16_t colIdx, TDRowValT valType) {
if (!pBitmap || colIdx < 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -598,7 +598,7 @@ int32_t tdSetBitmapValTypeI(void *pBitmap, int16_t colIdx, TDRowValT valType) {
// *pDestByte |= (valType);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -607,7 +607,7 @@ int32_t tdSetBitmapValTypeI(void *pBitmap, int16_t colIdx, TDRowValT valType) {
int32_t tdGetKvRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int32_t offset, int16_t colIdx) {
#ifdef TD_SUPPORT_BITMAP
- TASSERT(colIdx < tdRowGetNCols(pRow) - 1);
+ ASSERT(colIdx < tdRowGetNCols(pRow) - 1);
if (tdGetBitmapValType(pBitmap, colIdx, &output->valType, 0) != TSDB_CODE_SUCCESS) {
output->valType = TD_VTYPE_NONE;
return terrno;
@@ -621,7 +621,7 @@ int32_t tdGetKvRowValOfCol(SCellVal *output, STSRow *pRow, void *pBitmap, int32_
output->val = POINTER_SHIFT(pRow, offset);
}
#else
- TASSERT(0);
+ ASSERT(0);
if (offset < 0) {
terrno = TSDB_CODE_INVALID_PARA;
output->valType = TD_VTYPE_NONE;
@@ -671,7 +671,7 @@ int32_t tdAppendColValToRow(SRowBuilder *pBuilder, col_id_t colId, int8_t colTyp
return terrno;
}
#else
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
#endif
@@ -709,7 +709,7 @@ int32_t tdAppendColValToRow(SRowBuilder *pBuilder, col_id_t colId, int8_t colTyp
int32_t tdAppendColValToKvRow(SRowBuilder *pBuilder, TDRowValT valType, const void *val, bool isCopyVarData,
int8_t colType, int16_t colIdx, int32_t offset, col_id_t colId) {
if ((offset < (int32_t)sizeof(SKvRowIdx)) || (colIdx < 1)) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -798,7 +798,7 @@ int32_t tdSRowSetExtendedInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBou
pBuilder->nCols = nCols;
pBuilder->nBoundCols = nBoundCols;
if (pBuilder->flen <= 0 || pBuilder->nCols <= 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -820,7 +820,7 @@ int32_t tdSRowSetExtendedInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBou
int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
pBuilder->pBuf = (STSRow *)pBuf;
if (!pBuilder->pBuf) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -831,7 +831,7 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
TD_ROW_SET_INFO(pBuilder->pBuf, 0);
TD_ROW_SET_TYPE(pBuilder->pBuf, pBuilder->rowType);
- TASSERT(pBuilder->nBitmaps > 0 && pBuilder->flen > 0);
+ ASSERT(pBuilder->nBitmaps > 0 && pBuilder->flen > 0);
uint32_t len = 0;
switch (pBuilder->rowType) {
@@ -857,7 +857,7 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
TD_ROW_SET_NCOLS(pBuilder->pBuf, pBuilder->nBoundCols);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -868,12 +868,12 @@ int32_t tdSRowResetBuf(SRowBuilder *pBuilder, void *pBuf) {
int32_t tdSRowGetBuf(SRowBuilder *pBuilder, void *pBuf) {
pBuilder->pBuf = (STSRow *)pBuf;
if (!pBuilder->pBuf) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
- TASSERT(pBuilder->nBitmaps > 0 && pBuilder->flen > 0);
+ ASSERT(pBuilder->nBitmaps > 0 && pBuilder->flen > 0);
uint32_t len = 0;
switch (pBuilder->rowType) {
@@ -888,7 +888,7 @@ int32_t tdSRowGetBuf(SRowBuilder *pBuilder, void *pBuf) {
#endif
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -908,7 +908,7 @@ int32_t tdSRowSetTpInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t flen) {
pBuilder->flen = flen;
pBuilder->nCols = nCols;
if (pBuilder->flen <= 0 || pBuilder->nCols <= 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -927,7 +927,7 @@ int32_t tdSRowSetInfo(SRowBuilder *pBuilder, int32_t nCols, int32_t nBoundCols,
pBuilder->nCols = nCols;
pBuilder->nBoundCols = nBoundCols;
if (pBuilder->flen <= 0 || pBuilder->nCols <= 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -956,13 +956,13 @@ int32_t tdGetBitmapValType(const void *pBitmap, int16_t colIdx, TDRowValT *pValT
tdGetBitmapValTypeI(pBitmap, colIdx, pValType);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return TSDB_CODE_FAILED;
}
return TSDB_CODE_SUCCESS;
}
-
+#if 0
bool tdIsBitmapValTypeNorm(const void *pBitmap, int16_t idx, int8_t bitmapMode) {
TDRowValT valType = 0;
tdGetBitmapValType(pBitmap, idx, &valType, bitmapMode);
@@ -971,10 +971,11 @@ bool tdIsBitmapValTypeNorm(const void *pBitmap, int16_t idx, int8_t bitmapMode)
}
return false;
}
+#endif
int32_t tdSetBitmapValTypeII(void *pBitmap, int16_t colIdx, TDRowValT valType) {
if (!pBitmap || colIdx < 0) {
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -1001,7 +1002,7 @@ int32_t tdSetBitmapValTypeII(void *pBitmap, int16_t colIdx, TDRowValT valType) {
// *pDestByte |= (valType);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return terrno;
}
@@ -1018,7 +1019,7 @@ int32_t tdSetBitmapValType(void *pBitmap, int16_t colIdx, TDRowValT valType, int
tdSetBitmapValTypeI(pBitmap, colIdx, valType);
break;
default:
- TASSERT(0);
+ ASSERT(0);
terrno = TSDB_CODE_INVALID_PARA;
return TSDB_CODE_FAILED;
}
diff --git a/source/dnode/CMakeLists.txt b/source/dnode/CMakeLists.txt
index 87e4c5fc4623365d5fbedd605ba485443c1fffbf..035cea2dc4dc2c19642913ca2ff741a83fcc36be 100644
--- a/source/dnode/CMakeLists.txt
+++ b/source/dnode/CMakeLists.txt
@@ -2,5 +2,4 @@ add_subdirectory(mnode)
add_subdirectory(vnode)
add_subdirectory(qnode)
add_subdirectory(snode)
-add_subdirectory(bnode)
add_subdirectory(mgmt)
\ No newline at end of file
diff --git a/source/dnode/bnode/CMakeLists.txt b/source/dnode/bnode/CMakeLists.txt
deleted file mode 100644
index 77f4d15ad2b2936ea3852e038efc1101fd74619d..0000000000000000000000000000000000000000
--- a/source/dnode/bnode/CMakeLists.txt
+++ /dev/null
@@ -1,14 +0,0 @@
-aux_source_directory(src BNODE_SRC)
-add_library(bnode STATIC ${BNODE_SRC})
-target_include_directories(
- bnode
- PUBLIC "${TD_SOURCE_DIR}/include/dnode/bnode"
- private "${CMAKE_CURRENT_SOURCE_DIR}/inc"
-)
-target_link_libraries(
- bnode
- PRIVATE transport
- PRIVATE os
- PRIVATE common
- PRIVATE util
-)
\ No newline at end of file
diff --git a/source/dnode/bnode/inc/bndInt.h b/source/dnode/bnode/inc/bndInt.h
deleted file mode 100644
index e611d230a329ad597ba5b7ee634c3246b6c44294..0000000000000000000000000000000000000000
--- a/source/dnode/bnode/inc/bndInt.h
+++ /dev/null
@@ -1,40 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _TD_BNODE_INT_H_
-#define _TD_BNODE_INT_H_
-
-#include "os.h"
-
-#include "tarray.h"
-#include "tlog.h"
-#include "tmsg.h"
-#include "trpc.h"
-
-#include "bnode.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct SBnode {
- SMsgCb msgCb;
-} SBnode;
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_TD_BNODE_INT_H_*/
\ No newline at end of file
diff --git a/source/dnode/bnode/src/bnode.c b/source/dnode/bnode/src/bnode.c
deleted file mode 100644
index b9c41ebf4370fb070a39a7d76dab61742a174cf6..0000000000000000000000000000000000000000
--- a/source/dnode/bnode/src/bnode.c
+++ /dev/null
@@ -1,28 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#include "bndInt.h"
-
-SBnode *bndOpen(const char *path, const SBnodeOpt *pOption) {
- SBnode *pBnode = taosMemoryCalloc(1, sizeof(SBnode));
- pBnode->msgCb = pOption->msgCb;
- return pBnode;
-}
-
-void bndClose(SBnode *pBnode) { taosMemoryFree(pBnode); }
-
-int32_t bndGetLoad(SBnode *pBnode, SBnodeLoad *pLoad) { return 0; }
-
-int32_t bndProcessWMsgs(SBnode *pBnode, SArray *pMsgs) { return 0; }
diff --git a/source/dnode/mgmt/CMakeLists.txt b/source/dnode/mgmt/CMakeLists.txt
index 581686ba904001b80638efd9ab225c3f68e91e09..423028b1679eb6f663d80dfb0df09fc0e2fe10ec 100644
--- a/source/dnode/mgmt/CMakeLists.txt
+++ b/source/dnode/mgmt/CMakeLists.txt
@@ -1,6 +1,5 @@
add_subdirectory(node_mgmt)
add_subdirectory(node_util)
-add_subdirectory(mgmt_bnode)
add_subdirectory(mgmt_mnode)
add_subdirectory(mgmt_qnode)
add_subdirectory(mgmt_snode)
diff --git a/source/dnode/mgmt/exe/dmMain.c b/source/dnode/mgmt/exe/dmMain.c
index acc3fc56581420a1a2d253dd1db40fc760a2c7c9..188677656a512be254815709532611013b805745 100644
--- a/source/dnode/mgmt/exe/dmMain.c
+++ b/source/dnode/mgmt/exe/dmMain.c
@@ -25,7 +25,6 @@
#define DM_SDB_INFO "Dump sdb info."
#define DM_ENV_CMD "The env cmd variable string to use when configuring the server, such as: -e 'TAOS_FQDN=td1'."
#define DM_ENV_FILE "The env variable file path to use when configuring the server, default is './.env', .env text can be 'TAOS_FQDN=td1'."
-#define DM_NODE_TYPE "Startup type of the node, default is 0."
#define DM_MACHINE_CODE "Get machine code."
#define DM_VERSION "Print program version."
#define DM_EMAIL ""
@@ -44,7 +43,6 @@ static struct {
char apolloUrl[PATH_MAX];
const char **envCmd;
SArray *pArgs; // SConfigPair
- EDndNodeType ntype;
} global = {0};
static void dmStopDnode(int signum, void *info, void *ctx) { dmStop(); }
@@ -59,13 +57,6 @@ static void dmSetSignalHandle() {
taosSetSignal(SIGTSTP, dmStopDnode);
taosSetSignal(SIGQUIT, dmStopDnode);
#endif
-
- if (!tsMultiProcess) {
- } else if (global.ntype == DNODE || global.ntype == NODE_END) {
- taosIgnSignal(SIGCHLD);
- } else {
- taosKillChildOnParentStopped();
- }
}
static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
@@ -91,12 +82,6 @@ static int32_t dmParseArgs(int32_t argc, char const *argv[]) {
global.dumpSdb = true;
} else if (strcmp(argv[i], "-E") == 0) {
tstrncpy(global.envFile, argv[++i], PATH_MAX);
- } else if (strcmp(argv[i], "-n") == 0) {
- global.ntype = atoi(argv[++i]);
- if (global.ntype <= DNODE || global.ntype > NODE_END) {
- printf("'-n' range is [1 - %d], default is 0\n", NODE_END - 1);
- return -1;
- }
} else if (strcmp(argv[i], "-k") == 0) {
global.generateGrant = true;
} else if (strcmp(argv[i], "-C") == 0) {
@@ -142,7 +127,6 @@ static void dmPrintHelp() {
printf("%s%s%s%s\n", indent, "-C,", indent, DM_DMP_CFG);
printf("%s%s%s%s\n", indent, "-e,", indent, DM_ENV_CMD);
printf("%s%s%s%s\n", indent, "-E,", indent, DM_ENV_FILE);
- printf("%s%s%s%s\n", indent, "-n,", indent, DM_NODE_TYPE);
printf("%s%s%s%s\n", indent, "-k,", indent, DM_MACHINE_CODE);
printf("%s%s%s%s\n", indent, "-V,", indent, DM_VERSION);
@@ -155,17 +139,7 @@ static void dmDumpCfg() {
}
static int32_t dmInitLog() {
- char logName[12] = {0};
- snprintf(logName, sizeof(logName), "%slog", dmNodeLogName(global.ntype));
- return taosCreateLog(logName, 1, configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0);
-}
-
-static void dmSetProcInfo(int32_t argc, char **argv) {
- taosSetProcPath(argc, argv);
- if (global.ntype != DNODE && global.ntype != NODE_END) {
- const char *name = dmNodeProcName(global.ntype);
- taosSetProcName(argc, argv, name);
- }
+ return taosCreateLog("taosdlog", 1, configDir, global.envCmd, global.envFile, global.apolloUrl, global.pArgs, 0);
}
static void taosCleanupArgs() {
@@ -234,6 +208,7 @@ int mainWindows(int argc, char **argv) {
taosCleanupCfg();
taosCloseLog();
taosCleanupArgs();
+ taosConvDestroy();
return 0;
}
@@ -242,13 +217,14 @@ int mainWindows(int argc, char **argv) {
taosCleanupCfg();
taosCloseLog();
taosCleanupArgs();
+ taosConvDestroy();
return 0;
}
- dmSetProcInfo(argc, (char **)argv);
+ osSetProcPath(argc, (char **)argv);
taosCleanupArgs();
- if (dmInit(global.ntype) != 0) {
+ if (dmInit() != 0) {
dError("failed to init dnode since %s", terrstr());
return -1;
}
diff --git a/source/dnode/mgmt/mgmt_bnode/CMakeLists.txt b/source/dnode/mgmt/mgmt_bnode/CMakeLists.txt
deleted file mode 100644
index 0a6cf52fb86dfd7ac24332631f2b9a1ee6c2c572..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/mgmt_bnode/CMakeLists.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-aux_source_directory(src MGMT_BNODE)
-add_library(mgmt_bnode STATIC ${MGMT_BNODE})
-target_include_directories(
- mgmt_bnode
- PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
-)
-target_link_libraries(
- mgmt_bnode node_util
-)
\ No newline at end of file
diff --git a/source/dnode/mgmt/mgmt_bnode/inc/bmInt.h b/source/dnode/mgmt/mgmt_bnode/inc/bmInt.h
deleted file mode 100644
index c05ad46189a823eb9a1cc216181c653aea4ddec2..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/mgmt_bnode/inc/bmInt.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _TD_DND_BNODE_INT_H_
-#define _TD_DND_BNODE_INT_H_
-
-#include "dmUtil.h"
-
-#include "bnode.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-typedef struct SBnodeMgmt {
- SDnodeData *pData;
- SBnode *pBnode;
- SMsgCb msgCb;
- const char *path;
- const char *name;
- SMultiWorker writeWorker;
- SSingleWorker monitorWorker;
-} SBnodeMgmt;
-
-// bmHandle.c
-SArray *bmGetMsgHandles();
-int32_t bmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
-int32_t bmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
-int32_t bmProcessGetMonBmInfoReq(SBnodeMgmt *pMgmt, SRpcMsg *pMsg);
-
-// bmWorker.c
-int32_t bmStartWorker(SBnodeMgmt *pMgmt);
-void bmStopWorker(SBnodeMgmt *pMgmt);
-int32_t bmPutNodeMsgToWriteQueue(SBnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t bmPutNodeMsgToMonitorQueue(SBnodeMgmt *pMgmt, SRpcMsg *pMsg);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_TD_DND_BNODE_INT_H_*/
\ No newline at end of file
diff --git a/source/dnode/mgmt/mgmt_bnode/src/bmHandle.c b/source/dnode/mgmt/mgmt_bnode/src/bmHandle.c
deleted file mode 100644
index 9ec445c69c06b7ba91a3cc44caf2d008c49fb704..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/mgmt_bnode/src/bmHandle.c
+++ /dev/null
@@ -1,105 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define _DEFAULT_SOURCE
-#include "bmInt.h"
-
-void bmGetMonitorInfo(SBnodeMgmt *pMgmt, SMonBmInfo *bmInfo) {}
-
-int32_t bmProcessGetMonBmInfoReq(SBnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonBmInfo bmInfo = {0};
- bmGetMonitorInfo(pMgmt, &bmInfo);
- dmGetMonitorSystemInfo(&bmInfo.sys);
- monGetLogs(&bmInfo.log);
-
- int32_t rspLen = tSerializeSMonBmInfo(NULL, 0, &bmInfo);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonBmInfo(pRsp, rspLen, &bmInfo);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- tFreeSMonBmInfo(&bmInfo);
- return 0;
-}
-
-int32_t bmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
- SDCreateBnodeReq createReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- if (pInput->pData->dnodeId != 0 && createReq.dnodeId != pInput->pData->dnodeId) {
- terrno = TSDB_CODE_INVALID_OPTION;
- dError("failed to create bnode since %s, input:%d cur:%d", terrstr(), createReq.dnodeId, pInput->pData->dnodeId);
- return -1;
- }
-
- bool deployed = true;
- if (dmWriteFile(pInput->path, pInput->name, deployed) != 0) {
- dError("failed to write bnode file since %s", terrstr());
- return -1;
- }
-
- return 0;
-}
-
-int32_t bmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
- SDDropBnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- if (pInput->pData->dnodeId != 0 && dropReq.dnodeId != pInput->pData->dnodeId) {
- terrno = TSDB_CODE_INVALID_OPTION;
- dError("failed to drop bnode since %s", terrstr());
- return -1;
- }
-
- bool deployed = false;
- if (dmWriteFile(pInput->path, pInput->name, deployed) != 0) {
- dError("failed to write bnode file since %s", terrstr());
- return -1;
- }
-
- return 0;
-}
-
-SArray *bmGetMsgHandles() {
- int32_t code = -1;
- SArray *pArray = taosArrayInit(2, sizeof(SMgmtHandle));
- if (pArray == NULL) goto _OVER;
-
- if (dmSetMgmtHandle(pArray, TDMT_MON_BM_INFO, bmPutNodeMsgToMonitorQueue, 0) == NULL) goto _OVER;
-
- code = 0;
-_OVER:
- if (code != 0) {
- taosArrayDestroy(pArray);
- return NULL;
- } else {
- return pArray;
- }
-}
diff --git a/source/dnode/mgmt/mgmt_bnode/src/bmInt.c b/source/dnode/mgmt/mgmt_bnode/src/bmInt.c
deleted file mode 100644
index 2c5d23cae98e98645ff30ba751f2e8a0672682d1..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/mgmt_bnode/src/bmInt.c
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define _DEFAULT_SOURCE
-#include "bmInt.h"
-
-static int32_t bmRequire(const SMgmtInputOpt *pInput, bool *required) {
- return dmReadFile(pInput->path, pInput->name, required);
-}
-
-static void bmInitOption(SBnodeMgmt *pMgmt, SBnodeOpt *pOption) { pOption->msgCb = pMgmt->msgCb; }
-
-static void bmClose(SBnodeMgmt *pMgmt) {
- if (pMgmt->pBnode != NULL) {
- bmStopWorker(pMgmt);
- bndClose(pMgmt->pBnode);
- pMgmt->pBnode = NULL;
- }
-
- taosMemoryFree(pMgmt);
-}
-
-int32_t bmOpen(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
- SBnodeMgmt *pMgmt = taosMemoryCalloc(1, sizeof(SBnodeMgmt));
- if (pMgmt == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- pMgmt->pData = pInput->pData;
- pMgmt->path = pInput->path;
- pMgmt->name = pInput->name;
- pMgmt->msgCb = pInput->msgCb;
- pMgmt->msgCb.mgmt = pMgmt;
-
- SBnodeOpt option = {0};
- bmInitOption(pMgmt, &option);
- pMgmt->pBnode = bndOpen(pMgmt->path, &option);
- if (pMgmt->pBnode == NULL) {
- dError("failed to open bnode since %s", terrstr());
- bmClose(pMgmt);
- return -1;
- }
- tmsgReportStartup("bnode-impl", "initialized");
-
- if (bmStartWorker(pMgmt) != 0) {
- dError("failed to start bnode worker since %s", terrstr());
- bmClose(pMgmt);
- return -1;
- }
- tmsgReportStartup("bnode-worker", "initialized");
-
- pOutput->pMgmt = pMgmt;
- return 0;
-}
-
-SMgmtFunc bmGetMgmtFunc() {
- SMgmtFunc mgmtFunc = {0};
- mgmtFunc.openFp = bmOpen;
- mgmtFunc.closeFp = (NodeCloseFp)bmClose;
- mgmtFunc.createFp = (NodeCreateFp)bmProcessCreateReq;
- mgmtFunc.dropFp = (NodeDropFp)bmProcessDropReq;
- mgmtFunc.requiredFp = bmRequire;
- mgmtFunc.getHandlesFp = bmGetMsgHandles;
-
- return mgmtFunc;
-}
diff --git a/source/dnode/mgmt/mgmt_bnode/src/bmWorker.c b/source/dnode/mgmt/mgmt_bnode/src/bmWorker.c
deleted file mode 100644
index 08c9edd854d6a2fa5b1e8ffe98078c86d6436777..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/mgmt_bnode/src/bmWorker.c
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define _DEFAULT_SOURCE
-#include "bmInt.h"
-
-static void bmSendErrorRsp(SRpcMsg *pMsg, int32_t code) {
- SRpcMsg rsp = {.code = code, .info = pMsg->info};
- tmsgSendRsp(&rsp);
-
- dTrace("msg:%p, is freed", pMsg);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
-}
-
-static void bmSendErrorRsps(STaosQall *qall, int32_t numOfMsgs, int32_t code) {
- for (int32_t i = 0; i < numOfMsgs; ++i) {
- SRpcMsg *pMsg = NULL;
- taosGetQitem(qall, (void **)&pMsg);
- if (pMsg != NULL) {
- bmSendErrorRsp(pMsg, code);
- }
- }
-}
-
-static inline void bmSendRsp(SRpcMsg *pMsg, int32_t code) {
- SRpcMsg rsp = {
- .code = code,
- .pCont = pMsg->info.rsp,
- .contLen = pMsg->info.rspLen,
- .info = pMsg->info,
- };
- tmsgSendRsp(&rsp);
-}
-
-static void bmProcessMonitorQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
- SBnodeMgmt *pMgmt = pInfo->ahandle;
- int32_t code = -1;
- dTrace("msg:%p, get from bnode-monitor queue", pMsg);
-
- if (pMsg->msgType == TDMT_MON_BM_INFO) {
- code = bmProcessGetMonBmInfoReq(pMgmt, pMsg);
- } else {
- terrno = TSDB_CODE_MSG_NOT_PROCESSED;
- }
-
- if (IsReq(pMsg)) {
- if (code != 0 && terrno != 0) code = terrno;
- bmSendRsp(pMsg, code);
- }
-
- dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
-}
-
-static void bmProcessWriteQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
- SBnodeMgmt *pMgmt = pInfo->ahandle;
-
- SArray *pArray = taosArrayInit(numOfMsgs, sizeof(SRpcMsg *));
- if (pArray == NULL) {
- bmSendErrorRsps(qall, numOfMsgs, TSDB_CODE_OUT_OF_MEMORY);
- return;
- }
-
- for (int32_t i = 0; i < numOfMsgs; ++i) {
- SRpcMsg *pMsg = NULL;
- taosGetQitem(qall, (void **)&pMsg);
- if (pMsg != NULL) {
- dTrace("msg:%p, get from bnode-write queue", pMsg);
- if (taosArrayPush(pArray, &pMsg) == NULL) {
- bmSendErrorRsp(pMsg, TSDB_CODE_OUT_OF_MEMORY);
- }
- }
- }
-
- bndProcessWMsgs(pMgmt->pBnode, pArray);
-
- for (size_t i = 0; i < numOfMsgs; i++) {
- SRpcMsg *pMsg = *(SRpcMsg **)taosArrayGet(pArray, i);
- if (pMsg != NULL) {
- dTrace("msg:%p, is freed", pMsg);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
- }
- }
- taosArrayDestroy(pArray);
-}
-
-int32_t bmPutNodeMsgToWriteQueue(SBnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMultiWorker *pWorker = &pMgmt->writeWorker;
-
- dTrace("msg:%p, put into worker:%s", pMsg, pWorker->name);
- taosWriteQitem(pWorker->queue, pMsg);
- return 0;
-}
-
-int32_t bmPutNodeMsgToMonitorQueue(SBnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SSingleWorker *pWorker = &pMgmt->monitorWorker;
-
- dTrace("msg:%p, put into worker:%s", pMsg, pWorker->name);
- taosWriteQitem(pWorker->queue, pMsg);
- return 0;
-}
-
-int32_t bmStartWorker(SBnodeMgmt *pMgmt) {
- SMultiWorkerCfg cfg = {
- .max = 1,
- .name = "bnode-write",
- .fp = (FItems)bmProcessWriteQueue,
- .param = pMgmt,
- };
- if (tMultiWorkerInit(&pMgmt->writeWorker, &cfg) != 0) {
- dError("failed to start bnode-write worker since %s", terrstr());
- return -1;
- }
-
- SSingleWorkerCfg mCfg = {
- .min = 1,
- .max = 1,
- .name = "bnode-monitor",
- .fp = (FItem)bmProcessMonitorQueue,
- .param = pMgmt,
- };
- if (tSingleWorkerInit(&pMgmt->monitorWorker, &mCfg) != 0) {
- dError("failed to start bnode-monitor worker since %s", terrstr());
- return -1;
- }
-
- dDebug("bnode workers are initialized");
- return 0;
-}
-
-void bmStopWorker(SBnodeMgmt *pMgmt) {
- tSingleWorkerCleanup(&pMgmt->monitorWorker);
- tMultiWorkerCleanup(&pMgmt->writeWorker);
- dDebug("bnode workers are closed");
-}
diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
index dd988161613dddefb0a996f19c5831dc6ca9e10d..782c828bb2327dc30587659d5e41fc1eb0f014d7 100644
--- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
+++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
@@ -326,8 +326,6 @@ SArray *dmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_QNODE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_SNODE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_SNODE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_BNODE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_BNODE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_CONFIG_DNODE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_SERVER_STATUS, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_SYSTABLE_RETRIEVE, dmPutNodeMsgToMgmtQueue, 0) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c
index e7ccce1c8b7ce1fd72f7a703b3757cef64833648..ca8a434d0500ef66febda17855a6eaec0670fe82 100644
--- a/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c
+++ b/source/dnode/mgmt/mgmt_dnode/src/dmWorker.c
@@ -132,12 +132,6 @@ static void dmProcessMgmtQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
case TDMT_DND_DROP_SNODE:
code = (*pMgmt->processDropNodeFp)(SNODE, pMsg);
break;
- case TDMT_DND_CREATE_BNODE:
- code = (*pMgmt->processCreateNodeFp)(BNODE, pMsg);
- break;
- case TDMT_DND_DROP_BNODE:
- code = (*pMgmt->processDropNodeFp)(BNODE, pMsg);
- break;
case TDMT_DND_SERVER_STATUS:
code = dmProcessServerRunStatus(pMgmt, pMsg);
break;
diff --git a/source/dnode/mgmt/mgmt_mnode/inc/mmInt.h b/source/dnode/mgmt/mgmt_mnode/inc/mmInt.h
index 17cbde437b2e94d8d111c76600ddef8fb7767818..6d06535447d812b0ae83589bc2d07e48feaf4687 100644
--- a/source/dnode/mgmt/mgmt_mnode/inc/mmInt.h
+++ b/source/dnode/mgmt/mgmt_mnode/inc/mmInt.h
@@ -34,7 +34,6 @@ typedef struct SMnodeMgmt {
SSingleWorker readWorker;
SSingleWorker writeWorker;
SSingleWorker syncWorker;
- SSingleWorker monitorWorker;
bool stopped;
int32_t refCount;
TdThreadRwlock lock;
@@ -48,8 +47,6 @@ int32_t mmWriteFile(const char *path, const SMnodeOpt *pOption);
SArray *mmGetMsgHandles();
int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
-int32_t mmProcessGetMonitorInfoReq(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t mmProcessGetLoadsReq(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
// mmWorker.c
int32_t mmStartWorker(SMnodeMgmt *pMgmt);
@@ -59,7 +56,6 @@ int32_t mmPutMsgToSyncQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t mmPutMsgToReadQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t mmPutMsgToQueryQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t mmPutMsgToMonitorQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t mmPutMsgToQueue(SMnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc);
#ifdef __cplusplus
diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
index fc45dbf15f0630cf505db8cf013ff6297f27eb9e..7fb700e776cd422fc447e980da35200848065c22 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
@@ -20,58 +20,11 @@ void mmGetMonitorInfo(SMnodeMgmt *pMgmt, SMonMmInfo *pInfo) {
mndGetMonitorInfo(pMgmt->pMnode, &pInfo->cluster, &pInfo->vgroup, &pInfo->stb, &pInfo->grant);
}
-int32_t mmProcessGetMonitorInfoReq(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonMmInfo mmInfo = {0};
- mmGetMonitorInfo(pMgmt, &mmInfo);
- dmGetMonitorSystemInfo(&mmInfo.sys);
- monGetLogs(&mmInfo.log);
-
- int32_t rspLen = tSerializeSMonMmInfo(NULL, 0, &mmInfo);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonMmInfo(pRsp, rspLen, &mmInfo);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- tFreeSMonMmInfo(&mmInfo);
- return 0;
-}
-
void mmGetMnodeLoads(SMnodeMgmt *pMgmt, SMonMloadInfo *pInfo) {
pInfo->isMnode = 1;
mndGetLoad(pMgmt->pMnode, &pInfo->load);
}
-int32_t mmProcessGetLoadsReq(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonMloadInfo mloads = {0};
- mmGetMnodeLoads(pMgmt, &mloads);
-
- int32_t rspLen = tSerializeSMonMloadInfo(NULL, 0, &mloads);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonMloadInfo(pRsp, rspLen, &mloads);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- return 0;
-}
-
int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
const STraceId *trace = &pMsg->info.traceId;
SDCreateMnodeReq createReq = {0};
@@ -105,7 +58,7 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
const STraceId *trace = &pMsg->info.traceId;
SDDropMnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
@@ -136,8 +89,6 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_QNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_SNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_SNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_BNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_BNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_CREATE_VNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_DND_CONFIG_DNODE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
@@ -163,8 +114,6 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_MND_DNODE_LIST, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_SNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_BNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_BNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_USE_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
@@ -234,9 +183,6 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_VND_ALTER_HASHRANGE_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT_RSP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MON_MM_INFO, mmPutMsgToMonitorQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MON_MM_LOAD, mmPutMsgToMonitorQueue, 0) == NULL) goto _OVER;
-
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
index 849d3ef39019fcb5ce9dfb987cac4772e91839a7..16e6f67409ddea913b422779bda28e1063adec48 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
@@ -46,22 +46,12 @@ static inline void mmSendRsp(SRpcMsg *pMsg, int32_t code) {
static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
SMnodeMgmt *pMgmt = pInfo->ahandle;
- int32_t code = -1;
+ pMsg->info.node = pMgmt->pMnode;
const STraceId *trace = &pMsg->info.traceId;
dGTrace("msg:%p, get from mnode queue", pMsg);
- switch (pMsg->msgType) {
- case TDMT_MON_MM_INFO:
- code = mmProcessGetMonitorInfoReq(pMgmt, pMsg);
- break;
- case TDMT_MON_MM_LOAD:
- code = mmProcessGetLoadsReq(pMgmt, pMsg);
- break;
- default:
- pMsg->info.node = pMgmt->pMnode;
- code = mndProcessRpcMsg(pMsg);
- }
+ int32_t code = mndProcessRpcMsg(pMsg);
if (IsReq(pMsg) && pMsg->info.handle != NULL && code != TSDB_CODE_ACTION_IN_PROGRESS) {
if (code != 0 && terrno != 0) code = terrno;
@@ -136,10 +126,6 @@ int32_t mmPutMsgToFetchQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
return mmPutMsgToWorker(pMgmt, &pMgmt->fetchWorker, pMsg);
}
-int32_t mmPutMsgToMonitorQueue(SMnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- return mmPutMsgToWorker(pMgmt, &pMgmt->monitorWorker, pMsg);
-}
-
int32_t mmPutMsgToQueue(SMnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
SSingleWorker *pWorker = NULL;
switch (qtype) {
@@ -237,18 +223,6 @@ int32_t mmStartWorker(SMnodeMgmt *pMgmt) {
return -1;
}
- SSingleWorkerCfg mCfg = {
- .min = 1,
- .max = 1,
- .name = "mnode-monitor",
- .fp = (FItem)mmProcessRpcMsg,
- .param = pMgmt,
- };
- if (tSingleWorkerInit(&pMgmt->monitorWorker, &mCfg) != 0) {
- dError("failed to start mnode mnode-monitor worker since %s", terrstr());
- return -1;
- }
-
dDebug("mnode workers are initialized");
return 0;
}
@@ -256,7 +230,6 @@ int32_t mmStartWorker(SMnodeMgmt *pMgmt) {
void mmStopWorker(SMnodeMgmt *pMgmt) {
while (pMgmt->refCount > 0) taosMsleep(10);
- tSingleWorkerCleanup(&pMgmt->monitorWorker);
tSingleWorkerCleanup(&pMgmt->queryWorker);
tSingleWorkerCleanup(&pMgmt->fetchWorker);
tSingleWorkerCleanup(&pMgmt->readWorker);
diff --git a/source/dnode/mgmt/mgmt_qnode/inc/qmInt.h b/source/dnode/mgmt/mgmt_qnode/inc/qmInt.h
index 56bf56f25e85a57140566bb20b9b252dae5b521a..c6c239bdcc8b3fa81830c5bed96f237767aabbb2 100644
--- a/source/dnode/mgmt/mgmt_qnode/inc/qmInt.h
+++ b/source/dnode/mgmt/mgmt_qnode/inc/qmInt.h
@@ -32,14 +32,12 @@ typedef struct SQnodeMgmt {
const char *name;
SSingleWorker queryWorker;
SSingleWorker fetchWorker;
- SSingleWorker monitorWorker;
} SQnodeMgmt;
// qmHandle.c
SArray *qmGetMsgHandles();
int32_t qmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
int32_t qmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
-int32_t qmProcessGetMonitorInfoReq(SQnodeMgmt *pMgmt, SRpcMsg *pMsg);
// qmWorker.c
int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pMsg);
@@ -49,7 +47,6 @@ int32_t qmStartWorker(SQnodeMgmt *pMgmt);
void qmStopWorker(SQnodeMgmt *pMgmt);
int32_t qmPutNodeMsgToQueryQueue(SQnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t qmPutNodeMsgToFetchQueue(SQnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t qmPutNodeMsgToMonitorQueue(SQnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t qndPreprocessQueryMsg(SQnode *pQnode, SRpcMsg *pMsg);
diff --git a/source/dnode/mgmt/mgmt_qnode/src/qmHandle.c b/source/dnode/mgmt/mgmt_qnode/src/qmHandle.c
index 6382152cd1a1877e35d943fb09e817af94c02ab0..5017ad7b741a5854e02433061f70b1967a038e62 100644
--- a/source/dnode/mgmt/mgmt_qnode/src/qmHandle.c
+++ b/source/dnode/mgmt/mgmt_qnode/src/qmHandle.c
@@ -29,34 +29,9 @@ void qmGetQnodeLoads(SQnodeMgmt *pMgmt, SQnodeLoad *pInfo) {
pInfo->dnodeId = pMgmt->pData->dnodeId;
}
-int32_t qmProcessGetMonitorInfoReq(SQnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonQmInfo qmInfo = {0};
- qmGetMonitorInfo(pMgmt, &qmInfo);
- dmGetMonitorSystemInfo(&qmInfo.sys);
- monGetLogs(&qmInfo.log);
-
- int32_t rspLen = tSerializeSMonQmInfo(NULL, 0, &qmInfo);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonQmInfo(pRsp, rspLen, &qmInfo);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- tFreeSMonQmInfo(&qmInfo);
- return 0;
-}
-
int32_t qmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
SDCreateQnodeReq createReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
@@ -78,7 +53,7 @@ int32_t qmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
int32_t qmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
SDDropQnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
@@ -103,8 +78,6 @@ SArray *qmGetMsgHandles() {
SArray *pArray = taosArrayInit(16, sizeof(SMgmtHandle));
if (pArray == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MON_QM_INFO, qmPutNodeMsgToMonitorQueue, 0) == NULL) goto _OVER;
-
// Requests handled by VNODE
if (dmSetMgmtHandle(pArray, TDMT_SCH_QUERY, qmPutNodeMsgToQueryQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SCH_MERGE_QUERY, qmPutNodeMsgToQueryQueue, 1) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c
index 66386b0ee0bc7fac510a0e9ceb1d1bab4ac649be..edbe9882a43232d48eee63966cc6ea3a3f61536e 100644
--- a/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c
+++ b/source/dnode/mgmt/mgmt_qnode/src/qmWorker.c
@@ -28,18 +28,9 @@ static inline void qmSendRsp(SRpcMsg *pMsg, int32_t code) {
static void qmProcessQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
SQnodeMgmt *pMgmt = pInfo->ahandle;
- int32_t code = -1;
dTrace("msg:%p, get from qnode queue", pMsg);
- switch (pMsg->msgType) {
- case TDMT_MON_QM_INFO:
- code = qmProcessGetMonitorInfoReq(pMgmt, pMsg);
- break;
- default:
- code = qndProcessQueryMsg(pMgmt->pQnode, pInfo->timestamp, pMsg);
- break;
- }
-
+ int32_t code = qndProcessQueryMsg(pMgmt->pQnode, pInfo->timestamp, pMsg);
if (IsReq(pMsg) && code != TSDB_CODE_ACTION_IN_PROGRESS) {
if (code != 0 && terrno != 0) code = terrno;
qmSendRsp(pMsg, code);
@@ -66,10 +57,6 @@ int32_t qmPutNodeMsgToFetchQueue(SQnodeMgmt *pMgmt, SRpcMsg *pMsg) {
return qmPutNodeMsgToWorker(&pMgmt->fetchWorker, pMsg);
}
-int32_t qmPutNodeMsgToMonitorQueue(SQnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- return qmPutNodeMsgToWorker(&pMgmt->monitorWorker, pMsg);
-}
-
int32_t qmPutRpcMsgToQueue(SQnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
if (pMsg == NULL) return -1;
@@ -136,24 +123,11 @@ int32_t qmStartWorker(SQnodeMgmt *pMgmt) {
return -1;
}
- SSingleWorkerCfg mCfg = {
- .min = 1,
- .max = 1,
- .name = "qnode-monitor",
- .fp = (FItem)qmProcessQueue,
- .param = pMgmt,
- };
- if (tSingleWorkerInit(&pMgmt->monitorWorker, &mCfg) != 0) {
- dError("failed to start qnode-monitor worker since %s", terrstr());
- return -1;
- }
-
dDebug("qnode workers are initialized");
return 0;
}
void qmStopWorker(SQnodeMgmt *pMgmt) {
- tSingleWorkerCleanup(&pMgmt->monitorWorker);
tSingleWorkerCleanup(&pMgmt->queryWorker);
tSingleWorkerCleanup(&pMgmt->fetchWorker);
dDebug("qnode workers are closed");
diff --git a/source/dnode/mgmt/mgmt_snode/inc/smInt.h b/source/dnode/mgmt/mgmt_snode/inc/smInt.h
index fbf63dda430cc6ead7fa9ea43e3ab010f265d512..4efe1c997b578a3397f1ab0fbcc39b612af123a8 100644
--- a/source/dnode/mgmt/mgmt_snode/inc/smInt.h
+++ b/source/dnode/mgmt/mgmt_snode/inc/smInt.h
@@ -33,14 +33,12 @@ typedef struct SSnodeMgmt {
int8_t uniqueWorkerInUse;
SArray *uniqueWorkers; // SArray
SSingleWorker sharedWorker;
- SSingleWorker monitorWorker;
} SSnodeMgmt;
// smHandle.c
SArray *smGetMsgHandles();
int32_t smProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
int32_t smProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg);
-int32_t smProcessGetMonitorInfoReq(SSnodeMgmt *pMgmt, SRpcMsg *pMsg);
// smWorker.c
int32_t smStartWorker(SSnodeMgmt *pMgmt);
@@ -49,7 +47,6 @@ int32_t smPutNodeMsgToMgmtQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t smPutNodeMsgToUniqueQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t smPutNodeMsgToSharedQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t smPutNodeMsgToExecQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t smPutNodeMsgToMonitorQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg);
#ifdef __cplusplus
}
diff --git a/source/dnode/mgmt/mgmt_snode/src/smHandle.c b/source/dnode/mgmt/mgmt_snode/src/smHandle.c
index 7cb41ca77cb77f7069ab8e375cef64840b058615..65c96767ab33edf6f1ddcb04aa76d276dc17e92f 100644
--- a/source/dnode/mgmt/mgmt_snode/src/smHandle.c
+++ b/source/dnode/mgmt/mgmt_snode/src/smHandle.c
@@ -18,34 +18,9 @@
void smGetMonitorInfo(SSnodeMgmt *pMgmt, SMonSmInfo *smInfo) {}
-int32_t smProcessGetMonitorInfoReq(SSnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonSmInfo smInfo = {0};
- smGetMonitorInfo(pMgmt, &smInfo);
- dmGetMonitorSystemInfo(&smInfo.sys);
- monGetLogs(&smInfo.log);
-
- int32_t rspLen = tSerializeSMonSmInfo(NULL, 0, &smInfo);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonSmInfo(pRsp, rspLen, &smInfo);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- tFreeSMonSmInfo(&smInfo);
- return 0;
-}
-
int32_t smProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
SDCreateSnodeReq createReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pMsg->pCont, pMsg->contLen, &createReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
@@ -67,7 +42,7 @@ int32_t smProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
int32_t smProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
SDDropSnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pMsg->pCont, pMsg->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
return -1;
}
@@ -92,8 +67,6 @@ SArray *smGetMsgHandles() {
SArray *pArray = taosArrayInit(4, sizeof(SMgmtHandle));
if (pArray == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MON_SM_INFO, smPutNodeMsgToMonitorQueue, 0) == NULL) goto _OVER;
-
if (dmSetMgmtHandle(pArray, TDMT_STREAM_TASK_DEPLOY, smPutNodeMsgToMgmtQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_STREAM_TASK_DROP, smPutNodeMsgToMgmtQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_STREAM_TASK_RUN, smPutNodeMsgToSharedQueue, 1) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_snode/src/smWorker.c b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
index 19c1b9b5c7afd9d1726b364ee69d94619f471d2d..ad56d57f69472f5101c7149118fbb95c4a05b5f2 100644
--- a/source/dnode/mgmt/mgmt_snode/src/smWorker.c
+++ b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
@@ -26,27 +26,6 @@ static inline void smSendRsp(SRpcMsg *pMsg, int32_t code) {
tmsgSendRsp(&rsp);
}
-static void smProcessMonitorQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
- SSnodeMgmt *pMgmt = pInfo->ahandle;
- int32_t code = -1;
- dTrace("msg:%p, get from snode-monitor queue", pMsg);
-
- if (pMsg->msgType == TDMT_MON_SM_INFO) {
- code = smProcessGetMonitorInfoReq(pMgmt, pMsg);
- } else {
- terrno = TSDB_CODE_MSG_NOT_PROCESSED;
- }
-
- if (IsReq(pMsg)) {
- if (code != 0 && terrno != 0) code = terrno;
- smSendRsp(pMsg, code);
- }
-
- dTrace("msg:%p, is freed, code:0x%x", pMsg, code);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
-}
-
static void smProcessUniqueQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
SSnodeMgmt *pMgmt = pInfo->ahandle;
@@ -123,24 +102,11 @@ int32_t smStartWorker(SSnodeMgmt *pMgmt) {
return -1;
}
- SSingleWorkerCfg mCfg = {
- .min = 1,
- .max = 1,
- .name = "snode-monitor",
- .fp = (FItem)smProcessMonitorQueue,
- .param = pMgmt,
- };
- if (tSingleWorkerInit(&pMgmt->monitorWorker, &mCfg) != 0) {
- dError("failed to start snode-monitor worker since %s", terrstr());
- return -1;
- }
-
dDebug("snode workers are initialized");
return 0;
}
void smStopWorker(SSnodeMgmt *pMgmt) {
- tSingleWorkerCleanup(&pMgmt->monitorWorker);
for (int32_t i = 0; i < taosArrayGetSize(pMgmt->uniqueWorkers); i++) {
SMultiWorker *pWorker = taosArrayGetP(pMgmt->uniqueWorkers, i);
tMultiWorkerCleanup(pWorker);
@@ -175,14 +141,6 @@ int32_t smPutNodeMsgToMgmtQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg) {
return 0;
}
-int32_t smPutNodeMsgToMonitorQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SSingleWorker *pWorker = &pMgmt->monitorWorker;
-
- dTrace("msg:%p, put into worker %s", pMsg, pWorker->name);
- taosWriteQitem(pWorker->queue, pMsg);
- return 0;
-}
-
int32_t smPutNodeMsgToUniqueQueue(SSnodeMgmt *pMgmt, SRpcMsg *pMsg) {
int32_t index = smGetSWIdFromMsg(pMsg);
SMultiWorker *pWorker = taosArrayGetP(pMgmt->uniqueWorkers, index);
diff --git a/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h b/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
index 30f54831987999daccac93f5b6cbd0ccc2dfbf28..1bd68e6d419dab5e7f61f35209de6c3175f7a7f4 100644
--- a/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
+++ b/source/dnode/mgmt/mgmt_vnode/inc/vmInt.h
@@ -34,10 +34,10 @@ typedef struct SVnodeMgmt {
SQWorkerPool streamPool;
SWWorkerPool fetchPool;
SWWorkerPool syncPool;
+ SWWorkerPool syncCtrlPool;
SWWorkerPool writePool;
SWWorkerPool applyPool;
SSingleWorker mgmtWorker;
- SSingleWorker monitorWorker;
SHashObj *hash;
TdThreadRwlock lock;
SVnodesStat state;
@@ -60,6 +60,7 @@ typedef struct {
SVnode *pImpl;
STaosQueue *pWriteQ;
STaosQueue *pSyncQ;
+ STaosQueue *pSyncCtrlQ;
STaosQueue *pApplyQ;
STaosQueue *pQueryQ;
STaosQueue *pStreamQ;
@@ -87,8 +88,6 @@ void vmCloseVnode(SVnodeMgmt *pMgmt, SVnodeObj *pVnode);
SArray *vmGetMsgHandles();
int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmProcessDropVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t vmProcessGetMonitorInfoReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t vmProcessGetLoadsReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
// vmFile.c
int32_t vmGetVnodeListFromFile(SVnodeMgmt *pMgmt, SWrapperCfg **ppCfgs, int32_t *numOfVnodes);
@@ -106,12 +105,12 @@ int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc);
int32_t vmPutMsgToWriteQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmPutMsgToSyncQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
+int32_t vmPutMsgToSyncCtrlQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmPutMsgToQueryQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmPutMsgToFetchQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmPutMsgToStreamQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmPutMsgToMergeQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
int32_t vmPutMsgToMgmtQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
-int32_t vmPutMsgToMonitorQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg);
#ifdef __cplusplus
}
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
index 0e53b7ca80fad5db6fedec880e495965b90e25a6..c92b6c4c4d09b8780d8b8c798762bb9600fa306a 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
@@ -83,54 +83,6 @@ void vmGetMonitorInfo(SVnodeMgmt *pMgmt, SMonVmInfo *pInfo) {
taosArrayDestroy(pVloads);
}
-int32_t vmProcessGetMonitorInfoReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonVmInfo vmInfo = {0};
- vmGetMonitorInfo(pMgmt, &vmInfo);
- dmGetMonitorSystemInfo(&vmInfo.sys);
- monGetLogs(&vmInfo.log);
-
- int32_t rspLen = tSerializeSMonVmInfo(NULL, 0, &vmInfo);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonVmInfo(pRsp, rspLen, &vmInfo);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- tFreeSMonVmInfo(&vmInfo);
- return 0;
-}
-
-int32_t vmProcessGetLoadsReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- SMonVloadInfo vloads = {0};
- vmGetVnodeLoads(pMgmt, &vloads, false);
-
- int32_t rspLen = tSerializeSMonVloadInfo(NULL, 0, &vloads);
- if (rspLen < 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- return -1;
- }
-
- void *pRsp = rpcMallocCont(rspLen);
- if (pRsp == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- tSerializeSMonVloadInfo(pRsp, rspLen, &vloads);
- pMsg->info.rsp = pRsp;
- pMsg->info.rspLen = rspLen;
- tFreeSMonVloadInfo(&vloads);
- return 0;
-}
-
static void vmGenerateVnodeCfg(SCreateVnodeReq *pCreate, SVnodeCfg *pCfg) {
memcpy(pCfg, &vnodeCfgDefault, sizeof(SVnodeCfg));
@@ -348,9 +300,6 @@ SArray *vmGetMsgHandles() {
SArray *pArray = taosArrayInit(32, sizeof(SMgmtHandle));
if (pArray == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MON_VM_INFO, vmPutMsgToMonitorQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MON_VM_LOAD, vmPutMsgToMonitorQueue, 0) == NULL) goto _OVER;
-
if (dmSetMgmtHandle(pArray, TDMT_VND_SUBMIT, vmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SCH_QUERY, vmPutMsgToQueryQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SCH_MERGE_QUERY, vmPutMsgToQueryQueue, 0) == NULL) goto _OVER;
@@ -422,6 +371,8 @@ SArray *vmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_SEND, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SET_VNODE_STANDBY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, vmPutMsgToSyncCtrlQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, vmPutMsgToSyncCtrlQueue, 0) == NULL) goto _OVER;
code = 0;
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c
index bcc2e358d6a1f4d1c4b1b7d2352734ff78df609c..f825407b4574c8b911f81b38300175ee560433da 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmInt.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmInt.c
@@ -217,17 +217,80 @@ static int32_t vmOpenVnodes(SVnodeMgmt *pMgmt) {
}
}
+static void *vmCloseVnodeInThread(void *param) {
+ SVnodeThread *pThread = param;
+ SVnodeMgmt *pMgmt = pThread->pMgmt;
+
+ dInfo("thread:%d, start to close %d vnodes", pThread->threadIndex, pThread->vnodeNum);
+ setThreadName("close-vnodes");
+
+ for (int32_t v = 0; v < pThread->vnodeNum; ++v) {
+ SVnodeObj *pVnode = pThread->ppVnodes[v];
+
+ char stepDesc[TSDB_STEP_DESC_LEN] = {0};
+ snprintf(stepDesc, TSDB_STEP_DESC_LEN, "vgId:%d, start to close, %d of %d have been closed", pVnode->vgId,
+ pMgmt->state.openVnodes, pMgmt->state.totalVnodes);
+ tmsgReportStartup("vnode-close", stepDesc);
+
+ vmCloseVnode(pMgmt, pVnode);
+ }
+
+ dInfo("thread:%d, numOfVnodes:%d is closed", pThread->threadIndex, pThread->vnodeNum);
+ return NULL;
+}
+
static void vmCloseVnodes(SVnodeMgmt *pMgmt) {
dInfo("start to close all vnodes");
int32_t numOfVnodes = 0;
SVnodeObj **ppVnodes = vmGetVnodeListFromHash(pMgmt, &numOfVnodes);
- for (int32_t i = 0; i < numOfVnodes; ++i) {
- if (ppVnodes == NULL || ppVnodes[i] == NULL) continue;
- vmCloseVnode(pMgmt, ppVnodes[i]);
+ int32_t threadNum = tsNumOfCores / 2;
+ if (threadNum < 1) threadNum = 1;
+ int32_t vnodesPerThread = numOfVnodes / threadNum + 1;
+
+ SVnodeThread *threads = taosMemoryCalloc(threadNum, sizeof(SVnodeThread));
+ for (int32_t t = 0; t < threadNum; ++t) {
+ threads[t].threadIndex = t;
+ threads[t].pMgmt = pMgmt;
+ threads[t].ppVnodes = taosMemoryCalloc(vnodesPerThread, sizeof(SVnode *));
+ }
+
+ for (int32_t v = 0; v < numOfVnodes; ++v) {
+ int32_t t = v % threadNum;
+ SVnodeThread *pThread = &threads[t];
+ if (pThread->ppVnodes != NULL && ppVnodes != NULL) {
+ pThread->ppVnodes[pThread->vnodeNum++] = ppVnodes[v];
+ }
}
+ pMgmt->state.openVnodes = 0;
+ dInfo("close %d vnodes with %d threads", numOfVnodes, threadNum);
+
+ for (int32_t t = 0; t < threadNum; ++t) {
+ SVnodeThread *pThread = &threads[t];
+ if (pThread->vnodeNum == 0) continue;
+
+ TdThreadAttr thAttr;
+ taosThreadAttrInit(&thAttr);
+ taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE);
+ if (taosThreadCreate(&pThread->thread, &thAttr, vmCloseVnodeInThread, pThread) != 0) {
+ dError("thread:%d, failed to create thread to close vnode since %s", pThread->threadIndex, strerror(errno));
+ }
+
+ taosThreadAttrDestroy(&thAttr);
+ }
+
+ for (int32_t t = 0; t < threadNum; ++t) {
+ SVnodeThread *pThread = &threads[t];
+ if (pThread->vnodeNum > 0 && taosCheckPthreadValid(pThread->thread)) {
+ taosThreadJoin(pThread->thread, NULL);
+ taosThreadClear(&pThread->thread);
+ }
+ taosMemoryFree(pThread->ppVnodes);
+ }
+ taosMemoryFree(threads);
+
if (ppVnodes != NULL) {
taosMemoryFree(ppVnodes);
}
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
index d7df30bc7587cada18a308176e2fc739c1679afa..fd1dbe00cef612a1264454043a6972a8fe8f183a 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
@@ -34,12 +34,6 @@ static void vmProcessMgmtQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
dGTrace("msg:%p, get from vnode-mgmt queue", pMsg);
switch (pMsg->msgType) {
- case TDMT_MON_VM_INFO:
- code = vmProcessGetMonitorInfoReq(pMgmt, pMsg);
- break;
- case TDMT_MON_VM_LOAD:
- code = vmProcessGetLoadsReq(pMgmt, pMsg);
- break;
case TDMT_DND_CREATE_VNODE:
code = vmProcessCreateVnodeReq(pMgmt, pMsg);
break;
@@ -136,6 +130,22 @@ static void vmProcessSyncQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOf
}
}
+static void vmProcessSyncCtrlQueue(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
+ SVnodeObj *pVnode = pInfo->ahandle;
+ SRpcMsg *pMsg = NULL;
+
+ for (int32_t i = 0; i < numOfMsgs; ++i) {
+ if (taosGetQitem(qall, (void **)&pMsg) == 0) continue;
+ const STraceId *trace = &pMsg->info.traceId;
+ dGTrace("vgId:%d, msg:%p get from vnode-sync queue", pVnode->vgId, pMsg);
+
+ int32_t code = vnodeProcessSyncCtrlMsg(pVnode->pImpl, pMsg, NULL); // no response here
+ dGTrace("vgId:%d, msg:%p is freed, code:0x%x", pVnode->vgId, pMsg, code);
+ rpcFreeCont(pMsg->pCont);
+ taosFreeQitem(pMsg);
+ }
+}
+
static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtype) {
const STraceId *trace = &pMsg->info.traceId;
SMsgHead *pHead = pMsg->pCont;
@@ -203,6 +213,10 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
dGTrace("vgId:%d, msg:%p put into vnode-sync queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pSyncQ, pMsg);
break;
+ case SYNC_CTRL_QUEUE:
+ dGTrace("vgId:%d, msg:%p put into vnode-sync-ctrl queue", pVnode->vgId, pMsg);
+ taosWriteQitem(pVnode->pSyncCtrlQ, pMsg);
+ break;
case APPLY_QUEUE:
dGTrace("vgId:%d, msg:%p put into vnode-apply queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pApplyQ, pMsg);
@@ -219,6 +233,10 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
int32_t vmPutMsgToSyncQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, SYNC_QUEUE); }
+int32_t vmPutMsgToSyncCtrlQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
+ return vmPutMsgToQueue(pMgmt, pMsg, SYNC_CTRL_QUEUE);
+}
+
int32_t vmPutMsgToWriteQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, WRITE_QUEUE); }
int32_t vmPutMsgToQueryQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) { return vmPutMsgToQueue(pMgmt, pMsg, QUERY_QUEUE); }
@@ -234,13 +252,6 @@ int32_t vmPutMsgToMgmtQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
return 0;
}
-int32_t vmPutMsgToMonitorQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
- const STraceId *trace = &pMsg->info.traceId;
- dGTrace("msg:%p, put into vnode-monitor queue", pMsg);
- taosWriteQitem(pMgmt->monitorWorker.queue, pMsg);
- return 0;
-}
-
int32_t vmPutRpcMsgToQueue(SVnodeMgmt *pMgmt, EQueueType qtype, SRpcMsg *pRpc) {
SRpcMsg *pMsg = taosAllocateQitem(sizeof(SRpcMsg), RPC_QITEM);
if (pMsg == NULL) {
@@ -301,6 +312,7 @@ int32_t vmGetQueueSize(SVnodeMgmt *pMgmt, int32_t vgId, EQueueType qtype) {
int32_t vmAllocQueue(SVnodeMgmt *pMgmt, SVnodeObj *pVnode) {
pVnode->pWriteQ = tWWorkerAllocQueue(&pMgmt->writePool, pVnode->pImpl, (FItems)vnodeProposeWriteMsg);
pVnode->pSyncQ = tWWorkerAllocQueue(&pMgmt->syncPool, pVnode, (FItems)vmProcessSyncQueue);
+ pVnode->pSyncCtrlQ = tWWorkerAllocQueue(&pMgmt->syncCtrlPool, pVnode, (FItems)vmProcessSyncCtrlQueue);
pVnode->pApplyQ = tWWorkerAllocQueue(&pMgmt->applyPool, pVnode->pImpl, (FItems)vnodeApplyWriteMsg);
pVnode->pQueryQ = tQWorkerAllocQueue(&pMgmt->queryPool, pVnode, (FItem)vmProcessQueryQueue);
pVnode->pStreamQ = tQWorkerAllocQueue(&pMgmt->streamPool, pVnode, (FItem)vmProcessStreamQueue);
@@ -325,6 +337,7 @@ void vmFreeQueue(SVnodeMgmt *pMgmt, SVnodeObj *pVnode) {
tWWorkerFreeQueue(&pMgmt->writePool, pVnode->pWriteQ);
tWWorkerFreeQueue(&pMgmt->applyPool, pVnode->pApplyQ);
tWWorkerFreeQueue(&pMgmt->syncPool, pVnode->pSyncQ);
+ tWWorkerFreeQueue(&pMgmt->syncCtrlPool, pVnode->pSyncCtrlQ);
tQWorkerFreeQueue(&pMgmt->queryPool, pVnode->pQueryQ);
tQWorkerFreeQueue(&pMgmt->streamPool, pVnode->pStreamQ);
tWWorkerFreeQueue(&pMgmt->fetchPool, pVnode->pFetchQ);
@@ -370,6 +383,11 @@ int32_t vmStartWorker(SVnodeMgmt *pMgmt) {
pSPool->max = tsNumOfVnodeSyncThreads;
if (tWWorkerInit(pSPool) != 0) return -1;
+ SWWorkerPool *pSCPool = &pMgmt->syncCtrlPool;
+ pSCPool->name = "vnode-sync-ctrl";
+ pSCPool->max = tsNumOfVnodeSyncThreads;
+ if (tWWorkerInit(pSCPool) != 0) return -1;
+
SSingleWorkerCfg mgmtCfg = {
.min = 1,
.max = 1,
@@ -379,25 +397,16 @@ int32_t vmStartWorker(SVnodeMgmt *pMgmt) {
};
if (tSingleWorkerInit(&pMgmt->mgmtWorker, &mgmtCfg) != 0) return -1;
- SSingleWorkerCfg monitorCfg = {
- .min = 1,
- .max = 1,
- .name = "vnode-monitor",
- .fp = (FItem)vmProcessMgmtQueue,
- .param = pMgmt,
- };
- if (tSingleWorkerInit(&pMgmt->monitorWorker, &monitorCfg) != 0) return -1;
-
dDebug("vnode workers are initialized");
return 0;
}
void vmStopWorker(SVnodeMgmt *pMgmt) {
- tSingleWorkerCleanup(&pMgmt->monitorWorker);
tSingleWorkerCleanup(&pMgmt->mgmtWorker);
tWWorkerCleanup(&pMgmt->writePool);
tWWorkerCleanup(&pMgmt->applyPool);
tWWorkerCleanup(&pMgmt->syncPool);
+ tWWorkerCleanup(&pMgmt->syncCtrlPool);
tQWorkerCleanup(&pMgmt->queryPool);
tQWorkerCleanup(&pMgmt->streamPool);
tWWorkerCleanup(&pMgmt->fetchPool);
diff --git a/source/dnode/mgmt/node_mgmt/CMakeLists.txt b/source/dnode/mgmt/node_mgmt/CMakeLists.txt
index 98027d80d4af858eef2a2108ef6d19b4b1851883..f1be20289a88c52726ac2b9187e5d23ba90ff616 100644
--- a/source/dnode/mgmt/node_mgmt/CMakeLists.txt
+++ b/source/dnode/mgmt/node_mgmt/CMakeLists.txt
@@ -1,7 +1,7 @@
aux_source_directory(src IMPLEMENT_SRC)
add_library(dnode STATIC ${IMPLEMENT_SRC})
target_link_libraries(
- dnode mgmt_bnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode
+ dnode mgmt_mnode mgmt_qnode mgmt_snode mgmt_vnode mgmt_dnode
)
target_include_directories(
dnode
diff --git a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h
index adde0557965fb7651c66a8b4791d4a671db91201..7e85e6b72239260d13aba44306309cd2528c3364 100644
--- a/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h
+++ b/source/dnode/mgmt/node_mgmt/inc/dmMgmt.h
@@ -25,44 +25,6 @@
extern "C" {
#endif
-typedef struct SMgmtWrapper SMgmtWrapper;
-
-#define SINGLE_PROC 0
-#define CHILD_PROC 1
-#define PARENT_PROC 2
-#define TEST_PROC 3
-#define OnlyInSingleProc(wrapper) ((wrapper)->proc.ptype == SINGLE_PROC)
-#define OnlyInChildProc(wrapper) ((wrapper)->proc.ptype == CHILD_PROC)
-#define OnlyInParentProc(wrapper) ((wrapper)->proc.ptype == PARENT_PROC)
-#define InChildProc(wrapper) ((wrapper)->proc.ptype & CHILD_PROC)
-#define InParentProc(wrapper) ((wrapper)->proc.ptype & PARENT_PROC)
-
-typedef struct {
- int32_t head;
- int32_t tail;
- int32_t total;
- int32_t avail;
- int32_t items;
- char name[8];
- TdThreadMutex mutex;
- tsem_t sem;
- char pBuffer[];
-} SProcQueue;
-
-typedef struct {
- SMgmtWrapper *wrapper;
- const char *name;
- SHashObj *hash;
- SProcQueue *pqueue;
- SProcQueue *cqueue;
- TdThread pthread;
- TdThread cthread;
- SShm shm;
- int32_t pid;
- EDndProcType ptype;
- bool stop;
-} SProc;
-
typedef struct SMgmtWrapper {
SMgmtFunc func;
struct SDnode *pDnode;
@@ -74,7 +36,6 @@ typedef struct SMgmtWrapper {
EDndNodeType ntype;
bool deployed;
bool required;
- SProc proc;
NodeMsgFp msgFps[TDMT_MAX];
} SMgmtWrapper;
@@ -111,8 +72,6 @@ typedef struct SUdfdData {
typedef struct SDnode {
int8_t once;
bool stop;
- EDndProcType ptype;
- EDndNodeType rtype;
EDndRunStatus status;
SStartupInfo startup;
SDnodeTrans trans;
@@ -128,7 +87,7 @@ SDnode *dmInstance();
void dmReportStartup(const char *pName, const char *pDesc);
// dmMgmt.c
-int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype);
+int32_t dmInitDnode(SDnode *pDnode);
void dmCleanupDnode(SDnode *pDnode);
SMgmtWrapper *dmAcquireWrapper(SDnode *pDnode, EDndNodeType nType);
int32_t dmMarkWrapper(SMgmtWrapper *pWrapper);
@@ -145,16 +104,6 @@ void dmStopNode(SMgmtWrapper *pWrapper);
void dmCloseNode(SMgmtWrapper *pWrapper);
int32_t dmRunDnode(SDnode *pDnode);
-// dmProc.c
-int32_t dmInitProc(struct SMgmtWrapper *pWrapper);
-void dmCleanupProc(struct SMgmtWrapper *pWrapper);
-int32_t dmRunProc(SProc *proc);
-void dmStopProc(SProc *proc);
-void dmRemoveProcRpcHandle(SProc *proc, void *handle);
-void dmCloseProcRpcHandles(SProc *proc);
-int32_t dmPutToProcCQueue(SProc *proc, SRpcMsg *pMsg, EProcFuncType ftype);
-void dmPutToProcPQueue(SProc *proc, SRpcMsg *pMsg, EProcFuncType ftype);
-
// dmTransport.c
int32_t dmInitServer(SDnode *pDnode);
void dmCleanupServer(SDnode *pDnode);
diff --git a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h
index d3f1044f8804dbb83a8aea3f2864246f976dbde5..5f363090389f3fe23ff130309e32091a3290cf29 100644
--- a/source/dnode/mgmt/node_mgmt/inc/dmNodes.h
+++ b/source/dnode/mgmt/node_mgmt/inc/dmNodes.h
@@ -23,7 +23,6 @@ extern "C" {
#endif
SMgmtFunc dmGetMgmtFunc();
-SMgmtFunc bmGetMgmtFunc();
SMgmtFunc qmGetMgmtFunc();
SMgmtFunc smGetMgmtFunc();
SMgmtFunc vmGetMgmtFunc();
diff --git a/source/dnode/mgmt/node_mgmt/src/dmEnv.c b/source/dnode/mgmt/node_mgmt/src/dmEnv.c
index 076826ebc2d0956aad14f8eeec27a574425788b1..a222ad3f7da738c8f2f9a84ac4f9463ae309b5d5 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmEnv.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmEnv.c
@@ -51,20 +51,44 @@ static int32_t dmInitMonitor() {
static bool dmCheckDiskSpace() {
osUpdate();
+ // sufficiency
if (!osDataSpaceSufficient()) {
- dWarn("free data disk size: %f GB, not sufficient, expected %f GB at least", (double)tsDataSpace.size.avail / 1024.0 / 1024.0 / 1024.0, (double)tsDataSpace.reserved / 1024.0 / 1024.0 / 1024.0);
+ dWarn("free data disk size: %f GB, not sufficient, expected %f GB at least",
+ (double)tsDataSpace.size.avail / 1024.0 / 1024.0 / 1024.0,
+ (double)tsDataSpace.reserved / 1024.0 / 1024.0 / 1024.0);
}
if (!osLogSpaceSufficient()) {
- dWarn("free log disk size: %f GB, not sufficient, expected %f GB at least", (double)tsLogSpace.size.avail / 1024.0 / 1024.0 / 1024.0, (double)tsLogSpace.reserved / 1024.0 / 1024.0 / 1024.0);
+ dWarn("free log disk size: %f GB, not sufficient, expected %f GB at least",
+ (double)tsLogSpace.size.avail / 1024.0 / 1024.0 / 1024.0,
+ (double)tsLogSpace.reserved / 1024.0 / 1024.0 / 1024.0);
}
if (!osTempSpaceSufficient()) {
- dWarn("free temp disk size: %f GB, not sufficient, expected %f GB at least", (double)tsTempSpace.size.avail / 1024.0 / 1024.0 / 1024.0, (double)tsTempSpace.reserved / 1024.0 / 1024.0 / 1024.0);
+ dWarn("free temp disk size: %f GB, not sufficient, expected %f GB at least",
+ (double)tsTempSpace.size.avail / 1024.0 / 1024.0 / 1024.0,
+ (double)tsTempSpace.reserved / 1024.0 / 1024.0 / 1024.0);
}
- return true;
+ // availability
+ bool ret = true;
+ if (!osDataSpaceAvailable()) {
+ dError("data disk space unavailable, i.e. %s", tsDataDir);
+ terrno = TSDB_CODE_VND_NO_DISKSPACE;
+ ret = false;
+ }
+ if (!osLogSpaceAvailable()) {
+ dError("log disk space unavailable, i.e. %s", tsLogDir);
+ terrno = TSDB_CODE_VND_NO_DISKSPACE;
+ ret = false;
+ }
+ if (!osTempSpaceAvailable()) {
+ dError("temp disk space unavailable, i.e. %s", tsTempDir);
+ terrno = TSDB_CODE_VND_NO_DISKSPACE;
+ ret = false;
+ }
+ return ret;
}
static bool dmCheckDataDirVersion() {
- char checkDataDirJsonFileName[PATH_MAX];
+ char checkDataDirJsonFileName[PATH_MAX] = {0};
snprintf(checkDataDirJsonFileName, PATH_MAX, "%s/dnode/dnodeCfg.json", tsDataDir);
if (taosCheckExistFile(checkDataDirJsonFileName)) {
dError("The default data directory %s contains old data of tdengine 2.x, please clear it before running!",
@@ -74,14 +98,14 @@ static bool dmCheckDataDirVersion() {
return true;
}
-int32_t dmInit(int8_t rtype) {
+int32_t dmInit() {
dInfo("start to init dnode env");
if (!dmCheckDataDirVersion()) return -1;
if (!dmCheckDiskSpace()) return -1;
if (dmCheckRepeatInit(dmInstance()) != 0) return -1;
if (dmInitSystem() != 0) return -1;
if (dmInitMonitor() != 0) return -1;
- if (dmInitDnode(dmInstance(), rtype) != 0) return -1;
+ if (dmInitDnode(dmInstance()) != 0) return -1;
dInfo("dnode env is initialized");
return 0;
@@ -108,8 +132,8 @@ void dmCleanup() {
taosStopCacheRefreshWorker();
dInfo("dnode env is cleaned up");
- taosCloseLog();
taosCleanupCfg();
+ taosCloseLog();
}
void dmStop() {
@@ -156,7 +180,6 @@ static int32_t dmProcessCreateNodeReq(EDndNodeType ntype, SRpcMsg *pMsg) {
}
pWrapper->deployed = true;
pWrapper->required = true;
- pWrapper->proc.ptype = pDnode->ptype;
}
taosThreadMutexUnlock(&pDnode->mutex);
diff --git a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c
index 2e149be3b6f74fd3d3cf6d9c9b4ab60bddeed94f..2c9020b668550a914cdd7e235ad2c5242af36057 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmMgmt.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmMgmt.c
@@ -26,47 +26,14 @@ static bool dmRequireNode(SDnode *pDnode, SMgmtWrapper *pWrapper) {
int32_t code = (*pWrapper->func.requiredFp)(&input, &required);
if (!required) {
dDebug("node:%s, does not require startup", pWrapper->name);
- }
-
- if (pWrapper->ntype == DNODE) {
- if (pDnode->rtype != DNODE && pDnode->rtype != NODE_END) {
- required = false;
- dDebug("node:%s, does not require startup in child process", pWrapper->name);
- }
} else {
- if (OnlyInChildProc(pWrapper)) {
- if (pWrapper->ntype != pDnode->rtype) {
- dDebug("node:%s, does not require startup in child process", pWrapper->name);
- required = false;
- }
- }
- }
-
- if (required) {
dDebug("node:%s, required to startup", pWrapper->name);
}
return required;
}
-static int32_t dmInitVars(SDnode *pDnode, EDndNodeType rtype) {
- pDnode->rtype = rtype;
-
- if (tsMultiProcess == 0) {
- pDnode->ptype = DND_PROC_SINGLE;
- dInfo("dnode will run in single-process mode");
- } else if (tsMultiProcess > 1) {
- pDnode->ptype = DND_PROC_TEST;
- dInfo("dnode will run in multi-process test mode");
- } else if (pDnode->rtype == DNODE || pDnode->rtype == NODE_END) {
- pDnode->ptype = DND_PROC_PARENT;
- dInfo("dnode will run in parent-process mode");
- } else {
- pDnode->ptype = DND_PROC_CHILD;
- SMgmtWrapper *pWrapper = &pDnode->wrappers[pDnode->rtype];
- dInfo("dnode will run in child-process mode, node:%s", dmNodeName(pDnode->rtype));
- }
-
+static int32_t dmInitVars(SDnode *pDnode) {
SDnodeData *pData = &pDnode->data;
pData->dnodeId = 0;
pData->clusterId = 0;
@@ -127,12 +94,12 @@ static void dmClearVars(SDnode *pDnode) {
memset(&pDnode->mutex, 0, sizeof(pDnode->mutex));
}
-int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype) {
+int32_t dmInitDnode(SDnode *pDnode) {
dDebug("start to create dnode");
int32_t code = -1;
char path[PATH_MAX + 100] = {0};
- if (dmInitVars(pDnode, rtype) != 0) {
+ if (dmInitVars(pDnode) != 0) {
goto _OVER;
}
@@ -141,20 +108,12 @@ int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype) {
pDnode->wrappers[VNODE].func = vmGetMgmtFunc();
pDnode->wrappers[QNODE].func = qmGetMgmtFunc();
pDnode->wrappers[SNODE].func = smGetMgmtFunc();
- pDnode->wrappers[BNODE].func = bmGetMgmtFunc();
for (EDndNodeType ntype = DNODE; ntype < NODE_END; ++ntype) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
pWrapper->pDnode = pDnode;
pWrapper->name = dmNodeName(ntype);
pWrapper->ntype = ntype;
- pWrapper->proc.wrapper = pWrapper;
- pWrapper->proc.shm.id = -1;
- pWrapper->proc.pid = -1;
- pWrapper->proc.ptype = pDnode->ptype;
- if (ntype == DNODE) {
- pWrapper->proc.ptype = DND_PROC_SINGLE;
- }
taosThreadRwlockInit(&pWrapper->lock, NULL);
snprintf(path, sizeof(path), "%s%s%s", tsDataDir, TD_DIRSEP, pWrapper->name);
@@ -165,11 +124,6 @@ int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype) {
}
pWrapper->required = dmRequireNode(pDnode, pWrapper);
-
- if (ntype != DNODE && dmReadShmFile(pWrapper->path, pWrapper->name, pDnode->rtype, &pWrapper->proc.shm) != 0) {
- dError("node:%s, failed to read shm file since %s", pWrapper->name, terrstr());
- goto _OVER;
- }
}
if (dmInitMsgHandle(pDnode) != 0) {
@@ -177,16 +131,14 @@ int32_t dmInitDnode(SDnode *pDnode, EDndNodeType rtype) {
goto _OVER;
}
- if (pDnode->ptype == SINGLE_PROC || (pDnode->ptype & PARENT_PROC)) {
- pDnode->lockfile = dmCheckRunning(tsDataDir);
- if (pDnode->lockfile == NULL) {
- goto _OVER;
- }
+ pDnode->lockfile = dmCheckRunning(tsDataDir);
+ if (pDnode->lockfile == NULL) {
+ goto _OVER;
+ }
- if (dmInitServer(pDnode) != 0) {
- dError("failed to init transport since %s", terrstr());
- goto _OVER;
- }
+ if (dmInitServer(pDnode) != 0) {
+ dError("failed to init transport since %s", terrstr());
+ goto _OVER;
}
if (dmInitClient(pDnode) != 0) {
@@ -249,7 +201,7 @@ int32_t dmMarkWrapper(SMgmtWrapper *pWrapper) {
int32_t code = 0;
taosThreadRwlockRdlock(&pWrapper->lock);
- if (pWrapper->deployed || (InParentProc(pWrapper) && pWrapper->required)) {
+ if (pWrapper->deployed) {
int32_t refCount = atomic_add_fetch_32(&pWrapper->refCount, 1);
// dTrace("node:%s, is marked, ref:%d", pWrapper->name, refCount);
} else {
diff --git a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c
index 1c71fe5e1f00535b5938f2416cffc5cbca1a12b8..4ab56ed682c4c868d6db45dded6345e81d8c8915 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmMonitor.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmMonitor.c
@@ -17,18 +17,6 @@
#include "dmMgmt.h"
#include "dmNodes.h"
-#define dmSendLocalRecv(pDnode, mtype, func, pInfo) \
- SRpcMsg rsp = {0}; \
- SRpcMsg req = {.msgType = mtype}; \
- SEpSet epset = {.inUse = 0, .numOfEps = 1}; \
- tstrncpy(epset.eps[0].fqdn, tsLocalFqdn, TSDB_FQDN_LEN); \
- epset.eps[0].port = tsServerPort; \
- rpcSendRecv(pDnode->trans.clientRpc, &epset, &req, &rsp); \
- if (rsp.code == 0 && rsp.contLen > 0) { \
- func(rsp.pCont, rsp.contLen, pInfo); \
- } \
- rpcFreeCont(rsp.pCont);
-
static void dmGetMonitorBasicInfo(SDnode *pDnode, SMonBasicInfo *pInfo) {
pInfo->protocol = 1;
pInfo->dnode_id = pDnode->data.dnodeId;
@@ -41,7 +29,6 @@ static void dmGetMonitorDnodeInfo(SDnode *pDnode, SMonDnodeInfo *pInfo) {
pInfo->has_mnode = pDnode->wrappers[MNODE].required;
pInfo->has_qnode = pDnode->wrappers[QNODE].required;
pInfo->has_snode = pDnode->wrappers[SNODE].required;
- pInfo->has_bnode = pDnode->wrappers[BNODE].required;
tstrncpy(pInfo->logdir.name, tsLogDir, sizeof(pInfo->logdir.name));
pInfo->logdir.size = tsLogSpace.size;
tstrncpy(pInfo->tempdir.name, tsTempDir, sizeof(pInfo->tempdir.name));
@@ -60,9 +47,7 @@ static void dmGetMmMonitorInfo(SDnode *pDnode) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[MNODE];
if (dmMarkWrapper(pWrapper) == 0) {
SMonMmInfo mmInfo = {0};
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_MM_INFO, tDeserializeSMonMmInfo, &mmInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
mmGetMonitorInfo(pWrapper->pMgmt, &mmInfo);
}
dmReleaseWrapper(pWrapper);
@@ -75,9 +60,7 @@ static void dmGetVmMonitorInfo(SDnode *pDnode) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[VNODE];
if (dmMarkWrapper(pWrapper) == 0) {
SMonVmInfo vmInfo = {0};
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_VM_INFO, tDeserializeSMonVmInfo, &vmInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
vmGetMonitorInfo(pWrapper->pMgmt, &vmInfo);
}
dmReleaseWrapper(pWrapper);
@@ -90,9 +73,7 @@ static void dmGetQmMonitorInfo(SDnode *pDnode) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[QNODE];
if (dmMarkWrapper(pWrapper) == 0) {
SMonQmInfo qmInfo = {0};
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_QM_INFO, tDeserializeSMonQmInfo, &qmInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
qmGetMonitorInfo(pWrapper->pMgmt, &qmInfo);
}
dmReleaseWrapper(pWrapper);
@@ -105,9 +86,7 @@ static void dmGetSmMonitorInfo(SDnode *pDnode) {
SMgmtWrapper *pWrapper = &pDnode->wrappers[SNODE];
if (dmMarkWrapper(pWrapper) == 0) {
SMonSmInfo smInfo = {0};
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_SM_INFO, tDeserializeSMonSmInfo, &smInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
smGetMonitorInfo(pWrapper->pMgmt, &smInfo);
}
dmReleaseWrapper(pWrapper);
@@ -116,21 +95,6 @@ static void dmGetSmMonitorInfo(SDnode *pDnode) {
}
}
-static void dmGetBmMonitorInfo(SDnode *pDnode) {
- SMgmtWrapper *pWrapper = &pDnode->wrappers[BNODE];
- if (dmMarkWrapper(pWrapper) == 0) {
- SMonBmInfo bmInfo = {0};
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_BM_INFO, tDeserializeSMonBmInfo, &bmInfo);
- } else if (pWrapper->pMgmt != NULL) {
- bmGetMonitorInfo(pWrapper->pMgmt, &bmInfo);
- }
- dmReleaseWrapper(pWrapper);
- monSetBmInfo(&bmInfo);
- tFreeSMonBmInfo(&bmInfo);
- }
-}
-
void dmSendMonitorReport() {
if (!tsEnableMonitor || tsMonitorFqdn[0] == 0 || tsMonitorPort == 0) return;
dTrace("send monitor report to %s:%u", tsMonitorFqdn, tsMonitorPort);
@@ -141,7 +105,6 @@ void dmSendMonitorReport() {
dmGetVmMonitorInfo(pDnode);
dmGetQmMonitorInfo(pDnode);
dmGetSmMonitorInfo(pDnode);
- dmGetBmMonitorInfo(pDnode);
monSendReport();
}
@@ -149,9 +112,7 @@ void dmGetVnodeLoads(SMonVloadInfo *pInfo) {
SDnode *pDnode = dmInstance();
SMgmtWrapper *pWrapper = &pDnode->wrappers[VNODE];
if (dmMarkWrapper(pWrapper) == 0) {
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_VM_LOAD, tDeserializeSMonVloadInfo, pInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
vmGetVnodeLoads(pWrapper->pMgmt, pInfo, false);
}
dmReleaseWrapper(pWrapper);
@@ -162,9 +123,7 @@ void dmGetMnodeLoads(SMonMloadInfo *pInfo) {
SDnode *pDnode = dmInstance();
SMgmtWrapper *pWrapper = &pDnode->wrappers[MNODE];
if (dmMarkWrapper(pWrapper) == 0) {
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_MM_LOAD, tDeserializeSMonMloadInfo, pInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
mmGetMnodeLoads(pWrapper->pMgmt, pInfo);
}
dmReleaseWrapper(pWrapper);
@@ -175,9 +134,7 @@ void dmGetQnodeLoads(SQnodeLoad *pInfo) {
SDnode *pDnode = dmInstance();
SMgmtWrapper *pWrapper = &pDnode->wrappers[QNODE];
if (dmMarkWrapper(pWrapper) == 0) {
- if (tsMultiProcess) {
- dmSendLocalRecv(pDnode, TDMT_MON_QM_LOAD, tDeserializeSQnodeLoad, pInfo);
- } else if (pWrapper->pMgmt != NULL) {
+ if (pWrapper->pMgmt != NULL) {
qmGetQnodeLoads(pWrapper->pMgmt, pInfo);
}
dmReleaseWrapper(pWrapper);
diff --git a/source/dnode/mgmt/node_mgmt/src/dmNodes.c b/source/dnode/mgmt/node_mgmt/src/dmNodes.c
index 99ffd73a7a71c8fb9ab1ff43cc5ecc008d23eecd..6893e486bb29837f599b4f2226efbc25b61fdb85 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmNodes.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmNodes.c
@@ -16,55 +16,6 @@
#define _DEFAULT_SOURCE
#include "dmMgmt.h"
-static int32_t dmCreateShm(SMgmtWrapper *pWrapper) {
- int32_t shmsize = tsMnodeShmSize;
- if (pWrapper->ntype == VNODE) {
- shmsize = tsVnodeShmSize;
- } else if (pWrapper->ntype == QNODE) {
- shmsize = tsQnodeShmSize;
- } else if (pWrapper->ntype == SNODE) {
- shmsize = tsSnodeShmSize;
- } else if (pWrapper->ntype == MNODE) {
- shmsize = tsMnodeShmSize;
- } else if (pWrapper->ntype == BNODE) {
- shmsize = tsBnodeShmSize;
- } else {
- return -1;
- }
-
- if (taosCreateShm(&pWrapper->proc.shm, pWrapper->ntype, shmsize) != 0) {
- terrno = TAOS_SYSTEM_ERROR(terrno);
- dError("node:%s, failed to create shm size:%d since %s", pWrapper->name, shmsize, terrstr());
- return -1;
- }
-
- dInfo("node:%s, shm:%d is created, size:%d", pWrapper->name, pWrapper->proc.shm.id, shmsize);
- return 0;
-}
-
-static int32_t dmNewProc(SMgmtWrapper *pWrapper, EDndNodeType ntype) {
- char tstr[8] = {0};
- char *args[6] = {0};
- snprintf(tstr, sizeof(tstr), "%d", ntype);
- args[1] = "-c";
- args[2] = configDir;
- args[3] = "-n";
- args[4] = tstr;
- args[5] = NULL;
-
- int32_t pid = taosNewProc(args);
- if (pid <= 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to exec in new process since %s", pWrapper->name, terrstr());
- return -1;
- }
-
- taosIgnSignal(SIGCHLD);
- pWrapper->proc.pid = pid;
- dInfo("node:%s, continue running in new pid:%d", pWrapper->name, pid);
- return 0;
-}
-
int32_t dmOpenNode(SMgmtWrapper *pWrapper) {
SDnode *pDnode = pWrapper->pDnode;
@@ -77,64 +28,14 @@ int32_t dmOpenNode(SMgmtWrapper *pWrapper) {
SMgmtOutputOpt output = {0};
SMgmtInputOpt input = dmBuildMgmtInputOpt(pWrapper);
- if (pWrapper->ntype == DNODE || InChildProc(pWrapper)) {
- tmsgSetDefault(&input.msgCb);
- }
-
- if (OnlyInSingleProc(pWrapper)) {
- dInfo("node:%s, start to open", pWrapper->name);
- if ((*pWrapper->func.openFp)(&input, &output) != 0) {
- dError("node:%s, failed to open since %s", pWrapper->name, terrstr());
- return -1;
- }
- dInfo("node:%s, has been opened", pWrapper->name);
- pWrapper->deployed = true;
- }
-
- if (InParentProc(pWrapper)) {
- dDebug("node:%s, start to open", pWrapper->name);
- if (dmCreateShm(pWrapper) != 0) {
- return -1;
- }
- if (dmWriteShmFile(pWrapper->path, pWrapper->name, &pWrapper->proc.shm) != 0) {
- return -1;
- }
-
- if (OnlyInParentProc(pWrapper)) {
- if (dmInitProc(pWrapper) != 0) {
- dError("node:%s, failed to init proc since %s", pWrapper->name, terrstr());
- return -1;
- }
- if (pDnode->rtype == NODE_END) {
- dInfo("node:%s, should be started manually in child process", pWrapper->name);
- } else {
- if (dmNewProc(pWrapper, pWrapper->ntype) != 0) {
- return -1;
- }
- }
- if (dmRunProc(&pWrapper->proc) != 0) {
- dError("node:%s, failed to run proc since %s", pWrapper->name, terrstr());
- return -1;
- }
- }
- dDebug("node:%s, has been opened in parent process", pWrapper->name);
- }
-
- if (InChildProc(pWrapper)) {
- dDebug("node:%s, start to open", pWrapper->name);
- if ((*pWrapper->func.openFp)(&input, &output) != 0) {
- dError("node:%s, failed to open since %s", pWrapper->name, terrstr());
- return -1;
- }
- if (dmInitProc(pWrapper) != 0) {
- return -1;
- }
- if (dmRunProc(&pWrapper->proc) != 0) {
- return -1;
- }
- dDebug("node:%s, has been opened in child process", pWrapper->name);
- pWrapper->deployed = true;
+ dInfo("node:%s, start to open", pWrapper->name);
+ tmsgSetDefault(&input.msgCb);
+ if ((*pWrapper->func.openFp)(&input, &output) != 0) {
+ dError("node:%s, failed to open since %s", pWrapper->name, terrstr());
+ return -1;
}
+ dInfo("node:%s, has been opened", pWrapper->name);
+ pWrapper->deployed = true;
if (output.pMgmt != NULL) {
pWrapper->pMgmt = output.pMgmt;
@@ -145,7 +46,6 @@ int32_t dmOpenNode(SMgmtWrapper *pWrapper) {
}
int32_t dmStartNode(SMgmtWrapper *pWrapper) {
- if (OnlyInParentProc(pWrapper)) return 0;
if (pWrapper->func.startFp != NULL) {
dDebug("node:%s, start to start", pWrapper->name);
if ((*pWrapper->func.startFp)(pWrapper->pMgmt) != 0) {
@@ -175,17 +75,6 @@ void dmCloseNode(SMgmtWrapper *pWrapper) {
taosMsleep(10);
}
- if (OnlyInParentProc(pWrapper)) {
- int32_t pid = pWrapper->proc.pid;
- if (pid > 0 && taosProcExist(pid)) {
- dInfo("node:%s, send kill signal to the child pid:%d", pWrapper->name, pid);
- taosKillProc(pid);
- dInfo("node:%s, wait for child pid:%d to stop", pWrapper->name, pid);
- taosWaitProc(pid);
- dInfo("node:%s, child pid:%d is stopped", pWrapper->name, pid);
- }
- }
-
taosThreadRwlockWrlock(&pWrapper->lock);
if (pWrapper->pMgmt != NULL) {
(*pWrapper->func.closeFp)(pWrapper->pMgmt);
@@ -193,10 +82,6 @@ void dmCloseNode(SMgmtWrapper *pWrapper) {
}
taosThreadRwlockUnlock(&pWrapper->lock);
- if (!OnlyInSingleProc(pWrapper)) {
- dmCleanupProc(pWrapper);
- }
-
dInfo("node:%s, has been closed", pWrapper->name);
}
@@ -243,29 +128,8 @@ static void dmCloseNodes(SDnode *pDnode) {
}
}
-static void dmWatchNodes(SDnode *pDnode) {
- if (pDnode->ptype != PARENT_PROC) return;
- if (pDnode->rtype == NODE_END) return;
-
- taosThreadMutexLock(&pDnode->mutex);
- for (EDndNodeType ntype = DNODE + 1; ntype < NODE_END; ++ntype) {
- SMgmtWrapper *pWrapper = &pDnode->wrappers[ntype];
- SProc *proc = &pWrapper->proc;
-
- if (!pWrapper->required) continue;
- if (!OnlyInParentProc(pWrapper)) continue;
-
- if (proc->pid <= 0 || !taosProcExist(proc->pid)) {
- dError("node:%s, pid:%d is killed and needs to restart", pWrapper->name, proc->pid);
- dmCloseProcRpcHandles(&pWrapper->proc);
- dmNewProc(pWrapper, ntype);
- }
- }
- taosThreadMutexUnlock(&pDnode->mutex);
-}
-
int32_t dmRunDnode(SDnode *pDnode) {
- int count = 0;
+ int32_t count = 0;
if (dmOpenNodes(pDnode) != 0) {
dError("failed to open nodes since %s", terrstr());
return -1;
@@ -275,6 +139,7 @@ int32_t dmRunDnode(SDnode *pDnode) {
dError("failed to start nodes since %s", terrstr());
return -1;
}
+
while (1) {
if (pDnode->stop) {
dInfo("TDengine is about to stop");
@@ -284,8 +149,8 @@ int32_t dmRunDnode(SDnode *pDnode) {
return 0;
}
- dmWatchNodes(pDnode);
if (count == 0) osUpdate();
+
count %= 10;
count++;
taosMsleep(100);
diff --git a/source/dnode/mgmt/node_mgmt/src/dmProc.c b/source/dnode/mgmt/node_mgmt/src/dmProc.c
deleted file mode 100644
index dc07455e6bd5abd99e890348232a8fb33491c1b1..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/node_mgmt/src/dmProc.c
+++ /dev/null
@@ -1,486 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define _DEFAULT_SOURCE
-#include "dmMgmt.h"
-
-static inline int32_t CEIL8(int32_t v) { return ceil((float)(v) / 8) * 8; }
-
-static int32_t dmInitProcMutex(SProcQueue *queue) {
- TdThreadMutexAttr mattr = {0};
-
- if (taosThreadMutexAttrInit(&mattr) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to init mutex while init attr since %s", queue->name, terrstr());
- return -1;
- }
-
- if (taosThreadMutexAttrSetPshared(&mattr, PTHREAD_PROCESS_SHARED) != 0) {
- taosThreadMutexAttrDestroy(&mattr);
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to init mutex while set shared since %s", queue->name, terrstr());
- return -1;
- }
-
- if (taosThreadMutexInit(&queue->mutex, &mattr) != 0) {
- taosThreadMutexAttrDestroy(&mattr);
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to init mutex since %s", queue->name, terrstr());
- return -1;
- }
-
- taosThreadMutexAttrDestroy(&mattr);
- return 0;
-}
-
-static int32_t dmInitProcSem(SProcQueue *queue) {
- if (tsem_init(&queue->sem, 1, 0) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to init sem since %s", queue->name, terrstr());
- return -1;
- }
-
- return 0;
-}
-
-static SProcQueue *dmInitProcQueue(SProc *proc, char *ptr, int32_t size) {
- SProcQueue *queue = (SProcQueue *)(ptr);
-
- int32_t bufSize = size - CEIL8(sizeof(SProcQueue));
- if (bufSize <= 1024) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return NULL;
- }
-
- if (proc->ptype & DND_PROC_PARENT) {
- memset(ptr, 0, sizeof(SProcQueue));
- if (dmInitProcMutex(queue) != 0) {
- return NULL;
- }
-
- if (dmInitProcSem(queue) != 0) {
- return NULL;
- }
-
- tstrncpy(queue->name, proc->name, sizeof(queue->name));
-
- taosThreadMutexLock(&queue->mutex);
- // queue->head = 0;
- // queue->tail = 0;
- queue->total = bufSize;
- queue->avail = bufSize;
- // queue->items = 0;
- taosThreadMutexUnlock(&queue->mutex);
- }
-
- return queue;
-}
-
-static void dmCleanupProcQueue(SProcQueue *queue) {}
-
-static inline int32_t dmPushToProcQueue(SProc *proc, SProcQueue *queue, SRpcMsg *pMsg, EProcFuncType ftype) {
- const void *pHead = pMsg;
- const void *pBody = pMsg->pCont;
- const int16_t rawHeadLen = sizeof(SRpcMsg);
- const int32_t rawBodyLen = pMsg->contLen;
- const int16_t headLen = CEIL8(rawHeadLen);
- const int32_t bodyLen = CEIL8(rawBodyLen);
- const int32_t fullLen = headLen + bodyLen + 8;
- const int64_t handle = (int64_t)pMsg->info.handle;
-
- if (fullLen > queue->total) {
- terrno = TSDB_CODE_OUT_OF_RANGE;
- return -1;
- }
-
- taosThreadMutexLock(&queue->mutex);
- if (fullLen > queue->avail) {
- taosThreadMutexUnlock(&queue->mutex);
- terrno = TSDB_CODE_OUT_OF_SHM_MEM;
- return -1;
- }
-
- if (ftype == DND_FUNC_REQ && IsReq(pMsg) && pMsg->code == 0 && handle != 0 && pMsg->info.noResp == 0) {
- if (taosHashPut(proc->hash, &handle, sizeof(int64_t), &pMsg->info, sizeof(SRpcConnInfo)) != 0) {
- taosThreadMutexUnlock(&queue->mutex);
- return -1;
- }
- }
-
- const int32_t pos = queue->tail;
- if (queue->tail < queue->total) {
- *(int16_t *)(queue->pBuffer + queue->tail) = rawHeadLen;
- *(int8_t *)(queue->pBuffer + queue->tail + 2) = (int8_t)ftype;
- *(int32_t *)(queue->pBuffer + queue->tail + 4) = rawBodyLen;
- } else {
- *(int16_t *)(queue->pBuffer) = rawHeadLen;
- *(int8_t *)(queue->pBuffer + 2) = (int8_t)ftype;
- *(int32_t *)(queue->pBuffer + 4) = rawBodyLen;
- }
-
- if (queue->tail < queue->head) {
- memcpy(queue->pBuffer + queue->tail + 8, pHead, rawHeadLen);
- if (rawBodyLen > 0) memcpy(queue->pBuffer + queue->tail + 8 + headLen, pBody, rawBodyLen);
- queue->tail = queue->tail + 8 + headLen + bodyLen;
- } else {
- int32_t remain = queue->total - queue->tail;
- if (remain == 0) {
- memcpy(queue->pBuffer + 8, pHead, rawHeadLen);
- if (rawBodyLen > 0) memcpy(queue->pBuffer + 8 + headLen, pBody, rawBodyLen);
- queue->tail = 8 + headLen + bodyLen;
- } else if (remain == 8) {
- memcpy(queue->pBuffer, pHead, rawHeadLen);
- if (rawBodyLen > 0) memcpy(queue->pBuffer + headLen, pBody, rawBodyLen);
- queue->tail = headLen + bodyLen;
- } else if (remain < 8 + headLen) {
- memcpy(queue->pBuffer + queue->tail + 8, pHead, remain - 8);
- memcpy(queue->pBuffer, (char *)pHead + remain - 8, rawHeadLen - (remain - 8));
- if (rawBodyLen > 0) memcpy(queue->pBuffer + headLen - (remain - 8), pBody, rawBodyLen);
- queue->tail = headLen - (remain - 8) + bodyLen;
- } else if (remain < 8 + headLen + bodyLen) {
- memcpy(queue->pBuffer + queue->tail + 8, pHead, rawHeadLen);
- if (rawBodyLen > 0) memcpy(queue->pBuffer + queue->tail + 8 + headLen, pBody, remain - 8 - headLen);
- if (rawBodyLen > 0)
- memcpy(queue->pBuffer, (char *)pBody + remain - 8 - headLen, rawBodyLen - (remain - 8 - headLen));
- queue->tail = bodyLen - (remain - 8 - headLen);
- } else {
- memcpy(queue->pBuffer + queue->tail + 8, pHead, rawHeadLen);
- if (rawBodyLen > 0) memcpy(queue->pBuffer + queue->tail + headLen + 8, pBody, rawBodyLen);
- queue->tail = queue->tail + headLen + bodyLen + 8;
- }
- }
-
- queue->avail -= fullLen;
- queue->items++;
- taosThreadMutexUnlock(&queue->mutex);
- tsem_post(&queue->sem);
-
- dTrace("node:%s, push %s msg:%p type:%d handle:%p len:%d code:0x%x, pos:%d remain:%d", queue->name, dmFuncStr(ftype),
- pMsg, pMsg->msgType, pMsg->info.handle, pMsg->contLen, pMsg->code, pos, queue->items);
- return 0;
-}
-
-static inline int32_t dmPopFromProcQueue(SProcQueue *queue, SRpcMsg **ppMsg, EProcFuncType *pFuncType) {
- tsem_wait(&queue->sem);
-
- taosThreadMutexLock(&queue->mutex);
- if (queue->total - queue->avail <= 0) {
- taosThreadMutexUnlock(&queue->mutex);
- terrno = TSDB_CODE_OUT_OF_SHM_MEM;
- return 0;
- }
-
- int16_t rawHeadLen = 0;
- int8_t ftype = 0;
- int32_t rawBodyLen = 0;
- if (queue->head < queue->total) {
- rawHeadLen = *(int16_t *)(queue->pBuffer + queue->head);
- ftype = *(int8_t *)(queue->pBuffer + queue->head + 2);
- rawBodyLen = *(int32_t *)(queue->pBuffer + queue->head + 4);
- } else {
- rawHeadLen = *(int16_t *)(queue->pBuffer);
- ftype = *(int8_t *)(queue->pBuffer + 2);
- rawBodyLen = *(int32_t *)(queue->pBuffer + 4);
- }
- int16_t headLen = CEIL8(rawHeadLen);
- int32_t bodyLen = CEIL8(rawBodyLen);
-
- void *pHead = taosAllocateQitem(headLen, DEF_QITEM);
- void *pBody = NULL;
- if (bodyLen > 0) pBody = rpcMallocCont(bodyLen);
- if (pHead == NULL || (bodyLen > 0 && pBody == NULL)) {
- taosThreadMutexUnlock(&queue->mutex);
- tsem_post(&queue->sem);
- taosFreeQitem(pHead);
- rpcFreeCont(pBody);
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- const int32_t pos = queue->head;
- if (queue->head < queue->tail) {
- memcpy(pHead, queue->pBuffer + queue->head + 8, headLen);
- if (bodyLen > 0) memcpy(pBody, queue->pBuffer + queue->head + 8 + headLen, bodyLen);
- queue->head = queue->head + 8 + headLen + bodyLen;
- } else {
- int32_t remain = queue->total - queue->head;
- if (remain == 0) {
- memcpy(pHead, queue->pBuffer + 8, headLen);
- if (bodyLen > 0) memcpy(pBody, queue->pBuffer + 8 + headLen, bodyLen);
- queue->head = 8 + headLen + bodyLen;
- } else if (remain == 8) {
- memcpy(pHead, queue->pBuffer, headLen);
- if (bodyLen > 0) memcpy(pBody, queue->pBuffer + headLen, bodyLen);
- queue->head = headLen + bodyLen;
- } else if (remain < 8 + headLen) {
- memcpy(pHead, queue->pBuffer + queue->head + 8, remain - 8);
- memcpy((char *)pHead + remain - 8, queue->pBuffer, headLen - (remain - 8));
- if (bodyLen > 0) memcpy(pBody, queue->pBuffer + headLen - (remain - 8), bodyLen);
- queue->head = headLen - (remain - 8) + bodyLen;
- } else if (remain < 8 + headLen + bodyLen) {
- memcpy(pHead, queue->pBuffer + queue->head + 8, headLen);
- if (bodyLen > 0) memcpy(pBody, queue->pBuffer + queue->head + 8 + headLen, remain - 8 - headLen);
- if (bodyLen > 0) memcpy((char *)pBody + remain - 8 - headLen, queue->pBuffer, bodyLen - (remain - 8 - headLen));
- queue->head = bodyLen - (remain - 8 - headLen);
- } else {
- memcpy(pHead, queue->pBuffer + queue->head + 8, headLen);
- if (bodyLen > 0) memcpy(pBody, queue->pBuffer + queue->head + headLen + 8, bodyLen);
- queue->head = queue->head + headLen + bodyLen + 8;
- }
- }
-
- queue->avail = queue->avail + headLen + bodyLen + 8;
- queue->items--;
- taosThreadMutexUnlock(&queue->mutex);
-
- *ppMsg = pHead;
- (*ppMsg)->pCont = pBody;
- *pFuncType = (EProcFuncType)ftype;
-
- dTrace("node:%s, pop %s msg:%p type:%d handle:%p len:%d code:0x%x, pos:%d remain:%d", queue->name, dmFuncStr(ftype),
- (*ppMsg), (*ppMsg)->msgType, (*ppMsg)->info.handle, (*ppMsg)->contLen, (*ppMsg)->code, pos, queue->items);
- return 1;
-}
-
-int32_t dmInitProc(struct SMgmtWrapper *pWrapper) {
- SProc *proc = &pWrapper->proc;
- if (proc->name != NULL) return 0;
-
- proc->wrapper = pWrapper;
- proc->name = pWrapper->name;
-
- SShm *shm = &proc->shm;
- int32_t cstart = 0;
- int32_t csize = CEIL8(shm->size / 2);
- int32_t pstart = csize;
- int32_t psize = CEIL8(shm->size - pstart);
- if (pstart + psize > shm->size) {
- psize -= 8;
- }
-
- proc->hash = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), false, HASH_NO_LOCK);
- proc->cqueue = dmInitProcQueue(proc, (char *)shm->ptr + cstart, csize);
- proc->pqueue = dmInitProcQueue(proc, (char *)shm->ptr + pstart, psize);
- if (proc->cqueue == NULL || proc->pqueue == NULL || proc->hash == NULL) {
- dmCleanupProcQueue(proc->cqueue);
- dmCleanupProcQueue(proc->pqueue);
- taosHashCleanup(proc->hash);
- return -1;
- }
-
- dDebug("node:%s, proc is initialized, cqueue:%p pqueue:%p", proc->name, proc->cqueue, proc->pqueue);
- return 0;
-}
-
-static void *dmConsumChildQueue(void *param) {
- SProc *proc = param;
- SMgmtWrapper *pWrapper = proc->wrapper;
- SProcQueue *queue = proc->cqueue;
- int32_t numOfMsgs = 0;
- int32_t code = 0;
- EProcFuncType ftype = DND_FUNC_REQ;
- SRpcMsg *pMsg = NULL;
-
- dDebug("node:%s, start to consume from cqueue", proc->name);
- do {
- numOfMsgs = dmPopFromProcQueue(queue, &pMsg, &ftype);
- if (numOfMsgs == 0) {
- dDebug("node:%s, get no msg from cqueue and exit thread", proc->name);
- break;
- }
-
- if (numOfMsgs < 0) {
- dError("node:%s, get no msg from cqueue since %s", proc->name, terrstr());
- taosMsleep(1);
- continue;
- }
-
- if (ftype != DND_FUNC_REQ) {
- dError("node:%s, invalid ftype:%d from cqueue", proc->name, ftype);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
- continue;
- }
-
- code = dmProcessNodeMsg(pWrapper, pMsg);
- if (code != 0) {
- dError("node:%s, failed to process msg:%p since %s, put into pqueue", proc->name, pMsg, terrstr());
- SRpcMsg rsp = {.code = (terrno != 0 ? terrno : code), .info = pMsg->info};
- dmPutToProcPQueue(proc, &rsp, DND_FUNC_RSP);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
- }
- } while (1);
-
- return NULL;
-}
-
-static void *dmConsumParentQueue(void *param) {
- SProc *proc = param;
- SMgmtWrapper *pWrapper = proc->wrapper;
- SProcQueue *queue = proc->pqueue;
- int32_t numOfMsgs = 0;
- int32_t code = 0;
- EProcFuncType ftype = DND_FUNC_REQ;
- SRpcMsg *pMsg = NULL;
-
- dDebug("node:%s, start to consume from pqueue", proc->name);
- do {
- numOfMsgs = dmPopFromProcQueue(queue, &pMsg, &ftype);
- if (numOfMsgs == 0) {
- dDebug("node:%s, get no msg from pqueue and exit thread", proc->name);
- break;
- }
-
- if (numOfMsgs < 0) {
- dError("node:%s, get no msg from pqueue since %s", proc->name, terrstr());
- taosMsleep(1);
- continue;
- }
-
- if (ftype == DND_FUNC_RSP) {
- dmRemoveProcRpcHandle(proc, pMsg->info.handle);
- rpcSendResponse(pMsg);
- } else if (ftype == DND_FUNC_REGIST) {
- rpcRegisterBrokenLinkArg(pMsg);
- } else if (ftype == DND_FUNC_RELEASE) {
- dmRemoveProcRpcHandle(proc, pMsg->info.handle);
- rpcReleaseHandle(&pMsg->info, TAOS_CONN_SERVER);
- } else {
- dError("node:%s, invalid ftype:%d from pqueue", proc->name, ftype);
- rpcFreeCont(pMsg->pCont);
- }
-
- taosFreeQitem(pMsg);
- } while (1);
-
- return NULL;
-}
-
-int32_t dmRunProc(SProc *proc) {
- TdThreadAttr thAttr = {0};
- taosThreadAttrInit(&thAttr);
- taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE);
-
- if (proc->ptype & DND_PROC_PARENT) {
- if (taosThreadCreate(&proc->pthread, &thAttr, dmConsumParentQueue, proc) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to create pthread since %s", proc->name, terrstr());
- return -1;
- }
- dDebug("node:%s, thread:%" PRId64 " is created to consume pqueue", proc->name, proc->pthread);
- }
-
- if (proc->ptype & DND_PROC_CHILD) {
- if (taosThreadCreate(&proc->cthread, &thAttr, dmConsumChildQueue, proc) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to create cthread since %s", proc->name, terrstr());
- return -1;
- }
- dDebug("node:%s, thread:%" PRId64 " is created to consume cqueue", proc->name, proc->cthread);
- }
-
- taosThreadAttrDestroy(&thAttr);
- return 0;
-}
-
-void dmStopProc(SProc *proc) {
- proc->stop = true;
- if (taosCheckPthreadValid(proc->pthread)) {
- dDebug("node:%s, start to join pthread:%" PRId64, proc->name, proc->pthread);
- tsem_post(&proc->pqueue->sem);
- taosThreadJoin(proc->pthread, NULL);
- taosThreadClear(&proc->pthread);
- }
-
- if (taosCheckPthreadValid(proc->cthread)) {
- dDebug("node:%s, start to join cthread:%" PRId64, proc->name, proc->cthread);
- tsem_post(&proc->cqueue->sem);
- taosThreadJoin(proc->cthread, NULL);
- taosThreadClear(&proc->cthread);
- }
-}
-
-void dmCleanupProc(struct SMgmtWrapper *pWrapper) {
- SProc *proc = &pWrapper->proc;
- if (proc->name == NULL) return;
-
- dDebug("node:%s, start to cleanup proc", pWrapper->name);
- dmStopProc(proc);
- dmCleanupProcQueue(proc->cqueue);
- dmCleanupProcQueue(proc->pqueue);
- taosHashCleanup(proc->hash);
- proc->hash = NULL;
- dDebug("node:%s, proc is cleaned up", pWrapper->name);
-}
-
-void dmRemoveProcRpcHandle(SProc *proc, void *handle) {
- int64_t h = (int64_t)handle;
- taosThreadMutexLock(&proc->cqueue->mutex);
- taosHashRemove(proc->hash, &h, sizeof(int64_t));
- taosThreadMutexUnlock(&proc->cqueue->mutex);
-}
-
-void dmCloseProcRpcHandles(SProc *proc) {
- taosThreadMutexLock(&proc->cqueue->mutex);
- SRpcHandleInfo *pInfo = taosHashIterate(proc->hash, NULL);
- while (pInfo != NULL) {
- dError("node:%s, the child process dies and send an offline rsp to handle:%p", proc->name, pInfo->handle);
- SRpcMsg rpcMsg = {.code = TSDB_CODE_NODE_OFFLINE, .info = *pInfo};
- rpcSendResponse(&rpcMsg);
- pInfo = taosHashIterate(proc->hash, pInfo);
- }
- taosHashClear(proc->hash);
- taosThreadMutexUnlock(&proc->cqueue->mutex);
-}
-
-void dmPutToProcPQueue(SProc *proc, SRpcMsg *pMsg, EProcFuncType ftype) {
- int32_t retry = 0;
- while (1) {
- if (dmPushToProcQueue(proc, proc->pqueue, pMsg, ftype) == 0) {
- break;
- }
-
- if (terrno != TSDB_CODE_OUT_OF_SHM_MEM) {
- pMsg->code = terrno;
- if (pMsg->contLen > 0) {
- rpcFreeCont(pMsg->pCont);
- pMsg->pCont = NULL;
- pMsg->contLen = 0;
- }
- dError("node:%s, failed to push %s msg:%p type:%d handle:%p then discard data and return error", proc->name,
- dmFuncStr(ftype), pMsg, pMsg->msgType, pMsg->info.handle);
- } else {
- dError("node:%s, failed to push %s msg:%p type:%d handle:%p len:%d since %s, retry:%d", proc->name,
- dmFuncStr(ftype), pMsg, pMsg->msgType, pMsg->info.handle, pMsg->contLen, terrstr(), retry);
- retry++;
- taosMsleep(retry);
- }
- }
-
- rpcFreeCont(pMsg->pCont);
- pMsg->pCont = NULL;
- pMsg->contLen = 0;
-}
-
-int32_t dmPutToProcCQueue(SProc *proc, SRpcMsg *pMsg, EProcFuncType ftype) {
- int32_t code = dmPushToProcQueue(proc, proc->cqueue, pMsg, ftype);
- if (code == 0) {
- dTrace("msg:%p, is freed after push to cqueue", pMsg);
- rpcFreeCont(pMsg->pCont);
- taosFreeQitem(pMsg);
- }
- return code;
-}
diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
index 542baaec091b5d9bf8ce04a10ee4edc8463fc203..7ad24be258ee23b547543f0296cc27ea281ee89f 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
@@ -17,14 +17,7 @@
#include "dmMgmt.h"
#include "qworker.h"
-static inline void dmSendRsp(SRpcMsg *pMsg) {
- SMgmtWrapper *pWrapper = pMsg->info.wrapper;
- if (InChildProc(pWrapper)) {
- dmPutToProcPQueue(&pWrapper->proc, pMsg, DND_FUNC_RSP);
- } else {
- rpcSendResponse(pMsg);
- }
-}
+static inline void dmSendRsp(SRpcMsg *pMsg) { rpcSendResponse(pMsg); }
static inline void dmBuildMnodeRedirectRsp(SDnode *pDnode, SRpcMsg *pMsg) {
SEpSet epSet = {0};
@@ -157,11 +150,7 @@ static void dmProcessRpcMsg(SDnode *pDnode, SRpcMsg *pRpc, SEpSet *pEpSet) {
memcpy(pMsg, pRpc, sizeof(SRpcMsg));
dGTrace("msg:%p, is created, type:%s handle:%p", pMsg, TMSG_INFO(pRpc->msgType), pMsg->info.handle);
- if (InParentProc(pWrapper)) {
- code = dmPutToProcCQueue(&pWrapper->proc, pMsg, DND_FUNC_REQ);
- } else {
- code = dmProcessNodeMsg(pWrapper, pMsg);
- }
+ code = dmProcessNodeMsg(pWrapper, pMsg);
_OVER:
if (code != 0) {
@@ -233,24 +222,9 @@ static inline int32_t dmSendReq(const SEpSet *pEpSet, SRpcMsg *pMsg) {
}
}
-static inline void dmRegisterBrokenLinkArg(SRpcMsg *pMsg) {
- SMgmtWrapper *pWrapper = pMsg->info.wrapper;
- if (InChildProc(pWrapper)) {
- dmPutToProcPQueue(&pWrapper->proc, pMsg, DND_FUNC_REGIST);
- } else {
- rpcRegisterBrokenLinkArg(pMsg);
- }
-}
+static inline void dmRegisterBrokenLinkArg(SRpcMsg *pMsg) { rpcRegisterBrokenLinkArg(pMsg); }
-static inline void dmReleaseHandle(SRpcHandleInfo *pHandle, int8_t type) {
- SMgmtWrapper *pWrapper = pHandle->wrapper;
- if (InChildProc(pWrapper)) {
- SRpcMsg msg = {.code = type, .info = *pHandle};
- dmPutToProcPQueue(&pWrapper->proc, &msg, DND_FUNC_RELEASE);
- } else {
- rpcReleaseHandle(pHandle, type);
- }
-}
+static inline void dmReleaseHandle(SRpcHandleInfo *pHandle, int8_t type) { rpcReleaseHandle(pHandle, type); }
static bool rpcRfp(int32_t code, tmsg_t msgType) {
if (code == TSDB_CODE_RPC_REDIRECT || code == TSDB_CODE_RPC_NETWORK_UNAVAIL || code == TSDB_CODE_NODE_NOT_DEPLOYED ||
diff --git a/source/dnode/mgmt/node_util/CMakeLists.txt b/source/dnode/mgmt/node_util/CMakeLists.txt
index 5d879fdbcf356f6cefcfdc8046696fa4010cd1b4..5c670cbdd379bc27d2e56971a5e7ce838f86aa6a 100644
--- a/source/dnode/mgmt/node_util/CMakeLists.txt
+++ b/source/dnode/mgmt/node_util/CMakeLists.txt
@@ -6,5 +6,5 @@ target_include_directories(
PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/inc"
)
target_link_libraries(
- node_util cjson mnode vnode qnode snode bnode wal sync taos_static tfs monitor
+ node_util cjson mnode vnode qnode snode wal sync taos_static tfs monitor
)
\ No newline at end of file
diff --git a/source/dnode/mgmt/node_util/inc/dmUtil.h b/source/dnode/mgmt/node_util/inc/dmUtil.h
index f599de384cdc36f04873b0d34d40b18168b136da..8719e988e7acd44548708a83f9e846d981170712 100644
--- a/source/dnode/mgmt/node_util/inc/dmUtil.h
+++ b/source/dnode/mgmt/node_util/inc/dmUtil.h
@@ -68,8 +68,7 @@ typedef enum {
VNODE = 2,
QNODE = 3,
SNODE = 4,
- BNODE = 5,
- NODE_END = 6,
+ NODE_END = 5,
} EDndNodeType;
typedef enum {
@@ -84,20 +83,6 @@ typedef enum {
DND_ENV_CLEANUP,
} EDndEnvStatus;
-typedef enum {
- DND_PROC_SINGLE,
- DND_PROC_CHILD,
- DND_PROC_PARENT,
- DND_PROC_TEST,
-} EDndProcType;
-
-typedef enum {
- DND_FUNC_REQ = 1,
- DND_FUNC_RSP = 2,
- DND_FUNC_REGIST = 3,
- DND_FUNC_RELEASE = 4,
-} EProcFuncType;
-
typedef int32_t (*ProcessCreateNodeFp)(EDndNodeType ntype, SRpcMsg *pMsg);
typedef int32_t (*ProcessDropNodeFp)(EDndNodeType ntype, SRpcMsg *pMsg);
typedef void (*SendMonitorReportFp)();
@@ -166,11 +151,7 @@ typedef struct {
// dmUtil.c
const char *dmStatStr(EDndRunStatus stype);
-const char *dmNodeLogName(EDndNodeType ntype);
-const char *dmNodeProcName(EDndNodeType ntype);
const char *dmNodeName(EDndNodeType ntype);
-const char *dmProcStr(EDndProcType ptype);
-const char *dmFuncStr(EProcFuncType etype);
void *dmSetMgmtHandle(SArray *pArray, tmsg_t msgType, void *nodeMsgFp, bool needCheckVgId);
void dmGetMonitorSystemInfo(SMonSysInfo *pInfo);
@@ -178,8 +159,6 @@ void dmGetMonitorSystemInfo(SMonSysInfo *pInfo);
int32_t dmReadFile(const char *path, const char *name, bool *pDeployed);
int32_t dmWriteFile(const char *path, const char *name, bool deployed);
TdFilePtr dmCheckRunning(const char *dataDir);
-int32_t dmReadShmFile(const char *path, const char *name, EDndNodeType runType, SShm *pShm);
-int32_t dmWriteShmFile(const char *path, const char *name, const SShm *pShm);
// dmEps.c
int32_t dmReadEps(SDnodeData *pData);
diff --git a/source/dnode/mgmt/node_util/src/dmFile.c b/source/dnode/mgmt/node_util/src/dmFile.c
index 9ec17a18b57ac2ce28dfb7c65704748719bc2e0a..d387fe4a3f52400e3dcb5521d4c7a94c8802d607 100644
--- a/source/dnode/mgmt/node_util/src/dmFile.c
+++ b/source/dnode/mgmt/node_util/src/dmFile.c
@@ -148,114 +148,3 @@ TdFilePtr dmCheckRunning(const char *dataDir) {
dDebug("lock file:%s to prevent repeated starts", filepath);
return pFile;
}
-
-int32_t dmReadShmFile(const char *path, const char *name, EDndNodeType runType, SShm *pShm) {
- int32_t code = -1;
- char content[MAXLEN + 1] = {0};
- char file[PATH_MAX] = {0};
- cJSON *root = NULL;
- TdFilePtr pFile = NULL;
-
- snprintf(file, sizeof(file), "%s%sshmfile", path, TD_DIRSEP);
- pFile = taosOpenFile(file, TD_FILE_READ);
- if (pFile == NULL) {
- code = 0;
- goto _OVER;
- }
-
- if (taosReadFile(pFile, content, MAXLEN) > 0) {
- root = cJSON_Parse(content);
- if (root == NULL) {
- terrno = TSDB_CODE_INVALID_JSON_FORMAT;
- dError("node:%s, failed to read %s since invalid json format", name, file);
- goto _OVER;
- }
-
- cJSON *shmid = cJSON_GetObjectItem(root, "shmid");
- if (shmid && shmid->type == cJSON_Number) {
- pShm->id = shmid->valueint;
- }
-
- cJSON *shmsize = cJSON_GetObjectItem(root, "shmsize");
- if (shmsize && shmsize->type == cJSON_Number) {
- pShm->size = shmsize->valueint;
- }
- }
-
- if (!tsMultiProcess || runType == DNODE || runType == NODE_END) {
- if (pShm->id >= 0) {
- dDebug("node:%s, shmid:%d, is closed, size:%d", name, pShm->id, pShm->size);
- taosDropShm(pShm);
- }
- } else {
- if (taosAttachShm(pShm) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("shmid:%d, failed to attach shm since %s", pShm->id, terrstr());
- goto _OVER;
- }
- dInfo("node:%s, shmid:%d is attached, size:%d", name, pShm->id, pShm->size);
- }
-
- dDebug("node:%s, successed to load %s", name, file);
- code = 0;
-
-_OVER:
- if (root != NULL) cJSON_Delete(root);
- if (pFile != NULL) taosCloseFile(&pFile);
-
- return code;
-}
-
-int32_t dmWriteShmFile(const char *path, const char *name, const SShm *pShm) {
- int32_t code = -1;
- int32_t len = 0;
- char content[MAXLEN + 1] = {0};
- char file[PATH_MAX] = {0};
- char realfile[PATH_MAX] = {0};
- TdFilePtr pFile = NULL;
-
- snprintf(file, sizeof(file), "%s%sshmfile.bak", path, TD_DIRSEP);
- snprintf(realfile, sizeof(realfile), "%s%sshmfile", path, TD_DIRSEP);
-
- pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC);
- if (pFile == NULL) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to open file:%s since %s", name, file, terrstr());
- goto _OVER;
- }
-
- len += snprintf(content + len, MAXLEN - len, "{\n");
- len += snprintf(content + len, MAXLEN - len, " \"shmid\":%d,\n", pShm->id);
- len += snprintf(content + len, MAXLEN - len, " \"shmsize\":%d\n", pShm->size);
- len += snprintf(content + len, MAXLEN - len, "}\n");
-
- if (taosWriteFile(pFile, content, len) != len) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to write file:%s since %s", name, file, terrstr());
- goto _OVER;
- }
-
- if (taosFsyncFile(pFile) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to fsync file:%s since %s", name, file, terrstr());
- goto _OVER;
- }
-
- taosCloseFile(&pFile);
-
- if (taosRenameFile(file, realfile) != 0) {
- terrno = TAOS_SYSTEM_ERROR(errno);
- dError("node:%s, failed to rename %s to %s since %s", name, file, realfile, terrstr());
- return -1;
- }
-
- dInfo("node:%s, successed to write %s", name, realfile);
- code = 0;
-
-_OVER:
- if (pFile != NULL) {
- taosCloseFile(&pFile);
- }
-
- return code;
-}
diff --git a/source/dnode/mgmt/node_util/src/dmUtil.c b/source/dnode/mgmt/node_util/src/dmUtil.c
index 832e15a1e00b92d614f87f44e0accc02853c9107..80bb8debd28db2a6f15fbeb243702b267dd38676 100644
--- a/source/dnode/mgmt/node_util/src/dmUtil.c
+++ b/source/dnode/mgmt/node_util/src/dmUtil.c
@@ -29,40 +29,6 @@ const char *dmStatStr(EDndRunStatus stype) {
}
}
-const char *dmNodeLogName(EDndNodeType ntype) {
- switch (ntype) {
- case VNODE:
- return "vnode";
- case QNODE:
- return "qnode";
- case SNODE:
- return "snode";
- case MNODE:
- return "mnode";
- case BNODE:
- return "bnode";
- default:
- return "taosd";
- }
-}
-
-const char *dmNodeProcName(EDndNodeType ntype) {
- switch (ntype) {
- case VNODE:
- return "taosv";
- case QNODE:
- return "taosq";
- case SNODE:
- return "taoss";
- case MNODE:
- return "taosm";
- case BNODE:
- return "taosb";
- default:
- return "taosd";
- }
-}
-
const char *dmNodeName(EDndNodeType ntype) {
switch (ntype) {
case VNODE:
@@ -73,43 +39,11 @@ const char *dmNodeName(EDndNodeType ntype) {
return "snode";
case MNODE:
return "mnode";
- case BNODE:
- return "bnode";
default:
return "dnode";
}
}
-const char *dmProcStr(EDndProcType etype) {
- switch (etype) {
- case DND_PROC_SINGLE:
- return "start";
- case DND_PROC_CHILD:
- return "stop";
- case DND_PROC_PARENT:
- return "child";
- case DND_PROC_TEST:
- return "test";
- default:
- return "UNKNOWN";
- }
-}
-
-const char *dmFuncStr(EProcFuncType etype) {
- switch (etype) {
- case DND_FUNC_REQ:
- return "req";
- case DND_FUNC_RSP:
- return "rsp";
- case DND_FUNC_REGIST:
- return "regist";
- case DND_FUNC_RELEASE:
- return "release";
- default:
- return "UNKNOWN";
- }
-}
-
void *dmSetMgmtHandle(SArray *pArray, tmsg_t msgType, void *nodeMsgFp, bool needCheckVgId) {
SMgmtHandle handle = {
.msgType = msgType,
diff --git a/source/dnode/mgmt/test/CMakeLists.txt b/source/dnode/mgmt/test/CMakeLists.txt
index 6b1919bf1862b5eeca9047de4731dae306ca275a..6709a2aa5e41436a543d737b08ab11ac579c0858 100644
--- a/source/dnode/mgmt/test/CMakeLists.txt
+++ b/source/dnode/mgmt/test/CMakeLists.txt
@@ -1,7 +1,6 @@
if(${BUILD_TEST})
enable_testing()
add_subdirectory(qnode)
- add_subdirectory(bnode)
add_subdirectory(snode)
#add_subdirectory(mnode)
add_subdirectory(vnode)
diff --git a/source/dnode/mgmt/test/bnode/CMakeLists.txt b/source/dnode/mgmt/test/bnode/CMakeLists.txt
deleted file mode 100644
index 7108d3adb913abca3abe3aa614b1a6d4784b9120..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/test/bnode/CMakeLists.txt
+++ /dev/null
@@ -1,10 +0,0 @@
-aux_source_directory(. DND_BNODE_TEST_SRC)
-add_executable(dbnodeTest ${DND_BNODE_TEST_SRC})
-target_link_libraries(
- dbnodeTest sut
-)
-
-add_test(
- NAME dbnodeTest
- COMMAND dbnodeTest
-)
diff --git a/source/dnode/mgmt/test/bnode/dbnode.cpp b/source/dnode/mgmt/test/bnode/dbnode.cpp
deleted file mode 100644
index 24d8c594ce54a9e5c7d92575edcee9cd88d5bfef..0000000000000000000000000000000000000000
--- a/source/dnode/mgmt/test/bnode/dbnode.cpp
+++ /dev/null
@@ -1,152 +0,0 @@
-/**
- * @file dbnode.cpp
- * @author slguan (slguan@taosdata.com)
- * @brief DNODE module bnode tests
- * @version 1.0
- * @date 2022-01-05
- *
- * @copyright Copyright (c) 2022
- *
- */
-
-#include "sut.h"
-
-class DndTestBnode : public ::testing::Test {
- protected:
- static void SetUpTestSuite() {
- test.Init(TD_TMP_DIR_PATH "dbnodeTest", 9112);
- taosMsleep(1100);
- }
- static void TearDownTestSuite() { test.Cleanup(); }
- static Testbase test;
-
- public:
- void SetUp() override {}
- void TearDown() override {}
-};
-
-Testbase DndTestBnode::test;
-
-TEST_F(DndTestBnode, 01_Create_Bnode) {
- {
- SDCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_INVALID_OPTION);
- }
-
- {
- SDCreateBnodeReq createReq = {0};
- createReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
- }
-
- {
- SDCreateBnodeReq createReq = {0};
- createReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
- }
-
- // test.Restart();
-
- {
- SDCreateBnodeReq createReq = {0};
- createReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_ALREADY_DEPLOYED);
- }
-}
-
-TEST_F(DndTestBnode, 02_Drop_Bnode) {
- {
- SDDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_INVALID_OPTION);
- }
-
- {
- SDDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
- }
-
- {
- SDDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
- }
-
- // test.Restart();
-
- {
- SDDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_NODE_NOT_DEPLOYED);
- }
-
- {
- SDCreateBnodeReq createReq = {0};
- createReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
- }
-}
diff --git a/source/dnode/mgmt/test/mnode/dmnode.cpp b/source/dnode/mgmt/test/mnode/dmnode.cpp
index 857f58befce1898be621a37ea7cb33feb692d58a..7b7eb97216d9f443296b56393a273b5ccb01d9e9 100644
--- a/source/dnode/mgmt/test/mnode/dmnode.cpp
+++ b/source/dnode/mgmt/test/mnode/dmnode.cpp
@@ -139,9 +139,9 @@ TEST_F(DndTestMnode, 03_Drop_Mnode) {
SDDropMnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -152,9 +152,9 @@ TEST_F(DndTestMnode, 03_Drop_Mnode) {
SDDropMnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -165,9 +165,9 @@ TEST_F(DndTestMnode, 03_Drop_Mnode) {
SDDropMnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
diff --git a/source/dnode/mgmt/test/qnode/dqnode.cpp b/source/dnode/mgmt/test/qnode/dqnode.cpp
index ef51be47a68d8772507dcee7ae8fae5b29d82bf6..a2c6a2c28c81b7ba4ae76bd8e843696d879bf692 100644
--- a/source/dnode/mgmt/test/qnode/dqnode.cpp
+++ b/source/dnode/mgmt/test/qnode/dqnode.cpp
@@ -30,9 +30,9 @@ TEST_F(DndTestQnode, 01_Create_Qnode) {
SDCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -43,9 +43,9 @@ TEST_F(DndTestQnode, 01_Create_Qnode) {
SDCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -56,9 +56,9 @@ TEST_F(DndTestQnode, 01_Create_Qnode) {
SDCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -71,9 +71,9 @@ TEST_F(DndTestQnode, 01_Create_Qnode) {
SDCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -87,9 +87,9 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SDDropQnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -101,9 +101,9 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SDDropQnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -114,9 +114,9 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SDDropQnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -129,9 +129,9 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SDDropQnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -142,9 +142,9 @@ TEST_F(DndTestQnode, 02_Drop_Qnode) {
SDCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
diff --git a/source/dnode/mgmt/test/snode/dsnode.cpp b/source/dnode/mgmt/test/snode/dsnode.cpp
index 9ae0fbdc542bb145c3b6e8d45fe355f1b187450d..e3ad65d8316fdb42e44d632e3fcfb20483377e53 100644
--- a/source/dnode/mgmt/test/snode/dsnode.cpp
+++ b/source/dnode/mgmt/test/snode/dsnode.cpp
@@ -30,9 +30,9 @@ TEST_F(DndTestSnode, 01_Create_Snode) {
SDCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -43,9 +43,9 @@ TEST_F(DndTestSnode, 01_Create_Snode) {
SDCreateSnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -56,9 +56,9 @@ TEST_F(DndTestSnode, 01_Create_Snode) {
SDCreateSnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -71,9 +71,9 @@ TEST_F(DndTestSnode, 01_Create_Snode) {
SDCreateSnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -87,9 +87,9 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SDDropSnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -101,9 +101,9 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SDDropSnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -114,9 +114,9 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SDDropSnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -129,9 +129,9 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SDDropSnodeReq dropReq = {0};
dropReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -142,9 +142,9 @@ TEST_F(DndTestSnode, 01_Drop_Snode) {
SDCreateSnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_DND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
diff --git a/source/dnode/mgmt/test/sut/src/server.cpp b/source/dnode/mgmt/test/sut/src/server.cpp
index de35b06b05bb2034340f441036f01e6f928c5b08..98c59a1614303c4c8a342d1d63ab39e9116214fd 100644
--- a/source/dnode/mgmt/test/sut/src/server.cpp
+++ b/source/dnode/mgmt/test/sut/src/server.cpp
@@ -16,7 +16,7 @@
#include "sut.h"
void* serverLoop(void* param) {
- dmInit(0);
+ dmInit();
dmRun();
dmCleanup();
return NULL;
diff --git a/source/dnode/mgmt/test/sut/src/sut.cpp b/source/dnode/mgmt/test/sut/src/sut.cpp
index 699203e8c1daf52727959c794dd22e1f9a031c9c..a4d2e4688179b7161c03837b5478b197a6576bca 100644
--- a/source/dnode/mgmt/test/sut/src/sut.cpp
+++ b/source/dnode/mgmt/test/sut/src/sut.cpp
@@ -43,9 +43,7 @@ void Testbase::InitLog(const char* path) {
}
void Testbase::Init(const char* path, int16_t port) {
-#ifdef _TD_DARWIN_64
osDefaultInit();
-#endif
tsServerPort = port;
strcpy(tsLocalFqdn, "localhost");
snprintf(tsLocalEp, TSDB_EP_LEN, "%s:%u", tsLocalFqdn, tsServerPort);
diff --git a/source/dnode/mnode/impl/inc/mndBnode.h b/source/dnode/mnode/impl/inc/mndBnode.h
deleted file mode 100644
index cefc0b1859fd314e8ebd7d673aa936fa79227e14..0000000000000000000000000000000000000000
--- a/source/dnode/mnode/impl/inc/mndBnode.h
+++ /dev/null
@@ -1,32 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#ifndef _TD_MND_BNODE_H_
-#define _TD_MND_BNODE_H_
-
-#include "mndInt.h"
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-int32_t mndInitBnode(SMnode *pMnode);
-void mndCleanupBnode(SMnode *pMnode);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*_TD_MND_BNODE_H_*/
diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h
index 9cc920de041c078848b616d8c8707ebb751d4260..2ee732e797bbdd794a7bd36b829dc2249d8a62ef 100644
--- a/source/dnode/mnode/impl/inc/mndDef.h
+++ b/source/dnode/mnode/impl/inc/mndDef.h
@@ -43,8 +43,6 @@ typedef enum {
MND_OPER_CREATE_USER,
MND_OPER_DROP_USER,
MND_OPER_ALTER_USER,
- MND_OPER_CREATE_BNODE,
- MND_OPER_DROP_BNODE,
MND_OPER_CREATE_DNODE,
MND_OPER_DROP_DNODE,
MND_OPER_CONFIG_DNODE,
@@ -206,7 +204,8 @@ typedef struct {
int32_t id;
int64_t createdTime;
int64_t updateTime;
- ESyncState state;
+ ESyncState syncState;
+ bool syncRestore;
int64_t stateStartTime;
SDnodeObj* pDnode;
} SMnodeObj;
@@ -226,13 +225,6 @@ typedef struct {
SDnodeObj* pDnode;
} SSnodeObj;
-typedef struct {
- int32_t id;
- int64_t createdTime;
- int64_t updateTime;
- SDnodeObj* pDnode;
-} SBnodeObj;
-
typedef struct {
int32_t maxUsers;
int32_t maxDbs;
@@ -333,7 +325,8 @@ typedef struct {
typedef struct {
int32_t dnodeId;
- ESyncState role;
+ ESyncState syncState;
+ bool syncRestore;
} SVnodeGid;
typedef struct {
diff --git a/source/dnode/mnode/impl/src/mndBnode.c b/source/dnode/mnode/impl/src/mndBnode.c
deleted file mode 100644
index 06209d89c75f5ab5da28ae490c042414a8d2fa32..0000000000000000000000000000000000000000
--- a/source/dnode/mnode/impl/src/mndBnode.c
+++ /dev/null
@@ -1,447 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define _DEFAULT_SOURCE
-#include "mndBnode.h"
-#include "mndDnode.h"
-#include "mndPrivilege.h"
-#include "mndShow.h"
-#include "mndTrans.h"
-#include "mndUser.h"
-
-#define BNODE_VER_NUMBER 1
-#define BNODE_RESERVE_SIZE 64
-
-static SSdbRaw *mndBnodeActionEncode(SBnodeObj *pObj);
-static SSdbRow *mndBnodeActionDecode(SSdbRaw *pRaw);
-static int32_t mndBnodeActionInsert(SSdb *pSdb, SBnodeObj *pObj);
-static int32_t mndBnodeActionUpdate(SSdb *pSdb, SBnodeObj *pOld, SBnodeObj *pNew);
-static int32_t mndBnodeActionDelete(SSdb *pSdb, SBnodeObj *pObj);
-static int32_t mndProcessCreateBnodeReq(SRpcMsg *pReq);
-static int32_t mndProcessDropBnodeReq(SRpcMsg *pReq);
-static int32_t mndRetrieveBnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
-static void mndCancelGetNextBnode(SMnode *pMnode, void *pIter);
-
-int32_t mndInitBnode(SMnode *pMnode) {
- SSdbTable table = {
- .sdbType = SDB_BNODE,
- .keyType = SDB_KEY_INT32,
- .encodeFp = (SdbEncodeFp)mndBnodeActionEncode,
- .decodeFp = (SdbDecodeFp)mndBnodeActionDecode,
- .insertFp = (SdbInsertFp)mndBnodeActionInsert,
- .updateFp = (SdbUpdateFp)mndBnodeActionUpdate,
- .deleteFp = (SdbDeleteFp)mndBnodeActionDelete,
- };
-
- mndSetMsgHandle(pMnode, TDMT_MND_CREATE_BNODE, mndProcessCreateBnodeReq);
- mndSetMsgHandle(pMnode, TDMT_MND_DROP_BNODE, mndProcessDropBnodeReq);
- mndSetMsgHandle(pMnode, TDMT_DND_CREATE_BNODE_RSP, mndTransProcessRsp);
- mndSetMsgHandle(pMnode, TDMT_DND_DROP_BNODE_RSP, mndTransProcessRsp);
-
- mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_BNODE, mndRetrieveBnodes);
- mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_BNODE, mndCancelGetNextBnode);
-
- return sdbSetTable(pMnode->pSdb, table);
-}
-
-void mndCleanupBnode(SMnode *pMnode) {}
-
-static SBnodeObj *mndAcquireBnode(SMnode *pMnode, int32_t bnodeId) {
- SBnodeObj *pObj = sdbAcquire(pMnode->pSdb, SDB_BNODE, &bnodeId);
- if (pObj == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
- terrno = TSDB_CODE_MND_BNODE_NOT_EXIST;
- }
- return pObj;
-}
-
-static void mndReleaseBnode(SMnode *pMnode, SBnodeObj *pObj) {
- SSdb *pSdb = pMnode->pSdb;
- sdbRelease(pSdb, pObj);
-}
-
-static SSdbRaw *mndBnodeActionEncode(SBnodeObj *pObj) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
-
- SSdbRaw *pRaw = sdbAllocRaw(SDB_BNODE, BNODE_VER_NUMBER, sizeof(SBnodeObj) + BNODE_RESERVE_SIZE);
- if (pRaw == NULL) goto _OVER;
-
- int32_t dataPos = 0;
- SDB_SET_INT32(pRaw, dataPos, pObj->id, _OVER)
- SDB_SET_INT64(pRaw, dataPos, pObj->createdTime, _OVER)
- SDB_SET_INT64(pRaw, dataPos, pObj->updateTime, _OVER)
- SDB_SET_RESERVE(pRaw, dataPos, BNODE_RESERVE_SIZE, _OVER)
-
- terrno = 0;
-
-_OVER:
- if (terrno != 0) {
- mError("bnode:%d, failed to encode to raw:%p since %s", pObj->id, pRaw, terrstr());
- sdbFreeRaw(pRaw);
- return NULL;
- }
-
- mTrace("bnode:%d, encode to raw:%p, row:%p", pObj->id, pRaw, pObj);
- return pRaw;
-}
-
-static SSdbRow *mndBnodeActionDecode(SSdbRaw *pRaw) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
-
- int8_t sver = 0;
- if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto _OVER;
-
- if (sver != BNODE_VER_NUMBER) {
- terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
- goto _OVER;
- }
-
- SSdbRow *pRow = sdbAllocRow(sizeof(SBnodeObj));
- if (pRow == NULL) goto _OVER;
-
- SBnodeObj *pObj = sdbGetRowObj(pRow);
- if (pObj == NULL) goto _OVER;
-
- int32_t dataPos = 0;
- SDB_GET_INT32(pRaw, dataPos, &pObj->id, _OVER)
- SDB_GET_INT64(pRaw, dataPos, &pObj->createdTime, _OVER)
- SDB_GET_INT64(pRaw, dataPos, &pObj->updateTime, _OVER)
- SDB_GET_RESERVE(pRaw, dataPos, BNODE_RESERVE_SIZE, _OVER)
-
- terrno = 0;
-
-_OVER:
- if (terrno != 0) {
- mError("bnode:%d, failed to decode from raw:%p since %s", pObj->id, pRaw, terrstr());
- taosMemoryFreeClear(pRow);
- return NULL;
- }
-
- mTrace("bnode:%d, decode from raw:%p, row:%p", pObj->id, pRaw, pObj);
- return pRow;
-}
-
-static int32_t mndBnodeActionInsert(SSdb *pSdb, SBnodeObj *pObj) {
- mTrace("bnode:%d, perform insert action, row:%p", pObj->id, pObj);
- pObj->pDnode = sdbAcquire(pSdb, SDB_DNODE, &pObj->id);
- if (pObj->pDnode == NULL) {
- terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
- mError("bnode:%d, failed to perform insert action since %s", pObj->id, terrstr());
- return -1;
- }
-
- return 0;
-}
-
-static int32_t mndBnodeActionDelete(SSdb *pSdb, SBnodeObj *pObj) {
- mTrace("bnode:%d, perform delete action, row:%p", pObj->id, pObj);
- if (pObj->pDnode != NULL) {
- sdbRelease(pSdb, pObj->pDnode);
- pObj->pDnode = NULL;
- }
-
- return 0;
-}
-
-static int32_t mndBnodeActionUpdate(SSdb *pSdb, SBnodeObj *pOld, SBnodeObj *pNew) {
- mTrace("bnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
- pOld->updateTime = pNew->updateTime;
- return 0;
-}
-
-static int32_t mndSetCreateBnodeRedoLogs(STrans *pTrans, SBnodeObj *pObj) {
- SSdbRaw *pRedoRaw = mndBnodeActionEncode(pObj);
- if (pRedoRaw == NULL) return -1;
- if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
- if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_CREATING) != 0) return -1;
- return 0;
-}
-
-static int32_t mndSetCreateBnodeUndoLogs(STrans *pTrans, SBnodeObj *pObj) {
- SSdbRaw *pUndoRaw = mndBnodeActionEncode(pObj);
- if (pUndoRaw == NULL) return -1;
- if (mndTransAppendUndolog(pTrans, pUndoRaw) != 0) return -1;
- if (sdbSetRawStatus(pUndoRaw, SDB_STATUS_DROPPED) != 0) return -1;
- return 0;
-}
-
-static int32_t mndSetCreateBnodeCommitLogs(STrans *pTrans, SBnodeObj *pObj) {
- SSdbRaw *pCommitRaw = mndBnodeActionEncode(pObj);
- if (pCommitRaw == NULL) return -1;
- if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
- if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_READY) != 0) return -1;
- return 0;
-}
-
-static int32_t mndSetCreateBnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SBnodeObj *pObj) {
- SDCreateBnodeReq createReq = {0};
- createReq.dnodeId = pDnode->id;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void *pReq = taosMemoryMalloc(contLen);
- if (pReq == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- STransAction action = {0};
- action.epSet = mndGetDnodeEpset(pDnode);
- action.pCont = pReq;
- action.contLen = contLen;
- action.msgType = TDMT_DND_CREATE_BNODE;
- action.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED;
-
- if (mndTransAppendRedoAction(pTrans, &action) != 0) {
- taosMemoryFree(pReq);
- return -1;
- }
-
- return 0;
-}
-
-static int32_t mndSetCreateBnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, SBnodeObj *pObj) {
- SDDropBnodeReq dropReq = {0};
- dropReq.dnodeId = pDnode->id;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void *pReq = taosMemoryMalloc(contLen);
- if (pReq == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- STransAction action = {0};
- action.epSet = mndGetDnodeEpset(pDnode);
- action.pCont = pReq;
- action.contLen = contLen;
- action.msgType = TDMT_DND_DROP_BNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
-
- if (mndTransAppendUndoAction(pTrans, &action) != 0) {
- taosMemoryFree(pReq);
- return -1;
- }
-
- return 0;
-}
-
-static int32_t mndCreateBnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode, SMCreateBnodeReq *pCreate) {
- int32_t code = -1;
-
- SBnodeObj bnodeObj = {0};
- bnodeObj.id = pDnode->id;
- bnodeObj.createdTime = taosGetTimestampMs();
- bnodeObj.updateTime = bnodeObj.createdTime;
-
- STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pReq, "create-bnode");
- if (pTrans == NULL) goto _OVER;
-
- mInfo("trans:%d, used to create bnode:%d", pTrans->id, pCreate->dnodeId);
- if (mndSetCreateBnodeRedoLogs(pTrans, &bnodeObj) != 0) goto _OVER;
- if (mndSetCreateBnodeUndoLogs(pTrans, &bnodeObj) != 0) goto _OVER;
- if (mndSetCreateBnodeCommitLogs(pTrans, &bnodeObj) != 0) goto _OVER;
- if (mndSetCreateBnodeRedoActions(pTrans, pDnode, &bnodeObj) != 0) goto _OVER;
- if (mndSetCreateBnodeUndoActions(pTrans, pDnode, &bnodeObj) != 0) goto _OVER;
- if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
-
- code = 0;
-
-_OVER:
- mndTransDrop(pTrans);
- return code;
-}
-
-static int32_t mndProcessCreateBnodeReq(SRpcMsg *pReq) {
- SMnode *pMnode = pReq->info.node;
- int32_t code = -1;
- SBnodeObj *pObj = NULL;
- SDnodeObj *pDnode = NULL;
- SMCreateBnodeReq createReq = {0};
-
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- goto _OVER;
- }
-
- mInfo("bnode:%d, start to create", createReq.dnodeId);
- if (mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_CREATE_BNODE) != 0) {
- goto _OVER;
- }
-
- pObj = mndAcquireBnode(pMnode, createReq.dnodeId);
- if (pObj != NULL) {
- terrno = TSDB_CODE_MND_BNODE_ALREADY_EXIST;
- goto _OVER;
- } else if (terrno != TSDB_CODE_MND_BNODE_NOT_EXIST) {
- goto _OVER;
- }
-
- pDnode = mndAcquireDnode(pMnode, createReq.dnodeId);
- if (pDnode == NULL) {
- terrno = TSDB_CODE_MND_DNODE_NOT_EXIST;
- goto _OVER;
- }
-
- code = mndCreateBnode(pMnode, pReq, pDnode, &createReq);
- if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
-
-_OVER:
- if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
- mError("bnode:%d, failed to create since %s", createReq.dnodeId, terrstr());
- }
-
- mndReleaseBnode(pMnode, pObj);
- mndReleaseDnode(pMnode, pDnode);
- return code;
-}
-
-static int32_t mndSetDropBnodeRedoLogs(STrans *pTrans, SBnodeObj *pObj) {
- SSdbRaw *pRedoRaw = mndBnodeActionEncode(pObj);
- if (pRedoRaw == NULL) return -1;
- if (mndTransAppendRedolog(pTrans, pRedoRaw) != 0) return -1;
- if (sdbSetRawStatus(pRedoRaw, SDB_STATUS_DROPPING) != 0) return -1;
- return 0;
-}
-
-static int32_t mndSetDropBnodeCommitLogs(STrans *pTrans, SBnodeObj *pObj) {
- SSdbRaw *pCommitRaw = mndBnodeActionEncode(pObj);
- if (pCommitRaw == NULL) return -1;
- if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
- if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;
- return 0;
-}
-
-static int32_t mndSetDropBnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SBnodeObj *pObj) {
- SDDropBnodeReq dropReq = {0};
- dropReq.dnodeId = pDnode->id;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void *pReq = taosMemoryMalloc(contLen);
- if (pReq == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- STransAction action = {0};
- action.epSet = mndGetDnodeEpset(pDnode);
- action.pCont = pReq;
- action.contLen = contLen;
- action.msgType = TDMT_DND_DROP_BNODE;
- action.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED;
-
- if (mndTransAppendRedoAction(pTrans, &action) != 0) {
- taosMemoryFree(pReq);
- return -1;
- }
-
- return 0;
-}
-
-static int32_t mndDropBnode(SMnode *pMnode, SRpcMsg *pReq, SBnodeObj *pObj) {
- int32_t code = -1;
-
- STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_NOTHING, pReq, "drop-bnode");
- if (pTrans == NULL) goto _OVER;
-
- mInfo("trans:%d, used to drop bnode:%d", pTrans->id, pObj->id);
- if (mndSetDropBnodeRedoLogs(pTrans, pObj) != 0) goto _OVER;
- if (mndSetDropBnodeCommitLogs(pTrans, pObj) != 0) goto _OVER;
- if (mndSetDropBnodeRedoActions(pTrans, pObj->pDnode, pObj) != 0) goto _OVER;
- if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
-
- code = 0;
-
-_OVER:
- mndTransDrop(pTrans);
- return code;
-}
-
-static int32_t mndProcessDropBnodeReq(SRpcMsg *pReq) {
- SMnode *pMnode = pReq->info.node;
- int32_t code = -1;
- SBnodeObj *pObj = NULL;
- SMDropBnodeReq dropReq = {0};
-
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- goto _OVER;
- }
-
- mInfo("bnode:%d, start to drop", dropReq.dnodeId);
- if (mndCheckOperPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_BNODE) != 0) {
- goto _OVER;
- }
-
- if (dropReq.dnodeId <= 0) {
- terrno = TSDB_CODE_INVALID_MSG;
- goto _OVER;
- }
-
- pObj = mndAcquireBnode(pMnode, dropReq.dnodeId);
- if (pObj == NULL) {
- goto _OVER;
- }
-
- code = mndDropBnode(pMnode, pReq, pObj);
- if (code == 0) code = TSDB_CODE_ACTION_IN_PROGRESS;
-
-_OVER:
- if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
- mError("bnode:%d, failed to drop since %s", dropReq.dnodeId, terrstr());
- }
-
- mndReleaseBnode(pMnode, pObj);
- return code;
-}
-
-static int32_t mndRetrieveBnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows) {
- SMnode *pMnode = pReq->info.node;
- SSdb *pSdb = pMnode->pSdb;
- int32_t numOfRows = 0;
- int32_t cols = 0;
- SBnodeObj *pObj = NULL;
-
- while (numOfRows < rows) {
- pShow->pIter = sdbFetch(pSdb, SDB_BNODE, pShow->pIter, (void **)&pObj);
- if (pShow->pIter == NULL) break;
-
- cols = 0;
- SColumnInfoData *pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppend(pColInfo, numOfRows, (const char *)&pObj->id, false);
-
- char buf[TSDB_EP_LEN + VARSTR_HEADER_SIZE] = {0};
- STR_WITH_MAXSIZE_TO_VARSTR(buf, pObj->pDnode->ep, pShow->pMeta->pSchemas[cols].bytes);
-
- pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppend(pColInfo, numOfRows, buf, false);
-
- pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
- colDataAppend(pColInfo, numOfRows, (const char *)&pObj->createdTime, false);
-
- numOfRows++;
- sdbRelease(pSdb, pObj);
- }
-
- pShow->numOfRows += numOfRows;
-
- return numOfRows;
-}
-
-static void mndCancelGetNextBnode(SMnode *pMnode, void *pIter) {
- SSdb *pSdb = pMnode->pSdb;
- sdbCancelFetch(pSdb, pIter);
-}
diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c
index 46aaa7ffe16c9d684229480ac88a29e0469987b3..77f91b6d29a37ceaf9ade6ecda5b917ed4a3773f 100644
--- a/source/dnode/mnode/impl/src/mndConsumer.c
+++ b/source/dnode/mnode/impl/src/mndConsumer.c
@@ -278,7 +278,7 @@ static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
- mError("consumer %ld not exist", consumerId);
+ mError("consumer %" PRId64 " not exist", consumerId);
terrno = TSDB_CODE_MND_CONSUMER_NOT_EXIST;
return -1;
}
@@ -288,7 +288,7 @@ static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
int32_t status = atomic_load_32(&pConsumer->status);
if (status == MQ_CONSUMER_STATUS__LOST_REBD) {
- mInfo("try to recover consumer %ld", consumerId);
+ mInfo("try to recover consumer %" PRId64 "", consumerId);
SMqConsumerRecoverMsg *pRecoverMsg = rpcMallocCont(sizeof(SMqConsumerRecoverMsg));
pRecoverMsg->consumerId = consumerId;
@@ -327,7 +327,7 @@ static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
#if 1
if (status == MQ_CONSUMER_STATUS__LOST_REBD) {
- mInfo("try to recover consumer %ld", consumerId);
+ mInfo("try to recover consumer %" PRId64 "", consumerId);
SMqConsumerRecoverMsg *pRecoverMsg = rpcMallocCont(sizeof(SMqConsumerRecoverMsg));
pRecoverMsg->consumerId = consumerId;
@@ -341,7 +341,7 @@ static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
#endif
if (status != MQ_CONSUMER_STATUS__READY) {
- mInfo("consumer %ld not ready, status: %s", consumerId, mndConsumerStatusName(status));
+ mInfo("consumer %" PRId64 " not ready, status: %s", consumerId, mndConsumerStatusName(status));
terrno = TSDB_CODE_MND_CONSUMER_NOT_READY;
return -1;
}
diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c
index 3b3187385771da81d703a270c3f9f07e3171505e..2660fa314657fad918ca6e163ee6296f33f57be0 100644
--- a/source/dnode/mnode/impl/src/mndDb.c
+++ b/source/dnode/mnode/impl/src/mndDb.c
@@ -113,7 +113,7 @@ static SSdbRaw *mndDbActionEncode(SDbObj *pDb) {
SDB_SET_INT8(pRaw, dataPos, pDb->cfg.hashMethod, _OVER)
SDB_SET_INT32(pRaw, dataPos, pDb->cfg.numOfRetensions, _OVER)
for (int32_t i = 0; i < pDb->cfg.numOfRetensions; ++i) {
- TASSERT(taosArrayGetSize(pDb->cfg.pRetensions) == pDb->cfg.numOfRetensions);
+ ASSERT(taosArrayGetSize(pDb->cfg.pRetensions) == pDb->cfg.numOfRetensions);
SRetention *pRetension = taosArrayGet(pDb->cfg.pRetensions, i);
SDB_SET_INT64(pRaw, dataPos, pRetension->freq, _OVER)
SDB_SET_INT64(pRaw, dataPos, pRetension->keep, _OVER)
@@ -1157,7 +1157,7 @@ static void mndBuildDBVgroupInfo(SDbObj *pDb, SMnode *pMnode, SArray *pVgList) {
pEp->port = pDnode->port;
}
mndReleaseDnode(pMnode, pDnode);
- if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
+ if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) {
vgInfo.epSet.inUse = gid;
}
}
@@ -1553,7 +1553,7 @@ bool mndIsDbReady(SMnode *pMnode, SDbObj *pDb) {
if (pVgroup->dbUid == pDb->uid && pVgroup->replica > 1) {
bool hasLeader = false;
for (int32_t i = 0; i < pVgroup->replica; ++i) {
- if (pVgroup->vnodeGid[i].role == TAOS_SYNC_STATE_LEADER) {
+ if (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER) {
hasLeader = true;
}
}
diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c
index fba1fd94d6b537a9f587d898c062f01a0b47df19..264b8d979b7a00de55ae7b10b422ee27889854fc 100644
--- a/source/dnode/mnode/impl/src/mndDnode.c
+++ b/source/dnode/mnode/impl/src/mndDnode.c
@@ -361,10 +361,12 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
bool roleChanged = false;
for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) {
- if (pVgroup->vnodeGid[vg].role != pVload->syncState) {
+ if (pVgroup->vnodeGid[vg].syncState != pVload->syncState ||
+ pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) {
+ pVgroup->vnodeGid[vg].syncState = pVload->syncState;
+ pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore;
roleChanged = true;
}
- pVgroup->vnodeGid[vg].role = pVload->syncState;
break;
}
}
@@ -378,10 +380,11 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
SMnodeObj *pObj = mndAcquireMnode(pMnode, pDnode->id);
if (pObj != NULL) {
- if (pObj->state != statusReq.mload.syncState) {
- mInfo("dnode:%d, mnode syncstate from %s to %s", pObj->id, syncStr(pObj->state),
- syncStr(statusReq.mload.syncState));
- pObj->state = statusReq.mload.syncState;
+ if (pObj->syncState != statusReq.mload.syncState || pObj->syncRestore != statusReq.mload.syncRestore) {
+ mInfo("dnode:%d, mnode syncState from %s to %s, restoreState from %d to %d", pObj->id, syncStr(pObj->syncState),
+ syncStr(statusReq.mload.syncState), pObj->syncRestore, statusReq.mload.syncRestore);
+ pObj->syncState = statusReq.mload.syncState;
+ pObj->syncRestore = statusReq.mload.syncRestore;
pObj->stateStartTime = taosGetTimestampMs();
}
mndReleaseMnode(pMnode, pObj);
diff --git a/source/dnode/mnode/impl/src/mndDump.c b/source/dnode/mnode/impl/src/mndDump.c
index c1c7581a7e2c1d64cbcc2409da86a1b07de90db5..7d0f5742f8bd69df9eb2d21836935dffb84875c0 100644
--- a/source/dnode/mnode/impl/src/mndDump.c
+++ b/source/dnode/mnode/impl/src/mndDump.c
@@ -447,10 +447,6 @@ void dumpDnode(SSdb *pSdb, SJson *json) {
}
}
-void dumpBnode(SSdb *pSdb, SJson *json) {
- // not implemented yet
-}
-
void dumpSnode(SSdb *pSdb, SJson *json) {
void *pIter = NULL;
SJson *items = tjsonAddArrayToObject(json, "snodes");
@@ -616,7 +612,6 @@ void mndDumpSdb() {
dumpAuth(pSdb, json);
dumpUser(pSdb, json);
dumpDnode(pSdb, json);
- dumpBnode(pSdb, json);
dumpSnode(pSdb, json);
dumpQnode(pSdb, json);
dumpMnode(pSdb, json);
diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c
index 5fb23b045c92e27da10486bb54f9343bb23bc81d..a6177fc69f7b5a6c76292244871e8e8464e8752b 100644
--- a/source/dnode/mnode/impl/src/mndMain.c
+++ b/source/dnode/mnode/impl/src/mndMain.c
@@ -15,7 +15,6 @@
#define _DEFAULT_SOURCE
#include "mndAcct.h"
-#include "mndBnode.h"
#include "mndCluster.h"
#include "mndConsumer.h"
#include "mndDb.h"
@@ -296,7 +295,6 @@ static int32_t mndInitSteps(SMnode *pMnode) {
if (mndAllocStep(pMnode, "mnode-mnode", mndInitMnode, mndCleanupMnode) != 0) return -1;
if (mndAllocStep(pMnode, "mnode-qnode", mndInitQnode, mndCleanupQnode) != 0) return -1;
if (mndAllocStep(pMnode, "mnode-snode", mndInitSnode, mndCleanupSnode) != 0) return -1;
- if (mndAllocStep(pMnode, "mnode-bnode", mndInitBnode, mndCleanupBnode) != 0) return -1;
if (mndAllocStep(pMnode, "mnode-dnode", mndInitDnode, mndCleanupDnode) != 0) return -1;
if (mndAllocStep(pMnode, "mnode-user", mndInitUser, mndCleanupUser) != 0) return -1;
if (mndAllocStep(pMnode, "mnode-grant", mndInitGrant, mndCleanupGrant) != 0) return -1;
@@ -603,22 +601,27 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
return 0;
}
if (mndAcquireRpc(pMsg->info.node) == 0) return 0;
+
+ SMnode *pMnode = pMsg->info.node;
+ const char *role = syncGetMyRoleStr(pMnode->syncMgmt.sync);
+ bool restored = syncIsRestoreFinish(pMnode->syncMgmt.sync);
if (pMsg->msgType == TDMT_MND_MQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER ||
pMsg->msgType == TDMT_MND_TRANS_TIMER || pMsg->msgType == TDMT_MND_TTL_TIMER ||
pMsg->msgType == TDMT_MND_UPTIME_TIMER) {
+ mTrace("timer not process since mnode restored:%d stopped:%d, sync restored:%d role:%s ", pMnode->restored,
+ pMnode->stopped, restored, role);
return -1;
}
- SEpSet epSet = {0};
- SMnode *pMnode = pMsg->info.node;
+ const STraceId *trace = &pMsg->info.traceId;
+ SEpSet epSet = {0};
mndGetMnodeEpSet(pMnode, &epSet);
- const STraceId *trace = &pMsg->info.traceId;
mDebug(
- "msg:%p, failed to check mnode state since %s, mnode restored:%d stopped:%d, sync restored:%d role:%s type:%s "
- "numOfEps:%d inUse:%d",
- pMsg, terrstr(), pMnode->restored, pMnode->stopped, syncIsRestoreFinish(pMnode->syncMgmt.sync),
- syncGetMyRoleStr(pMnode->syncMgmt.sync), TMSG_INFO(pMsg->msgType), epSet.numOfEps, epSet.inUse);
+ "msg:%p, type:%s failed to process since %s, mnode restored:%d stopped:%d, sync restored:%d "
+ "role:%s, redirect numOfEps:%d inUse:%d",
+ pMsg, TMSG_INFO(pMsg->msgType), terrstr(), pMnode->restored, pMnode->stopped, restored, role, epSet.numOfEps,
+ epSet.inUse);
if (epSet.numOfEps > 0) {
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
@@ -762,7 +765,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr
// pClusterInfo->master_uptime = (ms - pObj->stateStartTime) / (86400000.0f);
tstrncpy(desc.role, syncStr(TAOS_SYNC_STATE_LEADER), sizeof(desc.role));
} else {
- tstrncpy(desc.role, syncStr(pObj->state), sizeof(desc.role));
+ tstrncpy(desc.role, syncStr(pObj->syncState), sizeof(desc.role));
}
taosArrayPush(pClusterInfo->mnodes, &desc);
sdbRelease(pSdb, pObj);
@@ -792,12 +795,12 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
SMonVnodeDesc *pVnDesc = &desc.vnodes[i];
pVnDesc->dnode_id = pVgid->dnodeId;
- tstrncpy(pVnDesc->vnode_role, syncStr(pVgid->role), sizeof(pVnDesc->vnode_role));
- if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
+ tstrncpy(pVnDesc->vnode_role, syncStr(pVgid->syncState), sizeof(pVnDesc->vnode_role));
+ if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) {
tstrncpy(desc.status, "ready", sizeof(desc.status));
pClusterInfo->vgroups_alive++;
}
- if (pVgid->role != TAOS_SYNC_STATE_ERROR) {
+ if (pVgid->syncState != TAOS_SYNC_STATE_ERROR) {
pClusterInfo->vnodes_alive++;
}
pClusterInfo->vnodes_total++;
@@ -842,7 +845,8 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr
int32_t mndGetLoad(SMnode *pMnode, SMnodeLoad *pLoad) {
pLoad->syncState = syncGetMyRole(pMnode->syncMgmt.sync);
- mTrace("mnode current syncstate is %s", syncStr(pLoad->syncState));
+ pLoad->syncRestore = pMnode->restored;
+ mTrace("mnode current syncState is %s, syncRestore:%d", syncStr(pLoad->syncState), pLoad->syncRestore);
return 0;
}
diff --git a/source/dnode/mnode/impl/src/mndMnode.c b/source/dnode/mnode/impl/src/mndMnode.c
index c27241317c2f2afa05d4744bc8e4c6e1ceb104f9..1ab0ba8a16e5412148139e849498bdafab64c581 100644
--- a/source/dnode/mnode/impl/src/mndMnode.c
+++ b/source/dnode/mnode/impl/src/mndMnode.c
@@ -187,7 +187,7 @@ static int32_t mndMnodeActionInsert(SSdb *pSdb, SMnodeObj *pObj) {
return -1;
}
- pObj->state = TAOS_SYNC_STATE_ERROR;
+ pObj->syncState = TAOS_SYNC_STATE_ERROR;
mndReloadSyncConfig(pSdb->pMnode);
return 0;
}
@@ -324,9 +324,9 @@ static int32_t mndBuildAlterMnodeRedoAction(STrans *pTrans, SDCreateMnodeReq *pA
}
static int32_t mndBuildDropMnodeRedoAction(STrans *pTrans, SDDropMnodeReq *pDropReq, SEpSet *pDroprEpSet) {
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, pDropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, pDropReq);
void *pReq = taosMemoryMalloc(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, pDropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, pDropReq);
STransAction action = {
.epSet = *pDroprEpSet,
@@ -394,7 +394,6 @@ static int32_t mndCreateMnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode,
if (mndSetCreateMnodeRedoActions(pMnode, pTrans, pDnode, &mnodeObj) != 0) goto _OVER;
if (mndSetCreateMnodeRedoLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
if (mndSetCreateMnodeCommitLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
- if (mndTransAppendNullLog(pTrans) != 0) goto _OVER;
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
code = 0;
@@ -411,7 +410,7 @@ static int32_t mndProcessCreateMnodeReq(SRpcMsg *pReq) {
SDnodeObj *pDnode = NULL;
SMCreateMnodeReq createReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
goto _OVER;
}
@@ -478,7 +477,6 @@ static int32_t mndSetDropMnodeCommitLogs(SMnode *pMnode, STrans *pTrans, SMnodeO
static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnodeObj *pDnode, SMnodeObj *pObj) {
SSdb *pSdb = pMnode->pSdb;
void *pIter = NULL;
- int32_t numOfReplicas = 0;
SDDropMnodeReq dropReq = {0};
SEpSet dropEpSet = {0};
@@ -505,9 +503,8 @@ static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnode
int32_t mndSetDropMnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SMnodeObj *pObj) {
if (pObj == NULL) return 0;
- if (mndSetDropMnodeCommitLogs(pMnode, pTrans, pObj) != 0) return -1;
if (mndSetDropMnodeRedoActions(pMnode, pTrans, pObj->pDnode, pObj) != 0) return -1;
- if (mndTransAppendNullLog(pTrans) != 0) return -1;
+ if (mndSetDropMnodeCommitLogs(pMnode, pTrans, pObj) != 0) return -1;
return 0;
}
@@ -536,7 +533,7 @@ static int32_t mndProcessDropMnodeReq(SRpcMsg *pReq) {
SMnodeObj *pObj = NULL;
SMDropMnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
goto _OVER;
}
@@ -607,19 +604,19 @@ static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, b1, false);
- const char *roles = "offline";
+ char role[20] = "offline";
if (pObj->id == pMnode->selfDnodeId) {
- roles = syncStr(TAOS_SYNC_STATE_LEADER);
+ snprintf(role, sizeof(role), "%s%s", syncStr(TAOS_SYNC_STATE_LEADER), pMnode->restored ? "" : "*");
}
if (mndIsDnodeOnline(pObj->pDnode, curMs)) {
- roles = syncStr(pObj->state);
- if (pObj->state == TAOS_SYNC_STATE_LEADER && pObj->id != pMnode->selfDnodeId) {
- roles = syncStr(TAOS_SYNC_STATE_ERROR);
+ tstrncpy(role, syncStr(pObj->syncState), sizeof(role));
+ if (pObj->syncState == TAOS_SYNC_STATE_LEADER && pObj->id != pMnode->selfDnodeId) {
+ tstrncpy(role, syncStr(TAOS_SYNC_STATE_ERROR), sizeof(role));
mError("mnode:%d, is leader too", pObj->id);
}
}
char b2[12 + VARSTR_HEADER_SIZE] = {0};
- STR_WITH_MAXSIZE_TO_VARSTR(b2, roles, pShow->pMeta->pSchemas[cols].bytes);
+ STR_WITH_MAXSIZE_TO_VARSTR(b2, role, pShow->pMeta->pSchemas[cols].bytes);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, (const char *)b2, false);
@@ -715,7 +712,8 @@ static void mndReloadSyncConfig(SMnode *pMnode) {
SMnodeObj *pObj = NULL;
ESdbStatus objStatus = 0;
void *pIter = NULL;
- bool hasUpdatingMnode = false;
+ int32_t updatingMnodes = 0;
+ int32_t readyMnodes = 0;
SSyncCfg cfg = {.myIndex = -1};
while (1) {
@@ -723,7 +721,11 @@ static void mndReloadSyncConfig(SMnode *pMnode) {
if (pIter == NULL) break;
if (objStatus == SDB_STATUS_CREATING || objStatus == SDB_STATUS_DROPPING) {
mInfo("vgId:1, has updating mnode:%d, status:%s", pObj->id, sdbStatusName(objStatus));
- hasUpdatingMnode = true;
+ updatingMnodes++;
+ }
+ if (objStatus == SDB_STATUS_READY) {
+ mInfo("vgId:1, has ready mnode:%d, status:%s", pObj->id, sdbStatusName(objStatus));
+ readyMnodes++;
}
if (objStatus == SDB_STATUS_READY || objStatus == SDB_STATUS_CREATING) {
@@ -739,18 +741,25 @@ static void mndReloadSyncConfig(SMnode *pMnode) {
sdbReleaseLock(pSdb, pObj, false);
}
- if (cfg.myIndex == -1) {
- mInfo("vgId:1, mnode not reload since selfIndex is -1");
+ if (readyMnodes <= 0 || updatingMnodes <= 0) {
+ mInfo("vgId:1, mnode sync not reconfig since readyMnodes:%d updatingMnodes:%d", readyMnodes, updatingMnodes);
return;
}
+ // ASSERT(0);
- if (!mndGetRestored(pMnode)) {
- mInfo("vgId:1, mnode not reload since restore not finished");
+ if (cfg.myIndex == -1) {
+#if 1
+ mInfo("vgId:1, mnode sync not reconfig since selfIndex is -1");
+#else
+ // cannot reconfig because the leader may fail to elect after reboot
+ mInfo("vgId:1, mnode sync not reconfig since selfIndex is -1, do sync stop oper");
+ syncStop(pMnode->syncMgmt.sync);
+#endif
return;
}
- if (hasUpdatingMnode) {
- mInfo("vgId:1, start to reload mnode sync, replica:%d myIndex:%d", cfg.replicaNum, cfg.myIndex);
+ if (updatingMnodes > 0) {
+ mInfo("vgId:1, mnode sync reconfig, replica:%d myIndex:%d", cfg.replicaNum, cfg.myIndex);
for (int32_t i = 0; i < cfg.replicaNum; ++i) {
SNodeInfo *pNode = &cfg.nodeInfo[i];
mInfo("vgId:1, index:%d, fqdn:%s port:%d", i, pNode->nodeFqdn, pNode->nodePort);
diff --git a/source/dnode/mnode/impl/src/mndQnode.c b/source/dnode/mnode/impl/src/mndQnode.c
index d48a446e20ecb979acf559dc88710a719869b310..70f9b35312a40405a1413f4ec7089d37f3f4d5c9 100644
--- a/source/dnode/mnode/impl/src/mndQnode.c
+++ b/source/dnode/mnode/impl/src/mndQnode.c
@@ -190,13 +190,13 @@ static int32_t mndSetCreateQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, S
SDCreateQnodeReq createReq = {0};
createReq.dnodeId = pDnode->id;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
STransAction action = {0};
action.epSet = mndGetDnodeEpset(pDnode);
@@ -217,13 +217,13 @@ static int32_t mndSetCreateQnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, S
SDDropQnodeReq dropReq = {0};
dropReq.dnodeId = pDnode->id;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
STransAction action = {0};
action.epSet = mndGetDnodeEpset(pDnode);
@@ -273,7 +273,7 @@ static int32_t mndProcessCreateQnodeReq(SRpcMsg *pReq) {
SDnodeObj *pDnode = NULL;
SMCreateQnodeReq createReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
goto _OVER;
}
@@ -330,13 +330,13 @@ static int32_t mndSetDropQnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SQn
SDDropQnodeReq dropReq = {0};
dropReq.dnodeId = pDnode->id;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
STransAction action = {0};
action.epSet = mndGetDnodeEpset(pDnode);
@@ -384,7 +384,7 @@ static int32_t mndProcessDropQnodeReq(SRpcMsg *pReq) {
SQnodeObj *pObj = NULL;
SMDropQnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
goto _OVER;
}
diff --git a/source/dnode/mnode/impl/src/mndQuery.c b/source/dnode/mnode/impl/src/mndQuery.c
index 2e01fadbae7cd0f957fc5d4af013bc57af7f3ba9..3e4c8005b49c06eade4f432c48981e768dd01fc7 100644
--- a/source/dnode/mnode/impl/src/mndQuery.c
+++ b/source/dnode/mnode/impl/src/mndQuery.c
@@ -90,14 +90,39 @@ int32_t mndProcessBatchMetaMsg(SRpcMsg *pMsg) {
}
for (int32_t i = 0; i < msgNum; ++i) {
+ if (offset >= pMsg->contLen) {
+ mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
+
req.msgIdx = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
offset += sizeof(req.msgIdx);
+ if (offset >= pMsg->contLen) {
+ mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
req.msgType = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
offset += sizeof(req.msgType);
+ if (offset >= pMsg->contLen) {
+ mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
req.msgLen = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
offset += sizeof(req.msgLen);
+ if (offset >= pMsg->contLen) {
+ mError("offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
req.msg = (char *)pMsg->pCont + offset;
offset += req.msgLen;
diff --git a/source/dnode/mnode/impl/src/mndShow.c b/source/dnode/mnode/impl/src/mndShow.c
index 5a998dfe986d9f012e066f45810604b7ca9d728f..8b4cacf8d609ecf24b699f4cccf6306c6ada15c8 100644
--- a/source/dnode/mnode/impl/src/mndShow.c
+++ b/source/dnode/mnode/impl/src/mndShow.c
@@ -60,8 +60,6 @@ static int32_t convertToRetrieveType(char *name, int32_t len) {
type = TSDB_MGMT_TABLE_MODULE;
} else if (strncasecmp(name, TSDB_INS_TABLE_QNODES, len) == 0) {
type = TSDB_MGMT_TABLE_QNODE;
- } else if (strncasecmp(name, TSDB_INS_TABLE_BNODES, len) == 0) {
- type = TSDB_MGMT_TABLE_BNODE;
} else if (strncasecmp(name, TSDB_INS_TABLE_SNODES, len) == 0) {
type = TSDB_MGMT_TABLE_SNODE;
} else if (strncasecmp(name, TSDB_INS_TABLE_CLUSTER, len) == 0) {
diff --git a/source/dnode/mnode/impl/src/mndSnode.c b/source/dnode/mnode/impl/src/mndSnode.c
index 916e8d0c449334f3a4b436b7187c4bf2b965a842..8127d5912e9fb1f43b2d7fb84b38b4ca19114188 100644
--- a/source/dnode/mnode/impl/src/mndSnode.c
+++ b/source/dnode/mnode/impl/src/mndSnode.c
@@ -195,13 +195,13 @@ static int32_t mndSetCreateSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, S
SDCreateSnodeReq createReq = {0};
createReq.dnodeId = pDnode->id;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
STransAction action = {0};
action.epSet = mndGetDnodeEpset(pDnode);
@@ -222,13 +222,13 @@ static int32_t mndSetCreateSnodeUndoActions(STrans *pTrans, SDnodeObj *pDnode, S
SDDropSnodeReq dropReq = {0};
dropReq.dnodeId = pDnode->id;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
STransAction action = {0};
action.epSet = mndGetDnodeEpset(pDnode);
@@ -282,7 +282,7 @@ static int32_t mndProcessCreateSnodeReq(SRpcMsg *pReq) {
SDnodeObj *pDnode = NULL;
SMCreateSnodeReq createReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &createReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
goto _OVER;
}
@@ -341,13 +341,13 @@ static int32_t mndSetDropSnodeRedoActions(STrans *pTrans, SDnodeObj *pDnode, SSn
SDDropSnodeReq dropReq = {0};
dropReq.dnodeId = pDnode->id;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void *pReq = taosMemoryMalloc(contLen);
if (pReq == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
STransAction action = {0};
action.epSet = mndGetDnodeEpset(pDnode);
@@ -398,7 +398,7 @@ static int32_t mndProcessDropSnodeReq(SRpcMsg *pReq) {
SSnodeObj *pObj = NULL;
SMDropSnodeReq dropReq = {0};
- if (tDeserializeSCreateDropMQSBNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
+ if (tDeserializeSCreateDropMQSNodeReq(pReq->pCont, pReq->contLen, &dropReq) != 0) {
terrno = TSDB_CODE_INVALID_MSG;
goto _OVER;
}
diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c
index 10cfb0a6602622373954b46c8771f48f65bcb2b4..4b1906ba7039213f3507488c91dafff8c1795497 100644
--- a/source/dnode/mnode/impl/src/mndStb.c
+++ b/source/dnode/mnode/impl/src/mndStb.c
@@ -2553,12 +2553,17 @@ static int32_t mndRetrieveStb(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
char rollup[160 + VARSTR_HEADER_SIZE] = {0};
int32_t rollupNum = (int32_t)taosArrayGetSize(pStb->pFuncs);
+ char *sep = ", ";
+ int32_t sepLen = strlen(sep);
+ int32_t rollupLen = sizeof(rollup) - VARSTR_HEADER_SIZE - 2;
for (int32_t i = 0; i < rollupNum; ++i) {
char *funcName = taosArrayGet(pStb->pFuncs, i);
if (i) {
- strcat(varDataVal(rollup), ", ");
+ strncat(varDataVal(rollup), sep, rollupLen);
+ rollupLen -= sepLen;
}
- strcat(varDataVal(rollup), funcName);
+ strncat(varDataVal(rollup), funcName, rollupLen);
+ rollupLen -= strlen(funcName);
}
varDataSetLen(rollup, strlen(varDataVal(rollup)));
diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c
index b797bfb4b2e6006ae608e6b15a47efd4e5f62aa7..739b8bbf01b0f4a871d611e34729363097ca1d92 100644
--- a/source/dnode/mnode/impl/src/mndSubscribe.c
+++ b/source/dnode/mnode/impl/src/mndSubscribe.c
@@ -426,10 +426,10 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
if (pIter == NULL) break;
SMqConsumerEp *pConsumerEp = (SMqConsumerEp *)pIter;
int32_t sz = taosArrayGetSize(pConsumerEp->vgs);
- mInfo("mq rebalance: final cfg: consumer %ld has %d vg", pConsumerEp->consumerId, sz);
+ mInfo("mq rebalance: final cfg: consumer %" PRId64 " has %d vg", pConsumerEp->consumerId, sz);
for (int32_t i = 0; i < sz; i++) {
SMqVgEp *pVgEp = taosArrayGetP(pConsumerEp->vgs, i);
- mInfo("mq rebalance: final cfg: vg %d to consumer %ld", pVgEp->vgId, pConsumerEp->consumerId);
+ mInfo("mq rebalance: final cfg: vg %d to consumer %" PRId64 "", pVgEp->vgId, pConsumerEp->consumerId);
}
}
}
diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c
index 866a3fa8b9027e2c5414546ef1648c4b471cbbbb..ac95dd2795b5fb90b4cd1cf657aa151850035af8 100644
--- a/source/dnode/mnode/impl/src/mndSync.c
+++ b/source/dnode/mnode/impl/src/mndSync.c
@@ -293,6 +293,14 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
if (code == 0) {
tsem_wait(&pMgmt->syncSem);
+ } else if (code > 0) {
+ mInfo("trans:%d, confirm at once since replica is 1, continue execute", transId);
+ taosWLockLatch(&pMgmt->lock);
+ pMgmt->transId = 0;
+ taosWUnLockLatch(&pMgmt->lock);
+ sdbWriteWithoutFree(pMnode->pSdb, pRaw);
+ sdbSetApplyInfo(pMnode->pSdb, req.info.conn.applyIndex, req.info.conn.applyTerm, SYNC_INDEX_INVALID);
+ code = 0;
} else if (code == -1 && terrno == TSDB_CODE_SYN_NOT_LEADER) {
terrno = TSDB_CODE_APP_NOT_READY;
} else if (code == -1 && terrno == TSDB_CODE_SYN_INTERNAL_ERROR) {
diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c
index 4ab80b0a40e73584696d6678f2b6eeefdc261f15..47245fa2c4e549f1213d51187de5b04d603bf170 100644
--- a/source/dnode/mnode/impl/src/mndVgroup.c
+++ b/source/dnode/mnode/impl/src/mndVgroup.c
@@ -142,7 +142,7 @@ SSdbRow *mndVgroupActionDecode(SSdbRaw *pRaw) {
SVnodeGid *pVgid = &pVgroup->vnodeGid[i];
SDB_GET_INT32(pRaw, dataPos, &pVgid->dnodeId, _OVER)
if (pVgroup->replica == 1) {
- pVgid->role = TAOS_SYNC_STATE_LEADER;
+ pVgid->syncState = TAOS_SYNC_STATE_LEADER;
}
}
SDB_GET_RESERVE(pRaw, dataPos, VGROUP_RESERVE_SIZE, _OVER)
@@ -485,9 +485,9 @@ static int32_t mndGetAvailableDnode(SMnode *pMnode, SDbObj *pDb, SVgObj *pVgroup
pVgid->dnodeId = pDnode->id;
if (pVgroup->replica == 1) {
- pVgid->role = TAOS_SYNC_STATE_LEADER;
+ pVgid->syncState = TAOS_SYNC_STATE_LEADER;
} else {
- pVgid->role = TAOS_SYNC_STATE_FOLLOWER;
+ pVgid->syncState = TAOS_SYNC_STATE_FOLLOWER;
}
mInfo("db:%s, vgId:%d, vn:%d is alloced, memory:%" PRId64 ", dnode:%d avail:%" PRId64 " used:%" PRId64,
@@ -587,7 +587,7 @@ SEpSet mndGetVgroupEpset(SMnode *pMnode, const SVgObj *pVgroup) {
SDnodeObj *pDnode = mndAcquireDnode(pMnode, pVgid->dnodeId);
if (pDnode == NULL) continue;
- if (pVgid->role == TAOS_SYNC_STATE_LEADER) {
+ if (pVgid->syncState == TAOS_SYNC_STATE_LEADER) {
epset.inUse = epset.numOfEps;
}
@@ -681,8 +681,12 @@ static int32_t mndRetrieveVgroups(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *p
mndReleaseDnode(pMnode, pDnode);
}
- char buf1[20] = {0};
- const char *role = online ? syncStr(pVgroup->vnodeGid[i].role) : "offline";
+ char buf1[20] = {0};
+ char role[20] = "offline";
+ if (online) {
+ bool show = (pVgroup->vnodeGid[i].syncState == TAOS_SYNC_STATE_LEADER && !pVgroup->vnodeGid[i].syncRestore);
+ snprintf(role, sizeof(role), "%s%s", syncStr(pVgroup->vnodeGid[i].syncState), show ? "*" : "");
+ }
STR_WITH_MAXSIZE_TO_VARSTR(buf1, role, pShow->pMeta->pSchemas[cols].bytes);
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
@@ -809,7 +813,7 @@ static int32_t mndRetrieveVnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
colDataAppend(pColInfo, numOfRows, (const char *)&pVgroup->replica, false);
char buf[20] = {0};
- STR_TO_VARSTR(buf, syncStr(pVgid->role));
+ STR_TO_VARSTR(buf, syncStr(pVgid->syncState));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, (const char *)buf, false);
@@ -887,7 +891,7 @@ int32_t mndAddVnodeToVgroup(SMnode *pMnode, SVgObj *pVgroup, SArray *pArray) {
}
pVgid->dnodeId = pDnode->id;
- pVgid->role = TAOS_SYNC_STATE_ERROR;
+ pVgid->syncState = TAOS_SYNC_STATE_ERROR;
mInfo("db:%s, vgId:%d, vn:%d is added, memory:%" PRId64 ", dnode:%d avail:%" PRId64 " used:%" PRId64,
pVgroup->dbName, pVgroup->vgId, pVgroup->replica, vgMem, pVgid->dnodeId, pDnode->memAvail, pDnode->memUsed);
@@ -1179,7 +1183,7 @@ static int32_t mndAddIncVgroupReplicaToTrans(SMnode *pMnode, STrans *pTrans, SDb
SVnodeGid *pGid = &pVgroup->vnodeGid[pVgroup->replica];
pVgroup->replica++;
pGid->dnodeId = newDnodeId;
- pGid->role = TAOS_SYNC_STATE_ERROR;
+ pGid->syncState = TAOS_SYNC_STATE_ERROR;
if (mndAddCreateVnodeAction(pMnode, pTrans, pDb, pVgroup, pGid, true) != 0) return -1;
if (mndAddAlterVnodeAction(pMnode, pTrans, pDb, pVgroup, TDMT_VND_ALTER_REPLICA) != 0) return -1;
@@ -1233,7 +1237,7 @@ static int32_t mndRedistributeVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb,
mInfo("vgId:%d, vgroup info before redistribute, replica:%d", newVg.vgId, newVg.replica);
for (int32_t i = 0; i < newVg.replica; ++i) {
mInfo("vgId:%d, vnode:%d dnode:%d role:%s", newVg.vgId, i, newVg.vnodeGid[i].dnodeId,
- syncStr(newVg.vnodeGid[i].role));
+ syncStr(newVg.vnodeGid[i].syncState));
}
if (pNew1 != NULL && pOld1 != NULL) {
diff --git a/source/dnode/mnode/impl/test/CMakeLists.txt b/source/dnode/mnode/impl/test/CMakeLists.txt
index 3b1ca0999cf97e6d10cac810a3e7505217e39d88..7db84855618270985335418cb6470f870e93446f 100644
--- a/source/dnode/mnode/impl/test/CMakeLists.txt
+++ b/source/dnode/mnode/impl/test/CMakeLists.txt
@@ -1,7 +1,6 @@
enable_testing()
add_subdirectory(acct)
-add_subdirectory(bnode)
add_subdirectory(db)
#add_subdirectory(dnode)
add_subdirectory(func)
diff --git a/source/dnode/mnode/impl/test/bnode/CMakeLists.txt b/source/dnode/mnode/impl/test/bnode/CMakeLists.txt
deleted file mode 100644
index 2dd7b9ef78b0a396852389bd420724271443b310..0000000000000000000000000000000000000000
--- a/source/dnode/mnode/impl/test/bnode/CMakeLists.txt
+++ /dev/null
@@ -1,11 +0,0 @@
-# aux_source_directory(. MNODE_BNODE_TEST_SRC)
-# add_executable(mbnodeTest ${MNODE_BNODE_TEST_SRC})
-# target_link_libraries(
-# mbnodeTest
-# PUBLIC sut
-# )
-
-# add_test(
-# NAME mbnodeTest
-# COMMAND mbnodeTest
-# )
diff --git a/source/dnode/mnode/impl/test/bnode/mbnode.cpp b/source/dnode/mnode/impl/test/bnode/mbnode.cpp
deleted file mode 100644
index c93e2142d02de318da323fa00ee7c04531d58874..0000000000000000000000000000000000000000
--- a/source/dnode/mnode/impl/test/bnode/mbnode.cpp
+++ /dev/null
@@ -1,293 +0,0 @@
-/**
- * @file bnode.cpp
- * @author slguan (slguan@taosdata.com)
- * @brief MNODE module bnode tests
- * @version 1.0
- * @date 2022-01-05
- *
- * @copyright Copyright (c) 2022
- *
- */
-
-#include "sut.h"
-
-class MndTestBnode : public ::testing::Test {
- public:
- void SetUp() override {}
- void TearDown() override {}
-
- public:
- static void SetUpTestSuite() {
- test.Init(TD_TMP_DIR_PATH "mnode_test_bnode1", 9018);
- const char* fqdn = "localhost";
- const char* firstEp = "localhost:9018";
-
- server2.Start(TD_TMP_DIR_PATH "mnode_test_bnode2", 9019);
- taosMsleep(300);
- }
-
- static void TearDownTestSuite() {
- server2.Stop();
- test.Cleanup();
- }
-
- static Testbase test;
- static TestServer server2;
-};
-
-Testbase MndTestBnode::test;
-TestServer MndTestBnode::server2;
-
-TEST_F(MndTestBnode, 01_Show_Bnode) {
- test.SendShowReq(TSDB_MGMT_TABLE_BNODE, "bnodes", "");
- EXPECT_EQ(test.GetShowRows(), 0);
-}
-
-TEST_F(MndTestBnode, 02_Create_Bnode) {
- {
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_MND_DNODE_NOT_EXIST);
- }
-
- {
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
-
- test.SendShowReq(TSDB_MGMT_TABLE_BNODE, "bnodes", "");
- EXPECT_EQ(test.GetShowRows(), 1);
- }
-
- {
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 1;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_MND_BNODE_ALREADY_EXIST);
- }
-}
-
-TEST_F(MndTestBnode, 03_Drop_Bnode) {
- {
- SCreateDnodeReq createReq = {0};
- strcpy(createReq.fqdn, "localhost");
- createReq.port = 9019;
-
- int32_t contLen = tSerializeSCreateDnodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDnodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_DNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
-
- taosMsleep(1300);
- test.SendShowReq(TSDB_MGMT_TABLE_DNODE, "dnodes", "");
- EXPECT_EQ(test.GetShowRows(), 2);
- }
-
- {
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
-
- test.SendShowReq(TSDB_MGMT_TABLE_BNODE, "bnodes", "");
- EXPECT_EQ(test.GetShowRows(), 2);
- }
-
- {
- SMDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, 0);
-
- test.SendShowReq(TSDB_MGMT_TABLE_BNODE, "bnodes", "");
- EXPECT_EQ(test.GetShowRows(), 1);
- }
-
- {
- SMDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_MND_BNODE_NOT_EXIST);
- }
-}
-
-TEST_F(MndTestBnode, 03_Create_Bnode_Rollback) {
- {
- // send message first, then dnode2 crash, result is returned, and rollback is started
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- server2.Stop();
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_RPC_NETWORK_UNAVAIL);
- }
-
- {
- // continue send message, bnode is creating
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_SDB_OBJ_CREATING);
- }
-
- {
- // continue send message, bnode is creating
- SMDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_SDB_OBJ_CREATING);
- }
-
- {
- // server start, wait until the rollback finished
- server2.DoStart();
- taosMsleep(1000);
-
- int32_t retry = 0;
- int32_t retryMax = 20;
-
- for (retry = 0; retry < retryMax; retry++) {
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- if (pRsp->code == 0) break;
- taosMsleep(1000);
- }
-
- ASSERT_NE(retry, retryMax);
- }
-}
-
-TEST_F(MndTestBnode, 04_Drop_Bnode_Rollback) {
- {
- // send message first, then dnode2 crash, result is returned, and rollback is started
- SMDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- server2.Stop();
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_RPC_NETWORK_UNAVAIL);
- }
-
- {
- // continue send message, bnode is dropping
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_SDB_OBJ_DROPPING);
- }
-
- {
- // continue send message, bnode is dropping
- SMDropBnodeReq dropReq = {0};
- dropReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- ASSERT_EQ(pRsp->code, TSDB_CODE_SDB_OBJ_DROPPING);
- }
-
- {
- // server start, wait until the rollback finished
- server2.DoStart();
- taosMsleep(1000);
-
- int32_t retry = 0;
- int32_t retryMax = 20;
-
- for (retry = 0; retry < retryMax; retry++) {
- SMCreateBnodeReq createReq = {0};
- createReq.dnodeId = 2;
-
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
- void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
-
- SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_BNODE, pReq, contLen);
- ASSERT_NE(pRsp, nullptr);
- if (pRsp->code == 0) break;
- taosMsleep(1000);
- }
-
- ASSERT_NE(retry, retryMax);
- }
-}
diff --git a/source/dnode/mnode/impl/test/mnode/mnode.cpp b/source/dnode/mnode/impl/test/mnode/mnode.cpp
index 1ed613c723ca504777929b8a6715e9d3b7594e06..1f6dbd6dca8aff65190a483b56ab5405a1e3a9b0 100644
--- a/source/dnode/mnode/impl/test/mnode/mnode.cpp
+++ b/source/dnode/mnode/impl/test/mnode/mnode.cpp
@@ -48,9 +48,9 @@ TEST_F(MndTestMnode, 02_Create_Mnode_Invalid_Id) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -63,9 +63,9 @@ TEST_F(MndTestMnode, 03_Create_Mnode_Invalid_Id) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -98,9 +98,9 @@ TEST_F(MndTestMnode, 04_Create_Mnode) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -115,9 +115,9 @@ TEST_F(MndTestMnode, 04_Create_Mnode) {
SMDropMnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -132,9 +132,9 @@ TEST_F(MndTestMnode, 04_Create_Mnode) {
SMDropMnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -148,9 +148,9 @@ TEST_F(MndTestMnode, 03_Create_Mnode_Rollback) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
server2.Stop();
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
@@ -163,9 +163,9 @@ TEST_F(MndTestMnode, 03_Create_Mnode_Rollback) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -177,9 +177,9 @@ TEST_F(MndTestMnode, 03_Create_Mnode_Rollback) {
SMDropMnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -198,9 +198,9 @@ TEST_F(MndTestMnode, 03_Create_Mnode_Rollback) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -218,9 +218,9 @@ TEST_F(MndTestMnode, 04_Drop_Mnode_Rollback) {
SMDropMnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
server2.Stop();
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_MNODE, pReq, contLen);
@@ -233,9 +233,9 @@ TEST_F(MndTestMnode, 04_Drop_Mnode_Rollback) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -247,9 +247,9 @@ TEST_F(MndTestMnode, 04_Drop_Mnode_Rollback) {
SMDropMnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -268,9 +268,9 @@ TEST_F(MndTestMnode, 04_Drop_Mnode_Rollback) {
SMCreateMnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_MNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
diff --git a/source/dnode/mnode/impl/test/qnode/qnode.cpp b/source/dnode/mnode/impl/test/qnode/qnode.cpp
index 57b38e55c1d392bda809b094b0f1bf918aae8888..a3bcb7654ea234aa8231da4a355053a0d03846aa 100644
--- a/source/dnode/mnode/impl/test/qnode/qnode.cpp
+++ b/source/dnode/mnode/impl/test/qnode/qnode.cpp
@@ -48,9 +48,9 @@ TEST_F(MndTestQnode, 02_Create_Qnode) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -61,9 +61,9 @@ TEST_F(MndTestQnode, 02_Create_Qnode) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -77,9 +77,9 @@ TEST_F(MndTestQnode, 02_Create_Qnode) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -110,9 +110,9 @@ TEST_F(MndTestQnode, 03_Drop_Qnode) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -126,9 +126,9 @@ TEST_F(MndTestQnode, 03_Drop_Qnode) {
SMDropQnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -142,9 +142,9 @@ TEST_F(MndTestQnode, 03_Drop_Qnode) {
SMDropQnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -158,9 +158,9 @@ TEST_F(MndTestQnode, 03_Create_Qnode_Rollback) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
server2.Stop();
taosMsleep(1000);
@@ -176,9 +176,9 @@ TEST_F(MndTestQnode, 03_Create_Qnode_Rollback) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -190,9 +190,9 @@ TEST_F(MndTestQnode, 03_Create_Qnode_Rollback) {
SMDropQnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -212,9 +212,9 @@ TEST_F(MndTestQnode, 03_Create_Qnode_Rollback) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -231,9 +231,9 @@ TEST_F(MndTestQnode, 04_Drop_Qnode_Rollback) {
SMDropQnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
server2.Stop();
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_QNODE, pReq, contLen);
@@ -246,9 +246,9 @@ TEST_F(MndTestQnode, 04_Drop_Qnode_Rollback) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
ASSERT_EQ(pRsp->code, TSDB_CODE_SDB_OBJ_DROPPING);
@@ -259,9 +259,9 @@ TEST_F(MndTestQnode, 04_Drop_Qnode_Rollback) {
SMDropQnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -280,9 +280,9 @@ TEST_F(MndTestQnode, 04_Drop_Qnode_Rollback) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
if (pRsp->code == 0) break;
diff --git a/source/dnode/mnode/impl/test/snode/snode.cpp b/source/dnode/mnode/impl/test/snode/snode.cpp
index 1828fbd570499107e3e3131631c35602bead983f..ac48eee4d06774a2ba3b1077ff68a769a4d65cda 100644
--- a/source/dnode/mnode/impl/test/snode/snode.cpp
+++ b/source/dnode/mnode/impl/test/snode/snode.cpp
@@ -48,9 +48,9 @@ TEST_F(MndTestSnode, 02_Create_Snode) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -61,9 +61,9 @@ TEST_F(MndTestSnode, 02_Create_Snode) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -77,9 +77,9 @@ TEST_F(MndTestSnode, 02_Create_Snode) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -110,9 +110,9 @@ TEST_F(MndTestSnode, 03_Drop_Snode) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -126,9 +126,9 @@ TEST_F(MndTestSnode, 03_Drop_Snode) {
SMDropSnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -142,9 +142,9 @@ TEST_F(MndTestSnode, 03_Drop_Snode) {
SMDropSnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -158,9 +158,9 @@ TEST_F(MndTestSnode, 03_Create_Snode_Rollback) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
server2.Stop();
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
@@ -173,9 +173,9 @@ TEST_F(MndTestSnode, 03_Create_Snode_Rollback) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -187,9 +187,9 @@ TEST_F(MndTestSnode, 03_Create_Snode_Rollback) {
SMDropSnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -208,9 +208,9 @@ TEST_F(MndTestSnode, 03_Create_Snode_Rollback) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -228,9 +228,9 @@ TEST_F(MndTestSnode, 04_Drop_Snode_Rollback) {
SMDropSnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
server2.Stop();
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_SNODE, pReq, contLen);
@@ -243,9 +243,9 @@ TEST_F(MndTestSnode, 04_Drop_Snode_Rollback) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -257,9 +257,9 @@ TEST_F(MndTestSnode, 04_Drop_Snode_Rollback) {
SMDropSnodeReq dropReq = {0};
dropReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &dropReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &dropReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_DROP_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -278,9 +278,9 @@ TEST_F(MndTestSnode, 04_Drop_Snode_Rollback) {
SMCreateSnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_SNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
diff --git a/source/dnode/mnode/impl/test/trans/trans1.cpp b/source/dnode/mnode/impl/test/trans/trans1.cpp
index 5a470fc900f418c429befe12d6cfae643522a2e3..92a442aa5ee37c87a1d1d100a9ed7032f7f5b45c 100644
--- a/source/dnode/mnode/impl/test/trans/trans1.cpp
+++ b/source/dnode/mnode/impl/test/trans/trans1.cpp
@@ -112,9 +112,9 @@ TEST_F(MndTestTrans1, 02_Create_Qnode1_Crash) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -129,9 +129,9 @@ TEST_F(MndTestTrans1, 02_Create_Qnode1_Crash) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 1;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -165,9 +165,9 @@ TEST_F(MndTestTrans1, 03_Create_Qnode2_Crash) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
server2.Stop();
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
@@ -209,9 +209,9 @@ TEST_F(MndTestTrans1, 03_Create_Qnode2_Crash) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
@@ -232,9 +232,9 @@ TEST_F(MndTestTrans1, 03_Create_Qnode2_Crash) {
SMCreateQnodeReq createReq = {0};
createReq.dnodeId = 2;
- int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &createReq);
+ int32_t contLen = tSerializeSCreateDropMQSNodeReq(NULL, 0, &createReq);
void* pReq = rpcMallocCont(contLen);
- tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &createReq);
+ tSerializeSCreateDropMQSNodeReq(pReq, contLen, &createReq);
SRpcMsg* pRsp = test.SendReq(TDMT_MND_CREATE_QNODE, pReq, contLen);
ASSERT_NE(pRsp, nullptr);
diff --git a/source/dnode/mnode/sdb/inc/sdb.h b/source/dnode/mnode/sdb/inc/sdb.h
index be93bd2f59da8c54c467ae90eadf6df593a087d4..d4db4709caa2f7a7a3d7c31e1aaf475acc067897 100644
--- a/source/dnode/mnode/sdb/inc/sdb.h
+++ b/source/dnode/mnode/sdb/inc/sdb.h
@@ -132,7 +132,6 @@ typedef enum {
SDB_MNODE = 2,
SDB_QNODE = 3,
SDB_SNODE = 4,
- SDB_BNODE = 5,
SDB_DNODE = 6,
SDB_USER = 7,
SDB_AUTH = 8,
@@ -403,6 +402,10 @@ const char *sdbStatusName(ESdbStatus status);
void sdbPrintOper(SSdb *pSdb, SSdbRow *pRow, const char *oper);
int32_t sdbGetIdFromRaw(SSdb *pSdb, SSdbRaw *pRaw);
+void sdbWriteLock(SSdb *pSdb, int32_t type);
+void sdbReadLock(SSdb *pSdb, int32_t type);
+void sdbUnLock(SSdb *pSdb, int32_t type);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/dnode/mnode/sdb/src/sdb.c b/source/dnode/mnode/sdb/src/sdb.c
index 5393c42da33a45629d15f02df803135e853185d7..e73fd28e71258adc85c9a2822b8a6b810bafbcdc 100644
--- a/source/dnode/mnode/sdb/src/sdb.c
+++ b/source/dnode/mnode/sdb/src/sdb.c
@@ -181,3 +181,23 @@ void sdbGetCommitInfo(SSdb *pSdb, int64_t *index, int64_t *term, int64_t *config
pSdb->applyIndex, pSdb->applyTerm, pSdb->applyConfig, *index, *term, *config);
#endif
}
+
+void sdbWriteLock(SSdb *pSdb, int32_t type) {
+ TdThreadRwlock *pLock = &pSdb->locks[type];
+ // mTrace("sdb table:%d start write lock:%p", type, pLock);
+ taosThreadRwlockWrlock(pLock);
+ // mTrace("sdb table:%d stop write lock:%p", type, pLock);
+}
+
+void sdbReadLock(SSdb *pSdb, int32_t type) {
+ TdThreadRwlock *pLock = &pSdb->locks[type];
+ // mTrace("sdb table:%d start read lock:%p", type, pLock);
+ taosThreadRwlockRdlock(pLock);
+ // mTrace("sdb table:%d stop read lock:%p", type, pLock);
+}
+
+void sdbUnLock(SSdb *pSdb, int32_t type) {
+ TdThreadRwlock *pLock = &pSdb->locks[type];
+ // mTrace("sdb table:%d unlock:%p", type, pLock);
+ taosThreadRwlockUnlock(pLock);
+}
diff --git a/source/dnode/mnode/sdb/src/sdbFile.c b/source/dnode/mnode/sdb/src/sdbFile.c
index 18dbea150b2fd38ef84d067cb73546baa95438cc..5eedcc545a526dc1bb657f0173c54a1f03440de2 100644
--- a/source/dnode/mnode/sdb/src/sdbFile.c
+++ b/source/dnode/mnode/sdb/src/sdbFile.c
@@ -363,9 +363,8 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
mInfo("write %s to sdb file, total %d rows", sdbTableName(i), sdbGetSize(pSdb, i));
- SHashObj *hash = pSdb->hashObjs[i];
- TdThreadRwlock *pLock = &pSdb->locks[i];
- taosThreadRwlockWrlock(pLock);
+ SHashObj *hash = pSdb->hashObjs[i];
+ sdbWriteLock(pSdb, i);
SSdbRow **ppRow = taosHashIterate(hash, NULL);
while (ppRow != NULL) {
@@ -410,7 +409,7 @@ static int32_t sdbWriteFileImp(SSdb *pSdb) {
sdbFreeRaw(pRaw);
ppRow = taosHashIterate(hash, ppRow);
}
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, i);
}
if (code == 0) {
diff --git a/source/dnode/mnode/sdb/src/sdbHash.c b/source/dnode/mnode/sdb/src/sdbHash.c
index 0fee0fbca17685e6ee7b2a106accf87ba0d2b056..6c00a654e92e245ca0e477f9b25de60007c4a34d 100644
--- a/source/dnode/mnode/sdb/src/sdbHash.c
+++ b/source/dnode/mnode/sdb/src/sdbHash.c
@@ -30,8 +30,6 @@ const char *sdbTableName(ESdbType type) {
return "qnode";
case SDB_SNODE:
return "snode";
- case SDB_BNODE:
- return "bnode";
case SDB_DNODE:
return "dnode";
case SDB_USER:
@@ -133,12 +131,12 @@ static int32_t sdbGetkeySize(SSdb *pSdb, ESdbType type, const void *pKey) {
}
static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pRow, int32_t keySize) {
- TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
- taosThreadRwlockWrlock(pLock);
+ int32_t type = pRow->type;
+ sdbWriteLock(pSdb, type);
SSdbRow *pOldRow = taosHashGet(hash, pRow->pObj, keySize);
if (pOldRow != NULL) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
sdbFreeRow(pSdb, pRow, false);
terrno = TSDB_CODE_SDB_OBJ_ALREADY_THERE;
return terrno;
@@ -149,7 +147,7 @@ static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *
sdbPrintOper(pSdb, pRow, "insert");
if (taosHashPut(hash, pRow->pObj, keySize, &pRow, sizeof(void *)) != 0) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
sdbFreeRow(pSdb, pRow, false);
terrno = TSDB_CODE_OUT_OF_MEMORY;
return terrno;
@@ -164,12 +162,12 @@ static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *
taosHashRemove(hash, pRow->pObj, keySize);
sdbFreeRow(pSdb, pRow, false);
terrno = code;
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
return terrno;
}
}
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
if (pSdb->keyTypes[pRow->type] == SDB_KEY_INT32) {
pSdb->maxId[pRow->type] = TMAX(pSdb->maxId[pRow->type], *((int32_t *)pRow->pObj));
@@ -183,26 +181,27 @@ static int32_t sdbInsertRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *
}
static int32_t sdbUpdateRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pNewRow, int32_t keySize) {
- TdThreadRwlock *pLock = &pSdb->locks[pNewRow->type];
- taosThreadRwlockWrlock(pLock);
+ int32_t type = pNewRow->type;
+ sdbWriteLock(pSdb, type);
SSdbRow **ppOldRow = taosHashGet(hash, pNewRow->pObj, keySize);
if (ppOldRow == NULL || *ppOldRow == NULL) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
return sdbInsertRow(pSdb, hash, pRaw, pNewRow, keySize);
}
SSdbRow *pOldRow = *ppOldRow;
pOldRow->status = pRaw->status;
sdbPrintOper(pSdb, pOldRow, "update");
+ sdbUnLock(pSdb, type);
int32_t code = 0;
- SdbUpdateFp updateFp = pSdb->updateFps[pNewRow->type];
+ SdbUpdateFp updateFp = pSdb->updateFps[type];
if (updateFp != NULL) {
code = (*updateFp)(pSdb, pOldRow->pObj, pNewRow->pObj);
}
- taosThreadRwlockUnlock(pLock);
+ // sdbUnLock(pSdb, type);
sdbFreeRow(pSdb, pNewRow, false);
pSdb->tableVer[pOldRow->type]++;
@@ -210,12 +209,12 @@ static int32_t sdbUpdateRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *
}
static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *pRow, int32_t keySize) {
- TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
- taosThreadRwlockWrlock(pLock);
+ int32_t type = pRow->type;
+ sdbWriteLock(pSdb, type);
SSdbRow **ppOldRow = taosHashGet(hash, pRow->pObj, keySize);
if (ppOldRow == NULL || *ppOldRow == NULL) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
sdbFreeRow(pSdb, pRow, false);
terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
return terrno;
@@ -228,7 +227,7 @@ static int32_t sdbDeleteRow(SSdb *pSdb, SHashObj *hash, SSdbRaw *pRaw, SSdbRow *
taosHashRemove(hash, pOldRow->pObj, keySize);
pSdb->tableVer[pOldRow->type]++;
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
sdbFreeRow(pSdb, pRow, false);
@@ -282,12 +281,11 @@ void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) {
void *pRet = NULL;
int32_t keySize = sdbGetkeySize(pSdb, type, pKey);
- TdThreadRwlock *pLock = &pSdb->locks[type];
- taosThreadRwlockRdlock(pLock);
+ sdbReadLock(pSdb, type);
SSdbRow **ppRow = taosHashGet(hash, pKey, keySize);
if (ppRow == NULL || *ppRow == NULL) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
terrno = TSDB_CODE_SDB_OBJ_NOT_THERE;
return NULL;
}
@@ -310,13 +308,13 @@ void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey) {
break;
}
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
return pRet;
}
static void sdbCheckRow(SSdb *pSdb, SSdbRow *pRow) {
- TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
- taosThreadRwlockWrlock(pLock);
+ int32_t type = pRow->type;
+ sdbWriteLock(pSdb, type);
int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
sdbPrintOper(pSdb, pRow, "check");
@@ -324,7 +322,7 @@ static void sdbCheckRow(SSdb *pSdb, SSdbRow *pRow) {
sdbFreeRow(pSdb, pRow, true);
}
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
}
void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
@@ -333,9 +331,9 @@ void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
SSdbRow *pRow = (SSdbRow *)((char *)pObj - sizeof(SSdbRow));
if (pRow->type >= SDB_MAX) return;
- TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
+ int32_t type = pRow->type;
if (lock) {
- taosThreadRwlockWrlock(pLock);
+ sdbWriteLock(pSdb, type);
}
int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
@@ -345,7 +343,7 @@ void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
}
if (lock) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
}
}
@@ -357,8 +355,7 @@ void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
SHashObj *hash = sdbGetHash(pSdb, type);
if (hash == NULL) return NULL;
- TdThreadRwlock *pLock = &pSdb->locks[type];
- taosThreadRwlockRdlock(pLock);
+ sdbReadLock(pSdb, type);
SSdbRow **ppRow = taosHashIterate(hash, pIter);
while (ppRow != NULL) {
@@ -373,7 +370,7 @@ void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
*ppObj = pRow->pObj;
break;
}
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
return ppRow;
}
@@ -384,9 +381,8 @@ void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStat
SHashObj *hash = sdbGetHash(pSdb, type);
if (hash == NULL) return NULL;
- TdThreadRwlock *pLock = &pSdb->locks[type];
if (lock) {
- taosThreadRwlockRdlock(pLock);
+ sdbReadLock(pSdb, type);
}
SSdbRow **ppRow = taosHashIterate(hash, pIter);
@@ -404,7 +400,7 @@ void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStat
break;
}
if (lock) {
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
}
return ppRow;
@@ -416,18 +412,17 @@ void sdbCancelFetch(SSdb *pSdb, void *pIter) {
SHashObj *hash = sdbGetHash(pSdb, pRow->type);
if (hash == NULL) return;
- TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
- taosThreadRwlockRdlock(pLock);
+ int32_t type = pRow->type;
+ sdbReadLock(pSdb, type);
taosHashCancelIterate(hash, pIter);
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
}
void sdbTraverse(SSdb *pSdb, ESdbType type, sdbTraverseFp fp, void *p1, void *p2, void *p3) {
SHashObj *hash = sdbGetHash(pSdb, type);
if (hash == NULL) return;
- TdThreadRwlock *pLock = &pSdb->locks[type];
- taosThreadRwlockRdlock(pLock);
+ sdbReadLock(pSdb, type);
SSdbRow **ppRow = taosHashIterate(hash, NULL);
while (ppRow != NULL) {
@@ -443,17 +438,16 @@ void sdbTraverse(SSdb *pSdb, ESdbType type, sdbTraverseFp fp, void *p1, void *p2
ppRow = taosHashIterate(hash, ppRow);
}
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
}
int32_t sdbGetSize(SSdb *pSdb, ESdbType type) {
SHashObj *hash = sdbGetHash(pSdb, type);
if (hash == NULL) return 0;
- TdThreadRwlock *pLock = &pSdb->locks[type];
- taosThreadRwlockRdlock(pLock);
+ sdbReadLock(pSdb, type);
int32_t size = taosHashGetSize(hash);
- taosThreadRwlockUnlock(pLock);
+ sdbUnLock(pSdb, type);
return size;
}
@@ -465,9 +459,7 @@ int32_t sdbGetMaxId(SSdb *pSdb, ESdbType type) {
if (pSdb->keyTypes[type] != SDB_KEY_INT32) return -1;
int32_t maxId = 0;
-
- TdThreadRwlock *pLock = &pSdb->locks[type];
- taosThreadRwlockRdlock(pLock);
+ sdbReadLock(pSdb, type);
SSdbRow **ppRow = taosHashIterate(hash, NULL);
while (ppRow != NULL) {
@@ -477,8 +469,7 @@ int32_t sdbGetMaxId(SSdb *pSdb, ESdbType type) {
ppRow = taosHashIterate(hash, ppRow);
}
- taosThreadRwlockUnlock(pLock);
-
+ sdbUnLock(pSdb, type);
maxId = TMAX(maxId, pSdb->maxId[type]);
return maxId + 1;
}
diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h
index 54d5d9eec25e0a6fa8c6a80961c9a1ea6b5ee4e1..96ba9a06028b12c26df751a7ae1dc246148fe2e7 100644
--- a/source/dnode/vnode/inc/vnode.h
+++ b/source/dnode/vnode/inc/vnode.h
@@ -82,6 +82,7 @@ int32_t vnodePreprocessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg);
int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t version, SRpcMsg *pRsp);
int32_t vnodeProcessSyncMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp);
+int32_t vnodeProcessSyncCtrlMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp);
int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg);
int32_t vnodeProcessFetchMsg(SVnode *pVnode, SRpcMsg *pMsg, SQueueInfo *pInfo);
void vnodeProposeWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs);
diff --git a/source/dnode/vnode/src/inc/sma.h b/source/dnode/vnode/src/inc/sma.h
index dade85b12d2903cbc8e3e089ab5701e1e07a4369..50e3c3a9c16e54a70d2b4f07a4640d87013a7776 100644
--- a/source/dnode/vnode/src/inc/sma.h
+++ b/source/dnode/vnode/src/inc/sma.h
@@ -258,6 +258,7 @@ enum {
TD_FTYPE_RSMA_QTASKINFO = 0,
};
+#if 0
struct STFile {
uint8_t state;
STFInfo info;
@@ -287,6 +288,7 @@ int32_t tdUpdateTFileHeader(STFile *pTFile);
void tdUpdateTFileMagic(STFile *pTFile, void *pCksm);
void tdCloseTFile(STFile *pTFile);
void tdDestroyTFile(STFile *pTFile);
+#endif
void tdGetVndFileName(int32_t vgId, const char *pdname, const char *dname, const char *fname, int64_t version,
char *outputName);
diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h
index 69e6cdce9f25159247ffc4b331d7a7ef701e58fa..7f418439a89f8a638a3dc3a86213518fdf0b297a 100644
--- a/source/dnode/vnode/src/inc/tq.h
+++ b/source/dnode/vnode/src/inc/tq.h
@@ -149,7 +149,7 @@ int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle);
int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle);
// tqRead
-int32_t tqScan(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* offset);
+int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* offset);
int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffsetVal* pOffset);
int64_t tqFetchLog(STQ* pTq, STqHandle* pHandle, int64_t* fetchOffset, SWalCkHead** pHeadWithCkSum);
@@ -181,8 +181,8 @@ int32_t tqOffsetDelete(STqOffsetStore* pStore, const char* subscribeKey)
int32_t tqOffsetCommitFile(STqOffsetStore* pStore);
// tqSink
-void tqTableSink(SStreamTask* pTask, void* vnode, int64_t ver, void* data);
-void tqTableSink1(SStreamTask* pTask, void* vnode, int64_t ver, void* data);
+void tqSinkToTableMerge(SStreamTask* pTask, void* vnode, int64_t ver, void* data);
+void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* data);
// tqOffset
char* tqOffsetBuildFName(const char* path, int32_t ver);
diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h
index bf110f1ae33eafeadc343fecb2a50cd073ed1b49..cb877e3b2db5ad5d4eba5681fbf8a64189b2904f 100644
--- a/source/dnode/vnode/src/inc/tsdb.h
+++ b/source/dnode/vnode/src/inc/tsdb.h
@@ -32,12 +32,6 @@ extern "C" {
#define tsdbTrace(...) do { if (tsdbDebugFlag & DEBUG_TRACE) { taosPrintLog("TSD ", DEBUG_TRACE, tsdbDebugFlag, __VA_ARGS__); }} while(0)
// clang-format on
-#define TSDB_CHECK_CODE(CODE, LINO, LABEL) \
- if (CODE) { \
- LINO = __LINE__; \
- goto LABEL; \
- }
-
typedef struct TSDBROW TSDBROW;
typedef struct TABLEID TABLEID;
typedef struct TSDBKEY TSDBKEY;
@@ -247,18 +241,17 @@ void tsdbSmaFileName(STsdb *pTsdb, SDiskID did, int32_t fid, SSmaFile *pSmaF, ch
// SDelFile
void tsdbDelFileName(STsdb *pTsdb, SDelFile *pFile, char fname[]);
// tsdbFS.c ==============================================================================================
-int32_t tsdbFSOpen(STsdb *pTsdb);
+int32_t tsdbFSOpen(STsdb *pTsdb, int8_t rollback);
int32_t tsdbFSClose(STsdb *pTsdb);
int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS);
void tsdbFSDestroy(STsdbFS *pFS);
int32_t tDFileSetCmprFn(const void *p1, const void *p2);
-int32_t tsdbFSCommit1(STsdb *pTsdb, STsdbFS *pFS);
-int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFS);
+int32_t tsdbFSCommit(STsdb *pTsdb);
+int32_t tsdbFSRollback(STsdb *pTsdb);
+int32_t tsdbFSPrepareCommit(STsdb *pTsdb, STsdbFS *pFS);
int32_t tsdbFSRef(STsdb *pTsdb, STsdbFS *pFS);
void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS);
-int32_t tsdbFSRollback(STsdbFS *pFS);
-
int32_t tsdbFSUpsertFSet(STsdbFS *pFS, SDFileSet *pSet);
int32_t tsdbFSUpsertDelFile(STsdbFS *pFS, SDelFile *pDelFile);
// tsdbReaderWriter.c ==============================================================================================
diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h
index aca99ecd2f31d43b98ed38ddfc2940e3079225ba..988ecc5dd3c0046c142ffde9a3d902f2b9904cd3 100644
--- a/source/dnode/vnode/src/inc/vnd.h
+++ b/source/dnode/vnode/src/inc/vnd.h
@@ -87,11 +87,13 @@ int32_t vnodeGetBatchMeta(SVnode* pVnode, SRpcMsg* pMsg);
int32_t vnodeBegin(SVnode* pVnode);
int32_t vnodeShouldCommit(SVnode* pVnode);
int32_t vnodeCommit(SVnode* pVnode);
+void vnodeRollback(SVnode* pVnode);
int32_t vnodeSaveInfo(const char* dir, const SVnodeInfo* pCfg);
int32_t vnodeCommitInfo(const char* dir, const SVnodeInfo* pInfo);
int32_t vnodeLoadInfo(const char* dir, SVnodeInfo* pInfo);
int32_t vnodeSyncCommit(SVnode* pVnode);
int32_t vnodeAsyncCommit(SVnode* pVnode);
+bool vnodeShouldRollback(SVnode* pVnode);
// vnodeSync.c
int32_t vnodeSyncOpen(SVnode* pVnode, char* path);
diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h
index 712f8bd15b9b3e189ba7649a486743d284c9fd15..42ab0c2a378a4e03b67c1e17aa9eee60cbc4be2d 100644
--- a/source/dnode/vnode/src/inc/vnodeInt.h
+++ b/source/dnode/vnode/src/inc/vnodeInt.h
@@ -97,10 +97,11 @@ typedef struct SMCtbCursor SMCtbCursor;
typedef struct SMStbCursor SMStbCursor;
typedef struct STbUidStore STbUidStore;
-int metaOpen(SVnode* pVnode, SMeta** ppMeta);
+int metaOpen(SVnode* pVnode, SMeta** ppMeta, int8_t rollback);
int metaClose(SMeta* pMeta);
int metaBegin(SMeta* pMeta, int8_t fromSys);
int metaCommit(SMeta* pMeta);
+int metaFinishCommit(SMeta* pMeta);
int metaCreateSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
@@ -149,10 +150,12 @@ typedef struct {
int32_t metaGetStbStats(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo);
// tsdb
-int tsdbOpen(SVnode* pVnode, STsdb** ppTsdb, const char* dir, STsdbKeepCfg* pKeepCfg);
+int tsdbOpen(SVnode* pVnode, STsdb** ppTsdb, const char* dir, STsdbKeepCfg* pKeepCfg, int8_t rollback);
int tsdbClose(STsdb** pTsdb);
int32_t tsdbBegin(STsdb* pTsdb);
int32_t tsdbCommit(STsdb* pTsdb);
+int32_t tsdbFinishCommit(STsdb* pTsdb);
+int32_t tsdbRollbackCommit(STsdb* pTsdb);
int32_t tsdbDoRetention(STsdb* pTsdb, int64_t now);
int tsdbScanAndConvertSubmitMsg(STsdb* pTsdb, SSubmitReq* pMsg);
int tsdbInsertData(STsdb* pTsdb, int64_t version, SSubmitReq* pMsg, SSubmitRsp* pRsp);
@@ -200,15 +203,15 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
// sma
int32_t smaInit();
void smaCleanUp();
-int32_t smaOpen(SVnode* pVnode);
+int32_t smaOpen(SVnode* pVnode, int8_t rollback);
int32_t smaClose(SSma* pSma);
int32_t smaBegin(SSma* pSma);
int32_t smaSyncPreCommit(SSma* pSma);
int32_t smaSyncCommit(SSma* pSma);
int32_t smaSyncPostCommit(SSma* pSma);
-int32_t smaAsyncPreCommit(SSma* pSma);
-int32_t smaAsyncCommit(SSma* pSma);
-int32_t smaAsyncPostCommit(SSma* pSma);
+int32_t smaPreCommit(SSma* pSma);
+int32_t smaCommit(SSma* pSma);
+int32_t smaPostCommit(SSma* pSma);
int32_t smaDoRetention(SSma* pSma, int64_t now);
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
diff --git a/source/dnode/vnode/src/meta/metaCommit.c b/source/dnode/vnode/src/meta/metaCommit.c
index 85ed40970c796ddeaa5332f95f691e4892c6f14b..01ad833d203023b59f69e2f985d964d21a213972 100644
--- a/source/dnode/vnode/src/meta/metaCommit.c
+++ b/source/dnode/vnode/src/meta/metaCommit.c
@@ -34,6 +34,7 @@ int metaBegin(SMeta *pMeta, int8_t fromSys) {
// commit the meta txn
int metaCommit(SMeta *pMeta) { return tdbCommit(pMeta->pEnv, &pMeta->txn); }
+int metaFinishCommit(SMeta *pMeta) { return tdbPostCommit(pMeta->pEnv, &pMeta->txn); }
// abort the meta txn
int metaAbort(SMeta *pMeta) { return tdbAbort(pMeta->pEnv, &pMeta->txn); }
diff --git a/source/dnode/vnode/src/meta/metaEntry.c b/source/dnode/vnode/src/meta/metaEntry.c
index b7bdadec03a184a8debc7c2f9a0366fa1ec80734..72f7365a1e3304c8fa5c387eea24a968ebb87c14 100644
--- a/source/dnode/vnode/src/meta/metaEntry.c
+++ b/source/dnode/vnode/src/meta/metaEntry.c
@@ -21,7 +21,7 @@ int metaEncodeEntry(SEncoder *pCoder, const SMetaEntry *pME) {
if (tEncodeI64(pCoder, pME->version) < 0) return -1;
if (tEncodeI8(pCoder, pME->type) < 0) return -1;
if (tEncodeI64(pCoder, pME->uid) < 0) return -1;
- if (tEncodeCStr(pCoder, pME->name) < 0) return -1;
+ if (pME->name == NULL || tEncodeCStr(pCoder, pME->name) < 0) return -1;
if (pME->type == TSDB_SUPER_TABLE) {
if (tEncodeI8(pCoder, pME->flags) < 0) return -1; // TODO: need refactor?
diff --git a/source/dnode/vnode/src/meta/metaOpen.c b/source/dnode/vnode/src/meta/metaOpen.c
index 515fd31e9d0930296c04a29f2945d7923ea542e2..2198033db9556c6ebae239040a52d1e2a95c0335 100644
--- a/source/dnode/vnode/src/meta/metaOpen.c
+++ b/source/dnode/vnode/src/meta/metaOpen.c
@@ -27,7 +27,7 @@ static int taskIdxKeyCmpr(const void *pKey1, int kLen1, const void *pKey2, int k
static int32_t metaInitLock(SMeta *pMeta) { return taosThreadRwlockInit(&pMeta->lock, NULL); }
static int32_t metaDestroyLock(SMeta *pMeta) { return taosThreadRwlockDestroy(&pMeta->lock); }
-int metaOpen(SVnode *pVnode, SMeta **ppMeta) {
+int metaOpen(SVnode *pVnode, SMeta **ppMeta, int8_t rollback) {
SMeta *pMeta = NULL;
int ret;
int slen;
@@ -60,49 +60,49 @@ int metaOpen(SVnode *pVnode, SMeta **ppMeta) {
taosMkDir(pMeta->path);
// open env
- ret = tdbOpen(pMeta->path, pVnode->config.szPage, pVnode->config.szCache, &pMeta->pEnv);
+ ret = tdbOpen(pMeta->path, pVnode->config.szPage, pVnode->config.szCache, &pMeta->pEnv, rollback);
if (ret < 0) {
metaError("vgId:%d, failed to open meta env since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pTbDb
- ret = tdbTbOpen("table.db", sizeof(STbDbKey), -1, tbDbKeyCmpr, pMeta->pEnv, &pMeta->pTbDb);
+ ret = tdbTbOpen("table.db", sizeof(STbDbKey), -1, tbDbKeyCmpr, pMeta->pEnv, &pMeta->pTbDb, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta table db since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pSkmDb
- ret = tdbTbOpen("schema.db", sizeof(SSkmDbKey), -1, skmDbKeyCmpr, pMeta->pEnv, &pMeta->pSkmDb);
+ ret = tdbTbOpen("schema.db", sizeof(SSkmDbKey), -1, skmDbKeyCmpr, pMeta->pEnv, &pMeta->pSkmDb, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta schema db since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pUidIdx
- ret = tdbTbOpen("uid.idx", sizeof(tb_uid_t), sizeof(SUidIdxVal), uidIdxKeyCmpr, pMeta->pEnv, &pMeta->pUidIdx);
+ ret = tdbTbOpen("uid.idx", sizeof(tb_uid_t), sizeof(SUidIdxVal), uidIdxKeyCmpr, pMeta->pEnv, &pMeta->pUidIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta uid idx since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pNameIdx
- ret = tdbTbOpen("name.idx", -1, sizeof(tb_uid_t), NULL, pMeta->pEnv, &pMeta->pNameIdx);
+ ret = tdbTbOpen("name.idx", -1, sizeof(tb_uid_t), NULL, pMeta->pEnv, &pMeta->pNameIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta name index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pCtbIdx
- ret = tdbTbOpen("ctb.idx", sizeof(SCtbIdxKey), -1, ctbIdxKeyCmpr, pMeta->pEnv, &pMeta->pCtbIdx);
+ ret = tdbTbOpen("ctb.idx", sizeof(SCtbIdxKey), -1, ctbIdxKeyCmpr, pMeta->pEnv, &pMeta->pCtbIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta child table index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pSuidIdx
- ret = tdbTbOpen("suid.idx", sizeof(tb_uid_t), 0, uidIdxKeyCmpr, pMeta->pEnv, &pMeta->pSuidIdx);
+ ret = tdbTbOpen("suid.idx", sizeof(tb_uid_t), 0, uidIdxKeyCmpr, pMeta->pEnv, &pMeta->pSuidIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta super table index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
@@ -119,27 +119,27 @@ int metaOpen(SVnode *pVnode, SMeta **ppMeta) {
goto _err;
}
- ret = tdbTbOpen("tag.idx", -1, 0, tagIdxKeyCmpr, pMeta->pEnv, &pMeta->pTagIdx);
+ ret = tdbTbOpen("tag.idx", -1, 0, tagIdxKeyCmpr, pMeta->pEnv, &pMeta->pTagIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta tag index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pTtlIdx
- ret = tdbTbOpen("ttl.idx", sizeof(STtlIdxKey), 0, ttlIdxKeyCmpr, pMeta->pEnv, &pMeta->pTtlIdx);
+ ret = tdbTbOpen("ttl.idx", sizeof(STtlIdxKey), 0, ttlIdxKeyCmpr, pMeta->pEnv, &pMeta->pTtlIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta ttl index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open pSmaIdx
- ret = tdbTbOpen("sma.idx", sizeof(SSmaIdxKey), 0, smaIdxKeyCmpr, pMeta->pEnv, &pMeta->pSmaIdx);
+ ret = tdbTbOpen("sma.idx", sizeof(SSmaIdxKey), 0, smaIdxKeyCmpr, pMeta->pEnv, &pMeta->pSmaIdx, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta sma index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
- ret = tdbTbOpen("stream.task.db", sizeof(int64_t), -1, taskIdxKeyCmpr, pMeta->pEnv, &pMeta->pStreamDb);
+ ret = tdbTbOpen("stream.task.db", sizeof(int64_t), -1, taskIdxKeyCmpr, pMeta->pEnv, &pMeta->pStreamDb, 0);
if (ret < 0) {
metaError("vgId:%d, failed to open meta stream task index since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
diff --git a/source/dnode/vnode/src/meta/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c
index 98e948481e1add0f0b085448d42ed904c8f7b6a1..87c788cc3788e4770c89908a341b2091d54261ff 100644
--- a/source/dnode/vnode/src/meta/metaQuery.c
+++ b/source/dnode/vnode/src/meta/metaQuery.c
@@ -1064,7 +1064,7 @@ int32_t metaFilterTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) {
if (param->val == NULL) {
metaError("vgId:%d, failed to filter NULL data", TD_VID(pMeta->pVnode));
- return -1;
+ goto END;
} else {
if (IS_VAR_DATA_TYPE(param->type)) {
tagData = varDataVal(param->val);
@@ -1116,27 +1116,25 @@ int32_t metaFilterTableIds(SMeta *pMeta, SMetaFltParam *param, SArray *pUids) {
break;
}
}
- if (p->suid != pKey->suid) {
+ if (p == NULL || p->suid != pKey->suid) {
break;
}
first = false;
- if (p != NULL) {
- int32_t cmp = (*param->filterFunc)(p->data, pKey->data, pKey->type);
- if (cmp == 0) {
- // match
- tb_uid_t tuid = 0;
- if (IS_VAR_DATA_TYPE(pKey->type)) {
- tuid = *(tb_uid_t *)(p->data + varDataTLen(p->data));
- } else {
- tuid = *(tb_uid_t *)(p->data + tDataTypes[pCursor->type].bytes);
- }
- taosArrayPush(pUids, &tuid);
- } else if (cmp == 1) {
- // not match but should continue to iter
+ int32_t cmp = (*param->filterFunc)(p->data, pKey->data, pKey->type);
+ if (cmp == 0) {
+ // match
+ tb_uid_t tuid = 0;
+ if (IS_VAR_DATA_TYPE(pKey->type)) {
+ tuid = *(tb_uid_t *)(p->data + varDataTLen(p->data));
} else {
- // not match and no more result
- break;
+ tuid = *(tb_uid_t *)(p->data + tDataTypes[pCursor->type].bytes);
}
+ taosArrayPush(pUids, &tuid);
+ } else if (cmp == 1) {
+ // not match but should continue to iter
+ } else {
+ // not match and no more result
+ break;
}
valid = param->reverse ? tdbTbcMoveToPrev(pCursor->pCur) : tdbTbcMoveToNext(pCursor->pCur);
if (valid < 0) {
diff --git a/source/dnode/vnode/src/meta/metaSnapshot.c b/source/dnode/vnode/src/meta/metaSnapshot.c
index a40bbd7d87c8255358e2f6b9c112239faabd42a2..5c5b49ece57bd2a2a9b787c356108fc108cee4a4 100644
--- a/source/dnode/vnode/src/meta/metaSnapshot.c
+++ b/source/dnode/vnode/src/meta/metaSnapshot.c
@@ -165,6 +165,8 @@ int32_t metaSnapWriterClose(SMetaSnapWriter** ppWriter, int8_t rollback) {
} else {
code = metaCommit(pWriter->pMeta);
if (code) goto _err;
+ code = metaFinishCommit(pWriter->pMeta);
+ if (code) goto _err;
}
taosMemoryFree(pWriter);
*ppWriter = NULL;
diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c
index 2b7982d381828b6ccb458b7a11d905cf3fc13508..d16c5b19f3b241e1247391d0db52a3efad9b3a1b 100644
--- a/source/dnode/vnode/src/meta/metaTable.c
+++ b/source/dnode/vnode/src/meta/metaTable.c
@@ -15,17 +15,18 @@
#include "meta.h"
-static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
-static int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
-static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME);
-static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME);
-static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME);
-static int metaUpdateTtlIdx(SMeta *pMeta, const SMetaEntry *pME);
-static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME);
-static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME);
-static int metaUpdateSuidIdx(SMeta *pMeta, const SMetaEntry *pME);
-static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry);
-static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type);
+static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
+static int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSchema *pSchema);
+static int metaSaveToTbDb(SMeta *pMeta, const SMetaEntry *pME);
+static int metaUpdateUidIdx(SMeta *pMeta, const SMetaEntry *pME);
+static int metaUpdateNameIdx(SMeta *pMeta, const SMetaEntry *pME);
+static int metaUpdateTtlIdx(SMeta *pMeta, const SMetaEntry *pME);
+static int metaSaveToSkmDb(SMeta *pMeta, const SMetaEntry *pME);
+static int metaUpdateCtbIdx(SMeta *pMeta, const SMetaEntry *pME);
+static int metaUpdateSuidIdx(SMeta *pMeta, const SMetaEntry *pME);
+static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry);
+static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type);
+static void metaDestroyTagIdxKey(STagIdxKey *pTagIdxKey);
static void metaGetEntryInfo(const SMetaEntry *pEntry, SMetaInfo *pInfo) {
pInfo->uid = pEntry->uid;
@@ -51,7 +52,7 @@ static int metaUpdateMetaRsp(tb_uid_t uid, char *tbName, SSchemaWrapper *pSchema
return -1;
}
- strncpy(pMetaRsp->tbName, tbName, TSDB_TABLE_NAME_LEN);
+ tstrncpy(pMetaRsp->tbName, tbName, TSDB_TABLE_NAME_LEN);
pMetaRsp->numOfColumns = pSchema->nCols;
pMetaRsp->tableType = TSDB_NORMAL_TABLE;
pMetaRsp->sversion = pSchema->version;
@@ -116,9 +117,10 @@ static int metaSaveJsonVarToIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const
indexMultiTermAdd(terms, term);
}
}
- taosArrayDestroy(pTagVals);
indexJsonPut(pMeta->pTagIvtIdx, terms, tuid);
indexMultiTermDestroy(terms);
+
+ taosArrayDestroy(pTagVals);
#endif
return 0;
}
@@ -159,6 +161,7 @@ int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSche
memcpy(val, (uint16_t *)&len, VARSTR_HEADER_SIZE);
type = TSDB_DATA_TYPE_VARCHAR;
term = indexTermCreate(suid, DEL_VALUE, type, key, nKey, val, len);
+ taosMemoryFree(val);
} else if (pTagVal->nData == 0) {
term = indexTermCreate(suid, DEL_VALUE, TSDB_DATA_TYPE_VARCHAR, key, nKey, pTagVal->pData, 0);
}
@@ -177,6 +180,7 @@ int metaDelJsonVarFromIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry, const SSche
}
indexJsonPut(pMeta->pTagIvtIdx, terms, tuid);
indexMultiTermDestroy(terms);
+ taosArrayDestroy(pTagVals);
#endif
return 0;
}
@@ -571,7 +575,11 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
tdbTbGet(pMeta->pTbDb, &(STbDbKey){.version = version, .uid = uid}, sizeof(STbDbKey), &pData, &nData);
tDecoderInit(&dc, pData, nData);
- metaDecodeEntry(&dc, &e);
+ rc = metaDecodeEntry(&dc, &e);
+ if (rc < 0) {
+ tDecoderClear(&dc);
+ return -1;
+ }
if (type) *type = e.type;
@@ -591,6 +599,28 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
const SSchema *pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
if (pTagColumn->type == TSDB_DATA_TYPE_JSON) {
metaDelJsonVarFromIdx(pMeta, &e, pTagColumn);
+ } else {
+ STagIdxKey *pTagIdxKey = NULL;
+ int32_t nTagIdxKey;
+
+ const void *pTagData = NULL;
+ int32_t nTagData = 0;
+
+ STagVal tagVal = {.cid = pTagColumn->colId};
+ tTagGet((const STag *)e.ctbEntry.pTags, &tagVal);
+ if (IS_VAR_DATA_TYPE(pTagColumn->type)) {
+ pTagData = tagVal.pData;
+ nTagData = (int32_t)tagVal.nData;
+ } else {
+ pTagData = &(tagVal.i64);
+ nTagData = tDataTypes[pTagColumn->type].bytes;
+ }
+
+ if (metaCreateTagIdxKey(e.ctbEntry.suid, pTagColumn->colId, pTagData, nTagData, pTagColumn->type, uid,
+ &pTagIdxKey, &nTagIdxKey) == 0) {
+ tdbTbDelete(pMeta->pTagIdx, pTagIdxKey, nTagIdxKey, &pMeta->txn);
+ }
+ metaDestroyTagIdxKey(pTagIdxKey);
}
tDecoderClear(&tdc);
}
@@ -642,6 +672,11 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
SSchemaWrapper *pSchema;
int c;
+ if (pAlterTbReq->colName == NULL) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ return -1;
+ }
+
// search name index
ret = tdbTbGet(pMeta->pNameIdx, pAlterTbReq->tbName, strlen(pAlterTbReq->tbName) + 1, &pVal, &nVal);
if (ret < 0) {
@@ -1218,7 +1253,10 @@ static int metaUpdateTagIdx(SMeta *pMeta, const SMetaEntry *pCtbEntry) {
tdbTbGet(pMeta->pTbDb, &tbDbKey, sizeof(tbDbKey), &pData, &nData);
tDecoderInit(&dc, pData, nData);
- metaDecodeEntry(&dc, &stbEntry);
+ ret = metaDecodeEntry(&dc, &stbEntry);
+ if (ret < 0) {
+ goto end;
+ }
pTagColumn = &stbEntry.stbEntry.schemaTag.pSchema[0];
diff --git a/source/dnode/vnode/src/sma/smaCommit.c b/source/dnode/vnode/src/sma/smaCommit.c
index db5f4c55b983a5f950694358235fbf61f4bf9f56..3dce724de763648f1f1a73a06cea8810fa58f050 100644
--- a/source/dnode/vnode/src/sma/smaCommit.c
+++ b/source/dnode/vnode/src/sma/smaCommit.c
@@ -17,14 +17,17 @@
extern SSmaMgmt smaMgmt;
+#if 0
static int32_t tdProcessRSmaSyncPreCommitImpl(SSma *pSma);
static int32_t tdProcessRSmaSyncCommitImpl(SSma *pSma);
static int32_t tdProcessRSmaSyncPostCommitImpl(SSma *pSma);
+#endif
static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma);
static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma);
static int32_t tdProcessRSmaAsyncPostCommitImpl(SSma *pSma);
static int32_t tdUpdateQTaskInfoFiles(SSma *pSma, SRSmaStat *pRSmaStat);
+#if 0
/**
* @brief Only applicable to Rollup SMA
*
@@ -48,30 +51,31 @@ int32_t smaSyncCommit(SSma *pSma) { return tdProcessRSmaSyncCommitImpl(pSma); }
* @return int32_t
*/
int32_t smaSyncPostCommit(SSma *pSma) { return tdProcessRSmaSyncPostCommitImpl(pSma); }
+#endif
/**
- * @brief Only applicable to Rollup SMA
+ * @brief async commit, only applicable to Rollup SMA
*
* @param pSma
* @return int32_t
*/
-int32_t smaAsyncPreCommit(SSma *pSma) { return tdProcessRSmaAsyncPreCommitImpl(pSma); }
+int32_t smaPreCommit(SSma *pSma) { return tdProcessRSmaAsyncPreCommitImpl(pSma); }
/**
- * @brief Only applicable to Rollup SMA
+ * @brief async commit, only applicable to Rollup SMA
*
* @param pSma
* @return int32_t
*/
-int32_t smaAsyncCommit(SSma *pSma) { return tdProcessRSmaAsyncCommitImpl(pSma); }
+int32_t smaCommit(SSma *pSma) { return tdProcessRSmaAsyncCommitImpl(pSma); }
/**
- * @brief Only applicable to Rollup SMA
+ * @brief async commit, only applicable to Rollup SMA
*
* @param pSma
* @return int32_t
*/
-int32_t smaAsyncPostCommit(SSma *pSma) { return tdProcessRSmaAsyncPostCommitImpl(pSma); }
+int32_t smaPostCommit(SSma *pSma) { return tdProcessRSmaAsyncPostCommitImpl(pSma); }
/**
* @brief set rsma trigger stat active
@@ -108,6 +112,7 @@ int32_t smaBegin(SSma *pSma) {
return TSDB_CODE_SUCCESS;
}
+#if 0
/**
* @brief pre-commit for rollup sma(sync commit).
* 1) set trigger stat of rsma timer TASK_TRIGGER_STAT_PAUSED.
@@ -169,6 +174,7 @@ static int32_t tdProcessRSmaSyncCommitImpl(SSma *pSma) {
#endif
return TSDB_CODE_SUCCESS;
}
+#endif
// SQTaskFile ======================================================
@@ -230,6 +236,7 @@ static int32_t tdUpdateQTaskInfoFiles(SSma *pSma, SRSmaStat *pStat) {
return TSDB_CODE_SUCCESS;
}
+#if 0
/**
* @brief post-commit for rollup sma
* 1) clean up the outdated qtaskinfo files
@@ -249,6 +256,7 @@ static int32_t tdProcessRSmaSyncPostCommitImpl(SSma *pSma) {
return TSDB_CODE_SUCCESS;
}
+#endif
/**
* @brief Rsma async commit implementation(only do some necessary light weighted task)
@@ -358,9 +366,11 @@ static int32_t tdProcessRSmaAsyncPreCommitImpl(SSma *pSma) {
* @return int32_t
*/
static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma) {
+ int32_t code = 0;
+ SVnode *pVnode = pSma->pVnode;
SSmaEnv *pSmaEnv = SMA_RSMA_ENV(pSma);
if (!pSmaEnv) {
- return TSDB_CODE_SUCCESS;
+ goto _exit;
}
#if 0
SRSmaStat *pRSmaStat = (SRSmaStat *)SMA_ENV_STAT(pSmaEnv);
@@ -370,8 +380,21 @@ static int32_t tdProcessRSmaAsyncCommitImpl(SSma *pSma) {
return TSDB_CODE_FAILED;
}
#endif
-
- return TSDB_CODE_SUCCESS;
+ if ((code = tsdbCommit(VND_RSMA0(pVnode))) < 0) {
+ smaError("vgId:%d, failed to commit tsdb rsma0 since %s", TD_VID(pVnode), tstrerror(code));
+ goto _exit;
+ }
+ if ((code = tsdbCommit(VND_RSMA1(pVnode))) < 0) {
+ smaError("vgId:%d, failed to commit tsdb rsma1 since %s", TD_VID(pVnode), tstrerror(code));
+ goto _exit;
+ }
+ if ((code = tsdbCommit(VND_RSMA2(pVnode))) < 0) {
+ smaError("vgId:%d, failed to commit tsdb rsma2 since %s", TD_VID(pVnode), tstrerror(code));
+ goto _exit;
+ }
+_exit:
+ terrno = code;
+ return code;
}
/**
diff --git a/source/dnode/vnode/src/sma/smaEnv.c b/source/dnode/vnode/src/sma/smaEnv.c
index 64e5e49d0b116a7bed6d8ad5be49388db14bbd96..a272f5fc97883943e95d8ee7feb1c60ec90d49cb 100644
--- a/source/dnode/vnode/src/sma/smaEnv.c
+++ b/source/dnode/vnode/src/sma/smaEnv.c
@@ -455,7 +455,7 @@ static int32_t tdRsmaStopExecutor(const SSma *pSma) {
for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) {
if (taosCheckPthreadValid(pthread[i])) {
- smaDebug("vgId:%d, start to join pthread for rsma:%" PRId64, SMA_VID(pSma), pthread[i]);
+ smaDebug("vgId:%d, start to join pthread for rsma:%" PRId64 "", SMA_VID(pSma), taosGetPthreadId(pthread[i]));
taosThreadJoin(pthread[i], NULL);
}
}
@@ -463,4 +463,4 @@ static int32_t tdRsmaStopExecutor(const SSma *pSma) {
smaInfo("vgId:%d, rsma executor stopped, number:%d", SMA_VID(pSma), tsNumOfVnodeRsmaThreads);
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/source/dnode/vnode/src/sma/smaOpen.c b/source/dnode/vnode/src/sma/smaOpen.c
index ef0d51f0eb7382350da103129df2566f4bc18d15..2a769b68fe0ff93caa48a6a22030ca02b2af7023 100644
--- a/source/dnode/vnode/src/sma/smaOpen.c
+++ b/source/dnode/vnode/src/sma/smaOpen.c
@@ -29,19 +29,19 @@ static int32_t rsmaRestore(SSma *pSma);
pKeepCfg->days = smaEvalDays(v, pCfg->retentions, l, pCfg->precision, pCfg->days); \
} while (0)
-#define SMA_OPEN_RSMA_IMPL(v, l) \
- do { \
- SRetention *r = (SRetention *)VND_RETENTIONS(v) + l; \
- if (!RETENTION_VALID(r)) { \
- if (l == 0) { \
- goto _err; \
- } \
- break; \
- } \
- smaSetKeepCfg(v, &keepCfg, pCfg, TSDB_TYPE_RSMA_L##l); \
- if (tsdbOpen(v, &SMA_RSMA_TSDB##l(pSma), VNODE_RSMA##l##_DIR, &keepCfg) < 0) { \
- goto _err; \
- } \
+#define SMA_OPEN_RSMA_IMPL(v, l) \
+ do { \
+ SRetention *r = (SRetention *)VND_RETENTIONS(v) + l; \
+ if (!RETENTION_VALID(r)) { \
+ if (l == 0) { \
+ goto _err; \
+ } \
+ break; \
+ } \
+ smaSetKeepCfg(v, &keepCfg, pCfg, TSDB_TYPE_RSMA_L##l); \
+ if (tsdbOpen(v, &SMA_RSMA_TSDB##l(pSma), VNODE_RSMA##l##_DIR, &keepCfg, rollback) < 0) { \
+ goto _err; \
+ } \
} while (0)
/**
@@ -92,8 +92,7 @@ static int32_t smaEvalDays(SVnode *pVnode, SRetention *r, int8_t level, int8_t p
days = freqDuration;
}
end:
- smaInfo("vgId:%d, evaluated duration for level %" PRIi8 " is %d, raw val:%d", TD_VID(pVnode), level + 1, days,
- duration);
+ smaInfo("vgId:%d, evaluated duration for level %d is %d, raw val:%d", TD_VID(pVnode), level + 1, days, duration);
return days;
}
@@ -119,7 +118,7 @@ int smaSetKeepCfg(SVnode *pVnode, STsdbKeepCfg *pKeepCfg, STsdbCfg *pCfg, int ty
return 0;
}
-int32_t smaOpen(SVnode *pVnode) {
+int32_t smaOpen(SVnode *pVnode, int8_t rollback) {
STsdbCfg *pCfg = &pVnode->config.tsdbCfg;
ASSERT(!pVnode->pSma);
@@ -186,4 +185,4 @@ int32_t tdRSmaRestore(SSma *pSma, int8_t type, int64_t committedVer) {
ASSERT(VND_IS_RSMA(pSma->pVnode));
return tdRSmaProcessRestoreImpl(pSma, type, committedVer);
-}
\ No newline at end of file
+}
diff --git a/source/dnode/vnode/src/sma/smaRollup.c b/source/dnode/vnode/src/sma/smaRollup.c
index 722a3f479e47c5e19fa3419fc244accea5282df6..c56b32514a3195f311d504c28d66609f937e8545 100644
--- a/source/dnode/vnode/src/sma/smaRollup.c
+++ b/source/dnode/vnode/src/sma/smaRollup.c
@@ -15,8 +15,6 @@
#include "sma.h"
-#define RSMA_QTASKINFO_BUFSIZE (32768) // size
-#define RSMA_QTASKINFO_HEAD_LEN (sizeof(int32_t) + sizeof(int8_t) + sizeof(int64_t)) // len + type + suid
#define RSMA_QTASKEXEC_SMOOTH_SIZE (100) // cnt
#define RSMA_SUBMIT_BATCH_SIZE (1024) // cnt
#define RSMA_FETCH_DELAY_MAX (120000) // ms
@@ -48,23 +46,10 @@ static int32_t tdRSmaExecAndSubmitResult(SSma *pSma, qTaskInfo_t taskInfo, SR
static void tdRSmaFetchTrigger(void *param, void *tmrId);
static int32_t tdRSmaInfoClone(SSma *pSma, SRSmaInfo *pInfo);
static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level);
-static int32_t tdRSmaQTaskInfoIterInit(SRSmaQTaskInfoIter *pIter, STFile *pTFile);
-static int32_t tdRSmaQTaskInfoIterNextBlock(SRSmaQTaskInfoIter *pIter, bool *isFinish);
-static int32_t tdRSmaQTaskInfoRestore(SSma *pSma, int8_t type, SRSmaQTaskInfoIter *pIter);
-static int32_t tdRSmaQTaskInfoItemRestore(SSma *pSma, const SRSmaQTaskInfoItem *infoItem);
static int32_t tdRSmaRestoreQTaskInfoInit(SSma *pSma, int64_t *nTables);
static int32_t tdRSmaRestoreQTaskInfoReload(SSma *pSma, int8_t type, int64_t qTaskFileVer);
static int32_t tdRSmaRestoreTSDataReload(SSma *pSma);
-static SRSmaInfo *tdGetRSmaInfoByItem(SRSmaInfoItem *pItem) {
- // adapt accordingly if definition of SRSmaInfo update
- SRSmaInfo *pResult = NULL;
- ASSERT(pItem->level == TSDB_RETENTION_L1 || pItem->level == TSDB_RETENTION_L2);
- pResult = (SRSmaInfo *)POINTER_SHIFT(pItem, -(sizeof(SRSmaInfoItem) * (pItem->level - 1) + RSMA_INFO_HEAD_LEN));
- ASSERT(pResult->pTSchema->numOfCols > 1);
- return pResult;
-}
-
struct SRSmaQTaskInfoItem {
int32_t len;
int8_t type;
@@ -104,12 +89,6 @@ void tdRSmaQTaskInfoGetFullPathEx(int32_t vgId, tb_uid_t suid, int8_t level, con
snprintf(outputName + rsmaLen, TSDB_FILENAME_LEN - rsmaLen, "%" PRIi64 "%s%" PRIi8, suid, TD_DIRSEP, level);
}
-static FORCE_INLINE int32_t tdRSmaQTaskInfoContLen(int32_t lenWithHead) {
- return lenWithHead - RSMA_QTASKINFO_HEAD_LEN;
-}
-
-static FORCE_INLINE void tdRSmaQTaskInfoIterDestroy(SRSmaQTaskInfoIter *pIter) { taosMemoryFreeClear(pIter->pBuf); }
-
static void tdRSmaQTaskInfoFree(qTaskInfo_t *taskHandle, int32_t vgId, int32_t level) {
// Note: free/kill may in RC
if (!taskHandle || !(*taskHandle)) return;
@@ -363,7 +342,7 @@ static int32_t tdSetRSmaInfoItemParams(SSma *pSma, SRSmaParam *param, SRSmaStat
smaInfo("vgId:%d, item:%p table:%" PRIi64 " level:%" PRIi8 " maxdelay:%" PRIi64 " watermark:%" PRIi64
", finally maxdelay:%" PRIi32,
- TD_VID(pVnode), pItem, pRSmaInfo->suid, idx + 1, param->maxdelay[idx], param->watermark[idx],
+ TD_VID(pVnode), pItem, pRSmaInfo->suid, (int8_t)(idx + 1), param->maxdelay[idx], param->watermark[idx],
pItem->maxDelay);
}
return TSDB_CODE_SUCCESS;
@@ -803,6 +782,7 @@ static int32_t tdExecuteRSmaImplAsync(SSma *pSma, const void *pMsg, int32_t inpu
return TSDB_CODE_SUCCESS;
}
+#if 0
static int32_t tdRsmaPrintSubmitReq(SSma *pSma, SSubmitReq *pReq) {
SSubmitMsgIter msgIter = {0};
SSubmitBlkIter blkIter = {0};
@@ -820,6 +800,7 @@ static int32_t tdRsmaPrintSubmitReq(SSma *pSma, SSubmitReq *pReq) {
}
return 0;
}
+#endif
/**
* @brief sync mode
@@ -1189,65 +1170,6 @@ _err:
return TSDB_CODE_FAILED;
}
-static int32_t tdRSmaRestoreQTaskInfoReload(SSma *pSma, int8_t type, int64_t qTaskFileVer) {
- SVnode *pVnode = pSma->pVnode;
- STFile tFile = {0};
- char qTaskInfoFName[TSDB_FILENAME_LEN] = {0};
-
- tdRSmaQTaskInfoGetFileName(TD_VID(pVnode), qTaskFileVer, qTaskInfoFName);
- if (tdInitTFile(&tFile, tfsGetPrimaryPath(pVnode->pTfs), qTaskInfoFName) < 0) {
- goto _err;
- }
-
- if (!taosCheckExistFile(TD_TFILE_FULL_NAME(&tFile))) {
- if (qTaskFileVer > 0) {
- smaWarn("vgId:%d, restore rsma task %" PRIi8 " for version %" PRIi64 ", not start as %s not exist",
- TD_VID(pVnode), type, qTaskFileVer, TD_TFILE_FULL_NAME(&tFile));
- } else {
- smaDebug("vgId:%d, restore rsma task %" PRIi8 " for version %" PRIi64 ", no need as %s not exist", TD_VID(pVnode),
- type, qTaskFileVer, TD_TFILE_FULL_NAME(&tFile));
- }
- return TSDB_CODE_SUCCESS;
- }
-
- if (tdOpenTFile(&tFile, TD_FILE_READ) < 0) {
- goto _err;
- }
-
- STFInfo tFileInfo = {0};
- if (tdLoadTFileHeader(&tFile, &tFileInfo) < 0) {
- goto _err;
- }
-
- SRSmaQTaskInfoIter fIter = {0};
- if (tdRSmaQTaskInfoIterInit(&fIter, &tFile) < 0) {
- tdRSmaQTaskInfoIterDestroy(&fIter);
- tdCloseTFile(&tFile);
- tdDestroyTFile(&tFile);
- goto _err;
- }
-
- if (tdRSmaQTaskInfoRestore(pSma, type, &fIter) < 0) {
- tdRSmaQTaskInfoIterDestroy(&fIter);
- tdCloseTFile(&tFile);
- tdDestroyTFile(&tFile);
- goto _err;
- }
-
- tdRSmaQTaskInfoIterDestroy(&fIter);
- tdCloseTFile(&tFile);
- tdDestroyTFile(&tFile);
-
- // restored successfully from committed or sync
- smaInfo("vgId:%d, restore rsma task %" PRIi8 " for version %" PRIi64 ", qtaskinfo reload succeed", TD_VID(pVnode),
- type, qTaskFileVer);
- return TSDB_CODE_SUCCESS;
-_err:
- smaError("vgId:%d, restore rsma task %" PRIi8 " for version %" PRIi64 ", qtaskinfo reload failed since %s",
- TD_VID(pVnode), type, qTaskFileVer, terrstr());
- return TSDB_CODE_FAILED;
-}
-
/**
* @brief reload ts data from checkpoint
*
@@ -1270,19 +1192,12 @@ int32_t tdRSmaProcessRestoreImpl(SSma *pSma, int8_t type, int64_t qtaskFileVer)
return TSDB_CODE_SUCCESS;
}
-#if 0
- // step 2: retrieve qtaskinfo items from the persistence file(rsma/qtaskinfo) and restore
- if (tdRSmaRestoreQTaskInfoReload(pSma, type, qtaskFileVer) < 0) {
- goto _err;
- }
-#endif
-
- // step 3: reload ts data from checkpoint
+ // step 2: reload ts data from checkpoint
if (tdRSmaRestoreTSDataReload(pSma) < 0) {
goto _err;
}
- // step 4: open SRSmaFS for qTaskFiles
+ // step 3: open SRSmaFS for qTaskFiles
if (tdRSmaFSOpen(pSma, qtaskFileVer) < 0) {
goto _err;
}
@@ -1295,191 +1210,6 @@ _err:
return TSDB_CODE_FAILED;
}
-/**
- * @brief Restore from SRSmaQTaskInfoItem
- *
- * @param pSma
- * @param pItem
- * @return int32_t
- */
-static int32_t tdRSmaQTaskInfoItemRestore(SSma *pSma, const SRSmaQTaskInfoItem *pItem) {
- SRSmaInfo *pRSmaInfo = NULL;
- void *qTaskInfo = NULL;
-
- pRSmaInfo = tdAcquireRSmaInfoBySuid(pSma, pItem->suid);
- if (!pRSmaInfo) {
- smaDebug("vgId:%d, no restore as no rsma info for table:%" PRIu64, SMA_VID(pSma), pItem->suid);
- return TSDB_CODE_SUCCESS;
- }
-
- if (pItem->type == TSDB_RETENTION_L1) {
- qTaskInfo = RSMA_INFO_QTASK(pRSmaInfo, 0);
- } else if (pItem->type == TSDB_RETENTION_L2) {
- qTaskInfo = RSMA_INFO_QTASK(pRSmaInfo, 1);
- } else {
- ASSERT(0);
- }
-
- if (!qTaskInfo) {
- tdReleaseRSmaInfo(pSma, pRSmaInfo);
- smaDebug("vgId:%d, no restore as NULL rsma qTaskInfo for table:%" PRIu64, SMA_VID(pSma), pItem->suid);
- return TSDB_CODE_SUCCESS;
- }
-
- if (qDeserializeTaskStatus(qTaskInfo, pItem->qTaskInfo, pItem->len) < 0) {
- tdReleaseRSmaInfo(pSma, pRSmaInfo);
- smaError("vgId:%d, restore rsma task failed for table:%" PRIi64 " level %d since %s", SMA_VID(pSma), pItem->suid,
- pItem->type, terrstr());
- return TSDB_CODE_FAILED;
- }
- smaDebug("vgId:%d, restore rsma task success for table:%" PRIi64 " level %d", SMA_VID(pSma), pItem->suid,
- pItem->type);
-
- tdReleaseRSmaInfo(pSma, pRSmaInfo);
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t tdRSmaQTaskInfoIterInit(SRSmaQTaskInfoIter *pIter, STFile *pTFile) {
- memset(pIter, 0, sizeof(*pIter));
- pIter->pTFile = pTFile;
- pIter->offset = TD_FILE_HEAD_SIZE;
-
- if (tdGetTFileSize(pTFile, &pIter->fsize) < 0) {
- return TSDB_CODE_FAILED;
- }
-
- if ((pIter->fsize - TD_FILE_HEAD_SIZE) < RSMA_QTASKINFO_BUFSIZE) {
- pIter->nAlloc = pIter->fsize - TD_FILE_HEAD_SIZE;
- } else {
- pIter->nAlloc = RSMA_QTASKINFO_BUFSIZE;
- }
-
- if (pIter->nAlloc < TD_FILE_HEAD_SIZE) {
- pIter->nAlloc = TD_FILE_HEAD_SIZE;
- }
-
- pIter->pBuf = taosMemoryMalloc(pIter->nAlloc);
- if (!pIter->pBuf) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return TSDB_CODE_FAILED;
- }
- pIter->qBuf = pIter->pBuf;
-
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t tdRSmaQTaskInfoIterNextBlock(SRSmaQTaskInfoIter *pIter, bool *isFinish) {
- STFile *pTFile = pIter->pTFile;
- int64_t nBytes = RSMA_QTASKINFO_BUFSIZE;
-
- if (pIter->offset >= pIter->fsize) {
- *isFinish = true;
- return TSDB_CODE_SUCCESS;
- }
-
- if ((pIter->fsize - pIter->offset) < RSMA_QTASKINFO_BUFSIZE) {
- nBytes = pIter->fsize - pIter->offset;
- }
-
- if (tdSeekTFile(pTFile, pIter->offset, SEEK_SET) < 0) {
- return TSDB_CODE_FAILED;
- }
-
- if (tdReadTFile(pTFile, pIter->pBuf, nBytes) != nBytes) {
- return TSDB_CODE_FAILED;
- }
-
- int32_t infoLen = 0;
- taosDecodeFixedI32(pIter->pBuf, &infoLen);
- if (infoLen > nBytes) {
- if (infoLen <= RSMA_QTASKINFO_BUFSIZE) {
- terrno = TSDB_CODE_RSMA_FILE_CORRUPTED;
- smaError("iterate rsma qtaskinfo file %s failed since %s", TD_TFILE_FULL_NAME(pIter->pTFile), terrstr());
- return TSDB_CODE_FAILED;
- }
- if (pIter->nAlloc < infoLen) {
- pIter->nAlloc = infoLen;
- void *pBuf = taosMemoryRealloc(pIter->pBuf, infoLen);
- if (!pBuf) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return TSDB_CODE_FAILED;
- }
- pIter->pBuf = pBuf;
- }
-
- nBytes = infoLen;
-
- if (tdSeekTFile(pTFile, pIter->offset, SEEK_SET) < 0) {
- return TSDB_CODE_FAILED;
- }
-
- if (tdReadTFile(pTFile, pIter->pBuf, nBytes) != nBytes) {
- return TSDB_CODE_FAILED;
- }
- }
-
- pIter->qBuf = pIter->pBuf;
- pIter->offset += nBytes;
- pIter->nBytes = nBytes;
- pIter->nBufPos = 0;
-
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t tdRSmaQTaskInfoRestore(SSma *pSma, int8_t type, SRSmaQTaskInfoIter *pIter) {
- while (1) {
- // block iter
- bool isFinish = false;
- if (tdRSmaQTaskInfoIterNextBlock(pIter, &isFinish) < 0) {
- return TSDB_CODE_FAILED;
- }
- if (isFinish) {
- return TSDB_CODE_SUCCESS;
- }
-
- // consume the block
- int32_t qTaskInfoLenWithHead = 0;
- pIter->qBuf = taosDecodeFixedI32(pIter->qBuf, &qTaskInfoLenWithHead);
- if (qTaskInfoLenWithHead < RSMA_QTASKINFO_HEAD_LEN) {
- terrno = TSDB_CODE_TDB_FILE_CORRUPTED;
- smaError("vgId:%d, restore rsma task %" PRIi8 " from qtaskinfo file %s failed since %s", SMA_VID(pSma), type,
- TD_TFILE_FULL_NAME(pIter->pTFile), terrstr());
- return TSDB_CODE_FAILED;
- }
-
- while (1) {
- if ((pIter->nBufPos + qTaskInfoLenWithHead) <= pIter->nBytes) {
- SRSmaQTaskInfoItem infoItem = {0};
- pIter->qBuf = taosDecodeFixedI8(pIter->qBuf, &infoItem.type);
- pIter->qBuf = taosDecodeFixedI64(pIter->qBuf, &infoItem.suid);
- infoItem.qTaskInfo = pIter->qBuf;
- infoItem.len = tdRSmaQTaskInfoContLen(qTaskInfoLenWithHead);
- // do the restore job
- smaDebug("vgId:%d, restore rsma task %" PRIi8 " from qtaskinfo file %s offset:%" PRIi64 "\n", SMA_VID(pSma),
- type, TD_TFILE_FULL_NAME(pIter->pTFile), pIter->offset - pIter->nBytes + pIter->nBufPos);
- tdRSmaQTaskInfoItemRestore(pSma, &infoItem);
-
- pIter->qBuf = POINTER_SHIFT(pIter->qBuf, infoItem.len);
- pIter->nBufPos += qTaskInfoLenWithHead;
-
- if ((pIter->nBufPos + RSMA_QTASKINFO_HEAD_LEN) >= pIter->nBytes) {
- // prepare and load next block in the file
- pIter->offset -= (pIter->nBytes - pIter->nBufPos);
- break;
- }
-
- pIter->qBuf = taosDecodeFixedI32(pIter->qBuf, &qTaskInfoLenWithHead);
- continue;
- }
- // prepare and load next block in the file
- pIter->offset -= (pIter->nBytes - pIter->nBufPos);
- break;
- }
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash) {
SSma *pSma = pRSmaStat->pSma;
SVnode *pVnode = pSma->pVnode;
@@ -1523,148 +1253,6 @@ _err:
return TSDB_CODE_FAILED;
}
-#if 0
-int32_t tdRSmaPersistExecImpl(SRSmaStat *pRSmaStat, SHashObj *pInfoHash) {
- SSma *pSma = pRSmaStat->pSma;
- SVnode *pVnode = pSma->pVnode;
- int32_t vid = SMA_VID(pSma);
- int64_t toffset = 0;
- bool isFileCreated = false;
-
- if (taosHashGetSize(pInfoHash) <= 0) {
- return TSDB_CODE_SUCCESS;
- }
-
- void *infoHash = taosHashIterate(pInfoHash, NULL);
- if (!infoHash) {
- return TSDB_CODE_SUCCESS;
- }
-
- int64_t fsMaxVer = tdRSmaFSMaxVer(pSma, pRSmaStat);
- if (pRSmaStat->commitAppliedVer <= fsMaxVer) {
- smaDebug("vgId:%d, rsma persist, no need as applied %" PRIi64 " not larger than fsMaxVer %" PRIi64, vid,
- pRSmaStat->commitAppliedVer, fsMaxVer);
- return TSDB_CODE_SUCCESS;
- }
-
- STFile tFile = {0};
-#if 0
- if (pRSmaStat->commitAppliedVer > 0) {
- char qTaskInfoFName[TSDB_FILENAME_LEN];
- tdRSmaQTaskInfoGetFileName(vid, pRSmaStat->commitAppliedVer, qTaskInfoFName);
- if (tdInitTFile(&tFile, tfsGetPrimaryPath(pVnode->pTfs), qTaskInfoFName) < 0) {
- smaError("vgId:%d, rsma persist, init %s failed since %s", vid, qTaskInfoFName, terrstr());
- goto _err;
- }
- if (tdCreateTFile(&tFile, true, TD_FTYPE_RSMA_QTASKINFO) < 0) {
- smaError("vgId:%d, rsma persist, create %s failed since %s", vid, TD_TFILE_FULL_NAME(&tFile), terrstr());
- goto _err;
- }
- smaDebug("vgId:%d, rsma, serialize qTaskInfo, file %s created", vid, TD_TFILE_FULL_NAME(&tFile));
-
- isFileCreated = true;
- }
-#endif
-
- while (infoHash) {
- SRSmaInfo *pRSmaInfo = *(SRSmaInfo **)infoHash;
-
- if (RSMA_INFO_IS_DEL(pRSmaInfo)) {
- infoHash = taosHashIterate(pInfoHash, infoHash);
- continue;
- }
-
- for (int32_t i = 0; i < TSDB_RETENTION_L2; ++i) {
-#if 0
- qTaskInfo_t taskInfo = RSMA_INFO_IQTASK(pRSmaInfo, i);
-#endif
- qTaskInfo_t taskInfo = RSMA_INFO_QTASK(pRSmaInfo, i);
- if (!taskInfo) {
- smaDebug("vgId:%d, rsma, table %" PRIi64 " level %d qTaskInfo is NULL", vid, pRSmaInfo->suid, i + 1);
- continue;
- }
-
- char *pOutput = NULL;
- int32_t len = 0;
- int8_t type = (int8_t)(i + 1);
- if (qSerializeTaskStatus(taskInfo, &pOutput, &len) < 0) {
- smaError("vgId:%d, rsma, table %" PRIi64 " level %d serialize qTaskInfo failed since %s", vid, pRSmaInfo->suid,
- i + 1, terrstr());
- goto _err;
- }
- if (!pOutput || len <= 0) {
- smaDebug("vgId:%d, rsma, table %" PRIi64
- " level %d serialize qTaskInfo success but no output(len %d), not persist",
- vid, pRSmaInfo->suid, i + 1, len);
- taosMemoryFreeClear(pOutput);
- continue;
- }
-
- smaDebug("vgId:%d, rsma, table %" PRIi64 " level %d serialize qTaskInfo success with len %d, need persist", vid,
- pRSmaInfo->suid, i + 1, len);
-
- if (!isFileCreated) {
- char qTaskInfoFName[TSDB_FILENAME_LEN];
- tdRSmaQTaskInfoGetFileName(vid, pRSmaStat->commitAppliedVer, qTaskInfoFName);
- if (tdInitTFile(&tFile, tfsGetPrimaryPath(pVnode->pTfs), qTaskInfoFName) < 0) {
- smaError("vgId:%d, rsma persist, init %s failed since %s", vid, qTaskInfoFName, terrstr());
- goto _err;
- }
- if (tdCreateTFile(&tFile, true, TD_FTYPE_RSMA_QTASKINFO) < 0) {
- smaError("vgId:%d, rsma persist, create %s failed since %s", vid, TD_TFILE_FULL_NAME(&tFile), terrstr());
- goto _err;
- }
- smaDebug("vgId:%d, rsma, table %" PRIi64 " serialize qTaskInfo, file %s created", vid, pRSmaInfo->suid,
- TD_TFILE_FULL_NAME(&tFile));
-
- isFileCreated = true;
- }
-
- char tmpBuf[RSMA_QTASKINFO_HEAD_LEN] = {0};
- void *pTmpBuf = &tmpBuf;
- int32_t headLen = 0;
- headLen += taosEncodeFixedI32(&pTmpBuf, len + RSMA_QTASKINFO_HEAD_LEN);
- headLen += taosEncodeFixedI8(&pTmpBuf, type);
- headLen += taosEncodeFixedI64(&pTmpBuf, pRSmaInfo->suid);
-
- ASSERT(headLen <= RSMA_QTASKINFO_HEAD_LEN);
- tdAppendTFile(&tFile, (void *)&tmpBuf, headLen, &toffset);
- smaDebug("vgId:%d, rsma, table %" PRIi64 " level %d head part(len:%d) appended to offset:%" PRIi64, vid,
- pRSmaInfo->suid, i + 1, headLen, toffset);
- tdAppendTFile(&tFile, pOutput, len, &toffset);
- smaDebug("vgId:%d, rsma, table %" PRIi64 " level %d body part len:%d appended to offset:%" PRIi64, vid,
- pRSmaInfo->suid, i + 1, len, toffset);
-
- taosMemoryFree(pOutput);
- }
-
- infoHash = taosHashIterate(pInfoHash, infoHash);
- }
-
- if (isFileCreated) {
- if (tdUpdateTFileHeader(&tFile) < 0) {
- smaError("vgId:%d, rsma, failed to update tfile %s header since %s", vid, TD_TFILE_FULL_NAME(&tFile),
- tstrerror(terrno));
- goto _err;
- } else {
- smaDebug("vgId:%d, rsma, succeed to update tfile %s header", vid, TD_TFILE_FULL_NAME(&tFile));
- }
-
- tdCloseTFile(&tFile);
- tdDestroyTFile(&tFile);
- }
- return TSDB_CODE_SUCCESS;
-_err:
- smaError("vgId:%d, rsma persist failed since %s", vid, terrstr());
- if (isFileCreated) {
- tdRemoveTFile(&tFile);
- tdDestroyTFile(&tFile);
- }
- return TSDB_CODE_FAILED;
-}
-
-#endif
-
/**
* @brief trigger to get rsma result in async mode
*
@@ -1799,7 +1387,7 @@ static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo) {
}
if ((++pItem->nScanned * pItem->maxDelay) > RSMA_FETCH_DELAY_MAX) {
- smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi8 " maxDelay:%d, fetch executed",
+ smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi16 " maxDelay:%d, fetch executed",
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay);
} else {
int64_t curMs = taosGetTimestampMs();
@@ -1823,10 +1411,10 @@ static int32_t tdRSmaFetchAllResult(SSma *pSma, SRSmaInfo *pInfo) {
goto _err;
}
- smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi8 " maxDelay:%d, fetch finished",
+ smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi16 " maxDelay:%d, fetch finished",
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay);
} else {
- smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi8
+ smaDebug("vgId:%d, suid:%" PRIi64 " level:%" PRIi8 " nScanned:%" PRIi16
" maxDelay:%d, fetch not executed as fetch level is %" PRIi8,
SMA_VID(pSma), pInfo->suid, i, pItem->nScanned, pItem->maxDelay, pItem->fetchLevel);
}
@@ -1925,7 +1513,7 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) {
int32_t qallItemSize = taosQallItemSize(pInfo->qall);
if (qallItemSize > 0) {
tdRSmaBatchExec(pSma, pInfo, pInfo->qall, pSubmitArr, type);
- smaDebug("vgId:%d, batchSize:%d, execType:%" PRIi8, SMA_VID(pSma), qallItemSize, type);
+ smaDebug("vgId:%d, batchSize:%d, execType:%" PRIi32, SMA_VID(pSma), qallItemSize, type);
}
if (RSMA_INFO_ITEM(pInfo, 0)->fetchLevel || RSMA_INFO_ITEM(pInfo, 1)->fetchLevel) {
diff --git a/source/dnode/vnode/src/sma/smaUtil.c b/source/dnode/vnode/src/sma/smaUtil.c
index 6d7b7df1ee4061070328ccf8522b04ecc8bccd49..4d09d690d684c68199f63165875216ea3685acad 100644
--- a/source/dnode/vnode/src/sma/smaUtil.c
+++ b/source/dnode/vnode/src/sma/smaUtil.c
@@ -16,7 +16,7 @@
#include "sma.h"
// smaFileUtil ================
-
+#if 0
#define TD_FILE_STATE_OK 0
#define TD_FILE_STATE_BAD 1
@@ -182,6 +182,8 @@ void tdCloseTFile(STFile *pTFile) {
void tdDestroyTFile(STFile *pTFile) { taosMemoryFreeClear(TD_TFILE_FULL_NAME(pTFile)); }
+#endif
+
void tdGetVndFileName(int32_t vgId, const char *pdname, const char *dname, const char *fname, int64_t version,
char *outputName) {
if (version < 0) {
@@ -221,6 +223,7 @@ void tdGetVndDirName(int32_t vgId, const char *pdname, const char *dname, bool e
}
}
+#if 0
int32_t tdInitTFile(STFile *pTFile, const char *dname, const char *fname) {
TD_TFILE_SET_STATE(pTFile, TD_FILE_STATE_OK);
TD_TFILE_SET_CLOSED(pTFile);
@@ -286,6 +289,8 @@ int32_t tdRemoveTFile(STFile *pTFile) {
return 0;
}
+#endif
+
// smaXXXUtil ================
void *tdAcquireSmaRef(int32_t rsetId, int64_t refId) {
void *pResult = taosAcquireRef(rsetId, refId);
diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c
index 5e1cc150637f9acd2d6ff9e60717911cd4f252f6..da22d0d951c34fc704a33355c74a01c0d987239b 100644
--- a/source/dnode/vnode/src/tq/tq.c
+++ b/source/dnode/vnode/src/tq/tq.c
@@ -564,7 +564,7 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
pPushEntry->dataRsp.head.epoch = reqEpoch;
pPushEntry->dataRsp.head.mqMsgType = TMQ_MSG_TYPE__POLL_RSP;
taosHashPut(pTq->pPushMgr, pHandle->subKey, strlen(pHandle->subKey) + 1, &pPushEntry, sizeof(void*));
- tqDebug("tmq poll: consumer %ld, subkey %s, vg %d save handle to push mgr", consumerId, pHandle->subKey,
+ tqDebug("tmq poll: consumer %" PRId64 ", subkey %s, vg %d save handle to push mgr", consumerId, pHandle->subKey,
TD_VID(pTq->pVnode));
// unlock
taosWUnLockLatch(&pTq->pushLock);
@@ -578,7 +578,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
code = -1;
}
- tqDebug("tmq poll: consumer %ld, subkey %s, vg %d, send data blockNum:%d, offset type:%d, uid:%ld, version:%ld",
+ tqDebug("tmq poll: consumer %" PRId64 ", subkey %s, vg %d, send data blockNum:%d, offset type:%d, uid:%" PRId64
+ ", version:%" PRId64 "",
consumerId, pHandle->subKey, TD_VID(pTq->pVnode), dataRsp.blockNum, dataRsp.rspOffset.type,
dataRsp.rspOffset.uid, dataRsp.rspOffset.version);
@@ -595,14 +596,15 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
tqInitTaosxRsp(&taosxRsp, pReq);
if (fetchOffsetNew.type != TMQ_OFFSET__LOG) {
- tqScan(pTq, pHandle, &taosxRsp, &metaRsp, &fetchOffsetNew);
+ tqScanTaosx(pTq, pHandle, &taosxRsp, &metaRsp, &fetchOffsetNew);
if (metaRsp.metaRspLen > 0) {
if (tqSendMetaPollRsp(pTq, pMsg, pReq, &metaRsp) < 0) {
code = -1;
}
- tqDebug("tmq poll: consumer %ld, subkey %s, vg %d, send meta offset type:%d,uid:%ld,version:%ld", consumerId,
- pHandle->subKey, TD_VID(pTq->pVnode), metaRsp.rspOffset.type, metaRsp.rspOffset.uid,
+ tqDebug("tmq poll: consumer %" PRId64 ", subkey %s, vg %d, send meta offset type:%d,uid:%" PRId64
+ ",version:%" PRId64 "",
+ consumerId, pHandle->subKey, TD_VID(pTq->pVnode), metaRsp.rspOffset.type, metaRsp.rspOffset.uid,
metaRsp.rspOffset.version);
taosMemoryFree(metaRsp.metaRsp);
tDeleteSTaosxRsp(&taosxRsp);
@@ -619,7 +621,8 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
fetchOffsetNew = taosxRsp.rspOffset;
}
- tqDebug("taosx poll: consumer %ld, subkey %s, vg %d, send data blockNum:%d, offset type:%d,uid:%ld,version:%ld",
+ tqDebug("taosx poll: consumer %" PRId64 ", subkey %s, vg %d, send data blockNum:%d, offset type:%d,uid:%" PRId64
+ ",version:%" PRId64 "",
consumerId, pHandle->subKey, TD_VID(pTq->pVnode), taosxRsp.blockNum, taosxRsp.rspOffset.type,
taosxRsp.rspOffset.uid, taosxRsp.rspOffset.version);
}
@@ -769,11 +772,11 @@ int32_t tqProcessVgChangeReq(STQ* pTq, int64_t version, char* msg, int32_t msgLe
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
if (pHandle == NULL) {
if (req.oldConsumerId != -1) {
- tqError("vgId:%d, build new consumer handle %s for consumer %ld, but old consumerId is %ld", req.vgId, req.subKey,
- req.newConsumerId, req.oldConsumerId);
+ tqError("vgId:%d, build new consumer handle %s for consumer %" PRId64 ", but old consumerId is %" PRId64 "",
+ req.vgId, req.subKey, req.newConsumerId, req.oldConsumerId);
}
if (req.newConsumerId == -1) {
- tqError("vgId:%d, tq invalid rebalance request, new consumerId %ld", req.vgId, req.newConsumerId);
+ tqError("vgId:%d, tq invalid rebalance request, new consumerId %" PRId64 "", req.vgId, req.newConsumerId);
return 0;
}
STqHandle tqHandle = {0};
@@ -924,7 +927,7 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask) {
pTask->smaSink.smaSink = smaHandleRes;
} else if (pTask->outputType == TASK_OUTPUT__TABLE) {
pTask->tbSink.vnode = pTq->pVnode;
- pTask->tbSink.tbSinkFunc = tqTableSink1;
+ pTask->tbSink.tbSinkFunc = tqSinkToTablePipeline;
ASSERT(pTask->tbSink.pSchemaWrapper);
ASSERT(pTask->tbSink.pSchemaWrapper->pSchema);
diff --git a/source/dnode/vnode/src/tq/tqExec.c b/source/dnode/vnode/src/tq/tqExec.c
index 58d051bec1aaa1d6d88309eb4ef17f2a9c736d4e..305ee829826f626c4dd85e2128269a34865216b8 100644
--- a/source/dnode/vnode/src/tq/tqExec.c
+++ b/source/dnode/vnode/src/tq/tqExec.c
@@ -123,7 +123,7 @@ int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffs
return 0;
}
-int32_t tqScan(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* pOffset) {
+int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMetaRsp* pMetaRsp, STqOffsetVal* pOffset) {
const STqExecHandle* pExec = &pHandle->execHandle;
qTaskInfo_t task = pExec->task;
diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c
index 8e4bc34e0cf016878595117e65539ced34440c37..b852acb936450dcdeda2db1c22ea3a240b2f3105 100644
--- a/source/dnode/vnode/src/tq/tqMeta.c
+++ b/source/dnode/vnode/src/tq/tqMeta.c
@@ -70,17 +70,17 @@ int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) {
}
int32_t tqMetaOpen(STQ* pTq) {
- if (tdbOpen(pTq->path, 16 * 1024, 1, &pTq->pMetaDB) < 0) {
+ if (tdbOpen(pTq->path, 16 * 1024, 1, &pTq->pMetaDB, 0) < 0) {
ASSERT(0);
return -1;
}
- if (tdbTbOpen("tq.db", -1, -1, NULL, pTq->pMetaDB, &pTq->pExecStore) < 0) {
+ if (tdbTbOpen("tq.db", -1, -1, NULL, pTq->pMetaDB, &pTq->pExecStore, 0) < 0) {
ASSERT(0);
return -1;
}
- if (tdbTbOpen("tq.check.db", -1, -1, NULL, pTq->pMetaDB, &pTq->pCheckStore) < 0) {
+ if (tdbTbOpen("tq.check.db", -1, -1, NULL, pTq->pMetaDB, &pTq->pCheckStore, 0) < 0) {
ASSERT(0);
return -1;
}
@@ -193,8 +193,8 @@ int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
tEncodeSize(tEncodeSTqHandle, pHandle, vlen, code);
ASSERT(code == 0);
- tqDebug("tq save %s(%d) consumer %ld vgId:%d", pHandle->subKey, (int32_t)strlen(pHandle->subKey), pHandle->consumerId,
- TD_VID(pTq->pVnode));
+ tqDebug("tq save %s(%d) consumer %" PRId64 " vgId:%d", pHandle->subKey, (int32_t)strlen(pHandle->subKey),
+ pHandle->consumerId, TD_VID(pTq->pVnode));
void* buf = taosMemoryCalloc(1, vlen);
if (buf == NULL) {
diff --git a/source/dnode/vnode/src/tq/tqPush.c b/source/dnode/vnode/src/tq/tqPush.c
index 4083a1a0aeef2f9a783bdace02fb89bdfeb1fe9c..5ffbc41eb5b3e24c894c26899530f7c9d4ee6b0d 100644
--- a/source/dnode/vnode/src/tq/tqPush.c
+++ b/source/dnode/vnode/src/tq/tqPush.c
@@ -213,7 +213,7 @@ int32_t tqPushMsgNew(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_
#endif
int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver) {
- tqDebug("vgId:%d tq push msg ver %ld, type: %s", pTq->pVnode->config.vgId, ver, TMSG_INFO(msgType));
+ tqDebug("vgId:%d tq push msg ver %" PRId64 ", type: %s", pTq->pVnode->config.vgId, ver, TMSG_INFO(msgType));
if (msgType == TDMT_VND_SUBMIT) {
// lock push mgr to avoid potential msg lost
@@ -246,8 +246,8 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver)
continue;
}
if (pPushEntry->dataRsp.reqOffset.version >= ver) {
- tqDebug("vgId:%d push entry req version %ld, while push version %ld, skip", pTq->pVnode->config.vgId,
- pPushEntry->dataRsp.reqOffset.version, ver);
+ tqDebug("vgId:%d push entry req version %" PRId64 ", while push version %" PRId64 ", skip",
+ pTq->pVnode->config.vgId, pPushEntry->dataRsp.reqOffset.version, ver);
continue;
}
STqExecHandle* pExec = &pHandle->execHandle;
diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c
index 9bdcf04e890eb59082bfcb932754808829dce8e8..3e59e0fd45097ccebf67d2019e07cf5e6942d5d1 100644
--- a/source/dnode/vnode/src/tq/tqSink.c
+++ b/source/dnode/vnode/src/tq/tqSink.c
@@ -36,7 +36,7 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
} else {
name = buildCtbNameByGroupId(stbFullName, groupId);
}
- tqDebug("stream delete msg: groupId :%ld, name: %s", groupId, name);
+ tqDebug("stream delete msg: groupId :%" PRId64 ", name: %s", groupId, name);
SMetaReader mr = {0};
metaReaderInit(&mr, pVnode->pMeta, 0);
if (metaGetTableEntryByName(&mr, name) < 0) {
@@ -284,7 +284,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
return ret;
}
-void tqTableSink1(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
+void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
const SArray* pBlocks = (const SArray*)data;
SVnode* pVnode = (SVnode*)vnode;
int64_t suid = pTask->tbSink.stbUid;
@@ -435,8 +435,9 @@ void tqTableSink1(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
continue;
}
if (mr.me.ctbEntry.suid != suid) {
- tqError("vgId:%d, failed to write into %s, since suid mismatch, expect suid: %ld, actual suid %ld",
- TD_VID(pVnode), ctbName, suid, mr.me.ctbEntry);
+ tqError("vgId:%d, failed to write into %s, since suid mismatch, expect suid: %" PRId64
+ ", actual suid %" PRId64 "",
+ TD_VID(pVnode), ctbName, suid, mr.me.ctbEntry.suid);
metaReaderClear(&mr);
taosMemoryFree(ctbName);
continue;
@@ -446,7 +447,8 @@ void tqTableSink1(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
uid = mr.me.uid;
metaReaderClear(&mr);
- tqDebug("vgId:%d, stream write, table %s, uid %ld already exist, skip create", TD_VID(pVnode), ctbName, uid);
+ tqDebug("vgId:%d, stream write, table %s, uid %" PRId64 " already exist, skip create", TD_VID(pVnode), ctbName,
+ uid);
taosMemoryFreeClear(ctbName);
}
@@ -528,7 +530,7 @@ void tqTableSink1(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
taosArrayDestroy(tagArray);
}
-void tqTableSink(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
+void tqSinkToTableMerge(SStreamTask* pTask, void* vnode, int64_t ver, void* data) {
const SArray* pRes = (const SArray*)data;
SVnode* pVnode = (SVnode*)vnode;
SBatchDeleteReq deleteReq = {0};
diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c
index a4d993bc6c318967d2624aed82ce66918a778d00..674cdc115fd4c1531a4199e7b16ce935df87d19e 100644
--- a/source/dnode/vnode/src/tsdb/tsdbCommit.c
+++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c
@@ -1041,38 +1041,21 @@ _exit:
static int32_t tsdbEndCommit(SCommitter *pCommitter, int32_t eno) {
int32_t code = 0;
int32_t lino = 0;
+ STsdb *pTsdb = pCommitter->pTsdb;
- STsdb *pTsdb = pCommitter->pTsdb;
- SMemTable *pMemTable = pTsdb->imem;
-
- ASSERT(eno == 0 &&
- "tsdbCommit failure"
- "Restart taosd");
-
- code = tsdbFSCommit1(pTsdb, &pCommitter->fs);
- TSDB_CHECK_CODE(code, lino, _exit);
-
- // lock
- taosThreadRwlockWrlock(&pTsdb->rwLock);
-
- // commit or rollback
- code = tsdbFSCommit2(pTsdb, &pCommitter->fs);
- if (code) {
- taosThreadRwlockUnlock(&pTsdb->rwLock);
+ if (eno) {
+ code = eno;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ } else {
+ code = tsdbFSPrepareCommit(pCommitter->pTsdb, &pCommitter->fs);
TSDB_CHECK_CODE(code, lino, _exit);
}
- pTsdb->imem = NULL;
-
- // unlock
- taosThreadRwlockUnlock(&pTsdb->rwLock);
-
- tsdbUnrefMemTable(pMemTable);
+_exit:
tsdbFSDestroy(&pCommitter->fs);
taosArrayDestroy(pCommitter->aTbDataP);
-
-_exit:
- if (code) {
+ pCommitter->aTbDataP = NULL;
+ if (code || eno) {
tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
} else {
tsdbInfo("vgId:%d tsdb end commit", TD_VID(pTsdb->pVnode));
@@ -1646,3 +1629,50 @@ _exit:
}
return code;
}
+
+int32_t tsdbFinishCommit(STsdb *pTsdb) {
+ int32_t code = 0;
+ int32_t lino = 0;
+ SMemTable *pMemTable = pTsdb->imem;
+
+ // lock
+ taosThreadRwlockWrlock(&pTsdb->rwLock);
+
+ code = tsdbFSCommit(pTsdb);
+ if (code) {
+ taosThreadRwlockUnlock(&pTsdb->rwLock);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ pTsdb->imem = NULL;
+
+ // unlock
+ taosThreadRwlockUnlock(&pTsdb->rwLock);
+ if (pMemTable) {
+ tsdbUnrefMemTable(pMemTable);
+ }
+
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ } else {
+ tsdbInfo("vgId:%d tsdb finish commit", TD_VID(pTsdb->pVnode));
+ }
+ return code;
+}
+
+int32_t tsdbRollbackCommit(STsdb *pTsdb) {
+ int32_t code = 0;
+ int32_t lino = 0;
+
+ code = tsdbFSRollback(pTsdb);
+ TSDB_CHECK_CODE(code, lino, _exit);
+
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ } else {
+ tsdbInfo("vgId:%d tsdb rollback commit", TD_VID(pTsdb->pVnode));
+ }
+ return code;
+}
\ No newline at end of file
diff --git a/source/dnode/vnode/src/tsdb/tsdbFS.c b/source/dnode/vnode/src/tsdb/tsdbFS.c
index 6fd562959229fd4c75b4f333f118caa86a66555c..403952085143c05b1eeedf10f91d9308e6384b56 100644
--- a/source/dnode/vnode/src/tsdb/tsdbFS.c
+++ b/source/dnode/vnode/src/tsdb/tsdbFS.c
@@ -16,7 +16,7 @@
#include "tsdb.h"
// =================================================================================================
-static int32_t tsdbEncodeFS(uint8_t *p, STsdbFS *pFS) {
+static int32_t tsdbFSToBinary(uint8_t *p, STsdbFS *pFS) {
int32_t n = 0;
int8_t hasDel = pFS->pDelFile ? 1 : 0;
uint32_t nSet = taosArrayGetSize(pFS->aDFileSet);
@@ -39,218 +39,117 @@ static int32_t tsdbEncodeFS(uint8_t *p, STsdbFS *pFS) {
return n;
}
-static int32_t tsdbGnrtCurrent(STsdb *pTsdb, STsdbFS *pFS, char *fname) {
- int32_t code = 0;
- int64_t n;
- int64_t size;
- uint8_t *pData = NULL;
- TdFilePtr pFD = NULL;
+static int32_t tsdbBinaryToFS(uint8_t *pData, int64_t nData, STsdbFS *pFS) {
+ int32_t code = 0;
+ int32_t n = 0;
- // to binary
- size = tsdbEncodeFS(NULL, pFS) + sizeof(TSCKSUM);
- pData = taosMemoryMalloc(size);
+ // version
+ n += tGetI8(pData + n, NULL);
+
+ // SDelFile
+ int8_t hasDel = 0;
+ n += tGetI8(pData + n, &hasDel);
+ if (hasDel) {
+ pFS->pDelFile = (SDelFile *)taosMemoryCalloc(1, sizeof(SDelFile));
+ if (pFS->pDelFile == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+
+ n += tGetDelFile(pData + n, pFS->pDelFile);
+ pFS->pDelFile->nRef = 1;
+ } else {
+ pFS->pDelFile = NULL;
+ }
+
+ // aDFileSet
+ taosArrayClear(pFS->aDFileSet);
+ uint32_t nSet = 0;
+ n += tGetU32v(pData + n, &nSet);
+ for (uint32_t iSet = 0; iSet < nSet; iSet++) {
+ SDFileSet fSet = {0};
+
+ int32_t nt = tGetDFileSet(pData + n, &fSet);
+ if (nt < 0) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+
+ n += nt;
+ if (taosArrayPush(pFS->aDFileSet, &fSet) == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+ }
+
+ ASSERT(n + sizeof(TSCKSUM) == nData);
+
+_exit:
+ return code;
+}
+
+static int32_t tsdbSaveFSToFile(STsdbFS *pFS, const char *fname) {
+ int32_t code = 0;
+ int32_t lino = 0;
+
+ // encode to binary
+ int32_t size = tsdbFSToBinary(NULL, pFS) + sizeof(TSCKSUM);
+ uint8_t *pData = taosMemoryMalloc(size);
if (pData == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
- n = tsdbEncodeFS(pData, pFS);
- ASSERT(n + sizeof(TSCKSUM) == size);
+ tsdbFSToBinary(pData, pFS);
taosCalcChecksumAppend(0, pData, size);
- // create and write
- pFD = taosOpenFile(fname, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
+ // save to file
+ TdFilePtr pFD = taosOpenFile(fname, TD_FILE_WRITE | TD_FILE_CREATE | TD_FILE_TRUNC);
if (pFD == NULL) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
- n = taosWriteFile(pFD, pData, size);
+ int64_t n = taosWriteFile(pFD, pData, size);
if (n < 0) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ taosCloseFile(&pFD);
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (taosFsyncFile(pFD) < 0) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ taosCloseFile(&pFD);
+ TSDB_CHECK_CODE(code, lino, _exit);
}
taosCloseFile(&pFD);
+_exit:
if (pData) taosMemoryFree(pData);
+ if (code) {
+ tsdbError("%s failed at line %d since %s, fname:%s", __func__, lino, tstrerror(code), fname);
+ }
return code;
+}
-_err:
- tsdbError("vgId:%d, tsdb gnrt current failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
- if (pData) taosMemoryFree(pData);
+int32_t tsdbFSCreate(STsdbFS *pFS) {
+ int32_t code = 0;
+
+ pFS->pDelFile = NULL;
+ pFS->aDFileSet = taosArrayInit(0, sizeof(SDFileSet));
+ if (pFS->aDFileSet == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+
+_exit:
return code;
}
-// static int32_t tsdbApplyDFileSetChange(STsdbFS *pFS, SDFileSet *pFrom, SDFileSet *pTo) {
-// int32_t code = 0;
-// char fname[TSDB_FILENAME_LEN];
-
-// if (pFrom && pTo) {
-// bool isSameDisk = (pFrom->diskId.level == pTo->diskId.level) && (pFrom->diskId.id == pTo->diskId.id);
-
-// // head
-// if (isSameDisk && pFrom->pHeadF->commitID == pTo->pHeadF->commitID) {
-// ASSERT(pFrom->pHeadF->size == pTo->pHeadF->size);
-// ASSERT(pFrom->pHeadF->offset == pTo->pHeadF->offset);
-// } else {
-// tsdbHeadFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pHeadF, fname);
-// taosRemoveFile(fname);
-// }
-
-// // data
-// if (isSameDisk && pFrom->pDataF->commitID == pTo->pDataF->commitID) {
-// if (pFrom->pDataF->size > pTo->pDataF->size) {
-// code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_DATA_FILE);
-// if (code) goto _err;
-// }
-// } else {
-// tsdbDataFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pDataF, fname);
-// taosRemoveFile(fname);
-// }
-
-// // stt
-// if (isSameDisk && pFrom->pLastF->commitID == pTo->pLastF->commitID) {
-// if (pFrom->pLastF->size > pTo->pLastF->size) {
-// code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_LAST_FILE);
-// if (code) goto _err;
-// }
-// } else {
-// tsdbLastFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pLastF, fname);
-// taosRemoveFile(fname);
-// }
-
-// // sma
-// if (isSameDisk && pFrom->pSmaF->commitID == pTo->pSmaF->commitID) {
-// if (pFrom->pSmaF->size > pTo->pSmaF->size) {
-// code = tsdbDFileRollback(pFS->pTsdb, pTo, TSDB_SMA_FILE);
-// if (code) goto _err;
-// }
-// } else {
-// tsdbSmaFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pSmaF, fname);
-// taosRemoveFile(fname);
-// }
-// } else if (pFrom) {
-// // head
-// tsdbHeadFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pHeadF, fname);
-// taosRemoveFile(fname);
-
-// // data
-// tsdbDataFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pDataF, fname);
-// taosRemoveFile(fname);
-
-// // stt
-// tsdbLastFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pLastF, fname);
-// taosRemoveFile(fname);
-
-// // fsm
-// tsdbSmaFileName(pFS->pTsdb, pFrom->diskId, pFrom->fid, pFrom->pSmaF, fname);
-// taosRemoveFile(fname);
-// }
-
-// return code;
-
-// _err:
-// tsdbError("vgId:%d, tsdb apply disk file set change failed since %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
-// return code;
-// }
-
-// static int32_t tsdbApplyDelFileChange(STsdbFS *pFS, SDelFile *pFrom, SDelFile *pTo) {
-// int32_t code = 0;
-// char fname[TSDB_FILENAME_LEN];
-
-// if (pFrom && pTo) {
-// if (!tsdbDelFileIsSame(pFrom, pTo)) {
-// tsdbDelFileName(pFS->pTsdb, pFrom, fname);
-// if (taosRemoveFile(fname) < 0) {
-// code = TAOS_SYSTEM_ERROR(errno);
-// goto _err;
-// }
-// }
-// } else if (pFrom) {
-// tsdbDelFileName(pFS->pTsdb, pFrom, fname);
-// if (taosRemoveFile(fname) < 0) {
-// code = TAOS_SYSTEM_ERROR(errno);
-// goto _err;
-// }
-// } else {
-// // do nothing
-// }
-
-// return code;
-
-// _err:
-// tsdbError("vgId:%d, tsdb apply del file change failed since %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
-// return code;
-// }
-
-// static int32_t tsdbFSApplyDiskChange(STsdbFS *pFS, STsdbFSState *pFrom, STsdbFSState *pTo) {
-// int32_t code = 0;
-// int32_t iFrom = 0;
-// int32_t nFrom = taosArrayGetSize(pFrom->aDFileSet);
-// int32_t iTo = 0;
-// int32_t nTo = taosArrayGetSize(pTo->aDFileSet);
-// SDFileSet *pDFileSetFrom;
-// SDFileSet *pDFileSetTo;
-
-// // SDelFile
-// code = tsdbApplyDelFileChange(pFS, pFrom->pDelFile, pTo->pDelFile);
-// if (code) goto _err;
-
-// // SDFileSet
-// while (iFrom < nFrom && iTo < nTo) {
-// pDFileSetFrom = (SDFileSet *)taosArrayGet(pFrom->aDFileSet, iFrom);
-// pDFileSetTo = (SDFileSet *)taosArrayGet(pTo->aDFileSet, iTo);
-
-// if (pDFileSetFrom->fid == pDFileSetTo->fid) {
-// code = tsdbApplyDFileSetChange(pFS, pDFileSetFrom, pDFileSetTo);
-// if (code) goto _err;
-
-// iFrom++;
-// iTo++;
-// } else if (pDFileSetFrom->fid < pDFileSetTo->fid) {
-// code = tsdbApplyDFileSetChange(pFS, pDFileSetFrom, NULL);
-// if (code) goto _err;
-
-// iFrom++;
-// } else {
-// iTo++;
-// }
-// }
-
-// while (iFrom < nFrom) {
-// pDFileSetFrom = (SDFileSet *)taosArrayGet(pFrom->aDFileSet, iFrom);
-// code = tsdbApplyDFileSetChange(pFS, pDFileSetFrom, NULL);
-// if (code) goto _err;
-
-// iFrom++;
-// }
-
-// #if 0
-// // do noting
-// while (iTo < nTo) {
-// pDFileSetTo = (SDFileSet *)taosArrayGetP(pTo->aDFileSet, iTo);
-// code = tsdbApplyDFileSetChange(pFS, NULL, pDFileSetTo);
-// if (code) goto _err;
-
-// iTo++;
-// }
-// #endif
-
-// return code;
-
-// _err:
-// tsdbError("vgId:%d, tsdb fs apply disk change failed sicne %s", TD_VID(pFS->pTsdb->pVnode), tstrerror(code));
-// return code;
-// }
-
void tsdbFSDestroy(STsdbFS *pFS) {
if (pFS->pDelFile) {
taosMemoryFree(pFS->pDelFile);
+ pFS->pDelFile = NULL;
}
for (int32_t iSet = 0; iSet < taosArrayGetSize(pFS->aDFileSet); iSet++) {
@@ -264,80 +163,86 @@ void tsdbFSDestroy(STsdbFS *pFS) {
}
taosArrayDestroy(pFS->aDFileSet);
+ pFS->aDFileSet = NULL;
}
static int32_t tsdbScanAndTryFixFS(STsdb *pTsdb) {
int32_t code = 0;
- int64_t size;
- char fname[TSDB_FILENAME_LEN];
+ int32_t lino = 0;
+ int64_t size = 0;
+ char fname[TSDB_FILENAME_LEN] = {0};
// SDelFile
if (pTsdb->fs.pDelFile) {
tsdbDelFileName(pTsdb, pTsdb->fs.pDelFile, fname);
if (taosStatFile(fname, &size, NULL)) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (size != tsdbLogicToFileSize(pTsdb->fs.pDelFile->size, pTsdb->pVnode->config.tsdbPageSize)) {
code = TSDB_CODE_FILE_CORRUPTED;
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
}
// SArray
+ int32_t fid = 0;
for (int32_t iSet = 0; iSet < taosArrayGetSize(pTsdb->fs.aDFileSet); iSet++) {
SDFileSet *pSet = (SDFileSet *)taosArrayGet(pTsdb->fs.aDFileSet, iSet);
+ fid = pSet->fid;
// head =========
tsdbHeadFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pHeadF, fname);
if (taosStatFile(fname, &size, NULL)) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (size != tsdbLogicToFileSize(pSet->pHeadF->size, pTsdb->pVnode->config.tsdbPageSize)) {
code = TSDB_CODE_FILE_CORRUPTED;
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
// data =========
tsdbDataFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pDataF, fname);
if (taosStatFile(fname, &size, NULL)) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (size < tsdbLogicToFileSize(pSet->pDataF->size, pTsdb->pVnode->config.tsdbPageSize)) {
code = TSDB_CODE_FILE_CORRUPTED;
- goto _err;
- } else if (size > tsdbLogicToFileSize(pSet->pDataF->size, pTsdb->pVnode->config.tsdbPageSize)) {
- code = tsdbDFileRollback(pTsdb, pSet, TSDB_DATA_FILE);
- if (code) goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
+ // else if (size > tsdbLogicToFileSize(pSet->pDataF->size, pTsdb->pVnode->config.tsdbPageSize)) {
+ // code = tsdbDFileRollback(pTsdb, pSet, TSDB_DATA_FILE);
+ // TSDB_CHECK_CODE(code, lino, _exit);
+ // }
// sma =============
tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname);
if (taosStatFile(fname, &size, NULL)) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (size < tsdbLogicToFileSize(pSet->pSmaF->size, pTsdb->pVnode->config.tsdbPageSize)) {
code = TSDB_CODE_FILE_CORRUPTED;
- goto _err;
- } else if (size > tsdbLogicToFileSize(pSet->pSmaF->size, pTsdb->pVnode->config.tsdbPageSize)) {
- code = tsdbDFileRollback(pTsdb, pSet, TSDB_SMA_FILE);
- if (code) goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
+ // else if (size > tsdbLogicToFileSize(pSet->pSmaF->size, pTsdb->pVnode->config.tsdbPageSize)) {
+ // code = tsdbDFileRollback(pTsdb, pSet, TSDB_SMA_FILE);
+ // TSDB_CHECK_CODE(code, lino, _exit);
+ // }
// stt ===========
for (int32_t iStt = 0; iStt < pSet->nSttF; iStt++) {
tsdbSttFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSttF[iStt], fname);
if (taosStatFile(fname, &size, NULL)) {
code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (size != tsdbLogicToFileSize(pSet->aSttF[iStt]->size, pTsdb->pVnode->config.tsdbPageSize)) {
code = TSDB_CODE_FILE_CORRUPTED;
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
}
}
@@ -346,10 +251,11 @@ static int32_t tsdbScanAndTryFixFS(STsdb *pTsdb) {
// remove those invalid files (todo)
}
- return code;
-
-_err:
- tsdbError("vgId:%d, tsdb scan and try fix fs failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s, fid:%d", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code),
+ fid);
+ }
return code;
}
@@ -363,141 +269,531 @@ int32_t tDFileSetCmprFn(const void *p1, const void *p2) {
return 0;
}
-static int32_t tsdbRecoverFS(STsdb *pTsdb, uint8_t *pData, int64_t nData) {
+static void tsdbGetCurrentFName(STsdb *pTsdb, char *current, char *current_t) {
+ SVnode *pVnode = pTsdb->pVnode;
+ if (pVnode->pTfs) {
+ if (current) {
+ snprintf(current, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP,
+ pTsdb->path, TD_DIRSEP);
+ }
+ if (current_t) {
+ snprintf(current_t, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT.t", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP,
+ pTsdb->path, TD_DIRSEP);
+ }
+ } else {
+ if (current) {
+ snprintf(current, TSDB_FILENAME_LEN - 1, "%s%sCURRENT", pTsdb->path, TD_DIRSEP);
+ }
+ if (current_t) {
+ snprintf(current_t, TSDB_FILENAME_LEN - 1, "%s%sCURRENT.t", pTsdb->path, TD_DIRSEP);
+ }
+ }
+}
+
+static int32_t tsdbLoadFSFromFile(const char *fname, STsdbFS *pFS) {
int32_t code = 0;
- int8_t hasDel;
- uint32_t nSet;
- int32_t n = 0;
+ int32_t lino = 0;
+ uint8_t *pData = NULL;
- // version
- n += tGetI8(pData + n, NULL);
+ // load binary
+ TdFilePtr pFD = taosOpenFile(fname, TD_FILE_READ);
+ if (pFD == NULL) {
+ code = TAOS_SYSTEM_ERROR(errno);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
- // SDelFile
- n += tGetI8(pData + n, &hasDel);
- if (hasDel) {
- pTsdb->fs.pDelFile = (SDelFile *)taosMemoryMalloc(sizeof(SDelFile));
- if (pTsdb->fs.pDelFile == NULL) {
+ int64_t size;
+ if (taosFStatFile(pFD, &size, NULL) < 0) {
+ code = TAOS_SYSTEM_ERROR(errno);
+ taosCloseFile(&pFD);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ pData = taosMemoryMalloc(size);
+ if (pData == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ taosCloseFile(&pFD);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ if (taosReadFile(pFD, pData, size) < 0) {
+ code = TAOS_SYSTEM_ERROR(errno);
+ taosCloseFile(&pFD);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ if (!taosCheckChecksumWhole(pData, size)) {
+ code = TSDB_CODE_FILE_CORRUPTED;
+ taosCloseFile(&pFD);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ taosCloseFile(&pFD);
+
+ // decode binary
+ code = tsdbBinaryToFS(pData, size, pFS);
+ TSDB_CHECK_CODE(code, lino, _exit);
+
+_exit:
+ if (pData) taosMemoryFree(pData);
+ if (code) {
+ tsdbError("%s failed at line %d since %s, fname:%s", __func__, lino, tstrerror(code), fname);
+ }
+ return code;
+}
+
+static int32_t tsdbRemoveFileSet(STsdb *pTsdb, SDFileSet *pSet) {
+ int32_t code = 0;
+ char fname[TSDB_FILENAME_LEN] = {0};
+
+ int32_t nRef = atomic_sub_fetch_32(&pSet->pHeadF->nRef, 1);
+ if (nRef == 0) {
+ tsdbHeadFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pHeadF, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSet->pHeadF);
+ }
+
+ nRef = atomic_sub_fetch_32(&pSet->pDataF->nRef, 1);
+ if (nRef == 0) {
+ tsdbDataFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pDataF, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSet->pDataF);
+ }
+
+ nRef = atomic_sub_fetch_32(&pSet->pSmaF->nRef, 1);
+ if (nRef == 0) {
+ tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSet->pSmaF);
+ }
+
+ for (int8_t iStt = 0; iStt < pSet->nSttF; iStt++) {
+ nRef = atomic_sub_fetch_32(&pSet->aSttF[iStt]->nRef, 1);
+ if (nRef == 0) {
+ tsdbSttFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSttF[iStt], fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSet->aSttF[iStt]);
+ }
+ }
+
+_exit:
+ return code;
+}
+
+static int32_t tsdbNewFileSet(STsdb *pTsdb, SDFileSet *pSetTo, SDFileSet *pSetFrom) {
+ int32_t code = 0;
+ int32_t lino = 0;
+
+ *pSetTo = (SDFileSet){.diskId = pSetFrom->diskId, .fid = pSetFrom->fid, .nSttF = 0};
+
+ // head
+ pSetTo->pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile));
+ if (pSetTo->pHeadF == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetTo->pHeadF = *pSetFrom->pHeadF;
+ pSetTo->pHeadF->nRef = 1;
+
+ // data
+ pSetTo->pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
+ if (pSetTo->pDataF == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetTo->pDataF = *pSetFrom->pDataF;
+ pSetTo->pDataF->nRef = 1;
+
+ // sma
+ pSetTo->pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
+ if (pSetTo->pSmaF == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetTo->pSmaF = *pSetFrom->pSmaF;
+ pSetTo->pSmaF->nRef = 1;
+
+ // stt
+ for (int32_t iStt = 0; iStt < pSetFrom->nSttF; iStt++) {
+ pSetTo->aSttF[iStt] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
+ if (pSetTo->aSttF[iStt] == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ pSetTo->nSttF++;
+ *pSetTo->aSttF[iStt] = *pSetFrom->aSttF[iStt];
+ pSetTo->aSttF[iStt]->nRef = 1;
+ }
+
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ }
+ return code;
+}
+
+static int32_t tsdbMergeFileSet(STsdb *pTsdb, SDFileSet *pSetOld, SDFileSet *pSetNew) {
+ int32_t code = 0;
+ int32_t lino = 0;
+ int32_t nRef = 0;
+ bool sameDisk = ((pSetOld->diskId.level == pSetNew->diskId.level) && (pSetOld->diskId.id == pSetNew->diskId.id));
+ char fname[TSDB_FILENAME_LEN] = {0};
+
+ // head
+ SHeadFile *pHeadF = pSetOld->pHeadF;
+ if ((!sameDisk) || (pHeadF->commitID != pSetNew->pHeadF->commitID)) {
+ pSetOld->pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile));
+ if (pSetOld->pHeadF == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetOld->pHeadF = *pSetNew->pHeadF;
+ pSetOld->pHeadF->nRef = 1;
+
+ nRef = atomic_sub_fetch_32(&pHeadF->nRef, 1);
+ if (nRef == 0) {
+ tsdbHeadFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pHeadF, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pHeadF);
+ }
+ } else {
+ nRef = pHeadF->nRef;
+ *pHeadF = *pSetNew->pHeadF;
+ pHeadF->nRef = nRef;
+ }
+
+ // data
+ SDataFile *pDataF = pSetOld->pDataF;
+ if ((!sameDisk) || (pDataF->commitID != pSetNew->pDataF->commitID)) {
+ pSetOld->pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
+ if (pSetOld->pDataF == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetOld->pDataF = *pSetNew->pDataF;
+ pSetOld->pDataF->nRef = 1;
+
+ nRef = atomic_sub_fetch_32(&pDataF->nRef, 1);
+ if (nRef == 0) {
+ tsdbDataFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pDataF, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pDataF);
+ }
+ } else {
+ nRef = pDataF->nRef;
+ *pDataF = *pSetNew->pDataF;
+ pDataF->nRef = nRef;
+ }
+
+ // sma
+ SSmaFile *pSmaF = pSetOld->pSmaF;
+ if ((!sameDisk) || (pSmaF->commitID != pSetNew->pSmaF->commitID)) {
+ pSetOld->pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
+ if (pSetOld->pSmaF == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
+ *pSetOld->pSmaF = *pSetNew->pSmaF;
+ pSetOld->pSmaF->nRef = 1;
+
+ nRef = atomic_sub_fetch_32(&pSmaF->nRef, 1);
+ if (nRef == 0) {
+ tsdbSmaFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSmaF, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSmaF);
+ }
+ } else {
+ nRef = pSmaF->nRef;
+ *pSmaF = *pSetNew->pSmaF;
+ pSmaF->nRef = nRef;
+ }
+
+ // stt
+ if (sameDisk) {
+ if (pSetNew->nSttF > pSetOld->nSttF) {
+ ASSERT(pSetNew->nSttF == pSetOld->nSttF + 1);
+ pSetOld->aSttF[pSetOld->nSttF] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
+ if (pSetOld->aSttF[pSetOld->nSttF] == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetOld->aSttF[pSetOld->nSttF] = *pSetNew->aSttF[pSetOld->nSttF];
+ pSetOld->aSttF[pSetOld->nSttF]->nRef = 1;
+ pSetOld->nSttF++;
+ } else if (pSetNew->nSttF < pSetOld->nSttF) {
+ ASSERT(pSetNew->nSttF == 1);
+ for (int32_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
+ SSttFile *pSttFile = pSetOld->aSttF[iStt];
+ nRef = atomic_sub_fetch_32(&pSttFile->nRef, 1);
+ if (nRef == 0) {
+ tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSttFile, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSttFile);
+ }
+ pSetOld->aSttF[iStt] = NULL;
+ }
+
+ pSetOld->nSttF = 1;
+ pSetOld->aSttF[0] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
+ if (pSetOld->aSttF[0] == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetOld->aSttF[0] = *pSetNew->aSttF[0];
+ pSetOld->aSttF[0]->nRef = 1;
+ } else {
+ for (int32_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
+ if (pSetOld->aSttF[iStt]->commitID != pSetNew->aSttF[iStt]->commitID) {
+ SSttFile *pSttFile = pSetOld->aSttF[iStt];
+ nRef = atomic_sub_fetch_32(&pSttFile->nRef, 1);
+ if (nRef == 0) {
+ tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSttFile, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSttFile);
+ }
+
+ pSetOld->aSttF[iStt] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
+ if (pSetOld->aSttF[iStt] == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+ *pSetOld->aSttF[iStt] = *pSetNew->aSttF[iStt];
+ pSetOld->aSttF[iStt]->nRef = 1;
+ } else {
+ ASSERT(pSetOld->aSttF[iStt]->size == pSetOld->aSttF[iStt]->size);
+ ASSERT(pSetOld->aSttF[iStt]->offset == pSetOld->aSttF[iStt]->offset);
+ }
+ }
+ }
+ } else {
+ for (int32_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
+ SSttFile *pSttFile = pSetOld->aSttF[iStt];
+ nRef = atomic_sub_fetch_32(&pSttFile->nRef, 1);
+ if (nRef == 0) {
+ tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSttFile, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pSttFile);
+ }
+ }
+
+ pSetOld->nSttF = 0;
+ for (int32_t iStt = 0; iStt < pSetNew->nSttF; iStt++) {
+ pSetOld->aSttF[iStt] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
+ if (pSetOld->aSttF[iStt] == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ *pSetOld->aSttF[iStt] = *pSetNew->aSttF[iStt];
+ pSetOld->aSttF[iStt]->nRef = 1;
+
+ pSetOld->nSttF++;
+ }
+ }
+
+ if (!sameDisk) {
+ pSetOld->diskId = pSetNew->diskId;
+ }
+
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ }
+ return code;
+}
+
+static int32_t tsdbFSApplyChange(STsdb *pTsdb, STsdbFS *pFS) {
+ int32_t code = 0;
+ int32_t lino = 0;
+
+ int32_t nRef = 0;
+ char fname[TSDB_FILENAME_LEN] = {0};
+
+ // SDelFile
+ if (pFS->pDelFile) {
+ SDelFile *pDelFile = pTsdb->fs.pDelFile;
+
+ if (pDelFile == NULL || (pDelFile->commitID != pFS->pDelFile->commitID)) {
+ pTsdb->fs.pDelFile = (SDelFile *)taosMemoryMalloc(sizeof(SDelFile));
+ if (pTsdb->fs.pDelFile == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ *pTsdb->fs.pDelFile = *pFS->pDelFile;
+ pTsdb->fs.pDelFile->nRef = 1;
+
+ if (pDelFile) {
+ nRef = atomic_sub_fetch_32(&pDelFile->nRef, 1);
+ if (nRef == 0) {
+ tsdbDelFileName(pTsdb, pDelFile, fname);
+ (void)taosRemoveFile(fname);
+ taosMemoryFree(pDelFile);
+ }
+ }
+ }
+ } else {
+ ASSERT(pTsdb->fs.pDelFile == NULL);
+ }
+
+ // aDFileSet
+ int32_t iOld = 0;
+ int32_t iNew = 0;
+ while (true) {
+ int32_t nOld = taosArrayGetSize(pTsdb->fs.aDFileSet);
+ int32_t nNew = taosArrayGetSize(pFS->aDFileSet);
+ SDFileSet fSet = {0};
+ int8_t sameDisk = 0;
+
+ if (iOld >= nOld && iNew >= nNew) break;
+
+ SDFileSet *pSetOld = (iOld < nOld) ? taosArrayGet(pTsdb->fs.aDFileSet, iOld) : NULL;
+ SDFileSet *pSetNew = (iNew < nNew) ? taosArrayGet(pFS->aDFileSet, iNew) : NULL;
+
+ if (pSetOld && pSetNew) {
+ if (pSetOld->fid == pSetNew->fid) {
+ code = tsdbMergeFileSet(pTsdb, pSetOld, pSetNew);
+ TSDB_CHECK_CODE(code, lino, _exit);
- pTsdb->fs.pDelFile->nRef = 1;
- n += tGetDelFile(pData + n, pTsdb->fs.pDelFile);
- } else {
- pTsdb->fs.pDelFile = NULL;
- }
+ iOld++;
+ iNew++;
+ } else if (pSetOld->fid < pSetNew->fid) {
+ code = tsdbRemoveFileSet(pTsdb, pSetOld);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ taosArrayRemove(pTsdb->fs.aDFileSet, iOld);
+ } else {
+ code = tsdbNewFileSet(pTsdb, &fSet, pSetNew);
+ TSDB_CHECK_CODE(code, lino, _exit)
- // SArray
- taosArrayClear(pTsdb->fs.aDFileSet);
- n += tGetU32v(pData + n, &nSet);
- for (uint32_t iSet = 0; iSet < nSet; iSet++) {
- SDFileSet fSet = {0};
+ if (taosArrayInsert(pTsdb->fs.aDFileSet, iOld, &fSet) == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
- int32_t nt = tGetDFileSet(pData + n, &fSet);
- if (nt < 0) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
+ iOld++;
+ iNew++;
+ }
+ } else if (pSetOld) {
+ code = tsdbRemoveFileSet(pTsdb, pSetOld);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ taosArrayRemove(pTsdb->fs.aDFileSet, iOld);
+ } else {
+ code = tsdbNewFileSet(pTsdb, &fSet, pSetNew);
+ TSDB_CHECK_CODE(code, lino, _exit)
- n += nt;
+ if (taosArrayInsert(pTsdb->fs.aDFileSet, iOld, &fSet) == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
- if (taosArrayPush(pTsdb->fs.aDFileSet, &fSet) == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
+ iOld++;
+ iNew++;
}
}
- ASSERT(n + sizeof(TSCKSUM) == nData);
- return code;
-
-_err:
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ }
return code;
}
// EXPOSED APIS ====================================================================================
-int32_t tsdbFSOpen(STsdb *pTsdb) {
+int32_t tsdbFSCommit(STsdb *pTsdb) {
int32_t code = 0;
- SVnode *pVnode = pTsdb->pVnode;
+ int32_t lino = 0;
+ STsdbFS fs = {0};
- // open handle
- pTsdb->fs.pDelFile = NULL;
- pTsdb->fs.aDFileSet = taosArrayInit(0, sizeof(SDFileSet));
- if (pTsdb->fs.aDFileSet == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
+ char current[TSDB_FILENAME_LEN] = {0};
+ char current_t[TSDB_FILENAME_LEN] = {0};
+ tsdbGetCurrentFName(pTsdb, current, current_t);
- // load fs or keep empty
- char fname[TSDB_FILENAME_LEN];
+ if (!taosCheckExistFile(current_t)) goto _exit;
- if (pVnode->pTfs) {
- snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP,
- pTsdb->path, TD_DIRSEP);
- } else {
- snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%sCURRENT", pTsdb->path, TD_DIRSEP);
+ // rename the file
+ if (taosRenameFile(current_t, current) < 0) {
+ code = TAOS_SYSTEM_ERROR(errno);
+ TSDB_CHECK_CODE(code, lino, _exit);
}
- if (!taosCheckExistFile(fname)) {
- // empty one
- code = tsdbGnrtCurrent(pTsdb, &pTsdb->fs, fname);
- if (code) goto _err;
- } else {
- // read
- TdFilePtr pFD = taosOpenFile(fname, TD_FILE_READ);
- if (pFD == NULL) {
- code = TAOS_SYSTEM_ERROR(errno);
- goto _err;
- }
+ // Load the new FS
+ code = tsdbFSCreate(&fs);
+ TSDB_CHECK_CODE(code, lino, _exit);
- int64_t size;
- if (taosFStatFile(pFD, &size, NULL) < 0) {
- code = TAOS_SYSTEM_ERROR(errno);
- taosCloseFile(&pFD);
- goto _err;
- }
+ code = tsdbLoadFSFromFile(current, &fs);
+ TSDB_CHECK_CODE(code, lino, _exit);
- uint8_t *pData = taosMemoryMalloc(size);
- if (pData == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- taosCloseFile(&pFD);
- goto _err;
- }
+ // apply file change
+ code = tsdbFSApplyChange(pTsdb, &fs);
+ TSDB_CHECK_CODE(code, lino, _exit);
- int64_t n = taosReadFile(pFD, pData, size);
- if (n < 0) {
- code = TAOS_SYSTEM_ERROR(errno);
- taosMemoryFree(pData);
- taosCloseFile(&pFD);
- goto _err;
- }
+_exit:
+ tsdbFSDestroy(&fs);
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ }
+ return code;
+}
- if (!taosCheckChecksumWhole(pData, size)) {
- code = TSDB_CODE_FILE_CORRUPTED;
- taosMemoryFree(pData);
- taosCloseFile(&pFD);
- goto _err;
- }
+int32_t tsdbFSRollback(STsdb *pTsdb) {
+ int32_t code = 0;
+ int32_t lino = 0;
- taosCloseFile(&pFD);
+ char current_t[TSDB_FILENAME_LEN] = {0};
+ tsdbGetCurrentFName(pTsdb, NULL, current_t);
+ (void)taosRemoveFile(current_t);
+
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(errno));
+ }
+ return code;
+}
- // recover fs
- code = tsdbRecoverFS(pTsdb, pData, size);
- if (code) {
- taosMemoryFree(pData);
- goto _err;
+int32_t tsdbFSOpen(STsdb *pTsdb, int8_t rollback) {
+ int32_t code = 0;
+ int32_t lino = 0;
+ SVnode *pVnode = pTsdb->pVnode;
+
+ // open handle
+ code = tsdbFSCreate(&pTsdb->fs);
+ TSDB_CHECK_CODE(code, lino, _exit);
+
+ // open impl
+ char current[TSDB_FILENAME_LEN] = {0};
+ char current_t[TSDB_FILENAME_LEN] = {0};
+ tsdbGetCurrentFName(pTsdb, current, current_t);
+
+ if (taosCheckExistFile(current)) {
+ code = tsdbLoadFSFromFile(current, &pTsdb->fs);
+ TSDB_CHECK_CODE(code, lino, _exit);
+
+ if (taosCheckExistFile(current_t)) {
+ if (rollback) {
+ code = tsdbFSRollback(pTsdb);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ } else {
+ code = tsdbFSCommit(pTsdb);
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
}
+ } else {
+ // empty one
+ code = tsdbSaveFSToFile(&pTsdb->fs, current);
+ TSDB_CHECK_CODE(code, lino, _exit);
- taosMemoryFree(pData);
+ ASSERT(!rollback);
}
// scan and fix FS
code = tsdbScanAndTryFixFS(pTsdb);
- if (code) goto _err;
+ TSDB_CHECK_CODE(code, lino, _exit);
- return code;
-
-_err:
- tsdbError("vgId:%d, tsdb fs open failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
+_exit:
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ }
return code;
}
@@ -538,19 +834,24 @@ int32_t tsdbFSClose(STsdb *pTsdb) {
int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
int32_t code = 0;
+ int32_t lino = 0;
pFS->pDelFile = NULL;
- pFS->aDFileSet = taosArrayInit(taosArrayGetSize(pTsdb->fs.aDFileSet), sizeof(SDFileSet));
- if (pFS->aDFileSet == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ if (pFS->aDFileSet) {
+ taosArrayClear(pFS->aDFileSet);
+ } else {
+ pFS->aDFileSet = taosArrayInit(taosArrayGetSize(pTsdb->fs.aDFileSet), sizeof(SDFileSet));
+ if (pFS->aDFileSet == NULL) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
}
if (pTsdb->fs.pDelFile) {
pFS->pDelFile = (SDelFile *)taosMemoryMalloc(sizeof(SDelFile));
if (pFS->pDelFile == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
*pFS->pDelFile = *pTsdb->fs.pDelFile;
@@ -564,7 +865,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
fSet.pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile));
if (fSet.pHeadF == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
*fSet.pHeadF = *pSet->pHeadF;
@@ -572,7 +873,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
fSet.pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
if (fSet.pDataF == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
*fSet.pDataF = *pSet->pDataF;
@@ -580,7 +881,7 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
if (fSet.pSmaF == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
*fSet.pSmaF = *pSet->pSmaF;
@@ -589,26 +890,21 @@ int32_t tsdbFSCopy(STsdb *pTsdb, STsdbFS *pFS) {
fSet.aSttF[fSet.nSttF] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
if (fSet.aSttF[fSet.nSttF] == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
*fSet.aSttF[fSet.nSttF] = *pSet->aSttF[fSet.nSttF];
}
if (taosArrayPush(pFS->aDFileSet, &fSet) == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
}
_exit:
- return code;
-}
-
-int32_t tsdbFSRollback(STsdbFS *pFS) {
- int32_t code = 0;
-
- ASSERT(0);
-
+ if (code) {
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
+ }
return code;
}
@@ -714,336 +1010,21 @@ _exit:
return code;
}
-int32_t tsdbFSCommit1(STsdb *pTsdb, STsdbFS *pFSNew) {
+int32_t tsdbFSPrepareCommit(STsdb *pTsdb, STsdbFS *pFSNew) {
int32_t code = 0;
+ int32_t lino = 0;
char tfname[TSDB_FILENAME_LEN];
- char fname[TSDB_FILENAME_LEN];
- snprintf(tfname, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT.t", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP,
- pTsdb->path, TD_DIRSEP);
- snprintf(fname, TSDB_FILENAME_LEN - 1, "%s%s%s%sCURRENT", tfsGetPrimaryPath(pTsdb->pVnode->pTfs), TD_DIRSEP,
- pTsdb->path, TD_DIRSEP);
+ tsdbGetCurrentFName(pTsdb, NULL, tfname);
// gnrt CURRENT.t
- code = tsdbGnrtCurrent(pTsdb, pFSNew, tfname);
- if (code) goto _err;
+ code = tsdbSaveFSToFile(pFSNew, tfname);
+ TSDB_CHECK_CODE(code, lino, _exit);
- // rename
- code = taosRenameFile(tfname, fname);
+_exit:
if (code) {
- code = TAOS_SYSTEM_ERROR(code);
- goto _err;
- }
-
- return code;
-
-_err:
- tsdbError("vgId:%d, tsdb fs commit phase 1 failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
- return code;
-}
-
-int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) {
- int32_t code = 0;
- int32_t nRef;
- char fname[TSDB_FILENAME_LEN];
-
- // del
- if (pFSNew->pDelFile) {
- SDelFile *pDelFile = pTsdb->fs.pDelFile;
-
- if (pDelFile == NULL || (pDelFile->commitID != pFSNew->pDelFile->commitID)) {
- pTsdb->fs.pDelFile = (SDelFile *)taosMemoryMalloc(sizeof(SDelFile));
- if (pTsdb->fs.pDelFile == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
-
- *pTsdb->fs.pDelFile = *pFSNew->pDelFile;
- pTsdb->fs.pDelFile->nRef = 1;
-
- if (pDelFile) {
- nRef = atomic_sub_fetch_32(&pDelFile->nRef, 1);
- if (nRef == 0) {
- tsdbDelFileName(pTsdb, pDelFile, fname);
- taosRemoveFile(fname);
- taosMemoryFree(pDelFile);
- }
- }
- }
- } else {
- ASSERT(pTsdb->fs.pDelFile == NULL);
- }
-
- // data
- int32_t iOld = 0;
- int32_t iNew = 0;
- while (true) {
- int32_t nOld = taosArrayGetSize(pTsdb->fs.aDFileSet);
- int32_t nNew = taosArrayGetSize(pFSNew->aDFileSet);
- SDFileSet fSet;
- int8_t sameDisk;
-
- if (iOld >= nOld && iNew >= nNew) break;
-
- SDFileSet *pSetOld = (iOld < nOld) ? taosArrayGet(pTsdb->fs.aDFileSet, iOld) : NULL;
- SDFileSet *pSetNew = (iNew < nNew) ? taosArrayGet(pFSNew->aDFileSet, iNew) : NULL;
-
- if (pSetOld && pSetNew) {
- if (pSetOld->fid == pSetNew->fid) {
- goto _merge_old_and_new;
- } else if (pSetOld->fid < pSetNew->fid) {
- goto _remove_old;
- } else {
- goto _add_new;
- }
- } else if (pSetOld) {
- goto _remove_old;
- } else {
- goto _add_new;
- }
-
- _merge_old_and_new:
- sameDisk = ((pSetOld->diskId.level == pSetNew->diskId.level) && (pSetOld->diskId.id == pSetNew->diskId.id));
-
- // head
- fSet.pHeadF = pSetOld->pHeadF;
- if ((!sameDisk) || (pSetOld->pHeadF->commitID != pSetNew->pHeadF->commitID)) {
- pSetOld->pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile));
- if (pSetOld->pHeadF == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->pHeadF = *pSetNew->pHeadF;
- pSetOld->pHeadF->nRef = 1;
-
- nRef = atomic_sub_fetch_32(&fSet.pHeadF->nRef, 1);
- if (nRef == 0) {
- tsdbHeadFileName(pTsdb, pSetOld->diskId, pSetOld->fid, fSet.pHeadF, fname);
- (void)taosRemoveFile(fname);
- taosMemoryFree(fSet.pHeadF);
- }
- } else {
- ASSERT(fSet.pHeadF->size == pSetNew->pHeadF->size);
- ASSERT(fSet.pHeadF->offset == pSetNew->pHeadF->offset);
- }
-
- // data
- fSet.pDataF = pSetOld->pDataF;
- if ((!sameDisk) || (pSetOld->pDataF->commitID != pSetNew->pDataF->commitID)) {
- pSetOld->pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
- if (pSetOld->pDataF == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->pDataF = *pSetNew->pDataF;
- pSetOld->pDataF->nRef = 1;
-
- nRef = atomic_sub_fetch_32(&fSet.pDataF->nRef, 1);
- if (nRef == 0) {
- tsdbDataFileName(pTsdb, pSetOld->diskId, pSetOld->fid, fSet.pDataF, fname);
- taosRemoveFile(fname);
- taosMemoryFree(fSet.pDataF);
- }
- } else {
- ASSERT(pSetOld->pDataF->size <= pSetNew->pDataF->size);
- pSetOld->pDataF->size = pSetNew->pDataF->size;
- }
-
- // sma
- fSet.pSmaF = pSetOld->pSmaF;
- if ((!sameDisk) || (pSetOld->pSmaF->commitID != pSetNew->pSmaF->commitID)) {
- pSetOld->pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
- if (pSetOld->pSmaF == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->pSmaF = *pSetNew->pSmaF;
- pSetOld->pSmaF->nRef = 1;
-
- nRef = atomic_sub_fetch_32(&fSet.pSmaF->nRef, 1);
- if (nRef == 0) {
- tsdbSmaFileName(pTsdb, pSetOld->diskId, pSetOld->fid, fSet.pSmaF, fname);
- (void)taosRemoveFile(fname);
- taosMemoryFree(fSet.pSmaF);
- }
- } else {
- ASSERT(pSetOld->pSmaF->size <= pSetNew->pSmaF->size);
- pSetOld->pSmaF->size = pSetNew->pSmaF->size;
- }
-
- // stt
- if (sameDisk) {
- if (pSetNew->nSttF > pSetOld->nSttF) {
- ASSERT(pSetNew->nSttF == pSetOld->nSttF + 1);
- pSetOld->aSttF[pSetOld->nSttF] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
- if (pSetOld->aSttF[pSetOld->nSttF] == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->aSttF[pSetOld->nSttF] = *pSetNew->aSttF[pSetOld->nSttF];
- pSetOld->aSttF[pSetOld->nSttF]->nRef = 1;
- pSetOld->nSttF++;
- } else if (pSetNew->nSttF < pSetOld->nSttF) {
- ASSERT(pSetNew->nSttF == 1);
- for (int32_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
- SSttFile *pSttFile = pSetOld->aSttF[iStt];
- nRef = atomic_sub_fetch_32(&pSttFile->nRef, 1);
- if (nRef == 0) {
- tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSttFile, fname);
- taosRemoveFile(fname);
- taosMemoryFree(pSttFile);
- }
- pSetOld->aSttF[iStt] = NULL;
- }
-
- pSetOld->nSttF = 1;
- pSetOld->aSttF[0] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
- if (pSetOld->aSttF[0] == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->aSttF[0] = *pSetNew->aSttF[0];
- pSetOld->aSttF[0]->nRef = 1;
- } else {
- for (int32_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
- if (pSetOld->aSttF[iStt]->commitID != pSetNew->aSttF[iStt]->commitID) {
- SSttFile *pSttFile = pSetOld->aSttF[iStt];
- nRef = atomic_sub_fetch_32(&pSttFile->nRef, 1);
- if (nRef == 0) {
- tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSttFile, fname);
- taosRemoveFile(fname);
- taosMemoryFree(pSttFile);
- }
-
- pSetOld->aSttF[iStt] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
- if (pSetOld->aSttF[iStt] == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->aSttF[iStt] = *pSetNew->aSttF[iStt];
- pSetOld->aSttF[iStt]->nRef = 1;
- } else {
- ASSERT(pSetOld->aSttF[iStt]->size == pSetOld->aSttF[iStt]->size);
- ASSERT(pSetOld->aSttF[iStt]->offset == pSetOld->aSttF[iStt]->offset);
- }
- }
- }
- } else {
- ASSERT(pSetOld->nSttF == pSetNew->nSttF);
- for (int32_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
- SSttFile *pSttFile = pSetOld->aSttF[iStt];
- nRef = atomic_sub_fetch_32(&pSttFile->nRef, 1);
- if (nRef == 0) {
- tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSttFile, fname);
- taosRemoveFile(fname);
- taosMemoryFree(pSttFile);
- }
-
- pSetOld->aSttF[iStt] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
- if (pSetOld->aSttF[iStt] == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *pSetOld->aSttF[iStt] = *pSetNew->aSttF[iStt];
- pSetOld->aSttF[iStt]->nRef = 1;
- }
- }
-
- if (!sameDisk) {
- pSetOld->diskId = pSetNew->diskId;
- }
-
- iOld++;
- iNew++;
- continue;
-
- _remove_old:
- nRef = atomic_sub_fetch_32(&pSetOld->pHeadF->nRef, 1);
- if (nRef == 0) {
- tsdbHeadFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pHeadF, fname);
- (void)taosRemoveFile(fname);
- taosMemoryFree(pSetOld->pHeadF);
- }
-
- nRef = atomic_sub_fetch_32(&pSetOld->pDataF->nRef, 1);
- if (nRef == 0) {
- tsdbDataFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pDataF, fname);
- taosRemoveFile(fname);
- taosMemoryFree(pSetOld->pDataF);
- }
-
- nRef = atomic_sub_fetch_32(&pSetOld->pSmaF->nRef, 1);
- if (nRef == 0) {
- tsdbSmaFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pSmaF, fname);
- taosRemoveFile(fname);
- taosMemoryFree(pSetOld->pSmaF);
- }
-
- for (int8_t iStt = 0; iStt < pSetOld->nSttF; iStt++) {
- nRef = atomic_sub_fetch_32(&pSetOld->aSttF[iStt]->nRef, 1);
- if (nRef == 0) {
- tsdbSttFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->aSttF[iStt], fname);
- taosRemoveFile(fname);
- taosMemoryFree(pSetOld->aSttF[iStt]);
- }
- }
-
- taosArrayRemove(pTsdb->fs.aDFileSet, iOld);
- continue;
-
- _add_new:
- fSet = (SDFileSet){.diskId = pSetNew->diskId, .fid = pSetNew->fid, .nSttF = 1};
-
- // head
- fSet.pHeadF = (SHeadFile *)taosMemoryMalloc(sizeof(SHeadFile));
- if (fSet.pHeadF == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *fSet.pHeadF = *pSetNew->pHeadF;
- fSet.pHeadF->nRef = 1;
-
- // data
- fSet.pDataF = (SDataFile *)taosMemoryMalloc(sizeof(SDataFile));
- if (fSet.pDataF == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *fSet.pDataF = *pSetNew->pDataF;
- fSet.pDataF->nRef = 1;
-
- // sma
- fSet.pSmaF = (SSmaFile *)taosMemoryMalloc(sizeof(SSmaFile));
- if (fSet.pSmaF == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *fSet.pSmaF = *pSetNew->pSmaF;
- fSet.pSmaF->nRef = 1;
-
- // stt
- ASSERT(pSetNew->nSttF == 1);
- fSet.aSttF[0] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
- if (fSet.aSttF[0] == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- *fSet.aSttF[0] = *pSetNew->aSttF[0];
- fSet.aSttF[0]->nRef = 1;
-
- if (taosArrayInsert(pTsdb->fs.aDFileSet, iOld, &fSet) == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
- iOld++;
- iNew++;
- continue;
+ tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
}
-
- return code;
-
-_err:
- tsdbError("vgId:%d, tsdb fs commit phase 2 failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
return code;
}
@@ -1123,7 +1104,7 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) {
ASSERT(nRef >= 0);
if (nRef == 0) {
tsdbDataFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pDataF, fname);
- taosRemoveFile(fname);
+ (void)taosRemoveFile(fname);
taosMemoryFree(pSet->pDataF);
}
@@ -1132,7 +1113,7 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) {
ASSERT(nRef >= 0);
if (nRef == 0) {
tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname);
- taosRemoveFile(fname);
+ (void)taosRemoveFile(fname);
taosMemoryFree(pSet->pSmaF);
}
@@ -1142,7 +1123,7 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) {
ASSERT(nRef >= 0);
if (nRef == 0) {
tsdbSttFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSttF[iStt], fname);
- taosRemoveFile(fname);
+ (void)taosRemoveFile(fname);
taosMemoryFree(pSet->aSttF[iStt]);
/* code */
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbOpen.c b/source/dnode/vnode/src/tsdb/tsdbOpen.c
index 51978234901a6a4e26f78d0c7d867818d64fa7eb..efc74b68ba31db362441002589998d6ed04cfde9 100644
--- a/source/dnode/vnode/src/tsdb/tsdbOpen.c
+++ b/source/dnode/vnode/src/tsdb/tsdbOpen.c
@@ -33,7 +33,7 @@ int32_t tsdbSetKeepCfg(STsdb *pTsdb, STsdbCfg *pCfg) {
* @param dir
* @return int
*/
-int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKeepCfg) {
+int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKeepCfg, int8_t rollback) {
STsdb *pTsdb = NULL;
int slen = 0;
@@ -66,7 +66,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
}
// open tsdb
- if (tsdbFSOpen(pTsdb) < 0) {
+ if (tsdbFSOpen(pTsdb, rollback) < 0) {
goto _err;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c
index 3c727ee63ac04b07bc3d336e2e923728c5caf57e..11cae00358392d6d519c8da3ec078708e168ea7d 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead.c
@@ -340,7 +340,7 @@ static int32_t initFilesetIterator(SFilesetIter* pIter, SArray* aDFileSet, STsdb
pIter->pLastBlockReader = taosMemoryCalloc(1, sizeof(struct SLastBlockReader));
if (pIter->pLastBlockReader == NULL) {
int32_t code = TSDB_CODE_OUT_OF_MEMORY;
- tsdbError("failed to prepare the last block iterator, code:%s %s", tstrerror(code), pReader->idStr);
+ tsdbError("failed to prepare the last block iterator, since:%s %s", tstrerror(code), pReader->idStr);
return code;
}
}
@@ -645,11 +645,11 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockN
int32_t total = pBlockNum->numOfLastFiles + pBlockNum->numOfBlocks;
double el = (taosGetTimestampUs() - st) / 1000.0;
- tsdbDebug("load block of %" PRIzu
- " tables completed, blocks:%d in %d tables, last-files:%d, block-info-size:%.2f Kb, elapsed "
- "time:%.2f ms %s",
- numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastFiles, sizeInDisk / 1000.0, el,
- pReader->idStr);
+ tsdbDebug(
+ "load block of %ld tables completed, blocks:%d in %d tables, last-files:%d, block-info-size:%.2f Kb, elapsed "
+ "time:%.2f ms %s",
+ numOfTables, pBlockNum->numOfBlocks, numOfQTable, pBlockNum->numOfLastFiles, sizeInDisk / 1000.0, el,
+ pReader->idStr);
pReader->cost.numOfBlocks += total;
pReader->cost.headFileLoadTime += el;
@@ -2569,7 +2569,7 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
}
if (pScanInfo == NULL) {
- tsdbError("failed to get table, uid:"PRIu64 ", %s", pBlockInfo->uid, pReader->idStr);
+ tsdbError("failed to get table, uid:%" PRIu64 ", %s", pBlockInfo->uid, pReader->idStr);
code = TSDB_CODE_INVALID_PARA;
return code;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
index 84b3afe72c70147a28bdb55446c806a1f1ebd70e..71024408c190a51ddbdb7ae7f4f16df64eb0e5dc 100644
--- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
+++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
@@ -1334,8 +1334,8 @@ int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb
_exit:
if (code) {
if (pDelFWriter) {
- taosMemoryFree(pDelFWriter);
tsdbCloseFile(&pDelFWriter->pWriteH);
+ taosMemoryFree(pDelFWriter);
}
*ppWriter = NULL;
tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(errno));
diff --git a/source/dnode/vnode/src/tsdb/tsdbRetention.c b/source/dnode/vnode/src/tsdb/tsdbRetention.c
index 2c68c571765f063c79898f4b7bc722a675cb1a08..c6e1ed99f18a511cf60c12ec045044b4023354c5 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRetention.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRetention.c
@@ -47,7 +47,7 @@ int32_t tsdbDoRetention(STsdb *pTsdb, int64_t now) {
}
// do retention
- STsdbFS fs;
+ STsdbFS fs = {0};
code = tsdbFSCopy(pTsdb, &fs);
if (code) goto _err;
@@ -86,12 +86,12 @@ int32_t tsdbDoRetention(STsdb *pTsdb, int64_t now) {
}
// do change fs
- code = tsdbFSCommit1(pTsdb, &fs);
+ code = tsdbFSPrepareCommit(pTsdb, &fs);
if (code) goto _err;
taosThreadRwlockWrlock(&pTsdb->rwLock);
- code = tsdbFSCommit2(pTsdb, &fs);
+ code = tsdbFSCommit(pTsdb);
if (code) {
taosThreadRwlockUnlock(&pTsdb->rwLock);
goto _err;
diff --git a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c
index 74c704598d891d5c50e0fd17766834401891e96d..f9d9349a1c16fb11c289ed80a65c7b0e2b3c71be 100644
--- a/source/dnode/vnode/src/tsdb/tsdbSnapshot.c
+++ b/source/dnode/vnode/src/tsdb/tsdbSnapshot.c
@@ -517,8 +517,8 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type
_exit:
if (code) {
- tsdbError("vgId:%d %s failed at line %d since %s, TSDB path: %s", TD_VID(pTsdb->pVnode), lino, tstrerror(code),
- pTsdb->path);
+ tsdbError("vgId:%d %s failed at line %d since %s, TSDB path: %s", TD_VID(pTsdb->pVnode), __func__, lino,
+ tstrerror(code), pTsdb->path);
*ppReader = NULL;
if (pReader) {
@@ -1380,13 +1380,13 @@ int32_t tsdbSnapWriterClose(STsdbSnapWriter** ppWriter, int8_t rollback) {
code = tsdbSnapWriteDelEnd(pWriter);
if (code) goto _err;
- code = tsdbFSCommit1(pWriter->pTsdb, &pWriter->fs);
+ code = tsdbFSPrepareCommit(pWriter->pTsdb, &pWriter->fs);
if (code) goto _err;
// lock
taosThreadRwlockWrlock(&pTsdb->rwLock);
- code = tsdbFSCommit2(pWriter->pTsdb, &pWriter->fs);
+ code = tsdbFSCommit(pWriter->pTsdb);
if (code) {
taosThreadRwlockUnlock(&pTsdb->rwLock);
goto _err;
diff --git a/source/dnode/vnode/src/vnd/vnodeCommit.c b/source/dnode/vnode/src/vnd/vnodeCommit.c
index 07c4c32955ece956b44beaba5ca78bcd0877e916..24b678b5eb3d612f61d46991ce40fae97e475c57 100644
--- a/source/dnode/vnode/src/vnd/vnodeCommit.c
+++ b/source/dnode/vnode/src/vnd/vnodeCommit.c
@@ -20,8 +20,6 @@
static int vnodeEncodeInfo(const SVnodeInfo *pInfo, char **ppData);
static int vnodeDecodeInfo(uint8_t *pData, SVnodeInfo *pInfo);
-static int vnodeStartCommit(SVnode *pVnode);
-static int vnodeEndCommit(SVnode *pVnode);
static int vnodeCommitImpl(void *arg);
static void vnodeWaitCommit(SVnode *pVnode);
@@ -215,6 +213,8 @@ int vnodeSyncCommit(SVnode *pVnode) {
}
int vnodeCommit(SVnode *pVnode) {
+ int32_t code = 0;
+ int32_t lino = 0;
SVnodeInfo info = {0};
char dir[TSDB_FILENAME_LEN];
@@ -234,15 +234,13 @@ int vnodeCommit(SVnode *pVnode) {
snprintf(dir, TSDB_FILENAME_LEN, "%s", pVnode->path);
}
if (vnodeSaveInfo(dir, &info) < 0) {
- vError("vgId:%d, failed to save vnode info since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
+ code = terrno;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
walBeginSnapshot(pVnode->pWal, pVnode->state.applied);
- // preCommit
- // smaSyncPreCommit(pVnode->pSma);
- if(smaAsyncPreCommit(pVnode->pSma) < 0){
- vError("vgId:%d, failed to async pre-commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
+ if (smaPreCommit(pVnode->pSma) < 0) {
+ vError("vgId:%d, failed to pre-commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
return -1;
}
@@ -251,64 +249,73 @@ int vnodeCommit(SVnode *pVnode) {
// commit each sub-system
if (metaCommit(pVnode->pMeta) < 0) {
- vError("vgId:%d, failed to commit meta since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
+ code = TSDB_CODE_FAILED;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (VND_IS_RSMA(pVnode)) {
- if (smaAsyncCommit(pVnode->pSma) < 0) {
- vError("vgId:%d, failed to async commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
- }
-
- if (tsdbCommit(VND_RSMA0(pVnode)) < 0) {
- vError("vgId:%d, failed to commit tsdb rsma0 since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
- }
- if (tsdbCommit(VND_RSMA1(pVnode)) < 0) {
- vError("vgId:%d, failed to commit tsdb rsma1 since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
- }
- if (tsdbCommit(VND_RSMA2(pVnode)) < 0) {
- vError("vgId:%d, failed to commit tsdb rsma2 since %s", TD_VID(pVnode), tstrerror(terrno));
+ if (smaCommit(pVnode->pSma) < 0) {
+ vError("vgId:%d, failed to commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
return -1;
}
} else {
- if (tsdbCommit(pVnode->pTsdb) < 0) {
- vError("vgId:%d, failed to commit tsdb since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
- }
+ code = tsdbCommit(pVnode->pTsdb);
+ TSDB_CHECK_CODE(code, lino, _exit);
}
if (tqCommit(pVnode->pTq) < 0) {
- vError("vgId:%d, failed to commit tq since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
+ code = TSDB_CODE_FAILED;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
- // walCommit (TODO)
// commit info
if (vnodeCommitInfo(dir, &info) < 0) {
- vError("vgId:%d, failed to commit vnode info since %s", TD_VID(pVnode), tstrerror(terrno));
- return -1;
+ code = terrno;
+ TSDB_CHECK_CODE(code, lino, _exit);
+ }
+
+ tsdbFinishCommit(pVnode->pTsdb);
+
+ if (metaFinishCommit(pVnode->pMeta) < 0) {
+ code = terrno;
+ TSDB_CHECK_CODE(code, lino, _exit);
}
pVnode->state.committed = info.state.committed;
- // postCommit
- // smaSyncPostCommit(pVnode->pSma);
- if (smaAsyncPostCommit(pVnode->pSma) < 0) {
- vError("vgId:%d, failed to async post-commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
+ if (smaPostCommit(pVnode->pSma) < 0) {
+ vError("vgId:%d, failed to post-commit sma since %s", TD_VID(pVnode), tstrerror(terrno));
return -1;
}
// apply the commit (TODO)
walEndSnapshot(pVnode->pWal);
- vInfo("vgId:%d, commit end", TD_VID(pVnode));
-
+_exit:
+ if (code) {
+ vError("vgId:%d %s failed at line %d since %s", TD_VID(pVnode), __func__, lino, tstrerror(code));
+ } else {
+ vInfo("vgId:%d, commit end", TD_VID(pVnode));
+ }
return 0;
}
+bool vnodeShouldRollback(SVnode *pVnode) {
+ char tFName[TSDB_FILENAME_LEN] = {0};
+ snprintf(tFName, TSDB_FILENAME_LEN, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP,
+ VND_INFO_FNAME_TMP);
+
+ return taosCheckExistFile(tFName);
+}
+
+void vnodeRollback(SVnode *pVnode) {
+ char tFName[TSDB_FILENAME_LEN] = {0};
+ snprintf(tFName, TSDB_FILENAME_LEN, "%s%s%s%s%s", tfsGetPrimaryPath(pVnode->pTfs), TD_DIRSEP, pVnode->path, TD_DIRSEP,
+ VND_INFO_FNAME_TMP);
+
+ (void)taosRemoveFile(tFName);
+}
+
static int vnodeCommitImpl(void *arg) {
SVnode *pVnode = (SVnode *)arg;
@@ -321,16 +328,6 @@ static int vnodeCommitImpl(void *arg) {
return 0;
}
-static int vnodeStartCommit(SVnode *pVnode) {
- // TODO
- return 0;
-}
-
-static int vnodeEndCommit(SVnode *pVnode) {
- // TODO
- return 0;
-}
-
static FORCE_INLINE void vnodeWaitCommit(SVnode *pVnode) { tsem_wait(&pVnode->canCommit); }
static int vnodeEncodeState(const void *pObj, SJson *pJson) {
diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c
index 001bb5f7f209f14887d637103574c9e79ab5878d..3dbd93bb27a7e8402f0a5568c6d9226be47ddfe4 100644
--- a/source/dnode/vnode/src/vnd/vnodeOpen.c
+++ b/source/dnode/vnode/src/vnd/vnodeOpen.c
@@ -110,6 +110,8 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
taosThreadMutexInit(&pVnode->mutex, NULL);
taosThreadCondInit(&pVnode->poolNotEmpty, NULL);
+ int8_t rollback = vnodeShouldRollback(pVnode);
+
// open buffer pool
if (vnodeOpenBufPool(pVnode) < 0) {
vError("vgId:%d, failed to open vnode buffer pool since %s", TD_VID(pVnode), tstrerror(terrno));
@@ -117,19 +119,19 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
}
// open meta
- if (metaOpen(pVnode, &pVnode->pMeta) < 0) {
+ if (metaOpen(pVnode, &pVnode->pMeta, rollback) < 0) {
vError("vgId:%d, failed to open vnode meta since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open tsdb
- if (!VND_IS_RSMA(pVnode) && tsdbOpen(pVnode, &VND_TSDB(pVnode), VNODE_TSDB_DIR, NULL) < 0) {
+ if (!VND_IS_RSMA(pVnode) && tsdbOpen(pVnode, &VND_TSDB(pVnode), VNODE_TSDB_DIR, NULL, rollback) < 0) {
vError("vgId:%d, failed to open vnode tsdb since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
// open sma
- if (smaOpen(pVnode)) {
+ if (smaOpen(pVnode, rollback)) {
vError("vgId:%d, failed to open vnode sma since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
@@ -153,14 +155,12 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
goto _err;
}
-#if !VNODE_AS_LIB
// open query
if (vnodeQueryOpen(pVnode)) {
vError("vgId:%d, failed to open vnode query since %s", TD_VID(pVnode), tstrerror(terrno));
terrno = TSDB_CODE_OUT_OF_MEMORY;
goto _err;
}
-#endif
// vnode begin
if (vnodeBegin(pVnode) < 0) {
@@ -169,13 +169,15 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
goto _err;
}
-#if !VNODE_AS_LIB
// open sync
if (vnodeSyncOpen(pVnode, dir)) {
vError("vgId:%d, failed to open sync since %s", TD_VID(pVnode), tstrerror(terrno));
goto _err;
}
-#endif
+
+ if (rollback) {
+ vnodeRollback(pVnode);
+ }
return pVnode;
diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c
index 8c1f858cbbfbe98e53662c46243364c72320f441..9adef918bacf8e309681e90bcbc29ea589785097 100644
--- a/source/dnode/vnode/src/vnd/vnodeQuery.c
+++ b/source/dnode/vnode/src/vnd/vnodeQuery.c
@@ -285,15 +285,43 @@ int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
}
for (int32_t i = 0; i < msgNum; ++i) {
+ if (offset >= pMsg->contLen) {
+ qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
+
req.msgIdx = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
offset += sizeof(req.msgIdx);
+ if (offset >= pMsg->contLen) {
+ qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
+
req.msgType = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
offset += sizeof(req.msgType);
+ if (offset >= pMsg->contLen) {
+ qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
+
req.msgLen = ntohl(*(int32_t *)((char *)pMsg->pCont + offset));
offset += sizeof(req.msgLen);
+ if (offset >= pMsg->contLen) {
+ qError("vnode offset %d is bigger than contLen %d", offset, pMsg->contLen);
+ terrno = TSDB_CODE_MSG_NOT_PROCESSED;
+ taosArrayDestroy(batchRsp);
+ return -1;
+ }
+
req.msg = (char *)pMsg->pCont + offset;
offset += req.msgLen;
@@ -330,6 +358,11 @@ int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
rspSize += sizeof(int32_t);
offset = 0;
+ if (rspSize > MAX_META_BATCH_RSP_SIZE) {
+ code = TSDB_CODE_INVALID_MSG_LEN;
+ goto _exit;
+ }
+
pRsp = rpcMallocCont(rspSize);
if (pRsp == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
@@ -380,6 +413,7 @@ _exit:
int32_t vnodeGetLoad(SVnode *pVnode, SVnodeLoad *pLoad) {
pLoad->vgId = TD_VID(pVnode);
pLoad->syncState = syncGetMyRole(pVnode->sync);
+ pLoad->syncRestore = pVnode->restored;
pLoad->cacheUsage = tsdbCacheGetUsage(pVnode);
pLoad->numOfTables = metaGetTbNum(pVnode->pMeta);
pLoad->numOfTimeSeries = metaGetTimeSeriesNum(pVnode->pMeta);
diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c
index d0a00a8b6de0a337fa2d9971c88369cad2da2e8b..be6eaccb3b6d4c7e4de0453379846aacff64608e 100644
--- a/source/dnode/vnode/src/vnd/vnodeSvr.c
+++ b/source/dnode/vnode/src/vnd/vnodeSvr.c
@@ -53,7 +53,10 @@ int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
for (int32_t iReq = 0; iReq < nReqs; iReq++) {
tb_uid_t uid = tGenIdPI64();
char *name = NULL;
- tStartDecode(&dc);
+ if (tStartDecode(&dc) < 0) {
+ code = TSDB_CODE_INVALID_MSG;
+ goto _err;
+ }
if (tDecodeI32v(&dc, NULL) < 0) {
code = TSDB_CODE_INVALID_MSG;
@@ -1087,7 +1090,7 @@ static int32_t vnodeProcessAlterConfigReq(SVnode *pVnode, int64_t version, void
if (pVnode->config.szBuf != req.buffer * 1024LL * 1024LL) {
vInfo("vgId:%d vnode buffer is changed from %" PRId64 " to %" PRId64, TD_VID(pVnode), pVnode->config.szBuf,
- req.buffer * 1024LL * 1024LL);
+ (uint64_t)(req.buffer * 1024LL * 1024LL));
pVnode->config.szBuf = req.buffer * 1024LL * 1024LL;
}
diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c
index ab7fb001f017e2f6917d1407aa102fbb86434b02..6bcf603f7ffdfa601672f9617f31ecbf6802b153 100644
--- a/source/dnode/vnode/src/vnd/vnodeSync.c
+++ b/source/dnode/vnode/src/vnd/vnodeSync.c
@@ -323,6 +323,49 @@ void vnodeApplyWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs) {
}
}
+int32_t vnodeProcessSyncCtrlMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
+ int32_t code = 0;
+ const STraceId *trace = &pMsg->info.traceId;
+
+ if (!syncEnvIsStart()) {
+ vGError("vgId:%d, msg:%p failed to process since sync env not start", pVnode->config.vgId, pMsg);
+ terrno = TSDB_CODE_APP_ERROR;
+ return -1;
+ }
+
+ SSyncNode *pSyncNode = syncNodeAcquire(pVnode->sync);
+ if (pSyncNode == NULL) {
+ vGError("vgId:%d, msg:%p failed to process since invalid sync node", pVnode->config.vgId, pMsg);
+ terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ return -1;
+ }
+
+ vGTrace("vgId:%d, sync msg:%p will be processed, type:%s", pVnode->config.vgId, pMsg, TMSG_INFO(pMsg->msgType));
+
+ if (pMsg->msgType == TDMT_SYNC_HEARTBEAT) {
+ SyncHeartbeat *pSyncMsg = syncHeartbeatFromRpcMsg2(pMsg);
+ code = syncNodeOnHeartbeat(pSyncNode, pSyncMsg);
+ syncHeartbeatDestroy(pSyncMsg);
+
+ } else if (pMsg->msgType == TDMT_SYNC_HEARTBEAT_REPLY) {
+ SyncHeartbeatReply *pSyncMsg = syncHeartbeatReplyFromRpcMsg2(pMsg);
+ code = syncNodeOnHeartbeatReply(pSyncNode, pSyncMsg);
+ syncHeartbeatReplyDestroy(pSyncMsg);
+
+ } else {
+ vGError("vgId:%d, msg:%p failed to process since error msg type:%d", pVnode->config.vgId, pMsg, pMsg->msgType);
+ code = -1;
+ }
+
+ vTrace("vgId:%d, sync msg:%p is processed, type:%s code:0x%x", pVnode->config.vgId, pMsg, TMSG_INFO(pMsg->msgType),
+ code);
+ syncNodeRelease(pSyncNode);
+ if (code != 0 && terrno == 0) {
+ terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ }
+ return code;
+}
+
int32_t vnodeProcessSyncMsg(SVnode *pVnode, SRpcMsg *pMsg, SRpcMsg **pRsp) {
int32_t code = 0;
const STraceId *trace = &pMsg->info.traceId;
diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h
index fe71987103aedbee555b67e99c95a7fb6fb2fb0e..0786321686a5ae6f5b7f7937f4c5ec425f6d6c31 100644
--- a/source/libs/catalog/inc/catalogInt.h
+++ b/source/libs/catalog/inc/catalogInt.h
@@ -505,6 +505,7 @@ typedef struct SCtgOperation {
#define CTG_FLAG_UNKNOWN_STB 0x4
#define CTG_FLAG_SYS_DB 0x8
#define CTG_FLAG_FORCE_UPDATE 0x10
+#define CTG_FLAG_ONLY_CACHE 0x20
#define CTG_FLAG_SET(_flag, _v) ((_flag) |= (_v))
@@ -783,7 +784,7 @@ void ctgFreeQNode(SCtgQNode* node);
void ctgClearHandle(SCatalog* pCtg);
void ctgFreeTbCacheImpl(SCtgTbCache* pCache);
int32_t ctgRemoveTbMeta(SCatalog* pCtg, SName* pTableName);
-int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup);
+int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
SName* ctgGetFetchName(SArray* pNames, SCtgFetch* pFetch);
extern SCatalogMgmt gCtgMgmt;
diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c
index b960103d94a65e5508031c6b23fb57ab17f2068f..5997f63a16e0d669467a18a53eb84e9e6bcfebd9 100644
--- a/source/libs/catalog/src/catalog.c
+++ b/source/libs/catalog/src/catalog.c
@@ -23,12 +23,21 @@
SCatalogMgmt gCtgMgmt = {0};
int32_t ctgGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* dbFName, SCtgDBCache** dbCache,
- SDBVgInfo** pInfo) {
+ SDBVgInfo** pInfo, bool* exists) {
int32_t code = 0;
CTG_ERR_RET(ctgAcquireVgInfoFromCache(pCtg, dbFName, dbCache));
if (*dbCache) {
+ if (exists) {
+ *exists = true;
+ }
+
+ return TSDB_CODE_SUCCESS;
+ }
+
+ if (exists) {
+ *exists = false;
return TSDB_CODE_SUCCESS;
}
@@ -94,7 +103,7 @@ int32_t ctgRefreshTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx*
int32_t code = 0;
if (!CTG_FLAG_IS_SYS_DB(ctx->flag)) {
- CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, ctx->pName, &vgroupInfo));
+ CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, ctx->pName, &vgroupInfo, NULL));
}
STableMetaOutput moutput = {0};
@@ -194,7 +203,7 @@ int32_t ctgGetTbMeta(SCatalog* pCtg, SRequestConnInfo* pConn, SCtgTbMetaCtx* ctx
STableMetaOutput* output = NULL;
CTG_ERR_RET(ctgGetTbMetaFromCache(pCtg, pConn, ctx, pTableMeta));
- if (*pTableMeta) {
+ if (*pTableMeta || (ctx->flag & CTG_FLAG_ONLY_CACHE)) {
goto _return;
}
@@ -302,9 +311,11 @@ int32_t ctgUpdateTbMeta(SCatalog* pCtg, STableMetaRsp* rspMsg, bool syncOp) {
_return:
- taosMemoryFreeClear(output->tbMeta);
- taosMemoryFreeClear(output);
-
+ if (output) {
+ taosMemoryFreeClear(output->tbMeta);
+ taosMemoryFreeClear(output);
+ }
+
CTG_RET(code);
}
@@ -413,7 +424,7 @@ int32_t ctgGetTbCfg(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTableName,
CTG_ERR_RET(ctgGetTableCfgFromMnode(pCtg, pConn, pTableName, pCfg, NULL));
} else {
SVgroupInfo vgroupInfo = {0};
- CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo));
+ CTG_ERR_RET(ctgGetTbHashVgroup(pCtg, pConn, pTableName, &vgroupInfo, NULL));
CTG_ERR_RET(ctgGetTableCfgFromVnode(pCtg, pConn, pTableName, &vgroupInfo, pCfg, NULL));
}
@@ -439,7 +450,7 @@ int32_t ctgGetTbDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, SName* pTabl
tNameGetFullDbName(pTableName, db);
SHashObj* vgHash = NULL;
- CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo));
+ CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo, NULL));
if (dbCache) {
vgHash = dbCache->vgCache.vgInfo->vgHash;
@@ -499,7 +510,7 @@ _return:
CTG_RET(code);
}
-int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup) {
+int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists) {
if (IS_SYS_DBNAME(pTableName->dbname)) {
ctgError("no valid vgInfo for db, dbname:%s", pTableName->dbname);
CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
@@ -511,8 +522,13 @@ int32_t ctgGetTbHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName*
tNameGetFullDbName(pTableName, db);
SDBVgInfo* vgInfo = NULL;
- CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo));
+ CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, db, &dbCache, &vgInfo, exists));
+ if (exists && false == *exists) {
+ ctgDebug("db %s vgInfo not in cache", pTableName->dbname);
+ return TSDB_CODE_SUCCESS;
+ }
+
CTG_ERR_JRET(ctgGetVgInfoFromHashValue(pCtg, vgInfo ? vgInfo : dbCache->vgCache.vgInfo, pTableName, pVgroup));
_return:
@@ -735,7 +751,7 @@ int32_t catalogGetDBVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char*
SArray* vgList = NULL;
SHashObj* vgHash = NULL;
SDBVgInfo* vgInfo = NULL;
- CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo));
+ CTG_ERR_JRET(ctgGetDBVgInfo(pCtg, pConn, dbFName, &dbCache, &vgInfo, NULL));
if (dbCache) {
vgHash = dbCache->vgCache.vgInfo->vgHash;
} else {
@@ -878,6 +894,17 @@ int32_t catalogGetTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName
CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
}
+int32_t catalogGetCachedTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName, STableMeta** pTableMeta) {
+ CTG_API_ENTER();
+
+ SCtgTbMetaCtx ctx = {0};
+ ctx.pName = (SName*)pTableName;
+ ctx.flag = CTG_FLAG_UNKNOWN_STB | CTG_FLAG_ONLY_CACHE;
+
+ CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
+}
+
+
int32_t catalogGetSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
STableMeta** pTableMeta) {
CTG_API_ENTER();
@@ -889,6 +916,18 @@ int32_t catalogGetSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SNam
CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
}
+int32_t catalogGetCachedSTableMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
+ STableMeta** pTableMeta) {
+ CTG_API_ENTER();
+
+ SCtgTbMetaCtx ctx = {0};
+ ctx.pName = (SName*)pTableName;
+ ctx.flag = CTG_FLAG_STB | CTG_FLAG_ONLY_CACHE;
+
+ CTG_API_LEAVE(ctgGetTbMeta(pCtg, pConn, &ctx, pTableMeta));
+}
+
+
int32_t catalogUpdateTableMeta(SCatalog* pCtg, STableMetaRsp* pMsg) {
CTG_API_ENTER();
@@ -1007,7 +1046,14 @@ int32_t catalogGetTableHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const
SVgroupInfo* pVgroup) {
CTG_API_ENTER();
- CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup));
+ CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup, NULL));
+}
+
+int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
+ SVgroupInfo* pVgroup, bool* exists) {
+ CTG_API_ENTER();
+
+ CTG_API_LEAVE(ctgGetTbHashVgroup(pCtg, pConn, pTableName, pVgroup, exists));
}
int32_t catalogGetAllMeta(SCatalog* pCtg, SRequestConnInfo* pConn, const SCatalogReq* pReq, SMetaData* pRsp) {
diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c
index 1d2e3640a1b739493e923d5bf250cbddc717dd23..1f1a210699b8611f68bf3e0db410087cd4d2e949 100644
--- a/source/libs/catalog/src/ctgAsync.c
+++ b/source/libs/catalog/src/ctgAsync.c
@@ -70,8 +70,8 @@ int32_t ctgInitGetTbMetasTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%d, tbNum:%d", pJob->queryId, taskIdx,
- ctgTaskTypeStr(task.type), (int32_t)taosArrayGetSize(ctx->pNames), pJob->tbMetaNum);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%lu, tbNum:%d", pJob->queryId, taskIdx,
+ ctgTaskTypeStr(task.type), taosArrayGetSize(ctx->pNames), pJob->tbMetaNum);
return TSDB_CODE_SUCCESS;
}
@@ -201,8 +201,8 @@ int32_t ctgInitGetTbHashsTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
taosArrayPush(pJob->pTasks, &task);
- qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%d, tbNum:%d", pJob->queryId, taskIdx,
- ctgTaskTypeStr(task.type), (int32_t)taosArrayGetSize(ctx->pNames), pJob->tbHashNum);
+ qDebug("QID:0x%" PRIx64 " the %dth task type %s initialized, dbNum:%lu, tbNum:%d", pJob->queryId, taskIdx,
+ ctgTaskTypeStr(task.type), taosArrayGetSize(ctx->pNames), pJob->tbHashNum);
return TSDB_CODE_SUCCESS;
}
@@ -252,7 +252,7 @@ int32_t ctgInitGetIndexTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
SCtgIndexCtx* ctx = task.taskCtx;
- strcpy(ctx->indexFName, name);
+ tstrncpy(ctx->indexFName, name, sizeof(ctx->indexFName));
taosArrayPush(pJob->pTasks, &task);
@@ -277,7 +277,7 @@ int32_t ctgInitGetUdfTask(SCtgJob* pJob, int32_t taskIdx, void* param) {
SCtgUdfCtx* ctx = task.taskCtx;
- strcpy(ctx->udfName, name);
+ tstrncpy(ctx->udfName, name, sizeof(ctx->udfName));
taosArrayPush(pJob->pTasks, &task);
@@ -1667,7 +1667,7 @@ int32_t ctgLaunchGetTbMetasTask(SCtgTask* pTask) {
int32_t baseResIdx = 0;
for (int32_t i = 0; i < dbNum; ++i) {
STablesReq* pReq = taosArrayGet(pCtx->pNames, i);
- ctgDebug("start to check tb metas in db %s, tbNum %d", pReq->dbFName, (int32_t)taosArrayGetSize(pReq->pTables));
+ ctgDebug("start to check tb metas in db %s, tbNum %ld", pReq->dbFName, taosArrayGetSize(pReq->pTables));
CTG_ERR_RET(ctgGetTbMetasFromCache(pCtg, pConn, pCtx, i, &fetchIdx, baseResIdx, pReq->pTables));
baseResIdx += taosArrayGetSize(pReq->pTables);
}
diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c
index 89571ebf5573465b179001a38f55f954398ffebb..1a7a0057badf5bfaa0356fe844bb9e8ebd89b052 100644
--- a/source/libs/catalog/src/ctgCache.c
+++ b/source/libs/catalog/src/ctgCache.c
@@ -660,7 +660,7 @@ int32_t ctgDropDbCacheEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId)
}
msg->pCtg = pCtg;
- strncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
+ tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
msg->dbId = dbId;
op->data = msg;
@@ -693,7 +693,7 @@ int32_t ctgDropDbVgroupEnqueue(SCatalog *pCtg, const char *dbFName, bool syncOp)
}
msg->pCtg = pCtg;
- strncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
+ tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
op->data = msg;
@@ -721,8 +721,8 @@ int32_t ctgDropStbMetaEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId,
}
msg->pCtg = pCtg;
- strncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
- strncpy(msg->stbName, stbName, sizeof(msg->stbName));
+ tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
+ tstrncpy(msg->stbName, stbName, sizeof(msg->stbName));
msg->dbId = dbId;
msg->suid = suid;
@@ -751,8 +751,8 @@ int32_t ctgDropTbMetaEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId,
}
msg->pCtg = pCtg;
- strncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
- strncpy(msg->tbName, tbName, sizeof(msg->tbName));
+ tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
+ tstrncpy(msg->tbName, tbName, sizeof(msg->tbName));
msg->dbId = dbId;
op->data = msg;
@@ -785,7 +785,7 @@ int32_t ctgUpdateVgroupEnqueue(SCatalog *pCtg, const char *dbFName, int64_t dbId
dbFName = p + 1;
}
- strncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
+ tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
msg->pCtg = pCtg;
msg->dbId = dbId;
msg->dbInfo = dbInfo;
@@ -817,7 +817,8 @@ int32_t ctgUpdateTbMetaEnqueue(SCatalog *pCtg, STableMetaOutput *output, bool sy
char *p = strchr(output->dbFName, '.');
if (p && IS_SYS_DBNAME(p + 1)) {
- memmove(output->dbFName, p + 1, strlen(p + 1));
+ int32_t len = strlen(p + 1);
+ memmove(output->dbFName, p + 1, len >= TSDB_DB_FNAME_LEN ? TSDB_DB_FNAME_LEN - 1 : len);
}
msg->pCtg = pCtg;
@@ -852,7 +853,7 @@ int32_t ctgUpdateVgEpsetEnqueue(SCatalog *pCtg, char *dbFName, int32_t vgId, SEp
}
msg->pCtg = pCtg;
- strcpy(msg->dbFName, dbFName);
+ tstrncpy(msg->dbFName, dbFName, sizeof(msg->dbFName));
msg->vgId = vgId;
msg->epSet = *pEpSet;
@@ -1215,7 +1216,7 @@ int32_t ctgAddNewDBCache(SCatalog *pCtg, const char *dbFName, uint64_t dbId) {
CTG_CACHE_STAT_INC(numOfDb, 1);
SDbVgVersion vgVersion = {.dbId = newDBCache.dbId, .vgVersion = -1};
- strncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
+ tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
ctgDebug("db added to cache, dbFName:%s, dbId:0x%" PRIx64, dbFName, dbId);
@@ -1331,8 +1332,8 @@ int32_t ctgUpdateRentStbVersion(SCatalog *pCtg, char *dbFName, char *tbName, uin
metaRent.smaVer = pCache->pIndex->version;
}
- strcpy(metaRent.dbFName, dbFName);
- strcpy(metaRent.stbName, tbName);
+ tstrncpy(metaRent.dbFName, dbFName, sizeof(metaRent.dbFName));
+ tstrncpy(metaRent.stbName, tbName, sizeof(metaRent.stbName));
CTG_ERR_RET(ctgMetaRentUpdate(&pCtg->stbRent, &metaRent, metaRent.suid, sizeof(SSTableVersion),
ctgStbVersionSortCompare, ctgStbVersionSearchCompare));
@@ -1390,8 +1391,10 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
pCache = taosHashGet(dbCache->tbCache, tbName, strlen(tbName));
} else {
+ CTG_LOCK(CTG_WRITE, &pCache->metaLock);
taosMemoryFree(pCache->pMeta);
pCache->pMeta = meta;
+ CTG_UNLOCK(CTG_WRITE, &pCache->metaLock);
}
if (NULL == orig) {
@@ -1416,8 +1419,10 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
ctgDebug("stb 0x%" PRIx64 " updated to cache, dbFName:%s, tbName:%s, tbType:%d", meta->suid, dbFName, tbName,
meta->tableType);
- CTG_ERR_RET(ctgUpdateRentStbVersion(pCtg, dbFName, tbName, dbId, meta->suid, pCache));
-
+ if (pCache) {
+ CTG_ERR_RET(ctgUpdateRentStbVersion(pCtg, dbFName, tbName, dbId, meta->suid, pCache));
+ }
+
return TSDB_CODE_SUCCESS;
}
@@ -1454,6 +1459,8 @@ int32_t ctgWriteTbIndexToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNa
return TSDB_CODE_SUCCESS;
}
+ CTG_LOCK(CTG_WRITE, &pCache->indexLock);
+
if (pCache->pIndex) {
if (0 == suid) {
suid = pCache->pIndex->suid;
@@ -1463,6 +1470,8 @@ int32_t ctgWriteTbIndexToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNa
}
pCache->pIndex = pIndex;
+ CTG_UNLOCK(CTG_WRITE, &pCache->indexLock);
+
*index = NULL;
ctgDebug("table %s index updated to cache, ver:%d, num:%d", tbName, pIndex->version,
@@ -1584,7 +1593,7 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
dbCache = NULL;
- strncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
+ tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion),
ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
@@ -1674,9 +1683,9 @@ int32_t ctgOpUpdateTbMeta(SCtgCacheOperation *operation) {
if (CTG_IS_META_TABLE(pMeta->metaType) || CTG_IS_META_BOTH(pMeta->metaType)) {
int32_t metaSize = CTG_META_SIZE(pMeta->tbMeta);
- CTG_ERR_JRET(
- ctgWriteTbMetaToCache(pCtg, dbCache, pMeta->dbFName, pMeta->dbId, pMeta->tbName, pMeta->tbMeta, metaSize));
+ code = ctgWriteTbMetaToCache(pCtg, dbCache, pMeta->dbFName, pMeta->dbId, pMeta->tbName, pMeta->tbMeta, metaSize);
pMeta->tbMeta = NULL;
+ CTG_ERR_JRET(code);
}
if (CTG_IS_META_CTABLE(pMeta->metaType) || CTG_IS_META_BOTH(pMeta->metaType)) {
@@ -1691,10 +1700,8 @@ int32_t ctgOpUpdateTbMeta(SCtgCacheOperation *operation) {
_return:
- if (pMeta) {
- taosMemoryFreeClear(pMeta->tbMeta);
- taosMemoryFreeClear(pMeta);
- }
+ taosMemoryFreeClear(pMeta->tbMeta);
+ taosMemoryFreeClear(pMeta);
taosMemoryFreeClear(msg);
diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c
index 33e5b0e1e41dcc15a946d84d5ca1f36ecaa00562..095d2b093d83e2c67f4aefc7c2fcbd222786bdfd 100644
--- a/source/libs/command/src/command.c
+++ b/source/libs/command/src/command.c
@@ -361,7 +361,12 @@ int32_t appendTagValues(char* buf, int32_t* len, STableCfg* pCfg) {
SArray* pTagVals = NULL;
STag* pTag = (STag*)pCfg->pTags;
- if (pCfg->pTags && tTagIsJson(pTag)) {
+ if (NULL == pCfg->pTags || pCfg->numOfTags <= 0) {
+ qError("tag missed in table cfg, pointer:%p, numOfTags:%d", pCfg->pTags, pCfg->numOfTags);
+ return TSDB_CODE_APP_ERROR;
+ }
+
+ if (tTagIsJson(pTag)) {
char* pJson = parseTagDatatoJson(pTag);
if (pJson) {
*len += sprintf(buf + VARSTR_HEADER_SIZE + *len, "%s", pJson);
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index f64ba58bef177f3ad47e32d280324fc6ece31519..c2d76c13862d3332e360b282bb781744e6dadf97 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -53,6 +53,11 @@ typedef int32_t (*__block_search_fn_t)(char* data, int32_t num, int64_t key, int
#define NEEDTO_COMPRESS_QUERY(size) ((size) > tsCompressColData ? 1 : 0)
+#define IS_VALID_SESSION_WIN(winInfo) ((winInfo).sessionWin.win.skey > 0)
+#define SET_SESSION_WIN_INVALID(winInfo) ((winInfo).sessionWin.win.skey = INT64_MIN)
+#define IS_INVALID_SESSION_WIN_KEY(winKey) ((winKey).win.skey <= 0)
+#define SET_SESSION_WIN_KEY_INVALID(pWinKey) ((pWinKey)->win.skey = INT64_MIN)
+
enum {
// when this task starts to execute, this status will set
TASK_NOT_COMPLETED = 0x1u,
@@ -434,15 +439,15 @@ typedef struct SCatchSupporter {
} SCatchSupporter;
typedef struct SStreamAggSupporter {
- SHashObj* pResultRows;
- SArray* pCurWins;
- int32_t valueSize;
- int32_t keySize;
- char* pKeyBuf; // window key buffer
- SDiskbasedBuf* pResultBuf; // query result buffer based on blocked-wised disk file
- int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row
- int32_t currentPageId; // buffer page that is active
- SSDataBlock* pScanBlock;
+ int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row
+ SSDataBlock* pScanBlock;
+ SStreamState* pState;
+ int64_t gap; // stream session window gap
+ SqlFunctionCtx* pDummyCtx; // for combine
+ SSHashObj* pResultRows;
+ int32_t stateKeySize;
+ int16_t stateKeyType;
+ SDiskbasedBuf* pResultBuf;
} SStreamAggSupporter;
typedef struct SWindowSupporter {
@@ -737,42 +742,54 @@ typedef struct SSessionAggOperatorInfo {
} SSessionAggOperatorInfo;
typedef struct SResultWindowInfo {
- SResultRowPosition pos;
- STimeWindow win;
- uint64_t groupId;
+ void* pOutputBuf;
+ SSessionKey sessionWin;
bool isOutput;
- bool isClosed;
} SResultWindowInfo;
typedef struct SStateWindowInfo {
SResultWindowInfo winInfo;
- SStateKeys stateKey;
+ SStateKeys* pStateKey;
} SStateWindowInfo;
typedef struct SStreamSessionAggOperatorInfo {
SOptrBasicInfo binfo;
SStreamAggSupporter streamAggSup;
- SExprSupp scalarSupp; // supporter for perform scalar function
+ SExprSupp scalarSupp; // supporter for perform scalar function
SGroupResInfo groupResInfo;
- int64_t gap; // session window gap
int32_t primaryTsIndex; // primary timestamp slot id
int32_t endTsIndex; // window end timestamp slot id
int32_t order; // current SSDataBlock scan order
STimeWindowAggSupp twAggSup;
- SSDataBlock* pWinBlock; // window result
- SqlFunctionCtx* pDummyCtx; // for combine
- SSDataBlock* pDelRes; // delete result
- SSDataBlock* pUpdateRes; // update window
+ SSDataBlock* pWinBlock; // window result
+ SSDataBlock* pDelRes; // delete result
+ SSDataBlock* pUpdateRes; // update window
bool returnUpdate;
- SHashObj* pStDeleted;
+ SSHashObj* pStDeleted;
void* pDelIterator;
- SArray* pChildren; // cache for children's result; final stream operator
- SPhysiNode* pPhyNode; // create new child
+ SArray* pChildren; // cache for children's result; final stream operator
+ SPhysiNode* pPhyNode; // create new child
bool isFinal;
bool ignoreExpiredData;
SHashObj* pGroupIdTbNameMap;
} SStreamSessionAggOperatorInfo;
+typedef struct SStreamStateAggOperatorInfo {
+ SOptrBasicInfo binfo;
+ SStreamAggSupporter streamAggSup;
+ SExprSupp scalarSupp; // supporter for perform scalar function
+ SGroupResInfo groupResInfo;
+ int32_t primaryTsIndex; // primary timestamp slot id
+ STimeWindowAggSupp twAggSup;
+ SColumn stateCol;
+ SSDataBlock* pDelRes;
+ SSHashObj* pSeDeleted;
+ void* pDelIterator;
+ SArray* pChildren; // cache for children's result;
+ bool ignoreExpiredData;
+ SHashObj* pGroupIdTbNameMap;
+} SStreamStateAggOperatorInfo;
+
typedef struct SStreamPartitionOperatorInfo {
SOptrBasicInfo binfo;
SPartitionBySupporter partitionSup;
@@ -835,24 +852,6 @@ typedef struct SStateWindowOperatorInfo {
const SNode* pCondition;
} SStateWindowOperatorInfo;
-typedef struct SStreamStateAggOperatorInfo {
- SOptrBasicInfo binfo;
- SStreamAggSupporter streamAggSup;
- SExprSupp scalarSupp; // supporter for perform scalar function
- SGroupResInfo groupResInfo;
- int32_t primaryTsIndex; // primary timestamp slot id
- int32_t order; // current SSDataBlock scan order
- STimeWindowAggSupp twAggSup;
- SColumn stateCol;
- SqlFunctionCtx* pDummyCtx; // for combine
- SSDataBlock* pDelRes;
- SHashObj* pSeDeleted;
- void* pDelIterator;
- SArray* pChildren; // cache for children's result;
- bool ignoreExpiredData;
- SHashObj* pGroupIdTbNameMap;
-} SStreamStateAggOperatorInfo;
-
typedef struct SSortOperatorInfo {
SOptrBasicInfo binfo;
uint32_t sortBufSize; // max buffer size for in-memory sort
@@ -1060,13 +1059,8 @@ STimeWindow getActiveTimeWindow(SDiskbasedBuf* pBuf, SResultRowInfo* pResultRowI
int32_t getNumOfRowsInTimeWindow(SDataBlockInfo* pDataBlockInfo, TSKEY* pPrimaryColumn, int32_t startPos, TSKEY ekey,
__block_search_fn_t searchFn, STableQueryInfo* item, int32_t order);
int32_t binarySearchForKey(char* pValue, int num, TSKEY key, int order);
-int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx, int32_t numOfOutput,
- int32_t size);
SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize);
-SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
- int64_t gap, int32_t* pIndex);
-SResultWindowInfo* getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
- int64_t gap, int32_t* pIndex);
+void getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId, SSessionKey* pKey);
bool isInTimeWindow(STimeWindow* pWin, TSKEY ts, int64_t gap);
bool functionNeedToExecute(SqlFunctionCtx* pCtx);
bool isOverdue(TSKEY ts, STimeWindowAggSupp* pSup);
@@ -1096,6 +1090,9 @@ int32_t generateGroupIdMap(STableListInfo* pTableListInfo, SReadHandle* pHandle,
void* destroySqlFunctionCtx(SqlFunctionCtx* pCtx, int32_t numOfOutput);
int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock, SExprSupp* pSup,
SGroupResInfo* pGroupResInfo);
+int32_t saveSessionDiscBuf(SStreamState* pState, SSessionKey* key, void* buf, int32_t size);
+int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock,
+ SExprSupp* pSup, SGroupResInfo* pGroupResInfo);
int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResult, int64_t tableGroupId, SqlFunctionCtx* pCtx,
int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup);
int32_t releaseOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult);
diff --git a/source/libs/executor/src/dataDeleter.c b/source/libs/executor/src/dataDeleter.c
index e9c3bfe34d1bb7d87bc596ce91f554453cbb2c42..0714d0f3acd1703cdee50437ac82c92233627975 100644
--- a/source/libs/executor/src/dataDeleter.c
+++ b/source/libs/executor/src/dataDeleter.c
@@ -103,7 +103,7 @@ static void toDataCacheEntry(SDataDeleterHandle* pHandle, const SInputData* pInp
pRes->ekey = pHandle->pDeleter->deleteTimeRange.ekey;
}
- qDebug("delete %ld rows, from %ld to %ld", pRes->affectedRows, pRes->skey, pRes->ekey);
+ qDebug("delete %" PRId64 " rows, from %" PRId64 " to %" PRId64 "", pRes->affectedRows, pRes->skey, pRes->ekey);
pBuf->useSize += pEntry->dataLen;
@@ -150,9 +150,15 @@ static int32_t getStatus(SDataDeleterHandle* pDeleter) {
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
SDataDeleterHandle* pDeleter = (SDataDeleterHandle*)pHandle;
SDataDeleterBuf* pBuf = taosAllocateQitem(sizeof(SDataDeleterBuf), DEF_QITEM);
- if (NULL == pBuf || !allocBuf(pDeleter, pInput, pBuf)) {
+ if (NULL == pBuf) {
return TSDB_CODE_QRY_OUT_OF_MEMORY;
}
+
+ if (!allocBuf(pDeleter, pInput, pBuf)) {
+ taosFreeQitem(pBuf);
+ return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ }
+
toDataCacheEntry(pDeleter, pInput, pBuf);
taosWriteQitem(pDeleter->pDataBlocks, pBuf);
*pContinue = (DS_BUF_LOW == updateStatus(pDeleter) ? true : false);
@@ -177,6 +183,7 @@ static void getDataLength(SDataSinkHandle* pHandle, int64_t* pLen, bool* pQueryE
SDataDeleterBuf* pBuf = NULL;
taosReadQitem(pDeleter->pDataBlocks, (void**)&pBuf);
+ ASSERT(NULL != pBuf);
memcpy(&pDeleter->nextOutput, pBuf, sizeof(SDataDeleterBuf));
taosFreeQitem(pBuf);
diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c
index 0b5c8372f171207d201d5ee8c3bad2939ed601dd..ffdcf48d48c704eccbb430c3bddd843f704d80f7 100644
--- a/source/libs/executor/src/dataDispatcher.c
+++ b/source/libs/executor/src/dataDispatcher.c
@@ -143,9 +143,15 @@ static int32_t getStatus(SDataDispatchHandle* pDispatcher) {
static int32_t putDataBlock(SDataSinkHandle* pHandle, const SInputData* pInput, bool* pContinue) {
SDataDispatchHandle* pDispatcher = (SDataDispatchHandle*)pHandle;
SDataDispatchBuf* pBuf = taosAllocateQitem(sizeof(SDataDispatchBuf), DEF_QITEM);
- if (NULL == pBuf || !allocBuf(pDispatcher, pInput, pBuf)) {
+ if (NULL == pBuf) {
return TSDB_CODE_QRY_OUT_OF_MEMORY;
}
+
+ if (!allocBuf(pDispatcher, pInput, pBuf)) {
+ taosFreeQitem(pBuf);
+ return TSDB_CODE_QRY_OUT_OF_MEMORY;
+ }
+
toDataCacheEntry(pDispatcher, pInput, pBuf);
taosWriteQitem(pDispatcher->pDataBlocks, pBuf);
*pContinue = (DS_BUF_LOW == updateStatus(pDispatcher) ? true : false);
diff --git a/source/libs/executor/src/dataInserter.c b/source/libs/executor/src/dataInserter.c
index 4c4ba59fa9338fbd17cdf6b3685ee5daf3aa3ebc..78afdd16b79bc45879b50aa031b2008cb8fcfba2 100644
--- a/source/libs/executor/src/dataInserter.c
+++ b/source/libs/executor/src/dataInserter.c
@@ -323,11 +323,14 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
int32_t code =
tsdbGetTableSchema(inserter->pParam->readHandle->vnode, pInserterNode->tableId, &inserter->pSchema, &suid);
if (code) {
- destroyDataSinker((SDataSinkHandle*)pInserterNode);
+ destroyDataSinker((SDataSinkHandle*)inserter);
+ taosMemoryFree(inserter);
return code;
}
if (pInserterNode->stableId != suid) {
+ destroyDataSinker((SDataSinkHandle*)inserter);
+ taosMemoryFree(inserter);
terrno = TSDB_CODE_TDB_INVALID_TABLE_ID;
return terrno;
}
@@ -335,6 +338,8 @@ int32_t createDataInserter(SDataSinkManager* pManager, const SDataSinkNode* pDat
inserter->pDataBlocks = taosArrayInit(1, POINTER_BYTES);
taosThreadMutexInit(&inserter->mutex, NULL);
if (NULL == inserter->pDataBlocks) {
+ destroyDataSinker((SDataSinkHandle*)inserter);
+ taosMemoryFree(inserter);
terrno = TSDB_CODE_QRY_OUT_OF_MEMORY;
return TSDB_CODE_QRY_OUT_OF_MEMORY;
}
diff --git a/source/libs/executor/src/executil.c b/source/libs/executor/src/executil.c
index 79f6166079b4701e2399203cfd6bdd0f2d73b444..bf24fe3a3ee10160f63443682e4221d180438a57 100644
--- a/source/libs/executor/src/executil.c
+++ b/source/libs/executor/src/executil.c
@@ -930,7 +930,7 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode,
void* var = POINTER_SHIFT(pColInfoData->pData, j * pColInfoData->info.bytes);
int64_t* uid = taosArrayGet(res, i);
- qDebug("tagfilter get uid:%ld, res:%d", *uid, *(bool*)var);
+ qDebug("tagfilter get uid:%" PRId64 ", res:%d", *uid, *(bool*)var);
if (*(bool*)var == false) {
taosArrayRemove(res, i);
j++;
@@ -952,7 +952,7 @@ int32_t getTableList(void* metaHandle, void* pVnode, SScanPhysiNode* pScanNode,
return TSDB_CODE_OUT_OF_MEMORY;
}
- qDebug("tagfilter get uid:%ld", info.uid);
+ qDebug("tagfilter get uid:%" PRId64 "", info.uid);
}
taosArrayDestroy(res);
diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c
index 19c81aef2b9eeea40572981f92e55a4e0b4b4dda..cad3e3c44c8068de7f521403ce0e3d17e02feddc 100644
--- a/source/libs/executor/src/executor.c
+++ b/source/libs/executor/src/executor.c
@@ -858,7 +858,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
tDeleteSSchemaWrapper(pTaskInfo->streamInfo.schema);
pTaskInfo->streamInfo.schema = mtInfo.schema;
- qDebug("tmqsnap qStreamPrepareScan snapshot data uid %ld ts %"PRId64, mtInfo.uid, pOffset->ts);
+ qDebug("tmqsnap qStreamPrepareScan snapshot data uid %" PRId64 " ts %" PRId64, mtInfo.uid, pOffset->ts);
} else if (pOffset->type == TMQ_OFFSET__SNAPSHOT_META) {
SStreamRawScanInfo* pInfo = pOperator->info;
SSnapContext* sContext = pInfo->sContext;
@@ -866,7 +866,7 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
qError("setForSnapShot error. uid:%" PRIu64 " ,version:%" PRId64, pOffset->uid, pOffset->version);
return -1;
}
- qDebug("tmqsnap qStreamPrepareScan snapshot meta uid %ld ts %"PRId64, pOffset->uid, pOffset->ts);
+ qDebug("tmqsnap qStreamPrepareScan snapshot meta uid %" PRId64 " ts %" PRId64, pOffset->uid, pOffset->ts);
} else if (pOffset->type == TMQ_OFFSET__LOG) {
SStreamRawScanInfo* pInfo = pOperator->info;
tsdbReaderClose(pInfo->dataReader);
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 3e0b9d50d92c3e4e6e6ece75318b0894b30796f8..a6ca563d766d500c837fb19c38c292c5a8a4e432 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -570,6 +570,7 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc
}
pResult->info.groupId = pSrcBlock->info.groupId;
+ memcpy(pResult->info.parTbName, pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
// if the source equals to the destination, it is to create a new column as the result of scalar
// function or some operators.
@@ -1775,7 +1776,7 @@ int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code) {
} else {
taosMemoryFree(pMsg->pData);
pSourceDataInfo->code = code;
- qDebug("%s fetch rsp received, index:%d, code:%s", pSourceDataInfo->taskId, index, tstrerror(code));
+ qDebug("%s fetch rsp received, index:%d, error:%s", pSourceDataInfo->taskId, index, tstrerror(code));
}
pSourceDataInfo->status = EX_SOURCE_DATA_READY;
@@ -4146,42 +4147,6 @@ int32_t getOperatorExplainExecInfo(SOperatorInfo* operatorInfo, SArray* pExecInf
return TSDB_CODE_SUCCESS;
}
-int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx, int32_t numOfOutput,
- int32_t size) {
- pSup->currentPageId = -1;
- pSup->resultRowSize = getResultRowSize(pCtx, numOfOutput);
- pSup->keySize = sizeof(int64_t) + sizeof(TSKEY);
- pSup->pKeyBuf = taosMemoryCalloc(1, pSup->keySize);
- _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- pSup->pResultRows = taosHashInit(1024, hashFn, false, HASH_NO_LOCK);
- if (pSup->pKeyBuf == NULL || pSup->pResultRows == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- pSup->valueSize = size;
-
- pSup->pScanBlock = createSpecialDataBlock(STREAM_CLEAR);
- int32_t pageSize = 4096;
- while (pageSize < pSup->resultRowSize * 4) {
- pageSize <<= 1u;
- }
- // at least four pages need to be in buffer
- int32_t bufSize = 4096 * 256;
- if (bufSize <= pageSize) {
- bufSize = pageSize * 4;
- }
- if (!osTempSpaceAvailable()) {
- terrno = TSDB_CODE_NO_AVAIL_DISK;
- qError("Init stream agg supporter failed since %s", terrstr(terrno));
- return terrno;
- }
- int32_t code = createDiskbasedBuf(&pSup->pResultBuf, pageSize, bufSize, pKey, tsTempDir);
- for (int32_t i = 0; i < numOfOutput; ++i) {
- pCtx[i].saveHandle.pBuf = pSup->pResultBuf;
- }
-
- return code;
-}
-
int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResult, int64_t tableGroupId,
SqlFunctionCtx* pCtx, int32_t numOfOutput, int32_t* rowEntryInfoOffset, SAggSupporter* pAggSup) {
SWinKey key = {
@@ -4191,7 +4156,6 @@ int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResul
char* value = NULL;
int32_t size = pAggSup->resultRowSize;
- tSimpleHashPut(pAggSup->pResultRowHashTable, &key, sizeof(SWinKey), NULL, 0);
if (streamStateAddIfNotExist(pState, &key, (void**)&value, &size) < 0) {
return TSDB_CODE_QRY_OUT_OF_MEMORY;
}
@@ -4296,3 +4260,108 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pStat
blockDataUpdateTsWindow(pBlock, 0);
return TSDB_CODE_SUCCESS;
}
+
+int32_t saveSessionDiscBuf(SStreamState* pState, SSessionKey* key, void* buf, int32_t size) {
+ streamStateSessionPut(pState, key, (const void*)buf, size);
+ releaseOutputBuf(pState, NULL, (SResultRow*)buf);
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pState, SSDataBlock* pBlock,
+ SExprSupp* pSup, SGroupResInfo* pGroupResInfo) {
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SExprInfo* pExprInfo = pSup->pExprInfo;
+ int32_t numOfExprs = pSup->numOfExprs;
+ int32_t* rowEntryOffset = pSup->rowEntryInfoOffset;
+ SqlFunctionCtx* pCtx = pSup->pCtx;
+
+ int32_t numOfRows = getNumOfTotalRes(pGroupResInfo);
+
+ for (int32_t i = pGroupResInfo->index; i < numOfRows; i += 1) {
+ SSessionKey* pKey = taosArrayGet(pGroupResInfo->pRows, i);
+ int32_t size = 0;
+ void* pVal = NULL;
+ int32_t code = streamStateSessionGet(pState, pKey, &pVal, &size);
+ ASSERT(code == 0);
+ SResultRow* pRow = (SResultRow*)pVal;
+ doUpdateNumOfRows(pCtx, pRow, numOfExprs, rowEntryOffset);
+ // no results, continue to check the next one
+ if (pRow->numOfRows == 0) {
+ pGroupResInfo->index += 1;
+ releaseOutputBuf(pState, NULL, pRow);
+ continue;
+ }
+
+ if (pBlock->info.groupId == 0) {
+ pBlock->info.groupId = pKey->groupId;
+
+ if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE) {
+ SStreamStateAggOperatorInfo* pInfo = pOperator->info;
+
+ char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
+ if (tbname != NULL) {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
+ } else {
+ pBlock->info.parTbName[0] = 0;
+ }
+ } else if (pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION ||
+ pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_SESSION ||
+ pOperator->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
+ SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
+
+ char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t));
+ if (tbname != NULL) {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
+ } else {
+ pBlock->info.parTbName[0] = 0;
+ }
+ } else {
+ ASSERT(0);
+ }
+
+ } else {
+ // current value belongs to different group, it can't be packed into one datablock
+ if (pBlock->info.groupId != pKey->groupId) {
+ releaseOutputBuf(pState, NULL, pRow);
+ break;
+ }
+ }
+
+ if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
+ ASSERT(pBlock->info.rows > 0);
+ releaseOutputBuf(pState, NULL, pRow);
+ break;
+ }
+
+ pGroupResInfo->index += 1;
+
+ for (int32_t j = 0; j < numOfExprs; ++j) {
+ int32_t slotId = pExprInfo[j].base.resSchema.slotId;
+
+ pCtx[j].resultInfo = getResultEntryInfo(pRow, j, rowEntryOffset);
+ if (pCtx[j].fpSet.finalize) {
+ int32_t code1 = pCtx[j].fpSet.finalize(&pCtx[j], pBlock);
+ if (TAOS_FAILED(code1)) {
+ qError("%s build result data block error, code %s", GET_TASKID(pTaskInfo), tstrerror(code1));
+ T_LONG_JMP(pTaskInfo->env, code1);
+ }
+ } else if (strcmp(pCtx[j].pExpr->pExpr->_function.functionName, "_select_value") == 0) {
+ // do nothing, todo refactor
+ } else {
+ // expand the result into multiple rows. E.g., _wstart, top(k, 20)
+ // the _wstart needs to copy to 20 following rows, since the results of top-k expands to 20 different rows.
+ SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, slotId);
+ char* in = GET_ROWCELL_INTERBUF(pCtx[j].resultInfo);
+ for (int32_t k = 0; k < pRow->numOfRows; ++k) {
+ colDataAppend(pColInfoData, pBlock->info.rows + k, in, pCtx[j].resultInfo->isNullRes);
+ }
+ }
+ }
+
+ pBlock->info.rows += pRow->numOfRows;
+ // saveSessionDiscBuf(pState, pKey, pVal, size);
+ releaseOutputBuf(pState, NULL, pRow);
+ }
+ blockDataUpdateTsWindow(pBlock, 0);
+ return TSDB_CODE_SUCCESS;
+}
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 62ac94dd6000f56a601cf20d69d086474a32841a..cdc59deee1c77578e37249cc06a03c7d010fe346 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -1195,23 +1195,22 @@ static int32_t generateSessionScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSr
SColumnInfoData* pDestGpCol = taosArrayGet(pDestBlock->pDataBlock, GROUPID_COLUMN_INDEX);
SColumnInfoData* pDestCalStartTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_START_TS_COLUMN_INDEX);
SColumnInfoData* pDestCalEndTsCol = taosArrayGet(pDestBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX);
- int32_t dummy = 0;
int64_t version = pSrcBlock->info.version - 1;
for (int32_t i = 0; i < pSrcBlock->info.rows; i++) {
uint64_t groupId = getGroupIdByData(pInfo, uidCol[i], startData[i], version);
// gap must be 0.
- SResultWindowInfo* pStartWin =
- getCurSessionWindow(pInfo->windowSup.pStreamAggSup, startData[i], endData[i], groupId, 0, &dummy);
- if (!pStartWin) {
+ SSessionKey startWin = {0};
+ getCurSessionWindow(pInfo->windowSup.pStreamAggSup, startData[i], endData[i], groupId, &startWin);
+ if (IS_INVALID_SESSION_WIN_KEY(startWin)) {
// window has been closed.
continue;
}
- SResultWindowInfo* pEndWin =
- getCurSessionWindow(pInfo->windowSup.pStreamAggSup, endData[i], endData[i], groupId, 0, &dummy);
- ASSERT(pEndWin);
- TSKEY ts = INT64_MIN;
- colDataAppend(pDestStartCol, i, (const char*)&pStartWin->win.skey, false);
- colDataAppend(pDestEndCol, i, (const char*)&pEndWin->win.ekey, false);
+ SSessionKey endWin = {0};
+ getCurSessionWindow(pInfo->windowSup.pStreamAggSup, endData[i], endData[i], groupId, &endWin);
+ ASSERT(!IS_INVALID_SESSION_WIN_KEY(endWin));
+ colDataAppend(pDestStartCol, i, (const char*)&startWin.win.skey, false);
+ colDataAppend(pDestEndCol, i, (const char*)&endWin.win.ekey, false);
+
colDataAppendNULL(pDestUidCol, i);
colDataAppend(pDestGpCol, i, (const char*)&groupId, false);
colDataAppendNULL(pDestCalStartTsCol, i);
@@ -1556,7 +1555,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
tsdbReaderClose(pTSInfo->dataReader);
pTSInfo->dataReader = NULL;
tqOffsetResetToLog(&pTaskInfo->streamInfo.prepareStatus, pTaskInfo->streamInfo.snapshotVer);
- qDebug("queue scan tsdb over, switch to wal ver %"PRId64, pTaskInfo->streamInfo.snapshotVer + 1);
+ qDebug("queue scan tsdb over, switch to wal ver %" PRId64 "", pTaskInfo->streamInfo.snapshotVer + 1);
if (tqSeekVer(pInfo->tqReader, pTaskInfo->streamInfo.snapshotVer + 1) < 0) {
return NULL;
}
@@ -1989,7 +1988,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
longjmp(pTaskInfo->env, terrno);
}
- qDebug("tmqsnap doRawScan get data uid:%ld", pBlock->info.uid);
+ qDebug("tmqsnap doRawScan get data uid:%" PRId64 "", pBlock->info.uid);
pTaskInfo->streamInfo.lastStatus.type = TMQ_OFFSET__SNAPSHOT_DATA;
pTaskInfo->streamInfo.lastStatus.uid = pBlock->info.uid;
pTaskInfo->streamInfo.lastStatus.ts = pBlock->info.window.ekey;
@@ -2005,7 +2004,7 @@ static SSDataBlock* doRawScan(SOperatorInfo* pOperator) {
} else {
pTaskInfo->streamInfo.prepareStatus.uid = mtInfo.uid;
pTaskInfo->streamInfo.prepareStatus.ts = INT64_MIN;
- qDebug("tmqsnap change get data uid:%ld", mtInfo.uid);
+ qDebug("tmqsnap change get data uid:%" PRId64 "", mtInfo.uid);
qStreamPrepareScan(pTaskInfo, &pTaskInfo->streamInfo.prepareStatus, pInfo->sContext->subType);
}
tDeleteSSchemaWrapper(mtInfo.schema);
diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c
index 5ebf8521e05b3d1704fbc67c4554e33966894b0d..7d54d243ef067f1d339bfaea2a73a28a1f18d0dc 100644
--- a/source/libs/executor/src/tfill.c
+++ b/source/libs/executor/src/tfill.c
@@ -705,7 +705,7 @@ void* destroyStreamFillSupporter(SStreamFillSupporter* pFillSup) {
pFillSup->pAllColInfo = destroyFillColumnInfo(pFillSup->pAllColInfo, pFillSup->numOfFillCols, pFillSup->numOfAllCols);
tSimpleHashCleanup(pFillSup->pResMap);
pFillSup->pResMap = NULL;
- streamStateReleaseBuf(NULL, NULL, pFillSup->cur.pRowVal);
+ releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal);
pFillSup->cur.pRowVal = NULL;
taosMemoryFree(pFillSup);
@@ -748,7 +748,7 @@ static void resetFillWindow(SResultRowData* pRowData) {
void resetPrevAndNextWindow(SStreamFillSupporter* pFillSup, SStreamState* pState) {
resetFillWindow(&pFillSup->prev);
- streamStateReleaseBuf(NULL, NULL, pFillSup->cur.pRowVal);
+ releaseOutputBuf(NULL, NULL, (SResultRow*)pFillSup->cur.pRowVal);
resetFillWindow(&pFillSup->cur);
resetFillWindow(&pFillSup->next);
resetFillWindow(&pFillSup->nextNext);
@@ -1504,6 +1504,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
case STREAM_NORMAL:
case STREAM_INVALID: {
doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock);
+ memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
pInfo->srcRowIndex = 0;
} break;
default:
@@ -1514,6 +1515,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
doStreamFillImpl(pOperator);
doFilter(pInfo->pCondition, pInfo->pRes, pInfo->pColMatchColInfo, NULL);
+ memcpy(pInfo->pRes->info.parTbName, pInfo->pSrcBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
if (pInfo->pRes->info.rows > 0) {
break;
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index 3e43b30cd0362f4a13644aa6b0adeb3c67090af9..a1a19a09c5097204f8252b3edd0bb5d1af067b77 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -38,8 +38,6 @@ typedef struct SOpenWindowInfo {
uint64_t groupId;
} SOpenWindowInfo;
-static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator);
-
static int64_t* extractTsCol(SSDataBlock* pBlock, const SIntervalAggOperatorInfo* pInfo);
static SResultRowPosition addToOpenWindowList(SResultRowInfo* pResultRowInfo, const SResultRow* pResult,
@@ -828,31 +826,9 @@ int32_t compareResKey(void* pKey, void* data, int32_t index) {
return -1;
}
-static int32_t saveResult(int64_t ts, int32_t pageId, int32_t offset, uint64_t groupId, SArray* pUpdated) {
- int32_t size = taosArrayGetSize(pUpdated);
- SWinKey data = {.ts = ts, .groupId = groupId};
- int32_t index = binarySearchCom(pUpdated, size, &data, TSDB_ORDER_DESC, compareResKey);
- if (index == -1) {
- index = 0;
- } else {
- if (compareResKey(&data, pUpdated, index) > 0) {
- index++;
- } else {
- return TSDB_CODE_SUCCESS;
- }
- }
-
- SResKeyPos* newPos = taosMemoryMalloc(sizeof(SResKeyPos) + sizeof(uint64_t));
- if (newPos == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- newPos->groupId = groupId;
- newPos->pos = (SResultRowPosition){.pageId = pageId, .offset = offset};
- *(int64_t*)newPos->key = ts;
- if (taosArrayInsert(pUpdated, index, &newPos) == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- return TSDB_CODE_SUCCESS;
+static int32_t saveResult(SResultWindowInfo winInfo, SSHashObj* pStUpdated) {
+ winInfo.sessionWin.win.ekey = winInfo.sessionWin.win.skey;
+ return tSimpleHashPut(pStUpdated, &winInfo.sessionWin, sizeof(SSessionKey), &winInfo, sizeof(SResultWindowInfo));
}
static int32_t saveWinResult(int64_t ts, int32_t pageId, int32_t offset, uint64_t groupId, SHashObj* pUpdatedMap) {
@@ -874,10 +850,6 @@ static int32_t saveWinResultInfo(TSKEY ts, uint64_t groupId, SHashObj* pUpdatedM
return saveWinResult(ts, -1, -1, groupId, pUpdatedMap);
}
-static int32_t saveResultRow(SResultRow* result, uint64_t groupId, SArray* pUpdated) {
- return saveResult(result->win.skey, result->pageId, result->offset, groupId, pUpdated);
-}
-
static void removeResults(SArray* pWins, SHashObj* pUpdatedMap) {
int32_t size = taosArrayGetSize(pWins);
for (int32_t i = 0; i < size; i++) {
@@ -915,8 +887,8 @@ int32_t compareWinRes(void* pKey, void* data, int32_t index) {
}
static void removeDeleteResults(SHashObj* pUpdatedMap, SArray* pDelWins) {
- taosArraySort(pDelWins, sWinKeyCmprImpl);
- taosArrayRemoveDuplicate(pDelWins, sWinKeyCmprImpl, NULL);
+ taosArraySort(pDelWins, winKeyCmprImpl);
+ taosArrayRemoveDuplicate(pDelWins, winKeyCmprImpl, NULL);
int32_t delSize = taosArrayGetSize(pDelWins);
if (taosHashGetSize(pUpdatedMap) == 0 || delSize == 0) {
return;
@@ -1385,19 +1357,6 @@ static void doClearWindowImpl(SResultRowPosition* p1, SDiskbasedBuf* pResultBuf,
releaseBufPage(pResultBuf, bufPage);
}
-static bool doClearWindow(SAggSupporter* pAggSup, SExprSupp* pSup, char* pData, int16_t bytes, uint64_t groupId,
- int32_t numOfOutput) {
- SET_RES_WINDOW_KEY(pAggSup->keyBuf, pData, bytes, groupId);
- SResultRowPosition* p1 =
- (SResultRowPosition*)tSimpleHashGet(pAggSup->pResultRowHashTable, pAggSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
- if (!p1) {
- // window has been closed
- return false;
- }
- doClearWindowImpl(p1, pAggSup->pResultBuf, pSup, numOfOutput);
- return true;
-}
-
static bool doDeleteWindow(SOperatorInfo* pOperator, TSKEY ts, uint64_t groupId) {
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
SWinKey key = {.ts = ts, .groupId = groupId};
@@ -1455,73 +1414,6 @@ static void doDeleteWindows(SOperatorInfo* pOperator, SInterval* pInterval, SSDa
}
}
-bool doDeleteIntervalWindow(SAggSupporter* pAggSup, TSKEY ts, uint64_t groupId) {
- size_t bytes = sizeof(TSKEY);
- SET_RES_WINDOW_KEY(pAggSup->keyBuf, &ts, bytes, groupId);
- SResultRowPosition* p1 =
- (SResultRowPosition*)tSimpleHashGet(pAggSup->pResultRowHashTable, pAggSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
- if (!p1) {
- // window has been closed
- return false;
- }
- tSimpleHashRemove(pAggSup->pResultRowHashTable, pAggSup->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
- return true;
-}
-
-static void doDeleteSpecifyIntervalWindow(SAggSupporter* pAggSup, STimeWindowAggSupp* pTwSup, SSDataBlock* pBlock,
- SArray* pDelWins, SInterval* pInterval, SHashObj* pUpdatedMap) {
- SColumnInfoData* pStartCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
- TSKEY* tsStarts = (TSKEY*)pStartCol->pData;
- SColumnInfoData* pEndCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
- TSKEY* tsEnds = (TSKEY*)pEndCol->pData;
- SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
- uint64_t* groupIds = (uint64_t*)pGroupCol->pData;
- int64_t numOfWin = tSimpleHashGetSize(pAggSup->pResultRowHashTable);
- for (int32_t i = 0; i < pBlock->info.rows; i++) {
- TSKEY startTs = TMAX(tsStarts[i], pTwSup->minTs);
- TSKEY endTs = TMIN(tsEnds[i], pTwSup->maxTs);
- SResultRowInfo dumyInfo = {0};
- dumyInfo.cur.pageId = -1;
- STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTs, pInterval, TSDB_ORDER_ASC);
- do {
- doDeleteIntervalWindow(pAggSup, win.skey, groupIds[i]);
- SWinKey winRes = {.ts = win.skey, .groupId = groupIds[i]};
- if (pDelWins) {
- taosArrayPush(pDelWins, &winRes);
- }
- if (pUpdatedMap) {
- taosHashRemove(pUpdatedMap, &winRes, sizeof(SWinKey));
- }
- getNextTimeWindow(pInterval, pInterval->precision, TSDB_ORDER_ASC, &win);
- } while (win.skey <= endTs);
- }
-}
-
-static void doClearWindows(SAggSupporter* pAggSup, SExprSupp* pSup1, SInterval* pInterval, int32_t numOfOutput,
- SSDataBlock* pBlock, SArray* pUpWins) {
- SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
- TSKEY* startTsCols = (TSKEY*)pStartTsCol->pData;
- SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
- TSKEY* endTsCols = (TSKEY*)pEndTsCol->pData;
- SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
- uint64_t* pGpDatas = (uint64_t*)pGpCol->pData;
- for (int32_t i = 0; i < pBlock->info.rows; i++) {
- SResultRowInfo dumyInfo = {0};
- dumyInfo.cur.pageId = -1;
-
- STimeWindow win = getActiveTimeWindow(NULL, &dumyInfo, startTsCols[i], pInterval, TSDB_ORDER_ASC);
- while (win.ekey <= endTsCols[i]) {
- uint64_t winGpId = pGpDatas[i];
- bool res = doClearWindow(pAggSup, pSup1, (char*)&win.skey, sizeof(TSKEY), winGpId, numOfOutput);
- if (pUpWins && res) {
- SWinKey winRes = {.ts = win.skey, .groupId = winGpId};
- taosArrayPush(pUpWins, &winRes);
- }
- getNextTimeWindow(pInterval, pInterval->precision, TSDB_ORDER_ASC, &win);
- }
- }
-}
-
static int32_t getAllIntervalWindow(SSHashObj* pHashMap, SHashObj* resWins) {
void* pIte = NULL;
size_t keyLen = 0;
@@ -1725,6 +1617,9 @@ static void destroyStateWindowOperatorInfo(void* param) {
cleanupBasicInfo(&pInfo->binfo);
taosMemoryFreeClear(pInfo->stateKey.pData);
cleanupExprSupp(&pInfo->scalarSup);
+ colDataDestroy(&pInfo->twAggSup.timeWindowData);
+ cleanupAggSup(&pInfo->aggSup);
+ cleanupGroupResInfo(&pInfo->groupResInfo);
taosMemoryFreeClear(param);
}
@@ -2922,11 +2817,12 @@ bool hasIntervalWindow(SStreamState* pState, SWinKey* pKey) {
return TSDB_CODE_SUCCESS == streamStateGet(pState, pKey, NULL, 0);
}
-static void rebuildIntervalWindow(SOperatorInfo* pOperator, SExprSupp* pSup, SArray* pWinArray, SHashObj* pUpdatedMap) {
+static void rebuildIntervalWindow(SOperatorInfo* pOperator, SArray* pWinArray, SHashObj* pUpdatedMap) {
SStreamIntervalOperatorInfo* pInfo = pOperator->info;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
int32_t size = taosArrayGetSize(pWinArray);
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
+ SExprSupp* pSup = &pOperator->exprSupp;
if (!pInfo->pChildren) {
return;
}
@@ -2934,8 +2830,7 @@ static void rebuildIntervalWindow(SOperatorInfo* pOperator, SExprSupp* pSup, SAr
SWinKey* pWinRes = taosArrayGet(pWinArray, i);
SResultRow* pCurResult = NULL;
STimeWindow parentWin = getFinalTimeWindow(pWinRes->ts, &pInfo->interval);
- if (isDeletedStreamWindow(&parentWin, pWinRes->groupId, pInfo->pState, &pInfo->twAggSup) &&
- isCloseWindow(&parentWin, &pInfo->twAggSup)) {
+ if (isDeletedStreamWindow(&parentWin, pWinRes->groupId, pInfo->pState, &pInfo->twAggSup)) {
continue;
}
@@ -3222,6 +3117,14 @@ static void doStreamIntervalAggImpl(SOperatorInfo* pOperatorInfo, SSDataBlock* p
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pUpdatedMap) {
saveWinResultInfo(pResult->win.skey, groupId, pUpdatedMap);
}
+
+ if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE) {
+ SWinKey key = {
+ .ts = pResult->win.skey,
+ .groupId = groupId,
+ };
+ tSimpleHashPut(pInfo->aggSup.pResultRowHashTable, &key, sizeof(SWinKey), NULL, 0);
+ }
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &nextWin, true);
doApplyFunctions(pTaskInfo, pSup->pCtx, &pInfo->twAggSup.timeWindowData, startPos, forwardRows,
pSDataBlock->info.rows, numOfOutput);
@@ -3337,7 +3240,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
SStreamIntervalOperatorInfo* pChildInfo = pChildOp->info;
SExprSupp* pChildSup = &pChildOp->exprSupp;
doDeleteWindows(pChildOp, &pChildInfo->interval, pBlock, NULL, NULL);
- rebuildIntervalWindow(pOperator, pSup, delWins, pUpdatedMap);
+ rebuildIntervalWindow(pOperator, delWins, pUpdatedMap);
addRetriveWindow(delWins, pInfo);
taosArrayAddAll(pInfo->pDelWins, delWins);
taosArrayDestroy(delWins);
@@ -3563,42 +3466,18 @@ _error:
}
void destroyStreamAggSupporter(SStreamAggSupporter* pSup) {
- taosMemoryFreeClear(pSup->pKeyBuf);
- void** pIte = NULL;
- while ((pIte = taosHashIterate(pSup->pResultRows, pIte)) != NULL) {
- SArray* pWins = (SArray*)(*pIte);
- taosArrayDestroy(pWins);
- }
- taosHashCleanup(pSup->pResultRows);
- destroyDiskbasedBuf(pSup->pResultBuf);
- blockDataDestroy(pSup->pScanBlock);
-}
-
-void destroyStateWinInfo(void* ptr) {
- if (ptr == NULL) {
- return;
- }
- SStateWindowInfo* pWin = (SStateWindowInfo*)ptr;
- taosMemoryFreeClear(pWin->stateKey.pData);
-}
-
-void destroyStateStreamAggSupporter(SStreamAggSupporter* pSup) {
- taosMemoryFreeClear(pSup->pKeyBuf);
- void** pIte = NULL;
- while ((pIte = taosHashIterate(pSup->pResultRows, pIte)) != NULL) {
- SArray* pWins = (SArray*)(*pIte);
- taosArrayDestroyEx(pWins, (FDelete)destroyStateWinInfo);
- }
- taosHashCleanup(pSup->pResultRows);
+ tSimpleHashCleanup(pSup->pResultRows);
destroyDiskbasedBuf(pSup->pResultBuf);
blockDataDestroy(pSup->pScanBlock);
+ taosMemoryFreeClear(pSup->pState);
+ taosMemoryFreeClear(pSup->pDummyCtx);
}
void destroyStreamSessionAggOperatorInfo(void* param) {
SStreamSessionAggOperatorInfo* pInfo = (SStreamSessionAggOperatorInfo*)param;
cleanupBasicInfo(&pInfo->binfo);
destroyStreamAggSupporter(&pInfo->streamAggSup);
- cleanupGroupResInfo(&pInfo->groupResInfo);
+
if (pInfo->pChildren != NULL) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
@@ -3612,8 +3491,7 @@ void destroyStreamSessionAggOperatorInfo(void* param) {
blockDataDestroy(pInfo->pDelRes);
blockDataDestroy(pInfo->pWinBlock);
blockDataDestroy(pInfo->pUpdateRes);
- destroySqlFunctionCtx(pInfo->pDummyCtx, 0);
- taosHashCleanup(pInfo->pStDeleted);
+ tSimpleHashCleanup(pInfo->pStDeleted);
taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
@@ -3642,129 +3520,62 @@ void initDummyFunction(SqlFunctionCtx* pDummy, SqlFunctionCtx* pCtx, int32_t num
}
}
-void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int64_t gap, int64_t waterMark,
- uint16_t type, int32_t tsColIndex) {
+void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int64_t waterMark, uint16_t type,
+ int32_t tsColIndex) {
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION) {
SStreamPartitionOperatorInfo* pScanInfo = downstream->info;
pScanInfo->tsColIndex = tsColIndex;
}
if (downstream->operatorType != QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN) {
- initDownStream(downstream->pDownstream[0], pAggSup, gap, waterMark, type, tsColIndex);
+ initDownStream(downstream->pDownstream[0], pAggSup, waterMark, type, tsColIndex);
return;
}
SStreamScanInfo* pScanInfo = downstream->info;
- pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = gap, .parentType = type};
+ pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type};
pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
}
-int32_t initSessionAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx,
- int32_t numOfOutput) {
- return initStreamAggSupporter(pSup, pKey, pCtx, numOfOutput, sizeof(SResultWindowInfo));
-}
-
-SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
- SExecTaskInfo* pTaskInfo) {
- SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
- int32_t numOfCols = 0;
- int32_t code = TSDB_CODE_OUT_OF_MEMORY;
-
- SStreamSessionAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL) {
- goto _error;
- }
-
- pOperator->pTaskInfo = pTaskInfo;
-
- initResultSizeInfo(&pOperator->resultInfo, 4096);
- if (pSessionNode->window.pExprs != NULL) {
- int32_t numOfScalar = 0;
- SExprInfo* pScalarExprInfo = createExprInfo(pSessionNode->window.pExprs, NULL, &numOfScalar);
- code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
+int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, int64_t gap,
+ SStreamState* pState, int32_t keySize, int16_t keyType) {
+ pSup->resultRowSize = keySize + getResultRowSize(pCtx, numOfOutput);
+ pSup->pScanBlock = createSpecialDataBlock(STREAM_CLEAR);
+ pSup->gap = gap;
+ pSup->stateKeySize = keySize;
+ pSup->stateKeyType = keyType;
+ pSup->pDummyCtx = (SqlFunctionCtx*)taosMemoryCalloc(numOfOutput, sizeof(SqlFunctionCtx));
+ if (pSup->pDummyCtx == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
}
- SExprSupp* pSup = &pOperator->exprSupp;
-
- SExprInfo* pExprInfo = createExprInfo(pSessionNode->window.pFuncs, NULL, &numOfCols);
- SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
- code = initBasicInfoEx(&pInfo->binfo, pSup, pExprInfo, numOfCols, pResBlock);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
+ initDummyFunction(pSup->pDummyCtx, pCtx, numOfOutput);
+ pSup->pState = taosMemoryCalloc(1, sizeof(SStreamState));
+ *(pSup->pState) = *pState;
+ streamStateSetNumber(pSup->pState, -1);
- code = initSessionAggSupporter(&pInfo->streamAggSup, "StreamSessionAggOperatorInfo", pSup->pCtx, numOfCols);
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
+ _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
+ pSup->pResultRows = tSimpleHashInit(32, hashFn);
- pInfo->pDummyCtx = (SqlFunctionCtx*)taosMemoryCalloc(numOfCols, sizeof(SqlFunctionCtx));
- if (pInfo->pDummyCtx == NULL) {
- goto _error;
+ int32_t pageSize = 4096;
+ while (pageSize < pSup->resultRowSize * 4) {
+ pageSize <<= 1u;
}
-
- initDummyFunction(pInfo->pDummyCtx, pSup->pCtx, numOfCols);
- pInfo->twAggSup = (STimeWindowAggSupp){
- .waterMark = pSessionNode->window.watermark,
- .calTrigger = pSessionNode->window.triggerType,
- .maxTs = INT64_MIN,
- .minTs = INT64_MAX,
- };
-
- initResultRowInfo(&pInfo->binfo.resultRowInfo);
- initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
-
- pInfo->primaryTsIndex = ((SColumnNode*)pSessionNode->window.pTspk)->slotId;
- if (pSessionNode->window.pTsEnd) {
- pInfo->endTsIndex = ((SColumnNode*)pSessionNode->window.pTsEnd)->slotId;
+ // at least four pages need to be in buffer
+ int32_t bufSize = 4096 * 256;
+ if (bufSize <= pageSize) {
+ bufSize = pageSize * 4;
}
- pInfo->gap = pSessionNode->gap;
- pInfo->binfo.pRes = pResBlock;
- pInfo->order = TSDB_ORDER_ASC;
- _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- pInfo->pStDeleted = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
- pInfo->pDelIterator = NULL;
- pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
- pInfo->pChildren = NULL;
- pInfo->isFinal = false;
- pInfo->pPhyNode = pPhyNode;
- pInfo->ignoreExpiredData = pSessionNode->window.igExpired;
-
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
- pOperator->name = "StreamSessionWindowAggOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamSessionAgg, NULL, NULL, destroyStreamSessionAggOperatorInfo,
- aggEncodeResultRow, aggDecodeResultRow, NULL);
- if (downstream) {
- initDownStream(downstream, &pInfo->streamAggSup, pInfo->gap, pInfo->twAggSup.waterMark, pOperator->operatorType,
- pInfo->primaryTsIndex);
- code = appendDownstream(pOperator, &downstream, 1);
+ if (!osTempSpaceAvailable()) {
+ terrno = TSDB_CODE_NO_AVAIL_DISK;
+ qError("Init stream agg supporter failed since %s", terrstr(terrno));
+ return terrno;
}
- return pOperator;
-
-_error:
- if (pInfo != NULL) {
- destroyStreamSessionAggOperatorInfo(pInfo);
+ int32_t code = createDiskbasedBuf(&pSup->pResultBuf, pageSize, bufSize, "function", tsTempDir);
+ for (int32_t i = 0; i < numOfOutput; ++i) {
+ pCtx[i].saveHandle.pBuf = pSup->pResultBuf;
}
- taosMemoryFreeClear(pOperator);
- pTaskInfo->code = code;
- return NULL;
-}
-
-int64_t getSessionWindowEndkey(void* data, int32_t index) {
- SArray* pWinInfos = (SArray*)data;
- SResultWindowInfo* pWin = taosArrayGet(pWinInfos, index);
- return pWin->win.ekey;
+ return TSDB_CODE_SUCCESS;
}
bool isInTimeWindow(STimeWindow* pWin, TSKEY ts, int64_t gap) {
@@ -3774,305 +3585,241 @@ bool isInTimeWindow(STimeWindow* pWin, TSKEY ts, int64_t gap) {
return false;
}
-bool isInWindow(SResultWindowInfo* pWinInfo, TSKEY ts, int64_t gap) { return isInTimeWindow(&pWinInfo->win, ts, gap); }
-
-static SResultWindowInfo* insertNewSessionWindow(SArray* pWinInfos, TSKEY startTs, TSKEY endTs, int32_t index) {
- SResultWindowInfo win = {
- .pos.offset = -1, .pos.pageId = -1, .win.skey = startTs, .win.ekey = endTs, .isOutput = false};
- return taosArrayInsert(pWinInfos, index, &win);
-}
-
-static SResultWindowInfo* addNewSessionWindow(SArray* pWinInfos, TSKEY startTs, TSKEY endTs) {
- SResultWindowInfo win = {
- .pos.offset = -1, .pos.pageId = -1, .win.skey = startTs, .win.ekey = endTs, .isOutput = false};
- return taosArrayPush(pWinInfos, &win);
+bool isInWindow(SResultWindowInfo* pWinInfo, TSKEY ts, int64_t gap) {
+ return isInTimeWindow(&pWinInfo->sessionWin.win, ts, gap);
}
-SArray* getWinInfos(SStreamAggSupporter* pAggSup, uint64_t groupId) {
- void** ite = taosHashGet(pAggSup->pResultRows, &groupId, sizeof(uint64_t));
- SArray* pWinInfos = NULL;
- if (ite == NULL) {
- pWinInfos = taosArrayInit(1024, pAggSup->valueSize);
- taosHashPut(pAggSup->pResultRows, &groupId, sizeof(uint64_t), &pWinInfos, sizeof(void*));
- } else {
- pWinInfos = *ite;
+void getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
+ SSessionKey* pKey) {
+ pKey->win.skey = startTs;
+ pKey->win.ekey = endTs;
+ pKey->groupId = groupId;
+ int32_t code = streamStateSessionGetKey(pAggSup->pState, pKey, pKey);
+ if (code != TSDB_CODE_SUCCESS) {
+ SET_SESSION_WIN_KEY_INVALID(pKey);
}
- return pWinInfos;
}
-// don't add new window
-SResultWindowInfo* getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
- int64_t gap, int32_t* pIndex) {
- STimeWindow searchWin = {.skey = startTs, .ekey = endTs};
- SArray* pWinInfos = getWinInfos(pAggSup, groupId);
- pAggSup->pCurWins = pWinInfos;
+bool isInvalidSessionWin(SResultWindowInfo* pWinInfo) { return pWinInfo->sessionWin.win.skey == 0; }
- int32_t size = taosArrayGetSize(pWinInfos);
- if (size == 0) {
- return NULL;
- }
- // find the first position which is smaller than the key
- int32_t index = binarySearch(pWinInfos, size, startTs, TSDB_ORDER_DESC, getSessionWindowEndkey);
- SResultWindowInfo* pWin = NULL;
- if (index >= 0) {
- pWin = taosArrayGet(pWinInfos, index);
- if (isInWindow(pWin, startTs, gap) || isInTimeWindow(&searchWin, pWin->win.skey, gap)) {
- *pIndex = index;
- return pWin;
- }
+void setSessionOutputBuf(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
+ SResultWindowInfo* pCurWin) {
+ pCurWin->sessionWin.groupId = groupId;
+ pCurWin->sessionWin.win.skey = startTs - pAggSup->gap;
+ pCurWin->sessionWin.win.ekey = endTs + pAggSup->gap;
+ int32_t size = pAggSup->resultRowSize;
+ int32_t code = streamStateSessionAddIfNotExist(pAggSup->pState, &pCurWin->sessionWin, &pCurWin->pOutputBuf, &size);
+ if (code == TSDB_CODE_SUCCESS) {
+ pCurWin->isOutput = true;
+ } else {
+ pCurWin->sessionWin.win.skey = startTs;
+ pCurWin->sessionWin.win.ekey = endTs;
}
+}
- if (index + 1 < size) {
- pWin = taosArrayGet(pWinInfos, index + 1);
- if (isInWindow(pWin, startTs, gap) || isInTimeWindow(&searchWin, pWin->win.skey, gap)) {
- *pIndex = index + 1;
- return pWin;
- } else if (endTs != INT64_MIN && isInWindow(pWin, endTs, gap)) {
- *pIndex = index + 1;
- return pWin;
- }
+int32_t getSessionWinBuf(SStreamAggSupporter* pAggSup, SStreamStateCur* pCur, SResultWindowInfo* pWinInfo) {
+ int32_t size = 0;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &pWinInfo->sessionWin, (const void**)&pWinInfo->pOutputBuf, &size);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
}
-
- return NULL;
+ streamStateCurNext(pAggSup->pState, pCur);
+ return TSDB_CODE_SUCCESS;
+}
+void saveDeleteInfo(SArray* pWins, SSessionKey key) {
+ // key.win.ekey = key.win.skey;
+ taosArrayPush(pWins, &key);
}
-SResultWindowInfo* getSessionTimeWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endTs, uint64_t groupId,
- int64_t gap, int32_t* pIndex) {
- SArray* pWinInfos = getWinInfos(pAggSup, groupId);
- pAggSup->pCurWins = pWinInfos;
+void saveDeleteRes(SSHashObj* pStDelete, SSessionKey key) {
+ key.win.ekey = key.win.skey;
+ tSimpleHashPut(pStDelete, &key, sizeof(SSessionKey), NULL, 0);
+}
- int32_t size = taosArrayGetSize(pWinInfos);
- if (size == 0) {
- *pIndex = 0;
- return addNewSessionWindow(pWinInfos, startTs, endTs);
- }
- // find the first position which is smaller than the key
- int32_t index = binarySearch(pWinInfos, size, startTs, TSDB_ORDER_DESC, getSessionWindowEndkey);
- SResultWindowInfo* pWin = NULL;
- if (index >= 0) {
- pWin = taosArrayGet(pWinInfos, index);
- if (isInWindow(pWin, startTs, gap)) {
- *pIndex = index;
- return pWin;
- }
- }
+static void removeSessionResult(SSHashObj* pHashMap, SSHashObj* pResMap, SSessionKey key) {
+ key.win.ekey = key.win.skey;
+ tSimpleHashRemove(pHashMap, &key, sizeof(SSessionKey));
+ tSimpleHashRemove(pResMap, &key, sizeof(SSessionKey));
+}
- if (index + 1 < size) {
- pWin = taosArrayGet(pWinInfos, index + 1);
- if (isInWindow(pWin, startTs, gap)) {
- *pIndex = index + 1;
- return pWin;
- } else if (endTs != INT64_MIN && isInWindow(pWin, endTs, gap)) {
- *pIndex = index;
- return pWin;
- }
+static void removeSessionResults(SSHashObj* pHashMap, SArray* pWins) {
+ if (tSimpleHashGetSize(pHashMap) == 0) {
+ return;
}
-
- if (index == size - 1) {
- *pIndex = taosArrayGetSize(pWinInfos);
- return addNewSessionWindow(pWinInfos, startTs, endTs);
+ int32_t size = taosArrayGetSize(pWins);
+ for (int32_t i = 0; i < size; i++) {
+ SSessionKey* pWin = taosArrayGet(pWins, i);
+ if (!pWin) continue;
+ SSessionKey key = *pWin;
+ key.win.ekey = key.win.skey;
+ tSimpleHashRemove(pHashMap, &key, sizeof(SSessionKey));
}
- *pIndex = index + 1;
- return insertNewSessionWindow(pWinInfos, startTs, endTs, index + 1);
}
int32_t updateSessionWindowInfo(SResultWindowInfo* pWinInfo, TSKEY* pStartTs, TSKEY* pEndTs, uint64_t groupId,
- int32_t rows, int32_t start, int64_t gap, SHashObj* pStDeleted) {
+ int32_t rows, int32_t start, int64_t gap, SSHashObj* pResultRows, SSHashObj* pStUpdated,
+ SSHashObj* pStDeleted) {
for (int32_t i = start; i < rows; ++i) {
if (!isInWindow(pWinInfo, pStartTs[i], gap) && (!pEndTs || !isInWindow(pWinInfo, pEndTs[i], gap))) {
return i - start;
}
- if (pWinInfo->win.skey > pStartTs[i]) {
+ if (pWinInfo->sessionWin.win.skey > pStartTs[i]) {
if (pStDeleted && pWinInfo->isOutput) {
- SWinKey res = {.ts = pWinInfo->win.skey, .groupId = groupId};
- taosHashPut(pStDeleted, &res, sizeof(SWinKey), &res, sizeof(SWinKey));
- pWinInfo->isOutput = false;
+ saveDeleteRes(pStDeleted, pWinInfo->sessionWin);
}
- pWinInfo->win.skey = pStartTs[i];
+ removeSessionResult(pStUpdated, pResultRows, pWinInfo->sessionWin);
+ pWinInfo->sessionWin.win.skey = pStartTs[i];
}
- pWinInfo->win.ekey = TMAX(pWinInfo->win.ekey, pStartTs[i]);
+ pWinInfo->sessionWin.win.ekey = TMAX(pWinInfo->sessionWin.win.ekey, pStartTs[i]);
if (pEndTs) {
- pWinInfo->win.ekey = TMAX(pWinInfo->win.ekey, pEndTs[i]);
+ pWinInfo->sessionWin.win.ekey = TMAX(pWinInfo->sessionWin.win.ekey, pEndTs[i]);
}
}
return rows - start;
}
-static int32_t setWindowOutputBuf(SResultWindowInfo* pWinInfo, SResultRow** pResult, SqlFunctionCtx* pCtx,
- uint64_t groupId, int32_t numOfOutput, int32_t* rowEntryInfoOffset,
- SStreamAggSupporter* pAggSup, SExecTaskInfo* pTaskInfo) {
- assert(pWinInfo->win.skey <= pWinInfo->win.ekey);
- // too many time window in query
- int32_t size = taosArrayGetSize(pAggSup->pCurWins);
- if (pTaskInfo->execModel == OPTR_EXEC_MODEL_BATCH && size > MAX_INTERVAL_TIME_WINDOW) {
- T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_TOO_MANY_TIMEWINDOW);
- }
-
- if (pWinInfo->pos.pageId == -1) {
- *pResult = getNewResultRow(pAggSup->pResultBuf, &pAggSup->currentPageId, pAggSup->resultRowSize);
- if (*pResult == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- // add a new result set for a new group
- pWinInfo->pos.pageId = (*pResult)->pageId;
- pWinInfo->pos.offset = (*pResult)->offset;
- } else {
- *pResult = getResultRowByPos(pAggSup->pResultBuf, &pWinInfo->pos, true);
- if (!(*pResult)) {
- qError("getResultRowByPos return NULL, TID:%s", GET_TASKID(pTaskInfo));
- return TSDB_CODE_FAILED;
- }
- }
-
+static int32_t initSessionOutputBuf(SResultWindowInfo* pWinInfo, SResultRow** pResult, SqlFunctionCtx* pCtx,
+ int32_t numOfOutput, int32_t* rowEntryInfoOffset) {
+ ASSERT(pWinInfo->sessionWin.win.skey <= pWinInfo->sessionWin.win.ekey);
+ *pResult = (SResultRow*)pWinInfo->pOutputBuf;
// set time window for current result
- (*pResult)->win = pWinInfo->win;
+ (*pResult)->win = pWinInfo->sessionWin.win;
setResultRowInitCtx(*pResult, pCtx, numOfOutput, rowEntryInfoOffset);
return TSDB_CODE_SUCCESS;
}
-static int32_t doOneWindowAggImpl(int32_t tsColId, SOptrBasicInfo* pBinfo, SStreamAggSupporter* pAggSup,
- SColumnInfoData* pTimeWindowData, SSDataBlock* pSDataBlock,
- SResultWindowInfo* pCurWin, SResultRow** pResult, int32_t startIndex, int32_t winRows,
- int32_t numOutput, SOperatorInfo* pOperator) {
+static int32_t doOneWindowAggImpl(SColumnInfoData* pTimeWindowData, SResultWindowInfo* pCurWin, SResultRow** pResult,
+ int32_t startIndex, int32_t winRows, int32_t rows, int32_t numOutput,
+ SOperatorInfo* pOperator) {
SExprSupp* pSup = &pOperator->exprSupp;
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- SColumnInfoData* pColDataInfo = taosArrayGet(pSDataBlock->pDataBlock, tsColId);
- TSKEY* tsCols = (int64_t*)pColDataInfo->pData;
- int32_t code = setWindowOutputBuf(pCurWin, pResult, pSup->pCtx, pSDataBlock->info.groupId, numOutput,
- pSup->rowEntryInfoOffset, pAggSup, pTaskInfo);
+ int32_t code = initSessionOutputBuf(pCurWin, pResult, pSup->pCtx, numOutput, pSup->rowEntryInfoOffset);
if (code != TSDB_CODE_SUCCESS || (*pResult) == NULL) {
return TSDB_CODE_QRY_OUT_OF_MEMORY;
}
- updateTimeWindowInfo(pTimeWindowData, &pCurWin->win, false);
- doApplyFunctions(pTaskInfo, pSup->pCtx, pTimeWindowData, startIndex, winRows, pSDataBlock->info.rows, numOutput);
- SFilePage* bufPage = getBufPage(pAggSup->pResultBuf, pCurWin->pos.pageId);
- setBufPageDirty(bufPage, true);
- releaseBufPage(pAggSup->pResultBuf, bufPage);
+ updateTimeWindowInfo(pTimeWindowData, &pCurWin->sessionWin.win, false);
+ doApplyFunctions(pTaskInfo, pSup->pCtx, pTimeWindowData, startIndex, winRows, rows, numOutput);
return TSDB_CODE_SUCCESS;
}
-static int32_t doOneWindowAgg(SStreamSessionAggOperatorInfo* pInfo, SSDataBlock* pSDataBlock,
- SResultWindowInfo* pCurWin, SResultRow** pResult, int32_t startIndex, int32_t winRows,
- int32_t numOutput, SOperatorInfo* pOperator) {
- return doOneWindowAggImpl(pInfo->primaryTsIndex, &pInfo->binfo, &pInfo->streamAggSup, &pInfo->twAggSup.timeWindowData,
- pSDataBlock, pCurWin, pResult, startIndex, winRows, numOutput, pOperator);
+static bool doDeleteSessionWindow(SStreamAggSupporter* pAggSup, SSessionKey* pKey) {
+ streamStateSessionDel(pAggSup->pState, pKey);
+ tSimpleHashRemove(pAggSup->pResultRows, pKey, sizeof(SSessionKey));
+ return true;
+}
+
+static int32_t setSessionWinOutputInfo(SSHashObj* pStUpdated, SResultWindowInfo* pWinInfo) {
+ void* pVal = tSimpleHashGet(pStUpdated, &pWinInfo->sessionWin, sizeof(SSessionKey));
+ if (pVal) {
+ SResultWindowInfo* pWin = pVal;
+ pWinInfo->isOutput = pWin->isOutput;
+ }
+ return TSDB_CODE_SUCCESS;
}
-static int32_t doOneStateWindowAgg(SStreamStateAggOperatorInfo* pInfo, SSDataBlock* pSDataBlock,
- SResultWindowInfo* pCurWin, SResultRow** pResult, int32_t startIndex,
- int32_t winRows, int32_t numOutput, SOperatorInfo* pOperator) {
- return doOneWindowAggImpl(pInfo->primaryTsIndex, &pInfo->binfo, &pInfo->streamAggSup, &pInfo->twAggSup.timeWindowData,
- pSDataBlock, pCurWin, pResult, startIndex, winRows, numOutput, pOperator);
+SStreamStateCur* getNextSessionWinInfo(SStreamAggSupporter* pAggSup, SSHashObj* pStUpdated, SResultWindowInfo* pCurWin,
+ SResultWindowInfo* pNextWin) {
+ SStreamStateCur* pCur = streamStateSessionSeekKeyNext(pAggSup->pState, &pCurWin->sessionWin);
+ pNextWin->isOutput = true;
+ setSessionWinOutputInfo(pStUpdated, pNextWin);
+ int32_t size = 0;
+ pNextWin->sessionWin = pCurWin->sessionWin;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &pNextWin->sessionWin, (const void**)&pNextWin->pOutputBuf, &size);
+ if (code != TSDB_CODE_SUCCESS) {
+ SET_SESSION_WIN_INVALID(*pNextWin);
+ }
+ return pCur;
}
-int32_t getNumCompactWindow(SArray* pWinInfos, int32_t startIndex, int64_t gap) {
- SResultWindowInfo* pCurWin = taosArrayGet(pWinInfos, startIndex);
- int32_t size = taosArrayGetSize(pWinInfos);
+static void compactSessionWindow(SOperatorInfo* pOperator, SResultWindowInfo* pCurWin, SSHashObj* pStUpdated,
+ SSHashObj* pStDeleted) {
+ SExprSupp* pSup = &pOperator->exprSupp;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
+ SResultRow* pCurResult = NULL;
+ int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
+ SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
+ initSessionOutputBuf(pCurWin, &pCurResult, pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset);
// Just look for the window behind StartIndex
- for (int32_t i = startIndex + 1; i < size; i++) {
- SResultWindowInfo* pWinInfo = taosArrayGet(pWinInfos, i);
- if (!isInWindow(pCurWin, pWinInfo->win.skey, gap)) {
- return i - startIndex - 1;
+ while (1) {
+ SResultWindowInfo winInfo = {0};
+ SStreamStateCur* pCur = getNextSessionWinInfo(pAggSup, pStUpdated, pCurWin, &winInfo);
+ if (!IS_VALID_SESSION_WIN(winInfo) || !isInWindow(pCurWin, winInfo.sessionWin.win.skey, pAggSup->gap)) {
+ streamStateFreeCur(pCur);
+ break;
}
+ SResultRow* pWinResult = NULL;
+ initSessionOutputBuf(&winInfo, &pWinResult, pAggSup->pDummyCtx, numOfOutput, pSup->rowEntryInfoOffset);
+ pCurWin->sessionWin.win.ekey = TMAX(pCurWin->sessionWin.win.ekey, winInfo.sessionWin.win.ekey);
+ updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pCurWin->sessionWin.win, true);
+ compactFunctions(pSup->pCtx, pAggSup->pDummyCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData);
+ tSimpleHashRemove(pStUpdated, &winInfo.sessionWin, sizeof(SSessionKey));
+ if (winInfo.isOutput && pStDeleted) {
+ saveDeleteRes(pStDeleted, winInfo.sessionWin);
+ }
+ removeSessionResult(pStUpdated, pAggSup->pResultRows, winInfo.sessionWin);
+ doDeleteSessionWindow(pAggSup, &winInfo.sessionWin);
+ streamStateFreeCur(pCur);
}
-
- return size - startIndex - 1;
}
-void compactTimeWindow(SStreamSessionAggOperatorInfo* pInfo, int32_t startIndex, int32_t num, uint64_t groupId,
- int32_t numOfOutput, SHashObj* pStUpdated, SHashObj* pStDeleted, SOperatorInfo* pOperator) {
- SExprSupp* pSup = &pOperator->exprSupp;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- SResultWindowInfo* pCurWin = taosArrayGet(pInfo->streamAggSup.pCurWins, startIndex);
- SResultRow* pCurResult = NULL;
- setWindowOutputBuf(pCurWin, &pCurResult, pSup->pCtx, groupId, numOfOutput, pSup->rowEntryInfoOffset,
- &pInfo->streamAggSup, pTaskInfo);
- num += startIndex + 1;
- ASSERT(num <= taosArrayGetSize(pInfo->streamAggSup.pCurWins));
- // Just look for the window behind StartIndex
- for (int32_t i = startIndex + 1; i < num; i++) {
- SResultWindowInfo* pWinInfo = taosArrayGet(pInfo->streamAggSup.pCurWins, i);
- SResultRow* pWinResult = NULL;
- setWindowOutputBuf(pWinInfo, &pWinResult, pInfo->pDummyCtx, groupId, numOfOutput, pSup->rowEntryInfoOffset,
- &pInfo->streamAggSup, pTaskInfo);
- pCurWin->win.ekey = TMAX(pCurWin->win.ekey, pWinInfo->win.ekey);
- updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pCurWin->win, true);
- compactFunctions(pSup->pCtx, pInfo->pDummyCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData);
- taosHashRemove(pStUpdated, &pWinInfo->pos, sizeof(SResultRowPosition));
- if (pWinInfo->isOutput && pStDeleted) {
- SWinKey res = {.ts = pWinInfo->win.skey, .groupId = groupId};
- taosHashPut(pStDeleted, &res, sizeof(SWinKey), &res, sizeof(SWinKey));
- pWinInfo->isOutput = false;
- }
- taosArrayRemove(pInfo->streamAggSup.pCurWins, i);
- SFilePage* tmpPage = getBufPage(pInfo->streamAggSup.pResultBuf, pWinInfo->pos.pageId);
- releaseBufPage(pInfo->streamAggSup.pResultBuf, tmpPage);
- }
- SFilePage* bufPage = getBufPage(pInfo->streamAggSup.pResultBuf, pCurWin->pos.pageId);
- ASSERT(num > 0);
- setBufPageDirty(bufPage, true);
- releaseBufPage(pInfo->streamAggSup.pResultBuf, bufPage);
+int32_t saveSessionOutputBuf(SStreamAggSupporter* pAggSup, SResultWindowInfo* pWinInfo) {
+ saveSessionDiscBuf(pAggSup->pState, &pWinInfo->sessionWin, pWinInfo->pOutputBuf, pAggSup->resultRowSize);
+ return TSDB_CODE_SUCCESS;
}
-static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, SHashObj* pStUpdated,
- SHashObj* pStDeleted, bool hasEndTs) {
+static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, SSHashObj* pStUpdated,
+ SSHashObj* pStDeleted, bool hasEndTs) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
- bool masterScan = true;
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
uint64_t groupId = pSDataBlock->info.groupId;
- int64_t gap = pInfo->gap;
int64_t code = TSDB_CODE_SUCCESS;
+ SResultRow* pResult = NULL;
+ int32_t rows = pSDataBlock->info.rows;
+ int32_t winRows = 0;
- int32_t step = 1;
- bool ascScan = true;
- TSKEY* startTsCols = NULL;
- TSKEY* endTsCols = NULL;
- SResultRow* pResult = NULL;
- int32_t winRows = 0;
-
- ASSERT(pSDataBlock->pDataBlock);
SColumnInfoData* pStartTsCol = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex);
- startTsCols = (int64_t*)pStartTsCol->pData;
+ TSKEY* startTsCols = (int64_t*)pStartTsCol->pData;
SColumnInfoData* pEndTsCol = NULL;
if (hasEndTs) {
pEndTsCol = taosArrayGet(pSDataBlock->pDataBlock, pInfo->endTsIndex);
} else {
pEndTsCol = taosArrayGet(pSDataBlock->pDataBlock, pInfo->primaryTsIndex);
}
- endTsCols = (int64_t*)pEndTsCol->pData;
+ TSKEY* endTsCols = (int64_t*)pEndTsCol->pData;
SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
- for (int32_t i = 0; i < pSDataBlock->info.rows;) {
+ for (int32_t i = 0; i < rows;) {
if (pInfo->ignoreExpiredData && isOverdue(endTsCols[i], &pInfo->twAggSup)) {
i++;
continue;
}
- int32_t winIndex = 0;
- SResultWindowInfo* pCurWin = getSessionTimeWindow(pAggSup, startTsCols[i], endTsCols[i], groupId, gap, &winIndex);
- winRows = updateSessionWindowInfo(pCurWin, startTsCols, endTsCols, groupId, pSDataBlock->info.rows, i, pInfo->gap,
- pStDeleted);
- code = doOneWindowAgg(pInfo, pSDataBlock, pCurWin, &pResult, i, winRows, numOfOutput, pOperator);
+ SResultWindowInfo winInfo = {0};
+ setSessionOutputBuf(pAggSup, startTsCols[i], endTsCols[i], groupId, &winInfo);
+ setSessionWinOutputInfo(pStUpdated, &winInfo);
+ winRows = updateSessionWindowInfo(&winInfo, startTsCols, endTsCols, groupId, rows, i, pAggSup->gap,
+ pAggSup->pResultRows, pStUpdated, pStDeleted);
+ code = doOneWindowAggImpl(&pInfo->twAggSup.timeWindowData, &winInfo, &pResult, i, winRows, rows, numOfOutput,
+ pOperator);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
+ compactSessionWindow(pOperator, &winInfo, pStUpdated, pStDeleted);
+ saveSessionOutputBuf(pAggSup, &winInfo);
- int32_t winNum = getNumCompactWindow(pAggSup->pCurWins, winIndex, gap);
- if (winNum > 0) {
- compactTimeWindow(pInfo, winIndex, winNum, groupId, numOfOutput, pStUpdated, pStDeleted, pOperator);
- }
- pCurWin->isClosed = false;
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE && pStUpdated) {
- SWinKey value = {.ts = pCurWin->win.skey, .groupId = groupId};
- code = taosHashPut(pStUpdated, &pCurWin->pos, sizeof(SResultRowPosition), &value, sizeof(SWinKey));
+ code = saveResult(winInfo, pStUpdated);
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- pCurWin->isOutput = true;
}
+ if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE) {
+ SSessionKey key = winInfo.sessionWin;
+ key.win.ekey = key.win.skey;
+ tSimpleHashPut(pAggSup->pResultRows, &key, sizeof(SSessionKey), &winInfo, sizeof(SResultWindowInfo));
+ }
+
i += winRows;
}
}
@@ -4086,8 +3833,7 @@ void deleteWindow(SArray* pWinInfos, int32_t index, FDelete fp) {
taosArrayRemove(pWinInfos, index);
}
-static void doDeleteTimeWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock, int64_t gap, SArray* result,
- FDelete fp) {
+static void doDeleteTimeWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock, SArray* result) {
SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
TSKEY* startDatas = (TSKEY*)pStartTsCol->pData;
SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
@@ -4095,85 +3841,70 @@ static void doDeleteTimeWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBloc
SColumnInfoData* pGroupCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
uint64_t* gpDatas = (uint64_t*)pGroupCol->pData;
for (int32_t i = 0; i < pBlock->info.rows; i++) {
- int32_t winIndex = 0;
- SResultWindowInfo* pCurWin = getCurSessionWindow(pAggSup, startDatas[i], endDatas[i], gpDatas[i], gap, &winIndex);
- if (!pCurWin) {
- continue;
- }
-
- do {
- SResultWindowInfo delWin = *pCurWin;
- deleteWindow(pAggSup->pCurWins, winIndex, fp);
- if (result) {
- delWin.groupId = gpDatas[i];
- taosArrayPush(result, &delWin);
- }
- if (winIndex >= taosArrayGetSize(pAggSup->pCurWins)) {
+ while (1) {
+ SSessionKey curWin = {0};
+ getCurSessionWindow(pAggSup, startDatas[i], endDatas[i], gpDatas[i], &curWin);
+ if (IS_INVALID_SESSION_WIN_KEY(curWin)) {
break;
}
- pCurWin = taosArrayGet(pAggSup->pCurWins, winIndex);
- } while (pCurWin->win.skey <= endDatas[i]);
- }
-}
-
-static void doClearSessionWindows(SStreamAggSupporter* pAggSup, SExprSupp* pSup, SSDataBlock* pBlock, int32_t tsIndex,
- int32_t numOfOutput, int64_t gap, SArray* result) {
- SColumnInfoData* pColDataInfo = taosArrayGet(pBlock->pDataBlock, tsIndex);
- TSKEY* tsCols = (TSKEY*)pColDataInfo->pData;
- SColumnInfoData* pGpDataInfo = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
- uint64_t* gpCols = (uint64_t*)pGpDataInfo->pData;
- int32_t step = 0;
- for (int32_t i = 0; i < pBlock->info.rows; i += step) {
- int32_t winIndex = 0;
- SResultWindowInfo* pCurWin = getCurSessionWindow(pAggSup, tsCols[i], INT64_MIN, gpCols[i], gap, &winIndex);
- if (!pCurWin || pCurWin->pos.pageId == -1) {
- // window has been closed.
- step = 1;
- continue;
- }
- step = updateSessionWindowInfo(pCurWin, tsCols, NULL, 0, pBlock->info.rows, i, gap, NULL);
- ASSERT(isInWindow(pCurWin, tsCols[i], gap));
- doClearWindowImpl(&pCurWin->pos, pAggSup->pResultBuf, pSup, numOfOutput);
- if (result) {
- pCurWin->groupId = gpCols[i];
- taosArrayPush(result, pCurWin);
+ doDeleteSessionWindow(pAggSup, &curWin);
+ if (result) {
+ saveDeleteInfo(result, curWin);
+ }
}
}
}
-static int32_t copyUpdateResult(SHashObj* pStUpdated, SArray* pUpdated) {
- void* pData = NULL;
- size_t keyLen = 0;
- while ((pData = taosHashIterate(pStUpdated, pData)) != NULL) {
- void* key = taosHashGetKey(pData, &keyLen);
- ASSERT(keyLen == sizeof(SResultRowPosition));
- SResKeyPos* pos = taosMemoryMalloc(sizeof(SResKeyPos) + sizeof(uint64_t));
- if (pos == NULL) {
- return TSDB_CODE_QRY_OUT_OF_MEMORY;
- }
- pos->groupId = ((SWinKey*)pData)->groupId;
- pos->pos = *(SResultRowPosition*)key;
- *(int64_t*)pos->key = ((SWinKey*)pData)->ts;
- taosArrayPush(pUpdated, &pos);
+static inline int32_t sessionKeyCompareAsc(const void* pKey1, const void* pKey2) {
+ SSessionKey* pWin1 = (SSessionKey*)pKey1;
+ SSessionKey* pWin2 = (SSessionKey*)pKey2;
+
+ if (pWin1->groupId > pWin2->groupId) {
+ return 1;
+ } else if (pWin1->groupId < pWin2->groupId) {
+ return -1;
}
- taosArraySort(pUpdated, resultrowComparAsc);
- return TSDB_CODE_SUCCESS;
-}
-void doBuildDeleteDataBlock(SHashObj* pStDeleted, SSDataBlock* pBlock, void** Ite) {
- blockDataCleanup(pBlock);
- int32_t size = taosHashGetSize(pStDeleted);
- if (size == 0) {
+ if (pWin1->win.skey > pWin2->win.skey) {
+ return 1;
+ } else if (pWin1->win.skey < pWin2->win.skey) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static int32_t copyUpdateResult(SSHashObj* pStUpdated, SArray* pUpdated) {
+ void* pIte = NULL;
+ size_t keyLen = 0;
+ int32_t iter = 0;
+ while ((pIte = tSimpleHashIterate(pStUpdated, pIte, &iter)) != NULL) {
+ void* key = tSimpleHashGetKey(pIte, &keyLen);
+ ASSERT(keyLen == sizeof(SSessionKey));
+ taosArrayPush(pUpdated, key);
+ }
+ taosArraySort(pUpdated, sessionKeyCompareAsc);
+ return TSDB_CODE_SUCCESS;
+}
+
+void doBuildDeleteDataBlock(SSHashObj* pStDeleted, SSDataBlock* pBlock, void** Ite) {
+ blockDataCleanup(pBlock);
+ int32_t size = tSimpleHashGetSize(pStDeleted);
+ if (size == 0) {
return;
}
blockDataEnsureCapacity(pBlock, size);
- size_t keyLen = 0;
- while (((*Ite) = taosHashIterate(pStDeleted, *Ite)) != NULL) {
- SWinKey* res = *Ite;
+ size_t keyLen = 0;
+ int32_t iter = 0;
+ while (((*Ite) = tSimpleHashIterate(pStDeleted, *Ite, &iter)) != NULL) {
+ if (pBlock->info.rows + 1 > pBlock->info.capacity) {
+ break;
+ }
+ SSessionKey* res = tSimpleHashGetKey(*Ite, &keyLen);
SColumnInfoData* pStartTsCol = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
- colDataAppend(pStartTsCol, pBlock->info.rows, (const char*)&res->ts, false);
+ colDataAppend(pStartTsCol, pBlock->info.rows, (const char*)&res->win.skey, false);
SColumnInfoData* pEndTsCol = taosArrayGet(pBlock->pDataBlock, END_TS_COLUMN_INDEX);
- colDataAppend(pEndTsCol, pBlock->info.rows, (const char*)&res->ts, false);
+ colDataAppend(pEndTsCol, pBlock->info.rows, (const char*)&res->win.skey, false);
SColumnInfoData* pUidCol = taosArrayGet(pBlock->pDataBlock, UID_COLUMN_INDEX);
colDataAppendNULL(pUidCol, pBlock->info.rows);
SColumnInfoData* pGpCol = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
@@ -4183,167 +3914,137 @@ void doBuildDeleteDataBlock(SHashObj* pStDeleted, SSDataBlock* pBlock, void** It
SColumnInfoData* pCalEdCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX);
colDataAppendNULL(pCalEdCol, pBlock->info.rows);
pBlock->info.rows += 1;
- if (pBlock->info.rows + 1 >= pBlock->info.capacity) {
- break;
- }
}
if ((*Ite) == NULL) {
- taosHashClear(pStDeleted);
+ tSimpleHashClear(pStDeleted);
}
}
-static void rebuildTimeWindow(SStreamSessionAggOperatorInfo* pInfo, SArray* pWinArray, int32_t numOfOutput,
- SOperatorInfo* pOperator, SHashObj* pStUpdated) {
- SExprSupp* pSup = &pOperator->exprSupp;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- int32_t size = taosArrayGetSize(pWinArray);
+static void rebuildSessionWindow(SOperatorInfo* pOperator, SArray* pWinArray, SSHashObj* pStUpdated) {
+ SExprSupp* pSup = &pOperator->exprSupp;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ int32_t size = taosArrayGetSize(pWinArray);
+ SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
+ SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
+ int32_t numOfOutput = pSup->numOfExprs;
+ int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren);
ASSERT(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
- SResultWindowInfo* pParentWin = taosArrayGet(pWinArray, i);
- uint64_t groupId = pParentWin->groupId;
- int32_t numOfChildren = taosArrayGetSize(pInfo->pChildren);
+ SSessionKey* pWinKey = taosArrayGet(pWinArray, i);
+ int32_t num = 0;
+ SResultWindowInfo parentWin = {0};
for (int32_t j = 0; j < numOfChildren; j++) {
SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, j);
SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
- SArray* pChWins = getWinInfos(&pChInfo->streamAggSup, groupId);
- int32_t chWinSize = taosArrayGetSize(pChWins);
- int32_t index = binarySearch(pChWins, chWinSize, pParentWin->win.skey, TSDB_ORDER_DESC, getSessionWindowEndkey);
- if (index < 0) {
- index = 0;
- }
- for (int32_t k = index; k < chWinSize; k++) {
- SResultWindowInfo* pChWin = taosArrayGet(pChWins, k);
- if (pParentWin->win.skey <= pChWin->win.skey && pChWin->win.ekey <= pParentWin->win.ekey) {
- int32_t winIndex = 0;
- SResultWindowInfo* pNewParWin =
- getSessionTimeWindow(&pInfo->streamAggSup, pChWin->win.skey, pChWin->win.ekey, groupId, 0, &winIndex);
- SResultRow* pPareResult = NULL;
- setWindowOutputBuf(pNewParWin, &pPareResult, pSup->pCtx, groupId, numOfOutput, pSup->rowEntryInfoOffset,
- &pInfo->streamAggSup, pTaskInfo);
- SResultRow* pChResult = NULL;
- setWindowOutputBuf(pChWin, &pChResult, pChild->exprSupp.pCtx, groupId, numOfOutput,
- pChild->exprSupp.rowEntryInfoOffset, &pChInfo->streamAggSup, pTaskInfo);
- updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pNewParWin->win, true);
- compactFunctions(pSup->pCtx, pChild->exprSupp.pCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData);
-
- int32_t winNum = getNumCompactWindow(pInfo->streamAggSup.pCurWins, winIndex, pInfo->gap);
- if (winNum > 0) {
- compactTimeWindow(pInfo, winIndex, winNum, groupId, numOfOutput, pStUpdated, NULL, pOperator);
+ SStreamAggSupporter* pChAggSup = &pChInfo->streamAggSup;
+ SStreamStateCur* pCur = streamStateSessionGetCur(pChAggSup->pState, pWinKey);
+ SResultRow* pResult = NULL;
+ SResultRow* pChResult = NULL;
+ while (1) {
+ SResultWindowInfo childWin = {0};
+ childWin.sessionWin = *pWinKey;
+ int32_t code = getSessionWinBuf(pChAggSup, pCur, &childWin);
+ if (code == TSDB_CODE_SUCCESS && pWinKey->win.skey <= childWin.sessionWin.win.skey &&
+ childWin.sessionWin.win.ekey <= pWinKey->win.ekey) {
+ if (num == 0) {
+ setSessionOutputBuf(pAggSup, pWinKey->win.skey, pWinKey->win.ekey, pWinKey->groupId, &parentWin);
+ code = initSessionOutputBuf(&parentWin, &pResult, pSup->pCtx, numOfOutput, pSup->rowEntryInfoOffset);
+ if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
+ break;
+ }
}
-
- SFilePage* bufPage = getBufPage(pChInfo->streamAggSup.pResultBuf, pChWin->pos.pageId);
- releaseBufPage(pChInfo->streamAggSup.pResultBuf, bufPage);
-
- bufPage = getBufPage(pInfo->streamAggSup.pResultBuf, pNewParWin->pos.pageId);
- setBufPageDirty(bufPage, true);
- releaseBufPage(pInfo->streamAggSup.pResultBuf, bufPage);
- SWinKey value = {.ts = pNewParWin->win.skey, .groupId = groupId};
- taosHashPut(pStUpdated, &pNewParWin->pos, sizeof(SResultRowPosition), &value, sizeof(SWinKey));
- } else if (!pChWin->isClosed) {
+ num++;
+ updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &parentWin.sessionWin.win, true);
+ initSessionOutputBuf(&childWin, &pChResult, pChild->exprSupp.pCtx, numOfOutput,
+ pChild->exprSupp.rowEntryInfoOffset);
+ compactFunctions(pSup->pCtx, pChild->exprSupp.pCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData);
+ compactSessionWindow(pOperator, &parentWin, pStUpdated, NULL);
+ saveResult(parentWin, pStUpdated);
+ } else {
break;
}
}
+ streamStateFreeCur(pCur);
+ }
+ if (num > 0) {
+ saveSessionOutputBuf(pAggSup, &parentWin);
}
}
}
-typedef SResultWindowInfo* (*__get_win_info_)(void*);
-SResultWindowInfo* getResWinForSession(void* pData) { return (SResultWindowInfo*)pData; }
-SResultWindowInfo* getResWinForState(void* pData) { return &((SStateWindowInfo*)pData)->winInfo; }
-
-int32_t closeSessionWindow(SHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SArray* pClosed, __get_win_info_ fn,
- bool delete, FDelete fp) {
- // Todo(liuyao) save window to tdb
- void** pIte = NULL;
- size_t keyLen = 0;
- while ((pIte = taosHashIterate(pHashMap, pIte)) != NULL) {
- uint64_t* pGroupId = taosHashGetKey(pIte, &keyLen);
- SArray* pWins = (SArray*)(*pIte);
- int32_t size = taosArrayGetSize(pWins);
- for (int32_t i = 0; i < size; i++) {
- void* pWin = taosArrayGet(pWins, i);
- SResultWindowInfo* pSeWin = fn(pWin);
- if (isCloseWindow(&pSeWin->win, pTwSup)) {
- if (!pSeWin->isClosed) {
- pSeWin->isClosed = true;
- if (pTwSup->calTrigger == STREAM_TRIGGER_WINDOW_CLOSE && pClosed) {
- int32_t code = saveResult(pSeWin->win.skey, pSeWin->pos.pageId, pSeWin->pos.offset, *pGroupId, pClosed);
- if (code != TSDB_CODE_SUCCESS) {
- return code;
- }
- pSeWin->isOutput = true;
- }
- if (delete) {
- deleteWindow(pWins, i, fp);
- i--;
- size = taosArrayGetSize(pWins);
- }
+int32_t closeSessionWindow(SSHashObj* pHashMap, STimeWindowAggSupp* pTwSup, SSHashObj* pClosed) {
+ void* pIte = NULL;
+ size_t keyLen = 0;
+ int32_t iter = 0;
+ while ((pIte = tSimpleHashIterate(pHashMap, pIte, &iter)) != NULL) {
+ SResultWindowInfo* pWinInfo = pIte;
+ if (isCloseWindow(&pWinInfo->sessionWin.win, pTwSup)) {
+ if (pTwSup->calTrigger == STREAM_TRIGGER_WINDOW_CLOSE && pClosed) {
+ int32_t code = saveResult(*pWinInfo, pClosed);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
}
- continue;
}
- break;
+ tSimpleHashIterateRemove(pHashMap, &pWinInfo->sessionWin, sizeof(SSessionKey), &pIte, &iter);
}
}
return TSDB_CODE_SUCCESS;
}
-static void closeChildSessionWindow(SArray* pChildren, TSKEY maxTs, bool delete, FDelete fp) {
+static void closeChildSessionWindow(SArray* pChildren, TSKEY maxTs) {
int32_t size = taosArrayGetSize(pChildren);
for (int32_t i = 0; i < size; i++) {
SOperatorInfo* pChildOp = taosArrayGetP(pChildren, i);
SStreamSessionAggOperatorInfo* pChInfo = pChildOp->info;
pChInfo->twAggSup.maxTs = TMAX(pChInfo->twAggSup.maxTs, maxTs);
- closeSessionWindow(pChInfo->streamAggSup.pResultRows, &pChInfo->twAggSup, NULL, getResWinForSession, delete, fp);
+ closeSessionWindow(pChInfo->streamAggSup.pResultRows, &pChInfo->twAggSup, NULL);
}
}
-int32_t getAllSessionWindow(SHashObj* pHashMap, SArray* pClosed, __get_win_info_ fn) {
- void** pIte = NULL;
- while ((pIte = taosHashIterate(pHashMap, pIte)) != NULL) {
- SArray* pWins = (SArray*)(*pIte);
- int32_t size = taosArrayGetSize(pWins);
- for (int32_t i = 0; i < size; i++) {
- void* pWin = taosArrayGet(pWins, i);
- SResultWindowInfo* pSeWin = fn(pWin);
- if (!pSeWin->isClosed) {
- int32_t code = saveResult(pSeWin->win.skey, pSeWin->pos.pageId, pSeWin->pos.offset, 0, pClosed);
- pSeWin->isOutput = true;
- }
- }
+int32_t getAllSessionWindow(SSHashObj* pHashMap, SSHashObj* pStUpdated) {
+ void* pIte = NULL;
+ int32_t iter = 0;
+ while ((pIte = tSimpleHashIterate(pHashMap, pIte, &iter)) != NULL) {
+ SResultWindowInfo* pWinInfo = *(void**)pIte;
+ saveResult(*pWinInfo, pStUpdated);
}
return TSDB_CODE_SUCCESS;
}
-static void copyDeleteWindowInfo(SArray* pResWins, SHashObj* pStDeleted) {
+static void copyDeleteWindowInfo(SArray* pResWins, SSHashObj* pStDeleted) {
int32_t size = taosArrayGetSize(pResWins);
for (int32_t i = 0; i < size; i++) {
- SResultWindowInfo* pWinInfo = taosArrayGet(pResWins, i);
- SWinKey res = {.ts = pWinInfo->win.skey, .groupId = pWinInfo->groupId};
- taosHashPut(pStDeleted, &res, sizeof(SWinKey), &res, sizeof(SWinKey));
+ SSessionKey* pWinKey = taosArrayGet(pResWins, i);
+ if (!pWinKey) continue;
+ SSessionKey winInfo = *pWinKey;
+ winInfo.win.ekey = winInfo.win.skey;
+ tSimpleHashPut(pStDeleted, &winInfo, sizeof(SSessionKey), NULL, 0);
}
}
-static void removeSessionResults(SHashObj* pHashMap, SArray* pWins) {
- int32_t size = taosArrayGetSize(pWins);
- for (int32_t i = 0; i < size; i++) {
- SResultWindowInfo* pWin = taosArrayGet(pWins, i);
- taosHashRemove(pHashMap, &pWin->pos, sizeof(SResultRowPosition));
- }
+void initGroupResInfoFromArrayList(SGroupResInfo* pGroupResInfo, SArray* pArrayList) {
+ pGroupResInfo->pRows = pArrayList;
+ pGroupResInfo->index = 0;
+ ASSERT(pGroupResInfo->index <= getNumOfTotalRes(pGroupResInfo));
}
-static void removeSessionDeleteResults(SArray* update, SHashObj* pStDeleted) {
- int32_t size = taosHashGetSize(pStDeleted);
- if (size == 0) {
+void doBuildSessionResult(SOperatorInfo* pOperator, SStreamState* pState, SGroupResInfo* pGroupResInfo,
+ SSDataBlock* pBlock) {
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+ // set output datablock version
+ pBlock->info.version = pTaskInfo->version;
+
+ blockDataCleanup(pBlock);
+ if (!hasRemainResults(pGroupResInfo)) {
+ taosArrayDestroy(pGroupResInfo->pRows);
+ pGroupResInfo->pRows = NULL;
return;
}
- int32_t num = taosArrayGetSize(update);
- for (int32_t i = 0; i < num; i++) {
- SResKeyPos* pos = taosArrayGetP(update, i);
- SWinKey winKey = {.ts = *(int64_t*)pos->key, .groupId = pos->groupId};
- taosHashRemove(pStDeleted, &winKey, sizeof(SWinKey));
- }
+ // clear the existed group id
+ pBlock->info.groupId = 0;
+ buildSessionResultDataBlock(pOperator, pState, pBlock, &pOperator->exprSupp, pGroupResInfo);
}
static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
@@ -4351,6 +4052,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
SOptrBasicInfo* pBInfo = &pInfo->binfo;
TSKEY maxTs = INT64_MIN;
+ SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
} else if (pOperator->status == OP_RES_TO_RETURN) {
@@ -4359,18 +4061,20 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "final session" : "single session");
return pInfo->pDelRes;
}
- doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
- if (pBInfo->pRes->info.rows == 0 || !hasRemainResults(&pInfo->groupResInfo)) {
- doSetOperatorCompleted(pOperator);
+ doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes);
+ if (pBInfo->pRes->info.rows > 0) {
+ printDataBlock(pBInfo->pRes, IS_FINAL_OP(pInfo) ? "final session" : "single session");
+ return pBInfo->pRes;
}
- printDataBlock(pBInfo->pRes, IS_FINAL_OP(pInfo) ? "final session" : "single session");
- return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
+
+ doSetOperatorCompleted(pOperator);
+ return NULL;
}
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- SHashObj* pStUpdated = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
+ SSHashObj* pStUpdated = tSimpleHashInit(64, hashFn);
SOperatorInfo* downstream = pOperator->pDownstream[0];
- SArray* pUpdated = taosArrayInit(16, POINTER_BYTES); // SResKeyPos
+ SArray* pUpdated = taosArrayInit(16, sizeof(SSessionKey)); // SResKeyPos
while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
@@ -4384,38 +4088,31 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
/*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
}
- if (pBlock->info.type == STREAM_CLEAR) {
- SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
- doClearSessionWindows(&pInfo->streamAggSup, &pOperator->exprSupp, pBlock, START_TS_COLUMN_INDEX,
- pOperator->exprSupp.numOfExprs, 0, pWins);
- if (IS_FINAL_OP(pInfo)) {
- int32_t childIndex = getChildIndex(pBlock);
- SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
- SStreamSessionAggOperatorInfo* pChildInfo = pChildOp->info;
- doClearSessionWindows(&pChildInfo->streamAggSup, &pChildOp->exprSupp, pBlock, START_TS_COLUMN_INDEX,
- pChildOp->exprSupp.numOfExprs, 0, NULL);
- rebuildTimeWindow(pInfo, pWins, pOperator->exprSupp.numOfExprs, pOperator, pStUpdated);
- }
- taosArrayDestroy(pWins);
- continue;
- } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) {
- SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
+ if (pBlock->info.parTbName[0]) {
+ taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
+ TSDB_TABLE_NAME_LEN);
+ /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
+ }
+
+ if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
+ pBlock->info.type == STREAM_CLEAR) {
+ SArray* pWins = taosArrayInit(16, sizeof(SSessionKey));
// gap must be 0
- doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, 0, pWins, NULL);
+ doDeleteTimeWindows(pAggSup, pBlock, pWins);
+ removeSessionResults(pStUpdated, pWins);
if (IS_FINAL_OP(pInfo)) {
int32_t childIndex = getChildIndex(pBlock);
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, childIndex);
SStreamSessionAggOperatorInfo* pChildInfo = pChildOp->info;
// gap must be 0
- doDeleteTimeWindows(&pChildInfo->streamAggSup, pBlock, 0, NULL, NULL);
- rebuildTimeWindow(pInfo, pWins, pOperator->exprSupp.numOfExprs, pOperator, pStUpdated);
+ doDeleteTimeWindows(&pChildInfo->streamAggSup, pBlock, NULL);
+ rebuildSessionWindow(pOperator, pWins, pStUpdated);
}
copyDeleteWindowInfo(pWins, pInfo->pStDeleted);
- removeSessionResults(pStUpdated, pWins);
taosArrayDestroy(pWins);
continue;
} else if (pBlock->info.type == STREAM_GET_ALL) {
- getAllSessionWindow(pInfo->streamAggSup.pResultRows, pUpdated, getResWinForSession);
+ getAllSessionWindow(pAggSup->pResultRows, pStUpdated);
continue;
}
@@ -4450,39 +4147,121 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
// restore the value
pOperator->status = OP_RES_TO_RETURN;
- closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, getResWinForSession,
- pInfo->ignoreExpiredData, NULL);
- closeChildSessionWindow(pInfo->pChildren, pInfo->twAggSup.maxTs, pInfo->ignoreExpiredData, NULL);
+ closeSessionWindow(pAggSup->pResultRows, &pInfo->twAggSup, pStUpdated);
+ closeChildSessionWindow(pInfo->pChildren, pInfo->twAggSup.maxTs);
copyUpdateResult(pStUpdated, pUpdated);
- removeSessionDeleteResults(pUpdated, pInfo->pStDeleted);
- taosHashCleanup(pStUpdated);
-
- finalizeUpdatedResult(pSup->numOfExprs, pInfo->streamAggSup.pResultBuf, pUpdated, pSup->rowEntryInfoOffset);
- initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
+ removeSessionResults(pInfo->pStDeleted, pUpdated);
+ tSimpleHashCleanup(pStUpdated);
+ initGroupResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
+
doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
printDataBlock(pInfo->pDelRes, IS_FINAL_OP(pInfo) ? "final session" : "single session");
return pInfo->pDelRes;
}
- doBuildStreamResBlock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
- printDataBlock(pBInfo->pRes, IS_FINAL_OP(pInfo) ? "final session" : "single session");
- return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
+
+ doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes);
+ if (pBInfo->pRes->info.rows > 0) {
+ printDataBlock(pBInfo->pRes, IS_FINAL_OP(pInfo) ? "final session" : "single session");
+ return pBInfo->pRes;
+ }
+
+ doSetOperatorCompleted(pOperator);
+ return NULL;
}
-static void clearStreamSessionOperator(SStreamSessionAggOperatorInfo* pInfo) {
- void** pIte = NULL;
- while ((pIte = taosHashIterate(pInfo->streamAggSup.pResultRows, pIte)) != NULL) {
- SArray* pWins = (SArray*)(*pIte);
- int32_t size = taosArrayGetSize(pWins);
- for (int32_t i = 0; i < size; i++) {
- SResultWindowInfo* pWin = (SResultWindowInfo*)taosArrayGet(pWins, i);
- pWin->pos.pageId = -1;
- pWin->pos.offset = -1;
+SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
+ SExecTaskInfo* pTaskInfo) {
+ SSessionWinodwPhysiNode* pSessionNode = (SSessionWinodwPhysiNode*)pPhyNode;
+ int32_t numOfCols = 0;
+ int32_t code = TSDB_CODE_OUT_OF_MEMORY;
+ SStreamSessionAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamSessionAggOperatorInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pInfo == NULL || pOperator == NULL) {
+ goto _error;
+ }
+
+ pOperator->pTaskInfo = pTaskInfo;
+
+ initResultSizeInfo(&pOperator->resultInfo, 4096);
+ if (pSessionNode->window.pExprs != NULL) {
+ int32_t numOfScalar = 0;
+ SExprInfo* pScalarExprInfo = createExprInfo(pSessionNode->window.pExprs, NULL, &numOfScalar);
+ code = initExprSupp(&pInfo->scalarSupp, pScalarExprInfo, numOfScalar);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
}
}
- clearDiskbasedBuf(pInfo->streamAggSup.pResultBuf);
- pInfo->streamAggSup.currentPageId = -1;
+ SExprSupp* pSup = &pOperator->exprSupp;
+
+ SExprInfo* pExprInfo = createExprInfo(pSessionNode->window.pFuncs, NULL, &numOfCols);
+ SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
+ code = initBasicInfoEx(&pInfo->binfo, pSup, pExprInfo, numOfCols, pResBlock);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ code = initStreamAggSupporter(&pInfo->streamAggSup, pSup->pCtx, numOfCols, pSessionNode->gap,
+ pTaskInfo->streamInfo.pState, 0, 0);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ pInfo->twAggSup = (STimeWindowAggSupp){
+ .waterMark = pSessionNode->window.watermark,
+ .calTrigger = pSessionNode->window.triggerType,
+ .maxTs = INT64_MIN,
+ .minTs = INT64_MAX,
+ };
+
+ initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
+
+ pInfo->primaryTsIndex = ((SColumnNode*)pSessionNode->window.pTspk)->slotId;
+ if (pSessionNode->window.pTsEnd) {
+ pInfo->endTsIndex = ((SColumnNode*)pSessionNode->window.pTsEnd)->slotId;
+ }
+ pInfo->binfo.pRes = pResBlock;
+ pInfo->order = TSDB_ORDER_ASC;
+ _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
+ pInfo->pStDeleted = tSimpleHashInit(64, hashFn);
+ pInfo->pDelIterator = NULL;
+ pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
+ pInfo->pChildren = NULL;
+ pInfo->isFinal = false;
+ pInfo->pPhyNode = pPhyNode;
+ pInfo->ignoreExpiredData = pSessionNode->window.igExpired;
+ pInfo->pGroupIdTbNameMap =
+ taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
+
+ pOperator->name = "StreamSessionWindowAggOperator";
+ pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION;
+ pOperator->blocking = true;
+ pOperator->status = OP_NOT_OPENED;
+ pOperator->info = pInfo;
+ pOperator->fpSet =
+ createOperatorFpSet(operatorDummyOpenFn, doStreamSessionAgg, NULL, NULL, destroyStreamSessionAggOperatorInfo,
+ aggEncodeResultRow, aggDecodeResultRow, NULL);
+ if (downstream) {
+ initDownStream(downstream, &pInfo->streamAggSup, pInfo->twAggSup.waterMark, pOperator->operatorType,
+ pInfo->primaryTsIndex);
+ code = appendDownstream(pOperator, &downstream, 1);
+ }
+ return pOperator;
+
+_error:
+ if (pInfo != NULL) {
+ destroyStreamSessionAggOperatorInfo(pInfo);
+ }
+
+ taosMemoryFreeClear(pOperator);
+ pTaskInfo->code = code;
+ return NULL;
+}
+
+static void clearStreamSessionOperator(SStreamSessionAggOperatorInfo* pInfo) {
+ tSimpleHashClear(pInfo->streamAggSup.pResultRows);
+ streamStateSessionClear(pInfo->streamAggSup.pState);
}
static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
@@ -4490,13 +4269,14 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
SOptrBasicInfo* pBInfo = &pInfo->binfo;
TSKEY maxTs = INT64_MIN;
SExprSupp* pSup = &pOperator->exprSupp;
+ SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
}
{
- doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
+ doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes);
if (pBInfo->pRes->info.rows > 0) {
printDataBlock(pBInfo->pRes, "semi session");
return pBInfo->pRes;
@@ -4504,30 +4284,23 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
- printDataBlock(pInfo->pDelRes, "semi session");
+ printDataBlock(pInfo->pDelRes, "semi session delete");
return pInfo->pDelRes;
}
- if (pInfo->pUpdateRes->info.rows > 0 && pInfo->returnUpdate) {
- pInfo->returnUpdate = false;
- // process the rest of the data
- printDataBlock(pInfo->pUpdateRes, "semi session");
- return pInfo->pUpdateRes;
- }
-
if (pOperator->status == OP_RES_TO_RETURN) {
clearFunctionContext(&pOperator->exprSupp);
// semi interval operator clear disk buffer
clearStreamSessionOperator(pInfo);
- pOperator->status = OP_EXEC_DONE;
+ doSetOperatorCompleted(pOperator);
return NULL;
}
}
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- SHashObj* pStUpdated = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
+ SSHashObj* pStUpdated = tSimpleHashInit(64, hashFn);
SOperatorInfo* downstream = pOperator->pDownstream[0];
- SArray* pUpdated = taosArrayInit(16, POINTER_BYTES);
+ SArray* pUpdated = taosArrayInit(16, sizeof(SSessionKey));
while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
@@ -4543,24 +4316,17 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
/*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
}
- if (pBlock->info.type == STREAM_CLEAR) {
- SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
- doClearSessionWindows(&pInfo->streamAggSup, pSup, pBlock, START_TS_COLUMN_INDEX, pSup->numOfExprs, 0, pWins);
- removeSessionResults(pStUpdated, pWins);
- taosArrayDestroy(pWins);
- copyDataBlock(pInfo->pUpdateRes, pBlock);
- pInfo->returnUpdate = true;
- break;
- } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) {
+ if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
+ pBlock->info.type == STREAM_CLEAR) {
// gap must be 0
SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
- doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, 0, pWins, NULL);
- copyDeleteWindowInfo(pWins, pInfo->pStDeleted);
+ doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, pWins);
removeSessionResults(pStUpdated, pWins);
+ copyDeleteWindowInfo(pWins, pInfo->pStDeleted);
taosArrayDestroy(pWins);
break;
} else if (pBlock->info.type == STREAM_GET_ALL) {
- getAllSessionWindow(pInfo->streamAggSup.pResultRows, pUpdated, getResWinForSession);
+ getAllSessionWindow(pInfo->streamAggSup.pResultRows, pStUpdated);
continue;
}
@@ -4578,15 +4344,13 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
pBInfo->pRes->info.watermark = pInfo->twAggSup.maxTs;
copyUpdateResult(pStUpdated, pUpdated);
- removeSessionDeleteResults(pUpdated, pInfo->pStDeleted);
- taosHashCleanup(pStUpdated);
+ removeSessionResults(pInfo->pStDeleted, pUpdated);
+ tSimpleHashCleanup(pStUpdated);
- finalizeUpdatedResult(pOperator->exprSupp.numOfExprs, pInfo->streamAggSup.pResultBuf, pUpdated,
- pSup->rowEntryInfoOffset);
- initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
+ initGroupResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity);
- doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
+ doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes);
if (pBInfo->pRes->info.rows > 0) {
printDataBlock(pBInfo->pRes, "semi session");
return pBInfo->pRes;
@@ -4594,18 +4358,14 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
- printDataBlock(pInfo->pDelRes, "semi session");
+ printDataBlock(pInfo->pDelRes, "semi session delete");
return pInfo->pDelRes;
}
- if (pInfo->pUpdateRes->info.rows > 0 && pInfo->returnUpdate) {
- pInfo->returnUpdate = false;
- // process the rest of the data
- printDataBlock(pInfo->pUpdateRes, "semi session");
- return pInfo->pUpdateRes;
- }
-
- pOperator->status = OP_EXEC_DONE;
+ clearFunctionContext(&pOperator->exprSupp);
+ // semi interval operator clear disk buffer
+ clearStreamSessionOperator(pInfo);
+ doSetOperatorCompleted(pOperator);
return NULL;
}
@@ -4638,11 +4398,14 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream
if (numOfChild > 0) {
pInfo->pChildren = taosArrayInit(numOfChild, sizeof(void*));
for (int32_t i = 0; i < numOfChild; i++) {
- SOperatorInfo* pChild = createStreamFinalSessionAggOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
- if (pChild == NULL) {
+ SOperatorInfo* pChildOp = createStreamFinalSessionAggOperatorInfo(NULL, pPhyNode, pTaskInfo, 0);
+ if (pChildOp == NULL) {
goto _error;
}
- taosArrayPush(pInfo->pChildren, &pChild);
+ SStreamSessionAggOperatorInfo* pChInfo = pChildOp->info;
+ pChInfo->twAggSup.calTrigger = STREAM_TRIGGER_AT_ONCE;
+ streamStateSetNumber(pChInfo->streamAggSup.pState, i);
+ taosArrayPush(pInfo->pChildren, &pChildOp);
}
}
return pOperator;
@@ -4651,7 +4414,6 @@ _error:
if (pInfo != NULL) {
destroyStreamSessionAggOperatorInfo(pInfo);
}
-
taosMemoryFreeClear(pOperator);
pTaskInfo->code = code;
return NULL;
@@ -4660,7 +4422,7 @@ _error:
void destroyStreamStateOperatorInfo(void* param) {
SStreamStateAggOperatorInfo* pInfo = (SStreamStateAggOperatorInfo*)param;
cleanupBasicInfo(&pInfo->binfo);
- destroyStateStreamAggSupporter(&pInfo->streamAggSup);
+ destroyStreamAggSupporter(&pInfo->streamAggSup);
cleanupGroupResInfo(&pInfo->groupResInfo);
if (pInfo->pChildren != NULL) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
@@ -4673,151 +4435,75 @@ void destroyStreamStateOperatorInfo(void* param) {
}
colDataDestroy(&pInfo->twAggSup.timeWindowData);
blockDataDestroy(pInfo->pDelRes);
- taosHashCleanup(pInfo->pSeDeleted);
+ tSimpleHashCleanup(pInfo->pSeDeleted);
taosHashCleanup(pInfo->pGroupIdTbNameMap);
- destroySqlFunctionCtx(pInfo->pDummyCtx, 0);
-
taosMemoryFreeClear(param);
}
-int64_t getStateWinTsKey(void* data, int32_t index) {
- SStateWindowInfo* pStateWin = taosArrayGet(data, index);
- return pStateWin->winInfo.win.ekey;
-}
-
-SStateWindowInfo* addNewStateWindow(SArray* pWinInfos, TSKEY ts, char* pKeyData, SColumn* pCol) {
- SStateWindowInfo win = {
- .stateKey.bytes = pCol->bytes,
- .stateKey.type = pCol->type,
- .stateKey.pData = taosMemoryCalloc(1, pCol->bytes),
- .winInfo.pos.offset = -1,
- .winInfo.pos.pageId = -1,
- .winInfo.win.skey = ts,
- .winInfo.win.ekey = ts,
- .winInfo.isOutput = false,
- .winInfo.isClosed = false,
- };
- if (IS_VAR_DATA_TYPE(win.stateKey.type)) {
- varDataCopy(win.stateKey.pData, pKeyData);
- } else {
- memcpy(win.stateKey.pData, pKeyData, win.stateKey.bytes);
- }
- return taosArrayPush(pWinInfos, &win);
-}
-
-SStateWindowInfo* insertNewStateWindow(SArray* pWinInfos, TSKEY ts, char* pKeyData, int32_t index, SColumn* pCol) {
- SStateWindowInfo win = {
- .stateKey.bytes = pCol->bytes,
- .stateKey.type = pCol->type,
- .stateKey.pData = taosMemoryCalloc(1, pCol->bytes),
- .winInfo.pos.offset = -1,
- .winInfo.pos.pageId = -1,
- .winInfo.win.skey = ts,
- .winInfo.win.ekey = ts,
- .winInfo.isOutput = false,
- .winInfo.isClosed = false,
- };
- if (IS_VAR_DATA_TYPE(win.stateKey.type)) {
- varDataCopy(win.stateKey.pData, pKeyData);
- } else {
- memcpy(win.stateKey.pData, pKeyData, win.stateKey.bytes);
- }
- return taosArrayInsert(pWinInfos, index, &win);
-}
-
bool isTsInWindow(SStateWindowInfo* pWin, TSKEY ts) {
- if (pWin->winInfo.win.skey <= ts && ts <= pWin->winInfo.win.ekey) {
+ if (pWin->winInfo.sessionWin.win.skey <= ts && ts <= pWin->winInfo.sessionWin.win.ekey) {
return true;
}
return false;
}
bool isEqualStateKey(SStateWindowInfo* pWin, char* pKeyData) {
- return pKeyData && compareVal(pKeyData, &pWin->stateKey);
-}
-
-SStateWindowInfo* getStateWindowByTs(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId, int32_t* pIndex) {
- SArray* pWinInfos = getWinInfos(pAggSup, groupId);
- pAggSup->pCurWins = pWinInfos;
- int32_t size = taosArrayGetSize(pWinInfos);
- int32_t index = binarySearch(pWinInfos, size, ts, TSDB_ORDER_DESC, getStateWinTsKey);
- SStateWindowInfo* pWin = NULL;
- if (index >= 0) {
- pWin = taosArrayGet(pWinInfos, index);
- if (isTsInWindow(pWin, ts)) {
- *pIndex = index;
- return pWin;
- }
- }
-
- if (index + 1 < size) {
- pWin = taosArrayGet(pWinInfos, index + 1);
- if (isTsInWindow(pWin, ts)) {
- *pIndex = index + 1;
- return pWin;
- }
- }
- *pIndex = 0;
- return NULL;
-}
-
-SStateWindowInfo* getStateWindow(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId, char* pKeyData,
- SColumn* pCol, int32_t* pIndex) {
- SArray* pWinInfos = getWinInfos(pAggSup, groupId);
- pAggSup->pCurWins = pWinInfos;
- int32_t size = taosArrayGetSize(pWinInfos);
- if (size == 0) {
- *pIndex = 0;
- return addNewStateWindow(pWinInfos, ts, pKeyData, pCol);
- }
- int32_t index = binarySearch(pWinInfos, size, ts, TSDB_ORDER_DESC, getStateWinTsKey);
- SStateWindowInfo* pWin = NULL;
- if (index >= 0) {
- pWin = taosArrayGet(pWinInfos, index);
- if (isTsInWindow(pWin, ts)) {
- *pIndex = index;
- return pWin;
- }
- }
-
- if (index + 1 < size) {
- pWin = taosArrayGet(pWinInfos, index + 1);
- if (isTsInWindow(pWin, ts) || isEqualStateKey(pWin, pKeyData)) {
- *pIndex = index + 1;
- return pWin;
- }
- }
-
- if (index >= 0) {
- pWin = taosArrayGet(pWinInfos, index);
- if (isEqualStateKey(pWin, pKeyData)) {
- *pIndex = index;
- return pWin;
+ return pKeyData && compareVal(pKeyData, pWin->pStateKey);
+}
+
+bool compareStateKey(void* data, void* key) {
+ SStateKeys* stateKey = (SStateKeys*)key;
+ stateKey->pData = (char*)key + sizeof(SStateKeys);
+ return compareVal(data, stateKey);
+}
+
+void setStateOutputBuf(SStreamAggSupporter* pAggSup, TSKEY ts, uint64_t groupId, char* pKeyData,
+ SStateWindowInfo* pCurWin, SStateWindowInfo* pNextWin) {
+ int32_t size = pAggSup->resultRowSize;
+ pCurWin->winInfo.sessionWin.groupId = groupId;
+ pCurWin->winInfo.sessionWin.win.skey = ts;
+ pCurWin->winInfo.sessionWin.win.ekey = ts;
+ int32_t code =
+ streamStateStateAddIfNotExist(pAggSup->pState, &pCurWin->winInfo.sessionWin, pKeyData, pAggSup->stateKeySize,
+ compareStateKey, &pCurWin->winInfo.pOutputBuf, &size);
+ pCurWin->pStateKey =
+ (SStateKeys*)((char*)pCurWin->winInfo.pOutputBuf + (pAggSup->resultRowSize - pAggSup->stateKeySize));
+ pCurWin->pStateKey->bytes = pAggSup->stateKeySize - sizeof(SStateKeys);
+ pCurWin->pStateKey->type = pAggSup->stateKeyType;
+ pCurWin->pStateKey->pData = (char*)pCurWin->pStateKey + sizeof(SStateKeys);
+ pCurWin->pStateKey->isNull = false;
+
+ if (code == TSDB_CODE_SUCCESS) {
+ pCurWin->winInfo.isOutput = true;
+ } else {
+ if (IS_VAR_DATA_TYPE(pAggSup->stateKeyType)) {
+ varDataCopy(pCurWin->pStateKey->pData, pKeyData);
+ } else {
+ memcpy(pCurWin->pStateKey->pData, pKeyData, pCurWin->pStateKey->bytes);
}
}
- if (index == size - 1) {
- *pIndex = taosArrayGetSize(pWinInfos);
- return addNewStateWindow(pWinInfos, ts, pKeyData, pCol);
+ pNextWin->winInfo.sessionWin = pCurWin->winInfo.sessionWin;
+ pNextWin->winInfo.pOutputBuf = NULL;
+ SStreamStateCur* pCur = streamStateSessionSeekKeyNext(pAggSup->pState, &pCurWin->winInfo.sessionWin);
+ code = streamStateSessionGetKVByCur(pCur, &pNextWin->winInfo.sessionWin, NULL, 0);
+ if (code != TSDB_CODE_SUCCESS) {
+ SET_SESSION_WIN_INVALID(pNextWin->winInfo);
}
- *pIndex = index + 1;
- return insertNewStateWindow(pWinInfos, ts, pKeyData, index + 1, pCol);
+ streamStateFreeCur(pCur);
}
-int32_t updateStateWindowInfo(SArray* pWinInfos, int32_t winIndex, TSKEY* pTs, uint64_t groupId,
+int32_t updateStateWindowInfo(SStateWindowInfo* pWinInfo, SStateWindowInfo* pNextWin, TSKEY* pTs, uint64_t groupId,
SColumnInfoData* pKeyCol, int32_t rows, int32_t start, bool* allEqual,
- SHashObj* pSeDeleted) {
+ SSHashObj* pResultRows, SSHashObj* pSeUpdated, SSHashObj* pSeDeleted) {
*allEqual = true;
- SStateWindowInfo* pWinInfo = taosArrayGet(pWinInfos, winIndex);
for (int32_t i = start; i < rows; ++i) {
char* pKeyData = colDataGetData(pKeyCol, i);
if (!isTsInWindow(pWinInfo, pTs[i])) {
if (isEqualStateKey(pWinInfo, pKeyData)) {
- int32_t size = taosArrayGetSize(pWinInfos);
- if (winIndex + 1 < size) {
- SStateWindowInfo* pNextWin = taosArrayGet(pWinInfos, winIndex + 1);
+ if (IS_VALID_SESSION_WIN(pNextWin->winInfo)) {
// ts belongs to the next window
- if (pTs[i] >= pNextWin->winInfo.win.skey) {
+ if (pTs[i] >= pNextWin->winInfo.sessionWin.win.skey) {
return i - start;
}
}
@@ -4825,15 +4511,15 @@ int32_t updateStateWindowInfo(SArray* pWinInfos, int32_t winIndex, TSKEY* pTs, u
return i - start;
}
}
- if (pWinInfo->winInfo.win.skey > pTs[i]) {
+
+ if (pWinInfo->winInfo.sessionWin.win.skey > pTs[i]) {
if (pSeDeleted && pWinInfo->winInfo.isOutput) {
- SWinKey res = {.ts = pWinInfo->winInfo.win.skey, .groupId = groupId};
- taosHashPut(pSeDeleted, &res, sizeof(SWinKey), &res, sizeof(SWinKey));
- pWinInfo->winInfo.isOutput = false;
+ saveDeleteRes(pSeDeleted, pWinInfo->winInfo.sessionWin);
}
- pWinInfo->winInfo.win.skey = pTs[i];
+ removeSessionResult(pSeUpdated, pResultRows, pWinInfo->winInfo.sessionWin);
+ pWinInfo->winInfo.sessionWin.win.skey = pTs[i];
}
- pWinInfo->winInfo.win.ekey = TMAX(pWinInfo->winInfo.win.ekey, pTs[i]);
+ pWinInfo->winInfo.sessionWin.win.ekey = TMAX(pWinInfo->winInfo.sessionWin.win.ekey, pTs[i]);
if (!isEqualStateKey(pWinInfo, pKeyData)) {
*allEqual = false;
}
@@ -4841,36 +4527,13 @@ int32_t updateStateWindowInfo(SArray* pWinInfos, int32_t winIndex, TSKEY* pTs, u
return rows - start;
}
-static void doClearStateWindows(SStreamAggSupporter* pAggSup, SSDataBlock* pBlock, SHashObj* pSeUpdated,
- SHashObj* pSeDeleted) {
- SColumnInfoData* pTsColInfo = taosArrayGet(pBlock->pDataBlock, START_TS_COLUMN_INDEX);
- SColumnInfoData* pGroupColInfo = taosArrayGet(pBlock->pDataBlock, GROUPID_COLUMN_INDEX);
- TSKEY* tsCol = (TSKEY*)pTsColInfo->pData;
- bool allEqual = false;
- int32_t step = 1;
- uint64_t* gpCol = (uint64_t*)pGroupColInfo->pData;
- for (int32_t i = 0; i < pBlock->info.rows; i += step) {
- int32_t winIndex = 0;
- SStateWindowInfo* pCurWin = getStateWindowByTs(pAggSup, tsCol[i], gpCol[i], &winIndex);
- if (!pCurWin) {
- continue;
- }
- updateSessionWindowInfo(&pCurWin->winInfo, tsCol, NULL, 0, pBlock->info.rows, i, 0, NULL);
- taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition));
- deleteWindow(pAggSup->pCurWins, winIndex, destroyStateWinInfo);
- }
-}
-
-static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, SHashObj* pSeUpdated,
- SHashObj* pStDeleted) {
+static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBlock, SSHashObj* pSeUpdated,
+ SSHashObj* pStDeleted) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
SStreamStateAggOperatorInfo* pInfo = pOperator->info;
- bool masterScan = true;
int32_t numOfOutput = pOperator->exprSupp.numOfExprs;
int64_t groupId = pSDataBlock->info.groupId;
int64_t code = TSDB_CODE_SUCCESS;
- int32_t step = 1;
- bool ascScan = true;
TSKEY* tsCols = NULL;
SResultRow* pResult = NULL;
int32_t winRows = 0;
@@ -4882,39 +4545,44 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
}
SStreamAggSupporter* pAggSup = &pInfo->streamAggSup;
- blockDataEnsureCapacity(pAggSup->pScanBlock, pSDataBlock->info.rows);
+ int32_t rows = pSDataBlock->info.rows;
+ blockDataEnsureCapacity(pAggSup->pScanBlock, rows);
SColumnInfoData* pKeyColInfo = taosArrayGet(pSDataBlock->pDataBlock, pInfo->stateCol.slotId);
- for (int32_t i = 0; i < pSDataBlock->info.rows; i += winRows) {
+ for (int32_t i = 0; i < rows; i += winRows) {
if (pInfo->ignoreExpiredData && isOverdue(tsCols[i], &pInfo->twAggSup)) {
i++;
continue;
}
- char* pKeyData = colDataGetData(pKeyColInfo, i);
- int32_t winIndex = 0;
- bool allEqual = true;
- SStateWindowInfo* pCurWin = getStateWindow(pAggSup, tsCols[i], groupId, pKeyData, &pInfo->stateCol, &winIndex);
- winRows = updateStateWindowInfo(pAggSup->pCurWins, winIndex, tsCols, groupId, pKeyColInfo, pSDataBlock->info.rows,
- i, &allEqual, pStDeleted);
+ char* pKeyData = colDataGetData(pKeyColInfo, i);
+ int32_t winIndex = 0;
+ bool allEqual = true;
+ SStateWindowInfo curWin = {0};
+ SStateWindowInfo nextWin = {0};
+ setStateOutputBuf(pAggSup, tsCols[i], groupId, pKeyData, &curWin, &nextWin);
+ setSessionWinOutputInfo(pSeUpdated, &curWin.winInfo);
+ winRows = updateStateWindowInfo(&curWin, &nextWin, tsCols, groupId, pKeyColInfo, rows, i, &allEqual,
+ pAggSup->pResultRows, pSeUpdated, pStDeleted);
if (!allEqual) {
uint64_t uid = 0;
- appendOneRowToStreamSpecialBlock(pAggSup->pScanBlock, &pCurWin->winInfo.win.skey, &pCurWin->winInfo.win.ekey,
- &uid, &groupId, NULL);
- taosHashRemove(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition));
- deleteWindow(pAggSup->pCurWins, winIndex, destroyStateWinInfo);
+ appendOneRowToStreamSpecialBlock(pAggSup->pScanBlock, &curWin.winInfo.sessionWin.win.skey,
+ &curWin.winInfo.sessionWin.win.ekey, &uid, &groupId, NULL);
+ tSimpleHashRemove(pSeUpdated, &curWin.winInfo.sessionWin, sizeof(SSessionKey));
+ doDeleteSessionWindow(pAggSup, &curWin.winInfo.sessionWin);
+ releaseOutputBuf(pAggSup->pState, NULL, (SResultRow*)curWin.winInfo.pOutputBuf);
continue;
}
- code = doOneStateWindowAgg(pInfo, pSDataBlock, &pCurWin->winInfo, &pResult, i, winRows, numOfOutput, pOperator);
+ code = doOneWindowAggImpl(&pInfo->twAggSup.timeWindowData, &curWin.winInfo, &pResult, i, winRows, rows, numOfOutput,
+ pOperator);
if (code != TSDB_CODE_SUCCESS || pResult == NULL) {
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- pCurWin->winInfo.isClosed = false;
+ saveSessionOutputBuf(pAggSup, &curWin.winInfo);
+
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_AT_ONCE) {
- SWinKey value = {.ts = pCurWin->winInfo.win.skey, .groupId = groupId};
- code = taosHashPut(pSeUpdated, &pCurWin->winInfo.pos, sizeof(SResultRowPosition), &value, sizeof(SWinKey));
+ code = saveResult(curWin.winInfo, pSeUpdated);
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- pCurWin->winInfo.isOutput = true;
}
}
}
@@ -4931,21 +4599,24 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
if (pOperator->status == OP_RES_TO_RETURN) {
doBuildDeleteDataBlock(pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
- printDataBlock(pInfo->pDelRes, "single state");
+ printDataBlock(pInfo->pDelRes, "single state delete");
return pInfo->pDelRes;
}
- doBuildStreamResBlock(pOperator, pBInfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
- if (pBInfo->pRes->info.rows == 0 || !hasRemainResults(&pInfo->groupResInfo)) {
- doSetOperatorCompleted(pOperator);
+
+ doBuildSessionResult(pOperator, pInfo->streamAggSup.pState, &pInfo->groupResInfo, pBInfo->pRes);
+ if (pBInfo->pRes->info.rows > 0) {
+ printDataBlock(pBInfo->pRes, "single state");
+ return pBInfo->pRes;
}
- printDataBlock(pBInfo->pRes, "single state");
- return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
+
+ doSetOperatorCompleted(pOperator);
+ return NULL;
}
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- SHashObj* pSeUpdated = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
+ SSHashObj* pSeUpdated = tSimpleHashInit(64, hashFn);
SOperatorInfo* downstream = pOperator->pDownstream[0];
- SArray* pUpdated = taosArrayInit(16, POINTER_BYTES);
+ SArray* pUpdated = taosArrayInit(16, sizeof(SSessionKey));
while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
@@ -4953,18 +4624,22 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "single state recv");
- if (pBlock->info.type == STREAM_CLEAR) {
- doClearStateWindows(&pInfo->streamAggSup, pBlock, pSeUpdated, pInfo->pSeDeleted);
- continue;
- } else if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT) {
- SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
- doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, 0, pWins, destroyStateWinInfo);
- copyDeleteWindowInfo(pWins, pInfo->pSeDeleted);
+ if (pBlock->info.parTbName[0]) {
+ taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
+ TSDB_TABLE_NAME_LEN);
+ /*printf("\n\n put tbname %s\n\n", pBlock->info.parTbName);*/
+ }
+
+ if (pBlock->info.type == STREAM_DELETE_DATA || pBlock->info.type == STREAM_DELETE_RESULT ||
+ pBlock->info.type == STREAM_CLEAR) {
+ SArray* pWins = taosArrayInit(16, sizeof(SSessionKey));
+ doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, pWins);
removeSessionResults(pSeUpdated, pWins);
+ copyDeleteWindowInfo(pWins, pInfo->pSeDeleted);
taosArrayDestroy(pWins);
continue;
} else if (pBlock->info.type == STREAM_GET_ALL) {
- getAllSessionWindow(pInfo->streamAggSup.pResultRows, pUpdated, getResWinForState);
+ getAllSessionWindow(pInfo->streamAggSup.pResultRows, pSeUpdated);
continue;
}
@@ -4981,28 +4656,27 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
// restore the value
pOperator->status = OP_RES_TO_RETURN;
- closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pUpdated, getResWinForState,
- pInfo->ignoreExpiredData, destroyStateWinInfo);
- // closeChildSessionWindow(pInfo->pChildren, pInfo->twAggSup.maxTs, pInfo->ignoreExpiredData, destroyStateWinInfo);
+ closeSessionWindow(pInfo->streamAggSup.pResultRows, &pInfo->twAggSup, pSeUpdated);
copyUpdateResult(pSeUpdated, pUpdated);
- taosHashCleanup(pSeUpdated);
+ removeSessionResults(pInfo->pSeDeleted, pUpdated);
+ tSimpleHashCleanup(pSeUpdated);
- finalizeUpdatedResult(pOperator->exprSupp.numOfExprs, pInfo->streamAggSup.pResultBuf, pUpdated,
- pSup->rowEntryInfoOffset);
- initMultiResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
+ initGroupResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
+
doBuildDeleteDataBlock(pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
- printDataBlock(pInfo->pDelRes, "single state");
+ printDataBlock(pInfo->pDelRes, "single state delete");
return pInfo->pDelRes;
}
- doBuildStreamResBlock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->streamAggSup.pResultBuf);
- printDataBlock(pBInfo->pRes, "single state");
- return pBInfo->pRes->info.rows == 0 ? NULL : pBInfo->pRes;
-}
-int32_t initStateAggSupporter(SStreamAggSupporter* pSup, const char* pKey, SqlFunctionCtx* pCtx, int32_t numOfOutput) {
- return initStreamAggSupporter(pSup, pKey, pCtx, numOfOutput, sizeof(SStateWindowInfo));
+ doBuildSessionResult(pOperator, pInfo->streamAggSup.pState, &pInfo->groupResInfo, pBInfo->pRes);
+ if (pBInfo->pRes->info.rows > 0) {
+ printDataBlock(pBInfo->pRes, "single state");
+ return pBInfo->pRes;
+ }
+ doSetOperatorCompleted(pOperator);
+ return NULL;
}
SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
@@ -5019,11 +4693,6 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
goto _error;
}
- SExprSupp* pSup = &pOperator->exprSupp;
-
- int32_t numOfCols = 0;
- SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &numOfCols);
-
pInfo->stateCol = extractColumnFromColumnNode(pColNode);
initResultSizeInfo(&pOperator->resultInfo, 4096);
if (pStateNode->window.pExprs != NULL) {
@@ -5035,7 +4704,6 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
}
}
- initResultRowInfo(&pInfo->binfo.resultRowInfo);
pInfo->twAggSup = (STimeWindowAggSupp){
.waterMark = pStateNode->window.watermark,
.calTrigger = pStateNode->window.triggerType,
@@ -5044,27 +4712,25 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
};
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
+ SExprSupp* pSup = &pOperator->exprSupp;
+ int32_t numOfCols = 0;
+ SExprInfo* pExprInfo = createExprInfo(pStateNode->window.pFuncs, NULL, &numOfCols);
SSDataBlock* pResBlock = createResDataBlock(pPhyNode->pOutputDataBlockDesc);
code = initBasicInfoEx(&pInfo->binfo, pSup, pExprInfo, numOfCols, pResBlock);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
-
- code = initStateAggSupporter(&pInfo->streamAggSup, "StreamStateAggOperatorInfo", pSup->pCtx, numOfCols);
+ int32_t keySize = sizeof(SStateKeys) + pColNode->node.resType.bytes;
+ int16_t type = pColNode->node.resType.type;
+ code = initStreamAggSupporter(&pInfo->streamAggSup, pSup->pCtx, numOfCols, 0, pTaskInfo->streamInfo.pState, keySize,
+ type);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- pInfo->pDummyCtx = (SqlFunctionCtx*)taosMemoryCalloc(numOfCols, sizeof(SqlFunctionCtx));
- if (pInfo->pDummyCtx == NULL) {
- goto _error;
- }
-
- initDummyFunction(pInfo->pDummyCtx, pSup->pCtx, numOfCols);
pInfo->primaryTsIndex = tsSlotId;
- pInfo->order = TSDB_ORDER_ASC;
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
- pInfo->pSeDeleted = taosHashInit(64, hashFn, true, HASH_NO_LOCK);
+ pInfo->pSeDeleted = tSimpleHashInit(64, hashFn);
pInfo->pDelIterator = NULL;
pInfo->pDelRes = createSpecialDataBlock(STREAM_DELETE_RESULT);
pInfo->pChildren = NULL;
@@ -5081,7 +4747,7 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
pOperator->info = pInfo;
pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamStateAgg, NULL, NULL,
destroyStreamStateOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL);
- initDownStream(downstream, &pInfo->streamAggSup, 0, pInfo->twAggSup.waterMark, pOperator->operatorType,
+ initDownStream(downstream, &pInfo->streamAggSup, pInfo->twAggSup.waterMark, pOperator->operatorType,
pInfo->primaryTsIndex);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -5619,8 +5285,8 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge
goto _error;
}
- int32_t num = 0;
- SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &num);
+ int32_t num = 0;
+ SExprInfo* pExprInfo = createExprInfo(pIntervalPhyNode->window.pFuncs, NULL, &num);
SInterval interval = {.interval = pIntervalPhyNode->interval,
.sliding = pIntervalPhyNode->sliding,
diff --git a/source/libs/executor/src/tsimplehash.c b/source/libs/executor/src/tsimplehash.c
index b66a6f67705feb73769f4948003fd675593a57c8..a5168d24ba6d933adfa01c0c85a607f7fd82d291 100644
--- a/source/libs/executor/src/tsimplehash.c
+++ b/source/libs/executor/src/tsimplehash.c
@@ -105,8 +105,8 @@ static void tSimpleHashTableResize(SSHashObj *pHashObj) {
int32_t newCapacity = (int32_t)(pHashObj->capacity << 1u);
if (newCapacity > HASH_MAX_CAPACITY) {
- uDebug("current capacity:%"PRIzu", maximum capacity:%" PRIu64 ", no resize applied due to limitation is reached",
- pHashObj->capacity, HASH_MAX_CAPACITY);
+ uDebug("current capacity:%" PRIzu ", maximum capacity:%" PRId32 ", no resize applied due to limitation is reached",
+ pHashObj->capacity, (int32_t)HASH_MAX_CAPACITY);
return;
}
@@ -388,4 +388,4 @@ void *tSimpleHashIterate(const SSHashObj *pHashObj, void *data, int32_t *iter) {
}
return NULL;
-}
\ No newline at end of file
+}
diff --git a/source/libs/function/inc/builtinsimpl.h b/source/libs/function/inc/builtinsimpl.h
index b5b7453e7a7ec98bd86038d8ffebf25ee2a1367f..dfdf03a5a8700b2b97a23f9006763e1cfa088d2d 100644
--- a/source/libs/function/inc/builtinsimpl.h
+++ b/source/libs/function/inc/builtinsimpl.h
@@ -118,6 +118,7 @@ int32_t firstLastPartialFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pB
int32_t firstCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx);
int32_t lastCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx);
int32_t getFirstLastInfoSize(int32_t resBytes);
+EFuncDataRequired firstDynDataReq(void* pRes, STimeWindow* pTimeWindow);
EFuncDataRequired lastDynDataReq(void* pRes, STimeWindow* pTimeWindow);
int32_t lastRowFunction(SqlFunctionCtx* pCtx);
diff --git a/source/libs/function/inc/tudfInt.h b/source/libs/function/inc/tudfInt.h
index c1b0941d4bd7c7e987999a16357263f87e34dbfc..c69d19b8a6187ad1d6817a6b5f8793b0905817e4 100644
--- a/source/libs/function/inc/tudfInt.h
+++ b/source/libs/function/inc/tudfInt.h
@@ -35,7 +35,7 @@ enum {
};
typedef struct SUdfSetupRequest {
- char udfName[TSDB_FUNC_NAME_LEN];
+ char udfName[TSDB_FUNC_NAME_LEN + 1];
} SUdfSetupRequest;
typedef struct SUdfSetupResponse {
diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c
index 2308aaf214888c27f8ebb40071dd54cd027d523d..49facfdd140fde296f6f78be281ff58896fa5a94 100644
--- a/source/libs/function/src/builtins.c
+++ b/source/libs/function/src/builtins.c
@@ -2431,6 +2431,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.type = FUNCTION_TYPE_FIRST,
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC,
.translateFunc = translateFirstLast,
+ .dynDataRequiredFunc = firstDynDataReq,
.getEnvFunc = getFirstLastFuncEnv,
.initFunc = functionSetup,
.processFunc = firstFunction,
@@ -2445,6 +2446,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
.type = FUNCTION_TYPE_FIRST_PARTIAL,
.classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC,
.translateFunc = translateFirstLastPartial,
+ .dynDataRequiredFunc = firstDynDataReq,
.getEnvFunc = getFirstLastFuncEnv,
.initFunc = functionSetup,
.processFunc = firstFunction,
diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c
index 0d2939747173847b08dc8c0512f5a18c2387c4d7..d107ef2ac817c6d5c68b6af3f447743a5389edd8 100644
--- a/source/libs/function/src/builtinsimpl.c
+++ b/source/libs/function/src/builtinsimpl.c
@@ -1163,13 +1163,13 @@ static int32_t findRowIndex(int32_t start, int32_t num, SColumnInfoData* pCol, c
// the data is loaded, not only the block SMA value
for (int32_t i = start; i < num + start; ++i) {
char* p = colDataGetData(pCol, i);
- if (memcpy((void*)tval, p, pCol->info.bytes) == 0) {
+ if (memcmp((void*)tval, p, pCol->info.bytes) == 0) {
return i;
}
}
- ASSERT(0);
- return 0;
+ // if reach here means real data of block SMA is not set in pCtx->input.
+ return -1;
}
int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
@@ -1211,7 +1211,9 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->v = *(int64_t*)tval;
if (pCtx->subsidiaries.num > 0) {
index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
}
} else {
if (IS_SIGNED_NUMERIC_TYPE(type)) {
@@ -1223,7 +1225,9 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
*(int64_t*)&pBuf->v = val;
if (pCtx->subsidiaries.num > 0) {
index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
}
}
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
@@ -1235,7 +1239,9 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
*(uint64_t*)&pBuf->v = val;
if (pCtx->subsidiaries.num > 0) {
index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
}
}
} else if (type == TSDB_DATA_TYPE_DOUBLE) {
@@ -1247,7 +1253,9 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
*(double*)&pBuf->v = val;
if (pCtx->subsidiaries.num > 0) {
index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
}
}
} else if (type == TSDB_DATA_TYPE_FLOAT) {
@@ -1261,7 +1269,9 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
if (pCtx->subsidiaries.num > 0) {
index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
- pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ if (index >= 0) {
+ pBuf->tuplePos = saveTupleData(pCtx, index, pCtx->pSrcBlock, NULL);
+ }
}
}
}
@@ -2527,6 +2537,8 @@ int32_t apercentileFunction(SqlFunctionCtx* pCtx) {
int32_t start = pInput->startRowIndex;
if (pInfo->algo == APERCT_ALGO_TDIGEST) {
+ buildTDigestInfo(pInfo);
+ tdigestAutoFill(pInfo->pTDigest, COMPRESSION);
for (int32_t i = start; i < pInput->numOfRows + start; ++i) {
if (colDataIsNull_f(pCol->nullbitmap, i)) {
continue;
@@ -2540,12 +2552,11 @@ int32_t apercentileFunction(SqlFunctionCtx* pCtx) {
tdigestAdd(pInfo->pTDigest, v, w);
}
} else {
- qDebug("%s before add %d elements into histogram, total:%d, numOfEntry:%d, pHisto:%p, elems: %p", __FUNCTION__,
- numOfElems, pInfo->pHisto->numOfElems, pInfo->pHisto->numOfEntries, pInfo->pHisto, pInfo->pHisto->elems);
-
// might be a race condition here that pHisto can be overwritten or setup function
// has not been called, need to relink the buffer pHisto points to.
buildHistogramInfo(pInfo);
+ qDebug("%s before add %d elements into histogram, total:%" PRId64 ", numOfEntry:%d, pHisto:%p, elems: %p", __FUNCTION__,
+ numOfElems, pInfo->pHisto->numOfElems, pInfo->pHisto->numOfEntries, pInfo->pHisto, pInfo->pHisto->elems);
for (int32_t i = start; i < pInput->numOfRows + start; ++i) {
if (colDataIsNull_f(pCol->nullbitmap, i)) {
continue;
@@ -2558,8 +2569,9 @@ int32_t apercentileFunction(SqlFunctionCtx* pCtx) {
tHistogramAdd(&pInfo->pHisto, v);
}
- qDebug("%s after add %d elements into histogram, total:%d, numOfEntry:%d, pHisto:%p, elems: %p", __FUNCTION__,
- numOfElems, pInfo->pHisto->numOfElems, pInfo->pHisto->numOfEntries, pInfo->pHisto, pInfo->pHisto->elems);
+ qDebug("%s after add %d elements into histogram, total:%" PRId64 ", numOfEntry:%d, pHisto:%p, elems: %p",
+ __FUNCTION__, numOfElems, pInfo->pHisto->numOfElems, pInfo->pHisto->numOfEntries, pInfo->pHisto,
+ pInfo->pHisto->elems);
}
SET_VAL(pResInfo, numOfElems, 1);
@@ -2579,8 +2591,9 @@ static void apercentileTransferInfo(SAPercentileInfo* pInput, SAPercentileInfo*
buildTDigestInfo(pOutput);
TDigest* pTDigest = pOutput->pTDigest;
+ tdigestAutoFill(pTDigest, COMPRESSION);
- if (pTDigest->num_centroids <= 0) {
+ if (pTDigest->num_centroids <= 0 && pTDigest->num_buffered_pts == 0) {
memcpy(pTDigest, pInput->pTDigest, (size_t)TDIGEST_SIZE(COMPRESSION));
tdigestAutoFill(pTDigest, COMPRESSION);
} else {
@@ -2638,7 +2651,7 @@ int32_t apercentileFunctionMerge(SqlFunctionCtx* pCtx) {
}
if (pInfo->algo != APERCT_ALGO_TDIGEST) {
- qDebug("%s after merge, total:%d, numOfEntry:%d, %p", __FUNCTION__, pInfo->pHisto->numOfElems,
+ qDebug("%s after merge, total:%" PRId64 ", numOfEntry:%d, %p", __FUNCTION__, pInfo->pHisto->numOfElems,
pInfo->pHisto->numOfEntries, pInfo->pHisto);
}
@@ -2652,6 +2665,7 @@ int32_t apercentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
if (pInfo->algo == APERCT_ALGO_TDIGEST) {
buildTDigestInfo(pInfo);
+ tdigestAutoFill(pInfo->pTDigest, COMPRESSION);
if (pInfo->pTDigest->size > 0) {
pInfo->result = tdigestQuantile(pInfo->pTDigest, pInfo->percent / 100);
} else { // no need to free
@@ -2717,6 +2731,22 @@ int32_t apercentileCombine(SqlFunctionCtx* pDestCtx, SqlFunctionCtx* pSourceCtx)
return TSDB_CODE_SUCCESS;
}
+EFuncDataRequired firstDynDataReq(void* pRes, STimeWindow* pTimeWindow) {
+ SResultRowEntryInfo* pEntry = (SResultRowEntryInfo*)pRes;
+
+ // not initialized yet, data is required
+ if (pEntry == NULL) {
+ return FUNC_DATA_REQUIRED_DATA_LOAD;
+ }
+
+ SFirstLastRes* pResult = GET_ROWCELL_INTERBUF(pEntry);
+ if (pResult->hasResult && pResult->ts <= pTimeWindow->skey) {
+ return FUNC_DATA_REQUIRED_NOT_LOAD;
+ } else {
+ return FUNC_DATA_REQUIRED_DATA_LOAD;
+ }
+}
+
EFuncDataRequired lastDynDataReq(void* pRes, STimeWindow* pTimeWindow) {
SResultRowEntryInfo* pEntry = (SResultRowEntryInfo*)pRes;
@@ -5356,16 +5386,14 @@ int32_t modeFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t maxCount = 0;
for (int32_t i = 0; i < pInfo->numOfPoints; ++i) {
SModeItem* pItem = (SModeItem*)(pInfo->pItems + i * (sizeof(SModeItem) + pInfo->colBytes));
- if (pItem->count > maxCount) {
+ if (pItem->count >= maxCount) {
maxCount = pItem->count;
resIndex = i;
- } else if (pItem->count == maxCount) {
- resIndex = -1;
}
}
SModeItem* pResItem = (SModeItem*)(pInfo->pItems + resIndex * (sizeof(SModeItem) + pInfo->colBytes));
- colDataAppend(pCol, currentRow, pResItem->data, (resIndex == -1) ? true : false);
+ colDataAppend(pCol, currentRow, pResItem->data, (maxCount == 0) ? true : false);
return pResInfo->numOfRes;
}
diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c
index 14833945090c1ca9f6cf860e9d51253dcff5a182..e2e508a9b36689f2ac321a2f55dc97056d55119d 100644
--- a/source/libs/function/src/tudf.c
+++ b/source/libs/function/src/tudf.c
@@ -315,7 +315,7 @@ enum { UV_TASK_CONNECT = 0, UV_TASK_REQ_RSP = 1, UV_TASK_DISCONNECT = 2 };
int64_t gUdfTaskSeqNum = 0;
typedef struct SUdfcFuncStub {
- char udfName[TSDB_FUNC_NAME_LEN];
+ char udfName[TSDB_FUNC_NAME_LEN + 1];
UdfcFuncHandle handle;
int32_t refCount;
int64_t lastRefTime;
@@ -353,7 +353,7 @@ typedef struct SUdfcUvSession {
int32_t outputLen;
int32_t bufSize;
- char udfName[TSDB_FUNC_NAME_LEN];
+ char udfName[TSDB_FUNC_NAME_LEN + 1];
} SUdfcUvSession;
typedef struct SClientUvTaskNode {
@@ -898,7 +898,7 @@ int32_t acquireUdfFuncHandle(char *udfName, UdfcFuncHandle *pHandle) {
int32_t code = 0;
uv_mutex_lock(&gUdfdProxy.udfStubsMutex);
SUdfcFuncStub key = {0};
- strcpy(key.udfName, udfName);
+ strncpy(key.udfName, udfName, TSDB_FUNC_NAME_LEN);
int32_t stubIndex = taosArraySearchIdx(gUdfdProxy.udfStubs, &key, compareUdfcFuncSub, TD_EQ);
if (stubIndex != -1) {
SUdfcFuncStub *foundStub = taosArrayGet(gUdfdProxy.udfStubs, stubIndex);
@@ -936,7 +936,7 @@ int32_t acquireUdfFuncHandle(char *udfName, UdfcFuncHandle *pHandle) {
void releaseUdfFuncHandle(char *udfName) {
uv_mutex_lock(&gUdfdProxy.udfStubsMutex);
SUdfcFuncStub key = {0};
- strcpy(key.udfName, udfName);
+ strncpy(key.udfName, udfName, TSDB_FUNC_NAME_LEN);
SUdfcFuncStub *foundStub = taosArraySearch(gUdfdProxy.udfStubs, &key, compareUdfcFuncSub, TD_EQ);
if (!foundStub) {
uv_mutex_unlock(&gUdfdProxy.udfStubsMutex);
@@ -1269,7 +1269,7 @@ void udfcUvHandleRsp(SClientUvConn *conn) {
SClientUvTaskNode *task = QUEUE_DATA(h, SClientUvTaskNode, connTaskQueue);
while (h != &conn->taskQueue) {
- fnDebug("udfc handle response iterate through queue. uvTask:%d-%p", task->seqNum, task);
+ fnDebug("udfc handle response iterate through queue. uvTask:%" PRId64 "-%p", task->seqNum, task);
if (task->seqNum == seqNum) {
if (found == false) {
found = true;
@@ -1446,6 +1446,7 @@ int32_t udfcStartUvTask(SClientUvTaskNode *uvTask) {
QUEUE_INSERT_TAIL(connTaskQueue, &uvTask->connTaskQueue);
int err = uv_write(write, (uv_stream_t *)pipe, &uvTask->reqBuf, 1, onUdfcPipeWrite);
if (err != 0) {
+ taosMemoryFree(write);
fnError("udfc event loop start req_rsp task uv_write failed. uvtask: %p, code: %s", uvTask, uv_strerror(err));
}
code = err;
@@ -1637,7 +1638,7 @@ int32_t doSetupUdf(char udfName[], UdfcFuncHandle *funcHandle) {
task->session->outputType = rsp->outputType;
task->session->outputLen = rsp->outputLen;
task->session->bufSize = rsp->bufSize;
- strcpy(task->session->udfName, udfName);
+ strncpy(task->session->udfName, udfName, TSDB_FUNC_NAME_LEN);
if (task->errCode != 0) {
fnError("failed to setup udf. udfname: %s, err: %d", udfName, task->errCode)
} else {
diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c
index a319b5a25b3bd168f7b52e365bf1b3ada8848077..f8c4f171ba8cfc75a5f5072ecb4cf1a371ef16a7 100644
--- a/source/libs/function/src/udfd.c
+++ b/source/libs/function/src/udfd.c
@@ -71,7 +71,7 @@ typedef struct SUdf {
uv_cond_t condReady;
bool resident;
- char name[TSDB_FUNC_NAME_LEN];
+ char name[TSDB_FUNC_NAME_LEN + 1];
int8_t funcType;
int8_t scriptType;
int8_t outputType;
@@ -188,11 +188,12 @@ void udfdProcessSetupRequest(SUvUdfWork *uvUdf, SUdfRequest *request) {
SUdf *udfNew = taosMemoryCalloc(1, sizeof(SUdf));
udfNew->refCount = 1;
udfNew->state = UDF_STATE_INIT;
-
uv_mutex_init(&udfNew->lock);
uv_cond_init(&udfNew->condReady);
+
udf = udfNew;
- taosHashPut(global.udfsHash, request->setup.udfName, strlen(request->setup.udfName), &udfNew, sizeof(&udfNew));
+ SUdf** pUdf = &udf;
+ taosHashPut(global.udfsHash, request->setup.udfName, strlen(request->setup.udfName), pUdf, POINTER_BYTES);
uv_mutex_unlock(&global.udfsMutex);
}
@@ -246,7 +247,7 @@ void udfdProcessSetupRequest(SUvUdfWork *uvUdf, SUdfRequest *request) {
void udfdProcessCallRequest(SUvUdfWork *uvUdf, SUdfRequest *request) {
SUdfCallRequest *call = &request->call;
- fnDebug("%" PRId64 "call request. call type %d, handle: %" PRIx64, request->seqNum, call->callType, call->udfHandle);
+ fnDebug("call request. call type %d, handle: %" PRIx64 ", seq num %" PRId64 , call->callType, call->udfHandle, request->seqNum);
SUdfcFuncHandle * handle = (SUdfcFuncHandle *)(call->udfHandle);
SUdf * udf = handle->udf;
SUdfResponse response = {0};
@@ -372,7 +373,7 @@ void udfdProcessTeardownRequest(SUvUdfWork *uvUdf, SUdfRequest *request) {
}
taosMemoryFree(handle);
- SUdfResponse response;
+ SUdfResponse response = {0};
SUdfResponse *rsp = &response;
rsp->seqNum = request->seqNum;
rsp->type = request->type;
@@ -428,7 +429,9 @@ void udfdProcessRpcRsp(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
} else if (msgInfo->rpcType == UDFD_RPC_RETRIVE_FUNC) {
SRetrieveFuncRsp retrieveRsp = {0};
tDeserializeSRetrieveFuncRsp(pMsg->pCont, pMsg->contLen, &retrieveRsp);
-
+ if (retrieveRsp.pFuncInfos == NULL) {
+ goto _return;
+ }
SFuncInfo *pFuncInfo = (SFuncInfo *)taosArrayGet(retrieveRsp.pFuncInfos, 0);
SUdf * udf = msgInfo->param;
udf->funcType = pFuncInfo->funcType;
@@ -540,7 +543,7 @@ int32_t udfdConnectToMnode() {
}
int32_t udfdLoadUdf(char *udfName, SUdf *udf) {
- strcpy(udf->name, udfName);
+ strncpy(udf->name, udfName, TSDB_FUNC_NAME_LEN);
int32_t err = 0;
err = udfdFillUdfInfoFromMNode(global.clientRpc, udf->name, udf);
@@ -880,6 +883,8 @@ static int32_t udfdUvInit() {
uv_loop_t *loop = taosMemoryMalloc(sizeof(uv_loop_t));
if (loop) {
uv_loop_init(loop);
+ } else {
+ return -1;
}
global.loop = loop;
@@ -901,12 +906,12 @@ static int32_t udfdUvInit() {
if ((r = uv_pipe_bind(&global.listeningPipe, global.listenPipeName))) {
fnError("Bind error %s", uv_err_name(r));
removeListeningPipe();
- return -1;
+ return -2;
}
if ((r = uv_listen((uv_stream_t *)&global.listeningPipe, 128, udfdOnNewConnection))) {
fnError("Listen error %s", uv_err_name(r));
removeListeningPipe();
- return -2;
+ return -3;
}
return 0;
}
@@ -962,6 +967,7 @@ int32_t udfdInitResidentFuncs() {
while ((token = strtok_r(pSave, ",", &pSave)) != NULL) {
char func[TSDB_FUNC_NAME_LEN+1] = {0};
strncpy(func, token, TSDB_FUNC_NAME_LEN);
+ fnInfo("udfd add resident function %s", func);
taosArrayPush(global.residentFuncs, func);
}
diff --git a/source/libs/function/test/runUdf.c b/source/libs/function/test/runUdf.c
index f1e3f4c60c281ebac963ac65c7d7d9f8437652cd..b5d1b1576b7b33d3ca6511e2bdf707daa8e78a41 100644
--- a/source/libs/function/test/runUdf.c
+++ b/source/libs/function/test/runUdf.c
@@ -110,8 +110,11 @@ int aggregateFuncTest() {
taosArrayDestroy(pBlock->pDataBlock);
doCallUdfAggFinalize(handle, &newBuf, &resultBuf);
- fprintf(stderr, "agg result: %f\n", *(double *)resultBuf.buf);
-
+ if (resultBuf.buf != NULL) {
+ fprintf(stderr, "agg result: %f\n", *(double *)resultBuf.buf);
+ } else {
+ fprintf(stderr, "result buffer is null");
+ }
freeUdfInterBuf(&buf);
freeUdfInterBuf(&newBuf);
freeUdfInterBuf(&resultBuf);
diff --git a/source/libs/index/inc/indexInt.h b/source/libs/index/inc/indexInt.h
index 9605528ad6ae150fd88f512cdf5344b81d486a99..4e7c0a0ef79d7f3f9a862894fd4ed3d5bc845a0c 100644
--- a/source/libs/index/inc/indexInt.h
+++ b/source/libs/index/inc/indexInt.h
@@ -138,7 +138,7 @@ void idxReleaseRef(int64_t ref);
#define IDX_TYPE_ADD_EXTERN_TYPE(ty, exTy) \
do { \
uint8_t oldTy = ty; \
- ty = (ty >> 4) | exTy; \
+ ty = ((ty >> 4) & 0xFF) | exTy; \
ty = (ty << 4) | oldTy; \
} while (0)
diff --git a/source/libs/index/src/index.c b/source/libs/index/src/index.c
index cb671cfff99e67ca9098f48d39d20448a54a1d19..76dc84ae42a3d38bea29b030be12a240bd3f510d 100644
--- a/source/libs/index/src/index.c
+++ b/source/libs/index/src/index.c
@@ -139,7 +139,7 @@ int indexOpen(SIndexOpts* opts, const char* path, SIndex** index) {
END:
if (idx != NULL) {
- indexClose(idx);
+ indexDestroy(idx);
}
*index = NULL;
return ret;
diff --git a/source/libs/index/src/indexCache.c b/source/libs/index/src/indexCache.c
index 72f693f7e518f00a7a1982598f7d97bca949056c..0bb454571adebae9695ae07cf7ff6af4efd9e95f 100644
--- a/source/libs/index/src/indexCache.c
+++ b/source/libs/index/src/indexCache.c
@@ -538,7 +538,7 @@ int idxCachePut(void* cache, SIndexTerm* term, uint64_t uid) {
idxCacheRef(pCache);
// encode data
CacheTerm* ct = taosMemoryCalloc(1, sizeof(CacheTerm));
- if (cache == NULL) {
+ if (ct == NULL) {
return -1;
}
// set up key
@@ -730,15 +730,17 @@ static int32_t idxCacheJsonTermCompare(const void* l, const void* r) {
return cmp;
}
static MemTable* idxInternalCacheCreate(int8_t type) {
- int ttype = IDX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? TSDB_DATA_TYPE_BINARY : TSDB_DATA_TYPE_BINARY;
+ // int ttype = IDX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? TSDB_DATA_TYPE_BINARY :
+ // TSDB_DATA_TYPE_BINARY;
+ int ttype = TSDB_DATA_TYPE_BINARY;
int32_t (*cmpFn)(const void* l, const void* r) =
IDX_TYPE_CONTAIN_EXTERN_TYPE(type, TSDB_DATA_TYPE_JSON) ? idxCacheJsonTermCompare : idxCacheTermCompare;
MemTable* tbl = taosMemoryCalloc(1, sizeof(MemTable));
idxMemRef(tbl);
- if (ttype == TSDB_DATA_TYPE_BINARY || ttype == TSDB_DATA_TYPE_NCHAR) {
- tbl->mem = tSkipListCreate(MAX_SKIP_LIST_LEVEL, ttype, MAX_INDEX_KEY_LEN, cmpFn, SL_ALLOW_DUP_KEY, idxCacheTermGet);
- }
+ // if (ttype == TSDB_DATA_TYPE_BINARY || ttype == TSDB_DATA_TYPE_NCHAR) {
+ tbl->mem = tSkipListCreate(MAX_SKIP_LIST_LEVEL, ttype, MAX_INDEX_KEY_LEN, cmpFn, SL_ALLOW_DUP_KEY, idxCacheTermGet);
+ //}
return tbl;
}
diff --git a/source/libs/index/src/indexComm.c b/source/libs/index/src/indexComm.c
index ecf91360734e37f0060aeb7758e5c4c5d57d4972..e3f140047ab1fa02b328813293300096386cc4d6 100644
--- a/source/libs/index/src/indexComm.c
+++ b/source/libs/index/src/indexComm.c
@@ -367,7 +367,7 @@ int32_t idxConvertData(void* src, int8_t type, void** dst) {
tlen = taosEncodeBinary(dst, src, strlen(src));
break;
default:
- TASSERT(0);
+ ASSERT(0);
break;
}
*dst = (char*)*dst - tlen;
@@ -427,6 +427,7 @@ int32_t idxConvertDataToStr(void* src, int8_t type, void** dst) {
*dst = taosMemoryCalloc(1, bufSize + 1);
idxInt2str(*(uint64_t*)src, *dst, 1);
tlen = strlen(*dst);
+ break;
case TSDB_DATA_TYPE_FLOAT:
*dst = taosMemoryCalloc(1, bufSize + 1);
sprintf(*dst, "%.9lf", *(float*)src);
@@ -458,7 +459,7 @@ int32_t idxConvertDataToStr(void* src, int8_t type, void** dst) {
*dst = (char*)*dst - tlen;
break;
default:
- TASSERT(0);
+ ASSERT(0);
break;
}
return tlen;
diff --git a/source/libs/index/src/indexFilter.c b/source/libs/index/src/indexFilter.c
index 6d81499dbcf13cec4143ef79f3dd6735f70253c6..075408f1b34954c215cc9fc11fbc08b384014001 100644
--- a/source/libs/index/src/indexFilter.c
+++ b/source/libs/index/src/indexFilter.c
@@ -231,7 +231,9 @@ static int32_t sifInitParam(SNode *node, SIFParam *param, SIFCtx *ctx) {
SIF_ERR_RET(sifGetValueFromNode(node, ¶m->condValue));
param->colId = -1;
param->colValType = (uint8_t)(vn->node.resType.type);
- memcpy(param->colName, vn->literal, strlen(vn->literal));
+ if (strlen(vn->literal) <= sizeof(param->colName)) {
+ memcpy(param->colName, vn->literal, strlen(vn->literal));
+ }
break;
}
case QUERY_NODE_COLUMN: {
@@ -400,54 +402,52 @@ static FORCE_INLINE FilterFunc sifGetFilterFunc(EIndexQueryType type, bool *reve
static void sifSetFltParam(SIFParam *left, SIFParam *right, SDataTypeBuf *typedata, SMetaFltParam *param) {
int8_t ltype = left->colValType, rtype = right->colValType;
if (ltype == TSDB_DATA_TYPE_FLOAT) {
- float f;
+ float f = 0;
SIF_DATA_CONVERT(rtype, right->condValue, f);
typedata->f = f;
param->val = &typedata->f;
} else if (ltype == TSDB_DATA_TYPE_DOUBLE) {
- double d;
+ double d = 0;
SIF_DATA_CONVERT(rtype, right->condValue, d);
typedata->d = d;
param->val = &typedata->d;
} else if (ltype == TSDB_DATA_TYPE_BIGINT) {
- int64_t i64;
+ int64_t i64 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, i64);
typedata->i64 = i64;
param->val = &typedata->i64;
} else if (ltype == TSDB_DATA_TYPE_INT) {
- int32_t i32;
+ int32_t i32 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, i32);
typedata->i32 = i32;
param->val = &typedata->i32;
} else if (ltype == TSDB_DATA_TYPE_SMALLINT) {
- int16_t i16;
-
+ int16_t i16 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, i16);
typedata->i16 = i16;
param->val = &typedata->i16;
} else if (ltype == TSDB_DATA_TYPE_TINYINT) {
- int8_t i8;
+ int8_t i8 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, i8)
typedata->i8 = i8;
param->val = &typedata->i8;
} else if (ltype == TSDB_DATA_TYPE_UBIGINT) {
- uint64_t u64;
+ uint64_t u64 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, u64);
typedata->u64 = u64;
param->val = &typedata->u64;
-
} else if (ltype == TSDB_DATA_TYPE_UINT) {
- uint32_t u32;
+ uint32_t u32 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, u32);
typedata->u32 = u32;
param->val = &typedata->u32;
} else if (ltype == TSDB_DATA_TYPE_USMALLINT) {
- uint16_t u16;
+ uint16_t u16 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, u16);
typedata->u16 = u16;
param->val = &typedata->u16;
} else if (ltype == TSDB_DATA_TYPE_UTINYINT) {
- uint8_t u8;
+ uint8_t u8 = 0;
SIF_DATA_CONVERT(rtype, right->condValue, u8);
typedata->u8 = u8;
param->val = &typedata->u8;
@@ -663,7 +663,7 @@ static int32_t sifExecOper(SOperatorNode *node, SIFCtx *ctx, SIFParam *output) {
// ugly code, refactor later
if (nParam > 1 && params[1].status == SFLT_NOT_INDEX) {
output->status = SFLT_NOT_INDEX;
- return code;
+ goto _return;
}
SIF_ERR_JRET(sifGetOperFn(node->opType, &operFn, &output->status));
}
diff --git a/source/libs/index/src/indexFst.c b/source/libs/index/src/indexFst.c
index 01dffa782d93a5218a988d2c156f85662e5cd0fb..aed2ec3ee321011d9777b437ae9453296b6bbc62 100644
--- a/source/libs/index/src/indexFst.c
+++ b/source/libs/index/src/indexFst.c
@@ -338,7 +338,7 @@ uint8_t fstStateCommInput(FstState* s, bool* null) {
return v;
}
// 0 indicate that common_input is None
- return v == 0 ? 0 : COMMON_INPUT(v);
+ return COMMON_INPUT(v);
}
// input_len
diff --git a/source/libs/index/src/indexFstFile.c b/source/libs/index/src/indexFstFile.c
index 7021fdfae33fc89289e4506fcf40fbfef9601505..33960ad8c233bdbae32bb7847bdddaf26439d132 100644
--- a/source/libs/index/src/indexFstFile.c
+++ b/source/libs/index/src/indexFstFile.c
@@ -72,7 +72,8 @@ static int idxFileCtxDoReadFrom(IFileCtx* ctx, uint8_t* buf, int len, int32_t of
if (offset >= ctx->file.size) return 0;
do {
- char key[128] = {0};
+ char key[1024] = {0};
+ assert(strlen(ctx->file.buf) + 1 + 64 < sizeof(key));
idxGenLRUKey(key, ctx->file.buf, blkId);
LRUHandle* h = taosLRUCacheLookup(ctx->lru, key, strlen(key));
@@ -99,6 +100,7 @@ static int idxFileCtxDoReadFrom(IFileCtx* ctx, uint8_t* buf, int len, int32_t of
assert(blk->nread <= kBlockSize);
if (blk->nread < kBlockSize && blk->nread < len) {
+ taosMemoryFree(blk);
break;
}
@@ -150,7 +152,7 @@ IFileCtx* idxFileCtxCreate(WriterType type, const char* path, bool readOnly, int
if (ctx->type == TFILE) {
// ugly code, refactor later
ctx->file.readOnly = readOnly;
- memcpy(ctx->file.buf, path, strlen(path));
+ memcpy(ctx->file.buf, path, sizeof(ctx->file.buf));
if (readOnly == false) {
ctx->file.pFile = taosOpenFile(path, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
taosFtruncateFile(ctx->file.pFile, 0);
diff --git a/source/libs/index/src/indexTfile.c b/source/libs/index/src/indexTfile.c
index e746bb43034db6fee9fd1f27ae3cdc5979830b47..4fdf6d9e57309897fef1a3b378966c8b667f8fbe 100644
--- a/source/libs/index/src/indexTfile.c
+++ b/source/libs/index/src/indexTfile.c
@@ -506,7 +506,9 @@ TFileWriter* tfileWriterOpen(char* path, uint64_t suid, int64_t version, const c
tfh.suid = suid;
tfh.version = version;
tfh.colType = colType;
- memcpy(tfh.colName, colName, strlen(colName));
+ if (strlen(colName) <= sizeof(tfh.colName)) {
+ memcpy(tfh.colName, colName, strlen(colName));
+ }
return tfileWriterCreate(wcx, &tfh);
}
@@ -580,8 +582,14 @@ int tfileWriterPut(TFileWriter* tw, void* data, bool order) {
if (cap < ttsz) {
cap = ttsz;
- buf = (char*)taosMemoryRealloc(buf, cap);
+ char* t = (char*)taosMemoryRealloc(buf, cap);
+ if (t == NULL) {
+ taosMemoryFree(buf);
+ return -1;
+ }
+ buf = t;
}
+
char* p = buf;
tfileSerialTableIdsToBuf(p, v->tableId);
tw->ctx->write(tw->ctx, buf, ttsz);
diff --git a/source/libs/monitor/src/monMain.c b/source/libs/monitor/src/monMain.c
index eab5a334508765f876a2289af90190ec2648df2b..70792ee6111e60e6ba002aa1100f898add979d07 100644
--- a/source/libs/monitor/src/monMain.c
+++ b/source/libs/monitor/src/monMain.c
@@ -401,7 +401,6 @@ static void monGenDnodeJson(SMonInfo *pMonitor) {
tjsonAddDoubleToObject(pJson, "has_mnode", pInfo->has_mnode);
tjsonAddDoubleToObject(pJson, "has_qnode", pInfo->has_qnode);
tjsonAddDoubleToObject(pJson, "has_snode", pInfo->has_snode);
- tjsonAddDoubleToObject(pJson, "has_bnode", pInfo->has_bnode);
}
static void monGenDiskJson(SMonInfo *pMonitor) {
@@ -451,17 +450,10 @@ static void monGenDiskJson(SMonInfo *pMonitor) {
}
static const char *monLogLevelStr(ELogLevel level) {
- switch (level) {
- case DEBUG_ERROR:
- return "error";
- case DEBUG_INFO:
- return "info";
- case DEBUG_DEBUG:
- return "debug";
- case DEBUG_TRACE:
- return "trace";
- default:
- return "undefine";
+ if (level == DEBUG_ERROR) {
+ return "error";
+ } else {
+ return "info";
}
}
diff --git a/source/libs/monitor/src/monMsg.c b/source/libs/monitor/src/monMsg.c
index bbee8b1166903bfcafb611baf7b2bf8ed8b48699..c20055067e5b925306dfc7746d93db5a02c12d1e 100644
--- a/source/libs/monitor/src/monMsg.c
+++ b/source/libs/monitor/src/monMsg.c
@@ -18,272 +18,6 @@
#include "tcoding.h"
#include "tencode.h"
-static int32_t tEncodeSMonSysInfo(SEncoder *encoder, const SMonSysInfo *pInfo) {
- if (tEncodeDouble(encoder, pInfo->cpu_engine) < 0) return -1;
- if (tEncodeDouble(encoder, pInfo->cpu_system) < 0) return -1;
- if (tEncodeFloat(encoder, pInfo->cpu_cores) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->mem_engine) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->mem_system) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->mem_total) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->disk_engine) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->disk_used) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->disk_total) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->net_in) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->net_out) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->io_read) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->io_write) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->io_read_disk) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->io_write_disk) < 0) return -1;
- return 0;
-}
-
-static int32_t tDecodeSMonSysInfo(SDecoder *decoder, SMonSysInfo *pInfo) {
- if (tDecodeDouble(decoder, &pInfo->cpu_engine) < 0) return -1;
- if (tDecodeDouble(decoder, &pInfo->cpu_system) < 0) return -1;
- if (tDecodeFloat(decoder, &pInfo->cpu_cores) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->mem_engine) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->mem_system) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->mem_total) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->disk_engine) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->disk_used) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->disk_total) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->net_in) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->net_out) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->io_read) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->io_write) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->io_read_disk) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->io_write_disk) < 0) return -1;
- return 0;
-}
-
-int32_t tEncodeSMonLogs(SEncoder *encoder, const SMonLogs *pInfo) {
- if (tEncodeI32(encoder, pInfo->numOfErrorLogs) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->numOfInfoLogs) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->numOfDebugLogs) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->numOfTraceLogs) < 0) return -1;
- if (tEncodeI32(encoder, taosArrayGetSize(pInfo->logs)) < 0) return -1;
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->logs); ++i) {
- SMonLogItem *pLog = taosArrayGet(pInfo->logs, i);
- if (tEncodeI64(encoder, pLog->ts) < 0) return -1;
- if (tEncodeI8(encoder, pLog->level) < 0) return -1;
- if (tEncodeCStr(encoder, pLog->content) < 0) return -1;
- }
- return 0;
-}
-
-static int32_t tDecodeSMonLogs(SDecoder *decoder, SMonLogs *pInfo) {
- if (tDecodeI32(decoder, &pInfo->numOfErrorLogs) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->numOfInfoLogs) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->numOfDebugLogs) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->numOfTraceLogs) < 0) return -1;
-
- int32_t arraySize = 0;
- if (tDecodeI32(decoder, &arraySize) < 0) return -1;
-
- pInfo->logs = taosArrayInit(arraySize, sizeof(SMonLogItem));
- if (pInfo->logs == NULL) return -1;
-
- for (int32_t i = 0; i < arraySize; ++i) {
- SMonLogItem desc = {0};
- if (tDecodeI64(decoder, &desc.ts) < 0) return -1;
- int8_t level = 0;
- if (tDecodeI8(decoder, &level) < 0) return -1;
- desc.level = level;
- if (tDecodeCStrTo(decoder, desc.content) < 0) return -1;
- taosArrayPush(pInfo->logs, &desc);
- }
-
- return 0;
-}
-
-int32_t tEncodeSMonClusterInfo(SEncoder *encoder, const SMonClusterInfo *pInfo) {
- if (tEncodeCStr(encoder, pInfo->first_ep) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->first_ep_dnode_id) < 0) return -1;
- if (tEncodeCStr(encoder, pInfo->version) < 0) return -1;
- if (tEncodeFloat(encoder, pInfo->master_uptime) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->monitor_interval) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->dbs_total) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->stbs_total) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->tbs_total) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->vgroups_total) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->vgroups_alive) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->vnodes_total) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->vnodes_alive) < 0) return -1;
- if (tEncodeI32(encoder, pInfo->connections_total) < 0) return -1;
- if (tEncodeI32(encoder, taosArrayGetSize(pInfo->dnodes)) < 0) return -1;
- if (tEncodeI32(encoder, taosArrayGetSize(pInfo->mnodes)) < 0) return -1;
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->dnodes); ++i) {
- SMonDnodeDesc *pDesc = taosArrayGet(pInfo->dnodes, i);
- if (tEncodeI32(encoder, pDesc->dnode_id) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->dnode_ep) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->status) < 0) return -1;
- }
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->mnodes); ++i) {
- SMonMnodeDesc *pDesc = taosArrayGet(pInfo->mnodes, i);
- if (tEncodeI32(encoder, pDesc->mnode_id) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->mnode_ep) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->role) < 0) return -1;
- }
- return 0;
-}
-
-int32_t tDecodeSMonClusterInfo(SDecoder *decoder, SMonClusterInfo *pInfo) {
- if (tDecodeCStrTo(decoder, pInfo->first_ep) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->first_ep_dnode_id) < 0) return -1;
- if (tDecodeCStrTo(decoder, pInfo->version) < 0) return -1;
- if (tDecodeFloat(decoder, &pInfo->master_uptime) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->monitor_interval) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->dbs_total) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->stbs_total) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->tbs_total) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->vgroups_total) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->vgroups_alive) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->vnodes_total) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->vnodes_alive) < 0) return -1;
- if (tDecodeI32(decoder, &pInfo->connections_total) < 0) return -1;
-
- int32_t dnodesSize = 0;
- int32_t mnodesSize = 0;
- if (tDecodeI32(decoder, &dnodesSize) < 0) return -1;
- if (tDecodeI32(decoder, &mnodesSize) < 0) return -1;
-
- pInfo->dnodes = taosArrayInit(dnodesSize, sizeof(SMonDnodeDesc));
- pInfo->mnodes = taosArrayInit(mnodesSize, sizeof(SMonMnodeDesc));
- if (pInfo->dnodes == NULL || pInfo->mnodes == NULL) return -1;
-
- for (int32_t i = 0; i < dnodesSize; ++i) {
- SMonDnodeDesc desc = {0};
- if (tDecodeI32(decoder, &desc.dnode_id) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.dnode_ep) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.status) < 0) return -1;
- taosArrayPush(pInfo->dnodes, &desc);
- }
-
- for (int32_t i = 0; i < mnodesSize; ++i) {
- SMonMnodeDesc desc = {0};
- if (tDecodeI32(decoder, &desc.mnode_id) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.mnode_ep) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.role) < 0) return -1;
- taosArrayPush(pInfo->mnodes, &desc);
- }
- return 0;
-}
-
-int32_t tEncodeSMonVgroupInfo(SEncoder *encoder, const SMonVgroupInfo *pInfo) {
- if (tEncodeI32(encoder, taosArrayGetSize(pInfo->vgroups)) < 0) return -1;
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->vgroups); ++i) {
- SMonVgroupDesc *pDesc = taosArrayGet(pInfo->vgroups, i);
- if (tEncodeI32(encoder, pDesc->vgroup_id) < 0) return -1;
- if (tEncodeI32(encoder, pDesc->tables_num) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->database_name) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->status) < 0) return -1;
- for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) {
- SMonVnodeDesc *pVDesc = &pDesc->vnodes[j];
- if (tEncodeI32(encoder, pVDesc->dnode_id) < 0) return -1;
- if (tEncodeCStr(encoder, pVDesc->vnode_role) < 0) return -1;
- }
- }
- return 0;
-}
-
-int32_t tDecodeSMonVgroupInfo(SDecoder *decoder, SMonVgroupInfo *pInfo) {
- int32_t arraySize = 0;
- if (tDecodeI32(decoder, &arraySize) < 0) return -1;
-
- pInfo->vgroups = taosArrayInit(arraySize, sizeof(SMonVgroupDesc));
- if (pInfo->vgroups == NULL) return -1;
-
- for (int32_t i = 0; i < arraySize; ++i) {
- SMonVgroupDesc desc = {0};
- if (tDecodeI32(decoder, &desc.vgroup_id) < 0) return -1;
- if (tDecodeI32(decoder, &desc.tables_num) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.database_name) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.status) < 0) return -1;
- for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) {
- SMonVnodeDesc *pVDesc = &desc.vnodes[j];
- if (tDecodeI32(decoder, &pVDesc->dnode_id) < 0) return -1;
- if (tDecodeCStrTo(decoder, pVDesc->vnode_role) < 0) return -1;
- }
- taosArrayPush(pInfo->vgroups, &desc);
- }
- return 0;
-}
-
-int32_t tEncodeSMonStbInfo(SEncoder *encoder, const SMonStbInfo *pInfo) {
- if (tEncodeI32(encoder, taosArrayGetSize(pInfo->stbs)) < 0) return -1;
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->stbs); ++i) {
- SMonStbDesc *pDesc = taosArrayGet(pInfo->stbs, i);
- if (tEncodeCStr(encoder, pDesc->stb_name) < 0) return -1;
- if (tEncodeCStr(encoder, pDesc->database_name) < 0) return -1;
- }
- return 0;
-}
-
-int32_t tDecodeSMonStbInfo(SDecoder *decoder, SMonStbInfo *pInfo) {
- int32_t arraySize = 0;
- if (tDecodeI32(decoder, &arraySize) < 0) return -1;
-
- pInfo->stbs = taosArrayInit(arraySize, sizeof(SMonStbDesc));
- if (pInfo->stbs == NULL) return -1;
-
- for (int32_t i = 0; i < arraySize; ++i) {
- SMonStbDesc desc = {0};
- if (tDecodeCStrTo(decoder, desc.stb_name) < 0) return -1;
- if (tDecodeCStrTo(decoder, desc.database_name) < 0) return -1;
- taosArrayPush(pInfo->stbs, &desc);
- }
- return 0;
-}
-
-int32_t tEncodeSMonGrantInfo(SEncoder *encoder, const SMonGrantInfo *pInfo) {
- if (tEncodeI32(encoder, pInfo->expire_time) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->timeseries_used) < 0) return -1;
- if (tEncodeI64(encoder, pInfo->timeseries_total) < 0) return -1;
- return 0;
-}
-
-int32_t tDecodeSMonGrantInfo(SDecoder *decoder, SMonGrantInfo *pInfo) {
- if (tDecodeI32(decoder, &pInfo->expire_time) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->timeseries_used) < 0) return -1;
- if (tDecodeI64(decoder, &pInfo->timeseries_total) < 0) return -1;
- return 0;
-}
-
-int32_t tSerializeSMonMmInfo(void *buf, int32_t bufLen, SMonMmInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeSMonClusterInfo(&encoder, &pInfo->cluster) < 0) return -1;
- if (tEncodeSMonVgroupInfo(&encoder, &pInfo->vgroup) < 0) return -1;
- if (tEncodeSMonStbInfo(&encoder, &pInfo->stb) < 0) return -1;
- if (tEncodeSMonGrantInfo(&encoder, &pInfo->grant) < 0) return -1;
- if (tEncodeSMonSysInfo(&encoder, &pInfo->sys) < 0) return -1;
- if (tEncodeSMonLogs(&encoder, &pInfo->log) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonMmInfo(void *buf, int32_t bufLen, SMonMmInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeSMonClusterInfo(&decoder, &pInfo->cluster) < 0) return -1;
- if (tDecodeSMonVgroupInfo(&decoder, &pInfo->vgroup) < 0) return -1;
- if (tDecodeSMonStbInfo(&decoder, &pInfo->stb) < 0) return -1;
- if (tDecodeSMonGrantInfo(&decoder, &pInfo->grant) < 0) return -1;
- if (tDecodeSMonSysInfo(&decoder, &pInfo->sys) < 0) return -1;
- if (tDecodeSMonLogs(&decoder, &pInfo->log) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
-
void tFreeSMonMmInfo(SMonMmInfo *pInfo) {
taosArrayDestroy(pInfo->log.logs);
taosArrayDestroy(pInfo->cluster.mnodes);
@@ -297,106 +31,6 @@ void tFreeSMonMmInfo(SMonMmInfo *pInfo) {
pInfo->log.logs = NULL;
}
-int32_t tEncodeSMonDiskDesc(SEncoder *encoder, const SMonDiskDesc *pDesc) {
- if (tEncodeCStr(encoder, pDesc->name) < 0) return -1;
- if (tEncodeI8(encoder, pDesc->level) < 0) return -1;
- if (tEncodeI64(encoder, pDesc->size.total) < 0) return -1;
- if (tEncodeI64(encoder, pDesc->size.used) < 0) return -1;
- if (tEncodeI64(encoder, pDesc->size.avail) < 0) return -1;
- return 0;
-}
-
-static int32_t tDecodeSMonDiskDesc(SDecoder *decoder, SMonDiskDesc *pDesc) {
- if (tDecodeCStrTo(decoder, pDesc->name) < 0) return -1;
- if (tDecodeI8(decoder, &pDesc->level) < 0) return -1;
- if (tDecodeI64(decoder, &pDesc->size.total) < 0) return -1;
- if (tDecodeI64(decoder, &pDesc->size.used) < 0) return -1;
- if (tDecodeI64(decoder, &pDesc->size.avail) < 0) return -1;
- return 0;
-}
-
-int32_t tEncodeSMonDiskInfo(SEncoder *encoder, const SMonDiskInfo *pInfo) {
- if (tEncodeI32(encoder, taosArrayGetSize(pInfo->datadirs)) < 0) return -1;
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->datadirs); ++i) {
- SMonDiskDesc *pDesc = taosArrayGet(pInfo->datadirs, i);
- if (tEncodeSMonDiskDesc(encoder, pDesc) < 0) return -1;
- }
- return 0;
-}
-
-static int32_t tDecodeSMonDiskInfo(SDecoder *decoder, SMonDiskInfo *pInfo) {
- int32_t arraySize = 0;
- if (tDecodeI32(decoder, &arraySize) < 0) return -1;
-
- pInfo->datadirs = taosArrayInit(arraySize, sizeof(SMonDiskDesc));
- if (pInfo->datadirs == NULL) return -1;
-
- for (int32_t i = 0; i < arraySize; ++i) {
- SMonDiskDesc desc = {0};
- if (tDecodeSMonDiskDesc(decoder, &desc) < 0) return -1;
- taosArrayPush(pInfo->datadirs, &desc);
- }
-
- return 0;
-}
-
-int32_t tEncodeSVnodesStat(SEncoder *encoder, const SVnodesStat *pStat) {
- if (tEncodeI32(encoder, pStat->openVnodes) < 0) return -1;
- if (tEncodeI32(encoder, pStat->totalVnodes) < 0) return -1;
- if (tEncodeI32(encoder, pStat->masterNum) < 0) return -1;
- if (tEncodeI64(encoder, pStat->numOfSelectReqs) < 0) return -1;
- if (tEncodeI64(encoder, pStat->numOfInsertReqs) < 0) return -1;
- if (tEncodeI64(encoder, pStat->numOfInsertSuccessReqs) < 0) return -1;
- if (tEncodeI64(encoder, pStat->numOfBatchInsertReqs) < 0) return -1;
- if (tEncodeI64(encoder, pStat->numOfBatchInsertSuccessReqs) < 0) return -1;
- if (tEncodeI64(encoder, pStat->errors) < 0) return -1;
- return 0;
-}
-
-static int32_t tDecodeSVnodesStat(SDecoder *decoder, SVnodesStat *pStat) {
- if (tDecodeI32(decoder, &pStat->openVnodes) < 0) return -1;
- if (tDecodeI32(decoder, &pStat->totalVnodes) < 0) return -1;
- if (tDecodeI32(decoder, &pStat->masterNum) < 0) return -1;
- if (tDecodeI64(decoder, &pStat->numOfSelectReqs) < 0) return -1;
- if (tDecodeI64(decoder, &pStat->numOfInsertReqs) < 0) return -1;
- if (tDecodeI64(decoder, &pStat->numOfInsertSuccessReqs) < 0) return -1;
- if (tDecodeI64(decoder, &pStat->numOfBatchInsertReqs) < 0) return -1;
- if (tDecodeI64(decoder, &pStat->numOfBatchInsertSuccessReqs) < 0) return -1;
- if (tDecodeI64(decoder, &pStat->errors) < 0) return -1;
- return 0;
-}
-
-int32_t tSerializeSMonVmInfo(void *buf, int32_t bufLen, SMonVmInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeSMonDiskInfo(&encoder, &pInfo->tfs) < 0) return -1;
- if (tEncodeSVnodesStat(&encoder, &pInfo->vstat) < 0) return -1;
- if (tEncodeSMonSysInfo(&encoder, &pInfo->sys) < 0) return -1;
- if (tEncodeSMonLogs(&encoder, &pInfo->log) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonVmInfo(void *buf, int32_t bufLen, SMonVmInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeSMonDiskInfo(&decoder, &pInfo->tfs) < 0) return -1;
- if (tDecodeSVnodesStat(&decoder, &pInfo->vstat) < 0) return -1;
- if (tDecodeSMonSysInfo(&decoder, &pInfo->sys) < 0) return -1;
- if (tDecodeSMonLogs(&decoder, &pInfo->log) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
-
void tFreeSMonVmInfo(SMonVmInfo *pInfo) {
taosArrayDestroy(pInfo->log.logs);
taosArrayDestroy(pInfo->tfs.datadirs);
@@ -404,239 +38,17 @@ void tFreeSMonVmInfo(SMonVmInfo *pInfo) {
pInfo->tfs.datadirs = NULL;
}
-int32_t tSerializeSMonQmInfo(void *buf, int32_t bufLen, SMonQmInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeSMonSysInfo(&encoder, &pInfo->sys) < 0) return -1;
- if (tEncodeSMonLogs(&encoder, &pInfo->log) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonQmInfo(void *buf, int32_t bufLen, SMonQmInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeSMonSysInfo(&decoder, &pInfo->sys) < 0) return -1;
- if (tDecodeSMonLogs(&decoder, &pInfo->log) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
-
void tFreeSMonQmInfo(SMonQmInfo *pInfo) {
taosArrayDestroy(pInfo->log.logs);
pInfo->log.logs = NULL;
}
-int32_t tSerializeSMonSmInfo(void *buf, int32_t bufLen, SMonSmInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeSMonSysInfo(&encoder, &pInfo->sys) < 0) return -1;
- if (tEncodeSMonLogs(&encoder, &pInfo->log) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonSmInfo(void *buf, int32_t bufLen, SMonSmInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeSMonSysInfo(&decoder, &pInfo->sys) < 0) return -1;
- if (tDecodeSMonLogs(&decoder, &pInfo->log) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
-
void tFreeSMonSmInfo(SMonSmInfo *pInfo) {
taosArrayDestroy(pInfo->log.logs);
pInfo->log.logs = NULL;
}
-int32_t tSerializeSMonBmInfo(void *buf, int32_t bufLen, SMonBmInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeSMonSysInfo(&encoder, &pInfo->sys) < 0) return -1;
- if (tEncodeSMonLogs(&encoder, &pInfo->log) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonBmInfo(void *buf, int32_t bufLen, SMonBmInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeSMonSysInfo(&decoder, &pInfo->sys) < 0) return -1;
- if (tDecodeSMonLogs(&decoder, &pInfo->log) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
-
void tFreeSMonBmInfo(SMonBmInfo *pInfo) {
taosArrayDestroy(pInfo->log.logs);
pInfo->log.logs = NULL;
}
-
-int32_t tSerializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeI32(&encoder, taosArrayGetSize(pInfo->pVloads)) < 0) return -1;
- for (int32_t i = 0; i < taosArrayGetSize(pInfo->pVloads); ++i) {
- SVnodeLoad *pLoad = taosArrayGet(pInfo->pVloads, i);
- if (tEncodeI32(&encoder, pLoad->vgId) < 0) return -1;
- if (tEncodeI32(&encoder, pLoad->syncState) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->cacheUsage) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfTables) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfTimeSeries) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->totalStorage) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->compStorage) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->pointsWritten) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfSelectReqs) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfInsertReqs) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfInsertSuccessReqs) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfBatchInsertReqs) < 0) return -1;
- if (tEncodeI64(&encoder, pLoad->numOfBatchInsertSuccessReqs) < 0) return -1;
- }
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonVloadInfo(void *buf, int32_t bufLen, SMonVloadInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
-
- int32_t arraySize = 0;
- if (tDecodeI32(&decoder, &arraySize) < 0) return -1;
-
- pInfo->pVloads = taosArrayInit(arraySize, sizeof(SVnodeLoad));
- if (pInfo->pVloads == NULL) return -1;
-
- for (int32_t i = 0; i < arraySize; ++i) {
- SVnodeLoad load = {0};
- if (tDecodeI32(&decoder, &load.vgId) < 0) return -1;
- if (tDecodeI32(&decoder, &load.syncState) < 0) return -1;
- if (tDecodeI64(&decoder, &load.cacheUsage) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfTables) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfTimeSeries) < 0) return -1;
- if (tDecodeI64(&decoder, &load.totalStorage) < 0) return -1;
- if (tDecodeI64(&decoder, &load.compStorage) < 0) return -1;
- if (tDecodeI64(&decoder, &load.pointsWritten) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfSelectReqs) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfInsertReqs) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfInsertSuccessReqs) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfBatchInsertReqs) < 0) return -1;
- if (tDecodeI64(&decoder, &load.numOfBatchInsertSuccessReqs) < 0) return -1;
- taosArrayPush(pInfo->pVloads, &load);
- }
-
- tEndDecode(&decoder);
- tDecoderClear(&decoder);
- return 0;
-}
-
-void tFreeSMonVloadInfo(SMonVloadInfo *pInfo) {
- taosArrayDestroy(pInfo->pVloads);
- pInfo->pVloads = NULL;
-}
-
-int32_t tSerializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeI8(&encoder, pInfo->isMnode) < 0) return -1;
- if (tEncodeI32(&encoder, pInfo->load.syncState) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSMonMloadInfo(void *buf, int32_t bufLen, SMonMloadInfo *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeI8(&decoder, &pInfo->isMnode) < 0) return -1;
- if (tDecodeI32(&decoder, &pInfo->load.syncState) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
-
-int32_t tSerializeSQnodeLoad(void *buf, int32_t bufLen, SQnodeLoad *pInfo) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
-
- if (tStartEncode(&encoder) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfProcessedQuery) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfProcessedCQuery) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfProcessedFetch) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfProcessedDrop) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfProcessedHb) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfProcessedDelete) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->cacheDataSize) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfQueryInQueue) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->numOfFetchInQueue) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->timeInQueryQueue) < 0) return -1;
- if (tEncodeI64(&encoder, pInfo->timeInFetchQueue) < 0) return -1;
- tEndEncode(&encoder);
-
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
-}
-
-int32_t tDeserializeSQnodeLoad(void *buf, int32_t bufLen, SQnodeLoad *pInfo) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
-
- if (tStartDecode(&decoder) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfProcessedQuery) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfProcessedCQuery) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfProcessedFetch) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfProcessedDrop) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfProcessedHb) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfProcessedDelete) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->cacheDataSize) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfQueryInQueue) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->numOfFetchInQueue) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->timeInQueryQueue) < 0) return -1;
- if (tDecodeI64(&decoder, &pInfo->timeInFetchQueue) < 0) return -1;
- tEndDecode(&decoder);
-
- tDecoderClear(&decoder);
- return 0;
-}
diff --git a/source/libs/nodes/src/nodesMsgFuncs.c b/source/libs/nodes/src/nodesMsgFuncs.c
index 9e89955ae5394db0923ab8eb82d99bde755a8e53..04e6bcff4349d1db1a5f447a43616c68f317f9ab 100644
--- a/source/libs/nodes/src/nodesMsgFuncs.c
+++ b/source/libs/nodes/src/nodesMsgFuncs.c
@@ -84,13 +84,12 @@ static void endTlvEncode(STlvEncoder* pEncoder, char** pMsg, int32_t* pLen) {
*pMsg = pEncoder->pBuf;
pEncoder->pBuf = NULL;
*pLen = pEncoder->offset;
- // nodesWarn("encode tlv count = %d, tl size = %d", pEncoder->tlvCount, sizeof(STlv) * pEncoder->tlvCount);
}
static int32_t tlvEncodeImpl(STlvEncoder* pEncoder, int16_t type, const void* pValue, int32_t len) {
int32_t tlvLen = sizeof(STlv) + len;
if (pEncoder->offset + tlvLen > pEncoder->allocSize) {
- pEncoder->allocSize = TMAX(pEncoder->allocSize * 2, pEncoder->allocSize + pEncoder->offset + tlvLen);
+ pEncoder->allocSize = TMAX(pEncoder->allocSize * 2, pEncoder->allocSize + tlvLen);
void* pNewBuf = taosMemoryRealloc(pEncoder->pBuf, pEncoder->allocSize);
if (NULL == pNewBuf) {
return TSDB_CODE_OUT_OF_MEMORY;
@@ -241,6 +240,15 @@ static int32_t tlvEncodeObj(STlvEncoder* pEncoder, int16_t type, FToMsg func, co
return TSDB_CODE_SUCCESS;
}
+ if (pEncoder->offset + sizeof(STlv) > pEncoder->allocSize) {
+ pEncoder->allocSize = TMAX(pEncoder->allocSize * 2, pEncoder->allocSize + sizeof(STlv));
+ void* pNewBuf = taosMemoryRealloc(pEncoder->pBuf, pEncoder->allocSize);
+ if (NULL == pNewBuf) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+ pEncoder->pBuf = pNewBuf;
+ }
+
int32_t start = pEncoder->offset;
pEncoder->offset += sizeof(STlv);
int32_t code = func(pObj, pEncoder);
@@ -307,7 +315,7 @@ static int32_t tlvDecodeImpl(STlv* pTlv, void* pValue, int32_t len) {
}
static int32_t tlvDecodeValueImpl(STlvDecoder* pDecoder, void* pValue, int32_t len) {
- if (pDecoder->offset + len > pDecoder->bufSize) {
+ if (len > pDecoder->bufSize - pDecoder->offset) {
return TSDB_CODE_FAILED;
}
memcpy(pValue, pDecoder->pBuf + pDecoder->offset, len);
@@ -911,6 +919,10 @@ static int32_t msgToDatum(STlv* pTlv, void* pObj) {
case TSDB_DATA_TYPE_NCHAR:
case TSDB_DATA_TYPE_VARCHAR:
case TSDB_DATA_TYPE_VARBINARY: {
+ if (pTlv->len > pNode->node.resType.bytes + VARSTR_HEADER_SIZE) {
+ code = TSDB_CODE_FAILED;
+ break;
+ }
pNode->datum.p = taosMemoryCalloc(1, pNode->node.resType.bytes + VARSTR_HEADER_SIZE + 1);
if (NULL == pNode->datum.p) {
code = TSDB_CODE_OUT_OF_MEMORY;
diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c
index bc0c4d42bbccc66e8a00179d523f86159f03e33e..e6474388003fd1a488553d889e1b53028fa1c6c5 100644
--- a/source/libs/nodes/src/nodesUtilFuncs.c
+++ b/source/libs/nodes/src/nodesUtilFuncs.c
@@ -190,14 +190,23 @@ int32_t nodesReleaseAllocator(int64_t allocatorId) {
return TSDB_CODE_SUCCESS;
}
- if (NULL == g_pNodeAllocator) {
+ SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
+ if (NULL == pAllocator) {
+ return terrno;
+ }
+
+ int32_t code = taosThreadMutexTryLock(&pAllocator->mutex);
+ if (EBUSY != code) {
nodesError("allocator id %" PRIx64
" release failed: The nodesReleaseAllocator function needs to be called after the nodesAcquireAllocator "
"function is called!",
allocatorId);
+ if (0 == code) {
+ taosThreadMutexUnlock(&pAllocator->mutex);
+ }
return TSDB_CODE_FAILED;
}
- SNodeAllocator* pAllocator = g_pNodeAllocator;
+
g_pNodeAllocator = NULL;
taosThreadMutexUnlock(&pAllocator->mutex);
return taosReleaseRef(g_allocatorReqRefPool, allocatorId);
@@ -1826,7 +1835,7 @@ static EDealRes collectFuncs(SNode* pNode, void* pContext) {
if (QUERY_NODE_FUNCTION == nodeType(pNode) && pCxt->classifier(((SFunctionNode*)pNode)->funcId) &&
!(((SExprNode*)pNode)->orderAlias)) {
SExprNode* pExpr = (SExprNode*)pNode;
- if (NULL == taosHashGet(pCxt->pFuncsSet, &pExpr, POINTER_BYTES)) {
+ if (NULL == taosHashGet(pCxt->pFuncsSet, &pExpr, sizeof(SExprNode*))) {
pCxt->errCode = nodesListStrictAppend(pCxt->pFuncs, nodesCloneNode(pNode));
taosHashPut(pCxt->pFuncsSet, &pExpr, POINTER_BYTES, &pExpr, POINTER_BYTES);
}
diff --git a/source/libs/parser/src/parInsert.c b/source/libs/parser/src/parInsert.c
index f59a6c7f9bdacc18f0acea1a96ce57705340a1ec..65cc44b1e9f403c8abe0cae4f9106999447d8b97 100644
--- a/source/libs/parser/src/parInsert.c
+++ b/source/libs/parser/src/parInsert.c
@@ -1365,8 +1365,12 @@ static int32_t parseCsvFile(SInsertParseContext* pCxt, TdFilePtr fp, STableDataB
strtolower(pLine, pLine);
char* pRawSql = pCxt->pSql;
pCxt->pSql = pLine;
- bool gotRow = false;
- CHECK_CODE(parseOneRow(pCxt, pDataBlock, tinfo.precision, &gotRow, tmpTokenBuf));
+ bool gotRow = false;
+ int32_t code = parseOneRow(pCxt, pDataBlock, tinfo.precision, &gotRow, tmpTokenBuf);
+ if (TSDB_CODE_SUCCESS != code) {
+ pCxt->pSql = pRawSql;
+ return code;
+ }
if (gotRow) {
pDataBlock->size += extendedRowSize; // len;
(*numOfRows)++;
diff --git a/source/libs/parser/src/parInsertData.c b/source/libs/parser/src/parInsertData.c
index 09e40cad60221246261b4a9ce8913ad54ae058db..954c1b332a782fd212902753b2c2505ad29b50cf 100644
--- a/source/libs/parser/src/parInsertData.c
+++ b/source/libs/parser/src/parInsertData.c
@@ -222,6 +222,21 @@ int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq)
return code;
}
+static void destroyDataBlock(STableDataBlocks* pDataBlock) {
+ if (pDataBlock == NULL) {
+ return;
+ }
+
+ taosMemoryFreeClear(pDataBlock->pData);
+ // if (!pDataBlock->cloned) {
+ // free the refcount for metermeta
+ taosMemoryFreeClear(pDataBlock->pTableMeta);
+
+ destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
+ // }
+ taosMemoryFreeClear(pDataBlock);
+}
+
int32_t getDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, int32_t size, int32_t startOffset,
int32_t rowSize, STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList,
SVCreateTbReq* pCreateTbReq) {
@@ -240,11 +255,13 @@ int32_t getDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, int32
if (NULL != pCreateTbReq && NULL != pCreateTbReq->ctb.pTag) {
ret = buildCreateTbMsg(*dataBlocks, pCreateTbReq);
if (ret != TSDB_CODE_SUCCESS) {
+ destroyDataBlock(*dataBlocks);
return ret;
}
}
- taosHashPut(pHashList, id, idLen, dataBlocks, POINTER_BYTES);
+ // converting to 'const char*' is to handle coverity scan errors
+ taosHashPut(pHashList, (const char*)id, idLen, (const char*)dataBlocks, POINTER_BYTES);
if (pBlockList) {
taosArrayPush(pBlockList, dataBlocks);
}
@@ -266,21 +283,6 @@ static int32_t getRowExpandSize(STableMeta* pTableMeta) {
return result;
}
-static void destroyDataBlock(STableDataBlocks* pDataBlock) {
- if (pDataBlock == NULL) {
- return;
- }
-
- taosMemoryFreeClear(pDataBlock->pData);
- // if (!pDataBlock->cloned) {
- // free the refcount for metermeta
- taosMemoryFreeClear(pDataBlock->pTableMeta);
-
- destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
- // }
- taosMemoryFreeClear(pDataBlock);
-}
-
void destroyBlockArrayList(SArray* pDataBlockList) {
if (pDataBlockList == NULL) {
return;
diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c
index a8bc8689d0b74c3f35b3f2940bb29165df524755..5a05440c73b92accf42e8ecce8ee6d6c194080f3 100644
--- a/source/libs/parser/src/parTranslater.c
+++ b/source/libs/parser/src/parTranslater.c
@@ -5166,7 +5166,7 @@ static int16_t getCreateComponentNodeMsgType(ENodeType type) {
static int32_t translateCreateComponentNode(STranslateContext* pCxt, SCreateComponentNodeStmt* pStmt) {
SMCreateQnodeReq createReq = {.dnodeId = pStmt->dnodeId};
return buildCmdMsg(pCxt, getCreateComponentNodeMsgType(nodeType(pStmt)),
- (FSerializeFunc)tSerializeSCreateDropMQSBNodeReq, &createReq);
+ (FSerializeFunc)tSerializeSCreateDropMQSNodeReq, &createReq);
}
static int16_t getDropComponentNodeMsgType(ENodeType type) {
@@ -5188,7 +5188,7 @@ static int16_t getDropComponentNodeMsgType(ENodeType type) {
static int32_t translateDropComponentNode(STranslateContext* pCxt, SDropComponentNodeStmt* pStmt) {
SDDropQnodeReq dropReq = {.dnodeId = pStmt->dnodeId};
return buildCmdMsg(pCxt, getDropComponentNodeMsgType(nodeType(pStmt)),
- (FSerializeFunc)tSerializeSCreateDropMQSBNodeReq, &dropReq);
+ (FSerializeFunc)tSerializeSCreateDropMQSNodeReq, &dropReq);
}
static int32_t checkTopicQuery(STranslateContext* pCxt, SSelectStmt* pSelect) {
diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c
index 95eb094edb3e3f469c8be799e2e2a678bb24055b..d98d513d5d8891baed2a6bd30590fd2e6964aacb 100644
--- a/source/libs/parser/src/parUtil.c
+++ b/source/libs/parser/src/parUtil.c
@@ -248,8 +248,12 @@ int32_t getNumOfTags(const STableMeta* pTableMeta) { return getTableInfo(pTableM
STableComInfo getTableInfo(const STableMeta* pTableMeta) { return pTableMeta->tableInfo; }
STableMeta* tableMetaDup(const STableMeta* pTableMeta) {
- size_t size = TABLE_META_SIZE(pTableMeta);
+ int32_t numOfFields = TABLE_TOTAL_COL_NUM(pTableMeta);
+ if (numOfFields > TSDB_MAX_COLUMNS || numOfFields < TSDB_MIN_COLUMNS) {
+ return NULL;
+ }
+ size_t size = sizeof(STableMeta) + numOfFields * sizeof(SSchema);
STableMeta* p = taosMemoryMalloc(size);
memcpy(p, pTableMeta, size);
return p;
diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp
index a9360f796c9eee31c45007ebdc365aa2455365fd..a40d0f81fcf1193a5b297aa9c0a77375b15b70c8 100644
--- a/source/libs/parser/test/mockCatalog.cpp
+++ b/source/libs/parser/test/mockCatalog.cpp
@@ -32,23 +32,29 @@
namespace {
void generateInformationSchema(MockCatalogService* mcs) {
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODES, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODES, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("id", TSDB_DATA_TYPE_INT)
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MNODES, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MNODES, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("id", TSDB_DATA_TYPE_INT)
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MODULES, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_MODULES, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("id", TSDB_DATA_TYPE_INT)
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_QNODES, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_QNODES, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("id", TSDB_DATA_TYPE_INT)
.addColumn("endpoint", TSDB_DATA_TYPE_BINARY, TSDB_EP_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DATABASES, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DATABASES, TSDB_SYSTEM_TABLE, 2)
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
+ .addColumn("create_time", TSDB_DATA_TYPE_TIMESTAMP)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_FUNCTIONS, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_FUNCTIONS, TSDB_SYSTEM_TABLE, 2)
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_FUNC_NAME_LEN)
+ .addColumn("aggregate", TSDB_DATA_TYPE_INT)
.done();
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_INDEXES, TSDB_SYSTEM_TABLE, 3)
.addColumn("index_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
@@ -63,22 +69,28 @@ void generateInformationSchema(MockCatalogService* mcs) {
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
.addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLE_DISTRIBUTED, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_TABLE_DISTRIBUTED, TSDB_SYSTEM_TABLE, 2)
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
+ .addColumn("table_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_USERS, TSDB_SYSTEM_TABLE, 2)
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_USER_LEN)
+ .addColumn("super", TSDB_DATA_TYPE_TINYINT)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VGROUPS, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("vgroup_id", TSDB_DATA_TYPE_INT)
.addColumn("db_name", TSDB_DATA_TYPE_BINARY, TSDB_DB_NAME_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CONFIGS, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CONFIGS, TSDB_SYSTEM_TABLE, 2)
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CONFIG_OPTION_LEN)
+ .addColumn("value", TSDB_DATA_TYPE_BINARY, TSDB_CONFIG_VALUE_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODE_VARIABLES, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_DNODE_VARIABLES, TSDB_SYSTEM_TABLE, 2)
.addColumn("dnode_id", TSDB_DATA_TYPE_INT)
+ .addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CONFIG_OPTION_LEN)
.done();
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CLUSTER, TSDB_SYSTEM_TABLE, 1)
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_CLUSTER, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("id", TSDB_DATA_TYPE_BIGINT)
.addColumn("name", TSDB_DATA_TYPE_BINARY, TSDB_CLUSTER_ID_LEN)
.done();
mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_VNODES, TSDB_SYSTEM_TABLE, 2)
@@ -92,30 +104,22 @@ void generateInformationSchema(MockCatalogService* mcs) {
}
void generatePerformanceSchema(MockCatalogService* mcs) {
- {
- ITableBuilder& builder =
- mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_TRANS, TSDB_SYSTEM_TABLE, 1)
- .addColumn("id", TSDB_DATA_TYPE_INT);
- builder.done();
- }
- {
- ITableBuilder& builder =
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STREAMS, TSDB_SYSTEM_TABLE, 1)
- .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
- builder.done();
- }
- {
- ITableBuilder& builder =
- mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_CONSUMERS, TSDB_SYSTEM_TABLE, 1)
- .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
- builder.done();
- }
- {
- ITableBuilder& builder =
- mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_SUBSCRIPTIONS, TSDB_SYSTEM_TABLE, 1)
- .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN);
- builder.done();
- }
+ mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_TRANS, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("id", TSDB_DATA_TYPE_INT)
+ .addColumn("create_time", TSDB_DATA_TYPE_TIMESTAMP)
+ .done();
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_STREAMS, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("stream_name", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
+ .addColumn("create_time", TSDB_DATA_TYPE_TIMESTAMP)
+ .done();
+ mcs->createTableBuilder(TSDB_PERFORMANCE_SCHEMA_DB, TSDB_PERFS_TABLE_CONSUMERS, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("consumer_id", TSDB_DATA_TYPE_BIGINT)
+ .addColumn("consumer_group", TSDB_DATA_TYPE_BINARY, TSDB_TABLE_NAME_LEN)
+ .done();
+ mcs->createTableBuilder(TSDB_INFORMATION_SCHEMA_DB, TSDB_INS_TABLE_SUBSCRIPTIONS, TSDB_SYSTEM_TABLE, 2)
+ .addColumn("vgroup_id", TSDB_DATA_TYPE_INT)
+ .addColumn("consumer_id", TSDB_DATA_TYPE_BIGINT)
+ .done();
}
/*
diff --git a/source/libs/parser/test/parInitialCTest.cpp b/source/libs/parser/test/parInitialCTest.cpp
index 121bbaa733c3d4b019fbaf5638e32a2fe7ac37d2..3ea6ae3db46eaac4a84c670cec781891541d4bf9 100644
--- a/source/libs/parser/test/parInitialCTest.cpp
+++ b/source/libs/parser/test/parInitialCTest.cpp
@@ -27,25 +27,6 @@ TEST_F(ParserInitialCTest, createAccount) {
run("CREATE ACCOUNT ac_wxy PASS '123456'", TSDB_CODE_PAR_EXPRIE_STATEMENT, PARSER_STAGE_PARSE);
}
-TEST_F(ParserInitialCTest, createBnode) {
- useDb("root", "test");
-
- SMCreateQnodeReq expect = {0};
-
- auto setCreateQnodeReq = [&](int32_t dnodeId) { expect.dnodeId = dnodeId; };
-
- setCheckDdlFunc([&](const SQuery* pQuery, ParserStage stage) {
- ASSERT_EQ(nodeType(pQuery->pRoot), QUERY_NODE_CREATE_BNODE_STMT);
- SMCreateQnodeReq req = {0};
- ASSERT_TRUE(TSDB_CODE_SUCCESS ==
- tDeserializeSCreateDropMQSBNodeReq(pQuery->pCmdMsg->pMsg, pQuery->pCmdMsg->msgLen, &req));
- ASSERT_EQ(req.dnodeId, expect.dnodeId);
- });
-
- setCreateQnodeReq(1);
- run("CREATE BNODE ON DNODE 1");
-}
-
/*
* CREATE DATABASE [IF NOT EXISTS] db_name [database_options]
*
diff --git a/source/libs/parser/test/parInitialDTest.cpp b/source/libs/parser/test/parInitialDTest.cpp
index 870afa694a21623f7bd1816c5eeb7a769ce9a6e8..c7865f3da37438e81ded4627bb8d278d203cbd91 100644
--- a/source/libs/parser/test/parInitialDTest.cpp
+++ b/source/libs/parser/test/parInitialDTest.cpp
@@ -52,12 +52,6 @@ TEST_F(ParserInitialDTest, describe) {
// todo describe
// todo DROP account
-TEST_F(ParserInitialDTest, dropBnode) {
- useDb("root", "test");
-
- run("DROP BNODE ON DNODE 1");
-}
-
// DROP CONSUMER GROUP [ IF EXISTS ] cgroup_name ON topic_name
TEST_F(ParserInitialDTest, dropConsumerGroup) {
useDb("root", "test");
diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c
index d6110d9fcd617ed242633e4115def2a526fc7b0d..ccae1f54be3938f45c36ebee24ef4d4a305cb3ce 100644
--- a/source/libs/planner/src/planOptimizer.c
+++ b/source/libs/planner/src/planOptimizer.c
@@ -124,8 +124,8 @@ static void optSetParentOrder(SLogicNode* pNode, EOrder order) {
EDealRes scanPathOptHaveNormalColImpl(SNode* pNode, void* pContext) {
if (QUERY_NODE_COLUMN == nodeType(pNode)) {
- *((bool*)pContext) =
- (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType && COLUMN_TYPE_TBNAME != ((SColumnNode*)pNode)->colType);
+ *((bool*)pContext) =
+ (COLUMN_TYPE_TAG != ((SColumnNode*)pNode)->colType && COLUMN_TYPE_TBNAME != ((SColumnNode*)pNode)->colType);
return *((bool*)pContext) ? DEAL_RES_END : DEAL_RES_IGNORE_CHILD;
}
return DEAL_RES_CONTINUE;
@@ -1520,11 +1520,15 @@ static bool partTagsHasIndefRowsSelectFunc(SNodeList* pFuncs) {
return false;
}
-static int32_t partTagsRewriteGroupTagsToFuncs(SNodeList* pGroupTags, SNodeList* pAggFuncs) {
+static int32_t partTagsRewriteGroupTagsToFuncs(SNodeList* pGroupTags, int32_t start, SNodeList* pAggFuncs) {
bool hasIndefRowsSelectFunc = partTagsHasIndefRowsSelectFunc(pAggFuncs);
int32_t code = TSDB_CODE_SUCCESS;
+ int32_t index = 0;
SNode* pNode = NULL;
FOREACH(pNode, pGroupTags) {
+ if (index++ < start) {
+ continue;
+ }
if (hasIndefRowsSelectFunc) {
code = nodesListStrictAppend(pAggFuncs, partTagsCreateWrapperFunc("_select_value", pNode));
} else {
@@ -1559,20 +1563,35 @@ static int32_t partTagsOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
}
} else {
SAggLogicNode* pAgg = (SAggLogicNode*)pNode;
+ int32_t start = -1;
SNode* pGroupKey = NULL;
FOREACH(pGroupKey, pAgg->pGroupKeys) {
- code = nodesListMakeStrictAppend(
- &pScan->pGroupTags, nodesCloneNode(nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0)));
+ SNode* pGroupExpr = nodesListGetNode(((SGroupingSetNode*)pGroupKey)->pParameterList, 0);
+ if (NULL != pScan->pGroupTags) {
+ SNode* pGroupTag = NULL;
+ FOREACH(pGroupTag, pScan->pGroupTags) {
+ if (nodesEqualNode(pGroupTag, pGroupExpr)) {
+ continue;
+ }
+ }
+ }
+ if (start < 0) {
+ start = LIST_LENGTH(pScan->pGroupTags);
+ }
+ code = nodesListMakeStrictAppend(&pScan->pGroupTags, nodesCloneNode(pGroupExpr));
if (TSDB_CODE_SUCCESS != code) {
break;
}
}
NODES_DESTORY_LIST(pAgg->pGroupKeys);
- code = partTagsRewriteGroupTagsToFuncs(pScan->pGroupTags, pAgg->pAggFuncs);
+ if (TSDB_CODE_SUCCESS == code && start >= 0) {
+ code = partTagsRewriteGroupTagsToFuncs(pScan->pGroupTags, start, pAgg->pAggFuncs);
+ }
}
if (TSDB_CODE_SUCCESS == code) {
code = partTagsOptRebuildTbanme(pScan->pGroupTags);
}
+ pCxt->optimized = true;
return code;
}
diff --git a/source/libs/planner/test/planPartByTest.cpp b/source/libs/planner/test/planPartByTest.cpp
index 48ab1e1ac2cc5cf9f8b836b9d7940df047019f6e..3d0467dffee8bb518acf73dab29efb330c17c14d 100644
--- a/source/libs/planner/test/planPartByTest.cpp
+++ b/source/libs/planner/test/planPartByTest.cpp
@@ -61,6 +61,8 @@ TEST_F(PlanPartitionByTest, withGroupBy) {
run("SELECT COUNT(*) FROM t1 PARTITION BY c1 GROUP BY c2");
run("SELECT TBNAME, c1 FROM st1 PARTITION BY TBNAME GROUP BY c1");
+
+ run("SELECT COUNT(*) FROM t1 PARTITION BY TBNAME GROUP BY TBNAME");
}
TEST_F(PlanPartitionByTest, withTimeLineFunc) {
diff --git a/source/libs/qcom/src/queryUtil.c b/source/libs/qcom/src/queryUtil.c
index a917397d020a3431fccad206f731b9cf6dc0a817..23f177ffe273a0e7db6f44bc17cecfff1a1ca67c 100644
--- a/source/libs/qcom/src/queryUtil.c
+++ b/source/libs/qcom/src/queryUtil.c
@@ -357,8 +357,7 @@ char* parseTagDatatoJson(void* p) {
for (int j = 0; j < nCols; ++j) {
STagVal* pTagVal = (STagVal*)taosArrayGet(pTagVals, j);
// json key encode by binary
- memset(tagJsonKey, 0, sizeof(tagJsonKey));
- memcpy(tagJsonKey, pTagVal->pKey, strlen(pTagVal->pKey));
+ tstrncpy(tagJsonKey, pTagVal->pKey, sizeof(tagJsonKey));
// json value
char type = pTagVal->type;
if (type == TSDB_DATA_TYPE_NULL) {
@@ -424,13 +423,14 @@ int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst) {
return TSDB_CODE_SUCCESS;
}
- if ((pSrc->tableInfo.numOfColumns + pSrc->tableInfo.numOfTags) > TSDB_MAX_COL_TAG_NUM) {
+ int32_t numOfField = pSrc->tableInfo.numOfColumns + pSrc->tableInfo.numOfTags;
+ if (numOfField > TSDB_MAX_COL_TAG_NUM || numOfField < TSDB_MIN_COLUMNS) {
*pDst = NULL;
qError("too many column and tag num:%d,%d", pSrc->tableInfo.numOfColumns, pSrc->tableInfo.numOfTags);
return TSDB_CODE_INVALID_PARA;
}
- int32_t metaSize = sizeof(STableMeta) + (pSrc->tableInfo.numOfColumns + pSrc->tableInfo.numOfTags) * sizeof(SSchema);
+ int32_t metaSize = sizeof(STableMeta) + numOfField * sizeof(SSchema);
*pDst = taosMemoryMalloc(metaSize);
if (NULL == *pDst) {
return TSDB_CODE_TSC_OUT_OF_MEMORY;
diff --git a/source/libs/qcom/src/querymsg.c b/source/libs/qcom/src/querymsg.c
index a6f26088de29a1b458c00cc509f5d5e13feb9c76..fadd07a9f3221d5dce2e62f96967106b10fa1d7c 100644
--- a/source/libs/qcom/src/querymsg.c
+++ b/source/libs/qcom/src/querymsg.c
@@ -173,7 +173,7 @@ int32_t queryBuildGetDBCfgMsg(void *input, char **msg, int32_t msgSize, int32_t
}
SDbCfgReq dbCfgReq = {0};
- strcpy(dbCfgReq.db, input);
+ strncpy(dbCfgReq.db, input, sizeof(dbCfgReq.db) - 1);
int32_t bufLen = tSerializeSDbCfgReq(NULL, 0, &dbCfgReq);
void *pBuf = (*mallcFp)(bufLen);
@@ -191,7 +191,7 @@ int32_t queryBuildGetIndexMsg(void *input, char **msg, int32_t msgSize, int32_t
}
SUserIndexReq indexReq = {0};
- strcpy(indexReq.indexFName, input);
+ strncpy(indexReq.indexFName, input, sizeof(indexReq.indexFName) - 1);
int32_t bufLen = tSerializeSUserIndexReq(NULL, 0, &indexReq);
void *pBuf = (*mallcFp)(bufLen);
@@ -233,7 +233,7 @@ int32_t queryBuildGetUserAuthMsg(void *input, char **msg, int32_t msgSize, int32
}
SGetUserAuthReq req = {0};
- strncpy(req.user, input, sizeof(req.user));
+ strncpy(req.user, input, sizeof(req.user) - 1);
int32_t bufLen = tSerializeSGetUserAuthReq(NULL, 0, &req);
void *pBuf = (*mallcFp)(bufLen);
@@ -251,7 +251,7 @@ int32_t queryBuildGetTbIndexMsg(void *input, char **msg, int32_t msgSize, int32_
}
STableIndexReq indexReq = {0};
- strcpy(indexReq.tbFName, input);
+ strncpy(indexReq.tbFName, input, sizeof(indexReq.tbFName) - 1);
int32_t bufLen = tSerializeSTableIndexReq(NULL, 0, &indexReq);
void *pBuf = (*mallcFp)(bufLen);
@@ -271,8 +271,8 @@ int32_t queryBuildGetTbCfgMsg(void *input, char **msg, int32_t msgSize, int32_t
SBuildTableInput *pInput = input;
STableCfgReq cfgReq = {0};
cfgReq.header.vgId = pInput->vgId;
- strncpy(cfgReq.dbFName, pInput->dbFName, sizeof(cfgReq.dbFName));
- strncpy(cfgReq.tbName, pInput->tbName, sizeof(cfgReq.tbName));
+ strncpy(cfgReq.dbFName, pInput->dbFName, sizeof(cfgReq.dbFName) - 1);
+ strncpy(cfgReq.tbName, pInput->tbName, sizeof(cfgReq.tbName) - 1);
int32_t bufLen = tSerializeSTableCfgReq(NULL, 0, &cfgReq);
void *pBuf = (*mallcFp)(bufLen);
diff --git a/source/libs/qworker/src/qwUtil.c b/source/libs/qworker/src/qwUtil.c
index 3038b8793074f5ab6b03070777eb7fea68bb2bcb..e9ded9b269bba34d366c3a0a20f01cce4e83b10e 100644
--- a/source/libs/qworker/src/qwUtil.c
+++ b/source/libs/qworker/src/qwUtil.c
@@ -412,7 +412,7 @@ void qwSetHbParam(int64_t refId, SQWHbParam **pParam) {
while (true) {
paramIdx = atomic_load_32(&gQwMgmt.paramIdx);
if (paramIdx == tListLen(gQwMgmt.param)) {
- newParamIdx = 0;
+ newParamIdx = 1;
} else {
newParamIdx = paramIdx + 1;
}
@@ -422,6 +422,10 @@ void qwSetHbParam(int64_t refId, SQWHbParam **pParam) {
}
}
+ if (paramIdx == tListLen(gQwMgmt.param)) {
+ paramIdx = 0;
+ }
+
gQwMgmt.param[paramIdx].qwrId = gQwMgmt.qwRef;
gQwMgmt.param[paramIdx].refId = refId;
diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c
index 0ff40f3b9a7f34b76d23ad6a053d18ecfc62a9ab..001a1972a02b33cf1a076bca7c1ca31bf57a75c1 100644
--- a/source/libs/qworker/src/qworker.c
+++ b/source/libs/qworker/src/qworker.c
@@ -258,7 +258,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen,
dsGetDataLength(ctx->sinkHandle, &len, &queryEnd);
if (len < 0) {
- QW_TASK_ELOG("invalid length from dsGetDataLength, length:%" PRId64, len);
+ QW_TASK_ELOG("invalid length from dsGetDataLength, length:%" PRId64 "", len);
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
@@ -292,7 +292,7 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen,
}
// Got data from sink
- QW_TASK_DLOG("there are data in sink, dataLength:%" PRId64, len);
+ QW_TASK_DLOG("there are data in sink, dataLength:%" PRId64 "", len);
*dataLen += len;
@@ -398,7 +398,6 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu
if (QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
QW_TASK_ELOG("task already dropped at wrong phase %s", qwPhaseStr(phase));
QW_ERR_JRET(TSDB_CODE_QRY_TASK_STATUS_ERROR);
- break;
}
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) {
diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c
index 1f09fd4799d7ba87ed545d97ed931c88cb4e8517..cc1949f17d1ab00f9f4f9c83bc74e2bda0587524 100644
--- a/source/libs/scalar/src/scalar.c
+++ b/source/libs/scalar/src/scalar.c
@@ -629,6 +629,8 @@ _return:
sclFreeParam(pWhen);
sclFreeParam(pThen);
+ taosMemoryFree(pWhen);
+ taosMemoryFree(pThen);
SCL_RET(code);
}
@@ -664,6 +666,8 @@ int32_t sclWalkWhenList(SScalarCtx *ctx, SNodeList* pList, struct SListCell* pCe
sclFreeParam(pWhen);
sclFreeParam(pThen);
+ taosMemoryFreeClear(pWhen);
+ taosMemoryFreeClear(pThen);
}
if (pElse) {
@@ -688,6 +692,8 @@ _return:
sclFreeParam(pWhen);
sclFreeParam(pThen);
+ taosMemoryFree(pWhen);
+ taosMemoryFree(pThen);
SCL_RET(code);
}
@@ -929,6 +935,10 @@ int32_t sclExecCaseWhen(SCaseWhenNode *node, SScalarCtx *ctx, SScalarParam *outp
sclFreeParam(&comp);
sclFreeParam(pWhen);
sclFreeParam(pThen);
+ taosMemoryFree(pCase);
+ taosMemoryFree(pElse);
+ taosMemoryFree(pWhen);
+ taosMemoryFree(pThen);
return TSDB_CODE_SUCCESS;
@@ -940,6 +950,10 @@ _return:
sclFreeParam(pWhen);
sclFreeParam(pThen);
sclFreeParam(output);
+ taosMemoryFree(pCase);
+ taosMemoryFree(pElse);
+ taosMemoryFree(pWhen);
+ taosMemoryFree(pThen);
SCL_RET(code);
}
diff --git a/source/libs/scalar/src/sclvector.c b/source/libs/scalar/src/sclvector.c
index 80c55e31cc4fbfd5d7a28e22164c1c9cee3d49db..6480c53dbfede075c4983f42ba82982e72abe7bc 100644
--- a/source/libs/scalar/src/sclvector.c
+++ b/source/libs/scalar/src/sclvector.c
@@ -654,7 +654,7 @@ int32_t vectorConvertSingleColImpl(const SScalarParam* pIn, SScalarParam* pOut,
return TSDB_CODE_APP_ERROR;
}
- int32_t rstart = startIndex >= 0 ? startIndex : 0;
+ int32_t rstart = (startIndex >= 0 && startIndex < pIn->numOfRows) ? startIndex : 0;
int32_t rend = numOfRows > 0 ? rstart + numOfRows - 1 : rstart + pIn->numOfRows - 1;
SSclVectorConvCtx cCtx = {pIn, pOut, rstart, rend, pInputCol->info.type, pOutputCol->info.type};
@@ -862,25 +862,25 @@ int32_t vectorConvertSingleColImpl(const SScalarParam* pIn, SScalarParam* pOut,
int8_t gConvertTypes[TSDB_DATA_TYPE_BLOB + 1][TSDB_DATA_TYPE_BLOB + 1] = {
/* NULL BOOL TINY SMAL INT BIG FLOA DOUB VARC TIME NCHA UTIN USMA UINT UBIG JSON VARB DECI BLOB */
- /*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 7, 9, 7, 11, 12, 13, 14, 0, 7, 0, 0,
- /*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 7, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
- /*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 7, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
- /*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 7, 9, 7, 4, 4, 5, 7, 0, 7, 0, 0,
- /*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 7, 9, 7, 5, 5, 5, 7, 0, 7, 0, 0,
- /*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 7, 6, 7, 6, 6, 6, 6, 0, 7, 0, 0,
- /*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0,
- /*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 7, 7, 7, 0, 0, 0, 0,
- /*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 7, 0, 7, 0, 0,
- /*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0,
- /*UTIN*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 0, 7, 0, 0,
- /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 7, 0, 0,
- /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 7, 0, 0,
- /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
- /*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
+ /*NULL*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /*BOOL*/ 0, 0, 2, 3, 4, 5, 6, 7, 5, 9, 7, 11, 12, 13, 14, 0, 7, 0, 0,
+ /*TINY*/ 0, 0, 0, 3, 4, 5, 6, 7, 5, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
+ /*SMAL*/ 0, 0, 0, 0, 4, 5, 6, 7, 5, 9, 7, 3, 4, 5, 7, 0, 7, 0, 0,
+ /*INT */ 0, 0, 0, 0, 0, 5, 6, 7, 5, 9, 7, 4, 4, 5, 7, 0, 7, 0, 0,
+ /*BIGI*/ 0, 0, 0, 0, 0, 0, 6, 7, 5, 9, 7, 5, 5, 5, 7, 0, 7, 0, 0,
+ /*FLOA*/ 0, 0, 0, 0, 0, 0, 0, 7, 7, 6, 7, 6, 6, 6, 6, 0, 7, 0, 0,
+ /*DOUB*/ 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 7, 7, 7, 0, 7, 0, 0,
+ /*VARC*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 8, 7, 7, 7, 7, 0, 0, 0, 0,
+ /*TIME*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 7, 0, 7, 0, 0,
+ /*NCHA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 7, 7, 7, 0, 0, 0, 0,
+ /*UTIN*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 13, 14, 0, 7, 0, 0,
+ /*USMA*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13, 14, 0, 7, 0, 0,
+ /*UINT*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14, 0, 7, 0, 0,
+ /*UBIG*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0,
+ /*JSON*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /*VARB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /*DECI*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+ /*BLOB*/ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int32_t vectorGetConvertType(int32_t type1, int32_t type2) {
if (type1 == type2) {
diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c
index c641b88152a6d7d8c13ac26e1421d29dae9e734f..b585373b0ad4e80e14a85c91689ba437059ce5bf 100644
--- a/source/libs/scheduler/src/schTask.c
+++ b/source/libs/scheduler/src/schTask.c
@@ -430,7 +430,8 @@ int32_t schHandleRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32
if (SCH_IS_DATA_BIND_TASK(pTask)) {
if (NULL == pData->pEpSet) {
SCH_TASK_ELOG("no epset updated while got error %s", tstrerror(rspCode));
- SCH_ERR_JRET(rspCode);
+ code = rspCode;
+ goto _return;
}
}
diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c
index 5ad5aa549d28a6b8c4835177dcb11df5418fe57c..149b1a84478bf73e96f4d2f504da60731e800891 100644
--- a/source/libs/stream/src/streamExec.c
+++ b/source/libs/stream/src/streamExec.c
@@ -137,6 +137,8 @@ int32_t streamPipelineExec(SStreamTask* pTask, int32_t batchNum, bool dispatch)
if (pTask->outputType == TASK_OUTPUT__FIXED_DISPATCH || pTask->outputType == TASK_OUTPUT__SHUFFLE_DISPATCH) {
streamDispatch(pTask);
}
+ } else {
+ taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
}
}
diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c
index 53e49a6ba5e0be669329c5ff6414c3648ee14fb3..08defcd671c7233751bf58c51320724f5cf5b1c4 100644
--- a/source/libs/stream/src/streamMeta.c
+++ b/source/libs/stream/src/streamMeta.c
@@ -27,7 +27,7 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
char* streamPath = taosMemoryCalloc(1, len);
sprintf(streamPath, "%s/%s", path, "stream");
pMeta->path = strdup(streamPath);
- if (tdbOpen(pMeta->path, 16 * 1024, 1, &pMeta->db) < 0) {
+ if (tdbOpen(pMeta->path, 16 * 1024, 1, &pMeta->db, 0) < 0) {
taosMemoryFree(streamPath);
goto _err;
}
@@ -36,11 +36,11 @@ SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandF
taosMulModeMkDir(streamPath, 0755);
taosMemoryFree(streamPath);
- if (tdbTbOpen("task.db", sizeof(int32_t), -1, NULL, pMeta->db, &pMeta->pTaskDb) < 0) {
+ if (tdbTbOpen("task.db", sizeof(int32_t), -1, NULL, pMeta->db, &pMeta->pTaskDb, 0) < 0) {
goto _err;
}
- if (tdbTbOpen("checkpoint.db", sizeof(int32_t), -1, NULL, pMeta->db, &pMeta->pCheckpointDb) < 0) {
+ if (tdbTbOpen("checkpoint.db", sizeof(int32_t), -1, NULL, pMeta->db, &pMeta->pCheckpointDb, 0) < 0) {
goto _err;
}
@@ -253,6 +253,7 @@ int32_t streamLoadTasks(SStreamMeta* pMeta) {
if (pTask == NULL) {
tdbFree(pKey);
tdbFree(pVal);
+ tdbTbcClose(pCur);
return -1;
}
tDecoderInit(&decoder, (uint8_t*)pVal, vLen);
@@ -262,12 +263,14 @@ int32_t streamLoadTasks(SStreamMeta* pMeta) {
if (pMeta->expandFunc(pMeta->ahandle, pTask) < 0) {
tdbFree(pKey);
tdbFree(pVal);
+ tdbTbcClose(pCur);
return -1;
}
if (taosHashPut(pMeta->pTasks, &pTask->taskId, sizeof(int32_t), &pTask, sizeof(void*)) < 0) {
tdbFree(pKey);
tdbFree(pVal);
+ tdbTbcClose(pCur);
return -1;
}
}
diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c
index c0ed135d74343395be1147fa72d012e032cd1f2b..4b3affa9de1babc9eaaa27b58e3314224c3449bf 100644
--- a/source/libs/stream/src/streamState.c
+++ b/source/libs/stream/src/streamState.c
@@ -24,6 +24,40 @@ typedef struct SStateKey {
int64_t opNum;
} SStateKey;
+typedef struct SStateSessionKey {
+ SSessionKey key;
+ int64_t opNum;
+} SStateSessionKey;
+
+static inline int sessionKeyCmpr(const SSessionKey* pWin1, const SSessionKey* pWin2) {
+ if (pWin1->groupId > pWin2->groupId) {
+ return 1;
+ } else if (pWin1->groupId < pWin2->groupId) {
+ return -1;
+ }
+
+ if (pWin1->win.skey > pWin2->win.ekey) {
+ return 1;
+ } else if (pWin1->win.ekey < pWin2->win.skey) {
+ return -1;
+ }
+
+ return 0;
+}
+
+static inline int stateSessionKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) {
+ SStateSessionKey* pWin1 = (SStateSessionKey*)pKey1;
+ SStateSessionKey* pWin2 = (SStateSessionKey*)pKey2;
+
+ if (pWin1->opNum > pWin2->opNum) {
+ return 1;
+ } else if (pWin1->opNum < pWin2->opNum) {
+ return -1;
+ }
+
+ return sessionKeyCmpr(&pWin1->key, &pWin2->key);
+}
+
static inline int stateKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) {
SStateKey* pWin1 = (SStateKey*)pKey1;
SStateKey* pWin2 = (SStateKey*)pKey2;
@@ -65,21 +99,26 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
memset(statePath, 0, 300);
tstrncpy(statePath, path, 300);
}
- if (tdbOpen(statePath, szPage, pages, &pState->db) < 0) {
+ if (tdbOpen(statePath, szPage, pages, &pState->db, 0) < 0) {
goto _err;
}
// open state storage backend
- if (tdbTbOpen("state.db", sizeof(SStateKey), -1, stateKeyCmpr, pState->db, &pState->pStateDb) < 0) {
+ if (tdbTbOpen("state.db", sizeof(SStateKey), -1, stateKeyCmpr, pState->db, &pState->pStateDb, 0) < 0) {
goto _err;
}
// todo refactor
- if (tdbTbOpen("fill.state.db", sizeof(SWinKey), -1, winKeyCmpr, pState->db, &pState->pFillStateDb) < 0) {
+ if (tdbTbOpen("fill.state.db", sizeof(SWinKey), -1, winKeyCmpr, pState->db, &pState->pFillStateDb, 0) < 0) {
goto _err;
}
- if (tdbTbOpen("func.state.db", sizeof(STupleKey), -1, STupleKeyCmpr, pState->db, &pState->pFuncStateDb) < 0) {
+ if (tdbTbOpen("session.state.db", sizeof(SStateSessionKey), -1, stateSessionKeyCmpr, pState->db,
+ &pState->pSessionStateDb, 0) < 0) {
+ goto _err;
+ }
+
+ if (tdbTbOpen("func.state.db", sizeof(STupleKey), -1, STupleKeyCmpr, pState->db, &pState->pFuncStateDb, 0) < 0) {
goto _err;
}
@@ -95,6 +134,7 @@ _err:
tdbTbClose(pState->pStateDb);
tdbTbClose(pState->pFuncStateDb);
tdbTbClose(pState->pFillStateDb);
+ tdbTbClose(pState->pSessionStateDb);
tdbClose(pState->db);
taosMemoryFree(pState);
return NULL;
@@ -105,6 +145,7 @@ void streamStateClose(SStreamState* pState) {
tdbTbClose(pState->pStateDb);
tdbTbClose(pState->pFuncStateDb);
tdbTbClose(pState->pFillStateDb);
+ tdbTbClose(pState->pSessionStateDb);
tdbClose(pState->db);
taosMemoryFree(pState);
@@ -241,11 +282,11 @@ SStreamStateCur* streamStateGetCur(SStreamState* pState, const SWinKey* key) {
if (pCur == NULL) return NULL;
tdbTbcOpen(pState->pStateDb, &pCur->pCur, NULL);
- int32_t c;
+ int32_t c = 0;
SStateKey sKey = {.key = *key, .opNum = pState->number};
tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateKey), &c);
if (c != 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
pCur->number = pState->number;
@@ -257,7 +298,7 @@ SStreamStateCur* streamStateFillGetCur(SStreamState* pState, const SWinKey* key)
if (pCur == NULL) return NULL;
tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL);
- int32_t c;
+ int32_t c = 0;
tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c);
if (c != 0) {
streamStateFreeCur(pCur);
@@ -348,21 +389,21 @@ SStreamStateCur* streamStateSeekKeyNext(SStreamState* pState, const SWinKey* key
}
pCur->number = pState->number;
if (tdbTbcOpen(pState->pStateDb, &pCur->pCur, NULL) < 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
SStateKey sKey = {.key = *key, .opNum = pState->number};
- int32_t c;
+ int32_t c = 0;
if (tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateKey), &c) < 0) {
tdbTbcClose(pCur->pCur);
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
if (c > 0) return pCur;
if (tdbTbcMoveToNext(pCur->pCur) < 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
@@ -375,20 +416,20 @@ SStreamStateCur* streamStateFillSeekKeyNext(SStreamState* pState, const SWinKey*
return NULL;
}
if (tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL) < 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
- int32_t c;
+ int32_t c = 0;
if (tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c) < 0) {
tdbTbcClose(pCur->pCur);
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
if (c > 0) return pCur;
if (tdbTbcMoveToNext(pCur->pCur) < 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
@@ -401,20 +442,20 @@ SStreamStateCur* streamStateFillSeekKeyPrev(SStreamState* pState, const SWinKey*
return NULL;
}
if (tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL) < 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
- int32_t c;
+ int32_t c = 0;
if (tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c) < 0) {
tdbTbcClose(pCur->pCur);
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
if (c < 0) return pCur;
if (tdbTbcMoveToPrev(pCur->pCur) < 0) {
- taosMemoryFree(pCur);
+ streamStateFreeCur(pCur);
return NULL;
}
@@ -445,3 +486,238 @@ void streamStateFreeCur(SStreamStateCur* pCur) {
}
void streamFreeVal(void* val) { tdbFree(val); }
+
+int32_t streamStateSessionPut(SStreamState* pState, const SSessionKey* key, const void* value, int32_t vLen) {
+ SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
+ return tdbTbUpsert(pState->pSessionStateDb, &sKey, sizeof(SStateSessionKey), value, vLen, &pState->txn);
+}
+
+SStreamStateCur* streamStateSessionGetRanomCur(SStreamState* pState, const SSessionKey* key) {
+ SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
+ if (pCur == NULL) return NULL;
+ tdbTbcOpen(pState->pSessionStateDb, &pCur->pCur, NULL);
+
+ int32_t c = 0;
+ SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
+ tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateSessionKey), &c);
+ if (c != 0) {
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+ pCur->number = pState->number;
+ return pCur;
+}
+
+int32_t streamStateSessionGet(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen) {
+ SStreamStateCur* pCur = streamStateSessionGetRanomCur(pState, key);
+ void* tmp = NULL;
+ if (streamStateSessionGetKVByCur(pCur, key, (const void**)&tmp, pVLen) == 0) {
+ *pVal = tdbRealloc(NULL, *pVLen);
+ memcpy(*pVal, tmp, *pVLen);
+ streamStateFreeCur(pCur);
+ return 0;
+ }
+ streamStateFreeCur(pCur);
+ return -1;
+}
+
+int32_t streamStateSessionDel(SStreamState* pState, const SSessionKey* key) {
+ SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
+ return tdbTbDelete(pState->pSessionStateDb, &sKey, sizeof(SStateSessionKey), &pState->txn);
+}
+
+SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, const SSessionKey* key) {
+ SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
+ if (pCur == NULL) {
+ return NULL;
+ }
+ pCur->number = pState->number;
+ if (tdbTbcOpen(pState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+
+ SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
+ int32_t c = 0;
+ if (tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateSessionKey), &c) < 0) {
+ tdbTbcClose(pCur->pCur);
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+ if (c >= 0) return pCur;
+
+ if (tdbTbcMoveToPrev(pCur->pCur) < 0) {
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+
+ return pCur;
+}
+
+SStreamStateCur* streamStateSessionSeekKeyNext(SStreamState* pState, const SSessionKey* key) {
+ SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
+ if (pCur == NULL) {
+ return NULL;
+ }
+ pCur->number = pState->number;
+ if (tdbTbcOpen(pState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+
+ SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
+ int32_t c = 0;
+ if (tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateSessionKey), &c) < 0) {
+ tdbTbcClose(pCur->pCur);
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+ if (c < 0) return pCur;
+
+ if (tdbTbcMoveToNext(pCur->pCur) < 0) {
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+
+ return pCur;
+}
+
+int32_t streamStateSessionGetKVByCur(SStreamStateCur* pCur, SSessionKey* pKey, const void** pVal, int32_t* pVLen) {
+ if (!pCur) {
+ return -1;
+ }
+ const SStateSessionKey* pKTmp = NULL;
+ int32_t kLen;
+ if (tdbTbcGet(pCur->pCur, (const void**)&pKTmp, &kLen, pVal, pVLen) < 0) {
+ return -1;
+ }
+ if (pKTmp->opNum != pCur->number) {
+ return -1;
+ }
+ if (pKey->groupId != 0 && pKey->groupId != pKTmp->key.groupId) {
+ return -1;
+ }
+ *pKey = pKTmp->key;
+ return 0;
+}
+
+int32_t streamStateSessionClear(SStreamState* pState) {
+ SSessionKey key = {.win.skey = 0, .win.ekey = 0, .groupId = 0};
+ streamStateSessionPut(pState, &key, NULL, 0);
+ SStreamStateCur* pCur = streamStateSessionSeekKeyNext(pState, &key);
+ while (1) {
+ SSessionKey delKey = {0};
+ void* buf = NULL;
+ int32_t size = 0;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &delKey, buf, &size);
+ if (code == 0) {
+ memset(buf, 0, size);
+ streamStateSessionPut(pState, &delKey, buf, size);
+ } else {
+ break;
+ }
+ streamStateCurNext(pState, pCur);
+ }
+ streamStateFreeCur(pCur);
+ streamStateSessionDel(pState, &key);
+ return 0;
+}
+
+SStreamStateCur* streamStateSessionGetCur(SStreamState* pState, const SSessionKey* key) {
+ SStreamStateCur* pCur = streamStateSessionGetRanomCur(pState, key);
+ SSessionKey resKey = *key;
+ while (1) {
+ streamStateCurPrev(pState, pCur);
+ SSessionKey tmpKey = *key;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &tmpKey, NULL, 0);
+ if (code == 0 && sessionKeyCmpr(key, &tmpKey) == 0) {
+ resKey = tmpKey;
+ } else {
+ break;
+ }
+ }
+ streamStateFreeCur(pCur);
+ return streamStateSessionGetRanomCur(pState, &resKey);
+}
+
+int32_t streamStateSessionGetKey(SStreamState* pState, const SSessionKey* key, SSessionKey* curKey) {
+ SStreamStateCur* pCur = streamStateSessionGetRanomCur(pState, key);
+ SSessionKey resKey = *key;
+ int32_t res = -1;
+ while (1) {
+ SSessionKey tmpKey = *key;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &tmpKey, NULL, 0);
+ if (code == 0 && sessionKeyCmpr(key, &tmpKey) == 0) {
+ res = 0;
+ resKey = tmpKey;
+ } else {
+ break;
+ }
+ streamStateCurPrev(pState, pCur);
+ }
+ *curKey = resKey;
+ return res;
+}
+
+int32_t streamStateSessionAddIfNotExist(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen) {
+ // todo refactor
+ SStreamStateCur* pCur = streamStateSessionGetRanomCur(pState, key);
+ int32_t size = *pVLen;
+ void* tmp = NULL;
+ *pVal = tdbRealloc(NULL, size);
+ memset(*pVal, 0, size);
+ if (streamStateSessionGetKVByCur(pCur, key, (const void**)&tmp, pVLen) == 0) {
+ memcpy(*pVal, tmp, *pVLen);
+ streamStateFreeCur(pCur);
+ return 0;
+ }
+ streamStateFreeCur(pCur);
+ return 1;
+}
+
+int32_t streamStateStateAddIfNotExist(SStreamState* pState, SSessionKey* key, char* pKeyData, int32_t keyDataLen,
+ state_key_cmpr_fn fn, void** pVal, int32_t* pVLen) {
+ // todo refactor
+ int32_t res = 0;
+ SSessionKey tmpKey = *key;
+ int32_t valSize = *pVLen;
+ void* tmp = tdbRealloc(NULL, valSize);
+ if (!tmp) {
+ return -1;
+ }
+
+ SStreamStateCur* pCur = streamStateSessionSeekKeyCurrentPrev(pState, key);
+ int32_t code = streamStateSessionGetKVByCur(pCur, key, (const void**)pVal, pVLen);
+ if (code == 0) {
+ if (key->win.skey <= tmpKey.win.skey && tmpKey.win.ekey <= key->win.ekey) {
+ memcpy(tmp, *pVal, valSize);
+ goto _end;
+ }
+
+ void* stateKey = (char*)(*pVal) + (valSize - keyDataLen);
+ if (fn(pKeyData, stateKey) == true) {
+ memcpy(tmp, *pVal, valSize);
+ goto _end;
+ }
+ }
+
+ streamStateCurNext(pState, pCur);
+ code = streamStateSessionGetKVByCur(pCur, key, (const void**)pVal, pVLen);
+ if (code == 0) {
+ void* stateKey = (char*)(*pVal) + (valSize - keyDataLen);
+ if (fn(pKeyData, stateKey) == true) {
+ memcpy(tmp, *pVal, valSize);
+ goto _end;
+ }
+ }
+
+ *key = tmpKey;
+ res = 1;
+ memset(tmp, 0, valSize);
+
+_end:
+
+ *pVal = tmp;
+ streamStateFreeCur(pCur);
+ return res;
+}
diff --git a/source/libs/stream/src/streamTask.c b/source/libs/stream/src/streamTask.c
index ce5917de296c317f739e79cb78cda21660769aa8..530493819591e2ebe6c87d2190b14937b57e2ba2 100644
--- a/source/libs/stream/src/streamTask.c
+++ b/source/libs/stream/src/streamTask.c
@@ -119,7 +119,10 @@ int32_t tDecodeSStreamTask(SDecoder* pDecoder, SStreamTask* pTask) {
for (int32_t i = 0; i < epSz; i++) {
SStreamChildEpInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamChildEpInfo));
if (pInfo == NULL) return -1;
- if (tDecodeStreamEpInfo(pDecoder, pInfo) < 0) return -1;
+ if (tDecodeStreamEpInfo(pDecoder, pInfo) < 0) {
+ taosMemoryFreeClear(pInfo);
+ return -1;
+ }
taosArrayPush(pTask->childEpInfo, &pInfo);
}
diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h
index 101e99afea8db60011fa535a53320a32c2dd376c..4e2a8647b2078eb75febaf04e7e46ea8183dbc8d 100644
--- a/source/libs/sync/inc/syncInt.h
+++ b/source/libs/sync/inc/syncInt.h
@@ -287,6 +287,12 @@ void syncLogRecvAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntries
void syncLogSendAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s);
void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s);
+void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s);
+void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s);
+
+void syncLogSendHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s);
+void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s);
+
// for debug --------------
void syncNodePrint(SSyncNode* pObj);
void syncNodePrint2(char* s, SSyncNode* pObj);
diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c
index 4a35a15d3e35189daa291094c575e35d05ed8e02..939dcac3d665ab36bcbac7701232f8843e5141a1 100644
--- a/source/libs/sync/src/syncAppendEntries.c
+++ b/source/libs/sync/src/syncAppendEntries.c
@@ -408,7 +408,7 @@ static int32_t syncNodeDoMakeLogSame(SSyncNode* ths, SyncIndex FromIndex) {
do {
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "update delete begin to %ld", delBegin);
+ snprintf(logBuf, sizeof(logBuf), "update delete begin to %" PRId64, delBegin);
syncNodeEventLog(ths, logBuf);
} while (0);
}
@@ -419,7 +419,8 @@ static int32_t syncNodeDoMakeLogSame(SSyncNode* ths, SyncIndex FromIndex) {
do {
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "make log same from:%ld, delbegin:%ld, pass:%d", FromIndex, delBegin, pass);
+ snprintf(logBuf, sizeof(logBuf), "make log same from:%" PRId64 ", delbegin:%" PRId64 ", pass:%d", FromIndex,
+ delBegin, pass);
syncNodeEventLog(ths, logBuf);
} while (0);
diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c
index 511113352ea07625b3cbf223add13d2c807ddbac..623972682362b589ce6f97c0077d9326b6540064 100644
--- a/source/libs/sync/src/syncCommit.c
+++ b/source/libs/sync/src/syncCommit.c
@@ -77,8 +77,8 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
} else {
pEntry = pSyncNode->pLogStore->getEntry(pSyncNode->pLogStore, index);
if (pEntry == NULL) {
- sError("failed to get entry since %s. index:%lld", tstrerror(terrno), index);
- return;
+ sError("failed to get entry since %s. index:%" PRId64, tstrerror(terrno), index);
+ return;
}
}
// cannot commit, even if quorum agree. need check term!
diff --git a/source/libs/sync/src/syncElection.c b/source/libs/sync/src/syncElection.c
index 375f2e573032166a3a61f8748b3db7dd36053098..3f13249ce6b47c748685ca59421e1f9a42231e94 100644
--- a/source/libs/sync/src/syncElection.c
+++ b/source/libs/sync/src/syncElection.c
@@ -96,6 +96,19 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
syncNodeCandidate2Leader(pSyncNode);
pSyncNode->pVotesGranted->toLeader = true;
return ret;
+ }
+
+ if (pSyncNode->replicaNum == 1) {
+ // only myself, to leader
+ voteGrantedUpdate(pSyncNode->pVotesGranted, pSyncNode);
+ votesRespondUpdate(pSyncNode->pVotesRespond, pSyncNode);
+
+ pSyncNode->quorum = syncUtilQuorum(pSyncNode->pRaftCfg->cfg.replicaNum);
+
+ syncNodeCandidate2Leader(pSyncNode);
+ pSyncNode->pVotesGranted->toLeader = true;
+ return ret;
+
}
switch (pSyncNode->pRaftCfg->snapshotStrategy) {
diff --git a/source/libs/sync/src/syncIndexMgr.c b/source/libs/sync/src/syncIndexMgr.c
index 28b5313ac514ef98f4295cd547b947447d9c09bc..fcbf4a9032733ab239314768d0251a06f926665b 100644
--- a/source/libs/sync/src/syncIndexMgr.c
+++ b/source/libs/sync/src/syncIndexMgr.c
@@ -200,28 +200,28 @@ int64_t syncIndexMgrGetRecvTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRa
// for debug -------------------
void syncIndexMgrPrint(SSyncIndexMgr *pObj) {
char *serialized = syncIndexMgr2Str(pObj);
- printf("syncIndexMgrPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncIndexMgrPrint | len:%" PRIu64 " | %s \n", (uint64_t)strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncIndexMgrPrint2(char *s, SSyncIndexMgr *pObj) {
char *serialized = syncIndexMgr2Str(pObj);
- printf("syncIndexMgrPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncIndexMgrPrint2 | len:%" PRIu64 " | %s | %s \n", (uint64_t)strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncIndexMgrLog(SSyncIndexMgr *pObj) {
char *serialized = syncIndexMgr2Str(pObj);
- sTrace("syncIndexMgrLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncIndexMgrLog | len:%" PRIu64 " | %s", (uint64_t)strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncIndexMgrLog2(char *s, SSyncIndexMgr *pObj) {
if (gRaftDetailLog) {
char *serialized = syncIndexMgr2Str(pObj);
- sTrace("syncIndexMgrLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncIndexMgrLog2 | len:%" PRIu64 " | %s | %s", (uint64_t)strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c
index 907eb21f4c84a4b26169ef81beb9d272d1a14bce..2a0c5d9d7c6268accb664cd695a1372642a17c47 100644
--- a/source/libs/sync/src/syncMain.c
+++ b/source/libs/sync/src/syncMain.c
@@ -67,7 +67,7 @@ int32_t syncInit() {
syncCleanUp();
ret = -1;
} else {
- sDebug("sync rsetId:%" PRId64 " is open", tsNodeRefId);
+ sDebug("sync rsetId:%" PRId32 " is open", tsNodeRefId);
ret = syncEnvStart();
}
}
@@ -80,7 +80,7 @@ void syncCleanUp() {
ASSERT(ret == 0);
if (tsNodeRefId != -1) {
- sDebug("sync rsetId:%" PRId64 " is closed", tsNodeRefId);
+ sDebug("sync rsetId:%" PRId32 " is closed", tsNodeRefId);
taosCloseRef(tsNodeRefId);
tsNodeRefId = -1;
}
@@ -100,7 +100,7 @@ int64_t syncOpen(SSyncInfo* pSyncInfo) {
return -1;
}
- sDebug("vgId:%d, sync rid:%" PRId64 " is added to rsetId:%" PRId64, pSyncInfo->vgId, pSyncNode->rid, tsNodeRefId);
+ sDebug("vgId:%d, sync rid:%" PRId64 " is added to rsetId:%" PRId32, pSyncInfo->vgId, pSyncNode->rid, tsNodeRefId);
return pSyncNode->rid;
}
@@ -146,7 +146,7 @@ void syncStop(int64_t rid) {
taosReleaseRef(tsNodeRefId, pSyncNode->rid);
taosRemoveRef(tsNodeRefId, rid);
- sDebug("vgId:%d, sync rid:%" PRId64 " is removed from rsetId:%" PRId64, vgId, rid, tsNodeRefId);
+ sDebug("vgId:%d, sync rid:%" PRId64 " is removed from rsetId:%" PRId64, vgId, rid, (int64_t)tsNodeRefId);
}
int32_t syncSetStandby(int64_t rid) {
@@ -316,7 +316,7 @@ int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeader) {
}
do {
- char logBuf[128];
+ char logBuf[256];
snprintf(logBuf, sizeof(logBuf), "begin leader transfer to %s:%u", newLeader.nodeFqdn, newLeader.nodePort);
syncNodeEventLog(pSyncNode, logBuf);
} while (0);
@@ -867,8 +867,8 @@ int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) {
if (!pSyncNode->restoreFinish && pSyncNode->vgId != 1) {
ret = -1;
terrno = TSDB_CODE_SYN_PROPOSE_NOT_READY;
- sError("vgId:%d, failed to sync propose since not ready, type:%s, last:%ld, cmt:%ld", pSyncNode->vgId,
- TMSG_INFO(pMsg->msgType), syncNodeGetLastIndex(pSyncNode), pSyncNode->commitIndex);
+ sError("vgId:%d, failed to sync propose since not ready, type:%s, last:%" PRId64 ", cmt:%" PRId64 "",
+ pSyncNode->vgId, TMSG_INFO(pMsg->msgType), syncNodeGetLastIndex(pSyncNode), pSyncNode->commitIndex);
goto _END;
}
@@ -1891,8 +1891,26 @@ inline bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config) {
return b1;
}
+static bool syncIsConfigChanged(const SSyncCfg* pOldCfg, const SSyncCfg* pNewCfg) {
+ if (pOldCfg->replicaNum != pNewCfg->replicaNum) return true;
+ if (pOldCfg->myIndex != pNewCfg->myIndex) return true;
+ for (int32_t i = 0; i < pOldCfg->replicaNum; ++i) {
+ const SNodeInfo* pOldInfo = &pOldCfg->nodeInfo[i];
+ const SNodeInfo* pNewInfo = &pNewCfg->nodeInfo[i];
+ if (strcmp(pOldInfo->nodeFqdn, pNewInfo->nodeFqdn) != 0) return true;
+ if (pOldInfo->nodePort != pNewInfo->nodePort) return true;
+ }
+
+ return false;
+}
+
void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncIndex lastConfigChangeIndex) {
SSyncCfg oldConfig = pSyncNode->pRaftCfg->cfg;
+ if (!syncIsConfigChanged(&oldConfig, pNewConfig)) {
+ sInfo("vgId:1, sync not reconfig since not changed");
+ return;
+ }
+
pSyncNode->pRaftCfg->cfg = *pNewConfig;
pSyncNode->pRaftCfg->lastConfigIndex = lastConfigChangeIndex;
@@ -2264,7 +2282,7 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
- ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted));
+ // ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted));
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
@@ -2457,35 +2475,35 @@ int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex
// for debug --------------
void syncNodePrint(SSyncNode* pObj) {
char* serialized = syncNode2Str(pObj);
- printf("syncNodePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncNodePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncNodePrint2(char* s, SSyncNode* pObj) {
char* serialized = syncNode2Str(pObj);
- printf("syncNodePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncNodePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncNodeLog(SSyncNode* pObj) {
char* serialized = syncNode2Str(pObj);
- sTraceLong("syncNodeLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTraceLong("syncNodeLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncNodeLog2(char* s, SSyncNode* pObj) {
if (gRaftDetailLog) {
char* serialized = syncNode2Str(pObj);
- sTraceLong("syncNodeLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("syncNodeLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
void syncNodeLog3(char* s, SSyncNode* pObj) {
char* serialized = syncNode2Str(pObj);
- sTraceLong("syncNodeLog3 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("syncNodeLog3 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
@@ -2658,7 +2676,7 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) {
if (ths->state == TAOS_SYNC_STATE_LEADER) {
int32_t code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pEntry);
if (code != 0) {
- sError("vgId:%d, failed to append log entry since %s", ths->vgId, tstrerror(terrno));
+ sError("vgId:%d, failed to append log entry since %s", ths->vgId, tstrerror(terrno));
return -1;
}
syncNodeReplicate(ths, false);
@@ -2708,6 +2726,55 @@ int32_t syncNodeOnPingReplyCb(SSyncNode* ths, SyncPingReply* pMsg) {
return ret;
}
+int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) {
+ syncLogRecvHeartbeat(ths, pMsg, "");
+
+ SyncHeartbeatReply* pMsgReply = syncHeartbeatReplyBuild(ths->vgId);
+ pMsgReply->destId = pMsg->srcId;
+ pMsgReply->srcId = ths->myRaftId;
+ pMsgReply->term = ths->pRaftStore->currentTerm;
+ pMsgReply->privateTerm = 8864; // magic number
+
+ SRpcMsg rpcMsg;
+ syncHeartbeatReply2RpcMsg(pMsgReply, &rpcMsg);
+
+ if (pMsg->term >= ths->pRaftStore->currentTerm && ths->state != TAOS_SYNC_STATE_FOLLOWER) {
+ syncNodeBecomeFollower(ths, "become follower by hb");
+ }
+
+ if (pMsg->term == ths->pRaftStore->currentTerm) {
+ // sInfo("vgId:%d, heartbeat reset timer", ths->vgId);
+ syncNodeResetElectTimer(ths);
+
+#if 0
+ if (ths->state == TAOS_SYNC_STATE_FOLLOWER) {
+ syncNodeFollowerCommit(ths, pMsg->commitIndex);
+ }
+#endif
+ }
+
+ /*
+ // htonl
+ SMsgHead* pHead = rpcMsg.pCont;
+ pHead->contLen = htonl(pHead->contLen);
+ pHead->vgId = htonl(pHead->vgId);
+ */
+
+ // reply
+ syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
+
+ return 0;
+}
+
+int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg) {
+ syncLogRecvHeartbeatReply(ths, pMsg, "");
+
+ // update last reply time, make decision whether the other node is alive or not
+ syncIndexMgrSetRecvTime(ths->pMatchIndex, &(pMsg->destId), pMsg->startTime);
+
+ return 0;
+}
+
// TLA+ Spec
// ClientRequest(i, v) ==
// /\ state[i] = Leader
@@ -2736,7 +2803,7 @@ int32_t syncNodeOnClientRequestCb(SSyncNode* ths, SyncClientRequest* pMsg, SyncI
code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pEntry);
if (code != 0) {
// del resp mgr, call FpCommitCb
- sError("vgId:%d, failed to append log entry since %s", ths->vgId, tstrerror(terrno));
+ sError("vgId:%d, failed to append log entry since %s", ths->vgId, tstrerror(terrno));
return -1;
}
@@ -2852,14 +2919,14 @@ int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* p
if (pEntry->term < ths->pRaftStore->currentTerm) {
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "little term:%lu, can not do leader transfer", pEntry->term);
+ snprintf(logBuf, sizeof(logBuf), "little term:%" PRIu64 ", can not do leader transfer", pEntry->term);
syncNodeEventLog(ths, logBuf);
return 0;
}
if (pEntry->index < syncNodeGetLastIndex(ths)) {
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "little index:%ld, can not do leader transfer", pEntry->index);
+ snprintf(logBuf, sizeof(logBuf), "little index:%" PRId64 ", can not do leader transfer", pEntry->index);
syncNodeEventLog(ths, logBuf);
return 0;
}
@@ -2875,7 +2942,7 @@ int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* p
do {
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "do leader transfer, index:%ld", pEntry->index);
+ snprintf(logBuf, sizeof(logBuf), "do leader transfer, index:%" PRId64 "", pEntry->index);
syncNodeEventLog(ths, logBuf);
} while (0);
@@ -3014,7 +3081,8 @@ static int32_t syncNodeProposeConfigChangeFinish(SSyncNode* ths, SyncReconfigFin
}
bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg) {
- return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType) && ths->vgId != 1);
+ return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType));
+ // return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType) && ths->vgId != 1);
}
int32_t syncNodeCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex, uint64_t flag) {
@@ -3054,8 +3122,8 @@ int32_t syncNodeCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex,
} else {
code = ths->pLogStore->syncLogGetEntry(ths->pLogStore, i, &pEntry);
if (code != 0) {
- sError("vgId:%d, failed to get log entry since %s. index:%lld", ths->vgId, tstrerror(terrno), i);
- return -1;
+ sError("vgId:%d, failed to get log entry since %s. index:%" PRId64 "", ths->vgId, tstrerror(terrno), i);
+ return -1;
}
ASSERT(pEntry != NULL);
}
@@ -3066,7 +3134,8 @@ int32_t syncNodeCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex,
// user commit
if ((ths->pFsm->FpCommitCb != NULL) && syncUtilUserCommit(pEntry->originalRpcType)) {
bool internalExecute = true;
- if ((ths->replicaNum == 1) && ths->restoreFinish && ths->vgId != 1) {
+ if ((ths->replicaNum == 1) && ths->restoreFinish) {
+ // if ((ths->replicaNum == 1) && ths->restoreFinish && ths->vgId != 1) {
internalExecute = false;
}
@@ -3134,8 +3203,8 @@ int32_t syncNodeCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex,
int64_t restoreDelay = taosGetTimestampMs() - ths->leaderTime;
char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "restore finish, index:%ld, elapsed:%ld ms, ", pEntry->index,
- restoreDelay);
+ snprintf(eventLog, sizeof(eventLog), "restore finish, index:%" PRId64 ", elapsed:%" PRId64 " ms, ",
+ pEntry->index, restoreDelay);
syncNodeEventLog(ths, eventLog);
}
}
@@ -3317,3 +3386,45 @@ void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntries
host, port, pMsg->term, pMsg->privateTerm, pMsg->success, pMsg->matchIndex, s);
syncNodeEventLog(pSyncNode, logBuf);
}
+
+void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ char logBuf[256];
+ snprintf(logBuf, sizeof(logBuf),
+ "send sync-heartbeat from %s:%d {term:%" PRIu64 ", cmt:%" PRIu64 ", pterm:%" PRIu64 "}, %s", host, port,
+ pMsg->term, pMsg->commitIndex, pMsg->privateTerm, s);
+ syncNodeEventLog(pSyncNode, logBuf);
+}
+
+void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ char logBuf[256];
+ snprintf(logBuf, sizeof(logBuf),
+ "recv sync-heartbeat from %s:%d {term:%" PRIu64 ", cmt:%" PRIu64 ", pterm:%" PRIu64 "}, %s", host, port,
+ pMsg->term, pMsg->commitIndex, pMsg->privateTerm, s);
+ syncNodeEventLog(pSyncNode, logBuf);
+}
+
+void syncLogSendHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ char logBuf[256];
+ snprintf(logBuf, sizeof(logBuf), "send sync-heartbeat-reply from %s:%d {term:%" PRIu64 ", pterm:%" PRIu64 "}, %s",
+ host, port, pMsg->term, pMsg->privateTerm, s);
+ syncNodeEventLog(pSyncNode, logBuf);
+}
+
+void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ char logBuf[256];
+ snprintf(logBuf, sizeof(logBuf), "recv sync-heartbeat-reply from %s:%d {term:%" PRIu64 ", pterm:%" PRIu64 "}, %s",
+ host, port, pMsg->term, pMsg->privateTerm, s);
+ syncNodeEventLog(pSyncNode, logBuf);
+}
diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c
index faebe5bbecb16012831ed103de520c14accc81d5..7c871d05423607b911352d365e21391d01c63ffe 100644
--- a/source/libs/sync/src/syncMessage.c
+++ b/source/libs/sync/src/syncMessage.c
@@ -133,28 +133,28 @@ char* syncRpcMsg2Str(SRpcMsg* pRpcMsg) {
// for debug ----------------------
void syncRpcMsgPrint(SRpcMsg* pMsg) {
char* serialized = syncRpcMsg2Str(pMsg);
- printf("syncRpcMsgPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncRpcMsgPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncRpcMsgPrint2(char* s, SRpcMsg* pMsg) {
char* serialized = syncRpcMsg2Str(pMsg);
- printf("syncRpcMsgPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncRpcMsgPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncRpcMsgLog(SRpcMsg* pMsg) {
char* serialized = syncRpcMsg2Str(pMsg);
- sTrace("syncRpcMsgLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncRpcMsgLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncRpcMsgLog2(char* s, SRpcMsg* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncRpcMsg2Str(pMsg);
- sTrace("syncRpcMsgLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncRpcMsgLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -271,21 +271,21 @@ void syncTimeoutPrint(const SyncTimeout* pMsg) {
void syncTimeoutPrint2(char* s, const SyncTimeout* pMsg) {
char* serialized = syncTimeout2Str(pMsg);
- printf("syncTimeoutPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncTimeoutPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncTimeoutLog(const SyncTimeout* pMsg) {
char* serialized = syncTimeout2Str(pMsg);
- sTrace("syncTimeoutLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncTimeoutLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncTimeoutLog2(char* s, const SyncTimeout* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncTimeout2Str(pMsg);
- sTrace("syncTimeoutLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncTimeoutLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -526,28 +526,28 @@ char* syncPing2Str(const SyncPing* pMsg) {
// for debug ----------------------
void syncPingPrint(const SyncPing* pMsg) {
char* serialized = syncPing2Str(pMsg);
- printf("syncPingPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncPingPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncPingPrint2(char* s, const SyncPing* pMsg) {
char* serialized = syncPing2Str(pMsg);
- printf("syncPingPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncPingPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncPingLog(const SyncPing* pMsg) {
char* serialized = syncPing2Str(pMsg);
- sTrace("syncPingLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncPingLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncPingLog2(char* s, const SyncPing* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncPing2Str(pMsg);
- sTrace("syncPingLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncPingLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -931,28 +931,28 @@ char* syncClientRequest2Str(const SyncClientRequest* pMsg) {
// for debug ----------------------
void syncClientRequestPrint(const SyncClientRequest* pMsg) {
char* serialized = syncClientRequest2Str(pMsg);
- printf("syncClientRequestPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncClientRequestPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncClientRequestPrint2(char* s, const SyncClientRequest* pMsg) {
char* serialized = syncClientRequest2Str(pMsg);
- printf("syncClientRequestPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncClientRequestPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncClientRequestLog(const SyncClientRequest* pMsg) {
char* serialized = syncClientRequest2Str(pMsg);
- sTrace("syncClientRequestLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncClientRequestLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncClientRequestLog2(char* s, const SyncClientRequest* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncClientRequest2Str(pMsg);
- sTrace("syncClientRequestLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncClientRequestLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -1101,28 +1101,28 @@ char* syncClientRequestBatch2Str(const SyncClientRequestBatch* pMsg) {
// for debug ----------------------
void syncClientRequestBatchPrint(const SyncClientRequestBatch* pMsg) {
char* serialized = syncClientRequestBatch2Str(pMsg);
- printf("syncClientRequestBatchPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncClientRequestBatchPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncClientRequestBatchPrint2(char* s, const SyncClientRequestBatch* pMsg) {
char* serialized = syncClientRequestBatch2Str(pMsg);
- printf("syncClientRequestBatchPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncClientRequestBatchPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncClientRequestBatchLog(const SyncClientRequestBatch* pMsg) {
char* serialized = syncClientRequestBatch2Str(pMsg);
- sTrace("syncClientRequestBatchLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncClientRequestBatchLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncClientRequestBatchLog2(char* s, const SyncClientRequestBatch* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncClientRequestBatch2Str(pMsg);
- sTraceLong("syncClientRequestBatchLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("syncClientRequestBatchLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -1252,28 +1252,28 @@ char* syncRequestVote2Str(const SyncRequestVote* pMsg) {
// for debug ----------------------
void syncRequestVotePrint(const SyncRequestVote* pMsg) {
char* serialized = syncRequestVote2Str(pMsg);
- printf("syncRequestVotePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncRequestVotePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncRequestVotePrint2(char* s, const SyncRequestVote* pMsg) {
char* serialized = syncRequestVote2Str(pMsg);
- printf("syncRequestVotePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncRequestVotePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncRequestVoteLog(const SyncRequestVote* pMsg) {
char* serialized = syncRequestVote2Str(pMsg);
- sTrace("syncRequestVoteLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncRequestVoteLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncRequestVoteLog2(char* s, const SyncRequestVote* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncRequestVote2Str(pMsg);
- sTrace("syncRequestVoteLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncRequestVoteLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -1400,28 +1400,28 @@ char* syncRequestVoteReply2Str(const SyncRequestVoteReply* pMsg) {
// for debug ----------------------
void syncRequestVoteReplyPrint(const SyncRequestVoteReply* pMsg) {
char* serialized = syncRequestVoteReply2Str(pMsg);
- printf("syncRequestVoteReplyPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncRequestVoteReplyPrint | len:%ld | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncRequestVoteReplyPrint2(char* s, const SyncRequestVoteReply* pMsg) {
char* serialized = syncRequestVoteReply2Str(pMsg);
- printf("syncRequestVoteReplyPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncRequestVoteReplyPrint2 | len:%ld | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncRequestVoteReplyLog(const SyncRequestVoteReply* pMsg) {
char* serialized = syncRequestVoteReply2Str(pMsg);
- sTrace("syncRequestVoteReplyLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncRequestVoteReplyLog | len:%ld | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncRequestVoteReplyLog2(char* s, const SyncRequestVoteReply* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncRequestVoteReply2Str(pMsg);
- sTrace("syncRequestVoteReplyLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncRequestVoteReplyLog2 | len:%ld | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -1571,28 +1571,28 @@ char* syncAppendEntries2Str(const SyncAppendEntries* pMsg) {
// for debug ----------------------
void syncAppendEntriesPrint(const SyncAppendEntries* pMsg) {
char* serialized = syncAppendEntries2Str(pMsg);
- printf("syncAppendEntriesPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncAppendEntriesPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncAppendEntriesPrint2(char* s, const SyncAppendEntries* pMsg) {
char* serialized = syncAppendEntries2Str(pMsg);
- printf("syncAppendEntriesPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncAppendEntriesPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncAppendEntriesLog(const SyncAppendEntries* pMsg) {
char* serialized = syncAppendEntries2Str(pMsg);
- sTrace("syncAppendEntriesLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncAppendEntriesLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncAppendEntriesLog2(char* s, const SyncAppendEntries* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncAppendEntries2Str(pMsg);
- sTrace("syncAppendEntriesLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncAppendEntriesLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -1810,28 +1810,28 @@ char* syncAppendEntriesBatch2Str(const SyncAppendEntriesBatch* pMsg) {
// for debug ----------------------
void syncAppendEntriesBatchPrint(const SyncAppendEntriesBatch* pMsg) {
char* serialized = syncAppendEntriesBatch2Str(pMsg);
- printf("syncAppendEntriesBatchPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncAppendEntriesBatchPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncAppendEntriesBatchPrint2(char* s, const SyncAppendEntriesBatch* pMsg) {
char* serialized = syncAppendEntriesBatch2Str(pMsg);
- printf("syncAppendEntriesBatchPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncAppendEntriesBatchPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncAppendEntriesBatchLog(const SyncAppendEntriesBatch* pMsg) {
char* serialized = syncAppendEntriesBatch2Str(pMsg);
- sTrace("syncAppendEntriesBatchLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncAppendEntriesBatchLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncAppendEntriesBatchLog2(char* s, const SyncAppendEntriesBatch* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncAppendEntriesBatch2Str(pMsg);
- sTraceLong("syncAppendEntriesBatchLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("syncAppendEntriesBatchLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -1966,28 +1966,28 @@ char* syncAppendEntriesReply2Str(const SyncAppendEntriesReply* pMsg) {
// for debug ----------------------
void syncAppendEntriesReplyPrint(const SyncAppendEntriesReply* pMsg) {
char* serialized = syncAppendEntriesReply2Str(pMsg);
- printf("syncAppendEntriesReplyPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncAppendEntriesReplyPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncAppendEntriesReplyPrint2(char* s, const SyncAppendEntriesReply* pMsg) {
char* serialized = syncAppendEntriesReply2Str(pMsg);
- printf("syncAppendEntriesReplyPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncAppendEntriesReplyPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncAppendEntriesReplyLog(const SyncAppendEntriesReply* pMsg) {
char* serialized = syncAppendEntriesReply2Str(pMsg);
- sTrace("syncAppendEntriesReplyLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncAppendEntriesReplyLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncAppendEntriesReplyLog2(char* s, const SyncAppendEntriesReply* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncAppendEntriesReply2Str(pMsg);
- sTrace("syncAppendEntriesReplyLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncAppendEntriesReplyLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -2119,28 +2119,28 @@ char* syncHeartbeat2Str(const SyncHeartbeat* pMsg) {
void syncHeartbeatPrint(const SyncHeartbeat* pMsg) {
char* serialized = syncHeartbeat2Str(pMsg);
- printf("syncHeartbeatPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncHeartbeatPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncHeartbeatPrint2(char* s, const SyncHeartbeat* pMsg) {
char* serialized = syncHeartbeat2Str(pMsg);
- printf("syncHeartbeatPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncHeartbeatPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncHeartbeatLog(const SyncHeartbeat* pMsg) {
char* serialized = syncHeartbeat2Str(pMsg);
- sTrace("syncHeartbeatLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncHeartbeatLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncHeartbeatLog2(char* s, const SyncHeartbeat* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncHeartbeat2Str(pMsg);
- sTrace("syncHeartbeatLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncHeartbeatLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -2273,28 +2273,28 @@ char* syncHeartbeatReply2Str(const SyncHeartbeatReply* pMsg) {
void syncHeartbeatReplyPrint(const SyncHeartbeatReply* pMsg) {
char* serialized = syncHeartbeatReply2Str(pMsg);
- printf("syncHeartbeatReplyPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncHeartbeatReplyPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncHeartbeatReplyPrint2(char* s, const SyncHeartbeatReply* pMsg) {
char* serialized = syncHeartbeatReply2Str(pMsg);
- printf("syncHeartbeatReplyPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncHeartbeatReplyPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncHeartbeatReplyLog(const SyncHeartbeatReply* pMsg) {
char* serialized = syncHeartbeatReply2Str(pMsg);
- sTrace("syncHeartbeatReplyLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncHeartbeatReplyLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncHeartbeatReplyLog2(char* s, const SyncHeartbeatReply* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncHeartbeatReply2Str(pMsg);
- sTrace("syncHeartbeatReplyLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncHeartbeatReplyLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -2426,28 +2426,28 @@ char* syncApplyMsg2Str(const SyncApplyMsg* pMsg) {
// for debug ----------------------
void syncApplyMsgPrint(const SyncApplyMsg* pMsg) {
char* serialized = syncApplyMsg2Str(pMsg);
- printf("syncApplyMsgPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncApplyMsgPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncApplyMsgPrint2(char* s, const SyncApplyMsg* pMsg) {
char* serialized = syncApplyMsg2Str(pMsg);
- printf("syncApplyMsgPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncApplyMsgPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncApplyMsgLog(const SyncApplyMsg* pMsg) {
char* serialized = syncApplyMsg2Str(pMsg);
- sTrace("ssyncApplyMsgLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("ssyncApplyMsgLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncApplyMsgLog2(char* s, const SyncApplyMsg* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncApplyMsg2Str(pMsg);
- sTrace("syncApplyMsgLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncApplyMsgLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -2603,28 +2603,28 @@ char* syncSnapshotSend2Str(const SyncSnapshotSend* pMsg) {
// for debug ----------------------
void syncSnapshotSendPrint(const SyncSnapshotSend* pMsg) {
char* serialized = syncSnapshotSend2Str(pMsg);
- printf("syncSnapshotSendPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncSnapshotSendPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncSnapshotSendPrint2(char* s, const SyncSnapshotSend* pMsg) {
char* serialized = syncSnapshotSend2Str(pMsg);
- printf("syncSnapshotSendPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncSnapshotSendPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncSnapshotSendLog(const SyncSnapshotSend* pMsg) {
char* serialized = syncSnapshotSend2Str(pMsg);
- sTrace("syncSnapshotSendLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncSnapshotSendLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncSnapshotSendLog2(char* s, const SyncSnapshotSend* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncSnapshotSend2Str(pMsg);
- sTrace("syncSnapshotSendLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncSnapshotSendLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -2763,28 +2763,28 @@ char* syncSnapshotRsp2Str(const SyncSnapshotRsp* pMsg) {
// for debug ----------------------
void syncSnapshotRspPrint(const SyncSnapshotRsp* pMsg) {
char* serialized = syncSnapshotRsp2Str(pMsg);
- printf("syncSnapshotRspPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncSnapshotRspPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncSnapshotRspPrint2(char* s, const SyncSnapshotRsp* pMsg) {
char* serialized = syncSnapshotRsp2Str(pMsg);
- printf("syncSnapshotRspPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncSnapshotRspPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncSnapshotRspLog(const SyncSnapshotRsp* pMsg) {
char* serialized = syncSnapshotRsp2Str(pMsg);
- sTrace("syncSnapshotRspLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncSnapshotRspLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncSnapshotRspLog2(char* s, const SyncSnapshotRsp* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncSnapshotRsp2Str(pMsg);
- sTrace("syncSnapshotRspLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncSnapshotRspLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -2925,28 +2925,28 @@ char* syncLeaderTransfer2Str(const SyncLeaderTransfer* pMsg) {
// for debug ----------------------
void syncLeaderTransferPrint(const SyncLeaderTransfer* pMsg) {
char* serialized = syncLeaderTransfer2Str(pMsg);
- printf("syncLeaderTransferPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncLeaderTransferPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncLeaderTransferPrint2(char* s, const SyncLeaderTransfer* pMsg) {
char* serialized = syncLeaderTransfer2Str(pMsg);
- printf("syncLeaderTransferPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncLeaderTransferPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncLeaderTransferLog(const SyncLeaderTransfer* pMsg) {
char* serialized = syncLeaderTransfer2Str(pMsg);
- sTrace("syncLeaderTransferLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncLeaderTransferLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncLeaderTransferLog2(char* s, const SyncLeaderTransfer* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncLeaderTransfer2Str(pMsg);
- sTrace("syncLeaderTransferLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncLeaderTransferLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -3054,28 +3054,28 @@ char* syncReconfigFinish2Str(const SyncReconfigFinish* pMsg) {
// for debug ----------------------
void syncReconfigFinishPrint(const SyncReconfigFinish* pMsg) {
char* serialized = syncReconfigFinish2Str(pMsg);
- printf("syncReconfigFinishPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncReconfigFinishPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncReconfigFinishPrint2(char* s, const SyncReconfigFinish* pMsg) {
char* serialized = syncReconfigFinish2Str(pMsg);
- printf("syncReconfigFinishPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncReconfigFinishPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncReconfigFinishLog(const SyncReconfigFinish* pMsg) {
char* serialized = syncReconfigFinish2Str(pMsg);
- sTrace("syncReconfigFinishLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncReconfigFinishLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncReconfigFinishLog2(char* s, const SyncReconfigFinish* pMsg) {
if (gRaftDetailLog) {
char* serialized = syncReconfigFinish2Str(pMsg);
- sTrace("syncReconfigFinishLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncReconfigFinishLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
-}
\ No newline at end of file
+}
diff --git a/source/libs/sync/src/syncRaftCfg.c b/source/libs/sync/src/syncRaftCfg.c
index 57126d0871da0ab80cf718260377fa8754581d65..cf5bd2489908342be5d6b6ff35e3fda9378e9800 100644
--- a/source/libs/sync/src/syncRaftCfg.c
+++ b/source/libs/sync/src/syncRaftCfg.c
@@ -447,85 +447,85 @@ int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
// for debug ----------------------
void syncCfgPrint(SSyncCfg *pCfg) {
char *serialized = syncCfg2Str(pCfg);
- printf("syncCfgPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("syncCfgPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncCfgPrint2(char *s, SSyncCfg *pCfg) {
char *serialized = syncCfg2Str(pCfg);
- printf("syncCfgPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("syncCfgPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void syncCfgLog(SSyncCfg *pCfg) {
char *serialized = syncCfg2Str(pCfg);
- sTrace("syncCfgLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("syncCfgLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void syncCfgLog2(char *s, SSyncCfg *pCfg) {
char *serialized = syncCfg2Str(pCfg);
- sTrace("syncCfgLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncCfgLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
void syncCfgLog3(char *s, SSyncCfg *pCfg) {
char *serialized = syncCfg2SimpleStr(pCfg);
- sTrace("syncCfgLog3 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("syncCfgLog3 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
void raftCfgPrint(SRaftCfg *pCfg) {
char *serialized = raftCfg2Str(pCfg);
- printf("raftCfgPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("raftCfgPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftCfgPrint2(char *s, SRaftCfg *pCfg) {
char *serialized = raftCfg2Str(pCfg);
- printf("raftCfgPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("raftCfgPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftCfgLog(SRaftCfg *pCfg) {
char *serialized = raftCfg2Str(pCfg);
- sTrace("raftCfgLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("raftCfgLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void raftCfgLog2(char *s, SRaftCfg *pCfg) {
char *serialized = raftCfg2Str(pCfg);
- sTrace("raftCfgLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("raftCfgLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
// ---------
void raftCfgIndexPrint(SRaftCfgIndex *pCfg) {
char *serialized = raftCfgIndex2Str(pCfg);
- printf("raftCfgIndexPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("raftCfgIndexPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftCfgIndexPrint2(char *s, SRaftCfgIndex *pCfg) {
char *serialized = raftCfgIndex2Str(pCfg);
- printf("raftCfgIndexPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("raftCfgIndexPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftCfgIndexLog(SRaftCfgIndex *pCfg) {
char *serialized = raftCfgIndex2Str(pCfg);
- sTrace("raftCfgIndexLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("raftCfgIndexLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void raftCfgIndexLog2(char *s, SRaftCfgIndex *pCfg) {
char *serialized = raftCfgIndex2Str(pCfg);
- sTrace("raftCfgIndexLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("raftCfgIndexLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c
index c481c55e1c2ce1f64e1fcd3a97b44bd701a237d7..818ffa57a6c08f16d5360310bd89deefee2a3861 100644
--- a/source/libs/sync/src/syncRaftEntry.c
+++ b/source/libs/sync/src/syncRaftEntry.c
@@ -418,28 +418,28 @@ char* raftCache2Str(SRaftEntryHashCache* pCache) {
void raftCachePrint(SRaftEntryHashCache* pCache) {
char* serialized = raftCache2Str(pCache);
- printf("raftCachePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("raftCachePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftCachePrint2(char* s, SRaftEntryHashCache* pCache) {
char* serialized = raftCache2Str(pCache);
- printf("raftCachePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("raftCachePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftCacheLog(SRaftEntryHashCache* pCache) {
char* serialized = raftCache2Str(pCache);
- sTrace("raftCacheLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("raftCacheLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void raftCacheLog2(char* s, SRaftEntryHashCache* pCache) {
if (gRaftDetailLog) {
char* serialized = raftCache2Str(pCache);
- sTraceLong("raftCacheLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("raftCacheLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -677,28 +677,28 @@ char* raftEntryCache2Str(SRaftEntryCache* pObj) {
void raftEntryCachePrint(SRaftEntryCache* pObj) {
char* serialized = raftEntryCache2Str(pObj);
- printf("raftEntryCachePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("raftEntryCachePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftEntryCachePrint2(char* s, SRaftEntryCache* pObj) {
char* serialized = raftEntryCache2Str(pObj);
- printf("raftEntryCachePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("raftEntryCachePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftEntryCacheLog(SRaftEntryCache* pObj) {
char* serialized = raftEntryCache2Str(pObj);
- sTrace("raftEntryCacheLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("raftEntryCacheLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void raftEntryCacheLog2(char* s, SRaftEntryCache* pObj) {
if (gRaftDetailLog) {
char* serialized = raftEntryCache2Str(pObj);
- sTraceLong("raftEntryCacheLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("raftEntryCacheLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
-}
\ No newline at end of file
+}
diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c
index c3dad104d1629cf127a1eae5034fdf0844930e74..3e806a0fb7ea3d7ec3f7dd75e6c77a20c3110d69 100644
--- a/source/libs/sync/src/syncRaftLog.c
+++ b/source/libs/sync/src/syncRaftLog.c
@@ -440,7 +440,7 @@ SSyncRaftEntry* logStoreGetEntryWithoutLock(SSyncLogStore* pLogStore, SyncIndex
}
} while (0);
- sError("failed to read ver since %s. index:%lld", tstrerror(terrno), index);
+ sError("failed to read ver since %s. index:%" PRId64 "", tstrerror(terrno), index);
return NULL;
}
@@ -675,14 +675,14 @@ SyncIndex logStoreWalCommitVer(SSyncLogStore* pLogStore) {
// for debug -----------------
void logStorePrint(SSyncLogStore* pLogStore) {
char* serialized = logStore2Str(pLogStore);
- printf("logStorePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("logStorePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void logStorePrint2(char* s, SSyncLogStore* pLogStore) {
char* serialized = logStore2Str(pLogStore);
- printf("logStorePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("logStorePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
@@ -690,7 +690,7 @@ void logStorePrint2(char* s, SSyncLogStore* pLogStore) {
void logStoreLog(SSyncLogStore* pLogStore) {
if (gRaftDetailLog) {
char* serialized = logStore2Str(pLogStore);
- sTraceLong("logStoreLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTraceLong("logStoreLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
}
@@ -698,7 +698,7 @@ void logStoreLog(SSyncLogStore* pLogStore) {
void logStoreLog2(char* s, SSyncLogStore* pLogStore) {
if (gRaftDetailLog) {
char* serialized = logStore2Str(pLogStore);
- sTraceLong("logStoreLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTraceLong("logStoreLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
@@ -706,28 +706,28 @@ void logStoreLog2(char* s, SSyncLogStore* pLogStore) {
// for debug -----------------
void logStoreSimplePrint(SSyncLogStore* pLogStore) {
char* serialized = logStoreSimple2Str(pLogStore);
- printf("logStoreSimplePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("logStoreSimplePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void logStoreSimplePrint2(char* s, SSyncLogStore* pLogStore) {
char* serialized = logStoreSimple2Str(pLogStore);
- printf("logStoreSimplePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("logStoreSimplePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void logStoreSimpleLog(SSyncLogStore* pLogStore) {
char* serialized = logStoreSimple2Str(pLogStore);
- sTrace("logStoreSimpleLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("logStoreSimpleLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void logStoreSimpleLog2(char* s, SSyncLogStore* pLogStore) {
if (gRaftDetailLog) {
char* serialized = logStoreSimple2Str(pLogStore);
- sTrace("logStoreSimpleLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("logStoreSimpleLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
}
diff --git a/source/libs/sync/src/syncRaftStore.c b/source/libs/sync/src/syncRaftStore.c
index 6d4d54a9b1708fb5db6eac81df1addc2536b8cfb..a714a2c4030145b14c1f42f51e76998a055bc6cf 100644
--- a/source/libs/sync/src/syncRaftStore.c
+++ b/source/libs/sync/src/syncRaftStore.c
@@ -226,25 +226,25 @@ char *raftStore2Str(SRaftStore *pRaftStore) {
// for debug -------------------
void raftStorePrint(SRaftStore *pObj) {
char *serialized = raftStore2Str(pObj);
- printf("raftStorePrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("raftStorePrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftStorePrint2(char *s, SRaftStore *pObj) {
char *serialized = raftStore2Str(pObj);
- printf("raftStorePrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("raftStorePrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void raftStoreLog(SRaftStore *pObj) {
char *serialized = raftStore2Str(pObj);
- sTrace("raftStoreLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("raftStoreLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void raftStoreLog2(char *s, SRaftStore *pObj) {
char *serialized = raftStore2Str(pObj);
- sTrace("raftStoreLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("raftStoreLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
diff --git a/source/libs/sync/src/syncRequestVoteReply.c b/source/libs/sync/src/syncRequestVoteReply.c
index 55553d50485358a79adfadc625dd73ca0c05c251..ff91315de7ff39bf0ad6dc995013b7bd95e4271a 100644
--- a/source/libs/sync/src/syncRequestVoteReply.c
+++ b/source/libs/sync/src/syncRequestVoteReply.c
@@ -127,7 +127,7 @@ int32_t syncNodeOnRequestVoteReplySnapshotCb(SSyncNode* ths, SyncRequestVoteRepl
if (ths->state == TAOS_SYNC_STATE_CANDIDATE) {
if (ths->pVotesRespond->term != pMsg->term) {
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "vote respond error vote-respond-mgr term:%lu, msg term:lu",
+ snprintf(logBuf, sizeof(logBuf), "vote respond error vote-respond-mgr term:%" PRIu64 ", msg term:%" PRIu64 "",
ths->pVotesRespond->term, pMsg->term);
syncNodeErrorLog(ths, logBuf);
return -1;
@@ -155,4 +155,4 @@ int32_t syncNodeOnRequestVoteReplySnapshotCb(SSyncNode* ths, SyncRequestVoteRepl
}
return 0;
-}
\ No newline at end of file
+}
diff --git a/source/libs/sync/src/syncRespMgr.c b/source/libs/sync/src/syncRespMgr.c
index 103c2254768a3b5bfc6d5c8090828f999b2e8c9e..30b29d335c8ea0f59f6f16907f3de91905cfbef3 100644
--- a/source/libs/sync/src/syncRespMgr.c
+++ b/source/libs/sync/src/syncRespMgr.c
@@ -177,7 +177,7 @@ void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) {
for (int32_t i = 0; i < arraySize; ++i) {
uint64_t *pSeqNum = taosArrayGet(delIndexArray, i);
taosHashRemove(pObj->pRespHash, pSeqNum, sizeof(uint64_t));
- sDebug("vgId:%d, resp mgr clean by ttl, seq:%d", pSyncNode->vgId, *pSeqNum);
+ sDebug("vgId:%d, resp mgr clean by ttl, seq:%" PRId64 "", pSyncNode->vgId, *pSeqNum);
}
taosArrayDestroy(delIndexArray);
}
diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c
index c3c8131cbb31c3d4ac0b9fb59afc7bc751096329..fd7443222fb50002b01bd9c0d773ca7003460d82 100644
--- a/source/libs/sync/src/syncTimeout.c
+++ b/source/libs/sync/src/syncTimeout.c
@@ -91,7 +91,7 @@ int32_t syncNodeOnTimeoutCb(SSyncNode* ths, SyncTimeout* pMsg) {
} else if (pMsg->timeoutType == SYNC_TIMEOUT_ELECTION) {
if (atomic_load_64(&ths->electTimerLogicClockUser) <= pMsg->logicClock) {
++(ths->electTimerCounter);
- sTrace("vgId:%d, sync timer, type:election count:%d, electTimerLogicClockUser:%ld", ths->vgId,
+ sTrace("vgId:%d, sync timer, type:election count:%" PRId64 ", electTimerLogicClockUser:%" PRId64 "", ths->vgId,
ths->electTimerCounter, ths->electTimerLogicClockUser);
syncNodeElect(ths);
}
@@ -99,8 +99,8 @@ int32_t syncNodeOnTimeoutCb(SSyncNode* ths, SyncTimeout* pMsg) {
} else if (pMsg->timeoutType == SYNC_TIMEOUT_HEARTBEAT) {
if (atomic_load_64(&ths->heartbeatTimerLogicClockUser) <= pMsg->logicClock) {
++(ths->heartbeatTimerCounter);
- sTrace("vgId:%d, sync timer, type:replicate count:%d, heartbeatTimerLogicClockUser:%ld", ths->vgId,
- ths->heartbeatTimerCounter, ths->heartbeatTimerLogicClockUser);
+ sTrace("vgId:%d, sync timer, type:replicate count:%" PRId64 ", heartbeatTimerLogicClockUser:%" PRId64 "",
+ ths->vgId, ths->heartbeatTimerCounter, ths->heartbeatTimerLogicClockUser);
syncNodeReplicate(ths, true);
}
} else {
@@ -108,4 +108,4 @@ int32_t syncNodeOnTimeoutCb(SSyncNode* ths, SyncTimeout* pMsg) {
}
return ret;
-}
\ No newline at end of file
+}
diff --git a/source/libs/sync/src/syncVoteMgr.c b/source/libs/sync/src/syncVoteMgr.c
index 09b79825d04f83ebe8e729b362fd05f95d3b24a4..e10041d976ccc0abf6b8a4d23c9065037360ad6e 100644
--- a/source/libs/sync/src/syncVoteMgr.c
+++ b/source/libs/sync/src/syncVoteMgr.c
@@ -138,27 +138,27 @@ char *voteGranted2Str(SVotesGranted *pVotesGranted) {
// for debug -------------------
void voteGrantedPrint(SVotesGranted *pObj) {
char *serialized = voteGranted2Str(pObj);
- printf("voteGrantedPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("voteGrantedPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void voteGrantedPrint2(char *s, SVotesGranted *pObj) {
char *serialized = voteGranted2Str(pObj);
- printf("voteGrantedPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("voteGrantedPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void voteGrantedLog(SVotesGranted *pObj) {
char *serialized = voteGranted2Str(pObj);
- sTrace("voteGrantedLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("voteGrantedLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void voteGrantedLog2(char *s, SVotesGranted *pObj) {
char *serialized = voteGranted2Str(pObj);
- sTrace("voteGrantedLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("voteGrantedLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
@@ -267,26 +267,26 @@ char *votesRespond2Str(SVotesRespond *pVotesRespond) {
// for debug -------------------
void votesRespondPrint(SVotesRespond *pObj) {
char *serialized = votesRespond2Str(pObj);
- printf("votesRespondPrint | len:%" PRIu64 " | %s \n", strlen(serialized), serialized);
+ printf("votesRespondPrint | len:%lu | %s \n", strlen(serialized), serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void votesRespondPrint2(char *s, SVotesRespond *pObj) {
char *serialized = votesRespond2Str(pObj);
- printf("votesRespondPrint2 | len:%" PRIu64 " | %s | %s \n", strlen(serialized), s, serialized);
+ printf("votesRespondPrint2 | len:%lu | %s | %s \n", strlen(serialized), s, serialized);
fflush(NULL);
taosMemoryFree(serialized);
}
void votesRespondLog(SVotesRespond *pObj) {
char *serialized = votesRespond2Str(pObj);
- sTrace("votesRespondLog | len:%" PRIu64 " | %s", strlen(serialized), serialized);
+ sTrace("votesRespondLog | len:%lu | %s", strlen(serialized), serialized);
taosMemoryFree(serialized);
}
void votesRespondLog2(char *s, SVotesRespond *pObj) {
char *serialized = votesRespond2Str(pObj);
- sTrace("votesRespondLog2 | len:%" PRIu64 " | %s | %s", strlen(serialized), s, serialized);
+ sTrace("votesRespondLog2 | len:%lu | %s | %s", strlen(serialized), s, serialized);
taosMemoryFree(serialized);
}
diff --git a/source/libs/tdb/inc/tdb.h b/source/libs/tdb/inc/tdb.h
index c90d4e3c03dbaf07ccd9cd790937a99e59caf51e..3d92d164b49c1a2804fd3eab3452ff5d386b080c 100644
--- a/source/libs/tdb/inc/tdb.h
+++ b/source/libs/tdb/inc/tdb.h
@@ -31,15 +31,17 @@ typedef struct STBC TBC;
typedef struct STxn TXN;
// TDB
-int32_t tdbOpen(const char *dbname, int szPage, int pages, TDB **ppDb);
+int32_t tdbOpen(const char *dbname, int szPage, int pages, TDB **ppDb, int8_t rollback);
int32_t tdbClose(TDB *pDb);
int32_t tdbBegin(TDB *pDb, TXN *pTxn);
int32_t tdbCommit(TDB *pDb, TXN *pTxn);
+int32_t tdbPostCommit(TDB *pDb, TXN *pTxn);
int32_t tdbAbort(TDB *pDb, TXN *pTxn);
int32_t tdbAlter(TDB *pDb, int pages);
// TTB
-int32_t tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprFn, TDB *pEnv, TTB **ppTb);
+int32_t tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprFn, TDB *pEnv, TTB **ppTb,
+ int8_t rollback);
int32_t tdbTbClose(TTB *pTb);
int32_t tdbTbDrop(TTB *pTb);
int32_t tdbTbInsert(TTB *pTb, const void *pKey, int keyLen, const void *pVal, int valLen, TXN *pTxn);
diff --git a/source/libs/tdb/src/db/tdbBtree.c b/source/libs/tdb/src/db/tdbBtree.c
index 9e17f50dcec30be66795b1daf9025ff87d93db61..ba0b3dbcf8206a54b68bfffbb0c4a14584dc93b9 100644
--- a/source/libs/tdb/src/db/tdbBtree.c
+++ b/source/libs/tdb/src/db/tdbBtree.c
@@ -1086,6 +1086,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const
// fetch next ofp, a new ofp and make it dirty
ret = tdbFetchOvflPage(&pgno, &nextOfp, pTxn, pBt);
if (ret < 0) {
+ tdbFree(pBuf);
return -1;
}
}
@@ -1093,6 +1094,7 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const
// fetch next ofp, a new ofp and make it dirty
ret = tdbFetchOvflPage(&pgno, &nextOfp, pTxn, pBt);
if (ret < 0) {
+ tdbFree(pBuf);
return -1;
}
}
@@ -1134,6 +1136,11 @@ static int tdbBtreeEncodePayload(SPage *pPage, SCell *pCell, int nHeader, const
memcpy(pBuf, ((SCell *)pVal) + vLen - nLeft, bytes);
memcpy(pBuf + bytes, &pgno, sizeof(pgno));
+ if (ofp == NULL) {
+ tdbFree(pBuf);
+ return -1;
+ }
+
ret = tdbPageInsertCell(ofp, 0, pBuf, bytes + sizeof(pgno), 0);
if (ret < 0) {
tdbFree(pBuf);
diff --git a/source/libs/tdb/src/db/tdbDb.c b/source/libs/tdb/src/db/tdbDb.c
index 6c01348bc29261622469c5458963505fac388c5a..855e3510f2355729ab66a9e17dc32b91cd78e913 100644
--- a/source/libs/tdb/src/db/tdbDb.c
+++ b/source/libs/tdb/src/db/tdbDb.c
@@ -15,7 +15,7 @@
#include "tdbInt.h"
-int32_t tdbOpen(const char *dbname, int32_t szPage, int32_t pages, TDB **ppDb) {
+int32_t tdbOpen(const char *dbname, int32_t szPage, int32_t pages, TDB **ppDb, int8_t rollback) {
TDB *pDb;
int dsize;
int zsize;
@@ -66,7 +66,7 @@ int32_t tdbOpen(const char *dbname, int32_t szPage, int32_t pages, TDB **ppDb) {
#ifdef USE_MAINDB
// open main db
- ret = tdbTbOpen(TDB_MAINDB_NAME, -1, sizeof(SBtInfo), NULL, pDb, &pDb->pMainDb);
+ ret = tdbTbOpen(TDB_MAINDB_NAME, -1, sizeof(SBtInfo), NULL, pDb, &pDb->pMainDb, rollback);
if (ret < 0) {
return -1;
}
@@ -106,7 +106,8 @@ int32_t tdbBegin(TDB *pDb, TXN *pTxn) {
for (pPager = pDb->pgrList; pPager; pPager = pPager->pNext) {
ret = tdbPagerBegin(pPager, pTxn);
if (ret < 0) {
- tdbError("failed to begin pager since %s. dbName:%s, txnId:%d", tstrerror(terrno), pDb->dbName, pTxn->txnId);
+ tdbError("failed to begin pager since %s. dbName:%s, txnId:%" PRId64, tstrerror(terrno), pDb->dbName,
+ pTxn->txnId);
return -1;
}
}
@@ -121,7 +122,23 @@ int32_t tdbCommit(TDB *pDb, TXN *pTxn) {
for (pPager = pDb->pgrList; pPager; pPager = pPager->pNext) {
ret = tdbPagerCommit(pPager, pTxn);
if (ret < 0) {
- tdbError("failed to commit pager since %s. dbName:%s, txnId:%d", tstrerror(terrno), pDb->dbName, pTxn->txnId);
+ tdbError("failed to commit pager since %s. dbName:%s, txnId:%" PRId64, tstrerror(terrno), pDb->dbName,
+ pTxn->txnId);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
+int32_t tdbPostCommit(TDB *pDb, TXN *pTxn) {
+ SPager *pPager;
+ int ret;
+
+ for (pPager = pDb->pgrList; pPager; pPager = pPager->pNext) {
+ ret = tdbPagerPostCommit(pPager, pTxn);
+ if (ret < 0) {
+ tdbError("failed to commit pager since %s. dbName:%s, txnId:%" PRId64, tstrerror(terrno), pDb->dbName, pTxn->txnId);
return -1;
}
}
@@ -136,7 +153,8 @@ int32_t tdbAbort(TDB *pDb, TXN *pTxn) {
for (pPager = pDb->pgrList; pPager; pPager = pPager->pNext) {
ret = tdbPagerAbort(pPager, pTxn);
if (ret < 0) {
- tdbError("failed to abort pager since %s. dbName:%s, txnId:%d", tstrerror(terrno), pDb->dbName, pTxn->txnId);
+ tdbError("failed to abort pager since %s. dbName:%s, txnId:%" PRId64, tstrerror(terrno), pDb->dbName,
+ pTxn->txnId);
return -1;
}
}
diff --git a/source/libs/tdb/src/db/tdbPCache.c b/source/libs/tdb/src/db/tdbPCache.c
index c73ddce74c34fa7f9769997016aa22496b6ee203..bdbd6c2f3dbb904eae7b91c6cb935caa9b20aa2c 100644
--- a/source/libs/tdb/src/db/tdbPCache.c
+++ b/source/libs/tdb/src/db/tdbPCache.c
@@ -105,7 +105,7 @@ static int tdbPCacheAlterImpl(SPCache *pCache, int32_t nPage) {
for (int32_t iPage = pCache->nPages; iPage < nPage; iPage++) {
if (tdbPageCreate(pCache->szPage, &aPage[iPage], tdbDefaultMalloc, NULL) < 0) {
// TODO: handle error
- tdbOsFree(pCache->aPage);
+ tdbOsFree(aPage);
return -1;
}
@@ -268,7 +268,7 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn)
// 4. Try a create new page
if (!pPage) {
ret = tdbPageCreate(pCache->szPage, &pPage, pTxn->xMalloc, pTxn->xArg);
- if (ret < 0 && pPage != NULL) {
+ if (ret < 0 || pPage == NULL) {
// TODO
ASSERT(0);
return NULL;
@@ -301,8 +301,8 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn)
pPage->pPager = pPageH->pPager;
memcpy(pPage->pData, pPageH->pData, pPage->pageSize);
- // tdbDebug("pcache/pPageH: %p %d %p %p %d", pPageH, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize, pPage,
- // TDB_PAGE_PGNO(pPageH));
+ // tdbDebug("pcache/pPageH: %p %ld %p %p %u", pPageH, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize, pPage,
+ // TDB_PAGE_PGNO(pPageH));
tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize);
pPage->kLen = pPageH->kLen;
pPage->vLen = pPageH->vLen;
diff --git a/source/libs/tdb/src/db/tdbPager.c b/source/libs/tdb/src/db/tdbPager.c
index 57ad2a783a1b8e9a8d99a6a5a05d3a652e3d84e2..88729f0b69148f1f30420f2dae285b13bf3262a3 100644
--- a/source/libs/tdb/src/db/tdbPager.c
+++ b/source/libs/tdb/src/db/tdbPager.c
@@ -305,6 +305,18 @@ int tdbPagerCommit(SPager *pPager, TXN *pTxn) {
return 0;
}
+int tdbPagerPostCommit(SPager *pPager, TXN *pTxn) {
+ if (tdbOsRemove(pPager->jFileName) < 0 && errno != ENOENT) {
+ tdbError("failed to remove file due to %s. file:%s", strerror(errno), pPager->jFileName);
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ return -1;
+ }
+
+ pPager->inTran = 0;
+
+ return 0;
+}
+
// recovery dirty pages
int tdbPagerAbort(SPager *pPager, TXN *pTxn) {
SPage *pPage;
@@ -542,7 +554,7 @@ static int tdbPagerWritePageToJournal(SPager *pPager, SPage *pPage) {
ret = tdbOsWrite(pPager->jfd, pPage->pData, pPage->pageSize);
if (ret < 0) {
tdbError("failed to write page data due to %s. file:%s, pageSize:%ld", strerror(errno), pPager->jFileName,
- pPage->pageSize);
+ (long)pPage->pageSize);
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
}
@@ -563,14 +575,14 @@ static int tdbPagerWritePageToDB(SPager *pPager, SPage *pPage) {
offset = (i64)pPage->pageSize * (TDB_PAGE_PGNO(pPage) - 1);
if (tdbOsLSeek(pPager->fd, offset, SEEK_SET) < 0) {
- tdbError("failed to lseek due to %s. file:%s, offset:%ld", strerror(errno), pPager->dbFileName, offset);
+ tdbError("failed to lseek due to %s. file:%s, offset:%" PRId64, strerror(errno), pPager->dbFileName, offset);
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
}
ret = tdbOsWrite(pPager->fd, pPage->pData, pPage->pageSize);
if (ret < 0) {
- tdbError("failed to write page data due to %s. file:%s, pageSize:%ld", strerror(errno), pPager->dbFileName,
+ tdbError("failed to write page data due to %s. file:%s, pageSize:%d", strerror(errno), pPager->dbFileName,
pPage->pageSize);
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
@@ -618,7 +630,7 @@ int tdbPagerRestore(SPager *pPager, SBTree *pBt) {
i64 offset = pPager->pageSize * (pgno - 1);
if (tdbOsLSeek(pPager->fd, offset, SEEK_SET) < 0) {
- tdbError("failed to lseek fd due to %s. file:%s, offset:%ld", strerror(errno), pPager->dbFileName, offset);
+ tdbError("failed to lseek fd due to %s. file:%s, offset:%" PRId64, strerror(errno), pPager->dbFileName, offset);
terrno = TAOS_SYSTEM_ERROR(errno);
tdbOsFree(pageBuf);
return -1;
@@ -657,3 +669,13 @@ int tdbPagerRestore(SPager *pPager, SBTree *pBt) {
return 0;
}
+
+int tdbPagerRollback(SPager *pPager) {
+ if (tdbOsRemove(pPager->jFileName) < 0 && errno != ENOENT) {
+ tdbError("failed to remove file due to %s. jFileName:%s", strerror(errno), pPager->jFileName);
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/source/libs/tdb/src/db/tdbTable.c b/source/libs/tdb/src/db/tdbTable.c
index 008907ca777b9216c3675b2a341f8883be7225b2..8b029b06d6d6b0c0332b48bb36075fc9e3fbf28d 100644
--- a/source/libs/tdb/src/db/tdbTable.c
+++ b/source/libs/tdb/src/db/tdbTable.c
@@ -24,7 +24,8 @@ struct STBC {
SBTC btc;
};
-int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprFn, TDB *pEnv, TTB **ppTb) {
+int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprFn, TDB *pEnv, TTB **ppTb,
+ int8_t rollback) {
TTB *pTb;
SPager *pPager;
int ret;
@@ -52,6 +53,7 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
if (strcmp(TDB_MAINDB_NAME, tbname)) {
pPager = tdbEnvGetPager(pEnv, fFullName);
if (!pPager) {
+ tdbOsFree(pTb);
return -1;
}
@@ -71,6 +73,7 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
if (pPager == NULL) {
ret = tdbPagerOpen(pEnv->pCache, fFullName, &pPager);
if (ret < 0) {
+ tdbOsFree(pTb);
return -1;
}
@@ -93,6 +96,7 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
snprintf(fFullName, TDB_FILENAME_LEN, "%s/%s", pEnv->dbName, tbname);
ret = tdbPagerOpen(pEnv->pCache, fFullName, &pPager);
if (ret < 0) {
+ tdbOsFree(pTb);
return -1;
}
@@ -110,10 +114,14 @@ int tdbTbOpen(const char *tbname, int keyLen, int valLen, tdb_cmpr_fn_t keyCmprF
return -1;
}
- ret = tdbPagerRestore(pPager, pTb->pBt);
- if (ret < 0) {
- tdbOsFree(pTb);
- return -1;
+ if (rollback) {
+ tdbPagerRollback(pPager);
+ } else {
+ ret = tdbPagerRestore(pPager, pTb->pBt);
+ if (ret < 0) {
+ tdbOsFree(pTb);
+ return -1;
+ }
}
*ppTb = pTb;
diff --git a/source/libs/tdb/src/inc/tdbInt.h b/source/libs/tdb/src/inc/tdbInt.h
index 68434a4319090c2e54fd161e78d30848c36cad4d..b45747c9726aa49857843f859b2c66f20374c214 100644
--- a/source/libs/tdb/src/inc/tdbInt.h
+++ b/source/libs/tdb/src/inc/tdbInt.h
@@ -190,12 +190,14 @@ int tdbPagerOpenDB(SPager *pPager, SPgno *ppgno, bool toCreate, SBTree *pBt);
int tdbPagerWrite(SPager *pPager, SPage *pPage);
int tdbPagerBegin(SPager *pPager, TXN *pTxn);
int tdbPagerCommit(SPager *pPager, TXN *pTxn);
+int tdbPagerPostCommit(SPager *pPager, TXN *pTxn);
int tdbPagerAbort(SPager *pPager, TXN *pTxn);
int tdbPagerFetchPage(SPager *pPager, SPgno *ppgno, SPage **ppPage, int (*initPage)(SPage *, void *, int), void *arg,
TXN *pTxn);
void tdbPagerReturnPage(SPager *pPager, SPage *pPage, TXN *pTxn);
int tdbPagerAllocPage(SPager *pPager, SPgno *ppgno);
int tdbPagerRestore(SPager *pPager, SBTree *pBt);
+int tdbPagerRollback(SPager *pPager);
// tdbPCache.c ====================================
#define TDB_PCACHE_PAGE \
diff --git a/source/libs/tdb/test/tdbExOVFLTest.cpp b/source/libs/tdb/test/tdbExOVFLTest.cpp
index d98c271edb128d3ba4c8b465dcd0aeba287bd0d4..305e91f62c19f1d067c92fd2ed298dfdd1ee0f70 100644
--- a/source/libs/tdb/test/tdbExOVFLTest.cpp
+++ b/source/libs/tdb/test/tdbExOVFLTest.cpp
@@ -119,13 +119,13 @@ static int tDefaultKeyCmpr(const void *pKey1, int keyLen1, const void *pKey2, in
return cret;
}
-TEST(TdbOVFLPagesTest, DISABLED_TbUpsertTest) {
- // TEST(TdbOVFLPagesTest, TbUpsertTest) {
-}
+// TEST(TdbOVFLPagesTest, DISABLED_TbUpsertTest) {
+// TEST(TdbOVFLPagesTest, TbUpsertTest) {
+//}
-TEST(TdbOVFLPagesTest, DISABLED_TbPGetTest) {
- // TEST(TdbOVFLPagesTest, TbPGetTest) {
-}
+// TEST(TdbOVFLPagesTest, DISABLED_TbPGetTest) {
+// TEST(TdbOVFLPagesTest, TbPGetTest) {
+//}
static void generateBigVal(char *val, int valLen) {
for (int i = 0; i < valLen; ++i) {
@@ -140,7 +140,7 @@ static void generateBigVal(char *val, int valLen) {
static TDB *openEnv(char const *envName, int const pageSize, int const pageNum) {
TDB *pEnv = NULL;
- int ret = tdbOpen(envName, pageSize, pageNum, &pEnv);
+ int ret = tdbOpen(envName, pageSize, pageNum, &pEnv, 0);
if (ret) {
pEnv = NULL;
}
@@ -162,8 +162,8 @@ static void insertOfp(void) {
// open db
TTB *pDb = NULL;
tdb_cmpr_fn_t compFunc = tKeyCmpr;
- // ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb);
- ret = tdbTbOpen("ofp_insert.db", 12, -1, compFunc, pEnv, &pDb);
+ // ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb, 0);
+ ret = tdbTbOpen("ofp_insert.db", 12, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
// open the pool
@@ -193,10 +193,8 @@ static void insertOfp(void) {
tdbTxnClose(&txn);
}
-TEST(TdbOVFLPagesTest, DISABLED_TbInsertTest) {
- // TEST(TdbOVFLPagesTest, TbInsertTest) {
- insertOfp();
-}
+// TEST(TdbOVFLPagesTest, DISABLED_TbInsertTest) {
+TEST(TdbOVFLPagesTest, TbInsertTest) { insertOfp(); }
// TEST(TdbOVFLPagesTest, DISABLED_TbGetTest) {
TEST(TdbOVFLPagesTest, TbGetTest) {
@@ -211,8 +209,8 @@ TEST(TdbOVFLPagesTest, TbGetTest) {
// open db
TTB *pDb = NULL;
tdb_cmpr_fn_t compFunc = tKeyCmpr;
- // int ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb);
- int ret = tdbTbOpen("ofp_insert.db", 12, -1, compFunc, pEnv, &pDb);
+ // int ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb, 0);
+ int ret = tdbTbOpen("ofp_insert.db", 12, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
// generate value payload
@@ -253,7 +251,7 @@ TEST(TdbOVFLPagesTest, TbDeleteTest) {
// open db
TTB *pDb = NULL;
tdb_cmpr_fn_t compFunc = tKeyCmpr;
- ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb);
+ ret = tdbTbOpen("ofp_insert.db", -1, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
// open the pool
@@ -354,12 +352,12 @@ TEST(tdb_test, simple_insert1) {
taosRemoveDir("tdb");
// Open Env
- ret = tdbOpen("tdb", pageSize, 64, &pEnv);
+ ret = tdbOpen("tdb", pageSize, 64, &pEnv, 0);
GTEST_ASSERT_EQ(ret, 0);
// Create a database
compFunc = tKeyCmpr;
- ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb);
+ ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
{
@@ -422,13 +420,13 @@ TEST(tdb_test, simple_insert1) {
for (int i = 1; i <= nData; i++) {
sprintf(key, "key%d", i);
- sprintf(val, "value%d", i);
+ // sprintf(val, "value%d", i);
ret = tdbTbGet(pDb, key, strlen(key), &pVal, &vLen);
ASSERT(ret == 0);
GTEST_ASSERT_EQ(ret, 0);
- GTEST_ASSERT_EQ(vLen, strlen(val));
+ GTEST_ASSERT_EQ(vLen, sizeof(val) / sizeof(val[0]));
GTEST_ASSERT_EQ(memcmp(val, pVal, vLen), 0);
}
diff --git a/source/libs/tdb/test/tdbTest.cpp b/source/libs/tdb/test/tdbTest.cpp
index 6070052127f8d2efde0fb42a6697935d257675e1..f3a301cf5bed77918f1c4d208f146769688b5206 100644
--- a/source/libs/tdb/test/tdbTest.cpp
+++ b/source/libs/tdb/test/tdbTest.cpp
@@ -130,12 +130,12 @@ TEST(tdb_test, DISABLED_simple_insert1) {
taosRemoveDir("tdb");
// Open Env
- ret = tdbOpen("tdb", 4096, 64, &pEnv);
+ ret = tdbOpen("tdb", 4096, 64, &pEnv, 0);
GTEST_ASSERT_EQ(ret, 0);
// Create a database
compFunc = tKeyCmpr;
- ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb);
+ ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
{
@@ -250,12 +250,12 @@ TEST(tdb_test, DISABLED_simple_insert2) {
taosRemoveDir("tdb");
// Open Env
- ret = tdbOpen("tdb", 1024, 10, &pEnv);
+ ret = tdbOpen("tdb", 1024, 10, &pEnv, 0);
GTEST_ASSERT_EQ(ret, 0);
// Create a database
compFunc = tDefaultKeyCmpr;
- ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb);
+ ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
{
@@ -346,11 +346,11 @@ TEST(tdb_test, DISABLED_simple_delete1) {
pPool = openPool();
// open env
- ret = tdbOpen("tdb", 1024, 256, &pEnv);
+ ret = tdbOpen("tdb", 1024, 256, &pEnv, 0);
GTEST_ASSERT_EQ(ret, 0);
// open database
- ret = tdbTbOpen("db.db", -1, -1, tKeyCmpr, pEnv, &pDb);
+ ret = tdbTbOpen("db.db", -1, -1, tKeyCmpr, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
tdbTxnOpen(&txn, 0, poolMalloc, poolFree, pPool, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED);
@@ -435,11 +435,11 @@ TEST(tdb_test, DISABLED_simple_upsert1) {
taosRemoveDir("tdb");
// open env
- ret = tdbOpen("tdb", 4096, 64, &pEnv);
+ ret = tdbOpen("tdb", 4096, 64, &pEnv, 0);
GTEST_ASSERT_EQ(ret, 0);
// open database
- ret = tdbTbOpen("db.db", -1, -1, NULL, pEnv, &pDb);
+ ret = tdbTbOpen("db.db", -1, -1, NULL, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
pPool = openPool();
@@ -497,12 +497,12 @@ TEST(tdb_test, multi_thread_query) {
taosRemoveDir("tdb");
// Open Env
- ret = tdbOpen("tdb", 4096, 10, &pEnv);
+ ret = tdbOpen("tdb", 4096, 10, &pEnv, 0);
GTEST_ASSERT_EQ(ret, 0);
// Create a database
compFunc = tKeyCmpr;
- ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb);
+ ret = tdbTbOpen("db.db", -1, -1, compFunc, pEnv, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
char key[64];
@@ -614,10 +614,10 @@ TEST(tdb_test, DISABLED_multi_thread1) {
taosRemoveDir("tdb");
// Open Env
- ret = tdbOpen("tdb", 512, 1, &pDb);
+ ret = tdbOpen("tdb", 512, 1, &pDb, 0);
GTEST_ASSERT_EQ(ret, 0);
- ret = tdbTbOpen("db.db", -1, -1, NULL, pDb, &pTb);
+ ret = tdbTbOpen("db.db", -1, -1, NULL, pDb, &pTb, 0);
GTEST_ASSERT_EQ(ret, 0);
auto insert = [](TDB *pDb, TTB *pTb, int nData, int *stop, std::shared_timed_mutex *mu) {
@@ -726,4 +726,4 @@ TEST(tdb_test, DISABLED_multi_thread1) {
ret = tdbClose(pDb);
GTEST_ASSERT_EQ(ret, 0);
#endif
-}
\ No newline at end of file
+}
diff --git a/source/libs/transport/src/thttp.c b/source/libs/transport/src/thttp.c
index c1d8dbef62f2111fa1194bd66e8e5949a7b3303a..2399891f6d99ad50e50f3a2b7add37f9f71e2ead 100644
--- a/source/libs/transport/src/thttp.c
+++ b/source/libs/transport/src/thttp.c
@@ -146,7 +146,7 @@ static FORCE_INLINE void clientRecvCb(uv_stream_t* handle, ssize_t nread, const
if (nread < 0) {
uError("http-report recv error:%s", uv_err_name(nread));
} else {
- uTrace("http-report succ to recv %d bytes", nread);
+ uTrace("http-report succ to recv %d bytes", (int32_t)nread);
}
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
}
diff --git a/source/libs/transport/src/trans.c b/source/libs/transport/src/trans.c
index c82af0d0e9b68a3606718bdef47bb783c7289c54..f784b4c53e64d40aac593de77eb7cb9d90c3313d 100644
--- a/source/libs/transport/src/trans.c
+++ b/source/libs/transport/src/trans.c
@@ -54,11 +54,7 @@ void* rpcOpen(const SRpcInit* pInit) {
pRpc->retry = pInit->rfp;
pRpc->startTimer = pInit->tfp;
- if (pInit->connType == TAOS_CONN_SERVER) {
- pRpc->numOfThreads = pInit->numOfThreads > TSDB_MAX_RPC_THREADS ? TSDB_MAX_RPC_THREADS : pInit->numOfThreads;
- } else {
- pRpc->numOfThreads = pInit->numOfThreads > TSDB_MAX_RPC_THREADS ? TSDB_MAX_RPC_THREADS : pInit->numOfThreads;
- }
+ pRpc->numOfThreads = pInit->numOfThreads > TSDB_MAX_RPC_THREADS ? TSDB_MAX_RPC_THREADS : pInit->numOfThreads;
uint32_t ip = 0;
if (pInit->connType == TAOS_CONN_SERVER) {
@@ -79,7 +75,7 @@ void* rpcOpen(const SRpcInit* pInit) {
}
pRpc->parent = pInit->parent;
if (pInit->user) {
- memcpy(pRpc->user, pInit->user, strlen(pInit->user));
+ memcpy(pRpc->user, pInit->user, TSDB_UNI_LEN);
}
int64_t refId = transAddExHandle(transGetInstMgt(), pRpc);
@@ -104,11 +100,11 @@ void* rpcMallocCont(int64_t contLen) {
int64_t size = contLen + TRANS_MSG_OVERHEAD;
char* start = taosMemoryCalloc(1, size);
if (start == NULL) {
- tError("failed to malloc msg, size:%d", size);
+ tError("failed to malloc msg, size:%" PRId64, size);
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
} else {
- tTrace("malloc mem:%p size:%d", start, size);
+ tTrace("malloc mem:%p size:%" PRId64, start, size);
}
return start + sizeof(STransMsgHead);
diff --git a/source/libs/transport/src/transCli.c b/source/libs/transport/src/transCli.c
index 359b9824cf437159dafa8ed76f93e0a6231cba98..48b3097449695af53f74147b32bb77238e44235b 100644
--- a/source/libs/transport/src/transCli.c
+++ b/source/libs/transport/src/transCli.c
@@ -267,11 +267,12 @@ static void cliReleaseUnfinishedMsg(SCliConn* conn) {
#define EPSET_GET_SIZE(epSet) (epSet)->numOfEps
#define EPSET_GET_INUSE_IP(epSet) ((epSet)->eps[(epSet)->inUse].fqdn)
#define EPSET_GET_INUSE_PORT(epSet) ((epSet)->eps[(epSet)->inUse].port)
-#define EPSET_FORWARD_INUSE(epSet) \
- do { \
- if ((epSet)->numOfEps != 0) { \
- (epSet)->inUse = (++((epSet)->inUse)) % ((epSet)->numOfEps); \
- } \
+#define EPSET_FORWARD_INUSE(epSet) \
+ do { \
+ if ((epSet)->numOfEps != 0) { \
+ ++((epSet)->inUse); \
+ (epSet)->inUse = ((epSet)->inUse) % ((epSet)->numOfEps); \
+ } \
} while (0)
#define EPSET_DEBUG_STR(epSet, tbuf) \
@@ -503,6 +504,7 @@ static SCliConn* getConnFromPool(void* pool, char* ip, uint32_t port) {
SConnList list = {0};
taosHashPut((SHashObj*)pool, key, strlen(key), (void*)&list, sizeof(list));
plist = taosHashGet((SHashObj*)pool, key, strlen(key));
+ if (plist == NULL) return NULL;
QUEUE_INIT(&plist->conns);
}
@@ -1157,7 +1159,7 @@ void* transInitClient(uint32_t ip, uint32_t port, char* label, int numOfThreads,
SCliObj* cli = taosMemoryCalloc(1, sizeof(SCliObj));
STrans* pTransInst = shandle;
- memcpy(cli->label, label, strlen(label));
+ memcpy(cli->label, label, TSDB_LABEL_LEN);
cli->numOfThreads = numOfThreads;
cli->pThreadObj = (SCliThrd**)taosMemoryCalloc(cli->numOfThreads, sizeof(SCliThrd*));
@@ -1611,8 +1613,8 @@ int transSetDefaultAddr(void* shandle, const char* ip, const char* fqdn) {
SCvtAddr cvtAddr = {0};
if (ip != NULL && fqdn != NULL) {
- memcpy(cvtAddr.ip, ip, strlen(ip));
- memcpy(cvtAddr.fqdn, fqdn, strlen(fqdn));
+ if (strlen(ip) <= sizeof(cvtAddr.ip)) memcpy(cvtAddr.ip, ip, strlen(ip));
+ if (strlen(fqdn) <= sizeof(cvtAddr.fqdn)) memcpy(cvtAddr.fqdn, fqdn, strlen(fqdn));
cvtAddr.cvt = true;
}
for (int i = 0; i < pTransInst->numOfThreads; i++) {
diff --git a/source/libs/transport/src/transSvr.c b/source/libs/transport/src/transSvr.c
index 3616b4808f8869633bce34f1840644318489bdda..cc381d06a7373a57847a71f83302512a17b9e08d 100644
--- a/source/libs/transport/src/transSvr.c
+++ b/source/libs/transport/src/transSvr.c
@@ -811,7 +811,7 @@ static bool addHandleToAcceptloop(void* arg) {
tError("failed to bind:%s", uv_err_name(err));
return false;
}
- if ((err = uv_listen((uv_stream_t*)&srv->server, 512, uvOnAcceptCb)) != 0) {
+ if ((err = uv_listen((uv_stream_t*)&srv->server, 4096 * 2, uvOnAcceptCb)) != 0) {
tError("failed to listen:%s", uv_err_name(err));
terrno = TSDB_CODE_RPC_PORT_EADDRINUSE;
return false;
diff --git a/source/libs/transport/test/svrBench.c b/source/libs/transport/test/svrBench.c
index 6eb80c8504d68b066d527393a7ba36175f737a23..ce465d989a82078532bd230477b6565cbd098fb2 100644
--- a/source/libs/transport/test/svrBench.c
+++ b/source/libs/transport/test/svrBench.c
@@ -134,7 +134,7 @@ int main(int argc, char *argv[]) {
dDebugFlag = rpcDebugFlag;
uDebugFlag = rpcDebugFlag;
} else {
- printf("\nusage:% [options] \n", argv[0]);
+ printf("\nusage:%s [options] \n", argv[0]);
printf(" [-p port]: server port number, default is:%d\n", rpcInit.localPort);
printf(" [-t threads]: number of rpc threads, default is:%d\n", rpcInit.numOfThreads);
printf(" [-s sessions]: number of sessions, default is:%d\n", rpcInit.sessions);
diff --git a/source/libs/wal/src/walMeta.c b/source/libs/wal/src/walMeta.c
index 279f4dc6562d45b11240628821a7b2ba3c8e6eab..55de61eb74fa46770bbd4ef5014ba5e2ba480ea8 100644
--- a/source/libs/wal/src/walMeta.c
+++ b/source/libs/wal/src/walMeta.c
@@ -69,8 +69,8 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
int64_t walCkHeadSz = sizeof(SWalCkHead);
int64_t end = fileSize;
int64_t offset = 0;
- int32_t capacity = 0;
- int32_t readSize = 0;
+ int64_t capacity = 0;
+ int64_t readSize = 0;
char* buf = NULL;
char* found = NULL;
bool firstTrial = pFileInfo->fileSize < fileSize;
@@ -123,8 +123,8 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
}
SWalCkHead* logContent = (SWalCkHead*)candidate;
if (walValidHeadCksum(logContent) != 0) {
- wError("vgId:%d, failed to validate checksum of wal entry header. offset:% %" PRId64 ", file:%s",
- ((char*)(logContent)-buf), fnameStr);
+ wWarn("vgId:%d, failed to validate checksum of wal entry header. offset:%" PRId64 ", file:%s", pWal->cfg.vgId,
+ offset + ((char*)(logContent)-buf), fnameStr);
haystack = candidate + 1;
if (firstTrial) {
break;
@@ -162,8 +162,8 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
}
if (walValidBodyCksum(logContent) != 0) {
terrno = TSDB_CODE_WAL_CHKSUM_MISMATCH;
- wError("vgId:%d, failed to validate checksum of wal entry body. offset:% %" PRId64 ", file:%s",
- ((char*)(logContent)-buf), fnameStr);
+ wWarn("vgId:%d, failed to validate checksum of wal entry body. offset:%" PRId64 ", file:%s", pWal->cfg.vgId,
+ offset + ((char*)(logContent)-buf), fnameStr);
haystack = candidate + 1;
if (firstTrial) {
break;
@@ -200,8 +200,8 @@ static FORCE_INLINE int64_t walScanLogGetLastVer(SWal* pWal, int32_t fileIdx) {
// truncate file
if (lastEntryEndOffset != fileSize) {
- wWarn("vgId:%d, repair meta truncate file %s to %ld, orig size %ld", pWal->cfg.vgId, fnameStr, lastEntryEndOffset,
- fileSize);
+ wWarn("vgId:%d, repair meta truncate file %s to %" PRId64 ", orig size %" PRId64, pWal->cfg.vgId, fnameStr,
+ lastEntryEndOffset, fileSize);
if (taosFtruncateFile(pFile, lastEntryEndOffset) < 0) {
wError("failed to truncate file due to %s. file:%s", strerror(errno), fnameStr);
terrno = TAOS_SYSTEM_ERROR(errno);
@@ -464,7 +464,7 @@ int walCheckAndRepairIdxFile(SWal* pWal, int32_t fileIdx) {
// determine the last valid entry end, i.e. offset
while ((offset -= sizeof(SWalIdxEntry)) >= 0) {
if (taosLSeekFile(pIdxFile, offset, SEEK_SET) < 0) {
- wError("vgId:%d, failed to seek file due to %s. offset:" PRId64 ", file:%s", pWal->cfg.vgId, strerror(errno),
+ wError("vgId:%d, failed to seek file due to %s. offset:%" PRId64 ", file:%s", pWal->cfg.vgId, strerror(errno),
offset, fnameStr);
terrno = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -481,6 +481,10 @@ int walCheckAndRepairIdxFile(SWal* pWal, int32_t fileIdx) {
continue;
}
+ if (offset != (idxEntry.ver - pFileInfo->firstVer) * sizeof(SWalIdxEntry)) {
+ continue;
+ }
+
if (walReadLogHead(pLogFile, idxEntry.offset, &ckHead) < 0) {
wWarn("vgId:%d, failed to read log file since %s. file:%s, offset:%" PRId64 ", idx entry ver:%" PRId64 "",
pWal->cfg.vgId, terrstr(), fLogNameStr, idxEntry.offset, idxEntry.ver);
@@ -493,6 +497,8 @@ int walCheckAndRepairIdxFile(SWal* pWal, int32_t fileIdx) {
}
offset += sizeof(SWalIdxEntry);
+ ASSERT(offset == (idxEntry.ver - pFileInfo->firstVer + 1) * sizeof(SWalIdxEntry));
+
// ftruncate idx file
if (offset < fileSize) {
if (taosFtruncateFile(pIdxFile, offset) < 0) {
@@ -505,7 +511,7 @@ int walCheckAndRepairIdxFile(SWal* pWal, int32_t fileIdx) {
// rebuild idx file
if (taosLSeekFile(pIdxFile, 0, SEEK_END) < 0) {
- wError("vgId:%d, failed to seek file due to %s. offset:" PRId64 ", file:%s", pWal->cfg.vgId, strerror(errno),
+ wError("vgId:%d, failed to seek file due to %s. offset:%" PRId64 ", file:%s", pWal->cfg.vgId, strerror(errno),
offset, fnameStr);
terrno = TAOS_SYSTEM_ERROR(errno);
goto _err;
@@ -522,7 +528,7 @@ int walCheckAndRepairIdxFile(SWal* pWal, int32_t fileIdx) {
idxEntry.offset, fLogNameStr);
goto _err;
}
- wWarn("vgId:%d wal idx append new entry %ld %ld", pWal->cfg.vgId, idxEntry.ver, idxEntry.offset);
+ wWarn("vgId:%d wal idx append new entry %" PRId64 " %" PRId64, pWal->cfg.vgId, idxEntry.ver, idxEntry.offset);
if (taosWriteFile(pIdxFile, &idxEntry, sizeof(SWalIdxEntry)) < 0) {
wError("vgId:%d, failed to append file since %s. file:%s", pWal->cfg.vgId, terrstr(), fnameStr);
goto _err;
diff --git a/source/libs/wal/src/walRead.c b/source/libs/wal/src/walRead.c
index 179d809c84c5773c138ae7dc35284d5b3fb461eb..8f493ddd85a23a67e1bc2f11412cfc991a4cdeca 100644
--- a/source/libs/wal/src/walRead.c
+++ b/source/libs/wal/src/walRead.c
@@ -126,7 +126,7 @@ static int64_t walReadSeekFilePos(SWalReader *pReader, int64_t fileFirstVer, int
wError("vgId:%d, failed to read idx file, since %s", pReader->pWal->cfg.vgId, terrstr());
} else {
terrno = TSDB_CODE_WAL_FILE_CORRUPTED;
- wError("vgId:%d, read idx file incompletely, read bytes %" PRId64 ", bytes should be %" PRIu64,
+ wError("vgId:%d, read idx file incompletely, read bytes %" PRId64 ", bytes should be %ld",
pReader->pWal->cfg.vgId, ret, sizeof(SWalIdxEntry));
}
return -1;
@@ -182,7 +182,7 @@ int32_t walReadSeekVerImpl(SWalReader *pReader, int64_t ver) {
tmpInfo.firstVer = ver;
SWalFileInfo *pRet = taosArraySearch(pWal->fileInfoSet, &tmpInfo, compareWalFileInfo, TD_LE);
if (pRet == NULL) {
- wError("failed to find WAL log file with ver:%lld", ver);
+ wError("failed to find WAL log file with ver:%" PRId64, ver);
terrno = TSDB_CODE_WAL_INVALID_VER;
return -1;
}
@@ -278,12 +278,12 @@ static int32_t walFetchBodyNew(SWalReader *pRead) {
wDebug("vgId:%d, wal starts to fetch body, index:%" PRId64, pRead->pWal->cfg.vgId, ver);
if (pRead->capacity < pReadHead->bodyLen) {
- void *ptr = taosMemoryRealloc(pRead->pHead, sizeof(SWalCkHead) + pReadHead->bodyLen);
+ SWalCkHead *ptr = (SWalCkHead *)taosMemoryRealloc(pRead->pHead, sizeof(SWalCkHead) + pReadHead->bodyLen);
if (ptr == NULL) {
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
return -1;
}
- pRead->pHead = (SWalCkHead *)ptr;
+ pRead->pHead = ptr;
pReadHead = &pRead->pHead->head;
pRead->capacity = pReadHead->bodyLen;
}
@@ -398,12 +398,12 @@ int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead) {
int64_t ver = pReadHead->version;
if (pRead->capacity < pReadHead->bodyLen) {
- void *ptr = taosMemoryRealloc(*ppHead, sizeof(SWalCkHead) + pReadHead->bodyLen);
+ SWalCkHead *ptr = (SWalCkHead *)taosMemoryRealloc(*ppHead, sizeof(SWalCkHead) + pReadHead->bodyLen);
if (ptr == NULL) {
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
return -1;
}
- *ppHead = (SWalCkHead *)ptr;
+ *ppHead = ptr;
pReadHead = &((*ppHead)->head);
pRead->capacity = pReadHead->bodyLen;
}
@@ -493,13 +493,14 @@ int32_t walReadVer(SWalReader *pReader, int64_t ver) {
}
if (pReader->capacity < pReader->pHead->head.bodyLen) {
- void *ptr = taosMemoryRealloc(pReader->pHead, sizeof(SWalCkHead) + pReader->pHead->head.bodyLen);
+ SWalCkHead *ptr =
+ (SWalCkHead *)taosMemoryRealloc(pReader->pHead, sizeof(SWalCkHead) + pReader->pHead->head.bodyLen);
if (ptr == NULL) {
terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
taosThreadMutexUnlock(&pReader->mutex);
return -1;
}
- pReader->pHead = (SWalCkHead *)ptr;
+ pReader->pHead = ptr;
pReader->capacity = pReader->pHead->head.bodyLen;
}
diff --git a/source/libs/wal/src/walWrite.c b/source/libs/wal/src/walWrite.c
index 91fa49fce0777b4f382e58878bc6c20f8f233beb..3354308c497a88ed5d0cb0a86573edc488f61b7a 100644
--- a/source/libs/wal/src/walWrite.c
+++ b/source/libs/wal/src/walWrite.c
@@ -410,25 +410,35 @@ END:
static int32_t walWriteIndex(SWal *pWal, int64_t ver, int64_t offset) {
SWalIdxEntry entry = {.ver = ver, .offset = offset};
- int64_t idxOffset = taosLSeekFile(pWal->pIdxFile, 0, SEEK_END);
+ SWalFileInfo *pFileInfo = walGetCurFileInfo(pWal);
+ ASSERT(pFileInfo != NULL);
+ ASSERT(pFileInfo->firstVer >= 0);
+ int64_t idxOffset = (entry.ver - pFileInfo->firstVer) * sizeof(SWalIdxEntry);
wDebug("vgId:%d, write index, index:%" PRId64 ", offset:%" PRId64 ", at %" PRId64, pWal->cfg.vgId, ver, offset,
idxOffset);
+
int64_t size = taosWriteFile(pWal->pIdxFile, &entry, sizeof(SWalIdxEntry));
if (size != sizeof(SWalIdxEntry)) {
+ wError("vgId:%d, failed to write idx entry due to %s. ver:%" PRId64, pWal->cfg.vgId, strerror(errno), ver);
terrno = TAOS_SYSTEM_ERROR(errno);
- // TODO truncate
return -1;
}
+
+ ASSERT(taosLSeekFile(pWal->pIdxFile, 0, SEEK_END) == idxOffset + sizeof(SWalIdxEntry) && "Offset of idx entries misaligned");
return 0;
}
-// TODO gurantee atomicity by truncate failed writing
static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgType, SWalSyncInfo syncMeta,
const void *body, int32_t bodyLen) {
int64_t code = 0;
int64_t offset = walGetCurFileOffset(pWal);
+ SWalFileInfo *pFileInfo = walGetCurFileInfo(pWal);
+ ASSERT(pFileInfo != NULL);
+ if (pFileInfo->firstVer == -1) {
+ pFileInfo->firstVer = index;
+ }
pWal->writeHead.head.version = index;
pWal->writeHead.head.bodyLen = bodyLen;
pWal->writeHead.head.msgType = msgType;
@@ -439,11 +449,14 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
pWal->writeHead.cksumHead = walCalcHeadCksum(&pWal->writeHead);
pWal->writeHead.cksumBody = walCalcBodyCksum(body, bodyLen);
+ wDebug("vgId:%d, wal write log %" PRId64 ", msgType: %s", pWal->cfg.vgId, index, TMSG_INFO(msgType));
- wDebug("vgId:%d, wal write log %ld, msgType: %s", pWal->cfg.vgId, index, TMSG_INFO(msgType));
+ code = walWriteIndex(pWal, index, offset);
+ if (code < 0) {
+ goto END;
+ }
if (taosWriteFile(pWal->pLogFile, &pWal->writeHead, sizeof(SWalCkHead)) != sizeof(SWalCkHead)) {
- // TODO ftruncate
terrno = TAOS_SYSTEM_ERROR(errno);
wError("vgId:%d, file:%" PRId64 ".log, failed to write since %s", pWal->cfg.vgId, walGetLastFileFirstVer(pWal),
strerror(errno));
@@ -452,7 +465,6 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
}
if (taosWriteFile(pWal->pLogFile, (char *)body, bodyLen) != bodyLen) {
- // TODO ftruncate
terrno = TAOS_SYSTEM_ERROR(errno);
wError("vgId:%d, file:%" PRId64 ".log, failed to write since %s", pWal->cfg.vgId, walGetLastFileFirstVer(pWal),
strerror(errno));
@@ -460,24 +472,31 @@ static FORCE_INLINE int32_t walWriteImpl(SWal *pWal, int64_t index, tmsg_t msgTy
goto END;
}
- code = walWriteIndex(pWal, index, offset);
- if (code < 0) {
- // TODO ftruncate
- goto END;
- }
-
// set status
if (pWal->vers.firstVer == -1) pWal->vers.firstVer = index;
pWal->vers.lastVer = index;
pWal->totSize += sizeof(SWalCkHead) + bodyLen;
- if (walGetCurFileInfo(pWal)->firstVer == -1) {
- walGetCurFileInfo(pWal)->firstVer = index;
- }
- walGetCurFileInfo(pWal)->lastVer = index;
- walGetCurFileInfo(pWal)->fileSize += sizeof(SWalCkHead) + bodyLen;
+ pFileInfo->lastVer = index;
+ pFileInfo->fileSize += sizeof(SWalCkHead) + bodyLen;
return 0;
+
END:
+ // recover in a reverse order
+ if (taosFtruncateFile(pWal->pLogFile, offset) < 0) {
+ wFatal("vgId:%d, failed to ftruncate logfile to offset:%" PRId64 " during recovery due to %s", pWal->cfg.vgId,
+ offset, strerror(errno));
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ ASSERT(0 && "failed to recover from error");
+ }
+
+ int64_t idxOffset = (index - pFileInfo->firstVer) * sizeof(SWalIdxEntry);
+ if (taosFtruncateFile(pWal->pIdxFile, idxOffset) < 0) {
+ wFatal("vgId:%d, failed to ftruncate idxfile to offset:%" PRId64 "during recovery due to %s", pWal->cfg.vgId,
+ idxOffset, strerror(errno));
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ ASSERT(0 && "failed to recover from error");
+ }
return -1;
}
diff --git a/source/os/src/osEnv.c b/source/os/src/osEnv.c
index 616ab7875dd9634b4ad4258c51320b589dd744ae..ac1881fc6d843b3ad215ceb809d44e5811c53328 100644
--- a/source/os/src/osEnv.c
+++ b/source/os/src/osEnv.c
@@ -105,3 +105,5 @@ void osSetSystemLocale(const char *inLocale, const char *inCharSet) {
memcpy(tsLocale, inLocale, strlen(inLocale) + 1);
memcpy(tsCharset, inCharSet, strlen(inCharSet) + 1);
}
+
+void osSetProcPath(int32_t argc, char **argv) { tsProcPath = argv[0]; }
diff --git a/source/os/src/osFile.c b/source/os/src/osFile.c
index d332d913ca89ff0a80cefd9fececdb2c6279114e..be862308f116da45c53f53a25f89192dd25432c2 100644
--- a/source/os/src/osFile.c
+++ b/source/os/src/osFile.c
@@ -343,6 +343,7 @@ TdFilePtr taosOpenFile(const char *path, int32_t tdFileOptions) {
TdFilePtr pFile = (TdFilePtr)taosMemoryMalloc(sizeof(TdFile));
if (pFile == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
if (fd >= 0) close(fd);
if (fp != NULL) fclose(fp);
return NULL;
diff --git a/source/os/src/osProc.c b/source/os/src/osProc.c
deleted file mode 100644
index f060ab48c9bb9fd45b385c36a77db1e0adba0e6f..0000000000000000000000000000000000000000
--- a/source/os/src/osProc.c
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define ALLOW_FORBID_FUNC
-#define _DEFAULT_SOURCE
-#include "os.h"
-
-int32_t taosNewProc(char **args) {
-#ifdef WINDOWS
- assert(0);
- return 0;
-#else
- int32_t pid = fork();
- if (pid == 0) {
- args[0] = tsProcPath;
- // close(STDIN_FILENO);
- // close(STDOUT_FILENO);
- // close(STDERR_FILENO);
- return execvp(tsProcPath, args);
- } else {
- return pid;
- }
-#endif
-}
-
-void taosWaitProc(int32_t pid) {
-#ifdef WINDOWS
- assert(0);
-#else
- int32_t status = -1;
- waitpid(pid, &status, 0);
-#endif
-}
-
-void taosKillProc(int32_t pid) {
-#ifdef WINDOWS
- assert(0);
-#else
- kill(pid, SIGINT);
-#endif
-}
-
-bool taosProcExist(int32_t pid) {
-#ifdef WINDOWS
- assert(0);
- return false;
-#else
- int32_t p = getpgid(pid);
- return p >= 0;
-#endif
-}
-
-// the length of the new name must be less than the original name to take effect
-void taosSetProcName(int32_t argc, char **argv, const char *name) {
- setThreadName(name);
-
- for (int32_t i = 0; i < argc; ++i) {
- int32_t len = strlen(argv[i]);
- for (int32_t j = 0; j < len; ++j) {
- argv[i][j] = 0;
- }
- if (i == 0) {
- tstrncpy(argv[0], name, len + 1);
- }
- }
-}
-
-void taosSetProcPath(int32_t argc, char **argv) { tsProcPath = argv[0]; }
diff --git a/source/os/src/osShm.c b/source/os/src/osShm.c
deleted file mode 100644
index cb09e2fb38c5edcc00ae753245d98b9ca498e825..0000000000000000000000000000000000000000
--- a/source/os/src/osShm.c
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2019 TAOS Data, Inc.
- *
- * This program is free software: you can use, redistribute, and/or modify
- * it under the terms of the GNU Affero General Public License, version 3
- * or later ("AGPL"), as published by the Free Software Foundation.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program. If not, see .
- */
-
-#define ALLOW_FORBID_FUNC
-#define _DEFAULT_SOURCE
-#include "os.h"
-
-#define MAX_SHMIDS 6
-
-static int32_t shmids[MAX_SHMIDS] = {0};
-
-static void taosDeleteCreatedShms() {
-#if defined(WINDOWS)
- assert(0);
-#else
- for (int32_t i = 0; i < MAX_SHMIDS; ++i) {
- int32_t shmid = shmids[i] - 1;
- if (shmid >= 0) {
- shmctl(shmid, IPC_RMID, NULL);
- }
- }
-#endif
-}
-
-int32_t taosCreateShm(SShm* pShm, int32_t key, int32_t shmsize) {
-#if defined(WINDOWS)
- assert(0);
-#else
- pShm->id = -1;
-
-#if 1
- key_t __shkey = IPC_PRIVATE;
- int32_t __shmflag = IPC_CREAT | IPC_EXCL | 0600;
-#else
- key_t __shkey = 0X95270000 + key;
- int32_t __shmflag = IPC_CREAT | 0600;
-#endif
-
- int32_t shmid = shmget(__shkey, shmsize, __shmflag);
- if (shmid < 0) {
- return -1;
- }
-
- void* shmptr = shmat(shmid, NULL, 0);
- if (shmptr == NULL) {
- return -1;
- }
-
- pShm->id = shmid;
- pShm->size = shmsize;
- pShm->ptr = shmptr;
-
-#if 0
- if (key >= 0 && key < MAX_SHMIDS) {
- shmids[key] = pShm->id + 1;
- }
- atexit(taosDeleteCreatedShms);
-#else
- shmctl(pShm->id, IPC_RMID, NULL);
-#endif
-
-#endif
- return 0;
-}
-
-void taosDropShm(SShm* pShm) {
-#if defined(WINDOWS)
- assert(0);
-#else
- if (pShm->id >= 0) {
- if (pShm->ptr != NULL) {
- shmdt(pShm->ptr);
- }
- shmctl(pShm->id, IPC_RMID, NULL);
- }
- pShm->id = -1;
- pShm->size = 0;
- pShm->ptr = NULL;
-#endif
-}
-
-int32_t taosAttachShm(SShm* pShm) {
-#if defined(WINDOWS)
- assert(0);
-#else
- errno = 0;
-
- void* ptr = shmat(pShm->id, NULL, 0);
- if (errno == 0) {
- pShm->ptr = ptr;
- }
-#endif
- return errno;
-}
diff --git a/source/os/src/osSocket.c b/source/os/src/osSocket.c
index bfeef248cdce61bba62d8cc5dcfd175b09559448..fc943d4d76f983aed8c36efd72f851e9b8f3baa4 100644
--- a/source/os/src/osSocket.c
+++ b/source/os/src/osSocket.c
@@ -590,7 +590,9 @@ TdSocketPtr taosOpenTcpClientSocket(uint32_t destIp, uint16_t destPort, uint32_t
taosCloseSocket(&pSocket);
return NULL;
} else {
- taosKeepTcpAlive(pSocket);
+ if (taosKeepTcpAlive(pSocket) == -1) {
+ return NULL;
+ }
}
return pSocket;
@@ -1059,18 +1061,22 @@ int32_t taosCreateSocketWithTimeout(uint32_t timeout) {
}
#if defined(WINDOWS)
if (0 != setsockopt(fd, IPPROTO_TCP, TCP_MAXRT, (char *)&timeout, sizeof(timeout))) {
+ taosCloseSocketNoCheck1(fd);
return -1;
}
#elif defined(_TD_DARWIN_64)
uint32_t conn_timeout_ms = timeout * 1000;
if (0 != setsockopt(fd, IPPROTO_TCP, TCP_CONNECTIONTIMEOUT, (char *)&conn_timeout_ms, sizeof(conn_timeout_ms))) {
+ taosCloseSocketNoCheck1(fd);
return -1;
}
#else // Linux like systems
uint32_t conn_timeout_ms = timeout * 1000;
if (0 != setsockopt(fd, IPPROTO_TCP, TCP_USER_TIMEOUT, (char *)&conn_timeout_ms, sizeof(conn_timeout_ms))) {
+ taosCloseSocketNoCheck1(fd);
return -1;
}
#endif
+
return (int)fd;
}
diff --git a/source/util/src/tcache.c b/source/util/src/tcache.c
index a559a9c000f4a4d336a8440d17db0629b0caf3a4..7d1686ef80c0e157bd897e1a8f3bdab1411cf97f 100644
--- a/source/util/src/tcache.c
+++ b/source/util/src/tcache.c
@@ -227,7 +227,7 @@ static FORCE_INLINE void taosCacheReleaseNode(SCacheObj *pCacheObj, SCacheNode *
static FORCE_INLINE STrashElem *doRemoveElemInTrashcan(SCacheObj *pCacheObj, STrashElem *pElem) {
if (pElem->pData->signature != pElem->pData) {
- uWarn("key:sig:0x%" PRIx64 " %p data has been released, ignore", pElem->pData->signature, pElem->pData);
+ uWarn("key:sig:0x%" PRIx64 " %p data has been released, ignore", (int64_t)pElem->pData->signature, pElem->pData);
return NULL;
}
diff --git a/source/util/src/tconfig.c b/source/util/src/tconfig.c
index edb2f0380efbbfa384e8c611ade240e25a22664f..0bf9e7cc3365240f34fe2b8697559cf60f5fdfe9 100644
--- a/source/util/src/tconfig.c
+++ b/source/util/src/tconfig.c
@@ -944,6 +944,7 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
if (taosReadFile(pFile, buf, fileSize) <= 0) {
taosCloseFile(&pFile);
uError("load json file error: %s", filepath);
+ taosMemoryFreeClear(buf);
return -1;
}
taosCloseFile(&pFile);
@@ -953,6 +954,7 @@ int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url) {
if (jsonParseError != NULL) {
uError("load json file parse error: %s", jsonParseError);
}
+ taosMemoryFreeClear(buf);
return -1;
}
taosMemoryFreeClear(buf);
diff --git a/source/util/src/terror.c b/source/util/src/terror.c
index 9a117c6eb48c1bc06d4063101531579ba6369fb4..37f9734eab20482755b8305a6cb2be6a08407493 100644
--- a/source/util/src/terror.c
+++ b/source/util/src/terror.c
@@ -238,8 +238,6 @@ TAOS_DEFINE_ERROR(TSDB_CODE_MND_QNODE_ALREADY_EXIST, "Qnode already exists"
TAOS_DEFINE_ERROR(TSDB_CODE_MND_QNODE_NOT_EXIST, "Qnode not there")
TAOS_DEFINE_ERROR(TSDB_CODE_MND_SNODE_ALREADY_EXIST, "Snode already exists")
TAOS_DEFINE_ERROR(TSDB_CODE_MND_SNODE_NOT_EXIST, "Snode not there")
-TAOS_DEFINE_ERROR(TSDB_CODE_MND_BNODE_ALREADY_EXIST, "Bnode already exists")
-TAOS_DEFINE_ERROR(TSDB_CODE_MND_BNODE_NOT_EXIST, "Bnode not there")
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_FEW_MNODES, "The replica of mnode cannot less than 1")
TAOS_DEFINE_ERROR(TSDB_CODE_MND_TOO_MANY_MNODES, "The replica of mnode cannot exceed 3")
diff --git a/source/util/src/tlog.c b/source/util/src/tlog.c
index 2e2300ba147ce9bb1df2e7f401480c731cf0ce0b..9d97cf7ab2958b17c5245ec8b41a5e09ccdff67c 100644
--- a/source/util/src/tlog.c
+++ b/source/util/src/tlog.c
@@ -443,10 +443,13 @@ static inline int32_t taosBuildLogHead(char *buffer, const char *flags) {
static inline void taosPrintLogImp(ELogLevel level, int32_t dflag, const char *buffer, int32_t len) {
if ((dflag & DEBUG_FILE) && tsLogObj.logHandle && tsLogObj.logHandle->pFile != NULL && osLogSpaceAvailable()) {
taosUpdateLogNums(level);
- if (tsAsyncLog) {
+ if (tsAsyncLog && level != DEBUG_FATAL) {
taosPushLogBuffer(tsLogObj.logHandle, buffer, len);
} else {
taosWriteFile(tsLogObj.logHandle->pFile, buffer, len);
+ if (level == DEBUG_FATAL) {
+ taosFsyncFile(tsLogObj.logHandle->pFile);
+ }
}
if (tsLogObj.maxLines > 0) {
diff --git a/source/util/src/tqueue.c b/source/util/src/tqueue.c
index eb62e12a19ed44da50ade5bcb9ba5423530b08dd..8748f8df3f1e1a216587f159561bace3181d6128 100644
--- a/source/util/src/tqueue.c
+++ b/source/util/src/tqueue.c
@@ -141,12 +141,14 @@ int32_t taosQueueItemSize(STaosQueue *queue) {
}
int64_t taosQueueMemorySize(STaosQueue *queue) {
- if (queue == NULL) return 0;
-
+#if 1
+ return queue->memOfItems;
+#else
taosThreadMutexLock(&queue->mutex);
int64_t memOfItems = queue->memOfItems;
taosThreadMutexUnlock(&queue->mutex);
return memOfItems;
+#endif
}
void *taosAllocateQitem(int32_t size, EQItype itype) {
@@ -298,9 +300,6 @@ int32_t taosGetQitem(STaosQall *qall, void **ppItem) {
return num;
}
-void taosResetQitems(STaosQall *qall) { qall->current = qall->start; }
-int32_t taosQallItemSize(STaosQall *qall) { return qall->numOfItems; }
-
STaosQset *taosOpenQset() {
STaosQset *qset = taosMemoryCalloc(sizeof(STaosQset), 1);
if (qset == NULL) {
@@ -405,8 +404,6 @@ void taosRemoveFromQset(STaosQset *qset, STaosQueue *queue) {
uDebug("queue:%p is removed from qset:%p", queue, qset);
}
-int32_t taosGetQueueNumber(STaosQset *qset) { return qset->numOfQueues; }
-
int32_t taosReadQitemFromQset(STaosQset *qset, void **ppItem, SQueueInfo *qinfo) {
STaosQnode *pNode = NULL;
int32_t code = 0;
@@ -497,6 +494,12 @@ int32_t taosReadAllQitemsFromQset(STaosQset *qset, STaosQall *qall, SQueueInfo *
return code;
}
+int32_t taosQallItemSize(STaosQall *qall) { return qall->numOfItems; }
+void taosResetQitems(STaosQall *qall) { qall->current = qall->start; }
+int32_t taosGetQueueNumber(STaosQset *qset) { return qset->numOfQueues; }
+
+#if 0
+
void taosResetQsetThread(STaosQset *qset, void *pItem) {
if (pItem == NULL) return;
STaosQnode *pNode = (STaosQnode *)((char *)pItem - sizeof(STaosQnode));
@@ -507,3 +510,5 @@ void taosResetQsetThread(STaosQset *qset, void *pItem) {
}
taosThreadMutexUnlock(&qset->mutex);
}
+
+#endif
diff --git a/source/util/src/tsched.c b/source/util/src/tsched.c
index 9cf9e2c4316a850ac31b15aaab8a864deb4d32eb..467f26b36275a84d64d89e1e00b5e901f9867307 100644
--- a/source/util/src/tsched.c
+++ b/source/util/src/tsched.c
@@ -26,18 +26,25 @@ static void *taosProcessSchedQueue(void *param);
static void taosDumpSchedulerStatus(void *qhandle, void *tmrId);
void *taosInitScheduler(int32_t queueSize, int32_t numOfThreads, const char *label, SSchedQueue *pSched) {
+ bool schedMalloced = false;
+
if (NULL == pSched) {
pSched = (SSchedQueue *)taosMemoryCalloc(sizeof(SSchedQueue), 1);
if (pSched == NULL) {
uError("%s: no enough memory for pSched", label);
return NULL;
}
+
+ schedMalloced = true;
}
pSched->queue = (SSchedMsg *)taosMemoryCalloc(sizeof(SSchedMsg), queueSize);
if (pSched->queue == NULL) {
uError("%s: no enough memory for queue", label);
taosCleanUpScheduler(pSched);
+ if (schedMalloced) {
+ taosMemoryFree(pSched);
+ }
return NULL;
}
@@ -45,6 +52,9 @@ void *taosInitScheduler(int32_t queueSize, int32_t numOfThreads, const char *lab
if (pSched->qthread == NULL) {
uError("%s: no enough memory for qthread", label);
taosCleanUpScheduler(pSched);
+ if (schedMalloced) {
+ taosMemoryFree(pSched);
+ }
return NULL;
}
@@ -57,18 +67,27 @@ void *taosInitScheduler(int32_t queueSize, int32_t numOfThreads, const char *lab
if (taosThreadMutexInit(&pSched->queueMutex, NULL) < 0) {
uError("init %s:queueMutex failed(%s)", label, strerror(errno));
taosCleanUpScheduler(pSched);
+ if (schedMalloced) {
+ taosMemoryFree(pSched);
+ }
return NULL;
}
if (tsem_init(&pSched->emptySem, 0, (uint32_t)pSched->queueSize) != 0) {
uError("init %s:empty semaphore failed(%s)", label, strerror(errno));
taosCleanUpScheduler(pSched);
+ if (schedMalloced) {
+ taosMemoryFree(pSched);
+ }
return NULL;
}
if (tsem_init(&pSched->fullSem, 0, 0) != 0) {
uError("init %s:full semaphore failed(%s)", label, strerror(errno));
taosCleanUpScheduler(pSched);
+ if (schedMalloced) {
+ taosMemoryFree(pSched);
+ }
return NULL;
}
@@ -82,6 +101,9 @@ void *taosInitScheduler(int32_t queueSize, int32_t numOfThreads, const char *lab
if (code != 0) {
uError("%s: failed to create rpc thread(%s)", label, strerror(errno));
taosCleanUpScheduler(pSched);
+ if (schedMalloced) {
+ taosMemoryFree(pSched);
+ }
return NULL;
}
++pSched->numOfThreads;
diff --git a/source/util/src/tworker.c b/source/util/src/tworker.c
index e353546ca7a359a970accd6071ef6018e45eaa64..f7d4173d3fcb4e30c927543436acb83596bf7339 100644
--- a/source/util/src/tworker.c
+++ b/source/util/src/tworker.c
@@ -28,10 +28,7 @@ int32_t tQWorkerInit(SQWorkerPool *pool) {
return -1;
}
- if (taosThreadMutexInit(&pool->mutex, NULL)) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ (void)taosThreadMutexInit(&pool->mutex, NULL);
for (int32_t i = 0; i < pool->max; ++i) {
SQWorker *worker = pool->workers + i;
@@ -97,14 +94,10 @@ static void *tQWorkerThreadFp(SQWorker *worker) {
}
STaosQueue *tQWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp) {
- taosThreadMutexLock(&pool->mutex);
STaosQueue *queue = taosOpenQueue();
- if (queue == NULL) {
- taosThreadMutexUnlock(&pool->mutex);
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return NULL;
- }
+ if (queue == NULL) return NULL;
+ taosThreadMutexLock(&pool->mutex);
taosSetQueueFp(queue, fp, NULL);
taosAddIntoQset(pool->qset, queue, ahandle);
@@ -118,7 +111,6 @@ STaosQueue *tQWorkerAllocQueue(SQWorkerPool *pool, void *ahandle, FItem fp) {
taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE);
if (taosThreadCreate(&worker->thread, &thAttr, (ThreadFp)tQWorkerThreadFp, worker) != 0) {
- uError("worker:%s:%d failed to create thread to process since %s", pool->name, worker->id, strerror(errno));
taosCloseQueue(queue);
terrno = TSDB_CODE_OUT_OF_MEMORY;
queue = NULL;
@@ -150,10 +142,7 @@ int32_t tWWorkerInit(SWWorkerPool *pool) {
return -1;
}
- if (taosThreadMutexInit(&pool->mutex, NULL) != 0) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ (void)taosThreadMutexInit(&pool->mutex, NULL);
for (int32_t i = 0; i < pool->max; ++i) {
SWWorker *worker = pool->workers + i;
@@ -225,48 +214,27 @@ static void *tWWorkerThreadFp(SWWorker *worker) {
STaosQueue *tWWorkerAllocQueue(SWWorkerPool *pool, void *ahandle, FItems fp) {
taosThreadMutexLock(&pool->mutex);
SWWorker *worker = pool->workers + pool->nextId;
+ int32_t code = -1;
STaosQueue *queue = taosOpenQueue();
- if (queue == NULL) {
- taosThreadMutexUnlock(&pool->mutex);
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return NULL;
- }
+ if (queue == NULL) goto _OVER;
taosSetQueueFp(queue, NULL, fp);
-
if (worker->qset == NULL) {
worker->qset = taosOpenQset();
- if (worker->qset == NULL) {
- taosCloseQueue(queue);
- taosThreadMutexUnlock(&pool->mutex);
- return NULL;
- }
+ if (worker->qset == NULL) goto _OVER;
taosAddIntoQset(worker->qset, queue, ahandle);
worker->qall = taosAllocateQall();
- if (worker->qall == NULL) {
- taosCloseQset(worker->qset);
- taosCloseQueue(queue);
- taosThreadMutexUnlock(&pool->mutex);
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return NULL;
- }
+ if (worker->qall == NULL) goto _OVER;
+
TdThreadAttr thAttr;
taosThreadAttrInit(&thAttr);
taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE);
+ if (taosThreadCreate(&worker->thread, &thAttr, (ThreadFp)tWWorkerThreadFp, worker) != 0) goto _OVER;
- if (taosThreadCreate(&worker->thread, &thAttr, (ThreadFp)tWWorkerThreadFp, worker) != 0) {
- uError("worker:%s:%d failed to create thread to process since %s", pool->name, worker->id, strerror(errno));
- taosFreeQall(worker->qall);
- taosCloseQset(worker->qset);
- taosCloseQueue(queue);
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- queue = NULL;
- } else {
- uDebug("worker:%s:%d is launched, max:%d", pool->name, worker->id, pool->max);
- pool->nextId = (pool->nextId + 1) % pool->max;
- }
+ uDebug("worker:%s:%d is launched, max:%d", pool->name, worker->id, pool->max);
+ pool->nextId = (pool->nextId + 1) % pool->max;
taosThreadAttrDestroy(&thAttr);
pool->num++;
@@ -276,10 +244,20 @@ STaosQueue *tWWorkerAllocQueue(SWWorkerPool *pool, void *ahandle, FItems fp) {
pool->nextId = (pool->nextId + 1) % pool->max;
}
- taosThreadMutexUnlock(&pool->mutex);
uDebug("worker:%s, queue:%p is allocated, ahandle:%p", pool->name, queue, ahandle);
+ code = 0;
- return queue;
+_OVER:
+ taosThreadMutexUnlock(&pool->mutex);
+
+ if (code == -1) {
+ if (queue != NULL) taosCloseQueue(queue);
+ if (worker->qset != NULL) taosCloseQset(worker->qset);
+ if (worker->qall != NULL) taosFreeQall(worker->qall);
+ return NULL;
+ } else {
+ return queue;
+ }
}
void tWWorkerFreeQueue(SWWorkerPool *pool, STaosQueue *queue) {
@@ -292,15 +270,11 @@ int32_t tSingleWorkerInit(SSingleWorker *pWorker, const SSingleWorkerCfg *pCfg)
pPool->name = pCfg->name;
pPool->min = pCfg->min;
pPool->max = pCfg->max;
- if (tQWorkerInit(pPool) != 0) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ if (tQWorkerInit(pPool) != 0) return -1;
+
pWorker->queue = tQWorkerAllocQueue(pPool, pCfg->param, pCfg->fp);
- if (pWorker->queue == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ if (pWorker->queue == NULL) return -1;
+
pWorker->name = pCfg->name;
return 0;
}
@@ -320,15 +294,11 @@ int32_t tMultiWorkerInit(SMultiWorker *pWorker, const SMultiWorkerCfg *pCfg) {
SWWorkerPool *pPool = &pWorker->pool;
pPool->name = pCfg->name;
pPool->max = pCfg->max;
- if (tWWorkerInit(pPool) != 0) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ if (tWWorkerInit(pPool) != 0) return -1;
+
pWorker->queue = tWWorkerAllocQueue(pPool, pCfg->param, pCfg->fp);
- if (pWorker->queue == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
+ if (pWorker->queue == NULL) return -1;
+
pWorker->name = pCfg->name;
return 0;
}
diff --git a/source/util/test/CMakeLists.txt b/source/util/test/CMakeLists.txt
index 6e42ef7e75eac38a5a072bfef8521152fd74ae06..2e307771b7ed6c5473c4edc0b1947de199f82f10 100644
--- a/source/util/test/CMakeLists.txt
+++ b/source/util/test/CMakeLists.txt
@@ -45,14 +45,6 @@ INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/src/util/inc)
# add_executable(encodeTest "encodeTest.cpp")
# target_link_libraries(encodeTest os util gtest gtest_main)
-# queueTest
-# add_executable(procTest "procTest.cpp")
-# target_link_libraries(procTest os util transport sut gtest_main)
-# add_test(
-# NAME procTest
-# COMMAND procTest
-# )
-
# cfgTest
add_executable(cfgTest "cfgTest.cpp")
target_link_libraries(cfgTest os util gtest_main)
diff --git a/source/util/test/procTest.cpp b/source/util/test/procTest.cpp
deleted file mode 100644
index 53d3fa2c4bc118d57d9a8d08ecc4810f83aa5eda..0000000000000000000000000000000000000000
--- a/source/util/test/procTest.cpp
+++ /dev/null
@@ -1,264 +0,0 @@
-/**
- * @file queue.cpp
- * @author slguan (slguan@taosdata.com)
- * @brief UTIL module queue tests
- * @version 1.0
- * @date 2022-01-27
- *
- * @copyright Copyright (c) 2022
- *
- */
-#if 0
-#include
-#include "tlog.h"
-#include "tprocess.h"
-#include "tqueue.h"
-
-typedef struct STestMsg {
- uint16_t msgType;
- void *pCont;
- int contLen;
- int32_t code;
- void *handle; // rpc handle returned to app
- void *ahandle; // app handle set by client
- int noResp; // has response or not(default 0, 0: resp, 1: no resp);
- int persistHandle; // persist handle or not
-} STestMsg;
-
-class UtilTesProc : public ::testing::Test {
- public:
- void SetUp() override {
- shm.id = -1;
- for (int32_t i = 0; i < 4000; ++i) {
- body[i] = i % 26 + 'a';
- }
- head.pCont = body;
- head.code = 1;
- head.msgType = 2;
- head.noResp = 3;
- head.persistHandle = 4;
-
- taosRemoveDir(TD_TMP_DIR_PATH "td");
- taosMkDir(TD_TMP_DIR_PATH "td");
- tstrncpy(tsLogDir, TD_TMP_DIR_PATH "td", PATH_MAX);
- if (taosInitLog("taosdlog", 1) != 0) {
- printf("failed to init log file\n");
- }
- }
- void TearDown() override { taosDropShm(&shm); }
-
- public:
- static STestMsg head;
- static char body[4000];
- static SShm shm;
- static void SetUpTestSuite() {}
- static void TearDownTestSuite() {}
-};
-
-SShm UtilTesProc::shm;
-char UtilTesProc::body[4000];
-STestMsg UtilTesProc::head;
-
-TEST_F(UtilTesProc, 00_Init_Cleanup) {
- ASSERT_EQ(taosCreateShm(&shm, 1234, 1024 * 1024 * 2), 0);
-
- shm.size = 1023;
- SProcCfg cfg = {(ProcConsumeFp)NULL,
- (ProcMallocFp)taosAllocateQitem,
- (ProcFreeFp)taosFreeQitem,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryMalloc,
- (ProcConsumeFp)NULL,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryMalloc,
- shm,
- &shm,
- "1234"};
- SProc *proc = dmInitProc(&cfg);
- ASSERT_EQ(proc, nullptr);
-
- shm.size = 2468;
- cfg.shm = shm;
- proc = dmInitProc(&cfg);
- ASSERT_NE(proc, nullptr);
-
- ASSERT_EQ(dmRunProc(proc), 0);
- dmCleanupProc(proc);
- taosDropShm(&shm);
-}
-
-void ConsumeChild1(void *parent, void *pHead, int16_t headLen, void *pBody, int32_t bodyLen, EProcFuncType ftype) {
- STestMsg msg;
- memcpy(&msg, pHead, headLen);
- char body[2000] = {0};
- memcpy(body, pBody, bodyLen);
-
- uDebug("====> parent:%" PRId64 " ftype:%d, headLen:%d bodyLen:%d head:%d:%d:%d:%d body:%s <====", (int64_t)parent,
- ftype, headLen, bodyLen, msg.code, msg.msgType, msg.noResp, msg.persistHandle, body);
- taosMemoryFree(pBody);
- taosFreeQitem(pHead);
-}
-
-TEST_F(UtilTesProc, 01_Push_Pop_Child) {
- shm.size = 3000;
- ASSERT_EQ(taosCreateShm(&shm, 1235, shm.size), 0);
- SProcCfg cfg = {(ProcConsumeFp)ConsumeChild1,
- (ProcMallocFp)taosAllocateQitem,
- (ProcFreeFp)taosFreeQitem,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcConsumeFp)NULL,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- shm,
- (void *)((int64_t)1235),
- "1235_c"};
- SProc *cproc = dmInitProc(&cfg);
- ASSERT_NE(cproc, nullptr);
-
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, 0, body, 0, 0, 0, DND_FUNC_RSP), 0);
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, 0, body, 0, 0, 0, DND_FUNC_REGIST), 0);
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, 0, body, 0, 0, 0, DND_FUNC_RELEASE), 0);
- ASSERT_NE(dmPutToProcCQueue(cproc, NULL, 12, body, 0, 0, 0, DND_FUNC_REQ), 0);
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, 0, body, 0, 0, 0, DND_FUNC_REQ), 0);
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, shm.size, body, 0, 0, 0, DND_FUNC_REQ), 0);
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, sizeof(STestMsg), body, shm.size, 0, 0, DND_FUNC_REQ), 0);
-
- for (int32_t j = 0; j < 1000; j++) {
- int32_t i = 0;
- for (i = 0; i < 20; ++i) {
- ASSERT_EQ(dmPutToProcCQueue(cproc, &head, sizeof(STestMsg), body, i, 0, 0, DND_FUNC_REQ), 0);
- }
- ASSERT_NE(dmPutToProcCQueue(cproc, &head, sizeof(STestMsg), body, i, 0, 0, DND_FUNC_REQ), 0);
-
- cfg.isChild = true;
- cfg.name = "1235_p";
- SProc *pproc = dmInitProc(&cfg);
- ASSERT_NE(pproc, nullptr);
- dmRunProc(pproc);
- dmCleanupProc(pproc);
- }
-
- dmCleanupProc(cproc);
- taosDropShm(&shm);
-}
-
-void ConsumeParent1(void *parent, void *pHead, int16_t headLen, void *pBody, int32_t bodyLen, EProcFuncType ftype) {
- STestMsg msg;
- memcpy(&msg, pHead, headLen);
- char body[2000] = {0};
- memcpy(body, pBody, bodyLen);
-
- uDebug("----> parent:%" PRId64 " ftype:%d, headLen:%d bodyLen:%d head:%d:%d:%d:%d body:%s <----", (int64_t)parent,
- ftype, headLen, bodyLen, msg.code, msg.msgType, msg.noResp, msg.persistHandle, body);
- taosMemoryFree(pBody);
- taosMemoryFree(pHead);
-}
-
-TEST_F(UtilTesProc, 02_Push_Pop_Parent) {
- shm.size = 3000;
- ASSERT_EQ(taosCreateShm(&shm, 1236, shm.size), 0);
- SProcCfg cfg = {(ProcConsumeFp)NULL,
- (ProcMallocFp)taosAllocateQitem,
- (ProcFreeFp)taosFreeQitem,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcConsumeFp)ConsumeParent1,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- shm,
- (void *)((int64_t)1236),
- "1236_c"};
- SProc *cproc = dmInitProc(&cfg);
- ASSERT_NE(cproc, nullptr);
-
- cfg.name = "1236_p";
- cfg.isChild = true;
- SProc *pproc = dmInitProc(&cfg);
- ASSERT_NE(pproc, nullptr);
-
- for (int32_t j = 0; j < 1000; j++) {
- int32_t i = 0;
- for (i = 0; i < 20; ++i) {
- dmPutToProcPQueue(pproc, &head, sizeof(STestMsg), body, i, DND_FUNC_REQ);
- }
-
- dmRunProc(cproc);
- dmStopProc(cproc);
- }
-
- dmCleanupProc(pproc);
- dmCleanupProc(cproc);
- taosDropShm(&shm);
-}
-
-void ConsumeChild3(void *parent, void *pHead, int16_t headLen, void *pBody, int32_t bodyLen, EProcFuncType ftype) {
- STestMsg msg;
- memcpy(&msg, pHead, headLen);
- char body[2000] = {0};
- memcpy(body, pBody, bodyLen);
-
- uDebug("====> parent:%" PRId64 " ftype:%d, headLen:%d bodyLen:%d handle:%" PRId64 " body:%s <====", (int64_t)parent,
- ftype, headLen, bodyLen, (int64_t)msg.handle, body);
- taosMemoryFree(pBody);
- taosFreeQitem(pHead);
-}
-
-void processHandle(void *handle) { uDebug("----> remove handle:%" PRId64 " <----", (int64_t)handle); }
-
-TEST_F(UtilTesProc, 03_Handle) {
- // uDebugFlag = 207;
- shm.size = 3000;
- ASSERT_EQ(taosCreateShm(&shm, 1237, shm.size), 0);
- SProcCfg cfg = {(ProcConsumeFp)ConsumeChild3,
- (ProcMallocFp)taosAllocateQitem,
- (ProcFreeFp)taosFreeQitem,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcConsumeFp)NULL,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- (ProcMallocFp)taosMemoryMalloc,
- (ProcFreeFp)taosMemoryFree,
- shm,
- (void *)((int64_t)1235),
- "1237_p"};
- SProc *cproc = dmInitProc(&cfg);
- ASSERT_NE(cproc, nullptr);
-
- for (int32_t j = 0; j < 1; j++) {
- int32_t i = 0;
- for (i = 0; i < 20; ++i) {
- head.handle = (void *)((int64_t)i);
- ASSERT_EQ(dmPutToProcCQueue(cproc, &head, sizeof(STestMsg), body, i, (void *)((int64_t)i), i, DND_FUNC_REQ), 0);
- }
-
- cfg.isChild = true;
- cfg.name = "child_queue";
- SProc *pproc = dmInitProc(&cfg);
- ASSERT_NE(pproc, nullptr);
- dmRunProc(pproc);
- dmCleanupProc(pproc);
-
- int64_t ref = 0;
-
- ref = dmRemoveProcRpcHandle(cproc, (void *)((int64_t)3));
- EXPECT_EQ(ref, 3);
- ref = dmRemoveProcRpcHandle(cproc, (void *)((int64_t)5));
- EXPECT_EQ(ref, 5);
- ref = dmRemoveProcRpcHandle(cproc, (void *)((int64_t)6));
- EXPECT_EQ(ref, 6);
- dmCloseProcRpcHandles(cproc, processHandle);
- }
-
- dmCleanupProc(cproc);
- taosDropShm(&shm);
-}
-
-#endif
\ No newline at end of file
diff --git a/tests/parallel_test/run_case.sh b/tests/parallel_test/run_case.sh
index 58dcb87345a691e4f0d3a99d5bdde0c08076d39f..e0b905375ac395089a536b544adbdf1049eeb036 100755
--- a/tests/parallel_test/run_case.sh
+++ b/tests/parallel_test/run_case.sh
@@ -67,9 +67,13 @@ mkdir -p /var/lib/taos
cd $CONTAINER_TESTDIR/tests/$exec_dir
ulimit -c unlimited
+md5sum /usr/lib/libtaos.so.1
+md5sum /home/TDinternal/debug/build/lib/libtaos.so
$TIMEOUT_CMD $cmd
RET=$?
echo "cmd exit code: $RET"
+md5sum /usr/lib/libtaos.so.1
+md5sum /home/TDinternal/debug/build/lib/libtaos.so
if [ $RET -ne 0 ]; then
pwd
diff --git a/tests/parallel_test/run_container.sh b/tests/parallel_test/run_container.sh
index bb57f238f029e2098f70fc553a8e6280ff46e5c4..f58aaaf29dacd174be584f9e1094aa0699caae79 100755
--- a/tests/parallel_test/run_container.sh
+++ b/tests/parallel_test/run_container.sh
@@ -68,12 +68,16 @@ if [ $ent -ne 0 ]; then
CONTAINER_TESTDIR=/home/TDinternal/community
SIM_DIR=/home/TDinternal/sim
REP_MOUNT_PARAM="$INTERNAL_REPDIR:/home/TDinternal"
+ REP_MOUNT_LIB="$INTERNAL_REPDIR/debug/build/lib:/home/TDinternal/debug/build/lib:ro"
+
else
# community edition
REPDIR=$WORKDIR/TDengine
CONTAINER_TESTDIR=/home/TDengine
SIM_DIR=/home/TDengine/sim
REP_MOUNT_PARAM="$REPDIR:/home/TDengine"
+ REP_MOUNT_LIB="$REPDIR/debug/build/lib:/home/TDengine/debug/build/lib:ro"
+
fi
ulimit -c unlimited
@@ -103,6 +107,7 @@ coredump_dir=`cat /proc/sys/kernel/core_pattern | xargs dirname`
docker run \
-v $REP_MOUNT_PARAM \
+ -v $REP_MOUNT_LIB \
-v $MOUNT_DIR \
-v ${SOURCEDIR}:/usr/local/src/ \
-v "$TMP_DIR/thread_volume/$thread_no/sim:${SIM_DIR}" \
diff --git a/tests/script/jenkins/basic.txt b/tests/script/jenkins/basic.txt
index d8f4a36261d3607d91b89d42aa06fbbd1b01ab57..e07ec54182069b7f119d3f69b9e5babbfd869a66 100644
--- a/tests/script/jenkins/basic.txt
+++ b/tests/script/jenkins/basic.txt
@@ -187,9 +187,6 @@
# ---- snode ----
# unsupport ./test.sh -f tsim/snode/basic1.sim
-# ---- bnode
-./test.sh -f tsim/bnode/basic1.sim
-
# ---- mnode
./test.sh -f tsim/mnode/basic1.sim
./test.sh -f tsim/mnode/basic2.sim
@@ -231,7 +228,7 @@
./test.sh -f tsim/table/vgroup.sim
# ---- stream
-./test.sh -f tsim/stream/basic0.sim
+./test.sh -f tsim/stream/basic0.sim -v
./test.sh -f tsim/stream/basic1.sim
./test.sh -f tsim/stream/basic2.sim
./test.sh -f tsim/stream/drop_stream.sim
@@ -249,12 +246,18 @@
./test.sh -f tsim/stream/windowClose.sim
./test.sh -f tsim/stream/ignoreExpiredData.sim
./test.sh -f tsim/stream/sliding.sim
-#./test.sh -f tsim/stream/partitionbyColumnInterval.sim
+./test.sh -f tsim/stream/partitionbyColumnInterval.sim
#./test.sh -f tsim/stream/partitionbyColumnSession.sim
#./test.sh -f tsim/stream/partitionbyColumnState.sim
#./test.sh -f tsim/stream/deleteInterval.sim
#./test.sh -f tsim/stream/deleteSession.sim
#./test.sh -f tsim/stream/deleteState.sim
+#./test.sh -f tsim/stream/fillIntervalDelete0.sim
+#./test.sh -f tsim/stream/fillIntervalDelete1.sim
+./test.sh -f tsim/stream/fillIntervalLinear.sim
+#./test.sh -f tsim/stream/fillIntervalPartitionBy.sim
+./test.sh -f tsim/stream/fillIntervalPrevNext.sim
+./test.sh -f tsim/stream/fillIntervalValue.sim
# ---- transaction ----
./test.sh -f tsim/trans/lossdata1.sim
@@ -296,18 +299,6 @@
./test.sh -f tsim/stable/values.sim
./test.sh -f tsim/stable/vnode3.sim
-# --- for multi process mode
-./test.sh -f tsim/user/basic.sim -m
-./test.sh -f tsim/db/basic3.sim -m
-./test.sh -f tsim/db/error1.sim -m
-./test.sh -f tsim/insert/backquote.sim -m
-# unsupport ./test.sh -f tsim/parser/fourArithmetic-basic.sim -m
-./test.sh -f tsim/query/interval-offset.sim -m
-# unsupport ./test.sh -f tsim/tmq/basic3.sim -m
-./test.sh -f tsim/stable/vnode3.sim -m
-./test.sh -f tsim/qnode/basic1.sim -m
-# unsupport ./test.sh -f tsim/mnode/basic1.sim -m
-
# --- sma
./test.sh -f tsim/sma/drop_sma.sim
./test.sh -f tsim/sma/tsmaCreateInsertQuery.sim
@@ -454,5 +445,7 @@
./test.sh -f tsim/tag/set.sim
./test.sh -f tsim/tag/smallint.sim
./test.sh -f tsim/tag/tinyint.sim
+./test.sh -f tsim/tag/drop_tag.sim
+
#======================b1-end===============
diff --git a/tests/script/sh/deploy.sh b/tests/script/sh/deploy.sh
index 5f497a248f7aadd1e060cd44ee9073d792bf14ba..606afe164b9657e63ae68c2edb1231073031d96d 100755
--- a/tests/script/sh/deploy.sh
+++ b/tests/script/sh/deploy.sh
@@ -9,7 +9,6 @@ UNAME_BIN=`which uname`
OS_TYPE=`$UNAME_BIN`
NODE_NAME=
NODE=
-MULTIPROCESS=0
while getopts "n:i:m" arg
do
case $arg in
@@ -19,9 +18,6 @@ do
i)
NODE=$OPTARG
;;
- m)
- MULTIPROCESS=1
- ;;
?)
echo "unkonw argument"
;;
@@ -148,5 +144,4 @@ echo "numOfLogLines 20000000" >> $TAOS_CFG
echo "asyncLog 0" >> $TAOS_CFG
echo "locale en_US.UTF-8" >> $TAOS_CFG
echo "telemetryReporting 0" >> $TAOS_CFG
-echo "multiProcess ${MULTIPROCESS}" >> $TAOS_CFG
echo " " >> $TAOS_CFG
diff --git a/tests/script/test.sh b/tests/script/test.sh
index 0ffe8cf8f16e9cf6114e3dd4348de56a4f8a497c..15305679876625b150aa4d53038f025e0acb7ff6 100755
--- a/tests/script/test.sh
+++ b/tests/script/test.sh
@@ -15,7 +15,6 @@ VALGRIND=0
UNIQUE=0
UNAME_BIN=`which uname`
OS_TYPE=`$UNAME_BIN`
-MULTIPROCESS=0
while getopts "f:avum" arg
do
case $arg in
@@ -28,9 +27,6 @@ do
u)
UNIQUE=1
;;
- m)
- MULTIPROCESS=1
- ;;
?)
echo "unknow argument"
;;
@@ -126,22 +122,12 @@ ulimit -c unlimited
if [ -n "$FILE_NAME" ]; then
echo "------------------------------------------------------------------------"
if [ $VALGRIND -eq 1 ]; then
- if [[ $MULTIPROCESS -eq 1 ]];then
- FLAG="-m -v"
- else
- FLAG="-v"
- fi
-
+ FLAG="-v"
echo valgrind --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --child-silent-after-fork=yes --show-leak-kinds=all --num-callers=20 -v --workaround-gcc296-bugs=yes --log-file=${LOG_DIR}/valgrind-tsim.log $PROGRAM -c $CFG_DIR -f $FILE_NAME $FLAG
valgrind --tool=memcheck --leak-check=full --show-reachable=no --track-origins=yes --child-silent-after-fork=yes --show-leak-kinds=all --num-callers=20 -v --workaround-gcc296-bugs=yes --log-file=${LOG_DIR}/valgrind-tsim.log $PROGRAM -c $CFG_DIR -f $FILE_NAME $FLAG
else
- if [[ $MULTIPROCESS -eq 1 ]];then
- echo "ExcuteCmd(multiprocess):" $PROGRAM -m -c $CFG_DIR -f $FILE_NAME
- $PROGRAM -m -c $CFG_DIR -f $FILE_NAME
- else
- echo "ExcuteCmd(singleprocess):" $PROGRAM -c $CFG_DIR -f $FILE_NAME
- $PROGRAM -c $CFG_DIR -f $FILE_NAME
- fi
+ echo "ExcuteCmd:" $PROGRAM -c $CFG_DIR -f $FILE_NAME
+ $PROGRAM -c $CFG_DIR -f $FILE_NAME
fi
else
echo "ExcuteCmd:" $PROGRAM -c $CFG_DIR -f basicSuite.sim
diff --git a/tests/script/tmp/monitor.sim b/tests/script/tmp/monitor.sim
index b410e1b6ad99e8bd83dcf7dd3cf0f3c4961d0ad4..1734b9a1a7ae20f9d4b4cdfe882d2355ce98d824 100644
--- a/tests/script/tmp/monitor.sim
+++ b/tests/script/tmp/monitor.sim
@@ -23,5 +23,4 @@ sql create table db.stb (ts timestamp, c1 int, c2 binary(4)) tags(t1 int, t2 bin
print =============== create drop qnode 1
sql create qnode on dnode 1
#sql create snode on dnode 1
-#sql create bnode on dnode 1
diff --git a/tests/script/tsim/bnode/basic1.sim b/tests/script/tsim/bnode/basic1.sim
deleted file mode 100644
index 0a200016368efffbdd360c891cc6f15d3a284b47..0000000000000000000000000000000000000000
--- a/tests/script/tsim/bnode/basic1.sim
+++ /dev/null
@@ -1,135 +0,0 @@
-system sh/stop_dnodes.sh
-system sh/deploy.sh -n dnode1 -i 1
-system sh/deploy.sh -n dnode2 -i 2
-system sh/exec.sh -n dnode1 -s start
-system sh/exec.sh -n dnode2 -s start
-sql connect
-
-print =============== select * from information_schema.ins_dnodes
-sql select * from information_schema.ins_dnodes;
-if $rows != 1 then
- return -1
-endi
-
-if $data00 != 1 then
- return -1
-endi
-
-sql select * from information_schema.ins_mnodes;
-if $rows != 1 then
- return -1
-endi
-
-if $data00 != 1 then
- return -1
-endi
-
-if $data02 != leader then
- return -1
-endi
-
-print =============== create dnodes
-sql create dnode $hostname port 7200
-sleep 2000
-
-sql select * from information_schema.ins_dnodes;
-if $rows != 2 then
- return -1
-endi
-
-if $data00 != 1 then
- return -1
-endi
-
-if $data10 != 2 then
- return -1
-endi
-
-print $data02
-if $data02 != 0 then
- return -1
-endi
-
-if $data12 != 0 then
- return -1
-endi
-
-if $data04 != ready then
- return -1
-endi
-
-if $data14 != ready then
- return -1
-endi
-
-sql select * from information_schema.ins_mnodes;
-if $rows != 1 then
- return -1
-endi
-
-if $data00 != 1 then
- return -1
-endi
-
-if $data02 != leader then
- return -1
-endi
-
-#print =============== create drop bnode 1
-#sql create bnode on dnode 1
-#sql show bnodes
-#if $rows != 1 then
-# return -1
-#endi
-#if $data00 != 1 then
-# return -1
-#endi
-#sql_error create bnode on dnode 1
-#
-#sql drop bnode on dnode 1
-#sql show bnodes
-#if $rows != 0 then
-# return -1
-#endi
-#sql_error drop bnode on dnode 1
-#
-#print =============== create drop bnode 2
-#sql create bnode on dnode 2
-#sql show bnodes
-#if $rows != 1 then
-# return -1
-#endi
-#if $data00 != 2 then
-# return -1
-#endi
-#sql_error create bnode on dnode 2
-#
-#sql drop bnode on dnode 2
-#sql show bnodes
-#if $rows != 0 then
-# return -1
-#endi
-#sql_error drop bnode on dnode 2
-#
-#print =============== create drop bnodes
-#sql create bnode on dnode 1
-#sql create bnode on dnode 2
-#sql show bnodes
-#if $rows != 2 then
-# return -1
-#endi
-
-#print =============== restart
-#system sh/exec.sh -n dnode1 -s stop -x SIGINT
-#system sh/exec.sh -n dnode2 -s stop -x SIGINT
-#system sh/exec.sh -n dnode1 -s start
-#system sh/exec.sh -n dnode2 -s start
-#
-#sleep 2000
-#sql show bnodes
-#if $rows != 2 then
-# return -1
-#endi
-
-system sh/exec.sh -n dnode1 -s stop -x SIGINT
-system sh/exec.sh -n dnode2 -s stop -x SIGINT
diff --git a/tests/script/tsim/insert/basic.sim b/tests/script/tsim/insert/basic.sim
index c926cbc8b0cf2f7250d8b7ba9850ecc13cee19d4..ec8a61bb04561da2ffdf06cfdb55f483f5f13de8 100644
--- a/tests/script/tsim/insert/basic.sim
+++ b/tests/script/tsim/insert/basic.sim
@@ -12,14 +12,14 @@ $tb = $tbPrefix . $i
print =============== step1
sql drop database -x step1
step1:
-sql create database $db vgroups 2
+sql create database $db vgroups 2 precision 'ns'
sql use $db
sql create table $tb (ts timestamp, speed int)
$x = 0
-while $x < 10
+while $x < 110
$cc = $x * 60000
- $ms = 1601481600000 + $cc
+ $ms = 1601481600000000000 + $cc
sql insert into $tb values ($ms , $x )
$x = $x + 1
@@ -27,9 +27,9 @@ endw
print =============== step 2
$x = 0
-while $x < 5
+while $x < 110
$cc = $x * 60000
- $ms = 1551481600000 + $cc
+ $ms = 1551481600000000000 + $cc
sql insert into $tb values ($ms , $x )
$x = $x + 1
@@ -38,8 +38,29 @@ endw
sql select * from $tb
print $rows points data are retrieved
-if $rows != 15 then
+if $rows != 220 then
return -1
endi
+# error
+print $data1
+print $data[1000][1]
+print $data[1][1000]
+print $data[1000][1000]
+$a1 = 0
+$a2 = 0
+$a3 = $a1 % $a2
+print $a3
+
+$val = \\\1
+print ====> $val
+
+sql_slow select * from $tb
+
+sql close
+sql connect
+sql close
+sql connect root
+
+
system sh/exec.sh -n dnode1 -s stop -x SIGINT
diff --git a/tests/script/tsim/parser/like.sim b/tests/script/tsim/parser/like.sim
index 40dcec4080cde7cb7b9b6bc5fe01367fc7ef2c26..5cac026b5794c1e12ce2d9b700b04404cc7773c9 100644
--- a/tests/script/tsim/parser/like.sim
+++ b/tests/script/tsim/parser/like.sim
@@ -17,9 +17,9 @@ sql create table $table1 (ts timestamp, b binary(20))
sql create table $table2 (ts timestamp, b binary(20))
sql insert into $table1 values(now, "table_name")
-sql insert into $table1 values(now-1m, "tablexname")
+sql insert into $table1 values(now-3m, "tablexname")
sql insert into $table1 values(now-2m, "tablexxx")
-sql insert into $table1 values(now-2m, "table")
+sql insert into $table1 values(now-1m, "table")
sql select b from $table1
if $rows != 4 then
diff --git a/tests/script/tsim/sma/tsmaCreateInsertQuery.sim b/tests/script/tsim/sma/tsmaCreateInsertQuery.sim
index 2ff01263a45d7c6eeac3cf1bc553f567725fc2b5..7aef9e0f8634725c6befd3a9d8c9c2ddcbee9b30 100644
--- a/tests/script/tsim/sma/tsmaCreateInsertQuery.sim
+++ b/tests/script/tsim/sma/tsmaCreateInsertQuery.sim
@@ -5,7 +5,7 @@ sleep 50
sql connect
print =============== create database
-sql create database d1 vgroups 1
+sql create database d1 keep 36500d vgroups 1
sql use d1
print =============== create super table, include column type for count/sum/min/max/first
@@ -25,8 +25,8 @@ if $rows != 1 then
endi
print =============== insert data, mode1: one row one table in sql
-sql insert into ct1 values(now+0s, 10, 2.0, 3.0)
-sql insert into ct1 values(now+1s, 11, 2.1, 3.1)(now+2s, -12, -2.2, -3.2)(now+3s, -13, -2.3, -3.3)
+sql insert into ct1 values('2022-10-19 09:55:45.682', 10, 2.0, 3.0)
+sql insert into ct1 values('2022-10-19 09:55:46.682', 11, 2.1, 3.1)('2022-10-19 09:55:47.682', -12, -2.2, -3.2)('2022-10-19 09:55:48.682', -13, -2.3, -3.3)
print =============== create sma index from super table
@@ -34,7 +34,7 @@ sql create sma index sma_index_name1 on stb function(max(c1),max(c2),min(c1)) in
print $data00 $data01 $data02 $data03
print =============== trigger stream to execute sma aggr task and insert sma data into sma store
-sql insert into ct1 values(now+5s, 20, 20.0, 30.0)
+sql insert into ct1 values('2022-10-19 09:55:50.682', 20, 20.0, 30.0)
#===================================================================
print =============== show streams ================================
diff --git a/tests/script/tsim/stream/basic0.sim b/tests/script/tsim/stream/basic0.sim
index 6d05f69dcfc542de9b4ebb195479263db4d76881..8e3e99978b5a877bd6f2f9bb51daf9a05e50140a 100644
--- a/tests/script/tsim/stream/basic0.sim
+++ b/tests/script/tsim/stream/basic0.sim
@@ -1,7 +1,7 @@
system sh/stop_dnodes.sh
system sh/deploy.sh -n dnode1 -i 1
system sh/cfg.sh -n dnode1 -c debugflag -v 131
-system sh/exec.sh -n dnode1 -s start -v
+system sh/exec.sh -n dnode1 -s start
sql connect
print =============== create database
diff --git a/tests/script/tsim/stream/session0.sim b/tests/script/tsim/stream/session0.sim
index 3e0af354d8ff4135f4e689c63505baf32871cfb3..afae8ef5da64d6d54b28b8898fbe9a5a973620fc 100644
--- a/tests/script/tsim/stream/session0.sim
+++ b/tests/script/tsim/stream/session0.sim
@@ -216,12 +216,12 @@ if $data02 != 3.274823935 then
goto loop2
endi
-if $data03 != 1.800000000 then
+if $data03 != 1.500000000 then
print ======$data03
return -1
endi
-if $data04 != 3.350000000 then
+if $data04 != 3.500000000 then
print ======$data04
return -1
endi
diff --git a/tests/script/tsim/stream/session1.sim b/tests/script/tsim/stream/session1.sim
index ab173c5929601bc2df27e22cb85db75f066611f0..ee6eefde2633f6422dc51927421ef109392dc2ae 100644
--- a/tests/script/tsim/stream/session1.sim
+++ b/tests/script/tsim/stream/session1.sim
@@ -5,15 +5,15 @@ sleep 50
sql connect
print =============== create database
-sql create database test vgroups 1
-sql select * from information_schema.ins_databases
+sql create database test vgroups 1;
+sql select * from information_schema.ins_databases;
if $rows != 3 then
return -1
endi
print $data00 $data01 $data02
-sql use test
+sql use test;
sql create table t1(ts timestamp, a int, b int , c int, d double,id int);
diff --git a/tests/script/tsim/stream/state0.sim b/tests/script/tsim/stream/state0.sim
index 877a2877b9378d2101217080906a68a27ae9fee7..60a50f95607129efcdcb406c01ca1eadf196c869 100644
--- a/tests/script/tsim/stream/state0.sim
+++ b/tests/script/tsim/stream/state0.sim
@@ -349,7 +349,7 @@ endi
if $rows != 3 then
print ====loop4=rows=$rows
-# goto loop4
+ goto loop4
endi
# row 0
diff --git a/tests/script/tsim/stream/triggerSession0.sim b/tests/script/tsim/stream/triggerSession0.sim
index 2ea689ef78c10401bc11cb1f54cbfb31bb0a3e9f..1bef4398845178be526723cdaf75863e46e3da02 100644
--- a/tests/script/tsim/stream/triggerSession0.sim
+++ b/tests/script/tsim/stream/triggerSession0.sim
@@ -13,7 +13,7 @@ endi
print $data00 $data01 $data02
-sql use test
+sql use test;
sql create table t2(ts timestamp, a int, b int , c int, d double);
sql create stream streams2 trigger window_close into streamt2 as select _wstart, count(*) c1, count(d) c2 , sum(a) c3 , max(b) c4, min(c) c5 from t2 session(ts, 10s);
@@ -58,16 +58,11 @@ endi
sql insert into t2 values(1648791233002,1,2,3,1.0);
sleep 300
sql select * from streamt2;
-if $rows != 1 then
+if $rows != 0 then
print ======$rows
return -1
endi
-if $data01 != 6 then
- print ======$data01
- return -1
-endi
-
sql insert into t2 values(1648791253003,1,2,3,1.0);
sleep 300
sql select * from streamt2;
diff --git a/tests/script/tsim/tag/drop_tag.sim b/tests/script/tsim/tag/drop_tag.sim
new file mode 100644
index 0000000000000000000000000000000000000000..03892039f92dfdd74fda175ea942dfa752ba6c2a
--- /dev/null
+++ b/tests/script/tsim/tag/drop_tag.sim
@@ -0,0 +1,84 @@
+
+system sh/stop_dnodes.sh
+system sh/deploy.sh -n dnode1 -i 1
+system sh/exec.sh -n dnode1 -s start
+sql connect
+
+
+$dbPrefix = ta_bib_db
+$tbPrefix = ta_bib_tb
+$mtPrefix = ta_bib_mt
+$tbNum = 10
+$rowNum = 20
+$totalNum = 200
+
+print =============== step1
+$i = 0
+$db = $dbPrefix . $i
+$mt = $mtPrefix . $i
+
+sql drop database if exists $db
+
+sql create database $db vgroups 1
+sql use $db
+
+print ======== test bigint
+sql create table if not exists st( ts timestamp, order_id bigint) tags (account_id bigint)
+
+sql create table t1 using st tags(111)
+sql create table t2 using st tags(222)
+
+sql insert into t1(ts, order_id) values(1648791213001, 1)
+sql insert into t2(ts, order_id) values(1648791213002, 2)
+sql select account_id,count(*) from st where account_id = 111 group by account_id
+
+sql drop table t1
+
+sql create table t1 using st tags(111)
+
+sql insert into t1(ts, order_id) values(1648791213001, 1)
+sql insert into t2(ts, order_id) values(1648791213002, 2)
+
+sql select account_id,count(*) from st where account_id = 111 group by account_id
+
+if $rows != 1 then
+ return -1
+endi
+
+print ======== test varchar
+
+sql drop stable st
+
+sql create table if not exists st( ts timestamp, order_id bigint) tags (account_id binary(16))
+
+sql create table t1 using st tags("aac")
+sql create table t2 using st tags("abc")
+
+sql insert into t1(ts, order_id) values(1648791213001, 1)
+sql insert into t2(ts, order_id) values(1648791213002, 2)
+sql select account_id,count(*) from st where account_id = "aac" group by account_id
+
+sql drop table t1
+
+sql create table t1 using st tags("aac")
+
+sql insert into t1(ts, order_id) values(1648791213001, 1)
+sql insert into t2(ts, order_id) values(1648791213002, 2)
+
+sql select account_id,count(*) from st where account_id = "aac" group by account_id
+
+if $rows != 1 then
+ return -1
+endi
+
+print ====== test empty table
+sql drop table t1
+
+sql select account_id,count(*) from st where account_id = "aac" group by account_id
+if $rows != 0 then
+ return -1
+endi
+
+
+sql drop database $db
+
diff --git a/tests/script/tsim/testsuit.sim b/tests/script/tsim/testsuit.sim
index 89a4babb0b9b7ccbce8758f55c2ba97919d0df59..ad8d70b089e8a277c3cffc5b88647342fc7f39f8 100644
--- a/tests/script/tsim/testsuit.sim
+++ b/tests/script/tsim/testsuit.sim
@@ -128,5 +128,4 @@ run tsim/sync/threeReplica1VgElectWihtInsert.sim
run tsim/sma/tsmaCreateInsertQuery.sim
run tsim/sma/rsmaCreateInsertQuery.sim
run tsim/valgrind/basic.sim
-run tsim/valgrind/checkError.sim
-run tsim/bnode/basic1.sim
\ No newline at end of file
+run tsim/valgrind/checkError.sim
\ No newline at end of file
diff --git a/tests/script/tsim/user/privilege_sysinfo.sim b/tests/script/tsim/user/privilege_sysinfo.sim
index 86f95755d09f7e2f1c0654b94f63f471f9a074d0..1614c3be5537579ff8dcdbe09db598be8363c946 100644
--- a/tests/script/tsim/user/privilege_sysinfo.sim
+++ b/tests/script/tsim/user/privilege_sysinfo.sim
@@ -110,7 +110,6 @@ sql_error show dnodes
sql_error show snodes
sql_error show qnodes
sql_error show mnodes
-sql_error show bnodes
sql_error show db.vgroups
sql_error show db.stables
sql_error show db.tables
diff --git a/tests/system-test/0-others/taosdMonitor.py b/tests/system-test/0-others/taosdMonitor.py
index c713e9fd148811b670284a91a2ab5305a8f91bb4..96e057c9f815b19a20ef98b87d58c3ec7fdfe51d 100644
--- a/tests/system-test/0-others/taosdMonitor.py
+++ b/tests/system-test/0-others/taosdMonitor.py
@@ -94,7 +94,7 @@ class RequestHandlerImpl(http.server.BaseHTTPRequestHandler):
tdLog.exit("vgroup_id is null!")
if "database_name" not in infoDict["vgroup_infos"][index] or len(infoDict["vgroup_infos"][index]["database_name"]) < 0:
tdLog.exit("database_name is null!")
- if "tables_num" not in infoDict["vgroup_infos"][index] or infoDict["vgroup_infos"][index]["tables_num"]!= 0:
+ if "tables_num" not in infoDict["vgroup_infos"][index]:
tdLog.exit("tables_num is null!")
if "status" not in infoDict["vgroup_infos"][index] or len(infoDict["vgroup_infos"][index]["status"]) < 0 :
tdLog.exit("status is null!")
@@ -125,7 +125,7 @@ class RequestHandlerImpl(http.server.BaseHTTPRequestHandler):
dnode_infos = ['uptime', 'cpu_engine', 'cpu_system', 'cpu_cores', 'mem_engine', 'mem_system', 'mem_total', 'disk_engine',
'disk_used', 'disk_total', 'net_in', 'net_out', 'io_read', 'io_write', 'io_read_disk', 'io_write_disk', 'req_select',
'req_select_rate', 'req_insert', 'req_insert_success', 'req_insert_rate', 'req_insert_batch', 'req_insert_batch_success',
- 'req_insert_batch_rate', 'errors', 'vnodes_num', 'masters', 'has_mnode', 'has_qnode', 'has_snode', 'has_bnode']
+ 'req_insert_batch_rate', 'errors', 'vnodes_num', 'masters', 'has_mnode', 'has_qnode', 'has_snode']
for elem in dnode_infos:
if elem not in infoDict["dnode_info"] or infoDict["dnode_info"][elem] < 0:
tdLog.exit(f"{elem} is null!")
@@ -294,6 +294,10 @@ class TDTestCase:
vgroups = "30"
sql = "create database db3 vgroups " + vgroups
tdSql.query(sql)
+ sql = "create table db3.stb (ts timestamp, f int) tags (t int)"
+ tdSql.query(sql)
+ sql = "create table db3.tb using db3.stb tags (1)"
+ tdSql.query(sql)
# create http server: bing ip/port , and request processor
if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
diff --git a/tests/system-test/0-others/taosdShell.py b/tests/system-test/0-others/taosdShell.py
new file mode 100644
index 0000000000000000000000000000000000000000..6d62420efec4bebd89e8656b2e966dac861318e3
--- /dev/null
+++ b/tests/system-test/0-others/taosdShell.py
@@ -0,0 +1,185 @@
+
+import taos
+import sys
+import time
+import socket
+import os
+import platform
+if platform.system().lower() == 'windows':
+ import wexpect as taosExpect
+else:
+ import pexpect as taosExpect
+
+from util.log import *
+from util.sql import *
+from util.cases import *
+from util.dnodes import *
+
+class TDTestCase:
+ #updatecfgDict = {'clientCfg': {'serverPort': 7080, 'firstEp': 'trd02:7080', 'secondEp':'trd02:7080'},\
+ # 'serverPort': 7080, 'firstEp': 'trd02:7080'}
+ # hostname = socket.gethostname()
+ # if (platform.system().lower() == 'windows' and not tdDnodes.dnodes[0].remoteIP == ""):
+ # try:
+ # config = eval(tdDnodes.dnodes[0].remoteIP)
+ # hostname = config["host"]
+ # except Exception:
+ # hostname = tdDnodes.dnodes[0].remoteIP
+ # serverPort = '7080'
+ # rpcDebugFlagVal = '143'
+ # clientCfgDict = {'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
+ # clientCfgDict["serverPort"] = serverPort
+ # clientCfgDict["firstEp"] = hostname + ':' + serverPort
+ # clientCfgDict["secondEp"] = hostname + ':' + serverPort
+ # clientCfgDict["rpcDebugFlag"] = rpcDebugFlagVal
+ # clientCfgDict["fqdn"] = hostname
+
+ # updatecfgDict = {'clientCfg': {}, 'serverPort': '', 'firstEp': '', 'secondEp':'', 'rpcDebugFlag':'135', 'fqdn':''}
+ # updatecfgDict["clientCfg"] = clientCfgDict
+ # updatecfgDict["serverPort"] = serverPort
+ # updatecfgDict["firstEp"] = hostname + ':' + serverPort
+ # updatecfgDict["secondEp"] = hostname + ':' + serverPort
+ # updatecfgDict["fqdn"] = hostname
+
+ # print ("===================: ", updatecfgDict)
+
+ def init(self, conn, logSql):
+ tdLog.debug(f"start to excute {__file__}")
+ tdSql.init(conn.cursor())
+
+ def getBuildPath(self):
+ selfPath = os.path.dirname(os.path.realpath(__file__))
+
+ if ("community" in selfPath):
+ projPath = selfPath[:selfPath.find("community")]
+ else:
+ projPath = selfPath[:selfPath.find("tests")]
+
+ for root, dirs, files in os.walk(projPath):
+ if ("taosd" in files or "taosd.exe" in files):
+ rootRealPath = os.path.dirname(os.path.realpath(root))
+ if ("packaging" not in rootRealPath):
+ buildPath = root[:len(root) - len("/build/bin")]
+ break
+ return buildPath
+
+ def get_process_pid(self,processname):
+ #origin artical link:https://blog.csdn.net/weixin_45623536/article/details/122099062
+ process_info_list = []
+ process = os.popen('ps -A | grep %s'% processname)
+ process_info = process.read()
+ for i in process_info.split(' '):
+ if i != "":
+ process_info_list.append(i)
+ print(process_info_list)
+ if len(process_info_list) != 0 :
+ pid = int(process_info_list[0])
+ else :
+ pid = 0
+ return pid
+
+ def checkAndstopPro(self,processName,startAction):
+ i = 1
+ count = 10
+ for i in range(count):
+ taosdPid=self.get_process_pid(processName)
+ if taosdPid != 0 and taosdPid != "" :
+ tdLog.info("stop taosd %s ,kill pid :%s "%(startAction,taosdPid))
+ os.system("kill -9 %d"%taosdPid)
+ break
+ else:
+ tdLog.info( "wait start taosd ,times: %d "%i)
+ sleep
+ i+= 1
+ else :
+ tdLog.exit("taosd %s is not running "%startAction)
+
+ def taosdCommandStop(self,startAction,taosdCmdRun):
+ processName="taosd"
+ taosdCmd = taosdCmdRun + startAction
+ tdLog.printNoPrefix("%s"%taosdCmd)
+ os.system(f"nohup {taosdCmd} & ")
+ self.checkAndstopPro(processName,startAction)
+
+ def taosdCommandExe(self,startAction,taosdCmdRun):
+ taosdCmd = taosdCmdRun + startAction
+ tdLog.printNoPrefix("%s"%taosdCmd)
+ os.system(f"{taosdCmd}")
+
+ def run(self):
+ tdSql.prepare()
+ # time.sleep(2)
+ tdSql.query("create user testpy pass 'testpy'")
+
+ #hostname = socket.gethostname()
+ #tdLog.info ("hostname: %s" % hostname)
+
+ buildPath = self.getBuildPath()
+ if (buildPath == ""):
+ tdLog.exit("taosd not found!")
+ else:
+ tdLog.info("taosd found in %s" % buildPath)
+ cfgPath = buildPath + "/../sim/psim/cfg"
+ taosdCfgPath = buildPath + "/../sim/dnode1/cfg"
+
+
+ taosdCmdRun= buildPath + '/build/bin/taosd'
+ tdLog.info("cfgPath: %s" % cfgPath)
+ # keyDict['h'] = self.hostname
+ # keyDict['c'] = cfgPath
+ # keyDict['P'] = self.serverPort
+ tdDnodes.stop(1)
+
+ startAction = " --help"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandExe(startAction,taosdCmdRun)
+
+ startAction = " -h"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandExe(startAction,taosdCmdRun)
+
+ startAction=" -a jsonFile:./taosdCaseTmp.json"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ os.system("echo \'{\"queryPolicy\":\"3\"}\' > taosdCaseTmp.json")
+ self.taosdCommandStop(startAction,taosdCmdRun)
+
+ startAction = " -a jsonFile:./taosdCaseTmp.json -C "
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandExe(startAction,taosdCmdRun)
+
+ os.system("rm -rf taosdCaseTmp.json")
+
+ startAction = " -c " + taosdCfgPath
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandStop(startAction,taosdCmdRun)
+
+ startAction = " -s"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandExe(startAction,taosdCmdRun)
+
+ startAction = " -e TAOS_QUERY_POLICY=2 "
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandStop(startAction,taosdCmdRun)
+
+
+ startAction=" -E taosdCaseTmp/.env"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ os.system(" mkdir -p taosdCaseTmp/.env ")
+ os.system("echo \'TAOS_QUERY_POLICY=3\' > taosdCaseTmp/.env ")
+ self.taosdCommandStop(startAction,taosdCmdRun)
+ os.system(" rm -rf taosdCaseTmp/.env ")
+
+ startAction = " -V"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandExe(startAction,taosdCmdRun)
+
+ startAction = " -k"
+ tdLog.printNoPrefix("================================ parameter: %s"%startAction)
+ self.taosdCommandExe(startAction,taosdCmdRun)
+
+ def stop(self):
+ tdSql.close()
+ tdLog.success(f"{__file__} successfully executed")
+
+tdCases.addLinux(__file__, TDTestCase())
+tdCases.addWindows(__file__, TDTestCase())
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py
index 050c10d093bee844a1f0c945cc86e8dfd25cb019..8d07dc6b38b4a6c72f98849408388fb1fd3d4afc 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_createDb_replica1.py
@@ -61,7 +61,7 @@ class TDTestCase:
# only for 1 mnode
mnode_name = k
- if v[2] =='leader':
+ if v[2] in ['leader', 'leader*']:
is_leader=True
if count==1 and is_leader:
@@ -109,12 +109,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader', 'leader*', 'follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py
index 1e1f45d65ef1bd6a7ef02ccfe0f5b496e130293c..470278cd8e5a0d778e4a268bbee60086db2dd6d5 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas.py
@@ -115,12 +115,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py
index ca12dd6c9d8d88e9fa2747f7ce5e6c88e51ba66b..a5ce8171c76cf17ceac5df3258544ed4a9ffde71 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica1_insertdatas_querys.py
@@ -116,12 +116,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py
index 2d3e5e31789c0333134b9bf2858a5ae91f565fe8..60e3167304205643ff2981db8dd687401f1b220d 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas.py
@@ -115,12 +115,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py
index c8fa8ee4358503ffec00b11db37f28d8098564e4..9d96ab1e9ed6b13ce948dcd8431183e7907bb9b1 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys.py
@@ -116,12 +116,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py
index 447da77db3ad9c603f965e853dbde617119ab07a..8e7ac388fb51cd101b9edf112c049664cb9d07b5 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_all_vnode.py
@@ -119,12 +119,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py
index 6175f4e7cc80871a52d61f17a26de9c1e644c522..39bd0133cfa2f369e880dc66d3d91e9caacac563 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_follower.py
@@ -118,12 +118,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py
index 27405774ccb4aaeadb9b60a5b0a7682689f7346f..6d4a9172f72de350181b14e2cfd843e75dc97931 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_querys_loop_restart_leader.py
@@ -118,12 +118,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py
index 1dc364c2fd22e7360530facdbe49ce5c2f88206f..90358069aaab0c38009392c48d4b4e4e7fb0b722 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_sync.py
@@ -124,12 +124,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py
index 3873040d208fe7f3c8f82a4772a8df901c7d4416..55a2318817b09b9bb74360cc3dfda2a0a21a50b5 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync.py
@@ -124,12 +124,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py
index 188b0030f26a8970e0d8aaf6060221ea0c038c2f..f5e4ea0663ba705a76400e85a9e47f7f49583ed0 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_follower_unsync_force_stop.py
@@ -124,12 +124,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py
index 5ba6c6ab8da60118bf938fac6b836452f2f76061..4ec558655fa9895fc69cb70619f51edb4269628d 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_insertdatas_stop_leader_forece_stop.py
@@ -207,12 +207,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py
index 0a4162bd99c1737032d708fdef8962c5d388313c..0a1c4e1183a49c16e920e74bd3ba1d6b0613559e 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_mnode3_insertdatas_querys.py
@@ -116,12 +116,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py
index 8a6412dfcc3ef7c637dec3d4c35777296ba701a9..bd7c05b03cde77bd97d114bfe919ed0b05246535 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups.py
@@ -115,12 +115,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py
index 5475d1cc37b12d37aed61797c52387a82f1ae00f..00f20abe846ff4fc800a8afe1663943bddf99c0a 100644
--- a/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py
+++ b/tests/system-test/6-cluster/vnode/4dnode1mnode_basic_replica3_vgroups_stopOne.py
@@ -118,12 +118,12 @@ class TDTestCase:
vgroup_id = vgroup_info[0]
tmp_list = []
for role in vgroup_info[3:-4]:
- if role in ['leader','follower']:
+ if role in ['leader','leader*','follower']:
tmp_list.append(role)
vgroups_infos[vgroup_id]=tmp_list
for k , v in vgroups_infos.items():
- if len(v) ==1 and v[0]=="leader":
+ if len(v) ==1 and v[0] in ['leader', 'leader*']:
tdLog.notice(" === create database replica only 1 role leader check success of vgroup_id {} ======".format(k))
else:
tdLog.exit(" === create database replica only 1 role leader check fail of vgroup_id {} ======".format(k))
diff --git a/tests/system-test/7-tmq/tmqAutoCreateTbl.py b/tests/system-test/7-tmq/tmqAutoCreateTbl.py
index 587472ed82052de67678529bf5cefed6921597f2..ce2cad4b148a22d15dbc831ff5824f9ed66d651e 100644
--- a/tests/system-test/7-tmq/tmqAutoCreateTbl.py
+++ b/tests/system-test/7-tmq/tmqAutoCreateTbl.py
@@ -160,7 +160,7 @@ class TDTestCase:
'rowsPerTbl': 1000,
'batchNum': 1000,
'startTs': 1640966400000, # 2022-01-01 00:00:00.000
- 'pollDelay': 5,
+ 'pollDelay': 20,
'showMsg': 1,
'showRow': 1,
'snapshot': 0}
diff --git a/tests/system-test/fulltest.sh b/tests/system-test/fulltest.sh
index 4c0ef5a52731975a39b576cce5918ab7a97bf9e4..39adfc9d530fdc7447135329aa033ad0e3869bf0 100755
--- a/tests/system-test/fulltest.sh
+++ b/tests/system-test/fulltest.sh
@@ -248,7 +248,7 @@ python3 ./test.py -f 6-cluster/5dnode3mnodeRestartDnodeInsertDataAsync.py -N 5 -
python3 ./test.py -f 6-cluster/5dnode3mnodeAdd1Ddnoe.py -N 6 -M 3 -C 5
# BUG python3 ./test.py -f 6-cluster/5dnode3mnodeStopInsert.py
-# python3 ./test.py -f 6-cluster/5dnode3mnodeDrop.py -N 5
+python3 ./test.py -f 6-cluster/5dnode3mnodeDrop.py -N 5
python3 test.py -f 6-cluster/5dnode3mnodeStopConnect.py -N 5 -M 3
python3 ./test.py -f 6-cluster/5dnode3mnodeRecreateMnode.py -N 5 -M 3
diff --git a/tools/shell/src/shellAuto.c b/tools/shell/src/shellAuto.c
index 46eaf6cff1a7d070a88ae4fa1dc67cb0512de75a..8d980ba6536f4d168fbc5d1be4e54a6e60c421f8 100644
--- a/tools/shell/src/shellAuto.c
+++ b/tools/shell/src/shellAuto.c
@@ -562,23 +562,15 @@ void parseCommand(SWords* command, bool pattern) {
// free SShellCmd
void freeCommand(SWords* command) {
- SWord* word = command->head;
- if (word == NULL) {
- return;
- }
-
+ SWord* item = command->head;
// loop
- while (word->next) {
- SWord* tmp = word;
- word = word->next;
+ while (item) {
+ SWord* tmp = item;
+ item = item->next;
// if malloc need free
if (tmp->free && tmp->word) taosMemoryFree(tmp->word);
taosMemoryFree(tmp);
}
-
- // if malloc need free
- if (word->free && word->word) taosMemoryFree(word->word);
- taosMemoryFree(word);
}
void GenerateVarType(int type, char** p, int count) {
@@ -1204,11 +1196,11 @@ bool nextMatchCommand(TAOS* con, SShellCmd* cmd, SWords* firstMatch) {
#endif
// free
+ freeCommand(input);
if (input->source) {
taosMemoryFree(input->source);
input->source = NULL;
}
- freeCommand(input);
taosMemoryFree(input);
return true;
@@ -1377,7 +1369,7 @@ bool appendAfterSelect(TAOS* con, SShellCmd* cmd, char* sql, int32_t len) {
bool ret = false;
if (from == NULL) {
bool fieldEnd = fieldsInputEnd(p);
- // cheeck fields input end then insert from keyword
+ // check fields input end then insert from keyword
if (fieldEnd && p[len - 1] == ' ') {
shellInsertChar(cmd, "from", 4);
taosMemoryFree(p);
diff --git a/tools/shell/src/shellCommand.c b/tools/shell/src/shellCommand.c
index 0b26d685fdcd4ab6bf08683494d2bf7ca57858d1..047aeb5b959784672204dd52007de7e290834166 100644
--- a/tools/shell/src/shellCommand.c
+++ b/tools/shell/src/shellCommand.c
@@ -104,8 +104,10 @@ void shellInsertChar(SShellCmd *cmd, char *c, int32_t size) {
for (int i = 0; i < size; i++) {
taosMbToWchar(&wc, c + i, size);
cmd->screenOffset += taosWcharWidth(wc);
- cmd->endOffset += taosWcharWidth(wc);
- }
+ cmd->endOffset += taosWcharWidth(wc);
+ }
+ // set string end
+ cmd->command[cmd->commandSize] = 0;
#ifdef WINDOWS
#else
shellShowOnScreen(cmd);
@@ -126,6 +128,8 @@ void shellBackspaceChar(SShellCmd *cmd) {
cmd->cursorOffset -= size;
cmd->screenOffset -= width;
cmd->endOffset -= width;
+ // set string end
+ cmd->command[cmd->commandSize] = 0;
shellShowOnScreen(cmd);
}
}
@@ -139,6 +143,8 @@ void shellClearLineBefore(SShellCmd *cmd) {
cmd->cursorOffset = 0;
cmd->screenOffset = 0;
cmd->endOffset = cmd->commandSize;
+ // set string end
+ cmd->command[cmd->commandSize] = 0;
shellShowOnScreen(cmd);
}
@@ -163,6 +169,8 @@ void shellDeleteChar(SShellCmd *cmd) {
cmd->commandSize - cmd->cursorOffset - size);
cmd->commandSize -= size;
cmd->endOffset -= width;
+ // set string end
+ cmd->command[cmd->commandSize] = 0;
shellShowOnScreen(cmd);
}
}
diff --git a/tools/shell/src/shellTire.c b/tools/shell/src/shellTire.c
index b3102811197adc7044bf9d4682b05c795b9632d6..06285709045fb9f7e60f4f8bde927a1f86b0d81a 100644
--- a/tools/shell/src/shellTire.c
+++ b/tools/shell/src/shellTire.c
@@ -275,7 +275,6 @@ void matchPrefixFromList(STire* tire, char* prefix, SMatch* match) {
// match prefix words, if match is not NULL , put all item to match and return match
void matchPrefixFromTree(STire* tire, char* prefix, SMatch* match) {
- SMatch* root = match;
int m = 0;
STireNode* c = 0;
int len = strlen(prefix);
@@ -299,47 +298,35 @@ void matchPrefixFromTree(STire* tire, char* prefix, SMatch* match) {
// previous items already matched
if (i == len - 1) {
- // malloc match if not pass by param match
- if (root == NULL) {
- root = (SMatch*)taosMemoryMalloc(sizeof(SMatch));
- memset(root, 0, sizeof(SMatch));
- strcpy(root->pre, prefix);
- }
-
// prefix is match to end char
- if (c->d) enumAllWords(c->d, prefix, root);
+ if (c->d) enumAllWords(c->d, prefix, match);
} else {
// move to next node continue match
if (c->d == NULL) break;
nodes = c->d;
}
}
-
- taosMemoryFree(root);
}
SMatch* matchPrefix(STire* tire, char* prefix, SMatch* match) {
- if (match == NULL) {
- match = (SMatch*)taosMemoryMalloc(sizeof(SMatch));
- memset(match, 0, sizeof(SMatch));
+ SMatch* rMatch = match; // define return match
+ if (rMatch == NULL) {
+ rMatch = (SMatch*)taosMemoryMalloc(sizeof(SMatch));
+ memset(rMatch, 0, sizeof(SMatch));
}
switch (tire->type) {
case TIRE_TREE:
- matchPrefixFromTree(tire, prefix, match);
+ matchPrefixFromTree(tire, prefix, rMatch);
+ break;
case TIRE_LIST:
- matchPrefixFromList(tire, prefix, match);
+ matchPrefixFromList(tire, prefix, rMatch);
+ break;
default:
break;
}
- // return if need
- if (match->count == 0) {
- freeMatch(match);
- match = NULL;
- }
-
- return match;
+ return rMatch;
}
// get all items from tires tree
@@ -388,8 +375,10 @@ SMatch* enumAll(STire* tire) {
switch (tire->type) {
case TIRE_TREE:
enumFromTree(tire, match);
+ break;
case TIRE_LIST:
enumFromList(tire, match);
+ break;
default:
break;
}
diff --git a/utils/test/c/createTable.c b/utils/test/c/createTable.c
index 783ed85adce6dbc282b25987b2864d3903a326e2..9a39fdd9752dd9343040bb9b3e7bb6ae9dc3ab79 100644
--- a/utils/test/c/createTable.c
+++ b/utils/test/c/createTable.c
@@ -330,11 +330,11 @@ void parseArgument(int32_t argc, char *argv[]) {
printHelp();
exit(0);
} else if (strcmp(argv[i], "-d") == 0) {
- strcpy(dbName, argv[++i]);
+ tstrncpy(dbName, argv[++i], sizeof(dbName));
} else if (strcmp(argv[i], "-c") == 0) {
- strcpy(configDir, argv[++i]);
+ tstrncpy(configDir, argv[++i], PATH_MAX);
} else if (strcmp(argv[i], "-s") == 0) {
- strcpy(stbName, argv[++i]);
+ tstrncpy(stbName, argv[++i], sizeof(stbName));
} else if (strcmp(argv[i], "-t") == 0) {
numOfThreads = atoi(argv[++i]);
} else if (strcmp(argv[i], "-n") == 0) {
diff --git a/utils/test/c/sml_test.c b/utils/test/c/sml_test.c
index b6d8d75ba01c8930787f8fad434348ce9ee571d1..ab520e66387f9b7644d9dd64aeb1ae811d97fcf5 100644
--- a/utils/test/c/sml_test.c
+++ b/utils/test/c/sml_test.c
@@ -63,6 +63,7 @@ int smlProcess_influx_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
return code;
}
@@ -86,6 +87,8 @@ int smlProcess_telnet_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -99,32 +102,15 @@ int smlProcess_json1_Test() {
taos_free_result(pRes);
const char *sql[] = {
- "["
- " {"
- " \"metric\": \"sys.cpu.nice\","
- " \"timestamp\": 0,"
- " \"value\": 18,"
- " \"tags\": {"
- " \"host\": \"web01\","
- " \"id\": \"t1\","
- " \"dc\": \"lga\""
- " }"
- " },"
- " {"
- " \"metric\": \"sys.cpu.nice\","
- " \"timestamp\": 1662344042,"
- " \"value\": 9,"
- " \"tags\": {"
- " \"host\": \"web02\","
- " \"dc\": \"lga\""
- " }"
- " }"
- "]",};
+ "[{\"metric\":\"sys.cpu.nice\",\"timestamp\":0,\"value\":18,\"tags\":{\"host\":\"web01\",\"id\":\"t1\",\"dc\":\"lga\"}},{\"metric\":\"sys.cpu.nice\",\"timestamp\":1662344042,\"value\":9,\"tags\":{\"host\":\"web02\",\"dc\":\"lga\"}}]"
+ };
pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_JSON_PROTOCOL,
TSDB_SML_TIMESTAMP_NANO_SECONDS);
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -138,33 +124,15 @@ int smlProcess_json2_Test() {
taos_free_result(pRes);
const char *sql[] = {
- "{"
- " \"metric\": \"meter_current0\","
- " \"timestamp\": {"
- " \"value\" : 1662344042,"
- " \"type\" : \"s\""
- " },"
- " \"value\": {"
- " \"value\" : 10.3,"
- " \"type\" : \"i64\""
- " },"
- " \"tags\": {"
- " \"groupid\": { "
- " \"value\" : 2,"
- " \"type\" : \"bigint\""
- " },"
- " \"location\": { "
- " \"value\" : \"北京\","
- " \"type\" : \"binary\""
- " },"
- " \"id\": \"d1001\""
- " }"
- "}",};
+ "{\"metric\":\"meter_current0\",\"timestamp\":{\"value\":1662344042,\"type\":\"s\"},\"value\":{\"value\":10.3,\"type\":\"i64\"},\"tags\":{\"groupid\":{\"value\":2,\"type\":\"bigint\"},\"location\":{\"value\":\"北京\",\"type\":\"binary\"},\"id\":\"d1001\"}}"
+ };
pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_JSON_PROTOCOL,
TSDB_SML_TIMESTAMP_NANO_SECONDS);
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -178,61 +146,14 @@ int smlProcess_json3_Test() {
taos_free_result(pRes);
const char *sql[] = {
- "{"
- " \"metric\": \"meter_current1\","
- " \"timestamp\": {"
- " \"value\" : 1662344042,"
- " \"type\" : \"s\""
- " },"
- " \"value\": {"
- " \"value\" : 10.3,"
- " \"type\" : \"i64\""
- " },"
- " \"tags\": {"
- " \"t1\": { "
- " \"value\" : 2,"
- " \"type\" : \"bigint\""
- " },"
- " \"t2\": { "
- " \"value\" : 2,"
- " \"type\" : \"int\""
- " },"
- " \"t3\": { "
- " \"value\" : 2,"
- " \"type\" : \"i16\""
- " },"
- " \"t4\": { "
- " \"value\" : 2,"
- " \"type\" : \"i8\""
- " },"
- " \"t5\": { "
- " \"value\" : 2,"
- " \"type\" : \"f32\""
- " },"
- " \"t6\": { "
- " \"value\" : 2,"
- " \"type\" : \"double\""
- " },"
- " \"t7\": { "
- " \"value\" : \"8323\","
- " \"type\" : \"binary\""
- " },"
- " \"t8\": { "
- " \"value\" : \"北京\","
- " \"type\" : \"nchar\""
- " },"
- " \"t9\": { "
- " \"value\" : true,"
- " \"type\" : \"bool\""
- " },"
- " \"id\": \"d1001\""
- " }"
- "}",};
+ "{\"metric\":\"meter_current1\",\"timestamp\":{\"value\":1662344042,\"type\":\"s\"},\"value\":{\"value\":10.3,\"type\":\"i64\"},\"tags\":{\"t1\":{\"value\":2,\"type\":\"bigint\"},\"t2\":{\"value\":2,\"type\":\"int\"},\"t3\":{\"value\":2,\"type\":\"i16\"},\"t4\":{\"value\":2,\"type\":\"i8\"},\"t5\":{\"value\":2,\"type\":\"f32\"},\"t6\":{\"value\":2,\"type\":\"double\"},\"t7\":{\"value\":\"8323\",\"type\":\"binary\"},\"t8\":{\"value\":\"北京\",\"type\":\"nchar\"},\"t9\":{\"value\":true,\"type\":\"bool\"},\"id\":\"d1001\"}}"};
pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_JSON_PROTOCOL,
TSDB_SML_TIMESTAMP_NANO_SECONDS);
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -246,52 +167,15 @@ int smlProcess_json4_Test() {
taos_free_result(pRes);
const char *sql[] = {
- "{"
- " \"metric\": \"meter_current2\","
- " \"timestamp\": {"
- " \"value\" : 1662344042000,"
- " \"type\" : \"ms\""
- " },"
- " \"value\": \"ni\","
- " \"tags\": {"
- " \"t1\": { "
- " \"value\" : 20,"
- " \"type\" : \"i64\""
- " },"
- " \"t2\": { "
- " \"value\" : 25,"
- " \"type\" : \"i32\""
- " },"
- " \"t3\": { "
- " \"value\" : 2,"
- " \"type\" : \"smallint\""
- " },"
- " \"t4\": { "
- " \"value\" : 2,"
- " \"type\" : \"tinyint\""
- " },"
- " \"t5\": { "
- " \"value\" : 2,"
- " \"type\" : \"float\""
- " },"
- " \"t6\": { "
- " \"value\" : 0.2,"
- " \"type\" : \"f64\""
- " },"
- " \"t7\": \"nsj\","
- " \"t8\": { "
- " \"value\" : \"北京\","
- " \"type\" : \"nchar\""
- " },"
- " \"t9\": false,"
- " \"id\": \"d1001\""
- " }"
- "}",};
+ "{\"metric\":\"meter_current2\",\"timestamp\":{\"value\":1662344042000,\"type\":\"ms\"},\"value\":\"ni\",\"tags\":{\"t1\":{\"value\":20,\"type\":\"i64\"},\"t2\":{\"value\":25,\"type\":\"i32\"},\"t3\":{\"value\":2,\"type\":\"smallint\"},\"t4\":{\"value\":2,\"type\":\"tinyint\"},\"t5\":{\"value\":2,\"type\":\"float\"},\"t6\":{\"value\":0.2,\"type\":\"f64\"},\"t7\":\"nsj\",\"t8\":{\"value\":\"北京\",\"type\":\"nchar\"},\"t9\":false,\"id\":\"d1001\"}}"
+ };
pRes = taos_schemaless_insert(taos, (char **)sql, sizeof(sql) / sizeof(sql[0]), TSDB_SML_JSON_PROTOCOL,
TSDB_SML_TIMESTAMP_NANO_SECONDS);
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -313,6 +197,8 @@ int sml_TD15662_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -333,6 +219,8 @@ int sml_TD15742_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -362,6 +250,8 @@ int sml_16384_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -781,6 +671,8 @@ int sml_oom_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -825,6 +717,8 @@ int sml_16368_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -862,6 +756,8 @@ int sml_dup_time_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -1068,6 +964,8 @@ int sml_16960_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
int code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
+
return code;
}
@@ -1097,6 +995,7 @@ int sml_add_tag_col_Test() {
printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
code = taos_errno(pRes);
taos_free_result(pRes);
+ taos_close(taos);
return code;
}
@@ -1151,6 +1050,36 @@ int smlProcess_18784_Test() {
rowIndex++;
}
taos_free_result(pRes);
+ taos_close(taos);
+
+ return code;
+}
+
+int sml_19221_Test() {
+ TAOS *taos = taos_connect("localhost", "root", "taosdata", NULL, 0);
+
+ TAOS_RES *pRes = taos_query(taos, "create database if not exists sml_db schemaless 1");
+ taos_free_result(pRes);
+
+ const char *sql[] = {
+ "qelhxo,id=pnnqhsa,t0=t,t1=127i8 c11=L\"ncharColValue\",c0=t,c1=127i8 1626006833639000000\nqelhxo,id=pnnhsa,t0=t,t1=127i8 c11=L\"ncharColValue\",c0=t,c1=127i8 1626006833639000000\n#comment\nqelhxo,id=pnqhsa,t0=t,t1=127i8 c11=L\"ncharColValue\",c0=t,c1=127i8 1626006833639000000",
+ };
+
+ pRes = taos_query(taos, "use sml_db");
+ taos_free_result(pRes);
+
+ char* tmp = (char*)taosMemoryCalloc(1024, 1);
+ memcpy(tmp, sql[0], strlen(sql[0]));
+ *(char*)(tmp+44) = 0;
+ int32_t totalRows = 0;
+ pRes = taos_schemaless_insert_raw(taos, tmp, strlen(sql[0]), &totalRows, TSDB_SML_LINE_PROTOCOL, TSDB_SML_TIMESTAMP_NANO_SECONDS);
+
+ ASSERT(totalRows == 3);
+ printf("%s result:%s\n", __FUNCTION__, taos_errstr(pRes));
+ int code = taos_errno(pRes);
+ taos_free_result(pRes);
+ taos_close(taos);
+ taosMemoryFree(tmp);
return code;
}
@@ -1187,5 +1116,7 @@ int main(int argc, char *argv[]) {
ASSERT(!ret);
ret = smlProcess_18784_Test();
ASSERT(!ret);
+ ret = sml_19221_Test();
+ ASSERT(!ret);
return ret;
}
diff --git a/utils/test/c/tmqDemo.c b/utils/test/c/tmqDemo.c
index 784b45c92bcb2b1b8e30cfdd7d60b31f279e2e8d..d105b505793eae17068af9e9db02eff5071f5bd4 100644
--- a/utils/test/c/tmqDemo.c
+++ b/utils/test/c/tmqDemo.c
@@ -130,15 +130,15 @@ void parseArgument(int32_t argc, char* argv[]) {
printHelp();
exit(0);
} else if (strcmp(argv[i], "-d") == 0) {
- strcpy(g_stConfInfo.dbName, argv[++i]);
+ tstrncpy(g_stConfInfo.dbName, argv[++i], sizeof(g_stConfInfo.dbName));
} else if (strcmp(argv[i], "-c") == 0) {
- strcpy(configDir, argv[++i]);
+ tstrncpy(configDir, argv[++i], PATH_MAX);
} else if (strcmp(argv[i], "-s") == 0) {
- strcpy(g_stConfInfo.stbName, argv[++i]);
+ tstrncpy(g_stConfInfo.stbName, argv[++i], sizeof(g_stConfInfo.stbName));
} else if (strcmp(argv[i], "-w") == 0) {
- strcpy(g_stConfInfo.vnodeWalPath, argv[++i]);
+ tstrncpy(g_stConfInfo.vnodeWalPath, argv[++i], sizeof(g_stConfInfo.vnodeWalPath));
} else if (strcmp(argv[i], "-f") == 0) {
- strcpy(g_stConfInfo.resultFileName, argv[++i]);
+ tstrncpy(g_stConfInfo.resultFileName, argv[++i], sizeof(g_stConfInfo.resultFileName));
} else if (strcmp(argv[i], "-t") == 0) {
g_stConfInfo.numOfThreads = atoi(argv[++i]);
} else if (strcmp(argv[i], "-n") == 0) {
diff --git a/utils/test/c/tmqSim.c b/utils/test/c/tmqSim.c
index d36fe0855aa92fa4e052526d558faf12bf4e78c7..7452a67fedea038bbcdc2cf7abf417f6b9329cb7 100644
--- a/utils/test/c/tmqSim.c
+++ b/utils/test/c/tmqSim.c
@@ -949,7 +949,7 @@ void parseConsumeInfo() {
token = strtok(g_stConfInfo.stThreads[i].topicString, delim);
while (token != NULL) {
// printf("%s\n", token );
- strcpy(g_stConfInfo.stThreads[i].topics[g_stConfInfo.stThreads[i].numOfTopic], token);
+ tstrncpy(g_stConfInfo.stThreads[i].topics[g_stConfInfo.stThreads[i].numOfTopic], token, sizeof(g_stConfInfo.stThreads[i].topics[g_stConfInfo.stThreads[i].numOfTopic]));
ltrim(g_stConfInfo.stThreads[i].topics[g_stConfInfo.stThreads[i].numOfTopic]);
// printf("%s\n", g_stConfInfo.topics[g_stConfInfo.numOfTopic]);
g_stConfInfo.stThreads[i].numOfTopic++;
@@ -1262,7 +1262,7 @@ void* ombProduceThreadFunc(void* param) {
printf("Produce Info: totalSendLoopTimes: %d, batchPerTblTimes: %d, producerRate: %d\n", totalSendLoopTimes, batchPerTblTimes, pInfo->producerRate);
- char ctbName[64] = {0};
+ char ctbName[128] = {0};
sprintf(ctbName, "%s.ctb%d", g_stConfInfo.dbName, pInfo->consumerId);
int64_t lastPrintTime = taosGetTimestampUs();
diff --git a/utils/tsim/inc/simInt.h b/utils/tsim/inc/simInt.h
index f9e96fc67b20eee8b05619475c3d577cfa5b659c..f512b119b4299c9146a3a9a915a2359ca52fc4c4 100644
--- a/utils/tsim/inc/simInt.h
+++ b/utils/tsim/inc/simInt.h
@@ -19,20 +19,20 @@
#include "os.h"
#include "cJSON.h"
-#include "tconfig.h"
#include "taos.h"
#include "taoserror.h"
+#include "tconfig.h"
+#include "tglobal.h"
#include "tidpool.h"
#include "tlog.h"
#include "ttimer.h"
#include "ttypes.h"
#include "tutil.h"
-#include "tglobal.h"
#define MAX_MAIN_SCRIPT_NUM 10
#define MAX_BACKGROUND_SCRIPT_NUM 10
#define MAX_FILE_NAME_LEN 256
-#define MAX_ERROR_LEN 1024
+#define MAX_ERROR_LEN 4096
#define MAX_QUERY_VALUE_LEN 1024
#define MAX_QUERY_COL_NUM 100
#define MAX_QUERY_ROW_NUM 100
@@ -55,12 +55,42 @@
#define FAILED_POSTFIX ""
#endif
-#define simFatal(...) { if (simDebugFlag & DEBUG_FATAL) { taosPrintLog("SIM FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }}
-#define simError(...) { if (simDebugFlag & DEBUG_ERROR) { taosPrintLog("SIM ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }}
-#define simWarn(...) { if (simDebugFlag & DEBUG_WARN) { taosPrintLog("SIM WARN ", DEBUG_WARN, 255, __VA_ARGS__); }}
-#define simInfo(...) { if (simDebugFlag & DEBUG_INFO) { taosPrintLog("SIM ", DEBUG_INFO, 255, __VA_ARGS__); }}
-#define simDebug(...) { if (simDebugFlag & DEBUG_DEBUG) { taosPrintLog("SIM ", DEBUG_DEBUG, simDebugFlag, __VA_ARGS__); }}
-#define simTrace(...) { if (simDebugFlag & DEBUG_TRACE) { taosPrintLog("SIM ", DEBUG_TRACE, simDebugFlag, __VA_ARGS__); }}
+#define simFatal(...) \
+ { \
+ if (simDebugFlag & DEBUG_FATAL) { \
+ taosPrintLog("SIM FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); \
+ } \
+ }
+#define simError(...) \
+ { \
+ if (simDebugFlag & DEBUG_ERROR) { \
+ taosPrintLog("SIM ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); \
+ } \
+ }
+#define simWarn(...) \
+ { \
+ if (simDebugFlag & DEBUG_WARN) { \
+ taosPrintLog("SIM WARN ", DEBUG_WARN, 255, __VA_ARGS__); \
+ } \
+ }
+#define simInfo(...) \
+ { \
+ if (simDebugFlag & DEBUG_INFO) { \
+ taosPrintLog("SIM ", DEBUG_INFO, 255, __VA_ARGS__); \
+ } \
+ }
+#define simDebug(...) \
+ { \
+ if (simDebugFlag & DEBUG_DEBUG) { \
+ taosPrintLog("SIM ", DEBUG_DEBUG, simDebugFlag, __VA_ARGS__); \
+ } \
+ }
+#define simTrace(...) \
+ { \
+ if (simDebugFlag & DEBUG_TRACE) { \
+ taosPrintLog("SIM ", DEBUG_TRACE, simDebugFlag, __VA_ARGS__); \
+ } \
+ }
enum { SIM_SCRIPT_TYPE_MAIN, SIM_SCRIPT_TYPE_BACKGROUND };
@@ -143,7 +173,7 @@ typedef struct _script_t {
char *optionBuffer;
SCmdLine *lines; // command list
SVariable variables[MAX_VAR_LEN];
- TdThread bgPid;
+ TdThread bgPid;
char auth[128];
struct _script_t *bgScripts[MAX_BACKGROUND_SCRIPT_NUM];
} SScript;
@@ -155,7 +185,6 @@ extern int32_t simScriptSucced;
extern int32_t simDebugFlag;
extern char simScriptDir[];
extern bool abortExecution;
-extern bool useMultiProcess;
extern bool useValgrind;
SScript *simParseScript(char *fileName);
@@ -183,4 +212,4 @@ bool simExecuteLineInsertCmd(SScript *script, char *option);
bool simExecuteLineInsertErrorCmd(SScript *script, char *option);
void simVisuallizeOption(SScript *script, char *src, char *dst);
-#endif /*_TD_SIM_INT_H_*/
\ No newline at end of file
+#endif /*_TD_SIM_INT_H_*/
diff --git a/utils/tsim/src/simExe.c b/utils/tsim/src/simExe.c
index 4fe5fdf67257365461652522f1b621ece41b5356..258c61155769be2d3aef314ee1602a4ba1b8af3d 100644
--- a/utils/tsim/src/simExe.c
+++ b/utils/tsim/src/simExe.c
@@ -21,31 +21,18 @@ void simLogSql(char *sql, bool useSharp) {
char filename[256];
sprintf(filename, "%s/sim.sql", simScriptDir);
if (pFile == NULL) {
- // fp = fopen(filename, "w");
pFile = taosOpenFile(filename, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC | TD_FILE_STREAM);
- if (pFile == NULL) {
- fprintf(stderr, "ERROR: failed to open file: %s\n", filename);
- return;
- }
- }
- if (useSharp) {
- taosFprintfFile(pFile, "# %s;\n", sql);
- } else {
- taosFprintfFile(pFile, "%s;\n", sql);
}
- taosFsyncFile(pFile);
-}
+ if (pFile != NULL) {
+ if (useSharp) {
+ taosFprintfFile(pFile, "# %s;\n", sql);
+ } else {
+ taosFprintfFile(pFile, "%s;\n", sql);
+ }
-char *simParseArbitratorName(char *varName) {
- static char hostName[140];
-#ifdef WINDOWS
- taosGetFqdn(hostName);
- sprintf(&hostName[strlen(hostName)], ":%d", 8000);
-#else
- sprintf(hostName, "%s:%d", "localhost", 8000);
-#endif
- return hostName;
+ taosFsyncFile(pFile);
+ }
}
char *simParseHostName(char *varName) {
@@ -63,18 +50,18 @@ char *simParseHostName(char *varName) {
}
static void simFindFirstNum(const char *begin, int32_t beginLen, int32_t *num) {
- if (beginLen <= 5) {
- *num = 0;
- } else {
+ *num = 0;
+
+ if (beginLen > 5) {
*num = atoi(begin + 5);
}
}
static void simFindSecondNum(const char *begin, int32_t beginLen, int32_t *num) {
+ *num = 0;
+
const char *number = strstr(begin, "][");
- if (number == NULL) {
- *num = 0;
- } else {
+ if (number != NULL) {
*num = atoi(number + 2);
}
}
@@ -89,10 +76,10 @@ static void simFindFirstKeyVal(const char *begin, int32_t beginLen, char *key, i
}
static void simFindSecondKeyNum(const char *begin, int32_t beginLen, int32_t *num) {
+ *num = 0;
+
const char *number = strstr(begin, ")[");
- if (number == NULL) {
- *num = 0;
- } else {
+ if (number != NULL) {
*num = atoi(number + 2);
}
}
@@ -102,10 +89,6 @@ char *simGetVariable(SScript *script, char *varName, int32_t varLen) {
return simParseHostName(varName);
}
- if (strncmp(varName, "arbitrator", 10) == 0) {
- return simParseArbitratorName(varName);
- }
-
if (strncmp(varName, "error", varLen) == 0) return script->error;
if (strncmp(varName, "rows", varLen) == 0) return script->rows;
@@ -149,9 +132,7 @@ char *simGetVariable(SScript *script, char *varName, int32_t varLen) {
} else if (varName[5] == '_') {
// data2_db
int32_t col = varName[4] - '0';
- if (col < 0 || col >= MAX_QUERY_COL_NUM) {
- return "null";
- }
+ col = col % MAX_QUERY_COL_NUM;
char *keyName;
int32_t keyLen;
@@ -167,9 +148,7 @@ char *simGetVariable(SScript *script, char *varName, int32_t varLen) {
} else if (varName[6] == '_') {
// data21_db
int32_t col = (varName[4] - '0') * 10 + (varName[5] - '0');
- if (col < 0 || col >= MAX_QUERY_COL_NUM) {
- return "null";
- }
+ col = col % MAX_QUERY_COL_NUM;
char *keyName;
int32_t keyLen;
@@ -181,17 +160,12 @@ char *simGetVariable(SScript *script, char *varName, int32_t varLen) {
return script->data[i][col];
}
}
- return "null";
} else {
// $data00
int32_t row = varName[4] - '0';
int32_t col = varName[5] - '0';
- if (row < 0 || row >= MAX_QUERY_ROW_NUM) {
- return "null";
- }
- if (col < 0 || col >= MAX_QUERY_COL_NUM) {
- return "null";
- }
+ row = row % MAX_QUERY_ROW_NUM;
+ col = col % MAX_QUERY_COL_NUM;
simDebug("script:%s, data[%d][%d]=%s", script->fileName, row, col, script->data[row][col]);
return script->data[row][col];
@@ -249,9 +223,9 @@ int32_t simExecuteExpression(SScript *script, char *exp) {
rest = paGetToken(rest, &op2, &op2Len);
if (var1[0] == '$')
- strcpy(t0, simGetVariable(script, var1 + 1, var1Len - 1));
+ tstrncpy(t0, simGetVariable(script, var1 + 1, var1Len - 1), sizeof(t0));
else {
- memcpy(t0, var1, var1Len);
+ tstrncpy(t0, var1, var1Len);
t0[var1Len] = 0;
}
@@ -288,7 +262,7 @@ int32_t simExecuteExpression(SScript *script, char *exp) {
sprintf(t3, "%" PRId64, t1l / t2l);
}
} else if (op2[0] == '.') {
- sprintf(t3, "%s%s", t1, t2);
+ snprintf(t3, sizeof(t3), "%s%s", t1, t2);
}
} else {
tstrncpy(t3, t1, sizeof(t3));
@@ -438,10 +412,6 @@ bool simExecuteSystemCmd(SScript *script, char *option) {
simReplaceStr(buf, ".sh", ".bat");
#endif
- if (useMultiProcess) {
- simReplaceStr(buf, "deploy.sh", "deploy.sh -m");
- }
-
if (useValgrind) {
replaced = simReplaceStr(buf, "exec.sh", "exec.sh -v");
}
@@ -578,6 +548,8 @@ void simVisuallizeOption(SScript *script, char *src, char *dst) {
while (1) {
var = strchr(src, '$');
if (var == NULL) break;
+
+#if 0
if (var && ((var - src - 1) > 0) && *(var - 1) == '\\') {
srcLen = (int32_t)(var - src - 1);
memcpy(dst + dstLen, src, srcLen);
@@ -585,6 +557,7 @@ void simVisuallizeOption(SScript *script, char *src, char *dst) {
src = var;
break;
}
+#endif
srcLen = (int32_t)(var - src);
memcpy(dst + dstLen, src, srcLen);
@@ -657,11 +630,11 @@ bool simCreateTaosdConnect(SScript *script, char *rest) {
}
bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
- char timeStr[80] = {0};
- time_t tt;
- struct tm tp;
- SCmdLine *line = &script->lines[script->linePos];
- int32_t ret = -1;
+ char timeStr[80] = {0};
+ time_t tt;
+ struct tm tp;
+ SCmdLine *line = &script->lines[script->linePos];
+ int32_t ret = -1;
TAOS_RES *pSql = NULL;
@@ -705,17 +678,6 @@ bool simExecuteNativeSqlCommand(SScript *script, char *rest, bool isSlow) {
int32_t numOfRows = 0;
int32_t num_fields = taos_field_count(pSql);
if (num_fields != 0) {
- if (pSql == NULL) {
- simDebug("script:%s, taos:%p, %s failed, result is null", script->fileName, script->taos, rest);
- if (line->errorJump == SQL_JUMP_TRUE) {
- script->linePos = line->jump;
- return true;
- }
-
- sprintf(script->error, "lineNum:%d. result set null, sql:%s", line->lineNum, rest);
- return false;
- }
-
TAOS_ROW row;
while ((row = taos_fetch_row(pSql))) {
@@ -883,6 +845,7 @@ bool simExecuteSqlSlowCmd(SScript *script, char *rest) {
return simExecuteSqlImpCmd(script, rest, isSlow);
}
+#if 0
bool simExecuteRestfulCmd(SScript *script, char *rest) {
TdFilePtr pFile = NULL;
char filename[256];
@@ -924,6 +887,7 @@ bool simExecuteRestfulCmd(SScript *script, char *rest) {
return simExecuteSystemCmd(script, cmd);
}
+#endif
bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
char buf[3000];
@@ -940,30 +904,6 @@ bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
}
}
- if (strncmp(rest, "connect", 7) == 0) {
- if (!simCreateTaosdConnect(script, rest)) {
- return false;
- }
- script->linePos++;
- return true;
- }
-
- if (script->taos == NULL) {
- if (!simCreateTaosdConnect(script, "connect root")) {
- if (line->errorJump == SQL_JUMP_TRUE) {
- script->linePos = line->jump;
- return true;
- }
- return false;
- }
- }
-
- if (strncmp(rest, "close", 5) == 0) {
- simCloseTaosdConnect(script);
- script->linePos++;
- return true;
- }
-
TAOS_RES *pSql = taos_query(script->taos, rest);
int32_t ret = taos_errno(pSql);
taos_free_result(pSql);
@@ -981,6 +921,7 @@ bool simExecuteSqlErrorCmd(SScript *script, char *rest) {
return false;
}
+#if 0
bool simExecuteLineInsertCmd(SScript *script, char *rest) {
char buf[TSDB_MAX_BINARY_LEN] = {0};
@@ -1037,3 +978,4 @@ bool simExecuteLineInsertErrorCmd(SScript *script, char *rest) {
return true;
}
}
+#endif
diff --git a/utils/tsim/src/simMain.c b/utils/tsim/src/simMain.c
index e58a22cf682d1cbc5be9a32057caee25ef00c254..cd4a5117b2a5904b934775d4a24a23059714a1a7 100644
--- a/utils/tsim/src/simMain.c
+++ b/utils/tsim/src/simMain.c
@@ -18,7 +18,6 @@
bool simExecSuccess = false;
bool abortExecution = false;
-bool useMultiProcess = false;
bool useValgrind = false;
void simHandleSignal(int32_t signo, void *sigInfo, void *context) {
@@ -34,8 +33,6 @@ int32_t main(int32_t argc, char *argv[]) {
tstrncpy(configDir, argv[++i], 128);
} else if (strcmp(argv[i], "-f") == 0 && i < argc - 1) {
tstrncpy(scriptFile, argv[++i], MAX_FILE_NAME_LEN);
- } else if (strcmp(argv[i], "-m") == 0) {
- useMultiProcess = true;
} else if (strcmp(argv[i], "-v") == 0) {
useValgrind = true;
} else {
diff --git a/utils/tsim/src/simParse.c b/utils/tsim/src/simParse.c
index 14be10bc8ab38002dfabedd0e5bf1695bbce32b2..cdd918ac00745aa027f5d2d26adcdb605f703573 100644
--- a/utils/tsim/src/simParse.c
+++ b/utils/tsim/src/simParse.c
@@ -501,6 +501,7 @@ bool simParseEndwCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
return true;
}
+#if 0
bool simParseSwitchCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
char *token;
int32_t tokenLen;
@@ -647,6 +648,7 @@ bool simParseContinueCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
numOfLines++;
return true;
}
+#endif
bool simParsePrintCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
int32_t expLen;
@@ -721,12 +723,6 @@ bool simParseSqlSlowCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
return true;
}
-bool simParseRestfulCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
- simParseSqlCmd(rest, pCmd, lineNum);
- cmdLine[numOfLines - 1].cmdno = SIM_CMD_RESTFUL;
- return true;
-}
-
bool simParseSystemCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
int32_t expLen;
@@ -838,6 +834,7 @@ bool simParseRunBackCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
return true;
}
+#if 0
bool simParseLineInsertCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
int32_t expLen;
@@ -869,6 +866,7 @@ bool simParseLineInsertErrorCmd(char *rest, SCommand *pCmd, int32_t lineNum) {
numOfLines++;
return true;
}
+#endif
void simInitsimCmdList() {
int32_t cmdno;
@@ -930,6 +928,7 @@ void simInitsimCmdList() {
simCmdList[cmdno].executeCmd = NULL;
simAddCmdIntoHash(&(simCmdList[cmdno]));
+#if 0
cmdno = SIM_CMD_SWITCH;
simCmdList[cmdno].cmdno = cmdno;
strcpy(simCmdList[cmdno].name, "switch");
@@ -977,6 +976,7 @@ void simInitsimCmdList() {
simCmdList[cmdno].parseCmd = simParseEndsCmd;
simCmdList[cmdno].executeCmd = NULL;
simAddCmdIntoHash(&(simCmdList[cmdno]));
+#endif
cmdno = SIM_CMD_SLEEP;
simCmdList[cmdno].cmdno = cmdno;
@@ -1058,14 +1058,6 @@ void simInitsimCmdList() {
simCmdList[cmdno].executeCmd = simExecuteSqlSlowCmd;
simAddCmdIntoHash(&(simCmdList[cmdno]));
- cmdno = SIM_CMD_RESTFUL;
- simCmdList[cmdno].cmdno = cmdno;
- strcpy(simCmdList[cmdno].name, "restful");
- simCmdList[cmdno].nlen = (int16_t)strlen(simCmdList[cmdno].name);
- simCmdList[cmdno].parseCmd = simParseRestfulCmd;
- simCmdList[cmdno].executeCmd = simExecuteRestfulCmd;
- simAddCmdIntoHash(&(simCmdList[cmdno]));
-
/* test is only an internal command */
cmdno = SIM_CMD_TEST;
simCmdList[cmdno].cmdno = cmdno;
@@ -1082,6 +1074,7 @@ void simInitsimCmdList() {
simCmdList[cmdno].executeCmd = simExecuteReturnCmd;
simAddCmdIntoHash(&(simCmdList[cmdno]));
+#if 0
cmdno = SIM_CMD_LINE_INSERT;
simCmdList[cmdno].cmdno = cmdno;
strcpy(simCmdList[cmdno].name, "line_insert");
@@ -1097,4 +1090,5 @@ void simInitsimCmdList() {
simCmdList[cmdno].parseCmd = simParseLineInsertErrorCmd;
simCmdList[cmdno].executeCmd = simExecuteLineInsertErrorCmd;
simAddCmdIntoHash(&(simCmdList[cmdno]));
+#endif
}