diff --git a/CONTRIBUTING-CN.md b/CONTRIBUTING-CN.md
index 19f3000d45b53a4fcdab9d0e0ebbf2da7e2d94f8..efaa2077fe05a7c9f4b08098fcb74da8ad3a97cd 100644
--- a/CONTRIBUTING-CN.md
+++ b/CONTRIBUTING-CN.md
@@ -7,25 +7,18 @@
- 任何用户都可以通过 **[GitHub issue tracker](https://github.com/taosdata/TDengine/issues)** 向我们报告错误。请您对所遇到的问题进行**详细描述**,最好提供重现错误的详细步骤。
- 欢迎提供包含由 Bug 生成的日志文件的附录。
-## 需要强调的代码提交规则
-
-- 在提交代码之前,需要**同意贡献者许可协议(CLA)**。点击 [TaosData CLA](https://cla-assistant.io/taosdata/TDengine) 阅读并签署协议。如果您不接受该协议,请停止提交。
-- 请在 [GitHub issue tracker](https://github.com/taosdata/TDengine/issues) 中解决问题或添加注册功能。
-- 如果在 [GitHub issue tracker](https://github.com/taosdata/TDengine/issues) 中没有找到相应的问题或功能,请**创建一个新的 issue**。
-- 将代码提交到我们的存储库时,请创建**包含问题编号的 PR**。
-
-## 贡献指南
-
-1. 请用友好的语气书写。
-
-2. **主动语态**总体上优于被动语态。主动语态中的句子会突出执行动作的人,而不是被动语态突出动作的接受者。
-
-3. 文档写作建议
-
-- 正确拼写产品名称 “TDengine”。 “TD” 用大写字母,“TD” 和 “engine” 之间没有空格 **(正确拼写:TDengine)**。
-- 在句号或其他标点符号后只留一个空格。
-
-4. 尽量**使用简单句**,而不是复杂句。
+## 代码提交规则
+
+1. 在提交代码之前,需要**同意贡献者许可协议(CLA)**。点击 [TaosData CLA](https://cla-assistant.io/taosdata/TDengine) 阅读并签署协议。如果您不接受该协议,请停止提交。
+2. 请在 [GitHub issue tracker](https://github.com/taosdata/TDengine/issues) 中解决问题或添加注册功能。
+ 如果在 [GitHub issue tracker](https://github.com/taosdata/TDengine/issues) 中没有找到相应的问题或功能,请**创建一个新的 issue**。
+ 将代码提交到我们的存储库时,请创建**包含问题编号的 PR**。
+3. 将TDengine仓库库fork到自己的账户中并创建分支(branch)。
+ 注意:默认分支`main`不能直接接受PR,请基于开发分支`3.0`创建自己的分支。
+ 注意:修改文档的分支要以`docs/`为开头,以免进行不必要的测试。
+4. 创建pull request,将自己的分支合并到开发分支`3.0`,我们开发团队将尽快审核。
+
+如遇任何问题,请添加官方微信TDengineECO。我们的团队会帮忙解决。
## 给贡献者的礼品
diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md
index 5be84bec3483ac2f79f43941465df3b50047e661..058c624e10876c3c077f4bd1d0a455a97f75f39c 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -1,40 +1,36 @@
-# Contributing
+# Contributing to TDengine
-We appreciate contributions from all developers. Feel free to follow us, fork the repository, report bugs, and even submit your code on GitHub. However, we would like developers to follow the guidelines in this document to ensure effective cooperation.
+TDengine Community Edition is free, open-source software. Its development is led by the TDengine Team, but we welcome contributions from all community members and open-source developers. This document describes how you can contribute, no matter whether you're a user or a developer yourself.
-## Reporting a bug
+## Bug reports
-- Any users can report bugs to us through the **[GitHub issue tracker](https://github.com/taosdata/TDengine/issues)**. We would appreciate if you could provide **a detailed description** of the problem you encountered, including steps to reproduce it.
+All users can report bugs to us through the **[GitHub issue tracker](https://github.com/taosdata/TDengine/issues)**. To ensure that the development team can locate and resolve the issue that you experienced, please include the following in your bug report:
-- Attaching log files caused by the bug is really appreciated.
+- A detailed description of the issue, including the steps to reproduce it.
+- Any log files that may be relevant to the issue.
-## Guidelines for committing code
+## Code contributions
-- You must agree to the **Contributor License Agreement(CLA) before submitting your code patch**. Follow the **[TAOSData CLA](https://cla-assistant.io/taosdata/TDengine)** link to read through and sign the agreement. If you do not accept the agreement, your contributions cannot be accepted.
+Developers are encouraged to submit patches to the project, and all contributions, from minor documentation changes to bug fixes, are appreciated by our team. To ensure that your code can be merged successfully and improve the experience for other community members, we ask that you go through the following procedure before submitting a pull request:
-- Please solve an issue or add a feature registered in the **[GitHub issue tracker](https://github.com/taosdata/TDengine/issues)**.
-- If no corresponding issue or feature is found in the issue tracker, please **create one**.
-- When submitting your code to our repository, please create a pull request with the **issue number** included.
+1. Read and accept the terms of the TAOS Data Contributor License Agreement (CLA) located at [https://cla-assistant.io/taosdata/TDengine](https://cla-assistant.io/taosdata/TDengine).
-## Guidelines for communicating
+2. For bug fixes, search the [GitHub issue tracker](https://github.com/taosdata/TDengine/issues) to check whether the bug has already been filed.
+ - If the bug that you want to fix already exists in the issue tracker, review the previous discussion before submitting your patch.
+ - If the bug that you want to fix does not exist in the issue tracker, click **New issue** and file a report.
+ - Ensure that you note the issue number in your pull request when you submit your patch.
+
+3. Fork our repository to your GitHub account and create a branch for your patch.
+ **Important:** The `main` branch is for stable versions and cannot accept patches directly. For all code and documentation changes, create your own branch from the development branch `3.0` and not from `main`.
+ Note: For a documentation change, ensure that the branch name starts with `docs/` so that the change can be merged without running tests.
+
+4. Create a pull request to merge your changes into the development branch `3.0`, and our team members will review the request as soon as possible.
-1. Please be **nice and polite** in the description.
-2. **Active voice is better than passive voice in general**. Sentences in the active voice will highlight who is performing the action rather than the recipient of the action highlighted by the passive voice.
-3. Documentation writing advice
+If you encounter any difficulties or problems in contributing your code, you can join our [Discord server](https://discord.com/invite/VZdSuUg4pS) and receive assistance from members of the TDengine Team.
-- Spell the product name "TDengine" correctly. "TD" is written in capital letters, and there is no space between "TD" and "engine" (**Correct spelling: TDengine**).
-- Please **capitalize the first letter** of every sentence.
-- Leave **only one space** after periods or other punctuation marks.
-- Use **American spelling**.
-- When possible, **use second person** rather than first person (e.g.“You are recommended to use a reverse proxy such as Nginx.” rather than “We recommend to use a reverse proxy such as Nginx.”).
+## Expressing our thanks
-5. Use **simple sentences**, rather than complex sentences.
-
-## Gifts for the contributors
-
-Developers, as long as you contribute to TDengine, whether it's code contributions to fix bugs or feature requests, or documentation changes, **you are eligible for a very special Contributor Souvenir Gift!**
-
-**You can choose one of the following gifts:**
+To thank community members for your support, we are offering a free gift to any developer who submits at least one contribution. You can choose one of the following items:
-The TDengine community is committed to making TDengine accepted and used by more developers.
-
-Just fill out the **Contributor Submission Form** to choose your desired gift.
-
-- [Contributor Submission Form](https://page.ma.scrmtech.com/form/index?pf_uid=27715_2095&id=12100)
+If you would like to claim your gift, send an email to [developer@tdengine.com](mailto:developer@tdengine.com?subject=Claiming&20my%20developer%20gift) including the following information:
-## Contact us
+- Your GitHub account name
+- Your name and mailing address
+- Your preferred gift
-If you have any problems or questions that need help from us, please feel free to add our WeChat account: TDengineECO.
+Note: Limit one per person.
\ No newline at end of file
diff --git a/Jenkinsfile2 b/Jenkinsfile2
index 9e89e5a2f85344cad3767c3cdc6e40088079e61d..33c3ef55c97da73209e7b5b2d5527df8d6bde93d 100644
--- a/Jenkinsfile2
+++ b/Jenkinsfile2
@@ -430,8 +430,6 @@ pipeline {
rm -rf ${WKC}/debug
cd ${WKC}/tests/parallel_test
time ./container_build.sh -w ${WKDIR} -t 10 -e
- rm -f /tmp/cases.task
- ./collect_cases.sh -e
'''
def extra_param = ""
def log_server_file = "/home/log_server.json"
@@ -462,7 +460,7 @@ pipeline {
cd ${WKC}/tests/parallel_test
export DEFAULT_RETRY_TIME=2
date
- ''' + timeout_cmd + ''' time ./run.sh -e -m /home/m.json -t /tmp/cases.task -b ${BRANCH_NAME}_${BUILD_ID} -l ${WKDIR}/log -o 480 ''' + extra_param + '''
+ ''' + timeout_cmd + ''' time ./run.sh -e -m /home/m.json -t cases.task -b ${BRANCH_NAME}_${BUILD_ID} -l ${WKDIR}/log -o 480 ''' + extra_param + '''
'''
}
}
diff --git a/cmake/cmake.platform b/cmake/cmake.platform
index 3e239d2e0c9f1fb53a4c156cab52801f6206df75..eb8b63b4c2f282b141d9fc1c4951819e36b06d42 100644
--- a/cmake/cmake.platform
+++ b/cmake/cmake.platform
@@ -102,6 +102,12 @@ IF ("${CPUTYPE}" STREQUAL "")
SET(TD_ARM_64 TRUE)
ADD_DEFINITIONS("-D_TD_ARM_")
ADD_DEFINITIONS("-D_TD_ARM_64")
+ ELSEIF (CMAKE_SYSTEM_PROCESSOR MATCHES "loongarch64")
+ MESSAGE(STATUS "The current platform is loongarch64")
+ SET(PLATFORM_ARCH_STR "loongarch64")
+ SET(TD_LOONGARCH_64 TRUE)
+ ADD_DEFINITIONS("-D_TD_LOONGARCH_")
+ ADD_DEFINITIONS("-D_TD_LOONGARCH_64")
ENDIF ()
ELSE ()
# if generate ARM version:
@@ -118,6 +124,12 @@ ELSE ()
ADD_DEFINITIONS("-D_TD_ARM_")
ADD_DEFINITIONS("-D_TD_ARM_64")
SET(TD_ARM_64 TRUE)
+ ELSEIF (${CPUTYPE} MATCHES "loongarch64")
+ SET(PLATFORM_ARCH_STR "loongarch64")
+ MESSAGE(STATUS "input cpuType: loongarch64")
+ SET(TD_LOONGARCH_64 TRUE)
+ ADD_DEFINITIONS("-D_TD_LOONGARCH_")
+ ADD_DEFINITIONS("-D_TD_LOONGARCH_64")
ELSEIF (${CPUTYPE} MATCHES "mips64")
SET(PLATFORM_ARCH_STR "mips")
MESSAGE(STATUS "input cpuType: mips64")
diff --git a/cmake/cmake.version b/cmake/cmake.version
index 92f7f8b895a2ce82ee60330cd8ffa22b977c89ca..5c5abe79bbe322ae561cb71c69ab662e0ea23875 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.6")
+ SET(TD_VER_NUMBER "3.0.1.7")
ENDIF ()
IF (DEFINED VERCOMPATIBLE)
@@ -65,13 +65,14 @@ ELSE ()
ENDIF ()
MESSAGE(STATUS "============= compile version parameter information start ============= ")
-MESSAGE(STATUS "ver number:" ${TD_VER_NUMBER})
-MESSAGE(STATUS "compatible ver number:" ${TD_VER_COMPATIBLE})
-MESSAGE(STATUS "communit commit id:" ${TD_VER_GIT})
-MESSAGE(STATUS "build date:" ${TD_VER_DATE})
-MESSAGE(STATUS "ver type:" ${TD_VER_VERTYPE})
-MESSAGE(STATUS "ver cpu:" ${TD_VER_CPUTYPE})
-MESSAGE(STATUS "os type:" ${TD_VER_OSTYPE})
+MESSAGE(STATUS "version: " ${TD_VER_NUMBER})
+MESSAGE(STATUS "compatible: " ${TD_VER_COMPATIBLE})
+MESSAGE(STATUS "commit id: " ${TD_VER_GIT})
+MESSAGE(STATUS "build date: " ${TD_VER_DATE})
+MESSAGE(STATUS "build type: " ${CMAKE_BUILD_TYPE})
+MESSAGE(STATUS "type: " ${TD_VER_VERTYPE})
+MESSAGE(STATUS "cpu: " ${TD_VER_CPUTYPE})
+MESSAGE(STATUS "os: " ${TD_VER_OSTYPE})
MESSAGE(STATUS "============= compile version parameter information end ============= ")
STRING(REPLACE "." "_" TD_LIB_VER_NUMBER ${TD_VER_NUMBER})
diff --git a/cmake/taosadapter_CMakeLists.txt.in b/cmake/taosadapter_CMakeLists.txt.in
index c507ae25367d50c6b53719f9d46b4283adb19db7..cc46ef99386420196749b2d8b5886e1d65fa9943 100644
--- a/cmake/taosadapter_CMakeLists.txt.in
+++ b/cmake/taosadapter_CMakeLists.txt.in
@@ -2,7 +2,7 @@
# taosadapter
ExternalProject_Add(taosadapter
GIT_REPOSITORY https://github.com/taosdata/taosadapter.git
- GIT_TAG 8c3d57d
+ GIT_TAG ff7de07
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosadapter"
BINARY_DIR ""
#BUILD_IN_SOURCE TRUE
diff --git a/cmake/taostools_CMakeLists.txt.in b/cmake/taostools_CMakeLists.txt.in
index e0d5250d84fe36ddb2fb9fea57b13ff2046adabf..b996ffcd17c7b8070a6fa0023bc6df2bb60c618e 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 0fb640b
+ GIT_TAG e00ebd9
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
BINARY_DIR ""
#BUILD_IN_SOURCE TRUE
diff --git a/cmake/taosws_CMakeLists.txt.in b/cmake/taosws_CMakeLists.txt.in
index 33ca6c659cc0b228dd08c61e304faa4d8f2c260d..e79c6b799f0bfdf98e73d33188c12d355eb32708 100644
--- a/cmake/taosws_CMakeLists.txt.in
+++ b/cmake/taosws_CMakeLists.txt.in
@@ -2,7 +2,7 @@
# taosws-rs
ExternalProject_Add(taosws-rs
GIT_REPOSITORY https://github.com/taosdata/taos-connector-rust.git
- GIT_TAG 38c4599
+ GIT_TAG f406d51
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taosws-rs"
BINARY_DIR ""
#BUILD_IN_SOURCE TRUE
diff --git a/docs/en/05-get-started/discord.svg b/docs/en/05-get-started/discord.svg
new file mode 100644
index 0000000000000000000000000000000000000000..99c02b6fb0f1daa4370a10707446b61df6e7d16d
--- /dev/null
+++ b/docs/en/05-get-started/discord.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/docs/en/05-get-started/github.svg b/docs/en/05-get-started/github.svg
new file mode 100644
index 0000000000000000000000000000000000000000..c546b325c8dad574ef0dbdbcd83a8120e8866ef5
--- /dev/null
+++ b/docs/en/05-get-started/github.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/docs/en/05-get-started/index.md b/docs/en/05-get-started/index.md
index a6b67213834b7dfd000b1896e04f433b7afba91e..d80ec022686d4cf1941258a9651af706c8c11c7c 100644
--- a/docs/en/05-get-started/index.md
+++ b/docs/en/05-get-started/index.md
@@ -3,6 +3,12 @@ title: Get Started
description: This article describes how to install TDengine and test its performance.
---
+import GitHubSVG from './github.svg'
+import DiscordSVG from './discord.svg'
+import TwitterSVG from './twitter.svg'
+import YouTubeSVG from './youtube.svg'
+import LinkedInSVG from './linkedin.svg'
+
You can install and run TDengine on Linux/Windows/macOS machines as well as Docker containers. You can also deploy TDengine as a managed service with TDengine Cloud.
The full package of TDengine includes the TDengine Server (`taosd`), TDengine Client (`taosc`), taosAdapter for connecting with third-party systems and providing a RESTful interface, a command-line interface, and some tools. In addition to connectors for multiple languages, TDengine also provides a [RESTful interface](/reference/rest-api) through [taosAdapter](/reference/taosadapter).
@@ -12,4 +18,16 @@ import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
-```
\ No newline at end of file
+```
+
+### Join TDengine Community
+
+
diff --git a/docs/en/05-get-started/linkedin.svg b/docs/en/05-get-started/linkedin.svg
new file mode 100644
index 0000000000000000000000000000000000000000..1eb6754f636a8d1a31b920841716f963835f6f7e
--- /dev/null
+++ b/docs/en/05-get-started/linkedin.svg
@@ -0,0 +1,6 @@
+
+
+
diff --git a/docs/en/05-get-started/twitter.svg b/docs/en/05-get-started/twitter.svg
new file mode 100644
index 0000000000000000000000000000000000000000..9147ca9272653977afc094ce39057cdea9b71851
--- /dev/null
+++ b/docs/en/05-get-started/twitter.svg
@@ -0,0 +1,7 @@
+
+
+
+
+
diff --git a/docs/en/05-get-started/youtube.svg b/docs/en/05-get-started/youtube.svg
new file mode 100644
index 0000000000000000000000000000000000000000..ef86ed14270b99b07b5c797d9765b38981f8ec76
--- /dev/null
+++ b/docs/en/05-get-started/youtube.svg
@@ -0,0 +1,11 @@
+
+
+
+
+
+
+
+
diff --git a/docs/en/07-develop/09-udf.md b/docs/en/07-develop/09-udf.md
index 253f1270f5556a329460cb89176323ed307ac152..699b3ebe5f7cddaa6f56cb8027c784a5821a7a0d 100644
--- a/docs/en/07-develop/09-udf.md
+++ b/docs/en/07-develop/09-udf.md
@@ -205,13 +205,13 @@ Additional functions are defined in `taosudf.h` to make it easier to work with t
To use your user-defined function in TDengine, first compile it to a dynamically linked library (DLL).
-For example, the sample UDF `add_one.c` can be compiled into a DLL as follows:
+For example, the sample UDF `bit_and.c` can be compiled into a DLL as follows:
```bash
-gcc -g -O0 -fPIC -shared add_one.c -o add_one.so
+gcc -g -O0 -fPIC -shared bit_and.c -o libbitand.so
```
-The generated DLL file `add_one.so` can now be used to implement your function. Note: GCC 7.5 or later is required.
+The generated DLL file `libbitand.so` can now be used to implement your function. Note: GCC 7.5 or later is required.
## Manage and Use User-Defined Functions
After compiling your function into a DLL, you add it to TDengine. For more information, see [User-Defined Functions](../12-taos-sql/26-udf.md).
diff --git a/docs/en/12-taos-sql/02-database.md b/docs/en/12-taos-sql/02-database.md
index 5a84bbf3709ff2355157409ae11d5f85191a8271..a12406fe4353d437c5df9755f8f8e68b0f24282f 100644
--- a/docs/en/12-taos-sql/02-database.md
+++ b/docs/en/12-taos-sql/02-database.md
@@ -142,7 +142,7 @@ The preceding SQL statement can be used in migration scenarios. This command can
### View Database Configuration
```sql
-SHOW DATABASES \G;
+SELECT * FROM INFORMATION_SCHEMA.INS_DATABASES WHERE NAME='DBNAME' \G;
```
The preceding SQL statement shows the value of each parameter for the specified database. One value is displayed per line.
diff --git a/docs/en/12-taos-sql/06-select.md b/docs/en/12-taos-sql/06-select.md
index 570defe1a7d2061c383d27f7969d6c4d5d0b30f5..0c55578efa0896d5b66799c8cf0a0da3cca51266 100644
--- a/docs/en/12-taos-sql/06-select.md
+++ b/docs/en/12-taos-sql/06-select.md
@@ -255,7 +255,7 @@ Note: If you include an ORDER BY clause, only one partition can be displayed.
Some special query functions can be invoked without `FROM` sub-clause.
-## Obtain Current Database
+### Obtain Current Database
The following SQL statement returns the current database. If a database has not been specified on login or with the `USE` command, a null value is returned.
@@ -270,7 +270,7 @@ SELECT CLIENT_VERSION();
SELECT SERVER_VERSION();
```
-## Obtain Server Status
+### Obtain Server Status
The following SQL statement returns the status of the TDengine server. An integer indicates that the server is running normally. An error code indicates that an error has occurred. This statement can also detect whether a connection pool or third-party tool is connected to TDengine properly. By using this statement, you can ensure that connections in a pool are not lost due to an incorrect heartbeat detection statement.
@@ -314,6 +314,40 @@ Regular expression filtering is supported only on table names (TBNAME), BINARY t
A regular expression string cannot exceed 128 bytes. You can configure this value by modifying the maxRegexStringLen parameter on the TDengine Client. The modified value takes effect when the client is restarted.
+## CASE Expressions
+
+### Syntax
+
+```txt
+CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
+CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
+```
+
+### Description
+CASE expressions let you use IF ... THEN ... ELSE logic in SQL statements without having to invoke procedures.
+
+The first CASE syntax returns the `result` for the first `value`=`compare_value` comparison that is true.
+
+The second syntax returns the `result` for the first `condition` that is true.
+
+If no comparison or condition is true, the result after ELSE is returned, or NULL if there is no ELSE part.
+
+The return type of the CASE expression is the result type of the first WHEN WHEN part, and the result type of the other WHEN WHEN parts and ELSE parts can be converted to them, otherwise TDengine will report an error.
+
+### Examples
+
+A device has three status codes to display its status. The statements are as follows:
+
+```sql
+SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;
+```
+
+The average voltage value of the smart meter is counted. When the voltage is less than 200 or more than 250, it is considered that the statistics is wrong, and the value is corrected to 220. The statement is as follows:
+
+```sql
+SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;
+```
+
## JOIN
TDengine supports natural joins between supertables, between standard tables, and between subqueries. The difference between natural joins and inner joins is that natural joins require that the fields being joined in the supertables or standard tables must have the same name. Data or tag columns must be joined with the equivalent column in another table.
diff --git a/docs/en/12-taos-sql/12-distinguished.md b/docs/en/12-taos-sql/12-distinguished.md
index 296c2376427b28ea0fa8404517af7215ffa7030f..0763e85a53bc6021a2fe28d7df20f627d1b3fbe7 100644
--- a/docs/en/12-taos-sql/12-distinguished.md
+++ b/docs/en/12-taos-sql/12-distinguished.md
@@ -126,6 +126,12 @@ Only care about the information of the status window when the status is 2. For e
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
```
+TDengine also supports the use of CASE expressions in state quantities. It can express that the beginning of a state is triggered by meeting a certain condition, and the end of this state is triggered by meeting another condition. For example, if the normal voltage range of the smart meter is 205V to 235V, you can judge whether the circuit is normal by monitoring the voltage.
+
+```
+SELECT tbname, _wstart, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status FROM meters PARTITION BY tbname STATE_WINDOW(CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END);
+```
+
### Session Window
The primary key, i.e. timestamp, is used to determine which session window a row belongs to. As shown in the figure below, if the limit of time interval for the session window is specified as 12 seconds, then the 6 rows in the figure constitutes 2 time windows, [2019-04-28 14:22:10,2019-04-28 14:22:30] and [2019-04-28 14:23:10,2019-04-28 14:23:30] because the time difference between 2019-04-28 14:22:30 and 2019-04-28 14:23:10 is 40 seconds, which exceeds the time interval limit of 12 seconds.
diff --git a/docs/en/12-taos-sql/19-limit.md b/docs/en/12-taos-sql/19-limit.md
index 678c38a22ea763187cd0c87dceae3bf6ca03957c..f00ec90f5755d3d004a35b210f93560c6f719536 100644
--- a/docs/en/12-taos-sql/19-limit.md
+++ b/docs/en/12-taos-sql/19-limit.md
@@ -23,7 +23,7 @@ The following characters cannot occur in a password: single quotation marks ('),
## General Limits
-- Maximum length of database name is 32 bytes
+- Maximum length of database name is 64 bytes
- Maximum length of table name is 192 bytes, excluding the database name prefix and the separator.
- Maximum length of each data row is 48K bytes. Note that the upper limit includes the extra 2 bytes consumed by each column of BINARY/NCHAR type.
- The maximum length of a column name is 64 bytes.
@@ -35,7 +35,7 @@ The following characters cannot occur in a password: single quotation marks ('),
- Maximum numbers of databases, STables, tables are dependent only on the system resources.
- The number of replicas can only be 1 or 3.
- The maximum length of a username is 23 bytes.
-- The maximum length of a password is 15 bytes.
+- The maximum length of a password is 128 bytes.
- The maximum number of rows depends on system resources.
- The maximum number of vnodes in a database is 1024.
diff --git a/docs/en/12-taos-sql/26-udf.md b/docs/en/12-taos-sql/26-udf.md
index e6199e8b315c2311be509a3eb819f33ac9a8b8bc..977f3bcc0844ad63e4d2fe0f28d9ca8f29c5cbd6 100644
--- a/docs/en/12-taos-sql/26-udf.md
+++ b/docs/en/12-taos-sql/26-udf.md
@@ -62,7 +62,7 @@ SHOW FUNCTIONS;
The function name specified when creating UDF can be used directly in SQL statements, just like builtin functions. For example:
```sql
-SELECT X(c1,c2) FROM table/stable;
+SELECT bit_and(c1,c2) FROM table;
```
-The above SQL statement invokes function X for column c1 and c2. You can use query keywords like WHERE with user-defined functions.
+The above SQL statement invokes function X for column c1 and c2 on table. You can use query keywords like WHERE with user-defined functions.
diff --git a/docs/en/14-reference/03-connector/index.mdx b/docs/en/14-reference/03-connector/index.mdx
index 4fd9c452d8602a2b131e725dfebf85627981ad0f..54031db618b45e3fb314b973f9837b4ce9b4062f 100644
--- a/docs/en/14-reference/03-connector/index.mdx
+++ b/docs/en/14-reference/03-connector/index.mdx
@@ -26,14 +26,13 @@ Using REST connection can support a broader range of operating systems as it doe
TDengine version updates often add new features, and the connector versions in the list are the best-fit versions of the connector.
-| **TDengine Versions** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** |
-| --------------------- | -------- | ---------- | ------------ | ------------- | --------------- | -------- |
-| **3.0.0.0 and later** | 3.0.0 | current version | 3.0 branch | 3.0.0 | 3.0.0 | current version |
-| **2.4.0.14 and up** | 2.0.38 | current version | develop branch | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | current version |
-| **2.4.0.6 and up** | 2.0.37 | current version | develop branch | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | current version |
-| **2.4.0.4 - 2.4.0.5** | 2.0.37 | current version | develop branch | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | current version |
-| **2.2.x.x ** | 2.0.36 | current version | master branch | n/a | 2.0.7 - 2.0.9 | current version |
-| **2.0.x.x ** | 2.0.34 | current version | master branch | n/a | 2.0.1 - 2.0.6 | current version |
+| **TDengine Versions** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** |
+| --------------------------- | -------------- | -------------- | -------------- | ------------- | --------------- | --------------- |
+| **3.0.0.0 and later** | 3.0.2 + | latest version | 3.0 branch | 3.0.0 | 3.0.0 | current version |
+| **2.4.0.14 and up ** | 2.0.38 | latest version | develop branch | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | current version |
+| **2.4.0.4 - 2.4.0.13 ** | 2.0.37 | latest version | develop branch | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | current version |
+| **2.2.x.x ** | 2.0.36 | latest version | master branch | n/a | 2.0.7 - 2.0.9 | current version |
+| **2.0.x.x ** | 2.0.34 | latest version | master branch | n/a | 2.0.1 - 2.0.6 | current version |
## Functional Features
diff --git a/docs/en/14-reference/09-support-platform/index.md b/docs/en/14-reference/09-support-platform/index.md
index fe268607652b83339a5f0d069a66de744173a865..061294f0160f5f07c7c032b4a7475f6b12c2efca 100644
--- a/docs/en/14-reference/09-support-platform/index.md
+++ b/docs/en/14-reference/09-support-platform/index.md
@@ -14,7 +14,7 @@ Note: ● means officially tested and verified, ○ means unofficially tested an
## List of supported platforms for TDengine clients and connectors
-TDengine's connector can support a wide range of platforms, including X64/X86/ARM64/ARM32/MIPS/Alpha hardware platforms and Linux/Win64/Win32/macOS development environments.
+TDengine's connector can support a wide range of platforms, including X64/X86/ARM64/ARM32/MIPS/Alpha/LoongArch64 hardware platforms and Linux/Win64/Win32/macOS development environments.
The comparison matrix is as follows.
diff --git a/docs/en/14-reference/12-config/index.md b/docs/en/14-reference/12-config/index.md
index aadf563a63052080fbfea91522afb41199f019e8..bb5516ae700ad7cd5b47a87ed56338c27aa1eab0 100644
--- a/docs/en/14-reference/12-config/index.md
+++ b/docs/en/14-reference/12-config/index.md
@@ -106,7 +106,7 @@ The parameters described in this document by the effect that they have on the sy
| Applicable | Server only |
| Meaning | The switch for monitoring inside server. The main object of monitoring is to collect information about load on physical nodes, including CPU usage, memory usage, disk usage, and network bandwidth. Monitoring information is sent over HTTP to the taosKeeper service specified by `monitorFqdn` and `monitorProt`.
| Value Range | 0: monitoring disabled, 1: monitoring enabled |
-| Default | 0 |
+| Default | 1 |
### monitorFqdn
diff --git a/docs/en/14-reference/13-schemaless/13-schemaless.md b/docs/en/14-reference/13-schemaless/13-schemaless.md
index 5b7924ce56b240d34ab139f6160839a56438dc6b..10321ab083e6e654e66cb73f1bc21f9fbd678fda 100644
--- a/docs/en/14-reference/13-schemaless/13-schemaless.md
+++ b/docs/en/14-reference/13-schemaless/13-schemaless.md
@@ -8,6 +8,9 @@ will automatically add the required columns to ensure that the data written by t
The schemaless writing method creates super tables and their corresponding subtables. These are completely indistinguishable from the super tables and subtables created directly via SQL. You can write data directly to them via SQL statements. Note that the names of tables created by schemaless writing are based on fixed mapping rules for tag values, so they are not explicitly ideographic and they lack readability.
+Tips:
+The schemaless write will automatically create a table. You do not need to create a table manually, or an unknown error may occur.
+
## Schemaless Writing Line Protocol
TDengine's schemaless writing line protocol supports InfluxDB's Line Protocol, OpenTSDB's telnet line protocol, and OpenTSDB's JSON format protocol. However, when using these three protocols, you need to specify in the API the standard of the parsing protocol to be used for the input content.
diff --git a/docs/en/28-releases/01-tdengine.md b/docs/en/28-releases/01-tdengine.md
index 74eeeb5efbb0ccb8ce031daaa78cabb2ca3bcc18..8bfdf72cc7a848365834e7f6a87c884e46031c05 100644
--- a/docs/en/28-releases/01-tdengine.md
+++ b/docs/en/28-releases/01-tdengine.md
@@ -1,11 +1,19 @@
---
sidebar_label: TDengine
-title: TDengine
+title: TDengine Release History and Download Links
description: TDengine release history, Release Notes and download links.
---
+TDengine 3.x installation packages can be downloaded at the following links:
+
+For TDengine 2.x installation packages by version, please visit [here](https://www.taosdata.com/all-downloads).
+
import Release from "/components/ReleaseV3";
+## 3.0.1.7
+
+
+
## 3.0.1.6
@@ -33,4 +41,3 @@ import Release from "/components/ReleaseV3";
## 3.0.1.0
-
diff --git a/docs/en/28-releases/02-tools.md b/docs/en/28-releases/02-tools.md
index 0a96c776e061a40ed9ef769f6efbf3583df033fc..2bc22a44500ca275c42cd1790074baaabb192cdb 100644
--- a/docs/en/28-releases/02-tools.md
+++ b/docs/en/28-releases/02-tools.md
@@ -1,11 +1,19 @@
---
-sidebar_label: taosTools
-title: taosTools
+sidebar_label: taosTools
+title: taosTools Release History and Download Links
description: taosTools release history, Release Notes, download links.
---
+taosTools installation packages can be downloaded at the following links:
+
+For other historical version installers, please visit [here](https://www.taosdata.com/all-downloads).
+
import Release from "/components/ReleaseV3";
+## 2.2.9
+
+
+
## 2.2.7
diff --git a/docs/examples/rust/nativeexample/Cargo.toml b/docs/examples/rust/nativeexample/Cargo.toml
index cdf739d35774df37781ad6ea75bfb8214b21e6ea..5ecc4078548304826ea73e14b7ab0ab21263c892 100644
--- a/docs/examples/rust/nativeexample/Cargo.toml
+++ b/docs/examples/rust/nativeexample/Cargo.toml
@@ -10,4 +10,4 @@ chrono = "0.4"
serde = { version = "1", features = ["derive"] }
tokio = { version = "1", features = ["rt", "macros", "rt-multi-thread"] }
-taos = { version = "0.*" }
+taos = { version = "0.4.8" }
diff --git a/docs/examples/rust/nativeexample/examples/stmt_example.rs b/docs/examples/rust/nativeexample/examples/stmt_example.rs
index 9cf8e8e1fc2526206486fa9a61c01f6320564131..7d5a7c0f2b229ab25a58d10a79c84ee40949a40f 100644
--- a/docs/examples/rust/nativeexample/examples/stmt_example.rs
+++ b/docs/examples/rust/nativeexample/examples/stmt_example.rs
@@ -12,7 +12,10 @@ async fn main() -> anyhow::Result<()> {
// bind table name and tags
stmt.set_tbname_tags(
"d1001",
- &[Value::VarChar("California.SanFransico".into()), Value::Int(2)],
+ &[
+ Value::VarChar("California.SanFransico".into()),
+ Value::Int(2),
+ ],
)?;
// bind values.
let values = vec![
@@ -30,9 +33,9 @@ async fn main() -> anyhow::Result<()> {
ColumnView::from_floats(vec![0.33]),
];
stmt.bind(&values2)?;
-
+
stmt.add_batch()?;
-
+
// execute.
let rows = stmt.execute()?;
assert_eq!(rows, 2);
diff --git a/docs/examples/rust/nativeexample/examples/subscribe_demo.rs b/docs/examples/rust/nativeexample/examples/subscribe_demo.rs
index 11d6d4e0043fddeff73c09d86c0fce0abc903a08..7551ad46b139f70c3e966fc3bfaf8e6cb58b17f8 100644
--- a/docs/examples/rust/nativeexample/examples/subscribe_demo.rs
+++ b/docs/examples/rust/nativeexample/examples/subscribe_demo.rs
@@ -50,7 +50,7 @@ async fn main() -> anyhow::Result<()> {
// create super table
format!("CREATE TABLE `meters` (`ts` TIMESTAMP, `current` FLOAT, `voltage` INT, `phase` FLOAT) TAGS (`groupid` INT, `location` BINARY(24))"),
// create topic for subscription
- format!("CREATE TOPIC tmq_meters with META AS DATABASE {db}")
+ format!("CREATE TOPIC tmq_meters AS SELECT * FROM `meters`")
])
.await?;
@@ -64,13 +64,9 @@ async fn main() -> anyhow::Result<()> {
let mut consumer = tmq.build()?;
consumer.subscribe(["tmq_meters"]).await?;
- {
- let mut stream = consumer.stream();
-
- while let Some((offset, message)) = stream.try_next().await? {
- // get information from offset
-
- // the topic
+ consumer
+ .stream()
+ .try_for_each(|(offset, message)| async {
let topic = offset.topic();
// the vgroup id, like partition id in kafka.
let vgroup_id = offset.vgroup_id();
@@ -78,20 +74,14 @@ async fn main() -> anyhow::Result<()> {
if let Some(data) = message.into_data() {
while let Some(block) = data.fetch_raw_block().await? {
- // one block for one table, get table name if needed
- let name = block.table_name();
let records: Vec = block.deserialize().try_collect()?;
- println!(
- "** table: {}, got {} records: {:#?}\n",
- name.unwrap(),
- records.len(),
- records
- );
+ println!("** read {} records: {:#?}\n", records.len(), records);
}
}
consumer.commit(offset).await?;
- }
- }
+ Ok(())
+ })
+ .await?;
consumer.unsubscribe().await;
diff --git a/docs/examples/rust/restexample/examples/insert_example.rs b/docs/examples/rust/restexample/examples/insert_example.rs
index 11a84f166103eba03b43549d4db77100a92a58e6..4953a09b35f16a6de6106d20770e59acbbed9284 100644
--- a/docs/examples/rust/restexample/examples/insert_example.rs
+++ b/docs/examples/rust/restexample/examples/insert_example.rs
@@ -5,7 +5,6 @@ async fn main() -> anyhow::Result<()> {
let dsn = "ws://";
let taos = TaosBuilder::from_dsn(dsn)?.build()?;
-
taos.exec_many([
"DROP DATABASE IF EXISTS power",
"CREATE DATABASE power",
diff --git a/docs/zh/05-get-started/channel.webp b/docs/zh/05-get-started/channel.webp
new file mode 100644
index 0000000000000000000000000000000000000000..8dba93d411d09f1b98e5d72f69cc98c78af5ddb1
Binary files /dev/null and b/docs/zh/05-get-started/channel.webp differ
diff --git a/docs/zh/05-get-started/index.md b/docs/zh/05-get-started/index.md
index 20f8235d87426f7a98ded2f7be431289ea00a045..832310aa7c677940c7e4ca13be5f31c2d98a64dc 100644
--- a/docs/zh/05-get-started/index.md
+++ b/docs/zh/05-get-started/index.md
@@ -3,6 +3,10 @@ title: 立即开始
description: '快速设置 TDengine 环境并体验其高效写入和查询'
---
+import xiaot from './xiaot.webp'
+import channel from './channel.webp'
+import official_account from './official-account.webp'
+
TDengine 完整的软件包包括服务端(taosd)、用于与第三方系统对接并提供 RESTful 接口的 taosAdapter、应用驱动(taosc)、命令行程序 (CLI,taos) 和一些工具软件。TDengine 除了提供多种语言的连接器之外,还通过 [taosAdapter](../reference/taosadapter) 提供 [RESTful 接口](../connector/rest-api)。
本章主要介绍如何利用 Docker 或者安装包快速设置 TDengine 环境并体验其高效写入和查询。
@@ -12,4 +16,32 @@ import DocCardList from '@theme/DocCardList';
import {useCurrentSidebarCategory} from '@docusaurus/theme-common';
-```
\ No newline at end of file
+```
+
+## 学习 TDengine 知识地图
+
+TDengine 知识地图中涵盖了 TDengine 的各种知识点,揭示了各概念实体之间的调用关系和数据流向。学习和了解 TDengine 知识地图有助于你快速掌握 TDengine 的知识体系。
+
+
+
+
+图 1. TDengine 知识地图
+
+
+
+## 加入 TDengine 官方社区
+
+微信扫描以下二维码,学习了解 TDengine 的最新技术,与大家共同交流物联网大数据技术应用、TDengine 使用问题和技巧等话题。
+
+
+
+
+
+
+
+
+加入“物联网大数据技术前沿群” 与大家进行技术交流
+关注 TDengine 微信视频号 收看技术直播与教学视频
+关注 TDengine 微信公众号 阅读核心技术与行业案例文章
+
+
diff --git a/docs/zh/05-get-started/official-account.webp b/docs/zh/05-get-started/official-account.webp
new file mode 100644
index 0000000000000000000000000000000000000000..fcbc3107fc51ca5474be653302db777de7d1e775
Binary files /dev/null and b/docs/zh/05-get-started/official-account.webp differ
diff --git a/docs/zh/05-get-started/xiaot.webp b/docs/zh/05-get-started/xiaot.webp
new file mode 100644
index 0000000000000000000000000000000000000000..91b3b3ef681a590c8526c92e91e58596a09a4085
Binary files /dev/null and b/docs/zh/05-get-started/xiaot.webp differ
diff --git a/docs/zh/07-develop/09-udf.md b/docs/zh/07-develop/09-udf.md
index 3239eae49b05180c4a0dba5850de9f1c5e08a4f3..7a3a3822d5f619337dc0c81482903b51f26a5e96 100644
--- a/docs/zh/07-develop/09-udf.md
+++ b/docs/zh/07-develop/09-udf.md
@@ -205,13 +205,13 @@ typedef struct SUdfInterBuf {
用户定义函数的 C 语言源代码无法直接被 TDengine 系统使用,而是需要先编译为 动态链接库,之后才能载入 TDengine 系统。
-例如,按照上一章节描述的规则准备好了用户定义函数的源代码 add_one.c,以 Linux 为例可以执行如下指令编译得到动态链接库文件:
+例如,按照上一章节描述的规则准备好了用户定义函数的源代码 bit_and.c,以 Linux 为例可以执行如下指令编译得到动态链接库文件:
```bash
-gcc -g -O0 -fPIC -shared add_one.c -o add_one.so
+gcc -g -O0 -fPIC -shared bit_and.c -o libbitand.so
```
-这样就准备好了动态链接库 add_one.so 文件,可以供后文创建 UDF 时使用了。为了保证可靠的系统运行,编译器 GCC 推荐使用 7.5 及以上版本。
+这样就准备好了动态链接库 libbitand.so 文件,可以供后文创建 UDF 时使用了。为了保证可靠的系统运行,编译器 GCC 推荐使用 7.5 及以上版本。
## 管理和使用UDF
编译好的UDF,还需要将其加入到系统才能被正常的SQL调用。关于如何管理和使用UDF,参见[UDF使用说明](../12-taos-sql/26-udf.md)
diff --git a/docs/zh/08-connector/10-cpp.mdx b/docs/zh/08-connector/10-cpp.mdx
index cc7991da74729f3a96c475d41df4f5437a0f0605..8a4f4946a71aa27e4bbfc6d27fc3469b260ce550 100644
--- a/docs/zh/08-connector/10-cpp.mdx
+++ b/docs/zh/08-connector/10-cpp.mdx
@@ -115,6 +115,7 @@ TDengine 客户端驱动的安装请参考 [安装指南](../#安装步骤)
订阅和消费
```c
+ {{#include examples/c/tmq.c}}
```
diff --git a/docs/zh/08-connector/index.md b/docs/zh/08-connector/index.md
index e00e0b2fa2c63163e70e210077f46e6b92cdd3a2..eecf564b905ddbf1e930acbb196cfb80869b67e9 100644
--- a/docs/zh/08-connector/index.md
+++ b/docs/zh/08-connector/index.md
@@ -26,14 +26,13 @@ TDengine 提供了丰富的应用程序开发接口,为了便于用户快速
TDengine 版本更新往往会增加新的功能特性,列表中的连接器版本为连接器最佳适配版本。
-| **TDengine 版本** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** |
-| --------------------- | -------- | ---------- | ------------ | ------------- | --------------- | -------- |
-| **3.0.0.0 及以上** | 3.0.0 | 当前版本 | 3.0 分支 | 3.0.0 | 3.0.0 | 当前版本 |
-| **2.4.0.14 及以上** | 2.0.38 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 |
-| **2.4.0.6 及以上** | 2.0.37 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 |
-| **2.4.0.4 - 2.4.0.5** | 2.0.37 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 |
-| **2.2.x.x ** | 2.0.36 | 当前版本 | master 分支 | n/a | 2.0.7 - 2.0.9 | 当前版本 |
-| **2.0.x.x ** | 2.0.34 | 当前版本 | master 分支 | n/a | 2.0.1 - 2.0.6 | 当前版本 |
+| **TDengine 版本** | **Java** | **Python** | **Go** | **C#** | **Node.js** | **Rust** |
+| ---------------------- | --------- | ---------- | ------------ | ------------- | --------------- | -------- |
+| **3.0.0.0 及以上** | 3.0.2以上 | 当前版本 | 3.0 分支 | 3.0.0 | 3.0.0 | 当前版本 |
+| **2.4.0.14 及以上** | 2.0.38 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 |
+| **2.4.0.4 - 2.4.0.13** | 2.0.37 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 |
+| **2.2.x.x ** | 2.0.36 | 当前版本 | master 分支 | n/a | 2.0.7 - 2.0.9 | 当前版本 |
+| **2.0.x.x ** | 2.0.34 | 当前版本 | master 分支 | n/a | 2.0.1 - 2.0.6 | 当前版本 |
## 功能特性
diff --git a/docs/zh/12-taos-sql/01-data-type.md b/docs/zh/12-taos-sql/01-data-type.md
index a59330546b085879e8f5fc900fdb25a9d652e9d1..f014573ca691d3df9e5f27ff5af533035381e55a 100644
--- a/docs/zh/12-taos-sql/01-data-type.md
+++ b/docs/zh/12-taos-sql/01-data-type.md
@@ -45,6 +45,7 @@ CREATE DATABASE db_name PRECISION 'ns';
:::note
+- 表的每行长度不能超过 48KB(注意:每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)。
- 虽然 BINARY 类型在底层存储上支持字节型的二进制字符,但不同编程语言对二进制数据的处理方式并不保证一致,因此建议在 BINARY 类型中只存储 ASCII 可见字符,而避免存储不可见字符。多字节的数据,例如中文字符,则需要使用 NCHAR 类型进行保存。如果强行使用 BINARY 类型保存中文字符,虽然有时也能正常读写,但并不带有字符集信息,很容易出现数据乱码甚至数据损坏等情况。
- BINARY 类型理论上最长可以有 16,374 字节。BINARY 仅支持字符串输入,字符串两端需使用单引号引用。使用时须指定大小,如 BINARY(20) 定义了最长为 20 个单字节字符的字符串,每个字符占 1 字节的存储空间,总共固定占用 20 字节的空间,此时如果用户字符串超出 20 字节将会报错。对于字符串内的单引号,可以用转义字符反斜线加单引号来表示,即 `\'`。
- SQL 语句中的数值类型将依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型,因此在使用时要注意相应类型越界的情况。例如,9999999999999999999 会认为超过长整型的上边界而溢出,而 9999999999999999999.0 会被认为是有效的浮点数。
diff --git a/docs/zh/12-taos-sql/02-database.md b/docs/zh/12-taos-sql/02-database.md
index c76311f008433f36259b08acaf56cafa729550b7..3918f240b4f9037db92af80df26dd471868b29de 100644
--- a/docs/zh/12-taos-sql/02-database.md
+++ b/docs/zh/12-taos-sql/02-database.md
@@ -142,10 +142,10 @@ SHOW CREATE DATABASE db_name;
### 查看数据库参数
```sql
-SHOW DATABASES \G;
+SELECT * FROM INFORMATION_SCHEMA.INS_DATABASES WHERE NAME='DBNAME' \G;
```
-会列出系统中所有数据库的配置参数,并且每行只显示一个参数。
+会列出指定数据库的配置参数,并且每行只显示一个参数。
## 删除过期数据
diff --git a/docs/zh/12-taos-sql/06-select.md b/docs/zh/12-taos-sql/06-select.md
index 3cd68e9b959181a93279875fc48e787d528326cf..9d4faae23a82fb8b328fe0df39c82789a7cc2ad2 100644
--- a/docs/zh/12-taos-sql/06-select.md
+++ b/docs/zh/12-taos-sql/06-select.md
@@ -315,6 +315,39 @@ WHERE (column|tbname) **match/MATCH/nmatch/NMATCH** _regex_
正则匹配字符串长度不能超过 128 字节。可以通过参数 _maxRegexStringLen_ 设置和调整最大允许的正则匹配字符串,该参数是客户端配置参数,需要重启才能生效。
+## CASE 表达式
+
+### 语法
+
+```txt
+CASE value WHEN compare_value THEN result [WHEN compare_value THEN result ...] [ELSE result] END
+CASE WHEN condition THEN result [WHEN condition THEN result ...] [ELSE result] END
+```
+
+### 说明
+
+TDengine 通过 CASE 表达式让用户可以在 SQL 语句中使用 IF ... THEN ... ELSE 逻辑。
+
+第一种 CASE 语法返回第一个 value 等于 compare_value 的 result,如果没有 compare_value 符合,则返回 ELSE 之后的 result,如果没有 ELSE 部分,则返回 NULL。
+
+第二种语法返回第一个 condition 为真的 result。 如果没有 condition 符合,则返回 ELSE 之后的 result,如果没有 ELSE 部分,则返回 NULL。
+
+CASE 表达式的返回类型为第一个 WHEN THEN 部分的 result 类型,其余 WHEN THEN 部分和 ELSE 部分,result 类型都需要可以向其转换,否则 TDengine 会报错。
+
+### 示例
+
+某设备有三个状态码,显示其状态,语句如下:
+
+```sql
+SELECT CASE dev_status WHEN 1 THEN 'Running' WHEN 2 THEN 'Warning' WHEN 3 THEN 'Downtime' ELSE 'Unknown' END FROM dev_table;
+```
+
+统计智能电表的电压平均值,当电压小于 200 或大于 250 时认为是统计有误,修正其值为 220,语句如下:
+
+```sql
+SELECT AVG(CASE WHEN voltage < 200 or voltage > 250 THEN 220 ELSE voltage END) FROM meters;
+```
+
## JOIN 子句
TDengine 支持“普通表与普通表之间”、“超级表与超级表之间”、“子查询与子查询之间” 进行自然连接。自然连接与内连接的主要区别是,自然连接要求参与连接的字段在不同的表/超级表中必须是同名字段。也即,TDengine 在连接关系的表达中,要求必须使用同名数据列/标签列的相等关系。
diff --git a/docs/zh/12-taos-sql/12-distinguished.md b/docs/zh/12-taos-sql/12-distinguished.md
index ee8e8e15cacc0fef8ef5a5dc370f4f58de710230..d36c852e7975dbe602166d8c7d12027043c2e302 100644
--- a/docs/zh/12-taos-sql/12-distinguished.md
+++ b/docs/zh/12-taos-sql/12-distinguished.md
@@ -119,6 +119,12 @@ SELECT COUNT(*), FIRST(ts), status FROM temp_tb_1 STATE_WINDOW(status);
SELECT * FROM (SELECT COUNT(*) AS cnt, FIRST(ts) AS fst, status FROM temp_tb_1 STATE_WINDOW(status)) t WHERE status = 2;
```
+TDengine 还支持将 CASE 表达式用在状态量,可以表达某个状态的开始是由满足某个条件而触发,这个状态的结束是由另外一个条件满足而触发的语义。例如,智能电表的电压正常范围是 205V 到 235V,那么可以通过监控电压来判断电路是否正常。
+
+```
+SELECT tbname, _wstart, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status FROM meters PARTITION BY tbname STATE_WINDOW(CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END);
+```
+
### 会话窗口
会话窗口根据记录的时间戳主键的值来确定是否属于同一个会话。如下图所示,如果设置时间戳的连续的间隔小于等于 12 秒,则以下 6 条记录构成 2 个会话窗口,分别是:[2019-04-28 14:22:10,2019-04-28 14:22:30]和[2019-04-28 14:23:10,2019-04-28 14:23:30]。因为 2019-04-28 14:22:30 与 2019-04-28 14:23:10 之间的时间间隔是 40 秒,超过了连续时间间隔(12 秒)。
diff --git a/docs/zh/12-taos-sql/19-limit.md b/docs/zh/12-taos-sql/19-limit.md
index a9743adddabe96440ffca8c8585787081d29398f..7b6692f1b733042fde3103de1e9fa06bf4dda542 100644
--- a/docs/zh/12-taos-sql/19-limit.md
+++ b/docs/zh/12-taos-sql/19-limit.md
@@ -24,19 +24,19 @@ description: 合法字符集和命名中的限制规则
## 一般限制
-- 数据库名最大长度为 32
-- 表名最大长度为 192,不包括数据库名前缀和分隔符
+- 数据库名最大长度为 64 字节
+- 表名最大长度为 192 字节,不包括数据库名前缀和分隔符
- 每行数据最大长度 48KB (注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
-- 列名最大长度为 64
+- 列名最大长度为 64 字节
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
-- 标签名最大长度为 64
+- 标签名最大长度为 64 字节
- 最多允许 128 个,至少要有 1 个标签,一个表中标签值的总长度不超过 16KB
- SQL 语句最大长度 1048576 个字符
- SELECT 语句的查询结果,最多允许返回 4096 列(语句中的函数调用可能也会占用一些列空间),超限时需要显式指定较少的返回数据列,以避免语句执行报错
- 库的数目,超级表的数目、表的数目,系统不做限制,仅受系统资源限制
- 数据库的副本数只能设置为 1 或 3
-- 用户名的最大长度是 23 个字节
-- 用户密码的最大长度是 15 个字节
+- 用户名的最大长度是 23 字节
+- 用户密码的最大长度是 128 字节
- 总数据行数取决于可用资源
- 单个数据库的虚拟结点数上限为 1024
diff --git a/docs/zh/12-taos-sql/26-udf.md b/docs/zh/12-taos-sql/26-udf.md
index 6dc1b6eb5fbe346ae65993e4e290566179b0e6ee..cb349109a7d8758e336ec33ef9d70ece39be61f0 100644
--- a/docs/zh/12-taos-sql/26-udf.md
+++ b/docs/zh/12-taos-sql/26-udf.md
@@ -63,7 +63,7 @@ SHOW FUNCTIONS;
在 SQL 指令中,可以直接以在系统中创建 UDF 时赋予的函数名来调用用户定义函数。例如:
```sql
-SELECT X(c1,c2) FROM table/stable;
+SELECT bit_and(c1,c2) FROM table;
```
-表示对名为 c1, c2 的数据列调用名为 X 的用户定义函数。SQL 指令中用户定义函数可以配合 WHERE 等查询特性来使用。
+表示对表 table 上名为 c1, c2 的数据列调用名为 bit_and 的用户定义函数。SQL 指令中用户定义函数可以配合 WHERE 等查询特性来使用。
diff --git a/docs/zh/14-reference/04-taosadapter.md b/docs/zh/14-reference/04-taosadapter.md
index ec023afd713d7d6e5fc6e14877c1c3121621b0cd..4e1e7b7ace09f7cb43e5049ebefe21a24525b595 100644
--- a/docs/zh/14-reference/04-taosadapter.md
+++ b/docs/zh/14-reference/04-taosadapter.md
@@ -32,7 +32,7 @@ taosAdapter 提供以下功能:
taosAdapter 是 TDengine 服务端软件 的一部分,如果您使用 TDengine server 您不需要任何额外的步骤来安装 taosAdapter。您可以从[涛思数据官方网站](https://taosdata.com/cn/all-downloads/)下载 TDengine server 安装包。如果需要将 taosAdapter 分离部署在 TDengine server 之外的服务器上,则应该在该服务器上安装完整的 TDengine 来安装 taosAdapter。如果您需要使用源代码编译生成 taosAdapter,您可以参考[构建 taosAdapter](https://github.com/taosdata/taosadapter/blob/3.0/BUILD-CN.md)文档。
-### start/stop taosAdapter
+### 启动/停止 taosAdapter
在 Linux 系统上 taosAdapter 服务默认由 systemd 管理。使用命令 `systemctl start taosadapter` 可以启动 taosAdapter 服务。使用命令 `systemctl stop taosadapter` 可以停止 taosAdapter 服务。
diff --git a/docs/zh/14-reference/07-tdinsight/index.mdx b/docs/zh/14-reference/07-tdinsight/index.mdx
index ecd63621432794e27fd80b88e864590c83e9b333..7f4c46a636ace97c6b04849d1b9805fcfc92da82 100644
--- a/docs/zh/14-reference/07-tdinsight/index.mdx
+++ b/docs/zh/14-reference/07-tdinsight/index.mdx
@@ -4,6 +4,9 @@ sidebar_label: TDinsight
description: 基于Grafana的TDengine零依赖监控解决方案
---
+import Tabs from '@theme/Tabs'
+import TabItem from '@theme/TabItem'
+
TDinsight 是使用监控数据库和 [Grafana] 对 TDengine 进行监控的解决方案。
TDengine 通过 [taosKeeper](../taosKeeper) 将服务器的 CPU、内存、硬盘空间、带宽、请求数、磁盘读写速度、慢查询等信息定时写入指定数据库,并对重要的系统操作(比如登录、创建、删除数据库等)以及各种错误报警信息进行记录。通过 [Grafana] 和 [TDengine 数据源插件](https://github.com/taosdata/grafanaplugin/releases),TDinsight 将集群状态、节点信息、插入及查询请求、资源使用情况等进行可视化展示,同时还支持 vnode、dnode、mnode 节点状态异常告警,为开发者实时监控 TDengine 集群运行状态提供了便利。本文将指导用户安装 Grafana 服务器并通过 `TDinsight.sh` 安装脚本自动安装 TDengine 数据源插件及部署 TDinsight 可视化面板。
@@ -41,6 +44,7 @@ sudo apt-get install grafana
```
### 在 CentOS / RHEL 上安装 Grafana
+
@@ -127,20 +131,20 @@ Install and configure TDinsight dashboard in Grafana on Ubuntu 18.04/20.04 syste
大多数命令行选项都可以通过环境变量获得同样的效果。
-| 短选项 | 长选项 | 环境变量 | 说明 |
-| ------ | -------------------------- | ---------------------------- | --------------------------------------------------------------------------- |
-| -v | --plugin-version | TDENGINE_PLUGIN_VERSION | TDengine 数据源插件版本,默认使用最新版。 |
-| -P | --grafana-provisioning-dir | GF_PROVISIONING_DIR | Grafana 配置目录,默认为`/etc/grafana/provisioning/` |
-| -G | --grafana-plugins-dir | GF_PLUGINS_DIR | Grafana 插件目录,默认为`/var/lib/grafana/plugins`。 |
-| -O | --grafana-org-id | GF_ORG_ID | Grafana 组织 ID,默认为 1。 |
-| -n | --tdengine-ds-name | TDENGINE_DS_NAME | TDengine 数据源名称,默认为 TDengine。 |
-| -a | --tdengine-api | TDENGINE_API | TDengine REST API 端点。默认为`http://127.0.0.1:6041`。 |
-| -u | --tdengine-user | TDENGINE_USER | TDengine 用户名。 [默认值:root] |
-| -p | --tdengine-密码 | TDENGINE_PASSWORD | TDengine 密码。 [默认:taosdata] |
-| -i | --tdinsight-uid | TDINSIGHT_DASHBOARD_UID | TDinsight 仪表盘`uid`。 [默认值:tdinsight] |
-| -t | --tdinsight-title | TDINSIGHT_DASHBOARD_TITLE | TDinsight 仪表盘标题。 [默认:TDinsight] |
-| -e | --tdinsight-可编辑 | TDINSIGHT_DASHBOARD_EDITABLE | 如果配置仪表盘可以编辑。 [默认值:false] |
-| -E | --external-notifier | EXTERNAL_NOTIFIER | 将外部通知程序 uid 应用于 TDinsight 仪表盘。 |
+| 短选项 | 长选项 | 环境变量 | 说明 |
+| ------ | -------------------------- | ---------------------------- | ------------------------------------------------------- |
+| -v | --plugin-version | TDENGINE_PLUGIN_VERSION | TDengine 数据源插件版本,默认使用最新版。 |
+| -P | --grafana-provisioning-dir | GF_PROVISIONING_DIR | Grafana 配置目录,默认为`/etc/grafana/provisioning/` |
+| -G | --grafana-plugins-dir | GF_PLUGINS_DIR | Grafana 插件目录,默认为`/var/lib/grafana/plugins`。 |
+| -O | --grafana-org-id | GF_ORG_ID | Grafana 组织 ID,默认为 1。 |
+| -n | --tdengine-ds-name | TDENGINE_DS_NAME | TDengine 数据源名称,默认为 TDengine。 |
+| -a | --tdengine-api | TDENGINE_API | TDengine REST API 端点。默认为`http://127.0.0.1:6041`。 |
+| -u | --tdengine-user | TDENGINE_USER | TDengine 用户名。 [默认值:root] |
+| -p | --tdengine-密码 | TDENGINE_PASSWORD | TDengine 密码。 [默认:taosdata] |
+| -i | --tdinsight-uid | TDINSIGHT_DASHBOARD_UID | TDinsight 仪表盘`uid`。 [默认值:tdinsight] |
+| -t | --tdinsight-title | TDINSIGHT_DASHBOARD_TITLE | TDinsight 仪表盘标题。 [默认:TDinsight] |
+| -e | --tdinsight-可编辑 | TDINSIGHT_DASHBOARD_EDITABLE | 如果配置仪表盘可以编辑。 [默认值:false] |
+| -E | --external-notifier | EXTERNAL_NOTIFIER | 将外部通知程序 uid 应用于 TDinsight 仪表盘。 |
假设您在主机 `tdengine` 上启动 TDengine 数据库,HTTP API 端口为 `6041`,用户为 `root1`,密码为 `pass5ord`。执行脚本:
@@ -196,6 +200,7 @@ sudo grafana-cli \
[plugins]
allow_loading_unsigned_plugins = tdengine-datasource
```
+
:::
### 启动 Grafana 服务
diff --git a/docs/zh/14-reference/09-support-platform/index.md b/docs/zh/14-reference/09-support-platform/index.md
index 7292ca4814f5ebbd5f92220a0f60c82080284193..500eeeb14c9c1f587435a0223b15ffc6ca840550 100644
--- a/docs/zh/14-reference/09-support-platform/index.md
+++ b/docs/zh/14-reference/09-support-platform/index.md
@@ -16,7 +16,7 @@ description: "TDengine 服务端、客户端和连接器支持的平台列表"
## TDengine 客户端和连接器支持的平台列表
-目前 TDengine 的连接器可支持的平台广泛,目前包括:X64/X86/ARM64/ARM32/MIPS/Alpha 等硬件平台,以及 Linux/Win64/Win32/macOS 等开发环境。
+目前 TDengine 的连接器可支持的平台广泛,目前包括:X64/X86/ARM64/ARM32/MIPS/LoongArch64 等硬件平台,以及 Linux/Win64/Win32/macOS 等开发环境。
对照矩阵如下:
diff --git a/docs/zh/14-reference/11-docker/index.md b/docs/zh/14-reference/11-docker/index.md
index 58bbe1e1178fbb1a1aa649508b0e36b331964753..086d72940c88adfe0e0c4c30cf16cc9cb2701630 100644
--- a/docs/zh/14-reference/11-docker/index.md
+++ b/docs/zh/14-reference/11-docker/index.md
@@ -119,7 +119,7 @@ taos -h tdengine -P 6030
FROM ubuntu:20.04
RUN apt-get update && apt-get install -y wget
ENV TDENGINE_VERSION=3.0.0.0
-RUN wget -c https://www.tdengine.com/assets-download/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
+RUN wget -c https://www.tdengine.com/assets-download/3.0/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& cd TDengine-client-${TDENGINE_VERSION} \
&& ./install_client.sh \
diff --git a/docs/zh/14-reference/12-config/index.md b/docs/zh/14-reference/12-config/index.md
index 54c362de9543b908b6da20ba4206e1a70cc3263e..145c5eed935568f013d4451cd590c8b745b165c5 100644
--- a/docs/zh/14-reference/12-config/index.md
+++ b/docs/zh/14-reference/12-config/index.md
@@ -106,7 +106,7 @@ taos --dump-config
| 适用范围 | 仅服务端适用 |
| 含义 | 服务器内部的系统监控开关。监控主要负责收集物理节点的负载状况,包括 CPU、内存、硬盘、网络带宽的监控记录,监控信息将通过 HTTP 协议发送给由 `monitorFqdn` 和 `monitorProt` 指定的 TaosKeeper 监控服务 |
| 取值范围 | 0:关闭监控服务, 1:激活监控服务。 |
-| 缺省值 | 0 |
+| 缺省值 | 1 |
### monitorFqdn
diff --git a/docs/zh/14-reference/13-schemaless/13-schemaless.md b/docs/zh/14-reference/13-schemaless/13-schemaless.md
index b89f625376404677af21f0d48b77c3df5ebd748a..3aebd616a075394dbeddc9e608cd2a57bb8cf844 100644
--- a/docs/zh/14-reference/13-schemaless/13-schemaless.md
+++ b/docs/zh/14-reference/13-schemaless/13-schemaless.md
@@ -8,6 +8,8 @@ description: 'Schemaless 写入方式,可以免于预先创建超级表/子表
无模式写入方式建立的超级表及其对应的子表与通过 SQL 直接建立的超级表和子表完全没有区别,你也可以通过,SQL 语句直接向其中写入数据。需要注意的是,通过无模式写入方式建立的表,其表名是基于标签值按照固定的映射规则生成,所以无法明确地进行表意,缺乏可读性。
+注意:无模式写入会自动建表,不需要手动建表,手动建表的话可能会出现未知的错误。
+
## 无模式写入行协议
TDengine 的无模式写入的行协议兼容 InfluxDB 的 行协议(Line Protocol)、OpenTSDB 的 telnet 行协议、OpenTSDB 的 JSON 格式协议。但是使用这三种协议的时候,需要在 API 中指定输入内容使用解析协议的标准。
diff --git a/docs/zh/28-releases/01-tdengine.md b/docs/zh/28-releases/01-tdengine.md
index 31093ce5577b804dcc66978b2f13baa8c207795d..fd2be899eb475efcb189e0b80b5c6cf180557cb9 100644
--- a/docs/zh/28-releases/01-tdengine.md
+++ b/docs/zh/28-releases/01-tdengine.md
@@ -1,11 +1,19 @@
---
sidebar_label: TDengine 发布历史
-title: TDengine 发布历史
+title: TDengine 发布历史及下载链接
description: TDengine 发布历史、Release Notes 及下载链接
---
+TDengine 3.x 各版本安装包下载链接如下:
+
+TDengine 2.x 各版本安装包请访问[这里](https://www.taosdata.com/all-downloads)
+
import Release from "/components/ReleaseV3";
+## 3.0.1.7
+
+
+
## 3.0.1.6
@@ -33,4 +41,3 @@ import Release from "/components/ReleaseV3";
## 3.0.1.0
-
diff --git a/docs/zh/28-releases/02-tools.md b/docs/zh/28-releases/02-tools.md
index 2623391fb90c1ac7b12c8017c93fa57324e1981b..3f73b53fab46b8d57317c663cde5ffd54e66e1f8 100644
--- a/docs/zh/28-releases/02-tools.md
+++ b/docs/zh/28-releases/02-tools.md
@@ -1,11 +1,19 @@
---
sidebar_label: taosTools 发布历史
-title: taosTools 发布历史
+title: taosTools 发布历史及下载链接
description: taosTools 的发布历史、Release Notes 和下载链接
---
+taosTools 各版本安装包下载链接如下:
+
+其他历史版本安装包请访问[这里](https://www.taosdata.com/all-downloads)
+
import Release from "/components/ReleaseV3";
+## 2.2.9
+
+
+
## 2.2.7
diff --git a/examples/c/CMakeLists.txt b/examples/c/CMakeLists.txt
index 4a9007acecaa679dc716c5665eea7f0cd1e34dbb..37edc739e47b88236ee98c3ef0f1185c622abf9d 100644
--- a/examples/c/CMakeLists.txt
+++ b/examples/c/CMakeLists.txt
@@ -15,6 +15,7 @@ IF (TD_LINUX)
add_executable(tmq "")
add_executable(stream_demo "")
add_executable(demoapi "")
+ add_executable(api_reqid "")
target_sources(tmq
PRIVATE
@@ -31,6 +32,12 @@ IF (TD_LINUX)
"demoapi.c"
)
+ target_sources(api_reqid
+ PRIVATE
+ "api_with_reqid_test.c"
+ )
+
+
target_link_libraries(tmq
taos_static
)
@@ -43,6 +50,11 @@ IF (TD_LINUX)
taos_static
)
+ target_link_libraries(api_reqid
+ taos_static
+ )
+
+
target_include_directories(tmq
PUBLIC "${TD_SOURCE_DIR}/include/os"
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
@@ -58,9 +70,16 @@ IF (TD_LINUX)
PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
)
+ target_include_directories(api_reqid
+ PUBLIC "${TD_SOURCE_DIR}/include/client"
+ PUBLIC "${TD_SOURCE_DIR}/include/os"
+ PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}/inc"
+ )
+
SET_TARGET_PROPERTIES(tmq PROPERTIES OUTPUT_NAME tmq)
SET_TARGET_PROPERTIES(stream_demo PROPERTIES OUTPUT_NAME stream_demo)
SET_TARGET_PROPERTIES(demoapi PROPERTIES OUTPUT_NAME demoapi)
+ SET_TARGET_PROPERTIES(api_reqid PROPERTIES OUTPUT_NAME api_reqid)
ENDIF ()
IF (TD_DARWIN)
INCLUDE_DIRECTORIES(. ${TD_SOURCE_DIR}/src/inc ${TD_SOURCE_DIR}/src/client/inc ${TD_SOURCE_DIR}/inc)
diff --git a/examples/c/api_with_reqid_test.c b/examples/c/api_with_reqid_test.c
new file mode 100644
index 0000000000000000000000000000000000000000..003639ba0005e55ab3446451c02e28356adfca7b
--- /dev/null
+++ b/examples/c/api_with_reqid_test.c
@@ -0,0 +1,449 @@
+// sample code to verify all TDengine API
+// to compile: gcc -o apitest apitest.c -ltaos
+
+#include
+#include
+#include
+#include
+#include "taos.h"
+static int64_t count = 10000;
+
+int64_t genReqid() {
+ count += 100;
+ return count;
+}
+static void prepare_data(TAOS* taos) {
+ TAOS_RES* result;
+ result = taos_query_with_reqid(taos, "drop database if exists test;", genReqid());
+ taos_free_result(result);
+ usleep(100000);
+ result = taos_query_with_reqid(taos, "create database test precision 'us';", genReqid());
+ taos_free_result(result);
+ usleep(100000);
+ taos_select_db(taos, "test");
+
+ result = taos_query_with_reqid(taos, "create table meters(ts timestamp, a int) tags(area int);", genReqid());
+ taos_free_result(result);
+
+ result = taos_query_with_reqid(taos, "create table t0 using meters tags(0);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t1 using meters tags(1);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t2 using meters tags(2);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t3 using meters tags(3);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t4 using meters tags(4);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t5 using meters tags(5);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t6 using meters tags(6);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t7 using meters tags(7);", genReqid());
+ taos_free_result(result);
+ result = taos_query_with_reqid(taos, "create table t8 using meters tags(8);", genReqid());
+ taos_free_result(result);
+ result = taos_query(taos, "create table t9 using meters tags(9);");
+ taos_free_result(result);
+
+ result = taos_query_with_reqid(taos,
+ "insert into t0 values('2020-01-01 00:00:00.000', 0)"
+ " ('2020-01-01 00:01:00.000', 0)"
+ " ('2020-01-01 00:02:00.000', 0)"
+ " t1 values('2020-01-01 00:00:00.000', 0)"
+ " ('2020-01-01 00:01:00.000', 0)"
+ " ('2020-01-01 00:02:00.000', 0)"
+ " ('2020-01-01 00:03:00.000', 0)"
+ " t2 values('2020-01-01 00:00:00.000', 0)"
+ " ('2020-01-01 00:01:00.000', 0)"
+ " ('2020-01-01 00:01:01.000', 0)"
+ " ('2020-01-01 00:01:02.000', 0)"
+ " t3 values('2020-01-01 00:01:02.000', 0)"
+ " t4 values('2020-01-01 00:01:02.000', 0)"
+ " t5 values('2020-01-01 00:01:02.000', 0)"
+ " t6 values('2020-01-01 00:01:02.000', 0)"
+ " t7 values('2020-01-01 00:01:02.000', 0)"
+ " t8 values('2020-01-01 00:01:02.000', 0)"
+ " t9 values('2020-01-01 00:01:02.000', 0)",
+ genReqid());
+ int affected = taos_affected_rows(result);
+ if (affected != 18) {
+ printf("\033[31m%d rows affected by last insert statement, but it should be 18\033[0m\n", affected);
+ }
+ taos_free_result(result);
+ // super tables subscription
+ usleep(1000000);
+}
+
+static int print_result(TAOS_RES* res, int blockFetch) {
+ TAOS_ROW row = NULL;
+ int num_fields = taos_num_fields(res);
+ TAOS_FIELD* fields = taos_fetch_fields(res);
+ int nRows = 0;
+
+ if (blockFetch) {
+ int rows = 0;
+ while ((rows = taos_fetch_block(res, &row))) {
+ // for (int i = 0; i < rows; i++) {
+ // char temp[256];
+ // taos_print_row(temp, row + i, fields, num_fields);
+ // puts(temp);
+ // }
+ nRows += rows;
+ }
+ } else {
+ while ((row = taos_fetch_row(res))) {
+ char temp[256] = {0};
+ taos_print_row(temp, row, fields, num_fields);
+ puts(temp);
+ nRows++;
+ }
+ }
+
+ printf("%d rows consumed.\n", nRows);
+ return nRows;
+}
+
+static void check_row_count(int line, TAOS_RES* res, int expected) {
+ int actual = print_result(res, expected % 2);
+ if (actual != expected) {
+ printf("\033[31mline %d: row count mismatch, expected: %d, actual: %d\033[0m\n", line, expected, actual);
+ } else {
+ printf("line %d: %d rows consumed as expected\n", line, actual);
+ }
+}
+
+static void verify_query(TAOS* taos) {
+ prepare_data(taos);
+
+ int code = taos_load_table_info(taos, "t0,t1,t2,t3,t4,t5,t6,t7,t8,t9");
+ if (code != 0) {
+ printf("\033[31mfailed to load table info: 0x%08x\033[0m\n", code);
+ }
+
+ code = taos_validate_sql(taos, "select * from nonexisttable");
+ if (code == 0) {
+ printf("\033[31mimpossible, the table does not exists\033[0m\n");
+ }
+
+ code = taos_validate_sql(taos, "select * from meters");
+ if (code != 0) {
+ printf("\033[31mimpossible, the table does exists: 0x%08x\033[0m\n", code);
+ }
+
+ TAOS_RES* res = taos_query_with_reqid(taos, "select * from meters", genReqid());
+ check_row_count(__LINE__, res, 18);
+ printf("result precision is: %d\n", taos_result_precision(res));
+ int c = taos_field_count(res);
+ printf("field count is: %d\n", c);
+ int* lengths = taos_fetch_lengths(res);
+ for (int i = 0; i < c; i++) {
+ printf("length of column %d is %d\n", i, lengths[i]);
+ }
+ taos_free_result(res);
+
+ res = taos_query_with_reqid(taos, "select * from t0", genReqid());
+ check_row_count(__LINE__, res, 3);
+ taos_free_result(res);
+
+ res = taos_query_with_reqid(taos, "select * from nonexisttable", genReqid());
+ code = taos_errno(res);
+ printf("code=%d, error msg=%s\n", code, taos_errstr(res));
+ taos_free_result(res);
+
+ res = taos_query_with_reqid(taos, "select * from meters", genReqid());
+ taos_stop_query(res);
+ taos_free_result(res);
+}
+
+void retrieve_callback(void* param, TAOS_RES* tres, int numOfRows) {
+ if (numOfRows > 0) {
+ printf("%d rows async retrieved\n", numOfRows);
+ taos_fetch_rows_a(tres, retrieve_callback, param);
+ } else {
+ if (numOfRows < 0) {
+ printf("\033[31masync retrieve failed, code: %d\033[0m\n", numOfRows);
+ } else {
+ printf("async retrieve completed\n");
+ }
+ taos_free_result(tres);
+ }
+}
+
+void select_callback(void* param, TAOS_RES* tres, int code) {
+ if (code == 0 && tres) {
+ taos_fetch_rows_a(tres, retrieve_callback, param);
+ } else {
+ printf("\033[31masync select failed, code: %d\033[0m\n", code);
+ }
+}
+
+void verify_async(TAOS* taos) {
+ prepare_data(taos);
+ taos_query_a_with_reqid(taos, "select * from meters", select_callback, NULL, genReqid());
+ usleep(1000000);
+}
+
+int32_t verify_schema_less(TAOS* taos) {
+ TAOS_RES* result;
+ result = taos_query_with_reqid(taos, "drop database if exists test;", genReqid());
+ taos_free_result(result);
+ usleep(100000);
+ result = taos_query_with_reqid(taos, "create database test precision 'us' update 1;", genReqid());
+ taos_free_result(result);
+ usleep(100000);
+
+ taos_select_db(taos, "test");
+ result = taos_query_with_reqid(taos, "create stable ste(ts timestamp, f int) tags(t1 bigint)", genReqid());
+ taos_free_result(result);
+ usleep(100000);
+
+ int code = 0;
+
+ char* lines[] = {
+ "st,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns",
+ "st,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64 1626006833640000000ns",
+ "ste,t2=5f64,t3=L\"ste\" c1=true,c2=4i64,c3=\"iam\" 1626056811823316532ns",
+ "st,t1=4i64,t2=5f64,t3=\"t4\" c1=3i64,c3=L\"passitagain\",c2=true,c4=5f64 1626006833642000000ns",
+ "ste,t2=5f64,t3=L\"ste2\" c3=\"iamszhou\",c4=false 1626056811843316532ns",
+ "ste,t2=5f64,t3=L\"ste2\" c3=\"iamszhou\",c4=false,c5=32i8,c6=64i16,c7=32i32,c8=88.88f32 1626056812843316532ns",
+ "st,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 "
+ "1626006933640000000ns",
+ "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 "
+ "1626006933640000000ns",
+ "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 "
+ "1626006933641000000ns"};
+
+ taos_select_db(taos, "test");
+
+ TAOS_RES* res = taos_schemaless_insert_with_reqid(taos, lines, sizeof(lines) / sizeof(char*), TSDB_SML_LINE_PROTOCOL,
+ TSDB_SML_TIMESTAMP_NOT_CONFIGURED, genReqid());
+ if (taos_errno(res) != 0) {
+ printf("failed to insert schema-less data, reason: %s\n", taos_errstr(res));
+ } else {
+ int affectedRow = taos_affected_rows(res);
+ printf("successfully inserted %d rows\n", affectedRow);
+ }
+ taos_free_result(res);
+
+ return (code);
+}
+
+void veriry_stmt(TAOS* taos) {
+ TAOS_RES* result = taos_query(taos, "drop database if exists test;");
+ taos_free_result(result);
+ usleep(100000);
+ result = taos_query(taos, "create database test;");
+
+ int code = taos_errno(result);
+ if (code != 0) {
+ printf("\033[31mfailed to create database, reason:%s\033[0m\n", taos_errstr(result));
+ taos_free_result(result);
+ return;
+ }
+ taos_free_result(result);
+
+ usleep(100000);
+ taos_select_db(taos, "test");
+
+ // create table
+ const char* sql =
+ "create table m1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin "
+ "binary(40), blob nchar(10))";
+ result = taos_query(taos, sql);
+ code = taos_errno(result);
+ if (code != 0) {
+ printf("\033[31mfailed to create table, reason:%s\033[0m\n", taos_errstr(result));
+ taos_free_result(result);
+ return;
+ }
+ taos_free_result(result);
+
+ // insert 10 records
+ struct {
+ int64_t ts[10];
+ int8_t b[10];
+ int8_t v1[10];
+ int16_t v2[10];
+ int32_t v4[10];
+ int64_t v8[10];
+ float f4[10];
+ double f8[10];
+ char bin[10][40];
+ char blob[10][80];
+ } v;
+
+ int32_t* t8_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t16_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t32_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t64_len = malloc(sizeof(int32_t) * 10);
+ int32_t* float_len = malloc(sizeof(int32_t) * 10);
+ int32_t* double_len = malloc(sizeof(int32_t) * 10);
+ int32_t* bin_len = malloc(sizeof(int32_t) * 10);
+ int32_t* blob_len = malloc(sizeof(int32_t) * 10);
+
+ TAOS_STMT* stmt = taos_stmt_init_with_reqid(taos, genReqid());
+ TAOS_MULTI_BIND params[10];
+ char is_null[10] = {0};
+
+ params[0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
+ params[0].buffer_length = sizeof(v.ts[0]);
+ params[0].buffer = v.ts;
+ params[0].length = t64_len;
+ params[0].is_null = is_null;
+ params[0].num = 10;
+
+ params[1].buffer_type = TSDB_DATA_TYPE_BOOL;
+ params[1].buffer_length = sizeof(v.b[0]);
+ params[1].buffer = v.b;
+ params[1].length = t8_len;
+ params[1].is_null = is_null;
+ params[1].num = 10;
+
+ params[2].buffer_type = TSDB_DATA_TYPE_TINYINT;
+ params[2].buffer_length = sizeof(v.v1[0]);
+ params[2].buffer = v.v1;
+ params[2].length = t8_len;
+ params[2].is_null = is_null;
+ params[2].num = 10;
+
+ params[3].buffer_type = TSDB_DATA_TYPE_SMALLINT;
+ params[3].buffer_length = sizeof(v.v2[0]);
+ params[3].buffer = v.v2;
+ params[3].length = t16_len;
+ params[3].is_null = is_null;
+ params[3].num = 10;
+
+ params[4].buffer_type = TSDB_DATA_TYPE_INT;
+ params[4].buffer_length = sizeof(v.v4[0]);
+ params[4].buffer = v.v4;
+ params[4].length = t32_len;
+ params[4].is_null = is_null;
+ params[4].num = 10;
+
+ params[5].buffer_type = TSDB_DATA_TYPE_BIGINT;
+ params[5].buffer_length = sizeof(v.v8[0]);
+ params[5].buffer = v.v8;
+ params[5].length = t64_len;
+ params[5].is_null = is_null;
+ params[5].num = 10;
+
+ params[6].buffer_type = TSDB_DATA_TYPE_FLOAT;
+ params[6].buffer_length = sizeof(v.f4[0]);
+ params[6].buffer = v.f4;
+ params[6].length = float_len;
+ params[6].is_null = is_null;
+ params[6].num = 10;
+
+ params[7].buffer_type = TSDB_DATA_TYPE_DOUBLE;
+ params[7].buffer_length = sizeof(v.f8[0]);
+ params[7].buffer = v.f8;
+ params[7].length = double_len;
+ params[7].is_null = is_null;
+ params[7].num = 10;
+
+ params[8].buffer_type = TSDB_DATA_TYPE_BINARY;
+ params[8].buffer_length = sizeof(v.bin[0]);
+ params[8].buffer = v.bin;
+ params[8].length = bin_len;
+ params[8].is_null = is_null;
+ params[8].num = 10;
+
+ params[9].buffer_type = TSDB_DATA_TYPE_NCHAR;
+ params[9].buffer_length = sizeof(v.blob[0]);
+ params[9].buffer = v.blob;
+ params[9].length = blob_len;
+ params[9].is_null = is_null;
+ params[9].num = 10;
+
+ sql = "insert into ? (ts, b, v1, v2, v4, v8, f4, f8, bin, blob) values(?,?,?,?,?,?,?,?,?,?)";
+ code = taos_stmt_prepare(stmt, sql, 0);
+ if (code != 0) {
+ printf("\033[31mfailed to execute taos_stmt_prepare. error:%s\033[0m\n", taos_stmt_errstr(stmt));
+ taos_stmt_close(stmt);
+ return;
+ }
+
+ code = taos_stmt_set_tbname(stmt, "m1");
+ if (code != 0) {
+ printf("\033[31mfailed to execute taos_stmt_prepare. error:%s\033[0m\n", taos_stmt_errstr(stmt));
+ taos_stmt_close(stmt);
+ return;
+ }
+
+ int64_t ts = 1591060628000;
+ for (int i = 0; i < 10; ++i) {
+ v.ts[i] = ts++;
+ is_null[i] = 0;
+
+ v.b[i] = (int8_t)i % 2;
+ v.v1[i] = (int8_t)i;
+ v.v2[i] = (int16_t)(i * 2);
+ v.v4[i] = (int32_t)(i * 4);
+ v.v8[i] = (int64_t)(i * 8);
+ v.f4[i] = (float)(i * 40);
+ v.f8[i] = (double)(i * 80);
+ for (int j = 0; j < sizeof(v.bin[0]); ++j) {
+ v.bin[i][j] = (char)(i + '0');
+ }
+ strcpy(v.blob[i], "一二三四五六七八九十");
+
+ t8_len[i] = sizeof(int8_t);
+ t16_len[i] = sizeof(int16_t);
+ t32_len[i] = sizeof(int32_t);
+ t64_len[i] = sizeof(int64_t);
+ float_len[i] = sizeof(float);
+ double_len[i] = sizeof(double);
+ bin_len[i] = sizeof(v.bin[0]);
+ blob_len[i] = (int32_t)strlen(v.blob[i]);
+ }
+
+ taos_stmt_bind_param_batch(stmt, params);
+ taos_stmt_add_batch(stmt);
+
+ if (taos_stmt_execute(stmt) != 0) {
+ printf("\033[31mfailed to execute insert statement.error:%s\033[0m\n", taos_stmt_errstr(stmt));
+ taos_stmt_close(stmt);
+ return;
+ }
+
+ taos_stmt_close(stmt);
+
+ free(t8_len);
+ free(t16_len);
+ free(t32_len);
+ free(t64_len);
+ free(float_len);
+ free(double_len);
+ free(bin_len);
+ free(blob_len);
+}
+
+int main(int argc, char* argv[]) {
+ const char* host = "127.0.0.1";
+ const char* user = "root";
+ const char* passwd = "taosdata";
+
+ taos_options(TSDB_OPTION_TIMEZONE, "GMT-8");
+ TAOS* taos = taos_connect(host, user, passwd, "", 0);
+ if (taos == NULL) {
+ printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
+ exit(1);
+ }
+
+ printf("************ verify schema-less *************\n");
+ verify_schema_less(taos);
+
+ printf("************ verify query *************\n");
+ verify_query(taos);
+
+ printf("********* verify async query **********\n");
+ verify_async(taos);
+
+ printf("********* verify stmt query **********\n");
+ veriry_stmt(taos);
+
+ printf("done\n");
+ taos_close(taos);
+ taos_cleanup();
+}
diff --git a/examples/c/apitest.c b/examples/c/apitest.c
index 9f4c7678ec059dbb3f0d4d43f0fc5adb277243d3..c179acaf4ef086a702e3130d8ae7effade0f09b9 100644
--- a/examples/c/apitest.c
+++ b/examples/c/apitest.c
@@ -1,8 +1,8 @@
// sample code to verify all TDengine API
// to compile: gcc -o apitest apitest.c -ltaos
-#include "taoserror.h"
#include "cJSON.h"
+#include "taoserror.h"
#include
#include
@@ -11,7 +11,7 @@
#include "../../../include/client/taos.h"
static void prepare_data(TAOS* taos) {
- TAOS_RES *result;
+ TAOS_RES* result;
result = taos_query(taos, "drop database if exists test;");
taos_free_result(result);
usleep(100000);
@@ -44,24 +44,25 @@ static void prepare_data(TAOS* taos) {
result = taos_query(taos, "create table t9 using meters tags(9);");
taos_free_result(result);
- result = taos_query(taos, "insert into t0 values('2020-01-01 00:00:00.000', 0)"
- " ('2020-01-01 00:01:00.000', 0)"
- " ('2020-01-01 00:02:00.000', 0)"
- " t1 values('2020-01-01 00:00:00.000', 0)"
- " ('2020-01-01 00:01:00.000', 0)"
- " ('2020-01-01 00:02:00.000', 0)"
- " ('2020-01-01 00:03:00.000', 0)"
- " t2 values('2020-01-01 00:00:00.000', 0)"
- " ('2020-01-01 00:01:00.000', 0)"
- " ('2020-01-01 00:01:01.000', 0)"
- " ('2020-01-01 00:01:02.000', 0)"
- " t3 values('2020-01-01 00:01:02.000', 0)"
- " t4 values('2020-01-01 00:01:02.000', 0)"
- " t5 values('2020-01-01 00:01:02.000', 0)"
- " t6 values('2020-01-01 00:01:02.000', 0)"
- " t7 values('2020-01-01 00:01:02.000', 0)"
- " t8 values('2020-01-01 00:01:02.000', 0)"
- " t9 values('2020-01-01 00:01:02.000', 0)");
+ result = taos_query(taos,
+ "insert into t0 values('2020-01-01 00:00:00.000', 0)"
+ " ('2020-01-01 00:01:00.000', 0)"
+ " ('2020-01-01 00:02:00.000', 0)"
+ " t1 values('2020-01-01 00:00:00.000', 0)"
+ " ('2020-01-01 00:01:00.000', 0)"
+ " ('2020-01-01 00:02:00.000', 0)"
+ " ('2020-01-01 00:03:00.000', 0)"
+ " t2 values('2020-01-01 00:00:00.000', 0)"
+ " ('2020-01-01 00:01:00.000', 0)"
+ " ('2020-01-01 00:01:01.000', 0)"
+ " ('2020-01-01 00:01:02.000', 0)"
+ " t3 values('2020-01-01 00:01:02.000', 0)"
+ " t4 values('2020-01-01 00:01:02.000', 0)"
+ " t5 values('2020-01-01 00:01:02.000', 0)"
+ " t6 values('2020-01-01 00:01:02.000', 0)"
+ " t7 values('2020-01-01 00:01:02.000', 0)"
+ " t8 values('2020-01-01 00:01:02.000', 0)"
+ " t9 values('2020-01-01 00:01:02.000', 0)");
int affected = taos_affected_rows(result);
if (affected != 18) {
printf("\033[31m%d rows affected by last insert statement, but it should be 18\033[0m\n", affected);
@@ -80,11 +81,11 @@ static int print_result(TAOS_RES* res, int blockFetch) {
if (blockFetch) {
int rows = 0;
while ((rows = taos_fetch_block(res, &row))) {
- //for (int i = 0; i < rows; i++) {
- // char temp[256];
- // taos_print_row(temp, row + i, fields, num_fields);
- // puts(temp);
- //}
+ // for (int i = 0; i < rows; i++) {
+ // char temp[256];
+ // taos_print_row(temp, row + i, fields, num_fields);
+ // puts(temp);
+ // }
nRows += rows;
}
} else {
@@ -127,32 +128,32 @@ static void verify_query(TAOS* taos) {
printf("\033[31mimpossible, the table does exists: 0x%08x\033[0m\n", code);
}
- TAOS_RES* res = taos_query(taos, "select * from meters");
+ TAOS_RES* res = taos_query_with_reqid(taos, "select * from meters", genReqid());
check_row_count(__LINE__, res, 18);
- printf("result precision is: %d\n", taos_result_precision(res));
+ printf("result precision is: %d\n", taos_result_precision(res));
int c = taos_field_count(res);
- printf("field count is: %d\n", c);
+ printf("field count is: %d\n", c);
int* lengths = taos_fetch_lengths(res);
for (int i = 0; i < c; i++) {
printf("length of column %d is %d\n", i, lengths[i]);
}
taos_free_result(res);
- res = taos_query(taos, "select * from t0");
+ res = taos_query_with_reqid(taos, "select * from t0", genReqid());
check_row_count(__LINE__, res, 3);
taos_free_result(res);
- res = taos_query(taos, "select * from nonexisttable");
+ res = taos_query_with_reqid(taos, "select * from nonexisttable", genReqid());
code = taos_errno(res);
printf("code=%d, error msg=%s\n", code, taos_errstr(res));
taos_free_result(res);
- res = taos_query(taos, "select * from meters");
+ res = taos_query_with_reqid(taos, "select * from meters", genReqid());
taos_stop_query(res);
taos_free_result(res);
}
-void subscribe_callback(TAOS_SUB* tsub, TAOS_RES *res, void* param, int code) {
+void subscribe_callback(TAOS_SUB* tsub, TAOS_RES* res, void* param, int code) {
int rows = print_result(res, *(int*)param);
printf("%d rows consumed in subscribe_callback\n", rows);
}
@@ -167,7 +168,7 @@ static void verify_subscribe(TAOS* taos) {
res = taos_consume(tsub);
check_row_count(__LINE__, res, 0);
- TAOS_RES *result;
+ TAOS_RES* result;
result = taos_query(taos, "insert into t0 values('2020-01-01 00:02:00.001', 0);");
taos_free_result(result);
result = taos_query(taos, "insert into t8 values('2020-01-01 00:01:03.000', 0);");
@@ -253,8 +254,10 @@ void verify_prepare(TAOS* taos) {
taos_select_db(taos, "test");
// create table
- const char* sql = "create table m1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin binary(40), blob nchar(10))";
- result = taos_query(taos, sql);
+ const char* sql =
+ "create table m1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin "
+ "binary(40), blob nchar(10))";
+ result = taos_query_with_reqid(taos, sql, genReqid());
code = taos_errno(result);
if (code != 0) {
printf("\033[31mfailed to create table, reason:%s\033[0m\n", taos_errstr(result));
@@ -265,20 +268,20 @@ void verify_prepare(TAOS* taos) {
// insert 10 records
struct {
- int64_t ts;
- int8_t b;
- int8_t v1;
- int16_t v2;
- int32_t v4;
- int64_t v8;
- float f4;
- double f8;
- char bin[40];
- char blob[80];
+ int64_t ts;
+ int8_t b;
+ int8_t v1;
+ int16_t v2;
+ int32_t v4;
+ int64_t v8;
+ float f4;
+ double f8;
+ char bin[40];
+ char blob[80];
} v = {0};
TAOS_STMT* stmt = taos_stmt_init(taos);
- TAOS_BIND params[10];
+ TAOS_BIND params[10];
params[0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
params[0].buffer_length = sizeof(v.ts);
params[0].buffer = &v.ts;
@@ -344,7 +347,7 @@ void verify_prepare(TAOS* taos) {
sql = "insert into m1 values(?,?,?,?,?,?,?,?,?,?)";
code = taos_stmt_prepare(stmt, sql, 0);
- if (code != 0){
+ if (code != 0) {
printf("\033[31mfailed to execute taos_stmt_prepare. error:%s\033[0m\n", taos_stmt_errstr(stmt));
taos_stmt_close(stmt);
return;
@@ -393,7 +396,7 @@ void verify_prepare(TAOS* taos) {
TAOS_ROW row;
int rows = 0;
int num_fields = taos_num_fields(result);
- TAOS_FIELD *fields = taos_fetch_fields(result);
+ TAOS_FIELD* fields = taos_fetch_fields(result);
// fetch the records row by row
while ((row = taos_fetch_row(result))) {
@@ -425,7 +428,9 @@ void verify_prepare2(TAOS* taos) {
taos_select_db(taos, "test");
// create table
- const char* sql = "create table m1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin binary(40), blob nchar(10))";
+ const char* sql =
+ "create table m1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin "
+ "binary(40), blob nchar(10))";
result = taos_query(taos, sql);
code = taos_errno(result);
if (code != 0) {
@@ -437,31 +442,31 @@ void verify_prepare2(TAOS* taos) {
// insert 10 records
struct {
- int64_t ts[10];
- int8_t b[10];
- int8_t v1[10];
- int16_t v2[10];
- int32_t v4[10];
- int64_t v8[10];
- float f4[10];
- double f8[10];
- char bin[10][40];
- char blob[10][80];
+ int64_t ts[10];
+ int8_t b[10];
+ int8_t v1[10];
+ int16_t v2[10];
+ int32_t v4[10];
+ int64_t v8[10];
+ float f4[10];
+ double f8[10];
+ char bin[10][40];
+ char blob[10][80];
} v;
- int32_t *t8_len = malloc(sizeof(int32_t) * 10);
- int32_t *t16_len = malloc(sizeof(int32_t) * 10);
- int32_t *t32_len = malloc(sizeof(int32_t) * 10);
- int32_t *t64_len = malloc(sizeof(int32_t) * 10);
- int32_t *float_len = malloc(sizeof(int32_t) * 10);
- int32_t *double_len = malloc(sizeof(int32_t) * 10);
- int32_t *bin_len = malloc(sizeof(int32_t) * 10);
- int32_t *blob_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t8_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t16_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t32_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t64_len = malloc(sizeof(int32_t) * 10);
+ int32_t* float_len = malloc(sizeof(int32_t) * 10);
+ int32_t* double_len = malloc(sizeof(int32_t) * 10);
+ int32_t* bin_len = malloc(sizeof(int32_t) * 10);
+ int32_t* blob_len = malloc(sizeof(int32_t) * 10);
- TAOS_STMT* stmt = taos_stmt_init(taos);
+ TAOS_STMT* stmt = taos_stmt_init(taos);
TAOS_MULTI_BIND params[10];
- char is_null[10] = {0};
-
+ char is_null[10] = {0};
+
params[0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
params[0].buffer_length = sizeof(v.ts[0]);
params[0].buffer = v.ts;
@@ -541,12 +546,12 @@ void verify_prepare2(TAOS* taos) {
}
code = taos_stmt_set_tbname(stmt, "m1");
- if (code != 0){
+ if (code != 0) {
printf("\033[31mfailed to execute taos_stmt_prepare. error:%s\033[0m\n", taos_stmt_errstr(stmt));
taos_stmt_close(stmt);
return;
}
-
+
int64_t ts = 1591060628000;
for (int i = 0; i < 10; ++i) {
v.ts[i] = ts++;
@@ -561,7 +566,7 @@ void verify_prepare2(TAOS* taos) {
v.f8[i] = (double)(i * 80);
for (int j = 0; j < sizeof(v.bin[0]); ++j) {
v.bin[i][j] = (char)(i + '0');
- }
+ }
strcpy(v.blob[i], "一二三四五六七八九十");
t8_len[i] = sizeof(int8_t);
@@ -576,7 +581,7 @@ void verify_prepare2(TAOS* taos) {
taos_stmt_bind_param_batch(stmt, params);
taos_stmt_add_batch(stmt);
-
+
if (taos_stmt_execute(stmt) != 0) {
printf("\033[31mfailed to execute insert statement.error:%s\033[0m\n", taos_stmt_errstr(stmt));
taos_stmt_close(stmt);
@@ -590,7 +595,7 @@ void verify_prepare2(TAOS* taos) {
taos_stmt_prepare(stmt, "SELECT * FROM m1 WHERE v1 > ? AND v2 < ?", 0);
TAOS_BIND qparams[2];
- int8_t v1 = 5;
+ int8_t v1 = 5;
int16_t v2 = 15;
qparams[0].buffer_type = TSDB_DATA_TYPE_TINYINT;
qparams[0].buffer_length = sizeof(v1);
@@ -607,7 +612,7 @@ void verify_prepare2(TAOS* taos) {
taos_stmt_bind_param(stmt, qparams);
if (taos_stmt_execute(stmt) != 0) {
printf("\033[31mfailed to execute select statement.error:%s\033[0m\n", taos_stmt_errstr(stmt));
- taos_stmt_close(stmt);
+ taos_stmt_close(stmt);
return;
}
@@ -616,7 +621,7 @@ void verify_prepare2(TAOS* taos) {
TAOS_ROW row;
int rows = 0;
int num_fields = taos_num_fields(result);
- TAOS_FIELD *fields = taos_fetch_fields(result);
+ TAOS_FIELD* fields = taos_fetch_fields(result);
// fetch the records row by row
while ((row = taos_fetch_row(result))) {
@@ -657,7 +662,9 @@ void verify_prepare3(TAOS* taos) {
taos_select_db(taos, "test");
// create table
- const char* sql = "create stable st1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin binary(40), blob nchar(10)) tags (id1 int, id2 binary(40))";
+ const char* sql =
+ "create stable st1 (ts timestamp, b bool, v1 tinyint, v2 smallint, v4 int, v8 bigint, f4 float, f8 double, bin "
+ "binary(40), blob nchar(10)) tags (id1 int, id2 binary(40))";
result = taos_query(taos, sql);
code = taos_errno(result);
if (code != 0) {
@@ -669,10 +676,10 @@ void verify_prepare3(TAOS* taos) {
TAOS_BIND tags[2];
- int32_t id1 = 1;
- char id2[40] = "abcdefghijklmnopqrstuvwxyz0123456789";
+ int32_t id1 = 1;
+ char id2[40] = "abcdefghijklmnopqrstuvwxyz0123456789";
uintptr_t id2_len = strlen(id2);
-
+
tags[0].buffer_type = TSDB_DATA_TYPE_INT;
tags[0].buffer_length = sizeof(int);
tags[0].buffer = &id1;
@@ -685,34 +692,33 @@ void verify_prepare3(TAOS* taos) {
tags[1].length = &id2_len;
tags[1].is_null = NULL;
-
// insert 10 records
struct {
- int64_t ts[10];
- int8_t b[10];
- int8_t v1[10];
- int16_t v2[10];
- int32_t v4[10];
- int64_t v8[10];
- float f4[10];
- double f8[10];
- char bin[10][40];
- char blob[10][80];
+ int64_t ts[10];
+ int8_t b[10];
+ int8_t v1[10];
+ int16_t v2[10];
+ int32_t v4[10];
+ int64_t v8[10];
+ float f4[10];
+ double f8[10];
+ char bin[10][40];
+ char blob[10][80];
} v;
- int32_t *t8_len = malloc(sizeof(int32_t) * 10);
- int32_t *t16_len = malloc(sizeof(int32_t) * 10);
- int32_t *t32_len = malloc(sizeof(int32_t) * 10);
- int32_t *t64_len = malloc(sizeof(int32_t) * 10);
- int32_t *float_len = malloc(sizeof(int32_t) * 10);
- int32_t *double_len = malloc(sizeof(int32_t) * 10);
- int32_t *bin_len = malloc(sizeof(int32_t) * 10);
- int32_t *blob_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t8_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t16_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t32_len = malloc(sizeof(int32_t) * 10);
+ int32_t* t64_len = malloc(sizeof(int32_t) * 10);
+ int32_t* float_len = malloc(sizeof(int32_t) * 10);
+ int32_t* double_len = malloc(sizeof(int32_t) * 10);
+ int32_t* bin_len = malloc(sizeof(int32_t) * 10);
+ int32_t* blob_len = malloc(sizeof(int32_t) * 10);
- TAOS_STMT* stmt = taos_stmt_init(taos);
+ TAOS_STMT* stmt = taos_stmt_init(taos);
TAOS_MULTI_BIND params[10];
- char is_null[10] = {0};
-
+ char is_null[10] = {0};
+
params[0].buffer_type = TSDB_DATA_TYPE_TIMESTAMP;
params[0].buffer_length = sizeof(v.ts[0]);
params[0].buffer = v.ts;
@@ -783,27 +789,26 @@ void verify_prepare3(TAOS* taos) {
params[9].is_null = is_null;
params[9].num = 10;
-
sql = "insert into ? using st1 tags(?,?) values(?,?,?,?,?,?,?,?,?,?)";
code = taos_stmt_prepare(stmt, sql, 0);
- if (code != 0){
+ if (code != 0) {
printf("\033[31mfailed to execute taos_stmt_prepare. error:%s\033[0m\n", taos_stmt_errstr(stmt));
taos_stmt_close(stmt);
- return;
+ return;
}
code = taos_stmt_set_tbname_tags(stmt, "m1", tags);
- if (code != 0){
+ if (code != 0) {
printf("\033[31mfailed to execute taos_stmt_prepare. error:%s\033[0m\n", taos_stmt_errstr(stmt));
- taos_stmt_close(stmt);
+ taos_stmt_close(stmt);
return;
}
-
+
int64_t ts = 1591060628000;
for (int i = 0; i < 10; ++i) {
v.ts[i] = ts++;
is_null[i] = 0;
-
+
v.b[i] = (int8_t)i % 2;
v.v1[i] = (int8_t)i;
v.v2[i] = (int16_t)(i * 2);
@@ -813,7 +818,7 @@ void verify_prepare3(TAOS* taos) {
v.f8[i] = (double)(i * 80);
for (int j = 0; j < sizeof(v.bin[0]); ++j) {
v.bin[i][j] = (char)(i + '0');
- }
+ }
strcpy(v.blob[i], "一二三四五六七八九十");
t8_len[i] = sizeof(int8_t);
@@ -828,10 +833,10 @@ void verify_prepare3(TAOS* taos) {
taos_stmt_bind_param_batch(stmt, params);
taos_stmt_add_batch(stmt);
-
+
if (taos_stmt_execute(stmt) != 0) {
printf("\033[31mfailed to execute insert statement.error:%s\033[0m\n", taos_stmt_errstr(stmt));
- taos_stmt_close(stmt);
+ taos_stmt_close(stmt);
return;
}
taos_stmt_close(stmt);
@@ -842,7 +847,7 @@ void verify_prepare3(TAOS* taos) {
TAOS_BIND qparams[2];
- int8_t v1 = 5;
+ int8_t v1 = 5;
int16_t v2 = 15;
qparams[0].buffer_type = TSDB_DATA_TYPE_TINYINT;
qparams[0].buffer_length = sizeof(v1);
@@ -859,7 +864,7 @@ void verify_prepare3(TAOS* taos) {
taos_stmt_bind_param(stmt, qparams);
if (taos_stmt_execute(stmt) != 0) {
printf("\033[31mfailed to execute select statement.error:%s\033[0m\n", taos_stmt_errstr(stmt));
- taos_stmt_close(stmt);
+ taos_stmt_close(stmt);
return;
}
@@ -868,7 +873,7 @@ void verify_prepare3(TAOS* taos) {
TAOS_ROW row;
int rows = 0;
int num_fields = taos_num_fields(result);
- TAOS_FIELD *fields = taos_fetch_fields(result);
+ TAOS_FIELD* fields = taos_fetch_fields(result);
// fetch the records row by row
while ((row = taos_fetch_row(result))) {
@@ -891,8 +896,7 @@ void verify_prepare3(TAOS* taos) {
free(blob_len);
}
-void retrieve_callback(void *param, TAOS_RES *tres, int numOfRows)
-{
+void retrieve_callback(void* param, TAOS_RES* tres, int numOfRows) {
if (numOfRows > 0) {
printf("%d rows async retrieved\n", numOfRows);
taos_fetch_rows_a(tres, retrieve_callback, param);
@@ -906,8 +910,7 @@ void retrieve_callback(void *param, TAOS_RES *tres, int numOfRows)
}
}
-void select_callback(void *param, TAOS_RES *tres, int code)
-{
+void select_callback(void* param, TAOS_RES* tres, int code) {
if (code == 0 && tres) {
taos_fetch_rows_a(tres, retrieve_callback, param);
} else {
@@ -921,11 +924,11 @@ void verify_async(TAOS* taos) {
usleep(1000000);
}
-void stream_callback(void *param, TAOS_RES *res, TAOS_ROW row) {
+void stream_callback(void* param, TAOS_RES* res, TAOS_ROW row) {
if (res == NULL || row == NULL) {
return;
}
-
+
int num_fields = taos_num_fields(res);
TAOS_FIELD* fields = taos_fetch_fields(res);
@@ -937,14 +940,9 @@ void stream_callback(void *param, TAOS_RES *res, TAOS_ROW row) {
void verify_stream(TAOS* taos) {
prepare_data(taos);
- TAOS_STREAM* strm = taos_open_stream(
- taos,
- "select count(*) from meters interval(1m)",
- stream_callback,
- 0,
- NULL,
- NULL);
- printf("waiting for stream data\n");
+ TAOS_STREAM* strm =
+ taos_open_stream(taos, "select count(*) from meters interval(1m)", stream_callback, 0, NULL, NULL);
+ printf("waiting for stream data\n");
usleep(100000);
TAOS_RES* result = taos_query(taos, "insert into t0 values(now, 0)(now+5s,1)(now+10s, 2);");
taos_free_result(result);
@@ -953,7 +951,7 @@ void verify_stream(TAOS* taos) {
}
int32_t verify_schema_less(TAOS* taos) {
- TAOS_RES *result;
+ TAOS_RES* result;
result = taos_query(taos, "drop database if exists test;");
taos_free_result(result);
usleep(100000);
@@ -975,50 +973,52 @@ int32_t verify_schema_less(TAOS* taos) {
"st,t1=4i64,t2=5f64,t3=\"t4\" c1=3i64,c3=L\"passitagain\",c2=true,c4=5f64 1626006833642000000ns",
"ste,t2=5f64,t3=L\"ste2\" c3=\"iamszhou\",c4=false 1626056811843316532ns",
"ste,t2=5f64,t3=L\"ste2\" c3=\"iamszhou\",c4=false,c5=32i8,c6=64i16,c7=32i32,c8=88.88f32 1626056812843316532ns",
- "st,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000ns",
- "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 1626006933640000000ns",
- "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 1626006933641000000ns"
- };
+ "st,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 "
+ "1626006933640000000ns",
+ "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64,c6=7u64 "
+ "1626006933640000000ns",
+ "stf,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 "
+ "1626006933641000000ns"};
- code = taos_insert_lines(taos, lines , sizeof(lines)/sizeof(char*));
+ code = taos_insert_lines(taos, lines, sizeof(lines) / sizeof(char*));
char* lines2[] = {
"stg,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns",
- "stg,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64 1626006833640000000ns"
- };
+ "stg,t1=4i64,t3=\"t4\",t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin\",c2=true,c4=5f64,c5=5f64 1626006833640000000ns"};
code = taos_insert_lines(taos, &lines2[0], 1);
code = taos_insert_lines(taos, &lines2[1], 1);
char* lines3[] = {
- "sth,t1=4i64,t2=5f64,t4=5f64,ID=\"childtable\" c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 1626006933641ms",
- "sth,t1=4i64,t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 1626006933654ms"
- };
+ "sth,t1=4i64,t2=5f64,t4=5f64,ID=\"childtable\" c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 "
+ "1626006933641ms",
+ "sth,t1=4i64,t2=5f64,t4=5f64 c1=3i64,c3=L\"passitagin_stf\",c2=false,c5=5f64,c6=7u64 1626006933654ms"};
code = taos_insert_lines(taos, lines3, 2);
- char* lines4[] = {
- "st123456,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns",
- "dgtyqodr,t2=5f64,t3=L\"ste\" c1=tRue,c2=4i64,c3=\"iam\" 1626056811823316532ns"
- };
+ char* lines4[] = {"st123456,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns",
+ "dgtyqodr,t2=5f64,t3=L\"ste\" c1=tRue,c2=4i64,c3=\"iam\" 1626056811823316532ns"};
code = taos_insert_lines(taos, lines4, 2);
char* lines5[] = {
- "zqlbgs,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000ns",
- "zqlbgs,t9=f,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t11=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\",t10=L\"ncharTagValue\" c10=f,c0=f,c1=127i8,c12=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64,c11=L\"ncharColValue\" 1626006833639000000ns"
- };
+ "zqlbgs,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=11."
+ "12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\" "
+ "c0=f,c1=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22.123456789f64,c7="
+ "\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64 1626006833639000000ns",
+ "zqlbgs,t9=f,id=\"zqlbgs_39302_21680\",t0=f,t1=127i8,t11=127i8,t2=32767i16,t3=2147483647i32,t4="
+ "9223372036854775807i64,t5=11.12345f32,t6=22.123456789f64,t7=\"binaryTagValue\",t8=L\"ncharTagValue\",t10="
+ "L\"ncharTagValue\" "
+ "c10=f,c0=f,c1=127i8,c12=127i8,c2=32767i16,c3=2147483647i32,c4=9223372036854775807i64,c5=11.12345f32,c6=22."
+ "123456789f64,c7=\"binaryColValue\",c8=L\"ncharColValue\",c9=7u64,c11=L\"ncharColValue\" 1626006833639000000ns"};
code = taos_insert_lines(taos, &lines5[0], 1);
code = taos_insert_lines(taos, &lines5[1], 1);
-
- char* lines6[] = {
- "st123456,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns",
- "dgtyqodr,t2=5f64,t3=L\"ste\" c1=tRue,c2=4i64,c3=\"iam\" 1626056811823316532ns"
- };
+ char* lines6[] = {"st123456,t1=3i64,t2=4f64,t3=\"t3\" c1=3i64,c3=L\"passit\",c2=false,c4=4f64 1626006833639000000ns",
+ "dgtyqodr,t2=5f64,t3=L\"ste\" c1=tRue,c2=4i64,c3=\"iam\" 1626056811823316532ns"};
code = taos_insert_lines(taos, lines6, 2);
return (code);
}
void verify_telnet_insert(TAOS* taos) {
- TAOS_RES *result;
+ TAOS_RES* result;
result = taos_query(taos, "drop database if exists db;");
taos_free_result(result);
@@ -1043,12 +1043,9 @@ void verify_telnet_insert(TAOS* taos) {
/* timestamp */
char* lines1[] = {
- "stb1 1626006833s 1i8 host=\"host0\"",
- "stb1 1626006833639000000ns 2i8 host=\"host0\"",
- "stb1 1626006833640000us 3i8 host=\"host0\"",
- "stb1 1626006833641123 4i8 host=\"host0\"",
- "stb1 1626006833651ms 5i8 host=\"host0\"",
- "stb1 0 6i8 host=\"host0\"",
+ "stb1 1626006833s 1i8 host=\"host0\"", "stb1 1626006833639000000ns 2i8 host=\"host0\"",
+ "stb1 1626006833640000us 3i8 host=\"host0\"", "stb1 1626006833641123 4i8 host=\"host0\"",
+ "stb1 1626006833651ms 5i8 host=\"host0\"", "stb1 0 6i8 host=\"host0\"",
};
code = taos_insert_telnet_lines(taos, lines1, 6);
if (code) {
@@ -1056,113 +1053,83 @@ void verify_telnet_insert(TAOS* taos) {
}
/* metric value */
- //tinyin
- char* lines2_0[] = {
- "stb2_0 1626006833651ms -127i8 host=\"host0\"",
- "stb2_0 1626006833652ms 127i8 host=\"host0\""
- };
+ // tinyin
+ char* lines2_0[] = {"stb2_0 1626006833651ms -127i8 host=\"host0\"", "stb2_0 1626006833652ms 127i8 host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_0, 2);
if (code) {
printf("lines2_0 code: %d, %s.\n", code, tstrerror(code));
}
- //smallint
- char* lines2_1[] = {
- "stb2_1 1626006833651ms -32767i16 host=\"host0\"",
- "stb2_1 1626006833652ms 32767i16 host=\"host0\""
- };
+ // smallint
+ char* lines2_1[] = {"stb2_1 1626006833651ms -32767i16 host=\"host0\"",
+ "stb2_1 1626006833652ms 32767i16 host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_1, 2);
if (code) {
printf("lines2_1 code: %d, %s.\n", code, tstrerror(code));
}
- //int
- char* lines2_2[] = {
- "stb2_2 1626006833651ms -2147483647i32 host=\"host0\"",
- "stb2_2 1626006833652ms 2147483647i32 host=\"host0\""
- };
+ // int
+ char* lines2_2[] = {"stb2_2 1626006833651ms -2147483647i32 host=\"host0\"",
+ "stb2_2 1626006833652ms 2147483647i32 host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_2, 2);
if (code) {
printf("lines2_2 code: %d, %s.\n", code, tstrerror(code));
}
- //bigint
- char* lines2_3[] = {
- "stb2_3 1626006833651ms -9223372036854775807i64 host=\"host0\"",
- "stb2_3 1626006833652ms 9223372036854775807i64 host=\"host0\""
- };
+ // bigint
+ char* lines2_3[] = {"stb2_3 1626006833651ms -9223372036854775807i64 host=\"host0\"",
+ "stb2_3 1626006833652ms 9223372036854775807i64 host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_3, 2);
if (code) {
printf("lines2_3 code: %d, %s.\n", code, tstrerror(code));
}
- //float
+ // float
char* lines2_4[] = {
- "stb2_4 1626006833610ms 3f32 host=\"host0\"",
- "stb2_4 1626006833620ms -3f32 host=\"host0\"",
- "stb2_4 1626006833630ms 3.4f32 host=\"host0\"",
- "stb2_4 1626006833640ms -3.4f32 host=\"host0\"",
- "stb2_4 1626006833650ms 3.4E10f32 host=\"host0\"",
- "stb2_4 1626006833660ms -3.4e10f32 host=\"host0\"",
- "stb2_4 1626006833670ms 3.4E+2f32 host=\"host0\"",
- "stb2_4 1626006833680ms -3.4e-2f32 host=\"host0\"",
- "stb2_4 1626006833690ms 3.15 host=\"host0\"",
- "stb2_4 1626006833700ms 3.4E38f32 host=\"host0\"",
- "stb2_4 1626006833710ms -3.4E38f32 host=\"host0\""
- };
+ "stb2_4 1626006833610ms 3f32 host=\"host0\"", "stb2_4 1626006833620ms -3f32 host=\"host0\"",
+ "stb2_4 1626006833630ms 3.4f32 host=\"host0\"", "stb2_4 1626006833640ms -3.4f32 host=\"host0\"",
+ "stb2_4 1626006833650ms 3.4E10f32 host=\"host0\"", "stb2_4 1626006833660ms -3.4e10f32 host=\"host0\"",
+ "stb2_4 1626006833670ms 3.4E+2f32 host=\"host0\"", "stb2_4 1626006833680ms -3.4e-2f32 host=\"host0\"",
+ "stb2_4 1626006833690ms 3.15 host=\"host0\"", "stb2_4 1626006833700ms 3.4E38f32 host=\"host0\"",
+ "stb2_4 1626006833710ms -3.4E38f32 host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_4, 11);
if (code) {
printf("lines2_4 code: %d, %s.\n", code, tstrerror(code));
}
- //double
+ // double
char* lines2_5[] = {
- "stb2_5 1626006833610ms 3f64 host=\"host0\"",
- "stb2_5 1626006833620ms -3f64 host=\"host0\"",
- "stb2_5 1626006833630ms 3.4f64 host=\"host0\"",
- "stb2_5 1626006833640ms -3.4f64 host=\"host0\"",
- "stb2_5 1626006833650ms 3.4E10f64 host=\"host0\"",
- "stb2_5 1626006833660ms -3.4e10f64 host=\"host0\"",
- "stb2_5 1626006833670ms 3.4E+2f64 host=\"host0\"",
- "stb2_5 1626006833680ms -3.4e-2f64 host=\"host0\"",
- "stb2_5 1626006833690ms 1.7E308f64 host=\"host0\"",
- "stb2_5 1626006833700ms -1.7E308f64 host=\"host0\""
- };
+ "stb2_5 1626006833610ms 3f64 host=\"host0\"", "stb2_5 1626006833620ms -3f64 host=\"host0\"",
+ "stb2_5 1626006833630ms 3.4f64 host=\"host0\"", "stb2_5 1626006833640ms -3.4f64 host=\"host0\"",
+ "stb2_5 1626006833650ms 3.4E10f64 host=\"host0\"", "stb2_5 1626006833660ms -3.4e10f64 host=\"host0\"",
+ "stb2_5 1626006833670ms 3.4E+2f64 host=\"host0\"", "stb2_5 1626006833680ms -3.4e-2f64 host=\"host0\"",
+ "stb2_5 1626006833690ms 1.7E308f64 host=\"host0\"", "stb2_5 1626006833700ms -1.7E308f64 host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_5, 10);
if (code) {
printf("lines2_5 code: %d, %s.\n", code, tstrerror(code));
}
- //bool
- char* lines2_6[] = {
- "stb2_6 1626006833610ms t host=\"host0\"",
- "stb2_6 1626006833620ms T host=\"host0\"",
- "stb2_6 1626006833630ms true host=\"host0\"",
- "stb2_6 1626006833640ms True host=\"host0\"",
- "stb2_6 1626006833650ms TRUE host=\"host0\"",
- "stb2_6 1626006833660ms f host=\"host0\"",
- "stb2_6 1626006833670ms F host=\"host0\"",
- "stb2_6 1626006833680ms false host=\"host0\"",
- "stb2_6 1626006833690ms False host=\"host0\"",
- "stb2_6 1626006833700ms FALSE host=\"host0\""
- };
+ // bool
+ char* lines2_6[] = {"stb2_6 1626006833610ms t host=\"host0\"", "stb2_6 1626006833620ms T host=\"host0\"",
+ "stb2_6 1626006833630ms true host=\"host0\"", "stb2_6 1626006833640ms True host=\"host0\"",
+ "stb2_6 1626006833650ms TRUE host=\"host0\"", "stb2_6 1626006833660ms f host=\"host0\"",
+ "stb2_6 1626006833670ms F host=\"host0\"", "stb2_6 1626006833680ms false host=\"host0\"",
+ "stb2_6 1626006833690ms False host=\"host0\"", "stb2_6 1626006833700ms FALSE host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_6, 10);
if (code) {
printf("lines2_6 code: %d, %s.\n", code, tstrerror(code));
}
- //binary
- char* lines2_7[] = {
- "stb2_7 1626006833610ms \"binary_val.!@#$%^&*\" host=\"host0\"",
- "stb2_7 1626006833620ms \"binary_val.:;,./?|+-=\" host=\"host0\"",
- "stb2_7 1626006833630ms \"binary_val.()[]{}<>\" host=\"host0\""
- };
+ // binary
+ char* lines2_7[] = {"stb2_7 1626006833610ms \"binary_val.!@#$%^&*\" host=\"host0\"",
+ "stb2_7 1626006833620ms \"binary_val.:;,./?|+-=\" host=\"host0\"",
+ "stb2_7 1626006833630ms \"binary_val.()[]{}<>\" host=\"host0\""};
code = taos_insert_telnet_lines(taos, lines2_7, 3);
if (code) {
printf("lines2_7 code: %d, %s.\n", code, tstrerror(code));
}
- //nchar
+ // nchar
char* lines2_8[] = {
"stb2_8 1626006833610ms L\"nchar_val数值一\" host=\"host0\"",
"stb2_8 1626006833620ms L\"nchar_val数值二\" host=\"host0\"",
@@ -1173,22 +1140,23 @@ void verify_telnet_insert(TAOS* taos) {
}
/* tags */
- //tag value types
+ // tag value types
char* lines3_0[] = {
- "stb3_0 1626006833610ms 1 t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=3.4E38f32,t6=1.7E308f64,t7=true,t8=\"binary_val_1\",t9=L\"标签值1\"",
- "stb3_0 1626006833610ms 2 t1=-127i8,t2=-32767i16,t3=-2147483647i32,t4=-9223372036854775807i64,t5=-3.4E38f32,t6=-1.7E308f64,t7=false,t8=\"binary_val_2\",t9=L\"标签值2\""
- };
+ "stb3_0 1626006833610ms 1 "
+ "t1=127i8,t2=32767i16,t3=2147483647i32,t4=9223372036854775807i64,t5=3.4E38f32,t6=1.7E308f64,t7=true,t8=\"binary_"
+ "val_1\",t9=L\"标签值1\"",
+ "stb3_0 1626006833610ms 2 "
+ "t1=-127i8,t2=-32767i16,t3=-2147483647i32,t4=-9223372036854775807i64,t5=-3.4E38f32,t6=-1.7E308f64,t7=false,t8="
+ "\"binary_val_2\",t9=L\"标签值2\""};
code = taos_insert_telnet_lines(taos, lines3_0, 2);
if (code) {
printf("lines3_0 code: %d, %s.\n", code, tstrerror(code));
}
- //tag ID as child table name
- char* lines3_1[] = {
- "stb3_1 1626006833610ms 1 id=\"child_table1\",host=\"host1\"",
- "stb3_1 1626006833610ms 2 host=\"host2\",iD=\"child_table2\"",
- "stb3_1 1626006833610ms 3 ID=\"child_table3\",host=\"host3\""
- };
+ // tag ID as child table name
+ char* lines3_1[] = {"stb3_1 1626006833610ms 1 id=\"child_table1\",host=\"host1\"",
+ "stb3_1 1626006833610ms 2 host=\"host2\",iD=\"child_table2\"",
+ "stb3_1 1626006833610ms 3 ID=\"child_table3\",host=\"host3\""};
code = taos_insert_telnet_lines(taos, lines3_1, 3);
if (code) {
printf("lines3_1 code: %d, %s.\n", code, tstrerror(code));
@@ -1198,7 +1166,7 @@ void verify_telnet_insert(TAOS* taos) {
}
void verify_json_insert(TAOS* taos) {
- TAOS_RES *result;
+ TAOS_RES* result;
result = taos_query(taos, "drop database if exists db;");
taos_free_result(result);
@@ -1210,8 +1178,8 @@ void verify_json_insert(TAOS* taos) {
(void)taos_select_db(taos, "db");
int32_t code = 0;
- char *message =
- "{ \
+ char* message =
+ "{ \
\"metric\":\"cpu_load_0\", \
\"timestamp\": 1626006833610123, \
\"value\": 55.5, \
@@ -1228,8 +1196,8 @@ void verify_json_insert(TAOS* taos) {
printf("payload_0 code: %d, %s.\n", code, tstrerror(code));
}
- char *message1 =
- "[ \
+ char* message1 =
+ "[ \
{ \
\"metric\":\"cpu_load_1\", \
\"timestamp\": 1626006833610123, \
@@ -1259,8 +1227,8 @@ void verify_json_insert(TAOS* taos) {
printf("payload_1 code: %d, %s.\n", code, tstrerror(code));
}
- char *message2 =
- "[ \
+ char* message2 =
+ "[ \
{ \
\"metric\":\"cpu_load_3\", \
\"timestamp\": \
@@ -1310,12 +1278,11 @@ void verify_json_insert(TAOS* taos) {
printf("payload_2 code: %d, %s.\n", code, tstrerror(code));
}
-
cJSON *payload, *tags;
- char *payload_str;
+ char* payload_str;
/* Default format */
- //number
+ // number
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb0_0");
cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
@@ -1327,7 +1294,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1336,7 +1303,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //true
+ // true
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb0_1");
cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
@@ -1348,7 +1315,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1357,7 +1324,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //false
+ // false
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb0_2");
cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
@@ -1369,7 +1336,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1378,7 +1345,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //string
+ // string
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb0_3");
cJSON_AddNumberToObject(payload, "timestamp", 1626006833610123);
@@ -1390,7 +1357,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1399,7 +1366,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //timestamp 0 -> current time
+ // timestamp 0 -> current time
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb0_4");
cJSON_AddNumberToObject(payload, "timestamp", 0);
@@ -1411,7 +1378,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1420,7 +1387,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //ID
+ // ID
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb0_5");
cJSON_AddNumberToObject(payload, "timestamp", 0);
@@ -1435,7 +1402,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "id", "tb555");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1445,9 +1412,9 @@ void verify_json_insert(TAOS* taos) {
cJSON_Delete(payload);
/* Nested format */
- //timestamp
- cJSON *timestamp;
- //seconds
+ // timestamp
+ cJSON* timestamp;
+ // seconds
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb1_0");
@@ -1464,7 +1431,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1473,7 +1440,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //milleseconds
+ // milleseconds
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb1_1");
@@ -1490,7 +1457,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1499,7 +1466,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //microseconds
+ // microseconds
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb1_2");
@@ -1516,7 +1483,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1525,7 +1492,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //nanoseconds
+ // nanoseconds
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb1_3");
@@ -1542,7 +1509,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1551,7 +1518,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //now
+ // now
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb1_4");
@@ -1568,7 +1535,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1577,9 +1544,9 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //metric value
- cJSON *metric_val;
- //bool
+ // metric value
+ cJSON* metric_val;
+ // bool
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_0");
@@ -1600,7 +1567,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1609,7 +1576,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //tinyint
+ // tinyint
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_1");
@@ -1630,7 +1597,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1639,7 +1606,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //smallint
+ // smallint
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_2");
@@ -1660,7 +1627,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1669,7 +1636,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //int
+ // int
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_3");
@@ -1690,7 +1657,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1699,7 +1666,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //bigint
+ // bigint
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_4");
@@ -1720,7 +1687,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1729,7 +1696,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //float
+ // float
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_5");
@@ -1750,7 +1717,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1759,7 +1726,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //double
+ // double
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_6");
@@ -1780,7 +1747,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1789,7 +1756,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //binary
+ // binary
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_7");
@@ -1810,7 +1777,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1819,7 +1786,7 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //nchar
+ // nchar
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb2_8");
@@ -1840,7 +1807,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddStringToObject(tags, "t4", "123_abc_.!@#$%^&*:;,./?|+-=()[]{}<>");
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1849,8 +1816,8 @@ void verify_json_insert(TAOS* taos) {
free(payload_str);
cJSON_Delete(payload);
- //tag value
- cJSON *tag;
+ // tag value
+ cJSON* tag;
payload = cJSON_CreateObject();
cJSON_AddStringToObject(payload, "metric", "stb3_0");
@@ -1920,7 +1887,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_AddItemToObject(payload, "tags", tags);
payload_str = cJSON_Print(payload);
- //printf("%s\n", payload_str);
+ // printf("%s\n", payload_str);
code = taos_insert_json_payload(taos, payload_str);
if (code) {
@@ -1930,7 +1897,7 @@ void verify_json_insert(TAOS* taos) {
cJSON_Delete(payload);
}
-int main(int argc, char *argv[]) {
+int main(int argc, char* argv[]) {
const char* host = "127.0.0.1";
const char* user = "root";
const char* passwd = "taosdata";
diff --git a/include/client/taos.h b/include/client/taos.h
index 44443752c50abcadfc64ae5373d654824022e109..25887b2879e3d534584f8d857ee3af670c7bcbd1 100644
--- a/include/client/taos.h
+++ b/include/client/taos.h
@@ -130,17 +130,16 @@ typedef struct TAOS_VGROUP_HASH_INFO {
int32_t vgId;
uint32_t hashBegin;
uint32_t hashEnd;
-} TAOS_VGROUP_HASH_INFO ;
+} TAOS_VGROUP_HASH_INFO;
typedef struct TAOS_DB_ROUTE_INFO {
- int32_t routeVersion;
- int16_t hashPrefix;
- int16_t hashSuffix;
- int8_t hashMethod;
- int32_t vgNum;
+ int32_t routeVersion;
+ int16_t hashPrefix;
+ int16_t hashSuffix;
+ int8_t hashMethod;
+ int32_t vgNum;
TAOS_VGROUP_HASH_INFO *vgHash;
-} TAOS_DB_ROUTE_INFO ;
-
+} TAOS_DB_ROUTE_INFO;
DLL_EXPORT void taos_cleanup(void);
DLL_EXPORT int taos_options(TSDB_OPTION option, const void *arg, ...);
@@ -153,6 +152,7 @@ DLL_EXPORT void taos_close(TAOS *taos);
const char *taos_data_type(int type);
DLL_EXPORT TAOS_STMT *taos_stmt_init(TAOS *taos);
+DLL_EXPORT TAOS_STMT *taos_stmt_init_with_reqid(TAOS *taos, int64_t reqid);
DLL_EXPORT int taos_stmt_prepare(TAOS_STMT *stmt, const char *sql, unsigned long length);
DLL_EXPORT int taos_stmt_set_tbname_tags(TAOS_STMT *stmt, const char *name, TAOS_MULTI_BIND *tags);
DLL_EXPORT int taos_stmt_set_tbname(TAOS_STMT *stmt, const char *name);
@@ -176,6 +176,7 @@ DLL_EXPORT int taos_stmt_affected_rows(TAOS_STMT *stmt);
DLL_EXPORT int taos_stmt_affected_rows_once(TAOS_STMT *stmt);
DLL_EXPORT TAOS_RES *taos_query(TAOS *taos, const char *sql);
+DLL_EXPORT TAOS_RES *taos_query_with_reqid(TAOS *taos, const char *sql, int64_t reqId);
DLL_EXPORT TAOS_ROW taos_fetch_row(TAOS_RES *res);
DLL_EXPORT int taos_result_precision(TAOS_RES *res); // get the time precision of result
@@ -207,17 +208,23 @@ DLL_EXPORT const char *taos_get_client_info();
DLL_EXPORT const char *taos_errstr(TAOS_RES *res);
DLL_EXPORT int taos_errno(TAOS_RES *res);
-DLL_EXPORT void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param);
-DLL_EXPORT void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param);
-DLL_EXPORT void taos_fetch_raw_block_a(TAOS_RES *res, __taos_async_fn_t fp, void *param);
+DLL_EXPORT void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param);
+DLL_EXPORT void taos_query_a_with_reqid(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param, int64_t reqid);
+DLL_EXPORT void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param);
+DLL_EXPORT void taos_fetch_raw_block_a(TAOS_RES *res, __taos_async_fn_t fp, void *param);
DLL_EXPORT const void *taos_get_raw_block(TAOS_RES *res);
-DLL_EXPORT int taos_get_db_route_info(TAOS* taos, const char* db, TAOS_DB_ROUTE_INFO* dbInfo);
-DLL_EXPORT int taos_get_table_vgId(TAOS* taos, const char* db, const char* table, int* vgId);
+DLL_EXPORT int taos_get_db_route_info(TAOS *taos, const char *db, TAOS_DB_ROUTE_INFO *dbInfo);
+DLL_EXPORT int taos_get_table_vgId(TAOS *taos, const char *db, const char *table, int *vgId);
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);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol,
+ int precision, int64_t reqid);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol,
+ int precision);
+DLL_EXPORT TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows,
+ int protocol, int precision, int64_t reqid);
/* --------------------------TMQ INTERFACE------------------------------- */
diff --git a/include/common/systable.h b/include/common/systable.h
index 8b29525db384744adac072a0cda3b07e4f66012c..57f85f16bcdaf8725156c47904bb91018d06328d 100644
--- a/include/common/systable.h
+++ b/include/common/systable.h
@@ -46,6 +46,7 @@ extern "C" {
#define TSDB_INS_TABLE_SUBSCRIPTIONS "ins_subscriptions"
#define TSDB_INS_TABLE_TOPICS "ins_topics"
#define TSDB_INS_TABLE_STREAMS "ins_streams"
+#define TSDB_INS_TABLE_STREAM_TASKS "ins_stream_tasks"
#define TSDB_PERFORMANCE_SCHEMA_DB "performance_schema"
#define TSDB_PERFS_TABLE_SMAS "perf_smas"
diff --git a/include/common/tdatablock.h b/include/common/tdatablock.h
index fdbb2c5123952b0637e8408cfc457d23e644b5ab..502ba10d337d80107b94cb01b182a63d14a63cc9 100644
--- a/include/common/tdatablock.h
+++ b/include/common/tdatablock.h
@@ -244,7 +244,7 @@ int32_t blockDataAppendColInfo(SSDataBlock* pBlock, SColumnInfoData* pColIn
SColumnInfoData createColumnInfoData(int16_t type, int32_t bytes, int16_t colId);
SColumnInfoData* bdGetColumnInfoData(const SSDataBlock* pBlock, int32_t index);
-void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_t numOfCols, int8_t needCompress);
+int32_t blockEncode(const SSDataBlock* pBlock, char* data, int32_t numOfCols);
const char* blockDecode(SSDataBlock* pBlock, const char* pData);
void blockDebugShowDataBlock(SSDataBlock* pBlock, const char* flag);
diff --git a/include/common/tdataformat.h b/include/common/tdataformat.h
index 60e8f63c22c1492ab9757f7a833f4c710f1420d8..2eda2f66cc143ddfd78f883f6c4b79547183d6e5 100644
--- a/include/common/tdataformat.h
+++ b/include/common/tdataformat.h
@@ -74,9 +74,7 @@ int32_t tTSchemaCreate(int32_t sver, SSchema *pSchema, int32_t nCols, STSchema *
void tTSchemaDestroy(STSchema *pTSchema);
// SValue ================================
-int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type);
-int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
-int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type);
+static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type);
// SColVal ================================
#define CV_FLAG_VALUE ((int8_t)0x0)
@@ -132,8 +130,9 @@ void tColDataInit(SColData *pColData, int16_t cid, int8_t type, int8_t smaOn)
void tColDataClear(SColData *pColData);
int32_t tColDataAppendValue(SColData *pColData, SColVal *pColVal);
void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal);
-uint8_t tColDataGetBitValue(SColData *pColData, int32_t iVal);
+uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal);
int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest);
+extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull);
// STRUCT ================================
struct STColumn {
@@ -282,6 +281,15 @@ void tdResetTSchemaBuilder(STSchemaBuilder *pBuilder, schema_ver_t version)
int32_t tdAddColToSchema(STSchemaBuilder *pBuilder, int8_t type, int8_t flags, col_id_t colId, col_bytes_t bytes);
STSchema *tdGetSchemaFromBuilder(STSchemaBuilder *pBuilder);
+static FORCE_INLINE int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) {
+ if (IS_VAR_DATA_TYPE(type)) {
+ return tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL);
+ } else {
+ memcpy(&pValue->val, p, tDataTypes[type].bytes);
+ return tDataTypes[type].bytes;
+ }
+}
+
#endif
#ifdef __cplusplus
diff --git a/include/common/tglobal.h b/include/common/tglobal.h
index 681d1beb7983adef7579a45a09fe809e4c30a271..2076906f70a33de60da7e6a70ae890ffa1ad0eeb 100644
--- a/include/common/tglobal.h
+++ b/include/common/tglobal.h
@@ -135,6 +135,9 @@ extern int32_t tsTtlPushInterval;
extern int32_t tsGrantHBInterval;
extern int32_t tsUptimeInterval;
+extern int32_t tsRpcRetryLimit;
+extern int32_t tsRpcRetryInterval;
+
//#define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize)
int32_t taosCreateLog(const char *logname, int32_t logFileNum, const char *cfgDir, const char **envCmd,
diff --git a/include/common/tmsg.h b/include/common/tmsg.h
index c0ac7da5bf502bbb7408b64b0d67c66954981ce2..02d4c2279c543aab42f1d0dd933a282d99ef7386 100644
--- a/include/common/tmsg.h
+++ b/include/common/tmsg.h
@@ -119,6 +119,7 @@ typedef enum _mgmt_table {
TSDB_MGMT_TABLE_QUERIES,
TSDB_MGMT_TABLE_VNODES,
TSDB_MGMT_TABLE_APPS,
+ TSDB_MGMT_TABLE_STREAM_TASKS,
TSDB_MGMT_TABLE_MAX,
} EShowType;
@@ -190,6 +191,7 @@ typedef struct {
int64_t dbId;
int32_t vgVersion;
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
+ int64_t stateTs;
} SBuildUseDBInput;
typedef struct SField {
@@ -216,14 +218,9 @@ typedef struct SEp {
uint16_t port;
} SEp;
-#define SHOW_REWRITE_MASK() (1 << 0)
-
-#define TEST_SHOW_REWRITE_MASK(m) (((m) & SHOW_REWRITE_MASK()) != 0)
-
typedef struct {
int32_t contLen;
int32_t vgId;
- int32_t msgMask;
} SMsgHead;
// Submit message for one table
@@ -422,13 +419,17 @@ static FORCE_INLINE int32_t taosEncodeSSchemaWrapper(void** buf, const SSchemaWr
static FORCE_INLINE void* taosDecodeSSchemaWrapper(const void* buf, SSchemaWrapper* pSW) {
buf = taosDecodeVariantI32(buf, &pSW->nCols);
buf = taosDecodeVariantI32(buf, &pSW->version);
- pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
- if (pSW->pSchema == NULL) {
- return NULL;
- }
+ if (pSW->nCols > 0) {
+ pSW->pSchema = (SSchema*)taosMemoryCalloc(pSW->nCols, sizeof(SSchema));
+ if (pSW->pSchema == NULL) {
+ return NULL;
+ }
- for (int32_t i = 0; i < pSW->nCols; i++) {
- buf = taosDecodeSSchema(buf, &pSW->pSchema[i]);
+ for (int32_t i = 0; i < pSW->nCols; i++) {
+ buf = taosDecodeSSchema(buf, &pSW->pSchema[i]);
+ }
+ } else {
+ pSW->pSchema = NULL;
}
return (void*)buf;
}
@@ -843,6 +844,7 @@ typedef struct {
int64_t dbId;
int32_t vgVersion;
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
+ int64_t stateTs; // ms
} SUseDbReq;
int32_t tSerializeSUseDbReq(void* buf, int32_t bufLen, SUseDbReq* pReq);
@@ -857,6 +859,8 @@ typedef struct {
int16_t hashSuffix;
int8_t hashMethod;
SArray* pVgroupInfos; // Array of SVgroupInfo
+ int32_t errCode;
+ int64_t stateTs; // ms
} SUseDbRsp;
int32_t tSerializeSUseDbRsp(void* buf, int32_t bufLen, const SUseDbRsp* pRsp);
@@ -1611,14 +1615,21 @@ typedef struct SSubQueryMsg {
uint64_t taskId;
int64_t refId;
int32_t execId;
+ int32_t msgMask;
int8_t taskType;
int8_t explain;
int8_t needFetch;
- uint32_t sqlLen; // the query sql,
- uint32_t phyLen;
- char msg[];
+ uint32_t sqlLen;
+ char *sql;
+ uint32_t msgLen;
+ char *msg;
} SSubQueryMsg;
+int32_t tSerializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq);
+int32_t tDeserializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq);
+void tFreeSSubQueryMsg(SSubQueryMsg *pReq);
+
+
typedef struct {
SMsgHead header;
uint64_t sId;
@@ -1727,6 +1738,13 @@ typedef struct {
int32_t execId;
} STaskDropReq;
+int32_t tSerializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq);
+int32_t tDeserializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq);
+
+int32_t tSerializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp);
+int32_t tDeserializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp);
+
+
typedef struct {
int32_t code;
} STaskDropRsp;
@@ -1806,7 +1824,7 @@ int32_t tDeserializeSCMCreateTopicRsp(void* buf, int32_t bufLen, SCMCreateTopicR
typedef struct {
int64_t consumerId;
-} SMqConsumerLostMsg, SMqConsumerRecoverMsg;
+} SMqConsumerLostMsg, SMqConsumerRecoverMsg, SMqConsumerClearMsg;
typedef struct {
int64_t consumerId;
@@ -2622,6 +2640,7 @@ typedef struct {
int32_t tEncodeSTqCheckInfo(SEncoder* pEncoder, const STqCheckInfo* pInfo);
int32_t tDecodeSTqCheckInfo(SDecoder* pDecoder, STqCheckInfo* pInfo);
+void tDeleteSTqCheckInfo(STqCheckInfo* pInfo);
typedef struct {
char topic[TSDB_TOPIC_FNAME_LEN];
@@ -2990,7 +3009,8 @@ static FORCE_INLINE void* tDecodeSMqSubTopicEp(void* buf, SMqSubTopicEp* pTopicE
}
static FORCE_INLINE void tDeleteSMqSubTopicEp(SMqSubTopicEp* pSubTopicEp) {
- if (pSubTopicEp->schema.nCols) taosMemoryFreeClear(pSubTopicEp->schema.pSchema);
+ taosMemoryFreeClear(pSubTopicEp->schema.pSchema);
+ pSubTopicEp->schema.nCols = 0;
taosArrayDestroy(pSubTopicEp->vgs);
}
@@ -3137,7 +3157,8 @@ int32_t tEncodeDeleteRes(SEncoder* pCoder, const SDeleteRes* pRes);
int32_t tDecodeDeleteRes(SDecoder* pCoder, SDeleteRes* pRes);
typedef struct {
- int64_t uid;
+ // int64_t uid;
+ char tbname[TSDB_TABLE_NAME_LEN];
int64_t ts;
} SSingleDeleteReq;
@@ -3161,8 +3182,7 @@ typedef struct {
typedef struct {
SMsgHead header;
- int32_t msgNum;
- SBatchMsg msg[];
+ SArray* pMsgs; //SArray
} SBatchReq;
typedef struct {
@@ -3171,17 +3191,40 @@ typedef struct {
int32_t msgLen;
int32_t rspCode;
void* msg;
+} SBatchRspMsg;
+
+typedef struct {
+ SArray* pRsps; //SArray
} SBatchRsp;
-static FORCE_INLINE void tFreeSBatchRsp(void* p) {
+int32_t tSerializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq);
+int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq);
+static FORCE_INLINE void tFreeSBatchReqMsg(void* msg) {
+ if (NULL == msg) {
+ return;
+ }
+ SBatchMsg* pMsg = (SBatchMsg*)msg;
+ taosMemoryFree(pMsg->msg);
+}
+
+int32_t tSerializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp);
+int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp);
+
+static FORCE_INLINE void tFreeSBatchRspMsg(void* p) {
if (NULL == p) {
return;
}
- SBatchRsp* pRsp = (SBatchRsp*)p;
+ SBatchRspMsg* pRsp = (SBatchRspMsg*)p;
taosMemoryFree(pRsp->msg);
}
+int32_t tSerializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq);
+int32_t tDeserializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq);
+int32_t tSerializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq);
+int32_t tDeserializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq);
+
+
#pragma pack(pop)
#ifdef __cplusplus
diff --git a/include/common/tmsgdef.h b/include/common/tmsgdef.h
index 58e7b71beccd8bb050530a24c151198e84086cb4..7ca552f179fe6da0bd189797ff0c33817c91dbf0 100644
--- a/include/common/tmsgdef.h
+++ b/include/common/tmsgdef.h
@@ -149,7 +149,7 @@ enum {
TD_DEF_MSG_TYPE(TDMT_MND_TMQ_DO_REBALANCE, "do-rebalance", SMqDoRebalanceMsg, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_TMQ_DROP_CGROUP, "drop-cgroup", SMqDropCGroupReq, SMqDropCGroupRsp)
TD_DEF_MSG_TYPE(TDMT_MND_UNUSED2, "unused2", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_MND_TMQ_TIMER, "mq-tmr", SMTimerReq, NULL)
+ TD_DEF_MSG_TYPE(TDMT_MND_TMQ_TIMER, "tmq-tmr", SMTimerReq, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_TELEM_TIMER, "telem-tmr", SMTimerReq, SMTimerReq)
TD_DEF_MSG_TYPE(TDMT_MND_TRANS_TIMER, "trans-tmr", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_TTL_TIMER, "ttl-tmr", NULL, NULL)
@@ -171,6 +171,7 @@ enum {
TD_DEF_MSG_TYPE(TDMT_MND_SHOW_VARIABLES, "show-variables", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_SERVER_VERSION, "server-version", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_UPTIME_TIMER, "uptime-timer", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_MND_TMQ_LOST_CONSUMER_CLEAR, "lost-consumer-clear", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_MND_MAX_MSG, "mnd-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_VND_MSG)
@@ -249,8 +250,8 @@ enum {
TD_NEW_MSG_SEG(TDMT_SYNC_MSG)
TD_DEF_MSG_TYPE(TDMT_SYNC_TIMEOUT, "sync-timer", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_SYNC_PING, "sync-ping", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_SYNC_PING_REPLY, "sync-ping-reply", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_SYNC_PING, "sync-ping", NULL, NULL) // no longer used
+ TD_DEF_MSG_TYPE(TDMT_SYNC_PING_REPLY, "sync-ping-reply", NULL, NULL) // no longer used
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST, "sync-client-request", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST_BATCH, "sync-client-request-batch", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_CLIENT_REQUEST_REPLY, "sync-client-request-reply", NULL, NULL)
@@ -263,8 +264,8 @@ enum {
TD_DEF_MSG_TYPE(TDMT_SYNC_UNKNOWN, "sync-unknown", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_COMMON_RESPONSE, "sync-common-response", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_APPLY_MSG, "sync-apply-msg", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE, "sync-config-change", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE_FINISH, "sync-config-change-finish", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE, "sync-config-change", NULL, NULL) // no longer used
+ TD_DEF_MSG_TYPE(TDMT_SYNC_CONFIG_CHANGE_FINISH, "sync-config-change-finish", NULL, NULL) // no longer used
TD_DEF_MSG_TYPE(TDMT_SYNC_SNAPSHOT_SEND, "sync-snapshot-send", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_SNAPSHOT_RSP, "sync-snapshot-rsp", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_LEADER_TRANSFER, "sync-leader-transfer", NULL, NULL)
@@ -273,8 +274,8 @@ enum {
TD_DEF_MSG_TYPE(TDMT_SYNC_HEARTBEAT, "sync-heartbeat", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_HEARTBEAT_REPLY, "sync-heartbeat-reply", NULL, NULL)
TD_DEF_MSG_TYPE(TDMT_SYNC_LOCAL_CMD, "sync-local-cmd", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_SYNC_PRE_SNAPSHOT, "sync-pre-snapshot", NULL, NULL)
- TD_DEF_MSG_TYPE(TDMT_SYNC_PRE_SNAPSHOT_REPLY, "sync-pre-snapshot-reply", NULL, NULL)
+ TD_DEF_MSG_TYPE(TDMT_SYNC_PRE_SNAPSHOT, "sync-pre-snapshot", NULL, NULL) // no longer used
+ TD_DEF_MSG_TYPE(TDMT_SYNC_PRE_SNAPSHOT_REPLY, "sync-pre-snapshot-reply", NULL, NULL) // no longer used
TD_DEF_MSG_TYPE(TDMT_SYNC_MAX_MSG, "sync-max", NULL, NULL)
TD_NEW_MSG_SEG(TDMT_VND_STREAM_MSG)
diff --git a/include/common/ttokendef.h b/include/common/ttokendef.h
index f5c99fcae75295c1793ba38d7774d63211ef3afb..f3c570aa8511c0ea82cbf822a811e2db556cf46e 100644
--- a/include/common/ttokendef.h
+++ b/include/common/ttokendef.h
@@ -174,61 +174,61 @@
#define TK_SUBSCRIPTIONS 156
#define TK_VNODES 157
#define TK_LIKE 158
-#define TK_INDEX 159
-#define TK_FUNCTION 160
-#define TK_INTERVAL 161
-#define TK_TOPIC 162
-#define TK_AS 163
-#define TK_WITH 164
-#define TK_META 165
-#define TK_CONSUMER 166
-#define TK_GROUP 167
-#define TK_DESC 168
-#define TK_DESCRIBE 169
-#define TK_RESET 170
-#define TK_QUERY 171
-#define TK_CACHE 172
-#define TK_EXPLAIN 173
-#define TK_ANALYZE 174
-#define TK_VERBOSE 175
-#define TK_NK_BOOL 176
-#define TK_RATIO 177
-#define TK_NK_FLOAT 178
-#define TK_OUTPUTTYPE 179
-#define TK_AGGREGATE 180
-#define TK_BUFSIZE 181
-#define TK_STREAM 182
-#define TK_INTO 183
-#define TK_TRIGGER 184
-#define TK_AT_ONCE 185
-#define TK_WINDOW_CLOSE 186
-#define TK_IGNORE 187
-#define TK_EXPIRED 188
-#define TK_FILL_HISTORY 189
-#define TK_SUBTABLE 190
-#define TK_KILL 191
-#define TK_CONNECTION 192
-#define TK_TRANSACTION 193
-#define TK_BALANCE 194
-#define TK_VGROUP 195
-#define TK_MERGE 196
-#define TK_REDISTRIBUTE 197
-#define TK_SPLIT 198
-#define TK_DELETE 199
-#define TK_INSERT 200
-#define TK_NULL 201
-#define TK_NK_QUESTION 202
-#define TK_NK_ARROW 203
-#define TK_ROWTS 204
-#define TK_TBNAME 205
-#define TK_QSTART 206
-#define TK_QEND 207
-#define TK_QDURATION 208
-#define TK_WSTART 209
-#define TK_WEND 210
-#define TK_WDURATION 211
-#define TK_IROWTS 212
-#define TK_QTAGS 213
+#define TK_TBNAME 159
+#define TK_QTAGS 160
+#define TK_AS 161
+#define TK_INDEX 162
+#define TK_FUNCTION 163
+#define TK_INTERVAL 164
+#define TK_TOPIC 165
+#define TK_WITH 166
+#define TK_META 167
+#define TK_CONSUMER 168
+#define TK_GROUP 169
+#define TK_DESC 170
+#define TK_DESCRIBE 171
+#define TK_RESET 172
+#define TK_QUERY 173
+#define TK_CACHE 174
+#define TK_EXPLAIN 175
+#define TK_ANALYZE 176
+#define TK_VERBOSE 177
+#define TK_NK_BOOL 178
+#define TK_RATIO 179
+#define TK_NK_FLOAT 180
+#define TK_OUTPUTTYPE 181
+#define TK_AGGREGATE 182
+#define TK_BUFSIZE 183
+#define TK_STREAM 184
+#define TK_INTO 185
+#define TK_TRIGGER 186
+#define TK_AT_ONCE 187
+#define TK_WINDOW_CLOSE 188
+#define TK_IGNORE 189
+#define TK_EXPIRED 190
+#define TK_FILL_HISTORY 191
+#define TK_SUBTABLE 192
+#define TK_KILL 193
+#define TK_CONNECTION 194
+#define TK_TRANSACTION 195
+#define TK_BALANCE 196
+#define TK_VGROUP 197
+#define TK_MERGE 198
+#define TK_REDISTRIBUTE 199
+#define TK_SPLIT 200
+#define TK_DELETE 201
+#define TK_INSERT 202
+#define TK_NULL 203
+#define TK_NK_QUESTION 204
+#define TK_NK_ARROW 205
+#define TK_ROWTS 206
+#define TK_QSTART 207
+#define TK_QEND 208
+#define TK_QDURATION 209
+#define TK_WSTART 210
+#define TK_WEND 211
+#define TK_WDURATION 212
+#define TK_IROWTS 213
#define TK_CAST 214
#define TK_NOW 215
#define TK_TODAY 216
diff --git a/include/common/ttypes.h b/include/common/ttypes.h
index bfd6a75c3a266be64fb2562031b1875a0db7636d..761ffd0f1c1c9d480c312382897a5b30b52b7335 100644
--- a/include/common/ttypes.h
+++ b/include/common/ttypes.h
@@ -346,8 +346,8 @@ bool isValidDataType(int32_t type);
void assignVal(char *val, const char *src, int32_t len, int32_t type);
void operateVal(void *dst, void *s1, void *s2, int32_t optr, int32_t type);
-void *getDataMin(int32_t type);
-void *getDataMax(int32_t type);
+void *getDataMin(int32_t type, void* value);
+void *getDataMax(int32_t type, void* value);
#ifdef __cplusplus
}
diff --git a/include/common/tvariant.h b/include/common/tvariant.h
index 0507934e6a9f87ce9e6418aeea81345589c981d5..130945cce5e237064451aff5d15ccfd0843d5e1d 100644
--- a/include/common/tvariant.h
+++ b/include/common/tvariant.h
@@ -30,6 +30,7 @@ typedef struct SVariant {
int64_t i;
uint64_t u;
double d;
+ float f;
char *pz;
TdUcs4 *ucs4;
SArray *arr; // only for 'in' query to hold value list, not value for a field
@@ -47,7 +48,7 @@ void taosVariantAssign(SVariant *pDst, const SVariant *pSrc);
int32_t taosVariantCompare(const SVariant *p1, const SVariant *p2);
-char *taosVariantGet(SVariant *pVar, int32_t type);
+char *taosVariantGet(SVariant *pVar, int32_t type);
#ifdef __cplusplus
}
diff --git a/include/libs/catalog/catalog.h b/include/libs/catalog/catalog.h
index b310ec80802bb76adf53841bf425569d0d2c0fa8..6154882756e0cb738f94fdf566cd9883da766c32 100644
--- a/include/libs/catalog/catalog.h
+++ b/include/libs/catalog/catalog.h
@@ -56,6 +56,7 @@ typedef struct SDbInfo {
int32_t vgVer;
int32_t tbNum;
int64_t dbId;
+ int64_t stateTs;
} SDbInfo;
typedef struct STablesReq {
@@ -124,6 +125,7 @@ typedef struct SDbVgVersion {
int64_t dbId;
int32_t vgVersion;
int32_t numOfTable; // unit is TSDB_TABLE_NUM_UNIT
+ int64_t stateTs;
} SDbVgVersion;
typedef struct STbSVersion {
@@ -152,7 +154,7 @@ int32_t catalogInit(SCatalogCfg* cfg);
*/
int32_t catalogGetHandle(uint64_t clusterId, SCatalog** catalogHandle);
-int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum);
+int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum, int64_t* stateTs);
/**
* Get a DB's all vgroup info.
@@ -207,7 +209,7 @@ int32_t catalogGetCachedTableMeta(SCatalog* pCtg, const SName* pTableName, STabl
int32_t catalogGetCachedSTableMeta(SCatalog* pCtg, const SName* pTableName, STableMeta** pTableMeta);
-int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
+int32_t catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists);
/**
* Force refresh DB's local cached vgroup info.
@@ -307,8 +309,8 @@ int32_t catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* f
int32_t catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* user, const char* dbFName, AUTH_TYPE type,
bool* pass);
-int32_t catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type,
- bool* pass, bool* exists);
+int32_t catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type, bool* pass,
+ bool* exists);
int32_t catalogUpdateUserAuthInfo(SCatalog* pCtg, SGetUserAuthRsp* pAuth);
@@ -324,9 +326,9 @@ SMetaData* catalogCloneMetaData(SMetaData* pData);
void catalogFreeMetaData(SMetaData* pData);
-int32_t ctgdEnableDebug(char *option, bool enable);
+int32_t ctgdEnableDebug(char* option, bool enable);
-int32_t ctgdHandleDbgCommand(char *command);
+int32_t ctgdHandleDbgCommand(char* command);
/**
* Destroy catalog and relase all resources
diff --git a/include/libs/function/taosudf.h b/include/libs/function/taosudf.h
index 3fe3bb7d3b805f285e79a48eca45f5fd4855dacf..5f57e203b9c04de0efa34ede4eaeb57503e18db3 100644
--- a/include/libs/function/taosudf.h
+++ b/include/libs/function/taosudf.h
@@ -104,7 +104,7 @@ typedef int32_t (*TUdfDestroyFunc)();
} while (0)
#define udfColDataSetNull_var(pColumn, row) ((pColumn->colData.varLenCol.varOffsets)[row] = -1)
-typedef uint16_t VarDataLenT; // maxVarDataLen: 32767
+typedef uint16_t VarDataLenT; // maxVarDataLen: 65535
#define VARSTR_HEADER_SIZE sizeof(VarDataLenT)
#define varDataLen(v) ((VarDataLenT *)(v))[0]
#define varDataVal(v) ((char *)(v) + VARSTR_HEADER_SIZE)
diff --git a/include/libs/nodes/cmdnodes.h b/include/libs/nodes/cmdnodes.h
index 59f64f186384910dc186ceb8b31fa0b42880c142..fc9bd461f61b9119296dfc2151f38701b493b22e 100644
--- a/include/libs/nodes/cmdnodes.h
+++ b/include/libs/nodes/cmdnodes.h
@@ -284,6 +284,13 @@ typedef struct SShowVnodesStmt {
SNode* pDnodeEndpoint;
} SShowVnodesStmt;
+typedef struct SShowTableTagsStmt {
+ ENodeType type;
+ SNode* pDbName; // SValueNode
+ SNode* pTbName; // SValueNode
+ SNodeList* pTags;
+} SShowTableTagsStmt;
+
typedef enum EIndexType { INDEX_TYPE_SMA = 1, INDEX_TYPE_FULLTEXT } EIndexType;
typedef struct SIndexOptions {
diff --git a/include/libs/nodes/querynodes.h b/include/libs/nodes/querynodes.h
index 837834f795b4c8583acc708373a9ece43bc1665b..5291130e4fb80733dd133bfafe49ba26d2ca2016 100644
--- a/include/libs/nodes/querynodes.h
+++ b/include/libs/nodes/querynodes.h
@@ -74,9 +74,8 @@ typedef struct SColumnNode {
char tableName[TSDB_TABLE_NAME_LEN];
char tableAlias[TSDB_TABLE_NAME_LEN];
char colName[TSDB_COL_NAME_LEN];
- // SNode* pProjectRef;
- int16_t dataBlockId;
- int16_t slotId;
+ int16_t dataBlockId;
+ int16_t slotId;
} SColumnNode;
typedef struct SColumnRefNode {
@@ -297,6 +296,7 @@ typedef struct SSelectStmt {
bool hasStateKey;
bool onlyHasKeepOrderFunc;
bool groupSort;
+ bool tagScan;
} SSelectStmt;
typedef enum ESetOperatorType { SET_OP_TYPE_UNION_ALL = 1, SET_OP_TYPE_UNION } ESetOperatorType;
@@ -351,15 +351,36 @@ typedef struct SVgDataBlocks {
SVgroupInfo vg;
int32_t numOfTables; // number of tables in current submit block
uint32_t size;
- void* pData; // SMsgDesc + SSubmitReq + SSubmitBlk + ...
+ void* pData; // SSubmitReq + SSubmitBlk + ...
} SVgDataBlocks;
+typedef void (*FFreeDataBlockHash)(SHashObj*);
+typedef void (*FFreeDataBlockArray)(SArray*);
+
typedef struct SVnodeModifOpStmt {
- ENodeType nodeType;
- ENodeType sqlNodeType;
- SArray* pDataBlocks; // data block for each vgroup, SArray.
- uint32_t insertType; // insert data from [file|sql statement| bound statement]
- const char* sql; // current sql statement position
+ ENodeType nodeType;
+ ENodeType sqlNodeType;
+ SArray* pDataBlocks; // data block for each vgroup, SArray.
+ uint32_t insertType; // insert data from [file|sql statement| bound statement]
+ const char* pSql; // current sql statement position
+ int32_t totalRowsNum;
+ int32_t totalTbNum;
+ SName targetTableName;
+ SName usingTableName;
+ const char* pBoundCols;
+ struct STableMeta* pTableMeta;
+ SHashObj* pVgroupsHashObj;
+ SHashObj* pTableBlockHashObj;
+ SHashObj* pSubTableHashObj;
+ SHashObj* pTableNameHashObj;
+ SHashObj* pDbFNameHashObj;
+ SArray* pVgDataBlocks;
+ SVCreateTbReq createTblReq;
+ TdFilePtr fp;
+ FFreeDataBlockHash freeHashFunc;
+ FFreeDataBlockArray freeArrayFunc;
+ bool usingTableProcessing;
+ bool fileProcessing;
} SVnodeModifOpStmt;
typedef struct SExplainOptions {
@@ -389,24 +410,32 @@ typedef enum EQueryExecMode {
QUERY_EXEC_MODE_EMPTY_RESULT
} EQueryExecMode;
+typedef enum EQueryExecStage {
+ QUERY_EXEC_STAGE_PARSE = 1,
+ QUERY_EXEC_STAGE_ANALYSE,
+ QUERY_EXEC_STAGE_SCHEDULE,
+ QUERY_EXEC_STAGE_END
+} EQueryExecStage;
+
typedef struct SQuery {
- ENodeType type;
- EQueryExecMode execMode;
- bool haveResultSet;
- SNode* pRoot;
- int32_t numOfResCols;
- SSchema* pResSchema;
- int8_t precision;
- SCmdMsgInfo* pCmdMsg;
- int32_t msgType;
- SArray* pTargetTableList;
- SArray* pTableList;
- SArray* pDbList;
- bool showRewrite;
- int32_t placeholderNum;
- SArray* pPlaceholderValues;
- SNode* pPrepareRoot;
- bool stableQuery;
+ ENodeType type;
+ EQueryExecStage execStage;
+ EQueryExecMode execMode;
+ bool haveResultSet;
+ SNode* pRoot;
+ int32_t numOfResCols;
+ SSchema* pResSchema;
+ int8_t precision;
+ SCmdMsgInfo* pCmdMsg;
+ int32_t msgType;
+ SArray* pTargetTableList;
+ SArray* pTableList;
+ SArray* pDbList;
+ bool showRewrite;
+ int32_t placeholderNum;
+ SArray* pPlaceholderValues;
+ SNode* pPrepareRoot;
+ bool stableQuery;
} SQuery;
void nodesWalkSelectStmt(SSelectStmt* pSelect, ESqlClause clause, FNodeWalker walker, void* pContext);
diff --git a/include/libs/parser/parser.h b/include/libs/parser/parser.h
index bcd2316baf22f896916bb0eb5b3f6ae654afb48a..1a7e6dc748c1f86c0c23ccbe8e70e41cf2912df8 100644
--- a/include/libs/parser/parser.h
+++ b/include/libs/parser/parser.h
@@ -64,8 +64,6 @@ typedef struct SParseContext {
SArray* pTableMetaPos; // sql table pos => catalog data pos
SArray* pTableVgroupPos; // sql table pos => catalog data pos
int64_t allocatorId;
- bool needMultiParse;
- SParseCsvCxt csvCxt;
} SParseContext;
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery);
@@ -75,6 +73,8 @@ bool qIsInsertValuesSql(const char* pStr, size_t length);
int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq);
int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCatalogReq,
const struct SMetaData* pMetaData, SQuery* pQuery);
+int32_t qContinueParseSql(SParseContext* pCxt, struct SCatalogReq* pCatalogReq, const struct SMetaData* pMetaData,
+ SQuery* pQuery);
void qDestroyParseContext(SParseContext* pCxt);
diff --git a/include/libs/qcom/query.h b/include/libs/qcom/query.h
index 651b37985178f0ce8e66b5fb55114aca43cc4028..96ccef7164f9872664ac5b77259de62f70ea4123 100644
--- a/include/libs/qcom/query.h
+++ b/include/libs/qcom/query.h
@@ -57,6 +57,10 @@ typedef enum {
#define QUERY_RSP_POLICY_DELAY 0
#define QUERY_RSP_POLICY_QUICK 1
+#define QUERY_MSG_MASK_SHOW_REWRITE() (1 << 0)
+#define TEST_SHOW_REWRITE_MASK(m) (((m) & QUERY_MSG_MASK_SHOW_REWRITE()) != 0)
+
+
typedef struct STableComInfo {
uint8_t numOfTags; // the number of tags in schema
uint8_t precision; // the number of precision
@@ -123,6 +127,7 @@ typedef struct SDBVgInfo {
int16_t hashSuffix;
int8_t hashMethod;
int32_t numOfTable; // DB's table num, unit is TSDB_TABLE_NUM_UNIT
+ int64_t stateTs;
SHashObj* vgHash; // key:vgId, value:SVgroupInfo
} SDBVgInfo;
@@ -199,6 +204,8 @@ int32_t taosAsyncExec(__async_exec_fn_t execFn, void* execParam, int32_t* code);
void destroySendMsgInfo(SMsgSendInfo* pMsgBody);
+void destroyAhandle(void* ahandle);
+
int32_t asyncSendMsgToServerExt(void* pTransporter, SEpSet* epSet, int64_t* pTransporterId, SMsgSendInfo* pInfo,
bool persistHandle, void* ctx);
diff --git a/include/libs/qworker/qworker.h b/include/libs/qworker/qworker.h
index 7a1e9bb2721c214dcf0ff961ca62dc0953d54882..2be0561ce7940e2c17dd49d71f62486d80538fc0 100644
--- a/include/libs/qworker/qworker.h
+++ b/include/libs/qworker/qworker.h
@@ -76,7 +76,7 @@ int32_t qWorkerInit(int8_t nodeType, int32_t nodeId, void **qWorkerMgmt, const S
int32_t qWorkerAbortPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg);
-int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg);
+int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg, bool chkGrant);
int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts);
@@ -94,6 +94,8 @@ int32_t qWorkerProcessHbMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_
int32_t qWorkerProcessDeleteMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, SDeleteRes *pRes);
+void qWorkerStopAllTasks(void *qWorkerMgmt);
+
void qWorkerDestroy(void **qWorkerMgmt);
int32_t qWorkerGetStat(SReadHandle *handle, void *qWorkerMgmt, SQWorkerStat *pStat);
diff --git a/include/libs/stream/streamState.h b/include/libs/stream/streamState.h
index 225466a0157cd0b529871af5b89d0a32e8bb6d8f..59f030a60c651a118b4f956996eb8e60ce42cd87 100644
--- a/include/libs/stream/streamState.h
+++ b/include/libs/stream/streamState.h
@@ -27,16 +27,21 @@ typedef struct SStreamTask SStreamTask;
typedef bool (*state_key_cmpr_fn)(void* pKey1, void* pKey2);
-// incremental state storage
-typedef struct {
+typedef struct STdbState {
SStreamTask* pOwner;
TDB* db;
TTB* pStateDb;
TTB* pFuncStateDb;
TTB* pFillStateDb; // todo refactor
TTB* pSessionStateDb;
+ TTB* pParNameDb;
TXN txn;
- int32_t number;
+} STdbState;
+
+// incremental state storage
+typedef struct {
+ STdbState* pTdbState;
+ int32_t number;
} SStreamState;
SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int32_t szPage, int32_t pages);
@@ -44,6 +49,7 @@ void streamStateClose(SStreamState* pState);
int32_t streamStateBegin(SStreamState* pState);
int32_t streamStateCommit(SStreamState* pState);
int32_t streamStateAbort(SStreamState* pState);
+void streamStateDestroy(SStreamState* pState);
typedef struct {
TBC* pCur;
@@ -60,19 +66,19 @@ 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 streamStateSessionAddIfNotExist(SStreamState* pState, SSessionKey* key, TSKEY gap, 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 streamStateSessionGetKVByCur(SStreamStateCur* pCur, SSessionKey* pKey, 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);
+int32_t streamStateSessionGetKeyByRange(SStreamState* pState, const SSessionKey* range, SSessionKey* curKey);
SStreamStateCur* streamStateSessionSeekKeyNext(SStreamState* pState, const SSessionKey* key);
SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, const SSessionKey* key);
-SStreamStateCur* streamStateSessionGetCur(SStreamState* pState, const SSessionKey* key);
+SStreamStateCur* streamStateSessionSeekKeyCurrentNext(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);
@@ -99,7 +105,12 @@ int32_t streamStateSeekLast(SStreamState* pState, SStreamStateCur* pCur);
int32_t streamStateCurNext(SStreamState* pState, SStreamStateCur* pCur);
int32_t streamStateCurPrev(SStreamState* pState, SStreamStateCur* pCur);
-// char* streamStateSessionDump(SStreamState* pState);
+int32_t streamStatePutParName(SStreamState* pState, int64_t groupId, const char* tbname);
+int32_t streamStateGetParName(SStreamState* pState, int64_t groupId, void** pVal);
+
+#if 0
+char* streamStateSessionDump(SStreamState* pState);
+#endif
#ifdef __cplusplus
}
diff --git a/include/libs/stream/tstream.h b/include/libs/stream/tstream.h
index 1c3f905e23a1a401cd662c20a495fa61d2e49ade..ecd1b6f916c814fe5ddcb2b72591c80b6e6c450a 100644
--- a/include/libs/stream/tstream.h
+++ b/include/libs/stream/tstream.h
@@ -317,6 +317,8 @@ typedef struct SStreamTask {
int8_t inputStatus;
int8_t outputStatus;
+ // STaosQueue* inputQueue1;
+ // STaosQall* inputQall;
SStreamQueue* inputQueue;
SStreamQueue* outputQueue;
@@ -336,7 +338,7 @@ typedef struct SStreamTask {
int32_t recoverWaitingUpstream;
int64_t checkReqId;
SArray* checkReqIds; // shuffle
-
+ int32_t refCnt;
} SStreamTask;
int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo);
@@ -563,6 +565,7 @@ typedef struct SStreamMeta {
TXN txn;
FTaskExpand* expandFunc;
int32_t vgId;
+ SRWLatch lock;
} SStreamMeta;
SStreamMeta* streamMetaOpen(const char* path, void* ahandle, FTaskExpand expandFunc, int32_t vgId);
@@ -573,6 +576,10 @@ int32_t streamMetaAddSerializedTask(SStreamMeta* pMeta, int64_t startVer, c
int32_t streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId);
SStreamTask* streamMetaGetTask(SStreamMeta* pMeta, int32_t taskId);
+SStreamTask* streamMetaAcquireTask(SStreamMeta* pMeta, int32_t taskId);
+void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask);
+void streamMetaRemoveTask1(SStreamMeta* pMeta, int32_t taskId);
+
int32_t streamMetaBegin(SStreamMeta* pMeta);
int32_t streamMetaCommit(SStreamMeta* pMeta);
int32_t streamMetaRollBack(SStreamMeta* pMeta);
diff --git a/include/libs/stream/tstreamUpdate.h b/include/libs/stream/tstreamUpdate.h
index 1c490852f92ed9244aeea173c5f2b33d58453326..ab328c6ad5c20170bf6b3c7ca7f4930b9082ad17 100644
--- a/include/libs/stream/tstreamUpdate.h
+++ b/include/libs/stream/tstreamUpdate.h
@@ -47,7 +47,7 @@ typedef struct SUpdateInfo {
SUpdateInfo *updateInfoInitP(SInterval *pInterval, int64_t watermark);
SUpdateInfo *updateInfoInit(int64_t interval, int32_t precision, int64_t watermark);
-void updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol);
+TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol);
bool updateInfoIsUpdated(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts);
bool updateInfoIsTableInserted(SUpdateInfo *pInfo, int64_t tbUid);
void updateInfoSetScanRange(SUpdateInfo *pInfo, STimeWindow *pWin, uint64_t groupId, uint64_t version);
diff --git a/include/libs/sync/sync.h b/include/libs/sync/sync.h
index 8db3d89e392af31968789efc3052577166116595..513ba8cb3432de72911be0a56a8c5dc87c05dc60 100644
--- a/include/libs/sync/sync.h
+++ b/include/libs/sync/sync.h
@@ -36,8 +36,9 @@ extern "C" {
#define SYNC_DEL_WAL_MS (1000 * 60)
#define SYNC_ADD_QUORUM_COUNT 3
#define SYNC_MNODE_LOG_RETENTION 10000
-#define SYNC_VNODE_LOG_RETENTION 100
+#define SYNC_VNODE_LOG_RETENTION 20
#define SNAPSHOT_MAX_CLOCK_SKEW_MS 1000 * 10
+#define SNAPSHOT_WAIT_MS 1000 * 30
#define SYNC_APPEND_ENTRIES_TIMEOUT_MS 10000
@@ -58,7 +59,6 @@ typedef int64_t SyncIndex;
typedef uint64_t SyncTerm;
typedef struct SSyncNode SSyncNode;
-typedef struct SSyncBuffer SSyncBuffer;
typedef struct SWal SWal;
typedef struct SSyncRaftEntry SSyncRaftEntry;
@@ -138,6 +138,8 @@ typedef struct SSyncFSM {
void (*FpRestoreFinishCb)(const struct SSyncFSM* pFsm);
void (*FpReConfigCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SReConfigCbMeta* pMeta);
void (*FpLeaderTransferCb)(const struct SSyncFSM* pFsm, const SRpcMsg* pMsg, const SFsmCbMeta* pMeta);
+ bool (*FpApplyQueueEmptyCb)(const struct SSyncFSM* pFsm);
+ int32_t (*FpApplyQueueItems)(const struct SSyncFSM* pFsm);
void (*FpBecomeLeaderCb)(const struct SSyncFSM* pFsm);
void (*FpBecomeFollowerCb)(const struct SSyncFSM* pFsm);
diff --git a/include/libs/transport/trpc.h b/include/libs/transport/trpc.h
index 53edcd4fee9bb9af6ab0d44235159b90990cf5c1..8cc37910fd6436e8cf44b0e895020364e4956c88 100644
--- a/include/libs/transport/trpc.h
+++ b/include/libs/transport/trpc.h
@@ -72,15 +72,18 @@ typedef struct SRpcMsg {
typedef void (*RpcCfp)(void *parent, SRpcMsg *, SEpSet *epset);
typedef bool (*RpcRfp)(int32_t code, tmsg_t msgType);
typedef bool (*RpcTfp)(int32_t code, tmsg_t msgType);
+typedef void (*RpcDfp)(void *ahandle);
typedef struct SRpcInit {
char localFqdn[TSDB_FQDN_LEN];
- uint16_t localPort; // local port
- char *label; // for debug purpose
- int32_t numOfThreads; // number of threads to handle connections
- int32_t sessions; // number of sessions allowed
- int8_t connType; // TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
- int32_t idleTime; // milliseconds, 0 means idle timer is disabled
+ uint16_t localPort; // local port
+ char *label; // for debug purpose
+ int32_t numOfThreads; // number of threads to handle connections
+ int32_t sessions; // number of sessions allowed
+ int8_t connType; // TAOS_CONN_UDP, TAOS_CONN_TCPC, TAOS_CONN_TCPS
+ int32_t idleTime; // milliseconds, 0 means idle timer is disabled
+ int32_t retryLimit; // retry limit
+ int32_t retryInterval; // retry interval ms
int32_t compressSize; // -1: no compress, 0 : all data compressed, size: compress data if larger than size
int8_t encryption; // encrypt or not
@@ -97,6 +100,9 @@ typedef struct SRpcInit {
// set up timeout for particular msg
RpcTfp tfp;
+ // destroy client ahandle;
+ RpcDfp dfp;
+
void *parent;
} SRpcInit;
diff --git a/include/util/taoserror.h b/include/util/taoserror.h
index 092ede2281f30bc765cf766e499bc1b6e2626290..e5d0bcb249b1d0d76517506421ee95a87d873051 100644
--- a/include/util/taoserror.h
+++ b/include/util/taoserror.h
@@ -154,7 +154,7 @@ int32_t* taosGetErrno();
// mnode-sdb
#define TSDB_CODE_SDB_OBJ_ALREADY_THERE TAOS_DEF_ERROR_CODE(0, 0x0320)
-#define TSDB_CODE_SDB_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0321)
+#define TSDB_CODE_SDB_APP_ERROR TAOS_DEF_ERROR_CODE(0, 0x0321) // internal
#define TSDB_CODE_SDB_INVALID_TABLE_TYPE TAOS_DEF_ERROR_CODE(0, 0x0322)
#define TSDB_CODE_SDB_OBJ_NOT_THERE TAOS_DEF_ERROR_CODE(0, 0x0323)
#define TSDB_CODE_SDB_INVALID_KEY_TYPE TAOS_DEF_ERROR_CODE(0, 0x0325)
@@ -218,14 +218,24 @@ int32_t* taosGetErrno();
// mnode-db
#define TSDB_CODE_MND_DB_NOT_SELECTED TAOS_DEF_ERROR_CODE(0, 0x0380)
-#define TSDB_CODE_MND_DB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0381)
-#define TSDB_CODE_MND_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x0382)
+#define TSDB_CODE_MND_DB_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0381) //
+#define TSDB_CODE_MND_INVALID_DB_OPTION TAOS_DEF_ERROR_CODE(0, 0x0382) //
#define TSDB_CODE_MND_INVALID_DB TAOS_DEF_ERROR_CODE(0, 0x0383)
+// #define TSDB_CODE_MND_MONITOR_DB_FORBIDDEN TAOS_DEF_ERROR_CODE(0, 0x0384) // 2.x
#define TSDB_CODE_MND_TOO_MANY_DATABASES TAOS_DEF_ERROR_CODE(0, 0x0385)
-#define TSDB_CODE_MND_DB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0388)
-#define TSDB_CODE_MND_INVALID_DB_ACCT TAOS_DEF_ERROR_CODE(0, 0x0389)
-#define TSDB_CODE_MND_DB_OPTION_UNCHANGED TAOS_DEF_ERROR_CODE(0, 0x038A)
+#define TSDB_CODE_MND_DB_IN_DROPPING TAOS_DEF_ERROR_CODE(0, 0x0386) //
+// #define TSDB_CODE_MND_VGROUP_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0387) // 2.x
+#define TSDB_CODE_MND_DB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x0388) //
+#define TSDB_CODE_MND_INVALID_DB_ACCT TAOS_DEF_ERROR_CODE(0, 0x0389) // internal
+#define TSDB_CODE_MND_DB_OPTION_UNCHANGED TAOS_DEF_ERROR_CODE(0, 0x038A) //
#define TSDB_CODE_MND_DB_INDEX_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x038B)
+// #define TSDB_CODE_MND_INVALID_DB_OPTION_DAYS TAOS_DEF_ERROR_CODE(0, 0x0390) // 2.x
+// #define TSDB_CODE_MND_INVALID_DB_OPTION_KEEP TAOS_DEF_ERROR_CODE(0, 0x0391) // 2.x
+// #define TSDB_CODE_MND_INVALID_TOPIC TAOS_DEF_ERROR_CODE(0, 0x0392) // 2.x
+// #define TSDB_CODE_MND_INVALID_TOPIC_OPTION TAOS_DEF_ERROR_CODE(0, 0x0393) // 2.x
+// #define TSDB_CODE_MND_INVALID_TOPIC_PARTITONSTAOS_DEF_ERROR_CODE(0, 0x0394) // 2.x
+// #define TSDB_CODE_MND_TOPIC_ALREADY_EXIST TAOS_DEF_ERROR_CODE(0, 0x0395) // 2.x
+#define TSDB_CODE_MND_DB_IN_CREATING TAOS_DEF_ERROR_CODE(0, 0x0396) //
#define TSDB_CODE_MND_INVALID_SYS_TABLENAME TAOS_DEF_ERROR_CODE(0, 0x039A)
// mnode-node
@@ -342,6 +352,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_TDB_STB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x061A)
#define TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER TAOS_DEF_ERROR_CODE(0, 0x061B)
#define TSDB_CODE_TDB_TDB_ENV_OPEN_ERROR TAOS_DEF_ERROR_CODE(0, 0x061C)
+#define TSDB_CODE_TDB_TABLE_IN_OTHER_STABLE TAOS_DEF_ERROR_CODE(0, 0x061D)
// query
#define TSDB_CODE_QRY_INVALID_QHANDLE TAOS_DEF_ERROR_CODE(0, 0x0700)
@@ -375,6 +386,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_QRY_JSON_NOT_SUPPORT_ERROR TAOS_DEF_ERROR_CODE(0, 0x072D)
#define TSDB_CODE_QRY_JSON_IN_GROUP_ERROR TAOS_DEF_ERROR_CODE(0, 0x072E)
#define TSDB_CODE_QRY_JOB_NOT_EXIST TAOS_DEF_ERROR_CODE(0, 0x072F)
+#define TSDB_CODE_QRY_QWORKER_QUIT TAOS_DEF_ERROR_CODE(0, 0x0730)
// grant
#define TSDB_CODE_GRANT_EXPIRED TAOS_DEF_ERROR_CODE(0, 0x0800)
@@ -398,7 +410,7 @@ int32_t* taosGetErrno();
#define TSDB_CODE_SYN_NOT_LEADER TAOS_DEF_ERROR_CODE(0, 0x090C)
#define TSDB_CODE_SYN_ONE_REPLICA TAOS_DEF_ERROR_CODE(0, 0x090D)
#define TSDB_CODE_SYN_NOT_IN_NEW_CONFIG TAOS_DEF_ERROR_CODE(0, 0x090E)
-#define TSDB_CODE_SYN_NEW_CONFIG_ERROR TAOS_DEF_ERROR_CODE(0, 0x090F)
+#define TSDB_CODE_SYN_NEW_CONFIG_ERROR TAOS_DEF_ERROR_CODE(0, 0x090F) // internal
#define TSDB_CODE_SYN_RECONFIG_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0910)
#define TSDB_CODE_SYN_PROPOSE_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0911)
#define TSDB_CODE_SYN_STANDBY_NOT_READY TAOS_DEF_ERROR_CODE(0, 0x0912)
diff --git a/include/util/tdef.h b/include/util/tdef.h
index 6e1fa87854660ae1befbf9bcb18d3e71875dc955..48dedd3e3e5bc80f703662cc25644b6ccf8cac76 100644
--- a/include/util/tdef.h
+++ b/include/util/tdef.h
@@ -26,7 +26,7 @@ extern "C" {
#define TSKEY int64_t
#define TSKEY_MIN INT64_MIN
-#define TSKEY_MAX (INT64_MAX - 1)
+#define TSKEY_MAX INT64_MAX
#define TSKEY_INITIAL_VAL TSKEY_MIN
#define TD_VER_MAX UINT64_MAX // TODO: use the real max version from query handle
@@ -290,7 +290,7 @@ typedef enum ELogicConditionType {
#define TSDB_DEFAULT_VN_PER_DB 2
#define TSDB_MIN_BUFFER_PER_VNODE 3 // unit MB
#define TSDB_MAX_BUFFER_PER_VNODE 16384 // unit MB
-#define TSDB_DEFAULT_BUFFER_PER_VNODE 96
+#define TSDB_DEFAULT_BUFFER_PER_VNODE 256
#define TSDB_MIN_PAGES_PER_VNODE 64
#define TSDB_MAX_PAGES_PER_VNODE (INT32_MAX - 1)
#define TSDB_DEFAULT_PAGES_PER_VNODE 256
@@ -489,6 +489,9 @@ enum {
#define MAX_META_MSG_IN_BATCH 1048576
#define MAX_META_BATCH_RSP_SIZE (1 * 1048576 * 1024)
+// sort page size by default
+#define DEFAULT_PAGESIZE 4096
+
#ifdef __cplusplus
}
#endif
diff --git a/include/util/types.h b/include/util/types.h
index 8dd0947e9c730197a6f0af391089c118ea09a494..b49670220bb02ceea03eec188aaf0f600ccb611c 100644
--- a/include/util/types.h
+++ b/include/util/types.h
@@ -78,7 +78,7 @@ static FORCE_INLINE double taos_align_get_double(const char *pBuf) {
{ (*(double *)(x)) = (*(double *)(y)); }
// #endif
-typedef uint16_t VarDataLenT; // maxVarDataLen: 32767
+typedef uint16_t VarDataLenT; // maxVarDataLen: 65535
#define VARSTR_HEADER_SIZE sizeof(VarDataLenT)
#define varDataLen(v) ((VarDataLenT *)(v))[0]
diff --git a/packaging/MPtestJenkinsfile b/packaging/MPtestJenkinsfile
index 5b793459164baec2791107842bddb3f0bb90b2df..dad5b7f129440e1fcf38524c95097b9bf8c1fd03 100644
--- a/packaging/MPtestJenkinsfile
+++ b/packaging/MPtestJenkinsfile
@@ -13,7 +13,7 @@ def sync_source(branch_name) {
git branch
git pull || git pull
git log | head -n 20
- git submodule update --init --recursive
+ git clean -fxd
'''
return 1
}
@@ -37,36 +37,46 @@ def build_run() {
pipeline {
agent none
parameters {
+ choice(
+ name: 'sourcePath',
+ choices: ['nas','web'],
+ description: 'Choice which way to download the installation pacakge;web is Office Web and nas means taos nas server '
+ )
+ choice(
+ name: 'verMode',
+ choices: ['all','community','enterprise'],
+ description: 'Choice which types of package you want do check '
+ )
string (
name:'version',
- defaultValue:'3.0.0.1',
- description: 'release version number,eg: 3.0.0.1 or 3.0.0.'
+ defaultValue:'3.0.1.7',
+ description: 'Release version number,eg: 3.0.0.1 or 3.0.0.'
)
string (
name:'baseVersion',
- defaultValue:'3.0.0.1',
- description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
+ defaultValue:'3.0.1.7',
+ description: 'The number of baseVerison is generally not modified.Now it is 3.0.0.1'
)
string (
name:'toolsVersion',
- defaultValue:'2.1.2',
- description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
+ defaultValue:'2.2.7',
+ description: 'Release version number,eg:2.2.0'
)
string (
name:'toolsBaseVersion',
defaultValue:'2.1.2',
- description: 'This number of baseVerison is generally not modified.Now it is 3.0.0.1'
+ description: 'The number of baseVerison is generally not modified.Now it is 2.1.2'
)
}
environment{
WORK_DIR = '/var/lib/jenkins/workspace'
TDINTERNAL_ROOT_DIR = '/var/lib/jenkins/workspace/TDinternal'
TDENGINE_ROOT_DIR = '/var/lib/jenkins/workspace/TDinternal/community'
- BRANCH_NAME = 'test/chr/TD-14699'
-
- TD_SERVER_TAR = "TDengine-server-${version}-Linux-x64.tar.gz"
+ BRANCH_NAME = '3.0'
+
+ TD_SERVER_TAR = "${preServerPackag}-${version}-Linux-x64.tar.gz"
BASE_TD_SERVER_TAR = "TDengine-server-${baseVersion}-Linux-x64.tar.gz"
-
+
TD_SERVER_ARM_TAR = "TDengine-server-${version}-Linux-arm64.tar.gz"
BASE_TD_SERVER_ARM_TAR = "TDengine-server-${baseVersion}-Linux-arm64.tar.gz"
@@ -103,19 +113,28 @@ pipeline {
timeout(time: 30, unit: 'MINUTES'){
sync_source("${BRANCH_NAME}")
sh '''
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
+ '''
+
+ sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
- '''
- sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
- '''
- sh '''
+ bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ '''
+
+ sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_DEB} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t deb
+ python3 checkPackageRuning.py
'''
}
}
@@ -126,22 +145,30 @@ pipeline {
timeout(time: 30, unit: 'MINUTES'){
sync_source("${BRANCH_NAME}")
sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
'''
+
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
'''
+
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_DEB} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t deb
+ python3 checkPackageRuning.py
dpkg -r tdengine
- '''
-
+ '''
}
}
}
@@ -151,19 +178,28 @@ pipeline {
timeout(time: 30, unit: 'MINUTES'){
sync_source("${BRANCH_NAME}")
sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
'''
- sh '''
+
+ sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
'''
+
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_RPM} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t rpm
+ python3 checkPackageRuning.py
'''
}
}
@@ -174,21 +210,30 @@ pipeline {
timeout(time: 30, unit: 'MINUTES'){
sync_source("${BRANCH_NAME}")
sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_TAR} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
'''
+
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_LITE_TAR} ${version} ${BASE_TD_SERVER_LITE_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
'''
+
sh '''
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_RPM} ${version} ${BASE_TD_SERVER_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ bash testpackage.sh -f server -m community -f server -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t rpm
+ python3 checkPackageRuning.py
sudo rpm -e tdengine
- '''
+ '''
}
}
}
@@ -198,9 +243,16 @@ pipeline {
timeout(time: 30, unit: 'MINUTES'){
sync_source("${BRANCH_NAME}")
sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_SERVER_ARM_TAR} ${version} ${BASE_TD_SERVER_ARM_TAR} ${baseVersion} server
- python3 checkPackageRuning.py
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m ${verModeSin} -f server -l false -c arm64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
'''
}
}
@@ -214,8 +266,16 @@ pipeline {
steps {
timeout(time: 30, unit: 'MINUTES'){
sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_CLIENT_TAR} ${version} ${BASE_TD_CLIENT_TAR} ${baseVersion} client
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m ${verModeSin} -f client -l false -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
python3 checkPackageRuning.py 192.168.0.21
'''
}
@@ -226,8 +286,10 @@ pipeline {
steps {
timeout(time: 30, unit: 'MINUTES'){
sh '''
+ verModeList=community
cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_CLIENT_LITE_TAR} ${version} ${BASE_TD_CLIENT_LITE_TAR} ${baseVersion} client
+ bash testpackage.sh -f server -m ${verModeSin} -f client -l true -c x64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
python3 checkPackageRuning.py 192.168.0.24
'''
}
@@ -240,8 +302,16 @@ pipeline {
steps {
timeout(time: 30, unit: 'MINUTES'){
sh '''
- cd ${TDENGINE_ROOT_DIR}/packaging
- bash testpackage.sh ${TD_CLIENT_ARM_TAR} ${version} ${BASE_TD_CLIENT_ARM_TAR} ${baseVersion} client
+ if [ "${verMode}" = "all" ];then
+ verMode="community enterprise"
+ fi
+ verModeList=${verMode}
+ for verModeSin in ${verModeList}
+ do
+ cd ${TDENGINE_ROOT_DIR}/packaging
+ bash testpackage.sh -f server -m ${verModeSin} -f client -l false -c arm64 -v ${version} -o ${baseVersion} -s ${sourcePath} -t tar
+ python3 checkPackageRuning.py
+ done
python3 checkPackageRuning.py 192.168.0.21
'''
}
diff --git a/packaging/cfg/taos.cfg b/packaging/cfg/taos.cfg
index eeb089d1abe9266231924f5543bfa7b5e85bd5ad..e22aa85c978c65d24047f85f9cbdaab84e124670 100644
--- a/packaging/cfg/taos.cfg
+++ b/packaging/cfg/taos.cfg
@@ -73,10 +73,10 @@
# compressColData -1
# system time zone
-# timezone Asia/Shanghai (CST, +0800)
+# timezone UTC-8
# system time zone (for windows 10)
-# timezone UTC-8
+# timezone Asia/Shanghai (CST, +0800)
# system locale
# locale en_US.UTF-8
@@ -179,4 +179,4 @@
# metaDebugFlag 131
# generate core file when service crash
-# enableCoreFile 1
\ No newline at end of file
+# enableCoreFile 1
diff --git a/packaging/docker/DockerfileCloud b/packaging/docker/DockerfileCloud
index 2b060c1b913d1830bd62c966983c7bc7a2edb67f..21e387bab3f81053683b83208e6632cd76fea652 100644
--- a/packaging/docker/DockerfileCloud
+++ b/packaging/docker/DockerfileCloud
@@ -7,6 +7,9 @@ ARG dirName
ARG cpuType
RUN echo ${pkgFile} && echo ${dirName}
+RUN apt update
+RUN apt install -y curl
+
COPY ${pkgFile} /root/
ENV TINI_VERSION v0.19.0
ADD https://github.com/krallin/tini/releases/download/${TINI_VERSION}/tini-${cpuType} /tini
diff --git a/packaging/docker/dockerbuild.sh b/packaging/docker/dockerbuild.sh
index 4c8f1413aa4197df1f7b5856139bea848cb0e33d..b02387a3d1191c09dadfa1ce21ab33183a52a7da 100755
--- a/packaging/docker/dockerbuild.sh
+++ b/packaging/docker/dockerbuild.sh
@@ -5,7 +5,7 @@ set -e
#set -x
# dockerbuild.sh
-# -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...]
+# -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...]
# -n [version number]
# -p [password for docker hub]
# -V [stable | beta]
@@ -57,7 +57,7 @@ do
dockerLatest=$(echo $OPTARG)
;;
h)
- echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] "
+ echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...] "
echo " -n [version number] "
echo " -p [password for docker hub] "
echo " -V [stable | beta] "
@@ -136,4 +136,4 @@ if [ "$cloudBuild" != "y" ] && [ ${dockerLatest} == 'y' ] ;then
docker push tdengine/tdengine-${dockername}:latest
fi
-rm -f ${pkgFile}
\ No newline at end of file
+rm -f ${pkgFile}
diff --git a/packaging/docker/dockerbuildi.sh b/packaging/docker/dockerbuildi.sh
index a0a954e30fe9c3637abe4d219001235d793466e0..9b7497dc4aae286f68663523532b4c356723ef31 100755
--- a/packaging/docker/dockerbuildi.sh
+++ b/packaging/docker/dockerbuildi.sh
@@ -5,7 +5,7 @@ set -e
#set -x
# dockerbuild.sh
-# -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...]
+# -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...]
# -n [version number]
# -p [password for docker hub]
@@ -30,7 +30,7 @@ do
passWord=$(echo $OPTARG)
;;
h)
- echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 ...] "
+ echo "Usage: `basename $0` -c [aarch32 | aarch64 | amd64 | x86 | mips64 | loongarch64...] "
echo " -n [version number] "
echo " -p [password for docker hub] "
exit 0
diff --git a/packaging/docker/run.sh b/packaging/docker/run.sh
old mode 100644
new mode 100755
index 2700b0b0607bc942901497a51f2d5118fbe880ef..3654beadcb5abb538ccc5a496694b6b059964c50
--- a/packaging/docker/run.sh
+++ b/packaging/docker/run.sh
@@ -1,16 +1,161 @@
#!/bin/bash
+
TAOS_RUN_TAOSBENCHMARK_TEST_ONCE=0
+#ADMIN_URL=${ADMIN_URL:-http://172.26.10.84:10001}
+TAOSD_STARTUP_TIMEOUT_SECOND=${TAOSD_STARTUP_TIMEOUT_SECOND:-160}
+TAOS_TIMEOUT_SECOND=${TAOS_TIMEOUT_SECOND:-5}
+BACKUP_CORE_FOLDER=/var/log/corefile
+ALERT_URL=app/system/alert/add
+
+echo "ADMIN_URL: ${ADMIN_URL}"
+echo "TAOS_TIMEOUT_SECOND: ${TAOS_TIMEOUT_SECOND}"
+
+function set_service_state() {
+ #echo "set service state: $1, $2"
+ service_state="$1"
+ service_msg="$2"
+}
+set_service_state "init" "ok"
+app_name=`hostname |cut -d\- -f1`
+
+function check_taosd() {
+ timeout $TAOS_TIMEOUT_SECOND taos -s "show databases;" >/dev/null
+ local ret=$?
+ if [ $ret -ne 0 ]; then
+ echo "`date` check taosd error $ret"
+ if [ "x$1" != "xignore" ]; then
+ set_service_state "error" "taos check failed $ret"
+ fi
+ else
+ set_service_state "ready" "ok"
+ fi
+}
+function post_error_msg() {
+ if [ ! -z "${ADMIN_URL}" ]; then
+ taos_version=`taos --version`
+ echo "app_name: ${app_name}"
+ echo "service_state: ${service_state}"
+ echo "`date` service_msg: ${service_msg}"
+ echo "${taos_version}"
+ curl --connect-timeout 10 --max-time 20 -X POST -H "Content-Type: application/json" \
+ -d"{\"appName\":\"${app_name}\",\
+ \"alertLevel\":\"${service_state}\",\
+ \"taosVersion\":\"${taos_version}\",\
+ \"alertMsg\":\"${service_msg}\"}" \
+ ${ADMIN_URL}/${ALERT_URL}
+ fi
+}
+function check_taosd_exit_type() {
+ local core_pattern=`cat /proc/sys/kernel/core_pattern`
+ echo "$core_pattern" | grep -q "^/"
+ if [ $? -eq 0 ]; then
+ core_folder=`dirname $core_pattern`
+ core_prefix=`basename $core_pattern | sed "s/%.*//"`
+ else
+ core_folder=`pwd`
+ core_prefix="$core_pattern"
+ fi
+ local core_files=`ls $core_folder | grep "^${core_prefix}"`
+ if [ ! -z "$core_files" ]; then
+ # move core files to another folder
+ mkdir -p ${BACKUP_CORE_FOLDER}
+ cp ${core_folder}/${core_prefix}* ${BACKUP_CORE_FOLDER}/
+ rm -f ${core_folder}/${core_prefix}*
+ set_service_state "error" "taosd exit with core file"
+ else
+ set_service_state "error" "taosd exit without core file"
+ fi
+}
+disk_usage_level=(60 80 99)
+current_disk_level=0
+disk_state="ok"
+disk_msg="ok"
+get_usage_ok="yes"
+function post_disk_error_msg() {
+ if [ ! -z "${ADMIN_URL}" ]; then
+ taos_version=`taos --version`
+ echo "app_name: ${app_name}"
+ echo "disk_state: ${disk_state}"
+ echo "`date` disk_msg: ${disk_msg}"
+ echo "${taos_version}"
+ curl --connect-timeout 10 --max-time 20 -X POST -H "Content-Type: application/json" \
+ -d"{\"appName\":\"${app_name}\",\
+ \"alertLevel\":\"${disk_state}\",\
+ \"taosVersion\":\"${taos_version}\",\
+ \"alertMsg\":\"${disk_msg}\"}" \
+ ${ADMIN_URL}/${ALERT_URL}
+ fi
+}
+function check_disk() {
+ local folder=`cat /etc/taos/taos.cfg|grep -v "^#"|grep dataDir|awk '{print $NF}'`
+ if [ -z "$folder" ]; then
+ folder="/var/lib/taos"
+ fi
+ local mount_point="$folder"
+ local usage=""
+ while [ -z "$usage" ]; do
+ usage=`df -h|grep -w "${mount_point}"|awk '{print $5}'|grep -v Use|sed "s/%$//"`
+ if [ "x${mount_point}" = "x/" ]; then
+ break
+ fi
+ mount_point=`dirname ${mount_point}`
+ done
+ if [ -z "$usage" ]; then
+ disk_state="error"
+ disk_msg="cannot get disk usage"
+ if [ "$get_usage_ok" = "yes" ]; then
+ post_disk_error_msg
+ get_usage_ok="no"
+ fi
+ else
+ get_usage_ok="yes"
+ local current_level=0
+ for level in ${disk_usage_level[*]}; do
+ if [ ${usage} -ge ${level} ]; then
+ disk_state="error"
+ disk_msg="disk usage over ${level}%"
+ current_level=${level}
+ fi
+ done
+ if [ ${current_level} -gt ${current_disk_level} ]; then
+ post_disk_error_msg
+ elif [ ${current_level} -lt ${current_disk_level} ]; then
+ echo "disk usage reduced from ${current_disk_level} to ${current_level}"
+ fi
+ current_disk_level=${current_level}
+ fi
+}
+function run_taosd() {
+ taosd
+ set_service_state "error" "taosd exit"
+ # post error msg
+ # check crash or OOM
+ check_taosd_exit_type
+ post_error_msg
+}
+function print_service_state_change() {
+ if [ "x$1" != "x${service_state}" ]; then
+ echo "`date` service state: ${service_state}, ${service_msg}"
+ fi
+}
+taosd_start_time=`date +%s`
while ((1))
do
+ check_disk
# echo "outer loop: $a"
- sleep 10
- output=`taos -k`
- status=${output:0:1}
+ output=`timeout $TAOS_TIMEOUT_SECOND taos -k`
+ if [ -z "${output}" ]; then
+ echo "`date` taos -k error"
+ status=""
+ else
+ status=${output:0:1}
+ fi
# echo $output
# echo $status
if [ "$status"x = "0"x ]
then
- taosd &
+ # taosd_start_time=`date +%s`
+ run_taosd &
fi
# echo "$status"x "$TAOS_RUN_TAOSBENCHMARK_TEST"x "$TAOS_RUN_TAOSBENCHMARK_TEST_ONCE"x
if [ "$status"x = "2"x ] && [ "$TAOS_RUN_TAOSBENCHMARK_TEST"x = "1"x ] && [ "$TAOS_RUN_TAOSBENCHMARK_TEST_ONCE"x = "0"x ]
@@ -24,13 +169,37 @@ do
taos -s "select stable_name from information_schema.ins_stables where db_name = 'test';"|grep -q -w meters
if [ $? -ne 0 ]; then
taosBenchmark -y -t 1000 -n 1000 -S 900000
- taos -s "create user admin_user pass 'NDS65R6t' sysinfo 0;"
- taos -s "GRANT ALL on test.* to admin_user;"
+ taos -s "create user admin_user pass 'NDS65R6t' sysinfo 0;"
+ taos -s "GRANT ALL on test.* to admin_user;"
fi
fi
+ # check taosd status
+ if [ "$service_state" = "ready" ]; then
+ # check taosd status
+ check_taosd
+ print_service_state_change "ready"
+ if [ "$service_state" = "error" ]; then
+ post_error_msg
+ fi
+ elif [ "$service_state" = "init" ]; then
+ check_taosd "ignore"
+ # check timeout
+ current_time=`date +%s`
+ time_elapsed=$(( current_time - taosd_start_time ))
+ if [ ${time_elapsed} -gt ${TAOSD_STARTUP_TIMEOUT_SECOND} ]; then
+ set_service_state "error" "taosd startup timeout"
+ post_error_msg
+ fi
+ print_service_state_change "init"
+ elif [ "$service_state" = "error" ]; then
+ # check taosd status
+ check_taosd
+ print_service_state_change "error"
+ fi
# check taosadapter
nc -z localhost 6041
if [ $? -ne 0 ]; then
- taosadapter &
+ taosadapter &
fi
+ sleep 10
done
diff --git a/packaging/release.sh b/packaging/release.sh
index f250e667fa17043d99fb0eff9e9901004d8edc1f..c07331a0df0ce202bf304ba070c2fd239fb5dfec 100755
--- a/packaging/release.sh
+++ b/packaging/release.sh
@@ -6,7 +6,7 @@ set -e
#set -x
# release.sh -v [cluster | edge]
-# -c [aarch32 | aarch64 | x64 | x86 | mips64 ...]
+# -c [aarch32 | aarch64 | x64 | x86 | mips64 | loongarch64...]
# -o [Linux | Kylin | Alpine | Raspberrypi | Darwin | Windows | Ningsi60 | Ningsi80 |...]
# -V [stable | beta]
# -l [full | lite]
@@ -19,7 +19,7 @@ set -e
# set parameters by default value
verMode=edge # [cluster, edge, cloud]
verType=stable # [stable, beta]
-cpuType=x64 # [aarch32 | aarch64 | x64 | x86 | mips64 ...]
+cpuType=x64 # [aarch32 | aarch64 | x64 | x86 | mips64 loongarch64...]
osType=Linux # [Linux | Kylin | Alpine | Raspberrypi | Darwin | Windows | Ningsi60 | Ningsi80 |...]
pagMode=full # [full | lite]
soMode=dynamic # [static | dynamic]
@@ -77,7 +77,7 @@ while getopts "hv:V:c:o:l:s:d:a:n:m:H:" arg; do
;;
h)
echo "Usage: $(basename $0) -v [cluster | edge] "
- echo " -c [aarch32 | aarch64 | x64 | x86 | mips64 ...] "
+ echo " -c [aarch32 | aarch64 | x64 | x86 | mips64 | loongarch64 ...] "
echo " -o [Linux | Kylin | Alpine | Raspberrypi | Darwin | Windows | Ningsi60 | Ningsi80 |...] "
echo " -V [stable | beta] "
echo " -l [full | lite] "
@@ -216,7 +216,7 @@ else
fi
# check support cpu type
-if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "arm64" ]] || [[ "$cpuType" == "arm32" ]] || [[ "$cpuType" == "mips64" ]]; then
+if [[ "$cpuType" == "x64" ]] || [[ "$cpuType" == "aarch64" ]] || [[ "$cpuType" == "aarch32" ]] || [[ "$cpuType" == "arm64" ]] || [[ "$cpuType" == "arm32" ]] || [[ "$cpuType" == "mips64" ]] || [[ "$cpuType" == "loongarch64" ]] ; then
if [ "$verMode" == "edge" ]; then
# community-version compile
cmake ../ -DCPUTYPE=${cpuType} -DWEBSOCKET=true -DOSTYPE=${osType} -DSOMODE=${soMode} -DDBNAME=${dbName} -DVERTYPE=${verType} -DVERDATE="${build_time}" -DGITINFO=${gitinfo} -DGITINFOI=${gitinfoOfInternal} -DVERNUMBER=${verNumber} -DVERCOMPATIBLE=${verNumberComp} -DPAGMODE=${pagMode} -DBUILD_HTTP=${BUILD_HTTP} -DBUILD_TOOLS=${BUILD_TOOLS} ${allocator_macro}
diff --git a/packaging/rpm/tdengine.spec b/packaging/rpm/tdengine.spec
index 637d2d425a457bd6fabf69867d556ee3e29fe0c5..e9d86219cb635d29cfc360314d122362d3285c0c 100644
--- a/packaging/rpm/tdengine.spec
+++ b/packaging/rpm/tdengine.spec
@@ -2,6 +2,7 @@
%define userlocalpath /usr/local
%define cfg_install_dir /etc/taos
%define __strip /bin/true
+%global __python /usr/bin/python3
Name: tdengine
Version: %{_version}
diff --git a/packaging/testpackage.sh b/packaging/testpackage.sh
index 5b9a12179deb056396e3f08d544a4478d5535005..846c8d160fe446d5a99a210ab33a1e53785573b6 100755
--- a/packaging/testpackage.sh
+++ b/packaging/testpackage.sh
@@ -1,13 +1,72 @@
#!/bin/sh
+
+
+function usage() {
+ echo "$0"
+ echo -e "\t -f test file type,server/client/tools/"
+ echo -e "\t -m pacakage version Type,community/enterprise"
+ echo -e "\t -l package type,lite or not"
+ echo -e "\t -c operation type,x64/arm64"
+ echo -e "\t -v pacakage version,3.0.1.7"
+ echo -e "\t -o pacakage version,3.0.1.7"
+ echo -e "\t -s source Path,web/nas"
+ echo -e "\t -t package Type,tar/rpm/deb"
+ echo -e "\t -h help"
+}
+
+
#parameter
scriptDir=$(dirname $(readlink -f $0))
-packgeName=$1
-version=$2
-originPackageName=$3
-originversion=$4
-testFile=$5
+version="3.0.1.7"
+originversion="3.0.1.7"
+testFile="server"
+verMode="communtity"
+sourcePath="nas"
+cpuType="x64"
+lite="true"
+packageType="tar"
subFile="taos.tar.gz"
-
+while getopts "m:c:f:l:s:o:t:v:h" opt; do
+ case $opt in
+ m)
+ verMode=$OPTARG
+ ;;
+ v)
+ version=$OPTARG
+ ;;
+ f)
+ testFile=$OPTARG
+ ;;
+ l)
+ lite=$OPTARG
+ ;;
+ s)
+ sourcePath=$OPTARG
+ ;;
+ o)
+ originversion=$OPTARG
+ ;;
+ c)
+ cpuType=$OPTARG
+ ;;
+ t)
+ packageType=$OPTARG
+ ;;
+ h)
+ usage
+ exit 0
+ ;;
+ ?)
+ echo "Invalid option: -$OPTARG"
+ usage
+ exit 0
+ ;;
+ esac
+done
+
+
+
+echo "testFile:${testFile},verMode:${verMode},lite:${lite},cpuType:${cpuType},packageType:${packageType},version-${version},originversion:${originversion},sourcePath:${sourcePath}"
# Color setting
RED='\033[41;30m'
GREEN='\033[1;32m'
@@ -19,20 +78,40 @@ BLUE_DARK='\033[0;34m'
GREEN_UNDERLINE='\033[4;32m'
NC='\033[0m'
-if [ ${testFile} = "server" ];then
- tdPath="TDengine-server-${version}"
- originTdpPath="TDengine-server-${originversion}"
+if [[ ${verMode} = "enterprise" ]];then
+ prePackag="TDengine-enterprise-${testFile}"
+elif [ ${verMode} = "community" ];then
+ prePackag="TDengine-${testFile}"
+fi
+if [ ${lite} = "true" ];then
+ packageLite="-Lite"
+elif [ ${lite} = "false" ];then
+ packageLite=""
+fi
+if [[ "$packageType" = "tar" ]] ;then
+ packageType="tar.gz"
+fi
+
+tdPath="${prePackag}-${version}"
+originTdpPath="${prePackag}-${originversion}"
+
+packgeName="${tdPath}-Linux-${cpuType}${packageLite}.${packageType}"
+originPackageName="${originTdpPath}-Linux-${cpuType}${packageLite}.${packageType}"
+
+if [ "$testFile" == "server" ] ;then
installCmd="install.sh"
elif [ ${testFile} = "client" ];then
- tdPath="TDengine-client-${version}"
- originTdpPath="TDengine-client-${originversion}"
installCmd="install_client.sh"
elif [ ${testFile} = "tools" ];then
tdPath="taosTools-${version}"
originTdpPath="taosTools-${originversion}"
+ packgeName="${tdPath}-Linux-${cpuType}${packageLite}.${packageType}"
+ originPackageName="${originTdpPath}-Linux-${cpuType}${packageLite}.${packageType}"
installCmd="install-taostools.sh"
fi
+
+echo "tdPath:${tdPath},originTdpPath:${originTdpPath},packgeName:${packgeName},originPackageName:${originPackageName}"
function cmdInstall {
command=$1
if command -v ${command} ;then
@@ -71,16 +150,23 @@ fi
function wgetFile {
file=$1
+versionPath=$2
+sourceP=$3
+nasServerIP="192.168.1.131"
+packagePath="/nas/TDengine/v${versionPath}/${verMode}"
+if [ -f ${file} ];then
+ echoColor YD "${file} already exists ,it will delete it and download it again "
+ rm -rf ${file}
+fi
-if [ ! -f ${file} ];then
- echoColor BD "wget https://www.taosdata.com/assets-download/3.0/${file}"
+if [[ ${sourceP} = 'web' ]];then
+ echoColor BD "====download====:wget https://www.taosdata.com/assets-download/3.0/${file}"
wget https://www.taosdata.com/assets-download/3.0/${file}
-else
- echoColor YD "${file} already exists and use new file "
- rm -rf ${file}
- echoColor BD "wget https://www.taosdata.com/assets-download/3.0/${file}"
- wget https://www.taosdata.com/assets-download/3.0/${file}
+elif [[ ${sourceP} = 'nas' ]];then
+ echoColor BD "====download====:scp root@${nasServerIP}:${packagePath}/${file} ."
+ scp root@${nasServerIP}:${packagePath}/${file} .
fi
+
}
function newPath {
@@ -142,8 +228,9 @@ if [ -d ${installPath}/${tdPath} ] ;then
fi
echoColor G "===== download installPackage ====="
-cd ${installPath} && wgetFile ${packgeName}
-cd ${oriInstallPath} && wgetFile ${originPackageName}
+cd ${installPath} && wgetFile ${packgeName} ${version} ${sourcePath}
+cd ${oriInstallPath} && wgetFile ${originPackageName} ${originversion} ${sourcePath}
+
cd ${installPath}
cp -r ${scriptDir}/debRpmAutoInstall.sh .
@@ -193,7 +280,7 @@ elif [[ ${packgeName} =~ "tar" ]];then
cd ${oriInstallPath}
if [ ! -f {originPackageName} ];then
echoColor YD "download base installPackage"
- wgetFile ${originPackageName}
+ wgetFile ${originPackageName} ${originversion} ${sourcePath}
fi
echoColor YD "unzip the base installation package"
echoColor BD "tar -xf ${originPackageName}" && tar -xf ${originPackageName}
@@ -238,14 +325,19 @@ cd ${installPath}
if [[ ${packgeName} =~ "Lite" ]] || ([[ ${packgeName} =~ "x64" ]] && [[ ${packgeName} =~ "client" ]]) || ([[ ${packgeName} =~ "deb" ]] && [[ ${packgeName} =~ "server" ]]) || ([[ ${packgeName} =~ "rpm" ]] && [[ ${packgeName} =~ "server" ]]) ;then
echoColor G "===== install taos-tools when package is lite or client ====="
cd ${installPath}
- wgetFile taosTools-2.1.3-Linux-x64.tar.gz .
- tar xf taosTools-2.1.3-Linux-x64.tar.gz
+ if [ ! -f "taosTools-2.1.3-Linux-x64.tar.gz " ];then
+ wgetFile taosTools-2.1.3-Linux-x64.tar.gz v2.1.3 web
+ tar xf taosTools-2.1.3-Linux-x64.tar.gz
+ fi
cd taosTools-2.1.3 && bash install-taostools.sh
elif ([[ ${packgeName} =~ "arm64" ]] && [[ ${packgeName} =~ "client" ]]);then
echoColor G "===== install taos-tools arm when package is arm64-client ====="
cd ${installPath}
- wgetFile taosTools-2.1.3-Linux-arm64.tar.gz .
- tar xf taosTools-2.1.3-Linux-arm64.tar.gz
+ if [ ! -f "taosTools-2.1.3-Linux-x64.tar.gz " ];then
+ wgetFile taosTools-2.1.3-Linux-x64.tar.gz v2.1.3 web
+ tar xf taosTools-2.1.3-Linux-arm64.tar.gz
+ fi
+
cd taosTools-2.1.3 && bash install-taostools.sh
fi
diff --git a/packaging/tools/make_install.bat b/packaging/tools/make_install.bat
index f5d1e4569063f60bf998ff5665c624cbce6af4be..c19519f9a1fc4c014c01496ca32925ba1eb19516 100644
--- a/packaging/tools/make_install.bat
+++ b/packaging/tools/make_install.bat
@@ -1,4 +1,7 @@
@echo off
+
+for /F %%a in ('echo prompt $E ^| cmd') do set "ESC=%%a"
+
goto %1
:needAdmin
@@ -11,60 +14,94 @@ set binary_dir=%3
set binary_dir=%binary_dir:/=\\%
set osType=%4
set verNumber=%5
-set tagert_dir=C:\\TDengine
+set target_dir=C:\\TDengine
-if not exist %tagert_dir% (
- mkdir %tagert_dir%
+if not exist %target_dir% (
+ mkdir %target_dir%
)
-if not exist %tagert_dir%\\cfg (
- mkdir %tagert_dir%\\cfg
+if not exist %target_dir%\\cfg (
+ mkdir %target_dir%\\cfg
)
-if not exist %tagert_dir%\\include (
- mkdir %tagert_dir%\\include
+if not exist %target_dir%\\include (
+ mkdir %target_dir%\\include
)
-if not exist %tagert_dir%\\driver (
- mkdir %tagert_dir%\\driver
+if not exist %target_dir%\\driver (
+ mkdir %target_dir%\\driver
)
if not exist C:\\TDengine\\cfg\\taos.cfg (
- copy %source_dir%\\packaging\\cfg\\taos.cfg %tagert_dir%\\cfg\\taos.cfg > nul
+ copy %source_dir%\\packaging\\cfg\\taos.cfg %target_dir%\\cfg\\taos.cfg > nul
)
if exist %binary_dir%\\test\\cfg\\taosadapter.toml (
- if not exist %tagert_dir%\\cfg\\taosadapter.toml (
- copy %binary_dir%\\test\\cfg\\taosadapter.toml %tagert_dir%\\cfg\\taosadapter.toml > nul
+ if not exist %target_dir%\\cfg\\taosadapter.toml (
+ copy %binary_dir%\\test\\cfg\\taosadapter.toml %target_dir%\\cfg\\taosadapter.toml > nul
)
)
-copy %source_dir%\\include\\client\\taos.h %tagert_dir%\\include > nul
-copy %source_dir%\\include\\util\\taoserror.h %tagert_dir%\\include > nul
-copy %source_dir%\\include\\libs\\function\\taosudf.h %tagert_dir%\\include > nul
-copy %binary_dir%\\build\\lib\\taos.lib %tagert_dir%\\driver > nul
-copy %binary_dir%\\build\\lib\\taos_static.lib %tagert_dir%\\driver > nul
-copy %binary_dir%\\build\\lib\\taos.dll %tagert_dir%\\driver > nul
-copy %binary_dir%\\build\\bin\\taos.exe %tagert_dir% > nul
-copy %binary_dir%\\build\\bin\\taosd.exe %tagert_dir% > nul
-copy %binary_dir%\\build\\bin\\udfd.exe %tagert_dir% > nul
+copy %source_dir%\\include\\client\\taos.h %target_dir%\\include > nul
+copy %source_dir%\\include\\util\\taoserror.h %target_dir%\\include > nul
+copy %source_dir%\\include\\libs\\function\\taosudf.h %target_dir%\\include > nul
+copy %binary_dir%\\build\\lib\\taos.lib %target_dir%\\driver > nul
+copy %binary_dir%\\build\\lib\\taos_static.lib %target_dir%\\driver > nul
+copy %binary_dir%\\build\\lib\\taos.dll %target_dir%\\driver > nul
+copy %binary_dir%\\build\\bin\\taos.exe %target_dir% > nul
if exist %binary_dir%\\build\\bin\\taosBenchmark.exe (
- copy %binary_dir%\\build\\bin\\taosBenchmark.exe %tagert_dir% > nul
+ copy %binary_dir%\\build\\bin\\taosBenchmark.exe %target_dir% > nul
)
if exist %binary_dir%\\build\\lib\\taosws.dll.lib (
- copy %binary_dir%\\build\\lib\\taosws.dll.lib %tagert_dir%\\driver > nul
+ copy %binary_dir%\\build\\lib\\taosws.dll.lib %target_dir%\\driver > nul
)
if exist %binary_dir%\\build\\lib\\taosws.dll (
- copy %binary_dir%\\build\\lib\\taosws.dll %tagert_dir%\\driver > nul
- copy %source_dir%\\tools\\taosws-rs\\target\\release\\taosws.h %tagert_dir%\\include > nul
+ copy %binary_dir%\\build\\lib\\taosws.dll %target_dir%\\driver > nul
+ copy %source_dir%\\tools\\taosws-rs\\target\\release\\taosws.h %target_dir%\\include > nul
)
if exist %binary_dir%\\build\\bin\\taosdump.exe (
- copy %binary_dir%\\build\\bin\\taosdump.exe %tagert_dir% > nul
+ copy %binary_dir%\\build\\bin\\taosdump.exe %target_dir% > nul
+)
+
+copy %binary_dir%\\build\\bin\\taosd.exe %target_dir% > nul
+copy %binary_dir%\\build\\bin\\udfd.exe %target_dir% > nul
+
+if exist %binary_dir%\\build\\bin\\taosadapter.exe (
+ copy %binary_dir%\\build\\bin\\taosadapter.exe %target_dir% > nul
)
+
+mshta vbscript:createobject("shell.application").shellexecute("%~s0",":hasAdmin","","runas",1)(window.close)
+
+echo.
+echo Please manually remove C:\TDengine from your system PATH environment after you remove TDengine software
+echo.
+echo To start/stop TDengine with administrator privileges: %ESC%[92msc start/stop taosd %ESC%[0m
+
if exist %binary_dir%\\build\\bin\\taosadapter.exe (
- copy %binary_dir%\\build\\bin\\taosadapter.exe %tagert_dir% > nul
+ echo To start/stop taosAdapter with administrator privileges: %ESC%[92msc start/stop taosadapter %ESC%[0m
)
-mshta vbscript:createobject("shell.application").shellexecute("%~s0",":hasAdmin","","runas",1)(window.close)&& echo To start/stop TDengine with administrator privileges: sc start/stop taosd &goto :eof
+goto :eof
+
:hasAdmin
+
+sc query "taosd" && sc stop taosd && sc delete taosd
+sc query "taosadapter" && sc stop taosadapter && sc delete taosd
+
copy /y C:\\TDengine\\driver\\taos.dll C:\\Windows\\System32 > nul
if exist C:\\TDengine\\driver\\taosws.dll (
copy /y C:\\TDengine\\driver\\taosws.dll C:\\Windows\\System32 > nul
)
+
sc query "taosd" >nul || sc create "taosd" binPath= "C:\\TDengine\\taosd.exe --win_service" start= DEMAND
sc query "taosadapter" >nul || sc create "taosadapter" binPath= "C:\\TDengine\\taosadapter.exe" start= DEMAND
+
+set "env=HKLM\System\CurrentControlSet\Control\Session Manager\Environment"
+for /f "tokens=2*" %%I in ('reg query "%env%" /v Path ^| findstr /i "\"') do (
+
+ rem // make addition persistent through reboots
+ reg add "%env%" /f /v Path /t REG_EXPAND_SZ /d "%%J;C:\TDengine"
+
+ rem // apply change to the current process
+ for %%a in ("%%J;C:\TDengine") do path %%~a
+)
+
+rem // use setx to set a temporary throwaway value to trigger a WM_SETTINGCHANGE
+rem // applies change to new console windows without requiring a reboot
+(setx /m foo bar & reg delete "%env%" /f /v foo) >NUL 2>NUL
+
diff --git a/packaging/tools/tdengine.iss b/packaging/tools/tdengine.iss
index ec9c432092bcc416de4b22025c86faa262898d5a..2e9c46d06b1e37530a22660f60c9da33bb3f50f3 100644
--- a/packaging/tools/tdengine.iss
+++ b/packaging/tools/tdengine.iss
@@ -60,6 +60,39 @@ Source: {#MyAppSourceDir}{#MyAppIncludeName}; DestDir: "{app}\include"; Flags: i
Source: {#MyAppSourceDir}{#MyAppExeName}; DestDir: "{app}"; Excludes: {#MyAppExcludeSource} ; Flags: igNoreversion recursesubdirs createallsubdirs
Source: {#MyAppSourceDir}{#MyAppTaosdemoExeName}; DestDir: "{app}"; Flags: igNoreversion recursesubdirs createallsubdirs
+
+[run]
+Filename: {sys}\sc.exe; Parameters: "create taosd start= DEMAND binPath= ""C:\\TDengine\\taosd.exe --win_service""" ; Flags: runhidden
+Filename: {sys}\sc.exe; Parameters: "create taosadapter start= DEMAND binPath= ""C:\\TDengine\\taosadapter.exe""" ; Flags: runhidden
+
+[UninstallRun]
+RunOnceId: "stoptaosd"; Filename: {sys}\sc.exe; Parameters: "stop taosd" ; Flags: runhidden
+RunOnceId: "stoptaosadapter"; Filename: {sys}\sc.exe; Parameters: "stop taosadapter" ; Flags: runhidden
+RunOnceId: "deltaosd"; Filename: {sys}\sc.exe; Parameters: "delete taosd" ; Flags: runhidden
+RunOnceId: "deltaosadapter"; Filename: {sys}\sc.exe; Parameters: "delete taosadapter" ; Flags: runhidden
+
+[Registry]
+Root: HKLM; Subkey: "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"; \
+ ValueType: expandsz; ValueName: "Path"; ValueData: "{olddata};C:\TDengine"; \
+ Check: NeedsAddPath('C:\TDengine')
+
+[Code]
+function NeedsAddPath(Param: string): boolean;
+var
+ OrigPath: string;
+begin
+ if not RegQueryStringValue(HKEY_LOCAL_MACHINE,
+ 'SYSTEM\CurrentControlSet\Control\Session Manager\Environment',
+ 'Path', OrigPath)
+ then begin
+ Result := True;
+ exit;
+ end;
+ { look for the path with leading and trailing semicolon }
+ { Pos() returns 0 if not found }
+ Result := Pos(';' + Param + ';', ';' + OrigPath + ';') = 0;
+end;
+
[UninstallDelete]
Name: {app}\driver; Type: filesandordirs
Name: {app}\connector; Type: filesandordirs
diff --git a/packaging/tools/windows_before_install.txt b/packaging/tools/windows_before_install.txt
index b793a3e8014493b374c3b7bd79d7f535ca14f555..ef783bf10badedc733e87946a323d499b60fc5ac 100644
--- a/packaging/tools/windows_before_install.txt
+++ b/packaging/tools/windows_before_install.txt
@@ -1,3 +1,6 @@
TDengine is a high-efficient, scalable, high-available distributed time-series database, which makes a lot of optimizations on inserting and querying data, which is far more efficient than normal regular databases. So TDengine can meet the high requirements of IOT and other areas on storing and querying a large amount of data.
-TDengine will be installed under C:\TDengine, users can modify configuration file C:\TDengine\cfg\taos.cfg, set the log file path or other parameters.
\ No newline at end of file
+TDengine will be installed under C:\TDengine, users can modify configuration file C:\TDengine\cfg\taos.cfg, set the log file path or other parameters.
+To start/stop TDengine with administrator privileges: sc start/stop taosd
+To start/stop taosAdapter with administrator privileges: sc start/stop taosadapter
+Please manually remove C:\TDengine from your system PATH environment after you remove TDengine software.
diff --git a/source/client/inc/clientInt.h b/source/client/inc/clientInt.h
index 33af86252882e5a431d59fe670aa98d5fe26ce64..e569a977239c5feca935b99fe200096053755849 100644
--- a/source/client/inc/clientInt.h
+++ b/source/client/inc/clientInt.h
@@ -271,7 +271,11 @@ int32_t transferTableNameList(const char* tbList, int32_t acctId, char* dbName,
void syncCatalogFn(SMetaData* pResult, void* param, int32_t code);
TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly);
-void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly);
+TAOS_RES* taosQueryImplWithReqid(TAOS* taos, const char* sql, bool validateOnly, int64_t reqid);
+
+void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly);
+void taosAsyncQueryImplWithReqid(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly,
+ int64_t reqid);
int32_t getVersion1BlockMetaSize(const char* p, int32_t numOfCols);
@@ -318,11 +322,11 @@ void* createTscObj(const char* user, const char* auth, const char* db, int32_
void destroyTscObj(void* pObj);
STscObj* acquireTscObj(int64_t rid);
int32_t releaseTscObj(int64_t rid);
-void destroyAppInst(SAppInstInfo *pAppInfo);
+void destroyAppInst(SAppInstInfo* pAppInfo);
uint64_t generateRequestId();
-void* createRequest(uint64_t connId, int32_t type);
+void* createRequest(uint64_t connId, int32_t type, int64_t reqid);
void destroyRequest(SRequestObj* pRequest);
SRequestObj* acquireRequest(int64_t rid);
int32_t releaseRequest(int64_t rid);
@@ -353,7 +357,7 @@ int32_t parseSql(SRequestObj* pRequest, bool topicQuery, SQuery** pQuery, SStmtC
int32_t getPlan(SRequestObj* pRequest, SQuery* pQuery, SQueryPlan** pPlan, SArray* pNodeList);
int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql,
- SRequestObj** pRequest);
+ SRequestObj** pRequest, int64_t reqid);
void taos_close_internal(void* taos);
@@ -380,7 +384,6 @@ void hbMgrInitMqHbRspHandle();
typedef struct SSqlCallbackWrapper {
SParseContext* pParseCtx;
SCatalogReq* pCatalogReq;
- SMetaData* pResultMeta;
SRequestObj* pRequest;
} SSqlCallbackWrapper;
@@ -394,7 +397,7 @@ int32_t removeMeta(STscObj* pTscObj, SArray* tbList);
int32_t handleAlterTbExecRes(void* res, struct SCatalog* pCatalog);
int32_t handleCreateTbExecRes(void* res, SCatalog* pCatalog);
bool qnodeRequired(SRequestObj* pRequest);
-int32_t continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest);
+void continueInsertFromCsv(SSqlCallbackWrapper* pWrapper, SRequestObj* pRequest);
void destorySqlCallbackWrapper(SSqlCallbackWrapper* pWrapper);
#ifdef __cplusplus
diff --git a/source/client/inc/clientStmt.h b/source/client/inc/clientStmt.h
index ef4c05afaed56cc64b17dde5247ceef1a4332417..e5507ccf816b9fd591e6e27ee2974badcb5734ed 100644
--- a/source/client/inc/clientStmt.h
+++ b/source/client/inc/clientStmt.h
@@ -101,11 +101,18 @@ typedef struct STscStmt {
SStmtSQLInfo sql;
SStmtExecInfo exec;
SStmtBindInfo bInfo;
+
+ int64_t reqid;
} STscStmt;
extern char *gStmtStatusStr[];
-#define STMT_LOG_SEQ(n) do { (pStmt)->seqId++; (pStmt)->seqIds[n]++; STMT_DLOG("the %dth:%d %s", (pStmt)->seqIds[n], (pStmt)->seqId, gStmtStatusStr[n]); } while (0)
+#define STMT_LOG_SEQ(n) \
+ do { \
+ (pStmt)->seqId++; \
+ (pStmt)->seqIds[n]++; \
+ STMT_DLOG("the %dth:%d %s", (pStmt)->seqIds[n], (pStmt)->seqId, gStmtStatusStr[n]); \
+ } while (0)
#define STMT_STATUS_NE(S) (pStmt->sql.status != STMT_##S)
#define STMT_STATUS_EQ(S) (pStmt->sql.status == STMT_##S)
@@ -141,7 +148,7 @@ extern char *gStmtStatusStr[];
#define STMT_ELOG_E(param) qError("stmt:%p " param, pStmt)
#define STMT_DLOG_E(param) qDebug("stmt:%p " param, pStmt)
-TAOS_STMT *stmtInit(STscObj *taos);
+TAOS_STMT *stmtInit(STscObj *taos, int64_t reqid);
int stmtClose(TAOS_STMT *stmt);
int stmtExec(TAOS_STMT *stmt);
const char *stmtErrstr(TAOS_STMT *stmt);
diff --git a/source/client/src/clientEnv.c b/source/client/src/clientEnv.c
index 0f6d394611504828e48766c9b471b02fb04b3916..3f4e1bb513ef6ef4db76710aa388df6de23ec4d1 100644
--- a/source/client/src/clientEnv.c
+++ b/source/client/src/clientEnv.c
@@ -77,19 +77,19 @@ static void deregisterRequest(SRequestObj *pRequest) {
pRequest->self, pTscObj->id, pRequest->requestId, duration / 1000.0, num, currentInst);
if (QUERY_NODE_VNODE_MODIF_STMT == pRequest->stmtType) {
-// tscPerf("insert duration %" PRId64 "us: syntax:%" PRId64 "us, ctg:%" PRId64 "us, semantic:%" PRId64
-// "us, exec:%" PRId64 "us",
-// duration, pRequest->metric.syntaxEnd - pRequest->metric.syntaxStart,
-// pRequest->metric.ctgEnd - pRequest->metric.ctgStart, pRequest->metric.semanticEnd - pRequest->metric.ctgEnd,
-// pRequest->metric.execEnd - pRequest->metric.semanticEnd);
+ // tscPerf("insert duration %" PRId64 "us: syntax:%" PRId64 "us, ctg:%" PRId64 "us, semantic:%" PRId64
+ // "us, exec:%" PRId64 "us",
+ // duration, pRequest->metric.syntaxEnd - pRequest->metric.syntaxStart,
+ // pRequest->metric.ctgEnd - pRequest->metric.ctgStart, pRequest->metric.semanticEnd -
+ // pRequest->metric.ctgEnd, pRequest->metric.execEnd - pRequest->metric.semanticEnd);
atomic_add_fetch_64((int64_t *)&pActivity->insertElapsedTime, duration);
} else if (QUERY_NODE_SELECT_STMT == pRequest->stmtType) {
-// tscPerf("select duration %" PRId64 "us: syntax:%" PRId64 "us, ctg:%" PRId64 "us, semantic:%" PRId64
-// "us, planner:%" PRId64 "us, exec:%" PRId64 "us, reqId:0x%" PRIx64,
-// duration, pRequest->metric.syntaxEnd - pRequest->metric.syntaxStart,
-// pRequest->metric.ctgEnd - pRequest->metric.ctgStart, pRequest->metric.semanticEnd - pRequest->metric.ctgEnd,
-// pRequest->metric.planEnd - pRequest->metric.semanticEnd,
-// pRequest->metric.resultReady - pRequest->metric.planEnd, pRequest->requestId);
+ // tscPerf("select duration %" PRId64 "us: syntax:%" PRId64 "us, ctg:%" PRId64 "us, semantic:%" PRId64
+ // "us, planner:%" PRId64 "us, exec:%" PRId64 "us, reqId:0x%" PRIx64,
+ // duration, pRequest->metric.syntaxEnd - pRequest->metric.syntaxStart,
+ // pRequest->metric.ctgEnd - pRequest->metric.ctgStart, pRequest->metric.semanticEnd -
+ // pRequest->metric.ctgEnd, pRequest->metric.planEnd - pRequest->metric.semanticEnd,
+ // pRequest->metric.resultReady - pRequest->metric.planEnd, pRequest->requestId);
atomic_add_fetch_64((int64_t *)&pActivity->queryElapsedTime, duration);
}
@@ -140,12 +140,15 @@ void *openTransporter(const char *user, const char *auth, int32_t numOfThread) {
rpcInit.numOfThreads = numOfThread;
rpcInit.cfp = processMsgFromServer;
rpcInit.rfp = clientRpcRfp;
- // rpcInit.tfp = clientRpcTfp;
rpcInit.sessions = 1024;
rpcInit.connType = TAOS_CONN_CLIENT;
rpcInit.user = (char *)user;
rpcInit.idleTime = tsShellActivityTimer * 1000;
rpcInit.compressSize = tsCompressMsgSize;
+ rpcInit.dfp = destroyAhandle;
+ rpcInit.retryLimit = tsRpcRetryLimit;
+ rpcInit.retryInterval = tsRpcRetryInterval;
+
void *pDnodeConn = rpcOpen(&rpcInit);
if (pDnodeConn == NULL) {
tscError("failed to init connection to server");
@@ -271,7 +274,7 @@ STscObj *acquireTscObj(int64_t rid) { return (STscObj *)taosAcquireRef(clientCon
int32_t releaseTscObj(int64_t rid) { return taosReleaseRef(clientConnRefPool, rid); }
-void *createRequest(uint64_t connId, int32_t type) {
+void *createRequest(uint64_t connId, int32_t type, int64_t reqid) {
SRequestObj *pRequest = (SRequestObj *)taosMemoryCalloc(1, sizeof(SRequestObj));
if (NULL == pRequest) {
terrno = TSDB_CODE_TSC_OUT_OF_MEMORY;
@@ -286,7 +289,7 @@ void *createRequest(uint64_t connId, int32_t type) {
}
pRequest->resType = RES_TYPE__QUERY;
- pRequest->requestId = generateRequestId();
+ pRequest->requestId = reqid == 0 ? generateRequestId() : reqid;
pRequest->metric.start = taosGetTimestampUs();
pRequest->body.resInfo.convertUcs4 = true; // convert ucs4 by default
diff --git a/source/client/src/clientHb.c b/source/client/src/clientHb.c
index fa0e3212a34b27b49432e2affe079852dfe6a0f3..0f881beb66812b0f5ce509596bcc31f5764c349d 100644
--- a/source/client/src/clientHb.c
+++ b/source/client/src/clientHb.c
@@ -61,7 +61,8 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog
int32_t numOfBatchs = taosArrayGetSize(batchUseRsp.pArray);
for (int32_t i = 0; i < numOfBatchs; ++i) {
SUseDbRsp *rsp = taosArrayGet(batchUseRsp.pArray, i);
- tscDebug("hb db rsp, db:%s, vgVersion:%d, uid:%" PRIx64, rsp->db, rsp->vgVersion, rsp->uid);
+ tscDebug("hb db rsp, db:%s, vgVersion:%d, stateTs:%" PRId64 ", uid:%" PRIx64, rsp->db, rsp->vgVersion, rsp->stateTs,
+ rsp->uid);
if (rsp->vgVersion < 0) {
code = catalogRemoveDB(pCatalog, rsp->db, rsp->uid);
@@ -72,6 +73,7 @@ static int32_t hbProcessDBInfoRsp(void *value, int32_t valueLen, struct SCatalog
}
vgInfo->vgVersion = rsp->vgVersion;
+ vgInfo->stateTs = rsp->stateTs;
vgInfo->hashMethod = rsp->hashMethod;
vgInfo->hashPrefix = rsp->hashPrefix;
vgInfo->hashSuffix = rsp->hashSuffix;
@@ -292,6 +294,7 @@ static int32_t hbAsyncCallBack(void *param, SDataBuf *pMsg, int32_t code) {
taosThreadMutexUnlock(&appInfo.mutex);
tscError("cluster not exist, key:%s", key);
taosMemoryFree(pMsg->pData);
+ taosMemoryFree(pMsg->pEpSet);
tFreeClientHbBatchRsp(&pRsp);
return -1;
}
@@ -321,6 +324,7 @@ static int32_t hbAsyncCallBack(void *param, SDataBuf *pMsg, int32_t code) {
tFreeClientHbBatchRsp(&pRsp);
taosMemoryFree(pMsg->pData);
+ taosMemoryFree(pMsg->pEpSet);
return code;
}
@@ -486,6 +490,7 @@ int32_t hbGetExpiredDBInfo(SClientHbKey *connKey, struct SCatalog *pCatalog, SCl
db->dbId = htobe64(db->dbId);
db->vgVersion = htonl(db->vgVersion);
db->numOfTable = htonl(db->numOfTable);
+ db->stateTs = htobe64(db->stateTs);
}
SKv kv = {
diff --git a/source/client/src/clientImpl.c b/source/client/src/clientImpl.c
index e9e30a0be2f71d7ccbc3603306db588678f5b6b8..c3140371c4f50175772131ae2f2c9a0abf0f8787 100644
--- a/source/client/src/clientImpl.c
+++ b/source/client/src/clientImpl.c
@@ -154,8 +154,8 @@ STscObj* taos_connect_internal(const char* ip, const char* user, const char* pas
}
int32_t buildRequest(uint64_t connId, const char* sql, int sqlLen, void* param, bool validateSql,
- SRequestObj** pRequest) {
- *pRequest = createRequest(connId, TSDB_SQL_SELECT);
+ SRequestObj** pRequest, int64_t reqid) {
+ *pRequest = createRequest(connId, TSDB_SQL_SELECT, reqid);
if (*pRequest == NULL) {
tscError("failed to malloc sqlObj, %s", sql);
return terrno;
@@ -873,6 +873,10 @@ int32_t handleQueryExecRsp(SRequestObj* pRequest) {
return code;
}
+static bool incompletaFileParsing(SNode* pStmt) {
+ return QUERY_NODE_VNODE_MODIF_STMT != nodeType(pStmt) ? false : ((SVnodeModifOpStmt*)pStmt)->fileProcessing;
+}
+
// todo refacto the error code mgmt
void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) {
SSqlCallbackWrapper* pWrapper = param;
@@ -927,11 +931,10 @@ void schedulerExecCb(SExecResult* pResult, void* param, int32_t code) {
pRequest->code = code1;
}
- if (pRequest->code == TSDB_CODE_SUCCESS && NULL != pWrapper->pParseCtx && pWrapper->pParseCtx->needMultiParse) {
- code = continueInsertFromCsv(pWrapper, pRequest);
- if (TSDB_CODE_SUCCESS == code) {
- return;
- }
+ if (pRequest->code == TSDB_CODE_SUCCESS && NULL != pRequest->pQuery &&
+ incompletaFileParsing(pRequest->pQuery->pRoot)) {
+ continueInsertFromCsv(pWrapper, pRequest);
+ return;
}
destorySqlCallbackWrapper(pWrapper);
@@ -1055,7 +1058,9 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
}
if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
SArray* pNodeList = NULL;
- buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
+ if (QUERY_NODE_VNODE_MODIF_STMT != nodeType(pQuery->pRoot)) {
+ buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
+ }
SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter,
.requestId = pRequest->requestId,
@@ -1230,7 +1235,7 @@ STscObj* taosConnectImpl(const char* user, const char* auth, const char* db, __t
return pTscObj;
}
- SRequestObj* pRequest = createRequest(pTscObj->id, TDMT_MND_CONNECT);
+ SRequestObj* pRequest = createRequest(pTscObj->id, TDMT_MND_CONNECT, 0);
if (pRequest == NULL) {
destroyTscObj(pTscObj);
return NULL;
@@ -1966,6 +1971,8 @@ TSDB_SERVER_STATUS taos_check_server_status(const char* fqdn, int port, char* de
rpcInit.idleTime = tsShellActivityTimer * 1000;
rpcInit.compressSize = tsCompressMsgSize;
rpcInit.user = "_dnd";
+ rpcInit.retryLimit = tsRpcRetryLimit;
+ rpcInit.retryInterval = tsRpcRetryInterval;
clientRpc = rpcOpen(&rpcInit);
if (clientRpc == NULL) {
@@ -2234,7 +2241,37 @@ void taosAsyncQueryImpl(uint64_t connId, const char* sql, __taos_async_fn_t fp,
}
SRequestObj* pRequest = NULL;
- int32_t code = buildRequest(connId, sql, sqlLen, param, validateOnly, &pRequest);
+ int32_t code = buildRequest(connId, sql, sqlLen, param, validateOnly, &pRequest, 0);
+ if (code != TSDB_CODE_SUCCESS) {
+ terrno = code;
+ fp(param, NULL, terrno);
+ return;
+ }
+
+ pRequest->body.queryFp = fp;
+ doAsyncQuery(pRequest, false);
+}
+void taosAsyncQueryImplWithReqid(uint64_t connId, const char* sql, __taos_async_fn_t fp, void* param, bool validateOnly,
+ int64_t reqid) {
+ if (sql == NULL || NULL == fp) {
+ terrno = TSDB_CODE_INVALID_PARA;
+ if (fp) {
+ fp(param, NULL, terrno);
+ }
+
+ return;
+ }
+
+ size_t sqlLen = strlen(sql);
+ if (sqlLen > (size_t)TSDB_MAX_ALLOWED_SQL_LEN) {
+ tscError("sql string exceeds max length:%d", TSDB_MAX_ALLOWED_SQL_LEN);
+ terrno = TSDB_CODE_TSC_EXCEED_SQL_LIMIT;
+ fp(param, NULL, terrno);
+ return;
+ }
+
+ SRequestObj* pRequest = NULL;
+ int32_t code = buildRequest(connId, sql, sqlLen, param, validateOnly, &pRequest, reqid);
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
fp(param, NULL, terrno);
@@ -2261,3 +2298,20 @@ TAOS_RES* taosQueryImpl(TAOS* taos, const char* sql, bool validateOnly) {
}
return param->pRequest;
}
+
+TAOS_RES* taosQueryImplWithReqid(TAOS* taos, const char* sql, bool validateOnly, int64_t reqid) {
+ if (NULL == taos) {
+ terrno = TSDB_CODE_TSC_DISCONNECTED;
+ return NULL;
+ }
+
+ SSyncQueryParam* param = taosMemoryCalloc(1, sizeof(SSyncQueryParam));
+ tsem_init(¶m->sem, 0, 0);
+
+ taosAsyncQueryImplWithReqid(*(int64_t*)taos, sql, syncQueryFn, param, validateOnly, reqid);
+ tsem_wait(¶m->sem);
+ if (param->pRequest != NULL) {
+ param->pRequest->syncQuery = true;
+ }
+ return param->pRequest;
+}
diff --git a/source/client/src/clientMain.c b/source/client/src/clientMain.c
index a08eab3a29a36bc3944939a0e6d88e47bf16c6a3..0aa88382febc2204a69a8198fc3ed5f1848dee70 100644
--- a/source/client/src/clientMain.c
+++ b/source/client/src/clientMain.c
@@ -248,6 +248,9 @@ TAOS_FIELD *taos_fetch_fields(TAOS_RES *res) {
}
TAOS_RES *taos_query(TAOS *taos, const char *sql) { return taosQueryImpl(taos, sql, false); }
+TAOS_RES *taos_query_with_reqid(TAOS *taos, const char *sql, int64_t reqid) {
+ return taosQueryImplWithReqid(taos, sql, false, reqid);
+}
TAOS_ROW taos_fetch_row(TAOS_RES *res) {
if (res == NULL) {
@@ -674,6 +677,7 @@ static void destoryCatalogReq(SCatalogReq *pCatalogReq) {
taosArrayDestroy(pCatalogReq->pIndex);
taosArrayDestroy(pCatalogReq->pUser);
taosArrayDestroy(pCatalogReq->pTableIndex);
+ taosArrayDestroy(pCatalogReq->pTableCfg);
taosMemoryFree(pCatalogReq);
}
@@ -683,11 +687,10 @@ void destorySqlCallbackWrapper(SSqlCallbackWrapper *pWrapper) {
}
destoryCatalogReq(pWrapper->pCatalogReq);
qDestroyParseContext(pWrapper->pParseCtx);
- catalogFreeMetaData(pWrapper->pResultMeta);
taosMemoryFree(pWrapper);
}
-void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
+static void doAsyncQueryFromAnalyse(SMetaData *pResultMeta, void *param, int32_t code) {
SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)param;
SRequestObj *pRequest = pWrapper->pRequest;
SQuery *pQuery = pRequest->pQuery;
@@ -705,13 +708,6 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
pRequest->metric.semanticEnd = taosGetTimestampUs();
- if (code == TSDB_CODE_SUCCESS && pWrapper->pParseCtx->needMultiParse) {
- pWrapper->pResultMeta = catalogCloneMetaData(pResultMeta);
- if (NULL == pWrapper->pResultMeta) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- }
- }
-
if (code == TSDB_CODE_SUCCESS) {
if (pQuery->haveResultSet) {
setResSchemaInfo(&pRequest->body.resInfo, pQuery->pResSchema, pQuery->numOfResCols);
@@ -748,14 +744,83 @@ void retrieveMetaCallback(SMetaData *pResultMeta, void *param, int32_t code) {
}
}
-int32_t continueInsertFromCsv(SSqlCallbackWrapper *pWrapper, SRequestObj *pRequest) {
- qDestroyQuery(pRequest->pQuery);
- pRequest->pQuery = (SQuery *)nodesMakeNode(QUERY_NODE_QUERY);
- if (NULL == pRequest->pQuery) {
- return TSDB_CODE_OUT_OF_MEMORY;
+static int32_t getAllMetaAsync(SSqlCallbackWrapper *pWrapper, catalogCallback fp) {
+ SRequestConnInfo conn = {.pTrans = pWrapper->pParseCtx->pTransporter,
+ .requestId = pWrapper->pParseCtx->requestId,
+ .requestObjRefId = pWrapper->pParseCtx->requestRid,
+ .mgmtEps = pWrapper->pParseCtx->mgmtEpSet};
+
+ pWrapper->pRequest->metric.ctgStart = taosGetTimestampUs();
+
+ return catalogAsyncGetAllMeta(pWrapper->pParseCtx->pCatalog, &conn, pWrapper->pCatalogReq, fp, pWrapper,
+ &pWrapper->pRequest->body.queryJob);
+}
+
+static void doAsyncQueryFromParse(SMetaData *pResultMeta, void *param, int32_t code);
+
+static int32_t phaseAsyncQuery(SSqlCallbackWrapper *pWrapper) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ switch (pWrapper->pRequest->pQuery->execStage) {
+ case QUERY_EXEC_STAGE_PARSE: {
+ // continue parse after get metadata
+ code = getAllMetaAsync(pWrapper, doAsyncQueryFromParse);
+ break;
+ }
+ case QUERY_EXEC_STAGE_ANALYSE: {
+ // analysis after get metadata
+ code = getAllMetaAsync(pWrapper, doAsyncQueryFromAnalyse);
+ break;
+ }
+ case QUERY_EXEC_STAGE_SCHEDULE: {
+ launchAsyncQuery(pWrapper->pRequest, pWrapper->pRequest->pQuery, NULL, pWrapper);
+ break;
+ }
+ default:
+ break;
+ }
+ return code;
+}
+
+static void doAsyncQueryFromParse(SMetaData *pResultMeta, void *param, int32_t code) {
+ SSqlCallbackWrapper *pWrapper = (SSqlCallbackWrapper *)param;
+ SRequestObj *pRequest = pWrapper->pRequest;
+ SQuery *pQuery = pRequest->pQuery;
+
+ pRequest->metric.ctgEnd = taosGetTimestampUs();
+ qDebug("0x%" PRIx64 " start to continue parse, reqId:0x%" PRIx64, pRequest->self, pRequest->requestId);
+
+ if (code == TSDB_CODE_SUCCESS) {
+ code = qContinueParseSql(pWrapper->pParseCtx, pWrapper->pCatalogReq, pResultMeta, pQuery);
+ }
+
+ if (TSDB_CODE_SUCCESS == code) {
+ code = phaseAsyncQuery(pWrapper);
+ }
+
+ if (TSDB_CODE_SUCCESS != code) {
+ tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pWrapper->pRequest->self, code,
+ tstrerror(code), pWrapper->pRequest->requestId);
+ destorySqlCallbackWrapper(pWrapper);
+ terrno = code;
+ pRequest->code = code;
+ pRequest->body.queryFp(pRequest->body.param, pRequest, code);
+ }
+}
+
+void continueInsertFromCsv(SSqlCallbackWrapper *pWrapper, SRequestObj *pRequest) {
+ int32_t code = qParseSqlSyntax(pWrapper->pParseCtx, &pRequest->pQuery, pWrapper->pCatalogReq);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = phaseAsyncQuery(pWrapper);
+ }
+
+ if (TSDB_CODE_SUCCESS != code) {
+ tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pWrapper->pRequest->self, code,
+ tstrerror(code), pWrapper->pRequest->requestId);
+ destorySqlCallbackWrapper(pWrapper);
+ terrno = code;
+ pWrapper->pRequest->code = code;
+ pWrapper->pRequest->body.queryFp(pWrapper->pRequest->body.param, pWrapper->pRequest, code);
}
- retrieveMetaCallback(pWrapper->pResultMeta, pWrapper, TSDB_CODE_SUCCESS);
- return TSDB_CODE_SUCCESS;
}
void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param) {
@@ -763,6 +828,11 @@ void taos_query_a(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param
taosAsyncQueryImpl(connId, sql, fp, param, false);
}
+void taos_query_a_with_reqid(TAOS *taos, const char *sql, __taos_async_fn_t fp, void *param, int64_t reqid) {
+ int64_t connId = *(int64_t *)taos;
+ taosAsyncQueryImplWithReqid(connId, sql, fp, param, false, reqid);
+}
+
int32_t createParseContext(const SRequestObj *pRequest, SParseContext **pCxt) {
const STscObj *pTscObj = pRequest->pTscObj;
@@ -837,26 +907,16 @@ void doAsyncQuery(SRequestObj *pRequest, bool updateMetaForce) {
if (TSDB_CODE_SUCCESS == code && !updateMetaForce) {
SAppClusterSummary *pActivity = &pTscObj->pAppInfo->summary;
- if (NULL == pRequest->pQuery->pRoot) {
+ if (QUERY_NODE_INSERT_STMT == nodeType(pRequest->pQuery->pRoot)) {
atomic_add_fetch_64((int64_t *)&pActivity->numOfInsertsReq, 1);
- } else if (QUERY_NODE_SELECT_STMT == pRequest->pQuery->pRoot->type) {
+ } else if (QUERY_NODE_SELECT_STMT == nodeType(pRequest->pQuery->pRoot)) {
atomic_add_fetch_64((int64_t *)&pActivity->numOfQueryReq, 1);
}
}
if (TSDB_CODE_SUCCESS == code) {
- SRequestConnInfo conn = {.pTrans = pWrapper->pParseCtx->pTransporter,
- .requestId = pWrapper->pParseCtx->requestId,
- .requestObjRefId = pWrapper->pParseCtx->requestRid,
- .mgmtEps = pWrapper->pParseCtx->mgmtEpSet};
-
- pRequest->metric.ctgStart = taosGetTimestampUs();
-
- code = catalogAsyncGetAllMeta(pWrapper->pParseCtx->pCatalog, &conn, pWrapper->pCatalogReq, retrieveMetaCallback,
- pWrapper, &pRequest->body.queryJob);
- }
-
- if (TSDB_CODE_SUCCESS != code) {
+ phaseAsyncQuery(pWrapper);
+ } else {
tscError("0x%" PRIx64 " error happens, code:%d - %s, reqId:0x%" PRIx64, pRequest->self, code, tstrerror(code),
pRequest->requestId);
destorySqlCallbackWrapper(pWrapper);
@@ -931,7 +991,7 @@ void taos_fetch_rows_a(TAOS_RES *res, __taos_async_fn_t fp, void *param) {
// all data has returned to App already, no need to try again
if (pResultInfo->completed) {
// it is a local executed query, no need to do async fetch
- if (QUERY_EXEC_MODE_LOCAL == pRequest->body.execMode) {
+ if (QUERY_EXEC_MODE_SCHEDULE != pRequest->body.execMode) {
if (pResultInfo->localResultFetched) {
pResultInfo->numOfRows = 0;
pResultInfo->current = 0;
@@ -992,7 +1052,7 @@ int taos_get_db_route_info(TAOS *taos, const char *db, TAOS_DB_ROUTE_INFO *dbInf
int64_t connId = *(int64_t *)taos;
SRequestObj *pRequest = NULL;
char *sql = "taos_get_db_route_info";
- int32_t code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest);
+ int32_t code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
return terrno;
@@ -1041,7 +1101,7 @@ int taos_get_table_vgId(TAOS *taos, const char *db, const char *table, int *vgId
int64_t connId = *(int64_t *)taos;
SRequestObj *pRequest = NULL;
char *sql = "taos_get_table_vgId";
- int32_t code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest);
+ int32_t code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
return terrno;
}
@@ -1102,7 +1162,7 @@ int taos_load_table_info(TAOS *taos, const char *tableNameList) {
}
char *sql = "taos_load_table_info";
- code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest);
+ code = buildRequest(connId, sql, strlen(sql), NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
goto _return;
@@ -1147,7 +1207,22 @@ TAOS_STMT *taos_stmt_init(TAOS *taos) {
return NULL;
}
- TAOS_STMT *pStmt = stmtInit(pObj);
+ TAOS_STMT *pStmt = stmtInit(pObj, 0);
+
+ releaseTscObj(*(int64_t *)taos);
+
+ return pStmt;
+}
+
+TAOS_STMT *taos_stmt_init_with_reqid(TAOS *taos, int64_t reqid) {
+ STscObj *pObj = acquireTscObj(*(int64_t *)taos);
+ if (NULL == pObj) {
+ tscError("invalid parameter for %s", __FUNCTION__);
+ terrno = TSDB_CODE_TSC_DISCONNECTED;
+ return NULL;
+ }
+
+ TAOS_STMT *pStmt = stmtInit(pObj, reqid);
releaseTscObj(*(int64_t *)taos);
diff --git a/source/client/src/clientMsgHandler.c b/source/client/src/clientMsgHandler.c
index 938cc4e41d267f08c5d2ce5d90113632d518c114..8437c93bae498591739024d3873d4afc71efaddd 100644
--- a/source/client/src/clientMsgHandler.c
+++ b/source/client/src/clientMsgHandler.c
@@ -175,12 +175,13 @@ int32_t processCreateDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
int32_t processUseDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
SRequestObj* pRequest = param;
- if (TSDB_CODE_MND_DB_NOT_EXIST == code) {
+ if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
+ TSDB_CODE_MND_DB_IN_DROPPING == code) {
SUseDbRsp usedbRsp = {0};
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
struct SCatalog* pCatalog = NULL;
- if (usedbRsp.vgVersion >= 0) {
+ if (usedbRsp.vgVersion >= 0) { // cached in local
uint64_t clusterId = pRequest->pTscObj->pAppInfo->clusterId;
int32_t code1 = catalogGetHandle(clusterId, &pCatalog);
if (code1 != TSDB_CODE_SUCCESS) {
@@ -212,7 +213,20 @@ int32_t processUseDbRsp(void* param, SDataBuf* pMsg, int32_t code) {
tDeserializeSUseDbRsp(pMsg->pData, pMsg->len, &usedbRsp);
if (strlen(usedbRsp.db) == 0) {
- return TSDB_CODE_MND_DB_NOT_EXIST;
+ if (usedbRsp.errCode != 0) {
+ return usedbRsp.errCode;
+ } else {
+ return TSDB_CODE_APP_ERROR;
+ }
+ }
+
+ tscTrace("db:%s, usedbRsp received, numOfVgroups:%d", usedbRsp.db, usedbRsp.vgNum);
+ for (int32_t i = 0; i < usedbRsp.vgNum; ++i) {
+ SVgroupInfo* pInfo = taosArrayGet(usedbRsp.pVgroupInfos, i);
+ tscTrace("vgId:%d, numOfEps:%d inUse:%d ", pInfo->vgId, pInfo->epSet.numOfEps, pInfo->epSet.inUse);
+ for (int32_t j = 0; j < pInfo->epSet.numOfEps; ++j) {
+ tscTrace("vgId:%d, index:%d epset:%s:%u", pInfo->vgId, j, pInfo->epSet.eps[j].fqdn, pInfo->epSet.eps[j].port);
+ }
}
SName name = {0};
@@ -428,8 +442,7 @@ static int32_t buildShowVariablesRsp(SArray* pVars, SRetrieveTableRsp** pRsp) {
(*pRsp)->numOfRows = htonl(pBlock->info.rows);
(*pRsp)->numOfCols = htonl(SHOW_VARIABLES_RESULT_COLS);
- int32_t len = 0;
- blockEncode(pBlock, (*pRsp)->data, &len, SHOW_VARIABLES_RESULT_COLS, false);
+ int32_t len = blockEncode(pBlock, (*pRsp)->data, SHOW_VARIABLES_RESULT_COLS);
ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
blockDataDestroy(pBlock);
diff --git a/source/client/src/clientRawBlockWrite.c b/source/client/src/clientRawBlockWrite.c
index 4326ab3519dcc1469fd852de4384b468cb9f8bd6..90a2adb64743585070a4f5a2e5414c1d45648bf2 100644
--- a/source/client/src/clientRawBlockWrite.c
+++ b/source/client/src/clientRawBlockWrite.c
@@ -410,7 +410,7 @@ static char* processAlterTable(SMqMetaRsp* metaRsp) {
SDecoder decoder = {0};
SVAlterTbReq vAlterTbReq = {0};
char* string = NULL;
- cJSON* json = NULL;
+ cJSON* json = NULL;
// decode
void* data = POINTER_SHIFT(metaRsp->metaRsp, sizeof(SMsgHead));
@@ -525,7 +525,7 @@ static char* processDropSTable(SMqMetaRsp* metaRsp) {
SDecoder decoder = {0};
SVDropStbReq req = {0};
char* string = NULL;
- cJSON* json = NULL;
+ cJSON* json = NULL;
// decode
void* data = POINTER_SHIFT(metaRsp->metaRsp, sizeof(SMsgHead));
@@ -558,7 +558,7 @@ static char* processDropTable(SMqMetaRsp* metaRsp) {
SDecoder decoder = {0};
SVDropTbBatchReq req = {0};
char* string = NULL;
- cJSON* json = NULL;
+ cJSON* json = NULL;
// decode
void* data = POINTER_SHIFT(metaRsp->metaRsp, sizeof(SMsgHead));
@@ -603,7 +603,7 @@ static int32_t taosCreateStb(TAOS* taos, void* meta, int32_t metaLen) {
int32_t code = TSDB_CODE_SUCCESS;
SRequestObj* pRequest = NULL;
- code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -692,7 +692,7 @@ static int32_t taosDropStb(TAOS* taos, void* meta, int32_t metaLen) {
int32_t code = TSDB_CODE_SUCCESS;
SRequestObj* pRequest = NULL;
- code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -773,7 +773,7 @@ static int32_t taosCreateTable(TAOS* taos, void* meta, int32_t metaLen) {
SQuery* pQuery = NULL;
SHashObj* pVgroupHashmap = NULL;
- code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -926,7 +926,7 @@ static int32_t taosDropTable(TAOS* taos, void* meta, int32_t metaLen) {
SQuery* pQuery = NULL;
SHashObj* pVgroupHashmap = NULL;
- code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -1097,7 +1097,7 @@ static int32_t taosAlterTable(TAOS* taos, void* meta, int32_t metaLen) {
SArray* pArray = NULL;
SVgDataBlocks* pVgData = NULL;
- code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest);
+ code = buildRequest(*(int64_t*)taos, "", 0, NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
goto end;
@@ -1217,7 +1217,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
SQuery* pQuery = NULL;
SSubmitReq* subReq = NULL;
- SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
+ SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0);
if (!pRequest) {
uError("WriteRaw:createRequest error request is null");
code = terrno;
@@ -1281,7 +1281,7 @@ int taos_write_raw_block(TAOS* taos, int rows, char* pData, const char* tbname)
int32_t schemaLen = 0;
int32_t submitLen = sizeof(SSubmitBlk) + schemaLen + rows * extendedRowSize;
- int32_t totalLen = sizeof(SSubmitReq) + submitLen;
+ int32_t totalLen = sizeof(SSubmitReq) + submitLen;
subReq = taosMemoryCalloc(1, totalLen);
SSubmitBlk* blk = POINTER_SHIFT(subReq, sizeof(SSubmitReq));
void* blkSchema = POINTER_SHIFT(blk, sizeof(SSubmitBlk));
@@ -1407,7 +1407,7 @@ static int32_t tmqWriteRawDataImpl(TAOS* taos, void* data, int32_t dataLen) {
STableMeta* pTableMeta = NULL;
terrno = TSDB_CODE_SUCCESS;
- SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
+ SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0);
if (!pRequest) {
uError("WriteRaw:createRequest error request is null");
return terrno;
@@ -1674,7 +1674,7 @@ static int32_t tmqWriteRawMetaDataImpl(TAOS* taos, void* data, int32_t dataLen)
STableMeta* pTableMeta = NULL;
terrno = TSDB_CODE_SUCCESS;
- SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT);
+ SRequestObj* pRequest = (SRequestObj*)createRequest(*(int64_t*)taos, TSDB_SQL_INSERT, 0);
if (!pRequest) {
uError("WriteRaw:createRequest error request is null");
return terrno;
diff --git a/source/client/src/clientSml.c b/source/client/src/clientSml.c
index 5da7bebf2a87902c55f31b0eb9a3b4eef5dce84d..4cd1b5416c31e7d22dce0d8f8a15c56c6c51c9b2 100644
--- a/source/client/src/clientSml.c
+++ b/source/client/src/clientSml.c
@@ -28,12 +28,12 @@
#define QUOTE '"'
#define SLASH '\\'
-#define JUMP_SPACE(sql, sqlEnd) \
- while (sql < sqlEnd) { \
- if (*sql == SPACE) \
- sql++; \
- else \
- break; \
+#define JUMP_SPACE(sql, sqlEnd) \
+ while (sql < sqlEnd) { \
+ if (*sql == SPACE) \
+ sql++; \
+ else \
+ break; \
}
// comma ,
#define IS_SLASH_COMMA(sql) (*(sql) == COMMA && *((sql)-1) == SLASH)
@@ -353,7 +353,7 @@ static int32_t smlSendMetaMsg(SSmlHandle *info, SName *pName, SArray *pColumns,
pReq.numOfTags = taosArrayGetSize(pTags);
pReq.pTags = pTags;
- code = buildRequest(info->taos->id, "", 0, NULL, false, &pRequest);
+ code = buildRequest(info->taos->id, "", 0, NULL, false, &pRequest, 0);
if (code != TSDB_CODE_SUCCESS) {
goto end;
}
@@ -1010,9 +1010,9 @@ static void smlParseTelnetElement(const char **sql, const char *sqlEnd, const ch
}
}
-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;
+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 < sqlEnd) {
@@ -1093,7 +1093,8 @@ static int32_t smlParseTelnetTags(const char *data, const char *sqlEnd, SArray *
}
// format: =[ =]
-static int32_t smlParseTelnetString(SSmlHandle *info, const char *sql, const char *sqlEnd, 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
@@ -1372,19 +1373,19 @@ 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 **kv1pp = (SSmlKv **)taosHashGet(s1, TS, TS_LEN);
- SSmlKv **kv2pp = (SSmlKv **)taosHashGet(s2, TS, TS_LEN);
- if(!kv1pp || !kv2pp){
+ 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){
+ SSmlKv *kv1 = *kv1pp;
+ SSmlKv *kv2 = *kv2pp;
+ if (!kv1 || kv1->type != TSDB_DATA_TYPE_TIMESTAMP) {
uError("smlKvTimeHashCompare kv1");
return -1;
}
- if(!kv2 || kv2->type != TSDB_DATA_TYPE_TIMESTAMP){
+ if (!kv2 || kv2->type != TSDB_DATA_TYPE_TIMESTAMP) {
uError("smlKvTimeHashCompare kv2");
return -1;
}
@@ -1947,7 +1948,7 @@ static int32_t smlParseValueFromJSON(cJSON *root, SSmlKv *kv) {
}
static int32_t smlParseColsFromJSON(cJSON *root, SArray *cols) {
- if(!cols) return TSDB_CODE_OUT_OF_MEMORY;
+ if (!cols) return TSDB_CODE_OUT_OF_MEMORY;
cJSON *metricVal = cJSON_GetObjectItem(root, "value");
if (metricVal == NULL) {
return TSDB_CODE_TSC_INVALID_JSON;
@@ -1971,7 +1972,7 @@ static int32_t smlParseColsFromJSON(cJSON *root, SArray *cols) {
static int32_t smlParseTagsFromJSON(cJSON *root, SArray *pKVs, char *childTableName, SHashObj *dumplicateKey,
SSmlMsgBuf *msg) {
int32_t ret = TSDB_CODE_SUCCESS;
- if (!pKVs){
+ if (!pKVs) {
return TSDB_CODE_OUT_OF_MEMORY;
}
cJSON *tags = cJSON_GetObjectItem(root, "tags");
@@ -2081,7 +2082,7 @@ static int32_t smlParseJSONString(SSmlHandle *info, cJSON *root, SSmlTableInfo *
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);
+ uDebug("SML:0x%" PRIx64 " smlParseInfluxLine sql", info->id);
int ret = smlParseInfluxString(sql, sql + len, &elements, &info->msgBuf);
if (ret != TSDB_CODE_SUCCESS) {
@@ -2204,7 +2205,7 @@ static int32_t smlParseTelnetLine(SSmlHandle *info, void *data, const int len) {
}
if (info->protocol == TSDB_SML_TELNET_PROTOCOL) {
- ret = smlParseTelnetString(info, (const char *)data, (char*)data + len, 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 {
@@ -2384,16 +2385,16 @@ 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[], char* rawLine, char* rawLineEnd, 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) {
- if(lines){
+ if (lines) {
code = smlParseJSON(info, *lines);
- }else if(rawLine){
+ } else if (rawLine) {
code = smlParseJSON(info, rawLine);
}
if (code != TSDB_CODE_SUCCESS) {
- uError("SML:0x%" PRIx64 " smlParseJSON failed:%s", info->id, lines?*lines:rawLine);
+ uError("SML:0x%" PRIx64 " smlParseJSON failed:%s", info->id, lines ? *lines : rawLine);
return code;
}
return code;
@@ -2401,19 +2402,19 @@ static int32_t smlParseLine(SSmlHandle *info, char *lines[], char* rawLine, char
for (int32_t i = 0; i < numLines; ++i) {
char *tmp = NULL;
- int len = 0;
- if(lines){
+ int len = 0;
+ if (lines) {
tmp = lines[i];
len = strlen(tmp);
- }else if(rawLine){
+ } else if (rawLine) {
tmp = rawLine;
- while(rawLine < rawLineEnd){
- if(*(rawLine++) == '\n'){
+ while (rawLine < rawLineEnd) {
+ if (*(rawLine++) == '\n') {
break;
}
len++;
}
- if(info->protocol == TSDB_SML_LINE_PROTOCOL && tmp[0] == '#'){ // this line is comment
+ if (info->protocol == TSDB_SML_LINE_PROTOCOL && tmp[0] == '#') { // this line is comment
continue;
}
}
@@ -2433,7 +2434,7 @@ static int32_t smlParseLine(SSmlHandle *info, char *lines[], char* rawLine, char
return code;
}
-static int smlProcess(SSmlHandle *info, char *lines[], char* rawLine, char* rawLineEnd, 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;
@@ -2532,8 +2533,8 @@ static void smlInsertCallback(void *param, void *res, int32_t code) {
smlDestroyInfo(info);
}
-
-TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char *rawLine, char *rawLineEnd, int numLines, int protocol, int precision) {
+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;
@@ -2581,7 +2582,7 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char
batchs = ceil(((double)numLines) / LINE_BATCH);
params.total = batchs;
for (int i = 0; i < batchs; ++i) {
- SRequestObj *req = (SRequestObj *)createRequest(pTscObj->id, TSDB_SQL_INSERT);
+ SRequestObj *req = (SRequestObj *)createRequest(pTscObj->id, TSDB_SQL_INSERT, 0);
if (!req) {
request->code = TSDB_CODE_OUT_OF_MEMORY;
uError("SML:taos_schemaless_insert error request is null");
@@ -2608,16 +2609,16 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char
info->pRequest->body.queryFp = smlInsertCallback;
info->pRequest->body.param = info;
int32_t code = smlProcess(info, lines, rawLine, rawLineEnd, perBatch);
- if(lines){
+ if (lines) {
lines += perBatch;
}
- if(rawLine){
+ if (rawLine) {
int num = 0;
- while(rawLine < rawLineEnd){
- if(*(rawLine++) == '\n'){
+ while (rawLine < rawLineEnd) {
+ if (*(rawLine++) == '\n') {
num++;
}
- if(num == perBatch){
+ if (num == perBatch) {
break;
}
}
@@ -2628,7 +2629,7 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char
}
tsem_wait(¶ms.sem);
- end:
+end:
taosThreadSpinDestroy(¶ms.lock);
tsem_destroy(¶ms.sem);
// ((STscObj *)taos)->schemalessType = 0;
@@ -2653,9 +2654,7 @@ TAOS_RES *taos_schemaless_insert_inner(SRequestObj *request, char *lines[], char
* 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.
- *
+ * @return TAOS_RES
*/
TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int protocol, int precision) {
@@ -2664,7 +2663,30 @@ TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int pr
return NULL;
}
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT);
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, 0);
+ 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_with_reqid(TAOS *taos, char *lines[], int numLines, int protocol, int precision,
+ int64_t reqid) {
+ if (NULL == taos) {
+ terrno = TSDB_CODE_TSC_DISCONNECTED;
+ return NULL;
+ }
+
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid);
if (!request) {
uError("SML:taos_schemaless_insert error request is null");
return NULL;
@@ -2680,13 +2702,49 @@ TAOS_RES *taos_schemaless_insert(TAOS *taos, char *lines[], int numLines, int pr
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){
+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, 0);
+ 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);
+}
+
+TAOS_RES *taos_schemaless_insert_raw_with_reqid(TAOS *taos, char *lines, int len, int32_t *totalRows, int protocol,
+ int precision, int64_t reqid) {
if (NULL == taos) {
terrno = TSDB_CODE_TSC_DISCONNECTED;
return NULL;
}
- SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT);
+ SRequestObj *request = (SRequestObj *)createRequest(*(int64_t *)taos, TSDB_SQL_INSERT, reqid);
if (!request) {
uError("SML:taos_schemaless_insert error request is null");
return NULL;
@@ -2702,10 +2760,10 @@ TAOS_RES *taos_schemaless_insert_raw(TAOS* taos, char* lines, int len, int32_t *
int numLines = 0;
*totalRows = 0;
char *tmp = lines;
- for(int i = 0; i < len; i++){
- if(lines[i] == '\n' || i == len - 1){
+ 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
+ if (tmp[0] != '#' || protocol != TSDB_SML_LINE_PROTOCOL) { // ignore comment
(*totalRows)++;
}
tmp = lines + i + 1;
diff --git a/source/client/src/clientStmt.c b/source/client/src/clientStmt.c
index 7f8d857a0f5b02cb7b78586c7743d71e6db56896..c5f49bce89d14dbd49361b964e7aabb7a6acc484 100644
--- a/source/client/src/clientStmt.c
+++ b/source/client/src/clientStmt.c
@@ -5,13 +5,18 @@
#include "clientStmt.h"
-char *gStmtStatusStr[] = {"unknown", "init", "prepare", "settbname", "settags", "fetchFields", "bind", "bindCol", "addBatch", "exec"};
+char* gStmtStatusStr[] = {"unknown", "init", "prepare", "settbname", "settags",
+ "fetchFields", "bind", "bindCol", "addBatch", "exec"};
static int32_t stmtCreateRequest(STscStmt* pStmt) {
int32_t code = 0;
if (pStmt->exec.pRequest == NULL) {
- code = buildRequest(pStmt->taos->id, pStmt->sql.sqlStr, pStmt->sql.sqlLen, NULL, false, &pStmt->exec.pRequest);
+ code = buildRequest(pStmt->taos->id, pStmt->sql.sqlStr, pStmt->sql.sqlLen, NULL, false, &pStmt->exec.pRequest,
+ pStmt->reqid);
+ if (pStmt->reqid != 0) {
+ pStmt->reqid++;
+ }
if (TSDB_CODE_SUCCESS == code) {
pStmt->exec.pRequest->syncQuery = true;
}
@@ -207,10 +212,10 @@ int32_t stmtCacheBlock(STscStmt* pStmt) {
}
STableDataBlocks** pSrc = taosHashGet(pStmt->exec.pBlockHash, pStmt->bInfo.tbFName, strlen(pStmt->bInfo.tbFName));
- if(!pSrc){
+ if (!pSrc) {
return TSDB_CODE_OUT_OF_MEMORY;
}
- STableDataBlocks* pDst = NULL;
+ STableDataBlocks* pDst = NULL;
STMT_ERR_RET(qCloneStmtDataBlock(&pDst, *pSrc));
@@ -513,7 +518,7 @@ int32_t stmtResetStmt(STscStmt* pStmt) {
return TSDB_CODE_SUCCESS;
}
-TAOS_STMT* stmtInit(STscObj* taos) {
+TAOS_STMT* stmtInit(STscObj* taos, int64_t reqid) {
STscObj* pObj = (STscObj*)taos;
STscStmt* pStmt = NULL;
@@ -533,9 +538,10 @@ TAOS_STMT* stmtInit(STscObj* taos) {
pStmt->taos = pObj;
pStmt->bInfo.needParse = true;
pStmt->sql.status = STMT_INIT;
+ pStmt->reqid = reqid;
STMT_LOG_SEQ(STMT_INIT);
-
+
tscDebug("stmt:%p initialized", pStmt);
return pStmt;
diff --git a/source/client/src/clientTmq.c b/source/client/src/clientTmq.c
index 8e7faf48f64054ca7a1de34de3b33bf6e1deb37a..28b41b97c51d8fb440a26b13b533e14e9316e151 100644
--- a/source/client/src/clientTmq.c
+++ b/source/client/src/clientTmq.c
@@ -728,12 +728,26 @@ void tmqSendHbReq(void* param, void* tmrId) {
taosMemoryFree(param);
return;
}
- int64_t consumerId = tmq->consumerId;
- int32_t epoch = tmq->epoch;
- SMqHbReq* pReq = taosMemoryMalloc(sizeof(SMqHbReq));
- if (pReq == NULL) goto OVER;
- pReq->consumerId = htobe64(consumerId);
- pReq->epoch = epoch;
+
+ SMqHbReq req = {0};
+ req.consumerId = tmq->consumerId;
+ req.epoch = tmq->epoch;
+
+ int32_t tlen = tSerializeSMqHbReq(NULL, 0, &req);
+ if (tlen < 0) {
+ tscError("tSerializeSMqHbReq failed");
+ return;
+ }
+ void *pReq = taosMemoryCalloc(1, tlen);
+ if (tlen < 0) {
+ tscError("failed to malloc MqHbReq msg, size:%d", tlen);
+ return;
+ }
+ if (tSerializeSMqHbReq(pReq, tlen, &req) < 0) {
+ tscError("tSerializeSMqHbReq %d failed", tlen);
+ taosMemoryFree(pReq);
+ return;
+ }
SMsgSendInfo* sendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
if (sendInfo == NULL) {
@@ -742,7 +756,7 @@ void tmqSendHbReq(void* param, void* tmrId) {
}
sendInfo->msgInfo = (SDataBuf){
.pData = pReq,
- .len = sizeof(SMqHbReq),
+ .len = tlen,
.handle = NULL,
};
@@ -1378,21 +1392,31 @@ int32_t tmqAskEp(tmq_t* tmq, bool async) {
}
atomic_store_32(&tmq->epSkipCnt, 0);
#endif
- int32_t tlen = sizeof(SMqAskEpReq);
- SMqAskEpReq* req = taosMemoryCalloc(1, tlen);
- if (req == NULL) {
- tscError("failed to malloc get subscribe ep buf");
- /*atomic_store_8(&tmq->epStatus, 0);*/
+ SMqAskEpReq req = {0};
+ req.consumerId = tmq->consumerId;
+ req.epoch = tmq->epoch;
+ strcpy(req.cgroup, tmq->groupId);
+
+ int32_t tlen = tSerializeSMqAskEpReq(NULL, 0, &req);
+ if (tlen < 0) {
+ tscError("tSerializeSMqAskEpReq failed");
+ return -1;
+ }
+ void *pReq = taosMemoryCalloc(1, tlen);
+ if (tlen < 0) {
+ tscError("failed to malloc askEpReq msg, size:%d", tlen);
+ return -1;
+ }
+ if (tSerializeSMqAskEpReq(pReq, tlen, &req) < 0) {
+ tscError("tSerializeSMqAskEpReq %d failed", tlen);
+ taosMemoryFree(pReq);
return -1;
}
- req->consumerId = htobe64(tmq->consumerId);
- req->epoch = htonl(tmq->epoch);
- strcpy(req->cgroup, tmq->groupId);
SMqAskEpCbParam* pParam = taosMemoryCalloc(1, sizeof(SMqAskEpCbParam));
if (pParam == NULL) {
tscError("failed to malloc subscribe param");
- taosMemoryFree(req);
+ taosMemoryFree(pReq);
/*atomic_store_8(&tmq->epStatus, 0);*/
return -1;
}
@@ -1405,13 +1429,13 @@ int32_t tmqAskEp(tmq_t* tmq, bool async) {
if (sendInfo == NULL) {
tsem_destroy(&pParam->rspSem);
taosMemoryFree(pParam);
- taosMemoryFree(req);
+ taosMemoryFree(pReq);
/*atomic_store_8(&tmq->epStatus, 0);*/
return -1;
}
sendInfo->msgInfo = (SDataBuf){
- .pData = req,
+ .pData = pReq,
.len = tlen,
.handle = NULL,
};
@@ -1649,7 +1673,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
taosFreeQitem(pollRspWrapper);
return pRsp;
} else {
- tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d\n",
+ tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
pollRspWrapper->dataRsp.head.epoch, consumerEpoch);
taosFreeQitem(pollRspWrapper);
}
@@ -1667,7 +1691,7 @@ void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
taosFreeQitem(pollRspWrapper);
return pRsp;
} else {
- tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d\n",
+ tscDebug("msg discard since epoch mismatch: msg epoch %d, consumer epoch %d",
pollRspWrapper->metaRsp.head.epoch, consumerEpoch);
taosFreeQitem(pollRspWrapper);
}
diff --git a/source/common/src/systable.c b/source/common/src/systable.c
index d3d006ab350bc102b05b70aa8ada6803ba309f50..c3a1f9f67ed3dea99f00e6a71481346fff29c602 100644
--- a/source/common/src/systable.c
+++ b/source/common/src/systable.c
@@ -134,7 +134,7 @@ static const SSysDbTableSchema userStbsSchema[] = {
};
static const SSysDbTableSchema streamSchema[] = {
- {.name = "stream_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+ {.name = "stream_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "create_time", .bytes = 8, .type = TSDB_DATA_TYPE_TIMESTAMP, .sysInfo = false},
{.name = "sql", .bytes = TSDB_SHOW_SQL_LEN + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "status", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
@@ -145,6 +145,15 @@ static const SSysDbTableSchema streamSchema[] = {
{.name = "trigger", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
};
+static const SSysDbTableSchema streamTaskSchema[] = {
+ {.name = "stream_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+ {.name = "task_id", .bytes = 8, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
+ {.name = "node_type", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+ {.name = "node_id", .bytes = 8, .type = TSDB_DATA_TYPE_INT, .sysInfo = false},
+ {.name = "level", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+ {.name = "status", .bytes = 20 + VARSTR_HEADER_SIZE, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
+};
+
static const SSysDbTableSchema userTblsSchema[] = {
{.name = "table_name", .bytes = SYSTABLE_SCH_TABLE_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
{.name = "db_name", .bytes = SYSTABLE_SCH_DB_NAME_LEN, .type = TSDB_DATA_TYPE_VARCHAR, .sysInfo = false},
@@ -287,6 +296,7 @@ static const SSysTableMeta infosMeta[] = {
{TSDB_INS_TABLE_TOPICS, topicSchema, tListLen(topicSchema), false},
{TSDB_INS_TABLE_SUBSCRIPTIONS, subscriptionSchema, tListLen(subscriptionSchema), false},
{TSDB_INS_TABLE_STREAMS, streamSchema, tListLen(streamSchema), false},
+ {TSDB_INS_TABLE_STREAM_TASKS, streamTaskSchema, tListLen(streamTaskSchema), false},
{TSDB_INS_TABLE_VNODES, vnodesSchema, tListLen(vnodesSchema), true},
};
diff --git a/source/common/src/tdatablock.c b/source/common/src/tdatablock.c
index 5d0121aa1587dda3b666673e83fc475dc3ebce17..3c2a5377e3f84f2263a45858a1e502646e1c4650 100644
--- a/source/common/src/tdatablock.c
+++ b/source/common/src/tdatablock.c
@@ -277,7 +277,9 @@ int32_t colDataMergeCol(SColumnInfoData* pColumnInfoData, int32_t numOfRow1, int
pColumnInfoData->varmeta.allocLen = len + oldLen;
}
- memcpy(pColumnInfoData->pData + oldLen, pSource->pData, len);
+ if (pColumnInfoData->pData && pSource->pData) { // TD-20382
+ memcpy(pColumnInfoData->pData + oldLen, pSource->pData, len);
+ }
pColumnInfoData->varmeta.length = len + oldLen;
} else {
if (finalNumOfRows > (*capacity)) {
@@ -334,10 +336,12 @@ int32_t colDataAssign(SColumnInfoData* pColumnInfoData, const SColumnInfoData* p
}
pColumnInfoData->varmeta.length = pSource->varmeta.length;
- memcpy(pColumnInfoData->pData, pSource->pData, pSource->varmeta.length);
+ if (pColumnInfoData->pData != NULL && pSource->pData != NULL) {
+ memcpy(pColumnInfoData->pData, pSource->pData, pSource->varmeta.length);
+ }
} else {
memcpy(pColumnInfoData->nullbitmap, pSource->nullbitmap, BitmapLen(numOfRows));
- if (pSource->pData) {
+ if (pSource->pData != NULL) {
memcpy(pColumnInfoData->pData, pSource->pData, pSource->info.bytes * numOfRows);
}
}
@@ -1399,6 +1403,7 @@ SSDataBlock* createOneDataBlock(const SSDataBlock* pDataBlock, bool copyData) {
pBlock->info = pDataBlock->info;
pBlock->info.rows = 0;
pBlock->info.capacity = 0;
+ pBlock->info.rowSize = 0;
size_t numOfCols = taosArrayGetSize(pDataBlock->pDataBlock);
for (int32_t i = 0; i < numOfCols; ++i) {
@@ -2197,7 +2202,9 @@ char* buildCtbNameByGroupId(const char* stbFullName, uint64_t groupId) {
return rname.ctbShortName;
}
-void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_t numOfCols, int8_t needCompress) {
+int32_t blockEncode(const SSDataBlock* pBlock, char* data, int32_t numOfCols) {
+ int32_t dataLen = 0;
+
// todo extract method
int32_t* version = (int32_t*)data;
*version = 1;
@@ -2238,7 +2245,7 @@ void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_
int32_t* colSizes = (int32_t*)data;
data += numOfCols * sizeof(int32_t);
- *dataLen = blockDataGetSerialMetaSize(numOfCols);
+ dataLen = blockDataGetSerialMetaSize(numOfCols);
int32_t numOfRows = pBlock->info.rows;
for (int32_t col = 0; col < numOfCols; ++col) {
@@ -2255,26 +2262,25 @@ void blockEncode(const SSDataBlock* pBlock, char* data, int32_t* dataLen, int32_
}
data += metaSize;
- (*dataLen) += metaSize;
+ dataLen += metaSize;
- if (needCompress) {
- colSizes[col] = blockCompressColData(pColRes, numOfRows, data, needCompress);
- data += colSizes[col];
- (*dataLen) += colSizes[col];
- } else {
- colSizes[col] = colDataGetLength(pColRes, numOfRows);
- (*dataLen) += colSizes[col];
+ colSizes[col] = colDataGetLength(pColRes, numOfRows);
+ dataLen += colSizes[col];
+ if (pColRes->pData != NULL) {
memmove(data, pColRes->pData, colSizes[col]);
- data += colSizes[col];
}
+ data += colSizes[col];
colSizes[col] = htonl(colSizes[col]);
}
- *actualLen = *dataLen;
+ *actualLen = dataLen;
*groupId = pBlock->info.groupId;
- ASSERT(*dataLen > 0);
- uDebug("build data block, actualLen:%d, rows:%d, cols:%d", *dataLen, *rows, *cols);
+ ASSERT(dataLen > 0);
+
+ uDebug("build data block, actualLen:%d, rows:%d, cols:%d", dataLen, *rows, *cols);
+
+ return dataLen;
}
const char* blockDecode(SSDataBlock* pBlock, const char* pData) {
diff --git a/source/common/src/tdataformat.c b/source/common/src/tdataformat.c
index 513c54c7e9a5a7fbc513cfe55e397e48f6018b9e..73b887342cf995a1aa564b1aa6f5bae55dac01e1 100644
--- a/source/common/src/tdataformat.c
+++ b/source/common/src/tdataformat.c
@@ -56,7 +56,7 @@ typedef struct {
#define TSROW_IS_KV_ROW(r) ((r)->flags & TSROW_KV_ROW)
// SValue
-int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
+static FORCE_INLINE int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
if (IS_VAR_DATA_TYPE(type)) {
return tPutBinary(p, pValue->pData, pValue->nData);
} else {
@@ -65,20 +65,6 @@ int32_t tPutValue(uint8_t *p, SValue *pValue, int8_t type) {
}
}
-int32_t tGetValue(uint8_t *p, SValue *pValue, int8_t type) {
- if (IS_VAR_DATA_TYPE(type)) {
- return tGetBinary(p, &pValue->pData, pValue ? &pValue->nData : NULL);
- } else {
- memcpy(&pValue->val, p, tDataTypes[type].bytes);
- return tDataTypes[type].bytes;
- }
-}
-
-int tValueCmprFn(const SValue *pValue1, const SValue *pValue2, int8_t type) {
- // TODO
- return 0;
-}
-
// STSRow2 ========================================================================
static void setBitMap(uint8_t *pb, uint8_t v, int32_t idx, uint8_t flags) {
if (pb) {
@@ -923,7 +909,7 @@ char *tTagValToData(const STagVal *value, bool isJson) {
}
bool tTagGet(const STag *pTag, STagVal *pTagVal) {
- if(!pTag || !pTagVal){
+ if (!pTag || !pTagVal) {
return false;
}
@@ -1164,31 +1150,27 @@ static FORCE_INLINE int32_t tColDataPutValue(SColData *pColData, SColVal *pColVa
ASSERT(pColData->nData == tDataTypes[pColData->type].bytes * pColData->nVal);
code = tRealloc(&pColData->pData, pColData->nData + tDataTypes[pColData->type].bytes);
if (code) goto _exit;
- pColData->nData += tPutValue(pColData->pData + pColData->nData, &pColVal->value, pColVal->type);
+ memcpy(pColData->pData + pColData->nData, &pColVal->value.val, tDataTypes[pColData->type].bytes);
+ pColData->nData += tDataTypes[pColData->type].bytes;
}
+ pColData->nVal++;
_exit:
return code;
}
static FORCE_INLINE int32_t tColDataAppendValue00(SColData *pColData, SColVal *pColVal) {
- int32_t code = 0;
pColData->flag = HAS_VALUE;
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
- pColData->nVal++;
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue01(SColData *pColData, SColVal *pColVal) {
- int32_t code = 0;
pColData->flag = HAS_NONE;
pColData->nVal++;
- return code;
+ return 0;
}
static FORCE_INLINE int32_t tColDataAppendValue02(SColData *pColData, SColVal *pColVal) {
- int32_t code = 0;
pColData->flag = HAS_NULL;
pColData->nVal++;
- return code;
+ return 0;
}
static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1216,16 +1198,11 @@ static FORCE_INLINE int32_t tColDataAppendValue10(SColData *pColData, SColVal *p
}
}
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue11(SColData *pColData, SColVal *pColVal) {
- int32_t code = 0;
pColData->nVal++;
- return code;
+ return 0;
}
static FORCE_INLINE int32_t tColDataAppendValue12(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1268,11 +1245,7 @@ static FORCE_INLINE int32_t tColDataAppendValue20(SColData *pColData, SColVal *p
}
}
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1290,9 +1263,8 @@ static FORCE_INLINE int32_t tColDataAppendValue21(SColData *pColData, SColVal *p
return code;
}
static FORCE_INLINE int32_t tColDataAppendValue22(SColData *pColData, SColVal *pColVal) {
- int32_t code = 0;
pColData->nVal++;
- return code;
+ return 0;
}
static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1325,11 +1297,7 @@ static FORCE_INLINE int32_t tColDataAppendValue30(SColData *pColData, SColVal *p
}
}
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue31(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1353,15 +1321,7 @@ static FORCE_INLINE int32_t tColDataAppendValue32(SColData *pColData, SColVal *p
return code;
}
-static FORCE_INLINE int32_t tColDataAppendValue40(SColData *pColData, SColVal *pColVal) {
- int32_t code = 0;
-
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
- pColData->nVal++;
-
- return code;
-}
+#define tColDataAppendValue40 tColDataPutValue
static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1374,12 +1334,7 @@ static FORCE_INLINE int32_t tColDataAppendValue41(SColData *pColData, SColVal *p
memset(pColData->pBitMap, 255, nBit);
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1393,12 +1348,7 @@ static FORCE_INLINE int32_t tColDataAppendValue42(SColData *pColData, SColVal *p
memset(pColData->pBitMap, 255, nBit);
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1408,12 +1358,7 @@ static FORCE_INLINE int32_t tColDataAppendValue50(SColData *pColData, SColVal *p
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1423,12 +1368,7 @@ static FORCE_INLINE int32_t tColDataAppendValue51(SColData *pColData, SColVal *p
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1447,12 +1387,7 @@ static FORCE_INLINE int32_t tColDataAppendValue52(SColData *pColData, SColVal *p
tFree(pColData->pBitMap);
pColData->pBitMap = pBitMap;
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1461,12 +1396,7 @@ static FORCE_INLINE int32_t tColDataAppendValue60(SColData *pColData, SColVal *p
if (code) return code;
SET_BIT1(pColData->pBitMap, pColData->nVal, 1);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1485,12 +1415,7 @@ static FORCE_INLINE int32_t tColDataAppendValue61(SColData *pColData, SColVal *p
tFree(pColData->pBitMap);
pColData->pBitMap = pBitMap;
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1499,12 +1424,7 @@ static FORCE_INLINE int32_t tColDataAppendValue62(SColData *pColData, SColVal *p
if (code) return code;
SET_BIT1(pColData->pBitMap, pColData->nVal, 0);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1513,12 +1433,7 @@ static FORCE_INLINE int32_t tColDataAppendValue70(SColData *pColData, SColVal *p
if (code) return code;
SET_BIT2(pColData->pBitMap, pColData->nVal, 2);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1527,12 +1442,7 @@ static FORCE_INLINE int32_t tColDataAppendValue71(SColData *pColData, SColVal *p
if (code) return code;
SET_BIT2(pColData->pBitMap, pColData->nVal, 0);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, SColVal *pColVal) {
int32_t code = 0;
@@ -1541,12 +1451,7 @@ static FORCE_INLINE int32_t tColDataAppendValue72(SColData *pColData, SColVal *p
if (code) return code;
SET_BIT2(pColData->pBitMap, pColData->nVal, 1);
- code = tColDataPutValue(pColData, pColVal);
- if (code) return code;
-
- pColData->nVal++;
-
- return code;
+ return tColDataPutValue(pColData, pColVal);
}
static int32_t (*tColDataAppendValueImpl[8][3])(SColData *pColData, SColVal *pColVal) = {
{tColDataAppendValue00, tColDataAppendValue01, tColDataAppendValue02}, // 0
@@ -1652,7 +1557,7 @@ void tColDataGetValue(SColData *pColData, int32_t iVal, SColVal *pColVal) {
tColDataGetValueImpl[pColData->flag](pColData, iVal, pColVal);
}
-uint8_t tColDataGetBitValue(SColData *pColData, int32_t iVal) {
+uint8_t tColDataGetBitValue(const SColData *pColData, int32_t iVal) {
uint8_t v;
switch (pColData->flag) {
case HAS_NONE:
@@ -1723,3 +1628,385 @@ int32_t tColDataCopy(SColData *pColDataSrc, SColData *pColDataDest) {
_exit:
return code;
}
+
+#define CALC_SUM_MAX_MIN(SUM, MAX, MIN, VAL) \
+ do { \
+ (SUM) += (VAL); \
+ if ((MAX) < (VAL)) (MAX) = (VAL); \
+ if ((MIN) > (VAL)) (MIN) = (VAL); \
+ } while (0)
+
+static FORCE_INLINE void tColDataCalcSMABool(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *sum = 0;
+ *max = 0;
+ *min = 1;
+ *numOfNull = 0;
+
+ int8_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((int8_t *)pColData->pData)[iVal] ? 1 : 0;
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMATinyInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *sum = 0;
+ *max = INT8_MIN;
+ *min = INT8_MAX;
+ *numOfNull = 0;
+
+ int8_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((int8_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((int8_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMATinySmallInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *sum = 0;
+ *max = INT16_MIN;
+ *min = INT16_MAX;
+ *numOfNull = 0;
+
+ int16_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((int16_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((int16_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMAInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *sum = 0;
+ *max = INT32_MIN;
+ *min = INT32_MAX;
+ *numOfNull = 0;
+
+ int32_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((int32_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((int32_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMABigInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *sum = 0;
+ *max = INT64_MIN;
+ *min = INT64_MAX;
+ *numOfNull = 0;
+
+ int64_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((int64_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((int64_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*sum, *max, *min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMAFloat(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *(double *)sum = 0;
+ *(double *)max = -FLT_MAX;
+ *(double *)min = FLT_MAX;
+ *numOfNull = 0;
+
+ float val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((float *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((float *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMADouble(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *(double *)sum = 0;
+ *(double *)max = -DBL_MAX;
+ *(double *)min = DBL_MAX;
+ *numOfNull = 0;
+
+ double val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((double *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((double *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(double *)sum, *(double *)max, *(double *)min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMAUTinyInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *(uint64_t *)sum = 0;
+ *(uint64_t *)max = 0;
+ *(uint64_t *)min = UINT8_MAX;
+ *numOfNull = 0;
+
+ uint8_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((uint8_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((uint8_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMATinyUSmallInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *(uint64_t *)sum = 0;
+ *(uint64_t *)max = 0;
+ *(uint64_t *)min = UINT16_MAX;
+ *numOfNull = 0;
+
+ uint16_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((uint16_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((uint16_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMAUInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *(uint64_t *)sum = 0;
+ *(uint64_t *)max = 0;
+ *(uint64_t *)min = UINT32_MAX;
+ *numOfNull = 0;
+
+ uint32_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((uint32_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((uint32_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
+ int16_t *numOfNull) {
+ *(uint64_t *)sum = 0;
+ *(uint64_t *)max = 0;
+ *(uint64_t *)min = UINT64_MAX;
+ *numOfNull = 0;
+
+ uint64_t val;
+ if (HAS_VALUE == pColData->flag) {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ val = ((uint64_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ }
+ } else {
+ for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
+ switch (tColDataGetBitValue(pColData, iVal)) {
+ case 0:
+ case 1:
+ (*numOfNull)++;
+ break;
+ case 2:
+ val = ((uint64_t *)pColData->pData)[iVal];
+ CALC_SUM_MAX_MIN(*(uint64_t *)sum, *(uint64_t *)max, *(uint64_t *)min, val);
+ break;
+ default:
+ ASSERT(0);
+ break;
+ }
+ }
+ }
+}
+
+void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull) = {
+ NULL,
+ tColDataCalcSMABool, // TSDB_DATA_TYPE_BOOL
+ tColDataCalcSMATinyInt, // TSDB_DATA_TYPE_TINYINT
+ tColDataCalcSMATinySmallInt, // TSDB_DATA_TYPE_SMALLINT
+ tColDataCalcSMAInt, // TSDB_DATA_TYPE_INT
+ tColDataCalcSMABigInt, // TSDB_DATA_TYPE_BIGINT
+ tColDataCalcSMAFloat, // TSDB_DATA_TYPE_FLOAT
+ tColDataCalcSMADouble, // TSDB_DATA_TYPE_DOUBLE
+ NULL, // TSDB_DATA_TYPE_VARCHAR
+ tColDataCalcSMABigInt, // TSDB_DATA_TYPE_TIMESTAMP
+ NULL, // TSDB_DATA_TYPE_NCHAR
+ tColDataCalcSMAUTinyInt, // TSDB_DATA_TYPE_UTINYINT
+ tColDataCalcSMATinyUSmallInt, // TSDB_DATA_TYPE_USMALLINT
+ tColDataCalcSMAUInt, // TSDB_DATA_TYPE_UINT
+ tColDataCalcSMAUBigInt, // TSDB_DATA_TYPE_UBIGINT
+ NULL, // TSDB_DATA_TYPE_JSON
+ NULL, // TSDB_DATA_TYPE_VARBINARY
+ NULL, // TSDB_DATA_TYPE_DECIMAL
+ NULL, // TSDB_DATA_TYPE_BLOB
+ NULL // TSDB_DATA_TYPE_MEDIUMBLOB
+};
diff --git a/source/common/src/tglobal.c b/source/common/src/tglobal.c
index 1be77077b6033005405293d41398c3c9c91b8b27..f2d8b9aa7c3460c035db7dfcee82f76eb62749d5 100644
--- a/source/common/src/tglobal.c
+++ b/source/common/src/tglobal.c
@@ -163,10 +163,12 @@ int32_t tsMqRebalanceInterval = 2;
int32_t tsTtlUnit = 86400;
int32_t tsTtlPushInterval = 86400;
int32_t tsGrantHBInterval = 60;
-int32_t tsUptimeInterval = 300; // seconds
+int32_t tsUptimeInterval = 300; // seconds
char tsUdfdResFuncs[512] = ""; // udfd resident funcs that teardown when udfd exits
char tsUdfdLdLibPath[512] = "";
+int32_t tsRpcRetryLimit = 100;
+int32_t tsRpcRetryInterval = 15;
#ifndef _STORAGE
int32_t taosSetTfsCfg(SConfig *pCfg) {
SConfigItem *pItem = cfgGetItem(pCfg, "dataDir");
@@ -275,7 +277,9 @@ static int32_t taosAddServerLogCfg(SConfig *pCfg) {
static int32_t taosAddClientCfg(SConfig *pCfg) {
char defaultFqdn[TSDB_FQDN_LEN] = {0};
int32_t defaultServerPort = 6030;
- if (taosGetFqdn(defaultFqdn) != 0) return -1;
+ if (taosGetFqdn(defaultFqdn) != 0) {
+ strcpy(defaultFqdn, "localhost");
+ }
if (cfgAddString(pCfg, "firstEp", "", 1) != 0) return -1;
if (cfgAddString(pCfg, "secondEp", "", 1) != 0) return -1;
@@ -297,6 +301,8 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
if (cfgAddString(pCfg, "smlTagName", tsSmlTagName, 1) != 0) return -1;
if (cfgAddBool(pCfg, "smlDataFormat", tsSmlDataFormat, 1) != 0) return -1;
if (cfgAddInt32(pCfg, "maxMemUsedByInsert", tsMaxMemUsedByInsert, 1, INT32_MAX, true) != 0) return -1;
+ if (cfgAddInt32(pCfg, "rpcRetryLimit", tsRpcRetryLimit, 1, 100000, 0) != 0) return -1;
+ if (cfgAddInt32(pCfg, "rpcRetryInterval", tsRpcRetryInterval, 1, 100000, 0) != 0) return -1;
tsNumOfTaskQueueThreads = tsNumOfCores / 2;
tsNumOfTaskQueueThreads = TMAX(tsNumOfTaskQueueThreads, 4);
@@ -422,6 +428,10 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
if (cfgAddBool(pCfg, "udf", tsStartUdfd, 0) != 0) return -1;
if (cfgAddString(pCfg, "udfdResFuncs", tsUdfdResFuncs, 0) != 0) return -1;
if (cfgAddString(pCfg, "udfdLdLibPath", tsUdfdLdLibPath, 0) != 0) return -1;
+
+ if (cfgAddInt32(pCfg, "rpcRetryLimit", tsRpcRetryLimit, 1, 100000, 0) != 0) return -1;
+ if (cfgAddInt32(pCfg, "rpcRetryInterval", tsRpcRetryInterval, 1, 100000, 0) != 0) return -1;
+
GRANT_CFG_ADD;
return 0;
}
@@ -634,6 +644,9 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
tsQueryNodeChunkSize = cfgGetItem(pCfg, "queryNodeChunkSize")->i32;
tsQueryUseNodeAllocator = cfgGetItem(pCfg, "queryUseNodeAllocator")->bval;
tsKeepColumnName = cfgGetItem(pCfg, "keepColumnName")->bval;
+
+ tsRpcRetryLimit = cfgGetItem(pCfg, "rpcRetryLimit")->i32;
+ tsRpcRetryInterval = cfgGetItem(pCfg, "rpcRetryInterval")->i32;
return 0;
}
@@ -708,6 +721,9 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
if (tsQueryBufferSize >= 0) {
tsQueryBufferSizeBytes = tsQueryBufferSize * 1048576UL;
}
+
+ tsRpcRetryLimit = cfgGetItem(pCfg, "rpcRetryLimit")->i32;
+ tsRpcRetryInterval = cfgGetItem(pCfg, "rpcRetryInterval")->i32;
GRANT_CFG_GET;
return 0;
}
diff --git a/source/common/src/tmsg.c b/source/common/src/tmsg.c
index 4eaa934676528adfabf04e5d4c438345707e5cac..35900638dd9f3b1c03f13744ce1ceb0f48a11129 100644
--- a/source/common/src/tmsg.c
+++ b/source/common/src/tmsg.c
@@ -2238,6 +2238,7 @@ int32_t tSerializeSUseDbReq(void *buf, int32_t bufLen, SUseDbReq *pReq) {
if (tEncodeI64(&encoder, pReq->dbId) < 0) return -1;
if (tEncodeI32(&encoder, pReq->vgVersion) < 0) return -1;
if (tEncodeI32(&encoder, pReq->numOfTable) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->stateTs) < 0) return -1;
tEndEncode(&encoder);
int32_t tlen = encoder.pos;
@@ -2254,6 +2255,7 @@ int32_t tDeserializeSUseDbReq(void *buf, int32_t bufLen, SUseDbReq *pReq) {
if (tDecodeI64(&decoder, &pReq->dbId) < 0) return -1;
if (tDecodeI32(&decoder, &pReq->vgVersion) < 0) return -1;
if (tDecodeI32(&decoder, &pReq->numOfTable) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->stateTs) < 0) return -1;
tEndDecode(&decoder);
tDecoderClear(&decoder);
@@ -2489,6 +2491,8 @@ int32_t tSerializeSUseDbRspImp(SEncoder *pEncoder, const SUseDbRsp *pRsp) {
if (tEncodeI32(pEncoder, pVgInfo->numOfTable) < 0) return -1;
}
+ if (tEncodeI32(pEncoder, pRsp->errCode) < 0) return -1;
+ if (tEncodeI64(pEncoder, pRsp->stateTs) < 0) return -1;
return 0;
}
@@ -2553,6 +2557,8 @@ int32_t tDeserializeSUseDbRspImp(SDecoder *pDecoder, SUseDbRsp *pRsp) {
taosArrayPush(pRsp->pVgroupInfos, &vgInfo);
}
+ if (tDecodeI32(pDecoder, &pRsp->errCode) < 0) return -1;
+ if (tDecodeI64(pDecoder, &pRsp->stateTs) < 0) return -1;
return 0;
}
@@ -2585,7 +2591,10 @@ int32_t tDeserializeSUseDbBatchRsp(void *buf, int32_t bufLen, SUseDbBatchRsp *pR
for (int32_t i = 0; i < numOfBatch; ++i) {
SUseDbRsp usedbRsp = {0};
- if (tDeserializeSUseDbRspImp(&decoder, &usedbRsp) < 0) return -1;
+ if (tDeserializeSUseDbRspImp(&decoder, &usedbRsp) < 0) {
+ tDecoderClear(&decoder);
+ return -1;
+ }
taosArrayPush(pRsp->pArray, &usedbRsp);
}
tEndDecode(&decoder);
@@ -4437,6 +4446,376 @@ void tFreeSExplainRsp(SExplainRsp *pRsp) {
taosMemoryFreeClear(pRsp->subplanInfo);
}
+int32_t tSerializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ int32_t num = taosArrayGetSize(pReq->pMsgs);
+ if (tEncodeI32(&encoder, num) < 0) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchMsg *pMsg = taosArrayGet(pReq->pMsgs, i);
+ if (tEncodeI32(&encoder, pMsg->msgIdx) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgType) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgLen) < 0) return -1;
+ if (tEncodeBinary(&encoder, pMsg->msg, pMsg->msgLen) < 0) return -1;
+ }
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->header.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSBatchReq(void *buf, int32_t bufLen, SBatchReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->header.vgId;
+ pHead->contLen = pReq->header.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ int32_t num = 0;
+ if (tDecodeI32(&decoder, &num) < 0) return -1;
+ if (num <= 0) {
+ pReq->pMsgs = NULL;
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+ }
+
+ pReq->pMsgs = taosArrayInit(num, sizeof(SBatchMsg));
+ if (NULL == pReq->pMsgs) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchMsg msg = {0};
+ if (tDecodeI32(&decoder, &msg.msgIdx) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgType) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgLen) < 0) return -1;
+ if (tDecodeBinaryAlloc(&decoder, &msg.msg, NULL) < 0) return -1;
+ if (NULL == taosArrayPush(pReq->pMsgs, &msg)) return -1;
+ }
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ int32_t num = taosArrayGetSize(pRsp->pRsps);
+ if (tEncodeI32(&encoder, num) < 0) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchRspMsg *pMsg = taosArrayGet(pRsp->pRsps, i);
+ if (tEncodeI32(&encoder, pMsg->reqType) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgIdx) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->msgLen) < 0) return -1;
+ if (tEncodeI32(&encoder, pMsg->rspCode) < 0) return -1;
+ if (tEncodeBinary(&encoder, pMsg->msg, pMsg->msgLen) < 0) return -1;
+ }
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSBatchRsp(void *buf, int32_t bufLen, SBatchRsp *pRsp) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ int32_t num = 0;
+ if (tDecodeI32(&decoder, &num) < 0) return -1;
+ if (num <= 0) {
+ pRsp->pRsps = NULL;
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+ }
+
+ pRsp->pRsps = taosArrayInit(num, sizeof(SBatchRspMsg));
+ if (NULL == pRsp->pRsps) return -1;
+ for (int32_t i = 0; i < num; ++i) {
+ SBatchRspMsg msg = {0};
+ if (tDecodeI32(&decoder, &msg.reqType) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgIdx) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.msgLen) < 0) return -1;
+ if (tDecodeI32(&decoder, &msg.rspCode) < 0) return -1;
+ if (tDecodeBinaryAlloc(&decoder, &msg.msg, NULL) < 0) return -1;
+ if (NULL == taosArrayPush(pRsp->pRsps, &msg)) return -1;
+ }
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+
+int32_t tSerializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeI64(&encoder, pReq->consumerId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->epoch) < 0) return -1;
+ if (tEncodeCStr(&encoder, pReq->cgroup) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSMqAskEpReq(void *buf, int32_t bufLen, SMqAskEpReq *pReq) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pReq->cgroup) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeI64(&encoder, pReq->consumerId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->epoch) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSMqHbReq(void *buf, int32_t bufLen, SMqHbReq *pReq) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeI64(&decoder, &pReq->consumerId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->epoch) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeU64(&encoder, pReq->sId) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->queryId) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->taskId) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->refId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->execId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->msgMask) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->taskType) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->explain) < 0) return -1;
+ if (tEncodeI8(&encoder, pReq->needFetch) < 0) return -1;
+ if (tEncodeU32(&encoder, pReq->sqlLen) < 0) return -1;
+ if (tEncodeCStrWithLen(&encoder, pReq->sql, pReq->sqlLen) < 0) return -1;
+ if (tEncodeU32(&encoder, pReq->msgLen) < 0) return -1;
+ if (tEncodeBinary(&encoder, (uint8_t*)pReq->msg, pReq->msgLen) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->header.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSSubQueryMsg(void *buf, int32_t bufLen, SSubQueryMsg *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->header.vgId;
+ pHead->contLen = pReq->header.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeU64(&decoder, &pReq->sId) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->queryId) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->taskId) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->refId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->execId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->msgMask) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->taskType) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->explain) < 0) return -1;
+ if (tDecodeI8(&decoder, &pReq->needFetch) < 0) return -1;
+ if (tDecodeU32(&decoder, &pReq->sqlLen) < 0) return -1;
+ if (tDecodeCStrAlloc(&decoder, &pReq->sql) < 0) return -1;
+ if (tDecodeU32(&decoder, &pReq->msgLen) < 0) return -1;
+ if (tDecodeBinaryAlloc(&decoder, (void**)&pReq->msg, NULL) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+void tFreeSSubQueryMsg(SSubQueryMsg *pReq) {
+ if (NULL == pReq) {
+ return;
+ }
+
+ taosMemoryFreeClear(pReq->sql);
+ taosMemoryFreeClear(pReq->msg);
+}
+
+int32_t tSerializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+ if (buf != NULL) {
+ buf = (char *)buf + headLen;
+ bufLen -= headLen;
+ }
+
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeU64(&encoder, pReq->sId) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->queryId) < 0) return -1;
+ if (tEncodeU64(&encoder, pReq->taskId) < 0) return -1;
+ if (tEncodeI64(&encoder, pReq->refId) < 0) return -1;
+ if (tEncodeI32(&encoder, pReq->execId) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ if (buf != NULL) {
+ SMsgHead *pHead = (SMsgHead *)((char *)buf - headLen);
+ pHead->vgId = htonl(pReq->header.vgId);
+ pHead->contLen = htonl(tlen + headLen);
+ }
+
+ return tlen + headLen;
+}
+
+int32_t tDeserializeSTaskDropReq(void *buf, int32_t bufLen, STaskDropReq *pReq) {
+ int32_t headLen = sizeof(SMsgHead);
+
+ SMsgHead *pHead = buf;
+ pHead->vgId = pReq->header.vgId;
+ pHead->contLen = pReq->header.contLen;
+
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf + headLen, bufLen - headLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeU64(&decoder, &pReq->sId) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->queryId) < 0) return -1;
+ if (tDecodeU64(&decoder, &pReq->taskId) < 0) return -1;
+ if (tDecodeI64(&decoder, &pReq->refId) < 0) return -1;
+ if (tDecodeI32(&decoder, &pReq->execId) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+int32_t tSerializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp) {
+ SEncoder encoder = {0};
+ tEncoderInit(&encoder, buf, bufLen);
+ if (tStartEncode(&encoder) < 0) return -1;
+
+ if (tEncodeI32(&encoder, pRsp->code) < 0) return -1;
+ if (tEncodeCStr(&encoder, pRsp->tbFName) < 0) return -1;
+ if (tEncodeI32(&encoder, pRsp->sversion) < 0) return -1;
+ if (tEncodeI32(&encoder, pRsp->tversion) < 0) return -1;
+ if (tEncodeI64(&encoder, pRsp->affectedRows) < 0) return -1;
+
+ tEndEncode(&encoder);
+
+ int32_t tlen = encoder.pos;
+ tEncoderClear(&encoder);
+
+ return tlen;
+}
+
+int32_t tDeserializeSQueryTableRsp(void *buf, int32_t bufLen, SQueryTableRsp *pRsp) {
+ SDecoder decoder = {0};
+ tDecoderInit(&decoder, (char *)buf, bufLen);
+
+ if (tStartDecode(&decoder) < 0) return -1;
+
+ if (tDecodeI32(&decoder, &pRsp->code) < 0) return -1;
+ if (tDecodeCStrTo(&decoder, pRsp->tbFName) < 0) return -1;
+ if (tDecodeI32(&decoder, &pRsp->sversion) < 0) return -1;
+ if (tDecodeI32(&decoder, &pRsp->tversion) < 0) return -1;
+ if (tDecodeI64(&decoder, &pRsp->affectedRows) < 0) return -1;
+
+ tEndDecode(&decoder);
+
+ tDecoderClear(&decoder);
+ return 0;
+}
+
+
int32_t tSerializeSSchedulerHbReq(void *buf, int32_t bufLen, SSchedulerHbReq *pReq) {
int32_t headLen = sizeof(SMsgHead);
if (buf != NULL) {
@@ -5894,6 +6273,7 @@ int32_t tDecodeSTqCheckInfo(SDecoder *pDecoder, STqCheckInfo *pInfo) {
}
return 0;
}
+void tDeleteSTqCheckInfo(STqCheckInfo *pInfo) { taosArrayDestroy(pInfo->colIdList); }
int32_t tEncodeDeleteRes(SEncoder *pCoder, const SDeleteRes *pRes) {
int32_t nUid = taosArrayGetSize(pRes->uidList);
@@ -6017,9 +6397,13 @@ int32_t tDecodeSMqDataRsp(SDecoder *pDecoder, SMqDataRsp *pRsp) {
void tDeleteSMqDataRsp(SMqDataRsp *pRsp) {
taosArrayDestroy(pRsp->blockDataLen);
+ pRsp->blockDataLen = NULL;
taosArrayDestroyP(pRsp->blockData, (FDelete)taosMemoryFree);
+ pRsp->blockData = NULL;
taosArrayDestroyP(pRsp->blockSchema, (FDelete)tDeleteSSchemaWrapper);
+ pRsp->blockSchema = NULL;
taosArrayDestroyP(pRsp->blockTbName, (FDelete)taosMemoryFree);
+ pRsp->blockTbName = NULL;
}
int32_t tEncodeSTaosxRsp(SEncoder *pEncoder, const STaosxRsp *pRsp) {
@@ -6129,13 +6513,13 @@ void tDeleteSTaosxRsp(STaosxRsp *pRsp) {
}
int32_t tEncodeSSingleDeleteReq(SEncoder *pEncoder, const SSingleDeleteReq *pReq) {
- if (tEncodeI64(pEncoder, pReq->uid) < 0) return -1;
+ if (tEncodeCStr(pEncoder, pReq->tbname) < 0) return -1;
if (tEncodeI64(pEncoder, pReq->ts) < 0) return -1;
return 0;
}
int32_t tDecodeSSingleDeleteReq(SDecoder *pDecoder, SSingleDeleteReq *pReq) {
- if (tDecodeI64(pDecoder, &pReq->uid) < 0) return -1;
+ if (tDecodeCStrTo(pDecoder, pReq->tbname) < 0) return -1;
if (tDecodeI64(pDecoder, &pReq->ts) < 0) return -1;
return 0;
}
diff --git a/source/common/src/trow.c b/source/common/src/trow.c
index ac4b5f86de7c4bb9b909b7098ba6da3d39801a52..d39d3c501a4c3df1afe4f1389865bd98906dacbd 100644
--- a/source/common/src/trow.c
+++ b/source/common/src/trow.c
@@ -73,8 +73,8 @@ void tdSCellValPrint(SCellVal *pVal, int8_t colType) {
} else if (tdValTypeIsNone(pVal->valType)) {
printf("NONE ");
return;
- }
- if(!pVal->val) {
+ }
+ if (!pVal->val) {
ASSERT(0);
printf("BadVal ");
return;
@@ -1083,13 +1083,15 @@ void tTSRowGetVal(STSRow *pRow, STSchema *pTSchema, int16_t iCol, SColVal *pColV
} else if (tdValTypeIsNull(cv.valType)) {
*pColVal = COL_VAL_NULL(pTColumn->colId, pTColumn->type);
} else {
+ pColVal->cid = pTColumn->colId;
+ pColVal->type = pTColumn->type;
+ pColVal->flag = CV_FLAG_VALUE;
+
if (IS_VAR_DATA_TYPE(pTColumn->type)) {
- value.nData = varDataLen(cv.val);
- value.pData = varDataVal(cv.val);
+ pColVal->value.nData = varDataLen(cv.val);
+ pColVal->value.pData = varDataVal(cv.val);
} else {
- tGetValue(cv.val, &value, pTColumn->type);
+ memcpy(&pColVal->value.val, cv.val, tDataTypes[pTColumn->type].bytes);
}
-
- *pColVal = COL_VAL_VALUE(pTColumn->colId, pTColumn->type, value);
}
}
\ No newline at end of file
diff --git a/source/common/src/ttime.c b/source/common/src/ttime.c
index 1b140e6c042783c31180a7f1d8cfc80312052fc7..a106a09a69a5a1d7d707c2d40548672c384a2987 100644
--- a/source/common/src/ttime.c
+++ b/source/common/src/ttime.c
@@ -436,21 +436,24 @@ int64_t convertTimePrecision(int64_t utime, int32_t fromPrecision, int32_t toPre
ASSERT(toPrecision == TSDB_TIME_PRECISION_MILLI || toPrecision == TSDB_TIME_PRECISION_MICRO ||
toPrecision == TSDB_TIME_PRECISION_NANO);
- double tempResult = (double)utime;
-
switch (fromPrecision) {
case TSDB_TIME_PRECISION_MILLI: {
switch (toPrecision) {
case TSDB_TIME_PRECISION_MILLI:
return utime;
case TSDB_TIME_PRECISION_MICRO:
- tempResult *= 1000;
- utime *= 1000;
- goto end_;
+ if (utime > INT64_MAX / 1000) {
+ return INT64_MAX;
+ }
+ return utime * 1000;
case TSDB_TIME_PRECISION_NANO:
- tempResult *= 1000000;
- utime *= 1000000;
- goto end_;
+ if (utime > INT64_MAX / 1000000) {
+ return INT64_MAX;
+ }
+ return utime * 1000000;
+ default:
+ ASSERT(0);
+ return utime;
}
} // end from milli
case TSDB_TIME_PRECISION_MICRO: {
@@ -460,9 +463,13 @@ int64_t convertTimePrecision(int64_t utime, int32_t fromPrecision, int32_t toPre
case TSDB_TIME_PRECISION_MICRO:
return utime;
case TSDB_TIME_PRECISION_NANO:
- tempResult *= 1000;
- utime *= 1000;
- goto end_;
+ if (utime > INT64_MAX / 1000) {
+ return INT64_MAX;
+ }
+ return utime * 1000;
+ default:
+ ASSERT(0);
+ return utime;
}
} // end from micro
case TSDB_TIME_PRECISION_NANO: {
@@ -473,17 +480,17 @@ int64_t convertTimePrecision(int64_t utime, int32_t fromPrecision, int32_t toPre
return utime / 1000;
case TSDB_TIME_PRECISION_NANO:
return utime;
+ default:
+ ASSERT(0);
+ return utime;
}
} // end from nano
default: {
- assert(0);
+ ASSERT(0);
return utime; // only to pass windows compilation
}
} // end switch fromPrecision
-end_:
- if (tempResult >= (double)INT64_MAX) return INT64_MAX;
- if (tempResult <= (double)INT64_MIN) return INT64_MIN; // INT64_MIN means NULL
return utime;
}
@@ -599,18 +606,33 @@ int32_t convertStringToTimestamp(int16_t type, char* inputData, int64_t timePrec
static int32_t getDuration(int64_t val, char unit, int64_t* result, int32_t timePrecision) {
switch (unit) {
case 's':
+ if (val > INT64_MAX / MILLISECOND_PER_SECOND) {
+ return -1;
+ }
(*result) = convertTimePrecision(val * MILLISECOND_PER_SECOND, TSDB_TIME_PRECISION_MILLI, timePrecision);
break;
case 'm':
+ if (val > INT64_MAX / MILLISECOND_PER_MINUTE) {
+ return -1;
+ }
(*result) = convertTimePrecision(val * MILLISECOND_PER_MINUTE, TSDB_TIME_PRECISION_MILLI, timePrecision);
break;
case 'h':
+ if (val > INT64_MAX / MILLISECOND_PER_MINUTE) {
+ return -1;
+ }
(*result) = convertTimePrecision(val * MILLISECOND_PER_HOUR, TSDB_TIME_PRECISION_MILLI, timePrecision);
break;
case 'd':
+ if (val > INT64_MAX / MILLISECOND_PER_DAY) {
+ return -1;
+ }
(*result) = convertTimePrecision(val * MILLISECOND_PER_DAY, TSDB_TIME_PRECISION_MILLI, timePrecision);
break;
case 'w':
+ if (val > INT64_MAX / MILLISECOND_PER_WEEK) {
+ return -1;
+ }
(*result) = convertTimePrecision(val * MILLISECOND_PER_WEEK, TSDB_TIME_PRECISION_MILLI, timePrecision);
break;
case 'a':
@@ -650,7 +672,7 @@ int32_t parseAbsoluteDuration(const char* token, int32_t tokenlen, int64_t* dura
/* get the basic numeric value */
int64_t timestamp = taosStr2Int64(token, &endPtr, 10);
- if (errno != 0) {
+ if (timestamp < 0 || errno != 0) {
return -1;
}
@@ -668,7 +690,7 @@ int32_t parseNatualDuration(const char* token, int32_t tokenLen, int64_t* durati
/* get the basic numeric value */
*duration = taosStr2Int64(token, NULL, 10);
- if (errno != 0) {
+ if (*duration < 0 || errno != 0) {
return -1;
}
diff --git a/source/common/src/ttypes.c b/source/common/src/ttypes.c
index a4e7a12ce4eb10c6a3dd380ea8a88611232f9d7f..8c5d44b8d58f00281784c9103eee5c9d6d8c6901 100644
--- a/source/common/src/ttypes.c
+++ b/source/common/src/ttypes.c
@@ -61,26 +61,36 @@ tDataTypeDescriptor tDataTypes[TSDB_DATA_TYPE_MAX] = {
static float floatMin = -FLT_MAX, floatMax = FLT_MAX;
static double doubleMin = -DBL_MAX, doubleMax = DBL_MAX;
-FORCE_INLINE void *getDataMin(int32_t type) {
+FORCE_INLINE void *getDataMin(int32_t type, void* value) {
switch (type) {
case TSDB_DATA_TYPE_FLOAT:
- return &floatMin;
+ *(float *)value = floatMin;
+ break;
case TSDB_DATA_TYPE_DOUBLE:
- return &doubleMin;
+ *(double *)value = doubleMin;
+ break;
default:
- return &tDataTypes[type].minValue;
+ *(int64_t *)value = tDataTypes[type].minValue;
+ break;
}
+
+ return value;
}
-FORCE_INLINE void *getDataMax(int32_t type) {
+FORCE_INLINE void *getDataMax(int32_t type, void* value) {
switch (type) {
case TSDB_DATA_TYPE_FLOAT:
- return &floatMax;
+ *(float *)value = floatMax;
+ break;
case TSDB_DATA_TYPE_DOUBLE:
- return &doubleMax;
+ *(double *)value = doubleMax;
+ break;
default:
- return &tDataTypes[type].maxValue;
+ *(int64_t *)value = tDataTypes[type].maxValue;
+ break;
}
+
+ return value;
}
bool isValidDataType(int32_t type) { return type >= TSDB_DATA_TYPE_NULL && type < TSDB_DATA_TYPE_MAX; }
diff --git a/source/common/src/tvariant.c b/source/common/src/tvariant.c
index 8d4c17a82132bf63f646de52885ec0d7a25ad61e..65e9a767f5843d7ce025ccfbe2f789475d7105f6 100644
--- a/source/common/src/tvariant.c
+++ b/source/common/src/tvariant.c
@@ -109,7 +109,7 @@ void taosVariantCreateFromBinary(SVariant *pVar, const char *pz, size_t len, uin
}
case TSDB_DATA_TYPE_FLOAT: {
pVar->nLen = tDataTypes[type].bytes;
- pVar->d = GET_FLOAT_VAL(pz);
+ pVar->f = GET_FLOAT_VAL(pz);
break;
}
case TSDB_DATA_TYPE_NCHAR: { // here we get the nchar length from raw binary bits length
@@ -223,12 +223,18 @@ int32_t taosVariantCompare(const SVariant *p1, const SVariant *p2) {
} else {
return p1->nLen > p2->nLen ? 1 : -1;
}
- } else if (p1->nType == TSDB_DATA_TYPE_FLOAT || p1->nType == TSDB_DATA_TYPE_DOUBLE) {
+ } else if (p1->nType == TSDB_DATA_TYPE_DOUBLE) {
if (p1->d == p2->d) {
return 0;
} else {
return p1->d > p2->d ? 1 : -1;
}
+ } else if (p1->nType == TSDB_DATA_TYPE_FLOAT) {
+ if (p1->f == p2->f) {
+ return 0;
+ } else {
+ return p1->f > p2->f ? 1 : -1;
+ }
} else if (IS_UNSIGNED_NUMERIC_TYPE(p1->nType)) {
if (p1->u == p2->u) {
return 0;
@@ -259,8 +265,9 @@ char *taosVariantGet(SVariant *pVar, int32_t type) {
case TSDB_DATA_TYPE_UBIGINT:
return (char *)&pVar->u;
case TSDB_DATA_TYPE_DOUBLE:
- case TSDB_DATA_TYPE_FLOAT:
return (char *)&pVar->d;
+ case TSDB_DATA_TYPE_FLOAT:
+ return (char *)&pVar->f;
case TSDB_DATA_TYPE_BINARY:
case TSDB_DATA_TYPE_JSON:
return (char *)pVar->pz;
diff --git a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
index 85a09b79fd635bf430d64d61c7507eff09727f3d..8a8561161b0057130c5998bba2abe780c4b842f9 100644
--- a/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
+++ b/source/dnode/mgmt/mgmt_dnode/src/dmHandle.c
@@ -307,8 +307,7 @@ int32_t dmProcessRetrieve(SDnodeMgmt *pMgmt, SRpcMsg *pMsg) {
pStart += sizeof(SSysTableSchema);
}
- int32_t len = 0;
- blockEncode(pBlock, pStart, &len, numOfCols, false);
+ int32_t len = blockEncode(pBlock, pStart, numOfCols);
pRsp->numOfRows = htonl(pBlock->info.rows);
pRsp->precision = TSDB_TIME_PRECISION_MILLI; // millisecond time precision
diff --git a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
index 976f2cfd8baa221e940830d8a8d99e9e840833ce..16fe6c1b91f8a7788ad4a48993b337fe6bc7b160 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmHandle.c
@@ -91,7 +91,7 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_SNODE_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;
+ if (dmSetMgmtHandle(pArray, TDMT_DND_CONFIG_DNODE_RSP, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CONNECT, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_ACCT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
@@ -102,7 +102,7 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_USER, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_GET_USER_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MND_CONFIG_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_MND_CONFIG_DNODE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_DNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_MNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_MNODE, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
@@ -116,7 +116,7 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_SNODE, 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;
+ if (dmSetMgmtHandle(pArray, TDMT_MND_USE_DB, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_COMPACT_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_TRIM_DB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
@@ -127,7 +127,7 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_MND_SPLIT_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_BALANCE_VGROUP, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MND_RETRIEVE_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_MND_RETRIEVE_FUNC, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_DROP_FUNC, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_CREATE_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_ALTER_STB, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
@@ -151,7 +151,7 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_TRANS, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_QUERY, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_KILL_CONN, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_MND_HEARTBEAT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
+ if (dmSetMgmtHandle(pArray, TDMT_MND_HEARTBEAT, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_STATUS, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_SYSTABLE_RETRIEVE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_MND_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
@@ -183,8 +183,6 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_VND_COMPACT_RSP, mmPutMsgToWriteQueue, 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;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
@@ -197,7 +195,6 @@ SArray *mmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_SYNC_SNAPSHOT_RSP, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_PRE_SNAPSHOT_REPLY, mmPutMsgToSyncQueue, 1) == NULL) goto _OVER;
-
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT, mmPutMsgToSyncCtrlQueue, 1) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_HEARTBEAT_REPLY, mmPutMsgToSyncCtrlQueue, 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 e50b527bac925c2d9c05f04329d1149b0c7eaafe..d3d92e1bbf1b63b16d93e4c47f6afe63357469a5 100644
--- a/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
+++ b/source/dnode/mgmt/mgmt_mnode/src/mmWorker.c
@@ -56,6 +56,9 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
if (IsReq(pMsg) && pMsg->info.handle != NULL && code != TSDB_CODE_ACTION_IN_PROGRESS) {
if (code != 0 && terrno != 0) code = terrno;
mmSendRsp(pMsg, code);
+ } else {
+ rpcFreeCont(pMsg->info.rsp);
+ pMsg->info.rsp = NULL;
}
if (code == TSDB_CODE_RPC_REDIRECT) {
diff --git a/source/dnode/mgmt/mgmt_snode/src/smWorker.c b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
index 1381d4c39180866e26f57a5b2462f1b00aa3d063..f6942c81142ec1364e5ecf227750e30a7e2497b4 100644
--- a/source/dnode/mgmt/mgmt_snode/src/smWorker.c
+++ b/source/dnode/mgmt/mgmt_snode/src/smWorker.c
@@ -122,6 +122,7 @@ void smStopWorker(SSnodeMgmt *pMgmt) {
for (int32_t i = 0; i < taosArrayGetSize(pMgmt->writeWroker); i++) {
SMultiWorker *pWorker = taosArrayGetP(pMgmt->writeWroker, i);
tMultiWorkerCleanup(pWorker);
+ taosMemoryFree(pWorker);
}
taosArrayDestroy(pMgmt->writeWroker);
tSingleWorkerCleanup(&pMgmt->streamWorker);
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
index 51213a6ab331d11615c2d9f5e2fb29482fdb0a19..e15d7ac3dfa122f4204a4cd8301920ba1fba2cd1 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmHandle.c
@@ -191,6 +191,16 @@ int32_t vmProcessCreateVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
dInfo("vgId:%d, replica:%d id:%d fqdn:%s port:%u", req.vgId, i, req.replicas[i].id, req.replicas[i].fqdn,
req.replicas[i].port);
}
+
+ SReplica *pReplica = &req.replicas[req.selfIndex];
+ if (pReplica->id != pMgmt->pData->dnodeId || pReplica->port != tsServerPort ||
+ strcmp(pReplica->fqdn, tsLocalFqdn) != 0) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ dError("vgId:%d, dnodeId:%d ep:%s:%u not matched with local dnode", req.vgId, pReplica->id, pReplica->fqdn,
+ pReplica->port);
+ return -1;
+ }
+
vmGenerateVnodeCfg(&req, &vnodeCfg);
if (vmTsmaAdjustDays(&vnodeCfg, &req) < 0) {
@@ -285,6 +295,15 @@ int32_t vmProcessAlterVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
return -1;
}
+ SReplica *pReplica = &alterReq.replicas[alterReq.selfIndex];
+ if (pReplica->id != pMgmt->pData->dnodeId || pReplica->port != tsServerPort ||
+ strcmp(pReplica->fqdn, tsLocalFqdn) != 0) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ dError("vgId:%d, dnodeId:%d ep:%s:%u not matched with local dnode", alterReq.vgId, pReplica->id, pReplica->fqdn,
+ pReplica->port);
+ return -1;
+ }
+
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
if (pVnode == NULL) {
dError("vgId:%d, failed to alter replica since %s", vgId, terrstr());
@@ -341,6 +360,12 @@ int32_t vmProcessDropVnodeReq(SVnodeMgmt *pMgmt, SRpcMsg *pMsg) {
int32_t vgId = dropReq.vgId;
dDebug("vgId:%d, start to drop vnode", vgId);
+ if (dropReq.dnodeId != pMgmt->pData->dnodeId) {
+ terrno = TSDB_CODE_INVALID_MSG;
+ dError("vgId:%d, dnodeId:%d not matched with local dnode", dropReq.vgId, dropReq.dnodeId);
+ return -1;
+ }
+
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, vgId);
if (pVnode == NULL) {
dDebug("vgId:%d, failed to drop since %s", vgId, terrstr());
@@ -425,8 +450,6 @@ SArray *vmGetMsgHandles() {
if (dmSetMgmtHandle(pArray, TDMT_DND_DROP_VNODE, vmPutMsgToMgmtQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_TIMEOUT, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
- if (dmSetMgmtHandle(pArray, TDMT_SYNC_PING_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_BATCH, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
if (dmSetMgmtHandle(pArray, TDMT_SYNC_CLIENT_REQUEST_REPLY, vmPutMsgToSyncQueue, 0) == NULL) goto _OVER;
diff --git a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
index ccd781d1386ebc67364a12694ce9e10e57ac228a..24240e82efc2a535b7da096888a63fd43f8ce3f7 100644
--- a/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
+++ b/source/dnode/mgmt/mgmt_vnode/src/vmWorker.c
@@ -145,7 +145,6 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
pHead->contLen = ntohl(pHead->contLen);
pHead->vgId = ntohl(pHead->vgId);
- pHead->msgMask = ntohl(pHead->msgMask);
SVnodeObj *pVnode = vmAcquireVnode(pMgmt, pHead->vgId);
if (pVnode == NULL) {
@@ -156,12 +155,10 @@ static int32_t vmPutMsgToQueue(SVnodeMgmt *pMgmt, SRpcMsg *pMsg, EQueueType qtyp
switch (qtype) {
case QUERY_QUEUE:
- if ((pMsg->msgType == TDMT_SCH_QUERY) && (grantCheck(TSDB_GRANT_TIME) != TSDB_CODE_SUCCESS) && !TEST_SHOW_REWRITE_MASK(pHead->msgMask)) {
- terrno = TSDB_CODE_GRANT_EXPIRED;
- code = terrno;
- dDebug("vgId:%d, msg:%p put into vnode-query queue failed since %s", pVnode->vgId, pMsg, terrstr(code));
+ code = vnodePreprocessQueryMsg(pVnode->pImpl, pMsg);
+ if (code) {
+ dError("vgId:%d, msg:%p preprocess query msg failed since %s", pVnode->vgId, pMsg, terrstr(code));
} else {
- vnodePreprocessQueryMsg(pVnode->pImpl, pMsg);
dGTrace("vgId:%d, msg:%p put into vnode-query queue", pVnode->vgId, pMsg);
taosWriteQitem(pVnode->pQueryQ, pMsg);
}
@@ -290,7 +287,7 @@ int32_t vmGetQueueSize(SVnodeMgmt *pMgmt, int32_t vgId, EQueueType qtype) {
vmReleaseVnode(pMgmt, pVnode);
}
if (size < 0) {
- dError("vgId:%d, can't get size from queue since %s, qtype:%d", vgId, terrstr(), qtype);
+ dTrace("vgId:%d, can't get size from queue since %s, qtype:%d", vgId, terrstr(), qtype);
size = 0;
}
return size;
diff --git a/source/dnode/mgmt/node_mgmt/src/dmTransport.c b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
index 1e5f3139aa7ee86b3ff68efc3742c90f008a2c3b..5546d762f437a2afeb43f57e0cb30d13f6561319 100644
--- a/source/dnode/mgmt/node_mgmt/src/dmTransport.c
+++ b/source/dnode/mgmt/node_mgmt/src/dmTransport.c
@@ -258,6 +258,8 @@ int32_t dmInitClient(SDnode *pDnode) {
rpcInit.parent = pDnode;
rpcInit.rfp = rpcRfp;
rpcInit.compressSize = tsCompressMsgSize;
+ rpcInit.retryLimit = tsRpcRetryLimit;
+ rpcInit.retryInterval = tsRpcRetryInterval;
pTrans->clientRpc = rpcOpen(&rpcInit);
if (pTrans->clientRpc == NULL) {
diff --git a/source/dnode/mnode/impl/inc/mndConsumer.h b/source/dnode/mnode/impl/inc/mndConsumer.h
index 210e336ac251165cfefb0c8f8b60ddbb9d1df843..1176e1af0b8fa09328669f11066235870f39b06a 100644
--- a/source/dnode/mnode/impl/inc/mndConsumer.h
+++ b/source/dnode/mnode/impl/inc/mndConsumer.h
@@ -44,6 +44,7 @@ SSdbRaw *mndConsumerActionEncode(SMqConsumerObj *pConsumer);
SSdbRow *mndConsumerActionDecode(SSdbRaw *pRaw);
int32_t mndSetConsumerCommitLogs(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer);
+int32_t mndSetConsumerDropLogs(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer);
bool mndRebTryStart();
void mndRebEnd();
diff --git a/source/dnode/mnode/impl/inc/mndDef.h b/source/dnode/mnode/impl/inc/mndDef.h
index 74a92c9fcd1e021ccef13c86556b96a228e02feb..04ac5aba49dcc1622c81201c88524a7b1eed8591 100644
--- a/source/dnode/mnode/impl/inc/mndDef.h
+++ b/source/dnode/mnode/impl/inc/mndDef.h
@@ -321,6 +321,7 @@ typedef struct {
int32_t vgVersion;
SDbCfg cfg;
SRWLatch lock;
+ int64_t stateTs;
} SDbObj;
typedef struct {
diff --git a/source/dnode/mnode/impl/src/mndConsumer.c b/source/dnode/mnode/impl/src/mndConsumer.c
index df999316eb7e50d382a5d47cbd71eefd6edf8c48..300251d64d0626859fdb5a79fc7df81bcb016ca4 100644
--- a/source/dnode/mnode/impl/src/mndConsumer.c
+++ b/source/dnode/mnode/impl/src/mndConsumer.c
@@ -32,7 +32,8 @@
#define MND_CONSUMER_VER_NUMBER 1
#define MND_CONSUMER_RESERVE_SIZE 64
-#define MND_CONSUMER_LOST_HB_CNT 3
+#define MND_CONSUMER_LOST_HB_CNT 3
+#define MND_CONSUMER_LOST_CLEAR_THRESHOLD 43200
static int8_t mqRebInExecCnt = 0;
@@ -50,6 +51,7 @@ static int32_t mndProcessAskEpReq(SRpcMsg *pMsg);
static int32_t mndProcessMqHbReq(SRpcMsg *pMsg);
static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg);
static int32_t mndProcessConsumerLostMsg(SRpcMsg *pMsg);
+static int32_t mndProcessConsumerClearMsg(SRpcMsg *pMsg);
static int32_t mndProcessConsumerRecoverMsg(SRpcMsg *pMsg);
int32_t mndInitConsumer(SMnode *pMnode) {
@@ -69,6 +71,7 @@ int32_t mndInitConsumer(SMnode *pMnode) {
mndSetMsgHandle(pMnode, TDMT_MND_TMQ_TIMER, mndProcessMqTimerMsg);
mndSetMsgHandle(pMnode, TDMT_MND_TMQ_CONSUMER_LOST, mndProcessConsumerLostMsg);
mndSetMsgHandle(pMnode, TDMT_MND_TMQ_CONSUMER_RECOVER, mndProcessConsumerRecoverMsg);
+ mndSetMsgHandle(pMnode, TDMT_MND_TMQ_LOST_CONSUMER_CLEAR, mndProcessConsumerClearMsg);
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_CONSUMERS, mndRetrieveConsumer);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_CONSUMERS, mndCancelGetNextConsumer);
@@ -162,6 +165,43 @@ FAIL:
return -1;
}
+static int32_t mndProcessConsumerClearMsg(SRpcMsg *pMsg) {
+ SMnode *pMnode = pMsg->info.node;
+ SMqConsumerClearMsg *pClearMsg = pMsg->pCont;
+ SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, pClearMsg->consumerId);
+ if (pConsumer == NULL) {
+ return 0;
+ }
+
+ mInfo("receive consumer clear msg, consumer id %" PRId64 ", status %s", pClearMsg->consumerId,
+ mndConsumerStatusName(pConsumer->status));
+
+ if (pConsumer->status != MQ_CONSUMER_STATUS__LOST_REBD) {
+ mndReleaseConsumer(pMnode, pConsumer);
+ return -1;
+ }
+
+ SMqConsumerObj *pConsumerNew = tNewSMqConsumerObj(pConsumer->consumerId, pConsumer->cgroup);
+ pConsumerNew->updateType = CONSUMER_UPDATE__LOST;
+
+ mndReleaseConsumer(pMnode, pConsumer);
+
+ STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_NOTHING, pMsg, "clear-csm");
+ if (pTrans == NULL) goto FAIL;
+ if (mndSetConsumerDropLogs(pMnode, pTrans, pConsumerNew) != 0) goto FAIL;
+ if (mndTransPrepare(pMnode, pTrans) != 0) goto FAIL;
+
+ tDeleteSMqConsumerObj(pConsumerNew);
+ taosMemoryFree(pConsumerNew);
+ mndTransDrop(pTrans);
+ return 0;
+FAIL:
+ tDeleteSMqConsumerObj(pConsumerNew);
+ taosMemoryFree(pConsumerNew);
+ mndTransDrop(pTrans);
+ return -1;
+}
+
static SMqRebInfo *mndGetOrCreateRebSub(SHashObj *pHash, const char *key) {
SMqRebInfo *pRebInfo = taosHashGet(pHash, key, strlen(key) + 1);
if (pRebInfo == NULL) {
@@ -206,15 +246,28 @@ static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
SMqConsumerLostMsg *pLostMsg = rpcMallocCont(sizeof(SMqConsumerLostMsg));
pLostMsg->consumerId = pConsumer->consumerId;
- SRpcMsg pRpcMsg = {
+ SRpcMsg rpcMsg = {
.msgType = TDMT_MND_TMQ_CONSUMER_LOST,
.pCont = pLostMsg,
.contLen = sizeof(SMqConsumerLostMsg),
};
- tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &pRpcMsg);
+ tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
}
- if (status == MQ_CONSUMER_STATUS__LOST_REBD || status == MQ_CONSUMER_STATUS__READY) {
+
+ if (status == MQ_CONSUMER_STATUS__READY) {
// do nothing
+ } else if (status == MQ_CONSUMER_STATUS__LOST_REBD) {
+ if (hbStatus > MND_CONSUMER_LOST_CLEAR_THRESHOLD) {
+ SMqConsumerClearMsg *pClearMsg = rpcMallocCont(sizeof(SMqConsumerClearMsg));
+
+ pClearMsg->consumerId = pConsumer->consumerId;
+ SRpcMsg rpcMsg = {
+ .msgType = TDMT_MND_TMQ_LOST_CONSUMER_CLEAR,
+ .pCont = pClearMsg,
+ .contLen = sizeof(SMqConsumerClearMsg),
+ };
+ tmsgPutToQueue(&pMnode->msgCb, WRITE_QUEUE, &rpcMsg);
+ }
} else if (status == MQ_CONSUMER_STATUS__LOST) {
taosRLockLatch(&pConsumer->lock);
int32_t topicNum = taosArrayGetSize(pConsumer->currentTopics);
@@ -272,9 +325,14 @@ static int32_t mndProcessMqTimerMsg(SRpcMsg *pMsg) {
static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
SMnode *pMnode = pMsg->info.node;
- SMqHbReq *pReq = (SMqHbReq *)pMsg->pCont;
- int64_t consumerId = be64toh(pReq->consumerId);
+ SMqHbReq req = {0};
+
+ if (tDeserializeSMqHbReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+ int64_t consumerId = req.consumerId;
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
mError("consumer %" PRId64 " not exist", consumerId);
@@ -306,10 +364,16 @@ static int32_t mndProcessMqHbReq(SRpcMsg *pMsg) {
static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
SMnode *pMnode = pMsg->info.node;
- SMqAskEpReq *pReq = (SMqAskEpReq *)pMsg->pCont;
+ SMqAskEpReq req = {0};
SMqAskEpRsp rsp = {0};
- int64_t consumerId = be64toh(pReq->consumerId);
- int32_t epoch = ntohl(pReq->epoch);
+
+ if (tDeserializeSMqAskEpReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+
+ int64_t consumerId = req.consumerId;
+ int32_t epoch = req.epoch;
SMqConsumerObj *pConsumer = mndAcquireConsumer(pMnode, consumerId);
if (pConsumer == NULL) {
@@ -317,7 +381,7 @@ static int32_t mndProcessAskEpReq(SRpcMsg *pMsg) {
return -1;
}
- ASSERT(strcmp(pReq->cgroup, pConsumer->cgroup) == 0);
+ ASSERT(strcmp(req.cgroup, pConsumer->cgroup) == 0);
atomic_store_32(&pConsumer->hbStatus, 0);
@@ -444,6 +508,14 @@ FAIL:
return -1;
}
+int32_t mndSetConsumerDropLogs(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer) {
+ SSdbRaw *pCommitRaw = mndConsumerActionEncode(pConsumer);
+ if (pCommitRaw == NULL) return -1;
+ if (mndTransAppendCommitlog(pTrans, pCommitRaw) != 0) return -1;
+ if (sdbSetRawStatus(pCommitRaw, SDB_STATUS_DROPPED) != 0) return -1;
+ return 0;
+}
+
int32_t mndSetConsumerCommitLogs(SMnode *pMnode, STrans *pTrans, SMqConsumerObj *pConsumer) {
SSdbRaw *pCommitRaw = mndConsumerActionEncode(pConsumer);
if (pCommitRaw == NULL) return -1;
diff --git a/source/dnode/mnode/impl/src/mndDb.c b/source/dnode/mnode/impl/src/mndDb.c
index aad2832aa660e9c32f9e567b405549018edf8ffc..78d84c9c257beeb52f423b535629f6de106a6c53 100644
--- a/source/dnode/mnode/impl/src/mndDb.c
+++ b/source/dnode/mnode/impl/src/mndDb.c
@@ -285,8 +285,17 @@ static inline int32_t mndGetGlobalVgroupVersion(SMnode *pMnode) {
SDbObj *mndAcquireDb(SMnode *pMnode, const char *db) {
SSdb *pSdb = pMnode->pSdb;
SDbObj *pDb = sdbAcquire(pSdb, SDB_DB, db);
- if (pDb == NULL && terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
+ if (pDb == NULL) {
+ if (terrno == TSDB_CODE_SDB_OBJ_NOT_THERE) {
+ terrno = TSDB_CODE_MND_DB_NOT_EXIST;
+ } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
+ terrno = TSDB_CODE_MND_DB_IN_CREATING;
+ } else if (terrno == TSDB_CODE_SDB_OBJ_DROPPING) {
+ terrno = TSDB_CODE_MND_DB_IN_DROPPING;
+ } else {
+ terrno = TSDB_CODE_APP_ERROR;
+ mFatal("db:%s, failed to acquire db since %s", db, terrstr());
+ }
}
return pDb;
}
@@ -594,16 +603,22 @@ static int32_t mndProcessCreateDbReq(SRpcMsg *pReq) {
terrno = TSDB_CODE_MND_DB_ALREADY_EXIST;
goto _OVER;
}
- } else if (terrno == TSDB_CODE_SDB_OBJ_CREATING) {
- if (mndSetRpcInfoForDbTrans(pMnode, pReq, MND_OPER_CREATE_DB, createReq.db) == 0) {
- mInfo("db:%s, is creating and response after trans finished", createReq.db);
- code = TSDB_CODE_ACTION_IN_PROGRESS;
+ } else {
+ if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
+ if (mndSetRpcInfoForDbTrans(pMnode, pReq, MND_OPER_CREATE_DB, createReq.db) == 0) {
+ mInfo("db:%s, is creating and createdb response after trans finished", createReq.db);
+ code = TSDB_CODE_ACTION_IN_PROGRESS;
+ goto _OVER;
+ } else {
+ goto _OVER;
+ }
+ } else if (terrno == TSDB_CODE_MND_DB_IN_DROPPING) {
goto _OVER;
- } else {
+ } else if (terrno == TSDB_CODE_MND_DB_NOT_EXIST) {
+ // continue
+ } else { // TSDB_CODE_APP_ERROR
goto _OVER;
}
- } else if (terrno != TSDB_CODE_MND_DB_NOT_EXIST) {
- goto _OVER;
}
pUser = mndAcquireUser(pMnode, pReq->info.conn.user);
@@ -786,7 +801,6 @@ static int32_t mndProcessAlterDbReq(SRpcMsg *pReq) {
pDb = mndAcquireDb(pMnode, alterReq.db);
if (pDb == NULL) {
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
goto _OVER;
}
@@ -836,7 +850,6 @@ static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
pDb = mndAcquireDb(pMnode, cfgReq.db);
if (pDb == NULL) {
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
goto _OVER;
}
@@ -1066,11 +1079,8 @@ static int32_t mndProcessDropDbReq(SRpcMsg *pReq) {
if (pDb == NULL) {
if (dropReq.ignoreNotExists) {
code = mndBuildDropDbRsp(pDb, &pReq->info.rspLen, &pReq->info.rsp, true);
- goto _OVER;
- } else {
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
- goto _OVER;
}
+ goto _OVER;
}
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_DROP_DB, pDb) != 0) {
@@ -1165,13 +1175,14 @@ int32_t mndExtractDbInfo(SMnode *pMnode, SDbObj *pDb, SUseDbRsp *pRsp, const SUs
int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
- if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable) {
+ if (pReq == NULL || pReq->vgVersion < pDb->vgVersion || pReq->dbId != pDb->uid || numOfTable != pReq->numOfTable || pReq->stateTs < pDb->stateTs) {
mndBuildDBVgroupInfo(pDb, pMnode, pRsp->pVgroupInfos);
}
memcpy(pRsp->db, pDb->name, TSDB_DB_FNAME_LEN);
pRsp->uid = pDb->uid;
pRsp->vgVersion = pDb->vgVersion;
+ pRsp->stateTs = pDb->stateTs;
pRsp->vgNum = taosArrayGetSize(pRsp->pVgroupInfos);
pRsp->hashMethod = pDb->cfg.hashMethod;
pRsp->hashPrefix = pDb->cfg.hashPrefix;
@@ -1197,10 +1208,7 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
if (usedbReq.vgVersion < vgVersion) {
usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
- if (usedbRsp.pVgroupInfos == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- goto _OVER;
- }
+ if (usedbRsp.pVgroupInfos == NULL) goto _OVER;
mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
usedbRsp.vgVersion = vgVersion++;
@@ -1209,16 +1217,21 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
}
usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
code = 0;
-
- // no jump, need to construct rsp
} else {
pDb = mndAcquireDb(pMnode, usedbReq.db);
if (pDb == NULL) {
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
-
memcpy(usedbRsp.db, usedbReq.db, TSDB_DB_FNAME_LEN);
usedbRsp.uid = usedbReq.dbId;
usedbRsp.vgVersion = usedbReq.vgVersion;
+ usedbRsp.errCode = terrno;
+
+ if (terrno == TSDB_CODE_MND_DB_IN_CREATING) {
+ if (mndSetRpcInfoForDbTrans(pMnode, pReq, MND_OPER_CREATE_DB, usedbReq.db) == 0) {
+ mInfo("db:%s, is creating and usedb response after trans finished", usedbReq.db);
+ code = TSDB_CODE_ACTION_IN_PROGRESS;
+ goto _OVER;
+ }
+ }
mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
} else {
@@ -1230,6 +1243,8 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
goto _OVER;
}
+ mDebug("db:%s, process usedb req vgVersion:%d stateTs:%" PRId64 ", rsp vgVersion:%d stateTs:%" PRId64,
+ usedbReq.db, usedbReq.vgVersion, usedbReq.stateTs, usedbRsp.vgVersion, usedbRsp.stateTs);
code = 0;
}
}
@@ -1248,7 +1263,7 @@ static int32_t mndProcessUseDbReq(SRpcMsg *pReq) {
pReq->info.rspLen = contLen;
_OVER:
- if (code != 0) {
+ if (code != 0 && code != TSDB_CODE_ACTION_IN_PROGRESS) {
mError("db:%s, failed to process use db req since %s", usedbReq.db, terrstr());
}
@@ -1268,12 +1283,31 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
for (int32_t i = 0; i < numOfDbs; ++i) {
SDbVgVersion *pDbVgVersion = &pDbs[i];
- pDbVgVersion->dbId = htobe64(pDbVgVersion->dbId);
+ pDbVgVersion->dbId = be64toh(pDbVgVersion->dbId);
pDbVgVersion->vgVersion = htonl(pDbVgVersion->vgVersion);
pDbVgVersion->numOfTable = htonl(pDbVgVersion->numOfTable);
+ pDbVgVersion->stateTs = be64toh(pDbVgVersion->stateTs);
SUseDbRsp usedbRsp = {0};
+ if ((0 == strcasecmp(pDbVgVersion->dbFName, TSDB_INFORMATION_SCHEMA_DB) || (0 == strcasecmp(pDbVgVersion->dbFName, TSDB_PERFORMANCE_SCHEMA_DB)))) {
+ memcpy(usedbRsp.db, pDbVgVersion->dbFName, TSDB_DB_FNAME_LEN);
+ int32_t vgVersion = mndGetGlobalVgroupVersion(pMnode);
+ if (pDbVgVersion->vgVersion < vgVersion) {
+ usedbRsp.pVgroupInfos = taosArrayInit(10, sizeof(SVgroupInfo));
+
+ mndBuildDBVgroupInfo(NULL, pMnode, usedbRsp.pVgroupInfos);
+ usedbRsp.vgVersion = vgVersion++;
+ } else {
+ usedbRsp.vgVersion = pDbVgVersion->vgVersion;
+ }
+ usedbRsp.vgNum = taosArrayGetSize(usedbRsp.pVgroupInfos);
+
+ taosArrayPush(batchUseRsp.pArray, &usedbRsp);
+
+ continue;
+ }
+
SDbObj *pDb = mndAcquireDb(pMnode, pDbVgVersion->dbFName);
if (pDb == NULL) {
mTrace("db:%s, no exist", pDbVgVersion->dbFName);
@@ -1286,13 +1320,19 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
int32_t numOfTable = mndGetDBTableNum(pDb, pMnode);
- if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable) {
- mInfo("db:%s, version and numOfTable not changed", pDbVgVersion->dbFName);
+ if (pDbVgVersion->vgVersion >= pDb->vgVersion && numOfTable == pDbVgVersion->numOfTable &&
+ pDbVgVersion->stateTs == pDb->stateTs) {
+ mTrace("db:%s, valid dbinfo, vgVersion:%d stateTs:%" PRId64
+ " numOfTables:%d, not changed vgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
+ pDbVgVersion->dbFName, pDbVgVersion->vgVersion, pDbVgVersion->stateTs, pDbVgVersion->numOfTable,
+ pDb->vgVersion, pDb->stateTs, numOfTable);
mndReleaseDb(pMnode, pDb);
continue;
} else {
- mInfo("db:%s, vgroup version changed from %d to %d", pDbVgVersion->dbFName, pDbVgVersion->vgVersion,
- pDb->vgVersion);
+ mInfo("db:%s, valid dbinfo, vgVersion:%d stateTs:%" PRId64
+ " numOfTables:%d, changed to vgVersion:%d stateTs:%" PRId64 " numOfTables:%d",
+ pDbVgVersion->dbFName, pDbVgVersion->vgVersion, pDbVgVersion->stateTs, pDbVgVersion->numOfTable,
+ pDb->vgVersion, pDb->stateTs, numOfTable);
}
usedbRsp.pVgroupInfos = taosArrayInit(pDb->cfg.numOfVgroups, sizeof(SVgroupInfo));
@@ -1306,6 +1346,7 @@ int32_t mndValidateDbInfo(SMnode *pMnode, SDbVgVersion *pDbs, int32_t numOfDbs,
memcpy(usedbRsp.db, pDb->name, TSDB_DB_FNAME_LEN);
usedbRsp.uid = pDb->uid;
usedbRsp.vgVersion = pDb->vgVersion;
+ usedbRsp.stateTs = pDb->stateTs;
usedbRsp.vgNum = (int32_t)taosArrayGetSize(usedbRsp.pVgroupInfos);
usedbRsp.hashMethod = pDb->cfg.hashMethod;
usedbRsp.hashPrefix = pDb->cfg.hashPrefix;
diff --git a/source/dnode/mnode/impl/src/mndDnode.c b/source/dnode/mnode/impl/src/mndDnode.c
index 04f340b0ff1bde94a3a84fc2dce3af4a4d3ca1f0..521f924fad89eb3a169044e6dce27b41a5487770 100644
--- a/source/dnode/mnode/impl/src/mndDnode.c
+++ b/source/dnode/mnode/impl/src/mndDnode.c
@@ -15,6 +15,7 @@
#define _DEFAULT_SOURCE
#include "mndDnode.h"
+#include "mndDb.h"
#include "mndMnode.h"
#include "mndPrivilege.h"
#include "mndQnode.h"
@@ -356,7 +357,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
pDnode->lastAccessTime = curMs;
const STraceId *trace = &pReq->info.traceId;
mGTrace("dnode:%d, status received, accessTimes:%d check:%d online:%d reboot:%d changed:%d statusSeq:%d", pDnode->id,
- pDnode->accessTimes, needCheck, online, reboot, dnodeChanged, statusReq.statusSeq);
+ pDnode->accessTimes, needCheck, online, reboot, dnodeChanged, statusReq.statusSeq);
for (int32_t v = 0; v < taosArrayGetSize(statusReq.pVloads); ++v) {
SVnodeLoad *pVload = taosArrayGet(statusReq.pVloads, v);
@@ -376,6 +377,9 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
if (pVgroup->vnodeGid[vg].dnodeId == statusReq.dnodeId) {
if (pVgroup->vnodeGid[vg].syncState != pVload->syncState ||
pVgroup->vnodeGid[vg].syncRestore != pVload->syncRestore) {
+ mInfo("vgId:%d, state changed by status msg, old state:%s restored:%d new state:%s restored:%d",
+ pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore,
+ syncStr(pVload->syncState), pVload->syncRestore);
pVgroup->vnodeGid[vg].syncState = pVload->syncState;
pVgroup->vnodeGid[vg].syncRestore = pVload->syncRestore;
roleChanged = true;
@@ -384,7 +388,12 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
}
}
if (roleChanged) {
- // notify scheduler role has changed
+ SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
+ if (pDb != NULL && pDb->stateTs != curMs) {
+ mInfo("db:%s, stateTs changed by status msg, old stateTs:%" PRId64 " new stateTs:%" PRId64, pDb->name, pDb->stateTs, curMs);
+ pDb->stateTs = curMs;
+ }
+ mndReleaseDb(pMnode, pDb);
}
}
diff --git a/source/dnode/mnode/impl/src/mndMain.c b/source/dnode/mnode/impl/src/mndMain.c
index 1b2d85bd29df73dd99814f91fc6b4d7a53f3f70f..b5ddd6f279a04ed5c06ebf7e5f68efef06c5e1d4 100644
--- a/source/dnode/mnode/impl/src/mndMain.c
+++ b/source/dnode/mnode/impl/src/mndMain.c
@@ -139,6 +139,63 @@ static void mndIncreaseUpTime(SMnode *pMnode) {
}
}
+static void mndSetVgroupOffline(SMnode *pMnode, int32_t dnodeId, int64_t curMs) {
+ SSdb *pSdb = pMnode->pSdb;
+
+ void *pIter = NULL;
+ while (1) {
+ SVgObj *pVgroup = NULL;
+ pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void **)&pVgroup);
+ if (pIter == NULL) break;
+
+ bool roleChanged = false;
+ for (int32_t vg = 0; vg < pVgroup->replica; ++vg) {
+ if (pVgroup->vnodeGid[vg].dnodeId == dnodeId) {
+ if (pVgroup->vnodeGid[vg].syncState != TAOS_SYNC_STATE_ERROR) {
+ mInfo("vgId:%d, state changed by offline check, old state:%s restored:%d new state:error restored:0",
+ pVgroup->vgId, syncStr(pVgroup->vnodeGid[vg].syncState), pVgroup->vnodeGid[vg].syncRestore);
+ pVgroup->vnodeGid[vg].syncState = TAOS_SYNC_STATE_ERROR;
+ pVgroup->vnodeGid[vg].syncRestore = 0;
+ roleChanged = true;
+ }
+ break;
+ }
+ }
+
+ if (roleChanged) {
+ SDbObj *pDb = mndAcquireDb(pMnode, pVgroup->dbName);
+ if (pDb != NULL && pDb->stateTs != curMs) {
+ mInfo("db:%s, stateTs changed by offline check, old newTs:%" PRId64 " newTs:%" PRId64, pDb->name, pDb->stateTs,
+ curMs);
+ pDb->stateTs = curMs;
+ }
+ mndReleaseDb(pMnode, pDb);
+ }
+
+ sdbRelease(pSdb, pVgroup);
+ }
+}
+
+static void mndCheckDnodeOffline(SMnode *pMnode) {
+ SSdb *pSdb = pMnode->pSdb;
+ int64_t curMs = taosGetTimestampMs();
+
+ void *pIter = NULL;
+ while (1) {
+ SDnodeObj *pDnode = NULL;
+ pIter = sdbFetch(pSdb, SDB_DNODE, pIter, (void **)&pDnode);
+ if (pIter == NULL) break;
+
+ bool online = mndIsDnodeOnline(pDnode, curMs);
+ if (!online) {
+ mInfo("dnode:%d, in offline state", pDnode->id);
+ mndSetVgroupOffline(pMnode, pDnode->id, curMs);
+ }
+
+ sdbRelease(pSdb, pDnode);
+ }
+}
+
static void *mndThreadFp(void *param) {
SMnode *pMnode = param;
int64_t lastTime = 0;
@@ -174,6 +231,10 @@ static void *mndThreadFp(void *param) {
if (sec % tsUptimeInterval == 0) {
mndIncreaseUpTime(pMnode);
}
+
+ if (sec % (tsStatusInterval * 5) == 0) {
+ mndCheckDnodeOffline(pMnode);
+ }
}
return NULL;
@@ -516,9 +577,9 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
pMsg->info.rsp = rpcMallocCont(contLen);
- pMsg->info.hasEpSet = 1;
if (pMsg->info.rsp != NULL) {
tSerializeSEpSet(pMsg->info.rsp, contLen, &epSet);
+ pMsg->info.hasEpSet = 1;
pMsg->info.rspLen = contLen;
terrno = TSDB_CODE_RPC_REDIRECT;
} else {
diff --git a/source/dnode/mnode/impl/src/mndQuery.c b/source/dnode/mnode/impl/src/mndQuery.c
index ca69d0c71c1a069739e6f1d5f90d99bdb5be3fd3..5278fc776107c31e43375b16b708c0c8ad34901d 100644
--- a/source/dnode/mnode/impl/src/mndQuery.c
+++ b/source/dnode/mnode/impl/src/mndQuery.c
@@ -21,7 +21,7 @@
int32_t mndPreProcessQueryMsg(SRpcMsg *pMsg) {
if (TDMT_SCH_QUERY != pMsg->msgType && TDMT_SCH_MERGE_QUERY != pMsg->msgType) return 0;
SMnode *pMnode = pMsg->info.node;
- return qWorkerPreprocessQueryMsg(pMnode->pQuery, pMsg);
+ return qWorkerPreprocessQueryMsg(pMnode->pQuery, pMsg, false);
}
void mndPostProcessQueryMsg(SRpcMsg *pMsg) {
@@ -63,81 +63,60 @@ int32_t mndProcessQueryMsg(SRpcMsg *pMsg) {
return code;
}
+
+static FORCE_INLINE void mnodeFreeSBatchRspMsg(void* p) {
+ if (NULL == p) {
+ return;
+ }
+
+ SBatchRspMsg* pRsp = (SBatchRspMsg*)p;
+ rpcFreeCont(pRsp->msg);
+}
+
int32_t mndProcessBatchMetaMsg(SRpcMsg *pMsg) {
int32_t code = 0;
- int32_t offset = 0;
int32_t rspSize = 0;
- SBatchReq *batchReq = (SBatchReq *)pMsg->pCont;
- int32_t msgNum = ntohl(batchReq->msgNum);
- offset += sizeof(SBatchReq);
+ SBatchReq batchReq = {0};
SBatchMsg req = {0};
- SBatchRsp rsp = {0};
+ SBatchRspMsg rsp = {0};
+ SBatchRsp batchRsp = {0};
SRpcMsg reqMsg = *pMsg;
- SRpcMsg rspMsg = {0};
void *pRsp = NULL;
SMnode *pMnode = pMsg->info.node;
+ if (tDeserializeSBatchReq(pMsg->pCont, pMsg->contLen, &batchReq)) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ mError("tDeserializeSBatchReq failed");
+ goto _exit;
+ }
+
+ int32_t msgNum = taosArrayGetSize(batchReq.pMsgs);
if (msgNum >= MAX_META_MSG_IN_BATCH) {
code = TSDB_CODE_INVALID_MSG;
mError("too many msgs %d in mnode batch meta req", msgNum);
goto _exit;
}
- SArray *batchRsp = taosArrayInit(msgNum, sizeof(SBatchRsp));
- if (NULL == batchRsp) {
+ batchRsp.pRsps = taosArrayInit(msgNum, sizeof(SBatchRspMsg));
+ if (NULL == batchRsp.pRsps) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
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_INVALID_MSG_LEN;
- 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_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
+ SBatchMsg* req = taosArrayGet(batchReq.pMsgs, i);
- 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_INVALID_MSG_LEN;
- 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_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msg = (char *)pMsg->pCont + offset;
- offset += req.msgLen;
-
- reqMsg.msgType = req.msgType;
- reqMsg.pCont = req.msg;
- reqMsg.contLen = req.msgLen;
+ reqMsg.msgType = req->msgType;
+ reqMsg.pCont = req->msg;
+ reqMsg.contLen = req->msgLen;
reqMsg.info.rsp = NULL;
reqMsg.info.rspLen = 0;
- MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(req.msgType)];
+ MndMsgFp fp = pMnode->msgFp[TMSG_INDEX(req->msgType)];
if (fp == NULL) {
mError("msg:%p, failed to get msg handle, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
terrno = TSDB_CODE_MSG_NOT_PROCESSED;
- taosArrayDestroy(batchRsp);
+ taosArrayDestroy(batchRsp.pRsps);
return -1;
}
@@ -146,47 +125,29 @@ int32_t mndProcessBatchMetaMsg(SRpcMsg *pMsg) {
} else {
rsp.rspCode = 0;
}
- rsp.msgIdx = req.msgIdx;
+ rsp.msgIdx = req->msgIdx;
rsp.reqType = reqMsg.msgType;
rsp.msgLen = reqMsg.info.rspLen;
rsp.msg = reqMsg.info.rsp;
- taosArrayPush(batchRsp, &rsp);
-
- rspSize += sizeof(rsp) + rsp.msgLen - POINTER_BYTES;
+ taosArrayPush(batchRsp.pRsps, &rsp);
}
- rspSize += sizeof(int32_t);
- offset = 0;
-
+ rspSize = tSerializeSBatchRsp(NULL, 0, &batchRsp);
+ if (rspSize < 0) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
pRsp = rpcMallocCont(rspSize);
if (pRsp == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
-
- *(int32_t *)((char *)pRsp + offset) = htonl(msgNum);
- offset += sizeof(msgNum);
- for (int32_t i = 0; i < msgNum; ++i) {
- SBatchRsp *p = taosArrayGet(batchRsp, i);
-
- *(int32_t *)((char *)pRsp + offset) = htonl(p->reqType);
- offset += sizeof(p->reqType);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgIdx);
- offset += sizeof(p->msgIdx);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgLen);
- offset += sizeof(p->msgLen);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->rspCode);
- offset += sizeof(p->rspCode);
- memcpy((char *)pRsp + offset, p->msg, p->msgLen);
- offset += p->msgLen;
-
- rpcFreeCont(p->msg);
+ if (tSerializeSBatchRsp(pRsp, rspSize, &batchRsp) < 0) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
}
- taosArrayDestroy(batchRsp);
- batchRsp = NULL;
-
_exit:
pMsg->info.rsp = pRsp;
@@ -196,7 +157,8 @@ _exit:
mError("mnd get batch meta failed cause of %s", tstrerror(code));
}
- taosArrayDestroyEx(batchRsp, tFreeSBatchRsp);
+ taosArrayDestroyEx(batchReq.pMsgs, tFreeSBatchReqMsg);
+ taosArrayDestroyEx(batchRsp.pRsps, mnodeFreeSBatchRspMsg);
return code;
}
diff --git a/source/dnode/mnode/impl/src/mndScheduler.c b/source/dnode/mnode/impl/src/mndScheduler.c
index 7e7c6ee0b60242b1d2a34e17e332a2e571031c5b..e1886511b714fa0a92b1b03d998730e606fa5042 100644
--- a/source/dnode/mnode/impl/src/mndScheduler.c
+++ b/source/dnode/mnode/impl/src/mndScheduler.c
@@ -508,6 +508,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
qDestroyQueryPlan(pPlan);
return -1;
}
+ sdbRelease(pSdb, pVgroup);
}
}
qDestroyQueryPlan(pPlan);
diff --git a/source/dnode/mnode/impl/src/mndShow.c b/source/dnode/mnode/impl/src/mndShow.c
index 637a3818e658e5845bdc871b7054508585073604..20c2ebb0a4789ff74832c3bc029f6dd6f4241612 100644
--- a/source/dnode/mnode/impl/src/mndShow.c
+++ b/source/dnode/mnode/impl/src/mndShow.c
@@ -106,6 +106,8 @@ static int32_t convertToRetrieveType(char *name, int32_t len) {
type = TSDB_MGMT_TABLE_STREAMS;
} else if (strncasecmp(name, TSDB_PERFS_TABLE_APPS, len) == 0) {
type = TSDB_MGMT_TABLE_APPS;
+ } else if (strncasecmp(name, TSDB_INS_TABLE_STREAM_TASKS, len) == 0) {
+ type = TSDB_MGMT_TABLE_STREAM_TASKS;
} else {
// ASSERT(0);
}
@@ -303,8 +305,7 @@ static int32_t mndProcessRetrieveSysTableReq(SRpcMsg *pReq) {
pStart += sizeof(SSysTableSchema);
}
- int32_t len = 0;
- blockEncode(pBlock, pStart, &len, pShow->pMeta->numOfColumns, false);
+ int32_t len = blockEncode(pBlock, pStart, pShow->pMeta->numOfColumns);
}
pRsp->numOfRows = htonl(rowsRead);
diff --git a/source/dnode/mnode/impl/src/mndSma.c b/source/dnode/mnode/impl/src/mndSma.c
index 56e725fac75a1e59a1de3d5135c0abd975d6abcd..698c07d9bc95b0866b49f87b42a8de0e7b8e3dfb 100644
--- a/source/dnode/mnode/impl/src/mndSma.c
+++ b/source/dnode/mnode/impl/src/mndSma.c
@@ -532,6 +532,7 @@ static int32_t mndCreateSma(SMnode *pMnode, SRpcMsg *pReq, SMCreateSmaReq *pCrea
streamObj.sql = strdup(pCreate->sql);
streamObj.smaId = smaObj.uid;
streamObj.watermark = pCreate->watermark;
+ streamObj.fillHistory = STREAM_FILL_HISTORY_ON;
streamObj.trigger = STREAM_TRIGGER_WINDOW_CLOSE;
streamObj.triggerParam = pCreate->maxDelay;
streamObj.ast = strdup(smaObj.ast);
diff --git a/source/dnode/mnode/impl/src/mndStb.c b/source/dnode/mnode/impl/src/mndStb.c
index b6f7e316389059c9b63bad1e12a24478b4bb1dbd..cee0b84672a6d8e5c57c6718f1f665b2ab82e934 100644
--- a/source/dnode/mnode/impl/src/mndStb.c
+++ b/source/dnode/mnode/impl/src/mndStb.c
@@ -519,7 +519,6 @@ static void *mndBuildVDropStbReq(SMnode *pMnode, SVgObj *pVgroup, SStbObj *pStb,
pHead->contLen = htonl(contLen);
pHead->vgId = htonl(pVgroup->vgId);
- pHead->msgMask = htonl(0);
void *pBuf = POINTER_SHIFT(pHead, sizeof(SMsgHead));
diff --git a/source/dnode/mnode/impl/src/mndStream.c b/source/dnode/mnode/impl/src/mndStream.c
index 36ba0aaf877eeef621b5d94aba11650fe6f75cc5..62247f2c2a36592ef0983be69b8188a8f6980176 100644
--- a/source/dnode/mnode/impl/src/mndStream.c
+++ b/source/dnode/mnode/impl/src/mndStream.c
@@ -41,6 +41,8 @@ static int32_t mndProcessStreamMetaReq(SRpcMsg *pReq);
static int32_t mndGetStreamMeta(SRpcMsg *pReq, SShowObj *pShow, STableMetaRsp *pMeta);
static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
static void mndCancelGetNextStream(SMnode *pMnode, void *pIter);
+static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
+static void mndCancelGetNextStreamTask(SMnode *pMnode, void *pIter);
int32_t mndInitStream(SMnode *pMnode) {
SSdbTable table = {
@@ -62,6 +64,8 @@ int32_t mndInitStream(SMnode *pMnode) {
mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAMS, mndRetrieveStream);
mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STREAMS, mndCancelGetNextStream);
+ mndAddShowRetrieveHandle(pMnode, TSDB_MGMT_TABLE_STREAM_TASKS, mndRetrieveStreamTask);
+ mndAddShowFreeIterHandle(pMnode, TSDB_MGMT_TABLE_STREAM_TASKS, mndCancelGetNextStreamTask);
return sdbSetTable(pMnode->pSdb, table);
}
@@ -287,25 +291,24 @@ static int32_t mndBuildStreamObjFromCreateReq(SMnode *pMnode, SStreamObj *pObj,
memcpy(pObj->sourceDb, pCreate->sourceDB, TSDB_DB_FNAME_LEN);
SDbObj *pSourceDb = mndAcquireDb(pMnode, pCreate->sourceDB);
if (pSourceDb == NULL) {
- /*ASSERT(0);*/
- mInfo("stream:%s failed to create, source db %s not exist", pCreate->name, pObj->sourceDb);
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
+ mInfo("stream:%s failed to create, source db %s not exist since %s", pCreate->name, pObj->sourceDb, terrstr());
return -1;
}
pObj->sourceDbUid = pSourceDb->uid;
+ mndReleaseDb(pMnode, pSourceDb);
memcpy(pObj->targetSTbName, pCreate->targetStbFullName, TSDB_TABLE_FNAME_LEN);
SDbObj *pTargetDb = mndAcquireDbByStb(pMnode, pObj->targetSTbName);
if (pTargetDb == NULL) {
- mInfo("stream:%s failed to create, target db %s not exist", pCreate->name, pObj->targetDb);
- terrno = TSDB_CODE_MND_DB_NOT_EXIST;
+ mInfo("stream:%s failed to create, target db %s not exist since %s", pCreate->name, pObj->targetDb, terrstr());
return -1;
}
tstrncpy(pObj->targetDb, pTargetDb->name, TSDB_DB_FNAME_LEN);
pObj->targetStbUid = mndGenerateUid(pObj->targetSTbName, TSDB_TABLE_FNAME_LEN);
pObj->targetDbUid = pTargetDb->uid;
+ mndReleaseDb(pMnode, pTargetDb);
pObj->sql = pCreate->sql;
pObj->ast = pCreate->ast;
@@ -522,6 +525,7 @@ static int32_t mndCreateStbForStream(SMnode *pMnode, STrans *pTrans, const SStre
tFreeSMCreateStbReq(&createReq);
mndFreeStb(&stbObj);
+ mndReleaseDb(pMnode, pDb);
return 0;
_OVER:
@@ -737,6 +741,7 @@ static int32_t mndProcessDropStreamReq(SRpcMsg *pReq) {
}
sdbRelease(pMnode->pSdb, pStream);
+ mndTransDrop(pTrans);
return TSDB_CODE_ACTION_IN_PROGRESS;
}
@@ -894,7 +899,7 @@ static int32_t mndRetrieveStream(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
SName n;
int32_t cols = 0;
- char streamName[TSDB_DB_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ char streamName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
STR_WITH_MAXSIZE_TO_VARSTR(streamName, mndGetDbStr(pStream->name), sizeof(streamName));
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, (const char *)streamName, false);
@@ -956,3 +961,105 @@ static void mndCancelGetNextStream(SMnode *pMnode, void *pIter) {
SSdb *pSdb = pMnode->pSdb;
sdbCancelFetch(pSdb, pIter);
}
+
+static int32_t mndRetrieveStreamTask(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rowsCapacity) {
+ SMnode *pMnode = pReq->info.node;
+ SSdb *pSdb = pMnode->pSdb;
+ int32_t numOfRows = 0;
+ SStreamObj *pStream = NULL;
+
+ while (numOfRows < rowsCapacity) {
+ pShow->pIter = sdbFetch(pSdb, SDB_STREAM, pShow->pIter, (void **)&pStream);
+ if (pShow->pIter == NULL) break;
+
+ // lock
+ taosRLockLatch(&pStream->lock);
+ // count task num
+ int32_t sz = taosArrayGetSize(pStream->tasks);
+ int32_t count = 0;
+ for (int32_t i = 0; i < sz; i++) {
+ SArray *pLevel = taosArrayGetP(pStream->tasks, i);
+ count += taosArrayGetSize(pLevel);
+ }
+
+ if (numOfRows + count > rowsCapacity) {
+ blockDataEnsureCapacity(pBlock, numOfRows + count);
+ }
+ // add row for each task
+ for (int32_t i = 0; i < sz; i++) {
+ SArray *pLevel = taosArrayGetP(pStream->tasks, i);
+ int32_t levelCnt = taosArrayGetSize(pLevel);
+ for (int32_t j = 0; j < levelCnt; j++) {
+ SStreamTask *pTask = taosArrayGetP(pLevel, j);
+
+ SColumnInfoData *pColInfo;
+ int32_t cols = 0;
+
+ // stream name
+ char streamName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ STR_WITH_MAXSIZE_TO_VARSTR(streamName, mndGetDbStr(pStream->name), sizeof(streamName));
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)streamName, false);
+
+ // task id
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)&pTask->taskId, false);
+
+ // node type
+ char nodeType[20 + VARSTR_HEADER_SIZE] = {0};
+ varDataSetLen(nodeType, 5);
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ if (pTask->nodeId > 0) {
+ memcpy(varDataVal(nodeType), "vnode", 5);
+ } else {
+ memcpy(varDataVal(nodeType), "snode", 5);
+ }
+ colDataAppend(pColInfo, numOfRows, nodeType, false);
+
+ // node id
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ int32_t nodeId = TMAX(pTask->nodeId, 0);
+ colDataAppend(pColInfo, numOfRows, (const char *)&nodeId, false);
+
+ // level
+ char level[20 + VARSTR_HEADER_SIZE] = {0};
+ if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
+ memcpy(varDataVal(level), "source", 6);
+ varDataSetLen(level, 6);
+ } else if (pTask->taskLevel == TASK_LEVEL__AGG) {
+ memcpy(varDataVal(level), "agg", 3);
+ varDataSetLen(level, 3);
+ } else if (pTask->taskLevel == TASK_LEVEL__SINK) {
+ memcpy(varDataVal(level), "sink", 4);
+ varDataSetLen(level, 4);
+ } else if (pTask->taskLevel == TASK_LEVEL__SINK) {
+ }
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)&level, false);
+
+ // status
+ char status[20 + VARSTR_HEADER_SIZE] = {0};
+ char status2[20] = {0};
+ strcpy(status, "normal");
+ STR_WITH_MAXSIZE_TO_VARSTR(status, status2, sizeof(status));
+ pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
+ colDataAppend(pColInfo, numOfRows, (const char *)&status, false);
+
+ numOfRows++;
+ }
+ }
+
+ // unlock
+ taosRUnLockLatch(&pStream->lock);
+
+ sdbRelease(pSdb, pStream);
+ }
+
+ pShow->numOfRows += numOfRows;
+ return numOfRows;
+}
+
+static void mndCancelGetNextStreamTask(SMnode *pMnode, void *pIter) {
+ SSdb *pSdb = pMnode->pSdb;
+ sdbCancelFetch(pSdb, pIter);
+}
diff --git a/source/dnode/mnode/impl/src/mndSubscribe.c b/source/dnode/mnode/impl/src/mndSubscribe.c
index a62f15f978bba618668ff2df5d0146db8c40f531..58c89d76aa41542d4138ed4b638333edc74ef947 100644
--- a/source/dnode/mnode/impl/src/mndSubscribe.c
+++ b/source/dnode/mnode/impl/src/mndSubscribe.c
@@ -235,6 +235,7 @@ static int32_t mndDoRebalance(SMnode *pMnode, const SMqRebInputObj *pInput, SMqR
taosHashPut(pHash, &pVgEp->vgId, sizeof(int32_t), &outputVg, sizeof(SMqRebOutputVg));
mInfo("mq rebalance: remove vgId:%d from consumer:%" PRId64, pVgEp->vgId, consumerId);
}
+ taosArrayDestroy(pConsumerEp->vgs);
taosHashRemove(pOutput->pSub->consumerHash, &consumerId, sizeof(int64_t));
// put into removed
taosArrayPush(pOutput->removedConsumers, &consumerId);
@@ -470,8 +471,12 @@ static int32_t mndPersistRebResult(SMnode *pMnode, SRpcMsg *pMsg, const SMqRebOu
pConsumerNew->updateType = CONSUMER_UPDATE__TOUCH;
mndReleaseConsumer(pMnode, pConsumerOld);
if (mndSetConsumerCommitLogs(pMnode, pTrans, pConsumerNew) != 0) {
+ tDeleteSMqConsumerObj(pConsumerNew);
+ taosMemoryFree(pConsumerNew);
goto REB_FAIL;
}
+ tDeleteSMqConsumerObj(pConsumerNew);
+ taosMemoryFree(pConsumerNew);
}
// 3.2 set new consumer
consumerNum = taosArrayGetSize(pOutput->newConsumers);
@@ -944,6 +949,8 @@ static int32_t mndRetrieveSubscribe(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
int32_t numOfRows = 0;
SMqSubscribeObj *pSub = NULL;
+ mDebug("mnd show subscriptions begin");
+
while (numOfRows < rowsCapacity) {
pShow->pIter = sdbFetch(pSdb, SDB_SUBSCRIBE, pShow->pIter, (void **)&pSub);
if (pShow->pIter == NULL) break;
@@ -989,6 +996,9 @@ static int32_t mndRetrieveSubscribe(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, (const char *)&pConsumerEp->consumerId, false);
+ mDebug("mnd show subscriptions: topic %s, consumer %" PRId64 " cgroup %s vgid %d", varDataVal(topic),
+ pConsumerEp->consumerId, varDataVal(cgroup), pVgEp->vgId);
+
// offset
#if 0
// subscribe time
@@ -1034,6 +1044,9 @@ static int32_t mndRetrieveSubscribe(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
pColInfo = taosArrayGet(pBlock->pDataBlock, cols++);
colDataAppend(pColInfo, numOfRows, NULL, true);
+ mDebug("mnd show subscriptions(unassigned): topic %s, cgroup %s vgid %d", varDataVal(topic), varDataVal(cgroup),
+ pVgEp->vgId);
+
// offset
#if 0
// subscribe time
@@ -1053,6 +1066,8 @@ static int32_t mndRetrieveSubscribe(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock
sdbRelease(pSdb, pSub);
}
+ mDebug("mnd end show subscriptions");
+
pShow->numOfRows += numOfRows;
return numOfRows;
}
diff --git a/source/dnode/mnode/impl/src/mndSync.c b/source/dnode/mnode/impl/src/mndSync.c
index abb23bfb89d7406c5ebab62eff4ecb9b1f5c9a88..4dd7e070b331f5eded04dd69f08d9e6a971d9048 100644
--- a/source/dnode/mnode/impl/src/mndSync.c
+++ b/source/dnode/mnode/impl/src/mndSync.c
@@ -202,6 +202,28 @@ static void mndBecomeLeader(const SSyncFSM *pFsm) {
SMnode *pMnode = pFsm->data;
}
+static bool mndApplyQueueEmpty(const SSyncFSM *pFsm) {
+ SMnode *pMnode = pFsm->data;
+
+ if (pMnode != NULL && pMnode->msgCb.qsizeFp != NULL) {
+ int32_t itemSize = tmsgGetQueueSize(&pMnode->msgCb, 1, APPLY_QUEUE);
+ return (itemSize == 0);
+ } else {
+ return true;
+ }
+}
+
+static int32_t mndApplyQueueItems(const SSyncFSM *pFsm) {
+ SMnode *pMnode = pFsm->data;
+
+ if (pMnode != NULL && pMnode->msgCb.qsizeFp != NULL) {
+ int32_t itemSize = tmsgGetQueueSize(&pMnode->msgCb, 1, APPLY_QUEUE);
+ return itemSize;
+ } else {
+ return -1;
+ }
+}
+
SSyncFSM *mndSyncMakeFsm(SMnode *pMnode) {
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
pFsm->data = pMnode;
@@ -210,6 +232,8 @@ SSyncFSM *mndSyncMakeFsm(SMnode *pMnode) {
pFsm->FpRollBackCb = NULL;
pFsm->FpRestoreFinishCb = mndRestoreFinish;
pFsm->FpLeaderTransferCb = NULL;
+ pFsm->FpApplyQueueEmptyCb = mndApplyQueueEmpty;
+ pFsm->FpApplyQueueItems = mndApplyQueueItems;
pFsm->FpReConfigCb = NULL;
pFsm->FpBecomeLeaderCb = mndBecomeLeader;
pFsm->FpBecomeFollowerCb = mndBecomeFollower;
@@ -283,7 +307,7 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
SRpcMsg req = {.msgType = TDMT_MND_APPLY_MSG, .contLen = sdbGetRawTotalSize(pRaw)};
if (req.contLen <= 0) return -1;
-
+
req.pCont = rpcMallocCont(req.contLen);
if (req.pCont == NULL) return -1;
memcpy(req.pCont, pRaw, req.contLen);
@@ -325,6 +349,7 @@ int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId) {
}
rpcFreeCont(req.pCont);
+ req.pCont = NULL;
if (code != 0) {
mError("trans:%d, failed to propose, code:0x%x", pMgmt->transId, code);
return code;
diff --git a/source/dnode/mnode/impl/src/mndTopic.c b/source/dnode/mnode/impl/src/mndTopic.c
index e1ca1d2708e4e0d05ed2018d8f62500352518795..522036afa22354409261ed94f49457cea73756b0 100644
--- a/source/dnode/mnode/impl/src/mndTopic.c
+++ b/source/dnode/mnode/impl/src/mndTopic.c
@@ -637,6 +637,7 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) {
if (pIter == NULL) break;
if (pConsumer->status == MQ_CONSUMER_STATUS__LOST_REBD) continue;
+
int32_t sz = taosArrayGetSize(pConsumer->assignedTopics);
for (int32_t i = 0; i < sz; i++) {
char *name = taosArrayGetP(pConsumer->assignedTopics, i);
@@ -649,6 +650,33 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) {
return -1;
}
}
+
+ sz = taosArrayGetSize(pConsumer->rebNewTopics);
+ for (int32_t i = 0; i < sz; i++) {
+ char *name = taosArrayGetP(pConsumer->rebNewTopics, i);
+ if (strcmp(name, pTopic->name) == 0) {
+ mndReleaseConsumer(pMnode, pConsumer);
+ mndReleaseTopic(pMnode, pTopic);
+ terrno = TSDB_CODE_MND_TOPIC_SUBSCRIBED;
+ mError("topic:%s, failed to drop since subscribed by consumer:%" PRId64 ", in consumer group %s (reb new)",
+ dropReq.name, pConsumer->consumerId, pConsumer->cgroup);
+ return -1;
+ }
+ }
+
+ sz = taosArrayGetSize(pConsumer->rebRemovedTopics);
+ for (int32_t i = 0; i < sz; i++) {
+ char *name = taosArrayGetP(pConsumer->rebRemovedTopics, i);
+ if (strcmp(name, pTopic->name) == 0) {
+ mndReleaseConsumer(pMnode, pConsumer);
+ mndReleaseTopic(pMnode, pTopic);
+ terrno = TSDB_CODE_MND_TOPIC_SUBSCRIBED;
+ mError("topic:%s, failed to drop since subscribed by consumer:%" PRId64 ", in consumer group %s (reb remove)",
+ dropReq.name, pConsumer->consumerId, pConsumer->cgroup);
+ return -1;
+ }
+ }
+
sdbRelease(pSdb, pConsumer);
}
@@ -675,15 +703,6 @@ static int32_t mndProcessDropTopicReq(SRpcMsg *pReq) {
mInfo("trans:%d, used to drop topic:%s", pTrans->id, pTopic->name);
-#if 0
- if (mndDropOffsetByTopic(pMnode, pTrans, dropReq.name) < 0) {
- ASSERT(0);
- mndTransDrop(pTrans);
- mndReleaseTopic(pMnode, pTopic);
- return -1;
- }
-#endif
-
// TODO check if rebalancing
if (mndDropSubByTopic(pMnode, pTrans, dropReq.name) < 0) {
/*ASSERT(0);*/
diff --git a/source/dnode/mnode/impl/src/mndTrans.c b/source/dnode/mnode/impl/src/mndTrans.c
index ac05598bdc37b63c5dd80c82dfd1becc58452fc9..27c58dfba163acbae22caa68cd3e6be7c492984c 100644
--- a/source/dnode/mnode/impl/src/mndTrans.c
+++ b/source/dnode/mnode/impl/src/mndTrans.c
@@ -938,11 +938,15 @@ static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans) {
for (int32_t i = 0; i < size; ++i) {
SRpcHandleInfo *pInfo = taosArrayGet(pTrans->pRpcArray, i);
if (pInfo->handle != NULL) {
- mInfo("trans:%d, send rsp, code:0x%x stage:%s app:%p", pTrans->id, code, mndTransStr(pTrans->stage),
- pInfo->ahandle);
if (code == TSDB_CODE_RPC_NETWORK_UNAVAIL) {
code = TSDB_CODE_MND_TRANS_NETWORK_UNAVAILL;
}
+ if (i != 0 && code == 0) {
+ code = TSDB_CODE_RPC_REDIRECT;
+ }
+ mInfo("trans:%d, client:%d send rsp, code:0x%x stage:%s app:%p", pTrans->id, i, code, mndTransStr(pTrans->stage),
+ pInfo->ahandle);
+
SRpcMsg rspMsg = {.code = code, .info = *pInfo};
if (pTrans->originRpcType == TDMT_MND_CREATE_DB) {
@@ -1273,9 +1277,11 @@ static int32_t mndTransExecuteRedoActionsSerial(SMnode *pMnode, STrans *pTrans)
pAction->id);
code = mndTransSync(pMnode, pTrans);
if (code != 0) {
+ pTrans->redoActionPos--;
pTrans->code = terrno;
mError("trans:%d, %s:%d is executed and failed to sync to other mnodes since %s", pTrans->id,
mndTransStr(pAction->stage), pAction->id, terrstr());
+ break;
}
} else if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
mInfo("trans:%d, %s:%d is in progress and wait it finish", pTrans->id, mndTransStr(pAction->stage), pAction->id);
diff --git a/source/dnode/mnode/impl/src/mndVgroup.c b/source/dnode/mnode/impl/src/mndVgroup.c
index e00d0d955ec820176cb696fa652c5e7fdd374edb..7901093315bc8671a51805913c54d2950f862b82 100644
--- a/source/dnode/mnode/impl/src/mndVgroup.c
+++ b/source/dnode/mnode/impl/src/mndVgroup.c
@@ -1739,6 +1739,7 @@ static int32_t mndSplitVgroup(SMnode *pMnode, SRpcMsg *pReq, SDbObj *pDb, SVgObj
code = 0;
_OVER:
+ taosArrayDestroy(pArray);
mndTransDrop(pTrans);
sdbFreeRaw(pRaw);
return code;
@@ -1907,6 +1908,7 @@ static int32_t mndBalanceVgroup(SMnode *pMnode, SRpcMsg *pReq, SArray *pArray) {
}
_OVER:
+ taosHashCleanup(pBalancedVgroups);
mndTransDrop(pTrans);
return code;
}
diff --git a/source/dnode/qnode/src/qnode.c b/source/dnode/qnode/src/qnode.c
index 289251f56092ac0f343775f35554d5314f27a41c..5efc714e95c85b528c24d64fc9642788d06c99ec 100644
--- a/source/dnode/qnode/src/qnode.c
+++ b/source/dnode/qnode/src/qnode.c
@@ -69,7 +69,7 @@ int32_t qndPreprocessQueryMsg(SQnode *pQnode, SRpcMsg *pMsg) {
return 0;
}
- return qWorkerPreprocessQueryMsg(pQnode->pQuery, pMsg);
+ return qWorkerPreprocessQueryMsg(pQnode->pQuery, pMsg, false);
}
int32_t qndProcessQueryMsg(SQnode *pQnode, int64_t ts, SRpcMsg *pMsg) {
diff --git a/source/dnode/snode/src/snode.c b/source/dnode/snode/src/snode.c
index f53350c10bbeea2e0b9b9d53edfb5caaa4304b8f..aa55204ae5ed8c511684ca10b5eeb2067be5bad5 100644
--- a/source/dnode/snode/src/snode.c
+++ b/source/dnode/snode/src/snode.c
@@ -36,13 +36,14 @@ void sndEnqueueStreamDispatch(SSnode *pSnode, SRpcMsg *pMsg) {
int32_t taskId = req.taskId;
- SStreamTask *pTask = streamMetaGetTask(pSnode->pMeta, taskId);
+ SStreamTask *pTask = streamMetaAcquireTask(pSnode->pMeta, taskId);
if (pTask) {
SRpcMsg rsp = {
.info = pMsg->info,
.code = 0,
};
streamProcessDispatchReq(pTask, &req, &rsp, false);
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
return;
@@ -63,6 +64,7 @@ int32_t sndExpandTask(SSnode *pSnode, SStreamTask *pTask, int64_t ver) {
ASSERT(pTask->taskLevel == TASK_LEVEL__AGG);
ASSERT(taosArrayGetSize(pTask->childEpInfo) != 0);
+ pTask->refCnt = 1;
pTask->schedStatus = TASK_SCHED_STATUS__INACTIVE;
pTask->inputQueue = streamQueueOpen();
pTask->outputQueue = streamQueueOpen();
@@ -166,15 +168,17 @@ int32_t sndProcessTaskDeployReq(SSnode *pSnode, char *msg, int32_t msgLen) {
int32_t sndProcessTaskDropReq(SSnode *pSnode, char *msg, int32_t msgLen) {
SVDropStreamTaskReq *pReq = (SVDropStreamTaskReq *)msg;
- return streamMetaRemoveTask(pSnode->pMeta, pReq->taskId);
+ streamMetaRemoveTask1(pSnode->pMeta, pReq->taskId);
+ return 0;
}
int32_t sndProcessTaskRunReq(SSnode *pSnode, SRpcMsg *pMsg) {
SStreamTaskRunReq *pReq = pMsg->pCont;
int32_t taskId = pReq->taskId;
- SStreamTask *pTask = streamMetaGetTask(pSnode->pMeta, taskId);
+ SStreamTask *pTask = streamMetaAcquireTask(pSnode->pMeta, taskId);
if (pTask) {
streamProcessRunReq(pTask);
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
return 0;
} else {
return -1;
@@ -191,13 +195,14 @@ int32_t sndProcessTaskDispatchReq(SSnode *pSnode, SRpcMsg *pMsg, bool exec) {
tDecodeStreamDispatchReq(&decoder, &req);
int32_t taskId = req.taskId;
- SStreamTask *pTask = streamMetaGetTask(pSnode->pMeta, taskId);
+ SStreamTask *pTask = streamMetaAcquireTask(pSnode->pMeta, taskId);
if (pTask) {
SRpcMsg rsp = {
.info = pMsg->info,
.code = 0,
};
streamProcessDispatchReq(pTask, &req, &rsp, exec);
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
return 0;
} else {
return -1;
@@ -215,13 +220,14 @@ int32_t sndProcessTaskRetrieveReq(SSnode *pSnode, SRpcMsg *pMsg) {
tDecodeStreamRetrieveReq(&decoder, &req);
tDecoderClear(&decoder);
int32_t taskId = req.dstTaskId;
- SStreamTask *pTask = streamMetaGetTask(pSnode->pMeta, taskId);
+ SStreamTask *pTask = streamMetaAcquireTask(pSnode->pMeta, taskId);
if (pTask) {
SRpcMsg rsp = {
.info = pMsg->info,
.code = 0,
};
streamProcessRetrieveReq(pTask, &req, &rsp);
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
tDeleteStreamRetrieveReq(&req);
return 0;
} else {
@@ -232,9 +238,10 @@ int32_t sndProcessTaskRetrieveReq(SSnode *pSnode, SRpcMsg *pMsg) {
int32_t sndProcessTaskDispatchRsp(SSnode *pSnode, SRpcMsg *pMsg) {
SStreamDispatchRsp *pRsp = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
int32_t taskId = ntohl(pRsp->upstreamTaskId);
- SStreamTask *pTask = streamMetaGetTask(pSnode->pMeta, taskId);
+ SStreamTask *pTask = streamMetaAcquireTask(pSnode->pMeta, taskId);
if (pTask) {
streamProcessDispatchRsp(pTask, pRsp, pMsg->code);
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
return 0;
} else {
return -1;
@@ -274,15 +281,17 @@ int32_t sndProcessTaskRecoverFinishReq(SSnode *pSnode, SRpcMsg *pMsg) {
tDecoderClear(&decoder);
// find task
- SStreamTask *pTask = streamMetaGetTask(pSnode->pMeta, req.taskId);
+ SStreamTask *pTask = streamMetaAcquireTask(pSnode->pMeta, req.taskId);
if (pTask == NULL) {
return -1;
}
// do process request
if (streamProcessRecoverFinishReq(pTask, req.childId) < 0) {
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
return -1;
}
+ streamMetaReleaseTask(pSnode->pMeta, pTask);
return 0;
}
diff --git a/source/dnode/vnode/inc/vnode.h b/source/dnode/vnode/inc/vnode.h
index 370103c222b5d4a34b3865f7727b3e5f5035b745..27084700b0b3b3a01bdfdf5064094fcd2a484c54 100644
--- a/source/dnode/vnode/inc/vnode.h
+++ b/source/dnode/vnode/inc/vnode.h
@@ -239,6 +239,7 @@ int32_t tqReaderSetDataMsg(STqReader *pReader, const SSubmitReq *pMsg, int64_t v
bool tqNextDataBlock(STqReader *pReader);
bool tqNextDataBlockFilterOut(STqReader *pReader, SHashObj *filterOutUids);
int32_t tqRetrieveDataBlock(SSDataBlock *pBlock, STqReader *pReader);
+int32_t tqRetrieveTaosxBlock(STqReader *pReader, SArray *blocks, SArray *schemas);
int32_t vnodeEnqueueStreamMsg(SVnode *pVnode, SRpcMsg *pMsg);
diff --git a/source/dnode/vnode/src/inc/meta.h b/source/dnode/vnode/src/inc/meta.h
index 9e2fe4aaf004d8bc730242f34228c5903f7bc817..2ceae91f7ccf64a24b331d53db3e6a75b49ba367 100644
--- a/source/dnode/vnode/src/inc/meta.h
+++ b/source/dnode/vnode/src/inc/meta.h
@@ -70,6 +70,7 @@ int32_t metaCacheDrop(SMeta* pMeta, int64_t uid);
int32_t metaStatsCacheUpsert(SMeta* pMeta, SMetaStbStats* pInfo);
int32_t metaStatsCacheDrop(SMeta* pMeta, int64_t uid);
int32_t metaStatsCacheGet(SMeta* pMeta, int64_t uid, SMetaStbStats* pInfo);
+void metaUpdateStbStats(SMeta *pMeta, int64_t uid, int64_t delta);
struct SMeta {
TdThreadRwlock lock;
diff --git a/source/dnode/vnode/src/inc/tq.h b/source/dnode/vnode/src/inc/tq.h
index ef54adf0d6502abe2817d6331f70b0f2a2f932e7..8ae1c8720ca6a37ba46e942febc0433dd091d282 100644
--- a/source/dnode/vnode/src/inc/tq.h
+++ b/source/dnode/vnode/src/inc/tq.h
@@ -88,8 +88,7 @@ typedef struct {
STqExecTb execTb;
STqExecDb execDb;
};
- int32_t numOfCols; // number of out pout column, temporarily used
- SSchemaWrapper* pSchemaWrapper; // columns that are involved in query
+ int32_t numOfCols; // number of out pout column, temporarily used
} STqExecHandle;
typedef struct {
diff --git a/source/dnode/vnode/src/inc/tsdb.h b/source/dnode/vnode/src/inc/tsdb.h
index 6ae52f1fd7f86f5e1c060712bb5650ff258e7707..c6e2842c321b1025445c4070f94fe3d6e9a05ae5 100644
--- a/source/dnode/vnode/src/inc/tsdb.h
+++ b/source/dnode/vnode/src/inc/tsdb.h
@@ -108,9 +108,8 @@ static FORCE_INLINE int64_t tsdbLogicToFileSize(int64_t lSize, int32_t szPage) {
#define TSDBROW_KEY(ROW) ((TSDBKEY){.version = TSDBROW_VERSION(ROW), .ts = TSDBROW_TS(ROW)})
#define tsdbRowFromTSRow(VERSION, TSROW) ((TSDBROW){.type = 0, .version = (VERSION), .pTSRow = (TSROW)})
#define tsdbRowFromBlockData(BLOCKDATA, IROW) ((TSDBROW){.type = 1, .pBlockData = (BLOCKDATA), .iRow = (IROW)})
-void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
-int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow);
-int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow);
+void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *pColVal);
+// int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow);
int32_t tsdbRowCmprFn(const void *p1, const void *p2);
// SRowIter
void tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema);
@@ -155,15 +154,13 @@ int32_t tCmprBlockL(void const *lhs, void const *rhs);
int32_t tBlockDataCreate(SBlockData *pBlockData);
void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear);
int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema, int16_t *aCid, int32_t nCid);
-int32_t tBlockDataInitEx(SBlockData *pBlockData, SBlockData *pBlockDataFrom);
void tBlockDataReset(SBlockData *pBlockData);
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid);
void tBlockDataClear(SBlockData *pBlockData);
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx);
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData);
-int32_t tBlockDataCopy(SBlockData *pBlockDataSrc, SBlockData *pBlockDataDest);
int32_t tBlockDataMerge(SBlockData *pBlockData1, SBlockData *pBlockData2, SBlockData *pBlockData);
-int32_t tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData);
+int32_t tBlockDataAddColData(SBlockData *pBlockData, SColData **ppColData);
int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut, int32_t *szOut, uint8_t *aBuf[],
int32_t aBufN[]);
int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uint8_t *aBuf[]);
@@ -193,7 +190,6 @@ int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision);
void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey);
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now);
int32_t tsdbBuildDeleteSkyline(SArray *aDelData, int32_t sidx, int32_t eidx, SArray *aSkyline);
-void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg);
int32_t tPutColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg);
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
@@ -213,11 +209,10 @@ void tsdbRefMemTable(SMemTable *pMemTable);
void tsdbUnrefMemTable(SMemTable *pMemTable);
SArray *tsdbMemTableGetTbDataArray(SMemTable *pMemTable);
// STbDataIter
-int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter **ppIter);
-void *tsdbTbDataIterDestroy(STbDataIter *pIter);
-void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
-TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter);
-bool tsdbTbDataIterNext(STbDataIter *pIter);
+int32_t tsdbTbDataIterCreate(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter **ppIter);
+void *tsdbTbDataIterDestroy(STbDataIter *pIter);
+void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDataIter *pIter);
+bool tsdbTbDataIterNext(STbDataIter *pIter);
// STbData
int32_t tsdbGetNRowsInTbData(STbData *pTbData);
// tsdbFile.c ==============================================================================================
@@ -338,6 +333,8 @@ struct SVersionRange {
typedef struct SMemSkipListNode SMemSkipListNode;
struct SMemSkipListNode {
int8_t level;
+ int64_t version;
+ STSRow *pTSRow;
SMemSkipListNode *forwards[0];
};
typedef struct SMemSkipList {
@@ -473,7 +470,7 @@ struct SBlockData {
int64_t *aUid; // uids of each row, only exist in block data in .last file (uid == 0)
int64_t *aVersion; // versions of each row
TSKEY *aTSKEY; // timestamp of each row
- SArray *aIdx; // SArray
+ int32_t nColData;
SArray *aColData; // SArray
};
@@ -716,14 +713,14 @@ void *destroyLastBlockLoadInfo(SSttBlockLoadInfo *pLoadInfo);
// tsdbCache ==============================================================================================
typedef struct SCacheRowsReader {
- SVnode *pVnode;
- STSchema *pSchema;
- uint64_t uid;
- uint64_t suid;
- char **transferBuf; // todo remove it soon
- int32_t numOfCols;
- int32_t type;
- int32_t tableIndex; // currently returned result tables
+ SVnode *pVnode;
+ STSchema *pSchema;
+ uint64_t uid;
+ uint64_t suid;
+ char **transferBuf; // todo remove it soon
+ int32_t numOfCols;
+ int32_t type;
+ int32_t tableIndex; // currently returned result tables
STableKeyInfo *pTableList; // table id list
int32_t numOfTables;
@@ -775,6 +772,33 @@ static FORCE_INLINE int32_t tsdbKeyCmprFn(const void *p1, const void *p2) {
return 0;
}
+#define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
+#define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
+
+static FORCE_INLINE TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter) {
+ if (pIter == NULL) return NULL;
+
+ if (pIter->pRow) {
+ return pIter->pRow;
+ }
+
+ if (pIter->backward) {
+ if (pIter->pNode == pIter->pTbData->sl.pHead) {
+ return NULL;
+ }
+ } else {
+ if (pIter->pNode == pIter->pTbData->sl.pTail) {
+ return NULL;
+ }
+ }
+
+ pIter->pRow = &pIter->row;
+ pIter->pRow->version = pIter->pNode->version;
+ pIter->pRow->pTSRow = pIter->pNode->pTSRow;
+
+ return pIter->pRow;
+}
+
#ifdef __cplusplus
}
#endif
diff --git a/source/dnode/vnode/src/inc/vnd.h b/source/dnode/vnode/src/inc/vnd.h
index 8f8691cfc2af4cb5f2d30ca9d3708327a8d2f2f6..83f375c9868976253c1092f798e42619e2fe3c1b 100644
--- a/source/dnode/vnode/src/inc/vnd.h
+++ b/source/dnode/vnode/src/inc/vnd.h
@@ -61,14 +61,14 @@ struct SVBufPoolNode {
};
struct SVBufPool {
- SVBufPool* next;
- SVnode* pVnode;
- volatile int32_t nRef;
- TdThreadSpinlock lock;
- int64_t size;
- uint8_t* ptr;
- SVBufPoolNode* pTail;
- SVBufPoolNode node;
+ SVBufPool* next;
+ SVnode* pVnode;
+ TdThreadSpinlock* lock;
+ volatile int32_t nRef;
+ int64_t size;
+ uint8_t* ptr;
+ SVBufPoolNode* pTail;
+ SVBufPoolNode node;
};
int32_t vnodeOpenBufPool(SVnode* pVnode);
@@ -77,6 +77,7 @@ void vnodeBufPoolReset(SVBufPool* pPool);
// vnodeQuery.c
int32_t vnodeQueryOpen(SVnode* pVnode);
+void vnodeQueryPreClose(SVnode *pVnode);
void vnodeQueryClose(SVnode* pVnode);
int32_t vnodeGetTableMeta(SVnode* pVnode, SRpcMsg* pMsg, bool direct);
int vnodeGetTableCfg(SVnode* pVnode, SRpcMsg* pMsg, bool direct);
diff --git a/source/dnode/vnode/src/inc/vnodeInt.h b/source/dnode/vnode/src/inc/vnodeInt.h
index 44ecf64419c005d4c900bc40b8103e8b8e534eb2..ac9fabf05248fc4bf58f4e271ca161681f327eca 100644
--- a/source/dnode/vnode/src/inc/vnodeInt.h
+++ b/source/dnode/vnode/src/inc/vnodeInt.h
@@ -102,6 +102,7 @@ int metaClose(SMeta* pMeta);
int metaBegin(SMeta* pMeta, int8_t fromSys);
int metaCommit(SMeta* pMeta);
int metaFinishCommit(SMeta* pMeta);
+int metaPrepareAsyncCommit(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);
diff --git a/source/dnode/vnode/src/meta/metaCommit.c b/source/dnode/vnode/src/meta/metaCommit.c
index 01ad833d203023b59f69e2f985d964d21a213972..0be0c3e40798ec953a529d433b7294d564ceee84 100644
--- a/source/dnode/vnode/src/meta/metaCommit.c
+++ b/source/dnode/vnode/src/meta/metaCommit.c
@@ -35,6 +35,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); }
+int metaPrepareAsyncCommit(SMeta *pMeta) { return tdbPrepareAsyncCommit(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/metaQuery.c b/source/dnode/vnode/src/meta/metaQuery.c
index 43e80b99d41258b3a6969dd853b69ae806da231f..620022c06de5fd675b6ef55c10840874243d33b1 100644
--- a/source/dnode/vnode/src/meta/metaQuery.c
+++ b/source/dnode/vnode/src/meta/metaQuery.c
@@ -153,7 +153,7 @@ bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid) {
int metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid) {
SMeta *pMeta = pReader->pMeta;
- int64_t version;
+ int64_t version1;
// query uid.idx
if (tdbTbGet(pMeta->pUidIdx, &uid, sizeof(uid), &pReader->pBuf, &pReader->szBuf) < 0) {
@@ -161,8 +161,8 @@ int metaGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid) {
return -1;
}
- version = ((SUidIdxVal *)pReader->pBuf)[0].version;
- return metaGetTableEntryByVersion(pReader, version, uid);
+ version1 = ((SUidIdxVal *)pReader->pBuf)[0].version;
+ return metaGetTableEntryByVersion(pReader, version1, uid);
}
int metaGetTableEntryByName(SMetaReader *pReader, const char *name) {
@@ -1445,3 +1445,13 @@ int32_t metaGetStbStats(SMeta *pMeta, int64_t uid, SMetaStbStats *pInfo) {
_exit:
return code;
}
+
+void metaUpdateStbStats(SMeta *pMeta, int64_t uid, int64_t delta) {
+ SMetaStbStats stats = {0};
+
+ if (metaStatsCacheGet(pMeta, uid, &stats) == TSDB_CODE_SUCCESS) {
+ stats.ctbNum += delta;
+
+ metaStatsCacheUpsert(pMeta, &stats);
+ }
+}
diff --git a/source/dnode/vnode/src/meta/metaTable.c b/source/dnode/vnode/src/meta/metaTable.c
index 6dadce80ca459ce371cf13311b643974e6f1cd07..8250d68ae1da8aa93571db4975fa9f36d74c5222 100644
--- a/source/dnode/vnode/src/meta/metaTable.c
+++ b/source/dnode/vnode/src/meta/metaTable.c
@@ -371,7 +371,7 @@ int metaAlterSTable(SMeta *pMeta, int64_t version, SVCreateStbReq *pReq) {
// update uid index
metaUpdateUidIdx(pMeta, &nStbEntry);
- metaStatsCacheDrop(pMeta, nStbEntry.uid);
+ // metaStatsCacheDrop(pMeta, nStbEntry.uid);
metaULock(pMeta);
@@ -403,6 +403,11 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe
// validate req
metaReaderInit(&mr, pMeta, 0);
if (metaGetTableEntryByName(&mr, pReq->name) == 0) {
+ if (pReq->type == TSDB_CHILD_TABLE && pReq->ctb.suid != mr.me.ctbEntry.suid) {
+ terrno = TSDB_CODE_TDB_TABLE_IN_OTHER_STABLE;
+ metaReaderClear(&mr);
+ return -1;
+ }
pReq->uid = mr.me.uid;
if (pReq->type == TSDB_CHILD_TABLE) {
pReq->ctb.suid = mr.me.ctbEntry.suid;
@@ -450,6 +455,10 @@ int metaCreateTable(SMeta *pMeta, int64_t version, SVCreateTbReq *pReq, STableMe
#endif
++pMeta->pVnode->config.vndStats.numOfCTables;
+
+ metaWLock(pMeta);
+ metaUpdateStbStats(pMeta, me.ctbEntry.suid, 1);
+ metaULock(pMeta);
} else {
me.ntbEntry.ctime = pReq->ctime;
me.ntbEntry.ttlDays = pReq->ttl;
@@ -670,6 +679,8 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
tdbTbDelete(pMeta->pCtbIdx, &(SCtbIdxKey){.suid = e.ctbEntry.suid, .uid = uid}, sizeof(SCtbIdxKey), &pMeta->txn);
--pMeta->pVnode->config.vndStats.numOfCTables;
+
+ metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1);
} else if (e.type == TSDB_NORMAL_TABLE) {
// drop schema.db (todo)
diff --git a/source/dnode/vnode/src/tq/tq.c b/source/dnode/vnode/src/tq/tq.c
index 9c377fe7f579756c0a3e374e57d337ad276a519a..5e35e34b87bd83b23ed0428e2aab0f661c38ad0f 100644
--- a/source/dnode/vnode/src/tq/tq.c
+++ b/source/dnode/vnode/src/tq/tq.c
@@ -55,6 +55,7 @@ static void destroySTqHandle(void* data) {
STqHandle* pData = (STqHandle*)data;
qDestroyTask(pData->execHandle.task);
if (pData->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
+ taosMemoryFreeClear(pData->execHandle.execCol.qmsg);
} else if (pData->execHandle.subType == TOPIC_SUB_TYPE__DB) {
tqCloseReader(pData->execHandle.pExecReader);
walCloseReader(pData->pWalReader);
@@ -67,6 +68,7 @@ static void destroySTqHandle(void* data) {
static void tqPushEntryFree(void* data) {
STqPushEntry* p = *(void**)data;
+ tDeleteSMqDataRsp(&p->dataRsp);
taosMemoryFree(p);
}
@@ -80,7 +82,6 @@ STQ* tqOpen(const char* path, SVnode* pVnode) {
pTq->pVnode = pVnode;
pTq->pHandle = taosHashInit(64, MurmurHash3_32, true, HASH_ENTRY_LOCK);
-
taosHashSetFreeFp(pTq->pHandle, destroySTqHandle);
taosInitRWLatch(&pTq->pushLock);
@@ -88,6 +89,7 @@ STQ* tqOpen(const char* path, SVnode* pVnode) {
taosHashSetFreeFp(pTq->pPushMgr, tqPushEntryFree);
pTq->pCheckInfo = taosHashInit(64, MurmurHash3_32, true, HASH_ENTRY_LOCK);
+ taosHashSetFreeFp(pTq->pCheckInfo, (FDelete)tDeleteSTqCheckInfo);
if (tqMetaOpen(pTq) < 0) {
ASSERT(0);
@@ -575,17 +577,17 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
return 0;
}
}
- taosWUnLockLatch(&pTq->pushLock);
#endif
+ taosWUnLockLatch(&pTq->pushLock);
if (tqSendDataRsp(pTq, pMsg, pReq, &dataRsp) < 0) {
code = -1;
}
- tqDebug("tmq poll: consumer %" PRId64 ", subkey %s, vg %d, send data blockNum:%d, offset type:%d, uid:%" PRId64
- ", version:%" PRId64 "",
+ tqDebug("tmq poll: consumer %" PRId64
+ ", subkey %s, vg %d, send data blockNum:%d, offset type:%d, uid/version:%" PRId64 ", ts:%" PRId64 "",
consumerId, pHandle->subKey, TD_VID(pTq->pVnode), dataRsp.blockNum, dataRsp.rspOffset.type,
- dataRsp.rspOffset.uid, dataRsp.rspOffset.version);
+ dataRsp.rspOffset.uid, dataRsp.rspOffset.ts);
tDeleteSMqDataRsp(&dataRsp);
return code;
@@ -669,7 +671,6 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
SSubmitReq* pCont = (SSubmitReq*)&pHead->body;
if (tqTaosxScanLog(pTq, pHandle, pCont, &taosxRsp) < 0) {
- /*ASSERT(0);*/
}
if (taosxRsp.blockNum > 0 /* threshold */) {
tqOffsetResetToLog(&taosxRsp.rspOffset, fetchVer);
@@ -779,6 +780,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
}
if (req.newConsumerId == -1) {
tqError("vgId:%d, tq invalid rebalance request, new consumerId %" PRId64 "", req.vgId, req.newConsumerId);
+ taosMemoryFree(req.qmsg);
return 0;
}
STqHandle tqHandle = {0};
@@ -815,8 +817,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
req.qmsg = NULL;
pHandle->execHandle.task =
- qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, &pHandle->execHandle.numOfCols,
- &pHandle->execHandle.pSchemaWrapper);
+ qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, &pHandle->execHandle.numOfCols, NULL);
ASSERT(pHandle->execHandle.task);
void* scanner = NULL;
qExtractStreamScanner(pHandle->execHandle.task, &scanner);
@@ -864,6 +865,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t version, char* msg, int32_t msgL
atomic_store_32(&pHandle->epoch, -1);
atomic_store_64(&pHandle->consumerId, req.newConsumerId);
atomic_add_fetch_32(&pHandle->epoch, 1);
+ taosMemoryFree(req.qmsg);
if (tqMetaSaveHandle(pTq, req.subKey, pHandle) < 0) {
// TODO
ASSERT(0);
@@ -879,6 +881,7 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver) {
ASSERT(taosArrayGetSize(pTask->childEpInfo) != 0);
}
+ pTask->refCnt = 1;
pTask->schedStatus = TASK_SCHED_STATUS__INACTIVE;
pTask->inputQueue = streamQueueOpen();
@@ -972,13 +975,15 @@ int32_t tqProcessStreamTaskCheckReq(STQ* pTq, SRpcMsg* pMsg) {
.upstreamNodeId = req.upstreamNodeId,
.upstreamTaskId = req.upstreamTaskId,
};
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
if (pTask && atomic_load_8(&pTask->taskStatus) == TASK_STATUS__NORMAL) {
rsp.status = 1;
} else {
rsp.status = 0;
}
+ if (pTask) streamMetaReleaseTask(pTq->pStreamMeta, pTask);
+
tqDebug("tq recv task check req(reqId: %" PRId64 ") %d at node %d check req from task %d at node %d, status %d",
rsp.reqId, rsp.downstreamTaskId, rsp.downstreamNodeId, rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.status);
@@ -1024,12 +1029,14 @@ int32_t tqProcessStreamTaskCheckRsp(STQ* pTq, int64_t version, char* msg, int32_
tqDebug("tq recv task check rsp(reqId: %" PRId64 ") %d at node %d check req from task %d at node %d, status %d",
rsp.reqId, rsp.downstreamTaskId, rsp.downstreamNodeId, rsp.upstreamTaskId, rsp.upstreamNodeId, rsp.status);
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, rsp.upstreamTaskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, rsp.upstreamTaskId);
if (pTask == NULL) {
return -1;
}
- return streamProcessTaskCheckRsp(pTask, &rsp, version);
+ code = streamProcessTaskCheckRsp(pTask, &rsp, version);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
+ return code;
}
int32_t tqProcessTaskDeployReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen) {
@@ -1074,15 +1081,17 @@ int32_t tqProcessTaskRecover1Req(STQ* pTq, SRpcMsg* pMsg) {
int32_t msgLen = pMsg->contLen;
SStreamRecoverStep1Req* pReq = (SStreamRecoverStep1Req*)msg;
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, pReq->taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, pReq->taskId);
if (pTask == NULL) {
return -1;
}
+ ASSERT(pReq->taskId == pTask->taskId);
// check param
int64_t fillVer1 = pTask->startVer;
if (fillVer1 <= 0) {
ASSERT(0);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
@@ -1093,10 +1102,11 @@ int32_t tqProcessTaskRecover1Req(STQ* pTq, SRpcMsg* pMsg) {
SStreamRecoverStep2Req req;
code = streamBuildSourceRecover2Req(pTask, &req);
if (code < 0) {
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
- ASSERT(pReq->taskId == pTask->taskId);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
// serialize msg
int32_t len = sizeof(SStreamRecoverStep1Req);
@@ -1124,7 +1134,7 @@ int32_t tqProcessTaskRecover1Req(STQ* pTq, SRpcMsg* pMsg) {
int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t version, char* msg, int32_t msgLen) {
int32_t code;
SStreamRecoverStep2Req* pReq = (SStreamRecoverStep2Req*)msg;
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, pReq->taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, pReq->taskId);
if (pTask == NULL) {
return -1;
}
@@ -1132,27 +1142,33 @@ int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t version, char* msg, int32_t m
// do recovery step 2
code = streamSourceRecoverScanStep2(pTask, version);
if (code < 0) {
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
// restore param
code = streamRestoreParam(pTask);
if (code < 0) {
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
// set status normal
code = streamSetStatusNormal(pTask);
if (code < 0) {
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
// dispatch recover finish req to all related downstream task
code = streamDispatchRecoverFinishReq(pTask);
if (code < 0) {
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
+
return 0;
}
@@ -1169,15 +1185,17 @@ int32_t tqProcessTaskRecoverFinishReq(STQ* pTq, SRpcMsg* pMsg) {
tDecoderClear(&decoder);
// find task
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, req.taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, req.taskId);
if (pTask == NULL) {
return -1;
}
// do process request
if (streamProcessRecoverFinishReq(pTask, req.childId) < 0) {
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return -1;
}
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return 0;
}
@@ -1351,9 +1369,10 @@ int32_t tqProcessSubmitReq(STQ* pTq, SSubmitReq* pReq, int64_t ver) {
int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) {
SStreamTaskRunReq* pReq = pMsg->pCont;
int32_t taskId = pReq->taskId;
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
if (pTask) {
streamProcessRunReq(pTask);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return 0;
} else {
return -1;
@@ -1370,13 +1389,14 @@ int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec) {
tDecodeStreamDispatchReq(&decoder, &req);
int32_t taskId = req.taskId;
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
if (pTask) {
SRpcMsg rsp = {
.info = pMsg->info,
.code = 0,
};
streamProcessDispatchReq(pTask, &req, &rsp, exec);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return 0;
} else {
return -1;
@@ -1386,10 +1406,11 @@ int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec) {
int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg) {
SStreamDispatchRsp* pRsp = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
int32_t taskId = ntohl(pRsp->upstreamTaskId);
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
tqDebug("recv dispatch rsp, code: %x", pMsg->code);
if (pTask) {
streamProcessDispatchRsp(pTask, pRsp, pMsg->code);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
return 0;
} else {
return -1;
@@ -1398,7 +1419,8 @@ int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg) {
int32_t tqProcessTaskDropReq(STQ* pTq, int64_t version, char* msg, int32_t msgLen) {
SVDropStreamTaskReq* pReq = (SVDropStreamTaskReq*)msg;
- return streamMetaRemoveTask(pTq->pStreamMeta, pReq->taskId);
+ streamMetaRemoveTask1(pTq->pStreamMeta, pReq->taskId);
+ return 0;
}
int32_t tqProcessTaskRetrieveReq(STQ* pTq, SRpcMsg* pMsg) {
@@ -1411,13 +1433,14 @@ int32_t tqProcessTaskRetrieveReq(STQ* pTq, SRpcMsg* pMsg) {
tDecodeStreamRetrieveReq(&decoder, &req);
tDecoderClear(&decoder);
int32_t taskId = req.dstTaskId;
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
if (pTask) {
SRpcMsg rsp = {
.info = pMsg->info,
.code = 0,
};
streamProcessRetrieveReq(pTask, &req, &rsp);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
tDeleteStreamRetrieveReq(&req);
return 0;
} else {
@@ -1449,13 +1472,14 @@ int32_t vnodeEnqueueStreamMsg(SVnode* pVnode, SRpcMsg* pMsg) {
int32_t taskId = req.taskId;
- SStreamTask* pTask = streamMetaGetTask(pTq->pStreamMeta, taskId);
+ SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
if (pTask) {
SRpcMsg rsp = {
.info = pMsg->info,
.code = 0,
};
streamProcessDispatchReq(pTask, &req, &rsp, false);
+ streamMetaReleaseTask(pTq->pStreamMeta, pTask);
rpcFreeCont(pMsg->pCont);
taosFreeQitem(pMsg);
return 0;
diff --git a/source/dnode/vnode/src/tq/tqExec.c b/source/dnode/vnode/src/tq/tqExec.c
index a6e8767a4d8347aafa3f6053e2c07f6439b399ea..3887f72740491701744b3fb9753e128e2d074428 100644
--- a/source/dnode/vnode/src/tq/tqExec.c
+++ b/source/dnode/vnode/src/tq/tqExec.c
@@ -27,9 +27,7 @@ int32_t tqAddBlockDataToRsp(const SSDataBlock* pBlock, SMqDataRsp* pRsp, int32_t
pRetrieve->completed = 1;
pRetrieve->numOfRows = htonl(pBlock->info.rows);
- // TODO enable compress
- int32_t actualLen = 0;
- blockEncode(pBlock, pRetrieve->data, &actualLen, numOfCols, false);
+ int32_t actualLen = blockEncode(pBlock, pRetrieve->data, numOfCols);
actualLen += sizeof(SRetrieveTableRsp);
ASSERT(actualLen <= dataStrLen);
taosArrayPush(pRsp->blockDataLen, &actualLen);
@@ -46,7 +44,7 @@ static int32_t tqAddBlockSchemaToRsp(const STqExecHandle* pExec, SMqDataRsp* pRs
return 0;
}
-static int32_t tqAddTbNameToRsp(const STQ* pTq, int64_t uid, SMqDataRsp* pRsp) {
+static int32_t tqAddTbNameToRsp(const STQ* pTq, int64_t uid, SMqDataRsp* pRsp, int32_t n) {
SMetaReader mr = {0};
metaReaderInit(&mr, pTq->pVnode->pMeta, 0);
// TODO add reference to gurantee success
@@ -54,8 +52,10 @@ static int32_t tqAddTbNameToRsp(const STQ* pTq, int64_t uid, SMqDataRsp* pRsp) {
metaReaderClear(&mr);
return -1;
}
- char* tbName = strdup(mr.me.name);
- taosArrayPush(pRsp->blockTbName, &tbName);
+ for (int32_t i = 0; i < n; i++) {
+ char* tbName = strdup(mr.me.name);
+ taosArrayPush(pRsp->blockTbName, &tbName);
+ }
metaReaderClear(&mr);
return 0;
}
@@ -113,7 +113,7 @@ int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffs
if (pRsp->withTbName) {
if (pRsp->rspOffset.type == TMQ_OFFSET__LOG) {
int64_t uid = pExec->pExecReader->msgIter.uid;
- tqAddTbNameToRsp(pTq, uid, pRsp);
+ tqAddTbNameToRsp(pTq, uid, pRsp, 1);
} else {
pRsp->withTbName = false;
}
@@ -157,7 +157,7 @@ int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMeta
int64_t uid = 0;
if (pOffset->type == TMQ_OFFSET__LOG) {
uid = pExec->pExecReader->msgIter.uid;
- if (tqAddTbNameToRsp(pTq, uid, (SMqDataRsp*)pRsp) < 0) {
+ if (tqAddTbNameToRsp(pTq, uid, (SMqDataRsp*)pRsp, 1) < 0) {
continue;
}
} else {
@@ -227,18 +227,30 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp
STqExecHandle* pExec = &pHandle->execHandle;
ASSERT(pExec->subType != TOPIC_SUB_TYPE__COLUMN);
+ SArray* pBlocks = taosArrayInit(0, sizeof(SSDataBlock));
+ SArray* pSchemas = taosArrayInit(0, sizeof(void*));
+
if (pExec->subType == TOPIC_SUB_TYPE__TABLE) {
STqReader* pReader = pExec->pExecReader;
tqReaderSetDataMsg(pReader, pReq, 0);
while (tqNextDataBlock(pReader)) {
- SSDataBlock block = {0};
- if (tqRetrieveDataBlock(&block, pReader) < 0) {
+ /*SSDataBlock block = {0};*/
+ /*if (tqRetrieveDataBlock(&block, pReader) < 0) {*/
+ /*if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;*/
+ /*}*/
+
+ taosArrayClear(pBlocks);
+ taosArrayClear(pSchemas);
+ if (tqRetrieveTaosxBlock(pReader, pBlocks, pSchemas) < 0) {
if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;
}
if (pRsp->withTbName) {
int64_t uid = pExec->pExecReader->msgIter.uid;
- if (tqAddTbNameToRsp(pTq, uid, (SMqDataRsp*)pRsp) < 0) {
- blockDataFreeRes(&block);
+ if (tqAddTbNameToRsp(pTq, uid, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlocks)) < 0) {
+ taosArrayDestroyEx(pBlocks, (FDelete)blockDataFreeRes);
+ taosArrayDestroyP(pSchemas, (FDelete)tDeleteSSchemaWrapper);
+ pBlocks = taosArrayInit(0, sizeof(SSDataBlock));
+ pSchemas = taosArrayInit(0, sizeof(void*));
continue;
}
}
@@ -257,25 +269,37 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp
pRsp->createTableNum++;
}
}
- tqAddBlockDataToRsp(&block, (SMqDataRsp*)pRsp, taosArrayGetSize(block.pDataBlock),
- pTq->pVnode->config.tsdbCfg.precision);
- blockDataFreeRes(&block);
- tqAddBlockSchemaToRsp(pExec, (SMqDataRsp*)pRsp);
- pRsp->blockNum++;
+ for (int32_t i = 0; i < taosArrayGetSize(pBlocks); i++) {
+ SSDataBlock* pBlock = taosArrayGet(pBlocks, i);
+ tqAddBlockDataToRsp(pBlock, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlock->pDataBlock),
+ pTq->pVnode->config.tsdbCfg.precision);
+ blockDataFreeRes(pBlock);
+ SSchemaWrapper* pSW = taosArrayGetP(pSchemas, i);
+ taosArrayPush(pRsp->blockSchema, &pSW);
+ pRsp->blockNum++;
+ }
}
} else if (pExec->subType == TOPIC_SUB_TYPE__DB) {
STqReader* pReader = pExec->pExecReader;
tqReaderSetDataMsg(pReader, pReq, 0);
while (tqNextDataBlockFilterOut(pReader, pExec->execDb.pFilterOutTbUid)) {
- SSDataBlock block = {0};
- if (tqRetrieveDataBlock(&block, pReader) < 0) {
+ /*SSDataBlock block = {0};*/
+ /*if (tqRetrieveDataBlock(&block, pReader) < 0) {*/
+ /*if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;*/
+ /*}*/
+ taosArrayClear(pBlocks);
+ taosArrayClear(pSchemas);
+ if (tqRetrieveTaosxBlock(pReader, pBlocks, pSchemas) < 0) {
if (terrno == TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND) continue;
}
if (pRsp->withTbName) {
int64_t uid = pExec->pExecReader->msgIter.uid;
- if (tqAddTbNameToRsp(pTq, uid, (SMqDataRsp*)pRsp) < 0) {
- blockDataFreeRes(&block);
- continue;
+ if (tqAddTbNameToRsp(pTq, uid, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlocks)) < 0) {
+ taosArrayDestroyEx(pBlocks, (FDelete)blockDataFreeRes);
+ taosArrayDestroyP(pSchemas, (FDelete)tDeleteSSchemaWrapper);
+ pBlocks = taosArrayInit(0, sizeof(SSDataBlock));
+ pSchemas = taosArrayInit(0, sizeof(void*));
+ return -1;
}
}
if (pHandle->fetchMeta) {
@@ -293,14 +317,26 @@ int32_t tqTaosxScanLog(STQ* pTq, STqHandle* pHandle, SSubmitReq* pReq, STaosxRsp
pRsp->createTableNum++;
}
}
- tqAddBlockDataToRsp(&block, (SMqDataRsp*)pRsp, taosArrayGetSize(block.pDataBlock),
- pTq->pVnode->config.tsdbCfg.precision);
- blockDataFreeRes(&block);
- tqAddBlockSchemaToRsp(pExec, (SMqDataRsp*)pRsp);
- pRsp->blockNum++;
+ /*tqAddBlockDataToRsp(&block, (SMqDataRsp*)pRsp, taosArrayGetSize(block.pDataBlock),*/
+ /*pTq->pVnode->config.tsdbCfg.precision);*/
+ /*blockDataFreeRes(&block);*/
+ /*tqAddBlockSchemaToRsp(pExec, (SMqDataRsp*)pRsp);*/
+ /*pRsp->blockNum++;*/
+ for (int32_t i = 0; i < taosArrayGetSize(pBlocks); i++) {
+ SSDataBlock* pBlock = taosArrayGet(pBlocks, i);
+ tqAddBlockDataToRsp(pBlock, (SMqDataRsp*)pRsp, taosArrayGetSize(pBlock->pDataBlock),
+ pTq->pVnode->config.tsdbCfg.precision);
+ blockDataFreeRes(pBlock);
+ SSchemaWrapper* pSW = taosArrayGetP(pSchemas, i);
+ taosArrayPush(pRsp->blockSchema, &pSW);
+ pRsp->blockNum++;
+ }
}
}
+ taosArrayDestroy(pBlocks);
+ taosArrayDestroy(pSchemas);
+
if (pRsp->blockNum == 0) {
return -1;
}
diff --git a/source/dnode/vnode/src/tq/tqMeta.c b/source/dnode/vnode/src/tq/tqMeta.c
index b852acb936450dcdeda2db1c22ea3a240b2f3105..a15d19fbe19ee20db9c178c4fa18e1a1c2fbc956 100644
--- a/source/dnode/vnode/src/tq/tqMeta.c
+++ b/source/dnode/vnode/src/tq/tqMeta.c
@@ -125,6 +125,10 @@ int32_t tqMetaSaveCheckInfo(STQ* pTq, const char* key, const void* value, int32_
return -1;
}
+ if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ return -1;
+ }
+
return 0;
}
@@ -147,6 +151,10 @@ int32_t tqMetaDeleteCheckInfo(STQ* pTq, const char* key) {
ASSERT(0);
}
+ if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ ASSERT(0);
+ }
+
return 0;
}
@@ -171,6 +179,7 @@ int32_t tqMetaRestoreCheckInfo(STQ* pTq) {
if (tDecodeSTqCheckInfo(&decoder, &info) < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
tdbFree(pKey);
+ tdbFree(pVal);
tdbTbcClose(pCur);
return -1;
}
@@ -178,11 +187,13 @@ int32_t tqMetaRestoreCheckInfo(STQ* pTq) {
if (taosHashPut(pTq->pCheckInfo, info.topic, strlen(info.topic), &info, sizeof(STqCheckInfo)) < 0) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
tdbFree(pKey);
+ tdbFree(pVal);
tdbTbcClose(pCur);
return -1;
}
}
tdbFree(pKey);
+ tdbFree(pVal);
tdbTbcClose(pCur);
return 0;
}
@@ -226,6 +237,10 @@ int32_t tqMetaSaveHandle(STQ* pTq, const char* key, const STqHandle* pHandle) {
ASSERT(0);
}
+ if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ ASSERT(0);
+ }
+
tEncoderClear(&encoder);
taosMemoryFree(buf);
return 0;
@@ -250,6 +265,10 @@ int32_t tqMetaDeleteHandle(STQ* pTq, const char* key) {
ASSERT(0);
}
+ if (tdbPostCommit(pTq->pMetaDB, &txn) < 0) {
+ ASSERT(0);
+ }
+
return 0;
}
@@ -289,8 +308,8 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
};
if (handle.execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
- handle.execHandle.task = qCreateQueueExecTaskInfo(
- handle.execHandle.execCol.qmsg, &reader, &handle.execHandle.numOfCols, &handle.execHandle.pSchemaWrapper);
+ handle.execHandle.task =
+ qCreateQueueExecTaskInfo(handle.execHandle.execCol.qmsg, &reader, &handle.execHandle.numOfCols, NULL);
ASSERT(handle.execHandle.task);
void* scanner = NULL;
qExtractStreamScanner(handle.execHandle.task, &scanner);
diff --git a/source/dnode/vnode/src/tq/tqOffset.c b/source/dnode/vnode/src/tq/tqOffset.c
index 952f81e1f46fdd5d6d3e537921a8c2f3790a6925..a7f816bb1be2dfec3f848d01081ad90a91106e3d 100644
--- a/source/dnode/vnode/src/tq/tqOffset.c
+++ b/source/dnode/vnode/src/tq/tqOffset.c
@@ -17,9 +17,9 @@
#include "tq.h"
struct STqOffsetStore {
- char* fname;
STQ* pTq;
SHashObj* pHash; // SHashObj
+ int8_t needCommit;
};
char* tqOffsetBuildFName(const char* path, int32_t fVer) {
@@ -74,6 +74,7 @@ STqOffsetStore* tqOffsetOpen(STQ* pTq) {
return NULL;
}
pStore->pTq = pTq;
+ pStore->needCommit = 0;
pTq->pOffsetStore = pStore;
pStore->pHash = taosHashInit(64, MurmurHash3_32, true, HASH_NO_LOCK);
@@ -100,6 +101,7 @@ STqOffset* tqOffsetRead(STqOffsetStore* pStore, const char* subscribeKey) {
}
int32_t tqOffsetWrite(STqOffsetStore* pStore, const STqOffset* pOffset) {
+ pStore->needCommit = 1;
return taosHashPut(pStore->pHash, pOffset->subKey, strlen(pOffset->subKey), pOffset, sizeof(STqOffset));
}
@@ -108,14 +110,23 @@ int32_t tqOffsetDelete(STqOffsetStore* pStore, const char* subscribeKey) {
}
int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
+ if (!pStore->needCommit) return 0;
// TODO file name should be with a newer version
char* fname = tqOffsetBuildFName(pStore->pTq->path, 0);
TdFilePtr pFile = taosOpenFile(fname, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_APPEND);
- taosMemoryFree(fname);
if (pFile == NULL) {
+ terrno = TAOS_SYSTEM_ERROR(errno);
+
+ int32_t err = terrno;
+ const char* errStr = tstrerror(err);
+ int32_t sysErr = errno;
+ const char* sysErrStr = strerror(errno);
+ tqError("vgId:%d, cannot open file %s when commit offset since %s", pStore->pTq->pVnode->config.vgId, fname,
+ sysErrStr);
ASSERT(0);
return -1;
}
+ taosMemoryFree(fname);
void* pIter = NULL;
while (1) {
pIter = taosHashIterate(pStore->pHash, pIter);
@@ -152,5 +163,6 @@ int32_t tqOffsetCommitFile(STqOffsetStore* pStore) {
}
// close and rename file
taosCloseFile(&pFile);
+ pStore->needCommit = 0;
return 0;
}
diff --git a/source/dnode/vnode/src/tq/tqRead.c b/source/dnode/vnode/src/tq/tqRead.c
index 48e69f8f4d303dca8071e497c3b48665400bdd9b..afb7ac39de8ff5e6582c96ef627371646571dfe4 100644
--- a/source/dnode/vnode/src/tq/tqRead.c
+++ b/source/dnode/vnode/src/tq/tqRead.c
@@ -398,6 +398,35 @@ bool tqNextDataBlock(STqReader* pReader) {
return false;
}
+int32_t tqMaskBlock(SSchemaWrapper* pDst, SSDataBlock* pBlock, const SSchemaWrapper* pSrc, char* mask) {
+ int32_t code;
+
+ int32_t cnt = 0;
+ for (int32_t i = 0; i < pSrc->nCols; i++) {
+ cnt += mask[i];
+ }
+
+ pDst->nCols = cnt;
+ pDst->pSchema = taosMemoryCalloc(cnt, sizeof(SSchema));
+ if (pDst->pSchema == NULL) {
+ return -1;
+ }
+
+ int32_t j = 0;
+ for (int32_t i = 0; i < pSrc->nCols; i++) {
+ if (mask[i]) {
+ pDst->pSchema[j++] = pSrc->pSchema[i];
+ SColumnInfoData colInfo =
+ createColumnInfoData(pSrc->pSchema[i].type, pSrc->pSchema[i].bytes, pSrc->pSchema[i].colId);
+ code = blockDataAppendColInfo(pBlock, &colInfo);
+ if (code != 0) {
+ return -1;
+ }
+ }
+ }
+ return 0;
+}
+
bool tqNextDataBlockFilterOut(STqReader* pHandle, SHashObj* filterOutUids) {
while (1) {
if (tGetSubmitMsgNext(&pHandle->msgIter, &pHandle->pBlock) < 0) {
@@ -425,6 +454,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, STqReader* pReader) {
tqWarn("cannot found tsschema for table: uid:%" PRId64 " (suid:%" PRId64 "), version %d, possibly dropped table",
pReader->msgIter.uid, pReader->msgIter.suid, pReader->cachedSchemaVer);
/*ASSERT(0);*/
+ pReader->cachedSchemaSuid = 0;
terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
return -1;
}
@@ -435,6 +465,7 @@ int32_t tqRetrieveDataBlock(SSDataBlock* pBlock, STqReader* pReader) {
tqWarn("cannot found schema wrapper for table: suid:%" PRId64 ", version %d, possibly dropped table",
pReader->msgIter.uid, pReader->cachedSchemaVer);
/*ASSERT(0);*/
+ pReader->cachedSchemaSuid = 0;
terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
return -1;
}
@@ -525,6 +556,141 @@ FAIL:
return -1;
}
+int32_t tqRetrieveTaosxBlock(STqReader* pReader, SArray* blocks, SArray* schemas) {
+ int32_t sversion = htonl(pReader->pBlock->sversion);
+
+ if (pReader->cachedSchemaSuid == 0 || pReader->cachedSchemaVer != sversion ||
+ pReader->cachedSchemaSuid != pReader->msgIter.suid) {
+ if (pReader->pSchema) taosMemoryFree(pReader->pSchema);
+ pReader->pSchema = metaGetTbTSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, 1);
+ if (pReader->pSchema == NULL) {
+ tqWarn("cannot found tsschema for table: uid:%" PRId64 " (suid:%" PRId64 "), version %d, possibly dropped table",
+ pReader->msgIter.uid, pReader->msgIter.suid, pReader->cachedSchemaVer);
+ /*ASSERT(0);*/
+ pReader->cachedSchemaSuid = 0;
+ terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
+ return -1;
+ }
+
+ if (pReader->pSchemaWrapper) tDeleteSSchemaWrapper(pReader->pSchemaWrapper);
+ pReader->pSchemaWrapper = metaGetTableSchema(pReader->pVnodeMeta, pReader->msgIter.uid, sversion, 1);
+ if (pReader->pSchemaWrapper == NULL) {
+ tqWarn("cannot found schema wrapper for table: suid:%" PRId64 ", version %d, possibly dropped table",
+ pReader->msgIter.uid, pReader->cachedSchemaVer);
+ /*ASSERT(0);*/
+ pReader->cachedSchemaSuid = 0;
+ terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
+ return -1;
+ }
+ pReader->cachedSchemaVer = sversion;
+ pReader->cachedSchemaSuid = pReader->msgIter.suid;
+ }
+
+ STSchema* pTschema = pReader->pSchema;
+ SSchemaWrapper* pSchemaWrapper = pReader->pSchemaWrapper;
+
+ int32_t colAtMost = pSchemaWrapper->nCols;
+
+ int32_t curRow = 0;
+ int32_t lastRow = 0;
+
+ char* assigned = taosMemoryCalloc(1, pSchemaWrapper->nCols);
+ if (assigned == NULL) return -1;
+
+ tInitSubmitBlkIter(&pReader->msgIter, pReader->pBlock, &pReader->blkIter);
+ STSRowIter iter = {0};
+ tdSTSRowIterInit(&iter, pTschema);
+ STSRow* row;
+
+ while ((row = tGetSubmitBlkNext(&pReader->blkIter)) != NULL) {
+ bool buildNew = false;
+ tdSTSRowIterReset(&iter, row);
+
+ tqDebug("vgId:%d, row of block %d", pReader->pWalReader->pWal->cfg.vgId, curRow);
+ for (int32_t i = 0; i < colAtMost; i++) {
+ SCellVal sVal = {0};
+ if (!tdSTSRowIterFetch(&iter, pSchemaWrapper->pSchema[i].colId, pSchemaWrapper->pSchema[i].type, &sVal)) {
+ break;
+ }
+ tqDebug("vgId:%d, %d col, type %d", pReader->pWalReader->pWal->cfg.vgId, i, sVal.valType);
+ if (curRow == 0) {
+ assigned[i] = sVal.valType != TD_VTYPE_NONE;
+ buildNew = true;
+ } else {
+ bool currentRowAssigned = sVal.valType != TD_VTYPE_NONE;
+ if (currentRowAssigned != assigned[i]) {
+ assigned[i] = currentRowAssigned;
+ buildNew = true;
+ }
+ }
+ }
+
+ if (buildNew) {
+ if (taosArrayGetSize(blocks) > 0) {
+ SSDataBlock* pLastBlock = taosArrayGetLast(blocks);
+ pLastBlock->info.rows = curRow - lastRow;
+ lastRow = curRow;
+ }
+ SSDataBlock* pBlock = createDataBlock();
+ SSchemaWrapper* pSW = taosMemoryCalloc(1, sizeof(SSchemaWrapper));
+ if (tqMaskBlock(pSW, pBlock, pSchemaWrapper, assigned) < 0) {
+ blockDataDestroy(pBlock);
+ goto FAIL;
+ }
+ SSDataBlock block = {0};
+ assignOneDataBlock(&block, pBlock);
+ blockDataDestroy(pBlock);
+
+ tqDebug("vgId:%d, build new block, col %d", pReader->pWalReader->pWal->cfg.vgId,
+ (int32_t)taosArrayGetSize(block.pDataBlock));
+
+ taosArrayPush(blocks, &block);
+ taosArrayPush(schemas, &pSW);
+ }
+
+ SSDataBlock* pBlock = taosArrayGetLast(blocks);
+ pBlock->info.uid = pReader->msgIter.uid;
+ pBlock->info.rows = 0;
+ pBlock->info.version = pReader->pMsg->version;
+
+ tqDebug("vgId:%d, taosx scan, block num: %d", pReader->pWalReader->pWal->cfg.vgId,
+ (int32_t)taosArrayGetSize(blocks));
+
+ if (blockDataEnsureCapacity(pBlock, pReader->msgIter.numOfRows - curRow) < 0) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ goto FAIL;
+ }
+
+ tdSTSRowIterReset(&iter, row);
+ for (int32_t i = 0; i < taosArrayGetSize(pBlock->pDataBlock); i++) {
+ SColumnInfoData* pColData = taosArrayGet(pBlock->pDataBlock, i);
+ SCellVal sVal = {0};
+
+ if (!tdSTSRowIterFetch(&iter, pColData->info.colId, pColData->info.type, &sVal)) {
+ break;
+ }
+
+ ASSERT(sVal.valType != TD_VTYPE_NONE);
+
+ if (colDataAppend(pColData, curRow, sVal.val, sVal.valType == TD_VTYPE_NULL) < 0) {
+ goto FAIL;
+ }
+ tqDebug("vgId:%d, row %d col %d append %d", pReader->pWalReader->pWal->cfg.vgId, curRow, i,
+ sVal.valType == TD_VTYPE_NULL);
+ }
+ curRow++;
+ }
+ SSDataBlock* pLastBlock = taosArrayGetLast(blocks);
+ pLastBlock->info.rows = curRow - lastRow;
+
+ taosMemoryFree(assigned);
+ return 0;
+
+FAIL:
+ taosMemoryFree(assigned);
+ return -1;
+}
+
void tqReaderSetColIdList(STqReader* pReader, SArray* pColIdList) { pReader->pColIdList = pColIdList; }
int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) {
diff --git a/source/dnode/vnode/src/tq/tqSink.c b/source/dnode/vnode/src/tq/tqSink.c
index 65e8d69994cada8f023b7a20a080cf271025f505..27bfea053444220fe51935a6966d562a5b8f1f9a 100644
--- a/source/dnode/vnode/src/tq/tqSink.c
+++ b/source/dnode/vnode/src/tq/tqSink.c
@@ -25,22 +25,31 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
SColumnInfoData* pGidCol = taosArrayGet(pDataBlock->pDataBlock, GROUPID_COLUMN_INDEX);
SColumnInfoData* pTbNameCol = taosArrayGet(pDataBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
+ tqDebug("stream delete msg: row %d", totRow);
+
for (int32_t row = 0; row < totRow; row++) {
int64_t ts = *(int64_t*)colDataGetData(pTsCol, row);
int64_t groupId = *(int64_t*)colDataGetData(pGidCol, row);
char* name;
- void* varTbName = colDataGetVarData(pTbNameCol, row);
+ void* varTbName = NULL;
+ if (!colDataIsNull(pTbNameCol, totRow, row, NULL)) {
+ varTbName = colDataGetVarData(pTbNameCol, row);
+ }
+
if (varTbName != NULL && varTbName != (void*)-1) {
name = taosMemoryCalloc(1, TSDB_TABLE_NAME_LEN);
memcpy(name, varDataVal(varTbName), varDataLen(varTbName));
} else {
name = buildCtbNameByGroupId(stbFullName, groupId);
}
- tqDebug("stream delete msg: groupId :%" PRId64 ", name: %s", groupId, name);
+ tqDebug("stream delete msg: vgId:%d, groupId :%" PRId64 ", name: %s, ts:%" PRId64, pVnode->config.vgId, groupId,
+ name, ts);
+#if 0
SMetaReader mr = {0};
metaReaderInit(&mr, pVnode->pMeta, 0);
if (metaGetTableEntryByName(&mr, name) < 0) {
metaReaderClear(&mr);
+ tqDebug("stream delete msg, skip vgId:%d since no table: %s", pVnode->config.vgId, name);
taosMemoryFree(name);
continue;
}
@@ -48,10 +57,13 @@ int32_t tqBuildDeleteReq(SVnode* pVnode, const char* stbFullName, const SSDataBl
int64_t uid = mr.me.uid;
metaReaderClear(&mr);
taosMemoryFree(name);
+#endif
SSingleDeleteReq req = {
.ts = ts,
- .uid = uid,
};
+ strncpy(req.tbname, name, TSDB_TABLE_NAME_LEN);
+ taosMemoryFree(name);
+ /*tqDebug("stream delete msg, active: vgId:%d, ts:%" PRId64 " name:%s", pVnode->config.vgId, ts, name);*/
taosArrayPush(deleteReq->deleteReqs, &req);
}
return 0;
@@ -236,7 +248,7 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
int32_t rows = pDataBlock->info.rows;
- tqDebug("tq sink, convert block %d, rows: %d", i, rows);
+ tqDebug("tq sink, convert block1 %d, rows: %d", i, rows);
int32_t dataLen = 0;
int32_t schemaLen = 0;
@@ -309,6 +321,10 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
deleteReq.deleteReqs = taosArrayInit(0, sizeof(SSingleDeleteReq));
deleteReq.suid = suid;
tqBuildDeleteReq(pVnode, stbFullName, pDataBlock, &deleteReq);
+ if (taosArrayGetSize(deleteReq.deleteReqs) == 0) {
+ taosArrayDestroy(deleteReq.deleteReqs);
+ continue;
+ }
int32_t len;
int32_t code;
@@ -333,7 +349,6 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
.contLen = len + sizeof(SMsgHead),
};
if (tmsgPutToQueue(&pVnode->msgCb, WRITE_QUEUE, &msg) != 0) {
- rpcFreeCont(serializedDeleteReq);
tqDebug("failed to put delete req into write-queue since %s", terrstr());
}
} else {
@@ -460,12 +475,12 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
cap += sizeof(SSubmitBlk) + schemaLen + rows * maxLen;
- SSubmitReq* ret = rpcMallocCont(cap);
- ret->header.vgId = pVnode->config.vgId;
- ret->length = sizeof(SSubmitReq);
- ret->numOfBlocks = htonl(1);
+ SSubmitReq* pSubmit = rpcMallocCont(cap);
+ pSubmit->header.vgId = pVnode->config.vgId;
+ pSubmit->length = sizeof(SSubmitReq);
+ pSubmit->numOfBlocks = htonl(1);
- SSubmitBlk* blkHead = POINTER_SHIFT(ret, sizeof(SSubmitReq));
+ SSubmitBlk* blkHead = POINTER_SHIFT(pSubmit, sizeof(SSubmitReq));
blkHead->numOfRows = htonl(pDataBlock->info.rows);
blkHead->sversion = htonl(pTSchema->version);
@@ -474,7 +489,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
blkHead->uid = 0;
blkHead->schemaLen = 0;
- tqDebug("tq sink, convert block %d, rows: %d", i, rows);
+ tqDebug("tq sink, convert block2 %d, rows: %d", i, rows);
int32_t dataLen = 0;
void* blkSchema = POINTER_SHIFT(blkHead, sizeof(SSubmitBlk));
@@ -502,6 +517,9 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NULL, NULL, false, pColumn->offset, k);
} else {
void* colData = colDataGetData(pColData, j);
+ if (k == 0) {
+ tqDebug("tq sink, row %d ts %" PRId64, j, *(int64_t*)colData);
+ }
tdAppendColValToRow(&rb, pColumn->colId, pColumn->type, TD_VTYPE_NORM, colData, true, pColumn->offset, k);
}
}
@@ -512,17 +530,16 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
}
blkHead->dataLen = htonl(dataLen);
- ret->length += sizeof(SSubmitBlk) + schemaLen + dataLen;
- ret->length = htonl(ret->length);
+ pSubmit->length += sizeof(SSubmitBlk) + schemaLen + dataLen;
+ pSubmit->length = htonl(pSubmit->length);
SRpcMsg msg = {
.msgType = TDMT_VND_SUBMIT,
- .pCont = ret,
- .contLen = ntohl(ret->length),
+ .pCont = pSubmit,
+ .contLen = ntohl(pSubmit->length),
};
if (tmsgPutToQueue(&pVnode->msgCb, WRITE_QUEUE, &msg) != 0) {
- rpcFreeCont(ret);
tqDebug("failed to put into write-queue since %s", terrstr());
}
}
diff --git a/source/dnode/vnode/src/tq/tqSnapshot.c b/source/dnode/vnode/src/tq/tqSnapshot.c
index c52e0e2c098478c0fc055306ad2eda9ced09dfea..b68763867efcf9a8e7c13ec43bfb827df75b5959 100644
--- a/source/dnode/vnode/src/tq/tqSnapshot.c
+++ b/source/dnode/vnode/src/tq/tqSnapshot.c
@@ -169,6 +169,8 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
} else {
code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
if (code) goto _err;
+ code = tdbPostCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
+ if (code) goto _err;
}
taosMemoryFree(pWriter);
diff --git a/source/dnode/vnode/src/tq/tqStreamStateSnap.c b/source/dnode/vnode/src/tq/tqStreamStateSnap.c
index 92e5f8df7adc3c2061a39979ad51f2e238a88097..08d5931bc3250895d2f2eea5b9c164e54ae4c127 100644
--- a/source/dnode/vnode/src/tq/tqStreamStateSnap.c
+++ b/source/dnode/vnode/src/tq/tqStreamStateSnap.c
@@ -169,6 +169,8 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
} else {
code = tdbCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
if (code) goto _err;
+ code = tdbPostCommit(pWriter->pTq->pMetaDB, &pWriter->txn);
+ if (code) goto _err;
}
taosMemoryFree(pWriter);
diff --git a/source/dnode/vnode/src/tq/tqStreamTaskSnap.c b/source/dnode/vnode/src/tq/tqStreamTaskSnap.c
index b4a7ce7737e5f599dac051f33e275918e7709c0d..31e44a5b6dcd170d801b3aa0481b6dd7ea851f0b 100644
--- a/source/dnode/vnode/src/tq/tqStreamTaskSnap.c
+++ b/source/dnode/vnode/src/tq/tqStreamTaskSnap.c
@@ -169,6 +169,8 @@ int32_t tqSnapWriterClose(STqSnapWriter** ppWriter, int8_t rollback) {
} else {
code = tdbCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
if (code) goto _err;
+ code = tdbPostCommit(pWriter->pTq->pMetaStore, &pWriter->txn);
+ if (code) goto _err;
}
taosMemoryFree(pWriter);
diff --git a/source/dnode/vnode/src/tsdb/tsdbCache.c b/source/dnode/vnode/src/tsdb/tsdbCache.c
index 76236e5078392229b109911904de0244d8bfff1c..291a5ab1eb42cf97d6380a81b5c617622c9cecfc 100644
--- a/source/dnode/vnode/src/tsdb/tsdbCache.c
+++ b/source/dnode/vnode/src/tsdb/tsdbCache.c
@@ -475,7 +475,7 @@ _err:
}
return code;
}
-
+/*
static int32_t getTableDelIdx(SDelFReader *pDelFReader, tb_uid_t suid, tb_uid_t uid, SDelIdx *pDelIdx) {
int32_t code = 0;
SArray *pDelIdxArray = NULL;
@@ -499,7 +499,7 @@ _err:
}
return code;
}
-
+*/
typedef enum {
SFSLASTNEXTROW_FS,
SFSLASTNEXTROW_FILESET,
@@ -997,8 +997,6 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
pIter->pSkyline = taosArrayInit(32, sizeof(TSDBKEY));
- SDelIdx delIdx;
-
SDelFile *pDelFile = pReadSnap->fs.pDelFile;
if (pDelFile) {
SDelFReader *pDelFReader;
@@ -1006,18 +1004,20 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
code = tsdbDelFReaderOpen(&pDelFReader, pDelFile, pTsdb);
if (code) goto _err;
- code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
- if (code) {
- tsdbDelFReaderClose(&pDelFReader);
- goto _err;
- }
+ SArray *pDelIdxArray = taosArrayInit(32, sizeof(SDelIdx));
+
+ code = tsdbReadDelIdx(pDelFReader, pDelIdxArray);
+ if (code) goto _err;
+
+ SDelIdx *delIdx = taosArraySearch(pDelIdxArray, &(SDelIdx){.suid = suid, .uid = uid}, tCmprDelIdx, TD_EQ);
- code = getTableDelSkyline(pMem, pIMem, pDelFReader, &delIdx, pIter->pSkyline);
+ code = getTableDelSkyline(pMem, pIMem, pDelFReader, delIdx, pIter->pSkyline);
if (code) {
tsdbDelFReaderClose(&pDelFReader);
goto _err;
}
+ taosArrayDestroy(pDelIdxArray);
tsdbDelFReaderClose(&pDelFReader);
} else {
code = getTableDelSkyline(pMem, pIMem, NULL, NULL, pIter->pSkyline);
diff --git a/source/dnode/vnode/src/tsdb/tsdbCommit.c b/source/dnode/vnode/src/tsdb/tsdbCommit.c
index 874fe3c958dd7e31d8c278494d382ef60f80a00c..65a46331aa8d4bd62f29f4e0c6c068ef4f95a6cd 100644
--- a/source/dnode/vnode/src/tsdb/tsdbCommit.c
+++ b/source/dnode/vnode/src/tsdb/tsdbCommit.c
@@ -495,6 +495,10 @@ static int32_t tsdbCommitFileDataStart(SCommitter *pCommitter) {
pCommitter->commitFid = tsdbKeyFid(pCommitter->nextKey, pCommitter->minutes, pCommitter->precision);
tsdbFidKeyRange(pCommitter->commitFid, pCommitter->minutes, pCommitter->precision, &pCommitter->minKey,
&pCommitter->maxKey);
+#if 0
+ ASSERT(pCommitter->minKey <= pCommitter->nextKey && pCommitter->maxKey >= pCommitter->nextKey);
+#endif
+
pCommitter->nextKey = TSKEY_MAX;
// Reader
diff --git a/source/dnode/vnode/src/tsdb/tsdbDiskData.c b/source/dnode/vnode/src/tsdb/tsdbDiskData.c
index 43be51a6946be11f057b9e8a0c052d1411321b58..9f59707ddc469a3aff34a0f8817393773a63de11 100644
--- a/source/dnode/vnode/src/tsdb/tsdbDiskData.c
+++ b/source/dnode/vnode/src/tsdb/tsdbDiskData.c
@@ -427,13 +427,13 @@ static int32_t (*tDiskColAddValImpl[8][3])(SDiskColBuilder *pBuilder, SColVal *p
{tDiskColAddVal60, tDiskColAddVal61, tDiskColAddVal62}, // HAS_VALUE|HAS_NULL
{tDiskColAddVal70, tDiskColAddVal71, tDiskColAddVal72} // HAS_VALUE|HAS_NULL|HAS_NONE
};
-extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet);
+// extern void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet);
static int32_t tDiskColAddVal(SDiskColBuilder *pBuilder, SColVal *pColVal) {
int32_t code = 0;
if (pBuilder->calcSma) {
if (COL_VAL_IS_VALUE(pColVal)) {
- tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet);
+ // tSmaUpdateImpl[pBuilder->type](&pBuilder->sma, pColVal, &pBuilder->minSet, &pBuilder->maxSet);
} else {
pBuilder->sma.numOfNull++;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbMemTable.c b/source/dnode/vnode/src/tsdb/tsdbMemTable.c
index 48b3e9ff7797b30a4b6b3e71c81683c5205e2d79..ddf29496077b63c36d69adf35da6438b90e058cc 100644
--- a/source/dnode/vnode/src/tsdb/tsdbMemTable.c
+++ b/source/dnode/vnode/src/tsdb/tsdbMemTable.c
@@ -18,10 +18,10 @@
#define MEM_MIN_HASH 1024
#define SL_MAX_LEVEL 5
-#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l)*2)
+// sizeof(SMemSkipListNode) + sizeof(SMemSkipListNode *) * (l) * 2
+#define SL_NODE_SIZE(l) (sizeof(SMemSkipListNode) + ((l) << 4))
#define SL_NODE_FORWARD(n, l) ((n)->forwards[l])
#define SL_NODE_BACKWARD(n, l) ((n)->forwards[(n)->level + (l)])
-#define SL_NODE_DATA(n) (&SL_NODE_BACKWARD(n, (n)->level))
#define SL_MOVE_BACKWARD 0x1
#define SL_MOVE_FROM_POS 0x2
@@ -117,12 +117,12 @@ int32_t tsdbInsertTableData(STsdb *pTsdb, int64_t version, SSubmitMsgIter *pMsgI
metaGetInfo(pTsdb->pVnode->pMeta, info.suid, &info);
}
if (pMsgIter->sversion != info.skmVer) {
- tsdbError("vgId:%d, req sver:%d, skmVer:%d suid:%" PRId64 " uid:%" PRId64,
- TD_VID(pTsdb->pVnode), pMsgIter->sversion, info.skmVer, suid, uid);
+ tsdbError("vgId:%d, req sver:%d, skmVer:%d suid:%" PRId64 " uid:%" PRId64, TD_VID(pTsdb->pVnode),
+ pMsgIter->sversion, info.skmVer, suid, uid);
code = TSDB_CODE_TDB_INVALID_TABLE_SCHEMA_VER;
goto _err;
}
-
+
pRsp->sver = info.skmVer;
// create/get STbData to op
@@ -198,14 +198,14 @@ int32_t tsdbDeleteTableData(STsdb *pTsdb, int64_t version, tb_uid_t suid, tb_uid
}
tsdbInfo("vgId:%d, delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64
- " since %s",
- TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
+ " at version %" PRId64 " since %s",
+ TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, version, tstrerror(code));
return code;
_err:
tsdbError("vgId:%d, failed to delete data from table suid:%" PRId64 " uid:%" PRId64 " skey:%" PRId64 " eKey:%" PRId64
- " since %s",
- TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, tstrerror(code));
+ " at version %" PRId64 " since %s",
+ TD_VID(pTsdb->pVnode), suid, uid, sKey, eKey, version, tstrerror(code));
return code;
}
@@ -263,30 +263,27 @@ void tsdbTbDataIterOpen(STbData *pTbData, TSDBKEY *pFrom, int8_t backward, STbDa
}
bool tsdbTbDataIterNext(STbDataIter *pIter) {
- SMemSkipListNode *pHead = pIter->pTbData->sl.pHead;
- SMemSkipListNode *pTail = pIter->pTbData->sl.pTail;
-
pIter->pRow = NULL;
if (pIter->backward) {
- ASSERT(pIter->pNode != pTail);
+ ASSERT(pIter->pNode != pIter->pTbData->sl.pTail);
- if (pIter->pNode == pHead) {
+ if (pIter->pNode == pIter->pTbData->sl.pHead) {
return false;
}
pIter->pNode = SL_NODE_BACKWARD(pIter->pNode, 0);
- if (pIter->pNode == pHead) {
+ if (pIter->pNode == pIter->pTbData->sl.pHead) {
return false;
}
} else {
- ASSERT(pIter->pNode != pHead);
+ ASSERT(pIter->pNode != pIter->pTbData->sl.pHead);
- if (pIter->pNode == pTail) {
+ if (pIter->pNode == pIter->pTbData->sl.pTail) {
return false;
}
pIter->pNode = SL_NODE_FORWARD(pIter->pNode, 0);
- if (pIter->pNode == pTail) {
+ if (pIter->pNode == pIter->pTbData->sl.pTail) {
return false;
}
}
@@ -294,31 +291,6 @@ bool tsdbTbDataIterNext(STbDataIter *pIter) {
return true;
}
-TSDBROW *tsdbTbDataIterGet(STbDataIter *pIter) {
- // we add here for commit usage
- if (pIter == NULL) return NULL;
-
- if (pIter->pRow) {
- goto _exit;
- }
-
- if (pIter->backward) {
- if (pIter->pNode == pIter->pTbData->sl.pHead) {
- goto _exit;
- }
- } else {
- if (pIter->pNode == pIter->pTbData->sl.pTail) {
- goto _exit;
- }
- }
-
- tGetTSDBRow((uint8_t *)SL_NODE_DATA(pIter->pNode), &pIter->row);
- pIter->pRow = &pIter->row;
-
-_exit:
- return pIter->pRow;
-}
-
static int32_t tsdbMemTableRehash(SMemTable *pMemTable) {
int32_t code = 0;
@@ -419,7 +391,7 @@ _err:
static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *pKey, int32_t flags) {
SMemSkipListNode *px;
SMemSkipListNode *pn;
- TSDBKEY *pTKey;
+ TSDBKEY tKey = {0};
int32_t backward = flags & SL_MOVE_BACKWARD;
int32_t fromPos = flags & SL_MOVE_FROM_POS;
@@ -438,9 +410,10 @@ static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *p
for (int8_t iLevel = pTbData->sl.level - 1; iLevel >= 0; iLevel--) {
pn = SL_NODE_BACKWARD(px, iLevel);
while (pn != pTbData->sl.pHead) {
- pTKey = (TSDBKEY *)SL_NODE_DATA(pn);
+ tKey.version = pn->version;
+ tKey.ts = pn->pTSRow->ts;
- int32_t c = tsdbKeyCmprFn(pTKey, pKey);
+ int32_t c = tsdbKeyCmprFn(&tKey, pKey);
if (c <= 0) {
break;
} else {
@@ -467,7 +440,10 @@ static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *p
for (int8_t iLevel = pTbData->sl.level - 1; iLevel >= 0; iLevel--) {
pn = SL_NODE_FORWARD(px, iLevel);
while (pn != pTbData->sl.pTail) {
- int32_t c = tsdbKeyCmprFn(SL_NODE_DATA(pn), pKey);
+ tKey.version = pn->version;
+ tKey.ts = pn->pTSRow->ts;
+
+ int32_t c = tsdbKeyCmprFn(&tKey, pKey);
if (c >= 0) {
break;
} else {
@@ -483,18 +459,17 @@ static void tbDataMovePosTo(STbData *pTbData, SMemSkipListNode **pos, TSDBKEY *p
}
static FORCE_INLINE int8_t tsdbMemSkipListRandLevel(SMemSkipList *pSl) {
- int8_t level = 1;
- int8_t tlevel = TMIN(pSl->maxLevel, pSl->level + 1);
- const uint32_t factor = 4;
+ int8_t level = 1;
+ int8_t tlevel = TMIN(pSl->maxLevel, pSl->level + 1);
- while ((taosRandR(&pSl->seed) % factor) == 0 && level < tlevel) {
+ while ((taosRandR(&pSl->seed) & 0x3) == 0 && level < tlevel) {
level++;
}
return level;
}
-static int32_t tbDataDoPut(SMemTable *pMemTable, STbData *pTbData, SMemSkipListNode **pos, TSDBROW *pRow,
- int8_t forward) {
+static int32_t tbDataDoPut(SMemTable *pMemTable, STbData *pTbData, SMemSkipListNode **pos, int64_t version,
+ STSRow *pRow, int8_t forward) {
int32_t code = 0;
int8_t level;
SMemSkipListNode *pNode;
@@ -503,13 +478,19 @@ static int32_t tbDataDoPut(SMemTable *pMemTable, STbData *pTbData, SMemSkipListN
// node
level = tsdbMemSkipListRandLevel(&pTbData->sl);
ASSERT(pPool != NULL);
- pNode = (SMemSkipListNode *)vnodeBufPoolMalloc(pPool, SL_NODE_SIZE(level) + tPutTSDBRow(NULL, pRow));
+ pNode = (SMemSkipListNode *)vnodeBufPoolMalloc(pPool, SL_NODE_SIZE(level));
if (pNode == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
pNode->level = level;
- tPutTSDBRow((uint8_t *)SL_NODE_DATA(pNode), pRow);
+ pNode->version = version;
+ pNode->pTSRow = vnodeBufPoolMalloc(pPool, pRow->len);
+ if (NULL == pNode->pTSRow) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
+ }
+ memcpy(pNode->pTSRow, pRow, pRow->len);
for (int8_t iLevel = level - 1; iLevel >= 0; iLevel--) {
SMemSkipListNode *pn = pos[iLevel];
@@ -575,7 +556,7 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i
key.ts = row.pTSRow->ts;
nRow++;
tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD);
- code = tbDataDoPut(pMemTable, pTbData, pos, &row, 0);
+ code = tbDataDoPut(pMemTable, pTbData, pos, version, row.pTSRow, 0);
if (code) {
goto _err;
}
@@ -593,8 +574,10 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i
do {
key.ts = row.pTSRow->ts;
nRow++;
- tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS);
- code = tbDataDoPut(pMemTable, pTbData, pos, &row, 1);
+ if (SL_NODE_FORWARD(pos[0], 0) != pTbData->sl.pTail) {
+ tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_FROM_POS);
+ }
+ code = tbDataDoPut(pMemTable, pTbData, pos, version, row.pTSRow, 1);
if (code) {
goto _err;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbOpen.c b/source/dnode/vnode/src/tsdb/tsdbOpen.c
index bb20a9b0121e6ca1d99cf996fed1d1c7bc3c0245..f71b5b6706ccb152f4dc221d01f4a1ea6e207c7a 100644
--- a/source/dnode/vnode/src/tsdb/tsdbOpen.c
+++ b/source/dnode/vnode/src/tsdb/tsdbOpen.c
@@ -49,7 +49,7 @@ int tsdbOpen(SVnode *pVnode, STsdb **ppTsdb, const char *dir, STsdbKeepCfg *pKee
pTsdb->path = (char *)&pTsdb[1];
snprintf(pTsdb->path, TD_PATH_MAX, "%s%s%s", pVnode->path, TD_DIRSEP, dir);
- taosRealPath(pTsdb->path, NULL, slen);
+ // taosRealPath(pTsdb->path, NULL, slen);
pTsdb->pVnode = pVnode;
taosThreadRwlockInit(&pTsdb->rwLock, NULL);
if (!pKeepCfg) {
diff --git a/source/dnode/vnode/src/tsdb/tsdbRead.c b/source/dnode/vnode/src/tsdb/tsdbRead.c
index bfde5b30765b06b61ddba0c05f07a0143c8a53db..ca3db1e5d8f368c279b70326e88fb4a4d357948e 100644
--- a/source/dnode/vnode/src/tsdb/tsdbRead.c
+++ b/source/dnode/vnode/src/tsdb/tsdbRead.c
@@ -88,6 +88,7 @@ typedef struct SBlockLoadSuppInfo {
int16_t* colIds; // column ids for loading file block data
int32_t numOfCols;
char** buildBuf; // build string tmp buffer, todo remove it later after all string format being updated.
+ bool smaValid; // the sma on all queried columns are activated
} SBlockLoadSuppInfo;
typedef struct SLastBlockReader {
@@ -135,22 +136,22 @@ typedef struct SUidOrderCheckInfo {
} SUidOrderCheckInfo;
typedef struct SReaderStatus {
- bool loadFromFile; // check file stage
- bool composedDataBlock; // the returned data block is a composed block or not
- SHashObj* pTableMap; // SHash
+ bool loadFromFile; // check file stage
+ bool composedDataBlock; // the returned data block is a composed block or not
+ SHashObj* pTableMap; // SHash
STableBlockScanInfo** pTableIter; // table iterator used in building in-memory buffer data blocks.
- SUidOrderCheckInfo uidCheckInfo; // check all table in uid order
- SFileBlockDumpInfo fBlockDumpInfo;
- SDFileSet* pCurrentFileset; // current opened file set
- SBlockData fileBlockData;
- SFilesetIter fileIter;
- SDataBlockIter blockIter;
+ SUidOrderCheckInfo uidCheckInfo; // check all table in uid order
+ SFileBlockDumpInfo fBlockDumpInfo;
+ SDFileSet* pCurrentFileset; // current opened file set
+ SBlockData fileBlockData;
+ SFilesetIter fileIter;
+ SDataBlockIter blockIter;
} SReaderStatus;
typedef struct SBlockInfoBuf {
- int32_t currentIndex;
- SArray* pData;
- int32_t numPerBucket;
+ int32_t currentIndex;
+ SArray* pData;
+ int32_t numPerBucket;
} SBlockInfoBuf;
struct STsdbReader {
@@ -185,11 +186,13 @@ static int32_t doMergeRowsInLastBlock(SLastBlockReader* pLastBlockReader, STabl
SRowMerger* pMerger, SVersionRange* pVerRange);
static int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, int64_t ts, SArray* pDelList, SRowMerger* pMerger,
STsdbReader* pReader);
-static int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow, STableBlockScanInfo* pInfo);
+static int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow,
+ STableBlockScanInfo* pInfo);
static int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, SBlockData* pBlockData,
int32_t rowIndex);
static void setComposedBlockFlag(STsdbReader* pReader, bool composed);
-static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order, SVersionRange* pVerRange);
+static bool hasBeenDropped(const SArray* pDelList, int32_t* index, TSDBKEY* pKey, int32_t order,
+ SVersionRange* pVerRange);
static int32_t doMergeMemTableMultiRows(TSDBROW* pRow, uint64_t uid, SIterInfo* pIter, SArray* pDelList,
STSRow** pTSRow, STsdbReader* pReader, bool* freeTSRow);
@@ -211,11 +214,10 @@ static bool hasDataInFileBlock(const SBlockData* pBlockData, const SFil
static bool outOfTimeWindow(int64_t ts, STimeWindow* pWindow) { return (ts > pWindow->ekey) || (ts < pWindow->skey); }
-static int32_t setColumnIdSlotList(STsdbReader* pReader, SSDataBlock* pBlock) {
- SBlockLoadSuppInfo* pSupInfo = &pReader->suppInfo;
-
+static int32_t setColumnIdSlotList(SBlockLoadSuppInfo* pSupInfo, SSDataBlock* pBlock) {
size_t numOfCols = blockDataGetNumOfCols(pBlock);
+ pSupInfo->smaValid = true;
pSupInfo->numOfCols = numOfCols;
pSupInfo->colIds = taosMemoryMalloc(numOfCols * sizeof(int16_t));
pSupInfo->buildBuf = taosMemoryCalloc(numOfCols, POINTER_BYTES);
@@ -237,14 +239,36 @@ static int32_t setColumnIdSlotList(STsdbReader* pReader, SSDataBlock* pBlock) {
return TSDB_CODE_SUCCESS;
}
+static void updateBlockSMAInfo(STSchema* pSchema, SBlockLoadSuppInfo* pSupInfo) {
+ int32_t i = 0, j = 0;
+
+ while(i < pSchema->numOfCols && j < pSupInfo->numOfCols) {
+ STColumn* pTCol = &pSchema->columns[i];
+ if (pTCol->colId == pSupInfo->colIds[j]) {
+ if (!IS_BSMA_ON(pTCol)) {
+ pSupInfo->smaValid = false;
+ return;
+ }
+
+ i += 1;
+ j += 1;
+ } else if (pTCol->colId < pSupInfo->colIds[j]) {
+ // do nothing
+ i += 1;
+ } else {
+ ASSERT(0);
+ }
+ }
+}
+
static int32_t initBlockScanInfoBuf(SBlockInfoBuf* pBuf, int32_t numOfTables) {
- int32_t num = numOfTables / pBuf->numPerBucket;
+ int32_t num = numOfTables / pBuf->numPerBucket;
int32_t remainder = numOfTables % pBuf->numPerBucket;
if (pBuf->pData == NULL) {
pBuf->pData = taosArrayInit(num + 1, POINTER_BYTES);
}
- for(int32_t i = 0; i < num; ++i) {
+ for (int32_t i = 0; i < num; ++i) {
char* p = taosMemoryCalloc(pBuf->numPerBucket, sizeof(STableBlockScanInfo));
if (p == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
@@ -266,7 +290,7 @@ static int32_t initBlockScanInfoBuf(SBlockInfoBuf* pBuf, int32_t numOfTables) {
static void clearBlockScanInfoBuf(SBlockInfoBuf* pBuf) {
size_t num = taosArrayGetSize(pBuf->pData);
- for(int32_t i = 0; i < num; ++i) {
+ for (int32_t i = 0; i < num; ++i) {
char** p = taosArrayGet(pBuf->pData, i);
taosMemoryFree(*p);
}
@@ -276,7 +300,7 @@ static void clearBlockScanInfoBuf(SBlockInfoBuf* pBuf) {
static void* getPosInBlockInfoBuf(SBlockInfoBuf* pBuf, int32_t index) {
int32_t bucketIndex = index / pBuf->numPerBucket;
- char** pBucket = taosArrayGet(pBuf->pData, bucketIndex);
+ char** pBucket = taosArrayGet(pBuf->pData, bucketIndex);
return (*pBucket) + (index % pBuf->numPerBucket) * sizeof(STableBlockScanInfo);
}
@@ -305,22 +329,8 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK
}
taosHashPut(pTableMap, &pScanInfo->uid, sizeof(uint64_t), &pScanInfo, POINTER_BYTES);
-
-#if 0
-// STableBlockScanInfo info = {.lastKey = 0, .uid = idList[j].uid};
- if (ASCENDING_TRAVERSE(pTsdbReader->order)) {
- int64_t skey = pTsdbReader->window.skey;
- info.lastKey = (skey > INT64_MIN) ? (skey - 1) : skey;
- } else {
- int64_t ekey = pTsdbReader->window.ekey;
- info.lastKey = (ekey < INT64_MAX) ? (ekey + 1) : ekey;
- }
-
- taosHashPut(pTableMap, &info.uid, sizeof(uint64_t), &info, sizeof(info));
-#endif
-
- tsdbTrace("%p check table uid:%" PRId64 " from lastKey:%" PRId64 " %s", pTsdbReader, pScanInfo->uid, pScanInfo->lastKey,
- pTsdbReader->idStr);
+ tsdbTrace("%p check table uid:%" PRId64 " from lastKey:%" PRId64 " %s", pTsdbReader, pScanInfo->uid,
+ pScanInfo->lastKey, pTsdbReader->idStr);
}
pTsdbReader->cost.createScanInfoList = (taosGetTimestampUs() - st) / 1000.0;
@@ -334,14 +344,20 @@ static SHashObj* createDataBlockScanInfo(STsdbReader* pTsdbReader, const STableK
static void resetAllDataBlockScanInfo(SHashObj* pTableMap, int64_t ts) {
STableBlockScanInfo** p = NULL;
while ((p = taosHashIterate(pTableMap, p)) != NULL) {
- STableBlockScanInfo* pInfo = *(STableBlockScanInfo**) p;
+ STableBlockScanInfo* pInfo = *(STableBlockScanInfo**)p;
pInfo->iterInit = false;
+ pInfo->iter.hasVal = false;
pInfo->iiter.hasVal = false;
+
if (pInfo->iter.iter != NULL) {
pInfo->iter.iter = tsdbTbDataIterDestroy(pInfo->iter.iter);
}
+ if (pInfo->iiter.iter != NULL) {
+ pInfo->iiter.iter = tsdbTbDataIterDestroy(pInfo->iiter.iter);
+ }
+
pInfo->delSkyline = taosArrayDestroy(pInfo->delSkyline);
pInfo->lastKey = ts;
}
@@ -349,6 +365,8 @@ static void resetAllDataBlockScanInfo(SHashObj* pTableMap, int64_t ts) {
static void clearBlockScanInfo(STableBlockScanInfo* p) {
p->iterInit = false;
+
+ p->iter.hasVal = false;
p->iiter.hasVal = false;
if (p->iter.iter != NULL) {
@@ -571,14 +589,14 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
pReader->verRange = getQueryVerRange(pVnode, pCond, level);
pReader->type = pCond->type;
pReader->window = updateQueryTimeWindow(pReader->pTsdb, &pCond->twindows);
- pReader->blockInfoBuf.numPerBucket = 1000; // 1000 tables per bucket
+ pReader->blockInfoBuf.numPerBucket = 1000; // 1000 tables per bucket
ASSERT(pCond->numOfCols > 0);
limitOutputBufferSize(pCond, &pReader->capacity);
// allocate buffer in order to load data blocks from file
SBlockLoadSuppInfo* pSup = &pReader->suppInfo;
- pSup->pColAgg = taosArrayInit(4, sizeof(SColumnDataAgg));
+ pSup->pColAgg = taosArrayInit(pCond->numOfCols, sizeof(SColumnDataAgg));
pSup->plist = taosMemoryCalloc(pCond->numOfCols, POINTER_BYTES);
if (pSup->pColAgg == NULL || pSup->plist == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
@@ -599,7 +617,7 @@ static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsd
goto _end;
}
- setColumnIdSlotList(pReader, pReader->pResBlock);
+ setColumnIdSlotList(&pReader->suppInfo, pReader->pResBlock);
*ppReader = pReader;
return code;
@@ -708,7 +726,7 @@ static int32_t doLoadFileBlock(STsdbReader* pReader, SArray* pIndexList, SBlockN
}
SBlockIndex bIndex = {.ordinalIndex = j, .inFileOffset = block.aSubBlock->offset};
- bIndex.window = (STimeWindow) {.skey = block.minKey.ts, .ekey = block.maxKey.ts};
+ bIndex.window = (STimeWindow){.skey = block.minKey.ts, .ekey = block.maxKey.ts};
void* p = taosArrayPush(pScanInfo->pBlockList, &bIndex);
if (p == NULL) {
@@ -891,7 +909,7 @@ static int doBinarySearchKey(TSKEY* keyList, int num, int pos, TSKEY key, int or
}
}
-int32_t getEndPosInDataBlock(STsdbReader* pReader, SBlockData* pBlockData, SDataBlk* pBlock, int32_t pos) {
+static int32_t getEndPosInDataBlock(STsdbReader* pReader, SBlockData* pBlockData, SDataBlk* pBlock, int32_t pos) {
// NOTE: reverse the order to find the end position in data block
int32_t endPos = -1;
bool asc = ASCENDING_TRAVERSE(pReader->order);
@@ -908,6 +926,117 @@ int32_t getEndPosInDataBlock(STsdbReader* pReader, SBlockData* pBlockData, SData
return endPos;
}
+static void copyPrimaryTsCol(const SBlockData* pBlockData, SFileBlockDumpInfo* pDumpInfo, SColumnInfoData* pColData,
+ int32_t dumpedRows, bool asc) {
+ if (asc) {
+ memcpy(pColData->pData, &pBlockData->aTSKEY[pDumpInfo->rowIndex], dumpedRows * sizeof(int64_t));
+ } else {
+ int32_t startIndex = pDumpInfo->rowIndex - dumpedRows + 1;
+ memcpy(pColData->pData, &pBlockData->aTSKEY[startIndex], dumpedRows * sizeof(int64_t));
+
+ // todo: opt perf by extract the loop
+ // reverse the array list
+ int32_t mid = dumpedRows >> 1u;
+ int64_t* pts = (int64_t*)pColData->pData;
+ for (int32_t j = 0; j < mid; ++j) {
+ int64_t t = pts[j];
+ pts[j] = pts[dumpedRows - j - 1];
+ pts[dumpedRows - j - 1] = t;
+ }
+ }
+}
+
+// a faster version of copy procedure.
+static void copyNumericCols(const SColData* pData, SFileBlockDumpInfo* pDumpInfo, SColumnInfoData* pColData,
+ int32_t dumpedRows, bool asc) {
+ uint8_t* p = NULL;
+ if (asc) {
+ p = pData->pData + tDataTypes[pData->type].bytes * pDumpInfo->rowIndex;
+ } else {
+ int32_t startIndex = pDumpInfo->rowIndex - dumpedRows + 1;
+ p = pData->pData + tDataTypes[pData->type].bytes * startIndex;
+ }
+
+ int32_t step = asc? 1:-1;
+
+ // make sure it is aligned to 8bit
+ ASSERT((((uint64_t)pColData->pData) & (0x8 - 1)) == 0);
+
+ // 1. copy data in a batch model
+ memcpy(pColData->pData, p, dumpedRows * tDataTypes[pData->type].bytes);
+
+ // 2. reverse the array list in case of descending order scan data block
+ if (!asc) {
+ switch(pColData->info.type) {
+ case TSDB_DATA_TYPE_TIMESTAMP:
+ case TSDB_DATA_TYPE_DOUBLE:
+ case TSDB_DATA_TYPE_BIGINT:
+ case TSDB_DATA_TYPE_UBIGINT:
+ {
+ int32_t mid = dumpedRows >> 1u;
+ int64_t* pts = (int64_t*)pColData->pData;
+ for (int32_t j = 0; j < mid; ++j) {
+ int64_t t = pts[j];
+ pts[j] = pts[dumpedRows - j - 1];
+ pts[dumpedRows - j - 1] = t;
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_BOOL:
+ case TSDB_DATA_TYPE_TINYINT:
+ case TSDB_DATA_TYPE_UTINYINT: {
+ int32_t mid = dumpedRows >> 1u;
+ int8_t* pts = (int8_t*)pColData->pData;
+ for (int32_t j = 0; j < mid; ++j) {
+ int8_t t = pts[j];
+ pts[j] = pts[dumpedRows - j - 1];
+ pts[dumpedRows - j - 1] = t;
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_SMALLINT:
+ case TSDB_DATA_TYPE_USMALLINT: {
+ int32_t mid = dumpedRows >> 1u;
+ int16_t* pts = (int16_t*)pColData->pData;
+ for (int32_t j = 0; j < mid; ++j) {
+ int64_t t = pts[j];
+ pts[j] = pts[dumpedRows - j - 1];
+ pts[dumpedRows - j - 1] = t;
+ }
+ break;
+ }
+
+ case TSDB_DATA_TYPE_FLOAT:
+ case TSDB_DATA_TYPE_INT:
+ case TSDB_DATA_TYPE_UINT: {
+ int32_t mid = dumpedRows >> 1u;
+ int32_t* pts = (int32_t*)pColData->pData;
+ for (int32_t j = 0; j < mid; ++j) {
+ int32_t t = pts[j];
+ pts[j] = pts[dumpedRows - j - 1];
+ pts[dumpedRows - j - 1] = t;
+ }
+ break;
+ }
+ }
+ }
+
+ // 3. if the null value exists, check items one-by-one
+ if (pData->flag != HAS_VALUE) {
+ int32_t rowIndex = 0;
+
+ for (int32_t j = pDumpInfo->rowIndex; rowIndex < dumpedRows; j += step, rowIndex++) {
+ uint8_t v = tColDataGetBitValue(pData, j);
+ if (v == 0 || v == 1) {
+ colDataSetNull_f(pColData->nullbitmap, rowIndex);
+ pColData->hasNull = true;
+ }
+ }
+ }
+}
+
static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanInfo* pBlockScanInfo) {
SReaderStatus* pStatus = &pReader->status;
SDataBlockIter* pBlockIter = &pStatus->blockIter;
@@ -947,29 +1076,22 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
}
endIndex += step;
- int32_t remain = asc ? (endIndex - pDumpInfo->rowIndex) : (pDumpInfo->rowIndex - endIndex);
- if (remain > pReader->capacity) { // output buffer check
- remain = pReader->capacity;
+ int32_t dumpedRows = asc ? (endIndex - pDumpInfo->rowIndex) : (pDumpInfo->rowIndex - endIndex);
+ if (dumpedRows > pReader->capacity) { // output buffer check
+ dumpedRows = pReader->capacity;
}
+ int32_t i = 0;
int32_t rowIndex = 0;
- int32_t i = 0;
SColumnInfoData* pColData = taosArrayGet(pResBlock->pDataBlock, i);
if (pColData->info.colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
- if (asc) {
- memcpy(pColData->pData, &pBlockData->aTSKEY[pDumpInfo->rowIndex], remain * sizeof(int64_t));
- } else {
- for (int32_t j = pDumpInfo->rowIndex; rowIndex < remain; j += step) {
- colDataAppendInt64(pColData, rowIndex++, &pBlockData->aTSKEY[j]);
- }
- }
-
+ copyPrimaryTsCol(pBlockData, pDumpInfo, pColData, dumpedRows, asc);
i += 1;
}
int32_t colIndex = 0;
- int32_t num = taosArrayGetSize(pBlockData->aIdx);
+ int32_t num = pBlockData->nColData;
while (i < numOfOutputCols && colIndex < num) {
rowIndex = 0;
pColData = taosArrayGet(pResBlock->pDataBlock, i);
@@ -979,23 +1101,12 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
colIndex += 1;
} else if (pData->cid == pColData->info.colId) {
if (pData->flag == HAS_NONE || pData->flag == HAS_NULL || pData->flag == (HAS_NULL | HAS_NONE)) {
- colDataAppendNNULL(pColData, 0, remain);
+ colDataAppendNNULL(pColData, 0, dumpedRows);
} else {
- if (IS_NUMERIC_TYPE(pColData->info.type) && asc) {
- uint8_t* p = pData->pData + tDataTypes[pData->type].bytes * pDumpInfo->rowIndex;
- memcpy(pColData->pData, p, remain * tDataTypes[pData->type].bytes);
-
- // null value exists, check one-by-one
- if (pData->flag != HAS_VALUE) {
- for (int32_t j = pDumpInfo->rowIndex; rowIndex < remain; j += step, rowIndex++) {
- uint8_t v = tColDataGetBitValue(pData, j);
- if (v == 0 || v == 1) {
- colDataSetNull_f(pColData->nullbitmap, rowIndex);
- }
- }
- }
- } else {
- for (int32_t j = pDumpInfo->rowIndex; rowIndex < remain; j += step) {
+ if (IS_MATHABLE_TYPE(pColData->info.type)) {
+ copyNumericCols(pData, pDumpInfo, pColData, dumpedRows, asc);
+ } else { // varchar/nchar type
+ for (int32_t j = pDumpInfo->rowIndex; rowIndex < dumpedRows; j += step) {
tColDataGetValue(pData, j, &cv);
doCopyColVal(pColData, rowIndex++, i, &cv, pSupInfo);
}
@@ -1005,7 +1116,7 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
colIndex += 1;
i += 1;
} else { // the specified column does not exist in file block, fill with null data
- colDataAppendNNULL(pColData, 0, remain);
+ colDataAppendNNULL(pColData, 0, dumpedRows);
i += 1;
}
}
@@ -1013,12 +1124,12 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
// fill the mis-matched columns with null value
while (i < numOfOutputCols) {
pColData = taosArrayGet(pResBlock->pDataBlock, i);
- colDataAppendNNULL(pColData, 0, remain);
+ colDataAppendNNULL(pColData, 0, dumpedRows);
i += 1;
}
- pResBlock->info.rows = remain;
- pDumpInfo->rowIndex += step * remain;
+ pResBlock->info.rows = dumpedRows;
+ pDumpInfo->rowIndex += step * dumpedRows;
// check if current block are all handled
if (pDumpInfo->rowIndex >= 0 && pDumpInfo->rowIndex < pBlock->nRow) {
@@ -1036,8 +1147,8 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader, STableBlockScanIn
int32_t unDumpedRows = asc ? pBlock->nRow - pDumpInfo->rowIndex : pDumpInfo->rowIndex + 1;
tsdbDebug("%p copy file block to sdatablock, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64
- ", rows:%d, remain:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
- pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, remain,
+ ", rows:%d, remain:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
+ pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, dumpedRows,
unDumpedRows, pBlock->minVer, pBlock->maxVer, elapsedTime, pReader->idStr);
return TSDB_CODE_SUCCESS;
@@ -1063,7 +1174,7 @@ static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockI
code = tsdbReadDataBlock(pReader->pFileReader, pBlock, pBlockData);
if (code != TSDB_CODE_SUCCESS) {
tsdbError("%p error occurs in loading file block, global index:%d, table index:%d, brange:%" PRId64 "-%" PRId64
- ", rows:%d, code:%s %s",
+ ", rows:%d, code:%s %s",
pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, pBlock->nRow,
tstrerror(code), pReader->idStr);
return code;
@@ -1072,7 +1183,7 @@ static int32_t doLoadFileBlockData(STsdbReader* pReader, SDataBlockIter* pBlockI
double elapsedTime = (taosGetTimestampUs() - st) / 1000.0;
tsdbDebug("%p load file block into buffer, global index:%d, index in table block list:%d, brange:%" PRId64 "-%" PRId64
- ", rows:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
+ ", rows:%d, minVer:%" PRId64 ", maxVer:%" PRId64 ", elapsed time:%.2f ms, %s",
pReader, pBlockIter->index, pBlockInfo->tbBlockIdx, pBlock->minKey.ts, pBlock->maxKey.ts, pBlock->nRow,
pBlock->minVer, pBlock->maxVer, elapsedTime, pReader->idStr);
@@ -1300,8 +1411,8 @@ static bool getNeighborBlockOfSameTable(SFileDataBlockInfo* pBlockInfo, STableBl
int32_t step = asc ? 1 : -1;
*nextIndex = pBlockInfo->tbBlockIdx + step;
- *pBlockIndex = *(SBlockIndex*) taosArrayGet(pTableBlockScanInfo->pBlockList, *nextIndex);
-// tMapDataGetItemByIdx(&pTableBlockScanInfo->mapData, pIndex->ordinalIndex, pBlock, tGetDataBlk);
+ *pBlockIndex = *(SBlockIndex*)taosArrayGet(pTableBlockScanInfo->pBlockList, *nextIndex);
+ // tMapDataGetItemByIdx(&pTableBlockScanInfo->mapData, pIndex->ordinalIndex, pBlock, tGetDataBlk);
return true;
}
@@ -1365,7 +1476,8 @@ static bool keyOverlapFileBlock(TSDBKEY key, SDataBlk* pBlock, SVersionRange* pV
(pBlock->minVer <= pVerRange->maxVer);
}
-static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, const SDataBlk* pBlock, int32_t startIndex) {
+static bool doCheckforDatablockOverlap(STableBlockScanInfo* pBlockScanInfo, const SDataBlk* pBlock,
+ int32_t startIndex) {
size_t num = taosArrayGetSize(pBlockScanInfo->delSkyline);
for (int32_t i = startIndex; i < num; i += 1) {
@@ -1514,7 +1626,7 @@ static int32_t buildDataBlockFromBuf(STsdbReader* pReader, STableBlockScanInfo*
double elapsedTime = (taosGetTimestampUs() - st) / 1000.0;
tsdbDebug("%p build data block from cache completed, elapsed time:%.2f ms, numOfRows:%d, brange:%" PRId64
- " - %" PRId64 " %s",
+ " - %" PRId64 " %s",
pReader, elapsedTime, pBlock->info.rows, pBlock->info.window.skey, pBlock->info.window.ekey,
pReader->idStr);
@@ -2108,6 +2220,7 @@ static int32_t initMemDataIterator(STableBlockScanInfo* pBlockScanInfo, STsdbRea
if (pReader->pReadSnap->pMem != NULL) {
d = tsdbGetTbDataFromMemTable(pReader->pReadSnap->pMem, pReader->suid, pBlockScanInfo->uid);
if (d != NULL) {
+ ASSERT(pBlockScanInfo->iter.iter == NULL);
code = tsdbTbDataIterCreate(d, &startKey, backward, &pBlockScanInfo->iter.iter);
if (code == TSDB_CODE_SUCCESS) {
pBlockScanInfo->iter.hasVal = (tsdbTbDataIterGet(pBlockScanInfo->iter.iter) != NULL);
@@ -2313,7 +2426,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
goto _end;
}
- pBlockScanInfo = *(STableBlockScanInfo**) p;
+ pBlockScanInfo = *(STableBlockScanInfo**)p;
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
TSDBKEY keyInBuf = getCurrentKeyInBuf(pBlockScanInfo, pReader);
@@ -2324,7 +2437,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
copyBlockDataToSDataBlock(pReader, pBlockScanInfo);
// record the last key value
- pBlockScanInfo->lastKey = asc? pBlock->maxKey.ts:pBlock->minKey.ts;
+ pBlockScanInfo->lastKey = asc ? pBlock->maxKey.ts : pBlock->minKey.ts;
goto _end;
}
}
@@ -2387,7 +2500,7 @@ _end:
if (pResBlock->info.rows > 0) {
tsdbDebug("%p uid:%" PRIu64 ", composed data block created, brange:%" PRIu64 "-%" PRIu64
- " rows:%d, elapsed time:%.2f ms %s",
+ " rows:%d, elapsed time:%.2f ms %s",
pReader, pResBlock->info.uid, pResBlock->info.window.skey, pResBlock->info.window.ekey,
pResBlock->info.rows, el, pReader->idStr);
}
@@ -2553,7 +2666,7 @@ static void extractOrderedTableUidList(SUidOrderCheckInfo* pOrderCheckInfo, SRea
void* p = taosHashIterate(pStatus->pTableMap, NULL);
while (p != NULL) {
- STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**) p;
+ STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**)p;
pOrderCheckInfo->tableUidList[index++] = pScanInfo->uid;
p = taosHashIterate(pStatus->pTableMap, p);
}
@@ -2627,7 +2740,7 @@ static int32_t doLoadLastBlockSequentially(STsdbReader* pReader) {
while (1) {
// load the last data block of current table
- STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**) pStatus->pTableIter;
+ STableBlockScanInfo* pScanInfo = *(STableBlockScanInfo**)pStatus->pTableIter;
bool hasVal = initLastBlockReader(pLastBlockReader, pScanInfo, pReader);
if (!hasVal) {
bool hasNexTable = moveToNextTable(pOrderedCheckInfo, pStatus);
@@ -2665,7 +2778,8 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
SLastBlockReader* pLastBlockReader = pReader->status.fileIter.pLastBlockReader;
if (pBlockInfo != NULL) {
- pScanInfo = *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
+ pScanInfo =
+ *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
} else {
pScanInfo = *pReader->status.pTableIter;
}
@@ -2717,7 +2831,7 @@ static int32_t doBuildDataBlock(STsdbReader* pReader) {
setBlockAllDumped(&pStatus->fBlockDumpInfo, pBlock->maxKey.ts, pReader->order);
// update the last key for the corresponding table
- pScanInfo->lastKey = ASCENDING_TRAVERSE(pReader->order)? pInfo->window.ekey:pInfo->window.skey;
+ pScanInfo->lastKey = ASCENDING_TRAVERSE(pReader->order) ? pInfo->window.ekey : pInfo->window.skey;
}
}
@@ -2897,8 +3011,8 @@ static STsdb* getTsdbByRetentions(SVnode* pVnode, TSKEY winSKey, SRetention* ret
int8_t precision = pVnode->config.tsdbCfg.precision;
int64_t now = taosGetTimestamp(precision);
int64_t offset = tsQueryRsmaTolerance * ((precision == TSDB_TIME_PRECISION_MILLI) ? 1L
- : (precision == TSDB_TIME_PRECISION_MICRO) ? 1000L
- : 1000000L);
+ : (precision == TSDB_TIME_PRECISION_MICRO) ? 1000L
+ : 1000000L);
for (int8_t i = 0; i < TSDB_RETENTION_MAX; ++i) {
SRetention* pRetention = retentions + level;
@@ -3122,7 +3236,7 @@ int32_t doMergeRowsInBuf(SIterInfo* pIter, uint64_t uid, int64_t ts, SArray* pDe
static int32_t doMergeRowsInFileBlockImpl(SBlockData* pBlockData, int32_t rowIndex, int64_t key, SRowMerger* pMerger,
SVersionRange* pVerRange, int32_t step) {
- while (pBlockData->aTSKEY[rowIndex] == key && rowIndex < pBlockData->nRow && rowIndex >= 0) {
+ while (rowIndex < pBlockData->nRow && rowIndex >= 0 && pBlockData->aTSKEY[rowIndex] == key) {
if (pBlockData->aVersion[rowIndex] > pVerRange->maxVer || pBlockData->aVersion[rowIndex] < pVerRange->minVer) {
rowIndex += step;
continue;
@@ -3414,7 +3528,8 @@ int32_t tsdbGetNextRowInMem(STableBlockScanInfo* pBlockScanInfo, STsdbReader* pR
return TSDB_CODE_SUCCESS;
}
-int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow, STableBlockScanInfo* pScanInfo) {
+int32_t doAppendRowFromTSRow(SSDataBlock* pBlock, STsdbReader* pReader, STSRow* pTSRow,
+ STableBlockScanInfo* pScanInfo) {
int32_t numOfRows = pBlock->info.rows;
int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
int64_t uid = pScanInfo->uid;
@@ -3474,7 +3589,7 @@ int32_t doAppendRowFromFileBlock(SSDataBlock* pResBlock, STsdbReader* pReader, S
}
SColVal cv = {0};
- int32_t numOfInputCols = pBlockData->aIdx->size;
+ int32_t numOfInputCols = pBlockData->nColData;
int32_t numOfOutputCols = pResBlock->pDataBlock->size;
while (i < numOfOutputCols && j < numOfInputCols) {
@@ -3555,8 +3670,8 @@ int32_t tsdbSetTableList(STsdbReader* pReader, const void* pTableList, int32_t n
taosHashClear(pReader->status.pTableMap);
- STableKeyInfo* pList = (STableKeyInfo*) pTableList;
- for(int32_t i = 0; i < num; ++i) {
+ STableKeyInfo* pList = (STableKeyInfo*)pTableList;
+ for (int32_t i = 0; i < num; ++i) {
STableBlockScanInfo* pInfo = getPosInBlockInfoBuf(&pReader->blockInfoBuf, i);
pInfo->uid = pList[i].uid;
taosHashPut(pReader->status.pTableMap, &pInfo->uid, sizeof(uint64_t), &pInfo, POINTER_BYTES);
@@ -3665,8 +3780,11 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
}
}
- STsdbReader* p = pReader->innerReader[0] != NULL ? pReader->innerReader[0] : pReader;
+ if (pReader->pSchema != NULL) {
+ updateBlockSMAInfo(pReader->pSchema, &pReader->suppInfo);
+ }
+ STsdbReader* p = (pReader->innerReader[0] != NULL)? pReader->innerReader[0]:pReader;
pReader->status.pTableMap = createDataBlockScanInfo(p, pTableList, numOfTables);
if (pReader->status.pTableMap == NULL) {
tsdbReaderClose(pReader);
@@ -3714,7 +3832,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
return code;
- _err:
+_err:
tsdbError("failed to create data reader, code:%s %s", tstrerror(code), idstr);
return code;
}
@@ -3725,7 +3843,7 @@ void tsdbReaderClose(STsdbReader* pReader) {
}
{
- if (pReader->innerReader[0] != NULL) {
+ if (pReader->innerReader[0] != NULL || pReader->innerReader[1] != NULL) {
STsdbReader* p = pReader->innerReader[0];
p->status.pTableMap = NULL;
@@ -3763,9 +3881,12 @@ void tsdbReaderClose(STsdbReader* pReader) {
cleanupDataBlockIterator(&pReader->status.blockIter);
size_t numOfTables = taosHashGetSize(pReader->status.pTableMap);
- destroyAllBlockScanInfo(pReader->status.pTableMap);
+ if (pReader->status.pTableMap != NULL) {
+ destroyAllBlockScanInfo(pReader->status.pTableMap);
+ clearBlockScanInfoBuf(&pReader->blockInfoBuf);
+ }
+
blockDataDestroy(pReader->pResBlock);
- clearBlockScanInfoBuf(&pReader->blockInfoBuf);
if (pReader->pFileReader != NULL) {
tsdbDataFReaderClose(&pReader->pFileReader);
@@ -3882,7 +4003,8 @@ bool tsdbNextDataBlock(STsdbReader* pReader) {
}
bool tsdbTableNextDataBlock(STsdbReader* pReader, uint64_t uid) {
- STableBlockScanInfo* pBlockScanInfo = *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &uid, sizeof(uid));
+ STableBlockScanInfo* pBlockScanInfo =
+ *(STableBlockScanInfo**)taosHashGet(pReader->status.pTableMap, &uid, sizeof(uid));
if (pBlockScanInfo == NULL) { // no data block for the table of given uid
return false;
}
@@ -3921,7 +4043,7 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
}
// there is no statistics data for composed block
- if (pReader->status.composedDataBlock) {
+ if (pReader->status.composedDataBlock || (!pReader->suppInfo.smaValid)) {
*pBlockStatis = NULL;
return TSDB_CODE_SUCCESS;
}
@@ -3929,7 +4051,7 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
SFileDataBlockInfo* pFBlock = getCurrentBlockInfo(&pReader->status.blockIter);
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
-// int64_t stime = taosGetTimestampUs();
+ // int64_t stime = taosGetTimestampUs();
SBlockLoadSuppInfo* pSup = &pReader->suppInfo;
@@ -3960,8 +4082,8 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
size_t numOfCols = blockDataGetNumOfCols(pReader->pResBlock);
int32_t i = 0, j = 0;
- size_t size = taosArrayGetSize(pSup->pColAgg);
-
+ size_t size = taosArrayGetSize(pSup->pColAgg);
+#if 0
while (j < numOfCols && i < size) {
SColumnDataAgg* pAgg = taosArrayGet(pSup->pColAgg, i);
if (pAgg->colId == pSup->colIds[j]) {
@@ -3969,6 +4091,7 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
pSup->plist[j] = pAgg;
} else {
*allHave = false;
+ break;
}
i += 1;
j += 1;
@@ -3978,12 +4101,47 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SColumnDataAgg*** pBlockS
j += 1;
}
}
+#else
+
+ // fill the all null data column
+ SArray* pNewAggList = taosArrayInit(numOfCols, sizeof(SColumnDataAgg));
+
+ while (j < numOfCols && i < size) {
+ SColumnDataAgg* pAgg = taosArrayGet(pSup->pColAgg, i);
+ if (pAgg->colId == pSup->colIds[j]) {
+ taosArrayPush(pNewAggList, pAgg);
+ i += 1;
+ j += 1;
+ } else if (pAgg->colId < pSup->colIds[j]) {
+ i += 1;
+ } else if (pSup->colIds[j] < pAgg->colId) {
+ if (pSup->colIds[j] == PRIMARYKEY_TIMESTAMP_COL_ID) {
+ taosArrayPush(pNewAggList, &pSup->tsColAgg);
+ } else {
+ // all date in this block are null
+ SColumnDataAgg nullColAgg = {.colId = pSup->colIds[j], .numOfNull = pBlock->nRow};
+ taosArrayPush(pNewAggList, &nullColAgg);
+ }
+ j += 1;
+ }
+ }
+
+ taosArrayClear(pSup->pColAgg);
+ taosArrayAddAll(pSup->pColAgg, pNewAggList);
+
+ size_t num = taosArrayGetSize(pSup->pColAgg);
+ for(int32_t k = 0; k < num; ++k) {
+ pSup->plist[k] = taosArrayGet(pSup->pColAgg, k);
+ }
+
+ taosArrayDestroy(pNewAggList);
+
+#endif
pReader->cost.smaDataLoad += 1;
*pBlockStatis = pSup->plist;
tsdbDebug("vgId:%d, succeed to load block SMA for uid %" PRIu64 ", %s", 0, pFBlock->uid, pReader->idStr);
-
return code;
}
@@ -3995,7 +4153,8 @@ static SArray* doRetrieveDataBlock(STsdbReader* pReader) {
}
SFileDataBlockInfo* pBlockInfo = getCurrentBlockInfo(&pStatus->blockIter);
- STableBlockScanInfo* pBlockScanInfo = *(STableBlockScanInfo**)taosHashGet(pStatus->pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
+ STableBlockScanInfo* pBlockScanInfo =
+ *(STableBlockScanInfo**)taosHashGet(pStatus->pTableMap, &pBlockInfo->uid, sizeof(pBlockInfo->uid));
if (pBlockScanInfo == NULL) {
terrno = TSDB_CODE_INVALID_PARA;
tsdbError("failed to locate the uid:%" PRIu64 " in query table uid list, total tables:%d, %s", pBlockInfo->uid,
@@ -4069,7 +4228,7 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
}
tsdbDebug("%p reset reader, suid:%" PRIu64 ", numOfTables:%d, skey:%" PRId64 ", query range:%" PRId64 " - %" PRId64
- " in query %s",
+ " in query %s",
pReader, pReader->suid, numOfTables, pCond->twindows.skey, pReader->window.skey, pReader->window.ekey,
pReader->idStr);
@@ -4260,7 +4419,7 @@ int32_t tsdbTakeReadSnap(STsdb* pTsdb, STsdbReadSnap** ppSnap, const char* idStr
}
tsdbTrace("vgId:%d, take read snapshot, %s", TD_VID(pTsdb->pVnode), idStr);
- _exit:
+_exit:
return code;
}
diff --git a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
index 27beb22165cbfb619f6cddd5d7eccfc55d80a43e..294a4bd3e4c404ddb33a4e3fe7cd0c5fe2203a87 100644
--- a/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
+++ b/source/dnode/vnode/src/tsdb/tsdbReaderWriter.c
@@ -514,13 +514,13 @@ static int32_t tsdbWriteBlockSma(SDataFWriter *pWriter, SBlockData *pBlockData,
pSmaInfo->size = 0;
// encode
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
+ for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
- if ((!pColData->smaOn) || IS_VAR_DATA_TYPE(pColData->type)) continue;
+ if ((!pColData->smaOn) || IS_VAR_DATA_TYPE(pColData->type) || ((pColData->flag & HAS_VALUE) == 0)) continue;
- SColumnDataAgg sma;
- tsdbCalcColDataSMA(pColData, &sma);
+ SColumnDataAgg sma = {.colId = pColData->cid};
+ tColDataCalcSMA[pColData->type](pColData, &sma.sum, &sma.max, &sma.min, &sma.numOfNull);
code = tRealloc(&pWriter->aBuf[0], pSmaInfo->size + tPutColumnDataAgg(NULL, &sma));
if (code) goto _err;
@@ -1112,7 +1112,7 @@ static int32_t tsdbReadBlockDataImpl(SDataFReader *pReader, SBlockInfo *pBlkInfo
ASSERT(p - pReader->aBuf[0] == pBlkInfo->szKey);
// read and decode columns
- if (taosArrayGetSize(pBlockData->aIdx) == 0) goto _exit;
+ if (pBlockData->nColData == 0) goto _exit;
if (hdr.szBlkCol > 0) {
int64_t offset = pBlkInfo->offset + pBlkInfo->szKey;
@@ -1128,7 +1128,7 @@ static int32_t tsdbReadBlockDataImpl(SDataFReader *pReader, SBlockInfo *pBlkInfo
SBlockCol *pBlockCol = &blockCol;
int32_t n = 0;
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
+ for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
while (pBlockCol && pBlockCol->cid < pColData->cid) {
@@ -1212,49 +1212,6 @@ int32_t tsdbReadDataBlock(SDataFReader *pReader, SDataBlk *pDataBlk, SBlockData
ASSERT(pDataBlk->nSubBlock == 1);
-#if 0
- if (pDataBlk->nSubBlock > 1) {
- SBlockData bData1;
- SBlockData bData2;
-
- // create
- code = tBlockDataCreate(&bData1);
- if (code) goto _err;
- code = tBlockDataCreate(&bData2);
- if (code) goto _err;
-
- // init
- tBlockDataInitEx(&bData1, pBlockData);
- tBlockDataInitEx(&bData2, pBlockData);
-
- for (int32_t iSubBlock = 1; iSubBlock < pDataBlk->nSubBlock; iSubBlock++) {
- code = tsdbReadBlockDataImpl(pReader, &pDataBlk->aSubBlock[iSubBlock], &bData1);
- if (code) {
- tBlockDataDestroy(&bData1, 1);
- tBlockDataDestroy(&bData2, 1);
- goto _err;
- }
-
- code = tBlockDataCopy(pBlockData, &bData2);
- if (code) {
- tBlockDataDestroy(&bData1, 1);
- tBlockDataDestroy(&bData2, 1);
- goto _err;
- }
-
- code = tBlockDataMerge(&bData1, &bData2, pBlockData);
- if (code) {
- tBlockDataDestroy(&bData1, 1);
- tBlockDataDestroy(&bData2, 1);
- goto _err;
- }
- }
-
- tBlockDataDestroy(&bData1, 1);
- tBlockDataDestroy(&bData2, 1);
- }
-#endif
-
return code;
_err:
diff --git a/source/dnode/vnode/src/tsdb/tsdbUtil.c b/source/dnode/vnode/src/tsdb/tsdbUtil.c
index 4e02a28cdf49affbc722ae69a60cbf067ff98139..b0cf09662c9e4ffccb663fd1689fcd16668cf05b 100644
--- a/source/dnode/vnode/src/tsdb/tsdbUtil.c
+++ b/source/dnode/vnode/src/tsdb/tsdbUtil.c
@@ -505,8 +505,8 @@ int32_t tsdbKeyFid(TSKEY key, int32_t minutes, int8_t precision) {
}
void tsdbFidKeyRange(int32_t fid, int32_t minutes, int8_t precision, TSKEY *minKey, TSKEY *maxKey) {
- *minKey = fid * minutes * tsTickPerMin[precision];
- *maxKey = *minKey + minutes * tsTickPerMin[precision] - 1;
+ *minKey = tsTickPerMin[precision] * fid * minutes;
+ *maxKey = *minKey + tsTickPerMin[precision] * minutes - 1;
}
int32_t tsdbFidLevel(int32_t fid, STsdbKeepCfg *pKeepCfg, int64_t now) {
@@ -565,25 +565,15 @@ void tsdbRowGetColVal(TSDBROW *pRow, STSchema *pTSchema, int32_t iCol, SColVal *
}
}
-int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow) {
- int32_t n = 0;
-
- n += tPutI64(p, pRow->version);
- if (p) memcpy(p + n, pRow->pTSRow, pRow->pTSRow->len);
- n += pRow->pTSRow->len;
-
- return n;
-}
+// int32_t tPutTSDBRow(uint8_t *p, TSDBROW *pRow) {
+// int32_t n = 0;
-int32_t tGetTSDBRow(uint8_t *p, TSDBROW *pRow) {
- int32_t n = 0;
+// n += tPutI64(p, pRow->version);
+// if (p) memcpy(p + n, pRow->pTSRow, pRow->pTSRow->len);
+// n += pRow->pTSRow->len;
- n += tGetI64(p, &pRow->version);
- pRow->pTSRow = (STSRow *)(p + n);
- n += pRow->pTSRow->len;
-
- return n;
-}
+// return n;
+// }
int32_t tsdbRowCmprFn(const void *p1, const void *p2) {
return tsdbKeyCmprFn(&TSDBROW_KEY((TSDBROW *)p1), &TSDBROW_KEY((TSDBROW *)p2));
@@ -607,13 +597,13 @@ void tRowIterInit(SRowIter *pIter, TSDBROW *pRow, STSchema *pTSchema) {
SColVal *tRowIterNext(SRowIter *pIter) {
if (pIter->pRow->type == 0) {
if (pIter->i < pIter->pTSchema->numOfCols) {
- tsdbRowGetColVal(pIter->pRow, pIter->pTSchema, pIter->i, &pIter->colVal);
+ tTSRowGetVal(pIter->pRow->pTSRow, pIter->pTSchema, pIter->i, &pIter->colVal);
pIter->i++;
return &pIter->colVal;
}
} else {
- if (pIter->i < taosArrayGetSize(pIter->pRow->pBlockData->aIdx)) {
+ if (pIter->i < pIter->pRow->pBlockData->nColData) {
SColData *pColData = tBlockDataGetColDataByIdx(pIter->pRow->pBlockData, pIter->i);
tColDataGetValue(pColData, pIter->pRow->iRow, &pIter->colVal);
@@ -917,14 +907,9 @@ int32_t tBlockDataCreate(SBlockData *pBlockData) {
pBlockData->aUid = NULL;
pBlockData->aVersion = NULL;
pBlockData->aTSKEY = NULL;
- pBlockData->aIdx = taosArrayInit(0, sizeof(int32_t));
- if (pBlockData->aIdx == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _exit;
- }
+ pBlockData->nColData = 0;
pBlockData->aColData = taosArrayInit(0, sizeof(SColData));
if (pBlockData->aColData == NULL) {
- taosArrayDestroy(pBlockData->aIdx);
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
@@ -937,12 +922,10 @@ void tBlockDataDestroy(SBlockData *pBlockData, int8_t deepClear) {
tFree((uint8_t *)pBlockData->aUid);
tFree((uint8_t *)pBlockData->aVersion);
tFree((uint8_t *)pBlockData->aTSKEY);
- taosArrayDestroy(pBlockData->aIdx);
taosArrayDestroyEx(pBlockData->aColData, deepClear ? tColDataDestroy : NULL);
pBlockData->aUid = NULL;
pBlockData->aVersion = NULL;
pBlockData->aTSKEY = NULL;
- pBlockData->aIdx = NULL;
pBlockData->aColData = NULL;
}
@@ -955,7 +938,7 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
pBlockData->uid = pId->uid;
pBlockData->nRow = 0;
- taosArrayClear(pBlockData->aIdx);
+ pBlockData->nColData = 0;
if (aCid) {
int32_t iColumn = 1;
STColumn *pTColumn = &pTSchema->columns[iColumn];
@@ -969,7 +952,7 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
break;
} else if (pTColumn->colId == aCid[iCid]) {
SColData *pColData;
- code = tBlockDataAddColData(pBlockData, taosArrayGetSize(pBlockData->aIdx), &pColData);
+ code = tBlockDataAddColData(pBlockData, &pColData);
if (code) goto _exit;
tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0);
@@ -982,7 +965,7 @@ int32_t tBlockDataInit(SBlockData *pBlockData, TABLEID *pId, STSchema *pTSchema,
STColumn *pTColumn = &pTSchema->columns[iColumn];
SColData *pColData;
- code = tBlockDataAddColData(pBlockData, iColumn - 1, &pColData);
+ code = tBlockDataAddColData(pBlockData, &pColData);
if (code) goto _exit;
tColDataInit(pColData, pTColumn->colId, pTColumn->type, (pTColumn->flags & COL_SMA_ON) ? 1 : 0);
@@ -993,64 +976,36 @@ _exit:
return code;
}
-int32_t tBlockDataInitEx(SBlockData *pBlockData, SBlockData *pBlockDataFrom) {
- int32_t code = 0;
-
- ASSERT(pBlockDataFrom->suid || pBlockDataFrom->uid);
-
- pBlockData->suid = pBlockDataFrom->suid;
- pBlockData->uid = pBlockDataFrom->uid;
- pBlockData->nRow = 0;
-
- taosArrayClear(pBlockData->aIdx);
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockDataFrom->aIdx); iColData++) {
- SColData *pColDataFrom = tBlockDataGetColDataByIdx(pBlockDataFrom, iColData);
-
- SColData *pColData;
- code = tBlockDataAddColData(pBlockData, iColData, &pColData);
- if (code) goto _exit;
-
- tColDataInit(pColData, pColDataFrom->cid, pColDataFrom->type, pColDataFrom->smaOn);
- }
-
-_exit:
- return code;
-}
-
void tBlockDataReset(SBlockData *pBlockData) {
pBlockData->suid = 0;
pBlockData->uid = 0;
pBlockData->nRow = 0;
- taosArrayClear(pBlockData->aIdx);
+ pBlockData->nColData = 0;
}
void tBlockDataClear(SBlockData *pBlockData) {
ASSERT(pBlockData->suid || pBlockData->uid);
pBlockData->nRow = 0;
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
+ for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
tColDataClear(pColData);
}
}
-int32_t tBlockDataAddColData(SBlockData *pBlockData, int32_t iColData, SColData **ppColData) {
+int32_t tBlockDataAddColData(SBlockData *pBlockData, SColData **ppColData) {
int32_t code = 0;
SColData *pColData = NULL;
- int32_t idx = taosArrayGetSize(pBlockData->aIdx);
- if (idx >= taosArrayGetSize(pBlockData->aColData)) {
+ if (pBlockData->nColData >= taosArrayGetSize(pBlockData->aColData)) {
if (taosArrayPush(pBlockData->aColData, &((SColData){0})) == NULL) {
code = TSDB_CODE_OUT_OF_MEMORY;
goto _err;
}
}
- pColData = (SColData *)taosArrayGet(pBlockData->aColData, idx);
+ pColData = (SColData *)taosArrayGet(pBlockData->aColData, pBlockData->nColData);
- if (taosArrayInsert(pBlockData->aIdx, iColData, &idx) == NULL) {
- code = TSDB_CODE_OUT_OF_MEMORY;
- goto _err;
- }
+ pBlockData->nColData++;
*ppColData = pColData;
return code;
@@ -1060,6 +1015,191 @@ _err:
return code;
}
+static int32_t tBlockDataAppendBlockRow(SBlockData *pBlockData, SBlockData *pBlockDataFrom, int32_t iRow) {
+ int32_t code = 0;
+
+ SColVal cv = {0};
+ int32_t iColDataFrom = 0;
+ SColData *pColDataFrom =
+ (iColDataFrom < pBlockDataFrom->nColData) ? &((SColData *)pBlockDataFrom->aColData->pData)[iColDataFrom] : NULL;
+
+ for (int32_t iColDataTo = 0; iColDataTo < pBlockData->nColData; iColDataTo++) {
+ SColData *pColDataTo = &((SColData *)pBlockData->aColData->pData)[iColDataTo];
+
+ while (pColDataFrom && pColDataFrom->cid < pColDataTo->cid) {
+ iColDataFrom++;
+ pColDataFrom = (iColDataFrom < pBlockDataFrom->nColData)
+ ? &((SColData *)pBlockDataFrom->aColData->pData)[iColDataFrom]
+ : NULL;
+ }
+
+ if (pColDataFrom == NULL || pColDataFrom->cid > pColDataTo->cid) {
+ code = tColDataAppendValue(pColDataTo, &COL_VAL_NONE(pColDataTo->cid, pColDataTo->type));
+ if (code) goto _exit;
+ } else {
+ tColDataGetValue(pColDataFrom, iRow, &cv);
+
+ code = tColDataAppendValue(pColDataTo, &cv);
+ if (code) goto _exit;
+
+ iColDataFrom++;
+ pColDataFrom = (iColDataFrom < pBlockDataFrom->nColData)
+ ? &((SColData *)pBlockDataFrom->aColData->pData)[iColDataFrom]
+ : NULL;
+ }
+ }
+
+_exit:
+ return code;
+}
+
+static int32_t tBlockDataAppendTPRow(SBlockData *pBlockData, STSRow *pRow, STSchema *pTSchema) {
+ int32_t code = 0;
+
+ int32_t iTColumn = 1;
+ STColumn *pTColumn = (iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
+ void *pBitmap = pRow->statis ? tdGetBitmapAddrTp(pRow, pTSchema->flen) : NULL;
+
+ for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
+ SColData *pColData = &((SColData *)pBlockData->aColData->pData)[iColData];
+
+ while (pTColumn && pTColumn->colId < pColData->cid) {
+ iTColumn++;
+ pTColumn = (iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
+ }
+
+ if (pTColumn == NULL || pTColumn->colId > pColData->cid) {
+ code = tColDataAppendValue(pColData, &COL_VAL_NONE(pColData->cid, pColData->type));
+ if (code) goto _exit;
+ } else {
+ ASSERT(pTColumn->type == pColData->type);
+
+ SColVal cv = {.cid = pTColumn->colId, .type = pTColumn->type};
+
+ if (pRow->statis) {
+ TDRowValT vt = TD_VTYPE_MAX;
+ tdGetBitmapValTypeII(pBitmap, iTColumn - 1, &vt);
+
+ if (vt == TD_VTYPE_NORM) {
+ cv.flag = CV_FLAG_VALUE;
+
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ void *pData = (char *)pRow + *(int32_t *)(pRow->data + pTColumn->offset - sizeof(TSKEY));
+ cv.value.nData = varDataLen(pData);
+ cv.value.pData = varDataVal(pData);
+ } else {
+ memcpy(&cv.value.val, pRow->data + pTColumn->offset - sizeof(TSKEY), pTColumn->bytes);
+ }
+
+ code = tColDataAppendValue(pColData, &cv);
+ if (code) goto _exit;
+ } else if (vt == TD_VTYPE_NONE) {
+ code = tColDataAppendValue(pColData, &COL_VAL_NONE(pColData->cid, pColData->type));
+ if (code) goto _exit;
+ } else if (vt == TD_VTYPE_NULL) {
+ code = tColDataAppendValue(pColData, &COL_VAL_NULL(pColData->cid, pColData->type));
+ if (code) goto _exit;
+ } else {
+ ASSERT(0);
+ }
+ } else {
+ cv.flag = CV_FLAG_VALUE;
+
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ void *pData = (char *)pRow + *(int32_t *)(pRow->data + pTColumn->offset - sizeof(TSKEY));
+ cv.value.nData = varDataLen(pData);
+ cv.value.pData = varDataVal(pData);
+ } else {
+ memcpy(&cv.value.val, pRow->data + pTColumn->offset - sizeof(TSKEY), pTColumn->bytes);
+ }
+
+ code = tColDataAppendValue(pColData, &cv);
+ if (code) goto _exit;
+ }
+
+ iTColumn++;
+ pTColumn = (iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
+ }
+ }
+
+_exit:
+ return code;
+}
+
+static int32_t tBlockDataAppendKVRow(SBlockData *pBlockData, STSRow *pRow, STSchema *pTSchema) {
+ int32_t code = 0;
+
+ col_id_t kvIter = 0;
+ col_id_t nKvCols = tdRowGetNCols(pRow) - 1;
+ void *pColIdx = TD_ROW_COL_IDX(pRow);
+ void *pBitmap = tdGetBitmapAddrKv(pRow, tdRowGetNCols(pRow));
+ int32_t iTColumn = 1;
+ STColumn *pTColumn = (iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
+
+ for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
+ SColData *pColData = &((SColData *)pBlockData->aColData->pData)[iColData];
+
+ while (pTColumn && pTColumn->colId < pColData->cid) {
+ iTColumn++;
+ pTColumn = (iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
+ }
+
+ if (pTColumn == NULL || pTColumn->colId > pColData->cid) {
+ code = tColDataAppendValue(pColData, &COL_VAL_NONE(pColData->cid, pColData->type));
+ if (code) goto _exit;
+ } else {
+ ASSERT(pTColumn->type == pColData->type);
+
+ SColVal cv = {.cid = pTColumn->colId, .type = pTColumn->type};
+ TDRowValT vt = TD_VTYPE_NONE; // default is NONE
+ SKvRowIdx *pKvIdx = NULL;
+
+ while (kvIter < nKvCols) {
+ pKvIdx = (SKvRowIdx *)POINTER_SHIFT(pColIdx, kvIter * sizeof(SKvRowIdx));
+ if (pKvIdx->colId == pTColumn->colId) {
+ tdGetBitmapValTypeII(pBitmap, kvIter, &vt);
+ ++kvIter;
+ break;
+ } else if (pKvIdx->colId > pTColumn->colId) {
+ vt = TD_VTYPE_NONE;
+ break;
+ } else {
+ ++kvIter;
+ }
+ }
+
+ if (vt == TD_VTYPE_NORM) {
+ cv.flag = CV_FLAG_VALUE;
+
+ void *pData = POINTER_SHIFT(pRow, pKvIdx->offset);
+ if (IS_VAR_DATA_TYPE(pTColumn->type)) {
+ cv.value.nData = varDataLen(pData);
+ cv.value.pData = varDataVal(pData);
+ } else {
+ memcpy(&cv.value.val, pData, pTColumn->bytes);
+ }
+
+ code = tColDataAppendValue(pColData, &cv);
+ if (code) goto _exit;
+ } else if (vt == TD_VTYPE_NONE) {
+ code = tColDataAppendValue(pColData, &COL_VAL_NONE(pColData->cid, pColData->type));
+ if (code) goto _exit;
+ } else if (vt == TD_VTYPE_NULL) {
+ code = tColDataAppendValue(pColData, &COL_VAL_NULL(pColData->cid, pColData->type));
+ if (code) goto _exit;
+ } else {
+ ASSERT(0);
+ }
+
+ iTColumn++;
+ pTColumn = (iTColumn < pTSchema->numOfCols) ? &pTSchema->columns[iTColumn] : NULL;
+ }
+ }
+
+_exit:
+ return code;
+}
+
int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTSchema, int64_t uid) {
int32_t code = 0;
@@ -1081,27 +1221,20 @@ int32_t tBlockDataAppendRow(SBlockData *pBlockData, TSDBROW *pRow, STSchema *pTS
if (code) goto _err;
pBlockData->aTSKEY[pBlockData->nRow] = TSDBROW_TS(pRow);
- // OTHER
- SRowIter rIter = {0};
- SColVal *pColVal;
-
- tRowIterInit(&rIter, pRow, pTSchema);
- pColVal = tRowIterNext(&rIter);
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
- SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
-
- while (pColVal && pColVal->cid < pColData->cid) {
- pColVal = tRowIterNext(&rIter);
- }
-
- if (pColVal == NULL || pColVal->cid > pColData->cid) {
- code = tColDataAppendValue(pColData, &COL_VAL_NONE(pColData->cid, pColData->type));
+ SColVal cv = {0};
+ if (pRow->type == 0) {
+ if (TD_IS_TP_ROW(pRow->pTSRow)) {
+ code = tBlockDataAppendTPRow(pBlockData, pRow->pTSRow, pTSchema);
if (code) goto _err;
- } else {
- code = tColDataAppendValue(pColData, pColVal);
+ } else if (TD_IS_KV_ROW(pRow->pTSRow)) {
+ code = tBlockDataAppendKVRow(pBlockData, pRow->pTSRow, pTSchema);
if (code) goto _err;
- pColVal = tRowIterNext(&rIter);
+ } else {
+ ASSERT(0);
}
+ } else {
+ code = tBlockDataAppendBlockRow(pBlockData, pRow->pBlockData, pRow->iRow);
+ if (code) goto _err;
}
pBlockData->nRow++;
@@ -1115,19 +1248,19 @@ int32_t tBlockDataCorrectSchema(SBlockData *pBlockData, SBlockData *pBlockDataFr
int32_t code = 0;
int32_t iColData = 0;
- for (int32_t iColDataFrom = 0; iColDataFrom < taosArrayGetSize(pBlockDataFrom->aIdx); iColDataFrom++) {
+ for (int32_t iColDataFrom = 0; iColDataFrom < pBlockDataFrom->nColData; iColDataFrom++) {
SColData *pColDataFrom = tBlockDataGetColDataByIdx(pBlockDataFrom, iColDataFrom);
while (true) {
SColData *pColData;
- if (iColData < taosArrayGetSize(pBlockData->aIdx)) {
+ if (iColData < pBlockData->nColData) {
pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
} else {
pColData = NULL;
}
if (pColData == NULL || pColData->cid > pColDataFrom->cid) {
- code = tBlockDataAddColData(pBlockData, iColData, &pColData);
+ code = tBlockDataAddColData(pBlockData, &pColData);
if (code) goto _exit;
tColDataInit(pColData, pColDataFrom->cid, pColDataFrom->type, pColDataFrom->smaOn);
@@ -1226,55 +1359,15 @@ _exit:
return code;
}
-int32_t tBlockDataCopy(SBlockData *pSrc, SBlockData *pDest) {
- int32_t code = 0;
-
- tBlockDataClear(pDest);
-
- ASSERT(pDest->suid == pSrc->suid);
- ASSERT(pDest->uid == pSrc->uid);
- ASSERT(taosArrayGetSize(pSrc->aIdx) == taosArrayGetSize(pDest->aIdx));
-
- pDest->nRow = pSrc->nRow;
-
- if (pSrc->uid == 0) {
- code = tRealloc((uint8_t **)&pDest->aUid, sizeof(int64_t) * pDest->nRow);
- if (code) goto _exit;
- memcpy(pDest->aUid, pSrc->aUid, sizeof(int64_t) * pDest->nRow);
- }
-
- code = tRealloc((uint8_t **)&pDest->aVersion, sizeof(int64_t) * pDest->nRow);
- if (code) goto _exit;
- memcpy(pDest->aVersion, pSrc->aVersion, sizeof(int64_t) * pDest->nRow);
-
- code = tRealloc((uint8_t **)&pDest->aTSKEY, sizeof(TSKEY) * pDest->nRow);
- if (code) goto _exit;
- memcpy(pDest->aTSKEY, pSrc->aTSKEY, sizeof(TSKEY) * pDest->nRow);
-
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pSrc->aIdx); iColData++) {
- SColData *pColSrc = tBlockDataGetColDataByIdx(pSrc, iColData);
- SColData *pColDest = tBlockDataGetColDataByIdx(pDest, iColData);
-
- ASSERT(pColSrc->cid == pColDest->cid);
- ASSERT(pColSrc->type == pColDest->type);
-
- code = tColDataCopy(pColSrc, pColDest);
- if (code) goto _exit;
- }
-
-_exit:
- return code;
-}
-
SColData *tBlockDataGetColDataByIdx(SBlockData *pBlockData, int32_t idx) {
- ASSERT(idx >= 0 && idx < taosArrayGetSize(pBlockData->aIdx));
- return (SColData *)taosArrayGet(pBlockData->aColData, *(int32_t *)taosArrayGet(pBlockData->aIdx, idx));
+ ASSERT(idx >= 0 && idx < pBlockData->nColData);
+ return (SColData *)taosArrayGet(pBlockData->aColData, idx);
}
void tBlockDataGetColData(SBlockData *pBlockData, int16_t cid, SColData **ppColData) {
ASSERT(cid != PRIMARYKEY_TIMESTAMP_COL_ID);
int32_t lidx = 0;
- int32_t ridx = taosArrayGetSize(pBlockData->aIdx) - 1;
+ int32_t ridx = pBlockData->nColData - 1;
while (lidx <= ridx) {
int32_t midx = (lidx + ridx) / 2;
@@ -1308,7 +1401,7 @@ int32_t tCmprBlockData(SBlockData *pBlockData, int8_t cmprAlg, uint8_t **ppOut,
// encode =================
// columns AND SBlockCol
aBufN[0] = 0;
- for (int32_t iColData = 0; iColData < taosArrayGetSize(pBlockData->aIdx); iColData++) {
+ for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
ASSERT(pColData->flag);
@@ -1431,7 +1524,7 @@ int32_t tDecmprBlockData(uint8_t *pIn, int32_t szIn, SBlockData *pBlockData, uin
ASSERT(nt <= hdr.szBlkCol);
SColData *pColData;
- code = tBlockDataAddColData(pBlockData, taosArrayGetSize(pBlockData->aIdx), &pColData);
+ code = tBlockDataAddColData(pBlockData, &pColData);
if (code) goto _exit;
tColDataInit(pColData, blockCol.cid, blockCol.type, blockCol.smaOn);
@@ -1512,111 +1605,6 @@ int32_t tGetColumnDataAgg(uint8_t *p, SColumnDataAgg *pColAgg) {
return n;
}
-#define SMA_UPDATE(SUM_V, MIN_V, MAX_V, VAL, MINSET, MAXSET) \
- do { \
- (SUM_V) += (VAL); \
- if (!(MINSET)) { \
- (MIN_V) = (VAL); \
- (MINSET) = 1; \
- } else if ((MIN_V) > (VAL)) { \
- (MIN_V) = (VAL); \
- } \
- if (!(MAXSET)) { \
- (MAX_V) = (VAL); \
- (MAXSET) = 1; \
- } else if ((MAX_V) < (VAL)) { \
- (MAX_V) = (VAL); \
- } \
- } while (0)
-
-static FORCE_INLINE void tSmaUpdateBool(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
- int8_t val = *(int8_t *)&pColVal->value.val ? 1 : 0;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateTinyint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
- uint8_t *maxSet) {
- int8_t val = *(int8_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateSmallint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
- uint8_t *maxSet) {
- int16_t val = *(int16_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateInt(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
- int32_t val = *(int32_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateBigint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
- int64_t val = *(int64_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateFloat(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
- float val = *(float *)&pColVal->value.val;
- SMA_UPDATE(*(double *)&pColAgg->sum, *(double *)&pColAgg->min, *(double *)&pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateDouble(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
- double val = *(double *)&pColVal->value.val;
- SMA_UPDATE(*(double *)&pColAgg->sum, *(double *)&pColAgg->min, *(double *)&pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateUTinyint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
- uint8_t *maxSet) {
- uint8_t val = *(uint8_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateUSmallint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
- uint8_t *maxSet) {
- uint16_t val = *(uint16_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateUInt(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) {
- uint32_t val = *(uint32_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-static FORCE_INLINE void tSmaUpdateUBigint(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet,
- uint8_t *maxSet) {
- uint64_t val = *(uint64_t *)&pColVal->value.val;
- SMA_UPDATE(pColAgg->sum, pColAgg->min, pColAgg->max, val, *minSet, *maxSet);
-}
-void (*tSmaUpdateImpl[])(SColumnDataAgg *pColAgg, SColVal *pColVal, uint8_t *minSet, uint8_t *maxSet) = {
- NULL,
- tSmaUpdateBool, // TSDB_DATA_TYPE_BOOL
- tSmaUpdateTinyint, // TSDB_DATA_TYPE_TINYINT
- tSmaUpdateSmallint, // TSDB_DATA_TYPE_SMALLINT
- tSmaUpdateInt, // TSDB_DATA_TYPE_INT
- tSmaUpdateBigint, // TSDB_DATA_TYPE_BIGINT
- tSmaUpdateFloat, // TSDB_DATA_TYPE_FLOAT
- tSmaUpdateDouble, // TSDB_DATA_TYPE_DOUBLE
- NULL, // TSDB_DATA_TYPE_VARCHAR
- tSmaUpdateBigint, // TSDB_DATA_TYPE_TIMESTAMP
- NULL, // TSDB_DATA_TYPE_NCHAR
- tSmaUpdateUTinyint, // TSDB_DATA_TYPE_UTINYINT
- tSmaUpdateUSmallint, // TSDB_DATA_TYPE_USMALLINT
- tSmaUpdateUInt, // TSDB_DATA_TYPE_UINT
- tSmaUpdateUBigint, // TSDB_DATA_TYPE_UBIGINT
- NULL, // TSDB_DATA_TYPE_JSON
- NULL, // TSDB_DATA_TYPE_VARBINARY
- NULL, // TSDB_DATA_TYPE_DECIMAL
- NULL, // TSDB_DATA_TYPE_BLOB
- NULL, // TSDB_DATA_TYPE_MEDIUMBLOB
-};
-void tsdbCalcColDataSMA(SColData *pColData, SColumnDataAgg *pColAgg) {
- *pColAgg = (SColumnDataAgg){.colId = pColData->cid};
- uint8_t minSet = 0;
- uint8_t maxSet = 0;
-
- SColVal cv;
- for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
- tColDataGetValue(pColData, iVal, &cv);
-
- if (COL_VAL_IS_VALUE(&cv)) {
- tSmaUpdateImpl[pColData->type](pColAgg, &cv, &minSet, &maxSet);
- } else {
- pColAgg->numOfNull++;
- }
- }
-}
-
int32_t tsdbCmprData(uint8_t *pIn, int32_t szIn, int8_t type, int8_t cmprAlg, uint8_t **ppOut, int32_t nOut,
int32_t *szOut, uint8_t **ppBuf) {
int32_t code = 0;
@@ -1710,7 +1698,7 @@ int32_t tsdbCmprColData(SColData *pColData, int8_t cmprAlg, SBlockCol *pBlockCol
size += pBlockCol->szBitmap;
// offset
- if (IS_VAR_DATA_TYPE(pColData->type)) {
+ if (IS_VAR_DATA_TYPE(pColData->type) && pColData->flag != (HAS_NULL | HAS_NONE)) {
code = tsdbCmprData((uint8_t *)pColData->aOffset, sizeof(int32_t) * pColData->nVal, TSDB_DATA_TYPE_INT, cmprAlg,
ppOut, nOut + size, &pBlockCol->szOffset, ppBuf);
if (code) goto _exit;
diff --git a/source/dnode/vnode/src/tsdb/tsdbWrite.c b/source/dnode/vnode/src/tsdb/tsdbWrite.c
index f38802aee78021c158a29fed44e0fc14e06fc482..49d5eaac43c6dbd2356bf95ca4cfb9c70cb350c7 100644
--- a/source/dnode/vnode/src/tsdb/tsdbWrite.c
+++ b/source/dnode/vnode/src/tsdb/tsdbWrite.c
@@ -15,6 +15,15 @@
#include "tsdb.h"
+/**
+ * @brief max key by precision
+ * approximately calculation:
+ * ms: 3600*1000*8765*1000 // 1970 + 1000 years
+ * us: 3600*1000000*8765*1000 // 1970 + 1000 years
+ * ns: 3600*1000000000*8765*292 // 1970 + 292 years
+ */
+static int64_t tsMaxKeyByPrecision[] = {31556995200000L, 31556995200000000L, 9214646400000000000L};
+
// static int tsdbScanAndConvertSubmitMsg(STsdb *pTsdb, SSubmitReq *pMsg);
int tsdbInsertData(STsdb *pTsdb, int64_t version, SSubmitReq *pMsg, SSubmitRsp *pRsp) {
@@ -97,7 +106,7 @@ int tsdbScanAndConvertSubmitMsg(STsdb *pTsdb, SSubmitReq *pMsg) {
STsdbKeepCfg *pCfg = &pTsdb->keepCfg;
TSKEY now = taosGetTimestamp(pCfg->precision);
TSKEY minKey = now - tsTickPerMin[pCfg->precision] * pCfg->keep2;
- TSKEY maxKey = now + tsTickPerMin[pCfg->precision] * pCfg->days;
+ TSKEY maxKey = tsMaxKeyByPrecision[pCfg->precision];
terrno = TSDB_CODE_SUCCESS;
// pMsg->length = htonl(pMsg->length);
diff --git a/source/dnode/vnode/src/vnd/vnodeBufPool.c b/source/dnode/vnode/src/vnd/vnodeBufPool.c
index 6ac2ce1c16f39e325b055546168e6113489ee2fe..71e926bd350bd032ed3314baf9e037b128f5991d 100644
--- a/source/dnode/vnode/src/vnd/vnodeBufPool.c
+++ b/source/dnode/vnode/src/vnd/vnodeBufPool.c
@@ -27,10 +27,21 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool)
return -1;
}
- if (taosThreadSpinInit(&pPool->lock, 0) != 0) {
- taosMemoryFree(pPool);
- terrno = TAOS_SYSTEM_ERROR(errno);
- return -1;
+ if (VND_IS_RSMA(pVnode)) {
+ pPool->lock = taosMemoryMalloc(sizeof(TdThreadSpinlock));
+ if (!pPool->lock) {
+ taosMemoryFree(pPool);
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
+ }
+ if (taosThreadSpinInit(pPool->lock, 0) != 0) {
+ taosMemoryFree((void*)pPool->lock);
+ taosMemoryFree(pPool);
+ terrno = TAOS_SYSTEM_ERROR(errno);
+ return -1;
+ }
+ } else {
+ pPool->lock = NULL;
}
pPool->next = NULL;
@@ -49,7 +60,10 @@ static int vnodeBufPoolCreate(SVnode *pVnode, int64_t size, SVBufPool **ppPool)
static int vnodeBufPoolDestroy(SVBufPool *pPool) {
vnodeBufPoolReset(pPool);
- taosThreadSpinDestroy(&pPool->lock);
+ if (pPool->lock) {
+ taosThreadSpinDestroy(pPool->lock);
+ taosMemoryFree((void*)pPool->lock);
+ }
taosMemoryFree(pPool);
return 0;
}
@@ -114,7 +128,7 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) {
void *p = NULL;
ASSERT(pPool != NULL);
- taosThreadSpinLock(&pPool->lock);
+ if (pPool->lock) taosThreadSpinLock(pPool->lock);
if (pPool->node.size >= pPool->ptr - pPool->node.data + size) {
// allocate from the anchor node
p = pPool->ptr;
@@ -125,7 +139,7 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) {
pNode = taosMemoryMalloc(sizeof(*pNode) + size);
if (pNode == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
- taosThreadSpinUnlock(&pPool->lock);
+ if (pPool->lock) taosThreadSpinUnlock(pPool->lock);
return NULL;
}
@@ -138,7 +152,7 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) {
pPool->size = pPool->size + sizeof(*pNode) + size;
}
- taosThreadSpinUnlock(&pPool->lock);
+ if (pPool->lock) taosThreadSpinUnlock(pPool->lock);
return p;
}
diff --git a/source/dnode/vnode/src/vnd/vnodeModule.c b/source/dnode/vnode/src/vnd/vnodeModule.c
index 9fe37505add7d2ec768233637f9da2c55f7124fb..782ffd788d27d338743447fb67954a9dd7812ba7 100644
--- a/source/dnode/vnode/src/vnd/vnodeModule.c
+++ b/source/dnode/vnode/src/vnd/vnodeModule.c
@@ -37,6 +37,12 @@ struct SVnodeGlobal vnodeGlobal;
static void* loop(void* arg);
+static tsem_t canCommit = {0};
+
+static void vnodeInitCommit() { tsem_init(&canCommit, 0, 4); };
+void vnode_wait_commit() { tsem_wait(&canCommit); }
+void vnode_done_commit() { tsem_wait(&canCommit); }
+
int vnodeInit(int nthreads) {
int8_t init;
int ret;
diff --git a/source/dnode/vnode/src/vnd/vnodeOpen.c b/source/dnode/vnode/src/vnd/vnodeOpen.c
index 8c2036b97b50cc3ebea0e85022cca3c8bcb4e805..77d375bc45d6d1f3a2e9a2276ed9e3d8f84b47f6 100644
--- a/source/dnode/vnode/src/vnd/vnodeOpen.c
+++ b/source/dnode/vnode/src/vnd/vnodeOpen.c
@@ -242,7 +242,10 @@ _err:
return NULL;
}
-void vnodePreClose(SVnode *pVnode) { vnodeSyncPreClose(pVnode); }
+void vnodePreClose(SVnode *pVnode) {
+ vnodeQueryPreClose(pVnode);
+ vnodeSyncPreClose(pVnode);
+}
void vnodeClose(SVnode *pVnode) {
if (pVnode) {
diff --git a/source/dnode/vnode/src/vnd/vnodeQuery.c b/source/dnode/vnode/src/vnd/vnodeQuery.c
index efedc12d80ff555173c57a72142f235d26246cde..8e9aab0afd129dbf1fab3d301d6da406590db3d2 100644
--- a/source/dnode/vnode/src/vnd/vnodeQuery.c
+++ b/source/dnode/vnode/src/vnd/vnodeQuery.c
@@ -28,6 +28,8 @@ int vnodeQueryOpen(SVnode *pVnode) {
return qWorkerInit(NODE_TYPE_VNODE, TD_VID(pVnode), (void **)&pVnode->pQuery, &pVnode->msgCb);
}
+void vnodeQueryPreClose(SVnode *pVnode) { qWorkerStopAllTasks((void *)pVnode->pQuery); }
+
void vnodeQueryClose(SVnode *pVnode) { qWorkerDestroy((void **)&pVnode->pQuery); }
int vnodeGetTableMeta(SVnode *pVnode, SRpcMsg *pMsg, bool direct) {
@@ -262,77 +264,55 @@ _exit:
return TSDB_CODE_SUCCESS;
}
+static FORCE_INLINE void vnodeFreeSBatchRspMsg(void* p) {
+ if (NULL == p) {
+ return;
+ }
+
+ SBatchRspMsg* pRsp = (SBatchRspMsg*)p;
+ rpcFreeCont(pRsp->msg);
+}
+
+
int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
int32_t code = 0;
- int32_t offset = 0;
int32_t rspSize = 0;
- SBatchReq *batchReq = (SBatchReq *)pMsg->pCont;
- int32_t msgNum = ntohl(batchReq->msgNum);
- offset += sizeof(SBatchReq);
- SBatchMsg req = {0};
- SBatchRsp rsp = {0};
+ SBatchReq batchReq = {0};
+ SBatchMsg *req = NULL;
+ SBatchRspMsg rsp = {0};
+ SBatchRsp batchRsp = {0};
SRpcMsg reqMsg = *pMsg;
SRpcMsg rspMsg = {0};
void *pRsp = NULL;
+ if (tDeserializeSBatchReq(pMsg->pCont, pMsg->contLen, &batchReq)) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ qError("tDeserializeSBatchReq failed");
+ goto _exit;
+ }
+
+ int32_t msgNum = taosArrayGetSize(batchReq.pMsgs);
if (msgNum >= MAX_META_MSG_IN_BATCH) {
code = TSDB_CODE_INVALID_MSG;
qError("too many msgs %d in vnode batch meta req", msgNum);
goto _exit;
}
- SArray *batchRsp = taosArrayInit(msgNum, sizeof(SBatchRsp));
- if (NULL == batchRsp) {
+ batchRsp.pRsps = taosArrayInit(msgNum, sizeof(SBatchRspMsg));
+ if (NULL == batchRsp.pRsps) {
code = TSDB_CODE_OUT_OF_MEMORY;
+ qError("taosArrayInit %d SBatchRspMsg failed", msgNum);
goto _exit;
}
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_INVALID_MSG_LEN;
- 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_INVALID_MSG_LEN;
- 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_INVALID_MSG_LEN;
- 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_INVALID_MSG_LEN;
- taosArrayDestroy(batchRsp);
- return -1;
- }
-
- req.msg = (char *)pMsg->pCont + offset;
- offset += req.msgLen;
-
- reqMsg.msgType = req.msgType;
- reqMsg.pCont = req.msg;
- reqMsg.contLen = req.msgLen;
-
- switch (req.msgType) {
+ req = taosArrayGet(batchReq.pMsgs, i);
+
+ reqMsg.msgType = req->msgType;
+ reqMsg.pCont = req->msg;
+ reqMsg.contLen = req->msgLen;
+
+ switch (req->msgType) {
case TDMT_VND_TABLE_META:
vnodeGetTableMeta(pVnode, &reqMsg, false);
break;
@@ -340,61 +320,40 @@ int32_t vnodeGetBatchMeta(SVnode *pVnode, SRpcMsg *pMsg) {
vnodeGetTableCfg(pVnode, &reqMsg, false);
break;
default:
- qError("invalid req msgType %d", req.msgType);
+ qError("invalid req msgType %d", req->msgType);
reqMsg.code = TSDB_CODE_INVALID_MSG;
reqMsg.pCont = NULL;
reqMsg.contLen = 0;
break;
}
- rsp.msgIdx = req.msgIdx;
+ rsp.msgIdx = req->msgIdx;
rsp.reqType = reqMsg.msgType;
rsp.msgLen = reqMsg.contLen;
rsp.rspCode = reqMsg.code;
rsp.msg = reqMsg.pCont;
- taosArrayPush(batchRsp, &rsp);
-
- rspSize += sizeof(rsp) + rsp.msgLen - POINTER_BYTES;
+ taosArrayPush(batchRsp.pRsps, &rsp);
}
- rspSize += sizeof(int32_t);
- offset = 0;
-
- if (rspSize > MAX_META_BATCH_RSP_SIZE) {
- qError("rspSize:%d overload", rspSize);
- code = TSDB_CODE_INVALID_MSG_LEN;
+ rspSize = tSerializeSBatchRsp(NULL, 0, &batchRsp);
+ if (rspSize < 0) {
+ qError("tSerializeSBatchRsp failed");
+ code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
-
pRsp = rpcMallocCont(rspSize);
if (pRsp == NULL) {
+ qError("rpcMallocCont %d failed", rspSize);
code = TSDB_CODE_OUT_OF_MEMORY;
goto _exit;
}
-
- *(int32_t *)((char *)pRsp + offset) = htonl(msgNum);
- offset += sizeof(msgNum);
- for (int32_t i = 0; i < msgNum; ++i) {
- SBatchRsp *p = taosArrayGet(batchRsp, i);
-
- *(int32_t *)((char *)pRsp + offset) = htonl(p->reqType);
- offset += sizeof(p->reqType);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgIdx);
- offset += sizeof(p->msgIdx);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->msgLen);
- offset += sizeof(p->msgLen);
- *(int32_t *)((char *)pRsp + offset) = htonl(p->rspCode);
- offset += sizeof(p->rspCode);
- memcpy((char *)pRsp + offset, p->msg, p->msgLen);
- offset += p->msgLen;
-
- taosMemoryFreeClear(p->msg);
+ if (tSerializeSBatchRsp(pRsp, rspSize, &batchRsp) < 0) {
+ qError("tSerializeSBatchRsp %d failed", rspSize);
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ goto _exit;
}
- taosArrayDestroy(batchRsp);
- batchRsp = NULL;
-
_exit:
rspMsg.info = pMsg->info;
@@ -407,7 +366,8 @@ _exit:
qError("vnd get batch meta failed cause of %s", tstrerror(code));
}
- taosArrayDestroyEx(batchRsp, tFreeSBatchRsp);
+ taosArrayDestroyEx(batchReq.pMsgs, tFreeSBatchReqMsg);
+ taosArrayDestroyEx(batchRsp.pRsps, tFreeSBatchRspMsg);
tmsgSendRsp(&rspMsg);
diff --git a/source/dnode/vnode/src/vnd/vnodeSvr.c b/source/dnode/vnode/src/vnd/vnodeSvr.c
index 78d95cf0d78591cc9d1f28ea0222fdc106072f61..c75d1ffded37b3651e539a3353c48b9ba35d2f68 100644
--- a/source/dnode/vnode/src/vnd/vnodeSvr.c
+++ b/source/dnode/vnode/src/vnd/vnodeSvr.c
@@ -329,7 +329,7 @@ int32_t vnodePreprocessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
return 0;
}
- return qWorkerPreprocessQueryMsg(pVnode->pQuery, pMsg);
+ return qWorkerPreprocessQueryMsg(pVnode->pQuery, pMsg, TDMT_SCH_QUERY == pMsg->msgType);
}
int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
@@ -609,6 +609,7 @@ static int32_t vnodeProcessCreateTbReq(SVnode *pVnode, int64_t version, void *pR
_exit:
for (int32_t iReq = 0; iReq < req.nReqs; iReq++) {
pCreateReq = req.pReqs + iReq;
+ taosMemoryFree(pCreateReq->comment);
taosArrayDestroy(pCreateReq->ctb.tagName);
}
taosArrayDestroyEx(rsp.pArray, tFreeSVCreateTbRsp);
@@ -945,7 +946,7 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq
sprintf(submitBlkRsp.tblFName, "%s.%s", pVnode->config.dbname, createTbReq.name);
tbCreated = true;
}
-
+
msgIter.uid = createTbReq.uid;
if (createTbReq.type == TSDB_CHILD_TABLE) {
msgIter.suid = createTbReq.ctb.suid;
@@ -958,7 +959,7 @@ static int32_t vnodeProcessSubmitReq(SVnode *pVnode, int64_t version, void *pReq
#endif
tDecoderClear(&decoder);
taosArrayDestroy(createTbReq.ctb.tagName);
- }
+ }
if (tsdbInsertTableData(pVnode->pTsdb, version, &msgIter, pBlock, &submitBlkRsp) < 0) {
submitBlkRsp.code = terrno;
@@ -1169,16 +1170,30 @@ static int32_t vnodeProcessBatchDeleteReq(SVnode *pVnode, int64_t version, void
tDecoderInit(&decoder, pReq, len);
tDecodeSBatchDeleteReq(&decoder, &deleteReq);
+ SMetaReader mr = {0};
+ metaReaderInit(&mr, pVnode->pMeta, 0);
+
int32_t sz = taosArrayGetSize(deleteReq.deleteReqs);
for (int32_t i = 0; i < sz; i++) {
SSingleDeleteReq *pOneReq = taosArrayGet(deleteReq.deleteReqs, i);
- int32_t code = tsdbDeleteTableData(pVnode->pTsdb, version, deleteReq.suid, pOneReq->uid, pOneReq->ts, pOneReq->ts);
+ char *name = pOneReq->tbname;
+ if (metaGetTableEntryByName(&mr, name) < 0) {
+ vDebug("stream delete msg, skip vgId:%d since no table: %s", pVnode->config.vgId, name);
+ continue;
+ }
+
+ int64_t uid = mr.me.uid;
+
+ int32_t code = tsdbDeleteTableData(pVnode->pTsdb, version, deleteReq.suid, uid, pOneReq->ts, pOneReq->ts);
if (code < 0) {
terrno = code;
vError("vgId:%d, delete error since %s, suid:%" PRId64 ", uid:%" PRId64 ", start ts:%" PRId64 ", end ts:%" PRId64,
- TD_VID(pVnode), terrstr(), deleteReq.suid, pOneReq->uid, pOneReq->ts, pOneReq->ts);
+ TD_VID(pVnode), terrstr(), deleteReq.suid, uid, pOneReq->ts, pOneReq->ts);
}
+
+ tDecoderClear(&mr.coder);
}
+ metaReaderClear(&mr);
taosArrayDestroy(deleteReq.deleteReqs);
return 0;
}
diff --git a/source/dnode/vnode/src/vnd/vnodeSync.c b/source/dnode/vnode/src/vnd/vnodeSync.c
index 3913561ae79b67c55f4746d153948dbff2a0fb15..38cb534d7f3e7f8343893db38b286b2da2eabdae 100644
--- a/source/dnode/vnode/src/vnd/vnodeSync.c
+++ b/source/dnode/vnode/src/vnd/vnodeSync.c
@@ -436,6 +436,28 @@ static void vnodeBecomeLeader(const SSyncFSM *pFsm) {
vDebug("vgId:%d, become leader", pVnode->config.vgId);
}
+static bool vnodeApplyQueueEmpty(const SSyncFSM *pFsm) {
+ SVnode *pVnode = pFsm->data;
+
+ if (pVnode != NULL && pVnode->msgCb.qsizeFp != NULL) {
+ int32_t itemSize = tmsgGetQueueSize(&pVnode->msgCb, pVnode->config.vgId, APPLY_QUEUE);
+ return (itemSize == 0);
+ } else {
+ return true;
+ }
+}
+
+static int32_t vnodeApplyQueueItems(const SSyncFSM *pFsm) {
+ SVnode *pVnode = pFsm->data;
+
+ if (pVnode != NULL && pVnode->msgCb.qsizeFp != NULL) {
+ int32_t itemSize = tmsgGetQueueSize(&pVnode->msgCb, pVnode->config.vgId, APPLY_QUEUE);
+ return itemSize;
+ } else {
+ return -1;
+ }
+}
+
static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
SSyncFSM *pFsm = taosMemoryCalloc(1, sizeof(SSyncFSM));
pFsm->data = pVnode;
@@ -445,6 +467,8 @@ static SSyncFSM *vnodeSyncMakeFsm(SVnode *pVnode) {
pFsm->FpGetSnapshotInfo = vnodeSyncGetSnapshot;
pFsm->FpRestoreFinishCb = vnodeRestoreFinish;
pFsm->FpLeaderTransferCb = NULL;
+ pFsm->FpApplyQueueEmptyCb = vnodeApplyQueueEmpty;
+ pFsm->FpApplyQueueItems = vnodeApplyQueueItems;
pFsm->FpBecomeLeaderCb = vnodeBecomeLeader;
pFsm->FpBecomeFollowerCb = vnodeBecomeFollower;
pFsm->FpReConfigCb = NULL;
diff --git a/source/libs/catalog/inc/catalogInt.h b/source/libs/catalog/inc/catalogInt.h
index 8c699bb59bcc97b595836c9150e01623ea808275..c95d0fe4620f7a068813701588da77d9d149a936 100644
--- a/source/libs/catalog/inc/catalogInt.h
+++ b/source/libs/catalog/inc/catalogInt.h
@@ -234,7 +234,6 @@ typedef struct SCatalog {
typedef struct SCtgBatch {
int32_t batchId;
int32_t msgType;
- int32_t msgSize;
SArray* pMsgs;
SRequestConnInfo conn;
char dbFName[TSDB_DB_FNAME_LEN];
@@ -538,7 +537,8 @@ typedef struct SCtgOperation {
(sizeof(STableMeta) + ((pMeta)->tableInfo.numOfTags + (pMeta)->tableInfo.numOfColumns) * sizeof(SSchema))
#define CTG_TABLE_NOT_EXIST(code) (code == CTG_ERR_CODE_TABLE_NOT_EXIST)
-#define CTG_DB_NOT_EXIST(code) (code == TSDB_CODE_MND_DB_NOT_EXIST)
+#define CTG_DB_NOT_EXIST(code) \
+ (code == TSDB_CODE_MND_DB_NOT_EXIST || code == TSDB_CODE_MND_DB_IN_CREATING || code == TSDB_CODE_MND_DB_IN_DROPPING)
#define ctgFatal(param, ...) qFatal("CTG:%p " param, pCtg, __VA_ARGS__)
#define ctgError(param, ...) qError("CTG:%p " param, pCtg, __VA_ARGS__)
diff --git a/source/libs/catalog/src/catalog.c b/source/libs/catalog/src/catalog.c
index 1f87066c8258948ec92199e6786ed7c20698d283..2dcd681205a6bd4cae98ddb1141e0b5744a173bc 100644
--- a/source/libs/catalog/src/catalog.c
+++ b/source/libs/catalog/src/catalog.c
@@ -715,10 +715,10 @@ _return:
CTG_API_LEAVE(code);
}
-int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum) {
+int32_t catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId, int32_t* tableNum, int64_t* pStateTs) {
CTG_API_ENTER();
- if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId) {
+ if (NULL == pCtg || NULL == dbFName || NULL == version || NULL == dbId || NULL == tableNum || NULL == pStateTs) {
CTG_API_LEAVE(TSDB_CODE_CTG_INVALID_INPUT);
}
diff --git a/source/libs/catalog/src/ctgAsync.c b/source/libs/catalog/src/ctgAsync.c
index b6018653060694d69b0a3381260f1c1c034ab9bd..2a032de003fda1db02896606b869f0f0afa1cf5e 100644
--- a/source/libs/catalog/src/ctgAsync.c
+++ b/source/libs/catalog/src/ctgAsync.c
@@ -1204,11 +1204,12 @@ int32_t ctgHandleGetTbMetasRsp(SCtgTaskReq* tReq, int32_t reqType, const SDataBu
stbCtx.flag = flag;
stbCtx.pName = &stbName;
- STableMeta *stbMeta = NULL;
+ STableMeta* stbMeta = NULL;
ctgReadTbMetaFromCache(pCtg, &stbCtx, &stbMeta);
if (stbMeta && stbMeta->sversion >= pOut->tbMeta->sversion) {
ctgDebug("use cached stb meta, tbName:%s", tNameGetTableName(pName));
exist = 1;
+ taosMemoryFreeClear(stbMeta);
} else {
ctgDebug("need to get/update stb meta, tbName:%s", tNameGetTableName(pName));
taosMemoryFreeClear(pOut->tbMeta);
@@ -1998,6 +1999,7 @@ int32_t ctgLaunchGetDbInfoTask(SCtgTask* pTask) {
pInfo->vgVer = dbCache->vgCache.vgInfo->vgVersion;
pInfo->dbId = dbCache->dbId;
pInfo->tbNum = dbCache->vgCache.vgInfo->numOfTable;
+ pInfo->stateTs = dbCache->vgCache.vgInfo->stateTs;
ctgReleaseVgInfoToCache(pCtg, dbCache);
dbCache = NULL;
diff --git a/source/libs/catalog/src/ctgCache.c b/source/libs/catalog/src/ctgCache.c
index 51807a145a343c2fe9620ea2f11a95fe5cd97e33..fa38eeba0c9d664df1dcd2f3dc313f0f89bd603e 100644
--- a/source/libs/catalog/src/ctgCache.c
+++ b/source/libs/catalog/src/ctgCache.c
@@ -72,8 +72,8 @@ void ctgRUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_READ, &dbCache->vgC
void ctgWUnlockVgInfo(SCtgDBCache *dbCache) { CTG_UNLOCK(CTG_WRITE, &dbCache->vgCache.vgLock); }
-void ctgReleaseDBCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
- CTG_UNLOCK(CTG_READ, &dbCache->dbLock);
+void ctgReleaseDBCache(SCatalog *pCtg, SCtgDBCache *dbCache) {
+ CTG_UNLOCK(CTG_READ, &dbCache->dbLock);
taosHashRelease(pCtg->dbCache, dbCache);
}
@@ -90,7 +90,7 @@ int32_t ctgAcquireDBCacheImpl(SCatalog *pCtg, const char *dbFName, SCtgDBCache *
} else {
dbCache = (SCtgDBCache *)taosHashGet(pCtg->dbCache, dbFName, strlen(dbFName));
}
-
+
if (NULL == dbCache) {
*pCache = NULL;
ctgDebug("db not in cache, dbFName:%s", dbFName);
@@ -422,6 +422,7 @@ _return:
ctgReleaseTbMetaToCache(pCtg, dbCache, tbCache);
taosMemoryFreeClear(*pTableMeta);
+ *pTableMeta = NULL;
CTG_RET(code);
}
@@ -1231,14 +1232,16 @@ int32_t ctgAddNewDBCache(SCatalog *pCtg, const char *dbFName, uint64_t dbId) {
CTG_CACHE_STAT_INC(numOfDb, 1);
- SDbVgVersion vgVersion = {.dbId = newDBCache.dbId, .vgVersion = -1};
+ SDbVgVersion vgVersion = {.dbId = newDBCache.dbId, .vgVersion = -1, .stateTs = 0};
tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
ctgDebug("db added to cache, dbFName:%s, dbId:0x%" PRIx64, dbFName, dbId);
- CTG_ERR_RET(ctgMetaRentAdd(&pCtg->dbRent, &vgVersion, dbId, sizeof(SDbVgVersion)));
+ if (!IS_SYS_DBNAME(dbFName)) {
+ CTG_ERR_RET(ctgMetaRentAdd(&pCtg->dbRent, &vgVersion, dbId, sizeof(SDbVgVersion)));
- ctgDebug("db added to rent, dbFName:%s, vgVersion:%d, dbId:0x%" PRIx64, dbFName, vgVersion.vgVersion, dbId);
+ ctgDebug("db added to rent, dbFName:%s, vgVersion:%d, dbId:0x%" PRIx64, dbFName, vgVersion.vgVersion, dbId);
+ }
return TSDB_CODE_SUCCESS;
@@ -1434,7 +1437,7 @@ int32_t ctgWriteTbMetaToCache(SCatalog *pCtg, SCtgDBCache *dbCache, char *dbFNam
if (pCache) {
CTG_ERR_RET(ctgUpdateRentStbVersion(pCtg, dbFName, tbName, dbId, meta->suid, pCache));
}
-
+
return TSDB_CODE_SUCCESS;
}
@@ -1563,7 +1566,8 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
}
bool newAdded = false;
- SDbVgVersion vgVersion = {.dbId = msg->dbId, .vgVersion = dbInfo->vgVersion, .numOfTable = dbInfo->numOfTable};
+ SDbVgVersion vgVersion = {
+ .dbId = msg->dbId, .vgVersion = dbInfo->vgVersion, .numOfTable = dbInfo->numOfTable, .stateTs = dbInfo->stateTs};
SCtgDBCache *dbCache = NULL;
CTG_ERR_JRET(ctgGetAddDBCache(msg->pCtg, dbFName, msg->dbId, &dbCache));
@@ -1579,15 +1583,17 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
SDBVgInfo *vgInfo = vgCache->vgInfo;
if (dbInfo->vgVersion < vgInfo->vgVersion) {
- ctgDebug("db vgVer is old, dbFName:%s, vgVer:%d, curVer:%d", dbFName, dbInfo->vgVersion, vgInfo->vgVersion);
+ ctgDebug("db updateVgroup is ignored, dbFName:%s, vgVer:%d, curVer:%d", dbFName, dbInfo->vgVersion,
+ vgInfo->vgVersion);
ctgWUnlockVgInfo(dbCache);
goto _return;
}
- if (dbInfo->vgVersion == vgInfo->vgVersion && dbInfo->numOfTable == vgInfo->numOfTable) {
- ctgDebug("no new db vgVer or numOfTable, dbFName:%s, vgVer:%d, numOfTable:%d", dbFName, dbInfo->vgVersion,
- dbInfo->numOfTable);
+ if (dbInfo->vgVersion == vgInfo->vgVersion && dbInfo->numOfTable == vgInfo->numOfTable &&
+ dbInfo->stateTs == vgInfo->stateTs) {
+ ctgDebug("no new db vgroup update info, dbFName:%s, vgVer:%d, numOfTable:%d, stateTs:%" PRId64, dbFName,
+ dbInfo->vgVersion, dbInfo->numOfTable, dbInfo->stateTs);
ctgWUnlockVgInfo(dbCache);
goto _return;
@@ -1599,15 +1605,18 @@ int32_t ctgOpUpdateVgroup(SCtgCacheOperation *operation) {
vgCache->vgInfo = dbInfo;
msg->dbInfo = NULL;
- ctgDebug("db vgInfo updated, dbFName:%s, vgVer:%d, dbId:0x%" PRIx64, dbFName, vgVersion.vgVersion, vgVersion.dbId);
+ ctgDebug("db vgInfo updated, dbFName:%s, vgVer:%d, stateTs:%" PRId64 ", dbId:0x%" PRIx64, dbFName,
+ vgVersion.vgVersion, vgVersion.stateTs, vgVersion.dbId);
ctgWUnlockVgInfo(dbCache);
dbCache = NULL;
- tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
- CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion),
- ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
+ if (!IS_SYS_DBNAME(dbFName)) {
+ tstrncpy(vgVersion.dbFName, dbFName, sizeof(vgVersion.dbFName));
+ CTG_ERR_JRET(ctgMetaRentUpdate(&msg->pCtg->dbRent, &vgVersion, vgVersion.dbId, sizeof(SDbVgVersion),
+ ctgDbVgVersionSortCompare, ctgDbVgVersionSearchCompare));
+ }
_return:
@@ -1688,7 +1697,7 @@ int32_t ctgOpUpdateTbMeta(SCtgCacheOperation *operation) {
if (pCtg->stopUpdate) {
goto _return;
}
-
+
if ((!CTG_IS_META_CTABLE(pMeta->metaType)) && NULL == pMeta->tbMeta) {
ctgError("no valid tbmeta got from meta rsp, dbFName:%s, tbName:%s", pMeta->dbFName, pMeta->tbName);
CTG_ERR_JRET(TSDB_CODE_CTG_INTERNAL_ERROR);
@@ -1898,7 +1907,7 @@ int32_t ctgOpUpdateEpset(SCtgCacheOperation *operation) {
int32_t code = 0;
SCtgUpdateEpsetMsg *msg = operation->data;
SCatalog *pCtg = msg->pCtg;
- SCtgDBCache *dbCache = NULL;
+ SCtgDBCache *dbCache = NULL;
if (pCtg->stopUpdate) {
goto _return;
@@ -2170,7 +2179,6 @@ void *ctgUpdateThreadFunc(void *param) {
CTG_RT_STAT_INC(numOfOpDequeue, 1);
ctgdShowCacheInfo();
- ctgdShowClusterCache(pCtg);
}
qInfo("catalog update thread stopped");
@@ -2206,6 +2214,7 @@ int32_t ctgGetTbMetaFromCache(SCatalog *pCtg, SCtgTbMetaCtx *ctx, STableMeta **p
}
taosMemoryFreeClear(*pTableMeta);
+ *pTableMeta = NULL;
}
if (CTG_FLAG_IS_UNKNOWN_STB(ctx->flag)) {
diff --git a/source/libs/catalog/src/ctgDbg.c b/source/libs/catalog/src/ctgDbg.c
index 26b5903bb0ffc3cfc4425f3f39262b88d45d373d..b6ff1c8b987278ee8ef223577e91771c12cefde8 100644
--- a/source/libs/catalog/src/ctgDbg.c
+++ b/source/libs/catalog/src/ctgDbg.c
@@ -78,7 +78,7 @@ void ctgdUserCallback(SMetaData *pResult, void *param, int32_t code) {
num = taosArrayGetSize(pResult->pDbInfo);
for (int32_t i = 0; i < num; ++i) {
SDbInfo *pDb = taosArrayGet(pResult->pDbInfo, i);
- qDebug("db %d dbInfo: vgVer:%d, tbNum:%d, dbId:0x%" PRIx64, i, pDb->vgVer, pDb->tbNum, pDb->dbId);
+ qDebug("db %d dbInfo: vgVer:%d, tbNum:%d, stateTs:%" PRId64 " dbId:0x%" PRIx64, i, pDb->vgVer, pDb->tbNum, pDb->stateTs, pDb->dbId);
}
} else {
qDebug("empty db info");
@@ -462,6 +462,7 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) {
int32_t hashMethod = -1;
int16_t hashPrefix = 0;
int16_t hashSuffix = 0;
+ int64_t stateTs = 0;
int32_t vgNum = 0;
if (dbCache->vgCache.vgInfo) {
@@ -469,16 +470,35 @@ void ctgdShowDBCache(SCatalog *pCtg, SHashObj *dbHash) {
hashMethod = dbCache->vgCache.vgInfo->hashMethod;
hashPrefix = dbCache->vgCache.vgInfo->hashPrefix;
hashSuffix = dbCache->vgCache.vgInfo->hashSuffix;
+ stateTs = dbCache->vgCache.vgInfo->stateTs;
if (dbCache->vgCache.vgInfo->vgHash) {
vgNum = taosHashGetSize(dbCache->vgCache.vgInfo->vgHash);
}
}
ctgDebug("[%d] db [%.*s][0x%" PRIx64
- "] %s: metaNum:%d, stbNum:%d, vgVersion:%d, hashMethod:%d, prefix:%d, suffix:%d, vgNum:%d",
- i, (int32_t)len, dbFName, dbCache->dbId, dbCache->deleted ? "deleted" : "", metaNum, stbNum, vgVersion,
+ "] %s: metaNum:%d, stbNum:%d, vgVersion:%d, stateTs:%" PRId64 ", hashMethod:%d, prefix:%d, suffix:%d, vgNum:%d",
+ i, (int32_t)len, dbFName, dbCache->dbId, dbCache->deleted ? "deleted" : "", metaNum, stbNum, vgVersion, stateTs,
hashMethod, hashPrefix, hashSuffix, vgNum);
+ if (dbCache->vgCache.vgInfo) {
+ int32_t i = 0;
+ void *pVgIter = taosHashIterate(dbCache->vgCache.vgInfo->vgHash, NULL);
+ while (pVgIter) {
+ SVgroupInfo * pVg = (SVgroupInfo *)pVgIter;
+
+ ctgDebug("The %04dth VG [id:%d, hashBegin:%u, hashEnd:%u, numOfTable:%d, epNum:%d, inUse:%d]",
+ i++, pVg->vgId, pVg->hashBegin, pVg->hashEnd, pVg->numOfTable, pVg->epSet.numOfEps, pVg->epSet.inUse);
+
+ for (int32_t n = 0; n < pVg->epSet.numOfEps; ++n) {
+ SEp *pEp = &pVg->epSet.eps[n];
+ ctgDebug("\tEp %d [fqdn:%s, port:%d]", n, pEp->fqdn, pEp->port);
+ }
+
+ pVgIter = taosHashIterate(dbCache->vgCache.vgInfo->vgHash, pVgIter);
+ }
+ }
+
pIter = taosHashIterate(dbHash, pIter);
}
}
diff --git a/source/libs/catalog/src/ctgRemote.c b/source/libs/catalog/src/ctgRemote.c
index 23bccb0835eee85781c4fcbfe5f152119ce5acbf..753c4ce9171a7acc6a1b5d065751b0ca32268972 100644
--- a/source/libs/catalog/src/ctgRemote.c
+++ b/source/libs/catalog/src/ctgRemote.c
@@ -26,19 +26,29 @@ int32_t ctgHandleBatchRsp(SCtgJob* pJob, SCtgTaskCallbackParam* cbParam, SDataBu
SCatalog* pCtg = pJob->pCtg;
int32_t taskNum = taosArrayGetSize(cbParam->taskId);
SDataBuf taskMsg = *pMsg;
- int32_t offset = 0;
- int32_t msgNum = (TSDB_CODE_SUCCESS == rspCode && pMsg->pData && (pMsg->len > 0)) ? ntohl(*(int32_t*)pMsg->pData) : 0;
+ int32_t msgNum = 0;
+ SBatchRsp batchRsp = {0};
+ SBatchRspMsg rsp = {0};
+ SBatchRspMsg *pRsp = NULL;
+
+ if (TSDB_CODE_SUCCESS == rspCode && pMsg->pData && (pMsg->len > 0)) {
+ if (tDeserializeSBatchRsp(pMsg->pData, pMsg->len, &batchRsp) < 0) {
+ ctgError("tDeserializeSBatchRsp failed, msgLen:%d", pMsg->len);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ msgNum = taosArrayGetSize(batchRsp.pRsps);
+ }
+
ASSERT(taskNum == msgNum || 0 == msgNum);
ctgDebug("QID:0x%" PRIx64 " ctg got batch %d rsp %s", pJob->queryId, cbParam->batchId,
TMSG_INFO(cbParam->reqType + 1));
- offset += sizeof(msgNum);
- SBatchRsp rsp = {0};
SHashObj* pBatchs = taosHashInit(taskNum, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), false, HASH_NO_LOCK);
if (NULL == pBatchs) {
ctgError("taosHashInit %d batch failed", taskNum);
- CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
for (int32_t i = 0; i < taskNum; ++i) {
@@ -46,25 +56,18 @@ int32_t ctgHandleBatchRsp(SCtgJob* pJob, SCtgTaskCallbackParam* cbParam, SDataBu
int32_t* msgIdx = taosArrayGet(cbParam->msgIdx, i);
SCtgTask* pTask = taosArrayGet(pJob->pTasks, *taskId);
if (msgNum > 0) {
- rsp.reqType = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.reqType);
- rsp.msgIdx = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.msgIdx);
- rsp.msgLen = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.msgLen);
- rsp.rspCode = ntohl(*(int32_t*)((char*)pMsg->pData + offset));
- offset += sizeof(rsp.rspCode);
- rsp.msg = ((char*)pMsg->pData) + offset;
- offset += rsp.msgLen;
-
- taskMsg.msgType = rsp.reqType;
- taskMsg.pData = rsp.msg;
- taskMsg.len = rsp.msgLen;
-
- ASSERT(rsp.msgIdx == *msgIdx);
+ pRsp = taosArrayGet(batchRsp.pRsps, i);
+
+ taskMsg.msgType = pRsp->reqType;
+ taskMsg.pData = pRsp->msg;
+ taskMsg.len = pRsp->msgLen;
+
+ ASSERT(pRsp->msgIdx == *msgIdx);
} else {
- rsp.msgIdx = *msgIdx;
- rsp.reqType = -1;
+ pRsp = &rsp;
+ pRsp->msgIdx = *msgIdx;
+ pRsp->reqType = -1;
+ pRsp->rspCode = 0;
taskMsg.msgType = -1;
taskMsg.pData = NULL;
taskMsg.len = 0;
@@ -72,20 +75,22 @@ int32_t ctgHandleBatchRsp(SCtgJob* pJob, SCtgTaskCallbackParam* cbParam, SDataBu
SCtgTaskReq tReq;
tReq.pTask = pTask;
- tReq.msgIdx = rsp.msgIdx;
+ tReq.msgIdx = pRsp->msgIdx;
SCtgMsgCtx* pMsgCtx = CTG_GET_TASK_MSGCTX(pTask, tReq.msgIdx);
pMsgCtx->pBatchs = pBatchs;
ctgDebug("QID:0x%" PRIx64 " ctg task %d idx %d start to handle rsp %s, pBatchs: %p", pJob->queryId, pTask->taskId,
- rsp.msgIdx, TMSG_INFO(taskMsg.msgType + 1), pBatchs);
+ pRsp->msgIdx, TMSG_INFO(taskMsg.msgType + 1), pBatchs);
- (*gCtgAsyncFps[pTask->type].handleRspFp)(&tReq, rsp.reqType, &taskMsg, (rsp.rspCode ? rsp.rspCode : rspCode));
+ (*gCtgAsyncFps[pTask->type].handleRspFp)(&tReq, pRsp->reqType, &taskMsg, (pRsp->rspCode ? pRsp->rspCode : rspCode));
}
CTG_ERR_JRET(ctgLaunchBatchs(pJob->pCtg, pJob, pBatchs));
_return:
+ taosArrayDestroyEx(batchRsp.pRsps, tFreeSBatchRspMsg);
+
ctgFreeBatchs(pBatchs);
CTG_RET(code);
}
@@ -481,7 +486,6 @@ int32_t ctgAddBatch(SCatalog* pCtg, int32_t vgId, SRequestConnInfo* pConn, SCtgT
if (NULL == taosArrayPush(newBatch.pMsgIdxs, &req.msgIdx)) {
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
- newBatch.msgSize = sizeof(SBatchReq) + sizeof(req) + msgSize - POINTER_BYTES;
if (vgId > 0) {
SName* pName = NULL;
@@ -533,8 +537,6 @@ int32_t ctgAddBatch(SCatalog* pCtg, int32_t vgId, SRequestConnInfo* pConn, SCtgT
CTG_ERR_JRET(TSDB_CODE_OUT_OF_MEMORY);
}
- pBatch->msgSize += sizeof(req) + msgSize - POINTER_BYTES;
-
if (vgId > 0) {
SName* pName = NULL;
if (TDMT_VND_TABLE_CFG == msgType) {
@@ -570,38 +572,35 @@ _return:
return code;
}
-int32_t ctgBuildBatchReqMsg(SCtgBatch* pBatch, int32_t vgId, void** msg) {
- *msg = taosMemoryCalloc(1, pBatch->msgSize);
- if (NULL == (*msg)) {
- CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
- }
-
- int32_t offset = 0;
+int32_t ctgBuildBatchReqMsg(SCtgBatch* pBatch, int32_t vgId, void** msg, int32_t *pSize) {
int32_t num = taosArrayGetSize(pBatch->pMsgs);
- SBatchReq* pBatchReq = (SBatchReq*)(*msg);
-
if (num >= CTG_MAX_REQ_IN_BATCH) {
qError("too many msgs %d in one batch request", num);
CTG_ERR_RET(TSDB_CODE_CTG_INVALID_INPUT);
}
- pBatchReq->header.vgId = htonl(vgId);
- pBatchReq->msgNum = htonl(num);
- offset += sizeof(SBatchReq);
-
- for (int32_t i = 0; i < num; ++i) {
- SBatchMsg* pReq = taosArrayGet(pBatch->pMsgs, i);
- *(int32_t*)((char*)(*msg) + offset) = htonl(pReq->msgIdx);
- offset += sizeof(pReq->msgIdx);
- *(int32_t*)((char*)(*msg) + offset) = htonl(pReq->msgType);
- offset += sizeof(pReq->msgType);
- *(int32_t*)((char*)(*msg) + offset) = htonl(pReq->msgLen);
- offset += sizeof(pReq->msgLen);
- memcpy((char*)(*msg) + offset, pReq->msg, pReq->msgLen);
- offset += pReq->msgLen;
+ SBatchReq batchReq = {0};
+
+ batchReq.header.vgId = vgId;
+ batchReq.pMsgs = pBatch->pMsgs;
+
+ int32_t msgSize = tSerializeSBatchReq(NULL, 0, &batchReq);
+ if (msgSize < 0) {
+ qError("tSerializeSBatchReq failed");
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+
+ *msg = taosMemoryCalloc(1, msgSize);
+ if (NULL == (*msg)) {
+ qError("calloc batchReq msg failed, size:%d", msgSize);
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
+ }
+ if (tSerializeSBatchReq(*msg, msgSize, &batchReq) < 0) {
+ qError("tSerializeSBatchReq failed");
+ CTG_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
- ASSERT(pBatch->msgSize == offset);
+ *pSize = msgSize;
qDebug("batch req %d to vg %d msg built with %d meta reqs", pBatch->batchId, vgId, num);
@@ -616,12 +615,13 @@ int32_t ctgLaunchBatchs(SCatalog* pCtg, SCtgJob* pJob, SHashObj* pBatchs) {
size_t len = 0;
int32_t* vgId = taosHashGetKey(p, &len);
SCtgBatch* pBatch = (SCtgBatch*)p;
+ int32_t msgSize = 0;
ctgDebug("QID:0x%" PRIx64 " ctg start to launch batch %d", pJob->queryId, pBatch->batchId);
- CTG_ERR_JRET(ctgBuildBatchReqMsg(pBatch, *vgId, &msg));
+ CTG_ERR_JRET(ctgBuildBatchReqMsg(pBatch, *vgId, &msg, &msgSize));
code = ctgAsyncSendMsg(pCtg, &pBatch->conn, pJob, pBatch->pTaskIds, pBatch->batchId, pBatch->pMsgIdxs,
- pBatch->dbFName, *vgId, pBatch->msgType, msg, pBatch->msgSize);
+ pBatch->dbFName, *vgId, pBatch->msgType, msg, msgSize);
pBatch->pTaskIds = NULL;
CTG_ERR_JRET(code);
diff --git a/source/libs/catalog/test/catalogTests.cpp b/source/libs/catalog/test/catalogTests.cpp
index ebf7c7baebfe4fd8105412d8e4b0fa780ad60377..5e543384ac2747005ddb40602ca778253ea1eacd 100644
--- a/source/libs/catalog/test/catalogTests.cpp
+++ b/source/libs/catalog/test/catalogTests.cpp
@@ -2486,7 +2486,8 @@ TEST(dbVgroup, getSetDbVgroupCase) {
int32_t dbVer = 0;
int64_t dbId = 0;
int32_t tbNum = 0;
- code = catalogGetDBVgVersion(pCtg, ctgTestDbname, &dbVer, &dbId, &tbNum);
+ int64_t stateTs = 0;
+ code = catalogGetDBVgVersion(pCtg, ctgTestDbname, &dbVer, &dbId, &tbNum, &stateTs);
ASSERT_EQ(code, 0);
ASSERT_EQ(dbVer, ctgTestVgVersion);
ASSERT_EQ(dbId, ctgTestDbId);
diff --git a/source/libs/command/src/command.c b/source/libs/command/src/command.c
index 76c84b3be9b2069d38666e679e59c4daa5361e11..64fec145efbf66922b37bf478cd5a52664e7a796 100644
--- a/source/libs/command/src/command.c
+++ b/source/libs/command/src/command.c
@@ -39,8 +39,7 @@ static int32_t buildRetrieveTableRsp(SSDataBlock* pBlock, int32_t numOfCols, SRe
(*pRsp)->numOfRows = htonl(pBlock->info.rows);
(*pRsp)->numOfCols = htonl(numOfCols);
- int32_t len = 0;
- blockEncode(pBlock, (*pRsp)->data, &len, numOfCols, false);
+ int32_t len = blockEncode(pBlock, (*pRsp)->data, numOfCols);
ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
return TSDB_CODE_SUCCESS;
@@ -529,7 +528,7 @@ static int32_t setCreateTBResultIntoDataBlock(SSDataBlock* pBlock, SDbCfgInfo* p
appendTableOptions(buf2, &len, pDbCfg, pCfg);
}
- varDataLen(buf2) = len;
+ varDataLen(buf2) = (len > 65535) ? 65535 : len;
colDataAppend(pCol2, 0, buf2, false);
diff --git a/source/libs/command/src/explain.c b/source/libs/command/src/explain.c
index 80a524496c2287a884e4f8b2bf4a2e4ea65c6974..915dc08c142bcff36e3e6b7fbc1306d3d3cb107f 100644
--- a/source/libs/command/src/explain.c
+++ b/source/libs/command/src/explain.c
@@ -1610,8 +1610,7 @@ int32_t qExplainGetRspFromCtx(void *ctx, SRetrieveTableRsp **pRsp) {
rsp->completed = 1;
rsp->numOfRows = htonl(rowNum);
- int32_t len = 0;
- blockEncode(pBlock, rsp->data, &len, taosArrayGetSize(pBlock->pDataBlock), 0);
+ int32_t len = blockEncode(pBlock, rsp->data, taosArrayGetSize(pBlock->pDataBlock));
ASSERT(len == rspSize - sizeof(SRetrieveTableRsp));
rsp->compLen = htonl(len);
diff --git a/source/libs/executor/inc/executorimpl.h b/source/libs/executor/inc/executorimpl.h
index dedf1630afd331d8b7f664041f7f9b4416d243aa..f179c7bd41e732d6b97a10b98109b71a8004b71d 100644
--- a/source/libs/executor/inc/executorimpl.h
+++ b/source/libs/executor/inc/executorimpl.h
@@ -87,11 +87,11 @@ typedef struct SLimit {
typedef struct STableScanAnalyzeInfo SFileBlockLoadRecorder;
typedef struct STaskCostInfo {
- int64_t created;
- int64_t start;
- uint64_t elapsedTime;
- double extractListTime;
- double groupIdMapTime;
+ int64_t created;
+ int64_t start;
+ uint64_t elapsedTime;
+ double extractListTime;
+ double groupIdMapTime;
SFileBlockLoadRecorder* pRecoder;
} STaskCostInfo;
@@ -153,7 +153,17 @@ typedef struct {
SSchemaWrapper* qsw;
} SSchemaInfo;
-typedef struct SExecTaskInfo {
+typedef struct {
+ int32_t operatorType;
+ int64_t refId;
+} SExchangeOpStopInfo;
+
+typedef struct {
+ SRWLatch lock;
+ SArray* pStopInfo;
+} STaskStopInfo;
+
+struct SExecTaskInfo {
STaskIdInfo id;
uint32_t status;
STimeWindow window;
@@ -171,7 +181,8 @@ typedef struct SExecTaskInfo {
SSubplan* pSubplan;
struct SOperatorInfo* pRoot;
SLocalFetch localFetch;
-} SExecTaskInfo;
+ STaskStopInfo stopInfo;
+};
enum {
OP_NOT_OPENED = 0x0,
@@ -184,8 +195,7 @@ enum {
typedef struct SOperatorFpSet {
__optr_open_fn_t _openFn; // DO NOT invoke this function directly
__optr_fn_t getNextFn;
- __optr_fn_t getStreamResFn; // execute the aggregate in the stream model, todo remove it
- __optr_fn_t cleanupFn; // call this function to release the allocated resources ASAP
+ __optr_fn_t cleanupFn; // call this function to release the allocated resources ASAP
__optr_close_fn_t closeFn;
__optr_encode_fn_t encodeResultRow;
__optr_decode_fn_t decodeResultRow;
@@ -229,6 +239,7 @@ typedef struct SSourceDataInfo {
int32_t index;
SRetrieveTableRsp* pRsp;
uint64_t totalRows;
+ int64_t startTime;
int32_t code;
EX_SOURCE_STATUS status;
const char* taskId;
@@ -265,6 +276,7 @@ typedef struct SExchangeInfo {
SLoadRemoteDataInfo loadInfo;
uint64_t self;
SLimitInfo limitInfo;
+ int64_t openedTs; // start exec time stamp
} SExchangeInfo;
typedef struct SScanInfo {
@@ -298,37 +310,45 @@ typedef struct {
SExprSupp* pExprSup; // expr supporter of aggregate operator
} SAggOptrPushDownInfo;
-typedef struct STableScanInfo {
+typedef struct STableMetaCacheInfo {
+ SLRUCache* pTableMetaEntryCache; // 100 by default
+ uint64_t metaFetch;
+ uint64_t cacheHit;
+} STableMetaCacheInfo;
+
+typedef struct STableScanBase {
STsdbReader* dataReader;
- SReadHandle readHandle;
- SLimitInfo limitInfo;
SFileBlockLoadRecorder readRecorder;
- SScanInfo scanInfo;
- int32_t scanTimes;
- SSDataBlock* pResBlock;
+ SQueryTableDataCond cond;
+ SAggOptrPushDownInfo pdInfo;
SColMatchInfo matchInfo;
+ SReadHandle readHandle;
SExprSupp pseudoSup;
- SQueryTableDataCond cond;
+ STableMetaCacheInfo metaCache;
int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan
int32_t dataBlockLoadFlag;
+ SLimitInfo limitInfo;
+} STableScanBase;
+
+typedef struct STableScanInfo {
+ STableScanBase base;
+ SScanInfo scanInfo;
+ int32_t scanTimes;
+ SSDataBlock* pResBlock;
SSampleExecInfo sample; // sample execution info
int32_t currentGroupId;
int32_t currentTable;
int8_t scanMode;
- SAggOptrPushDownInfo pdInfo;
int8_t assignBlockUid;
} STableScanInfo;
typedef struct STableMergeScanInfo {
- STableListInfo* tableListInfo;
int32_t tableStartIndex;
int32_t tableEndIndex;
bool hasGroupId;
uint64_t groupId;
- SArray* dataReaders; // array of tsdbReaderT*
- SArray* queryConds; // array of queryTableDataCond
- STsdbReader* pReader;
- SReadHandle readHandle;
+ SArray* queryConds; // array of queryTableDataCond
+ STableScanBase base;
int32_t bufPageSize;
uint32_t sortBufSize; // max buffer size for in-memory sort
SArray* pSortInfo;
@@ -337,27 +357,12 @@ typedef struct STableMergeScanInfo {
int64_t startTs; // sort start time
SArray* sortSourceParams;
SLimitInfo limitInfo;
- SFileBlockLoadRecorder readRecorder;
int64_t numOfRows;
SScanInfo scanInfo;
int32_t scanTimes;
- SqlFunctionCtx* pCtx; // which belongs to the direct upstream operator operator query context
- SResultRowInfo* pResultRowInfo;
- int32_t* rowEntryInfoOffset;
- SExprInfo* pExpr;
SSDataBlock* pResBlock;
- SColMatchInfo matchInfo;
- int32_t numOfOutput;
- SExprSupp pseudoSup;
- SQueryTableDataCond cond;
- int32_t scanFlag; // table scan flag to denote if it is a repeat/reverse/main scan
- int32_t dataBlockLoadFlag;
-
- // if the upstream is an interval operator, the interval info is also kept here to get the time
- // window to check if current data block needs to be loaded.
- SInterval interval;
- SSampleExecInfo sample; // sample execution info
- SSortExecInfo sortExecInfo;
+ SSampleExecInfo sample; // sample execution info
+ SSortExecInfo sortExecInfo;
} STableMergeScanInfo;
typedef struct STagScanInfo {
@@ -370,17 +375,17 @@ typedef struct STagScanInfo {
} STagScanInfo;
typedef struct SLastrowScanInfo {
- SSDataBlock* pRes;
- SReadHandle readHandle;
- void* pLastrowReader;
- SColMatchInfo matchInfo;
- int32_t* pSlotIds;
- SExprSupp pseudoExprSup;
- int32_t retrieveType;
- int32_t currentGroupIndex;
- SSDataBlock* pBufferredRes;
- SArray* pUidList;
- int32_t indexOfBufferedRes;
+ SSDataBlock* pRes;
+ SReadHandle readHandle;
+ void* pLastrowReader;
+ SColMatchInfo matchInfo;
+ int32_t* pSlotIds;
+ SExprSupp pseudoExprSup;
+ int32_t retrieveType;
+ int32_t currentGroupIndex;
+ SSDataBlock* pBufferredRes;
+ SArray* pUidList;
+ int32_t indexOfBufferedRes;
} SLastrowScanInfo;
typedef enum EStreamScanMode {
@@ -397,13 +402,6 @@ enum {
PROJECT_RETRIEVE_DONE = 0x2,
};
-typedef struct SCatchSupporter {
- SHashObj* pWindowHashTable; // quick locate the window object for each window
- SDiskbasedBuf* pDataBuf; // buffer based on blocked-wised disk file
- int32_t keySize;
- int64_t* pKeyBuf;
-} SCatchSupporter;
-
typedef struct SStreamAggSupporter {
int32_t resultRowSize; // the result buffer size for each result row, with the meta data size for each row
SSDataBlock* pScanBlock;
@@ -533,10 +531,10 @@ typedef struct SSysTableScanInfo {
} SSysTableScanInfo;
typedef struct SBlockDistInfo {
- SSDataBlock* pResBlock;
- STsdbReader* pHandle;
- SReadHandle readHandle;
- uint64_t uid; // table uid
+ SSDataBlock* pResBlock;
+ STsdbReader* pHandle;
+ SReadHandle readHandle;
+ uint64_t uid; // table uid
} SBlockDistInfo;
// todo remove this
@@ -594,7 +592,6 @@ typedef struct SStreamIntervalOperatorInfo {
SArray* pChildren;
SStreamState* pState;
SWinKey delKey;
- SHashObj* pGroupIdTbNameMap; // uint64_t -> char[TSDB_TABLE_NAME_LEN]
} SStreamIntervalOperatorInfo;
typedef struct SAggOperatorInfo {
@@ -646,9 +643,9 @@ typedef struct SGroupbyOperatorInfo {
SAggSupporter aggSup;
SArray* pGroupCols; // group by columns, SArray
SArray* pGroupColVals; // current group column values, SArray
- bool isInit; // denote if current val is initialized or not
- char* keyBuf; // group by keys for hash
- int32_t groupKeyLen; // total group by column width
+ bool isInit; // denote if current val is initialized or not
+ char* keyBuf; // group by keys for hash
+ int32_t groupKeyLen; // total group by column width
SGroupResInfo groupResInfo;
SExprSupp scalarSup;
} SGroupbyOperatorInfo;
@@ -727,7 +724,6 @@ typedef struct SStreamSessionAggOperatorInfo {
SPhysiNode* pPhyNode; // create new child
bool isFinal;
bool ignoreExpiredData;
- SHashObj* pGroupIdTbNameMap;
} SStreamSessionAggOperatorInfo;
typedef struct SStreamStateAggOperatorInfo {
@@ -743,7 +739,6 @@ typedef struct SStreamStateAggOperatorInfo {
void* pDelIterator;
SArray* pChildren; // cache for children's result;
bool ignoreExpiredData;
- SHashObj* pGroupIdTbNameMap;
} SStreamStateAggOperatorInfo;
typedef struct SStreamPartitionOperatorInfo {
@@ -782,7 +777,6 @@ typedef struct STimeSliceOperatorInfo {
SArray* pPrevRow; // SArray
SArray* pNextRow; // SArray
SArray* pLinearInfo; // SArray
- bool fillLastPoint;
bool isPrevRowSet;
bool isNextRowSet;
int32_t fillType; // fill type
@@ -836,10 +830,8 @@ typedef struct SJoinOperatorInfo {
#define OPTR_IS_OPENED(_optr) (((_optr)->status & OP_OPENED) == OP_OPENED)
#define OPTR_SET_OPENED(_optr) ((_optr)->status |= OP_OPENED)
-void doDestroyExchangeOperatorInfo(void* param);
-
-SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t streamFn,
- __optr_fn_t cleanup, __optr_close_fn_t closeFn, __optr_explain_fn_t explain);
+SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t cleanup,
+ __optr_close_fn_t closeFn, __optr_explain_fn_t explain);
int32_t operatorDummyOpenFn(SOperatorInfo* pOperator);
int32_t appendDownstream(SOperatorInfo* p, SOperatorInfo** pDownstream, int32_t num);
@@ -875,10 +867,14 @@ STimeWindow getFirstQualifiedTimeWindow(int64_t ts, STimeWindow* pWindow, SInter
int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scanFlag);
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz);
-void doSetOperatorCompleted(SOperatorInfo* pOperator);
+void doDestroyExchangeOperatorInfo(void* param);
+
+void setOperatorCompleted(SOperatorInfo* pOperator);
+void setOperatorInfo(SOperatorInfo* pOperator, const char* name, int32_t type, bool blocking, int32_t status,
+ void* pInfo, SExecTaskInfo* pTaskInfo);
void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pColMatchInfo);
-int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int32_t numOfPseudoExpr,
- SSDataBlock* pBlock, int32_t rows, const char* idStr);
+int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int32_t numOfExpr, SSDataBlock* pBlock,
+ int32_t rows, const char* idStr, STableMetaCacheInfo* pCache);
void cleanupAggSup(SAggSupporter* pAggSup);
void appendOneRowToDataBlock(SSDataBlock* pBlock, STupleHandle* pTupleHandle);
@@ -973,6 +969,7 @@ void setTaskKilled(SExecTaskInfo* pTaskInfo);
void queryCostStatis(SExecTaskInfo* pTaskInfo);
void doDestroyTask(SExecTaskInfo* pTaskInfo);
+void destroyOperatorInfo(SOperatorInfo* pOperator);
int32_t getMaximumIdleDurationSec();
/*
@@ -1018,14 +1015,15 @@ void appendOneRowToStreamSpecialBlock(SSDataBlock* pBlock, TSKEY* pStartTs, TSKE
uint64_t* pGp, void* pTbName);
void printDataBlock(SSDataBlock* pBlock, const char* flag);
uint64_t calGroupIdByData(SPartitionBySupporter* pParSup, SExprSupp* pExprSup, SSDataBlock* pBlock, int32_t rowId);
+void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock);
int32_t finalizeResultRows(SDiskbasedBuf* pBuf, SResultRowPosition* resultRowPosition, SExprSupp* pSup,
SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo);
SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSortPhysiNode* pSortPhyNode,
SExecTaskInfo* pTaskInfo);
-SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, STableListInfo* pTableListInfo,
- SReadHandle* readHandle, SExecTaskInfo* pTaskInfo);
+SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* readHandle,
+ SExecTaskInfo* pTaskInfo);
void copyUpdateDataBlock(SSDataBlock* pDest, SSDataBlock* pSource, int32_t tsColIndex);
@@ -1041,6 +1039,7 @@ int32_t setOutputBuf(SStreamState* pState, STimeWindow* win, SResultRow** pResul
int32_t releaseOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult);
int32_t saveOutputBuf(SStreamState* pState, SWinKey* pKey, SResultRow* pResult, int32_t resSize);
void getNextIntervalWindow(SInterval* pInterval, STimeWindow* tw, int32_t order);
+int32_t qAppendTaskStopInfo(SExecTaskInfo* pTaskInfo, SExchangeOpStopInfo* pInfo);
#ifdef __cplusplus
}
diff --git a/source/libs/executor/inc/tfill.h b/source/libs/executor/inc/tfill.h
index ed019be767b63b9ec641ea25b86670d1cdd4974e..2d8df81dbd5318b80258a2b71d16acf3f9880a8b 100644
--- a/source/libs/executor/inc/tfill.h
+++ b/source/libs/executor/inc/tfill.h
@@ -36,7 +36,8 @@ typedef struct SFillColInfo {
typedef struct SFillLinearInfo {
SPoint start;
SPoint end;
- bool hasNull;
+ bool isStartSet;
+ bool isEndSet;
int16_t type;
int32_t bytes;
} SFillLinearInfo;
diff --git a/source/libs/executor/inc/tsort.h b/source/libs/executor/inc/tsort.h
index 5591299d308acc0277a31f351e743d4dacf4e60f..51440a7f59567daaf3d76929628946a1d4c0544a 100644
--- a/source/libs/executor/inc/tsort.h
+++ b/source/libs/executor/inc/tsort.h
@@ -163,9 +163,10 @@ SSortExecInfo tsortGetSortExecInfo(SSortHandle* pHandle);
/**
* get proper sort buffer pages according to the row size
* @param rowSize
+ * @param numOfCols columns count that be put into page
* @return
*/
-int32_t getProperSortPageSize(size_t rowSize);
+int32_t getProperSortPageSize(size_t rowSize, uint32_t numOfCols);
#ifdef __cplusplus
}
diff --git a/source/libs/executor/src/cachescanoperator.c b/source/libs/executor/src/cachescanoperator.c
index 95d3c5cf239eb1220e3f583d2396f0353b8868e9..922ed0565334a9fef26389decb5e2bb1838ef693 100644
--- a/source/libs/executor/src/cachescanoperator.c
+++ b/source/libs/executor/src/cachescanoperator.c
@@ -93,16 +93,11 @@ SOperatorInfo* createCacherowsScanOperator(SLastRowScanPhysiNode* pScanNode, SRe
p->pCtx = createSqlFunctionCtx(p->pExprInfo, p->numOfExprs, &p->rowEntryInfoOffset);
}
- pOperator->name = "LastrowScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
+ setOperatorInfo(pOperator, "CachedRowScanOperator", QUERY_NODE_PHYSICAL_PLAN_LAST_ROW_SCAN, false, OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doScanCache, NULL, NULL, destroyLastrowScanOperator, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, doScanCache, NULL, destroyLastrowScanOperator, NULL);
pOperator->cost.openCost = 0;
return pOperator;
@@ -126,7 +121,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
uint64_t suid = tableListGetSuid(pTableList);
int32_t size = tableListGetSize(pTableList);
if (size == 0) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -172,7 +167,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
SExprSupp* pSup = &pInfo->pseudoExprSup;
int32_t code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pRes,
- pRes->info.rows, GET_TASKID(pTaskInfo));
+ pRes->info.rows, GET_TASKID(pTaskInfo), NULL);
if (code != TSDB_CODE_SUCCESS) {
pTaskInfo->code = code;
return NULL;
@@ -182,7 +177,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
pInfo->indexOfBufferedRes += 1;
return pRes;
} else {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
} else {
@@ -213,7 +208,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
if (pInfo->pseudoExprSup.numOfExprs > 0) {
SExprSupp* pSup = &pInfo->pseudoExprSup;
- STableKeyInfo* pKeyInfo = &((STableKeyInfo*)pTableList)[0];
+ STableKeyInfo* pKeyInfo = &((STableKeyInfo*)pList)[0];
pInfo->pRes->info.groupId = pKeyInfo->groupId;
if (taosArrayGetSize(pInfo->pUidList) > 0) {
@@ -221,7 +216,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
pInfo->pRes->info.uid = *(tb_uid_t*)taosArrayGet(pInfo->pUidList, 0);
code = addTagPseudoColumnData(&pInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pInfo->pRes, pInfo->pRes->info.rows,
- GET_TASKID(pTaskInfo));
+ GET_TASKID(pTaskInfo), NULL);
if (code != TSDB_CODE_SUCCESS) {
pTaskInfo->code = code;
return NULL;
@@ -234,7 +229,7 @@ SSDataBlock* doScanCache(SOperatorInfo* pOperator) {
}
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
}
@@ -251,6 +246,7 @@ void destroyLastrowScanOperator(void* param) {
pInfo->pLastrowReader = tsdbCacherowsReaderClose(pInfo->pLastrowReader);
}
+ cleanupExprSupp(&pInfo->pseudoExprSup);
taosMemoryFreeClear(param);
}
diff --git a/source/libs/executor/src/dataDispatcher.c b/source/libs/executor/src/dataDispatcher.c
index bc4ab9c468ccbcacce3eff00ebd4f4d37435d87c..3d9757c96f0e46f7c4aedd4c78833bba5f1ebdcd 100644
--- a/source/libs/executor/src/dataDispatcher.c
+++ b/source/libs/executor/src/dataDispatcher.c
@@ -76,7 +76,7 @@ static void toDataCacheEntry(SDataDispatchHandle* pHandle, const SInputData* pIn
pEntry->dataLen = 0;
pBuf->useSize = sizeof(SDataCacheEntry);
- blockEncode(pInput->pData, pEntry->data, &pEntry->dataLen, numOfCols, pEntry->compressed);
+ pEntry->dataLen = blockEncode(pInput->pData, pEntry->data, numOfCols);
ASSERT(pEntry->numOfRows == *(int32_t*)(pEntry->data + 8));
ASSERT(pEntry->numOfCols == *(int32_t*)(pEntry->data + 8 + 4));
diff --git a/source/libs/executor/src/exchangeoperator.c b/source/libs/executor/src/exchangeoperator.c
new file mode 100644
index 0000000000000000000000000000000000000000..a28066003a2a60ca9f62326ff055f5193e366695
--- /dev/null
+++ b/source/libs/executor/src/exchangeoperator.c
@@ -0,0 +1,649 @@
+/*
+ * 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 "filter.h"
+#include "function.h"
+#include "functionMgt.h"
+#include "os.h"
+#include "querynodes.h"
+#include "tfill.h"
+#include "tname.h"
+#include "tref.h"
+
+#include "tdatablock.h"
+#include "tglobal.h"
+#include "tmsg.h"
+#include "tsort.h"
+#include "ttime.h"
+
+#include "executorimpl.h"
+#include "index.h"
+#include "query.h"
+#include "tcompare.h"
+#include "thash.h"
+#include "ttypes.h"
+#include "vnode.h"
+
+typedef struct SFetchRspHandleWrapper {
+ uint32_t exchangeId;
+ int32_t sourceIndex;
+} SFetchRspHandleWrapper;
+
+static void destroyExchangeOperatorInfo(void* param);
+static void freeBlock(void* pParam);
+static void freeSourceDataInfo(void* param);
+static void* setAllSourcesCompleted(SOperatorInfo* pOperator);
+
+static int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code);
+static int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTaskInfo, int32_t sourceIndex);
+static int32_t getCompletedSources(const SArray* pArray);
+static int32_t prepareConcurrentlyLoad(SOperatorInfo* pOperator);
+static int32_t seqLoadRemoteData(SOperatorInfo* pOperator);
+static int32_t prepareLoadRemoteData(SOperatorInfo* pOperator);
+
+static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeInfo* pExchangeInfo,
+ SExecTaskInfo* pTaskInfo) {
+ int32_t code = 0;
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSourceDataInfo);
+ int32_t completed = getCompletedSources(pExchangeInfo->pSourceDataInfo);
+ if (completed == totalSources) {
+ setAllSourcesCompleted(pOperator);
+ return;
+ }
+
+ while (1) {
+ tsem_wait(&pExchangeInfo->ready);
+ if (isTaskKilled(pTaskInfo)) {
+ longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ }
+
+ for (int32_t i = 0; i < totalSources; ++i) {
+ SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, i);
+ if (pDataInfo->status == EX_SOURCE_DATA_EXHAUSTED) {
+ continue;
+ }
+
+ if (pDataInfo->status != EX_SOURCE_DATA_READY) {
+ continue;
+ }
+
+ if (pDataInfo->code != TSDB_CODE_SUCCESS) {
+ code = pDataInfo->code;
+ goto _error;
+ }
+
+ SRetrieveTableRsp* pRsp = pDataInfo->pRsp;
+ SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, i);
+
+ // todo
+ SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
+ if (pRsp->numOfRows == 0) {
+ pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
+ qDebug("%s vgId:%d, taskId:0x%" PRIx64 " execId:%d index:%d completed, rowsOfSource:%" PRIu64
+ ", totalRows:%" PRIu64 ", try next %d/%" PRIzu,
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pDataInfo->totalRows,
+ pExchangeInfo->loadInfo.totalRows, i + 1, totalSources);
+ taosMemoryFreeClear(pDataInfo->pRsp);
+ break;
+ }
+
+ SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
+ int32_t index = 0;
+ char* pStart = pRetrieveRsp->data;
+ while (index++ < pRetrieveRsp->numOfBlocks) {
+ SSDataBlock* pb = createOneDataBlock(pExchangeInfo->pDummyBlock, false);
+ code = extractDataBlockFromFetchRsp(pb, pStart, NULL, &pStart);
+ if (code != 0) {
+ taosMemoryFreeClear(pDataInfo->pRsp);
+ goto _error;
+ }
+
+ taosArrayPush(pExchangeInfo->pResultBlockList, &pb);
+ }
+
+ updateLoadRemoteInfo(pLoadInfo, pRetrieveRsp->numOfRows, pRetrieveRsp->compLen, pDataInfo->startTime, pOperator);
+ pDataInfo->totalRows += pRetrieveRsp->numOfRows;
+
+ if (pRsp->completed == 1) {
+ pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
+ qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64
+ " execId:%d index:%d completed, blocks:%d, numOfRows:%d, rowsOfSource:%" PRIu64 ", totalRows:%" PRIu64
+ ", total:%.2f Kb, try next %d/%" PRIzu,
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pRsp->numOfBlocks,
+ pRsp->numOfRows, pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0,
+ i + 1, totalSources);
+ } else {
+ qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64
+ " execId:%d blocks:%d, numOfRows:%d, totalRows:%" PRIu64 ", total:%.2f Kb",
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRsp->numOfBlocks,
+ pRsp->numOfRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0);
+ }
+
+ taosMemoryFreeClear(pDataInfo->pRsp);
+
+ if (pDataInfo->status != EX_SOURCE_DATA_EXHAUSTED) {
+ pDataInfo->status = EX_SOURCE_DATA_NOT_READY;
+ code = doSendFetchDataRequest(pExchangeInfo, pTaskInfo, i);
+ if (code != TSDB_CODE_SUCCESS) {
+ taosMemoryFreeClear(pDataInfo->pRsp);
+ goto _error;
+ }
+ }
+ return;
+ } // end loop
+
+ int32_t complete1 = getCompletedSources(pExchangeInfo->pSourceDataInfo);
+ if (complete1 == totalSources) {
+ qDebug("all sources are completed, %s", GET_TASKID(pTaskInfo));
+ return;
+ }
+ }
+
+ _error:
+ pTaskInfo->code = code;
+}
+
+static SSDataBlock* doLoadRemoteDataImpl(SOperatorInfo* pOperator) {
+ SExchangeInfo* pExchangeInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
+ if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
+ return NULL;
+ }
+
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
+
+ SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
+ if (pOperator->status == OP_EXEC_DONE) {
+ qDebug("%s all %" PRIzu " source(s) are exhausted, total rows:%" PRIu64 " bytes:%" PRIu64 ", elapsed:%.2f ms",
+ GET_TASKID(pTaskInfo), totalSources, pLoadInfo->totalRows, pLoadInfo->totalSize,
+ pLoadInfo->totalElapsed / 1000.0);
+ return NULL;
+ }
+
+ size_t size = taosArrayGetSize(pExchangeInfo->pResultBlockList);
+ if (size == 0 || pExchangeInfo->rspBlockIndex >= size) {
+ pExchangeInfo->rspBlockIndex = 0;
+ taosArrayClearEx(pExchangeInfo->pResultBlockList, freeBlock);
+ if (pExchangeInfo->seqLoadData) {
+ seqLoadRemoteData(pOperator);
+ } else {
+ concurrentlyLoadRemoteDataImpl(pOperator, pExchangeInfo, pTaskInfo);
+ }
+
+ if (taosArrayGetSize(pExchangeInfo->pResultBlockList) == 0) {
+ return NULL;
+ }
+ }
+
+ // we have buffered retrieved datablock, return it directly
+ return taosArrayGetP(pExchangeInfo->pResultBlockList, pExchangeInfo->rspBlockIndex++);
+}
+
+static SSDataBlock* doLoadRemoteData(SOperatorInfo* pOperator) {
+ SExchangeInfo* pExchangeInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ if (pOperator->status == OP_EXEC_DONE) {
+ return NULL;
+ }
+
+ while (1) {
+ SSDataBlock* pBlock = doLoadRemoteDataImpl(pOperator);
+ if (pBlock == NULL) {
+ return NULL;
+ }
+
+ SLimitInfo* pLimitInfo = &pExchangeInfo->limitInfo;
+ if (hasLimitOffsetInfo(pLimitInfo)) {
+ int32_t status = handleLimitOffset(pOperator, pLimitInfo, pBlock, false);
+ if (status == PROJECT_RETRIEVE_CONTINUE) {
+ continue;
+ } else if (status == PROJECT_RETRIEVE_DONE) {
+ size_t rows = pBlock->info.rows;
+ pExchangeInfo->limitInfo.numOfOutputRows += rows;
+
+ if (rows == 0) {
+ setOperatorCompleted(pOperator);
+ return NULL;
+ } else {
+ return pBlock;
+ }
+ }
+ } else {
+ return pBlock;
+ }
+ }
+}
+
+static int32_t initDataSource(int32_t numOfSources, SExchangeInfo* pInfo, const char* id) {
+ pInfo->pSourceDataInfo = taosArrayInit(numOfSources, sizeof(SSourceDataInfo));
+ if (pInfo->pSourceDataInfo == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ for (int32_t i = 0; i < numOfSources; ++i) {
+ SSourceDataInfo dataInfo = {0};
+ dataInfo.status = EX_SOURCE_DATA_NOT_READY;
+ dataInfo.taskId = id;
+ dataInfo.index = i;
+ SSourceDataInfo* pDs = taosArrayPush(pInfo->pSourceDataInfo, &dataInfo);
+ if (pDs == NULL) {
+ taosArrayDestroy(pInfo->pSourceDataInfo);
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+static int32_t initExchangeOperator(SExchangePhysiNode* pExNode, SExchangeInfo* pInfo, const char* id) {
+ size_t numOfSources = LIST_LENGTH(pExNode->pSrcEndPoints);
+
+ if (numOfSources == 0) {
+ qError("%s invalid number: %d of sources in exchange operator", id, (int32_t)numOfSources);
+ return TSDB_CODE_INVALID_PARA;
+ }
+
+ pInfo->pSources = taosArrayInit(numOfSources, sizeof(SDownstreamSourceNode));
+ if (pInfo->pSources == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+
+ for (int32_t i = 0; i < numOfSources; ++i) {
+ SDownstreamSourceNode* pNode = (SDownstreamSourceNode*)nodesListGetNode((SNodeList*)pExNode->pSrcEndPoints, i);
+ taosArrayPush(pInfo->pSources, pNode);
+ }
+
+ initLimitInfo(pExNode->node.pLimit, pExNode->node.pSlimit, &pInfo->limitInfo);
+ pInfo->self = taosAddRef(exchangeObjRefPool, pInfo);
+
+ return initDataSource(numOfSources, pInfo, id);
+}
+
+SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode* pExNode, SExecTaskInfo* pTaskInfo) {
+ SExchangeInfo* pInfo = taosMemoryCalloc(1, sizeof(SExchangeInfo));
+ SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
+ if (pInfo == NULL || pOperator == NULL) {
+ goto _error;
+ }
+
+ int32_t code = initExchangeOperator(pExNode, pInfo, GET_TASKID(pTaskInfo));
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
+
+ tsem_init(&pInfo->ready, 0, 0);
+ pInfo->pDummyBlock = createResDataBlock(pExNode->node.pOutputDataBlockDesc);
+ pInfo->pResultBlockList = taosArrayInit(1, POINTER_BYTES);
+
+ SExchangeOpStopInfo stopInfo = {QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, pInfo->self};
+ qAppendTaskStopInfo(pTaskInfo, &stopInfo);
+
+ pInfo->seqLoadData = false;
+ pInfo->pTransporter = pTransporter;
+
+ setOperatorInfo(pOperator, "ExchangeOperator", QUERY_NODE_PHYSICAL_PLAN_EXCHANGE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pDummyBlock->pDataBlock);
+
+ pOperator->fpSet = createOperatorFpSet(prepareLoadRemoteData, doLoadRemoteData, NULL, destroyExchangeOperatorInfo, NULL);
+ return pOperator;
+
+ _error:
+ if (pInfo != NULL) {
+ doDestroyExchangeOperatorInfo(pInfo);
+ }
+
+ taosMemoryFreeClear(pOperator);
+ pTaskInfo->code = code;
+ return NULL;
+}
+
+void destroyExchangeOperatorInfo(void* param) {
+ SExchangeInfo* pExInfo = (SExchangeInfo*)param;
+ taosRemoveRef(exchangeObjRefPool, pExInfo->self);
+}
+
+void freeBlock(void* pParam) {
+ SSDataBlock* pBlock = *(SSDataBlock**)pParam;
+ blockDataDestroy(pBlock);
+}
+
+void freeSourceDataInfo(void* p) {
+ SSourceDataInfo* pInfo = (SSourceDataInfo*)p;
+ taosMemoryFreeClear(pInfo->pRsp);
+}
+
+void doDestroyExchangeOperatorInfo(void* param) {
+ SExchangeInfo* pExInfo = (SExchangeInfo*)param;
+
+ taosArrayDestroy(pExInfo->pSources);
+ taosArrayDestroyEx(pExInfo->pSourceDataInfo, freeSourceDataInfo);
+
+ if (pExInfo->pResultBlockList != NULL) {
+ taosArrayDestroyEx(pExInfo->pResultBlockList, freeBlock);
+ pExInfo->pResultBlockList = NULL;
+ }
+
+ blockDataDestroy(pExInfo->pDummyBlock);
+
+ tsem_destroy(&pExInfo->ready);
+ taosMemoryFreeClear(param);
+}
+
+int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code) {
+ SFetchRspHandleWrapper* pWrapper = (SFetchRspHandleWrapper*)param;
+
+ SExchangeInfo* pExchangeInfo = taosAcquireRef(exchangeObjRefPool, pWrapper->exchangeId);
+ if (pExchangeInfo == NULL) {
+ qWarn("failed to acquire exchange operator, since it may have been released");
+ taosMemoryFree(pMsg->pData);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ int32_t index = pWrapper->sourceIndex;
+ SSourceDataInfo* pSourceDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, index);
+
+ if (code == TSDB_CODE_SUCCESS) {
+ pSourceDataInfo->pRsp = pMsg->pData;
+
+ SRetrieveTableRsp* pRsp = pSourceDataInfo->pRsp;
+ pRsp->numOfRows = htonl(pRsp->numOfRows);
+ pRsp->compLen = htonl(pRsp->compLen);
+ pRsp->numOfCols = htonl(pRsp->numOfCols);
+ pRsp->useconds = htobe64(pRsp->useconds);
+ pRsp->numOfBlocks = htonl(pRsp->numOfBlocks);
+
+ ASSERT(pRsp != NULL);
+ qDebug("%s fetch rsp received, index:%d, blocks:%d, rows:%d", pSourceDataInfo->taskId, index, pRsp->numOfBlocks,
+ pRsp->numOfRows);
+ } else {
+ taosMemoryFree(pMsg->pData);
+ pSourceDataInfo->code = code;
+ qDebug("%s fetch rsp received, index:%d, error:%s", pSourceDataInfo->taskId, index, tstrerror(code));
+ }
+
+ pSourceDataInfo->status = EX_SOURCE_DATA_READY;
+
+ tsem_post(&pExchangeInfo->ready);
+ taosReleaseRef(exchangeObjRefPool, pWrapper->exchangeId);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTaskInfo, int32_t sourceIndex) {
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
+
+ SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, sourceIndex);
+ SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, sourceIndex);
+ pDataInfo->startTime = taosGetTimestampUs();
+
+ ASSERT(pDataInfo->status == EX_SOURCE_DATA_NOT_READY);
+
+ SFetchRspHandleWrapper* pWrapper = taosMemoryCalloc(1, sizeof(SFetchRspHandleWrapper));
+ pWrapper->exchangeId = pExchangeInfo->self;
+ pWrapper->sourceIndex = sourceIndex;
+
+ if (pSource->localExec) {
+ SDataBuf pBuf = {0};
+ int32_t code =
+ (*pTaskInfo->localFetch.fp)(pTaskInfo->localFetch.handle, pSource->schedId, pTaskInfo->id.queryId,
+ pSource->taskId, 0, pSource->execId, &pBuf.pData, pTaskInfo->localFetch.explainRes);
+ loadRemoteDataCallback(pWrapper, &pBuf, code);
+ taosMemoryFree(pWrapper);
+ } else {
+ SResFetchReq* pMsg = taosMemoryCalloc(1, sizeof(SResFetchReq));
+ if (NULL == pMsg) {
+ pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ taosMemoryFree(pWrapper);
+ return pTaskInfo->code;
+ }
+
+ qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", execId:%d, %d/%" PRIzu,
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epSet.eps[0].fqdn, pSource->taskId,
+ pSource->execId, sourceIndex, totalSources);
+
+ pMsg->header.vgId = htonl(pSource->addr.nodeId);
+ pMsg->sId = htobe64(pSource->schedId);
+ pMsg->taskId = htobe64(pSource->taskId);
+ pMsg->queryId = htobe64(pTaskInfo->id.queryId);
+ pMsg->execId = htonl(pSource->execId);
+
+ // send the fetch remote task result reques
+ SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
+ if (NULL == pMsgSendInfo) {
+ taosMemoryFreeClear(pMsg);
+ taosMemoryFree(pWrapper);
+ qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
+ pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
+ return pTaskInfo->code;
+ }
+
+ pMsgSendInfo->param = pWrapper;
+ pMsgSendInfo->paramFreeFp = taosMemoryFree;
+ pMsgSendInfo->msgInfo.pData = pMsg;
+ pMsgSendInfo->msgInfo.len = sizeof(SResFetchReq);
+ pMsgSendInfo->msgType = pSource->fetchMsgType;
+ pMsgSendInfo->fp = loadRemoteDataCallback;
+
+ int64_t transporterId = 0;
+ int32_t code =
+ asyncSendMsgToServer(pExchangeInfo->pTransporter, &pSource->addr.epSet, &transporterId, pMsgSendInfo);
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int32_t numOfRows, int32_t dataLen, int64_t startTs,
+ SOperatorInfo* pOperator) {
+ pInfo->totalRows += numOfRows;
+ pInfo->totalSize += dataLen;
+ pInfo->totalElapsed += (taosGetTimestampUs() - startTs);
+ pOperator->resultInfo.totalRows += numOfRows;
+}
+
+int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, SArray* pColList, char** pNextStart) {
+ if (pColList == NULL) { // data from other sources
+ blockDataCleanup(pRes);
+ *pNextStart = (char*)blockDecode(pRes, pData);
+ } else { // extract data according to pColList
+ char* pStart = pData;
+
+ int32_t numOfCols = htonl(*(int32_t*)pStart);
+ pStart += sizeof(int32_t);
+
+ // todo refactor:extract method
+ SSysTableSchema* pSchema = (SSysTableSchema*)pStart;
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SSysTableSchema* p = (SSysTableSchema*)pStart;
+
+ p->colId = htons(p->colId);
+ p->bytes = htonl(p->bytes);
+ pStart += sizeof(SSysTableSchema);
+ }
+
+ SSDataBlock* pBlock = createDataBlock();
+ for (int32_t i = 0; i < numOfCols; ++i) {
+ SColumnInfoData idata = createColumnInfoData(pSchema[i].type, pSchema[i].bytes, pSchema[i].colId);
+ blockDataAppendColInfo(pBlock, &idata);
+ }
+
+ blockDecode(pBlock, pStart);
+ blockDataEnsureCapacity(pRes, pBlock->info.rows);
+
+ // data from mnode
+ pRes->info.rows = pBlock->info.rows;
+ relocateColumnData(pRes, pColList, pBlock->pDataBlock, false);
+ blockDataDestroy(pBlock);
+ }
+
+ // todo move this to time window aggregator, since the primary timestamp may not be known by exchange operator.
+ blockDataUpdateTsWindow(pRes, 0);
+ return TSDB_CODE_SUCCESS;
+}
+
+void* setAllSourcesCompleted(SOperatorInfo* pOperator) {
+ SExchangeInfo* pExchangeInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
+ qDebug("%s all %" PRIzu " sources are exhausted, total rows: %" PRIu64 ", %.2f Kb, elapsed:%.2f ms",
+ GET_TASKID(pTaskInfo), totalSources, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0,
+ pLoadInfo->totalElapsed / 1000.0);
+
+ setOperatorCompleted(pOperator);
+ return NULL;
+}
+
+int32_t getCompletedSources(const SArray* pArray) {
+ size_t total = taosArrayGetSize(pArray);
+
+ int32_t completed = 0;
+ for (int32_t k = 0; k < total; ++k) {
+ SSourceDataInfo* p = taosArrayGet(pArray, k);
+ if (p->status == EX_SOURCE_DATA_EXHAUSTED) {
+ completed += 1;
+ }
+ }
+
+ return completed;
+}
+
+int32_t prepareConcurrentlyLoad(SOperatorInfo* pOperator) {
+ SExchangeInfo* pExchangeInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
+ int64_t startTs = taosGetTimestampUs();
+
+ // Asynchronously send all fetch requests to all sources.
+ for (int32_t i = 0; i < totalSources; ++i) {
+ int32_t code = doSendFetchDataRequest(pExchangeInfo, pTaskInfo, i);
+ if (code != TSDB_CODE_SUCCESS) {
+ pTaskInfo->code = code;
+ return code;
+ }
+ }
+
+ int64_t endTs = taosGetTimestampUs();
+ qDebug("%s send all fetch requests to %" PRIzu " sources completed, elapsed:%.2fms", GET_TASKID(pTaskInfo),
+ totalSources, (endTs - startTs) / 1000.0);
+
+ pOperator->status = OP_RES_TO_RETURN;
+ pOperator->cost.openCost = taosGetTimestampUs() - startTs;
+
+ tsem_wait(&pExchangeInfo->ready);
+ if (isTaskKilled(pTaskInfo)) {
+ longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ }
+
+ tsem_post(&pExchangeInfo->ready);
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
+ SExchangeInfo* pExchangeInfo = pOperator->info;
+ SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
+
+ size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
+ int64_t startTs = taosGetTimestampUs();
+
+ while (1) {
+ if (pExchangeInfo->current >= totalSources) {
+ setAllSourcesCompleted(pOperator);
+ return TSDB_CODE_SUCCESS;
+ }
+
+ doSendFetchDataRequest(pExchangeInfo, pTaskInfo, pExchangeInfo->current);
+ tsem_wait(&pExchangeInfo->ready);
+ if (isTaskKilled(pTaskInfo)) {
+ longjmp(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
+ }
+
+ SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, pExchangeInfo->current);
+ SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, pExchangeInfo->current);
+
+ if (pDataInfo->code != TSDB_CODE_SUCCESS) {
+ qError("%s vgId:%d, taskID:0x%" PRIx64 " execId:%d error happens, code:%s", GET_TASKID(pTaskInfo),
+ pSource->addr.nodeId, pSource->taskId, pSource->execId, tstrerror(pDataInfo->code));
+ pOperator->pTaskInfo->code = pDataInfo->code;
+ return pOperator->pTaskInfo->code;
+ }
+
+ SRetrieveTableRsp* pRsp = pDataInfo->pRsp;
+ SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
+ if (pRsp->numOfRows == 0) {
+ qDebug("%s vgId:%d, taskID:0x%" PRIx64 " execId:%d %d of total completed, rowsOfSource:%" PRIu64
+ ", totalRows:%" PRIu64 " try next",
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pExchangeInfo->current + 1,
+ pDataInfo->totalRows, pLoadInfo->totalRows);
+
+ pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
+ pExchangeInfo->current += 1;
+ taosMemoryFreeClear(pDataInfo->pRsp);
+ continue;
+ }
+
+ SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
+
+ char* pStart = pRetrieveRsp->data;
+ int32_t code = extractDataBlockFromFetchRsp(NULL, pStart, NULL, &pStart);
+
+ if (pRsp->completed == 1) {
+ qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%d, rowsOfSource:%" PRIu64
+ ", totalRows:%" PRIu64 ", totalBytes:%" PRIu64 " try next %d/%" PRIzu,
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRetrieveRsp->numOfRows,
+ pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize, pExchangeInfo->current + 1,
+ totalSources);
+
+ pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
+ pExchangeInfo->current += 1;
+ } else {
+ qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%d, totalRows:%" PRIu64
+ ", totalBytes:%" PRIu64,
+ GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRetrieveRsp->numOfRows,
+ pLoadInfo->totalRows, pLoadInfo->totalSize);
+ }
+
+ updateLoadRemoteInfo(pLoadInfo, pRetrieveRsp->numOfRows, pRetrieveRsp->compLen, startTs, pOperator);
+ pDataInfo->totalRows += pRetrieveRsp->numOfRows;
+
+ taosMemoryFreeClear(pDataInfo->pRsp);
+ return TSDB_CODE_SUCCESS;
+ }
+}
+
+int32_t prepareLoadRemoteData(SOperatorInfo* pOperator) {
+ if (OPTR_IS_OPENED(pOperator)) {
+ return TSDB_CODE_SUCCESS;
+ }
+
+ int64_t st = taosGetTimestampUs();
+
+ SExchangeInfo* pExchangeInfo = pOperator->info;
+ if (!pExchangeInfo->seqLoadData) {
+ int32_t code = prepareConcurrentlyLoad(pOperator);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+ pExchangeInfo->openedTs = taosGetTimestampUs();
+ }
+
+ OPTR_SET_OPENED(pOperator);
+ pOperator->cost.openCost = (taosGetTimestampUs() - st) / 1000.0;
+ return TSDB_CODE_SUCCESS;
+}
diff --git a/source/libs/executor/src/executor.c b/source/libs/executor/src/executor.c
index 1cf01c8661aab1d2e869f70efde0f8b35e1dde14..7dad9245d5efde4ed93e116f09e9ea46d7b92ad4 100644
--- a/source/libs/executor/src/executor.c
+++ b/source/libs/executor/src/executor.c
@@ -246,7 +246,9 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* readers, int32_t* n
}
}
- *pSchema = tCloneSSchemaWrapper(((SExecTaskInfo*)pTaskInfo)->schemaInfo.qsw);
+ if (pSchema) {
+ *pSchema = tCloneSSchemaWrapper(((SExecTaskInfo*)pTaskInfo)->schemaInfo.qsw);
+ }
return pTaskInfo;
}
@@ -659,6 +661,54 @@ int32_t qExecTask(qTaskInfo_t tinfo, SSDataBlock** pRes, uint64_t* useconds) {
return pTaskInfo->code;
}
+int32_t qAppendTaskStopInfo(SExecTaskInfo* pTaskInfo, SExchangeOpStopInfo* pInfo) {
+ taosWLockLatch(&pTaskInfo->stopInfo.lock);
+ taosArrayPush(pTaskInfo->stopInfo.pStopInfo, pInfo);
+ taosWUnLockLatch(&pTaskInfo->stopInfo.lock);
+
+ return TSDB_CODE_SUCCESS;
+}
+
+int32_t stopInfoComp(void const* lp, void const* rp) {
+ SExchangeOpStopInfo* key = (SExchangeOpStopInfo*)lp;
+ SExchangeOpStopInfo* pInfo = (SExchangeOpStopInfo*)rp;
+
+ if (key->refId < pInfo->refId) {
+ return -1;
+ } else if (key->refId > pInfo->refId) {
+ return 1;
+ }
+
+ return 0;
+}
+
+void qRemoveTaskStopInfo(SExecTaskInfo* pTaskInfo, SExchangeOpStopInfo* pInfo) {
+ taosWLockLatch(&pTaskInfo->stopInfo.lock);
+ int32_t idx = taosArraySearchIdx(pTaskInfo->stopInfo.pStopInfo, pInfo, stopInfoComp, TD_EQ);
+ if (idx >= 0) {
+ taosArrayRemove(pTaskInfo->stopInfo.pStopInfo, idx);
+ }
+ taosWUnLockLatch(&pTaskInfo->stopInfo.lock);
+
+ return;
+}
+
+void qStopTaskOperators(SExecTaskInfo* pTaskInfo) {
+ taosWLockLatch(&pTaskInfo->stopInfo.lock);
+
+ int32_t num = taosArrayGetSize(pTaskInfo->stopInfo.pStopInfo);
+ for (int32_t i = 0; i < num; ++i) {
+ SExchangeOpStopInfo* pStop = taosArrayGet(pTaskInfo->stopInfo.pStopInfo, i);
+ SExchangeInfo* pExchangeInfo = taosAcquireRef(exchangeObjRefPool, pStop->refId);
+ if (pExchangeInfo) {
+ tsem_post(&pExchangeInfo->ready);
+ taosReleaseRef(exchangeObjRefPool, pStop->refId);
+ }
+ }
+
+ taosWUnLockLatch(&pTaskInfo->stopInfo.lock);
+}
+
int32_t qAsyncKillTask(qTaskInfo_t qinfo) {
SExecTaskInfo* pTaskInfo = (SExecTaskInfo*)qinfo;
@@ -667,7 +717,11 @@ int32_t qAsyncKillTask(qTaskInfo_t qinfo) {
}
qDebug("%s execTask async killed", GET_TASKID(pTaskInfo));
+
setTaskKilled(pTaskInfo);
+
+ qStopTaskOperators(pTaskInfo);
+
return TSDB_CODE_SUCCESS;
}
@@ -972,8 +1026,8 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
SStreamScanInfo* pInfo = pOperator->info;
if (pOffset->type == TMQ_OFFSET__LOG) {
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
- tsdbReaderClose(pTSInfo->dataReader);
- pTSInfo->dataReader = NULL;
+ tsdbReaderClose(pTSInfo->base.dataReader);
+ pTSInfo->base.dataReader = NULL;
#if 0
if (tOffsetEqual(pOffset, &pTaskInfo->streamInfo.lastStatus) &&
pInfo->tqReader->pWalReader->curVersion != pOffset->version) {
@@ -1025,23 +1079,23 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
// TODO after dropping table, table may not found
ASSERT(found);
- if (pTableScanInfo->dataReader == NULL) {
+ if (pTableScanInfo->base.dataReader == NULL) {
STableKeyInfo* pList = tableListGetInfo(pTaskInfo->pTableInfoList, 0);
int32_t num = tableListGetSize(pTaskInfo->pTableInfoList);
- if (tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &pTableScanInfo->cond, pList, num,
- &pTableScanInfo->dataReader, NULL) < 0 ||
- pTableScanInfo->dataReader == NULL) {
+ if (tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &pTableScanInfo->base.cond, pList, num,
+ &pTableScanInfo->base.dataReader, NULL) < 0 ||
+ pTableScanInfo->base.dataReader == NULL) {
ASSERT(0);
}
}
STableKeyInfo tki = {.uid = uid};
- tsdbSetTableList(pTableScanInfo->dataReader, &tki, 1);
- int64_t oldSkey = pTableScanInfo->cond.twindows.skey;
- pTableScanInfo->cond.twindows.skey = ts + 1;
- tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
- pTableScanInfo->cond.twindows.skey = oldSkey;
+ tsdbSetTableList(pTableScanInfo->base.dataReader, &tki, 1);
+ int64_t oldSkey = pTableScanInfo->base.cond.twindows.skey;
+ pTableScanInfo->base.cond.twindows.skey = ts + 1;
+ tsdbReaderReset(pTableScanInfo->base.dataReader, &pTableScanInfo->base.cond);
+ pTableScanInfo->base.cond.twindows.skey = oldSkey;
pTableScanInfo->scanTimes = 0;
qDebug("tsdb reader offset seek to uid %" PRId64 " ts %" PRId64 ", table cur set to %d , all table num %d", uid,
@@ -1106,3 +1160,24 @@ int32_t qStreamPrepareScan(qTaskInfo_t tinfo, STqOffsetVal* pOffset, int8_t subT
}
return 0;
}
+
+void qProcessRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
+ SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->info.ahandle;
+ assert(pMsg->info.ahandle != NULL);
+
+ SDataBuf buf = {.len = pMsg->contLen, .pData = NULL};
+
+ if (pMsg->contLen > 0) {
+ buf.pData = taosMemoryCalloc(1, pMsg->contLen);
+ if (buf.pData == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
+ } else {
+ memcpy(buf.pData, pMsg->pCont, pMsg->contLen);
+ }
+ }
+
+ pSendInfo->fp(pSendInfo->param, &buf, pMsg->code);
+ rpcFreeCont(pMsg->pCont);
+ destroySendMsgInfo(pSendInfo);
+}
diff --git a/source/libs/executor/src/executorimpl.c b/source/libs/executor/src/executorimpl.c
index 7e93232e0ce8c2ad85a9f72e6b971de078e3ec51..a7e955100c3b6f9cbae3f4c0ca60504a3d5e646d 100644
--- a/source/libs/executor/src/executorimpl.c
+++ b/source/libs/executor/src/executorimpl.c
@@ -20,7 +20,6 @@
#include "querynodes.h"
#include "tfill.h"
#include "tname.h"
-#include "tref.h"
#include "tdatablock.h"
#include "tglobal.h"
@@ -32,7 +31,6 @@
#include "index.h"
#include "query.h"
#include "tcompare.h"
-#include "tcompression.h"
#include "thash.h"
#include "ttypes.h"
#include "vnode.h"
@@ -91,11 +89,8 @@ static void destroySortOperatorInfo(void* param);
static void destroyAggOperatorInfo(void* param);
static void destroyIntervalOperatorInfo(void* param);
-static void destroyExchangeOperatorInfo(void* param);
-static void destroyOperatorInfo(SOperatorInfo* pOperator);
-
-void doSetOperatorCompleted(SOperatorInfo* pOperator) {
+void setOperatorCompleted(SOperatorInfo* pOperator) {
pOperator->status = OP_EXEC_DONE;
ASSERT(pOperator->pTaskInfo != NULL);
@@ -103,18 +98,27 @@ void doSetOperatorCompleted(SOperatorInfo* pOperator) {
setTaskStatus(pOperator->pTaskInfo, TASK_COMPLETED);
}
+void setOperatorInfo(SOperatorInfo* pOperator, const char* name, int32_t type, bool blocking, int32_t status,
+ void* pInfo, SExecTaskInfo* pTaskInfo) {
+ pOperator->name = (char*)name;
+ pOperator->operatorType = type;
+ pOperator->blocking = blocking;
+ pOperator->status = status;
+ pOperator->info = pInfo;
+ pOperator->pTaskInfo = pTaskInfo;
+}
+
int32_t operatorDummyOpenFn(SOperatorInfo* pOperator) {
OPTR_SET_OPENED(pOperator);
pOperator->cost.openCost = 0;
return TSDB_CODE_SUCCESS;
}
-SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t streamFn,
- __optr_fn_t cleanup, __optr_close_fn_t closeFn, __optr_explain_fn_t explain) {
+SOperatorFpSet createOperatorFpSet(__optr_open_fn_t openFn, __optr_fn_t nextFn, __optr_fn_t cleanup,
+ __optr_close_fn_t closeFn, __optr_explain_fn_t explain) {
SOperatorFpSet fpSet = {
._openFn = openFn,
.getNextFn = nextFn,
- .getStreamResFn = streamFn,
.cleanupFn = cleanup,
.closeFn = closeFn,
.getExplainFn = explain,
@@ -129,45 +133,6 @@ static int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock,
static void initCtxOutputBuffer(SqlFunctionCtx* pCtx, int32_t size);
static void doSetTableGroupOutputBuf(SOperatorInfo* pOperator, int32_t numOfOutput, uint64_t groupId);
-#if 0
-static bool chkResultRowFromKey(STaskRuntimeEnv* pRuntimeEnv, SResultRowInfo* pResultRowInfo, char* pData,
- int16_t bytes, bool masterscan, uint64_t uid) {
- bool existed = false;
- SET_RES_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, uid);
-
- SResultRow** p1 =
- (SResultRow**)taosHashGet(pRuntimeEnv->pResultRowHashTable, pRuntimeEnv->keyBuf, GET_RES_WINDOW_KEY_LEN(bytes));
-
- // in case of repeat scan/reverse scan, no new time window added.
- if (QUERY_IS_INTERVAL_QUERY(pRuntimeEnv->pQueryAttr)) {
- if (!masterscan) { // the *p1 may be NULL in case of sliding+offset exists.
- return p1 != NULL;
- }
-
- if (p1 != NULL) {
- if (pResultRowInfo->size == 0) {
- existed = false;
- } else if (pResultRowInfo->size == 1) {
- // existed = (pResultRowInfo->pResult[0] == (*p1));
- } else { // check if current pResultRowInfo contains the existed pResultRow
- SET_RES_EXT_WINDOW_KEY(pRuntimeEnv->keyBuf, pData, bytes, uid, pResultRowInfo);
- int64_t* index =
- taosHashGet(pRuntimeEnv->pResultRowListSet, pRuntimeEnv->keyBuf, GET_RES_EXT_WINDOW_KEY_LEN(bytes));
- if (index != NULL) {
- existed = true;
- } else {
- existed = false;
- }
- }
- }
-
- return existed;
- }
-
- return p1 != NULL;
-}
-#endif
-
SResultRow* getNewResultRow(SDiskbasedBuf* pResultBuf, int32_t* currentPageId, int32_t interBufSize) {
SFilePage* pData = NULL;
@@ -654,7 +619,11 @@ int32_t projectApplyFunctions(SExprInfo* pExpr, SSDataBlock* pResult, SSDataBloc
pfCtx->pDstBlock = pResult;
}
- numOfRows = pfCtx->fpSet.process(pfCtx);
+ int32_t code = pfCtx->fpSet.process(pfCtx);
+ if (code != TSDB_CODE_SUCCESS) {
+ return code;
+ }
+ numOfRows = pResInfo->numOfRes;
} else if (fmIsAggFunc(pfCtx->functionId)) {
// selective value output should be set during corresponding function execution
if (fmIsSelectValueFunc(pfCtx->functionId)) {
@@ -819,7 +788,7 @@ bool isTaskKilled(SExecTaskInfo* pTaskInfo) {
// abort current query execution.
if (pTaskInfo->owner != 0 &&
((taosGetTimestampSec() - pTaskInfo->cost.start / 1000) > 10 * getMaximumIdleDurationSec())
- /*(!needBuildResAfterQueryComplete(pTaskInfo))*/) {
+ /*(!needBuildResAfterQueryComplete(pTaskInfo))*/) {
assert(pTaskInfo->cost.start != 0);
// qDebug("QInfo:%" PRIu64 " retrieve not arrive beyond %d ms, abort current query execution, start:%" PRId64
// ", current:%d", pQInfo->qId, 1, pQInfo->startExecTs, taosGetTimestampSec());
@@ -991,12 +960,6 @@ int32_t loadDataBlockOnDemand(SExecTaskInfo* pTaskInfo, STableScanInfo* pTableSc
return TSDB_CODE_SUCCESS;
}
-static void updateTableQueryInfoForReverseScan(STableQueryInfo* pTableQueryInfo) {
- if (pTableQueryInfo == NULL) {
- return;
- }
-}
-
void setTaskStatus(SExecTaskInfo* pTaskInfo, int8_t status) {
if (status == TASK_NOT_COMPLETED) {
pTaskInfo->status = status;
@@ -1045,7 +1008,7 @@ void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pCol
}
SFilterColumnParam param1 = {.numOfCols = taosArrayGetSize(pBlock->pDataBlock), .pDataBlock = pBlock->pDataBlock};
- int32_t code = filterSetDataFromSlotId(pFilterInfo, ¶m1);
+ int32_t code = filterSetDataFromSlotId(pFilterInfo, ¶m1);
SColumnInfoData* p = NULL;
int32_t status = 0;
@@ -1055,7 +1018,7 @@ void doFilter(SSDataBlock* pBlock, SFilterInfo* pFilterInfo, SColMatchInfo* pCol
extractQualifiedTupleByFilterResult(pBlock, p, keep, status);
if (pColMatchInfo != NULL) {
- size_t size = taosArrayGetSize(pColMatchInfo->pList);
+ size_t size = taosArrayGetSize(pColMatchInfo->pList);
for (int32_t i = 0; i < size; ++i) {
SColMatchItem* pInfo = taosArrayGet(pColMatchInfo->pList, i);
if (pInfo->colId == PRIMARYKEY_TIMESTAMP_COL_ID) {
@@ -1327,27 +1290,14 @@ void doBuildStreamResBlock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGr
pBlock->info.groupId = 0;
ASSERT(!pbInfo->mergeResultBlock);
doCopyToSDataBlock(pTaskInfo, pBlock, &pOperator->exprSupp, pBuf, pGroupResInfo);
- 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;
- }
+ void* tbname = NULL;
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ pBlock->info.parTbName[0] = 0;
+ } else {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
+ tdbFree(tbname);
}
void doBuildResultDatablock(SOperatorInfo* pOperator, SOptrBasicInfo* pbInfo, SGroupResInfo* pGroupResInfo,
@@ -1653,632 +1603,9 @@ int32_t appendDownstream(SOperatorInfo* p, SOperatorInfo** pDownstream, int32_t
return TSDB_CODE_SUCCESS;
}
-typedef struct SFetchRspHandleWrapper {
- uint32_t exchangeId;
- int32_t sourceIndex;
-} SFetchRspHandleWrapper;
-
-int32_t loadRemoteDataCallback(void* param, SDataBuf* pMsg, int32_t code) {
- SFetchRspHandleWrapper* pWrapper = (SFetchRspHandleWrapper*)param;
-
- SExchangeInfo* pExchangeInfo = taosAcquireRef(exchangeObjRefPool, pWrapper->exchangeId);
- if (pExchangeInfo == NULL) {
- qWarn("failed to acquire exchange operator, since it may have been released");
- taosMemoryFree(pMsg->pData);
- return TSDB_CODE_SUCCESS;
- }
-
- int32_t index = pWrapper->sourceIndex;
- SSourceDataInfo* pSourceDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, index);
-
- if (code == TSDB_CODE_SUCCESS) {
- pSourceDataInfo->pRsp = pMsg->pData;
-
- SRetrieveTableRsp* pRsp = pSourceDataInfo->pRsp;
- pRsp->numOfRows = htonl(pRsp->numOfRows);
- pRsp->compLen = htonl(pRsp->compLen);
- pRsp->numOfCols = htonl(pRsp->numOfCols);
- pRsp->useconds = htobe64(pRsp->useconds);
- pRsp->numOfBlocks = htonl(pRsp->numOfBlocks);
-
- ASSERT(pRsp != NULL);
- qDebug("%s fetch rsp received, index:%d, blocks:%d, rows:%d", pSourceDataInfo->taskId, index, pRsp->numOfBlocks,
- pRsp->numOfRows);
- } else {
- taosMemoryFree(pMsg->pData);
- pSourceDataInfo->code = code;
- qDebug("%s fetch rsp received, index:%d, error:%s", pSourceDataInfo->taskId, index, tstrerror(code));
- }
-
- pSourceDataInfo->status = EX_SOURCE_DATA_READY;
-
- tsem_post(&pExchangeInfo->ready);
- taosReleaseRef(exchangeObjRefPool, pWrapper->exchangeId);
-
- return TSDB_CODE_SUCCESS;
-}
-
-void qProcessRspMsg(void* parent, SRpcMsg* pMsg, SEpSet* pEpSet) {
- SMsgSendInfo* pSendInfo = (SMsgSendInfo*)pMsg->info.ahandle;
- assert(pMsg->info.ahandle != NULL);
-
- SDataBuf buf = {.len = pMsg->contLen, .pData = NULL};
-
- if (pMsg->contLen > 0) {
- buf.pData = taosMemoryCalloc(1, pMsg->contLen);
- if (buf.pData == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- pMsg->code = TSDB_CODE_OUT_OF_MEMORY;
- } else {
- memcpy(buf.pData, pMsg->pCont, pMsg->contLen);
- }
- }
-
- pSendInfo->fp(pSendInfo->param, &buf, pMsg->code);
- rpcFreeCont(pMsg->pCont);
- destroySendMsgInfo(pSendInfo);
-}
-
-static int32_t doSendFetchDataRequest(SExchangeInfo* pExchangeInfo, SExecTaskInfo* pTaskInfo, int32_t sourceIndex) {
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
-
- SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, sourceIndex);
- SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, sourceIndex);
-
- ASSERT(pDataInfo->status == EX_SOURCE_DATA_NOT_READY);
-
- SFetchRspHandleWrapper* pWrapper = taosMemoryCalloc(1, sizeof(SFetchRspHandleWrapper));
- pWrapper->exchangeId = pExchangeInfo->self;
- pWrapper->sourceIndex = sourceIndex;
-
- if (pSource->localExec) {
- SDataBuf pBuf = {0};
- int32_t code =
- (*pTaskInfo->localFetch.fp)(pTaskInfo->localFetch.handle, pSource->schedId, pTaskInfo->id.queryId,
- pSource->taskId, 0, pSource->execId, &pBuf.pData, pTaskInfo->localFetch.explainRes);
- loadRemoteDataCallback(pWrapper, &pBuf, code);
- taosMemoryFree(pWrapper);
- } else {
- SResFetchReq* pMsg = taosMemoryCalloc(1, sizeof(SResFetchReq));
- if (NULL == pMsg) {
- pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
- taosMemoryFree(pWrapper);
- return pTaskInfo->code;
- }
-
- qDebug("%s build fetch msg and send to vgId:%d, ep:%s, taskId:0x%" PRIx64 ", execId:%d, %d/%" PRIzu,
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->addr.epSet.eps[0].fqdn, pSource->taskId,
- pSource->execId, sourceIndex, totalSources);
-
- pMsg->header.vgId = htonl(pSource->addr.nodeId);
- pMsg->sId = htobe64(pSource->schedId);
- pMsg->taskId = htobe64(pSource->taskId);
- pMsg->queryId = htobe64(pTaskInfo->id.queryId);
- pMsg->execId = htonl(pSource->execId);
-
- // send the fetch remote task result reques
- SMsgSendInfo* pMsgSendInfo = taosMemoryCalloc(1, sizeof(SMsgSendInfo));
- if (NULL == pMsgSendInfo) {
- taosMemoryFreeClear(pMsg);
- taosMemoryFree(pWrapper);
- qError("%s prepare message %d failed", GET_TASKID(pTaskInfo), (int32_t)sizeof(SMsgSendInfo));
- pTaskInfo->code = TSDB_CODE_QRY_OUT_OF_MEMORY;
- return pTaskInfo->code;
- }
-
- pMsgSendInfo->param = pWrapper;
- pMsgSendInfo->paramFreeFp = taosMemoryFree;
- pMsgSendInfo->msgInfo.pData = pMsg;
- pMsgSendInfo->msgInfo.len = sizeof(SResFetchReq);
- pMsgSendInfo->msgType = pSource->fetchMsgType;
- pMsgSendInfo->fp = loadRemoteDataCallback;
-
- int64_t transporterId = 0;
- int32_t code =
- asyncSendMsgToServer(pExchangeInfo->pTransporter, &pSource->addr.epSet, &transporterId, pMsgSendInfo);
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
-void updateLoadRemoteInfo(SLoadRemoteDataInfo* pInfo, int32_t numOfRows, int32_t dataLen, int64_t startTs,
- SOperatorInfo* pOperator) {
- pInfo->totalRows += numOfRows;
- pInfo->totalSize += dataLen;
- pInfo->totalElapsed += (taosGetTimestampUs() - startTs);
- pOperator->resultInfo.totalRows += numOfRows;
-}
-
-int32_t extractDataBlockFromFetchRsp(SSDataBlock* pRes, char* pData, SArray* pColList, char** pNextStart) {
- if (pColList == NULL) { // data from other sources
- blockDataCleanup(pRes);
- *pNextStart = (char*)blockDecode(pRes, pData);
- } else { // extract data according to pColList
- char* pStart = pData;
-
- int32_t numOfCols = htonl(*(int32_t*)pStart);
- pStart += sizeof(int32_t);
-
- // todo refactor:extract method
- SSysTableSchema* pSchema = (SSysTableSchema*)pStart;
- for (int32_t i = 0; i < numOfCols; ++i) {
- SSysTableSchema* p = (SSysTableSchema*)pStart;
-
- p->colId = htons(p->colId);
- p->bytes = htonl(p->bytes);
- pStart += sizeof(SSysTableSchema);
- }
-
- SSDataBlock* pBlock = createDataBlock();
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColumnInfoData idata = createColumnInfoData(pSchema[i].type, pSchema[i].bytes, pSchema[i].colId);
- blockDataAppendColInfo(pBlock, &idata);
- }
-
- blockDecode(pBlock, pStart);
- blockDataEnsureCapacity(pRes, pBlock->info.rows);
-
- // data from mnode
- pRes->info.rows = pBlock->info.rows;
- relocateColumnData(pRes, pColList, pBlock->pDataBlock, false);
- blockDataDestroy(pBlock);
- }
-
- // todo move this to time window aggregator, since the primary timestamp may not be known by exchange operator.
- blockDataUpdateTsWindow(pRes, 0);
- return TSDB_CODE_SUCCESS;
-}
-
-static void* setAllSourcesCompleted(SOperatorInfo* pOperator, int64_t startTs) {
- SExchangeInfo* pExchangeInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- int64_t el = taosGetTimestampUs() - startTs;
- SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
-
- pLoadInfo->totalElapsed += el;
-
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
- qDebug("%s all %" PRIzu " sources are exhausted, total rows: %" PRIu64 " bytes:%" PRIu64 ", elapsed:%.2f ms",
- GET_TASKID(pTaskInfo), totalSources, pLoadInfo->totalRows, pLoadInfo->totalSize,
- pLoadInfo->totalElapsed / 1000.0);
-
- doSetOperatorCompleted(pOperator);
- return NULL;
-}
-
-static void concurrentlyLoadRemoteDataImpl(SOperatorInfo* pOperator, SExchangeInfo* pExchangeInfo,
- SExecTaskInfo* pTaskInfo) {
- int32_t code = 0;
- int64_t startTs = taosGetTimestampUs();
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
-
- while (1) {
- int32_t completed = 0;
- for (int32_t i = 0; i < totalSources; ++i) {
- SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, i);
- if (pDataInfo->status == EX_SOURCE_DATA_EXHAUSTED) {
- completed += 1;
- continue;
- }
-
- if (pDataInfo->status != EX_SOURCE_DATA_READY) {
- continue;
- }
-
- if (pDataInfo->code != TSDB_CODE_SUCCESS) {
- code = pDataInfo->code;
- goto _error;
- }
-
- SRetrieveTableRsp* pRsp = pDataInfo->pRsp;
- SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, i);
-
- SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
- if (pRsp->numOfRows == 0) {
- qDebug("%s vgId:%d, taskId:0x%" PRIx64 " execId:%d index:%d completed, rowsOfSource:%" PRIu64
- ", totalRows:%" PRIu64 ", completed:%d try next %d/%" PRIzu,
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pDataInfo->totalRows,
- pExchangeInfo->loadInfo.totalRows, completed + 1, i + 1, totalSources);
- pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
- completed += 1;
- taosMemoryFreeClear(pDataInfo->pRsp);
- continue;
- }
-
- SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
- int32_t index = 0;
- char* pStart = pRetrieveRsp->data;
- while (index++ < pRetrieveRsp->numOfBlocks) {
- SSDataBlock* pb = createOneDataBlock(pExchangeInfo->pDummyBlock, false);
- code = extractDataBlockFromFetchRsp(pb, pStart, NULL, &pStart);
- if (code != 0) {
- taosMemoryFreeClear(pDataInfo->pRsp);
- goto _error;
- }
-
- taosArrayPush(pExchangeInfo->pResultBlockList, &pb);
- }
-
- updateLoadRemoteInfo(pLoadInfo, pRetrieveRsp->numOfRows, pRetrieveRsp->compLen, startTs, pOperator);
-
- if (pRsp->completed == 1) {
- qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64
- " execId:%d"
- " index:%d completed, blocks:%d, numOfRows:%d, rowsOfSource:%" PRIu64 ", totalRows:%" PRIu64
- ", total:%.2f Kb,"
- " completed:%d try next %d/%" PRIzu,
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, i, pRsp->numOfBlocks,
- pRsp->numOfRows, pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0,
- completed + 1, i + 1, totalSources);
- completed += 1;
- pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
- } else {
- qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64
- " execId:%d blocks:%d, numOfRows:%d, totalRows:%" PRIu64 ", total:%.2f Kb",
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRsp->numOfBlocks,
- pRsp->numOfRows, pLoadInfo->totalRows, pLoadInfo->totalSize / 1024.0);
- }
-
- taosMemoryFreeClear(pDataInfo->pRsp);
-
- if (pDataInfo->status != EX_SOURCE_DATA_EXHAUSTED) {
- pDataInfo->status = EX_SOURCE_DATA_NOT_READY;
- code = doSendFetchDataRequest(pExchangeInfo, pTaskInfo, i);
- if (code != TSDB_CODE_SUCCESS) {
- taosMemoryFreeClear(pDataInfo->pRsp);
- goto _error;
- }
- }
-
- return;
- }
-
- if (completed == totalSources) {
- setAllSourcesCompleted(pOperator, startTs);
- return;
- }
-
- sched_yield();
- }
-
- _error:
- pTaskInfo->code = code;
-}
-
-static int32_t prepareConcurrentlyLoad(SOperatorInfo* pOperator) {
- SExchangeInfo* pExchangeInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
- int64_t startTs = taosGetTimestampUs();
-
- // Asynchronously send all fetch requests to all sources.
- for (int32_t i = 0; i < totalSources; ++i) {
- int32_t code = doSendFetchDataRequest(pExchangeInfo, pTaskInfo, i);
- if (code != TSDB_CODE_SUCCESS) {
- pTaskInfo->code = code;
- return code;
- }
- }
-
- int64_t endTs = taosGetTimestampUs();
- qDebug("%s send all fetch requests to %" PRIzu " sources completed, elapsed:%.2fms", GET_TASKID(pTaskInfo),
- totalSources, (endTs - startTs) / 1000.0);
-
- pOperator->status = OP_RES_TO_RETURN;
- pOperator->cost.openCost = taosGetTimestampUs() - startTs;
-
- tsem_wait(&pExchangeInfo->ready);
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t seqLoadRemoteData(SOperatorInfo* pOperator) {
- SExchangeInfo* pExchangeInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
- int64_t startTs = taosGetTimestampUs();
-
- while (1) {
- if (pExchangeInfo->current >= totalSources) {
- setAllSourcesCompleted(pOperator, startTs);
- return TSDB_CODE_SUCCESS;
- }
-
- doSendFetchDataRequest(pExchangeInfo, pTaskInfo, pExchangeInfo->current);
- tsem_wait(&pExchangeInfo->ready);
-
- SSourceDataInfo* pDataInfo = taosArrayGet(pExchangeInfo->pSourceDataInfo, pExchangeInfo->current);
- SDownstreamSourceNode* pSource = taosArrayGet(pExchangeInfo->pSources, pExchangeInfo->current);
-
- if (pDataInfo->code != TSDB_CODE_SUCCESS) {
- qError("%s vgId:%d, taskID:0x%" PRIx64 " execId:%d error happens, code:%s", GET_TASKID(pTaskInfo),
- pSource->addr.nodeId, pSource->taskId, pSource->execId, tstrerror(pDataInfo->code));
- pOperator->pTaskInfo->code = pDataInfo->code;
- return pOperator->pTaskInfo->code;
- }
-
- SRetrieveTableRsp* pRsp = pDataInfo->pRsp;
- SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
- if (pRsp->numOfRows == 0) {
- qDebug("%s vgId:%d, taskID:0x%" PRIx64 " execId:%d %d of total completed, rowsOfSource:%" PRIu64
- ", totalRows:%" PRIu64 " try next",
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pExchangeInfo->current + 1,
- pDataInfo->totalRows, pLoadInfo->totalRows);
-
- pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
- pExchangeInfo->current += 1;
- taosMemoryFreeClear(pDataInfo->pRsp);
- continue;
- }
-
- SRetrieveTableRsp* pRetrieveRsp = pDataInfo->pRsp;
-
- char* pStart = pRetrieveRsp->data;
- int32_t code = extractDataBlockFromFetchRsp(NULL, pStart, NULL, &pStart);
-
- if (pRsp->completed == 1) {
- qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%d, rowsOfSource:%" PRIu64
- ", totalRows:%" PRIu64 ", totalBytes:%" PRIu64 " try next %d/%" PRIzu,
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRetrieveRsp->numOfRows,
- pDataInfo->totalRows, pLoadInfo->totalRows, pLoadInfo->totalSize, pExchangeInfo->current + 1,
- totalSources);
-
- pDataInfo->status = EX_SOURCE_DATA_EXHAUSTED;
- pExchangeInfo->current += 1;
- } else {
- qDebug("%s fetch msg rsp from vgId:%d, taskId:0x%" PRIx64 " execId:%d numOfRows:%d, totalRows:%" PRIu64
- ", totalBytes:%" PRIu64,
- GET_TASKID(pTaskInfo), pSource->addr.nodeId, pSource->taskId, pSource->execId, pRetrieveRsp->numOfRows,
- pLoadInfo->totalRows, pLoadInfo->totalSize);
- }
-
- updateLoadRemoteInfo(pLoadInfo, pRetrieveRsp->numOfRows, pRetrieveRsp->compLen, startTs, pOperator);
- pDataInfo->totalRows += pRetrieveRsp->numOfRows;
-
- taosMemoryFreeClear(pDataInfo->pRsp);
- return TSDB_CODE_SUCCESS;
- }
-}
-
-static int32_t prepareLoadRemoteData(SOperatorInfo* pOperator) {
- if (OPTR_IS_OPENED(pOperator)) {
- return TSDB_CODE_SUCCESS;
- }
-
- int64_t st = taosGetTimestampUs();
-
- SExchangeInfo* pExchangeInfo = pOperator->info;
- if (!pExchangeInfo->seqLoadData) {
- int32_t code = prepareConcurrentlyLoad(pOperator);
- if (code != TSDB_CODE_SUCCESS) {
- return code;
- }
- }
-
- OPTR_SET_OPENED(pOperator);
- pOperator->cost.openCost = (taosGetTimestampUs() - st) / 1000.0;
- return TSDB_CODE_SUCCESS;
-}
-
-static void freeBlock(void* pParam) {
- SSDataBlock* pBlock = *(SSDataBlock**)pParam;
- blockDataDestroy(pBlock);
-}
-
-static SSDataBlock* doLoadRemoteDataImpl(SOperatorInfo* pOperator) {
- SExchangeInfo* pExchangeInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
- if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
- return NULL;
- }
-
- size_t totalSources = taosArrayGetSize(pExchangeInfo->pSources);
-
- SLoadRemoteDataInfo* pLoadInfo = &pExchangeInfo->loadInfo;
- if (pOperator->status == OP_EXEC_DONE) {
- qDebug("%s all %" PRIzu " source(s) are exhausted, total rows:%" PRIu64 " bytes:%" PRIu64 ", elapsed:%.2f ms",
- GET_TASKID(pTaskInfo), totalSources, pLoadInfo->totalRows, pLoadInfo->totalSize,
- pLoadInfo->totalElapsed / 1000.0);
- return NULL;
- }
-
- size_t size = taosArrayGetSize(pExchangeInfo->pResultBlockList);
- if (size == 0 || pExchangeInfo->rspBlockIndex >= size) {
- pExchangeInfo->rspBlockIndex = 0;
- taosArrayClearEx(pExchangeInfo->pResultBlockList, freeBlock);
- if (pExchangeInfo->seqLoadData) {
- seqLoadRemoteData(pOperator);
- } else {
- concurrentlyLoadRemoteDataImpl(pOperator, pExchangeInfo, pTaskInfo);
- }
-
- if (taosArrayGetSize(pExchangeInfo->pResultBlockList) == 0) {
- return NULL;
- }
- }
-
- // we have buffered retrieved datablock, return it directly
- return taosArrayGetP(pExchangeInfo->pResultBlockList, pExchangeInfo->rspBlockIndex++);
-}
-
-static SSDataBlock* doLoadRemoteData(SOperatorInfo* pOperator) {
- SExchangeInfo* pExchangeInfo = pOperator->info;
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
-
- if (pOperator->status == OP_EXEC_DONE) {
- return NULL;
- }
-
- while (1) {
- SSDataBlock* pBlock = doLoadRemoteDataImpl(pOperator);
- if (pBlock == NULL) {
- return NULL;
- }
-
- SLimitInfo* pLimitInfo = &pExchangeInfo->limitInfo;
- if (hasLimitOffsetInfo(pLimitInfo)) {
- int32_t status = handleLimitOffset(pOperator, pLimitInfo, pBlock, false);
- if (status == PROJECT_RETRIEVE_CONTINUE) {
- continue;
- } else if (status == PROJECT_RETRIEVE_DONE) {
- size_t rows = pBlock->info.rows;
- pExchangeInfo->limitInfo.numOfOutputRows += rows;
-
- if (rows == 0) {
- doSetOperatorCompleted(pOperator);
- return NULL;
- } else {
- return pBlock;
- }
- }
- } else {
- return pBlock;
- }
- }
-}
-
-static int32_t initDataSource(int32_t numOfSources, SExchangeInfo* pInfo, const char* id) {
- pInfo->pSourceDataInfo = taosArrayInit(numOfSources, sizeof(SSourceDataInfo));
- if (pInfo->pSourceDataInfo == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- for (int32_t i = 0; i < numOfSources; ++i) {
- SSourceDataInfo dataInfo = {0};
- dataInfo.status = EX_SOURCE_DATA_NOT_READY;
- dataInfo.taskId = id;
- dataInfo.index = i;
- SSourceDataInfo* pDs = taosArrayPush(pInfo->pSourceDataInfo, &dataInfo);
- if (pDs == NULL) {
- taosArrayDestroy(pInfo->pSourceDataInfo);
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t initExchangeOperator(SExchangePhysiNode* pExNode, SExchangeInfo* pInfo, const char* id) {
- size_t numOfSources = LIST_LENGTH(pExNode->pSrcEndPoints);
-
- if (numOfSources == 0) {
- qError("%s invalid number: %d of sources in exchange operator", id, (int32_t)numOfSources);
- return TSDB_CODE_INVALID_PARA;
- }
-
- pInfo->pSources = taosArrayInit(numOfSources, sizeof(SDownstreamSourceNode));
- if (pInfo->pSources == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- for (int32_t i = 0; i < numOfSources; ++i) {
- SDownstreamSourceNode* pNode = (SDownstreamSourceNode*)nodesListGetNode((SNodeList*)pExNode->pSrcEndPoints, i);
- taosArrayPush(pInfo->pSources, pNode);
- }
-
- initLimitInfo(pExNode->node.pLimit, pExNode->node.pSlimit, &pInfo->limitInfo);
- pInfo->self = taosAddRef(exchangeObjRefPool, pInfo);
-
- return initDataSource(numOfSources, pInfo, id);
-}
-
-SOperatorInfo* createExchangeOperatorInfo(void* pTransporter, SExchangePhysiNode* pExNode, SExecTaskInfo* pTaskInfo) {
- SExchangeInfo* pInfo = taosMemoryCalloc(1, sizeof(SExchangeInfo));
- SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL) {
- goto _error;
- }
-
- int32_t code = initExchangeOperator(pExNode, pInfo, GET_TASKID(pTaskInfo));
- if (code != TSDB_CODE_SUCCESS) {
- goto _error;
- }
-
- tsem_init(&pInfo->ready, 0, 0);
- pInfo->pDummyBlock = createResDataBlock(pExNode->node.pOutputDataBlockDesc);
- pInfo->pResultBlockList = taosArrayInit(1, POINTER_BYTES);
-
- pInfo->seqLoadData = false;
- pInfo->pTransporter = pTransporter;
-
- pOperator->name = "ExchangeOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_EXCHANGE;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pDummyBlock->pDataBlock);
- pOperator->pTaskInfo = pTaskInfo;
-
- pOperator->fpSet =
- createOperatorFpSet(prepareLoadRemoteData, doLoadRemoteData, NULL, NULL, destroyExchangeOperatorInfo, NULL);
- return pOperator;
-
- _error:
- if (pInfo != NULL) {
- doDestroyExchangeOperatorInfo(pInfo);
- }
-
- taosMemoryFreeClear(pOperator);
- pTaskInfo->code = code;
- return NULL;
-}
-
static int32_t doInitAggInfoSup(SAggSupporter* pAggSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, size_t keyBufSize,
const char* pKey);
-static bool needToMerge(SSDataBlock* pBlock, SArray* groupInfo, char** buf, int32_t rowIndex) {
- size_t size = taosArrayGetSize(groupInfo);
- if (size == 0) {
- return true;
- }
-
- for (int32_t i = 0; i < size; ++i) {
- int32_t* index = taosArrayGet(groupInfo, i);
-
- SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, *index);
- bool isNull = colDataIsNull(pColInfo, rowIndex, pBlock->info.rows, NULL);
-
- if ((isNull && buf[i] != NULL) || (!isNull && buf[i] == NULL)) {
- return false;
- }
-
- char* pCell = colDataGetData(pColInfo, rowIndex);
- if (IS_VAR_DATA_TYPE(pColInfo->info.type)) {
- if (varDataLen(pCell) != varDataLen(buf[i])) {
- return false;
- } else {
- if (memcmp(varDataVal(pCell), varDataVal(buf[i]), varDataLen(pCell)) != 0) {
- return false;
- }
- }
- } else {
- if (memcmp(pCell, buf[i], pColInfo->info.bytes) != 0) {
- return false;
- }
- }
- }
-
- return 0;
-}
-
-static bool saveCurrentTuple(char** rowColData, SArray* pColumnList, SSDataBlock* pBlock, int32_t rowIndex) {
- int32_t size = (int32_t)taosArrayGetSize(pColumnList);
-
- for (int32_t i = 0; i < size; ++i) {
- int32_t* index = taosArrayGet(pColumnList, i);
- SColumnInfoData* pColInfo = taosArrayGet(pBlock->pDataBlock, *index);
-
- char* data = colDataGetData(pColInfo, rowIndex);
- memcpy(rowColData[i], data, colDataGetLength(pColInfo, rowIndex));
- }
-
- return true;
-}
-
int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scanFlag) {
// todo add more information about exchange operation
int32_t type = pOperator->operatorType;
@@ -2290,13 +1617,13 @@ int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scan
return TSDB_CODE_SUCCESS;
} else if (type == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
STableScanInfo* pTableScanInfo = pOperator->info;
- *order = pTableScanInfo->cond.order;
- *scanFlag = pTableScanInfo->scanFlag;
+ *order = pTableScanInfo->base.cond.order;
+ *scanFlag = pTableScanInfo->base.scanFlag;
return TSDB_CODE_SUCCESS;
} else if (type == QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN) {
STableMergeScanInfo* pTableScanInfo = pOperator->info;
- *order = pTableScanInfo->cond.order;
- *scanFlag = pTableScanInfo->scanFlag;
+ *order = pTableScanInfo->base.cond.order;
+ *scanFlag = pTableScanInfo->base.scanFlag;
return TSDB_CODE_SUCCESS;
} else {
if (pOperator->pDownstream == NULL || pOperator->pDownstream[0] == NULL) {
@@ -2371,7 +1698,7 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -2381,7 +1708,7 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
doFilter(pInfo->pRes, pOperator->exprSupp.pFilterInfo, NULL);
if (!hasRemainResults(&pAggInfo->groupResInfo)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
@@ -2559,8 +1886,7 @@ static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOp
int32_t scanFlag = MAIN_SCAN;
getTableScanInfo(pOperator, &order, &scanFlag);
- int64_t ekey =
- Q_STATUS_EQUAL(pTaskInfo->status, TASK_COMPLETED) ? pInfo->win.ekey : pInfo->existNewGroupBlock->info.window.ekey;
+ int64_t ekey = pInfo->existNewGroupBlock->info.window.ekey;
taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo));
blockDataCleanup(pInfo->pRes);
@@ -2630,7 +1956,7 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream);
if (pBlock == NULL) {
if (pInfo->totalInputRows == 0) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -2707,11 +2033,11 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) {
while (true) {
fillResult = doFillImpl(pOperator);
if (fillResult == NULL) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
- doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo );
+ doFilter(fillResult, pOperator->exprSupp.pFilterInfo, &pInfo->matchInfo);
if (fillResult->info.rows > 0) {
break;
}
@@ -2738,7 +2064,7 @@ void destroyExprInfo(SExprInfo* pExpr, int32_t numOfExprs) {
}
}
-static void destroyOperatorInfo(SOperatorInfo* pOperator) {
+void destroyOperatorInfo(SOperatorInfo* pOperator) {
if (pOperator == NULL) {
return;
}
@@ -2937,20 +2263,15 @@ SOperatorInfo* createAggregateOperatorInfo(SOperatorInfo* downstream, SAggPhysiN
pInfo->binfo.mergeResultBlock = pAggNode->mergeDataBlock;
pInfo->groupId = UINT64_MAX;
- pOperator->name = "TableAggregate";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_HASH_AGG;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet =
- createOperatorFpSet(doOpenAggregateOptr, getAggregateResult, NULL, NULL, destroyAggOperatorInfo, NULL);
+ setOperatorInfo(pOperator, "TableAggregate", QUERY_NODE_PHYSICAL_PLAN_HASH_AGG, true, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(doOpenAggregateOptr, getAggregateResult, NULL, destroyAggOperatorInfo, NULL);
if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
STableScanInfo* pTableScanInfo = downstream->info;
- pTableScanInfo->pdInfo.pExprSup = &pOperator->exprSupp;
- pTableScanInfo->pdInfo.pAggSup = &pInfo->aggSup;
+ pTableScanInfo->base.pdInfo.pExprSup = &pOperator->exprSupp;
+ pTableScanInfo->base.pdInfo.pAggSup = &pInfo->aggSup;
}
code = appendDownstream(pOperator, &downstream, 1);
@@ -3009,33 +2330,6 @@ void destroyFillOperatorInfo(void* param) {
taosMemoryFreeClear(param);
}
-void destroyExchangeOperatorInfo(void* param) {
- SExchangeInfo* pExInfo = (SExchangeInfo*)param;
- taosRemoveRef(exchangeObjRefPool, pExInfo->self);
-}
-
-void freeSourceDataInfo(void* p) {
- SSourceDataInfo* pInfo = (SSourceDataInfo*)p;
- taosMemoryFreeClear(pInfo->pRsp);
-}
-
-void doDestroyExchangeOperatorInfo(void* param) {
- SExchangeInfo* pExInfo = (SExchangeInfo*)param;
-
- taosArrayDestroy(pExInfo->pSources);
- taosArrayDestroyEx(pExInfo->pSourceDataInfo, freeSourceDataInfo);
-
- if (pExInfo->pResultBlockList != NULL) {
- taosArrayDestroyEx(pExInfo->pResultBlockList, freeBlock);
- pExInfo->pResultBlockList = NULL;
- }
-
- blockDataDestroy(pExInfo->pDummyBlock);
-
- tsem_destroy(&pExInfo->ready);
- taosMemoryFreeClear(param);
-}
-
static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t numOfCols, SExprInfo* pNotFillExpr,
int32_t numOfNotFillCols, SNodeListNode* pValNode, STimeWindow win, int32_t capacity,
const char* id, SInterval* pInterval, int32_t fillType, int32_t order) {
@@ -3130,8 +2424,8 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode*
SInterval* pInterval =
QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL == downstream->operatorType
- ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval
- : &((SIntervalAggOperatorInfo*)downstream->info)->interval;
+ ? &((SMergeAlignedIntervalAggOperatorInfo*)downstream->info)->intervalAggOperatorInfo->interval
+ : &((SIntervalAggOperatorInfo*)downstream->info)->interval;
int32_t order = (pPhyFillNode->inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
int32_t type = convertFillType(pPhyFillNode->mode);
@@ -3167,15 +2461,9 @@ SOperatorInfo* createFillOperatorInfo(SOperatorInfo* downstream, SFillPhysiNode*
goto _error;
}
- pOperator->name = "FillOperator";
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_FILL;
+ setOperatorInfo(pOperator, "FillOperator", QUERY_NODE_PHYSICAL_PLAN_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = pInfo->numOfExpr;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
-
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, NULL, destroyFillOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doFill, NULL, destroyFillOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
return pOperator;
@@ -3204,6 +2492,7 @@ static SExecTaskInfo* createExecTaskInfo(uint64_t queryId, uint64_t taskId, EOPT
pTaskInfo->id.queryId = queryId;
pTaskInfo->execModel = model;
pTaskInfo->pTableInfoList = tableListCreate();
+ pTaskInfo->stopInfo.pStopInfo = taosArrayInit(4, sizeof(SExchangeOpStopInfo));
char* p = taosMemoryCalloc(1, 128);
snprintf(p, 128, "TID:0x%" PRIx64 " QID:0x%" PRIx64, taskId, queryId);
@@ -3310,9 +2599,9 @@ bool groupbyTbname(SNodeList* pGroupList) {
SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo, SReadHandle* pHandle, SNode* pTagCond,
SNode* pTagIndexCond, const char* pUser) {
- int32_t type = nodeType(pPhyNode);
+ int32_t type = nodeType(pPhyNode);
STableListInfo* pTableListInfo = pTaskInfo->pTableInfoList;
- const char* idstr = GET_TASKID(pTaskInfo);
+ const char* idstr = GET_TASKID(pTaskInfo);
if (pPhyNode->pChildren == NULL || LIST_LENGTH(pPhyNode->pChildren) == 0) {
SOperatorInfo* pOperator = NULL;
@@ -3341,8 +2630,13 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
}
pOperator = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo);
+ if (NULL == pOperator) {
+ pTaskInfo->code = terrno;
+ return NULL;
+ }
+
STableScanInfo* pScanInfo = pOperator->info;
- pTaskInfo->cost.pRecoder = &pScanInfo->readRecorder;
+ pTaskInfo->cost.pRecoder = &pScanInfo->base.readRecorder;
} else if (QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN == type) {
STableMergeScanPhysiNode* pTableScanNode = (STableMergeScanPhysiNode*)pPhyNode;
@@ -3360,10 +2654,14 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return NULL;
}
- pOperator = createTableMergeScanOperatorInfo(pTableScanNode, pTableListInfo, pHandle, pTaskInfo);
+ pOperator = createTableMergeScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo);
+ if (NULL == pOperator) {
+ pTaskInfo->code = terrno;
+ return NULL;
+ }
STableScanInfo* pScanInfo = pOperator->info;
- pTaskInfo->cost.pRecoder = &pScanInfo->readRecorder;
+ pTaskInfo->cost.pRecoder = &pScanInfo->base.readRecorder;
} else if (QUERY_NODE_PHYSICAL_PLAN_EXCHANGE == type) {
pOperator = createExchangeOperatorInfo(pHandle ? pHandle->pMsgCb->clientRpc : NULL, (SExchangePhysiNode*)pPhyNode,
pTaskInfo);
@@ -3385,7 +2683,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
for (int32_t i = 0; i < sz; i++) {
STableKeyInfo* pKeyInfo = tableListGetInfo(pTableListInfo, i);
- qDebug("add table uid:%" PRIu64", gid:%"PRIu64, pKeyInfo->uid, pKeyInfo->groupId);
+ qDebug("add table uid:%" PRIu64 ", gid:%" PRIu64, pKeyInfo->uid, pKeyInfo->groupId);
}
#endif
}
@@ -3418,7 +2716,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return NULL;
}
- for(int32_t i = 0; i < tableListGetSize(pTableListInfo); ++i) {
+ for (int32_t i = 0; i < tableListGetSize(pTableListInfo); ++i) {
STableKeyInfo* p = taosArrayGet(pList, i);
tableListAddTableInfo(pTableListInfo, p->uid, 0);
}
@@ -3458,7 +2756,7 @@ SOperatorInfo* createOperatorTree(SPhysiNode* pPhyNode, SExecTaskInfo* pTaskInfo
return pOperator;
}
- size_t size = LIST_LENGTH(pPhyNode->pChildren);
+ size_t size = LIST_LENGTH(pPhyNode->pChildren);
SOperatorInfo** ops = taosMemoryCalloc(size, POINTER_BYTES);
if (ops == NULL) {
return NULL;
@@ -3669,7 +2967,7 @@ int32_t encodeOperator(SOperatorInfo* ops, char** result, int32_t* length, int32
*length = *(int32_t*)(*result);
}
- _downstream:
+_downstream:
for (int32_t i = 0; i < ops->numOfDownstream; ++i) {
code = encodeOperator(ops->pDownstream[i], result, length, nOptrWithVal);
if (code != TDB_CODE_SUCCESS) {
@@ -3808,6 +3106,7 @@ void doDestroyTask(SExecTaskInfo* pTaskInfo) {
nodesDestroyNode((SNode*)pTaskInfo->pSubplan);
}
+ taosArrayDestroy(pTaskInfo->stopInfo.pStopInfo);
taosMemoryFreeClear(pTaskInfo->sql);
taosMemoryFreeClear(pTaskInfo->id.str);
taosMemoryFreeClear(pTaskInfo);
@@ -3928,8 +3227,8 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pStat
int32_t size = 0;
void* pVal = NULL;
SWinKey key = {
- .ts = *(TSKEY*)pPos->key,
- .groupId = pPos->groupId,
+ .ts = *(TSKEY*)pPos->key,
+ .groupId = pPos->groupId,
};
int32_t code = streamStateGet(pState, &key, &pVal, &size);
ASSERT(code == 0);
@@ -3944,13 +3243,13 @@ int32_t buildDataBlockFromGroupRes(SOperatorInfo* pOperator, SStreamState* pStat
if (pBlock->info.groupId == 0) {
pBlock->info.groupId = pPos->groupId;
- SStreamIntervalOperatorInfo* 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 {
+ void* tbname = NULL;
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
pBlock->info.parTbName[0] = 0;
+ } else {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
+ tdbFree(tbname);
} else {
// current value belongs to different group, it can't be packed into one datablock
if (pBlock->info.groupId != pPos->groupId) {
@@ -4021,6 +3320,7 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pSta
ASSERT(code == 0);
if (code == -1) {
// coverity scan
+ pGroupResInfo->index += 1;
continue;
}
SResultRow* pRow = (SResultRow*)pVal;
@@ -4035,30 +3335,13 @@ int32_t buildSessionResultDataBlock(SOperatorInfo* pOperator, SStreamState* pSta
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;
- }
+ void* tbname = NULL;
+ if (streamStateGetParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ pBlock->info.parTbName[0] = 0;
} else {
- ASSERT(0);
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
}
-
+ tdbFree(tbname);
} else {
// current value belongs to different group, it can't be packed into one datablock
if (pBlock->info.groupId != pKey->groupId) {
diff --git a/source/libs/executor/src/groupoperator.c b/source/libs/executor/src/groupoperator.c
index 891eb6e7a4cb00523d31991c46a6b57163c64dfe..26a5f6838dfe79b1edd6786aa53a315bd29cd83c 100644
--- a/source/libs/executor/src/groupoperator.c
+++ b/source/libs/executor/src/groupoperator.c
@@ -316,7 +316,7 @@ static SSDataBlock* buildGroupResultDataBlock(SOperatorInfo* pOperator) {
doFilter(pRes, pOperator->exprSupp.pFilterInfo, NULL);
if (!hasRemainResults(&pInfo->groupResInfo)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
@@ -438,15 +438,10 @@ SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SAggPhysiNode*
}
initResultRowInfo(&pInfo->binfo.resultRowInfo);
-
- pOperator->name = "GroupbyAggOperator";
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
+ setOperatorInfo(pOperator, "GroupbyAggOperator", 0, true, OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, hashGroupbyAggregate, NULL, NULL, destroyGroupOperatorInfo, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, hashGroupbyAggregate, NULL, destroyGroupOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -654,7 +649,7 @@ static SSDataBlock* buildPartitionResult(SOperatorInfo* pOperator) {
// try next group data
++pInfo->groupIndex;
if (pInfo->groupIndex >= taosArrayGetSize(pInfo->sortedGroupArray)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
clearPartitionOperator(pInfo);
return NULL;
}
@@ -821,17 +816,12 @@ SOperatorInfo* createPartitionOperatorInfo(SOperatorInfo* downstream, SPartition
goto _error;
}
- pOperator->name = "PartitionOperator";
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_PARTITION;
+ setOperatorInfo(pOperator, "PartitionOperator", QUERY_NODE_PHYSICAL_PLAN_PARTITION, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
pOperator->exprSupp.numOfExprs = numOfCols;
pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, hashPartition, NULL, NULL, destroyPartitionOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, hashPartition, NULL, destroyPartitionOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
return pOperator;
@@ -909,7 +899,10 @@ static SSDataBlock* buildStreamPartitionResult(SOperatorInfo* pOperator) {
void* pData = colDataGetVarData(pCol, 0);
// TODO check tbname validity
if (pData != (void*)-1) {
- memcpy(pDest->info.parTbName, varDataVal(pData), varDataLen(pData));
+ memset(pDest->info.parTbName, 0, TSDB_TABLE_NAME_LEN);
+ int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN - 1);
+ memcpy(pDest->info.parTbName, varDataVal(pData), len);
+ /*pDest->info.parTbName[len + 1] = 0;*/
} else {
pDest->info.parTbName[0] = 0;
}
@@ -918,6 +911,8 @@ static SSDataBlock* buildStreamPartitionResult(SOperatorInfo* pOperator) {
blockDataDestroy(pResBlock);
}
}
+ taosArrayDestroy(pParInfo->rowIds);
+ pParInfo->rowIds = NULL;
blockDataUpdateTsWindow(pDest, pInfo->tsColIndex);
pDest->info.groupId = pParInfo->groupId;
pOperator->resultInfo.totalRows += pDest->info.rows;
@@ -963,7 +958,7 @@ static SSDataBlock* doStreamHashPartition(SOperatorInfo* pOperator) {
pInfo->pInputDataBlock = NULL;
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
printDataBlock(pBlock, "stream partitionby recv");
@@ -1016,6 +1011,7 @@ static void destroyStreamPartitionOperatorInfo(void* param) {
cleanupExprSupp(&pInfo->tbnameCalSup);
cleanupExprSupp(&pInfo->tagCalSup);
blockDataDestroy(pInfo->pDelRes);
+ taosHashCleanup(pInfo->pPartitions);
taosMemoryFreeClear(param);
}
@@ -1103,16 +1099,12 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr
int32_t numOfCols = 0;
SExprInfo* pExprInfo = createExprInfo(pPartNode->part.pTargets, NULL, &numOfCols);
- pOperator->name = "StreamPartitionOperator";
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION;
+ setOperatorInfo(pOperator, "StreamPartitionOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_PARTITION, false, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = numOfCols;
pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamHashPartition, NULL, NULL,
- destroyStreamPartitionOperatorInfo, NULL);
+ pOperator->fpSet =
+ createOperatorFpSet(operatorDummyOpenFn, doStreamHashPartition, NULL, destroyStreamPartitionOperatorInfo, NULL);
initParDownStream(downstream, &pInfo->partitionSup, &pInfo->scalarSup);
code = appendDownstream(pOperator, &downstream, 1);
diff --git a/source/libs/executor/src/joinoperator.c b/source/libs/executor/src/joinoperator.c
index 45d76dce74e6fbec4ca9d9cde5722c63d211adb6..4e1daac6431ea1c9f6c16a2e619157dfea6010b9 100644
--- a/source/libs/executor/src/joinoperator.c
+++ b/source/libs/executor/src/joinoperator.c
@@ -73,14 +73,10 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
initResultSizeInfo(&pOperator->resultInfo, 4096);
pInfo->pRes = pResBlock;
- pOperator->name = "MergeJoinOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
+
+ setOperatorInfo(pOperator, "MergeJoinOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_JOIN, false, OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->exprSupp.pExprInfo = pExprInfo;
pOperator->exprSupp.numOfExprs = numOfCols;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
extractTimeCondition(pInfo, pDownstream, numOfDownstream, pJoinNode);
@@ -121,8 +117,7 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
pInfo->inputOrder = TSDB_ORDER_DESC;
}
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doMergeJoin, NULL, NULL, destroyMergeJoinOperator, NULL);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, NULL);
code = appendDownstream(pOperator, pDownstream, numOfDownstream);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
@@ -372,13 +367,13 @@ static void doMergeJoinImpl(struct SOperatorInfo* pOperator, SSDataBlock* pRes)
if (leftTs == rightTs) {
mergeJoinJoinDownstreamTsRanges(pOperator, leftTs, pRes, &nrows);
- } else if (asc && leftTs < rightTs || !asc && leftTs > rightTs) {
+ } else if ((asc && leftTs < rightTs) || (!asc && leftTs > rightTs)) {
pJoinInfo->leftPos += 1;
if (pJoinInfo->leftPos >= pJoinInfo->pLeft->info.rows) {
continue;
}
- } else if (asc && leftTs > rightTs || !asc && leftTs < rightTs) {
+ } else if ((asc && leftTs > rightTs) || (!asc && leftTs < rightTs)) {
pJoinInfo->rightPos += 1;
if (pJoinInfo->rightPos >= pJoinInfo->pRight->info.rows) {
continue;
diff --git a/source/libs/executor/src/projectoperator.c b/source/libs/executor/src/projectoperator.c
index b2865d15f0dc72cc5332e02c922d889c8636ad95..ce1d13775caab667517237b29947749b52464908 100644
--- a/source/libs/executor/src/projectoperator.c
+++ b/source/libs/executor/src/projectoperator.c
@@ -98,13 +98,9 @@ SOperatorInfo* createProjectOperatorInfo(SOperatorInfo* downstream, SProjectPhys
}
pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pOperator->exprSupp.pCtx, numOfCols);
- pOperator->name = "ProjectOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_PROJECT;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doProjectOperation, NULL, NULL,
+ setOperatorInfo(pOperator, "ProjectOperator", QUERY_NODE_PHYSICAL_PLAN_PROJECT, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doProjectOperation, NULL,
destroyProjectOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
@@ -153,7 +149,7 @@ static int32_t setInfoForNewGroup(SSDataBlock* pBlock, SLimitInfo* pLimitInfo, S
if (pLimitInfo->currentGroupId != 0 && pLimitInfo->currentGroupId != pBlock->info.groupId) {
pLimitInfo->numOfOutputGroups += 1;
if ((pLimitInfo->slimit.limit > 0) && (pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return PROJECT_RETRIEVE_DONE;
}
@@ -187,7 +183,7 @@ static int32_t doIngroupLimitOffset(SLimitInfo* pLimitInfo, uint64_t groupId, SS
// TODO: optimize it later when partition by + limit
if ((pLimitInfo->slimit.limit == -1 && pLimitInfo->currentGroupId == 0) ||
(pLimitInfo->slimit.limit > 0 && pLimitInfo->slimit.limit <= pLimitInfo->numOfOutputGroups)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
}
}
@@ -252,7 +248,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
}
qDebug("set op close, exec %d, status %d rows %d", pTaskInfo->execModel, pOperator->status,
pFinalRes->info.rows);
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
if (pTaskInfo->execModel == OPTR_EXEC_MODEL_QUEUE) {
@@ -400,14 +396,8 @@ SOperatorInfo* createIndefinitOutputOperatorInfo(SOperatorInfo* downstream, SPhy
pInfo->binfo.pRes = pResBlock;
pInfo->pPseudoColInfo = setRowTsColumnOutputInfo(pSup->pCtx, numOfExpr);
- pOperator->name = "IndefinitOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
-
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doApplyIndefinitFunction, NULL, NULL,
- destroyIndefinitOperatorInfo, NULL);
+ setOperatorInfo(pOperator, "IndefinitOperator", QUERY_NODE_PHYSICAL_PLAN_INDEF_ROWS_FUNC, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doApplyIndefinitFunction, NULL, destroyIndefinitOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -499,7 +489,7 @@ SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) {
// The downstream exec may change the value of the newgroup, so use a local variable instead.
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
if (pBlock == NULL) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
@@ -628,7 +618,7 @@ SSDataBlock* doGenerateSourceData(SOperatorInfo* pOperator) {
pOperator->resultInfo.totalRows += pRes->info.rows;
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
if (pOperator->cost.openCost == 0) {
pOperator->cost.openCost = (taosGetTimestampUs() - st) / 1000.0;
}
diff --git a/source/libs/executor/src/scanoperator.c b/source/libs/executor/src/scanoperator.c
index 447bd801bdd7ca117137741d10cdbe4251864b1b..916b6df96971c88166bffe74f134deb66905d377 100644
--- a/source/libs/executor/src/scanoperator.c
+++ b/source/libs/executor/src/scanoperator.c
@@ -13,6 +13,7 @@
* along with this program. If not, see .
*/
+#include
#include "executorimpl.h"
#include "filter.h"
#include "function.h"
@@ -232,25 +233,25 @@ static SResultRow* getTableGroupOutputBuf(SOperatorInfo* pOperator, uint64_t gro
STableScanInfo* pTableScanInfo = pOperator->info;
- SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(pTableScanInfo->pdInfo.pAggSup->pResultRowHashTable, buf,
+ SResultRowPosition* p1 = (SResultRowPosition*)tSimpleHashGet(pTableScanInfo->base.pdInfo.pAggSup->pResultRowHashTable, buf,
GET_RES_WINDOW_KEY_LEN(sizeof(groupId)));
if (p1 == NULL) {
return NULL;
}
- *pPage = getBufPage(pTableScanInfo->pdInfo.pAggSup->pResultBuf, p1->pageId);
+ *pPage = getBufPage(pTableScanInfo->base.pdInfo.pAggSup->pResultBuf, p1->pageId);
return (SResultRow*)((char*)(*pPage) + p1->offset);
}
static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo* pBlockInfo, uint32_t* status) {
STableScanInfo* pTableScanInfo = pOperator->info;
- if (pTableScanInfo->pdInfo.pExprSup == NULL) {
+ if (pTableScanInfo->base.pdInfo.pExprSup == NULL) {
return TSDB_CODE_SUCCESS;
}
- SExprSupp* pSup1 = pTableScanInfo->pdInfo.pExprSup;
+ SExprSupp* pSup1 = pTableScanInfo->base.pdInfo.pExprSup;
SFilePage* pPage = NULL;
SResultRow* pRow = getTableGroupOutputBuf(pOperator, pBlockInfo->groupId, &pPage);
@@ -263,7 +264,7 @@ static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo*
for (int32_t i = 0; i < pSup1->numOfExprs; ++i) {
int32_t functionId = pSup1->pCtx[i].functionId;
- SResultRowEntryInfo* pEntry = getResultEntryInfo(pRow, i, pTableScanInfo->pdInfo.pExprSup->rowEntryInfoOffset);
+ SResultRowEntryInfo* pEntry = getResultEntryInfo(pRow, i, pTableScanInfo->base.pdInfo.pExprSup->rowEntryInfoOffset);
int32_t reqStatus = fmFuncDynDataRequired(functionId, pEntry, &pBlockInfo->window);
if (reqStatus != FUNC_DATA_REQUIRED_NOT_LOAD) {
@@ -273,7 +274,7 @@ static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo*
}
// release buffer pages
- releaseBufPage(pTableScanInfo->pdInfo.pAggSup->pResultBuf, pPage);
+ releaseBufPage(pTableScanInfo->base.pdInfo.pAggSup->pResultBuf, pPage);
if (notLoadBlock) {
*status = FUNC_DATA_REQUIRED_NOT_LOAD;
@@ -283,7 +284,7 @@ static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo*
}
static bool doFilterByBlockSMA(SFilterInfo* pFilterInfo, SColumnDataAgg** pColsAgg, int32_t numOfCols,
- int32_t numOfRows) {
+ int32_t numOfRows) {
if (pColsAgg == NULL || pFilterInfo == NULL) {
return true;
}
@@ -292,7 +293,7 @@ static bool doFilterByBlockSMA(SFilterInfo* pFilterInfo, SColumnDataAgg** pColsA
return keep;
}
-static bool doLoadBlockSMA(STableScanInfo* pTableScanInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo) {
+static bool doLoadBlockSMA(STableScanBase* pTableScanInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo) {
bool allColumnsHaveAgg = true;
SColumnDataAgg** pColAgg = NULL;
@@ -329,22 +330,26 @@ static bool doLoadBlockSMA(STableScanInfo* pTableScanInfo, SSDataBlock* pBlock,
return true;
}
-static void doSetTagColumnData(STableScanInfo* pTableScanInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo,
+static void doSetTagColumnData(STableScanBase* pTableScanInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo,
int32_t rows) {
if (pTableScanInfo->pseudoSup.numOfExprs > 0) {
SExprSupp* pSup = &pTableScanInfo->pseudoSup;
int32_t code = addTagPseudoColumnData(&pTableScanInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pBlock, rows,
- GET_TASKID(pTaskInfo));
- if (code != TSDB_CODE_SUCCESS) {
+ GET_TASKID(pTaskInfo), &pTableScanInfo->metaCache);
+ // ignore the table not exists error, since this table may have been dropped during the scan procedure.
+ if (code != TSDB_CODE_SUCCESS && code != TSDB_CODE_PAR_TABLE_NOT_EXIST) {
T_LONG_JMP(pTaskInfo->env, code);
}
+
+ // reset the error code.
+ terrno = 0;
}
}
// todo handle the slimit info
void applyLimitOffset(SLimitInfo* pLimitInfo, SSDataBlock* pBlock, SExecTaskInfo* pTaskInfo, SOperatorInfo* pOperator) {
- SLimit* pLimit = &pLimitInfo->limit;
+ SLimit* pLimit = &pLimitInfo->limit;
const char* id = GET_TASKID(pTaskInfo);
if (pLimit->offset > 0 && pLimitInfo->remainOffset > 0) {
@@ -369,19 +374,16 @@ void applyLimitOffset(SLimitInfo* pLimitInfo, SSDataBlock* pBlock, SExecTaskInfo
}
}
-static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableScanInfo, SSDataBlock* pBlock,
+static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanBase* pTableScanInfo, SSDataBlock* pBlock,
uint32_t* status) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- STableScanInfo* pInfo = pOperator->info;
-
SFileBlockLoadRecorder* pCost = &pTableScanInfo->readRecorder;
pCost->totalBlocks += 1;
pCost->totalRows += pBlock->info.rows;
bool loadSMA = false;
-
- *status = pInfo->dataBlockLoadFlag;
+ *status = pTableScanInfo->dataBlockLoadFlag;
if (pOperator->exprSupp.pFilterInfo != NULL ||
overlapWithTimeWindow(&pTableScanInfo->pdInfo.interval, &pBlock->info, pTableScanInfo->cond.order)) {
(*status) = FUNC_DATA_REQUIRED_DATA_LOAD;
@@ -480,62 +482,156 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableSca
}
}
- applyLimitOffset(&pInfo->limitInfo, pBlock, pTaskInfo, pOperator);
+ applyLimitOffset(&pTableScanInfo->limitInfo, pBlock, pTaskInfo, pOperator);
pCost->totalRows += pBlock->info.rows;
- pInfo->limitInfo.numOfOutputRows = pCost->totalRows;
+ pTableScanInfo->limitInfo.numOfOutputRows = pCost->totalRows;
return TSDB_CODE_SUCCESS;
}
-static void prepareForDescendingScan(STableScanInfo* pTableScanInfo, SqlFunctionCtx* pCtx, int32_t numOfOutput) {
+static void prepareForDescendingScan(STableScanBase* pTableScanInfo, SqlFunctionCtx* pCtx, int32_t numOfOutput) {
SET_REVERSE_SCAN_FLAG(pTableScanInfo);
switchCtxOrder(pCtx, numOfOutput);
- // setupQueryRangeForReverseScan(pTableScanInfo);
-
pTableScanInfo->cond.order = TSDB_ORDER_DESC;
STimeWindow* pTWindow = &pTableScanInfo->cond.twindows;
TSWAP(pTWindow->skey, pTWindow->ekey);
}
-int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int32_t numOfPseudoExpr,
- SSDataBlock* pBlock, int32_t rows, const char* idStr) {
+typedef struct STableCachedVal {
+ const char* pName;
+ STag* pTags;
+} STableCachedVal;
+
+static void freeTableCachedVal(void* param) {
+ if (param == NULL) {
+ return;
+ }
+
+ STableCachedVal* pVal = param;
+ taosMemoryFree((void*)pVal->pName);
+ taosMemoryFree(pVal->pTags);
+ taosMemoryFree(pVal);
+}
+
+static STableCachedVal* createTableCacheVal(const SMetaReader* pMetaReader) {
+ STableCachedVal* pVal = taosMemoryMalloc(sizeof(STableCachedVal));
+ pVal->pName = strdup(pMetaReader->me.name);
+ pVal->pTags = NULL;
+
+ // only child table has tag value
+ if (pMetaReader->me.type == TSDB_CHILD_TABLE) {
+ STag* pTag = (STag*)pMetaReader->me.ctbEntry.pTags;
+ pVal->pTags = taosMemoryMalloc(pTag->len);
+ memcpy(pVal->pTags, pTag, pTag->len);
+ }
+
+ return pVal;
+}
+
+// const void *key, size_t keyLen, void *value
+static void freeCachedMetaItem(const void* key, size_t keyLen, void* value) { freeTableCachedVal(value); }
+
+int32_t addTagPseudoColumnData(SReadHandle* pHandle, const SExprInfo* pExpr, int32_t numOfExpr, SSDataBlock* pBlock,
+ int32_t rows, const char* idStr, STableMetaCacheInfo* pCache) {
// currently only the tbname pseudo column
- if (numOfPseudoExpr <= 0) {
+ if (numOfExpr <= 0) {
return TSDB_CODE_SUCCESS;
}
+ int32_t code = 0;
+
// backup the rows
int32_t backupRows = pBlock->info.rows;
pBlock->info.rows = rows;
+ bool freeReader = false;
+ STableCachedVal val = {0};
+
SMetaReader mr = {0};
- metaReaderInit(&mr, pHandle->meta, 0);
- int32_t code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
- metaReaderReleaseLock(&mr);
+ LRUHandle* h = NULL;
- if (code != TSDB_CODE_SUCCESS) {
- qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
- metaReaderClear(&mr);
- return terrno;
+ // 1. check if it is existed in meta cache
+ if (pCache == NULL) {
+ metaReaderInit(&mr, pHandle->meta, 0);
+ code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
+ if (code != TSDB_CODE_SUCCESS) {
+ if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
+ qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid,
+ tstrerror(terrno), idStr);
+ } else {
+ qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno), idStr);
+ }
+ metaReaderClear(&mr);
+ return terrno;
+ }
+
+ metaReaderReleaseLock(&mr);
+
+ val.pName = mr.me.name;
+ val.pTags = (STag*)mr.me.ctbEntry.pTags;
+
+ freeReader = true;
+ } else {
+ pCache->metaFetch += 1;
+
+ h = taosLRUCacheLookup(pCache->pTableMetaEntryCache, &pBlock->info.uid, sizeof(pBlock->info.uid));
+ if (h == NULL) {
+ metaReaderInit(&mr, pHandle->meta, 0);
+ code = metaGetTableEntryByUid(&mr, pBlock->info.uid);
+ if (code != TSDB_CODE_SUCCESS) {
+ if (terrno == TSDB_CODE_PAR_TABLE_NOT_EXIST) {
+ qWarn("failed to get table meta, table may have been dropped, uid:0x%" PRIx64 ", code:%s, %s",
+ pBlock->info.uid, tstrerror(terrno), idStr);
+ } else {
+ qError("failed to get table meta, uid:0x%" PRIx64 ", code:%s, %s", pBlock->info.uid, tstrerror(terrno),
+ idStr);
+ }
+ metaReaderClear(&mr);
+ return terrno;
+ }
+
+ metaReaderReleaseLock(&mr);
+
+ STableCachedVal* pVal = createTableCacheVal(&mr);
+
+ val = *pVal;
+ freeReader = true;
+
+ int32_t ret = taosLRUCacheInsert(pCache->pTableMetaEntryCache, &pBlock->info.uid, sizeof(uint64_t), pVal,
+ sizeof(STableCachedVal), freeCachedMetaItem, NULL, TAOS_LRU_PRIORITY_LOW);
+ if (ret != TAOS_LRU_STATUS_OK) {
+ qError("failed to put meta into lru cache, code:%d, %s", ret, idStr);
+ freeTableCachedVal(pVal);
+ }
+ } else {
+ pCache->cacheHit += 1;
+ STableCachedVal* pVal = taosLRUCacheValue(pCache->pTableMetaEntryCache, h);
+ val = *pVal;
+
+ taosLRUCacheRelease(pCache->pTableMetaEntryCache, h, false);
+ }
+
+ qDebug("retrieve table meta from cache:%" PRIu64 ", hit:%" PRIu64 " miss:%" PRIu64 ", %s", pCache->metaFetch,
+ pCache->cacheHit, (pCache->metaFetch - pCache->cacheHit), idStr);
}
- for (int32_t j = 0; j < numOfPseudoExpr; ++j) {
- SExprInfo* pExpr = &pPseudoExpr[j];
- int32_t dstSlotId = pExpr->base.resSchema.slotId;
+ for (int32_t j = 0; j < numOfExpr; ++j) {
+ const SExprInfo* pExpr1 = &pExpr[j];
+ int32_t dstSlotId = pExpr1->base.resSchema.slotId;
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, dstSlotId);
colInfoDataCleanup(pColInfoData, pBlock->info.rows);
- int32_t functionId = pExpr->pExpr->_function.functionId;
+ int32_t functionId = pExpr1->pExpr->_function.functionId;
// this is to handle the tbname
if (fmIsScanPseudoColumnFunc(functionId)) {
- setTbNameColData(pBlock, pColInfoData, functionId, mr.me.name);
+ setTbNameColData(pBlock, pColInfoData, functionId, val.pName);
} else { // these are tags
STagVal tagVal = {0};
- tagVal.cid = pExpr->base.pParam[0].pCol->colId;
- const char* p = metaGetTableTagVal(mr.me.ctbEntry.pTags, pColInfoData->info.type, &tagVal);
+ tagVal.cid = pExpr1->base.pParam[0].pCol->colId;
+ const char* p = metaGetTableTagVal(val.pTags, pColInfoData->info.type, &tagVal);
char* data = NULL;
if (pColInfoData->info.type != TSDB_DATA_TYPE_JSON && p != NULL) {
@@ -560,10 +656,12 @@ int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int
}
}
- metaReaderClear(&mr);
-
// restore the rows
pBlock->info.rows = backupRows;
+ if (freeReader) {
+ metaReaderClear(&mr);
+ }
+
return TSDB_CODE_SUCCESS;
}
@@ -572,7 +670,7 @@ void setTbNameColData(const SSDataBlock* pBlock, SColumnInfoData* pColInfoData,
fmGetScalarFuncExecFuncs(functionId, &fpSet);
size_t len = TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE;
- char buf[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
+ char buf[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
STR_TO_VARSTR(buf, name)
SColumnInfoData infoData = createColumnInfoData(TSDB_DATA_TYPE_VARCHAR, len, 1);
@@ -599,7 +697,7 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
int64_t st = taosGetTimestampUs();
- while (tsdbNextDataBlock(pTableScanInfo->dataReader)) {
+ while (tsdbNextDataBlock(pTableScanInfo->base.dataReader)) {
if (isTaskKilled(pTaskInfo)) {
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
}
@@ -614,7 +712,7 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
SDataBlockInfo* pBInfo = &pBlock->info;
int32_t rows = 0;
- tsdbRetrieveDataBlockInfo(pTableScanInfo->dataReader, &rows, &pBInfo->uid, &pBInfo->window);
+ tsdbRetrieveDataBlockInfo(pTableScanInfo->base.dataReader, &rows, &pBInfo->uid, &pBInfo->window);
blockDataEnsureCapacity(pBlock, rows); // todo remove it latter
pBInfo->rows = rows;
@@ -623,7 +721,7 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
pBlock->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.uid);
uint32_t status = 0;
- int32_t code = loadDataBlock(pOperator, pTableScanInfo, pBlock, &status);
+ int32_t code = loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status);
// int32_t code = loadDataBlockOnDemand(pOperator->pRuntimeEnv, pTableScanInfo, pBlock, &status);
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pOperator->pTaskInfo->env, code);
@@ -634,10 +732,10 @@ static SSDataBlock* doTableScanImpl(SOperatorInfo* pOperator) {
continue;
}
- pOperator->resultInfo.totalRows = pTableScanInfo->readRecorder.totalRows;
- pTableScanInfo->readRecorder.elapsedTime += (taosGetTimestampUs() - st) / 1000.0;
+ pOperator->resultInfo.totalRows = pTableScanInfo->base.readRecorder.totalRows;
+ pTableScanInfo->base.readRecorder.elapsedTime += (taosGetTimestampUs() - st) / 1000.0;
- pOperator->cost.totalCost = pTableScanInfo->readRecorder.elapsedTime;
+ pOperator->cost.totalCost = pTableScanInfo->base.readRecorder.elapsedTime;
// todo refactor
/*pTableScanInfo->lastStatus.uid = pBlock->info.uid;*/
@@ -657,7 +755,7 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
// The read handle is not initialized yet, since no qualified tables exists
- if (pTableScanInfo->dataReader == NULL || pOperator->status == OP_EXEC_DONE) {
+ if (pTableScanInfo->base.dataReader == NULL || pOperator->status == OP_EXEC_DONE) {
return NULL;
}
@@ -672,19 +770,19 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
if (pTableScanInfo->scanTimes < pTableScanInfo->scanInfo.numOfAsc) {
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
- pTableScanInfo->scanFlag = REPEAT_SCAN;
+ pTableScanInfo->base.scanFlag = REPEAT_SCAN;
qDebug("start to repeat ascending order scan data blocks due to query func required, %s", GET_TASKID(pTaskInfo));
// do prepare for the next round table scan operation
- tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
+ tsdbReaderReset(pTableScanInfo->base.dataReader, &pTableScanInfo->base.cond);
}
}
int32_t total = pTableScanInfo->scanInfo.numOfAsc + pTableScanInfo->scanInfo.numOfDesc;
if (pTableScanInfo->scanTimes < total) {
- if (pTableScanInfo->cond.order == TSDB_ORDER_ASC) {
- prepareForDescendingScan(pTableScanInfo, pOperator->exprSupp.pCtx, 0);
- tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
+ if (pTableScanInfo->base.cond.order == TSDB_ORDER_ASC) {
+ prepareForDescendingScan(&pTableScanInfo->base, pOperator->exprSupp.pCtx, 0);
+ tsdbReaderReset(pTableScanInfo->base.dataReader, &pTableScanInfo->base.cond);
qDebug("%s start to descending order scan data blocks due to query func required", GET_TASKID(pTaskInfo));
}
@@ -698,10 +796,10 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
if (pTableScanInfo->scanTimes < total) {
setTaskStatus(pTaskInfo, TASK_NOT_COMPLETED);
- pTableScanInfo->scanFlag = REPEAT_SCAN;
+ pTableScanInfo->base.scanFlag = REPEAT_SCAN;
qDebug("%s start to repeat descending order scan data blocks", GET_TASKID(pTaskInfo));
- tsdbReaderReset(pTableScanInfo->dataReader, &pTableScanInfo->cond);
+ tsdbReaderReset(pTableScanInfo->base.dataReader, &pTableScanInfo->base.cond);
}
}
}
@@ -730,27 +828,27 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
}
STableKeyInfo* pTableInfo = tableListGetInfo(pTaskInfo->pTableInfoList, pInfo->currentTable);
- tsdbSetTableList(pInfo->dataReader, pTableInfo, 1);
+ tsdbSetTableList(pInfo->base.dataReader, pTableInfo, 1);
qDebug("set uid:%" PRIu64 " into scanner, total tables:%d, index:%d %s", pTableInfo->uid, numOfTables,
pInfo->currentTable, pTaskInfo->id.str);
- tsdbReaderReset(pInfo->dataReader, &pInfo->cond);
+ tsdbReaderReset(pInfo->base.dataReader, &pInfo->base.cond);
pInfo->scanTimes = 0;
}
} else { // scan table group by group sequentially
if (pInfo->currentGroupId == -1) {
if ((++pInfo->currentGroupId) >= tableListGetOutputGroups(pTaskInfo->pTableInfoList)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
int32_t num = 0;
STableKeyInfo* pList = NULL;
tableListGetGroupList(pTaskInfo->pTableInfoList, pInfo->currentGroupId, &pList, &num);
- ASSERT(pInfo->dataReader == NULL);
+ ASSERT(pInfo->base.dataReader == NULL);
- int32_t code = tsdbReaderOpen(pInfo->readHandle.vnode, &pInfo->cond, pList, num,
- (STsdbReader**)&pInfo->dataReader, GET_TASKID(pTaskInfo));
+ int32_t code = tsdbReaderOpen(pInfo->base.readHandle.vnode, &pInfo->base.cond, pList, num,
+ (STsdbReader**)&pInfo->base.dataReader, GET_TASKID(pTaskInfo));
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -763,21 +861,21 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
}
if ((++pInfo->currentGroupId) >= tableListGetOutputGroups(pTaskInfo->pTableInfoList)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
// reset value for the next group data output
pOperator->status = OP_OPENED;
- pInfo->limitInfo.numOfOutputRows = 0;
- pInfo->limitInfo.remainOffset = pInfo->limitInfo.limit.offset;
+ pInfo->base.limitInfo.numOfOutputRows = 0;
+ pInfo->base.limitInfo.remainOffset = pInfo->base.limitInfo.limit.offset;
int32_t num = 0;
STableKeyInfo* pList = NULL;
tableListGetGroupList(pTaskInfo->pTableInfoList, pInfo->currentGroupId, &pList, &num);
- tsdbSetTableList(pInfo->dataReader, pList, num);
- tsdbReaderReset(pInfo->dataReader, &pInfo->cond);
+ tsdbSetTableList(pInfo->base.dataReader, pList, num);
+ tsdbReaderReset(pInfo->base.dataReader, &pInfo->base.cond);
pInfo->scanTimes = 0;
result = doGroupedTableScan(pOperator);
@@ -785,7 +883,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
return result;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
}
@@ -793,7 +891,7 @@ static SSDataBlock* doTableScan(SOperatorInfo* pOperator) {
static int32_t getTableScannerExecInfo(struct SOperatorInfo* pOptr, void** pOptrExplain, uint32_t* len) {
SFileBlockLoadRecorder* pRecorder = taosMemoryCalloc(1, sizeof(SFileBlockLoadRecorder));
STableScanInfo* pTableScanInfo = pOptr->info;
- *pRecorder = pTableScanInfo->readRecorder;
+ *pRecorder = pTableScanInfo->base.readRecorder;
*pOptrExplain = pRecorder;
*len = sizeof(SFileBlockLoadRecorder);
return 0;
@@ -802,16 +900,17 @@ static int32_t getTableScannerExecInfo(struct SOperatorInfo* pOptr, void** pOptr
static void destroyTableScanOperatorInfo(void* param) {
STableScanInfo* pTableScanInfo = (STableScanInfo*)param;
blockDataDestroy(pTableScanInfo->pResBlock);
- cleanupQueryTableDataCond(&pTableScanInfo->cond);
+ cleanupQueryTableDataCond(&pTableScanInfo->base.cond);
- tsdbReaderClose(pTableScanInfo->dataReader);
- pTableScanInfo->dataReader = NULL;
+ tsdbReaderClose(pTableScanInfo->base.dataReader);
+ pTableScanInfo->base.dataReader = NULL;
- if (pTableScanInfo->matchInfo.pList != NULL) {
- taosArrayDestroy(pTableScanInfo->matchInfo.pList);
+ if (pTableScanInfo->base.matchInfo.pList != NULL) {
+ taosArrayDestroy(pTableScanInfo->base.matchInfo.pList);
}
- cleanupExprSupp(&pTableScanInfo->pseudoSup);
+ taosLRUCacheCleanup(pTableScanInfo->base.metaCache.pTableMetaEntryCache);
+ cleanupExprSupp(&pTableScanInfo->base.pseudoSup);
taosMemoryFreeClear(param);
}
@@ -823,35 +922,37 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
goto _error;
}
- SScanPhysiNode* pScanNode = &pTableScanNode->scan;
+ SScanPhysiNode* pScanNode = &pTableScanNode->scan;
SDataBlockDescNode* pDescNode = pScanNode->node.pOutputDataBlockDesc;
int32_t numOfCols = 0;
- int32_t code = extractColMatchInfo(pScanNode->pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID,
- &pInfo->matchInfo);
+ int32_t code =
+ extractColMatchInfo(pScanNode->pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID, &pInfo->base.matchInfo);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- initLimitInfo(pScanNode->node.pLimit, pScanNode->node.pSlimit, &pInfo->limitInfo);
- code = initQueryTableDataCond(&pInfo->cond, pTableScanNode);
+ initLimitInfo(pScanNode->node.pLimit, pScanNode->node.pSlimit, &pInfo->base.limitInfo);
+ code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
if (pScanNode->pScanPseudoCols != NULL) {
- SExprSupp* pSup = &pInfo->pseudoSup;
+ SExprSupp* pSup = &pInfo->base.pseudoSup;
pSup->pExprInfo = createExprInfo(pScanNode->pScanPseudoCols, NULL, &pSup->numOfExprs);
pSup->pCtx = createSqlFunctionCtx(pSup->pExprInfo, pSup->numOfExprs, &pSup->rowEntryInfoOffset);
}
pInfo->scanInfo = (SScanInfo){.numOfAsc = pTableScanNode->scanSeq[0], .numOfDesc = pTableScanNode->scanSeq[1]};
- pInfo->pdInfo.interval = extractIntervalInfo(pTableScanNode);
- pInfo->readHandle = *readHandle;
+
+ pInfo->base.scanFlag = MAIN_SCAN;
+ pInfo->base.pdInfo.interval = extractIntervalInfo(pTableScanNode);
+ pInfo->base.readHandle = *readHandle;
pInfo->sample.sampleRatio = pTableScanNode->ratio;
pInfo->sample.seed = taosGetTimestampSec();
- pInfo->dataBlockLoadFlag = pTableScanNode->dataRequired;
+ pInfo->base.dataBlockLoadFlag = pTableScanNode->dataRequired;
initResultSizeInfo(&pOperator->resultInfo, 4096);
pInfo->pResBlock = createResDataBlock(pDescNode);
@@ -862,19 +963,21 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
goto _error;
}
- pInfo->scanFlag = MAIN_SCAN;
pInfo->currentGroupId = -1;
pInfo->assignBlockUid = pTableScanNode->assignBlockUid;
- pOperator->name = "TableScanOperator"; // for debug purpose
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "TableScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
pOperator->exprSupp.numOfExprs = numOfCols;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScan, NULL, NULL, destroyTableScanOperatorInfo,
+ pInfo->base.metaCache.pTableMetaEntryCache = taosLRUCacheInit(1024 * 128, -1, .5);
+ if (pInfo->base.metaCache.pTableMetaEntryCache == NULL) {
+ code = terrno;
+ goto _error;
+ }
+
+ taosLRUCacheSetStrictCapacity(pInfo->base.metaCache.pTableMetaEntryCache, false);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScan, NULL, destroyTableScanOperatorInfo,
getTableScannerExecInfo);
// for non-blocking operator, the open cost is always 0
@@ -895,17 +998,12 @@ SOperatorInfo* createTableSeqScanOperatorInfo(void* pReadHandle, SExecTaskInfo*
STableScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableScanInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- pInfo->dataReader = pReadHandle;
+ pInfo->base.dataReader = pReadHandle;
// pInfo->prevGroupId = -1;
- pOperator->name = "TableSeqScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
-
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScanImpl, NULL, NULL, NULL, NULL);
+ setOperatorInfo(pOperator, "TableSeqScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SEQ_SCAN, false, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableScanImpl, NULL, NULL, NULL);
return pOperator;
}
@@ -961,8 +1059,8 @@ static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
- int32_t code = doGetTableRowSize(pBlockScanInfo->readHandle.meta, pBlockScanInfo->uid, (int32_t*)&blockDistInfo.rowSize,
- GET_TASKID(pTaskInfo));
+ int32_t code = doGetTableRowSize(pBlockScanInfo->readHandle.meta, pBlockScanInfo->uid,
+ (int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -1060,15 +1158,10 @@ SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDi
goto _error;
}
- pOperator->name = "DataBlockDistScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
-
+ setOperatorInfo(pOperator, "DataBlockDistScanOperator", QUERY_NODE_PHYSICAL_PLAN_BLOCK_DIST_SCAN, false,
+ OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doBlockInfoScan, NULL, NULL, destroyBlockDistScanOperatorInfo, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, doBlockInfoScan, NULL, destroyBlockDistScanOperatorInfo, NULL);
return pOperator;
_error:
@@ -1112,11 +1205,11 @@ static void setGroupId(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t grou
}
void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin) {
- pTableScanInfo->cond.twindows = *pWin;
+ pTableScanInfo->base.cond.twindows = *pWin;
pTableScanInfo->scanTimes = 0;
pTableScanInfo->currentGroupId = -1;
- tsdbReaderClose(pTableScanInfo->dataReader);
- pTableScanInfo->dataReader = NULL;
+ tsdbReaderClose(pTableScanInfo->base.dataReader);
+ pTableScanInfo->base.dataReader = NULL;
}
static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbUid, TSKEY startTs, TSKEY endTs,
@@ -1124,7 +1217,7 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
STableKeyInfo tblInfo = {.uid = tbUid, .groupId = 0};
STableScanInfo* pTableScanInfo = pTableScanOp->info;
- SQueryTableDataCond cond = pTableScanInfo->cond;
+ SQueryTableDataCond cond = pTableScanInfo->base.cond;
cond.startVersion = -1;
cond.endVersion = maxVersion;
@@ -1136,7 +1229,7 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
blockDataCleanup(pBlock);
STsdbReader* pReader = NULL;
- int32_t code = tsdbReaderOpen(pTableScanInfo->readHandle.vnode, &cond, &tblInfo, 1, (STsdbReader**)&pReader,
+ int32_t code = tsdbReaderOpen(pTableScanInfo->base.readHandle.vnode, &cond, &tblInfo, 1, (STsdbReader**)&pReader,
GET_TASKID(pTaskInfo));
if (code != TSDB_CODE_SUCCESS) {
terrno = code;
@@ -1155,8 +1248,8 @@ static SSDataBlock* readPreVersionData(SOperatorInfo* pTableScanOp, uint64_t tbU
blockDataEnsureCapacity(pBlock, rows);
pBlock->info.rows = rows;
- relocateColumnData(pBlock, pTableScanInfo->matchInfo.pList, pCols, true);
- doSetTagColumnData(pTableScanInfo, pBlock, pTaskInfo, rows);
+ relocateColumnData(pBlock, pTableScanInfo->base.matchInfo.pList, pCols, true);
+ doSetTagColumnData(&pTableScanInfo->base, pBlock, pTaskInfo, rows);
pBlock->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBInfo->uid);
}
@@ -1283,8 +1376,8 @@ static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32
*pRowIndex = 0;
pInfo->updateWin = (STimeWindow){.skey = INT64_MIN, .ekey = INT64_MAX};
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
- tsdbReaderClose(pTableScanInfo->dataReader);
- pTableScanInfo->dataReader = NULL;
+ tsdbReaderClose(pTableScanInfo->base.dataReader);
+ pTableScanInfo->base.dataReader = NULL;
return NULL;
}
@@ -1350,7 +1443,7 @@ static int32_t generateSessionScanRange(SStreamScanInfo* pInfo, SSDataBlock* pSr
uint64_t groupId = getGroupIdByData(pInfo, uidCol[i], startData[i], version);
// gap must be 0.
SSessionKey startWin = {0};
- getCurSessionWindow(pInfo->windowSup.pStreamAggSup, startData[i], endData[i], groupId, &startWin);
+ getCurSessionWindow(pInfo->windowSup.pStreamAggSup, startData[i], startData[i], groupId, &startWin);
if (IS_INVALID_SESSION_WIN_KEY(startWin)) {
// window has been closed.
continue;
@@ -1442,10 +1535,19 @@ static int32_t generateDeleteResultBlock(SStreamScanInfo* pInfo, SSDataBlock* pS
for (int32_t i = 0; i < pSrcBlock->info.rows; i++) {
uint64_t srcUid = srcUidData[i];
uint64_t groupId = srcGp[i];
+ char* tbname[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN] = {0};
if (groupId == 0) {
groupId = getGroupIdByData(pInfo, srcUid, srcStartTsCol[i], version);
}
- appendOneRowToStreamSpecialBlock(pDestBlock, srcStartTsCol + i, srcEndTsCol + i, srcUidData + i, &groupId, NULL);
+ if (pInfo->tbnameCalSup.pExprInfo) {
+ void* parTbname = NULL;
+ streamStateGetParName(pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState, groupId, &parTbname);
+
+ memcpy(varDataVal(tbname), parTbname, TSDB_TABLE_NAME_LEN);
+ varDataSetLen(tbname, strlen(varDataVal(tbname)));
+ }
+ appendOneRowToStreamSpecialBlock(pDestBlock, srcStartTsCol + i, srcEndTsCol + i, srcUidData + i, &groupId,
+ tbname[0] == 0 ? NULL : tbname);
}
return TSDB_CODE_SUCCESS;
}
@@ -1489,10 +1591,20 @@ static void calBlockTag(SExprSupp* pTagCalSup, SSDataBlock* pBlock, SSDataBlock*
blockDataDestroy(pSrcBlock);
}
-static void calBlockTbName(SExprSupp* pTbNameCalSup, SSDataBlock* pBlock) {
+void calBlockTbName(SStreamScanInfo* pInfo, SSDataBlock* pBlock) {
+ SExprSupp* pTbNameCalSup = &pInfo->tbnameCalSup;
+ SStreamState* pState = pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState;
if (pTbNameCalSup == NULL || pTbNameCalSup->numOfExprs == 0) return;
if (pBlock == NULL || pBlock->info.rows == 0) return;
+ void* tbname = NULL;
+ if (streamStateGetParName(pInfo->pStreamScanOp->pTaskInfo->streamInfo.pState, pBlock->info.groupId, &tbname) < 0) {
+ pBlock->info.parTbName[0] = 0;
+ } else {
+ memcpy(pBlock->info.parTbName, tbname, TSDB_TABLE_NAME_LEN);
+ }
+ tdbFree(tbname);
+
SSDataBlock* pSrcBlock = blockCopyOneRow(pBlock, 0);
ASSERT(pSrcBlock->info.rows == 1);
@@ -1511,12 +1623,18 @@ static void calBlockTbName(SExprSupp* pTbNameCalSup, SSDataBlock* pBlock) {
void* pData = colDataGetData(pCol, 0);
// TODO check tbname validation
if (pData != (void*)-1 && pData != NULL) {
- memcpy(pBlock->info.parTbName, varDataVal(pData), TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN));
- pBlock->info.parTbName[TSDB_TABLE_NAME_LEN - 1] = 0;
+ memset(pBlock->info.parTbName, 0, TSDB_TABLE_NAME_LEN);
+ int32_t len = TMIN(varDataLen(pData), TSDB_TABLE_NAME_LEN - 1);
+ memcpy(pBlock->info.parTbName, varDataVal(pData), len);
+ /*pBlock->info.parTbName[len + 1] = 0;*/
} else {
pBlock->info.parTbName[0] = 0;
}
+ if (pBlock->info.groupId && pBlock->info.parTbName[0]) {
+ streamStatePutParName(pState, pBlock->info.groupId, pBlock->info.parTbName);
+ }
+
blockDataDestroy(pSrcBlock);
blockDataDestroy(pResBlock);
}
@@ -1624,7 +1742,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
// currently only the tbname pseudo column
if (pInfo->numOfPseudoExpr > 0) {
int32_t code = addTagPseudoColumnData(&pInfo->readHandle, pInfo->pPseudoExpr, pInfo->numOfPseudoExpr, pInfo->pRes,
- pInfo->pRes->info.rows, GET_TASKID(pTaskInfo));
+ pInfo->pRes->info.rows, GET_TASKID(pTaskInfo), NULL);
if (code != TSDB_CODE_SUCCESS) {
blockDataFreeRes((SSDataBlock*)pBlock);
T_LONG_JMP(pTaskInfo->env, code);
@@ -1638,7 +1756,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
blockDataFreeRes((SSDataBlock*)pBlock);
- calBlockTbName(&pInfo->tbnameCalSup, pInfo->pRes);
+ calBlockTbName(pInfo, pInfo->pRes);
return 0;
}
@@ -1693,11 +1811,12 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
} else {
if (!pTaskInfo->streamInfo.returned) {
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
- tsdbReaderClose(pTSInfo->dataReader);
- pTSInfo->dataReader = NULL;
+ tsdbReaderClose(pTSInfo->base.dataReader);
+ pTSInfo->base.dataReader = NULL;
tqOffsetResetToLog(&pTaskInfo->streamInfo.prepareStatus, pTaskInfo->streamInfo.snapshotVer);
qDebug("queue scan tsdb over, switch to wal ver %" PRId64 "", pTaskInfo->streamInfo.snapshotVer + 1);
if (tqSeekVer(pInfo->tqReader, pTaskInfo->streamInfo.snapshotVer + 1) < 0) {
+ tqOffsetResetToLog(&pTaskInfo->streamInfo.lastStatus, pTaskInfo->streamInfo.snapshotVer);
return NULL;
}
ASSERT(pInfo->tqReader->pWalReader->curVersion == pTaskInfo->streamInfo.snapshotVer + 1);
@@ -1859,22 +1978,22 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE1 ||
pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE2) {
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
- memcpy(&pTSInfo->cond, &pTaskInfo->streamInfo.tableCond, sizeof(SQueryTableDataCond));
+ memcpy(&pTSInfo->base.cond, &pTaskInfo->streamInfo.tableCond, sizeof(SQueryTableDataCond));
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__PREPARE1) {
- pTSInfo->cond.startVersion = 0;
- pTSInfo->cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer1;
- qDebug("stream recover step 1, from %" PRId64 " to %" PRId64, pTSInfo->cond.startVersion,
- pTSInfo->cond.endVersion);
+ pTSInfo->base.cond.startVersion = 0;
+ pTSInfo->base.cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer1;
+ qDebug("stream recover step 1, from %" PRId64 " to %" PRId64, pTSInfo->base.cond.startVersion,
+ pTSInfo->base.cond.endVersion);
} else {
- pTSInfo->cond.startVersion = pTaskInfo->streamInfo.fillHistoryVer1 + 1;
- pTSInfo->cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer2;
- qDebug("stream recover step 2, from %" PRId64 " to %" PRId64, pTSInfo->cond.startVersion,
- pTSInfo->cond.endVersion);
+ pTSInfo->base.cond.startVersion = pTaskInfo->streamInfo.fillHistoryVer1 + 1;
+ pTSInfo->base.cond.endVersion = pTaskInfo->streamInfo.fillHistoryVer2;
+ qDebug("stream recover step 2, from %" PRId64 " to %" PRId64, pTSInfo->base.cond.startVersion,
+ pTSInfo->base.cond.endVersion);
}
/*resetTableScanInfo(pTSInfo, pWin);*/
- tsdbReaderClose(pTSInfo->dataReader);
- pTSInfo->dataReader = NULL;
+ tsdbReaderClose(pTSInfo->base.dataReader);
+ pTSInfo->base.dataReader = NULL;
pTSInfo->scanTimes = 0;
pTSInfo->currentGroupId = -1;
@@ -1884,18 +2003,22 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__SCAN) {
SSDataBlock* pBlock = doTableScan(pInfo->pTableScanOp);
if (pBlock != NULL) {
- calBlockTbName(&pInfo->tbnameCalSup, pBlock);
- updateInfoFillBlockData(pInfo->pUpdateInfo, pBlock, pInfo->primaryTsIndex);
+ calBlockTbName(pInfo, pBlock);
+ if (pInfo->pUpdateInfo) {
+ TSKEY maxTs = updateInfoFillBlockData(pInfo->pUpdateInfo, pBlock, pInfo->primaryTsIndex);
+ pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs);
+ }
qDebug("stream recover scan get block, rows %d", pBlock->info.rows);
+ printDataBlock(pBlock, "scan recover");
return pBlock;
}
pTaskInfo->streamInfo.recoverStep = STREAM_RECOVER_STEP__NONE;
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
- tsdbReaderClose(pTSInfo->dataReader);
- pTSInfo->dataReader = NULL;
+ tsdbReaderClose(pTSInfo->base.dataReader);
+ pTSInfo->base.dataReader = NULL;
- pTSInfo->cond.startVersion = -1;
- pTSInfo->cond.endVersion = -1;
+ pTSInfo->base.cond.startVersion = -1;
+ pTSInfo->base.cond.endVersion = -1;
return NULL;
}
@@ -1912,6 +2035,9 @@ FETCH_NEXT_BLOCK:
int32_t current = pInfo->validBlockIndex++;
SSDataBlock* pBlock = taosArrayGetP(pInfo->pBlockLists, current);
+ if (pBlock->info.groupId && pBlock->info.parTbName[0]) {
+ streamStatePutParName(pTaskInfo->streamInfo.pState, pBlock->info.groupId, pBlock->info.parTbName);
+ }
// TODO move into scan
pBlock->info.calWin.skey = INT64_MIN;
pBlock->info.calWin.ekey = INT64_MAX;
@@ -2000,12 +2126,12 @@ FETCH_NEXT_BLOCK:
SSDataBlock* pSDB = doRangeScan(pInfo, pInfo->pUpdateRes, pInfo->primaryTsIndex, &pInfo->updateResIndex);
if (pSDB) {
STableScanInfo* pTableScanInfo = pInfo->pTableScanOp->info;
- uint64_t version = getReaderMaxVersion(pTableScanInfo->dataReader);
- updateInfoSetScanRange(pInfo->pUpdateInfo, &pTableScanInfo->cond.twindows, pInfo->groupId, version);
+ uint64_t version = getReaderMaxVersion(pTableScanInfo->base.dataReader);
+ updateInfoSetScanRange(pInfo->pUpdateInfo, &pTableScanInfo->base.cond.twindows, pInfo->groupId, version);
pSDB->info.type = pInfo->scanMode == STREAM_SCAN_FROM_DATAREADER_RANGE ? STREAM_NORMAL : STREAM_PULL_DATA;
checkUpdateData(pInfo, true, pSDB, false);
// printDataBlock(pSDB, "stream scan update");
- calBlockTbName(&pInfo->tbnameCalSup, pSDB);
+ calBlockTbName(pInfo, pSDB);
return pSDB;
}
blockDataCleanup(pInfo->pUpdateDataRes);
@@ -2280,11 +2406,10 @@ SOperatorInfo* createRawScanOperatorInfo(SReadHandle* pHandle, SExecTaskInfo* pT
pInfo->vnode = pHandle->vnode;
pInfo->sContext = pHandle->sContext;
- pOperator->name = "RawScanOperator";
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
+ setOperatorInfo(pOperator, "RawScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
- pOperator->fpSet = createOperatorFpSet(NULL, doRawScan, NULL, NULL, destroyRawScanOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(NULL, doRawScan, NULL, destroyRawScanOperatorInfo, NULL);
return pOperator;
_end:
@@ -2297,9 +2422,7 @@ _end:
static void destroyStreamScanOperatorInfo(void* param) {
SStreamScanInfo* pStreamScan = (SStreamScanInfo*)param;
if (pStreamScan->pTableScanOp && pStreamScan->pTableScanOp->info) {
- STableScanInfo* pTableScanInfo = pStreamScan->pTableScanOp->info;
- destroyTableScanOperatorInfo(pTableScanInfo);
- taosMemoryFreeClear(pStreamScan->pTableScanOp);
+ destroyOperatorInfo(pStreamScan->pTableScanOp);
}
if (pStreamScan->tqReader) {
tqCloseReader(pStreamScan->tqReader);
@@ -2312,6 +2435,8 @@ static void destroyStreamScanOperatorInfo(void* param) {
taosMemoryFree(pStreamScan->pPseudoExpr);
}
+ cleanupExprSupp(&pStreamScan->tbnameCalSup);
+
updateInfoDestroy(pStreamScan->pUpdateInfo);
blockDataDestroy(pStreamScan->pRes);
blockDataDestroy(pStreamScan->pUpdateRes);
@@ -2393,7 +2518,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
SOperatorInfo* pTableScanOp = createTableScanOperatorInfo(pTableScanNode, pHandle, pTaskInfo);
STableScanInfo* pTSInfo = (STableScanInfo*)pTableScanOp->info;
if (pHandle->version > 0) {
- pTSInfo->cond.endVersion = pHandle->version;
+ pTSInfo->base.cond.endVersion = pHandle->version;
}
STableKeyInfo* pList = NULL;
@@ -2402,8 +2527,8 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
if (pHandle->initTableReader) {
pTSInfo->scanMode = TABLE_SCAN__TABLE_ORDER;
- pTSInfo->dataReader = NULL;
- code = tsdbReaderOpen(pHandle->vnode, &pTSInfo->cond, pList, num, &pTSInfo->dataReader, NULL);
+ pTSInfo->base.dataReader = NULL;
+ code = tsdbReaderOpen(pHandle->vnode, &pTSInfo->base.cond, pList, num, &pTSInfo->base.dataReader, NULL);
if (code != 0) {
terrno = code;
destroyTableScanOperatorInfo(pTableScanOp);
@@ -2439,7 +2564,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
goto _error;
}
taosArrayDestroy(tableIdList);
- memcpy(&pTaskInfo->streamInfo.tableCond, &pTSInfo->cond, sizeof(SQueryTableDataCond));
+ memcpy(&pTaskInfo->streamInfo.tableCond, &pTSInfo->base.cond, sizeof(SQueryTableDataCond));
} else {
taosArrayDestroy(pColIds);
}
@@ -2468,16 +2593,12 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
pInfo->assignBlockUid = pTableScanNode->assignBlockUid;
pInfo->partitionSup.needCalc = false;
- pOperator->name = "StreamScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "StreamScanOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
- pOperator->pTaskInfo = pTaskInfo;
__optr_fn_t nextFn = pTaskInfo->execModel == OPTR_EXEC_MODEL_STREAM ? doStreamScan : doQueueScan;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, nextFn, NULL, NULL, destroyStreamScanOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, nextFn, NULL, destroyStreamScanOperatorInfo, NULL);
return pOperator;
@@ -2812,7 +2933,7 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
}
blockDataDestroy(dataBlock);
pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
}
@@ -2865,7 +2986,7 @@ static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
if (ret != 0) {
metaCloseTbCursor(pInfo->pCur);
pInfo->pCur = NULL;
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
}
pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
@@ -3655,7 +3776,7 @@ static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
}
if (i >= taosArrayGetSize(pIdx->uids)) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
} else {
pIdx->lastIdx = i + 1;
}
@@ -3837,7 +3958,7 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
if (ret != 0) {
metaCloseTbCursor(pInfo->pCur);
pInfo->pCur = NULL;
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
}
pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
@@ -3859,7 +3980,7 @@ static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) {
doFilterResult(pInfo->pRes, pOperator->exprSupp.pFilterInfo);
pInfo->loadInfo.totalRows += pInfo->pRes->info.rows;
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return (pInfo->pRes->info.rows == 0) ? NULL : pInfo->pRes;
} else {
if (pInfo->showRewrite == false) {
@@ -4111,15 +4232,10 @@ SOperatorInfo* createSysTableScanOperatorInfo(void* readHandle, SSystemTableScan
pInfo->readHandle = *(SReadHandle*)readHandle;
}
- pOperator->name = "SysTableScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "SysTableScanOperator", QUERY_NODE_PHYSICAL_PLAN_SYSTABLE_SCAN, false, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = taosArrayGetSize(pInfo->pRes->pDataBlock);
- pOperator->pTaskInfo = pTaskInfo;
-
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doSysTableScan, NULL, NULL, destroySysScanOperator, NULL);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doSysTableScan, NULL, destroySysScanOperator, NULL);
return pOperator;
_error:
@@ -4195,7 +4311,7 @@ static SSDataBlock* doTagScan(SOperatorInfo* pOperator) {
count += 1;
if (++pInfo->curPos >= size) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
}
}
@@ -4231,7 +4347,7 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
int32_t numOfExprs = 0;
SExprInfo* pExprInfo = createExprInfo(pPhyNode->pScanPseudoCols, NULL, &numOfExprs);
- int32_t code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfExprs);
+ int32_t code = initExprSupp(&pOperator->exprSupp, pExprInfo, numOfExprs);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
@@ -4247,18 +4363,12 @@ SOperatorInfo* createTagScanOperatorInfo(SReadHandle* pReadHandle, STagScanPhysi
pInfo->readHandle = *pReadHandle;
pInfo->curPos = 0;
- pOperator->name = "TagScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN;
-
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
-
+ setOperatorInfo(pOperator, "TagScanOperator", QUERY_NODE_PHYSICAL_PLAN_TAG_SCAN, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
initResultSizeInfo(&pOperator->resultInfo, 4096);
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTagScan, NULL, NULL, destroyTagScanOperatorInfo, NULL);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTagScan, NULL, destroyTagScanOperatorInfo, NULL);
return pOperator;
@@ -4269,123 +4379,6 @@ _error:
return NULL;
}
-// todo refactor
-static int32_t loadDataBlockFromOneTable(SOperatorInfo* pOperator, STableMergeScanInfo* pTableScanInfo,
- SSDataBlock* pBlock, uint32_t* status) {
- SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
- STableMergeScanInfo* pInfo = pOperator->info;
-
- SFileBlockLoadRecorder* pCost = &pTableScanInfo->readRecorder;
-
- pCost->totalBlocks += 1;
- pCost->totalRows += pBlock->info.rows;
-
- *status = pInfo->dataBlockLoadFlag;
- if (pOperator->exprSupp.pFilterInfo != NULL ||
- overlapWithTimeWindow(&pTableScanInfo->interval, &pBlock->info, pTableScanInfo->cond.order)) {
- (*status) = FUNC_DATA_REQUIRED_DATA_LOAD;
- }
-
- SDataBlockInfo* pBlockInfo = &pBlock->info;
- taosMemoryFreeClear(pBlock->pBlockAgg);
-
- if (*status == FUNC_DATA_REQUIRED_FILTEROUT) {
- qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo),
- pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
- pCost->filterOutBlocks += 1;
- return TSDB_CODE_SUCCESS;
- } else if (*status == FUNC_DATA_REQUIRED_NOT_LOAD) {
- qDebug("%s data block skipped, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo),
- pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows);
- pCost->skipBlocks += 1;
-
- // clear all data in pBlock that are set when handing the previous block
- for (int32_t i = 0; i < taosArrayGetSize(pBlock->pDataBlock); ++i) {
- SColumnInfoData* pcol = taosArrayGet(pBlock->pDataBlock, i);
- pcol->pData = NULL;
- }
-
- return TSDB_CODE_SUCCESS;
- } else if (*status == FUNC_DATA_REQUIRED_SMA_LOAD) {
- pCost->loadBlockStatis += 1;
-
- bool allColumnsHaveAgg = true;
- SColumnDataAgg** pColAgg = NULL;
-
- if (allColumnsHaveAgg == true) {
- int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
-
- // todo create this buffer during creating operator
- if (pBlock->pBlockAgg == NULL) {
- pBlock->pBlockAgg = taosMemoryCalloc(numOfCols, POINTER_BYTES);
- }
-
- for (int32_t i = 0; i < numOfCols; ++i) {
- SColMatchItem* pColMatchInfo = taosArrayGet(pTableScanInfo->matchInfo.pList, i);
- if (!pColMatchInfo->needOutput) {
- continue;
- }
- pBlock->pBlockAgg[pColMatchInfo->dstSlotId] = pColAgg[i];
- }
-
- return TSDB_CODE_SUCCESS;
- } else { // failed to load the block sma data, data block statistics does not exist, load data block instead
- *status = FUNC_DATA_REQUIRED_DATA_LOAD;
- }
- }
-
- ASSERT(*status == FUNC_DATA_REQUIRED_DATA_LOAD);
-
- // todo filter data block according to the block sma data firstly
-#if 0
- if (!doFilterByBlockSMA(pBlock->pBlockStatis, pTableScanInfo->pCtx, pBlockInfo->rows)) {
- pCost->filterOutBlocks += 1;
- qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%d", GET_TASKID(pTaskInfo), pBlockInfo->window.skey,
- pBlockInfo->window.ekey, pBlockInfo->rows);
- (*status) = FUNC_DATA_REQUIRED_FILTEROUT;
- return TSDB_CODE_SUCCESS;
- }
-#endif
-
- pCost->totalCheckedRows += pBlock->info.rows;
- pCost->loadBlocks += 1;
-
- STsdbReader* reader = pTableScanInfo->pReader;
- SArray* pCols = tsdbRetrieveDataBlock(reader, NULL);
- if (pCols == NULL) {
- return terrno;
- }
-
- relocateColumnData(pBlock, pTableScanInfo->matchInfo.pList, pCols, true);
-
- // currently only the tbname pseudo column
- SExprSupp* pSup = &pTableScanInfo->pseudoSup;
-
- int32_t code = addTagPseudoColumnData(&pTableScanInfo->readHandle, pSup->pExprInfo, pSup->numOfExprs, pBlock,
- pBlock->info.rows, GET_TASKID(pTaskInfo));
- if (code != TSDB_CODE_SUCCESS) {
- T_LONG_JMP(pTaskInfo->env, code);
- }
-
- if (pOperator->exprSupp.pFilterInfo!= NULL) {
- int64_t st = taosGetTimestampMs();
- doFilter(pBlock, pOperator->exprSupp.pFilterInfo, &pTableScanInfo->matchInfo);
-
- double el = (taosGetTimestampUs() - st) / 1000.0;
- pTableScanInfo->readRecorder.filterTime += el;
-
- if (pBlock->info.rows == 0) {
- pCost->filterOutBlocks += 1;
- qDebug("%s data block filter out, brange:%" PRId64 "-%" PRId64 ", rows:%d, elapsed time:%.2f ms",
- GET_TASKID(pTaskInfo), pBlockInfo->window.skey, pBlockInfo->window.ekey, pBlockInfo->rows, el);
- } else {
- qDebug("%s data block filter applied, elapsed time:%.2f ms", GET_TASKID(pTaskInfo), el);
- }
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
static SSDataBlock* getTableDataBlockImpl(void* param) {
STableMergeScanSortSourceParam* source = param;
SOperatorInfo* pOperator = source->pOperator;
@@ -4400,15 +4393,15 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
int64_t st = taosGetTimestampUs();
- void* p = tableListGetInfo(pInfo->tableListInfo, readIdx + pInfo->tableStartIndex);
- SReadHandle* pHandle = &pInfo->readHandle;
+ void* p = tableListGetInfo(pTaskInfo->pTableInfoList, readIdx + pInfo->tableStartIndex);
+ SReadHandle* pHandle = &pInfo->base.readHandle;
- int32_t code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, &pInfo->pReader, GET_TASKID(pTaskInfo));
+ int32_t code = tsdbReaderOpen(pHandle->vnode, pQueryCond, p, 1, &pInfo->base.dataReader, GET_TASKID(pTaskInfo));
if (code != 0) {
T_LONG_JMP(pTaskInfo->env, code);
}
- STsdbReader* reader = pInfo->pReader;
+ STsdbReader* reader = pInfo->base.dataReader;
while (tsdbNextDataBlock(reader)) {
if (isTaskKilled(pTaskInfo)) {
T_LONG_JMP(pTaskInfo->env, TSDB_CODE_TSC_QUERY_CANCELLED);
@@ -4434,7 +4427,8 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
}
uint32_t status = 0;
- code = loadDataBlockFromOneTable(pOperator, pTableScanInfo, pBlock, &status);
+ loadDataBlock(pOperator, &pTableScanInfo->base, pBlock, &status);
+// code = loadDataBlockFromOneTable(pOperator, pTableScanInfo, pBlock, &status);
if (code != TSDB_CODE_SUCCESS) {
T_LONG_JMP(pTaskInfo->env, code);
}
@@ -4447,15 +4441,15 @@ static SSDataBlock* getTableDataBlockImpl(void* param) {
pBlock->info.groupId = getTableGroupId(pTaskInfo->pTableInfoList, pBlock->info.uid);
pOperator->resultInfo.totalRows += pBlock->info.rows;
- pTableScanInfo->readRecorder.elapsedTime += (taosGetTimestampUs() - st) / 1000.0;
+ pTableScanInfo->base.readRecorder.elapsedTime += (taosGetTimestampUs() - st) / 1000.0;
- tsdbReaderClose(pInfo->pReader);
- pInfo->pReader = NULL;
+ tsdbReaderClose(pInfo->base.dataReader);
+ pInfo->base.dataReader = NULL;
return pBlock;
}
- tsdbReaderClose(pInfo->pReader);
- pInfo->pReader = NULL;
+ tsdbReaderClose(pInfo->base.dataReader);
+ pInfo->base.dataReader = NULL;
return NULL;
}
@@ -4493,10 +4487,10 @@ int32_t startGroupTableMergeScan(SOperatorInfo* pOperator) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
{
- size_t numOfTables = tableListGetSize(pInfo->tableListInfo);
+ size_t numOfTables = tableListGetSize(pTaskInfo->pTableInfoList);
int32_t i = pInfo->tableStartIndex + 1;
for (; i < numOfTables; ++i) {
- STableKeyInfo* tableKeyInfo = tableListGetInfo(pInfo->tableListInfo, i);
+ STableKeyInfo* tableKeyInfo = tableListGetInfo(pTaskInfo->pTableInfoList, i);
if (tableKeyInfo->groupId != pInfo->groupId) {
break;
}
@@ -4507,7 +4501,7 @@ int32_t startGroupTableMergeScan(SOperatorInfo* pOperator) {
int32_t tableStartIdx = pInfo->tableStartIndex;
int32_t tableEndIdx = pInfo->tableEndIndex;
- pInfo->pReader = NULL;
+ pInfo->base.dataReader = NULL;
// todo the total available buffer should be determined by total capacity of buffer of this task.
// the additional one is reserved for merge result
@@ -4530,7 +4524,7 @@ int32_t startGroupTableMergeScan(SOperatorInfo* pOperator) {
taosArrayPush(pInfo->sortSourceParams, ¶m);
SQueryTableDataCond cond;
- dumpSQueryTableCond(&pInfo->cond, &cond);
+ dumpSQueryTableCond(&pInfo->base.cond, &cond);
taosArrayPush(pInfo->queryConds, &cond);
}
@@ -4570,6 +4564,7 @@ int32_t stopGroupTableMergeScan(SOperatorInfo* pOperator) {
taosArrayClear(pInfo->sortSourceParams);
tsortDestroySortHandle(pInfo->pSortHandle);
+ pInfo->pSortHandle = NULL;
for (int32_t i = 0; i < taosArrayGetSize(pInfo->queryConds); i++) {
SQueryTableDataCond* cond = taosArrayGet(pInfo->queryConds, i);
@@ -4620,16 +4615,16 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
T_LONG_JMP(pTaskInfo->env, code);
}
- size_t tableListSize = tableListGetSize(pInfo->tableListInfo);
+ size_t tableListSize = tableListGetSize(pTaskInfo->pTableInfoList);
if (!pInfo->hasGroupId) {
pInfo->hasGroupId = true;
if (tableListSize == 0) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
pInfo->tableStartIndex = 0;
- pInfo->groupId = ((STableKeyInfo*)tableListGetInfo(pInfo->tableListInfo, pInfo->tableStartIndex))->groupId;
+ pInfo->groupId = ((STableKeyInfo*)tableListGetInfo(pTaskInfo->pTableInfoList, pInfo->tableStartIndex))->groupId;
startGroupTableMergeScan(pOperator);
}
@@ -4644,11 +4639,11 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
} else {
stopGroupTableMergeScan(pOperator);
if (pInfo->tableEndIndex >= tableListSize - 1) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
pInfo->tableStartIndex = pInfo->tableEndIndex + 1;
- pInfo->groupId = tableListGetInfo(pInfo->tableListInfo, pInfo->tableStartIndex)->groupId;
+ pInfo->groupId = tableListGetInfo(pTaskInfo->pTableInfoList, pInfo->tableStartIndex)->groupId;
startGroupTableMergeScan(pOperator);
}
}
@@ -4658,7 +4653,7 @@ SSDataBlock* doTableMergeScan(SOperatorInfo* pOperator) {
void destroyTableMergeScanOperatorInfo(void* param) {
STableMergeScanInfo* pTableScanInfo = (STableMergeScanInfo*)param;
- cleanupQueryTableDataCond(&pTableScanInfo->cond);
+ cleanupQueryTableDataCond(&pTableScanInfo->base.cond);
int32_t numOfTable = taosArrayGetSize(pTableScanInfo->queryConds);
@@ -4668,9 +4663,11 @@ void destroyTableMergeScanOperatorInfo(void* param) {
}
taosArrayDestroy(pTableScanInfo->sortSourceParams);
+ tsortDestroySortHandle(pTableScanInfo->pSortHandle);
+ pTableScanInfo->pSortHandle = NULL;
- tsdbReaderClose(pTableScanInfo->pReader);
- pTableScanInfo->pReader = NULL;
+ tsdbReaderClose(pTableScanInfo->base.dataReader);
+ pTableScanInfo->base.dataReader = NULL;
for (int i = 0; i < taosArrayGetSize(pTableScanInfo->queryConds); i++) {
SQueryTableDataCond* pCond = taosArrayGet(pTableScanInfo->queryConds, i);
@@ -4678,17 +4675,20 @@ void destroyTableMergeScanOperatorInfo(void* param) {
}
taosArrayDestroy(pTableScanInfo->queryConds);
- if (pTableScanInfo->matchInfo.pList != NULL) {
- taosArrayDestroy(pTableScanInfo->matchInfo.pList);
+ if (pTableScanInfo->base.matchInfo.pList != NULL) {
+ taosArrayDestroy(pTableScanInfo->base.matchInfo.pList);
}
pTableScanInfo->pResBlock = blockDataDestroy(pTableScanInfo->pResBlock);
pTableScanInfo->pSortInputBlock = blockDataDestroy(pTableScanInfo->pSortInputBlock);
taosArrayDestroy(pTableScanInfo->pSortInfo);
- cleanupExprSupp(&pTableScanInfo->pseudoSup);
+ cleanupExprSupp(&pTableScanInfo->base.pseudoSup);
+
+ tsdbReaderClose(pTableScanInfo->base.dataReader);
+ pTableScanInfo->base.dataReader = NULL;
+ taosLRUCacheCleanup(pTableScanInfo->base.metaCache.pTableMetaEntryCache);
- taosMemoryFreeClear(pTableScanInfo->rowEntryInfoOffset);
taosMemoryFreeClear(param);
}
@@ -4697,7 +4697,7 @@ int32_t getTableMergeScanExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExpla
// TODO: merge these two info into one struct
STableMergeScanExecInfo* execInfo = taosMemoryCalloc(1, sizeof(STableMergeScanExecInfo));
STableMergeScanInfo* pInfo = pOptr->info;
- execInfo->blockRecorder = pInfo->readRecorder;
+ execInfo->blockRecorder = pInfo->base.readRecorder;
execInfo->sortExecInfo = pInfo->sortExecInfo;
*pOptrExplain = execInfo;
@@ -4706,8 +4706,8 @@ int32_t getTableMergeScanExplainExecInfo(SOperatorInfo* pOptr, void** pOptrExpla
return TSDB_CODE_SUCCESS;
}
-SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, STableListInfo* pTableListInfo,
- SReadHandle* readHandle, SExecTaskInfo* pTaskInfo) {
+SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanNode, SReadHandle* readHandle,
+ SExecTaskInfo* pTaskInfo) {
STableMergeScanInfo* pInfo = taosMemoryCalloc(1, sizeof(STableMergeScanInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pInfo == NULL || pOperator == NULL) {
@@ -4718,39 +4718,46 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
int32_t numOfCols = 0;
int32_t code = extractColMatchInfo(pTableScanNode->scan.pScanCols, pDescNode, &numOfCols, COL_MATCH_FROM_COL_ID,
- &pInfo->matchInfo);
+ &pInfo->base.matchInfo);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- code = initQueryTableDataCond(&pInfo->cond, pTableScanNode);
+ code = initQueryTableDataCond(&pInfo->base.cond, pTableScanNode);
if (code != TSDB_CODE_SUCCESS) {
- taosArrayDestroy(pInfo->matchInfo.pList);
+ taosArrayDestroy(pInfo->base.matchInfo.pList);
goto _error;
}
if (pTableScanNode->scan.pScanPseudoCols != NULL) {
- SExprSupp* pSup = &pInfo->pseudoSup;
+ SExprSupp* pSup = &pInfo->base.pseudoSup;
pSup->pExprInfo = createExprInfo(pTableScanNode->scan.pScanPseudoCols, NULL, &pSup->numOfExprs);
pSup->pCtx = createSqlFunctionCtx(pSup->pExprInfo, pSup->numOfExprs, &pSup->rowEntryInfoOffset);
}
pInfo->scanInfo = (SScanInfo){.numOfAsc = pTableScanNode->scanSeq[0], .numOfDesc = pTableScanNode->scanSeq[1]};
- pInfo->readHandle = *readHandle;
- pInfo->interval = extractIntervalInfo(pTableScanNode);
+ pInfo->base.metaCache.pTableMetaEntryCache = taosLRUCacheInit(1024 * 128, -1, .5);
+ if (pInfo->base.metaCache.pTableMetaEntryCache == NULL) {
+ code = terrno;
+ goto _error;
+ }
+
+ pInfo->base.dataBlockLoadFlag = FUNC_DATA_REQUIRED_DATA_LOAD;
+ pInfo->base.scanFlag = MAIN_SCAN;
+ pInfo->base.readHandle = *readHandle;
+
+ pInfo->base.limitInfo.limit.limit = -1;
+ pInfo->base.limitInfo.slimit.limit = -1;
+
pInfo->sample.sampleRatio = pTableScanNode->ratio;
pInfo->sample.seed = taosGetTimestampSec();
- pInfo->dataBlockLoadFlag = pTableScanNode->dataRequired;
-
code = filterInitFromNode((SNode*)pTableScanNode->scan.node.pConditions, &pOperator->exprSupp.pFilterInfo, 0);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
- pInfo->tableListInfo = pTableListInfo;
- pInfo->scanFlag = MAIN_SCAN;
initResultSizeInfo(&pOperator->resultInfo, 1024);
pInfo->pResBlock = createResDataBlock(pDescNode);
@@ -4758,23 +4765,20 @@ SOperatorInfo* createTableMergeScanOperatorInfo(STableScanPhysiNode* pTableScanN
pInfo->sortSourceParams = taosArrayInit(64, sizeof(STableMergeScanSortSourceParam));
- pInfo->pSortInfo = generateSortByTsInfo(pInfo->matchInfo.pList, pInfo->cond.order);
+ pInfo->pSortInfo = generateSortByTsInfo(pInfo->base.matchInfo.pList, pInfo->base.cond.order);
pInfo->pSortInputBlock = createOneDataBlock(pInfo->pResBlock, false);
initLimitInfo(pTableScanNode->scan.node.pLimit, pTableScanNode->scan.node.pSlimit, &pInfo->limitInfo);
- int32_t rowSize = pInfo->pResBlock->info.rowSize;
- pInfo->bufPageSize = getProperSortPageSize(rowSize);
+ int32_t rowSize = pInfo->pResBlock->info.rowSize;
+ uint32_t nCols = taosArrayGetSize(pInfo->pResBlock->pDataBlock);
+ pInfo->bufPageSize = getProperSortPageSize(rowSize, nCols);
- pOperator->name = "TableMergeScanOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "TableMergeScanOperator", QUERY_NODE_PHYSICAL_PLAN_TABLE_MERGE_SCAN, false, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
pOperator->exprSupp.numOfExprs = numOfCols;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableMergeScan, NULL, NULL,
- destroyTableMergeScanOperatorInfo, getTableMergeScanExplainExecInfo);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTableMergeScan, NULL, destroyTableMergeScanOperatorInfo,
+ getTableMergeScanExplainExecInfo);
pOperator->cost.openCost = 0;
return pOperator;
diff --git a/source/libs/executor/src/sortoperator.c b/source/libs/executor/src/sortoperator.c
index 2f41ee1495ca13ff6a895cebb982f1eb46cd0ba0..14e316345576b665c015288797d886d30cd44136 100644
--- a/source/libs/executor/src/sortoperator.c
+++ b/source/libs/executor/src/sortoperator.c
@@ -53,11 +53,7 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
pInfo->pSortInfo = createSortInfo(pSortNode->pSortKeys);
initLimitInfo(pSortNode->node.pLimit, pSortNode->node.pSlimit, &pInfo->limitInfo);
- pOperator->name = "SortOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_SORT;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "SortOperator", QUERY_NODE_PHYSICAL_PLAN_SORT, true, OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->exprSupp.pExprInfo = pExprInfo;
pOperator->exprSupp.numOfExprs = numOfCols;
@@ -67,7 +63,7 @@ SOperatorInfo* createSortOperatorInfo(SOperatorInfo* downstream, SSortPhysiNode*
// TODO dynamic set the available sort buffer
pOperator->fpSet =
- createOperatorFpSet(doOpenSortOperator, doSort, NULL, NULL, destroySortOperatorInfo, getExplainExecInfo);
+ createOperatorFpSet(doOpenSortOperator, doSort, NULL, destroySortOperatorInfo, getExplainExecInfo);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -214,7 +210,7 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) {
pBlock = getSortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pOperator->resultInfo.capacity,
pInfo->matchInfo.pList, pInfo);
if (pBlock == NULL) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -428,7 +424,7 @@ SSDataBlock* doGroupSort(SOperatorInfo* pOperator) {
pInfo->prefetchedSortInput = pOperator->pDownstream[0]->fpSet.getNextFn(pOperator->pDownstream[0]);
if (pInfo->prefetchedSortInput == NULL) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
pInfo->currGroupId = pInfo->prefetchedSortInput->info.groupId;
@@ -453,7 +449,7 @@ SSDataBlock* doGroupSort(SOperatorInfo* pOperator) {
beginSortGroup(pOperator);
} else if (pInfo->childOpStatus == CHILD_OP_FINISHED) {
finishSortGroup(pOperator);
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
}
@@ -482,37 +478,35 @@ SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSort
SExecTaskInfo* pTaskInfo) {
SGroupSortOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SGroupSortOperatorInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
- if (pInfo == NULL || pOperator == NULL /* || rowSize > 100 * 1024 * 1024*/) {
+ if (pInfo == NULL || pOperator == NULL) {
goto _error;
}
+ SExprSupp* pSup = &pOperator->exprSupp;
SDataBlockDescNode* pDescNode = pSortPhyNode->node.pOutputDataBlockDesc;
int32_t numOfCols = 0;
- SSDataBlock* pResBlock = createResDataBlock(pDescNode);
SExprInfo* pExprInfo = createExprInfo(pSortPhyNode->pExprs, NULL, &numOfCols);
- int32_t numOfOutputCols = 0;
- int32_t code = extractColMatchInfo(pSortPhyNode->pTargets, pDescNode, &numOfOutputCols, COL_MATCH_FROM_SLOT_ID,
- &pInfo->matchInfo);
-
- pOperator->exprSupp.pCtx = createSqlFunctionCtx(pExprInfo, numOfCols, &pOperator->exprSupp.rowEntryInfoOffset);
- pInfo->binfo.pRes = pResBlock;
+ pSup->pExprInfo = pExprInfo;
+ pSup->numOfExprs = numOfCols;
initResultSizeInfo(&pOperator->resultInfo, 1024);
+ pOperator->exprSupp.pCtx = createSqlFunctionCtx(pExprInfo, numOfCols, &pOperator->exprSupp.rowEntryInfoOffset);
- pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
+ pInfo->binfo.pRes = createResDataBlock(pDescNode);
+ blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
- pOperator->name = "GroupSortOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->exprSupp.pExprInfo = pExprInfo;
- pOperator->exprSupp.numOfExprs = numOfCols;
- pOperator->pTaskInfo = pTaskInfo;
+ int32_t numOfOutputCols = 0;
+ int32_t code = extractColMatchInfo(pSortPhyNode->pTargets, pDescNode, &numOfOutputCols, COL_MATCH_FROM_SLOT_ID,
+ &pInfo->matchInfo);
+ if (code != TSDB_CODE_SUCCESS) {
+ goto _error;
+ }
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doGroupSort, NULL, NULL, destroyGroupSortOperatorInfo,
+ pInfo->pSortInfo = createSortInfo(pSortPhyNode->pSortKeys);
+ setOperatorInfo(pOperator, "GroupSortOperator", QUERY_NODE_PHYSICAL_PLAN_GROUP_SORT, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doGroupSort, NULL, destroyGroupSortOperatorInfo,
getGroupSortExplainExecInfo);
code = appendDownstream(pOperator, &downstream, 1);
@@ -523,8 +517,10 @@ SOperatorInfo* createGroupSortOperatorInfo(SOperatorInfo* downstream, SGroupSort
return pOperator;
_error:
- pTaskInfo->code = TSDB_CODE_OUT_OF_MEMORY;
- taosMemoryFree(pInfo);
+ pTaskInfo->code = code;
+ if (pInfo != NULL) {
+ destroyGroupSortOperatorInfo(pInfo);
+ }
taosMemoryFree(pOperator);
return NULL;
}
@@ -694,11 +690,13 @@ SSDataBlock* doMultiwayMerge(SOperatorInfo* pOperator) {
T_LONG_JMP(pTaskInfo->env, code);
}
+ qDebug("start to merge final sorted rows, %s", GET_TASKID(pTaskInfo));
+
SSDataBlock* pBlock = getMultiwaySortedBlockData(pInfo->pSortHandle, pInfo->binfo.pRes, pInfo->matchInfo.pList, pOperator);
if (pBlock != NULL) {
pOperator->resultInfo.totalRows += pBlock->info.rows;
} else {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
}
return pBlock;
@@ -758,23 +756,18 @@ SOperatorInfo* createMultiwayMergeOperatorInfo(SOperatorInfo** downStreams, size
SPhysiNode* pChildNode = (SPhysiNode*)nodesListGetNode(pPhyNode->pChildren, 0);
SSDataBlock* pInputBlock = createResDataBlock(pChildNode->pOutputDataBlockDesc);
- initResultSizeInfo(&pOperator->resultInfo, 1024);
+ initResultSizeInfo(&pOperator->resultInfo, 4096);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
pInfo->groupSort = pMergePhyNode->groupSort;
pInfo->pSortInfo = createSortInfo(pMergePhyNode->pMergeKeys);
pInfo->pInputBlock = pInputBlock;
- pInfo->bufPageSize = getProperSortPageSize(rowSize);
+ size_t numOfCols = taosArrayGetSize(pInfo->binfo.pRes->pDataBlock);
+ pInfo->bufPageSize = getProperSortPageSize(rowSize, numOfCols);
pInfo->sortBufSize = pInfo->bufPageSize * (numStreams + 1); // one additional is reserved for merged result.
- pOperator->name = "MultiwayMerge";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
-
- pOperator->fpSet = createOperatorFpSet(doOpenMultiwayMergeOperator, doMultiwayMerge, NULL, NULL,
+ setOperatorInfo(pOperator, "MultiwayMergeOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(doOpenMultiwayMergeOperator, doMultiwayMerge, NULL,
destroyMultiwayMergeOperatorInfo, getMultiwayMergeExplainExecInfo);
code = appendDownstream(pOperator, downStreams, numStreams);
diff --git a/source/libs/executor/src/tfill.c b/source/libs/executor/src/tfill.c
index ebc3a962d3064e5735f2a193caba80dac00b6952..c41376b2dcaf74f2eea572590d6ee41820122483 100644
--- a/source/libs/executor/src/tfill.c
+++ b/source/libs/executor/src/tfill.c
@@ -513,6 +513,22 @@ void* taosDestroyFillInfo(SFillInfo* pFillInfo) {
// taosMemoryFreeClear(pFillInfo->pTags[i].tagVal);
// }
+ // free pFillCol
+ if (pFillInfo->pFillCol) {
+ for (int32_t i = 0; i < pFillInfo->numOfCols; i++) {
+ SFillColInfo* pCol = &pFillInfo->pFillCol[i];
+ if (!pCol->notFillCol) {
+ if (pCol->fillVal.nType == TSDB_DATA_TYPE_VARBINARY || pCol->fillVal.nType == TSDB_DATA_TYPE_VARCHAR ||
+ pCol->fillVal.nType == TSDB_DATA_TYPE_NCHAR || pCol->fillVal.nType == TSDB_DATA_TYPE_JSON) {
+ if (pCol->fillVal.pz) {
+ taosMemoryFree(pCol->fillVal.pz);
+ pCol->fillVal.pz = NULL;
+ }
+ }
+ }
+ }
+ }
+
taosMemoryFreeClear(pFillInfo->pTags);
taosMemoryFreeClear(pFillInfo->pFillCol);
taosMemoryFreeClear(pFillInfo);
@@ -680,9 +696,9 @@ SResultCellData* getResultCell(SResultRowData* pRaw, int32_t index) {
void* destroyFillColumnInfo(SFillColInfo* pFillCol, int32_t start, int32_t end) {
for (int32_t i = start; i < end; i++) {
destroyExprInfo(pFillCol[i].pExpr, 1);
- taosMemoryFreeClear(pFillCol[i].pExpr);
taosVariantDestroy(&pFillCol[i].fillVal);
}
+ taosMemoryFreeClear(pFillCol[start].pExpr);
taosMemoryFree(pFillCol);
return NULL;
}
@@ -1443,7 +1459,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
printDataBlock(pInfo->pRes, "stream fill");
return pInfo->pRes;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
resetStreamFillInfo(pInfo);
return NULL;
}
@@ -1512,7 +1528,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
}
if (pInfo->pRes->info.rows == 0) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
resetStreamFillInfo(pInfo);
return NULL;
}
@@ -1690,15 +1706,9 @@ SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFi
}
pInfo->srcRowIndex = 0;
-
- pOperator->name = "FillOperator";
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, NULL, destroyStreamFillOperatorInfo,
- NULL);
+ setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet =
+ createOperatorFpSet(operatorDummyOpenFn, doStreamFill, NULL, destroyStreamFillOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
diff --git a/source/libs/executor/src/timewindowoperator.c b/source/libs/executor/src/timewindowoperator.c
index 88f3e4cff99457265ca2913b6e79ab2d5a658901..1ec7d6d26bd9409675b3579f0c210cc11e9c598a 100644
--- a/source/libs/executor/src/timewindowoperator.c
+++ b/source/libs/executor/src/timewindowoperator.c
@@ -12,8 +12,8 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see .
*/
-#include "filter.h"
#include "executorimpl.h"
+#include "filter.h"
#include "function.h"
#include "functionMgt.h"
#include "tcommon.h"
@@ -986,7 +986,7 @@ void doCloseWindow(SResultRowInfo* pResultRowInfo, const SIntervalAggOperatorInf
// current result is done in computing final results.
if (pInfo->timeWindowInterpo && isResultRowInterpolated(pResult, RESULT_ROW_END_INTERP)) {
closeResultRow(pResult);
- SListNode *pNode = tdListPopHead(pResultRowInfo->openWindow);
+ SListNode* pNode = tdListPopHead(pResultRowInfo->openWindow);
taosMemoryFree(pNode);
}
}
@@ -1221,7 +1221,7 @@ static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) {
pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -1232,7 +1232,7 @@ static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) {
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
if (!hasRemain) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
@@ -1255,35 +1255,33 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) {
SSDataBlock* pBlock = pInfo->binfo.pRes;
- if (pInfo->execModel == OPTR_EXEC_MODEL_STREAM) {
- return pOperator->fpSet.getStreamResFn(pOperator);
- } else {
- pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
- if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
- return NULL;
- }
+ ASSERT(pInfo->execModel == OPTR_EXEC_MODEL_BATCH);
- blockDataEnsureCapacity(pBlock, pOperator->resultInfo.capacity);
- while (1) {
- doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
- doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
+ pTaskInfo->code = pOperator->fpSet._openFn(pOperator);
+ if (pTaskInfo->code != TSDB_CODE_SUCCESS) {
+ return NULL;
+ }
- bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
- if (!hasRemain) {
- doSetOperatorCompleted(pOperator);
- break;
- }
+ blockDataEnsureCapacity(pBlock, pOperator->resultInfo.capacity);
+ while (1) {
+ doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
+ doFilter(pBlock, pOperator->exprSupp.pFilterInfo, NULL);
- if (pBlock->info.rows > 0) {
- break;
- }
+ bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
+ if (!hasRemain) {
+ setOperatorCompleted(pOperator);
+ break;
}
- size_t rows = pBlock->info.rows;
- pOperator->resultInfo.totalRows += rows;
-
- return (rows == 0) ? NULL : pBlock;
+ if (pBlock->info.rows > 0) {
+ break;
+ }
}
+
+ size_t rows = pBlock->info.rows;
+ pOperator->resultInfo.totalRows += rows;
+
+ return (rows == 0) ? NULL : pBlock;
}
static void setInverFunction(SqlFunctionCtx* pCtx, int32_t num, EStreamType type) {
@@ -1452,7 +1450,6 @@ static int32_t closeStreamIntervalWindow(SSHashObj* pHashMap, STimeWindowAggSupp
}
}
tSimpleHashIterateRemove(pHashMap, pWinKey, sizeof(SWinKey), &pIte, &iter);
- /*taosHashRemove(pInfo->pGroupIdTbNameMap, &pWinKey->groupId, sizeof(int64_t));*/
}
}
return TSDB_CODE_SUCCESS;
@@ -1549,7 +1546,8 @@ static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWin
uint64_t uid = 0;
for (int32_t i = *index; i < size; i++) {
SWinKey* pWin = taosArrayGet(pWins, i);
- char* tbname = taosHashGet(pInfo->pGroupIdTbNameMap, &pWin->groupId, sizeof(int64_t));
+ void* tbname = NULL;
+ streamStateGetParName(pInfo->pState, pWin->groupId, &tbname);
if (tbname == NULL) {
appendOneRowToStreamSpecialBlock(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId, NULL);
} else {
@@ -1557,6 +1555,7 @@ static void doBuildDeleteResult(SStreamIntervalOperatorInfo* pInfo, SArray* pWin
STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName));
appendOneRowToStreamSpecialBlock(pBlock, &pWin->ts, &pWin->ts, &uid, &pWin->groupId, parTbName);
}
+ tdbFree(tbname);
(*index)++;
}
}
@@ -1612,17 +1611,13 @@ void destroyStreamFinalIntervalOperatorInfo(void* param) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
SOperatorInfo* pChildOp = taosArrayGetP(pInfo->pChildren, i);
- destroyStreamFinalIntervalOperatorInfo(pChildOp->info);
- taosMemoryFree(pChildOp->pDownstream);
- cleanupExprSupp(&pChildOp->exprSupp);
- taosMemoryFreeClear(pChildOp);
+ destroyOperatorInfo(pChildOp);
}
taosArrayDestroy(pInfo->pChildren);
}
nodesDestroyNode((SNode*)pInfo->pPhyNode);
colDataDestroy(&pInfo->twAggSup.timeWindowData);
cleanupGroupResInfo(&pInfo->groupResInfo);
- taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
}
@@ -1741,7 +1736,6 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPh
ASSERT(as.calTrigger != STREAM_TRIGGER_MAX_DELAY);
- pOperator->pTaskInfo = pTaskInfo;
pInfo->win = pTaskInfo->window;
pInfo->inputOrder = (pPhyNode->window.inputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
pInfo->resultTsOrder = (pPhyNode->window.outputTsOrder == ORDER_ASC) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
@@ -1779,15 +1773,11 @@ SOperatorInfo* createIntervalOperatorInfo(SOperatorInfo* downstream, SIntervalPh
}
initResultRowInfo(&pInfo->binfo.resultRowInfo);
-
- pOperator->name = "TimeIntervalAggOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "TimeIntervalAggOperator", QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL, true, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(doOpenIntervalAgg, doBuildIntervalResult, NULL, NULL, destroyIntervalOperatorInfo, NULL);
+ createOperatorFpSet(doOpenIntervalAgg, doBuildIntervalResult, NULL, destroyIntervalOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -1892,7 +1882,7 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
if (!hasRemain) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
@@ -1935,7 +1925,7 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
if (!hasRemain) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
@@ -1952,10 +1942,8 @@ static void doKeepPrevRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock
for (int32_t i = 0; i < numOfCols; ++i) {
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- // null data should not be kept since it can not be used to perform interpolation
- if (!colDataIsNull_s(pColInfoData, i)) {
- SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, i);
-
+ SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, i);
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
pkey->isNull = false;
char* val = colDataGetData(pColInfoData, rowIndex);
if (!IS_VAR_DATA_TYPE(pkey->type)) {
@@ -1963,6 +1951,8 @@ static void doKeepPrevRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock
} else {
memcpy(pkey->pData, val, varDataLen(val));
}
+ } else {
+ pkey->isNull = true;
}
}
@@ -1974,10 +1964,8 @@ static void doKeepNextRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock
for (int32_t i = 0; i < numOfCols; ++i) {
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
- // null data should not be kept since it can not be used to perform interpolation
- if (!colDataIsNull_s(pColInfoData, i)) {
- SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, i);
-
+ SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, i);
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
pkey->isNull = false;
char* val = colDataGetData(pColInfoData, rowIndex);
if (!IS_VAR_DATA_TYPE(pkey->type)) {
@@ -1985,50 +1973,51 @@ static void doKeepNextRows(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock
} else {
memcpy(pkey->pData, val, varDataLen(val));
}
+ } else {
+ pkey->isNull = true;
}
}
pSliceInfo->isNextRowSet = true;
}
-static void doKeepLinearInfo(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex,
- bool isLastRow) {
+static void doKeepLinearInfo(STimeSliceOperatorInfo* pSliceInfo, const SSDataBlock* pBlock, int32_t rowIndex) {
int32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
- bool fillLastPoint = pSliceInfo->fillLastPoint;
for (int32_t i = 0; i < numOfCols; ++i) {
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, i);
SColumnInfoData* pTsCol = taosArrayGet(pBlock->pDataBlock, pSliceInfo->tsCol.slotId);
SFillLinearInfo* pLinearInfo = taosArrayGet(pSliceInfo->pLinearInfo, i);
- // null data should not be kept since it can not be used to perform interpolation
- if (!colDataIsNull_s(pColInfoData, i)) {
- if (isLastRow) {
+ // null value is represented by using key = INT64_MIN for now.
+ // TODO: optimize to ignore null values for linear interpolation.
+ if (!pLinearInfo->isStartSet) {
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
pLinearInfo->start.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
memcpy(pLinearInfo->start.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
- } else if (fillLastPoint) {
+ }
+ pLinearInfo->isStartSet = true;
+ } else if (!pLinearInfo->isEndSet) {
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
memcpy(pLinearInfo->end.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
- } else {
- pLinearInfo->start.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
- pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex + 1);
-
- char* val;
- val = colDataGetData(pColInfoData, rowIndex);
- memcpy(pLinearInfo->start.val, val, pLinearInfo->bytes);
- val = colDataGetData(pColInfoData, rowIndex + 1);
- memcpy(pLinearInfo->end.val, val, pLinearInfo->bytes);
}
-
- pLinearInfo->hasNull = false;
+ pLinearInfo->isEndSet = true;
} else {
- pLinearInfo->hasNull = true;
+ pLinearInfo->start.key = pLinearInfo->end.key;
+ memcpy(pLinearInfo->start.val, pLinearInfo->end.val, pLinearInfo->bytes);
+
+ if (!colDataIsNull_s(pColInfoData, rowIndex)) {
+ pLinearInfo->end.key = *(int64_t*)colDataGetData(pTsCol, rowIndex);
+ memcpy(pLinearInfo->end.val, colDataGetData(pColInfoData, rowIndex), pLinearInfo->bytes);
+ } else {
+ pLinearInfo->end.key = INT64_MIN;
+ }
}
}
- pSliceInfo->fillLastPoint = isLastRow;
}
-static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock) {
+static bool genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock, bool beforeTs) {
int32_t rows = pResBlock->info.rows;
blockDataEnsureCapacity(pResBlock, rows + 1);
// todo set the correct primary timestamp column
@@ -2047,7 +2036,6 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
}
int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
- // SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, srcSlot);
switch (pSliceInfo->fillType) {
case TSDB_FILL_NULL: {
colDataAppendNULL(pDst, rows);
@@ -2079,21 +2067,26 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
SPoint start = pLinearInfo->start;
SPoint end = pLinearInfo->end;
SPoint current = {.key = pSliceInfo->current};
- current.val = taosMemoryCalloc(pLinearInfo->bytes, 1);
- // before interp range, do not fill
- if (start.key == INT64_MIN || end.key == INT64_MAX) {
+ // do not interpolate before ts range, only increate pSliceInfo->current
+ if (beforeTs && !pLinearInfo->isEndSet) {
+ return true;
+ }
+
+ if (!pLinearInfo->isStartSet || !pLinearInfo->isEndSet) {
hasInterp = false;
break;
}
- if (pLinearInfo->hasNull) {
+ if (start.key == INT64_MIN || end.key == INT64_MIN) {
colDataAppendNULL(pDst, rows);
- } else {
- taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type);
- colDataAppend(pDst, rows, (char*)current.val, false);
+ break;
}
+ current.val = taosMemoryCalloc(pLinearInfo->bytes, 1);
+ taosGetLinearInterpolationVal(¤t, pLinearInfo->type, &start, &end, pLinearInfo->type);
+ colDataAppend(pDst, rows, (char*)current.val, false);
+
taosMemoryFree(current.val);
break;
}
@@ -2104,7 +2097,11 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
}
SGroupKeys* pkey = taosArrayGet(pSliceInfo->pPrevRow, srcSlot);
- colDataAppend(pDst, rows, pkey->pData, false);
+ if (pkey->isNull == false) {
+ colDataAppend(pDst, rows, pkey->pData, false);
+ } else {
+ colDataAppendNULL(pDst, rows);
+ }
break;
}
@@ -2115,7 +2112,11 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
}
SGroupKeys* pkey = taosArrayGet(pSliceInfo->pNextRow, srcSlot);
- colDataAppend(pDst, rows, pkey->pData, false);
+ if (pkey->isNull == false) {
+ colDataAppend(pDst, rows, pkey->pData, false);
+ } else {
+ colDataAppendNULL(pDst, rows);
+ }
break;
}
@@ -2128,8 +2129,40 @@ static void genInterpolationResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp
if (hasInterp) {
pResBlock->info.rows += 1;
}
+
+ return hasInterp;
+}
+
+static void addCurrentRowToResult(STimeSliceOperatorInfo* pSliceInfo, SExprSupp* pExprSup, SSDataBlock* pResBlock,
+ SSDataBlock* pSrcBlock, int32_t index) {
+ blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
+ for (int32_t j = 0; j < pExprSup->numOfExprs; ++j) {
+ SExprInfo* pExprInfo = &pExprSup->pExprInfo[j];
+
+ int32_t dstSlot = pExprInfo->base.resSchema.slotId;
+ SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
+
+ if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
+ colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false);
+ } else {
+ int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
+ SColumnInfoData* pSrc = taosArrayGet(pSrcBlock->pDataBlock, srcSlot);
+
+ if (colDataIsNull_s(pSrc, index)) {
+ colDataAppendNULL(pDst, pResBlock->info.rows);
+ continue;
+ }
+
+ char* v = colDataGetData(pSrc, index);
+ colDataAppend(pDst, pResBlock->info.rows, v, false);
+ }
+ }
+
+ pResBlock->info.rows += 1;
+ return;
}
+
static int32_t initPrevRowsKeeper(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
if (pInfo->pPrevRow != NULL) {
return TSDB_CODE_SUCCESS;
@@ -2200,24 +2233,19 @@ static int32_t initFillLinearInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pB
SFillLinearInfo linearInfo = {0};
linearInfo.start.key = INT64_MIN;
- linearInfo.end.key = INT64_MAX;
+ linearInfo.end.key = INT64_MIN;
linearInfo.start.val = taosMemoryCalloc(1, pColInfo->info.bytes);
linearInfo.end.val = taosMemoryCalloc(1, pColInfo->info.bytes);
- linearInfo.hasNull = false;
+ linearInfo.isStartSet = false;
+ linearInfo.isEndSet = false;
linearInfo.type = pColInfo->info.type;
linearInfo.bytes = pColInfo->info.bytes;
taosArrayPush(pInfo->pLinearInfo, &linearInfo);
}
- pInfo->fillLastPoint = false;
-
return TSDB_CODE_SUCCESS;
}
-static bool needToFillLastPoint(STimeSliceOperatorInfo* pSliceInfo) {
- return (pSliceInfo->fillLastPoint == true && pSliceInfo->fillType == TSDB_FILL_LINEAR);
-}
-
static int32_t initKeeperInfo(STimeSliceOperatorInfo* pInfo, SSDataBlock* pBlock) {
int32_t code;
code = initPrevRowsKeeper(pInfo, pBlock);
@@ -2273,199 +2301,77 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
for (int32_t i = 0; i < pBlock->info.rows; ++i) {
int64_t ts = *(int64_t*)colDataGetData(pTsCol, i);
- if (i == 0 && needToFillLastPoint(pSliceInfo)) { // first row in current block
- doKeepLinearInfo(pSliceInfo, pBlock, i, false);
- while (pSliceInfo->current < ts && pSliceInfo->current <= pSliceInfo->win.ekey) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- }
- }
-
if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
if (ts == pSliceInfo->current) {
- blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
- for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
- SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
-
- int32_t dstSlot = pExprInfo->base.resSchema.slotId;
- SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
-
- if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
- colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false);
- } else {
- int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
- SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, srcSlot);
-
- if (colDataIsNull_s(pSrc, i)) {
- colDataAppendNULL(pDst, pResBlock->info.rows);
- continue;
- }
-
- char* v = colDataGetData(pSrc, i);
- colDataAppend(pDst, pResBlock->info.rows, v, false);
- }
- }
+ addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i);
- pResBlock->info.rows += 1;
doKeepPrevRows(pSliceInfo, pBlock, i);
+ doKeepLinearInfo(pSliceInfo, pBlock, i);
- // for linear interpolation, always fill value between this and next points;
- // if its the first point in data block, also fill values between previous(if there's any) and this point;
- // if its the last point in data block, no need to fill, but reserve this point as the start value and do
- // the interpolation when processing next data block.
- if (pSliceInfo->fillType == TSDB_FILL_LINEAR) {
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- if (i < pBlock->info.rows - 1) {
- doKeepLinearInfo(pSliceInfo, pBlock, i, false);
- int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
- if (nextTs > pSliceInfo->current) {
- while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
- pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
- pInterval->precision);
- }
-
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
- break;
- }
- }
- } else { // it is the last row of current block
- // store ts value as start, and calculate interp value when processing next block
- doKeepLinearInfo(pSliceInfo, pBlock, i, true);
- }
- } else { // non-linear interpolation
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
- break;
- }
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ if (pSliceInfo->current > pSliceInfo->win.ekey) {
+ setOperatorCompleted(pOperator);
+ break;
}
} else if (ts < pSliceInfo->current) {
// in case of interpolation window starts and ends between two datapoints, fill(prev) need to interpolate
doKeepPrevRows(pSliceInfo, pBlock, i);
-
- if (pSliceInfo->fillType == TSDB_FILL_LINEAR) {
- // no need to increate pSliceInfo->current here
- // pSliceInfo->current =
- // taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- if (i < pBlock->info.rows - 1) {
- doKeepLinearInfo(pSliceInfo, pBlock, i, false);
- int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
- if (nextTs > pSliceInfo->current) {
- while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
- pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
- pInterval->precision);
- }
-
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
+ doKeepLinearInfo(pSliceInfo, pBlock, i);
+
+ if (i < pBlock->info.rows - 1) {
+ // in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
+ doKeepNextRows(pSliceInfo, pBlock, i + 1);
+ int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
+ if (nextTs > pSliceInfo->current) {
+ while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
+ if (!genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, false) && pSliceInfo->fillType == TSDB_FILL_LINEAR) {
break;
+ } else {
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
}
}
- } else {
- // store ts value as start, and calculate interp value when processing next block
- doKeepLinearInfo(pSliceInfo, pBlock, i, true);
- }
- } else { // non-linear interpolation
- if (i < pBlock->info.rows - 1) {
- // in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
- doKeepNextRows(pSliceInfo, pBlock, i + 1);
- int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
- if (nextTs > pSliceInfo->current) {
- while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
- pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
- pInterval->precision);
- }
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
- break;
- }
- } else {
- // ignore current row, and do nothing
+ if (pSliceInfo->current > pSliceInfo->win.ekey) {
+ setOperatorCompleted(pOperator);
+ break;
}
- } else { // it is the last row of current block
- doKeepPrevRows(pSliceInfo, pBlock, i);
+ } else {
+ // ignore current row, and do nothing
}
+ } else { // it is the last row of current block
+ doKeepPrevRows(pSliceInfo, pBlock, i);
}
} else { // ts > pSliceInfo->current
// in case of interpolation window starts and ends between two datapoints, fill(next) need to interpolate
doKeepNextRows(pSliceInfo, pBlock, i);
+ doKeepLinearInfo(pSliceInfo, pBlock, i);
while (pSliceInfo->current < ts && pSliceInfo->current <= pSliceInfo->win.ekey) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ if (!genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, true) && pSliceInfo->fillType == TSDB_FILL_LINEAR) {
+ break;
+ } else {
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
+ }
}
// add current row if timestamp match
if (ts == pSliceInfo->current && pSliceInfo->current <= pSliceInfo->win.ekey) {
- blockDataEnsureCapacity(pResBlock, pResBlock->info.rows + 1);
- for (int32_t j = 0; j < pOperator->exprSupp.numOfExprs; ++j) {
- SExprInfo* pExprInfo = &pOperator->exprSupp.pExprInfo[j];
-
- int32_t dstSlot = pExprInfo->base.resSchema.slotId;
- SColumnInfoData* pDst = taosArrayGet(pResBlock->pDataBlock, dstSlot);
-
- if (IS_TIMESTAMP_TYPE(pExprInfo->base.resSchema.type)) {
- colDataAppend(pDst, pResBlock->info.rows, (char*)&pSliceInfo->current, false);
- } else {
- int32_t srcSlot = pExprInfo->base.pParam[0].pCol->slotId;
- SColumnInfoData* pSrc = taosArrayGet(pBlock->pDataBlock, srcSlot);
-
- if (colDataIsNull_s(pSrc, i)) {
- colDataAppendNULL(pDst, pResBlock->info.rows);
- continue;
- }
-
- char* v = colDataGetData(pSrc, i);
- colDataAppend(pDst, pResBlock->info.rows, v, false);
- }
- }
-
- pResBlock->info.rows += 1;
+ addCurrentRowToResult(pSliceInfo, &pOperator->exprSupp, pResBlock, pBlock, i);
doKeepPrevRows(pSliceInfo, pBlock, i);
- if (pSliceInfo->fillType == TSDB_FILL_LINEAR) {
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- if (i < pBlock->info.rows - 1) {
- doKeepLinearInfo(pSliceInfo, pBlock, i, false);
- int64_t nextTs = *(int64_t*)colDataGetData(pTsCol, i + 1);
- if (nextTs > pSliceInfo->current) {
- while (pSliceInfo->current < nextTs && pSliceInfo->current <= pSliceInfo->win.ekey) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
- pSliceInfo->current = taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit,
- pInterval->precision);
- }
-
- if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
- break;
- }
- }
- } else { // it is the last row of current block
- // store ts value as start, and calculate interp value when processing next block
- doKeepLinearInfo(pSliceInfo, pBlock, i, true);
- }
- } else { // non-linear interpolation
- pSliceInfo->current =
- taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
- }
+ pSliceInfo->current =
+ taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
}
if (pSliceInfo->current > pSliceInfo->win.ekey) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
}
@@ -2476,7 +2382,7 @@ static SSDataBlock* doTimeslice(SOperatorInfo* pOperator) {
// except for fill(next), fill(linear)
while (pSliceInfo->current <= pSliceInfo->win.ekey && pSliceInfo->fillType != TSDB_FILL_NEXT &&
pSliceInfo->fillType != TSDB_FILL_LINEAR) {
- genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock);
+ genInterpolationResult(pSliceInfo, &pOperator->exprSupp, pResBlock, false);
pSliceInfo->current =
taosTimeAdd(pSliceInfo->current, pInterval->interval, pInterval->intervalUnit, pInterval->precision);
}
@@ -2555,19 +2461,15 @@ SOperatorInfo* createTimeSliceOperatorInfo(SOperatorInfo* downstream, SPhysiNode
pInfo->interval.interval = pInterpPhyNode->interval;
pInfo->current = pInfo->win.skey;
- STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
- pScanInfo->cond.twindows = pInfo->win;
- pScanInfo->cond.type = TIMEWINDOW_RANGE_EXTERNAL;
-
- pOperator->name = "TimeSliceOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->pTaskInfo = pTaskInfo;
+ if (downstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_TABLE_SCAN) {
+ STableScanInfo* pScanInfo = (STableScanInfo*)downstream->info;
+ pScanInfo->base.cond.twindows = pInfo->win;
+ pScanInfo->base.cond.type = TIMEWINDOW_RANGE_EXTERNAL;
+ }
- pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doTimeslice, NULL, NULL, destroyTimeSliceOperatorInfo, NULL);
+ setOperatorInfo(pOperator, "TimeSliceOperator", QUERY_NODE_PHYSICAL_PLAN_INTERP_FUNC, false, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doTimeslice, NULL, destroyTimeSliceOperatorInfo, NULL);
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
@@ -2635,15 +2537,11 @@ SOperatorInfo* createStatewindowOperatorInfo(SOperatorInfo* downstream, SStateWi
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pTaskInfo->window);
pInfo->tsSlotId = tsSlotId;
- pOperator->name = "StateWindowOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "StateWindowOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_STATE, true, OP_NOT_OPENED, pInfo,
+ pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(openStateWindowAggOptr, doStateWindowAgg, NULL, NULL, destroyStateWindowOperatorInfo, NULL);
+ createOperatorFpSet(openStateWindowAggOptr, doStateWindowAgg, NULL, destroyStateWindowOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -2713,14 +2611,10 @@ SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionW
goto _error;
}
- pOperator->name = "SessionWindowAggOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
-
+ setOperatorInfo(pOperator, "SessionWindowAggOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_SESSION, true, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doSessionWindowAgg, NULL, NULL, destroySWindowOperatorInfo, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, doSessionWindowAgg, NULL, destroySWindowOperatorInfo, NULL);
pOperator->pTaskInfo = pTaskInfo;
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -2809,6 +2703,7 @@ static void rebuildIntervalWindow(SOperatorInfo* pOperator, SArray* pWinArray, S
pChildSup->rowEntryInfoOffset, &pChInfo->aggSup);
updateTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &parentWin, true);
compactFunctions(pSup->pCtx, pChildSup->pCtx, numOfOutput, pTaskInfo, &pInfo->twAggSup.timeWindowData);
+ releaseOutputBuf(pChInfo->pState, pWinRes, pChResult);
}
if (num > 0 && pUpdatedMap) {
saveWinResultInfo(pCurResult->win.skey, pWinRes->groupId, pUpdatedMap);
@@ -3136,7 +3031,7 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
return pInfo->binfo.pRes;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
if (!IS_FINAL_OP(pInfo)) {
clearFunctionContext(&pOperator->exprSupp);
// semi interval operator clear disk buffer
@@ -3177,11 +3072,6 @@ static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "interval final recv" : "interval semi recv");
- if (pBlock->info.parTbName[0]) {
- taosHashPut(pInfo->pGroupIdTbNameMap, &pBlock->info.groupId, sizeof(int64_t), &pBlock->info.parTbName,
- TSDB_TABLE_NAME_LEN);
- }
-
ASSERT(pBlock->info.type != STREAM_INVERT);
if (pBlock->info.type == STREAM_NORMAL || pBlock->info.type == STREAM_PULL_DATA) {
pInfo->binfo.pRes->info.type = pBlock->info.type;
@@ -3396,16 +3286,13 @@ SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream,
pInfo->delKey.ts = INT64_MAX;
pInfo->delKey.groupId = 0;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
pOperator->operatorType = pPhyNode->type;
pOperator->blocking = true;
pOperator->status = OP_NOT_OPENED;
pOperator->info = pInfo;
pOperator->fpSet =
- createOperatorFpSet(NULL, doStreamFinalIntervalAgg, NULL, NULL, destroyStreamFinalIntervalOperatorInfo, NULL);
+ createOperatorFpSet(NULL, doStreamFinalIntervalAgg, NULL, destroyStreamFinalIntervalOperatorInfo, NULL);
if (pPhyNode->type == QUERY_NODE_PHYSICAL_PLAN_STREAM_SEMI_INTERVAL) {
initIntervalDownStream(downstream, pPhyNode->type, &pInfo->aggSup, &pInfo->interval, &pInfo->twAggSup);
}
@@ -3439,18 +3326,16 @@ void destroyStreamSessionAggOperatorInfo(void* param) {
if (pInfo->pChildren != NULL) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
- SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
- SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
- destroyStreamSessionAggOperatorInfo(pChInfo);
- taosMemoryFreeClear(pChild);
+ SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
+ destroyOperatorInfo(pChild);
}
+ taosArrayDestroy(pInfo->pChildren);
}
colDataDestroy(&pInfo->twAggSup.timeWindowData);
blockDataDestroy(pInfo->pDelRes);
blockDataDestroy(pInfo->pWinBlock);
blockDataDestroy(pInfo->pUpdateRes);
tSimpleHashCleanup(pInfo->pStDeleted);
- taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
}
@@ -3491,7 +3376,9 @@ void initDownStream(SOperatorInfo* downstream, SStreamAggSupporter* pAggSup, int
}
SStreamScanInfo* pScanInfo = downstream->info;
pScanInfo->windowSup = (SWindowSupporter){.pStreamAggSup = pAggSup, .gap = pAggSup->gap, .parentType = type};
- pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
+ if (!pScanInfo->pUpdateInfo) {
+ pScanInfo->pUpdateInfo = updateInfoInit(60000, TSDB_TIME_PRECISION_MILLI, waterMark);
+ }
}
int32_t initStreamAggSupporter(SStreamAggSupporter* pSup, SqlFunctionCtx* pCtx, int32_t numOfOutput, int64_t gap,
@@ -3552,7 +3439,7 @@ void getCurSessionWindow(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endT
pKey->win.skey = startTs;
pKey->win.ekey = endTs;
pKey->groupId = groupId;
- int32_t code = streamStateSessionGetKey(pAggSup->pState, pKey, pKey);
+ int32_t code = streamStateSessionGetKeyByRange(pAggSup->pState, pKey, pKey);
if (code != TSDB_CODE_SUCCESS) {
SET_SESSION_WIN_KEY_INVALID(pKey);
}
@@ -3563,10 +3450,11 @@ bool isInvalidSessionWin(SResultWindowInfo* pWinInfo) { return pWinInfo->session
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;
+ pCurWin->sessionWin.win.skey = startTs;
+ pCurWin->sessionWin.win.ekey = endTs;
int32_t size = pAggSup->resultRowSize;
- int32_t code = streamStateSessionAddIfNotExist(pAggSup->pState, &pCurWin->sessionWin, &pCurWin->pOutputBuf, &size);
+ int32_t code =
+ streamStateSessionAddIfNotExist(pAggSup->pState, &pCurWin->sessionWin, pAggSup->gap, &pCurWin->pOutputBuf, &size);
if (code == TSDB_CODE_SUCCESS) {
pCurWin->isOutput = true;
} else {
@@ -3577,7 +3465,7 @@ void setSessionOutputBuf(SStreamAggSupporter* pAggSup, TSKEY startTs, TSKEY endT
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);
+ int32_t code = streamStateSessionGetKVByCur(pCur, &pWinInfo->sessionWin, &pWinInfo->pOutputBuf, &size);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -3600,6 +3488,11 @@ static void removeSessionResult(SSHashObj* pHashMap, SSHashObj* pResMap, SSessio
tSimpleHashRemove(pResMap, &key, sizeof(SSessionKey));
}
+static void getSessionHashKey(const SSessionKey* pKey, SSessionKey* pHashKey) {
+ *pHashKey = *pKey;
+ pHashKey->win.ekey = pKey->win.skey;
+}
+
static void removeSessionResults(SSHashObj* pHashMap, SArray* pWins) {
if (tSimpleHashGetSize(pHashMap) == 0) {
return;
@@ -3608,8 +3501,8 @@ static void removeSessionResults(SSHashObj* pHashMap, SArray* 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;
+ SSessionKey key = {0};
+ getSessionHashKey(pWin, &key);
tSimpleHashRemove(pHashMap, &key, sizeof(SSessionKey));
}
}
@@ -3662,7 +3555,9 @@ static int32_t doOneWindowAggImpl(SColumnInfoData* pTimeWindowData, SResultWindo
static bool doDeleteSessionWindow(SStreamAggSupporter* pAggSup, SSessionKey* pKey) {
streamStateSessionDel(pAggSup->pState, pKey);
- tSimpleHashRemove(pAggSup->pResultRows, pKey, sizeof(SSessionKey));
+ SSessionKey hashKey = {0};
+ getSessionHashKey(pKey, &hashKey);
+ tSimpleHashRemove(pAggSup->pResultRows, &hashKey, sizeof(SSessionKey));
return true;
}
@@ -3682,7 +3577,7 @@ SStreamStateCur* getNextSessionWinInfo(SStreamAggSupporter* pAggSup, SSHashObj*
setSessionWinOutputInfo(pStUpdated, pNextWin);
int32_t size = 0;
pNextWin->sessionWin = pCurWin->sessionWin;
- int32_t code = streamStateSessionGetKVByCur(pCur, &pNextWin->sessionWin, (const void**)&pNextWin->pOutputBuf, &size);
+ int32_t code = streamStateSessionGetKVByCur(pCur, &pNextWin->sessionWin, &pNextWin->pOutputBuf, &size);
if (code != TSDB_CODE_SUCCESS) {
SET_SESSION_WIN_INVALID(*pNextWin);
}
@@ -3773,8 +3668,8 @@ static void doStreamSessionAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSData
}
}
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE) {
- SSessionKey key = winInfo.sessionWin;
- key.win.ekey = key.win.skey;
+ SSessionKey key = {0};
+ getSessionHashKey(&winInfo.sessionWin, &key);
tSimpleHashPut(pAggSup->pResultRows, &key, sizeof(SSessionKey), &winInfo, sizeof(SResultWindowInfo));
}
@@ -3845,7 +3740,7 @@ static int32_t copyUpdateResult(SSHashObj* pStUpdated, SArray* pUpdated) {
return TSDB_CODE_SUCCESS;
}
-void doBuildDeleteDataBlock(SSHashObj* pStDeleted, SSDataBlock* pBlock, void** Ite) {
+void doBuildDeleteDataBlock(SOperatorInfo* pOp, SSHashObj* pStDeleted, SSDataBlock* pBlock, void** Ite) {
blockDataCleanup(pBlock);
int32_t size = tSimpleHashGetSize(pStDeleted);
if (size == 0) {
@@ -3871,6 +3766,19 @@ void doBuildDeleteDataBlock(SSHashObj* pStDeleted, SSDataBlock* pBlock, void** I
colDataAppendNULL(pCalStCol, pBlock->info.rows);
SColumnInfoData* pCalEdCol = taosArrayGet(pBlock->pDataBlock, CALCULATE_END_TS_COLUMN_INDEX);
colDataAppendNULL(pCalEdCol, pBlock->info.rows);
+
+ SColumnInfoData* pTableCol = taosArrayGet(pBlock->pDataBlock, TABLE_NAME_COLUMN_INDEX);
+
+ void* tbname = NULL;
+ streamStateGetParName(pOp->pTaskInfo->streamInfo.pState, res->groupId, &tbname);
+ if (tbname == NULL) {
+ colDataAppendNULL(pTableCol, pBlock->info.rows);
+ } else {
+ char parTbName[VARSTR_HEADER_SIZE + TSDB_TABLE_NAME_LEN];
+ STR_WITH_MAXSIZE_TO_VARSTR(parTbName, tbname, sizeof(parTbName));
+ colDataAppend(pTableCol, pBlock->info.rows, (const char*)parTbName, false);
+ }
+ tdbFree(tbname);
pBlock->info.rows += 1;
}
if ((*Ite) == NULL) {
@@ -3896,9 +3804,11 @@ static void rebuildSessionWindow(SOperatorInfo* pOperator, SArray* pWinArray, SS
SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, j);
SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
SStreamAggSupporter* pChAggSup = &pChInfo->streamAggSup;
- SStreamStateCur* pCur = streamStateSessionGetCur(pChAggSup->pState, pWinKey);
- SResultRow* pResult = NULL;
- SResultRow* pChResult = NULL;
+ SSessionKey chWinKey = {0};
+ getSessionHashKey(pWinKey, &chWinKey);
+ SStreamStateCur* pCur = streamStateSessionSeekKeyCurrentNext(pChAggSup->pState, &chWinKey);
+ SResultRow* pResult = NULL;
+ SResultRow* pChResult = NULL;
while (1) {
SResultWindowInfo childWin = {0};
childWin.sessionWin = *pWinKey;
@@ -3976,8 +3886,8 @@ static void copyDeleteWindowInfo(SArray* pResWins, SSHashObj* pStDeleted) {
for (int32_t i = 0; i < size; i++) {
SSessionKey* pWinKey = taosArrayGet(pResWins, i);
if (!pWinKey) continue;
- SSessionKey winInfo = *pWinKey;
- winInfo.win.ekey = winInfo.win.skey;
+ SSessionKey winInfo = {0};
+ getSessionHashKey(pWinKey, &winInfo);
tSimpleHashPut(pStDeleted, &winInfo, sizeof(SSessionKey), NULL, 0);
}
}
@@ -4015,7 +3925,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
if (pOperator->status == OP_EXEC_DONE) {
return NULL;
} else if (pOperator->status == OP_RES_TO_RETURN) {
- doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
+ doBuildDeleteDataBlock(pOperator, 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;
@@ -4026,7 +3936,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
return pBInfo->pRes;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -4041,18 +3951,6 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, IS_FINAL_OP(pInfo) ? "final session recv" : "single session recv");
- 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.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));
@@ -4114,7 +4012,13 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
initGroupResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
- doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
+#if 0
+ char* pBuf = streamStateSessionDump(pAggSup->pState);
+ qDebug("===stream===final session%s", pBuf);
+ taosMemoryFree(pBuf);
+#endif
+
+ doBuildDeleteDataBlock(pOperator, 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;
@@ -4126,7 +4030,7 @@ static SSDataBlock* doStreamSessionAgg(SOperatorInfo* pOperator) {
return pBInfo->pRes;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -4190,16 +4094,12 @@ SOperatorInfo* createStreamSessionAggOperatorInfo(SOperatorInfo* downstream, SPh
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, NULL);
+ setOperatorInfo(pOperator, "StreamSessionWindowAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_SESSION, true,
+ OP_NOT_OPENED, pInfo, pTaskInfo);
+ pOperator->fpSet =
+ createOperatorFpSet(operatorDummyOpenFn, doStreamSessionAgg, NULL, destroyStreamSessionAggOperatorInfo, NULL);
+
if (downstream) {
initDownStream(downstream, &pInfo->streamAggSup, pInfo->twAggSup.waterMark, pOperator->operatorType,
pInfo->primaryTsIndex);
@@ -4240,7 +4140,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
return pBInfo->pRes;
}
- doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
+ doBuildDeleteDataBlock(pOperator, pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
printDataBlock(pInfo->pDelRes, "semi session delete");
return pInfo->pDelRes;
@@ -4250,7 +4150,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
clearFunctionContext(&pOperator->exprSupp);
// semi interval operator clear disk buffer
clearStreamSessionOperator(pInfo);
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
}
@@ -4268,16 +4168,10 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "semi session recv");
- 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) {
// gap must be 0
- SArray* pWins = taosArrayInit(16, sizeof(SResultWindowInfo));
+ SArray* pWins = taosArrayInit(16, sizeof(SSessionKey));
doDeleteTimeWindows(&pInfo->streamAggSup, pBlock, pWins);
removeSessionResults(pStUpdated, pWins);
copyDeleteWindowInfo(pWins, pInfo->pStDeleted);
@@ -4308,13 +4202,19 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
initGroupResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity);
+#if 0
+ char* pBuf = streamStateSessionDump(pAggSup->pState);
+ qDebug("===stream===semi session%s", pBuf);
+ taosMemoryFree(pBuf);
+#endif
+
doBuildSessionResult(pOperator, pAggSup->pState, &pInfo->groupResInfo, pBInfo->pRes);
if (pBInfo->pRes->info.rows > 0) {
printDataBlock(pBInfo->pRes, "semi session");
return pBInfo->pRes;
}
- doBuildDeleteDataBlock(pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
+ doBuildDeleteDataBlock(pOperator, pInfo->pStDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
printDataBlock(pInfo->pDelRes, "semi session delete");
return pInfo->pDelRes;
@@ -4323,7 +4223,7 @@ static SSDataBlock* doStreamSessionSemiAgg(SOperatorInfo* pOperator) {
clearFunctionContext(&pOperator->exprSupp);
// semi interval operator clear disk buffer
clearStreamSessionOperator(pInfo);
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -4334,22 +4234,20 @@ SOperatorInfo* createStreamFinalSessionAggOperatorInfo(SOperatorInfo* downstream
if (pOperator == NULL) {
goto _error;
}
+
SStreamSessionAggOperatorInfo* pInfo = pOperator->info;
- if (pPhyNode->type == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
- pInfo->isFinal = true;
- pOperator->name = "StreamSessionFinalAggOperator";
- } else {
- pInfo->isFinal = false;
+ pInfo->isFinal = (pPhyNode->type == QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION);
+ char* name = (pInfo->isFinal) ? "StreamSessionFinalAggOperator" : "StreamSessionSemiAggOperator";
+
+ if (pPhyNode->type != QUERY_NODE_PHYSICAL_PLAN_STREAM_FINAL_SESSION) {
pInfo->pUpdateRes = createSpecialDataBlock(STREAM_CLEAR);
blockDataEnsureCapacity(pInfo->pUpdateRes, 128);
- pOperator->name = "StreamSessionSemiAggOperator";
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamSessionSemiAgg, NULL, NULL,
+ pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamSessionSemiAgg, NULL,
destroyStreamSessionAggOperatorInfo, NULL);
}
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
+ setOperatorInfo(pOperator, name, pPhyNode->type, false, OP_NOT_OPENED, pInfo, pTaskInfo);
pOperator->operatorType = pPhyNode->type;
if (numOfChild > 0) {
@@ -4389,16 +4287,14 @@ void destroyStreamStateOperatorInfo(void* param) {
if (pInfo->pChildren != NULL) {
int32_t size = taosArrayGetSize(pInfo->pChildren);
for (int32_t i = 0; i < size; i++) {
- SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
- SStreamSessionAggOperatorInfo* pChInfo = pChild->info;
- destroyStreamSessionAggOperatorInfo(pChInfo);
- taosMemoryFreeClear(pChild);
+ SOperatorInfo* pChild = taosArrayGetP(pInfo->pChildren, i);
+ destroyOperatorInfo(pChild);
}
+ taosArrayDestroy(pInfo->pChildren);
}
colDataDestroy(&pInfo->twAggSup.timeWindowData);
blockDataDestroy(pInfo->pDelRes);
tSimpleHashCleanup(pInfo->pSeDeleted);
- taosHashCleanup(pInfo->pGroupIdTbNameMap);
taosMemoryFreeClear(param);
}
@@ -4548,8 +4444,8 @@ static void doStreamStateAggImpl(SOperatorInfo* pOperator, SSDataBlock* pSDataBl
}
if (pInfo->twAggSup.calTrigger == STREAM_TRIGGER_WINDOW_CLOSE) {
- SSessionKey key = curWin.winInfo.sessionWin;
- key.win.ekey = key.win.skey;
+ SSessionKey key = {0};
+ getSessionHashKey(&curWin.winInfo.sessionWin, &key);
tSimpleHashPut(pAggSup->pResultRows, &key, sizeof(SSessionKey), &curWin.winInfo, sizeof(SResultWindowInfo));
}
}
@@ -4565,7 +4461,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
SOptrBasicInfo* pBInfo = &pInfo->binfo;
int64_t maxTs = INT64_MIN;
if (pOperator->status == OP_RES_TO_RETURN) {
- doBuildDeleteDataBlock(pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
+ doBuildDeleteDataBlock(pOperator, pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
printDataBlock(pInfo->pDelRes, "single state delete");
return pInfo->pDelRes;
@@ -4577,7 +4473,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
return pBInfo->pRes;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -4592,12 +4488,6 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "single state recv");
- 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));
@@ -4632,7 +4522,13 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
initGroupResInfoFromArrayList(&pInfo->groupResInfo, pUpdated);
blockDataEnsureCapacity(pInfo->binfo.pRes, pOperator->resultInfo.capacity);
- doBuildDeleteDataBlock(pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
+#if 0
+ char* pBuf = streamStateSessionDump(pInfo->streamAggSup.pState);
+ qDebug("===stream===final session%s", pBuf);
+ taosMemoryFree(pBuf);
+#endif
+
+ doBuildDeleteDataBlock(pOperator, pInfo->pSeDeleted, pInfo->pDelRes, &pInfo->pDelIterator);
if (pInfo->pDelRes->info.rows > 0) {
printDataBlock(pInfo->pDelRes, "single state delete");
return pInfo->pDelRes;
@@ -4643,7 +4539,7 @@ static SSDataBlock* doStreamStateAgg(SOperatorInfo* pOperator) {
printDataBlock(pBInfo->pRes, "single state");
return pBInfo->pRes;
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
return NULL;
}
@@ -4705,17 +4601,10 @@ SOperatorInfo* createStreamStateAggOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->pChildren = NULL;
pInfo->ignoreExpiredData = pStateNode->window.igExpired;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
- pOperator->name = "StreamStateAggOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->info = pInfo;
+ setOperatorInfo(pOperator, "StreamStateAggOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_STATE, true, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doStreamStateAgg, NULL, NULL, destroyStreamStateOperatorInfo, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, doStreamStateAgg, NULL, destroyStreamStateOperatorInfo, NULL);
initDownStream(downstream, &pInfo->streamAggSup, pInfo->twAggSup.waterMark, pOperator->operatorType,
pInfo->primaryTsIndex);
code = appendDownstream(pOperator, &downstream, 1);
@@ -4863,13 +4752,14 @@ static void doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
cleanupAfterGroupResultGen(pMiaInfo, pRes);
}
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
break;
}
if (pMiaInfo->groupId == 0) {
if (pMiaInfo->groupId != pBlock->info.groupId) {
pMiaInfo->groupId = pBlock->info.groupId;
+ pRes->info.groupId = pMiaInfo->groupId;
}
} else {
if (pMiaInfo->groupId != pBlock->info.groupId) {
@@ -4883,6 +4773,7 @@ static void doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
break;
} else {
// continue
+ pRes->info.groupId = pMiaInfo->groupId;
}
}
@@ -4988,16 +4879,11 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream,
initResultRowInfo(&iaInfo->binfo.resultRowInfo);
blockDataEnsureCapacity(iaInfo->binfo.pRes, pOperator->resultInfo.capacity);
-
- pOperator->name = "TimeMergeAlignedIntervalAggOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->info = miaInfo;
+ setOperatorInfo(pOperator, "TimeMergeAlignedIntervalAggOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_ALIGNED_INTERVAL,
+ false, OP_NOT_OPENED, miaInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, mergeAlignedIntervalAgg, NULL, NULL, destroyMAIOperatorInfo, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, mergeAlignedIntervalAgg, NULL, destroyMAIOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -5241,7 +5127,7 @@ static SSDataBlock* doMergeIntervalAgg(SOperatorInfo* pOperator) {
}
if (pRes->info.rows == 0) {
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
}
size_t rows = pRes->info.rows;
@@ -5300,16 +5186,10 @@ SOperatorInfo* createMergeIntervalOperatorInfo(SOperatorInfo* downstream, SMerge
}
initResultRowInfo(&pIntervalInfo->binfo.resultRowInfo);
-
- pOperator->name = "TimeMergeIntervalAggOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL;
- pOperator->blocking = false;
- pOperator->status = OP_NOT_OPENED;
- pOperator->pTaskInfo = pTaskInfo;
- pOperator->info = pMergeIntervalInfo;
-
+ setOperatorInfo(pOperator, "TimeMergeIntervalAggOperator", QUERY_NODE_PHYSICAL_PLAN_MERGE_INTERVAL, false,
+ OP_NOT_OPENED, pMergeIntervalInfo, pTaskInfo);
pOperator->fpSet =
- createOperatorFpSet(operatorDummyOpenFn, doMergeIntervalAgg, NULL, NULL, destroyMergeIntervalOperatorInfo, NULL);
+ createOperatorFpSet(operatorDummyOpenFn, doMergeIntervalAgg, NULL, destroyMergeIntervalOperatorInfo, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
@@ -5353,7 +5233,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
}
deleteIntervalDiscBuf(pInfo->pState, NULL, pInfo->twAggSup.maxTs - pInfo->twAggSup.deleteMark, &pInfo->interval,
&pInfo->delKey);
- doSetOperatorCompleted(pOperator);
+ setOperatorCompleted(pOperator);
streamStateCommit(pTaskInfo->streamInfo.pState);
return NULL;
}
@@ -5371,12 +5251,6 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
}
printDataBlock(pBlock, "single interval recv");
- 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) {
doDeleteWindows(pOperator, &pInfo->interval, pBlock, pInfo->pDelWins, pUpdatedMap);
@@ -5534,16 +5408,10 @@ SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SPhys
pInfo->delKey.ts = INT64_MAX;
pInfo->delKey.groupId = 0;
- pInfo->pGroupIdTbNameMap =
- taosHashInit(1024, taosGetDefaultHashFunction(TSDB_DATA_TYPE_UBIGINT), false, HASH_NO_LOCK);
-
- pOperator->name = "StreamIntervalOperator";
- pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL;
- pOperator->blocking = true;
- pOperator->status = OP_NOT_OPENED;
- pOperator->info = pInfo;
- pOperator->fpSet = createOperatorFpSet(operatorDummyOpenFn, doStreamIntervalAgg, NULL, NULL,
- destroyStreamFinalIntervalOperatorInfo, NULL);
+ setOperatorInfo(pOperator, "StreamIntervalOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_INTERVAL, true, OP_NOT_OPENED,
+ pInfo, pTaskInfo);
+ pOperator->fpSet =
+ createOperatorFpSet(operatorDummyOpenFn, doStreamIntervalAgg, NULL, destroyStreamFinalIntervalOperatorInfo, NULL);
initIntervalDownStream(downstream, pPhyNode->type, &pInfo->aggSup, &pInfo->interval, &pInfo->twAggSup);
code = appendDownstream(pOperator, &downstream, 1);
diff --git a/source/libs/executor/src/tsimplehash.c b/source/libs/executor/src/tsimplehash.c
index a5168d24ba6d933adfa01c0c85a607f7fd82d291..484d9170698a2ca84b21079cfc9964d261713805 100644
--- a/source/libs/executor/src/tsimplehash.c
+++ b/source/libs/executor/src/tsimplehash.c
@@ -93,7 +93,7 @@ static SHNode *doCreateHashNode(const void *key, size_t keyLen, const void *data
pNewNode->keyLen = keyLen;
pNewNode->dataLen = dataLen;
pNewNode->next = NULL;
- memcpy(GET_SHASH_NODE_DATA(pNewNode), data, dataLen);
+ if (data) memcpy(GET_SHASH_NODE_DATA(pNewNode), data, dataLen);
memcpy(GET_SHASH_NODE_KEY(pNewNode, dataLen), key, keyLen);
return pNewNode;
}
@@ -189,7 +189,7 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons
}
while (pNode) {
- if ((*(pHashObj->equalFp))(GET_SHASH_NODE_KEY(pNode, pNode->dataLen), key, keyLen) == 0) {
+ if ((keyLen == pNode->keyLen) && (*(pHashObj->equalFp))(GET_SHASH_NODE_KEY(pNode, pNode->dataLen), key, keyLen) == 0) {
break;
}
pNode = pNode->next;
@@ -203,7 +203,7 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons
pNewNode->next = pHashObj->hashList[slot];
pHashObj->hashList[slot] = pNewNode;
atomic_add_fetch_64(&pHashObj->size, 1);
- } else { // update data
+ } else if (data) { // update data
memcpy(GET_SHASH_NODE_DATA(pNode), data, dataLen);
}
@@ -213,10 +213,12 @@ int32_t tSimpleHashPut(SSHashObj *pHashObj, const void *key, size_t keyLen, cons
static FORCE_INLINE SHNode *doSearchInEntryList(SSHashObj *pHashObj, const void *key, size_t keyLen, int32_t index) {
SHNode *pNode = pHashObj->hashList[index];
while (pNode) {
- if ((*(pHashObj->equalFp))(GET_SHASH_NODE_KEY(pNode, pNode->dataLen), key, keyLen) == 0) {
+ const char* p = GET_SHASH_NODE_KEY(pNode, pNode->dataLen);
+ ASSERT(keyLen > 0);
+
+ if (pNode->keyLen == keyLen && ((*(pHashObj->equalFp))(p, key, keyLen) == 0)) {
break;
}
-
pNode = pNode->next;
}
diff --git a/source/libs/executor/src/tsort.c b/source/libs/executor/src/tsort.c
index 71fad2e27c8fb13da291460c92847a69a7191d9f..9c10b51b1f2968500071cb0d14400ed631b7d887 100644
--- a/source/libs/executor/src/tsort.c
+++ b/source/libs/executor/src/tsort.c
@@ -584,15 +584,11 @@ static int32_t doInternalMergeSort(SSortHandle* pHandle) {
return 0;
}
-// TODO consider the page meta size
-int32_t getProperSortPageSize(size_t rowSize) {
- uint32_t defaultPageSize = 4096;
-
- uint32_t pgSize = 0;
- if (rowSize * 4 > defaultPageSize) {
- pgSize = rowSize * 4;
- } else {
- pgSize = defaultPageSize;
+// get sort page size
+int32_t getProperSortPageSize(size_t rowSize, uint32_t numOfCols) {
+ uint32_t pgSize = rowSize * 4 + blockDataGetSerialMetaSize(numOfCols);
+ if (pgSize < DEFAULT_PAGESIZE) {
+ return DEFAULT_PAGESIZE;
}
return pgSize;
@@ -612,7 +608,8 @@ static int32_t createInitialSources(SSortHandle* pHandle) {
}
if (pHandle->pDataBlock == NULL) {
- pHandle->pageSize = getProperSortPageSize(blockDataGetRowSize(pBlock));
+ uint32_t numOfCols = taosArrayGetSize(pBlock->pDataBlock);
+ pHandle->pageSize = getProperSortPageSize(blockDataGetRowSize(pBlock), numOfCols);
// todo, number of pages are set according to the total available sort buffer
pHandle->numOfPages = 1024;
diff --git a/source/libs/function/src/builtins.c b/source/libs/function/src/builtins.c
index afe639b85638a7302af843f9071fbd67626f31e1..fe010786ebdcb12d9df1350fbe565c6fb1494e3f 100644
--- a/source/libs/function/src/builtins.c
+++ b/source/libs/function/src/builtins.c
@@ -475,7 +475,7 @@ static int32_t translateNowToday(SFunctionNode* pFunc, char* pErrBuf, int32_t le
// add database precision as param
uint8_t dbPrec = pFunc->node.resType.precision;
- int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
+ int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -917,6 +917,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
int32_t startIndex;
if (numOfParams != 4) {
snprintf(errMsg, msgLen, "%s", msg1);
+ cJSON_Delete(binDesc);
return false;
}
@@ -928,17 +929,20 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
snprintf(errMsg, msgLen, "%s", msg3);
+ cJSON_Delete(binDesc);
return false;
}
if (count->valueint <= 0 || count->valueint > 1000) { // limit count to 1000
snprintf(errMsg, msgLen, "%s", msg4);
+ cJSON_Delete(binDesc);
return false;
}
if (isinf(start->valuedouble) || (width != NULL && isinf(width->valuedouble)) ||
(factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
snprintf(errMsg, msgLen, "%s", msg5);
+ cJSON_Delete(binDesc);
return false;
}
@@ -957,6 +961,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (width->valuedouble == 0) {
snprintf(errMsg, msgLen, "%s", msg6);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
for (int i = 0; i < counter + 1; ++i) {
@@ -964,6 +969,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (isinf(intervals[startIndex])) {
snprintf(errMsg, msgLen, "%s", msg5);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
startIndex++;
@@ -973,11 +979,13 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (start->valuedouble == 0) {
snprintf(errMsg, msgLen, "%s", msg7);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
if (factor->valuedouble < 0 || factor->valuedouble == 0 || factor->valuedouble == 1) {
snprintf(errMsg, msgLen, "%s", msg8);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
for (int i = 0; i < counter + 1; ++i) {
@@ -985,6 +993,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (isinf(intervals[startIndex])) {
snprintf(errMsg, msgLen, "%s", msg5);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
startIndex++;
@@ -992,6 +1001,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
} else {
snprintf(errMsg, msgLen, "%s", msg3);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
@@ -1007,6 +1017,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
} else if (cJSON_IsArray(binDesc)) { /* user input bins */
if (binType != USER_INPUT_BIN) {
snprintf(errMsg, msgLen, "%s", msg3);
+ cJSON_Delete(binDesc);
return false;
}
numOfBins = cJSON_GetArraySize(binDesc);
@@ -1015,6 +1026,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (bin == NULL) {
snprintf(errMsg, msgLen, "%s", msg3);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
int i = 0;
@@ -1023,11 +1035,13 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
if (!cJSON_IsNumber(bin)) {
snprintf(errMsg, msgLen, "%s", msg3);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
if (i != 0 && intervals[i] <= intervals[i - 1]) {
snprintf(errMsg, msgLen, "%s", msg3);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
bin = bin->next;
@@ -1035,6 +1049,7 @@ static bool validateHistogramBinDesc(char* binDescStr, int8_t binType, char* err
}
} else {
snprintf(errMsg, msgLen, "%s", msg3);
+ cJSON_Delete(binDesc);
return false;
}
@@ -1464,11 +1479,16 @@ static int32_t translateDerivative(SFunctionNode* pFunc, char* pErrBuf, int32_t
uint8_t colType = ((SExprNode*)nodesListGetNode(pFunc->pParameterList, 0))->resType.type;
// param1
- SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
+ SNode* pParamNode1 = nodesListGetNode(pFunc->pParameterList, 1);
+ SValueNode* pValue1 = (SValueNode*)pParamNode1;
if (QUERY_NODE_VALUE != nodeType(pParamNode1)) {
return invaildFuncParaTypeErrMsg(pErrBuf, len, pFunc->functionName);
}
+ if (pValue1->datum.i <= 0) {
+ return invaildFuncParaValueErrMsg(pErrBuf, len, pFunc->functionName);
+ }
+
SValueNode* pValue = (SValueNode*)pParamNode1;
pValue->notReserved = true;
@@ -1506,7 +1526,7 @@ static int32_t translateIrate(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
// add database precision as param
uint8_t dbPrec = pFunc->node.resType.precision;
- int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
+ int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -1519,7 +1539,7 @@ static int32_t translateInterp(SFunctionNode* pFunc, char* pErrBuf, int32_t len)
int32_t numOfParams = LIST_LENGTH(pFunc->pParameterList);
uint8_t dbPrec = pFunc->node.resType.precision;
- //if (1 != numOfParams && 3 != numOfParams && 4 != numOfParams) {
+ // if (1 != numOfParams && 3 != numOfParams && 4 != numOfParams) {
if (1 != numOfParams) {
return invaildFuncParaNumErrMsg(pErrBuf, len, pFunc->functionName);
}
@@ -1835,7 +1855,7 @@ static int32_t translateCast(SFunctionNode* pFunc, char* pErrBuf, int32_t len) {
// add database precision as param
uint8_t dbPrec = pFunc->node.resType.precision;
- int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
+ int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -1894,7 +1914,7 @@ static int32_t translateToUnixtimestamp(SFunctionNode* pFunc, char* pErrBuf, int
// add database precision as param
uint8_t dbPrec = pFunc->node.resType.precision;
- int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
+ int32_t code = addDbPrecisonParam(&pFunc->pParameterList, dbPrec);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
@@ -2474,7 +2494,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "first",
.type = FUNCTION_TYPE_FIRST,
- .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC,
+ .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
.translateFunc = translateFirstLast,
.dynDataRequiredFunc = firstDynDataReq,
.getEnvFunc = getFirstLastFuncEnv,
@@ -2512,7 +2532,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "last",
.type = FUNCTION_TYPE_LAST,
- .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC,
+ .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_MULTI_RES_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
.translateFunc = translateFirstLast,
.dynDataRequiredFunc = lastDynDataReq,
.getEnvFunc = getFirstLastFuncEnv,
@@ -2640,8 +2660,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "diff",
.type = FUNCTION_TYPE_DIFF,
- .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC |
- FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC,
+ .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
+ FUNC_MGT_KEEP_ORDER_FUNC | FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC,
.translateFunc = translateDiff,
.getEnvFunc = getDiffFuncEnv,
.initFunc = diffFunctionSetup,
@@ -2653,7 +2673,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "statecount",
.type = FUNCTION_TYPE_STATE_COUNT,
- .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
+ .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
+ FUNC_MGT_FORBID_STREAM_FUNC,
.translateFunc = translateStateCount,
.getEnvFunc = getStateFuncEnv,
.initFunc = functionSetup,
@@ -2664,7 +2685,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "stateduration",
.type = FUNCTION_TYPE_STATE_DURATION,
- .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
+ .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
+ FUNC_MGT_FORBID_STREAM_FUNC,
.translateFunc = translateStateDuration,
.getEnvFunc = getStateFuncEnv,
.initFunc = functionSetup,
@@ -2675,7 +2697,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "csum",
.type = FUNCTION_TYPE_CSUM,
- .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC |
+ .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
FUNC_MGT_FORBID_STREAM_FUNC | FUNC_MGT_CUMULATIVE_FUNC | FUNC_MGT_KEEP_ORDER_FUNC,
.translateFunc = translateCsum,
.getEnvFunc = getCsumFuncEnv,
@@ -2688,7 +2710,8 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "mavg",
.type = FUNCTION_TYPE_MAVG,
- .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_FORBID_STREAM_FUNC,
+ .classification = FUNC_MGT_INDEFINITE_ROWS_FUNC | FUNC_MGT_SELECT_FUNC | FUNC_MGT_TIMELINE_FUNC | FUNC_MGT_IMPLICIT_TS_FUNC |
+ FUNC_MGT_FORBID_STREAM_FUNC,
.translateFunc = translateMavg,
.getEnvFunc = getMavgFuncEnv,
.initFunc = mavgFunctionSetup,
@@ -2734,7 +2757,7 @@ const SBuiltinFuncDefinition funcMgtBuiltins[] = {
{
.name = "mode",
.type = FUNCTION_TYPE_MODE,
- .classification = FUNC_MGT_AGG_FUNC,
+ .classification = FUNC_MGT_AGG_FUNC | FUNC_MGT_SELECT_FUNC,
.translateFunc = translateMode,
.getEnvFunc = getModeFuncEnv,
.initFunc = modeFunctionSetup,
diff --git a/source/libs/function/src/builtinsimpl.c b/source/libs/function/src/builtinsimpl.c
index 1501bb6d6755cde73a49e21266701f80ee554a80..87e15370e4003189b08f41c2e57cdcc3b36e5925 100644
--- a/source/libs/function/src/builtinsimpl.c
+++ b/source/libs/function/src/builtinsimpl.c
@@ -48,6 +48,9 @@ typedef struct SSumRes {
double dsum;
};
int16_t type;
+ int64_t prevTs; // used for csum only
+ bool isPrevTsSet; // used for csum only
+
} SSumRes;
typedef struct SAvgRes {
@@ -190,6 +193,8 @@ typedef struct SStateInfo {
int64_t count;
int64_t durationStart;
};
+ int64_t prevTs;
+ bool isPrevTsSet;
} SStateInfo;
typedef enum {
@@ -205,6 +210,8 @@ typedef enum {
typedef struct SMavgInfo {
int32_t pos;
double sum;
+ int64_t prevTs;
+ bool isPrevTsSet;
int32_t numOfPoints;
bool pointsMeet;
double points[];
@@ -255,8 +262,9 @@ typedef struct SUniqueInfo {
} SUniqueInfo;
typedef struct SModeItem {
- int64_t count;
- char data[];
+ int64_t count;
+ STuplePos tuplePos;
+ char data[];
} SModeItem;
typedef struct SModeInfo {
@@ -264,7 +272,11 @@ typedef struct SModeInfo {
uint8_t colType;
int16_t colBytes;
SHashObj* pHash;
- char pItems[];
+
+ STuplePos nullTuplePos;
+ bool nullTupleSaved;
+
+ char pItems[];
} SModeInfo;
typedef struct SDerivInfo {
@@ -906,6 +918,7 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) {
case TSDB_DATA_TYPE_FLOAT: {
float* plist = (float*)pCol->pData;
+ // float val = 0;
for (int32_t i = start; i < numOfRows + pInput->startRowIndex; ++i) {
if (pCol->hasNull && colDataIsNull_f(pCol->nullbitmap, i)) {
continue;
@@ -915,6 +928,7 @@ int32_t avgFunction(SqlFunctionCtx* pCtx) {
pAvgRes->count += 1;
pAvgRes->sum.dsum += plist[i];
}
+ // pAvgRes->sum.dsum = val;
break;
}
@@ -1069,7 +1083,10 @@ int32_t avgFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
SAvgRes* pAvgRes = GET_ROWCELL_INTERBUF(GET_RES_INFO(pCtx));
int32_t type = pAvgRes->type;
- if (IS_SIGNED_NUMERIC_TYPE(type)) {
+ if (pAvgRes->count == 0) {
+ // [ASAN] runtime error: division by zero
+ GET_RES_INFO(pCtx)->numOfRes = 0;
+ } else if (IS_SIGNED_NUMERIC_TYPE(type)) {
pAvgRes->result = pAvgRes->sum.isum / ((double)pAvgRes->count);
} else if (IS_UNSIGNED_NUMERIC_TYPE(type)) {
pAvgRes->result = pAvgRes->sum.usum / ((double)pAvgRes->count);
@@ -1180,7 +1197,11 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
}
if (!pBuf->assign) {
- pBuf->v = *(int64_t*)tval;
+ if (type == TSDB_DATA_TYPE_FLOAT) {
+ *(float*)&pBuf->v = GET_DOUBLE_VAL(tval);
+ } else {
+ pBuf->v = *(int64_t*)tval;
+ }
if (pCtx->subsidiaries.num > 0) {
index = findRowIndex(pInput->startRowIndex, pInput->numOfRows, pCol, tval);
if (index >= 0) {
@@ -1273,14 +1294,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1304,14 +1331,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1335,14 +1368,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1366,14 +1405,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1399,14 +1444,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1430,14 +1481,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1461,14 +1518,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1492,14 +1555,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1524,14 +1593,20 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
pBuf->assign = true;
} else {
// ignore the equivalent data value
- if ((*val) == pData[i]) {
- continue;
- }
-
- if ((*val < pData[i]) ^ isMinFunc) {
- *val = pData[i];
- if (pCtx->subsidiaries.num > 0) {
- updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
}
}
}
@@ -1554,7 +1629,7 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
}
pBuf->assign = true;
} else {
- // ignore the equivalent data value
+#if 0
if ((*val) == pData[i]) {
continue;
}
@@ -1565,6 +1640,23 @@ int32_t doMinMaxHelper(SqlFunctionCtx* pCtx, int32_t isMinFunc) {
updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
}
}
+#endif
+ // NOTE: An faster version to avoid one additional comparison with FPU.
+ if (isMinFunc) { // min
+ if (*val > pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ } else { // max
+ if (*val < pData[i]) {
+ *val = pData[i];
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, i, pCtx->pSrcBlock, &pBuf->tuplePos);
+ }
+ }
+ }
}
numOfElems += 1;
@@ -2050,6 +2142,11 @@ int32_t stddevFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t type = pStddevRes->type;
double avg;
+ if (pStddevRes->count == 0) {
+ GET_RES_INFO(pCtx)->numOfRes = 0;
+ return functionFinalize(pCtx, pBlock);
+ }
+
if (IS_SIGNED_NUMERIC_TYPE(type)) {
avg = pStddevRes->isum / ((double)pStddevRes->count);
pStddevRes->result = sqrt(fabs(pStddevRes->quadraticISum / ((double)pStddevRes->count) - avg * avg));
@@ -2123,8 +2220,8 @@ bool leastSQRFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInf
SLeastSQRInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
- pInfo->startVal = IS_FLOAT_TYPE(pCtx->param[1].param.nType) ? pCtx->param[1].param.d : (double)pCtx->param[1].param.i;
- pInfo->stepVal = IS_FLOAT_TYPE(pCtx->param[2].param.nType) ? pCtx->param[2].param.d : (double)pCtx->param[2].param.i;
+ GET_TYPED_DATA(pInfo->startVal, double, pCtx->param[1].param.nType, &pCtx->param[1].param.i);
+ GET_TYPED_DATA(pInfo->stepVal, double, pCtx->param[2].param.nType, &pCtx->param[2].param.i);
return true;
}
@@ -2468,8 +2565,8 @@ int32_t percentileFunction(SqlFunctionCtx* pCtx) {
int32_t percentileFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
SVariant* pVal = &pCtx->param[1].param;
- double v =
- (IS_SIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->i : (IS_UNSIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->u : pVal->d));
+ double v = 0;
+ GET_TYPED_DATA(v, double, pVal->nType, &pVal->i);
SResultRowEntryInfo* pResInfo = GET_RES_INFO(pCtx);
SPercentileInfo* ppInfo = (SPercentileInfo*)GET_ROWCELL_INTERBUF(pResInfo);
@@ -2528,8 +2625,8 @@ bool apercentileFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResult
SAPercentileInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
SVariant* pVal = &pCtx->param[1].param;
- pInfo->percent =
- (IS_SIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->i : (IS_UNSIGNED_NUMERIC_TYPE(pVal->nType) ? pVal->u : pVal->d));
+ pInfo->percent = 0;
+ GET_TYPED_DATA(pInfo->percent, double, pVal->nType, &pVal->i);
if (pCtx->numOfParams == 2) {
pInfo->algo = APERCT_ALGO_DEFAULT;
@@ -2830,6 +2927,8 @@ static void firstlastSaveTupleData(const SSDataBlock* pSrcBlock, int32_t rowInde
if (!pInfo->hasResult) {
pInfo->pos = saveTupleData(pCtx, rowIndex, pSrcBlock, NULL);
+ ASSERT(pCtx->subsidiaries.buf != NULL);
+ ASSERT(pCtx->subsidiaries.rowLen > 0);
} else {
updateTupleData(pCtx, rowIndex, pSrcBlock, &pInfo->pos);
}
@@ -2929,6 +3028,7 @@ int32_t firstFunction(SqlFunctionCtx* pCtx) {
}
}
#else
+ int64_t* pts = (int64_t*)pInput->pPTS->pData;
for (int32_t i = pInput->startRowIndex; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, pColAgg)) {
continue;
@@ -2937,13 +3037,14 @@ int32_t firstFunction(SqlFunctionCtx* pCtx) {
numOfElems++;
char* data = colDataGetData(pInputCol, i);
- TSKEY cts = getRowPTs(pInput->pPTS, i);
+ TSKEY cts = pts[i];
if (pResInfo->numOfRes == 0 || pInfo->ts > cts) {
doSaveCurrentVal(pCtx, i, cts, pInputCol->info.type, data);
pResInfo->numOfRes = 1;
}
}
#endif
+
if (numOfElems == 0) {
// save selectivity value for column consisted of all null values
firstlastSaveTupleData(pCtx->pSrcBlock, pInput->startRowIndex, pCtx, pInfo);
@@ -3015,26 +3116,87 @@ int32_t lastFunction(SqlFunctionCtx* pCtx) {
}
}
#else
- for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
- if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, pColAgg)) {
- continue;
+ int64_t* pts = (int64_t*)pInput->pPTS->pData;
+
+#if 0
+ for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
+ if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, pColAgg)) {
+ continue;
+ }
+
+ numOfElems++;
+ if (pResInfo->numOfRes == 0 || pInfo->ts < pts[i]) {
+ char* data = colDataGetData(pInputCol, i);
+ doSaveCurrentVal(pCtx, i, pts[i], type, data);
+ pResInfo->numOfRes = 1;
+ }
}
+#else
+ if (!pInputCol->hasNull) {
+ numOfElems = 1;
- numOfElems++;
+ int32_t round = pInput->numOfRows >> 2;
+ int32_t reminder = pInput->numOfRows & 0x03;
- char* data = colDataGetData(pInputCol, i);
- TSKEY cts = getRowPTs(pInput->pPTS, i);
- if (pResInfo->numOfRes == 0 || pInfo->ts < cts) {
- doSaveCurrentVal(pCtx, i, cts, type, data);
- pResInfo->numOfRes = 1;
+ int32_t tick = 0;
+ for (int32_t i = pInput->startRowIndex; tick < round; i += 4, tick += 1) {
+ int64_t cts = pts[i];
+ int32_t chosen = i;
+
+ if (cts < pts[i + 1]) {
+ cts = pts[i + 1];
+ chosen = i + 1;
+ }
+
+ if (cts < pts[i + 2]) {
+ cts = pts[i + 2];
+ chosen = i + 2;
+ }
+
+ if (cts < pts[i + 3]) {
+ cts = pts[i + 3];
+ chosen = i + 3;
+ }
+
+ if (pResInfo->numOfRes == 0 || pInfo->ts < cts) {
+ char* data = colDataGetData(pInputCol, chosen);
+ doSaveCurrentVal(pCtx, i, cts, type, data);
+ pResInfo->numOfRes = 1;
+ }
+ }
+
+ for (int32_t i = pInput->startRowIndex + round * 4; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
+ if (pResInfo->numOfRes == 0 || pInfo->ts < pts[i]) {
+ char* data = colDataGetData(pInputCol, i);
+ doSaveCurrentVal(pCtx, i, pts[i], type, data);
+ pResInfo->numOfRes = 1;
+ }
+ }
+ } else {
+ for (int32_t i = pInput->startRowIndex; i < pInput->startRowIndex + pInput->numOfRows; ++i) {
+ if (pInputCol->hasNull && colDataIsNull(pInputCol, pInput->totalRows, i, pColAgg)) {
+ continue;
+ }
+
+ numOfElems++;
+
+ if (pResInfo->numOfRes == 0 || pInfo->ts < pts[i]) {
+ char* data = colDataGetData(pInputCol, i);
+ doSaveCurrentVal(pCtx, i, pts[i], type, data);
+ pResInfo->numOfRes = 1;
+ }
}
}
#endif
+
+#endif
+
+ // save selectivity value for column consisted of all null values
if (numOfElems == 0) {
- // save selectivity value for column consisted of all null values
firstlastSaveTupleData(pCtx->pSrcBlock, pInput->startRowIndex, pCtx, pInfo);
}
- SET_VAL(pResInfo, numOfElems, 1);
+
+ // SET_VAL(pResInfo, numOfElems, 1);
return TSDB_CODE_SUCCESS;
}
@@ -3184,8 +3346,8 @@ int32_t lastRowFunction(SqlFunctionCtx* pCtx) {
#if 0
int32_t blockDataOrder = (startKey <= endKey) ? TSDB_ORDER_ASC : TSDB_ORDER_DESC;
- // the optimized version only function if all tuples in one block are monotonious increasing or descreasing.
- // this is NOT always works if project operator exists in downstream.
+ // the optimized version only valid if all tuples in one block are monotonious increasing or descreasing.
+ // this assumption is NOT always works if project operator exists in downstream.
if (blockDataOrder == TSDB_ORDER_ASC) {
for (int32_t i = pInput->numOfRows + pInput->startRowIndex - 1; i >= pInput->startRowIndex; --i) {
char* data = colDataGetData(pInputCol, i);
@@ -3211,11 +3373,13 @@ int32_t lastRowFunction(SqlFunctionCtx* pCtx) {
}
}
#else
+
+ int64_t* pts = (int64_t*)pInput->pPTS->pData;
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; ++i) {
char* data = colDataGetData(pInputCol, i);
- TSKEY cts = getRowPTs(pInput->pPTS, i);
- numOfElems++;
+ TSKEY cts = pts[i];
+ numOfElems++;
if (pResInfo->numOfRes == 0 || pInfo->ts < cts) {
doSaveLastrow(pCtx, data, i, cts, pInfo);
pResInfo->numOfRes = 1;
@@ -3241,6 +3405,7 @@ bool diffFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
SDiffInfo* pDiffInfo = GET_ROWCELL_INTERBUF(pResInfo);
pDiffInfo->hasPrev = false;
pDiffInfo->prev.i64 = 0;
+ pDiffInfo->prevTs = -1;
if (pCtx->numOfParams > 1) {
pDiffInfo->ignoreNegative = pCtx->param[1].param.i; // TODO set correct param
} else {
@@ -3251,7 +3416,7 @@ bool diffFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
return true;
}
-static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv) {
+static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv, int64_t ts) {
switch (type) {
case TSDB_DATA_TYPE_BOOL:
pDiffInfo->prev.i64 = *(bool*)pv ? 1 : 0;
@@ -3278,11 +3443,13 @@ static void doSetPrevVal(SDiffInfo* pDiffInfo, int32_t type, const char* pv) {
default:
ASSERT(0);
}
+ pDiffInfo->prevTs = ts;
}
static void doHandleDiff(SDiffInfo* pDiffInfo, int32_t type, const char* pv, SColumnInfoData* pOutput, int32_t pos,
- int32_t order) {
+ int32_t order, int64_t ts) {
int32_t factor = (order == TSDB_ORDER_ASC) ? 1 : -1;
+ pDiffInfo->prevTs = ts;
switch (type) {
case TSDB_DATA_TYPE_INT: {
int32_t v = *(int32_t*)pv;
@@ -3366,6 +3533,8 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
SColumnInfoData* pInputCol = pInput->pData[0];
+ TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
+
int32_t numOfElems = 0;
int32_t startOffset = pCtx->offset;
@@ -3387,7 +3556,10 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
char* pv = colDataGetData(pInputCol, i);
if (pDiffInfo->hasPrev) {
- doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order);
+ if (tsList[i] == pDiffInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ }
+ doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order, tsList[i]);
// handle selectivity
if (pCtx->subsidiaries.num > 0) {
appendSelectivityValue(pCtx, i, pos);
@@ -3395,7 +3567,7 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
numOfElems++;
} else {
- doSetPrevVal(pDiffInfo, pInputCol->info.type, pv);
+ doSetPrevVal(pDiffInfo, pInputCol->info.type, pv, tsList[i]);
}
pDiffInfo->hasPrev = true;
@@ -3417,7 +3589,10 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
// there is a row of previous data block to be handled in the first place.
if (pDiffInfo->hasPrev) {
- doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order);
+ if (tsList[i] == pDiffInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ }
+ doHandleDiff(pDiffInfo, pInputCol->info.type, pv, pOutput, pos, pCtx->order, tsList[i]);
// handle selectivity
if (pCtx->subsidiaries.num > 0) {
appendSelectivityValue(pCtx, i, pos);
@@ -3425,15 +3600,15 @@ int32_t diffFunction(SqlFunctionCtx* pCtx) {
numOfElems++;
} else {
- doSetPrevVal(pDiffInfo, pInputCol->info.type, pv);
+ doSetPrevVal(pDiffInfo, pInputCol->info.type, pv, tsList[i]);
}
pDiffInfo->hasPrev = true;
}
}
- // initial value is not set yet
- return numOfElems;
+ pResInfo->numOfRes = numOfElems;
+ return TSDB_CODE_SUCCESS;
}
int32_t getTopBotInfoSize(int64_t numOfItems) { return sizeof(STopBotRes) + numOfItems * sizeof(STopBotResItem); }
@@ -3547,6 +3722,12 @@ static int32_t topBotResComparFn(const void* p1, const void* p2, const void* par
}
return (val1->v.u > val2->v.u) ? 1 : -1;
+ } else if (TSDB_DATA_TYPE_FLOAT == type) {
+ if (val1->v.f == val2->v.f) {
+ return 0;
+ }
+
+ return (val1->v.f > val2->v.f) ? 1 : -1;
}
if (val1->v.d == val2->v.d) {
@@ -3587,10 +3768,12 @@ void doAddIntoResult(SqlFunctionCtx* pCtx, void* pData, int32_t rowIndex, SSData
} else { // replace the minimum value in the result
if ((isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && val.i > pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u > pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && val.d > pItems[0].v.d))) ||
+ (TSDB_DATA_TYPE_FLOAT == type && val.f > pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && val.d > pItems[0].v.d))) ||
(!isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && val.i < pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && val.u < pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && val.d < pItems[0].v.d)))) {
+ (TSDB_DATA_TYPE_FLOAT == type && val.f < pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && val.d < pItems[0].v.d)))) {
// replace the old data and the coresponding tuple data
STopBotResItem* pItem = &pItems[0];
pItem->v = val;
@@ -3753,12 +3936,7 @@ int32_t topBotFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
}
for (int32_t i = 0; i < pEntryInfo->numOfRes; ++i) {
STopBotResItem* pItem = &pRes->pItems[i];
- if (type == TSDB_DATA_TYPE_FLOAT) {
- float v = pItem->v.d;
- colDataAppend(pCol, currentRow, (const char*)&v, false);
- } else {
- colDataAppend(pCol, currentRow, (const char*)&pItem->v.i, false);
- }
+ colDataAppend(pCol, currentRow, (const char*)&pItem->v.i, false);
#ifdef BUF_PAGE_DEBUG
qDebug("page_finalize i:%d,item:%p,pageId:%d, offset:%d\n", i, pItem, pItem->tuplePos.pageId,
pItem->tuplePos.offset);
@@ -3789,10 +3967,12 @@ void addResult(SqlFunctionCtx* pCtx, STopBotResItem* pSourceItem, int16_t type,
} else { // replace the minimum value in the result
if ((isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && pSourceItem->v.i > pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && pSourceItem->v.u > pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && pSourceItem->v.d > pItems[0].v.d))) ||
+ (TSDB_DATA_TYPE_FLOAT == type && pSourceItem->v.f > pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && pSourceItem->v.d > pItems[0].v.d))) ||
(!isTopQuery && ((IS_SIGNED_NUMERIC_TYPE(type) && pSourceItem->v.i < pItems[0].v.i) ||
(IS_UNSIGNED_NUMERIC_TYPE(type) && pSourceItem->v.u < pItems[0].v.u) ||
- (IS_FLOAT_TYPE(type) && pSourceItem->v.d < pItems[0].v.d)))) {
+ (TSDB_DATA_TYPE_FLOAT == type && pSourceItem->v.f < pItems[0].v.f) ||
+ (TSDB_DATA_TYPE_DOUBLE == type && pSourceItem->v.d < pItems[0].v.d)))) {
// replace the old data and the coresponding tuple data
STopBotResItem* pItem = &pItems[0];
pItem->v = pSourceItem->v;
@@ -4196,6 +4376,7 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
int32_t numOfParams = cJSON_GetArraySize(binDesc);
int32_t startIndex;
if (numOfParams != 4) {
+ cJSON_Delete(binDesc);
return false;
}
@@ -4206,15 +4387,18 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
cJSON* infinity = cJSON_GetObjectItem(binDesc, "infinity");
if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
+ cJSON_Delete(binDesc);
return false;
}
if (count->valueint <= 0 || count->valueint > 1000) { // limit count to 1000
+ cJSON_Delete(binDesc);
return false;
}
if (isinf(start->valuedouble) || (width != NULL && isinf(width->valuedouble)) ||
(factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
+ cJSON_Delete(binDesc);
return false;
}
@@ -4232,12 +4416,14 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
// linear bin process
if (width->valuedouble == 0) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
for (int i = 0; i < counter + 1; ++i) {
intervals[startIndex] = start->valuedouble + i * width->valuedouble;
if (isinf(intervals[startIndex])) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
startIndex++;
@@ -4246,22 +4432,26 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
// log bin process
if (start->valuedouble == 0) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
if (factor->valuedouble < 0 || factor->valuedouble == 0 || factor->valuedouble == 1) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
for (int i = 0; i < counter + 1; ++i) {
intervals[startIndex] = start->valuedouble * pow(factor->valuedouble, i * 1.0);
if (isinf(intervals[startIndex])) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
startIndex++;
}
} else {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
@@ -4276,6 +4466,7 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
}
} else if (cJSON_IsArray(binDesc)) { /* user input bins */
if (binType != USER_INPUT_BIN) {
+ cJSON_Delete(binDesc);
return false;
}
numOfBins = cJSON_GetArraySize(binDesc);
@@ -4283,6 +4474,7 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
cJSON* bin = binDesc->child;
if (bin == NULL) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
int i = 0;
@@ -4290,16 +4482,19 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
intervals[i] = bin->valuedouble;
if (!cJSON_IsNumber(bin)) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
if (i != 0 && intervals[i] <= intervals[i - 1]) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
bin = bin->next;
i++;
}
} else {
+ cJSON_Delete(binDesc);
return false;
}
@@ -4312,6 +4507,8 @@ static bool getHistogramBinDesc(SHistoFuncInfo* pInfo, char* binDescStr, int8_t
}
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
+
return true;
}
@@ -4325,18 +4522,23 @@ bool histogramFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultIn
pInfo->totalCount = 0;
pInfo->normalized = 0;
- int8_t binType = getHistogramBinType(varDataVal(pCtx->param[1].param.pz));
+ char *binTypeStr = strndup(varDataVal(pCtx->param[1].param.pz), varDataLen(pCtx->param[1].param.pz));
+ int8_t binType = getHistogramBinType(binTypeStr);
+ taosMemoryFree(binTypeStr);
+
if (binType == UNKNOWN_BIN) {
return false;
}
- char* binDesc = varDataVal(pCtx->param[2].param.pz);
+ char* binDesc = strndup(varDataVal(pCtx->param[2].param.pz), varDataLen(pCtx->param[2].param.pz));
int64_t normalized = pCtx->param[3].param.i;
if (normalized != 0 && normalized != 1) {
return false;
}
if (!getHistogramBinDesc(pInfo, binDesc, binType, (bool)normalized)) {
+ taosMemoryFree(binDesc);
return false;
}
+ taosMemoryFree(binDesc);
return true;
}
@@ -4784,6 +4986,7 @@ int32_t stateCountFunction(SqlFunctionCtx* pCtx) {
SStateInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
SInputColumnInfoData* pInput = &pCtx->input;
+ TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
SColumnInfoData* pInputCol = pInput->pData[0];
@@ -4796,7 +4999,15 @@ int32_t stateCountFunction(SqlFunctionCtx* pCtx) {
}
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
+ if (pInfo->isPrevTsSet == true && tsList[i] == pInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ } else {
+ pInfo->prevTs = tsList[i];
+ }
+
+ pInfo->isPrevTsSet = true;
numOfElems++;
+
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
colDataAppendNULL(pOutput, i);
// handle selectivity
@@ -4822,7 +5033,8 @@ int32_t stateCountFunction(SqlFunctionCtx* pCtx) {
}
}
- return numOfElems;
+ pResInfo->numOfRes = numOfElems;
+ return TSDB_CODE_SUCCESS;
}
int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
@@ -4845,11 +5057,19 @@ int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
int8_t op = getStateOpType(varDataVal(pCtx->param[1].param.pz));
if (STATE_OPER_INVALID == op) {
- return 0;
+ return TSDB_CODE_INVALID_PARA;
}
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
+ if (pInfo->isPrevTsSet == true && tsList[i] == pInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ } else {
+ pInfo->prevTs = tsList[i];
+ }
+
+ pInfo->isPrevTsSet = true;
numOfElems++;
+
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
colDataAppendNULL(pOutput, i);
// handle selectivity
@@ -4879,7 +5099,8 @@ int32_t stateDurationFunction(SqlFunctionCtx* pCtx) {
}
}
- return numOfElems;
+ pResInfo->numOfRes = numOfElems;
+ return TSDB_CODE_SUCCESS;
}
bool getCsumFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
@@ -4892,6 +5113,7 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) {
SSumRes* pSumRes = GET_ROWCELL_INTERBUF(pResInfo);
SInputColumnInfoData* pInput = &pCtx->input;
+ TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
SColumnInfoData* pInputCol = pInput->pData[0];
SColumnInfoData* pOutput = (SColumnInfoData*)pCtx->pOutput;
@@ -4900,6 +5122,13 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) {
int32_t type = pInputCol->info.type;
int32_t startOffset = pCtx->offset;
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
+ if (pSumRes->isPrevTsSet == true && tsList[i] == pSumRes->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ } else {
+ pSumRes->prevTs = tsList[i];
+ }
+ pSumRes->isPrevTsSet = true;
+
int32_t pos = startOffset + numOfElems;
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
// colDataAppendNULL(pOutput, i);
@@ -4937,7 +5166,8 @@ int32_t csumFunction(SqlFunctionCtx* pCtx) {
numOfElems++;
}
- return numOfElems;
+ pResInfo->numOfRes = numOfElems;
+ return TSDB_CODE_SUCCESS;
}
bool getMavgFuncEnv(SFunctionNode* UNUSED_PARAM(pFunc), SFuncExecEnv* pEnv) {
@@ -4953,6 +5183,8 @@ bool mavgFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
SMavgInfo* pInfo = GET_ROWCELL_INTERBUF(pResultInfo);
pInfo->pos = 0;
pInfo->sum = 0;
+ pInfo->prevTs = -1;
+ pInfo->isPrevTsSet = false;
pInfo->numOfPoints = pCtx->param[1].param.i;
if (pInfo->numOfPoints < 1 || pInfo->numOfPoints > MAVG_MAX_POINTS_NUM) {
return false;
@@ -4967,6 +5199,7 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) {
SMavgInfo* pInfo = GET_ROWCELL_INTERBUF(pResInfo);
SInputColumnInfoData* pInput = &pCtx->input;
+ TSKEY* tsList = (int64_t*)pInput->pPTS->pData;
SColumnInfoData* pInputCol = pInput->pData[0];
SColumnInfoData* pTsOutput = pCtx->pTsOutput;
@@ -4976,6 +5209,13 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) {
int32_t type = pInputCol->info.type;
int32_t startOffset = pCtx->offset;
for (int32_t i = pInput->startRowIndex; i < pInput->numOfRows + pInput->startRowIndex; i += 1) {
+ if (pInfo->isPrevTsSet == true && tsList[i] == pInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ } else {
+ pInfo->prevTs = tsList[i];
+ }
+ pInfo->isPrevTsSet = true;
+
int32_t pos = startOffset + numOfElems;
if (colDataIsNull_f(pInputCol->nullbitmap, i)) {
// colDataAppendNULL(pOutput, i);
@@ -5020,7 +5260,8 @@ int32_t mavgFunction(SqlFunctionCtx* pCtx) {
}
}
- return numOfElems;
+ pResInfo->numOfRes = numOfElems;
+ return TSDB_CODE_SUCCESS;
}
static SSampleInfo* getSampleOutputInfo(SqlFunctionCtx* pCtx) {
@@ -5133,7 +5374,6 @@ int32_t sampleFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
return pInfo->numSampled;
}
-
bool getTailFuncEnv(SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
#if 0
SColumnNode* pCol = (SColumnNode*)nodesListGetNode(pFunc->pParameterList, 0);
@@ -5391,10 +5631,13 @@ bool modeFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResInfo) {
} else {
pInfo->pHash = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
}
+ pInfo->nullTupleSaved = false;
+ pInfo->nullTuplePos.pageId = -1;
+
return true;
}
-static void doModeAdd(SModeInfo* pInfo, char* data) {
+static void doModeAdd(SModeInfo* pInfo, int32_t rowIndex, SqlFunctionCtx* pCtx, char* data) {
int32_t hashKeyBytes = IS_STR_DATA_TYPE(pInfo->colType) ? varDataTLen(data) : pInfo->colBytes;
SModeItem** pHashItem = taosHashGet(pInfo->pHash, data, hashKeyBytes);
if (pHashItem == NULL) {
@@ -5403,10 +5646,17 @@ static void doModeAdd(SModeInfo* pInfo, char* data) {
memcpy(pItem->data, data, hashKeyBytes);
pItem->count += 1;
+ if (pCtx->subsidiaries.num > 0) {
+ pItem->tuplePos = saveTupleData(pCtx, rowIndex, pCtx->pSrcBlock, NULL);
+ }
+
taosHashPut(pInfo->pHash, data, hashKeyBytes, &pItem, sizeof(SModeItem*));
pInfo->numOfPoints++;
} else {
(*pHashItem)->count += 1;
+ if (pCtx->subsidiaries.num > 0) {
+ updateTupleData(pCtx, rowIndex, pCtx->pSrcBlock, &((*pHashItem)->tuplePos));
+ }
}
}
@@ -5428,7 +5678,7 @@ int32_t modeFunction(SqlFunctionCtx* pCtx) {
}
numOfElems++;
- doModeAdd(pInfo, data);
+ doModeAdd(pInfo, i, pCtx, data);
if (sizeof(SModeInfo) + pInfo->numOfPoints * (sizeof(SModeItem) + pInfo->colBytes) >= MODE_MAX_RESULT_SIZE) {
taosHashCleanup(pInfo->pHash);
@@ -5436,6 +5686,11 @@ int32_t modeFunction(SqlFunctionCtx* pCtx) {
}
}
+ if (numOfElems == 0 && pCtx->subsidiaries.num > 0 && !pInfo->nullTupleSaved) {
+ pInfo->nullTuplePos = saveTupleData(pCtx, pInput->startRowIndex, pCtx->pSrcBlock, NULL);
+ pInfo->nullTupleSaved = true;
+ }
+
SET_VAL(pResInfo, numOfElems, 1);
return TSDB_CODE_SUCCESS;
@@ -5461,8 +5716,10 @@ int32_t modeFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
if (maxCount != 0) {
SModeItem* pResItem = (SModeItem*)(pInfo->pItems + resIndex * (sizeof(SModeItem) + pInfo->colBytes));
colDataAppend(pCol, currentRow, pResItem->data, false);
+ setSelectivityValue(pCtx, pBlock, &pResItem->tuplePos, currentRow);
} else {
colDataAppendNULL(pCol, currentRow);
+ setSelectivityValue(pCtx, pBlock, &pInfo->nullTuplePos, currentRow);
}
taosHashCleanup(pInfo->pHash);
@@ -5488,6 +5745,10 @@ bool twaFunctionSetup(SqlFunctionCtx* pCtx, SResultRowEntryInfo* pResultInfo) {
}
static double twa_get_area(SPoint1 s, SPoint1 e) {
+ if (e.key == INT64_MAX || s.key == INT64_MIN) {
+ return 0;
+ }
+
if ((s.val >= 0 && e.val >= 0) || (s.val <= 0 && e.val <= 0)) {
return (s.val + e.val) * (e.key - s.key) / 2;
}
@@ -5782,6 +6043,8 @@ int32_t twaFinalize(struct SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
} else {
if (pInfo->win.ekey == pInfo->win.skey) {
pInfo->dOutput = pInfo->p.val;
+ } else if (pInfo->win.ekey == INT64_MAX || pInfo->win.skey == INT64_MIN) { // no data in timewindow
+ pInfo->dOutput = 0;
} else {
pInfo->dOutput = pInfo->dOutput / (pInfo->win.ekey - pInfo->win.skey);
}
@@ -5913,11 +6176,19 @@ int32_t blockDistFinalize(SqlFunctionCtx* pCtx, SSDataBlock* pBlock) {
int32_t row = 0;
char st[256] = {0};
- double totalRawSize = pData->totalRows * pData->rowSize;
+ double averageSize = 0;
+ if (pData->numOfBlocks != 0) {
+ averageSize = ((double)pData->totalSize) / pData->numOfBlocks;
+ }
+ uint64_t totalRawSize = pData->totalRows * pData->rowSize;
+ double compRatio = 0;
+ if (totalRawSize != 0) {
+ compRatio = pData->totalSize * 100 / (double)totalRawSize;
+ }
+
int32_t len = sprintf(st + VARSTR_HEADER_SIZE,
"Total_Blocks=[%d] Total_Size=[%.2f Kb] Average_size=[%.2f Kb] Compression_Ratio=[%.2f %c]",
- pData->numOfBlocks, pData->totalSize / 1024.0, ((double)pData->totalSize) / pData->numOfBlocks,
- pData->totalSize * 100 / totalRawSize, '%');
+ pData->numOfBlocks, pData->totalSize / 1024.0, averageSize, compRatio, '%');
varDataSetLen(st, len);
colDataAppend(pColInfo, row++, st, false);
@@ -6036,6 +6307,9 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) {
if (!pDerivInfo->valueSet) { // initial value is not set yet
pDerivInfo->valueSet = true;
} else {
+ if (tsList[i] == pDerivInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ }
double r = ((v - pDerivInfo->prevValue) * pDerivInfo->tsWindow) / (tsList[i] - pDerivInfo->prevTs);
if (pDerivInfo->ignoreNegative && r < 0) {
} else {
@@ -6074,6 +6348,9 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) {
if (!pDerivInfo->valueSet) { // initial value is not set yet
pDerivInfo->valueSet = true;
} else {
+ if (tsList[i] == pDerivInfo->prevTs) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
+ }
double r = ((pDerivInfo->prevValue - v) * pDerivInfo->tsWindow) / (pDerivInfo->prevTs - tsList[i]);
if (pDerivInfo->ignoreNegative && r < 0) {
} else {
@@ -6101,7 +6378,9 @@ int32_t derivativeFunction(SqlFunctionCtx* pCtx) {
}
}
- return numOfElems;
+ pResInfo->numOfRes = numOfElems;
+
+ return TSDB_CODE_SUCCESS;
}
bool getIrateFuncEnv(struct SFunctionNode* pFunc, SFuncExecEnv* pEnv) {
@@ -6166,11 +6445,15 @@ int32_t irateFunction(SqlFunctionCtx* pCtx) {
pRateInfo->lastKey = tsList[i];
continue;
+ } else if (tsList[i] == pRateInfo->lastKey) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
}
if ((INT64_MIN == pRateInfo->firstKey) || tsList[i] > pRateInfo->firstKey) {
pRateInfo->firstValue = v;
pRateInfo->firstKey = tsList[i];
+ } else if (tsList[i] == pRateInfo->firstKey) {
+ return TSDB_CODE_FUNC_DUP_TIMESTAMP;
}
}
diff --git a/source/libs/function/src/tudf.c b/source/libs/function/src/tudf.c
index 1dedfe836455e0b0cddd21ad639d96cfef762696..8715aa0be18a547e22e865b8325ee23901bccabd 100644
--- a/source/libs/function/src/tudf.c
+++ b/source/libs/function/src/tudf.c
@@ -131,7 +131,8 @@ static int32_t udfSpawnUdfd(SUdfdData *pData) {
char udfdPathLdLib[1024] = {0};
size_t udfdLdLibPathLen = strlen(tsUdfdLdLibPath);
- strncpy(udfdPathLdLib, tsUdfdLdLibPath, udfdLdLibPathLen);
+ strncpy(udfdPathLdLib, tsUdfdLdLibPath, tListLen(udfdPathLdLib));
+
udfdPathLdLib[udfdLdLibPathLen] = ':';
strncpy(udfdPathLdLib + udfdLdLibPathLen + 1, pathTaosdLdLib, sizeof(udfdPathLdLib) - udfdLdLibPathLen - 1);
if (udfdLdLibPathLen + taosdLdLibPathLen < 1024) {
diff --git a/source/libs/function/src/udfd.c b/source/libs/function/src/udfd.c
index 088aa62248768ce20f51e185f77ee03e73d8bbf0..f5682b69bff956985caf1231784cb6e440659f79 100644
--- a/source/libs/function/src/udfd.c
+++ b/source/libs/function/src/udfd.c
@@ -864,6 +864,7 @@ void udfdCtrlAllocBufCb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *bu
void udfdCtrlReadCb(uv_stream_t *q, ssize_t nread, const uv_buf_t *buf) {
if (nread < 0) {
fnError("udfd ctrl pipe read error. %s", uv_err_name(nread));
+ taosMemoryFree(buf->base);
uv_close((uv_handle_t *)q, NULL);
uv_stop(global.loop);
return;
diff --git a/source/libs/nodes/src/nodesUtilFuncs.c b/source/libs/nodes/src/nodesUtilFuncs.c
index 17d1b5bf480ac64e1063cd75d929a4994516ced9..8c1a85b101da641ba33e7f64e834617bd9e30f7f 100644
--- a/source/libs/nodes/src/nodesUtilFuncs.c
+++ b/source/libs/nodes/src/nodesUtilFuncs.c
@@ -424,8 +424,9 @@ SNode* nodesMakeNode(ENodeType type) {
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
case QUERY_NODE_SHOW_TAGS_STMT:
- case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
return makeNode(type, sizeof(SShowStmt));
+ case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
+ return makeNode(type, sizeof(SShowTableTagsStmt));
case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
return makeNode(type, sizeof(SShowDnodeVariablesStmt));
case QUERY_NODE_SHOW_CREATE_DATABASE_STMT:
@@ -621,7 +622,7 @@ void nodesDestroyNode(SNode* pNode) {
}
switch (nodeType(pNode)) {
- case QUERY_NODE_COLUMN: // pProjectRef is weak reference, no need to release
+ case QUERY_NODE_COLUMN:
destroyExprNode((SExprNode*)pNode);
break;
case QUERY_NODE_VALUE: {
@@ -792,9 +793,24 @@ void nodesDestroyNode(SNode* pNode) {
nodesDestroyNode((SNode*)pStmt->pSlimit);
break;
}
- case QUERY_NODE_VNODE_MODIF_STMT:
- destroyVgDataBlockArray(((SVnodeModifOpStmt*)pNode)->pDataBlocks);
+ case QUERY_NODE_VNODE_MODIF_STMT: {
+ SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pNode;
+ destroyVgDataBlockArray(pStmt->pDataBlocks);
+ taosMemoryFreeClear(pStmt->pTableMeta);
+ taosHashCleanup(pStmt->pVgroupsHashObj);
+ taosHashCleanup(pStmt->pSubTableHashObj);
+ taosHashCleanup(pStmt->pTableNameHashObj);
+ taosHashCleanup(pStmt->pDbFNameHashObj);
+ if (pStmt->freeHashFunc) {
+ pStmt->freeHashFunc(pStmt->pTableBlockHashObj);
+ }
+ if (pStmt->freeArrayFunc) {
+ pStmt->freeArrayFunc(pStmt->pVgDataBlocks);
+ }
+ tdDestroySVCreateTbReq(&pStmt->createTblReq);
+ taosCloseFile(&pStmt->fp);
break;
+ }
case QUERY_NODE_CREATE_DATABASE_STMT:
nodesDestroyNode((SNode*)((SCreateDatabaseStmt*)pNode)->pOptions);
break;
@@ -927,13 +943,19 @@ void nodesDestroyNode(SNode* pNode) {
case QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT:
case QUERY_NODE_SHOW_TRANSACTIONS_STMT:
case QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT:
- case QUERY_NODE_SHOW_TAGS_STMT:
- case QUERY_NODE_SHOW_TABLE_TAGS_STMT: {
+ case QUERY_NODE_SHOW_TAGS_STMT: {
SShowStmt* pStmt = (SShowStmt*)pNode;
nodesDestroyNode(pStmt->pDbName);
nodesDestroyNode(pStmt->pTbName);
break;
}
+ case QUERY_NODE_SHOW_TABLE_TAGS_STMT: {
+ SShowTableTagsStmt* pStmt = (SShowTableTagsStmt*)pNode;
+ nodesDestroyNode(pStmt->pDbName);
+ nodesDestroyNode(pStmt->pTbName);
+ nodesDestroyList(pStmt->pTags);
+ break;
+ }
case QUERY_NODE_SHOW_DNODE_VARIABLES_STMT:
nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pDnodeId);
nodesDestroyNode(((SShowDnodeVariablesStmt*)pNode)->pLikePattern);
@@ -2014,6 +2036,8 @@ void nodesValueNodeToVariant(const SValueNode* pNode, SVariant* pVal) {
pVal->u = pNode->datum.u;
break;
case TSDB_DATA_TYPE_FLOAT:
+ pVal->f = pNode->datum.d;
+ break;
case TSDB_DATA_TYPE_DOUBLE:
pVal->d = pNode->datum.d;
break;
diff --git a/source/libs/parser/inc/parAst.h b/source/libs/parser/inc/parAst.h
index 86940a9d7a5153631ca6893ac44c25433f9aca4f..a6c56f3ae4239c936747fde5094ea57fe9dcba7f 100644
--- a/source/libs/parser/inc/parAst.h
+++ b/source/libs/parser/inc/parAst.h
@@ -178,6 +178,7 @@ SNode* createShowCreateTableStmt(SAstCreateContext* pCxt, ENodeType type, SNode*
SNode* createShowTableDistributedStmt(SAstCreateContext* pCxt, SNode* pRealTable);
SNode* createShowDnodeVariablesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pLikePattern);
SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDnodeEndpoint);
+SNode* createShowTableTagsStmt(SAstCreateContext* pCxt, SNode* pTbName, SNode* pDbName, SNodeList* pTags);
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo);
SNode* createAlterUserStmt(SAstCreateContext* pCxt, SToken* pUserName, int8_t alterType, const SToken* pVal);
SNode* createDropUserStmt(SAstCreateContext* pCxt, SToken* pUserName);
diff --git a/source/libs/parser/inc/parInsertUtil.h b/source/libs/parser/inc/parInsertUtil.h
index 1e941632e78f83fd81e31db812a4b94e231b7135..09d55d369fc0d711b4a4301c74a0cb0d7002c347 100644
--- a/source/libs/parser/inc/parInsertUtil.h
+++ b/source/libs/parser/inc/parInsertUtil.h
@@ -79,29 +79,6 @@ typedef struct SInsertParseBaseContext {
SMsgBuf msg;
} SInsertParseBaseContext;
-typedef struct SInsertParseContext {
- SParseContext *pComCxt; // input
- char *pSql; // input
- SMsgBuf msg; // input
- STableMeta *pTableMeta; // each table
- SParsedDataColInfo tags; // each table
- SVCreateTbReq createTblReq; // each table
- SHashObj *pVgroupsHashObj; // global
- SHashObj *pTableBlockHashObj; // global
- SHashObj *pSubTableHashObj; // global
- SArray *pVgDataBlocks; // global
- SHashObj *pTableNameHashObj; // global
- SHashObj *pDbFNameHashObj; // global
- int32_t totalNum;
- SVnodeModifOpStmt *pOutput;
- SStmtCallback *pStmtCb;
- SParseMetaCache *pMetaCache;
- char sTableName[TSDB_TABLE_NAME_LEN];
- char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW];
- int64_t memElapsed;
- int64_t parRowElapsed;
-} SInsertParseContext;
-
typedef struct SInsertParseSyntaxCxt {
SParseContext *pComCxt;
char *pSql;
@@ -142,7 +119,7 @@ typedef struct STableDataBlocks {
int32_t insGetExtendedRowSize(STableDataBlocks *pBlock);
void insGetSTSRowAppendInfo(uint8_t rowType, SParsedDataColInfo *spd, col_id_t idx, int32_t *toffset, col_id_t *colIdx);
-int32_t insSetBlockInfo(SSubmitBlk *pBlocks, STableDataBlocks *dataBuf, int32_t numOfRows);
+int32_t insSetBlockInfo(SSubmitBlk *pBlocks, STableDataBlocks *dataBuf, int32_t numOfRows, SMsgBuf *pMsg);
int32_t insSchemaIdxCompar(const void *lhs, const void *rhs);
int32_t insBoundIdxCompar(const void *lhs, const void *rhs);
void insSetBoundColumnInfo(SParsedDataColInfo *pColList, SSchema *pSchema, col_id_t numOfCols);
@@ -161,7 +138,7 @@ void insBuildCreateTbReq(SVCreateTbReq *pTbReq, const char *tname, STag *pTag
SArray *tagName, uint8_t tagNum);
int32_t insMemRowAppend(SMsgBuf *pMsgBuf, const void *value, int32_t len, void *param);
int32_t insCheckTimestamp(STableDataBlocks *pDataBlocks, const char *start);
-int32_t insBuildOutput(SInsertParseContext *pCxt);
+int32_t insBuildOutput(SHashObj *pVgroupsHashObj, SArray *pVgDataBlocks, SArray **pDataBlocks);
void insDestroyDataBlock(STableDataBlocks *pDataBlock);
#endif // TDENGINE_PAR_INSERT_UTIL_H
diff --git a/source/libs/parser/inc/parInt.h b/source/libs/parser/inc/parInt.h
index b799fa98558a12584244ab730db213c8be35eacb..66aec272d787df6fc4e04248d4833bda78b98a65 100644
--- a/source/libs/parser/inc/parInt.h
+++ b/source/libs/parser/inc/parInt.h
@@ -27,8 +27,7 @@ extern "C" {
#define QUERY_SMA_OPTIMIZE_DISABLE 0
#define QUERY_SMA_OPTIMIZE_ENABLE 1
-int32_t parseInsertSyntax(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache);
-int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache);
+int32_t parseInsertSql(SParseContext* pCxt, SQuery** pQuery, SCatalogReq* pCatalogReq, const SMetaData* pMetaData);
int32_t parse(SParseContext* pParseCxt, SQuery** pQuery);
int32_t collectMetaKey(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache);
int32_t authenticate(SParseContext* pParseCxt, SQuery* pQuery, SParseMetaCache* pMetaCache);
diff --git a/source/libs/parser/inc/parUtil.h b/source/libs/parser/inc/parUtil.h
index 75b631ec9d7330219f7ca1364385eab43e61d2a3..c53d3f932020d6de7bd4d7923370a0cc5abb31a2 100644
--- a/source/libs/parser/inc/parUtil.h
+++ b/source/libs/parser/inc/parUtil.h
@@ -60,22 +60,17 @@ typedef struct SInsertTablesMetaReq {
} SInsertTablesMetaReq;
typedef struct SParseMetaCache {
- SHashObj* pTableMeta; // key is tbFName, element is STableMeta*
- SHashObj* pDbVgroup; // key is dbFName, element is SArray*
- SHashObj* pTableVgroup; // key is tbFName, element is SVgroupInfo*
- SHashObj* pDbCfg; // key is tbFName, element is SDbCfgInfo*
- SHashObj* pDbInfo; // key is tbFName, element is SDbInfo*
- SHashObj* pUserAuth; // key is SUserAuthInfo serialized string, element is bool indicating whether or not to pass
- SHashObj* pUdf; // key is funcName, element is SFuncInfo*
- SHashObj* pTableIndex; // key is tbFName, element is SArray*
- SHashObj* pTableCfg; // key is tbFName, element is STableCfg*
- SArray* pDnodes; // element is SEpSet
- bool dnodeRequired;
- SHashObj* pInsertTables; // key is dbName, element is SInsertTablesMetaReq*, for insert
- const char* pUser;
- const SArray* pTableMetaData; // pRes = STableMeta*
- const SArray* pTableVgroupData; // pRes = SVgroupInfo*
- int32_t sqlTableNum;
+ SHashObj* pTableMeta; // key is tbFName, element is STableMeta*
+ SHashObj* pDbVgroup; // key is dbFName, element is SArray*
+ SHashObj* pTableVgroup; // key is tbFName, element is SVgroupInfo*
+ SHashObj* pDbCfg; // key is tbFName, element is SDbCfgInfo*
+ SHashObj* pDbInfo; // key is tbFName, element is SDbInfo*
+ SHashObj* pUserAuth; // key is SUserAuthInfo serialized string, element is bool indicating whether or not to pass
+ SHashObj* pUdf; // key is funcName, element is SFuncInfo*
+ SHashObj* pTableIndex; // key is tbFName, element is SArray*
+ SHashObj* pTableCfg; // key is tbFName, element is STableCfg*
+ SArray* pDnodes; // element is SEpSet
+ bool dnodeRequired;
} SParseMetaCache;
int32_t generateSyntaxErrMsg(SMsgBuf* pBuf, int32_t errCode, ...);
@@ -93,9 +88,8 @@ STableMeta* tableMetaDup(const STableMeta* pTableMeta);
int32_t trimString(const char* src, int32_t len, char* dst, int32_t dlen);
int32_t getInsTagsTableTargetName(int32_t acctId, SNode* pWhere, SName* pName);
-int32_t buildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq);
-int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache,
- bool insertValuesStmt);
+int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq);
+int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache);
int32_t reserveTableMetaInCache(int32_t acctId, const char* pDb, const char* pTable, SParseMetaCache* pMetaCache);
int32_t reserveTableMetaInCacheExt(const SName* pName, SParseMetaCache* pMetaCache);
int32_t reserveDbVgInfoInCache(int32_t acctId, const char* pDb, SParseMetaCache* pMetaCache);
@@ -114,7 +108,7 @@ int32_t getTableMetaFromCache(SParseMetaCache* pMetaCache, const SName* pName, S
int32_t getDbVgInfoFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SArray** pVgInfo);
int32_t getTableVgroupFromCache(SParseMetaCache* pMetaCache, const SName* pName, SVgroupInfo* pVgroup);
int32_t getDbVgVersionFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, int32_t* pVersion, int64_t* pDbId,
- int32_t* pTableNum);
+ int32_t* pTableNum, int64_t* pStateTs);
int32_t getDbCfgFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, SDbCfgInfo* pInfo);
int32_t getUserAuthFromCache(SParseMetaCache* pMetaCache, const char* pUser, const char* pDbFName, AUTH_TYPE type,
bool* pPass);
@@ -122,12 +116,6 @@ int32_t getUdfInfoFromCache(SParseMetaCache* pMetaCache, const char* pFunc, SFun
int32_t getTableIndexFromCache(SParseMetaCache* pMetaCache, const SName* pName, SArray** pIndexes);
int32_t getTableCfgFromCache(SParseMetaCache* pMetaCache, const SName* pName, STableCfg** pOutput);
int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes);
-int32_t reserveTableMetaInCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
- SParseMetaCache* pMetaCache);
-int32_t getTableMetaFromCacheForInsert(SArray* pTableMetaPos, SParseMetaCache* pMetaCache, int32_t tableNo,
- STableMeta** pMeta);
-int32_t getTableVgroupFromCacheForInsert(SArray* pTableVgroupPos, SParseMetaCache* pMetaCache, int32_t tableNo,
- SVgroupInfo* pVgroup);
void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request);
#ifdef __cplusplus
diff --git a/source/libs/parser/inc/sql.y b/source/libs/parser/inc/sql.y
index b143f1624edcc88a836e411d58cf487bbf739bee..ec5bb765db938e279378b032bbe45ca5f46554f9 100644
--- a/source/libs/parser/inc/sql.y
+++ b/source/libs/parser/inc/sql.y
@@ -426,7 +426,7 @@ cmd ::= SHOW TABLE DISTRIBUTED full_table_name(A).
cmd ::= SHOW CONSUMERS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
cmd ::= SHOW SUBSCRIPTIONS. { pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
cmd ::= SHOW TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, B, A, OP_TYPE_EQUAL); }
-cmd ::= SHOW TABLE TAGS FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLE_TAGS_STMT, B, A, OP_TYPE_EQUAL); }
+cmd ::= SHOW TABLE TAGS tag_list_opt(C) FROM table_name_cond(A) from_db_opt(B). { pCxt->pRootNode = createShowTableTagsStmt(pCxt, A, B, C); }
cmd ::= SHOW VNODES NK_INTEGER(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &A), NULL); }
cmd ::= SHOW VNODES NK_STRING(A). { pCxt->pRootNode = createShowVnodesStmt(pCxt, NULL, createValueNode(pCxt, TSDB_DATA_TYPE_VARCHAR, &A)); }
@@ -441,6 +441,18 @@ table_name_cond(A) ::= table_name(B).
from_db_opt(A) ::= . { A = createDefaultDatabaseCondValue(pCxt); }
from_db_opt(A) ::= FROM db_name(B). { A = createIdentifierValueNode(pCxt, &B); }
+%type tag_list_opt { SNodeList* }
+%destructor tag_list_opt { nodesDestroyList($$); }
+tag_list_opt(A) ::= . { A = NULL; }
+tag_list_opt(A) ::= tag_item(B). { A = createNodeList(pCxt, B); }
+tag_list_opt(A) ::= tag_list_opt(B) NK_COMMA tag_item(C). { A = addNodeToList(pCxt, B, C); }
+
+tag_item(A) ::= TBNAME(B). { A = setProjectionAlias(pCxt, createFunctionNode(pCxt, &B, NULL), &B); }
+tag_item(A) ::= QTAGS(B). { A = createFunctionNode(pCxt, &B, NULL); }
+tag_item(A) ::= column_name(B). { A = createColumnNode(pCxt, NULL, &B); }
+tag_item(A) ::= column_name(B) column_alias(C). { A = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &B), &C); }
+tag_item(A) ::= column_name(B) AS column_alias(C). { A = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &B), &C); }
+
/************************************************ create index ********************************************************/
cmd ::= CREATE SMA INDEX not_exists_opt(D)
full_table_name(A) ON full_table_name(B) index_options(C). { pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, D, A, B, NULL, C); }
diff --git a/source/libs/parser/src/parAstCreater.c b/source/libs/parser/src/parAstCreater.c
index 49685112a9f48f73d347f995bcd533619e1fda42..1db52c123c692e821918d80e97608f6f2b073561 100644
--- a/source/libs/parser/src/parAstCreater.c
+++ b/source/libs/parser/src/parAstCreater.c
@@ -1390,6 +1390,21 @@ SNode* createShowVnodesStmt(SAstCreateContext* pCxt, SNode* pDnodeId, SNode* pDn
return (SNode*)pStmt;
}
+SNode* createShowTableTagsStmt(SAstCreateContext* pCxt, SNode* pTbName, SNode* pDbName, SNodeList* pTags) {
+ CHECK_PARSER_STATUS(pCxt);
+ if (NULL == pDbName) {
+ snprintf(pCxt->pQueryCxt->pMsg, pCxt->pQueryCxt->msgLen, "database not specified");
+ pCxt->errCode = TSDB_CODE_PAR_SYNTAX_ERROR;
+ return NULL;
+ }
+ SShowTableTagsStmt* pStmt = (SShowTableTagsStmt*)nodesMakeNode(QUERY_NODE_SHOW_TABLE_TAGS_STMT);
+ CHECK_OUT_OF_MEM(pStmt);
+ pStmt->pDbName = pDbName;
+ pStmt->pTbName = pTbName;
+ pStmt->pTags = pTags;
+ return (SNode*)pStmt;
+}
+
SNode* createCreateUserStmt(SAstCreateContext* pCxt, SToken* pUserName, const SToken* pPassword, int8_t sysinfo) {
CHECK_PARSER_STATUS(pCxt);
char password[TSDB_USET_PASSWORD_LEN] = {0};
diff --git a/source/libs/parser/src/parAstParser.c b/source/libs/parser/src/parAstParser.c
index 28dc6179f9988d67108e6fbf2a67ac1bb330479e..5aa87d780ddd05c980ab6c8dfe50d2397ba1239f 100644
--- a/source/libs/parser/src/parAstParser.c
+++ b/source/libs/parser/src/parAstParser.c
@@ -84,6 +84,7 @@ abort_parse:
(*pQuery)->pRoot = cxt.pRootNode;
(*pQuery)->placeholderNum = cxt.placeholderNo;
TSWAP((*pQuery)->pPlaceholderValues, cxt.pPlaceholderValues);
+ (*pQuery)->execStage = QUERY_EXEC_STAGE_ANALYSE;
}
taosArrayDestroy(cxt.pPlaceholderValues);
return cxt.errCode;
@@ -439,7 +440,7 @@ static int32_t collectMetaKeyFromShowTags(SCollectMetaKeyCxt* pCxt, SShowStmt* p
return code;
}
-static int32_t collectMetaKeyFromShowStableTags(SCollectMetaKeyCxt* pCxt, SShowStmt* pStmt) {
+static int32_t collectMetaKeyFromShowStableTags(SCollectMetaKeyCxt* pCxt, SShowTableTagsStmt* pStmt) {
return collectMetaKeyFromRealTableImpl(pCxt, ((SValueNode*)pStmt->pDbName)->literal,
((SValueNode*)pStmt->pTbName)->literal, AUTH_TYPE_READ);
}
@@ -626,7 +627,7 @@ static int32_t collectMetaKeyFromQuery(SCollectMetaKeyCxt* pCxt, SNode* pStmt) {
case QUERY_NODE_SHOW_TAGS_STMT:
return collectMetaKeyFromShowTags(pCxt, (SShowStmt*)pStmt);
case QUERY_NODE_SHOW_TABLE_TAGS_STMT:
- return collectMetaKeyFromShowStableTags(pCxt, (SShowStmt*)pStmt);
+ return collectMetaKeyFromShowStableTags(pCxt, (SShowTableTagsStmt*)pStmt);
case QUERY_NODE_SHOW_USERS_STMT:
return collectMetaKeyFromShowUsers(pCxt, (SShowStmt*)pStmt);
case QUERY_NODE_SHOW_LICENCES_STMT:
diff --git a/source/libs/parser/src/parInsertSml.c b/source/libs/parser/src/parInsertSml.c
index 8be5b86b37bd51a0ae1eb1f7c66584b0c8366c55..d18b11ad57e25a863c7a507d95da92ef05d19cc3 100644
--- a/source/libs/parser/src/parInsertSml.c
+++ b/source/libs/parser/src/parInsertSml.c
@@ -333,11 +333,7 @@ int32_t smlBindData(void* handle, SArray* tags, SArray* colsSchema, SArray* cols
}
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
- if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, pDataBlock, rowNum)) {
- return buildInvalidOperationMsg(&pBuf, "too many rows in sql, total number of rows should be less than INT32_MAX");
- }
-
- return TSDB_CODE_SUCCESS;
+ return insSetBlockInfo(pBlocks, pDataBlock, rowNum, &pBuf);
}
void* smlInitHandle(SQuery* pQuery) {
diff --git a/source/libs/parser/src/parInsertSql.c b/source/libs/parser/src/parInsertSql.c
index 1ccb34cd1fd485c4334b1cff1515718c02b740e8..411adc680c87f6d92780e351a920221927ddca1c 100644
--- a/source/libs/parser/src/parInsertSql.c
+++ b/source/libs/parser/src/parInsertSql.c
@@ -18,123 +18,247 @@
#include "tglobal.h"
#include "ttime.h"
-#define NEXT_TOKEN_WITH_PREV(pSql, sToken) \
- do { \
- int32_t index = 0; \
- sToken = tStrGetToken(pSql, &index, true); \
- pSql += index; \
+#define NEXT_TOKEN_WITH_PREV(pSql, token) \
+ do { \
+ int32_t index = 0; \
+ token = tStrGetToken(pSql, &index, true); \
+ pSql += index; \
} while (0)
-#define NEXT_TOKEN_KEEP_SQL(pSql, sToken, index) \
- do { \
- sToken = tStrGetToken(pSql, &index, false); \
+#define NEXT_TOKEN_KEEP_SQL(pSql, token, index) \
+ do { \
+ token = tStrGetToken(pSql, &index, false); \
} while (0)
-#define NEXT_VALID_TOKEN(pSql, sToken) \
- do { \
- sToken.n = tGetToken(pSql, &sToken.type); \
- sToken.z = pSql; \
- pSql += sToken.n; \
- } while (TK_NK_SPACE == sToken.type)
+#define NEXT_VALID_TOKEN(pSql, token) \
+ do { \
+ (token).n = tGetToken(pSql, &(token).type); \
+ (token).z = (char*)pSql; \
+ pSql += (token).n; \
+ } while (TK_NK_SPACE == (token).type)
+
+typedef struct SInsertParseContext {
+ SParseContext* pComCxt;
+ SMsgBuf msg;
+ char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW];
+ SParsedDataColInfo tags; // for stmt
+ bool missCache;
+ bool usingDuplicateTable;
+} SInsertParseContext;
typedef int32_t (*_row_append_fn_t)(SMsgBuf* pMsgBuf, const void* value, int32_t len, void* param);
static uint8_t TRUE_VALUE = (uint8_t)TSDB_TRUE;
static uint8_t FALSE_VALUE = (uint8_t)TSDB_FALSE;
-static int32_t skipInsertInto(char** pSql, SMsgBuf* pMsg) {
- SToken sToken;
- NEXT_TOKEN(*pSql, sToken);
- if (TK_INSERT != sToken.type && TK_IMPORT != sToken.type) {
- return buildSyntaxErrMsg(pMsg, "keyword INSERT is expected", sToken.z);
+static bool isNullStr(SToken* pToken) {
+ return ((pToken->type == TK_NK_STRING) && (strlen(TSDB_DATA_NULL_STR_L) == pToken->n) &&
+ (strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0));
+}
+
+static bool isNullValue(int8_t dataType, SToken* pToken) {
+ return TK_NULL == pToken->type || (!IS_STR_DATA_TYPE(dataType) && isNullStr(pToken));
+}
+
+static FORCE_INLINE int32_t toDouble(SToken* pToken, double* value, char** endPtr) {
+ errno = 0;
+ *value = taosStr2Double(pToken->z, endPtr);
+
+ // not a valid integer number, return error
+ if ((*endPtr - pToken->z) != pToken->n) {
+ return TK_NK_ILLEGAL;
+ }
+
+ return pToken->type;
+}
+
+static int32_t skipInsertInto(const char** pSql, SMsgBuf* pMsg) {
+ SToken token;
+ NEXT_TOKEN(*pSql, token);
+ if (TK_INSERT != token.type && TK_IMPORT != token.type) {
+ return buildSyntaxErrMsg(pMsg, "keyword INSERT is expected", token.z);
}
- NEXT_TOKEN(*pSql, sToken);
- if (TK_INTO != sToken.type) {
- return buildSyntaxErrMsg(pMsg, "keyword INTO is expected", sToken.z);
+ NEXT_TOKEN(*pSql, token);
+ if (TK_INTO != token.type) {
+ return buildSyntaxErrMsg(pMsg, "keyword INTO is expected", token.z);
}
return TSDB_CODE_SUCCESS;
}
-static int32_t checkAuth(SInsertParseContext* pCxt, char* pDbFname, bool* pPass) {
- SParseContext* pBasicCtx = pCxt->pComCxt;
- if (pBasicCtx->async) {
- return getUserAuthFromCache(pCxt->pMetaCache, pBasicCtx->pUser, pDbFname, AUTH_TYPE_WRITE, pPass);
+static int32_t skipParentheses(SInsertParseContext* pCxt, const char** pSql) {
+ SToken token;
+ int32_t expectRightParenthesis = 1;
+ while (1) {
+ NEXT_TOKEN(*pSql, token);
+ if (TK_NK_LP == token.type) {
+ ++expectRightParenthesis;
+ } else if (TK_NK_RP == token.type && 0 == --expectRightParenthesis) {
+ break;
+ }
+ if (0 == token.n) {
+ return buildSyntaxErrMsg(&pCxt->msg, ") expected", NULL);
+ }
}
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
- .requestId = pBasicCtx->requestId,
- .requestObjRefId = pBasicCtx->requestRid,
- .mgmtEps = pBasicCtx->mgmtEpSet};
+ return TSDB_CODE_SUCCESS;
+}
- return catalogChkAuth(pBasicCtx->pCatalog, &conn, pBasicCtx->pUser, pDbFname, AUTH_TYPE_WRITE, pPass);
+static int32_t skipTableOptions(SInsertParseContext* pCxt, const char** pSql) {
+ do {
+ int32_t index = 0;
+ SToken token;
+ NEXT_TOKEN_KEEP_SQL(*pSql, token, index);
+ if (TK_TTL == token.type || TK_COMMENT == token.type) {
+ *pSql += index;
+ NEXT_TOKEN_WITH_PREV(*pSql, token);
+ } else {
+ break;
+ }
+ } while (1);
+ return TSDB_CODE_SUCCESS;
}
-static int32_t getTableSchema(SInsertParseContext* pCxt, int32_t tbNo, SName* pTbName, bool isStb,
- STableMeta** pTableMeta) {
- SParseContext* pBasicCtx = pCxt->pComCxt;
- if (pBasicCtx->async) {
- return getTableMetaFromCacheForInsert(pBasicCtx->pTableMetaPos, pCxt->pMetaCache, tbNo, pTableMeta);
+// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
+static int32_t ignoreUsingClause(SInsertParseContext* pCxt, const char** pSql) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ SToken token;
+ NEXT_TOKEN(*pSql, token);
+
+ NEXT_TOKEN(*pSql, token);
+ if (TK_NK_LP == token.type) {
+ code = skipParentheses(pCxt, pSql);
+ if (TSDB_CODE_SUCCESS == code) {
+ NEXT_TOKEN(*pSql, token);
+ }
}
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
- .requestId = pBasicCtx->requestId,
- .requestObjRefId = pBasicCtx->requestRid,
- .mgmtEps = pBasicCtx->mgmtEpSet};
- if (isStb) {
- return catalogGetSTableMeta(pBasicCtx->pCatalog, &conn, pTbName, pTableMeta);
+ // pSql -> TAGS (tag1_value, ...)
+ if (TSDB_CODE_SUCCESS == code) {
+ if (TK_TAGS != token.type) {
+ code = buildSyntaxErrMsg(&pCxt->msg, "TAGS is expected", token.z);
+ } else {
+ NEXT_TOKEN(*pSql, token);
+ }
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ if (TK_NK_LP != token.type) {
+ code = buildSyntaxErrMsg(&pCxt->msg, "( is expected", token.z);
+ } else {
+ code = skipParentheses(pCxt, pSql);
+ }
}
- return catalogGetTableMeta(pBasicCtx->pCatalog, &conn, pTbName, pTableMeta);
-}
-static int32_t getTableVgroup(SInsertParseContext* pCxt, int32_t tbNo, SName* pTbName, SVgroupInfo* pVg) {
- SParseContext* pBasicCtx = pCxt->pComCxt;
- if (pBasicCtx->async) {
- return getTableVgroupFromCacheForInsert(pBasicCtx->pTableVgroupPos, pCxt->pMetaCache, tbNo, pVg);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = skipTableOptions(pCxt, pSql);
}
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
- .requestId = pBasicCtx->requestId,
- .requestObjRefId = pBasicCtx->requestRid,
- .mgmtEps = pBasicCtx->mgmtEpSet};
- return catalogGetTableHashVgroup(pBasicCtx->pCatalog, &conn, pTbName, pVg);
+
+ return code;
}
-static int32_t getTableMetaImpl(SInsertParseContext* pCxt, int32_t tbNo, SName* name, bool isStb) {
- CHECK_CODE(getTableSchema(pCxt, tbNo, name, isStb, &pCxt->pTableMeta));
- if (!isStb) {
- SVgroupInfo vg;
- CHECK_CODE(getTableVgroup(pCxt, tbNo, name, &vg));
- CHECK_CODE(taosHashPut(pCxt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg)));
+static int32_t parseDuplicateUsingClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, bool* pDuplicate) {
+ *pDuplicate = false;
+
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(&pStmt->targetTableName, tbFName);
+ STableMeta** pMeta = taosHashGet(pStmt->pSubTableHashObj, tbFName, strlen(tbFName));
+ if (NULL != pMeta) {
+ *pDuplicate = true;
+ int32_t code = ignoreUsingClause(pCxt, &pStmt->pSql);
+ if (TSDB_CODE_SUCCESS == code) {
+ return cloneTableMeta(*pMeta, &pStmt->pTableMeta);
+ }
}
+
return TSDB_CODE_SUCCESS;
}
-static int32_t getTableMeta(SInsertParseContext* pCxt, int32_t tbNo, SName* name) {
- return getTableMetaImpl(pCxt, tbNo, name, false);
-}
+// pStmt->pSql -> field1_name, ...)
+static int32_t parseBoundColumns(SInsertParseContext* pCxt, const char** pSql, SParsedDataColInfo* pColList,
+ SSchema* pSchema) {
+ col_id_t nCols = pColList->numOfCols;
-static int32_t getSTableMeta(SInsertParseContext* pCxt, int32_t tbNo, SName* name) {
- return getTableMetaImpl(pCxt, tbNo, name, true);
-}
+ pColList->numOfBound = 0;
+ pColList->boundNullLen = 0;
+ memset(pColList->boundColumns, 0, sizeof(col_id_t) * nCols);
+ for (col_id_t i = 0; i < nCols; ++i) {
+ pColList->cols[i].valStat = VAL_STAT_NONE;
+ }
-static int32_t getDBCfg(SInsertParseContext* pCxt, const char* pDbFName, SDbCfgInfo* pInfo) {
- SParseContext* pBasicCtx = pCxt->pComCxt;
- if (pBasicCtx->async) {
- CHECK_CODE(getDbCfgFromCache(pCxt->pMetaCache, pDbFName, pInfo));
- } else {
- SRequestConnInfo conn = {.pTrans = pBasicCtx->pTransporter,
- .requestId = pBasicCtx->requestId,
- .requestObjRefId = pBasicCtx->requestRid,
- .mgmtEps = pBasicCtx->mgmtEpSet};
- CHECK_CODE(catalogGetDBCfg(pBasicCtx->pCatalog, &conn, pDbFName, pInfo));
+ SToken token;
+ bool isOrdered = true;
+ col_id_t lastColIdx = -1; // last column found
+ while (1) {
+ NEXT_TOKEN(*pSql, token);
+
+ if (TK_NK_RP == token.type) {
+ break;
+ }
+
+ char tmpTokenBuf[TSDB_COL_NAME_LEN + 2] = {0}; // used for deleting Escape character backstick(`)
+ strncpy(tmpTokenBuf, token.z, token.n);
+ token.z = tmpTokenBuf;
+ token.n = strdequote(token.z);
+
+ col_id_t t = lastColIdx + 1;
+ col_id_t index = insFindCol(&token, t, nCols, pSchema);
+ if (index < 0 && t > 0) {
+ index = insFindCol(&token, 0, t, pSchema);
+ isOrdered = false;
+ }
+ if (index < 0) {
+ return generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_INVALID_COLUMN, token.z);
+ }
+ if (pColList->cols[index].valStat == VAL_STAT_HAS) {
+ return buildSyntaxErrMsg(&pCxt->msg, "duplicated column name", token.z);
+ }
+ lastColIdx = index;
+ pColList->cols[index].valStat = VAL_STAT_HAS;
+ pColList->boundColumns[pColList->numOfBound] = index;
+ ++pColList->numOfBound;
+ switch (pSchema[t].type) {
+ case TSDB_DATA_TYPE_BINARY:
+ pColList->boundNullLen += (sizeof(VarDataOffsetT) + VARSTR_HEADER_SIZE + CHAR_BYTES);
+ break;
+ case TSDB_DATA_TYPE_NCHAR:
+ pColList->boundNullLen += (sizeof(VarDataOffsetT) + VARSTR_HEADER_SIZE + TSDB_NCHAR_SIZE);
+ break;
+ default:
+ pColList->boundNullLen += TYPE_BYTES[pSchema[t].type];
+ break;
+ }
+ }
+
+ pColList->orderStatus = isOrdered ? ORDER_STATUS_ORDERED : ORDER_STATUS_DISORDERED;
+
+ if (!isOrdered) {
+ pColList->colIdxInfo = taosMemoryCalloc(pColList->numOfBound, sizeof(SBoundIdxInfo));
+ if (NULL == pColList->colIdxInfo) {
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+ SBoundIdxInfo* pColIdx = pColList->colIdxInfo;
+ for (col_id_t i = 0; i < pColList->numOfBound; ++i) {
+ pColIdx[i].schemaColIdx = pColList->boundColumns[i];
+ pColIdx[i].boundIdx = i;
+ }
+ taosSort(pColIdx, pColList->numOfBound, sizeof(SBoundIdxInfo), insSchemaIdxCompar);
+ for (col_id_t i = 0; i < pColList->numOfBound; ++i) {
+ pColIdx[i].finalIdx = i;
+ }
+ taosSort(pColIdx, pColList->numOfBound, sizeof(SBoundIdxInfo), insBoundIdxCompar);
+ }
+
+ if (pColList->numOfCols > pColList->numOfBound) {
+ memset(&pColList->boundColumns[pColList->numOfBound], 0,
+ sizeof(col_id_t) * (pColList->numOfCols - pColList->numOfBound));
}
+
return TSDB_CODE_SUCCESS;
}
-static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time, SMsgBuf* pMsgBuf) {
- int32_t index = 0;
- SToken sToken;
- int64_t interval;
- int64_t ts = 0;
- char* pTokenEnd = *end;
+static int parseTime(const char** end, SToken* pToken, int16_t timePrec, int64_t* time, SMsgBuf* pMsgBuf) {
+ int32_t index = 0;
+ int64_t interval;
+ int64_t ts = 0;
+ const char* pTokenEnd = *end;
if (pToken->type == TK_NOW) {
ts = taosGetTimestamp(timePrec);
@@ -172,18 +296,17 @@ static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time
* time expression:
* e.g., now+12a, now-5h
*/
- SToken valueToken;
index = 0;
- sToken = tStrGetToken(pTokenEnd, &index, false);
+ SToken token = tStrGetToken(pTokenEnd, &index, false);
pTokenEnd += index;
- if (sToken.type == TK_NK_MINUS || sToken.type == TK_NK_PLUS) {
+ if (token.type == TK_NK_MINUS || token.type == TK_NK_PLUS) {
index = 0;
- valueToken = tStrGetToken(pTokenEnd, &index, false);
+ SToken valueToken = tStrGetToken(pTokenEnd, &index, false);
pTokenEnd += index;
if (valueToken.n < 2) {
- return buildSyntaxErrMsg(pMsgBuf, "value expected in timestamp", sToken.z);
+ return buildSyntaxErrMsg(pMsgBuf, "value expected in timestamp", token.z);
}
char unit = 0;
@@ -191,7 +314,7 @@ static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time
return TSDB_CODE_TSC_INVALID_OPERATION;
}
- if (sToken.type == TK_NK_PLUS) {
+ if (token.type == TK_NK_PLUS) {
ts += interval;
} else {
ts = ts - interval;
@@ -204,92 +327,42 @@ static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time
return TSDB_CODE_SUCCESS;
}
-static FORCE_INLINE int32_t checkAndTrimValue(SToken* pToken, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
- if ((pToken->type != TK_NOW && pToken->type != TK_TODAY && pToken->type != TK_NK_INTEGER &&
- pToken->type != TK_NK_STRING && pToken->type != TK_NK_FLOAT && pToken->type != TK_NK_BOOL &&
- pToken->type != TK_NULL && pToken->type != TK_NK_HEX && pToken->type != TK_NK_OCT &&
- pToken->type != TK_NK_BIN) ||
- (pToken->n == 0) || (pToken->type == TK_NK_RP)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid data or symbol", pToken->z);
- }
-
- // Remove quotation marks
- if (TK_NK_STRING == pToken->type) {
- if (pToken->n >= TSDB_MAX_BYTES_PER_ROW) {
- return buildSyntaxErrMsg(pMsgBuf, "too long string", pToken->z);
- }
-
- int32_t len = trimString(pToken->z, pToken->n, tmpTokenBuf, TSDB_MAX_BYTES_PER_ROW);
- pToken->z = tmpTokenBuf;
- pToken->n = len;
- }
-
- return TSDB_CODE_SUCCESS;
-}
-
-static bool isNullStr(SToken* pToken) {
- return ((pToken->type == TK_NK_STRING) && (strlen(TSDB_DATA_NULL_STR_L) == pToken->n) &&
- (strncasecmp(TSDB_DATA_NULL_STR_L, pToken->z, pToken->n) == 0));
-}
-
-static bool isNullValue(int8_t dataType, SToken* pToken) {
- return TK_NULL == pToken->type || (!IS_STR_DATA_TYPE(dataType) && isNullStr(pToken));
-}
-
-static FORCE_INLINE int32_t toDouble(SToken* pToken, double* value, char** endPtr) {
- errno = 0;
- *value = taosStr2Double(pToken->z, endPtr);
-
- // not a valid integer number, return error
- if ((*endPtr - pToken->z) != pToken->n) {
- return TK_NK_ILLEGAL;
- }
-
- return pToken->type;
-}
-
-static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, char* tmpTokenBuf,
- _row_append_fn_t func, void* param, SMsgBuf* pMsgBuf) {
+static int32_t parseTagToken(const char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, STagVal* val,
+ SMsgBuf* pMsgBuf) {
int64_t iv;
uint64_t uv;
char* endptr = NULL;
- int32_t code = checkAndTrimValue(pToken, tmpTokenBuf, pMsgBuf);
- if (code != TSDB_CODE_SUCCESS) {
- return code;
- }
-
if (isNullValue(pSchema->type, pToken)) {
if (TSDB_DATA_TYPE_TIMESTAMP == pSchema->type && PRIMARYKEY_TIMESTAMP_COL_ID == pSchema->colId) {
return buildSyntaxErrMsg(pMsgBuf, "primary timestamp should not be null", pToken->z);
}
- return func(pMsgBuf, NULL, 0, param);
+ return TSDB_CODE_SUCCESS;
}
- if (IS_NUMERIC_TYPE(pSchema->type) && pToken->n == 0) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid numeric data", pToken->z);
- }
+ // strcpy(val->colName, pSchema->name);
+ val->cid = pSchema->colId;
+ val->type = pSchema->type;
switch (pSchema->type) {
case TSDB_DATA_TYPE_BOOL: {
if ((pToken->type == TK_NK_BOOL || pToken->type == TK_NK_STRING) && (pToken->n != 0)) {
if (strncmp(pToken->z, "true", pToken->n) == 0) {
- return func(pMsgBuf, &TRUE_VALUE, pSchema->bytes, param);
+ *(int8_t*)(&val->i64) = TRUE_VALUE;
} else if (strncmp(pToken->z, "false", pToken->n) == 0) {
- return func(pMsgBuf, &FALSE_VALUE, pSchema->bytes, param);
+ *(int8_t*)(&val->i64) = FALSE_VALUE;
} else {
return buildSyntaxErrMsg(pMsgBuf, "invalid bool data", pToken->z);
}
} else if (pToken->type == TK_NK_INTEGER) {
- return func(pMsgBuf, ((taosStr2Int64(pToken->z, NULL, 10) == 0) ? &FALSE_VALUE : &TRUE_VALUE), pSchema->bytes,
- param);
+ *(int8_t*)(&val->i64) = ((taosStr2Int64(pToken->z, NULL, 10) == 0) ? FALSE_VALUE : TRUE_VALUE);
} else if (pToken->type == TK_NK_FLOAT) {
- return func(pMsgBuf, ((taosStr2Double(pToken->z, NULL) == 0) ? &FALSE_VALUE : &TRUE_VALUE), pSchema->bytes,
- param);
+ *(int8_t*)(&val->i64) = ((taosStr2Double(pToken->z, NULL) == 0) ? FALSE_VALUE : TRUE_VALUE);
} else {
return buildSyntaxErrMsg(pMsgBuf, "invalid bool data", pToken->z);
}
+ break;
}
case TSDB_DATA_TYPE_TINYINT: {
@@ -299,8 +372,8 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
return buildSyntaxErrMsg(pMsgBuf, "tinyint data overflow", pToken->z);
}
- uint8_t tmpVal = (uint8_t)iv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(int8_t*)(&val->i64) = iv;
+ break;
}
case TSDB_DATA_TYPE_UTINYINT: {
@@ -309,8 +382,8 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
} else if (uv > UINT8_MAX) {
return buildSyntaxErrMsg(pMsgBuf, "unsigned tinyint data overflow", pToken->z);
}
- uint8_t tmpVal = (uint8_t)uv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(uint8_t*)(&val->i64) = uv;
+ break;
}
case TSDB_DATA_TYPE_SMALLINT: {
@@ -319,8 +392,8 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
} else if (!IS_VALID_SMALLINT(iv)) {
return buildSyntaxErrMsg(pMsgBuf, "smallint data overflow", pToken->z);
}
- int16_t tmpVal = (int16_t)iv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(int16_t*)(&val->i64) = iv;
+ break;
}
case TSDB_DATA_TYPE_USMALLINT: {
@@ -329,8 +402,8 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
} else if (uv > UINT16_MAX) {
return buildSyntaxErrMsg(pMsgBuf, "unsigned smallint data overflow", pToken->z);
}
- uint16_t tmpVal = (uint16_t)uv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(uint16_t*)(&val->i64) = uv;
+ break;
}
case TSDB_DATA_TYPE_INT: {
@@ -339,8 +412,8 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
} else if (!IS_VALID_INT(iv)) {
return buildSyntaxErrMsg(pMsgBuf, "int data overflow", pToken->z);
}
- int32_t tmpVal = (int32_t)iv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(int32_t*)(&val->i64) = iv;
+ break;
}
case TSDB_DATA_TYPE_UINT: {
@@ -349,22 +422,24 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
} else if (uv > UINT32_MAX) {
return buildSyntaxErrMsg(pMsgBuf, "unsigned int data overflow", pToken->z);
}
- uint32_t tmpVal = (uint32_t)uv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(uint32_t*)(&val->i64) = uv;
+ break;
}
case TSDB_DATA_TYPE_BIGINT: {
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
}
- return func(pMsgBuf, &iv, pSchema->bytes, param);
+ val->i64 = iv;
+ break;
}
case TSDB_DATA_TYPE_UBIGINT: {
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned bigint data", pToken->z);
}
- return func(pMsgBuf, &uv, pSchema->bytes, param);
+ *(uint64_t*)(&val->i64) = uv;
+ break;
}
case TSDB_DATA_TYPE_FLOAT: {
@@ -376,8 +451,8 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
isnan(dv)) {
return buildSyntaxErrMsg(pMsgBuf, "illegal float data", pToken->z);
}
- float tmpVal = (float)dv;
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ *(float*)(&val->i64) = dv;
+ break;
}
case TSDB_DATA_TYPE_DOUBLE: {
@@ -388,7 +463,9 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || isinf(dv) || isnan(dv)) {
return buildSyntaxErrMsg(pMsgBuf, "illegal double data", pToken->z);
}
- return func(pMsgBuf, &dv, pSchema->bytes, param);
+
+ *(double*)(&val->i64) = dv;
+ break;
}
case TSDB_DATA_TYPE_BINARY: {
@@ -396,583 +473,751 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
if (pToken->n + VARSTR_HEADER_SIZE > pSchema->bytes) {
return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
}
-
- return func(pMsgBuf, pToken->z, pToken->n, param);
+ val->pData = strdup(pToken->z);
+ val->nData = pToken->n;
+ break;
}
case TSDB_DATA_TYPE_NCHAR: {
- return func(pMsgBuf, pToken->z, pToken->n, param);
- }
- case TSDB_DATA_TYPE_JSON: {
- if (pToken->n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
- return buildSyntaxErrMsg(pMsgBuf, "json string too long than 4095", pToken->z);
+ int32_t output = 0;
+ void* p = taosMemoryCalloc(1, pSchema->bytes - VARSTR_HEADER_SIZE);
+ if (p == NULL) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+ if (!taosMbsToUcs4(pToken->z, pToken->n, (TdUcs4*)(p), pSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
+ if (errno == E2BIG) {
+ taosMemoryFree(p);
+ return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
+ }
+ char buf[512] = {0};
+ snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
+ taosMemoryFree(p);
+ return buildSyntaxErrMsg(pMsgBuf, buf, pToken->z);
}
- return func(pMsgBuf, pToken->z, pToken->n, param);
+ val->pData = p;
+ val->nData = output;
+ break;
}
case TSDB_DATA_TYPE_TIMESTAMP: {
- int64_t tmpVal;
- if (parseTime(end, pToken, timePrec, &tmpVal, pMsgBuf) != TSDB_CODE_SUCCESS) {
+ if (parseTime(end, pToken, timePrec, &iv, pMsgBuf) != TSDB_CODE_SUCCESS) {
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp", pToken->z);
}
- return func(pMsgBuf, &tmpVal, pSchema->bytes, param);
+ val->i64 = iv;
+ break;
}
}
- return TSDB_CODE_FAILED;
+ return TSDB_CODE_SUCCESS;
}
-// pSql -> tag1_name, ...)
-static int32_t parseBoundColumns(SInsertParseContext* pCxt, SParsedDataColInfo* pColList, SSchema* pSchema) {
- col_id_t nCols = pColList->numOfCols;
+// input pStmt->pSql: [(tag1_name, ...)] TAGS (tag1_value, ...) ...
+// output pStmt->pSql: TAGS (tag1_value, ...) ...
+static int32_t parseBoundTagsClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SSchema* pTagsSchema = getTableTagSchema(pStmt->pTableMeta);
+ insSetBoundColumnInfo(&pCxt->tags, pTagsSchema, getNumOfTags(pStmt->pTableMeta));
- pColList->numOfBound = 0;
- pColList->boundNullLen = 0;
- memset(pColList->boundColumns, 0, sizeof(col_id_t) * nCols);
- for (col_id_t i = 0; i < nCols; ++i) {
- pColList->cols[i].valStat = VAL_STAT_NONE;
+ SToken token;
+ int32_t index = 0;
+ NEXT_TOKEN_KEEP_SQL(pStmt->pSql, token, index);
+ if (TK_NK_LP != token.type) {
+ return TSDB_CODE_SUCCESS;
}
- SToken sToken;
- bool isOrdered = true;
- col_id_t lastColIdx = -1; // last column found
- while (1) {
- NEXT_TOKEN(pCxt->pSql, sToken);
+ pStmt->pSql += index;
+ return parseBoundColumns(pCxt, &pStmt->pSql, &pCxt->tags, pTagsSchema);
+}
- if (TK_NK_RP == sToken.type) {
- break;
+static int32_t parseTagValue(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SSchema* pTagSchema, SToken* pToken,
+ SArray* pTagName, SArray* pTagVals, STag** pTag) {
+ if (!isNullValue(pTagSchema->type, pToken)) {
+ taosArrayPush(pTagName, pTagSchema->name);
+ }
+
+ if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
+ if (pToken->n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
+ return buildSyntaxErrMsg(&pCxt->msg, "json string too long than 4095", pToken->z);
}
- char tmpTokenBuf[TSDB_COL_NAME_LEN + 2] = {0}; // used for deleting Escape character backstick(`)
- strncpy(tmpTokenBuf, sToken.z, sToken.n);
- sToken.z = tmpTokenBuf;
- sToken.n = strdequote(sToken.z);
+ if (isNullValue(pTagSchema->type, pToken)) {
+ return tTagNew(pTagVals, 1, true, pTag);
+ } else {
+ return parseJsontoTagData(pToken->z, pTagVals, pTag, &pCxt->msg);
+ }
+ }
- col_id_t t = lastColIdx + 1;
- col_id_t index = insFindCol(&sToken, t, nCols, pSchema);
- if (index < 0 && t > 0) {
- index = insFindCol(&sToken, 0, t, pSchema);
- isOrdered = false;
+ STagVal val = {0};
+ int32_t code =
+ parseTagToken(&pStmt->pSql, pToken, pTagSchema, pStmt->pTableMeta->tableInfo.precision, &val, &pCxt->msg);
+ if (TSDB_CODE_SUCCESS == code) {
+ taosArrayPush(pTagVals, &val);
+ }
+
+ return code;
+}
+
+static void buildCreateTbReq(SVnodeModifOpStmt* pStmt, STag* pTag, SArray* pTagName) {
+ insBuildCreateTbReq(&pStmt->createTblReq, pStmt->targetTableName.tname, pTag, pStmt->pTableMeta->suid,
+ pStmt->usingTableName.tname, pTagName, pStmt->pTableMeta->tableInfo.numOfTags);
+}
+
+static int32_t checkAndTrimValue(SToken* pToken, char* tmpTokenBuf, SMsgBuf* pMsgBuf) {
+ if ((pToken->type != TK_NOW && pToken->type != TK_TODAY && pToken->type != TK_NK_INTEGER &&
+ pToken->type != TK_NK_STRING && pToken->type != TK_NK_FLOAT && pToken->type != TK_NK_BOOL &&
+ pToken->type != TK_NULL && pToken->type != TK_NK_HEX && pToken->type != TK_NK_OCT &&
+ pToken->type != TK_NK_BIN) ||
+ (pToken->n == 0) || (pToken->type == TK_NK_RP)) {
+ return buildSyntaxErrMsg(pMsgBuf, "invalid data or symbol", pToken->z);
+ }
+
+ // Remove quotation marks
+ if (TK_NK_STRING == pToken->type) {
+ if (pToken->n >= TSDB_MAX_BYTES_PER_ROW) {
+ return buildSyntaxErrMsg(pMsgBuf, "too long string", pToken->z);
}
- if (index < 0) {
- return generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_INVALID_COLUMN, sToken.z);
+
+ int32_t len = trimString(pToken->z, pToken->n, tmpTokenBuf, TSDB_MAX_BYTES_PER_ROW);
+ pToken->z = tmpTokenBuf;
+ pToken->n = len;
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+// pSql -> tag1_value, ...)
+static int32_t parseTagsClauseImpl(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ SSchema* pSchema = getTableTagSchema(pStmt->pTableMeta);
+ SArray* pTagVals = taosArrayInit(pCxt->tags.numOfBound, sizeof(STagVal));
+ SArray* pTagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
+ SToken token;
+ bool isParseBindParam = false;
+ bool isJson = false;
+ STag* pTag = NULL;
+ for (int i = 0; TSDB_CODE_SUCCESS == code && i < pCxt->tags.numOfBound; ++i) {
+ NEXT_TOKEN_WITH_PREV(pStmt->pSql, token);
+
+ if (token.type == TK_NK_QUESTION) {
+ isParseBindParam = true;
+ if (NULL == pCxt->pComCxt->pStmtCb) {
+ code = buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", token.z);
+ break;
+ }
+
+ continue;
}
- if (pColList->cols[index].valStat == VAL_STAT_HAS) {
- return buildSyntaxErrMsg(&pCxt->msg, "duplicated column name", sToken.z);
+
+ if (isParseBindParam) {
+ code = buildInvalidOperationMsg(&pCxt->msg, "no mix usage for ? and tag values");
+ break;
}
- lastColIdx = index;
- pColList->cols[index].valStat = VAL_STAT_HAS;
- pColList->boundColumns[pColList->numOfBound] = index;
- ++pColList->numOfBound;
- switch (pSchema[t].type) {
- case TSDB_DATA_TYPE_BINARY:
- pColList->boundNullLen += (sizeof(VarDataOffsetT) + VARSTR_HEADER_SIZE + CHAR_BYTES);
- break;
- case TSDB_DATA_TYPE_NCHAR:
- pColList->boundNullLen += (sizeof(VarDataOffsetT) + VARSTR_HEADER_SIZE + TSDB_NCHAR_SIZE);
- break;
- default:
- pColList->boundNullLen += TYPE_BYTES[pSchema[t].type];
- break;
+
+ SSchema* pTagSchema = &pSchema[pCxt->tags.boundColumns[i]];
+ isJson = pTagSchema->type == TSDB_DATA_TYPE_JSON;
+ code = checkAndTrimValue(&token, pCxt->tmpTokenBuf, &pCxt->msg);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseTagValue(pCxt, pStmt, pTagSchema, &token, pTagName, pTagVals, &pTag);
}
}
- pColList->orderStatus = isOrdered ? ORDER_STATUS_ORDERED : ORDER_STATUS_DISORDERED;
+ if (TSDB_CODE_SUCCESS == code && !isParseBindParam && !isJson) {
+ code = tTagNew(pTagVals, 1, false, &pTag);
+ }
- if (!isOrdered) {
- pColList->colIdxInfo = taosMemoryCalloc(pColList->numOfBound, sizeof(SBoundIdxInfo));
- if (NULL == pColList->colIdxInfo) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
- }
- SBoundIdxInfo* pColIdx = pColList->colIdxInfo;
- for (col_id_t i = 0; i < pColList->numOfBound; ++i) {
- pColIdx[i].schemaColIdx = pColList->boundColumns[i];
- pColIdx[i].boundIdx = i;
+ if (TSDB_CODE_SUCCESS == code && !isParseBindParam) {
+ buildCreateTbReq(pStmt, pTag, pTagName);
+ pTag = NULL;
+ }
+
+ for (int i = 0; i < taosArrayGetSize(pTagVals); ++i) {
+ STagVal* p = (STagVal*)taosArrayGet(pTagVals, i);
+ if (IS_VAR_DATA_TYPE(p->type)) {
+ taosMemoryFreeClear(p->pData);
}
- taosSort(pColIdx, pColList->numOfBound, sizeof(SBoundIdxInfo), insSchemaIdxCompar);
- for (col_id_t i = 0; i < pColList->numOfBound; ++i) {
- pColIdx[i].finalIdx = i;
+ }
+ taosArrayDestroy(pTagVals);
+ taosArrayDestroy(pTagName);
+ tTagFree(pTag);
+ return code;
+}
+
+// input pStmt->pSql: TAGS (tag1_value, ...) [table_options] ...
+// output pStmt->pSql: [table_options] ...
+static int32_t parseTagsClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SToken token;
+ NEXT_TOKEN(pStmt->pSql, token);
+ if (TK_TAGS != token.type) {
+ return buildSyntaxErrMsg(&pCxt->msg, "TAGS is expected", token.z);
+ }
+
+ NEXT_TOKEN(pStmt->pSql, token);
+ if (TK_NK_LP != token.type) {
+ return buildSyntaxErrMsg(&pCxt->msg, "( is expected", token.z);
+ }
+
+ int32_t code = parseTagsClauseImpl(pCxt, pStmt);
+ if (TSDB_CODE_SUCCESS == code) {
+ NEXT_VALID_TOKEN(pStmt->pSql, token);
+ if (TK_NK_COMMA == token.type) {
+ code = generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
+ } else if (TK_NK_RP != token.type) {
+ code = buildSyntaxErrMsg(&pCxt->msg, ") is expected", token.z);
}
- taosSort(pColIdx, pColList->numOfBound, sizeof(SBoundIdxInfo), insBoundIdxCompar);
}
+ return code;
+}
- if (pColList->numOfCols > pColList->numOfBound) {
- memset(&pColList->boundColumns[pColList->numOfBound], 0,
- sizeof(col_id_t) * (pColList->numOfCols - pColList->numOfBound));
+static int32_t storeTableMeta(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ pStmt->pTableMeta->suid = pStmt->pTableMeta->uid;
+ pStmt->pTableMeta->uid = pStmt->totalTbNum;
+ pStmt->pTableMeta->tableType = TSDB_CHILD_TABLE;
+
+ STableMeta* pBackup = NULL;
+ if (TSDB_CODE_SUCCESS != cloneTableMeta(pStmt->pTableMeta, &pBackup)) {
+ return TSDB_CODE_OUT_OF_MEMORY;
}
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(&pStmt->targetTableName, tbFName);
+ return taosHashPut(pStmt->pSubTableHashObj, tbFName, strlen(tbFName), &pBackup, POINTER_BYTES);
+}
+
+static int32_t parseTableOptions(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ do {
+ int32_t index = 0;
+ SToken token;
+ NEXT_TOKEN_KEEP_SQL(pStmt->pSql, token, index);
+ if (TK_TTL == token.type) {
+ pStmt->pSql += index;
+ NEXT_TOKEN_WITH_PREV(pStmt->pSql, token);
+ if (TK_NK_INTEGER != token.type) {
+ return buildSyntaxErrMsg(&pCxt->msg, "Invalid option ttl", token.z);
+ }
+ pStmt->createTblReq.ttl = taosStr2Int32(token.z, NULL, 10);
+ if (pStmt->createTblReq.ttl < 0) {
+ return buildSyntaxErrMsg(&pCxt->msg, "Invalid option ttl", token.z);
+ }
+ } else if (TK_COMMENT == token.type) {
+ pStmt->pSql += index;
+ NEXT_TOKEN(pStmt->pSql, token);
+ if (TK_NK_STRING != token.type) {
+ return buildSyntaxErrMsg(&pCxt->msg, "Invalid option comment", token.z);
+ }
+ if (token.n >= TSDB_TB_COMMENT_LEN) {
+ return buildSyntaxErrMsg(&pCxt->msg, "comment too long", token.z);
+ }
+ int32_t len = trimString(token.z, token.n, pCxt->tmpTokenBuf, TSDB_TB_COMMENT_LEN);
+ pStmt->createTblReq.comment = strndup(pCxt->tmpTokenBuf, len);
+ if (NULL == pStmt->createTblReq.comment) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
+ pStmt->createTblReq.commentLen = len;
+ } else {
+ break;
+ }
+ } while (1);
return TSDB_CODE_SUCCESS;
}
-static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema, int16_t timePrec, STagVal* val,
- SMsgBuf* pMsgBuf) {
- int64_t iv;
- uint64_t uv;
- char* endptr = NULL;
+// input pStmt->pSql:
+// 1. [(tag1_name, ...)] ...
+// 2. VALUES ... | FILE ...
+// output pStmt->pSql:
+// 1. [(field1_name, ...)]
+// 2. VALUES ... | FILE ...
+static int32_t parseUsingClauseBottom(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ if (!pStmt->usingTableProcessing || pCxt->usingDuplicateTable) {
+ return TSDB_CODE_SUCCESS;
+ }
- if (isNullValue(pSchema->type, pToken)) {
- if (TSDB_DATA_TYPE_TIMESTAMP == pSchema->type && PRIMARYKEY_TIMESTAMP_COL_ID == pSchema->colId) {
- return buildSyntaxErrMsg(pMsgBuf, "primary timestamp should not be null", pToken->z);
+ int32_t code = parseBoundTagsClause(pCxt, pStmt);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseTagsClause(pCxt, pStmt);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseTableOptions(pCxt, pStmt);
+ }
+
+ return code;
+}
+
+static int32_t checkAuth(SParseContext* pCxt, SName* pTbName, bool* pMissCache) {
+ char dbFName[TSDB_DB_FNAME_LEN];
+ tNameGetFullDbName(pTbName, dbFName);
+ int32_t code = TSDB_CODE_SUCCESS;
+ bool pass = true;
+ bool exists = true;
+ if (pCxt->async) {
+ code = catalogChkAuthFromCache(pCxt->pCatalog, pCxt->pUser, dbFName, AUTH_TYPE_WRITE, &pass, &exists);
+ } else {
+ SRequestConnInfo conn = {.pTrans = pCxt->pTransporter,
+ .requestId = pCxt->requestId,
+ .requestObjRefId = pCxt->requestRid,
+ .mgmtEps = pCxt->mgmtEpSet};
+ code = catalogChkAuth(pCxt->pCatalog, &conn, pCxt->pUser, dbFName, AUTH_TYPE_WRITE, &pass);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ if (!exists) {
+ *pMissCache = true;
+ } else if (!pass) {
+ code = TSDB_CODE_PAR_PERMISSION_DENIED;
}
+ }
+ return code;
+}
+static int32_t getTableMeta(SInsertParseContext* pCxt, SName* pTbName, bool isStb, STableMeta** pTableMeta,
+ bool* pMissCache) {
+ SParseContext* pComCxt = pCxt->pComCxt;
+ int32_t code = TSDB_CODE_SUCCESS;
+ if (pComCxt->async) {
+ if (isStb) {
+ code = catalogGetCachedSTableMeta(pComCxt->pCatalog, pTbName, pTableMeta);
+ } else {
+ code = catalogGetCachedTableMeta(pComCxt->pCatalog, pTbName, pTableMeta);
+ }
+ } else {
+ SRequestConnInfo conn = {.pTrans = pComCxt->pTransporter,
+ .requestId = pComCxt->requestId,
+ .requestObjRefId = pComCxt->requestRid,
+ .mgmtEps = pComCxt->mgmtEpSet};
+ if (isStb) {
+ code = catalogGetSTableMeta(pComCxt->pCatalog, &conn, pTbName, pTableMeta);
+ } else {
+ code = catalogGetTableMeta(pComCxt->pCatalog, &conn, pTbName, pTableMeta);
+ }
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ if (NULL == *pTableMeta) {
+ *pMissCache = true;
+ } else if (isStb && TSDB_SUPER_TABLE != (*pTableMeta)->tableType) {
+ code = buildInvalidOperationMsg(&pCxt->msg, "create table only from super table is allowed");
+ }
+ }
+ return code;
+}
+
+static int32_t getTableVgroup(SParseContext* pCxt, SVnodeModifOpStmt* pStmt, bool isStb, bool* pMissCache) {
+ int32_t code = TSDB_CODE_SUCCESS;
+ SVgroupInfo vg;
+ bool exists = true;
+ if (pCxt->async) {
+ code = catalogGetCachedTableHashVgroup(pCxt->pCatalog, &pStmt->targetTableName, &vg, &exists);
+ } else {
+ SRequestConnInfo conn = {.pTrans = pCxt->pTransporter,
+ .requestId = pCxt->requestId,
+ .requestObjRefId = pCxt->requestRid,
+ .mgmtEps = pCxt->mgmtEpSet};
+ code = catalogGetTableHashVgroup(pCxt->pCatalog, &conn, &pStmt->targetTableName, &vg);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ if (exists) {
+ if (isStb) {
+ pStmt->pTableMeta->vgId = vg.vgId;
+ }
+ code = taosHashPut(pStmt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg));
+ }
+ *pMissCache = !exists;
+ }
+ return code;
+}
+
+static int32_t getTargetTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache);
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = getTableMeta(pCxt, &pStmt->targetTableName, false, &pStmt->pTableMeta, &pCxt->missCache);
+ }
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = getTableVgroup(pCxt->pComCxt, pStmt, false, &pCxt->missCache);
+ }
+ return code;
+}
+
+static int32_t preParseUsingTableName(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SToken* pTbName) {
+ return insCreateSName(&pStmt->usingTableName, pTbName, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
+}
+
+static int32_t getUsingTableSchema(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ int32_t code = checkAuth(pCxt->pComCxt, &pStmt->targetTableName, &pCxt->missCache);
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = getTableMeta(pCxt, &pStmt->usingTableName, true, &pStmt->pTableMeta, &pCxt->missCache);
+ }
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = getTableVgroup(pCxt->pComCxt, pStmt, true, &pCxt->missCache);
+ }
+ return code;
+}
+
+static int32_t parseUsingTableNameImpl(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SToken token;
+ NEXT_TOKEN(pStmt->pSql, token);
+ int32_t code = preParseUsingTableName(pCxt, pStmt, &token);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = getUsingTableSchema(pCxt, pStmt);
+ }
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = storeTableMeta(pCxt, pStmt);
+ }
+ return code;
+}
+
+// input pStmt->pSql:
+// 1(care). [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...) [table_options]] ...
+// 2. VALUES ... | FILE ...
+// output pStmt->pSql:
+// 1. [(tag1_name, ...)] TAGS (tag1_value, ...) [table_options]] ...
+// 2. VALUES ... | FILE ...
+static int32_t parseUsingTableName(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SToken token;
+ int32_t index = 0;
+ NEXT_TOKEN_KEEP_SQL(pStmt->pSql, token, index);
+ if (TK_USING != token.type) {
+ return getTargetTableSchema(pCxt, pStmt);
+ }
+
+ pStmt->usingTableProcessing = true;
+ // pStmt->pSql -> stb_name [(tag1_name, ...)
+ pStmt->pSql += index;
+ int32_t code = parseDuplicateUsingClause(pCxt, pStmt, &pCxt->usingDuplicateTable);
+ if (TSDB_CODE_SUCCESS == code && !pCxt->usingDuplicateTable) {
+ return parseUsingTableNameImpl(pCxt, pStmt);
+ }
+ return code;
+}
+
+static int32_t preParseTargetTableName(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SToken* pTbName) {
+ return insCreateSName(&pStmt->targetTableName, pTbName, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
+}
+
+// input pStmt->pSql:
+// 1(care). [(field1_name, ...)] ...
+// 2. [ USING ... ] ...
+// 3. VALUES ... | FILE ...
+// output pStmt->pSql:
+// 1. [ USING ... ] ...
+// 2. VALUES ... | FILE ...
+static int32_t preParseBoundColumnsClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SToken token;
+ int32_t index = 0;
+ NEXT_TOKEN_KEEP_SQL(pStmt->pSql, token, index);
+ if (TK_NK_LP != token.type) {
return TSDB_CODE_SUCCESS;
}
- // strcpy(val->colName, pSchema->name);
- val->cid = pSchema->colId;
- val->type = pSchema->type;
+ // pStmt->pSql -> field1_name, ...)
+ pStmt->pSql += index;
+ pStmt->pBoundCols = pStmt->pSql;
+ return skipParentheses(pCxt, &pStmt->pSql);
+}
+
+static int32_t getTableDataBlocks(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks** pDataBuf) {
+ if (pCxt->pComCxt->async) {
+ return insGetDataBlockFromList(pStmt->pTableBlockHashObj, &pStmt->pTableMeta->uid, sizeof(pStmt->pTableMeta->uid),
+ TSDB_DEFAULT_PAYLOAD_SIZE, sizeof(SSubmitBlk),
+ getTableInfo(pStmt->pTableMeta).rowSize, pStmt->pTableMeta, pDataBuf, NULL,
+ &pStmt->createTblReq);
+ }
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(&pStmt->targetTableName, tbFName);
+ return insGetDataBlockFromList(pStmt->pTableBlockHashObj, tbFName, strlen(tbFName), TSDB_DEFAULT_PAYLOAD_SIZE,
+ sizeof(SSubmitBlk), getTableInfo(pStmt->pTableMeta).rowSize, pStmt->pTableMeta,
+ pDataBuf, NULL, &pStmt->createTblReq);
+}
+
+static int32_t parseBoundColumnsClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt,
+ STableDataBlocks* pDataBuf) {
+ SToken token;
+ int32_t index = 0;
+ NEXT_TOKEN_KEEP_SQL(pStmt->pSql, token, index);
+ if (TK_NK_LP == token.type) {
+ pStmt->pSql += index;
+ if (NULL != pStmt->pBoundCols) {
+ return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", token.z);
+ }
+ // pStmt->pSql -> field1_name, ...)
+ return parseBoundColumns(pCxt, &pStmt->pSql, &pDataBuf->boundColumnInfo, getTableColumnSchema(pStmt->pTableMeta));
+ }
+
+ if (NULL != pStmt->pBoundCols) {
+ return parseBoundColumns(pCxt, &pStmt->pBoundCols, &pDataBuf->boundColumnInfo,
+ getTableColumnSchema(pStmt->pTableMeta));
+ }
+
+ return TSDB_CODE_SUCCESS;
+}
+
+// input pStmt->pSql:
+// 1. [(tag1_name, ...)] ...
+// 2. VALUES ... | FILE ...
+// output pStmt->pSql: VALUES ... | FILE ...
+static int32_t parseSchemaClauseBottom(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt,
+ STableDataBlocks** pDataBuf) {
+ int32_t code = parseUsingClauseBottom(pCxt, pStmt);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = getTableDataBlocks(pCxt, pStmt, pDataBuf);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseBoundColumnsClause(pCxt, pStmt, *pDataBuf);
+ }
+ return code;
+}
+
+// input pStmt->pSql: [(field1_name, ...)] [ USING ... ] VALUES ... | FILE ...
+// output pStmt->pSql:
+// 1. [(tag1_name, ...)] ...
+// 2. VALUES ... | FILE ...
+static int32_t parseSchemaClauseTop(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SToken* pTbName) {
+ int32_t code = preParseTargetTableName(pCxt, pStmt, pTbName);
+ if (TSDB_CODE_SUCCESS == code) {
+ // option: [(field1_name, ...)]
+ code = preParseBoundColumnsClause(pCxt, pStmt);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ // option: [USING stb_name]
+ code = parseUsingTableName(pCxt, pStmt);
+ }
+ return code;
+}
+
+static int32_t parseValueTokenImpl(SInsertParseContext* pCxt, const char** pSql, SToken* pToken, SSchema* pSchema,
+ int16_t timePrec, _row_append_fn_t func, void* param) {
+ int64_t iv;
+ uint64_t uv;
+ char* endptr = NULL;
switch (pSchema->type) {
case TSDB_DATA_TYPE_BOOL: {
if ((pToken->type == TK_NK_BOOL || pToken->type == TK_NK_STRING) && (pToken->n != 0)) {
if (strncmp(pToken->z, "true", pToken->n) == 0) {
- *(int8_t*)(&val->i64) = TRUE_VALUE;
+ return func(&pCxt->msg, &TRUE_VALUE, pSchema->bytes, param);
} else if (strncmp(pToken->z, "false", pToken->n) == 0) {
- *(int8_t*)(&val->i64) = FALSE_VALUE;
+ return func(&pCxt->msg, &FALSE_VALUE, pSchema->bytes, param);
} else {
- return buildSyntaxErrMsg(pMsgBuf, "invalid bool data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid bool data", pToken->z);
}
} else if (pToken->type == TK_NK_INTEGER) {
- *(int8_t*)(&val->i64) = ((taosStr2Int64(pToken->z, NULL, 10) == 0) ? FALSE_VALUE : TRUE_VALUE);
+ return func(&pCxt->msg, ((taosStr2Int64(pToken->z, NULL, 10) == 0) ? &FALSE_VALUE : &TRUE_VALUE),
+ pSchema->bytes, param);
} else if (pToken->type == TK_NK_FLOAT) {
- *(int8_t*)(&val->i64) = ((taosStr2Double(pToken->z, NULL) == 0) ? FALSE_VALUE : TRUE_VALUE);
+ return func(&pCxt->msg, ((taosStr2Double(pToken->z, NULL) == 0) ? &FALSE_VALUE : &TRUE_VALUE), pSchema->bytes,
+ param);
} else {
- return buildSyntaxErrMsg(pMsgBuf, "invalid bool data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid bool data", pToken->z);
}
- break;
}
case TSDB_DATA_TYPE_TINYINT: {
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid tinyint data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid tinyint data", pToken->z);
} else if (!IS_VALID_TINYINT(iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "tinyint data overflow", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "tinyint data overflow", pToken->z);
}
- *(int8_t*)(&val->i64) = iv;
- break;
+ uint8_t tmpVal = (uint8_t)iv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_UTINYINT: {
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned tinyint data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid unsigned tinyint data", pToken->z);
} else if (uv > UINT8_MAX) {
- return buildSyntaxErrMsg(pMsgBuf, "unsigned tinyint data overflow", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "unsigned tinyint data overflow", pToken->z);
}
- *(uint8_t*)(&val->i64) = uv;
- break;
+ uint8_t tmpVal = (uint8_t)uv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_SMALLINT: {
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid smallint data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid smallint data", pToken->z);
} else if (!IS_VALID_SMALLINT(iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "smallint data overflow", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "smallint data overflow", pToken->z);
}
- *(int16_t*)(&val->i64) = iv;
- break;
+ int16_t tmpVal = (int16_t)iv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_USMALLINT: {
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned smallint data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid unsigned smallint data", pToken->z);
} else if (uv > UINT16_MAX) {
- return buildSyntaxErrMsg(pMsgBuf, "unsigned smallint data overflow", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "unsigned smallint data overflow", pToken->z);
}
- *(uint16_t*)(&val->i64) = uv;
- break;
+ uint16_t tmpVal = (uint16_t)uv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_INT: {
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid int data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid int data", pToken->z);
} else if (!IS_VALID_INT(iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "int data overflow", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "int data overflow", pToken->z);
}
- *(int32_t*)(&val->i64) = iv;
- break;
+ int32_t tmpVal = (int32_t)iv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_UINT: {
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned int data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid unsigned int data", pToken->z);
} else if (uv > UINT32_MAX) {
- return buildSyntaxErrMsg(pMsgBuf, "unsigned int data overflow", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "unsigned int data overflow", pToken->z);
}
- *(uint32_t*)(&val->i64) = uv;
- break;
+ uint32_t tmpVal = (uint32_t)uv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_BIGINT: {
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid bigint data", pToken->z);
}
- val->i64 = iv;
- break;
+ return func(&pCxt->msg, &iv, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_UBIGINT: {
if (TSDB_CODE_SUCCESS != toUInteger(pToken->z, pToken->n, 10, &uv)) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid unsigned bigint data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid unsigned bigint data", pToken->z);
}
- *(uint64_t*)(&val->i64) = uv;
- break;
+ return func(&pCxt->msg, &uv, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_FLOAT: {
double dv;
if (TK_NK_ILLEGAL == toDouble(pToken, &dv, &endptr)) {
- return buildSyntaxErrMsg(pMsgBuf, "illegal float data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "illegal float data", pToken->z);
}
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || dv > FLT_MAX || dv < -FLT_MAX || isinf(dv) ||
isnan(dv)) {
- return buildSyntaxErrMsg(pMsgBuf, "illegal float data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "illegal float data", pToken->z);
}
- *(float*)(&val->i64) = dv;
- break;
+ float tmpVal = (float)dv;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_DOUBLE: {
double dv;
if (TK_NK_ILLEGAL == toDouble(pToken, &dv, &endptr)) {
- return buildSyntaxErrMsg(pMsgBuf, "illegal double data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "illegal double data", pToken->z);
}
if (((dv == HUGE_VAL || dv == -HUGE_VAL) && errno == ERANGE) || isinf(dv) || isnan(dv)) {
- return buildSyntaxErrMsg(pMsgBuf, "illegal double data", pToken->z);
+ return buildSyntaxErrMsg(&pCxt->msg, "illegal double data", pToken->z);
}
-
- *(double*)(&val->i64) = dv;
- break;
+ return func(&pCxt->msg, &dv, pSchema->bytes, param);
}
case TSDB_DATA_TYPE_BINARY: {
// Too long values will raise the invalid sql error message
if (pToken->n + VARSTR_HEADER_SIZE > pSchema->bytes) {
- return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
+ return generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
}
- val->pData = strdup(pToken->z);
- val->nData = pToken->n;
- break;
+
+ return func(&pCxt->msg, pToken->z, pToken->n, param);
}
case TSDB_DATA_TYPE_NCHAR: {
- int32_t output = 0;
- void* p = taosMemoryCalloc(1, pSchema->bytes - VARSTR_HEADER_SIZE);
- if (p == NULL) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- if (!taosMbsToUcs4(pToken->z, pToken->n, (TdUcs4*)(p), pSchema->bytes - VARSTR_HEADER_SIZE, &output)) {
- if (errno == E2BIG) {
- taosMemoryFree(p);
- return generateSyntaxErrMsg(pMsgBuf, TSDB_CODE_PAR_VALUE_TOO_LONG, pSchema->name);
- }
- char buf[512] = {0};
- snprintf(buf, tListLen(buf), " taosMbsToUcs4 error:%s", strerror(errno));
- taosMemoryFree(p);
- return buildSyntaxErrMsg(pMsgBuf, buf, pToken->z);
+ return func(&pCxt->msg, pToken->z, pToken->n, param);
+ }
+ case TSDB_DATA_TYPE_JSON: {
+ if (pToken->n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
+ return buildSyntaxErrMsg(&pCxt->msg, "json string too long than 4095", pToken->z);
}
- val->pData = p;
- val->nData = output;
- break;
+ return func(&pCxt->msg, pToken->z, pToken->n, param);
}
case TSDB_DATA_TYPE_TIMESTAMP: {
- if (parseTime(end, pToken, timePrec, &iv, pMsgBuf) != TSDB_CODE_SUCCESS) {
- return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp", pToken->z);
+ int64_t tmpVal;
+ if (parseTime(pSql, pToken, timePrec, &tmpVal, &pCxt->msg) != TSDB_CODE_SUCCESS) {
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid timestamp", pToken->z);
}
- val->i64 = iv;
- break;
+ return func(&pCxt->msg, &tmpVal, pSchema->bytes, param);
}
}
- return TSDB_CODE_SUCCESS;
+ return TSDB_CODE_FAILED;
}
-// pSql -> tag1_value, ...)
-static int32_t parseTagsClause(SInsertParseContext* pCxt, SSchema* pSchema, uint8_t precision, const char* tName) {
- int32_t code = TSDB_CODE_SUCCESS;
- SArray* pTagVals = taosArrayInit(pCxt->tags.numOfBound, sizeof(STagVal));
- SArray* tagName = taosArrayInit(8, TSDB_COL_NAME_LEN);
- SToken sToken;
- bool isParseBindParam = false;
- bool isJson = false;
- STag* pTag = NULL;
- for (int i = 0; i < pCxt->tags.numOfBound; ++i) {
- NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
-
- if (sToken.type == TK_NK_QUESTION) {
- isParseBindParam = true;
- if (NULL == pCxt->pStmtCb) {
- code = buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", sToken.z);
- break;
- }
-
- continue;
- }
-
- if (isParseBindParam) {
- code = buildInvalidOperationMsg(&pCxt->msg, "no mix usage for ? and tag values");
- break;
- }
-
- SSchema* pTagSchema = &pSchema[pCxt->tags.boundColumns[i]];
- char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // todo this can be optimize with parse column
- code = checkAndTrimValue(&sToken, tmpTokenBuf, &pCxt->msg);
- if (TSDB_CODE_SUCCESS == code) {
- if (!isNullValue(pTagSchema->type, &sToken)) {
- taosArrayPush(tagName, pTagSchema->name);
- }
- if (pTagSchema->type == TSDB_DATA_TYPE_JSON) {
- isJson = true;
- if (sToken.n > (TSDB_MAX_JSON_TAG_LEN - VARSTR_HEADER_SIZE) / TSDB_NCHAR_SIZE) {
- code = buildSyntaxErrMsg(&pCxt->msg, "json string too long than 4095", sToken.z);
- break;
- }
- if (isNullValue(pTagSchema->type, &sToken)) {
- code = tTagNew(pTagVals, 1, true, &pTag);
- } else {
- code = parseJsontoTagData(sToken.z, pTagVals, &pTag, &pCxt->msg);
- }
- } else {
- STagVal val = {0};
- code = parseTagToken(&pCxt->pSql, &sToken, pTagSchema, precision, &val, &pCxt->msg);
- if (TSDB_CODE_SUCCESS == code) {
- taosArrayPush(pTagVals, &val);
- }
- }
- }
- if (TSDB_CODE_SUCCESS != code) {
- break;
+static int32_t parseValueToken(SInsertParseContext* pCxt, const char** pSql, SToken* pToken, SSchema* pSchema,
+ int16_t timePrec, _row_append_fn_t func, void* param) {
+ int32_t code = checkAndTrimValue(pToken, pCxt->tmpTokenBuf, &pCxt->msg);
+ if (TSDB_CODE_SUCCESS == code && isNullValue(pSchema->type, pToken)) {
+ if (TSDB_DATA_TYPE_TIMESTAMP == pSchema->type && PRIMARYKEY_TIMESTAMP_COL_ID == pSchema->colId) {
+ return buildSyntaxErrMsg(&pCxt->msg, "primary timestamp should not be null", pToken->z);
}
- }
-
- if (TSDB_CODE_SUCCESS == code && !isParseBindParam && !isJson) {
- code = tTagNew(pTagVals, 1, false, &pTag);
- }
- if (TSDB_CODE_SUCCESS == code && !isParseBindParam) {
- insBuildCreateTbReq(&pCxt->createTblReq, tName, pTag, pCxt->pTableMeta->suid, pCxt->sTableName, tagName,
- pCxt->pTableMeta->tableInfo.numOfTags);
- pTag = NULL;
- }
-
- for (int i = 0; i < taosArrayGetSize(pTagVals); ++i) {
- STagVal* p = (STagVal*)taosArrayGet(pTagVals, i);
- if (IS_VAR_DATA_TYPE(p->type)) {
- taosMemoryFreeClear(p->pData);
- }
+ return func(&pCxt->msg, NULL, 0, param);
}
- taosArrayDestroy(pTagVals);
- taosArrayDestroy(tagName);
- tTagFree(pTag);
- return code;
-}
-static int32_t storeTableMeta(SInsertParseContext* pCxt, SHashObj* pHash, int32_t tbNo, SName* pTableName,
- const char* pName, int32_t len, STableMeta* pMeta) {
- SVgroupInfo vg;
- CHECK_CODE(getTableVgroup(pCxt, tbNo, pTableName, &vg));
- CHECK_CODE(taosHashPut(pCxt->pVgroupsHashObj, (const char*)&vg.vgId, sizeof(vg.vgId), (char*)&vg, sizeof(vg)));
-
- pMeta->uid = tbNo;
- pMeta->vgId = vg.vgId;
- pMeta->tableType = TSDB_CHILD_TABLE;
-
- STableMeta* pBackup = NULL;
- if (TSDB_CODE_SUCCESS != cloneTableMeta(pMeta, &pBackup)) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ if (TSDB_CODE_SUCCESS == code && IS_NUMERIC_TYPE(pSchema->type) && pToken->n == 0) {
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid numeric data", pToken->z);
}
- return taosHashPut(pHash, pName, len, &pBackup, POINTER_BYTES);
-}
-static int32_t skipParentheses(SInsertParseSyntaxCxt* pCxt) {
- SToken sToken;
- int32_t expectRightParenthesis = 1;
- while (1) {
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_LP == sToken.type) {
- ++expectRightParenthesis;
- } else if (TK_NK_RP == sToken.type && 0 == --expectRightParenthesis) {
- break;
- }
- if (0 == sToken.n) {
- return buildSyntaxErrMsg(&pCxt->msg, ") expected", NULL);
- }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseValueTokenImpl(pCxt, pSql, pToken, pSchema, timePrec, func, param);
}
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t skipBoundColumns(SInsertParseSyntaxCxt* pCxt) { return skipParentheses(pCxt); }
-
-static int32_t ignoreBoundColumns(SInsertParseContext* pCxt) {
- SInsertParseSyntaxCxt cxt = {.pComCxt = pCxt->pComCxt, .pSql = pCxt->pSql, .msg = pCxt->msg, .pMetaCache = NULL};
- int32_t code = skipBoundColumns(&cxt);
- pCxt->pSql = cxt.pSql;
- return code;
-}
-
-static int32_t skipUsingClause(SInsertParseSyntaxCxt* pCxt);
-// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
-static int32_t ignoreAutoCreateTableClause(SInsertParseContext* pCxt) {
- SToken sToken;
- NEXT_TOKEN(pCxt->pSql, sToken);
- SInsertParseSyntaxCxt cxt = {.pComCxt = pCxt->pComCxt, .pSql = pCxt->pSql, .msg = pCxt->msg, .pMetaCache = NULL};
- int32_t code = skipUsingClause(&cxt);
- pCxt->pSql = cxt.pSql;
return code;
}
-static int32_t parseTableOptions(SInsertParseContext* pCxt) {
- do {
- int32_t index = 0;
- SToken sToken;
- NEXT_TOKEN_KEEP_SQL(pCxt->pSql, sToken, index);
- if (TK_TTL == sToken.type) {
- pCxt->pSql += index;
- NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
- if (TK_NK_INTEGER != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, "Invalid option ttl", sToken.z);
- }
- pCxt->createTblReq.ttl = taosStr2Int32(sToken.z, NULL, 10);
- if (pCxt->createTblReq.ttl < 0) {
- return buildSyntaxErrMsg(&pCxt->msg, "Invalid option ttl", sToken.z);
- }
- } else if (TK_COMMENT == sToken.type) {
- pCxt->pSql += index;
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_STRING != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, "Invalid option comment", sToken.z);
- }
- if (sToken.n >= TSDB_TB_COMMENT_LEN) {
- return buildSyntaxErrMsg(&pCxt->msg, "comment too long", sToken.z);
- }
- int32_t len = trimString(sToken.z, sToken.n, pCxt->tmpTokenBuf, TSDB_TB_COMMENT_LEN);
- pCxt->createTblReq.comment = strndup(pCxt->tmpTokenBuf, len);
- if (NULL == pCxt->createTblReq.comment) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- pCxt->createTblReq.commentLen = len;
- } else {
- break;
- }
- } while (1);
- return TSDB_CODE_SUCCESS;
-}
-
-// pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
-static int32_t parseUsingClause(SInsertParseContext* pCxt, int32_t tbNo, SName* name, char* tbFName) {
- int32_t len = strlen(tbFName);
- STableMeta** pMeta = taosHashGet(pCxt->pSubTableHashObj, tbFName, len);
- if (NULL != pMeta) {
- CHECK_CODE(ignoreAutoCreateTableClause(pCxt));
- return cloneTableMeta(*pMeta, &pCxt->pTableMeta);
- }
-
- SToken sToken;
- // pSql -> stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)
- NEXT_TOKEN(pCxt->pSql, sToken);
-
- SName sname;
- CHECK_CODE(insCreateSName(&sname, &sToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
- char dbFName[TSDB_DB_FNAME_LEN];
- tNameGetFullDbName(&sname, dbFName);
- strcpy(pCxt->sTableName, sname.tname);
-
- CHECK_CODE(getSTableMeta(pCxt, tbNo, &sname));
- if (TSDB_SUPER_TABLE != pCxt->pTableMeta->tableType) {
- return buildInvalidOperationMsg(&pCxt->msg, "create table only from super table is allowed");
- }
- CHECK_CODE(storeTableMeta(pCxt, pCxt->pSubTableHashObj, tbNo, name, tbFName, len, pCxt->pTableMeta));
-
- SSchema* pTagsSchema = getTableTagSchema(pCxt->pTableMeta);
- insSetBoundColumnInfo(&pCxt->tags, pTagsSchema, getNumOfTags(pCxt->pTableMeta));
-
- // pSql -> [(tag1_name, ...)] TAGS (tag1_value, ...)
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_LP == sToken.type) {
- CHECK_CODE(parseBoundColumns(pCxt, &pCxt->tags, pTagsSchema));
- NEXT_TOKEN(pCxt->pSql, sToken);
- }
-
- if (TK_TAGS != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, "TAGS is expected", sToken.z);
- }
- // pSql -> (tag1_value, ...)
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_LP != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, "( is expected", sToken.z);
- }
- CHECK_CODE(parseTagsClause(pCxt, pTagsSchema, getTableInfo(pCxt->pTableMeta).precision, name->tname));
- NEXT_VALID_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_COMMA == sToken.type) {
- return generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_TAGS_NOT_MATCHED);
- } else if (TK_NK_RP != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, ") is expected", sToken.z);
- }
-
- return parseTableOptions(pCxt);
-}
-
-static int parseOneRow(SInsertParseContext* pCxt, STableDataBlocks* pDataBlocks, int16_t timePrec, bool* gotRow,
- char* tmpTokenBuf) {
- SParsedDataColInfo* spd = &pDataBlocks->boundColumnInfo;
- SRowBuilder* pBuilder = &pDataBlocks->rowBuilder;
- STSRow* row = (STSRow*)(pDataBlocks->pData + pDataBlocks->size); // skip the SSubmitBlk header
+static int parseOneRow(SInsertParseContext* pCxt, const char** pSql, STableDataBlocks* pDataBuf, bool* pGotRow,
+ SToken* pToken) {
+ SRowBuilder* pBuilder = &pDataBuf->rowBuilder;
+ STSRow* row = (STSRow*)(pDataBuf->pData + pDataBuf->size); // skip the SSubmitBlk header
+ SParsedDataColInfo* pCols = &pDataBuf->boundColumnInfo;
+ bool isParseBindParam = false;
+ SSchema* pSchemas = getTableColumnSchema(pDataBuf->pTableMeta);
+ SMemParam param = {.rb = pBuilder};
- tdSRowResetBuf(pBuilder, row);
-
- bool isParseBindParam = false;
- SSchema* schema = getTableColumnSchema(pDataBlocks->pTableMeta);
- SMemParam param = {.rb = pBuilder};
- SToken sToken = {0};
+ int32_t code = tdSRowResetBuf(pBuilder, row);
// 1. set the parsed value from sql string
- for (int i = 0; i < spd->numOfBound; ++i) {
- NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
- SSchema* pSchema = &schema[spd->boundColumns[i]];
+ for (int i = 0; i < pCols->numOfBound && TSDB_CODE_SUCCESS == code; ++i) {
+ NEXT_TOKEN_WITH_PREV(*pSql, *pToken);
+ SSchema* pSchema = &pSchemas[pCols->boundColumns[i]];
- if (sToken.type == TK_NK_QUESTION) {
+ if (pToken->type == TK_NK_QUESTION) {
isParseBindParam = true;
- if (NULL == pCxt->pStmtCb) {
- return buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", sToken.z);
+ if (NULL == pCxt->pComCxt->pStmtCb) {
+ code = buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", pToken->z);
}
-
continue;
}
- if (TK_NK_RP == sToken.type) {
- return generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_INVALID_COLUMNS_NUM);
+ if (TSDB_CODE_SUCCESS == code && TK_NK_RP == pToken->type) {
+ code = generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_INVALID_COLUMNS_NUM);
}
- if (isParseBindParam) {
- return buildInvalidOperationMsg(&pCxt->msg, "no mix usage for ? and values");
+ if (TSDB_CODE_SUCCESS == code && isParseBindParam) {
+ code = buildInvalidOperationMsg(&pCxt->msg, "no mix usage for ? and values");
}
- param.schema = pSchema;
- insGetSTSRowAppendInfo(pBuilder->rowType, spd, i, ¶m.toffset, ¶m.colIdx);
- CHECK_CODE(
- parseValueToken(&pCxt->pSql, &sToken, pSchema, timePrec, tmpTokenBuf, insMemRowAppend, ¶m, &pCxt->msg));
+ if (TSDB_CODE_SUCCESS == code) {
+ param.schema = pSchema;
+ insGetSTSRowAppendInfo(pBuilder->rowType, pCols, i, ¶m.toffset, ¶m.colIdx);
+ code = parseValueToken(pCxt, pSql, pToken, pSchema, getTableInfo(pDataBuf->pTableMeta).precision, insMemRowAppend,
+ ¶m);
+ }
- if (i < spd->numOfBound - 1) {
- NEXT_VALID_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_COMMA != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, ", expected", sToken.z);
+ if (TSDB_CODE_SUCCESS == code && i < pCols->numOfBound - 1) {
+ NEXT_VALID_TOKEN(*pSql, *pToken);
+ if (TK_NK_COMMA != pToken->type) {
+ code = buildSyntaxErrMsg(&pCxt->msg, ", expected", pToken->z);
}
}
}
- TSKEY tsKey = TD_ROW_KEY(row);
- insCheckTimestamp(pDataBlocks, (const char*)&tsKey);
+ if (TSDB_CODE_SUCCESS == code) {
+ TSKEY tsKey = TD_ROW_KEY(row);
+ code = insCheckTimestamp(pDataBuf, (const char*)&tsKey);
+ }
- if (!isParseBindParam) {
+ if (TSDB_CODE_SUCCESS == code && !isParseBindParam) {
// set the null value for the columns that do not assign values
- if ((spd->numOfBound < spd->numOfCols) && TD_IS_TP_ROW(row)) {
+ if ((pCols->numOfBound < pCols->numOfCols) && TD_IS_TP_ROW(row)) {
pBuilder->hasNone = true;
}
tdSRowEnd(pBuilder);
- *gotRow = true;
+ *pGotRow = true;
#ifdef TD_DEBUG_PRINT_ROW
STSchema* pSTSchema = tdGetSTSChemaFromSSChema(schema, spd->numOfCols, 1);
@@ -981,8 +1226,7 @@ static int parseOneRow(SInsertParseContext* pCxt, STableDataBlocks* pDataBlocks,
#endif
}
- // *len = pBuilder->extendedRowSize;
- return TSDB_CODE_SUCCESS;
+ return code;
}
static int32_t allocateMemIfNeed(STableDataBlocks* pDataBlock, int32_t rowSize, int32_t* numOfRows) {
@@ -1014,84 +1258,82 @@ static int32_t allocateMemIfNeed(STableDataBlocks* pDataBlock, int32_t rowSize,
}
// pSql -> (field1_value, ...) [(field1_value2, ...) ...]
-static int32_t parseValues(SInsertParseContext* pCxt, STableDataBlocks* pDataBlock, int maxRows, int32_t* numOfRows) {
- STableComInfo tinfo = getTableInfo(pDataBlock->pTableMeta);
- int32_t extendedRowSize = insGetExtendedRowSize(pDataBlock);
- CHECK_CODE(
- insInitRowBuilder(&pDataBlock->rowBuilder, pDataBlock->pTableMeta->sversion, &pDataBlock->boundColumnInfo));
-
- (*numOfRows) = 0;
- // char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // used for deleting Escape character: \\, \', \"
- SToken sToken;
- while (1) {
+static int32_t parseValues(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks* pDataBuf,
+ int32_t maxRows, int32_t* pNumOfRows, SToken* pToken) {
+ int32_t code = insInitRowBuilder(&pDataBuf->rowBuilder, pDataBuf->pTableMeta->sversion, &pDataBuf->boundColumnInfo);
+
+ int32_t extendedRowSize = insGetExtendedRowSize(pDataBuf);
+ (*pNumOfRows) = 0;
+ while (TSDB_CODE_SUCCESS == code) {
int32_t index = 0;
- NEXT_TOKEN_KEEP_SQL(pCxt->pSql, sToken, index);
- if (TK_NK_LP != sToken.type) {
+ NEXT_TOKEN_KEEP_SQL(pStmt->pSql, *pToken, index);
+ if (TK_NK_LP != pToken->type) {
break;
}
- pCxt->pSql += index;
+ pStmt->pSql += index;
- if ((*numOfRows) >= maxRows || pDataBlock->size + extendedRowSize >= pDataBlock->nAllocSize) {
- int32_t tSize;
- CHECK_CODE(allocateMemIfNeed(pDataBlock, extendedRowSize, &tSize));
- ASSERT(tSize >= maxRows);
- maxRows = tSize;
+ if ((*pNumOfRows) >= maxRows || pDataBuf->size + extendedRowSize >= pDataBuf->nAllocSize) {
+ code = allocateMemIfNeed(pDataBuf, extendedRowSize, &maxRows);
}
bool gotRow = false;
- CHECK_CODE(parseOneRow(pCxt, pDataBlock, tinfo.precision, &gotRow, pCxt->tmpTokenBuf));
- if (gotRow) {
- pDataBlock->size += extendedRowSize; // len;
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseOneRow(pCxt, &pStmt->pSql, pDataBuf, &gotRow, pToken);
}
- NEXT_VALID_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_COMMA == sToken.type) {
- return generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_INVALID_COLUMNS_NUM);
- } else if (TK_NK_RP != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, ") expected", sToken.z);
+ if (TSDB_CODE_SUCCESS == code) {
+ NEXT_VALID_TOKEN(pStmt->pSql, *pToken);
+ if (TK_NK_COMMA == pToken->type) {
+ code = generateSyntaxErrMsg(&pCxt->msg, TSDB_CODE_PAR_INVALID_COLUMNS_NUM);
+ } else if (TK_NK_RP != pToken->type) {
+ code = buildSyntaxErrMsg(&pCxt->msg, ") expected", pToken->z);
+ }
}
- if (gotRow) {
- (*numOfRows)++;
+ if (TSDB_CODE_SUCCESS == code && gotRow) {
+ pDataBuf->size += extendedRowSize;
+ (*pNumOfRows)++;
}
}
- if (0 == (*numOfRows) && (!TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT))) {
- return buildSyntaxErrMsg(&pCxt->msg, "no any data points", NULL);
+ if (TSDB_CODE_SUCCESS == code && 0 == (*pNumOfRows) &&
+ (!TSDB_QUERY_HAS_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT))) {
+ code = buildSyntaxErrMsg(&pCxt->msg, "no any data points", NULL);
}
- return TSDB_CODE_SUCCESS;
+ return code;
}
-static int32_t parseValuesClause(SInsertParseContext* pCxt, STableDataBlocks* dataBuf) {
- int32_t maxNumOfRows;
- CHECK_CODE(allocateMemIfNeed(dataBuf, insGetExtendedRowSize(dataBuf), &maxNumOfRows));
-
+// VALUES (field1_value, ...) [(field1_value2, ...) ...]
+static int32_t parseValuesClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks* pDataBuf,
+ SToken* pToken) {
+ int32_t maxNumOfRows = 0;
int32_t numOfRows = 0;
- CHECK_CODE(parseValues(pCxt, dataBuf, maxNumOfRows, &numOfRows));
-
- SSubmitBlk* pBlocks = (SSubmitBlk*)(dataBuf->pData);
- if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, dataBuf, numOfRows)) {
- return buildInvalidOperationMsg(&pCxt->msg,
- "too many rows in sql, total number of rows should be less than INT32_MAX");
+ int32_t code = allocateMemIfNeed(pDataBuf, insGetExtendedRowSize(pDataBuf), &maxNumOfRows);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseValues(pCxt, pStmt, pDataBuf, maxNumOfRows, &numOfRows, pToken);
}
-
- dataBuf->numOfTables = 1;
- pCxt->totalNum += numOfRows;
- return TSDB_CODE_SUCCESS;
+ if (TSDB_CODE_SUCCESS == code) {
+ code = insSetBlockInfo((SSubmitBlk*)(pDataBuf->pData), pDataBuf, numOfRows, &pCxt->msg);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ pDataBuf->numOfTables = 1;
+ pStmt->totalRowsNum += numOfRows;
+ pStmt->totalTbNum += 1;
+ TSDB_QUERY_SET_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_INSERT);
+ }
+ return code;
}
-static int32_t parseCsvFile(SInsertParseContext* pCxt, TdFilePtr fp, STableDataBlocks* pDataBlock, int maxRows,
- int32_t* numOfRows) {
- STableComInfo tinfo = getTableInfo(pDataBlock->pTableMeta);
- int32_t extendedRowSize = insGetExtendedRowSize(pDataBlock);
- CHECK_CODE(
- insInitRowBuilder(&pDataBlock->rowBuilder, pDataBlock->pTableMeta->sversion, &pDataBlock->boundColumnInfo));
+static int32_t parseCsvFile(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks* pDataBuf,
+ int maxRows, int32_t* pNumOfRows) {
+ int32_t code = insInitRowBuilder(&pDataBuf->rowBuilder, pDataBuf->pTableMeta->sversion, &pDataBuf->boundColumnInfo);
- (*numOfRows) = 0;
- char tmpTokenBuf[TSDB_MAX_BYTES_PER_ROW] = {0}; // used for deleting Escape character: \\, \', \"
+ int32_t extendedRowSize = insGetExtendedRowSize(pDataBuf);
+ (*pNumOfRows) = 0;
char* pLine = NULL;
int64_t readLen = 0;
- while ((readLen = taosGetLineFile(fp, &pLine)) != -1) {
+ pStmt->fileProcessing = false;
+ while (TSDB_CODE_SUCCESS == code && (readLen = taosGetLineFile(pStmt->fp, &pLine)) != -1) {
if (('\r' == pLine[readLen - 1]) || ('\n' == pLine[readLen - 1])) {
pLine[--readLen] = '\0';
}
@@ -1100,588 +1342,571 @@ static int32_t parseCsvFile(SInsertParseContext* pCxt, TdFilePtr fp, STableDataB
continue;
}
- if ((*numOfRows) >= maxRows || pDataBlock->size + extendedRowSize >= pDataBlock->nAllocSize) {
- int32_t tSize;
- CHECK_CODE(allocateMemIfNeed(pDataBlock, extendedRowSize, &tSize));
- ASSERT(tSize >= maxRows);
- maxRows = tSize;
+ if ((*pNumOfRows) >= maxRows || pDataBuf->size + extendedRowSize >= pDataBuf->nAllocSize) {
+ code = allocateMemIfNeed(pDataBuf, extendedRowSize, &maxRows);
}
- strtolower(pLine, pLine);
- char* pRawSql = pCxt->pSql;
- pCxt->pSql = pLine;
- bool gotRow = false;
- int32_t code = parseOneRow(pCxt, pDataBlock, tinfo.precision, &gotRow, tmpTokenBuf);
- if (TSDB_CODE_SUCCESS != code) {
- pCxt->pSql = pRawSql;
- return code;
+ bool gotRow = false;
+ if (TSDB_CODE_SUCCESS == code) {
+ SToken token;
+ strtolower(pLine, pLine);
+ const char* pRow = pLine;
+ code = parseOneRow(pCxt, (const char**)&pRow, pDataBuf, &gotRow, &token);
}
- if (gotRow) {
- pDataBlock->size += extendedRowSize; // len;
- (*numOfRows)++;
+
+ if (TSDB_CODE_SUCCESS == code && gotRow) {
+ pDataBuf->size += extendedRowSize;
+ (*pNumOfRows)++;
}
- pCxt->pSql = pRawSql;
- if (pDataBlock->nAllocSize > tsMaxMemUsedByInsert * 1024 * 1024) {
+ if (TSDB_CODE_SUCCESS == code && pDataBuf->nAllocSize > tsMaxMemUsedByInsert * 1024 * 1024) {
+ pStmt->fileProcessing = true;
break;
}
}
+ taosMemoryFree(pLine);
- if (0 == (*numOfRows) && (!TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT))) {
- return buildSyntaxErrMsg(&pCxt->msg, "no any data points", NULL);
+ if (TSDB_CODE_SUCCESS == code && 0 == (*pNumOfRows) &&
+ (!TSDB_QUERY_HAS_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) && !pStmt->fileProcessing) {
+ code = buildSyntaxErrMsg(&pCxt->msg, "no any data points", NULL);
}
- return TSDB_CODE_SUCCESS;
+ return code;
}
-static int32_t parseDataFromFileAgain(SInsertParseContext* pCxt, int16_t tableNo, const SName* pTableName,
- STableDataBlocks* dataBuf) {
- int32_t maxNumOfRows;
- CHECK_CODE(allocateMemIfNeed(dataBuf, insGetExtendedRowSize(dataBuf), &maxNumOfRows));
-
+static int32_t parseDataFromFileImpl(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks* pDataBuf) {
+ int32_t maxNumOfRows = 0;
int32_t numOfRows = 0;
- CHECK_CODE(parseCsvFile(pCxt, pCxt->pComCxt->csvCxt.fp, dataBuf, maxNumOfRows, &numOfRows));
-
- SSubmitBlk* pBlocks = (SSubmitBlk*)(dataBuf->pData);
- if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, dataBuf, numOfRows)) {
- return buildInvalidOperationMsg(&pCxt->msg,
- "too many rows in sql, total number of rows should be less than INT32_MAX");
+ int32_t code = allocateMemIfNeed(pDataBuf, insGetExtendedRowSize(pDataBuf), &maxNumOfRows);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseCsvFile(pCxt, pStmt, pDataBuf, maxNumOfRows, &numOfRows);
}
-
- if (!taosEOFFile(pCxt->pComCxt->csvCxt.fp)) {
- pCxt->pComCxt->needMultiParse = true;
- pCxt->pComCxt->csvCxt.tableNo = tableNo;
- memcpy(&pCxt->pComCxt->csvCxt.tableName, pTableName, sizeof(SName));
- pCxt->pComCxt->csvCxt.pLastSqlPos = pCxt->pSql;
+ if (TSDB_CODE_SUCCESS == code) {
+ code = insSetBlockInfo((SSubmitBlk*)(pDataBuf->pData), pDataBuf, numOfRows, &pCxt->msg);
}
-
- dataBuf->numOfTables = 1;
- pCxt->totalNum += numOfRows;
- return TSDB_CODE_SUCCESS;
+ if (TSDB_CODE_SUCCESS == code) {
+ pDataBuf->numOfTables = 1;
+ pStmt->totalRowsNum += numOfRows;
+ pStmt->totalTbNum += 1;
+ TSDB_QUERY_SET_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_FILE_INSERT);
+ if (!pStmt->fileProcessing) {
+ taosCloseFile(&pStmt->fp);
+ } else {
+ parserDebug("0x%" PRIx64 " insert from csv. File is too large, do it in batches.", pCxt->pComCxt->requestId);
+ }
+ }
+ return code;
}
-static int32_t parseDataFromFile(SInsertParseContext* pCxt, int16_t tableNo, const SName* pTableName, SToken filePath,
- STableDataBlocks* dataBuf) {
+static int32_t parseDataFromFile(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SToken* pFilePath,
+ STableDataBlocks* pDataBuf) {
char filePathStr[TSDB_FILENAME_LEN] = {0};
- if (TK_NK_STRING == filePath.type) {
- trimString(filePath.z, filePath.n, filePathStr, sizeof(filePathStr));
+ if (TK_NK_STRING == pFilePath->type) {
+ trimString(pFilePath->z, pFilePath->n, filePathStr, sizeof(filePathStr));
} else {
- strncpy(filePathStr, filePath.z, filePath.n);
+ strncpy(filePathStr, pFilePath->z, pFilePath->n);
}
- pCxt->pComCxt->csvCxt.fp = taosOpenFile(filePathStr, TD_FILE_READ | TD_FILE_STREAM);
- if (NULL == pCxt->pComCxt->csvCxt.fp) {
+ pStmt->fp = taosOpenFile(filePathStr, TD_FILE_READ | TD_FILE_STREAM);
+ if (NULL == pStmt->fp) {
return TAOS_SYSTEM_ERROR(errno);
}
- return parseDataFromFileAgain(pCxt, tableNo, pTableName, dataBuf);
+ return parseDataFromFileImpl(pCxt, pStmt, pDataBuf);
}
-static void destroyInsertParseContextForTable(SInsertParseContext* pCxt) {
- if (!pCxt->pComCxt->needMultiParse) {
- taosCloseFile(&pCxt->pComCxt->csvCxt.fp);
+static int32_t parseFileClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks* pDataBuf,
+ SToken* pToken) {
+ NEXT_TOKEN(pStmt->pSql, *pToken);
+ if (0 == pToken->n || (TK_NK_STRING != pToken->type && TK_NK_ID != pToken->type)) {
+ return buildSyntaxErrMsg(&pCxt->msg, "file path is required following keyword FILE", pToken->z);
}
- taosMemoryFreeClear(pCxt->pTableMeta);
- destroyBoundColumnInfo(&pCxt->tags);
- tdDestroySVCreateTbReq(&pCxt->createTblReq);
+ return parseDataFromFile(pCxt, pStmt, pToken, pDataBuf);
}
-static void destroySubTableHashElem(void* p) { taosMemoryFree(*(STableMeta**)p); }
-
-static void destroyInsertParseContext(SInsertParseContext* pCxt) {
- destroyInsertParseContextForTable(pCxt);
- taosHashCleanup(pCxt->pVgroupsHashObj);
- taosHashCleanup(pCxt->pSubTableHashObj);
- taosHashCleanup(pCxt->pTableNameHashObj);
- taosHashCleanup(pCxt->pDbFNameHashObj);
-
- insDestroyBlockHashmap(pCxt->pTableBlockHashObj);
- insDestroyBlockArrayList(pCxt->pVgDataBlocks);
+// VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
+static int32_t parseDataClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, STableDataBlocks* pDataBuf) {
+ SToken token;
+ NEXT_TOKEN(pStmt->pSql, token);
+ switch (token.type) {
+ case TK_VALUES:
+ return parseValuesClause(pCxt, pStmt, pDataBuf, &token);
+ case TK_FILE:
+ return parseFileClause(pCxt, pStmt, pDataBuf, &token);
+ default:
+ break;
+ }
+ return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", token.z);
}
-static int32_t parseTableName(SInsertParseContext* pCxt, SToken* pTbnameToken, SName* pName, char* pDbFName,
- char* pTbFName) {
- int32_t code = insCreateSName(pName, pTbnameToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
+// input pStmt->pSql:
+// 1. [(tag1_name, ...)] ...
+// 2. VALUES ... | FILE ...
+static int32_t parseInsertTableClauseBottom(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ STableDataBlocks* pDataBuf = NULL;
+ int32_t code = parseSchemaClauseBottom(pCxt, pStmt, &pDataBuf);
if (TSDB_CODE_SUCCESS == code) {
- tNameExtractFullName(pName, pTbFName);
- code = taosHashPut(pCxt->pTableNameHashObj, pTbFName, strlen(pTbFName), pName, sizeof(SName));
- }
- if (TSDB_CODE_SUCCESS == code) {
- tNameGetFullDbName(pName, pDbFName);
- code = taosHashPut(pCxt->pDbFNameHashObj, pDbFName, strlen(pDbFName), pDbFName, TSDB_DB_FNAME_LEN);
+ code = parseDataClause(pCxt, pStmt, pDataBuf);
}
return code;
}
-// tb_name
-// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
-// [(field1_name, ...)]
-// VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
-// [...];
-static int32_t parseInsertBody(SInsertParseContext* pCxt) {
- int32_t tbNum = 0;
- SName name;
- char tbFName[TSDB_TABLE_FNAME_LEN];
- char dbFName[TSDB_DB_FNAME_LEN];
- bool autoCreateTbl = false;
-
- // for each table
- while (1) {
- SToken sToken;
- char* tbName = NULL;
-
- // pSql -> tb_name ...
- NEXT_TOKEN(pCxt->pSql, sToken);
-
- // no data in the sql string anymore.
- if (sToken.n == 0) {
- if (sToken.type && pCxt->pSql[0]) {
- return buildSyntaxErrMsg(&pCxt->msg, "invalid charactor in SQL", sToken.z);
- }
+static void resetEnvPreTable(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ destroyBoundColumnInfo(&pCxt->tags);
+ taosMemoryFreeClear(pStmt->pTableMeta);
+ tdDestroySVCreateTbReq(&pStmt->createTblReq);
+ pCxt->missCache = false;
+ pCxt->usingDuplicateTable = false;
+ pStmt->pBoundCols = NULL;
+ pStmt->usingTableProcessing = false;
+ pStmt->fileProcessing = false;
+}
- if (0 == pCxt->totalNum && (!TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) &&
- !pCxt->pComCxt->needMultiParse) {
- return buildInvalidOperationMsg(&pCxt->msg, "no data in sql");
- }
- break;
- }
+// input pStmt->pSql: [(field1_name, ...)] [ USING ... ] VALUES ... | FILE ...
+static int32_t parseInsertTableClause(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SToken* pTbName) {
+ resetEnvPreTable(pCxt, pStmt);
+ int32_t code = parseSchemaClauseTop(pCxt, pStmt, pTbName);
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = parseInsertTableClauseBottom(pCxt, pStmt);
+ }
+ return code;
+}
- if (TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT) && tbNum > 0) {
- return buildInvalidOperationMsg(&pCxt->msg, "single table allowed in one stmt");
+static int32_t checkTableClauseFirstToken(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SToken* pTbName,
+ bool* pHasData) {
+ // no data in the sql string anymore.
+ if (0 == pTbName->n) {
+ if (0 != pTbName->type && '\0' != pStmt->pSql[0]) {
+ return buildSyntaxErrMsg(&pCxt->msg, "invalid charactor in SQL", pTbName->z);
}
- destroyInsertParseContextForTable(pCxt);
-
- if (TK_NK_QUESTION == sToken.type) {
- if (pCxt->pStmtCb) {
- CHECK_CODE((*pCxt->pStmtCb->getTbNameFn)(pCxt->pStmtCb->pStmt, &tbName));
-
- sToken.z = tbName;
- sToken.n = strlen(tbName);
- } else {
- return buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", sToken.z);
- }
+ if (0 == pStmt->totalRowsNum && (!TSDB_QUERY_HAS_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT))) {
+ return buildInvalidOperationMsg(&pCxt->msg, "no data in sql");
}
- SToken tbnameToken = sToken;
- NEXT_TOKEN(pCxt->pSql, sToken);
+ *pHasData = false;
+ return TSDB_CODE_SUCCESS;
+ }
- if (!pCxt->pComCxt->async || TK_USING == sToken.type) {
- CHECK_CODE(parseTableName(pCxt, &tbnameToken, &name, dbFName, tbFName));
- }
+ if (TSDB_QUERY_HAS_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT) && pStmt->totalTbNum > 0) {
+ return buildInvalidOperationMsg(&pCxt->msg, "single table allowed in one stmt");
+ }
- bool existedUsing = false;
- // USING clause
- if (TK_USING == sToken.type) {
- existedUsing = true;
- CHECK_CODE(parseUsingClause(pCxt, tbNum, &name, tbFName));
- NEXT_TOKEN(pCxt->pSql, sToken);
- autoCreateTbl = true;
+ if (TK_NK_QUESTION == pTbName->type) {
+ if (NULL == pCxt->pComCxt->pStmtCb) {
+ return buildSyntaxErrMsg(&pCxt->msg, "? only used in stmt", pTbName->z);
}
- char* pBoundColsStart = NULL;
- if (TK_NK_LP == sToken.type) {
- // pSql -> field1_name, ...)
- pBoundColsStart = pCxt->pSql;
- CHECK_CODE(ignoreBoundColumns(pCxt));
- NEXT_TOKEN(pCxt->pSql, sToken);
+ char* tbName = NULL;
+ int32_t code = (*pCxt->pComCxt->pStmtCb->getTbNameFn)(pCxt->pComCxt->pStmtCb->pStmt, &tbName);
+ if (TSDB_CODE_SUCCESS == code) {
+ pTbName->z = tbName;
+ pTbName->n = strlen(tbName);
+ } else {
+ return code;
}
+ }
- if (TK_USING == sToken.type) {
- if (pCxt->pComCxt->async) {
- CHECK_CODE(parseTableName(pCxt, &tbnameToken, &name, dbFName, tbFName));
- }
- CHECK_CODE(parseUsingClause(pCxt, tbNum, &name, tbFName));
- NEXT_TOKEN(pCxt->pSql, sToken);
- autoCreateTbl = true;
- } else if (!existedUsing) {
- CHECK_CODE(getTableMeta(pCxt, tbNum, &name));
- if (TSDB_SUPER_TABLE == pCxt->pTableMeta->tableType) {
- return buildInvalidOperationMsg(&pCxt->msg, "insert data into super table is not supported");
- }
- }
+ *pHasData = true;
+ return TSDB_CODE_SUCCESS;
+}
- STableDataBlocks* dataBuf = NULL;
- if (pCxt->pComCxt->async) {
- CHECK_CODE(insGetDataBlockFromList(pCxt->pTableBlockHashObj, &pCxt->pTableMeta->uid,
- sizeof(pCxt->pTableMeta->uid), TSDB_DEFAULT_PAYLOAD_SIZE, sizeof(SSubmitBlk),
- getTableInfo(pCxt->pTableMeta).rowSize, pCxt->pTableMeta, &dataBuf, NULL,
- &pCxt->createTblReq));
- } else {
- CHECK_CODE(insGetDataBlockFromList(pCxt->pTableBlockHashObj, tbFName, strlen(tbFName), TSDB_DEFAULT_PAYLOAD_SIZE,
- sizeof(SSubmitBlk), getTableInfo(pCxt->pTableMeta).rowSize, pCxt->pTableMeta,
- &dataBuf, NULL, &pCxt->createTblReq));
- }
+static int32_t setStmtInfo(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SParsedDataColInfo* tags = taosMemoryMalloc(sizeof(pCxt->tags));
+ if (NULL == tags) {
+ return TSDB_CODE_TSC_OUT_OF_MEMORY;
+ }
+ memcpy(tags, &pCxt->tags, sizeof(pCxt->tags));
- if (NULL != pBoundColsStart) {
- char* pCurrPos = pCxt->pSql;
- pCxt->pSql = pBoundColsStart;
- CHECK_CODE(parseBoundColumns(pCxt, &dataBuf->boundColumnInfo, getTableColumnSchema(pCxt->pTableMeta)));
- pCxt->pSql = pCurrPos;
- }
+ SStmtCallback* pStmtCb = pCxt->pComCxt->pStmtCb;
+ char tbFName[TSDB_TABLE_FNAME_LEN];
+ tNameExtractFullName(&pStmt->targetTableName, tbFName);
+ int32_t code = (*pStmtCb->setInfoFn)(pStmtCb->pStmt, pStmt->pTableMeta, tags, tbFName, pStmt->usingTableProcessing,
+ pStmt->pVgroupsHashObj, pStmt->pTableBlockHashObj, pStmt->usingTableName.tname);
- if (TK_VALUES == sToken.type) {
- // pSql -> (field1_value, ...) [(field1_value2, ...) ...]
- CHECK_CODE(parseValuesClause(pCxt, dataBuf));
- TSDB_QUERY_SET_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_INSERT);
+ memset(&pCxt->tags, 0, sizeof(pCxt->tags));
+ pStmt->pVgroupsHashObj = NULL;
+ pStmt->pTableBlockHashObj = NULL;
+ return code;
+}
- tbNum++;
- continue;
- }
+static int32_t parseInsertBodyBottom(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ if (TSDB_QUERY_HAS_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) {
+ return setStmtInfo(pCxt, pStmt);
+ }
- // FILE csv_file_path
- if (TK_FILE == sToken.type) {
- // pSql -> csv_file_path
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (0 == sToken.n || (TK_NK_STRING != sToken.type && TK_NK_ID != sToken.type)) {
- return buildSyntaxErrMsg(&pCxt->msg, "file path is required following keyword FILE", sToken.z);
- }
- CHECK_CODE(parseDataFromFile(pCxt, tbNum, &name, sToken, dataBuf));
- pCxt->pOutput->insertType = TSDB_QUERY_TYPE_FILE_INSERT;
+ // merge according to vgId
+ int32_t code = TSDB_CODE_SUCCESS;
+ if (taosHashGetSize(pStmt->pTableBlockHashObj) > 0) {
+ code = insMergeTableDataBlocks(pStmt->pTableBlockHashObj, &pStmt->pVgDataBlocks);
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = insBuildOutput(pStmt->pVgroupsHashObj, pStmt->pVgDataBlocks, &pStmt->pDataBlocks);
+ }
+ return code;
+}
- tbNum++;
- if (!pCxt->pComCxt->needMultiParse) {
- continue;
- } else {
- parserDebug("0x%" PRIx64 " insert from csv. File is too large, do it in batches.", pCxt->pComCxt->requestId);
- break;
- }
+// tb_name
+// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
+// [(field1_name, ...)]
+// VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
+// [...];
+static int32_t parseInsertBody(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ SToken token;
+ int32_t code = TSDB_CODE_SUCCESS;
+ bool hasData = true;
+ // for each table
+ while (TSDB_CODE_SUCCESS == code && hasData && !pCxt->missCache && !pStmt->fileProcessing) {
+ // pStmt->pSql -> tb_name ...
+ NEXT_TOKEN(pStmt->pSql, token);
+ code = checkTableClauseFirstToken(pCxt, pStmt, &token, &hasData);
+ if (TSDB_CODE_SUCCESS == code && hasData) {
+ code = parseInsertTableClause(pCxt, pStmt, &token);
}
-
- return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", sToken.z);
}
- parserDebug("0x%" PRIx64 " insert input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum);
+ if (TSDB_CODE_SUCCESS == code && !pCxt->missCache) {
+ code = parseInsertBodyBottom(pCxt, pStmt);
+ }
+ return code;
+}
- if (TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) {
- SParsedDataColInfo* tags = taosMemoryMalloc(sizeof(pCxt->tags));
- if (NULL == tags) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
- }
- memcpy(tags, &pCxt->tags, sizeof(pCxt->tags));
- (*pCxt->pStmtCb->setInfoFn)(pCxt->pStmtCb->pStmt, pCxt->pTableMeta, tags, tbFName, autoCreateTbl,
- pCxt->pVgroupsHashObj, pCxt->pTableBlockHashObj, pCxt->sTableName);
+static void destroySubTableHashElem(void* p) { taosMemoryFree(*(STableMeta**)p); }
- memset(&pCxt->tags, 0, sizeof(pCxt->tags));
- pCxt->pVgroupsHashObj = NULL;
- pCxt->pTableBlockHashObj = NULL;
+static int32_t createVnodeModifOpStmt(SParseContext* pCxt, bool reentry, SNode** pOutput) {
+ SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIF_STMT);
+ if (NULL == pStmt) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
- return TSDB_CODE_SUCCESS;
+ if (pCxt->pStmtCb) {
+ TSDB_QUERY_SET_TYPE(pStmt->insertType, TSDB_QUERY_TYPE_STMT_INSERT);
}
+ pStmt->pSql = pCxt->pSql;
+ pStmt->freeHashFunc = insDestroyBlockHashmap;
+ pStmt->freeArrayFunc = insDestroyBlockArrayList;
- // merge according to vgId
- if (taosHashGetSize(pCxt->pTableBlockHashObj) > 0) {
- CHECK_CODE(insMergeTableDataBlocks(pCxt->pTableBlockHashObj, &pCxt->pVgDataBlocks));
- }
- return insBuildOutput(pCxt);
-}
-
-static int32_t parseInsertBodyAgain(SInsertParseContext* pCxt) {
- STableDataBlocks* dataBuf = NULL;
- CHECK_CODE(getTableMeta(pCxt, pCxt->pComCxt->csvCxt.tableNo, &pCxt->pComCxt->csvCxt.tableName));
- CHECK_CODE(insGetDataBlockFromList(pCxt->pTableBlockHashObj, &pCxt->pTableMeta->uid, sizeof(pCxt->pTableMeta->uid),
- TSDB_DEFAULT_PAYLOAD_SIZE, sizeof(SSubmitBlk),
- getTableInfo(pCxt->pTableMeta).rowSize, pCxt->pTableMeta, &dataBuf, NULL,
- &pCxt->createTblReq));
- CHECK_CODE(parseDataFromFileAgain(pCxt, pCxt->pComCxt->csvCxt.tableNo, &pCxt->pComCxt->csvCxt.tableName, dataBuf));
- if (taosEOFFile(pCxt->pComCxt->csvCxt.fp)) {
- CHECK_CODE(parseInsertBody(pCxt));
- pCxt->pComCxt->needMultiParse = false;
- return TSDB_CODE_SUCCESS;
+ if (!reentry) {
+ pStmt->pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
+ pStmt->pTableBlockHashObj =
+ taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
}
- parserDebug("0x%" PRIx64 " insert again input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum);
- // merge according to vgId
- if (taosHashGetSize(pCxt->pTableBlockHashObj) > 0) {
- CHECK_CODE(insMergeTableDataBlocks(pCxt->pTableBlockHashObj, &pCxt->pVgDataBlocks));
+ pStmt->pSubTableHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK);
+ pStmt->pTableNameHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK);
+ pStmt->pDbFNameHashObj = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK);
+ if ((!reentry && (NULL == pStmt->pVgroupsHashObj || NULL == pStmt->pTableBlockHashObj)) ||
+ NULL == pStmt->pSubTableHashObj || NULL == pStmt->pTableNameHashObj || NULL == pStmt->pDbFNameHashObj) {
+ nodesDestroyNode((SNode*)pStmt);
+ return TSDB_CODE_OUT_OF_MEMORY;
}
- return insBuildOutput(pCxt);
+
+ taosHashSetFreeFp(pStmt->pSubTableHashObj, destroySubTableHashElem);
+
+ *pOutput = (SNode*)pStmt;
+ return TSDB_CODE_SUCCESS;
}
-// INSERT INTO
-// tb_name
-// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...)]
-// [(field1_name, ...)]
-// VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
-// [...];
-int32_t parseInsertSql(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache) {
- SInsertParseContext context = {
- .pComCxt = pContext,
- .pSql = pContext->needMultiParse ? (char*)pContext->csvCxt.pLastSqlPos : (char*)pContext->pSql,
- .msg = {.buf = pContext->pMsg, .len = pContext->msgLen},
- .pTableMeta = NULL,
- .createTblReq = {0},
- .pSubTableHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK),
- .pTableNameHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK),
- .pDbFNameHashObj = taosHashInit(64, taosGetDefaultHashFunction(TSDB_DATA_TYPE_VARCHAR), true, HASH_NO_LOCK),
- .totalNum = 0,
- .pOutput = (SVnodeModifOpStmt*)nodesMakeNode(QUERY_NODE_VNODE_MODIF_STMT),
- .pStmtCb = pContext->pStmtCb,
- .pMetaCache = pMetaCache,
- .memElapsed = 0,
- .parRowElapsed = 0};
-
- if (pContext->pStmtCb && *pQuery) {
- (*pContext->pStmtCb->getExecInfoFn)(pContext->pStmtCb->pStmt, &context.pVgroupsHashObj,
- &context.pTableBlockHashObj);
- if (NULL == context.pVgroupsHashObj) {
- context.pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
- }
- if (NULL == context.pTableBlockHashObj) {
- context.pTableBlockHashObj =
- taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
- }
- } else {
- context.pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
- context.pTableBlockHashObj =
- taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BIGINT), true, HASH_NO_LOCK);
+static int32_t createInsertQuery(SParseContext* pCxt, SQuery** pOutput) {
+ SQuery* pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
+ if (NULL == pQuery) {
+ return TSDB_CODE_OUT_OF_MEMORY;
}
- if (NULL == context.pVgroupsHashObj || NULL == context.pTableBlockHashObj || NULL == context.pSubTableHashObj ||
- NULL == context.pTableNameHashObj || NULL == context.pDbFNameHashObj || NULL == context.pOutput) {
- return TSDB_CODE_TSC_OUT_OF_MEMORY;
- }
- taosHashSetFreeFp(context.pSubTableHashObj, destroySubTableHashElem);
+ pQuery->execMode = QUERY_EXEC_MODE_SCHEDULE;
+ pQuery->haveResultSet = false;
+ pQuery->msgType = TDMT_VND_SUBMIT;
- if (pContext->pStmtCb) {
- TSDB_QUERY_SET_TYPE(context.pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT);
+ int32_t code = createVnodeModifOpStmt(pCxt, false, &pQuery->pRoot);
+ if (TSDB_CODE_SUCCESS == code) {
+ *pOutput = pQuery;
+ } else {
+ nodesDestroyNode((SNode*)pQuery);
}
+ return code;
+}
- if (NULL == *pQuery) {
- *pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
- if (NULL == *pQuery) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- } else {
- nodesDestroyNode((*pQuery)->pRoot);
+static int32_t checkAuthFromMetaData(const SArray* pUsers) {
+ if (1 != taosArrayGetSize(pUsers)) {
+ return TSDB_CODE_FAILED;
}
- (*pQuery)->execMode = QUERY_EXEC_MODE_SCHEDULE;
- (*pQuery)->haveResultSet = false;
- (*pQuery)->msgType = TDMT_VND_SUBMIT;
- (*pQuery)->pRoot = (SNode*)context.pOutput;
+ SMetaRes* pRes = taosArrayGet(pUsers, 0);
+ if (TSDB_CODE_SUCCESS == pRes->code) {
+ return (*(bool*)pRes->pRes) ? TSDB_CODE_SUCCESS : TSDB_CODE_PAR_PERMISSION_DENIED;
+ }
+ return pRes->code;
+}
- if (NULL == (*pQuery)->pTableList) {
- (*pQuery)->pTableList = taosArrayInit(taosHashGetSize(context.pTableNameHashObj), sizeof(SName));
- if (NULL == (*pQuery)->pTableList) {
+static int32_t getTableMetaFromMetaData(const SArray* pTables, STableMeta** pMeta) {
+ if (1 != taosArrayGetSize(pTables)) {
+ return TSDB_CODE_FAILED;
+ }
+ SMetaRes* pRes = taosArrayGet(pTables, 0);
+ if (TSDB_CODE_SUCCESS == pRes->code) {
+ *pMeta = tableMetaDup((const STableMeta*)pRes->pRes);
+ if (NULL == *pMeta) {
return TSDB_CODE_OUT_OF_MEMORY;
}
}
+ return pRes->code;
+}
- if (NULL == (*pQuery)->pDbList) {
- (*pQuery)->pDbList = taosArrayInit(taosHashGetSize(context.pDbFNameHashObj), TSDB_DB_FNAME_LEN);
- if (NULL == (*pQuery)->pDbList) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
+static int32_t getTableVgroupFromMetaData(const SArray* pTables, SVnodeModifOpStmt* pStmt, bool isStb) {
+ if (1 != taosArrayGetSize(pTables)) {
+ return TSDB_CODE_FAILED;
}
- int32_t code = TSDB_CODE_SUCCESS;
- if (!context.pComCxt->needMultiParse) {
- code = skipInsertInto(&context.pSql, &context.msg);
- if (TSDB_CODE_SUCCESS == code) {
- code = parseInsertBody(&context);
- }
- } else {
- code = parseInsertBodyAgain(&context);
+ SMetaRes* pRes = taosArrayGet(pTables, 0);
+ if (TSDB_CODE_SUCCESS != pRes->code) {
+ return pRes->code;
}
- if (TSDB_CODE_SUCCESS == code || NEED_CLIENT_HANDLE_ERROR(code)) {
- SName* pTable = taosHashIterate(context.pTableNameHashObj, NULL);
- while (NULL != pTable) {
- taosArrayPush((*pQuery)->pTableList, pTable);
- pTable = taosHashIterate(context.pTableNameHashObj, pTable);
- }
+ SVgroupInfo* pVg = pRes->pRes;
+ if (isStb) {
+ pStmt->pTableMeta->vgId = pVg->vgId;
+ }
+ return taosHashPut(pStmt->pVgroupsHashObj, (const char*)&pVg->vgId, sizeof(pVg->vgId), (char*)pVg,
+ sizeof(SVgroupInfo));
+}
- char* pDb = taosHashIterate(context.pDbFNameHashObj, NULL);
- while (NULL != pDb) {
- taosArrayPush((*pQuery)->pDbList, pDb);
- pDb = taosHashIterate(context.pDbFNameHashObj, pDb);
- }
+static int32_t getTableSchemaFromMetaData(const SMetaData* pMetaData, SVnodeModifOpStmt* pStmt, bool isStb) {
+ int32_t code = checkAuthFromMetaData(pMetaData->pUser);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = getTableMetaFromMetaData(pMetaData->pTableMeta, &pStmt->pTableMeta);
}
- if (pContext->pStmtCb) {
- context.pVgroupsHashObj = NULL;
- context.pTableBlockHashObj = NULL;
+ if (TSDB_CODE_SUCCESS == code) {
+ code = getTableVgroupFromMetaData(pMetaData->pTableHash, pStmt, isStb);
}
- destroyInsertParseContext(&context);
return code;
}
-// pSql -> (field1_value, ...) [(field1_value2, ...) ...]
-static int32_t skipValuesClause(SInsertParseSyntaxCxt* pCxt) {
- int32_t numOfRows = 0;
- SToken sToken;
- while (1) {
- int32_t index = 0;
- NEXT_TOKEN_KEEP_SQL(pCxt->pSql, sToken, index);
- if (TK_NK_LP != sToken.type) {
- break;
- }
- pCxt->pSql += index;
+static void destoryTablesReq(void* p) {
+ STablesReq* pRes = (STablesReq*)p;
+ taosArrayDestroy(pRes->pTables);
+}
- CHECK_CODE(skipParentheses(pCxt));
- ++numOfRows;
+static void clearCatalogReq(SCatalogReq* pCatalogReq) {
+ if (NULL == pCatalogReq) {
+ return;
}
- if (0 == numOfRows) {
- return buildSyntaxErrMsg(&pCxt->msg, "no any data points", NULL);
+
+ taosArrayDestroyEx(pCatalogReq->pTableMeta, destoryTablesReq);
+ pCatalogReq->pTableMeta = NULL;
+ taosArrayDestroyEx(pCatalogReq->pTableHash, destoryTablesReq);
+ pCatalogReq->pTableHash = NULL;
+ taosArrayDestroy(pCatalogReq->pUser);
+ pCatalogReq->pUser = NULL;
+}
+
+static int32_t setVnodeModifOpStmt(SParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
+ SVnodeModifOpStmt* pStmt) {
+ clearCatalogReq(pCatalogReq);
+
+ if (pStmt->usingTableProcessing) {
+ return getTableSchemaFromMetaData(pMetaData, pStmt, true);
}
- return TSDB_CODE_SUCCESS;
+ return getTableSchemaFromMetaData(pMetaData, pStmt, false);
}
-static int32_t skipTagsClause(SInsertParseSyntaxCxt* pCxt) { return skipParentheses(pCxt); }
+static int32_t resetVnodeModifOpStmt(SParseContext* pCxt, SQuery* pQuery) {
+ nodesDestroyNode(pQuery->pRoot);
-static int32_t skipTableOptions(SInsertParseSyntaxCxt* pCxt) {
- do {
- int32_t index = 0;
- SToken sToken;
- NEXT_TOKEN_KEEP_SQL(pCxt->pSql, sToken, index);
- if (TK_TTL == sToken.type || TK_COMMENT == sToken.type) {
- pCxt->pSql += index;
- NEXT_TOKEN_WITH_PREV(pCxt->pSql, sToken);
- } else {
- break;
+ int32_t code = createVnodeModifOpStmt(pCxt, true, &pQuery->pRoot);
+ if (TSDB_CODE_SUCCESS == code) {
+ SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
+
+ (*pCxt->pStmtCb->getExecInfoFn)(pCxt->pStmtCb->pStmt, &pStmt->pVgroupsHashObj, &pStmt->pTableBlockHashObj);
+ if (NULL == pStmt->pVgroupsHashObj) {
+ pStmt->pVgroupsHashObj = taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_INT), true, HASH_NO_LOCK);
}
- } while (1);
- return TSDB_CODE_SUCCESS;
+ if (NULL == pStmt->pTableBlockHashObj) {
+ pStmt->pTableBlockHashObj =
+ taosHashInit(128, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
+ }
+ if (NULL == pStmt->pVgroupsHashObj || NULL == pStmt->pTableBlockHashObj) {
+ code = TSDB_CODE_OUT_OF_MEMORY;
+ }
+ }
+
+ return code;
}
-// pSql -> [(tag1_name, ...)] TAGS (tag1_value, ...)
-static int32_t skipUsingClause(SInsertParseSyntaxCxt* pCxt) {
- SToken sToken;
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_LP == sToken.type) {
- CHECK_CODE(skipBoundColumns(pCxt));
- NEXT_TOKEN(pCxt->pSql, sToken);
+static int32_t initInsertQuery(SParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
+ SQuery** pQuery) {
+ if (NULL == *pQuery) {
+ return createInsertQuery(pCxt, pQuery);
}
- if (TK_TAGS != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, "TAGS is expected", sToken.z);
+ if (NULL != pCxt->pStmtCb) {
+ return resetVnodeModifOpStmt(pCxt, *pQuery);
}
- // pSql -> (tag1_value, ...)
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (TK_NK_LP != sToken.type) {
- return buildSyntaxErrMsg(&pCxt->msg, "( is expected", sToken.z);
+
+ SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)(*pQuery)->pRoot;
+
+ if (!pStmt->fileProcessing) {
+ return setVnodeModifOpStmt(pCxt, pCatalogReq, pMetaData, pStmt);
}
- CHECK_CODE(skipTagsClause(pCxt));
- CHECK_CODE(skipTableOptions(pCxt));
return TSDB_CODE_SUCCESS;
}
-static int32_t collectTableMetaKey(SInsertParseSyntaxCxt* pCxt, bool isStable, int32_t tableNo, SToken* pTbToken) {
- SName name = {0};
- CHECK_CODE(insCreateSName(&name, pTbToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
- CHECK_CODE(reserveTableMetaInCacheForInsert(&name, isStable ? CATALOG_REQ_TYPE_META : CATALOG_REQ_TYPE_BOTH, tableNo,
- pCxt->pMetaCache));
+static int32_t setRefreshMate(SQuery* pQuery) {
+ SVnodeModifOpStmt* pStmt = (SVnodeModifOpStmt*)pQuery->pRoot;
+ SName* pTable = taosHashIterate(pStmt->pTableNameHashObj, NULL);
+ while (NULL != pTable) {
+ taosArrayPush(pQuery->pTableList, pTable);
+ pTable = taosHashIterate(pStmt->pTableNameHashObj, pTable);
+ }
+
+ char* pDb = taosHashIterate(pStmt->pDbFNameHashObj, NULL);
+ while (NULL != pDb) {
+ taosArrayPush(pQuery->pDbList, pDb);
+ pDb = taosHashIterate(pStmt->pDbFNameHashObj, pDb);
+ }
+
return TSDB_CODE_SUCCESS;
}
-static int32_t checkTableName(const char* pTableName, SMsgBuf* pMsgBuf) {
- if (NULL != strchr(pTableName, '.')) {
- return generateSyntaxErrMsgExt(pMsgBuf, TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME, "The table name cannot contain '.'");
+// INSERT INTO
+// tb_name
+// [USING stb_name [(tag1_name, ...)] TAGS (tag1_value, ...) [table_options]]
+// [(field1_name, ...)]
+// VALUES (field1_value, ...) [(field1_value2, ...) ...] | FILE csv_file_path
+// [...];
+static int32_t parseInsertSqlFromStart(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ int32_t code = skipInsertInto(&pStmt->pSql, &pCxt->msg);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseInsertBody(pCxt, pStmt);
}
- return TSDB_CODE_SUCCESS;
+ return code;
}
-static int32_t collectAutoCreateTableMetaKey(SInsertParseSyntaxCxt* pCxt, int32_t tableNo, SToken* pTbToken) {
- SName name = {0};
- CHECK_CODE(insCreateSName(&name, pTbToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
- CHECK_CODE(checkTableName(name.tname, &pCxt->msg));
- CHECK_CODE(reserveTableMetaInCacheForInsert(&name, CATALOG_REQ_TYPE_VGROUP, tableNo, pCxt->pMetaCache));
- return TSDB_CODE_SUCCESS;
+static int32_t parseInsertSqlFromCsv(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ STableDataBlocks* pDataBuf = NULL;
+ int32_t code = getTableDataBlocks(pCxt, pStmt, &pDataBuf);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseDataFromFileImpl(pCxt, pStmt, pDataBuf);
+ }
+
+ if (TSDB_CODE_SUCCESS == code) {
+ if (pStmt->fileProcessing) {
+ code = parseInsertBodyBottom(pCxt, pStmt);
+ } else {
+ code = parseInsertBody(pCxt, pStmt);
+ }
+ }
+
+ return code;
}
-static int32_t parseInsertBodySyntax(SInsertParseSyntaxCxt* pCxt) {
- bool hasData = false;
- int32_t tableNo = 0;
- // for each table
- while (1) {
- SToken sToken;
+static int32_t parseInsertSqlFromTable(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ int32_t code = parseInsertTableClauseBottom(pCxt, pStmt);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = parseInsertBody(pCxt, pStmt);
+ }
+ return code;
+}
- // pSql -> tb_name ...
- NEXT_TOKEN(pCxt->pSql, sToken);
+static int32_t parseInsertSqlImpl(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt) {
+ if (pStmt->pSql == pCxt->pComCxt->pSql || NULL != pCxt->pComCxt->pStmtCb) {
+ return parseInsertSqlFromStart(pCxt, pStmt);
+ }
- // no data in the sql string anymore.
- if (sToken.n == 0) {
- if (sToken.type && pCxt->pSql[0]) {
- return buildSyntaxErrMsg(&pCxt->msg, "invalid charactor in SQL", sToken.z);
- }
+ if (pStmt->fileProcessing) {
+ return parseInsertSqlFromCsv(pCxt, pStmt);
+ }
- if (!hasData) {
- return buildInvalidOperationMsg(&pCxt->msg, "no data in sql");
- }
- break;
- }
+ return parseInsertSqlFromTable(pCxt, pStmt);
+}
- hasData = false;
+static int32_t buildInsertTableReq(SName* pName, SArray** pTables) {
+ *pTables = taosArrayInit(1, sizeof(SName));
+ if (NULL == *pTables) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
- SToken tbnameToken = sToken;
- NEXT_TOKEN(pCxt->pSql, sToken);
+ taosArrayPush(*pTables, pName);
+ return TSDB_CODE_SUCCESS;
+}
- bool existedUsing = false;
- // USING clause
- if (TK_USING == sToken.type) {
- existedUsing = true;
- CHECK_CODE(collectAutoCreateTableMetaKey(pCxt, tableNo, &tbnameToken));
- NEXT_TOKEN(pCxt->pSql, sToken);
- CHECK_CODE(collectTableMetaKey(pCxt, true, tableNo, &sToken));
- CHECK_CODE(skipUsingClause(pCxt));
- NEXT_TOKEN(pCxt->pSql, sToken);
+static int32_t buildInsertDbReq(SName* pName, SArray** pDbs) {
+ if (NULL == *pDbs) {
+ *pDbs = taosArrayInit(1, sizeof(STablesReq));
+ if (NULL == *pDbs) {
+ return TSDB_CODE_OUT_OF_MEMORY;
}
+ }
- if (TK_NK_LP == sToken.type) {
- // pSql -> field1_name, ...)
- CHECK_CODE(skipBoundColumns(pCxt));
- NEXT_TOKEN(pCxt->pSql, sToken);
- }
+ STablesReq req = {0};
+ tNameGetFullDbName(pName, req.dbFName);
+ buildInsertTableReq(pName, &req.pTables);
+ taosArrayPush(*pDbs, &req);
- if (TK_USING == sToken.type && !existedUsing) {
- existedUsing = true;
- CHECK_CODE(collectAutoCreateTableMetaKey(pCxt, tableNo, &tbnameToken));
- NEXT_TOKEN(pCxt->pSql, sToken);
- CHECK_CODE(collectTableMetaKey(pCxt, true, tableNo, &sToken));
- CHECK_CODE(skipUsingClause(pCxt));
- NEXT_TOKEN(pCxt->pSql, sToken);
- } else if (!existedUsing) {
- CHECK_CODE(collectTableMetaKey(pCxt, false, tableNo, &tbnameToken));
- }
+ return TSDB_CODE_SUCCESS;
+}
- ++tableNo;
+static int32_t buildInsertUserAuthReq(const char* pUser, SName* pName, SArray** pUserAuth) {
+ *pUserAuth = taosArrayInit(1, sizeof(SUserAuthInfo));
+ if (NULL == *pUserAuth) {
+ return TSDB_CODE_OUT_OF_MEMORY;
+ }
- if (TK_VALUES == sToken.type) {
- // pSql -> (field1_value, ...) [(field1_value2, ...) ...]
- CHECK_CODE(skipValuesClause(pCxt));
- hasData = true;
- continue;
- }
+ SUserAuthInfo userAuth = {.type = AUTH_TYPE_WRITE};
+ snprintf(userAuth.user, sizeof(userAuth.user), "%s", pUser);
+ tNameGetFullDbName(pName, userAuth.dbFName);
+ taosArrayPush(*pUserAuth, &userAuth);
- // FILE csv_file_path
- if (TK_FILE == sToken.type) {
- // pSql -> csv_file_path
- NEXT_TOKEN(pCxt->pSql, sToken);
- if (0 == sToken.n || (TK_NK_STRING != sToken.type && TK_NK_ID != sToken.type)) {
- return buildSyntaxErrMsg(&pCxt->msg, "file path is required following keyword FILE", sToken.z);
- }
- hasData = true;
- continue;
+ return TSDB_CODE_SUCCESS;
+}
+
+static int32_t buildInsertCatalogReq(SInsertParseContext* pCxt, SVnodeModifOpStmt* pStmt, SCatalogReq* pCatalogReq) {
+ int32_t code = buildInsertUserAuthReq(pCxt->pComCxt->pUser, &pStmt->targetTableName, &pCatalogReq->pUser);
+ if (TSDB_CODE_SUCCESS == code) {
+ if (0 == pStmt->usingTableName.type) {
+ code = buildInsertDbReq(&pStmt->targetTableName, &pCatalogReq->pTableMeta);
+ } else {
+ code = buildInsertDbReq(&pStmt->usingTableName, &pCatalogReq->pTableMeta);
}
+ }
+ if (TSDB_CODE_SUCCESS == code) {
+ code = buildInsertDbReq(&pStmt->targetTableName, &pCatalogReq->pTableHash);
+ }
+ return code;
+}
+
+static int32_t setNextStageInfo(SInsertParseContext* pCxt, SQuery* pQuery, SCatalogReq* pCatalogReq) {
+ if (pCxt->missCache) {
+ parserDebug("0x%" PRIx64 " %d rows have been inserted before cache miss", pCxt->pComCxt->requestId,
+ ((SVnodeModifOpStmt*)pQuery->pRoot)->totalRowsNum);
- return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", sToken.z);
+ pQuery->execStage = QUERY_EXEC_STAGE_PARSE;
+ return buildInsertCatalogReq(pCxt, (SVnodeModifOpStmt*)pQuery->pRoot, pCatalogReq);
}
+ parserDebug("0x%" PRIx64 " %d rows have been inserted", pCxt->pComCxt->requestId,
+ ((SVnodeModifOpStmt*)pQuery->pRoot)->totalRowsNum);
+
+ pQuery->execStage = QUERY_EXEC_STAGE_SCHEDULE;
return TSDB_CODE_SUCCESS;
}
-int32_t parseInsertSyntax(SParseContext* pContext, SQuery** pQuery, SParseMetaCache* pMetaCache) {
- SInsertParseSyntaxCxt context = {.pComCxt = pContext,
- .pSql = (char*)pContext->pSql,
- .msg = {.buf = pContext->pMsg, .len = pContext->msgLen},
- .pMetaCache = pMetaCache};
- int32_t code = skipInsertInto(&context.pSql, &context.msg);
+int32_t parseInsertSql(SParseContext* pCxt, SQuery** pQuery, SCatalogReq* pCatalogReq, const SMetaData* pMetaData) {
+ SInsertParseContext context = {
+ .pComCxt = pCxt,
+ .msg = {.buf = pCxt->pMsg, .len = pCxt->msgLen},
+ .missCache = false,
+ .usingDuplicateTable = false,
+ };
+
+ int32_t code = initInsertQuery(pCxt, pCatalogReq, pMetaData, pQuery);
if (TSDB_CODE_SUCCESS == code) {
- code = parseInsertBodySyntax(&context);
+ code = parseInsertSqlImpl(&context, (SVnodeModifOpStmt*)(*pQuery)->pRoot);
}
if (TSDB_CODE_SUCCESS == code) {
- *pQuery = (SQuery*)nodesMakeNode(QUERY_NODE_QUERY);
- if (NULL == *pQuery) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
+ code = setNextStageInfo(&context, *pQuery, pCatalogReq);
+ }
+ if ((TSDB_CODE_SUCCESS == code || NEED_CLIENT_HANDLE_ERROR(code)) &&
+ QUERY_EXEC_STAGE_SCHEDULE == (*pQuery)->execStage) {
+ code = setRefreshMate(*pQuery);
}
+ destroyBoundColumnInfo(&context.tags);
return code;
}
diff --git a/source/libs/parser/src/parInsertStmt.c b/source/libs/parser/src/parInsertStmt.c
index f85ceccf6ef2ba23ad4bf3b8c08e98df47fd0a8f..9a5f349d8fe1f9da5bd2290832b3d5ab61cb7688 100644
--- a/source/libs/parser/src/parInsertStmt.c
+++ b/source/libs/parser/src/parInsertStmt.c
@@ -30,23 +30,17 @@ typedef struct SKvParam {
} SKvParam;
int32_t qBuildStmtOutput(SQuery* pQuery, SHashObj* pVgHash, SHashObj* pBlockHash) {
- SVnodeModifOpStmt* modifyNode = (SVnodeModifOpStmt*)pQuery->pRoot;
- int32_t code = 0;
- SInsertParseContext insertCtx = {
- .pVgroupsHashObj = pVgHash,
- .pTableBlockHashObj = pBlockHash,
- .pOutput = (SVnodeModifOpStmt*)pQuery->pRoot,
- };
-
+ int32_t code = TSDB_CODE_SUCCESS;
+ SArray* pVgDataBlocks = NULL;
// merge according to vgId
- if (taosHashGetSize(insertCtx.pTableBlockHashObj) > 0) {
- CHECK_CODE(insMergeTableDataBlocks(insertCtx.pTableBlockHashObj, &insertCtx.pVgDataBlocks));
+ if (taosHashGetSize(pBlockHash) > 0) {
+ code = insMergeTableDataBlocks(pBlockHash, &pVgDataBlocks);
}
-
- CHECK_CODE(insBuildOutput(&insertCtx));
-
- insDestroyBlockArrayList(insertCtx.pVgDataBlocks);
- return TSDB_CODE_SUCCESS;
+ if (TSDB_CODE_SUCCESS == code) {
+ code = insBuildOutput(pVgHash, pVgDataBlocks, &((SVnodeModifOpStmt*)pQuery->pRoot)->pDataBlocks);
+ }
+ insDestroyBlockArrayList(pVgDataBlocks);
+ return code;
}
int32_t qBindStmtTagsValue(void* pBlock, void* boundTags, int64_t suid, const char* sTableName, char* tName,
@@ -222,11 +216,7 @@ int32_t qBindStmtColsValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, in
}
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
- if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, pDataBlock, bind->num)) {
- return buildInvalidOperationMsg(&pBuf, "too many rows in sql, total number of rows should be less than INT32_MAX");
- }
-
- return TSDB_CODE_SUCCESS;
+ return insSetBlockInfo(pBlocks, pDataBlock, bind->num, &pBuf);
}
int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBuf, int32_t msgBufLen, int32_t colIdx,
@@ -308,10 +298,7 @@ int32_t qBindStmtSingleColValue(void* pBlock, TAOS_MULTI_BIND* bind, char* msgBu
pDataBlock->size += extendedRowSize * bind->num;
SSubmitBlk* pBlocks = (SSubmitBlk*)(pDataBlock->pData);
- if (TSDB_CODE_SUCCESS != insSetBlockInfo(pBlocks, pDataBlock, bind->num)) {
- return buildInvalidOperationMsg(&pBuf,
- "too many rows in sql, total number of rows should be less than INT32_MAX");
- }
+ CHECK_CODE(insSetBlockInfo(pBlocks, pDataBlock, bind->num, &pBuf));
}
return TSDB_CODE_SUCCESS;
diff --git a/source/libs/parser/src/parInsertUtil.c b/source/libs/parser/src/parInsertUtil.c
index 570a6f9859875c2b5af6929236c8eab0cb16fb26..bc09163753d91e883d4e0f176bb97733cfca2c33 100644
--- a/source/libs/parser/src/parInsertUtil.c
+++ b/source/libs/parser/src/parInsertUtil.c
@@ -110,18 +110,17 @@ void insGetSTSRowAppendInfo(uint8_t rowType, SParsedDataColInfo* spd, col_id_t i
}
}
-int32_t insSetBlockInfo(SSubmitBlk* pBlocks, STableDataBlocks* dataBuf, int32_t numOfRows) {
+int32_t insSetBlockInfo(SSubmitBlk* pBlocks, STableDataBlocks* dataBuf, int32_t numOfRows, SMsgBuf* pMsg) {
pBlocks->suid = (TSDB_NORMAL_TABLE == dataBuf->pTableMeta->tableType ? 0 : dataBuf->pTableMeta->suid);
pBlocks->uid = dataBuf->pTableMeta->uid;
pBlocks->sversion = dataBuf->pTableMeta->sversion;
pBlocks->schemaLen = dataBuf->createTbReqLen;
if (pBlocks->numOfRows + numOfRows >= INT32_MAX) {
- return TSDB_CODE_TSC_INVALID_OPERATION;
- } else {
- pBlocks->numOfRows += numOfRows;
- return TSDB_CODE_SUCCESS;
+ return buildInvalidOperationMsg(pMsg, "too many rows in sql, total number of rows should be less than INT32_MAX");
}
+ pBlocks->numOfRows += numOfRows;
+ return TSDB_CODE_SUCCESS;
}
void insSetBoundColumnInfo(SParsedDataColInfo* pColList, SSchema* pSchema, col_id_t numOfCols) {
@@ -271,12 +270,8 @@ void insDestroyDataBlock(STableDataBlocks* pDataBlock) {
}
taosMemoryFreeClear(pDataBlock->pData);
- // if (!pDataBlock->cloned) {
- // free the refcount for metermeta
taosMemoryFreeClear(pDataBlock->pTableMeta);
-
destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
- // }
taosMemoryFreeClear(pDataBlock);
}
@@ -312,20 +307,6 @@ int32_t insGetDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, in
return TSDB_CODE_SUCCESS;
}
-#if 0
-static int32_t getRowExpandSize(STableMeta* pTableMeta) {
- int32_t result = TD_ROW_HEAD_LEN - sizeof(TSKEY);
- int32_t columns = getNumOfColumns(pTableMeta);
- SSchema* pSchema = getTableColumnSchema(pTableMeta);
- for (int32_t i = 0; i < columns; ++i) {
- if (IS_VAR_DATA_TYPE((pSchema + i)->type)) {
- result += TYPE_BYTES[TSDB_DATA_TYPE_BINARY];
- }
- }
- result += (int32_t)TD_BITMAP_BYTES(columns - 1);
- return result;
-}
-#endif
void insDestroyBlockArrayList(SArray* pDataBlockList) {
if (pDataBlockList == NULL) {
@@ -357,51 +338,6 @@ void insDestroyBlockHashmap(SHashObj* pDataBlockHash) {
taosHashCleanup(pDataBlockHash);
}
-#if 0
-// data block is disordered, sort it in ascending order
-void sortRemoveDataBlockDupRowsRaw(STableDataBlocks* dataBuf) {
- SSubmitBlk* pBlocks = (SSubmitBlk*)dataBuf->pData;
-
- // size is less than the total size, since duplicated rows may be removed yet.
- assert(pBlocks->numOfRows * dataBuf->rowSize + sizeof(SSubmitBlk) == dataBuf->size);
-
- if (!dataBuf->ordered) {
- char* pBlockData = pBlocks->data;
-
- // todo. qsort is unstable, if timestamp is same, should get the last one
- taosSort(pBlockData, pBlocks->numOfRows, dataBuf->rowSize, rowDataCompar);
-
- int32_t i = 0;
- int32_t j = 1;
-
- // delete rows with timestamp conflicts
- while (j < pBlocks->numOfRows) {
- TSKEY ti = *(TSKEY*)(pBlockData + dataBuf->rowSize * i);
- TSKEY tj = *(TSKEY*)(pBlockData + dataBuf->rowSize * j);
-
- if (ti == tj) {
- ++j;
- continue;
- }
-
- int32_t nextPos = (++i);
- if (nextPos != j) {
- memmove(pBlockData + dataBuf->rowSize * nextPos, pBlockData + dataBuf->rowSize * j, dataBuf->rowSize);
- }
-
- ++j;
- }
-
- dataBuf->ordered = true;
-
- pBlocks->numOfRows = i + 1;
- dataBuf->size = sizeof(SSubmitBlk) + dataBuf->rowSize * pBlocks->numOfRows;
- }
-
- dataBuf->prevTS = INT64_MIN;
-}
-#endif
-
// data block is disordered, sort it in ascending order
static int sortRemoveDataBlockDupRows(STableDataBlocks* dataBuf, SBlockKeyInfo* pBlkKeyInfo) {
SSubmitBlk* pBlocks = (SSubmitBlk*)dataBuf->pData;
@@ -896,6 +832,10 @@ int32_t insCreateSName(SName* pName, SToken* pTableName, int32_t acctId, const c
}
}
+ if (NULL != strchr(pName->tname, '.')) {
+ code = generateSyntaxErrMsgExt(pMsgBuf, TSDB_CODE_PAR_INVALID_IDENTIFIER_NAME, "The table name cannot contain '.'");
+ }
+
return code;
}
@@ -994,24 +934,24 @@ static void buildMsgHeader(STableDataBlocks* src, SVgDataBlocks* blocks) {
}
}
-int32_t insBuildOutput(SInsertParseContext* pCxt) {
- size_t numOfVg = taosArrayGetSize(pCxt->pVgDataBlocks);
- pCxt->pOutput->pDataBlocks = taosArrayInit(numOfVg, POINTER_BYTES);
- if (NULL == pCxt->pOutput->pDataBlocks) {
+int32_t insBuildOutput(SHashObj* pVgroupsHashObj, SArray* pVgDataBlocks, SArray** pDataBlocks) {
+ size_t numOfVg = taosArrayGetSize(pVgDataBlocks);
+ *pDataBlocks = taosArrayInit(numOfVg, POINTER_BYTES);
+ if (NULL == *pDataBlocks) {
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
for (size_t i = 0; i < numOfVg; ++i) {
- STableDataBlocks* src = taosArrayGetP(pCxt->pVgDataBlocks, i);
+ STableDataBlocks* src = taosArrayGetP(pVgDataBlocks, i);
SVgDataBlocks* dst = taosMemoryCalloc(1, sizeof(SVgDataBlocks));
if (NULL == dst) {
return TSDB_CODE_TSC_OUT_OF_MEMORY;
}
- taosHashGetDup(pCxt->pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
+ taosHashGetDup(pVgroupsHashObj, (const char*)&src->vgId, sizeof(src->vgId), &dst->vg);
dst->numOfTables = src->numOfTables;
dst->size = src->size;
TSWAP(dst->pData, src->pData);
buildMsgHeader(src, dst);
- taosArrayPush(pCxt->pOutput->pDataBlocks, &dst);
+ taosArrayPush(*pDataBlocks, &dst);
}
return TSDB_CODE_SUCCESS;
}
diff --git a/source/libs/parser/src/parTranslater.c b/source/libs/parser/src/parTranslater.c
index d3ff787f50a0143466e15cded51e3b79ac9cd59b..54f450e9712b3e273ee9ec008d19ab4f0d590a24 100644
--- a/source/libs/parser/src/parTranslater.c
+++ b/source/libs/parser/src/parTranslater.c
@@ -466,14 +466,14 @@ static int32_t getTableHashVgroup(STranslateContext* pCxt, const char* pDbName,
}
static int32_t getDBVgVersion(STranslateContext* pCxt, const char* pDbFName, int32_t* pVersion, int64_t* pDbId,
- int32_t* pTableNum) {
+ int32_t* pTableNum, int64_t* pStateTs) {
SParseContext* pParCxt = pCxt->pParseCxt;
int32_t code = collectUseDatabaseImpl(pDbFName, pCxt->pDbs);
if (TSDB_CODE_SUCCESS == code) {
if (pParCxt->async) {
- code = getDbVgVersionFromCache(pCxt->pMetaCache, pDbFName, pVersion, pDbId, pTableNum);
+ code = getDbVgVersionFromCache(pCxt->pMetaCache, pDbFName, pVersion, pDbId, pTableNum, pStateTs);
} else {
- code = catalogGetDBVgVersion(pParCxt->pCatalog, pDbFName, pVersion, pDbId, pTableNum);
+ code = catalogGetDBVgVersion(pParCxt->pCatalog, pDbFName, pVersion, pDbId, pTableNum, pStateTs);
}
}
if (TSDB_CODE_SUCCESS != code) {
@@ -744,7 +744,8 @@ static bool isPrimaryKeyImpl(SNode* pExpr) {
return (PRIMARYKEY_TIMESTAMP_COL_ID == ((SColumnNode*)pExpr)->colId);
} else if (QUERY_NODE_FUNCTION == nodeType(pExpr)) {
SFunctionNode* pFunc = (SFunctionNode*)pExpr;
- if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType) {
+ if (FUNCTION_TYPE_SELECT_VALUE == pFunc->funcType || FUNCTION_TYPE_FIRST == pFunc->funcType ||
+ FUNCTION_TYPE_LAST == pFunc->funcType) {
return isPrimaryKeyImpl(nodesListGetNode(pFunc->pParameterList, 0));
} else if (FUNCTION_TYPE_WSTART == pFunc->funcType || FUNCTION_TYPE_WEND == pFunc->funcType) {
return true;
@@ -787,7 +788,6 @@ static void setColumnInfoBySchema(const SRealTableNode* pTable, const SSchema* p
static void setColumnInfoByExpr(STempTableNode* pTable, SExprNode* pExpr, SColumnNode** pColRef) {
SColumnNode* pCol = *pColRef;
- // pCol->pProjectRef = (SNode*)pExpr;
if (NULL == pExpr->pAssociation) {
pExpr->pAssociation = taosArrayInit(TARRAY_MIN_SIZE, POINTER_BYTES);
}
@@ -1252,6 +1252,19 @@ static bool dataTypeEqual(const SDataType* l, const SDataType* r) {
return (l->type == r->type && l->bytes == r->bytes && l->precision == r->precision && l->scale == r->scale);
}
+// 0 means equal, 1 means the left shall prevail, -1 means the right shall prevail
+static int32_t dataTypeComp(const SDataType* l, const SDataType* r) {
+ if (l->type != r->type) {
+ return 1;
+ }
+
+ if (l->bytes != r->bytes) {
+ return l->bytes > r->bytes ? 1 : -1;
+ }
+
+ return (l->precision == r->precision && l->scale == r->scale) ? 0 : 1;
+}
+
static EDealRes translateOperator(STranslateContext* pCxt, SOperatorNode* pOp) {
if (isMultiResFunc(pOp->pLeft)) {
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, ((SExprNode*)(pOp->pLeft))->aliasName);
@@ -1865,6 +1878,7 @@ static int32_t rewriteIsTrue(SNode* pSrc, SNode** pIsTrue) {
static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseWhen) {
bool first = true;
+ bool allNullThen = true;
SNode* pNode = NULL;
FOREACH(pNode, pCaseWhen->pWhenThenList) {
SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
@@ -1876,10 +1890,31 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW
}
pWhenThen->pWhen = pIsTrue;
}
- if (first) {
- first = false;
- pCaseWhen->node.resType = ((SExprNode*)pNode)->resType;
- } else if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
+
+ SExprNode* pThenExpr = (SExprNode*)pNode;
+ if (TSDB_DATA_TYPE_NULL == pThenExpr->resType.type) {
+ continue;
+ }
+ allNullThen = false;
+ if (first || dataTypeComp(&pCaseWhen->node.resType, &pThenExpr->resType) < 0) {
+ pCaseWhen->node.resType = pThenExpr->resType;
+ }
+ first = false;
+ }
+
+ if (allNullThen) {
+ if (NULL != pCaseWhen->pElse) {
+ pCaseWhen->node.resType = ((SExprNode*)pCaseWhen->pElse)->resType;
+ } else {
+ pCaseWhen->node.resType.type = TSDB_DATA_TYPE_NULL;
+ pCaseWhen->node.resType.bytes = tDataTypes[TSDB_DATA_TYPE_NULL].bytes;
+ return DEAL_RES_CONTINUE;
+ }
+ }
+
+ FOREACH(pNode, pCaseWhen->pWhenThenList) {
+ SWhenThenNode* pWhenThen = (SWhenThenNode*)pNode;
+ if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
SNode* pCastFunc = NULL;
pCxt->errCode = createCastFunc(pCxt, pWhenThen->pThen, pCaseWhen->node.resType, &pCastFunc);
if (TSDB_CODE_SUCCESS != pCxt->errCode) {
@@ -1889,6 +1924,7 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW
pWhenThen->node.resType = pCaseWhen->node.resType;
}
}
+
if (NULL != pCaseWhen->pElse && !dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pCaseWhen->pElse)->resType)) {
SNode* pCastFunc = NULL;
pCxt->errCode = createCastFunc(pCxt, pCaseWhen->pElse, pCaseWhen->node.resType, &pCastFunc);
@@ -2181,7 +2217,8 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge
if (TSDB_DB_NAME_T == pTargetName->type) {
int32_t code = getDBVgInfoImpl(pCxt, pTargetName, pVgroupList);
- if (TSDB_CODE_MND_DB_NOT_EXIST == code) {
+ if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
+ TSDB_CODE_MND_DB_IN_DROPPING == code) {
code = TSDB_CODE_SUCCESS;
}
return code;
@@ -2196,7 +2233,8 @@ static int32_t getTagsTableVgroupListImpl(STranslateContext* pCxt, SName* pTarge
} else {
taosArrayPush(*pVgroupList, &vgInfo);
}
- } else if (TSDB_CODE_MND_DB_NOT_EXIST == code) {
+ } else if (TSDB_CODE_MND_DB_NOT_EXIST == code || TSDB_CODE_MND_DB_IN_CREATING == code ||
+ TSDB_CODE_MND_DB_IN_DROPPING == code) {
code = TSDB_CODE_SUCCESS;
}
return code;
@@ -2391,6 +2429,9 @@ static int32_t translateTable(STranslateContext* pCxt, SNode* pTable) {
if (TSDB_SUPER_TABLE == pRealTable->pMeta->tableType) {
pCxt->stableQuery = true;
}
+ if (TSDB_SYSTEM_TABLE == pRealTable->pMeta->tableType && isSelectStmt(pCxt->pCurrStmt)) {
+ ((SSelectStmt*)pCxt->pCurrStmt)->isTimeLineResult = false;
+ }
code = addNamespace(pCxt, pRealTable);
}
break;
@@ -2721,17 +2762,17 @@ static bool needFill(SNode* pNode) {
return hasFillFunc;
}
-static bool mismatchFillDataType(SDataType origDt, SDataType fillDt) {
- if (TSDB_DATA_TYPE_NULL == fillDt.type) {
- return false;
- }
- if (IS_NUMERIC_TYPE(origDt.type) && !IS_NUMERIC_TYPE(fillDt.type)) {
- return true;
+static int32_t convertFillValue(STranslateContext* pCxt, SDataType dt, SNodeList* pValues, int32_t index) {
+ SListCell* pCell = nodesListGetCell(pValues, index);
+ if (dataTypeEqual(&dt, &((SExprNode*)pCell->pNode)->resType)) {
+ return TSDB_CODE_SUCCESS;
}
- if (IS_VAR_DATA_TYPE(origDt.type) && !IS_VAR_DATA_TYPE(fillDt.type)) {
- return true;
+ SNode* pCaseFunc = NULL;
+ int32_t code = createCastFunc(pCxt, pCell->pNode, dt, &pCaseFunc);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = scalarCalculateConstants(pCaseFunc, &pCell->pNode);
}
- return false;
+ return code;
}
static int32_t checkFillValues(STranslateContext* pCxt, SFillNode* pFill, SNodeList* pProjectionList) {
@@ -2747,8 +2788,8 @@ static int32_t checkFillValues(STranslateContext* pCxt, SFillNode* pFill, SNodeL
if (fillNo >= LIST_LENGTH(pFillValues->pNodeList)) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Filled values number mismatch");
}
- if (mismatchFillDataType(((SExprNode*)pProject)->resType,
- ((SExprNode*)nodesListGetNode(pFillValues->pNodeList, fillNo))->resType)) {
+ if (TSDB_CODE_SUCCESS !=
+ convertFillValue(pCxt, ((SExprNode*)pProject)->resType, pFillValues->pNodeList, fillNo)) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE, "Filled data type mismatch");
}
++fillNo;
@@ -2891,8 +2932,8 @@ static int32_t checkFill(STranslateContext* pCxt, SFillNode* pFill, SValueNode*
return TSDB_CODE_SUCCESS;
}
- if (TSWINDOW_IS_EQUAL(pFill->timeRange, TSWINDOW_INITIALIZER) ||
- TSWINDOW_IS_EQUAL(pFill->timeRange, TSWINDOW_DESC_INITIALIZER)) {
+ if (!pCxt->createStream && (TSWINDOW_IS_EQUAL(pFill->timeRange, TSWINDOW_INITIALIZER) ||
+ TSWINDOW_IS_EQUAL(pFill->timeRange, TSWINDOW_DESC_INITIALIZER))) {
return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_FILL_TIME_RANGE);
}
@@ -3021,20 +3062,17 @@ static int32_t translateIntervalWindow(STranslateContext* pCxt, SSelectStmt* pSe
return code;
}
-static EDealRes checkStateExpr(SNode* pNode, void* pContext) {
- if (QUERY_NODE_COLUMN == nodeType(pNode)) {
- STranslateContext* pCxt = pContext;
- SColumnNode* pCol = (SColumnNode*)pNode;
+static int32_t checkStateExpr(STranslateContext* pCxt, SNode* pNode) {
+ int32_t type = ((SExprNode*)pNode)->resType.type;
+ if (!IS_INTEGER_TYPE(type) && type != TSDB_DATA_TYPE_BOOL && !IS_VAR_DATA_TYPE(type)) {
+ return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STATE_WIN_TYPE);
+ }
- int32_t type = pCol->node.resType.type;
- if (!IS_INTEGER_TYPE(type) && type != TSDB_DATA_TYPE_BOOL && !IS_VAR_DATA_TYPE(type)) {
- return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_STATE_WIN_TYPE);
- }
- if (COLUMN_TYPE_TAG == pCol->colType) {
- return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_INVALID_STATE_WIN_COL);
- }
+ if (QUERY_NODE_COLUMN == nodeType(pNode) && COLUMN_TYPE_TAG == ((SColumnNode*)pNode)->colType) {
+ return generateSyntaxErrMsg(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STATE_WIN_COL);
}
- return DEAL_RES_CONTINUE;
+
+ return TSDB_CODE_SUCCESS;
}
static bool hasPartitionByTbname(SNodeList* pPartitionByList) {
@@ -3066,11 +3104,11 @@ static int32_t translateStateWindow(STranslateContext* pCxt, SSelectStmt* pSelec
}
SStateWindowNode* pState = (SStateWindowNode*)pSelect->pWindow;
- nodesWalkExprPostOrder(pState->pExpr, checkStateExpr, pCxt);
- if (TSDB_CODE_SUCCESS == pCxt->errCode) {
- pCxt->errCode = checkStateWindowForStream(pCxt, pSelect);
+ int32_t code = checkStateExpr(pCxt, pState->pExpr);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = checkStateWindowForStream(pCxt, pSelect);
}
- return pCxt->errCode;
+ return code;
}
static int32_t translateSessionWindow(STranslateContext* pCxt, SSelectStmt* pSelect) {
@@ -3441,7 +3479,8 @@ static int32_t translateSetOperProject(STranslateContext* pCxt, SSetOperator* pS
FORBOTH(pLeft, pLeftProjections, pRight, pRightProjections) {
SExprNode* pLeftExpr = (SExprNode*)pLeft;
SExprNode* pRightExpr = (SExprNode*)pRight;
- if (!dataTypeEqual(&pLeftExpr->resType, &pRightExpr->resType)) {
+ int32_t comp = dataTypeComp(&pLeftExpr->resType, &pRightExpr->resType);
+ if (comp > 0) {
SNode* pRightFunc = NULL;
int32_t code = createCastFunc(pCxt, pRight, pLeftExpr->resType, &pRightFunc);
if (TSDB_CODE_SUCCESS != code) {
@@ -3449,9 +3488,20 @@ static int32_t translateSetOperProject(STranslateContext* pCxt, SSetOperator* pS
}
REPLACE_LIST2_NODE(pRightFunc);
pRightExpr = (SExprNode*)pRightFunc;
- }
- strcpy(pRightExpr->aliasName, pLeftExpr->aliasName);
- pRightExpr->aliasName[strlen(pLeftExpr->aliasName)] = '\0';
+ } else if (comp < 0) {
+ SNode* pLeftFunc = NULL;
+ int32_t code = createCastFunc(pCxt, pLeft, pRightExpr->resType, &pLeftFunc);
+ if (TSDB_CODE_SUCCESS != code) {
+ return code;
+ }
+ REPLACE_LIST1_NODE(pLeftFunc);
+ SExprNode* pLeftFuncExpr = (SExprNode*)pLeftFunc;
+ snprintf(pLeftFuncExpr->aliasName, sizeof(pLeftFuncExpr->aliasName), "%s", pLeftExpr->aliasName);
+ snprintf(pLeftFuncExpr->userAlias, sizeof(pLeftFuncExpr->userAlias), "%s", pLeftExpr->userAlias);
+ pLeft = pLeftFunc;
+ pLeftExpr = pLeftFuncExpr;
+ }
+ snprintf(pRightExpr->aliasName, sizeof(pRightExpr->aliasName), "%s", pLeftExpr->aliasName);
if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pSetOperator->pProjectionList,
createSetOperProject(pSetOperator->stmtName, pLeft))) {
return TSDB_CODE_OUT_OF_MEMORY;
@@ -4942,7 +4992,8 @@ static int32_t translateUseDatabase(STranslateContext* pCxt, SUseDatabaseStmt* p
SName name = {0};
tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->dbName, strlen(pStmt->dbName));
tNameExtractFullName(&name, usedbReq.db);
- int32_t code = getDBVgVersion(pCxt, usedbReq.db, &usedbReq.vgVersion, &usedbReq.dbId, &usedbReq.numOfTable);
+ int32_t code =
+ getDBVgVersion(pCxt, usedbReq.db, &usedbReq.vgVersion, &usedbReq.dbId, &usedbReq.numOfTable, &usedbReq.stateTs);
if (TSDB_CODE_SUCCESS == code) {
code = buildCmdMsg(pCxt, TDMT_MND_USE_DB, (FSerializeFunc)tSerializeSUseDbReq, &usedbReq);
}
@@ -5217,9 +5268,7 @@ static int32_t checkTopicQuery(STranslateContext* pCxt, SSelectStmt* pSelect) {
}
static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pStmt, SCMCreateTopicReq* pReq) {
- SName name;
- tNameSetDbName(&name, pCxt->pParseCxt->acctId, pStmt->topicName, strlen(pStmt->topicName));
- tNameGetFullDbName(&name, pReq->name);
+ snprintf(pReq->name, sizeof(pReq->name), "%d.%s", pCxt->pParseCxt->acctId, pStmt->topicName);
pReq->igExists = pStmt->ignoreExists;
pReq->withMeta = pStmt->withMeta;
@@ -5229,7 +5278,7 @@ static int32_t buildCreateTopicReq(STranslateContext* pCxt, SCreateTopicStmt* pS
}
int32_t code = TSDB_CODE_SUCCESS;
-
+ SName name;
if ('\0' != pStmt->subSTbName[0]) {
pReq->subType = TOPIC_SUB_TYPE__TABLE;
toName(pCxt->pParseCxt->acctId, pStmt->subDbName, pStmt->subSTbName, &name);
@@ -5497,6 +5546,10 @@ static int32_t checkStreamQuery(STranslateContext* pCxt, SSelectStmt* pSelect) {
crossTableWithUdaf(pSelect)) {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY, "Unsupported stream query");
}
+ if (NULL != pSelect->pSubtable && TSDB_DATA_TYPE_VARCHAR != ((SExprNode*)pSelect->pSubtable)->resType.type) {
+ return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_STREAM_QUERY,
+ "SUBTABLE expression must be of VARCHAR type");
+ }
return TSDB_CODE_SUCCESS;
}
@@ -5626,6 +5679,7 @@ static int32_t translateCreateFunction(STranslateContext* pCxt, SCreateFunctionS
if (TSDB_CODE_SUCCESS == code) {
code = buildCmdMsg(pCxt, TDMT_MND_CREATE_FUNC, (FSerializeFunc)tSerializeSCreateFuncReq, &req);
}
+ tFreeSCreateFuncReq(&req);
return code;
}
@@ -6009,11 +6063,11 @@ static int32_t extractShowCreateTableResultSchema(int32_t* numOfCols, SSchema**
}
(*pSchema)[0].type = TSDB_DATA_TYPE_BINARY;
- (*pSchema)[0].bytes = TSDB_TABLE_NAME_LEN;
+ (*pSchema)[0].bytes = SHOW_CREATE_TB_RESULT_FIELD1_LEN;
strcpy((*pSchema)[0].name, "Table");
(*pSchema)[1].type = TSDB_DATA_TYPE_BINARY;
- (*pSchema)[1].bytes = TSDB_MAX_BINARY_LEN;
+ (*pSchema)[1].bytes = SHOW_CREATE_TB_RESULT_FIELD2_LEN;
strcpy((*pSchema)[1].name, "Create Table");
return TSDB_CODE_SUCCESS;
@@ -6254,21 +6308,29 @@ static SNode* createTagsFunction() {
return (SNode*)pFunc;
}
+static int32_t createShowTableTagsProjections(SNodeList** pProjections, SNodeList** pTags) {
+ if (NULL != *pTags) {
+ TSWAP(*pProjections, *pTags);
+ return TSDB_CODE_SUCCESS;
+ }
+ int32_t code = nodesListMakeStrictAppend(pProjections, createTbnameFunction());
+ if (TSDB_CODE_SUCCESS == code) {
+ code = nodesListStrictAppend(*pProjections, createTagsFunction());
+ }
+ return code;
+}
+
static int32_t rewriteShowStableTags(STranslateContext* pCxt, SQuery* pQuery) {
- const char* cols[] = {"tbname", "_tags"};
- SShowStmt* pShow = (SShowStmt*)pQuery->pRoot;
- SSelectStmt* pSelect = NULL;
+ SShowTableTagsStmt* pShow = (SShowTableTagsStmt*)pQuery->pRoot;
+ SSelectStmt* pSelect = NULL;
int32_t code = createSimpleSelectStmt(((SValueNode*)pShow->pDbName)->literal, ((SValueNode*)pShow->pTbName)->literal,
-1, NULL, &pSelect);
if (TSDB_CODE_SUCCESS == code) {
- code = nodesListMakeStrictAppend(&pSelect->pProjectionList, createTbnameFunction());
- }
- if (TSDB_CODE_SUCCESS == code) {
- code = nodesListMakeStrictAppend(&pSelect->pProjectionList, createTagsFunction());
+ code = createShowTableTagsProjections(&pSelect->pProjectionList, &pShow->pTags);
}
if (TSDB_CODE_SUCCESS == code) {
- pSelect->isDistinct = true;
pQuery->showRewrite = true;
+ pSelect->tagScan = true;
nodesDestroyNode(pQuery->pRoot);
pQuery->pRoot = (SNode*)pSelect;
} else {
diff --git a/source/libs/parser/src/parUtil.c b/source/libs/parser/src/parUtil.c
index d98d513d5d8891baed2a6bd30590fd2e6964aacb..e8c3f2fa8da8717c826ced8e33a540ebaa4db829 100644
--- a/source/libs/parser/src/parUtil.c
+++ b/source/libs/parser/src/parUtil.c
@@ -138,7 +138,7 @@ static char* getSyntaxErrFormat(int32_t errCode) {
case TSDB_CODE_PAR_CANNOT_DROP_PRIMARY_KEY:
return "Primary timestamp column cannot be dropped";
case TSDB_CODE_PAR_INVALID_MODIFY_COL:
- return "Only binary/nchar column length could be modified";
+ return "Only binary/nchar column length could be modified, and the length can only be increased, not decreased";
case TSDB_CODE_PAR_INVALID_TBNAME:
return "Invalid tbname pseudo column";
case TSDB_CODE_PAR_INVALID_FUNCTION_NAME:
@@ -612,62 +612,7 @@ static int32_t buildUdfReq(SHashObj* pUdfHash, SArray** pUdf) {
return TSDB_CODE_SUCCESS;
}
-static int32_t buildCatalogReqForInsert(SParseContext* pCxt, const SParseMetaCache* pMetaCache,
- SCatalogReq* pCatalogReq) {
- int32_t ndbs = taosHashGetSize(pMetaCache->pInsertTables);
- pCatalogReq->pTableMeta = taosArrayInit(ndbs, sizeof(STablesReq));
- if (NULL == pCatalogReq->pTableMeta) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- pCatalogReq->pTableHash = taosArrayInit(ndbs, sizeof(STablesReq));
- if (NULL == pCatalogReq->pTableHash) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- pCatalogReq->pUser = taosArrayInit(ndbs, sizeof(SUserAuthInfo));
- if (NULL == pCatalogReq->pUser) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
-
- pCxt->pTableMetaPos = taosArrayInit(pMetaCache->sqlTableNum, sizeof(int32_t));
- pCxt->pTableVgroupPos = taosArrayInit(pMetaCache->sqlTableNum, sizeof(int32_t));
-
- int32_t metaReqNo = 0;
- int32_t vgroupReqNo = 0;
- SInsertTablesMetaReq* p = taosHashIterate(pMetaCache->pInsertTables, NULL);
- while (NULL != p) {
- STablesReq req = {0};
- strcpy(req.dbFName, p->dbFName);
- TSWAP(req.pTables, p->pTableMetaReq);
- taosArrayPush(pCatalogReq->pTableMeta, &req);
-
- req.pTables = NULL;
- TSWAP(req.pTables, p->pTableVgroupReq);
- taosArrayPush(pCatalogReq->pTableHash, &req);
-
- int32_t ntables = taosArrayGetSize(p->pTableMetaPos);
- for (int32_t i = 0; i < ntables; ++i) {
- taosArrayInsert(pCxt->pTableMetaPos, *(int32_t*)taosArrayGet(p->pTableMetaPos, i), &metaReqNo);
- ++metaReqNo;
- }
-
- ntables = taosArrayGetSize(p->pTableVgroupPos);
- for (int32_t i = 0; i < ntables; ++i) {
- taosArrayInsert(pCxt->pTableVgroupPos, *(int32_t*)taosArrayGet(p->pTableVgroupPos, i), &vgroupReqNo);
- ++vgroupReqNo;
- }
-
- SUserAuthInfo auth = {0};
- snprintf(auth.user, sizeof(auth.user), "%s", pCxt->pUser);
- snprintf(auth.dbFName, sizeof(auth.dbFName), "%s", p->dbFName);
- auth.type = AUTH_TYPE_WRITE;
- taosArrayPush(pCatalogReq->pUser, &auth);
-
- p = taosHashIterate(pMetaCache->pInsertTables, p);
- }
- return TSDB_CODE_SUCCESS;
-}
-
-int32_t buildCatalogReqForQuery(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
+int32_t buildCatalogReq(const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
int32_t code = buildTableReqFromDb(pMetaCache->pTableMeta, &pCatalogReq->pTableMeta);
if (TSDB_CODE_SUCCESS == code) {
code = buildDbReq(pMetaCache->pDbVgroup, &pCatalogReq->pDbVgroup);
@@ -697,13 +642,6 @@ int32_t buildCatalogReqForQuery(const SParseMetaCache* pMetaCache, SCatalogReq*
return code;
}
-int32_t buildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
- if (NULL != pMetaCache->pInsertTables) {
- return buildCatalogReqForInsert(pCxt, pMetaCache, pCatalogReq);
- }
- return buildCatalogReqForQuery(pMetaCache, pCatalogReq);
-}
-
static int32_t putMetaDataToHash(const char* pKey, int32_t len, const SArray* pData, int32_t index, SHashObj** pHash) {
if (NULL == *pHash) {
*pHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), false, HASH_NO_LOCK);
@@ -791,8 +729,7 @@ static int32_t putUdfToCache(const SArray* pUdfReq, const SArray* pUdfData, SHas
return TSDB_CODE_SUCCESS;
}
-int32_t putMetaDataToCacheForQuery(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData,
- SParseMetaCache* pMetaCache) {
+int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache) {
int32_t code = putDbTableDataToCache(pCatalogReq->pTableMeta, pMetaData->pTableMeta, &pMetaCache->pTableMeta);
if (TSDB_CODE_SUCCESS == code) {
code = putDbDataToCache(pCatalogReq->pDbVgroup, pMetaData->pDbVgroup, &pMetaCache->pDbVgroup);
@@ -822,30 +759,6 @@ int32_t putMetaDataToCacheForQuery(const SCatalogReq* pCatalogReq, const SMetaDa
return code;
}
-int32_t putMetaDataToCacheForInsert(const SMetaData* pMetaData, SParseMetaCache* pMetaCache) {
- int32_t ndbs = taosArrayGetSize(pMetaData->pUser);
- for (int32_t i = 0; i < ndbs; ++i) {
- SMetaRes* pRes = taosArrayGet(pMetaData->pUser, i);
- if (TSDB_CODE_SUCCESS != pRes->code) {
- return pRes->code;
- }
- if (!(*(bool*)pRes->pRes)) {
- return TSDB_CODE_PAR_PERMISSION_DENIED;
- }
- }
- pMetaCache->pTableMetaData = pMetaData->pTableMeta;
- pMetaCache->pTableVgroupData = pMetaData->pTableHash;
- return TSDB_CODE_SUCCESS;
-}
-
-int32_t putMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache,
- bool insertValuesStmt) {
- if (insertValuesStmt) {
- return putMetaDataToCacheForInsert(pMetaData, pMetaCache);
- }
- return putMetaDataToCacheForQuery(pCatalogReq, pMetaData, pMetaCache);
-}
-
static int32_t reserveTableReqInCacheImpl(const char* pTbFName, int32_t len, SHashObj** pTables) {
if (NULL == *pTables) {
*pTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
@@ -963,13 +876,14 @@ int32_t reserveDbVgVersionInCache(int32_t acctId, const char* pDb, SParseMetaCac
}
int32_t getDbVgVersionFromCache(SParseMetaCache* pMetaCache, const char* pDbFName, int32_t* pVersion, int64_t* pDbId,
- int32_t* pTableNum) {
+ int32_t* pTableNum, int64_t* pStateTs) {
SDbInfo* pDbInfo = NULL;
int32_t code = getMetaDataFromHash(pDbFName, strlen(pDbFName), pMetaCache->pDbInfo, (void**)&pDbInfo);
if (TSDB_CODE_SUCCESS == code) {
*pVersion = pDbInfo->vgVer;
*pDbId = pDbInfo->dbId;
*pTableNum = pDbInfo->tbNum;
+ *pStateTs = pDbInfo->stateTs;
}
return code;
}
@@ -1146,82 +1060,6 @@ int32_t getDnodeListFromCache(SParseMetaCache* pMetaCache, SArray** pDnodes) {
return TSDB_CODE_SUCCESS;
}
-static int32_t reserveTableReqInCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
- SInsertTablesMetaReq* pReq) {
- switch (reqType) {
- case CATALOG_REQ_TYPE_META:
- taosArrayPush(pReq->pTableMetaReq, pName);
- taosArrayPush(pReq->pTableMetaPos, &tableNo);
- break;
- case CATALOG_REQ_TYPE_VGROUP:
- taosArrayPush(pReq->pTableVgroupReq, pName);
- taosArrayPush(pReq->pTableVgroupPos, &tableNo);
- break;
- case CATALOG_REQ_TYPE_BOTH:
- taosArrayPush(pReq->pTableMetaReq, pName);
- taosArrayPush(pReq->pTableMetaPos, &tableNo);
- taosArrayPush(pReq->pTableVgroupReq, pName);
- taosArrayPush(pReq->pTableVgroupPos, &tableNo);
- break;
- default:
- break;
- }
- return TSDB_CODE_SUCCESS;
-}
-
-static int32_t reserveTableReqInDbCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
- SHashObj* pDbs) {
- SInsertTablesMetaReq req = {.pTableMetaReq = taosArrayInit(4, sizeof(SName)),
- .pTableMetaPos = taosArrayInit(4, sizeof(int32_t)),
- .pTableVgroupReq = taosArrayInit(4, sizeof(SName)),
- .pTableVgroupPos = taosArrayInit(4, sizeof(int32_t))};
- tNameGetFullDbName(pName, req.dbFName);
- int32_t code = reserveTableReqInCacheForInsert(pName, reqType, tableNo, &req);
- if (TSDB_CODE_SUCCESS == code) {
- code = taosHashPut(pDbs, pName->dbname, strlen(pName->dbname), &req, sizeof(SInsertTablesMetaReq));
- }
- return code;
-}
-
-int32_t reserveTableMetaInCacheForInsert(const SName* pName, ECatalogReqType reqType, int32_t tableNo,
- SParseMetaCache* pMetaCache) {
- if (NULL == pMetaCache->pInsertTables) {
- pMetaCache->pInsertTables = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
- if (NULL == pMetaCache->pInsertTables) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- }
- pMetaCache->sqlTableNum = tableNo;
- SInsertTablesMetaReq* pReq = taosHashGet(pMetaCache->pInsertTables, pName->dbname, strlen(pName->dbname));
- if (NULL == pReq) {
- return reserveTableReqInDbCacheForInsert(pName, reqType, tableNo, pMetaCache->pInsertTables);
- }
- return reserveTableReqInCacheForInsert(pName, reqType, tableNo, pReq);
-}
-
-int32_t getTableMetaFromCacheForInsert(SArray* pTableMetaPos, SParseMetaCache* pMetaCache, int32_t tableNo,
- STableMeta** pMeta) {
- int32_t reqIndex = *(int32_t*)taosArrayGet(pTableMetaPos, tableNo);
- SMetaRes* pRes = taosArrayGet(pMetaCache->pTableMetaData, reqIndex);
- if (TSDB_CODE_SUCCESS == pRes->code) {
- *pMeta = tableMetaDup((const STableMeta*)pRes->pRes);
- if (NULL == *pMeta) {
- return TSDB_CODE_OUT_OF_MEMORY;
- }
- }
- return pRes->code;
-}
-
-int32_t getTableVgroupFromCacheForInsert(SArray* pTableVgroupPos, SParseMetaCache* pMetaCache, int32_t tableNo,
- SVgroupInfo* pVgroup) {
- int32_t reqIndex = *(int32_t*)taosArrayGet(pTableVgroupPos, tableNo);
- SMetaRes* pRes = taosArrayGet(pMetaCache->pTableVgroupData, reqIndex);
- if (TSDB_CODE_SUCCESS == pRes->code) {
- memcpy(pVgroup, pRes->pRes, sizeof(SVgroupInfo));
- }
- return pRes->code;
-}
-
void destoryParseTablesMetaReqHash(SHashObj* pHash) {
SParseTablesMetaReq* p = taosHashIterate(pHash, NULL);
while (NULL != p) {
@@ -1239,16 +1077,6 @@ void destoryParseMetaCache(SParseMetaCache* pMetaCache, bool request) {
taosHashCleanup(pMetaCache->pTableMeta);
taosHashCleanup(pMetaCache->pTableVgroup);
}
- SInsertTablesMetaReq* p = taosHashIterate(pMetaCache->pInsertTables, NULL);
- while (NULL != p) {
- taosArrayDestroy(p->pTableMetaPos);
- taosArrayDestroy(p->pTableMetaReq);
- taosArrayDestroy(p->pTableVgroupPos);
- taosArrayDestroy(p->pTableVgroupReq);
-
- p = taosHashIterate(pMetaCache->pInsertTables, p);
- }
- taosHashCleanup(pMetaCache->pInsertTables);
taosHashCleanup(pMetaCache->pDbVgroup);
taosHashCleanup(pMetaCache->pDbCfg);
taosHashCleanup(pMetaCache->pDbInfo);
diff --git a/source/libs/parser/src/parser.c b/source/libs/parser/src/parser.c
index 748478778adf2a16434c7290b213a21fab8b1ea2..cf338d63ff43182330d2f1e229aa2a03070feb6a 100644
--- a/source/libs/parser/src/parser.c
+++ b/source/libs/parser/src/parser.c
@@ -167,7 +167,7 @@ static void rewriteExprAlias(SNode* pRoot) {
int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
int32_t code = TSDB_CODE_SUCCESS;
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
- code = parseInsertSql(pCxt, pQuery, NULL);
+ code = parseInsertSql(pCxt, pQuery, NULL, NULL);
} else {
code = parseSqlIntoAst(pCxt, pQuery);
}
@@ -175,21 +175,26 @@ int32_t qParseSql(SParseContext* pCxt, SQuery** pQuery) {
return code;
}
-int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
+static int32_t parseQuerySyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
SParseMetaCache metaCache = {0};
- int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
+ int32_t code = parseSqlSyntax(pCxt, pQuery, &metaCache);
+ if (TSDB_CODE_SUCCESS == code) {
+ code = buildCatalogReq(&metaCache, pCatalogReq);
+ }
+ destoryParseMetaCache(&metaCache, true);
+ return code;
+}
+
+int32_t qParseSqlSyntax(SParseContext* pCxt, SQuery** pQuery, struct SCatalogReq* pCatalogReq) {
+ int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
if (TSDB_CODE_SUCCESS == code) {
if (qIsInsertValuesSql(pCxt->pSql, pCxt->sqlLen)) {
- code = parseInsertSyntax(pCxt, pQuery, &metaCache);
+ code = parseInsertSql(pCxt, pQuery, pCatalogReq, NULL);
} else {
- code = parseSqlSyntax(pCxt, pQuery, &metaCache);
+ code = parseQuerySyntax(pCxt, pQuery, pCatalogReq);
}
}
- if (TSDB_CODE_SUCCESS == code) {
- code = buildCatalogReq(pCxt, &metaCache, pCatalogReq);
- }
nodesReleaseAllocator(pCxt->allocatorId);
- destoryParseMetaCache(&metaCache, true);
terrno = code;
return code;
}
@@ -199,14 +204,10 @@ int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCata
SParseMetaCache metaCache = {0};
int32_t code = nodesAcquireAllocator(pCxt->allocatorId);
if (TSDB_CODE_SUCCESS == code) {
- code = putMetaDataToCache(pCatalogReq, pMetaData, &metaCache, NULL == pQuery->pRoot);
+ code = putMetaDataToCache(pCatalogReq, pMetaData, &metaCache);
}
if (TSDB_CODE_SUCCESS == code) {
- if (NULL == pQuery->pRoot) {
- code = parseInsertSql(pCxt, &pQuery, &metaCache);
- } else {
- code = analyseSemantic(pCxt, pQuery, &metaCache);
- }
+ code = analyseSemantic(pCxt, pQuery, &metaCache);
}
nodesReleaseAllocator(pCxt->allocatorId);
destoryParseMetaCache(&metaCache, false);
@@ -214,6 +215,11 @@ int32_t qAnalyseSqlSemantic(SParseContext* pCxt, const struct SCatalogReq* pCata
return code;
}
+int32_t qContinueParseSql(SParseContext* pCxt, struct SCatalogReq* pCatalogReq, const struct SMetaData* pMetaData,
+ SQuery* pQuery) {
+ return parseInsertSql(pCxt, &pQuery, pCatalogReq, pMetaData);
+}
+
void qDestroyParseContext(SParseContext* pCxt) {
if (NULL == pCxt) {
return;
diff --git a/source/libs/parser/src/sql.c b/source/libs/parser/src/sql.c
index 292060515cf78652164466af5a93e9229cbe0806..a8044fa848977cf1366d41b659dfa61d30fc98d5 100644
--- a/source/libs/parser/src/sql.c
+++ b/source/libs/parser/src/sql.c
@@ -104,26 +104,26 @@
#endif
/************* Begin control #defines *****************************************/
#define YYCODETYPE unsigned short int
-#define YYNOCODE 452
+#define YYNOCODE 454
#define YYACTIONTYPE unsigned short int
#define ParseTOKENTYPE SToken
typedef union {
int yyinit;
ParseTOKENTYPE yy0;
- EOperatorType yy4;
- int64_t yy37;
- SAlterOption yy101;
- SNode* yy232;
- SDataType yy264;
- SNodeList* yy288;
- SToken yy481;
- int8_t yy607;
- EFillMode yy614;
- int32_t yy692;
- EJoinType yy700;
- bool yy777;
- ENullOrder yy833;
- EOrder yy866;
+ ENullOrder yy153;
+ SNode* yy164;
+ bool yy193;
+ SAlterOption yy213;
+ EOrder yy238;
+ int32_t yy512;
+ int64_t yy577;
+ SToken yy593;
+ EFillMode yy638;
+ SNodeList* yy648;
+ EOperatorType yy656;
+ int8_t yy687;
+ SDataType yy720;
+ EJoinType yy868;
} YYMINORTYPE;
#ifndef YYSTACKDEPTH
#define YYSTACKDEPTH 100
@@ -139,17 +139,17 @@ typedef union {
#define ParseCTX_FETCH
#define ParseCTX_STORE
#define YYFALLBACK 1
-#define YYNSTATE 701
-#define YYNRULE 528
+#define YYNSTATE 705
+#define YYNRULE 536
#define YYNTOKEN 319
-#define YY_MAX_SHIFT 700
-#define YY_MIN_SHIFTREDUCE 1036
-#define YY_MAX_SHIFTREDUCE 1563
-#define YY_ERROR_ACTION 1564
-#define YY_ACCEPT_ACTION 1565
-#define YY_NO_ACTION 1566
-#define YY_MIN_REDUCE 1567
-#define YY_MAX_REDUCE 2094
+#define YY_MAX_SHIFT 704
+#define YY_MIN_SHIFTREDUCE 1046
+#define YY_MAX_SHIFTREDUCE 1581
+#define YY_ERROR_ACTION 1582
+#define YY_ACCEPT_ACTION 1583
+#define YY_NO_ACTION 1584
+#define YY_MIN_REDUCE 1585
+#define YY_MAX_REDUCE 2120
/************* End control #defines *******************************************/
#define YY_NLOOKAHEAD ((int)(sizeof(yy_lookahead)/sizeof(yy_lookahead[0])))
@@ -216,861 +216,821 @@ typedef union {
** yy_default[] Default action for each state.
**
*********** Begin parsing tables **********************************************/
-#define YY_ACTTAB_COUNT (3333)
+#define YY_ACTTAB_COUNT (3135)
static const YYACTIONTYPE yy_action[] = {
- /* 0 */ 450, 167, 451, 1602, 77, 458, 1711, 451, 1602, 538,
- /* 10 */ 1824, 552, 44, 42, 1759, 339, 338, 1892, 1069, 1821,
- /* 20 */ 353, 1568, 1344, 154, 120, 552, 1896, 1716, 593, 1897,
- /* 30 */ 1910, 488, 1722, 1424, 156, 1342, 593, 1892, 52, 1673,
- /* 40 */ 1892, 1720, 110, 1888, 1894, 109, 108, 107, 106, 105,
- /* 50 */ 104, 103, 102, 101, 590, 1720, 600, 1419, 1073, 1074,
- /* 60 */ 1928, 1370, 17, 1888, 1894, 341, 1888, 1894, 607, 1350,
- /* 70 */ 44, 42, 1494, 1878, 449, 606, 600, 453, 353, 600,
- /* 80 */ 1344, 467, 37, 36, 132, 1772, 43, 41, 40, 39,
- /* 90 */ 38, 1424, 1910, 1342, 1372, 1, 608, 157, 552, 1579,
- /* 100 */ 1944, 1771, 1896, 46, 98, 352, 1911, 610, 1913, 1914,
- /* 110 */ 605, 176, 600, 1892, 58, 1419, 552, 697, 1910, 1997,
- /* 120 */ 17, 130, 1928, 317, 1993, 398, 1698, 1350, 1720, 120,
- /* 130 */ 607, 1426, 1427, 635, 2065, 1878, 493, 606, 47, 1888,
- /* 140 */ 1894, 347, 592, 169, 2005, 2006, 1720, 2010, 1928, 577,
- /* 150 */ 171, 455, 600, 1, 2066, 579, 607, 1367, 1908, 77,
- /* 160 */ 1590, 1878, 1944, 606, 313, 329, 97, 1909, 1911, 610,
- /* 170 */ 1913, 1914, 605, 125, 600, 697, 1345, 129, 1343, 141,
- /* 180 */ 1968, 1997, 1715, 1928, 1908, 346, 1993, 467, 1944, 1426,
- /* 190 */ 1427, 572, 159, 1909, 1911, 610, 1913, 1914, 605, 435,
- /* 200 */ 600, 1348, 1349, 1878, 1399, 1400, 1402, 1403, 1404, 1405,
- /* 210 */ 1406, 1407, 1408, 1409, 602, 598, 1417, 1418, 1420, 1421,
- /* 220 */ 1422, 1423, 1425, 1428, 3, 1565, 330, 1369, 328, 327,
- /* 230 */ 571, 490, 222, 573, 1345, 492, 1343, 246, 457, 236,
- /* 240 */ 237, 453, 174, 110, 580, 2086, 109, 108, 107, 106,
- /* 250 */ 105, 104, 103, 102, 101, 186, 185, 491, 182, 1348,
- /* 260 */ 1349, 174, 1399, 1400, 1402, 1403, 1404, 1405, 1406, 1407,
- /* 270 */ 1408, 1409, 602, 598, 1417, 1418, 1420, 1421, 1422, 1423,
- /* 280 */ 1425, 1428, 3, 44, 42, 174, 368, 1371, 79, 315,
- /* 290 */ 643, 353, 542, 1344, 540, 74, 1696, 315, 73, 593,
- /* 300 */ 542, 1910, 540, 534, 1424, 2070, 1342, 1195, 632, 631,
- /* 310 */ 630, 1199, 629, 1201, 1202, 628, 1204, 625, 230, 1210,
- /* 320 */ 622, 1212, 1213, 619, 616, 11, 358, 9, 1419, 1765,
- /* 330 */ 1767, 1928, 2065, 17, 2065, 2012, 62, 1498, 87, 607,
- /* 340 */ 1350, 44, 42, 1369, 1878, 1865, 606, 2071, 171, 353,
- /* 350 */ 2069, 1344, 2066, 579, 2066, 2068, 58, 643, 81, 700,
- /* 360 */ 1713, 58, 1424, 2009, 1342, 1520, 1, 608, 387, 7,
- /* 370 */ 1086, 1944, 1085, 277, 46, 297, 352, 1911, 610, 1913,
- /* 380 */ 1914, 605, 1567, 600, 1368, 207, 1419, 165, 697, 389,
- /* 390 */ 385, 17, 375, 690, 686, 682, 678, 275, 1350, 1491,
- /* 400 */ 1087, 1155, 1426, 1427, 11, 2065, 119, 118, 117, 116,
- /* 410 */ 115, 114, 113, 112, 111, 565, 1518, 1519, 1521, 1522,
- /* 420 */ 577, 171, 1772, 1350, 1, 2066, 579, 58, 1589, 322,
- /* 430 */ 269, 504, 503, 502, 95, 1157, 1434, 243, 1770, 126,
- /* 440 */ 498, 391, 1369, 390, 497, 496, 697, 1345, 655, 1343,
- /* 450 */ 495, 501, 392, 1697, 1369, 1370, 494, 1814, 37, 36,
- /* 460 */ 1426, 1427, 43, 41, 40, 39, 38, 578, 179, 534,
- /* 470 */ 549, 1878, 1348, 1349, 1709, 1399, 1400, 1402, 1403, 1404,
- /* 480 */ 1405, 1406, 1407, 1408, 1409, 602, 598, 1417, 1418, 1420,
- /* 490 */ 1421, 1422, 1423, 1425, 1428, 3, 2065, 11, 2065, 1772,
- /* 500 */ 34, 270, 232, 174, 1705, 1345, 340, 1343, 174, 1707,
- /* 510 */ 94, 577, 171, 2071, 171, 1770, 2066, 579, 2066, 579,
- /* 520 */ 1315, 174, 225, 229, 127, 1766, 1767, 1910, 1401, 58,
- /* 530 */ 1348, 1349, 1712, 1399, 1400, 1402, 1403, 1404, 1405, 1406,
- /* 540 */ 1407, 1408, 1409, 602, 598, 1417, 1418, 1420, 1421, 1422,
- /* 550 */ 1423, 1425, 1428, 3, 44, 42, 2070, 1928, 500, 499,
- /* 560 */ 641, 356, 353, 80, 1344, 607, 1237, 1238, 568, 154,
- /* 570 */ 1878, 1487, 606, 1371, 174, 1424, 1814, 1342, 1722, 145,
- /* 580 */ 144, 638, 637, 636, 37, 36, 1910, 180, 43, 41,
- /* 590 */ 40, 39, 38, 1908, 554, 552, 1969, 1944, 1086, 1419,
- /* 600 */ 1085, 158, 1909, 1911, 610, 1913, 1914, 605, 396, 600,
- /* 610 */ 1772, 1350, 44, 42, 1429, 1455, 1928, 357, 1560, 518,
- /* 620 */ 353, 336, 1344, 552, 607, 1720, 1770, 1401, 1087, 1878,
- /* 630 */ 1703, 606, 516, 1424, 514, 1342, 397, 8, 1490, 235,
- /* 640 */ 37, 36, 557, 2034, 43, 41, 40, 39, 38, 1553,
- /* 650 */ 359, 226, 1908, 1720, 574, 569, 1944, 1419, 154, 697,
- /* 660 */ 304, 1909, 1911, 610, 1913, 1914, 605, 1722, 600, 1350,
- /* 670 */ 349, 348, 1530, 1426, 1427, 1344, 174, 37, 36, 552,
- /* 680 */ 1358, 43, 41, 40, 39, 38, 31, 223, 1342, 552,
- /* 690 */ 1750, 1424, 407, 1351, 30, 8, 1460, 2012, 1321, 1322,
- /* 700 */ 37, 36, 421, 538, 43, 41, 40, 39, 38, 1720,
- /* 710 */ 2012, 552, 26, 1822, 1559, 1419, 269, 697, 1345, 1720,
- /* 720 */ 1343, 2069, 1350, 32, 422, 2008, 399, 1350, 1510, 37,
- /* 730 */ 36, 1426, 1427, 43, 41, 40, 39, 38, 2007, 400,
- /* 740 */ 2070, 1720, 128, 1348, 1349, 1968, 1399, 1400, 1402, 1403,
- /* 750 */ 1404, 1405, 1406, 1407, 1408, 1409, 602, 598, 1417, 1418,
- /* 760 */ 1420, 1421, 1422, 1423, 1425, 1428, 3, 13, 12, 2065,
- /* 770 */ 697, 40, 39, 38, 601, 596, 1345, 641, 1343, 43,
- /* 780 */ 41, 40, 39, 38, 174, 2069, 634, 37, 36, 2066,
- /* 790 */ 2067, 43, 41, 40, 39, 38, 145, 144, 638, 637,
- /* 800 */ 636, 1348, 1349, 143, 1399, 1400, 1402, 1403, 1404, 1405,
- /* 810 */ 1406, 1407, 1408, 1409, 602, 598, 1417, 1418, 1420, 1421,
- /* 820 */ 1422, 1423, 1425, 1428, 3, 44, 42, 492, 552, 1345,
- /* 830 */ 1820, 1343, 308, 353, 1359, 1344, 1354, 585, 556, 552,
- /* 840 */ 1969, 465, 668, 666, 529, 1588, 1424, 1587, 1342, 491,
- /* 850 */ 552, 537, 466, 1814, 1348, 1349, 51, 1910, 1720, 1362,
- /* 860 */ 1364, 1369, 1467, 1717, 184, 1073, 1074, 1586, 534, 1720,
- /* 870 */ 1419, 1585, 1674, 598, 1417, 1418, 1420, 1421, 1422, 1423,
- /* 880 */ 1720, 552, 1350, 44, 42, 552, 552, 1928, 1878, 1580,
- /* 890 */ 1878, 353, 366, 1344, 137, 607, 1634, 2065, 530, 535,
- /* 900 */ 1878, 656, 606, 1690, 1424, 1584, 1342, 406, 8, 534,
- /* 910 */ 1878, 1720, 2071, 171, 1878, 1720, 1720, 2066, 579, 1621,
- /* 920 */ 1819, 1583, 308, 1908, 1582, 2017, 1487, 1944, 1419, 1581,
- /* 930 */ 697, 98, 1909, 1911, 610, 1913, 1914, 605, 2065, 600,
- /* 940 */ 1350, 505, 153, 1578, 1426, 1427, 1997, 1577, 1878, 1614,
- /* 950 */ 1996, 1993, 552, 2071, 171, 72, 1576, 552, 2066, 579,
- /* 960 */ 504, 503, 502, 45, 1878, 240, 1, 1878, 126, 498,
- /* 970 */ 360, 507, 1878, 497, 496, 639, 2037, 581, 1763, 495,
- /* 980 */ 501, 206, 1720, 1372, 208, 494, 1878, 1720, 697, 1345,
- /* 990 */ 1878, 1343, 365, 1695, 522, 582, 1575, 264, 161, 1878,
- /* 1000 */ 1574, 1573, 1426, 1427, 484, 480, 476, 472, 205, 534,
- /* 1010 */ 640, 534, 234, 1763, 1348, 1349, 1292, 1399, 1400, 1402,
- /* 1020 */ 1403, 1404, 1405, 1406, 1407, 1408, 1409, 602, 598, 1417,
- /* 1030 */ 1418, 1420, 1421, 1422, 1423, 1425, 1428, 3, 2065, 1878,
- /* 1040 */ 2065, 154, 566, 1878, 1878, 78, 1401, 1345, 203, 1343,
- /* 1050 */ 1723, 48, 4, 2071, 171, 2071, 171, 586, 2066, 579,
- /* 1060 */ 2066, 579, 37, 36, 1572, 238, 43, 41, 40, 39,
- /* 1070 */ 38, 1571, 1348, 1349, 1631, 1399, 1400, 1402, 1403, 1404,
- /* 1080 */ 1405, 1406, 1407, 1408, 1409, 602, 598, 1417, 1418, 1420,
- /* 1090 */ 1421, 1422, 1423, 1425, 1428, 3, 312, 1801, 1367, 282,
- /* 1100 */ 641, 590, 1750, 50, 533, 429, 590, 1878, 440, 213,
- /* 1110 */ 202, 196, 211, 201, 1878, 215, 138, 463, 214, 145,
- /* 1120 */ 144, 638, 637, 636, 1570, 413, 245, 441, 142, 217,
- /* 1130 */ 415, 132, 216, 194, 219, 143, 132, 218, 674, 673,
- /* 1140 */ 672, 671, 363, 258, 670, 669, 133, 664, 663, 662,
- /* 1150 */ 661, 660, 659, 658, 657, 147, 653, 652, 651, 362,
- /* 1160 */ 361, 648, 647, 646, 645, 644, 155, 1878, 130, 545,
- /* 1170 */ 552, 288, 325, 130, 597, 1562, 1563, 13, 12, 60,
- /* 1180 */ 1353, 242, 2070, 548, 402, 286, 66, 1612, 1188, 65,
- /* 1190 */ 170, 2005, 2006, 1608, 2010, 172, 2005, 2006, 250, 2010,
- /* 1200 */ 1720, 60, 1929, 45, 364, 45, 190, 446, 444, 510,
- /* 1210 */ 614, 142, 439, 583, 1910, 434, 433, 432, 431, 428,
- /* 1220 */ 427, 426, 425, 424, 420, 419, 418, 417, 326, 410,
- /* 1230 */ 409, 408, 1517, 404, 403, 324, 1352, 1603, 1899, 1760,
- /* 1240 */ 552, 692, 552, 58, 1928, 143, 416, 552, 2027, 122,
- /* 1250 */ 591, 253, 594, 550, 1461, 551, 1410, 1878, 281, 606,
- /* 1260 */ 271, 37, 36, 1216, 1220, 43, 41, 40, 39, 38,
- /* 1270 */ 1720, 509, 1720, 93, 266, 1553, 590, 1720, 263, 2,
- /* 1280 */ 1908, 96, 578, 90, 1944, 5, 519, 1901, 97, 1909,
- /* 1290 */ 1911, 610, 1913, 1914, 605, 1115, 600, 142, 1227, 369,
- /* 1300 */ 221, 168, 1225, 1997, 374, 323, 132, 346, 1993, 1308,
- /* 1310 */ 278, 2065, 649, 1445, 512, 318, 71, 70, 395, 506,
- /* 1320 */ 173, 178, 183, 1356, 220, 1910, 577, 171, 2023, 1116,
- /* 1330 */ 650, 2066, 579, 401, 1135, 437, 405, 411, 1367, 311,
- /* 1340 */ 430, 423, 383, 121, 381, 377, 373, 370, 367, 1816,
- /* 1350 */ 146, 1910, 1133, 436, 438, 1928, 442, 1453, 443, 1373,
- /* 1360 */ 448, 64, 187, 594, 63, 267, 2005, 589, 1878, 588,
- /* 1370 */ 606, 456, 2065, 445, 1375, 447, 459, 193, 1374, 1355,
- /* 1380 */ 460, 1928, 1376, 195, 461, 462, 198, 577, 171, 607,
- /* 1390 */ 174, 1908, 2066, 579, 1878, 1944, 606, 464, 200, 97,
- /* 1400 */ 1909, 1911, 610, 1913, 1914, 605, 75, 600, 1089, 468,
- /* 1410 */ 76, 1454, 168, 485, 1997, 204, 486, 1908, 346, 1993,
- /* 1420 */ 487, 1944, 489, 99, 1710, 97, 1909, 1911, 610, 1913,
- /* 1430 */ 1914, 605, 314, 600, 210, 1706, 521, 523, 2085, 2024,
- /* 1440 */ 1997, 212, 148, 149, 346, 1993, 1708, 1704, 279, 224,
- /* 1450 */ 150, 151, 1855, 524, 2031, 528, 227, 531, 536, 231,
- /* 1460 */ 564, 525, 546, 1910, 84, 335, 539, 1854, 1826, 543,
- /* 1470 */ 280, 337, 86, 1721, 1372, 139, 560, 567, 2043, 562,
- /* 1480 */ 140, 2042, 33, 350, 1448, 1449, 1450, 1451, 1452, 1456,
- /* 1490 */ 1457, 1458, 1459, 1928, 547, 248, 6, 563, 342, 252,
- /* 1500 */ 2019, 607, 2028, 570, 2038, 576, 1878, 561, 606, 559,
- /* 1510 */ 558, 257, 343, 587, 2064, 2088, 584, 1487, 1371, 262,
- /* 1520 */ 57, 131, 88, 1691, 2013, 612, 283, 274, 1764, 1908,
- /* 1530 */ 1910, 693, 694, 1944, 696, 49, 295, 97, 1909, 1911,
- /* 1540 */ 610, 1913, 1914, 605, 307, 600, 306, 162, 259, 260,
- /* 1550 */ 2085, 1978, 1997, 285, 261, 305, 346, 1993, 287, 1872,
- /* 1560 */ 1928, 1871, 265, 68, 1870, 1869, 2059, 69, 607, 371,
- /* 1570 */ 372, 1336, 1337, 1878, 1866, 606, 177, 376, 1864, 378,
- /* 1580 */ 379, 380, 1863, 382, 1910, 1862, 384, 1861, 386, 1860,
- /* 1590 */ 388, 1311, 1310, 1837, 1836, 393, 1908, 394, 1835, 1834,
- /* 1600 */ 1944, 1809, 1280, 1808, 97, 1909, 1911, 610, 1913, 1914,
- /* 1610 */ 605, 1806, 600, 134, 1928, 1805, 1804, 2085, 1807, 1997,
- /* 1620 */ 181, 135, 607, 346, 1993, 1803, 1802, 1878, 1800, 606,
- /* 1630 */ 1799, 1798, 412, 2016, 1797, 414, 1796, 1795, 1910, 1794,
- /* 1640 */ 1793, 1792, 1791, 1790, 1789, 1788, 1787, 1786, 1785, 1784,
- /* 1650 */ 1908, 1783, 1782, 1781, 1944, 136, 1780, 1779, 97, 1909,
- /* 1660 */ 1911, 610, 1913, 1914, 605, 1778, 600, 1777, 1928, 1776,
- /* 1670 */ 1775, 1972, 1282, 1997, 188, 1635, 607, 346, 1993, 1774,
- /* 1680 */ 1773, 1878, 1636, 606, 189, 1633, 1599, 1076, 1598, 1163,
- /* 1690 */ 1075, 1910, 1108, 199, 1832, 1818, 1699, 191, 123, 1850,
- /* 1700 */ 1844, 166, 192, 124, 1908, 1833, 452, 454, 1944, 1632,
- /* 1710 */ 197, 1630, 97, 1909, 1911, 610, 1913, 1914, 605, 469,
- /* 1720 */ 600, 1928, 471, 1628, 470, 1970, 473, 1997, 474, 607,
- /* 1730 */ 1626, 346, 1993, 1624, 1878, 1611, 606, 475, 477, 481,
- /* 1740 */ 478, 479, 1610, 1595, 1910, 483, 1701, 1231, 482, 1230,
- /* 1750 */ 1700, 1154, 1153, 1152, 1151, 1150, 665, 1908, 667, 1147,
- /* 1760 */ 1146, 1944, 1145, 1144, 1622, 97, 1909, 1911, 610, 1913,
- /* 1770 */ 1914, 605, 59, 600, 1928, 331, 1615, 332, 555, 1613,
- /* 1780 */ 1997, 508, 607, 333, 346, 1993, 511, 1878, 1594, 606,
- /* 1790 */ 1593, 209, 513, 515, 1592, 517, 1849, 100, 53, 1843,
- /* 1800 */ 1317, 152, 526, 1328, 1831, 1910, 1829, 1830, 2070, 25,
- /* 1810 */ 1908, 1828, 1827, 18, 1944, 1825, 1326, 233, 98, 1909,
- /* 1820 */ 1911, 610, 1913, 1914, 605, 1817, 600, 1325, 532, 1910,
- /* 1830 */ 83, 239, 228, 1997, 82, 1928, 85, 595, 1993, 90,
- /* 1840 */ 19, 527, 15, 604, 244, 20, 241, 27, 1878, 1436,
- /* 1850 */ 606, 56, 1532, 334, 541, 247, 255, 1435, 544, 1928,
- /* 1860 */ 10, 29, 249, 1514, 251, 256, 1516, 607, 1509, 160,
- /* 1870 */ 1899, 1908, 1878, 254, 606, 1944, 61, 28, 89, 303,
- /* 1880 */ 1909, 1911, 610, 1913, 1914, 605, 603, 600, 553, 1962,
- /* 1890 */ 22, 1910, 1547, 1546, 344, 1908, 1552, 1553, 1551, 1944,
- /* 1900 */ 1550, 345, 268, 98, 1909, 1911, 610, 1913, 1914, 605,
- /* 1910 */ 1484, 600, 1483, 55, 1898, 163, 12, 1360, 1997, 1414,
- /* 1920 */ 164, 1928, 1947, 1994, 599, 175, 35, 1446, 1412, 604,
- /* 1930 */ 1411, 14, 23, 1392, 1878, 1384, 606, 24, 613, 611,
- /* 1940 */ 609, 1217, 1910, 355, 615, 617, 1214, 618, 620, 1211,
- /* 1950 */ 621, 623, 626, 1194, 21, 624, 16, 1908, 1205, 1209,
- /* 1960 */ 1203, 1944, 54, 1208, 1226, 303, 1909, 1911, 610, 1913,
- /* 1970 */ 1914, 605, 1928, 600, 1222, 1963, 272, 627, 91, 633,
- /* 1980 */ 607, 92, 67, 1106, 642, 1878, 1207, 606, 1141, 1140,
- /* 1990 */ 1206, 1139, 1138, 1137, 1136, 1134, 1910, 1132, 1131, 1130,
- /* 2000 */ 1128, 1161, 1127, 1126, 654, 1125, 1124, 1123, 1908, 273,
- /* 2010 */ 1122, 1121, 1944, 1158, 1910, 1156, 158, 1909, 1911, 610,
- /* 2020 */ 1913, 1914, 605, 1118, 600, 1117, 1928, 1114, 1113, 1112,
- /* 2030 */ 1111, 1629, 675, 677, 607, 1627, 676, 679, 680, 1878,
- /* 2040 */ 681, 606, 1625, 683, 1928, 684, 1623, 687, 685, 689,
- /* 2050 */ 688, 1609, 607, 691, 1066, 1591, 276, 1878, 2035, 606,
- /* 2060 */ 695, 1566, 1908, 1346, 699, 284, 1944, 1566, 698, 1566,
- /* 2070 */ 299, 1909, 1911, 610, 1913, 1914, 605, 1566, 600, 1566,
- /* 2080 */ 1908, 1566, 1566, 1566, 1944, 1566, 1566, 1566, 159, 1909,
- /* 2090 */ 1911, 610, 1913, 1914, 605, 1566, 600, 1910, 1566, 1566,
- /* 2100 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2110 */ 1566, 1566, 1566, 1566, 575, 1566, 1566, 1566, 1566, 1566,
- /* 2120 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1928, 1566, 1566,
- /* 2130 */ 1566, 1566, 351, 1566, 1566, 607, 1566, 1566, 1566, 1566,
- /* 2140 */ 1878, 2087, 606, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2150 */ 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2160 */ 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944, 1566, 1566,
- /* 2170 */ 1566, 304, 1909, 1911, 610, 1913, 1914, 605, 1566, 600,
- /* 2180 */ 1566, 1566, 1928, 1566, 1566, 1566, 1566, 354, 1566, 1566,
- /* 2190 */ 607, 1566, 1566, 1566, 1566, 1878, 1566, 606, 1566, 1566,
- /* 2200 */ 1566, 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2210 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1908, 1566,
- /* 2220 */ 1566, 1566, 1944, 1566, 1566, 1566, 304, 1909, 1911, 610,
- /* 2230 */ 1913, 1914, 605, 1928, 600, 1566, 1566, 1566, 1566, 1566,
- /* 2240 */ 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566, 606, 1566,
- /* 2250 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1910, 1566, 1566,
- /* 2260 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 520,
- /* 2270 */ 1566, 1566, 1566, 1944, 1566, 1566, 1566, 297, 1909, 1911,
- /* 2280 */ 610, 1913, 1914, 605, 1566, 600, 1566, 1928, 1566, 1566,
- /* 2290 */ 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566, 1566, 1566,
- /* 2300 */ 1878, 1566, 606, 1566, 1566, 1566, 1566, 1566, 1910, 1566,
- /* 2310 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2320 */ 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944, 1566, 1566,
- /* 2330 */ 1566, 289, 1909, 1911, 610, 1913, 1914, 605, 1928, 600,
- /* 2340 */ 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566, 1566,
- /* 2350 */ 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2360 */ 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2370 */ 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944, 1566,
- /* 2380 */ 1910, 1566, 290, 1909, 1911, 610, 1913, 1914, 605, 1566,
- /* 2390 */ 600, 1566, 1928, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2400 */ 607, 1566, 1566, 1566, 1566, 1878, 1566, 606, 1566, 1566,
- /* 2410 */ 1928, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566,
- /* 2420 */ 1566, 1566, 1566, 1878, 1566, 606, 1566, 1566, 1908, 1566,
- /* 2430 */ 1566, 1566, 1944, 1566, 1566, 1566, 291, 1909, 1911, 610,
- /* 2440 */ 1913, 1914, 605, 1566, 600, 1566, 1908, 1566, 1566, 1566,
- /* 2450 */ 1944, 1566, 1566, 1566, 298, 1909, 1911, 610, 1913, 1914,
- /* 2460 */ 605, 1566, 600, 1910, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2470 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2480 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2490 */ 1566, 1566, 1566, 1928, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2500 */ 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566, 606, 1566,
- /* 2510 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1910, 1566,
- /* 2520 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1908,
- /* 2530 */ 1566, 1566, 1566, 1944, 1566, 1566, 1566, 300, 1909, 1911,
- /* 2540 */ 610, 1913, 1914, 605, 1566, 600, 1566, 1566, 1928, 1566,
- /* 2550 */ 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566, 1566,
- /* 2560 */ 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566, 1566, 1910,
- /* 2570 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2580 */ 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944, 1566,
- /* 2590 */ 1566, 1566, 292, 1909, 1911, 610, 1913, 1914, 605, 1928,
- /* 2600 */ 600, 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566,
- /* 2610 */ 1566, 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566, 1566,
- /* 2620 */ 1566, 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2630 */ 1566, 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944,
- /* 2640 */ 1566, 1566, 1566, 301, 1909, 1911, 610, 1913, 1914, 605,
- /* 2650 */ 1566, 600, 1566, 1928, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2660 */ 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566, 606, 1566,
- /* 2670 */ 1566, 1566, 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566,
- /* 2680 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1908,
- /* 2690 */ 1566, 1566, 1566, 1944, 1566, 1566, 1566, 293, 1909, 1911,
- /* 2700 */ 610, 1913, 1914, 605, 1928, 600, 1566, 1566, 1566, 1566,
- /* 2710 */ 1566, 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566, 606,
- /* 2720 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1910, 1566,
- /* 2730 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2740 */ 1908, 1566, 1566, 1566, 1944, 1566, 1910, 1566, 302, 1909,
- /* 2750 */ 1911, 610, 1913, 1914, 605, 1566, 600, 1566, 1928, 1566,
- /* 2760 */ 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566, 1566,
- /* 2770 */ 1566, 1878, 1566, 606, 1566, 1566, 1928, 1566, 1566, 1566,
- /* 2780 */ 1566, 1566, 1566, 1566, 607, 1566, 1566, 1566, 1566, 1878,
- /* 2790 */ 1566, 606, 1566, 1566, 1908, 1566, 1566, 1566, 1944, 1566,
- /* 2800 */ 1566, 1566, 294, 1909, 1911, 610, 1913, 1914, 605, 1566,
- /* 2810 */ 600, 1566, 1908, 1566, 1566, 1566, 1944, 1566, 1566, 1566,
- /* 2820 */ 309, 1909, 1911, 610, 1913, 1914, 605, 1566, 600, 1910,
- /* 2830 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2840 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2850 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1928,
- /* 2860 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566,
- /* 2870 */ 1566, 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566, 1566,
- /* 2880 */ 1566, 1566, 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566,
- /* 2890 */ 1566, 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944,
- /* 2900 */ 1566, 1566, 1566, 310, 1909, 1911, 610, 1913, 1914, 605,
- /* 2910 */ 1566, 600, 1566, 1566, 1928, 1566, 1566, 1566, 1566, 1566,
- /* 2920 */ 1566, 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566, 606,
- /* 2930 */ 1566, 1566, 1566, 1566, 1566, 1910, 1566, 1566, 1566, 1566,
- /* 2940 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 2950 */ 1908, 1566, 1566, 1566, 1944, 1566, 1566, 1566, 1922, 1909,
- /* 2960 */ 1911, 610, 1913, 1914, 605, 1928, 600, 1566, 1566, 1566,
- /* 2970 */ 1566, 1566, 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566,
- /* 2980 */ 606, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1910,
- /* 2990 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3000 */ 1566, 1908, 1566, 1566, 1566, 1944, 1566, 1566, 1566, 1921,
- /* 3010 */ 1909, 1911, 610, 1913, 1914, 605, 1566, 600, 1566, 1928,
- /* 3020 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566, 1566,
- /* 3030 */ 1566, 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566, 1566,
- /* 3040 */ 1910, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3050 */ 1566, 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566, 1944,
- /* 3060 */ 1566, 1566, 1566, 1920, 1909, 1911, 610, 1913, 1914, 605,
- /* 3070 */ 1928, 600, 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566,
- /* 3080 */ 1566, 1566, 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566,
- /* 3090 */ 1566, 1566, 1566, 1566, 1910, 1566, 1566, 1566, 1566, 1566,
- /* 3100 */ 1566, 1566, 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566,
- /* 3110 */ 1944, 1566, 1910, 1566, 319, 1909, 1911, 610, 1913, 1914,
- /* 3120 */ 605, 1566, 600, 1566, 1928, 1566, 1566, 1566, 1566, 1566,
- /* 3130 */ 1566, 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566, 606,
- /* 3140 */ 1566, 1566, 1928, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3150 */ 607, 1566, 1566, 1566, 1566, 1878, 1566, 606, 1566, 1566,
- /* 3160 */ 1908, 1566, 1566, 1566, 1944, 1566, 1566, 1566, 320, 1909,
- /* 3170 */ 1911, 610, 1913, 1914, 605, 1566, 600, 1566, 1908, 1566,
- /* 3180 */ 1566, 1566, 1944, 1566, 1566, 1566, 316, 1909, 1911, 610,
- /* 3190 */ 1913, 1914, 605, 1566, 600, 1910, 1566, 1566, 1566, 1566,
- /* 3200 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3210 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3220 */ 1566, 1566, 1566, 1566, 1566, 1928, 1566, 1566, 1566, 1566,
- /* 3230 */ 1566, 1566, 1566, 607, 1566, 1566, 1566, 1566, 1878, 1566,
- /* 3240 */ 606, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3250 */ 1910, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3260 */ 1566, 1908, 1566, 1566, 1566, 1944, 1566, 1566, 1566, 321,
- /* 3270 */ 1909, 1911, 610, 1913, 1914, 605, 1566, 600, 1566, 1566,
- /* 3280 */ 1928, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 607, 1566,
- /* 3290 */ 1566, 1566, 1566, 1878, 1566, 606, 1566, 1566, 1566, 1566,
- /* 3300 */ 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566, 1566,
- /* 3310 */ 1566, 1566, 1566, 1566, 1566, 1566, 1908, 1566, 1566, 1566,
- /* 3320 */ 1944, 1566, 1566, 1566, 296, 1909, 1911, 610, 1913, 1914,
- /* 3330 */ 605, 1566, 600,
+ /* 0 */ 454, 1936, 455, 1620, 1832, 168, 363, 594, 556, 1783,
+ /* 10 */ 1785, 556, 44, 42, 462, 182, 455, 1620, 1790, 1922,
+ /* 20 */ 358, 121, 1362, 1585, 52, 326, 329, 1836, 492, 453,
+ /* 30 */ 1918, 1954, 457, 1442, 1788, 1360, 1819, 134, 1738, 611,
+ /* 40 */ 158, 1738, 95, 1727, 1904, 1691, 610, 120, 119, 118,
+ /* 50 */ 117, 116, 115, 114, 113, 112, 129, 1437, 513, 1914,
+ /* 60 */ 1920, 346, 17, 1079, 1730, 582, 62, 344, 597, 1368,
+ /* 70 */ 612, 604, 1388, 523, 1970, 156, 122, 99, 357, 1937,
+ /* 80 */ 614, 1939, 1940, 609, 1740, 604, 1096, 225, 1095, 40,
+ /* 90 */ 39, 38, 2023, 439, 2091, 1, 321, 2019, 271, 2031,
+ /* 100 */ 593, 516, 592, 1083, 1084, 2091, 510, 2091, 397, 581,
+ /* 110 */ 174, 224, 34, 274, 2092, 583, 1097, 701, 1608, 403,
+ /* 120 */ 581, 174, 581, 174, 538, 2092, 583, 2092, 583, 37,
+ /* 130 */ 36, 1444, 1445, 43, 41, 40, 39, 38, 58, 234,
+ /* 140 */ 47, 1390, 556, 46, 44, 42, 1512, 597, 64, 190,
+ /* 150 */ 189, 63, 358, 2091, 1362, 179, 58, 58, 317, 1418,
+ /* 160 */ 1427, 1904, 508, 507, 506, 1442, 1165, 1360, 2097, 174,
+ /* 170 */ 128, 502, 1738, 2092, 583, 501, 500, 58, 1363, 82,
+ /* 180 */ 1361, 499, 505, 1247, 1248, 420, 1790, 498, 1387, 1437,
+ /* 190 */ 597, 37, 36, 345, 17, 43, 41, 40, 39, 38,
+ /* 200 */ 1167, 1368, 1788, 1366, 1367, 1586, 1417, 1420, 1421, 1422,
+ /* 210 */ 1423, 1424, 1425, 1426, 606, 602, 1435, 1436, 1438, 1439,
+ /* 220 */ 1440, 1441, 1443, 1446, 3, 78, 111, 1, 541, 110,
+ /* 230 */ 109, 108, 107, 106, 105, 104, 103, 102, 396, 127,
+ /* 240 */ 395, 316, 177, 1385, 538, 1784, 1785, 1387, 1733, 701,
+ /* 250 */ 433, 111, 65, 444, 110, 109, 108, 107, 106, 105,
+ /* 260 */ 104, 103, 102, 1444, 1445, 46, 2096, 1790, 542, 582,
+ /* 270 */ 417, 471, 445, 2091, 362, 419, 44, 42, 343, 1548,
+ /* 280 */ 1607, 1847, 250, 1788, 358, 177, 1362, 177, 2097, 174,
+ /* 290 */ 177, 1418, 1427, 2092, 583, 2091, 1388, 1442, 2091, 1360,
+ /* 300 */ 73, 37, 36, 177, 177, 43, 41, 40, 39, 38,
+ /* 310 */ 1363, 2095, 1361, 581, 174, 2092, 2094, 330, 2092, 583,
+ /* 320 */ 572, 1437, 58, 1904, 177, 1387, 17, 1299, 1300, 407,
+ /* 330 */ 13, 12, 159, 1368, 1597, 1366, 1367, 233, 1417, 1420,
+ /* 340 */ 1421, 1422, 1423, 1424, 1425, 1426, 606, 602, 1435, 1436,
+ /* 350 */ 1438, 1439, 1440, 1441, 1443, 1446, 3, 443, 577, 1,
+ /* 360 */ 438, 437, 436, 435, 432, 431, 430, 429, 428, 424,
+ /* 370 */ 423, 422, 421, 331, 414, 413, 412, 81, 409, 408,
+ /* 380 */ 328, 701, 37, 36, 1371, 371, 43, 41, 40, 39,
+ /* 390 */ 38, 212, 1096, 170, 1095, 1444, 1445, 461, 2096, 392,
+ /* 400 */ 457, 538, 361, 578, 573, 163, 1777, 211, 44, 42,
+ /* 410 */ 156, 488, 484, 480, 476, 209, 358, 26, 1362, 1740,
+ /* 420 */ 394, 390, 1097, 1418, 1427, 1485, 30, 2091, 647, 1442,
+ /* 430 */ 2091, 1360, 37, 36, 226, 1583, 43, 41, 40, 39,
+ /* 440 */ 38, 78, 1363, 2095, 1361, 2097, 174, 2092, 2093, 364,
+ /* 450 */ 2092, 583, 79, 1437, 1954, 207, 1386, 156, 17, 1538,
+ /* 460 */ 504, 503, 576, 1578, 1734, 1368, 1740, 1366, 1367, 177,
+ /* 470 */ 1417, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 606, 602,
+ /* 480 */ 1435, 1436, 1438, 1439, 1440, 1441, 1443, 1446, 3, 522,
+ /* 490 */ 11, 1, 80, 319, 1083, 1084, 546, 2096, 544, 373,
+ /* 500 */ 1606, 594, 520, 575, 518, 2038, 370, 569, 1536, 1537,
+ /* 510 */ 1539, 1540, 1516, 701, 1389, 538, 645, 526, 1387, 239,
+ /* 520 */ 206, 200, 538, 205, 459, 1605, 467, 1444, 1445, 1374,
+ /* 530 */ 1385, 134, 2035, 538, 1716, 147, 146, 642, 641, 640,
+ /* 540 */ 44, 42, 198, 1904, 2091, 556, 1604, 168, 358, 1715,
+ /* 550 */ 1362, 2091, 558, 639, 1995, 1418, 1427, 1577, 401, 2097,
+ /* 560 */ 174, 1442, 2091, 1360, 2092, 583, 2097, 174, 1904, 1837,
+ /* 570 */ 132, 2092, 583, 1452, 1363, 1738, 1361, 2097, 174, 1387,
+ /* 580 */ 1339, 1340, 2092, 583, 1713, 1437, 1389, 1729, 1603, 1904,
+ /* 590 */ 1571, 596, 172, 2031, 2032, 471, 2036, 1368, 1918, 1366,
+ /* 600 */ 1367, 1602, 1417, 1420, 1421, 1422, 1423, 1424, 1425, 1426,
+ /* 610 */ 606, 602, 1435, 1436, 1438, 1439, 1440, 1441, 1443, 1446,
+ /* 620 */ 3, 186, 1601, 8, 11, 1850, 9, 1914, 1920, 37,
+ /* 630 */ 36, 1904, 11, 43, 41, 40, 39, 38, 1473, 604,
+ /* 640 */ 32, 1600, 88, 1891, 1904, 701, 37, 36, 672, 670,
+ /* 650 */ 43, 41, 40, 39, 38, 273, 645, 1419, 75, 1444,
+ /* 660 */ 1445, 74, 37, 36, 1731, 1904, 43, 41, 40, 39,
+ /* 670 */ 38, 2038, 44, 42, 1447, 147, 146, 642, 641, 640,
+ /* 680 */ 358, 1923, 1362, 322, 1904, 1936, 556, 1418, 1427, 1790,
+ /* 690 */ 380, 645, 1918, 1442, 556, 1360, 37, 36, 2034, 402,
+ /* 700 */ 43, 41, 40, 39, 38, 1789, 1363, 411, 1361, 31,
+ /* 710 */ 147, 146, 642, 641, 640, 1954, 1738, 1437, 1419, 1478,
+ /* 720 */ 1368, 1914, 1920, 598, 1738, 1471, 659, 273, 1904, 1368,
+ /* 730 */ 610, 1366, 1367, 604, 1417, 1420, 1421, 1422, 1423, 1424,
+ /* 740 */ 1425, 1426, 606, 602, 1435, 1436, 1438, 1439, 1440, 1441,
+ /* 750 */ 1443, 1446, 3, 1509, 1934, 8, 1599, 145, 1970, 1596,
+ /* 760 */ 1832, 98, 1935, 1937, 614, 1939, 1940, 609, 1714, 604,
+ /* 770 */ 177, 184, 227, 334, 171, 1768, 2023, 701, 1595, 1472,
+ /* 780 */ 351, 2019, 37, 36, 1528, 1594, 43, 41, 40, 39,
+ /* 790 */ 38, 1444, 1445, 176, 43, 41, 40, 39, 38, 1904,
+ /* 800 */ 556, 2049, 1904, 556, 44, 42, 1832, 560, 2038, 1995,
+ /* 810 */ 51, 556, 358, 425, 1362, 155, 121, 188, 556, 1418,
+ /* 820 */ 1427, 1904, 1390, 497, 426, 1442, 2095, 1360, 1904, 647,
+ /* 830 */ 1738, 469, 556, 1738, 335, 2033, 333, 332, 1363, 494,
+ /* 840 */ 1361, 1738, 1390, 496, 1846, 470, 312, 1387, 1738, 1437,
+ /* 850 */ 33, 355, 1466, 1467, 1468, 1469, 1470, 1474, 1475, 1476,
+ /* 860 */ 1477, 1368, 1738, 1366, 1367, 495, 1417, 1420, 1421, 1422,
+ /* 870 */ 1423, 1424, 1425, 1426, 606, 602, 1435, 1436, 1438, 1439,
+ /* 880 */ 1440, 1441, 1443, 1446, 3, 240, 241, 8, 1205, 636,
+ /* 890 */ 635, 634, 1209, 633, 1211, 1212, 632, 1214, 629, 1593,
+ /* 900 */ 1220, 626, 1222, 1223, 623, 620, 542, 156, 556, 701,
+ /* 910 */ 1592, 2043, 1505, 556, 1922, 1845, 1741, 312, 404, 1848,
+ /* 920 */ 7, 1735, 1591, 1444, 1445, 1918, 139, 660, 556, 1708,
+ /* 930 */ 1590, 405, 1589, 1588, 556, 45, 44, 42, 1738, 48,
+ /* 940 */ 4, 534, 1904, 1738, 358, 319, 1362, 539, 546, 556,
+ /* 950 */ 544, 1418, 1427, 1904, 1914, 1920, 352, 1442, 1738, 1360,
+ /* 960 */ 1652, 556, 244, 183, 1738, 1904, 604, 496, 643, 238,
+ /* 970 */ 1363, 1781, 1361, 1904, 552, 1904, 1904, 130, 533, 1738,
+ /* 980 */ 1994, 1437, 644, 249, 286, 1781, 1419, 1768, 1310, 495,
+ /* 990 */ 586, 1738, 1508, 1368, 1723, 1366, 1367, 1936, 1417, 1420,
+ /* 1000 */ 1421, 1422, 1423, 1424, 1425, 1426, 606, 602, 1435, 1436,
+ /* 1010 */ 1438, 1439, 1440, 1441, 1443, 1446, 3, 556, 140, 1,
+ /* 1020 */ 137, 123, 242, 556, 508, 507, 506, 1954, 594, 589,
+ /* 1030 */ 554, 217, 128, 502, 215, 598, 555, 501, 500, 556,
+ /* 1040 */ 1904, 701, 610, 499, 505, 219, 1639, 1738, 218, 498,
+ /* 1050 */ 144, 221, 275, 1738, 220, 1444, 1445, 223, 134, 556,
+ /* 1060 */ 222, 145, 50, 60, 254, 60, 1934, 537, 509, 1738,
+ /* 1070 */ 1970, 549, 365, 98, 1935, 1937, 614, 1939, 1940, 609,
+ /* 1080 */ 1370, 604, 585, 1418, 1427, 1649, 171, 1632, 2023, 1738,
+ /* 1090 */ 1630, 601, 351, 2019, 1580, 1581, 2096, 132, 94, 13,
+ /* 1100 */ 12, 45, 1363, 246, 1361, 1725, 1721, 230, 91, 511,
+ /* 1110 */ 605, 638, 514, 2050, 1198, 2063, 1535, 257, 1479, 173,
+ /* 1120 */ 2031, 2032, 1505, 2036, 1692, 268, 1598, 1366, 1367, 1925,
+ /* 1130 */ 1417, 1420, 1421, 1422, 1423, 1424, 1425, 1426, 606, 602,
+ /* 1140 */ 1435, 1436, 1438, 1439, 1440, 1441, 1443, 1446, 3, 678,
+ /* 1150 */ 677, 676, 675, 368, 1428, 674, 673, 135, 668, 667,
+ /* 1160 */ 666, 665, 664, 663, 662, 661, 149, 657, 656, 655,
+ /* 1170 */ 367, 366, 652, 651, 650, 649, 648, 157, 1927, 570,
+ /* 1180 */ 45, 618, 292, 144, 1936, 145, 124, 144, 1362, 1571,
+ /* 1190 */ 653, 654, 1125, 1626, 210, 262, 290, 67, 594, 1955,
+ /* 1200 */ 66, 1360, 369, 1841, 1621, 1778, 2053, 595, 587, 270,
+ /* 1210 */ 267, 5, 1145, 1143, 1954, 2, 379, 194, 450, 448,
+ /* 1220 */ 1326, 327, 611, 374, 282, 1373, 1126, 1904, 134, 610,
+ /* 1230 */ 187, 406, 1463, 285, 1226, 1368, 1230, 1390, 1237, 1235,
+ /* 1240 */ 148, 696, 1842, 415, 410, 1385, 441, 427, 1834, 590,
+ /* 1250 */ 434, 447, 440, 1934, 58, 442, 446, 1970, 191, 449,
+ /* 1260 */ 98, 1935, 1937, 614, 1939, 1940, 609, 132, 604, 451,
+ /* 1270 */ 1391, 131, 452, 143, 1994, 2023, 1393, 460, 463, 351,
+ /* 1280 */ 2019, 1392, 464, 701, 197, 199, 465, 1394, 468, 175,
+ /* 1290 */ 2031, 2032, 97, 2036, 466, 1936, 202, 204, 472, 76,
+ /* 1300 */ 77, 208, 1099, 489, 490, 491, 493, 1728, 214, 1724,
+ /* 1310 */ 1881, 216, 100, 318, 525, 527, 283, 228, 528, 529,
+ /* 1320 */ 340, 150, 151, 231, 535, 1954, 1726, 540, 1722, 72,
+ /* 1330 */ 71, 400, 152, 611, 181, 153, 550, 235, 1904, 85,
+ /* 1340 */ 610, 568, 543, 284, 1363, 87, 1361, 571, 2045, 580,
+ /* 1350 */ 1936, 6, 315, 1880, 532, 388, 1852, 386, 382, 378,
+ /* 1360 */ 375, 372, 565, 141, 1934, 547, 342, 2054, 1970, 1366,
+ /* 1370 */ 1367, 98, 1935, 1937, 614, 1939, 1940, 609, 551, 604,
+ /* 1380 */ 1954, 564, 566, 142, 2111, 1739, 2023, 252, 611, 2064,
+ /* 1390 */ 351, 2019, 567, 1904, 562, 610, 347, 256, 574, 348,
+ /* 1400 */ 2057, 177, 563, 591, 2114, 1505, 1936, 588, 266, 133,
+ /* 1410 */ 1389, 57, 2004, 2069, 89, 616, 1782, 1709, 697, 1934,
+ /* 1420 */ 700, 287, 278, 1970, 698, 264, 98, 1935, 1937, 614,
+ /* 1430 */ 1939, 1940, 609, 2068, 604, 2039, 1954, 311, 49, 2111,
+ /* 1440 */ 299, 2023, 164, 263, 611, 351, 2019, 261, 310, 1904,
+ /* 1450 */ 289, 610, 309, 291, 265, 2085, 1898, 1897, 69, 1896,
+ /* 1460 */ 2090, 1936, 1895, 70, 1892, 376, 377, 1354, 1355, 180,
+ /* 1470 */ 269, 381, 1890, 383, 384, 1934, 385, 1889, 387, 1970,
+ /* 1480 */ 1936, 1888, 98, 1935, 1937, 614, 1939, 1940, 609, 389,
+ /* 1490 */ 604, 1954, 1887, 391, 1886, 2111, 393, 2023, 1329, 611,
+ /* 1500 */ 1328, 351, 2019, 1863, 1904, 1862, 610, 398, 399, 1861,
+ /* 1510 */ 1954, 2042, 1860, 1290, 1827, 1826, 1824, 136, 611, 1823,
+ /* 1520 */ 1822, 1825, 1821, 1904, 1820, 610, 1818, 1817, 1816, 185,
+ /* 1530 */ 612, 416, 1815, 418, 1970, 1814, 1813, 301, 357, 1937,
+ /* 1540 */ 614, 1939, 1940, 609, 1812, 604, 1811, 1810, 1809, 1934,
+ /* 1550 */ 1808, 1807, 1806, 1970, 1805, 1804, 98, 1935, 1937, 614,
+ /* 1560 */ 1939, 1940, 609, 1803, 604, 1802, 1801, 2091, 1173, 1998,
+ /* 1570 */ 1800, 2023, 138, 1799, 1798, 351, 2019, 1936, 1797, 1796,
+ /* 1580 */ 354, 353, 581, 174, 1795, 1794, 1292, 2092, 583, 1086,
+ /* 1590 */ 1376, 1793, 1792, 1791, 1654, 192, 1653, 193, 1936, 1651,
+ /* 1600 */ 1617, 1442, 169, 1369, 195, 1616, 125, 1954, 126, 1085,
+ /* 1610 */ 1876, 1870, 1859, 203, 1858, 611, 196, 456, 458, 201,
+ /* 1620 */ 1904, 1844, 610, 1717, 1118, 1437, 1650, 1648, 1954, 474,
+ /* 1630 */ 1646, 1644, 473, 477, 478, 482, 611, 1368, 1642, 481,
+ /* 1640 */ 475, 1904, 479, 610, 485, 483, 1934, 487, 1629, 486,
+ /* 1650 */ 1970, 1628, 1613, 98, 1935, 1937, 614, 1939, 1940, 609,
+ /* 1660 */ 1719, 604, 59, 1241, 1240, 1718, 1996, 1934, 2023, 1164,
+ /* 1670 */ 1163, 1970, 351, 2019, 98, 1935, 1937, 614, 1939, 1940,
+ /* 1680 */ 609, 1162, 604, 1936, 1161, 600, 669, 559, 213, 2023,
+ /* 1690 */ 1160, 1155, 1157, 351, 2019, 1640, 671, 1156, 1154, 336,
+ /* 1700 */ 1633, 337, 1631, 512, 338, 515, 1612, 1611, 517, 519,
+ /* 1710 */ 1610, 521, 101, 1954, 1346, 25, 1875, 53, 1335, 1869,
+ /* 1720 */ 154, 611, 1857, 530, 1855, 1856, 1904, 18, 610, 237,
+ /* 1730 */ 1851, 1344, 2096, 1854, 1853, 545, 243, 1843, 531, 1343,
+ /* 1740 */ 83, 86, 84, 248, 232, 91, 1377, 15, 1372, 646,
+ /* 1750 */ 536, 339, 1934, 27, 19, 20, 1970, 1550, 56, 99,
+ /* 1760 */ 1935, 1937, 614, 1939, 1940, 609, 1454, 604, 1936, 245,
+ /* 1770 */ 10, 1380, 1382, 251, 2023, 259, 253, 548, 2022, 2019,
+ /* 1780 */ 1532, 255, 1453, 602, 1435, 1436, 1438, 1439, 1440, 1441,
+ /* 1790 */ 1534, 260, 1925, 162, 258, 29, 61, 22, 1954, 21,
+ /* 1800 */ 28, 1565, 1564, 349, 1527, 1570, 611, 1569, 90, 1568,
+ /* 1810 */ 1571, 1904, 350, 610, 1502, 272, 1501, 1924, 55, 165,
+ /* 1820 */ 12, 1378, 1464, 1973, 1936, 166, 178, 1432, 1410, 613,
+ /* 1830 */ 603, 617, 1430, 35, 1171, 1429, 14, 1934, 23, 360,
+ /* 1840 */ 1402, 1970, 621, 24, 99, 1935, 1937, 614, 1939, 1940,
+ /* 1850 */ 609, 1227, 604, 1936, 1954, 615, 54, 619, 622, 2023,
+ /* 1860 */ 1224, 16, 608, 599, 2019, 624, 1221, 1904, 627, 610,
+ /* 1870 */ 1219, 625, 630, 1204, 1215, 1218, 628, 1217, 1213, 631,
+ /* 1880 */ 1216, 92, 1936, 1954, 93, 1236, 68, 276, 1232, 1116,
+ /* 1890 */ 637, 611, 1151, 1934, 1150, 1149, 1904, 1970, 610, 1148,
+ /* 1900 */ 307, 1935, 1937, 614, 1939, 1940, 609, 607, 604, 557,
+ /* 1910 */ 1988, 1936, 1954, 1147, 1146, 1144, 1142, 1141, 1140, 658,
+ /* 1920 */ 611, 1138, 1934, 1137, 1136, 1904, 1970, 610, 277, 160,
+ /* 1930 */ 1935, 1937, 614, 1939, 1940, 609, 1135, 604, 1134, 1133,
+ /* 1940 */ 1132, 1954, 1131, 1168, 1166, 1128, 1127, 1124, 1123, 611,
+ /* 1950 */ 1122, 1934, 1121, 1647, 1904, 1970, 610, 679, 161, 1935,
+ /* 1960 */ 1937, 614, 1939, 1940, 609, 680, 604, 1645, 681, 683,
+ /* 1970 */ 561, 2060, 684, 1643, 685, 687, 689, 688, 1936, 1641,
+ /* 1980 */ 1934, 691, 693, 692, 1970, 1627, 695, 99, 1935, 1937,
+ /* 1990 */ 614, 1939, 1940, 609, 1936, 604, 1076, 1609, 280, 699,
+ /* 2000 */ 1584, 702, 2023, 1364, 288, 1584, 703, 2020, 1954, 1584,
+ /* 2010 */ 584, 2112, 1584, 341, 1584, 1584, 611, 1584, 1584, 1584,
+ /* 2020 */ 1584, 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584,
+ /* 2030 */ 1584, 1584, 608, 1584, 1584, 1584, 1584, 1904, 1584, 610,
+ /* 2040 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1936,
+ /* 2050 */ 1584, 1970, 1584, 1584, 308, 1935, 1937, 614, 1939, 1940,
+ /* 2060 */ 609, 1584, 604, 1934, 1584, 1584, 1584, 1970, 1584, 1936,
+ /* 2070 */ 307, 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1954,
+ /* 2080 */ 1989, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
+ /* 2090 */ 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584, 1954,
+ /* 2100 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
+ /* 2110 */ 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1934, 1584,
+ /* 2120 */ 1584, 1584, 1970, 1584, 1584, 160, 1935, 1937, 614, 1939,
+ /* 2130 */ 1940, 609, 1584, 604, 1936, 1584, 1584, 1584, 1934, 1584,
+ /* 2140 */ 1584, 1584, 1970, 1584, 1584, 303, 1935, 1937, 614, 1939,
+ /* 2150 */ 1940, 609, 1584, 604, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2160 */ 1584, 1584, 1584, 1584, 1954, 1584, 1584, 2061, 1584, 1584,
+ /* 2170 */ 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610,
+ /* 2180 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 579,
+ /* 2190 */ 1584, 1584, 1936, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2200 */ 1584, 1584, 1584, 1934, 1584, 1584, 1936, 1970, 1584, 1584,
+ /* 2210 */ 161, 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584,
+ /* 2220 */ 1584, 1584, 1954, 1584, 1584, 1584, 1584, 356, 1584, 1584,
+ /* 2230 */ 611, 1584, 1584, 1584, 1584, 1904, 1954, 610, 1584, 1584,
+ /* 2240 */ 1584, 359, 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904,
+ /* 2250 */ 1584, 610, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2260 */ 1584, 1934, 1584, 2113, 1936, 1970, 1584, 1584, 308, 1935,
+ /* 2270 */ 1937, 614, 1939, 1940, 609, 1934, 604, 1584, 1936, 1970,
+ /* 2280 */ 1584, 1584, 308, 1935, 1937, 614, 1939, 1940, 609, 1584,
+ /* 2290 */ 604, 1584, 1584, 1584, 1954, 1584, 1584, 1584, 1584, 1584,
+ /* 2300 */ 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1954, 610,
+ /* 2310 */ 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584,
+ /* 2320 */ 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2330 */ 1584, 1936, 1584, 524, 1584, 1584, 1584, 1970, 1584, 1584,
+ /* 2340 */ 301, 1935, 1937, 614, 1939, 1940, 609, 1934, 604, 1584,
+ /* 2350 */ 1584, 1970, 1584, 1584, 293, 1935, 1937, 614, 1939, 1940,
+ /* 2360 */ 609, 1954, 604, 1584, 1584, 1584, 1584, 1584, 1584, 611,
+ /* 2370 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584,
+ /* 2380 */ 1584, 1584, 1584, 1584, 1584, 1584, 1936, 1584, 1584, 1584,
+ /* 2390 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2400 */ 1934, 1584, 1936, 1584, 1970, 1584, 1584, 294, 1935, 1937,
+ /* 2410 */ 614, 1939, 1940, 609, 1584, 604, 1954, 1584, 1584, 1584,
+ /* 2420 */ 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904,
+ /* 2430 */ 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2440 */ 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584,
+ /* 2450 */ 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1936, 1584, 1970,
+ /* 2460 */ 1584, 1584, 295, 1935, 1937, 614, 1939, 1940, 609, 1584,
+ /* 2470 */ 604, 1934, 1584, 1936, 1584, 1970, 1584, 1584, 302, 1935,
+ /* 2480 */ 1937, 614, 1939, 1940, 609, 1584, 604, 1954, 1584, 1584,
+ /* 2490 */ 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584,
+ /* 2500 */ 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2510 */ 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584,
+ /* 2520 */ 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1584, 1936,
+ /* 2530 */ 1970, 1584, 1584, 304, 1935, 1937, 614, 1939, 1940, 609,
+ /* 2540 */ 1584, 604, 1934, 1584, 1584, 1936, 1970, 1584, 1584, 296,
+ /* 2550 */ 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584, 1954,
+ /* 2560 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
+ /* 2570 */ 1584, 1584, 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584,
+ /* 2580 */ 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584,
+ /* 2590 */ 610, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584,
+ /* 2600 */ 1584, 1936, 1970, 1584, 1584, 305, 1935, 1937, 614, 1939,
+ /* 2610 */ 1940, 609, 1584, 604, 1934, 1584, 1584, 1936, 1970, 1584,
+ /* 2620 */ 1584, 297, 1935, 1937, 614, 1939, 1940, 609, 1584, 604,
+ /* 2630 */ 1584, 1954, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611,
+ /* 2640 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1954, 1584, 1584,
+ /* 2650 */ 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584,
+ /* 2660 */ 1904, 1584, 610, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2670 */ 1934, 1584, 1584, 1584, 1970, 1584, 1584, 306, 1935, 1937,
+ /* 2680 */ 614, 1939, 1940, 609, 1936, 604, 1934, 1584, 1584, 1584,
+ /* 2690 */ 1970, 1584, 1584, 298, 1935, 1937, 614, 1939, 1940, 609,
+ /* 2700 */ 1584, 604, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1936,
+ /* 2710 */ 1584, 1584, 1584, 1584, 1954, 1584, 1584, 1584, 1584, 1584,
+ /* 2720 */ 1584, 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610,
+ /* 2730 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1954,
+ /* 2740 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584,
+ /* 2750 */ 1584, 1584, 1904, 1934, 610, 1584, 1584, 1970, 1584, 1584,
+ /* 2760 */ 313, 1935, 1937, 614, 1939, 1940, 609, 704, 604, 1584,
+ /* 2770 */ 1936, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584,
+ /* 2780 */ 1584, 281, 1970, 1584, 1584, 314, 1935, 1937, 614, 1939,
+ /* 2790 */ 1940, 609, 1584, 604, 1584, 167, 1584, 1584, 1584, 1584,
+ /* 2800 */ 1954, 694, 690, 686, 682, 279, 1584, 1584, 611, 1584,
+ /* 2810 */ 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584,
+ /* 2820 */ 1584, 1584, 1584, 1936, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 2830 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934,
+ /* 2840 */ 1584, 1936, 96, 1970, 1584, 247, 1948, 1935, 1937, 614,
+ /* 2850 */ 1939, 1940, 609, 1954, 604, 1584, 1584, 1584, 1584, 1584,
+ /* 2860 */ 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584,
+ /* 2870 */ 1584, 1954, 1584, 1584, 1584, 1584, 1584, 1584, 553, 611,
+ /* 2880 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584,
+ /* 2890 */ 1584, 1584, 1934, 1584, 1584, 1584, 1970, 1936, 1584, 1947,
+ /* 2900 */ 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584, 1584,
+ /* 2910 */ 1934, 1936, 1584, 236, 1970, 1584, 1584, 1946, 1935, 1937,
+ /* 2920 */ 614, 1939, 1940, 609, 1584, 604, 1584, 1954, 1584, 1584,
+ /* 2930 */ 1333, 1584, 229, 1584, 1584, 611, 1584, 1584, 1584, 1584,
+ /* 2940 */ 1904, 1954, 610, 1584, 1584, 1584, 1584, 1584, 1584, 611,
+ /* 2950 */ 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584,
+ /* 2960 */ 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1936, 1584, 1584,
+ /* 2970 */ 1970, 1584, 1584, 323, 1935, 1937, 614, 1939, 1940, 609,
+ /* 2980 */ 1934, 604, 1584, 1936, 1970, 1584, 1584, 324, 1935, 1937,
+ /* 2990 */ 614, 1939, 1940, 609, 1584, 604, 1584, 1954, 1584, 1584,
+ /* 3000 */ 1584, 1584, 1584, 1584, 1584, 611, 1584, 1584, 1584, 1584,
+ /* 3010 */ 1904, 1584, 610, 1954, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 3020 */ 1584, 611, 1584, 1584, 1584, 1584, 1904, 1584, 610, 1584,
+ /* 3030 */ 1584, 1584, 1584, 1584, 1584, 1584, 1934, 1584, 1584, 1584,
+ /* 3040 */ 1970, 1584, 1584, 320, 1935, 1937, 614, 1939, 1940, 609,
+ /* 3050 */ 1936, 604, 1934, 1584, 1584, 1584, 1970, 1584, 1584, 325,
+ /* 3060 */ 1935, 1937, 614, 1939, 1940, 609, 1584, 604, 1584, 1584,
+ /* 3070 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 3080 */ 1954, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 611, 1584,
+ /* 3090 */ 1584, 1584, 1584, 1904, 1584, 610, 1584, 1584, 1584, 1584,
+ /* 3100 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584,
+ /* 3110 */ 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1584, 1934,
+ /* 3120 */ 1584, 1584, 1584, 1970, 1584, 1584, 300, 1935, 1937, 614,
+ /* 3130 */ 1939, 1940, 609, 1584, 604,
};
static const YYCODETYPE yy_lookahead[] = {
- /* 0 */ 326, 351, 328, 329, 335, 326, 354, 328, 329, 367,
- /* 10 */ 0, 330, 12, 13, 364, 344, 374, 365, 4, 377,
- /* 20 */ 20, 0, 22, 352, 343, 330, 354, 358, 20, 354,
- /* 30 */ 322, 350, 361, 33, 336, 35, 20, 365, 343, 341,
- /* 40 */ 365, 360, 21, 391, 392, 24, 25, 26, 27, 28,
- /* 50 */ 29, 30, 31, 32, 330, 360, 404, 57, 44, 45,
- /* 60 */ 352, 20, 62, 391, 392, 393, 391, 392, 360, 69,
- /* 70 */ 12, 13, 14, 365, 327, 367, 404, 330, 20, 404,
- /* 80 */ 22, 61, 8, 9, 360, 352, 12, 13, 14, 15,
- /* 90 */ 16, 33, 322, 35, 20, 95, 388, 321, 330, 323,
- /* 100 */ 392, 368, 354, 95, 396, 397, 398, 399, 400, 401,
- /* 110 */ 402, 343, 404, 365, 95, 57, 330, 117, 322, 411,
- /* 120 */ 62, 397, 352, 415, 416, 330, 0, 69, 360, 343,
- /* 130 */ 360, 131, 132, 106, 426, 365, 350, 367, 95, 391,
- /* 140 */ 392, 393, 418, 419, 420, 421, 360, 423, 352, 441,
- /* 150 */ 442, 14, 404, 95, 446, 447, 360, 20, 388, 335,
- /* 160 */ 322, 365, 392, 367, 369, 37, 396, 397, 398, 399,
- /* 170 */ 400, 401, 402, 349, 404, 117, 176, 407, 178, 409,
- /* 180 */ 410, 411, 358, 352, 388, 415, 416, 61, 392, 131,
- /* 190 */ 132, 360, 396, 397, 398, 399, 400, 401, 402, 79,
- /* 200 */ 404, 201, 202, 365, 204, 205, 206, 207, 208, 209,
+ /* 0 */ 326, 322, 328, 329, 360, 352, 363, 330, 330, 366,
+ /* 10 */ 367, 330, 12, 13, 326, 371, 328, 329, 352, 354,
+ /* 20 */ 20, 343, 22, 0, 343, 359, 373, 374, 350, 327,
+ /* 30 */ 365, 352, 330, 33, 368, 35, 0, 360, 360, 360,
+ /* 40 */ 336, 360, 333, 353, 365, 341, 367, 24, 25, 26,
+ /* 50 */ 27, 28, 29, 30, 31, 32, 347, 57, 4, 394,
+ /* 60 */ 395, 396, 62, 4, 355, 399, 4, 344, 20, 69,
+ /* 70 */ 391, 406, 20, 19, 395, 352, 399, 398, 399, 400,
+ /* 80 */ 401, 402, 403, 404, 361, 406, 20, 33, 22, 14,
+ /* 90 */ 15, 16, 413, 79, 428, 95, 417, 418, 421, 422,
+ /* 100 */ 423, 47, 425, 44, 45, 428, 52, 428, 383, 443,
+ /* 110 */ 444, 57, 414, 415, 448, 449, 50, 117, 322, 330,
+ /* 120 */ 443, 444, 443, 444, 399, 448, 449, 448, 449, 8,
+ /* 130 */ 9, 131, 132, 12, 13, 14, 15, 16, 95, 57,
+ /* 140 */ 95, 20, 330, 95, 12, 13, 14, 20, 94, 135,
+ /* 150 */ 136, 97, 20, 428, 22, 343, 95, 95, 369, 159,
+ /* 160 */ 160, 365, 64, 65, 66, 33, 35, 35, 443, 444,
+ /* 170 */ 72, 73, 360, 448, 449, 77, 78, 95, 178, 97,
+ /* 180 */ 180, 83, 84, 131, 132, 149, 352, 89, 20, 57,
+ /* 190 */ 20, 8, 9, 359, 62, 12, 13, 14, 15, 16,
+ /* 200 */ 69, 69, 368, 203, 204, 0, 206, 207, 208, 209,
/* 210 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- /* 220 */ 220, 221, 222, 223, 224, 319, 98, 20, 100, 101,
- /* 230 */ 399, 103, 127, 20, 176, 107, 178, 163, 327, 126,
- /* 240 */ 127, 330, 242, 21, 448, 449, 24, 25, 26, 27,
- /* 250 */ 28, 29, 30, 31, 32, 135, 136, 129, 57, 201,
- /* 260 */ 202, 242, 204, 205, 206, 207, 208, 209, 210, 211,
- /* 270 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
- /* 280 */ 222, 223, 224, 12, 13, 242, 380, 20, 183, 184,
- /* 290 */ 61, 20, 187, 22, 189, 94, 0, 184, 97, 20,
- /* 300 */ 187, 322, 189, 397, 33, 397, 35, 108, 109, 110,
- /* 310 */ 111, 112, 113, 114, 115, 116, 117, 118, 57, 120,
- /* 320 */ 121, 122, 123, 124, 125, 226, 363, 228, 57, 366,
- /* 330 */ 367, 352, 426, 62, 426, 394, 4, 14, 333, 360,
- /* 340 */ 69, 12, 13, 20, 365, 0, 367, 441, 442, 20,
- /* 350 */ 442, 22, 446, 447, 446, 447, 95, 61, 97, 19,
- /* 360 */ 355, 95, 33, 422, 35, 201, 95, 388, 171, 39,
- /* 370 */ 20, 392, 22, 33, 95, 396, 397, 398, 399, 400,
- /* 380 */ 401, 402, 0, 404, 20, 35, 57, 47, 117, 192,
- /* 390 */ 193, 62, 47, 53, 54, 55, 56, 57, 69, 4,
- /* 400 */ 50, 35, 131, 132, 226, 426, 24, 25, 26, 27,
- /* 410 */ 28, 29, 30, 31, 32, 251, 252, 253, 254, 255,
- /* 420 */ 441, 442, 352, 69, 95, 446, 447, 95, 322, 359,
- /* 430 */ 163, 64, 65, 66, 94, 69, 14, 97, 368, 72,
- /* 440 */ 73, 175, 20, 177, 77, 78, 117, 176, 69, 178,
- /* 450 */ 83, 84, 380, 0, 20, 20, 89, 360, 8, 9,
- /* 460 */ 131, 132, 12, 13, 14, 15, 16, 397, 371, 397,
- /* 470 */ 130, 365, 201, 202, 353, 204, 205, 206, 207, 208,
- /* 480 */ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
- /* 490 */ 219, 220, 221, 222, 223, 224, 426, 226, 426, 352,
- /* 500 */ 412, 413, 162, 242, 353, 176, 359, 178, 242, 353,
- /* 510 */ 333, 441, 442, 441, 442, 368, 446, 447, 446, 447,
- /* 520 */ 180, 242, 182, 57, 347, 366, 367, 322, 205, 95,
- /* 530 */ 201, 202, 355, 204, 205, 206, 207, 208, 209, 210,
- /* 540 */ 211, 212, 213, 214, 215, 216, 217, 218, 219, 220,
- /* 550 */ 221, 222, 223, 224, 12, 13, 3, 352, 338, 339,
- /* 560 */ 107, 344, 20, 97, 22, 360, 131, 132, 161, 352,
- /* 570 */ 365, 241, 367, 20, 242, 33, 360, 35, 361, 126,
- /* 580 */ 127, 128, 129, 130, 8, 9, 322, 371, 12, 13,
- /* 590 */ 14, 15, 16, 388, 408, 330, 410, 392, 20, 57,
- /* 600 */ 22, 396, 397, 398, 399, 400, 401, 402, 343, 404,
- /* 610 */ 352, 69, 12, 13, 14, 158, 352, 359, 168, 21,
- /* 620 */ 20, 357, 22, 330, 360, 360, 368, 205, 50, 365,
- /* 630 */ 353, 367, 34, 33, 36, 35, 343, 95, 243, 126,
- /* 640 */ 8, 9, 437, 438, 12, 13, 14, 15, 16, 96,
- /* 650 */ 344, 353, 388, 360, 247, 248, 392, 57, 352, 117,
- /* 660 */ 396, 397, 398, 399, 400, 401, 402, 361, 404, 69,
- /* 670 */ 12, 13, 96, 131, 132, 22, 242, 8, 9, 330,
- /* 680 */ 22, 12, 13, 14, 15, 16, 229, 345, 35, 330,
- /* 690 */ 348, 33, 343, 35, 2, 95, 239, 394, 185, 186,
- /* 700 */ 8, 9, 343, 367, 12, 13, 14, 15, 16, 360,
- /* 710 */ 394, 330, 43, 377, 264, 57, 163, 117, 176, 360,
- /* 720 */ 178, 3, 69, 2, 343, 422, 22, 69, 96, 8,
- /* 730 */ 9, 131, 132, 12, 13, 14, 15, 16, 422, 35,
- /* 740 */ 397, 360, 407, 201, 202, 410, 204, 205, 206, 207,
- /* 750 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
- /* 760 */ 218, 219, 220, 221, 222, 223, 224, 1, 2, 426,
- /* 770 */ 117, 14, 15, 16, 353, 117, 176, 107, 178, 12,
- /* 780 */ 13, 14, 15, 16, 242, 442, 353, 8, 9, 446,
- /* 790 */ 447, 12, 13, 14, 15, 16, 126, 127, 128, 129,
- /* 800 */ 130, 201, 202, 43, 204, 205, 206, 207, 208, 209,
- /* 810 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- /* 820 */ 220, 221, 222, 223, 224, 12, 13, 107, 330, 176,
- /* 830 */ 376, 178, 378, 20, 176, 22, 178, 43, 408, 330,
- /* 840 */ 410, 343, 338, 339, 384, 322, 33, 322, 35, 129,
- /* 850 */ 330, 380, 343, 360, 201, 202, 96, 322, 360, 201,
- /* 860 */ 202, 20, 96, 343, 371, 44, 45, 322, 397, 360,
- /* 870 */ 57, 322, 341, 215, 216, 217, 218, 219, 220, 221,
- /* 880 */ 360, 330, 69, 12, 13, 330, 330, 352, 365, 323,
- /* 890 */ 365, 20, 380, 22, 343, 360, 0, 426, 343, 343,
- /* 900 */ 365, 340, 367, 342, 33, 322, 35, 106, 95, 397,
- /* 910 */ 365, 360, 441, 442, 365, 360, 360, 446, 447, 0,
- /* 920 */ 376, 322, 378, 388, 322, 240, 241, 392, 57, 322,
- /* 930 */ 117, 396, 397, 398, 399, 400, 401, 402, 426, 404,
- /* 940 */ 69, 22, 163, 322, 131, 132, 411, 322, 365, 0,
- /* 950 */ 415, 416, 330, 441, 442, 154, 322, 330, 446, 447,
- /* 960 */ 64, 65, 66, 43, 365, 343, 95, 365, 72, 73,
- /* 970 */ 343, 22, 365, 77, 78, 362, 395, 259, 365, 83,
- /* 980 */ 84, 331, 360, 20, 33, 89, 365, 360, 117, 176,
- /* 990 */ 365, 178, 380, 0, 380, 43, 322, 450, 47, 365,
- /* 1000 */ 322, 322, 131, 132, 53, 54, 55, 56, 57, 397,
- /* 1010 */ 362, 397, 43, 365, 201, 202, 96, 204, 205, 206,
- /* 1020 */ 207, 208, 209, 210, 211, 212, 213, 214, 215, 216,
- /* 1030 */ 217, 218, 219, 220, 221, 222, 223, 224, 426, 365,
- /* 1040 */ 426, 352, 439, 365, 365, 94, 205, 176, 97, 178,
- /* 1050 */ 361, 42, 43, 441, 442, 441, 442, 263, 446, 447,
- /* 1060 */ 446, 447, 8, 9, 322, 96, 12, 13, 14, 15,
- /* 1070 */ 16, 322, 201, 202, 0, 204, 205, 206, 207, 208,
- /* 1080 */ 209, 210, 211, 212, 213, 214, 215, 216, 217, 218,
- /* 1090 */ 219, 220, 221, 222, 223, 224, 18, 0, 20, 345,
- /* 1100 */ 107, 330, 348, 163, 164, 27, 330, 365, 30, 99,
- /* 1110 */ 159, 160, 102, 162, 365, 99, 43, 166, 102, 126,
- /* 1120 */ 127, 128, 129, 130, 322, 47, 163, 49, 43, 99,
- /* 1130 */ 52, 360, 102, 182, 99, 43, 360, 102, 64, 65,
- /* 1140 */ 66, 67, 68, 433, 70, 71, 72, 73, 74, 75,
- /* 1150 */ 76, 77, 78, 79, 80, 81, 82, 83, 84, 85,
- /* 1160 */ 86, 87, 88, 89, 90, 91, 18, 365, 397, 96,
- /* 1170 */ 330, 23, 94, 397, 62, 131, 132, 1, 2, 43,
- /* 1180 */ 35, 96, 3, 343, 106, 37, 38, 0, 96, 41,
- /* 1190 */ 419, 420, 421, 0, 423, 419, 420, 421, 43, 423,
- /* 1200 */ 360, 43, 352, 43, 331, 43, 58, 59, 60, 22,
- /* 1210 */ 43, 43, 134, 261, 322, 137, 138, 139, 140, 141,
- /* 1220 */ 142, 143, 144, 145, 146, 147, 148, 149, 150, 151,
- /* 1230 */ 152, 153, 96, 155, 156, 157, 35, 329, 46, 364,
- /* 1240 */ 330, 48, 330, 95, 352, 43, 149, 330, 395, 43,
- /* 1250 */ 424, 96, 360, 343, 96, 343, 96, 365, 96, 367,
- /* 1260 */ 343, 8, 9, 96, 96, 12, 13, 14, 15, 16,
- /* 1270 */ 360, 4, 360, 95, 443, 96, 330, 360, 417, 427,
- /* 1280 */ 388, 133, 397, 105, 392, 244, 19, 95, 396, 397,
- /* 1290 */ 398, 399, 400, 401, 402, 35, 404, 43, 96, 390,
- /* 1300 */ 33, 409, 96, 411, 47, 389, 360, 415, 416, 174,
- /* 1310 */ 382, 426, 13, 201, 47, 62, 168, 169, 170, 52,
- /* 1320 */ 428, 173, 42, 178, 57, 322, 441, 442, 436, 69,
- /* 1330 */ 13, 446, 447, 372, 35, 158, 372, 370, 20, 191,
- /* 1340 */ 372, 330, 194, 397, 196, 197, 198, 199, 200, 330,
- /* 1350 */ 96, 322, 35, 370, 370, 352, 93, 104, 337, 20,
- /* 1360 */ 324, 94, 330, 360, 97, 419, 420, 421, 365, 423,
- /* 1370 */ 367, 324, 426, 330, 20, 330, 386, 335, 20, 178,
- /* 1380 */ 367, 352, 20, 335, 379, 381, 335, 441, 442, 360,
- /* 1390 */ 242, 388, 446, 447, 365, 392, 367, 379, 335, 396,
- /* 1400 */ 397, 398, 399, 400, 401, 402, 335, 404, 51, 330,
- /* 1410 */ 335, 158, 409, 332, 411, 335, 332, 388, 415, 416,
- /* 1420 */ 324, 392, 352, 330, 352, 396, 397, 398, 399, 400,
- /* 1430 */ 401, 402, 324, 404, 352, 352, 190, 387, 409, 436,
- /* 1440 */ 411, 352, 352, 352, 415, 416, 352, 352, 386, 333,
- /* 1450 */ 352, 352, 365, 181, 425, 367, 333, 330, 330, 333,
- /* 1460 */ 249, 385, 160, 322, 333, 379, 365, 365, 365, 365,
- /* 1470 */ 348, 365, 333, 360, 20, 375, 365, 250, 432, 365,
- /* 1480 */ 375, 432, 229, 230, 231, 232, 233, 234, 235, 236,
- /* 1490 */ 237, 238, 239, 352, 373, 375, 256, 365, 365, 375,
- /* 1500 */ 435, 360, 395, 365, 395, 167, 365, 258, 367, 257,
- /* 1510 */ 245, 434, 265, 262, 445, 451, 260, 241, 20, 390,
- /* 1520 */ 95, 360, 95, 342, 394, 356, 330, 333, 365, 388,
- /* 1530 */ 322, 36, 325, 392, 324, 383, 346, 396, 397, 398,
- /* 1540 */ 399, 400, 401, 402, 378, 404, 346, 432, 431, 430,
- /* 1550 */ 409, 414, 411, 334, 429, 346, 415, 416, 320, 0,
- /* 1560 */ 352, 0, 444, 183, 0, 0, 425, 42, 360, 35,
- /* 1570 */ 195, 35, 35, 365, 0, 367, 35, 195, 0, 35,
- /* 1580 */ 35, 195, 0, 195, 322, 0, 35, 0, 22, 0,
- /* 1590 */ 35, 178, 176, 0, 0, 172, 388, 171, 0, 0,
- /* 1600 */ 392, 0, 46, 0, 396, 397, 398, 399, 400, 401,
- /* 1610 */ 402, 0, 404, 42, 352, 0, 0, 409, 0, 411,
- /* 1620 */ 149, 42, 360, 415, 416, 0, 0, 365, 0, 367,
- /* 1630 */ 0, 0, 35, 425, 0, 149, 0, 0, 322, 0,
- /* 1640 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- /* 1650 */ 388, 0, 0, 0, 392, 42, 0, 0, 396, 397,
- /* 1660 */ 398, 399, 400, 401, 402, 0, 404, 0, 352, 0,
- /* 1670 */ 0, 409, 22, 411, 57, 0, 360, 415, 416, 0,
- /* 1680 */ 0, 365, 0, 367, 57, 0, 0, 14, 0, 35,
- /* 1690 */ 14, 322, 63, 167, 0, 0, 0, 42, 39, 0,
- /* 1700 */ 0, 43, 40, 39, 388, 0, 46, 46, 392, 0,
- /* 1710 */ 39, 0, 396, 397, 398, 399, 400, 401, 402, 35,
- /* 1720 */ 404, 352, 39, 0, 47, 409, 35, 411, 47, 360,
- /* 1730 */ 0, 415, 416, 0, 365, 0, 367, 39, 35, 35,
- /* 1740 */ 47, 39, 0, 0, 322, 39, 0, 35, 47, 22,
- /* 1750 */ 0, 35, 35, 22, 35, 35, 43, 388, 43, 35,
- /* 1760 */ 35, 392, 22, 35, 0, 396, 397, 398, 399, 400,
- /* 1770 */ 401, 402, 104, 404, 352, 22, 0, 22, 409, 0,
- /* 1780 */ 411, 49, 360, 22, 415, 416, 35, 365, 0, 367,
- /* 1790 */ 0, 102, 35, 35, 0, 22, 0, 20, 163, 0,
- /* 1800 */ 35, 179, 22, 96, 0, 322, 0, 0, 3, 95,
- /* 1810 */ 388, 0, 0, 95, 392, 0, 35, 96, 396, 397,
- /* 1820 */ 398, 399, 400, 401, 402, 0, 404, 35, 165, 322,
- /* 1830 */ 39, 95, 160, 411, 95, 352, 95, 415, 416, 105,
- /* 1840 */ 43, 163, 246, 360, 46, 43, 159, 95, 365, 225,
- /* 1850 */ 367, 43, 96, 163, 188, 95, 43, 225, 161, 352,
- /* 1860 */ 227, 43, 96, 96, 95, 46, 96, 360, 96, 95,
- /* 1870 */ 46, 388, 365, 95, 367, 392, 3, 95, 95, 396,
- /* 1880 */ 397, 398, 399, 400, 401, 402, 403, 404, 405, 406,
- /* 1890 */ 43, 322, 35, 35, 35, 388, 96, 96, 35, 392,
- /* 1900 */ 35, 35, 46, 396, 397, 398, 399, 400, 401, 402,
- /* 1910 */ 96, 404, 96, 43, 46, 46, 2, 22, 411, 96,
- /* 1920 */ 46, 352, 95, 416, 95, 46, 95, 201, 96, 360,
- /* 1930 */ 96, 95, 95, 22, 365, 96, 367, 95, 35, 106,
- /* 1940 */ 203, 96, 322, 35, 95, 35, 96, 95, 35, 96,
- /* 1950 */ 95, 35, 35, 22, 246, 95, 246, 388, 96, 119,
- /* 1960 */ 96, 392, 240, 119, 35, 396, 397, 398, 399, 400,
- /* 1970 */ 401, 402, 352, 404, 22, 406, 43, 95, 95, 107,
- /* 1980 */ 360, 95, 95, 63, 62, 365, 119, 367, 35, 35,
- /* 1990 */ 119, 35, 35, 35, 35, 35, 322, 35, 35, 35,
- /* 2000 */ 35, 69, 35, 22, 92, 35, 22, 35, 388, 43,
- /* 2010 */ 35, 35, 392, 69, 322, 35, 396, 397, 398, 399,
- /* 2020 */ 400, 401, 402, 35, 404, 35, 352, 35, 35, 22,
- /* 2030 */ 35, 0, 35, 39, 360, 0, 47, 35, 47, 365,
- /* 2040 */ 39, 367, 0, 35, 352, 47, 0, 35, 39, 39,
- /* 2050 */ 47, 0, 360, 35, 35, 0, 22, 365, 438, 367,
- /* 2060 */ 21, 452, 388, 22, 20, 22, 392, 452, 21, 452,
- /* 2070 */ 396, 397, 398, 399, 400, 401, 402, 452, 404, 452,
- /* 2080 */ 388, 452, 452, 452, 392, 452, 452, 452, 396, 397,
- /* 2090 */ 398, 399, 400, 401, 402, 452, 404, 322, 452, 452,
- /* 2100 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2110 */ 452, 452, 452, 452, 440, 452, 452, 452, 452, 452,
- /* 2120 */ 452, 452, 452, 452, 452, 452, 452, 352, 452, 452,
- /* 2130 */ 452, 452, 357, 452, 452, 360, 452, 452, 452, 452,
- /* 2140 */ 365, 449, 367, 452, 452, 452, 452, 452, 452, 452,
- /* 2150 */ 452, 452, 322, 452, 452, 452, 452, 452, 452, 452,
- /* 2160 */ 452, 452, 452, 388, 452, 452, 452, 392, 452, 452,
- /* 2170 */ 452, 396, 397, 398, 399, 400, 401, 402, 452, 404,
- /* 2180 */ 452, 452, 352, 452, 452, 452, 452, 357, 452, 452,
- /* 2190 */ 360, 452, 452, 452, 452, 365, 452, 367, 452, 452,
- /* 2200 */ 452, 452, 452, 322, 452, 452, 452, 452, 452, 452,
- /* 2210 */ 452, 452, 452, 452, 452, 452, 452, 452, 388, 452,
- /* 2220 */ 452, 452, 392, 452, 452, 452, 396, 397, 398, 399,
- /* 2230 */ 400, 401, 402, 352, 404, 452, 452, 452, 452, 452,
- /* 2240 */ 452, 360, 452, 452, 452, 452, 365, 452, 367, 452,
- /* 2250 */ 452, 452, 452, 452, 452, 452, 452, 322, 452, 452,
- /* 2260 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 388,
- /* 2270 */ 452, 452, 452, 392, 452, 452, 452, 396, 397, 398,
- /* 2280 */ 399, 400, 401, 402, 452, 404, 452, 352, 452, 452,
- /* 2290 */ 452, 452, 452, 452, 452, 360, 452, 452, 452, 452,
- /* 2300 */ 365, 452, 367, 452, 452, 452, 452, 452, 322, 452,
- /* 2310 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2320 */ 452, 452, 452, 388, 452, 452, 452, 392, 452, 452,
- /* 2330 */ 452, 396, 397, 398, 399, 400, 401, 402, 352, 404,
- /* 2340 */ 452, 452, 452, 452, 452, 452, 360, 452, 452, 452,
- /* 2350 */ 452, 365, 452, 367, 452, 452, 452, 452, 452, 452,
- /* 2360 */ 452, 452, 322, 452, 452, 452, 452, 452, 452, 452,
- /* 2370 */ 452, 452, 452, 452, 388, 452, 452, 452, 392, 452,
- /* 2380 */ 322, 452, 396, 397, 398, 399, 400, 401, 402, 452,
- /* 2390 */ 404, 452, 352, 452, 452, 452, 452, 452, 452, 452,
- /* 2400 */ 360, 452, 452, 452, 452, 365, 452, 367, 452, 452,
- /* 2410 */ 352, 452, 452, 452, 452, 452, 452, 452, 360, 452,
- /* 2420 */ 452, 452, 452, 365, 452, 367, 452, 452, 388, 452,
- /* 2430 */ 452, 452, 392, 452, 452, 452, 396, 397, 398, 399,
- /* 2440 */ 400, 401, 402, 452, 404, 452, 388, 452, 452, 452,
- /* 2450 */ 392, 452, 452, 452, 396, 397, 398, 399, 400, 401,
- /* 2460 */ 402, 452, 404, 322, 452, 452, 452, 452, 452, 452,
- /* 2470 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2480 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2490 */ 452, 452, 452, 352, 452, 452, 452, 452, 452, 452,
- /* 2500 */ 452, 360, 452, 452, 452, 452, 365, 452, 367, 452,
- /* 2510 */ 452, 452, 452, 452, 452, 452, 452, 452, 322, 452,
- /* 2520 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 388,
- /* 2530 */ 452, 452, 452, 392, 452, 452, 452, 396, 397, 398,
- /* 2540 */ 399, 400, 401, 402, 452, 404, 452, 452, 352, 452,
- /* 2550 */ 452, 452, 452, 452, 452, 452, 360, 452, 452, 452,
- /* 2560 */ 452, 365, 452, 367, 452, 452, 452, 452, 452, 322,
- /* 2570 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2580 */ 452, 452, 452, 452, 388, 452, 452, 452, 392, 452,
- /* 2590 */ 452, 452, 396, 397, 398, 399, 400, 401, 402, 352,
- /* 2600 */ 404, 452, 452, 452, 452, 452, 452, 360, 452, 452,
- /* 2610 */ 452, 452, 365, 452, 367, 452, 452, 452, 452, 452,
- /* 2620 */ 452, 452, 452, 322, 452, 452, 452, 452, 452, 452,
- /* 2630 */ 452, 452, 452, 452, 452, 388, 452, 452, 452, 392,
- /* 2640 */ 452, 452, 452, 396, 397, 398, 399, 400, 401, 402,
- /* 2650 */ 452, 404, 452, 352, 452, 452, 452, 452, 452, 452,
- /* 2660 */ 452, 360, 452, 452, 452, 452, 365, 452, 367, 452,
- /* 2670 */ 452, 452, 452, 452, 322, 452, 452, 452, 452, 452,
- /* 2680 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 388,
- /* 2690 */ 452, 452, 452, 392, 452, 452, 452, 396, 397, 398,
- /* 2700 */ 399, 400, 401, 402, 352, 404, 452, 452, 452, 452,
- /* 2710 */ 452, 452, 360, 452, 452, 452, 452, 365, 452, 367,
- /* 2720 */ 452, 452, 452, 452, 452, 452, 452, 452, 322, 452,
- /* 2730 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2740 */ 388, 452, 452, 452, 392, 452, 322, 452, 396, 397,
- /* 2750 */ 398, 399, 400, 401, 402, 452, 404, 452, 352, 452,
- /* 2760 */ 452, 452, 452, 452, 452, 452, 360, 452, 452, 452,
- /* 2770 */ 452, 365, 452, 367, 452, 452, 352, 452, 452, 452,
- /* 2780 */ 452, 452, 452, 452, 360, 452, 452, 452, 452, 365,
- /* 2790 */ 452, 367, 452, 452, 388, 452, 452, 452, 392, 452,
- /* 2800 */ 452, 452, 396, 397, 398, 399, 400, 401, 402, 452,
- /* 2810 */ 404, 452, 388, 452, 452, 452, 392, 452, 452, 452,
- /* 2820 */ 396, 397, 398, 399, 400, 401, 402, 452, 404, 322,
- /* 2830 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2840 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2850 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 352,
- /* 2860 */ 452, 452, 452, 452, 452, 452, 452, 360, 452, 452,
- /* 2870 */ 452, 452, 365, 452, 367, 452, 452, 452, 452, 452,
- /* 2880 */ 452, 452, 452, 452, 322, 452, 452, 452, 452, 452,
- /* 2890 */ 452, 452, 452, 452, 452, 388, 452, 452, 452, 392,
- /* 2900 */ 452, 452, 452, 396, 397, 398, 399, 400, 401, 402,
- /* 2910 */ 452, 404, 452, 452, 352, 452, 452, 452, 452, 452,
- /* 2920 */ 452, 452, 360, 452, 452, 452, 452, 365, 452, 367,
- /* 2930 */ 452, 452, 452, 452, 452, 322, 452, 452, 452, 452,
- /* 2940 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 2950 */ 388, 452, 452, 452, 392, 452, 452, 452, 396, 397,
- /* 2960 */ 398, 399, 400, 401, 402, 352, 404, 452, 452, 452,
- /* 2970 */ 452, 452, 452, 360, 452, 452, 452, 452, 365, 452,
- /* 2980 */ 367, 452, 452, 452, 452, 452, 452, 452, 452, 322,
- /* 2990 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3000 */ 452, 388, 452, 452, 452, 392, 452, 452, 452, 396,
- /* 3010 */ 397, 398, 399, 400, 401, 402, 452, 404, 452, 352,
- /* 3020 */ 452, 452, 452, 452, 452, 452, 452, 360, 452, 452,
- /* 3030 */ 452, 452, 365, 452, 367, 452, 452, 452, 452, 452,
- /* 3040 */ 322, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3050 */ 452, 452, 452, 452, 452, 388, 452, 452, 452, 392,
- /* 3060 */ 452, 452, 452, 396, 397, 398, 399, 400, 401, 402,
- /* 3070 */ 352, 404, 452, 452, 452, 452, 452, 452, 360, 452,
- /* 3080 */ 452, 452, 452, 365, 452, 367, 452, 452, 452, 452,
- /* 3090 */ 452, 452, 452, 452, 322, 452, 452, 452, 452, 452,
- /* 3100 */ 452, 452, 452, 452, 452, 452, 388, 452, 452, 452,
- /* 3110 */ 392, 452, 322, 452, 396, 397, 398, 399, 400, 401,
- /* 3120 */ 402, 452, 404, 452, 352, 452, 452, 452, 452, 452,
- /* 3130 */ 452, 452, 360, 452, 452, 452, 452, 365, 452, 367,
- /* 3140 */ 452, 452, 352, 452, 452, 452, 452, 452, 452, 452,
- /* 3150 */ 360, 452, 452, 452, 452, 365, 452, 367, 452, 452,
- /* 3160 */ 388, 452, 452, 452, 392, 452, 452, 452, 396, 397,
- /* 3170 */ 398, 399, 400, 401, 402, 452, 404, 452, 388, 452,
- /* 3180 */ 452, 452, 392, 452, 452, 452, 396, 397, 398, 399,
- /* 3190 */ 400, 401, 402, 452, 404, 322, 452, 452, 452, 452,
- /* 3200 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3210 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3220 */ 452, 452, 452, 452, 452, 352, 452, 452, 452, 452,
- /* 3230 */ 452, 452, 452, 360, 452, 452, 452, 452, 365, 452,
- /* 3240 */ 367, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3250 */ 322, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3260 */ 452, 388, 452, 452, 452, 392, 452, 452, 452, 396,
- /* 3270 */ 397, 398, 399, 400, 401, 402, 452, 404, 452, 452,
- /* 3280 */ 352, 452, 452, 452, 452, 452, 452, 452, 360, 452,
- /* 3290 */ 452, 452, 452, 365, 452, 367, 452, 452, 452, 452,
- /* 3300 */ 452, 452, 452, 452, 452, 452, 452, 452, 452, 452,
- /* 3310 */ 452, 452, 452, 452, 452, 452, 388, 452, 452, 452,
- /* 3320 */ 392, 452, 452, 452, 396, 397, 398, 399, 400, 401,
- /* 3330 */ 402, 452, 404,
+ /* 220 */ 220, 221, 222, 223, 224, 335, 21, 95, 383, 24,
+ /* 230 */ 25, 26, 27, 28, 29, 30, 31, 32, 177, 349,
+ /* 240 */ 179, 18, 242, 20, 399, 366, 367, 20, 358, 117,
+ /* 250 */ 27, 21, 106, 30, 24, 25, 26, 27, 28, 29,
+ /* 260 */ 30, 31, 32, 131, 132, 95, 399, 352, 367, 399,
+ /* 270 */ 47, 61, 49, 428, 359, 52, 12, 13, 377, 96,
+ /* 280 */ 322, 380, 161, 368, 20, 242, 22, 242, 443, 444,
+ /* 290 */ 242, 159, 160, 448, 449, 428, 20, 33, 428, 35,
+ /* 300 */ 154, 8, 9, 242, 242, 12, 13, 14, 15, 16,
+ /* 310 */ 178, 444, 180, 443, 444, 448, 449, 94, 448, 449,
+ /* 320 */ 164, 57, 95, 365, 242, 20, 62, 159, 160, 106,
+ /* 330 */ 1, 2, 321, 69, 323, 203, 204, 57, 206, 207,
+ /* 340 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
+ /* 350 */ 218, 219, 220, 221, 222, 223, 224, 134, 20, 95,
+ /* 360 */ 137, 138, 139, 140, 141, 142, 143, 144, 145, 146,
+ /* 370 */ 147, 148, 149, 150, 151, 152, 153, 97, 155, 156,
+ /* 380 */ 157, 117, 8, 9, 35, 383, 12, 13, 14, 15,
+ /* 390 */ 16, 33, 20, 351, 22, 131, 132, 327, 399, 173,
+ /* 400 */ 330, 399, 344, 247, 248, 47, 364, 35, 12, 13,
+ /* 410 */ 352, 53, 54, 55, 56, 57, 20, 43, 22, 361,
+ /* 420 */ 194, 195, 50, 159, 160, 96, 2, 428, 61, 33,
+ /* 430 */ 428, 35, 8, 9, 127, 319, 12, 13, 14, 15,
+ /* 440 */ 16, 335, 178, 444, 180, 443, 444, 448, 449, 344,
+ /* 450 */ 448, 449, 94, 57, 352, 97, 20, 352, 62, 203,
+ /* 460 */ 338, 339, 360, 170, 358, 69, 361, 203, 204, 242,
+ /* 470 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
+ /* 480 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 21,
+ /* 490 */ 226, 95, 185, 186, 44, 45, 189, 3, 191, 383,
+ /* 500 */ 322, 330, 34, 401, 36, 397, 383, 251, 252, 253,
+ /* 510 */ 254, 255, 14, 117, 20, 399, 107, 383, 20, 126,
+ /* 520 */ 162, 163, 399, 165, 14, 322, 168, 131, 132, 180,
+ /* 530 */ 20, 360, 424, 399, 0, 126, 127, 128, 129, 130,
+ /* 540 */ 12, 13, 184, 365, 428, 330, 322, 352, 20, 0,
+ /* 550 */ 22, 428, 410, 106, 412, 159, 160, 264, 343, 443,
+ /* 560 */ 444, 33, 428, 35, 448, 449, 443, 444, 365, 374,
+ /* 570 */ 399, 448, 449, 14, 178, 360, 180, 443, 444, 20,
+ /* 580 */ 187, 188, 448, 449, 0, 57, 20, 354, 322, 365,
+ /* 590 */ 96, 420, 421, 422, 423, 61, 425, 69, 365, 203,
+ /* 600 */ 204, 322, 206, 207, 208, 209, 210, 211, 212, 213,
+ /* 610 */ 214, 215, 216, 217, 218, 219, 220, 221, 222, 223,
+ /* 620 */ 224, 57, 322, 95, 226, 0, 228, 394, 395, 8,
+ /* 630 */ 9, 365, 226, 12, 13, 14, 15, 16, 158, 406,
+ /* 640 */ 2, 322, 333, 0, 365, 117, 8, 9, 338, 339,
+ /* 650 */ 12, 13, 14, 15, 16, 161, 107, 159, 94, 131,
+ /* 660 */ 132, 97, 8, 9, 355, 365, 12, 13, 14, 15,
+ /* 670 */ 16, 397, 12, 13, 14, 126, 127, 128, 129, 130,
+ /* 680 */ 20, 354, 22, 62, 365, 322, 330, 159, 160, 352,
+ /* 690 */ 47, 107, 365, 33, 330, 35, 8, 9, 424, 343,
+ /* 700 */ 12, 13, 14, 15, 16, 368, 178, 343, 180, 229,
+ /* 710 */ 126, 127, 128, 129, 130, 352, 360, 57, 159, 239,
+ /* 720 */ 69, 394, 395, 360, 360, 104, 69, 161, 365, 69,
+ /* 730 */ 367, 203, 204, 406, 206, 207, 208, 209, 210, 211,
+ /* 740 */ 212, 213, 214, 215, 216, 217, 218, 219, 220, 221,
+ /* 750 */ 222, 223, 224, 4, 391, 95, 322, 43, 395, 322,
+ /* 760 */ 360, 398, 399, 400, 401, 402, 403, 404, 0, 406,
+ /* 770 */ 242, 371, 345, 37, 411, 348, 413, 117, 322, 158,
+ /* 780 */ 417, 418, 8, 9, 96, 322, 12, 13, 14, 15,
+ /* 790 */ 16, 131, 132, 430, 12, 13, 14, 15, 16, 365,
+ /* 800 */ 330, 438, 365, 330, 12, 13, 360, 410, 397, 412,
+ /* 810 */ 96, 330, 20, 343, 22, 161, 343, 371, 330, 159,
+ /* 820 */ 160, 365, 20, 350, 343, 33, 3, 35, 365, 61,
+ /* 830 */ 360, 343, 330, 360, 98, 424, 100, 101, 178, 103,
+ /* 840 */ 180, 360, 20, 107, 379, 343, 381, 20, 360, 57,
+ /* 850 */ 229, 230, 231, 232, 233, 234, 235, 236, 237, 238,
+ /* 860 */ 239, 69, 360, 203, 204, 129, 206, 207, 208, 209,
+ /* 870 */ 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
+ /* 880 */ 220, 221, 222, 223, 224, 126, 127, 95, 108, 109,
+ /* 890 */ 110, 111, 112, 113, 114, 115, 116, 117, 118, 322,
+ /* 900 */ 120, 121, 122, 123, 124, 125, 367, 352, 330, 117,
+ /* 910 */ 322, 240, 241, 330, 354, 379, 361, 381, 22, 380,
+ /* 920 */ 39, 343, 322, 131, 132, 365, 343, 340, 330, 342,
+ /* 930 */ 322, 35, 322, 322, 330, 43, 12, 13, 360, 42,
+ /* 940 */ 43, 343, 365, 360, 20, 186, 22, 343, 189, 330,
+ /* 950 */ 191, 159, 160, 365, 394, 395, 396, 33, 360, 35,
+ /* 960 */ 0, 330, 343, 161, 360, 365, 406, 107, 362, 43,
+ /* 970 */ 178, 365, 180, 365, 343, 365, 365, 409, 387, 360,
+ /* 980 */ 412, 57, 362, 161, 345, 365, 159, 348, 96, 129,
+ /* 990 */ 43, 360, 243, 69, 353, 203, 204, 322, 206, 207,
+ /* 1000 */ 208, 209, 210, 211, 212, 213, 214, 215, 216, 217,
+ /* 1010 */ 218, 219, 220, 221, 222, 223, 224, 330, 43, 95,
+ /* 1020 */ 42, 43, 96, 330, 64, 65, 66, 352, 330, 43,
+ /* 1030 */ 343, 99, 72, 73, 102, 360, 343, 77, 78, 330,
+ /* 1040 */ 365, 117, 367, 83, 84, 99, 0, 360, 102, 89,
+ /* 1050 */ 43, 99, 343, 360, 102, 131, 132, 99, 360, 330,
+ /* 1060 */ 102, 43, 161, 43, 43, 43, 391, 166, 22, 360,
+ /* 1070 */ 395, 96, 343, 398, 399, 400, 401, 402, 403, 404,
+ /* 1080 */ 35, 406, 259, 159, 160, 0, 411, 0, 413, 360,
+ /* 1090 */ 0, 62, 417, 418, 131, 132, 3, 399, 95, 1,
+ /* 1100 */ 2, 43, 178, 96, 180, 353, 353, 353, 105, 22,
+ /* 1110 */ 353, 353, 22, 438, 96, 375, 96, 96, 96, 421,
+ /* 1120 */ 422, 423, 241, 425, 341, 452, 323, 203, 204, 46,
+ /* 1130 */ 206, 207, 208, 209, 210, 211, 212, 213, 214, 215,
+ /* 1140 */ 216, 217, 218, 219, 220, 221, 222, 223, 224, 64,
+ /* 1150 */ 65, 66, 67, 68, 96, 70, 71, 72, 73, 74,
+ /* 1160 */ 75, 76, 77, 78, 79, 80, 81, 82, 83, 84,
+ /* 1170 */ 85, 86, 87, 88, 89, 90, 91, 18, 95, 441,
+ /* 1180 */ 43, 43, 23, 43, 322, 43, 43, 43, 22, 96,
+ /* 1190 */ 13, 13, 35, 0, 331, 435, 37, 38, 330, 352,
+ /* 1200 */ 41, 35, 331, 375, 329, 364, 375, 426, 261, 445,
+ /* 1210 */ 419, 244, 35, 35, 352, 429, 47, 58, 59, 60,
+ /* 1220 */ 176, 392, 360, 393, 385, 180, 69, 365, 360, 367,
+ /* 1230 */ 42, 372, 203, 96, 96, 69, 96, 20, 96, 96,
+ /* 1240 */ 96, 48, 375, 370, 372, 20, 158, 330, 330, 263,
+ /* 1250 */ 372, 337, 370, 391, 95, 370, 93, 395, 330, 330,
+ /* 1260 */ 398, 399, 400, 401, 402, 403, 404, 399, 406, 330,
+ /* 1270 */ 20, 409, 324, 411, 412, 413, 20, 324, 389, 417,
+ /* 1280 */ 418, 20, 367, 117, 335, 335, 382, 20, 382, 421,
+ /* 1290 */ 422, 423, 133, 425, 384, 322, 335, 335, 330, 335,
+ /* 1300 */ 335, 335, 51, 332, 332, 324, 352, 352, 352, 352,
+ /* 1310 */ 365, 352, 330, 324, 192, 390, 389, 333, 183, 388,
+ /* 1320 */ 382, 352, 352, 333, 330, 352, 352, 330, 352, 170,
+ /* 1330 */ 171, 172, 352, 360, 175, 352, 163, 333, 365, 333,
+ /* 1340 */ 367, 249, 365, 348, 178, 333, 180, 250, 437, 169,
+ /* 1350 */ 322, 256, 193, 365, 367, 196, 365, 198, 199, 200,
+ /* 1360 */ 201, 202, 258, 378, 391, 365, 365, 375, 395, 203,
+ /* 1370 */ 204, 398, 399, 400, 401, 402, 403, 404, 376, 406,
+ /* 1380 */ 352, 365, 365, 378, 411, 360, 413, 378, 360, 375,
+ /* 1390 */ 417, 418, 365, 365, 245, 367, 365, 378, 365, 265,
+ /* 1400 */ 427, 242, 257, 262, 453, 241, 322, 260, 393, 360,
+ /* 1410 */ 20, 95, 416, 434, 95, 356, 365, 342, 36, 391,
+ /* 1420 */ 324, 330, 333, 395, 325, 432, 398, 399, 400, 401,
+ /* 1430 */ 402, 403, 404, 434, 406, 397, 352, 381, 386, 411,
+ /* 1440 */ 346, 413, 434, 433, 360, 417, 418, 436, 346, 365,
+ /* 1450 */ 334, 367, 346, 320, 431, 427, 0, 0, 185, 0,
+ /* 1460 */ 447, 322, 0, 42, 0, 35, 197, 35, 35, 35,
+ /* 1470 */ 446, 197, 0, 35, 35, 391, 197, 0, 197, 395,
+ /* 1480 */ 322, 0, 398, 399, 400, 401, 402, 403, 404, 35,
+ /* 1490 */ 406, 352, 0, 22, 0, 411, 35, 413, 180, 360,
+ /* 1500 */ 178, 417, 418, 0, 365, 0, 367, 174, 173, 0,
+ /* 1510 */ 352, 427, 0, 46, 0, 0, 0, 42, 360, 0,
+ /* 1520 */ 0, 0, 0, 365, 0, 367, 0, 0, 0, 149,
+ /* 1530 */ 391, 35, 0, 149, 395, 0, 0, 398, 399, 400,
+ /* 1540 */ 401, 402, 403, 404, 0, 406, 0, 0, 0, 391,
+ /* 1550 */ 0, 0, 0, 395, 0, 0, 398, 399, 400, 401,
+ /* 1560 */ 402, 403, 404, 0, 406, 0, 0, 428, 35, 411,
+ /* 1570 */ 0, 413, 42, 0, 0, 417, 418, 322, 0, 0,
+ /* 1580 */ 12, 13, 443, 444, 0, 0, 22, 448, 449, 14,
+ /* 1590 */ 22, 0, 0, 0, 0, 57, 0, 57, 322, 0,
+ /* 1600 */ 0, 33, 43, 35, 42, 0, 39, 352, 39, 14,
+ /* 1610 */ 0, 0, 0, 169, 0, 360, 40, 46, 46, 39,
+ /* 1620 */ 365, 0, 367, 0, 63, 57, 0, 0, 352, 47,
+ /* 1630 */ 0, 0, 35, 35, 47, 47, 360, 69, 0, 35,
+ /* 1640 */ 39, 365, 39, 367, 35, 39, 391, 39, 0, 47,
+ /* 1650 */ 395, 0, 0, 398, 399, 400, 401, 402, 403, 404,
+ /* 1660 */ 0, 406, 104, 35, 22, 0, 411, 391, 413, 35,
+ /* 1670 */ 35, 395, 417, 418, 398, 399, 400, 401, 402, 403,
+ /* 1680 */ 404, 22, 406, 322, 35, 117, 43, 411, 102, 413,
+ /* 1690 */ 35, 22, 35, 417, 418, 0, 43, 35, 35, 22,
+ /* 1700 */ 0, 22, 0, 49, 22, 35, 0, 0, 35, 35,
+ /* 1710 */ 0, 22, 20, 352, 96, 95, 0, 161, 35, 0,
+ /* 1720 */ 181, 360, 0, 22, 0, 0, 365, 95, 367, 96,
+ /* 1730 */ 0, 35, 3, 0, 0, 190, 95, 0, 161, 35,
+ /* 1740 */ 95, 95, 39, 46, 163, 105, 178, 246, 180, 62,
+ /* 1750 */ 167, 161, 391, 95, 43, 43, 395, 96, 43, 398,
+ /* 1760 */ 399, 400, 401, 402, 403, 404, 225, 406, 322, 162,
+ /* 1770 */ 227, 203, 204, 95, 413, 43, 96, 164, 417, 418,
+ /* 1780 */ 96, 95, 225, 215, 216, 217, 218, 219, 220, 221,
+ /* 1790 */ 96, 46, 46, 95, 95, 43, 3, 43, 352, 246,
+ /* 1800 */ 95, 35, 35, 35, 96, 96, 360, 35, 95, 35,
+ /* 1810 */ 96, 365, 35, 367, 96, 46, 96, 46, 43, 46,
+ /* 1820 */ 2, 22, 203, 95, 322, 46, 46, 96, 22, 205,
+ /* 1830 */ 95, 35, 96, 95, 69, 96, 95, 391, 95, 35,
+ /* 1840 */ 96, 395, 35, 95, 398, 399, 400, 401, 402, 403,
+ /* 1850 */ 404, 96, 406, 322, 352, 106, 240, 95, 95, 413,
+ /* 1860 */ 96, 246, 360, 417, 418, 35, 96, 365, 35, 367,
+ /* 1870 */ 119, 95, 35, 22, 96, 119, 95, 119, 96, 95,
+ /* 1880 */ 119, 95, 322, 352, 95, 35, 95, 43, 22, 63,
+ /* 1890 */ 107, 360, 35, 391, 35, 35, 365, 395, 367, 35,
+ /* 1900 */ 398, 399, 400, 401, 402, 403, 404, 405, 406, 407,
+ /* 1910 */ 408, 322, 352, 35, 35, 35, 35, 35, 35, 92,
+ /* 1920 */ 360, 35, 391, 35, 22, 365, 395, 367, 43, 398,
+ /* 1930 */ 399, 400, 401, 402, 403, 404, 35, 406, 22, 35,
+ /* 1940 */ 35, 352, 35, 69, 35, 35, 35, 35, 35, 360,
+ /* 1950 */ 22, 391, 35, 0, 365, 395, 367, 35, 398, 399,
+ /* 1960 */ 400, 401, 402, 403, 404, 47, 406, 0, 39, 35,
+ /* 1970 */ 439, 440, 47, 0, 39, 35, 39, 47, 322, 0,
+ /* 1980 */ 391, 35, 39, 47, 395, 0, 35, 398, 399, 400,
+ /* 1990 */ 401, 402, 403, 404, 322, 406, 35, 0, 22, 21,
+ /* 2000 */ 454, 21, 413, 22, 22, 454, 20, 418, 352, 454,
+ /* 2010 */ 450, 451, 454, 357, 454, 454, 360, 454, 454, 454,
+ /* 2020 */ 454, 365, 454, 367, 352, 454, 454, 454, 454, 454,
+ /* 2030 */ 454, 454, 360, 454, 454, 454, 454, 365, 454, 367,
+ /* 2040 */ 454, 454, 454, 454, 454, 454, 454, 391, 454, 322,
+ /* 2050 */ 454, 395, 454, 454, 398, 399, 400, 401, 402, 403,
+ /* 2060 */ 404, 454, 406, 391, 454, 454, 454, 395, 454, 322,
+ /* 2070 */ 398, 399, 400, 401, 402, 403, 404, 454, 406, 352,
+ /* 2080 */ 408, 454, 454, 454, 454, 454, 454, 360, 454, 454,
+ /* 2090 */ 454, 454, 365, 454, 367, 454, 454, 454, 454, 352,
+ /* 2100 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454,
+ /* 2110 */ 454, 454, 365, 454, 367, 454, 454, 454, 391, 454,
+ /* 2120 */ 454, 454, 395, 454, 454, 398, 399, 400, 401, 402,
+ /* 2130 */ 403, 404, 454, 406, 322, 454, 454, 454, 391, 454,
+ /* 2140 */ 454, 454, 395, 454, 454, 398, 399, 400, 401, 402,
+ /* 2150 */ 403, 404, 454, 406, 454, 454, 454, 454, 454, 454,
+ /* 2160 */ 454, 454, 454, 454, 352, 454, 454, 440, 454, 454,
+ /* 2170 */ 454, 454, 360, 454, 454, 454, 454, 365, 454, 367,
+ /* 2180 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 442,
+ /* 2190 */ 454, 454, 322, 454, 454, 454, 454, 454, 454, 454,
+ /* 2200 */ 454, 454, 454, 391, 454, 454, 322, 395, 454, 454,
+ /* 2210 */ 398, 399, 400, 401, 402, 403, 404, 454, 406, 454,
+ /* 2220 */ 454, 454, 352, 454, 454, 454, 454, 357, 454, 454,
+ /* 2230 */ 360, 454, 454, 454, 454, 365, 352, 367, 454, 454,
+ /* 2240 */ 454, 357, 454, 454, 360, 454, 454, 454, 454, 365,
+ /* 2250 */ 454, 367, 454, 454, 454, 454, 454, 454, 454, 454,
+ /* 2260 */ 454, 391, 454, 451, 322, 395, 454, 454, 398, 399,
+ /* 2270 */ 400, 401, 402, 403, 404, 391, 406, 454, 322, 395,
+ /* 2280 */ 454, 454, 398, 399, 400, 401, 402, 403, 404, 454,
+ /* 2290 */ 406, 454, 454, 454, 352, 454, 454, 454, 454, 454,
+ /* 2300 */ 454, 454, 360, 454, 454, 454, 454, 365, 352, 367,
+ /* 2310 */ 454, 454, 454, 454, 454, 454, 360, 454, 454, 454,
+ /* 2320 */ 454, 365, 454, 367, 454, 454, 454, 454, 454, 454,
+ /* 2330 */ 454, 322, 454, 391, 454, 454, 454, 395, 454, 454,
+ /* 2340 */ 398, 399, 400, 401, 402, 403, 404, 391, 406, 454,
+ /* 2350 */ 454, 395, 454, 454, 398, 399, 400, 401, 402, 403,
+ /* 2360 */ 404, 352, 406, 454, 454, 454, 454, 454, 454, 360,
+ /* 2370 */ 454, 454, 454, 454, 365, 454, 367, 454, 454, 454,
+ /* 2380 */ 454, 454, 454, 454, 454, 454, 322, 454, 454, 454,
+ /* 2390 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
+ /* 2400 */ 391, 454, 322, 454, 395, 454, 454, 398, 399, 400,
+ /* 2410 */ 401, 402, 403, 404, 454, 406, 352, 454, 454, 454,
+ /* 2420 */ 454, 454, 454, 454, 360, 454, 454, 454, 454, 365,
+ /* 2430 */ 454, 367, 352, 454, 454, 454, 454, 454, 454, 454,
+ /* 2440 */ 360, 454, 454, 454, 454, 365, 454, 367, 454, 454,
+ /* 2450 */ 454, 454, 454, 454, 454, 391, 454, 322, 454, 395,
+ /* 2460 */ 454, 454, 398, 399, 400, 401, 402, 403, 404, 454,
+ /* 2470 */ 406, 391, 454, 322, 454, 395, 454, 454, 398, 399,
+ /* 2480 */ 400, 401, 402, 403, 404, 454, 406, 352, 454, 454,
+ /* 2490 */ 454, 454, 454, 454, 454, 360, 454, 454, 454, 454,
+ /* 2500 */ 365, 454, 367, 352, 454, 454, 454, 454, 454, 454,
+ /* 2510 */ 454, 360, 454, 454, 454, 454, 365, 454, 367, 454,
+ /* 2520 */ 454, 454, 454, 454, 454, 454, 391, 454, 454, 322,
+ /* 2530 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
+ /* 2540 */ 454, 406, 391, 454, 454, 322, 395, 454, 454, 398,
+ /* 2550 */ 399, 400, 401, 402, 403, 404, 454, 406, 454, 352,
+ /* 2560 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454,
+ /* 2570 */ 454, 454, 365, 454, 367, 352, 454, 454, 454, 454,
+ /* 2580 */ 454, 454, 454, 360, 454, 454, 454, 454, 365, 454,
+ /* 2590 */ 367, 454, 454, 454, 454, 454, 454, 454, 391, 454,
+ /* 2600 */ 454, 322, 395, 454, 454, 398, 399, 400, 401, 402,
+ /* 2610 */ 403, 404, 454, 406, 391, 454, 454, 322, 395, 454,
+ /* 2620 */ 454, 398, 399, 400, 401, 402, 403, 404, 454, 406,
+ /* 2630 */ 454, 352, 454, 454, 454, 454, 454, 454, 454, 360,
+ /* 2640 */ 454, 454, 454, 454, 365, 454, 367, 352, 454, 454,
+ /* 2650 */ 454, 454, 454, 454, 454, 360, 454, 454, 454, 454,
+ /* 2660 */ 365, 454, 367, 454, 454, 454, 454, 454, 454, 454,
+ /* 2670 */ 391, 454, 454, 454, 395, 454, 454, 398, 399, 400,
+ /* 2680 */ 401, 402, 403, 404, 322, 406, 391, 454, 454, 454,
+ /* 2690 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
+ /* 2700 */ 454, 406, 454, 454, 454, 454, 454, 454, 454, 322,
+ /* 2710 */ 454, 454, 454, 454, 352, 454, 454, 454, 454, 454,
+ /* 2720 */ 454, 454, 360, 454, 454, 454, 454, 365, 454, 367,
+ /* 2730 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 352,
+ /* 2740 */ 454, 454, 454, 454, 454, 454, 454, 360, 454, 454,
+ /* 2750 */ 454, 454, 365, 391, 367, 454, 454, 395, 454, 454,
+ /* 2760 */ 398, 399, 400, 401, 402, 403, 404, 19, 406, 454,
+ /* 2770 */ 322, 454, 454, 454, 454, 454, 454, 454, 391, 454,
+ /* 2780 */ 454, 33, 395, 454, 454, 398, 399, 400, 401, 402,
+ /* 2790 */ 403, 404, 454, 406, 454, 47, 454, 454, 454, 454,
+ /* 2800 */ 352, 53, 54, 55, 56, 57, 454, 454, 360, 454,
+ /* 2810 */ 454, 454, 454, 365, 454, 367, 454, 454, 454, 454,
+ /* 2820 */ 454, 454, 454, 322, 454, 454, 454, 454, 454, 454,
+ /* 2830 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 391,
+ /* 2840 */ 454, 322, 94, 395, 454, 97, 398, 399, 400, 401,
+ /* 2850 */ 402, 403, 404, 352, 406, 454, 454, 454, 454, 454,
+ /* 2860 */ 454, 360, 454, 454, 454, 454, 365, 454, 367, 454,
+ /* 2870 */ 454, 352, 454, 454, 454, 454, 454, 454, 130, 360,
+ /* 2880 */ 454, 454, 454, 454, 365, 454, 367, 454, 454, 454,
+ /* 2890 */ 454, 454, 391, 454, 454, 454, 395, 322, 454, 398,
+ /* 2900 */ 399, 400, 401, 402, 403, 404, 454, 406, 454, 454,
+ /* 2910 */ 391, 322, 454, 165, 395, 454, 454, 398, 399, 400,
+ /* 2920 */ 401, 402, 403, 404, 454, 406, 454, 352, 454, 454,
+ /* 2930 */ 182, 454, 184, 454, 454, 360, 454, 454, 454, 454,
+ /* 2940 */ 365, 352, 367, 454, 454, 454, 454, 454, 454, 360,
+ /* 2950 */ 454, 454, 454, 454, 365, 454, 367, 454, 454, 454,
+ /* 2960 */ 454, 454, 454, 454, 454, 454, 391, 322, 454, 454,
+ /* 2970 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
+ /* 2980 */ 391, 406, 454, 322, 395, 454, 454, 398, 399, 400,
+ /* 2990 */ 401, 402, 403, 404, 454, 406, 454, 352, 454, 454,
+ /* 3000 */ 454, 454, 454, 454, 454, 360, 454, 454, 454, 454,
+ /* 3010 */ 365, 454, 367, 352, 454, 454, 454, 454, 454, 454,
+ /* 3020 */ 454, 360, 454, 454, 454, 454, 365, 454, 367, 454,
+ /* 3030 */ 454, 454, 454, 454, 454, 454, 391, 454, 454, 454,
+ /* 3040 */ 395, 454, 454, 398, 399, 400, 401, 402, 403, 404,
+ /* 3050 */ 322, 406, 391, 454, 454, 454, 395, 454, 454, 398,
+ /* 3060 */ 399, 400, 401, 402, 403, 404, 454, 406, 454, 454,
+ /* 3070 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
+ /* 3080 */ 352, 454, 454, 454, 454, 454, 454, 454, 360, 454,
+ /* 3090 */ 454, 454, 454, 365, 454, 367, 454, 454, 454, 454,
+ /* 3100 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 454,
+ /* 3110 */ 454, 454, 454, 454, 454, 454, 454, 454, 454, 391,
+ /* 3120 */ 454, 454, 454, 395, 454, 454, 398, 399, 400, 401,
+ /* 3130 */ 402, 403, 404, 454, 406,
};
-#define YY_SHIFT_COUNT (700)
+#define YY_SHIFT_COUNT (704)
#define YY_SHIFT_MIN (0)
-#define YY_SHIFT_MAX (2055)
+#define YY_SHIFT_MAX (2748)
static const unsigned short int yy_shift_ofst[] = {
- /* 0 */ 1148, 0, 58, 271, 58, 329, 329, 329, 542, 329,
- /* 10 */ 329, 329, 329, 329, 600, 813, 813, 871, 813, 813,
- /* 20 */ 813, 813, 813, 813, 813, 813, 813, 813, 813, 813,
- /* 30 */ 813, 813, 813, 813, 813, 813, 813, 813, 813, 813,
- /* 40 */ 813, 813, 813, 813, 813, 813, 279, 434, 8, 266,
- /* 50 */ 261, 19, 43, 19, 8, 8, 658, 658, 19, 658,
- /* 60 */ 658, 332, 19, 16, 16, 14, 14, 435, 16, 16,
- /* 70 */ 16, 16, 16, 16, 16, 16, 16, 16, 20, 16,
- /* 80 */ 16, 16, 41, 16, 16, 207, 16, 16, 207, 213,
- /* 90 */ 16, 207, 207, 207, 16, 229, 1078, 1253, 1253, 367,
- /* 100 */ 222, 653, 653, 653, 653, 653, 653, 653, 653, 653,
- /* 110 */ 653, 653, 653, 653, 653, 653, 653, 653, 653, 653,
- /* 120 */ 128, 553, 435, 137, 137, 126, 366, 296, 99, 99,
- /* 130 */ 267, 267, 267, 366, 364, 364, 364, 27, 41, 10,
- /* 140 */ 10, 178, 207, 207, 354, 354, 27, 379, 199, 199,
- /* 150 */ 199, 199, 199, 199, 199, 340, 896, 21, 74, 450,
- /* 160 */ 164, 350, 407, 323, 422, 578, 821, 720, 963, 685,
- /* 170 */ 330, 718, 685, 1009, 395, 841, 1041, 1257, 1135, 1280,
- /* 180 */ 1280, 1177, 1318, 1318, 1280, 1177, 1177, 1263, 1318, 1318,
- /* 190 */ 1318, 1339, 1339, 1354, 20, 41, 20, 1358, 1362, 20,
- /* 200 */ 1358, 20, 20, 20, 1318, 20, 1357, 1357, 1339, 207,
- /* 210 */ 207, 207, 207, 207, 207, 207, 207, 207, 207, 207,
- /* 220 */ 1318, 1339, 354, 1246, 1354, 229, 1272, 41, 229, 1318,
- /* 230 */ 1318, 1358, 229, 1211, 354, 354, 354, 354, 1211, 354,
- /* 240 */ 1302, 229, 27, 229, 364, 1454, 1454, 354, 1227, 1211,
- /* 250 */ 354, 354, 1227, 1211, 354, 354, 207, 1240, 1338, 1227,
- /* 260 */ 1249, 1252, 1265, 1041, 1247, 1251, 1256, 1276, 364, 1498,
- /* 270 */ 1425, 1427, 354, 379, 1318, 229, 1495, 1339, 3333, 3333,
- /* 280 */ 3333, 3333, 3333, 3333, 3333, 1074, 951, 382, 1267, 576,
- /* 290 */ 669, 632, 692, 721, 779, 453, 1054, 1054, 1054, 1054,
- /* 300 */ 1054, 1054, 1054, 1054, 1054, 993, 670, 105, 113, 767,
- /* 310 */ 767, 197, 201, 120, 598, 513, 757, 766, 457, 757,
- /* 320 */ 757, 757, 760, 345, 704, 801, 1097, 1010, 1016, 1030,
- /* 330 */ 1035, 919, 949, 1187, 466, 940, 920, 969, 1073, 1085,
- /* 340 */ 1092, 1136, 1155, 1044, 952, 794, 1176, 1158, 1145, 1201,
- /* 350 */ 1112, 1160, 1179, 1192, 1162, 1167, 1168, 1202, 1206, 1254,
- /* 360 */ 1178, 1299, 1317, 1260, 1193, 1559, 1561, 1380, 1564, 1565,
- /* 370 */ 1525, 1574, 1534, 1375, 1536, 1537, 1541, 1382, 1578, 1544,
- /* 380 */ 1545, 1386, 1582, 1388, 1585, 1551, 1587, 1566, 1589, 1555,
- /* 390 */ 1413, 1416, 1593, 1594, 1423, 1426, 1598, 1599, 1556, 1601,
- /* 400 */ 1603, 1611, 1571, 1615, 1616, 1618, 1579, 1625, 1626, 1628,
- /* 410 */ 1630, 1631, 1471, 1597, 1634, 1486, 1636, 1637, 1639, 1640,
- /* 420 */ 1641, 1642, 1643, 1644, 1645, 1646, 1647, 1648, 1649, 1651,
- /* 430 */ 1652, 1613, 1653, 1656, 1657, 1665, 1667, 1650, 1669, 1670,
- /* 440 */ 1679, 1680, 1654, 1682, 1617, 1675, 1627, 1685, 1686, 1655,
- /* 450 */ 1659, 1658, 1673, 1660, 1676, 1661, 1688, 1662, 1664, 1699,
- /* 460 */ 1700, 1705, 1671, 1526, 1694, 1695, 1696, 1629, 1709, 1711,
- /* 470 */ 1684, 1677, 1683, 1723, 1691, 1681, 1698, 1730, 1703, 1693,
- /* 480 */ 1702, 1733, 1704, 1701, 1706, 1735, 1742, 1743, 1746, 1668,
- /* 490 */ 1689, 1712, 1727, 1750, 1716, 1717, 1731, 1719, 1720, 1713,
- /* 500 */ 1715, 1724, 1725, 1740, 1728, 1764, 1753, 1776, 1755, 1732,
- /* 510 */ 1779, 1761, 1751, 1788, 1757, 1790, 1758, 1794, 1773, 1777,
- /* 520 */ 1707, 1714, 1796, 1635, 1765, 1799, 1622, 1780, 1678, 1672,
- /* 530 */ 1804, 1806, 1690, 1663, 1805, 1807, 1811, 1812, 1718, 1721,
- /* 540 */ 1781, 1792, 1666, 1815, 1736, 1697, 1739, 1825, 1791, 1687,
- /* 550 */ 1741, 1734, 1798, 1797, 1624, 1633, 1632, 1802, 1596, 1752,
- /* 560 */ 1756, 1760, 1766, 1767, 1769, 1808, 1770, 1774, 1778, 1782,
- /* 570 */ 1772, 1813, 1819, 1824, 1783, 1818, 1708, 1800, 1801, 1873,
- /* 580 */ 1847, 1710, 1857, 1858, 1859, 1863, 1865, 1866, 1814, 1816,
- /* 590 */ 1856, 1722, 1870, 1868, 1869, 1914, 1895, 1726, 1827, 1823,
- /* 600 */ 1829, 1832, 1831, 1834, 1874, 1836, 1837, 1879, 1839, 1911,
- /* 610 */ 1737, 1842, 1833, 1845, 1903, 1908, 1849, 1850, 1910, 1852,
- /* 620 */ 1853, 1913, 1855, 1862, 1916, 1860, 1864, 1917, 1882, 1840,
- /* 630 */ 1844, 1867, 1871, 1931, 1872, 1883, 1886, 1929, 1887, 1933,
- /* 640 */ 1933, 1952, 1920, 1922, 1953, 1954, 1956, 1957, 1958, 1959,
- /* 650 */ 1960, 1962, 1963, 1964, 1932, 1912, 1966, 1965, 1967, 1981,
- /* 660 */ 1970, 1984, 1972, 1975, 1976, 1944, 1713, 1980, 1715, 1988,
- /* 670 */ 1990, 1992, 1993, 2007, 1995, 2031, 1997, 1989, 1994, 2035,
- /* 680 */ 2002, 1991, 2001, 2042, 2008, 1998, 2009, 2046, 2012, 2003,
- /* 690 */ 2010, 2051, 2018, 2019, 2055, 2034, 2039, 2041, 2043, 2047,
- /* 700 */ 2044,
+ /* 0 */ 1159, 0, 132, 264, 132, 396, 396, 396, 528, 396,
+ /* 10 */ 396, 396, 396, 396, 660, 792, 792, 924, 792, 792,
+ /* 20 */ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
+ /* 30 */ 792, 792, 792, 792, 792, 792, 792, 792, 792, 792,
+ /* 40 */ 792, 792, 792, 792, 792, 792, 48, 227, 170, 61,
+ /* 50 */ 82, 43, 45, 43, 170, 170, 1568, 1568, 43, 1568,
+ /* 60 */ 1568, 62, 43, 127, 127, 168, 59, 59, 52, 127,
+ /* 70 */ 127, 127, 127, 127, 127, 127, 127, 127, 127, 210,
+ /* 80 */ 127, 127, 127, 276, 127, 127, 305, 127, 127, 305,
+ /* 90 */ 338, 127, 305, 305, 305, 127, 367, 223, 621, 621,
+ /* 100 */ 98, 230, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
+ /* 110 */ 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166, 1166,
+ /* 120 */ 1166, 736, 494, 168, 52, 510, 510, 534, 131, 768,
+ /* 130 */ 398, 398, 566, 566, 566, 131, 436, 436, 436, 447,
+ /* 140 */ 276, 625, 625, 406, 305, 305, 651, 651, 447, 657,
+ /* 150 */ 780, 780, 780, 780, 780, 780, 780, 2748, 960, 205,
+ /* 160 */ 121, 293, 256, 372, 156, 498, 559, 66, 802, 450,
+ /* 170 */ 860, 822, 671, 881, 823, 671, 897, 749, 827, 967,
+ /* 180 */ 1169, 1044, 1188, 1217, 1188, 1088, 1225, 1225, 1188, 1088,
+ /* 190 */ 1088, 1163, 1225, 1225, 1225, 1250, 1250, 1256, 210, 276,
+ /* 200 */ 210, 1261, 1267, 210, 1261, 210, 210, 210, 1225, 210,
+ /* 210 */ 1251, 1251, 1250, 305, 305, 305, 305, 305, 305, 305,
+ /* 220 */ 305, 305, 305, 305, 1225, 1250, 651, 1122, 1256, 367,
+ /* 230 */ 1135, 276, 367, 1225, 1225, 1261, 367, 1092, 651, 651,
+ /* 240 */ 651, 651, 1092, 651, 1173, 367, 447, 367, 436, 1217,
+ /* 250 */ 1217, 651, 1097, 1092, 651, 651, 1097, 1092, 651, 651,
+ /* 260 */ 305, 1095, 1180, 1097, 1104, 1145, 1149, 967, 1134, 1141,
+ /* 270 */ 1147, 1164, 436, 1390, 1316, 1319, 651, 657, 1225, 367,
+ /* 280 */ 1382, 1250, 3135, 3135, 3135, 3135, 3135, 3135, 3135, 1085,
+ /* 290 */ 358, 23, 54, 183, 374, 688, 424, 638, 654, 549,
+ /* 300 */ 774, 774, 774, 774, 774, 774, 774, 774, 774, 584,
+ /* 310 */ 409, 307, 759, 782, 782, 226, 564, 14, 468, 393,
+ /* 320 */ 75, 329, 480, 75, 75, 75, 714, 643, 896, 978,
+ /* 330 */ 146, 36, 932, 946, 952, 958, 1046, 1087, 1090, 280,
+ /* 340 */ 901, 892, 926, 975, 1007, 1018, 1020, 1021, 963, 947,
+ /* 350 */ 986, 1098, 1022, 349, 1045, 1029, 1058, 1093, 1083, 1137,
+ /* 360 */ 1138, 1140, 1142, 1143, 1144, 1003, 1177, 1178, 1157, 1193,
+ /* 370 */ 1456, 1457, 1273, 1459, 1462, 1421, 1464, 1430, 1269, 1432,
+ /* 380 */ 1433, 1434, 1274, 1472, 1438, 1439, 1279, 1477, 1281, 1481,
+ /* 390 */ 1454, 1492, 1471, 1494, 1461, 1318, 1322, 1503, 1505, 1333,
+ /* 400 */ 1335, 1509, 1512, 1467, 1514, 1515, 1516, 1475, 1519, 1520,
+ /* 410 */ 1521, 1522, 1524, 1526, 1527, 1528, 1380, 1496, 1532, 1384,
+ /* 420 */ 1535, 1536, 1544, 1546, 1547, 1548, 1550, 1551, 1552, 1554,
+ /* 430 */ 1555, 1563, 1565, 1566, 1570, 1530, 1573, 1574, 1578, 1579,
+ /* 440 */ 1584, 1564, 1585, 1591, 1592, 1593, 1533, 1594, 1538, 1596,
+ /* 450 */ 1540, 1599, 1600, 1562, 1567, 1559, 1575, 1571, 1595, 1572,
+ /* 460 */ 1605, 1576, 1569, 1610, 1611, 1612, 1580, 1444, 1614, 1621,
+ /* 470 */ 1623, 1561, 1626, 1627, 1597, 1582, 1601, 1630, 1598, 1587,
+ /* 480 */ 1603, 1631, 1604, 1588, 1606, 1638, 1609, 1602, 1608, 1648,
+ /* 490 */ 1651, 1652, 1660, 1558, 1586, 1628, 1642, 1665, 1634, 1635,
+ /* 500 */ 1659, 1649, 1655, 1643, 1653, 1657, 1662, 1669, 1663, 1695,
+ /* 510 */ 1677, 1700, 1679, 1654, 1702, 1682, 1670, 1706, 1673, 1707,
+ /* 520 */ 1674, 1710, 1689, 1692, 1618, 1620, 1716, 1556, 1683, 1719,
+ /* 530 */ 1539, 1701, 1577, 1581, 1722, 1724, 1590, 1583, 1729, 1725,
+ /* 540 */ 1733, 1734, 1632, 1633, 1696, 1704, 1545, 1730, 1641, 1613,
+ /* 550 */ 1645, 1737, 1703, 1607, 1646, 1640, 1697, 1711, 1541, 1543,
+ /* 560 */ 1557, 1712, 1501, 1658, 1661, 1678, 1680, 1684, 1686, 1715,
+ /* 570 */ 1694, 1698, 1699, 1705, 1708, 1732, 1745, 1746, 1713, 1752,
+ /* 580 */ 1553, 1709, 1714, 1793, 1754, 1615, 1766, 1767, 1768, 1772,
+ /* 590 */ 1774, 1777, 1718, 1720, 1769, 1616, 1775, 1771, 1773, 1818,
+ /* 600 */ 1799, 1619, 1728, 1731, 1735, 1736, 1738, 1739, 1779, 1741,
+ /* 610 */ 1743, 1780, 1744, 1806, 1624, 1748, 1749, 1755, 1796, 1804,
+ /* 620 */ 1762, 1764, 1807, 1763, 1770, 1830, 1776, 1778, 1833, 1781,
+ /* 630 */ 1782, 1837, 1784, 1751, 1756, 1758, 1761, 1851, 1783, 1786,
+ /* 640 */ 1789, 1850, 1791, 1844, 1844, 1866, 1826, 1687, 1857, 1859,
+ /* 650 */ 1860, 1864, 1878, 1879, 1880, 1881, 1882, 1883, 1765, 1827,
+ /* 660 */ 1885, 1886, 1888, 1902, 1901, 1916, 1904, 1905, 1907, 1874,
+ /* 670 */ 1643, 1909, 1653, 1910, 1911, 1912, 1913, 1928, 1917, 1953,
+ /* 680 */ 1922, 1918, 1929, 1967, 1934, 1925, 1935, 1973, 1940, 1930,
+ /* 690 */ 1937, 1979, 1946, 1936, 1943, 1985, 1951, 1961, 1997, 1976,
+ /* 700 */ 1978, 1981, 1982, 1980, 1986,
};
-#define YY_REDUCE_COUNT (284)
-#define YY_REDUCE_MIN (-358)
-#define YY_REDUCE_MAX (2928)
+#define YY_REDUCE_COUNT (288)
+#define YY_REDUCE_MIN (-357)
+#define YY_REDUCE_MAX (2728)
static const short yy_reduce_ofst[] = {
- /* 0 */ -94, -292, 892, -230, 1003, 1029, 1141, 1208, -21, 1262,
- /* 10 */ 1316, 1369, 535, 1422, 1483, 205, -204, 1507, 264, 1569,
- /* 20 */ 1620, 1674, 1692, 1775, 1830, 1881, 1935, 1986, 2040, 2058,
- /* 30 */ 2141, 2196, 2247, 2301, 2352, 2406, 2424, 2507, 2562, 2613,
- /* 40 */ 2667, 2718, 2772, 2790, 2873, 2928, 946, 70, -276, 72,
- /* 50 */ 471, 512, 612, 614, 771, 776, -328, -252, 885, -348,
- /* 60 */ -325, -92, 343, -319, -214, -326, -321, -37, -305, -232,
- /* 70 */ 265, 293, 349, 359, 381, 498, 509, 520, -176, 551,
- /* 80 */ 555, 556, -358, 622, 840, -329, 910, 912, 147, -169,
- /* 90 */ 917, 217, 258, 306, 627, 177, -205, 88, 88, -302,
- /* 100 */ -224, -162, 106, 523, 525, 545, 549, 583, 599, 602,
- /* 110 */ 607, 621, 625, 634, 674, 678, 679, 742, 749, 802,
- /* 120 */ -350, -59, 159, -253, -89, -331, 220, 5, 186, 430,
- /* 130 */ -59, 303, 316, 504, 97, 216, 493, 342, 336, 454,
- /* 140 */ 544, 335, 689, -267, 613, 648, 754, 561, 121, 151,
- /* 150 */ 156, 277, 298, 421, 433, 460, 531, 566, 581, 547,
- /* 160 */ 603, 650, 710, 850, 850, 873, 908, 875, 853, 826,
- /* 170 */ 826, 831, 826, 861, 852, 850, 909, 916, 928, 961,
- /* 180 */ 964, 967, 1011, 1019, 968, 983, 984, 1021, 1032, 1043,
- /* 190 */ 1045, 1036, 1047, 990, 1042, 1013, 1048, 1005, 1004, 1051,
- /* 200 */ 1018, 1063, 1071, 1075, 1079, 1080, 1081, 1084, 1096, 1070,
- /* 210 */ 1072, 1082, 1083, 1089, 1090, 1091, 1094, 1095, 1098, 1099,
- /* 220 */ 1093, 1108, 1087, 1050, 1062, 1116, 1076, 1088, 1123, 1127,
- /* 230 */ 1128, 1086, 1126, 1100, 1101, 1102, 1103, 1104, 1105, 1106,
- /* 240 */ 1121, 1131, 1122, 1139, 1113, 1107, 1109, 1111, 1046, 1120,
- /* 250 */ 1114, 1132, 1049, 1124, 1133, 1138, 850, 1065, 1077, 1115,
- /* 260 */ 1117, 1119, 1125, 1129, 1064, 1069, 1118, 826, 1161, 1130,
- /* 270 */ 1137, 1169, 1163, 1181, 1196, 1194, 1207, 1210, 1152, 1166,
- /* 280 */ 1190, 1200, 1209, 1219, 1238,
+ /* 0 */ 116, -321, 363, 862, 675, 973, 1028, 1084, 1139, 1158,
+ /* 10 */ 1255, 1276, 1361, 1446, 1502, 1531, 1560, 1589, 1656, 1672,
+ /* 20 */ 1727, 1747, 1812, 1870, 1884, 1942, 1956, 2009, 2064, 2080,
+ /* 30 */ 2135, 2151, 2207, 2223, 2279, 2295, 2362, 2387, 2448, 2501,
+ /* 40 */ 2519, 2575, 2589, 2645, 2661, 2728, -323, -334, 171, -275,
+ /* 50 */ -155, 2, 123, 134, 698, 868, -335, 560, -130, 233,
+ /* 60 */ 327, -133, -1, -322, 473, -347, -326, -312, -357, -319,
+ /* 70 */ -188, 215, 356, 364, 470, 481, 488, 502, 578, -110,
+ /* 80 */ 583, 598, 604, -99, 619, 631, -277, 687, 693, -166,
+ /* 90 */ 102, 709, 58, -85, 105, 729, -291, -211, -302, -302,
+ /* 100 */ -296, 11, -204, -42, 178, 203, 224, 266, 279, 300,
+ /* 110 */ 319, 434, 437, 456, 463, 577, 588, 600, 608, 610,
+ /* 120 */ 611, 42, 108, 195, -121, -298, 70, 106, 122, 309,
+ /* 130 */ 142, 397, 108, 274, 411, 310, -356, 400, 446, 427,
+ /* 140 */ 539, 465, 536, 568, 555, 337, 606, 620, 639, 587,
+ /* 150 */ -310, 641, 752, 753, 754, 757, 758, 591, 783, 803,
+ /* 160 */ 740, 673, 738, 863, 760, 847, 847, 871, 828, 875,
+ /* 170 */ 841, 831, 781, 781, 764, 781, 791, 786, 847, 830,
+ /* 180 */ 829, 839, 859, 867, 872, 873, 917, 918, 878, 882,
+ /* 190 */ 885, 914, 928, 929, 939, 948, 953, 889, 949, 915,
+ /* 200 */ 950, 904, 910, 961, 906, 962, 964, 965, 968, 966,
+ /* 210 */ 971, 972, 981, 954, 955, 956, 957, 959, 969, 970,
+ /* 220 */ 974, 976, 980, 983, 982, 989, 945, 925, 927, 984,
+ /* 230 */ 931, 987, 990, 994, 997, 938, 1004, 985, 977, 988,
+ /* 240 */ 991, 1000, 1005, 1001, 1002, 1006, 995, 1012, 1025, 992,
+ /* 250 */ 1014, 1016, 979, 1009, 1017, 1027, 999, 1019, 1031, 1033,
+ /* 260 */ 847, 911, 1011, 1008, 1010, 993, 1023, 1015, 951, 1013,
+ /* 270 */ 1024, 781, 1049, 1038, 996, 1059, 1051, 1075, 1091, 1089,
+ /* 280 */ 1099, 1096, 1052, 1056, 1094, 1102, 1106, 1116, 1133,
};
static const YYACTIONTYPE yy_default[] = {
- /* 0 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 10 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 20 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 30 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 40 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 50 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 60 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 70 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1640, 1564,
- /* 80 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 90 */ 1564, 1564, 1564, 1564, 1564, 1638, 1810, 1999, 1564, 1564,
- /* 100 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 110 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 120 */ 1564, 2011, 1564, 1564, 1564, 1640, 1564, 1638, 1971, 1971,
- /* 130 */ 2011, 2011, 2011, 1564, 1564, 1564, 1564, 1749, 1564, 1851,
- /* 140 */ 1851, 1564, 1564, 1564, 1564, 1564, 1749, 1564, 1564, 1564,
- /* 150 */ 1564, 1564, 1564, 1564, 1564, 1845, 1564, 1564, 2036, 2089,
- /* 160 */ 1564, 1564, 2039, 1564, 1564, 1564, 1564, 1702, 2026, 2003,
- /* 170 */ 2017, 2073, 2004, 2001, 2020, 1564, 2030, 1564, 1838, 1815,
- /* 180 */ 1815, 1812, 1564, 1564, 1815, 1812, 1812, 1693, 1564, 1564,
- /* 190 */ 1564, 1564, 1564, 1564, 1640, 1564, 1640, 1564, 1564, 1640,
- /* 200 */ 1564, 1640, 1640, 1640, 1564, 1640, 1619, 1619, 1564, 1564,
- /* 210 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 220 */ 1564, 1564, 1564, 1858, 1564, 1638, 1847, 1564, 1638, 1564,
- /* 230 */ 1564, 1564, 1638, 2044, 1564, 1564, 1564, 1564, 2044, 1564,
- /* 240 */ 1564, 1638, 1564, 1638, 1564, 1564, 1564, 1564, 2046, 2044,
- /* 250 */ 1564, 1564, 2046, 2044, 1564, 1564, 1564, 2058, 2054, 2046,
- /* 260 */ 2062, 2060, 2032, 2030, 2092, 2079, 2075, 2017, 1564, 1564,
- /* 270 */ 1564, 1718, 1564, 1564, 1564, 1638, 1596, 1564, 1840, 1851,
- /* 280 */ 1752, 1752, 1752, 1641, 1569, 1564, 1564, 1564, 1564, 1564,
- /* 290 */ 1564, 1564, 1564, 1564, 1564, 1564, 1927, 1564, 2057, 2056,
- /* 300 */ 1975, 1974, 1973, 1964, 1926, 1564, 1714, 1564, 1564, 1925,
- /* 310 */ 1924, 1564, 1564, 1564, 1564, 1564, 1918, 1564, 1564, 1919,
- /* 320 */ 1917, 1916, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 330 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 340 */ 1564, 1564, 1564, 1564, 2076, 2080, 2000, 1564, 1564, 1564,
- /* 350 */ 1564, 1564, 1909, 1900, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 360 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 370 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 380 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 390 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 400 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 410 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 420 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 430 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 440 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 450 */ 1564, 1601, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 460 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 470 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 480 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 490 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1680,
- /* 500 */ 1679, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 510 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 520 */ 1908, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 530 */ 1564, 1564, 1564, 1564, 2072, 1564, 1564, 1564, 1564, 1564,
- /* 540 */ 1564, 1564, 1564, 1855, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 550 */ 1564, 1564, 1564, 1961, 1564, 1564, 1564, 2033, 1564, 1564,
- /* 560 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 570 */ 1564, 1564, 1564, 1900, 1564, 2055, 1564, 1564, 2070, 1564,
- /* 580 */ 2074, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 2010, 2006,
- /* 590 */ 1564, 1564, 2002, 1899, 1564, 1995, 1564, 1564, 1946, 1564,
- /* 600 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1908, 1564,
- /* 610 */ 1912, 1564, 1564, 1564, 1564, 1564, 1746, 1564, 1564, 1564,
- /* 620 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1731,
- /* 630 */ 1729, 1728, 1727, 1564, 1724, 1564, 1564, 1564, 1564, 1755,
- /* 640 */ 1754, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 650 */ 1564, 1564, 1564, 1564, 1564, 1564, 1660, 1564, 1564, 1564,
- /* 660 */ 1564, 1564, 1564, 1564, 1564, 1564, 1651, 1564, 1650, 1564,
- /* 670 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 680 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 690 */ 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564, 1564,
- /* 700 */ 1564,
+ /* 0 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 10 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 20 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 30 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 40 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 50 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 60 */ 1582, 1582, 1582, 1582, 1582, 1835, 1582, 1582, 1582, 1582,
+ /* 70 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1658,
+ /* 80 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 90 */ 1582, 1582, 1582, 1582, 1582, 1582, 1656, 1828, 2025, 1582,
+ /* 100 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 110 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 120 */ 1582, 1582, 2037, 1582, 1582, 1582, 1582, 1658, 1582, 1656,
+ /* 130 */ 1997, 1997, 2037, 2037, 2037, 1582, 1582, 1582, 1582, 1767,
+ /* 140 */ 1582, 1877, 1877, 1582, 1582, 1582, 1582, 1582, 1767, 1582,
+ /* 150 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1871, 1582, 1582,
+ /* 160 */ 2062, 2115, 1582, 1582, 2065, 1582, 1582, 1582, 1840, 1582,
+ /* 170 */ 1720, 2052, 2029, 2043, 2099, 2030, 2027, 2046, 1582, 2056,
+ /* 180 */ 1582, 1864, 1833, 1582, 1833, 1830, 1582, 1582, 1833, 1830,
+ /* 190 */ 1830, 1711, 1582, 1582, 1582, 1582, 1582, 1582, 1658, 1582,
+ /* 200 */ 1658, 1582, 1582, 1658, 1582, 1658, 1658, 1658, 1582, 1658,
+ /* 210 */ 1637, 1637, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 220 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1884, 1582, 1656,
+ /* 230 */ 1873, 1582, 1656, 1582, 1582, 1582, 1656, 2070, 1582, 1582,
+ /* 240 */ 1582, 1582, 2070, 1582, 1582, 1656, 1582, 1656, 1582, 1582,
+ /* 250 */ 1582, 1582, 2072, 2070, 1582, 1582, 2072, 2070, 1582, 1582,
+ /* 260 */ 1582, 2084, 2080, 2072, 2088, 2086, 2058, 2056, 2118, 2105,
+ /* 270 */ 2101, 2043, 1582, 1582, 1582, 1736, 1582, 1582, 1582, 1656,
+ /* 280 */ 1614, 1582, 1866, 1877, 1770, 1770, 1770, 1659, 1587, 1582,
+ /* 290 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 300 */ 1953, 1582, 2083, 2082, 2001, 2000, 1999, 1990, 1952, 1582,
+ /* 310 */ 1732, 1582, 1582, 1951, 1950, 1582, 1582, 1582, 1582, 1582,
+ /* 320 */ 1944, 1582, 1582, 1945, 1943, 1942, 1582, 1582, 1582, 1582,
+ /* 330 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 340 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 2102,
+ /* 350 */ 2106, 2026, 1582, 1582, 1582, 1582, 1582, 1935, 1926, 1582,
+ /* 360 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 370 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 380 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 390 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 400 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 410 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 420 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 430 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 440 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 450 */ 1582, 1582, 1582, 1582, 1582, 1619, 1582, 1582, 1582, 1582,
+ /* 460 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 470 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 480 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 490 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 500 */ 1582, 1582, 1582, 1698, 1697, 1582, 1582, 1582, 1582, 1582,
+ /* 510 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 520 */ 1582, 1582, 1582, 1582, 1934, 1582, 1582, 1582, 1582, 1582,
+ /* 530 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 2098, 1582,
+ /* 540 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1881, 1582, 1582,
+ /* 550 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1987, 1582, 1582,
+ /* 560 */ 1582, 2059, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 570 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1926, 1582, 2081,
+ /* 580 */ 1582, 1582, 2096, 1582, 2100, 1582, 1582, 1582, 1582, 1582,
+ /* 590 */ 1582, 1582, 2036, 2032, 1582, 1582, 2028, 1925, 1582, 2021,
+ /* 600 */ 1582, 1582, 1972, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 610 */ 1582, 1582, 1934, 1582, 1938, 1582, 1582, 1582, 1582, 1582,
+ /* 620 */ 1764, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 630 */ 1582, 1582, 1582, 1749, 1747, 1746, 1745, 1582, 1742, 1582,
+ /* 640 */ 1582, 1582, 1582, 1773, 1772, 1582, 1582, 1582, 1582, 1582,
+ /* 650 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 660 */ 1678, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 670 */ 1669, 1582, 1668, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 680 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 690 */ 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582, 1582,
+ /* 700 */ 1582, 1582, 1582, 1582, 1582,
};
/********** End of lemon-generated parsing tables *****************************/
@@ -1249,11 +1209,13 @@ static const YYCODETYPE yyFallback[] = {
0, /* SUBSCRIPTIONS => nothing */
0, /* VNODES => nothing */
0, /* LIKE => nothing */
+ 0, /* TBNAME => nothing */
+ 0, /* QTAGS => nothing */
+ 0, /* AS => nothing */
0, /* INDEX => nothing */
0, /* FUNCTION => nothing */
0, /* INTERVAL => nothing */
0, /* TOPIC => nothing */
- 0, /* AS => nothing */
0, /* WITH => nothing */
0, /* META => nothing */
0, /* CONSUMER => nothing */
@@ -1295,7 +1257,6 @@ static const YYCODETYPE yyFallback[] = {
0, /* NK_QUESTION => nothing */
0, /* NK_ARROW => nothing */
0, /* ROWTS => nothing */
- 0, /* TBNAME => nothing */
0, /* QSTART => nothing */
0, /* QEND => nothing */
0, /* QDURATION => nothing */
@@ -1303,7 +1264,6 @@ static const YYCODETYPE yyFallback[] = {
0, /* WEND => nothing */
0, /* WDURATION => nothing */
0, /* IROWTS => nothing */
- 0, /* QTAGS => nothing */
0, /* CAST => nothing */
0, /* NOW => nothing */
0, /* TODAY => nothing */
@@ -1655,61 +1615,61 @@ static const char *const yyTokenName[] = {
/* 156 */ "SUBSCRIPTIONS",
/* 157 */ "VNODES",
/* 158 */ "LIKE",
- /* 159 */ "INDEX",
- /* 160 */ "FUNCTION",
- /* 161 */ "INTERVAL",
- /* 162 */ "TOPIC",
- /* 163 */ "AS",
- /* 164 */ "WITH",
- /* 165 */ "META",
- /* 166 */ "CONSUMER",
- /* 167 */ "GROUP",
- /* 168 */ "DESC",
- /* 169 */ "DESCRIBE",
- /* 170 */ "RESET",
- /* 171 */ "QUERY",
- /* 172 */ "CACHE",
- /* 173 */ "EXPLAIN",
- /* 174 */ "ANALYZE",
- /* 175 */ "VERBOSE",
- /* 176 */ "NK_BOOL",
- /* 177 */ "RATIO",
- /* 178 */ "NK_FLOAT",
- /* 179 */ "OUTPUTTYPE",
- /* 180 */ "AGGREGATE",
- /* 181 */ "BUFSIZE",
- /* 182 */ "STREAM",
- /* 183 */ "INTO",
- /* 184 */ "TRIGGER",
- /* 185 */ "AT_ONCE",
- /* 186 */ "WINDOW_CLOSE",
- /* 187 */ "IGNORE",
- /* 188 */ "EXPIRED",
- /* 189 */ "FILL_HISTORY",
- /* 190 */ "SUBTABLE",
- /* 191 */ "KILL",
- /* 192 */ "CONNECTION",
- /* 193 */ "TRANSACTION",
- /* 194 */ "BALANCE",
- /* 195 */ "VGROUP",
- /* 196 */ "MERGE",
- /* 197 */ "REDISTRIBUTE",
- /* 198 */ "SPLIT",
- /* 199 */ "DELETE",
- /* 200 */ "INSERT",
- /* 201 */ "NULL",
- /* 202 */ "NK_QUESTION",
- /* 203 */ "NK_ARROW",
- /* 204 */ "ROWTS",
- /* 205 */ "TBNAME",
- /* 206 */ "QSTART",
- /* 207 */ "QEND",
- /* 208 */ "QDURATION",
- /* 209 */ "WSTART",
- /* 210 */ "WEND",
- /* 211 */ "WDURATION",
- /* 212 */ "IROWTS",
- /* 213 */ "QTAGS",
+ /* 159 */ "TBNAME",
+ /* 160 */ "QTAGS",
+ /* 161 */ "AS",
+ /* 162 */ "INDEX",
+ /* 163 */ "FUNCTION",
+ /* 164 */ "INTERVAL",
+ /* 165 */ "TOPIC",
+ /* 166 */ "WITH",
+ /* 167 */ "META",
+ /* 168 */ "CONSUMER",
+ /* 169 */ "GROUP",
+ /* 170 */ "DESC",
+ /* 171 */ "DESCRIBE",
+ /* 172 */ "RESET",
+ /* 173 */ "QUERY",
+ /* 174 */ "CACHE",
+ /* 175 */ "EXPLAIN",
+ /* 176 */ "ANALYZE",
+ /* 177 */ "VERBOSE",
+ /* 178 */ "NK_BOOL",
+ /* 179 */ "RATIO",
+ /* 180 */ "NK_FLOAT",
+ /* 181 */ "OUTPUTTYPE",
+ /* 182 */ "AGGREGATE",
+ /* 183 */ "BUFSIZE",
+ /* 184 */ "STREAM",
+ /* 185 */ "INTO",
+ /* 186 */ "TRIGGER",
+ /* 187 */ "AT_ONCE",
+ /* 188 */ "WINDOW_CLOSE",
+ /* 189 */ "IGNORE",
+ /* 190 */ "EXPIRED",
+ /* 191 */ "FILL_HISTORY",
+ /* 192 */ "SUBTABLE",
+ /* 193 */ "KILL",
+ /* 194 */ "CONNECTION",
+ /* 195 */ "TRANSACTION",
+ /* 196 */ "BALANCE",
+ /* 197 */ "VGROUP",
+ /* 198 */ "MERGE",
+ /* 199 */ "REDISTRIBUTE",
+ /* 200 */ "SPLIT",
+ /* 201 */ "DELETE",
+ /* 202 */ "INSERT",
+ /* 203 */ "NULL",
+ /* 204 */ "NK_QUESTION",
+ /* 205 */ "NK_ARROW",
+ /* 206 */ "ROWTS",
+ /* 207 */ "QSTART",
+ /* 208 */ "QEND",
+ /* 209 */ "QDURATION",
+ /* 210 */ "WSTART",
+ /* 211 */ "WEND",
+ /* 212 */ "WDURATION",
+ /* 213 */ "IROWTS",
/* 214 */ "CAST",
/* 215 */ "NOW",
/* 216 */ "TODAY",
@@ -1869,85 +1829,87 @@ static const char *const yyTokenName[] = {
/* 370 */ "like_pattern_opt",
/* 371 */ "table_name_cond",
/* 372 */ "from_db_opt",
- /* 373 */ "index_options",
- /* 374 */ "func_list",
- /* 375 */ "sliding_opt",
- /* 376 */ "sma_stream_opt",
- /* 377 */ "func",
- /* 378 */ "stream_options",
- /* 379 */ "topic_name",
- /* 380 */ "query_or_subquery",
- /* 381 */ "cgroup_name",
- /* 382 */ "analyze_opt",
- /* 383 */ "explain_options",
- /* 384 */ "agg_func_opt",
- /* 385 */ "bufsize_opt",
- /* 386 */ "stream_name",
- /* 387 */ "subtable_opt",
- /* 388 */ "expression",
- /* 389 */ "dnode_list",
- /* 390 */ "where_clause_opt",
- /* 391 */ "signed",
- /* 392 */ "literal_func",
- /* 393 */ "literal_list",
- /* 394 */ "table_alias",
- /* 395 */ "column_alias",
- /* 396 */ "expr_or_subquery",
- /* 397 */ "subquery",
- /* 398 */ "pseudo_column",
- /* 399 */ "column_reference",
- /* 400 */ "function_expression",
- /* 401 */ "case_when_expression",
- /* 402 */ "star_func",
- /* 403 */ "star_func_para_list",
- /* 404 */ "noarg_func",
- /* 405 */ "other_para_list",
- /* 406 */ "star_func_para",
- /* 407 */ "when_then_list",
- /* 408 */ "case_when_else_opt",
- /* 409 */ "common_expression",
- /* 410 */ "when_then_expr",
- /* 411 */ "predicate",
- /* 412 */ "compare_op",
- /* 413 */ "in_op",
- /* 414 */ "in_predicate_value",
- /* 415 */ "boolean_value_expression",
- /* 416 */ "boolean_primary",
- /* 417 */ "from_clause_opt",
- /* 418 */ "table_reference_list",
- /* 419 */ "table_reference",
- /* 420 */ "table_primary",
- /* 421 */ "joined_table",
- /* 422 */ "alias_opt",
- /* 423 */ "parenthesized_joined_table",
- /* 424 */ "join_type",
- /* 425 */ "search_condition",
- /* 426 */ "query_specification",
- /* 427 */ "set_quantifier_opt",
- /* 428 */ "select_list",
- /* 429 */ "partition_by_clause_opt",
- /* 430 */ "range_opt",
- /* 431 */ "every_opt",
- /* 432 */ "fill_opt",
- /* 433 */ "twindow_clause_opt",
- /* 434 */ "group_by_clause_opt",
- /* 435 */ "having_clause_opt",
- /* 436 */ "select_item",
- /* 437 */ "partition_list",
- /* 438 */ "partition_item",
- /* 439 */ "fill_mode",
- /* 440 */ "group_by_list",
- /* 441 */ "query_expression",
- /* 442 */ "query_simple",
- /* 443 */ "order_by_clause_opt",
- /* 444 */ "slimit_clause_opt",
- /* 445 */ "limit_clause_opt",
- /* 446 */ "union_query_expression",
- /* 447 */ "query_simple_or_subquery",
- /* 448 */ "sort_specification_list",
- /* 449 */ "sort_specification",
- /* 450 */ "ordering_specification_opt",
- /* 451 */ "null_ordering_opt",
+ /* 373 */ "tag_list_opt",
+ /* 374 */ "tag_item",
+ /* 375 */ "column_alias",
+ /* 376 */ "index_options",
+ /* 377 */ "func_list",
+ /* 378 */ "sliding_opt",
+ /* 379 */ "sma_stream_opt",
+ /* 380 */ "func",
+ /* 381 */ "stream_options",
+ /* 382 */ "topic_name",
+ /* 383 */ "query_or_subquery",
+ /* 384 */ "cgroup_name",
+ /* 385 */ "analyze_opt",
+ /* 386 */ "explain_options",
+ /* 387 */ "agg_func_opt",
+ /* 388 */ "bufsize_opt",
+ /* 389 */ "stream_name",
+ /* 390 */ "subtable_opt",
+ /* 391 */ "expression",
+ /* 392 */ "dnode_list",
+ /* 393 */ "where_clause_opt",
+ /* 394 */ "signed",
+ /* 395 */ "literal_func",
+ /* 396 */ "literal_list",
+ /* 397 */ "table_alias",
+ /* 398 */ "expr_or_subquery",
+ /* 399 */ "subquery",
+ /* 400 */ "pseudo_column",
+ /* 401 */ "column_reference",
+ /* 402 */ "function_expression",
+ /* 403 */ "case_when_expression",
+ /* 404 */ "star_func",
+ /* 405 */ "star_func_para_list",
+ /* 406 */ "noarg_func",
+ /* 407 */ "other_para_list",
+ /* 408 */ "star_func_para",
+ /* 409 */ "when_then_list",
+ /* 410 */ "case_when_else_opt",
+ /* 411 */ "common_expression",
+ /* 412 */ "when_then_expr",
+ /* 413 */ "predicate",
+ /* 414 */ "compare_op",
+ /* 415 */ "in_op",
+ /* 416 */ "in_predicate_value",
+ /* 417 */ "boolean_value_expression",
+ /* 418 */ "boolean_primary",
+ /* 419 */ "from_clause_opt",
+ /* 420 */ "table_reference_list",
+ /* 421 */ "table_reference",
+ /* 422 */ "table_primary",
+ /* 423 */ "joined_table",
+ /* 424 */ "alias_opt",
+ /* 425 */ "parenthesized_joined_table",
+ /* 426 */ "join_type",
+ /* 427 */ "search_condition",
+ /* 428 */ "query_specification",
+ /* 429 */ "set_quantifier_opt",
+ /* 430 */ "select_list",
+ /* 431 */ "partition_by_clause_opt",
+ /* 432 */ "range_opt",
+ /* 433 */ "every_opt",
+ /* 434 */ "fill_opt",
+ /* 435 */ "twindow_clause_opt",
+ /* 436 */ "group_by_clause_opt",
+ /* 437 */ "having_clause_opt",
+ /* 438 */ "select_item",
+ /* 439 */ "partition_list",
+ /* 440 */ "partition_item",
+ /* 441 */ "fill_mode",
+ /* 442 */ "group_by_list",
+ /* 443 */ "query_expression",
+ /* 444 */ "query_simple",
+ /* 445 */ "order_by_clause_opt",
+ /* 446 */ "slimit_clause_opt",
+ /* 447 */ "limit_clause_opt",
+ /* 448 */ "union_query_expression",
+ /* 449 */ "query_simple_or_subquery",
+ /* 450 */ "sort_specification_list",
+ /* 451 */ "sort_specification",
+ /* 452 */ "ordering_specification_opt",
+ /* 453 */ "null_ordering_opt",
};
#endif /* defined(YYCOVERAGE) || !defined(NDEBUG) */
@@ -2195,7 +2157,7 @@ static const char *const yyRuleName[] = {
/* 237 */ "cmd ::= SHOW CONSUMERS",
/* 238 */ "cmd ::= SHOW SUBSCRIPTIONS",
/* 239 */ "cmd ::= SHOW TAGS FROM table_name_cond from_db_opt",
- /* 240 */ "cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt",
+ /* 240 */ "cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt",
/* 241 */ "cmd ::= SHOW VNODES NK_INTEGER",
/* 242 */ "cmd ::= SHOW VNODES NK_STRING",
/* 243 */ "db_name_cond_opt ::=",
@@ -2205,284 +2167,292 @@ static const char *const yyRuleName[] = {
/* 247 */ "table_name_cond ::= table_name",
/* 248 */ "from_db_opt ::=",
/* 249 */ "from_db_opt ::= FROM db_name",
- /* 250 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options",
- /* 251 */ "cmd ::= DROP INDEX exists_opt full_table_name",
- /* 252 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt",
- /* 253 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt",
- /* 254 */ "func_list ::= func",
- /* 255 */ "func_list ::= func_list NK_COMMA func",
- /* 256 */ "func ::= function_name NK_LP expression_list NK_RP",
- /* 257 */ "sma_stream_opt ::=",
- /* 258 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal",
- /* 259 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal",
- /* 260 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery",
- /* 261 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name",
- /* 262 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name",
- /* 263 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name",
- /* 264 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name",
- /* 265 */ "cmd ::= DROP TOPIC exists_opt topic_name",
- /* 266 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name",
- /* 267 */ "cmd ::= DESC full_table_name",
- /* 268 */ "cmd ::= DESCRIBE full_table_name",
- /* 269 */ "cmd ::= RESET QUERY CACHE",
- /* 270 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery",
- /* 271 */ "analyze_opt ::=",
- /* 272 */ "analyze_opt ::= ANALYZE",
- /* 273 */ "explain_options ::=",
- /* 274 */ "explain_options ::= explain_options VERBOSE NK_BOOL",
- /* 275 */ "explain_options ::= explain_options RATIO NK_FLOAT",
- /* 276 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt",
- /* 277 */ "cmd ::= DROP FUNCTION exists_opt function_name",
- /* 278 */ "agg_func_opt ::=",
- /* 279 */ "agg_func_opt ::= AGGREGATE",
- /* 280 */ "bufsize_opt ::=",
- /* 281 */ "bufsize_opt ::= BUFSIZE NK_INTEGER",
- /* 282 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery",
- /* 283 */ "cmd ::= DROP STREAM exists_opt stream_name",
- /* 284 */ "stream_options ::=",
- /* 285 */ "stream_options ::= stream_options TRIGGER AT_ONCE",
- /* 286 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE",
- /* 287 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal",
- /* 288 */ "stream_options ::= stream_options WATERMARK duration_literal",
- /* 289 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER",
- /* 290 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER",
- /* 291 */ "subtable_opt ::=",
- /* 292 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP",
- /* 293 */ "cmd ::= KILL CONNECTION NK_INTEGER",
- /* 294 */ "cmd ::= KILL QUERY NK_STRING",
- /* 295 */ "cmd ::= KILL TRANSACTION NK_INTEGER",
- /* 296 */ "cmd ::= BALANCE VGROUP",
- /* 297 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER",
- /* 298 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list",
- /* 299 */ "cmd ::= SPLIT VGROUP NK_INTEGER",
- /* 300 */ "dnode_list ::= DNODE NK_INTEGER",
- /* 301 */ "dnode_list ::= dnode_list DNODE NK_INTEGER",
- /* 302 */ "cmd ::= DELETE FROM full_table_name where_clause_opt",
- /* 303 */ "cmd ::= query_or_subquery",
- /* 304 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery",
- /* 305 */ "cmd ::= INSERT INTO full_table_name query_or_subquery",
- /* 306 */ "literal ::= NK_INTEGER",
- /* 307 */ "literal ::= NK_FLOAT",
- /* 308 */ "literal ::= NK_STRING",
- /* 309 */ "literal ::= NK_BOOL",
- /* 310 */ "literal ::= TIMESTAMP NK_STRING",
- /* 311 */ "literal ::= duration_literal",
- /* 312 */ "literal ::= NULL",
- /* 313 */ "literal ::= NK_QUESTION",
- /* 314 */ "duration_literal ::= NK_VARIABLE",
- /* 315 */ "signed ::= NK_INTEGER",
- /* 316 */ "signed ::= NK_PLUS NK_INTEGER",
- /* 317 */ "signed ::= NK_MINUS NK_INTEGER",
- /* 318 */ "signed ::= NK_FLOAT",
- /* 319 */ "signed ::= NK_PLUS NK_FLOAT",
- /* 320 */ "signed ::= NK_MINUS NK_FLOAT",
- /* 321 */ "signed_literal ::= signed",
- /* 322 */ "signed_literal ::= NK_STRING",
- /* 323 */ "signed_literal ::= NK_BOOL",
- /* 324 */ "signed_literal ::= TIMESTAMP NK_STRING",
- /* 325 */ "signed_literal ::= duration_literal",
- /* 326 */ "signed_literal ::= NULL",
- /* 327 */ "signed_literal ::= literal_func",
- /* 328 */ "signed_literal ::= NK_QUESTION",
- /* 329 */ "literal_list ::= signed_literal",
- /* 330 */ "literal_list ::= literal_list NK_COMMA signed_literal",
- /* 331 */ "db_name ::= NK_ID",
- /* 332 */ "table_name ::= NK_ID",
- /* 333 */ "column_name ::= NK_ID",
- /* 334 */ "function_name ::= NK_ID",
- /* 335 */ "table_alias ::= NK_ID",
- /* 336 */ "column_alias ::= NK_ID",
- /* 337 */ "user_name ::= NK_ID",
- /* 338 */ "topic_name ::= NK_ID",
- /* 339 */ "stream_name ::= NK_ID",
- /* 340 */ "cgroup_name ::= NK_ID",
- /* 341 */ "expr_or_subquery ::= expression",
- /* 342 */ "expr_or_subquery ::= subquery",
- /* 343 */ "expression ::= literal",
- /* 344 */ "expression ::= pseudo_column",
- /* 345 */ "expression ::= column_reference",
- /* 346 */ "expression ::= function_expression",
- /* 347 */ "expression ::= case_when_expression",
- /* 348 */ "expression ::= NK_LP expression NK_RP",
- /* 349 */ "expression ::= NK_PLUS expr_or_subquery",
- /* 350 */ "expression ::= NK_MINUS expr_or_subquery",
- /* 351 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery",
- /* 352 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery",
- /* 353 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery",
- /* 354 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery",
- /* 355 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery",
- /* 356 */ "expression ::= column_reference NK_ARROW NK_STRING",
- /* 357 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery",
- /* 358 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery",
- /* 359 */ "expression_list ::= expr_or_subquery",
- /* 360 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery",
- /* 361 */ "column_reference ::= column_name",
- /* 362 */ "column_reference ::= table_name NK_DOT column_name",
- /* 363 */ "pseudo_column ::= ROWTS",
- /* 364 */ "pseudo_column ::= TBNAME",
- /* 365 */ "pseudo_column ::= table_name NK_DOT TBNAME",
- /* 366 */ "pseudo_column ::= QSTART",
- /* 367 */ "pseudo_column ::= QEND",
- /* 368 */ "pseudo_column ::= QDURATION",
- /* 369 */ "pseudo_column ::= WSTART",
- /* 370 */ "pseudo_column ::= WEND",
- /* 371 */ "pseudo_column ::= WDURATION",
- /* 372 */ "pseudo_column ::= IROWTS",
- /* 373 */ "pseudo_column ::= QTAGS",
- /* 374 */ "function_expression ::= function_name NK_LP expression_list NK_RP",
- /* 375 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP",
- /* 376 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP",
- /* 377 */ "function_expression ::= literal_func",
- /* 378 */ "literal_func ::= noarg_func NK_LP NK_RP",
- /* 379 */ "literal_func ::= NOW",
- /* 380 */ "noarg_func ::= NOW",
- /* 381 */ "noarg_func ::= TODAY",
- /* 382 */ "noarg_func ::= TIMEZONE",
- /* 383 */ "noarg_func ::= DATABASE",
- /* 384 */ "noarg_func ::= CLIENT_VERSION",
- /* 385 */ "noarg_func ::= SERVER_VERSION",
- /* 386 */ "noarg_func ::= SERVER_STATUS",
- /* 387 */ "noarg_func ::= CURRENT_USER",
- /* 388 */ "noarg_func ::= USER",
- /* 389 */ "star_func ::= COUNT",
- /* 390 */ "star_func ::= FIRST",
- /* 391 */ "star_func ::= LAST",
- /* 392 */ "star_func ::= LAST_ROW",
- /* 393 */ "star_func_para_list ::= NK_STAR",
- /* 394 */ "star_func_para_list ::= other_para_list",
- /* 395 */ "other_para_list ::= star_func_para",
- /* 396 */ "other_para_list ::= other_para_list NK_COMMA star_func_para",
- /* 397 */ "star_func_para ::= expr_or_subquery",
- /* 398 */ "star_func_para ::= table_name NK_DOT NK_STAR",
- /* 399 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END",
- /* 400 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END",
- /* 401 */ "when_then_list ::= when_then_expr",
- /* 402 */ "when_then_list ::= when_then_list when_then_expr",
- /* 403 */ "when_then_expr ::= WHEN common_expression THEN common_expression",
- /* 404 */ "case_when_else_opt ::=",
- /* 405 */ "case_when_else_opt ::= ELSE common_expression",
- /* 406 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery",
- /* 407 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery",
- /* 408 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery",
- /* 409 */ "predicate ::= expr_or_subquery IS NULL",
- /* 410 */ "predicate ::= expr_or_subquery IS NOT NULL",
- /* 411 */ "predicate ::= expr_or_subquery in_op in_predicate_value",
- /* 412 */ "compare_op ::= NK_LT",
- /* 413 */ "compare_op ::= NK_GT",
- /* 414 */ "compare_op ::= NK_LE",
- /* 415 */ "compare_op ::= NK_GE",
- /* 416 */ "compare_op ::= NK_NE",
- /* 417 */ "compare_op ::= NK_EQ",
- /* 418 */ "compare_op ::= LIKE",
- /* 419 */ "compare_op ::= NOT LIKE",
- /* 420 */ "compare_op ::= MATCH",
- /* 421 */ "compare_op ::= NMATCH",
- /* 422 */ "compare_op ::= CONTAINS",
- /* 423 */ "in_op ::= IN",
- /* 424 */ "in_op ::= NOT IN",
- /* 425 */ "in_predicate_value ::= NK_LP literal_list NK_RP",
- /* 426 */ "boolean_value_expression ::= boolean_primary",
- /* 427 */ "boolean_value_expression ::= NOT boolean_primary",
- /* 428 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression",
- /* 429 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression",
- /* 430 */ "boolean_primary ::= predicate",
- /* 431 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP",
- /* 432 */ "common_expression ::= expr_or_subquery",
- /* 433 */ "common_expression ::= boolean_value_expression",
- /* 434 */ "from_clause_opt ::=",
- /* 435 */ "from_clause_opt ::= FROM table_reference_list",
- /* 436 */ "table_reference_list ::= table_reference",
- /* 437 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference",
- /* 438 */ "table_reference ::= table_primary",
- /* 439 */ "table_reference ::= joined_table",
- /* 440 */ "table_primary ::= table_name alias_opt",
- /* 441 */ "table_primary ::= db_name NK_DOT table_name alias_opt",
- /* 442 */ "table_primary ::= subquery alias_opt",
- /* 443 */ "table_primary ::= parenthesized_joined_table",
- /* 444 */ "alias_opt ::=",
- /* 445 */ "alias_opt ::= table_alias",
- /* 446 */ "alias_opt ::= AS table_alias",
- /* 447 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP",
- /* 448 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP",
- /* 449 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition",
- /* 450 */ "join_type ::=",
- /* 451 */ "join_type ::= INNER",
- /* 452 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt",
- /* 453 */ "set_quantifier_opt ::=",
- /* 454 */ "set_quantifier_opt ::= DISTINCT",
- /* 455 */ "set_quantifier_opt ::= ALL",
- /* 456 */ "select_list ::= select_item",
- /* 457 */ "select_list ::= select_list NK_COMMA select_item",
- /* 458 */ "select_item ::= NK_STAR",
- /* 459 */ "select_item ::= common_expression",
- /* 460 */ "select_item ::= common_expression column_alias",
- /* 461 */ "select_item ::= common_expression AS column_alias",
- /* 462 */ "select_item ::= table_name NK_DOT NK_STAR",
- /* 463 */ "where_clause_opt ::=",
- /* 464 */ "where_clause_opt ::= WHERE search_condition",
- /* 465 */ "partition_by_clause_opt ::=",
- /* 466 */ "partition_by_clause_opt ::= PARTITION BY partition_list",
- /* 467 */ "partition_list ::= partition_item",
- /* 468 */ "partition_list ::= partition_list NK_COMMA partition_item",
- /* 469 */ "partition_item ::= expr_or_subquery",
- /* 470 */ "partition_item ::= expr_or_subquery column_alias",
- /* 471 */ "partition_item ::= expr_or_subquery AS column_alias",
- /* 472 */ "twindow_clause_opt ::=",
- /* 473 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP",
- /* 474 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP",
- /* 475 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt",
- /* 476 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt",
- /* 477 */ "sliding_opt ::=",
- /* 478 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP",
- /* 479 */ "fill_opt ::=",
- /* 480 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP",
- /* 481 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP",
- /* 482 */ "fill_mode ::= NONE",
- /* 483 */ "fill_mode ::= PREV",
- /* 484 */ "fill_mode ::= NULL",
- /* 485 */ "fill_mode ::= LINEAR",
- /* 486 */ "fill_mode ::= NEXT",
- /* 487 */ "group_by_clause_opt ::=",
- /* 488 */ "group_by_clause_opt ::= GROUP BY group_by_list",
- /* 489 */ "group_by_list ::= expr_or_subquery",
- /* 490 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery",
- /* 491 */ "having_clause_opt ::=",
- /* 492 */ "having_clause_opt ::= HAVING search_condition",
- /* 493 */ "range_opt ::=",
- /* 494 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP",
- /* 495 */ "every_opt ::=",
- /* 496 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP",
- /* 497 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt",
- /* 498 */ "query_simple ::= query_specification",
- /* 499 */ "query_simple ::= union_query_expression",
- /* 500 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery",
- /* 501 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery",
- /* 502 */ "query_simple_or_subquery ::= query_simple",
- /* 503 */ "query_simple_or_subquery ::= subquery",
- /* 504 */ "query_or_subquery ::= query_expression",
- /* 505 */ "query_or_subquery ::= subquery",
- /* 506 */ "order_by_clause_opt ::=",
- /* 507 */ "order_by_clause_opt ::= ORDER BY sort_specification_list",
- /* 508 */ "slimit_clause_opt ::=",
- /* 509 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER",
- /* 510 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER",
- /* 511 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER",
- /* 512 */ "limit_clause_opt ::=",
- /* 513 */ "limit_clause_opt ::= LIMIT NK_INTEGER",
- /* 514 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER",
- /* 515 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER",
- /* 516 */ "subquery ::= NK_LP query_expression NK_RP",
- /* 517 */ "subquery ::= NK_LP subquery NK_RP",
- /* 518 */ "search_condition ::= common_expression",
- /* 519 */ "sort_specification_list ::= sort_specification",
- /* 520 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification",
- /* 521 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt",
- /* 522 */ "ordering_specification_opt ::=",
- /* 523 */ "ordering_specification_opt ::= ASC",
- /* 524 */ "ordering_specification_opt ::= DESC",
- /* 525 */ "null_ordering_opt ::=",
- /* 526 */ "null_ordering_opt ::= NULLS FIRST",
- /* 527 */ "null_ordering_opt ::= NULLS LAST",
+ /* 250 */ "tag_list_opt ::=",
+ /* 251 */ "tag_list_opt ::= tag_item",
+ /* 252 */ "tag_list_opt ::= tag_list_opt NK_COMMA tag_item",
+ /* 253 */ "tag_item ::= TBNAME",
+ /* 254 */ "tag_item ::= QTAGS",
+ /* 255 */ "tag_item ::= column_name",
+ /* 256 */ "tag_item ::= column_name column_alias",
+ /* 257 */ "tag_item ::= column_name AS column_alias",
+ /* 258 */ "cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options",
+ /* 259 */ "cmd ::= DROP INDEX exists_opt full_table_name",
+ /* 260 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt",
+ /* 261 */ "index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt",
+ /* 262 */ "func_list ::= func",
+ /* 263 */ "func_list ::= func_list NK_COMMA func",
+ /* 264 */ "func ::= function_name NK_LP expression_list NK_RP",
+ /* 265 */ "sma_stream_opt ::=",
+ /* 266 */ "sma_stream_opt ::= stream_options WATERMARK duration_literal",
+ /* 267 */ "sma_stream_opt ::= stream_options MAX_DELAY duration_literal",
+ /* 268 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery",
+ /* 269 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name",
+ /* 270 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name",
+ /* 271 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name",
+ /* 272 */ "cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name",
+ /* 273 */ "cmd ::= DROP TOPIC exists_opt topic_name",
+ /* 274 */ "cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name",
+ /* 275 */ "cmd ::= DESC full_table_name",
+ /* 276 */ "cmd ::= DESCRIBE full_table_name",
+ /* 277 */ "cmd ::= RESET QUERY CACHE",
+ /* 278 */ "cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery",
+ /* 279 */ "analyze_opt ::=",
+ /* 280 */ "analyze_opt ::= ANALYZE",
+ /* 281 */ "explain_options ::=",
+ /* 282 */ "explain_options ::= explain_options VERBOSE NK_BOOL",
+ /* 283 */ "explain_options ::= explain_options RATIO NK_FLOAT",
+ /* 284 */ "cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt",
+ /* 285 */ "cmd ::= DROP FUNCTION exists_opt function_name",
+ /* 286 */ "agg_func_opt ::=",
+ /* 287 */ "agg_func_opt ::= AGGREGATE",
+ /* 288 */ "bufsize_opt ::=",
+ /* 289 */ "bufsize_opt ::= BUFSIZE NK_INTEGER",
+ /* 290 */ "cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery",
+ /* 291 */ "cmd ::= DROP STREAM exists_opt stream_name",
+ /* 292 */ "stream_options ::=",
+ /* 293 */ "stream_options ::= stream_options TRIGGER AT_ONCE",
+ /* 294 */ "stream_options ::= stream_options TRIGGER WINDOW_CLOSE",
+ /* 295 */ "stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal",
+ /* 296 */ "stream_options ::= stream_options WATERMARK duration_literal",
+ /* 297 */ "stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER",
+ /* 298 */ "stream_options ::= stream_options FILL_HISTORY NK_INTEGER",
+ /* 299 */ "subtable_opt ::=",
+ /* 300 */ "subtable_opt ::= SUBTABLE NK_LP expression NK_RP",
+ /* 301 */ "cmd ::= KILL CONNECTION NK_INTEGER",
+ /* 302 */ "cmd ::= KILL QUERY NK_STRING",
+ /* 303 */ "cmd ::= KILL TRANSACTION NK_INTEGER",
+ /* 304 */ "cmd ::= BALANCE VGROUP",
+ /* 305 */ "cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER",
+ /* 306 */ "cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list",
+ /* 307 */ "cmd ::= SPLIT VGROUP NK_INTEGER",
+ /* 308 */ "dnode_list ::= DNODE NK_INTEGER",
+ /* 309 */ "dnode_list ::= dnode_list DNODE NK_INTEGER",
+ /* 310 */ "cmd ::= DELETE FROM full_table_name where_clause_opt",
+ /* 311 */ "cmd ::= query_or_subquery",
+ /* 312 */ "cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery",
+ /* 313 */ "cmd ::= INSERT INTO full_table_name query_or_subquery",
+ /* 314 */ "literal ::= NK_INTEGER",
+ /* 315 */ "literal ::= NK_FLOAT",
+ /* 316 */ "literal ::= NK_STRING",
+ /* 317 */ "literal ::= NK_BOOL",
+ /* 318 */ "literal ::= TIMESTAMP NK_STRING",
+ /* 319 */ "literal ::= duration_literal",
+ /* 320 */ "literal ::= NULL",
+ /* 321 */ "literal ::= NK_QUESTION",
+ /* 322 */ "duration_literal ::= NK_VARIABLE",
+ /* 323 */ "signed ::= NK_INTEGER",
+ /* 324 */ "signed ::= NK_PLUS NK_INTEGER",
+ /* 325 */ "signed ::= NK_MINUS NK_INTEGER",
+ /* 326 */ "signed ::= NK_FLOAT",
+ /* 327 */ "signed ::= NK_PLUS NK_FLOAT",
+ /* 328 */ "signed ::= NK_MINUS NK_FLOAT",
+ /* 329 */ "signed_literal ::= signed",
+ /* 330 */ "signed_literal ::= NK_STRING",
+ /* 331 */ "signed_literal ::= NK_BOOL",
+ /* 332 */ "signed_literal ::= TIMESTAMP NK_STRING",
+ /* 333 */ "signed_literal ::= duration_literal",
+ /* 334 */ "signed_literal ::= NULL",
+ /* 335 */ "signed_literal ::= literal_func",
+ /* 336 */ "signed_literal ::= NK_QUESTION",
+ /* 337 */ "literal_list ::= signed_literal",
+ /* 338 */ "literal_list ::= literal_list NK_COMMA signed_literal",
+ /* 339 */ "db_name ::= NK_ID",
+ /* 340 */ "table_name ::= NK_ID",
+ /* 341 */ "column_name ::= NK_ID",
+ /* 342 */ "function_name ::= NK_ID",
+ /* 343 */ "table_alias ::= NK_ID",
+ /* 344 */ "column_alias ::= NK_ID",
+ /* 345 */ "user_name ::= NK_ID",
+ /* 346 */ "topic_name ::= NK_ID",
+ /* 347 */ "stream_name ::= NK_ID",
+ /* 348 */ "cgroup_name ::= NK_ID",
+ /* 349 */ "expr_or_subquery ::= expression",
+ /* 350 */ "expr_or_subquery ::= subquery",
+ /* 351 */ "expression ::= literal",
+ /* 352 */ "expression ::= pseudo_column",
+ /* 353 */ "expression ::= column_reference",
+ /* 354 */ "expression ::= function_expression",
+ /* 355 */ "expression ::= case_when_expression",
+ /* 356 */ "expression ::= NK_LP expression NK_RP",
+ /* 357 */ "expression ::= NK_PLUS expr_or_subquery",
+ /* 358 */ "expression ::= NK_MINUS expr_or_subquery",
+ /* 359 */ "expression ::= expr_or_subquery NK_PLUS expr_or_subquery",
+ /* 360 */ "expression ::= expr_or_subquery NK_MINUS expr_or_subquery",
+ /* 361 */ "expression ::= expr_or_subquery NK_STAR expr_or_subquery",
+ /* 362 */ "expression ::= expr_or_subquery NK_SLASH expr_or_subquery",
+ /* 363 */ "expression ::= expr_or_subquery NK_REM expr_or_subquery",
+ /* 364 */ "expression ::= column_reference NK_ARROW NK_STRING",
+ /* 365 */ "expression ::= expr_or_subquery NK_BITAND expr_or_subquery",
+ /* 366 */ "expression ::= expr_or_subquery NK_BITOR expr_or_subquery",
+ /* 367 */ "expression_list ::= expr_or_subquery",
+ /* 368 */ "expression_list ::= expression_list NK_COMMA expr_or_subquery",
+ /* 369 */ "column_reference ::= column_name",
+ /* 370 */ "column_reference ::= table_name NK_DOT column_name",
+ /* 371 */ "pseudo_column ::= ROWTS",
+ /* 372 */ "pseudo_column ::= TBNAME",
+ /* 373 */ "pseudo_column ::= table_name NK_DOT TBNAME",
+ /* 374 */ "pseudo_column ::= QSTART",
+ /* 375 */ "pseudo_column ::= QEND",
+ /* 376 */ "pseudo_column ::= QDURATION",
+ /* 377 */ "pseudo_column ::= WSTART",
+ /* 378 */ "pseudo_column ::= WEND",
+ /* 379 */ "pseudo_column ::= WDURATION",
+ /* 380 */ "pseudo_column ::= IROWTS",
+ /* 381 */ "pseudo_column ::= QTAGS",
+ /* 382 */ "function_expression ::= function_name NK_LP expression_list NK_RP",
+ /* 383 */ "function_expression ::= star_func NK_LP star_func_para_list NK_RP",
+ /* 384 */ "function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP",
+ /* 385 */ "function_expression ::= literal_func",
+ /* 386 */ "literal_func ::= noarg_func NK_LP NK_RP",
+ /* 387 */ "literal_func ::= NOW",
+ /* 388 */ "noarg_func ::= NOW",
+ /* 389 */ "noarg_func ::= TODAY",
+ /* 390 */ "noarg_func ::= TIMEZONE",
+ /* 391 */ "noarg_func ::= DATABASE",
+ /* 392 */ "noarg_func ::= CLIENT_VERSION",
+ /* 393 */ "noarg_func ::= SERVER_VERSION",
+ /* 394 */ "noarg_func ::= SERVER_STATUS",
+ /* 395 */ "noarg_func ::= CURRENT_USER",
+ /* 396 */ "noarg_func ::= USER",
+ /* 397 */ "star_func ::= COUNT",
+ /* 398 */ "star_func ::= FIRST",
+ /* 399 */ "star_func ::= LAST",
+ /* 400 */ "star_func ::= LAST_ROW",
+ /* 401 */ "star_func_para_list ::= NK_STAR",
+ /* 402 */ "star_func_para_list ::= other_para_list",
+ /* 403 */ "other_para_list ::= star_func_para",
+ /* 404 */ "other_para_list ::= other_para_list NK_COMMA star_func_para",
+ /* 405 */ "star_func_para ::= expr_or_subquery",
+ /* 406 */ "star_func_para ::= table_name NK_DOT NK_STAR",
+ /* 407 */ "case_when_expression ::= CASE when_then_list case_when_else_opt END",
+ /* 408 */ "case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END",
+ /* 409 */ "when_then_list ::= when_then_expr",
+ /* 410 */ "when_then_list ::= when_then_list when_then_expr",
+ /* 411 */ "when_then_expr ::= WHEN common_expression THEN common_expression",
+ /* 412 */ "case_when_else_opt ::=",
+ /* 413 */ "case_when_else_opt ::= ELSE common_expression",
+ /* 414 */ "predicate ::= expr_or_subquery compare_op expr_or_subquery",
+ /* 415 */ "predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery",
+ /* 416 */ "predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery",
+ /* 417 */ "predicate ::= expr_or_subquery IS NULL",
+ /* 418 */ "predicate ::= expr_or_subquery IS NOT NULL",
+ /* 419 */ "predicate ::= expr_or_subquery in_op in_predicate_value",
+ /* 420 */ "compare_op ::= NK_LT",
+ /* 421 */ "compare_op ::= NK_GT",
+ /* 422 */ "compare_op ::= NK_LE",
+ /* 423 */ "compare_op ::= NK_GE",
+ /* 424 */ "compare_op ::= NK_NE",
+ /* 425 */ "compare_op ::= NK_EQ",
+ /* 426 */ "compare_op ::= LIKE",
+ /* 427 */ "compare_op ::= NOT LIKE",
+ /* 428 */ "compare_op ::= MATCH",
+ /* 429 */ "compare_op ::= NMATCH",
+ /* 430 */ "compare_op ::= CONTAINS",
+ /* 431 */ "in_op ::= IN",
+ /* 432 */ "in_op ::= NOT IN",
+ /* 433 */ "in_predicate_value ::= NK_LP literal_list NK_RP",
+ /* 434 */ "boolean_value_expression ::= boolean_primary",
+ /* 435 */ "boolean_value_expression ::= NOT boolean_primary",
+ /* 436 */ "boolean_value_expression ::= boolean_value_expression OR boolean_value_expression",
+ /* 437 */ "boolean_value_expression ::= boolean_value_expression AND boolean_value_expression",
+ /* 438 */ "boolean_primary ::= predicate",
+ /* 439 */ "boolean_primary ::= NK_LP boolean_value_expression NK_RP",
+ /* 440 */ "common_expression ::= expr_or_subquery",
+ /* 441 */ "common_expression ::= boolean_value_expression",
+ /* 442 */ "from_clause_opt ::=",
+ /* 443 */ "from_clause_opt ::= FROM table_reference_list",
+ /* 444 */ "table_reference_list ::= table_reference",
+ /* 445 */ "table_reference_list ::= table_reference_list NK_COMMA table_reference",
+ /* 446 */ "table_reference ::= table_primary",
+ /* 447 */ "table_reference ::= joined_table",
+ /* 448 */ "table_primary ::= table_name alias_opt",
+ /* 449 */ "table_primary ::= db_name NK_DOT table_name alias_opt",
+ /* 450 */ "table_primary ::= subquery alias_opt",
+ /* 451 */ "table_primary ::= parenthesized_joined_table",
+ /* 452 */ "alias_opt ::=",
+ /* 453 */ "alias_opt ::= table_alias",
+ /* 454 */ "alias_opt ::= AS table_alias",
+ /* 455 */ "parenthesized_joined_table ::= NK_LP joined_table NK_RP",
+ /* 456 */ "parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP",
+ /* 457 */ "joined_table ::= table_reference join_type JOIN table_reference ON search_condition",
+ /* 458 */ "join_type ::=",
+ /* 459 */ "join_type ::= INNER",
+ /* 460 */ "query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt",
+ /* 461 */ "set_quantifier_opt ::=",
+ /* 462 */ "set_quantifier_opt ::= DISTINCT",
+ /* 463 */ "set_quantifier_opt ::= ALL",
+ /* 464 */ "select_list ::= select_item",
+ /* 465 */ "select_list ::= select_list NK_COMMA select_item",
+ /* 466 */ "select_item ::= NK_STAR",
+ /* 467 */ "select_item ::= common_expression",
+ /* 468 */ "select_item ::= common_expression column_alias",
+ /* 469 */ "select_item ::= common_expression AS column_alias",
+ /* 470 */ "select_item ::= table_name NK_DOT NK_STAR",
+ /* 471 */ "where_clause_opt ::=",
+ /* 472 */ "where_clause_opt ::= WHERE search_condition",
+ /* 473 */ "partition_by_clause_opt ::=",
+ /* 474 */ "partition_by_clause_opt ::= PARTITION BY partition_list",
+ /* 475 */ "partition_list ::= partition_item",
+ /* 476 */ "partition_list ::= partition_list NK_COMMA partition_item",
+ /* 477 */ "partition_item ::= expr_or_subquery",
+ /* 478 */ "partition_item ::= expr_or_subquery column_alias",
+ /* 479 */ "partition_item ::= expr_or_subquery AS column_alias",
+ /* 480 */ "twindow_clause_opt ::=",
+ /* 481 */ "twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP",
+ /* 482 */ "twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP",
+ /* 483 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt",
+ /* 484 */ "twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt",
+ /* 485 */ "sliding_opt ::=",
+ /* 486 */ "sliding_opt ::= SLIDING NK_LP duration_literal NK_RP",
+ /* 487 */ "fill_opt ::=",
+ /* 488 */ "fill_opt ::= FILL NK_LP fill_mode NK_RP",
+ /* 489 */ "fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP",
+ /* 490 */ "fill_mode ::= NONE",
+ /* 491 */ "fill_mode ::= PREV",
+ /* 492 */ "fill_mode ::= NULL",
+ /* 493 */ "fill_mode ::= LINEAR",
+ /* 494 */ "fill_mode ::= NEXT",
+ /* 495 */ "group_by_clause_opt ::=",
+ /* 496 */ "group_by_clause_opt ::= GROUP BY group_by_list",
+ /* 497 */ "group_by_list ::= expr_or_subquery",
+ /* 498 */ "group_by_list ::= group_by_list NK_COMMA expr_or_subquery",
+ /* 499 */ "having_clause_opt ::=",
+ /* 500 */ "having_clause_opt ::= HAVING search_condition",
+ /* 501 */ "range_opt ::=",
+ /* 502 */ "range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP",
+ /* 503 */ "every_opt ::=",
+ /* 504 */ "every_opt ::= EVERY NK_LP duration_literal NK_RP",
+ /* 505 */ "query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt",
+ /* 506 */ "query_simple ::= query_specification",
+ /* 507 */ "query_simple ::= union_query_expression",
+ /* 508 */ "union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery",
+ /* 509 */ "union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery",
+ /* 510 */ "query_simple_or_subquery ::= query_simple",
+ /* 511 */ "query_simple_or_subquery ::= subquery",
+ /* 512 */ "query_or_subquery ::= query_expression",
+ /* 513 */ "query_or_subquery ::= subquery",
+ /* 514 */ "order_by_clause_opt ::=",
+ /* 515 */ "order_by_clause_opt ::= ORDER BY sort_specification_list",
+ /* 516 */ "slimit_clause_opt ::=",
+ /* 517 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER",
+ /* 518 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER",
+ /* 519 */ "slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER",
+ /* 520 */ "limit_clause_opt ::=",
+ /* 521 */ "limit_clause_opt ::= LIMIT NK_INTEGER",
+ /* 522 */ "limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER",
+ /* 523 */ "limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER",
+ /* 524 */ "subquery ::= NK_LP query_expression NK_RP",
+ /* 525 */ "subquery ::= NK_LP subquery NK_RP",
+ /* 526 */ "search_condition ::= common_expression",
+ /* 527 */ "sort_specification_list ::= sort_specification",
+ /* 528 */ "sort_specification_list ::= sort_specification_list NK_COMMA sort_specification",
+ /* 529 */ "sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt",
+ /* 530 */ "ordering_specification_opt ::=",
+ /* 531 */ "ordering_specification_opt ::= ASC",
+ /* 532 */ "ordering_specification_opt ::= DESC",
+ /* 533 */ "null_ordering_opt ::=",
+ /* 534 */ "null_ordering_opt ::= NULLS FIRST",
+ /* 535 */ "null_ordering_opt ::= NULLS LAST",
};
#endif /* NDEBUG */
@@ -2629,63 +2599,64 @@ static void yy_destructor(
case 370: /* like_pattern_opt */
case 371: /* table_name_cond */
case 372: /* from_db_opt */
- case 373: /* index_options */
- case 375: /* sliding_opt */
- case 376: /* sma_stream_opt */
- case 377: /* func */
- case 378: /* stream_options */
- case 380: /* query_or_subquery */
- case 383: /* explain_options */
- case 387: /* subtable_opt */
- case 388: /* expression */
- case 390: /* where_clause_opt */
- case 391: /* signed */
- case 392: /* literal_func */
- case 396: /* expr_or_subquery */
- case 397: /* subquery */
- case 398: /* pseudo_column */
- case 399: /* column_reference */
- case 400: /* function_expression */
- case 401: /* case_when_expression */
- case 406: /* star_func_para */
- case 408: /* case_when_else_opt */
- case 409: /* common_expression */
- case 410: /* when_then_expr */
- case 411: /* predicate */
- case 414: /* in_predicate_value */
- case 415: /* boolean_value_expression */
- case 416: /* boolean_primary */
- case 417: /* from_clause_opt */
- case 418: /* table_reference_list */
- case 419: /* table_reference */
- case 420: /* table_primary */
- case 421: /* joined_table */
- case 423: /* parenthesized_joined_table */
- case 425: /* search_condition */
- case 426: /* query_specification */
- case 430: /* range_opt */
- case 431: /* every_opt */
- case 432: /* fill_opt */
- case 433: /* twindow_clause_opt */
- case 435: /* having_clause_opt */
- case 436: /* select_item */
- case 438: /* partition_item */
- case 441: /* query_expression */
- case 442: /* query_simple */
- case 444: /* slimit_clause_opt */
- case 445: /* limit_clause_opt */
- case 446: /* union_query_expression */
- case 447: /* query_simple_or_subquery */
- case 449: /* sort_specification */
+ case 374: /* tag_item */
+ case 376: /* index_options */
+ case 378: /* sliding_opt */
+ case 379: /* sma_stream_opt */
+ case 380: /* func */
+ case 381: /* stream_options */
+ case 383: /* query_or_subquery */
+ case 386: /* explain_options */
+ case 390: /* subtable_opt */
+ case 391: /* expression */
+ case 393: /* where_clause_opt */
+ case 394: /* signed */
+ case 395: /* literal_func */
+ case 398: /* expr_or_subquery */
+ case 399: /* subquery */
+ case 400: /* pseudo_column */
+ case 401: /* column_reference */
+ case 402: /* function_expression */
+ case 403: /* case_when_expression */
+ case 408: /* star_func_para */
+ case 410: /* case_when_else_opt */
+ case 411: /* common_expression */
+ case 412: /* when_then_expr */
+ case 413: /* predicate */
+ case 416: /* in_predicate_value */
+ case 417: /* boolean_value_expression */
+ case 418: /* boolean_primary */
+ case 419: /* from_clause_opt */
+ case 420: /* table_reference_list */
+ case 421: /* table_reference */
+ case 422: /* table_primary */
+ case 423: /* joined_table */
+ case 425: /* parenthesized_joined_table */
+ case 427: /* search_condition */
+ case 428: /* query_specification */
+ case 432: /* range_opt */
+ case 433: /* every_opt */
+ case 434: /* fill_opt */
+ case 435: /* twindow_clause_opt */
+ case 437: /* having_clause_opt */
+ case 438: /* select_item */
+ case 440: /* partition_item */
+ case 443: /* query_expression */
+ case 444: /* query_simple */
+ case 446: /* slimit_clause_opt */
+ case 447: /* limit_clause_opt */
+ case 448: /* union_query_expression */
+ case 449: /* query_simple_or_subquery */
+ case 451: /* sort_specification */
{
- nodesDestroyNode((yypminor->yy232));
+ nodesDestroyNode((yypminor->yy164));
}
break;
case 320: /* account_options */
case 321: /* alter_account_options */
case 323: /* alter_account_option */
case 337: /* speed_opt */
- case 385: /* bufsize_opt */
+ case 388: /* bufsize_opt */
{
}
@@ -2697,14 +2668,14 @@ static void yy_destructor(
case 352: /* column_name */
case 360: /* table_name */
case 367: /* function_name */
- case 379: /* topic_name */
- case 381: /* cgroup_name */
- case 386: /* stream_name */
- case 394: /* table_alias */
- case 395: /* column_alias */
- case 402: /* star_func */
- case 404: /* noarg_func */
- case 422: /* alias_opt */
+ case 375: /* column_alias */
+ case 382: /* topic_name */
+ case 384: /* cgroup_name */
+ case 389: /* stream_name */
+ case 397: /* table_alias */
+ case 404: /* star_func */
+ case 406: /* noarg_func */
+ case 424: /* alias_opt */
{
}
@@ -2724,9 +2695,9 @@ static void yy_destructor(
case 332: /* force_opt */
case 333: /* not_exists_opt */
case 335: /* exists_opt */
- case 382: /* analyze_opt */
- case 384: /* agg_func_opt */
- case 427: /* set_quantifier_opt */
+ case 385: /* analyze_opt */
+ case 387: /* agg_func_opt */
+ case 429: /* set_quantifier_opt */
{
}
@@ -2744,21 +2715,22 @@ static void yy_destructor(
case 359: /* col_name_list */
case 362: /* duration_list */
case 363: /* rollup_func_list */
- case 374: /* func_list */
- case 389: /* dnode_list */
- case 393: /* literal_list */
- case 403: /* star_func_para_list */
- case 405: /* other_para_list */
- case 407: /* when_then_list */
- case 428: /* select_list */
- case 429: /* partition_by_clause_opt */
- case 434: /* group_by_clause_opt */
- case 437: /* partition_list */
- case 440: /* group_by_list */
- case 443: /* order_by_clause_opt */
- case 448: /* sort_specification_list */
+ case 373: /* tag_list_opt */
+ case 377: /* func_list */
+ case 392: /* dnode_list */
+ case 396: /* literal_list */
+ case 405: /* star_func_para_list */
+ case 407: /* other_para_list */
+ case 409: /* when_then_list */
+ case 430: /* select_list */
+ case 431: /* partition_by_clause_opt */
+ case 436: /* group_by_clause_opt */
+ case 439: /* partition_list */
+ case 442: /* group_by_list */
+ case 445: /* order_by_clause_opt */
+ case 450: /* sort_specification_list */
{
- nodesDestroyList((yypminor->yy288));
+ nodesDestroyList((yypminor->yy648));
}
break;
case 341: /* alter_db_option */
@@ -2772,28 +2744,28 @@ static void yy_destructor(
}
break;
- case 412: /* compare_op */
- case 413: /* in_op */
+ case 414: /* compare_op */
+ case 415: /* in_op */
{
}
break;
- case 424: /* join_type */
+ case 426: /* join_type */
{
}
break;
- case 439: /* fill_mode */
+ case 441: /* fill_mode */
{
}
break;
- case 450: /* ordering_specification_opt */
+ case 452: /* ordering_specification_opt */
{
}
break;
- case 451: /* null_ordering_opt */
+ case 453: /* null_ordering_opt */
{
}
@@ -3332,7 +3304,7 @@ static const struct {
{ 319, -2 }, /* (237) cmd ::= SHOW CONSUMERS */
{ 319, -2 }, /* (238) cmd ::= SHOW SUBSCRIPTIONS */
{ 319, -5 }, /* (239) cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */
- { 319, -6 }, /* (240) cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */
+ { 319, -7 }, /* (240) cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */
{ 319, -3 }, /* (241) cmd ::= SHOW VNODES NK_INTEGER */
{ 319, -3 }, /* (242) cmd ::= SHOW VNODES NK_STRING */
{ 369, 0 }, /* (243) db_name_cond_opt ::= */
@@ -3342,284 +3314,292 @@ static const struct {
{ 371, -1 }, /* (247) table_name_cond ::= table_name */
{ 372, 0 }, /* (248) from_db_opt ::= */
{ 372, -2 }, /* (249) from_db_opt ::= FROM db_name */
- { 319, -8 }, /* (250) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */
- { 319, -4 }, /* (251) cmd ::= DROP INDEX exists_opt full_table_name */
- { 373, -10 }, /* (252) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
- { 373, -12 }, /* (253) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */
- { 374, -1 }, /* (254) func_list ::= func */
- { 374, -3 }, /* (255) func_list ::= func_list NK_COMMA func */
- { 377, -4 }, /* (256) func ::= function_name NK_LP expression_list NK_RP */
- { 376, 0 }, /* (257) sma_stream_opt ::= */
- { 376, -3 }, /* (258) sma_stream_opt ::= stream_options WATERMARK duration_literal */
- { 376, -3 }, /* (259) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */
- { 319, -6 }, /* (260) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
- { 319, -7 }, /* (261) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
- { 319, -9 }, /* (262) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
- { 319, -7 }, /* (263) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
- { 319, -9 }, /* (264) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
- { 319, -4 }, /* (265) cmd ::= DROP TOPIC exists_opt topic_name */
- { 319, -7 }, /* (266) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
- { 319, -2 }, /* (267) cmd ::= DESC full_table_name */
- { 319, -2 }, /* (268) cmd ::= DESCRIBE full_table_name */
- { 319, -3 }, /* (269) cmd ::= RESET QUERY CACHE */
- { 319, -4 }, /* (270) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
- { 382, 0 }, /* (271) analyze_opt ::= */
- { 382, -1 }, /* (272) analyze_opt ::= ANALYZE */
- { 383, 0 }, /* (273) explain_options ::= */
- { 383, -3 }, /* (274) explain_options ::= explain_options VERBOSE NK_BOOL */
- { 383, -3 }, /* (275) explain_options ::= explain_options RATIO NK_FLOAT */
- { 319, -10 }, /* (276) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */
- { 319, -4 }, /* (277) cmd ::= DROP FUNCTION exists_opt function_name */
- { 384, 0 }, /* (278) agg_func_opt ::= */
- { 384, -1 }, /* (279) agg_func_opt ::= AGGREGATE */
- { 385, 0 }, /* (280) bufsize_opt ::= */
- { 385, -2 }, /* (281) bufsize_opt ::= BUFSIZE NK_INTEGER */
- { 319, -11 }, /* (282) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */
- { 319, -4 }, /* (283) cmd ::= DROP STREAM exists_opt stream_name */
- { 378, 0 }, /* (284) stream_options ::= */
- { 378, -3 }, /* (285) stream_options ::= stream_options TRIGGER AT_ONCE */
- { 378, -3 }, /* (286) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
- { 378, -4 }, /* (287) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
- { 378, -3 }, /* (288) stream_options ::= stream_options WATERMARK duration_literal */
- { 378, -4 }, /* (289) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
- { 378, -3 }, /* (290) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
- { 387, 0 }, /* (291) subtable_opt ::= */
- { 387, -4 }, /* (292) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
- { 319, -3 }, /* (293) cmd ::= KILL CONNECTION NK_INTEGER */
- { 319, -3 }, /* (294) cmd ::= KILL QUERY NK_STRING */
- { 319, -3 }, /* (295) cmd ::= KILL TRANSACTION NK_INTEGER */
- { 319, -2 }, /* (296) cmd ::= BALANCE VGROUP */
- { 319, -4 }, /* (297) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
- { 319, -4 }, /* (298) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
- { 319, -3 }, /* (299) cmd ::= SPLIT VGROUP NK_INTEGER */
- { 389, -2 }, /* (300) dnode_list ::= DNODE NK_INTEGER */
- { 389, -3 }, /* (301) dnode_list ::= dnode_list DNODE NK_INTEGER */
- { 319, -4 }, /* (302) cmd ::= DELETE FROM full_table_name where_clause_opt */
- { 319, -1 }, /* (303) cmd ::= query_or_subquery */
- { 319, -7 }, /* (304) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
- { 319, -4 }, /* (305) cmd ::= INSERT INTO full_table_name query_or_subquery */
- { 322, -1 }, /* (306) literal ::= NK_INTEGER */
- { 322, -1 }, /* (307) literal ::= NK_FLOAT */
- { 322, -1 }, /* (308) literal ::= NK_STRING */
- { 322, -1 }, /* (309) literal ::= NK_BOOL */
- { 322, -2 }, /* (310) literal ::= TIMESTAMP NK_STRING */
- { 322, -1 }, /* (311) literal ::= duration_literal */
- { 322, -1 }, /* (312) literal ::= NULL */
- { 322, -1 }, /* (313) literal ::= NK_QUESTION */
- { 365, -1 }, /* (314) duration_literal ::= NK_VARIABLE */
- { 391, -1 }, /* (315) signed ::= NK_INTEGER */
- { 391, -2 }, /* (316) signed ::= NK_PLUS NK_INTEGER */
- { 391, -2 }, /* (317) signed ::= NK_MINUS NK_INTEGER */
- { 391, -1 }, /* (318) signed ::= NK_FLOAT */
- { 391, -2 }, /* (319) signed ::= NK_PLUS NK_FLOAT */
- { 391, -2 }, /* (320) signed ::= NK_MINUS NK_FLOAT */
- { 354, -1 }, /* (321) signed_literal ::= signed */
- { 354, -1 }, /* (322) signed_literal ::= NK_STRING */
- { 354, -1 }, /* (323) signed_literal ::= NK_BOOL */
- { 354, -2 }, /* (324) signed_literal ::= TIMESTAMP NK_STRING */
- { 354, -1 }, /* (325) signed_literal ::= duration_literal */
- { 354, -1 }, /* (326) signed_literal ::= NULL */
- { 354, -1 }, /* (327) signed_literal ::= literal_func */
- { 354, -1 }, /* (328) signed_literal ::= NK_QUESTION */
- { 393, -1 }, /* (329) literal_list ::= signed_literal */
- { 393, -3 }, /* (330) literal_list ::= literal_list NK_COMMA signed_literal */
- { 330, -1 }, /* (331) db_name ::= NK_ID */
- { 360, -1 }, /* (332) table_name ::= NK_ID */
- { 352, -1 }, /* (333) column_name ::= NK_ID */
- { 367, -1 }, /* (334) function_name ::= NK_ID */
- { 394, -1 }, /* (335) table_alias ::= NK_ID */
- { 395, -1 }, /* (336) column_alias ::= NK_ID */
- { 324, -1 }, /* (337) user_name ::= NK_ID */
- { 379, -1 }, /* (338) topic_name ::= NK_ID */
- { 386, -1 }, /* (339) stream_name ::= NK_ID */
- { 381, -1 }, /* (340) cgroup_name ::= NK_ID */
- { 396, -1 }, /* (341) expr_or_subquery ::= expression */
- { 396, -1 }, /* (342) expr_or_subquery ::= subquery */
- { 388, -1 }, /* (343) expression ::= literal */
- { 388, -1 }, /* (344) expression ::= pseudo_column */
- { 388, -1 }, /* (345) expression ::= column_reference */
- { 388, -1 }, /* (346) expression ::= function_expression */
- { 388, -1 }, /* (347) expression ::= case_when_expression */
- { 388, -3 }, /* (348) expression ::= NK_LP expression NK_RP */
- { 388, -2 }, /* (349) expression ::= NK_PLUS expr_or_subquery */
- { 388, -2 }, /* (350) expression ::= NK_MINUS expr_or_subquery */
- { 388, -3 }, /* (351) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
- { 388, -3 }, /* (352) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
- { 388, -3 }, /* (353) expression ::= expr_or_subquery NK_STAR expr_or_subquery */
- { 388, -3 }, /* (354) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
- { 388, -3 }, /* (355) expression ::= expr_or_subquery NK_REM expr_or_subquery */
- { 388, -3 }, /* (356) expression ::= column_reference NK_ARROW NK_STRING */
- { 388, -3 }, /* (357) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
- { 388, -3 }, /* (358) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
- { 357, -1 }, /* (359) expression_list ::= expr_or_subquery */
- { 357, -3 }, /* (360) expression_list ::= expression_list NK_COMMA expr_or_subquery */
- { 399, -1 }, /* (361) column_reference ::= column_name */
- { 399, -3 }, /* (362) column_reference ::= table_name NK_DOT column_name */
- { 398, -1 }, /* (363) pseudo_column ::= ROWTS */
- { 398, -1 }, /* (364) pseudo_column ::= TBNAME */
- { 398, -3 }, /* (365) pseudo_column ::= table_name NK_DOT TBNAME */
- { 398, -1 }, /* (366) pseudo_column ::= QSTART */
- { 398, -1 }, /* (367) pseudo_column ::= QEND */
- { 398, -1 }, /* (368) pseudo_column ::= QDURATION */
- { 398, -1 }, /* (369) pseudo_column ::= WSTART */
- { 398, -1 }, /* (370) pseudo_column ::= WEND */
- { 398, -1 }, /* (371) pseudo_column ::= WDURATION */
- { 398, -1 }, /* (372) pseudo_column ::= IROWTS */
- { 398, -1 }, /* (373) pseudo_column ::= QTAGS */
- { 400, -4 }, /* (374) function_expression ::= function_name NK_LP expression_list NK_RP */
- { 400, -4 }, /* (375) function_expression ::= star_func NK_LP star_func_para_list NK_RP */
- { 400, -6 }, /* (376) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
- { 400, -1 }, /* (377) function_expression ::= literal_func */
- { 392, -3 }, /* (378) literal_func ::= noarg_func NK_LP NK_RP */
- { 392, -1 }, /* (379) literal_func ::= NOW */
- { 404, -1 }, /* (380) noarg_func ::= NOW */
- { 404, -1 }, /* (381) noarg_func ::= TODAY */
- { 404, -1 }, /* (382) noarg_func ::= TIMEZONE */
- { 404, -1 }, /* (383) noarg_func ::= DATABASE */
- { 404, -1 }, /* (384) noarg_func ::= CLIENT_VERSION */
- { 404, -1 }, /* (385) noarg_func ::= SERVER_VERSION */
- { 404, -1 }, /* (386) noarg_func ::= SERVER_STATUS */
- { 404, -1 }, /* (387) noarg_func ::= CURRENT_USER */
- { 404, -1 }, /* (388) noarg_func ::= USER */
- { 402, -1 }, /* (389) star_func ::= COUNT */
- { 402, -1 }, /* (390) star_func ::= FIRST */
- { 402, -1 }, /* (391) star_func ::= LAST */
- { 402, -1 }, /* (392) star_func ::= LAST_ROW */
- { 403, -1 }, /* (393) star_func_para_list ::= NK_STAR */
- { 403, -1 }, /* (394) star_func_para_list ::= other_para_list */
- { 405, -1 }, /* (395) other_para_list ::= star_func_para */
- { 405, -3 }, /* (396) other_para_list ::= other_para_list NK_COMMA star_func_para */
- { 406, -1 }, /* (397) star_func_para ::= expr_or_subquery */
- { 406, -3 }, /* (398) star_func_para ::= table_name NK_DOT NK_STAR */
- { 401, -4 }, /* (399) case_when_expression ::= CASE when_then_list case_when_else_opt END */
- { 401, -5 }, /* (400) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
- { 407, -1 }, /* (401) when_then_list ::= when_then_expr */
- { 407, -2 }, /* (402) when_then_list ::= when_then_list when_then_expr */
- { 410, -4 }, /* (403) when_then_expr ::= WHEN common_expression THEN common_expression */
- { 408, 0 }, /* (404) case_when_else_opt ::= */
- { 408, -2 }, /* (405) case_when_else_opt ::= ELSE common_expression */
- { 411, -3 }, /* (406) predicate ::= expr_or_subquery compare_op expr_or_subquery */
- { 411, -5 }, /* (407) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
- { 411, -6 }, /* (408) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
- { 411, -3 }, /* (409) predicate ::= expr_or_subquery IS NULL */
- { 411, -4 }, /* (410) predicate ::= expr_or_subquery IS NOT NULL */
- { 411, -3 }, /* (411) predicate ::= expr_or_subquery in_op in_predicate_value */
- { 412, -1 }, /* (412) compare_op ::= NK_LT */
- { 412, -1 }, /* (413) compare_op ::= NK_GT */
- { 412, -1 }, /* (414) compare_op ::= NK_LE */
- { 412, -1 }, /* (415) compare_op ::= NK_GE */
- { 412, -1 }, /* (416) compare_op ::= NK_NE */
- { 412, -1 }, /* (417) compare_op ::= NK_EQ */
- { 412, -1 }, /* (418) compare_op ::= LIKE */
- { 412, -2 }, /* (419) compare_op ::= NOT LIKE */
- { 412, -1 }, /* (420) compare_op ::= MATCH */
- { 412, -1 }, /* (421) compare_op ::= NMATCH */
- { 412, -1 }, /* (422) compare_op ::= CONTAINS */
- { 413, -1 }, /* (423) in_op ::= IN */
- { 413, -2 }, /* (424) in_op ::= NOT IN */
- { 414, -3 }, /* (425) in_predicate_value ::= NK_LP literal_list NK_RP */
- { 415, -1 }, /* (426) boolean_value_expression ::= boolean_primary */
- { 415, -2 }, /* (427) boolean_value_expression ::= NOT boolean_primary */
- { 415, -3 }, /* (428) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
- { 415, -3 }, /* (429) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
- { 416, -1 }, /* (430) boolean_primary ::= predicate */
- { 416, -3 }, /* (431) boolean_primary ::= NK_LP boolean_value_expression NK_RP */
- { 409, -1 }, /* (432) common_expression ::= expr_or_subquery */
- { 409, -1 }, /* (433) common_expression ::= boolean_value_expression */
- { 417, 0 }, /* (434) from_clause_opt ::= */
- { 417, -2 }, /* (435) from_clause_opt ::= FROM table_reference_list */
- { 418, -1 }, /* (436) table_reference_list ::= table_reference */
- { 418, -3 }, /* (437) table_reference_list ::= table_reference_list NK_COMMA table_reference */
- { 419, -1 }, /* (438) table_reference ::= table_primary */
- { 419, -1 }, /* (439) table_reference ::= joined_table */
- { 420, -2 }, /* (440) table_primary ::= table_name alias_opt */
- { 420, -4 }, /* (441) table_primary ::= db_name NK_DOT table_name alias_opt */
- { 420, -2 }, /* (442) table_primary ::= subquery alias_opt */
- { 420, -1 }, /* (443) table_primary ::= parenthesized_joined_table */
- { 422, 0 }, /* (444) alias_opt ::= */
- { 422, -1 }, /* (445) alias_opt ::= table_alias */
- { 422, -2 }, /* (446) alias_opt ::= AS table_alias */
- { 423, -3 }, /* (447) parenthesized_joined_table ::= NK_LP joined_table NK_RP */
- { 423, -3 }, /* (448) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */
- { 421, -6 }, /* (449) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
- { 424, 0 }, /* (450) join_type ::= */
- { 424, -1 }, /* (451) join_type ::= INNER */
- { 426, -12 }, /* (452) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
- { 427, 0 }, /* (453) set_quantifier_opt ::= */
- { 427, -1 }, /* (454) set_quantifier_opt ::= DISTINCT */
- { 427, -1 }, /* (455) set_quantifier_opt ::= ALL */
- { 428, -1 }, /* (456) select_list ::= select_item */
- { 428, -3 }, /* (457) select_list ::= select_list NK_COMMA select_item */
- { 436, -1 }, /* (458) select_item ::= NK_STAR */
- { 436, -1 }, /* (459) select_item ::= common_expression */
- { 436, -2 }, /* (460) select_item ::= common_expression column_alias */
- { 436, -3 }, /* (461) select_item ::= common_expression AS column_alias */
- { 436, -3 }, /* (462) select_item ::= table_name NK_DOT NK_STAR */
- { 390, 0 }, /* (463) where_clause_opt ::= */
- { 390, -2 }, /* (464) where_clause_opt ::= WHERE search_condition */
- { 429, 0 }, /* (465) partition_by_clause_opt ::= */
- { 429, -3 }, /* (466) partition_by_clause_opt ::= PARTITION BY partition_list */
- { 437, -1 }, /* (467) partition_list ::= partition_item */
- { 437, -3 }, /* (468) partition_list ::= partition_list NK_COMMA partition_item */
- { 438, -1 }, /* (469) partition_item ::= expr_or_subquery */
- { 438, -2 }, /* (470) partition_item ::= expr_or_subquery column_alias */
- { 438, -3 }, /* (471) partition_item ::= expr_or_subquery AS column_alias */
- { 433, 0 }, /* (472) twindow_clause_opt ::= */
- { 433, -6 }, /* (473) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
- { 433, -4 }, /* (474) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
- { 433, -6 }, /* (475) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
- { 433, -8 }, /* (476) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
- { 375, 0 }, /* (477) sliding_opt ::= */
- { 375, -4 }, /* (478) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
- { 432, 0 }, /* (479) fill_opt ::= */
- { 432, -4 }, /* (480) fill_opt ::= FILL NK_LP fill_mode NK_RP */
- { 432, -6 }, /* (481) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
- { 439, -1 }, /* (482) fill_mode ::= NONE */
- { 439, -1 }, /* (483) fill_mode ::= PREV */
- { 439, -1 }, /* (484) fill_mode ::= NULL */
- { 439, -1 }, /* (485) fill_mode ::= LINEAR */
- { 439, -1 }, /* (486) fill_mode ::= NEXT */
- { 434, 0 }, /* (487) group_by_clause_opt ::= */
- { 434, -3 }, /* (488) group_by_clause_opt ::= GROUP BY group_by_list */
- { 440, -1 }, /* (489) group_by_list ::= expr_or_subquery */
- { 440, -3 }, /* (490) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
- { 435, 0 }, /* (491) having_clause_opt ::= */
- { 435, -2 }, /* (492) having_clause_opt ::= HAVING search_condition */
- { 430, 0 }, /* (493) range_opt ::= */
- { 430, -6 }, /* (494) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
- { 431, 0 }, /* (495) every_opt ::= */
- { 431, -4 }, /* (496) every_opt ::= EVERY NK_LP duration_literal NK_RP */
- { 441, -4 }, /* (497) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
- { 442, -1 }, /* (498) query_simple ::= query_specification */
- { 442, -1 }, /* (499) query_simple ::= union_query_expression */
- { 446, -4 }, /* (500) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
- { 446, -3 }, /* (501) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
- { 447, -1 }, /* (502) query_simple_or_subquery ::= query_simple */
- { 447, -1 }, /* (503) query_simple_or_subquery ::= subquery */
- { 380, -1 }, /* (504) query_or_subquery ::= query_expression */
- { 380, -1 }, /* (505) query_or_subquery ::= subquery */
- { 443, 0 }, /* (506) order_by_clause_opt ::= */
- { 443, -3 }, /* (507) order_by_clause_opt ::= ORDER BY sort_specification_list */
- { 444, 0 }, /* (508) slimit_clause_opt ::= */
- { 444, -2 }, /* (509) slimit_clause_opt ::= SLIMIT NK_INTEGER */
- { 444, -4 }, /* (510) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
- { 444, -4 }, /* (511) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- { 445, 0 }, /* (512) limit_clause_opt ::= */
- { 445, -2 }, /* (513) limit_clause_opt ::= LIMIT NK_INTEGER */
- { 445, -4 }, /* (514) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */
- { 445, -4 }, /* (515) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- { 397, -3 }, /* (516) subquery ::= NK_LP query_expression NK_RP */
- { 397, -3 }, /* (517) subquery ::= NK_LP subquery NK_RP */
- { 425, -1 }, /* (518) search_condition ::= common_expression */
- { 448, -1 }, /* (519) sort_specification_list ::= sort_specification */
- { 448, -3 }, /* (520) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */
- { 449, -3 }, /* (521) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
- { 450, 0 }, /* (522) ordering_specification_opt ::= */
- { 450, -1 }, /* (523) ordering_specification_opt ::= ASC */
- { 450, -1 }, /* (524) ordering_specification_opt ::= DESC */
- { 451, 0 }, /* (525) null_ordering_opt ::= */
- { 451, -2 }, /* (526) null_ordering_opt ::= NULLS FIRST */
- { 451, -2 }, /* (527) null_ordering_opt ::= NULLS LAST */
+ { 373, 0 }, /* (250) tag_list_opt ::= */
+ { 373, -1 }, /* (251) tag_list_opt ::= tag_item */
+ { 373, -3 }, /* (252) tag_list_opt ::= tag_list_opt NK_COMMA tag_item */
+ { 374, -1 }, /* (253) tag_item ::= TBNAME */
+ { 374, -1 }, /* (254) tag_item ::= QTAGS */
+ { 374, -1 }, /* (255) tag_item ::= column_name */
+ { 374, -2 }, /* (256) tag_item ::= column_name column_alias */
+ { 374, -3 }, /* (257) tag_item ::= column_name AS column_alias */
+ { 319, -8 }, /* (258) cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */
+ { 319, -4 }, /* (259) cmd ::= DROP INDEX exists_opt full_table_name */
+ { 376, -10 }, /* (260) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
+ { 376, -12 }, /* (261) index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */
+ { 377, -1 }, /* (262) func_list ::= func */
+ { 377, -3 }, /* (263) func_list ::= func_list NK_COMMA func */
+ { 380, -4 }, /* (264) func ::= function_name NK_LP expression_list NK_RP */
+ { 379, 0 }, /* (265) sma_stream_opt ::= */
+ { 379, -3 }, /* (266) sma_stream_opt ::= stream_options WATERMARK duration_literal */
+ { 379, -3 }, /* (267) sma_stream_opt ::= stream_options MAX_DELAY duration_literal */
+ { 319, -6 }, /* (268) cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
+ { 319, -7 }, /* (269) cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
+ { 319, -9 }, /* (270) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
+ { 319, -7 }, /* (271) cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
+ { 319, -9 }, /* (272) cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
+ { 319, -4 }, /* (273) cmd ::= DROP TOPIC exists_opt topic_name */
+ { 319, -7 }, /* (274) cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
+ { 319, -2 }, /* (275) cmd ::= DESC full_table_name */
+ { 319, -2 }, /* (276) cmd ::= DESCRIBE full_table_name */
+ { 319, -3 }, /* (277) cmd ::= RESET QUERY CACHE */
+ { 319, -4 }, /* (278) cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
+ { 385, 0 }, /* (279) analyze_opt ::= */
+ { 385, -1 }, /* (280) analyze_opt ::= ANALYZE */
+ { 386, 0 }, /* (281) explain_options ::= */
+ { 386, -3 }, /* (282) explain_options ::= explain_options VERBOSE NK_BOOL */
+ { 386, -3 }, /* (283) explain_options ::= explain_options RATIO NK_FLOAT */
+ { 319, -10 }, /* (284) cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */
+ { 319, -4 }, /* (285) cmd ::= DROP FUNCTION exists_opt function_name */
+ { 387, 0 }, /* (286) agg_func_opt ::= */
+ { 387, -1 }, /* (287) agg_func_opt ::= AGGREGATE */
+ { 388, 0 }, /* (288) bufsize_opt ::= */
+ { 388, -2 }, /* (289) bufsize_opt ::= BUFSIZE NK_INTEGER */
+ { 319, -11 }, /* (290) cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */
+ { 319, -4 }, /* (291) cmd ::= DROP STREAM exists_opt stream_name */
+ { 381, 0 }, /* (292) stream_options ::= */
+ { 381, -3 }, /* (293) stream_options ::= stream_options TRIGGER AT_ONCE */
+ { 381, -3 }, /* (294) stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
+ { 381, -4 }, /* (295) stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
+ { 381, -3 }, /* (296) stream_options ::= stream_options WATERMARK duration_literal */
+ { 381, -4 }, /* (297) stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
+ { 381, -3 }, /* (298) stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
+ { 390, 0 }, /* (299) subtable_opt ::= */
+ { 390, -4 }, /* (300) subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
+ { 319, -3 }, /* (301) cmd ::= KILL CONNECTION NK_INTEGER */
+ { 319, -3 }, /* (302) cmd ::= KILL QUERY NK_STRING */
+ { 319, -3 }, /* (303) cmd ::= KILL TRANSACTION NK_INTEGER */
+ { 319, -2 }, /* (304) cmd ::= BALANCE VGROUP */
+ { 319, -4 }, /* (305) cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
+ { 319, -4 }, /* (306) cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
+ { 319, -3 }, /* (307) cmd ::= SPLIT VGROUP NK_INTEGER */
+ { 392, -2 }, /* (308) dnode_list ::= DNODE NK_INTEGER */
+ { 392, -3 }, /* (309) dnode_list ::= dnode_list DNODE NK_INTEGER */
+ { 319, -4 }, /* (310) cmd ::= DELETE FROM full_table_name where_clause_opt */
+ { 319, -1 }, /* (311) cmd ::= query_or_subquery */
+ { 319, -7 }, /* (312) cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
+ { 319, -4 }, /* (313) cmd ::= INSERT INTO full_table_name query_or_subquery */
+ { 322, -1 }, /* (314) literal ::= NK_INTEGER */
+ { 322, -1 }, /* (315) literal ::= NK_FLOAT */
+ { 322, -1 }, /* (316) literal ::= NK_STRING */
+ { 322, -1 }, /* (317) literal ::= NK_BOOL */
+ { 322, -2 }, /* (318) literal ::= TIMESTAMP NK_STRING */
+ { 322, -1 }, /* (319) literal ::= duration_literal */
+ { 322, -1 }, /* (320) literal ::= NULL */
+ { 322, -1 }, /* (321) literal ::= NK_QUESTION */
+ { 365, -1 }, /* (322) duration_literal ::= NK_VARIABLE */
+ { 394, -1 }, /* (323) signed ::= NK_INTEGER */
+ { 394, -2 }, /* (324) signed ::= NK_PLUS NK_INTEGER */
+ { 394, -2 }, /* (325) signed ::= NK_MINUS NK_INTEGER */
+ { 394, -1 }, /* (326) signed ::= NK_FLOAT */
+ { 394, -2 }, /* (327) signed ::= NK_PLUS NK_FLOAT */
+ { 394, -2 }, /* (328) signed ::= NK_MINUS NK_FLOAT */
+ { 354, -1 }, /* (329) signed_literal ::= signed */
+ { 354, -1 }, /* (330) signed_literal ::= NK_STRING */
+ { 354, -1 }, /* (331) signed_literal ::= NK_BOOL */
+ { 354, -2 }, /* (332) signed_literal ::= TIMESTAMP NK_STRING */
+ { 354, -1 }, /* (333) signed_literal ::= duration_literal */
+ { 354, -1 }, /* (334) signed_literal ::= NULL */
+ { 354, -1 }, /* (335) signed_literal ::= literal_func */
+ { 354, -1 }, /* (336) signed_literal ::= NK_QUESTION */
+ { 396, -1 }, /* (337) literal_list ::= signed_literal */
+ { 396, -3 }, /* (338) literal_list ::= literal_list NK_COMMA signed_literal */
+ { 330, -1 }, /* (339) db_name ::= NK_ID */
+ { 360, -1 }, /* (340) table_name ::= NK_ID */
+ { 352, -1 }, /* (341) column_name ::= NK_ID */
+ { 367, -1 }, /* (342) function_name ::= NK_ID */
+ { 397, -1 }, /* (343) table_alias ::= NK_ID */
+ { 375, -1 }, /* (344) column_alias ::= NK_ID */
+ { 324, -1 }, /* (345) user_name ::= NK_ID */
+ { 382, -1 }, /* (346) topic_name ::= NK_ID */
+ { 389, -1 }, /* (347) stream_name ::= NK_ID */
+ { 384, -1 }, /* (348) cgroup_name ::= NK_ID */
+ { 398, -1 }, /* (349) expr_or_subquery ::= expression */
+ { 398, -1 }, /* (350) expr_or_subquery ::= subquery */
+ { 391, -1 }, /* (351) expression ::= literal */
+ { 391, -1 }, /* (352) expression ::= pseudo_column */
+ { 391, -1 }, /* (353) expression ::= column_reference */
+ { 391, -1 }, /* (354) expression ::= function_expression */
+ { 391, -1 }, /* (355) expression ::= case_when_expression */
+ { 391, -3 }, /* (356) expression ::= NK_LP expression NK_RP */
+ { 391, -2 }, /* (357) expression ::= NK_PLUS expr_or_subquery */
+ { 391, -2 }, /* (358) expression ::= NK_MINUS expr_or_subquery */
+ { 391, -3 }, /* (359) expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
+ { 391, -3 }, /* (360) expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
+ { 391, -3 }, /* (361) expression ::= expr_or_subquery NK_STAR expr_or_subquery */
+ { 391, -3 }, /* (362) expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
+ { 391, -3 }, /* (363) expression ::= expr_or_subquery NK_REM expr_or_subquery */
+ { 391, -3 }, /* (364) expression ::= column_reference NK_ARROW NK_STRING */
+ { 391, -3 }, /* (365) expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
+ { 391, -3 }, /* (366) expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
+ { 357, -1 }, /* (367) expression_list ::= expr_or_subquery */
+ { 357, -3 }, /* (368) expression_list ::= expression_list NK_COMMA expr_or_subquery */
+ { 401, -1 }, /* (369) column_reference ::= column_name */
+ { 401, -3 }, /* (370) column_reference ::= table_name NK_DOT column_name */
+ { 400, -1 }, /* (371) pseudo_column ::= ROWTS */
+ { 400, -1 }, /* (372) pseudo_column ::= TBNAME */
+ { 400, -3 }, /* (373) pseudo_column ::= table_name NK_DOT TBNAME */
+ { 400, -1 }, /* (374) pseudo_column ::= QSTART */
+ { 400, -1 }, /* (375) pseudo_column ::= QEND */
+ { 400, -1 }, /* (376) pseudo_column ::= QDURATION */
+ { 400, -1 }, /* (377) pseudo_column ::= WSTART */
+ { 400, -1 }, /* (378) pseudo_column ::= WEND */
+ { 400, -1 }, /* (379) pseudo_column ::= WDURATION */
+ { 400, -1 }, /* (380) pseudo_column ::= IROWTS */
+ { 400, -1 }, /* (381) pseudo_column ::= QTAGS */
+ { 402, -4 }, /* (382) function_expression ::= function_name NK_LP expression_list NK_RP */
+ { 402, -4 }, /* (383) function_expression ::= star_func NK_LP star_func_para_list NK_RP */
+ { 402, -6 }, /* (384) function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
+ { 402, -1 }, /* (385) function_expression ::= literal_func */
+ { 395, -3 }, /* (386) literal_func ::= noarg_func NK_LP NK_RP */
+ { 395, -1 }, /* (387) literal_func ::= NOW */
+ { 406, -1 }, /* (388) noarg_func ::= NOW */
+ { 406, -1 }, /* (389) noarg_func ::= TODAY */
+ { 406, -1 }, /* (390) noarg_func ::= TIMEZONE */
+ { 406, -1 }, /* (391) noarg_func ::= DATABASE */
+ { 406, -1 }, /* (392) noarg_func ::= CLIENT_VERSION */
+ { 406, -1 }, /* (393) noarg_func ::= SERVER_VERSION */
+ { 406, -1 }, /* (394) noarg_func ::= SERVER_STATUS */
+ { 406, -1 }, /* (395) noarg_func ::= CURRENT_USER */
+ { 406, -1 }, /* (396) noarg_func ::= USER */
+ { 404, -1 }, /* (397) star_func ::= COUNT */
+ { 404, -1 }, /* (398) star_func ::= FIRST */
+ { 404, -1 }, /* (399) star_func ::= LAST */
+ { 404, -1 }, /* (400) star_func ::= LAST_ROW */
+ { 405, -1 }, /* (401) star_func_para_list ::= NK_STAR */
+ { 405, -1 }, /* (402) star_func_para_list ::= other_para_list */
+ { 407, -1 }, /* (403) other_para_list ::= star_func_para */
+ { 407, -3 }, /* (404) other_para_list ::= other_para_list NK_COMMA star_func_para */
+ { 408, -1 }, /* (405) star_func_para ::= expr_or_subquery */
+ { 408, -3 }, /* (406) star_func_para ::= table_name NK_DOT NK_STAR */
+ { 403, -4 }, /* (407) case_when_expression ::= CASE when_then_list case_when_else_opt END */
+ { 403, -5 }, /* (408) case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
+ { 409, -1 }, /* (409) when_then_list ::= when_then_expr */
+ { 409, -2 }, /* (410) when_then_list ::= when_then_list when_then_expr */
+ { 412, -4 }, /* (411) when_then_expr ::= WHEN common_expression THEN common_expression */
+ { 410, 0 }, /* (412) case_when_else_opt ::= */
+ { 410, -2 }, /* (413) case_when_else_opt ::= ELSE common_expression */
+ { 413, -3 }, /* (414) predicate ::= expr_or_subquery compare_op expr_or_subquery */
+ { 413, -5 }, /* (415) predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
+ { 413, -6 }, /* (416) predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
+ { 413, -3 }, /* (417) predicate ::= expr_or_subquery IS NULL */
+ { 413, -4 }, /* (418) predicate ::= expr_or_subquery IS NOT NULL */
+ { 413, -3 }, /* (419) predicate ::= expr_or_subquery in_op in_predicate_value */
+ { 414, -1 }, /* (420) compare_op ::= NK_LT */
+ { 414, -1 }, /* (421) compare_op ::= NK_GT */
+ { 414, -1 }, /* (422) compare_op ::= NK_LE */
+ { 414, -1 }, /* (423) compare_op ::= NK_GE */
+ { 414, -1 }, /* (424) compare_op ::= NK_NE */
+ { 414, -1 }, /* (425) compare_op ::= NK_EQ */
+ { 414, -1 }, /* (426) compare_op ::= LIKE */
+ { 414, -2 }, /* (427) compare_op ::= NOT LIKE */
+ { 414, -1 }, /* (428) compare_op ::= MATCH */
+ { 414, -1 }, /* (429) compare_op ::= NMATCH */
+ { 414, -1 }, /* (430) compare_op ::= CONTAINS */
+ { 415, -1 }, /* (431) in_op ::= IN */
+ { 415, -2 }, /* (432) in_op ::= NOT IN */
+ { 416, -3 }, /* (433) in_predicate_value ::= NK_LP literal_list NK_RP */
+ { 417, -1 }, /* (434) boolean_value_expression ::= boolean_primary */
+ { 417, -2 }, /* (435) boolean_value_expression ::= NOT boolean_primary */
+ { 417, -3 }, /* (436) boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
+ { 417, -3 }, /* (437) boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
+ { 418, -1 }, /* (438) boolean_primary ::= predicate */
+ { 418, -3 }, /* (439) boolean_primary ::= NK_LP boolean_value_expression NK_RP */
+ { 411, -1 }, /* (440) common_expression ::= expr_or_subquery */
+ { 411, -1 }, /* (441) common_expression ::= boolean_value_expression */
+ { 419, 0 }, /* (442) from_clause_opt ::= */
+ { 419, -2 }, /* (443) from_clause_opt ::= FROM table_reference_list */
+ { 420, -1 }, /* (444) table_reference_list ::= table_reference */
+ { 420, -3 }, /* (445) table_reference_list ::= table_reference_list NK_COMMA table_reference */
+ { 421, -1 }, /* (446) table_reference ::= table_primary */
+ { 421, -1 }, /* (447) table_reference ::= joined_table */
+ { 422, -2 }, /* (448) table_primary ::= table_name alias_opt */
+ { 422, -4 }, /* (449) table_primary ::= db_name NK_DOT table_name alias_opt */
+ { 422, -2 }, /* (450) table_primary ::= subquery alias_opt */
+ { 422, -1 }, /* (451) table_primary ::= parenthesized_joined_table */
+ { 424, 0 }, /* (452) alias_opt ::= */
+ { 424, -1 }, /* (453) alias_opt ::= table_alias */
+ { 424, -2 }, /* (454) alias_opt ::= AS table_alias */
+ { 425, -3 }, /* (455) parenthesized_joined_table ::= NK_LP joined_table NK_RP */
+ { 425, -3 }, /* (456) parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */
+ { 423, -6 }, /* (457) joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
+ { 426, 0 }, /* (458) join_type ::= */
+ { 426, -1 }, /* (459) join_type ::= INNER */
+ { 428, -12 }, /* (460) query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
+ { 429, 0 }, /* (461) set_quantifier_opt ::= */
+ { 429, -1 }, /* (462) set_quantifier_opt ::= DISTINCT */
+ { 429, -1 }, /* (463) set_quantifier_opt ::= ALL */
+ { 430, -1 }, /* (464) select_list ::= select_item */
+ { 430, -3 }, /* (465) select_list ::= select_list NK_COMMA select_item */
+ { 438, -1 }, /* (466) select_item ::= NK_STAR */
+ { 438, -1 }, /* (467) select_item ::= common_expression */
+ { 438, -2 }, /* (468) select_item ::= common_expression column_alias */
+ { 438, -3 }, /* (469) select_item ::= common_expression AS column_alias */
+ { 438, -3 }, /* (470) select_item ::= table_name NK_DOT NK_STAR */
+ { 393, 0 }, /* (471) where_clause_opt ::= */
+ { 393, -2 }, /* (472) where_clause_opt ::= WHERE search_condition */
+ { 431, 0 }, /* (473) partition_by_clause_opt ::= */
+ { 431, -3 }, /* (474) partition_by_clause_opt ::= PARTITION BY partition_list */
+ { 439, -1 }, /* (475) partition_list ::= partition_item */
+ { 439, -3 }, /* (476) partition_list ::= partition_list NK_COMMA partition_item */
+ { 440, -1 }, /* (477) partition_item ::= expr_or_subquery */
+ { 440, -2 }, /* (478) partition_item ::= expr_or_subquery column_alias */
+ { 440, -3 }, /* (479) partition_item ::= expr_or_subquery AS column_alias */
+ { 435, 0 }, /* (480) twindow_clause_opt ::= */
+ { 435, -6 }, /* (481) twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
+ { 435, -4 }, /* (482) twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
+ { 435, -6 }, /* (483) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
+ { 435, -8 }, /* (484) twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
+ { 378, 0 }, /* (485) sliding_opt ::= */
+ { 378, -4 }, /* (486) sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */
+ { 434, 0 }, /* (487) fill_opt ::= */
+ { 434, -4 }, /* (488) fill_opt ::= FILL NK_LP fill_mode NK_RP */
+ { 434, -6 }, /* (489) fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
+ { 441, -1 }, /* (490) fill_mode ::= NONE */
+ { 441, -1 }, /* (491) fill_mode ::= PREV */
+ { 441, -1 }, /* (492) fill_mode ::= NULL */
+ { 441, -1 }, /* (493) fill_mode ::= LINEAR */
+ { 441, -1 }, /* (494) fill_mode ::= NEXT */
+ { 436, 0 }, /* (495) group_by_clause_opt ::= */
+ { 436, -3 }, /* (496) group_by_clause_opt ::= GROUP BY group_by_list */
+ { 442, -1 }, /* (497) group_by_list ::= expr_or_subquery */
+ { 442, -3 }, /* (498) group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
+ { 437, 0 }, /* (499) having_clause_opt ::= */
+ { 437, -2 }, /* (500) having_clause_opt ::= HAVING search_condition */
+ { 432, 0 }, /* (501) range_opt ::= */
+ { 432, -6 }, /* (502) range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
+ { 433, 0 }, /* (503) every_opt ::= */
+ { 433, -4 }, /* (504) every_opt ::= EVERY NK_LP duration_literal NK_RP */
+ { 443, -4 }, /* (505) query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
+ { 444, -1 }, /* (506) query_simple ::= query_specification */
+ { 444, -1 }, /* (507) query_simple ::= union_query_expression */
+ { 448, -4 }, /* (508) union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
+ { 448, -3 }, /* (509) union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
+ { 449, -1 }, /* (510) query_simple_or_subquery ::= query_simple */
+ { 449, -1 }, /* (511) query_simple_or_subquery ::= subquery */
+ { 383, -1 }, /* (512) query_or_subquery ::= query_expression */
+ { 383, -1 }, /* (513) query_or_subquery ::= subquery */
+ { 445, 0 }, /* (514) order_by_clause_opt ::= */
+ { 445, -3 }, /* (515) order_by_clause_opt ::= ORDER BY sort_specification_list */
+ { 446, 0 }, /* (516) slimit_clause_opt ::= */
+ { 446, -2 }, /* (517) slimit_clause_opt ::= SLIMIT NK_INTEGER */
+ { 446, -4 }, /* (518) slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
+ { 446, -4 }, /* (519) slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ { 447, 0 }, /* (520) limit_clause_opt ::= */
+ { 447, -2 }, /* (521) limit_clause_opt ::= LIMIT NK_INTEGER */
+ { 447, -4 }, /* (522) limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */
+ { 447, -4 }, /* (523) limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ { 399, -3 }, /* (524) subquery ::= NK_LP query_expression NK_RP */
+ { 399, -3 }, /* (525) subquery ::= NK_LP subquery NK_RP */
+ { 427, -1 }, /* (526) search_condition ::= common_expression */
+ { 450, -1 }, /* (527) sort_specification_list ::= sort_specification */
+ { 450, -3 }, /* (528) sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */
+ { 451, -3 }, /* (529) sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
+ { 452, 0 }, /* (530) ordering_specification_opt ::= */
+ { 452, -1 }, /* (531) ordering_specification_opt ::= ASC */
+ { 452, -1 }, /* (532) ordering_specification_opt ::= DESC */
+ { 453, 0 }, /* (533) null_ordering_opt ::= */
+ { 453, -2 }, /* (534) null_ordering_opt ::= NULLS FIRST */
+ { 453, -2 }, /* (535) null_ordering_opt ::= NULLS LAST */
};
static void yy_accept(yyParser*); /* Forward Declaration */
@@ -3756,69 +3736,69 @@ static YYACTIONTYPE yy_reduce(
yy_destructor(yypParser,322,&yymsp[0].minor);
break;
case 24: /* cmd ::= CREATE USER user_name PASS NK_STRING sysinfo_opt */
-{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy481, &yymsp[-1].minor.yy0, yymsp[0].minor.yy607); }
+{ pCxt->pRootNode = createCreateUserStmt(pCxt, &yymsp[-3].minor.yy593, &yymsp[-1].minor.yy0, yymsp[0].minor.yy687); }
break;
case 25: /* cmd ::= ALTER USER user_name PASS NK_STRING */
-{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy481, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_PASSWD, &yymsp[0].minor.yy0); }
break;
case 26: /* cmd ::= ALTER USER user_name ENABLE NK_INTEGER */
-{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy481, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_ENABLE, &yymsp[0].minor.yy0); }
break;
case 27: /* cmd ::= ALTER USER user_name SYSINFO NK_INTEGER */
-{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy481, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createAlterUserStmt(pCxt, &yymsp[-2].minor.yy593, TSDB_ALTER_USER_SYSINFO, &yymsp[0].minor.yy0); }
break;
case 28: /* cmd ::= DROP USER user_name */
-{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createDropUserStmt(pCxt, &yymsp[0].minor.yy593); }
break;
case 29: /* sysinfo_opt ::= */
-{ yymsp[1].minor.yy607 = 1; }
+{ yymsp[1].minor.yy687 = 1; }
break;
case 30: /* sysinfo_opt ::= SYSINFO NK_INTEGER */
-{ yymsp[-1].minor.yy607 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); }
+{ yymsp[-1].minor.yy687 = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); }
break;
case 31: /* cmd ::= GRANT privileges ON priv_level TO user_name */
-{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy37, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createGrantStmt(pCxt, yymsp[-4].minor.yy577, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); }
break;
case 32: /* cmd ::= REVOKE privileges ON priv_level FROM user_name */
-{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy37, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createRevokeStmt(pCxt, yymsp[-4].minor.yy577, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); }
break;
case 33: /* privileges ::= ALL */
-{ yymsp[0].minor.yy37 = PRIVILEGE_TYPE_ALL; }
+{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_ALL; }
break;
case 34: /* privileges ::= priv_type_list */
case 35: /* priv_type_list ::= priv_type */ yytestcase(yyruleno==35);
-{ yylhsminor.yy37 = yymsp[0].minor.yy37; }
- yymsp[0].minor.yy37 = yylhsminor.yy37;
+{ yylhsminor.yy577 = yymsp[0].minor.yy577; }
+ yymsp[0].minor.yy577 = yylhsminor.yy577;
break;
case 36: /* priv_type_list ::= priv_type_list NK_COMMA priv_type */
-{ yylhsminor.yy37 = yymsp[-2].minor.yy37 | yymsp[0].minor.yy37; }
- yymsp[-2].minor.yy37 = yylhsminor.yy37;
+{ yylhsminor.yy577 = yymsp[-2].minor.yy577 | yymsp[0].minor.yy577; }
+ yymsp[-2].minor.yy577 = yylhsminor.yy577;
break;
case 37: /* priv_type ::= READ */
-{ yymsp[0].minor.yy37 = PRIVILEGE_TYPE_READ; }
+{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_READ; }
break;
case 38: /* priv_type ::= WRITE */
-{ yymsp[0].minor.yy37 = PRIVILEGE_TYPE_WRITE; }
+{ yymsp[0].minor.yy577 = PRIVILEGE_TYPE_WRITE; }
break;
case 39: /* priv_level ::= NK_STAR NK_DOT NK_STAR */
-{ yylhsminor.yy481 = yymsp[-2].minor.yy0; }
- yymsp[-2].minor.yy481 = yylhsminor.yy481;
+{ yylhsminor.yy593 = yymsp[-2].minor.yy0; }
+ yymsp[-2].minor.yy593 = yylhsminor.yy593;
break;
case 40: /* priv_level ::= db_name NK_DOT NK_STAR */
-{ yylhsminor.yy481 = yymsp[-2].minor.yy481; }
- yymsp[-2].minor.yy481 = yylhsminor.yy481;
+{ yylhsminor.yy593 = yymsp[-2].minor.yy593; }
+ yymsp[-2].minor.yy593 = yylhsminor.yy593;
break;
case 41: /* cmd ::= CREATE DNODE dnode_endpoint */
-{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy481, NULL); }
+{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[0].minor.yy593, NULL); }
break;
case 42: /* cmd ::= CREATE DNODE dnode_endpoint PORT NK_INTEGER */
-{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy0); }
+{ pCxt->pRootNode = createCreateDnodeStmt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0); }
break;
case 43: /* cmd ::= DROP DNODE NK_INTEGER force_opt */
-{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy777); }
+{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy193); }
break;
case 44: /* cmd ::= DROP DNODE dnode_endpoint force_opt */
-{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy481, yymsp[0].minor.yy777); }
+{ pCxt->pRootNode = createDropDnodeStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy193); }
break;
case 45: /* cmd ::= ALTER DNODE NK_INTEGER NK_STRING */
{ pCxt->pRootNode = createAlterDnodeStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, NULL); }
@@ -3835,45 +3815,45 @@ static YYACTIONTYPE yy_reduce(
case 49: /* dnode_endpoint ::= NK_STRING */
case 50: /* dnode_endpoint ::= NK_ID */ yytestcase(yyruleno==50);
case 51: /* dnode_endpoint ::= NK_IPTOKEN */ yytestcase(yyruleno==51);
- case 331: /* db_name ::= NK_ID */ yytestcase(yyruleno==331);
- case 332: /* table_name ::= NK_ID */ yytestcase(yyruleno==332);
- case 333: /* column_name ::= NK_ID */ yytestcase(yyruleno==333);
- case 334: /* function_name ::= NK_ID */ yytestcase(yyruleno==334);
- case 335: /* table_alias ::= NK_ID */ yytestcase(yyruleno==335);
- case 336: /* column_alias ::= NK_ID */ yytestcase(yyruleno==336);
- case 337: /* user_name ::= NK_ID */ yytestcase(yyruleno==337);
- case 338: /* topic_name ::= NK_ID */ yytestcase(yyruleno==338);
- case 339: /* stream_name ::= NK_ID */ yytestcase(yyruleno==339);
- case 340: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==340);
- case 380: /* noarg_func ::= NOW */ yytestcase(yyruleno==380);
- case 381: /* noarg_func ::= TODAY */ yytestcase(yyruleno==381);
- case 382: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==382);
- case 383: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==383);
- case 384: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==384);
- case 385: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==385);
- case 386: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==386);
- case 387: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==387);
- case 388: /* noarg_func ::= USER */ yytestcase(yyruleno==388);
- case 389: /* star_func ::= COUNT */ yytestcase(yyruleno==389);
- case 390: /* star_func ::= FIRST */ yytestcase(yyruleno==390);
- case 391: /* star_func ::= LAST */ yytestcase(yyruleno==391);
- case 392: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==392);
-{ yylhsminor.yy481 = yymsp[0].minor.yy0; }
- yymsp[0].minor.yy481 = yylhsminor.yy481;
+ case 339: /* db_name ::= NK_ID */ yytestcase(yyruleno==339);
+ case 340: /* table_name ::= NK_ID */ yytestcase(yyruleno==340);
+ case 341: /* column_name ::= NK_ID */ yytestcase(yyruleno==341);
+ case 342: /* function_name ::= NK_ID */ yytestcase(yyruleno==342);
+ case 343: /* table_alias ::= NK_ID */ yytestcase(yyruleno==343);
+ case 344: /* column_alias ::= NK_ID */ yytestcase(yyruleno==344);
+ case 345: /* user_name ::= NK_ID */ yytestcase(yyruleno==345);
+ case 346: /* topic_name ::= NK_ID */ yytestcase(yyruleno==346);
+ case 347: /* stream_name ::= NK_ID */ yytestcase(yyruleno==347);
+ case 348: /* cgroup_name ::= NK_ID */ yytestcase(yyruleno==348);
+ case 388: /* noarg_func ::= NOW */ yytestcase(yyruleno==388);
+ case 389: /* noarg_func ::= TODAY */ yytestcase(yyruleno==389);
+ case 390: /* noarg_func ::= TIMEZONE */ yytestcase(yyruleno==390);
+ case 391: /* noarg_func ::= DATABASE */ yytestcase(yyruleno==391);
+ case 392: /* noarg_func ::= CLIENT_VERSION */ yytestcase(yyruleno==392);
+ case 393: /* noarg_func ::= SERVER_VERSION */ yytestcase(yyruleno==393);
+ case 394: /* noarg_func ::= SERVER_STATUS */ yytestcase(yyruleno==394);
+ case 395: /* noarg_func ::= CURRENT_USER */ yytestcase(yyruleno==395);
+ case 396: /* noarg_func ::= USER */ yytestcase(yyruleno==396);
+ case 397: /* star_func ::= COUNT */ yytestcase(yyruleno==397);
+ case 398: /* star_func ::= FIRST */ yytestcase(yyruleno==398);
+ case 399: /* star_func ::= LAST */ yytestcase(yyruleno==399);
+ case 400: /* star_func ::= LAST_ROW */ yytestcase(yyruleno==400);
+{ yylhsminor.yy593 = yymsp[0].minor.yy0; }
+ yymsp[0].minor.yy593 = yylhsminor.yy593;
break;
case 52: /* force_opt ::= */
case 71: /* not_exists_opt ::= */ yytestcase(yyruleno==71);
case 73: /* exists_opt ::= */ yytestcase(yyruleno==73);
- case 271: /* analyze_opt ::= */ yytestcase(yyruleno==271);
- case 278: /* agg_func_opt ::= */ yytestcase(yyruleno==278);
- case 453: /* set_quantifier_opt ::= */ yytestcase(yyruleno==453);
-{ yymsp[1].minor.yy777 = false; }
+ case 279: /* analyze_opt ::= */ yytestcase(yyruleno==279);
+ case 286: /* agg_func_opt ::= */ yytestcase(yyruleno==286);
+ case 461: /* set_quantifier_opt ::= */ yytestcase(yyruleno==461);
+{ yymsp[1].minor.yy193 = false; }
break;
case 53: /* force_opt ::= FORCE */
- case 272: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==272);
- case 279: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==279);
- case 454: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==454);
-{ yymsp[0].minor.yy777 = true; }
+ case 280: /* analyze_opt ::= ANALYZE */ yytestcase(yyruleno==280);
+ case 287: /* agg_func_opt ::= AGGREGATE */ yytestcase(yyruleno==287);
+ case 462: /* set_quantifier_opt ::= DISTINCT */ yytestcase(yyruleno==462);
+{ yymsp[0].minor.yy193 = true; }
break;
case 54: /* cmd ::= ALTER LOCAL NK_STRING */
{ pCxt->pRootNode = createAlterLocalStmt(pCxt, &yymsp[0].minor.yy0, NULL); }
@@ -3906,213 +3886,213 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createDropComponentNodeStmt(pCxt, QUERY_NODE_DROP_MNODE_STMT, &yymsp[0].minor.yy0); }
break;
case 64: /* cmd ::= CREATE DATABASE not_exists_opt db_name db_options */
-{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy777, &yymsp[-1].minor.yy481, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createCreateDatabaseStmt(pCxt, yymsp[-2].minor.yy193, &yymsp[-1].minor.yy593, yymsp[0].minor.yy164); }
break;
case 65: /* cmd ::= DROP DATABASE exists_opt db_name */
-{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy777, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createDropDatabaseStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
break;
case 66: /* cmd ::= USE db_name */
-{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createUseDatabaseStmt(pCxt, &yymsp[0].minor.yy593); }
break;
case 67: /* cmd ::= ALTER DATABASE db_name alter_db_options */
-{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy481, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createAlterDatabaseStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy164); }
break;
case 68: /* cmd ::= FLUSH DATABASE db_name */
-{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createFlushDatabaseStmt(pCxt, &yymsp[0].minor.yy593); }
break;
case 69: /* cmd ::= TRIM DATABASE db_name speed_opt */
-{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy481, yymsp[0].minor.yy692); }
+{ pCxt->pRootNode = createTrimDatabaseStmt(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy512); }
break;
case 70: /* not_exists_opt ::= IF NOT EXISTS */
-{ yymsp[-2].minor.yy777 = true; }
+{ yymsp[-2].minor.yy193 = true; }
break;
case 72: /* exists_opt ::= IF EXISTS */
-{ yymsp[-1].minor.yy777 = true; }
+{ yymsp[-1].minor.yy193 = true; }
break;
case 74: /* db_options ::= */
-{ yymsp[1].minor.yy232 = createDefaultDatabaseOptions(pCxt); }
+{ yymsp[1].minor.yy164 = createDefaultDatabaseOptions(pCxt); }
break;
case 75: /* db_options ::= db_options BUFFER NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_BUFFER, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 76: /* db_options ::= db_options CACHEMODEL NK_STRING */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_CACHEMODEL, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 77: /* db_options ::= db_options CACHESIZE NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_CACHESIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 78: /* db_options ::= db_options COMP NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_COMP, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_COMP, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 79: /* db_options ::= db_options DURATION NK_INTEGER */
case 80: /* db_options ::= db_options DURATION NK_VARIABLE */ yytestcase(yyruleno==80);
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_DAYS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_DAYS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 81: /* db_options ::= db_options MAXROWS NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_MAXROWS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 82: /* db_options ::= db_options MINROWS NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_MINROWS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 83: /* db_options ::= db_options KEEP integer_list */
case 84: /* db_options ::= db_options KEEP variable_list */ yytestcase(yyruleno==84);
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_KEEP, yymsp[0].minor.yy288); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_KEEP, yymsp[0].minor.yy648); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 85: /* db_options ::= db_options PAGES NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_PAGES, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PAGES, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 86: /* db_options ::= db_options PAGESIZE NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PAGESIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 87: /* db_options ::= db_options TSDB_PAGESIZE NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TSDB_PAGESIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 88: /* db_options ::= db_options PRECISION NK_STRING */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_PRECISION, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 89: /* db_options ::= db_options REPLICA NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_REPLICA, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 90: /* db_options ::= db_options STRICT NK_STRING */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_STRICT, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_STRICT, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 91: /* db_options ::= db_options VGROUPS NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_VGROUPS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 92: /* db_options ::= db_options SINGLE_STABLE NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_SINGLE_STABLE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 93: /* db_options ::= db_options RETENTIONS retention_list */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_RETENTIONS, yymsp[0].minor.yy288); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_RETENTIONS, yymsp[0].minor.yy648); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 94: /* db_options ::= db_options SCHEMALESS NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_SCHEMALESS, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 95: /* db_options ::= db_options WAL_LEVEL NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_WAL, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 96: /* db_options ::= db_options WAL_FSYNC_PERIOD NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_FSYNC, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 97: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_RETENTION_PERIOD, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 98: /* db_options ::= db_options WAL_RETENTION_PERIOD NK_MINUS NK_INTEGER */
{
SToken t = yymsp[-1].minor.yy0;
t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z;
- yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-3].minor.yy232, DB_OPTION_WAL_RETENTION_PERIOD, &t);
+ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-3].minor.yy164, DB_OPTION_WAL_RETENTION_PERIOD, &t);
}
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
case 99: /* db_options ::= db_options WAL_RETENTION_SIZE NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_RETENTION_SIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 100: /* db_options ::= db_options WAL_RETENTION_SIZE NK_MINUS NK_INTEGER */
{
SToken t = yymsp[-1].minor.yy0;
t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z;
- yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-3].minor.yy232, DB_OPTION_WAL_RETENTION_SIZE, &t);
+ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-3].minor.yy164, DB_OPTION_WAL_RETENTION_SIZE, &t);
}
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
case 101: /* db_options ::= db_options WAL_ROLL_PERIOD NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_ROLL_PERIOD, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 102: /* db_options ::= db_options WAL_SEGMENT_SIZE NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_WAL_SEGMENT_SIZE, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 103: /* db_options ::= db_options STT_TRIGGER NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_STT_TRIGGER, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 104: /* db_options ::= db_options TABLE_PREFIX NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TABLE_PREFIX, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 105: /* db_options ::= db_options TABLE_SUFFIX NK_INTEGER */
-{ yylhsminor.yy232 = setDatabaseOption(pCxt, yymsp[-2].minor.yy232, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setDatabaseOption(pCxt, yymsp[-2].minor.yy164, DB_OPTION_TABLE_SUFFIX, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 106: /* alter_db_options ::= alter_db_option */
-{ yylhsminor.yy232 = createAlterDatabaseOptions(pCxt); yylhsminor.yy232 = setAlterDatabaseOption(pCxt, yylhsminor.yy232, &yymsp[0].minor.yy101); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterDatabaseOptions(pCxt); yylhsminor.yy164 = setAlterDatabaseOption(pCxt, yylhsminor.yy164, &yymsp[0].minor.yy213); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 107: /* alter_db_options ::= alter_db_options alter_db_option */
-{ yylhsminor.yy232 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy232, &yymsp[0].minor.yy101); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setAlterDatabaseOption(pCxt, yymsp[-1].minor.yy164, &yymsp[0].minor.yy213); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
case 108: /* alter_db_option ::= BUFFER NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_BUFFER; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 109: /* alter_db_option ::= CACHEMODEL NK_STRING */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_CACHEMODEL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 110: /* alter_db_option ::= CACHESIZE NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_CACHESIZE; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 111: /* alter_db_option ::= WAL_FSYNC_PERIOD NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_FSYNC; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 112: /* alter_db_option ::= KEEP integer_list */
case 113: /* alter_db_option ::= KEEP variable_list */ yytestcase(yyruleno==113);
-{ yymsp[-1].minor.yy101.type = DB_OPTION_KEEP; yymsp[-1].minor.yy101.pList = yymsp[0].minor.yy288; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_KEEP; yymsp[-1].minor.yy213.pList = yymsp[0].minor.yy648; }
break;
case 114: /* alter_db_option ::= PAGES NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_PAGES; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_PAGES; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 115: /* alter_db_option ::= REPLICA NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_REPLICA; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 116: /* alter_db_option ::= STRICT NK_STRING */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_STRICT; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_STRICT; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 117: /* alter_db_option ::= WAL_LEVEL NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_WAL; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_WAL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 118: /* alter_db_option ::= STT_TRIGGER NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = DB_OPTION_STT_TRIGGER; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 119: /* integer_list ::= NK_INTEGER */
-{ yylhsminor.yy288 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
+{ yylhsminor.yy648 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
break;
case 120: /* integer_list ::= integer_list NK_COMMA NK_INTEGER */
- case 301: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==301);
-{ yylhsminor.yy288 = addNodeToList(pCxt, yymsp[-2].minor.yy288, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
- yymsp[-2].minor.yy288 = yylhsminor.yy288;
+ case 309: /* dnode_list ::= dnode_list DNODE NK_INTEGER */ yytestcase(yyruleno==309);
+{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
+ yymsp[-2].minor.yy648 = yylhsminor.yy648;
break;
case 121: /* variable_list ::= NK_VARIABLE */
-{ yylhsminor.yy288 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
+{ yylhsminor.yy648 = createNodeList(pCxt, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
break;
case 122: /* variable_list ::= variable_list NK_COMMA NK_VARIABLE */
-{ yylhsminor.yy288 = addNodeToList(pCxt, yymsp[-2].minor.yy288, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[-2].minor.yy288 = yylhsminor.yy288;
+{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[-2].minor.yy648 = yylhsminor.yy648;
break;
case 123: /* retention_list ::= retention */
case 145: /* multi_create_clause ::= create_subtable_clause */ yytestcase(yyruleno==145);
@@ -4120,279 +4100,284 @@ static YYACTIONTYPE yy_reduce(
case 155: /* column_def_list ::= column_def */ yytestcase(yyruleno==155);
case 198: /* rollup_func_list ::= rollup_func_name */ yytestcase(yyruleno==198);
case 203: /* col_name_list ::= col_name */ yytestcase(yyruleno==203);
- case 254: /* func_list ::= func */ yytestcase(yyruleno==254);
- case 329: /* literal_list ::= signed_literal */ yytestcase(yyruleno==329);
- case 395: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==395);
- case 401: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==401);
- case 456: /* select_list ::= select_item */ yytestcase(yyruleno==456);
- case 467: /* partition_list ::= partition_item */ yytestcase(yyruleno==467);
- case 519: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==519);
-{ yylhsminor.yy288 = createNodeList(pCxt, yymsp[0].minor.yy232); }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
+ case 251: /* tag_list_opt ::= tag_item */ yytestcase(yyruleno==251);
+ case 262: /* func_list ::= func */ yytestcase(yyruleno==262);
+ case 337: /* literal_list ::= signed_literal */ yytestcase(yyruleno==337);
+ case 403: /* other_para_list ::= star_func_para */ yytestcase(yyruleno==403);
+ case 409: /* when_then_list ::= when_then_expr */ yytestcase(yyruleno==409);
+ case 464: /* select_list ::= select_item */ yytestcase(yyruleno==464);
+ case 475: /* partition_list ::= partition_item */ yytestcase(yyruleno==475);
+ case 527: /* sort_specification_list ::= sort_specification */ yytestcase(yyruleno==527);
+{ yylhsminor.yy648 = createNodeList(pCxt, yymsp[0].minor.yy164); }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
break;
case 124: /* retention_list ::= retention_list NK_COMMA retention */
case 156: /* column_def_list ::= column_def_list NK_COMMA column_def */ yytestcase(yyruleno==156);
case 199: /* rollup_func_list ::= rollup_func_list NK_COMMA rollup_func_name */ yytestcase(yyruleno==199);
case 204: /* col_name_list ::= col_name_list NK_COMMA col_name */ yytestcase(yyruleno==204);
- case 255: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==255);
- case 330: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==330);
- case 396: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==396);
- case 457: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==457);
- case 468: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==468);
- case 520: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==520);
-{ yylhsminor.yy288 = addNodeToList(pCxt, yymsp[-2].minor.yy288, yymsp[0].minor.yy232); }
- yymsp[-2].minor.yy288 = yylhsminor.yy288;
+ case 252: /* tag_list_opt ::= tag_list_opt NK_COMMA tag_item */ yytestcase(yyruleno==252);
+ case 263: /* func_list ::= func_list NK_COMMA func */ yytestcase(yyruleno==263);
+ case 338: /* literal_list ::= literal_list NK_COMMA signed_literal */ yytestcase(yyruleno==338);
+ case 404: /* other_para_list ::= other_para_list NK_COMMA star_func_para */ yytestcase(yyruleno==404);
+ case 465: /* select_list ::= select_list NK_COMMA select_item */ yytestcase(yyruleno==465);
+ case 476: /* partition_list ::= partition_list NK_COMMA partition_item */ yytestcase(yyruleno==476);
+ case 528: /* sort_specification_list ::= sort_specification_list NK_COMMA sort_specification */ yytestcase(yyruleno==528);
+{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); }
+ yymsp[-2].minor.yy648 = yylhsminor.yy648;
break;
case 125: /* retention ::= NK_VARIABLE NK_COLON NK_VARIABLE */
-{ yylhsminor.yy232 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createNodeListNodeEx(pCxt, createDurationValueNode(pCxt, &yymsp[-2].minor.yy0), createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 126: /* speed_opt ::= */
- case 280: /* bufsize_opt ::= */ yytestcase(yyruleno==280);
-{ yymsp[1].minor.yy692 = 0; }
+ case 288: /* bufsize_opt ::= */ yytestcase(yyruleno==288);
+{ yymsp[1].minor.yy512 = 0; }
break;
case 127: /* speed_opt ::= MAX_SPEED NK_INTEGER */
- case 281: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==281);
-{ yymsp[-1].minor.yy692 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); }
+ case 289: /* bufsize_opt ::= BUFSIZE NK_INTEGER */ yytestcase(yyruleno==289);
+{ yymsp[-1].minor.yy512 = taosStr2Int32(yymsp[0].minor.yy0.z, NULL, 10); }
break;
case 128: /* cmd ::= CREATE TABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def_opt table_options */
case 130: /* cmd ::= CREATE STABLE not_exists_opt full_table_name NK_LP column_def_list NK_RP tags_def table_options */ yytestcase(yyruleno==130);
-{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy777, yymsp[-5].minor.yy232, yymsp[-3].minor.yy288, yymsp[-1].minor.yy288, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createCreateTableStmt(pCxt, yymsp[-6].minor.yy193, yymsp[-5].minor.yy164, yymsp[-3].minor.yy648, yymsp[-1].minor.yy648, yymsp[0].minor.yy164); }
break;
case 129: /* cmd ::= CREATE TABLE multi_create_clause */
-{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy288); }
+{ pCxt->pRootNode = createCreateMultiTableStmt(pCxt, yymsp[0].minor.yy648); }
break;
case 131: /* cmd ::= DROP TABLE multi_drop_clause */
-{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy288); }
+{ pCxt->pRootNode = createDropTableStmt(pCxt, yymsp[0].minor.yy648); }
break;
case 132: /* cmd ::= DROP STABLE exists_opt full_table_name */
-{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy777, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createDropSuperTableStmt(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); }
break;
case 133: /* cmd ::= ALTER TABLE alter_table_clause */
- case 303: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==303);
-{ pCxt->pRootNode = yymsp[0].minor.yy232; }
+ case 311: /* cmd ::= query_or_subquery */ yytestcase(yyruleno==311);
+{ pCxt->pRootNode = yymsp[0].minor.yy164; }
break;
case 134: /* cmd ::= ALTER STABLE alter_table_clause */
-{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = setAlterSuperTableType(yymsp[0].minor.yy164); }
break;
case 135: /* alter_table_clause ::= full_table_name alter_table_options */
-{ yylhsminor.yy232 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableModifyOptions(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
case 136: /* alter_table_clause ::= full_table_name ADD COLUMN column_name type_name */
-{ yylhsminor.yy232 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy232, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy481, yymsp[0].minor.yy264); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_ADD_COLUMN, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 137: /* alter_table_clause ::= full_table_name DROP COLUMN column_name */
-{ yylhsminor.yy232 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy232, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy481); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy164, TSDB_ALTER_TABLE_DROP_COLUMN, &yymsp[0].minor.yy593); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
case 138: /* alter_table_clause ::= full_table_name MODIFY COLUMN column_name type_name */
-{ yylhsminor.yy232 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy232, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy481, yymsp[0].minor.yy264); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_COLUMN_BYTES, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 139: /* alter_table_clause ::= full_table_name RENAME COLUMN column_name column_name */
-{ yylhsminor.yy232 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy232, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy481, &yymsp[0].minor.yy481); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_COLUMN_NAME, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 140: /* alter_table_clause ::= full_table_name ADD TAG column_name type_name */
-{ yylhsminor.yy232 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy232, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy481, yymsp[0].minor.yy264); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_ADD_TAG, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 141: /* alter_table_clause ::= full_table_name DROP TAG column_name */
-{ yylhsminor.yy232 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy232, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy481); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableDropCol(pCxt, yymsp[-3].minor.yy164, TSDB_ALTER_TABLE_DROP_TAG, &yymsp[0].minor.yy593); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
case 142: /* alter_table_clause ::= full_table_name MODIFY TAG column_name type_name */
-{ yylhsminor.yy232 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy232, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy481, yymsp[0].minor.yy264); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableAddModifyCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_TAG_BYTES, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 143: /* alter_table_clause ::= full_table_name RENAME TAG column_name column_name */
-{ yylhsminor.yy232 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy232, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy481, &yymsp[0].minor.yy481); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableRenameCol(pCxt, yymsp[-4].minor.yy164, TSDB_ALTER_TABLE_UPDATE_TAG_NAME, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 144: /* alter_table_clause ::= full_table_name SET TAG column_name NK_EQ signed_literal */
-{ yylhsminor.yy232 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy232, &yymsp[-2].minor.yy481, yymsp[0].minor.yy232); }
- yymsp[-5].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableSetTag(pCxt, yymsp[-5].minor.yy164, &yymsp[-2].minor.yy593, yymsp[0].minor.yy164); }
+ yymsp[-5].minor.yy164 = yylhsminor.yy164;
break;
case 146: /* multi_create_clause ::= multi_create_clause create_subtable_clause */
case 149: /* multi_drop_clause ::= multi_drop_clause drop_table_clause */ yytestcase(yyruleno==149);
- case 402: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==402);
-{ yylhsminor.yy288 = addNodeToList(pCxt, yymsp[-1].minor.yy288, yymsp[0].minor.yy232); }
- yymsp[-1].minor.yy288 = yylhsminor.yy288;
+ case 410: /* when_then_list ::= when_then_list when_then_expr */ yytestcase(yyruleno==410);
+{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-1].minor.yy648, yymsp[0].minor.yy164); }
+ yymsp[-1].minor.yy648 = yylhsminor.yy648;
break;
case 147: /* create_subtable_clause ::= not_exists_opt full_table_name USING full_table_name specific_cols_opt TAGS NK_LP expression_list NK_RP table_options */
-{ yylhsminor.yy232 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy777, yymsp[-8].minor.yy232, yymsp[-6].minor.yy232, yymsp[-5].minor.yy288, yymsp[-2].minor.yy288, yymsp[0].minor.yy232); }
- yymsp[-9].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createCreateSubTableClause(pCxt, yymsp[-9].minor.yy193, yymsp[-8].minor.yy164, yymsp[-6].minor.yy164, yymsp[-5].minor.yy648, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); }
+ yymsp[-9].minor.yy164 = yylhsminor.yy164;
break;
case 150: /* drop_table_clause ::= exists_opt full_table_name */
-{ yylhsminor.yy232 = createDropTableClause(pCxt, yymsp[-1].minor.yy777, yymsp[0].minor.yy232); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createDropTableClause(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
case 151: /* specific_cols_opt ::= */
case 182: /* tags_def_opt ::= */ yytestcase(yyruleno==182);
- case 465: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==465);
- case 487: /* group_by_clause_opt ::= */ yytestcase(yyruleno==487);
- case 506: /* order_by_clause_opt ::= */ yytestcase(yyruleno==506);
-{ yymsp[1].minor.yy288 = NULL; }
+ case 250: /* tag_list_opt ::= */ yytestcase(yyruleno==250);
+ case 473: /* partition_by_clause_opt ::= */ yytestcase(yyruleno==473);
+ case 495: /* group_by_clause_opt ::= */ yytestcase(yyruleno==495);
+ case 514: /* order_by_clause_opt ::= */ yytestcase(yyruleno==514);
+{ yymsp[1].minor.yy648 = NULL; }
break;
case 152: /* specific_cols_opt ::= NK_LP col_name_list NK_RP */
-{ yymsp[-2].minor.yy288 = yymsp[-1].minor.yy288; }
+{ yymsp[-2].minor.yy648 = yymsp[-1].minor.yy648; }
break;
case 153: /* full_table_name ::= table_name */
-{ yylhsminor.yy232 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy481, NULL); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createRealTableNode(pCxt, NULL, &yymsp[0].minor.yy593, NULL); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 154: /* full_table_name ::= db_name NK_DOT table_name */
-{ yylhsminor.yy232 = createRealTableNode(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy481, NULL); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createRealTableNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593, NULL); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 157: /* column_def ::= column_name type_name */
-{ yylhsminor.yy232 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy481, yymsp[0].minor.yy264, NULL); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createColumnDefNode(pCxt, &yymsp[-1].minor.yy593, yymsp[0].minor.yy720, NULL); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
case 158: /* column_def ::= column_name type_name COMMENT NK_STRING */
-{ yylhsminor.yy232 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy481, yymsp[-2].minor.yy264, &yymsp[0].minor.yy0); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createColumnDefNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-2].minor.yy720, &yymsp[0].minor.yy0); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
case 159: /* type_name ::= BOOL */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_BOOL); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BOOL); }
break;
case 160: /* type_name ::= TINYINT */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_TINYINT); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_TINYINT); }
break;
case 161: /* type_name ::= SMALLINT */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_SMALLINT); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_SMALLINT); }
break;
case 162: /* type_name ::= INT */
case 163: /* type_name ::= INTEGER */ yytestcase(yyruleno==163);
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_INT); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_INT); }
break;
case 164: /* type_name ::= BIGINT */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_BIGINT); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BIGINT); }
break;
case 165: /* type_name ::= FLOAT */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_FLOAT); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_FLOAT); }
break;
case 166: /* type_name ::= DOUBLE */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_DOUBLE); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_DOUBLE); }
break;
case 167: /* type_name ::= BINARY NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy264 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); }
+{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_BINARY, &yymsp[-1].minor.yy0); }
break;
case 168: /* type_name ::= TIMESTAMP */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_TIMESTAMP); }
break;
case 169: /* type_name ::= NCHAR NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy264 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); }
+{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_NCHAR, &yymsp[-1].minor.yy0); }
break;
case 170: /* type_name ::= TINYINT UNSIGNED */
-{ yymsp[-1].minor.yy264 = createDataType(TSDB_DATA_TYPE_UTINYINT); }
+{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UTINYINT); }
break;
case 171: /* type_name ::= SMALLINT UNSIGNED */
-{ yymsp[-1].minor.yy264 = createDataType(TSDB_DATA_TYPE_USMALLINT); }
+{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_USMALLINT); }
break;
case 172: /* type_name ::= INT UNSIGNED */
-{ yymsp[-1].minor.yy264 = createDataType(TSDB_DATA_TYPE_UINT); }
+{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UINT); }
break;
case 173: /* type_name ::= BIGINT UNSIGNED */
-{ yymsp[-1].minor.yy264 = createDataType(TSDB_DATA_TYPE_UBIGINT); }
+{ yymsp[-1].minor.yy720 = createDataType(TSDB_DATA_TYPE_UBIGINT); }
break;
case 174: /* type_name ::= JSON */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_JSON); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_JSON); }
break;
case 175: /* type_name ::= VARCHAR NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy264 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); }
+{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_VARCHAR, &yymsp[-1].minor.yy0); }
break;
case 176: /* type_name ::= MEDIUMBLOB */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_MEDIUMBLOB); }
break;
case 177: /* type_name ::= BLOB */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_BLOB); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_BLOB); }
break;
case 178: /* type_name ::= VARBINARY NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy264 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); }
+{ yymsp[-3].minor.yy720 = createVarLenDataType(TSDB_DATA_TYPE_VARBINARY, &yymsp[-1].minor.yy0); }
break;
case 179: /* type_name ::= DECIMAL */
-{ yymsp[0].minor.yy264 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
+{ yymsp[0].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
break;
case 180: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_RP */
-{ yymsp[-3].minor.yy264 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
+{ yymsp[-3].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
break;
case 181: /* type_name ::= DECIMAL NK_LP NK_INTEGER NK_COMMA NK_INTEGER NK_RP */
-{ yymsp[-5].minor.yy264 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
+{ yymsp[-5].minor.yy720 = createDataType(TSDB_DATA_TYPE_DECIMAL); }
break;
case 183: /* tags_def_opt ::= tags_def */
- case 394: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==394);
-{ yylhsminor.yy288 = yymsp[0].minor.yy288; }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
+ case 402: /* star_func_para_list ::= other_para_list */ yytestcase(yyruleno==402);
+{ yylhsminor.yy648 = yymsp[0].minor.yy648; }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
break;
case 184: /* tags_def ::= TAGS NK_LP column_def_list NK_RP */
-{ yymsp[-3].minor.yy288 = yymsp[-1].minor.yy288; }
+{ yymsp[-3].minor.yy648 = yymsp[-1].minor.yy648; }
break;
case 185: /* table_options ::= */
-{ yymsp[1].minor.yy232 = createDefaultTableOptions(pCxt); }
+{ yymsp[1].minor.yy164 = createDefaultTableOptions(pCxt); }
break;
case 186: /* table_options ::= table_options COMMENT NK_STRING */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-2].minor.yy232, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_COMMENT, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 187: /* table_options ::= table_options MAX_DELAY duration_list */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-2].minor.yy232, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy288); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_MAXDELAY, yymsp[0].minor.yy648); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 188: /* table_options ::= table_options WATERMARK duration_list */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-2].minor.yy232, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy288); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_WATERMARK, yymsp[0].minor.yy648); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 189: /* table_options ::= table_options ROLLUP NK_LP rollup_func_list NK_RP */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-4].minor.yy232, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy288); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-4].minor.yy164, TABLE_OPTION_ROLLUP, yymsp[-1].minor.yy648); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 190: /* table_options ::= table_options TTL NK_INTEGER */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-2].minor.yy232, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-2].minor.yy164, TABLE_OPTION_TTL, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
case 191: /* table_options ::= table_options SMA NK_LP col_name_list NK_RP */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-4].minor.yy232, TABLE_OPTION_SMA, yymsp[-1].minor.yy288); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-4].minor.yy164, TABLE_OPTION_SMA, yymsp[-1].minor.yy648); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
case 192: /* alter_table_options ::= alter_table_option */
-{ yylhsminor.yy232 = createAlterTableOptions(pCxt); yylhsminor.yy232 = setTableOption(pCxt, yylhsminor.yy232, yymsp[0].minor.yy101.type, &yymsp[0].minor.yy101.val); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createAlterTableOptions(pCxt); yylhsminor.yy164 = setTableOption(pCxt, yylhsminor.yy164, yymsp[0].minor.yy213.type, &yymsp[0].minor.yy213.val); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 193: /* alter_table_options ::= alter_table_options alter_table_option */
-{ yylhsminor.yy232 = setTableOption(pCxt, yymsp[-1].minor.yy232, yymsp[0].minor.yy101.type, &yymsp[0].minor.yy101.val); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = setTableOption(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy213.type, &yymsp[0].minor.yy213.val); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
case 194: /* alter_table_option ::= COMMENT NK_STRING */
-{ yymsp[-1].minor.yy101.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = TABLE_OPTION_COMMENT; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 195: /* alter_table_option ::= TTL NK_INTEGER */
-{ yymsp[-1].minor.yy101.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy101.val = yymsp[0].minor.yy0; }
+{ yymsp[-1].minor.yy213.type = TABLE_OPTION_TTL; yymsp[-1].minor.yy213.val = yymsp[0].minor.yy0; }
break;
case 196: /* duration_list ::= duration_literal */
- case 359: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==359);
-{ yylhsminor.yy288 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy232)); }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
+ case 367: /* expression_list ::= expr_or_subquery */ yytestcase(yyruleno==367);
+{ yylhsminor.yy648 = createNodeList(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
break;
case 197: /* duration_list ::= duration_list NK_COMMA duration_literal */
- case 360: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==360);
-{ yylhsminor.yy288 = addNodeToList(pCxt, yymsp[-2].minor.yy288, releaseRawExprNode(pCxt, yymsp[0].minor.yy232)); }
- yymsp[-2].minor.yy288 = yylhsminor.yy288;
+ case 368: /* expression_list ::= expression_list NK_COMMA expr_or_subquery */ yytestcase(yyruleno==368);
+{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); }
+ yymsp[-2].minor.yy648 = yylhsminor.yy648;
break;
case 200: /* rollup_func_name ::= function_name */
-{ yylhsminor.yy232 = createFunctionNode(pCxt, &yymsp[0].minor.yy481, NULL); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[0].minor.yy593, NULL); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 201: /* rollup_func_name ::= FIRST */
case 202: /* rollup_func_name ::= LAST */ yytestcase(yyruleno==202);
-{ yylhsminor.yy232 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+ case 254: /* tag_item ::= QTAGS */ yytestcase(yyruleno==254);
+{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 205: /* col_name ::= column_name */
-{ yylhsminor.yy232 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy481); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+ case 255: /* tag_item ::= column_name */ yytestcase(yyruleno==255);
+{ yylhsminor.yy164 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy593); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 206: /* cmd ::= SHOW DNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DNODES_STMT); }
@@ -4404,13 +4389,13 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_DATABASES_STMT); }
break;
case 209: /* cmd ::= SHOW db_name_cond_opt TABLES like_pattern_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy232, yymsp[0].minor.yy232, OP_TYPE_LIKE); }
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLES_STMT, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, OP_TYPE_LIKE); }
break;
case 210: /* cmd ::= SHOW db_name_cond_opt STABLES like_pattern_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy232, yymsp[0].minor.yy232, OP_TYPE_LIKE); }
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_STABLES_STMT, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, OP_TYPE_LIKE); }
break;
case 211: /* cmd ::= SHOW db_name_cond_opt VGROUPS */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy232, NULL, OP_TYPE_LIKE); }
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_VGROUPS_STMT, yymsp[-1].minor.yy164, NULL, OP_TYPE_LIKE); }
break;
case 212: /* cmd ::= SHOW MNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_MNODES_STMT); }
@@ -4422,7 +4407,7 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_FUNCTIONS_STMT); }
break;
case 215: /* cmd ::= SHOW INDEXES FROM table_name_cond from_db_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy232, yymsp[-1].minor.yy232, OP_TYPE_EQUAL); }
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_INDEXES_STMT, yymsp[0].minor.yy164, yymsp[-1].minor.yy164, OP_TYPE_EQUAL); }
break;
case 216: /* cmd ::= SHOW STREAMS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_STREAMS_STMT); }
@@ -4441,13 +4426,13 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LICENCES_STMT); }
break;
case 222: /* cmd ::= SHOW CREATE DATABASE db_name */
-{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy481); }
+{ pCxt->pRootNode = createShowCreateDatabaseStmt(pCxt, &yymsp[0].minor.yy593); }
break;
case 223: /* cmd ::= SHOW CREATE TABLE full_table_name */
-{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_TABLE_STMT, yymsp[0].minor.yy164); }
break;
case 224: /* cmd ::= SHOW CREATE STABLE full_table_name */
-{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createShowCreateTableStmt(pCxt, QUERY_NODE_SHOW_CREATE_STABLE_STMT, yymsp[0].minor.yy164); }
break;
case 225: /* cmd ::= SHOW QUERIES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_QUERIES_STMT); }
@@ -4466,7 +4451,7 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_LOCAL_VARIABLES_STMT); }
break;
case 231: /* cmd ::= SHOW DNODE NK_INTEGER VARIABLES like_pattern_opt */
-{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createShowDnodeVariablesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[-2].minor.yy0), yymsp[0].minor.yy164); }
break;
case 232: /* cmd ::= SHOW BNODES */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_BNODES_STMT); }
@@ -4481,7 +4466,7 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_TRANSACTIONS_STMT); }
break;
case 236: /* cmd ::= SHOW TABLE DISTRIBUTED full_table_name */
-{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy232); }
+{ pCxt->pRootNode = createShowTableDistributedStmt(pCxt, yymsp[0].minor.yy164); }
break;
case 237: /* cmd ::= SHOW CONSUMERS */
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_CONSUMERS_STMT); }
@@ -4490,10 +4475,10 @@ static YYACTIONTYPE yy_reduce(
{ pCxt->pRootNode = createShowStmt(pCxt, QUERY_NODE_SHOW_SUBSCRIPTIONS_STMT); }
break;
case 239: /* cmd ::= SHOW TAGS FROM table_name_cond from_db_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy232, yymsp[-1].minor.yy232, OP_TYPE_EQUAL); }
+{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TAGS_STMT, yymsp[0].minor.yy164, yymsp[-1].minor.yy164, OP_TYPE_EQUAL); }
break;
- case 240: /* cmd ::= SHOW TABLE TAGS FROM table_name_cond from_db_opt */
-{ pCxt->pRootNode = createShowStmtWithCond(pCxt, QUERY_NODE_SHOW_TABLE_TAGS_STMT, yymsp[0].minor.yy232, yymsp[-1].minor.yy232, OP_TYPE_EQUAL); }
+ case 240: /* cmd ::= SHOW TABLE TAGS tag_list_opt FROM table_name_cond from_db_opt */
+{ pCxt->pRootNode = createShowTableTagsStmt(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164, yymsp[-3].minor.yy648); }
break;
case 241: /* cmd ::= SHOW VNODES NK_INTEGER */
{ pCxt->pRootNode = createShowVnodesStmt(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0), NULL); }
@@ -4503,722 +4488,734 @@ static YYACTIONTYPE yy_reduce(
break;
case 243: /* db_name_cond_opt ::= */
case 248: /* from_db_opt ::= */ yytestcase(yyruleno==248);
-{ yymsp[1].minor.yy232 = createDefaultDatabaseCondValue(pCxt); }
+{ yymsp[1].minor.yy164 = createDefaultDatabaseCondValue(pCxt); }
break;
case 244: /* db_name_cond_opt ::= db_name NK_DOT */
-{ yylhsminor.yy232 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy481); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createIdentifierValueNode(pCxt, &yymsp[-1].minor.yy593); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
case 245: /* like_pattern_opt ::= */
- case 291: /* subtable_opt ::= */ yytestcase(yyruleno==291);
- case 404: /* case_when_else_opt ::= */ yytestcase(yyruleno==404);
- case 434: /* from_clause_opt ::= */ yytestcase(yyruleno==434);
- case 463: /* where_clause_opt ::= */ yytestcase(yyruleno==463);
- case 472: /* twindow_clause_opt ::= */ yytestcase(yyruleno==472);
- case 477: /* sliding_opt ::= */ yytestcase(yyruleno==477);
- case 479: /* fill_opt ::= */ yytestcase(yyruleno==479);
- case 491: /* having_clause_opt ::= */ yytestcase(yyruleno==491);
- case 493: /* range_opt ::= */ yytestcase(yyruleno==493);
- case 495: /* every_opt ::= */ yytestcase(yyruleno==495);
- case 508: /* slimit_clause_opt ::= */ yytestcase(yyruleno==508);
- case 512: /* limit_clause_opt ::= */ yytestcase(yyruleno==512);
-{ yymsp[1].minor.yy232 = NULL; }
+ case 299: /* subtable_opt ::= */ yytestcase(yyruleno==299);
+ case 412: /* case_when_else_opt ::= */ yytestcase(yyruleno==412);
+ case 442: /* from_clause_opt ::= */ yytestcase(yyruleno==442);
+ case 471: /* where_clause_opt ::= */ yytestcase(yyruleno==471);
+ case 480: /* twindow_clause_opt ::= */ yytestcase(yyruleno==480);
+ case 485: /* sliding_opt ::= */ yytestcase(yyruleno==485);
+ case 487: /* fill_opt ::= */ yytestcase(yyruleno==487);
+ case 499: /* having_clause_opt ::= */ yytestcase(yyruleno==499);
+ case 501: /* range_opt ::= */ yytestcase(yyruleno==501);
+ case 503: /* every_opt ::= */ yytestcase(yyruleno==503);
+ case 516: /* slimit_clause_opt ::= */ yytestcase(yyruleno==516);
+ case 520: /* limit_clause_opt ::= */ yytestcase(yyruleno==520);
+{ yymsp[1].minor.yy164 = NULL; }
break;
case 246: /* like_pattern_opt ::= LIKE NK_STRING */
-{ yymsp[-1].minor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
+{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
break;
case 247: /* table_name_cond ::= table_name */
-{ yylhsminor.yy232 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy481); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+{ yylhsminor.yy164 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy593); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
case 249: /* from_db_opt ::= FROM db_name */
-{ yymsp[-1].minor.yy232 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy481); }
+{ yymsp[-1].minor.yy164 = createIdentifierValueNode(pCxt, &yymsp[0].minor.yy593); }
+ break;
+ case 253: /* tag_item ::= TBNAME */
+{ yylhsminor.yy164 = setProjectionAlias(pCxt, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL), &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 256: /* tag_item ::= column_name column_alias */
+{ yylhsminor.yy164 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-1].minor.yy593), &yymsp[0].minor.yy593); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 257: /* tag_item ::= column_name AS column_alias */
+{ yylhsminor.yy164 = setProjectionAlias(pCxt, createColumnNode(pCxt, NULL, &yymsp[-2].minor.yy593), &yymsp[0].minor.yy593); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 250: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */
-{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy777, yymsp[-3].minor.yy232, yymsp[-1].minor.yy232, NULL, yymsp[0].minor.yy232); }
+ case 258: /* cmd ::= CREATE SMA INDEX not_exists_opt full_table_name ON full_table_name index_options */
+{ pCxt->pRootNode = createCreateIndexStmt(pCxt, INDEX_TYPE_SMA, yymsp[-4].minor.yy193, yymsp[-3].minor.yy164, yymsp[-1].minor.yy164, NULL, yymsp[0].minor.yy164); }
break;
- case 251: /* cmd ::= DROP INDEX exists_opt full_table_name */
-{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy777, yymsp[0].minor.yy232); }
+ case 259: /* cmd ::= DROP INDEX exists_opt full_table_name */
+{ pCxt->pRootNode = createDropIndexStmt(pCxt, yymsp[-1].minor.yy193, yymsp[0].minor.yy164); }
break;
- case 252: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
-{ yymsp[-9].minor.yy232 = createIndexOption(pCxt, yymsp[-7].minor.yy288, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), NULL, yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
+ case 260: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_RP sliding_opt sma_stream_opt */
+{ yymsp[-9].minor.yy164 = createIndexOption(pCxt, yymsp[-7].minor.yy648, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
break;
- case 253: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */
-{ yymsp[-11].minor.yy232 = createIndexOption(pCxt, yymsp[-9].minor.yy288, releaseRawExprNode(pCxt, yymsp[-5].minor.yy232), releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
+ case 261: /* index_options ::= FUNCTION NK_LP func_list NK_RP INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt sma_stream_opt */
+{ yymsp[-11].minor.yy164 = createIndexOption(pCxt, yymsp[-9].minor.yy648, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
break;
- case 256: /* func ::= function_name NK_LP expression_list NK_RP */
-{ yylhsminor.yy232 = createFunctionNode(pCxt, &yymsp[-3].minor.yy481, yymsp[-1].minor.yy288); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ case 264: /* func ::= function_name NK_LP expression_list NK_RP */
+{ yylhsminor.yy164 = createFunctionNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-1].minor.yy648); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 257: /* sma_stream_opt ::= */
- case 284: /* stream_options ::= */ yytestcase(yyruleno==284);
-{ yymsp[1].minor.yy232 = createStreamOptions(pCxt); }
+ case 265: /* sma_stream_opt ::= */
+ case 292: /* stream_options ::= */ yytestcase(yyruleno==292);
+{ yymsp[1].minor.yy164 = createStreamOptions(pCxt); }
break;
- case 258: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */
- case 288: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==288);
-{ ((SStreamOptions*)yymsp[-2].minor.yy232)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy232); yylhsminor.yy232 = yymsp[-2].minor.yy232; }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 266: /* sma_stream_opt ::= stream_options WATERMARK duration_literal */
+ case 296: /* stream_options ::= stream_options WATERMARK duration_literal */ yytestcase(yyruleno==296);
+{ ((SStreamOptions*)yymsp[-2].minor.yy164)->pWatermark = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-2].minor.yy164; }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 259: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */
-{ ((SStreamOptions*)yymsp[-2].minor.yy232)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy232); yylhsminor.yy232 = yymsp[-2].minor.yy232; }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 267: /* sma_stream_opt ::= stream_options MAX_DELAY duration_literal */
+{ ((SStreamOptions*)yymsp[-2].minor.yy164)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-2].minor.yy164; }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 260: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
-{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy777, &yymsp[-2].minor.yy481, yymsp[0].minor.yy232); }
+ case 268: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS query_or_subquery */
+{ pCxt->pRootNode = createCreateTopicStmtUseQuery(pCxt, yymsp[-3].minor.yy193, &yymsp[-2].minor.yy593, yymsp[0].minor.yy164); }
break;
- case 261: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy777, &yymsp[-3].minor.yy481, &yymsp[0].minor.yy481, false); }
+ case 269: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS DATABASE db_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-4].minor.yy193, &yymsp[-3].minor.yy593, &yymsp[0].minor.yy593, false); }
break;
- case 262: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy777, &yymsp[-5].minor.yy481, &yymsp[0].minor.yy481, true); }
+ case 270: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS DATABASE db_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseDb(pCxt, yymsp[-6].minor.yy193, &yymsp[-5].minor.yy593, &yymsp[0].minor.yy593, true); }
break;
- case 263: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy777, &yymsp[-3].minor.yy481, yymsp[0].minor.yy232, false); }
+ case 271: /* cmd ::= CREATE TOPIC not_exists_opt topic_name AS STABLE full_table_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-4].minor.yy193, &yymsp[-3].minor.yy593, yymsp[0].minor.yy164, false); }
break;
- case 264: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
-{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy777, &yymsp[-5].minor.yy481, yymsp[0].minor.yy232, true); }
+ case 272: /* cmd ::= CREATE TOPIC not_exists_opt topic_name WITH META AS STABLE full_table_name */
+{ pCxt->pRootNode = createCreateTopicStmtUseTable(pCxt, yymsp[-6].minor.yy193, &yymsp[-5].minor.yy593, yymsp[0].minor.yy164, true); }
break;
- case 265: /* cmd ::= DROP TOPIC exists_opt topic_name */
-{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy777, &yymsp[0].minor.yy481); }
+ case 273: /* cmd ::= DROP TOPIC exists_opt topic_name */
+{ pCxt->pRootNode = createDropTopicStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
break;
- case 266: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
-{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy777, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy481); }
+ case 274: /* cmd ::= DROP CONSUMER GROUP exists_opt cgroup_name ON topic_name */
+{ pCxt->pRootNode = createDropCGroupStmt(pCxt, yymsp[-3].minor.yy193, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593); }
break;
- case 267: /* cmd ::= DESC full_table_name */
- case 268: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==268);
-{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy232); }
+ case 275: /* cmd ::= DESC full_table_name */
+ case 276: /* cmd ::= DESCRIBE full_table_name */ yytestcase(yyruleno==276);
+{ pCxt->pRootNode = createDescribeStmt(pCxt, yymsp[0].minor.yy164); }
break;
- case 269: /* cmd ::= RESET QUERY CACHE */
+ case 277: /* cmd ::= RESET QUERY CACHE */
{ pCxt->pRootNode = createResetQueryCacheStmt(pCxt); }
break;
- case 270: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
-{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy777, yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
+ case 278: /* cmd ::= EXPLAIN analyze_opt explain_options query_or_subquery */
+{ pCxt->pRootNode = createExplainStmt(pCxt, yymsp[-2].minor.yy193, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
break;
- case 273: /* explain_options ::= */
-{ yymsp[1].minor.yy232 = createDefaultExplainOptions(pCxt); }
+ case 281: /* explain_options ::= */
+{ yymsp[1].minor.yy164 = createDefaultExplainOptions(pCxt); }
break;
- case 274: /* explain_options ::= explain_options VERBOSE NK_BOOL */
-{ yylhsminor.yy232 = setExplainVerbose(pCxt, yymsp[-2].minor.yy232, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 282: /* explain_options ::= explain_options VERBOSE NK_BOOL */
+{ yylhsminor.yy164 = setExplainVerbose(pCxt, yymsp[-2].minor.yy164, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 275: /* explain_options ::= explain_options RATIO NK_FLOAT */
-{ yylhsminor.yy232 = setExplainRatio(pCxt, yymsp[-2].minor.yy232, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 283: /* explain_options ::= explain_options RATIO NK_FLOAT */
+{ yylhsminor.yy164 = setExplainRatio(pCxt, yymsp[-2].minor.yy164, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 276: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */
-{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy777, yymsp[-8].minor.yy777, &yymsp[-5].minor.yy481, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy264, yymsp[0].minor.yy692); }
+ case 284: /* cmd ::= CREATE agg_func_opt FUNCTION not_exists_opt function_name AS NK_STRING OUTPUTTYPE type_name bufsize_opt */
+{ pCxt->pRootNode = createCreateFunctionStmt(pCxt, yymsp[-6].minor.yy193, yymsp[-8].minor.yy193, &yymsp[-5].minor.yy593, &yymsp[-3].minor.yy0, yymsp[-1].minor.yy720, yymsp[0].minor.yy512); }
break;
- case 277: /* cmd ::= DROP FUNCTION exists_opt function_name */
-{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy777, &yymsp[0].minor.yy481); }
+ case 285: /* cmd ::= DROP FUNCTION exists_opt function_name */
+{ pCxt->pRootNode = createDropFunctionStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
break;
- case 282: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */
-{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy777, &yymsp[-7].minor.yy481, yymsp[-4].minor.yy232, yymsp[-6].minor.yy232, yymsp[-3].minor.yy288, yymsp[-2].minor.yy232, yymsp[0].minor.yy232); }
+ case 290: /* cmd ::= CREATE STREAM not_exists_opt stream_name stream_options INTO full_table_name tags_def_opt subtable_opt AS query_or_subquery */
+{ pCxt->pRootNode = createCreateStreamStmt(pCxt, yymsp[-8].minor.yy193, &yymsp[-7].minor.yy593, yymsp[-4].minor.yy164, yymsp[-6].minor.yy164, yymsp[-3].minor.yy648, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); }
break;
- case 283: /* cmd ::= DROP STREAM exists_opt stream_name */
-{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy777, &yymsp[0].minor.yy481); }
+ case 291: /* cmd ::= DROP STREAM exists_opt stream_name */
+{ pCxt->pRootNode = createDropStreamStmt(pCxt, yymsp[-1].minor.yy193, &yymsp[0].minor.yy593); }
break;
- case 285: /* stream_options ::= stream_options TRIGGER AT_ONCE */
-{ ((SStreamOptions*)yymsp[-2].minor.yy232)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy232 = yymsp[-2].minor.yy232; }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 293: /* stream_options ::= stream_options TRIGGER AT_ONCE */
+{ ((SStreamOptions*)yymsp[-2].minor.yy164)->triggerType = STREAM_TRIGGER_AT_ONCE; yylhsminor.yy164 = yymsp[-2].minor.yy164; }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 286: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
-{ ((SStreamOptions*)yymsp[-2].minor.yy232)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy232 = yymsp[-2].minor.yy232; }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 294: /* stream_options ::= stream_options TRIGGER WINDOW_CLOSE */
+{ ((SStreamOptions*)yymsp[-2].minor.yy164)->triggerType = STREAM_TRIGGER_WINDOW_CLOSE; yylhsminor.yy164 = yymsp[-2].minor.yy164; }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 287: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
-{ ((SStreamOptions*)yymsp[-3].minor.yy232)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy232)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy232); yylhsminor.yy232 = yymsp[-3].minor.yy232; }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ case 295: /* stream_options ::= stream_options TRIGGER MAX_DELAY duration_literal */
+{ ((SStreamOptions*)yymsp[-3].minor.yy164)->triggerType = STREAM_TRIGGER_MAX_DELAY; ((SStreamOptions*)yymsp[-3].minor.yy164)->pDelay = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); yylhsminor.yy164 = yymsp[-3].minor.yy164; }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 289: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
-{ ((SStreamOptions*)yymsp[-3].minor.yy232)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy232 = yymsp[-3].minor.yy232; }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ case 297: /* stream_options ::= stream_options IGNORE EXPIRED NK_INTEGER */
+{ ((SStreamOptions*)yymsp[-3].minor.yy164)->ignoreExpired = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy164 = yymsp[-3].minor.yy164; }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 290: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
-{ ((SStreamOptions*)yymsp[-2].minor.yy232)->fillHistory = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy232 = yymsp[-2].minor.yy232; }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 298: /* stream_options ::= stream_options FILL_HISTORY NK_INTEGER */
+{ ((SStreamOptions*)yymsp[-2].minor.yy164)->fillHistory = taosStr2Int8(yymsp[0].minor.yy0.z, NULL, 10); yylhsminor.yy164 = yymsp[-2].minor.yy164; }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 292: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
- case 478: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==478);
- case 496: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==496);
-{ yymsp[-3].minor.yy232 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy232); }
+ case 300: /* subtable_opt ::= SUBTABLE NK_LP expression NK_RP */
+ case 486: /* sliding_opt ::= SLIDING NK_LP duration_literal NK_RP */ yytestcase(yyruleno==486);
+ case 504: /* every_opt ::= EVERY NK_LP duration_literal NK_RP */ yytestcase(yyruleno==504);
+{ yymsp[-3].minor.yy164 = releaseRawExprNode(pCxt, yymsp[-1].minor.yy164); }
break;
- case 293: /* cmd ::= KILL CONNECTION NK_INTEGER */
+ case 301: /* cmd ::= KILL CONNECTION NK_INTEGER */
{ pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_CONNECTION_STMT, &yymsp[0].minor.yy0); }
break;
- case 294: /* cmd ::= KILL QUERY NK_STRING */
+ case 302: /* cmd ::= KILL QUERY NK_STRING */
{ pCxt->pRootNode = createKillQueryStmt(pCxt, &yymsp[0].minor.yy0); }
break;
- case 295: /* cmd ::= KILL TRANSACTION NK_INTEGER */
+ case 303: /* cmd ::= KILL TRANSACTION NK_INTEGER */
{ pCxt->pRootNode = createKillStmt(pCxt, QUERY_NODE_KILL_TRANSACTION_STMT, &yymsp[0].minor.yy0); }
break;
- case 296: /* cmd ::= BALANCE VGROUP */
+ case 304: /* cmd ::= BALANCE VGROUP */
{ pCxt->pRootNode = createBalanceVgroupStmt(pCxt); }
break;
- case 297: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
+ case 305: /* cmd ::= MERGE VGROUP NK_INTEGER NK_INTEGER */
{ pCxt->pRootNode = createMergeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 298: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
-{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy288); }
+ case 306: /* cmd ::= REDISTRIBUTE VGROUP NK_INTEGER dnode_list */
+{ pCxt->pRootNode = createRedistributeVgroupStmt(pCxt, &yymsp[-1].minor.yy0, yymsp[0].minor.yy648); }
break;
- case 299: /* cmd ::= SPLIT VGROUP NK_INTEGER */
+ case 307: /* cmd ::= SPLIT VGROUP NK_INTEGER */
{ pCxt->pRootNode = createSplitVgroupStmt(pCxt, &yymsp[0].minor.yy0); }
break;
- case 300: /* dnode_list ::= DNODE NK_INTEGER */
-{ yymsp[-1].minor.yy288 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
- break;
- case 302: /* cmd ::= DELETE FROM full_table_name where_clause_opt */
-{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
- break;
- case 304: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
-{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy232, yymsp[-2].minor.yy288, yymsp[0].minor.yy232); }
- break;
- case 305: /* cmd ::= INSERT INTO full_table_name query_or_subquery */
-{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy232, NULL, yymsp[0].minor.yy232); }
- break;
- case 306: /* literal ::= NK_INTEGER */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 307: /* literal ::= NK_FLOAT */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 308: /* literal ::= NK_STRING */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 309: /* literal ::= NK_BOOL */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 310: /* literal ::= TIMESTAMP NK_STRING */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
- break;
- case 311: /* literal ::= duration_literal */
- case 321: /* signed_literal ::= signed */ yytestcase(yyruleno==321);
- case 341: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==341);
- case 342: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==342);
- case 343: /* expression ::= literal */ yytestcase(yyruleno==343);
- case 344: /* expression ::= pseudo_column */ yytestcase(yyruleno==344);
- case 345: /* expression ::= column_reference */ yytestcase(yyruleno==345);
- case 346: /* expression ::= function_expression */ yytestcase(yyruleno==346);
- case 347: /* expression ::= case_when_expression */ yytestcase(yyruleno==347);
- case 377: /* function_expression ::= literal_func */ yytestcase(yyruleno==377);
- case 426: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==426);
- case 430: /* boolean_primary ::= predicate */ yytestcase(yyruleno==430);
- case 432: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==432);
- case 433: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==433);
- case 436: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==436);
- case 438: /* table_reference ::= table_primary */ yytestcase(yyruleno==438);
- case 439: /* table_reference ::= joined_table */ yytestcase(yyruleno==439);
- case 443: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==443);
- case 498: /* query_simple ::= query_specification */ yytestcase(yyruleno==498);
- case 499: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==499);
- case 502: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==502);
- case 504: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==504);
-{ yylhsminor.yy232 = yymsp[0].minor.yy232; }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 312: /* literal ::= NULL */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 313: /* literal ::= NK_QUESTION */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 314: /* duration_literal ::= NK_VARIABLE */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 315: /* signed ::= NK_INTEGER */
-{ yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 316: /* signed ::= NK_PLUS NK_INTEGER */
-{ yymsp[-1].minor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
- break;
- case 317: /* signed ::= NK_MINUS NK_INTEGER */
+ case 308: /* dnode_list ::= DNODE NK_INTEGER */
+{ yymsp[-1].minor.yy648 = createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &yymsp[0].minor.yy0)); }
+ break;
+ case 310: /* cmd ::= DELETE FROM full_table_name where_clause_opt */
+{ pCxt->pRootNode = createDeleteStmt(pCxt, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
+ break;
+ case 312: /* cmd ::= INSERT INTO full_table_name NK_LP col_name_list NK_RP query_or_subquery */
+{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-4].minor.yy164, yymsp[-2].minor.yy648, yymsp[0].minor.yy164); }
+ break;
+ case 313: /* cmd ::= INSERT INTO full_table_name query_or_subquery */
+{ pCxt->pRootNode = createInsertStmt(pCxt, yymsp[-1].minor.yy164, NULL, yymsp[0].minor.yy164); }
+ break;
+ case 314: /* literal ::= NK_INTEGER */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 315: /* literal ::= NK_FLOAT */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 316: /* literal ::= NK_STRING */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 317: /* literal ::= NK_BOOL */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 318: /* literal ::= TIMESTAMP NK_STRING */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0)); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 319: /* literal ::= duration_literal */
+ case 329: /* signed_literal ::= signed */ yytestcase(yyruleno==329);
+ case 349: /* expr_or_subquery ::= expression */ yytestcase(yyruleno==349);
+ case 350: /* expr_or_subquery ::= subquery */ yytestcase(yyruleno==350);
+ case 351: /* expression ::= literal */ yytestcase(yyruleno==351);
+ case 352: /* expression ::= pseudo_column */ yytestcase(yyruleno==352);
+ case 353: /* expression ::= column_reference */ yytestcase(yyruleno==353);
+ case 354: /* expression ::= function_expression */ yytestcase(yyruleno==354);
+ case 355: /* expression ::= case_when_expression */ yytestcase(yyruleno==355);
+ case 385: /* function_expression ::= literal_func */ yytestcase(yyruleno==385);
+ case 434: /* boolean_value_expression ::= boolean_primary */ yytestcase(yyruleno==434);
+ case 438: /* boolean_primary ::= predicate */ yytestcase(yyruleno==438);
+ case 440: /* common_expression ::= expr_or_subquery */ yytestcase(yyruleno==440);
+ case 441: /* common_expression ::= boolean_value_expression */ yytestcase(yyruleno==441);
+ case 444: /* table_reference_list ::= table_reference */ yytestcase(yyruleno==444);
+ case 446: /* table_reference ::= table_primary */ yytestcase(yyruleno==446);
+ case 447: /* table_reference ::= joined_table */ yytestcase(yyruleno==447);
+ case 451: /* table_primary ::= parenthesized_joined_table */ yytestcase(yyruleno==451);
+ case 506: /* query_simple ::= query_specification */ yytestcase(yyruleno==506);
+ case 507: /* query_simple ::= union_query_expression */ yytestcase(yyruleno==507);
+ case 510: /* query_simple_or_subquery ::= query_simple */ yytestcase(yyruleno==510);
+ case 512: /* query_or_subquery ::= query_expression */ yytestcase(yyruleno==512);
+{ yylhsminor.yy164 = yymsp[0].minor.yy164; }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 320: /* literal ::= NULL */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 321: /* literal ::= NK_QUESTION */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 322: /* duration_literal ::= NK_VARIABLE */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createDurationValueNode(pCxt, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 323: /* signed ::= NK_INTEGER */
+{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 324: /* signed ::= NK_PLUS NK_INTEGER */
+{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_UBIGINT, &yymsp[0].minor.yy0); }
+ break;
+ case 325: /* signed ::= NK_MINUS NK_INTEGER */
{
SToken t = yymsp[-1].minor.yy0;
t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z;
- yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t);
+ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BIGINT, &t);
}
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 318: /* signed ::= NK_FLOAT */
-{ yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+ case 326: /* signed ::= NK_FLOAT */
+{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
- case 319: /* signed ::= NK_PLUS NK_FLOAT */
-{ yymsp[-1].minor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
+ case 327: /* signed ::= NK_PLUS NK_FLOAT */
+{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &yymsp[0].minor.yy0); }
break;
- case 320: /* signed ::= NK_MINUS NK_FLOAT */
+ case 328: /* signed ::= NK_MINUS NK_FLOAT */
{
SToken t = yymsp[-1].minor.yy0;
t.n = (yymsp[0].minor.yy0.z + yymsp[0].minor.yy0.n) - yymsp[-1].minor.yy0.z;
- yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t);
+ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_DOUBLE, &t);
}
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
- break;
- case 322: /* signed_literal ::= NK_STRING */
-{ yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 323: /* signed_literal ::= NK_BOOL */
-{ yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 324: /* signed_literal ::= TIMESTAMP NK_STRING */
-{ yymsp[-1].minor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); }
- break;
- case 325: /* signed_literal ::= duration_literal */
- case 327: /* signed_literal ::= literal_func */ yytestcase(yyruleno==327);
- case 397: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==397);
- case 459: /* select_item ::= common_expression */ yytestcase(yyruleno==459);
- case 469: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==469);
- case 503: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==503);
- case 505: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==505);
- case 518: /* search_condition ::= common_expression */ yytestcase(yyruleno==518);
-{ yylhsminor.yy232 = releaseRawExprNode(pCxt, yymsp[0].minor.yy232); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 326: /* signed_literal ::= NULL */
-{ yylhsminor.yy232 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 328: /* signed_literal ::= NK_QUESTION */
-{ yylhsminor.yy232 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 348: /* expression ::= NK_LP expression NK_RP */
- case 431: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==431);
- case 517: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==517);
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy232)); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
- break;
- case 349: /* expression ::= NK_PLUS expr_or_subquery */
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 330: /* signed_literal ::= NK_STRING */
+{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 331: /* signed_literal ::= NK_BOOL */
+{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_BOOL, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 332: /* signed_literal ::= TIMESTAMP NK_STRING */
+{ yymsp[-1].minor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_TIMESTAMP, &yymsp[0].minor.yy0); }
+ break;
+ case 333: /* signed_literal ::= duration_literal */
+ case 335: /* signed_literal ::= literal_func */ yytestcase(yyruleno==335);
+ case 405: /* star_func_para ::= expr_or_subquery */ yytestcase(yyruleno==405);
+ case 467: /* select_item ::= common_expression */ yytestcase(yyruleno==467);
+ case 477: /* partition_item ::= expr_or_subquery */ yytestcase(yyruleno==477);
+ case 511: /* query_simple_or_subquery ::= subquery */ yytestcase(yyruleno==511);
+ case 513: /* query_or_subquery ::= subquery */ yytestcase(yyruleno==513);
+ case 526: /* search_condition ::= common_expression */ yytestcase(yyruleno==526);
+{ yylhsminor.yy164 = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 334: /* signed_literal ::= NULL */
+{ yylhsminor.yy164 = createValueNode(pCxt, TSDB_DATA_TYPE_NULL, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 336: /* signed_literal ::= NK_QUESTION */
+{ yylhsminor.yy164 = createPlaceholderValueNode(pCxt, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 356: /* expression ::= NK_LP expression NK_RP */
+ case 439: /* boolean_primary ::= NK_LP boolean_value_expression NK_RP */ yytestcase(yyruleno==439);
+ case 525: /* subquery ::= NK_LP subquery NK_RP */ yytestcase(yyruleno==525);
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 357: /* expression ::= NK_PLUS expr_or_subquery */
{
- SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy232));
+ SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, releaseRawExprNode(pCxt, yymsp[0].minor.yy164));
}
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 350: /* expression ::= NK_MINUS expr_or_subquery */
+ case 358: /* expression ::= NK_MINUS expr_or_subquery */
{
- SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy232), NULL));
+ SToken t = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &t, createOperatorNode(pCxt, OP_TYPE_MINUS, releaseRawExprNode(pCxt, yymsp[0].minor.yy164), NULL));
}
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 351: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
+ case 359: /* expression ::= expr_or_subquery NK_PLUS expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_ADD, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 352: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
+ case 360: /* expression ::= expr_or_subquery NK_MINUS expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_SUB, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 353: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */
+ case 361: /* expression ::= expr_or_subquery NK_STAR expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_MULTI, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 354: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
+ case 362: /* expression ::= expr_or_subquery NK_SLASH expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_DIV, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 355: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */
+ case 363: /* expression ::= expr_or_subquery NK_REM expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_REM, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 356: /* expression ::= column_reference NK_ARROW NK_STRING */
+ case 364: /* expression ::= column_reference NK_ARROW NK_STRING */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_JSON_GET_VALUE, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[0].minor.yy0)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 357: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
+ case 365: /* expression ::= expr_or_subquery NK_BITAND expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 358: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
+ case 366: /* expression ::= expr_or_subquery NK_BITOR expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, OP_TYPE_BIT_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
- break;
- case 361: /* column_reference ::= column_name */
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy481, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy481)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 362: /* column_reference ::= table_name NK_DOT column_name */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy481, createColumnNode(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy481)); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
- break;
- case 363: /* pseudo_column ::= ROWTS */
- case 364: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==364);
- case 366: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==366);
- case 367: /* pseudo_column ::= QEND */ yytestcase(yyruleno==367);
- case 368: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==368);
- case 369: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==369);
- case 370: /* pseudo_column ::= WEND */ yytestcase(yyruleno==370);
- case 371: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==371);
- case 372: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==372);
- case 373: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==373);
- case 379: /* literal_func ::= NOW */ yytestcase(yyruleno==379);
-{ yylhsminor.yy232 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
- break;
- case 365: /* pseudo_column ::= table_name NK_DOT TBNAME */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy481)))); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
- break;
- case 374: /* function_expression ::= function_name NK_LP expression_list NK_RP */
- case 375: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==375);
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy481, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy481, yymsp[-1].minor.yy288)); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
- break;
- case 376: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), yymsp[-1].minor.yy264)); }
- yymsp[-5].minor.yy232 = yylhsminor.yy232;
- break;
- case 378: /* literal_func ::= noarg_func NK_LP NK_RP */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy481, NULL)); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
- break;
- case 393: /* star_func_para_list ::= NK_STAR */
-{ yylhsminor.yy288 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
- break;
- case 398: /* star_func_para ::= table_name NK_DOT NK_STAR */
- case 462: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==462);
-{ yylhsminor.yy232 = createColumnNode(pCxt, &yymsp[-2].minor.yy481, &yymsp[0].minor.yy0); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
- break;
- case 399: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy288, yymsp[-1].minor.yy232)); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
- break;
- case 400: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), yymsp[-2].minor.yy288, yymsp[-1].minor.yy232)); }
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
- break;
- case 403: /* when_then_expr ::= WHEN common_expression THEN common_expression */
-{ yymsp[-3].minor.yy232 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)); }
- break;
- case 405: /* case_when_else_opt ::= ELSE common_expression */
-{ yymsp[-1].minor.yy232 = releaseRawExprNode(pCxt, yymsp[0].minor.yy232); }
- break;
- case 406: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */
- case 411: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==411);
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 369: /* column_reference ::= column_name */
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy593, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy593)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 370: /* column_reference ::= table_name NK_DOT column_name */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593, createColumnNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy593)); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 371: /* pseudo_column ::= ROWTS */
+ case 372: /* pseudo_column ::= TBNAME */ yytestcase(yyruleno==372);
+ case 374: /* pseudo_column ::= QSTART */ yytestcase(yyruleno==374);
+ case 375: /* pseudo_column ::= QEND */ yytestcase(yyruleno==375);
+ case 376: /* pseudo_column ::= QDURATION */ yytestcase(yyruleno==376);
+ case 377: /* pseudo_column ::= WSTART */ yytestcase(yyruleno==377);
+ case 378: /* pseudo_column ::= WEND */ yytestcase(yyruleno==378);
+ case 379: /* pseudo_column ::= WDURATION */ yytestcase(yyruleno==379);
+ case 380: /* pseudo_column ::= IROWTS */ yytestcase(yyruleno==380);
+ case 381: /* pseudo_column ::= QTAGS */ yytestcase(yyruleno==381);
+ case 387: /* literal_func ::= NOW */ yytestcase(yyruleno==387);
+{ yylhsminor.yy164 = createRawExprNode(pCxt, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, NULL)); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 373: /* pseudo_column ::= table_name NK_DOT TBNAME */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[0].minor.yy0, createNodeList(pCxt, createValueNode(pCxt, TSDB_DATA_TYPE_BINARY, &yymsp[-2].minor.yy593)))); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 382: /* function_expression ::= function_name NK_LP expression_list NK_RP */
+ case 383: /* function_expression ::= star_func NK_LP star_func_para_list NK_RP */ yytestcase(yyruleno==383);
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-3].minor.yy593, yymsp[-1].minor.yy648)); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 384: /* function_expression ::= CAST NK_LP expr_or_subquery AS type_name NK_RP */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-5].minor.yy0, &yymsp[0].minor.yy0, createCastFunctionNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy720)); }
+ yymsp[-5].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 386: /* literal_func ::= noarg_func NK_LP NK_RP */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0, createFunctionNode(pCxt, &yymsp[-2].minor.yy593, NULL)); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 401: /* star_func_para_list ::= NK_STAR */
+{ yylhsminor.yy648 = createNodeList(pCxt, createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0)); }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
+ break;
+ case 406: /* star_func_para ::= table_name NK_DOT NK_STAR */
+ case 470: /* select_item ::= table_name NK_DOT NK_STAR */ yytestcase(yyruleno==470);
+{ yylhsminor.yy164 = createColumnNode(pCxt, &yymsp[-2].minor.yy593, &yymsp[0].minor.yy0); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 407: /* case_when_expression ::= CASE when_then_list case_when_else_opt END */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-3].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, NULL, yymsp[-2].minor.yy648, yymsp[-1].minor.yy164)); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 408: /* case_when_expression ::= CASE common_expression when_then_list case_when_else_opt END */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-4].minor.yy0, &yymsp[0].minor.yy0, createCaseWhenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-2].minor.yy648, yymsp[-1].minor.yy164)); }
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
+ break;
+ case 411: /* when_then_expr ::= WHEN common_expression THEN common_expression */
+{ yymsp[-3].minor.yy164 = createWhenThenNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)); }
+ break;
+ case 413: /* case_when_else_opt ::= ELSE common_expression */
+{ yymsp[-1].minor.yy164 = releaseRawExprNode(pCxt, yymsp[0].minor.yy164); }
+ break;
+ case 414: /* predicate ::= expr_or_subquery compare_op expr_or_subquery */
+ case 419: /* predicate ::= expr_or_subquery in_op in_predicate_value */ yytestcase(yyruleno==419);
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy4, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createOperatorNode(pCxt, yymsp[-1].minor.yy656, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 407: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
+ case 415: /* predicate ::= expr_or_subquery BETWEEN expr_or_subquery AND expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy232), releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-4].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-4].minor.yy164), releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-4].minor.yy232 = yylhsminor.yy232;
+ yymsp[-4].minor.yy164 = yylhsminor.yy164;
break;
- case 408: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
+ case 416: /* predicate ::= expr_or_subquery NOT BETWEEN expr_or_subquery AND expr_or_subquery */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy232), releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-5].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createNotBetweenAnd(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-5].minor.yy232 = yylhsminor.yy232;
+ yymsp[-5].minor.yy164 = yylhsminor.yy164;
break;
- case 409: /* predicate ::= expr_or_subquery IS NULL */
+ case 417: /* predicate ::= expr_or_subquery IS NULL */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), NULL));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NULL, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), NULL));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 410: /* predicate ::= expr_or_subquery IS NOT NULL */
+ case 418: /* predicate ::= expr_or_subquery IS NOT NULL */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), NULL));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-3].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &yymsp[0].minor.yy0, createOperatorNode(pCxt, OP_TYPE_IS_NOT_NULL, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL));
}
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 412: /* compare_op ::= NK_LT */
-{ yymsp[0].minor.yy4 = OP_TYPE_LOWER_THAN; }
+ case 420: /* compare_op ::= NK_LT */
+{ yymsp[0].minor.yy656 = OP_TYPE_LOWER_THAN; }
break;
- case 413: /* compare_op ::= NK_GT */
-{ yymsp[0].minor.yy4 = OP_TYPE_GREATER_THAN; }
+ case 421: /* compare_op ::= NK_GT */
+{ yymsp[0].minor.yy656 = OP_TYPE_GREATER_THAN; }
break;
- case 414: /* compare_op ::= NK_LE */
-{ yymsp[0].minor.yy4 = OP_TYPE_LOWER_EQUAL; }
+ case 422: /* compare_op ::= NK_LE */
+{ yymsp[0].minor.yy656 = OP_TYPE_LOWER_EQUAL; }
break;
- case 415: /* compare_op ::= NK_GE */
-{ yymsp[0].minor.yy4 = OP_TYPE_GREATER_EQUAL; }
+ case 423: /* compare_op ::= NK_GE */
+{ yymsp[0].minor.yy656 = OP_TYPE_GREATER_EQUAL; }
break;
- case 416: /* compare_op ::= NK_NE */
-{ yymsp[0].minor.yy4 = OP_TYPE_NOT_EQUAL; }
+ case 424: /* compare_op ::= NK_NE */
+{ yymsp[0].minor.yy656 = OP_TYPE_NOT_EQUAL; }
break;
- case 417: /* compare_op ::= NK_EQ */
-{ yymsp[0].minor.yy4 = OP_TYPE_EQUAL; }
+ case 425: /* compare_op ::= NK_EQ */
+{ yymsp[0].minor.yy656 = OP_TYPE_EQUAL; }
break;
- case 418: /* compare_op ::= LIKE */
-{ yymsp[0].minor.yy4 = OP_TYPE_LIKE; }
+ case 426: /* compare_op ::= LIKE */
+{ yymsp[0].minor.yy656 = OP_TYPE_LIKE; }
break;
- case 419: /* compare_op ::= NOT LIKE */
-{ yymsp[-1].minor.yy4 = OP_TYPE_NOT_LIKE; }
+ case 427: /* compare_op ::= NOT LIKE */
+{ yymsp[-1].minor.yy656 = OP_TYPE_NOT_LIKE; }
break;
- case 420: /* compare_op ::= MATCH */
-{ yymsp[0].minor.yy4 = OP_TYPE_MATCH; }
+ case 428: /* compare_op ::= MATCH */
+{ yymsp[0].minor.yy656 = OP_TYPE_MATCH; }
break;
- case 421: /* compare_op ::= NMATCH */
-{ yymsp[0].minor.yy4 = OP_TYPE_NMATCH; }
+ case 429: /* compare_op ::= NMATCH */
+{ yymsp[0].minor.yy656 = OP_TYPE_NMATCH; }
break;
- case 422: /* compare_op ::= CONTAINS */
-{ yymsp[0].minor.yy4 = OP_TYPE_JSON_CONTAINS; }
+ case 430: /* compare_op ::= CONTAINS */
+{ yymsp[0].minor.yy656 = OP_TYPE_JSON_CONTAINS; }
break;
- case 423: /* in_op ::= IN */
-{ yymsp[0].minor.yy4 = OP_TYPE_IN; }
+ case 431: /* in_op ::= IN */
+{ yymsp[0].minor.yy656 = OP_TYPE_IN; }
break;
- case 424: /* in_op ::= NOT IN */
-{ yymsp[-1].minor.yy4 = OP_TYPE_NOT_IN; }
+ case 432: /* in_op ::= NOT IN */
+{ yymsp[-1].minor.yy656 = OP_TYPE_NOT_IN; }
break;
- case 425: /* in_predicate_value ::= NK_LP literal_list NK_RP */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy288)); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 433: /* in_predicate_value ::= NK_LP literal_list NK_RP */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, createNodeListNode(pCxt, yymsp[-1].minor.yy648)); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 427: /* boolean_value_expression ::= NOT boolean_primary */
+ case 435: /* boolean_value_expression ::= NOT boolean_primary */
{
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy232), NULL));
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-1].minor.yy0, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_NOT, releaseRawExprNode(pCxt, yymsp[0].minor.yy164), NULL));
}
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 428: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
+ case 436: /* boolean_value_expression ::= boolean_value_expression OR boolean_value_expression */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_OR, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 429: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
+ case 437: /* boolean_value_expression ::= boolean_value_expression AND boolean_value_expression */
{
- SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy232);
- SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy232);
- yylhsminor.yy232 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), releaseRawExprNode(pCxt, yymsp[0].minor.yy232)));
+ SToken s = getTokenFromRawExprNode(pCxt, yymsp[-2].minor.yy164);
+ SToken e = getTokenFromRawExprNode(pCxt, yymsp[0].minor.yy164);
+ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &s, &e, createLogicConditionNode(pCxt, LOGIC_COND_TYPE_AND, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), releaseRawExprNode(pCxt, yymsp[0].minor.yy164)));
}
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 435: /* from_clause_opt ::= FROM table_reference_list */
- case 464: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==464);
- case 492: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==492);
-{ yymsp[-1].minor.yy232 = yymsp[0].minor.yy232; }
+ case 443: /* from_clause_opt ::= FROM table_reference_list */
+ case 472: /* where_clause_opt ::= WHERE search_condition */ yytestcase(yyruleno==472);
+ case 500: /* having_clause_opt ::= HAVING search_condition */ yytestcase(yyruleno==500);
+{ yymsp[-1].minor.yy164 = yymsp[0].minor.yy164; }
break;
- case 437: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */
-{ yylhsminor.yy232 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy232, yymsp[0].minor.yy232, NULL); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 445: /* table_reference_list ::= table_reference_list NK_COMMA table_reference */
+{ yylhsminor.yy164 = createJoinTableNode(pCxt, JOIN_TYPE_INNER, yymsp[-2].minor.yy164, yymsp[0].minor.yy164, NULL); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 440: /* table_primary ::= table_name alias_opt */
-{ yylhsminor.yy232 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy481, &yymsp[0].minor.yy481); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ case 448: /* table_primary ::= table_name alias_opt */
+{ yylhsminor.yy164 = createRealTableNode(pCxt, NULL, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 441: /* table_primary ::= db_name NK_DOT table_name alias_opt */
-{ yylhsminor.yy232 = createRealTableNode(pCxt, &yymsp[-3].minor.yy481, &yymsp[-1].minor.yy481, &yymsp[0].minor.yy481); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ case 449: /* table_primary ::= db_name NK_DOT table_name alias_opt */
+{ yylhsminor.yy164 = createRealTableNode(pCxt, &yymsp[-3].minor.yy593, &yymsp[-1].minor.yy593, &yymsp[0].minor.yy593); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 442: /* table_primary ::= subquery alias_opt */
-{ yylhsminor.yy232 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy232), &yymsp[0].minor.yy481); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ case 450: /* table_primary ::= subquery alias_opt */
+{ yylhsminor.yy164 = createTempTableNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164), &yymsp[0].minor.yy593); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 444: /* alias_opt ::= */
-{ yymsp[1].minor.yy481 = nil_token; }
+ case 452: /* alias_opt ::= */
+{ yymsp[1].minor.yy593 = nil_token; }
break;
- case 445: /* alias_opt ::= table_alias */
-{ yylhsminor.yy481 = yymsp[0].minor.yy481; }
- yymsp[0].minor.yy481 = yylhsminor.yy481;
+ case 453: /* alias_opt ::= table_alias */
+{ yylhsminor.yy593 = yymsp[0].minor.yy593; }
+ yymsp[0].minor.yy593 = yylhsminor.yy593;
break;
- case 446: /* alias_opt ::= AS table_alias */
-{ yymsp[-1].minor.yy481 = yymsp[0].minor.yy481; }
+ case 454: /* alias_opt ::= AS table_alias */
+{ yymsp[-1].minor.yy593 = yymsp[0].minor.yy593; }
break;
- case 447: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */
- case 448: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==448);
-{ yymsp[-2].minor.yy232 = yymsp[-1].minor.yy232; }
+ case 455: /* parenthesized_joined_table ::= NK_LP joined_table NK_RP */
+ case 456: /* parenthesized_joined_table ::= NK_LP parenthesized_joined_table NK_RP */ yytestcase(yyruleno==456);
+{ yymsp[-2].minor.yy164 = yymsp[-1].minor.yy164; }
break;
- case 449: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
-{ yylhsminor.yy232 = createJoinTableNode(pCxt, yymsp[-4].minor.yy700, yymsp[-5].minor.yy232, yymsp[-2].minor.yy232, yymsp[0].minor.yy232); }
- yymsp[-5].minor.yy232 = yylhsminor.yy232;
+ case 457: /* joined_table ::= table_reference join_type JOIN table_reference ON search_condition */
+{ yylhsminor.yy164 = createJoinTableNode(pCxt, yymsp[-4].minor.yy868, yymsp[-5].minor.yy164, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); }
+ yymsp[-5].minor.yy164 = yylhsminor.yy164;
break;
- case 450: /* join_type ::= */
-{ yymsp[1].minor.yy700 = JOIN_TYPE_INNER; }
+ case 458: /* join_type ::= */
+{ yymsp[1].minor.yy868 = JOIN_TYPE_INNER; }
break;
- case 451: /* join_type ::= INNER */
-{ yymsp[0].minor.yy700 = JOIN_TYPE_INNER; }
+ case 459: /* join_type ::= INNER */
+{ yymsp[0].minor.yy868 = JOIN_TYPE_INNER; }
break;
- case 452: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
+ case 460: /* query_specification ::= SELECT set_quantifier_opt select_list from_clause_opt where_clause_opt partition_by_clause_opt range_opt every_opt fill_opt twindow_clause_opt group_by_clause_opt having_clause_opt */
{
- yymsp[-11].minor.yy232 = createSelectStmt(pCxt, yymsp[-10].minor.yy777, yymsp[-9].minor.yy288, yymsp[-8].minor.yy232);
- yymsp[-11].minor.yy232 = addWhereClause(pCxt, yymsp[-11].minor.yy232, yymsp[-7].minor.yy232);
- yymsp[-11].minor.yy232 = addPartitionByClause(pCxt, yymsp[-11].minor.yy232, yymsp[-6].minor.yy288);
- yymsp[-11].minor.yy232 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy232, yymsp[-2].minor.yy232);
- yymsp[-11].minor.yy232 = addGroupByClause(pCxt, yymsp[-11].minor.yy232, yymsp[-1].minor.yy288);
- yymsp[-11].minor.yy232 = addHavingClause(pCxt, yymsp[-11].minor.yy232, yymsp[0].minor.yy232);
- yymsp[-11].minor.yy232 = addRangeClause(pCxt, yymsp[-11].minor.yy232, yymsp[-5].minor.yy232);
- yymsp[-11].minor.yy232 = addEveryClause(pCxt, yymsp[-11].minor.yy232, yymsp[-4].minor.yy232);
- yymsp[-11].minor.yy232 = addFillClause(pCxt, yymsp[-11].minor.yy232, yymsp[-3].minor.yy232);
+ yymsp[-11].minor.yy164 = createSelectStmt(pCxt, yymsp[-10].minor.yy193, yymsp[-9].minor.yy648, yymsp[-8].minor.yy164);
+ yymsp[-11].minor.yy164 = addWhereClause(pCxt, yymsp[-11].minor.yy164, yymsp[-7].minor.yy164);
+ yymsp[-11].minor.yy164 = addPartitionByClause(pCxt, yymsp[-11].minor.yy164, yymsp[-6].minor.yy648);
+ yymsp[-11].minor.yy164 = addWindowClauseClause(pCxt, yymsp[-11].minor.yy164, yymsp[-2].minor.yy164);
+ yymsp[-11].minor.yy164 = addGroupByClause(pCxt, yymsp[-11].minor.yy164, yymsp[-1].minor.yy648);
+ yymsp[-11].minor.yy164 = addHavingClause(pCxt, yymsp[-11].minor.yy164, yymsp[0].minor.yy164);
+ yymsp[-11].minor.yy164 = addRangeClause(pCxt, yymsp[-11].minor.yy164, yymsp[-5].minor.yy164);
+ yymsp[-11].minor.yy164 = addEveryClause(pCxt, yymsp[-11].minor.yy164, yymsp[-4].minor.yy164);
+ yymsp[-11].minor.yy164 = addFillClause(pCxt, yymsp[-11].minor.yy164, yymsp[-3].minor.yy164);
}
break;
- case 455: /* set_quantifier_opt ::= ALL */
-{ yymsp[0].minor.yy777 = false; }
+ case 463: /* set_quantifier_opt ::= ALL */
+{ yymsp[0].minor.yy193 = false; }
break;
- case 458: /* select_item ::= NK_STAR */
-{ yylhsminor.yy232 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); }
- yymsp[0].minor.yy232 = yylhsminor.yy232;
+ case 466: /* select_item ::= NK_STAR */
+{ yylhsminor.yy164 = createColumnNode(pCxt, NULL, &yymsp[0].minor.yy0); }
+ yymsp[0].minor.yy164 = yylhsminor.yy164;
break;
- case 460: /* select_item ::= common_expression column_alias */
- case 470: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==470);
-{ yylhsminor.yy232 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy232), &yymsp[0].minor.yy481); }
- yymsp[-1].minor.yy232 = yylhsminor.yy232;
+ case 468: /* select_item ::= common_expression column_alias */
+ case 478: /* partition_item ::= expr_or_subquery column_alias */ yytestcase(yyruleno==478);
+{ yylhsminor.yy164 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164), &yymsp[0].minor.yy593); }
+ yymsp[-1].minor.yy164 = yylhsminor.yy164;
break;
- case 461: /* select_item ::= common_expression AS column_alias */
- case 471: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==471);
-{ yylhsminor.yy232 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), &yymsp[0].minor.yy481); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 469: /* select_item ::= common_expression AS column_alias */
+ case 479: /* partition_item ::= expr_or_subquery AS column_alias */ yytestcase(yyruleno==479);
+{ yylhsminor.yy164 = setProjectionAlias(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), &yymsp[0].minor.yy593); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 466: /* partition_by_clause_opt ::= PARTITION BY partition_list */
- case 488: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==488);
- case 507: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==507);
-{ yymsp[-2].minor.yy288 = yymsp[0].minor.yy288; }
+ case 474: /* partition_by_clause_opt ::= PARTITION BY partition_list */
+ case 496: /* group_by_clause_opt ::= GROUP BY group_by_list */ yytestcase(yyruleno==496);
+ case 515: /* order_by_clause_opt ::= ORDER BY sort_specification_list */ yytestcase(yyruleno==515);
+{ yymsp[-2].minor.yy648 = yymsp[0].minor.yy648; }
break;
- case 473: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
-{ yymsp[-5].minor.yy232 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), releaseRawExprNode(pCxt, yymsp[-1].minor.yy232)); }
+ case 481: /* twindow_clause_opt ::= SESSION NK_LP column_reference NK_COMMA duration_literal NK_RP */
+{ yymsp[-5].minor.yy164 = createSessionWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
break;
- case 474: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
-{ yymsp[-3].minor.yy232 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy232)); }
+ case 482: /* twindow_clause_opt ::= STATE_WINDOW NK_LP expr_or_subquery NK_RP */
+{ yymsp[-3].minor.yy164 = createStateWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
break;
- case 475: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
-{ yymsp[-5].minor.yy232 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), NULL, yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
+ case 483: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_RP sliding_opt fill_opt */
+{ yymsp[-5].minor.yy164 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), NULL, yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
break;
- case 476: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
-{ yymsp[-7].minor.yy232 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy232), releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), yymsp[-1].minor.yy232, yymsp[0].minor.yy232); }
+ case 484: /* twindow_clause_opt ::= INTERVAL NK_LP duration_literal NK_COMMA duration_literal NK_RP sliding_opt fill_opt */
+{ yymsp[-7].minor.yy164 = createIntervalWindowNode(pCxt, releaseRawExprNode(pCxt, yymsp[-5].minor.yy164), releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), yymsp[-1].minor.yy164, yymsp[0].minor.yy164); }
break;
- case 480: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */
-{ yymsp[-3].minor.yy232 = createFillNode(pCxt, yymsp[-1].minor.yy614, NULL); }
+ case 488: /* fill_opt ::= FILL NK_LP fill_mode NK_RP */
+{ yymsp[-3].minor.yy164 = createFillNode(pCxt, yymsp[-1].minor.yy638, NULL); }
break;
- case 481: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
-{ yymsp[-5].minor.yy232 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy288)); }
+ case 489: /* fill_opt ::= FILL NK_LP VALUE NK_COMMA literal_list NK_RP */
+{ yymsp[-5].minor.yy164 = createFillNode(pCxt, FILL_MODE_VALUE, createNodeListNode(pCxt, yymsp[-1].minor.yy648)); }
break;
- case 482: /* fill_mode ::= NONE */
-{ yymsp[0].minor.yy614 = FILL_MODE_NONE; }
+ case 490: /* fill_mode ::= NONE */
+{ yymsp[0].minor.yy638 = FILL_MODE_NONE; }
break;
- case 483: /* fill_mode ::= PREV */
-{ yymsp[0].minor.yy614 = FILL_MODE_PREV; }
+ case 491: /* fill_mode ::= PREV */
+{ yymsp[0].minor.yy638 = FILL_MODE_PREV; }
break;
- case 484: /* fill_mode ::= NULL */
-{ yymsp[0].minor.yy614 = FILL_MODE_NULL; }
+ case 492: /* fill_mode ::= NULL */
+{ yymsp[0].minor.yy638 = FILL_MODE_NULL; }
break;
- case 485: /* fill_mode ::= LINEAR */
-{ yymsp[0].minor.yy614 = FILL_MODE_LINEAR; }
+ case 493: /* fill_mode ::= LINEAR */
+{ yymsp[0].minor.yy638 = FILL_MODE_LINEAR; }
break;
- case 486: /* fill_mode ::= NEXT */
-{ yymsp[0].minor.yy614 = FILL_MODE_NEXT; }
+ case 494: /* fill_mode ::= NEXT */
+{ yymsp[0].minor.yy638 = FILL_MODE_NEXT; }
break;
- case 489: /* group_by_list ::= expr_or_subquery */
-{ yylhsminor.yy288 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy232))); }
- yymsp[0].minor.yy288 = yylhsminor.yy288;
+ case 497: /* group_by_list ::= expr_or_subquery */
+{ yylhsminor.yy648 = createNodeList(pCxt, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); }
+ yymsp[0].minor.yy648 = yylhsminor.yy648;
break;
- case 490: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
-{ yylhsminor.yy288 = addNodeToList(pCxt, yymsp[-2].minor.yy288, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy232))); }
- yymsp[-2].minor.yy288 = yylhsminor.yy288;
+ case 498: /* group_by_list ::= group_by_list NK_COMMA expr_or_subquery */
+{ yylhsminor.yy648 = addNodeToList(pCxt, yymsp[-2].minor.yy648, createGroupingSetNode(pCxt, releaseRawExprNode(pCxt, yymsp[0].minor.yy164))); }
+ yymsp[-2].minor.yy648 = yylhsminor.yy648;
break;
- case 494: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
-{ yymsp[-5].minor.yy232 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy232), releaseRawExprNode(pCxt, yymsp[-1].minor.yy232)); }
+ case 502: /* range_opt ::= RANGE NK_LP expr_or_subquery NK_COMMA expr_or_subquery NK_RP */
+{ yymsp[-5].minor.yy164 = createInterpTimeRange(pCxt, releaseRawExprNode(pCxt, yymsp[-3].minor.yy164), releaseRawExprNode(pCxt, yymsp[-1].minor.yy164)); }
break;
- case 497: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
+ case 505: /* query_expression ::= query_simple order_by_clause_opt slimit_clause_opt limit_clause_opt */
{
- yylhsminor.yy232 = addOrderByClause(pCxt, yymsp[-3].minor.yy232, yymsp[-2].minor.yy288);
- yylhsminor.yy232 = addSlimitClause(pCxt, yylhsminor.yy232, yymsp[-1].minor.yy232);
- yylhsminor.yy232 = addLimitClause(pCxt, yylhsminor.yy232, yymsp[0].minor.yy232);
+ yylhsminor.yy164 = addOrderByClause(pCxt, yymsp[-3].minor.yy164, yymsp[-2].minor.yy648);
+ yylhsminor.yy164 = addSlimitClause(pCxt, yylhsminor.yy164, yymsp[-1].minor.yy164);
+ yylhsminor.yy164 = addLimitClause(pCxt, yylhsminor.yy164, yymsp[0].minor.yy164);
}
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 500: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
-{ yylhsminor.yy232 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy232, yymsp[0].minor.yy232); }
- yymsp[-3].minor.yy232 = yylhsminor.yy232;
+ case 508: /* union_query_expression ::= query_simple_or_subquery UNION ALL query_simple_or_subquery */
+{ yylhsminor.yy164 = createSetOperator(pCxt, SET_OP_TYPE_UNION_ALL, yymsp[-3].minor.yy164, yymsp[0].minor.yy164); }
+ yymsp[-3].minor.yy164 = yylhsminor.yy164;
break;
- case 501: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
-{ yylhsminor.yy232 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy232, yymsp[0].minor.yy232); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 509: /* union_query_expression ::= query_simple_or_subquery UNION query_simple_or_subquery */
+{ yylhsminor.yy164 = createSetOperator(pCxt, SET_OP_TYPE_UNION, yymsp[-2].minor.yy164, yymsp[0].minor.yy164); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 509: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */
- case 513: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==513);
-{ yymsp[-1].minor.yy232 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); }
+ case 517: /* slimit_clause_opt ::= SLIMIT NK_INTEGER */
+ case 521: /* limit_clause_opt ::= LIMIT NK_INTEGER */ yytestcase(yyruleno==521);
+{ yymsp[-1].minor.yy164 = createLimitNode(pCxt, &yymsp[0].minor.yy0, NULL); }
break;
- case 510: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
- case 514: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==514);
-{ yymsp[-3].minor.yy232 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); }
+ case 518: /* slimit_clause_opt ::= SLIMIT NK_INTEGER SOFFSET NK_INTEGER */
+ case 522: /* limit_clause_opt ::= LIMIT NK_INTEGER OFFSET NK_INTEGER */ yytestcase(yyruleno==522);
+{ yymsp[-3].minor.yy164 = createLimitNode(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0); }
break;
- case 511: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
- case 515: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==515);
-{ yymsp[-3].minor.yy232 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); }
+ case 519: /* slimit_clause_opt ::= SLIMIT NK_INTEGER NK_COMMA NK_INTEGER */
+ case 523: /* limit_clause_opt ::= LIMIT NK_INTEGER NK_COMMA NK_INTEGER */ yytestcase(yyruleno==523);
+{ yymsp[-3].minor.yy164 = createLimitNode(pCxt, &yymsp[0].minor.yy0, &yymsp[-2].minor.yy0); }
break;
- case 516: /* subquery ::= NK_LP query_expression NK_RP */
-{ yylhsminor.yy232 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy232); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 524: /* subquery ::= NK_LP query_expression NK_RP */
+{ yylhsminor.yy164 = createRawExprNodeExt(pCxt, &yymsp[-2].minor.yy0, &yymsp[0].minor.yy0, yymsp[-1].minor.yy164); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 521: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
-{ yylhsminor.yy232 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy232), yymsp[-1].minor.yy866, yymsp[0].minor.yy833); }
- yymsp[-2].minor.yy232 = yylhsminor.yy232;
+ case 529: /* sort_specification ::= expr_or_subquery ordering_specification_opt null_ordering_opt */
+{ yylhsminor.yy164 = createOrderByExprNode(pCxt, releaseRawExprNode(pCxt, yymsp[-2].minor.yy164), yymsp[-1].minor.yy238, yymsp[0].minor.yy153); }
+ yymsp[-2].minor.yy164 = yylhsminor.yy164;
break;
- case 522: /* ordering_specification_opt ::= */
-{ yymsp[1].minor.yy866 = ORDER_ASC; }
+ case 530: /* ordering_specification_opt ::= */
+{ yymsp[1].minor.yy238 = ORDER_ASC; }
break;
- case 523: /* ordering_specification_opt ::= ASC */
-{ yymsp[0].minor.yy866 = ORDER_ASC; }
+ case 531: /* ordering_specification_opt ::= ASC */
+{ yymsp[0].minor.yy238 = ORDER_ASC; }
break;
- case 524: /* ordering_specification_opt ::= DESC */
-{ yymsp[0].minor.yy866 = ORDER_DESC; }
+ case 532: /* ordering_specification_opt ::= DESC */
+{ yymsp[0].minor.yy238 = ORDER_DESC; }
break;
- case 525: /* null_ordering_opt ::= */
-{ yymsp[1].minor.yy833 = NULL_ORDER_DEFAULT; }
+ case 533: /* null_ordering_opt ::= */
+{ yymsp[1].minor.yy153 = NULL_ORDER_DEFAULT; }
break;
- case 526: /* null_ordering_opt ::= NULLS FIRST */
-{ yymsp[-1].minor.yy833 = NULL_ORDER_FIRST; }
+ case 534: /* null_ordering_opt ::= NULLS FIRST */
+{ yymsp[-1].minor.yy153 = NULL_ORDER_FIRST; }
break;
- case 527: /* null_ordering_opt ::= NULLS LAST */
-{ yymsp[-1].minor.yy833 = NULL_ORDER_LAST; }
+ case 535: /* null_ordering_opt ::= NULLS LAST */
+{ yymsp[-1].minor.yy153 = NULL_ORDER_LAST; }
break;
default:
break;
diff --git a/source/libs/parser/test/mockCatalog.cpp b/source/libs/parser/test/mockCatalog.cpp
index 7f18a7b28215192dc9f073018e795a205fbac929..8f051c67a00b5b6fe15f6aa5c8198d9063bc0747 100644
--- a/source/libs/parser/test/mockCatalog.cpp
+++ b/source/libs/parser/test/mockCatalog.cpp
@@ -228,18 +228,28 @@ int32_t __catalogGetTableMeta(struct SCatalog* pCatalog, SRequestConnInfo* pConn
return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta);
}
+int32_t __catalogGetCachedTableMeta(SCatalog* pCtg, const SName* pTableName, STableMeta** pTableMeta) {
+ return g_mockCatalogService->catalogGetTableMeta(pTableName, pTableMeta, true);
+}
+
int32_t __catalogGetTableHashVgroup(struct SCatalog* pCatalog, SRequestConnInfo* pConn, const SName* pTableName,
SVgroupInfo* vgInfo) {
return g_mockCatalogService->catalogGetTableHashVgroup(pTableName, vgInfo);
}
+int32_t __catalogGetCachedTableHashVgroup(SCatalog* pCtg, const SName* pTableName, SVgroupInfo* pVgroup, bool* exists) {
+ int32_t code = g_mockCatalogService->catalogGetTableHashVgroup(pTableName, pVgroup, true);
+ *exists = 0 != pVgroup->vgId;
+ return code;
+}
+
int32_t __catalogGetTableDistVgInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const SName* pTableName,
SArray** pVgList) {
return g_mockCatalogService->catalogGetTableDistVgInfo(pTableName, pVgList);
}
int32_t __catalogGetDBVgVersion(SCatalog* pCtg, const char* dbFName, int32_t* version, int64_t* dbId,
- int32_t* tableNum) {
+ int32_t* tableNum, int64_t* stateTs) {
return 0;
}
@@ -257,6 +267,13 @@ int32_t __catalogChkAuth(SCatalog* pCtg, SRequestConnInfo* pConn, const char* us
return 0;
}
+int32_t __catalogChkAuthFromCache(SCatalog* pCtg, const char* user, const char* dbFName, AUTH_TYPE type, bool* pass,
+ bool* exists) {
+ *pass = true;
+ *exists = true;
+ return 0;
+}
+
int32_t __catalogGetUdfInfo(SCatalog* pCtg, SRequestConnInfo* pConn, const char* funcName, SFuncInfo* pInfo) {
return g_mockCatalogService->catalogGetUdfInfo(funcName, pInfo);
}
@@ -289,13 +306,17 @@ void initMetaDataEnv() {
static Stub stub;
stub.set(catalogGetHandle, __catalogGetHandle);
stub.set(catalogGetTableMeta, __catalogGetTableMeta);
+ stub.set(catalogGetCachedTableMeta, __catalogGetCachedTableMeta);
stub.set(catalogGetSTableMeta, __catalogGetTableMeta);
+ stub.set(catalogGetCachedSTableMeta, __catalogGetCachedTableMeta);
stub.set(catalogGetTableHashVgroup, __catalogGetTableHashVgroup);
+ stub.set(catalogGetCachedTableHashVgroup, __catalogGetCachedTableHashVgroup);
stub.set(catalogGetTableDistVgInfo, __catalogGetTableDistVgInfo);
stub.set(catalogGetDBVgVersion, __catalogGetDBVgVersion);
stub.set(catalogGetDBVgList, __catalogGetDBVgList);
stub.set(catalogGetDBCfg, __catalogGetDBCfg);
stub.set(catalogChkAuth, __catalogChkAuth);
+ stub.set(catalogChkAuthFromCache, __catalogChkAuthFromCache);
stub.set(catalogGetUdfInfo, __catalogGetUdfInfo);
stub.set(catalogRefreshGetTableMeta, __catalogRefreshGetTableMeta);
stub.set(catalogRemoveTableMeta, __catalogRemoveTableMeta);
diff --git a/source/libs/parser/test/mockCatalogService.cpp b/source/libs/parser/test/mockCatalogService.cpp
index f2cebcb08d157a724e45bb4c5eebc7ba2873c4a9..95f7af435de89954b054b4ed0d19ca9b97d3953d 100644
--- a/source/libs/parser/test/mockCatalogService.cpp
+++ b/source/libs/parser/test/mockCatalogService.cpp
@@ -91,7 +91,7 @@ class MockCatalogServiceImpl {
public:
static const int32_t numOfDataTypes = sizeof(tDataTypes) / sizeof(tDataTypes[0]);
- MockCatalogServiceImpl() : id_(1) {}
+ MockCatalogServiceImpl() : id_(1), havaCache_(true) {}
~MockCatalogServiceImpl() {
for (auto& cfg : dbCfg_) {
@@ -106,7 +106,11 @@ class MockCatalogServiceImpl {
int32_t catalogGetHandle() const { return 0; }
- int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const {
+ int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta, bool onlyCache = false) const {
+ if (onlyCache && !havaCache_) {
+ return TSDB_CODE_SUCCESS;
+ }
+
std::unique_ptr table;
char db[TSDB_DB_NAME_LEN] = {0};
@@ -121,7 +125,12 @@ class MockCatalogServiceImpl {
return TSDB_CODE_SUCCESS;
}
- int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const {
+ int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo, bool onlyCache = false) const {
+ if (onlyCache && !havaCache_) {
+ vgInfo->vgId = 0;
+ return TSDB_CODE_SUCCESS;
+ }
+
vgInfo->vgId = 1;
return TSDB_CODE_SUCCESS;
}
@@ -618,6 +627,7 @@ class MockCatalogServiceImpl {
IndexMetaCache index_;
DnodeCache dnode_;
DbCfgCache dbCfg_;
+ bool havaCache_;
};
MockCatalogService::MockCatalogService() : impl_(new MockCatalogServiceImpl()) {}
@@ -651,12 +661,14 @@ void MockCatalogService::createDatabase(const std::string& db, bool rollup, int8
impl_->createDatabase(db, rollup, cacheLast);
}
-int32_t MockCatalogService::catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const {
- return impl_->catalogGetTableMeta(pTableName, pTableMeta);
+int32_t MockCatalogService::catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta,
+ bool onlyCache) const {
+ return impl_->catalogGetTableMeta(pTableName, pTableMeta, onlyCache);
}
-int32_t MockCatalogService::catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const {
- return impl_->catalogGetTableHashVgroup(pTableName, vgInfo);
+int32_t MockCatalogService::catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo,
+ bool onlyCache) const {
+ return impl_->catalogGetTableHashVgroup(pTableName, vgInfo, onlyCache);
}
int32_t MockCatalogService::catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const {
diff --git a/source/libs/parser/test/mockCatalogService.h b/source/libs/parser/test/mockCatalogService.h
index d9d2185728305ce4c4205f3c55ac10cda5231cb4..acd7fab8e17e2f9843d8b9beb3848f4f32c64c2b 100644
--- a/source/libs/parser/test/mockCatalogService.h
+++ b/source/libs/parser/test/mockCatalogService.h
@@ -67,8 +67,8 @@ class MockCatalogService {
void createDnode(int32_t dnodeId, const std::string& host, int16_t port);
void createDatabase(const std::string& db, bool rollup = false, int8_t cacheLast = 0);
- int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta) const;
- int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo) const;
+ int32_t catalogGetTableMeta(const SName* pTableName, STableMeta** pTableMeta, bool onlyCache = false) const;
+ int32_t catalogGetTableHashVgroup(const SName* pTableName, SVgroupInfo* vgInfo, bool onlyCache = false) const;
int32_t catalogGetTableDistVgInfo(const SName* pTableName, SArray** pVgList) const;
int32_t catalogGetDBVgList(const char* pDbFName, SArray** pVgList) const;
int32_t catalogGetDBCfg(const char* pDbFName, SDbCfgInfo* pDbCfg) const;
diff --git a/source/libs/parser/test/parSelectTest.cpp b/source/libs/parser/test/parSelectTest.cpp
index 0027ac9ca1967e4945c816471b989733820d500b..fcd8dd1f2635040f7f4b7e59f07302246f0a7630 100644
--- a/source/libs/parser/test/parSelectTest.cpp
+++ b/source/libs/parser/test/parSelectTest.cpp
@@ -425,6 +425,8 @@ TEST_F(ParserSelectTest, informationSchema) {
run("SELECT * FROM ins_databases WHERE name = 'information_schema'");
run("SELECT * FROM ins_tags WHERE db_name = 'test' and table_name = 'st1'");
+
+ run("SELECT * FROM (SELECT table_name FROM ins_tables) t WHERE table_name = 'a'");
}
TEST_F(ParserSelectTest, withoutFrom) {
diff --git a/source/libs/parser/test/parShowToUse.cpp b/source/libs/parser/test/parShowToUse.cpp
index 7f6e4adb2fbb50b3dfd02a605a9e6ed26ad06f6d..e2f833cffa523fef967fe687797fb341d10bb6d0 100644
--- a/source/libs/parser/test/parShowToUse.cpp
+++ b/source/libs/parser/test/parShowToUse.cpp
@@ -192,6 +192,16 @@ TEST_F(ParserShowToUseTest, showTableDistributed) {
run("SHOW TABLE DISTRIBUTED st1");
}
+TEST_F(ParserShowToUseTest, showTableTags) {
+ useDb("root", "test");
+
+ run("SHOW TABLE TAGS FROM st1");
+
+ run("SHOW TABLE TAGS tag1, tag2 FROM st1");
+
+ run("SHOW TABLE TAGS TBNAME, _TAGS, tag3 FROM st1");
+}
+
TEST_F(ParserShowToUseTest, showTags) {
useDb("root", "test");
diff --git a/source/libs/parser/test/parTestUtil.cpp b/source/libs/parser/test/parTestUtil.cpp
index c9cbf3f5f3dec3019f3a1916a2c522ce0aadb6aa..dbae302e426fb0c842c175ae17b71a1f1767e65d 100644
--- a/source/libs/parser/test/parTestUtil.cpp
+++ b/source/libs/parser/test/parTestUtil.cpp
@@ -233,16 +233,15 @@ class ParserTestBaseImpl {
}
void doBuildCatalogReq(SParseContext* pCxt, const SParseMetaCache* pMetaCache, SCatalogReq* pCatalogReq) {
- DO_WITH_THROW(buildCatalogReq, pCxt, pMetaCache, pCatalogReq);
+ DO_WITH_THROW(buildCatalogReq, pMetaCache, pCatalogReq);
}
void doGetAllMeta(const SCatalogReq* pCatalogReq, SMetaData* pMetaData) {
DO_WITH_THROW(g_mockCatalogService->catalogGetAllMeta, pCatalogReq, pMetaData);
}
- void doPutMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache,
- bool isInsertValues) {
- DO_WITH_THROW(putMetaDataToCache, pCatalogReq, pMetaData, pMetaCache, isInsertValues);
+ void doPutMetaDataToCache(const SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SParseMetaCache* pMetaCache) {
+ DO_WITH_THROW(putMetaDataToCache, pCatalogReq, pMetaData, pMetaCache);
}
void doAuthenticate(SParseContext* pCxt, SQuery* pQuery, SParseMetaCache* pMetaCache) {
@@ -280,15 +279,14 @@ class ParserTestBaseImpl {
res_.calcConstAst_ = toString(pQuery->pRoot);
}
- void doParseInsertSql(SParseContext* pCxt, SQuery** pQuery, SParseMetaCache* pMetaCache) {
- DO_WITH_THROW(parseInsertSql, pCxt, pQuery, pMetaCache);
+ void doParseInsertSql(SParseContext* pCxt, SQuery** pQuery, SCatalogReq* pCatalogReq, const SMetaData* pMetaData) {
+ DO_WITH_THROW(parseInsertSql, pCxt, pQuery, pCatalogReq, pMetaData);
ASSERT_NE(*pQuery, nullptr);
res_.parsedAst_ = toString((*pQuery)->pRoot);
}
- void doParseInsertSyntax(SParseContext* pCxt, SQuery** pQuery, SParseMetaCache* pMetaCache) {
- DO_WITH_THROW(parseInsertSyntax, pCxt, pQuery, pMetaCache);
- ASSERT_NE(*pQuery, nullptr);
+ void doContinueParseSql(SParseContext* pCxt, SCatalogReq* pCatalogReq, const SMetaData* pMetaData, SQuery* pQuery) {
+ DO_WITH_THROW(qContinueParseSql, pCxt, pCatalogReq, pMetaData, pQuery);
}
string toString(const SNode* pRoot) {
@@ -314,7 +312,7 @@ class ParserTestBaseImpl {
if (qIsInsertValuesSql(cxt.pSql, cxt.sqlLen)) {
unique_ptr query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
- doParseInsertSql(&cxt, query.get(), nullptr);
+ doParseInsertSql(&cxt, query.get(), nullptr, nullptr);
} else {
unique_ptr query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
doParse(&cxt, query.get());
@@ -360,61 +358,102 @@ class ParserTestBaseImpl {
}
}
- void runAsyncInternalFuncs(const string& sql, int32_t expect, ParserStage checkStage) {
- reset(expect, checkStage, TEST_INTERFACE_ASYNC_INTERNAL);
- try {
- unique_ptr > cxt(new SParseContext(), destoryParseContext);
- setParseContext(sql, cxt.get(), true);
-
- unique_ptr query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
- bool request = true;
- unique_ptr > metaCache(
- new SParseMetaCache(), bind(destoryParseMetaCacheWarpper, _1, cref(request)));
- bool isInsertValues = qIsInsertValuesSql(cxt->pSql, cxt->sqlLen);
- if (isInsertValues) {
- doParseInsertSyntax(cxt.get(), query.get(), metaCache.get());
- } else {
- doParse(cxt.get(), query.get());
- doCollectMetaKey(cxt.get(), *(query.get()), metaCache.get());
+ void runQueryAsyncInternalFuncs(SParseContext* pParCxt) {
+ unique_ptr query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
+ bool request = true;
+ unique_ptr > metaCache(
+ new SParseMetaCache(), bind(destoryParseMetaCacheWarpper, _1, cref(request)));
+ doParse(pParCxt, query.get());
+ doCollectMetaKey(pParCxt, *(query.get()), metaCache.get());
+
+ SQuery* pQuery = *(query.get());
+
+ unique_ptr catalogReq(new SCatalogReq(),
+ MockCatalogService::destoryCatalogReq);
+ doBuildCatalogReq(pParCxt, metaCache.get(), catalogReq.get());
+
+ string err;
+ thread t1([&]() {
+ try {
+ unique_ptr metaData(new SMetaData(), MockCatalogService::destoryMetaData);
+ doGetAllMeta(catalogReq.get(), metaData.get());
+
+ metaCache.reset(new SParseMetaCache());
+ request = false;
+ doPutMetaDataToCache(catalogReq.get(), metaData.get(), metaCache.get());
+
+ doAuthenticate(pParCxt, pQuery, metaCache.get());
+
+ doTranslate(pParCxt, pQuery, metaCache.get());
+
+ doCalculateConstant(pParCxt, pQuery);
+ } catch (const TerminateFlag& e) {
+ // success and terminate
+ } catch (const runtime_error& e) {
+ err = e.what();
+ } catch (...) {
+ err = "unknown error";
}
+ });
- SQuery* pQuery = *(query.get());
-
- unique_ptr catalogReq(new SCatalogReq(),
- MockCatalogService::destoryCatalogReq);
- doBuildCatalogReq(cxt.get(), metaCache.get(), catalogReq.get());
+ t1.join();
+ if (!err.empty()) {
+ throw runtime_error(err);
+ }
+ }
- string err;
- thread t1([&]() {
- try {
- unique_ptr metaData(new SMetaData(), MockCatalogService::destoryMetaData);
- doGetAllMeta(catalogReq.get(), metaData.get());
+ void runInsertAsyncInternalFuncsImpl(SParseContext* pParCxt, SQuery** pQuery, SCatalogReq* pCatalogReq,
+ SMetaData* pMetaData) {
+ doParseInsertSql(pParCxt, pQuery, pCatalogReq, pMetaData);
- metaCache.reset(new SParseMetaCache());
- request = false;
- doPutMetaDataToCache(catalogReq.get(), metaData.get(), metaCache.get(), isInsertValues);
+ if (QUERY_EXEC_STAGE_SCHEDULE == (*pQuery)->execStage) {
+ return;
+ }
- if (isInsertValues) {
- doParseInsertSql(cxt.get(), query.get(), metaCache.get());
- } else {
- doAuthenticate(cxt.get(), pQuery, metaCache.get());
+ string err;
+ thread t1([&]() {
+ try {
+ doGetAllMeta(pCatalogReq, pMetaData);
- doTranslate(cxt.get(), pQuery, metaCache.get());
+ doParseInsertSql(pParCxt, pQuery, pCatalogReq, pMetaData);
- doCalculateConstant(cxt.get(), pQuery);
- }
- } catch (const TerminateFlag& e) {
- // success and terminate
- } catch (const runtime_error& e) {
- err = e.what();
- } catch (...) {
- err = "unknown error";
+ if (QUERY_EXEC_STAGE_SCHEDULE != (*pQuery)->execStage) {
+ runInsertAsyncInternalFuncsImpl(pParCxt, pQuery, pCatalogReq, pMetaData);
}
- });
+ } catch (const TerminateFlag& e) {
+ // success and terminate
+ } catch (const runtime_error& e) {
+ err = e.what();
+ } catch (...) {
+ err = "unknown error";
+ }
+ });
+
+ t1.join();
+ if (!err.empty()) {
+ throw runtime_error(err);
+ }
+ }
+
+ void runInsertAsyncInternalFuncs(SParseContext* pParCxt) {
+ unique_ptr query((SQuery**)taosMemoryCalloc(1, sizeof(SQuery*)), destroyQuery);
+ unique_ptr catalogReq(new SCatalogReq(),
+ MockCatalogService::destoryCatalogReq);
+ unique_ptr metaData(new SMetaData(), MockCatalogService::destoryMetaData);
+ runInsertAsyncInternalFuncsImpl(pParCxt, query.get(), catalogReq.get(), metaData.get());
+ }
+
+ void runAsyncInternalFuncs(const string& sql, int32_t expect, ParserStage checkStage) {
+ reset(expect, checkStage, TEST_INTERFACE_ASYNC_INTERNAL);
+ try {
+ unique_ptr > cxt(new SParseContext(), destoryParseContext);
+ setParseContext(sql, cxt.get(), true);
- t1.join();
- if (!err.empty()) {
- throw runtime_error(err);
+ bool isInsertValues = qIsInsertValuesSql(cxt->pSql, cxt->sqlLen);
+ if (isInsertValues) {
+ runInsertAsyncInternalFuncs(cxt.get());
+ } else {
+ runQueryAsyncInternalFuncs(cxt.get());
}
if (g_dump) {
@@ -441,25 +480,39 @@ class ParserTestBaseImpl {
doParseSqlSyntax(cxt.get(), query.get(), catalogReq.get());
SQuery* pQuery = *(query.get());
- string err;
- thread t1([&]() {
- try {
- unique_ptr metaData(new SMetaData(), MockCatalogService::destoryMetaData);
- doGetAllMeta(catalogReq.get(), metaData.get());
-
- doAnalyseSqlSemantic(cxt.get(), catalogReq.get(), metaData.get(), pQuery);
- } catch (const TerminateFlag& e) {
- // success and terminate
- } catch (const runtime_error& e) {
- err = e.what();
- } catch (...) {
- err = "unknown error";
+ switch (pQuery->execStage) {
+ case QUERY_EXEC_STAGE_PARSE:
+ case QUERY_EXEC_STAGE_ANALYSE: {
+ string err;
+ thread t1([&]() {
+ try {
+ unique_ptr metaData(new SMetaData(),
+ MockCatalogService::destoryMetaData);
+ doGetAllMeta(catalogReq.get(), metaData.get());
+ if (QUERY_EXEC_STAGE_PARSE == pQuery->execStage) {
+ doContinueParseSql(cxt.get(), catalogReq.get(), metaData.get(), pQuery);
+ } else {
+ doAnalyseSqlSemantic(cxt.get(), catalogReq.get(), metaData.get(), pQuery);
+ }
+ } catch (const TerminateFlag& e) {
+ // success and terminate
+ } catch (const runtime_error& e) {
+ err = e.what();
+ } catch (...) {
+ err = "unknown error";
+ }
+ });
+
+ t1.join();
+ if (!err.empty()) {
+ throw runtime_error(err);
+ }
+ break;
}
- });
-
- t1.join();
- if (!err.empty()) {
- throw runtime_error(err);
+ case QUERY_EXEC_STAGE_SCHEDULE:
+ break;
+ default:
+ break;
}
if (g_dump) {
diff --git a/source/libs/planner/src/planLogicCreater.c b/source/libs/planner/src/planLogicCreater.c
index 275983f8699ae97fc708055ee4aa739852ae4de8..89e8a858956afacfc0bf39f7ca4b7a060125da7e 100644
--- a/source/libs/planner/src/planLogicCreater.c
+++ b/source/libs/planner/src/planLogicCreater.c
@@ -189,7 +189,7 @@ static int32_t createSelectRootLogicNode(SLogicPlanContext* pCxt, SSelectStmt* p
}
static EScanType getScanType(SLogicPlanContext* pCxt, SNodeList* pScanPseudoCols, SNodeList* pScanCols,
- int8_t tableType) {
+ int8_t tableType, bool tagScan) {
if (pCxt->pPlanCxt->topicQuery || pCxt->pPlanCxt->streamQuery) {
return SCAN_TYPE_STREAM;
}
@@ -198,6 +198,10 @@ static EScanType getScanType(SLogicPlanContext* pCxt, SNodeList* pScanPseudoCols
return SCAN_TYPE_SYSTEM_TABLE;
}
+ if (tagScan) {
+ return SCAN_TYPE_TAG;
+ }
+
if (NULL == pScanCols) {
return NULL == pScanPseudoCols
? SCAN_TYPE_TABLE
@@ -310,7 +314,7 @@ static int32_t createScanLogicNode(SLogicPlanContext* pCxt, SSelectStmt* pSelect
code = rewriteExprsForSelect(pScan->pScanPseudoCols, pSelect, SQL_CLAUSE_FROM);
}
- pScan->scanType = getScanType(pCxt, pScan->pScanPseudoCols, pScan->pScanCols, pScan->tableType);
+ pScan->scanType = getScanType(pCxt, pScan->pScanPseudoCols, pScan->pScanCols, pScan->tableType, pSelect->tagScan);
if (NULL != pScan->pScanCols) {
pScan->hasNormalCols = true;
diff --git a/source/libs/planner/src/planOptimizer.c b/source/libs/planner/src/planOptimizer.c
index 79f33f3ac33fb1586780578d63d5a09d1b878a25..45fa67faef79bcc167b12776fb496dcaef59a1ff 100644
--- a/source/libs/planner/src/planOptimizer.c
+++ b/source/libs/planner/src/planOptimizer.c
@@ -348,7 +348,9 @@ static int32_t scanPathOptimize(SOptimizeContext* pCxt, SLogicSubplan* pLogicSub
int32_t code = scanPathOptMatch(pCxt, pLogicSubplan->pNode, &info);
if (TSDB_CODE_SUCCESS == code && info.pScan) {
scanPathOptSetScanWin(info.pScan);
- scanPathOptSetScanOrder(info.scanOrder, info.pScan);
+ if (!pCxt->pPlanCxt->streamQuery) {
+ scanPathOptSetScanOrder(info.scanOrder, info.pScan);
+ }
}
if (TSDB_CODE_SUCCESS == code && (NULL != info.pDsoFuncs || NULL != info.pSdrFuncs)) {
info.pScan->dataRequired = scanPathOptGetDataRequired(info.pSdrFuncs);
@@ -833,6 +835,7 @@ static int32_t partitionAggCondConj(SAggLogicNode* pAgg, SNode** ppAggFuncCond,
nodesDestroyNode(pTempAggFuncCond);
nodesDestroyNode(pTempGroupKeyCond);
}
+ nodesDestroyNode(pAgg->node.pConditions);
pAgg->node.pConditions = NULL;
return code;
}
@@ -853,8 +856,7 @@ static int32_t partitionAggCond(SAggLogicNode* pAgg, SNode** ppAggFunCond, SNode
}
static int32_t pushCondToAggCond(SOptimizeContext* pCxt, SAggLogicNode* pAgg, SNode** pAggFuncCond) {
- pushDownCondOptAppendCond(&pAgg->node.pConditions, pAggFuncCond);
- return TSDB_CODE_SUCCESS;
+ return pushDownCondOptAppendCond(&pAgg->node.pConditions, pAggFuncCond);
}
typedef struct SRewriteAggGroupKeyCondContext {
diff --git a/source/libs/planner/src/planSpliter.c b/source/libs/planner/src/planSpliter.c
index 0af8f5075e6dccb7f2889f807edc775485a2d228..489046d88e73219fda229b6a2329096fd55d8f8f 100644
--- a/source/libs/planner/src/planSpliter.c
+++ b/source/libs/planner/src/planSpliter.c
@@ -66,16 +66,36 @@ static SLogicSubplan* splCreateScanSubplan(SSplitContext* pCxt, SLogicNode* pNod
return pSubplan;
}
-static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode, ESubplanType subplanType) {
+static bool splHasScan(SLogicNode* pNode) {
+ if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pNode)) {
+ return true;
+ }
+
+ SNode* pChild = NULL;
+ FOREACH(pChild, pNode->pChildren) {
+ if (QUERY_NODE_LOGIC_PLAN_SCAN == nodeType(pChild)) {
+ return true;
+ }
+ return splHasScan((SLogicNode*)pChild);
+ }
+
+ return false;
+}
+
+static void splSetSubplanType(SLogicSubplan* pSubplan) {
+ pSubplan->subplanType = splHasScan(pSubplan->pNode) ? SUBPLAN_TYPE_SCAN : SUBPLAN_TYPE_MERGE;
+}
+
+static SLogicSubplan* splCreateSubplan(SSplitContext* pCxt, SLogicNode* pNode) {
SLogicSubplan* pSubplan = (SLogicSubplan*)nodesMakeNode(QUERY_NODE_LOGIC_SUBPLAN);
if (NULL == pSubplan) {
return NULL;
}
pSubplan->id.queryId = pCxt->queryId;
pSubplan->id.groupId = pCxt->groupId;
- pSubplan->subplanType = subplanType;
pSubplan->pNode = pNode;
pNode->pParent = NULL;
+ splSetSubplanType(pSubplan);
return pSubplan;
}
@@ -576,6 +596,7 @@ static int32_t stbSplSplitSessionForStream(SSplitContext* pCxt, SStableSplitInfo
int32_t index = 0;
int32_t code = stbSplAppendWEnd(pPartWin, &index);
if (TSDB_CODE_SUCCESS == code) {
+ nodesDestroyNode(pMergeWin->pTsEnd);
pMergeWin->pTsEnd = nodesCloneNode(nodesListGetNode(pPartWin->node.pTargets, index));
if (NULL == pMergeWin->pTsEnd) {
code = TSDB_CODE_OUT_OF_MEMORY;
@@ -1204,7 +1225,7 @@ static int32_t unionSplitSubplan(SSplitContext* pCxt, SLogicSubplan* pUnionSubpl
SNode* pChild = NULL;
FOREACH(pChild, pSplitNode->pChildren) {
- SLogicSubplan* pNewSubplan = splCreateSubplan(pCxt, (SLogicNode*)pChild, pUnionSubplan->subplanType);
+ SLogicSubplan* pNewSubplan = splCreateSubplan(pCxt, (SLogicNode*)pChild);
code = nodesListMakeStrictAppend(&pUnionSubplan->pChildren, (SNode*)pNewSubplan);
if (TSDB_CODE_SUCCESS == code) {
REPLACE_NODE(NULL);
@@ -1390,10 +1411,9 @@ static int32_t insertSelectSplit(SSplitContext* pCxt, SLogicSubplan* pSubplan) {
SLogicSubplan* pNewSubplan = NULL;
SNodeList* pSubplanChildren = info.pSubplan->pChildren;
- ESubplanType subplanType = info.pSubplan->subplanType;
int32_t code = splCreateExchangeNodeForSubplan(pCxt, info.pSubplan, info.pQueryRoot, SUBPLAN_TYPE_MODIFY);
if (TSDB_CODE_SUCCESS == code) {
- pNewSubplan = splCreateSubplan(pCxt, info.pQueryRoot, subplanType);
+ pNewSubplan = splCreateSubplan(pCxt, info.pQueryRoot);
if (NULL == pNewSubplan) {
code = TSDB_CODE_OUT_OF_MEMORY;
}
diff --git a/source/libs/planner/test/planStateTest.cpp b/source/libs/planner/test/planStateTest.cpp
index 6985bc88070e2340af28b51c716b1da3db54f0cb..3dafaa8bf556212382a4a0e8c2ec27e818415290 100644
--- a/source/libs/planner/test/planStateTest.cpp
+++ b/source/libs/planner/test/planStateTest.cpp
@@ -29,7 +29,7 @@ TEST_F(PlanStateTest, basic) {
TEST_F(PlanStateTest, stateExpr) {
useDb("root", "test");
- run("SELECT COUNT(*) FROM t1 STATE_WINDOW(c1 + 10)");
+ run("SELECT COUNT(*) FROM t1 STATE_WINDOW(CASE WHEN c1 > 10 THEN 1 ELSE 0 END)");
}
TEST_F(PlanStateTest, selectFunc) {
diff --git a/source/libs/qcom/src/queryUtil.c b/source/libs/qcom/src/queryUtil.c
index cf064881c27659c9fbcc048329d91049ca6d4bee..6eadf80e3d3ee8d44668f01a4a7dbb47d70c2c05 100644
--- a/source/libs/qcom/src/queryUtil.c
+++ b/source/libs/qcom/src/queryUtil.c
@@ -146,6 +146,12 @@ void destroySendMsgInfo(SMsgSendInfo* pMsgBody) {
}
taosMemoryFreeClear(pMsgBody);
}
+void destroyAhandle(void *ahandle) {
+ SMsgSendInfo *pSendInfo = ahandle;
+ if (pSendInfo == NULL) return;
+
+ destroySendMsgInfo(pSendInfo);
+}
int32_t asyncSendMsgToServerExt(void* pTransporter, SEpSet* epSet, int64_t* pTransporterId, SMsgSendInfo* pInfo,
bool persistHandle, void* rpcCtx) {
diff --git a/source/libs/qcom/src/querymsg.c b/source/libs/qcom/src/querymsg.c
index 953abd595695a3616e3cf89fa89994f3306283d0..fadc39f21d1be3c8d3df4a7d5af05064216fec27 100644
--- a/source/libs/qcom/src/querymsg.c
+++ b/source/libs/qcom/src/querymsg.c
@@ -41,8 +41,9 @@ int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) {
pOut->dbVgroup->hashMethod = usedbRsp->hashMethod;
pOut->dbVgroup->hashPrefix = usedbRsp->hashPrefix;
pOut->dbVgroup->hashSuffix = usedbRsp->hashSuffix;
+ pOut->dbVgroup->stateTs = usedbRsp->stateTs;
- qDebug("Got %d vgroup for db %s", usedbRsp->vgNum, usedbRsp->db);
+ qDebug("Got %d vgroup for db %s, vgVersion:%d, stateTs:%" PRId64, usedbRsp->vgNum, usedbRsp->db, usedbRsp->vgVersion, usedbRsp->stateTs);
if (usedbRsp->vgNum <= 0) {
return TSDB_CODE_SUCCESS;
@@ -103,6 +104,7 @@ int32_t queryBuildUseDbMsg(void *input, char **msg, int32_t msgSize, int32_t *ms
usedbReq.vgVersion = pInput->vgVersion;
usedbReq.dbId = pInput->dbId;
usedbReq.numOfTable = pInput->numOfTable;
+ usedbReq.stateTs = pInput->stateTs;
int32_t bufLen = tSerializeSUseDbReq(NULL, 0, &usedbReq);
void *pBuf = (*mallcFp)(bufLen);
@@ -306,6 +308,15 @@ int32_t queryProcessUseDBRsp(void *output, char *msg, int32_t msgSize) {
goto PROCESS_USEDB_OVER;
}
+ qTrace("db:%s, usedbRsp received, numOfVgroups:%d", usedbRsp.db, usedbRsp.vgNum);
+ for (int32_t i = 0; i < usedbRsp.vgNum; ++i) {
+ SVgroupInfo *pInfo = taosArrayGet(usedbRsp.pVgroupInfos, i);
+ qTrace("vgId:%d, numOfEps:%d inUse:%d ", pInfo->vgId, pInfo->epSet.numOfEps, pInfo->epSet.inUse);
+ for (int32_t j = 0; j < pInfo->epSet.numOfEps; ++j) {
+ qTrace("vgId:%d, index:%d epset:%s:%u", pInfo->vgId, j, pInfo->epSet.eps[j].fqdn, pInfo->epSet.eps[j].port);
+ }
+ }
+
code = queryBuildUseDbOutput(pOut, &usedbRsp);
PROCESS_USEDB_OVER:
diff --git a/source/libs/qworker/inc/qwInt.h b/source/libs/qworker/inc/qwInt.h
index 36c6817595d156392a0865958f21ac5b3db1b2f3..a9eca6467557d161e22ed8bf42ff2c97feaf889c 100644
--- a/source/libs/qworker/inc/qwInt.h
+++ b/source/libs/qworker/inc/qwInt.h
@@ -246,7 +246,7 @@ typedef struct SQWorkerMgmt {
#define QW_ERR_RET(c) \
do { \
- int32_t _code = c; \
+ int32_t _code = (c); \
if (_code != TSDB_CODE_SUCCESS) { \
terrno = _code; \
return _code; \
@@ -254,7 +254,7 @@ typedef struct SQWorkerMgmt {
} while (0)
#define QW_RET(c) \
do { \
- int32_t _code = c; \
+ int32_t _code = (c); \
if (_code != TSDB_CODE_SUCCESS) { \
terrno = _code; \
} \
@@ -262,7 +262,7 @@ typedef struct SQWorkerMgmt {
} while (0)
#define QW_ERR_JRET(c) \
do { \
- code = c; \
+ code = (c); \
if (code != TSDB_CODE_SUCCESS) { \
terrno = code; \
goto _return; \
diff --git a/source/libs/qworker/src/qwDbg.c b/source/libs/qworker/src/qwDbg.c
index 18713162601660c28e037d2bf57d00980b110017..4c4a41df8282e57023798edecbaec4beefb10691 100644
--- a/source/libs/qworker/src/qwDbg.c
+++ b/source/libs/qworker/src/qwDbg.c
@@ -91,11 +91,53 @@ _return:
void qwDbgDumpSchInfo(SQWorker *mgmt, SQWSchStatus *sch, int32_t i) {
QW_LOCK(QW_READ, &sch->tasksLock);
- QW_DLOG("the %dth scheduler status, hbBrokenTs:%" PRId64 ",taskNum:%d", i, sch->hbBrokenTs,
- taosHashGetSize(sch->tasksHash));
+ int32_t taskNum = taosHashGetSize(sch->tasksHash);
+ QW_DLOG("***The %dth scheduler status, hbBrokenTs:%" PRId64 ",taskNum:%d", i, sch->hbBrokenTs, taskNum);
+
+ uint64_t qId, tId;
+ int32_t eId;
+ SQWTaskStatus *pTask = NULL;
+ void *pIter = taosHashIterate(sch->tasksHash, NULL);
+ while (pIter) {
+ pTask = (SQWTaskStatus *)pIter;
+ void *key = taosHashGetKey(pIter, NULL);
+ QW_GET_QTID(key, qId, tId, eId);
+
+ QW_TASK_DLOG("job refId:%" PRIx64 ", code:%x, task status:%d", pTask->refId, pTask->code, pTask->status);
+
+ pIter = taosHashIterate(sch->tasksHash, pIter);
+ }
+
QW_UNLOCK(QW_READ, &sch->tasksLock);
}
+void qwDbgDumpTasksInfo(SQWorker *mgmt) {
+ QW_DUMP("***Total remain ctx num %d", taosHashGetSize(mgmt->ctxHash));
+
+ int32_t i = 0;
+ SQWTaskCtx *ctx = NULL;
+ uint64_t qId, tId;
+ int32_t eId;
+ void *pIter = taosHashIterate(mgmt->ctxHash, NULL);
+ while (pIter) {
+ ctx = (SQWTaskCtx *)pIter;
+ void *key = taosHashGetKey(pIter, NULL);
+ QW_GET_QTID(key, qId, tId, eId);
+
+ QW_TASK_DLOG("%p lock:%x, phase:%d, type:%d, explain:%d, needFetch:%d, localExec:%d, msgType:%d, fetchType:%d, "
+ "execId:%x, level:%d, queryGotData:%d, queryRsped:%d, queryEnd:%d, queryContinue:%d, queryInQueue:%d, "
+ "rspCode:%x, affectedRows:%" PRId64 ", taskHandle:%p, sinkHandle:%p, tbFName:%s, sver:%d, tver:%d, events:%d,%d,%d,%d,%d",
+ ctx, ctx->lock, ctx->phase, ctx->taskType, ctx->explain, ctx->needFetch, ctx->localExec, ctx->msgType,
+ ctx->fetchType, ctx->execId, ctx->level, ctx->queryGotData, ctx->queryRsped, ctx->queryEnd, ctx->queryContinue,
+ ctx->queryInQueue, ctx->rspCode, ctx->affectedRows, ctx->taskHandle, ctx->sinkHandle, ctx->tbInfo.tbFName,
+ ctx->tbInfo.sversion, ctx->tbInfo.tversion, ctx->events[QW_EVENT_CANCEL], ctx->events[QW_EVENT_READY],
+ ctx->events[QW_EVENT_FETCH], ctx->events[QW_EVENT_DROP], ctx->events[QW_EVENT_CQUERY]);
+
+ pIter = taosHashIterate(mgmt->ctxHash, pIter);
+ }
+
+}
+
void qwDbgDumpMgmtInfo(SQWorker *mgmt) {
if (!gQWDebug.dumpEnable) {
return;
@@ -120,7 +162,7 @@ void qwDbgDumpMgmtInfo(SQWorker *mgmt) {
QW_UNLOCK(QW_READ, &mgmt->schLock);
- QW_DUMP("total remain ctx num %d", taosHashGetSize(mgmt->ctxHash));
+ qwDbgDumpTasksInfo(mgmt);
}
int32_t qwDbgBuildAndSendRedirectRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t code, SEpSet *pEpSet) {
diff --git a/source/libs/qworker/src/qwMsg.c b/source/libs/qworker/src/qwMsg.c
index 14ac4f5bea8a3b6b82b817add71d2f277eed48d8..bb8a7cd140fa22992127d8c40f71d5fdbb0f251b 100644
--- a/source/libs/qworker/src/qwMsg.c
+++ b/source/libs/qworker/src/qwMsg.c
@@ -8,6 +8,7 @@
#include "tcommon.h"
#include "tmsg.h"
#include "tname.h"
+#include "tgrant.h"
int32_t qwMallocFetchRsp(int8_t rpcMalloc, int32_t length, SRetrieveTableRsp **rsp) {
int32_t msgSize = sizeof(SRetrieveTableRsp) + length;
@@ -64,19 +65,37 @@ int32_t qwBuildAndSendErrorRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t c
int32_t qwBuildAndSendQueryRsp(int32_t rspType, SRpcHandleInfo *pConn, int32_t code, SQWTaskCtx *ctx) {
STbVerInfo *tbInfo = ctx ? &ctx->tbInfo : NULL;
int64_t affectedRows = ctx ? ctx->affectedRows : 0;
- SQueryTableRsp *pRsp = (SQueryTableRsp *)rpcMallocCont(sizeof(SQueryTableRsp));
- pRsp->code = htonl(code);
- pRsp->affectedRows = htobe64(affectedRows);
+ SQueryTableRsp rsp = {0};
+ rsp.code = code;
+ rsp.affectedRows = affectedRows;
+
if (tbInfo) {
- strcpy(pRsp->tbFName, tbInfo->tbFName);
- pRsp->sversion = htonl(tbInfo->sversion);
- pRsp->tversion = htonl(tbInfo->tversion);
+ strcpy(rsp.tbFName, tbInfo->tbFName);
+ rsp.sversion = tbInfo->sversion;
+ rsp.tversion = tbInfo->tversion;
+ }
+
+ int32_t msgSize = tSerializeSQueryTableRsp(NULL, 0, &rsp);
+ if (msgSize < 0) {
+ qError("tSerializeSQueryTableRsp failed");
+ QW_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ void *pRsp = rpcMallocCont(msgSize);
+ if (NULL == pRsp) {
+ qError("rpcMallocCont %d failed", msgSize);
+ QW_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ if (tSerializeSQueryTableRsp(pRsp, msgSize, &rsp) < 0) {
+ qError("tSerializeSQueryTableRsp %d failed", msgSize);
+ QW_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
}
SRpcMsg rpcRsp = {
.msgType = rspType,
.pCont = pRsp,
- .contLen = sizeof(*pRsp),
+ .contLen = msgSize,
.code = code,
.info = *pConn,
};
@@ -181,23 +200,37 @@ int32_t qwBuildAndSendDropRsp(SRpcHandleInfo *pConn, int32_t code) {
#endif
int32_t qwBuildAndSendDropMsg(QW_FPARAMS_DEF, SRpcHandleInfo *pConn) {
- STaskDropReq *req = (STaskDropReq *)rpcMallocCont(sizeof(STaskDropReq));
- if (NULL == req) {
- QW_SCH_TASK_ELOG("rpcMallocCont %d failed", (int32_t)sizeof(STaskDropReq));
+ STaskDropReq qMsg;
+ qMsg.header.vgId = mgmt->nodeId;
+ qMsg.header.contLen = 0;
+ qMsg.sId = sId;
+ qMsg.queryId = qId;
+ qMsg.taskId = tId;
+ qMsg.refId = rId;
+ qMsg.execId = eId;
+
+ int32_t msgSize = tSerializeSTaskDropReq(NULL, 0, &qMsg);
+ if (msgSize < 0) {
+ QW_SCH_TASK_ELOG("tSerializeSTaskDropReq get size, msgSize:%d", msgSize);
+ QW_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ void *msg = rpcMallocCont(msgSize);
+ if (NULL == msg) {
+ QW_SCH_TASK_ELOG("rpcMallocCont %d failed", msgSize);
+ QW_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ if (tSerializeSTaskDropReq(msg, msgSize, &qMsg) < 0) {
+ QW_SCH_TASK_ELOG("tSerializeSTaskDropReq failed, msgSize:%d", msgSize);
+ rpcFreeCont(msg);
QW_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
}
-
- req->header.vgId = mgmt->nodeId;
- req->sId = sId;
- req->queryId = qId;
- req->taskId = tId;
- req->refId = rId;
- req->execId = eId;
SRpcMsg pNewMsg = {
.msgType = TDMT_SCH_DROP_TASK,
- .pCont = req,
- .contLen = sizeof(STaskDropReq),
+ .pCont = msg,
+ .contLen = msgSize,
.code = 0,
.info = *pConn,
};
@@ -246,22 +279,37 @@ int32_t qwBuildAndSendCQueryMsg(QW_FPARAMS_DEF, SRpcHandleInfo *pConn) {
}
int32_t qwRegisterQueryBrokenLinkArg(QW_FPARAMS_DEF, SRpcHandleInfo *pConn) {
- STaskDropReq *req = (STaskDropReq *)rpcMallocCont(sizeof(STaskDropReq));
- if (NULL == req) {
- QW_SCH_TASK_ELOG("rpcMallocCont %d failed", (int32_t)sizeof(STaskDropReq));
+ STaskDropReq qMsg;
+ qMsg.header.vgId = mgmt->nodeId;
+ qMsg.header.contLen = 0;
+ qMsg.sId = sId;
+ qMsg.queryId = qId;
+ qMsg.taskId = tId;
+ qMsg.refId = rId;
+ qMsg.execId = eId;
+
+ int32_t msgSize = tSerializeSTaskDropReq(NULL, 0, &qMsg);
+ if (msgSize < 0) {
+ QW_SCH_TASK_ELOG("tSerializeSTaskDropReq get size, msgSize:%d", msgSize);
+ QW_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ void *msg = rpcMallocCont(msgSize);
+ if (NULL == msg) {
+ QW_SCH_TASK_ELOG("rpcMallocCont %d failed", msgSize);
+ QW_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
+ if (tSerializeSTaskDropReq(msg, msgSize, &qMsg) < 0) {
+ QW_SCH_TASK_ELOG("tSerializeSTaskDropReq failed, msgSize:%d", msgSize);
+ rpcFreeCont(msg);
QW_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
}
-
- req->header.vgId = htonl(mgmt->nodeId);
- req->sId = htobe64(sId);
- req->queryId = htobe64(qId);
- req->taskId = htobe64(tId);
- req->refId = htobe64(rId);
SRpcMsg brokenMsg = {
.msgType = TDMT_SCH_DROP_TASK,
- .pCont = req,
- .contLen = sizeof(STaskDropReq),
+ .pCont = msg,
+ .contLen = msgSize,
.code = TSDB_CODE_RPC_BROKEN_LINK,
.info = *pConn,
};
@@ -305,40 +353,39 @@ int32_t qwRegisterHbBrokenLinkArg(SQWorker *mgmt, uint64_t sId, SRpcHandleInfo *
return TSDB_CODE_SUCCESS;
}
-int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg) {
+int32_t qWorkerPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg, bool chkGrant) {
if (NULL == qWorkerMgmt || NULL == pMsg) {
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
int32_t code = 0;
- SSubQueryMsg *msg = pMsg->pCont;
SQWorker *mgmt = (SQWorker *)qWorkerMgmt;
-
- if (NULL == msg || pMsg->contLen <= sizeof(*msg)) {
- QW_ELOG("invalid query msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
+ SSubQueryMsg msg = {0};
+ if (tDeserializeSSubQueryMsg(pMsg->pCont, pMsg->contLen, &msg) < 0) {
+ QW_ELOG("tDeserializeSSubQueryMsg failed, contLen:%d", pMsg->contLen);
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
- msg->sId = be64toh(msg->sId);
- msg->queryId = be64toh(msg->queryId);
- msg->taskId = be64toh(msg->taskId);
- msg->refId = be64toh(msg->refId);
- msg->execId = ntohl(msg->execId);
- msg->phyLen = ntohl(msg->phyLen);
- msg->sqlLen = ntohl(msg->sqlLen);
+ if (chkGrant && (!TEST_SHOW_REWRITE_MASK(msg.msgMask)) && (grantCheck(TSDB_GRANT_TIME) != TSDB_CODE_SUCCESS)) {
+ QW_ELOG("query failed cause of grant expired, msgMask:%d", msg.msgMask);
+ tFreeSSubQueryMsg(&msg);
+ QW_ERR_RET(TSDB_CODE_GRANT_EXPIRED);
+ }
- uint64_t sId = msg->sId;
- uint64_t qId = msg->queryId;
- uint64_t tId = msg->taskId;
- int64_t rId = msg->refId;
- int32_t eId = msg->execId;
+ uint64_t sId = msg.sId;
+ uint64_t qId = msg.queryId;
+ uint64_t tId = msg.taskId;
+ int64_t rId = msg.refId;
+ int32_t eId = msg.execId;
SQWMsg qwMsg = {
- .msgType = pMsg->msgType, .msg = msg->msg + msg->sqlLen, .msgLen = msg->phyLen, .connInfo = pMsg->info};
+ .msgType = pMsg->msgType, .msg = msg.msg, .msgLen = msg.msgLen, .connInfo = pMsg->info};
- QW_SCH_TASK_DLOG("prerocessQuery start, handle:%p", pMsg->info.handle);
- QW_ERR_RET(qwPreprocessQuery(QW_FPARAMS(), &qwMsg));
- QW_SCH_TASK_DLOG("prerocessQuery end, handle:%p", pMsg->info.handle);
+ QW_SCH_TASK_DLOG("prerocessQuery start, handle:%p, SQL:%s", pMsg->info.handle, msg.sql);
+ code = qwPreprocessQuery(QW_FPARAMS(), &qwMsg);
+ QW_SCH_TASK_DLOG("prerocessQuery end, handle:%p, code:%x", pMsg->info.handle, code);
+
+ tFreeSSubQueryMsg(&msg);
return TSDB_CODE_SUCCESS;
}
@@ -348,19 +395,25 @@ int32_t qWorkerAbortPreprocessQueryMsg(void *qWorkerMgmt, SRpcMsg *pMsg) {
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
- SSubQueryMsg *msg = pMsg->pCont;
SQWorker *mgmt = (SQWorker *)qWorkerMgmt;
+ SSubQueryMsg msg = {0};
+ if (tDeserializeSSubQueryMsg(pMsg->pCont, pMsg->contLen, &msg) < 0) {
+ QW_ELOG("tDeserializeSSubQueryMsg failed, contLen:%d", pMsg->contLen);
+ QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
+ }
- uint64_t sId = msg->sId;
- uint64_t qId = msg->queryId;
- uint64_t tId = msg->taskId;
- int64_t rId = msg->refId;
- int32_t eId = msg->execId;
+ uint64_t sId = msg.sId;
+ uint64_t qId = msg.queryId;
+ uint64_t tId = msg.taskId;
+ int64_t rId = msg.refId;
+ int32_t eId = msg.execId;
QW_SCH_TASK_DLOG("Abort prerocessQuery start, handle:%p", pMsg->info.handle);
qwAbortPrerocessQuery(QW_FPARAMS());
QW_SCH_TASK_DLOG("Abort prerocessQuery end, handle:%p", pMsg->info.handle);
+ tFreeSSubQueryMsg(&msg);
+
return TSDB_CODE_SUCCESS;
}
@@ -370,42 +423,41 @@ int32_t qWorkerProcessQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int
}
int32_t code = 0;
- SSubQueryMsg *msg = pMsg->pCont;
SQWorker *mgmt = (SQWorker *)qWorkerMgmt;
qwUpdateTimeInQueue(mgmt, ts, QUERY_QUEUE);
QW_STAT_INC(mgmt->stat.msgStat.queryProcessed, 1);
- if (NULL == msg || pMsg->contLen <= sizeof(*msg)) {
- QW_ELOG("invalid query msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
+ SSubQueryMsg msg = {0};
+ if (tDeserializeSSubQueryMsg(pMsg->pCont, pMsg->contLen, &msg) < 0) {
+ QW_ELOG("tDeserializeSSubQueryMsg failed, contLen:%d", pMsg->contLen);
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
- uint64_t sId = msg->sId;
- uint64_t qId = msg->queryId;
- uint64_t tId = msg->taskId;
- int64_t rId = msg->refId;
- int32_t eId = msg->execId;
+ uint64_t sId = msg.sId;
+ uint64_t qId = msg.queryId;
+ uint64_t tId = msg.taskId;
+ int64_t rId = msg.refId;
+ int32_t eId = msg.execId;
SQWMsg qwMsg = {.node = node,
- .msg = msg->msg + msg->sqlLen,
- .msgLen = msg->phyLen,
+ .msg = msg.msg,
+ .msgLen = msg.msgLen,
.connInfo = pMsg->info,
.msgType = pMsg->msgType};
- qwMsg.msgInfo.explain = msg->explain;
- qwMsg.msgInfo.taskType = msg->taskType;
- qwMsg.msgInfo.needFetch = msg->needFetch;
+ qwMsg.msgInfo.explain = msg.explain;
+ qwMsg.msgInfo.taskType = msg.taskType;
+ qwMsg.msgInfo.needFetch = msg.needFetch;
- char *sql = strndup(msg->msg, msg->sqlLen);
QW_SCH_TASK_DLOG("processQuery start, node:%p, type:%s, handle:%p, SQL:%s", node, TMSG_INFO(pMsg->msgType),
- pMsg->info.handle, sql);
- QW_ERR_JRET(qwProcessQuery(QW_FPARAMS(), &qwMsg, sql));
+ pMsg->info.handle, msg.sql);
+ code = qwProcessQuery(QW_FPARAMS(), &qwMsg, msg.sql);
+ msg.sql = NULL;
+ QW_SCH_TASK_DLOG("processQuery end, node:%p, code:%x", node, code);
-_return:
-
- QW_SCH_TASK_DLOG("processQuery end, node:%p, code:%d", node, code);
+ tFreeSSubQueryMsg(&msg);
- return code;
+ return TSDB_CODE_SUCCESS;
}
int32_t qWorkerProcessCQueryMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int64_t ts) {
@@ -541,28 +593,22 @@ int32_t qWorkerProcessDropMsg(void *node, void *qWorkerMgmt, SRpcMsg *pMsg, int6
}
int32_t code = 0;
- STaskDropReq *msg = pMsg->pCont;
SQWorker *mgmt = (SQWorker *)qWorkerMgmt;
qwUpdateTimeInQueue(mgmt, ts, FETCH_QUEUE);
QW_STAT_INC(mgmt->stat.msgStat.dropProcessed, 1);
- if (NULL == msg || pMsg->contLen < sizeof(*msg)) {
- QW_ELOG("invalid task drop msg, msg:%p, msgLen:%d", msg, pMsg->contLen);
+ STaskDropReq msg = {0};
+ if (tDeserializeSTaskDropReq(pMsg->pCont, pMsg->contLen, &msg) < 0) {
+ QW_ELOG("tDeserializeSTaskDropReq failed, contLen:%d", pMsg->contLen);
QW_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
}
- msg->sId = be64toh(msg->sId);
- msg->queryId = be64toh(msg->queryId);
- msg->taskId = be64toh(msg->taskId);
- msg->refId = be64toh(msg->refId);
- msg->execId = ntohl(msg->execId);
-
- uint64_t sId = msg->sId;
- uint64_t qId = msg->queryId;
- uint64_t tId = msg->taskId;
- int64_t rId = msg->refId;
- int32_t eId = msg->execId;
+ uint64_t sId = msg.sId;
+ uint64_t qId = msg.queryId;
+ uint64_t tId = msg.taskId;
+ int64_t rId = msg.refId;
+ int32_t eId = msg.execId;
SQWMsg qwMsg = {.node = node, .msg = NULL, .msgLen = 0, .code = pMsg->code, .connInfo = pMsg->info};
diff --git a/source/libs/qworker/src/qwUtil.c b/source/libs/qworker/src/qwUtil.c
index e9ded9b269bba34d366c3a0a20f01cce4e83b10e..e13791ae890514cce03ba39d43f3412078729969 100644
--- a/source/libs/qworker/src/qwUtil.c
+++ b/source/libs/qworker/src/qwUtil.c
@@ -281,9 +281,11 @@ void qwFreeTaskHandle(qTaskInfo_t *taskHandle) {
int32_t qwKillTaskHandle(SQWTaskCtx *ctx) {
int32_t code = 0;
+
// Note: free/kill may in RC
qTaskInfo_t taskHandle = atomic_load_ptr(&ctx->taskHandle);
if (taskHandle && atomic_val_compare_exchange_ptr(&ctx->taskHandle, taskHandle, NULL)) {
+ qDebug("start to kill task");
code = qAsyncKillTask(taskHandle);
atomic_store_ptr(&ctx->taskHandle, taskHandle);
}
diff --git a/source/libs/qworker/src/qworker.c b/source/libs/qworker/src/qworker.c
index a7cd3db82432f9e148ba02bfcc4e5faa02f8b119..4caa266d8acbda5ce5f511267202ca3930916c9b 100644
--- a/source/libs/qworker/src/qworker.c
+++ b/source/libs/qworker/src/qworker.c
@@ -683,6 +683,8 @@ int32_t qwProcessCQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
bool queryStop = false;
do {
+ ctx = NULL;
+
QW_ERR_JRET(qwHandlePrePhaseEvents(QW_FPARAMS(), QW_PHASE_PRE_CQUERY, &input, NULL));
QW_ERR_JRET(qwGetTaskCtx(QW_FPARAMS(), &ctx));
@@ -1162,6 +1164,43 @@ _return:
QW_RET(code);
}
+void qWorkerStopAllTasks(void *qWorkerMgmt) {
+ SQWorker *mgmt = (SQWorker *)qWorkerMgmt;
+
+ QW_DLOG("start to stop all tasks, taskNum:%d", taosHashGetSize(mgmt->ctxHash));
+
+ uint64_t qId, tId;
+ int32_t eId;
+ void *pIter = taosHashIterate(mgmt->ctxHash, NULL);
+ while (pIter) {
+ SQWTaskCtx *ctx = (SQWTaskCtx *)pIter;
+ void *key = taosHashGetKey(pIter, NULL);
+ QW_GET_QTID(key, qId, tId, eId);
+
+ QW_LOCK(QW_WRITE, &ctx->lock);
+
+ QW_TASK_DLOG_E("start to force stop task");
+
+ if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP) || QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
+ QW_TASK_WLOG_E("task already dropping");
+ QW_UNLOCK(QW_WRITE, &ctx->lock);
+
+ pIter = taosHashIterate(mgmt->ctxHash, pIter);
+ continue;
+ }
+
+ if (QW_QUERY_RUNNING(ctx)) {
+ qwKillTaskHandle(ctx);
+ } else if (!QW_EVENT_PROCESSED(ctx, QW_EVENT_DROP)) {
+ QW_SET_EVENT_RECEIVED(ctx, QW_EVENT_DROP);
+ }
+
+ QW_UNLOCK(QW_WRITE, &ctx->lock);
+
+ pIter = taosHashIterate(mgmt->ctxHash, pIter);
+ }
+}
+
void qWorkerDestroy(void **qWorkerMgmt) {
if (NULL == qWorkerMgmt || NULL == *qWorkerMgmt) {
return;
diff --git a/source/libs/qworker/test/qworkerTests.cpp b/source/libs/qworker/test/qworkerTests.cpp
index 6078a2a3ac44b226e722c253521031afc0fb4eda..8a48977c777af8d794a38ed1721319c4b0646953 100644
--- a/source/libs/qworker/test/qworkerTests.cpp
+++ b/source/libs/qworker/test/qworkerTests.cpp
@@ -114,7 +114,7 @@ void qwtBuildQueryReqMsg(SRpcMsg *queryRpc) {
qwtqueryMsg.queryId = htobe64(atomic_add_fetch_64(&qwtTestQueryId, 1));
qwtqueryMsg.sId = htobe64(1);
qwtqueryMsg.taskId = htobe64(1);
- qwtqueryMsg.phyLen = htonl(100);
+ qwtqueryMsg.msgLen = htonl(100);
qwtqueryMsg.sqlLen = 0;
queryRpc->msgType = TDMT_SCH_QUERY;
queryRpc->pCont = &qwtqueryMsg;
@@ -131,12 +131,29 @@ void qwtBuildFetchReqMsg(SResFetchReq *fetchMsg, SRpcMsg *fetchRpc) {
}
void qwtBuildDropReqMsg(STaskDropReq *dropMsg, SRpcMsg *dropRpc) {
- dropMsg->sId = htobe64(1);
- dropMsg->queryId = htobe64(atomic_load_64(&qwtTestQueryId));
- dropMsg->taskId = htobe64(1);
+ dropMsg->sId = 1;
+ dropMsg->queryId = atomic_load_64(&qwtTestQueryId);
+ dropMsg->taskId = 1;
+
+ int32_t msgSize = tSerializeSTaskDropReq(NULL, 0, dropMsg);
+ if (msgSize < 0) {
+ return;
+ }
+
+ char *msg = (char*)taosMemoryCalloc(1, msgSize);
+ if (NULL == msg) {
+ return;
+ }
+
+ if (tSerializeSTaskDropReq(msg, msgSize, dropMsg) < 0) {
+ taosMemoryFree(msg);
+ return;
+ }
+
+
dropRpc->msgType = TDMT_SCH_DROP_TASK;
- dropRpc->pCont = dropMsg;
- dropRpc->contLen = sizeof(STaskDropReq);
+ dropRpc->pCont = msg;
+ dropRpc->contLen = msgSize;
}
int32_t qwtStringToPlan(const char *str, SSubplan **subplan) {
diff --git a/source/libs/scalar/src/filter.c b/source/libs/scalar/src/filter.c
index 939be1809a0cec28826316ed28ea395bd6c52c33..45931c209c20017027c50db214d1368e023e9469 100644
--- a/source/libs/scalar/src/filter.c
+++ b/source/libs/scalar/src/filter.c
@@ -248,9 +248,9 @@ int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) {
}
}
-// if (optr == OP_TYPE_JSON_CONTAINS && type == TSDB_DATA_TYPE_JSON) {
-// return 28;
-// }
+ // if (optr == OP_TYPE_JSON_CONTAINS && type == TSDB_DATA_TYPE_JSON) {
+ // return 28;
+ // }
switch (type) {
case TSDB_DATA_TYPE_BOOL:
@@ -336,6 +336,10 @@ int8_t filterGetCompFuncIdx(int32_t type, int32_t optr) {
__compar_fn_t filterGetCompFunc(int32_t type, int32_t optr) { return gDataCompare[filterGetCompFuncIdx(type, optr)]; }
__compar_fn_t filterGetCompFuncEx(int32_t lType, int32_t rType, int32_t optr) {
+ if (TSDB_DATA_TYPE_NULL == rType) {
+ return NULL;
+ }
+
switch (lType) {
case TSDB_DATA_TYPE_TINYINT: {
if (IS_SIGNED_NUMERIC_TYPE(rType) || IS_FLOAT_TYPE(rType)) {
@@ -512,15 +516,17 @@ int32_t filterReuseRangeCtx(SFilterRangeCtx *ctx, int32_t type, int32_t options)
}
int32_t filterConvertRange(SFilterRangeCtx *cur, SFilterRange *ra, bool *notNull) {
+ int64_t tmp = 0;
+
if (!FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
- int32_t sr = cur->pCompareFunc(&ra->s, getDataMin(cur->type));
+ int32_t sr = cur->pCompareFunc(&ra->s, getDataMin(cur->type, &tmp));
if (sr == 0) {
FILTER_SET_FLAG(ra->sflag, RANGE_FLG_NULL);
}
}
if (!FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
- int32_t er = cur->pCompareFunc(&ra->e, getDataMax(cur->type));
+ int32_t er = cur->pCompareFunc(&ra->e, getDataMax(cur->type, &tmp));
if (er == 0) {
FILTER_SET_FLAG(ra->eflag, RANGE_FLG_NULL);
}
@@ -696,14 +702,15 @@ int32_t filterAddRangeImpl(void *h, SFilterRange *ra, int32_t optr) {
int32_t filterAddRange(void *h, SFilterRange *ra, int32_t optr) {
SFilterRangeCtx *ctx = (SFilterRangeCtx *)h;
-
+ int64_t tmp = 0;
+
if (FILTER_GET_FLAG(ra->sflag, RANGE_FLG_NULL)) {
- SIMPLE_COPY_VALUES(&ra->s, getDataMin(ctx->type));
+ SIMPLE_COPY_VALUES(&ra->s, getDataMin(ctx->type, &tmp));
// FILTER_CLR_FLAG(ra->sflag, RA_NULL);
}
if (FILTER_GET_FLAG(ra->eflag, RANGE_FLG_NULL)) {
- SIMPLE_COPY_VALUES(&ra->e, getDataMax(ctx->type));
+ SIMPLE_COPY_VALUES(&ra->e, getDataMax(ctx->type, &tmp));
// FILTER_CLR_FLAG(ra->eflag, RA_NULL);
}
@@ -912,8 +919,8 @@ int32_t filterDetachCnfGroups(SArray *group, SArray *left, SArray *right) {
if (taosArrayGetSize(left) <= 0) {
if (taosArrayGetSize(right) <= 0) {
- fltError("both groups are empty");
- FLT_ERR_RET(TSDB_CODE_QRY_APP_ERROR);
+ fltDebug("both groups are empty");
+ return TSDB_CODE_SUCCESS;
}
SFilterGroup *gp = NULL;
@@ -1087,7 +1094,7 @@ int32_t filterAddUnitImpl(SFilterInfo *info, uint8_t optr, SFilterFieldId *left,
if (tmp == NULL) {
return TSDB_CODE_OUT_OF_MEMORY;
}
- info->units = (SFilterUnit*)tmp;
+ info->units = (SFilterUnit *)tmp;
memset(info->units + psize, 0, sizeof(*info->units) * FILTER_DEFAULT_UNIT_SIZE);
}
@@ -1169,7 +1176,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
SScalarParam out = {.columnData = taosMemoryCalloc(1, sizeof(SColumnInfoData))};
out.columnData->info.type = type;
- out.columnData->info.bytes = tDataTypes[type].bytes;
+ out.columnData->info.bytes = tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes; // reserved space for simple_copy
for (int32_t i = 0; i < listNode->pNodeList->length; ++i) {
SValueNode *valueNode = (SValueNode *)cell->pNode;
@@ -1191,7 +1198,7 @@ int32_t fltAddGroupUnitFromNode(SFilterInfo *info, SNode *tree, SArray *group) {
filterAddField(info, NULL, (void **)&out.columnData->pData, FLD_TYPE_VALUE, &right, len, true);
out.columnData->pData = NULL;
} else {
- void *data = taosMemoryCalloc(1, tDataTypes[type].bytes);
+ void *data = taosMemoryCalloc(1, tDataTypes[TSDB_DATA_TYPE_BIGINT].bytes); // reserved space for simple_copy
if (NULL == data) {
FLT_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
}
@@ -1633,11 +1640,11 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
SValueNode *var = (SValueNode *)field->desc;
SDataType *dType = &var->node.resType;
- //if (dType->type == TSDB_DATA_TYPE_VALUE_ARRAY) {
- // qDebug("VAL%d => [type:TS][val:[%" PRIi64 "] - [%" PRId64 "]]", i, *(int64_t *)field->data,
- // *(((int64_t *)field->data) + 1));
- //} else {
- qDebug("VAL%d => [type:%d][val:%" PRIx64 "]", i, dType->type, var->datum.i); // TODO
+ // if (dType->type == TSDB_DATA_TYPE_VALUE_ARRAY) {
+ // qDebug("VAL%d => [type:TS][val:[%" PRIi64 "] - [%" PRId64 "]]", i, *(int64_t *)field->data,
+ // *(((int64_t *)field->data) + 1));
+ // } else {
+ qDebug("VAL%d => [type:%d][val:%" PRIx64 "]", i, dType->type, var->datum.i); // TODO
//}
} else if (field->data) {
qDebug("VAL%d => [type:NIL][val:NIL]", i); // TODO
@@ -1697,7 +1704,8 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
}
qDebug("GROUP Num:%u", info->groupNum);
- for (uint32_t i = 0; i < info->groupNum; ++i) {
+ uint32_t maxDbgGrpNum = TMIN(info->groupNum, 1000);
+ for (uint32_t i = 0; i < maxDbgGrpNum; ++i) {
SFilterGroup *group = &info->groups[i];
qDebug("Group%d : unit num[%u]", i, group->unitNum);
@@ -1719,7 +1727,7 @@ void filterDumpInfoToString(SFilterInfo *info, const char *msg, int32_t options)
ctx->isrange);
if (ctx->isrange) {
SFilterRangeNode *r = ctx->rs;
- int32_t tlen = 0;
+ int32_t tlen = 0;
while (r) {
char str[256] = {0};
if (FILTER_GET_FLAG(r->ra.sflag, RANGE_FLG_NULL)) {
@@ -3241,14 +3249,18 @@ bool filterExecuteImpl(void *pinfo, int32_t numOfRows, SColumnInfoData *pRes, SC
for (uint32_t u = 0; u < group->unitNum; ++u) {
uint32_t uidx = group->unitIdxs[u];
SFilterComUnit *cunit = &info->cunits[uidx];
- void *colData = colDataGetData((SColumnInfoData *)(cunit->colData), i);
-
+ void *colData = NULL;
+ bool isNull = colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL);
// if (FILTER_UNIT_GET_F(info, uidx)) {
// p[i] = FILTER_UNIT_GET_R(info, uidx);
// } else {
uint8_t optr = cunit->optr;
- if (colData == NULL || colDataIsNull((SColumnInfoData *)(cunit->colData), 0, i, NULL)) {
+ if (!isNull) {
+ colData = colDataGetData((SColumnInfoData *)(cunit->colData), i);
+ }
+
+ if (colData == NULL || isNull) {
p[i] = optr == OP_TYPE_IS_NULL ? true : false;
} else {
if (optr == OP_TYPE_IS_NOT_NULL) {
@@ -3909,6 +3921,10 @@ EDealRes fltReviseRewriter(SNode **pNode, void *pContext) {
} else {
SColumnNode *refNode = (SColumnNode *)node->pLeft;
SNodeListNode *listNode = (SNodeListNode *)node->pRight;
+ if (LIST_LENGTH(listNode->pNodeList) > 10) {
+ stat->scalarMode = true;
+ return DEAL_RES_CONTINUE;
+ }
int32_t type = vectorGetConvertType(refNode->node.resType.type, listNode->dataType.type);
if (0 != type && type != refNode->node.resType.type) {
stat->scalarMode = true;
diff --git a/source/libs/scalar/src/scalar.c b/source/libs/scalar/src/scalar.c
index fa71009365019014e8cacf70c66010bb5a5fa0c5..44f792869e4527188a2faa6ebb224e9ab72b2345 100644
--- a/source/libs/scalar/src/scalar.c
+++ b/source/libs/scalar/src/scalar.c
@@ -23,12 +23,13 @@ int32_t scalarGetOperatorParamNum(EOperatorType type) {
int32_t sclConvertToTsValueNode(int8_t precision, SValueNode *valueNode) {
char *timeStr = valueNode->datum.p;
- int32_t code =
- convertStringToTimestamp(valueNode->node.resType.type, valueNode->datum.p, precision, &valueNode->datum.i);
+ int64_t value = 0;
+ int32_t code = convertStringToTimestamp(valueNode->node.resType.type, valueNode->datum.p, precision, &value);
if (code != TSDB_CODE_SUCCESS) {
return code;
}
taosMemoryFree(timeStr);
+ valueNode->datum.i = value;
valueNode->typeData = valueNode->datum.i;
valueNode->node.resType.type = TSDB_DATA_TYPE_TIMESTAMP;
@@ -61,7 +62,7 @@ int32_t sclCreateColumnInfoData(SDataType *pType, int32_t numOfRows, SScalarPara
return TSDB_CODE_SUCCESS;
}
-int32_t sclConvertValueToSclParam(SValueNode* pValueNode, SScalarParam* out, int32_t* overflow) {
+int32_t sclConvertValueToSclParam(SValueNode *pValueNode, SScalarParam *out, int32_t *overflow) {
SScalarParam in = {.numOfRows = 1};
int32_t code = sclCreateColumnInfoData(&pValueNode->node.resType, 1, &in);
if (code != TSDB_CODE_SUCCESS) {
@@ -78,7 +79,7 @@ int32_t sclConvertValueToSclParam(SValueNode* pValueNode, SScalarParam* out, int
}
int32_t sclExtendResRows(SScalarParam *pDst, SScalarParam *pSrc, SArray *pBlockList) {
- SSDataBlock* pb = taosArrayGetP(pBlockList, 0);
+ SSDataBlock *pb = taosArrayGetP(pBlockList, 0);
SScalarParam *pLeft = taosMemoryCalloc(1, sizeof(SScalarParam));
if (NULL == pLeft) {
sclError("calloc %d failed", (int32_t)sizeof(SScalarParam));
@@ -90,7 +91,7 @@ int32_t sclExtendResRows(SScalarParam *pDst, SScalarParam *pSrc, SArray *pBlockL
if (pDst->numOfRows < pb->info.rows) {
colInfoDataEnsureCapacity(pDst->columnData, pb->info.rows, true);
}
-
+
_bin_scalar_fn_t OperatorFn = getBinScalarOperatorFn(OP_TYPE_ASSIGN);
OperatorFn(pLeft, pSrc, pDst, TSDB_ORDER_ASC);
@@ -566,7 +567,7 @@ _return:
SCL_RET(code);
}
-int32_t sclGetNodeRes(SNode* node, SScalarCtx *ctx, SScalarParam **res) {
+int32_t sclGetNodeRes(SNode *node, SScalarCtx *ctx, SScalarParam **res) {
if (NULL == node) {
return TSDB_CODE_SUCCESS;
}
@@ -576,48 +577,55 @@ int32_t sclGetNodeRes(SNode* node, SScalarCtx *ctx, SScalarParam **res) {
if (NULL == *res) {
SCL_ERR_RET(TSDB_CODE_OUT_OF_MEMORY);
}
-
+
SCL_ERR_RET(sclInitParam(node, *res, ctx, &rowNum));
return TSDB_CODE_SUCCESS;
}
-int32_t sclWalkCaseWhenList(SScalarCtx *ctx, SNodeList* pList, struct SListCell* pCell, SScalarParam *pCase, SScalarParam *pElse, SScalarParam *pComp, SScalarParam *output, int32_t rowIdx, int32_t totalRows, bool *complete) {
- SNode *node = NULL;
- SWhenThenNode* pWhenThen = NULL;
- SScalarParam *pWhen = NULL;
- SScalarParam *pThen = NULL;
- int32_t code = 0;
+int32_t sclWalkCaseWhenList(SScalarCtx *ctx, SNodeList *pList, struct SListCell *pCell, SScalarParam *pCase,
+ SScalarParam *pElse, SScalarParam *pComp, SScalarParam *output, int32_t rowIdx,
+ int32_t totalRows, bool *complete) {
+ SNode *node = NULL;
+ SWhenThenNode *pWhenThen = NULL;
+ SScalarParam *pWhen = NULL;
+ SScalarParam *pThen = NULL;
+ int32_t code = 0;
+
+ for (SListCell *cell = pCell; (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false));
+ cell = cell->pNext) {
+ pWhenThen = (SWhenThenNode *)node;
- for (SListCell* cell = pCell; (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext) {
- pWhenThen = (SWhenThenNode*)node;
-
SCL_ERR_RET(sclGetNodeRes(pWhenThen->pWhen, ctx, &pWhen));
SCL_ERR_RET(sclGetNodeRes(pWhenThen->pThen, ctx, &pThen));
-
+
vectorCompareImpl(pCase, pWhen, pComp, rowIdx, 1, TSDB_ORDER_ASC, OP_TYPE_EQUAL);
-
- bool *equal = (bool*)colDataGetData(pComp->columnData, rowIdx);
+
+ bool *equal = (bool *)colDataGetData(pComp->columnData, rowIdx);
if (*equal) {
- colDataAppend(output->columnData, rowIdx, colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0)), colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0)));
+ bool isNull = colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0));
+ char *pData = isNull ? NULL : colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0));
+ colDataAppend(output->columnData, rowIdx, pData, isNull);
if (0 == rowIdx && 1 == pCase->numOfRows && 1 == pWhen->numOfRows && 1 == pThen->numOfRows && totalRows > 1) {
SCL_ERR_JRET(sclExtendResRows(output, output, ctx->pBlockList));
*complete = true;
}
-
+
goto _return;
}
}
if (pElse) {
- colDataAppend(output->columnData, rowIdx, colDataGetData(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0)), colDataIsNull_s(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0)));
+ bool isNull = colDataIsNull_s(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0));
+ char *pData = isNull ? NULL : colDataGetData(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0));
+ colDataAppend(output->columnData, rowIdx, pData, isNull);
if (0 == rowIdx && 1 == pCase->numOfRows && 1 == pElse->numOfRows && totalRows > 1) {
SCL_ERR_JRET(sclExtendResRows(output, output, ctx->pBlockList));
*complete = true;
}
-
+
goto _return;
}
@@ -629,7 +637,7 @@ int32_t sclWalkCaseWhenList(SScalarCtx *ctx, SNodeList* pList, struct SListCell*
}
_return:
-
+
sclFreeParam(pWhen);
sclFreeParam(pThen);
taosMemoryFree(pWhen);
@@ -638,32 +646,35 @@ _return:
SCL_RET(code);
}
-int32_t sclWalkWhenList(SScalarCtx *ctx, SNodeList* pList, struct SListCell* pCell, SScalarParam *pElse, SScalarParam *output,
- int32_t rowIdx, int32_t totalRows, bool *complete, bool preSingle) {
- SNode *node = NULL;
- SWhenThenNode* pWhenThen = NULL;
- SScalarParam *pWhen = NULL;
- SScalarParam *pThen = NULL;
- int32_t code = 0;
+int32_t sclWalkWhenList(SScalarCtx *ctx, SNodeList *pList, struct SListCell *pCell, SScalarParam *pElse,
+ SScalarParam *output, int32_t rowIdx, int32_t totalRows, bool *complete, bool preSingle) {
+ SNode *node = NULL;
+ SWhenThenNode *pWhenThen = NULL;
+ SScalarParam *pWhen = NULL;
+ SScalarParam *pThen = NULL;
+ int32_t code = 0;
- for (SListCell* cell = pCell; (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false)); cell = cell->pNext) {
- pWhenThen = (SWhenThenNode*)node;
+ for (SListCell *cell = pCell; (NULL != cell ? (node = cell->pNode, true) : (node = NULL, false));
+ cell = cell->pNext) {
+ pWhenThen = (SWhenThenNode *)node;
pWhen = NULL;
pThen = NULL;
-
+
SCL_ERR_JRET(sclGetNodeRes(pWhenThen->pWhen, ctx, &pWhen));
SCL_ERR_JRET(sclGetNodeRes(pWhenThen->pThen, ctx, &pThen));
- bool *whenValue = (bool*)colDataGetData(pWhen->columnData, (pWhen->numOfRows > 1 ? rowIdx : 0));
-
+ bool *whenValue = (bool *)colDataGetData(pWhen->columnData, (pWhen->numOfRows > 1 ? rowIdx : 0));
+
if (*whenValue) {
- colDataAppend(output->columnData, rowIdx, colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0)), colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0)));
+ bool isNull = colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0));
+ char *pData = isNull ? NULL : colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? rowIdx : 0));
+ colDataAppend(output->columnData, rowIdx, pData, isNull);
if (preSingle && 0 == rowIdx && 1 == pWhen->numOfRows && 1 == pThen->numOfRows && totalRows > 1) {
SCL_ERR_JRET(sclExtendResRows(output, output, ctx->pBlockList));
*complete = true;
}
-
+
goto _return;
}
@@ -674,13 +685,15 @@ int32_t sclWalkWhenList(SScalarCtx *ctx, SNodeList* pList, struct SListCell* pCe
}
if (pElse) {
- colDataAppend(output->columnData, rowIdx, colDataGetData(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0)), colDataIsNull_s(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0)));
+ bool isNull = colDataIsNull_s(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0));
+ char *pData = isNull ? NULL : colDataGetData(pElse->columnData, (pElse->numOfRows > 1 ? rowIdx : 0));
+ colDataAppend(output->columnData, rowIdx, pData, isNull);
if (preSingle && 0 == rowIdx && 1 == pElse->numOfRows && totalRows > 1) {
SCL_ERR_JRET(sclExtendResRows(output, output, ctx->pBlockList));
*complete = true;
}
-
+
goto _return;
}
@@ -860,14 +873,14 @@ _return:
}
int32_t sclExecCaseWhen(SCaseWhenNode *node, SScalarCtx *ctx, SScalarParam *output) {
- int32_t code = 0;
+ int32_t code = 0;
SScalarParam *pCase = NULL;
SScalarParam *pElse = NULL;
SScalarParam *pWhen = NULL;
SScalarParam *pThen = NULL;
SScalarParam comp = {0};
- int32_t rowNum = 1;
- bool complete = false;
+ int32_t rowNum = 1;
+ bool complete = false;
if (NULL == node->pWhenThenList || node->pWhenThenList->length <= 0) {
sclError("invalid whenThen list");
@@ -875,24 +888,24 @@ int32_t sclExecCaseWhen(SCaseWhenNode *node, SScalarCtx *ctx, SScalarParam *outp
}
if (ctx->pBlockList) {
- SSDataBlock* pb = taosArrayGetP(ctx->pBlockList, 0);
+ SSDataBlock *pb = taosArrayGetP(ctx->pBlockList, 0);
rowNum = pb->info.rows;
output->numOfRows = pb->info.rows;
}
SCL_ERR_JRET(sclCreateColumnInfoData(&node->node.resType, rowNum, output));
-
+
SCL_ERR_JRET(sclGetNodeRes(node->pCase, ctx, &pCase));
SCL_ERR_JRET(sclGetNodeRes(node->pElse, ctx, &pElse));
SDataType compType = {0};
compType.type = TSDB_DATA_TYPE_BOOL;
compType.bytes = tDataTypes[compType.type].bytes;
-
+
SCL_ERR_JRET(sclCreateColumnInfoData(&compType, rowNum, &comp));
- SNode* tnode = NULL;
- SWhenThenNode* pWhenThen = (SWhenThenNode*)node->pWhenThenList->pHead->pNode;
+ SNode *tnode = NULL;
+ SWhenThenNode *pWhenThen = (SWhenThenNode *)node->pWhenThenList->pHead->pNode;
SCL_ERR_JRET(sclGetNodeRes(pWhenThen->pWhen, ctx, &pWhen));
SCL_ERR_JRET(sclGetNodeRes(pWhenThen->pThen, ctx, &pThen));
@@ -903,17 +916,19 @@ int32_t sclExecCaseWhen(SCaseWhenNode *node, SScalarCtx *ctx, SScalarParam *outp
if (pCase) {
vectorCompare(pCase, pWhen, &comp, TSDB_ORDER_ASC, OP_TYPE_EQUAL);
-
+
for (int32_t i = 0; i < rowNum; ++i) {
- bool *equal = (bool*)colDataGetData(comp.columnData, (comp.numOfRows > 1 ? i : 0));
+ bool *equal = (bool *)colDataGetData(comp.columnData, (comp.numOfRows > 1 ? i : 0));
if (*equal) {
- colDataAppend(output->columnData, i, colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)), colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)));
+ colDataAppend(output->columnData, i, colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)),
+ colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)));
if (0 == i && 1 == pCase->numOfRows && 1 == pWhen->numOfRows && 1 == pThen->numOfRows && rowNum > 1) {
SCL_ERR_JRET(sclExtendResRows(output, output, ctx->pBlockList));
break;
}
} else {
- SCL_ERR_JRET(sclWalkCaseWhenList(ctx, node->pWhenThenList, node->pWhenThenList->pHead->pNext, pCase, pElse, &comp, output, i, rowNum, &complete));
+ SCL_ERR_JRET(sclWalkCaseWhenList(ctx, node->pWhenThenList, node->pWhenThenList->pHead->pNext, pCase, pElse,
+ &comp, output, i, rowNum, &complete));
if (complete) {
break;
}
@@ -921,15 +936,17 @@ int32_t sclExecCaseWhen(SCaseWhenNode *node, SScalarCtx *ctx, SScalarParam *outp
}
} else {
for (int32_t i = 0; i < rowNum; ++i) {
- bool *whenValue = (bool*)colDataGetData(pWhen->columnData, (pWhen->numOfRows > 1 ? i : 0));
+ bool *whenValue = (bool *)colDataGetData(pWhen->columnData, (pWhen->numOfRows > 1 ? i : 0));
if (*whenValue) {
- colDataAppend(output->columnData, i, colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)), colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)));
+ colDataAppend(output->columnData, i, colDataGetData(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)),
+ colDataIsNull_s(pThen->columnData, (pThen->numOfRows > 1 ? i : 0)));
if (0 == i && 1 == pWhen->numOfRows && 1 == pThen->numOfRows && rowNum > 1) {
SCL_ERR_JRET(sclExtendResRows(output, output, ctx->pBlockList));
break;
}
} else {
- SCL_ERR_JRET(sclWalkWhenList(ctx, node->pWhenThenList, node->pWhenThenList->pHead->pNext, pElse, output, i, rowNum, &complete, (pWhen->numOfRows == 1 && pThen->numOfRows == 1)));
+ SCL_ERR_JRET(sclWalkWhenList(ctx, node->pWhenThenList, node->pWhenThenList->pHead->pNext, pElse, output, i,
+ rowNum, &complete, (pWhen->numOfRows == 1 && pThen->numOfRows == 1)));
if (complete) {
break;
}
@@ -965,7 +982,6 @@ _return:
SCL_RET(code);
}
-
EDealRes sclRewriteNullInOptr(SNode **pNode, SScalarCtx *ctx, EOperatorType opType) {
if (opType <= OP_TYPE_CALC_MAX) {
SValueNode *res = (SValueNode *)nodesMakeNode(QUERY_NODE_VALUE);
@@ -1089,8 +1105,7 @@ EDealRes sclRewriteNonConstOperator(SNode **pNode, SScalarCtx *ctx) {
EDealRes sclRewriteFunction(SNode **pNode, SScalarCtx *ctx) {
SFunctionNode *node = (SFunctionNode *)*pNode;
SNode *tnode = NULL;
- if ((!fmIsScalarFunc(node->funcId) && (!ctx->dual)) ||
- fmIsUserDefinedFunc(node->funcId)) {
+ if ((!fmIsScalarFunc(node->funcId) && (!ctx->dual)) || fmIsUserDefinedFunc(node->funcId)) {
return DEAL_RES_CONTINUE;
}
@@ -1229,20 +1244,20 @@ EDealRes sclRewriteOperator(SNode **pNode, SScalarCtx *ctx) {
return DEAL_RES_CONTINUE;
}
-EDealRes sclRewriteCaseWhen(SNode** pNode, SScalarCtx *ctx) {
+EDealRes sclRewriteCaseWhen(SNode **pNode, SScalarCtx *ctx) {
SCaseWhenNode *node = (SCaseWhenNode *)*pNode;
if ((!SCL_IS_CONST_NODE(node->pCase)) || (!SCL_IS_CONST_NODE(node->pElse))) {
return DEAL_RES_CONTINUE;
}
- SNode* tnode = NULL;
+ SNode *tnode = NULL;
FOREACH(tnode, node->pWhenThenList) {
- SWhenThenNode* pWhenThen = (SWhenThenNode*)tnode;
+ SWhenThenNode *pWhenThen = (SWhenThenNode *)tnode;
if (!SCL_IS_CONST_NODE(pWhenThen->pWhen) || !SCL_IS_CONST_NODE(pWhenThen->pThen)) {
return DEAL_RES_CONTINUE;
}
- }
+ }
SScalarParam output = {0};
ctx->code = sclExecCaseWhen(node, ctx, &output);
@@ -1275,13 +1290,12 @@ EDealRes sclRewriteCaseWhen(SNode** pNode, SScalarCtx *ctx) {
}
nodesDestroyNode(*pNode);
- *pNode = (SNode*)res;
+ *pNode = (SNode *)res;
sclFreeParam(&output);
return DEAL_RES_CONTINUE;
}
-
EDealRes sclConstantsRewriter(SNode **pNode, void *pContext) {
SScalarCtx *ctx = (SScalarCtx *)pContext;
@@ -1408,9 +1422,9 @@ EDealRes sclWalkTarget(SNode *pNode, SScalarCtx *ctx) {
return DEAL_RES_CONTINUE;
}
-EDealRes sclWalkCaseWhen(SNode* pNode, SScalarCtx *ctx) {
+EDealRes sclWalkCaseWhen(SNode *pNode, SScalarCtx *ctx) {
SCaseWhenNode *node = (SCaseWhenNode *)pNode;
- SScalarParam output = {0};
+ SScalarParam output = {0};
ctx->code = sclExecCaseWhen(node, ctx, &output);
if (ctx->code) {
@@ -1425,11 +1439,10 @@ EDealRes sclWalkCaseWhen(SNode* pNode, SScalarCtx *ctx) {
return DEAL_RES_CONTINUE;
}
-
EDealRes sclCalcWalker(SNode *pNode, void *pContext) {
- if (QUERY_NODE_VALUE == nodeType(pNode) || QUERY_NODE_NODE_LIST == nodeType(pNode)
- || QUERY_NODE_COLUMN == nodeType(pNode) || QUERY_NODE_LEFT_VALUE == nodeType(pNode)
- || QUERY_NODE_WHEN_THEN == nodeType(pNode)) {
+ if (QUERY_NODE_VALUE == nodeType(pNode) || QUERY_NODE_NODE_LIST == nodeType(pNode) ||
+ QUERY_NODE_COLUMN == nodeType(pNode) || QUERY_NODE_LEFT_VALUE == nodeType(pNode) ||
+ QUERY_NODE_WHEN_THEN == nodeType(pNode)) {
return DEAL_RES_CONTINUE;
}
diff --git a/source/libs/scalar/src/sclfunc.c b/source/libs/scalar/src/sclfunc.c
index c89072233fba013235dee71e6a22d86321fbe116..5496c5d1abc86c9631070c713b2a97b163040902 100644
--- a/source/libs/scalar/src/sclfunc.c
+++ b/source/libs/scalar/src/sclfunc.c
@@ -24,6 +24,8 @@ static double tlog2(double v, double base) {
return a;
} else if (isnan(b) || isinf(b)) {
return b;
+ } else if (b == 0) {
+ return INFINITY;
} else {
return a / b;
}
@@ -1028,11 +1030,11 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
int32_t type = GET_PARAM_TYPE(pInput);
bool tzPresent = (inputNum == 2) ? true : false;
- char *tz;
- int32_t tzLen;
+ char tz[20] = {0};
+ int32_t tzLen = 0;
if (tzPresent) {
- tz = varDataVal(pInput[1].columnData->pData);
tzLen = varDataLen(pInput[1].columnData->pData);
+ memcpy(tz, varDataVal(pInput[1].columnData->pData), tzLen);
}
for (int32_t i = 0; i < pInput[0].numOfRows; ++i) {
@@ -1071,8 +1073,10 @@ int32_t toISO8601Function(SScalarParam *pInput, int32_t inputNum, SScalarParam *
int32_t len = (int32_t)strlen(buf);
// add timezone string
- snprintf(buf + len, tzLen + 1, "%s", tz);
- len += tzLen;
+ if (tzLen > 0) {
+ snprintf(buf + len, tzLen + 1, "%s", tz);
+ len += tzLen;
+ }
if (hasFraction) {
int32_t fracLen = (int32_t)strlen(fraction) + 1;
@@ -2618,6 +2622,7 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
int32_t numOfParams = cJSON_GetArraySize(binDesc);
int32_t startIndex;
if (numOfParams != 4) {
+ cJSON_Delete(binDesc);
return false;
}
@@ -2628,15 +2633,18 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
cJSON *infinity = cJSON_GetObjectItem(binDesc, "infinity");
if (!cJSON_IsNumber(start) || !cJSON_IsNumber(count) || !cJSON_IsBool(infinity)) {
+ cJSON_Delete(binDesc);
return false;
}
if (count->valueint <= 0 || count->valueint > 1000) { // limit count to 1000
+ cJSON_Delete(binDesc);
return false;
}
if (isinf(start->valuedouble) || (width != NULL && isinf(width->valuedouble)) ||
(factor != NULL && isinf(factor->valuedouble)) || (count != NULL && isinf(count->valuedouble))) {
+ cJSON_Delete(binDesc);
return false;
}
@@ -2654,12 +2662,14 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
// linear bin process
if (width->valuedouble == 0) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
for (int i = 0; i < counter + 1; ++i) {
intervals[startIndex] = start->valuedouble + i * width->valuedouble;
if (isinf(intervals[startIndex])) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
startIndex++;
@@ -2668,22 +2678,26 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
// log bin process
if (start->valuedouble == 0) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
if (factor->valuedouble < 0 || factor->valuedouble == 0 || factor->valuedouble == 1) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
for (int i = 0; i < counter + 1; ++i) {
intervals[startIndex] = start->valuedouble * pow(factor->valuedouble, i * 1.0);
if (isinf(intervals[startIndex])) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
startIndex++;
}
} else {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
@@ -2698,6 +2712,7 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
}
} else if (cJSON_IsArray(binDesc)) { /* user input bins */
if (binType != USER_INPUT_BIN) {
+ cJSON_Delete(binDesc);
return false;
}
numOfBins = cJSON_GetArraySize(binDesc);
@@ -2705,6 +2720,7 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
cJSON *bin = binDesc->child;
if (bin == NULL) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
int i = 0;
@@ -2712,16 +2728,19 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
intervals[i] = bin->valuedouble;
if (!cJSON_IsNumber(bin)) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
if (i != 0 && intervals[i] <= intervals[i - 1]) {
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
return false;
}
bin = bin->next;
i++;
}
} else {
+ cJSON_Delete(binDesc);
return false;
}
@@ -2733,8 +2752,9 @@ static bool getHistogramBinDesc(SHistoFuncBin **bins, int32_t *binNum, char *bin
(*bins)[i].count = 0;
}
- cJSON_Delete(binDesc);
taosMemoryFree(intervals);
+ cJSON_Delete(binDesc);
+
return true;
}
@@ -2746,14 +2766,19 @@ int32_t histogramScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarP
int32_t numOfBins = 0;
int32_t totalCount = 0;
- int8_t binType = getHistogramBinType(varDataVal(pInput[1].columnData->pData));
- char *binDesc = varDataVal(pInput[2].columnData->pData);
+ char *binTypeStr = strndup(varDataVal(pInput[1].columnData->pData), varDataLen(pInput[1].columnData->pData));
+ int8_t binType = getHistogramBinType(binTypeStr);
+ taosMemoryFree(binTypeStr);
+
+ char *binDesc = strndup(varDataVal(pInput[2].columnData->pData), varDataLen(pInput[2].columnData->pData));
int64_t normalized = *(int64_t *)(pInput[3].columnData->pData);
int32_t type = GET_PARAM_TYPE(pInput);
if (!getHistogramBinDesc(&bins, &numOfBins, binDesc, binType, (bool)normalized)) {
+ taosMemoryFree(binDesc);
return TSDB_CODE_FAILED;
}
+ taosMemoryFree(binDesc);
for (int32_t i = 0; i < pInput->numOfRows; ++i) {
if (colDataIsNull_s(pInputData, i)) {
@@ -2783,6 +2808,8 @@ int32_t histogramScalarFunction(SScalarParam *pInput, int32_t inputNum, SScalarP
}
}
+ colInfoDataEnsureCapacity(pOutputData, numOfBins, false);
+
for (int32_t k = 0; k < numOfBins; ++k) {
int32_t len;
char buf[512] = {0};
diff --git a/source/libs/scheduler/src/schRemote.c b/source/libs/scheduler/src/schRemote.c
index 17f1ea6728cfc933dd5f0585ce0e1f0e1f1283ad..b0bc0df8506b2c8bd704fde26f103dcab2b6a61f 100644
--- a/source/libs/scheduler/src/schRemote.c
+++ b/source/libs/scheduler/src/schRemote.c
@@ -286,9 +286,11 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa
if (pJob->execRes.res) {
SSubmitRsp *sum = pJob->execRes.res;
sum->affectedRows += rsp->affectedRows;
- sum->nBlocks += rsp->nBlocks;
- sum->pBlocks = taosMemoryRealloc(sum->pBlocks, sum->nBlocks * sizeof(*sum->pBlocks));
- memcpy(sum->pBlocks + sum->nBlocks - rsp->nBlocks, rsp->pBlocks, rsp->nBlocks * sizeof(*sum->pBlocks));
+ sum->nBlocks += rsp->nBlocks;
+ if (rsp->nBlocks > 0 && rsp->pBlocks) {
+ sum->pBlocks = taosMemoryRealloc(sum->pBlocks, sum->nBlocks * sizeof(*sum->pBlocks));
+ memcpy(sum->pBlocks + sum->nBlocks - rsp->nBlocks, rsp->pBlocks, rsp->nBlocks * sizeof(*sum->pBlocks));
+ }
taosMemoryFree(rsp->pBlocks);
taosMemoryFree(rsp);
} else {
@@ -332,17 +334,17 @@ int32_t schHandleResponseMsg(SSchJob *pJob, SSchTask *pTask, int32_t execId, SDa
SCH_ERR_JRET(TSDB_CODE_QRY_INVALID_INPUT);
}
- SQueryTableRsp *rsp = (SQueryTableRsp *)msg;
- rsp->code = ntohl(rsp->code);
- rsp->sversion = ntohl(rsp->sversion);
- rsp->tversion = ntohl(rsp->tversion);
- rsp->affectedRows = be64toh(rsp->affectedRows);
-
- SCH_ERR_JRET(rsp->code);
+ SQueryTableRsp rsp = {0};
+ if (tDeserializeSQueryTableRsp(msg, msgSize, &rsp) < 0) {
+ SCH_TASK_ELOG("tDeserializeSQueryTableRsp failed, msgSize:%d", msgSize);
+ SCH_ERR_JRET(TSDB_CODE_QRY_INVALID_MSG);
+ }
+
+ SCH_ERR_JRET(rsp.code);
- SCH_ERR_JRET(schSaveJobExecRes(pJob, rsp));
+ SCH_ERR_JRET(schSaveJobExecRes(pJob, &rsp));
- atomic_add_fetch_32(&pJob->resNumOfRows, rsp->affectedRows);
+ atomic_add_fetch_32(&pJob->resNumOfRows, rsp.affectedRows);
taosMemoryFreeClear(msg);
@@ -425,6 +427,7 @@ int32_t schHandleCallback(void *param, SDataBuf *pMsg, int32_t rspCode) {
_return:
taosMemoryFreeClear(pMsg->pData);
+ taosMemoryFreeClear(pMsg->pEpSet);
qDebug("end to handle rsp msg, type:%s, handle:%p, code:%s", TMSG_INFO(pMsg->msgType), pMsg->handle,
tstrerror(rspCode));
@@ -438,6 +441,7 @@ int32_t schHandleDropCallback(void *param, SDataBuf *pMsg, int32_t code) {
code);
if (pMsg) {
taosMemoryFree(pMsg->pData);
+ taosMemoryFree(pMsg->pEpSet);
}
return TSDB_CODE_SUCCESS;
}
@@ -492,6 +496,7 @@ _return:
tFreeSSchedulerHbRsp(&rsp);
taosMemoryFree(pMsg->pData);
+ taosMemoryFree(pMsg->pEpSet);
SCH_RET(code);
}
@@ -1037,30 +1042,40 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
case TDMT_SCH_MERGE_QUERY: {
SCH_ERR_RET(schMakeQueryRpcCtx(pJob, pTask, &rpcCtx));
- uint32_t len = strlen(pJob->sql);
- msgSize = sizeof(SSubQueryMsg) + pTask->msgLen + len;
+ SSubQueryMsg qMsg;
+ qMsg.header.vgId = addr->nodeId;
+ qMsg.header.contLen = 0;
+ qMsg.sId = schMgmt.sId;
+ qMsg.queryId = pJob->queryId;
+ qMsg.taskId = pTask->taskId;
+ qMsg.refId = pJob->refId;
+ qMsg.execId = pTask->execId;
+ qMsg.msgMask = (pTask->plan->showRewrite) ? QUERY_MSG_MASK_SHOW_REWRITE() : 0;
+ qMsg.taskType = TASK_TYPE_TEMP;
+ qMsg.explain = SCH_IS_EXPLAIN_JOB(pJob);
+ qMsg.needFetch = SCH_TASK_NEED_FETCH(pTask);
+ qMsg.sqlLen = strlen(pJob->sql);
+ qMsg.sql = pJob->sql;
+ qMsg.msgLen = pTask->msgLen;
+ qMsg.msg = pTask->msg;
+
+ msgSize = tSerializeSSubQueryMsg(NULL, 0, &qMsg);
+ if (msgSize < 0) {
+ SCH_TASK_ELOG("tSerializeSSubQueryMsg get size, msgSize:%d", msgSize);
+ SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
msg = taosMemoryCalloc(1, msgSize);
if (NULL == msg) {
SCH_TASK_ELOG("calloc %d failed", msgSize);
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- SSubQueryMsg *pMsg = msg;
- pMsg->header.vgId = htonl(addr->nodeId);
- pMsg->header.msgMask = htonl((pTask->plan->showRewrite) ? SHOW_REWRITE_MASK() : 0);
- pMsg->sId = htobe64(schMgmt.sId);
- pMsg->queryId = htobe64(pJob->queryId);
- pMsg->taskId = htobe64(pTask->taskId);
- pMsg->refId = htobe64(pJob->refId);
- pMsg->execId = htonl(pTask->execId);
- pMsg->taskType = TASK_TYPE_TEMP;
- pMsg->explain = SCH_IS_EXPLAIN_JOB(pJob);
- pMsg->needFetch = SCH_TASK_NEED_FETCH(pTask);
- pMsg->phyLen = htonl(pTask->msgLen);
- pMsg->sqlLen = htonl(len);
-
- memcpy(pMsg->msg, pJob->sql, len);
- memcpy(pMsg->msg + len, pTask->msg, pTask->msgLen);
+ if (tSerializeSSubQueryMsg(msg, msgSize, &qMsg) < 0) {
+ SCH_TASK_ELOG("tSerializeSSubQueryMsg failed, msgSize:%d", msgSize);
+ taosMemoryFree(msg);
+ SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
persistHandle = true;
SCH_SET_TASK_HANDLE(pTask, rpcAllocHandle());
@@ -1087,22 +1102,32 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
break;
}
case TDMT_SCH_DROP_TASK: {
- msgSize = sizeof(STaskDropReq);
+ STaskDropReq qMsg;
+ qMsg.header.vgId = addr->nodeId;
+ qMsg.header.contLen = 0;
+ qMsg.sId = schMgmt.sId;
+ qMsg.queryId = pJob->queryId;
+ qMsg.taskId = pTask->taskId;
+ qMsg.refId = pJob->refId;
+ qMsg.execId = pTask->execId;
+
+ msgSize = tSerializeSTaskDropReq(NULL, 0, &qMsg);
+ if (msgSize < 0) {
+ SCH_TASK_ELOG("tSerializeSTaskDropReq get size, msgSize:%d", msgSize);
+ SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
+
msg = taosMemoryCalloc(1, msgSize);
if (NULL == msg) {
SCH_TASK_ELOG("calloc %d failed", msgSize);
SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
}
- STaskDropReq *pMsg = msg;
-
- pMsg->header.vgId = htonl(addr->nodeId);
-
- pMsg->sId = htobe64(schMgmt.sId);
- pMsg->queryId = htobe64(pJob->queryId);
- pMsg->taskId = htobe64(pTask->taskId);
- pMsg->refId = htobe64(pJob->refId);
- pMsg->execId = htonl(pTask->execId);
+ if (tSerializeSTaskDropReq(msg, msgSize, &qMsg) < 0) {
+ SCH_TASK_ELOG("tSerializeSTaskDropReq failed, msgSize:%d", msgSize);
+ taosMemoryFree(msg);
+ SCH_ERR_RET(TSDB_CODE_QRY_OUT_OF_MEMORY);
+ }
break;
}
case TDMT_SCH_QUERY_HEARTBEAT: {
@@ -1157,6 +1182,7 @@ int32_t schBuildAndSendMsg(SSchJob *pJob, SSchTask *pTask, SQueryNodeAddr *addr,
SCH_ERR_RET(schAppendTaskExecNode(pJob, pTask, addr, pTask->execId));
}
} else {
+ taosMemoryFree(msg);
SCH_ERR_RET(schProcessOnTaskSuccess(pJob, pTask));
}
#endif
diff --git a/source/libs/scheduler/src/schTask.c b/source/libs/scheduler/src/schTask.c
index dbdccff302df58fb09e5149f17c39600a2feec7c..7e5b3faedb2c00dd25f632be870b8d058ab1e113 100644
--- a/source/libs/scheduler/src/schTask.c
+++ b/source/libs/scheduler/src/schTask.c
@@ -439,6 +439,8 @@ int32_t schHandleRedirect(SSchJob *pJob, SSchTask *pTask, SDataBuf *pData, int32
code = schDoTaskRedirect(pJob, pTask, pData, rspCode);
taosMemoryFree(pData->pData);
taosMemoryFree(pData->pEpSet);
+ pData->pData = NULL;
+ pData->pEpSet = NULL;
SCH_RET(code);
@@ -446,6 +448,8 @@ _return:
taosMemoryFree(pData->pData);
taosMemoryFree(pData->pEpSet);
+ pData->pData = NULL;
+ pData->pEpSet = NULL;
SCH_RET(schProcessOnTaskFailure(pJob, pTask, code));
}
@@ -942,7 +946,7 @@ int32_t schLaunchLocalTask(SSchJob *pJob, SSchTask *pTask) {
}
SCH_ERR_JRET(qWorkerProcessLocalQuery(schMgmt.queryMgmt, schMgmt.sId, pJob->queryId, pTask->taskId, pJob->refId,
- pTask->execId, &qwMsg, explainRes));
+ pTask->execId, &qwMsg, explainRes));
if (SCH_IS_EXPLAIN_JOB(pJob)) {
SCH_ERR_RET(schHandleExplainRes(explainRes));
@@ -1115,7 +1119,7 @@ int32_t schExecLocalFetch(SSchJob *pJob, SSchTask *pTask) {
}
SCH_ERR_JRET(qWorkerProcessLocalFetch(schMgmt.queryMgmt, schMgmt.sId, pJob->queryId, pTask->taskId, pJob->refId,
- pTask->execId, &pRsp, explainRes));
+ pTask->execId, &pRsp, explainRes));
if (SCH_IS_EXPLAIN_JOB(pJob)) {
SCH_ERR_RET(schHandleExplainRes(explainRes));
diff --git a/source/libs/stream/inc/streamInc.h b/source/libs/stream/inc/streamInc.h
index 6a3bdb59c9277d392ae82a6bed15674672cf56c8..0fc75c4798c2e24f92893a763077dea373ccade1 100644
--- a/source/libs/stream/inc/streamInc.h
+++ b/source/libs/stream/inc/streamInc.h
@@ -32,8 +32,6 @@ typedef struct {
static SStreamGlobalEnv streamEnv;
-// int32_t streamPipelineExec(SStreamTask* pTask, int32_t batchNum, bool dispatch);
-
int32_t streamDispatch(SStreamTask* pTask);
int32_t streamDispatchReqToData(const SStreamDispatchReq* pReq, SStreamDataBlock* pData);
int32_t streamRetrieveReqToData(const SStreamRetrieveReq* pReq, SStreamDataBlock* pData);
diff --git a/source/libs/stream/src/stream.c b/source/libs/stream/src/stream.c
index b71562cf454f0e7be57ddccc00ae4fcdf410c88b..79549675a356ddc716dc6a5a87e26bb3bdcd005c 100644
--- a/source/libs/stream/src/stream.c
+++ b/source/libs/stream/src/stream.c
@@ -51,6 +51,7 @@ void streamSchedByTimer(void* param, void* tmrId) {
SStreamTask* pTask = (void*)param;
if (atomic_load_8(&pTask->taskStatus) == TASK_STATUS__DROPPING) {
+ streamMetaReleaseTask(NULL, pTask);
return;
}
@@ -80,6 +81,8 @@ void streamSchedByTimer(void* param, void* tmrId) {
int32_t streamSetupTrigger(SStreamTask* pTask) {
if (pTask->triggerParam != 0) {
+ int32_t ref = atomic_add_fetch_32(&pTask->refCnt, 1);
+ ASSERT(ref == 2);
pTask->timer = taosTmrStart(streamSchedByTimer, (int32_t)pTask->triggerParam, pTask, streamEnv.timer);
pTask->triggerStatus = TASK_TRIGGER_STATUS__INACTIVE;
}
@@ -240,43 +243,6 @@ int32_t streamProcessRunReq(SStreamTask* pTask) {
return 0;
}
-#if 0
-int32_t streamProcessRecoverReq(SStreamTask* pTask, SStreamTaskRecoverReq* pReq, SRpcMsg* pRsp) {
- void* buf = rpcMallocCont(sizeof(SMsgHead) + sizeof(SStreamTaskRecoverRsp));
- ((SMsgHead*)buf)->vgId = htonl(pReq->upstreamNodeId);
-
- SStreamTaskRecoverRsp* pCont = POINTER_SHIFT(buf, sizeof(SMsgHead));
- pCont->inputStatus = pTask->inputStatus;
- pCont->streamId = pTask->streamId;
- pCont->reqTaskId = pTask->taskId;
- pCont->rspTaskId = pReq->upstreamTaskId;
-
- pRsp->pCont = buf;
- pRsp->contLen = sizeof(SMsgHead) + sizeof(SStreamTaskRecoverRsp);
- tmsgSendRsp(pRsp);
- return 0;
-}
-
-int32_t streamProcessRecoverRsp(SStreamMeta* pMeta, SStreamTask* pTask, SStreamRecoverDownstreamRsp* pRsp) {
- streamProcessRunReq(pTask);
-
- if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
- // scan data to recover
- pTask->inputStatus = TASK_INPUT_STATUS__RECOVER;
- pTask->taskStatus = TASK_STATUS__RECOVER_SELF;
- qStreamPrepareRecover(pTask->exec.executor, pTask->startVer, pTask->recoverSnapVer);
- if (streamPipelineExec(pTask, 100, true) < 0) {
- return -1;
- }
- } else {
- pTask->inputStatus = TASK_INPUT_STATUS__NORMAL;
- pTask->taskStatus = TASK_STATUS__NORMAL;
- }
-
- return 0;
-}
-#endif
-
int32_t streamProcessRetrieveReq(SStreamTask* pTask, SStreamRetrieveReq* pReq, SRpcMsg* pRsp) {
qDebug("task %d receive retrieve req from node %d task %d", pTask->taskId, pReq->srcNodeId, pReq->srcTaskId);
diff --git a/source/libs/stream/src/streamDispatch.c b/source/libs/stream/src/streamDispatch.c
index ad342edfa03054d1caa043bbb77197f6cd1c738b..573a1ea31f10f4b04b87dc387a4c4ebe101ed4b8 100644
--- a/source/libs/stream/src/streamDispatch.c
+++ b/source/libs/stream/src/streamDispatch.c
@@ -118,8 +118,7 @@ int32_t streamBroadcastToChildren(SStreamTask* pTask, const SSDataBlock* pBlock)
pRetrieve->ekey = htobe64(pBlock->info.window.ekey);
pRetrieve->version = htobe64(pBlock->info.version);
- int32_t actualLen = 0;
- blockEncode(pBlock, pRetrieve->data, &actualLen, numOfCols, false);
+ int32_t actualLen = blockEncode(pBlock, pRetrieve->data, numOfCols);
SStreamRetrieveReq req = {
.streamId = pTask->streamId,
@@ -200,8 +199,7 @@ static int32_t streamAddBlockToDispatchMsg(const SSDataBlock* pBlock, SStreamDis
int32_t numOfCols = (int32_t)taosArrayGetSize(pBlock->pDataBlock);
pRetrieve->numOfCols = htonl(numOfCols);
- int32_t actualLen = 0;
- blockEncode(pBlock, pRetrieve->data, &actualLen, numOfCols, false);
+ int32_t actualLen = blockEncode(pBlock, pRetrieve->data, numOfCols);
actualLen += sizeof(SRetrieveTableRsp);
ASSERT(actualLen <= dataStrLen);
taosArrayPush(pReq->dataLen, &actualLen);
diff --git a/source/libs/stream/src/streamExec.c b/source/libs/stream/src/streamExec.c
index 46fab536591f128282f22a7c7ef1a9adb2e441df..009f7eec9a2c28695adb28c34c3632912b7ed1ee 100644
--- a/source/libs/stream/src/streamExec.c
+++ b/source/libs/stream/src/streamExec.c
@@ -91,6 +91,7 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
void* exec = pTask->exec.executor;
qSetStreamOpOpen(exec);
+ bool finished = false;
while (1) {
SArray* pRes = taosArrayInit(0, sizeof(SSDataBlock));
@@ -106,7 +107,10 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
if (qExecTask(exec, &output, &ts) < 0) {
ASSERT(0);
}
- if (output == NULL) break;
+ if (output == NULL) {
+ finished = true;
+ break;
+ }
SSDataBlock block = {0};
assignOneDataBlock(&block, output);
@@ -133,68 +137,45 @@ int32_t streamScanExec(SStreamTask* pTask, int32_t batchSz) {
if (pTask->outputType == TASK_OUTPUT__FIXED_DISPATCH || pTask->outputType == TASK_OUTPUT__SHUFFLE_DISPATCH) {
streamDispatch(pTask);
}
+ if (finished) break;
}
return 0;
}
#if 0
-int32_t streamPipelineExec(SStreamTask* pTask, int32_t batchNum, bool dispatch) {
- ASSERT(pTask->taskLevel != TASK_LEVEL__SINK);
-
- void* exec = pTask->exec.executor;
-
- while (1) {
- SArray* pRes = taosArrayInit(0, sizeof(SSDataBlock));
- if (pRes == NULL) {
- terrno = TSDB_CODE_OUT_OF_MEMORY;
- return -1;
- }
-
- int32_t batchCnt = 0;
- while (1) {
- SSDataBlock* output = NULL;
- uint64_t ts = 0;
- if (qExecTask(exec, &output, &ts) < 0) {
- ASSERT(0);
- }
- if (output == NULL) break;
-
- SSDataBlock block = {0};
- assignOneDataBlock(&block, output);
- block.info.childId = pTask->selfChildId;
- taosArrayPush(pRes, &block);
-
- if (++batchCnt >= batchNum) break;
- }
- if (taosArrayGetSize(pRes) == 0) {
- taosArrayDestroy(pRes);
- break;
+int32_t streamBatchExec(SStreamTask* pTask, int32_t batchLimit) {
+ // fetch all queue item, merge according to batchLimit
+ int32_t numOfItems = taosReadAllQitems(pTask->inputQueue1, pTask->inputQall);
+ if (numOfItems == 0) {
+ qDebug("task: %d, stream task exec over, queue empty", pTask->taskId);
+ return 0;
+ }
+ SStreamQueueItem* pMerged = NULL;
+ SStreamQueueItem* pItem = NULL;
+ taosGetQitem(pTask->inputQall, (void**)&pItem);
+ if (pItem == NULL) {
+ if (pMerged != NULL) {
+ // process merged item
+ } else {
+ return 0;
}
- if (dispatch) {
- SStreamDataBlock* qRes = taosAllocateQitem(sizeof(SStreamDataBlock), DEF_QITEM);
- if (qRes == NULL) {
- taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
- return -1;
- }
-
- qRes->type = STREAM_INPUT__DATA_BLOCK;
- qRes->blocks = pRes;
- qRes->childId = pTask->selfChildId;
+ }
- if (streamTaskOutput(pTask, qRes) < 0) {
- taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
- taosFreeQitem(qRes);
- return -1;
- }
+ // if drop
+ if (pItem->type == STREAM_INPUT__DESTROY) {
+ // set status drop
+ return -1;
+ }
- if (pTask->outputType == TASK_OUTPUT__FIXED_DISPATCH || pTask->outputType == TASK_OUTPUT__SHUFFLE_DISPATCH) {
- streamDispatch(pTask);
- }
- } else {
- taosArrayDestroyEx(pRes, (FDelete)blockDataFreeRes);
- }
+ if (pTask->taskLevel == TASK_LEVEL__SINK) {
+ ASSERT(((SStreamQueueItem*)pItem)->type == STREAM_INPUT__DATA_BLOCK);
+ streamTaskOutput(pTask, (SStreamDataBlock*)pItem);
}
+ // exec impl
+
+ // output
+ // try dispatch
return 0;
}
#endif
diff --git a/source/libs/stream/src/streamMeta.c b/source/libs/stream/src/streamMeta.c
index 98e4e77cb015e30cc81043b45b3d6beef18217dd..a864814a7472ac347f39263ca1f32ec5a29d5a51 100644
--- a/source/libs/stream/src/streamMeta.c
+++ b/source/libs/stream/src/streamMeta.c
@@ -70,6 +70,7 @@ _err:
void streamMetaClose(SStreamMeta* pMeta) {
tdbCommit(pMeta->db, &pMeta->txn);
+ tdbPostCommit(pMeta->db, &pMeta->txn);
tdbTbClose(pMeta->pTaskDb);
tdbTbClose(pMeta->pCheckpointDb);
tdbClose(pMeta->db);
@@ -79,7 +80,12 @@ void streamMetaClose(SStreamMeta* pMeta) {
pIter = taosHashIterate(pMeta->pTasks, pIter);
if (pIter == NULL) break;
SStreamTask* pTask = *(SStreamTask**)pIter;
+ if (pTask->timer) {
+ taosTmrStop(pTask->timer);
+ pTask->timer = NULL;
+ }
tFreeSStreamTask(pTask);
+ /*streamMetaReleaseTask(pMeta, pTask);*/
}
taosHashCleanup(pMeta->pTasks);
taosMemoryFree(pMeta->path);
@@ -168,6 +174,51 @@ SStreamTask* streamMetaGetTask(SStreamMeta* pMeta, int32_t taskId) {
}
}
+SStreamTask* streamMetaAcquireTask(SStreamMeta* pMeta, int32_t taskId) {
+ taosRLockLatch(&pMeta->lock);
+
+ SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasks, &taskId, sizeof(int32_t));
+ if (ppTask) {
+ SStreamTask* pTask = *ppTask;
+ if (atomic_load_8(&pTask->taskStatus) != TASK_STATUS__DROPPING) {
+ atomic_add_fetch_32(&pTask->refCnt, 1);
+ taosRUnLockLatch(&pMeta->lock);
+ return pTask;
+ } else {
+ taosRUnLockLatch(&pMeta->lock);
+ return NULL;
+ }
+ }
+ taosRUnLockLatch(&pMeta->lock);
+ return NULL;
+}
+
+void streamMetaReleaseTask(SStreamMeta* pMeta, SStreamTask* pTask) {
+ int32_t left = atomic_sub_fetch_32(&pTask->refCnt, 1);
+ ASSERT(left >= 0);
+ if (left == 0) {
+ ASSERT(atomic_load_8(&pTask->taskStatus) == TASK_STATUS__DROPPING);
+ tFreeSStreamTask(pTask);
+ }
+}
+
+void streamMetaRemoveTask1(SStreamMeta* pMeta, int32_t taskId) {
+ SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasks, &taskId, sizeof(int32_t));
+ if (ppTask) {
+ SStreamTask* pTask = *ppTask;
+ taosHashRemove(pMeta->pTasks, &taskId, sizeof(int32_t));
+ /*if (pTask->timer) {
+ * taosTmrStop(pTask->timer);*/
+ /*pTask->timer = NULL;*/
+ /*}*/
+ atomic_store_8(&pTask->taskStatus, TASK_STATUS__DROPPING);
+
+ taosWLockLatch(&pMeta->lock);
+ streamMetaReleaseTask(pMeta, pTask);
+ taosWUnLockLatch(&pMeta->lock);
+ }
+}
+
int32_t streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId) {
SStreamTask** ppTask = (SStreamTask**)taosHashGet(pMeta->pTasks, &taskId, sizeof(int32_t));
if (ppTask) {
@@ -186,11 +237,9 @@ int32_t streamMetaRemoveTask(SStreamMeta* pMeta, int32_t taskId) {
while (1) {
int8_t schedStatus =
atomic_val_compare_exchange_8(&pTask->schedStatus, TASK_SCHED_STATUS__INACTIVE, TASK_SCHED_STATUS__DROPPING);
- if (schedStatus == TASK_SCHED_STATUS__INACTIVE) {
+ if (schedStatus != TASK_SCHED_STATUS__ACTIVE) {
tFreeSStreamTask(pTask);
break;
- } else if (schedStatus == TASK_SCHED_STATUS__DROPPING) {
- break;
}
taosMsleep(10);
}
diff --git a/source/libs/stream/src/streamState.c b/source/libs/stream/src/streamState.c
index 9829955baf32c40eee9c70dcf3988680d7a88326..ea31347db5a9470b56e3356455e5308c140781f8 100644
--- a/source/libs/stream/src/streamState.c
+++ b/source/libs/stream/src/streamState.c
@@ -16,6 +16,7 @@
#include "executor.h"
#include "streamInc.h"
#include "tcommon.h"
+#include "tcompare.h"
#include "ttimer.h"
// todo refactor
@@ -29,7 +30,7 @@ typedef struct SStateSessionKey {
int64_t opNum;
} SStateSessionKey;
-static inline int sessionKeyCmpr(const SSessionKey* pWin1, const SSessionKey* pWin2) {
+static inline int sessionRangeKeyCmpr(const SSessionKey* pWin1, const SSessionKey* pWin2) {
if (pWin1->groupId > pWin2->groupId) {
return 1;
} else if (pWin1->groupId < pWin2->groupId) {
@@ -45,6 +46,28 @@ static inline int sessionKeyCmpr(const SSessionKey* pWin1, const SSessionKey* pW
return 0;
}
+static inline int sessionWinKeyCmpr(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.skey) {
+ return 1;
+ } else if (pWin1->win.skey < pWin2->win.skey) {
+ return -1;
+ }
+
+ if (pWin1->win.ekey > pWin2->win.ekey) {
+ return 1;
+ } else if (pWin1->win.ekey < pWin2->win.ekey) {
+ 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;
@@ -55,7 +78,7 @@ static inline int stateSessionKeyCmpr(const void* pKey1, int kLen1, const void*
return -1;
}
- return sessionKeyCmpr(&pWin1->key, &pWin2->key);
+ return sessionWinKeyCmpr(&pWin1->key, &pWin2->key);
}
static inline int stateKeyCmpr(const void* pKey1, int kLen1, const void* pKey2, int kLen2) {
@@ -91,34 +114,48 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
+ pState->pTdbState = taosMemoryCalloc(1, sizeof(STdbState));
+ if (pState->pTdbState == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ streamStateDestroy(pState);
+ return NULL;
+ }
- char statePath[300];
+ char statePath[1024];
if (!specPath) {
sprintf(statePath, "%s/%d", path, pTask->taskId);
} else {
- memset(statePath, 0, 300);
- tstrncpy(statePath, path, 300);
+ memset(statePath, 0, 1024);
+ tstrncpy(statePath, path, 1024);
}
- if (tdbOpen(statePath, szPage, pages, &pState->db, 0) < 0) {
+ if (tdbOpen(statePath, szPage, pages, &pState->pTdbState->db, 0) < 0) {
goto _err;
}
// open state storage backend
- if (tdbTbOpen("state.db", sizeof(SStateKey), -1, stateKeyCmpr, pState->db, &pState->pStateDb, 0) < 0) {
+ if (tdbTbOpen("state.db", sizeof(SStateKey), -1, stateKeyCmpr, pState->pTdbState->db, &pState->pTdbState->pStateDb,
+ 0) < 0) {
goto _err;
}
// todo refactor
- if (tdbTbOpen("fill.state.db", sizeof(SWinKey), -1, winKeyCmpr, pState->db, &pState->pFillStateDb, 0) < 0) {
+ if (tdbTbOpen("fill.state.db", sizeof(SWinKey), -1, winKeyCmpr, pState->pTdbState->db,
+ &pState->pTdbState->pFillStateDb, 0) < 0) {
goto _err;
}
- if (tdbTbOpen("session.state.db", sizeof(SStateSessionKey), -1, stateSessionKeyCmpr, pState->db,
- &pState->pSessionStateDb, 0) < 0) {
+ if (tdbTbOpen("session.state.db", sizeof(SStateSessionKey), -1, stateSessionKeyCmpr, pState->pTdbState->db,
+ &pState->pTdbState->pSessionStateDb, 0) < 0) {
goto _err;
}
- if (tdbTbOpen("func.state.db", sizeof(STupleKey), -1, STupleKeyCmpr, pState->db, &pState->pFuncStateDb, 0) < 0) {
+ if (tdbTbOpen("func.state.db", sizeof(STupleKey), -1, STupleKeyCmpr, pState->pTdbState->db,
+ &pState->pTdbState->pFuncStateDb, 0) < 0) {
+ goto _err;
+ }
+
+ if (tdbTbOpen("parname.state.db", sizeof(int64_t), TSDB_TABLE_NAME_LEN, NULL, pState->pTdbState->db,
+ &pState->pTdbState->pParNameDb, 0) < 0) {
goto _err;
}
@@ -126,111 +163,117 @@ SStreamState* streamStateOpen(char* path, SStreamTask* pTask, bool specPath, int
goto _err;
}
- pState->pOwner = pTask;
+ pState->pTdbState->pOwner = pTask;
return pState;
_err:
- tdbTbClose(pState->pStateDb);
- tdbTbClose(pState->pFuncStateDb);
- tdbTbClose(pState->pFillStateDb);
- tdbTbClose(pState->pSessionStateDb);
- tdbClose(pState->db);
- taosMemoryFree(pState);
+ tdbTbClose(pState->pTdbState->pStateDb);
+ tdbTbClose(pState->pTdbState->pFuncStateDb);
+ tdbTbClose(pState->pTdbState->pFillStateDb);
+ tdbTbClose(pState->pTdbState->pSessionStateDb);
+ tdbTbClose(pState->pTdbState->pParNameDb);
+ tdbClose(pState->pTdbState->db);
+ streamStateDestroy(pState);
return NULL;
}
void streamStateClose(SStreamState* pState) {
- tdbCommit(pState->db, &pState->txn);
- tdbTbClose(pState->pStateDb);
- tdbTbClose(pState->pFuncStateDb);
- tdbTbClose(pState->pFillStateDb);
- tdbTbClose(pState->pSessionStateDb);
- tdbClose(pState->db);
+ tdbCommit(pState->pTdbState->db, &pState->pTdbState->txn);
+ tdbPostCommit(pState->pTdbState->db, &pState->pTdbState->txn);
+ tdbTbClose(pState->pTdbState->pStateDb);
+ tdbTbClose(pState->pTdbState->pFuncStateDb);
+ tdbTbClose(pState->pTdbState->pFillStateDb);
+ tdbTbClose(pState->pTdbState->pSessionStateDb);
+ tdbTbClose(pState->pTdbState->pParNameDb);
+ tdbClose(pState->pTdbState->db);
- taosMemoryFree(pState);
+ streamStateDestroy(pState);
}
int32_t streamStateBegin(SStreamState* pState) {
- if (tdbTxnOpen(&pState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
- 0) {
+ if (tdbTxnOpen(&pState->pTdbState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL,
+ TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
return -1;
}
- if (tdbBegin(pState->db, &pState->txn) < 0) {
- tdbTxnClose(&pState->txn);
+ if (tdbBegin(pState->pTdbState->db, &pState->pTdbState->txn) < 0) {
+ tdbTxnClose(&pState->pTdbState->txn);
return -1;
}
return 0;
}
int32_t streamStateCommit(SStreamState* pState) {
- if (tdbCommit(pState->db, &pState->txn) < 0) {
+ if (tdbCommit(pState->pTdbState->db, &pState->pTdbState->txn) < 0) {
return -1;
}
- memset(&pState->txn, 0, sizeof(TXN));
- if (tdbTxnOpen(&pState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
- 0) {
+ if (tdbPostCommit(pState->pTdbState->db, &pState->pTdbState->txn) < 0) {
return -1;
}
- if (tdbBegin(pState->db, &pState->txn) < 0) {
+ memset(&pState->pTdbState->txn, 0, sizeof(TXN));
+ if (tdbTxnOpen(&pState->pTdbState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL,
+ TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
+ return -1;
+ }
+ if (tdbBegin(pState->pTdbState->db, &pState->pTdbState->txn) < 0) {
return -1;
}
return 0;
}
int32_t streamStateAbort(SStreamState* pState) {
- if (tdbAbort(pState->db, &pState->txn) < 0) {
+ if (tdbAbort(pState->pTdbState->db, &pState->pTdbState->txn) < 0) {
return -1;
}
- memset(&pState->txn, 0, sizeof(TXN));
- if (tdbTxnOpen(&pState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL, TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) <
- 0) {
+ memset(&pState->pTdbState->txn, 0, sizeof(TXN));
+ if (tdbTxnOpen(&pState->pTdbState->txn, 0, tdbDefaultMalloc, tdbDefaultFree, NULL,
+ TDB_TXN_WRITE | TDB_TXN_READ_UNCOMMITTED) < 0) {
return -1;
}
- if (tdbBegin(pState->db, &pState->txn) < 0) {
+ if (tdbBegin(pState->pTdbState->db, &pState->pTdbState->txn) < 0) {
return -1;
}
return 0;
}
int32_t streamStateFuncPut(SStreamState* pState, const STupleKey* key, const void* value, int32_t vLen) {
- return tdbTbUpsert(pState->pFuncStateDb, key, sizeof(STupleKey), value, vLen, &pState->txn);
+ return tdbTbUpsert(pState->pTdbState->pFuncStateDb, key, sizeof(STupleKey), value, vLen, &pState->pTdbState->txn);
}
int32_t streamStateFuncGet(SStreamState* pState, const STupleKey* key, void** pVal, int32_t* pVLen) {
- return tdbTbGet(pState->pFuncStateDb, key, sizeof(STupleKey), pVal, pVLen);
+ return tdbTbGet(pState->pTdbState->pFuncStateDb, key, sizeof(STupleKey), pVal, pVLen);
}
int32_t streamStateFuncDel(SStreamState* pState, const STupleKey* key) {
- return tdbTbDelete(pState->pFuncStateDb, key, sizeof(STupleKey), &pState->txn);
+ return tdbTbDelete(pState->pTdbState->pFuncStateDb, key, sizeof(STupleKey), &pState->pTdbState->txn);
}
// todo refactor
int32_t streamStatePut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen) {
SStateKey sKey = {.key = *key, .opNum = pState->number};
- return tdbTbUpsert(pState->pStateDb, &sKey, sizeof(SStateKey), value, vLen, &pState->txn);
+ return tdbTbUpsert(pState->pTdbState->pStateDb, &sKey, sizeof(SStateKey), value, vLen, &pState->pTdbState->txn);
}
// todo refactor
int32_t streamStateFillPut(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen) {
- return tdbTbUpsert(pState->pFillStateDb, key, sizeof(SWinKey), value, vLen, &pState->txn);
+ return tdbTbUpsert(pState->pTdbState->pFillStateDb, key, sizeof(SWinKey), value, vLen, &pState->pTdbState->txn);
}
// todo refactor
int32_t streamStateGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen) {
SStateKey sKey = {.key = *key, .opNum = pState->number};
- return tdbTbGet(pState->pStateDb, &sKey, sizeof(SStateKey), pVal, pVLen);
+ return tdbTbGet(pState->pTdbState->pStateDb, &sKey, sizeof(SStateKey), pVal, pVLen);
}
// todo refactor
int32_t streamStateFillGet(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen) {
- return tdbTbGet(pState->pFillStateDb, key, sizeof(SWinKey), pVal, pVLen);
+ return tdbTbGet(pState->pTdbState->pFillStateDb, key, sizeof(SWinKey), pVal, pVLen);
}
// todo refactor
int32_t streamStateDel(SStreamState* pState, const SWinKey* key) {
SStateKey sKey = {.key = *key, .opNum = pState->number};
- return tdbTbDelete(pState->pStateDb, &sKey, sizeof(SStateKey), &pState->txn);
+ return tdbTbDelete(pState->pTdbState->pStateDb, &sKey, sizeof(SStateKey), &pState->pTdbState->txn);
}
int32_t streamStateClear(SStreamState* pState) {
@@ -254,7 +297,7 @@ void streamStateSetNumber(SStreamState* pState, int32_t number) { pState->number
// todo refactor
int32_t streamStateFillDel(SStreamState* pState, const SWinKey* key) {
- return tdbTbDelete(pState->pFillStateDb, key, sizeof(SWinKey), &pState->txn);
+ return tdbTbDelete(pState->pTdbState->pFillStateDb, key, sizeof(SWinKey), &pState->pTdbState->txn);
}
int32_t streamStateAddIfNotExist(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen) {
@@ -280,7 +323,7 @@ int32_t streamStateReleaseBuf(SStreamState* pState, const SWinKey* key, void* pV
SStreamStateCur* streamStateGetCur(SStreamState* pState, const SWinKey* key) {
SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
if (pCur == NULL) return NULL;
- tdbTbcOpen(pState->pStateDb, &pCur->pCur, NULL);
+ tdbTbcOpen(pState->pTdbState->pStateDb, &pCur->pCur, NULL);
int32_t c = 0;
SStateKey sKey = {.key = *key, .opNum = pState->number};
@@ -296,7 +339,7 @@ SStreamStateCur* streamStateGetCur(SStreamState* pState, const SWinKey* key) {
SStreamStateCur* streamStateFillGetCur(SStreamState* pState, const SWinKey* key) {
SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
if (pCur == NULL) return NULL;
- tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL);
+ tdbTbcOpen(pState->pTdbState->pFillStateDb, &pCur->pCur, NULL);
int32_t c = 0;
tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c);
@@ -368,6 +411,7 @@ int32_t streamStateGetFirst(SStreamState* pState, SWinKey* key) {
streamStatePut(pState, &tmp, NULL, 0);
SStreamStateCur* pCur = streamStateSeekKeyNext(pState, &tmp);
int32_t code = streamStateGetKVByCur(pCur, key, NULL, 0);
+ streamStateFreeCur(pCur);
streamStateDel(pState, &tmp);
return code;
}
@@ -388,7 +432,7 @@ SStreamStateCur* streamStateSeekKeyNext(SStreamState* pState, const SWinKey* key
return NULL;
}
pCur->number = pState->number;
- if (tdbTbcOpen(pState->pStateDb, &pCur->pCur, NULL) < 0) {
+ if (tdbTbcOpen(pState->pTdbState->pStateDb, &pCur->pCur, NULL) < 0) {
streamStateFreeCur(pCur);
return NULL;
}
@@ -396,7 +440,6 @@ SStreamStateCur* streamStateSeekKeyNext(SStreamState* pState, const SWinKey* key
SStateKey sKey = {.key = *key, .opNum = pState->number};
int32_t c = 0;
if (tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateKey), &c) < 0) {
- tdbTbcClose(pCur->pCur);
streamStateFreeCur(pCur);
return NULL;
}
@@ -415,14 +458,13 @@ SStreamStateCur* streamStateFillSeekKeyNext(SStreamState* pState, const SWinKey*
if (!pCur) {
return NULL;
}
- if (tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL) < 0) {
+ if (tdbTbcOpen(pState->pTdbState->pFillStateDb, &pCur->pCur, NULL) < 0) {
streamStateFreeCur(pCur);
return NULL;
}
int32_t c = 0;
if (tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c) < 0) {
- tdbTbcClose(pCur->pCur);
streamStateFreeCur(pCur);
return NULL;
}
@@ -441,14 +483,13 @@ SStreamStateCur* streamStateFillSeekKeyPrev(SStreamState* pState, const SWinKey*
if (pCur == NULL) {
return NULL;
}
- if (tdbTbcOpen(pState->pFillStateDb, &pCur->pCur, NULL) < 0) {
+ if (tdbTbcOpen(pState->pTdbState->pFillStateDb, &pCur->pCur, NULL) < 0) {
streamStateFreeCur(pCur);
return NULL;
}
int32_t c = 0;
if (tdbTbcMoveTo(pCur->pCur, key, sizeof(SWinKey), &c) < 0) {
- tdbTbcClose(pCur->pCur);
streamStateFreeCur(pCur);
return NULL;
}
@@ -489,41 +530,31 @@ 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 = -2;
- 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;
+ return tdbTbUpsert(pState->pTdbState->pSessionStateDb, &sKey, sizeof(SStateSessionKey), value, vLen,
+ &pState->pTdbState->txn);
}
int32_t streamStateSessionGet(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen) {
- SStreamStateCur* pCur = streamStateSessionGetRanomCur(pState, key);
+ SStreamStateCur* pCur = streamStateSessionSeekKeyCurrentNext(pState, key);
+ SSessionKey resKey = *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;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &resKey, &tmp, pVLen);
+ if (code == 0) {
+ if (key->win.skey != resKey.win.skey) {
+ code = -1;
+ } else {
+ *key = resKey;
+ *pVal = tdbRealloc(NULL, *pVLen);
+ memcpy(*pVal, tmp, *pVLen);
+ }
}
streamStateFreeCur(pCur);
- return -1;
+ return code;
}
int32_t streamStateSessionDel(SStreamState* pState, const SSessionKey* key) {
SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
- return tdbTbDelete(pState->pSessionStateDb, &sKey, sizeof(SStateSessionKey), &pState->txn);
+ return tdbTbDelete(pState->pTdbState->pSessionStateDb, &sKey, sizeof(SStateSessionKey), &pState->pTdbState->txn);
}
SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, const SSessionKey* key) {
@@ -532,7 +563,7 @@ SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, cons
return NULL;
}
pCur->number = pState->number;
- if (tdbTbcOpen(pState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
+ if (tdbTbcOpen(pState->pTdbState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
streamStateFreeCur(pCur);
return NULL;
}
@@ -540,7 +571,6 @@ SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, cons
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;
}
@@ -554,13 +584,41 @@ SStreamStateCur* streamStateSessionSeekKeyCurrentPrev(SStreamState* pState, cons
return pCur;
}
+SStreamStateCur* streamStateSessionSeekKeyCurrentNext(SStreamState* pState, const SSessionKey* key) {
+ SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
+ if (pCur == NULL) {
+ return NULL;
+ }
+ pCur->number = pState->number;
+ if (tdbTbcOpen(pState->pTdbState->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) {
+ streamStateFreeCur(pCur);
+ return NULL;
+ }
+
+ if (c <= 0) return pCur;
+
+ if (tdbTbcMoveToNext(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) {
+ if (tdbTbcOpen(pState->pTdbState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
streamStateFreeCur(pCur);
return NULL;
}
@@ -568,7 +626,6 @@ SStreamStateCur* streamStateSessionSeekKeyNext(SStreamState* pState, const SSess
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;
}
@@ -582,13 +639,13 @@ SStreamStateCur* streamStateSessionSeekKeyNext(SStreamState* pState, const SSess
return pCur;
}
-int32_t streamStateSessionGetKVByCur(SStreamStateCur* pCur, SSessionKey* pKey, const void** pVal, int32_t* pVLen) {
+int32_t streamStateSessionGetKVByCur(SStreamStateCur* pCur, SSessionKey* pKey, 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) {
+ SStateSessionKey* pKTmp = NULL;
+ int32_t kLen;
+ if (tdbTbcGet(pCur->pCur, (const void**)&pKTmp, &kLen, (const void**)pVal, pVLen) < 0) {
return -1;
}
if (pKTmp->opNum != pCur->number) {
@@ -602,15 +659,15 @@ int32_t streamStateSessionGetKVByCur(SStreamStateCur* pCur, SSessionKey* pKey, c
}
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);
+ SSessionKey key = {.win.skey = 0, .win.ekey = 0, .groupId = 0};
+ SStreamStateCur* pCur = streamStateSessionSeekKeyCurrentNext(pState, &key);
while (1) {
SSessionKey delKey = {0};
void* buf = NULL;
int32_t size = 0;
- int32_t code = streamStateSessionGetKVByCur(pCur, &delKey, buf, &size);
+ int32_t code = streamStateSessionGetKVByCur(pCur, &delKey, &buf, &size);
if (code == 0) {
+ ASSERT(size > 0);
memset(buf, 0, size);
streamStateSessionPut(pState, &delKey, buf, size);
} else {
@@ -619,61 +676,104 @@ int32_t streamStateSessionClear(SStreamState* pState) {
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;
- }
+int32_t streamStateSessionGetKeyByRange(SStreamState* pState, const SSessionKey* key, SSessionKey* curKey) {
+ SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
+ if (pCur == NULL) {
+ return -1;
+ }
+ pCur->number = pState->number;
+ if (tdbTbcOpen(pState->pTdbState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
+ streamStateFreeCur(pCur);
+ return -1;
}
- 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;
- streamStateCurPrev(pState, pCur);
- } else {
- break;
+ SStateSessionKey sKey = {.key = *key, .opNum = pState->number};
+ int32_t c = 0;
+ if (tdbTbcMoveTo(pCur->pCur, &sKey, sizeof(SStateSessionKey), &c) < 0) {
+ streamStateFreeCur(pCur);
+ return -1;
+ }
+
+ SSessionKey resKey = *key;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &resKey, NULL, 0);
+ if (code == 0 && sessionRangeKeyCmpr(key, &resKey) == 0) {
+ *curKey = resKey;
+ streamStateFreeCur(pCur);
+ return code;
+ }
+
+ if (c > 0) {
+ streamStateCurNext(pState, pCur);
+ code = streamStateSessionGetKVByCur(pCur, &resKey, NULL, 0);
+ if (code == 0 && sessionRangeKeyCmpr(key, &resKey) == 0) {
+ *curKey = resKey;
+ streamStateFreeCur(pCur);
+ return code;
+ }
+ } else if (c < 0) {
+ streamStateCurPrev(pState, pCur);
+ code = streamStateSessionGetKVByCur(pCur, &resKey, NULL, 0);
+ if (code == 0 && sessionRangeKeyCmpr(key, &resKey) == 0) {
+ *curKey = resKey;
+ streamStateFreeCur(pCur);
+ return code;
}
}
- *curKey = resKey;
+
streamStateFreeCur(pCur);
- return res;
+ return -1;
}
-int32_t streamStateSessionAddIfNotExist(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen) {
+int32_t streamStateSessionAddIfNotExist(SStreamState* pState, SSessionKey* key, TSKEY gap, 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);
+ int32_t res = 0;
+ SSessionKey originKey = *key;
+ SSessionKey searchKey = *key;
+ searchKey.win.skey = key->win.skey - gap;
+ searchKey.win.ekey = key->win.ekey + gap;
+ int32_t valSize = *pVLen;
+ void* tmp = tdbRealloc(NULL, valSize);
+ if (!tmp) {
+ return -1;
+ }
+
+ SStreamStateCur* pCur = streamStateSessionSeekKeyCurrentPrev(pState, key);
+ int32_t code = streamStateSessionGetKVByCur(pCur, key, pVal, pVLen);
+ if (code == 0) {
+ if (sessionRangeKeyCmpr(&searchKey, key) == 0) {
+ memcpy(tmp, *pVal, valSize);
+ streamStateSessionDel(pState, key);
+ goto _end;
+ }
+ streamStateCurNext(pState, pCur);
+ } else {
+ *key = originKey;
streamStateFreeCur(pCur);
- return 0;
+ pCur = streamStateSessionSeekKeyNext(pState, key);
+ }
+
+ code = streamStateSessionGetKVByCur(pCur, key, pVal, pVLen);
+ if (code == 0) {
+ if (sessionRangeKeyCmpr(&searchKey, key) == 0) {
+ memcpy(tmp, *pVal, valSize);
+ streamStateSessionDel(pState, key);
+ goto _end;
+ }
}
+
+ *key = originKey;
+ res = 1;
+ memset(tmp, 0, valSize);
+
+_end:
+
+ *pVal = tmp;
streamStateFreeCur(pCur);
- return 1;
+ return res;
}
int32_t streamStateStateAddIfNotExist(SStreamState* pState, SSessionKey* key, char* pKeyData, int32_t keyDataLen,
@@ -688,16 +788,18 @@ int32_t streamStateStateAddIfNotExist(SStreamState* pState, SSessionKey* key, ch
}
SStreamStateCur* pCur = streamStateSessionSeekKeyCurrentPrev(pState, key);
- int32_t code = streamStateSessionGetKVByCur(pCur, key, (const void**)pVal, pVLen);
+ int32_t code = streamStateSessionGetKVByCur(pCur, key, pVal, pVLen);
if (code == 0) {
if (key->win.skey <= tmpKey.win.skey && tmpKey.win.ekey <= key->win.ekey) {
memcpy(tmp, *pVal, valSize);
+ streamStateSessionDel(pState, key);
goto _end;
}
void* stateKey = (char*)(*pVal) + (valSize - keyDataLen);
if (fn(pKeyData, stateKey) == true) {
memcpy(tmp, *pVal, valSize);
+ streamStateSessionDel(pState, key);
goto _end;
}
@@ -708,11 +810,12 @@ int32_t streamStateStateAddIfNotExist(SStreamState* pState, SSessionKey* key, ch
pCur = streamStateSessionSeekKeyNext(pState, key);
}
- code = streamStateSessionGetKVByCur(pCur, key, (const void**)pVal, pVLen);
+ code = streamStateSessionGetKVByCur(pCur, key, pVal, pVLen);
if (code == 0) {
void* stateKey = (char*)(*pVal) + (valSize - keyDataLen);
if (fn(pKeyData, stateKey) == true) {
memcpy(tmp, *pVal, valSize);
+ streamStateSessionDel(pState, key);
goto _end;
}
}
@@ -728,6 +831,22 @@ _end:
return res;
}
+int32_t streamStatePutParName(SStreamState* pState, int64_t groupId, const char tbname[TSDB_TABLE_NAME_LEN]) {
+ tdbTbUpsert(pState->pTdbState->pParNameDb, &groupId, sizeof(int64_t), tbname, TSDB_TABLE_NAME_LEN,
+ &pState->pTdbState->txn);
+ return 0;
+}
+
+int32_t streamStateGetParName(SStreamState* pState, int64_t groupId, void** pVal) {
+ int32_t len;
+ return tdbTbGet(pState->pTdbState->pParNameDb, &groupId, sizeof(int64_t), pVal, &len);
+}
+
+void streamStateDestroy(SStreamState* pState) {
+ taosMemoryFreeClear(pState->pTdbState);
+ taosMemoryFreeClear(pState);
+}
+
#if 0
char* streamStateSessionDump(SStreamState* pState) {
SStreamStateCur* pCur = taosMemoryCalloc(1, sizeof(SStreamStateCur));
@@ -735,15 +854,18 @@ char* streamStateSessionDump(SStreamState* pState) {
return NULL;
}
pCur->number = pState->number;
- if (tdbTbcOpen(pState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
+ if (tdbTbcOpen(pState->pTdbState->pSessionStateDb, &pCur->pCur, NULL) < 0) {
streamStateFreeCur(pCur);
return NULL;
}
tdbTbcMoveToFirst(pCur->pCur);
SSessionKey key = {0};
- int32_t code = streamStateSessionGetKVByCur(pCur, &key, NULL, 0);
+ void* buf = NULL;
+ int32_t bufSize = 0;
+ int32_t code = streamStateSessionGetKVByCur(pCur, &key, &buf, &bufSize);
if (code != 0) {
+ streamStateFreeCur(pCur);
return NULL;
}
@@ -758,12 +880,14 @@ char* streamStateSessionDump(SStreamState* pState) {
key = (SSessionKey){0};
code = streamStateSessionGetKVByCur(pCur, &key, NULL, 0);
if (code != 0) {
+ streamStateFreeCur(pCur);
return dumpBuf;
}
len += snprintf(dumpBuf + len, size - len, "||s:%15" PRId64 ",", key.win.skey);
len += snprintf(dumpBuf + len, size - len, "e:%15" PRId64 ",", key.win.ekey);
len += snprintf(dumpBuf + len, size - len, "g:%15" PRId64 "||", key.groupId);
}
+ streamStateFreeCur(pCur);
return dumpBuf;
}
#endif
diff --git a/source/libs/stream/src/streamUpdate.c b/source/libs/stream/src/streamUpdate.c
index 199892c24196b5178981a5b400cf62a4d5d02e88..15526cd8bbfd36c6dfaa743979c91c550e413868 100644
--- a/source/libs/stream/src/streamUpdate.c
+++ b/source/libs/stream/src/streamUpdate.c
@@ -163,9 +163,9 @@ bool updateInfoIsTableInserted(SUpdateInfo *pInfo, int64_t tbUid) {
return false;
}
-void updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol) {
- if (pBlock == NULL || pBlock->info.rows == 0) return;
- TSKEY maxTs = -1;
+TSKEY updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol) {
+ if (pBlock == NULL || pBlock->info.rows == 0) return INT64_MIN;
+ TSKEY maxTs = INT64_MIN;
int64_t tbUid = pBlock->info.uid;
SColumnInfoData *pColDataInfo = taosArrayGet(pBlock->pDataBlock, primaryTsCol);
@@ -186,6 +186,7 @@ void updateInfoFillBlockData(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t pr
if (pMaxTs == NULL || *pMaxTs > maxTs) {
taosHashPut(pInfo->pMap, &tbUid, sizeof(int64_t), &maxTs, sizeof(TSKEY));
}
+ return maxTs;
}
bool updateInfoIsUpdated(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts) {
diff --git a/source/libs/sync/inc/syncAppendEntries.h b/source/libs/sync/inc/syncAppendEntries.h
index dc40e2fc7230b6bc235798945008718d7b347a88..7791160afa082bb777a312b3e5b2de6b86e9bd6b 100644
--- a/source/libs/sync/inc/syncAppendEntries.h
+++ b/source/libs/sync/inc/syncAppendEntries.h
@@ -20,12 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
// TLA+ Spec
// HandleAppendEntriesRequest(i, j, m) ==
@@ -93,7 +88,7 @@ extern "C" {
// /\ UNCHANGED <>
//
-int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg);
+int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pMsg);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncAppendEntriesReply.h b/source/libs/sync/inc/syncAppendEntriesReply.h
index 0227d832fcf8c24affff174ecb1613f691d4c19f..199a8959612be4f62795736229dae85455b82a0a 100644
--- a/source/libs/sync/inc/syncAppendEntriesReply.h
+++ b/source/libs/sync/inc/syncAppendEntriesReply.h
@@ -20,12 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
// TLA+ Spec
// HandleAppendEntriesResponse(i, j, m) ==
@@ -40,7 +35,7 @@ extern "C" {
// /\ Discard(m)
// /\ UNCHANGED <>
//
-int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMsg);
+int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pMsg);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncCommit.h b/source/libs/sync/inc/syncCommit.h
index 7458ce28ab8e02196d74b9adbac80deb6acb7690..d3ba556f829b712a441d1132fa108fe9c1524fdb 100644
--- a/source/libs/sync/inc/syncCommit.h
+++ b/source/libs/sync/inc/syncCommit.h
@@ -20,11 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "taosdef.h"
// \* Leader i advances its commitIndex.
// \* This is done as a separate step from handling AppendEntries responses,
diff --git a/source/libs/sync/inc/syncElection.h b/source/libs/sync/inc/syncElection.h
index 9ccd9dd28f4ecff100aaa3875b811b5fce6ec096..53337e1a8ab2be2d34fa82e3252546f79c54f114 100644
--- a/source/libs/sync/inc/syncElection.h
+++ b/source/libs/sync/inc/syncElection.h
@@ -20,11 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "taosdef.h"
// TLA+ Spec
// RequestVote(i, j) ==
@@ -38,9 +34,7 @@ extern "C" {
// mdest |-> j])
// /\ UNCHANGED <>
-int32_t syncNodeElect(SSyncNode* pSyncNode);
-int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode);
-int32_t syncNodeSendRequestVote(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncRequestVote* pMsg);
+int32_t syncNodeElect(SSyncNode* pNode);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncEnv.h b/source/libs/sync/inc/syncEnv.h
index cf4e3309f1f7c26ce43a357eff9c73dbc9d0b357..04e8e5edd4ca825955b6dec5ac5d73e10fb244ca 100644
--- a/source/libs/sync/inc/syncEnv.h
+++ b/source/libs/sync/inc/syncEnv.h
@@ -30,8 +30,6 @@ extern "C" {
#define ELECT_TIMER_MS_RANGE (ELECT_TIMER_MS_MAX - ELECT_TIMER_MS_MIN)
#define HEARTBEAT_TIMER_MS 1000
-#define EMPTY_RAFT_ID ((SRaftId){.addr = 0, .vgId = 0})
-
typedef struct SSyncEnv {
uint8_t isStart;
@@ -59,6 +57,11 @@ void syncNodeRemove(int64_t rid);
SSyncNode* syncNodeAcquire(int64_t rid);
void syncNodeRelease(SSyncNode* pNode);
+int64_t syncHbTimerDataAdd(SSyncHbTimerData* pData);
+void syncHbTimerDataRemove(int64_t rid);
+SSyncHbTimerData* syncHbTimerDataAcquire(int64_t rid);
+void syncHbTimerDataRelease(SSyncHbTimerData* pData);
+
#ifdef __cplusplus
}
#endif
diff --git a/source/libs/sync/inc/syncIndexMgr.h b/source/libs/sync/inc/syncIndexMgr.h
index e8f17537b4ad6a3e8bb79769ca5cbe8af346306b..79b4fa0fbf06be6d1c16e783ebc59638fff1a5b5 100644
--- a/source/libs/sync/inc/syncIndexMgr.h
+++ b/source/libs/sync/inc/syncIndexMgr.h
@@ -20,11 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "taosdef.h"
// SIndexMgr -----------------------------
typedef struct SSyncIndexMgr {
@@ -45,22 +41,13 @@ void syncIndexMgrDestroy(SSyncIndexMgr *pSyncIndexMgr);
void syncIndexMgrClear(SSyncIndexMgr *pSyncIndexMgr);
void syncIndexMgrSetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, SyncIndex index);
SyncIndex syncIndexMgrGetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
-cJSON * syncIndexMgr2Json(SSyncIndexMgr *pSyncIndexMgr);
-char * syncIndexMgr2Str(SSyncIndexMgr *pSyncIndexMgr);
-void syncIndexMgrSetStartTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, int64_t startTime);
-int64_t syncIndexMgrGetStartTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
-void syncIndexMgrSetRecvTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, int64_t recvTime);
-int64_t syncIndexMgrGetRecvTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
-
-// void syncIndexMgrSetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, SyncTerm term);
-// SyncTerm syncIndexMgrGetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
-
-// for debug -------------------
-void syncIndexMgrPrint(SSyncIndexMgr *pObj);
-void syncIndexMgrPrint2(char *s, SSyncIndexMgr *pObj);
-void syncIndexMgrLog(SSyncIndexMgr *pObj);
-void syncIndexMgrLog2(char *s, SSyncIndexMgr *pObj);
+void syncIndexMgrSetStartTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, int64_t startTime);
+int64_t syncIndexMgrGetStartTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
+void syncIndexMgrSetRecvTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, int64_t recvTime);
+int64_t syncIndexMgrGetRecvTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
+void syncIndexMgrSetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, SyncTerm term);
+SyncTerm syncIndexMgrGetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncInt.h b/source/libs/sync/inc/syncInt.h
index a5ff653b69600741addf04eb5ad3417db6942db5..57f52c7d88204793975c1c78222fdb58424a7fad 100644
--- a/source/libs/sync/inc/syncInt.h
+++ b/source/libs/sync/inc/syncInt.h
@@ -21,31 +21,12 @@ extern "C" {
#endif
#include "sync.h"
-#include "syncTools.h"
#include "taosdef.h"
-#include "tlog.h"
#include "trpc.h"
#include "ttimer.h"
-// clang-format off
-#define sFatal(...) do { if (sDebugFlag & DEBUG_FATAL) { taosPrintLog("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
-#define sError(...) do { if (sDebugFlag & DEBUG_ERROR) { taosPrintLog("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
-#define sWarn(...) do { if (sDebugFlag & DEBUG_WARN) { taosPrintLog("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
-#define sInfo(...) do { if (sDebugFlag & DEBUG_INFO) { taosPrintLog("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
-#define sDebug(...) do { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }} while(0)
-#define sTrace(...) do { if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }} while(0)
-#define sFatalLong(...) do { if (sDebugFlag & DEBUG_FATAL) { taosPrintLongString("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }} while(0)
-#define sErrorLong(...) do { if (sDebugFlag & DEBUG_ERROR) { taosPrintLongString("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }} while(0)
-#define sWarnLong(...) do { if (sDebugFlag & DEBUG_WARN) { taosPrintLongString("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }} while(0)
-#define sInfoLong(...) do { if (sDebugFlag & DEBUG_INFO) { taosPrintLongString("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }} while(0)
-#define sDebugLong(...) do { if (sDebugFlag & DEBUG_DEBUG) { taosPrintLongString("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }} while(0)
-#define sTraceLong(...) do { if (sDebugFlag & DEBUG_TRACE) { taosPrintLongString("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }} while(0)
-// clang-format on
-
typedef struct SyncTimeout SyncTimeout;
typedef struct SyncClientRequest SyncClientRequest;
-typedef struct SyncPing SyncPing;
-typedef struct SyncPingReply SyncPingReply;
typedef struct SyncRequestVote SyncRequestVote;
typedef struct SyncRequestVoteReply SyncRequestVoteReply;
typedef struct SyncAppendEntries SyncAppendEntries;
@@ -61,14 +42,26 @@ typedef struct SSyncSnapshotSender SSyncSnapshotSender;
typedef struct SSyncSnapshotReceiver SSyncSnapshotReceiver;
typedef struct SSyncTimer SSyncTimer;
typedef struct SSyncHbTimerData SSyncHbTimerData;
-
-extern bool gRaftDetailLog;
+typedef struct SyncSnapshotSend SyncSnapshotSend;
+typedef struct SyncSnapshotRsp SyncSnapshotRsp;
+typedef struct SyncLocalCmd SyncLocalCmd;
+typedef struct SyncAppendEntriesBatch SyncAppendEntriesBatch;
+typedef struct SyncPreSnapshotReply SyncPreSnapshotReply;
+typedef struct SyncHeartbeatReply SyncHeartbeatReply;
+typedef struct SyncHeartbeat SyncHeartbeat;
+typedef struct SyncPreSnapshot SyncPreSnapshot;
+
+typedef struct SRaftId {
+ SyncNodeId addr;
+ SyncGroupId vgId;
+} SRaftId;
typedef struct SSyncHbTimerData {
- SSyncNode* pSyncNode;
+ int64_t syncNodeRid;
SSyncTimer* pTimer;
SRaftId destId;
uint64_t logicClock;
+ int64_t rid;
} SSyncHbTimerData;
typedef struct SSyncTimer {
@@ -78,18 +71,15 @@ typedef struct SSyncTimer {
uint64_t counter;
int32_t timerMS;
SRaftId destId;
- void* pData;
+ int64_t hbDataRid;
} SSyncTimer;
-typedef struct SElectTimer {
+typedef struct SElectTimerParam {
uint64_t logicClock;
SSyncNode* pSyncNode;
+ int64_t executeTime;
void* pData;
-} SElectTimer;
-
-int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId);
-int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
-int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
+} SElectTimerParam;
typedef struct SPeerState {
SyncIndex lastSendIndex;
@@ -165,6 +155,7 @@ typedef struct SSyncNode {
uint64_t electTimerLogicClock;
TAOS_TMR_CALLBACK FpElectTimerCB; // Timer Fp
uint64_t electTimerCounter;
+ SElectTimerParam electTimerParam;
// heartbeat timer
tmr_h pHeartbeatTimer;
@@ -177,18 +168,6 @@ typedef struct SSyncNode {
// peer heartbeat timer
SSyncTimer peerHeartbeatTimerArr[TSDB_MAX_REPLICA];
- // callback
- FpOnPingCb FpOnPing;
- FpOnPingReplyCb FpOnPingReply;
- FpOnClientRequestCb FpOnClientRequest;
- FpOnTimeoutCb FpOnTimeout;
- FpOnRequestVoteCb FpOnRequestVote;
- FpOnRequestVoteReplyCb FpOnRequestVoteReply;
- FpOnAppendEntriesCb FpOnAppendEntries;
- FpOnAppendEntriesReplyCb FpOnAppendEntriesReply;
- FpOnSnapshotCb FpOnSnapshot;
- FpOnSnapshotReplyCb FpOnSnapshotReply;
-
// tools
SSyncRespMgr* pSyncRespMgr;
@@ -211,6 +190,8 @@ typedef struct SSyncNode {
int64_t leaderTime;
int64_t lastReplicateTime;
+ bool isStart;
+
} SSyncNode;
// open/close --------------
@@ -220,27 +201,28 @@ void syncNodeStartStandBy(SSyncNode* pSyncNode);
void syncNodeClose(SSyncNode* pSyncNode);
void syncNodePreClose(SSyncNode* pSyncNode);
int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak);
-
-// option
-bool syncNodeSnapshotEnable(SSyncNode* pSyncNode);
-ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode);
-SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode* pSyncNode, SyncIndex snapshotLastApplyIndex);
-
-// ping --------------
-int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, SyncPing* pMsg);
-int32_t syncNodePingSelf(SSyncNode* pSyncNode);
-int32_t syncNodePingPeers(SSyncNode* pSyncNode);
-int32_t syncNodePingAll(SSyncNode* pSyncNode);
+void syncHbTimerDataFree(SSyncHbTimerData* pData);
+
+// on message ---------------------
+int32_t syncNodeOnTimeout(SSyncNode* ths, const SRpcMsg* pMsg);
+int32_t syncNodeOnClientRequest(SSyncNode* ths, SRpcMsg* pMsg, SyncIndex* pRetIndex);
+int32_t syncNodeOnRequestVote(SSyncNode* pNode, const SRpcMsg* pMsg);
+int32_t syncNodeOnRequestVoteReply(SSyncNode* pNode, const SRpcMsg* pMsg);
+int32_t syncNodeOnAppendEntries(SSyncNode* pNode, const SRpcMsg* pMsg);
+int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pMsg);
+int32_t syncNodeOnSnapshot(SSyncNode* ths, const SRpcMsg* pMsg);
+int32_t syncNodeOnSnapshotReply(SSyncNode* ths, const SRpcMsg* pMsg);
+int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pMsg);
+int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pMsg);
+int32_t syncNodeOnLocalCmd(SSyncNode* ths, const SRpcMsg* pMsg);
// timer control --------------
int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode);
int32_t syncNodeStopPingTimer(SSyncNode* pSyncNode);
-
int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms);
int32_t syncNodeStopElectTimer(SSyncNode* pSyncNode);
int32_t syncNodeRestartElectTimer(SSyncNode* pSyncNode, int32_t ms);
int32_t syncNodeResetElectTimer(SSyncNode* pSyncNode);
-
int32_t syncNodeStartHeartbeatTimer(SSyncNode* pSyncNode);
int32_t syncNodeStopHeartbeatTimer(SSyncNode* pSyncNode);
int32_t syncNodeRestartHeartbeatTimer(SSyncNode* pSyncNode);
@@ -248,15 +230,8 @@ int32_t syncNodeRestartHeartbeatTimer(SSyncNode* pSyncNode);
// utils --------------
int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, SRpcMsg* pMsg);
int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, SRpcMsg* pMsg);
-cJSON* syncNode2Json(const SSyncNode* pSyncNode);
-char* syncNode2Str(const SSyncNode* pSyncNode);
-void syncNodeEventLog(const SSyncNode* pSyncNode, char* str);
-void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str);
-char* syncNode2SimpleStr(const SSyncNode* pSyncNode);
-bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
-void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
SyncIndex syncMinMatchIndex(SSyncNode* pSyncNode);
-char* syncNodePeerState2Str(const SSyncNode* pSyncNode);
+int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHandle** h);
// raft state change --------------
void syncNodeUpdateTerm(SSyncNode* pSyncNode, SyncTerm term);
@@ -264,7 +239,6 @@ void syncNodeUpdateTermWithoutStepDown(SSyncNode* pSyncNode, SyncTerm term);
void syncNodeStepDown(SSyncNode* pSyncNode, SyncTerm newTerm);
void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr);
void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr);
-
void syncNodeCandidate2Leader(SSyncNode* pSyncNode);
void syncNodeFollower2Candidate(SSyncNode* pSyncNode);
void syncNodeLeader2Follower(SSyncNode* pSyncNode);
@@ -275,8 +249,9 @@ void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId);
void syncNodeVoteForSelf(SSyncNode* pSyncNode);
// snapshot --------------
-bool syncNodeHasSnapshot(SSyncNode* pSyncNode);
-void syncNodeMaybeUpdateCommitBySnapshot(SSyncNode* pSyncNode);
+bool syncNodeHasSnapshot(SSyncNode* pSyncNode);
+void syncNodeMaybeUpdateCommitBySnapshot(SSyncNode* pSyncNode);
+int32_t syncNodeStartSnapshot(SSyncNode* pSyncNode, SRaftId* pDestId);
SyncIndex syncNodeGetLastIndex(const SSyncNode* pSyncNode);
SyncTerm syncNodeGetLastTerm(SSyncNode* pSyncNode);
@@ -286,13 +261,10 @@ SyncIndex syncNodeGetPreIndex(SSyncNode* pSyncNode, SyncIndex index);
SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index);
int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex* pPreIndex, SyncTerm* pPreTerm);
-bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg);
int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex, uint64_t flag);
int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex);
int32_t syncNodePreCommit(SSyncNode* ths, SSyncRaftEntry* pEntry, int32_t code);
-int32_t syncNodeUpdateNewConfigIndex(SSyncNode* ths, SSyncCfg* pNewCfg);
-
bool syncNodeInRaftGroup(SSyncNode* ths, SRaftId* pRaftId);
SSyncSnapshotSender* syncNodeGetSnapshotSender(SSyncNode* ths, SRaftId* pDestId);
SSyncTimer* syncNodeGetHbTimer(SSyncNode* ths, SRaftId* pDestId);
@@ -302,61 +274,10 @@ bool syncNodeNeedSendAppendEntries(SSyncNode* ths, const SRaftId* pDestId, const
int32_t syncGetSnapshotMeta(int64_t rid, struct SSnapshotMeta* sMeta);
int32_t syncGetSnapshotMetaByIndex(int64_t rid, SyncIndex snapshotIndex, struct SSnapshotMeta* sMeta);
-bool syncNodeCanChange(SSyncNode* pSyncNode);
-
-int32_t syncNodeLeaderTransfer(SSyncNode* pSyncNode);
-int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeader);
-int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* pEntry);
-
int32_t syncNodeDynamicQuorum(const SSyncNode* pSyncNode);
-
bool syncNodeIsMnode(SSyncNode* pSyncNode);
int32_t syncNodePeerStateInit(SSyncNode* pSyncNode);
-// trace log
-void syncLogRecvTimer(SSyncNode* pSyncNode, const SyncTimeout* pMsg, const char* s);
-void syncLogRecvLocalCmd(SSyncNode* pSyncNode, const SyncLocalCmd* pMsg, const char* s);
-
-void syncLogSendRequestVote(SSyncNode* pSyncNode, const SyncRequestVote* pMsg, const char* s);
-void syncLogRecvRequestVote(SSyncNode* pSyncNode, const SyncRequestVote* pMsg, const char* s);
-
-void syncLogSendRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* pMsg, const char* s);
-void syncLogRecvRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* pMsg, const char* s);
-
-void syncLogSendAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* pMsg, const char* s);
-void syncLogRecvAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* pMsg, const char* s);
-
-void syncLogSendAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntriesBatch* pMsg, const char* s);
-void syncLogRecvAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntriesBatch* pMsg, const char* s);
-
-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);
-
-void syncLogSendSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s);
-void syncLogRecvSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s);
-
-void syncLogSendSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* pMsg, const char* s);
-void syncLogRecvSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* pMsg, const char* s);
-
-void syncLogSendSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s);
-void syncLogRecvSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s);
-
-void syncLogSendSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
-void syncLogRecvSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
-
-// for debug --------------
-void syncNodePrint(SSyncNode* pObj);
-void syncNodePrint2(char* s, SSyncNode* pObj);
-void syncNodeLog(SSyncNode* pObj);
-void syncNodeLog2(char* s, SSyncNode* pObj);
-void syncNodeLog3(char* s, SSyncNode* pObj);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/libs/sync/inc/syncMessage.h b/source/libs/sync/inc/syncMessage.h
index 19079d518dab1ffa71deda47c3499a56ef8544b2..92e7b555a44e5fda4d1012913dcc906f8d876f3c 100644
--- a/source/libs/sync/inc/syncMessage.h
+++ b/source/libs/sync/inc/syncMessage.h
@@ -20,24 +20,241 @@
extern "C" {
#endif
-#include
-#include
-#include
-#include "cJSON.h"
#include "syncInt.h"
-#include "taosdef.h"
-
-// ---------------------------------------------
-cJSON* syncRpcMsg2Json(SRpcMsg* pRpcMsg);
-cJSON* syncRpcUnknownMsg2Json();
-char* syncRpcMsg2Str(SRpcMsg* pRpcMsg);
-
-// for debug ----------------------
-void syncRpcMsgPrint(SRpcMsg* pMsg);
-void syncRpcMsgPrint2(char* s, SRpcMsg* pMsg);
-void syncRpcMsgLog(SRpcMsg* pMsg);
-void syncRpcMsgLog2(char* s, SRpcMsg* pMsg);
-// ---------------------------------------------
+
+typedef enum ESyncTimeoutType {
+ SYNC_TIMEOUT_PING = 100,
+ SYNC_TIMEOUT_ELECTION,
+ SYNC_TIMEOUT_HEARTBEAT,
+} ESyncTimeoutType;
+
+typedef struct SyncTimeout {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ ESyncTimeoutType timeoutType;
+ uint64_t logicClock;
+ int32_t timerMS;
+ void* data; // need optimized
+} SyncTimeout;
+
+typedef struct SyncClientRequest {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType; // TDMT_SYNC_CLIENT_REQUEST
+ uint32_t originalRpcType; // origin RpcMsg msgType
+ uint64_t seqNum;
+ bool isWeak;
+ uint32_t dataLen; // origin RpcMsg.contLen
+ char data[]; // origin RpcMsg.pCont
+} SyncClientRequest;
+
+typedef struct SyncClientRequestReply {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ int32_t errCode;
+ SRaftId leaderHint;
+} SyncClientRequestReply;
+
+typedef struct SyncRequestVote {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+ // private data
+ SyncTerm term;
+ SyncIndex lastLogIndex;
+ SyncTerm lastLogTerm;
+} SyncRequestVote;
+
+typedef struct SyncRequestVoteReply {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+ // private data
+ SyncTerm term;
+ bool voteGranted;
+} SyncRequestVoteReply;
+
+typedef struct SyncAppendEntries {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ // private data
+ SyncTerm term;
+ SyncIndex prevLogIndex;
+ SyncTerm prevLogTerm;
+ SyncIndex commitIndex;
+ SyncTerm privateTerm;
+ uint32_t dataLen;
+ char data[];
+} SyncAppendEntries;
+
+typedef struct SyncAppendEntriesReply {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+ // private data
+ SyncTerm term;
+ SyncTerm privateTerm;
+ bool success;
+ SyncIndex matchIndex;
+ SyncIndex lastSendIndex;
+ int64_t startTime;
+} SyncAppendEntriesReply;
+
+typedef struct SyncHeartbeat {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ // private data
+ SyncTerm term;
+ SyncIndex commitIndex;
+ SyncTerm privateTerm;
+ SyncTerm minMatchIndex;
+} SyncHeartbeat;
+
+typedef struct SyncHeartbeatReply {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ // private data
+ SyncTerm term;
+ SyncTerm privateTerm;
+ int64_t startTime;
+} SyncHeartbeatReply;
+
+typedef struct SyncPreSnapshot {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ // private data
+ SyncTerm term;
+} SyncPreSnapshot;
+
+typedef struct SyncPreSnapshotReply {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ // private data
+ SyncTerm term;
+ SyncIndex snapStart;
+} SyncPreSnapshotReply;
+
+typedef struct SyncApplyMsg {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType; // user SyncApplyMsg msgType
+ uint32_t originalRpcType; // user RpcMsg msgType
+ SFsmCbMeta fsmMeta;
+ uint32_t dataLen; // user RpcMsg.contLen
+ char data[]; // user RpcMsg.pCont
+} SyncApplyMsg;
+
+typedef struct SyncSnapshotSend {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ SyncTerm term;
+ SyncIndex beginIndex; // snapshot.beginIndex
+ SyncIndex lastIndex; // snapshot.lastIndex
+ SyncTerm lastTerm; // snapshot.lastTerm
+ SyncIndex lastConfigIndex; // snapshot.lastConfigIndex
+ SSyncCfg lastConfig;
+ int64_t startTime;
+ int32_t seq;
+ uint32_t dataLen;
+ char data[];
+} SyncSnapshotSend;
+
+typedef struct SyncSnapshotRsp {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ SyncTerm term;
+ SyncIndex lastIndex;
+ SyncTerm lastTerm;
+ int64_t startTime;
+ int32_t ack;
+ int32_t code;
+ SyncIndex snapBeginIndex; // when ack = SYNC_SNAPSHOT_SEQ_BEGIN, it's valid
+} SyncSnapshotRsp;
+
+typedef struct SyncLeaderTransfer {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ /*
+ SRaftId srcId;
+ SRaftId destId;
+ */
+ SNodeInfo newNodeInfo;
+ SRaftId newLeaderId;
+} SyncLeaderTransfer;
+
+typedef enum {
+ SYNC_LOCAL_CMD_STEP_DOWN = 100,
+ SYNC_LOCAL_CMD_FOLLOWER_CMT,
+} ESyncLocalCmd;
+
+typedef struct SyncLocalCmd {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ int32_t cmd;
+ SyncTerm sdNewTerm; // step down new term
+ SyncIndex fcIndex; // follower commit index
+} SyncLocalCmd;
+
+int32_t syncBuildTimeout(SRpcMsg* pMsg, ESyncTimeoutType ttype, uint64_t logicClock, int32_t ms, SSyncNode* pNode);
+int32_t syncBuildClientRequest(SRpcMsg* pMsg, const SRpcMsg* pOriginal, uint64_t seq, bool isWeak, int32_t vgId);
+int32_t syncBuildClientRequestFromNoopEntry(SRpcMsg* pMsg, const SSyncRaftEntry* pEntry, int32_t vgId);
+int32_t syncBuildRequestVote(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildRequestVoteReply(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildAppendEntries(SRpcMsg* pMsg, int32_t dataLen, int32_t vgId);
+int32_t syncBuildAppendEntriesReply(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildHeartbeat(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildHeartbeatReply(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildPreSnapshot(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildPreSnapshotReply(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildApplyMsg(SRpcMsg* pMsg, const SRpcMsg* pOriginal, int32_t vgId, SFsmCbMeta* pMeta);
+int32_t syncBuildSnapshotSend(SRpcMsg* pMsg, int32_t dataLen, int32_t vgId);
+int32_t syncBuildSnapshotSendRsp(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildLeaderTransfer(SRpcMsg* pMsg, int32_t vgId);
+int32_t syncBuildLocalCmd(SRpcMsg* pMsg, int32_t vgId);
+
+const char* syncTimerTypeStr(ESyncTimeoutType timerType);
+const char* syncLocalCmdGetStr(ESyncLocalCmd cmd);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncRaftCfg.h b/source/libs/sync/inc/syncRaftCfg.h
index e193e16c02d3b811216bed03b1ad17899ebe04da..823983e732c88baaf8ef17ad398902ccf71346d8 100644
--- a/source/libs/sync/inc/syncRaftCfg.h
+++ b/source/libs/sync/inc/syncRaftCfg.h
@@ -20,18 +20,11 @@
extern "C" {
#endif
-#include
-#include
-#include
-#include "cJSON.h"
#include "syncInt.h"
-#include "taosdef.h"
-
-#define CONFIG_FILE_LEN 2048
+#define CONFIG_FILE_LEN 2048
#define MAX_CONFIG_INDEX_COUNT 256
-// SRaftCfgIndex ------------------------------------------
typedef struct SRaftCfgIndex {
TdFilePtr pFile;
char path[TSDB_FILENAME_LEN * 2];
@@ -45,15 +38,12 @@ int32_t raftCfgIndexClose(SRaftCfgIndex *pRaftCfgIndex);
int32_t raftCfgIndexPersist(SRaftCfgIndex *pRaftCfgIndex);
int32_t raftCfgIndexAddConfigIndex(SRaftCfgIndex *pRaftCfgIndex, SyncIndex configIndex);
-cJSON * raftCfgIndex2Json(SRaftCfgIndex *pRaftCfgIndex);
-char * raftCfgIndex2Str(SRaftCfgIndex *pRaftCfgIndex);
+cJSON *raftCfgIndex2Json(SRaftCfgIndex *pRaftCfgIndex);
+char *raftCfgIndex2Str(SRaftCfgIndex *pRaftCfgIndex);
int32_t raftCfgIndexFromJson(const cJSON *pRoot, SRaftCfgIndex *pRaftCfgIndex);
int32_t raftCfgIndexFromStr(const char *s, SRaftCfgIndex *pRaftCfgIndex);
-
int32_t raftCfgIndexCreateFile(const char *path);
-// ---------------------------------------------------------
-
typedef struct SRaftCfg {
SSyncCfg cfg;
TdFilePtr pFile;
@@ -73,14 +63,12 @@ int32_t raftCfgClose(SRaftCfg *pRaftCfg);
int32_t raftCfgPersist(SRaftCfg *pRaftCfg);
int32_t raftCfgAddConfigIndex(SRaftCfg *pRaftCfg, SyncIndex configIndex);
-cJSON * syncCfg2Json(SSyncCfg *pSyncCfg);
-char * syncCfg2Str(SSyncCfg *pSyncCfg);
-char * syncCfg2SimpleStr(SSyncCfg *pSyncCfg);
+void syncCfg2SimpleStr(const SSyncCfg *pCfg, char *str, int32_t bufLen);
+cJSON *syncCfg2Json(SSyncCfg *pSyncCfg);
int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg);
-int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg);
-cJSON * raftCfg2Json(SRaftCfg *pRaftCfg);
-char * raftCfg2Str(SRaftCfg *pRaftCfg);
+cJSON *raftCfg2Json(SRaftCfg *pRaftCfg);
+char *raftCfg2Str(SRaftCfg *pRaftCfg);
int32_t raftCfgFromJson(const cJSON *pRoot, SRaftCfg *pRaftCfg);
int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg);
@@ -93,23 +81,6 @@ typedef struct SRaftCfgMeta {
int32_t raftCfgCreateFile(SSyncCfg *pCfg, SRaftCfgMeta meta, const char *path);
-// for debug ----------------------
-void syncCfgPrint(SSyncCfg *pCfg);
-void syncCfgPrint2(char *s, SSyncCfg *pCfg);
-void syncCfgLog(SSyncCfg *pCfg);
-void syncCfgLog2(char *s, SSyncCfg *pCfg);
-void syncCfgLog3(char *s, SSyncCfg *pCfg);
-
-void raftCfgPrint(SRaftCfg *pCfg);
-void raftCfgPrint2(char *s, SRaftCfg *pCfg);
-void raftCfgLog(SRaftCfg *pCfg);
-void raftCfgLog2(char *s, SRaftCfg *pCfg);
-
-void raftCfgIndexPrint(SRaftCfgIndex *pCfg);
-void raftCfgIndexPrint2(char *s, SRaftCfgIndex *pCfg);
-void raftCfgIndexLog(SRaftCfgIndex *pCfg);
-void raftCfgIndexLog2(char *s, SRaftCfgIndex *pCfg);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/libs/sync/inc/syncRaftEntry.h b/source/libs/sync/inc/syncRaftEntry.h
index bab1dcc661a90c0d9747d37699d64b747526495d..2a73b95e4db7eba0449cdf6d1ae4c1dba2108318 100644
--- a/source/libs/sync/inc/syncRaftEntry.h
+++ b/source/libs/sync/inc/syncRaftEntry.h
@@ -20,13 +20,8 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
#include "syncMessage.h"
-#include "taosdef.h"
-#include "tref.h"
#include "tskiplist.h"
typedef struct SSyncRaftEntry {
@@ -42,25 +37,14 @@ typedef struct SSyncRaftEntry {
char data[]; // origin RpcMsg.pCont
} SSyncRaftEntry;
-SSyncRaftEntry* syncEntryBuild(uint32_t dataLen);
-SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index); // step 4
-SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index);
-SSyncRaftEntry* syncEntryBuild4(SRpcMsg* pOriginalMsg, SyncTerm term, SyncIndex index);
+SSyncRaftEntry* syncEntryBuild(int32_t dataLen);
+SSyncRaftEntry* syncEntryBuildFromClientRequest(const SyncClientRequest* pMsg, SyncTerm term, SyncIndex index);
+SSyncRaftEntry* syncEntryBuildFromRpcMsg(const SRpcMsg* pMsg, SyncTerm term, SyncIndex index);
+SSyncRaftEntry* syncEntryBuildFromAppendEntries(const SyncAppendEntries* pMsg);
SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId);
void syncEntryDestory(SSyncRaftEntry* pEntry);
-char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len); // step 5
-SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len); // step 6
-cJSON* syncEntry2Json(const SSyncRaftEntry* pEntry);
-char* syncEntry2Str(const SSyncRaftEntry* pEntry);
void syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg); // step 7
-// for debug ----------------------
-void syncEntryPrint(const SSyncRaftEntry* pObj);
-void syncEntryPrint2(char* s, const SSyncRaftEntry* pObj);
-void syncEntryLog(const SSyncRaftEntry* pObj);
-void syncEntryLog2(char* s, const SSyncRaftEntry* pObj);
-
-//-----------------------------------
typedef struct SRaftEntryHashCache {
SHashObj* pEntryHash;
int32_t maxCount;
@@ -78,14 +62,6 @@ int32_t raftCacheDelEntry(struct SRaftEntryHashCache* pCache, SyncI
int32_t raftCacheGetAndDel(struct SRaftEntryHashCache* pCache, SyncIndex index, SSyncRaftEntry** ppEntry);
int32_t raftCacheClear(struct SRaftEntryHashCache* pCache);
-cJSON* raftCache2Json(SRaftEntryHashCache* pObj);
-char* raftCache2Str(SRaftEntryHashCache* pObj);
-void raftCachePrint(SRaftEntryHashCache* pObj);
-void raftCachePrint2(char* s, SRaftEntryHashCache* pObj);
-void raftCacheLog(SRaftEntryHashCache* pObj);
-void raftCacheLog2(char* s, SRaftEntryHashCache* pObj);
-
-//-----------------------------------
typedef struct SRaftEntryCache {
SSkipList* pSkipList;
int32_t maxCount;
@@ -102,13 +78,6 @@ int32_t raftEntryCacheGetEntry(struct SRaftEntryCache* pCache, SyncInde
int32_t raftEntryCacheGetEntryP(struct SRaftEntryCache* pCache, SyncIndex index, SSyncRaftEntry** ppEntry);
int32_t raftEntryCacheClear(struct SRaftEntryCache* pCache, int32_t count);
-cJSON* raftEntryCache2Json(SRaftEntryCache* pObj);
-char* raftEntryCache2Str(SRaftEntryCache* pObj);
-void raftEntryCachePrint(SRaftEntryCache* pObj);
-void raftEntryCachePrint2(char* s, SRaftEntryCache* pObj);
-void raftEntryCacheLog(SRaftEntryCache* pObj);
-void raftEntryCacheLog2(char* s, SRaftEntryCache* pObj);
-
#ifdef __cplusplus
}
#endif
diff --git a/source/libs/sync/inc/syncRaftLog.h b/source/libs/sync/inc/syncRaftLog.h
index ff59189a9d6a96566e3246a5ed8fa25ca819e440..de8bd81b30b0e466451ff43229a58f8366e91622 100644
--- a/source/libs/sync/inc/syncRaftLog.h
+++ b/source/libs/sync/inc/syncRaftLog.h
@@ -20,12 +20,8 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
#include "syncRaftEntry.h"
-#include "taosdef.h"
#include "wal.h"
typedef struct SSyncLogStoreData {
@@ -40,25 +36,18 @@ typedef struct SSyncLogStoreData {
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode);
void logStoreDestory(SSyncLogStore* pLogStore);
-cJSON* logStore2Json(SSyncLogStore* pLogStore);
-char* logStore2Str(SSyncLogStore* pLogStore);
-cJSON* logStoreSimple2Json(SSyncLogStore* pLogStore);
-char* logStoreSimple2Str(SSyncLogStore* pLogStore);
SyncIndex logStoreFirstIndex(SSyncLogStore* pLogStore);
-
SyncIndex logStoreWalCommitVer(SSyncLogStore* pLogStore);
-// for debug
-void logStorePrint(SSyncLogStore* pLogStore);
-void logStorePrint2(char* s, SSyncLogStore* pLogStore);
-void logStoreLog(SSyncLogStore* pLogStore);
-void logStoreLog2(char* s, SSyncLogStore* pLogStore);
-
-void logStoreSimplePrint(SSyncLogStore* pLogStore);
-void logStoreSimplePrint2(char* s, SSyncLogStore* pLogStore);
-void logStoreSimpleLog(SSyncLogStore* pLogStore);
-void logStoreSimpleLog2(char* s, SSyncLogStore* pLogStore);
+SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
+bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
+SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore);
+SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
+int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
+SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
+SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
+int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncRaftStore.h b/source/libs/sync/inc/syncRaftStore.h
index ac298c537510e77982bc2edc1d6f026dc16e7f95..bb6405f6b2844476273c3ecf428e159125b0688c 100644
--- a/source/libs/sync/inc/syncRaftStore.h
+++ b/source/libs/sync/inc/syncRaftStore.h
@@ -20,16 +20,13 @@
extern "C" {
#endif
-#include
-#include
-#include
-#include "cJSON.h"
#include "syncInt.h"
-#include "taosdef.h"
#define RAFT_STORE_BLOCK_SIZE 512
#define RAFT_STORE_PATH_LEN (TSDB_FILENAME_LEN * 2)
+#define EMPTY_RAFT_ID ((SRaftId){.addr = 0, .vgId = 0})
+
typedef struct SRaftStore {
SyncTerm currentTerm;
SRaftId voteFor;
@@ -43,20 +40,11 @@ int32_t raftStorePersist(SRaftStore *pRaftStore);
int32_t raftStoreSerialize(SRaftStore *pRaftStore, char *buf, size_t len);
int32_t raftStoreDeserialize(SRaftStore *pRaftStore, char *buf, size_t len);
-bool raftStoreHasVoted(SRaftStore *pRaftStore);
-void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId);
-void raftStoreClearVote(SRaftStore *pRaftStore);
-void raftStoreNextTerm(SRaftStore *pRaftStore);
-void raftStoreSetTerm(SRaftStore *pRaftStore, SyncTerm term);
-int32_t raftStoreFromJson(SRaftStore *pRaftStore, cJSON *pJson);
-cJSON *raftStore2Json(SRaftStore *pRaftStore);
-char *raftStore2Str(SRaftStore *pRaftStore);
-
-// for debug -------------------
-void raftStorePrint(SRaftStore *pObj);
-void raftStorePrint2(char *s, SRaftStore *pObj);
-void raftStoreLog(SRaftStore *pObj);
-void raftStoreLog2(char *s, SRaftStore *pObj);
+bool raftStoreHasVoted(SRaftStore *pRaftStore);
+void raftStoreVote(SRaftStore *pRaftStore, SRaftId *pRaftId);
+void raftStoreClearVote(SRaftStore *pRaftStore);
+void raftStoreNextTerm(SRaftStore *pRaftStore);
+void raftStoreSetTerm(SRaftStore *pRaftStore, SyncTerm term);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncReplication.h b/source/libs/sync/inc/syncReplication.h
index 4f15a45cec7dbd3dfa03189980629bc6f9804660..7da610a9edf626ea6de28234ad206ab1c712ec86 100644
--- a/source/libs/sync/inc/syncReplication.h
+++ b/source/libs/sync/inc/syncReplication.h
@@ -20,11 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "taosdef.h"
// TLA+ Spec
// AppendEntries(i, j) ==
@@ -52,13 +48,10 @@ extern "C" {
// /\ UNCHANGED <>
int32_t syncNodeHeartbeatPeers(SSyncNode* pSyncNode);
-int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* pDestId, const SyncHeartbeat* pMsg);
+int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* pDestId, SRpcMsg* pMsg);
int32_t syncNodeReplicate(SSyncNode* pSyncNode);
-int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId);
-
-int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* pDestId, const SyncAppendEntries* pMsg);
-int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* pDestId, const SyncAppendEntries* pMsg);
+int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncRequestVote.h b/source/libs/sync/inc/syncRequestVote.h
index 73b4a0efaeab6b72153ff1193d4951ee9cb2e2ea..7e7c5f7e16ea96baf93010f501b5c55e1c1ddc92 100644
--- a/source/libs/sync/inc/syncRequestVote.h
+++ b/source/libs/sync/inc/syncRequestVote.h
@@ -20,12 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
// TLA+ Spec
// HandleRequestVoteRequest(i, j, m) ==
@@ -49,7 +44,7 @@ extern "C" {
// m)
// /\ UNCHANGED <>
//
-int32_t syncNodeOnRequestVote(SSyncNode* ths, SyncRequestVote* pMsg);
+int32_t syncNodeOnRequestVote(SSyncNode* pNode, const SRpcMsg* pMsg);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncRequestVoteReply.h b/source/libs/sync/inc/syncRequestVoteReply.h
index 6bef18405cc7780db60b04c1cf32161f20c2a42c..5d46365280d7dda9eb8df1d0af11065d846d1c8e 100644
--- a/source/libs/sync/inc/syncRequestVoteReply.h
+++ b/source/libs/sync/inc/syncRequestVoteReply.h
@@ -20,12 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
// TLA+ Spec
// HandleRequestVoteResponse(i, j, m) ==
@@ -44,7 +39,7 @@ extern "C" {
// /\ Discard(m)
// /\ UNCHANGED <>
//
-int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, SyncRequestVoteReply* pMsg);
+int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, const SRpcMsg* pMsg);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncRespMgr.h b/source/libs/sync/inc/syncRespMgr.h
index 22e1005e5c495c6f4f17c452418d8b028d0cfffa..1d41c0a85f466afaa5b3781dfb2371c7cc0d71ad 100644
--- a/source/libs/sync/inc/syncRespMgr.h
+++ b/source/libs/sync/inc/syncRespMgr.h
@@ -20,11 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "taosdef.h"
typedef struct SRespStub {
SRpcMsg rpcMsg;
@@ -41,13 +37,12 @@ typedef struct SSyncRespMgr {
SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl);
void syncRespMgrDestroy(SSyncRespMgr *pObj);
-int64_t syncRespMgrAdd(SSyncRespMgr *pObj, SRespStub *pStub);
-int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t index);
-int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t index, SRespStub *pStub);
-int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t index, SRespStub *pStub);
+uint64_t syncRespMgrAdd(SSyncRespMgr *pObj, const SRespStub *pStub);
+int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t seq);
+int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t seq, SRespStub *pStub);
+int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t seq, SRpcHandleInfo *pInfo);
void syncRespClean(SSyncRespMgr *pObj);
void syncRespCleanRsp(SSyncRespMgr *pObj);
-void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncSnapshot.h b/source/libs/sync/inc/syncSnapshot.h
index 760fc8ac733e37d9fe78647d5aaf5ea3d19c52a1..7b8e768391d82e5545a3d191785cff54dc405220 100644
--- a/source/libs/sync/inc/syncSnapshot.h
+++ b/source/libs/sync/inc/syncSnapshot.h
@@ -20,13 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
-#include "cJSON.h"
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
#define SYNC_SNAPSHOT_SEQ_INVALID -2
#define SYNC_SNAPSHOT_SEQ_FORCE_CLOSE -3
@@ -36,7 +30,6 @@ extern "C" {
#define SYNC_SNAPSHOT_RETRY_MS 5000
-//---------------------------------------------------
typedef struct SSyncSnapshotSender {
bool start;
int32_t seq;
@@ -50,6 +43,7 @@ typedef struct SSyncSnapshotSender {
int64_t sendingMS;
SyncTerm term;
int64_t startTime;
+ int64_t endTime;
bool finish;
// init when create
@@ -65,26 +59,21 @@ int32_t snapshotSenderStop(SSyncSnapshotSender *pSender, bool finis
int32_t snapshotSend(SSyncSnapshotSender *pSender);
int32_t snapshotReSend(SSyncSnapshotSender *pSender);
-cJSON *snapshotSender2Json(SSyncSnapshotSender *pSender);
-char *snapshotSender2Str(SSyncSnapshotSender *pSender);
-char *snapshotSender2SimpleStr(SSyncSnapshotSender *pSender, char *event);
-
-int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId);
-
-//---------------------------------------------------
typedef struct SSyncSnapshotReceiver {
- bool start;
- int32_t ack;
+ // update when pre snapshot
+ bool start;
+ int32_t ack;
+ SyncTerm term;
+ SRaftId fromId;
+ int64_t startTime;
+
+ // update when begin
void *pWriter;
- SyncTerm term;
SSnapshotParam snapshotParam;
SSnapshot snapshot;
- SRaftId fromId;
- int64_t startTime;
// init when create
SSyncNode *pSyncNode;
-
} SSyncSnapshotReceiver;
SSyncSnapshotReceiver *snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId fromId);
@@ -94,14 +83,11 @@ int32_t snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver);
bool snapshotReceiverIsStart(SSyncSnapshotReceiver *pReceiver);
void snapshotReceiverForceStop(SSyncSnapshotReceiver *pReceiver);
-cJSON *snapshotReceiver2Json(SSyncSnapshotReceiver *pReceiver);
-char *snapshotReceiver2Str(SSyncSnapshotReceiver *pReceiver);
-char *snapshotReceiver2SimpleStr(SSyncSnapshotReceiver *pReceiver, char *event);
-
-//---------------------------------------------------
// on message
-int32_t syncNodeOnSnapshot(SSyncNode *ths, SyncSnapshotSend *pMsg);
-int32_t syncNodeOnSnapshotReply(SSyncNode *ths, SyncSnapshotRsp *pMsg);
+int32_t syncNodeOnSnapshot(SSyncNode *ths, const SRpcMsg *pMsg);
+int32_t syncNodeOnSnapshotReply(SSyncNode *ths, const SRpcMsg *pMsg);
+
+// start
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncTimeout.h b/source/libs/sync/inc/syncTimeout.h
index 112a3d861024f70ce811f8f77487ce7550534db1..66f6e6ee181201a75719cb164d15cfd1dcfb057b 100644
--- a/source/libs/sync/inc/syncTimeout.h
+++ b/source/libs/sync/inc/syncTimeout.h
@@ -20,12 +20,7 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
// TLA+ Spec
// Timeout(i) == /\ state[i] \in {Follower, Candidate}
@@ -39,7 +34,7 @@ extern "C" {
// /\ voterLog' = [voterLog EXCEPT ![i] = [j \in {} |-> <<>>]]
// /\ UNCHANGED <>
//
-int32_t syncNodeOnTimer(SSyncNode* ths, SyncTimeout* pMsg);
+int32_t syncNodeOnTimeout(SSyncNode* ths, const SRpcMsg* pMsg);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncUtil.h b/source/libs/sync/inc/syncUtil.h
index ac8dd0928c4ecdfb8f3359681319d3aa5c6b797e..b7ee320aa52a84e5f6a4557b2d8bee4188a320e8 100644
--- a/source/libs/sync/inc/syncUtil.h
+++ b/source/libs/sync/inc/syncUtil.h
@@ -20,48 +20,106 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "taosdef.h"
+#include "tlog.h"
+
+// clang-format off
+
+#define sFatal(...) if (sDebugFlag & DEBUG_FATAL) { taosPrintLog("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }
+#define sError(...) if (sDebugFlag & DEBUG_ERROR) { taosPrintLog("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }
+#define sWarn(...) if (sDebugFlag & DEBUG_WARN) { taosPrintLog("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }
+#define sInfo(...) if (sDebugFlag & DEBUG_INFO) { taosPrintLog("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }
+#define sDebug(...) if (sDebugFlag & DEBUG_DEBUG) { taosPrintLog("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }
+#define sTrace(...) if (sDebugFlag & DEBUG_TRACE) { taosPrintLog("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }
+
+#define sLFatal(...) if (sDebugFlag & DEBUG_FATAL) { taosPrintLongString("SYN FATAL ", DEBUG_FATAL, 255, __VA_ARGS__); }
+#define sLError(...) if (sDebugFlag & DEBUG_ERROR) { taosPrintLongString("SYN ERROR ", DEBUG_ERROR, 255, __VA_ARGS__); }
+#define sLWarn(...) if (sDebugFlag & DEBUG_WARN) { taosPrintLongString("SYN WARN ", DEBUG_WARN, 255, __VA_ARGS__); }
+#define sLInfo(...) if (sDebugFlag & DEBUG_INFO) { taosPrintLongString("SYN ", DEBUG_INFO, 255, __VA_ARGS__); }
+#define sLDebug(...) if (sDebugFlag & DEBUG_DEBUG) { taosPrintLongString("SYN ", DEBUG_DEBUG, sDebugFlag, __VA_ARGS__); }
+#define sLTrace(...) if (sDebugFlag & DEBUG_TRACE) { taosPrintLongString("SYN ", DEBUG_TRACE, sDebugFlag, __VA_ARGS__); }
+
+#define sNFatal(pNode, ...) if (sDebugFlag & DEBUG_FATAL) { syncPrintNodeLog("SYN FATAL ", DEBUG_FATAL, 255, pNode, __VA_ARGS__); }
+#define sNError(pNode, ...) if (sDebugFlag & DEBUG_ERROR) { syncPrintNodeLog("SYN ERROR ", DEBUG_ERROR, 255, pNode, __VA_ARGS__); }
+#define sNWarn(pNode, ...) if (sDebugFlag & DEBUG_WARN) { syncPrintNodeLog("SYN WARN ", DEBUG_WARN, 255, pNode, __VA_ARGS__); }
+#define sNInfo(pNode, ...) if (sDebugFlag & DEBUG_INFO) { syncPrintNodeLog("SYN ", DEBUG_INFO, 255, pNode, __VA_ARGS__); }
+#define sNDebug(pNode, ...) if (sDebugFlag & DEBUG_DEBUG) { syncPrintNodeLog("SYN ", DEBUG_DEBUG, sDebugFlag, pNode, __VA_ARGS__); }
+#define sNTrace(pNode, ...) if (sDebugFlag & DEBUG_TRACE) { syncPrintNodeLog("SYN ", DEBUG_TRACE, sDebugFlag, pNode, __VA_ARGS__); }
+
+#define sSFatal(pSender, ...) if (sDebugFlag & DEBUG_FATAL) { syncPrintSnapshotSenderLog("SYN FATAL ", DEBUG_FATAL, 255, pSender, __VA_ARGS__); }
+#define sSError(pSender, ...) if (sDebugFlag & DEBUG_ERROR) { syncPrintSnapshotSenderLog("SYN ERROR ", DEBUG_ERROR, 255, pSender, __VA_ARGS__); }
+#define sSWarn(pSender, ...) if (sDebugFlag & DEBUG_WARN) { syncPrintSnapshotSenderLog("SYN WARN ", DEBUG_WARN, 255, pSender, __VA_ARGS__); }
+#define sSInfo(pSender, ...) if (sDebugFlag & DEBUG_INFO) { syncPrintSnapshotSenderLog("SYN ", DEBUG_INFO, 255, pSender, __VA_ARGS__); }
+#define sSDebug(pSender, ...) if (sDebugFlag & DEBUG_DEBUG) { syncPrintSnapshotSenderLog("SYN ", DEBUG_DEBUG, sDebugFlag, pSender, __VA_ARGS__); }
+#define sSTrace(pSender, ...) if (sDebugFlag & DEBUG_TRACE) { syncPrintSnapshotSenderLog("SYN ", DEBUG_TRACE, sDebugFlag, pSender, __VA_ARGS__); }
+
+#define sRFatal(pReceiver, ...) if (sDebugFlag & DEBUG_FATAL) { syncPrintSnapshotReceiverLog("SYN FATAL ", DEBUG_FATAL, 255, pReceiver, __VA_ARGS__); }
+#define sRError(pReceiver, ...) if (sDebugFlag & DEBUG_ERROR) { syncPrintSnapshotReceiverLog("SYN ERROR ", DEBUG_ERROR, 255, pReceiver, __VA_ARGS__); }
+#define sRWarn(pReceiver, ...) if (sDebugFlag & DEBUG_WARN) { syncPrintSnapshotReceiverLog("SYN WARN ", DEBUG_WARN, 255, pReceiver, __VA_ARGS__); }
+#define sRInfo(pReceiver, ...) if (sDebugFlag & DEBUG_INFO) { syncPrintSnapshotReceiverLog("SYN ", DEBUG_INFO, 255, pReceiver, __VA_ARGS__); }
+#define sRDebug(pReceiver, ...) if (sDebugFlag & DEBUG_DEBUG) { syncPrintSnapshotReceiverLog("SYN ", DEBUG_DEBUG, sDebugFlag, pReceiver, __VA_ARGS__); }
+#define sRTrace(pReceiver, ...) if (sDebugFlag & DEBUG_TRACE) { syncPrintSnapshotReceiverLog("SYN ", DEBUG_TRACE, sDebugFlag, pReceiver, __VA_ARGS__); }
+
+// clang-format on
-// ---- encode / decode
uint64_t syncUtilAddr2U64(const char* host, uint16_t port);
-void syncUtilU642Addr(uint64_t u64, char* host, size_t len, uint16_t* port);
-void syncUtilnodeInfo2EpSet(const SNodeInfo* pNodeInfo, SEpSet* pEpSet);
-void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet);
-bool syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId);
+void syncUtilU642Addr(uint64_t u64, char* host, int64_t len, uint16_t* port);
+void syncUtilNodeInfo2EpSet(const SNodeInfo* pInfo, SEpSet* pEpSet);
+void syncUtilRaftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet);
+bool syncUtilNodeInfo2RaftId(const SNodeInfo* pInfo, SyncGroupId vgId, SRaftId* raftId);
bool syncUtilSameId(const SRaftId* pId1, const SRaftId* pId2);
bool syncUtilEmptyId(const SRaftId* pId);
-// ---- SSyncBuffer ----
-void syncUtilbufBuild(SSyncBuffer* syncBuf, size_t len);
-void syncUtilbufDestroy(SSyncBuffer* syncBuf);
-void syncUtilbufCopy(const SSyncBuffer* src, SSyncBuffer* dest);
-void syncUtilbufCopyDeep(const SSyncBuffer* src, SSyncBuffer* dest);
-
-// ---- misc ----
-int32_t syncUtilRand(int32_t max);
int32_t syncUtilElectRandomMS(int32_t min, int32_t max);
int32_t syncUtilQuorum(int32_t replicaNum);
-cJSON* syncUtilNodeInfo2Json(const SNodeInfo* p);
cJSON* syncUtilRaftId2Json(const SRaftId* p);
-char* syncUtilRaftId2Str(const SRaftId* p);
const char* syncStr(ESyncState state);
-bool syncUtilCanPrint(char c);
-char* syncUtilprintBin(char* ptr, uint32_t len);
-char* syncUtilprintBin2(char* ptr, uint32_t len);
-SyncIndex syncUtilMinIndex(SyncIndex a, SyncIndex b);
-SyncIndex syncUtilMaxIndex(SyncIndex a, SyncIndex b);
+char* syncUtilPrintBin(char* ptr, uint32_t len);
+char* syncUtilPrintBin2(char* ptr, uint32_t len);
void syncUtilMsgHtoN(void* msg);
void syncUtilMsgNtoH(void* msg);
-bool syncUtilIsData(tmsg_t msgType);
bool syncUtilUserPreCommit(tmsg_t msgType);
bool syncUtilUserCommit(tmsg_t msgType);
bool syncUtilUserRollback(tmsg_t msgType);
-void syncUtilJson2Line(char* jsonStr);
+
+void syncPrintNodeLog(const char* flags, ELogLevel level, int32_t dflag, SSyncNode* pNode, const char* format, ...);
+void syncPrintSnapshotSenderLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotSender* pSender,
+ const char* format, ...);
+void syncPrintSnapshotReceiverLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotReceiver* pReceiver,
+ const char* format, ...);
+
+void syncLogRecvTimer(SSyncNode* pSyncNode, const SyncTimeout* pMsg, const char* s);
+void syncLogRecvLocalCmd(SSyncNode* pSyncNode, const SyncLocalCmd* pMsg, const char* s);
+
+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);
+
+void syncLogSendSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s);
+void syncLogRecvSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s);
+
+void syncLogSendSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* pMsg, const char* s);
+void syncLogRecvSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* pMsg, const char* s);
+
+void syncLogSendSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s);
+void syncLogRecvSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s);
+
+void syncLogSendSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
+void syncLogRecvSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s);
+
+void syncLogRecvAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* pMsg, const char* s);
+void syncLogSendAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* pMsg, const char* s);
+
+void syncLogRecvRequestVote(SSyncNode* pSyncNode, const SyncRequestVote* pMsg, const char* s);
+void syncLogSendRequestVote(SSyncNode* pNode, const SyncRequestVote* pMsg, const char* s);
+
+void syncLogRecvRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* pMsg, const char* s);
+void syncLogSendRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* pMsg, const char* s);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/inc/syncVoteMgr.h b/source/libs/sync/inc/syncVoteMgr.h
index aa245ce32c20a02ea450581daed949076704e446..066a4dd76faafaaf822cd7f770f50acaef1d0637 100644
--- a/source/libs/sync/inc/syncVoteMgr.h
+++ b/source/libs/sync/inc/syncVoteMgr.h
@@ -20,15 +20,8 @@
extern "C" {
#endif
-#include
-#include
-#include
#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
-#include "taosdef.h"
-// SVotesGranted -----------------------------
typedef struct SVotesGranted {
SRaftId (*replicas)[TSDB_MAX_REPLICA];
bool isGranted[TSDB_MAX_REPLICA];
@@ -46,16 +39,7 @@ void voteGrantedUpdate(SVotesGranted *pVotesGranted, SSyncNode *pSyncN
bool voteGrantedMajority(SVotesGranted *pVotesGranted);
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg);
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term);
-cJSON *voteGranted2Json(SVotesGranted *pVotesGranted);
-char *voteGranted2Str(SVotesGranted *pVotesGranted);
-// for debug -------------------
-void voteGrantedPrint(SVotesGranted *pObj);
-void voteGrantedPrint2(char *s, SVotesGranted *pObj);
-void voteGrantedLog(SVotesGranted *pObj);
-void voteGrantedLog2(char *s, SVotesGranted *pObj);
-
-// SVotesRespond -----------------------------
typedef struct SVotesRespond {
SRaftId (*replicas)[TSDB_MAX_REPLICA];
bool isRespond[TSDB_MAX_REPLICA];
@@ -70,14 +54,6 @@ void votesRespondUpdate(SVotesRespond *pVotesRespond, SSyncNode *pSync
bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId);
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg);
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term);
-cJSON *votesRespond2Json(SVotesRespond *pVotesRespond);
-char *votesRespond2Str(SVotesRespond *pVotesRespond);
-
-// for debug -------------------
-void votesRespondPrint(SVotesRespond *pObj);
-void votesRespondPrint2(char *s, SVotesRespond *pObj);
-void votesRespondLog(SVotesRespond *pObj);
-void votesRespondLog2(char *s, SVotesRespond *pObj);
#ifdef __cplusplus
}
diff --git a/source/libs/sync/src/syncAppendEntries.c b/source/libs/sync/src/syncAppendEntries.c
index f0e296d8725931b985b3fa893605e40a24fc39a9..df2ccee5461a19db57c51cdc0b367a0d72a8c2a8 100644
--- a/source/libs/sync/src/syncAppendEntries.c
+++ b/source/libs/sync/src/syncAppendEntries.c
@@ -13,15 +13,12 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncAppendEntries.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
+#include "syncMessage.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
-#include "syncSnapshot.h"
#include "syncUtil.h"
-#include "syncVoteMgr.h"
-#include "wal.h"
// TLA+ Spec
// HandleAppendEntriesRequest(i, j, m) ==
@@ -91,7 +88,7 @@
int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) {
if (ths->state != TAOS_SYNC_STATE_FOLLOWER) {
- syncNodeEventLog(ths, "can not do follower commit");
+ sNTrace(ths, "can not do follower commit");
return -1;
}
@@ -106,11 +103,7 @@ int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) {
SyncIndex commitBegin = ths->commitIndex;
SyncIndex commitEnd = snapshot.lastApplyIndex;
ths->commitIndex = snapshot.lastApplyIndex;
-
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin,
- commitEnd);
- syncNodeEventLog(ths, eventLog);
+ sNTrace(ths, "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin, commitEnd);
}
SyncIndex beginIndex = ths->commitIndex + 1;
@@ -131,7 +124,10 @@ int32_t syncNodeFollowerCommit(SSyncNode* ths, SyncIndex newCommitIndex) {
return 0;
}
-int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
+int32_t syncNodeOnAppendEntries(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ SyncAppendEntries* pMsg = pRpcMsg->pCont;
+ SRpcMsg rpcRsp = {0};
+
// if already drop replica, do not process
if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) {
syncLogRecvAppendEntries(ths, pMsg, "not in my config");
@@ -139,7 +135,13 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
}
// prepare response msg
- SyncAppendEntriesReply* pReply = syncAppendEntriesReplyBuild(ths->vgId);
+ int32_t code = syncBuildAppendEntriesReply(&rpcRsp, ths->vgId);
+ if (code != 0) {
+ syncLogRecvAppendEntries(ths, pMsg, "build rsp error");
+ goto _IGNORE;
+ }
+
+ SyncAppendEntriesReply* pReply = rpcRsp.pCont;
pReply->srcId = ths->myRaftId;
pReply->destId = pMsg->srcId;
pReply->term = ths->pRaftStore->currentTerm;
@@ -171,7 +173,11 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
if (pMsg->prevLogIndex >= startIndex) {
SyncTerm myPreLogTerm = syncNodeGetPreTerm(ths, pMsg->prevLogIndex + 1);
- ASSERT(myPreLogTerm != SYNC_TERM_INVALID);
+ // ASSERT(myPreLogTerm != SYNC_TERM_INVALID);
+ if (myPreLogTerm == SYNC_TERM_INVALID) {
+ syncLogRecvAppendEntries(ths, pMsg, "reject, pre-term invalid");
+ goto _SEND_RESPONSE;
+ }
if (myPreLogTerm != pMsg->prevLogTerm) {
syncLogRecvAppendEntries(ths, pMsg, "reject, pre-term not match");
@@ -183,19 +189,36 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
pReply->success = true;
bool hasAppendEntries = pMsg->dataLen > 0;
if (hasAppendEntries) {
- SSyncRaftEntry* pAppendEntry = syncEntryDeserialize(pMsg->data, pMsg->dataLen);
+ SSyncRaftEntry* pAppendEntry = syncEntryBuildFromAppendEntries(pMsg);
ASSERT(pAppendEntry != NULL);
- SyncIndex appendIndex = pMsg->prevLogIndex + 1;
+ SyncIndex appendIndex = pMsg->prevLogIndex + 1;
+
+ LRUHandle* hLocal = NULL;
+ LRUHandle* hAppend = NULL;
+
+ int32_t code = 0;
SSyncRaftEntry* pLocalEntry = NULL;
- int32_t code = ths->pLogStore->syncLogGetEntry(ths->pLogStore, appendIndex, &pLocalEntry);
+ SLRUCache* pCache = ths->pLogStore->pCache;
+ hLocal = taosLRUCacheLookup(pCache, &appendIndex, sizeof(appendIndex));
+ if (hLocal) {
+ pLocalEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, hLocal);
+ code = 0;
+
+ sNTrace(ths, "hit cache index:%" PRId64 ", bytes:%u, %p", appendIndex, pLocalEntry->bytes, pLocalEntry);
+
+ } else {
+ sNTrace(ths, "miss cache index:%" PRId64, appendIndex);
+
+ code = ths->pLogStore->syncLogGetEntry(ths->pLogStore, appendIndex, &pLocalEntry);
+ }
+
if (code == 0) {
+ // get local entry success
+
if (pLocalEntry->term == pAppendEntry->term) {
// do nothing
-
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "log match, do nothing, index:%" PRId64, appendIndex);
- syncNodeEventLog(ths, logBuf);
+ sNTrace(ths, "log match, do nothing, index:%" PRId64, appendIndex);
} else {
// truncate
@@ -205,8 +228,18 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
snprintf(logBuf, sizeof(logBuf), "ignore, truncate error, append-index:%" PRId64, appendIndex);
syncLogRecvAppendEntries(ths, pMsg, logBuf);
- syncEntryDestory(pLocalEntry);
- syncEntryDestory(pAppendEntry);
+ if (hLocal) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hLocal, false);
+ } else {
+ syncEntryDestory(pLocalEntry);
+ }
+
+ if (hAppend) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hAppend, false);
+ } else {
+ syncEntryDestory(pAppendEntry);
+ }
+
goto _IGNORE;
}
@@ -217,10 +250,22 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
snprintf(logBuf, sizeof(logBuf), "ignore, append error, append-index:%" PRId64, appendIndex);
syncLogRecvAppendEntries(ths, pMsg, logBuf);
- syncEntryDestory(pLocalEntry);
- syncEntryDestory(pAppendEntry);
+ if (hLocal) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hLocal, false);
+ } else {
+ syncEntryDestory(pLocalEntry);
+ }
+
+ if (hAppend) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hAppend, false);
+ } else {
+ syncEntryDestory(pAppendEntry);
+ }
+
goto _IGNORE;
}
+
+ syncCacheEntry(ths->pLogStore, pAppendEntry, &hAppend);
}
} else {
@@ -246,19 +291,42 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
snprintf(logBuf, sizeof(logBuf), "ignore, log not exist, append error, append-index:%" PRId64, appendIndex);
syncLogRecvAppendEntries(ths, pMsg, logBuf);
- syncEntryDestory(pLocalEntry);
- syncEntryDestory(pAppendEntry);
+ if (hLocal) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hLocal, false);
+ } else {
+ syncEntryDestory(pLocalEntry);
+ }
+
+ if (hAppend) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hAppend, false);
+ } else {
+ syncEntryDestory(pAppendEntry);
+ }
+
goto _IGNORE;
}
+ syncCacheEntry(ths->pLogStore, pAppendEntry, &hAppend);
+
} else {
- // error
+ // get local entry success
char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "ignore, get local entry error, append-index:%" PRId64, appendIndex);
+ snprintf(logBuf, sizeof(logBuf), "ignore, get local entry error, append-index:%" PRId64 " err:%d", appendIndex,
+ terrno);
syncLogRecvAppendEntries(ths, pMsg, logBuf);
- syncEntryDestory(pLocalEntry);
- syncEntryDestory(pAppendEntry);
+ if (hLocal) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hLocal, false);
+ } else {
+ syncEntryDestory(pLocalEntry);
+ }
+
+ if (hAppend) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hAppend, false);
+ } else {
+ syncEntryDestory(pAppendEntry);
+ }
+
goto _IGNORE;
}
}
@@ -266,8 +334,17 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
// update match index
pReply->matchIndex = pAppendEntry->index;
- syncEntryDestory(pLocalEntry);
- syncEntryDestory(pAppendEntry);
+ if (hLocal) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hLocal, false);
+ } else {
+ syncEntryDestory(pLocalEntry);
+ }
+
+ if (hAppend) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, hAppend, false);
+ } else {
+ syncEntryDestory(pAppendEntry);
+ }
} else {
// no append entries, do nothing
@@ -284,7 +361,7 @@ int32_t syncNodeOnAppendEntries(SSyncNode* ths, SyncAppendEntries* pMsg) {
goto _SEND_RESPONSE;
_IGNORE:
- syncAppendEntriesReplyDestroy(pReply);
+ rpcFreeCont(rpcRsp.pCont);
return 0;
_SEND_RESPONSE:
@@ -292,10 +369,6 @@ _SEND_RESPONSE:
syncLogSendAppendEntriesReply(ths, pReply, "");
// send response
- SRpcMsg rpcMsg;
- syncAppendEntriesReply2RpcMsg(pReply, &rpcMsg);
- syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg);
- syncAppendEntriesReplyDestroy(pReply);
-
+ syncNodeSendMsgById(&pReply->destId, ths, &rpcRsp);
return 0;
}
\ No newline at end of file
diff --git a/source/libs/sync/src/syncAppendEntriesReply.c b/source/libs/sync/src/syncAppendEntriesReply.c
index 5d54db5b077c467909bbcbf81d2d3fd4d3ad7de9..c602788b19843111dc02fdb041b2746a4c0cb3f4 100644
--- a/source/libs/sync/src/syncAppendEntriesReply.c
+++ b/source/libs/sync/src/syncAppendEntriesReply.c
@@ -13,17 +13,15 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncAppendEntriesReply.h"
#include "syncCommit.h"
#include "syncIndexMgr.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
-#include "syncRaftLog.h"
+#include "syncMessage.h"
#include "syncRaftStore.h"
#include "syncReplication.h"
#include "syncSnapshot.h"
#include "syncUtil.h"
-#include "syncVoteMgr.h"
// TLA+ Spec
// HandleAppendEntriesResponse(i, j, m) ==
@@ -39,55 +37,9 @@
// /\ UNCHANGED <>
//
-// only start once
-static void syncNodeStartSnapshotOnce(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endIndex, SyncTerm lastApplyTerm,
- SyncAppendEntriesReply* pMsg) {
- if (beginIndex > endIndex) {
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "snapshot param error, start:%" PRId64 ", end:%" PRId64, beginIndex, endIndex);
- syncNodeErrorLog(ths, logBuf);
- } while (0);
-
- return;
- }
-
- // get sender
- SSyncSnapshotSender* pSender = syncNodeGetSnapshotSender(ths, &(pMsg->srcId));
- ASSERT(pSender != NULL);
-
- if (snapshotSenderIsStart(pSender)) {
- do {
- char* eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender already start");
- syncNodeErrorLog(ths, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
- return;
- }
-
- SSnapshot snapshot = {
- .data = NULL, .lastApplyIndex = endIndex, .lastApplyTerm = lastApplyTerm, .lastConfigIndex = SYNC_INDEX_INVALID};
- void* pReader = NULL;
- SSnapshotParam readerParam = {.start = beginIndex, .end = endIndex};
- int32_t code = ths->pFsm->FpSnapshotStartRead(ths->pFsm, &readerParam, &pReader);
- ASSERT(code == 0);
-
-#if 0
- if (pMsg->privateTerm < pSender->privateTerm) {
- ASSERT(pReader != NULL);
- snapshotSenderStart(pSender, readerParam, snapshot, pReader);
-
- } else {
- if (pReader != NULL) {
- ths->pFsm->FpSnapshotStopRead(ths->pFsm, pReader);
- }
- }
-#endif
-}
-
-int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMsg) {
- int32_t ret = 0;
+int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ int32_t ret = 0;
+ SyncAppendEntriesReply* pMsg = pRpcMsg->pCont;
// if already drop replica, do not process
if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) {
@@ -115,6 +67,9 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs
if (pMsg->matchIndex > oldMatchIndex) {
syncIndexMgrSetIndex(ths->pMatchIndex, &(pMsg->srcId), pMsg->matchIndex);
syncMaybeAdvanceCommitIndex(ths);
+
+ // maybe update minMatchIndex
+ ths->minMatchIndex = syncMinMatchIndex(ths);
}
syncIndexMgrSetIndex(ths->pNextIndex, &(pMsg->srcId), pMsg->matchIndex + 1);
@@ -131,10 +86,14 @@ int32_t syncNodeOnAppendEntriesReply(SSyncNode* ths, SyncAppendEntriesReply* pMs
ASSERT(pState != NULL);
if (pMsg->lastSendIndex == pState->lastSendIndex) {
- syncNodeReplicateOne(ths, &(pMsg->srcId));
+ int64_t timeNow = taosGetTimestampMs();
+ int64_t elapsed = timeNow - pState->lastSendTime;
+ sNTrace(ths, "sync-append-entries rtt elapsed:%" PRId64 ", index:%" PRId64, elapsed, pState->lastSendIndex);
+
+ syncNodeReplicateOne(ths, &(pMsg->srcId), true);
}
}
syncLogRecvAppendEntriesReply(ths, pMsg, "process");
return 0;
-}
\ No newline at end of file
+}
diff --git a/source/libs/sync/src/syncCommit.c b/source/libs/sync/src/syncCommit.c
index 95787bbe6c34df233cefb1618e681918cb531772..60bec6ab659cbb92c275465c803a44f26581f484 100644
--- a/source/libs/sync/src/syncCommit.c
+++ b/source/libs/sync/src/syncCommit.c
@@ -13,10 +13,9 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncCommit.h"
#include "syncIndexMgr.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
@@ -51,12 +50,12 @@ void syncOneReplicaAdvance(SSyncNode* pSyncNode) {
}
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) {
- syncNodeErrorLog(pSyncNode, "not leader, can not advance commit index");
+ sNError(pSyncNode, "not leader, can not advance commit index");
return;
}
if (pSyncNode->replicaNum != 1) {
- syncNodeErrorLog(pSyncNode, "not one replica, can not advance commit index");
+ sNError(pSyncNode, "not one replica, can not advance commit index");
return;
}
@@ -67,23 +66,13 @@ void syncOneReplicaAdvance(SSyncNode* pSyncNode) {
SyncIndex commitBegin = pSyncNode->commitIndex;
SyncIndex commitEnd = snapshot.lastApplyIndex;
pSyncNode->commitIndex = snapshot.lastApplyIndex;
-
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin,
- commitEnd);
- syncNodeEventLog(pSyncNode, eventLog);
+ sNTrace(pSyncNode, "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin, commitEnd);
}
// advance commit index as large as possible
SyncIndex lastIndex = syncNodeGetLastIndex(pSyncNode);
if (lastIndex > pSyncNode->commitIndex) {
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "commit by wal from index:%" PRId64 " to index:%" PRId64,
- pSyncNode->commitIndex + 1, lastIndex);
- syncNodeEventLog(pSyncNode, eventLog);
- } while (0);
-
+ sNTrace(pSyncNode, "commit by wal from index:%" PRId64 " to index:%" PRId64, pSyncNode->commitIndex + 1, lastIndex);
pSyncNode->commitIndex = lastIndex;
}
@@ -101,7 +90,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
}
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) {
- syncNodeErrorLog(pSyncNode, "not leader, can not advance commit index");
+ sNError(pSyncNode, "not leader, can not advance commit index");
return;
}
@@ -112,11 +101,7 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
SyncIndex commitBegin = pSyncNode->commitIndex;
SyncIndex commitEnd = snapshot.lastApplyIndex;
pSyncNode->commitIndex = snapshot.lastApplyIndex;
-
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin,
- commitEnd);
- syncNodeEventLog(pSyncNode, eventLog);
+ sNTrace(pSyncNode, "commit by snapshot from index:%" PRId64 " to index:%" PRId64, commitBegin, commitEnd);
}
// update commit index
@@ -131,12 +116,15 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
LRUHandle* h = taosLRUCacheLookup(pCache, &index, sizeof(index));
if (h) {
pEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h);
+
+ sNTrace(pSyncNode, "hit cache index:%" PRId64 ", bytes:%u, %p", index, pEntry->bytes, pEntry);
+
} else {
+ sNTrace(pSyncNode, "miss cache index:%" PRId64, index);
+
int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, index, &pEntry);
if (code != 0) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "advance commit index error, read wal index:%" PRId64, index);
- syncNodeErrorLog(pSyncNode, logBuf);
+ sNError(pSyncNode, "advance commit index error, read wal index:%" PRId64, index);
return;
}
}
@@ -153,12 +141,8 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
break;
} else {
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "can not commit due to term not equal, index:%" PRId64 ", term:%" PRIu64,
- pEntry->index, pEntry->term);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
+ sNTrace(pSyncNode, "can not commit due to term not equal, index:%" PRId64 ", term:%" PRIu64, pEntry->index,
+ pEntry->term);
}
if (h) {
@@ -190,10 +174,8 @@ void syncMaybeAdvanceCommitIndex(SSyncNode* pSyncNode) {
if (pSyncNode->pFsm != NULL) {
int32_t code = syncNodeDoCommit(pSyncNode, beginIndex, endIndex, pSyncNode->state);
if (code != 0) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "advance commit index error, do commit begin:%" PRId64 ", end:%" PRId64,
- beginIndex, endIndex);
- syncNodeErrorLog(pSyncNode, logBuf);
+ sNError(pSyncNode, "advance commit index error, do commit begin:%" PRId64 ", end:%" PRId64, beginIndex,
+ endIndex);
return;
}
}
diff --git a/source/libs/sync/src/syncElection.c b/source/libs/sync/src/syncElection.c
index b428f4d2f2b3844f446f0ad9a0dde4fd3175f0f1..5c41e43fd4e6c8baf02ccca2f7ebea06de950ff6 100644
--- a/source/libs/sync/src/syncElection.c
+++ b/source/libs/sync/src/syncElection.c
@@ -13,10 +13,12 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncElection.h"
#include "syncMessage.h"
#include "syncRaftCfg.h"
#include "syncRaftStore.h"
+#include "syncUtil.h"
#include "syncVoteMgr.h"
// TLA+ Spec
@@ -31,8 +33,35 @@
// mdest |-> j])
// /\ UNCHANGED <>
+static int32_t syncNodeRequestVotePeers(SSyncNode* pNode) {
+ if (pNode->state != TAOS_SYNC_STATE_CANDIDATE) {
+ sNTrace(pNode, "not candidate, stop elect");
+ return 0;
+ }
+
+ int32_t ret = 0;
+ for (int i = 0; i < pNode->peersNum; ++i) {
+ SRpcMsg rpcMsg = {0};
+ ret = syncBuildRequestVote(&rpcMsg, pNode->vgId);
+ ASSERT(ret == 0);
+
+ SyncRequestVote* pMsg = rpcMsg.pCont;
+ pMsg->srcId = pNode->myRaftId;
+ pMsg->destId = pNode->peersId[i];
+ pMsg->term = pNode->pRaftStore->currentTerm;
+
+ ret = syncNodeGetLastIndexTerm(pNode, &pMsg->lastLogIndex, &pMsg->lastLogTerm);
+ ASSERT(ret == 0);
+
+ ret = syncNodeSendMsgById(&pNode->peersId[i], pNode, &rpcMsg);
+ ASSERT(ret == 0);
+ }
+
+ return ret;
+}
+
int32_t syncNodeElect(SSyncNode* pSyncNode) {
- syncNodeEventLog(pSyncNode, "begin election");
+ sNTrace(pSyncNode, "begin election");
int32_t ret = 0;
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
@@ -40,7 +69,7 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
}
if (pSyncNode->state != TAOS_SYNC_STATE_CANDIDATE) {
- syncNodeErrorLog(pSyncNode, "not candidate, can not elect");
+ sNError(pSyncNode, "not candidate, can not elect");
return -1;
}
@@ -79,36 +108,3 @@ int32_t syncNodeElect(SSyncNode* pSyncNode) {
return ret;
}
-
-int32_t syncNodeRequestVotePeers(SSyncNode* pSyncNode) {
- if (pSyncNode->state != TAOS_SYNC_STATE_CANDIDATE) {
- syncNodeEventLog(pSyncNode, "not candidate, stop elect");
- return 0;
- }
-
- int32_t ret = 0;
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- SyncRequestVote* pMsg = syncRequestVoteBuild(pSyncNode->vgId);
- pMsg->srcId = pSyncNode->myRaftId;
- pMsg->destId = pSyncNode->peersId[i];
- pMsg->term = pSyncNode->pRaftStore->currentTerm;
-
- ret = syncNodeGetLastIndexTerm(pSyncNode, &(pMsg->lastLogIndex), &(pMsg->lastLogTerm));
- ASSERT(ret == 0);
-
- ret = syncNodeSendRequestVote(pSyncNode, &pSyncNode->peersId[i], pMsg);
- ASSERT(ret == 0);
- syncRequestVoteDestroy(pMsg);
- }
- return ret;
-}
-
-int32_t syncNodeSendRequestVote(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncRequestVote* pMsg) {
- int32_t ret = 0;
- syncLogSendRequestVote(pSyncNode, pMsg, "");
-
- SRpcMsg rpcMsg;
- syncRequestVote2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg);
- return ret;
-}
\ No newline at end of file
diff --git a/source/libs/sync/src/syncEnv.c b/source/libs/sync/src/syncEnv.c
index cf0d4d25e85535671aea1d3e2e90303e2e420c7d..43685f6496cc995cba81797cbd053fa8b363232c 100644
--- a/source/libs/sync/src/syncEnv.c
+++ b/source/libs/sync/src/syncEnv.c
@@ -15,11 +15,12 @@
#define _DEFAULT_SOURCE
#include "syncEnv.h"
+#include "syncUtil.h"
#include "tref.h"
static SSyncEnv gSyncEnv = {0};
static int32_t gNodeRefId = -1;
-bool gRaftDetailLog = false;
+static int32_t gHbDataRefId = -1;
static void syncEnvTick(void *param, void *tmrId);
SSyncEnv *syncEnv() { return &gSyncEnv; }
@@ -50,6 +51,13 @@ int32_t syncInit() {
return -1;
}
+ gHbDataRefId = taosOpenRef(200, (RefFp)syncHbTimerDataFree);
+ if (gHbDataRefId < 0) {
+ sError("failed to init hb-data ref");
+ syncCleanUp();
+ return -1;
+ }
+
sDebug("sync rsetId:%d is open", gNodeRefId);
return 0;
}
@@ -64,6 +72,12 @@ void syncCleanUp() {
taosCloseRef(gNodeRefId);
gNodeRefId = -1;
}
+
+ if (gHbDataRefId != -1) {
+ sDebug("sync rsetId:%d is closed", gHbDataRefId);
+ taosCloseRef(gHbDataRefId);
+ gHbDataRefId = -1;
+ }
}
int64_t syncNodeAdd(SSyncNode *pNode) {
@@ -79,7 +93,7 @@ void syncNodeRemove(int64_t rid) { taosRemoveRef(gNodeRefId, rid); }
SSyncNode *syncNodeAcquire(int64_t rid) {
SSyncNode *pNode = taosAcquireRef(gNodeRefId, rid);
if (pNode == NULL) {
- sTrace("failed to acquire node from refId:%" PRId64, rid);
+ sError("failed to acquire node from refId:%" PRId64, rid);
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
}
@@ -88,6 +102,26 @@ SSyncNode *syncNodeAcquire(int64_t rid) {
void syncNodeRelease(SSyncNode *pNode) { taosReleaseRef(gNodeRefId, pNode->rid); }
+int64_t syncHbTimerDataAdd(SSyncHbTimerData *pData) {
+ pData->rid = taosAddRef(gHbDataRefId, pData);
+ if (pData->rid < 0) return -1;
+ return pData->rid;
+}
+
+void syncHbTimerDataRemove(int64_t rid) { taosRemoveRef(gHbDataRefId, rid); }
+
+SSyncHbTimerData *syncHbTimerDataAcquire(int64_t rid) {
+ SSyncHbTimerData *pData = taosAcquireRef(gHbDataRefId, rid);
+ if (pData == NULL) {
+ sError("failed to acquire hb-timer-data from refId:%" PRId64, rid);
+ terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ }
+
+ return pData;
+}
+
+void syncHbTimerDataRelease(SSyncHbTimerData *pData) { taosReleaseRef(gHbDataRefId, pData->rid); }
+
#if 0
void syncEnvStartTimer() {
taosTmrReset(gSyncEnv.FpEnvTickTimer, gSyncEnv.envTickTimerMS, &gSyncEnv, gSyncEnv.pTimerManager,
@@ -105,6 +139,7 @@ void syncEnvStopTimer() {
#endif
static void syncEnvTick(void *param, void *tmrId) {
+#if 0
SSyncEnv *pSyncEnv = param;
if (atomic_load_64(&gSyncEnv.envTickTimerLogicClockUser) <= atomic_load_64(&gSyncEnv.envTickTimerLogicClock)) {
gSyncEnv.envTickTimerCounter++;
@@ -121,4 +156,5 @@ static void syncEnvTick(void *param, void *tmrId) {
gSyncEnv.envTickTimerLogicClockUser, gSyncEnv.envTickTimerLogicClock, gSyncEnv.envTickTimerCounter,
gSyncEnv.envTickTimerMS, tmrId);
}
+#endif
}
diff --git a/source/libs/sync/src/syncIndexMgr.c b/source/libs/sync/src/syncIndexMgr.c
index 8e78aeedc335c1368dc62435cf21dbb205316e11..ca5e531528afd76fbbb68e61cbe3224e337b89a6 100644
--- a/source/libs/sync/src/syncIndexMgr.c
+++ b/source/libs/sync/src/syncIndexMgr.c
@@ -13,18 +13,16 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncIndexMgr.h"
#include "syncUtil.h"
-// SMatchIndex -----------------------------
-
SSyncIndexMgr *syncIndexMgrCreate(SSyncNode *pSyncNode) {
- SSyncIndexMgr *pSyncIndexMgr = taosMemoryMalloc(sizeof(SSyncIndexMgr));
+ SSyncIndexMgr *pSyncIndexMgr = taosMemoryCalloc(1, sizeof(SSyncIndexMgr));
if (pSyncIndexMgr == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
- memset(pSyncIndexMgr, 0, sizeof(SSyncIndexMgr));
pSyncIndexMgr->replicas = &(pSyncNode->replicasId);
pSyncIndexMgr->replicaNum = pSyncNode->replicaNum;
@@ -97,54 +95,6 @@ SyncIndex syncIndexMgrGetIndex(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaf
return SYNC_INDEX_INVALID;
}
-cJSON *syncIndexMgr2Json(SSyncIndexMgr *pSyncIndexMgr) {
- char u64buf[128] = {0};
- cJSON *pRoot = cJSON_CreateObject();
-
- if (pSyncIndexMgr != NULL) {
- cJSON_AddNumberToObject(pRoot, "replicaNum", pSyncIndexMgr->replicaNum);
- cJSON *pReplicas = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "replicas", pReplicas);
- for (int i = 0; i < pSyncIndexMgr->replicaNum; ++i) {
- cJSON_AddItemToArray(pReplicas, syncUtilRaftId2Json(&(*(pSyncIndexMgr->replicas))[i]));
- }
-
- {
- int *arr = (int *)taosMemoryMalloc(sizeof(int) * pSyncIndexMgr->replicaNum);
- for (int i = 0; i < pSyncIndexMgr->replicaNum; ++i) {
- arr[i] = pSyncIndexMgr->index[i];
- }
- cJSON *pIndex = cJSON_CreateIntArray(arr, pSyncIndexMgr->replicaNum);
- taosMemoryFree(arr);
- cJSON_AddItemToObject(pRoot, "index", pIndex);
- }
-
- {
- int *arr = (int *)taosMemoryMalloc(sizeof(int) * pSyncIndexMgr->replicaNum);
- for (int i = 0; i < pSyncIndexMgr->replicaNum; ++i) {
- arr[i] = pSyncIndexMgr->privateTerm[i];
- }
- cJSON *pIndex = cJSON_CreateIntArray(arr, pSyncIndexMgr->replicaNum);
- taosMemoryFree(arr);
- cJSON_AddItemToObject(pRoot, "privateTerm", pIndex);
- }
-
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncIndexMgr->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- }
-
- cJSON *pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "pSyncIndexMgr", pRoot);
- return pJson;
-}
-
-char *syncIndexMgr2Str(SSyncIndexMgr *pSyncIndexMgr) {
- cJSON *pJson = syncIndexMgr2Json(pSyncIndexMgr);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
void syncIndexMgrSetStartTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, int64_t startTime) {
for (int i = 0; i < pSyncIndexMgr->replicaNum; ++i) {
if (syncUtilSameId(&((*(pSyncIndexMgr->replicas))[i]), pRaftId)) {
@@ -201,35 +151,6 @@ int64_t syncIndexMgrGetRecvTime(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRa
return -1;
}
-// for debug -------------------
-void syncIndexMgrPrint(SSyncIndexMgr *pObj) {
- char *serialized = syncIndexMgr2Str(pObj);
- 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", (uint64_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncIndexMgrLog(SSyncIndexMgr *pObj) {
- char *serialized = syncIndexMgr2Str(pObj);
- 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", (uint64_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
void syncIndexMgrSetTerm(SSyncIndexMgr *pSyncIndexMgr, const SRaftId *pRaftId, SyncTerm term) {
for (int i = 0; i < pSyncIndexMgr->replicaNum; ++i) {
if (syncUtilSameId(&((*(pSyncIndexMgr->replicas))[i]), pRaftId)) {
diff --git a/source/libs/sync/src/syncMain.c b/source/libs/sync/src/syncMain.c
index 8a3047ae32d426e27606ce9124ea0a32a7ef6b71..88b8ba7e2531bd386fdd224ef1651c5992a6dc7d 100644
--- a/source/libs/sync/src/syncMain.c
+++ b/source/libs/sync/src/syncMain.c
@@ -42,6 +42,21 @@ static int32_t syncNodeEqNoop(SSyncNode* ths);
static int32_t syncNodeAppendNoop(SSyncNode* ths);
static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId);
static bool syncIsConfigChanged(const SSyncCfg* pOldCfg, const SSyncCfg* pNewCfg);
+static int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId);
+static int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
+static int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer);
+static int32_t syncNodeUpdateNewConfigIndex(SSyncNode* ths, SSyncCfg* pNewCfg);
+static bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config);
+static void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* newConfig, SyncIndex lastConfigChangeIndex);
+static bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg);
+
+static bool syncNodeCanChange(SSyncNode* pSyncNode);
+static int32_t syncNodeLeaderTransfer(SSyncNode* pSyncNode);
+static int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeader);
+static int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* pEntry);
+
+static ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode);
+static SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode* pSyncNode, SyncIndex snapshotLastApplyIndex);
int64_t syncOpen(SSyncInfo* pSyncInfo) {
SSyncNode* pSyncNode = syncNodeOpen(pSyncInfo);
@@ -76,6 +91,7 @@ void syncStart(int64_t rid) {
void syncStop(int64_t rid) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode != NULL) {
+ pSyncNode->isStart = false;
syncNodeRelease(pSyncNode);
syncNodeRemove(rid);
}
@@ -83,11 +99,10 @@ void syncStop(int64_t rid) {
void syncPreStop(int64_t rid) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) return;
-
- syncNodePreClose(pSyncNode);
-
- syncNodeRelease(pSyncNode);
+ if (pSyncNode != NULL) {
+ syncNodePreClose(pSyncNode);
+ syncNodeRelease(pSyncNode);
+ }
}
static bool syncNodeCheckNewConfig(SSyncNode* pSyncNode, const SSyncCfg* pCfg) {
@@ -131,61 +146,44 @@ int32_t syncProcessMsg(int64_t rid, SRpcMsg* pMsg) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode == NULL) return code;
- 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 if (pMsg->msgType == TDMT_SYNC_TIMEOUT) {
- SyncTimeout* pSyncMsg = syncTimeoutFromRpcMsg2(pMsg);
- code = syncNodeOnTimer(pSyncNode, pSyncMsg);
- syncTimeoutDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_PING) {
- SyncPing* pSyncMsg = syncPingFromRpcMsg2(pMsg);
- code = syncNodeOnPing(pSyncNode, pSyncMsg);
- syncPingDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_PING_REPLY) {
- SyncPingReply* pSyncMsg = syncPingReplyFromRpcMsg2(pMsg);
- code = syncNodeOnPingReply(pSyncNode, pSyncMsg);
- syncPingReplyDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
- SyncClientRequest* pSyncMsg = syncClientRequestFromRpcMsg2(pMsg);
- code = syncNodeOnClientRequest(pSyncNode, pSyncMsg, NULL);
- syncClientRequestDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
- SyncRequestVote* pSyncMsg = syncRequestVoteFromRpcMsg2(pMsg);
- code = syncNodeOnRequestVote(pSyncNode, pSyncMsg);
- syncRequestVoteDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
- SyncRequestVoteReply* pSyncMsg = syncRequestVoteReplyFromRpcMsg2(pMsg);
- code = syncNodeOnRequestVoteReply(pSyncNode, pSyncMsg);
- syncRequestVoteReplyDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
- SyncAppendEntries* pSyncMsg = syncAppendEntriesFromRpcMsg2(pMsg);
- code = syncNodeOnAppendEntries(pSyncNode, pSyncMsg);
- syncAppendEntriesDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
- SyncAppendEntriesReply* pSyncMsg = syncAppendEntriesReplyFromRpcMsg2(pMsg);
- code = syncNodeOnAppendEntriesReply(pSyncNode, pSyncMsg);
- syncAppendEntriesReplyDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
- SyncSnapshotSend* pSyncMsg = syncSnapshotSendFromRpcMsg2(pMsg);
- code = syncNodeOnSnapshot(pSyncNode, pSyncMsg);
- syncSnapshotSendDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
- SyncSnapshotRsp* pSyncMsg = syncSnapshotRspFromRpcMsg2(pMsg);
- code = syncNodeOnSnapshotReply(pSyncNode, pSyncMsg);
- syncSnapshotRspDestroy(pSyncMsg);
- } else if (pMsg->msgType == TDMT_SYNC_LOCAL_CMD) {
- SyncLocalCmd* pSyncMsg = syncLocalCmdFromRpcMsg2(pMsg);
- code = syncNodeOnLocalCmd(pSyncNode, pSyncMsg);
- syncLocalCmdDestroy(pSyncMsg);
- } else {
- sError("vgId:%d, failed to process msg:%p since invalid type:%s", pSyncNode->vgId, pMsg, TMSG_INFO(pMsg->msgType));
- code = -1;
+ switch (pMsg->msgType) {
+ case TDMT_SYNC_HEARTBEAT:
+ code = syncNodeOnHeartbeat(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_HEARTBEAT_REPLY:
+ code = syncNodeOnHeartbeatReply(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_TIMEOUT:
+ code = syncNodeOnTimeout(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_CLIENT_REQUEST:
+ code = syncNodeOnClientRequest(pSyncNode, pMsg, NULL);
+ break;
+ case TDMT_SYNC_REQUEST_VOTE:
+ code = syncNodeOnRequestVote(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_REQUEST_VOTE_REPLY:
+ code = syncNodeOnRequestVoteReply(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_APPEND_ENTRIES:
+ code = syncNodeOnAppendEntries(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_APPEND_ENTRIES_REPLY:
+ code = syncNodeOnAppendEntriesReply(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_SNAPSHOT_SEND:
+ code = syncNodeOnSnapshot(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_SNAPSHOT_RSP:
+ code = syncNodeOnSnapshotReply(pSyncNode, pMsg);
+ break;
+ case TDMT_SYNC_LOCAL_CMD:
+ code = syncNodeOnLocalCmd(pSyncNode, pMsg);
+ break;
+ default:
+ sError("vgId:%d, failed to process msg:%p since invalid type:%s", pSyncNode->vgId, pMsg,
+ TMSG_INFO(pMsg->msgType));
+ code = -1;
}
syncNodeRelease(pSyncNode);
@@ -217,48 +215,13 @@ SyncIndex syncMinMatchIndex(SSyncNode* pSyncNode) {
return minMatchIndex;
}
-char* syncNodePeerState2Str(const SSyncNode* pSyncNode) {
- int32_t len = 128;
- int32_t useLen = 0;
- int32_t leftLen = len - useLen;
- char* pStr = taosMemoryMalloc(len);
- memset(pStr, 0, len);
-
- char* p = pStr;
- int32_t use = snprintf(p, leftLen, "{");
- useLen += use;
- leftLen -= use;
-
- for (int32_t i = 0; i < pSyncNode->replicaNum; ++i) {
- SPeerState* pState = syncNodeGetPeerState((SSyncNode*)pSyncNode, &(pSyncNode->replicasId[i]));
- if (pState == NULL) {
- sError("vgId:%d, replica maybe dropped", pSyncNode->vgId);
- break;
- }
-
- p = pStr + useLen;
- use = snprintf(p, leftLen, "%d:%" PRId64 " ,%" PRId64, i, pState->lastSendIndex, pState->lastSendTime);
- useLen += use;
- leftLen -= use;
- }
-
- p = pStr + useLen;
- use = snprintf(p, leftLen, "}");
- useLen += use;
- leftLen -= use;
-
- // sTrace("vgId:%d, ------------------ syncNodePeerState2Str:%s", pSyncNode->vgId, pStr);
-
- return pStr;
-}
-
int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode == NULL) {
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("sync begin snapshot error");
return -1;
}
- ASSERT(rid == pSyncNode->rid);
+
int32_t code = 0;
if (syncNodeIsMnode(pSyncNode)) {
@@ -271,12 +234,8 @@ int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
bool isEmpty = pSyncNode->pLogStore->syncLogIsEmpty(pSyncNode->pLogStore);
if (isEmpty || (!isEmpty && logNum < logRetention)) {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf),
- "new-snapshot-index:%" PRId64 ", log-num:%" PRId64 ", empty:%d, do not delete wal", lastApplyIndex,
- logNum, isEmpty);
- syncNodeEventLog(pSyncNode, logBuf);
-
+ sNTrace(pSyncNode, "new-snapshot-index:%" PRId64 ", log-num:%" PRId64 ", empty:%d, do not delete wal",
+ lastApplyIndex, logNum, isEmpty);
syncNodeRelease(pSyncNode);
return 0;
}
@@ -284,6 +243,18 @@ int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
goto _DEL_WAL;
} else {
+ lastApplyIndex -= SYNC_VNODE_LOG_RETENTION;
+
+ SyncIndex beginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
+ SyncIndex endIndex = pSyncNode->pLogStore->syncLogEndIndex(pSyncNode->pLogStore);
+ bool isEmpty = pSyncNode->pLogStore->syncLogIsEmpty(pSyncNode->pLogStore);
+
+ if (isEmpty || !(lastApplyIndex >= beginIndex && lastApplyIndex <= endIndex)) {
+ sNTrace(pSyncNode, "new-snapshot-index:%" PRId64 ", empty:%d, do not delete wal", lastApplyIndex, isEmpty);
+ syncNodeRelease(pSyncNode);
+ return 0;
+ }
+
// vnode
if (pSyncNode->replicaNum > 1) {
// multi replicas
@@ -298,12 +269,10 @@ int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
char host[64];
uint16_t port;
syncUtilU642Addr(pSyncNode->peersId[i].addr, host, sizeof(host), &port);
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf),
- "new-snapshot-index:%" PRId64 " is greater than match-index:%" PRId64
- " of %s:%d, do not delete wal",
- lastApplyIndex, matchIndex, host, port);
- syncNodeEventLog(pSyncNode, logBuf);
+ sNTrace(pSyncNode,
+ "new-snapshot-index:%" PRId64 " is greater than match-index:%" PRId64
+ " of %s:%d, do not delete wal",
+ lastApplyIndex, matchIndex, host, port);
} while (0);
syncNodeRelease(pSyncNode);
@@ -313,30 +282,20 @@ int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
} else if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
if (lastApplyIndex > pSyncNode->minMatchIndex) {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf),
- "new-snapshot-index:%" PRId64 " is greater than min-match-index:%" PRId64 ", do not delete wal",
- lastApplyIndex, pSyncNode->minMatchIndex);
- syncNodeEventLog(pSyncNode, logBuf);
-
+ sNTrace(pSyncNode,
+ "new-snapshot-index:%" PRId64 " is greater than min-match-index:%" PRId64 ", do not delete wal",
+ lastApplyIndex, pSyncNode->minMatchIndex);
syncNodeRelease(pSyncNode);
return 0;
}
} else if (pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE) {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "new-snapshot-index:%" PRId64 " candidate, do not delete wal", lastApplyIndex);
- syncNodeEventLog(pSyncNode, logBuf);
-
+ sNTrace(pSyncNode, "new-snapshot-index:%" PRId64 " candidate, do not delete wal", lastApplyIndex);
syncNodeRelease(pSyncNode);
return 0;
} else {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "new-snapshot-index:%" PRId64 " unknown state, do not delete wal",
- lastApplyIndex);
- syncNodeEventLog(pSyncNode, logBuf);
-
+ sNTrace(pSyncNode, "new-snapshot-index:%" PRId64 " unknown state, do not delete wal", lastApplyIndex);
syncNodeRelease(pSyncNode);
return 0;
}
@@ -353,36 +312,31 @@ int32_t syncBeginSnapshot(int64_t rid, int64_t lastApplyIndex) {
_DEL_WAL:
do {
- SyncIndex snapshottingIndex = atomic_load_64(&pSyncNode->snapshottingIndex);
-
- if (snapshottingIndex == SYNC_INDEX_INVALID) {
- atomic_store_64(&pSyncNode->snapshottingIndex, lastApplyIndex);
- pSyncNode->snapshottingTime = taosGetTimestampMs();
-
- SSyncLogStoreData* pData = pSyncNode->pLogStore->data;
- code = walBeginSnapshot(pData->pWal, lastApplyIndex);
- if (code == 0) {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "wal snapshot begin, index:%" PRId64 ", last apply index:%" PRId64,
- pSyncNode->snapshottingIndex, lastApplyIndex);
- syncNodeEventLog(pSyncNode, logBuf);
+ SSyncLogStoreData* pData = pSyncNode->pLogStore->data;
+ SyncIndex snapshotVer = walGetSnapshotVer(pData->pWal);
+ SyncIndex walCommitVer = walGetCommittedVer(pData->pWal);
+ SyncIndex wallastVer = walGetLastVer(pData->pWal);
+ if (lastApplyIndex <= walCommitVer) {
+ SyncIndex snapshottingIndex = atomic_load_64(&pSyncNode->snapshottingIndex);
+
+ if (snapshottingIndex == SYNC_INDEX_INVALID) {
+ atomic_store_64(&pSyncNode->snapshottingIndex, lastApplyIndex);
+ pSyncNode->snapshottingTime = taosGetTimestampMs();
+
+ code = walBeginSnapshot(pData->pWal, lastApplyIndex);
+ if (code == 0) {
+ sNTrace(pSyncNode, "wal snapshot begin, index:%" PRId64 ", last apply index:%" PRId64,
+ pSyncNode->snapshottingIndex, lastApplyIndex);
+ } else {
+ sNError(pSyncNode, "wal snapshot begin error since:%s, index:%" PRId64 ", last apply index:%" PRId64,
+ terrstr(terrno), pSyncNode->snapshottingIndex, lastApplyIndex);
+ atomic_store_64(&pSyncNode->snapshottingIndex, SYNC_INDEX_INVALID);
+ }
} else {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf),
- "wal snapshot begin error since:%s, index:%" PRId64 ", last apply index:%" PRId64, terrstr(terrno),
- pSyncNode->snapshottingIndex, lastApplyIndex);
- syncNodeErrorLog(pSyncNode, logBuf);
-
- atomic_store_64(&pSyncNode->snapshottingIndex, SYNC_INDEX_INVALID);
+ sNTrace(pSyncNode, "snapshotting for %" PRId64 ", do not delete wal for new-snapshot-index:%" PRId64,
+ snapshottingIndex, lastApplyIndex);
}
-
- } else {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf),
- "snapshotting for %" PRId64 ", do not delete wal for new-snapshot-index:%" PRId64, snapshottingIndex,
- lastApplyIndex);
- syncNodeEventLog(pSyncNode, logBuf);
}
} while (0);
@@ -393,28 +347,20 @@ _DEL_WAL:
int32_t syncEndSnapshot(int64_t rid) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode == NULL) {
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("sync end snapshot error");
return -1;
}
- ASSERT(rid == pSyncNode->rid);
int32_t code = 0;
if (atomic_load_64(&pSyncNode->snapshottingIndex) != SYNC_INDEX_INVALID) {
SSyncLogStoreData* pData = pSyncNode->pLogStore->data;
code = walEndSnapshot(pData->pWal);
if (code != 0) {
- sError("vgId:%d, wal snapshot end error since:%s", pSyncNode->vgId, terrstr());
-
+ sNError(pSyncNode, "wal snapshot end error since:%s", terrstr());
syncNodeRelease(pSyncNode);
return -1;
} else {
- do {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "wal snapshot end, index:%" PRId64,
- atomic_load_64(&pSyncNode->snapshottingIndex));
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode, "wal snapshot end, index:%" PRId64, atomic_load_64(&pSyncNode->snapshottingIndex));
atomic_store_64(&pSyncNode->snapshottingIndex, SYNC_INDEX_INVALID);
}
}
@@ -426,13 +372,11 @@ int32_t syncEndSnapshot(int64_t rid) {
int32_t syncStepDown(int64_t rid, SyncTerm newTerm) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode == NULL) {
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("sync step down error");
return -1;
}
- ASSERT(rid == pSyncNode->rid);
syncNodeStepDown(pSyncNode, newTerm);
-
syncNodeRelease(pSyncNode);
return 0;
}
@@ -440,10 +384,9 @@ int32_t syncStepDown(int64_t rid, SyncTerm newTerm) {
bool syncIsReadyForRead(int64_t rid) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode == NULL) {
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("sync ready for read error");
return false;
}
- ASSERT(rid == pSyncNode->rid);
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER && pSyncNode->restoreFinish) {
syncNodeRelease(pSyncNode);
@@ -452,16 +395,40 @@ bool syncIsReadyForRead(int64_t rid) {
bool ready = false;
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER && !pSyncNode->restoreFinish) {
- if (!pSyncNode->pLogStore->syncLogIsEmpty(pSyncNode->pLogStore)) {
- SSyncRaftEntry* pEntry = NULL;
- int32_t code = pSyncNode->pLogStore->syncLogGetEntry(
- pSyncNode->pLogStore, pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore), &pEntry);
- if (code == 0 && pEntry != NULL) {
- if (pEntry->originalRpcType == TDMT_SYNC_NOOP && pEntry->term == pSyncNode->pRaftStore->currentTerm) {
- ready = true;
+ if (!pSyncNode->pFsm->FpApplyQueueEmptyCb(pSyncNode->pFsm)) {
+ // apply queue not empty
+ ready = false;
+
+ } else {
+ if (!pSyncNode->pLogStore->syncLogIsEmpty(pSyncNode->pLogStore)) {
+ SyncIndex lastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
+ SSyncRaftEntry* pEntry = NULL;
+ SLRUCache* pCache = pSyncNode->pLogStore->pCache;
+ LRUHandle* h = taosLRUCacheLookup(pCache, &lastIndex, sizeof(lastIndex));
+ int32_t code = 0;
+ if (h) {
+ pEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h);
+ code = 0;
+
+ sNTrace(pSyncNode, "hit cache index:%" PRId64 ", bytes:%u, %p", lastIndex, pEntry->bytes, pEntry);
+
+ } else {
+ sNTrace(pSyncNode, "miss cache index:%" PRId64, lastIndex);
+
+ code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, lastIndex, &pEntry);
}
- syncEntryDestory(pEntry);
+ if (code == 0 && pEntry != NULL) {
+ if (pEntry->originalRpcType == TDMT_SYNC_NOOP && pEntry->term == pSyncNode->pRaftStore->currentTerm) {
+ ready = true;
+ }
+
+ if (h) {
+ taosLRUCacheRelease(pCache, h, false);
+ } else {
+ syncEntryDestory(pEntry);
+ }
+ }
}
}
}
@@ -480,14 +447,21 @@ bool syncIsReadyForRead(int64_t rid) {
int32_t syncNodeLeaderTransfer(SSyncNode* pSyncNode) {
if (pSyncNode->peersNum == 0) {
- sDebug("only one replica, cannot leader transfer");
+ sDebug("vgId:%d, only one replica, cannot leader transfer", pSyncNode->vgId);
terrno = TSDB_CODE_SYN_ONE_REPLICA;
return -1;
}
int32_t ret = 0;
- if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
+ if (pSyncNode->state == TAOS_SYNC_STATE_LEADER && pSyncNode->replicaNum > 1) {
SNodeInfo newLeader = (pSyncNode->peersNodeInfo)[0];
+ if (pSyncNode->peersNum == 2) {
+ SyncIndex matchIndex0 = syncIndexMgrGetIndex(pSyncNode->pMatchIndex, &(pSyncNode->peersId[0]));
+ SyncIndex matchIndex1 = syncIndexMgrGetIndex(pSyncNode->pMatchIndex, &(pSyncNode->peersId[1]));
+ if (matchIndex1 > matchIndex0) {
+ newLeader = (pSyncNode->peersNodeInfo)[1];
+ }
+ }
ret = syncNodeLeaderTransferTo(pSyncNode, newLeader);
}
@@ -495,67 +469,24 @@ int32_t syncNodeLeaderTransfer(SSyncNode* pSyncNode) {
}
int32_t syncNodeLeaderTransferTo(SSyncNode* pSyncNode, SNodeInfo newLeader) {
- int32_t ret = 0;
-
if (pSyncNode->replicaNum == 1) {
- sDebug("only one replica, cannot leader transfer");
+ sDebug("vgId:%d, only one replica, cannot leader transfer", pSyncNode->vgId);
terrno = TSDB_CODE_SYN_ONE_REPLICA;
return -1;
}
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "begin leader transfer to %s:%u", newLeader.nodeFqdn, newLeader.nodePort);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
+ sNTrace(pSyncNode, "begin leader transfer to %s:%u", newLeader.nodeFqdn, newLeader.nodePort);
- SyncLeaderTransfer* pMsg = syncLeaderTransferBuild(pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildLeaderTransfer(&rpcMsg, pSyncNode->vgId);
+
+ SyncLeaderTransfer* pMsg = rpcMsg.pCont;
pMsg->newLeaderId.addr = syncUtilAddr2U64(newLeader.nodeFqdn, newLeader.nodePort);
pMsg->newLeaderId.vgId = pSyncNode->vgId;
pMsg->newNodeInfo = newLeader;
- ASSERT(pMsg != NULL);
- SRpcMsg rpcMsg = {0};
- syncLeaderTransfer2RpcMsg(pMsg, &rpcMsg);
- syncLeaderTransferDestroy(pMsg);
- ret = syncNodePropose(pSyncNode, &rpcMsg, false);
- return ret;
-}
-
-bool syncCanLeaderTransfer(int64_t rid) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- return false;
- }
- ASSERT(rid == pSyncNode->rid);
-
- if (pSyncNode->replicaNum == 1) {
- syncNodeRelease(pSyncNode);
- return false;
- }
-
- if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
- syncNodeRelease(pSyncNode);
- return true;
- }
-
- bool matchOK = true;
- if (pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE || pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
- SyncIndex myCommitIndex = pSyncNode->commitIndex;
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- SyncIndex peerMatchIndex = syncIndexMgrGetIndex(pSyncNode->pMatchIndex, &(pSyncNode->peersId)[i]);
- if (peerMatchIndex < myCommitIndex) {
- matchOK = false;
- }
- }
- }
-
- syncNodeRelease(pSyncNode);
- return matchOK;
-}
-
-int32_t syncForwardToPeer(int64_t rid, SRpcMsg* pMsg, bool isWeak) {
- int32_t ret = syncPropose(rid, pMsg, isWeak);
+ int32_t ret = syncNodePropose(pSyncNode, &rpcMsg, false);
+ rpcFreeCont(rpcMsg.pCont);
return ret;
}
@@ -629,7 +560,7 @@ int32_t syncGetSnapshotMetaByIndex(int64_t rid, SyncIndex snapshotIndex, struct
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
- for (int i = 0; i < pSyncNode->pRaftCfg->configIndexCount; ++i) {
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->configIndexCount; ++i) {
if ((pSyncNode->pRaftCfg->configIndexArr)[i] > lastIndex &&
(pSyncNode->pRaftCfg->configIndexArr)[i] <= snapshotIndex) {
lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[i];
@@ -648,7 +579,7 @@ SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode* pSyncNode, SyncIndex snapsho
ASSERT(pSyncNode->pRaftCfg->configIndexCount >= 1);
SyncIndex lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[0];
- for (int i = 0; i < pSyncNode->pRaftCfg->configIndexCount; ++i) {
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->configIndexCount; ++i) {
if ((pSyncNode->pRaftCfg->configIndexArr)[i] > lastIndex &&
(pSyncNode->pRaftCfg->configIndexArr)[i] <= snapshotLastApplyIndex) {
lastIndex = (pSyncNode->pRaftCfg->configIndexArr)[i];
@@ -660,125 +591,31 @@ SyncIndex syncNodeGetSnapshotConfigIndex(SSyncNode* pSyncNode, SyncIndex snapsho
return lastIndex;
}
-#if 0
-SyncTerm syncGetMyTerm(int64_t rid) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- return TAOS_SYNC_STATE_ERROR;
- }
- ASSERT(rid == pSyncNode->rid);
- SyncTerm term = pSyncNode->pRaftStore->currentTerm;
-
- syncNodeRelease(pSyncNode);
- return term;
-}
-
-SyncIndex syncGetLastIndex(int64_t rid) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- return SYNC_INDEX_INVALID;
- }
- ASSERT(rid == pSyncNode->rid);
- SyncIndex lastIndex = syncNodeGetLastIndex(pSyncNode);
-
- syncNodeRelease(pSyncNode);
- return lastIndex;
-}
-
-SyncIndex syncGetCommitIndex(int64_t rid) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- return SYNC_INDEX_INVALID;
- }
- ASSERT(rid == pSyncNode->rid);
- SyncIndex cmtIndex = pSyncNode->commitIndex;
-
- syncNodeRelease(pSyncNode);
- return cmtIndex;
-}
-
-SyncGroupId syncGetVgId(int64_t rid) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- return TAOS_SYNC_STATE_ERROR;
- }
- ASSERT(rid == pSyncNode->rid);
- SyncGroupId vgId = pSyncNode->vgId;
-
- syncNodeRelease(pSyncNode);
- return vgId;
-}
-
-void syncGetEpSet(int64_t rid, SEpSet* pEpSet) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- memset(pEpSet, 0, sizeof(*pEpSet));
- return;
- }
- ASSERT(rid == pSyncNode->rid);
+void syncGetRetryEpSet(int64_t rid, SEpSet* pEpSet) {
pEpSet->numOfEps = 0;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
- snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
- pEpSet->eps[i].port = (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodePort;
- (pEpSet->numOfEps)++;
- sInfo("vgId:%d, sync get epset: index:%d %s:%d", pSyncNode->vgId, i, pEpSet->eps[i].fqdn, pEpSet->eps[i].port);
- }
- pEpSet->inUse = pSyncNode->pRaftCfg->cfg.myIndex;
- sInfo("vgId:%d, sync get epset in-use:%d", pSyncNode->vgId, pEpSet->inUse);
- syncNodeRelease(pSyncNode);
-}
-#endif
-
-void syncGetRetryEpSet(int64_t rid, SEpSet* pEpSet) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- memset(pEpSet, 0, sizeof(*pEpSet));
- return;
- }
- ASSERT(rid == pSyncNode->rid);
- pEpSet->numOfEps = 0;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
- snprintf(pEpSet->eps[i].fqdn, sizeof(pEpSet->eps[i].fqdn), "%s", (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodeFqdn);
- pEpSet->eps[i].port = (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodePort;
- (pEpSet->numOfEps)++;
- sInfo("vgId:%d, sync get retry epset: index:%d %s:%d", pSyncNode->vgId, i, pEpSet->eps[i].fqdn,
- pEpSet->eps[i].port);
+ if (pSyncNode == NULL) return;
+
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
+ SEp* pEp = &pEpSet->eps[i];
+ tstrncpy(pEp->fqdn, pSyncNode->pRaftCfg->cfg.nodeInfo[i].nodeFqdn, TSDB_FQDN_LEN);
+ pEp->port = (pSyncNode->pRaftCfg->cfg.nodeInfo)[i].nodePort;
+ pEpSet->numOfEps++;
+ sInfo("vgId:%d, sync get retry epset, index:%d %s:%d", pSyncNode->vgId, i, pEp->fqdn, pEp->port);
}
if (pEpSet->numOfEps > 0) {
pEpSet->inUse = (pSyncNode->pRaftCfg->cfg.myIndex + 1) % pEpSet->numOfEps;
}
- sInfo("vgId:%d, sync get retry epset in-use:%d", pSyncNode->vgId, pEpSet->inUse);
-
- syncNodeRelease(pSyncNode);
-}
-static void syncGetAndDelRespRpc(SSyncNode* pSyncNode, uint64_t index, SRpcHandleInfo* pInfo) {
- SRespStub stub;
- int32_t ret = syncRespMgrGetAndDel(pSyncNode->pSyncRespMgr, index, &stub);
- if (ret == 1) {
- *pInfo = stub.rpcMsg.info;
- }
- sTrace("vgId:%d, get seq:%" PRIu64 " rpc handle:%p", pSyncNode->vgId, index, pInfo->handle);
-}
-
-char* sync2SimpleStr(int64_t rid) {
- SSyncNode* pSyncNode = syncNodeAcquire(rid);
- if (pSyncNode == NULL) {
- sTrace("syncSetRpc get pSyncNode is NULL, rid:%" PRId64, rid);
- return NULL;
- }
-
- char* s = syncNode2SimpleStr(pSyncNode);
+ sInfo("vgId:%d, sync get retry epset numOfEps:%d inUse:%d", pSyncNode->vgId, pEpSet->numOfEps, pEpSet->inUse);
syncNodeRelease(pSyncNode);
-
- return s;
}
int32_t syncPropose(int64_t rid, SRpcMsg* pMsg, bool isWeak) {
SSyncNode* pSyncNode = syncNodeAcquire(rid);
if (pSyncNode == NULL) {
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("sync propose error");
return -1;
}
@@ -787,113 +624,60 @@ int32_t syncPropose(int64_t rid, SRpcMsg* pMsg, bool isWeak) {
return ret;
}
-static bool syncNodeBatchOK(SRpcMsg** pMsgPArr, int32_t arrSize) {
- for (int32_t i = 0; i < arrSize; ++i) {
- if (pMsgPArr[i]->msgType == TDMT_SYNC_CONFIG_CHANGE) {
- return false;
- }
-
- if (pMsgPArr[i]->msgType == TDMT_SYNC_CONFIG_CHANGE_FINISH) {
- return false;
- }
- }
-
- return true;
-}
-
int32_t syncNodePropose(SSyncNode* pSyncNode, SRpcMsg* pMsg, bool isWeak) {
- int32_t ret = 0;
-
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "propose message, type:%s", TMSG_INFO(pMsg->msgType));
- syncNodeEventLog(pSyncNode, eventLog);
- } while (0);
+ if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) {
+ terrno = TSDB_CODE_SYN_NOT_LEADER;
+ sNError(pSyncNode, "sync propose not leader, %s, type:%s", syncStr(pSyncNode->state), TMSG_INFO(pMsg->msgType));
+ return -1;
+ }
- if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
- if (pSyncNode->changing && pMsg->msgType != TDMT_SYNC_CONFIG_CHANGE_FINISH) {
- ret = -1;
- terrno = TSDB_CODE_SYN_PROPOSE_NOT_READY;
- sError("vgId:%d, failed to sync propose since not ready, type:%s", pSyncNode->vgId, TMSG_INFO(pMsg->msgType));
- goto _END;
- }
-
- // config change
- if (pMsg->msgType == TDMT_SYNC_CONFIG_CHANGE) {
- if (!syncNodeCanChange(pSyncNode)) {
- ret = -1;
- terrno = TSDB_CODE_SYN_RECONFIG_NOT_READY;
- sError("vgId:%d, failed to sync reconfig since not ready, type:%s", pSyncNode->vgId, TMSG_INFO(pMsg->msgType));
- goto _END;
- }
+ // not restored, vnode enable
+ if (!pSyncNode->restoreFinish && pSyncNode->vgId != 1) {
+ terrno = TSDB_CODE_SYN_PROPOSE_NOT_READY;
+ sNError(pSyncNode, "failed to sync propose since not ready, type:%s, last:%" PRId64 ", cmt:%" PRId64,
+ TMSG_INFO(pMsg->msgType), syncNodeGetLastIndex(pSyncNode), pSyncNode->commitIndex);
+ return -1;
+ }
- ASSERT(!pSyncNode->changing);
- pSyncNode->changing = true;
+ // optimized one replica
+ if (syncNodeIsOptimizedOneReplica(pSyncNode, pMsg)) {
+ SyncIndex retIndex;
+ int32_t code = syncNodeOnClientRequest(pSyncNode, pMsg, &retIndex);
+ if (code == 0) {
+ pMsg->info.conn.applyIndex = retIndex;
+ pMsg->info.conn.applyTerm = pSyncNode->pRaftStore->currentTerm;
+ sTrace("vgId:%d, propose optimized msg, index:%" PRId64 " type:%s", pSyncNode->vgId, retIndex,
+ TMSG_INFO(pMsg->msgType));
+ return 1;
+ } else {
+ terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("vgId:%d, failed to propose optimized msg, index:%" PRId64 " type:%s", pSyncNode->vgId, retIndex,
+ TMSG_INFO(pMsg->msgType));
+ return -1;
}
-
- // not restored, vnode enable
- 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:%" PRId64 ", cmt:%" PRId64,
- pSyncNode->vgId, TMSG_INFO(pMsg->msgType), syncNodeGetLastIndex(pSyncNode), pSyncNode->commitIndex);
- goto _END;
+ } else {
+ SRespStub stub = {.createTime = taosGetTimestampMs(), .rpcMsg = *pMsg};
+ uint64_t seqNum = syncRespMgrAdd(pSyncNode->pSyncRespMgr, &stub);
+ SRpcMsg rpcMsg = {0};
+ int32_t code = syncBuildClientRequest(&rpcMsg, pMsg, seqNum, isWeak, pSyncNode->vgId);
+ if (code != 0) {
+ sError("vgId:%d, failed to propose msg while serialize since %s", pSyncNode->vgId, terrstr());
+ (void)syncRespMgrDel(pSyncNode->pSyncRespMgr, seqNum);
+ return -1;
}
- SRespStub stub;
- stub.createTime = taosGetTimestampMs();
- stub.rpcMsg = *pMsg;
- uint64_t seqNum = syncRespMgrAdd(pSyncNode->pSyncRespMgr, &stub);
-
- SyncClientRequest* pSyncMsg = syncClientRequestBuild2(pMsg, seqNum, isWeak, pSyncNode->vgId);
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pSyncMsg, &rpcMsg);
-
- // optimized one replica
- if (syncNodeIsOptimizedOneReplica(pSyncNode, pMsg)) {
- SyncIndex retIndex;
- int32_t code = syncNodeOnClientRequest(pSyncNode, pSyncMsg, &retIndex);
- if (code == 0) {
- pMsg->info.conn.applyIndex = retIndex;
- pMsg->info.conn.applyTerm = pSyncNode->pRaftStore->currentTerm;
- rpcFreeCont(rpcMsg.pCont);
- syncRespMgrDel(pSyncNode->pSyncRespMgr, seqNum);
- ret = 1;
- sDebug("vgId:%d, sync optimize index:%" PRId64 ", type:%s", pSyncNode->vgId, retIndex,
- TMSG_INFO(pMsg->msgType));
- } else {
- ret = -1;
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
- sError("vgId:%d, failed to sync optimize index:%" PRId64 ", type:%s", pSyncNode->vgId, retIndex,
- TMSG_INFO(pMsg->msgType));
- }
-
- } else {
- if (pSyncNode->syncEqMsg != NULL && (*pSyncNode->syncEqMsg)(pSyncNode->msgcb, &rpcMsg) == 0) {
- ret = 0;
- } else {
- ret = -1;
- terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
- sError("vgId:%d, failed to enqueue msg since its null", pSyncNode->vgId);
- }
+ sNTrace(pSyncNode, "propose msg, type:%s", TMSG_INFO(pMsg->msgType));
+ code = (*pSyncNode->syncEqMsg)(pSyncNode->msgcb, &rpcMsg);
+ if (code != 0) {
+ sError("vgId:%d, failed to propose msg while enqueue since %s", pSyncNode->vgId, terrstr());
+ (void)syncRespMgrDel(pSyncNode->pSyncRespMgr, seqNum);
}
- syncClientRequestDestroy(pSyncMsg);
- goto _END;
-
- } else {
- ret = -1;
- terrno = TSDB_CODE_SYN_NOT_LEADER;
- sError("vgId:%d, sync propose not leader, %s, type:%s", pSyncNode->vgId, syncStr(pSyncNode->state),
- TMSG_INFO(pMsg->msgType));
- goto _END;
+ return code;
}
-
-_END:
- return ret;
}
-int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId) {
+static int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId destId) {
pSyncTimer->pTimer = NULL;
pSyncTimer->counter = 0;
pSyncTimer->timerMS = pSyncNode->hbBaseLine;
@@ -903,29 +687,36 @@ int32_t syncHbTimerInit(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer, SRaftId de
return 0;
}
-int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) {
+static int32_t syncHbTimerStart(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) {
int32_t ret = 0;
if (syncIsInit()) {
- SSyncHbTimerData* pData = taosMemoryMalloc(sizeof(SSyncHbTimerData));
- pData->pSyncNode = pSyncNode;
+ SSyncHbTimerData* pData = syncHbTimerDataAcquire(pSyncTimer->hbDataRid);
+ if (pData == NULL) {
+ pData = taosMemoryMalloc(sizeof(SSyncHbTimerData));
+ pData->rid = syncHbTimerDataAdd(pData);
+ }
+ pSyncTimer->hbDataRid = pData->rid;
+
+ pData->syncNodeRid = pSyncNode->rid;
pData->pTimer = pSyncTimer;
pData->destId = pSyncTimer->destId;
pData->logicClock = pSyncTimer->logicClock;
- pSyncTimer->pData = pData;
- taosTmrReset(pSyncTimer->timerCb, pSyncTimer->timerMS, pData, syncEnv()->pTimerManager, &pSyncTimer->pTimer);
+ taosTmrReset(pSyncTimer->timerCb, pSyncTimer->timerMS, (void*)(pData->rid), syncEnv()->pTimerManager,
+ &pSyncTimer->pTimer);
} else {
sError("vgId:%d, start ctrl hb timer error, sync env is stop", pSyncNode->vgId);
}
return ret;
}
-int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) {
+static int32_t syncHbTimerStop(SSyncNode* pSyncNode, SSyncTimer* pSyncTimer) {
int32_t ret = 0;
atomic_add_fetch_64(&pSyncTimer->logicClock, 1);
taosTmrStop(pSyncTimer->pTimer);
pSyncTimer->pTimer = NULL;
- // taosMemoryFree(pSyncTimer->pData);
+ syncHbTimerDataRemove(pSyncTimer->hbDataRid);
+ pSyncTimer->hbDataRid = -1;
return ret;
}
@@ -1013,22 +804,22 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
// init internal
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
- if (!syncUtilnodeInfo2raftId(&pSyncNode->myNodeInfo, pSyncNode->vgId, &pSyncNode->myRaftId)) {
+ if (!syncUtilNodeInfo2RaftId(&pSyncNode->myNodeInfo, pSyncNode->vgId, &pSyncNode->myRaftId)) {
sError("vgId:%d, failed to determine my raft member id", pSyncNode->vgId);
goto _error;
}
// init peersNum, peers, peersId
pSyncNode->peersNum = pSyncNode->pRaftCfg->cfg.replicaNum - 1;
- int j = 0;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
+ int32_t j = 0;
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
if (i != pSyncNode->pRaftCfg->cfg.myIndex) {
pSyncNode->peersNodeInfo[j] = pSyncNode->pRaftCfg->cfg.nodeInfo[i];
j++;
}
}
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- if (!syncUtilnodeInfo2raftId(&pSyncNode->peersNodeInfo[i], pSyncNode->vgId, &pSyncNode->peersId[i])) {
+ for (int32_t i = 0; i < pSyncNode->peersNum; ++i) {
+ if (!syncUtilNodeInfo2RaftId(&pSyncNode->peersNodeInfo[i], pSyncNode->vgId, &pSyncNode->peersId[i])) {
sError("vgId:%d, failed to determine raft member id, peer:%d", pSyncNode->vgId, i);
goto _error;
}
@@ -1036,8 +827,8 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
// init replicaNum, replicasId
pSyncNode->replicaNum = pSyncNode->pRaftCfg->cfg.replicaNum;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
- if (!syncUtilnodeInfo2raftId(&pSyncNode->pRaftCfg->cfg.nodeInfo[i], pSyncNode->vgId, &pSyncNode->replicasId[i])) {
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
+ if (!syncUtilNodeInfo2RaftId(&pSyncNode->pRaftCfg->cfg.nodeInfo[i], pSyncNode->vgId, &pSyncNode->replicasId[i])) {
sError("vgId:%d, failed to determine raft member id, replica:%d", pSyncNode->vgId, i);
goto _error;
}
@@ -1124,7 +915,7 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
}
if (snapshot.lastApplyIndex > commitIndex) {
commitIndex = snapshot.lastApplyIndex;
- syncNodeEventLog(pSyncNode, "reset commit index by snapshot");
+ sNTrace(pSyncNode, "reset commit index by snapshot");
}
}
pSyncNode->commitIndex = commitIndex;
@@ -1162,18 +953,6 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
syncHbTimerInit(pSyncNode, &(pSyncNode->peerHeartbeatTimerArr[i]), (pSyncNode->replicasId)[i]);
}
- // init callback
- pSyncNode->FpOnPing = syncNodeOnPing;
- pSyncNode->FpOnPingReply = syncNodeOnPingReply;
- pSyncNode->FpOnClientRequest = syncNodeOnClientRequest;
- pSyncNode->FpOnTimeout = syncNodeOnTimer;
- pSyncNode->FpOnSnapshot = syncNodeOnSnapshot;
- pSyncNode->FpOnSnapshotReply = syncNodeOnSnapshotReply;
- pSyncNode->FpOnRequestVote = syncNodeOnRequestVote;
- pSyncNode->FpOnRequestVoteReply = syncNodeOnRequestVoteReply;
- pSyncNode->FpOnAppendEntries = syncNodeOnAppendEntries;
- pSyncNode->FpOnAppendEntriesReply = syncNodeOnAppendEntriesReply;
-
// tools
pSyncNode->pSyncRespMgr = syncRespMgrCreate(pSyncNode, SYNC_RESP_TTL_MS);
if (pSyncNode->pSyncRespMgr == NULL) {
@@ -1185,10 +964,11 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
pSyncNode->restoreFinish = false;
// snapshot senders
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
SSyncSnapshotSender* pSender = snapshotSenderCreate(pSyncNode, i);
// ASSERT(pSender != NULL);
(pSyncNode->senders)[i] = pSender;
+ sSTrace(pSender, "snapshot sender create new while open, data:%p", pSender);
}
// snapshot receivers
@@ -1215,7 +995,8 @@ SSyncNode* syncNodeOpen(SSyncInfo* pSyncInfo) {
// snapshotting
atomic_store_64(&pSyncNode->snapshottingIndex, SYNC_INDEX_INVALID);
- syncNodeEventLog(pSyncNode, "sync open");
+ pSyncNode->isStart = true;
+ sNTrace(pSyncNode, "sync open, node:%p", pSyncNode);
return pSyncNode;
@@ -1282,16 +1063,15 @@ void syncNodePreClose(SSyncNode* pSyncNode) {
syncNodeStopHeartbeatTimer(pSyncNode);
}
-void syncNodeClose(SSyncNode* pSyncNode) {
- if (pSyncNode == NULL) {
- return;
- }
- int32_t ret;
+void syncHbTimerDataFree(SSyncHbTimerData* pData) { taosMemoryFree(pData); }
- syncNodeEventLog(pSyncNode, "sync close");
+void syncNodeClose(SSyncNode* pSyncNode) {
+ if (pSyncNode == NULL) return;
+ sNTrace(pSyncNode, "sync close, data:%p", pSyncNode);
- ret = raftStoreClose(pSyncNode->pRaftStore);
+ int32_t ret = raftStoreClose(pSyncNode->pRaftStore);
ASSERT(ret == 0);
+ pSyncNode->pRaftStore = NULL;
syncRespMgrDestroy(pSyncNode->pSyncRespMgr);
pSyncNode->pSyncRespMgr = NULL;
@@ -1316,8 +1096,9 @@ void syncNodeClose(SSyncNode* pSyncNode) {
taosMemoryFree(pSyncNode->pFsm);
}
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
if ((pSyncNode->senders)[i] != NULL) {
+ sSTrace((pSyncNode->senders)[i], "snapshot sender destroy while close, data:%p", (pSyncNode->senders)[i]);
snapshotSenderDestroy((pSyncNode->senders)[i]);
(pSyncNode->senders)[i] = NULL;
}
@@ -1331,58 +1112,8 @@ void syncNodeClose(SSyncNode* pSyncNode) {
taosMemoryFree(pSyncNode);
}
-// option
-// bool syncNodeSnapshotEnable(SSyncNode* pSyncNode) { return pSyncNode->pRaftCfg->snapshotEnable; }
-
ESyncStrategy syncNodeStrategy(SSyncNode* pSyncNode) { return pSyncNode->pRaftCfg->snapshotStrategy; }
-// ping --------------
-int32_t syncNodePing(SSyncNode* pSyncNode, const SRaftId* destRaftId, SyncPing* pMsg) {
- syncPingLog2((char*)"==syncNodePing==", pMsg);
- int32_t ret = 0;
-
- SRpcMsg rpcMsg;
- syncPing2RpcMsg(pMsg, &rpcMsg);
- syncRpcMsgLog2((char*)"==syncNodePing==", &rpcMsg);
-
- ret = syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg);
- return ret;
-}
-
-int32_t syncNodePingSelf(SSyncNode* pSyncNode) {
- int32_t ret = 0;
- SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, &pSyncNode->myRaftId, pSyncNode->vgId);
- ret = syncNodePing(pSyncNode, &pMsg->destId, pMsg);
- ASSERT(ret == 0);
-
- syncPingDestroy(pMsg);
- return ret;
-}
-
-int32_t syncNodePingPeers(SSyncNode* pSyncNode) {
- int32_t ret = 0;
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- SRaftId* destId = &(pSyncNode->peersId[i]);
- SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
- ret = syncNodePing(pSyncNode, destId, pMsg);
- ASSERT(ret == 0);
- syncPingDestroy(pMsg);
- }
- return ret;
-}
-
-int32_t syncNodePingAll(SSyncNode* pSyncNode) {
- int32_t ret = 0;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
- SRaftId* destId = &(pSyncNode->replicasId[i]);
- SyncPing* pMsg = syncPingBuild3(&pSyncNode->myRaftId, destId, pSyncNode->vgId);
- ret = syncNodePing(pSyncNode, destId, pMsg);
- ASSERT(ret == 0);
- syncPingDestroy(pMsg);
- }
- return ret;
-}
-
// timer control --------------
int32_t syncNodeStartPingTimer(SSyncNode* pSyncNode) {
int32_t ret = 0;
@@ -1409,12 +1140,13 @@ int32_t syncNodeStartElectTimer(SSyncNode* pSyncNode, int32_t ms) {
if (syncIsInit()) {
pSyncNode->electTimerMS = ms;
- SElectTimer* pElectTimer = taosMemoryMalloc(sizeof(SElectTimer));
- pElectTimer->logicClock = pSyncNode->electTimerLogicClock;
- pElectTimer->pSyncNode = pSyncNode;
- pElectTimer->pData = NULL;
+ int64_t execTime = taosGetTimestampMs() + ms;
+ atomic_store_64(&(pSyncNode->electTimerParam.executeTime), execTime);
+ atomic_store_64(&(pSyncNode->electTimerParam.logicClock), pSyncNode->electTimerLogicClock);
+ pSyncNode->electTimerParam.pSyncNode = pSyncNode;
+ pSyncNode->electTimerParam.pData = NULL;
- taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, pElectTimer, syncEnv()->pTimerManager,
+ taosTmrReset(pSyncNode->FpElectTimerCB, pSyncNode->electTimerMS, pSyncNode, syncEnv()->pTimerManager,
&pSyncNode->pElectTimer);
} else {
@@ -1450,13 +1182,8 @@ int32_t syncNodeResetElectTimer(SSyncNode* pSyncNode) {
}
ret = syncNodeRestartElectTimer(pSyncNode, electMS);
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "reset elect timer, min:%d, max:%d, ms:%d", pSyncNode->electBaseLine,
- 2 * pSyncNode->electBaseLine, electMS);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode, "reset elect timer, min:%d, max:%d, ms:%d", pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine,
+ electMS);
return ret;
}
@@ -1470,12 +1197,7 @@ static int32_t syncNodeDoStartHeartbeatTimer(SSyncNode* pSyncNode) {
sError("vgId:%d, start heartbeat timer error, sync env is stop", pSyncNode->vgId);
}
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "start heartbeat timer, ms:%d", pSyncNode->heartbeatTimerMS);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode, "start heartbeat timer, ms:%d", pSyncNode->heartbeatTimerMS);
return ret;
}
@@ -1487,7 +1209,7 @@ int32_t syncNodeStartHeartbeatTimer(SSyncNode* pSyncNode) {
ret = syncNodeDoStartHeartbeatTimer(pSyncNode);
#endif
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->peersNum; ++i) {
SSyncTimer* pSyncTimer = syncNodeGetHbTimer(pSyncNode, &(pSyncNode->peersId[i]));
if (pSyncTimer != NULL) {
syncHbTimerStart(pSyncNode, pSyncTimer);
@@ -1506,7 +1228,7 @@ int32_t syncNodeStopHeartbeatTimer(SSyncNode* pSyncNode) {
pSyncNode->pHeartbeatTimer = NULL;
#endif
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->peersNum; ++i) {
SSyncTimer* pSyncTimer = syncNodeGetHbTimer(pSyncNode, &(pSyncNode->peersId[i]));
if (pSyncTimer != NULL) {
syncHbTimerStop(pSyncNode, pSyncTimer);
@@ -1525,7 +1247,7 @@ int32_t syncNodeRestartHeartbeatTimer(SSyncNode* pSyncNode) {
// utils --------------
int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, SRpcMsg* pMsg) {
SEpSet epSet;
- syncUtilraftId2EpSet(destRaftId, &epSet);
+ syncUtilRaftId2EpSet(destRaftId, &epSet);
if (pSyncNode->syncSendMSg != NULL) {
// htonl
syncUtilMsgHtoN(pMsg->pCont);
@@ -1534,6 +1256,7 @@ int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, SRp
pSyncNode->syncSendMSg(&epSet, pMsg);
} else {
sError("vgId:%d, sync send msg by id error, fp-send-msg is null", pSyncNode->vgId);
+ rpcFreeCont(pMsg->pCont);
return -1;
}
@@ -1542,7 +1265,7 @@ int32_t syncNodeSendMsgById(const SRaftId* destRaftId, SSyncNode* pSyncNode, SRp
int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, SRpcMsg* pMsg) {
SEpSet epSet;
- syncUtilnodeInfo2EpSet(nodeInfo, &epSet);
+ syncUtilNodeInfo2EpSet(nodeInfo, &epSet);
if (pSyncNode->syncSendMSg != NULL) {
// htonl
syncUtilMsgHtoN(pMsg->pCont);
@@ -1555,353 +1278,11 @@ int32_t syncNodeSendMsgByInfo(const SNodeInfo* nodeInfo, SSyncNode* pSyncNode, S
return 0;
}
-cJSON* syncNode2Json(const SSyncNode* pSyncNode) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pSyncNode != NULL) {
- // init by SSyncInfo
- cJSON_AddNumberToObject(pRoot, "vgId", pSyncNode->vgId);
- cJSON_AddItemToObject(pRoot, "SRaftCfg", raftCfg2Json(pSyncNode->pRaftCfg));
- cJSON_AddStringToObject(pRoot, "path", pSyncNode->path);
- cJSON_AddStringToObject(pRoot, "raftStorePath", pSyncNode->raftStorePath);
- cJSON_AddStringToObject(pRoot, "configPath", pSyncNode->configPath);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->pWal);
- cJSON_AddStringToObject(pRoot, "pWal", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->msgcb);
- cJSON_AddStringToObject(pRoot, "rpcClient", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->syncSendMSg);
- cJSON_AddStringToObject(pRoot, "syncSendMSg", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->msgcb);
- cJSON_AddStringToObject(pRoot, "queue", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->syncEqMsg);
- cJSON_AddStringToObject(pRoot, "syncEqMsg", u64buf);
-
- // init internal
- cJSON* pMe = syncUtilNodeInfo2Json(&pSyncNode->myNodeInfo);
- cJSON_AddItemToObject(pRoot, "myNodeInfo", pMe);
- cJSON* pRaftId = syncUtilRaftId2Json(&pSyncNode->myRaftId);
- cJSON_AddItemToObject(pRoot, "myRaftId", pRaftId);
-
- cJSON_AddNumberToObject(pRoot, "peersNum", pSyncNode->peersNum);
- cJSON* pPeers = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "peersNodeInfo", pPeers);
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- cJSON_AddItemToArray(pPeers, syncUtilNodeInfo2Json(&pSyncNode->peersNodeInfo[i]));
- }
- cJSON* pPeersId = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "peersId", pPeersId);
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- cJSON_AddItemToArray(pPeersId, syncUtilRaftId2Json(&pSyncNode->peersId[i]));
- }
-
- cJSON_AddNumberToObject(pRoot, "replicaNum", pSyncNode->replicaNum);
- cJSON* pReplicasId = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "replicasId", pReplicasId);
- for (int i = 0; i < pSyncNode->replicaNum; ++i) {
- cJSON_AddItemToArray(pReplicasId, syncUtilRaftId2Json(&pSyncNode->replicasId[i]));
- }
-
- // raft algorithm
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->pFsm);
- cJSON_AddStringToObject(pRoot, "pFsm", u64buf);
- cJSON_AddNumberToObject(pRoot, "quorum", pSyncNode->quorum);
- cJSON* pLaderCache = syncUtilRaftId2Json(&pSyncNode->leaderCache);
- cJSON_AddItemToObject(pRoot, "leaderCache", pLaderCache);
-
- // life cycle
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pSyncNode->rid);
- cJSON_AddStringToObject(pRoot, "rid", u64buf);
-
- // tla+ server vars
- cJSON_AddNumberToObject(pRoot, "state", pSyncNode->state);
- cJSON_AddStringToObject(pRoot, "state_str", syncStr(pSyncNode->state));
- cJSON_AddItemToObject(pRoot, "pRaftStore", raftStore2Json(pSyncNode->pRaftStore));
-
- // tla+ candidate vars
- cJSON_AddItemToObject(pRoot, "pVotesGranted", voteGranted2Json(pSyncNode->pVotesGranted));
- cJSON_AddItemToObject(pRoot, "pVotesRespond", votesRespond2Json(pSyncNode->pVotesRespond));
-
- // tla+ leader vars
- cJSON_AddItemToObject(pRoot, "pNextIndex", syncIndexMgr2Json(pSyncNode->pNextIndex));
- cJSON_AddItemToObject(pRoot, "pMatchIndex", syncIndexMgr2Json(pSyncNode->pMatchIndex));
-
- // tla+ log vars
- cJSON_AddItemToObject(pRoot, "pLogStore", logStore2Json(pSyncNode->pLogStore));
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pSyncNode->commitIndex);
- cJSON_AddStringToObject(pRoot, "commitIndex", u64buf);
-
- // timer ms init
- cJSON_AddNumberToObject(pRoot, "pingBaseLine", pSyncNode->pingBaseLine);
- cJSON_AddNumberToObject(pRoot, "electBaseLine", pSyncNode->electBaseLine);
- cJSON_AddNumberToObject(pRoot, "hbBaseLine", pSyncNode->hbBaseLine);
-
- // ping timer
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->pPingTimer);
- cJSON_AddStringToObject(pRoot, "pPingTimer", u64buf);
- cJSON_AddNumberToObject(pRoot, "pingTimerMS", pSyncNode->pingTimerMS);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->pingTimerLogicClock);
- cJSON_AddStringToObject(pRoot, "pingTimerLogicClock", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->pingTimerLogicClockUser);
- cJSON_AddStringToObject(pRoot, "pingTimerLogicClockUser", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpPingTimerCB);
- cJSON_AddStringToObject(pRoot, "FpPingTimerCB", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->pingTimerCounter);
- cJSON_AddStringToObject(pRoot, "pingTimerCounter", u64buf);
-
- // elect timer
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->pElectTimer);
- cJSON_AddStringToObject(pRoot, "pElectTimer", u64buf);
- cJSON_AddNumberToObject(pRoot, "electTimerMS", pSyncNode->electTimerMS);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerLogicClock);
- cJSON_AddStringToObject(pRoot, "electTimerLogicClock", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpElectTimerCB);
- cJSON_AddStringToObject(pRoot, "FpElectTimerCB", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->electTimerCounter);
- cJSON_AddStringToObject(pRoot, "electTimerCounter", u64buf);
-
- // heartbeat timer
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->pHeartbeatTimer);
- cJSON_AddStringToObject(pRoot, "pHeartbeatTimer", u64buf);
- cJSON_AddNumberToObject(pRoot, "heartbeatTimerMS", pSyncNode->heartbeatTimerMS);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->heartbeatTimerLogicClock);
- cJSON_AddStringToObject(pRoot, "heartbeatTimerLogicClock", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->heartbeatTimerLogicClockUser);
- cJSON_AddStringToObject(pRoot, "heartbeatTimerLogicClockUser", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpHeartbeatTimerCB);
- cJSON_AddStringToObject(pRoot, "FpHeartbeatTimerCB", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSyncNode->heartbeatTimerCounter);
- cJSON_AddStringToObject(pRoot, "heartbeatTimerCounter", u64buf);
-
- // callback
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnPing);
- cJSON_AddStringToObject(pRoot, "FpOnPing", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnPingReply);
- cJSON_AddStringToObject(pRoot, "FpOnPingReply", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnRequestVote);
- cJSON_AddStringToObject(pRoot, "FpOnRequestVote", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnRequestVoteReply);
- cJSON_AddStringToObject(pRoot, "FpOnRequestVoteReply", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnAppendEntries);
- cJSON_AddStringToObject(pRoot, "FpOnAppendEntries", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnAppendEntriesReply);
- cJSON_AddStringToObject(pRoot, "FpOnAppendEntriesReply", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSyncNode->FpOnTimeout);
- cJSON_AddStringToObject(pRoot, "FpOnTimeout", u64buf);
-
- // restoreFinish
- cJSON_AddNumberToObject(pRoot, "restoreFinish", pSyncNode->restoreFinish);
-
- // snapshot senders
- cJSON* pSenders = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "senders", pSenders);
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
- cJSON_AddItemToArray(pSenders, snapshotSender2Json((pSyncNode->senders)[i]));
- }
-
- // snapshot receivers
- cJSON* pReceivers = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "receiver", snapshotReceiver2Json(pSyncNode->pNewNodeReceiver));
-
- // changing
- cJSON_AddNumberToObject(pRoot, "changing", pSyncNode->changing);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SSyncNode", pRoot);
- return pJson;
-}
-
-char* syncNode2Str(const SSyncNode* pSyncNode) {
- cJSON* pJson = syncNode2Json(pSyncNode);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-inline void syncNodeEventLog(const SSyncNode* pSyncNode, char* str) {
- if (pSyncNode == NULL) {
- return;
- }
-
- SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
- if (pSyncNode->pFsm != NULL && pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
- pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
- }
-
- SyncIndex logLastIndex = SYNC_INDEX_INVALID;
- SyncIndex logBeginIndex = SYNC_INDEX_INVALID;
- if (pSyncNode->pLogStore != NULL) {
- logLastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
- logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
- }
-
- char* pCfgStr = syncCfg2SimpleStr(&(pSyncNode->pRaftCfg->cfg));
- char* printStr = "";
- if (pCfgStr != NULL) {
- printStr = pCfgStr;
- }
-
- char* peerStateStr = syncNodePeerState2Str(pSyncNode);
- int32_t userStrLen = strlen(str) + strlen(peerStateStr);
-
- if (userStrLen < 256) {
- char logBuf[256 + 256];
- if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
- snprintf(logBuf, sizeof(logBuf),
- "vgId:%d, sync %s %s, tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64
- ", snap:%" PRId64 ", snap-tm:%" PRIu64
- ", sby:%d, "
- "stgy:%d, bch:%d, "
- "r-num:%d, "
- "lcfg:%" PRId64 ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s, %s",
- pSyncNode->vgId, syncStr(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
- pSyncNode->commitIndex, logBeginIndex, logLastIndex, pSyncNode->minMatchIndex, snapshot.lastApplyIndex,
- snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
- pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
- pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
- pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr);
- } else {
- snprintf(logBuf, sizeof(logBuf), "%s", str);
- }
- // sDebug("%s", logBuf);
- // sInfo("%s", logBuf);
- sTrace("%s", logBuf);
-
- } else {
- int len = 256 + userStrLen;
- char* s = (char*)taosMemoryMalloc(len);
- if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
- snprintf(s, len,
- "vgId:%d, sync %s %s, tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64
- ", snap:%" PRId64 ", snap-tm:%" PRIu64
- ", sby:%d, "
- "stgy:%d, bch:%d, "
- "r-num:%d, "
- "lcfg:%" PRId64 ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s, %s",
- pSyncNode->vgId, syncStr(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
- pSyncNode->commitIndex, logBeginIndex, logLastIndex, pSyncNode->minMatchIndex, snapshot.lastApplyIndex,
- snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
- pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
- pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
- pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, peerStateStr, printStr);
- } else {
- snprintf(s, len, "%s", str);
- }
- // sDebug("%s", s);
- // sInfo("%s", s);
- sTrace("%s", s);
- taosMemoryFree(s);
- }
-
- taosMemoryFree(peerStateStr);
- taosMemoryFree(pCfgStr);
-}
-
-inline void syncNodeErrorLog(const SSyncNode* pSyncNode, char* str) {
- if (pSyncNode == NULL) {
- return;
- }
-
- int32_t userStrLen = strlen(str);
-
- SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
- if (pSyncNode->pFsm != NULL && pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
- pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
- }
-
- SyncIndex logLastIndex = SYNC_INDEX_INVALID;
- SyncIndex logBeginIndex = SYNC_INDEX_INVALID;
- if (pSyncNode->pLogStore != NULL) {
- logLastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
- logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
- }
-
- char* pCfgStr = syncCfg2SimpleStr(&(pSyncNode->pRaftCfg->cfg));
- char* printStr = "";
- if (pCfgStr != NULL) {
- printStr = pCfgStr;
- }
-
- if (userStrLen < 256) {
- char logBuf[256 + 256];
- if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
- snprintf(logBuf, sizeof(logBuf),
- "vgId:%d, sync %s %s, tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64
- ", snap:%" PRId64 ", snap-tm:%" PRIu64
- ", sby:%d, "
- "stgy:%d, bch:%d, "
- "r-num:%d, "
- "lcfg:%" PRId64 ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s",
- pSyncNode->vgId, syncStr(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
- pSyncNode->commitIndex, logBeginIndex, logLastIndex, pSyncNode->minMatchIndex, snapshot.lastApplyIndex,
- snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
- pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
- pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
- pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, printStr);
- } else {
- snprintf(logBuf, sizeof(logBuf), "%s", str);
- }
- sError("%s", logBuf);
-
- } else {
- int len = 256 + userStrLen;
- char* s = (char*)taosMemoryMalloc(len);
- if (pSyncNode != NULL && pSyncNode->pRaftCfg != NULL && pSyncNode->pRaftStore != NULL) {
- snprintf(s, len,
- "vgId:%d, sync %s %s, tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64
- ", snap:%" PRId64 ", snap-tm:%" PRIu64
- ", sby:%d, "
- "stgy:%d, bch:%d, "
- "r-num:%d, "
- "lcfg:%" PRId64 ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s",
- pSyncNode->vgId, syncStr(pSyncNode->state), str, pSyncNode->pRaftStore->currentTerm,
- pSyncNode->commitIndex, logBeginIndex, logLastIndex, pSyncNode->minMatchIndex, snapshot.lastApplyIndex,
- snapshot.lastApplyTerm, pSyncNode->pRaftCfg->isStandBy, pSyncNode->pRaftCfg->snapshotStrategy,
- pSyncNode->pRaftCfg->batchSize, pSyncNode->replicaNum, pSyncNode->pRaftCfg->lastConfigIndex,
- pSyncNode->changing, pSyncNode->restoreFinish, syncNodeDynamicQuorum(pSyncNode),
- pSyncNode->electTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser, printStr);
- } else {
- snprintf(s, len, "%s", str);
- }
- sError("%s", s);
- taosMemoryFree(s);
- }
-
- taosMemoryFree(pCfgStr);
-}
-
-inline char* syncNode2SimpleStr(const SSyncNode* pSyncNode) {
- int len = 256;
- char* s = (char*)taosMemoryMalloc(len);
-
- SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
- if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
- pSyncNode->pFsm->FpGetSnapshotInfo(pSyncNode->pFsm, &snapshot);
- }
- SyncIndex logLastIndex = pSyncNode->pLogStore->syncLogLastIndex(pSyncNode->pLogStore);
- SyncIndex logBeginIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
-
- snprintf(s, len,
- "vgId:%d, sync %s, tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", snap:%" PRId64
- ", sby:%d, "
- "r-num:%d, "
- "lcfg:%" PRId64 ", chging:%d, rsto:%d",
- pSyncNode->vgId, syncStr(pSyncNode->state), pSyncNode->pRaftStore->currentTerm, pSyncNode->commitIndex,
- logBeginIndex, logLastIndex, snapshot.lastApplyIndex, pSyncNode->pRaftCfg->isStandBy, pSyncNode->replicaNum,
- pSyncNode->pRaftCfg->lastConfigIndex, pSyncNode->changing, pSyncNode->restoreFinish);
-
- return s;
-}
-
inline bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config) {
bool b1 = false;
bool b2 = false;
- for (int i = 0; i < config->replicaNum; ++i) {
+ for (int32_t i = 0; i < config->replicaNum; ++i) {
if (strcmp((config->nodeInfo)[i].nodeFqdn, pSyncNode->myNodeInfo.nodeFqdn) == 0 &&
(config->nodeInfo)[i].nodePort == pSyncNode->myNodeInfo.nodePort) {
b1 = true;
@@ -1909,7 +1290,7 @@ inline bool syncNodeInConfig(SSyncNode* pSyncNode, const SSyncCfg* config) {
}
}
- for (int i = 0; i < config->replicaNum; ++i) {
+ for (int32_t i = 0; i < config->replicaNum; ++i) {
SRaftId raftId;
raftId.addr = syncUtilAddr2U64((config->nodeInfo)[i].nodeFqdn, (config->nodeInfo)[i].nodePort);
raftId.vgId = pSyncNode->vgId;
@@ -1966,15 +1347,11 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
}
// log begin config change
- do {
- char eventLog[256];
- char* pOldCfgStr = syncCfg2SimpleStr(&oldConfig);
- char* pNewCfgStr = syncCfg2SimpleStr(pNewConfig);
- snprintf(eventLog, sizeof(eventLog), "begin do config change, from %s to %s", pOldCfgStr, pNewCfgStr);
- syncNodeEventLog(pSyncNode, eventLog);
- taosMemoryFree(pOldCfgStr);
- taosMemoryFree(pNewCfgStr);
- } while (0);
+ char oldCfgStr[1024] = {0};
+ char newCfgStr[1024] = {0};
+ syncCfg2SimpleStr(&oldConfig, oldCfgStr, sizeof(oldCfgStr));
+ syncCfg2SimpleStr(pNewConfig, oldCfgStr, sizeof(oldCfgStr));
+ sNTrace(pSyncNode, "begin do config change, from %s to %s", oldCfgStr, oldCfgStr);
if (IamInNew) {
pSyncNode->pRaftCfg->isStandBy = 0; // change isStandBy to normal
@@ -1995,35 +1372,32 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
SRaftId oldReplicasId[TSDB_MAX_REPLICA];
memcpy(oldReplicasId, pSyncNode->replicasId, sizeof(oldReplicasId));
SSyncSnapshotSender* oldSenders[TSDB_MAX_REPLICA];
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
oldSenders[i] = (pSyncNode->senders)[i];
-
- char* eventLog = snapshotSender2SimpleStr(oldSenders[i], "snapshot sender save old");
- syncNodeEventLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
+ sSTrace(oldSenders[i], "snapshot sender save old");
}
// init internal
pSyncNode->myNodeInfo = pSyncNode->pRaftCfg->cfg.nodeInfo[pSyncNode->pRaftCfg->cfg.myIndex];
- syncUtilnodeInfo2raftId(&pSyncNode->myNodeInfo, pSyncNode->vgId, &pSyncNode->myRaftId);
+ syncUtilNodeInfo2RaftId(&pSyncNode->myNodeInfo, pSyncNode->vgId, &pSyncNode->myRaftId);
// init peersNum, peers, peersId
pSyncNode->peersNum = pSyncNode->pRaftCfg->cfg.replicaNum - 1;
- int j = 0;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
+ int32_t j = 0;
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
if (i != pSyncNode->pRaftCfg->cfg.myIndex) {
pSyncNode->peersNodeInfo[j] = pSyncNode->pRaftCfg->cfg.nodeInfo[i];
j++;
}
}
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
- syncUtilnodeInfo2raftId(&pSyncNode->peersNodeInfo[i], pSyncNode->vgId, &pSyncNode->peersId[i]);
+ for (int32_t i = 0; i < pSyncNode->peersNum; ++i) {
+ syncUtilNodeInfo2RaftId(&pSyncNode->peersNodeInfo[i], pSyncNode->vgId, &pSyncNode->peersId[i]);
}
// init replicaNum, replicasId
pSyncNode->replicaNum = pSyncNode->pRaftCfg->cfg.replicaNum;
- for (int i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
- syncUtilnodeInfo2raftId(&pSyncNode->pRaftCfg->cfg.nodeInfo[i], pSyncNode->vgId, &pSyncNode->replicasId[i]);
+ for (int32_t i = 0; i < pSyncNode->pRaftCfg->cfg.replicaNum; ++i) {
+ syncUtilNodeInfo2RaftId(&pSyncNode->pRaftCfg->cfg.nodeInfo[i], pSyncNode->vgId, &pSyncNode->replicasId[i]);
}
// update quorum first
@@ -2037,26 +1411,21 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
// reset snapshot senders
// clear new
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
(pSyncNode->senders)[i] = NULL;
}
// reset new
- for (int i = 0; i < pSyncNode->replicaNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->replicaNum; ++i) {
// reset sender
bool reset = false;
- for (int j = 0; j < TSDB_MAX_REPLICA; ++j) {
- if (syncUtilSameId(&(pSyncNode->replicasId)[i], &oldReplicasId[j])) {
+ for (int32_t j = 0; j < TSDB_MAX_REPLICA; ++j) {
+ if (syncUtilSameId(&(pSyncNode->replicasId)[i], &oldReplicasId[j]) && oldSenders[j] != NULL) {
char host[128];
uint16_t port;
syncUtilU642Addr((pSyncNode->replicasId)[i].addr, host, sizeof(host), &port);
-
- do {
- char eventLog[256];
- snprintf(eventLog, sizeof(eventLog), "snapshot sender reset for: %" PRIu64 ", newIndex:%d, %s:%d, %p",
- (pSyncNode->replicasId)[i].addr, i, host, port, oldSenders[j]);
- syncNodeEventLog(pSyncNode, eventLog);
- } while (0);
+ sNTrace(pSyncNode, "snapshot sender reset for: %" PRId64 ", newIndex:%d, %s:%d, %p",
+ (pSyncNode->replicasId)[i].addr, i, host, port, oldSenders[j]);
(pSyncNode->senders)[i] = oldSenders[j];
oldSenders[j] = NULL;
@@ -2066,39 +1435,29 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
int32_t oldreplicaIndex = (pSyncNode->senders)[i]->replicaIndex;
(pSyncNode->senders)[i]->replicaIndex = i;
- do {
- char eventLog[256];
- snprintf(eventLog, sizeof(eventLog),
- "snapshot sender udpate replicaIndex from %d to %d, %s:%d, %p, reset:%d", oldreplicaIndex, i, host,
- port, (pSyncNode->senders)[i], reset);
- syncNodeEventLog(pSyncNode, eventLog);
- } while (0);
+ sNTrace(pSyncNode, "snapshot sender udpate replicaIndex from %d to %d, %s:%d, %p, reset:%d", oldreplicaIndex,
+ i, host, port, (pSyncNode->senders)[i], reset);
+
+ break;
}
}
}
// create new
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
if ((pSyncNode->senders)[i] == NULL) {
(pSyncNode->senders)[i] = snapshotSenderCreate(pSyncNode, i);
-
- char* eventLog = snapshotSender2SimpleStr((pSyncNode->senders)[i], "snapshot sender create new");
- syncNodeEventLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
+ sSTrace((pSyncNode->senders)[i], "snapshot sender create new while reconfig, data:%p", (pSyncNode->senders)[i]);
+ } else {
+ sSTrace((pSyncNode->senders)[i], "snapshot sender already exist, data:%p", (pSyncNode->senders)[i]);
}
}
// free old
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
if (oldSenders[i] != NULL) {
+ sNTrace(pSyncNode, "snapshot sender destroy old, data:%p replica-index:%d", oldSenders[i], i);
snapshotSenderDestroy(oldSenders[i]);
-
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "snapshot sender delete old %p replica-index:%d", oldSenders[i], i);
- syncNodeEventLog(pSyncNode, eventLog);
- } while (0);
-
oldSenders[i] = NULL;
}
}
@@ -2106,13 +1465,9 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
// persist cfg
raftCfgPersist(pSyncNode->pRaftCfg);
- char tmpbuf[512];
- char* oldStr = syncCfg2SimpleStr(&oldConfig);
- char* newStr = syncCfg2SimpleStr(pNewConfig);
+ char tmpbuf[1024] = {0};
snprintf(tmpbuf, sizeof(tmpbuf), "config change from %d to %d, index:%" PRId64 ", %s --> %s",
- oldConfig.replicaNum, pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr);
- taosMemoryFree(oldStr);
- taosMemoryFree(newStr);
+ oldConfig.replicaNum, pNewConfig->replicaNum, lastConfigChangeIndex, oldCfgStr, newCfgStr);
// change isStandBy to normal (election timeout)
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
@@ -2128,30 +1483,13 @@ void syncNodeDoConfigChange(SSyncNode* pSyncNode, SSyncCfg* pNewConfig, SyncInde
} else {
// persist cfg
raftCfgPersist(pSyncNode->pRaftCfg);
-
- char tmpbuf[512];
- char* oldStr = syncCfg2SimpleStr(&oldConfig);
- char* newStr = syncCfg2SimpleStr(pNewConfig);
- snprintf(tmpbuf, sizeof(tmpbuf), "do not config change from %d to %d, index:%" PRId64 ", %s --> %s",
- oldConfig.replicaNum, pNewConfig->replicaNum, lastConfigChangeIndex, oldStr, newStr);
- taosMemoryFree(oldStr);
- taosMemoryFree(newStr);
- syncNodeEventLog(pSyncNode, tmpbuf);
+ sNTrace(pSyncNode, "do not config change from %d to %d, index:%" PRId64 ", %s --> %s", oldConfig.replicaNum,
+ pNewConfig->replicaNum, lastConfigChangeIndex, oldCfgStr, newCfgStr);
}
_END:
-
// log end config change
- do {
- char eventLog[256];
- char* pOldCfgStr = syncCfg2SimpleStr(&oldConfig);
- char* pNewCfgStr = syncCfg2SimpleStr(pNewConfig);
- snprintf(eventLog, sizeof(eventLog), "end do config change, from %s to %s", pOldCfgStr, pNewCfgStr);
- syncNodeEventLog(pSyncNode, eventLog);
- taosMemoryFree(pOldCfgStr);
- taosMemoryFree(pNewCfgStr);
- } while (0);
- return;
+ sNTrace(pSyncNode, "end do config change, from %s to %s", oldCfgStr, newCfgStr);
}
// raft state change --------------
@@ -2159,7 +1497,7 @@ void syncNodeUpdateTerm(SSyncNode* pSyncNode, SyncTerm term) {
if (term > pSyncNode->pRaftStore->currentTerm) {
raftStoreSetTerm(pSyncNode->pRaftStore, term);
char tmpBuf[64];
- snprintf(tmpBuf, sizeof(tmpBuf), "update term to %" PRIu64, term);
+ snprintf(tmpBuf, sizeof(tmpBuf), "update term to %" PRId64, term);
syncNodeBecomeFollower(pSyncNode, tmpBuf);
raftStoreClearVote(pSyncNode->pRaftStore);
}
@@ -2173,24 +1511,20 @@ void syncNodeUpdateTermWithoutStepDown(SSyncNode* pSyncNode, SyncTerm term) {
void syncNodeStepDown(SSyncNode* pSyncNode, SyncTerm newTerm) {
if (pSyncNode->pRaftStore->currentTerm > newTerm) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "step down, ignore, new-term:%" PRIu64 ", current-term:%" PRIu64, newTerm,
- pSyncNode->pRaftStore->currentTerm);
- syncNodeEventLog(pSyncNode, logBuf);
+ sNTrace(pSyncNode, "step down, ignore, new-term:%" PRId64 ", current-term:%" PRId64, newTerm,
+ pSyncNode->pRaftStore->currentTerm);
return;
}
do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "step down, new-term:%" PRIu64 ", current-term:%" PRIu64, newTerm,
- pSyncNode->pRaftStore->currentTerm);
- syncNodeEventLog(pSyncNode, logBuf);
+ sNTrace(pSyncNode, "step down, new-term:%" PRId64 ", current-term:%" PRId64, newTerm,
+ pSyncNode->pRaftStore->currentTerm);
} while (0);
if (pSyncNode->pRaftStore->currentTerm < newTerm) {
raftStoreSetTerm(pSyncNode->pRaftStore, newTerm);
char tmpBuf[64];
- snprintf(tmpBuf, sizeof(tmpBuf), "step down, update term to %" PRIu64, newTerm);
+ snprintf(tmpBuf, sizeof(tmpBuf), "step down, update term to %" PRId64, newTerm);
syncNodeBecomeFollower(pSyncNode, tmpBuf);
raftStoreClearVote(pSyncNode->pRaftStore);
@@ -2228,19 +1562,7 @@ void syncNodeBecomeFollower(SSyncNode* pSyncNode, const char* debugStr) {
pSyncNode->minMatchIndex = SYNC_INDEX_INVALID;
// trace log
- do {
- int32_t debugStrLen = strlen(debugStr);
- if (debugStrLen < 256) {
- char eventLog[256 + 64];
- snprintf(eventLog, sizeof(eventLog), "become follower %s", debugStr);
- syncNodeEventLog(pSyncNode, eventLog);
- } else {
- char* eventLog = taosMemoryMalloc(debugStrLen + 64);
- snprintf(eventLog, debugStrLen, "become follower %s", debugStr);
- syncNodeEventLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- }
- } while (0);
+ sNTrace(pSyncNode, "become follower %s", debugStr);
}
// TLA+ Spec
@@ -2273,7 +1595,7 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
// set leader cache
pSyncNode->leaderCache = pSyncNode->myRaftId;
- for (int i = 0; i < pSyncNode->pNextIndex->replicaNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->pNextIndex->replicaNum; ++i) {
// maybe overwrite myself, no harm
// just do it!
@@ -2287,7 +1609,7 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
pSyncNode->pNextIndex->index[i] = lastIndex + 1;
}
- for (int i = 0; i < pSyncNode->pMatchIndex->replicaNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->pMatchIndex->replicaNum; ++i) {
// maybe overwrite myself, no harm
// just do it!
pSyncNode->pMatchIndex->index[i] = SYNC_INDEX_INVALID;
@@ -2300,7 +1622,7 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
// update sender private term
SSyncSnapshotSender* pMySender = syncNodeGetSnapshotSender(pSyncNode, &(pSyncNode->myRaftId));
if (pMySender != NULL) {
- for (int i = 0; i < pSyncNode->pMatchIndex->replicaNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->pMatchIndex->replicaNum; ++i) {
if ((pSyncNode->senders)[i]->privateTerm > pMySender->privateTerm) {
pMySender->privateTerm = (pSyncNode->senders)[i]->privateTerm;
}
@@ -2332,19 +1654,7 @@ void syncNodeBecomeLeader(SSyncNode* pSyncNode, const char* debugStr) {
pSyncNode->minMatchIndex = SYNC_INDEX_INVALID;
// trace log
- do {
- int32_t debugStrLen = strlen(debugStr);
- if (debugStrLen < 256) {
- char eventLog[256 + 64];
- snprintf(eventLog, sizeof(eventLog), "become leader %s", debugStr);
- syncNodeEventLog(pSyncNode, eventLog);
- } else {
- char* eventLog = taosMemoryMalloc(debugStrLen + 64);
- snprintf(eventLog, debugStrLen, "become leader %s", debugStr);
- syncNodeEventLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- }
- } while (0);
+ sNTrace(pSyncNode, "become leader %s", debugStr);
}
void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
@@ -2352,7 +1662,7 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
ASSERT(voteGrantedMajority(pSyncNode->pVotesGranted));
syncNodeBecomeLeader(pSyncNode, "candidate to leader");
- syncNodeLog2("==state change syncNodeCandidate2Leader==", pSyncNode);
+ sNTrace(pSyncNode, "state change syncNodeCandidate2Leader");
// Raft 3.6.2 Committing entries from previous terms
syncNodeAppendNoop(pSyncNode);
@@ -2366,7 +1676,7 @@ void syncNodeCandidate2Leader(SSyncNode* pSyncNode) {
bool syncNodeIsMnode(SSyncNode* pSyncNode) { return (pSyncNode->vgId == 1); }
int32_t syncNodePeerStateInit(SSyncNode* pSyncNode) {
- for (int i = 0; i < TSDB_MAX_REPLICA; ++i) {
+ for (int32_t i = 0; i < TSDB_MAX_REPLICA; ++i) {
pSyncNode->peerStates[i].lastSendIndex = SYNC_INDEX_INVALID;
pSyncNode->peerStates[i].lastSendTime = 0;
}
@@ -2377,26 +1687,21 @@ int32_t syncNodePeerStateInit(SSyncNode* pSyncNode) {
void syncNodeFollower2Candidate(SSyncNode* pSyncNode) {
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER);
pSyncNode->state = TAOS_SYNC_STATE_CANDIDATE;
-
- syncNodeEventLog(pSyncNode, "follower to candidate");
+ sNTrace(pSyncNode, "follower to candidate");
}
void syncNodeLeader2Follower(SSyncNode* pSyncNode) {
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_LEADER);
syncNodeBecomeFollower(pSyncNode, "leader to follower");
-
- syncNodeEventLog(pSyncNode, "leader to follower");
+ sNTrace(pSyncNode, "leader to follower");
}
void syncNodeCandidate2Follower(SSyncNode* pSyncNode) {
ASSERT(pSyncNode->state == TAOS_SYNC_STATE_CANDIDATE);
syncNodeBecomeFollower(pSyncNode, "candidate to follower");
-
- syncNodeEventLog(pSyncNode, "candidate to follower");
+ sNTrace(pSyncNode, "candidate to follower");
}
-// raft vote --------------
-
// just called by syncNodeVoteForSelf
// need assert
void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId) {
@@ -2408,9 +1713,13 @@ void syncNodeVoteForTerm(SSyncNode* pSyncNode, SyncTerm term, SRaftId* pRaftId)
// simulate get vote from outside
void syncNodeVoteForSelf(SSyncNode* pSyncNode) {
- syncNodeVoteForTerm(pSyncNode, pSyncNode->pRaftStore->currentTerm, &(pSyncNode->myRaftId));
+ syncNodeVoteForTerm(pSyncNode, pSyncNode->pRaftStore->currentTerm, &pSyncNode->myRaftId);
- SyncRequestVoteReply* pMsg = syncRequestVoteReplyBuild(pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ int32_t ret = syncBuildRequestVoteReply(&rpcMsg, pSyncNode->vgId);
+ if (ret != 0) return;
+
+ SyncRequestVoteReply* pMsg = rpcMsg.pCont;
pMsg->srcId = pSyncNode->myRaftId;
pMsg->destId = pSyncNode->myRaftId;
pMsg->term = pSyncNode->pRaftStore->currentTerm;
@@ -2418,11 +1727,9 @@ void syncNodeVoteForSelf(SSyncNode* pSyncNode) {
voteGrantedVote(pSyncNode->pVotesGranted, pMsg);
votesRespondAdd(pSyncNode->pVotesRespond, pMsg);
- syncRequestVoteReplyDestroy(pMsg);
+ rpcFreeCont(rpcMsg.pCont);
}
-// snapshot --------------
-
// return if has a snapshot
bool syncNodeHasSnapshot(SSyncNode* pSyncNode) {
bool ret = false;
@@ -2512,10 +1819,24 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
return 0;
}
- SyncTerm preTerm = 0;
- SyncIndex preIndex = index - 1;
+ SyncTerm preTerm = 0;
+ SyncIndex preIndex = index - 1;
+
SSyncRaftEntry* pPreEntry = NULL;
- int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, preIndex, &pPreEntry);
+ SLRUCache* pCache = pSyncNode->pLogStore->pCache;
+ LRUHandle* h = taosLRUCacheLookup(pCache, &preIndex, sizeof(preIndex));
+ int32_t code = 0;
+ if (h) {
+ pPreEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h);
+ code = 0;
+
+ sNTrace(pSyncNode, "hit cache index:%" PRId64 ", bytes:%u, %p", preIndex, pPreEntry->bytes, pPreEntry);
+
+ } else {
+ sNTrace(pSyncNode, "miss cache index:%" PRId64, preIndex);
+
+ code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, preIndex, &pPreEntry);
+ }
SSnapshot snapshot = {.data = NULL,
.lastApplyIndex = SYNC_INDEX_INVALID,
@@ -2525,7 +1846,13 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
if (code == 0) {
ASSERT(pPreEntry != NULL);
preTerm = pPreEntry->term;
- taosMemoryFree(pPreEntry);
+
+ if (h) {
+ taosLRUCacheRelease(pCache, h, false);
+ } else {
+ syncEntryDestory(pPreEntry);
+ }
+
return preTerm;
} else {
if (pSyncNode->pFsm->FpGetSnapshotInfo != NULL) {
@@ -2536,14 +1863,8 @@ SyncTerm syncNodeGetPreTerm(SSyncNode* pSyncNode, SyncIndex index) {
}
}
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "sync node get pre term error, index:%" PRId64 ", snap-index:%" PRId64 ", snap-term:%" PRIu64, index,
- snapshot.lastApplyIndex, snapshot.lastApplyTerm);
- syncNodeErrorLog(pSyncNode, logBuf);
- } while (0);
-
+ sNError(pSyncNode, "sync node get pre term error, index:%" PRId64 ", snap-index:%" PRId64 ", snap-term:%" PRId64,
+ index, snapshot.lastApplyIndex, snapshot.lastApplyTerm);
return SYNC_TERM_INVALID;
}
@@ -2554,178 +1875,156 @@ int32_t syncNodeGetPreIndexTerm(SSyncNode* pSyncNode, SyncIndex index, SyncIndex
return 0;
}
-// for debug --------------
-void syncNodePrint(SSyncNode* pObj) {
- char* serialized = syncNode2Str(pObj);
- printf("syncNodePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
+static void syncNodeEqPingTimer(void* param, void* tmrId) {
+ if (!syncIsInit()) return;
-void syncNodePrint2(char* s, SSyncNode* pObj) {
- char* serialized = syncNode2Str(pObj);
- printf("syncNodePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
+ SSyncNode* pNode = param;
+ if (atomic_load_64(&pNode->pingTimerLogicClockUser) <= atomic_load_64(&pNode->pingTimerLogicClock)) {
+ SRpcMsg rpcMsg = {0};
+ int32_t code = syncBuildTimeout(&rpcMsg, SYNC_TIMEOUT_PING, atomic_load_64(&pNode->pingTimerLogicClock),
+ pNode->pingTimerMS, pNode);
+ if (code != 0) {
+ sError("failed to build ping msg");
+ rpcFreeCont(rpcMsg.pCont);
+ return;
+ }
-void syncNodeLog(SSyncNode* pObj) {
- char* serialized = syncNode2Str(pObj);
- sTraceLong("syncNodeLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
+ sTrace("enqueue ping msg");
+ code = pNode->syncEqMsg(pNode->msgcb, &rpcMsg);
+ if (code != 0) {
+ sError("failed to sync enqueue ping msg since %s", terrstr());
+ rpcFreeCont(rpcMsg.pCont);
+ return;
+ }
-void syncNodeLog2(char* s, SSyncNode* pObj) {
- if (gRaftDetailLog) {
- char* serialized = syncNode2Str(pObj);
- sTraceLong("syncNodeLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
+ taosTmrReset(syncNodeEqPingTimer, pNode->pingTimerMS, pNode, syncEnv()->pTimerManager, &pNode->pPingTimer);
}
}
-void syncNodeLog3(char* s, SSyncNode* pObj) {
- char* serialized = syncNode2Str(pObj);
- sTraceLong("syncNodeLog3 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
+static void syncNodeEqElectTimer(void* param, void* tmrId) {
+ if (!syncIsInit()) return;
-// ------ local funciton ---------
-// enqueue message ----
-static void syncNodeEqPingTimer(void* param, void* tmrId) {
- SSyncNode* pSyncNode = (SSyncNode*)param;
- if (atomic_load_64(&pSyncNode->pingTimerLogicClockUser) <= atomic_load_64(&pSyncNode->pingTimerLogicClock)) {
- SyncTimeout* pSyncMsg = syncTimeoutBuild2(SYNC_TIMEOUT_PING, atomic_load_64(&pSyncNode->pingTimerLogicClock),
- pSyncNode->pingTimerMS, pSyncNode->vgId, pSyncNode);
- SRpcMsg rpcMsg;
- syncTimeout2RpcMsg(pSyncMsg, &rpcMsg);
- syncRpcMsgLog2((char*)"==syncNodeEqPingTimer==", &rpcMsg);
- if (pSyncNode->syncEqMsg != NULL) {
- int32_t code = pSyncNode->syncEqMsg(pSyncNode->msgcb, &rpcMsg);
- if (code != 0) {
- sError("vgId:%d, sync enqueue ping msg error, code:%d", pSyncNode->vgId, code);
- rpcFreeCont(rpcMsg.pCont);
- syncTimeoutDestroy(pSyncMsg);
- return;
- }
- } else {
- sTrace("syncNodeEqPingTimer pSyncNode->syncEqMsg is NULL");
- }
- syncTimeoutDestroy(pSyncMsg);
+ SSyncNode* pNode = (SSyncNode*)param;
- if (syncIsInit()) {
- taosTmrReset(syncNodeEqPingTimer, pSyncNode->pingTimerMS, pSyncNode, syncEnv()->pTimerManager,
- &pSyncNode->pPingTimer);
- } else {
- sError("sync env is stop, syncNodeEqPingTimer");
- }
+ if (pNode == NULL) return;
+ if (pNode->syncEqMsg == NULL) return;
- } else {
- sTrace("==syncNodeEqPingTimer== pingTimerLogicClock:%" PRIu64 ", pingTimerLogicClockUser:%" PRIu64,
- pSyncNode->pingTimerLogicClock, pSyncNode->pingTimerLogicClockUser);
- }
-}
+ int64_t tsNow = taosGetTimestampMs();
+ if (tsNow < pNode->electTimerParam.executeTime) return;
-static void syncNodeEqElectTimer(void* param, void* tmrId) {
- SElectTimer* pElectTimer = (SElectTimer*)param;
- SSyncNode* pSyncNode = pElectTimer->pSyncNode;
-
- SyncTimeout* pSyncMsg = syncTimeoutBuild2(SYNC_TIMEOUT_ELECTION, pElectTimer->logicClock, pSyncNode->electTimerMS,
- pSyncNode->vgId, pSyncNode);
- SRpcMsg rpcMsg;
- syncTimeout2RpcMsg(pSyncMsg, &rpcMsg);
- if (pSyncNode->syncEqMsg != NULL && pSyncNode->msgcb != NULL && pSyncNode->msgcb->putToQueueFp != NULL) {
- int32_t code = pSyncNode->syncEqMsg(pSyncNode->msgcb, &rpcMsg);
- if (code != 0) {
- sError("vgId:%d, sync enqueue elect msg error, code:%d", pSyncNode->vgId, code);
- rpcFreeCont(rpcMsg.pCont);
- syncTimeoutDestroy(pSyncMsg);
- taosMemoryFree(pElectTimer);
- return;
- }
+ SRpcMsg rpcMsg = {0};
+ int32_t code =
+ syncBuildTimeout(&rpcMsg, SYNC_TIMEOUT_ELECTION, pNode->electTimerParam.logicClock, pNode->electTimerMS, pNode);
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "eq elect timer lc:%" PRIu64, pSyncMsg->logicClock);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
+ if (code != 0) {
+ sError("failed to build elect msg");
- } else {
- sTrace("syncNodeEqElectTimer syncEqMsg is NULL");
+ return;
}
- syncTimeoutDestroy(pSyncMsg);
- taosMemoryFree(pElectTimer);
+ SyncTimeout* pTimeout = rpcMsg.pCont;
+ sNTrace(pNode, "enqueue elect msg lc:%" PRId64, pTimeout->logicClock);
-#if 0
- // reset timer ms
- if (syncIsInit() && pSyncNode->electBaseLine > 0) {
- pSyncNode->electTimerMS = syncUtilElectRandomMS(pSyncNode->electBaseLine, 2 * pSyncNode->electBaseLine);
- taosTmrReset(syncNodeEqElectTimer, pSyncNode->electTimerMS, pSyncNode, syncEnv()->pTimerManager,
- &pSyncNode->pElectTimer);
- } else {
- sError("sync env is stop, syncNodeEqElectTimer");
+ code = pNode->syncEqMsg(pNode->msgcb, &rpcMsg);
+ if (code != 0) {
+ sError("failed to sync enqueue elect msg since %s", terrstr());
+ rpcFreeCont(rpcMsg.pCont);
+
+ return;
}
-#endif
}
static void syncNodeEqHeartbeatTimer(void* param, void* tmrId) {
- SSyncNode* pSyncNode = (SSyncNode*)param;
+ if (!syncIsInit()) return;
- syncNodeEventLog(pSyncNode, "eq hb timer");
+ SSyncNode* pNode = param;
+ if (pNode->replicaNum > 1) {
+ if (atomic_load_64(&pNode->heartbeatTimerLogicClockUser) <= atomic_load_64(&pNode->heartbeatTimerLogicClock)) {
+ SRpcMsg rpcMsg = {0};
+ int32_t code = syncBuildTimeout(&rpcMsg, SYNC_TIMEOUT_HEARTBEAT, atomic_load_64(&pNode->heartbeatTimerLogicClock),
+ pNode->heartbeatTimerMS, pNode);
- if (pSyncNode->replicaNum > 1) {
- if (atomic_load_64(&pSyncNode->heartbeatTimerLogicClockUser) <=
- atomic_load_64(&pSyncNode->heartbeatTimerLogicClock)) {
- SyncTimeout* pSyncMsg =
- syncTimeoutBuild2(SYNC_TIMEOUT_HEARTBEAT, atomic_load_64(&pSyncNode->heartbeatTimerLogicClock),
- pSyncNode->heartbeatTimerMS, pSyncNode->vgId, pSyncNode);
- SRpcMsg rpcMsg;
- syncTimeout2RpcMsg(pSyncMsg, &rpcMsg);
- syncRpcMsgLog2((char*)"==syncNodeEqHeartbeatTimer==", &rpcMsg);
- if (pSyncNode->syncEqMsg != NULL) {
- int32_t code = pSyncNode->syncEqMsg(pSyncNode->msgcb, &rpcMsg);
- if (code != 0) {
- sError("vgId:%d, sync enqueue timer msg error, code:%d", pSyncNode->vgId, code);
- rpcFreeCont(rpcMsg.pCont);
- syncTimeoutDestroy(pSyncMsg);
- return;
- }
- } else {
- sError("vgId:%d, enqueue msg cb ptr (i.e. syncEqMsg) not set.", pSyncNode->vgId);
+ if (code != 0) {
+ sError("failed to build heartbeat msg");
+ return;
}
- syncTimeoutDestroy(pSyncMsg);
- if (syncIsInit()) {
- taosTmrReset(syncNodeEqHeartbeatTimer, pSyncNode->heartbeatTimerMS, pSyncNode, syncEnv()->pTimerManager,
- &pSyncNode->pHeartbeatTimer);
- } else {
- sError("sync env is stop, syncNodeEqHeartbeatTimer");
+ sTrace("enqueue heartbeat timer");
+ code = pNode->syncEqMsg(pNode->msgcb, &rpcMsg);
+ if (code != 0) {
+ sError("failed to enqueue heartbeat msg since %s", terrstr());
+ rpcFreeCont(rpcMsg.pCont);
+ return;
}
+
+ taosTmrReset(syncNodeEqHeartbeatTimer, pNode->heartbeatTimerMS, pNode, syncEnv()->pTimerManager,
+ &pNode->pHeartbeatTimer);
+
} else {
- sTrace("==syncNodeEqHeartbeatTimer== heartbeatTimerLogicClock:%" PRIu64 ", heartbeatTimerLogicClockUser:%" PRIu64
- "",
- pSyncNode->heartbeatTimerLogicClock, pSyncNode->heartbeatTimerLogicClockUser);
+ sTrace("==syncNodeEqHeartbeatTimer== heartbeatTimerLogicClock:%" PRId64 ", heartbeatTimerLogicClockUser:%" PRId64,
+ pNode->heartbeatTimerLogicClock, pNode->heartbeatTimerLogicClockUser);
}
}
}
static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) {
- SSyncHbTimerData* pData = (SSyncHbTimerData*)param;
- SSyncNode* pSyncNode = pData->pSyncNode;
- SSyncTimer* pSyncTimer = pData->pTimer;
+ int64_t hbDataRid = (int64_t)param;
+
+ SSyncHbTimerData* pData = syncHbTimerDataAcquire(hbDataRid);
+ if (pData == NULL) {
+ sError("hb timer get pData NULL, %" PRId64, hbDataRid);
+ return;
+ }
+
+ SSyncNode* pSyncNode = syncNodeAcquire(pData->syncNodeRid);
+ if (pSyncNode == NULL) {
+ syncHbTimerDataRelease(pData);
+ sError("hb timer get pSyncNode NULL");
+ return;
+ }
+
+ SSyncTimer* pSyncTimer = pData->pTimer;
+
+ if (!pSyncNode->isStart) {
+ syncNodeRelease(pSyncNode);
+ syncHbTimerDataRelease(pData);
+ sError("vgId:%d, hb timer sync node already stop", pSyncNode->vgId);
+ return;
+ }
if (pSyncNode->state != TAOS_SYNC_STATE_LEADER) {
+ syncNodeRelease(pSyncNode);
+ syncHbTimerDataRelease(pData);
+ sError("vgId:%d, hb timer sync node not leader", pSyncNode->vgId);
return;
}
- // syncNodeEventLog(pSyncNode, "eq peer hb timer");
+ if (pSyncNode->pRaftStore == NULL) {
+ syncNodeRelease(pSyncNode);
+ syncHbTimerDataRelease(pData);
+ sError("vgId:%d, hb timer raft store already stop", pSyncNode->vgId);
+ return;
+ }
- int64_t timerLogicClock = atomic_load_64(&pSyncTimer->logicClock);
- int64_t msgLogicClock = atomic_load_64(&pData->logicClock);
+ // sTrace("vgId:%d, eq peer hb timer", pSyncNode->vgId);
if (pSyncNode->replicaNum > 1) {
+ int64_t timerLogicClock = atomic_load_64(&pSyncTimer->logicClock);
+ int64_t msgLogicClock = atomic_load_64(&pData->logicClock);
+
if (timerLogicClock == msgLogicClock) {
- SyncHeartbeat* pSyncMsg = syncHeartbeatBuild(pSyncNode->vgId);
+ if (syncIsInit()) {
+ // sTrace("vgId:%d, reset peer hb timer", pSyncNode->vgId);
+ taosTmrReset(syncNodeEqPeerHeartbeatTimer, pSyncTimer->timerMS, (void*)hbDataRid, syncEnv()->pTimerManager,
+ &pSyncTimer->pTimer);
+ } else {
+ sError("sync env is stop, reset peer hb timer error");
+ }
+
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildHeartbeat(&rpcMsg, pSyncNode->vgId);
+
+ SyncHeartbeat* pSyncMsg = rpcMsg.pCont;
pSyncMsg->srcId = pSyncNode->myRaftId;
pSyncMsg->destId = pData->destId;
pSyncMsg->term = pSyncNode->pRaftStore->currentTerm;
@@ -2733,78 +2032,51 @@ static void syncNodeEqPeerHeartbeatTimer(void* param, void* tmrId) {
pSyncMsg->minMatchIndex = syncMinMatchIndex(pSyncNode);
pSyncMsg->privateTerm = 0;
- SRpcMsg rpcMsg;
- syncHeartbeat2RpcMsg(pSyncMsg, &rpcMsg);
-
-// eq msg
-#if 0
- if (pSyncNode->syncEqCtrlMsg != NULL) {
- int32_t code = pSyncNode->syncEqCtrlMsg(pSyncNode->msgcb, &rpcMsg);
- if (code != 0) {
- sError("vgId:%d, sync ctrl enqueue timer msg error, code:%d", pSyncNode->vgId, code);
- rpcFreeCont(rpcMsg.pCont);
- syncHeartbeatDestroy(pSyncMsg);
- return;
- }
- } else {
- sError("vgId:%d, enqueue ctrl msg cb ptr (i.e. syncEqMsg) not set.", pSyncNode->vgId);
- }
-#endif
-
// send msg
- syncNodeSendHeartbeat(pSyncNode, &(pSyncMsg->destId), pSyncMsg);
-
- syncHeartbeatDestroy(pSyncMsg);
-
- if (syncIsInit()) {
- taosTmrReset(syncNodeEqPeerHeartbeatTimer, pSyncTimer->timerMS, pData, syncEnv()->pTimerManager,
- &pSyncTimer->pTimer);
- } else {
- sError("sync env is stop, syncNodeEqHeartbeatTimer");
- }
+ syncNodeSendHeartbeat(pSyncNode, &pSyncMsg->destId, &rpcMsg);
} else {
- sTrace("==syncNodeEqPeerHeartbeatTimer== timerLogicClock:%" PRIu64 ", msgLogicClock:%" PRIu64 "", timerLogicClock,
- msgLogicClock);
+ sTrace("vgId:%d, do not send hb, timerLogicClock:%" PRId64 ", msgLogicClock:%" PRId64 "", pSyncNode->vgId,
+ timerLogicClock, msgLogicClock);
}
}
-}
-static int32_t syncNodeEqNoop(SSyncNode* ths) {
- int32_t ret = 0;
- ASSERT(ths->state == TAOS_SYNC_STATE_LEADER);
+ syncHbTimerDataRelease(pData);
+ syncNodeRelease(pSyncNode);
+}
- SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
- SyncTerm term = ths->pRaftStore->currentTerm;
- SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, ths->vgId);
- ASSERT(pEntry != NULL);
+static int32_t syncNodeEqNoop(SSyncNode* pNode) {
+ if (pNode->state == TAOS_SYNC_STATE_LEADER) {
+ terrno = TSDB_CODE_SYN_NOT_LEADER;
+ return -1;
+ }
- uint32_t entryLen;
- char* serialized = syncEntrySerialize(pEntry, &entryLen);
- SyncClientRequest* pSyncMsg = syncClientRequestBuild(entryLen);
- ASSERT(pSyncMsg->dataLen == entryLen);
- memcpy(pSyncMsg->data, serialized, entryLen);
+ SyncIndex index = pNode->pLogStore->syncLogWriteIndex(pNode->pLogStore);
+ SyncTerm term = pNode->pRaftStore->currentTerm;
+ SSyncRaftEntry* pEntry = syncEntryBuildNoop(term, index, pNode->vgId);
+ if (pEntry == NULL) return -1;
SRpcMsg rpcMsg = {0};
- syncClientRequest2RpcMsg(pSyncMsg, &rpcMsg);
- if (ths->syncEqMsg != NULL) {
- ths->syncEqMsg(ths->msgcb, &rpcMsg);
- } else {
- sTrace("syncNodeEqNoop pSyncNode->syncEqMsg is NULL");
- }
-
+ int32_t code = syncBuildClientRequestFromNoopEntry(&rpcMsg, pEntry, pNode->vgId);
syncEntryDestory(pEntry);
- taosMemoryFree(serialized);
- syncClientRequestDestroy(pSyncMsg);
- return ret;
+ sNTrace(pNode, "propose msg, type:noop");
+ code = (*pNode->syncEqMsg)(pNode->msgcb, &rpcMsg);
+ if (code != 0) {
+ sError("failed to propose noop msg while enqueue since %s", terrstr());
+ }
+
+ return code;
}
static void deleteCacheEntry(const void* key, size_t keyLen, void* value) { taosMemoryFree(value); }
-static int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHandle** h) {
- int code = 0;
- int entryLen = sizeof(*pEntry) + pEntry->dataLen;
+int32_t syncCacheEntry(SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry, LRUHandle** h) {
+ SSyncLogStoreData* pData = pLogStore->data;
+ sNTrace(pData->pSyncNode, "in cache index:%" PRId64 ", bytes:%u, %p", pEntry->index, pEntry->bytes, pEntry);
+
+ int32_t code = 0;
+ int32_t entryLen = sizeof(*pEntry) + pEntry->dataLen;
LRUStatus status = taosLRUCacheInsert(pLogStore->pCache, &pEntry->index, sizeof(pEntry->index), pEntry, entryLen,
deleteCacheEntry, h, TAOS_LRU_PRIORITY_LOW);
if (status != TAOS_LRU_STATUS_OK) {
@@ -2823,14 +2095,15 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) {
ASSERT(pEntry != NULL);
LRUHandle* h = NULL;
- syncCacheEntry(ths->pLogStore, pEntry, &h);
if (ths->state == TAOS_SYNC_STATE_LEADER) {
int32_t code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pEntry);
if (code != 0) {
- syncNodeErrorLog(ths, "append noop error");
+ sError("append noop error");
return -1;
}
+
+ syncCacheEntry(ths->pLogStore, pEntry, &h);
}
if (h) {
@@ -2842,57 +2115,32 @@ static int32_t syncNodeAppendNoop(SSyncNode* ths) {
return ret;
}
-// on message ----
-int32_t syncNodeOnPing(SSyncNode* ths, SyncPing* pMsg) {
- sTrace("vgId:%d, recv sync-ping", ths->vgId);
-
- SyncPingReply* pMsgReply = syncPingReplyBuild3(&ths->myRaftId, &pMsg->srcId, ths->vgId);
- SRpcMsg rpcMsg;
- syncPingReply2RpcMsg(pMsgReply, &rpcMsg);
-
- /*
- // htonl
- SMsgHead* pHead = rpcMsg.pCont;
- pHead->contLen = htonl(pHead->contLen);
- pHead->vgId = htonl(pHead->vgId);
- */
-
- syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
- syncPingReplyDestroy(pMsgReply);
-
- return 0;
-}
-
-int32_t syncNodeOnPingReply(SSyncNode* ths, SyncPingReply* pMsg) {
- int32_t ret = 0;
- sTrace("vgId:%d, recv sync-ping-reply", ths->vgId);
- return ret;
-}
-
-int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) {
+int32_t syncNodeOnHeartbeat(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ SyncHeartbeat* pMsg = pRpcMsg->pCont;
syncLogRecvHeartbeat(ths, pMsg, "");
- SyncHeartbeatReply* pMsgReply = syncHeartbeatReplyBuild(ths->vgId);
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildHeartbeatReply(&rpcMsg, ths->vgId);
+
+ SyncHeartbeatReply* pMsgReply = rpcMsg.pCont;
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_LEADER) {
syncNodeResetElectTimer(ths);
ths->minMatchIndex = pMsg->minMatchIndex;
if (ths->state == TAOS_SYNC_STATE_FOLLOWER) {
// syncNodeFollowerCommit(ths, pMsg->commitIndex);
- SyncLocalCmd* pSyncMsg = syncLocalCmdBuild(ths->vgId);
+ SRpcMsg rpcMsgLocalCmd = {0};
+ (void)syncBuildLocalCmd(&rpcMsgLocalCmd, ths->vgId);
+
+ SyncLocalCmd* pSyncMsg = rpcMsgLocalCmd.pCont;
pSyncMsg->cmd = SYNC_LOCAL_CMD_FOLLOWER_CMT;
pSyncMsg->fcIndex = pMsg->commitIndex;
-
- SRpcMsg rpcMsgLocalCmd;
- syncLocalCmd2RpcMsg(pSyncMsg, &rpcMsgLocalCmd);
+ SyncIndex fcIndex = pSyncMsg->fcIndex;
if (ths->syncEqMsg != NULL && ths->msgcb != NULL) {
int32_t code = ths->syncEqMsg(ths->msgcb, &rpcMsgLocalCmd);
@@ -2900,7 +2148,7 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) {
sError("vgId:%d, sync enqueue fc-commit msg error, code:%d", ths->vgId, code);
rpcFreeCont(rpcMsgLocalCmd.pCont);
} else {
- sTrace("vgId:%d, sync enqueue fc-commit msg, fc-index: %" PRIu64, ths->vgId, pSyncMsg->fcIndex);
+ sTrace("vgId:%d, sync enqueue fc-commit msg, fc-index:%" PRId64, ths->vgId, fcIndex);
}
}
}
@@ -2908,24 +2156,22 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) {
if (pMsg->term >= ths->pRaftStore->currentTerm && ths->state != TAOS_SYNC_STATE_FOLLOWER) {
// syncNodeStepDown(ths, pMsg->term);
- SyncLocalCmd* pSyncMsg = syncLocalCmdBuild(ths->vgId);
+ SRpcMsg rpcMsgLocalCmd = {0};
+ (void)syncBuildLocalCmd(&rpcMsgLocalCmd, ths->vgId);
+
+ SyncLocalCmd* pSyncMsg = rpcMsgLocalCmd.pCont;
pSyncMsg->cmd = SYNC_LOCAL_CMD_STEP_DOWN;
pSyncMsg->sdNewTerm = pMsg->term;
- SRpcMsg rpcMsgLocalCmd;
- syncLocalCmd2RpcMsg(pSyncMsg, &rpcMsgLocalCmd);
-
if (ths->syncEqMsg != NULL && ths->msgcb != NULL) {
int32_t code = ths->syncEqMsg(ths->msgcb, &rpcMsgLocalCmd);
if (code != 0) {
sError("vgId:%d, sync enqueue step-down msg error, code:%d", ths->vgId, code);
rpcFreeCont(rpcMsgLocalCmd.pCont);
} else {
- sTrace("vgId:%d, sync enqueue step-down msg, new-term: %" PRIu64, ths->vgId, pSyncMsg->sdNewTerm);
+ sTrace("vgId:%d, sync enqueue step-down msg, new-term: %" PRId64, ths->vgId, pSyncMsg->sdNewTerm);
}
}
-
- syncLocalCmdDestroy(pSyncMsg);
}
/*
@@ -2937,21 +2183,20 @@ int32_t syncNodeOnHeartbeat(SSyncNode* ths, SyncHeartbeat* pMsg) {
// reply
syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
- syncHeartbeatReplyDestroy(pMsgReply);
-
return 0;
}
-int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, SyncHeartbeatReply* pMsg) {
+int32_t syncNodeOnHeartbeatReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ SyncHeartbeatReply* pMsg = pRpcMsg->pCont;
syncLogRecvHeartbeatReply(ths, pMsg, "");
// update last reply time, make decision whether the other node is alive or not
- syncIndexMgrSetRecvTime(ths->pMatchIndex, &(pMsg->destId), pMsg->startTime);
-
+ syncIndexMgrSetRecvTime(ths->pMatchIndex, &pMsg->destId, pMsg->startTime);
return 0;
}
-int32_t syncNodeOnLocalCmd(SSyncNode* ths, SyncLocalCmd* pMsg) {
+int32_t syncNodeOnLocalCmd(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ SyncLocalCmd* pMsg = pRpcMsg->pCont;
syncLogRecvLocalCmd(ths, pMsg, "");
if (pMsg->cmd == SYNC_LOCAL_CMD_STEP_DOWN) {
@@ -2961,7 +2206,7 @@ int32_t syncNodeOnLocalCmd(SSyncNode* ths, SyncLocalCmd* pMsg) {
syncNodeFollowerCommit(ths, pMsg->fcIndex);
} else {
- syncNodeErrorLog(ths, "error local cmd");
+ sError("error local cmd");
}
return 0;
@@ -2978,29 +2223,64 @@ int32_t syncNodeOnLocalCmd(SSyncNode* ths, SyncLocalCmd* pMsg) {
// leaderVars, commitIndex>>
//
-int32_t syncNodeOnClientRequest(SSyncNode* ths, SyncClientRequest* pMsg, SyncIndex* pRetIndex) {
- syncNodeEventLog(ths, "on client request");
+int32_t syncNodeOnClientRequest(SSyncNode* ths, SRpcMsg* pMsg, SyncIndex* pRetIndex) {
+ sNTrace(ths, "on client request");
int32_t ret = 0;
int32_t code = 0;
SyncIndex index = ths->pLogStore->syncLogWriteIndex(ths->pLogStore);
SyncTerm term = ths->pRaftStore->currentTerm;
- SSyncRaftEntry* pEntry = syncEntryBuild2((SyncClientRequest*)pMsg, term, index);
- ASSERT(pEntry != NULL);
+ SSyncRaftEntry* pEntry;
+
+ if (pMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
+ pEntry = syncEntryBuildFromClientRequest(pMsg->pCont, term, index);
+ } else {
+ pEntry = syncEntryBuildFromRpcMsg(pMsg, term, index);
+ }
LRUHandle* h = NULL;
- syncCacheEntry(ths->pLogStore, pEntry, &h);
if (ths->state == TAOS_SYNC_STATE_LEADER) {
// append entry
code = ths->pLogStore->syncLogAppendEntry(ths->pLogStore, pEntry);
if (code != 0) {
- // del resp mgr, call FpCommitCb
- ASSERT(0);
- return -1;
+ if (ths->replicaNum == 1) {
+ if (h) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, h, false);
+ } else {
+ syncEntryDestory(pEntry);
+ }
+
+ return -1;
+
+ } else {
+ // del resp mgr, call FpCommitCb
+ SFsmCbMeta cbMeta = {
+ .index = pEntry->index,
+ .lastConfigIndex = SYNC_INDEX_INVALID,
+ .isWeak = pEntry->isWeak,
+ .code = -1,
+ .state = ths->state,
+ .seqNum = pEntry->seqNum,
+ .term = pEntry->term,
+ .currentTerm = ths->pRaftStore->currentTerm,
+ .flag = 0,
+ };
+ ths->pFsm->FpCommitCb(ths->pFsm, pMsg, &cbMeta);
+
+ if (h) {
+ taosLRUCacheRelease(ths->pLogStore->pCache, h, false);
+ } else {
+ syncEntryDestory(pEntry);
+ }
+
+ return -1;
+ }
}
+ syncCacheEntry(ths->pLogStore, pEntry, &h);
+
// if mulit replica, start replicate right now
if (ths->replicaNum > 1) {
syncNodeReplicate(ths);
@@ -3046,45 +2326,37 @@ const char* syncStr(ESyncState state) {
}
}
+#if 0
int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* pEntry) {
if (ths->state != TAOS_SYNC_STATE_FOLLOWER) {
- syncNodeEventLog(ths, "I am not follower, can not do leader transfer");
+ sNTrace(ths, "I am not follower, can not do leader transfer");
return 0;
}
if (!ths->restoreFinish) {
- syncNodeEventLog(ths, "restore not finish, can not do leader transfer");
+ sNTrace(ths, "restore not finish, can not do leader transfer");
return 0;
}
if (pEntry->term < ths->pRaftStore->currentTerm) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "little term:%" PRIu64 ", can not do leader transfer", pEntry->term);
- syncNodeEventLog(ths, logBuf);
+ sNTrace(ths, "little term:%" PRId64 ", can not do leader transfer", pEntry->term);
return 0;
}
if (pEntry->index < syncNodeGetLastIndex(ths)) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "little index:%" PRId64 ", can not do leader transfer", pEntry->index);
- syncNodeEventLog(ths, logBuf);
+ sNTrace(ths, "little index:%" PRId64 ", can not do leader transfer", pEntry->index);
return 0;
}
/*
if (ths->vgId > 1) {
- syncNodeEventLog(ths, "I am vnode, can not do leader transfer");
+ sNTrace(ths, "I am vnode, can not do leader transfer");
return 0;
}
*/
- SyncLeaderTransfer* pSyncLeaderTransfer = syncLeaderTransferFromRpcMsg2(pRpcMsg);
-
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "do leader transfer, index:%" PRId64, pEntry->index);
- syncNodeEventLog(ths, logBuf);
- } while (0);
+ SyncLeaderTransfer* pSyncLeaderTransfer = pRpcMsg->pCont;
+ sNTrace(ths, "do leader transfer, index:%" PRId64, pEntry->index);
bool sameId = syncUtilSameId(&(pSyncLeaderTransfer->newLeaderId), &(ths->myRaftId));
bool sameNodeInfo = strcmp(pSyncLeaderTransfer->newNodeInfo.nodeFqdn, ths->myNodeInfo.nodeFqdn) == 0 &&
@@ -3097,11 +2369,8 @@ int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* p
int32_t ret = syncNodeRestartElectTimer(ths, electMS);
ASSERT(ret == 0);
- char eventLog[256];
- snprintf(eventLog, sizeof(eventLog), "maybe leader transfer to %s:%d %" PRIu64,
- pSyncLeaderTransfer->newNodeInfo.nodeFqdn, pSyncLeaderTransfer->newNodeInfo.nodePort,
- pSyncLeaderTransfer->newLeaderId.addr);
- syncNodeEventLog(ths, eventLog);
+ sNTrace(ths, "maybe leader transfer to %s:%d %" PRId64, pSyncLeaderTransfer->newNodeInfo.nodeFqdn,
+ pSyncLeaderTransfer->newNodeInfo.nodePort, pSyncLeaderTransfer->newLeaderId.addr);
}
if (ths->pFsm->FpLeaderTransferCb != NULL) {
@@ -3119,12 +2388,13 @@ int32_t syncDoLeaderTransfer(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* p
ths->pFsm->FpLeaderTransferCb(ths->pFsm, pRpcMsg, &cbMeta);
}
- syncLeaderTransferDestroy(pSyncLeaderTransfer);
return 0;
}
+#endif
+
int32_t syncNodeUpdateNewConfigIndex(SSyncNode* ths, SSyncCfg* pNewCfg) {
- for (int i = 0; i < pNewCfg->replicaNum; ++i) {
+ for (int32_t i = 0; i < pNewCfg->replicaNum; ++i) {
SRaftId raftId;
raftId.addr = syncUtilAddr2U64((pNewCfg->nodeInfo)[i].nodeFqdn, (pNewCfg->nodeInfo)[i].nodePort);
raftId.vgId = ths->vgId;
@@ -3138,89 +2408,6 @@ int32_t syncNodeUpdateNewConfigIndex(SSyncNode* ths, SSyncCfg* pNewCfg) {
return -1;
}
-static int32_t syncNodeConfigChangeFinish(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* pEntry) {
- SyncReconfigFinish* pFinish = syncReconfigFinishFromRpcMsg2(pRpcMsg);
- ASSERT(pFinish);
-
- if (ths->pFsm->FpReConfigCb != NULL) {
- SReConfigCbMeta cbMeta = {0};
- cbMeta.code = 0;
- cbMeta.index = pEntry->index;
- cbMeta.term = pEntry->term;
- cbMeta.seqNum = pEntry->seqNum;
- cbMeta.lastConfigIndex = syncNodeGetSnapshotConfigIndex(ths, pEntry->index);
- cbMeta.state = ths->state;
- cbMeta.currentTerm = ths->pRaftStore->currentTerm;
- cbMeta.isWeak = pEntry->isWeak;
- cbMeta.flag = 0;
-
- cbMeta.oldCfg = pFinish->oldCfg;
- cbMeta.newCfg = pFinish->newCfg;
- cbMeta.newCfgIndex = pFinish->newCfgIndex;
- cbMeta.newCfgTerm = pFinish->newCfgTerm;
- cbMeta.newCfgSeqNum = pFinish->newCfgSeqNum;
-
- ths->pFsm->FpReConfigCb(ths->pFsm, pRpcMsg, &cbMeta);
- }
-
- // clear changing
- ths->changing = false;
-
- char tmpbuf[512];
- char* oldStr = syncCfg2SimpleStr(&(pFinish->oldCfg));
- char* newStr = syncCfg2SimpleStr(&(pFinish->newCfg));
- snprintf(tmpbuf, sizeof(tmpbuf), "config change finish from %d to %d, index:%" PRId64 ", %s --> %s",
- pFinish->oldCfg.replicaNum, pFinish->newCfg.replicaNum, pFinish->newCfgIndex, oldStr, newStr);
- taosMemoryFree(oldStr);
- taosMemoryFree(newStr);
- syncNodeEventLog(ths, tmpbuf);
-
- syncReconfigFinishDestroy(pFinish);
-
- return 0;
-}
-
-static int32_t syncNodeConfigChange(SSyncNode* ths, SRpcMsg* pRpcMsg, SSyncRaftEntry* pEntry,
- SyncReconfigFinish* pFinish) {
- // set changing
- ths->changing = true;
-
- // old config
- SSyncCfg oldSyncCfg = ths->pRaftCfg->cfg;
-
- // new config
- SSyncCfg newSyncCfg;
- int32_t ret = syncCfgFromStr(pRpcMsg->pCont, &newSyncCfg);
- ASSERT(ret == 0);
-
- // update new config myIndex
- syncNodeUpdateNewConfigIndex(ths, &newSyncCfg);
-
- // do config change
- syncNodeDoConfigChange(ths, &newSyncCfg, pEntry->index);
-
- // set pFinish
- pFinish->oldCfg = oldSyncCfg;
- pFinish->newCfg = newSyncCfg;
- pFinish->newCfgIndex = pEntry->index;
- pFinish->newCfgTerm = pEntry->term;
- pFinish->newCfgSeqNum = pEntry->seqNum;
-
- return 0;
-}
-
-static int32_t syncNodeProposeConfigChangeFinish(SSyncNode* ths, SyncReconfigFinish* pFinish) {
- SRpcMsg rpcMsg;
- syncReconfigFinish2RpcMsg(pFinish, &rpcMsg);
-
- int32_t code = syncNodePropose(ths, &rpcMsg, false);
- if (code != 0) {
- sError("syncNodeProposeConfigChangeFinish error");
- ths->changing = false;
- }
- return 0;
-}
-
bool syncNodeIsOptimizedOneReplica(SSyncNode* ths, SRpcMsg* pMsg) {
return (ths->replicaNum == 1 && syncUtilUserCommit(pMsg->msgType) && ths->vgId != 1);
}
@@ -3239,10 +2426,7 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
SSnapshot snapshot = {0};
ths->pFsm->FpGetSnapshotInfo(ths->pFsm, &snapshot);
if (snapshot.lastApplyIndex >= 0 && snapshot.lastApplyIndex >= beginIndex) {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "commit by snapshot from index:%" PRId64 " to index:%" PRId64, beginIndex,
- snapshot.lastApplyIndex);
- syncNodeEventLog(ths, eventLog);
+ sNTrace(ths, "commit by snapshot from index:%" PRId64 " to index:%" PRId64, beginIndex, snapshot.lastApplyIndex);
// update begin index
beginIndex = snapshot.lastApplyIndex + 1;
@@ -3252,9 +2436,7 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
int32_t code = 0;
ESyncState state = flag;
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "commit by wal from index:%" PRId64 " to index:%" PRId64, beginIndex, endIndex);
- syncNodeEventLog(ths, eventLog);
+ sNTrace(ths, "commit by wal from index:%" PRId64 " to index:%" PRId64, beginIndex, endIndex);
// execute fsm
if (ths->pFsm != NULL) {
@@ -3265,18 +2447,23 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
LRUHandle* h = taosLRUCacheLookup(pCache, &i, sizeof(i));
if (h) {
pEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h);
+
+ sNTrace(ths, "hit cache index:%" PRId64 ", bytes:%u, %p", i, pEntry->bytes, pEntry);
+
} else {
+ sNTrace(ths, "miss cache index:%" PRId64, i);
+
code = ths->pLogStore->syncLogGetEntry(ths->pLogStore, i, &pEntry);
// ASSERT(code == 0);
// ASSERT(pEntry != NULL);
if (code != 0 || pEntry == NULL) {
- syncNodeErrorLog(ths, "get log entry error");
+ sNError(ths, "get log entry error");
sFatal("vgId:%d, get log entry %" PRId64 " error when commit since %s", ths->vgId, i, terrstr());
continue;
}
}
- SRpcMsg rpcMsg;
+ SRpcMsg rpcMsg = {0};
syncEntry2OriginalRpc(pEntry, &rpcMsg);
// user commit
@@ -3286,11 +2473,7 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
internalExecute = false;
}
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "commit index:%" PRId64 ", internal:%d", i, internalExecute);
- syncNodeEventLog(ths, logBuf);
- } while (0);
+ sNTrace(ths, "commit index:%" PRId64 ", internal:%d", i, internalExecute);
// execute fsm in apply thread, or execute outside syncPropose
if (internalExecute) {
@@ -3306,33 +2489,11 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
.flag = flag,
};
- syncGetAndDelRespRpc(ths, cbMeta.seqNum, &rpcMsg.info);
+ syncRespMgrGetAndDel(ths->pSyncRespMgr, cbMeta.seqNum, &rpcMsg.info);
ths->pFsm->FpCommitCb(ths->pFsm, &rpcMsg, &cbMeta);
}
}
- // config change
- if (pEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE) {
- SyncReconfigFinish* pFinish = syncReconfigFinishBuild(ths->vgId);
- ASSERT(pFinish != NULL);
-
- code = syncNodeConfigChange(ths, &rpcMsg, pEntry, pFinish);
- ASSERT(code == 0);
-
- if (ths->state == TAOS_SYNC_STATE_LEADER) {
- syncNodeProposeConfigChangeFinish(ths, pFinish);
- }
- syncReconfigFinishDestroy(pFinish);
- }
-
- // config change finish
- if (pEntry->originalRpcType == TDMT_SYNC_CONFIG_CHANGE_FINISH) {
- if (rpcMsg.pCont != NULL && rpcMsg.contLen > 0) {
- code = syncNodeConfigChangeFinish(ths, &rpcMsg, pEntry);
- ASSERT(code == 0);
- }
- }
-
#if 0
// execute in pre-commit
// leader transfer
@@ -3352,11 +2513,7 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
ths->restoreFinish = true;
int64_t restoreDelay = taosGetTimestampMs() - ths->leaderTime;
-
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "restore finish, index:%" PRId64 ", elapsed:%" PRId64 " ms, ",
- pEntry->index, restoreDelay);
- syncNodeEventLog(ths, eventLog);
+ sNTrace(ths, "restore finish, index:%" PRId64 ", elapsed:%" PRId64 " ms", pEntry->index, restoreDelay);
}
}
@@ -3373,7 +2530,7 @@ int32_t syncNodeDoCommit(SSyncNode* ths, SyncIndex beginIndex, SyncIndex endInde
}
bool syncNodeInRaftGroup(SSyncNode* ths, SRaftId* pRaftId) {
- for (int i = 0; i < ths->replicaNum; ++i) {
+ for (int32_t i = 0; i < ths->replicaNum; ++i) {
if (syncUtilSameId(&((ths->replicasId)[i]), pRaftId)) {
return true;
}
@@ -3383,7 +2540,7 @@ bool syncNodeInRaftGroup(SSyncNode* ths, SRaftId* pRaftId) {
SSyncSnapshotSender* syncNodeGetSnapshotSender(SSyncNode* ths, SRaftId* pDestId) {
SSyncSnapshotSender* pSender = NULL;
- for (int i = 0; i < ths->replicaNum; ++i) {
+ for (int32_t i = 0; i < ths->replicaNum; ++i) {
if (syncUtilSameId(pDestId, &((ths->replicasId)[i]))) {
pSender = (ths->senders)[i];
}
@@ -3393,7 +2550,7 @@ SSyncSnapshotSender* syncNodeGetSnapshotSender(SSyncNode* ths, SRaftId* pDestId)
SSyncTimer* syncNodeGetHbTimer(SSyncNode* ths, SRaftId* pDestId) {
SSyncTimer* pTimer = NULL;
- for (int i = 0; i < ths->replicaNum; ++i) {
+ for (int32_t i = 0; i < ths->replicaNum; ++i) {
if (syncUtilSameId(pDestId, &((ths->replicasId)[i]))) {
pTimer = &((ths->peerHeartbeatTimerArr)[i]);
}
@@ -3403,7 +2560,7 @@ SSyncTimer* syncNodeGetHbTimer(SSyncNode* ths, SRaftId* pDestId) {
SPeerState* syncNodeGetPeerState(SSyncNode* ths, const SRaftId* pDestId) {
SPeerState* pState = NULL;
- for (int i = 0; i < ths->replicaNum; ++i) {
+ for (int32_t i = 0; i < ths->replicaNum; ++i) {
if (syncUtilSameId(pDestId, &((ths->replicasId)[i]))) {
pState = &((ths->peerStates)[i]);
}
@@ -3442,7 +2599,7 @@ bool syncNodeCanChange(SSyncNode* pSyncNode) {
}
}
- for (int i = 0; i < pSyncNode->peersNum; ++i) {
+ for (int32_t i = 0; i < pSyncNode->peersNum; ++i) {
SSyncSnapshotSender* pSender = syncNodeGetSnapshotSender(pSyncNode, &(pSyncNode->peersId)[i]);
if (pSender != NULL && pSender->start) {
sError("sync cannot change3");
@@ -3452,244 +2609,3 @@ bool syncNodeCanChange(SSyncNode* pSyncNode) {
return true;
}
-
-const char* syncTimerTypeStr(enum ESyncTimeoutType timerType) {
- if (timerType == SYNC_TIMEOUT_PING) {
- return "ping";
- } else if (timerType == SYNC_TIMEOUT_ELECTION) {
- return "elect";
- } else if (timerType == SYNC_TIMEOUT_HEARTBEAT) {
- return "heartbeat";
- } else {
- return "unknown";
- }
-}
-
-void syncLogRecvTimer(SSyncNode* pSyncNode, const SyncTimeout* pMsg, const char* s) {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "recv sync-timer {type:%s, lc:%" PRIu64 ", ms:%d, data:%p}, %s",
- syncTimerTypeStr(pMsg->timeoutType), pMsg->logicClock, pMsg->timerMS, pMsg->data, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendRequestVote(SSyncNode* pSyncNode, const SyncRequestVote* 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-request-vote to %s:%d {term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 "}, %s", host, port,
- pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvRequestVote(SSyncNode* pSyncNode, const SyncRequestVote* pMsg, const char* s) {
- char logBuf[256];
- char host[64];
- uint16_t port;
- syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
- snprintf(logBuf, sizeof(logBuf),
- "recv sync-request-vote from %s:%d, {term:%" PRIu64 ", lindex:%" PRId64 ", lterm:%" PRIu64 "}, %s", host,
- port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* 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-request-vote-reply to %s:%d {term:%" PRIu64 ", grant:%d}, %s", host, port,
- pMsg->term, pMsg->voteGranted, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* 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-request-vote-reply from %s:%d {term:%" PRIu64 ", grant:%d}, %s", host,
- port, pMsg->term, pMsg->voteGranted, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* 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-append-entries to %s:%d, {term:%" PRIu64 ", pre-index:%" PRId64 ", pre-term:%" PRIu64
- ", pterm:%" PRIu64 ", cmt:%" PRId64
- ", "
- "datalen:%d}, %s",
- host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->privateTerm, pMsg->commitIndex,
- pMsg->dataLen, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* 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-append-entries from %s:%d {term:%" PRIu64 ", pre-index:%" PRIu64 ", pre-term:%" PRIu64
- ", cmt:%" PRIu64 ", pterm:%" PRIu64
- ", "
- "datalen:%d}, %s",
- host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex, pMsg->privateTerm,
- pMsg->dataLen, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntriesBatch* 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-append-entries-batch to %s:%d, {term:%" PRIu64 ", pre-index:%" PRId64 ", pre-term:%" PRIu64
- ", pterm:%" PRIu64 ", cmt:%" PRId64 ", datalen:%d, count:%d}, %s",
- host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->privateTerm, pMsg->commitIndex,
- pMsg->dataLen, pMsg->dataCount, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntriesBatch* 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-append-entries-batch from %s:%d, {term:%" PRIu64 ", pre-index:%" PRId64 ", pre-term:%" PRIu64
- ", pterm:%" PRIu64 ", cmt:%" PRId64 ", datalen:%d, count:%d}, %s",
- host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->privateTerm, pMsg->commitIndex,
- pMsg->dataLen, pMsg->dataCount, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* 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-append-entries-reply to %s:%d, {term:%" PRIu64 ", pterm:%" PRIu64 ", success:%d, match:%" PRId64
- "}, %s",
- host, port, pMsg->term, pMsg->privateTerm, pMsg->success, pMsg->matchIndex, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* 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-append-entries-reply from %s:%d {term:%" PRIu64 ", pterm:%" PRIu64 ", success:%d, match:%" PRId64
- "}, %s",
- 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 to %s:%d {term:%" PRIu64 ", cmt:%" PRId64 ", min-match:%" PRId64 ", pterm:%" PRIu64
- "}, %s",
- host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, 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:%" PRId64 ", min-match:%" PRId64 ", pterm:%" PRIu64
- "}, %s",
- host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, 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);
-}
-
-void syncLogRecvLocalCmd(SSyncNode* pSyncNode, const SyncLocalCmd* pMsg, const char* s) {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "recv sync-local-cmd {cmd:%d-%s, sd-new-term:%" PRIu64 "}, %s", pMsg->cmd,
- syncLocalCmdGetStr(pMsg->cmd), pMsg->sdNewTerm, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* 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-pre-snapshot to %s:%d {term:%" PRIu64 "}, %s", host, port, pMsg->term, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* 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-pre-snapshot from %s:%d {term:%" PRIu64 "}, %s", host, port, pMsg->term,
- s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* 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-pre-snapshot-reply to %s:%d {term:%" PRIu64 ", snap-start:%" PRId64 "}, %s", host, port,
- pMsg->term, pMsg->snapStart, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogRecvSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* 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-pre-snapshot-reply from %s:%d {term:%" PRIu64 ", snap-start:%" PRId64 "}, %s", host, port,
- pMsg->term, pMsg->snapStart, s);
- syncNodeEventLog(pSyncNode, logBuf);
-}
-
-void syncLogSendSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s) {}
-
-void syncLogRecvSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s) {}
-
-void syncLogSendSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s) {}
-
-void syncLogRecvSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s) {}
diff --git a/source/libs/sync/src/syncMessage.c b/source/libs/sync/src/syncMessage.c
index d0df931a88ac11f6aa1b4c50d0ce21cbecdf9bf4..ce984199803fa07512cb0aee57bc95126dd9f820 100644
--- a/source/libs/sync/src/syncMessage.c
+++ b/source/libs/sync/src/syncMessage.c
@@ -13,3548 +13,304 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncMessage.h"
-#include "syncRaftCfg.h"
#include "syncRaftEntry.h"
-#include "syncUtil.h"
-#include "tcoding.h"
-// ---------------------------------------------
-cJSON* syncRpcMsg2Json(SRpcMsg* pRpcMsg) {
- cJSON* pRoot;
-
- // in compiler optimization, switch case = if else constants
- if (pRpcMsg->msgType == TDMT_SYNC_TIMEOUT) {
- SyncTimeout* pSyncMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncTimeout2Json(pSyncMsg);
- syncTimeoutDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_PING) {
- SyncPing* pSyncMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncPing2Json(pSyncMsg);
- syncPingDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_PING_REPLY) {
- SyncPingReply* pSyncMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncPingReply2Json(pSyncMsg);
- syncPingReplyDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST) {
- SyncClientRequest* pSyncMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncClientRequest2Json(pSyncMsg);
- syncClientRequestDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_CLIENT_REQUEST_REPLY) {
- pRoot = syncRpcUnknownMsg2Json();
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE) {
- SyncRequestVote* pSyncMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncRequestVote2Json(pSyncMsg);
- syncRequestVoteDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_REQUEST_VOTE_REPLY) {
- SyncRequestVoteReply* pSyncMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncRequestVoteReply2Json(pSyncMsg);
- syncRequestVoteReplyDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES) {
- SyncAppendEntries* pSyncMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncAppendEntries2Json(pSyncMsg);
- syncAppendEntriesDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_APPEND_ENTRIES_REPLY) {
- SyncAppendEntriesReply* pSyncMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncAppendEntriesReply2Json(pSyncMsg);
- syncAppendEntriesReplyDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_SEND) {
- SyncSnapshotSend* pSyncMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncSnapshotSend2Json(pSyncMsg);
- syncSnapshotSendDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_SNAPSHOT_RSP) {
- SyncSnapshotRsp* pSyncMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncSnapshotRsp2Json(pSyncMsg);
- syncSnapshotRspDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_LEADER_TRANSFER) {
- SyncLeaderTransfer* pSyncMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- pRoot = syncLeaderTransfer2Json(pSyncMsg);
- syncLeaderTransferDestroy(pSyncMsg);
-
- } else if (pRpcMsg->msgType == TDMT_SYNC_COMMON_RESPONSE) {
- pRoot = cJSON_CreateObject();
- char* s;
- s = syncUtilprintBin((char*)(pRpcMsg->pCont), pRpcMsg->contLen);
- cJSON_AddStringToObject(pRoot, "pCont", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pRpcMsg->pCont), pRpcMsg->contLen);
- cJSON_AddStringToObject(pRoot, "pCont2", s);
- taosMemoryFree(s);
-
- } else {
- pRoot = cJSON_CreateObject();
- char* s;
- s = syncUtilprintBin((char*)(pRpcMsg->pCont), pRpcMsg->contLen);
- cJSON_AddStringToObject(pRoot, "pCont", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pRpcMsg->pCont), pRpcMsg->contLen);
- cJSON_AddStringToObject(pRoot, "pCont2", s);
- taosMemoryFree(s);
- }
-
- cJSON_AddNumberToObject(pRoot, "msgType", pRpcMsg->msgType);
- cJSON_AddNumberToObject(pRoot, "contLen", pRpcMsg->contLen);
- cJSON_AddNumberToObject(pRoot, "code", pRpcMsg->code);
- // cJSON_AddNumberToObject(pRoot, "persist", pRpcMsg->persist);
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "RpcMsg", pRoot);
- return pJson;
-}
-
-cJSON* syncRpcUnknownMsg2Json() {
- cJSON* pRoot = cJSON_CreateObject();
- cJSON_AddNumberToObject(pRoot, "msgType", TDMT_SYNC_UNKNOWN);
- cJSON_AddStringToObject(pRoot, "data", "unknown message");
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncUnknown", pRoot);
- return pJson;
-}
-
-char* syncRpcMsg2Str(SRpcMsg* pRpcMsg) {
- cJSON* pJson = syncRpcMsg2Json(pRpcMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncRpcMsgPrint(SRpcMsg* pMsg) {
- char* serialized = syncRpcMsg2Str(pMsg);
- printf("syncRpcMsgPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncRpcMsgPrint2(char* s, SRpcMsg* pMsg) {
- char* serialized = syncRpcMsg2Str(pMsg);
- printf("syncRpcMsgPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncRpcMsgLog(SRpcMsg* pMsg) {
- char* serialized = syncRpcMsg2Str(pMsg);
- sTrace("syncRpcMsgLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncRpcMsgLog2(char* s, SRpcMsg* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncRpcMsg2Str(pMsg);
- sTrace("syncRpcMsgLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncTimeout----
-SyncTimeout* syncTimeoutBuild() {
- uint32_t bytes = sizeof(SyncTimeout);
- SyncTimeout* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
+int32_t syncBuildTimeout(SRpcMsg* pMsg, ESyncTimeoutType timeoutType, uint64_t logicClock, int32_t timerMS,
+ SSyncNode* pNode) {
+ int32_t bytes = sizeof(SyncTimeout);
+ pMsg->pCont = rpcMallocCont(bytes);
pMsg->msgType = TDMT_SYNC_TIMEOUT;
- return pMsg;
-}
-
-SyncTimeout* syncTimeoutBuild2(ESyncTimeoutType timeoutType, uint64_t logicClock, int32_t timerMS, int32_t vgId,
- void* data) {
- SyncTimeout* pMsg = syncTimeoutBuild();
- pMsg->vgId = vgId;
- pMsg->timeoutType = timeoutType;
- pMsg->logicClock = logicClock;
- pMsg->timerMS = timerMS;
- pMsg->data = data;
- return pMsg;
-}
-
-void syncTimeoutDestroy(SyncTimeout* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncTimeoutSerialize(const SyncTimeout* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncTimeoutDeserialize(const char* buf, uint32_t len, SyncTimeout* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncTimeoutSerialize2(const SyncTimeout* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncTimeoutSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncTimeout* syncTimeoutDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncTimeout* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncTimeoutDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncTimeout2RpcMsg(const SyncTimeout* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncTimeoutSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncTimeoutFromRpcMsg(const SRpcMsg* pRpcMsg, SyncTimeout* pMsg) {
- syncTimeoutDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncTimeout* syncTimeoutFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncTimeout* pMsg = syncTimeoutDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncTimeout2Json(const SyncTimeout* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
- cJSON_AddNumberToObject(pRoot, "timeoutType", pMsg->timeoutType);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->logicClock);
- cJSON_AddStringToObject(pRoot, "logicClock", u64buf);
- cJSON_AddNumberToObject(pRoot, "timerMS", pMsg->timerMS);
- snprintf(u64buf, sizeof(u64buf), "%p", pMsg->data);
- cJSON_AddStringToObject(pRoot, "data", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncTimeout", pRoot);
- return pJson;
-}
-
-char* syncTimeout2Str(const SyncTimeout* pMsg) {
- cJSON* pJson = syncTimeout2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncTimeoutPrint(const SyncTimeout* pMsg) {
- char* serialized = syncTimeout2Str(pMsg);
- printf("syncTimeoutPrint | len:%zu | %s \n", strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncTimeoutPrint2(char* s, const SyncTimeout* pMsg) {
- char* serialized = syncTimeout2Str(pMsg);
- printf("syncTimeoutPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncTimeoutLog(const SyncTimeout* pMsg) {
- char* serialized = syncTimeout2Str(pMsg);
- sTrace("syncTimeoutLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncTimeoutLog2(char* s, const SyncTimeout* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncTimeout2Str(pMsg);
- sTrace("syncTimeoutLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncPing----
-SyncPing* syncPingBuild(uint32_t dataLen) {
- uint32_t bytes = sizeof(SyncPing) + dataLen;
- SyncPing* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->msgType = TDMT_SYNC_PING;
- pMsg->dataLen = dataLen;
- return pMsg;
-}
-
-SyncPing* syncPingBuild2(const SRaftId* srcId, const SRaftId* destId, int32_t vgId, const char* str) {
- uint32_t dataLen = strlen(str) + 1;
- SyncPing* pMsg = syncPingBuild(dataLen);
- pMsg->vgId = vgId;
- pMsg->srcId = *srcId;
- pMsg->destId = *destId;
- snprintf(pMsg->data, pMsg->dataLen, "%s", str);
- return pMsg;
-}
-
-SyncPing* syncPingBuild3(const SRaftId* srcId, const SRaftId* destId, int32_t vgId) {
- SyncPing* pMsg = syncPingBuild2(srcId, destId, vgId, "ping");
- return pMsg;
-}
-
-void syncPingDestroy(SyncPing* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncPingSerialize(const SyncPing* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncPingDeserialize(const char* buf, uint32_t len, SyncPing* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
- ASSERT(pMsg->bytes == sizeof(SyncPing) + pMsg->dataLen);
-}
-
-char* syncPingSerialize2(const SyncPing* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncPingSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- return buf;
-}
-SyncPing* syncPingDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncPing* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncPingDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
+ SyncTimeout* pTimeout = pMsg->pCont;
+ pTimeout->bytes = bytes;
+ pTimeout->msgType = TDMT_SYNC_TIMEOUT;
+ pTimeout->vgId = pNode->vgId;
+ pTimeout->timeoutType = timeoutType;
+ pTimeout->logicClock = logicClock;
+ pTimeout->timerMS = timerMS;
+ pTimeout->data = pNode;
+ return 0;
}
-int32_t syncPingSerialize3(const SyncPing* pMsg, char* buf, int32_t bufLen) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
- if (tStartEncode(&encoder) < 0) {
+int32_t syncBuildClientRequest(SRpcMsg* pMsg, const SRpcMsg* pOriginal, uint64_t seqNum, bool isWeak, int32_t vgId) {
+ int32_t bytes = sizeof(SyncClientRequest) + pOriginal->contLen;
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_CLIENT_REQUEST;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- if (tEncodeU32(&encoder, pMsg->bytes) < 0) {
- return -1;
- }
- if (tEncodeI32(&encoder, pMsg->vgId) < 0) {
- return -1;
- }
- if (tEncodeU32(&encoder, pMsg->msgType) < 0) {
- return -1;
- }
- if (tEncodeU64(&encoder, pMsg->srcId.addr) < 0) {
- return -1;
- }
- if (tEncodeI32(&encoder, pMsg->srcId.vgId) < 0) {
- return -1;
- }
- if (tEncodeU64(&encoder, pMsg->destId.addr) < 0) {
- return -1;
- }
- if (tEncodeI32(&encoder, pMsg->destId.vgId) < 0) {
- return -1;
- }
- if (tEncodeU32(&encoder, pMsg->dataLen) < 0) {
- return -1;
- }
- if (tEncodeBinary(&encoder, pMsg->data, pMsg->dataLen)) {
- return -1;
- }
+ SyncClientRequest* pClientRequest = pMsg->pCont;
+ pClientRequest->bytes = bytes;
+ pClientRequest->vgId = vgId;
+ pClientRequest->msgType = TDMT_SYNC_CLIENT_REQUEST;
+ pClientRequest->originalRpcType = pOriginal->msgType;
+ pClientRequest->seqNum = seqNum;
+ pClientRequest->isWeak = isWeak;
+ pClientRequest->dataLen = pOriginal->contLen;
+ memcpy(pClientRequest->data, (char*)pOriginal->pCont, pOriginal->contLen);
- tEndEncode(&encoder);
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
+ return 0;
}
-SyncPing* syncPingDeserialize3(void* buf, int32_t bufLen) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
- if (tStartDecode(&decoder) < 0) {
- return NULL;
- }
-
- SyncPing* pMsg = NULL;
- uint32_t bytes;
- if (tDecodeU32(&decoder, &bytes) < 0) {
- return NULL;
- }
-
- pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- pMsg->bytes = bytes;
-
- if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU32(&decoder, &pMsg->msgType) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU64(&decoder, &pMsg->srcId.addr) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeI32(&decoder, &pMsg->srcId.vgId) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU64(&decoder, &pMsg->destId.addr) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeI32(&decoder, &pMsg->destId.vgId) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU32(&decoder, &pMsg->dataLen) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- uint32_t len;
- char* data = NULL;
- if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
+int32_t syncBuildClientRequestFromNoopEntry(SRpcMsg* pMsg, const SSyncRaftEntry* pEntry, int32_t vgId) {
+ int32_t bytes = sizeof(SyncClientRequest) + pEntry->bytes;
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_CLIENT_REQUEST;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- ASSERT(len == pMsg->dataLen);
- memcpy(pMsg->data, data, len);
-
- tEndDecode(&decoder);
- tDecoderClear(&decoder);
- return pMsg;
-}
-
-void syncPing2RpcMsg(const SyncPing* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncPingSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-void syncPingFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPing* pMsg) {
- syncPingDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
+ SyncClientRequest* pClientRequest = pMsg->pCont;
+ pClientRequest->bytes = bytes;
+ pClientRequest->vgId = vgId;
+ pClientRequest->msgType = TDMT_SYNC_CLIENT_REQUEST;
+ pClientRequest->originalRpcType = TDMT_SYNC_NOOP;
+ pClientRequest->dataLen = pEntry->bytes;
+ memcpy(pClientRequest->data, (char*)pEntry, pEntry->bytes);
-SyncPing* syncPingFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncPing* pMsg = syncPingDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
+ return 0;
}
-cJSON* syncPing2Json(const SyncPing* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
+int32_t syncBuildRequestVote(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncRequestVote);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_REQUEST_VOTE;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncPing", pRoot);
- return pJson;
-}
-
-char* syncPing2Str(const SyncPing* pMsg) {
- cJSON* pJson = syncPing2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncPingPrint(const SyncPing* pMsg) {
- char* serialized = syncPing2Str(pMsg);
- printf("syncPingPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPingPrint2(char* s, const SyncPing* pMsg) {
- char* serialized = syncPing2Str(pMsg);
- printf("syncPingPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
+ SyncRequestVote* pRequestVote = pMsg->pCont;
+ pRequestVote->bytes = bytes;
+ pRequestVote->msgType = TDMT_SYNC_REQUEST_VOTE;
+ pRequestVote->vgId = vgId;
+ return 0;
}
-void syncPingLog(const SyncPing* pMsg) {
- char* serialized = syncPing2Str(pMsg);
- sTrace("syncPingLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncPingLog2(char* s, const SyncPing* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncPing2Str(pMsg);
- sTrace("syncPingLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
+int32_t syncBuildRequestVoteReply(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncRequestVoteReply);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_REQUEST_VOTE_REPLY;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
-}
-
-// ---- message process SyncPingReply----
-SyncPingReply* syncPingReplyBuild(uint32_t dataLen) {
- uint32_t bytes = sizeof(SyncPingReply) + dataLen;
- SyncPingReply* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->msgType = TDMT_SYNC_PING_REPLY;
- pMsg->dataLen = dataLen;
- return pMsg;
-}
-
-SyncPingReply* syncPingReplyBuild2(const SRaftId* srcId, const SRaftId* destId, int32_t vgId, const char* str) {
- uint32_t dataLen = strlen(str) + 1;
- SyncPingReply* pMsg = syncPingReplyBuild(dataLen);
- pMsg->vgId = vgId;
- pMsg->srcId = *srcId;
- pMsg->destId = *destId;
- snprintf(pMsg->data, pMsg->dataLen, "%s", str);
- return pMsg;
-}
-SyncPingReply* syncPingReplyBuild3(const SRaftId* srcId, const SRaftId* destId, int32_t vgId) {
- SyncPingReply* pMsg = syncPingReplyBuild2(srcId, destId, vgId, "pang");
- return pMsg;
+ SyncRequestVoteReply* pRequestVoteReply = pMsg->pCont;
+ pRequestVoteReply->bytes = bytes;
+ pRequestVoteReply->msgType = TDMT_SYNC_REQUEST_VOTE_REPLY;
+ pRequestVoteReply->vgId = vgId;
+ return 0;
}
-void syncPingReplyDestroy(SyncPingReply* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
+int32_t syncBuildAppendEntries(SRpcMsg* pMsg, int32_t dataLen, int32_t vgId) {
+ int32_t bytes = sizeof(SyncAppendEntries) + dataLen;
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_APPEND_ENTRIES;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
-}
-void syncPingReplySerialize(const SyncPingReply* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
+ SyncAppendEntries* pAppendEntries = pMsg->pCont;
+ pAppendEntries->bytes = bytes;
+ pAppendEntries->vgId = vgId;
+ pAppendEntries->msgType = TDMT_SYNC_APPEND_ENTRIES;
+ pAppendEntries->dataLen = dataLen;
+ return 0;
}
-void syncPingReplyDeserialize(const char* buf, uint32_t len, SyncPingReply* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
- ASSERT(pMsg->bytes == sizeof(SyncPingReply) + pMsg->dataLen);
-}
-
-char* syncPingReplySerialize2(const SyncPingReply* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncPingReplySerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
+int32_t syncBuildAppendEntriesReply(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncAppendEntriesReply);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_APPEND_ENTRIES_REPLY;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- return buf;
-}
-SyncPingReply* syncPingReplyDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncPingReply* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncPingReplyDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
+ SyncAppendEntriesReply* pAppendEntriesReply = pMsg->pCont;
+ pAppendEntriesReply->bytes = bytes;
+ pAppendEntriesReply->msgType = TDMT_SYNC_APPEND_ENTRIES_REPLY;
+ pAppendEntriesReply->vgId = vgId;
+ return 0;
}
-int32_t syncPingReplySerialize3(const SyncPingReply* pMsg, char* buf, int32_t bufLen) {
- SEncoder encoder = {0};
- tEncoderInit(&encoder, buf, bufLen);
- if (tStartEncode(&encoder) < 0) {
- return -1;
- }
-
- if (tEncodeU32(&encoder, pMsg->bytes) < 0) {
- return -1;
- }
- if (tEncodeI32(&encoder, pMsg->vgId) < 0) {
- return -1;
- }
- if (tEncodeU32(&encoder, pMsg->msgType) < 0) {
- return -1;
- }
- if (tEncodeU64(&encoder, pMsg->srcId.addr) < 0) {
- return -1;
- }
- if (tEncodeI32(&encoder, pMsg->srcId.vgId) < 0) {
- return -1;
- }
- if (tEncodeU64(&encoder, pMsg->destId.addr) < 0) {
- return -1;
- }
- if (tEncodeI32(&encoder, pMsg->destId.vgId) < 0) {
- return -1;
- }
- if (tEncodeU32(&encoder, pMsg->dataLen) < 0) {
- return -1;
- }
- if (tEncodeBinary(&encoder, pMsg->data, pMsg->dataLen)) {
+int32_t syncBuildHeartbeat(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncHeartbeat);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_HEARTBEAT;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
return -1;
}
- tEndEncode(&encoder);
- int32_t tlen = encoder.pos;
- tEncoderClear(&encoder);
- return tlen;
+ SyncHeartbeat* pHeartbeat = pMsg->pCont;
+ pHeartbeat->bytes = bytes;
+ pHeartbeat->msgType = TDMT_SYNC_HEARTBEAT;
+ pHeartbeat->vgId = vgId;
+ return 0;
}
-SyncPingReply* syncPingReplyDeserialize3(void* buf, int32_t bufLen) {
- SDecoder decoder = {0};
- tDecoderInit(&decoder, buf, bufLen);
- if (tStartDecode(&decoder) < 0) {
- return NULL;
- }
-
- SyncPingReply* pMsg = NULL;
- uint32_t bytes;
- if (tDecodeU32(&decoder, &bytes) < 0) {
- return NULL;
- }
-
- pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- pMsg->bytes = bytes;
-
- if (tDecodeI32(&decoder, &pMsg->vgId) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU32(&decoder, &pMsg->msgType) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU64(&decoder, &pMsg->srcId.addr) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeI32(&decoder, &pMsg->srcId.vgId) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU64(&decoder, &pMsg->destId.addr) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeI32(&decoder, &pMsg->destId.vgId) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- if (tDecodeU32(&decoder, &pMsg->dataLen) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
- }
- uint32_t len;
- char* data = NULL;
- if (tDecodeBinary(&decoder, (uint8_t**)(&data), &len) < 0) {
- taosMemoryFree(pMsg);
- return NULL;
+int32_t syncBuildHeartbeatReply(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncHeartbeatReply);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_HEARTBEAT_REPLY;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- ASSERT(len == pMsg->dataLen);
- memcpy(pMsg->data, data, len);
-
- tEndDecode(&decoder);
- tDecoderClear(&decoder);
- return pMsg;
-}
-
-void syncPingReply2RpcMsg(const SyncPingReply* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncPingReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncPingReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPingReply* pMsg) {
- syncPingReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-SyncPingReply* syncPingReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncPingReply* pMsg = syncPingReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
+ SyncHeartbeatReply* pHeartbeatReply = pMsg->pCont;
+ pHeartbeatReply->bytes = bytes;
+ pHeartbeatReply->msgType = TDMT_SYNC_HEARTBEAT_REPLY;
+ pHeartbeatReply->vgId = vgId;
+ return 0;
}
-cJSON* syncPingReply2Json(const SyncPingReply* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
+#if 0
+int32_t syncBuildPreSnapshot(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncPreSnapshot);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_PRE_SNAPSHOT;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncPingReply", pRoot);
- return pJson;
-}
-
-char* syncPingReply2Str(const SyncPingReply* pMsg) {
- cJSON* pJson = syncPingReply2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncPingReplyPrint(const SyncPingReply* pMsg) {
- char* serialized = syncPingReply2Str(pMsg);
- printf("syncPingReplyPrint | len:%zu | %s \n", strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPingReplyPrint2(char* s, const SyncPingReply* pMsg) {
- char* serialized = syncPingReply2Str(pMsg);
- printf("syncPingReplyPrint2 | len:%zu | %s | %s \n", strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPingReplyLog(const SyncPingReply* pMsg) {
- char* serialized = syncPingReply2Str(pMsg);
- sTrace("syncPingReplyLog | len:%zu | %s", strlen(serialized), serialized);
- taosMemoryFree(serialized);
+ SyncPreSnapshot* pPreSnapshot = pMsg->pCont;
+ pPreSnapshot->bytes = bytes;
+ pPreSnapshot->msgType = TDMT_SYNC_PRE_SNAPSHOT;
+ pPreSnapshot->vgId = vgId;
+ return 0;
}
-void syncPingReplyLog2(char* s, const SyncPingReply* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncPingReply2Str(pMsg);
- sTrace("syncPingReplyLog2 | len:%zu | %s | %s", strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
+int32_t syncBuildPreSnapshotReply(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncPreSnapshotReply);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_PRE_SNAPSHOT_REPLY;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
-}
-
-// ---- message process SyncClientRequest----
-SyncClientRequest* syncClientRequestBuild(uint32_t dataLen) {
- uint32_t bytes = sizeof(SyncClientRequest) + dataLen;
- SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->msgType = TDMT_SYNC_CLIENT_REQUEST;
- pMsg->seqNum = 0;
- pMsg->isWeak = false;
- pMsg->dataLen = dataLen;
- return pMsg;
-}
-// step 1. original SRpcMsg => SyncClientRequest, add seqNum, isWeak
-SyncClientRequest* syncClientRequestBuild2(const SRpcMsg* pOriginalRpcMsg, uint64_t seqNum, bool isWeak, int32_t vgId) {
- SyncClientRequest* pMsg = syncClientRequestBuild(pOriginalRpcMsg->contLen);
- pMsg->vgId = vgId;
- pMsg->originalRpcType = pOriginalRpcMsg->msgType;
- pMsg->seqNum = seqNum;
- pMsg->isWeak = isWeak;
- memcpy(pMsg->data, pOriginalRpcMsg->pCont, pOriginalRpcMsg->contLen);
- return pMsg;
+ SyncPreSnapshotReply* pPreSnapshotReply = pMsg->pCont;
+ pPreSnapshotReply->bytes = bytes;
+ pPreSnapshotReply->msgType = TDMT_SYNC_PRE_SNAPSHOT_REPLY;
+ pPreSnapshotReply->vgId = vgId;
+ return 0;
}
+#endif
-void syncClientRequestDestroy(SyncClientRequest* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
+int32_t syncBuildSnapshotSend(SRpcMsg* pMsg, int32_t dataLen, int32_t vgId) {
+ int32_t bytes = sizeof(SyncSnapshotSend) + dataLen;
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_SNAPSHOT_SEND;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
-}
-void syncClientRequestSerialize(const SyncClientRequest* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
+ SyncSnapshotSend* pSnapshotSend = pMsg->pCont;
+ pSnapshotSend->bytes = bytes;
+ pSnapshotSend->vgId = vgId;
+ pSnapshotSend->msgType = TDMT_SYNC_SNAPSHOT_SEND;
+ pSnapshotSend->dataLen = dataLen;
+ return 0;
}
-void syncClientRequestDeserialize(const char* buf, uint32_t len, SyncClientRequest* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncClientRequestSerialize2(const SyncClientRequest* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncClientRequestSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
+int32_t syncBuildSnapshotSendRsp(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncSnapshotRsp);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_SNAPSHOT_RSP;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- return buf;
-}
-
-SyncClientRequest* syncClientRequestDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncClientRequest* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncClientRequestDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-// step 2. SyncClientRequest => RpcMsg, to queue
-void syncClientRequest2RpcMsg(const SyncClientRequest* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncClientRequestSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncClientRequestFromRpcMsg(const SRpcMsg* pRpcMsg, SyncClientRequest* pMsg) {
- syncClientRequestDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-// step 3. RpcMsg => SyncClientRequest, from queue
-SyncClientRequest* syncClientRequestFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncClientRequest* pMsg = syncClientRequestDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
+ SyncSnapshotRsp* pPreSnapshotRsp = pMsg->pCont;
+ pPreSnapshotRsp->bytes = bytes;
+ pPreSnapshotRsp->msgType = TDMT_SYNC_SNAPSHOT_RSP;
+ pPreSnapshotRsp->vgId = vgId;
+ return 0;
}
-cJSON* syncClientRequest2Json(const SyncClientRequest* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
- cJSON_AddNumberToObject(pRoot, "originalRpcType", pMsg->originalRpcType);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->seqNum);
- cJSON_AddStringToObject(pRoot, "seqNum", u64buf);
- cJSON_AddNumberToObject(pRoot, "isWeak", pMsg->isWeak);
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
-
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
+int32_t syncBuildLeaderTransfer(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncLeaderTransfer);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_LEADER_TRANSFER;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncClientRequest", pRoot);
- return pJson;
-}
-
-char* syncClientRequest2Str(const SyncClientRequest* pMsg) {
- cJSON* pJson = syncClientRequest2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncClientRequestPrint(const SyncClientRequest* pMsg) {
- char* serialized = syncClientRequest2Str(pMsg);
- printf("syncClientRequestPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncClientRequestPrint2(char* s, const SyncClientRequest* pMsg) {
- char* serialized = syncClientRequest2Str(pMsg);
- printf("syncClientRequestPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncClientRequestLog(const SyncClientRequest* pMsg) {
- char* serialized = syncClientRequest2Str(pMsg);
- sTrace("syncClientRequestLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncClientRequestLog2(char* s, const SyncClientRequest* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncClientRequest2Str(pMsg);
- sTrace("syncClientRequestLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
+ SyncLeaderTransfer* pLeaderTransfer = pMsg->pCont;
+ pLeaderTransfer->bytes = bytes;
+ pLeaderTransfer->msgType = TDMT_SYNC_LEADER_TRANSFER;
+ pLeaderTransfer->vgId = vgId;
+ return 0;
}
-// ---- message process SyncClientRequestBatch----
-
-// block1:
-// block2: SRaftMeta array
-// block3: rpc msg array (with pCont)
-
-SyncClientRequestBatch* syncClientRequestBatchBuild(SRpcMsg** rpcMsgPArr, SRaftMeta* raftArr, int32_t arrSize,
- int32_t vgId) {
- ASSERT(rpcMsgPArr != NULL);
- ASSERT(arrSize > 0);
-
- int32_t dataLen = 0;
- int32_t raftMetaArrayLen = sizeof(SRaftMeta) * arrSize;
- int32_t rpcArrayLen = sizeof(SRpcMsg) * arrSize;
- dataLen += (raftMetaArrayLen + rpcArrayLen);
-
- uint32_t bytes = sizeof(SyncClientRequestBatch) + dataLen;
- SyncClientRequestBatch* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_CLIENT_REQUEST_BATCH;
- pMsg->dataCount = arrSize;
- pMsg->dataLen = dataLen;
-
- SRaftMeta* raftMetaArr = (SRaftMeta*)(pMsg->data);
- SRpcMsg* msgArr = (SRpcMsg*)((char*)(pMsg->data) + raftMetaArrayLen);
-
- for (int i = 0; i < arrSize; ++i) {
- // init raftMetaArr
- raftMetaArr[i].isWeak = raftArr[i].isWeak;
- raftMetaArr[i].seqNum = raftArr[i].seqNum;
-
- // init msgArr
- msgArr[i] = *(rpcMsgPArr[i]);
+int32_t syncBuildLocalCmd(SRpcMsg* pMsg, int32_t vgId) {
+ int32_t bytes = sizeof(SyncLocalCmd);
+ pMsg->pCont = rpcMallocCont(bytes);
+ pMsg->msgType = TDMT_SYNC_LOCAL_CMD;
+ pMsg->contLen = bytes;
+ if (pMsg->pCont == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return -1;
}
- return pMsg;
-}
-
-void syncClientRequestBatch2RpcMsg(const SyncClientRequestBatch* pSyncMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pSyncMsg->msgType;
- pRpcMsg->contLen = pSyncMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- memcpy(pRpcMsg->pCont, pSyncMsg, pRpcMsg->contLen);
+ SyncLocalCmd* pLocalCmd = pMsg->pCont;
+ pLocalCmd->bytes = bytes;
+ pLocalCmd->msgType = TDMT_SYNC_LOCAL_CMD;
+ pLocalCmd->vgId = vgId;
+ return 0;
}
-void syncClientRequestBatchDestroy(SyncClientRequestBatch* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
+const char* syncTimerTypeStr(enum ESyncTimeoutType timerType) {
+ switch (timerType) {
+ case SYNC_TIMEOUT_PING:
+ return "ping";
+ case SYNC_TIMEOUT_ELECTION:
+ return "elect";
+ case SYNC_TIMEOUT_HEARTBEAT:
+ return "heartbeat";
+ default:
+ return "unknown";
}
}
-void syncClientRequestBatchDestroyDeep(SyncClientRequestBatch* pMsg) {
- if (pMsg != NULL) {
- int32_t arrSize = pMsg->dataCount;
- int32_t raftMetaArrayLen = sizeof(SRaftMeta) * arrSize;
- SRpcMsg* msgArr = (SRpcMsg*)((char*)(pMsg->data) + raftMetaArrayLen);
- for (int i = 0; i < arrSize; ++i) {
- if (msgArr[i].pCont != NULL) {
- rpcFreeCont(msgArr[i].pCont);
- }
- }
-
- taosMemoryFree(pMsg);
+const char* syncLocalCmdGetStr(ESyncLocalCmd cmd) {
+ switch (cmd) {
+ case SYNC_LOCAL_CMD_STEP_DOWN:
+ return "step-down";
+ case SYNC_LOCAL_CMD_FOLLOWER_CMT:
+ return "follower-commit";
+ default:
+ return "unknown-local-cmd";
}
}
-
-SRaftMeta* syncClientRequestBatchMetaArr(const SyncClientRequestBatch* pSyncMsg) {
- SRaftMeta* raftMetaArr = (SRaftMeta*)(pSyncMsg->data);
- return raftMetaArr;
-}
-
-SRpcMsg* syncClientRequestBatchRpcMsgArr(const SyncClientRequestBatch* pSyncMsg) {
- int32_t arrSize = pSyncMsg->dataCount;
- int32_t raftMetaArrayLen = sizeof(SRaftMeta) * arrSize;
- SRpcMsg* msgArr = (SRpcMsg*)((char*)(pSyncMsg->data) + raftMetaArrayLen);
- return msgArr;
-}
-
-SyncClientRequestBatch* syncClientRequestBatchFromRpcMsg(const SRpcMsg* pRpcMsg) {
- SyncClientRequestBatch* pSyncMsg = taosMemoryMalloc(pRpcMsg->contLen);
- ASSERT(pSyncMsg != NULL);
- memcpy(pSyncMsg, pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pRpcMsg->contLen == pSyncMsg->bytes);
-
- return pSyncMsg;
-}
-
-cJSON* syncClientRequestBatch2Json(const SyncClientRequestBatch* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
- cJSON_AddNumberToObject(pRoot, "dataCount", pMsg->dataCount);
-
- SRaftMeta* metaArr = syncClientRequestBatchMetaArr(pMsg);
- SRpcMsg* msgArr = syncClientRequestBatchRpcMsgArr(pMsg);
-
- cJSON* pMetaArr = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "metaArr", pMetaArr);
- for (int i = 0; i < pMsg->dataCount; ++i) {
- cJSON* pMeta = cJSON_CreateObject();
- cJSON_AddNumberToObject(pMeta, "seqNum", metaArr[i].seqNum);
- cJSON_AddNumberToObject(pMeta, "isWeak", metaArr[i].isWeak);
- cJSON_AddItemToArray(pMetaArr, pMeta);
- }
-
- cJSON* pMsgArr = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "msgArr", pMsgArr);
- for (int i = 0; i < pMsg->dataCount; ++i) {
- cJSON* pRpcMsgJson = syncRpcMsg2Json(&msgArr[i]);
- cJSON_AddItemToArray(pMsgArr, pRpcMsgJson);
- }
-
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncClientRequestBatch", pRoot);
- return pJson;
-}
-
-char* syncClientRequestBatch2Str(const SyncClientRequestBatch* pMsg) {
- cJSON* pJson = syncClientRequestBatch2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncClientRequestBatchPrint(const SyncClientRequestBatch* pMsg) {
- char* serialized = syncClientRequestBatch2Str(pMsg);
- printf("syncClientRequestBatchPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncClientRequestBatchPrint2(char* s, const SyncClientRequestBatch* pMsg) {
- char* serialized = syncClientRequestBatch2Str(pMsg);
- printf("syncClientRequestBatchPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncClientRequestBatchLog(const SyncClientRequestBatch* pMsg) {
- char* serialized = syncClientRequestBatch2Str(pMsg);
- sTrace("syncClientRequestBatchLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncClientRequestBatchLog2(char* s, const SyncClientRequestBatch* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncClientRequestBatch2Str(pMsg);
- sTraceLong("syncClientRequestBatchLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncRequestVote----
-SyncRequestVote* syncRequestVoteBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncRequestVote);
- SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_REQUEST_VOTE;
- return pMsg;
-}
-
-void syncRequestVoteDestroy(SyncRequestVote* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncRequestVoteSerialize(const SyncRequestVote* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncRequestVoteDeserialize(const char* buf, uint32_t len, SyncRequestVote* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncRequestVoteSerialize2(const SyncRequestVote* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncRequestVoteSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncRequestVote* syncRequestVoteDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncRequestVote* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncRequestVoteDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncRequestVote2RpcMsg(const SyncRequestVote* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncRequestVoteSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncRequestVoteFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVote* pMsg) {
- syncRequestVoteDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncRequestVote* syncRequestVoteFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncRequestVote* pMsg = syncRequestVoteDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncRequestVote2Json(const SyncRequestVote* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->lastLogIndex);
- cJSON_AddStringToObject(pRoot, "lastLogIndex", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->lastLogTerm);
- cJSON_AddStringToObject(pRoot, "lastLogTerm", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncRequestVote", pRoot);
- return pJson;
-}
-
-char* syncRequestVote2Str(const SyncRequestVote* pMsg) {
- cJSON* pJson = syncRequestVote2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncRequestVotePrint(const SyncRequestVote* pMsg) {
- char* serialized = syncRequestVote2Str(pMsg);
- printf("syncRequestVotePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncRequestVotePrint2(char* s, const SyncRequestVote* pMsg) {
- char* serialized = syncRequestVote2Str(pMsg);
- printf("syncRequestVotePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncRequestVoteLog(const SyncRequestVote* pMsg) {
- char* serialized = syncRequestVote2Str(pMsg);
- sTrace("syncRequestVoteLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncRequestVoteLog2(char* s, const SyncRequestVote* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncRequestVote2Str(pMsg);
- sTrace("syncRequestVoteLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncRequestVoteReply----
-SyncRequestVoteReply* syncRequestVoteReplyBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncRequestVoteReply);
- SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_REQUEST_VOTE_REPLY;
- return pMsg;
-}
-
-void syncRequestVoteReplyDestroy(SyncRequestVoteReply* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncRequestVoteReplySerialize(const SyncRequestVoteReply* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncRequestVoteReplyDeserialize(const char* buf, uint32_t len, SyncRequestVoteReply* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncRequestVoteReplySerialize2(const SyncRequestVoteReply* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncRequestVoteReplySerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncRequestVoteReply* syncRequestVoteReplyDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncRequestVoteReply* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncRequestVoteReplyDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncRequestVoteReply2RpcMsg(const SyncRequestVoteReply* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncRequestVoteReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncRequestVoteReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncRequestVoteReply* pMsg) {
- syncRequestVoteReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncRequestVoteReply* syncRequestVoteReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncRequestVoteReply* pMsg = syncRequestVoteReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncRequestVoteReply2Json(const SyncRequestVoteReply* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- cJSON_AddNumberToObject(pDestId, "addr", pMsg->destId.addr);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- cJSON_AddNumberToObject(pRoot, "vote_granted", pMsg->voteGranted);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncRequestVoteReply", pRoot);
- return pJson;
-}
-
-char* syncRequestVoteReply2Str(const SyncRequestVoteReply* pMsg) {
- cJSON* pJson = syncRequestVoteReply2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncRequestVoteReplyPrint(const SyncRequestVoteReply* pMsg) {
- char* serialized = syncRequestVoteReply2Str(pMsg);
- printf("syncRequestVoteReplyPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncRequestVoteReplyPrint2(char* s, const SyncRequestVoteReply* pMsg) {
- char* serialized = syncRequestVoteReply2Str(pMsg);
- printf("syncRequestVoteReplyPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncRequestVoteReplyLog(const SyncRequestVoteReply* pMsg) {
- char* serialized = syncRequestVoteReply2Str(pMsg);
- sTrace("syncRequestVoteReplyLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncRequestVoteReplyLog2(char* s, const SyncRequestVoteReply* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncRequestVoteReply2Str(pMsg);
- sTrace("syncRequestVoteReplyLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncAppendEntries----
-SyncAppendEntries* syncAppendEntriesBuild(uint32_t dataLen, int32_t vgId) {
- uint32_t bytes = sizeof(SyncAppendEntries) + dataLen;
- SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_APPEND_ENTRIES;
- pMsg->dataLen = dataLen;
- return pMsg;
-}
-
-void syncAppendEntriesDestroy(SyncAppendEntries* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncAppendEntriesSerialize(const SyncAppendEntries* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncAppendEntriesDeserialize(const char* buf, uint32_t len, SyncAppendEntries* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
- ASSERT(pMsg->bytes == sizeof(SyncAppendEntries) + pMsg->dataLen);
-}
-
-char* syncAppendEntriesSerialize2(const SyncAppendEntries* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncAppendEntriesSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncAppendEntries* syncAppendEntriesDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncAppendEntries* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncAppendEntriesDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncAppendEntries2RpcMsg(const SyncAppendEntries* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncAppendEntriesSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncAppendEntriesFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntries* pMsg) {
- syncAppendEntriesDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncAppendEntries* syncAppendEntriesFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncAppendEntries* pMsg = syncAppendEntriesDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncAppendEntries2Json(const SyncAppendEntries* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->privateTerm);
- cJSON_AddStringToObject(pRoot, "privateTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->prevLogIndex);
- cJSON_AddStringToObject(pRoot, "prevLogIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->prevLogTerm);
- cJSON_AddStringToObject(pRoot, "pre_log_term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->commitIndex);
- cJSON_AddStringToObject(pRoot, "commitIndex", u64buf);
-
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncAppendEntries", pRoot);
- return pJson;
-}
-
-char* syncAppendEntries2Str(const SyncAppendEntries* pMsg) {
- cJSON* pJson = syncAppendEntries2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncAppendEntriesPrint(const SyncAppendEntries* pMsg) {
- char* serialized = syncAppendEntries2Str(pMsg);
- printf("syncAppendEntriesPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesPrint2(char* s, const SyncAppendEntries* pMsg) {
- char* serialized = syncAppendEntries2Str(pMsg);
- printf("syncAppendEntriesPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesLog(const SyncAppendEntries* pMsg) {
- char* serialized = syncAppendEntries2Str(pMsg);
- sTrace("syncAppendEntriesLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesLog2(char* s, const SyncAppendEntries* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncAppendEntries2Str(pMsg);
- sTrace("syncAppendEntriesLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncAppendEntriesBatch----
-
-// block1: SOffsetAndContLen
-// block2: SOffsetAndContLen Array
-// block3: entry Array
-
-SyncAppendEntriesBatch* syncAppendEntriesBatchBuild(SSyncRaftEntry** entryPArr, int32_t arrSize, int32_t vgId) {
- ASSERT(entryPArr != NULL);
- ASSERT(arrSize >= 0);
-
- int32_t dataLen = 0;
- int32_t metaArrayLen = sizeof(SOffsetAndContLen) * arrSize; //
- int32_t entryArrayLen = 0;
- for (int i = 0; i < arrSize; ++i) { // SRpcMsg pCont
- SSyncRaftEntry* pEntry = entryPArr[i];
- entryArrayLen += pEntry->bytes;
- }
- dataLen += (metaArrayLen + entryArrayLen);
-
- uint32_t bytes = sizeof(SyncAppendEntriesBatch) + dataLen;
- SyncAppendEntriesBatch* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_APPEND_ENTRIES_BATCH;
- pMsg->dataCount = arrSize;
- pMsg->dataLen = dataLen;
-
- SOffsetAndContLen* metaArr = (SOffsetAndContLen*)(pMsg->data);
- char* pData = pMsg->data;
-
- for (int i = 0; i < arrSize; ++i) {
- // init meta
- if (i == 0) {
- metaArr[i].offset = metaArrayLen;
- metaArr[i].contLen = entryPArr[i]->bytes;
- } else {
- metaArr[i].offset = metaArr[i - 1].offset + metaArr[i - 1].contLen;
- metaArr[i].contLen = entryPArr[i]->bytes;
- }
-
- // init entry array
- ASSERT(metaArr[i].contLen == entryPArr[i]->bytes);
- memcpy(pData + metaArr[i].offset, entryPArr[i], metaArr[i].contLen);
- }
-
- return pMsg;
-}
-
-SOffsetAndContLen* syncAppendEntriesBatchMetaTableArray(SyncAppendEntriesBatch* pMsg) {
- return (SOffsetAndContLen*)(pMsg->data);
-}
-
-void syncAppendEntriesBatchDestroy(SyncAppendEntriesBatch* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncAppendEntriesBatchSerialize(const SyncAppendEntriesBatch* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncAppendEntriesBatchDeserialize(const char* buf, uint32_t len, SyncAppendEntriesBatch* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
- ASSERT(pMsg->bytes == sizeof(SyncAppendEntriesBatch) + pMsg->dataLen);
-}
-
-char* syncAppendEntriesBatchSerialize2(const SyncAppendEntriesBatch* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncAppendEntriesBatchSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncAppendEntriesBatch* syncAppendEntriesBatchDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncAppendEntriesBatch* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncAppendEntriesBatchDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncAppendEntriesBatch2RpcMsg(const SyncAppendEntriesBatch* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncAppendEntriesBatchSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncAppendEntriesBatchFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesBatch* pMsg) {
- syncAppendEntriesBatchDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncAppendEntriesBatch* syncAppendEntriesBatchFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncAppendEntriesBatch* pMsg = syncAppendEntriesBatchDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncAppendEntriesBatch2Json(const SyncAppendEntriesBatch* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->prevLogIndex);
- cJSON_AddStringToObject(pRoot, "prevLogIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->prevLogTerm);
- cJSON_AddStringToObject(pRoot, "prevLogTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->commitIndex);
- cJSON_AddStringToObject(pRoot, "commitIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->privateTerm);
- cJSON_AddStringToObject(pRoot, "privateTerm", u64buf);
-
- cJSON_AddNumberToObject(pRoot, "dataCount", pMsg->dataCount);
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
-
- int32_t metaArrayLen = sizeof(SOffsetAndContLen) * pMsg->dataCount; //
- int32_t entryArrayLen = pMsg->dataLen - metaArrayLen;
-
- cJSON_AddNumberToObject(pRoot, "metaArrayLen", metaArrayLen);
- cJSON_AddNumberToObject(pRoot, "entryArrayLen", entryArrayLen);
-
- SOffsetAndContLen* metaArr = (SOffsetAndContLen*)(pMsg->data);
-
- cJSON* pMetaArr = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "metaArr", pMetaArr);
- for (int i = 0; i < pMsg->dataCount; ++i) {
- cJSON* pMeta = cJSON_CreateObject();
- cJSON_AddNumberToObject(pMeta, "offset", metaArr[i].offset);
- cJSON_AddNumberToObject(pMeta, "contLen", metaArr[i].contLen);
- cJSON_AddItemToArray(pMetaArr, pMeta);
- }
-
- cJSON* pEntryArr = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "entryArr", pEntryArr);
- for (int i = 0; i < pMsg->dataCount; ++i) {
- SSyncRaftEntry* pEntry = (SSyncRaftEntry*)(pMsg->data + metaArr[i].offset);
- cJSON* pEntryJson = syncEntry2Json(pEntry);
- cJSON_AddItemToArray(pEntryArr, pEntryJson);
- }
-
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncAppendEntriesBatch", pRoot);
- return pJson;
-}
-
-char* syncAppendEntriesBatch2Str(const SyncAppendEntriesBatch* pMsg) {
- cJSON* pJson = syncAppendEntriesBatch2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncAppendEntriesBatchPrint(const SyncAppendEntriesBatch* pMsg) {
- char* serialized = syncAppendEntriesBatch2Str(pMsg);
- printf("syncAppendEntriesBatchPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesBatchPrint2(char* s, const SyncAppendEntriesBatch* pMsg) {
- char* serialized = syncAppendEntriesBatch2Str(pMsg);
- printf("syncAppendEntriesBatchPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesBatchLog(const SyncAppendEntriesBatch* pMsg) {
- char* serialized = syncAppendEntriesBatch2Str(pMsg);
- sTrace("syncAppendEntriesBatchLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesBatchLog2(char* s, const SyncAppendEntriesBatch* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncAppendEntriesBatch2Str(pMsg);
- sTraceLong("syncAppendEntriesBatchLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncAppendEntriesReply----
-SyncAppendEntriesReply* syncAppendEntriesReplyBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncAppendEntriesReply);
- SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_APPEND_ENTRIES_REPLY;
- return pMsg;
-}
-
-void syncAppendEntriesReplyDestroy(SyncAppendEntriesReply* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncAppendEntriesReplySerialize(const SyncAppendEntriesReply* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncAppendEntriesReplyDeserialize(const char* buf, uint32_t len, SyncAppendEntriesReply* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncAppendEntriesReplySerialize2(const SyncAppendEntriesReply* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncAppendEntriesReplySerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncAppendEntriesReply* syncAppendEntriesReplyDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncAppendEntriesReply* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncAppendEntriesReplyDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncAppendEntriesReply2RpcMsg(const SyncAppendEntriesReply* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncAppendEntriesReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncAppendEntriesReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesReply* pMsg) {
- syncAppendEntriesReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncAppendEntriesReply* syncAppendEntriesReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncAppendEntriesReply* pMsg = syncAppendEntriesReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncAppendEntriesReply2Json(const SyncAppendEntriesReply* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->privateTerm);
- cJSON_AddStringToObject(pRoot, "privateTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- cJSON_AddNumberToObject(pRoot, "success", pMsg->success);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->matchIndex);
- cJSON_AddStringToObject(pRoot, "matchIndex", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->startTime);
- cJSON_AddStringToObject(pRoot, "startTime", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncAppendEntriesReply", pRoot);
- return pJson;
-}
-
-char* syncAppendEntriesReply2Str(const SyncAppendEntriesReply* pMsg) {
- cJSON* pJson = syncAppendEntriesReply2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncAppendEntriesReplyPrint(const SyncAppendEntriesReply* pMsg) {
- char* serialized = syncAppendEntriesReply2Str(pMsg);
- printf("syncAppendEntriesReplyPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesReplyPrint2(char* s, const SyncAppendEntriesReply* pMsg) {
- char* serialized = syncAppendEntriesReply2Str(pMsg);
- printf("syncAppendEntriesReplyPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesReplyLog(const SyncAppendEntriesReply* pMsg) {
- char* serialized = syncAppendEntriesReply2Str(pMsg);
- sTrace("syncAppendEntriesReplyLog | len:%d| %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncAppendEntriesReplyLog2(char* s, const SyncAppendEntriesReply* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncAppendEntriesReply2Str(pMsg);
- sTrace("syncAppendEntriesReplyLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncHeartbeat----
-SyncHeartbeat* syncHeartbeatBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncHeartbeat);
- SyncHeartbeat* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_HEARTBEAT;
- return pMsg;
-}
-
-void syncHeartbeatDestroy(SyncHeartbeat* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncHeartbeatSerialize(const SyncHeartbeat* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncHeartbeatDeserialize(const char* buf, uint32_t len, SyncHeartbeat* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncHeartbeatSerialize2(const SyncHeartbeat* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncHeartbeatSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncHeartbeat* syncHeartbeatDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncHeartbeat* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncHeartbeatDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncHeartbeat2RpcMsg(const SyncHeartbeat* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncHeartbeatSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncHeartbeatFromRpcMsg(const SRpcMsg* pRpcMsg, SyncHeartbeat* pMsg) {
- syncHeartbeatDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncHeartbeat* syncHeartbeatFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncHeartbeat* pMsg = syncHeartbeatDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncHeartbeat2Json(const SyncHeartbeat* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->privateTerm);
- cJSON_AddStringToObject(pRoot, "privateTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->commitIndex);
- cJSON_AddStringToObject(pRoot, "commitIndex", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncHeartbeat", pRoot);
- return pJson;
-}
-
-char* syncHeartbeat2Str(const SyncHeartbeat* pMsg) {
- cJSON* pJson = syncHeartbeat2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-void syncHeartbeatPrint(const SyncHeartbeat* pMsg) {
- char* serialized = syncHeartbeat2Str(pMsg);
- printf("syncHeartbeatPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncHeartbeatPrint2(char* s, const SyncHeartbeat* pMsg) {
- char* serialized = syncHeartbeat2Str(pMsg);
- printf("syncHeartbeatPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncHeartbeatLog(const SyncHeartbeat* pMsg) {
- char* serialized = syncHeartbeat2Str(pMsg);
- sTrace("syncHeartbeatLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncHeartbeatLog2(char* s, const SyncHeartbeat* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncHeartbeat2Str(pMsg);
- sTrace("syncHeartbeatLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncHeartbeatReply----
-SyncHeartbeatReply* syncHeartbeatReplyBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncHeartbeatReply);
- SyncHeartbeatReply* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_HEARTBEAT_REPLY;
- return pMsg;
-}
-
-void syncHeartbeatReplyDestroy(SyncHeartbeatReply* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncHeartbeatReplySerialize(const SyncHeartbeatReply* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncHeartbeatReplyDeserialize(const char* buf, uint32_t len, SyncHeartbeatReply* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncHeartbeatReplySerialize2(const SyncHeartbeatReply* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncHeartbeatReplySerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncHeartbeatReply* syncHeartbeatReplyDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncHeartbeatReply* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncHeartbeatReplyDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncHeartbeatReply2RpcMsg(const SyncHeartbeatReply* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncHeartbeatReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncHeartbeatReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncHeartbeatReply* pMsg) {
- syncHeartbeatReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncHeartbeatReply* syncHeartbeatReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncHeartbeatReply* pMsg = syncHeartbeatReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncHeartbeatReply2Json(const SyncHeartbeatReply* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->privateTerm);
- cJSON_AddStringToObject(pRoot, "privateTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- cJSON_AddStringToObject(pRoot, "matchIndex", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->startTime);
- cJSON_AddStringToObject(pRoot, "startTime", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncHeartbeatReply", pRoot);
- return pJson;
-}
-
-char* syncHeartbeatReply2Str(const SyncHeartbeatReply* pMsg) {
- cJSON* pJson = syncHeartbeatReply2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-void syncHeartbeatReplyPrint(const SyncHeartbeatReply* pMsg) {
- char* serialized = syncHeartbeatReply2Str(pMsg);
- printf("syncHeartbeatReplyPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncHeartbeatReplyPrint2(char* s, const SyncHeartbeatReply* pMsg) {
- char* serialized = syncHeartbeatReply2Str(pMsg);
- printf("syncHeartbeatReplyPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncHeartbeatReplyLog(const SyncHeartbeatReply* pMsg) {
- char* serialized = syncHeartbeatReply2Str(pMsg);
- sTrace("syncHeartbeatReplyLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncHeartbeatReplyLog2(char* s, const SyncHeartbeatReply* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncHeartbeatReply2Str(pMsg);
- sTrace("syncHeartbeatReplyLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncPreSnapshot----
-SyncPreSnapshot* syncPreSnapshotBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncPreSnapshot);
- SyncPreSnapshot* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_PRE_SNAPSHOT;
- return pMsg;
-}
-
-void syncPreSnapshotDestroy(SyncPreSnapshot* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncPreSnapshotSerialize(const SyncPreSnapshot* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncPreSnapshotDeserialize(const char* buf, uint32_t len, SyncPreSnapshot* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncPreSnapshotSerialize2(const SyncPreSnapshot* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncPreSnapshotSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncPreSnapshot* syncPreSnapshotDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncPreSnapshot* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncPreSnapshotDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncPreSnapshot2RpcMsg(const SyncPreSnapshot* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncPreSnapshotSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncPreSnapshotFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPreSnapshot* pMsg) {
- syncPreSnapshotDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncPreSnapshot* syncPreSnapshotFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncPreSnapshot* pMsg = syncPreSnapshotDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncPreSnapshot2Json(const SyncPreSnapshot* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncPreSnapshot", pRoot);
- return pJson;
-}
-
-char* syncPreSnapshot2Str(const SyncPreSnapshot* pMsg) {
- cJSON* pJson = syncPreSnapshot2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-void syncPreSnapshotPrint(const SyncPreSnapshot* pMsg) {
- char* serialized = syncPreSnapshot2Str(pMsg);
- printf("syncPreSnapshotPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPreSnapshotPrint2(char* s, const SyncPreSnapshot* pMsg) {
- char* serialized = syncPreSnapshot2Str(pMsg);
- printf("syncPreSnapshotPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPreSnapshotLog(const SyncPreSnapshot* pMsg) {
- char* serialized = syncPreSnapshot2Str(pMsg);
- sTrace("syncPreSnapshotLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncPreSnapshotLog2(char* s, const SyncPreSnapshot* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncPreSnapshot2Str(pMsg);
- sTrace("syncPreSnapshotLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncPreSnapshotReply----
-SyncPreSnapshotReply* syncPreSnapshotReplyBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncPreSnapshotReply);
- SyncPreSnapshotReply* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_PRE_SNAPSHOT_REPLY;
- return pMsg;
-}
-
-void syncPreSnapshotReplyDestroy(SyncPreSnapshotReply* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncPreSnapshotReplySerialize(const SyncPreSnapshotReply* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncPreSnapshotReplyDeserialize(const char* buf, uint32_t len, SyncPreSnapshotReply* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncPreSnapshotReplySerialize2(const SyncPreSnapshotReply* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncPreSnapshotReplySerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncPreSnapshotReply* syncPreSnapshotReplyDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncPreSnapshotReply* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncPreSnapshotReplyDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncPreSnapshotReply2RpcMsg(const SyncPreSnapshotReply* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncPreSnapshotReplySerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncPreSnapshotReplyFromRpcMsg(const SRpcMsg* pRpcMsg, SyncPreSnapshotReply* pMsg) {
- syncPreSnapshotReplyDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncPreSnapshotReply* syncPreSnapshotReplyFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncPreSnapshotReply* pMsg = syncPreSnapshotReplyDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncPreSnapshotReply2Json(const SyncPreSnapshotReply* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->snapStart);
- cJSON_AddStringToObject(pRoot, "snap-start", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncPreSnapshotReply", pRoot);
- return pJson;
-}
-
-char* syncPreSnapshotReply2Str(const SyncPreSnapshotReply* pMsg) {
- cJSON* pJson = syncPreSnapshotReply2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-void syncPreSnapshotReplyPrint(const SyncPreSnapshotReply* pMsg) {
- char* serialized = syncPreSnapshotReply2Str(pMsg);
- printf("syncPreSnapshotReplyPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPreSnapshotReplyPrint2(char* s, const SyncPreSnapshotReply* pMsg) {
- char* serialized = syncPreSnapshotReply2Str(pMsg);
- printf("syncPreSnapshotReplyPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncPreSnapshotReplyLog(const SyncPreSnapshotReply* pMsg) {
- char* serialized = syncPreSnapshotReply2Str(pMsg);
- sTrace("syncPreSnapshotReplyLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncPreSnapshotReplyLog2(char* s, const SyncPreSnapshotReply* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncPreSnapshotReply2Str(pMsg);
- sTrace("syncPreSnapshotReplyLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---- message process SyncApplyMsg----
-SyncApplyMsg* syncApplyMsgBuild(uint32_t dataLen) {
- uint32_t bytes = sizeof(SyncApplyMsg) + dataLen;
- SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->msgType = TDMT_SYNC_APPLY_MSG;
- pMsg->dataLen = dataLen;
- return pMsg;
-}
-
-SyncApplyMsg* syncApplyMsgBuild2(const SRpcMsg* pOriginalRpcMsg, int32_t vgId, SFsmCbMeta* pMeta) {
- SyncApplyMsg* pMsg = syncApplyMsgBuild(pOriginalRpcMsg->contLen);
- pMsg->vgId = vgId;
- pMsg->originalRpcType = pOriginalRpcMsg->msgType;
- pMsg->fsmMeta = *pMeta;
- memcpy(pMsg->data, pOriginalRpcMsg->pCont, pOriginalRpcMsg->contLen);
- return pMsg;
-}
-
-void syncApplyMsgDestroy(SyncApplyMsg* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncApplyMsgSerialize(const SyncApplyMsg* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncApplyMsgDeserialize(const char* buf, uint32_t len, SyncApplyMsg* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncApplyMsgSerialize2(const SyncApplyMsg* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncApplyMsgSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncApplyMsg* syncApplyMsgDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncApplyMsg* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncApplyMsgDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-// SyncApplyMsg to SRpcMsg, put it into ApplyQ
-void syncApplyMsg2RpcMsg(const SyncApplyMsg* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncApplyMsgSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-// get SRpcMsg from ApplyQ, to SyncApplyMsg
-void syncApplyMsgFromRpcMsg(const SRpcMsg* pRpcMsg, SyncApplyMsg* pMsg) {
- syncApplyMsgDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncApplyMsg* syncApplyMsgFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncApplyMsg* pMsg = syncApplyMsgDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- return pMsg;
-}
-
-// SyncApplyMsg to OriginalRpcMsg
-void syncApplyMsg2OriginalRpcMsg(const SyncApplyMsg* pMsg, SRpcMsg* pOriginalRpcMsg) {
- memset(pOriginalRpcMsg, 0, sizeof(*pOriginalRpcMsg));
- pOriginalRpcMsg->msgType = pMsg->originalRpcType;
- pOriginalRpcMsg->contLen = pMsg->dataLen;
- pOriginalRpcMsg->pCont = rpcMallocCont(pOriginalRpcMsg->contLen);
- memcpy(pOriginalRpcMsg->pCont, pMsg->data, pOriginalRpcMsg->contLen);
-}
-
-cJSON* syncApplyMsg2Json(const SyncApplyMsg* pMsg) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
- cJSON_AddNumberToObject(pRoot, "originalRpcType", pMsg->originalRpcType);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->fsmMeta.index);
- cJSON_AddStringToObject(pRoot, "fsmMeta.index", u64buf);
- cJSON_AddNumberToObject(pRoot, "fsmMeta.isWeak", pMsg->fsmMeta.isWeak);
- cJSON_AddNumberToObject(pRoot, "fsmMeta.code", pMsg->fsmMeta.code);
- cJSON_AddNumberToObject(pRoot, "fsmMeta.state", pMsg->fsmMeta.state);
- cJSON_AddStringToObject(pRoot, "fsmMeta.state.str", syncStr(pMsg->fsmMeta.state));
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->fsmMeta.seqNum);
- cJSON_AddStringToObject(pRoot, "fsmMeta.seqNum", u64buf);
-
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncApplyMsg", pRoot);
- return pJson;
-}
-
-char* syncApplyMsg2Str(const SyncApplyMsg* pMsg) {
- cJSON* pJson = syncApplyMsg2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncApplyMsgPrint(const SyncApplyMsg* pMsg) {
- char* serialized = syncApplyMsg2Str(pMsg);
- printf("syncApplyMsgPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncApplyMsgPrint2(char* s, const SyncApplyMsg* pMsg) {
- char* serialized = syncApplyMsg2Str(pMsg);
- printf("syncApplyMsgPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncApplyMsgLog(const SyncApplyMsg* pMsg) {
- char* serialized = syncApplyMsg2Str(pMsg);
- sTrace("ssyncApplyMsgLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncApplyMsgLog2(char* s, const SyncApplyMsg* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncApplyMsg2Str(pMsg);
- sTrace("syncApplyMsgLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---------------------------------------------
-SyncSnapshotSend* syncSnapshotSendBuild(uint32_t dataLen, int32_t vgId) {
- uint32_t bytes = sizeof(SyncSnapshotSend) + dataLen;
- SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_SNAPSHOT_SEND;
- pMsg->dataLen = dataLen;
- return pMsg;
-}
-
-void syncSnapshotSendDestroy(SyncSnapshotSend* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncSnapshotSendSerialize(const SyncSnapshotSend* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncSnapshotSendDeserialize(const char* buf, uint32_t len, SyncSnapshotSend* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
- ASSERT(pMsg->bytes == sizeof(SyncSnapshotSend) + pMsg->dataLen);
-}
-
-char* syncSnapshotSendSerialize2(const SyncSnapshotSend* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncSnapshotSendSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncSnapshotSend* syncSnapshotSendDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncSnapshotSend* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncSnapshotSendDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncSnapshotSend2RpcMsg(const SyncSnapshotSend* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncSnapshotSendSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncSnapshotSendFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotSend* pMsg) {
- syncSnapshotSendDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncSnapshotSend* syncSnapshotSendFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncSnapshotSend* pMsg = syncSnapshotSendDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncSnapshotSend2Json(const SyncSnapshotSend* pMsg) {
- char u64buf[128];
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->startTime);
- cJSON_AddStringToObject(pRoot, "startTime", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->beginIndex);
- cJSON_AddStringToObject(pRoot, "beginIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->lastIndex);
- cJSON_AddStringToObject(pRoot, "lastIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->lastConfigIndex);
- cJSON_AddStringToObject(pRoot, "lastConfigIndex", u64buf);
- cJSON_AddItemToObject(pRoot, "lastConfig", syncCfg2Json((SSyncCfg*)&(pMsg->lastConfig)));
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->lastTerm);
- cJSON_AddStringToObject(pRoot, "lastTerm", u64buf);
-
- cJSON_AddNumberToObject(pRoot, "seq", pMsg->seq);
-
- cJSON_AddNumberToObject(pRoot, "dataLen", pMsg->dataLen);
- char* s;
- s = syncUtilprintBin((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char*)(pMsg->data), pMsg->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncSnapshotSend", pRoot);
- return pJson;
-}
-
-char* syncSnapshotSend2Str(const SyncSnapshotSend* pMsg) {
- cJSON* pJson = syncSnapshotSend2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncSnapshotSendPrint(const SyncSnapshotSend* pMsg) {
- char* serialized = syncSnapshotSend2Str(pMsg);
- printf("syncSnapshotSendPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncSnapshotSendPrint2(char* s, const SyncSnapshotSend* pMsg) {
- char* serialized = syncSnapshotSend2Str(pMsg);
- printf("syncSnapshotSendPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncSnapshotSendLog(const SyncSnapshotSend* pMsg) {
- char* serialized = syncSnapshotSend2Str(pMsg);
- sTrace("syncSnapshotSendLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncSnapshotSendLog2(char* s, const SyncSnapshotSend* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncSnapshotSend2Str(pMsg);
- sTrace("syncSnapshotSendLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---------------------------------------------
-SyncSnapshotRsp* syncSnapshotRspBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncSnapshotRsp);
- SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_SNAPSHOT_RSP;
- return pMsg;
-}
-
-void syncSnapshotRspDestroy(SyncSnapshotRsp* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncSnapshotRspSerialize(const SyncSnapshotRsp* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncSnapshotRspDeserialize(const char* buf, uint32_t len, SyncSnapshotRsp* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncSnapshotRspSerialize2(const SyncSnapshotRsp* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncSnapshotRspSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncSnapshotRsp* syncSnapshotRspDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncSnapshotRsp* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncSnapshotRspDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncSnapshotRsp2RpcMsg(const SyncSnapshotRsp* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncSnapshotRspSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncSnapshotRspFromRpcMsg(const SRpcMsg* pRpcMsg, SyncSnapshotRsp* pMsg) {
- syncSnapshotRspDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncSnapshotRsp* syncSnapshotRspFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncSnapshotRsp* pMsg = syncSnapshotRspDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncSnapshotRsp2Json(const SyncSnapshotRsp* pMsg) {
- char u64buf[128];
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->startTime);
- cJSON_AddStringToObject(pRoot, "startTime", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->lastIndex);
- cJSON_AddStringToObject(pRoot, "lastIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->lastTerm);
- cJSON_AddStringToObject(pRoot, "lastTerm", u64buf);
-
- cJSON_AddNumberToObject(pRoot, "ack", pMsg->ack);
- cJSON_AddNumberToObject(pRoot, "code", pMsg->code);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->snapBeginIndex);
- cJSON_AddStringToObject(pRoot, "snap-begin", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncSnapshotRsp", pRoot);
- return pJson;
-}
-
-char* syncSnapshotRsp2Str(const SyncSnapshotRsp* pMsg) {
- cJSON* pJson = syncSnapshotRsp2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncSnapshotRspPrint(const SyncSnapshotRsp* pMsg) {
- char* serialized = syncSnapshotRsp2Str(pMsg);
- printf("syncSnapshotRspPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncSnapshotRspPrint2(char* s, const SyncSnapshotRsp* pMsg) {
- char* serialized = syncSnapshotRsp2Str(pMsg);
- printf("syncSnapshotRspPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncSnapshotRspLog(const SyncSnapshotRsp* pMsg) {
- char* serialized = syncSnapshotRsp2Str(pMsg);
- sTrace("syncSnapshotRspLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncSnapshotRspLog2(char* s, const SyncSnapshotRsp* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncSnapshotRsp2Str(pMsg);
- sTrace("syncSnapshotRspLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---------------------------------------------
-SyncLeaderTransfer* syncLeaderTransferBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncLeaderTransfer);
- SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_LEADER_TRANSFER;
- return pMsg;
-}
-
-void syncLeaderTransferDestroy(SyncLeaderTransfer* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncLeaderTransferSerialize(const SyncLeaderTransfer* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncLeaderTransferDeserialize(const char* buf, uint32_t len, SyncLeaderTransfer* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncLeaderTransferSerialize2(const SyncLeaderTransfer* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncLeaderTransferSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncLeaderTransfer* syncLeaderTransferDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncLeaderTransfer* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncLeaderTransferDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncLeaderTransfer2RpcMsg(const SyncLeaderTransfer* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncLeaderTransferSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncLeaderTransferFromRpcMsg(const SRpcMsg* pRpcMsg, SyncLeaderTransfer* pMsg) {
- syncLeaderTransferDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncLeaderTransfer* syncLeaderTransferFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncLeaderTransfer* pMsg = syncLeaderTransferDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncLeaderTransfer2Json(const SyncLeaderTransfer* pMsg) {
- char u64buf[128];
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- /*
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
- */
-
- cJSON* pNewerId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->newLeaderId.addr);
- cJSON_AddStringToObject(pNewerId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->newLeaderId.addr;
- cJSON* pTmp = pNewerId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pNewerId, "vgId", pMsg->newLeaderId.vgId);
- cJSON_AddItemToObject(pRoot, "newLeaderId", pNewerId);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncLeaderTransfer", pRoot);
- return pJson;
-}
-
-char* syncLeaderTransfer2Str(const SyncLeaderTransfer* pMsg) {
- cJSON* pJson = syncLeaderTransfer2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncLeaderTransferPrint(const SyncLeaderTransfer* pMsg) {
- char* serialized = syncLeaderTransfer2Str(pMsg);
- printf("syncLeaderTransferPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncLeaderTransferPrint2(char* s, const SyncLeaderTransfer* pMsg) {
- char* serialized = syncLeaderTransfer2Str(pMsg);
- printf("syncLeaderTransferPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncLeaderTransferLog(const SyncLeaderTransfer* pMsg) {
- char* serialized = syncLeaderTransfer2Str(pMsg);
- sTrace("syncLeaderTransferLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncLeaderTransferLog2(char* s, const SyncLeaderTransfer* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncLeaderTransfer2Str(pMsg);
- sTrace("syncLeaderTransferLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---------------------------------------------
-SyncReconfigFinish* syncReconfigFinishBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncReconfigFinish);
- SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_CONFIG_CHANGE_FINISH;
- return pMsg;
-}
-
-void syncReconfigFinishDestroy(SyncReconfigFinish* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncReconfigFinishSerialize(const SyncReconfigFinish* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncReconfigFinishDeserialize(const char* buf, uint32_t len, SyncReconfigFinish* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncReconfigFinishSerialize2(const SyncReconfigFinish* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncReconfigFinishSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncReconfigFinish* syncReconfigFinishDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncReconfigFinish* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncReconfigFinishDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncReconfigFinish2RpcMsg(const SyncReconfigFinish* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncReconfigFinishSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncReconfigFinishFromRpcMsg(const SRpcMsg* pRpcMsg, SyncReconfigFinish* pMsg) {
- syncReconfigFinishDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncReconfigFinish* syncReconfigFinishFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncReconfigFinish* pMsg = syncReconfigFinishDeserialize2(pRpcMsg->pCont, (uint32_t)(pRpcMsg->contLen));
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncReconfigFinish2Json(const SyncReconfigFinish* pMsg) {
- char u64buf[128];
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pOldCfg = syncCfg2Json((SSyncCfg*)(&(pMsg->oldCfg)));
- cJSON* pNewCfg = syncCfg2Json((SSyncCfg*)(&(pMsg->newCfg)));
- cJSON_AddItemToObject(pRoot, "oldCfg", pOldCfg);
- cJSON_AddItemToObject(pRoot, "newCfg", pNewCfg);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->newCfgIndex);
- cJSON_AddStringToObject(pRoot, "newCfgIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->newCfgTerm);
- cJSON_AddStringToObject(pRoot, "newCfgTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->newCfgSeqNum);
- cJSON_AddStringToObject(pRoot, "newCfgSeqNum", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncReconfigFinish", pRoot);
- return pJson;
-}
-
-char* syncReconfigFinish2Str(const SyncReconfigFinish* pMsg) {
- cJSON* pJson = syncReconfigFinish2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncReconfigFinishPrint(const SyncReconfigFinish* pMsg) {
- char* serialized = syncReconfigFinish2Str(pMsg);
- printf("syncReconfigFinishPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncReconfigFinishPrint2(char* s, const SyncReconfigFinish* pMsg) {
- char* serialized = syncReconfigFinish2Str(pMsg);
- printf("syncReconfigFinishPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncReconfigFinishLog(const SyncReconfigFinish* pMsg) {
- char* serialized = syncReconfigFinish2Str(pMsg);
- sTrace("syncReconfigFinishLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncReconfigFinishLog2(char* s, const SyncReconfigFinish* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncReconfigFinish2Str(pMsg);
- sTrace("syncReconfigFinishLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// ---------------------------------------------
-const char* syncLocalCmdGetStr(int32_t cmd) {
- if (cmd == SYNC_LOCAL_CMD_STEP_DOWN) {
- return "step-down";
- } else if (cmd == SYNC_LOCAL_CMD_FOLLOWER_CMT) {
- return "follower-commit";
- }
-
- return "unknown-local-cmd";
-}
-
-SyncLocalCmd* syncLocalCmdBuild(int32_t vgId) {
- uint32_t bytes = sizeof(SyncLocalCmd);
- SyncLocalCmd* pMsg = taosMemoryMalloc(bytes);
- memset(pMsg, 0, bytes);
- pMsg->bytes = bytes;
- pMsg->vgId = vgId;
- pMsg->msgType = TDMT_SYNC_LOCAL_CMD;
- return pMsg;
-}
-
-void syncLocalCmdDestroy(SyncLocalCmd* pMsg) {
- if (pMsg != NULL) {
- taosMemoryFree(pMsg);
- }
-}
-
-void syncLocalCmdSerialize(const SyncLocalCmd* pMsg, char* buf, uint32_t bufLen) {
- ASSERT(pMsg->bytes <= bufLen);
- memcpy(buf, pMsg, pMsg->bytes);
-}
-
-void syncLocalCmdDeserialize(const char* buf, uint32_t len, SyncLocalCmd* pMsg) {
- memcpy(pMsg, buf, len);
- ASSERT(len == pMsg->bytes);
-}
-
-char* syncLocalCmdSerialize2(const SyncLocalCmd* pMsg, uint32_t* len) {
- char* buf = taosMemoryMalloc(pMsg->bytes);
- ASSERT(buf != NULL);
- syncLocalCmdSerialize(pMsg, buf, pMsg->bytes);
- if (len != NULL) {
- *len = pMsg->bytes;
- }
- return buf;
-}
-
-SyncLocalCmd* syncLocalCmdDeserialize2(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SyncLocalCmd* pMsg = taosMemoryMalloc(bytes);
- ASSERT(pMsg != NULL);
- syncLocalCmdDeserialize(buf, len, pMsg);
- ASSERT(len == pMsg->bytes);
- return pMsg;
-}
-
-void syncLocalCmd2RpcMsg(const SyncLocalCmd* pMsg, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
- pRpcMsg->msgType = pMsg->msgType;
- pRpcMsg->contLen = pMsg->bytes;
- pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
- syncLocalCmdSerialize(pMsg, pRpcMsg->pCont, pRpcMsg->contLen);
-}
-
-void syncLocalCmdFromRpcMsg(const SRpcMsg* pRpcMsg, SyncLocalCmd* pMsg) {
- syncLocalCmdDeserialize(pRpcMsg->pCont, pRpcMsg->contLen, pMsg);
-}
-
-SyncLocalCmd* syncLocalCmdFromRpcMsg2(const SRpcMsg* pRpcMsg) {
- SyncLocalCmd* pMsg = syncLocalCmdDeserialize2(pRpcMsg->pCont, pRpcMsg->contLen);
- ASSERT(pMsg != NULL);
- return pMsg;
-}
-
-cJSON* syncLocalCmd2Json(const SyncLocalCmd* pMsg) {
- char u64buf[128];
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pMsg != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pMsg->bytes);
- cJSON_AddNumberToObject(pRoot, "vgId", pMsg->vgId);
- cJSON_AddNumberToObject(pRoot, "msgType", pMsg->msgType);
-
- cJSON* pSrcId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->srcId.addr);
- cJSON_AddStringToObject(pSrcId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->srcId.addr;
- cJSON* pTmp = pSrcId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pSrcId, "vgId", pMsg->srcId.vgId);
- cJSON_AddItemToObject(pRoot, "srcId", pSrcId);
-
- cJSON* pDestId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->destId.addr);
- cJSON_AddStringToObject(pDestId, "addr", u64buf);
- {
- uint64_t u64 = pMsg->destId.addr;
- cJSON* pTmp = pDestId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pDestId, "vgId", pMsg->destId.vgId);
- cJSON_AddItemToObject(pRoot, "destId", pDestId);
-
- cJSON_AddNumberToObject(pRoot, "cmd", pMsg->cmd);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pMsg->sdNewTerm);
- cJSON_AddStringToObject(pRoot, "sd-new-term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pMsg->fcIndex);
- cJSON_AddStringToObject(pRoot, "fc-index", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SyncLocalCmd2Json", pRoot);
- return pJson;
-}
-
-char* syncLocalCmd2Str(const SyncLocalCmd* pMsg) {
- cJSON* pJson = syncLocalCmd2Json(pMsg);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug ----------------------
-void syncLocalCmdPrint(const SyncLocalCmd* pMsg) {
- char* serialized = syncLocalCmd2Str(pMsg);
- printf("syncLocalCmdPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncLocalCmdPrint2(char* s, const SyncLocalCmd* pMsg) {
- char* serialized = syncLocalCmd2Str(pMsg);
- printf("syncLocalCmdPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncLocalCmdLog(const SyncLocalCmd* pMsg) {
- char* serialized = syncLocalCmd2Str(pMsg);
- sTrace("syncLocalCmdLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncLocalCmdLog2(char* s, const SyncLocalCmd* pMsg) {
- if (gRaftDetailLog) {
- char* serialized = syncLocalCmd2Str(pMsg);
- sTrace("syncLocalCmdLog2 | len:%d | %s | %s", (int32_t)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 7c8f503de6b3ffec9cb118cf9972bbf17ff412ee..b425b0dba75918ba9cae04032a6cd302f7b216c3 100644
--- a/source/libs/sync/src/syncRaftCfg.c
+++ b/source/libs/sync/src/syncRaftCfg.c
@@ -13,9 +13,8 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRaftCfg.h"
-#include "cJSON.h"
-#include "syncEnv.h"
#include "syncUtil.h"
// file must already exist!
@@ -242,40 +241,6 @@ cJSON *syncCfg2Json(SSyncCfg *pSyncCfg) {
return pRoot;
}
-char *syncCfg2Str(SSyncCfg *pSyncCfg) {
- cJSON *pJson = syncCfg2Json(pSyncCfg);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-char *syncCfg2SimpleStr(SSyncCfg *pSyncCfg) {
- if (pSyncCfg != NULL) {
- int32_t len = 512;
- char *s = taosMemoryMalloc(len);
- memset(s, 0, len);
-
- snprintf(s, len, "{r-num:%d, my:%d, ", pSyncCfg->replicaNum, pSyncCfg->myIndex);
- char *p = s + strlen(s);
- for (int i = 0; i < pSyncCfg->replicaNum; ++i) {
- /*
- if (p + 128 + 32 > s + len) {
- break;
- }
- */
- char buf[128 + 32];
- snprintf(buf, sizeof(buf), "%s:%d, ", pSyncCfg->nodeInfo[i].nodeFqdn, pSyncCfg->nodeInfo[i].nodePort);
- strncpy(p, buf, sizeof(buf));
- p = s + strlen(s);
- }
- strcpy(p - 2, "}");
-
- return s;
- }
-
- return NULL;
-}
-
int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
memset(pSyncCfg, 0, sizeof(SSyncCfg));
// cJSON *pJson = cJSON_GetObjectItem(pRoot, "SSyncCfg");
@@ -310,17 +275,6 @@ int32_t syncCfgFromJson(const cJSON *pRoot, SSyncCfg *pSyncCfg) {
return 0;
}
-int32_t syncCfgFromStr(const char *s, SSyncCfg *pSyncCfg) {
- cJSON *pRoot = cJSON_Parse(s);
- ASSERT(pRoot != NULL);
-
- int32_t ret = syncCfgFromJson(pRoot, pSyncCfg);
- ASSERT(ret == 0);
-
- cJSON_Delete(pRoot);
- return 0;
-}
-
cJSON *raftCfg2Json(SRaftCfg *pRaftCfg) {
cJSON *pRoot = cJSON_CreateObject();
cJSON_AddItemToObject(pRoot, "SSyncCfg", syncCfg2Json(&(pRaftCfg->cfg)));
@@ -442,88 +396,3 @@ int32_t raftCfgFromStr(const char *s, SRaftCfg *pRaftCfg) {
return 0;
}
-// for debug ----------------------
-void syncCfgPrint(SSyncCfg *pCfg) {
- char *serialized = syncCfg2Str(pCfg);
- printf("syncCfgPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncCfgPrint2(char *s, SSyncCfg *pCfg) {
- char *serialized = syncCfg2Str(pCfg);
- printf("syncCfgPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncCfgLog(SSyncCfg *pCfg) {
- char *serialized = syncCfg2Str(pCfg);
- sTrace("syncCfgLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncCfgLog2(char *s, SSyncCfg *pCfg) {
- char *serialized = syncCfg2Str(pCfg);
- sTrace("syncCfgLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
-
-void syncCfgLog3(char *s, SSyncCfg *pCfg) {
- char *serialized = syncCfg2SimpleStr(pCfg);
- sTrace("syncCfgLog3 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
-
-void raftCfgPrint(SRaftCfg *pCfg) {
- char *serialized = raftCfg2Str(pCfg);
- printf("raftCfgPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftCfgPrint2(char *s, SRaftCfg *pCfg) {
- char *serialized = raftCfg2Str(pCfg);
- printf("raftCfgPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftCfgLog(SRaftCfg *pCfg) {
- char *serialized = raftCfg2Str(pCfg);
- sTrace("raftCfgLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void raftCfgLog2(char *s, SRaftCfg *pCfg) {
- char *serialized = raftCfg2Str(pCfg);
- sTrace("raftCfgLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
-
-// ---------
-void raftCfgIndexPrint(SRaftCfgIndex *pCfg) {
- char *serialized = raftCfgIndex2Str(pCfg);
- printf("raftCfgIndexPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftCfgIndexPrint2(char *s, SRaftCfgIndex *pCfg) {
- char *serialized = raftCfgIndex2Str(pCfg);
- printf("raftCfgIndexPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftCfgIndexLog(SRaftCfgIndex *pCfg) {
- char *serialized = raftCfgIndex2Str(pCfg);
- sTrace("raftCfgIndexLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void raftCfgIndexLog2(char *s, SRaftCfgIndex *pCfg) {
- char *serialized = raftCfgIndex2Str(pCfg);
- sTrace("raftCfgIndexLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
diff --git a/source/libs/sync/src/syncRaftEntry.c b/source/libs/sync/src/syncRaftEntry.c
index aba61edf0d35900dff0e1930318b83d18caec7a6..a7594091639c3ce69c25abfe993b908e43084c28 100644
--- a/source/libs/sync/src/syncRaftEntry.c
+++ b/source/libs/sync/src/syncRaftEntry.c
@@ -13,31 +13,29 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRaftEntry.h"
#include "syncUtil.h"
+#include "tref.h"
-SSyncRaftEntry* syncEntryBuild(uint32_t dataLen) {
- uint32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
+SSyncRaftEntry* syncEntryBuild(int32_t dataLen) {
+ int32_t bytes = sizeof(SSyncRaftEntry) + dataLen;
SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
- ASSERT(pEntry != NULL);
- memset(pEntry, 0, bytes);
+ if (pEntry == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return NULL;
+ }
+
pEntry->bytes = bytes;
pEntry->dataLen = dataLen;
pEntry->rid = -1;
- return pEntry;
-}
-
-// step 4. SyncClientRequest => SSyncRaftEntry, add term, index
-SSyncRaftEntry* syncEntryBuild2(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
- SSyncRaftEntry* pEntry = syncEntryBuild3(pMsg, term, index);
- ASSERT(pEntry != NULL);
return pEntry;
}
-SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
+SSyncRaftEntry* syncEntryBuildFromClientRequest(const SyncClientRequest* pMsg, SyncTerm term, SyncIndex index) {
SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
- ASSERT(pEntry != NULL);
+ if (pEntry == NULL) return NULL;
pEntry->msgType = pMsg->msgType;
pEntry->originalRpcType = pMsg->originalRpcType;
@@ -45,43 +43,37 @@ SSyncRaftEntry* syncEntryBuild3(SyncClientRequest* pMsg, SyncTerm term, SyncInde
pEntry->isWeak = pMsg->isWeak;
pEntry->term = term;
pEntry->index = index;
- pEntry->dataLen = pMsg->dataLen;
memcpy(pEntry->data, pMsg->data, pMsg->dataLen);
return pEntry;
}
-SSyncRaftEntry* syncEntryBuild4(SRpcMsg* pOriginalMsg, SyncTerm term, SyncIndex index) {
- SSyncRaftEntry* pEntry = syncEntryBuild(pOriginalMsg->contLen);
- ASSERT(pEntry != NULL);
+SSyncRaftEntry* syncEntryBuildFromRpcMsg(const SRpcMsg* pMsg, SyncTerm term, SyncIndex index) {
+ SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->contLen);
+ if (pEntry == NULL) return NULL;
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
- pEntry->originalRpcType = pOriginalMsg->msgType;
+ pEntry->originalRpcType = pMsg->msgType;
pEntry->seqNum = 0;
pEntry->isWeak = 0;
pEntry->term = term;
pEntry->index = index;
- pEntry->dataLen = pOriginalMsg->contLen;
- memcpy(pEntry->data, pOriginalMsg->pCont, pOriginalMsg->contLen);
+ memcpy(pEntry->data, pMsg->pCont, pMsg->contLen);
+
+ return pEntry;
+}
+
+SSyncRaftEntry* syncEntryBuildFromAppendEntries(const SyncAppendEntries* pMsg) {
+ SSyncRaftEntry* pEntry = syncEntryBuild(pMsg->dataLen);
+ if (pEntry == NULL) return NULL;
+ memcpy(pEntry, pMsg->data, pMsg->dataLen);
return pEntry;
}
SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId) {
- // init rpcMsg
- SMsgHead head;
- head.vgId = vgId;
- head.contLen = sizeof(SMsgHead);
- head.msgMask = 0;
- SRpcMsg rpcMsg;
- memset(&rpcMsg, 0, sizeof(SRpcMsg));
- rpcMsg.contLen = head.contLen;
- rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
- rpcMsg.msgType = TDMT_SYNC_NOOP;
- memcpy(rpcMsg.pCont, &head, sizeof(head));
-
- SSyncRaftEntry* pEntry = syncEntryBuild(rpcMsg.contLen);
- ASSERT(pEntry != NULL);
+ SSyncRaftEntry* pEntry = syncEntryBuild(sizeof(SMsgHead));
+ if (pEntry == NULL) return NULL;
pEntry->msgType = TDMT_SYNC_CLIENT_REQUEST;
pEntry->originalRpcType = TDMT_SYNC_NOOP;
@@ -90,9 +82,9 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
pEntry->term = term;
pEntry->index = index;
- ASSERT(pEntry->dataLen == rpcMsg.contLen);
- memcpy(pEntry->data, rpcMsg.pCont, rpcMsg.contLen);
- rpcFreeCont(rpcMsg.pCont);
+ SMsgHead* pHead = (SMsgHead*)pEntry->data;
+ pHead->vgId = vgId;
+ pHead->contLen = sizeof(SMsgHead);
return pEntry;
}
@@ -100,108 +92,18 @@ SSyncRaftEntry* syncEntryBuildNoop(SyncTerm term, SyncIndex index, int32_t vgId)
void syncEntryDestory(SSyncRaftEntry* pEntry) {
if (pEntry != NULL) {
taosMemoryFree(pEntry);
- }
-}
-// step 5. SSyncRaftEntry => bin, to raft log
-char* syncEntrySerialize(const SSyncRaftEntry* pEntry, uint32_t* len) {
- char* buf = taosMemoryMalloc(pEntry->bytes);
- ASSERT(buf != NULL);
- memcpy(buf, pEntry, pEntry->bytes);
- if (len != NULL) {
- *len = pEntry->bytes;
+ sTrace("free entry: %p", pEntry);
}
- return buf;
-}
-
-// step 6. bin => SSyncRaftEntry, from raft log
-SSyncRaftEntry* syncEntryDeserialize(const char* buf, uint32_t len) {
- uint32_t bytes = *((uint32_t*)buf);
- SSyncRaftEntry* pEntry = taosMemoryMalloc(bytes);
- ASSERT(pEntry != NULL);
- memcpy(pEntry, buf, len);
- ASSERT(len == pEntry->bytes);
- return pEntry;
}
-cJSON* syncEntry2Json(const SSyncRaftEntry* pEntry) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pEntry != NULL) {
- cJSON_AddNumberToObject(pRoot, "bytes", pEntry->bytes);
- cJSON_AddNumberToObject(pRoot, "msgType", pEntry->msgType);
- cJSON_AddNumberToObject(pRoot, "originalRpcType", pEntry->originalRpcType);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pEntry->seqNum);
- cJSON_AddStringToObject(pRoot, "seqNum", u64buf);
- cJSON_AddNumberToObject(pRoot, "isWeak", pEntry->isWeak);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pEntry->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pEntry->index);
- cJSON_AddStringToObject(pRoot, "index", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pEntry->rid);
- cJSON_AddStringToObject(pRoot, "rid", u64buf);
- cJSON_AddNumberToObject(pRoot, "dataLen", pEntry->dataLen);
-
- char* s;
- s = syncUtilprintBin((char*)(pEntry->data), pEntry->dataLen);
- cJSON_AddStringToObject(pRoot, "data", s);
- taosMemoryFree(s);
-
- s = syncUtilprintBin2((char*)(pEntry->data), pEntry->dataLen);
- cJSON_AddStringToObject(pRoot, "data2", s);
- taosMemoryFree(s);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SSyncRaftEntry", pRoot);
- return pJson;
-}
-
-char* syncEntry2Str(const SSyncRaftEntry* pEntry) {
- cJSON* pJson = syncEntry2Json(pEntry);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// step 7. SSyncRaftEntry => original SRpcMsg, commit to user, delete seqNum, isWeak, term, index
void syncEntry2OriginalRpc(const SSyncRaftEntry* pEntry, SRpcMsg* pRpcMsg) {
- memset(pRpcMsg, 0, sizeof(*pRpcMsg));
pRpcMsg->msgType = pEntry->originalRpcType;
pRpcMsg->contLen = pEntry->dataLen;
pRpcMsg->pCont = rpcMallocCont(pRpcMsg->contLen);
memcpy(pRpcMsg->pCont, pEntry->data, pRpcMsg->contLen);
}
-// for debug ----------------------
-void syncEntryPrint(const SSyncRaftEntry* pObj) {
- char* serialized = syncEntry2Str(pObj);
- printf("syncEntryPrint | len:%zu | %s \n", strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncEntryPrint2(char* s, const SSyncRaftEntry* pObj) {
- char* serialized = syncEntry2Str(pObj);
- printf("syncEntryPrint2 | len:%zu | %s | %s \n", strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void syncEntryLog(const SSyncRaftEntry* pObj) {
- char* serialized = syncEntry2Str(pObj);
- sTrace("syncEntryLog | len:%zu | %s", strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void syncEntryLog2(char* s, const SSyncRaftEntry* pObj) {
- char* serialized = syncEntry2Str(pObj);
- sTrace("syncEntryLog2 | len:%zu | %s | %s", strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
-
-//-----------------------------------
SRaftEntryHashCache* raftCacheCreate(SSyncNode* pSyncNode, int32_t maxCount) {
SRaftEntryHashCache* pCache = taosMemoryMalloc(sizeof(SRaftEntryHashCache));
if (pCache == NULL) {
@@ -226,9 +128,9 @@ SRaftEntryHashCache* raftCacheCreate(SSyncNode* pSyncNode, int32_t maxCount) {
void raftCacheDestroy(SRaftEntryHashCache* pCache) {
if (pCache != NULL) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
taosHashCleanup(pCache->pEntryHash);
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
taosThreadMutexDestroy(&(pCache->mutex));
taosMemoryFree(pCache);
}
@@ -238,25 +140,20 @@ void raftCacheDestroy(SRaftEntryHashCache* pCache) {
// max count, return 0
// error, return -1
int32_t raftCachePutEntry(struct SRaftEntryHashCache* pCache, SSyncRaftEntry* pEntry) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
if (pCache->currentCount >= pCache->maxCount) {
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
taosHashPut(pCache->pEntryHash, &(pEntry->index), sizeof(pEntry->index), pEntry, pEntry->bytes);
++(pCache->currentCount);
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "raft cache add, type:%s,%d, type2:%s,%d, index:%" PRId64 ", bytes:%d",
- TMSG_INFO(pEntry->msgType), pEntry->msgType, TMSG_INFO(pEntry->originalRpcType), pEntry->originalRpcType,
- pEntry->index, pEntry->bytes);
- syncNodeEventLog(pCache->pSyncNode, eventLog);
- } while (0);
-
- taosThreadMutexUnlock(&(pCache->mutex));
+ sNTrace(pCache->pSyncNode, "raft cache add, type:%s,%d, type2:%s,%d, index:%" PRId64 ", bytes:%d",
+ TMSG_INFO(pEntry->msgType), pEntry->msgType, TMSG_INFO(pEntry->originalRpcType), pEntry->originalRpcType,
+ pEntry->index, pEntry->bytes);
+ taosThreadMutexUnlock(&pCache->mutex);
return 1;
}
@@ -269,26 +166,21 @@ int32_t raftCacheGetEntry(struct SRaftEntryHashCache* pCache, SyncIndex index, S
}
*ppEntry = NULL;
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
void* pTmp = taosHashGet(pCache->pEntryHash, &index, sizeof(index));
if (pTmp != NULL) {
SSyncRaftEntry* pEntry = pTmp;
*ppEntry = taosMemoryMalloc(pEntry->bytes);
memcpy(*ppEntry, pTmp, pEntry->bytes);
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "raft cache get, type:%s,%d, type2:%s,%d, index:%" PRId64,
- TMSG_INFO((*ppEntry)->msgType), (*ppEntry)->msgType, TMSG_INFO((*ppEntry)->originalRpcType),
- (*ppEntry)->originalRpcType, (*ppEntry)->index);
- syncNodeEventLog(pCache->pSyncNode, eventLog);
- } while (0);
-
- taosThreadMutexUnlock(&(pCache->mutex));
+ sNTrace(pCache->pSyncNode, "raft cache get, type:%s,%d, type2:%s,%d, index:%" PRId64,
+ TMSG_INFO((*ppEntry)->msgType), (*ppEntry)->msgType, TMSG_INFO((*ppEntry)->originalRpcType),
+ (*ppEntry)->originalRpcType, (*ppEntry)->index);
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
return -1;
}
@@ -302,34 +194,29 @@ int32_t raftCacheGetEntryP(struct SRaftEntryHashCache* pCache, SyncIndex index,
}
*ppEntry = NULL;
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
void* pTmp = taosHashGet(pCache->pEntryHash, &index, sizeof(index));
if (pTmp != NULL) {
SSyncRaftEntry* pEntry = pTmp;
*ppEntry = pEntry;
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "raft cache get, type:%s,%d, type2:%s,%d, index:%" PRId64,
- TMSG_INFO((*ppEntry)->msgType), (*ppEntry)->msgType, TMSG_INFO((*ppEntry)->originalRpcType),
- (*ppEntry)->originalRpcType, (*ppEntry)->index);
- syncNodeEventLog(pCache->pSyncNode, eventLog);
- } while (0);
-
- taosThreadMutexUnlock(&(pCache->mutex));
+ sNTrace(pCache->pSyncNode, "raft cache get, type:%s,%d, type2:%s,%d, index:%" PRId64,
+ TMSG_INFO((*ppEntry)->msgType), (*ppEntry)->msgType, TMSG_INFO((*ppEntry)->originalRpcType),
+ (*ppEntry)->originalRpcType, (*ppEntry)->index);
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
return -1;
}
int32_t raftCacheDelEntry(struct SRaftEntryHashCache* pCache, SyncIndex index) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
taosHashRemove(pCache->pEntryHash, &index, sizeof(index));
--(pCache->currentCount);
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
@@ -339,113 +226,37 @@ int32_t raftCacheGetAndDel(struct SRaftEntryHashCache* pCache, SyncIndex index,
}
*ppEntry = NULL;
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
void* pTmp = taosHashGet(pCache->pEntryHash, &index, sizeof(index));
if (pTmp != NULL) {
SSyncRaftEntry* pEntry = pTmp;
*ppEntry = taosMemoryMalloc(pEntry->bytes);
memcpy(*ppEntry, pTmp, pEntry->bytes);
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "raft cache get-and-del, type:%s,%d, type2:%s,%d, index:%" PRId64,
- TMSG_INFO((*ppEntry)->msgType), (*ppEntry)->msgType, TMSG_INFO((*ppEntry)->originalRpcType),
- (*ppEntry)->originalRpcType, (*ppEntry)->index);
- syncNodeEventLog(pCache->pSyncNode, eventLog);
- } while (0);
+ sNTrace(pCache->pSyncNode, "raft cache get-and-del, type:%s,%d, type2:%s,%d, index:%" PRId64,
+ TMSG_INFO((*ppEntry)->msgType), (*ppEntry)->msgType, TMSG_INFO((*ppEntry)->originalRpcType),
+ (*ppEntry)->originalRpcType, (*ppEntry)->index);
taosHashRemove(pCache->pEntryHash, &index, sizeof(index));
--(pCache->currentCount);
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
terrno = TSDB_CODE_WAL_LOG_NOT_EXIST;
return -1;
}
int32_t raftCacheClear(struct SRaftEntryHashCache* pCache) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
taosHashClear(pCache->pEntryHash);
pCache->currentCount = 0;
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
-//-----------------------------------
-cJSON* raftCache2Json(SRaftEntryHashCache* pCache) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pCache != NULL) {
- taosThreadMutexLock(&(pCache->mutex));
-
- snprintf(u64buf, sizeof(u64buf), "%p", pCache->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- cJSON_AddNumberToObject(pRoot, "currentCount", pCache->currentCount);
- cJSON_AddNumberToObject(pRoot, "maxCount", pCache->maxCount);
- cJSON* pEntries = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "entries", pEntries);
-
- SSyncRaftEntry* pIter = (SSyncRaftEntry*)taosHashIterate(pCache->pEntryHash, NULL);
- if (pIter != NULL) {
- SSyncRaftEntry* pEntry = (SSyncRaftEntry*)pIter;
- cJSON_AddItemToArray(pEntries, syncEntry2Json(pEntry));
- }
- while (pIter) {
- pIter = taosHashIterate(pCache->pEntryHash, pIter);
- if (pIter != NULL) {
- SSyncRaftEntry* pEntry = (SSyncRaftEntry*)pIter;
- cJSON_AddItemToArray(pEntries, syncEntry2Json(pEntry));
- }
- }
-
- taosThreadMutexUnlock(&(pCache->mutex));
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SRaftEntryHashCache", pRoot);
- return pJson;
-}
-
-char* raftCache2Str(SRaftEntryHashCache* pCache) {
- cJSON* pJson = raftCache2Json(pCache);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-void raftCachePrint(SRaftEntryHashCache* pCache) {
- char* serialized = raftCache2Str(pCache);
- printf("raftCachePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftCachePrint2(char* s, SRaftEntryHashCache* pCache) {
- char* serialized = raftCache2Str(pCache);
- printf("raftCachePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftCacheLog(SRaftEntryHashCache* pCache) {
- char* serialized = raftCache2Str(pCache);
- sTrace("raftCacheLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void raftCacheLog2(char* s, SRaftEntryHashCache* pCache) {
- if (gRaftDetailLog) {
- char* serialized = raftCache2Str(pCache);
- sTraceLong("raftCacheLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-//-----------------------------------
static char* keyFn(const void* pData) {
SSyncRaftEntry* pEntry = (SSyncRaftEntry*)pData;
return (char*)(&(pEntry->index));
@@ -483,13 +294,13 @@ SRaftEntryCache* raftEntryCacheCreate(SSyncNode* pSyncNode, int32_t maxCount) {
void raftEntryCacheDestroy(SRaftEntryCache* pCache) {
if (pCache != NULL) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
tSkipListDestroy(pCache->pSkipList);
if (pCache->refMgr != -1) {
taosCloseRef(pCache->refMgr);
pCache->refMgr = -1;
}
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
taosThreadMutexDestroy(&(pCache->mutex));
taosMemoryFree(pCache);
}
@@ -499,10 +310,10 @@ void raftEntryCacheDestroy(SRaftEntryCache* pCache) {
// max count, return 0
// error, return -1
int32_t raftEntryCachePutEntry(struct SRaftEntryCache* pCache, SSyncRaftEntry* pEntry) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
if (pCache->currentCount >= pCache->maxCount) {
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return 0;
}
@@ -513,15 +324,10 @@ int32_t raftEntryCachePutEntry(struct SRaftEntryCache* pCache, SSyncRaftEntry* p
pEntry->rid = taosAddRef(pCache->refMgr, pEntry);
ASSERT(pEntry->rid >= 0);
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "raft cache add, type:%s,%d, type2:%s,%d, index:%" PRId64 ", bytes:%d",
- TMSG_INFO(pEntry->msgType), pEntry->msgType, TMSG_INFO(pEntry->originalRpcType), pEntry->originalRpcType,
- pEntry->index, pEntry->bytes);
- syncNodeEventLog(pCache->pSyncNode, eventLog);
- } while (0);
-
- taosThreadMutexUnlock(&(pCache->mutex));
+ sNTrace(pCache->pSyncNode, "raft cache add, type:%s,%d, type2:%s,%d, index:%" PRId64 ", bytes:%d",
+ TMSG_INFO(pEntry->msgType), pEntry->msgType, TMSG_INFO(pEntry->originalRpcType), pEntry->originalRpcType,
+ pEntry->index, pEntry->bytes);
+ taosThreadMutexUnlock(&pCache->mutex);
return 1;
}
@@ -546,7 +352,7 @@ int32_t raftEntryCacheGetEntry(struct SRaftEntryCache* pCache, SyncIndex index,
// not found, return 0
// error, return -1
int32_t raftEntryCacheGetEntryP(struct SRaftEntryCache* pCache, SyncIndex index, SSyncRaftEntry** ppEntry) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
SyncIndex index2 = index;
int32_t code = 0;
@@ -570,7 +376,7 @@ int32_t raftEntryCacheGetEntryP(struct SRaftEntryCache* pCache, SyncIndex index,
}
taosArrayDestroy(entryPArray);
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return code;
}
@@ -579,7 +385,7 @@ int32_t raftEntryCacheGetEntryP(struct SRaftEntryCache* pCache, SyncIndex index,
// return -1, error
// return delete count
int32_t raftEntryCacheClear(struct SRaftEntryCache* pCache, int32_t count) {
- taosThreadMutexLock(&(pCache->mutex));
+ taosThreadMutexLock(&pCache->mutex);
int32_t returnCnt = 0;
if (count == -1) {
@@ -634,72 +440,6 @@ int32_t raftEntryCacheClear(struct SRaftEntryCache* pCache, int32_t count) {
}
pCache->currentCount -= returnCnt;
- taosThreadMutexUnlock(&(pCache->mutex));
+ taosThreadMutexUnlock(&pCache->mutex);
return returnCnt;
}
-
-cJSON* raftEntryCache2Json(SRaftEntryCache* pCache) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pCache != NULL) {
- taosThreadMutexLock(&(pCache->mutex));
-
- snprintf(u64buf, sizeof(u64buf), "%p", pCache->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- cJSON_AddNumberToObject(pRoot, "currentCount", pCache->currentCount);
- cJSON_AddNumberToObject(pRoot, "maxCount", pCache->maxCount);
- cJSON* pEntries = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "entries", pEntries);
-
- SSkipListIterator* pIter = tSkipListCreateIter(pCache->pSkipList);
- while (tSkipListIterNext(pIter)) {
- SSkipListNode* pNode = tSkipListIterGet(pIter);
- ASSERT(pNode != NULL);
- SSyncRaftEntry* pEntry = (SSyncRaftEntry*)SL_GET_NODE_DATA(pNode);
- cJSON_AddItemToArray(pEntries, syncEntry2Json(pEntry));
- }
- tSkipListDestroyIter(pIter);
-
- taosThreadMutexUnlock(&(pCache->mutex));
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SRaftEntryCache", pRoot);
- return pJson;
-}
-
-char* raftEntryCache2Str(SRaftEntryCache* pObj) {
- cJSON* pJson = raftEntryCache2Json(pObj);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-void raftEntryCachePrint(SRaftEntryCache* pObj) {
- char* serialized = raftEntryCache2Str(pObj);
- printf("raftEntryCachePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftEntryCachePrint2(char* s, SRaftEntryCache* pObj) {
- char* serialized = raftEntryCache2Str(pObj);
- printf("raftEntryCachePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftEntryCacheLog(SRaftEntryCache* pObj) {
- char* serialized = raftEntryCache2Str(pObj);
- sTrace("raftEntryCacheLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void raftEntryCacheLog2(char* s, SRaftEntryCache* pObj) {
- if (gRaftDetailLog) {
- char* serialized = raftEntryCache2Str(pObj);
- sTraceLong("raftEntryCacheLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
diff --git a/source/libs/sync/src/syncRaftLog.c b/source/libs/sync/src/syncRaftLog.c
index 04228d4759b6465791584f4a7d790d114622c2a0..2f824b6b3bc9f525a95fca8a48e1e350a0c52fb5 100644
--- a/source/libs/sync/src/syncRaftLog.c
+++ b/source/libs/sync/src/syncRaftLog.c
@@ -13,40 +13,35 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRaftLog.h"
#include "syncRaftCfg.h"
#include "syncRaftStore.h"
+#include "syncUtil.h"
-//-------------------------------
// log[m .. n]
// public function
static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncIndex snapshotIndex);
-static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore);
-static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore);
-static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore);
-static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore);
-static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore);
-static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore);
-static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore);
static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntry* pEntry);
-static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry);
static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIndex);
static bool raftLogExist(struct SSyncLogStore* pLogStore, SyncIndex index);
static int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index);
static SyncIndex raftlogCommitIndex(SSyncLogStore* pLogStore);
+static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry);
-static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** ppLastEntry);
-
-//-------------------------------
SSyncLogStore* logStoreCreate(SSyncNode* pSyncNode) {
- SSyncLogStore* pLogStore = taosMemoryMalloc(sizeof(SSyncLogStore));
- ASSERT(pLogStore != NULL);
+ SSyncLogStore* pLogStore = taosMemoryCalloc(1, sizeof(SSyncLogStore));
+ if (pLogStore == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return NULL;
+ }
- pLogStore->pCache = taosLRUCacheInit(10 * 1024 * 1024, 1, .5);
+ // pLogStore->pCache = taosLRUCacheInit(10 * 1024 * 1024, 1, .5);
+ pLogStore->pCache = taosLRUCacheInit(30 * 1024 * 1024, 1, .5);
if (pLogStore->pCache == NULL) {
- terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
taosMemoryFree(pLogStore);
+ terrno = TSDB_CODE_WAL_OUT_OF_MEMORY;
return NULL;
}
@@ -103,7 +98,6 @@ void logStoreDestory(SSyncLogStore* pLogStore) {
}
}
-//-------------------------------
// log[m .. n]
static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncIndex snapshotIndex) {
ASSERT(snapshotIndex >= 0);
@@ -117,41 +111,38 @@ static int32_t raftLogRestoreFromSnapshot(struct SSyncLogStore* pLogStore, SyncI
int32_t sysErr = errno;
const char* sysErrStr = strerror(errno);
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "wal restore from snapshot error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s",
- snapshotIndex, err, err, errStr, sysErr, sysErrStr);
- syncNodeErrorLog(pData->pSyncNode, logBuf);
-
+ sNError(pData->pSyncNode,
+ "wal restore from snapshot error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s",
+ snapshotIndex, err, err, errStr, sysErr, sysErrStr);
return -1;
}
return 0;
}
-static SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
+SyncIndex raftLogBeginIndex(struct SSyncLogStore* pLogStore) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
SyncIndex firstVer = walGetFirstVer(pWal);
return firstVer;
}
-static SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore) { return raftLogLastIndex(pLogStore); }
+SyncIndex raftLogEndIndex(struct SSyncLogStore* pLogStore) { return raftLogLastIndex(pLogStore); }
-static bool raftLogIsEmpty(struct SSyncLogStore* pLogStore) {
+bool raftLogIsEmpty(struct SSyncLogStore* pLogStore) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
return walIsEmpty(pWal);
}
-static int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
+int32_t raftLogEntryCount(struct SSyncLogStore* pLogStore) {
SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
SyncIndex endIndex = raftLogEndIndex(pLogStore);
int32_t count = endIndex - beginIndex + 1;
return count > 0 ? count : 0;
}
-static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
+SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
SyncIndex lastIndex;
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
@@ -160,7 +151,7 @@ static SyncIndex raftLogLastIndex(struct SSyncLogStore* pLogStore) {
return lastVer;
}
-static SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore) {
+SyncIndex raftLogWriteIndex(struct SSyncLogStore* pLogStore) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
SyncIndex lastVer = walGetLastVer(pWal);
@@ -177,7 +168,7 @@ static bool raftLogExist(struct SSyncLogStore* pLogStore, SyncIndex index) {
// if success, return last term
// if not log, return 0
// if error, return SYNC_TERM_INVALID
-static SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) {
+SyncTerm raftLogLastTerm(struct SSyncLogStore* pLogStore) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
if (walIsEmpty(pWal)) {
@@ -207,37 +198,33 @@ static int32_t raftLogAppendEntry(struct SSyncLogStore* pLogStore, SSyncRaftEntr
syncMeta.isWeek = pEntry->isWeak;
syncMeta.seqNum = pEntry->seqNum;
syncMeta.term = pEntry->term;
+
+ int64_t tsWriteBegin = taosGetTimestampNs();
index = walAppendLog(pWal, pEntry->originalRpcType, syncMeta, pEntry->data, pEntry->dataLen);
+ int64_t tsWriteEnd = taosGetTimestampNs();
+ int64_t tsElapsed = tsWriteEnd - tsWriteBegin;
+
if (index < 0) {
int32_t err = terrno;
const char* errStr = tstrerror(err);
int32_t sysErr = errno;
const char* sysErrStr = strerror(errno);
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "wal write error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s",
- pEntry->index, err, err, errStr, sysErr, sysErrStr);
- syncNodeErrorLog(pData->pSyncNode, logBuf);
-
- // ASSERT(0);
+ sNError(pData->pSyncNode, "wal write error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s",
+ pEntry->index, err, err, errStr, sysErr, sysErrStr);
return -1;
}
pEntry->index = index;
- do {
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "write index:%" PRId64 ", type:%s, origin type:%s", pEntry->index,
- TMSG_INFO(pEntry->msgType), TMSG_INFO(pEntry->originalRpcType));
- syncNodeEventLog(pData->pSyncNode, eventLog);
- } while (0);
-
+ sNTrace(pData->pSyncNode, "write index:%" PRId64 ", type:%s, origin type:%s, elapsed:%" PRId64, pEntry->index,
+ TMSG_INFO(pEntry->msgType), TMSG_INFO(pEntry->originalRpcType), tsElapsed);
return 0;
}
// entry found, return 0
// entry not found, return -1, terrno = TSDB_CODE_WAL_LOG_NOT_EXIST
// other error, return -1
-static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
+int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index, SSyncRaftEntry** ppEntry) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
int32_t code = 0;
@@ -248,12 +235,18 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index,
SWalReader* pWalHandle = pData->pWalHandle;
if (pWalHandle == NULL) {
terrno = TSDB_CODE_SYN_INTERNAL_ERROR;
+ sError("vgId:%d, wal handle is NULL", pData->pSyncNode->vgId);
+
return -1;
}
+ int64_t ts1 = taosGetTimestampNs();
taosThreadMutexLock(&(pData->mutex));
+ int64_t ts2 = taosGetTimestampNs();
code = walReadVer(pWalHandle, index);
+ int64_t ts3 = taosGetTimestampNs();
+
// code = walReadVerCached(pWalHandle, index);
if (code != 0) {
int32_t err = terrno;
@@ -261,20 +254,13 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index,
int32_t sysErr = errno;
const char* sysErrStr = strerror(errno);
- do {
- char logBuf[128];
- if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
- snprintf(logBuf, sizeof(logBuf),
- "wal read not exist, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", index, err, err,
- errStr, sysErr, sysErrStr);
- syncNodeEventLog(pData->pSyncNode, logBuf);
-
- } else {
- snprintf(logBuf, sizeof(logBuf), "wal read error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s",
- index, err, err, errStr, sysErr, sysErrStr);
- syncNodeErrorLog(pData->pSyncNode, logBuf);
- }
- } while (0);
+ if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
+ sNTrace(pData->pSyncNode, "wal read not exist, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", index,
+ err, err, errStr, sysErr, sysErrStr);
+ } else {
+ sNTrace(pData->pSyncNode, "wal read error, index:%" PRId64 ", err:%d %X, msg:%s, syserr:%d, sysmsg:%s", index,
+ err, err, errStr, sysErr, sysErrStr);
+ }
/*
int32_t saveErr = terrno;
@@ -304,6 +290,18 @@ static int32_t raftLogGetEntry(struct SSyncLogStore* pLogStore, SyncIndex index,
*/
taosThreadMutexUnlock(&(pData->mutex));
+ int64_t ts4 = taosGetTimestampNs();
+
+ int64_t tsElapsed = ts4 - ts1;
+ int64_t tsElapsedLock = ts2 - ts1;
+ int64_t tsElapsedRead = ts3 - ts2;
+ int64_t tsElapsedBuild = ts4 - ts3;
+
+ sNTrace(pData->pSyncNode,
+ "read index:%" PRId64 ", elapsed:%" PRId64 ", elapsed-lock:%" PRId64 ", elapsed-read:%" PRId64
+ ", elapsed-build:%" PRId64,
+ index, tsElapsed, tsElapsedLock, tsElapsedRead, tsElapsedBuild);
+
return code;
}
@@ -318,6 +316,23 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn
return 0;
}
+ // need not truncate
+ SyncIndex walCommitVer = walGetCommittedVer(pWal);
+ if (fromIndex <= walCommitVer) {
+ return 0;
+ }
+
+ // delete from cache
+ for (SyncIndex index = fromIndex; index <= wallastVer; ++index) {
+ SLRUCache* pCache = pData->pSyncNode->pLogStore->pCache;
+ LRUHandle* h = taosLRUCacheLookup(pCache, &index, sizeof(index));
+ if (h) {
+ sNTrace(pData->pSyncNode, "cache delete index:%" PRId64, index);
+
+ taosLRUCacheRelease(pData->pSyncNode->pLogStore->pCache, h, true);
+ }
+ }
+
int32_t code = walRollback(pWal, fromIndex);
if (code != 0) {
int32_t err = terrno;
@@ -331,12 +346,7 @@ static int32_t raftLogTruncate(struct SSyncLogStore* pLogStore, SyncIndex fromIn
}
// event log
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "log truncate, from-index:%" PRId64, fromIndex);
- syncNodeEventLog(pData->pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pData->pSyncNode, "log truncate, from-index:%" PRId64, fromIndex);
return code;
}
@@ -365,7 +375,17 @@ static int32_t raftLogGetLastEntry(SSyncLogStore* pLogStore, SSyncRaftEntry** pp
int32_t raftLogUpdateCommitIndex(SSyncLogStore* pLogStore, SyncIndex index) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
- // ASSERT(walCommit(pWal, index) == 0);
+
+ // need not update
+ SyncIndex snapshotVer = walGetSnapshotVer(pWal);
+ SyncIndex walCommitVer = walGetCommittedVer(pWal);
+ SyncIndex wallastVer = walGetLastVer(pWal);
+
+ if (index < snapshotVer || index > wallastVer) {
+ // ignore
+ return 0;
+ }
+
int32_t code = walCommit(pWal, index);
if (code != 0) {
int32_t err = terrno;
@@ -386,111 +406,6 @@ SyncIndex raftlogCommitIndex(SSyncLogStore* pLogStore) {
return pData->pSyncNode->commitIndex;
}
-cJSON* logStore2Json(SSyncLogStore* pLogStore) {
- char u64buf[128] = {0};
- SSyncLogStoreData* pData = (SSyncLogStoreData*)pLogStore->data;
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pData != NULL && pData->pWal != NULL) {
- snprintf(u64buf, sizeof(u64buf), "%p", pData->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pData->pWal);
- cJSON_AddStringToObject(pRoot, "pWal", u64buf);
-
- SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, beginIndex);
- cJSON_AddStringToObject(pRoot, "beginIndex", u64buf);
-
- SyncIndex endIndex = raftLogEndIndex(pLogStore);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, endIndex);
- cJSON_AddStringToObject(pRoot, "endIndex", u64buf);
-
- int32_t count = raftLogEntryCount(pLogStore);
- cJSON_AddNumberToObject(pRoot, "entryCount", count);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, raftLogWriteIndex(pLogStore));
- cJSON_AddStringToObject(pRoot, "WriteIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%d", raftLogIsEmpty(pLogStore));
- cJSON_AddStringToObject(pRoot, "IsEmpty", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, raftLogLastIndex(pLogStore));
- cJSON_AddStringToObject(pRoot, "LastIndex", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, raftLogLastTerm(pLogStore));
- cJSON_AddStringToObject(pRoot, "LastTerm", u64buf);
-
- cJSON* pEntries = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "pEntries", pEntries);
-
- if (!raftLogIsEmpty(pLogStore)) {
- for (SyncIndex i = beginIndex; i <= endIndex; ++i) {
- SSyncRaftEntry* pEntry = NULL;
- raftLogGetEntry(pLogStore, i, &pEntry);
-
- cJSON_AddItemToArray(pEntries, syncEntry2Json(pEntry));
- syncEntryDestory(pEntry);
- }
- }
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SSyncLogStore", pRoot);
- return pJson;
-}
-
-char* logStore2Str(SSyncLogStore* pLogStore) {
- cJSON* pJson = logStore2Json(pLogStore);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-cJSON* logStoreSimple2Json(SSyncLogStore* pLogStore) {
- char u64buf[128] = {0};
- SSyncLogStoreData* pData = (SSyncLogStoreData*)pLogStore->data;
- cJSON* pRoot = cJSON_CreateObject();
-
- if (pData != NULL && pData->pWal != NULL) {
- snprintf(u64buf, sizeof(u64buf), "%p", pData->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pData->pWal);
- cJSON_AddStringToObject(pRoot, "pWal", u64buf);
-
- SyncIndex beginIndex = raftLogBeginIndex(pLogStore);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, beginIndex);
- cJSON_AddStringToObject(pRoot, "beginIndex", u64buf);
-
- SyncIndex endIndex = raftLogEndIndex(pLogStore);
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, endIndex);
- cJSON_AddStringToObject(pRoot, "endIndex", u64buf);
-
- int32_t count = raftLogEntryCount(pLogStore);
- cJSON_AddNumberToObject(pRoot, "entryCount", count);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, raftLogWriteIndex(pLogStore));
- cJSON_AddStringToObject(pRoot, "WriteIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%d", raftLogIsEmpty(pLogStore));
- cJSON_AddStringToObject(pRoot, "IsEmpty", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, raftLogLastIndex(pLogStore));
- cJSON_AddStringToObject(pRoot, "LastIndex", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, raftLogLastTerm(pLogStore));
- cJSON_AddStringToObject(pRoot, "LastTerm", u64buf);
- }
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SSyncLogStoreSimple", pRoot);
- return pJson;
-}
-
-char* logStoreSimple2Str(SSyncLogStore* pLogStore) {
- cJSON* pJson = logStoreSimple2Json(pLogStore);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
SyncIndex logStoreFirstIndex(SSyncLogStore* pLogStore) {
SSyncLogStoreData* pData = pLogStore->data;
SWal* pWal = pData->pWal;
@@ -502,63 +417,3 @@ SyncIndex logStoreWalCommitVer(SSyncLogStore* pLogStore) {
SWal* pWal = pData->pWal;
return walGetCommittedVer(pWal);
}
-
-// for debug -----------------
-void logStorePrint(SSyncLogStore* pLogStore) {
- char* serialized = logStore2Str(pLogStore);
- printf("logStorePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void logStorePrint2(char* s, SSyncLogStore* pLogStore) {
- char* serialized = logStore2Str(pLogStore);
- printf("logStorePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void logStoreLog(SSyncLogStore* pLogStore) {
- if (gRaftDetailLog) {
- char* serialized = logStore2Str(pLogStore);
- sTraceLong("logStoreLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
- }
-}
-
-void logStoreLog2(char* s, SSyncLogStore* pLogStore) {
- if (gRaftDetailLog) {
- char* serialized = logStore2Str(pLogStore);
- sTraceLong("logStoreLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
-
-// for debug -----------------
-void logStoreSimplePrint(SSyncLogStore* pLogStore) {
- char* serialized = logStoreSimple2Str(pLogStore);
- printf("logStoreSimplePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void logStoreSimplePrint2(char* s, SSyncLogStore* pLogStore) {
- char* serialized = logStoreSimple2Str(pLogStore);
- printf("logStoreSimplePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void logStoreSimpleLog(SSyncLogStore* pLogStore) {
- char* serialized = logStoreSimple2Str(pLogStore);
- sTrace("logStoreSimpleLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void logStoreSimpleLog2(char* s, SSyncLogStore* pLogStore) {
- if (gRaftDetailLog) {
- char* serialized = logStoreSimple2Str(pLogStore);
- sTrace("logStoreSimpleLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
- }
-}
diff --git a/source/libs/sync/src/syncRaftStore.c b/source/libs/sync/src/syncRaftStore.c
index dcc4e1f1330a9b8163b338f5d3f0bc0b879fdbf7..e328ed3d31ab3f51297c93bdea781417e9e33999 100644
--- a/source/libs/sync/src/syncRaftStore.c
+++ b/source/libs/sync/src/syncRaftStore.c
@@ -13,9 +13,8 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRaftStore.h"
-#include "cJSON.h"
-#include "syncEnv.h"
#include "syncUtil.h"
// private function
@@ -26,22 +25,19 @@ static bool raftStoreFileExist(char *path);
SRaftStore *raftStoreOpen(const char *path) {
int32_t ret;
- SRaftStore *pRaftStore = taosMemoryMalloc(sizeof(SRaftStore));
+ SRaftStore *pRaftStore = taosMemoryCalloc(1, sizeof(SRaftStore));
if (pRaftStore == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
- memset(pRaftStore, 0, sizeof(*pRaftStore));
- snprintf(pRaftStore->path, sizeof(pRaftStore->path), "%s", path);
-
- char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
- memset(storeBuf, 0, sizeof(storeBuf));
+ snprintf(pRaftStore->path, sizeof(pRaftStore->path), "%s", path);
if (!raftStoreFileExist(pRaftStore->path)) {
ret = raftStoreInit(pRaftStore);
ASSERT(ret == 0);
}
+ char storeBuf[RAFT_STORE_BLOCK_SIZE] = {0};
pRaftStore->pFile = taosOpenFile(path, TD_FILE_READ | TD_FILE_WRITE);
ASSERT(pRaftStore->pFile != NULL);
@@ -72,9 +68,7 @@ static int32_t raftStoreInit(SRaftStore *pRaftStore) {
}
int32_t raftStoreClose(SRaftStore *pRaftStore) {
- if (pRaftStore == NULL) {
- return 0;
- }
+ if (pRaftStore == NULL) return 0;
taosCloseFile(&pRaftStore->pFile);
taosMemoryFree(pRaftStore);
@@ -182,69 +176,3 @@ void raftStoreSetTerm(SRaftStore *pRaftStore, SyncTerm term) {
pRaftStore->currentTerm = term;
raftStorePersist(pRaftStore);
}
-
-int32_t raftStoreFromJson(SRaftStore *pRaftStore, cJSON *pJson) { return 0; }
-
-cJSON *raftStore2Json(SRaftStore *pRaftStore) {
- char u64buf[128] = {0};
- cJSON *pRoot = cJSON_CreateObject();
-
- if (pRaftStore != NULL) {
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64 "", pRaftStore->currentTerm);
- cJSON_AddStringToObject(pRoot, "currentTerm", u64buf);
-
- cJSON *pVoteFor = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64 "", pRaftStore->voteFor.addr);
- cJSON_AddStringToObject(pVoteFor, "addr", u64buf);
- {
- uint64_t u64 = pRaftStore->voteFor.addr;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pVoteFor, "addr_host", host);
- cJSON_AddNumberToObject(pVoteFor, "addr_port", port);
- }
- cJSON_AddNumberToObject(pVoteFor, "vgId", pRaftStore->voteFor.vgId);
- cJSON_AddItemToObject(pRoot, "voteFor", pVoteFor);
-
- int hasVoted = raftStoreHasVoted(pRaftStore);
- cJSON_AddNumberToObject(pRoot, "hasVoted", hasVoted);
- }
-
- cJSON *pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SRaftStore", pRoot);
- return pJson;
-}
-
-char *raftStore2Str(SRaftStore *pRaftStore) {
- cJSON *pJson = raftStore2Json(pRaftStore);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug -------------------
-void raftStorePrint(SRaftStore *pObj) {
- char *serialized = raftStore2Str(pObj);
- printf("raftStorePrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void raftStorePrint2(char *s, SRaftStore *pObj) {
- char *serialized = raftStore2Str(pObj);
- printf("raftStorePrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-void raftStoreLog(SRaftStore *pObj) {
- char *serialized = raftStore2Str(pObj);
- sTrace("raftStoreLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void raftStoreLog2(char *s, SRaftStore *pObj) {
- char *serialized = raftStore2Str(pObj);
- sTrace("raftStoreLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
diff --git a/source/libs/sync/src/syncReplication.c b/source/libs/sync/src/syncReplication.c
index 4aa8b0bc34adca78cd1aa76fd0b33fde763b8505..802595c55af72956434866ef9686b6f3c84d2a12 100644
--- a/source/libs/sync/src/syncReplication.c
+++ b/source/libs/sync/src/syncReplication.c
@@ -13,16 +13,16 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncReplication.h"
#include "syncIndexMgr.h"
-#include "syncMessage.h"
-#include "syncRaftCfg.h"
#include "syncRaftEntry.h"
-#include "syncRaftLog.h"
#include "syncRaftStore.h"
-#include "syncSnapshot.h"
#include "syncUtil.h"
+static int32_t syncNodeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg);
+static int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg);
+
// TLA+ Spec
// AppendEntries(i, j) ==
// /\ i /= j
@@ -48,23 +48,20 @@
// mdest |-> j])
// /\ UNCHANGED <>
-int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId) {
+int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId, bool snapshot) {
// next index
SyncIndex nextIndex = syncIndexMgrGetIndex(pSyncNode->pNextIndex, pDestId);
- // maybe start snapshot
- SyncIndex logStartIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
- SyncIndex logEndIndex = pSyncNode->pLogStore->syncLogEndIndex(pSyncNode->pLogStore);
- if (nextIndex < logStartIndex || nextIndex - 1 > logEndIndex) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "maybe start snapshot for next-index:%" PRId64 ", start:%" PRId64 ", end:%" PRId64,
- nextIndex, logStartIndex, logEndIndex);
- syncNodeEventLog(pSyncNode, logBuf);
-
- // start snapshot
- // int32_t code = syncNodeStartSnapshot(pSyncNode, pDestId);
-
- return 0;
+ if (snapshot) {
+ // maybe start snapshot
+ SyncIndex logStartIndex = pSyncNode->pLogStore->syncLogBeginIndex(pSyncNode->pLogStore);
+ SyncIndex logEndIndex = pSyncNode->pLogStore->syncLogEndIndex(pSyncNode->pLogStore);
+ if (nextIndex < logStartIndex || nextIndex - 1 > logEndIndex) {
+ sNTrace(pSyncNode, "maybe start snapshot for next-index:%" PRId64 ", start:%" PRId64 ", end:%" PRId64, nextIndex,
+ logStartIndex, logEndIndex);
+ // start snapshot
+ int32_t code = syncNodeStartSnapshot(pSyncNode, pDestId);
+ }
}
// pre index, pre term
@@ -72,48 +69,55 @@ int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId) {
SyncTerm preLogTerm = syncNodeGetPreTerm(pSyncNode, nextIndex);
// prepare entry
+ SRpcMsg rpcMsg = {0};
SyncAppendEntries* pMsg = NULL;
- SSyncRaftEntry* pEntry;
- int32_t code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
+ SSyncRaftEntry* pEntry = NULL;
+ SLRUCache* pCache = pSyncNode->pLogStore->pCache;
+ LRUHandle* h = taosLRUCacheLookup(pCache, &nextIndex, sizeof(nextIndex));
+ int32_t code = 0;
+ if (h) {
+ pEntry = (SSyncRaftEntry*)taosLRUCacheValue(pCache, h);
+ code = 0;
- if (code == 0) {
- ASSERT(pEntry != NULL);
+ sNTrace(pSyncNode, "hit cache index:%" PRId64 ", bytes:%u, %p", nextIndex, pEntry->bytes, pEntry);
- pMsg = syncAppendEntriesBuild(pEntry->bytes, pSyncNode->vgId);
- ASSERT(pMsg != NULL);
+ } else {
+ sNTrace(pSyncNode, "miss cache index:%" PRId64, nextIndex);
- // add pEntry into msg
- uint32_t len;
- char* serialized = syncEntrySerialize(pEntry, &len);
- ASSERT(len == pEntry->bytes);
- memcpy(pMsg->data, serialized, len);
+ code = pSyncNode->pLogStore->syncLogGetEntry(pSyncNode->pLogStore, nextIndex, &pEntry);
+ }
- taosMemoryFree(serialized);
- syncEntryDestory(pEntry);
+ if (code == 0) {
+ ASSERT(pEntry != NULL);
+ code = syncBuildAppendEntries(&rpcMsg, pEntry->bytes, pSyncNode->vgId);
+ ASSERT(code == 0);
+
+ pMsg = rpcMsg.pCont;
+ memcpy(pMsg->data, pEntry, pEntry->bytes);
} else {
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST) {
// no entry in log
- pMsg = syncAppendEntriesBuild(0, pSyncNode->vgId);
- ASSERT(pMsg != NULL);
+ code = syncBuildAppendEntries(&rpcMsg, 0, pSyncNode->vgId);
+ ASSERT(code == 0);
+ pMsg = rpcMsg.pCont;
} else {
- do {
- char host[64];
- uint16_t port;
- syncUtilU642Addr(pDestId->addr, host, sizeof(host), &port);
-
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "replicate to %s:%d error, next-index:%" PRId64, host, port, nextIndex);
- syncNodeErrorLog(pSyncNode, logBuf);
- } while (0);
-
- syncAppendEntriesDestroy(pMsg);
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pDestId->addr, host, sizeof(host), &port);
+ sNError(pSyncNode, "replicate to %s:%d error, next-index:%" PRId64, host, port, nextIndex);
return -1;
}
}
+ if (h) {
+ taosLRUCacheRelease(pCache, h, false);
+ } else {
+ syncEntryDestory(pEntry);
+ }
+
// prepare msg
ASSERT(pMsg != NULL);
pMsg->srcId = pSyncNode->myRaftId;
@@ -126,9 +130,7 @@ int32_t syncNodeReplicateOne(SSyncNode* pSyncNode, SRaftId* pDestId) {
// pMsg->privateTerm = syncIndexMgrGetTerm(pSyncNode->pNextIndex, pDestId);
// send msg
- syncNodeMaybeSendAppendEntries(pSyncNode, pDestId, pMsg);
- syncAppendEntriesDestroy(pMsg);
-
+ syncNodeMaybeSendAppendEntries(pSyncNode, pDestId, &rpcMsg);
return 0;
}
@@ -137,12 +139,12 @@ int32_t syncNodeReplicate(SSyncNode* pSyncNode) {
return -1;
}
- syncNodeEventLog(pSyncNode, "do replicate");
+ sNTrace(pSyncNode, "do replicate");
int32_t ret = 0;
for (int i = 0; i < pSyncNode->peersNum; ++i) {
SRaftId* pDestId = &(pSyncNode->peersId[i]);
- ret = syncNodeReplicateOne(pSyncNode, pDestId);
+ ret = syncNodeReplicateOne(pSyncNode, pDestId, true);
if (ret != 0) {
char host[64];
int16_t port;
@@ -154,13 +156,13 @@ int32_t syncNodeReplicate(SSyncNode* pSyncNode) {
return 0;
}
-int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncAppendEntries* pMsg) {
- int32_t ret = 0;
- syncLogSendAppendEntries(pSyncNode, pMsg, "");
-
- SRpcMsg rpcMsg;
- syncAppendEntries2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg);
+int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg) {
+ int32_t ret = 0;
+ SyncAppendEntries* pMsg = pRpcMsg->pCont;
+ if (pMsg == NULL) {
+ sError("vgId:%d, sync-append-entries msg is NULL", pSyncNode->vgId);
+ return 0;
+ }
SPeerState* pState = syncNodeGetPeerState(pSyncNode, destRaftId);
if (pState == NULL) {
@@ -168,55 +170,56 @@ int32_t syncNodeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftI
return 0;
}
+ // save index, otherwise pMsg will be free by rpc
+ SyncIndex saveLastSendIndex = pState->lastSendIndex;
+ bool update = false;
if (pMsg->dataLen > 0) {
- pState->lastSendIndex = pMsg->prevLogIndex + 1;
+ saveLastSendIndex = pMsg->prevLogIndex + 1;
+ update = true;
+ }
+
+ syncLogSendAppendEntries(pSyncNode, pMsg, "");
+ syncNodeSendMsgById(destRaftId, pSyncNode, pRpcMsg);
+
+ if (update) {
+ pState->lastSendIndex = saveLastSendIndex;
pState->lastSendTime = taosGetTimestampMs();
}
return ret;
}
-int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncAppendEntries* pMsg) {
- int32_t ret = 0;
- if (syncNodeNeedSendAppendEntries(pSyncNode, destRaftId, pMsg)) {
- ret = syncNodeSendAppendEntries(pSyncNode, destRaftId, pMsg);
+int32_t syncNodeMaybeSendAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, SRpcMsg* pRpcMsg) {
+ int32_t ret = 0;
+ SyncAppendEntries* pMsg = pRpcMsg->pCont;
+ if (syncNodeNeedSendAppendEntries(pSyncNode, destRaftId, pMsg)) {
+ ret = syncNodeSendAppendEntries(pSyncNode, destRaftId, pRpcMsg);
} else {
char logBuf[128];
char host[64];
int16_t port;
syncUtilU642Addr(destRaftId->addr, host, sizeof(host), &port);
-
- snprintf(logBuf, sizeof(logBuf), "do not repcate to %s:%d for index:%" PRId64, host, port, pMsg->prevLogIndex + 1);
- syncNodeEventLog(pSyncNode, logBuf);
+ sNTrace(pSyncNode, "do not repcate to %s:%d for index:%" PRId64, host, port, pMsg->prevLogIndex + 1);
+ rpcFreeCont(pRpcMsg->pCont);
}
return ret;
}
-int32_t syncNodeAppendEntries(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncAppendEntries* pMsg) {
- int32_t ret = 0;
- syncLogSendAppendEntries(pSyncNode, pMsg, "");
-
- SRpcMsg rpcMsg;
- syncAppendEntries2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(destRaftId, pSyncNode, &rpcMsg);
- return ret;
-}
-
-int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* destRaftId, const SyncHeartbeat* pMsg) {
- int32_t ret = 0;
- syncLogSendHeartbeat(pSyncNode, pMsg, "");
-
- SRpcMsg rpcMsg;
- syncHeartbeat2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(&(pMsg->destId), pSyncNode, &rpcMsg);
- return ret;
+int32_t syncNodeSendHeartbeat(SSyncNode* pSyncNode, const SRaftId* destId, SRpcMsg* pMsg) {
+ syncLogSendHeartbeat(pSyncNode, pMsg->pCont, "");
+ return syncNodeSendMsgById(destId, pSyncNode, pMsg);
}
int32_t syncNodeHeartbeatPeers(SSyncNode* pSyncNode) {
for (int32_t i = 0; i < pSyncNode->peersNum; ++i) {
- SyncHeartbeat* pSyncMsg = syncHeartbeatBuild(pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ if (syncBuildHeartbeat(&rpcMsg, pSyncNode->vgId) != 0) {
+ continue;
+ }
+
+ SyncHeartbeat* pSyncMsg = rpcMsg.pCont;
pSyncMsg->srcId = pSyncNode->myRaftId;
pSyncMsg->destId = pSyncNode->peersId[i];
pSyncMsg->term = pSyncNode->pRaftStore->currentTerm;
@@ -224,13 +227,8 @@ int32_t syncNodeHeartbeatPeers(SSyncNode* pSyncNode) {
pSyncMsg->minMatchIndex = syncMinMatchIndex(pSyncNode);
pSyncMsg->privateTerm = 0;
- SRpcMsg rpcMsg;
- syncHeartbeat2RpcMsg(pSyncMsg, &rpcMsg);
-
// send msg
- syncNodeSendHeartbeat(pSyncNode, &(pSyncMsg->destId), pSyncMsg);
-
- syncHeartbeatDestroy(pSyncMsg);
+ syncNodeSendHeartbeat(pSyncNode, &pSyncMsg->destId, &rpcMsg);
}
return 0;
diff --git a/source/libs/sync/src/syncRequestVote.c b/source/libs/sync/src/syncRequestVote.c
index 3b4acea5826b46c9e6e0a8102bb1121fc3982efe..8ffc22ee255db30c81a20e7fd06fc629b43e1da9 100644
--- a/source/libs/sync/src/syncRequestVote.c
+++ b/source/libs/sync/src/syncRequestVote.c
@@ -13,8 +13,9 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRequestVote.h"
-#include "syncInt.h"
+#include "syncMessage.h"
#include "syncRaftCfg.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
@@ -48,71 +49,48 @@ static bool syncNodeOnRequestVoteLogOK(SSyncNode* pSyncNode, SyncRequestVote* pM
SyncIndex myLastIndex = syncNodeGetLastIndex(pSyncNode);
if (pMsg->lastLogIndex < pSyncNode->commitIndex) {
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "logok:0, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
- ", recv-term:%" PRIu64 "}",
- myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
+ sNTrace(pSyncNode,
+ "logok:0, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
+ ", recv-term:%" PRIu64 "}",
+ myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
return false;
}
if (myLastTerm == SYNC_TERM_INVALID) {
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "logok:0, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
- ", recv-term:%" PRIu64 "}",
- myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode,
+ "logok:0, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
+ ", recv-term:%" PRIu64 "}",
+ myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
return false;
}
if (pMsg->lastLogTerm > myLastTerm) {
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "logok:1, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
- ", recv-term:%" PRIu64 "}",
- myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode,
+ "logok:1, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
+ ", recv-term:%" PRIu64 "}",
+ myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
return true;
}
if (pMsg->lastLogTerm == myLastTerm && pMsg->lastLogIndex >= myLastIndex) {
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "logok:1, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
- ", recv-term:%" PRIu64 "}",
- myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode,
+ "logok:1, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
+ ", recv-term:%" PRIu64 "}",
+ myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
return true;
}
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf),
- "logok:0, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
- ", recv-term:%" PRIu64 "}",
- myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
- syncNodeEventLog(pSyncNode, logBuf);
- } while (0);
-
+ sNTrace(pSyncNode,
+ "logok:0, {my-lterm:%" PRIu64 ", my-lindex:%" PRId64 ", recv-lterm:%" PRIu64 ", recv-lindex:%" PRId64
+ ", recv-term:%" PRIu64 "}",
+ myLastTerm, myLastIndex, pMsg->lastLogTerm, pMsg->lastLogIndex, pMsg->term);
return false;
}
-int32_t syncNodeOnRequestVote(SSyncNode* ths, SyncRequestVote* pMsg) {
- int32_t ret = 0;
+int32_t syncNodeOnRequestVote(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ int32_t ret = 0;
+ SyncRequestVote* pMsg = pRpcMsg->pCont;
// if already drop replica, do not process
if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) {
@@ -144,7 +122,11 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, SyncRequestVote* pMsg) {
}
// send msg
- SyncRequestVoteReply* pReply = syncRequestVoteReplyBuild(ths->vgId);
+ SRpcMsg rpcMsg = {0};
+ ret = syncBuildRequestVoteReply(&rpcMsg, ths->vgId);
+ ASSERT(ret == 0 );
+
+ SyncRequestVoteReply* pReply = rpcMsg.pCont;
pReply->srcId = ths->myRaftId;
pReply->destId = pMsg->srcId;
pReply->term = ths->pRaftStore->currentTerm;
@@ -158,10 +140,6 @@ int32_t syncNodeOnRequestVote(SSyncNode* ths, SyncRequestVote* pMsg) {
syncLogSendRequestVoteReply(ths, pReply, "");
} while (0);
- SRpcMsg rpcMsg;
- syncRequestVoteReply2RpcMsg(pReply, &rpcMsg);
syncNodeSendMsgById(&pReply->destId, ths, &rpcMsg);
- syncRequestVoteReplyDestroy(pReply);
-
return 0;
}
\ No newline at end of file
diff --git a/source/libs/sync/src/syncRequestVoteReply.c b/source/libs/sync/src/syncRequestVoteReply.c
index a9c325625813ff9285673579945d6ac16780b6da..563f475070a1ec63a3af73dcf9ed6205754b04b4 100644
--- a/source/libs/sync/src/syncRequestVoteReply.c
+++ b/source/libs/sync/src/syncRequestVoteReply.c
@@ -13,9 +13,9 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRequestVoteReply.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
+#include "syncMessage.h"
#include "syncRaftStore.h"
#include "syncUtil.h"
#include "syncVoteMgr.h"
@@ -37,8 +37,10 @@
// /\ Discard(m)
// /\ UNCHANGED <>
//
-int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, SyncRequestVoteReply* pMsg) {
- int32_t ret = 0;
+
+int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, const SRpcMsg* pRpcMsg) {
+ int32_t ret = 0;
+ SyncRequestVoteReply* pMsg = pRpcMsg->pCont;
// if already drop replica, do not process
if (!syncNodeInRaftGroup(ths, &(pMsg->srcId))) {
@@ -71,10 +73,8 @@ int32_t syncNodeOnRequestVoteReply(SSyncNode* ths, SyncRequestVoteReply* pMsg) {
// but they won't be looked at, so it doesn't matter.
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:%" PRIu64 ", msg term:%" PRIu64 "",
- ths->pVotesRespond->term, pMsg->term);
- syncNodeErrorLog(ths, logBuf);
+ sNError(ths, "vote respond error vote-respond-mgr term:%" PRIu64 ", msg term:%" PRIu64 "",
+ ths->pVotesRespond->term, pMsg->term);
return -1;
}
diff --git a/source/libs/sync/src/syncRespMgr.c b/source/libs/sync/src/syncRespMgr.c
index c31dede0b3d1aba536834c81168cab6a08e5654c..049b02d73e6a89344aa0266fc086cc69db943cb5 100644
--- a/source/libs/sync/src/syncRespMgr.c
+++ b/source/libs/sync/src/syncRespMgr.c
@@ -13,21 +13,23 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncRespMgr.h"
#include "syncRaftEntry.h"
#include "syncRaftStore.h"
+#include "syncUtil.h"
SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl) {
- SSyncRespMgr *pObj = (SSyncRespMgr *)taosMemoryMalloc(sizeof(SSyncRespMgr));
+ SSyncRespMgr *pObj = taosMemoryCalloc(1, sizeof(SSyncRespMgr));
if (pObj == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
- memset(pObj, 0, sizeof(SSyncRespMgr));
pObj->pRespHash =
taosHashInit(sizeof(uint64_t), taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY), true, HASH_NO_LOCK);
- ASSERT(pObj->pRespHash != NULL);
+ if (pObj->pRespHash == NULL) return NULL;
+
pObj->ttl = ttl;
pObj->data = data;
pObj->seqNum = 0;
@@ -38,105 +40,84 @@ SSyncRespMgr *syncRespMgrCreate(void *data, int64_t ttl) {
void syncRespMgrDestroy(SSyncRespMgr *pObj) {
if (pObj != NULL) {
- taosThreadMutexLock(&(pObj->mutex));
+ taosThreadMutexLock(&pObj->mutex);
taosHashCleanup(pObj->pRespHash);
- taosThreadMutexUnlock(&(pObj->mutex));
+ taosThreadMutexUnlock(&pObj->mutex);
taosThreadMutexDestroy(&(pObj->mutex));
taosMemoryFree(pObj);
}
}
-int64_t syncRespMgrAdd(SSyncRespMgr *pObj, SRespStub *pStub) {
- taosThreadMutexLock(&(pObj->mutex));
-
- uint64_t keyCode = ++(pObj->seqNum);
- taosHashPut(pObj->pRespHash, &keyCode, sizeof(keyCode), pStub, sizeof(SRespStub));
+uint64_t syncRespMgrAdd(SSyncRespMgr *pObj, const SRespStub *pStub) {
+ taosThreadMutexLock(&pObj->mutex);
- SSyncNode *pSyncNode = pObj->data;
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "save message handle, type:%s seq:%" PRIu64 " handle:%p",
- TMSG_INFO(pStub->rpcMsg.msgType), keyCode, pStub->rpcMsg.info.handle);
- syncNodeEventLog(pSyncNode, eventLog);
+ uint64_t seq = ++(pObj->seqNum);
+ int32_t code = taosHashPut(pObj->pRespHash, &seq, sizeof(uint64_t), pStub, sizeof(SRespStub));
+ sNTrace(pObj->data, "save message handle:%p, type:%s seq:%" PRIu64 " code:0x%x", pStub->rpcMsg.info.handle,
+ TMSG_INFO(pStub->rpcMsg.msgType), seq, code);
- taosThreadMutexUnlock(&(pObj->mutex));
- return keyCode;
+ taosThreadMutexUnlock(&pObj->mutex);
+ return seq;
}
-int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t index) {
- taosThreadMutexLock(&(pObj->mutex));
+int32_t syncRespMgrDel(SSyncRespMgr *pObj, uint64_t seq) {
+ taosThreadMutexLock(&pObj->mutex);
- taosHashRemove(pObj->pRespHash, &index, sizeof(index));
+ int32_t code = taosHashRemove(pObj->pRespHash, &seq, sizeof(seq));
+ sNTrace(pObj->data, "remove message handle, seq:%" PRIu64 " code:%d", seq, code);
- taosThreadMutexUnlock(&(pObj->mutex));
- return 0;
+ taosThreadMutexUnlock(&pObj->mutex);
+ return code;
}
-int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t index, SRespStub *pStub) {
- taosThreadMutexLock(&(pObj->mutex));
+int32_t syncRespMgrGet(SSyncRespMgr *pObj, uint64_t seq, SRespStub *pStub) {
+ taosThreadMutexLock(&pObj->mutex);
- void *pTmp = taosHashGet(pObj->pRespHash, &index, sizeof(index));
+ SRespStub *pTmp = taosHashGet(pObj->pRespHash, &seq, sizeof(uint64_t));
if (pTmp != NULL) {
memcpy(pStub, pTmp, sizeof(SRespStub));
+ sNTrace(pObj->data, "get message handle, type:%s seq:%" PRIu64 " handle:%p", TMSG_INFO(pStub->rpcMsg.msgType), seq,
+ pStub->rpcMsg.info.handle);
- SSyncNode *pSyncNode = pObj->data;
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "get message handle, type:%s seq:%" PRIu64 " handle:%p",
- TMSG_INFO(pStub->rpcMsg.msgType), index, pStub->rpcMsg.info.handle);
- syncNodeEventLog(pSyncNode, eventLog);
-
- taosThreadMutexUnlock(&(pObj->mutex));
+ taosThreadMutexUnlock(&pObj->mutex);
return 1; // get one object
}
- taosThreadMutexUnlock(&(pObj->mutex));
+
+ taosThreadMutexUnlock(&pObj->mutex);
return 0; // get none object
}
-int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t index, SRespStub *pStub) {
- taosThreadMutexLock(&(pObj->mutex));
-
- void *pTmp = taosHashGet(pObj->pRespHash, &index, sizeof(index));
- if (pTmp != NULL) {
- memcpy(pStub, pTmp, sizeof(SRespStub));
+int32_t syncRespMgrGetAndDel(SSyncRespMgr *pObj, uint64_t seq, SRpcHandleInfo *pInfo) {
+ taosThreadMutexLock(&pObj->mutex);
- SSyncNode *pSyncNode = pObj->data;
- char eventLog[128];
- snprintf(eventLog, sizeof(eventLog), "get-and-del message handle, type:%s seq:%" PRIu64 " handle:%p",
- TMSG_INFO(pStub->rpcMsg.msgType), index, pStub->rpcMsg.info.handle);
- syncNodeEventLog(pSyncNode, eventLog);
+ SRespStub *pStub = taosHashGet(pObj->pRespHash, &seq, sizeof(uint64_t));
+ if (pStub != NULL) {
+ *pInfo = pStub->rpcMsg.info;
+ sNTrace(pObj->data, "get-and-del message handle:%p, type:%s seq:%" PRIu64, pStub->rpcMsg.info.handle,
+ TMSG_INFO(pStub->rpcMsg.msgType), seq);
+ taosHashRemove(pObj->pRespHash, &seq, sizeof(uint64_t));
- taosHashRemove(pObj->pRespHash, &index, sizeof(index));
- taosThreadMutexUnlock(&(pObj->mutex));
+ taosThreadMutexUnlock(&pObj->mutex);
return 1; // get one object
}
- taosThreadMutexUnlock(&(pObj->mutex));
- return 0; // get none object
-}
-
-void syncRespCleanRsp(SSyncRespMgr *pObj) {
- taosThreadMutexLock(&(pObj->mutex));
- syncRespCleanByTTL(pObj, -1, true);
- taosThreadMutexUnlock(&(pObj->mutex));
-}
-void syncRespClean(SSyncRespMgr *pObj) {
- taosThreadMutexLock(&(pObj->mutex));
- syncRespCleanByTTL(pObj, pObj->ttl, false);
- taosThreadMutexUnlock(&(pObj->mutex));
+ taosThreadMutexUnlock(&pObj->mutex);
+ return 0; // get none object
}
-void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) {
+static void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) {
SRespStub *pStub = (SRespStub *)taosHashIterate(pObj->pRespHash, NULL);
int cnt = 0;
int sum = 0;
SSyncNode *pSyncNode = pObj->data;
- SArray *delIndexArray = taosArrayInit(0, sizeof(uint64_t));
- ASSERT(delIndexArray != NULL);
- sDebug("vgId:%d, resp mgr begin clean by ttl", pSyncNode->vgId);
+ SArray *delIndexArray = taosArrayInit(4, sizeof(uint64_t));
+ if (delIndexArray == NULL) return;
+ sDebug("vgId:%d, resp mgr begin clean by ttl", pSyncNode->vgId);
while (pStub) {
size_t len;
- void * key = taosHashGetKey(pStub, &len);
+ void *key = taosHashGetKey(pStub, &len);
uint64_t *pSeqNum = (uint64_t *)key;
sum++;
@@ -161,15 +142,15 @@ void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) {
pStub->rpcMsg.contLen = 0;
// TODO: and make rpcMsg body, call commit cb
- // pSyncNode->pFsm->FpCommitCb(pSyncNode->pFsm, &(pStub->rpcMsg), cbMeta);
+ // pSyncNode->pFsm->FpCommitCb(pSyncNode->pFsm, &pStub->rpcMsg, cbMeta);
pStub->rpcMsg.code = TSDB_CODE_SYN_NOT_LEADER;
if (pStub->rpcMsg.info.handle != NULL) {
- tmsgSendRsp(&(pStub->rpcMsg));
+ tmsgSendRsp(&pStub->rpcMsg);
}
}
- pStub = (SRespStub *)taosHashIterate(pObj->pRespHash, pStub);
+ pStub = taosHashIterate(pObj->pRespHash, pStub);
}
int32_t arraySize = taosArrayGetSize(delIndexArray);
@@ -182,3 +163,15 @@ void syncRespCleanByTTL(SSyncRespMgr *pObj, int64_t ttl, bool rsp) {
}
taosArrayDestroy(delIndexArray);
}
+
+void syncRespCleanRsp(SSyncRespMgr *pObj) {
+ taosThreadMutexLock(&pObj->mutex);
+ syncRespCleanByTTL(pObj, -1, true);
+ taosThreadMutexUnlock(&pObj->mutex);
+}
+
+void syncRespClean(SSyncRespMgr *pObj) {
+ taosThreadMutexLock(&pObj->mutex);
+ syncRespCleanByTTL(pObj, pObj->ttl, false);
+ taosThreadMutexUnlock(&pObj->mutex);
+}
diff --git a/source/libs/sync/src/syncSnapshot.c b/source/libs/sync/src/syncSnapshot.c
index b7283157462f8860156571b0bbdb22cfdc2e4c51..222b7c4e1ef97a3c82fcb419597875ef4f1dab0d 100644
--- a/source/libs/sync/src/syncSnapshot.c
+++ b/source/libs/sync/src/syncSnapshot.c
@@ -13,33 +13,26 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncSnapshot.h"
#include "syncIndexMgr.h"
#include "syncRaftCfg.h"
#include "syncRaftLog.h"
#include "syncRaftStore.h"
+#include "syncReplication.h"
#include "syncUtil.h"
-#include "wal.h"
-//----------------------------------
-static void snapshotSenderUpdateProgress(SSyncSnapshotSender *pSender, SyncSnapshotRsp *pMsg);
-static void snapshotReceiverDoStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg);
-static void snapshotReceiverGotData(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg);
-static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pMsg);
-
-//----------------------------------
SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaIndex) {
bool condition = (pSyncNode->pFsm->FpSnapshotStartRead != NULL) && (pSyncNode->pFsm->FpSnapshotStopRead != NULL) &&
(pSyncNode->pFsm->FpSnapshotDoRead != NULL);
SSyncSnapshotSender *pSender = NULL;
if (condition) {
- pSender = taosMemoryMalloc(sizeof(SSyncSnapshotSender));
+ pSender = taosMemoryCalloc(1, sizeof(SSyncSnapshotSender));
if (pSender == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
- memset(pSender, 0, sizeof(*pSender));
pSender->start = false;
pSender->seq = SYNC_SNAPSHOT_SEQ_INVALID;
@@ -52,6 +45,7 @@ SSyncSnapshotSender *snapshotSenderCreate(SSyncNode *pSyncNode, int32_t replicaI
pSender->replicaIndex = replicaIndex;
pSender->term = pSyncNode->pRaftStore->currentTerm;
pSender->startTime = 0;
+ pSender->endTime = 0;
pSender->pSyncNode->pFsm->FpGetSnapshotInfo(pSender->pSyncNode->pFsm, &(pSender->snapshot));
pSender->finish = false;
} else {
@@ -73,7 +67,7 @@ void snapshotSenderDestroy(SSyncSnapshotSender *pSender) {
if (pSender->pReader != NULL) {
int32_t ret = pSender->pSyncNode->pFsm->FpSnapshotStopRead(pSender->pSyncNode->pFsm, pSender->pReader);
if (ret != 0) {
- syncNodeErrorLog(pSender->pSyncNode, "stop reader error");
+ sNError(pSender->pSyncNode, "stop reader error");
}
pSender->pReader = NULL;
}
@@ -111,7 +105,10 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) {
pSender->finish = false;
// build begin msg
- SyncSnapshotSend *pMsg = syncSnapshotSendBuild(0, pSender->pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSend(&rpcMsg, 0, pSender->pSyncNode->vgId);
+
+ SyncSnapshotSend *pMsg = rpcMsg.pCont;
pMsg->srcId = pSender->pSyncNode->myRaftId;
pMsg->destId = (pSender->pSyncNode->replicasId)[pSender->replicaIndex];
pMsg->term = pSender->pSyncNode->pRaftStore->currentTerm;
@@ -124,18 +121,11 @@ int32_t snapshotSenderStart(SSyncSnapshotSender *pSender) {
pMsg->seq = SYNC_SNAPSHOT_SEQ_PRE_SNAPSHOT;
// send msg
- SRpcMsg rpcMsg;
- syncSnapshotSend2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(&(pMsg->destId), pSender->pSyncNode, &rpcMsg);
- syncSnapshotSendDestroy(pMsg);
+ syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "");
// event log
- do {
- char *eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender start");
- syncNodeEventLog(pSender->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sSTrace(pSender, "snapshot sender start");
return 0;
}
@@ -143,6 +133,7 @@ int32_t snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish) {
// update flag
pSender->start = false;
pSender->finish = finish;
+ pSender->endTime = taosGetTimestampMs();
// close reader
if (pSender->pReader != NULL) {
@@ -159,12 +150,7 @@ int32_t snapshotSenderStop(SSyncSnapshotSender *pSender, bool finish) {
}
// event log
- do {
- char *eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender stop");
- syncNodeEventLog(pSender->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sSTrace(pSender, "snapshot sender stop");
return 0;
}
@@ -190,7 +176,10 @@ int32_t snapshotSend(SSyncSnapshotSender *pSender) {
}
// build msg
- SyncSnapshotSend *pMsg = syncSnapshotSendBuild(pSender->blockLen, pSender->pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSend(&rpcMsg, pSender->blockLen, pSender->pSyncNode->vgId);
+
+ SyncSnapshotSend *pMsg = rpcMsg.pCont;
pMsg->srcId = pSender->pSyncNode->myRaftId;
pMsg->destId = (pSender->pSyncNode->replicasId)[pSender->replicaIndex];
pMsg->term = pSender->pSyncNode->pRaftStore->currentTerm;
@@ -203,26 +192,20 @@ int32_t snapshotSend(SSyncSnapshotSender *pSender) {
// pMsg->privateTerm = pSender->privateTerm;
- memcpy(pMsg->data, pSender->pCurrentBlock, pSender->blockLen);
+ if (pSender->pCurrentBlock != NULL) {
+ memcpy(pMsg->data, pSender->pCurrentBlock, pSender->blockLen);
+ }
// send msg
- SRpcMsg rpcMsg;
- syncSnapshotSend2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(&(pMsg->destId), pSender->pSyncNode, &rpcMsg);
- syncSnapshotSendDestroy(pMsg);
+ syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "");
// event log
- do {
- char *eventLog = NULL;
- if (pSender->seq == SYNC_SNAPSHOT_SEQ_END) {
- eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender finish");
- } else {
- eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender sending");
- }
- syncNodeEventLog(pSender->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ if (pSender->seq == SYNC_SNAPSHOT_SEQ_END) {
+ sSTrace(pSender, "snapshot sender finish");
+ } else {
+ sSTrace(pSender, "snapshot sender sending");
+ }
return 0;
}
@@ -231,7 +214,10 @@ int32_t snapshotReSend(SSyncSnapshotSender *pSender) {
// send current block data
if (pSender->pCurrentBlock != NULL && pSender->blockLen > 0) {
// build msg
- SyncSnapshotSend *pMsg = syncSnapshotSendBuild(pSender->blockLen, pSender->pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSend(&rpcMsg, pSender->blockLen, pSender->pSyncNode->vgId);
+
+ SyncSnapshotSend *pMsg = rpcMsg.pCont;
pMsg->srcId = pSender->pSyncNode->myRaftId;
pMsg->destId = (pSender->pSyncNode->replicasId)[pSender->replicaIndex];
pMsg->term = pSender->pSyncNode->pRaftStore->currentTerm;
@@ -243,21 +229,14 @@ int32_t snapshotReSend(SSyncSnapshotSender *pSender) {
pMsg->seq = pSender->seq;
// pMsg->privateTerm = pSender->privateTerm;
-
memcpy(pMsg->data, pSender->pCurrentBlock, pSender->blockLen);
// send msg
- SRpcMsg rpcMsg;
- syncSnapshotSend2RpcMsg(pMsg, &rpcMsg);
- syncNodeSendMsgById(&(pMsg->destId), pSender->pSyncNode, &rpcMsg);
- syncSnapshotSendDestroy(pMsg);
+ syncNodeSendMsgById(&pMsg->destId, pSender->pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotSend(pSender->pSyncNode, pMsg, "");
// event log
- do {
- char *eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender resend");
- syncNodeEventLog(pSender->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
+ sSTrace(pSender, "snapshot sender resend");
}
return 0;
@@ -269,121 +248,51 @@ static void snapshotSenderUpdateProgress(SSyncSnapshotSender *pSender, SyncSnaps
++(pSender->seq);
}
-cJSON *snapshotSender2Json(SSyncSnapshotSender *pSender) {
- char u64buf[128];
- cJSON *pRoot = cJSON_CreateObject();
-
- if (pSender != NULL) {
- cJSON_AddNumberToObject(pRoot, "start", pSender->start);
- cJSON_AddNumberToObject(pRoot, "seq", pSender->seq);
- cJSON_AddNumberToObject(pRoot, "ack", pSender->ack);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pSender->pReader);
- cJSON_AddStringToObject(pRoot, "pReader", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pSender->pCurrentBlock);
- cJSON_AddStringToObject(pRoot, "pCurrentBlock", u64buf);
- cJSON_AddNumberToObject(pRoot, "blockLen", pSender->blockLen);
-
- if (pSender->pCurrentBlock != NULL) {
- char *s;
- s = syncUtilprintBin((char *)(pSender->pCurrentBlock), pSender->blockLen);
- cJSON_AddStringToObject(pRoot, "pCurrentBlock", s);
- taosMemoryFree(s);
- s = syncUtilprintBin2((char *)(pSender->pCurrentBlock), pSender->blockLen);
- cJSON_AddStringToObject(pRoot, "pCurrentBlock2", s);
- taosMemoryFree(s);
- }
-
- cJSON *pSnapshot = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSender->snapshot.lastApplyIndex);
- cJSON_AddStringToObject(pSnapshot, "lastApplyIndex", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSender->snapshot.lastApplyTerm);
- cJSON_AddStringToObject(pSnapshot, "lastApplyTerm", u64buf);
- cJSON_AddItemToObject(pRoot, "snapshot", pSnapshot);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSender->sendingMS);
- cJSON_AddStringToObject(pRoot, "sendingMS", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pSender->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- cJSON_AddNumberToObject(pRoot, "replicaIndex", pSender->replicaIndex);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSender->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- // snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pSender->privateTerm);
- // cJSON_AddStringToObject(pRoot, "privateTerm", u64buf);
-
- cJSON_AddNumberToObject(pRoot, "finish", pSender->finish);
- }
-
- cJSON *pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SSyncSnapshotSender", pRoot);
- return pJson;
-}
-
-char *snapshotSender2Str(SSyncSnapshotSender *pSender) {
- cJSON *pJson = snapshotSender2Json(pSender);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-char *snapshotSender2SimpleStr(SSyncSnapshotSender *pSender, char *event) {
- int32_t len = 256;
- char *s = taosMemoryMalloc(len);
-
- SRaftId destId = pSender->pSyncNode->replicasId[pSender->replicaIndex];
- char host[64];
- uint16_t port;
- syncUtilU642Addr(destId.addr, host, sizeof(host), &port);
-
- snprintf(s, len,
- "%s {%p s-param:%" PRId64 " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64 " lcindex:%" PRId64
- " seq:%d ack:%d finish:%d replica-index:%d %s:%d}",
- event, pSender, pSender->snapshotParam.start, pSender->snapshotParam.end, pSender->snapshot.lastApplyIndex,
- pSender->snapshot.lastApplyTerm, pSender->snapshot.lastConfigIndex, pSender->seq, pSender->ack,
- pSender->finish, pSender->replicaIndex, host, port);
-
- return s;
-}
-
+// return 0, start ok
+// return 1, last snapshot finish ok
+// return -1, error
int32_t syncNodeStartSnapshot(SSyncNode *pSyncNode, SRaftId *pDestId) {
- syncNodeEventLog(pSyncNode, "starting snapshot ...");
+ sNTrace(pSyncNode, "starting snapshot ...");
SSyncSnapshotSender *pSender = syncNodeGetSnapshotSender(pSyncNode, pDestId);
if (pSender == NULL) {
- syncNodeErrorLog(pSyncNode, "start snapshot error, sender is null");
+ sNError(pSyncNode, "start snapshot error, sender is null");
return -1;
}
int32_t code = 0;
if (snapshotSenderIsStart(pSender)) {
- code = snapshotSenderStop(pSender, false);
- if (code != 0) {
- syncNodeErrorLog(pSyncNode, "snapshot sender stop error");
- return -1;
- }
+ sNTrace(pSyncNode, "snapshot sender already start, ignore");
+ return 0;
+ }
+
+ if (!snapshotSenderIsStart(pSender) && pSender->finish &&
+ taosGetTimestampMs() - pSender->endTime < SNAPSHOT_WAIT_MS) {
+ sNTrace(pSyncNode, "snapshot sender too frequently, ignore");
+ return 1;
}
code = snapshotSenderStart(pSender);
if (code != 0) {
- syncNodeErrorLog(pSyncNode, "snapshot sender start error");
+ sNError(pSyncNode, "snapshot sender start error");
return -1;
}
return 0;
}
-// -------------------------------------
SSyncSnapshotReceiver *snapshotReceiverCreate(SSyncNode *pSyncNode, SRaftId fromId) {
bool condition = (pSyncNode->pFsm->FpSnapshotStartWrite != NULL) && (pSyncNode->pFsm->FpSnapshotStopWrite != NULL) &&
(pSyncNode->pFsm->FpSnapshotDoWrite != NULL);
SSyncSnapshotReceiver *pReceiver = NULL;
if (condition) {
- pReceiver = taosMemoryMalloc(sizeof(SSyncSnapshotReceiver));
- ASSERT(pReceiver != NULL);
- memset(pReceiver, 0, sizeof(*pReceiver));
+ pReceiver = taosMemoryCalloc(1, sizeof(SSyncSnapshotReceiver));
+ if (pReceiver == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return NULL;
+ }
pReceiver->start = false;
pReceiver->ack = SYNC_SNAPSHOT_SEQ_BEGIN;
@@ -420,40 +329,6 @@ void snapshotReceiverDestroy(SSyncSnapshotReceiver *pReceiver) {
bool snapshotReceiverIsStart(SSyncSnapshotReceiver *pReceiver) { return pReceiver->start; }
-// static do start by privateTerm, pBeginMsg
-// receive first snapshot data
-// write first block data
-static void snapshotReceiverDoStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg) {
- pReceiver->start = true;
- pReceiver->ack = SYNC_SNAPSHOT_SEQ_BEGIN;
-
- // start writer
- ASSERT(pReceiver->pWriter == NULL);
- int32_t ret = pReceiver->pSyncNode->pFsm->FpSnapshotStartWrite(pReceiver->pSyncNode->pFsm,
- &(pReceiver->snapshotParam), &(pReceiver->pWriter));
- ASSERT(ret == 0);
-
- pReceiver->term = pReceiver->pSyncNode->pRaftStore->currentTerm;
- pReceiver->snapshotParam.start = pBeginMsg->beginIndex;
- pReceiver->snapshotParam.end = pBeginMsg->lastIndex;
-
- pReceiver->fromId = pBeginMsg->srcId;
-
- // update snapshot
- pReceiver->snapshot.lastApplyIndex = pBeginMsg->lastIndex;
- pReceiver->snapshot.lastApplyTerm = pBeginMsg->lastTerm;
- pReceiver->snapshot.lastConfigIndex = pBeginMsg->lastConfigIndex;
-
- pReceiver->startTime = pBeginMsg->startTime;
-
- // event log
- do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver start");
- syncNodeEventLog(pReceiver->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-}
-
// force stop
void snapshotReceiverForceStop(SSyncSnapshotReceiver *pReceiver) {
// force close, abandon incomplete data
@@ -467,17 +342,46 @@ void snapshotReceiverForceStop(SSyncSnapshotReceiver *pReceiver) {
pReceiver->start = false;
// event log
- do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver force stop");
- syncNodeEventLog(pReceiver->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
+ sRTrace(pReceiver, "snapshot receiver force stop");
+}
+
+int32_t snapshotReceiverStartWriter(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg) {
+ ASSERT(snapshotReceiverIsStart(pReceiver));
+
+ // update ack
+ pReceiver->ack = SYNC_SNAPSHOT_SEQ_BEGIN;
+
+ // update snapshot
+ pReceiver->snapshot.lastApplyIndex = pBeginMsg->lastIndex;
+ pReceiver->snapshot.lastApplyTerm = pBeginMsg->lastTerm;
+ pReceiver->snapshot.lastConfigIndex = pBeginMsg->lastConfigIndex;
+
+ pReceiver->snapshotParam.start = pBeginMsg->beginIndex;
+ pReceiver->snapshotParam.end = pBeginMsg->lastIndex;
+
+ // start writer
+ ASSERT(pReceiver->pWriter == NULL);
+ int32_t ret = pReceiver->pSyncNode->pFsm->FpSnapshotStartWrite(pReceiver->pSyncNode->pFsm,
+ &(pReceiver->snapshotParam), &(pReceiver->pWriter));
+ ASSERT(ret == 0);
+
+ // event log
+ sRTrace(pReceiver, "snapshot receiver start writer");
+
+ return 0;
}
-// if receiver receive msg from seq = SYNC_SNAPSHOT_SEQ_BEGIN, start receiver
-int32_t snapshotReceiverStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pBeginMsg) {
+int32_t snapshotReceiverStart(SSyncSnapshotReceiver *pReceiver, SyncSnapshotSend *pPreMsg) {
ASSERT(!snapshotReceiverIsStart(pReceiver));
- snapshotReceiverDoStart(pReceiver, pBeginMsg);
+
+ pReceiver->start = true;
+ pReceiver->ack = SYNC_SNAPSHOT_SEQ_PRE_SNAPSHOT;
+ pReceiver->term = pReceiver->pSyncNode->pRaftStore->currentTerm;
+ pReceiver->fromId = pPreMsg->srcId;
+ pReceiver->startTime = pPreMsg->startTime;
+
+ // event log
+ sRTrace(pReceiver, "snapshot receiver start");
return 0;
}
@@ -495,14 +399,7 @@ int32_t snapshotReceiverStop(SSyncSnapshotReceiver *pReceiver) {
pReceiver->start = false;
// event log
- do {
- SSnapshot snapshot;
- pReceiver->pSyncNode->pFsm->FpGetSnapshotInfo(pReceiver->pSyncNode->pFsm, &snapshot);
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver stop");
- syncNodeEventLog(pReceiver->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sRTrace(pReceiver, "snapshot receiver stop");
return 0;
}
@@ -517,7 +414,7 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap
code = pReceiver->pSyncNode->pFsm->FpSnapshotDoWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, pMsg->data,
pMsg->dataLen);
if (code != 0) {
- syncNodeErrorLog(pReceiver->pSyncNode, "snapshot write error");
+ sNError(pReceiver->pSyncNode, "snapshot write error");
return -1;
}
}
@@ -526,7 +423,7 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap
code =
pReceiver->pSyncNode->pLogStore->syncLogRestoreFromSnapshot(pReceiver->pSyncNode->pLogStore, pMsg->lastIndex);
if (code != 0) {
- syncNodeErrorLog(pReceiver->pSyncNode, "wal restore from snapshot error");
+ sNError(pReceiver->pSyncNode, "wal restore from snapshot error");
return -1;
}
@@ -545,8 +442,7 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap
code = pReceiver->pSyncNode->pFsm->FpSnapshotStopWrite(pReceiver->pSyncNode->pFsm, pReceiver->pWriter, true,
&(pReceiver->snapshot));
if (code != 0) {
- syncNodeErrorLog(pReceiver->pSyncNode, "snapshot stop writer true error");
- // ASSERT(0);
+ sNError(pReceiver->pSyncNode, "snapshot stop writer true error");
return -1;
}
pReceiver->pWriter = NULL;
@@ -555,19 +451,12 @@ static int32_t snapshotReceiverFinish(SSyncSnapshotReceiver *pReceiver, SyncSnap
pReceiver->ack = SYNC_SNAPSHOT_SEQ_END;
} else {
- syncNodeErrorLog(pReceiver->pSyncNode, "snapshot stop writer true error");
+ sNError(pReceiver->pSyncNode, "snapshot stop writer true error");
return -1;
}
// event log
- do {
- SSnapshot snapshot;
- pReceiver->pSyncNode->pFsm->FpGetSnapshotInfo(pReceiver->pSyncNode->pFsm, &snapshot);
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver got last data, finish, apply snapshot");
- syncNodeEventLog(pReceiver->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sRTrace(pReceiver, "snapshot receiver got last data, finish, apply snapshot");
return 0;
}
@@ -588,92 +477,10 @@ static void snapshotReceiverGotData(SSyncSnapshotReceiver *pReceiver, SyncSnapsh
pReceiver->ack = pMsg->seq;
// event log
- do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver receiving");
- syncNodeEventLog(pReceiver->pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
+ sRTrace(pReceiver, "snapshot receiver receiving");
}
}
-cJSON *snapshotReceiver2Json(SSyncSnapshotReceiver *pReceiver) {
- char u64buf[128];
- cJSON *pRoot = cJSON_CreateObject();
-
- if (pReceiver != NULL) {
- cJSON_AddNumberToObject(pRoot, "start", pReceiver->start);
- cJSON_AddNumberToObject(pRoot, "ack", pReceiver->ack);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pReceiver->pWriter);
- cJSON_AddStringToObject(pRoot, "pWriter", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%p", pReceiver->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
-
- cJSON *pFromId = cJSON_CreateObject();
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pReceiver->fromId.addr);
- cJSON_AddStringToObject(pFromId, "addr", u64buf);
- {
- uint64_t u64 = pReceiver->fromId.addr;
- cJSON *pTmp = pFromId;
- char host[128] = {0};
- uint16_t port;
- syncUtilU642Addr(u64, host, sizeof(host), &port);
- cJSON_AddStringToObject(pTmp, "addr_host", host);
- cJSON_AddNumberToObject(pTmp, "addr_port", port);
- }
- cJSON_AddNumberToObject(pFromId, "vgId", pReceiver->fromId.vgId);
- cJSON_AddItemToObject(pRoot, "fromId", pFromId);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pReceiver->snapshot.lastApplyIndex);
- cJSON_AddStringToObject(pRoot, "snapshot.lastApplyIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pReceiver->snapshot.lastApplyTerm);
- cJSON_AddStringToObject(pRoot, "snapshot.lastApplyTerm", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pReceiver->snapshot.lastConfigIndex);
- cJSON_AddStringToObject(pRoot, "snapshot.lastConfigIndex", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pReceiver->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRId64, pReceiver->startTime);
- cJSON_AddStringToObject(pRoot, "startTime", u64buf);
- }
-
- cJSON *pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SSyncSnapshotReceiver", pRoot);
- return pJson;
-}
-
-char *snapshotReceiver2Str(SSyncSnapshotReceiver *pReceiver) {
- cJSON *pJson = snapshotReceiver2Json(pReceiver);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-char *snapshotReceiver2SimpleStr(SSyncSnapshotReceiver *pReceiver, char *event) {
- int32_t len = 256;
- char *s = taosMemoryMalloc(len);
-
- SRaftId fromId = pReceiver->fromId;
- char host[128];
- uint16_t port;
- syncUtilU642Addr(fromId.addr, host, sizeof(host), &port);
-
- snprintf(s, len,
- "%s {%p start:%d ack:%d term:%" PRIu64 " start-time:%" PRId64 " from:%s:%d s-param:%" PRId64
- " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64
- " "
- "lcindex:%" PRId64 "}",
- event, pReceiver, pReceiver->start, pReceiver->ack, pReceiver->term, pReceiver->startTime, host, port,
- pReceiver->snapshotParam.start, pReceiver->snapshotParam.end, pReceiver->snapshot.lastApplyIndex,
- pReceiver->snapshot.lastApplyTerm, pReceiver->snapshot.lastConfigIndex);
-
- return s;
-}
-
SyncIndex syncNodeGetSnapBeginIndex(SSyncNode *ths) {
SyncIndex snapStart = SYNC_INDEX_INVALID;
@@ -688,11 +495,8 @@ SyncIndex syncNodeGetSnapBeginIndex(SSyncNode *ths) {
int64_t walCommitVer = walGetCommittedVer(pWal);
if (!isEmpty && ths->commitIndex != walCommitVer) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "commit not same, wal-commit:%" PRId64 ", commit:%" PRId64 ", ignore",
- walCommitVer, ths->commitIndex);
- syncNodeErrorLog(ths, logBuf);
-
+ sNError(ths, "commit not same, wal-commit:%" PRId64 ", commit:%" PRId64 ", ignore", walCommitVer,
+ ths->commitIndex);
snapStart = walCommitVer + 1;
} else {
snapStart = ths->commitIndex + 1;
@@ -726,11 +530,14 @@ static int32_t syncNodeOnSnapshotPre(SSyncNode *pSyncNode, SyncSnapshotSend *pMs
_START_RECEIVER:
if (taosGetTimestampMs() - pMsg->startTime > SNAPSHOT_MAX_CLOCK_SKEW_MS) {
- syncNodeErrorLog(pSyncNode, "snapshot receiver time skew too much");
+ sNError(pSyncNode, "snapshot receiver time skew too much");
return -1;
} else {
// waiting for clock match
- while (taosGetTimestampMs() > pMsg->startTime) {
+ int64_t timeNow = taosGetTimestampMs();
+ while (timeNow < pMsg->startTime) {
+ sNTrace(pSyncNode, "snapshot receiver pre waitting for true time, now:%" PRId64 ", stime:%" PRId64, timeNow,
+ pMsg->startTime);
taosMsleep(10);
}
@@ -740,7 +547,11 @@ _START_RECEIVER:
_SEND_REPLY:
// build msg
; // make complier happy
- SyncSnapshotRsp *pRspMsg = syncSnapshotRspBuild(pSyncNode->vgId);
+
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSendRsp(&rpcMsg, pSyncNode->vgId);
+
+ SyncSnapshotRsp *pRspMsg = rpcMsg.pCont;
pRspMsg->srcId = pSyncNode->myRaftId;
pRspMsg->destId = pMsg->srcId;
pRspMsg->term = pSyncNode->pRaftStore->currentTerm;
@@ -752,11 +563,8 @@ _SEND_REPLY:
pRspMsg->snapBeginIndex = syncNodeGetSnapBeginIndex(pSyncNode);
// send msg
- SRpcMsg rpcMsg;
- syncSnapshotRsp2RpcMsg(pRspMsg, &rpcMsg);
- syncNodeSendMsgById(&(pRspMsg->destId), pSyncNode, &rpcMsg);
- syncSnapshotRspDestroy(pRspMsg);
-
+ syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotRsp(pSyncNode, pRspMsg, "");
return 0;
}
@@ -764,54 +572,116 @@ static int32_t syncNodeOnSnapshotBegin(SSyncNode *pSyncNode, SyncSnapshotSend *p
// condition 1
SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver;
- if (snapshotReceiverIsStart(pReceiver)) {
- if (pMsg->startTime > pReceiver->startTime) {
- snapshotReceiverStop(pReceiver);
-
- } else if (pMsg->startTime == pReceiver->startTime) {
- return 0;
- } else {
- // ignore
- syncNodeEventLog(pSyncNode, "msg ignore");
- return 0;
- }
+ if (!snapshotReceiverIsStart(pReceiver)) {
+ sNError(pSyncNode, "snapshot receiver not start");
+ return -1;
}
-_START_RECEIVER:
- if (taosGetTimestampMs() - pMsg->startTime > SNAPSHOT_MAX_CLOCK_SKEW_MS) {
- syncNodeErrorLog(pSyncNode, "snapshot receiver time skew too much");
+ if (pReceiver->startTime != pMsg->startTime) {
+ sNError(pSyncNode, "snapshot receiver time not equal");
return -1;
- } else {
- // waiting for clock match
- while (taosGetTimestampMs() > pMsg->startTime) {
- taosMsleep(10);
- }
+ }
- snapshotReceiverStart(pReceiver, pMsg);
+ // start writer
+ snapshotReceiverStartWriter(pReceiver, pMsg);
- // build msg
- SyncSnapshotRsp *pRspMsg = syncSnapshotRspBuild(pSyncNode->vgId);
- pRspMsg->srcId = pSyncNode->myRaftId;
- pRspMsg->destId = pMsg->srcId;
- pRspMsg->term = pSyncNode->pRaftStore->currentTerm;
- pRspMsg->lastIndex = pMsg->lastIndex;
- pRspMsg->lastTerm = pMsg->lastTerm;
- pRspMsg->ack = pReceiver->ack; // receiver maybe already closed
- pRspMsg->code = 0;
+ // build msg
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSendRsp(&rpcMsg, pSyncNode->vgId);
- // send msg
- SRpcMsg rpcMsg;
- syncSnapshotRsp2RpcMsg(pRspMsg, &rpcMsg);
- syncNodeSendMsgById(&(pRspMsg->destId), pSyncNode, &rpcMsg);
- syncSnapshotRspDestroy(pRspMsg);
+ SyncSnapshotRsp *pRspMsg = rpcMsg.pCont;
+ pRspMsg->srcId = pSyncNode->myRaftId;
+ pRspMsg->destId = pMsg->srcId;
+ pRspMsg->term = pSyncNode->pRaftStore->currentTerm;
+ pRspMsg->lastIndex = pMsg->lastIndex;
+ pRspMsg->lastTerm = pMsg->lastTerm;
+ pRspMsg->startTime = pReceiver->startTime;
+ pRspMsg->ack = pReceiver->ack; // receiver maybe already closed
+ pRspMsg->code = 0;
+ pRspMsg->snapBeginIndex = pReceiver->snapshotParam.start;
+
+ // send msg
+ syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotRsp(pSyncNode, pRspMsg, "");
+ return 0;
+}
+
+static int32_t syncNodeOnSnapshotTransfering(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
+ // condition 4
+ // transfering
+ SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver;
+
+ // waiting for clock match
+ int64_t timeNow = taosGetTimestampMs();
+ while (timeNow < pMsg->startTime) {
+ sNTrace(pSyncNode, "snapshot receiver transfering waitting for true time, now:%" PRId64 ", stime:%" PRId64, timeNow,
+ pMsg->startTime);
+ taosMsleep(10);
}
+ if (pMsg->seq == pReceiver->ack + 1) {
+ snapshotReceiverGotData(pReceiver, pMsg);
+ }
+
+ // build msg
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSendRsp(&rpcMsg, pSyncNode->vgId);
+
+ SyncSnapshotRsp *pRspMsg = rpcMsg.pCont;
+ pRspMsg->srcId = pSyncNode->myRaftId;
+ pRspMsg->destId = pMsg->srcId;
+ pRspMsg->term = pSyncNode->pRaftStore->currentTerm;
+ pRspMsg->lastIndex = pMsg->lastIndex;
+ pRspMsg->lastTerm = pMsg->lastTerm;
+ pRspMsg->startTime = pReceiver->startTime;
+ pRspMsg->ack = pReceiver->ack; // receiver maybe already closed
+ pRspMsg->code = 0;
+ pRspMsg->snapBeginIndex = pReceiver->snapshotParam.start;
+
+ // send msg
+ syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotRsp(pSyncNode, pRspMsg, "");
return 0;
}
-static int32_t syncNodeOnSnapshotTransfer(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) { return 0; }
+static int32_t syncNodeOnSnapshotEnd(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
+ // condition 2
+ // end, finish FSM
+ SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver;
+
+ // waiting for clock match
+ int64_t timeNow = taosGetTimestampMs();
+ while (timeNow < pMsg->startTime) {
+ sNTrace(pSyncNode, "snapshot receiver finish waitting for true time, now:%" PRId64 ", stime:%" PRId64, timeNow,
+ pMsg->startTime);
+ taosMsleep(10);
+ }
+
+ int32_t code = snapshotReceiverFinish(pReceiver, pMsg);
+ if (code == 0) {
+ snapshotReceiverStop(pReceiver);
+ }
+
+ // build msg
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSendRsp(&rpcMsg, pSyncNode->vgId);
+
+ SyncSnapshotRsp *pRspMsg = rpcMsg.pCont;
+ pRspMsg->srcId = pSyncNode->myRaftId;
+ pRspMsg->destId = pMsg->srcId;
+ pRspMsg->term = pSyncNode->pRaftStore->currentTerm;
+ pRspMsg->lastIndex = pMsg->lastIndex;
+ pRspMsg->lastTerm = pMsg->lastTerm;
+ pRspMsg->startTime = pReceiver->startTime;
+ pRspMsg->ack = pReceiver->ack; // receiver maybe already closed
+ pRspMsg->code = 0;
+ pRspMsg->snapBeginIndex = pReceiver->snapshotParam.start;
-static int32_t syncNodeOnSnapshotEnd(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) { return 0; }
+ // send msg
+ syncNodeSendMsgById(&pRspMsg->destId, pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotRsp(pSyncNode, pRspMsg, "");
+ return 0;
+}
// receiver on message
//
@@ -833,7 +703,9 @@ static int32_t syncNodeOnSnapshotEnd(SSyncNode *pSyncNode, SyncSnapshotSend *pMs
//
// condition 5, got data, update ack
//
-int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
+int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) {
+ SyncSnapshotSend *pMsg = pRpcMsg->pCont;
+
// if already drop replica, do not process
if (!syncNodeInRaftGroup(pSyncNode, &(pMsg->srcId))) {
syncLogRecvSyncSnapshotSend(pSyncNode, pMsg, "not in my config");
@@ -853,6 +725,8 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
int32_t code = 0;
SSyncSnapshotReceiver *pReceiver = pSyncNode->pNewNodeReceiver;
+ syncLogRecvSyncSnapshotSend(pSyncNode, pMsg, "");
+
// state, term, seq/ack
if (pSyncNode->state == TAOS_SYNC_STATE_FOLLOWER) {
if (pMsg->term == pSyncNode->pRaftStore->currentTerm) {
@@ -863,71 +737,29 @@ int32_t syncNodeOnSnapshot(SSyncNode *pSyncNode, SyncSnapshotSend *pMsg) {
syncNodeOnSnapshotBegin(pSyncNode, pMsg);
} else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_END) {
- // condition 2
- // end, finish FSM
- code = snapshotReceiverFinish(pReceiver, pMsg);
- if (code == 0) {
- snapshotReceiverStop(pReceiver);
- }
- bool needRsp = true;
-
- // maybe update lastconfig
- if (pMsg->lastConfigIndex >= SYNC_INDEX_BEGIN) {
- SSyncCfg oldSyncCfg = pSyncNode->pRaftCfg->cfg;
-
- // update new config myIndex
- SSyncCfg newSyncCfg = pMsg->lastConfig;
- syncNodeUpdateNewConfigIndex(pSyncNode, &newSyncCfg);
-
- // do config change
- syncNodeDoConfigChange(pSyncNode, &newSyncCfg, pMsg->lastConfigIndex);
- }
+ syncNodeOnSnapshotEnd(pSyncNode, pMsg);
} else if (pMsg->seq == SYNC_SNAPSHOT_SEQ_FORCE_CLOSE) {
- // condition 3
- // force close
+ // force close, no response
snapshotReceiverForceStop(pReceiver);
- bool needRsp = false;
} else if (pMsg->seq > SYNC_SNAPSHOT_SEQ_BEGIN && pMsg->seq < SYNC_SNAPSHOT_SEQ_END) {
- // condition 4
- // transfering
- if (pMsg->seq == pReceiver->ack + 1) {
- snapshotReceiverGotData(pReceiver, pMsg);
- }
- bool needRsp = true;
+ syncNodeOnSnapshotTransfering(pSyncNode, pMsg);
} else {
// error log
- do {
- char logBuf[96];
- snprintf(logBuf, sizeof(logBuf), "snapshot receiver recv error seq:%d, my ack:%d", pMsg->seq, pReceiver->ack);
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, logBuf);
- syncNodeErrorLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sRTrace(pReceiver, "snapshot receiver recv error seq:%d, my ack:%d", pMsg->seq, pReceiver->ack);
return -1;
}
} else {
// error log
- do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver term not equal");
- syncNodeErrorLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sRTrace(pReceiver, "snapshot receiver term not equal");
return -1;
}
} else {
// error log
- do {
- char *eventLog = snapshotReceiver2SimpleStr(pReceiver, "snapshot receiver not follower");
- syncNodeErrorLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sRTrace(pReceiver, "snapshot receiver not follower");
return -1;
}
@@ -946,20 +778,35 @@ int32_t syncNodeOnSnapshotReplyPre(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg)
pSender->snapshotParam.start = pMsg->snapBeginIndex;
pSender->snapshotParam.end = snapshot.lastApplyIndex;
+ sNTrace(pSyncNode, "prepare snapshot, recv-begin:%" PRId64 ", snapshot.last:%" PRId64 ", snapshot.term:%" PRId64,
+ pMsg->snapBeginIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm);
+
if (pMsg->snapBeginIndex > snapshot.lastApplyIndex) {
- syncNodeErrorLog(pSyncNode, "snapshot last index too small");
+ sNError(pSyncNode, "snapshot last index too small");
return -1;
}
+ // update sender
+ pSender->snapshot = snapshot;
+
// start reader
int32_t code = pSyncNode->pFsm->FpSnapshotStartRead(pSyncNode->pFsm, &(pSender->snapshotParam), &(pSender->pReader));
if (code != 0) {
- syncNodeErrorLog(pSyncNode, "create snapshot reader error");
+ sNError(pSyncNode, "create snapshot reader error");
return -1;
}
+ // update next index
+ syncIndexMgrSetIndex(pSyncNode->pNextIndex, &pMsg->srcId, snapshot.lastApplyIndex + 1);
+
+ // update seq
+ pSender->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
+
// build begin msg
- SyncSnapshotSend *pSendMsg = syncSnapshotSendBuild(0, pSender->pSyncNode->vgId);
+ SRpcMsg rpcMsg = {0};
+ (void)syncBuildSnapshotSend(&rpcMsg, 0, pSender->pSyncNode->vgId);
+
+ SyncSnapshotSend *pSendMsg = rpcMsg.pCont;
pSendMsg->srcId = pSender->pSyncNode->myRaftId;
pSendMsg->destId = (pSender->pSyncNode->replicasId)[pSender->replicaIndex];
pSendMsg->term = pSender->pSyncNode->pRaftStore->currentTerm;
@@ -972,10 +819,8 @@ int32_t syncNodeOnSnapshotReplyPre(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg)
pSendMsg->seq = SYNC_SNAPSHOT_SEQ_BEGIN;
// send msg
- SRpcMsg rpcMsg;
- syncSnapshotSend2RpcMsg(pSendMsg, &rpcMsg);
- syncNodeSendMsgById(&(pSendMsg->destId), pSender->pSyncNode, &rpcMsg);
- syncSnapshotSendDestroy(pSendMsg);
+ syncNodeSendMsgById(&pSendMsg->destId, pSender->pSyncNode, &rpcMsg);
+ syncLogSendSyncSnapshotSend(pSyncNode, pSendMsg, "");
return 0;
}
@@ -986,7 +831,9 @@ int32_t syncNodeOnSnapshotReplyPre(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg)
// condition 2 sender receives ack, set seq = ack + 1, send msg from seq
// condition 3 sender receives error msg, just print error log
//
-int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg) {
+int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, const SRpcMsg *pRpcMsg) {
+ SyncSnapshotRsp *pMsg = pRpcMsg->pCont;
+
// if already drop replica, do not process
if (!syncNodeInRaftGroup(pSyncNode, &(pMsg->srcId))) {
syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "maybe replica already dropped");
@@ -1002,6 +849,8 @@ int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg) {
return -1;
}
+ syncLogRecvSyncSnapshotRsp(pSyncNode, pMsg, "");
+
// state, term, seq/ack
if (pSyncNode->state == TAOS_SYNC_STATE_LEADER) {
if (pMsg->term == pSyncNode->pRaftStore->currentTerm) {
@@ -1011,9 +860,20 @@ int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg) {
return 0;
}
+ if (pMsg->ack == SYNC_SNAPSHOT_SEQ_BEGIN) {
+ snapshotSenderUpdateProgress(pSender, pMsg);
+ snapshotSend(pSender);
+ return 0;
+ }
+
// receive ack is finish, close sender
if (pMsg->ack == SYNC_SNAPSHOT_SEQ_END) {
snapshotSenderStop(pSender, true);
+
+ // update next-index
+ syncIndexMgrSetIndex(pSyncNode->pNextIndex, &(pMsg->srcId), pMsg->lastIndex + 1);
+ syncNodeReplicateOne(pSyncNode, &(pMsg->srcId), false);
+
return 0;
}
@@ -1029,96 +889,19 @@ int32_t syncNodeOnSnapshotReply(SSyncNode *pSyncNode, SyncSnapshotRsp *pMsg) {
} else {
// error log
- do {
- char logBuf[96];
- snprintf(logBuf, sizeof(logBuf), "snapshot sender recv error ack:%d, my seq:%d", pMsg->ack, pSender->seq);
- char *eventLog = snapshotSender2SimpleStr(pSender, logBuf);
- syncNodeErrorLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sSError(pSender, "snapshot sender recv error ack:%d, my seq:%d", pMsg->ack, pSender->seq);
return -1;
}
} else {
// error log
- do {
- char *eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender term not equal");
- syncNodeErrorLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sSError(pSender, "snapshot sender term not equal");
return -1;
}
} else {
// error log
- do {
- char *eventLog = snapshotSender2SimpleStr(pSender, "snapshot sender not leader");
- syncNodeErrorLog(pSyncNode, eventLog);
- taosMemoryFree(eventLog);
- } while (0);
-
+ sSError(pSender, "snapshot sender not leader");
return -1;
}
return 0;
}
-
-int32_t syncNodeOnPreSnapshot(SSyncNode *ths, SyncPreSnapshot *pMsg) {
- syncLogRecvSyncPreSnapshot(ths, pMsg, "");
-
- SyncPreSnapshotReply *pMsgReply = syncPreSnapshotReplyBuild(ths->vgId);
- pMsgReply->srcId = ths->myRaftId;
- pMsgReply->destId = pMsg->srcId;
- pMsgReply->term = ths->pRaftStore->currentTerm;
-
- SSyncLogStoreData *pData = ths->pLogStore->data;
- SWal *pWal = pData->pWal;
-
- if (syncNodeIsMnode(ths)) {
- pMsgReply->snapStart = SYNC_INDEX_BEGIN;
-
- } else {
- bool isEmpty = ths->pLogStore->syncLogIsEmpty(ths->pLogStore);
- int64_t walCommitVer = walGetCommittedVer(pWal);
-
- if (!isEmpty && ths->commitIndex != walCommitVer) {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "commit not same, wal-commit:%" PRId64 ", commit:%" PRId64 ", ignore",
- walCommitVer, ths->commitIndex);
- syncNodeErrorLog(ths, logBuf);
-
- goto _IGNORE;
- }
-
- pMsgReply->snapStart = ths->commitIndex + 1;
-
- // make local log clean
- int32_t code = ths->pLogStore->syncLogTruncate(ths->pLogStore, pMsgReply->snapStart);
- if (code != 0) {
- syncNodeErrorLog(ths, "truncate wal error");
- goto _IGNORE;
- }
- }
-
- // can not write behind _RESPONSE
- SRpcMsg rpcMsg;
-
-_RESPONSE:
- syncPreSnapshotReply2RpcMsg(pMsgReply, &rpcMsg);
- syncNodeSendMsgById(&pMsgReply->destId, ths, &rpcMsg);
-
- syncPreSnapshotReplyDestroy(pMsgReply);
- return 0;
-
-_IGNORE:
- syncPreSnapshotReplyDestroy(pMsgReply);
- return 0;
-}
-
-int32_t syncNodeOnPreSnapshotReply(SSyncNode *ths, SyncPreSnapshotReply *pMsg) {
- syncLogRecvSyncPreSnapshotReply(ths, pMsg, "");
-
- // start snapshot
-
- return 0;
-}
\ No newline at end of file
diff --git a/source/libs/sync/src/syncTimeout.c b/source/libs/sync/src/syncTimeout.c
index 1c082170995041c8ee86642331cf4d76496022d3..151e5cdf462e8e1246b7331e9b43fa802e0e7d0a 100644
--- a/source/libs/sync/src/syncTimeout.c
+++ b/source/libs/sync/src/syncTimeout.c
@@ -13,28 +13,24 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncTimeout.h"
#include "syncElection.h"
#include "syncRaftCfg.h"
#include "syncRaftLog.h"
#include "syncReplication.h"
-#include "syncRespMgr.h"
+#include "syncUtil.h"
static void syncNodeCleanConfigIndex(SSyncNode* ths) {
int32_t newArrIndex = 0;
- SyncIndex newConfigIndexArr[MAX_CONFIG_INDEX_COUNT];
- memset(newConfigIndexArr, 0, sizeof(newConfigIndexArr));
-
+ SyncIndex newConfigIndexArr[MAX_CONFIG_INDEX_COUNT] = {0};
SSnapshot snapshot = {0};
- if (ths->pFsm != NULL && ths->pFsm->FpGetSnapshotInfo != NULL) {
- ths->pFsm->FpGetSnapshotInfo(ths->pFsm, &snapshot);
- }
+ ths->pFsm->FpGetSnapshotInfo(ths->pFsm, &snapshot);
if (snapshot.lastApplyIndex != SYNC_INDEX_INVALID) {
- for (int i = 0; i < ths->pRaftCfg->configIndexCount; ++i) {
+ for (int32_t i = 0; i < ths->pRaftCfg->configIndexCount; ++i) {
if (ths->pRaftCfg->configIndexArr[i] < snapshot.lastConfigIndex) {
// pass
- ;
} else {
// save
newConfigIndexArr[newArrIndex] = ths->pRaftCfg->configIndexArr[i];
@@ -47,19 +43,16 @@ static void syncNodeCleanConfigIndex(SSyncNode* ths) {
memcpy(ths->pRaftCfg->configIndexArr, newConfigIndexArr, sizeof(newConfigIndexArr));
int32_t code = raftCfgPersist(ths->pRaftCfg);
- ASSERT(code == 0);
-
- do {
- char logBuf[128];
- snprintf(logBuf, sizeof(logBuf), "clean config index arr, old-cnt:%d, new-cnt:%d", oldCnt,
- ths->pRaftCfg->configIndexCount);
- syncNodeEventLog(ths, logBuf);
- } while (0);
+ if (code != 0) {
+ sNFatal(ths, "failed to persist cfg");
+ } else {
+ sNTrace(ths, "clean config index arr, old-cnt:%d, new-cnt:%d", oldCnt, ths->pRaftCfg->configIndexCount);
+ }
}
}
-int32_t syncNodeTimerRoutine(SSyncNode* ths) {
- syncNodeEventLog(ths, "timer routines");
+static int32_t syncNodeTimerRoutine(SSyncNode* ths) {
+ sNTrace(ths, "timer routines");
// timer replicate
syncNodeReplicate(ths);
@@ -69,23 +62,20 @@ int32_t syncNodeTimerRoutine(SSyncNode* ths) {
syncNodeCleanConfigIndex(ths);
}
- // end timeout wal snapshot
int64_t timeNow = taosGetTimestampMs();
- if (timeNow - ths->snapshottingIndex > SYNC_DEL_WAL_MS &&
- atomic_load_64(&ths->snapshottingIndex) != SYNC_INDEX_INVALID) {
- SSyncLogStoreData* pData = ths->pLogStore->data;
- int32_t code = walEndSnapshot(pData->pWal);
- if (code != 0) {
- sError("vgId:%d, timer wal snapshot end error since:%s", ths->vgId, terrstr());
- return -1;
- } else {
- do {
- char logBuf[256];
- snprintf(logBuf, sizeof(logBuf), "wal snapshot end, index:%" PRId64, atomic_load_64(&ths->snapshottingIndex));
- syncNodeEventLog(ths, logBuf);
- } while (0);
-
- atomic_store_64(&ths->snapshottingIndex, SYNC_INDEX_INVALID);
+ if (atomic_load_64(&ths->snapshottingIndex) != SYNC_INDEX_INVALID) {
+ // end timeout wal snapshot
+ if (timeNow - ths->snapshottingTime > SYNC_DEL_WAL_MS &&
+ atomic_load_64(&ths->snapshottingIndex) != SYNC_INDEX_INVALID) {
+ SSyncLogStoreData* pData = ths->pLogStore->data;
+ int32_t code = walEndSnapshot(pData->pWal);
+ if (code != 0) {
+ sNError(ths, "timer wal snapshot end error since:%s", terrstr());
+ return -1;
+ } else {
+ sNTrace(ths, "wal snapshot end, index:%" PRId64, atomic_load_64(&ths->snapshottingIndex));
+ atomic_store_64(&ths->snapshottingIndex, SYNC_INDEX_INVALID);
+ }
}
}
@@ -98,8 +88,10 @@ int32_t syncNodeTimerRoutine(SSyncNode* ths) {
return 0;
}
-int32_t syncNodeOnTimer(SSyncNode* ths, SyncTimeout* pMsg) {
- int32_t ret = 0;
+int32_t syncNodeOnTimeout(SSyncNode* ths, const SRpcMsg* pRpc) {
+ int32_t ret = 0;
+ SyncTimeout* pMsg = pRpc->pCont;
+
syncLogRecvTimer(ths, pMsg, "");
if (pMsg->timeoutType == SYNC_TIMEOUT_PING) {
diff --git a/source/libs/sync/src/syncUtil.c b/source/libs/sync/src/syncUtil.c
index 164e050930f8837f623eec2337c64cd3c4dd4495..4fc7dd245dc198881198419e9b1f87f2d7c46266 100644
--- a/source/libs/sync/src/syncUtil.c
+++ b/source/libs/sync/src/syncUtil.c
@@ -13,124 +13,75 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncUtil.h"
-#include
+#include "syncMessage.h"
+#include "syncRaftCfg.h"
+#include "syncRaftStore.h"
+#include "syncSnapshot.h"
-#include "syncEnv.h"
+extern void addEpIntoEpSet(SEpSet* pEpSet, const char* fqdn, uint16_t port);
-void addEpIntoEpSet(SEpSet* pEpSet, const char* fqdn, uint16_t port);
-
-// ---- encode / decode
uint64_t syncUtilAddr2U64(const char* host, uint16_t port) {
- uint64_t u64;
-
uint32_t hostU32 = taosGetIpv4FromFqdn(host);
if (hostU32 == (uint32_t)-1) {
- sError("failed to resolve ipv4 addr. host:%s", host);
+ sError("failed to resolve ipv4 addr, host:%s", host);
terrno = TSDB_CODE_TSC_INVALID_FQDN;
return -1;
}
- /*
- uint32_t hostU32 = (uint32_t)taosInetAddr(host);
- if (hostU32 == (uint32_t)-1) {
- struct hostent* hostEnt = gethostbyname(host);
- if (hostEnt == NULL) {
- sError("Get IP address error");
- return -1;
- }
-
- const char* newHost = taosInetNtoa(*(struct in_addr*)(hostEnt->h_addr_list[0]));
- hostU32 = (uint32_t)taosInetAddr(newHost);
- if (hostU32 == (uint32_t)-1) {
- sError("change %s to id, error", newHost);
- }
- // ASSERT(hostU32 != (uint32_t)-1);
- }
- */
-
- u64 = (((uint64_t)hostU32) << 32) | (((uint32_t)port) << 16);
+ uint64_t u64 = (((uint64_t)hostU32) << 32) | (((uint32_t)port) << 16);
return u64;
}
-void syncUtilU642Addr(uint64_t u64, char* host, size_t len, uint16_t* port) {
+void syncUtilU642Addr(uint64_t u64, char* host, int64_t len, uint16_t* port) {
uint32_t hostU32 = (uint32_t)((u64 >> 32) & 0x00000000FFFFFFFF);
- struct in_addr addr;
- addr.s_addr = hostU32;
+ struct in_addr addr = {.s_addr = hostU32};
taosInetNtoa(addr, host, len);
*port = (uint16_t)((u64 & 0x00000000FFFF0000) >> 16);
}
-void syncUtilnodeInfo2EpSet(const SNodeInfo* pNodeInfo, SEpSet* pEpSet) {
+void syncUtilNodeInfo2EpSet(const SNodeInfo* pInfo, SEpSet* pEpSet) {
pEpSet->inUse = 0;
pEpSet->numOfEps = 0;
- addEpIntoEpSet(pEpSet, pNodeInfo->nodeFqdn, pNodeInfo->nodePort);
+ addEpIntoEpSet(pEpSet, pInfo->nodeFqdn, pInfo->nodePort);
}
-void syncUtilraftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet) {
+void syncUtilRaftId2EpSet(const SRaftId* raftId, SEpSet* pEpSet) {
char host[TSDB_FQDN_LEN] = {0};
- uint16_t port;
+ uint16_t port = 0;
syncUtilU642Addr(raftId->addr, host, sizeof(host), &port);
-
- /*
- pEpSet->numOfEps = 1;
- pEpSet->inUse = 0;
- pEpSet->eps[0].port = port;
- snprintf(pEpSet->eps[0].fqdn, sizeof(pEpSet->eps[0].fqdn), "%s", host);
- */
pEpSet->inUse = 0;
pEpSet->numOfEps = 0;
addEpIntoEpSet(pEpSet, host, port);
}
-bool syncUtilnodeInfo2raftId(const SNodeInfo* pNodeInfo, SyncGroupId vgId, SRaftId* raftId) {
- uint32_t ipv4 = taosGetIpv4FromFqdn(pNodeInfo->nodeFqdn);
+bool syncUtilNodeInfo2RaftId(const SNodeInfo* pInfo, SyncGroupId vgId, SRaftId* raftId) {
+ uint32_t ipv4 = taosGetIpv4FromFqdn(pInfo->nodeFqdn);
if (ipv4 == 0xFFFFFFFF || ipv4 == 1) {
- sError("failed to resolve ipv4 addr. fqdn: %s", pNodeInfo->nodeFqdn);
+ sError("failed to resolve ipv4 addr, fqdn: %s", pInfo->nodeFqdn);
terrno = TSDB_CODE_TSC_INVALID_FQDN;
return false;
}
+
char ipbuf[128] = {0};
tinet_ntoa(ipbuf, ipv4);
- raftId->addr = syncUtilAddr2U64(ipbuf, pNodeInfo->nodePort);
+ raftId->addr = syncUtilAddr2U64(ipbuf, pInfo->nodePort);
raftId->vgId = vgId;
return true;
}
bool syncUtilSameId(const SRaftId* pId1, const SRaftId* pId2) {
- bool ret = pId1->addr == pId2->addr && pId1->vgId == pId2->vgId;
- return ret;
+ return pId1->addr == pId2->addr && pId1->vgId == pId2->vgId;
}
bool syncUtilEmptyId(const SRaftId* pId) { return (pId->addr == 0 && pId->vgId == 0); }
-// ---- SSyncBuffer -----
-void syncUtilbufBuild(SSyncBuffer* syncBuf, size_t len) {
- syncBuf->len = len;
- syncBuf->data = taosMemoryMalloc(syncBuf->len);
-}
-
-void syncUtilbufDestroy(SSyncBuffer* syncBuf) { taosMemoryFree(syncBuf->data); }
-
-void syncUtilbufCopy(const SSyncBuffer* src, SSyncBuffer* dest) {
- dest->len = src->len;
- dest->data = src->data;
-}
-
-void syncUtilbufCopyDeep(const SSyncBuffer* src, SSyncBuffer* dest) {
- dest->len = src->len;
- dest->data = taosMemoryMalloc(dest->len);
- memcpy(dest->data, src->data, dest->len);
-}
-
-// ---- misc ----
-
-int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
+static inline int32_t syncUtilRand(int32_t max) { return taosRand() % max; }
int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
- ASSERT(min > 0 && max > 0 && max >= min);
int32_t rdm = min + syncUtilRand(max - min);
// sDebug("random min:%d, max:%d, rdm:%d", min, max, rdm);
@@ -139,18 +90,6 @@ int32_t syncUtilElectRandomMS(int32_t min, int32_t max) {
int32_t syncUtilQuorum(int32_t replicaNum) { return replicaNum / 2 + 1; }
-cJSON* syncUtilNodeInfo2Json(const SNodeInfo* p) {
- char u64buf[128] = {0};
- cJSON* pRoot = cJSON_CreateObject();
-
- cJSON_AddStringToObject(pRoot, "nodeFqdn", p->nodeFqdn);
- cJSON_AddNumberToObject(pRoot, "nodePort", p->nodePort);
-
- cJSON* pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SNodeInfo", pRoot);
- return pJson;
-}
-
cJSON* syncUtilRaftId2Json(const SRaftId* p) {
char u64buf[128] = {0};
cJSON* pRoot = cJSON_CreateObject();
@@ -169,14 +108,7 @@ cJSON* syncUtilRaftId2Json(const SRaftId* p) {
return pJson;
}
-char* syncUtilRaftId2Str(const SRaftId* p) {
- cJSON* pJson = syncUtilRaftId2Json(p);
- char* serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-bool syncUtilCanPrint(char c) {
+static inline bool syncUtilCanPrint(char c) {
if (c >= 32 && c <= 126) {
return true;
} else {
@@ -184,14 +116,14 @@ bool syncUtilCanPrint(char c) {
}
}
-char* syncUtilprintBin(char* ptr, uint32_t len) {
+char* syncUtilPrintBin(char* ptr, uint32_t len) {
int64_t memLen = (int64_t)(len + 1);
char* s = taosMemoryMalloc(memLen);
ASSERT(s != NULL);
memset(s, 0, len + 1);
memcpy(s, ptr, len);
- for (int i = 0; i < len; ++i) {
+ for (int32_t i = 0; i < len; ++i) {
if (!syncUtilCanPrint(s[i])) {
s[i] = '.';
}
@@ -199,98 +131,427 @@ char* syncUtilprintBin(char* ptr, uint32_t len) {
return s;
}
-char* syncUtilprintBin2(char* ptr, uint32_t len) {
+char* syncUtilPrintBin2(char* ptr, uint32_t len) {
uint32_t len2 = len * 4 + 1;
char* s = taosMemoryMalloc(len2);
ASSERT(s != NULL);
memset(s, 0, len2);
char* p = s;
- for (int i = 0; i < len; ++i) {
- int n = sprintf(p, "%d,", ptr[i]);
+ for (int32_t i = 0; i < len; ++i) {
+ int32_t n = sprintf(p, "%d,", ptr[i]);
p += n;
}
return s;
}
-SyncIndex syncUtilMinIndex(SyncIndex a, SyncIndex b) {
- SyncIndex r = a < b ? a : b;
- return r;
-}
-
-SyncIndex syncUtilMaxIndex(SyncIndex a, SyncIndex b) {
- SyncIndex r = a > b ? a : b;
- return r;
-}
-
void syncUtilMsgHtoN(void* msg) {
- // htonl
SMsgHead* pHead = msg;
pHead->contLen = htonl(pHead->contLen);
pHead->vgId = htonl(pHead->vgId);
}
void syncUtilMsgNtoH(void* msg) {
- // ntohl
SMsgHead* pHead = msg;
pHead->contLen = ntohl(pHead->contLen);
pHead->vgId = ntohl(pHead->vgId);
}
-#if 0
-bool syncUtilIsData(tmsg_t msgType) {
- if (msgType == TDMT_SYNC_NOOP || msgType == TDMT_SYNC_CONFIG_CHANGE) {
- return false;
+bool syncUtilUserPreCommit(tmsg_t msgType) { return msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_LEADER_TRANSFER; }
+
+bool syncUtilUserCommit(tmsg_t msgType) { return msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_LEADER_TRANSFER; }
+
+bool syncUtilUserRollback(tmsg_t msgType) { return msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_LEADER_TRANSFER; }
+
+void syncCfg2SimpleStr(const SSyncCfg* pCfg, char* buf, int32_t bufLen) {
+ int32_t len = snprintf(buf, bufLen, "{r-num:%d, my:%d, ", pCfg->replicaNum, pCfg->myIndex);
+
+ for (int32_t i = 0; i < pCfg->replicaNum; ++i) {
+ if (i < pCfg->replicaNum - 1) {
+ len += snprintf(buf + len, bufLen - len, "%s:%d, ", pCfg->nodeInfo[i].nodeFqdn, pCfg->nodeInfo[i].nodePort);
+ } else {
+ len += snprintf(buf + len, bufLen - len, "%s:%d}", pCfg->nodeInfo[i].nodeFqdn, pCfg->nodeInfo[i].nodePort);
+ }
}
- return true;
}
-#endif
-bool syncUtilUserPreCommit(tmsg_t msgType) {
- if (msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_CONFIG_CHANGE && msgType != TDMT_SYNC_CONFIG_CHANGE_FINISH &&
- msgType != TDMT_SYNC_LEADER_TRANSFER) {
- return true;
- }
+static void syncPeerState2Str(SSyncNode* pSyncNode, char* buf, int32_t bufLen) {
+ int32_t len = 1;
+
+ for (int32_t i = 0; i < pSyncNode->replicaNum; ++i) {
+ SPeerState* pState = syncNodeGetPeerState(pSyncNode, &(pSyncNode->replicasId[i]));
+ if (pState == NULL) break;
- return false;
+ if (i < pSyncNode->replicaNum - 1) {
+ len += snprintf(buf + len, bufLen - len, "%d:%" PRId64 " %" PRId64 ", ", i, pState->lastSendIndex,
+ pState->lastSendTime);
+ } else {
+ len += snprintf(buf + len, bufLen - len, "%d:%" PRId64 " %" PRId64 "}", i, pState->lastSendIndex,
+ pState->lastSendTime);
+ }
+ }
}
-bool syncUtilUserCommit(tmsg_t msgType) {
- if (msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_CONFIG_CHANGE && msgType != TDMT_SYNC_CONFIG_CHANGE_FINISH &&
- msgType != TDMT_SYNC_LEADER_TRANSFER) {
- return true;
+void syncPrintNodeLog(const char* flags, ELogLevel level, int32_t dflag, SSyncNode* pNode, const char* format, ...) {
+ if (pNode == NULL || pNode->pRaftCfg == NULL || pNode->pRaftStore == NULL || pNode->pLogStore == NULL) return;
+ int64_t currentTerm = pNode->pRaftStore->currentTerm;
+
+ // save error code, otherwise it will be overwritten
+ int32_t errCode = terrno;
+
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ if (pNode->pFsm != NULL && pNode->pFsm->FpGetSnapshotInfo != NULL) {
+ pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot);
+ }
+
+ SyncIndex logLastIndex = SYNC_INDEX_INVALID;
+ SyncIndex logBeginIndex = SYNC_INDEX_INVALID;
+ if (pNode->pLogStore != NULL) {
+ logLastIndex = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore);
+ logBeginIndex = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore);
+ }
+
+ char cfgStr[1024];
+ if (pNode->pRaftCfg != NULL) {
+ syncCfg2SimpleStr(&(pNode->pRaftCfg->cfg), cfgStr, sizeof(cfgStr));
+ } else {
+ return;
}
- return false;
+ char peerStr[1024] = "{";
+ syncPeerState2Str(pNode, peerStr, sizeof(peerStr));
+
+ int32_t quorum = syncNodeDynamicQuorum(pNode);
+
+ char eventLog[512]; // {0};
+ va_list argpointer;
+ va_start(argpointer, format);
+ int32_t writeLen = vsnprintf(eventLog, sizeof(eventLog), format, argpointer);
+ va_end(argpointer);
+
+ int32_t aqItems = pNode->pFsm->FpApplyQueueItems(pNode->pFsm);
+
+ // restore error code
+ terrno = errCode;
+
+ if (pNode != NULL && pNode->pRaftCfg != NULL) {
+ taosPrintLog(flags, level, dflag,
+ "vgId:%d, sync %s "
+ "%s"
+ ", tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64 ", snap:%" PRId64
+ ", snap-tm:%" PRIu64 ", sby:%d, aq:%d, snaping:%" PRId64 ", r-num:%d, lcfg:%" PRId64
+ ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s, %s",
+ pNode->vgId, syncStr(pNode->state), eventLog, currentTerm, pNode->commitIndex, logBeginIndex,
+ logLastIndex, pNode->minMatchIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm,
+ pNode->pRaftCfg->isStandBy, aqItems, pNode->snapshottingIndex, pNode->replicaNum,
+ pNode->pRaftCfg->lastConfigIndex, pNode->changing, pNode->restoreFinish, quorum,
+ pNode->electTimerLogicClock, pNode->heartbeatTimerLogicClockUser, peerStr, cfgStr);
+ }
}
-bool syncUtilUserRollback(tmsg_t msgType) {
- if (msgType != TDMT_SYNC_NOOP && msgType != TDMT_SYNC_CONFIG_CHANGE && msgType != TDMT_SYNC_CONFIG_CHANGE_FINISH &&
- msgType != TDMT_SYNC_LEADER_TRANSFER) {
- return true;
+void syncPrintSnapshotSenderLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotSender* pSender,
+ const char* format, ...) {
+ SSyncNode* pNode = pSender->pSyncNode;
+ if (pNode == NULL || pNode->pRaftCfg == NULL || pNode->pRaftStore == NULL || pNode->pLogStore == NULL) return;
+
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ if (pNode->pFsm != NULL && pNode->pFsm->FpGetSnapshotInfo != NULL) {
+ pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot);
+ }
+
+ SyncIndex logLastIndex = SYNC_INDEX_INVALID;
+ SyncIndex logBeginIndex = SYNC_INDEX_INVALID;
+ if (pNode->pLogStore != NULL) {
+ logLastIndex = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore);
+ logBeginIndex = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore);
}
- return false;
+ char cfgStr[1024];
+ syncCfg2SimpleStr(&(pNode->pRaftCfg->cfg), cfgStr, sizeof(cfgStr));
+
+ char peerStr[1024] = "{";
+ syncPeerState2Str(pNode, peerStr, sizeof(peerStr));
+
+ int32_t quorum = syncNodeDynamicQuorum(pNode);
+ SRaftId destId = pNode->replicasId[pSender->replicaIndex];
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(destId.addr, host, sizeof(host), &port);
+
+ char eventLog[512]; // {0};
+ va_list argpointer;
+ va_start(argpointer, format);
+ int32_t writeLen = vsnprintf(eventLog, sizeof(eventLog), format, argpointer);
+ va_end(argpointer);
+
+ taosPrintLog(flags, level, dflag,
+ "vgId:%d, sync %s "
+ "%s {%p s-param:%" PRId64 " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64 " lcindex:%" PRId64
+ " seq:%d ack:%d finish:%d replica-index:%d %s:%d}"
+ ", tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64 ", snap:%" PRId64
+ ", snap-tm:%" PRIu64 ", sby:%d, stgy:%d, bch:%d, r-num:%d, lcfg:%" PRId64
+ ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s, %s",
+ pNode->vgId, syncStr(pNode->state), eventLog, pSender, pSender->snapshotParam.start,
+ pSender->snapshotParam.end, pSender->snapshot.lastApplyIndex, pSender->snapshot.lastApplyTerm,
+ pSender->snapshot.lastConfigIndex, pSender->seq, pSender->ack, pSender->finish, pSender->replicaIndex,
+ host, port, pNode->pRaftStore->currentTerm, pNode->commitIndex, logBeginIndex, logLastIndex,
+ pNode->minMatchIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm, pNode->pRaftCfg->isStandBy,
+ pNode->pRaftCfg->snapshotStrategy, pNode->pRaftCfg->batchSize, pNode->replicaNum,
+ pNode->pRaftCfg->lastConfigIndex, pNode->changing, pNode->restoreFinish, quorum,
+ pNode->electTimerLogicClock, pNode->heartbeatTimerLogicClockUser, peerStr, cfgStr);
}
-void syncUtilJson2Line(char* jsonStr) {
- int p, q, len;
- p = 0;
- q = 1;
- len = strlen(jsonStr);
- while (1) {
- if (jsonStr[q] == '\0') {
- jsonStr[p + 1] = '\0';
- break;
- }
+void syncPrintSnapshotReceiverLog(const char* flags, ELogLevel level, int32_t dflag, SSyncSnapshotReceiver* pReceiver,
+ const char* format, ...) {
+ SSyncNode* pNode = pReceiver->pSyncNode;
+ if (pNode == NULL || pNode->pRaftCfg == NULL || pNode->pRaftStore == NULL || pNode->pLogStore == NULL) return;
- if (jsonStr[q] == '\n' || jsonStr[q] == ' ' || jsonStr[q] == '\t') {
- q++;
- continue;
- } else {
- jsonStr[p + 1] = jsonStr[q];
- p++;
- q++;
- }
+ SSnapshot snapshot = {.data = NULL, .lastApplyIndex = -1, .lastApplyTerm = 0};
+ if (pNode->pFsm != NULL && pNode->pFsm->FpGetSnapshotInfo != NULL) {
+ pNode->pFsm->FpGetSnapshotInfo(pNode->pFsm, &snapshot);
}
+
+ SyncIndex logLastIndex = SYNC_INDEX_INVALID;
+ SyncIndex logBeginIndex = SYNC_INDEX_INVALID;
+ if (pNode->pLogStore != NULL) {
+ logLastIndex = pNode->pLogStore->syncLogLastIndex(pNode->pLogStore);
+ logBeginIndex = pNode->pLogStore->syncLogBeginIndex(pNode->pLogStore);
+ }
+
+ char cfgStr[1024];
+ syncCfg2SimpleStr(&(pNode->pRaftCfg->cfg), cfgStr, sizeof(cfgStr));
+
+ char peerStr[1024] = "{";
+ syncPeerState2Str(pNode, peerStr, sizeof(peerStr));
+
+ int32_t quorum = syncNodeDynamicQuorum(pNode);
+ SRaftId fromId = pReceiver->fromId;
+ char host[128];
+ uint16_t port;
+ syncUtilU642Addr(fromId.addr, host, sizeof(host), &port);
+
+ char eventLog[512]; // {0};
+ va_list argpointer;
+ va_start(argpointer, format);
+ int32_t writeLen = vsnprintf(eventLog, sizeof(eventLog), format, argpointer);
+ va_end(argpointer);
+
+ taosPrintLog(flags, level, dflag,
+ "vgId:%d, sync %s "
+ "%s {%p start:%d ack:%d term:%" PRIu64 " start-time:%" PRId64 " from:%s:%d s-param:%" PRId64
+ " e-param:%" PRId64 " laindex:%" PRId64 " laterm:%" PRIu64 " lcindex:%" PRId64
+ "}"
+ ", tm:%" PRIu64 ", cmt:%" PRId64 ", fst:%" PRId64 ", lst:%" PRId64 ", min:%" PRId64 ", snap:%" PRId64
+ ", snap-tm:%" PRIu64 ", sby:%d, stgy:%d, bch:%d, r-num:%d, lcfg:%" PRId64
+ ", chging:%d, rsto:%d, dquorum:%d, elt:%" PRId64 ", hb:%" PRId64 ", %s, %s",
+ pNode->vgId, syncStr(pNode->state), eventLog, pReceiver, pReceiver->start, pReceiver->ack,
+ pReceiver->term, pReceiver->startTime, host, port, pReceiver->snapshotParam.start,
+ pReceiver->snapshotParam.end, pReceiver->snapshot.lastApplyIndex, pReceiver->snapshot.lastApplyTerm,
+ pReceiver->snapshot.lastConfigIndex, pNode->pRaftStore->currentTerm, pNode->commitIndex, logBeginIndex,
+ logLastIndex, pNode->minMatchIndex, snapshot.lastApplyIndex, snapshot.lastApplyTerm,
+ pNode->pRaftCfg->isStandBy, pNode->pRaftCfg->snapshotStrategy, pNode->pRaftCfg->batchSize,
+ pNode->replicaNum, pNode->pRaftCfg->lastConfigIndex, pNode->changing, pNode->restoreFinish, quorum,
+ pNode->electTimerLogicClock, pNode->heartbeatTimerLogicClockUser, peerStr, cfgStr);
+}
+
+void syncLogRecvTimer(SSyncNode* pSyncNode, const SyncTimeout* pMsg, const char* s) {
+ sNTrace(pSyncNode, "recv sync-timer {type:%s, lc:%" PRId64 ", ms:%d, data:%p}, %s",
+ syncTimerTypeStr(pMsg->timeoutType), pMsg->logicClock, pMsg->timerMS, pMsg->data, s);
+}
+
+void syncLogRecvLocalCmd(SSyncNode* pSyncNode, const SyncLocalCmd* pMsg, const char* s) {
+ sNTrace(pSyncNode, "recv sync-local-cmd {cmd:%d-%s, sd-new-term:%" PRId64 ", fc-index:%" PRId64 "}, %s", pMsg->cmd,
+ syncLocalCmdGetStr(pMsg->cmd), pMsg->sdNewTerm, pMsg->fcIndex, s);
+}
+
+void syncLogSendAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "send sync-append-entries-reply to %s:%d, {term:%" PRId64 ", pterm:%" PRId64
+ ", success:%d, lsend-index:%" PRId64 ", match:%" PRId64 "}, %s",
+ host, port, pMsg->term, pMsg->privateTerm, pMsg->success, pMsg->lastSendIndex, pMsg->matchIndex, s);
+}
+
+void syncLogRecvAppendEntriesReply(SSyncNode* pSyncNode, const SyncAppendEntriesReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "recv sync-append-entries-reply from %s:%d {term:%" PRId64 ", pterm:%" PRId64
+ ", success:%d, lsend-index:%" PRId64 ", match:%" PRId64 "}, %s",
+ host, port, pMsg->term, pMsg->privateTerm, pMsg->success, pMsg->lastSendIndex, pMsg->matchIndex, s);
+}
+
+void syncLogSendHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "send sync-heartbeat to %s:%d {term:%" PRId64 ", cmt:%" PRId64 ", min-match:%" PRId64 ", pterm:%" PRId64
+ "}, %s",
+ host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, pMsg->privateTerm, s);
+}
+
+void syncLogRecvHeartbeat(SSyncNode* pSyncNode, const SyncHeartbeat* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "recv sync-heartbeat from %s:%d {term:%" PRId64 ", cmt:%" PRId64 ", min-match:%" PRId64 ", pterm:%" PRId64
+ "}, %s",
+ host, port, pMsg->term, pMsg->commitIndex, pMsg->minMatchIndex, pMsg->privateTerm, s);
+}
+
+void syncLogSendHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode, "send sync-heartbeat-reply from %s:%d {term:%" PRId64 ", pterm:%" PRId64 "}, %s", host, port,
+ pMsg->term, pMsg->privateTerm, s);
+}
+
+void syncLogRecvHeartbeatReply(SSyncNode* pSyncNode, const SyncHeartbeatReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "recv sync-heartbeat-reply from %s:%d {term:%" PRId64 ", pterm:%" PRId64 "}, %s", host, port,
+ pMsg->term, pMsg->privateTerm, s);
+}
+
+void syncLogSendSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "send sync-pre-snapshot to %s:%d {term:%" PRId64 "}, %s", host, port, pMsg->term, s);
+}
+
+void syncLogRecvSyncPreSnapshot(SSyncNode* pSyncNode, const SyncPreSnapshot* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "recv sync-pre-snapshot from %s:%d {term:%" PRId64 "}, %s", host, port, pMsg->term, s);
+}
+
+void syncLogSendSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "send sync-pre-snapshot-reply to %s:%d {term:%" PRId64 ", snap-start:%" PRId64 "}, %s", host, port,
+ pMsg->term, pMsg->snapStart, s);
+}
+
+void syncLogRecvSyncPreSnapshotReply(SSyncNode* pSyncNode, const SyncPreSnapshotReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "recv sync-pre-snapshot-reply from %s:%d {term:%" PRId64 ", snap-start:%" PRId64 "}, %s", host,
+ port, pMsg->term, pMsg->snapStart, s);
+}
+
+void syncLogSendSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "send sync-snapshot-send from %s:%d {term:%" PRId64 ", begin:%" PRId64 ", end:%" PRId64 ", lterm:%" PRId64
+ ", stime:%" PRId64 ", seq:%d}, %s",
+ host, port, pMsg->term, pMsg->beginIndex, pMsg->lastIndex, pMsg->lastTerm, pMsg->startTime, pMsg->seq, s);
+}
+
+void syncLogRecvSyncSnapshotSend(SSyncNode* pSyncNode, const SyncSnapshotSend* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "recv sync-snapshot-send from %s:%d {term:%" PRId64 ", begin:%" PRId64 ", lst:%" PRId64 ", lterm:%" PRId64
+ ", stime:%" PRId64 ", seq:%d, len:%u}, %s",
+ host, port, pMsg->term, pMsg->beginIndex, pMsg->lastIndex, pMsg->lastTerm, pMsg->startTime, pMsg->seq,
+ pMsg->dataLen, s);
+}
+
+void syncLogSendSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "send sync-snapshot-rsp from %s:%d {term:%" PRId64 ", begin:%" PRId64 ", lst:%" PRId64 ", lterm:%" PRId64
+ ", stime:%" PRId64 ", ack:%d}, %s",
+ host, port, pMsg->term, pMsg->snapBeginIndex, pMsg->lastIndex, pMsg->lastTerm, pMsg->startTime, pMsg->ack, s);
+}
+
+void syncLogRecvSyncSnapshotRsp(SSyncNode* pSyncNode, const SyncSnapshotRsp* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "recv sync-snapshot-rsp from %s:%d {term:%" PRId64 ", begin:%" PRId64 ", lst:%" PRId64 ", lterm:%" PRId64
+ ", stime:%" PRId64 ", ack:%d}, %s",
+ host, port, pMsg->term, pMsg->snapBeginIndex, pMsg->lastIndex, pMsg->lastTerm, pMsg->startTime, pMsg->ack, s);
+}
+
+void syncLogRecvAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+
+ sNTrace(pSyncNode,
+ "recv sync-append-entries from %s:%d {term:%" PRId64 ", pre-index:%" PRId64 ", pre-term:%" PRId64
+ ", cmt:%" PRId64 ", pterm:%" PRId64 ", datalen:%d}, %s",
+ host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, pMsg->commitIndex, pMsg->privateTerm,
+ pMsg->dataLen, s);
+}
+
+void syncLogSendAppendEntries(SSyncNode* pSyncNode, const SyncAppendEntries* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode,
+ "send sync-append-entries to %s:%d, {term:%" PRId64 ", pre-index:%" PRId64 ", pre-term:%" PRId64
+ ", lsend-index:%" PRId64 ", cmt:%" PRId64 ", datalen:%d}, %s",
+ host, port, pMsg->term, pMsg->prevLogIndex, pMsg->prevLogTerm, (pMsg->prevLogIndex + 1), pMsg->commitIndex,
+ pMsg->dataLen, s);
+}
+
+void syncLogRecvRequestVote(SSyncNode* pSyncNode, const SyncRequestVote* pMsg, const char* s) {
+ char logBuf[256];
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "recv sync-request-vote from %s:%d, {term:%" PRId64 ", lindex:%" PRId64 ", lterm:%" PRId64 "}, %s",
+ host, port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, s);
+}
+
+void syncLogSendRequestVote(SSyncNode* pNode, const SyncRequestVote* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ sNTrace(pNode, "send sync-request-vote to %s:%d {term:%" PRId64 ", lindex:%" PRId64 ", lterm:%" PRId64 "}, %s", host,
+ port, pMsg->term, pMsg->lastLogIndex, pMsg->lastLogTerm, s);
+}
+
+void syncLogRecvRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->srcId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "recv sync-request-vote-reply from %s:%d {term:%" PRId64 ", grant:%d}, %s", host, port, pMsg->term,
+ pMsg->voteGranted, s);
+}
+
+void syncLogSendRequestVoteReply(SSyncNode* pSyncNode, const SyncRequestVoteReply* pMsg, const char* s) {
+ char host[64];
+ uint16_t port;
+ syncUtilU642Addr(pMsg->destId.addr, host, sizeof(host), &port);
+ sNTrace(pSyncNode, "send sync-request-vote-reply to %s:%d {term:%" PRId64 ", grant:%d}, %s", host, port, pMsg->term,
+ pMsg->voteGranted, s);
}
diff --git a/source/libs/sync/src/syncVoteMgr.c b/source/libs/sync/src/syncVoteMgr.c
index ce72935221a81731e73273d2c1496929d18b710a..8a0a35ce336bfa9d1ed1d01fb96b79a98da24edb 100644
--- a/source/libs/sync/src/syncVoteMgr.c
+++ b/source/libs/sync/src/syncVoteMgr.c
@@ -13,22 +13,22 @@
* along with this program. If not, see .
*/
+#define _DEFAULT_SOURCE
#include "syncVoteMgr.h"
+#include "syncMessage.h"
#include "syncUtil.h"
-// SVotesGranted -----------------------------
static void voteGrantedClearVotes(SVotesGranted *pVotesGranted) {
memset(pVotesGranted->isGranted, 0, sizeof(pVotesGranted->isGranted));
pVotesGranted->votes = 0;
}
SVotesGranted *voteGrantedCreate(SSyncNode *pSyncNode) {
- SVotesGranted *pVotesGranted = taosMemoryMalloc(sizeof(SVotesGranted));
+ SVotesGranted *pVotesGranted = taosMemoryCalloc(1, sizeof(SVotesGranted));
if (pVotesGranted == NULL) {
terrno = TSDB_CODE_OUT_OF_MEMORY;
return NULL;
}
- memset(pVotesGranted, 0, sizeof(SVotesGranted));
pVotesGranted->replicas = &(pSyncNode->replicasId);
pVotesGranted->replicaNum = pSyncNode->replicaNum;
@@ -59,36 +59,47 @@ void voteGrantedUpdate(SVotesGranted *pVotesGranted, SSyncNode *pSyncNode) {
pVotesGranted->pSyncNode = pSyncNode;
}
-bool voteGrantedMajority(SVotesGranted *pVotesGranted) {
- bool ret = pVotesGranted->votes >= pVotesGranted->quorum;
- return ret;
-}
+bool voteGrantedMajority(SVotesGranted *pVotesGranted) { return pVotesGranted->votes >= pVotesGranted->quorum; }
void voteGrantedVote(SVotesGranted *pVotesGranted, SyncRequestVoteReply *pMsg) {
- ASSERT(pMsg->voteGranted == true);
+ if (!pMsg->voteGranted) {
+ sNFatal(pVotesGranted->pSyncNode, "vote granted should be true");
+ return;
+ }
if (pMsg->term != pVotesGranted->term) {
- syncNodeEventLog(pVotesGranted->pSyncNode, "vote grant vnode error");
+ sNTrace(pVotesGranted->pSyncNode, "vote grant term:%" PRId64 " not matched with msg term:%" PRId64,
+ pVotesGranted->term, pMsg->term);
return;
}
- ASSERT(syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId));
+ if (!syncUtilSameId(&pVotesGranted->pSyncNode->myRaftId, &pMsg->destId)) {
+ sNFatal(pVotesGranted->pSyncNode, "vote granted raftId not matched with msg");
+ return;
+ }
- int j = -1;
- for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
+ int32_t j = -1;
+ for (int32_t i = 0; i < pVotesGranted->replicaNum; ++i) {
if (syncUtilSameId(&((*(pVotesGranted->replicas))[i]), &(pMsg->srcId))) {
j = i;
break;
}
}
- ASSERT(j != -1);
- ASSERT(j >= 0 && j < pVotesGranted->replicaNum);
+ if ((j == -1) || !(j >= 0 && j < pVotesGranted->replicaNum)) {
+ sNFatal(pVotesGranted->pSyncNode, "invalid msg srcId, index:%d", j);
+ return;
+ }
if (pVotesGranted->isGranted[j] != true) {
++(pVotesGranted->votes);
pVotesGranted->isGranted[j] = true;
}
- ASSERT(pVotesGranted->votes <= pVotesGranted->replicaNum);
+
+ if (pVotesGranted->votes > pVotesGranted->replicaNum) {
+ sNFatal(pVotesGranted->pSyncNode, "votes:%d not matched with replicaNum:%d", pVotesGranted->votes,
+ pVotesGranted->replicaNum);
+ return;
+ }
}
void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
@@ -97,81 +108,12 @@ void voteGrantedReset(SVotesGranted *pVotesGranted, SyncTerm term) {
pVotesGranted->toLeader = false;
}
-cJSON *voteGranted2Json(SVotesGranted *pVotesGranted) {
- char u64buf[128] = {0};
- cJSON *pRoot = cJSON_CreateObject();
-
- if (pVotesGranted != NULL) {
- cJSON_AddNumberToObject(pRoot, "replicaNum", pVotesGranted->replicaNum);
- cJSON *pReplicas = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "replicas", pReplicas);
- for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
- cJSON_AddItemToArray(pReplicas, syncUtilRaftId2Json(&(*(pVotesGranted->replicas))[i]));
- }
- int *arr = (int *)taosMemoryMalloc(sizeof(int) * pVotesGranted->replicaNum);
- for (int i = 0; i < pVotesGranted->replicaNum; ++i) {
- arr[i] = pVotesGranted->isGranted[i];
- }
- cJSON *pIsGranted = cJSON_CreateIntArray(arr, pVotesGranted->replicaNum);
- taosMemoryFree(arr);
- cJSON_AddItemToObject(pRoot, "isGranted", pIsGranted);
-
- cJSON_AddNumberToObject(pRoot, "votes", pVotesGranted->votes);
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pVotesGranted->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- cJSON_AddNumberToObject(pRoot, "quorum", pVotesGranted->quorum);
- cJSON_AddNumberToObject(pRoot, "toLeader", pVotesGranted->toLeader);
- snprintf(u64buf, sizeof(u64buf), "%p", pVotesGranted->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
-
- bool majority = voteGrantedMajority(pVotesGranted);
- cJSON_AddNumberToObject(pRoot, "majority", majority);
- }
-
- cJSON *pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SVotesGranted", pRoot);
- return pJson;
-}
-
-char *voteGranted2Str(SVotesGranted *pVotesGranted) {
- cJSON *pJson = voteGranted2Json(pVotesGranted);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug -------------------
-void voteGrantedPrint(SVotesGranted *pObj) {
- char *serialized = voteGranted2Str(pObj);
- printf("voteGrantedPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void voteGrantedPrint2(char *s, SVotesGranted *pObj) {
- char *serialized = voteGranted2Str(pObj);
- printf("voteGrantedPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void voteGrantedLog(SVotesGranted *pObj) {
- char *serialized = voteGranted2Str(pObj);
- sTrace("voteGrantedLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void voteGrantedLog2(char *s, SVotesGranted *pObj) {
- char *serialized = voteGranted2Str(pObj);
- sTrace("voteGrantedLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
-}
-
-// SVotesRespond -----------------------------
SVotesRespond *votesRespondCreate(SSyncNode *pSyncNode) {
- SVotesRespond *pVotesRespond = taosMemoryMalloc(sizeof(SVotesRespond));
- ASSERT(pVotesRespond != NULL);
- memset(pVotesRespond, 0, sizeof(SVotesRespond));
+ SVotesRespond *pVotesRespond = taosMemoryCalloc(1, sizeof(SVotesRespond));
+ if (pVotesRespond == NULL) {
+ terrno = TSDB_CODE_OUT_OF_MEMORY;
+ return NULL;
+ }
pVotesRespond->replicas = &(pSyncNode->replicasId);
pVotesRespond->replicaNum = pSyncNode->replicaNum;
@@ -196,7 +138,7 @@ void votesRespondUpdate(SVotesRespond *pVotesRespond, SSyncNode *pSyncNode) {
bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId) {
bool ret = false;
- for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
+ for (int32_t i = 0; i < pVotesRespond->replicaNum; ++i) {
if (syncUtilSameId(&(*pVotesRespond->replicas)[i], pRaftId) && pVotesRespond->isRespond[i]) {
ret = true;
break;
@@ -207,95 +149,21 @@ bool votesResponded(SVotesRespond *pVotesRespond, const SRaftId *pRaftId) {
void votesRespondAdd(SVotesRespond *pVotesRespond, const SyncRequestVoteReply *pMsg) {
if (pVotesRespond->term != pMsg->term) {
- syncNodeEventLog(pVotesRespond->pSyncNode, "vote respond add error");
+ sNTrace(pVotesRespond->pSyncNode, "vote respond add error");
return;
}
- for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
+ for (int32_t i = 0; i < pVotesRespond->replicaNum; ++i) {
if (syncUtilSameId(&((*(pVotesRespond->replicas))[i]), &pMsg->srcId)) {
- // ASSERT(pVotesRespond->isRespond[i] == false);
pVotesRespond->isRespond[i] = true;
return;
}
}
- ASSERT(0);
+
+ sNFatal(pVotesRespond->pSyncNode, "votes respond not found");
}
void votesRespondReset(SVotesRespond *pVotesRespond, SyncTerm term) {
pVotesRespond->term = term;
memset(pVotesRespond->isRespond, 0, sizeof(pVotesRespond->isRespond));
- /*
- for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
- pVotesRespond->isRespond[i] = false;
- }
- */
-}
-
-cJSON *votesRespond2Json(SVotesRespond *pVotesRespond) {
- char u64buf[128] = {0};
- cJSON *pRoot = cJSON_CreateObject();
-
- if (pVotesRespond != NULL) {
- cJSON_AddNumberToObject(pRoot, "replicaNum", pVotesRespond->replicaNum);
- cJSON *pReplicas = cJSON_CreateArray();
- cJSON_AddItemToObject(pRoot, "replicas", pReplicas);
- for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
- cJSON_AddItemToArray(pReplicas, syncUtilRaftId2Json(&(*(pVotesRespond->replicas))[i]));
- }
- int respondNum = 0;
- int *arr = (int *)taosMemoryMalloc(sizeof(int) * pVotesRespond->replicaNum);
- for (int i = 0; i < pVotesRespond->replicaNum; ++i) {
- arr[i] = pVotesRespond->isRespond[i];
- if (pVotesRespond->isRespond[i]) {
- respondNum++;
- }
- }
- cJSON *pIsRespond = cJSON_CreateIntArray(arr, pVotesRespond->replicaNum);
- taosMemoryFree(arr);
- cJSON_AddItemToObject(pRoot, "isRespond", pIsRespond);
- cJSON_AddNumberToObject(pRoot, "respondNum", respondNum);
-
- snprintf(u64buf, sizeof(u64buf), "%" PRIu64, pVotesRespond->term);
- cJSON_AddStringToObject(pRoot, "term", u64buf);
- snprintf(u64buf, sizeof(u64buf), "%p", pVotesRespond->pSyncNode);
- cJSON_AddStringToObject(pRoot, "pSyncNode", u64buf);
- }
-
- cJSON *pJson = cJSON_CreateObject();
- cJSON_AddItemToObject(pJson, "SVotesRespond", pRoot);
- return pJson;
-}
-
-char *votesRespond2Str(SVotesRespond *pVotesRespond) {
- cJSON *pJson = votesRespond2Json(pVotesRespond);
- char *serialized = cJSON_Print(pJson);
- cJSON_Delete(pJson);
- return serialized;
-}
-
-// for debug -------------------
-void votesRespondPrint(SVotesRespond *pObj) {
- char *serialized = votesRespond2Str(pObj);
- printf("votesRespondPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void votesRespondPrint2(char *s, SVotesRespond *pObj) {
- char *serialized = votesRespond2Str(pObj);
- printf("votesRespondPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
- fflush(NULL);
- taosMemoryFree(serialized);
-}
-
-void votesRespondLog(SVotesRespond *pObj) {
- char *serialized = votesRespond2Str(pObj);
- sTrace("votesRespondLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
- taosMemoryFree(serialized);
-}
-
-void votesRespondLog2(char *s, SVotesRespond *pObj) {
- char *serialized = votesRespond2Str(pObj);
- sTrace("votesRespondLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
- taosMemoryFree(serialized);
}
diff --git a/source/libs/sync/test/CMakeLists.txt b/source/libs/sync/test/CMakeLists.txt
index 1b7ec7f0df319b8df2ef974b375cd4d42605118b..7a22d96972eca3c6f73908cae302b2806df5eed1 100644
--- a/source/libs/sync/test/CMakeLists.txt
+++ b/source/libs/sync/test/CMakeLists.txt
@@ -1,3 +1,4 @@
+add_subdirectory(sync_test_lib)
add_executable(syncTest "")
add_executable(syncRaftIdCheck "")
add_executable(syncEnvTest "")
@@ -24,8 +25,6 @@ add_executable(syncRequestVoteReplyTest "")
add_executable(syncAppendEntriesTest "")
add_executable(syncAppendEntriesBatchTest "")
add_executable(syncAppendEntriesReplyTest "")
-add_executable(syncClientRequestTest "")
-add_executable(syncClientRequestBatchTest "")
add_executable(syncTimeoutTest "")
add_executable(syncPingTest "")
add_executable(syncPingReplyTest "")
@@ -54,7 +53,6 @@ add_executable(syncRaftLogTest "")
add_executable(syncRaftLogTest2 "")
add_executable(syncRaftLogTest3 "")
add_executable(syncLeaderTransferTest "")
-add_executable(syncReconfigFinishTest "")
add_executable(syncRestoreFromSnapshot "")
add_executable(syncRaftCfgIndexTest "")
add_executable(syncHeartbeatTest "")
@@ -168,14 +166,6 @@ target_sources(syncAppendEntriesReplyTest
PRIVATE
"syncAppendEntriesReplyTest.cpp"
)
-target_sources(syncClientRequestTest
- PRIVATE
- "syncClientRequestTest.cpp"
-)
-target_sources(syncClientRequestBatchTest
- PRIVATE
- "syncClientRequestBatchTest.cpp"
-)
target_sources(syncTimeoutTest
PRIVATE
"syncTimeoutTest.cpp"
@@ -288,10 +278,6 @@ target_sources(syncLeaderTransferTest
PRIVATE
"syncLeaderTransferTest.cpp"
)
-target_sources(syncReconfigFinishTest
- PRIVATE
- "syncReconfigFinishTest.cpp"
-)
target_sources(syncRestoreFromSnapshot
PRIVATE
"syncRestoreFromSnapshot.cpp"
@@ -452,16 +438,6 @@ target_include_directories(syncAppendEntriesReplyTest
"${TD_SOURCE_DIR}/include/libs/sync"
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
)
-target_include_directories(syncClientRequestTest
- PUBLIC
- "${TD_SOURCE_DIR}/include/libs/sync"
- "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
-)
-target_include_directories(syncClientRequestBatchTest
- PUBLIC
- "${TD_SOURCE_DIR}/include/libs/sync"
- "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
-)
target_include_directories(syncTimeoutTest
PUBLIC
"${TD_SOURCE_DIR}/include/libs/sync"
@@ -602,11 +578,6 @@ target_include_directories(syncLeaderTransferTest
"${TD_SOURCE_DIR}/include/libs/sync"
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
)
-target_include_directories(syncReconfigFinishTest
- PUBLIC
- "${TD_SOURCE_DIR}/include/libs/sync"
- "${CMAKE_CURRENT_SOURCE_DIR}/../inc"
-)
target_include_directories(syncRestoreFromSnapshot
PUBLIC
"${TD_SOURCE_DIR}/include/libs/sync"
@@ -645,259 +616,247 @@ target_include_directories(syncPreSnapshotReplyTest
target_link_libraries(syncTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftIdCheck
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncEnvTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPingTimerTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIOTickQTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIOTickPingTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIOSendMsgTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIOClientTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIOServerTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftStoreTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncEnqTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIndexTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncInitTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncUtilTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncVotesGrantedTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncVotesRespondTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncIndexMgrTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncLogStoreTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncEntryTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncEntryCacheTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncHashCacheTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRequestVoteTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRequestVoteReplyTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncAppendEntriesTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncAppendEntriesBatchTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncAppendEntriesReplyTest
- sync
- gtest_main
-)
-target_link_libraries(syncClientRequestTest
- sync
- gtest_main
-)
-target_link_libraries(syncClientRequestBatchTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncTimeoutTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPingTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPingReplyTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRpcMsgTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPingTimerTest2
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPingSelfTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncElectTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncEncodeTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncWriteTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncReplicateTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRefTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncLogStoreCheck
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncLogStoreCheck2
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftCfgTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRespMgrTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncSnapshotTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncApplyMsgTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncConfigChangeTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncConfigChangeSnapshotTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncSnapshotSendTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncSnapshotRspTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncSnapshotSenderTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncSnapshotReceiverTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncTestTool
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftLogTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftLogTest2
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftLogTest3
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncLeaderTransferTest
- sync
- gtest_main
-)
-target_link_libraries(syncReconfigFinishTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRestoreFromSnapshot
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncRaftCfgIndexTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncHeartbeatTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncHeartbeatReplyTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncLocalCmdTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPreSnapshotTest
- sync
+ sync_test_lib
gtest_main
)
target_link_libraries(syncPreSnapshotReplyTest
- sync
+ sync_test_lib
gtest_main
)
diff --git a/source/libs/sync/test/syncAppendEntriesBatchTest.cpp b/source/libs/sync/test/syncAppendEntriesBatchTest.cpp
index f2544d8fec7afcf707207e792376488986834380..964d991bb00833dfee97aa19d8153d310d78468d 100644
--- a/source/libs/sync/test/syncAppendEntriesBatchTest.cpp
+++ b/source/libs/sync/test/syncAppendEntriesBatchTest.cpp
@@ -1,11 +1,5 @@
-//#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncRaftEntry.h"
-#include "syncUtil.h"
-#include "trpc.h"
+#include "syncTest.h"
+#include "syncBatch.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncAppendEntriesReplyTest.cpp b/source/libs/sync/test/syncAppendEntriesReplyTest.cpp
index a5e96233c24bf7746bec6330958a2cfe12621f70..1eb803e846133035ddc78122acab6cb82195c18d 100644
--- a/source/libs/sync/test/syncAppendEntriesReplyTest.cpp
+++ b/source/libs/sync/test/syncAppendEntriesReplyTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncAppendEntriesTest.cpp b/source/libs/sync/test/syncAppendEntriesTest.cpp
index 256c13e26749b432f627d90f814661566fbf9d21..7b9e04a8149976baece884a352c21428744f702d 100644
--- a/source/libs/sync/test/syncAppendEntriesTest.cpp
+++ b/source/libs/sync/test/syncAppendEntriesTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncApplyMsgTest.cpp b/source/libs/sync/test/syncApplyMsgTest.cpp
index 9d5e7dd8e1de635ea5cbc64352eb25bafa40d99d..a8a1931d1d8775272757cb3668ffe4e6be9a876a 100644
--- a/source/libs/sync/test/syncApplyMsgTest.cpp
+++ b/source/libs/sync/test/syncApplyMsgTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -81,7 +77,7 @@ void test4() {
void test5() {
SyncApplyMsg *pMsg = createMsg();
- SRpcMsg rpcMsg;
+ SRpcMsg rpcMsg = {0};
syncApplyMsg2RpcMsg(pMsg, &rpcMsg);
SyncApplyMsg *pMsg2 = syncApplyMsgFromRpcMsg2(&rpcMsg);
syncApplyMsgLog2((char *)"test5: syncClientRequest2RpcMsg -> syncApplyMsgFromRpcMsg2 ", pMsg2);
diff --git a/source/libs/sync/test/syncClientRequestBatchTest.cpp b/source/libs/sync/test/syncClientRequestBatchTest.cpp
deleted file mode 100644
index 5586b7a6ce55c8f4f6aa6aebbd5c295e6562e1d4..0000000000000000000000000000000000000000
--- a/source/libs/sync/test/syncClientRequestBatchTest.cpp
+++ /dev/null
@@ -1,125 +0,0 @@
-#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
-
-void logTest() {
- sTrace("--- sync log test: trace");
- sDebug("--- sync log test: debug");
- sInfo("--- sync log test: info");
- sWarn("--- sync log test: warn");
- sError("--- sync log test: error");
- sFatal("--- sync log test: fatal");
-}
-
-SRpcMsg *createRpcMsg(int32_t i, int32_t dataLen) {
- SyncPing *pSyncMsg = syncPingBuild(20);
- snprintf(pSyncMsg->data, pSyncMsg->dataLen, "value_%d", i);
-
- SRpcMsg *pRpcMsg = (SRpcMsg *)taosMemoryMalloc(sizeof(SRpcMsg));
- memset(pRpcMsg, 0, sizeof(SRpcMsg));
- pRpcMsg->code = 10 * i;
- syncPing2RpcMsg(pSyncMsg, pRpcMsg);
-
- syncPingDestroy(pSyncMsg);
- return pRpcMsg;
-}
-
-SyncClientRequestBatch *createMsg() {
- SRpcMsg *rpcMsgPArr[5];
- memset(rpcMsgPArr, 0, sizeof(rpcMsgPArr));
- for (int32_t i = 0; i < 5; ++i) {
- SRpcMsg *pRpcMsg = createRpcMsg(i, 20);
- rpcMsgPArr[i] = pRpcMsg;
- // taosMemoryFree(pRpcMsg);
- }
-
- SRaftMeta raftArr[5];
- memset(raftArr, 0, sizeof(raftArr));
- for (int32_t i = 0; i < 5; ++i) {
- raftArr[i].seqNum = i * 10;
- raftArr[i].isWeak = i % 2;
- }
-
- SyncClientRequestBatch *pMsg = syncClientRequestBatchBuild(rpcMsgPArr, raftArr, 5, 1234);
- return pMsg;
-}
-
-void test1() {
- SyncClientRequestBatch *pMsg = createMsg();
- syncClientRequestBatchLog2((char *)"==test1==", pMsg);
- syncClientRequestBatchDestroyDeep(pMsg);
-}
-
-/*
-void test2() {
- SyncClientRequest *pMsg = createMsg();
- uint32_t len = pMsg->bytes;
- char * serialized = (char *)taosMemoryMalloc(len);
- syncClientRequestSerialize(pMsg, serialized, len);
- SyncClientRequest *pMsg2 = syncClientRequestBuild(pMsg->dataLen);
- syncClientRequestDeserialize(serialized, len, pMsg2);
- syncClientRequestLog2((char *)"test2: syncClientRequestSerialize -> syncClientRequestDeserialize ", pMsg2);
-
- taosMemoryFree(serialized);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-void test3() {
- SyncClientRequest *pMsg = createMsg();
- uint32_t len;
- char * serialized = syncClientRequestSerialize2(pMsg, &len);
- SyncClientRequest *pMsg2 = syncClientRequestDeserialize2(serialized, len);
- syncClientRequestLog2((char *)"test3: syncClientRequestSerialize3 -> syncClientRequestDeserialize2 ", pMsg2);
-
- taosMemoryFree(serialized);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-void test4() {
- SyncClientRequest *pMsg = createMsg();
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pMsg, &rpcMsg);
- SyncClientRequest *pMsg2 = (SyncClientRequest *)taosMemoryMalloc(rpcMsg.contLen);
- syncClientRequestFromRpcMsg(&rpcMsg, pMsg2);
- syncClientRequestLog2((char *)"test4: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg ", pMsg2);
-
- rpcFreeCont(rpcMsg.pCont);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-void test5() {
- SyncClientRequest *pMsg = createMsg();
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pMsg, &rpcMsg);
- SyncClientRequest *pMsg2 = syncClientRequestFromRpcMsg2(&rpcMsg);
- syncClientRequestLog2((char *)"test5: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg2 ", pMsg2);
-
- rpcFreeCont(rpcMsg.pCont);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-*/
-
-int main() {
- gRaftDetailLog = true;
- tsAsyncLog = 0;
- sDebugFlag = DEBUG_DEBUG + DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE;
- logTest();
-
- test1();
-
- /*
-test2();
-test3();
-test4();
-test5();
-*/
-
- return 0;
-}
diff --git a/source/libs/sync/test/syncClientRequestTest.cpp b/source/libs/sync/test/syncClientRequestTest.cpp
deleted file mode 100644
index 56e53cc1c93bbb5d024797c47936d10bf8fa8a3b..0000000000000000000000000000000000000000
--- a/source/libs/sync/test/syncClientRequestTest.cpp
+++ /dev/null
@@ -1,98 +0,0 @@
-#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
-
-void logTest() {
- sTrace("--- sync log test: trace");
- sDebug("--- sync log test: debug");
- sInfo("--- sync log test: info");
- sWarn("--- sync log test: warn");
- sError("--- sync log test: error");
- sFatal("--- sync log test: fatal");
-}
-
-SyncClientRequest *createMsg() {
- SRpcMsg rpcMsg;
- memset(&rpcMsg, 0, sizeof(rpcMsg));
- rpcMsg.msgType = 12345;
- rpcMsg.contLen = 20;
- rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
- strcpy((char *)rpcMsg.pCont, "hello rpc");
- SyncClientRequest *pMsg = syncClientRequestBuild2(&rpcMsg, 123, true, 1000);
- rpcFreeCont(rpcMsg.pCont);
- return pMsg;
-}
-
-void test1() {
- SyncClientRequest *pMsg = createMsg();
- syncClientRequestLog2((char *)"test1:", pMsg);
- syncClientRequestDestroy(pMsg);
-}
-
-void test2() {
- SyncClientRequest *pMsg = createMsg();
- uint32_t len = pMsg->bytes;
- char *serialized = (char *)taosMemoryMalloc(len);
- syncClientRequestSerialize(pMsg, serialized, len);
- SyncClientRequest *pMsg2 = syncClientRequestBuild(pMsg->dataLen);
- syncClientRequestDeserialize(serialized, len, pMsg2);
- syncClientRequestLog2((char *)"test2: syncClientRequestSerialize -> syncClientRequestDeserialize ", pMsg2);
-
- taosMemoryFree(serialized);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-void test3() {
- SyncClientRequest *pMsg = createMsg();
- uint32_t len;
- char *serialized = syncClientRequestSerialize2(pMsg, &len);
- SyncClientRequest *pMsg2 = syncClientRequestDeserialize2(serialized, len);
- syncClientRequestLog2((char *)"test3: syncClientRequestSerialize3 -> syncClientRequestDeserialize2 ", pMsg2);
-
- taosMemoryFree(serialized);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-void test4() {
- SyncClientRequest *pMsg = createMsg();
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pMsg, &rpcMsg);
- SyncClientRequest *pMsg2 = (SyncClientRequest *)taosMemoryMalloc(rpcMsg.contLen);
- syncClientRequestFromRpcMsg(&rpcMsg, pMsg2);
- syncClientRequestLog2((char *)"test4: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg ", pMsg2);
-
- rpcFreeCont(rpcMsg.pCont);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-void test5() {
- SyncClientRequest *pMsg = createMsg();
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pMsg, &rpcMsg);
- SyncClientRequest *pMsg2 = syncClientRequestFromRpcMsg2(&rpcMsg);
- syncClientRequestLog2((char *)"test5: syncClientRequest2RpcMsg -> syncClientRequestFromRpcMsg2 ", pMsg2);
-
- rpcFreeCont(rpcMsg.pCont);
- syncClientRequestDestroy(pMsg);
- syncClientRequestDestroy(pMsg2);
-}
-
-int main() {
- tsAsyncLog = 0;
- sDebugFlag = DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE;
- logTest();
-
- test1();
- test2();
- test3();
- test4();
- test5();
-
- return 0;
-}
diff --git a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp
index dcf7249d30abd5c012715ddb7f7f464988108128..057f2ea6dd7f38241fcc0759113e65e513d020d3 100644
--- a/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp
+++ b/source/libs/sync/test/syncConfigChangeSnapshotTest.cpp
@@ -1,11 +1,5 @@
#include
-#include
-#include "os.h"
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -149,7 +143,8 @@ int32_t SnapshotDoWrite(struct SSyncFSM* pFsm, void* pWriter, void* pBuf, int32_
void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); }
void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) {
- sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64,
+ sTrace("==callback== ==ReConfigCb== flag:%" PRIx64 ", index:%" PRId64 ", code:%d, currentTerm:%" PRIu64
+ ", term:%" PRIu64,
cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term);
}
@@ -228,18 +223,18 @@ int64_t createSyncNode(int32_t replicaNum, int32_t myIndex, int32_t vgId, SWal*
SSyncNode* pSyncNode = (SSyncNode*)syncNodeAcquire(rid);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
-
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
-
- gSyncIO->FpOnSyncSnapshot = pSyncNode->FpOnSnapshot;
- gSyncIO->FpOnSyncSnapshotReply = pSyncNode->FpOnSnapshotReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+
+ // gSyncIO->FpOnSyncSnapshot = pSyncNode->FpOnSnapshot;
+ // gSyncIO->FpOnSyncSnapshotReply = pSyncNode->FpOnSnapshotReply;
gSyncIO->pSyncNode = pSyncNode;
syncNodeRelease(pSyncNode);
diff --git a/source/libs/sync/test/syncConfigChangeTest.cpp b/source/libs/sync/test/syncConfigChangeTest.cpp
index c5548d25d45c2974016ff1622429db8b62f086fe..bab3d2236f3a33cd40bf356cb60227a6731ef022 100644
--- a/source/libs/sync/test/syncConfigChangeTest.cpp
+++ b/source/libs/sync/test/syncConfigChangeTest.cpp
@@ -1,11 +1,5 @@
#include
-#include
-#include "os.h"
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -79,7 +73,8 @@ int32_t GetSnapshotCb(const struct SSyncFSM* pFsm, SSnapshot* pSnapshot) {
void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFinishCb=="); }
void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) {
- sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64,
+ sTrace("==callback== ==ReConfigCb== flag:%" PRIx64 ", index:%" PRId64 ", code:%d, currentTerm:%" PRIu64
+ ", term:%" PRIu64,
cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term);
}
@@ -151,16 +146,16 @@ int64_t createSyncNode(int32_t replicaNum, int32_t myIndex, int32_t vgId, SWal*
SSyncNode* pSyncNode = (SSyncNode*)syncNodeAcquire(rid);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
gSyncIO->pSyncNode = pSyncNode;
syncNodeRelease(pSyncNode);
diff --git a/source/libs/sync/test/syncElectTest.cpp b/source/libs/sync/test/syncElectTest.cpp
index c290368c7f296ca3990a12f41af75310452ea773..58c0e7d13a021a01eead75079596c98e889ca46e 100644
--- a/source/libs/sync/test/syncElectTest.cpp
+++ b/source/libs/sync/test/syncElectTest.cpp
@@ -1,10 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -64,15 +59,15 @@ SSyncNode* createSyncNode(int32_t replicaNum, int32_t myIndex, int32_t vgId, SWa
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
syncNodeStart(pSyncNode);
@@ -107,7 +102,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = createSyncNode(replicaNum, myIndex, gVgId, pWal, (char*)gDir);
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"==syncElectTest==", pSyncNode);
+ sNTrace(pSyncNode, "==syncElectTest==");
//---------------------------
while (1) {
diff --git a/source/libs/sync/test/syncEncodeTest.cpp b/source/libs/sync/test/syncEncodeTest.cpp
index 35dc7e439839ac93c7ae8f4df1abd60b24f27802..528cc1614dcce5bcae7122419cf173a1b87ecaec 100644
--- a/source/libs/sync/test/syncEncodeTest.cpp
+++ b/source/libs/sync/test/syncEncodeTest.cpp
@@ -1,15 +1,7 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncRaftEntry.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
+#if 0
void logTest() {
sTrace("--- sync log test: trace");
sDebug("--- sync log test: debug");
@@ -102,12 +94,12 @@ SRpcMsg *step0() {
}
SyncClientRequest *step1(const SRpcMsg *pMsg) {
- SyncClientRequest *pRetMsg = syncClientRequestBuild2(pMsg, 123, true, 1000);
+ SyncClientRequest *pRetMsg = syncClientRequestBuild(pMsg, 123, true, 1000);
return pRetMsg;
}
SRpcMsg *step2(const SyncClientRequest *pMsg) {
- SRpcMsg *pRetMsg = (SRpcMsg *)taosMemoryMalloc(sizeof(SRpcMsg));
+ SRpcMsg *pRetMsg = (SRpcMsg *)taosMemoryCalloc(sizeof(SRpcMsg), 1);
syncClientRequest2RpcMsg(pMsg, pRetMsg);
return pRetMsg;
}
@@ -118,17 +110,7 @@ SyncClientRequest *step3(const SRpcMsg *pMsg) {
}
SSyncRaftEntry *step4(const SyncClientRequest *pMsg) {
- SSyncRaftEntry *pRetMsg = syncEntryBuild2((SyncClientRequest *)pMsg, 100, 0);
- return pRetMsg;
-}
-
-char *step5(const SSyncRaftEntry *pMsg, uint32_t *len) {
- char *pRetMsg = syncEntrySerialize(pMsg, len);
- return pRetMsg;
-}
-
-SSyncRaftEntry *step6(const char *pMsg, uint32_t len) {
- SSyncRaftEntry *pRetMsg = syncEntryDeserialize(pMsg, len);
+ SSyncRaftEntry *pRetMsg = syncEntryBuildFromClientRequest((SyncClientRequest *)pMsg, 100, 0);
return pRetMsg;
}
@@ -137,13 +119,14 @@ SRpcMsg *step7(const SSyncRaftEntry *pMsg) {
syncEntry2OriginalRpc(pMsg, pRetMsg);
return pRetMsg;
}
-
+#endif
int main(int argc, char **argv) {
// taosInitLog((char *)"syncTest.log", 100000, 10);
tsAsyncLog = 0;
sDebugFlag = 143 + 64;
void logTest();
+#if 0
myIndex = 0;
if (argc >= 2) {
myIndex = atoi(argv[1]);
@@ -188,20 +171,9 @@ int main(int argc, char **argv) {
syncEntryLog2((char *)"==pEntry==", pEntry);
- // step5
- uint32_t len;
- char *pMsg5 = step5(pMsg4, &len);
- char *s = syncUtilprintBin(pMsg5, len);
- printf("==step5== [%s] \n", s);
- taosMemoryFree(s);
-
- // step6
- SSyncRaftEntry *pMsg6 = step6(pMsg5, len);
- syncEntryLog2((char *)"==step6==", pMsg6);
-
// step7
SRpcMsg *pMsg7 = step7(pMsg6);
syncRpcMsgLog2((char *)"==step7==", pMsg7);
-
+#endif
return 0;
}
diff --git a/source/libs/sync/test/syncEnqTest.cpp b/source/libs/sync/test/syncEnqTest.cpp
index d43789c91e4faa38bb01902b37364a654af58b9b..d2ae46a4433ebb5f3b4bac88f1136f2ee275b513 100644
--- a/source/libs/sync/test/syncEnqTest.cpp
+++ b/source/libs/sync/test/syncEnqTest.cpp
@@ -1,10 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -43,15 +38,15 @@ SSyncNode* syncNodeInit() {
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
@@ -87,7 +82,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = syncInitTest();
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"syncInitTest", pSyncNode);
+ sNTrace(pSyncNode, "syncInitTest");
initRaftId(pSyncNode);
diff --git a/source/libs/sync/test/syncEntryCacheTest.cpp b/source/libs/sync/test/syncEntryCacheTest.cpp
index 3ee28ce96b00e0722402af586bdad30269af8e31..b86422b0b17c6e476ed1ef0b3199a6d3538d350a 100644
--- a/source/libs/sync/test/syncEntryCacheTest.cpp
+++ b/source/libs/sync/test/syncEntryCacheTest.cpp
@@ -1,12 +1,4 @@
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "tref.h"
-#include "tskiplist.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncEntryTest.cpp b/source/libs/sync/test/syncEntryTest.cpp
index 53ae91fc60a1876b81402031a76866f861f0cdeb..369306b85722ced1333277c2aba9c3d733cfaa3c 100644
--- a/source/libs/sync/test/syncEntryTest.cpp
+++ b/source/libs/sync/test/syncEntryTest.cpp
@@ -1,11 +1,4 @@
-#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -32,30 +25,30 @@ void test1() {
}
void test2() {
- SyncClientRequest* pSyncMsg = syncClientRequestBuild(10);
+ SyncClientRequest* pSyncMsg = syncClientRequestAlloc(10);
pSyncMsg->originalRpcType = 33;
pSyncMsg->seqNum = 11;
pSyncMsg->isWeak = 1;
strcpy(pSyncMsg->data, "test2");
- SSyncRaftEntry* pEntry = syncEntryBuild2(pSyncMsg, 100, 200);
+ SSyncRaftEntry* pEntry = syncEntryBuildFromClientRequest(pSyncMsg, 100, 200);
syncEntryPrint(pEntry);
- syncClientRequestDestroy(pSyncMsg);
+ taosMemoryFree(pSyncMsg);
syncEntryDestory(pEntry);
}
void test3() {
- SyncClientRequest* pSyncMsg = syncClientRequestBuild(10);
+ SyncClientRequest* pSyncMsg = syncClientRequestAlloc(10);
pSyncMsg->originalRpcType = 33;
pSyncMsg->seqNum = 11;
pSyncMsg->isWeak = 1;
strcpy(pSyncMsg->data, "test3");
- SSyncRaftEntry* pEntry = syncEntryBuild3(pSyncMsg, 100, 200);
+ SSyncRaftEntry* pEntry = syncEntryBuildFromClientRequest(pSyncMsg, 100, 200);
syncEntryPrint(pEntry);
- syncClientRequestDestroy(pSyncMsg);
+ taosMemoryFree(pSyncMsg);
syncEntryDestory(pEntry);
}
@@ -71,14 +64,7 @@ void test4() {
strcpy(pEntry->data, "test4");
syncEntryPrint(pEntry);
- uint32_t len;
- char* serialized = syncEntrySerialize(pEntry, &len);
- assert(serialized != NULL);
- SSyncRaftEntry* pEntry2 = syncEntryDeserialize(serialized, len);
- syncEntryPrint(pEntry2);
-
- taosMemoryFree(serialized);
- syncEntryDestory(pEntry2);
+ // syncEntryDestory(pEntry2);
syncEntryDestory(pEntry);
}
diff --git a/source/libs/sync/test/syncEnvTest.cpp b/source/libs/sync/test/syncEnvTest.cpp
index a220c2aed4bf0c3cb815f5ee8a646d94f3999d07..3cd6048428be7e5010bcbe60695838f51ef81def 100644
--- a/source/libs/sync/test/syncEnvTest.cpp
+++ b/source/libs/sync/test/syncEnvTest.cpp
@@ -1,9 +1,4 @@
-#include "syncEnv.h"
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "ttime.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncHashCacheTest.cpp b/source/libs/sync/test/syncHashCacheTest.cpp
index 7d822971da61462a7f9f65321bb2e72103fa3c27..14a29c9a1e68ebee865509d92a138c92f8f79f28 100644
--- a/source/libs/sync/test/syncHashCacheTest.cpp
+++ b/source/libs/sync/test/syncHashCacheTest.cpp
@@ -1,11 +1,4 @@
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "tskiplist.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncHeartbeatReplyTest.cpp b/source/libs/sync/test/syncHeartbeatReplyTest.cpp
index 1fac03652b9f0835074ef738f5d38fce720f8aad..6f7f4d18f34f25aeaf857070dcbca6f39cc0fc16 100644
--- a/source/libs/sync/test/syncHeartbeatReplyTest.cpp
+++ b/source/libs/sync/test/syncHeartbeatReplyTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncHeartbeatTest.cpp b/source/libs/sync/test/syncHeartbeatTest.cpp
index b0c055435599279b08b9aeec6b26f28ca279d0be..c8c38c0c388f46fe6d69548555cbbc21d3b0f7fc 100644
--- a/source/libs/sync/test/syncHeartbeatTest.cpp
+++ b/source/libs/sync/test/syncHeartbeatTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncIOClientTest.cpp b/source/libs/sync/test/syncIOClientTest.cpp
index bd0221114ad618fb030ee5ec476a0a01634bcdd7..f66a854657c8c5c363188206579996108b439a05 100644
--- a/source/libs/sync/test/syncIOClientTest.cpp
+++ b/source/libs/sync/test/syncIOClientTest.cpp
@@ -1,10 +1,4 @@
-#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
-#include "tdatablock.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncIOSendMsgTest.cpp b/source/libs/sync/test/syncIOSendMsgTest.cpp
index 055f86913048ca61b9973785bdebcf1621411c97..ae74929b7ba5fdd6979a981943cec867d9f671d0 100644
--- a/source/libs/sync/test/syncIOSendMsgTest.cpp
+++ b/source/libs/sync/test/syncIOSendMsgTest.cpp
@@ -1,10 +1,4 @@
-#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -44,15 +38,15 @@ SSyncNode* syncNodeInit() {
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
@@ -88,7 +82,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = syncInitTest();
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"syncInitTest", pSyncNode);
+ sNTrace(pSyncNode, "syncInitTest");
initRaftId(pSyncNode);
@@ -101,7 +95,7 @@ int main(int argc, char** argv) {
syncPingReply2RpcMsg(pSyncMsg, &rpcMsg);
SEpSet epSet;
- syncUtilnodeInfo2EpSet(&pSyncNode->myNodeInfo, &epSet);
+ syncUtilNodeInfo2EpSet(&pSyncNode->myNodeInfo, &epSet);
rpcMsg.info.noResp = 1;
pSyncNode->syncSendMSg(&epSet, &rpcMsg);
diff --git a/source/libs/sync/test/syncIOServerTest.cpp b/source/libs/sync/test/syncIOServerTest.cpp
index 1d7402e461f26ea8c7f00508af7352c6c76ac9c8..add7d6df60b945f1dffc59cc422b890c28628930 100644
--- a/source/libs/sync/test/syncIOServerTest.cpp
+++ b/source/libs/sync/test/syncIOServerTest.cpp
@@ -1,8 +1,4 @@
-#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncIOTickPingTest.cpp b/source/libs/sync/test/syncIOTickPingTest.cpp
index 9c2342828edb6e3671566ba6651e942bb6b510a5..71274f5ca3f18ba259a277ebd19a6395cde61414 100644
--- a/source/libs/sync/test/syncIOTickPingTest.cpp
+++ b/source/libs/sync/test/syncIOTickPingTest.cpp
@@ -1,8 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncIOTickQTest.cpp b/source/libs/sync/test/syncIOTickQTest.cpp
index 64b65f25c8e00971de1e8f824d0d8d3cf5365030..9ef8a7ad40715201c59d940a82d8ac2a824d1f06 100644
--- a/source/libs/sync/test/syncIOTickQTest.cpp
+++ b/source/libs/sync/test/syncIOTickQTest.cpp
@@ -1,8 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncIndexMgrTest.cpp b/source/libs/sync/test/syncIndexMgrTest.cpp
index 23b8693a0b65f5922c8fa59379d1ad96bbf8dcfe..f84119045fee2e1c2691d8bf924e694527e81d69 100644
--- a/source/libs/sync/test/syncIndexMgrTest.cpp
+++ b/source/libs/sync/test/syncIndexMgrTest.cpp
@@ -1,12 +1,4 @@
-#include "syncIndexMgr.h"
-//#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "syncVoteMgr.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncIndexTest.cpp b/source/libs/sync/test/syncIndexTest.cpp
index 763117c0c9cf04d97bffd89b010a87984042fc51..a44d9c4e31d890ab41db5ad16fe38c003d4e314a 100644
--- a/source/libs/sync/test/syncIndexTest.cpp
+++ b/source/libs/sync/test/syncIndexTest.cpp
@@ -1,8 +1,4 @@
-#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
+#include "syncTest.h"
void print(SHashObj *pNextIndex) {
printf("----------------\n");
diff --git a/source/libs/sync/test/syncInitTest.cpp b/source/libs/sync/test/syncInitTest.cpp
index 43331274055893c7cbcb3e3f4e9272dc3ab7f8a8..1e0ff545149bd82816c18cdcdbdbe254bdb5dd82 100644
--- a/source/libs/sync/test/syncInitTest.cpp
+++ b/source/libs/sync/test/syncInitTest.cpp
@@ -1,10 +1,4 @@
-#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -44,14 +38,14 @@ SSyncNode* syncNodeInit() {
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
@@ -87,7 +81,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = syncInitTest();
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"syncInitTest", pSyncNode);
+ sNTrace(pSyncNode, "syncInitTest");
initRaftId(pSyncNode);
syncNodeClose(pSyncNode);
diff --git a/source/libs/sync/test/syncLeaderTransferTest.cpp b/source/libs/sync/test/syncLeaderTransferTest.cpp
index 62a9106c159123545f412d7040619af64c5a7ef2..fd8cdfaac05108f4dd4e3817baebf40f7c25b777 100644
--- a/source/libs/sync/test/syncLeaderTransferTest.cpp
+++ b/source/libs/sync/test/syncLeaderTransferTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -27,6 +23,35 @@ SyncLeaderTransfer *createMsg() {
return pMsg;
}
+// for debug ----------------------
+void syncLeaderTransferPrint(const SyncLeaderTransfer *pMsg) {
+ char *serialized = syncLeaderTransfer2Str(pMsg);
+ printf("syncLeaderTransferPrint | len:%d | %s \n", (int32_t)strlen(serialized), serialized);
+ fflush(NULL);
+ taosMemoryFree(serialized);
+}
+
+void syncLeaderTransferPrint2(char *s, const SyncLeaderTransfer *pMsg) {
+ char *serialized = syncLeaderTransfer2Str(pMsg);
+ printf("syncLeaderTransferPrint2 | len:%d | %s | %s \n", (int32_t)strlen(serialized), s, serialized);
+ fflush(NULL);
+ taosMemoryFree(serialized);
+}
+
+void syncLeaderTransferLog(const SyncLeaderTransfer *pMsg) {
+ char *serialized = syncLeaderTransfer2Str(pMsg);
+ sTrace("syncLeaderTransferLog | len:%d | %s", (int32_t)strlen(serialized), serialized);
+ taosMemoryFree(serialized);
+}
+
+void syncLeaderTransferLog2(char *s, const SyncLeaderTransfer *pMsg) {
+ if (gRaftDetailLog) {
+ char *serialized = syncLeaderTransfer2Str(pMsg);
+ sTrace("syncLeaderTransferLog2 | len:%d | %s | %s", (int32_t)strlen(serialized), s, serialized);
+ taosMemoryFree(serialized);
+ }
+}
+
void test1() {
SyncLeaderTransfer *pMsg = createMsg();
syncLeaderTransferLog2((char *)"test1:", pMsg);
diff --git a/source/libs/sync/test/syncLocalCmdTest.cpp b/source/libs/sync/test/syncLocalCmdTest.cpp
index b42626df29cfdf01b70a512c573daaf922d40f4a..fa0d91d45fd4562c015eb81a65d86ac9ffa39a90 100644
--- a/source/libs/sync/test/syncLocalCmdTest.cpp
+++ b/source/libs/sync/test/syncLocalCmdTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncLogStoreCheck.cpp b/source/libs/sync/test/syncLogStoreCheck.cpp
index 431b291ca797847a00556f5aeb6d231f48061dc6..e02c48472981541acebca1243797dc63f96ea203 100644
--- a/source/libs/sync/test/syncLogStoreCheck.cpp
+++ b/source/libs/sync/test/syncLogStoreCheck.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncLogStoreCheck2.cpp b/source/libs/sync/test/syncLogStoreCheck2.cpp
index 80679bc85c4067fef291dcc583b727f1f3e909c3..fce0a21a475c2ee4f5ba3b47fbf2025907154054 100644
--- a/source/libs/sync/test/syncLogStoreCheck2.cpp
+++ b/source/libs/sync/test/syncLogStoreCheck2.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncLogStoreTest.cpp b/source/libs/sync/test/syncLogStoreTest.cpp
index 9ff0ed208957efc55ad66733d5a1543f44ef795e..1b898803efd7216884134b065a6f9be40496ff37 100644
--- a/source/libs/sync/test/syncLogStoreTest.cpp
+++ b/source/libs/sync/test/syncLogStoreTest.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncPingReplyTest.cpp b/source/libs/sync/test/syncPingReplyTest.cpp
index e5158a7932f63cf50399727e03e6f49274d5d0ad..661509e9a2bfeca399f6bfb2d1af87c59ded09b7 100644
--- a/source/libs/sync/test/syncPingReplyTest.cpp
+++ b/source/libs/sync/test/syncPingReplyTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncPingSelfTest.cpp b/source/libs/sync/test/syncPingSelfTest.cpp
index 7d8ed73ac7ac6c3deb6f5b34251b8d2ec6c109e0..975565770a813e7c1fdba923c3a449a3d6d5b695 100644
--- a/source/libs/sync/test/syncPingSelfTest.cpp
+++ b/source/libs/sync/test/syncPingSelfTest.cpp
@@ -1,10 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -44,14 +39,14 @@ SSyncNode* syncNodeInit() {
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
@@ -86,7 +81,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = syncInitTest();
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"", pSyncNode);
+ sNTrace(pSyncNode, "");
initRaftId(pSyncNode);
diff --git a/source/libs/sync/test/syncPingTest.cpp b/source/libs/sync/test/syncPingTest.cpp
index 1777b9b9e2c494b25fd8b5af99f9335d82d09b5d..54cc506b038b0ee8ead08e718f96bd40d8c7dae7 100644
--- a/source/libs/sync/test/syncPingTest.cpp
+++ b/source/libs/sync/test/syncPingTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncPingTimerTest.cpp b/source/libs/sync/test/syncPingTimerTest.cpp
index c074103f3835f37570b05494a9312935af117514..8aa4e9dada40a8546e3be99d86750cc2125c1efb 100644
--- a/source/libs/sync/test/syncPingTimerTest.cpp
+++ b/source/libs/sync/test/syncPingTimerTest.cpp
@@ -1,10 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -44,14 +39,14 @@ SSyncNode* syncNodeInit() {
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
@@ -86,7 +81,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = syncInitTest();
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"----1", pSyncNode);
+ sNTrace(pSyncNode, "----1");
initRaftId(pSyncNode);
@@ -95,7 +90,7 @@ int main(int argc, char** argv) {
sTrace("syncNodeStartPingTimer ...");
ret = syncNodeStartPingTimer(pSyncNode);
assert(ret == 0);
- syncNodeLog2((char*)"----2", pSyncNode);
+ sNTrace(pSyncNode, "----2");
sTrace("sleep ...");
taosMsleep(10000);
@@ -103,7 +98,7 @@ int main(int argc, char** argv) {
sTrace("syncNodeStopPingTimer ...");
ret = syncNodeStopPingTimer(pSyncNode);
assert(ret == 0);
- syncNodeLog2((char*)"----3", pSyncNode);
+ sNTrace(pSyncNode, "----3");
sTrace("sleep ...");
taosMsleep(5000);
@@ -111,7 +106,7 @@ int main(int argc, char** argv) {
sTrace("syncNodeStartPingTimer ...");
ret = syncNodeStartPingTimer(pSyncNode);
assert(ret == 0);
- syncNodeLog2((char*)"----4", pSyncNode);
+ sNTrace(pSyncNode, "----4");
sTrace("sleep ...");
taosMsleep(10000);
@@ -119,7 +114,7 @@ int main(int argc, char** argv) {
sTrace("syncNodeStopPingTimer ...");
ret = syncNodeStopPingTimer(pSyncNode);
assert(ret == 0);
- syncNodeLog2((char*)"----5", pSyncNode);
+ sNTrace(pSyncNode, "----5");
while (1) {
sTrace("while 1 sleep ...");
diff --git a/source/libs/sync/test/syncPingTimerTest2.cpp b/source/libs/sync/test/syncPingTimerTest2.cpp
index 2683f484876c0fab314f8f27bad76ee458daf3ee..e77358f37533de2c98c81afab9163774e4743233 100644
--- a/source/libs/sync/test/syncPingTimerTest2.cpp
+++ b/source/libs/sync/test/syncPingTimerTest2.cpp
@@ -1,10 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -44,14 +39,14 @@ SSyncNode* syncNodeInit() {
SSyncNode* pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
@@ -86,7 +81,7 @@ int main(int argc, char** argv) {
SSyncNode* pSyncNode = syncInitTest();
assert(pSyncNode != NULL);
- syncNodeLog2((char*)"", pSyncNode);
+ sNTrace(pSyncNode, "");
initRaftId(pSyncNode);
diff --git a/source/libs/sync/test/syncPreSnapshotReplyTest.cpp b/source/libs/sync/test/syncPreSnapshotReplyTest.cpp
index a30dcc2c545640a7bfe181727465a922107713a5..e5175f11013e7b5826517ce7e0b5b06d361fa79f 100644
--- a/source/libs/sync/test/syncPreSnapshotReplyTest.cpp
+++ b/source/libs/sync/test/syncPreSnapshotReplyTest.cpp
@@ -1,10 +1,6 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncPreSnapshotTest.cpp b/source/libs/sync/test/syncPreSnapshotTest.cpp
index 03894dfa84f246de85c934556e00370ca2d20549..2ce95abea3983ab628efbebabf1441296353d21c 100644
--- a/source/libs/sync/test/syncPreSnapshotTest.cpp
+++ b/source/libs/sync/test/syncPreSnapshotTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRaftCfgIndexTest.cpp b/source/libs/sync/test/syncRaftCfgIndexTest.cpp
index bd8ffc45b6bcaf5780aa6f7a5331316cc37224fe..e6d3f23b58e471609b6127c497a34176731fb182 100644
--- a/source/libs/sync/test/syncRaftCfgIndexTest.cpp
+++ b/source/libs/sync/test/syncRaftCfgIndexTest.cpp
@@ -1,10 +1,5 @@
#include "syncRaftStore.h"
-//#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -60,7 +55,6 @@ void test1() {
ASSERT(code == 0);
SRaftCfgIndex* pRaftCfgIndex = raftCfgIndexOpen(pFile);
- raftCfgIndexLog2((char*)"==test1==", pRaftCfgIndex);
raftCfgIndexClose(pRaftCfgIndex);
}
@@ -71,15 +65,11 @@ void test2() {
raftCfgIndexAddConfigIndex(pRaftCfgIndex, i);
}
raftCfgIndexPersist(pRaftCfgIndex);
-
- raftCfgIndexLog2((char*)"==test2==", pRaftCfgIndex);
raftCfgIndexClose(pRaftCfgIndex);
}
void test3() {
SRaftCfgIndex* pRaftCfgIndex = raftCfgIndexOpen(pFile);
-
- raftCfgIndexLog2((char*)"==test3==", pRaftCfgIndex);
raftCfgIndexClose(pRaftCfgIndex);
}
diff --git a/source/libs/sync/test/syncRaftCfgTest.cpp b/source/libs/sync/test/syncRaftCfgTest.cpp
index 2823a7826b8908e907261d2e830e3230a8373ed7..c841a68fde081a0c5fc666dc33752dd62c2e321d 100644
--- a/source/libs/sync/test/syncRaftCfgTest.cpp
+++ b/source/libs/sync/test/syncRaftCfgTest.cpp
@@ -1,10 +1,4 @@
-#include "syncRaftStore.h"
-//#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -53,14 +47,6 @@ SSyncCfg* createSyncCfg() {
return pCfg;
}
-void test1() {
- SSyncCfg* pCfg = createSyncCfg();
- syncCfgLog2((char*)__FUNCTION__, pCfg);
- syncCfgLog3((char*)__FUNCTION__, pCfg);
-
- taosMemoryFree(pCfg);
-}
-
void test2() {
SSyncCfg* pCfg = createSyncCfg();
char* s = syncCfg2Str(pCfg);
@@ -68,7 +54,6 @@ void test2() {
SSyncCfg* pCfg2 = (SSyncCfg*)taosMemoryMalloc(sizeof(SSyncCfg));
int32_t ret = syncCfgFromStr(s, pCfg2);
assert(ret == 0);
- syncCfgLog2((char*)__FUNCTION__, pCfg2);
taosMemoryFree(pCfg);
taosMemoryFree(s);
@@ -98,8 +83,6 @@ void test4() {
SRaftCfg* pCfg = raftCfgOpen("./test3_raft_cfg.json");
assert(pCfg != NULL);
- raftCfgLog2((char*)__FUNCTION__, pCfg);
-
int32_t ret = raftCfgClose(pCfg);
assert(ret == 0);
}
@@ -135,7 +118,6 @@ int main() {
sDebugFlag = DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE;
logTest();
- test1();
test2();
test3();
test4();
diff --git a/source/libs/sync/test/syncRaftIdCheck.cpp b/source/libs/sync/test/syncRaftIdCheck.cpp
index e7ef69da20f0d7c3a02a26bff076f133ef0e4a09..08716c876b914bc3a3950e58ea04a37f57036aaf 100644
--- a/source/libs/sync/test/syncRaftIdCheck.cpp
+++ b/source/libs/sync/test/syncRaftIdCheck.cpp
@@ -1,8 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void usage(char* exe) {
printf("Usage: %s host port \n", exe);
diff --git a/source/libs/sync/test/syncRaftLogTest.cpp b/source/libs/sync/test/syncRaftLogTest.cpp
index 278113919af962d705ef50cd4799bcb246768a02..e309a2e432b6c292cda358913961f8b08a93cbcc 100644
--- a/source/libs/sync/test/syncRaftLogTest.cpp
+++ b/source/libs/sync/test/syncRaftLogTest.cpp
@@ -1,12 +1,5 @@
#include "syncRaftLog.h"
-//#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRaftLogTest2.cpp b/source/libs/sync/test/syncRaftLogTest2.cpp
index 78c08a6d8d9f0d832773f0f065dfffcbbf281825..a7752dcb8b264e33f75be092605237033559b15c 100644
--- a/source/libs/sync/test/syncRaftLogTest2.cpp
+++ b/source/libs/sync/test/syncRaftLogTest2.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRaftLogTest3.cpp b/source/libs/sync/test/syncRaftLogTest3.cpp
index cf862feb2a9011b233eae6dc1bcbd2d7a3af4992..31c06625aa8eaa443a214b19bcac17463e63bda8 100644
--- a/source/libs/sync/test/syncRaftLogTest3.cpp
+++ b/source/libs/sync/test/syncRaftLogTest3.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRaftStoreTest.cpp b/source/libs/sync/test/syncRaftStoreTest.cpp
index 070f8c0f0751e2da8a8bd3ae43f36e3e880d1dc9..87798a7d808db32f176901468cf8c7dc3a6dd044 100644
--- a/source/libs/sync/test/syncRaftStoreTest.cpp
+++ b/source/libs/sync/test/syncRaftStoreTest.cpp
@@ -1,9 +1,5 @@
#include "syncRaftStore.h"
-//#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncReconfigFinishTest.cpp b/source/libs/sync/test/syncReconfigFinishTest.cpp
deleted file mode 100644
index 5b283c5829464891e6a2529a1b038bd2a1501c48..0000000000000000000000000000000000000000
--- a/source/libs/sync/test/syncReconfigFinishTest.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
-
-void logTest() {
- sTrace("--- sync log test: trace");
- sDebug("--- sync log test: debug");
- sInfo("--- sync log test: info");
- sWarn("--- sync log test: warn");
- sError("--- sync log test: error");
- sFatal("--- sync log test: fatal");
-}
-
-SSyncCfg *createSyncOldCfg() {
- SSyncCfg *pCfg = (SSyncCfg *)taosMemoryMalloc(sizeof(SSyncCfg));
- memset(pCfg, 0, sizeof(SSyncCfg));
-
- pCfg->replicaNum = 3;
- pCfg->myIndex = 1;
- for (int i = 0; i < pCfg->replicaNum; ++i) {
- ((pCfg->nodeInfo)[i]).nodePort = i * 100;
- snprintf(((pCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pCfg->nodeInfo)[i]).nodeFqdn), "100.200.300.%d", i);
- }
-
- return pCfg;
-}
-
-SSyncCfg *createSyncNewCfg() {
- SSyncCfg *pCfg = (SSyncCfg *)taosMemoryMalloc(sizeof(SSyncCfg));
- memset(pCfg, 0, sizeof(SSyncCfg));
-
- pCfg->replicaNum = 3;
- pCfg->myIndex = 1;
- for (int i = 0; i < pCfg->replicaNum; ++i) {
- ((pCfg->nodeInfo)[i]).nodePort = i * 100;
- snprintf(((pCfg->nodeInfo)[i]).nodeFqdn, sizeof(((pCfg->nodeInfo)[i]).nodeFqdn), "500.600.700.%d", i);
- }
-
- return pCfg;
-}
-
-SyncReconfigFinish *createMsg() {
- SyncReconfigFinish *pMsg = syncReconfigFinishBuild(1234);
-
- SSyncCfg *pOld = createSyncOldCfg();
- SSyncCfg *pNew = createSyncNewCfg();
- pMsg->oldCfg = *pOld;
- pMsg->newCfg = *pNew;
-
- pMsg->newCfgIndex = 11;
- pMsg->newCfgTerm = 22;
- pMsg->newCfgSeqNum = 33;
-
- taosMemoryFree(pOld);
- taosMemoryFree(pNew);
-
- return pMsg;
-}
-
-void test1() {
- SyncReconfigFinish *pMsg = createMsg();
- syncReconfigFinishLog2((char *)"test1:", pMsg);
- syncReconfigFinishDestroy(pMsg);
-}
-
-void test2() {
- SyncReconfigFinish *pMsg = createMsg();
- uint32_t len = pMsg->bytes;
- char *serialized = (char *)taosMemoryMalloc(len);
- syncReconfigFinishSerialize(pMsg, serialized, len);
- SyncReconfigFinish *pMsg2 = syncReconfigFinishBuild(1000);
- syncReconfigFinishDeserialize(serialized, len, pMsg2);
- syncReconfigFinishLog2((char *)"test2: syncReconfigFinishSerialize -> syncReconfigFinishDeserialize ", pMsg2);
-
- taosMemoryFree(serialized);
- syncReconfigFinishDestroy(pMsg);
- syncReconfigFinishDestroy(pMsg2);
-}
-
-void test3() {
- SyncReconfigFinish *pMsg = createMsg();
- uint32_t len;
- char *serialized = syncReconfigFinishSerialize2(pMsg, &len);
- SyncReconfigFinish *pMsg2 = syncReconfigFinishDeserialize2(serialized, len);
- syncReconfigFinishLog2((char *)"test3: SyncReconfigFinishSerialize2 -> syncReconfigFinishDeserialize2 ", pMsg2);
-
- taosMemoryFree(serialized);
- syncReconfigFinishDestroy(pMsg);
- syncReconfigFinishDestroy(pMsg2);
-}
-
-void test4() {
- SyncReconfigFinish *pMsg = createMsg();
- SRpcMsg rpcMsg;
- syncReconfigFinish2RpcMsg(pMsg, &rpcMsg);
- SyncReconfigFinish *pMsg2 = (SyncReconfigFinish *)taosMemoryMalloc(rpcMsg.contLen);
- syncReconfigFinishFromRpcMsg(&rpcMsg, pMsg2);
- syncReconfigFinishLog2((char *)"test4: syncReconfigFinish2RpcMsg -> syncReconfigFinishFromRpcMsg ", pMsg2);
-
- rpcFreeCont(rpcMsg.pCont);
- syncReconfigFinishDestroy(pMsg);
- syncReconfigFinishDestroy(pMsg2);
-}
-
-void test5() {
- SyncReconfigFinish *pMsg = createMsg();
- SRpcMsg rpcMsg;
- syncReconfigFinish2RpcMsg(pMsg, &rpcMsg);
- SyncReconfigFinish *pMsg2 = syncReconfigFinishFromRpcMsg2(&rpcMsg);
- syncReconfigFinishLog2((char *)"test5: syncReconfigFinish2RpcMsg -> syncReconfigFinishFromRpcMsg2 ", pMsg2);
-
- rpcFreeCont(rpcMsg.pCont);
- syncReconfigFinishDestroy(pMsg);
- syncReconfigFinishDestroy(pMsg2);
-}
-
-int main() {
- gRaftDetailLog = true;
- tsAsyncLog = 0;
- sDebugFlag = DEBUG_TRACE + DEBUG_SCREEN + DEBUG_FILE;
- logTest();
-
- test1();
- test2();
- test3();
- test4();
- test5();
-
- return 0;
-}
diff --git a/source/libs/sync/test/syncRefTest.cpp b/source/libs/sync/test/syncRefTest.cpp
index c5132018a22f525bd74b934a6ea0906120d90172..47bc290abe3cc0c56ecf4562056c77390916b795 100644
--- a/source/libs/sync/test/syncRefTest.cpp
+++ b/source/libs/sync/test/syncRefTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "tref.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncReplicateTest.cpp b/source/libs/sync/test/syncReplicateTest.cpp
index 7506ae19bdf1a6f43e354a3d7e4eff792d2bb00f..4a82bba15d959f545a333d84a4af8ed7b62e0225 100644
--- a/source/libs/sync/test/syncReplicateTest.cpp
+++ b/source/libs/sync/test/syncReplicateTest.cpp
@@ -1,10 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -125,16 +120,16 @@ int64_t createSyncNode(int32_t replicaNum, int32_t myIndex, int32_t vgId, SWal*
SSyncNode* pSyncNode = (SSyncNode*)syncNodeAcquire(rid);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
gSyncIO->pSyncNode = pSyncNode;
syncNodeRelease(pSyncNode);
diff --git a/source/libs/sync/test/syncRequestVoteReplyTest.cpp b/source/libs/sync/test/syncRequestVoteReplyTest.cpp
index 3d9db17725adfa76333e1368bbae27774384f85c..973ccf040ca69db5055ef15e1247583e9d52e4b8 100644
--- a/source/libs/sync/test/syncRequestVoteReplyTest.cpp
+++ b/source/libs/sync/test/syncRequestVoteReplyTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRequestVoteTest.cpp b/source/libs/sync/test/syncRequestVoteTest.cpp
index 94e1504add73294cc445b59b1a7158bb38af39b1..275f7804bfb2906523b0ded3192d0e693ff6969a 100644
--- a/source/libs/sync/test/syncRequestVoteTest.cpp
+++ b/source/libs/sync/test/syncRequestVoteTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRespMgrTest.cpp b/source/libs/sync/test/syncRespMgrTest.cpp
index cad6eec91d204e74d0b0534f6cc9de13df3f0dca..b609ef1a0e7a9e35e46c7fb95b12620d37e0c207 100644
--- a/source/libs/sync/test/syncRespMgrTest.cpp
+++ b/source/libs/sync/test/syncRespMgrTest.cpp
@@ -1,8 +1,4 @@
-#include "syncRespMgr.h"
-//#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -64,10 +60,10 @@ void syncRespMgrGetTest(uint64_t i) {
void syncRespMgrGetAndDelTest(uint64_t i) {
printf("------syncRespMgrGetAndDelTest-------%" PRIu64 "-- \n", i);
- SRespStub stub;
+ SRpcHandleInfo stub;
int32_t ret = syncRespMgrGetAndDel(pMgr, i, &stub);
if (ret == 1) {
- printStub(&stub);
+ //printStub(&stub);
} else if (ret == 0) {
printf("%" PRId64 " notFound \n", i);
}
diff --git a/source/libs/sync/test/syncRestoreFromSnapshot.cpp b/source/libs/sync/test/syncRestoreFromSnapshot.cpp
index 470dd678b09bfd5ff03d9eff3bbe76c1524c06ab..44444a7f5e950a0bb045259dbfb2954a51f5ea0e 100644
--- a/source/libs/sync/test/syncRestoreFromSnapshot.cpp
+++ b/source/libs/sync/test/syncRestoreFromSnapshot.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncRpcMsgTest.cpp b/source/libs/sync/test/syncRpcMsgTest.cpp
index 0b21f4108061ac97fb79dc4dfc79ae40d47ede7a..5fb622d791266048c502204cd6927da5a14c4328 100644
--- a/source/libs/sync/test/syncRpcMsgTest.cpp
+++ b/source/libs/sync/test/syncRpcMsgTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -47,7 +43,11 @@ SyncClientRequest *createSyncClientRequest() {
rpcMsg.contLen = 20;
rpcMsg.pCont = rpcMallocCont(rpcMsg.contLen);
strcpy((char *)rpcMsg.pCont, "hello rpc");
- SyncClientRequest *pMsg = syncClientRequestBuild2(&rpcMsg, 123, true, 1000);
+
+ SRpcMsg clientRequestMsg;
+ syncBuildClientRequest(&clientRequestMsg, &rpcMsg, 123, true, 1000);
+ SyncClientRequest *pMsg = (SyncClientRequest *)taosMemoryMalloc(clientRequestMsg.contLen);
+ memcpy(pMsg->data, clientRequestMsg.pCont, clientRequestMsg.contLen);
return pMsg;
}
@@ -155,11 +155,13 @@ void test7() {
}
void test8() {
+#if 0
SyncClientRequest *pMsg = createSyncClientRequest();
- SRpcMsg rpcMsg;
+ SRpcMsg rpcMsg = {0};
syncClientRequest2RpcMsg(pMsg, &rpcMsg);
syncRpcMsgLog2((char *)"test8", &rpcMsg);
- syncClientRequestDestroy(pMsg);
+ taosMemoryFree(pMsg);
+#endif
}
int main() {
diff --git a/source/libs/sync/test/syncSnapshotReceiverTest.cpp b/source/libs/sync/test/syncSnapshotReceiverTest.cpp
index 6eb854874073c14e04ac86fc9640eba105d6058c..49b06a7d1bfca855d661e1c332f951b8c0b7f657 100644
--- a/source/libs/sync/test/syncSnapshotReceiverTest.cpp
+++ b/source/libs/sync/test/syncSnapshotReceiverTest.cpp
@@ -1,11 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncRaftStore.h"
-#include "syncSnapshot.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncSnapshotRspTest.cpp b/source/libs/sync/test/syncSnapshotRspTest.cpp
index 63905c2182e1fc9b2c66bcfd0a8429d62305d9e0..0a06b512ea8a58378049a943b332c17d05361df3 100644
--- a/source/libs/sync/test/syncSnapshotRspTest.cpp
+++ b/source/libs/sync/test/syncSnapshotRspTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncSnapshotSendTest.cpp b/source/libs/sync/test/syncSnapshotSendTest.cpp
index 83f1dfebb3893cc73ea36826c3ee353932042e14..46f33e0c56069f6559ab7b8424f8e760eaa90801 100644
--- a/source/libs/sync/test/syncSnapshotSendTest.cpp
+++ b/source/libs/sync/test/syncSnapshotSendTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncSnapshotSenderTest.cpp b/source/libs/sync/test/syncSnapshotSenderTest.cpp
index 7b2c13463cf28321add905f6baa729d21e27f2d3..9a234d412e6a9909a2b5a230bb105481e10d773f 100644
--- a/source/libs/sync/test/syncSnapshotSenderTest.cpp
+++ b/source/libs/sync/test/syncSnapshotSenderTest.cpp
@@ -1,11 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncRaftStore.h"
-#include "syncSnapshot.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncSnapshotTest.cpp b/source/libs/sync/test/syncSnapshotTest.cpp
index ea90621bacb561410cd426eb4939850927ffc01e..000348bf1bc2342f71ebe314fd46c8eb20247dc6 100644
--- a/source/libs/sync/test/syncSnapshotTest.cpp
+++ b/source/libs/sync/test/syncSnapshotTest.cpp
@@ -1,14 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncRaftEntry.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -125,14 +116,14 @@ SSyncNode *syncNodeInit() {
SSyncNode *pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
syncNodeStart(pSyncNode);
@@ -162,8 +153,11 @@ SRpcMsg *step0() {
}
SyncClientRequest *step1(const SRpcMsg *pMsg) {
- SyncClientRequest *pRetMsg = syncClientRequestBuild2(pMsg, 123, true, 1000);
- return pRetMsg;
+ SRpcMsg clientRequestMsg;
+ syncBuildClientRequest(&clientRequestMsg, pMsg, 123, true, 1000);
+ SyncClientRequest *pMsg2 = (SyncClientRequest *)taosMemoryMalloc(clientRequestMsg.contLen);
+ memcpy(pMsg2->data, clientRequestMsg.pCont, clientRequestMsg.contLen);
+ return pMsg2;
}
int main(int argc, char **argv) {
@@ -192,7 +186,7 @@ int main(int argc, char **argv) {
gSyncNode = syncInitTest();
assert(gSyncNode != NULL);
- syncNodeLog2((char *)"", gSyncNode);
+ sNTrace(gSyncNode, "");
initRaftId(gSyncNode);
@@ -206,9 +200,9 @@ int main(int argc, char **argv) {
for (int i = 0; i < 10; ++i) {
SyncClientRequest *pSyncClientRequest = pMsg1;
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pSyncClientRequest, &rpcMsg);
- gSyncNode->syncEqMsg(gSyncNode->msgcb, &rpcMsg);
+ SRpcMsg rpcMsg = {0};
+ // syncClientRequest2RpcMsg(pSyncClientRequest, &rpcMsg);
+ // gSyncNode->syncEqMsg(gSyncNode->msgcb, &rpcMsg);
taosMsleep(1000);
}
diff --git a/source/libs/sync/test/syncTest.cpp b/source/libs/sync/test/syncTest.cpp
index 97de81572a259d5f421a87474e58e62afa4884ad..55480802daf0df994e864648742981da9758c92c 100644
--- a/source/libs/sync/test/syncTest.cpp
+++ b/source/libs/sync/test/syncTest.cpp
@@ -1,7 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
+#include "syncTest.h"
/*
typedef enum {
diff --git a/source/libs/sync/test/syncTestTool.cpp b/source/libs/sync/test/syncTestTool.cpp
index e6f6006410307ffd8f524e0919b7a2b6dac150cc..8c486df118f26b53264d8830b9d3bfc8292adb14 100644
--- a/source/libs/sync/test/syncTestTool.cpp
+++ b/source/libs/sync/test/syncTestTool.cpp
@@ -1,12 +1,5 @@
#include
-#include
-#include "os.h"
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftCfg.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -155,8 +148,8 @@ void RestoreFinishCb(struct SSyncFSM* pFsm) { sTrace("==callback== ==RestoreFini
void ReConfigCb(struct SSyncFSM* pFsm, const SRpcMsg* pMsg, SReConfigCbMeta* cbMeta) {
char* s = syncCfg2Str(&(cbMeta->newCfg));
- sTrace("==callback== ==ReConfigCb== flag:0x%lX, index:%" PRId64 ", code:%d, currentTerm:%" PRIu64 ", term:%" PRIu64
- ", newCfg:%s",
+ sTrace("==callback== ==ReConfigCb== flag:%" PRIx64 ", index:%" PRId64 ", code:%d, currentTerm:%" PRIu64
+ ", term:%" PRIu64 ", newCfg:%s",
cbMeta->flag, cbMeta->index, cbMeta->code, cbMeta->currentTerm, cbMeta->term, s);
taosMemoryFree(s);
}
@@ -264,16 +257,16 @@ int64_t createSyncNode(int32_t replicaNum, int32_t myIndex, int32_t vgId, SWal*
SSyncNode* pSyncNode = (SSyncNode*)syncNodeAcquire(rid);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncSnapshot = pSyncNode->FpOnSnapshot;
- gSyncIO->FpOnSyncSnapshotReply = pSyncNode->FpOnSnapshotReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncSnapshot = pSyncNode->FpOnSnapshot;
+ // gSyncIO->FpOnSyncSnapshotReply = pSyncNode->FpOnSnapshotReply;
gSyncIO->pSyncNode = pSyncNode;
syncNodeRelease(pSyncNode);
diff --git a/source/libs/sync/test/syncTimeoutTest.cpp b/source/libs/sync/test/syncTimeoutTest.cpp
index bb0d71f00327722644273a62a3dd592b88207561..211445b5fed2eb14931fb8b7612e52f0d009ad3f 100644
--- a/source/libs/sync/test/syncTimeoutTest.cpp
+++ b/source/libs/sync/test/syncTimeoutTest.cpp
@@ -1,9 +1,5 @@
#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncUtil.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -32,7 +28,7 @@ void test2() {
uint32_t len = pMsg->bytes;
char *serialized = (char *)taosMemoryMalloc(len);
syncTimeoutSerialize(pMsg, serialized, len);
- SyncTimeout *pMsg2 = syncTimeoutBuild();
+ SyncTimeout *pMsg2 = syncTimeoutBuildX();
syncTimeoutDeserialize(serialized, len, pMsg2);
syncTimeoutLog2((char *)"test2: syncTimeoutSerialize -> syncTimeoutDeserialize ", pMsg2);
@@ -78,6 +74,28 @@ void test5() {
syncTimeoutDestroy(pMsg2);
}
+void syncUtilJson2Line(char *jsonStr) {
+ int p, q, len;
+ p = 0;
+ q = 1;
+ len = strlen(jsonStr);
+ while (1) {
+ if (jsonStr[q] == '\0') {
+ jsonStr[p + 1] = '\0';
+ break;
+ }
+
+ if (jsonStr[q] == '\n' || jsonStr[q] == ' ' || jsonStr[q] == '\t') {
+ q++;
+ continue;
+ } else {
+ jsonStr[p + 1] = jsonStr[q];
+ p++;
+ q++;
+ }
+ }
+}
+
void test6() {
SyncTimeout *pMsg = createMsg();
char *jsonStr = syncTimeout2Str(pMsg);
diff --git a/source/libs/sync/test/syncUtilTest.cpp b/source/libs/sync/test/syncUtilTest.cpp
index 411915fe22eef7e7c885499cd42883b227a5bf69..bbd4fa7d18f3fac3ca0ecbabe17e854bffb4f092 100644
--- a/source/libs/sync/test/syncUtilTest.cpp
+++ b/source/libs/sync/test/syncUtilTest.cpp
@@ -1,9 +1,4 @@
-#include "syncUtil.h"
-//#include
-#include
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
diff --git a/source/libs/sync/test/syncVotesGrantedTest.cpp b/source/libs/sync/test/syncVotesGrantedTest.cpp
index bbf14c604ec155d078b414fd24f1240940ab9a74..67573a6a378d6d38e39826d502ab965d6dc0e209 100644
--- a/source/libs/sync/test/syncVotesGrantedTest.cpp
+++ b/source/libs/sync/test/syncVotesGrantedTest.cpp
@@ -1,11 +1,4 @@
-#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "syncVoteMgr.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -46,14 +39,14 @@ SSyncNode* syncNodeInit() {
pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
diff --git a/source/libs/sync/test/syncVotesRespondTest.cpp b/source/libs/sync/test/syncVotesRespondTest.cpp
index adebfe1be2645b19e7e846c199cbacd5444595fa..3a0dac98b0f1dc8dc677a5c52149f1a317ae3ed6 100644
--- a/source/libs/sync/test/syncVotesRespondTest.cpp
+++ b/source/libs/sync/test/syncVotesRespondTest.cpp
@@ -1,11 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "syncVoteMgr.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -46,14 +40,14 @@ SSyncNode* syncNodeInit() {
pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
gSyncIO->pSyncNode = pSyncNode;
return pSyncNode;
diff --git a/source/libs/sync/test/syncWriteTest.cpp b/source/libs/sync/test/syncWriteTest.cpp
index cafecabc4d0baba1133918dcbbf77311fda29316..aae18626810b5a50c3dee509b4b7d2735efe3ac5 100644
--- a/source/libs/sync/test/syncWriteTest.cpp
+++ b/source/libs/sync/test/syncWriteTest.cpp
@@ -1,14 +1,5 @@
#include
-#include
-#include "syncEnv.h"
-#include "syncIO.h"
-#include "syncInt.h"
-#include "syncMessage.h"
-#include "syncRaftEntry.h"
-#include "syncRaftLog.h"
-#include "syncRaftStore.h"
-#include "syncUtil.h"
-#include "wal.h"
+#include "syncTest.h"
void logTest() {
sTrace("--- sync log test: trace");
@@ -103,14 +94,14 @@ SSyncNode *syncNodeInit() {
SSyncNode *pSyncNode = syncNodeOpen(&syncInfo);
assert(pSyncNode != NULL);
- gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
- gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
- gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
- gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
- gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
- gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
- gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
- gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
+ // gSyncIO->FpOnSyncPing = pSyncNode->FpOnPing;
+ // gSyncIO->FpOnSyncClientRequest = pSyncNode->FpOnClientRequest;
+ // gSyncIO->FpOnSyncPingReply = pSyncNode->FpOnPingReply;
+ // gSyncIO->FpOnSyncRequestVote = pSyncNode->FpOnRequestVote;
+ // gSyncIO->FpOnSyncRequestVoteReply = pSyncNode->FpOnRequestVoteReply;
+ // gSyncIO->FpOnSyncAppendEntries = pSyncNode->FpOnAppendEntries;
+ // gSyncIO->FpOnSyncAppendEntriesReply = pSyncNode->FpOnAppendEntriesReply;
+ // gSyncIO->FpOnSyncTimeout = pSyncNode->FpOnTimeout;
gSyncIO->pSyncNode = pSyncNode;
syncNodeStart(pSyncNode);
@@ -140,7 +131,8 @@ SRpcMsg *step0() {
}
SyncClientRequest *step1(const SRpcMsg *pMsg) {
- SyncClientRequest *pRetMsg = syncClientRequestBuild2(pMsg, 123, true, 1000);
+ SyncClientRequest *pRetMsg = NULL;
+ // syncClientRequestBuild(pMsg, 123, true, 1000);
return pRetMsg;
}
@@ -167,7 +159,7 @@ int main(int argc, char **argv) {
gSyncNode = syncInitTest();
assert(gSyncNode != NULL);
- syncNodeLog2((char *)"", gSyncNode);
+ sNTrace(gSyncNode, "");
initRaftId(gSyncNode);
@@ -179,14 +171,14 @@ int main(int argc, char **argv) {
SyncClientRequest *pMsg1 = step1(pMsg0);
syncClientRequestLog2((char *)"==step1==", pMsg1);
- for (int i = 0; i < 10; ++i) {
- SyncClientRequest *pSyncClientRequest = pMsg1;
- SRpcMsg rpcMsg;
- syncClientRequest2RpcMsg(pSyncClientRequest, &rpcMsg);
- gSyncNode->syncEqMsg(gSyncNode->msgcb, &rpcMsg);
+ // for (int i = 0; i < 10; ++i) {
+ // SyncClientRequest *pSyncClientRequest = pMsg1;
+ // SRpcMsg rpcMsg = {0};
+ // syncClientRequest2RpcMsg(pSyncClientRequest, &rpcMsg);
+ // gSyncNode->syncEqMsg(gSyncNode->msgcb, &rpcMsg);
- taosMsleep(1000);
- }
+ // taosMsleep(1000);
+ // }
while (1) {
sTrace("while 1 sleep");
diff --git a/source/libs/sync/test/sync_test_lib/CMakeLists.txt b/source/libs/sync/test/sync_test_lib/CMakeLists.txt
new file mode 100644
index 0000000000000000000000000000000000000000..db775c3662025be3f94ef33f32db0da28ec0cd60
--- /dev/null
+++ b/source/libs/sync/test/sync_test_lib/CMakeLists.txt
@@ -0,0 +1,14 @@
+aux_source_directory(src SYNC_TEST_SRC)
+add_library(sync_test_lib STATIC ${SYNC_TEST_SRC})
+
+target_link_libraries(
+ sync_test_lib
+ PUBLIC sync
+)
+
+target_include_directories(
+ sync_test_lib
+ PUBLIC "${TD_SOURCE_DIR}/include/libs/sync"
+ PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/../../inc"
+ PUBLIC "${CMAKE_CURRENT_SOURCE_DIR}/inc"
+)
diff --git a/source/libs/sync/test/sync_test_lib/inc/syncBatch.h b/source/libs/sync/test/sync_test_lib/inc/syncBatch.h
new file mode 100644
index 0000000000000000000000000000000000000000..9ea9da8d695a7e0a19d1776ca1648cd903bada49
--- /dev/null
+++ b/source/libs/sync/test/sync_test_lib/inc/syncBatch.h
@@ -0,0 +1,107 @@
+/*
+ * 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_LIBS_SYNC_BATCH_H
+#define _TD_LIBS_SYNC_BATCH_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "syncInt.h"
+
+// ---------------------------------------------
+typedef struct SRaftMeta {
+ uint64_t seqNum;
+ bool isWeak;
+} SRaftMeta;
+
+// block1:
+// block2: SRaftMeta array
+// block3: rpc msg array (with pCont pointer)
+
+typedef struct SyncClientRequestBatch {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType; // TDMT_SYNC_CLIENT_REQUEST_BATCH
+ uint32_t dataCount;
+ uint32_t dataLen;
+ char data[]; // block2, block3
+} SyncClientRequestBatch;
+
+SyncClientRequestBatch* syncClientRequestBatchBuild(SRpcMsg** rpcMsgPArr, SRaftMeta* raftArr, int32_t arrSize,
+ int32_t vgId);
+void syncClientRequestBatch2RpcMsg(const SyncClientRequestBatch* pSyncMsg, SRpcMsg* pRpcMsg);
+void syncClientRequestBatchDestroy(SyncClientRequestBatch* pMsg);
+void syncClientRequestBatchDestroyDeep(SyncClientRequestBatch* pMsg);
+SRaftMeta* syncClientRequestBatchMetaArr(const SyncClientRequestBatch* pSyncMsg);
+SRpcMsg* syncClientRequestBatchRpcMsgArr(const SyncClientRequestBatch* pSyncMsg);
+SyncClientRequestBatch* syncClientRequestBatchFromRpcMsg(const SRpcMsg* pRpcMsg);
+cJSON* syncClientRequestBatch2Json(const SyncClientRequestBatch* pMsg);
+char* syncClientRequestBatch2Str(const SyncClientRequestBatch* pMsg);
+
+// for debug ----------------------
+void syncClientRequestBatchPrint(const SyncClientRequestBatch* pMsg);
+void syncClientRequestBatchPrint2(char* s, const SyncClientRequestBatch* pMsg);
+void syncClientRequestBatchLog(const SyncClientRequestBatch* pMsg);
+void syncClientRequestBatchLog2(char* s, const SyncClientRequestBatch* pMsg);
+
+typedef struct SOffsetAndContLen {
+ int32_t offset;
+ int32_t contLen;
+} SOffsetAndContLen;
+
+// data:
+// block1: SOffsetAndContLen Array
+// block2: entry Array
+
+typedef struct SyncAppendEntriesBatch {
+ uint32_t bytes;
+ int32_t vgId;
+ uint32_t msgType;
+ SRaftId srcId;
+ SRaftId destId;
+
+ // private data
+ SyncTerm term;
+ SyncIndex prevLogIndex;
+ SyncTerm prevLogTerm;
+ SyncIndex commitIndex;
+ SyncTerm privateTerm;
+ int32_t dataCount;
+ uint32_t dataLen;
+ char data[]; // block1, block2
+} SyncAppendEntriesBatch;
+
+SyncAppendEntriesBatch* syncAppendEntriesBatchBuild(SSyncRaftEntry** entryPArr, int32_t arrSize, int32_t vgId);
+SOffsetAndContLen* syncAppendEntriesBatchMetaTableArray(SyncAppendEntriesBatch* pMsg);
+void syncAppendEntriesBatchDestroy(SyncAppendEntriesBatch* pMsg);
+void syncAppendEntriesBatchSerialize(const SyncAppendEntriesBatch* pMsg, char* buf, uint32_t bufLen);
+void syncAppendEntriesBatchDeserialize(const char* buf, uint32_t len, SyncAppendEntriesBatch* pMsg);
+char* syncAppendEntriesBatchSerialize2(const SyncAppendEntriesBatch* pMsg, uint32_t* len);
+SyncAppendEntriesBatch* syncAppendEntriesBatchDeserialize2(const char* buf, uint32_t len);
+void syncAppendEntriesBatch2RpcMsg(const SyncAppendEntriesBatch* pMsg, SRpcMsg* pRpcMsg);
+void syncAppendEntriesBatchFromRpcMsg(const SRpcMsg* pRpcMsg, SyncAppendEntriesBatch* pMsg);
+SyncAppendEntriesBatch* syncAppendEntriesBatchFromRpcMsg2(const SRpcMsg* pRpcMsg);
+
+// ---------------------------------------------
+void syncLogSendAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntriesBatch* pMsg, const char* s);
+void syncLogRecvAppendEntriesBatch(SSyncNode* pSyncNode, const SyncAppendEntriesBatch* pMsg, const char* s);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /*_TD_LIBS_SYNC_INT_H*/
diff --git a/source/libs/sync/inc/syncIO.h b/source/libs/sync/test/sync_test_lib/inc/syncIO.h
similarity index 91%
rename from source/libs/sync/inc/syncIO.h
rename to source/libs/sync/test/sync_test_lib/inc/syncIO.h
index cfc4dd247263a3c3eb877a814d6da00ed956589a..19f896182e11fa3793d7b4396cb83f806456e597 100644
--- a/source/libs/sync/inc/syncIO.h
+++ b/source/libs/sync/test/sync_test_lib/inc/syncIO.h
@@ -25,6 +25,7 @@ extern "C" {
#include
#include "os.h"
#include "syncInt.h"
+#include "syncTest.h"
#include "taosdef.h"
#include "tqueue.h"
#include "trpc.h"
@@ -32,6 +33,11 @@ extern "C" {
#define TICK_Q_TIMER_MS 1000
#define TICK_Ping_TIMER_MS 1000
+typedef struct SyncPing SyncPing;
+typedef struct SyncPingReply SyncPingReply;
+
+extern bool gRaftDetailLog;
+
typedef struct SSyncIO {
STaosQueue *pMsgQ;
STaosQset *pQset;
@@ -50,7 +56,7 @@ typedef struct SSyncIO {
void *pSyncNode;
int32_t (*FpOnSyncPing)(SSyncNode *pSyncNode, SyncPing *pMsg);
int32_t (*FpOnSyncPingReply)(SSyncNode *pSyncNode, SyncPingReply *pMsg);
- int32_t (*FpOnSyncClientRequest)(SSyncNode *pSyncNode, SyncClientRequest *pMsg, SyncIndex *pRetIndex);
+ int32_t (*FpOnSyncClientRequest)(SSyncNode *pSyncNode, SRpcMsg *pMsg, SyncIndex *pRetIndex);
int32_t (*FpOnSyncRequestVote)(SSyncNode *pSyncNode, SyncRequestVote *pMsg);
int32_t (*FpOnSyncRequestVoteReply)(SSyncNode *pSyncNode, SyncRequestVoteReply *pMsg);
int32_t (*FpOnSyncAppendEntries)(SSyncNode *pSyncNode, SyncAppendEntries *pMsg);
diff --git a/source/libs/sync/inc/syncTools.h b/source/libs/sync/test/sync_test_lib/inc/syncTest.h
similarity index 58%
rename from source/libs/sync/inc/syncTools.h
rename to source/libs/sync/test/sync_test_lib/inc/syncTest.h
index 2d87fcf7fa9cb7089390930ed2fa2244f043e57d..443d3a45d6b9ab63ae333dd729da9cfeb1bd0ccf 100644
--- a/source/libs/sync/inc/syncTools.h
+++ b/source/libs/sync/test/sync_test_lib/inc/syncTest.h
@@ -13,59 +13,135 @@
* along with this program. If not, see