Merge branch '3.0' into FIX/TD-19239-3.0
This commit is contained in:
commit
616eb5f903
|
@ -107,7 +107,7 @@ sudo yum config-manager --set-enabled Powertools
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo brew install argp-standalone pkgconfig
|
brew install argp-standalone pkgconfig
|
||||||
```
|
```
|
||||||
|
|
||||||
### 设置 golang 开发环境
|
### 设置 golang 开发环境
|
||||||
|
@ -276,7 +276,7 @@ sudo make install
|
||||||
安装成功后,可以在应用程序中双击 TDengine 图标启动服务,或者在终端中启动 TDengine 服务:
|
安装成功后,可以在应用程序中双击 TDengine 图标启动服务,或者在终端中启动 TDengine 服务:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
launchctl start taosd
|
launchctl start com.tdengine.taosd
|
||||||
```
|
```
|
||||||
|
|
||||||
用户可以使用 TDengine CLI 来连接 TDengine 服务,在终端中,输入:
|
用户可以使用 TDengine CLI 来连接 TDengine 服务,在终端中,输入:
|
||||||
|
|
|
@ -108,7 +108,7 @@ sudo yum config-manager --set-enabled powertools
|
||||||
### macOS
|
### macOS
|
||||||
|
|
||||||
```
|
```
|
||||||
sudo brew install argp-standalone pkgconfig
|
brew install argp-standalone pkgconfig
|
||||||
```
|
```
|
||||||
|
|
||||||
### Setup golang environment
|
### Setup golang environment
|
||||||
|
@ -280,7 +280,7 @@ Installing from source code will also configure service management for TDengine.
|
||||||
To start the service after installation, double-click the /applications/TDengine to start the program, or in a terminal, use:
|
To start the service after installation, double-click the /applications/TDengine to start the program, or in a terminal, use:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
launchctl start taosd
|
launchctl start com.tdengine.taosd
|
||||||
```
|
```
|
||||||
|
|
||||||
Then users can use the TDengine CLI to connect the TDengine server. In a terminal, use:
|
Then users can use the TDengine CLI to connect the TDengine server. In a terminal, use:
|
||||||
|
|
|
@ -45,10 +45,19 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin
|
||||||
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare")
|
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare")
|
||||||
|
|
||||||
MESSAGE("Current system processor is ${CMAKE_SYSTEM_PROCESSOR}.")
|
MESSAGE("Current system processor is ${CMAKE_SYSTEM_PROCESSOR}.")
|
||||||
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64" OR ${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
|
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
|
||||||
MESSAGE("Current system arch is 64")
|
MESSAGE("Current system arch is arm64")
|
||||||
SET(TD_DARWIN_64 TRUE)
|
SET(TD_DARWIN_64 TRUE)
|
||||||
|
SET(TD_DARWIN_ARM64 TRUE)
|
||||||
ADD_DEFINITIONS("-D_TD_DARWIN_64")
|
ADD_DEFINITIONS("-D_TD_DARWIN_64")
|
||||||
|
ADD_DEFINITIONS("-D_TD_DARWIN_ARM64")
|
||||||
|
ENDIF ()
|
||||||
|
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "x86_64")
|
||||||
|
MESSAGE("Current system arch is x86_64")
|
||||||
|
SET(TD_DARWIN_64 TRUE)
|
||||||
|
SET(TD_DARWIN_X64 TRUE)
|
||||||
|
ADD_DEFINITIONS("-D_TD_DARWIN_64")
|
||||||
|
ADD_DEFINITIONS("-D_TD_DARWIN_X64")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
ADD_DEFINITIONS("-DHAVE_UNISTD_H")
|
ADD_DEFINITIONS("-DHAVE_UNISTD_H")
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# taos-tools
|
# taos-tools
|
||||||
ExternalProject_Add(taos-tools
|
ExternalProject_Add(taos-tools
|
||||||
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
GIT_REPOSITORY https://github.com/taosdata/taos-tools.git
|
||||||
GIT_TAG d58230c
|
GIT_TAG 217a267
|
||||||
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
SOURCE_DIR "${TD_SOURCE_DIR}/tools/taos-tools"
|
||||||
BINARY_DIR ""
|
BINARY_DIR ""
|
||||||
#BUILD_IN_SOURCE TRUE
|
#BUILD_IN_SOURCE TRUE
|
||||||
|
|
|
@ -270,7 +270,7 @@ if(${JEMALLOC_ENABLED})
|
||||||
PREFIX "jemalloc"
|
PREFIX "jemalloc"
|
||||||
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jemalloc
|
SOURCE_DIR ${CMAKE_CURRENT_SOURCE_DIR}/jemalloc
|
||||||
BUILD_IN_SOURCE 1
|
BUILD_IN_SOURCE 1
|
||||||
CONFIGURE_COMMAND ./autogen.sh COMMAND ./configure --prefix=${CMAKE_BINARY_DIR}/build/ --disable-initial-exec-tls
|
CONFIGURE_COMMAND ./autogen.sh COMMAND ./configure --prefix=${CMAKE_BINARY_DIR}/build/ --disable-initial-exec-tls --with-malloc-conf='background_thread:true,metadata_thp:auto'
|
||||||
BUILD_COMMAND ${MAKE}
|
BUILD_COMMAND ${MAKE}
|
||||||
)
|
)
|
||||||
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/build/include)
|
INCLUDE_DIRECTORIES(${CMAKE_BINARY_DIR}/build/include)
|
||||||
|
|
|
@ -189,13 +189,13 @@ After the installation is complete, run `C:\TDengine\taosd.exe` to start TDengin
|
||||||
|
|
||||||
<TabItem label="macOS" value="macos">
|
<TabItem label="macOS" value="macos">
|
||||||
|
|
||||||
After the installation is complete, double-click the /applications/TDengine to start the program, or run `launchctl start taosd` to start TDengine Server.
|
After the installation is complete, double-click the /applications/TDengine to start the program, or run `launchctl start com.tdengine.taosd` to start TDengine Server.
|
||||||
|
|
||||||
The following `launchctl` commands can help you manage TDengine service:
|
The following `launchctl` commands can help you manage TDengine service:
|
||||||
|
|
||||||
- Start TDengine Server: `launchctl start taosd`
|
- Start TDengine Server: `launchctl start com.tdengine.taosd`
|
||||||
|
|
||||||
- Stop TDengine Server: `launchctl stop taosd`
|
- Stop TDengine Server: `launchctl stop com.tdengine.taosd`
|
||||||
|
|
||||||
- Check TDengine Server status: `launchctl list | grep taosd`
|
- Check TDengine Server status: `launchctl list | grep taosd`
|
||||||
|
|
||||||
|
|
|
@ -16,10 +16,10 @@ You can use the SHOW CONNECTIONS statement to find the conn_id.
|
||||||
## Terminate a Query
|
## Terminate a Query
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SHOW QUERY query_id;
|
KILL QUERY kill_id;
|
||||||
```
|
```
|
||||||
|
|
||||||
You can use the SHOW QUERIES statement to find the query_id.
|
You can use the SHOW QUERIES statement to find the kill_id.
|
||||||
|
|
||||||
## Terminate a Transaction
|
## Terminate a Transaction
|
||||||
|
|
||||||
|
|
|
@ -675,7 +675,7 @@ To prevent system resource from being exhausted by multiple concurrent streams,
|
||||||
| Meaning | Whether to generate core file when server crashes |
|
| Meaning | Whether to generate core file when server crashes |
|
||||||
| Value Range | 0: false, 1: true |
|
| Value Range | 0: false, 1: true |
|
||||||
| Default Value | 1 |
|
| Default Value | 1 |
|
||||||
| Note | The core file is generated under root directory `systemctl/launchctl start taosd` is used to start, or under the working directory if `taosd` is started directly on Linux/macOS Shell. |
|
| Note | The core file is generated under root directory `systemctl start taosd`/`launchctl start com.tdengine.taosd` is used to start, or under the working directory if `taosd` is started directly on Linux/macOS Shell. |
|
||||||
|
|
||||||
### udf
|
### udf
|
||||||
|
|
||||||
|
|
|
@ -188,13 +188,13 @@ Active: inactive (dead)
|
||||||
|
|
||||||
<TabItem label="macOS 系统" value="macos">
|
<TabItem label="macOS 系统" value="macos">
|
||||||
|
|
||||||
安装后,在应用程序目录下,双击 TDengine 图标来启动程序,也可以运行 `launchctl start taosd` 来启动 TDengine 服务进程。
|
安装后,在应用程序目录下,双击 TDengine 图标来启动程序,也可以运行 `launchctl start com.tdengine.taosd` 来启动 TDengine 服务进程。
|
||||||
|
|
||||||
如下 `launchctl` 命令可以帮助你管理 TDengine 服务:
|
如下 `launchctl` 命令可以帮助你管理 TDengine 服务:
|
||||||
|
|
||||||
- 启动服务进程:`launchctl start taosd`
|
- 启动服务进程:`launchctl start com.tdengine.taosd`
|
||||||
|
|
||||||
- 停止服务进程:`launchctl stop taosd`
|
- 停止服务进程:`launchctl stop com.tdengine.taosd`
|
||||||
|
|
||||||
- 查看服务状态:`launchctl list | grep taosd`
|
- 查看服务状态:`launchctl list | grep taosd`
|
||||||
|
|
||||||
|
|
|
@ -340,7 +340,7 @@ LTRIM(expr)
|
||||||
#### RTRIM
|
#### RTRIM
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
LTRIM(expr)
|
RTRIM(expr)
|
||||||
```
|
```
|
||||||
|
|
||||||
**功能说明**:返回清除右边空格后的字符串。
|
**功能说明**:返回清除右边空格后的字符串。
|
||||||
|
|
|
@ -17,10 +17,10 @@ conn_id 可以通过 `SHOW CONNECTIONS` 获取。
|
||||||
## 终止查询
|
## 终止查询
|
||||||
|
|
||||||
```sql
|
```sql
|
||||||
SHOW QUERY query_id;
|
KILL QUERY kill_id;
|
||||||
```
|
```
|
||||||
|
|
||||||
query_id 可以通过 `SHOW QUERIES` 获取。
|
kill_id 可以通过 `SHOW QUERIES` 获取。
|
||||||
|
|
||||||
## 终止事务
|
## 终止事务
|
||||||
|
|
||||||
|
|
|
@ -94,3 +94,10 @@ description: "TDengine 3.0 版本的语法变更说明"
|
||||||
| 9 | SAMPLE | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 9 | SAMPLE | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
||||||
| 10 | STATECOUNT | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 10 | STATECOUNT | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
||||||
| 11 | STATEDURATION | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
| 11 | STATEDURATION | 增强 | 可以直接用于超级表了。没有PARTITION BY时,超级表的数据会被合并成一条时间线。
|
||||||
|
|
||||||
|
|
||||||
|
## SCHEMALESS 变更
|
||||||
|
|
||||||
|
| # | **元素** | **<div style={{width: 60}}>差异性</div>** | **说明** |
|
||||||
|
| - | :------- | :-------- | :------- |
|
||||||
|
| 1 | 主键ts 变更为 _ts | 变更 | schemaless自动建的列名用 _ 开头,不同于2.x。
|
||||||
|
|
|
@ -115,7 +115,7 @@ st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000
|
||||||
|
|
||||||
## 数据模式映射规则
|
## 数据模式映射规则
|
||||||
|
|
||||||
本节将说明行协议的数据如何映射成为具有模式的数据。每个行协议中数据 measurement 映射为
|
本节将说明 InfluxDB 行协议(Line Protocol)的数据如何映射成为具有模式的数据。每个行协议中数据 measurement 映射为
|
||||||
超级表名称。tag_set 中的 标签名称为 数据模式中的标签名,field_set 中的名称为列名称。以如下数据为例,说明映射规则:
|
超级表名称。tag_set 中的 标签名称为 数据模式中的标签名,field_set 中的名称为列名称。以如下数据为例,说明映射规则:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
|
|
|
@ -1,5 +1,17 @@
|
||||||
// C api call sequence demo
|
/*
|
||||||
// to compile: gcc -o apidemo apidemo.c -ltaos
|
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||||
|
*
|
||||||
|
* This program is free software: you can use, redistribute, and/or modify
|
||||||
|
* it under the terms of the GNU Affero General Public License, version 3
|
||||||
|
* or later ("AGPL"), as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -13,23 +25,23 @@
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
#define debugPrint(fmt, ...) \
|
#define debugPrint(fmt, ...) \
|
||||||
do { if (g_args.debug_print || g_args.verbose_print) \
|
do { if (g_args.debug_print || g_args.verbose_print) {\
|
||||||
fprintf(stdout, "DEBG: "fmt, __VA_ARGS__); } while(0)
|
fprintf(stdout, "DEBG: "fmt, __VA_ARGS__); }} while (0)
|
||||||
|
|
||||||
#define warnPrint(fmt, ...) \
|
#define warnPrint(fmt, ...) \
|
||||||
do { fprintf(stderr, "\033[33m"); \
|
do { fprintf(stderr, "\033[33m"); \
|
||||||
fprintf(stderr, "WARN: "fmt, __VA_ARGS__); \
|
fprintf(stderr, "WARN: "fmt, __VA_ARGS__); \
|
||||||
fprintf(stderr, "\033[0m"); } while(0)
|
fprintf(stderr, "\033[0m"); } while (0)
|
||||||
|
|
||||||
#define errorPrint(fmt, ...) \
|
#define errorPrint(fmt, ...) \
|
||||||
do { fprintf(stderr, "\033[31m"); \
|
do { fprintf(stderr, "\033[31m"); \
|
||||||
fprintf(stderr, "ERROR: "fmt, __VA_ARGS__); \
|
fprintf(stderr, "ERROR: "fmt, __VA_ARGS__); \
|
||||||
fprintf(stderr, "\033[0m"); } while(0)
|
fprintf(stderr, "\033[0m"); } while (0)
|
||||||
|
|
||||||
#define okPrint(fmt, ...) \
|
#define okPrint(fmt, ...) \
|
||||||
do { fprintf(stderr, "\033[32m"); \
|
do { fprintf(stderr, "\033[32m"); \
|
||||||
fprintf(stderr, "OK: "fmt, __VA_ARGS__); \
|
fprintf(stderr, "OK: "fmt, __VA_ARGS__); \
|
||||||
fprintf(stderr, "\033[0m"); } while(0)
|
fprintf(stderr, "\033[0m"); } while (0)
|
||||||
|
|
||||||
int64_t g_num_of_tb = 2;
|
int64_t g_num_of_tb = 2;
|
||||||
int64_t g_num_of_rec = 3;
|
int64_t g_num_of_rec = 3;
|
||||||
|
@ -74,10 +86,16 @@ static void prepare_data(TAOS* taos) {
|
||||||
res = taos_query(taos, "create database test;");
|
res = taos_query(taos, "create database test;");
|
||||||
taos_free_result(res);
|
taos_free_result(res);
|
||||||
taosMsleep(100);
|
taosMsleep(100);
|
||||||
taos_select_db(taos, "test");
|
if (taos_select_db(taos, "test")) {
|
||||||
|
errorPrint("%s() LN%d: taos_select_db() failed\n",
|
||||||
|
__func__, __LINE__);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
char command[1024] = {0};
|
char command[1024] = {0};
|
||||||
sprintf(command, "%s", "create table meters(ts timestamp, f float, n int, bin1 binary(20), c nchar(20), bin2 binary(20)) tags(area int, city binary(20), dist nchar(20), street binary(20));");
|
sprintf(command, "%s", "create table meters(ts timestamp, f float, n int, "
|
||||||
|
"bin1 binary(20), c nchar(20), bin2 binary(20)) tags(area int, "
|
||||||
|
"city binary(20), dist nchar(20), street binary(20));");
|
||||||
res = taos_query(taos, command);
|
res = taos_query(taos, command);
|
||||||
if ((res) && (0 == taos_errno(res))) {
|
if ((res) && (0 == taos_errno(res))) {
|
||||||
okPrint("%s created\n", "meters");
|
okPrint("%s created\n", "meters");
|
||||||
|
@ -117,12 +135,11 @@ static void prepare_data(TAOS* taos) {
|
||||||
sprintf(command, "insert into t%"PRId64" "
|
sprintf(command, "insert into t%"PRId64" "
|
||||||
"values(%" PRId64 ", %f, %"PRId64", "
|
"values(%" PRId64 ", %f, %"PRId64", "
|
||||||
"'%c%d', '%s%c%d', '%c%d')",
|
"'%c%d', '%s%c%d', '%c%d')",
|
||||||
i, 1650000000000+j, (float)j, j,
|
i, 1650000000000+j, j * 1.0, j,
|
||||||
'a'+(int)j%25, rand(),
|
'a'+(int)j%25, rand(),
|
||||||
// "涛思", 'z' - (int)j%25, rand(),
|
// "涛思", 'z' - (int)j%25, rand(),
|
||||||
"TAOS", 'z' - (int)j%25, rand(),
|
"TAOS", 'z' - (int)j%25, rand(),
|
||||||
'b' - (int)j%25, rand()
|
'b' - (int)j%25, rand());
|
||||||
);
|
|
||||||
res = taos_query(taos, command);
|
res = taos_query(taos, command);
|
||||||
if ((res) && (0 == taos_errno(res))) {
|
if ((res) && (0 == taos_errno(res))) {
|
||||||
affected = taos_affected_rows(res);
|
affected = taos_affected_rows(res);
|
||||||
|
@ -150,8 +167,7 @@ static void prepare_data(TAOS* taos) {
|
||||||
i, 1650000000000+j+1, (float)j, j,
|
i, 1650000000000+j+1, (float)j, j,
|
||||||
'a'+(int)j%25, rand(),
|
'a'+(int)j%25, rand(),
|
||||||
"数据", 'z' - (int)j%25, rand(),
|
"数据", 'z' - (int)j%25, rand(),
|
||||||
'b' - (int)j%25, rand()
|
'b' - (int)j%25, rand());
|
||||||
);
|
|
||||||
res = taos_query(taos, command);
|
res = taos_query(taos, command);
|
||||||
if ((res) && (0 == taos_errno(res))) {
|
if ((res) && (0 == taos_errno(res))) {
|
||||||
affected = taos_affected_rows(res);
|
affected = taos_affected_rows(res);
|
||||||
|
@ -179,7 +195,8 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (block) {
|
if (block) {
|
||||||
warnPrint("%s", "call taos_fetch_block(), don't call taos_fetch_lengths()\n");
|
warnPrint("%s", "call taos_fetch_block(), "
|
||||||
|
"don't call taos_fetch_lengths()\n");
|
||||||
int rows = 0;
|
int rows = 0;
|
||||||
while ((rows = taos_fetch_block(res, &row))) {
|
while ((rows = taos_fetch_block(res, &row))) {
|
||||||
int *lengths = taos_fetch_lengths(res);
|
int *lengths = taos_fetch_lengths(res);
|
||||||
|
@ -190,7 +207,7 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d type is %d, no need get offset\n",
|
printf("col%d type is %d, no need get offset\n",
|
||||||
f, fields[f].type);
|
f, fields[f].type);
|
||||||
for (int64_t c = 0; c < rows; c++) {
|
for (int64_t c = 0; c < rows; c++) {
|
||||||
switch(fields[f].type) {
|
switch (fields[f].type) {
|
||||||
case TSDB_DATA_TYPE_TIMESTAMP:
|
case TSDB_DATA_TYPE_TIMESTAMP:
|
||||||
if (taos_is_null(res, c, f)) {
|
if (taos_is_null(res, c, f)) {
|
||||||
printf("col%d, row: %"PRId64" "
|
printf("col%d, row: %"PRId64" "
|
||||||
|
@ -199,7 +216,8 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d, row: %"PRId64", "
|
printf("col%d, row: %"PRId64", "
|
||||||
"value: %"PRId64"\n",
|
"value: %"PRId64"\n",
|
||||||
f, c,
|
f, c,
|
||||||
*(int64_t*)((char*)(row[f])+c*sizeof(int64_t)));
|
*(int64_t*)((char*)(row[f])
|
||||||
|
+c*sizeof(int64_t)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -211,7 +229,8 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d, row: %"PRId64", "
|
printf("col%d, row: %"PRId64", "
|
||||||
"value: %d\n",
|
"value: %d\n",
|
||||||
f, c,
|
f, c,
|
||||||
*(int32_t*)((char*)(row[f])+c*sizeof(int32_t)));
|
*(int32_t*)((char*)(row[f])
|
||||||
|
+c*sizeof(int32_t)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -223,7 +242,8 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
printf("col%d, row: %"PRId64", "
|
printf("col%d, row: %"PRId64", "
|
||||||
"value: %f\n",
|
"value: %f\n",
|
||||||
f, c,
|
f, c,
|
||||||
*(float*)((char*)(row[f])+c*sizeof(float)));
|
*(float*)((char*)(row[f])
|
||||||
|
+c*sizeof(float)));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
@ -238,14 +258,18 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
if (offsets) {
|
if (offsets) {
|
||||||
for (int c = 0; c < rows; c++) {
|
for (int c = 0; c < rows; c++) {
|
||||||
if (offsets[c] != -1) {
|
if (offsets[c] != -1) {
|
||||||
int length = *(int16_t*)((char*)(row[f]) + offsets[c]);
|
int length = *(int16_t*)((char*)(row[f])
|
||||||
|
+ offsets[c]);
|
||||||
char *buf = calloc(1, length + 1);
|
char *buf = calloc(1, length + 1);
|
||||||
strncpy(buf, (char *)((char*)(row[f]) + offsets[c] + 2), length);
|
strncpy(buf, (char *)((char*)(row[f])
|
||||||
printf("row: %d, col: %d, offset: %d, length: %d, content: %s\n",
|
+ offsets[c] + 2), length);
|
||||||
|
printf("row: %d, col: %d, offset: %d, "
|
||||||
|
"length: %d, content: %s\n",
|
||||||
c, f, offsets[c], length, buf);
|
c, f, offsets[c], length, buf);
|
||||||
free(buf);
|
free(buf);
|
||||||
} else {
|
} else {
|
||||||
printf("row: %d, col: %d, offset: -1, means content is NULL\n",
|
printf("row: %d, col: %d, offset: -1, "
|
||||||
|
"means content is NULL\n",
|
||||||
c, f);
|
c, f);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -267,7 +291,8 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
int* lengths = taos_fetch_lengths(res);
|
int* lengths = taos_fetch_lengths(res);
|
||||||
if (lengths) {
|
if (lengths) {
|
||||||
for (int c = 0; c < num_fields; c++) {
|
for (int c = 0; c < num_fields; c++) {
|
||||||
printf("row: %"PRId64", col: %d, is_null: %s, length of column %d is %d\n",
|
printf("row: %"PRId64", col: %d, is_null: %s, "
|
||||||
|
"length of column %d is %d\n",
|
||||||
num_rows, c,
|
num_rows, c,
|
||||||
taos_is_null(res, num_rows, c)?"True":"False",
|
taos_is_null(res, num_rows, c)?"True":"False",
|
||||||
c, lengths[c]);
|
c, lengths[c]);
|
||||||
|
@ -277,7 +302,7 @@ static int print_result(char *tbname, TAOS_RES* res, int block) {
|
||||||
__func__, __LINE__, tbname);
|
__func__, __LINE__, tbname);
|
||||||
}
|
}
|
||||||
|
|
||||||
num_rows ++;
|
num_rows++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -322,7 +347,8 @@ int main(int argc, char *argv[]) {
|
||||||
#endif
|
#endif
|
||||||
TAOS* taos = taos_connect(host, user, passwd, "", 0);
|
TAOS* taos = taos_connect(host, user, passwd, "", 0);
|
||||||
if (taos == NULL) {
|
if (taos == NULL) {
|
||||||
printf("\033[31mfailed to connect to db, reason:%s\033[0m\n", taos_errstr(taos));
|
printf("\033[31mfailed to connect to db, reason:%s\033[0m\n",
|
||||||
|
taos_errstr(taos));
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -93,6 +93,7 @@ extern int64_t tsQueryBufferSizeBytes; // maximum allowed usage buffer size in
|
||||||
|
|
||||||
// query client
|
// query client
|
||||||
extern int32_t tsQueryPolicy;
|
extern int32_t tsQueryPolicy;
|
||||||
|
extern int32_t tsQueryRspPolicy;
|
||||||
extern int32_t tsQuerySmaOptimize;
|
extern int32_t tsQuerySmaOptimize;
|
||||||
extern int32_t tsQueryRsmaTolerance;
|
extern int32_t tsQueryRsmaTolerance;
|
||||||
extern bool tsQueryPlannerTrace;
|
extern bool tsQueryPlannerTrace;
|
||||||
|
|
|
@ -30,9 +30,10 @@ typedef struct SMnode SMnode;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int32_t dnodeId;
|
int32_t dnodeId;
|
||||||
bool standby;
|
|
||||||
bool deploy;
|
bool deploy;
|
||||||
SReplica replica;
|
int8_t selfIndex;
|
||||||
|
int8_t numOfReplicas;
|
||||||
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
SMsgCb msgCb;
|
SMsgCb msgCb;
|
||||||
} SMnodeOpt;
|
} SMnodeOpt;
|
||||||
|
|
||||||
|
|
|
@ -54,6 +54,9 @@ typedef enum {
|
||||||
#define QUERY_POLICY_QNODE 3
|
#define QUERY_POLICY_QNODE 3
|
||||||
#define QUERY_POLICY_CLIENT 4
|
#define QUERY_POLICY_CLIENT 4
|
||||||
|
|
||||||
|
#define QUERY_RSP_POLICY_DELAY 0
|
||||||
|
#define QUERY_RSP_POLICY_QUICK 1
|
||||||
|
|
||||||
typedef struct STableComInfo {
|
typedef struct STableComInfo {
|
||||||
uint8_t numOfTags; // the number of tags in schema
|
uint8_t numOfTags; // the number of tags in schema
|
||||||
uint8_t precision; // the number of precision
|
uint8_t precision; // the number of precision
|
||||||
|
@ -230,7 +233,7 @@ int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
|
||||||
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
||||||
|
|
||||||
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen,
|
extern int32_t (*queryBuildMsg[TDMT_MAX])(void* input, char** msg, int32_t msgSize, int32_t* msgLen,
|
||||||
void* (*mallocFp)(int32_t));
|
void* (*mallocFp)(int64_t));
|
||||||
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
extern int32_t (*queryProcessMsgRsp[TDMT_MAX])(void* output, char* msg, int32_t msgSize);
|
||||||
|
|
||||||
#define SET_META_TYPE_NULL(t) (t) = META_TYPE_NULL_TABLE
|
#define SET_META_TYPE_NULL(t) (t) = META_TYPE_NULL_TABLE
|
||||||
|
|
|
@ -43,7 +43,7 @@ int32_t scalarGetOperatorParamNum(EOperatorType type);
|
||||||
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
|
int32_t scalarGenerateSetFromList(void **data, void *pNode, uint32_t type);
|
||||||
|
|
||||||
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
|
int32_t vectorGetConvertType(int32_t type1, int32_t type2);
|
||||||
int32_t vectorConvertImpl(const SScalarParam *pIn, SScalarParam *pOut, int32_t *overflow);
|
int32_t vectorConvertSingleColImpl(const SScalarParam *pIn, SScalarParam *pOut, int32_t *overflow, int32_t startIndex, int32_t numOfRows);
|
||||||
|
|
||||||
/* Math functions */
|
/* Math functions */
|
||||||
int32_t absFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
int32_t absFunction(SScalarParam *pInput, int32_t inputNum, SScalarParam *pOutput);
|
||||||
|
|
|
@ -211,7 +211,7 @@ typedef struct SSyncInfo {
|
||||||
|
|
||||||
int32_t syncInit();
|
int32_t syncInit();
|
||||||
void syncCleanUp();
|
void syncCleanUp();
|
||||||
int64_t syncOpen(const SSyncInfo* pSyncInfo);
|
int64_t syncOpen(SSyncInfo* pSyncInfo);
|
||||||
void syncStart(int64_t rid);
|
void syncStart(int64_t rid);
|
||||||
void syncStop(int64_t rid);
|
void syncStop(int64_t rid);
|
||||||
int32_t syncSetStandby(int64_t rid);
|
int32_t syncSetStandby(int64_t rid);
|
||||||
|
@ -233,7 +233,7 @@ const char* syncStr(ESyncState state);
|
||||||
bool syncIsRestoreFinish(int64_t rid);
|
bool syncIsRestoreFinish(int64_t rid);
|
||||||
int32_t syncGetSnapshotByIndex(int64_t rid, SyncIndex index, SSnapshot* pSnapshot);
|
int32_t syncGetSnapshotByIndex(int64_t rid, SyncIndex index, SSnapshot* pSnapshot);
|
||||||
|
|
||||||
int32_t syncReconfig(int64_t rid, const SSyncCfg* pNewCfg);
|
int32_t syncReconfig(int64_t rid, SSyncCfg* pNewCfg);
|
||||||
|
|
||||||
// build SRpcMsg, need to call syncPropose with SRpcMsg
|
// build SRpcMsg, need to call syncPropose with SRpcMsg
|
||||||
int32_t syncReconfigBuild(int64_t rid, const SSyncCfg* pNewCfg, SRpcMsg* pRpcMsg);
|
int32_t syncReconfigBuild(int64_t rid, const SSyncCfg* pNewCfg, SRpcMsg* pRpcMsg);
|
||||||
|
|
|
@ -123,9 +123,9 @@ void rpcCleanup();
|
||||||
void *rpcOpen(const SRpcInit *pRpc);
|
void *rpcOpen(const SRpcInit *pRpc);
|
||||||
void rpcClose(void *);
|
void rpcClose(void *);
|
||||||
void rpcCloseImpl(void *);
|
void rpcCloseImpl(void *);
|
||||||
void *rpcMallocCont(int32_t contLen);
|
void *rpcMallocCont(int64_t contLen);
|
||||||
void rpcFreeCont(void *pCont);
|
void rpcFreeCont(void *pCont);
|
||||||
void *rpcReallocCont(void *ptr, int32_t contLen);
|
void *rpcReallocCont(void *ptr, int64_t contLen);
|
||||||
|
|
||||||
// Because taosd supports multi-process mode
|
// Because taosd supports multi-process mode
|
||||||
// These functions should not be used on the server side
|
// These functions should not be used on the server side
|
||||||
|
|
|
@ -29,12 +29,12 @@ extern "C" {
|
||||||
#define free FREE_FUNC_TAOS_FORBID
|
#define free FREE_FUNC_TAOS_FORBID
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void *taosMemoryMalloc(int32_t size);
|
void *taosMemoryMalloc(int64_t size);
|
||||||
void *taosMemoryCalloc(int32_t num, int32_t size);
|
void *taosMemoryCalloc(int64_t num, int64_t size);
|
||||||
void *taosMemoryRealloc(void *ptr, int32_t size);
|
void *taosMemoryRealloc(void *ptr, int64_t size);
|
||||||
void *taosMemoryStrDup(const char *ptr);
|
void *taosMemoryStrDup(const char *ptr);
|
||||||
void taosMemoryFree(void *ptr);
|
void taosMemoryFree(void *ptr);
|
||||||
int32_t taosMemorySize(void *ptr);
|
int64_t taosMemorySize(void *ptr);
|
||||||
void taosPrintBackTrace();
|
void taosPrintBackTrace();
|
||||||
|
|
||||||
#define taosMemoryFreeClear(ptr) \
|
#define taosMemoryFreeClear(ptr) \
|
||||||
|
|
|
@ -26,7 +26,7 @@ typedef struct SRBTree SRBTree;
|
||||||
typedef struct SRBTreeNode SRBTreeNode;
|
typedef struct SRBTreeNode SRBTreeNode;
|
||||||
typedef struct SRBTreeIter SRBTreeIter;
|
typedef struct SRBTreeIter SRBTreeIter;
|
||||||
|
|
||||||
typedef int32_t (*tRBTreeCmprFn)(const void *, const void *);
|
typedef int32_t (*tRBTreeCmprFn)(const SRBTreeNode *, const SRBTreeNode *);
|
||||||
|
|
||||||
// SRBTree =============================================
|
// SRBTree =============================================
|
||||||
#define tRBTreeMin(T) ((T)->min == ((T)->NIL) ? NULL : (T)->min)
|
#define tRBTreeMin(T) ((T)->min == ((T)->NIL) ? NULL : (T)->min)
|
||||||
|
@ -36,7 +36,7 @@ void tRBTreeCreate(SRBTree *pTree, tRBTreeCmprFn cmprFn);
|
||||||
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *z);
|
SRBTreeNode *tRBTreePut(SRBTree *pTree, SRBTreeNode *z);
|
||||||
void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *z);
|
void tRBTreeDrop(SRBTree *pTree, SRBTreeNode *z);
|
||||||
SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey);
|
SRBTreeNode *tRBTreeDropByKey(SRBTree *pTree, void *pKey);
|
||||||
SRBTreeNode *tRBTreeGet(SRBTree *pTree, void *pKey);
|
SRBTreeNode *tRBTreeGet(SRBTree *pTree, const SRBTreeNode *pKeyNode);
|
||||||
|
|
||||||
// SRBTreeIter =============================================
|
// SRBTreeIter =============================================
|
||||||
#define tRBTreeIterCreate(tree, ascend) \
|
#define tRBTreeIterCreate(tree, ascend) \
|
||||||
|
@ -53,8 +53,6 @@ struct SRBTreeNode {
|
||||||
SRBTreeNode *right;
|
SRBTreeNode *right;
|
||||||
};
|
};
|
||||||
|
|
||||||
#define RBTREE_NODE_PAYLOAD(N) ((const void *)&(N)[1])
|
|
||||||
|
|
||||||
struct SRBTree {
|
struct SRBTree {
|
||||||
tRBTreeCmprFn cmprFn;
|
tRBTreeCmprFn cmprFn;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
|
|
|
@ -17,12 +17,12 @@ EOF
|
||||||
|
|
||||||
taosd_status=`Launchctl list | grep taosd | head -n 1 | awk '{print $1}'`
|
taosd_status=`Launchctl list | grep taosd | head -n 1 | awk '{print $1}'`
|
||||||
if [ "$taosd_status"x = "-"x ]; then
|
if [ "$taosd_status"x = "-"x ]; then
|
||||||
launchctl start taosd
|
launchctl start com.tdengine.taosd
|
||||||
showAlertMessage "Taosd is running!" "TDengine" "ok" "note"
|
showAlertMessage "Taosd is running!" "TDengine" "ok" "note"
|
||||||
else
|
else
|
||||||
choose_result=`showAlertMessage "Taosd is running!\nDo you want to close it?" "TDengine" "yes,cancel" "stop"`
|
choose_result=`showAlertMessage "Taosd is running!\nDo you want to close it?" "TDengine" "yes,cancel" "stop"`
|
||||||
if [ "$choose_result"x = "button returned:yes"x ]; then
|
if [ "$choose_result"x = "button returned:yes"x ]; then
|
||||||
launchctl stop taosd
|
launchctl stop com.tdengine.taosd
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,882 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||||
|
<plist version="1.0">
|
||||||
|
<dict>
|
||||||
|
<key>PACKAGES</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>MUST-CLOSE-APPLICATION-ITEMS</key>
|
||||||
|
<array/>
|
||||||
|
<key>MUST-CLOSE-APPLICATIONS</key>
|
||||||
|
<false/>
|
||||||
|
<key>PACKAGE_FILES</key>
|
||||||
|
<dict>
|
||||||
|
<key>DEFAULT_INSTALL_LOCATION</key>
|
||||||
|
<string>/</string>
|
||||||
|
<key>HIERARCHY</key>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Applications</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>509</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Application Support</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Automator</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Documentation</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Extensions</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Filesystems</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Frameworks</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Input Methods</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Internet Plug-Ins</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Keyboard Layouts</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>LaunchAgents</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>LaunchDaemons</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>PreferencePanes</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Preferences</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Printers</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>PrivilegedHelperTools</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>1005</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>QuickLook</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>QuickTime</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Screen Savers</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Scripts</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Services</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Widgets</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Library</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Shared</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>1023</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>80</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>Users</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PAYLOAD_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PRESERVE_EXTENDED_ATTRIBUTES</key>
|
||||||
|
<false/>
|
||||||
|
<key>SHOW_INVISIBLE</key>
|
||||||
|
<false/>
|
||||||
|
<key>SPLIT_FORKS</key>
|
||||||
|
<true/>
|
||||||
|
<key>TREAT_MISSING_FILES_AS_WARNING</key>
|
||||||
|
<false/>
|
||||||
|
<key>VERSION</key>
|
||||||
|
<integer>5</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PACKAGE_SCRIPTS</key>
|
||||||
|
<dict>
|
||||||
|
<key>POSTINSTALL_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/opt/taos/TDengine/packaging/tools/post.sh</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PREINSTALL_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>RESOURCES</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>GID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/opt/tdengine</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>PERMISSIONS</key>
|
||||||
|
<integer>493</integer>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>3</integer>
|
||||||
|
<key>UID</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>PACKAGE_SETTINGS</key>
|
||||||
|
<dict>
|
||||||
|
<key>AUTHENTICATION</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>CONCLUSION_ACTION</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>FOLLOW_SYMBOLIC_LINKS</key>
|
||||||
|
<false/>
|
||||||
|
<key>IDENTIFIER</key>
|
||||||
|
<string>com.taosdata.pkg.pkgtaos</string>
|
||||||
|
<key>LOCATION</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>NAME</key>
|
||||||
|
<string>TDengine</string>
|
||||||
|
<key>OVERWRITE_PERMISSIONS</key>
|
||||||
|
<true/>
|
||||||
|
<key>PAYLOAD_SIZE</key>
|
||||||
|
<integer>-1</integer>
|
||||||
|
<key>REFERENCE_PATH</key>
|
||||||
|
<string></string>
|
||||||
|
<key>RELOCATABLE</key>
|
||||||
|
<false/>
|
||||||
|
<key>USE_HFS+_COMPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>VERSION</key>
|
||||||
|
<string>3.0.1.4</string>
|
||||||
|
</dict>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>UUID</key>
|
||||||
|
<string>48F6B249-AF56-46E3-B75A-AEED5858A764</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROJECT</key>
|
||||||
|
<dict>
|
||||||
|
<key>PROJECT_COMMENTS</key>
|
||||||
|
<dict>
|
||||||
|
<key>NOTES</key>
|
||||||
|
<data>
|
||||||
|
</data>
|
||||||
|
</dict>
|
||||||
|
<key>PROJECT_PRESENTATION</key>
|
||||||
|
<dict>
|
||||||
|
<key>BACKGROUND</key>
|
||||||
|
<dict>
|
||||||
|
<key>APPAREANCES</key>
|
||||||
|
<dict>
|
||||||
|
<key>DARK_AQUA</key>
|
||||||
|
<dict/>
|
||||||
|
<key>LIGHT_AQUA</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
<key>SHARED_SETTINGS_FOR_ALL_APPAREANCES</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<key>INSTALLATION TYPE</key>
|
||||||
|
<dict>
|
||||||
|
<key>HIERARCHIES</key>
|
||||||
|
<dict>
|
||||||
|
<key>INSTALLER</key>
|
||||||
|
<dict>
|
||||||
|
<key>LIST</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>CHILDREN</key>
|
||||||
|
<array/>
|
||||||
|
<key>DESCRIPTION</key>
|
||||||
|
<array/>
|
||||||
|
<key>OPTIONS</key>
|
||||||
|
<dict>
|
||||||
|
<key>HIDDEN</key>
|
||||||
|
<false/>
|
||||||
|
<key>STATE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<key>PACKAGE_UUID</key>
|
||||||
|
<string>48F6B249-AF56-46E3-B75A-AEED5858A764</string>
|
||||||
|
<key>TITLE</key>
|
||||||
|
<array/>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>UUID</key>
|
||||||
|
<string>7ED88D2C-D55C-46FF-99CB-73313ACAD73D</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>REMOVED</key>
|
||||||
|
<dict/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>MODE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>INSTALLATION_STEPS</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewIntroductionController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>Introduction</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewReadMeController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>ReadMe</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewLicenseController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>License</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewDestinationSelectController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>TargetSelect</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewInstallationTypeController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>PackageSelection</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewInstallationController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>Install</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>ICPRESENTATION_CHAPTER_VIEW_CONTROLLER_CLASS</key>
|
||||||
|
<string>ICPresentationViewSummaryController</string>
|
||||||
|
<key>INSTALLER_PLUGIN</key>
|
||||||
|
<string>Summary</string>
|
||||||
|
<key>LIST_TITLE_KEY</key>
|
||||||
|
<string>InstallerSectionTitle</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>INTRODUCTION</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>LANGUAGE</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>VALUE</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/opt/taos/TDengine/packaging/tools/mac_before_install.txt</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
<key>LICENSE</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
<key>MODE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>README</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
<key>SUMMARY</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array/>
|
||||||
|
</dict>
|
||||||
|
<key>TITLE</key>
|
||||||
|
<dict>
|
||||||
|
<key>LOCALIZATIONS</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>LANGUAGE</key>
|
||||||
|
<string>English</string>
|
||||||
|
<key>VALUE</key>
|
||||||
|
<string>TDengine</string>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>PROJECT_REQUIREMENTS</key>
|
||||||
|
<dict>
|
||||||
|
<key>LIST</key>
|
||||||
|
<array/>
|
||||||
|
<key>RESOURCES</key>
|
||||||
|
<array/>
|
||||||
|
<key>ROOT_VOLUME_ONLY</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
<key>PROJECT_SETTINGS</key>
|
||||||
|
<dict>
|
||||||
|
<key>BUILD_FORMAT</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>BUILD_PATH</key>
|
||||||
|
<dict>
|
||||||
|
<key>PATH</key>
|
||||||
|
<string>/opt/taos/TDengine/release</string>
|
||||||
|
<key>PATH_TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<key>EXCLUDED_FILES</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.DS_Store</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove .DS_Store files</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove ".DS_Store" files created by the Finder.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.pbdevelopment</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove .pbdevelopment files</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove ".pbdevelopment" files created by ProjectBuilder or Xcode.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>CVS</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.cvsignore</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.cvspass</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.svn</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.git</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>.gitignore</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove SCM metadata</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove helper files and folders used by the CVS, SVN or Git Source Code Management systems.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>classes.nib</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>designable.db</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>info.nib</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Optimize nib files</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove "classes.nib", "info.nib" and "designable.nib" files within .nib bundles.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>PATTERNS_ARRAY</key>
|
||||||
|
<array>
|
||||||
|
<dict>
|
||||||
|
<key>REGULAR_EXPRESSION</key>
|
||||||
|
<false/>
|
||||||
|
<key>STRING</key>
|
||||||
|
<string>Resources Disabled</string>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>PROTECTED</key>
|
||||||
|
<true/>
|
||||||
|
<key>PROXY_NAME</key>
|
||||||
|
<string>Remove Resources Disabled folders</string>
|
||||||
|
<key>PROXY_TOOLTIP</key>
|
||||||
|
<string>Remove "Resources Disabled" folders.</string>
|
||||||
|
<key>STATE</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
<dict>
|
||||||
|
<key>SEPARATOR</key>
|
||||||
|
<true/>
|
||||||
|
</dict>
|
||||||
|
</array>
|
||||||
|
<key>NAME</key>
|
||||||
|
<string>TDengine-client-3.0.1.4-macOS-arm64</string>
|
||||||
|
<key>PAYLOAD_ONLY</key>
|
||||||
|
<false/>
|
||||||
|
<key>TREAT_MISSING_PRESENTATION_DOCUMENTS_AS_WARNING</key>
|
||||||
|
<false/>
|
||||||
|
</dict>
|
||||||
|
</dict>
|
||||||
|
<key>TYPE</key>
|
||||||
|
<integer>0</integer>
|
||||||
|
<key>VERSION</key>
|
||||||
|
<integer>2</integer>
|
||||||
|
</dict>
|
||||||
|
</plist>
|
|
@ -3,7 +3,7 @@
|
||||||
<plist version="1.0">
|
<plist version="1.0">
|
||||||
<dict>
|
<dict>
|
||||||
<key>Label</key>
|
<key>Label</key>
|
||||||
<string>taosd</string>
|
<string>com.tdengine.taosd</string>
|
||||||
<key>ProgramArguments</key>
|
<key>ProgramArguments</key>
|
||||||
<array>
|
<array>
|
||||||
<string>/usr/local/bin/taosd</string>
|
<string>/usr/local/bin/taosd</string>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
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 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.
|
||||||
|
|
||||||
To configure TDengine : edit /etc/taos/taos.cfg
|
To configure TDengine : edit /etc/taos/taos.cfg
|
||||||
To start service : launchctl start taosd
|
To start service : launchctl start com.tdengine.taosd
|
||||||
To access TDengine : use taos in shell
|
To access TDengine : use taos in shell
|
|
@ -615,7 +615,7 @@ function update_TDengine() {
|
||||||
if [ "$osType" != "Darwin" ]; then
|
if [ "$osType" != "Darwin" ]; then
|
||||||
echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}"
|
||||||
else
|
else
|
||||||
echo -e "${GREEN_DARK}To start service ${NC}: launchctl start ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start service ${NC}: launchctl start com.tdengine.taosd${NC}"
|
||||||
fi
|
fi
|
||||||
[ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${installDir}/bin/taosadapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: taosadapter &${NC}"
|
echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: taosadapter &${NC}"
|
||||||
|
@ -666,7 +666,7 @@ function install_TDengine() {
|
||||||
if [ "$osType" != "Darwin" ]; then
|
if [ "$osType" != "Darwin" ]; then
|
||||||
echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start ${productName} ${NC}: ${serverName}${NC}"
|
||||||
else
|
else
|
||||||
echo -e "${GREEN_DARK}To start service ${NC}: launchctl start ${serverName}${NC}"
|
echo -e "${GREEN_DARK}To start service ${NC}: launchctl start com.tdengine.taosd${NC}"
|
||||||
fi
|
fi
|
||||||
[ -f ${installDir}/bin/taosadapter ] && \
|
[ -f ${installDir}/bin/taosadapter ] && \
|
||||||
echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: taosadapter &${NC}"
|
echo -e "${GREEN_DARK}To start Taos Adapter ${NC}: taosadapter &${NC}"
|
||||||
|
|
|
@ -18,6 +18,7 @@ if [ "$osType" != "Darwin" ]; then
|
||||||
script_dir=$(dirname $(readlink -f "$0"))
|
script_dir=$(dirname $(readlink -f "$0"))
|
||||||
verNumber=""
|
verNumber=""
|
||||||
lib_file_ext="so"
|
lib_file_ext="so"
|
||||||
|
lib_file_ext_1="so.1"
|
||||||
|
|
||||||
bin_link_dir="/usr/bin"
|
bin_link_dir="/usr/bin"
|
||||||
lib_link_dir="/usr/lib"
|
lib_link_dir="/usr/lib"
|
||||||
|
@ -29,6 +30,7 @@ else
|
||||||
script_dir=${source_dir}/packaging/tools
|
script_dir=${source_dir}/packaging/tools
|
||||||
verNumber=`ls tdengine/driver | grep -E "libtaos\.[0-9]\.[0-9]" | sed "s/libtaos.//g" | sed "s/.dylib//g" | head -n 1`
|
verNumber=`ls tdengine/driver | grep -E "libtaos\.[0-9]\.[0-9]" | sed "s/libtaos.//g" | sed "s/.dylib//g" | head -n 1`
|
||||||
lib_file_ext="dylib"
|
lib_file_ext="dylib"
|
||||||
|
lib_file_ext_1="1.dylib"
|
||||||
|
|
||||||
bin_link_dir="/usr/local/bin"
|
bin_link_dir="/usr/local/bin"
|
||||||
lib_link_dir="/usr/local/lib"
|
lib_link_dir="/usr/local/lib"
|
||||||
|
@ -134,14 +136,14 @@ function install_lib() {
|
||||||
[ -f ${lib_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.${lib_file_ext} || :
|
[ -f ${lib_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.${lib_file_ext} || :
|
||||||
[ -f ${lib64_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.${lib_file_ext} || :
|
[ -f ${lib64_link_dir}/libtaosws.${lib_file_ext} ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.${lib_file_ext} || :
|
||||||
|
|
||||||
${csudo}ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.so.1
|
${csudo}ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.${lib_file_ext_1}
|
||||||
${csudo}ln -s ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so
|
${csudo}ln -s ${lib_link_dir}/libtaos.${lib_file_ext_1} ${lib_link_dir}/libtaos.${lib_file_ext}
|
||||||
|
|
||||||
[ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib_link_dir}/libtaosws.${lib_file_ext} ||:
|
[ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib_link_dir}/libtaosws.${lib_file_ext} ||:
|
||||||
|
|
||||||
if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then
|
if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.${lib_file_ext} ]]; then
|
||||||
${csudo}ln -s ${lib_dir}/libtaos.* ${lib64_link_dir}/libtaos.so.1 || :
|
${csudo}ln -s ${lib_dir}/libtaos.* ${lib64_link_dir}/libtaos.${lib_file_ext_1} || :
|
||||||
${csudo}ln -s ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || :
|
${csudo}ln -s ${lib64_link_dir}/libtaos.${lib_file_ext_1} ${lib64_link_dir}/libtaos.${lib_file_ext} || :
|
||||||
|
|
||||||
[ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib64_link_dir}/libtaosws.${lib_file_ext} || :
|
[ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib64_link_dir}/libtaosws.${lib_file_ext} || :
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -117,7 +117,7 @@ function clean_local_bin() {
|
||||||
function clean_lib() {
|
function clean_lib() {
|
||||||
# Remove link
|
# Remove link
|
||||||
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
||||||
[ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || :
|
[ -f ${lib_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.* || :
|
||||||
|
|
||||||
${csudo}rm -f ${lib64_link_dir}/libtaos.* || :
|
${csudo}rm -f ${lib64_link_dir}/libtaos.* || :
|
||||||
[ -f ${lib64_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.* || :
|
[ -f ${lib64_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.* || :
|
||||||
|
|
|
@ -19,6 +19,13 @@ target_link_libraries(
|
||||||
PRIVATE os util common transport nodes parser command planner catalog scheduler function qcom
|
PRIVATE os util common transport nodes parser command planner catalog scheduler function qcom
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if(TD_DARWIN_ARM64)
|
||||||
|
target_link_libraries(
|
||||||
|
taos
|
||||||
|
PRIVATE "-arch x86_64"
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
if(TD_WINDOWS)
|
if(TD_WINDOWS)
|
||||||
INCLUDE_DIRECTORIES(jni/windows)
|
INCLUDE_DIRECTORIES(jni/windows)
|
||||||
INCLUDE_DIRECTORIES(jni/windows/win32)
|
INCLUDE_DIRECTORIES(jni/windows/win32)
|
||||||
|
|
|
@ -1036,30 +1036,38 @@ static int32_t asyncExecSchQuery(SRequestObj* pRequest, SQuery* pQuery, SMetaDat
|
||||||
pRequest->type = pQuery->msgType;
|
pRequest->type = pQuery->msgType;
|
||||||
|
|
||||||
SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad));
|
SArray* pMnodeList = taosArrayInit(4, sizeof(SQueryNodeLoad));
|
||||||
|
|
||||||
SPlanContext cxt = {.queryId = pRequest->requestId,
|
SPlanContext cxt = {.queryId = pRequest->requestId,
|
||||||
.acctId = pRequest->pTscObj->acctId,
|
.acctId = pRequest->pTscObj->acctId,
|
||||||
.mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp),
|
.mgmtEpSet = getEpSet_s(&pRequest->pTscObj->pAppInfo->mgmtEp),
|
||||||
.pAstRoot = pQuery->pRoot,
|
.pAstRoot = pQuery->pRoot,
|
||||||
.showRewrite = pQuery->showRewrite,
|
.showRewrite = pQuery->showRewrite,
|
||||||
.pMsg = pRequest->msgBuf,
|
.pMsg = pRequest->msgBuf,
|
||||||
.msgLen = ERROR_MSG_BUF_DEFAULT_SIZE,
|
.msgLen = ERROR_MSG_BUF_DEFAULT_SIZE,
|
||||||
.pUser = pRequest->pTscObj->user,
|
.pUser = pRequest->pTscObj->user,
|
||||||
.sysInfo = pRequest->pTscObj->sysInfo,
|
.sysInfo = pRequest->pTscObj->sysInfo,
|
||||||
.allocatorId = pRequest->allocatorRefId};
|
.allocatorId = pRequest->allocatorRefId};
|
||||||
SQueryPlan* pDag = NULL;
|
|
||||||
int32_t code = qCreateQueryPlan(&cxt, &pDag, pMnodeList);
|
SAppInstInfo* pAppInfo = getAppInfo(pRequest);
|
||||||
if (code) {
|
SQueryPlan* pDag = NULL;
|
||||||
tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code),
|
|
||||||
pRequest->requestId);
|
int64_t st = taosGetTimestampUs();
|
||||||
} else {
|
int32_t code = qCreateQueryPlan(&cxt, &pDag, pMnodeList);
|
||||||
pRequest->body.subplanNum = pDag->numOfSubplans;
|
if (code) {
|
||||||
|
tscError("0x%" PRIx64 " failed to create query plan, code:%s 0x%" PRIx64, pRequest->self, tstrerror(code),
|
||||||
|
pRequest->requestId);
|
||||||
|
} else {
|
||||||
|
pRequest->body.subplanNum = pDag->numOfSubplans;
|
||||||
|
}
|
||||||
|
|
||||||
|
pRequest->metric.planEnd = taosGetTimestampUs();
|
||||||
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
|
tscDebug("0x%" PRIx64 " create query plan success, elapsed time:%.2f ms, 0x%" PRIx64, pRequest->self,
|
||||||
|
(pRequest->metric.planEnd - st)/1000.0, pRequest->requestId);
|
||||||
}
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
|
||||||
pRequest->metric.planEnd = taosGetTimestampUs();
|
SArray* pNodeList = NULL;
|
||||||
|
buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
|
||||||
if (TSDB_CODE_SUCCESS == code && !pRequest->validateOnly) {
|
|
||||||
SArray* pNodeList = NULL;
|
|
||||||
buildAsyncExecNodeList(pRequest, &pNodeList, pMnodeList, pResultMeta);
|
|
||||||
|
|
||||||
SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter,
|
SRequestConnInfo conn = {.pTrans = getAppInfo(pRequest)->pTransporter,
|
||||||
.requestId = pRequest->requestId,
|
.requestId = pRequest->requestId,
|
||||||
|
|
|
@ -221,7 +221,9 @@ void taos_kill_query(TAOS *taos) {
|
||||||
|
|
||||||
int64_t rid = *(int64_t *)taos;
|
int64_t rid = *(int64_t *)taos;
|
||||||
STscObj *pTscObj = acquireTscObj(rid);
|
STscObj *pTscObj = acquireTscObj(rid);
|
||||||
stopAllRequests(pTscObj->pRequests);
|
if (pTscObj) {
|
||||||
|
stopAllRequests(pTscObj->pRequests);
|
||||||
|
}
|
||||||
releaseTscObj(rid);
|
releaseTscObj(rid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2477,11 +2477,12 @@ static void smlInsertCallback(void *param, void *res, int32_t code) {
|
||||||
} else {
|
} else {
|
||||||
pParam->request->body.resInfo.numOfRows += info->affectedRows;
|
pParam->request->body.resInfo.numOfRows += info->affectedRows;
|
||||||
}
|
}
|
||||||
|
// unlock
|
||||||
|
taosThreadSpinUnlock(&pParam->lock);
|
||||||
|
|
||||||
if (pParam->cnt == pParam->total) {
|
if (pParam->cnt == pParam->total) {
|
||||||
tsem_post(&pParam->sem);
|
tsem_post(&pParam->sem);
|
||||||
}
|
}
|
||||||
taosThreadSpinUnlock(&pParam->lock);
|
|
||||||
// unlock
|
|
||||||
uDebug("SML:0x%" PRIx64 " insert finished, code: %d, rows: %d, total: %d", info->id, code, rows, info->affectedRows);
|
uDebug("SML:0x%" PRIx64 " insert finished, code: %d, rows: %d, total: %d", info->id, code, rows, info->affectedRows);
|
||||||
info->cost.endTime = taosGetTimestampUs();
|
info->cost.endTime = taosGetTimestampUs();
|
||||||
info->cost.code = code;
|
info->cost.code = code;
|
||||||
|
|
|
@ -972,6 +972,8 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
||||||
req.topicNames = taosArrayInit(sz, sizeof(void*));
|
req.topicNames = taosArrayInit(sz, sizeof(void*));
|
||||||
if (req.topicNames == NULL) goto FAIL;
|
if (req.topicNames == NULL) goto FAIL;
|
||||||
|
|
||||||
|
tscDebug("call tmq subscribe, consumer: %ld, topic num %d", tmq->consumerId, sz);
|
||||||
|
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
for (int32_t i = 0; i < sz; i++) {
|
||||||
char* topic = taosArrayGetP(container, i);
|
char* topic = taosArrayGetP(container, i);
|
||||||
|
|
||||||
|
@ -1297,7 +1299,8 @@ int32_t tmqAskEpCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
pParam->code = code;
|
pParam->code = code;
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
tscError("consumer:%" PRId64 ", get topic endpoint error, not ready, wait:%d", tmq->consumerId, pParam->async);
|
tscError("consumer:%" PRId64 ", get topic endpoint error, not ready, wait:%d, code %x", tmq->consumerId,
|
||||||
|
pParam->async, code);
|
||||||
goto END;
|
goto END;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -52,15 +52,15 @@ void printResult(TAOS_RES* pRes) {
|
||||||
int32_t n = 0;
|
int32_t n = 0;
|
||||||
char str[512] = {0};
|
char str[512] = {0};
|
||||||
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
while ((pRow = taos_fetch_row(pRes)) != NULL) {
|
||||||
int32_t* length = taos_fetch_lengths(pRes);
|
// int32_t* length = taos_fetch_lengths(pRes);
|
||||||
for (int32_t i = 0; i < numOfFields; ++i) {
|
// for(int32_t i = 0; i < numOfFields; ++i) {
|
||||||
printf("(%d):%d ", i, length[i]);
|
// printf("(%d):%d " , i, length[i]);
|
||||||
}
|
// }
|
||||||
printf("\n");
|
// printf("\n");
|
||||||
|
//
|
||||||
int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
// int32_t code = taos_print_row(str, pRow, pFields, numOfFields);
|
||||||
printf("%s\n", str);
|
// printf("%s\n", str);
|
||||||
memset(str, 0, sizeof(str));
|
// memset(str, 0, sizeof(str));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -102,17 +102,6 @@ void queryCallback(void* param, void* res, int32_t code) {
|
||||||
taos_fetch_raw_block_a(res, fetchCallback, param);
|
taos_fetch_raw_block_a(res, fetchCallback, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
void queryCallback1(void* param, void* res, int32_t code) {
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
printf("failed to execute, reason:%s\n", taos_errstr(res));
|
|
||||||
}
|
|
||||||
|
|
||||||
taos_free_result(res);
|
|
||||||
|
|
||||||
printf("exec query:\n");
|
|
||||||
taos_query_a(param, "select * from tm1", queryCallback, param);
|
|
||||||
}
|
|
||||||
|
|
||||||
void createNewTable(TAOS* pConn, int32_t index) {
|
void createNewTable(TAOS* pConn, int32_t index) {
|
||||||
char str[1024] = {0};
|
char str[1024] = {0};
|
||||||
sprintf(str, "create table tu%d using st2 tags(%d)", index, index);
|
sprintf(str, "create table tu%d using st2 tags(%d)", index, index);
|
||||||
|
@ -123,7 +112,7 @@ void createNewTable(TAOS* pConn, int32_t index) {
|
||||||
}
|
}
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
for (int32_t i = 0; i < 3280; i += 20) {
|
for(int32_t i = 0; i < 10000; i += 20) {
|
||||||
char sql[1024] = {0};
|
char sql[1024] = {0};
|
||||||
sprintf(sql,
|
sprintf(sql,
|
||||||
"insert into tu%d values(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
|
"insert into tu%d values(now+%da, %d)(now+%da, %d)(now+%da, %d)(now+%da, %d)"
|
||||||
|
@ -141,10 +130,49 @@ void createNewTable(TAOS* pConn, int32_t index) {
|
||||||
taos_free_result(p);
|
taos_free_result(p);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *queryThread(void *arg) {
|
||||||
|
TAOS* pConn = taos_connect("192.168.0.209", "root", "taosdata", NULL, 0);
|
||||||
|
if (pConn == NULL) {
|
||||||
|
printf("failed to connect to db, reason:%s", taos_errstr(pConn));
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t el = 0;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < 5000000; ++i) {
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
TAOS_RES* pRes = taos_query(pConn,
|
||||||
|
"SELECT _wstart as ts,max(usage_user) FROM benchmarkcpu.host_49 WHERE ts >= 1451618560000 AND ts < 1451622160000 INTERVAL(1m) ;");
|
||||||
|
if (taos_errno(pRes) != 0) {
|
||||||
|
printf("failed, reason:%s\n", taos_errstr(pRes));
|
||||||
|
} else {
|
||||||
|
printResult(pRes);
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_free_result(pRes);
|
||||||
|
el += (taosGetTimestampUs() - st);
|
||||||
|
if (i % 1000 == 0 && i != 0) {
|
||||||
|
printf("total:%d, avg time:%.2fms\n", i, el/(double)(i*1000));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
taos_close(pConn);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t numOfThreads = 1;
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
testing::InitGoogleTest(&argc, argv);
|
testing::InitGoogleTest(&argc, argv);
|
||||||
|
if (argc > 1) {
|
||||||
|
numOfThreads = atoi(argv[1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
numOfThreads = TMAX(numOfThreads, 1);
|
||||||
|
printf("the runing threads is:%d", numOfThreads);
|
||||||
|
|
||||||
return RUN_ALL_TESTS();
|
return RUN_ALL_TESTS();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -664,7 +692,6 @@ TEST(testCase, insert_test) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
||||||
TEST(testCase, projection_query_tables) {
|
TEST(testCase, projection_query_tables) {
|
||||||
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
TAOS* pConn = taos_connect("localhost", "root", "taosdata", NULL, 0);
|
||||||
|
@ -676,13 +703,14 @@ TEST(testCase, projection_query_tables) {
|
||||||
// }
|
// }
|
||||||
// taos_free_result(pRes);
|
// taos_free_result(pRes);
|
||||||
|
|
||||||
TAOS_RES* pRes = taos_query(pConn, "use abc1");
|
TAOS_RES* pRes = taos_query(pConn, "use benchmarkcpu");
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)");
|
pRes = taos_query(pConn, "create stable st1 (ts timestamp, k int) tags(a int)");
|
||||||
if (taos_errno(pRes) != 0) {
|
if (taos_errno(pRes) != 0) {
|
||||||
printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
printf("failed to create table tu, reason:%s\n", taos_errstr(pRes));
|
||||||
}
|
}
|
||||||
|
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
|
|
||||||
pRes = taos_query(pConn, "create stable st2 (ts timestamp, k int) tags(a int)");
|
pRes = taos_query(pConn, "create stable st2 (ts timestamp, k int) tags(a int)");
|
||||||
|
@ -722,6 +750,16 @@ TEST(testCase, projection_query_tables) {
|
||||||
taos_free_result(pRes);
|
taos_free_result(pRes);
|
||||||
taos_close(pConn);
|
taos_close(pConn);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
TEST(testCase, tsbs_perf_test) {
|
||||||
|
TdThread qid[20] = {0};
|
||||||
|
|
||||||
|
for(int32_t i = 0; i < numOfThreads; ++i) {
|
||||||
|
taosThreadCreate(&qid[i], NULL, queryThread, NULL);
|
||||||
|
}
|
||||||
|
getchar();
|
||||||
|
}
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
TEST(testCase, projection_query_stables) {
|
TEST(testCase, projection_query_stables) {
|
||||||
|
|
|
@ -90,6 +90,7 @@ bool tsSmlDataFormat = false;
|
||||||
|
|
||||||
// query
|
// query
|
||||||
int32_t tsQueryPolicy = 1;
|
int32_t tsQueryPolicy = 1;
|
||||||
|
int32_t tsQueryRspPolicy = 0;
|
||||||
int32_t tsQuerySmaOptimize = 0;
|
int32_t tsQuerySmaOptimize = 0;
|
||||||
int32_t tsQueryRsmaTolerance = 1000; // the tolerance time (ms) to judge from which level to query rsma data.
|
int32_t tsQueryRsmaTolerance = 1000; // the tolerance time (ms) to judge from which level to query rsma data.
|
||||||
bool tsQueryPlannerTrace = false;
|
bool tsQueryPlannerTrace = false;
|
||||||
|
@ -350,6 +351,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddInt32(pCfg, "countAlwaysReturnValue", tsCountAlwaysReturnValue, 0, 1, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "countAlwaysReturnValue", tsCountAlwaysReturnValue, 0, 1, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "queryBufferSize", tsQueryBufferSize, -1, 500000000000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "queryBufferSize", tsQueryBufferSize, -1, 500000000000, 0) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "printAuth", tsPrintAuth, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "printAuth", tsPrintAuth, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "queryRspPolicy", tsQueryRspPolicy, 0, 1, 0) != 0) return -1;
|
||||||
|
|
||||||
if (cfgAddInt32(pCfg, "multiProcess", tsMultiProcess, 0, 2, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "multiProcess", tsMultiProcess, 0, 2, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "mnodeShmSize", tsMnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "mnodeShmSize", tsMnodeShmSize, TSDB_MAX_MSG_SIZE * 2 + 1024, INT32_MAX, 0) != 0) return -1;
|
||||||
|
@ -728,6 +730,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
tsMonitorPort = (uint16_t)cfgGetItem(pCfg, "monitorPort")->i32;
|
tsMonitorPort = (uint16_t)cfgGetItem(pCfg, "monitorPort")->i32;
|
||||||
tsMonitorMaxLogs = cfgGetItem(pCfg, "monitorMaxLogs")->i32;
|
tsMonitorMaxLogs = cfgGetItem(pCfg, "monitorMaxLogs")->i32;
|
||||||
tsMonitorComp = cfgGetItem(pCfg, "monitorComp")->bval;
|
tsMonitorComp = cfgGetItem(pCfg, "monitorComp")->bval;
|
||||||
|
tsQueryRspPolicy = cfgGetItem(pCfg, "queryRspPolicy")->i32;
|
||||||
|
|
||||||
tsEnableTelem = cfgGetItem(pCfg, "telemetryReporting")->bval;
|
tsEnableTelem = cfgGetItem(pCfg, "telemetryReporting")->bval;
|
||||||
tsTelemInterval = cfgGetItem(pCfg, "telemetryInterval")->i32;
|
tsTelemInterval = cfgGetItem(pCfg, "telemetryInterval")->i32;
|
||||||
|
|
|
@ -41,8 +41,8 @@ typedef struct SMnodeMgmt {
|
||||||
} SMnodeMgmt;
|
} SMnodeMgmt;
|
||||||
|
|
||||||
// mmFile.c
|
// mmFile.c
|
||||||
int32_t mmReadFile(SMnodeMgmt *pMgmt, SReplica *pReplica, bool *pDeployed);
|
int32_t mmReadFile(const char *path, SMnodeOpt *pOption);
|
||||||
int32_t mmWriteFile(SMnodeMgmt *pMgmt, const SReplica *pReplica, bool deployed);
|
int32_t mmWriteFile(const char *path, const SMnodeOpt *pOption);
|
||||||
|
|
||||||
// mmHandle.c
|
// mmHandle.c
|
||||||
SArray *mmGetMsgHandles();
|
SArray *mmGetMsgHandles();
|
||||||
|
|
|
@ -16,7 +16,7 @@
|
||||||
#define _DEFAULT_SOURCE
|
#define _DEFAULT_SOURCE
|
||||||
#include "mmInt.h"
|
#include "mmInt.h"
|
||||||
|
|
||||||
int32_t mmReadFile(SMnodeMgmt *pMgmt, SReplica *pReplica, bool *pDeployed) {
|
int32_t mmReadFile(const char *path, SMnodeOpt *pOption) {
|
||||||
int32_t code = TSDB_CODE_INVALID_JSON_FORMAT;
|
int32_t code = TSDB_CODE_INVALID_JSON_FORMAT;
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
int32_t maxLen = 4096;
|
int32_t maxLen = 4096;
|
||||||
|
@ -25,7 +25,7 @@ int32_t mmReadFile(SMnodeMgmt *pMgmt, SReplica *pReplica, bool *pDeployed) {
|
||||||
char file[PATH_MAX] = {0};
|
char file[PATH_MAX] = {0};
|
||||||
TdFilePtr pFile = NULL;
|
TdFilePtr pFile = NULL;
|
||||||
|
|
||||||
snprintf(file, sizeof(file), "%s%smnode.json", pMgmt->path, TD_DIRSEP);
|
snprintf(file, sizeof(file), "%s%smnode.json", path, TD_DIRSEP);
|
||||||
pFile = taosOpenFile(file, TD_FILE_READ);
|
pFile = taosOpenFile(file, TD_FILE_READ);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
code = 0;
|
code = 0;
|
||||||
|
@ -50,38 +50,69 @@ int32_t mmReadFile(SMnodeMgmt *pMgmt, SReplica *pReplica, bool *pDeployed) {
|
||||||
dError("failed to read %s since deployed not found", file);
|
dError("failed to read %s since deployed not found", file);
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
*pDeployed = deployed->valueint;
|
pOption->deploy = deployed->valueint;
|
||||||
|
|
||||||
cJSON *id = cJSON_GetObjectItem(root, "id");
|
cJSON *selfIndex = cJSON_GetObjectItem(root, "selfIndex");
|
||||||
if (id) {
|
if (selfIndex) {
|
||||||
if (id->type != cJSON_Number) {
|
if (selfIndex->type != cJSON_Number) {
|
||||||
dError("failed to read %s since id not found", file);
|
dError("failed to read %s since selfIndex not found", file);
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (pReplica) {
|
pOption->selfIndex = selfIndex->valueint;
|
||||||
pReplica->id = id->valueint;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
cJSON *fqdn = cJSON_GetObjectItem(root, "fqdn");
|
cJSON *replicas = cJSON_GetObjectItem(root, "replicas");
|
||||||
if (fqdn) {
|
if (replicas) {
|
||||||
if (fqdn->type != cJSON_String || fqdn->valuestring == NULL) {
|
if (replicas->type != cJSON_Array) {
|
||||||
dError("failed to read %s since fqdn not found", file);
|
dError("failed to read %s since replicas not found", file);
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (pReplica) {
|
|
||||||
tstrncpy(pReplica->fqdn, fqdn->valuestring, TSDB_FQDN_LEN);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
cJSON *port = cJSON_GetObjectItem(root, "port");
|
int32_t numOfReplicas = cJSON_GetArraySize(replicas);
|
||||||
if (port) {
|
if (numOfReplicas <= 0) {
|
||||||
if (port->type != cJSON_Number) {
|
dError("failed to read %s since numOfReplicas:%d invalid", file, numOfReplicas);
|
||||||
dError("failed to read %s since port not found", file);
|
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (pReplica) {
|
pOption->numOfReplicas = numOfReplicas;
|
||||||
pReplica->port = (uint16_t)port->valueint;
|
|
||||||
|
for (int32_t i = 0; i < numOfReplicas; ++i) {
|
||||||
|
SReplica *pReplica = pOption->replicas + i;
|
||||||
|
|
||||||
|
cJSON *replica = cJSON_GetArrayItem(replicas, i);
|
||||||
|
if (replica == NULL) break;
|
||||||
|
|
||||||
|
cJSON *id = cJSON_GetObjectItem(replica, "id");
|
||||||
|
if (id) {
|
||||||
|
if (id->type != cJSON_Number) {
|
||||||
|
dError("failed to read %s since id not found", file);
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
if (pReplica) {
|
||||||
|
pReplica->id = id->valueint;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON *fqdn = cJSON_GetObjectItem(replica, "fqdn");
|
||||||
|
if (fqdn) {
|
||||||
|
if (fqdn->type != cJSON_String || fqdn->valuestring == NULL) {
|
||||||
|
dError("failed to read %s since fqdn not found", file);
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
if (pReplica) {
|
||||||
|
tstrncpy(pReplica->fqdn, fqdn->valuestring, TSDB_FQDN_LEN);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
cJSON *port = cJSON_GetObjectItem(replica, "port");
|
||||||
|
if (port) {
|
||||||
|
if (port->type != cJSON_Number) {
|
||||||
|
dError("failed to read %s since port not found", file);
|
||||||
|
goto _OVER;
|
||||||
|
}
|
||||||
|
if (pReplica) {
|
||||||
|
pReplica->port = (uint16_t)port->valueint;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -92,18 +123,18 @@ _OVER:
|
||||||
if (root != NULL) cJSON_Delete(root);
|
if (root != NULL) cJSON_Delete(root);
|
||||||
if (pFile != NULL) taosCloseFile(&pFile);
|
if (pFile != NULL) taosCloseFile(&pFile);
|
||||||
if (code == 0) {
|
if (code == 0) {
|
||||||
dDebug("succcessed to read file %s, deployed:%d", file, *pDeployed);
|
dDebug("succcessed to read file %s, deployed:%d", file, pOption->deploy);
|
||||||
}
|
}
|
||||||
|
|
||||||
terrno = code;
|
terrno = code;
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mmWriteFile(SMnodeMgmt *pMgmt, const SReplica *pReplica, bool deployed) {
|
int32_t mmWriteFile(const char *path, const SMnodeOpt *pOption) {
|
||||||
char file[PATH_MAX] = {0};
|
char file[PATH_MAX] = {0};
|
||||||
char realfile[PATH_MAX] = {0};
|
char realfile[PATH_MAX] = {0};
|
||||||
snprintf(file, sizeof(file), "%s%smnode.json.bak", pMgmt->path, TD_DIRSEP);
|
snprintf(file, sizeof(file), "%s%smnode.json.bak", path, TD_DIRSEP);
|
||||||
snprintf(realfile, sizeof(realfile), "%s%smnode.json", pMgmt->path, TD_DIRSEP);
|
snprintf(realfile, sizeof(realfile), "%s%smnode.json", path, TD_DIRSEP);
|
||||||
|
|
||||||
TdFilePtr pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC);
|
TdFilePtr pFile = taosOpenFile(file, TD_FILE_CREATE | TD_FILE_WRITE | TD_FILE_TRUNC);
|
||||||
if (pFile == NULL) {
|
if (pFile == NULL) {
|
||||||
|
@ -117,12 +148,25 @@ int32_t mmWriteFile(SMnodeMgmt *pMgmt, const SReplica *pReplica, bool deployed)
|
||||||
char *content = taosMemoryCalloc(1, maxLen + 1);
|
char *content = taosMemoryCalloc(1, maxLen + 1);
|
||||||
|
|
||||||
len += snprintf(content + len, maxLen - len, "{\n");
|
len += snprintf(content + len, maxLen - len, "{\n");
|
||||||
if (pReplica != NULL && pReplica->id > 0) {
|
if (pOption->deploy && pOption->numOfReplicas > 0) {
|
||||||
len += snprintf(content + len, maxLen - len, " \"id\": %d,\n", pReplica->id);
|
len += snprintf(content + len, maxLen - len, " \"selfIndex\": %d,\n", pOption->selfIndex);
|
||||||
len += snprintf(content + len, maxLen - len, " \"fqdn\": \"%s\",\n", pReplica->fqdn);
|
len += snprintf(content + len, maxLen - len, " \"replicas\": [{\n");
|
||||||
len += snprintf(content + len, maxLen - len, " \"port\": %u\n,", pReplica->port);
|
|
||||||
|
for (int32_t i = 0; i < pOption->numOfReplicas; ++i) {
|
||||||
|
const SReplica *pReplica = pOption->replicas + i;
|
||||||
|
if (pReplica != NULL && pReplica->id > 0) {
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"id\": %d,\n", pReplica->id);
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"fqdn\": \"%s\",\n", pReplica->fqdn);
|
||||||
|
len += snprintf(content + len, maxLen - len, " \"port\": %u\n", pReplica->port);
|
||||||
|
}
|
||||||
|
if (i < pOption->numOfReplicas - 1) {
|
||||||
|
len += snprintf(content + len, maxLen - len, " },{\n");
|
||||||
|
} else {
|
||||||
|
len += snprintf(content + len, maxLen - len, " }],\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
len += snprintf(content + len, maxLen - len, " \"deployed\": %d\n", deployed);
|
len += snprintf(content + len, maxLen - len, " \"deployed\": %d\n", pOption->deploy);
|
||||||
len += snprintf(content + len, maxLen - len, "}\n");
|
len += snprintf(content + len, maxLen - len, "}\n");
|
||||||
|
|
||||||
taosWriteFile(pFile, content, len);
|
taosWriteFile(pFile, content, len);
|
||||||
|
@ -136,6 +180,6 @@ int32_t mmWriteFile(SMnodeMgmt *pMgmt, const SReplica *pReplica, bool deployed)
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
dDebug("successed to write %s, deployed:%d", realfile, deployed);
|
dDebug("successed to write %s, deployed:%d", realfile, pOption->deploy);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -80,18 +80,21 @@ int32_t mmProcessCreateReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (createReq.replica != 1) {
|
SMnodeOpt option = {.deploy = true, .numOfReplicas = createReq.replica, .selfIndex = -1};
|
||||||
|
memcpy(option.replicas, createReq.replicas, sizeof(createReq.replicas));
|
||||||
|
for (int32_t i = 0; i < option.numOfReplicas; ++i) {
|
||||||
|
if (createReq.replicas[i].id == pInput->pData->dnodeId) {
|
||||||
|
option.selfIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (option.selfIndex == -1) {
|
||||||
terrno = TSDB_CODE_INVALID_OPTION;
|
terrno = TSDB_CODE_INVALID_OPTION;
|
||||||
dGError("failed to create mnode since %s", terrstr());
|
dGError("failed to create mnode since %s, selfIndex is -1", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool deployed = true;
|
if (mmWriteFile(pInput->path, &option) != 0) {
|
||||||
|
|
||||||
SMnodeMgmt mgmt = {0};
|
|
||||||
mgmt.path = pInput->path;
|
|
||||||
mgmt.name = pInput->name;
|
|
||||||
if (mmWriteFile(&mgmt, &createReq.replicas[0], deployed) != 0) {
|
|
||||||
dGError("failed to write mnode file since %s", terrstr());
|
dGError("failed to write mnode file since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -113,12 +116,8 @@ int32_t mmProcessDropReq(const SMgmtInputOpt *pInput, SRpcMsg *pMsg) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool deployed = false;
|
SMnodeOpt option = {.deploy = false};
|
||||||
|
if (mmWriteFile(pInput->path, &option) != 0) {
|
||||||
SMnodeMgmt mgmt = {0};
|
|
||||||
mgmt.path = pInput->path;
|
|
||||||
mgmt.name = pInput->name;
|
|
||||||
if (mmWriteFile(&mgmt, NULL, deployed) != 0) {
|
|
||||||
dGError("failed to write mnode file since %s", terrstr());
|
dGError("failed to write mnode file since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -207,7 +206,6 @@ SArray *mmGetMsgHandles() {
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_HEARTBEAT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_HEARTBEAT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_STATUS, 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_SYSTABLE_RETRIEVE, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
// if (dmSetMgmtHandle(pArray, TDMT_MND_GRANT, mmPutMsgToWriteQueue, 0) == NULL) goto _OVER;
|
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_AUTH, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_SHOW_VARIABLES, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_SHOW_VARIABLES, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
if (dmSetMgmtHandle(pArray, TDMT_MND_SERVER_VERSION, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
if (dmSetMgmtHandle(pArray, TDMT_MND_SERVER_VERSION, mmPutMsgToReadQueue, 0) == NULL) goto _OVER;
|
||||||
|
|
|
@ -25,38 +25,35 @@ static bool mmDeployRequired(const SMgmtInputOpt *pInput) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mmRequire(const SMgmtInputOpt *pInput, bool *required) {
|
static int32_t mmRequire(const SMgmtInputOpt *pInput, bool *required) {
|
||||||
SMnodeMgmt mgmt = {0};
|
SMnodeOpt option = {0};
|
||||||
mgmt.path = pInput->path;
|
if (mmReadFile(pInput->path, &option) != 0) {
|
||||||
if (mmReadFile(&mgmt, NULL, required) != 0) {
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(*required)) {
|
if (!option.deploy) {
|
||||||
*required = mmDeployRequired(pInput);
|
*required = mmDeployRequired(pInput);
|
||||||
|
} else {
|
||||||
|
*required = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mmBuildOptionForDeploy(SMnodeMgmt *pMgmt, const SMgmtInputOpt *pInput, SMnodeOpt *pOption) {
|
static void mmBuildOptionForDeploy(SMnodeMgmt *pMgmt, const SMgmtInputOpt *pInput, SMnodeOpt *pOption) {
|
||||||
pOption->standby = false;
|
|
||||||
pOption->deploy = true;
|
pOption->deploy = true;
|
||||||
pOption->msgCb = pMgmt->msgCb;
|
pOption->msgCb = pMgmt->msgCb;
|
||||||
pOption->dnodeId = pMgmt->pData->dnodeId;
|
pOption->dnodeId = pMgmt->pData->dnodeId;
|
||||||
pOption->replica.id = 1;
|
pOption->selfIndex = 0;
|
||||||
pOption->replica.port = tsServerPort;
|
pOption->numOfReplicas = 1;
|
||||||
tstrncpy(pOption->replica.fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
pOption->replicas[0].id = 1;
|
||||||
|
pOption->replicas[0].port = tsServerPort;
|
||||||
|
tstrncpy(pOption->replicas[0].fqdn, tsLocalFqdn, TSDB_FQDN_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mmBuildOptionForOpen(SMnodeMgmt *pMgmt, const SReplica *pReplica, SMnodeOpt *pOption) {
|
static void mmBuildOptionForOpen(SMnodeMgmt *pMgmt, SMnodeOpt *pOption) {
|
||||||
pOption->standby = false;
|
|
||||||
pOption->deploy = false;
|
pOption->deploy = false;
|
||||||
pOption->msgCb = pMgmt->msgCb;
|
pOption->msgCb = pMgmt->msgCb;
|
||||||
pOption->dnodeId = pMgmt->pData->dnodeId;
|
pOption->dnodeId = pMgmt->pData->dnodeId;
|
||||||
if (pReplica->id > 0) {
|
|
||||||
pOption->standby = true;
|
|
||||||
pOption->replica = *pReplica;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mmClose(SMnodeMgmt *pMgmt) {
|
static void mmClose(SMnodeMgmt *pMgmt) {
|
||||||
|
@ -95,22 +92,20 @@ static int32_t mmOpen(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
|
||||||
pMgmt->msgCb.mgmt = pMgmt;
|
pMgmt->msgCb.mgmt = pMgmt;
|
||||||
taosThreadRwlockInit(&pMgmt->lock, NULL);
|
taosThreadRwlockInit(&pMgmt->lock, NULL);
|
||||||
|
|
||||||
bool deployed = false;
|
SMnodeOpt option = {0};
|
||||||
SReplica replica = {0};
|
if (mmReadFile(pMgmt->path, &option) != 0) {
|
||||||
if (mmReadFile(pMgmt, &replica, &deployed) != 0) {
|
|
||||||
dError("failed to read file since %s", terrstr());
|
dError("failed to read file since %s", terrstr());
|
||||||
mmClose(pMgmt);
|
mmClose(pMgmt);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMnodeOpt option = {0};
|
if (!option.deploy) {
|
||||||
if (!deployed) {
|
|
||||||
dInfo("mnode start to deploy");
|
dInfo("mnode start to deploy");
|
||||||
pMgmt->pData->dnodeId = 1;
|
pMgmt->pData->dnodeId = 1;
|
||||||
mmBuildOptionForDeploy(pMgmt, pInput, &option);
|
mmBuildOptionForDeploy(pMgmt, pInput, &option);
|
||||||
} else {
|
} else {
|
||||||
dInfo("mnode start to open");
|
dInfo("mnode start to open");
|
||||||
mmBuildOptionForOpen(pMgmt, &replica, &option);
|
mmBuildOptionForOpen(pMgmt, &option);
|
||||||
}
|
}
|
||||||
|
|
||||||
pMgmt->pMnode = mndOpen(pMgmt->path, &option);
|
pMgmt->pMnode = mndOpen(pMgmt->path, &option);
|
||||||
|
@ -128,9 +123,10 @@ static int32_t mmOpen(SMgmtInputOpt *pInput, SMgmtOutputOpt *pOutput) {
|
||||||
}
|
}
|
||||||
tmsgReportStartup("mnode-worker", "initialized");
|
tmsgReportStartup("mnode-worker", "initialized");
|
||||||
|
|
||||||
if (!deployed || replica.id > 0) {
|
if (option.numOfReplicas > 0) {
|
||||||
deployed = true;
|
option.deploy = true;
|
||||||
if (mmWriteFile(pMgmt, NULL, deployed) != 0) {
|
option.numOfReplicas = 0;
|
||||||
|
if (mmWriteFile(pMgmt->path, &option) != 0) {
|
||||||
dError("failed to write mnode file since %s", terrstr());
|
dError("failed to write mnode file since %s", terrstr());
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,7 +72,7 @@ static void mmProcessRpcMsg(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
mndPostProcessQueryMsg(pMsg);
|
mndPostProcessQueryMsg(pMsg);
|
||||||
}
|
}
|
||||||
|
|
||||||
dGTrace("msg:%p, is freed, code:0x%x", pMsg, code);
|
dGTrace("msg:%p is freed, code:%s", pMsg, tstrerror(code));
|
||||||
rpcFreeCont(pMsg->pCont);
|
rpcFreeCont(pMsg->pCont);
|
||||||
taosFreeQitem(pMsg);
|
taosFreeQitem(pMsg);
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,12 +87,13 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
tsem_t syncSem;
|
tsem_t syncSem;
|
||||||
int64_t sync;
|
int64_t sync;
|
||||||
SReplica replica;
|
|
||||||
int32_t errCode;
|
int32_t errCode;
|
||||||
int32_t transId;
|
int32_t transId;
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int8_t standby;
|
|
||||||
int8_t leaderTransferFinish;
|
int8_t leaderTransferFinish;
|
||||||
|
int8_t selfIndex;
|
||||||
|
int8_t numOfReplicas;
|
||||||
|
SReplica replicas[TSDB_MAX_REPLICA];
|
||||||
} SSyncMgmt;
|
} SSyncMgmt;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -130,11 +131,10 @@ typedef struct SMnode {
|
||||||
void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp);
|
void mndSetMsgHandle(SMnode *pMnode, tmsg_t msgType, MndMsgFp fp);
|
||||||
int64_t mndGenerateUid(const char *name, int32_t len);
|
int64_t mndGenerateUid(const char *name, int32_t len);
|
||||||
|
|
||||||
int32_t mndAcquireRpcRef(SMnode *pMnode);
|
void mndSetRestored(SMnode *pMnode, bool restored);
|
||||||
void mndReleaseRpcRef(SMnode *pMnode);
|
bool mndGetRestored(SMnode *pMnode);
|
||||||
void mndSetRestore(SMnode *pMnode, bool restored);
|
void mndSetStop(SMnode *pMnode);
|
||||||
void mndSetStop(SMnode *pMnode);
|
bool mndGetStop(SMnode *pMnode);
|
||||||
bool mndGetStop(SMnode *pMnode);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,7 +24,7 @@ extern "C" {
|
||||||
|
|
||||||
int32_t mndInitSync(SMnode *pMnode);
|
int32_t mndInitSync(SMnode *pMnode);
|
||||||
void mndCleanupSync(SMnode *pMnode);
|
void mndCleanupSync(SMnode *pMnode);
|
||||||
bool mndIsMaster(SMnode *pMnode);
|
bool mndIsLeader(SMnode *pMnode);
|
||||||
int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId);
|
int32_t mndSyncPropose(SMnode *pMnode, SSdbRaw *pRaw, int32_t transId);
|
||||||
void mndSyncStart(SMnode *pMnode);
|
void mndSyncStart(SMnode *pMnode);
|
||||||
void mndSyncStop(SMnode *pMnode);
|
void mndSyncStop(SMnode *pMnode);
|
||||||
|
|
|
@ -1809,7 +1809,7 @@ static int32_t mndRetrieveDbs(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBloc
|
||||||
}
|
}
|
||||||
|
|
||||||
while (numOfRows < rowsCapacity) {
|
while (numOfRows < rowsCapacity) {
|
||||||
pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus);
|
pShow->pIter = sdbFetchAll(pSdb, SDB_DB, pShow->pIter, (void **)&pDb, &objStatus, true);
|
||||||
if (pShow->pIter == NULL) break;
|
if (pShow->pIter == NULL) break;
|
||||||
|
|
||||||
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
|
if (mndCheckDbPrivilege(pMnode, pReq->info.conn.user, MND_OPER_READ_OR_WRITE_DB, pDb) == 0) {
|
||||||
|
|
|
@ -423,7 +423,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
} else {
|
} else {
|
||||||
pDnode->accessTimes++;
|
pDnode->accessTimes++;
|
||||||
mTrace("dnode:%d, status received, access times %d", pDnode->id, pDnode->accessTimes);
|
mDebug("dnode:%d, status received, access times %d", pDnode->id, pDnode->accessTimes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -471,6 +471,7 @@ static int32_t mndProcessStatusReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pDnode->lastAccessTime = curMs;
|
pDnode->lastAccessTime = curMs;
|
||||||
|
pDnode->accessTimes++;
|
||||||
code = 0;
|
code = 0;
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
|
|
|
@ -43,6 +43,37 @@
|
||||||
#include "mndUser.h"
|
#include "mndUser.h"
|
||||||
#include "mndVgroup.h"
|
#include "mndVgroup.h"
|
||||||
|
|
||||||
|
static inline int32_t mndAcquireRpc(SMnode *pMnode) {
|
||||||
|
int32_t code = 0;
|
||||||
|
taosThreadRwlockRdlock(&pMnode->lock);
|
||||||
|
if (pMnode->stopped) {
|
||||||
|
terrno = TSDB_CODE_APP_NOT_READY;
|
||||||
|
code = -1;
|
||||||
|
} else if (!mndIsLeader(pMnode)) {
|
||||||
|
code = -1;
|
||||||
|
} else {
|
||||||
|
#if 1
|
||||||
|
atomic_add_fetch_32(&pMnode->rpcRef, 1);
|
||||||
|
#else
|
||||||
|
int32_t ref = atomic_add_fetch_32(&pMnode->rpcRef, 1);
|
||||||
|
mTrace("mnode rpc is acquired, ref:%d", ref);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
taosThreadRwlockUnlock(&pMnode->lock);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void mndReleaseRpc(SMnode *pMnode) {
|
||||||
|
taosThreadRwlockRdlock(&pMnode->lock);
|
||||||
|
#if 1
|
||||||
|
atomic_sub_fetch_32(&pMnode->rpcRef, 1);
|
||||||
|
#else
|
||||||
|
int32_t ref = atomic_sub_fetch_32(&pMnode->rpcRef, 1);
|
||||||
|
mTrace("mnode rpc is released, ref:%d", ref);
|
||||||
|
#endif
|
||||||
|
taosThreadRwlockUnlock(&pMnode->lock);
|
||||||
|
}
|
||||||
|
|
||||||
static void *mndBuildTimerMsg(int32_t *pContLen) {
|
static void *mndBuildTimerMsg(int32_t *pContLen) {
|
||||||
SMTimerReq timerReq = {0};
|
SMTimerReq timerReq = {0};
|
||||||
|
|
||||||
|
@ -338,8 +369,9 @@ static int32_t mndExecSteps(SMnode *pMnode) {
|
||||||
static void mndSetOptions(SMnode *pMnode, const SMnodeOpt *pOption) {
|
static void mndSetOptions(SMnode *pMnode, const SMnodeOpt *pOption) {
|
||||||
pMnode->msgCb = pOption->msgCb;
|
pMnode->msgCb = pOption->msgCb;
|
||||||
pMnode->selfDnodeId = pOption->dnodeId;
|
pMnode->selfDnodeId = pOption->dnodeId;
|
||||||
pMnode->syncMgmt.replica = pOption->replica;
|
pMnode->syncMgmt.selfIndex = pOption->selfIndex;
|
||||||
pMnode->syncMgmt.standby = pOption->standby;
|
pMnode->syncMgmt.numOfReplicas = pOption->numOfReplicas;
|
||||||
|
memcpy(pMnode->syncMgmt.replicas, pOption->replicas, sizeof(pOption->replicas));
|
||||||
}
|
}
|
||||||
|
|
||||||
SMnode *mndOpen(const char *path, const SMnodeOpt *pOption) {
|
SMnode *mndOpen(const char *path, const SMnodeOpt *pOption) {
|
||||||
|
@ -430,7 +462,7 @@ int32_t mndStart(SMnode *pMnode) {
|
||||||
mError("failed to deploy sdb while start mnode");
|
mError("failed to deploy sdb while start mnode");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
mndSetRestore(pMnode, true);
|
mndSetRestored(pMnode, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
grantReset(pMnode, TSDB_GRANT_ALL, 0);
|
grantReset(pMnode, TSDB_GRANT_ALL, 0);
|
||||||
|
@ -570,23 +602,27 @@ static int32_t mndCheckMnodeState(SRpcMsg *pMsg) {
|
||||||
pMsg->msgType == TDMT_SCH_FETCH || pMsg->msgType == TDMT_SCH_MERGE_FETCH || pMsg->msgType == TDMT_SCH_DROP_TASK) {
|
pMsg->msgType == TDMT_SCH_FETCH || pMsg->msgType == TDMT_SCH_MERGE_FETCH || pMsg->msgType == TDMT_SCH_DROP_TASK) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
if (mndAcquireRpcRef(pMsg->info.node) == 0) return 0;
|
if (mndAcquireRpc(pMsg->info.node) == 0) return 0;
|
||||||
if (pMsg->msgType == TDMT_MND_MQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER ||
|
if (pMsg->msgType == TDMT_MND_MQ_TIMER || pMsg->msgType == TDMT_MND_TELEM_TIMER ||
|
||||||
pMsg->msgType == TDMT_MND_TRANS_TIMER || pMsg->msgType == TDMT_MND_TTL_TIMER ||
|
pMsg->msgType == TDMT_MND_TRANS_TIMER || pMsg->msgType == TDMT_MND_TTL_TIMER ||
|
||||||
pMsg->msgType == TDMT_MND_UPTIME_TIMER) {
|
pMsg->msgType == TDMT_MND_UPTIME_TIMER) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SEpSet epSet = {0};
|
SEpSet epSet = {0};
|
||||||
mndGetMnodeEpSet(pMsg->info.node, &epSet);
|
SMnode *pMnode = pMsg->info.node;
|
||||||
|
mndGetMnodeEpSet(pMnode, &epSet);
|
||||||
|
|
||||||
const STraceId *trace = &pMsg->info.traceId;
|
const STraceId *trace = &pMsg->info.traceId;
|
||||||
mError("msg:%p, failed to check mnode state since %s, type:%s, numOfMnodes:%d inUse:%d", pMsg, terrstr(),
|
mDebug(
|
||||||
TMSG_INFO(pMsg->msgType), epSet.numOfEps, epSet.inUse);
|
"msg:%p, failed to check mnode state since %s, mnode restored:%d stopped:%d, sync restored:%d role:%s type:%s "
|
||||||
|
"numOfEps:%d inUse:%d",
|
||||||
|
pMsg, terrstr(), pMnode->restored, pMnode->stopped, syncIsRestoreFinish(pMnode->syncMgmt.sync),
|
||||||
|
syncGetMyRoleStr(pMnode->syncMgmt.sync), TMSG_INFO(pMsg->msgType), epSet.numOfEps, epSet.inUse);
|
||||||
|
|
||||||
if (epSet.numOfEps > 0) {
|
if (epSet.numOfEps > 0) {
|
||||||
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
for (int32_t i = 0; i < epSet.numOfEps; ++i) {
|
||||||
mInfo("mnode index:%d, ep:%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
|
mDebug("mnode index:%d, ep:%s:%u", i, epSet.eps[i].fqdn, epSet.eps[i].port);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
|
int32_t contLen = tSerializeSEpSet(NULL, 0, &epSet);
|
||||||
|
@ -633,7 +669,7 @@ int32_t mndProcessRpcMsg(SRpcMsg *pMsg) {
|
||||||
|
|
||||||
mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
mGTrace("msg:%p, start to process in mnode, app:%p type:%s", pMsg, pMsg->info.ahandle, TMSG_INFO(pMsg->msgType));
|
||||||
int32_t code = (*fp)(pMsg);
|
int32_t code = (*fp)(pMsg);
|
||||||
mndReleaseRpcRef(pMnode);
|
mndReleaseRpc(pMnode);
|
||||||
|
|
||||||
if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
|
if (code == TSDB_CODE_ACTION_IN_PROGRESS) {
|
||||||
mGTrace("msg:%p, won't response immediately since in progress", pMsg);
|
mGTrace("msg:%p, won't response immediately since in progress", pMsg);
|
||||||
|
@ -669,7 +705,7 @@ int64_t mndGenerateUid(const char *name, int32_t len) {
|
||||||
|
|
||||||
int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgroupInfo *pVgroupInfo,
|
int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgroupInfo *pVgroupInfo,
|
||||||
SMonStbInfo *pStbInfo, SMonGrantInfo *pGrantInfo) {
|
SMonStbInfo *pStbInfo, SMonGrantInfo *pGrantInfo) {
|
||||||
if (mndAcquireRpcRef(pMnode) != 0) return -1;
|
if (mndAcquireRpc(pMnode) != 0) return -1;
|
||||||
|
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
int64_t ms = taosGetTimestampMs();
|
int64_t ms = taosGetTimestampMs();
|
||||||
|
@ -680,7 +716,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr
|
||||||
pStbInfo->stbs = taosArrayInit(sdbGetSize(pSdb, SDB_STB), sizeof(SMonStbDesc));
|
pStbInfo->stbs = taosArrayInit(sdbGetSize(pSdb, SDB_STB), sizeof(SMonStbDesc));
|
||||||
if (pClusterInfo->dnodes == NULL || pClusterInfo->mnodes == NULL || pVgroupInfo->vgroups == NULL ||
|
if (pClusterInfo->dnodes == NULL || pClusterInfo->mnodes == NULL || pVgroupInfo->vgroups == NULL ||
|
||||||
pStbInfo->stbs == NULL) {
|
pStbInfo->stbs == NULL) {
|
||||||
mndReleaseRpcRef(pMnode);
|
mndReleaseRpc(pMnode);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -800,7 +836,7 @@ int32_t mndGetMonitorInfo(SMnode *pMnode, SMonClusterInfo *pClusterInfo, SMonVgr
|
||||||
pGrantInfo->timeseries_total = INT32_MAX;
|
pGrantInfo->timeseries_total = INT32_MAX;
|
||||||
}
|
}
|
||||||
|
|
||||||
mndReleaseRpcRef(pMnode);
|
mndReleaseRpc(pMnode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -810,32 +846,7 @@ int32_t mndGetLoad(SMnode *pMnode, SMnodeLoad *pLoad) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndAcquireRpcRef(SMnode *pMnode) {
|
void mndSetRestored(SMnode *pMnode, bool restored) {
|
||||||
int32_t code = 0;
|
|
||||||
taosThreadRwlockRdlock(&pMnode->lock);
|
|
||||||
if (pMnode->stopped) {
|
|
||||||
mTrace("mnode not running");
|
|
||||||
terrno = TSDB_CODE_APP_NOT_READY;
|
|
||||||
code = -1;
|
|
||||||
} else if (!mndIsMaster(pMnode)) {
|
|
||||||
mTrace("mnode not ready, role:%s restored:%d", syncGetMyRoleStr(pMnode->syncMgmt.sync), pMnode->restored);
|
|
||||||
code = -1;
|
|
||||||
} else {
|
|
||||||
int32_t ref = atomic_add_fetch_32(&pMnode->rpcRef, 1);
|
|
||||||
// mTrace("mnode rpc is acquired, ref:%d", ref);
|
|
||||||
}
|
|
||||||
taosThreadRwlockUnlock(&pMnode->lock);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
void mndReleaseRpcRef(SMnode *pMnode) {
|
|
||||||
taosThreadRwlockRdlock(&pMnode->lock);
|
|
||||||
int32_t ref = atomic_sub_fetch_32(&pMnode->rpcRef, 1);
|
|
||||||
// mTrace("mnode rpc is released, ref:%d", ref);
|
|
||||||
taosThreadRwlockUnlock(&pMnode->lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
void mndSetRestore(SMnode *pMnode, bool restored) {
|
|
||||||
if (restored) {
|
if (restored) {
|
||||||
taosThreadRwlockWrlock(&pMnode->lock);
|
taosThreadRwlockWrlock(&pMnode->lock);
|
||||||
pMnode->restored = true;
|
pMnode->restored = true;
|
||||||
|
|
|
@ -36,6 +36,7 @@ static int32_t mndProcessAlterMnodeReq(SRpcMsg *pReq);
|
||||||
static int32_t mndProcessDropMnodeReq(SRpcMsg *pReq);
|
static int32_t mndProcessDropMnodeReq(SRpcMsg *pReq);
|
||||||
static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBlock, int32_t rows);
|
||||||
static void mndCancelGetNextMnode(SMnode *pMnode, void *pIter);
|
static void mndCancelGetNextMnode(SMnode *pMnode, void *pIter);
|
||||||
|
static void mndReloadSyncConfig(SMnode *pMnode);
|
||||||
|
|
||||||
int32_t mndInitMnode(SMnode *pMnode) {
|
int32_t mndInitMnode(SMnode *pMnode) {
|
||||||
SSdbTable table = {
|
SSdbTable table = {
|
||||||
|
@ -187,6 +188,7 @@ static int32_t mndMnodeActionInsert(SSdb *pSdb, SMnodeObj *pObj) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pObj->state = TAOS_SYNC_STATE_ERROR;
|
pObj->state = TAOS_SYNC_STATE_ERROR;
|
||||||
|
mndReloadSyncConfig(pSdb->pMnode);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -203,6 +205,8 @@ static int32_t mndMnodeActionDelete(SSdb *pSdb, SMnodeObj *pObj) {
|
||||||
static int32_t mndMnodeActionUpdate(SSdb *pSdb, SMnodeObj *pOld, SMnodeObj *pNew) {
|
static int32_t mndMnodeActionUpdate(SSdb *pSdb, SMnodeObj *pOld, SMnodeObj *pNew) {
|
||||||
mTrace("mnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
|
mTrace("mnode:%d, perform update action, old row:%p new row:%p", pOld->id, pOld, pNew);
|
||||||
pOld->updateTime = pNew->updateTime;
|
pOld->updateTime = pNew->updateTime;
|
||||||
|
mndReloadSyncConfig(pSdb->pMnode);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -233,7 +237,7 @@ void mndGetMnodeEpSet(SMnode *pMnode, SEpSet *pEpSet) {
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
if (pObj->id == pMnode->selfDnodeId) {
|
if (pObj->id == pMnode->selfDnodeId) {
|
||||||
if (mndIsMaster(pMnode)) {
|
if (mndIsLeader(pMnode)) {
|
||||||
pEpSet->inUse = pEpSet->numOfEps;
|
pEpSet->inUse = pEpSet->numOfEps;
|
||||||
} else {
|
} else {
|
||||||
pEpSet->inUse = (pEpSet->numOfEps + 1) % totalMnodes;
|
pEpSet->inUse = (pEpSet->numOfEps + 1) % totalMnodes;
|
||||||
|
@ -248,6 +252,10 @@ void mndGetMnodeEpSet(SMnode *pMnode, SEpSet *pEpSet) {
|
||||||
if (pEpSet->numOfEps == 0) {
|
if (pEpSet->numOfEps == 0) {
|
||||||
syncGetRetryEpSet(pMnode->syncMgmt.sync, pEpSet);
|
syncGetRetryEpSet(pMnode->syncMgmt.sync, pEpSet);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pEpSet->inUse >= pEpSet->numOfEps) {
|
||||||
|
pEpSet->inUse = 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetCreateMnodeRedoLogs(SMnode *pMnode, STrans *pTrans, SMnodeObj *pObj) {
|
static int32_t mndSetCreateMnodeRedoLogs(SMnode *pMnode, STrans *pTrans, SMnodeObj *pObj) {
|
||||||
|
@ -274,13 +282,72 @@ static int32_t mndSetCreateMnodeCommitLogs(SMnode *pMnode, STrans *pTrans, SMnod
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndBuildCreateMnodeRedoAction(STrans *pTrans, SDCreateMnodeReq *pCreateReq, SEpSet *pCreateEpSet) {
|
||||||
|
int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, pCreateReq);
|
||||||
|
void *pReq = taosMemoryMalloc(contLen);
|
||||||
|
tSerializeSDCreateMnodeReq(pReq, contLen, pCreateReq);
|
||||||
|
|
||||||
|
STransAction action = {
|
||||||
|
.epSet = *pCreateEpSet,
|
||||||
|
.pCont = pReq,
|
||||||
|
.contLen = contLen,
|
||||||
|
.msgType = TDMT_DND_CREATE_MNODE,
|
||||||
|
.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
taosMemoryFree(pReq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndBuildAlterMnodeRedoAction(STrans *pTrans, SDCreateMnodeReq *pAlterReq, SEpSet *pAlterEpSet) {
|
||||||
|
int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, pAlterReq);
|
||||||
|
void *pReq = taosMemoryMalloc(contLen);
|
||||||
|
tSerializeSDCreateMnodeReq(pReq, contLen, pAlterReq);
|
||||||
|
|
||||||
|
STransAction action = {
|
||||||
|
.epSet = *pAlterEpSet,
|
||||||
|
.pCont = pReq,
|
||||||
|
.contLen = contLen,
|
||||||
|
.msgType = TDMT_MND_ALTER_MNODE,
|
||||||
|
.acceptableCode = 0,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
taosMemoryFree(pReq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mndBuildDropMnodeRedoAction(STrans *pTrans, SDDropMnodeReq *pDropReq, SEpSet *pDroprEpSet) {
|
||||||
|
int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, pDropReq);
|
||||||
|
void *pReq = taosMemoryMalloc(contLen);
|
||||||
|
tSerializeSCreateDropMQSBNodeReq(pReq, contLen, pDropReq);
|
||||||
|
|
||||||
|
STransAction action = {
|
||||||
|
.epSet = *pDroprEpSet,
|
||||||
|
.pCont = pReq,
|
||||||
|
.contLen = contLen,
|
||||||
|
.msgType = TDMT_DND_DROP_MNODE,
|
||||||
|
.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED,
|
||||||
|
};
|
||||||
|
|
||||||
|
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
||||||
|
taosMemoryFree(pReq);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mndSetCreateMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnodeObj *pDnode, SMnodeObj *pObj) {
|
static int32_t mndSetCreateMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnodeObj *pDnode, SMnodeObj *pObj) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
int32_t numOfReplicas = 0;
|
int32_t numOfReplicas = 0;
|
||||||
SDAlterMnodeReq alterReq = {0};
|
|
||||||
SDCreateMnodeReq createReq = {0};
|
SDCreateMnodeReq createReq = {0};
|
||||||
SEpSet alterEpset = {0};
|
|
||||||
SEpSet createEpset = {0};
|
SEpSet createEpset = {0};
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
|
@ -288,75 +355,25 @@ static int32_t mndSetCreateMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDno
|
||||||
pIter = sdbFetch(pSdb, SDB_MNODE, pIter, (void **)&pMObj);
|
pIter = sdbFetch(pSdb, SDB_MNODE, pIter, (void **)&pMObj);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) break;
|
||||||
|
|
||||||
alterReq.replicas[numOfReplicas].id = pMObj->id;
|
createReq.replicas[numOfReplicas].id = pMObj->id;
|
||||||
alterReq.replicas[numOfReplicas].port = pMObj->pDnode->port;
|
createReq.replicas[numOfReplicas].port = pMObj->pDnode->port;
|
||||||
memcpy(alterReq.replicas[numOfReplicas].fqdn, pMObj->pDnode->fqdn, TSDB_FQDN_LEN);
|
memcpy(createReq.replicas[numOfReplicas].fqdn, pMObj->pDnode->fqdn, TSDB_FQDN_LEN);
|
||||||
|
|
||||||
alterEpset.eps[numOfReplicas].port = pMObj->pDnode->port;
|
|
||||||
memcpy(alterEpset.eps[numOfReplicas].fqdn, pMObj->pDnode->fqdn, TSDB_FQDN_LEN);
|
|
||||||
if (pMObj->state == TAOS_SYNC_STATE_LEADER) {
|
|
||||||
alterEpset.inUse = numOfReplicas;
|
|
||||||
}
|
|
||||||
|
|
||||||
numOfReplicas++;
|
numOfReplicas++;
|
||||||
sdbRelease(pSdb, pMObj);
|
sdbRelease(pSdb, pMObj);
|
||||||
}
|
}
|
||||||
|
|
||||||
alterReq.replica = numOfReplicas + 1;
|
createReq.replica = numOfReplicas + 1;
|
||||||
alterReq.replicas[numOfReplicas].id = pDnode->id;
|
createReq.replicas[numOfReplicas].id = pDnode->id;
|
||||||
alterReq.replicas[numOfReplicas].port = pDnode->port;
|
createReq.replicas[numOfReplicas].port = pDnode->port;
|
||||||
memcpy(alterReq.replicas[numOfReplicas].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
memcpy(createReq.replicas[numOfReplicas].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
||||||
|
|
||||||
alterEpset.numOfEps = numOfReplicas + 1;
|
|
||||||
alterEpset.eps[numOfReplicas].port = pDnode->port;
|
|
||||||
memcpy(alterEpset.eps[numOfReplicas].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
|
||||||
|
|
||||||
createReq.replica = 1;
|
|
||||||
createReq.replicas[0].id = pDnode->id;
|
|
||||||
createReq.replicas[0].port = pDnode->port;
|
|
||||||
memcpy(createReq.replicas[0].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
|
||||||
|
|
||||||
|
createEpset.inUse = 0;
|
||||||
createEpset.numOfEps = 1;
|
createEpset.numOfEps = 1;
|
||||||
createEpset.eps[0].port = pDnode->port;
|
createEpset.eps[0].port = pDnode->port;
|
||||||
memcpy(createEpset.eps[0].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
memcpy(createEpset.eps[0].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
||||||
|
|
||||||
{
|
if (mndBuildCreateMnodeRedoAction(pTrans, &createReq, &createEpset) != 0) return -1;
|
||||||
int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, &createReq);
|
|
||||||
void *pReq = taosMemoryMalloc(contLen);
|
|
||||||
tSerializeSDCreateMnodeReq(pReq, contLen, &createReq);
|
|
||||||
|
|
||||||
STransAction action = {
|
|
||||||
.epSet = createEpset,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = contLen,
|
|
||||||
.msgType = TDMT_DND_CREATE_MNODE,
|
|
||||||
.acceptableCode = TSDB_CODE_NODE_ALREADY_DEPLOYED,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(pReq);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, &alterReq);
|
|
||||||
void *pReq = taosMemoryMalloc(contLen);
|
|
||||||
tSerializeSDCreateMnodeReq(pReq, contLen, &alterReq);
|
|
||||||
|
|
||||||
STransAction action = {
|
|
||||||
.epSet = alterEpset,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = contLen,
|
|
||||||
.msgType = TDMT_MND_ALTER_MNODE,
|
|
||||||
.acceptableCode = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(pReq);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -374,9 +391,9 @@ static int32_t mndCreateMnode(SMnode *pMnode, SRpcMsg *pReq, SDnodeObj *pDnode,
|
||||||
mndTransSetSerial(pTrans);
|
mndTransSetSerial(pTrans);
|
||||||
mInfo("trans:%d, used to create mnode:%d", pTrans->id, pCreate->dnodeId);
|
mInfo("trans:%d, used to create mnode:%d", pTrans->id, pCreate->dnodeId);
|
||||||
|
|
||||||
|
if (mndSetCreateMnodeRedoActions(pMnode, pTrans, pDnode, &mnodeObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateMnodeRedoLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
if (mndSetCreateMnodeRedoLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateMnodeCommitLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
if (mndSetCreateMnodeCommitLogs(pMnode, pTrans, &mnodeObj) != 0) goto _OVER;
|
||||||
if (mndSetCreateMnodeRedoActions(pMnode, pTrans, pDnode, &mnodeObj) != 0) goto _OVER;
|
|
||||||
if (mndTransAppendNullLog(pTrans) != 0) goto _OVER;
|
if (mndTransAppendNullLog(pTrans) != 0) goto _OVER;
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
||||||
|
|
||||||
|
@ -459,107 +476,28 @@ static int32_t mndSetDropMnodeCommitLogs(SMnode *pMnode, STrans *pTrans, SMnodeO
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnodeObj *pDnode, SMnodeObj *pObj) {
|
static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnodeObj *pDnode, SMnodeObj *pObj) {
|
||||||
SSdb *pSdb = pMnode->pSdb;
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
void *pIter = NULL;
|
void *pIter = NULL;
|
||||||
int32_t numOfReplicas = 0;
|
int32_t numOfReplicas = 0;
|
||||||
SDAlterMnodeReq alterReq = {0};
|
SDDropMnodeReq dropReq = {0};
|
||||||
SDDropMnodeReq dropReq = {0};
|
SEpSet dropEpSet = {0};
|
||||||
SSetStandbyReq standbyReq = {0};
|
|
||||||
SEpSet alterEpset = {0};
|
|
||||||
SEpSet dropEpSet = {0};
|
|
||||||
|
|
||||||
while (1) {
|
|
||||||
SMnodeObj *pMObj = NULL;
|
|
||||||
pIter = sdbFetch(pSdb, SDB_MNODE, pIter, (void **)&pMObj);
|
|
||||||
if (pIter == NULL) break;
|
|
||||||
if (pMObj->id == pObj->id) {
|
|
||||||
sdbRelease(pSdb, pMObj);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
alterReq.replicas[numOfReplicas].id = pMObj->id;
|
|
||||||
alterReq.replicas[numOfReplicas].port = pMObj->pDnode->port;
|
|
||||||
memcpy(alterReq.replicas[numOfReplicas].fqdn, pMObj->pDnode->fqdn, TSDB_FQDN_LEN);
|
|
||||||
|
|
||||||
alterEpset.eps[numOfReplicas].port = pMObj->pDnode->port;
|
|
||||||
memcpy(alterEpset.eps[numOfReplicas].fqdn, pMObj->pDnode->fqdn, TSDB_FQDN_LEN);
|
|
||||||
if (pMObj->state == TAOS_SYNC_STATE_LEADER) {
|
|
||||||
alterEpset.inUse = numOfReplicas;
|
|
||||||
}
|
|
||||||
|
|
||||||
numOfReplicas++;
|
|
||||||
sdbRelease(pSdb, pMObj);
|
|
||||||
}
|
|
||||||
|
|
||||||
alterReq.replica = numOfReplicas;
|
|
||||||
alterEpset.numOfEps = numOfReplicas;
|
|
||||||
|
|
||||||
dropReq.dnodeId = pDnode->id;
|
dropReq.dnodeId = pDnode->id;
|
||||||
dropEpSet.numOfEps = 1;
|
dropEpSet.numOfEps = 1;
|
||||||
dropEpSet.eps[0].port = pDnode->port;
|
dropEpSet.eps[0].port = pDnode->port;
|
||||||
memcpy(dropEpSet.eps[0].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
memcpy(dropEpSet.eps[0].fqdn, pDnode->fqdn, TSDB_FQDN_LEN);
|
||||||
|
|
||||||
standbyReq.dnodeId = pDnode->id;
|
int32_t totalMnodes = sdbGetSize(pSdb, SDB_MNODE);
|
||||||
standbyReq.standby = 1;
|
if (totalMnodes == 2) {
|
||||||
|
mInfo("vgId:1, has %d mnodes, exec redo log first", totalMnodes);
|
||||||
{
|
if (mndSetDropMnodeRedoLogs(pMnode, pTrans, pObj) != 0) return -1;
|
||||||
int32_t contLen = tSerializeSSetStandbyReq(NULL, 0, &standbyReq) + sizeof(SMsgHead);
|
if (mndBuildDropMnodeRedoAction(pTrans, &dropReq, &dropEpSet) != 0) return -1;
|
||||||
void *pReq = taosMemoryMalloc(contLen);
|
} else if (totalMnodes == 3) {
|
||||||
tSerializeSSetStandbyReq((char *)pReq + sizeof(SMsgHead), contLen, &standbyReq);
|
mInfo("vgId:1, has %d mnodes, exec redo action first", totalMnodes);
|
||||||
SMsgHead *pHead = pReq;
|
if (mndBuildDropMnodeRedoAction(pTrans, &dropReq, &dropEpSet) != 0) return -1;
|
||||||
pHead->contLen = htonl(contLen);
|
if (mndSetDropMnodeRedoLogs(pMnode, pTrans, pObj) != 0) return -1;
|
||||||
pHead->vgId = htonl(MNODE_HANDLE);
|
} else {
|
||||||
|
return -1;
|
||||||
STransAction action = {
|
|
||||||
.epSet = dropEpSet,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = contLen,
|
|
||||||
.msgType = TDMT_SYNC_SET_MNODE_STANDBY,
|
|
||||||
.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(pReq);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int32_t contLen = tSerializeSDCreateMnodeReq(NULL, 0, &alterReq);
|
|
||||||
void *pReq = taosMemoryMalloc(contLen);
|
|
||||||
tSerializeSDCreateMnodeReq(pReq, contLen, &alterReq);
|
|
||||||
|
|
||||||
STransAction action = {
|
|
||||||
.epSet = alterEpset,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = contLen,
|
|
||||||
.msgType = TDMT_MND_ALTER_MNODE,
|
|
||||||
.acceptableCode = 0,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(pReq);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
|
||||||
int32_t contLen = tSerializeSCreateDropMQSBNodeReq(NULL, 0, &dropReq);
|
|
||||||
void *pReq = taosMemoryMalloc(contLen);
|
|
||||||
tSerializeSCreateDropMQSBNodeReq(pReq, contLen, &dropReq);
|
|
||||||
|
|
||||||
STransAction action = {
|
|
||||||
.epSet = dropEpSet,
|
|
||||||
.pCont = pReq,
|
|
||||||
.contLen = contLen,
|
|
||||||
.msgType = TDMT_DND_DROP_MNODE,
|
|
||||||
.acceptableCode = TSDB_CODE_NODE_NOT_DEPLOYED,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (mndTransAppendRedoAction(pTrans, &action) != 0) {
|
|
||||||
taosMemoryFree(pReq);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -567,7 +505,6 @@ static int32_t mndSetDropMnodeRedoActions(SMnode *pMnode, STrans *pTrans, SDnode
|
||||||
|
|
||||||
int32_t mndSetDropMnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SMnodeObj *pObj) {
|
int32_t mndSetDropMnodeInfoToTrans(SMnode *pMnode, STrans *pTrans, SMnodeObj *pObj) {
|
||||||
if (pObj == NULL) return 0;
|
if (pObj == NULL) return 0;
|
||||||
if (mndSetDropMnodeRedoLogs(pMnode, pTrans, pObj) != 0) return -1;
|
|
||||||
if (mndSetDropMnodeCommitLogs(pMnode, pTrans, pObj) != 0) return -1;
|
if (mndSetDropMnodeCommitLogs(pMnode, pTrans, pObj) != 0) return -1;
|
||||||
if (mndSetDropMnodeRedoActions(pMnode, pTrans, pObj->pDnode, pObj) != 0) return -1;
|
if (mndSetDropMnodeRedoActions(pMnode, pTrans, pObj->pDnode, pObj) != 0) return -1;
|
||||||
if (mndTransAppendNullLog(pTrans) != 0) return -1;
|
if (mndTransAppendNullLog(pTrans) != 0) return -1;
|
||||||
|
@ -657,7 +594,7 @@ static int32_t mndRetrieveMnodes(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pB
|
||||||
int64_t curMs = taosGetTimestampMs();
|
int64_t curMs = taosGetTimestampMs();
|
||||||
|
|
||||||
while (numOfRows < rows) {
|
while (numOfRows < rows) {
|
||||||
pShow->pIter = sdbFetchAll(pSdb, SDB_MNODE, pShow->pIter, (void **)&pObj, &objStatus);
|
pShow->pIter = sdbFetchAll(pSdb, SDB_MNODE, pShow->pIter, (void **)&pObj, &objStatus, true);
|
||||||
if (pShow->pIter == NULL) break;
|
if (pShow->pIter == NULL) break;
|
||||||
|
|
||||||
cols = 0;
|
cols = 0;
|
||||||
|
@ -712,6 +649,9 @@ static void mndCancelGetNextMnode(SMnode *pMnode, void *pIter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndProcessAlterMnodeReq(SRpcMsg *pReq) {
|
static int32_t mndProcessAlterMnodeReq(SRpcMsg *pReq) {
|
||||||
|
#if 1
|
||||||
|
return 0;
|
||||||
|
#else
|
||||||
SMnode *pMnode = pReq->info.node;
|
SMnode *pMnode = pReq->info.node;
|
||||||
SDAlterMnodeReq alterReq = {0};
|
SDAlterMnodeReq alterReq = {0};
|
||||||
|
|
||||||
|
@ -720,41 +660,107 @@ static int32_t mndProcessAlterMnodeReq(SRpcMsg *pReq) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SMnodeOpt option = {.deploy = true, .numOfReplicas = alterReq.replica, .selfIndex = -1};
|
||||||
|
memcpy(option.replicas, alterReq.replicas, sizeof(alterReq.replicas));
|
||||||
|
for (int32_t i = 0; i < option.numOfReplicas; ++i) {
|
||||||
|
if (alterReq.replicas[i].id == pMnode->selfDnodeId) {
|
||||||
|
option.selfIndex = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (option.selfIndex == -1) {
|
||||||
|
mInfo("alter mnode not processed since selfIndex is -1", terrstr());
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mndWriteFile(pMnode->path, &option) != 0) {
|
||||||
|
mError("failed to write mnode file since %s", terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SSyncCfg cfg = {.replicaNum = alterReq.replica, .myIndex = -1};
|
SSyncCfg cfg = {.replicaNum = alterReq.replica, .myIndex = -1};
|
||||||
for (int32_t i = 0; i < alterReq.replica; ++i) {
|
for (int32_t i = 0; i < alterReq.replica; ++i) {
|
||||||
SNodeInfo *pNode = &cfg.nodeInfo[i];
|
SNodeInfo *pNode = &cfg.nodeInfo[i];
|
||||||
tstrncpy(pNode->nodeFqdn, alterReq.replicas[i].fqdn, sizeof(pNode->nodeFqdn));
|
tstrncpy(pNode->nodeFqdn, alterReq.replicas[i].fqdn, sizeof(pNode->nodeFqdn));
|
||||||
pNode->nodePort = alterReq.replicas[i].port;
|
pNode->nodePort = alterReq.replicas[i].port;
|
||||||
if (alterReq.replicas[i].id == pMnode->selfDnodeId) cfg.myIndex = i;
|
if (alterReq.replicas[i].id == pMnode->selfDnodeId) {
|
||||||
|
cfg.myIndex = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cfg.myIndex == -1) {
|
if (cfg.myIndex == -1) {
|
||||||
mError("failed to alter mnode since myindex is -1");
|
mError("failed to alter mnode since myindex is -1");
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
mInfo("start to alter mnode sync, replica:%d myindex:%d", cfg.replicaNum, cfg.myIndex);
|
mInfo("start to alter mnode sync, replica:%d myIndex:%d", cfg.replicaNum, cfg.myIndex);
|
||||||
for (int32_t i = 0; i < alterReq.replica; ++i) {
|
for (int32_t i = 0; i < alterReq.replica; ++i) {
|
||||||
SNodeInfo *pNode = &cfg.nodeInfo[i];
|
SNodeInfo *pNode = &cfg.nodeInfo[i];
|
||||||
mInfo("index:%d, fqdn:%s port:%d", i, pNode->nodeFqdn, pNode->nodePort);
|
mInfo("index:%d, fqdn:%s port:%d", i, pNode->nodeFqdn, pNode->nodePort);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
mInfo("trans:-1, sync reconfig will be proposed");
|
int32_t code = syncReconfig(pMnode->syncMgmt.sync, &cfg);
|
||||||
|
|
||||||
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
|
|
||||||
pMgmt->standby = 0;
|
|
||||||
int32_t code = syncReconfig(pMgmt->sync, &cfg);
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("trans:-1, failed to propose sync reconfig since %s", terrstr());
|
mError("failed to sync reconfig since %s", terrstr());
|
||||||
return code;
|
|
||||||
} else {
|
} else {
|
||||||
pMgmt->errCode = 0;
|
mInfo("alter mnode sync success");
|
||||||
taosWLockLatch(&pMgmt->lock);
|
}
|
||||||
pMgmt->transId = -1;
|
|
||||||
taosWUnLockLatch(&pMgmt->lock);
|
return code;
|
||||||
tsem_wait(&pMgmt->syncSem);
|
#endif
|
||||||
mInfo("alter mnode sync result:0x%x %s", pMgmt->errCode, tstrerror(pMgmt->errCode));
|
}
|
||||||
terrno = pMgmt->errCode;
|
|
||||||
return pMgmt->errCode;
|
static void mndReloadSyncConfig(SMnode *pMnode) {
|
||||||
|
SSdb *pSdb = pMnode->pSdb;
|
||||||
|
SMnodeObj *pObj = NULL;
|
||||||
|
ESdbStatus objStatus = 0;
|
||||||
|
void *pIter = NULL;
|
||||||
|
bool hasUpdatingMnode = false;
|
||||||
|
SSyncCfg cfg = {.myIndex = -1};
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
pIter = sdbFetchAll(pSdb, SDB_MNODE, pIter, (void **)&pObj, &objStatus, false);
|
||||||
|
if (pIter == NULL) break;
|
||||||
|
if (objStatus == SDB_STATUS_CREATING || objStatus == SDB_STATUS_DROPPING) {
|
||||||
|
mInfo("vgId:1, has updating mnode:%d, status:%s", pObj->id, sdbStatusName(objStatus));
|
||||||
|
hasUpdatingMnode = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (objStatus == SDB_STATUS_READY || objStatus == SDB_STATUS_CREATING) {
|
||||||
|
SNodeInfo *pNode = &cfg.nodeInfo[cfg.replicaNum];
|
||||||
|
tstrncpy(pNode->nodeFqdn, pObj->pDnode->fqdn, sizeof(pNode->nodeFqdn));
|
||||||
|
pNode->nodePort = pObj->pDnode->port;
|
||||||
|
if (pObj->pDnode->id == pMnode->selfDnodeId) {
|
||||||
|
cfg.myIndex = cfg.replicaNum;
|
||||||
|
}
|
||||||
|
cfg.replicaNum++;
|
||||||
|
}
|
||||||
|
|
||||||
|
sdbReleaseLock(pSdb, pObj, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cfg.myIndex == -1) {
|
||||||
|
mInfo("vgId:1, mnode not reload since selfIndex is -1");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!mndGetRestored(pMnode)) {
|
||||||
|
mInfo("vgId:1, mnode not reload since restore not finished");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (hasUpdatingMnode) {
|
||||||
|
mInfo("vgId:1, start to reload mnode sync, replica:%d myIndex:%d", cfg.replicaNum, cfg.myIndex);
|
||||||
|
for (int32_t i = 0; i < cfg.replicaNum; ++i) {
|
||||||
|
SNodeInfo *pNode = &cfg.nodeInfo[i];
|
||||||
|
mInfo("vgId:1, index:%d, fqdn:%s port:%d", i, pNode->nodeFqdn, pNode->nodePort);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t code = syncReconfig(pMnode->syncMgmt.sync, &cfg);
|
||||||
|
if (code != 0) {
|
||||||
|
mError("vgId:1, failed to reconfig mnode sync since %s", terrstr());
|
||||||
|
} else {
|
||||||
|
mInfo("vgId:1, reconfig mnode sync success");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -107,7 +107,7 @@ void mndRestoreFinish(struct SSyncFSM *pFsm) {
|
||||||
if (!pMnode->deploy) {
|
if (!pMnode->deploy) {
|
||||||
mInfo("vgId:1, sync restore finished, and will handle outstanding transactions");
|
mInfo("vgId:1, sync restore finished, and will handle outstanding transactions");
|
||||||
mndTransPullup(pMnode);
|
mndTransPullup(pMnode);
|
||||||
mndSetRestore(pMnode, true);
|
mndSetRestored(pMnode, true);
|
||||||
} else {
|
} else {
|
||||||
mInfo("vgId:1, sync restore finished");
|
mInfo("vgId:1, sync restore finished");
|
||||||
}
|
}
|
||||||
|
@ -225,18 +225,17 @@ int32_t mndInitSync(SMnode *pMnode) {
|
||||||
snprintf(syncInfo.path, sizeof(syncInfo.path), "%s%ssync", pMnode->path, TD_DIRSEP);
|
snprintf(syncInfo.path, sizeof(syncInfo.path), "%s%ssync", pMnode->path, TD_DIRSEP);
|
||||||
syncInfo.pWal = pMnode->pWal;
|
syncInfo.pWal = pMnode->pWal;
|
||||||
syncInfo.pFsm = mndSyncMakeFsm(pMnode);
|
syncInfo.pFsm = mndSyncMakeFsm(pMnode);
|
||||||
syncInfo.isStandBy = pMgmt->standby;
|
|
||||||
syncInfo.snapshotStrategy = SYNC_STRATEGY_STANDARD_SNAPSHOT;
|
syncInfo.snapshotStrategy = SYNC_STRATEGY_STANDARD_SNAPSHOT;
|
||||||
|
|
||||||
mInfo("vgId:1, start to open sync, standby:%d", pMgmt->standby);
|
mInfo("vgId:1, start to open sync, selfIndex:%d replica:%d", pMgmt->selfIndex, pMgmt->numOfReplicas);
|
||||||
if (pMgmt->standby || pMgmt->replica.id > 0) {
|
SSyncCfg *pCfg = &syncInfo.syncCfg;
|
||||||
SSyncCfg *pCfg = &syncInfo.syncCfg;
|
pCfg->replicaNum = pMgmt->numOfReplicas;
|
||||||
pCfg->replicaNum = 1;
|
pCfg->myIndex = pMgmt->selfIndex;
|
||||||
pCfg->myIndex = 0;
|
for (int32_t i = 0; i < pMgmt->numOfReplicas; ++i) {
|
||||||
SNodeInfo *pNode = &pCfg->nodeInfo[0];
|
SNodeInfo *pNode = &pCfg->nodeInfo[i];
|
||||||
tstrncpy(pNode->nodeFqdn, pMgmt->replica.fqdn, sizeof(pNode->nodeFqdn));
|
tstrncpy(pNode->nodeFqdn, pMgmt->replicas[i].fqdn, sizeof(pNode->nodeFqdn));
|
||||||
pNode->nodePort = pMgmt->replica.port;
|
pNode->nodePort = pMgmt->replicas[i].port;
|
||||||
mInfo("vgId:1, ep:%s:%u", pNode->nodeFqdn, pNode->nodePort);
|
mInfo("vgId:1, index:%d ep:%s:%u", i, pNode->nodeFqdn, pNode->nodePort);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsem_init(&pMgmt->syncSem, 0, 0);
|
tsem_init(&pMgmt->syncSem, 0, 0);
|
||||||
|
@ -250,10 +249,6 @@ int32_t mndInitSync(SMnode *pMnode) {
|
||||||
setPingTimerMS(pMgmt->sync, 5000);
|
setPingTimerMS(pMgmt->sync, 5000);
|
||||||
setElectTimerMS(pMgmt->sync, 3000);
|
setElectTimerMS(pMgmt->sync, 3000);
|
||||||
setHeartbeatTimerMS(pMgmt->sync, 500);
|
setHeartbeatTimerMS(pMgmt->sync, 500);
|
||||||
/*
|
|
||||||
setElectTimerMS(pMgmt->sync, 600);
|
|
||||||
setHeartbeatTimerMS(pMgmt->sync, 300);
|
|
||||||
*/
|
|
||||||
|
|
||||||
mInfo("mnode-sync is opened, id:%" PRId64, pMgmt->sync);
|
mInfo("mnode-sync is opened, id:%" PRId64, pMgmt->sync);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -319,7 +314,7 @@ void mndSyncStart(SMnode *pMnode) {
|
||||||
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
|
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
|
||||||
syncSetMsgCb(pMgmt->sync, &pMnode->msgCb);
|
syncSetMsgCb(pMgmt->sync, &pMnode->msgCb);
|
||||||
syncStart(pMgmt->sync);
|
syncStart(pMgmt->sync);
|
||||||
mInfo("vgId:1, sync started, id:%" PRId64 " standby:%d", pMgmt->sync, pMgmt->standby);
|
mInfo("vgId:1, sync started, id:%" PRId64, pMgmt->sync);
|
||||||
}
|
}
|
||||||
|
|
||||||
void mndSyncStop(SMnode *pMnode) {
|
void mndSyncStop(SMnode *pMnode) {
|
||||||
|
@ -331,7 +326,7 @@ void mndSyncStop(SMnode *pMnode) {
|
||||||
taosWUnLockLatch(&pMnode->syncMgmt.lock);
|
taosWUnLockLatch(&pMnode->syncMgmt.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool mndIsMaster(SMnode *pMnode) {
|
bool mndIsLeader(SMnode *pMnode) {
|
||||||
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
|
SSyncMgmt *pMgmt = &pMnode->syncMgmt;
|
||||||
|
|
||||||
if (!syncIsReady(pMgmt->sync)) {
|
if (!syncIsReady(pMgmt->sync)) {
|
||||||
|
@ -340,7 +335,7 @@ bool mndIsMaster(SMnode *pMnode) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!pMnode->restored) {
|
if (!mndGetRestored(pMnode)) {
|
||||||
terrno = TSDB_CODE_APP_NOT_READY;
|
terrno = TSDB_CODE_APP_NOT_READY;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ static bool mndTransPerformCommitActionStage(SMnode *pMnode, STrans *pTrans);
|
||||||
static bool mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans);
|
static bool mndTransPerformCommitStage(SMnode *pMnode, STrans *pTrans);
|
||||||
static bool mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans);
|
static bool mndTransPerformRollbackStage(SMnode *pMnode, STrans *pTrans);
|
||||||
static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans);
|
static bool mndTransPerfromFinishedStage(SMnode *pMnode, STrans *pTrans);
|
||||||
static bool mndCannotExecuteTransAction(SMnode *pMnode) { return !pMnode->deploy && !mndIsMaster(pMnode); }
|
static bool mndCannotExecuteTransAction(SMnode *pMnode) { return !pMnode->deploy && !mndIsLeader(pMnode); }
|
||||||
|
|
||||||
static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans);
|
static void mndTransSendRpcRsp(SMnode *pMnode, STrans *pTrans);
|
||||||
static int32_t mndProcessTransTimer(SRpcMsg *pReq);
|
static int32_t mndProcessTransTimer(SRpcMsg *pReq);
|
||||||
|
|
|
@ -298,6 +298,7 @@ void *sdbAcquire(SSdb *pSdb, ESdbType type, const void *pKey);
|
||||||
* @param pObj The object of the row.
|
* @param pObj The object of the row.
|
||||||
*/
|
*/
|
||||||
void sdbRelease(SSdb *pSdb, void *pObj);
|
void sdbRelease(SSdb *pSdb, void *pObj);
|
||||||
|
void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Traverse a sdb table
|
* @brief Traverse a sdb table
|
||||||
|
@ -309,7 +310,7 @@ void sdbRelease(SSdb *pSdb, void *pObj);
|
||||||
* @return void* The next iterator of the table.
|
* @return void* The next iterator of the table.
|
||||||
*/
|
*/
|
||||||
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj);
|
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj);
|
||||||
void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStatus *status);
|
void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStatus *status, bool lock);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief Cancel a traversal
|
* @brief Cancel a traversal
|
||||||
|
|
|
@ -327,14 +327,16 @@ static void sdbCheckRow(SSdb *pSdb, SSdbRow *pRow) {
|
||||||
taosThreadRwlockUnlock(pLock);
|
taosThreadRwlockUnlock(pLock);
|
||||||
}
|
}
|
||||||
|
|
||||||
void sdbRelease(SSdb *pSdb, void *pObj) {
|
void sdbReleaseLock(SSdb *pSdb, void *pObj, bool lock) {
|
||||||
if (pObj == NULL) return;
|
if (pObj == NULL) return;
|
||||||
|
|
||||||
SSdbRow *pRow = (SSdbRow *)((char *)pObj - sizeof(SSdbRow));
|
SSdbRow *pRow = (SSdbRow *)((char *)pObj - sizeof(SSdbRow));
|
||||||
if (pRow->type >= SDB_MAX) return;
|
if (pRow->type >= SDB_MAX) return;
|
||||||
|
|
||||||
TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
|
TdThreadRwlock *pLock = &pSdb->locks[pRow->type];
|
||||||
taosThreadRwlockWrlock(pLock);
|
if (lock) {
|
||||||
|
taosThreadRwlockWrlock(pLock);
|
||||||
|
}
|
||||||
|
|
||||||
int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
|
int32_t ref = atomic_sub_fetch_32(&pRow->refCount, 1);
|
||||||
sdbPrintOper(pSdb, pRow, "release");
|
sdbPrintOper(pSdb, pRow, "release");
|
||||||
|
@ -342,9 +344,13 @@ void sdbRelease(SSdb *pSdb, void *pObj) {
|
||||||
sdbFreeRow(pSdb, pRow, true);
|
sdbFreeRow(pSdb, pRow, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosThreadRwlockUnlock(pLock);
|
if (lock) {
|
||||||
|
taosThreadRwlockUnlock(pLock);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void sdbRelease(SSdb *pSdb, void *pObj) { sdbReleaseLock(pSdb, pObj, true); }
|
||||||
|
|
||||||
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
|
void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
|
||||||
*ppObj = NULL;
|
*ppObj = NULL;
|
||||||
|
|
||||||
|
@ -372,14 +378,16 @@ void *sdbFetch(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj) {
|
||||||
return ppRow;
|
return ppRow;
|
||||||
}
|
}
|
||||||
|
|
||||||
void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStatus *status) {
|
void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStatus *status, bool lock) {
|
||||||
*ppObj = NULL;
|
*ppObj = NULL;
|
||||||
|
|
||||||
SHashObj *hash = sdbGetHash(pSdb, type);
|
SHashObj *hash = sdbGetHash(pSdb, type);
|
||||||
if (hash == NULL) return NULL;
|
if (hash == NULL) return NULL;
|
||||||
|
|
||||||
TdThreadRwlock *pLock = &pSdb->locks[type];
|
TdThreadRwlock *pLock = &pSdb->locks[type];
|
||||||
taosThreadRwlockRdlock(pLock);
|
if (lock) {
|
||||||
|
taosThreadRwlockRdlock(pLock);
|
||||||
|
}
|
||||||
|
|
||||||
SSdbRow **ppRow = taosHashIterate(hash, pIter);
|
SSdbRow **ppRow = taosHashIterate(hash, pIter);
|
||||||
while (ppRow != NULL) {
|
while (ppRow != NULL) {
|
||||||
|
@ -395,7 +403,9 @@ void *sdbFetchAll(SSdb *pSdb, ESdbType type, void *pIter, void **ppObj, ESdbStat
|
||||||
*status = pRow->status;
|
*status = pRow->status;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
taosThreadRwlockUnlock(pLock);
|
if (lock) {
|
||||||
|
taosThreadRwlockUnlock(pLock);
|
||||||
|
}
|
||||||
|
|
||||||
return ppRow;
|
return ppRow;
|
||||||
}
|
}
|
||||||
|
|
|
@ -693,6 +693,7 @@ static int metaAlterTableColumn(SMeta *pMeta, int64_t version, SVAlterTbReq *pAl
|
||||||
if (iCol >= pSchema->nCols) break;
|
if (iCol >= pSchema->nCols) break;
|
||||||
pColumn = &pSchema->pSchema[iCol];
|
pColumn = &pSchema->pSchema[iCol];
|
||||||
|
|
||||||
|
ASSERT(pAlterTbReq->colName);
|
||||||
if (strcmp(pColumn->name, pAlterTbReq->colName) == 0) break;
|
if (strcmp(pColumn->name, pAlterTbReq->colName) == 0) break;
|
||||||
iCol++;
|
iCol++;
|
||||||
}
|
}
|
||||||
|
|
|
@ -171,11 +171,11 @@ int32_t tqPushDataRsp(STQ* pTq, STqPushEntry* pPushEntry) {
|
||||||
ASSERT(taosArrayGetSize(pRsp->blockSchema) == 0);
|
ASSERT(taosArrayGetSize(pRsp->blockSchema) == 0);
|
||||||
|
|
||||||
if (pRsp->reqOffset.type == TMQ_OFFSET__LOG) {
|
if (pRsp->reqOffset.type == TMQ_OFFSET__LOG) {
|
||||||
if (pRsp->blockNum > 0) {
|
/*if (pRsp->blockNum > 0) {*/
|
||||||
ASSERT(pRsp->rspOffset.version > pRsp->reqOffset.version);
|
/*ASSERT(pRsp->rspOffset.version > pRsp->reqOffset.version);*/
|
||||||
} else {
|
/*} else {*/
|
||||||
ASSERT(pRsp->rspOffset.version >= pRsp->reqOffset.version);
|
ASSERT(pRsp->rspOffset.version > pRsp->reqOffset.version);
|
||||||
}
|
/*}*/
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
|
|
|
@ -245,7 +245,7 @@ int tqPushMsg(STQ* pTq, void* msg, int32_t msgLen, tmsg_t msgType, int64_t ver)
|
||||||
tqDebug("vgId:%d cannot find handle %s", pTq->pVnode->config.vgId, pPushEntry->subKey);
|
tqDebug("vgId:%d cannot find handle %s", pTq->pVnode->config.vgId, pPushEntry->subKey);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
if (pPushEntry->dataRsp.reqOffset.version > ver) {
|
if (pPushEntry->dataRsp.reqOffset.version >= ver) {
|
||||||
tqDebug("vgId:%d push entry req version %ld, while push version %ld, skip", pTq->pVnode->config.vgId,
|
tqDebug("vgId:%d push entry req version %ld, while push version %ld, skip", pTq->pVnode->config.vgId,
|
||||||
pPushEntry->dataRsp.reqOffset.version, ver);
|
pPushEntry->dataRsp.reqOffset.version, ver);
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -378,10 +378,10 @@ static int32_t getTableDelSkyline(STbData *pMem, STbData *pIMem, SDelFReader *pD
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
_err:
|
||||||
if (aDelData) {
|
if (aDelData) {
|
||||||
taosArrayDestroy(aDelData);
|
taosArrayDestroy(aDelData);
|
||||||
}
|
}
|
||||||
_err:
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -399,14 +399,13 @@ static int32_t getTableDelIdx(SDelFReader *pDelFReader, tb_uid_t suid, tb_uid_t
|
||||||
|
|
||||||
// code = tMapDataSearch(&delIdxMap, &idx, tGetDelIdx, tCmprDelIdx, pDelIdx);
|
// code = tMapDataSearch(&delIdxMap, &idx, tGetDelIdx, tCmprDelIdx, pDelIdx);
|
||||||
SDelIdx *pIdx = taosArraySearch(pDelIdxArray, &idx, tCmprDelIdx, TD_EQ);
|
SDelIdx *pIdx = taosArraySearch(pDelIdxArray, &idx, tCmprDelIdx, TD_EQ);
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
*pDelIdx = *pIdx;
|
*pDelIdx = *pIdx;
|
||||||
|
|
||||||
|
_err:
|
||||||
if (pDelIdxArray) {
|
if (pDelIdxArray) {
|
||||||
taosArrayDestroy(pDelIdxArray);
|
taosArrayDestroy(pDelIdxArray);
|
||||||
}
|
}
|
||||||
_err:
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -599,8 +598,6 @@ static int32_t getNextRowFromFS(void *iter, TSDBROW **ppRow) {
|
||||||
* &state->blockIdx);
|
* &state->blockIdx);
|
||||||
*/
|
*/
|
||||||
state->pBlockIdx = taosArraySearch(state->aBlockIdx, state->pBlockIdxExp, tCmprBlockIdx, TD_EQ);
|
state->pBlockIdx = taosArraySearch(state->aBlockIdx, state->pBlockIdxExp, tCmprBlockIdx, TD_EQ);
|
||||||
if (code) goto _err;
|
|
||||||
|
|
||||||
if (!state->pBlockIdx) {
|
if (!state->pBlockIdx) {
|
||||||
goto _next_fileset;
|
goto _next_fileset;
|
||||||
}
|
}
|
||||||
|
@ -898,10 +895,16 @@ static int32_t nextRowIterOpen(CacheNextRowIter *pIter, tb_uid_t uid, STsdb *pTs
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
|
code = getTableDelIdx(pDelFReader, suid, uid, &delIdx);
|
||||||
if (code) goto _err;
|
if (code) {
|
||||||
|
tsdbDelFReaderClose(&pDelFReader);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
code = getTableDelSkyline(pMem, pIMem, pDelFReader, &delIdx, pIter->pSkyline);
|
code = getTableDelSkyline(pMem, pIMem, pDelFReader, &delIdx, pIter->pSkyline);
|
||||||
if (code) goto _err;
|
if (code) {
|
||||||
|
tsdbDelFReaderClose(&pDelFReader);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
tsdbDelFReaderClose(&pDelFReader);
|
tsdbDelFReaderClose(&pDelFReader);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1231,6 +1234,8 @@ static int32_t mergeLast(tb_uid_t uid, STsdb *pTsdb, SArray **ppLastArray) {
|
||||||
_err:
|
_err:
|
||||||
nextRowIterClose(&iter);
|
nextRowIterClose(&iter);
|
||||||
taosMemoryFreeClear(pTSchema);
|
taosMemoryFreeClear(pTSchema);
|
||||||
|
*ppLastArray = NULL;
|
||||||
|
taosArrayDestroy(pColArray);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -396,12 +396,19 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t tDataIterCmprFn(const SRBTreeNode *n1, const SRBTreeNode *n2) {
|
||||||
|
SDataIter *pIter1 = (SDataIter *)((uint8_t *)n1 - offsetof(SDataIter, n));
|
||||||
|
SDataIter *pIter2 = (SDataIter *)((uint8_t *)n2 - offsetof(SDataIter, n));
|
||||||
|
|
||||||
|
return tRowInfoCmprFn(&pIter1->r, &pIter2->r);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) {
|
static int32_t tsdbOpenCommitIter(SCommitter *pCommitter) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int32_t lino = 0;
|
int32_t lino = 0;
|
||||||
|
|
||||||
pCommitter->pIter = NULL;
|
pCommitter->pIter = NULL;
|
||||||
tRBTreeCreate(&pCommitter->rbt, tRowInfoCmprFn);
|
tRBTreeCreate(&pCommitter->rbt, tDataIterCmprFn);
|
||||||
|
|
||||||
// memory
|
// memory
|
||||||
TSDBKEY tKey = {.ts = pCommitter->minKey, .version = VERSION_MIN};
|
TSDBKEY tKey = {.ts = pCommitter->minKey, .version = VERSION_MIN};
|
||||||
|
|
|
@ -610,9 +610,6 @@ int32_t tsdbFSRollback(STsdbFS *pFS) {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbFSUpsertDelFile(STsdbFS *pFS, SDelFile *pDelFile) {
|
int32_t tsdbFSUpsertDelFile(STsdbFS *pFS, SDelFile *pDelFile) {
|
||||||
|
@ -866,7 +863,7 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) {
|
||||||
nRef = atomic_sub_fetch_32(&fSet.pSmaF->nRef, 1);
|
nRef = atomic_sub_fetch_32(&fSet.pSmaF->nRef, 1);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
tsdbSmaFileName(pTsdb, pSetOld->diskId, pSetOld->fid, fSet.pSmaF, fname);
|
tsdbSmaFileName(pTsdb, pSetOld->diskId, pSetOld->fid, fSet.pSmaF, fname);
|
||||||
taosRemoveFile(fname);
|
(void)taosRemoveFile(fname);
|
||||||
taosMemoryFree(fSet.pSmaF);
|
taosMemoryFree(fSet.pSmaF);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
@ -877,7 +874,7 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) {
|
||||||
// stt
|
// stt
|
||||||
if (sameDisk) {
|
if (sameDisk) {
|
||||||
if (pSetNew->nSttF > pSetOld->nSttF) {
|
if (pSetNew->nSttF > pSetOld->nSttF) {
|
||||||
ASSERT(pSetNew->nSttF = pSetOld->nSttF + 1);
|
ASSERT(pSetNew->nSttF == pSetOld->nSttF + 1);
|
||||||
pSetOld->aSttF[pSetOld->nSttF] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
|
pSetOld->aSttF[pSetOld->nSttF] = (SSttFile *)taosMemoryMalloc(sizeof(SSttFile));
|
||||||
if (pSetOld->aSttF[pSetOld->nSttF] == NULL) {
|
if (pSetOld->aSttF[pSetOld->nSttF] == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -964,7 +961,7 @@ int32_t tsdbFSCommit2(STsdb *pTsdb, STsdbFS *pFSNew) {
|
||||||
nRef = atomic_sub_fetch_32(&pSetOld->pHeadF->nRef, 1);
|
nRef = atomic_sub_fetch_32(&pSetOld->pHeadF->nRef, 1);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
tsdbHeadFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pHeadF, fname);
|
tsdbHeadFileName(pTsdb, pSetOld->diskId, pSetOld->fid, pSetOld->pHeadF, fname);
|
||||||
taosRemoveFile(fname);
|
(void)taosRemoveFile(fname);
|
||||||
taosMemoryFree(pSetOld->pHeadF);
|
taosMemoryFree(pSetOld->pHeadF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1104,7 +1101,7 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) {
|
||||||
ASSERT(nRef >= 0);
|
ASSERT(nRef >= 0);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
tsdbDelFileName(pTsdb, pFS->pDelFile, fname);
|
tsdbDelFileName(pTsdb, pFS->pDelFile, fname);
|
||||||
taosRemoveFile(fname);
|
(void)taosRemoveFile(fname);
|
||||||
taosMemoryFree(pFS->pDelFile);
|
taosMemoryFree(pFS->pDelFile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1117,7 +1114,7 @@ void tsdbFSUnref(STsdb *pTsdb, STsdbFS *pFS) {
|
||||||
ASSERT(nRef >= 0);
|
ASSERT(nRef >= 0);
|
||||||
if (nRef == 0) {
|
if (nRef == 0) {
|
||||||
tsdbHeadFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pHeadF, fname);
|
tsdbHeadFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pHeadF, fname);
|
||||||
taosRemoveFile(fname);
|
(void)taosRemoveFile(fname);
|
||||||
taosMemoryFree(pSet->pHeadF);
|
taosMemoryFree(pSet->pHeadF);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -562,6 +562,8 @@ static int32_t tsdbInsertTableDataImpl(SMemTable *pMemTable, STbData *pTbData, i
|
||||||
|
|
||||||
// backward put first data
|
// backward put first data
|
||||||
row.pTSRow = tGetSubmitBlkNext(&blkIter);
|
row.pTSRow = tGetSubmitBlkNext(&blkIter);
|
||||||
|
if (row.pTSRow == NULL) return code;
|
||||||
|
|
||||||
key.ts = row.pTSRow->ts;
|
key.ts = row.pTSRow->ts;
|
||||||
nRow++;
|
nRow++;
|
||||||
tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD);
|
tbDataMovePosTo(pTbData, pos, &key, SL_MOVE_BACKWARD);
|
||||||
|
|
|
@ -504,9 +504,9 @@ _exit:
|
||||||
SRowInfo *tLDataIterGet(SLDataIter *pIter) { return &pIter->rInfo; }
|
SRowInfo *tLDataIterGet(SLDataIter *pIter) { return &pIter->rInfo; }
|
||||||
|
|
||||||
// SMergeTree =================================================
|
// SMergeTree =================================================
|
||||||
static FORCE_INLINE int32_t tLDataIterCmprFn(const void *p1, const void *p2) {
|
static FORCE_INLINE int32_t tLDataIterCmprFn(const SRBTreeNode *p1, const SRBTreeNode *p2) {
|
||||||
SLDataIter *pIter1 = (SLDataIter *)(((uint8_t *)p1) - sizeof(SRBTreeNode));
|
SLDataIter *pIter1 = (SLDataIter *)(((uint8_t *)p1) - offsetof(SLDataIter, node));
|
||||||
SLDataIter *pIter2 = (SLDataIter *)(((uint8_t *)p2) - sizeof(SRBTreeNode));
|
SLDataIter *pIter2 = (SLDataIter *)(((uint8_t *)p2) - offsetof(SLDataIter, node));
|
||||||
|
|
||||||
TSDBKEY key1 = TSDBROW_KEY(&pIter1->rInfo.row);
|
TSDBKEY key1 = TSDBROW_KEY(&pIter1->rInfo.row);
|
||||||
TSDBKEY key2 = TSDBROW_KEY(&pIter2->rInfo.row);
|
TSDBKEY key2 = TSDBROW_KEY(&pIter2->rInfo.row);
|
||||||
|
@ -543,6 +543,7 @@ int32_t tMergeTreeOpen(SMergeTree *pMTree, int8_t backward, SDataFReader *pFRead
|
||||||
|
|
||||||
pMTree->pLoadInfo = pBlockLoadInfo;
|
pMTree->pLoadInfo = pBlockLoadInfo;
|
||||||
pMTree->destroyLoadInfo = destroyLoadInfo;
|
pMTree->destroyLoadInfo = destroyLoadInfo;
|
||||||
|
ASSERT(pMTree->pLoadInfo != NULL);
|
||||||
|
|
||||||
for (int32_t i = 0; i < pFReader->pSet->nSttF; ++i) { // open all last file
|
for (int32_t i = 0; i < pFReader->pSet->nSttF; ++i) { // open all last file
|
||||||
struct SLDataIter *pIter = NULL;
|
struct SLDataIter *pIter = NULL;
|
||||||
|
@ -583,7 +584,7 @@ bool tMergeTreeNext(SMergeTree *pMTree) {
|
||||||
// compare with min in RB Tree
|
// compare with min in RB Tree
|
||||||
pIter = (SLDataIter *)tRBTreeMin(&pMTree->rbt);
|
pIter = (SLDataIter *)tRBTreeMin(&pMTree->rbt);
|
||||||
if (pMTree->pIter && pIter) {
|
if (pMTree->pIter && pIter) {
|
||||||
int32_t c = pMTree->rbt.cmprFn(RBTREE_NODE_PAYLOAD(&pMTree->pIter->node), RBTREE_NODE_PAYLOAD(&pIter->node));
|
int32_t c = pMTree->rbt.cmprFn(&pMTree->pIter->node, &pIter->node);
|
||||||
if (c > 0) {
|
if (c > 0) {
|
||||||
tRBTreePut(&pMTree->rbt, (SRBTreeNode *)pMTree->pIter);
|
tRBTreePut(&pMTree->rbt, (SRBTreeNode *)pMTree->pIter);
|
||||||
pMTree->pIter = NULL;
|
pMTree->pIter = NULL;
|
||||||
|
|
|
@ -87,9 +87,13 @@ _err:
|
||||||
|
|
||||||
int tsdbClose(STsdb **pTsdb) {
|
int tsdbClose(STsdb **pTsdb) {
|
||||||
if (*pTsdb) {
|
if (*pTsdb) {
|
||||||
taosThreadRwlockDestroy(&(*pTsdb)->rwLock);
|
taosThreadRwlockWrlock(&(*pTsdb)->rwLock);
|
||||||
tsdbMemTableDestroy((*pTsdb)->mem);
|
tsdbMemTableDestroy((*pTsdb)->mem);
|
||||||
(*pTsdb)->mem = NULL;
|
(*pTsdb)->mem = NULL;
|
||||||
|
taosThreadRwlockUnlock(&(*pTsdb)->rwLock);
|
||||||
|
|
||||||
|
taosThreadRwlockDestroy(&(*pTsdb)->rwLock);
|
||||||
|
|
||||||
tsdbFSClose(*pTsdb);
|
tsdbFSClose(*pTsdb);
|
||||||
tsdbCloseCache(*pTsdb);
|
tsdbCloseCache(*pTsdb);
|
||||||
taosMemoryFreeClear(*pTsdb);
|
taosMemoryFreeClear(*pTsdb);
|
||||||
|
|
|
@ -3395,19 +3395,20 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbTakeReadSnap(pReader->pTsdb, &pReader->pReadSnap, pReader->idStr);
|
if (numOfTables > 0) {
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
code = tsdbTakeReadSnap(pReader->pTsdb, &pReader->pReadSnap, pReader->idStr);
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pReader->type == TIMEWINDOW_RANGE_CONTAINED) {
|
|
||||||
code = doOpenReaderImpl(pReader);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
goto _err;
|
||||||
}
|
}
|
||||||
} else {
|
|
||||||
STsdbReader* pPrevReader = pReader->innerReader[0];
|
if (pReader->type == TIMEWINDOW_RANGE_CONTAINED) {
|
||||||
STsdbReader* pNextReader = pReader->innerReader[1];
|
code = doOpenReaderImpl(pReader);
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
STsdbReader* pPrevReader = pReader->innerReader[0];
|
||||||
|
STsdbReader* pNextReader = pReader->innerReader[1];
|
||||||
|
|
||||||
// we need only one row
|
// we need only one row
|
||||||
pPrevReader->capacity = 1;
|
pPrevReader->capacity = 1;
|
||||||
|
@ -3422,19 +3423,20 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, SArray* pTabl
|
||||||
pNextReader->pMemSchema = pReader->pMemSchema;
|
pNextReader->pMemSchema = pReader->pMemSchema;
|
||||||
pNextReader->pReadSnap = pReader->pReadSnap;
|
pNextReader->pReadSnap = pReader->pReadSnap;
|
||||||
|
|
||||||
code = doOpenReaderImpl(pPrevReader);
|
code = doOpenReaderImpl(pPrevReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = doOpenReaderImpl(pNextReader);
|
code = doOpenReaderImpl(pNextReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = doOpenReaderImpl(pReader);
|
code = doOpenReaderImpl(pReader);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3513,6 +3515,10 @@ void tsdbReaderClose(STsdbReader* pReader) {
|
||||||
taosMemoryFree(pLReader);
|
taosMemoryFree(pLReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pReader->innerReader[0] != 0) {
|
||||||
|
tsdbUntakeReadSnap(pReader->innerReader[0]->pTsdb, pReader->innerReader[0]->pReadSnap, pReader->idStr);
|
||||||
|
}
|
||||||
|
|
||||||
tsdbDebug(
|
tsdbDebug(
|
||||||
"%p :io-cost summary: head-file:%" PRIu64 ", head-file time:%.2f ms, SMA:%" PRId64
|
"%p :io-cost summary: head-file:%" PRIu64 ", head-file time:%.2f ms, SMA:%" PRId64
|
||||||
" SMA-time:%.2f ms, fileBlocks:%" PRId64
|
" SMA-time:%.2f ms, fileBlocks:%" PRId64
|
||||||
|
|
|
@ -18,7 +18,7 @@
|
||||||
// =============== PAGE-WISE FILE ===============
|
// =============== PAGE-WISE FILE ===============
|
||||||
static int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsdbFD **ppFD) {
|
static int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsdbFD **ppFD) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
STsdbFD *pFD;
|
STsdbFD *pFD = NULL;
|
||||||
|
|
||||||
*ppFD = NULL;
|
*ppFD = NULL;
|
||||||
|
|
||||||
|
@ -35,6 +35,7 @@ static int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsd
|
||||||
pFD->pFD = taosOpenFile(path, flag);
|
pFD->pFD = taosOpenFile(path, flag);
|
||||||
if (pFD->pFD == NULL) {
|
if (pFD->pFD == NULL) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
taosMemoryFree(pFD);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
pFD->szPage = szPage;
|
pFD->szPage = szPage;
|
||||||
|
@ -42,11 +43,15 @@ static int32_t tsdbOpenFile(const char *path, int32_t szPage, int32_t flag, STsd
|
||||||
pFD->pBuf = taosMemoryCalloc(1, szPage);
|
pFD->pBuf = taosMemoryCalloc(1, szPage);
|
||||||
if (pFD->pBuf == NULL) {
|
if (pFD->pBuf == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
taosCloseFile(&pFD->pFD);
|
||||||
taosMemoryFree(pFD);
|
taosMemoryFree(pFD);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
if (taosStatFile(path, &pFD->szFile, NULL) < 0) {
|
if (taosStatFile(path, &pFD->szFile, NULL) < 0) {
|
||||||
code = TAOS_SYSTEM_ERROR(errno);
|
code = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
taosMemoryFree(pFD->pBuf);
|
||||||
|
taosCloseFile(&pFD->pFD);
|
||||||
|
taosMemoryFree(pFD);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
ASSERT(pFD->szFile % szPage == 0);
|
ASSERT(pFD->szFile % szPage == 0);
|
||||||
|
@ -59,10 +64,12 @@ _exit:
|
||||||
|
|
||||||
static void tsdbCloseFile(STsdbFD **ppFD) {
|
static void tsdbCloseFile(STsdbFD **ppFD) {
|
||||||
STsdbFD *pFD = *ppFD;
|
STsdbFD *pFD = *ppFD;
|
||||||
taosMemoryFree(pFD->pBuf);
|
if (pFD) {
|
||||||
taosCloseFile(&pFD->pFD);
|
taosMemoryFree(pFD->pBuf);
|
||||||
taosMemoryFree(pFD);
|
taosCloseFile(&pFD->pFD);
|
||||||
*ppFD = NULL;
|
taosMemoryFree(pFD);
|
||||||
|
*ppFD = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbWriteFilePage(STsdbFD *pFD) {
|
static int32_t tsdbWriteFilePage(STsdbFD *pFD) {
|
||||||
|
@ -117,7 +124,7 @@ static int32_t tsdbReadFilePage(STsdbFD *pFD, int64_t pgno) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// check
|
// check
|
||||||
if (!taosCheckChecksumWhole(pFD->pBuf, pFD->szPage)) {
|
if (pgno > 1 && !taosCheckChecksumWhole(pFD->pBuf, pFD->szPage)) {
|
||||||
code = TSDB_CODE_FILE_CORRUPTED;
|
code = TSDB_CODE_FILE_CORRUPTED;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
@ -443,7 +450,7 @@ int32_t tsdbWriteDataBlk(SDataFWriter *pWriter, SMapData *mDataBlk, SBlockIdx *p
|
||||||
pBlockIdx->size = size;
|
pBlockIdx->size = size;
|
||||||
pHeadFile->size += size;
|
pHeadFile->size += size;
|
||||||
|
|
||||||
tsdbTrace("vgId:%d, write block, file ID:%d commit ID:%d suid:%" PRId64 " uid:%" PRId64 " offset:%" PRId64
|
tsdbTrace("vgId:%d, write block, file ID:%d commit ID:%" PRId64 " suid:%" PRId64 " uid:%" PRId64 " offset:%" PRId64
|
||||||
" size:%" PRId64 " nItem:%d",
|
" size:%" PRId64 " nItem:%d",
|
||||||
TD_VID(pWriter->pTsdb->pVnode), pWriter->wSet.fid, pHeadFile->commitID, pBlockIdx->suid, pBlockIdx->uid,
|
TD_VID(pWriter->pTsdb->pVnode), pWriter->wSet.fid, pHeadFile->commitID, pBlockIdx->suid, pBlockIdx->uid,
|
||||||
pBlockIdx->offset, pBlockIdx->size, mDataBlk->nItem);
|
pBlockIdx->offset, pBlockIdx->size, mDataBlk->nItem);
|
||||||
|
@ -457,7 +464,7 @@ _err:
|
||||||
int32_t tsdbWriteSttBlk(SDataFWriter *pWriter, SArray *aSttBlk) {
|
int32_t tsdbWriteSttBlk(SDataFWriter *pWriter, SArray *aSttBlk) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SSttFile *pSttFile = &pWriter->fStt[pWriter->wSet.nSttF - 1];
|
SSttFile *pSttFile = &pWriter->fStt[pWriter->wSet.nSttF - 1];
|
||||||
int64_t size;
|
int64_t size = 0;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
|
|
||||||
// check
|
// check
|
||||||
|
@ -836,7 +843,8 @@ _err:
|
||||||
// SDataFReader ====================================================
|
// SDataFReader ====================================================
|
||||||
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet) {
|
int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pSet) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SDataFReader *pReader;
|
int32_t lino = 0;
|
||||||
|
SDataFReader *pReader = NULL;
|
||||||
int32_t szPage = pTsdb->pVnode->config.tsdbPageSize;
|
int32_t szPage = pTsdb->pVnode->config.tsdbPageSize;
|
||||||
char fname[TSDB_FILENAME_LEN];
|
char fname[TSDB_FILENAME_LEN];
|
||||||
|
|
||||||
|
@ -844,7 +852,7 @@ int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pS
|
||||||
pReader = (SDataFReader *)taosMemoryCalloc(1, sizeof(*pReader));
|
pReader = (SDataFReader *)taosMemoryCalloc(1, sizeof(*pReader));
|
||||||
if (pReader == NULL) {
|
if (pReader == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pReader->pTsdb = pTsdb;
|
pReader->pTsdb = pTsdb;
|
||||||
pReader->pSet = pSet;
|
pReader->pSet = pSet;
|
||||||
|
@ -852,31 +860,40 @@ int32_t tsdbDataFReaderOpen(SDataFReader **ppReader, STsdb *pTsdb, SDFileSet *pS
|
||||||
// head
|
// head
|
||||||
tsdbHeadFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pHeadF, fname);
|
tsdbHeadFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pHeadF, fname);
|
||||||
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->pHeadFD);
|
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->pHeadFD);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// data
|
// data
|
||||||
tsdbDataFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pDataF, fname);
|
tsdbDataFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pDataF, fname);
|
||||||
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->pDataFD);
|
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->pDataFD);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// sma
|
// sma
|
||||||
tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname);
|
tsdbSmaFileName(pTsdb, pSet->diskId, pSet->fid, pSet->pSmaF, fname);
|
||||||
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->pSmaFD);
|
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->pSmaFD);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// stt
|
// stt
|
||||||
for (int32_t iStt = 0; iStt < pSet->nSttF; iStt++) {
|
for (int32_t iStt = 0; iStt < pSet->nSttF; iStt++) {
|
||||||
tsdbSttFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSttF[iStt], fname);
|
tsdbSttFileName(pTsdb, pSet->diskId, pSet->fid, pSet->aSttF[iStt], fname);
|
||||||
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->aSttFD[iStt]);
|
code = tsdbOpenFile(fname, szPage, TD_FILE_READ, &pReader->aSttFD[iStt]);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppReader = pReader;
|
_exit:
|
||||||
return code;
|
if (code) {
|
||||||
|
*ppReader = NULL;
|
||||||
|
tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
|
||||||
|
|
||||||
_err:
|
if (pReader) {
|
||||||
tsdbError("vgId:%d, tsdb data file reader open failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
for (int32_t iStt = 0; iStt < pSet->nSttF; iStt++) tsdbCloseFile(&pReader->aSttFD[iStt]);
|
||||||
*ppReader = NULL;
|
tsdbCloseFile(&pReader->pSmaFD);
|
||||||
|
tsdbCloseFile(&pReader->pDataFD);
|
||||||
|
tsdbCloseFile(&pReader->pHeadFD);
|
||||||
|
taosMemoryFree(pReader);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*ppReader = pReader;
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -906,10 +923,6 @@ int32_t tsdbDataFReaderClose(SDataFReader **ppReader) {
|
||||||
taosMemoryFree(*ppReader);
|
taosMemoryFree(*ppReader);
|
||||||
*ppReader = NULL;
|
*ppReader = NULL;
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
|
||||||
tsdbError("vgId:%d, data file reader close failed since %s", TD_VID((*ppReader)->pTsdb->pVnode), tstrerror(code));
|
|
||||||
return code;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx) {
|
int32_t tsdbReadBlockIdx(SDataFReader *pReader, SArray *aBlockIdx) {
|
||||||
|
@ -1289,16 +1302,17 @@ _exit:
|
||||||
// SDelFWriter ====================================================
|
// SDelFWriter ====================================================
|
||||||
int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb) {
|
int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
int32_t lino = 0;
|
||||||
char fname[TSDB_FILENAME_LEN];
|
char fname[TSDB_FILENAME_LEN];
|
||||||
uint8_t hdr[TSDB_FHDR_SIZE] = {0};
|
uint8_t hdr[TSDB_FHDR_SIZE] = {0};
|
||||||
SDelFWriter *pDelFWriter;
|
SDelFWriter *pDelFWriter = NULL;
|
||||||
int64_t n;
|
int64_t n;
|
||||||
|
|
||||||
// alloc
|
// alloc
|
||||||
pDelFWriter = (SDelFWriter *)taosMemoryCalloc(1, sizeof(*pDelFWriter));
|
pDelFWriter = (SDelFWriter *)taosMemoryCalloc(1, sizeof(*pDelFWriter));
|
||||||
if (pDelFWriter == NULL) {
|
if (pDelFWriter == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pDelFWriter->pTsdb = pTsdb;
|
pDelFWriter->pTsdb = pTsdb;
|
||||||
pDelFWriter->fDel = *pFile;
|
pDelFWriter->fDel = *pFile;
|
||||||
|
@ -1306,21 +1320,28 @@ int32_t tsdbDelFWriterOpen(SDelFWriter **ppWriter, SDelFile *pFile, STsdb *pTsdb
|
||||||
tsdbDelFileName(pTsdb, pFile, fname);
|
tsdbDelFileName(pTsdb, pFile, fname);
|
||||||
code = tsdbOpenFile(fname, pTsdb->pVnode->config.tsdbPageSize, TD_FILE_READ | TD_FILE_WRITE | TD_FILE_CREATE,
|
code = tsdbOpenFile(fname, pTsdb->pVnode->config.tsdbPageSize, TD_FILE_READ | TD_FILE_WRITE | TD_FILE_CREATE,
|
||||||
&pDelFWriter->pWriteH);
|
&pDelFWriter->pWriteH);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// update header
|
// update header
|
||||||
code = tsdbWriteFile(pDelFWriter->pWriteH, 0, hdr, TSDB_FHDR_SIZE);
|
code = tsdbWriteFile(pDelFWriter->pWriteH, 0, hdr, TSDB_FHDR_SIZE);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
pDelFWriter->fDel.size = TSDB_FHDR_SIZE;
|
pDelFWriter->fDel.size = TSDB_FHDR_SIZE;
|
||||||
pDelFWriter->fDel.offset = 0;
|
pDelFWriter->fDel.offset = 0;
|
||||||
|
|
||||||
*ppWriter = pDelFWriter;
|
*ppWriter = pDelFWriter;
|
||||||
return code;
|
|
||||||
|
|
||||||
_err:
|
_exit:
|
||||||
tsdbError("vgId:%d, failed to open del file writer since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
if (code) {
|
||||||
*ppWriter = NULL;
|
if (pDelFWriter) {
|
||||||
|
taosMemoryFree(pDelFWriter);
|
||||||
|
tsdbCloseFile(&pDelFWriter->pWriteH);
|
||||||
|
}
|
||||||
|
*ppWriter = NULL;
|
||||||
|
tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(errno));
|
||||||
|
} else {
|
||||||
|
*ppWriter = pDelFWriter;
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1456,15 +1477,15 @@ struct SDelFReader {
|
||||||
|
|
||||||
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb) {
|
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
int32_t lino = 0;
|
||||||
char fname[TSDB_FILENAME_LEN];
|
char fname[TSDB_FILENAME_LEN];
|
||||||
SDelFReader *pDelFReader;
|
SDelFReader *pDelFReader = NULL;
|
||||||
int64_t n;
|
|
||||||
|
|
||||||
// alloc
|
// alloc
|
||||||
pDelFReader = (SDelFReader *)taosMemoryCalloc(1, sizeof(*pDelFReader));
|
pDelFReader = (SDelFReader *)taosMemoryCalloc(1, sizeof(*pDelFReader));
|
||||||
if (pDelFReader == NULL) {
|
if (pDelFReader == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
// open impl
|
// open impl
|
||||||
|
@ -1473,14 +1494,18 @@ int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb
|
||||||
|
|
||||||
tsdbDelFileName(pTsdb, pFile, fname);
|
tsdbDelFileName(pTsdb, pFile, fname);
|
||||||
code = tsdbOpenFile(fname, pTsdb->pVnode->config.tsdbPageSize, TD_FILE_READ, &pDelFReader->pReadH);
|
code = tsdbOpenFile(fname, pTsdb->pVnode->config.tsdbPageSize, TD_FILE_READ, &pDelFReader->pReadH);
|
||||||
if (code) goto _err;
|
if (code) {
|
||||||
|
taosMemoryFree(pDelFReader);
|
||||||
|
goto _exit;
|
||||||
|
}
|
||||||
|
|
||||||
*ppReader = pDelFReader;
|
_exit:
|
||||||
return code;
|
if (code) {
|
||||||
|
*ppReader = NULL;
|
||||||
_err:
|
tsdbError("vgId:%d %s failed at %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
|
||||||
tsdbError("vgId:%d, del file reader open failed since %s", TD_VID(pTsdb->pVnode), tstrerror(code));
|
} else {
|
||||||
*ppReader = NULL;
|
*ppReader = pDelFReader;
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -67,6 +67,13 @@ extern int32_t tRowInfoCmprFn(const void* p1, const void* p2);
|
||||||
extern int32_t tsdbReadDataBlockEx(SDataFReader* pReader, SDataBlk* pDataBlk, SBlockData* pBlockData);
|
extern int32_t tsdbReadDataBlockEx(SDataFReader* pReader, SDataBlk* pDataBlk, SBlockData* pBlockData);
|
||||||
extern int32_t tsdbUpdateTableSchema(SMeta* pMeta, int64_t suid, int64_t uid, SSkmInfo* pSkmInfo);
|
extern int32_t tsdbUpdateTableSchema(SMeta* pMeta, int64_t suid, int64_t uid, SSkmInfo* pSkmInfo);
|
||||||
|
|
||||||
|
static int32_t tFDataIterCmprFn(const SRBTreeNode* pNode1, const SRBTreeNode* pNode2) {
|
||||||
|
SFDataIter* pIter1 = (SFDataIter*)(((uint8_t*)pNode1) - offsetof(SFDataIter, n));
|
||||||
|
SFDataIter* pIter2 = (SFDataIter*)(((uint8_t*)pNode2) - offsetof(SFDataIter, n));
|
||||||
|
|
||||||
|
return tRowInfoCmprFn(&pIter1->rInfo, &pIter2->rInfo);
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t tsdbSnapReadOpenFile(STsdbSnapReader* pReader) {
|
static int32_t tsdbSnapReadOpenFile(STsdbSnapReader* pReader) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
|
@ -79,7 +86,7 @@ static int32_t tsdbSnapReadOpenFile(STsdbSnapReader* pReader) {
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
|
|
||||||
pReader->pIter = NULL;
|
pReader->pIter = NULL;
|
||||||
tRBTreeCreate(&pReader->rbt, tRowInfoCmprFn);
|
tRBTreeCreate(&pReader->rbt, tFDataIterCmprFn);
|
||||||
|
|
||||||
// .data file
|
// .data file
|
||||||
SFDataIter* pIter = &pReader->aFDataIter[0];
|
SFDataIter* pIter = &pReader->aFDataIter[0];
|
||||||
|
@ -421,7 +428,7 @@ static int32_t tsdbSnapReadDel(STsdbSnapReader* pReader, uint8_t** ppData) {
|
||||||
n += tPutDelData((*ppData) + n, pDelData);
|
n += tPutDelData((*ppData) + n, pDelData);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, vnode snapshot tsdb read del data for %s, suid:%" PRId64 " uid:%d" PRId64 " size:%d",
|
tsdbInfo("vgId:%d, vnode snapshot tsdb read del data for %s, suid:%" PRId64 " uid:%" PRId64 " size:%d",
|
||||||
TD_VID(pTsdb->pVnode), pTsdb->path, pDelIdx->suid, pDelIdx->uid, size);
|
TD_VID(pTsdb->pVnode), pTsdb->path, pDelIdx->suid, pDelIdx->uid, size);
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
@ -431,20 +438,21 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tsdbError("vgId:%d, vnode snapshot tsdb read del for %s failed since %s", TD_VID(pTsdb->pVnode), pTsdb->pVnode,
|
tsdbError("vgId:%d, vnode snapshot tsdb read del for %s failed since %s", TD_VID(pTsdb->pVnode), pTsdb->path,
|
||||||
tstrerror(code));
|
tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type, STsdbSnapReader** ppReader) {
|
int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type, STsdbSnapReader** ppReader) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
int32_t lino = 0;
|
||||||
STsdbSnapReader* pReader = NULL;
|
STsdbSnapReader* pReader = NULL;
|
||||||
|
|
||||||
// alloc
|
// alloc
|
||||||
pReader = (STsdbSnapReader*)taosMemoryCalloc(1, sizeof(*pReader));
|
pReader = (STsdbSnapReader*)taosMemoryCalloc(1, sizeof(*pReader));
|
||||||
if (pReader == NULL) {
|
if (pReader == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pReader->pTsdb = pTsdb;
|
pReader->pTsdb = pTsdb;
|
||||||
pReader->sver = sver;
|
pReader->sver = sver;
|
||||||
|
@ -454,19 +462,19 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type
|
||||||
code = taosThreadRwlockRdlock(&pTsdb->rwLock);
|
code = taosThreadRwlockRdlock(&pTsdb->rwLock);
|
||||||
if (code) {
|
if (code) {
|
||||||
code = TAOS_SYSTEM_ERROR(code);
|
code = TAOS_SYSTEM_ERROR(code);
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbFSRef(pTsdb, &pReader->fs);
|
code = tsdbFSRef(pTsdb, &pReader->fs);
|
||||||
if (code) {
|
if (code) {
|
||||||
taosThreadRwlockUnlock(&pTsdb->rwLock);
|
taosThreadRwlockUnlock(&pTsdb->rwLock);
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = taosThreadRwlockUnlock(&pTsdb->rwLock);
|
code = taosThreadRwlockUnlock(&pTsdb->rwLock);
|
||||||
if (code) {
|
if (code) {
|
||||||
code = TAOS_SYSTEM_ERROR(code);
|
code = TAOS_SYSTEM_ERROR(code);
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
// data
|
// data
|
||||||
|
@ -478,43 +486,52 @@ int32_t tsdbSnapReaderOpen(STsdb* pTsdb, int64_t sver, int64_t ever, int8_t type
|
||||||
pIter->aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
pIter->aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
if (pIter->aBlockIdx == NULL) {
|
if (pIter->aBlockIdx == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pIter->aSttBlk = taosArrayInit(0, sizeof(SSttBlk));
|
pIter->aSttBlk = taosArrayInit(0, sizeof(SSttBlk));
|
||||||
if (pIter->aSttBlk == NULL) {
|
if (pIter->aSttBlk == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tBlockDataCreate(&pIter->bData);
|
code = tBlockDataCreate(&pIter->bData);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tBlockDataCreate(&pReader->bData);
|
code = tBlockDataCreate(&pReader->bData);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// del
|
// del
|
||||||
pReader->aDelIdx = taosArrayInit(0, sizeof(SDelIdx));
|
pReader->aDelIdx = taosArrayInit(0, sizeof(SDelIdx));
|
||||||
if (pReader->aDelIdx == NULL) {
|
if (pReader->aDelIdx == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pReader->aDelData = taosArrayInit(0, sizeof(SDelData));
|
pReader->aDelData = taosArrayInit(0, sizeof(SDelData));
|
||||||
if (pReader->aDelData == NULL) {
|
if (pReader->aDelData == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, vnode snapshot tsdb reader opened for %s", TD_VID(pTsdb->pVnode), pTsdb->path);
|
_exit:
|
||||||
*ppReader = pReader;
|
if (code) {
|
||||||
return code;
|
tsdbError("vgId:%d %s failed at line %d since %s, TSDB path: %s", TD_VID(pTsdb->pVnode), lino, tstrerror(code),
|
||||||
|
pTsdb->path);
|
||||||
|
*ppReader = NULL;
|
||||||
|
|
||||||
_err:
|
if (pReader) {
|
||||||
tsdbError("vgId:%d, vnode snapshot tsdb reader open for %s failed since %s", TD_VID(pTsdb->pVnode), pTsdb->path,
|
taosArrayDestroy(pReader->aDelData);
|
||||||
tstrerror(code));
|
taosArrayDestroy(pReader->aDelIdx);
|
||||||
*ppReader = NULL;
|
tBlockDataDestroy(&pReader->bData, 1);
|
||||||
|
tsdbFSDestroy(&pReader->fs);
|
||||||
|
taosMemoryFree(pReader);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
*ppReader = pReader;
|
||||||
|
tsdbInfo("vgId:%d, vnode snapshot tsdb reader opened for %s", TD_VID(pTsdb->pVnode), pTsdb->path);
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1247,20 +1264,21 @@ _err:
|
||||||
// APIs
|
// APIs
|
||||||
int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWriter** ppWriter) {
|
int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWriter** ppWriter) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
int32_t lino = 0;
|
||||||
STsdbSnapWriter* pWriter = NULL;
|
STsdbSnapWriter* pWriter = NULL;
|
||||||
|
|
||||||
// alloc
|
// alloc
|
||||||
pWriter = (STsdbSnapWriter*)taosMemoryCalloc(1, sizeof(*pWriter));
|
pWriter = (STsdbSnapWriter*)taosMemoryCalloc(1, sizeof(*pWriter));
|
||||||
if (pWriter == NULL) {
|
if (pWriter == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pWriter->pTsdb = pTsdb;
|
pWriter->pTsdb = pTsdb;
|
||||||
pWriter->sver = sver;
|
pWriter->sver = sver;
|
||||||
pWriter->ever = ever;
|
pWriter->ever = ever;
|
||||||
|
|
||||||
code = tsdbFSCopy(pTsdb, &pWriter->fs);
|
code = tsdbFSCopy(pTsdb, &pWriter->fs);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// config
|
// config
|
||||||
pWriter->minutes = pTsdb->keepCfg.days;
|
pWriter->minutes = pTsdb->keepCfg.days;
|
||||||
|
@ -1272,7 +1290,7 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
|
||||||
|
|
||||||
// SNAP_DATA_TSDB
|
// SNAP_DATA_TSDB
|
||||||
code = tBlockDataCreate(&pWriter->bData);
|
code = tBlockDataCreate(&pWriter->bData);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
pWriter->fid = INT32_MIN;
|
pWriter->fid = INT32_MIN;
|
||||||
pWriter->id = (TABLEID){0};
|
pWriter->id = (TABLEID){0};
|
||||||
|
@ -1280,53 +1298,67 @@ int32_t tsdbSnapWriterOpen(STsdb* pTsdb, int64_t sver, int64_t ever, STsdbSnapWr
|
||||||
pWriter->dReader.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
pWriter->dReader.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
if (pWriter->dReader.aBlockIdx == NULL) {
|
if (pWriter->dReader.aBlockIdx == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
code = tBlockDataCreate(&pWriter->dReader.bData);
|
code = tBlockDataCreate(&pWriter->dReader.bData);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// Writer
|
// Writer
|
||||||
pWriter->dWriter.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
pWriter->dWriter.aBlockIdx = taosArrayInit(0, sizeof(SBlockIdx));
|
||||||
if (pWriter->dWriter.aBlockIdx == NULL) {
|
if (pWriter->dWriter.aBlockIdx == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pWriter->dWriter.aSttBlk = taosArrayInit(0, sizeof(SSttBlk));
|
pWriter->dWriter.aSttBlk = taosArrayInit(0, sizeof(SSttBlk));
|
||||||
if (pWriter->dWriter.aSttBlk == NULL) {
|
if (pWriter->dWriter.aSttBlk == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
code = tBlockDataCreate(&pWriter->dWriter.bData);
|
code = tBlockDataCreate(&pWriter->dWriter.bData);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
code = tBlockDataCreate(&pWriter->dWriter.sData);
|
code = tBlockDataCreate(&pWriter->dWriter.sData);
|
||||||
if (code) goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
// SNAP_DATA_DEL
|
// SNAP_DATA_DEL
|
||||||
pWriter->aDelIdxR = taosArrayInit(0, sizeof(SDelIdx));
|
pWriter->aDelIdxR = taosArrayInit(0, sizeof(SDelIdx));
|
||||||
if (pWriter->aDelIdxR == NULL) {
|
if (pWriter->aDelIdxR == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pWriter->aDelData = taosArrayInit(0, sizeof(SDelData));
|
pWriter->aDelData = taosArrayInit(0, sizeof(SDelData));
|
||||||
if (pWriter->aDelData == NULL) {
|
if (pWriter->aDelData == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
pWriter->aDelIdxW = taosArrayInit(0, sizeof(SDelIdx));
|
pWriter->aDelIdxW = taosArrayInit(0, sizeof(SDelIdx));
|
||||||
if (pWriter->aDelIdxW == NULL) {
|
if (pWriter->aDelIdxW == NULL) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
}
|
}
|
||||||
|
|
||||||
*ppWriter = pWriter;
|
_exit:
|
||||||
|
if (code) {
|
||||||
|
tsdbError("vgId:%d %s failed at line %d since %s", TD_VID(pTsdb->pVnode), __func__, lino, tstrerror(code));
|
||||||
|
*ppWriter = NULL;
|
||||||
|
|
||||||
tsdbInfo("vgId:%d, tsdb snapshot writer open for %s succeed", TD_VID(pTsdb->pVnode), pTsdb->path);
|
if (pWriter) {
|
||||||
return code;
|
if (pWriter->aDelIdxW) taosArrayDestroy(pWriter->aDelIdxW);
|
||||||
|
if (pWriter->aDelData) taosArrayDestroy(pWriter->aDelData);
|
||||||
_err:
|
if (pWriter->aDelIdxR) taosArrayDestroy(pWriter->aDelIdxR);
|
||||||
tsdbError("vgId:%d, tsdb snapshot writer open for %s failed since %s", TD_VID(pTsdb->pVnode), pTsdb->path,
|
tBlockDataDestroy(&pWriter->dWriter.sData, 1);
|
||||||
tstrerror(code));
|
tBlockDataDestroy(&pWriter->dWriter.bData, 1);
|
||||||
*ppWriter = NULL;
|
if (pWriter->dWriter.aSttBlk) taosArrayDestroy(pWriter->dWriter.aSttBlk);
|
||||||
|
if (pWriter->dWriter.aBlockIdx) taosArrayDestroy(pWriter->dWriter.aBlockIdx);
|
||||||
|
tBlockDataDestroy(&pWriter->dReader.bData, 1);
|
||||||
|
if (pWriter->dReader.aBlockIdx) taosArrayDestroy(pWriter->dReader.aBlockIdx);
|
||||||
|
tBlockDataDestroy(&pWriter->bData, 1);
|
||||||
|
tsdbFSDestroy(&pWriter->fs);
|
||||||
|
taosMemoryFree(pWriter);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tsdbDebug("vgId:%d, tsdb snapshot writer open for %s succeed", TD_VID(pTsdb->pVnode), pTsdb->path);
|
||||||
|
*ppWriter = pWriter;
|
||||||
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -34,7 +34,9 @@ int tsdbInsertData(STsdb *pTsdb, int64_t version, SSubmitReq *pMsg, SSubmitRsp *
|
||||||
}
|
}
|
||||||
|
|
||||||
// loop to insert
|
// loop to insert
|
||||||
tInitSubmitMsgIter(pMsg, &msgIter);
|
if (tInitSubmitMsgIter(pMsg, &msgIter) < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
while (true) {
|
while (true) {
|
||||||
SSubmitBlkRsp r = {0};
|
SSubmitBlkRsp r = {0};
|
||||||
tGetSubmitMsgNext(&msgIter, &pBlock);
|
tGetSubmitMsgNext(&msgIter, &pBlock);
|
||||||
|
|
|
@ -143,17 +143,17 @@ void *vnodeBufPoolMalloc(SVBufPool *pPool, int size) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void vnodeBufPoolFree(SVBufPool *pPool, void *p) {
|
void vnodeBufPoolFree(SVBufPool *pPool, void *p) {
|
||||||
uint8_t *ptr = (uint8_t *)p;
|
// uint8_t *ptr = (uint8_t *)p;
|
||||||
SVBufPoolNode *pNode;
|
// SVBufPoolNode *pNode;
|
||||||
|
|
||||||
if (ptr < pPool->node.data || ptr >= pPool->node.data + pPool->node.size) {
|
// if (ptr < pPool->node.data || ptr >= pPool->node.data + pPool->node.size) {
|
||||||
pNode = &((SVBufPoolNode *)p)[-1];
|
// pNode = &((SVBufPoolNode *)p)[-1];
|
||||||
*pNode->pnext = pNode->prev;
|
// *pNode->pnext = pNode->prev;
|
||||||
pNode->prev->pnext = pNode->pnext;
|
// pNode->prev->pnext = pNode->pnext;
|
||||||
|
|
||||||
pPool->size = pPool->size - sizeof(*pNode) - pNode->size;
|
// pPool->size = pPool->size - sizeof(*pNode) - pNode->size;
|
||||||
taosMemoryFree(pNode);
|
// taosMemoryFree(pNode);
|
||||||
}
|
// }
|
||||||
}
|
}
|
||||||
|
|
||||||
void vnodeBufPoolRef(SVBufPool *pPool) {
|
void vnodeBufPoolRef(SVBufPool *pPool) {
|
||||||
|
|
|
@ -46,11 +46,17 @@ int vnodeInit(int nthreads) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
vnodeGlobal.stop = 0;
|
taosThreadMutexInit(&vnodeGlobal.mutex, NULL);
|
||||||
|
taosThreadCondInit(&vnodeGlobal.hasTask, NULL);
|
||||||
|
|
||||||
|
taosThreadMutexLock(&vnodeGlobal.mutex);
|
||||||
|
|
||||||
|
vnodeGlobal.stop = 0;
|
||||||
vnodeGlobal.queue.next = &vnodeGlobal.queue;
|
vnodeGlobal.queue.next = &vnodeGlobal.queue;
|
||||||
vnodeGlobal.queue.prev = &vnodeGlobal.queue;
|
vnodeGlobal.queue.prev = &vnodeGlobal.queue;
|
||||||
|
|
||||||
|
taosThreadMutexUnlock(&(vnodeGlobal.mutex));
|
||||||
|
|
||||||
vnodeGlobal.nthreads = nthreads;
|
vnodeGlobal.nthreads = nthreads;
|
||||||
vnodeGlobal.threads = taosMemoryCalloc(nthreads, sizeof(TdThread));
|
vnodeGlobal.threads = taosMemoryCalloc(nthreads, sizeof(TdThread));
|
||||||
if (vnodeGlobal.threads == NULL) {
|
if (vnodeGlobal.threads == NULL) {
|
||||||
|
@ -59,9 +65,6 @@ int vnodeInit(int nthreads) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
taosThreadMutexInit(&vnodeGlobal.mutex, NULL);
|
|
||||||
taosThreadCondInit(&vnodeGlobal.hasTask, NULL);
|
|
||||||
|
|
||||||
for (int i = 0; i < nthreads; i++) {
|
for (int i = 0; i < nthreads; i++) {
|
||||||
taosThreadCreate(&(vnodeGlobal.threads[i]), NULL, loop, NULL);
|
taosThreadCreate(&(vnodeGlobal.threads[i]), NULL, loop, NULL);
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,7 +38,7 @@ int vnodeCreate(const char *path, SVnodeCfg *pCfg, STfs *pTfs) {
|
||||||
if (taosMkDir(path)) {
|
if (taosMkDir(path)) {
|
||||||
return TAOS_SYSTEM_ERROR(errno);
|
return TAOS_SYSTEM_ERROR(errno);
|
||||||
}
|
}
|
||||||
strcpy(dir, path);
|
snprintf(dir, TSDB_FILENAME_LEN, "%s", path);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pCfg) {
|
if (pCfg) {
|
||||||
|
@ -51,7 +51,7 @@ int vnodeCreate(const char *path, SVnodeCfg *pCfg, STfs *pTfs) {
|
||||||
info.state.commitID = 0;
|
info.state.commitID = 0;
|
||||||
|
|
||||||
if (vnodeSaveInfo(dir, &info) < 0 || vnodeCommitInfo(dir, &info) < 0) {
|
if (vnodeSaveInfo(dir, &info) < 0 || vnodeCommitInfo(dir, &info) < 0) {
|
||||||
vError("vgId:%d, failed to save vnode config since %s", pCfg->vgId, tstrerror(terrno));
|
vError("vgId:%d, failed to save vnode config since %s", pCfg ? pCfg->vgId : 0, tstrerror(terrno));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -166,7 +166,7 @@ int32_t vnodeSnapRead(SVSnapReader *pReader, uint8_t **ppData, uint32_t *nData)
|
||||||
if (*ppData) {
|
if (*ppData) {
|
||||||
goto _exit;
|
goto _exit;
|
||||||
} else {
|
} else {
|
||||||
pReader->tqHandleDone = 1;
|
pReader->tqOffsetDone = 1;
|
||||||
code = tqOffsetReaderClose(&pReader->pTqOffsetReader);
|
code = tqOffsetReaderClose(&pReader->pTqOffsetReader);
|
||||||
if (code) goto _err;
|
if (code) goto _err;
|
||||||
}
|
}
|
||||||
|
@ -219,7 +219,7 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
vError("vgId:% vnode snapshot read failed since %s", TD_VID(pReader->pVnode), tstrerror(code));
|
vError("vgId:%d vnode snapshot read failed since %s", TD_VID(pReader->pVnode), tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -260,7 +260,10 @@ int32_t vnodeSnapWriterOpen(SVnode *pVnode, int64_t sver, int64_t ever, SVSnapWr
|
||||||
|
|
||||||
// commit it
|
// commit it
|
||||||
code = vnodeCommit(pVnode);
|
code = vnodeCommit(pVnode);
|
||||||
if (code) goto _err;
|
if (code) {
|
||||||
|
taosMemoryFree(pWriter);
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
// inc commit ID
|
// inc commit ID
|
||||||
pVnode->state.commitID++;
|
pVnode->state.commitID++;
|
||||||
|
|
|
@ -43,14 +43,23 @@ int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
tDecoderInit(&dc, (uint8_t *)pMsg->pCont + sizeof(SMsgHead), pMsg->contLen - sizeof(SMsgHead));
|
tDecoderInit(&dc, (uint8_t *)pMsg->pCont + sizeof(SMsgHead), pMsg->contLen - sizeof(SMsgHead));
|
||||||
tStartDecode(&dc);
|
tStartDecode(&dc);
|
||||||
|
|
||||||
tDecodeI32v(&dc, &nReqs);
|
if (tDecodeI32v(&dc, &nReqs) < 0) {
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
for (int32_t iReq = 0; iReq < nReqs; iReq++) {
|
for (int32_t iReq = 0; iReq < nReqs; iReq++) {
|
||||||
tb_uid_t uid = tGenIdPI64();
|
tb_uid_t uid = tGenIdPI64();
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
tStartDecode(&dc);
|
tStartDecode(&dc);
|
||||||
|
|
||||||
tDecodeI32v(&dc, NULL);
|
if (tDecodeI32v(&dc, NULL) < 0) {
|
||||||
tDecodeCStr(&dc, &name);
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
if (tDecodeCStr(&dc, &name) < 0) {
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
*(int64_t *)(dc.data + dc.pos) = uid;
|
*(int64_t *)(dc.data + dc.pos) = uid;
|
||||||
*(int64_t *)(dc.data + dc.pos + 8) = ctime;
|
*(int64_t *)(dc.data + dc.pos + 8) = ctime;
|
||||||
|
|
||||||
|
@ -68,7 +77,10 @@ int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
int64_t ctime = taosGetTimestampMs();
|
int64_t ctime = taosGetTimestampMs();
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
|
|
||||||
tInitSubmitMsgIter(pSubmitReq, &msgIter);
|
if (tInitSubmitMsgIter(pSubmitReq, &msgIter) < 0) {
|
||||||
|
code = terrno;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
|
|
||||||
for (;;) {
|
for (;;) {
|
||||||
tGetSubmitMsgNext(&msgIter, &pBlock);
|
tGetSubmitMsgNext(&msgIter, &pBlock);
|
||||||
|
@ -78,10 +90,19 @@ int32_t vnodePreProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
char *name = NULL;
|
char *name = NULL;
|
||||||
|
|
||||||
tDecoderInit(&dc, pBlock->data, msgIter.schemaLen);
|
tDecoderInit(&dc, pBlock->data, msgIter.schemaLen);
|
||||||
tStartDecode(&dc);
|
if (tStartDecode(&dc) < 0) {
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
tDecodeI32v(&dc, NULL);
|
if (tDecodeI32v(&dc, NULL) < 0) {
|
||||||
tDecodeCStr(&dc, &name);
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
if (tDecodeCStr(&dc, &name) < 0) {
|
||||||
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
uid = metaGetTableEntryUidByName(pVnode->pMeta, name);
|
uid = metaGetTableEntryUidByName(pVnode->pMeta, name);
|
||||||
if (uid == 0) {
|
if (uid == 0) {
|
||||||
|
|
|
@ -638,7 +638,7 @@ int32_t ctgGetQnodeListFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, SArray
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_QNODE_LIST;
|
int32_t reqType = TDMT_MND_QNODE_LIST;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get qnode list from mnode, mgmtEpInUse:%d", pConn->mgmtEps.inUse);
|
ctgDebug("try to get qnode list from mnode, mgmtEpInUse:%d", pConn->mgmtEps.inUse);
|
||||||
|
|
||||||
|
@ -692,7 +692,7 @@ int32_t ctgGetDnodeListFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, SArray
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_DNODE_LIST;
|
int32_t reqType = TDMT_MND_DNODE_LIST;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get dnode list from mnode, mgmtEpInUse:%d", pConn->mgmtEps.inUse);
|
ctgDebug("try to get dnode list from mnode, mgmtEpInUse:%d", pConn->mgmtEps.inUse);
|
||||||
|
|
||||||
|
@ -743,7 +743,7 @@ int32_t ctgGetDBVgInfoFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, SBuildU
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_USE_DB;
|
int32_t reqType = TDMT_MND_USE_DB;
|
||||||
SCtgTask* pTask = tReq ? tReq->pTask : NULL;
|
SCtgTask* pTask = tReq ? tReq->pTask : NULL;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get db vgInfo from mnode, dbFName:%s", input->db);
|
ctgDebug("try to get db vgInfo from mnode, dbFName:%s", input->db);
|
||||||
|
|
||||||
|
@ -795,7 +795,7 @@ int32_t ctgGetDBCfgFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, const char
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_GET_DB_CFG;
|
int32_t reqType = TDMT_MND_GET_DB_CFG;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get db cfg from mnode, dbFName:%s", dbFName);
|
ctgDebug("try to get db cfg from mnode, dbFName:%s", dbFName);
|
||||||
|
|
||||||
|
@ -850,7 +850,7 @@ int32_t ctgGetIndexInfoFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, const
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_GET_INDEX;
|
int32_t reqType = TDMT_MND_GET_INDEX;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get index from mnode, indexName:%s", indexName);
|
ctgDebug("try to get index from mnode, indexName:%s", indexName);
|
||||||
|
|
||||||
|
@ -905,7 +905,7 @@ int32_t ctgGetTbIndexFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, SName* n
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_GET_TABLE_INDEX;
|
int32_t reqType = TDMT_MND_GET_TABLE_INDEX;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
tNameExtractFullName(name, tbFName);
|
tNameExtractFullName(name, tbFName);
|
||||||
|
|
||||||
|
@ -962,7 +962,7 @@ int32_t ctgGetUdfInfoFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, const ch
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_RETRIEVE_FUNC;
|
int32_t reqType = TDMT_MND_RETRIEVE_FUNC;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get udf info from mnode, funcName:%s", funcName);
|
ctgDebug("try to get udf info from mnode, funcName:%s", funcName);
|
||||||
|
|
||||||
|
@ -1017,7 +1017,7 @@ int32_t ctgGetUserDbAuthFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, const
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_GET_USER_AUTH;
|
int32_t reqType = TDMT_MND_GET_USER_AUTH;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get user auth from mnode, user:%s", user);
|
ctgDebug("try to get user auth from mnode, user:%s", user);
|
||||||
|
|
||||||
|
@ -1077,7 +1077,7 @@ int32_t ctgGetTbMetaFromMnodeImpl(SCatalog* pCtg, SRequestConnInfo* pConn, char*
|
||||||
int32_t reqType = TDMT_MND_TABLE_META;
|
int32_t reqType = TDMT_MND_TABLE_META;
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
sprintf(tbFName, "%s.%s", dbFName, tbName);
|
sprintf(tbFName, "%s.%s", dbFName, tbName);
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
ctgDebug("try to get table meta from mnode, tbFName:%s", tbFName);
|
ctgDebug("try to get table meta from mnode, tbFName:%s", tbFName);
|
||||||
|
|
||||||
|
@ -1140,7 +1140,7 @@ int32_t ctgGetTbMetaFromVnode(SCatalog* pCtg, SRequestConnInfo* pConn, const SNa
|
||||||
int32_t reqType = TDMT_VND_TABLE_META;
|
int32_t reqType = TDMT_VND_TABLE_META;
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
sprintf(tbFName, "%s.%s", dbFName, pTableName->tname);
|
sprintf(tbFName, "%s.%s", dbFName, pTableName->tname);
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
|
SEp* pEp = &vgroupInfo->epSet.eps[vgroupInfo->epSet.inUse];
|
||||||
ctgDebug("try to get table meta from vnode, vgId:%d, ep num:%d, ep %s:%d, tbFName:%s", vgroupInfo->vgId,
|
ctgDebug("try to get table meta from vnode, vgId:%d, ep num:%d, ep %s:%d, tbFName:%s", vgroupInfo->vgId,
|
||||||
|
@ -1209,7 +1209,7 @@ int32_t ctgGetTableCfgFromVnode(SCatalog* pCtg, SRequestConnInfo* pConn, const S
|
||||||
int32_t reqType = TDMT_VND_TABLE_CFG;
|
int32_t reqType = TDMT_VND_TABLE_CFG;
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
tNameExtractFullName(pTableName, tbFName);
|
tNameExtractFullName(pTableName, tbFName);
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
tNameGetFullDbName(pTableName, dbFName);
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
SBuildTableInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
|
SBuildTableInput bInput = {.vgId = vgroupInfo->vgId, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
|
||||||
|
@ -1274,7 +1274,7 @@ int32_t ctgGetTableCfgFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, const S
|
||||||
int32_t reqType = TDMT_MND_TABLE_CFG;
|
int32_t reqType = TDMT_MND_TABLE_CFG;
|
||||||
char tbFName[TSDB_TABLE_FNAME_LEN];
|
char tbFName[TSDB_TABLE_FNAME_LEN];
|
||||||
tNameExtractFullName(pTableName, tbFName);
|
tNameExtractFullName(pTableName, tbFName);
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
tNameGetFullDbName(pTableName, dbFName);
|
tNameGetFullDbName(pTableName, dbFName);
|
||||||
SBuildTableInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
|
SBuildTableInput bInput = {.vgId = 0, .dbFName = dbFName, .tbName = (char*)pTableName->tname};
|
||||||
|
@ -1326,7 +1326,7 @@ int32_t ctgGetSvrVerFromMnode(SCatalog* pCtg, SRequestConnInfo* pConn, char** ou
|
||||||
char* msg = NULL;
|
char* msg = NULL;
|
||||||
int32_t msgLen = 0;
|
int32_t msgLen = 0;
|
||||||
int32_t reqType = TDMT_MND_SERVER_VERSION;
|
int32_t reqType = TDMT_MND_SERVER_VERSION;
|
||||||
void* (*mallocFp)(int32_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
void* (*mallocFp)(int64_t) = pTask ? taosMemoryMalloc : rpcMallocCont;
|
||||||
|
|
||||||
qDebug("try to get svr ver from mnode");
|
qDebug("try to get svr ver from mnode");
|
||||||
|
|
||||||
|
|
|
@ -212,6 +212,7 @@ typedef struct SExprSupp {
|
||||||
int32_t numOfExprs; // the number of scalar expression in group operator
|
int32_t numOfExprs; // the number of scalar expression in group operator
|
||||||
SqlFunctionCtx* pCtx;
|
SqlFunctionCtx* pCtx;
|
||||||
int32_t* rowEntryInfoOffset; // offset value for each row result cell info
|
int32_t* rowEntryInfoOffset; // offset value for each row result cell info
|
||||||
|
SFilterInfo* pFilterInfo;
|
||||||
} SExprSupp;
|
} SExprSupp;
|
||||||
|
|
||||||
typedef struct SOperatorInfo {
|
typedef struct SOperatorInfo {
|
||||||
|
@ -479,6 +480,7 @@ typedef struct SStreamScanInfo {
|
||||||
SExprInfo* pPseudoExpr;
|
SExprInfo* pPseudoExpr;
|
||||||
int32_t numOfPseudoExpr;
|
int32_t numOfPseudoExpr;
|
||||||
SExprSupp tbnameCalSup;
|
SExprSupp tbnameCalSup;
|
||||||
|
SExprSupp tagCalSup;
|
||||||
int32_t primaryTsIndex; // primary time stamp slot id
|
int32_t primaryTsIndex; // primary time stamp slot id
|
||||||
SReadHandle readHandle;
|
SReadHandle readHandle;
|
||||||
SInterval interval; // if the upstream is an interval operator, the interval info is also kept here.
|
SInterval interval; // if the upstream is an interval operator, the interval info is also kept here.
|
||||||
|
@ -775,6 +777,7 @@ typedef struct SStreamPartitionOperatorInfo {
|
||||||
SPartitionBySupporter partitionSup;
|
SPartitionBySupporter partitionSup;
|
||||||
SExprSupp scalarSup;
|
SExprSupp scalarSup;
|
||||||
SExprSupp tbnameCalSup;
|
SExprSupp tbnameCalSup;
|
||||||
|
SExprSupp tagCalSup;
|
||||||
SHashObj* pPartitions;
|
SHashObj* pPartitions;
|
||||||
void* parIte;
|
void* parIte;
|
||||||
SSDataBlock* pInputDataBlock;
|
SSDataBlock* pInputDataBlock;
|
||||||
|
@ -924,7 +927,7 @@ int32_t getTableScanInfo(SOperatorInfo* pOperator, int32_t* order, int32_t* scan
|
||||||
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz);
|
int32_t getBufferPgSize(int32_t rowSize, uint32_t* defaultPgsz, uint32_t* defaultBufsz);
|
||||||
|
|
||||||
void doSetOperatorCompleted(SOperatorInfo* pOperator);
|
void doSetOperatorCompleted(SOperatorInfo* pOperator);
|
||||||
void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, const SArray* pColMatchInfo);
|
void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, const SArray* pColMatchInfo, SFilterInfo* pFilterInfo);
|
||||||
int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int32_t numOfPseudoExpr,
|
int32_t addTagPseudoColumnData(SReadHandle* pHandle, SExprInfo* pPseudoExpr, int32_t numOfPseudoExpr,
|
||||||
SSDataBlock* pBlock, const char* idStr);
|
SSDataBlock* pBlock, const char* idStr);
|
||||||
|
|
||||||
|
|
|
@ -1250,6 +1250,17 @@ void createExprFromOneNode(SExprInfo* pExp, SNode* pNode, int16_t slotId) {
|
||||||
pExp->base.resSchema =
|
pExp->base.resSchema =
|
||||||
createResSchema(pType->type, pType->bytes, slotId, pType->scale, pType->precision, pOpNode->node.aliasName);
|
createResSchema(pType->type, pType->bytes, slotId, pType->scale, pType->precision, pOpNode->node.aliasName);
|
||||||
pExp->pExpr->_optrRoot.pRootNode = pNode;
|
pExp->pExpr->_optrRoot.pRootNode = pNode;
|
||||||
|
} else if (type == QUERY_NODE_CASE_WHEN) {
|
||||||
|
pExp->pExpr->nodeType = QUERY_NODE_OPERATOR;
|
||||||
|
SCaseWhenNode* pCaseNode = (SCaseWhenNode*)pNode;
|
||||||
|
|
||||||
|
pExp->base.pParam = taosMemoryCalloc(1, sizeof(SFunctParam));
|
||||||
|
pExp->base.numOfParams = 1;
|
||||||
|
|
||||||
|
SDataType* pType = &pCaseNode->node.resType;
|
||||||
|
pExp->base.resSchema = createResSchema(pType->type, pType->bytes, slotId, pType->scale,
|
||||||
|
pType->precision, pCaseNode->node.aliasName);
|
||||||
|
pExp->pExpr->_optrRoot.pRootNode = pNode;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1113,15 +1113,24 @@ void setResultRowInitCtx(SResultRow* pResult, SqlFunctionCtx* pCtx, int32_t numO
|
||||||
static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const SColumnInfoData* p, bool keep,
|
static void extractQualifiedTupleByFilterResult(SSDataBlock* pBlock, const SColumnInfoData* p, bool keep,
|
||||||
int32_t status);
|
int32_t status);
|
||||||
|
|
||||||
void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, const SArray* pColMatchInfo) {
|
void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, const SArray* pColMatchInfo, SFilterInfo* pFilterInfo) {
|
||||||
if (pFilterNode == NULL || pBlock->info.rows == 0) {
|
if (pFilterNode == NULL || pBlock->info.rows == 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
SFilterInfo* filter = NULL;
|
SFilterInfo* filter = pFilterInfo;
|
||||||
|
int64_t st = taosGetTimestampUs();
|
||||||
|
|
||||||
|
// pError("start filter");
|
||||||
|
|
||||||
// todo move to the initialization function
|
// todo move to the initialization function
|
||||||
int32_t code = filterInitFromNode((SNode*)pFilterNode, &filter, 0);
|
int32_t code = 0;
|
||||||
|
bool needFree = false;
|
||||||
|
if (filter == NULL) {
|
||||||
|
needFree = true;
|
||||||
|
code = filterInitFromNode((SNode*)pFilterNode, &filter, 0);
|
||||||
|
}
|
||||||
|
|
||||||
SFilterColumnParam param1 = {.numOfCols = taosArrayGetSize(pBlock->pDataBlock), .pDataBlock = pBlock->pDataBlock};
|
SFilterColumnParam param1 = {.numOfCols = taosArrayGetSize(pBlock->pDataBlock), .pDataBlock = pBlock->pDataBlock};
|
||||||
code = filterSetDataFromSlotId(filter, ¶m1);
|
code = filterSetDataFromSlotId(filter, ¶m1);
|
||||||
|
|
||||||
|
@ -1130,7 +1139,10 @@ void doFilter(const SNode* pFilterNode, SSDataBlock* pBlock, const SArray* pColM
|
||||||
|
|
||||||
// todo the keep seems never to be True??
|
// todo the keep seems never to be True??
|
||||||
bool keep = filterExecute(filter, pBlock, &p, NULL, param1.numOfCols, &status);
|
bool keep = filterExecute(filter, pBlock, &p, NULL, param1.numOfCols, &status);
|
||||||
filterFreeInfo(filter);
|
|
||||||
|
if (needFree) {
|
||||||
|
filterFreeInfo(filter);
|
||||||
|
}
|
||||||
|
|
||||||
extractQualifiedTupleByFilterResult(pBlock, p, keep, status);
|
extractQualifiedTupleByFilterResult(pBlock, p, keep, status);
|
||||||
|
|
||||||
|
@ -2479,7 +2491,7 @@ static SSDataBlock* getAggregateResult(SOperatorInfo* pOperator) {
|
||||||
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
|
blockDataEnsureCapacity(pInfo->pRes, pOperator->resultInfo.capacity);
|
||||||
while (1) {
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, pInfo, &pAggInfo->groupResInfo, pAggInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, pInfo, &pAggInfo->groupResInfo, pAggInfo->aggSup.pResultBuf);
|
||||||
doFilter(pAggInfo->pCondition, pInfo->pRes, NULL);
|
doFilter(pAggInfo->pCondition, pInfo->pRes, NULL, NULL);
|
||||||
|
|
||||||
if (!hasRemainResults(&pAggInfo->groupResInfo)) {
|
if (!hasRemainResults(&pAggInfo->groupResInfo)) {
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
|
@ -2873,7 +2885,7 @@ static SSDataBlock* doFill(SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, fillResult, pInfo->pColMatchColInfo);
|
doFilter(pInfo->pCondition, fillResult, pInfo->pColMatchColInfo, NULL);
|
||||||
if (fillResult->info.rows > 0) {
|
if (fillResult->info.rows > 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -3049,6 +3061,12 @@ void cleanupExprSupp(SExprSupp* pSupp) {
|
||||||
destroyExprInfo(pSupp->pExprInfo, pSupp->numOfExprs);
|
destroyExprInfo(pSupp->pExprInfo, pSupp->numOfExprs);
|
||||||
taosMemoryFreeClear(pSupp->pExprInfo);
|
taosMemoryFreeClear(pSupp->pExprInfo);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pSupp->pFilterInfo != NULL) {
|
||||||
|
filterFreeInfo(pSupp->pFilterInfo);
|
||||||
|
pSupp->pFilterInfo = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
taosMemoryFree(pSupp->rowEntryInfoOffset);
|
taosMemoryFree(pSupp->rowEntryInfoOffset);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -311,7 +311,7 @@ static SSDataBlock* buildGroupResultDataBlock(SOperatorInfo* pOperator) {
|
||||||
SSDataBlock* pRes = pInfo->binfo.pRes;
|
SSDataBlock* pRes = pInfo->binfo.pRes;
|
||||||
while (1) {
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
||||||
doFilter(pInfo->pCondition, pRes, NULL);
|
doFilter(pInfo->pCondition, pRes, NULL, NULL);
|
||||||
|
|
||||||
if (!hasRemainResults(&pInfo->groupResInfo)) {
|
if (!hasRemainResults(&pInfo->groupResInfo)) {
|
||||||
doSetOperatorCompleted(pOperator);
|
doSetOperatorCompleted(pOperator);
|
||||||
|
@ -991,6 +991,8 @@ static void destroyStreamPartitionOperatorInfo(void* param) {
|
||||||
|
|
||||||
taosMemoryFree(pInfo->partitionSup.keyBuf);
|
taosMemoryFree(pInfo->partitionSup.keyBuf);
|
||||||
cleanupExprSupp(&pInfo->scalarSup);
|
cleanupExprSupp(&pInfo->scalarSup);
|
||||||
|
cleanupExprSupp(&pInfo->tbnameCalSup);
|
||||||
|
cleanupExprSupp(&pInfo->tagCalSup);
|
||||||
blockDataDestroy(pInfo->pDelRes);
|
blockDataDestroy(pInfo->pDelRes);
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
@ -1037,6 +1039,19 @@ SOperatorInfo* createStreamPartitionOperatorInfo(SOperatorInfo* downstream, SStr
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pPartNode->pTags != NULL) {
|
||||||
|
int32_t numOfTags;
|
||||||
|
SExprInfo* pTagExpr = createExprInfo(pPartNode->pTags, NULL, &numOfTags);
|
||||||
|
if (pTagExpr == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
if (initExprSupp(&pInfo->tagCalSup, pTagExpr, numOfTags) != 0) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t keyLen = 0;
|
int32_t keyLen = 0;
|
||||||
code = initGroupOptrInfo(&pInfo->partitionSup.pGroupColVals, &keyLen, &pInfo->partitionSup.keyBuf,
|
code = initGroupOptrInfo(&pInfo->partitionSup.pGroupColVals, &keyLen, &pInfo->partitionSup.keyBuf,
|
||||||
pInfo->partitionSup.pGroupCols);
|
pInfo->partitionSup.pGroupCols);
|
||||||
|
|
|
@ -387,7 +387,7 @@ SSDataBlock* doMergeJoin(struct SOperatorInfo* pOperator) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (pJoinInfo->pCondAfterMerge != NULL) {
|
if (pJoinInfo->pCondAfterMerge != NULL) {
|
||||||
doFilter(pJoinInfo->pCondAfterMerge, pRes, NULL);
|
doFilter(pJoinInfo->pCondAfterMerge, pRes, NULL, NULL);
|
||||||
}
|
}
|
||||||
if (pRes->info.rows >= pOperator->resultInfo.threshold) {
|
if (pRes->info.rows >= pOperator->resultInfo.threshold) {
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -315,7 +315,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// do apply filter
|
// do apply filter
|
||||||
doFilter(pProjectInfo->pFilterNode, pFinalRes, NULL);
|
doFilter(pProjectInfo->pFilterNode, pFinalRes, NULL, NULL);
|
||||||
|
|
||||||
// when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint.
|
// when apply the limit/offset for each group, pRes->info.rows may be 0, due to limit constraint.
|
||||||
if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) {
|
if (pFinalRes->info.rows > 0 || (pOperator->status == OP_EXEC_DONE)) {
|
||||||
|
@ -325,7 +325,7 @@ SSDataBlock* doProjectOperation(SOperatorInfo* pOperator) {
|
||||||
} else {
|
} else {
|
||||||
// do apply filter
|
// do apply filter
|
||||||
if (pRes->info.rows > 0) {
|
if (pRes->info.rows > 0) {
|
||||||
doFilter(pProjectInfo->pFilterNode, pRes, NULL);
|
doFilter(pProjectInfo->pFilterNode, pRes, NULL, NULL);
|
||||||
if (pRes->info.rows == 0) {
|
if (pRes->info.rows == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -518,7 +518,7 @@ SSDataBlock* doApplyIndefinitFunction(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pIndefInfo->pCondition, pInfo->pRes, NULL);
|
doFilter(pIndefInfo->pCondition, pInfo->pRes, NULL, NULL);
|
||||||
size_t rows = pInfo->pRes->info.rows;
|
size_t rows = pInfo->pRes->info.rows;
|
||||||
if (rows > 0 || pOperator->status == OP_EXEC_DONE) {
|
if (rows > 0 || pOperator->status == OP_EXEC_DONE) {
|
||||||
break;
|
break;
|
||||||
|
@ -620,7 +620,7 @@ SSDataBlock* doGenerateSourceData(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pRes->info.rows = 1;
|
pRes->info.rows = 1;
|
||||||
doFilter(pProjectInfo->pFilterNode, pRes, NULL);
|
doFilter(pProjectInfo->pFilterNode, pRes, NULL, NULL);
|
||||||
|
|
||||||
/*int32_t status = */ doIngroupLimitOffset(&pProjectInfo->limitInfo, 0, pRes, pOperator);
|
/*int32_t status = */ doIngroupLimitOffset(&pProjectInfo->limitInfo, 0, pRes, pOperator);
|
||||||
|
|
||||||
|
|
|
@ -385,7 +385,7 @@ static int32_t loadDataBlock(SOperatorInfo* pOperator, STableScanInfo* pTableSca
|
||||||
|
|
||||||
if (pTableScanInfo->pFilterNode != NULL) {
|
if (pTableScanInfo->pFilterNode != NULL) {
|
||||||
int64_t st = taosGetTimestampUs();
|
int64_t st = taosGetTimestampUs();
|
||||||
doFilter(pTableScanInfo->pFilterNode, pBlock, pTableScanInfo->pColMatchInfo);
|
doFilter(pTableScanInfo->pFilterNode, pBlock, pTableScanInfo->pColMatchInfo, pOperator->exprSupp.pFilterInfo);
|
||||||
|
|
||||||
double el = (taosGetTimestampUs() - st) / 1000.0;
|
double el = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
pTableScanInfo->readRecorder.filterTime += el;
|
pTableScanInfo->readRecorder.filterTime += el;
|
||||||
|
@ -754,6 +754,11 @@ SOperatorInfo* createTableScanOperatorInfo(STableScanPhysiNode* pTableScanNode,
|
||||||
pInfo->dataBlockLoadFlag = pTableScanNode->dataRequired;
|
pInfo->dataBlockLoadFlag = pTableScanNode->dataRequired;
|
||||||
pInfo->pResBlock = createResDataBlock(pDescNode);
|
pInfo->pResBlock = createResDataBlock(pDescNode);
|
||||||
pInfo->pFilterNode = pTableScanNode->scan.node.pConditions;
|
pInfo->pFilterNode = pTableScanNode->scan.node.pConditions;
|
||||||
|
|
||||||
|
if (pInfo->pFilterNode != NULL) {
|
||||||
|
code = filterInitFromNode((SNode*)pInfo->pFilterNode, &pOperator->exprSupp.pFilterInfo, 0);
|
||||||
|
}
|
||||||
|
|
||||||
pInfo->scanFlag = MAIN_SCAN;
|
pInfo->scanFlag = MAIN_SCAN;
|
||||||
pInfo->pColMatchInfo = pColList;
|
pInfo->pColMatchInfo = pColList;
|
||||||
pInfo->currentGroupId = -1;
|
pInfo->currentGroupId = -1;
|
||||||
|
@ -1123,7 +1128,7 @@ static SSDataBlock* doRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pSDB, int32
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, pResult, NULL);
|
doFilter(pInfo->pCondition, pResult, NULL, NULL);
|
||||||
if (pResult->info.rows == 0) {
|
if (pResult->info.rows == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1311,10 +1316,15 @@ static void calBlockTag(SExprSupp* pTagCalSup, SSDataBlock* pBlock, SSDataBlock*
|
||||||
|
|
||||||
blockDataEnsureCapacity(pResBlock, 1);
|
blockDataEnsureCapacity(pResBlock, 1);
|
||||||
|
|
||||||
projectApplyFunctions(pTagCalSup->pExprInfo, pResBlock, pSrcBlock, pTagCalSup->pCtx, 1, NULL);
|
projectApplyFunctions(pTagCalSup->pExprInfo, pResBlock, pSrcBlock, pTagCalSup->pCtx, pTagCalSup->numOfExprs, NULL);
|
||||||
ASSERT(pResBlock->info.rows == 1);
|
ASSERT(pResBlock->info.rows == 1);
|
||||||
|
|
||||||
// build tagArray
|
// build tagArray
|
||||||
|
/*SArray* tagArray = taosArrayInit(0, sizeof(void*));*/
|
||||||
|
/*STagVal tagVal = {*/
|
||||||
|
/*.cid = 0,*/
|
||||||
|
/*.type = 0,*/
|
||||||
|
/*};*/
|
||||||
// build STag
|
// build STag
|
||||||
// set STag
|
// set STag
|
||||||
|
|
||||||
|
@ -1469,7 +1479,7 @@ static int32_t setBlockIntoRes(SStreamScanInfo* pInfo, const SSDataBlock* pBlock
|
||||||
}
|
}
|
||||||
|
|
||||||
if (filter) {
|
if (filter) {
|
||||||
doFilter(pInfo->pCondition, pInfo->pRes, NULL);
|
doFilter(pInfo->pCondition, pInfo->pRes, NULL, NULL);
|
||||||
}
|
}
|
||||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||||
blockDataFreeRes((SSDataBlock*)pBlock);
|
blockDataFreeRes((SSDataBlock*)pBlock);
|
||||||
|
@ -1891,7 +1901,7 @@ FETCH_NEXT_BLOCK:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, pInfo->pRes, NULL);
|
doFilter(pInfo->pCondition, pInfo->pRes, NULL, NULL);
|
||||||
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pInfo->pRes, pInfo->primaryTsIndex);
|
||||||
|
|
||||||
if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) {
|
if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) {
|
||||||
|
@ -2110,6 +2120,9 @@ static void destroyStreamScanOperatorInfo(void* param) {
|
||||||
taosMemoryFree(pStreamScan->pPseudoExpr);
|
taosMemoryFree(pStreamScan->pPseudoExpr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
cleanupExprSupp(&pStreamScan->tbnameCalSup);
|
||||||
|
cleanupExprSupp(&pStreamScan->tagCalSup);
|
||||||
|
|
||||||
updateInfoDestroy(pStreamScan->pUpdateInfo);
|
updateInfoDestroy(pStreamScan->pUpdateInfo);
|
||||||
blockDataDestroy(pStreamScan->pRes);
|
blockDataDestroy(pStreamScan->pRes);
|
||||||
blockDataDestroy(pStreamScan->pUpdateRes);
|
blockDataDestroy(pStreamScan->pUpdateRes);
|
||||||
|
@ -2164,6 +2177,19 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pTableScanNode->pTags != NULL) {
|
||||||
|
int32_t numOfTags;
|
||||||
|
SExprInfo* pTagExpr = createExprInfo(pTableScanNode->pTags, NULL, &numOfTags);
|
||||||
|
if (pTagExpr == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
if (initExprSupp(&pInfo->tagCalSup, pTagExpr, numOfTags) != 0) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _error;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
pInfo->pBlockLists = taosArrayInit(4, POINTER_BYTES);
|
pInfo->pBlockLists = taosArrayInit(4, POINTER_BYTES);
|
||||||
if (pInfo->pBlockLists == NULL) {
|
if (pInfo->pBlockLists == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -2361,7 +2387,7 @@ static SSDataBlock* doFilterResult(SSysTableScanInfo* pInfo) {
|
||||||
return pInfo->pRes->info.rows == 0 ? NULL : pInfo->pRes;
|
return pInfo->pRes->info.rows == 0 ? NULL : pInfo->pRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, pInfo->pRes, NULL);
|
doFilter(pInfo->pCondition, pInfo->pRes, NULL, NULL);
|
||||||
return pInfo->pRes->info.rows == 0 ? NULL : pInfo->pRes;
|
return pInfo->pRes->info.rows == 0 ? NULL : pInfo->pRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3434,7 +3460,7 @@ static int32_t loadDataBlockFromOneTable(SOperatorInfo* pOperator, STableMergeSc
|
||||||
|
|
||||||
if (pTableScanInfo->pFilterNode != NULL) {
|
if (pTableScanInfo->pFilterNode != NULL) {
|
||||||
int64_t st = taosGetTimestampMs();
|
int64_t st = taosGetTimestampMs();
|
||||||
doFilter(pTableScanInfo->pFilterNode, pBlock, pTableScanInfo->pColMatchInfo);
|
doFilter(pTableScanInfo->pFilterNode, pBlock, pTableScanInfo->pColMatchInfo, NULL);
|
||||||
|
|
||||||
double el = (taosGetTimestampUs() - st) / 1000.0;
|
double el = (taosGetTimestampUs() - st) / 1000.0;
|
||||||
pTableScanInfo->readRecorder.filterTime += el;
|
pTableScanInfo->readRecorder.filterTime += el;
|
||||||
|
|
|
@ -216,7 +216,7 @@ SSDataBlock* doSort(SOperatorInfo* pOperator) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
doFilter(pInfo->pCondition, pBlock, pInfo->pColMatchInfo);
|
doFilter(pInfo->pCondition, pBlock, pInfo->pColMatchInfo, NULL);
|
||||||
if (blockDataGetNumOfRows(pBlock) == 0) {
|
if (blockDataGetNumOfRows(pBlock) == 0) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1501,7 +1501,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
doStreamFillImpl(pOperator);
|
doStreamFillImpl(pOperator);
|
||||||
doFilter(pInfo->pCondition, pInfo->pRes, pInfo->pColMatchColInfo);
|
doFilter(pInfo->pCondition, pInfo->pRes, pInfo->pColMatchColInfo, NULL);
|
||||||
pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
|
pOperator->resultInfo.totalRows += pInfo->pRes->info.rows;
|
||||||
if (pInfo->pRes->info.rows > 0) {
|
if (pInfo->pRes->info.rows > 0) {
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -1277,7 +1277,7 @@ static SSDataBlock* doStateWindowAgg(SOperatorInfo* pOperator) {
|
||||||
blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity);
|
blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity);
|
||||||
while (1) {
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
||||||
doFilter(pInfo->pCondition, pBInfo->pRes, NULL);
|
doFilter(pInfo->pCondition, pBInfo->pRes, NULL, NULL);
|
||||||
|
|
||||||
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
||||||
if (!hasRemain) {
|
if (!hasRemain) {
|
||||||
|
@ -1315,7 +1315,7 @@ static SSDataBlock* doBuildIntervalResult(SOperatorInfo* pOperator) {
|
||||||
blockDataEnsureCapacity(pBlock, pOperator->resultInfo.capacity);
|
blockDataEnsureCapacity(pBlock, pOperator->resultInfo.capacity);
|
||||||
while (1) {
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
||||||
doFilter(pInfo->pCondition, pBlock, NULL);
|
doFilter(pInfo->pCondition, pBlock, NULL, NULL);
|
||||||
|
|
||||||
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
||||||
if (!hasRemain) {
|
if (!hasRemain) {
|
||||||
|
@ -2019,7 +2019,7 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
|
||||||
if (pOperator->status == OP_RES_TO_RETURN) {
|
if (pOperator->status == OP_RES_TO_RETURN) {
|
||||||
while (1) {
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
||||||
doFilter(pInfo->pCondition, pBInfo->pRes, NULL);
|
doFilter(pInfo->pCondition, pBInfo->pRes, NULL, NULL);
|
||||||
|
|
||||||
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
||||||
if (!hasRemain) {
|
if (!hasRemain) {
|
||||||
|
@ -2062,7 +2062,7 @@ static SSDataBlock* doSessionWindowAgg(SOperatorInfo* pOperator) {
|
||||||
blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity);
|
blockDataEnsureCapacity(pBInfo->pRes, pOperator->resultInfo.capacity);
|
||||||
while (1) {
|
while (1) {
|
||||||
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
doBuildResultDatablock(pOperator, &pInfo->binfo, &pInfo->groupResInfo, pInfo->aggSup.pResultBuf);
|
||||||
doFilter(pInfo->pCondition, pBInfo->pRes, NULL);
|
doFilter(pInfo->pCondition, pBInfo->pRes, NULL, NULL);
|
||||||
|
|
||||||
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
bool hasRemain = hasRemainResults(&pInfo->groupResInfo);
|
||||||
if (!hasRemain) {
|
if (!hasRemain) {
|
||||||
|
@ -5251,7 +5251,7 @@ static void doMergeAlignedIntervalAgg(SOperatorInfo* pOperator) {
|
||||||
setInputDataBlock(pOperator, pSup->pCtx, pBlock, pIaInfo->inputOrder, scanFlag, true);
|
setInputDataBlock(pOperator, pSup->pCtx, pBlock, pIaInfo->inputOrder, scanFlag, true);
|
||||||
doMergeAlignedIntervalAggImpl(pOperator, &pIaInfo->binfo.resultRowInfo, pBlock, pRes);
|
doMergeAlignedIntervalAggImpl(pOperator, &pIaInfo->binfo.resultRowInfo, pBlock, pRes);
|
||||||
|
|
||||||
doFilter(pMiaInfo->pCondition, pRes, NULL);
|
doFilter(pMiaInfo->pCondition, pRes, NULL, NULL);
|
||||||
if (pRes->info.rows >= pOperator->resultInfo.capacity) {
|
if (pRes->info.rows >= pOperator->resultInfo.capacity) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -131,7 +131,7 @@ static int32_t valueNodeCopy(const SValueNode* pSrc, SValueNode* pDst) {
|
||||||
COPY_SCALAR_FIELD(placeholderNo);
|
COPY_SCALAR_FIELD(placeholderNo);
|
||||||
COPY_SCALAR_FIELD(typeData);
|
COPY_SCALAR_FIELD(typeData);
|
||||||
COPY_SCALAR_FIELD(unit);
|
COPY_SCALAR_FIELD(unit);
|
||||||
if (!pSrc->translate) {
|
if (!pSrc->translate || pSrc->isNull) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
switch (pSrc->node.resType.type) {
|
switch (pSrc->node.resType.type) {
|
||||||
|
|
|
@ -3011,7 +3011,7 @@ static int32_t valueNodeToJson(const void* pObj, SJson* pJson) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonAddBoolToObject(pJson, jkValueIsNull, pNode->isNull);
|
code = tjsonAddBoolToObject(pJson, jkValueIsNull, pNode->isNull);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code && pNode->translate) {
|
if (TSDB_CODE_SUCCESS == code && pNode->translate && !pNode->isNull) {
|
||||||
code = datumToJson(pNode, pJson);
|
code = datumToJson(pNode, pJson);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3161,7 +3161,7 @@ static int32_t jsonToValueNode(const SJson* pJson, void* pObj) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = tjsonGetBoolValue(pJson, jkValueIsNull, &pNode->isNull);
|
code = tjsonGetBoolValue(pJson, jkValueIsNull, &pNode->isNull);
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS == code && pNode->translate) {
|
if (TSDB_CODE_SUCCESS == code && pNode->translate && !pNode->isNull) {
|
||||||
code = jsonToDatum(pJson, pNode);
|
code = jsonToDatum(pJson, pNode);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -478,7 +478,10 @@ static int32_t tlvDecodeValueEnum(STlvDecoder* pDecoder, void* pValue, int16_t l
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tlvDecodeCStr(STlv* pTlv, char* pValue) {
|
static int32_t tlvDecodeCStr(STlv* pTlv, char* pValue, int32_t size) {
|
||||||
|
if (pTlv->len > size - 1) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
memcpy(pValue, pTlv->value, pTlv->len);
|
memcpy(pValue, pTlv->value, pTlv->len);
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -919,9 +922,14 @@ static int32_t msgToDatum(STlv* pTlv, void* pObj) {
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_JSON:
|
case TSDB_DATA_TYPE_JSON: {
|
||||||
|
if (pTlv->len <= 0 || pTlv->len > TSDB_MAX_JSON_TAG_LEN) {
|
||||||
|
code = TSDB_CODE_FAILED;
|
||||||
|
break;
|
||||||
|
}
|
||||||
code = tlvDecodeDynBinary(pTlv, (void**)&pNode->datum.p);
|
code = tlvDecodeDynBinary(pTlv, (void**)&pNode->datum.p);
|
||||||
break;
|
break;
|
||||||
|
}
|
||||||
case TSDB_DATA_TYPE_DECIMAL:
|
case TSDB_DATA_TYPE_DECIMAL:
|
||||||
case TSDB_DATA_TYPE_BLOB:
|
case TSDB_DATA_TYPE_BLOB:
|
||||||
// todo
|
// todo
|
||||||
|
@ -1097,7 +1105,7 @@ static int32_t msgToFunctionNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
code = tlvDecodeObjFromTlv(pTlv, msgToExprNode, &pNode->node);
|
code = tlvDecodeObjFromTlv(pTlv, msgToExprNode, &pNode->node);
|
||||||
break;
|
break;
|
||||||
case FUNCTION_CODE_FUNCTION_NAME:
|
case FUNCTION_CODE_FUNCTION_NAME:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->functionName);
|
code = tlvDecodeCStr(pTlv, pNode->functionName, sizeof(pNode->functionName));
|
||||||
break;
|
break;
|
||||||
case FUNCTION_CODE_FUNCTION_ID:
|
case FUNCTION_CODE_FUNCTION_ID:
|
||||||
code = tlvDecodeI32(pTlv, &pNode->funcId);
|
code = tlvDecodeI32(pTlv, &pNode->funcId);
|
||||||
|
@ -1226,10 +1234,10 @@ static int32_t msgToName(STlvDecoder* pDecoder, void* pObj) {
|
||||||
code = tlvDecodeI32(pTlv, &pNode->acctId);
|
code = tlvDecodeI32(pTlv, &pNode->acctId);
|
||||||
break;
|
break;
|
||||||
case NAME_CODE_DB_NAME:
|
case NAME_CODE_DB_NAME:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->dbname);
|
code = tlvDecodeCStr(pTlv, pNode->dbname, sizeof(pNode->dbname));
|
||||||
break;
|
break;
|
||||||
case NAME_CODE_TABLE_NAME:
|
case NAME_CODE_TABLE_NAME:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->tname);
|
code = tlvDecodeCStr(pTlv, pNode->tname, sizeof(pNode->tname));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -1538,7 +1546,7 @@ static int32_t msgToEp(STlvDecoder* pDecoder, void* pObj) {
|
||||||
tlvForEach(pDecoder, pTlv, code) {
|
tlvForEach(pDecoder, pTlv, code) {
|
||||||
switch (pTlv->type) {
|
switch (pTlv->type) {
|
||||||
case EP_CODE_FQDN:
|
case EP_CODE_FQDN:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->fqdn);
|
code = tlvDecodeCStr(pTlv, pNode->fqdn, sizeof(pNode->fqdn));
|
||||||
break;
|
break;
|
||||||
case EP_CODE_port:
|
case EP_CODE_port:
|
||||||
code = tlvDecodeU16(pTlv, &pNode->port);
|
code = tlvDecodeU16(pTlv, &pNode->port);
|
||||||
|
@ -3207,7 +3215,7 @@ static int32_t msgToPhysiQueryInsertNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
code = tlvDecodeI8(pTlv, &pNode->tableType);
|
code = tlvDecodeI8(pTlv, &pNode->tableType);
|
||||||
break;
|
break;
|
||||||
case PHY_QUERY_INSERT_CODE_TABLE_NAME:
|
case PHY_QUERY_INSERT_CODE_TABLE_NAME:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->tableName);
|
code = tlvDecodeCStr(pTlv, pNode->tableName, sizeof(pNode->tableName));
|
||||||
break;
|
break;
|
||||||
case PHY_QUERY_INSERT_CODE_VG_ID:
|
case PHY_QUERY_INSERT_CODE_VG_ID:
|
||||||
code = tlvDecodeI32(pTlv, &pNode->vgId);
|
code = tlvDecodeI32(pTlv, &pNode->vgId);
|
||||||
|
@ -3284,10 +3292,10 @@ static int32_t msgToPhysiDeleteNode(STlvDecoder* pDecoder, void* pObj) {
|
||||||
code = tlvDecodeI8(pTlv, &pNode->tableType);
|
code = tlvDecodeI8(pTlv, &pNode->tableType);
|
||||||
break;
|
break;
|
||||||
case PHY_DELETER_CODE_TABLE_FNAME:
|
case PHY_DELETER_CODE_TABLE_FNAME:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->tableFName);
|
code = tlvDecodeCStr(pTlv, pNode->tableFName, sizeof(pNode->tableFName));
|
||||||
break;
|
break;
|
||||||
case PHY_DELETER_CODE_TS_COL_NAME:
|
case PHY_DELETER_CODE_TS_COL_NAME:
|
||||||
code = tlvDecodeCStr(pTlv, pNode->tsColName);
|
code = tlvDecodeCStr(pTlv, pNode->tsColName, sizeof(pNode->tsColName));
|
||||||
break;
|
break;
|
||||||
case PHY_DELETER_CODE_DELETE_TIME_RANGE:
|
case PHY_DELETER_CODE_DELETE_TIME_RANGE:
|
||||||
code = tlvDecodeObjFromTlv(pTlv, msgToTimeWindow, &pNode->deleteTimeRange);
|
code = tlvDecodeObjFromTlv(pTlv, msgToTimeWindow, &pNode->deleteTimeRange);
|
||||||
|
|
|
@ -209,6 +209,10 @@ int64_t nodesMakeAllocatorWeakRef(int64_t allocatorId) {
|
||||||
}
|
}
|
||||||
|
|
||||||
SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
|
SNodeAllocator* pAllocator = taosAcquireRef(g_allocatorReqRefPool, allocatorId);
|
||||||
|
if (NULL == pAllocator) {
|
||||||
|
nodesError("allocator id %" PRIx64 " weak reference failed", allocatorId);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
return pAllocator->self;
|
return pAllocator->self;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1604,7 +1608,7 @@ char* nodesGetStrValueFromNode(SValueNode* pNode) {
|
||||||
bool nodesIsExprNode(const SNode* pNode) {
|
bool nodesIsExprNode(const SNode* pNode) {
|
||||||
ENodeType type = nodeType(pNode);
|
ENodeType type = nodeType(pNode);
|
||||||
return (QUERY_NODE_COLUMN == type || QUERY_NODE_VALUE == type || QUERY_NODE_OPERATOR == type ||
|
return (QUERY_NODE_COLUMN == type || QUERY_NODE_VALUE == type || QUERY_NODE_OPERATOR == type ||
|
||||||
QUERY_NODE_FUNCTION == type || QUERY_NODE_LOGIC_CONDITION == type);
|
QUERY_NODE_FUNCTION == type || QUERY_NODE_LOGIC_CONDITION == type || QUERY_NODE_CASE_WHEN == type);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool nodesIsUnaryOp(const SOperatorNode* pOp) {
|
bool nodesIsUnaryOp(const SOperatorNode* pOp) {
|
||||||
|
@ -1716,9 +1720,10 @@ static EDealRes doCollect(SCollectColumnsCxt* pCxt, SColumnNode* pCol, SNode* pN
|
||||||
char name[TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN];
|
char name[TSDB_TABLE_NAME_LEN + TSDB_COL_NAME_LEN];
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
if ('\0' == pCol->tableAlias[0]) {
|
if ('\0' == pCol->tableAlias[0]) {
|
||||||
len = sprintf(name, "%s", pCol->colName);
|
len = snprintf(name, sizeof(name), "%s", pCol->colName);
|
||||||
|
} else {
|
||||||
|
len = snprintf(name, sizeof(name), "%s.%s", pCol->tableAlias, pCol->colName);
|
||||||
}
|
}
|
||||||
len = sprintf(name, "%s.%s", pCol->tableAlias, pCol->colName);
|
|
||||||
if (NULL == taosHashGet(pCxt->pColHash, name, len)) {
|
if (NULL == taosHashGet(pCxt->pColHash, name, len)) {
|
||||||
pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, NULL, 0);
|
pCxt->errCode = taosHashPut(pCxt->pColHash, name, len, NULL, 0);
|
||||||
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
if (TSDB_CODE_SUCCESS == pCxt->errCode) {
|
||||||
|
|
|
@ -175,8 +175,6 @@ _end:
|
||||||
|
|
||||||
void taosCleanupKeywordsTable();
|
void taosCleanupKeywordsTable();
|
||||||
|
|
||||||
SToken tscReplaceStrToken(char **str, SToken *token, const char *newToken);
|
|
||||||
|
|
||||||
SToken taosTokenDup(SToken *pToken, char *buf, int32_t len);
|
SToken taosTokenDup(SToken *pToken, char *buf, int32_t len);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
|
|
|
@ -518,7 +518,7 @@ SNode* createRealTableNode(SAstCreateContext* pCxt, SToken* pDbName, SToken* pTa
|
||||||
if (NULL != pDbName) {
|
if (NULL != pDbName) {
|
||||||
COPY_STRING_FORM_ID_TOKEN(realTable->table.dbName, pDbName);
|
COPY_STRING_FORM_ID_TOKEN(realTable->table.dbName, pDbName);
|
||||||
} else {
|
} else {
|
||||||
strcpy(realTable->table.dbName, pCxt->pQueryCxt->db);
|
snprintf(realTable->table.dbName, sizeof(realTable->table.dbName), "%s", pCxt->pQueryCxt->db);
|
||||||
}
|
}
|
||||||
if (NULL != pTableAlias && TK_NK_NIL != pTableAlias->type) {
|
if (NULL != pTableAlias && TK_NK_NIL != pTableAlias->type) {
|
||||||
COPY_STRING_FORM_ID_TOKEN(realTable->table.tableAlias, pTableAlias);
|
COPY_STRING_FORM_ID_TOKEN(realTable->table.tableAlias, pTableAlias);
|
||||||
|
@ -599,7 +599,7 @@ SNode* createStateWindowNode(SAstCreateContext* pCxt, SNode* pExpr) {
|
||||||
state->pCol = createPrimaryKeyCol(pCxt, NULL);
|
state->pCol = createPrimaryKeyCol(pCxt, NULL);
|
||||||
if (NULL == state->pCol) {
|
if (NULL == state->pCol) {
|
||||||
nodesDestroyNode((SNode*)state);
|
nodesDestroyNode((SNode*)state);
|
||||||
CHECK_OUT_OF_MEM(state->pCol);
|
CHECK_OUT_OF_MEM(NULL);
|
||||||
}
|
}
|
||||||
state->pExpr = pExpr;
|
state->pExpr = pExpr;
|
||||||
return (SNode*)state;
|
return (SNode*)state;
|
||||||
|
@ -613,7 +613,7 @@ SNode* createIntervalWindowNode(SAstCreateContext* pCxt, SNode* pInterval, SNode
|
||||||
interval->pCol = createPrimaryKeyCol(pCxt, NULL);
|
interval->pCol = createPrimaryKeyCol(pCxt, NULL);
|
||||||
if (NULL == interval->pCol) {
|
if (NULL == interval->pCol) {
|
||||||
nodesDestroyNode((SNode*)interval);
|
nodesDestroyNode((SNode*)interval);
|
||||||
CHECK_OUT_OF_MEM(interval->pCol);
|
CHECK_OUT_OF_MEM(NULL);
|
||||||
}
|
}
|
||||||
interval->pInterval = pInterval;
|
interval->pInterval = pInterval;
|
||||||
interval->pOffset = pOffset;
|
interval->pOffset = pOffset;
|
||||||
|
@ -631,7 +631,7 @@ SNode* createFillNode(SAstCreateContext* pCxt, EFillMode mode, SNode* pValues) {
|
||||||
fill->pWStartTs = nodesMakeNode(QUERY_NODE_FUNCTION);
|
fill->pWStartTs = nodesMakeNode(QUERY_NODE_FUNCTION);
|
||||||
if (NULL == fill->pWStartTs) {
|
if (NULL == fill->pWStartTs) {
|
||||||
nodesDestroyNode((SNode*)fill);
|
nodesDestroyNode((SNode*)fill);
|
||||||
CHECK_OUT_OF_MEM(fill->pWStartTs);
|
CHECK_OUT_OF_MEM(NULL);
|
||||||
}
|
}
|
||||||
strcpy(((SFunctionNode*)fill->pWStartTs)->functionName, "_wstart");
|
strcpy(((SFunctionNode*)fill->pWStartTs)->functionName, "_wstart");
|
||||||
return (SNode*)fill;
|
return (SNode*)fill;
|
||||||
|
@ -1495,10 +1495,10 @@ SNode* createCreateIndexStmt(SAstCreateContext* pCxt, EIndexType type, bool igno
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->indexType = type;
|
pStmt->indexType = type;
|
||||||
pStmt->ignoreExists = ignoreExists;
|
pStmt->ignoreExists = ignoreExists;
|
||||||
strcpy(pStmt->indexDbName, ((SRealTableNode*)pIndexName)->table.dbName);
|
snprintf(pStmt->indexDbName, sizeof(pStmt->indexDbName), "%s", ((SRealTableNode*)pIndexName)->table.dbName);
|
||||||
strcpy(pStmt->indexName, ((SRealTableNode*)pIndexName)->table.tableName);
|
snprintf(pStmt->indexName, sizeof(pStmt->indexName), "%s", ((SRealTableNode*)pIndexName)->table.tableName);
|
||||||
strcpy(pStmt->dbName, ((SRealTableNode*)pRealTable)->table.dbName);
|
snprintf(pStmt->dbName, sizeof(pStmt->dbName), "%s", ((SRealTableNode*)pRealTable)->table.dbName);
|
||||||
strcpy(pStmt->tableName, ((SRealTableNode*)pRealTable)->table.tableName);
|
snprintf(pStmt->tableName, sizeof(pStmt->tableName), "%s", ((SRealTableNode*)pRealTable)->table.tableName);
|
||||||
nodesDestroyNode(pIndexName);
|
nodesDestroyNode(pIndexName);
|
||||||
nodesDestroyNode(pRealTable);
|
nodesDestroyNode(pRealTable);
|
||||||
pStmt->pCols = pCols;
|
pStmt->pCols = pCols;
|
||||||
|
@ -1524,8 +1524,8 @@ SNode* createDropIndexStmt(SAstCreateContext* pCxt, bool ignoreNotExists, SNode*
|
||||||
SDropIndexStmt* pStmt = (SDropIndexStmt*)nodesMakeNode(QUERY_NODE_DROP_INDEX_STMT);
|
SDropIndexStmt* pStmt = (SDropIndexStmt*)nodesMakeNode(QUERY_NODE_DROP_INDEX_STMT);
|
||||||
CHECK_OUT_OF_MEM(pStmt);
|
CHECK_OUT_OF_MEM(pStmt);
|
||||||
pStmt->ignoreNotExists = ignoreNotExists;
|
pStmt->ignoreNotExists = ignoreNotExists;
|
||||||
strcpy(pStmt->indexDbName, ((SRealTableNode*)pIndexName)->table.dbName);
|
snprintf(pStmt->indexDbName, sizeof(pStmt->indexDbName), "%s", ((SRealTableNode*)pIndexName)->table.dbName);
|
||||||
strcpy(pStmt->indexName, ((SRealTableNode*)pIndexName)->table.tableName);
|
snprintf(pStmt->indexName, sizeof(pStmt->indexName), "%s", ((SRealTableNode*)pIndexName)->table.tableName);
|
||||||
nodesDestroyNode(pIndexName);
|
nodesDestroyNode(pIndexName);
|
||||||
return (SNode*)pStmt;
|
return (SNode*)pStmt;
|
||||||
}
|
}
|
||||||
|
@ -1818,7 +1818,7 @@ SNode* createRevokeStmt(SAstCreateContext* pCxt, int64_t privileges, SToken* pDb
|
||||||
SNode* createFuncForDelete(SAstCreateContext* pCxt, const char* pFuncName) {
|
SNode* createFuncForDelete(SAstCreateContext* pCxt, const char* pFuncName) {
|
||||||
SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
SFunctionNode* pFunc = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
||||||
CHECK_OUT_OF_MEM(pFunc);
|
CHECK_OUT_OF_MEM(pFunc);
|
||||||
strcpy(pFunc->functionName, pFuncName);
|
snprintf(pFunc->functionName, sizeof(pFunc->functionName), "%s", pFuncName);
|
||||||
if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pFunc->pParameterList, createPrimaryKeyCol(pCxt, NULL))) {
|
if (TSDB_CODE_SUCCESS != nodesListMakeStrictAppend(&pFunc->pParameterList, createPrimaryKeyCol(pCxt, NULL))) {
|
||||||
nodesDestroyNode((SNode*)pFunc);
|
nodesDestroyNode((SNode*)pFunc);
|
||||||
CHECK_OUT_OF_MEM(NULL);
|
CHECK_OUT_OF_MEM(NULL);
|
||||||
|
|
|
@ -378,7 +378,9 @@ static int parseTime(char** end, SToken* pToken, int16_t timePrec, int64_t* time
|
||||||
} else if (pToken->type == TK_TODAY) {
|
} else if (pToken->type == TK_TODAY) {
|
||||||
ts = taosGetTimestampToday(timePrec);
|
ts = taosGetTimestampToday(timePrec);
|
||||||
} else if (pToken->type == TK_NK_INTEGER) {
|
} else if (pToken->type == TK_NK_INTEGER) {
|
||||||
toInteger(pToken->z, pToken->n, 10, &ts);
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &ts)) {
|
||||||
|
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
|
||||||
|
}
|
||||||
} else { // parse the RFC-3339/ISO-8601 timestamp format string
|
} else { // parse the RFC-3339/ISO-8601 timestamp format string
|
||||||
if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
|
if (taosParseTime(pToken->z, time, pToken->n, timePrec, tsDaylight) != TSDB_CODE_SUCCESS) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid timestamp format", pToken->z);
|
||||||
|
@ -591,8 +593,6 @@ static int32_t parseValueToken(char** end, SToken* pToken, SSchema* pSchema, int
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
||||||
} else if (!IS_VALID_BIGINT(iv)) {
|
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "bigint data overflow", pToken->z);
|
|
||||||
}
|
}
|
||||||
return func(pMsgBuf, &iv, pSchema->bytes, param);
|
return func(pMsgBuf, &iv, pSchema->bytes, param);
|
||||||
}
|
}
|
||||||
|
@ -894,10 +894,7 @@ static int32_t parseTagToken(char** end, SToken* pToken, SSchema* pSchema, int16
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
if (TSDB_CODE_SUCCESS != toInteger(pToken->z, pToken->n, 10, &iv)) {
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
return buildSyntaxErrMsg(pMsgBuf, "invalid bigint data", pToken->z);
|
||||||
} else if (!IS_VALID_BIGINT(iv)) {
|
|
||||||
return buildSyntaxErrMsg(pMsgBuf, "bigint data overflow", pToken->z);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
val->i64 = iv;
|
val->i64 = iv;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1173,7 +1170,7 @@ static int32_t parseUsingClause(SInsertParseContext* pCxt, int32_t tbNo, SName*
|
||||||
NEXT_TOKEN(pCxt->pSql, sToken);
|
NEXT_TOKEN(pCxt->pSql, sToken);
|
||||||
|
|
||||||
SName sname;
|
SName sname;
|
||||||
createSName(&sname, &sToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg);
|
CHECK_CODE(createSName(&sname, &sToken, pCxt->pComCxt->acctId, pCxt->pComCxt->db, &pCxt->msg));
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
tNameGetFullDbName(&sname, dbFName);
|
tNameGetFullDbName(&sname, dbFName);
|
||||||
strcpy(pCxt->sTableName, sname.tname);
|
strcpy(pCxt->sTableName, sname.tname);
|
||||||
|
@ -1605,7 +1602,7 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
||||||
if (!pCxt->pComCxt->needMultiParse) {
|
if (!pCxt->pComCxt->needMultiParse) {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
} else {
|
||||||
parserInfo("0x%" PRIx64 " insert from csv. File is too large, do it in batches.", pCxt->pComCxt->requestId);
|
parserDebug("0x%" PRIx64 " insert from csv. File is too large, do it in batches.", pCxt->pComCxt->requestId);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1613,7 +1610,7 @@ static int32_t parseInsertBody(SInsertParseContext* pCxt) {
|
||||||
return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", sToken.z);
|
return buildSyntaxErrMsg(&pCxt->msg, "keyword VALUES or FILE is expected", sToken.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
parserInfo("0x%" PRIx64 " insert input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum);
|
parserDebug("0x%" PRIx64 " insert input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum);
|
||||||
|
|
||||||
if (TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) {
|
if (TSDB_QUERY_HAS_TYPE(pCxt->pOutput->insertType, TSDB_QUERY_TYPE_STMT_INSERT)) {
|
||||||
SParsedDataColInfo* tags = taosMemoryMalloc(sizeof(pCxt->tags));
|
SParsedDataColInfo* tags = taosMemoryMalloc(sizeof(pCxt->tags));
|
||||||
|
@ -1650,7 +1647,7 @@ static int32_t parseInsertBodyAgain(SInsertParseContext* pCxt) {
|
||||||
pCxt->pComCxt->needMultiParse = false;
|
pCxt->pComCxt->needMultiParse = false;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
parserInfo("0x%" PRIx64 " insert again input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum);
|
parserDebug("0x%" PRIx64 " insert again input rows: %d", pCxt->pComCxt->requestId, pCxt->totalNum);
|
||||||
// merge according to vgId
|
// merge according to vgId
|
||||||
if (taosHashGetSize(pCxt->pTableBlockHashObj) > 0) {
|
if (taosHashGetSize(pCxt->pTableBlockHashObj) > 0) {
|
||||||
CHECK_CODE(mergeTableDataBlocks(pCxt->pTableBlockHashObj, pCxt->pOutput->payloadType, &pCxt->pVgDataBlocks));
|
CHECK_CODE(mergeTableDataBlocks(pCxt->pTableBlockHashObj, pCxt->pOutput->payloadType, &pCxt->pVgDataBlocks));
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
* You should have received a copy of the GNU Affero General Public License
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
// clang-format off
|
|
||||||
#include "parInsertData.h"
|
#include "parInsertData.h"
|
||||||
|
|
||||||
#include "catalog.h"
|
#include "catalog.h"
|
||||||
|
@ -25,8 +25,8 @@
|
||||||
(((int)(t)) == PAYLOAD_TYPE_RAW) // 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
|
(((int)(t)) == PAYLOAD_TYPE_RAW) // 0: K-V payload for non-prepare insert, 1: rawPayload for prepare insert
|
||||||
|
|
||||||
typedef struct SBlockKeyTuple {
|
typedef struct SBlockKeyTuple {
|
||||||
TSKEY skey;
|
TSKEY skey;
|
||||||
void* payloadAddr;
|
void* payloadAddr;
|
||||||
int16_t index;
|
int16_t index;
|
||||||
} SBlockKeyTuple;
|
} SBlockKeyTuple;
|
||||||
|
|
||||||
|
@ -194,8 +194,8 @@ static int32_t createDataBlock(size_t defaultSize, int32_t rowSize, int32_t star
|
||||||
|
|
||||||
int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq) {
|
int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq) {
|
||||||
SEncoder coder = {0};
|
SEncoder coder = {0};
|
||||||
char* pBuf;
|
char* pBuf;
|
||||||
int32_t len;
|
int32_t len;
|
||||||
|
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
tEncodeSize(tEncodeSVCreateTbReq, pCreateTbReq, len, ret);
|
tEncodeSize(tEncodeSVCreateTbReq, pCreateTbReq, len, ret);
|
||||||
|
@ -211,19 +211,19 @@ int32_t buildCreateTbMsg(STableDataBlocks* pBlocks, SVCreateTbReq* pCreateTbReq)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pBuf= pBlocks->pData + pBlocks->size;
|
pBuf = pBlocks->pData + pBlocks->size;
|
||||||
|
|
||||||
tEncoderInit(&coder, pBuf, len);
|
tEncoderInit(&coder, pBuf, len);
|
||||||
tEncodeSVCreateTbReq(&coder, pCreateTbReq);
|
int32_t code = tEncodeSVCreateTbReq(&coder, pCreateTbReq);
|
||||||
tEncoderClear(&coder);
|
tEncoderClear(&coder);
|
||||||
|
|
||||||
pBlocks->size += len;
|
pBlocks->size += len;
|
||||||
pBlocks->createTbReqLen = len;
|
pBlocks->createTbReqLen = len;
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t getDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, int32_t size, int32_t startOffset, int32_t rowSize,
|
int32_t getDataBlockFromList(SHashObj* pHashList, void* id, int32_t idLen, int32_t size, int32_t startOffset,
|
||||||
STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList,
|
int32_t rowSize, STableMeta* pTableMeta, STableDataBlocks** dataBlocks, SArray* pBlockList,
|
||||||
SVCreateTbReq* pCreateTbReq) {
|
SVCreateTbReq* pCreateTbReq) {
|
||||||
*dataBlocks = NULL;
|
*dataBlocks = NULL;
|
||||||
STableDataBlocks** t1 = (STableDataBlocks**)taosHashGet(pHashList, (const char*)id, idLen);
|
STableDataBlocks** t1 = (STableDataBlocks**)taosHashGet(pHashList, (const char*)id, idLen);
|
||||||
|
@ -272,12 +272,12 @@ static void destroyDataBlock(STableDataBlocks* pDataBlock) {
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFreeClear(pDataBlock->pData);
|
taosMemoryFreeClear(pDataBlock->pData);
|
||||||
// if (!pDataBlock->cloned) {
|
// if (!pDataBlock->cloned) {
|
||||||
// free the refcount for metermeta
|
// free the refcount for metermeta
|
||||||
taosMemoryFreeClear(pDataBlock->pTableMeta);
|
taosMemoryFreeClear(pDataBlock->pTableMeta);
|
||||||
|
|
||||||
destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
|
destroyBoundColumnInfo(&pDataBlock->boundColumnInfo);
|
||||||
// }
|
// }
|
||||||
taosMemoryFreeClear(pDataBlock);
|
taosMemoryFreeClear(pDataBlock);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -687,16 +687,16 @@ int32_t mergeTableDataBlocks(SHashObj* pHashObj, uint8_t payloadType, SArray** p
|
||||||
STableDataBlocks** p = taosHashIterate(pHashObj, NULL);
|
STableDataBlocks** p = taosHashIterate(pHashObj, NULL);
|
||||||
STableDataBlocks* pOneTableBlock = *p;
|
STableDataBlocks* pOneTableBlock = *p;
|
||||||
SBlockKeyInfo blkKeyInfo = {0}; // share by pOneTableBlock
|
SBlockKeyInfo blkKeyInfo = {0}; // share by pOneTableBlock
|
||||||
SBlockRowMerger *pBlkRowMerger = NULL;
|
SBlockRowMerger* pBlkRowMerger = NULL;
|
||||||
|
|
||||||
while (pOneTableBlock) {
|
while (pOneTableBlock) {
|
||||||
SSubmitBlk* pBlocks = (SSubmitBlk*)pOneTableBlock->pData;
|
SSubmitBlk* pBlocks = (SSubmitBlk*)pOneTableBlock->pData;
|
||||||
if (pBlocks->numOfRows > 0) {
|
if (pBlocks->numOfRows > 0) {
|
||||||
STableDataBlocks* dataBuf = NULL;
|
STableDataBlocks* dataBuf = NULL;
|
||||||
pOneTableBlock->pTableMeta->vgId = pOneTableBlock->vgId; // for schemaless, restore origin vgId
|
pOneTableBlock->pTableMeta->vgId = pOneTableBlock->vgId; // for schemaless, restore origin vgId
|
||||||
int32_t ret =
|
int32_t ret = getDataBlockFromList(pVnodeDataBlockHashList, &pOneTableBlock->vgId, sizeof(pOneTableBlock->vgId),
|
||||||
getDataBlockFromList(pVnodeDataBlockHashList, &pOneTableBlock->vgId, sizeof(pOneTableBlock->vgId), TSDB_PAYLOAD_SIZE, INSERT_HEAD_SIZE, 0,
|
TSDB_PAYLOAD_SIZE, INSERT_HEAD_SIZE, 0, pOneTableBlock->pTableMeta, &dataBuf,
|
||||||
pOneTableBlock->pTableMeta, &dataBuf, pVnodeDataBlockList, NULL);
|
pVnodeDataBlockList, NULL);
|
||||||
if (ret != TSDB_CODE_SUCCESS) {
|
if (ret != TSDB_CODE_SUCCESS) {
|
||||||
tdFreeSBlockRowMerger(pBlkRowMerger);
|
tdFreeSBlockRowMerger(pBlkRowMerger);
|
||||||
taosHashCleanup(pVnodeDataBlockHashList);
|
taosHashCleanup(pVnodeDataBlockHashList);
|
||||||
|
@ -708,7 +708,8 @@ int32_t mergeTableDataBlocks(SHashObj* pHashObj, uint8_t payloadType, SArray** p
|
||||||
// the maximum expanded size in byte when a row-wise data is converted to SDataRow format
|
// the maximum expanded size in byte when a row-wise data is converted to SDataRow format
|
||||||
int32_t expandSize = isRawPayload ? getRowExpandSize(pOneTableBlock->pTableMeta) : 0;
|
int32_t expandSize = isRawPayload ? getRowExpandSize(pOneTableBlock->pTableMeta) : 0;
|
||||||
int64_t destSize = dataBuf->size + pOneTableBlock->size + pBlocks->numOfRows * expandSize +
|
int64_t destSize = dataBuf->size + pOneTableBlock->size + pBlocks->numOfRows * expandSize +
|
||||||
sizeof(STColumn) * getNumOfColumns(pOneTableBlock->pTableMeta) + pOneTableBlock->createTbReqLen;
|
sizeof(STColumn) * getNumOfColumns(pOneTableBlock->pTableMeta) +
|
||||||
|
pOneTableBlock->createTbReqLen;
|
||||||
|
|
||||||
if (dataBuf->nAllocSize < destSize) {
|
if (dataBuf->nAllocSize < destSize) {
|
||||||
dataBuf->nAllocSize = (uint32_t)(destSize * 1.5);
|
dataBuf->nAllocSize = (uint32_t)(destSize * 1.5);
|
||||||
|
@ -861,7 +862,7 @@ int32_t qCloneStmtDataBlock(void** pDst, void* pSrc) {
|
||||||
|
|
||||||
STableDataBlocks* pBlock = (STableDataBlocks*)(*pDst);
|
STableDataBlocks* pBlock = (STableDataBlocks*)(*pDst);
|
||||||
if (pBlock->pTableMeta) {
|
if (pBlock->pTableMeta) {
|
||||||
void *pNewMeta = taosMemoryMalloc(TABLE_META_SIZE(pBlock->pTableMeta));
|
void* pNewMeta = taosMemoryMalloc(TABLE_META_SIZE(pBlock->pTableMeta));
|
||||||
if (NULL == pNewMeta) {
|
if (NULL == pNewMeta) {
|
||||||
taosMemoryFreeClear(*pDst);
|
taosMemoryFreeClear(*pDst);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -898,9 +899,7 @@ int32_t qRebuildStmtDataBlock(void** pDst, void* pSrc, uint64_t uid, int32_t vgI
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
STableMeta *qGetTableMetaInDataBlock(void* pDataBlock) {
|
STableMeta* qGetTableMetaInDataBlock(void* pDataBlock) { return ((STableDataBlocks*)pDataBlock)->pTableMeta; }
|
||||||
return ((STableDataBlocks*)pDataBlock)->pTableMeta;
|
|
||||||
}
|
|
||||||
|
|
||||||
void qFreeStmtDataBlock(void* pDataBlock) {
|
void qFreeStmtDataBlock(void* pDataBlock) {
|
||||||
if (pDataBlock == NULL) {
|
if (pDataBlock == NULL) {
|
||||||
|
|
|
@ -613,27 +613,6 @@ uint32_t tGetToken(const char* z, uint32_t* tokenId) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
SToken tscReplaceStrToken(char** str, SToken* token, const char* newToken) {
|
|
||||||
char* src = *str;
|
|
||||||
size_t nsize = strlen(newToken);
|
|
||||||
int32_t size = (int32_t)strlen(*str) - token->n + (int32_t)nsize + 1;
|
|
||||||
int32_t bsize = (int32_t)((uint64_t)token->z - (uint64_t)src);
|
|
||||||
SToken ntoken;
|
|
||||||
|
|
||||||
*str = taosMemoryCalloc(1, size);
|
|
||||||
|
|
||||||
strncpy(*str, src, bsize);
|
|
||||||
strcat(*str, newToken);
|
|
||||||
strcat(*str, token->z + token->n);
|
|
||||||
|
|
||||||
ntoken.n = (uint32_t)nsize;
|
|
||||||
ntoken.z = *str + bsize;
|
|
||||||
|
|
||||||
taosMemoryFreeClear(src);
|
|
||||||
|
|
||||||
return ntoken;
|
|
||||||
}
|
|
||||||
|
|
||||||
SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr) {
|
SToken tStrGetToken(const char* str, int32_t* i, bool isPrevOptr) {
|
||||||
SToken t0 = {0};
|
SToken t0 = {0};
|
||||||
|
|
||||||
|
|
|
@ -292,9 +292,13 @@ static int32_t addNamespace(STranslateContext* pCxt, void* pTable) {
|
||||||
} else {
|
} else {
|
||||||
do {
|
do {
|
||||||
SArray* pTables = taosArrayInit(TARRAY_MIN_SIZE, POINTER_BYTES);
|
SArray* pTables = taosArrayInit(TARRAY_MIN_SIZE, POINTER_BYTES);
|
||||||
|
if (NULL == pTables) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
if (pCxt->currLevel == currTotalLevel) {
|
if (pCxt->currLevel == currTotalLevel) {
|
||||||
taosArrayPush(pTables, &pTable);
|
taosArrayPush(pTables, &pTable);
|
||||||
if (hasSameTableAlias(pTables)) {
|
if (hasSameTableAlias(pTables)) {
|
||||||
|
taosArrayDestroy(pTables);
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_UNIQUE_TABLE_ALIAS,
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_NOT_UNIQUE_TABLE_ALIAS,
|
||||||
"Not unique table/alias: '%s'", ((STableNode*)pTable)->tableAlias);
|
"Not unique table/alias: '%s'", ((STableNode*)pTable)->tableAlias);
|
||||||
}
|
}
|
||||||
|
@ -308,7 +312,7 @@ static int32_t addNamespace(STranslateContext* pCxt, void* pTable) {
|
||||||
|
|
||||||
static int32_t collectUseDatabaseImpl(const char* pFullDbName, SHashObj* pDbs) {
|
static int32_t collectUseDatabaseImpl(const char* pFullDbName, SHashObj* pDbs) {
|
||||||
SFullDatabaseName name = {0};
|
SFullDatabaseName name = {0};
|
||||||
strcpy(name.fullDbName, pFullDbName);
|
snprintf(name.fullDbName, sizeof(name.fullDbName), "%s", pFullDbName);
|
||||||
return taosHashPut(pDbs, pFullDbName, strlen(pFullDbName), &name, sizeof(SFullDatabaseName));
|
return taosHashPut(pDbs, pFullDbName, strlen(pFullDbName), &name, sizeof(SFullDatabaseName));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -540,15 +544,17 @@ static int32_t getTableIndex(STranslateContext* pCxt, const SName* pName, SArray
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = collectUseTable(pName, pCxt->pTables);
|
code = collectUseTable(pName, pCxt->pTables);
|
||||||
}
|
}
|
||||||
if (pParCxt->async) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = getTableIndexFromCache(pCxt->pMetaCache, pName, pIndexes);
|
if (pParCxt->async) {
|
||||||
} else {
|
code = getTableIndexFromCache(pCxt->pMetaCache, pName, pIndexes);
|
||||||
SRequestConnInfo conn = {.pTrans = pParCxt->pTransporter,
|
} else {
|
||||||
.requestId = pParCxt->requestId,
|
SRequestConnInfo conn = {.pTrans = pParCxt->pTransporter,
|
||||||
.requestObjRefId = pParCxt->requestRid,
|
.requestId = pParCxt->requestId,
|
||||||
.mgmtEps = pParCxt->mgmtEpSet};
|
.requestObjRefId = pParCxt->requestRid,
|
||||||
|
.mgmtEps = pParCxt->mgmtEpSet};
|
||||||
|
|
||||||
code = catalogGetTableIndex(pParCxt->pCatalog, &conn, pName, pIndexes);
|
code = catalogGetTableIndex(pParCxt->pCatalog, &conn, pName, pIndexes);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
if (TSDB_CODE_SUCCESS != code) {
|
||||||
parserError("0x%" PRIx64 " getTableIndex error, code:%s, dbName:%s, tbName:%s", pCxt->pParseCxt->requestId,
|
parserError("0x%" PRIx64 " getTableIndex error, code:%s, dbName:%s, tbName:%s", pCxt->pParseCxt->requestId,
|
||||||
|
@ -990,9 +996,9 @@ static int32_t parseTimeFromValueNode(STranslateContext* pCxt, SValueNode* pVal)
|
||||||
return pCxt->errCode;
|
return pCxt->errCode;
|
||||||
}
|
}
|
||||||
if (IS_UNSIGNED_NUMERIC_TYPE(pVal->node.resType.type)) {
|
if (IS_UNSIGNED_NUMERIC_TYPE(pVal->node.resType.type)) {
|
||||||
pVal->datum.i = pVal->datum.u;
|
pVal->datum.i = (int64_t)pVal->datum.u;
|
||||||
} else if (IS_FLOAT_TYPE(pVal->node.resType.type)) {
|
} else if (IS_FLOAT_TYPE(pVal->node.resType.type)) {
|
||||||
pVal->datum.i = pVal->datum.d;
|
pVal->datum.i = (int64_t)pVal->datum.d;
|
||||||
} else if (TSDB_DATA_TYPE_BOOL == pVal->node.resType.type) {
|
} else if (TSDB_DATA_TYPE_BOOL == pVal->node.resType.type) {
|
||||||
pVal->datum.i = pVal->datum.b;
|
pVal->datum.i = pVal->datum.b;
|
||||||
}
|
}
|
||||||
|
@ -1069,7 +1075,7 @@ static EDealRes translateNormalValue(STranslateContext* pCxt, SValueNode* pVal,
|
||||||
}
|
}
|
||||||
case TSDB_DATA_TYPE_BIGINT: {
|
case TSDB_DATA_TYPE_BIGINT: {
|
||||||
code = toInteger(pVal->literal, strlen(pVal->literal), 10, &pVal->datum.i);
|
code = toInteger(pVal->literal, strlen(pVal->literal), 10, &pVal->datum.i);
|
||||||
if (strict && (TSDB_CODE_SUCCESS != code || !IS_VALID_BIGINT(pVal->datum.i))) {
|
if (strict && TSDB_CODE_SUCCESS != code) {
|
||||||
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
return generateDealNodeErrMsg(pCxt, TSDB_CODE_PAR_WRONG_VALUE_TYPE, pVal->literal);
|
||||||
}
|
}
|
||||||
*(int64_t*)&pVal->typeData = pVal->datum.i;
|
*(int64_t*)&pVal->typeData = pVal->datum.i;
|
||||||
|
@ -1888,6 +1894,7 @@ static EDealRes translateCaseWhen(STranslateContext* pCxt, SCaseWhenNode* pCaseW
|
||||||
pWhenThen->pWhen = pIsTrue;
|
pWhenThen->pWhen = pIsTrue;
|
||||||
}
|
}
|
||||||
if (first) {
|
if (first) {
|
||||||
|
first = false;
|
||||||
pCaseWhen->node.resType = ((SExprNode*)pNode)->resType;
|
pCaseWhen->node.resType = ((SExprNode*)pNode)->resType;
|
||||||
} else if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
|
} else if (!dataTypeEqual(&pCaseWhen->node.resType, &((SExprNode*)pNode)->resType)) {
|
||||||
SNode* pCastFunc = NULL;
|
SNode* pCastFunc = NULL;
|
||||||
|
@ -3429,10 +3436,10 @@ static SNode* createSetOperProject(const char* pTableAlias, SNode* pNode) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pCol->node.resType = ((SExprNode*)pNode)->resType;
|
pCol->node.resType = ((SExprNode*)pNode)->resType;
|
||||||
strcpy(pCol->tableAlias, pTableAlias);
|
snprintf(pCol->tableAlias, sizeof(pCol->tableAlias), "%s", pTableAlias);
|
||||||
strcpy(pCol->colName, ((SExprNode*)pNode)->aliasName);
|
snprintf(pCol->colName, sizeof(pCol->colName), "%s", ((SExprNode*)pNode)->aliasName);
|
||||||
strcpy(pCol->node.aliasName, pCol->colName);
|
snprintf(pCol->node.aliasName, sizeof(pCol->node.aliasName), "%s", pCol->colName);
|
||||||
strcpy(pCol->node.userAlias, ((SExprNode*)pNode)->userAlias);
|
snprintf(pCol->node.userAlias, sizeof(pCol->node.userAlias), "%s", ((SExprNode*)pNode)->userAlias);
|
||||||
return (SNode*)pCol;
|
return (SNode*)pCol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3739,8 +3746,8 @@ static int32_t buildCreateDbReq(STranslateContext* pCxt, SCreateDatabaseStmt* pS
|
||||||
static int32_t checkRangeOption(STranslateContext* pCxt, int32_t code, const char* pName, int32_t val, int32_t minVal,
|
static int32_t checkRangeOption(STranslateContext* pCxt, int32_t code, const char* pName, int32_t val, int32_t minVal,
|
||||||
int32_t maxVal) {
|
int32_t maxVal) {
|
||||||
if (val >= 0 && (val < minVal || val > maxVal)) {
|
if (val >= 0 && (val < minVal || val > maxVal)) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, code, "Invalid option %s: %" PRId64 " valid range: [%d, %d]", pName,
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, code, "Invalid option %s: %d valid range: [%d, %d]", pName, val,
|
||||||
val, minVal, maxVal);
|
minVal, maxVal);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -3877,7 +3884,7 @@ static int32_t checkDbStrictOption(STranslateContext* pCxt, SDatabaseOptions* pO
|
||||||
static int32_t checkDbEnumOption(STranslateContext* pCxt, const char* pName, int32_t val, int32_t v1, int32_t v2) {
|
static int32_t checkDbEnumOption(STranslateContext* pCxt, const char* pName, int32_t val, int32_t v1, int32_t v2) {
|
||||||
if (val >= 0 && val != v1 && val != v2) {
|
if (val >= 0 && val != v1 && val != v2) {
|
||||||
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
|
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_INVALID_DB_OPTION,
|
||||||
"Invalid option %s: %" PRId64 ", only %d, %d allowed", pName, val, v1, v2);
|
"Invalid option %s: %d, only %d, %d allowed", pName, val, v1, v2);
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -4462,8 +4469,8 @@ static int32_t buildSampleAst(STranslateContext* pCxt, SSampleAstInfo* pInfo, ch
|
||||||
nodesDestroyNode((SNode*)pSelect);
|
nodesDestroyNode((SNode*)pSelect);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
strcpy(pTable->table.dbName, pInfo->pDbName);
|
snprintf(pTable->table.dbName, sizeof(pTable->table.dbName), "%s", pInfo->pDbName);
|
||||||
strcpy(pTable->table.tableName, pInfo->pTableName);
|
snprintf(pTable->table.tableName, sizeof(pTable->table.tableName), "%s", pInfo->pTableName);
|
||||||
TSWAP(pTable->pMeta, pInfo->pRollupTableMeta);
|
TSWAP(pTable->pMeta, pInfo->pRollupTableMeta);
|
||||||
pSelect->pFromTable = (SNode*)pTable;
|
pSelect->pFromTable = (SNode*)pTable;
|
||||||
|
|
||||||
|
@ -4939,9 +4946,9 @@ static int32_t translateAlterUser(STranslateContext* pCxt, SAlterUserStmt* pStmt
|
||||||
alterReq.superUser = 0;
|
alterReq.superUser = 0;
|
||||||
alterReq.enable = pStmt->enable;
|
alterReq.enable = pStmt->enable;
|
||||||
alterReq.sysInfo = pStmt->sysinfo;
|
alterReq.sysInfo = pStmt->sysinfo;
|
||||||
strcpy(alterReq.pass, pStmt->password);
|
snprintf(alterReq.pass, sizeof(alterReq.pass), "%s", pStmt->password);
|
||||||
if (NULL != pCxt->pParseCxt->db) {
|
if (NULL != pCxt->pParseCxt->db) {
|
||||||
strcpy(alterReq.dbname, pCxt->pParseCxt->db);
|
snprintf(alterReq.dbname, sizeof(alterReq.dbname), "%s", pCxt->pParseCxt->db);
|
||||||
}
|
}
|
||||||
|
|
||||||
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &alterReq);
|
return buildCmdMsg(pCxt, TDMT_MND_ALTER_USER, (FSerializeFunc)tSerializeSAlterUserReq, &alterReq);
|
||||||
|
@ -6048,7 +6055,7 @@ static SNode* createProjectCol(const char* pProjCol) {
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
strcpy(pCol->colName, pProjCol);
|
snprintf(pCol->colName, sizeof(pCol->colName), "%s", pProjCol);
|
||||||
return (SNode*)pCol;
|
return (SNode*)pCol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6081,9 +6088,9 @@ static int32_t createSimpleSelectStmt(const char* pDb, const char* pTable, int32
|
||||||
nodesDestroyNode((SNode*)pSelect);
|
nodesDestroyNode((SNode*)pSelect);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
strcpy(pRealTable->table.dbName, pDb);
|
snprintf(pRealTable->table.dbName, sizeof(pRealTable->table.dbName), "%s", pDb);
|
||||||
strcpy(pRealTable->table.tableName, pTable);
|
snprintf(pRealTable->table.tableName, sizeof(pRealTable->table.tableName), "%s", pTable);
|
||||||
strcpy(pRealTable->table.tableAlias, pTable);
|
snprintf(pRealTable->table.tableAlias, sizeof(pRealTable->table.tableAlias), "%s", pTable);
|
||||||
pSelect->pFromTable = (SNode*)pRealTable;
|
pSelect->pFromTable = (SNode*)pRealTable;
|
||||||
|
|
||||||
if (numOfProjs >= 0) {
|
if (numOfProjs >= 0) {
|
||||||
|
@ -7124,8 +7131,9 @@ static int32_t buildUpdateOptionsReq(STranslateContext* pCxt, SAlterTableStmt* p
|
||||||
pReq->newComment = strdup(pStmt->pOptions->comment);
|
pReq->newComment = strdup(pStmt->pOptions->comment);
|
||||||
if (NULL == pReq->newComment) {
|
if (NULL == pReq->newComment) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
} else {
|
||||||
|
pReq->newCommentLen = strlen(pReq->newComment);
|
||||||
}
|
}
|
||||||
pReq->newCommentLen = strlen(pReq->newComment);
|
|
||||||
} else {
|
} else {
|
||||||
pReq->newCommentLen = -1;
|
pReq->newCommentLen = -1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -381,6 +381,7 @@ int32_t parseJsontoTagData(const char* json, SArray* pTagVals, STag** ppTag, voi
|
||||||
uError("charset:%s to %s. val:%s, errno:%s, convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, jsonValue,
|
uError("charset:%s to %s. val:%s, errno:%s, convert failed.", DEFAULT_UNICODE_ENCODEC, tsCharset, jsonValue,
|
||||||
strerror(errno));
|
strerror(errno));
|
||||||
retCode = buildSyntaxErrMsg(pMsgBuf, "charset convert json error", jsonValue);
|
retCode = buildSyntaxErrMsg(pMsgBuf, "charset convert json error", jsonValue);
|
||||||
|
taosMemoryFree(tmp);
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
val.nData = valLen;
|
val.nData = valLen;
|
||||||
|
@ -652,8 +653,8 @@ static int32_t buildCatalogReqForInsert(SParseContext* pCxt, const SParseMetaCac
|
||||||
}
|
}
|
||||||
|
|
||||||
SUserAuthInfo auth = {0};
|
SUserAuthInfo auth = {0};
|
||||||
strcpy(auth.user, pCxt->pUser);
|
snprintf(auth.user, sizeof(auth.user), "%s", pCxt->pUser);
|
||||||
strcpy(auth.dbFName, p->dbFName);
|
snprintf(auth.dbFName, sizeof(auth.dbFName), "%s", p->dbFName);
|
||||||
auth.type = AUTH_TYPE_WRITE;
|
auth.type = AUTH_TYPE_WRITE;
|
||||||
taosArrayPush(pCatalogReq->pUser, &auth);
|
taosArrayPush(pCatalogReq->pUser, &auth);
|
||||||
|
|
||||||
|
|
|
@ -66,7 +66,8 @@ static EDealRes doRewriteExpr(SNode** pNode, void* pContext) {
|
||||||
switch (nodeType(*pNode)) {
|
switch (nodeType(*pNode)) {
|
||||||
case QUERY_NODE_OPERATOR:
|
case QUERY_NODE_OPERATOR:
|
||||||
case QUERY_NODE_LOGIC_CONDITION:
|
case QUERY_NODE_LOGIC_CONDITION:
|
||||||
case QUERY_NODE_FUNCTION: {
|
case QUERY_NODE_FUNCTION:
|
||||||
|
case QUERY_NODE_CASE_WHEN: {
|
||||||
SRewriteExprCxt* pCxt = (SRewriteExprCxt*)pContext;
|
SRewriteExprCxt* pCxt = (SRewriteExprCxt*)pContext;
|
||||||
SNode* pExpr;
|
SNode* pExpr;
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
@ -118,6 +119,17 @@ static EDealRes doNameExpr(SNode* pNode, void* pContext) {
|
||||||
return DEAL_RES_CONTINUE;
|
return DEAL_RES_CONTINUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t rewriteExprForSelect(SNode* pExpr, SSelectStmt* pSelect, ESqlClause clause) {
|
||||||
|
nodesWalkExpr(pExpr, doNameExpr, NULL);
|
||||||
|
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = NULL};
|
||||||
|
cxt.errCode = nodesListMakeAppend(&cxt.pExprs, pExpr);
|
||||||
|
if (TSDB_CODE_SUCCESS == cxt.errCode) {
|
||||||
|
nodesRewriteSelectStmt(pSelect, clause, doRewriteExpr, &cxt);
|
||||||
|
nodesClearList(cxt.pExprs);
|
||||||
|
}
|
||||||
|
return cxt.errCode;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t rewriteExprsForSelect(SNodeList* pExprs, SSelectStmt* pSelect, ESqlClause clause) {
|
static int32_t rewriteExprsForSelect(SNodeList* pExprs, SSelectStmt* pSelect, ESqlClause clause) {
|
||||||
nodesWalkExprs(pExprs, doNameExpr, NULL);
|
nodesWalkExprs(pExprs, doNameExpr, NULL);
|
||||||
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs};
|
SRewriteExprCxt cxt = {.errCode = TSDB_CODE_SUCCESS, .pExprs = pExprs};
|
||||||
|
@ -459,9 +471,9 @@ static SColumnNode* createColumnByExpr(const char* pStmtName, SExprNode* pExpr)
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
pCol->node.resType = pExpr->resType;
|
pCol->node.resType = pExpr->resType;
|
||||||
strcpy(pCol->colName, pExpr->aliasName);
|
snprintf(pCol->colName, sizeof(pCol->colName), "%s", pExpr->aliasName);
|
||||||
if (NULL != pStmtName) {
|
if (NULL != pStmtName) {
|
||||||
strcpy(pCol->tableAlias, pStmtName);
|
snprintf(pCol->tableAlias, sizeof(pCol->tableAlias), "%s", pStmtName);
|
||||||
}
|
}
|
||||||
return pCol;
|
return pCol;
|
||||||
}
|
}
|
||||||
|
@ -711,8 +723,13 @@ static int32_t createWindowLogicNodeByState(SLogicPlanContext* pCxt, SStateWindo
|
||||||
nodesDestroyNode((SNode*)pWindow);
|
nodesDestroyNode((SNode*)pWindow);
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
// rewrite the expression in subsequent clauses
|
||||||
|
int32_t code = rewriteExprForSelect(pWindow->pStateExpr, pSelect, SQL_CLAUSE_WINDOW);
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode);
|
||||||
|
}
|
||||||
|
|
||||||
return createWindowLogicNodeFinalize(pCxt, pSelect, pWindow, pLogicNode);
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t createWindowLogicNodeBySession(SLogicPlanContext* pCxt, SSessionWindowNode* pSession,
|
static int32_t createWindowLogicNodeBySession(SLogicPlanContext* pCxt, SSessionWindowNode* pSession,
|
||||||
|
|
|
@ -1124,7 +1124,7 @@ static int32_t sortPriKeyOptGetSequencingNodes(SLogicNode* pNode, SNodeList** pS
|
||||||
bool notOptimize = false;
|
bool notOptimize = false;
|
||||||
int32_t code = sortPriKeyOptGetSequencingNodesImpl(pNode, ¬Optimize, pSequencingNodes);
|
int32_t code = sortPriKeyOptGetSequencingNodesImpl(pNode, ¬Optimize, pSequencingNodes);
|
||||||
if (TSDB_CODE_SUCCESS != code || notOptimize) {
|
if (TSDB_CODE_SUCCESS != code || notOptimize) {
|
||||||
nodesClearList(*pSequencingNodes);
|
NODES_CLEAR_LIST(*pSequencingNodes);
|
||||||
}
|
}
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1361,74 +1361,6 @@ static int32_t smaIndexOptCouldApplyIndex(SScanLogicNode* pScan, STableIndexInfo
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static SNode* smaIndexOptCreateWStartTs() {
|
|
||||||
SFunctionNode* pWStart = (SFunctionNode*)nodesMakeNode(QUERY_NODE_FUNCTION);
|
|
||||||
if (NULL == pWStart) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
strcpy(pWStart->functionName, "_wstart");
|
|
||||||
snprintf(pWStart->node.aliasName, sizeof(pWStart->node.aliasName), "%s.%p", pWStart->functionName, pWStart);
|
|
||||||
if (TSDB_CODE_SUCCESS != fmGetFuncInfo(pWStart, NULL, 0)) {
|
|
||||||
nodesDestroyNode((SNode*)pWStart);
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return (SNode*)pWStart;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t smaIndexOptCreateMergeKey(SNode* pCol, SNodeList** pMergeKeys) {
|
|
||||||
SOrderByExprNode* pMergeKey = (SOrderByExprNode*)nodesMakeNode(QUERY_NODE_ORDER_BY_EXPR);
|
|
||||||
if (NULL == pMergeKey) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
pMergeKey->pExpr = nodesCloneNode(pCol);
|
|
||||||
if (NULL == pMergeKey->pExpr) {
|
|
||||||
nodesDestroyNode((SNode*)pMergeKey);
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
pMergeKey->order = ORDER_ASC;
|
|
||||||
pMergeKey->nullOrder = NULL_ORDER_FIRST;
|
|
||||||
return nodesListMakeStrictAppend(pMergeKeys, (SNode*)pMergeKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t smaIndexOptRewriteInterval(SWindowLogicNode* pInterval, int32_t wstrartIndex, SNodeList** pMergeKeys) {
|
|
||||||
if (wstrartIndex < 0) {
|
|
||||||
SNode* pWStart = smaIndexOptCreateWStartTs();
|
|
||||||
if (NULL == pWStart) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
int32_t code = createColumnByRewriteExpr(pWStart, &pInterval->node.pTargets);
|
|
||||||
if (TSDB_CODE_SUCCESS != code) {
|
|
||||||
nodesDestroyNode(pWStart);
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
wstrartIndex = LIST_LENGTH(pInterval->node.pTargets) - 1;
|
|
||||||
}
|
|
||||||
return smaIndexOptCreateMergeKey(nodesListGetNode(pInterval->node.pTargets, wstrartIndex), pMergeKeys);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t smaIndexOptApplyIndexExt(SLogicSubplan* pLogicSubplan, SScanLogicNode* pScan, STableIndexInfo* pIndex,
|
|
||||||
SNodeList* pSmaCols, int32_t wstrartIndex) {
|
|
||||||
SWindowLogicNode* pInterval = (SWindowLogicNode*)pScan->node.pParent;
|
|
||||||
SNodeList* pMergeTargets = nodesCloneList(pInterval->node.pTargets);
|
|
||||||
if (NULL == pMergeTargets) {
|
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
}
|
|
||||||
SLogicNode* pSmaScan = NULL;
|
|
||||||
SLogicNode* pMerge = NULL;
|
|
||||||
SNodeList* pMergeKeys = NULL;
|
|
||||||
int32_t code = smaIndexOptRewriteInterval(pInterval, wstrartIndex, &pMergeKeys);
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = smaIndexOptCreateSmaScan(pScan, pIndex, pSmaCols, &pSmaScan);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = smaIndexOptCreateMerge(pScan->node.pParent, pMergeKeys, pMergeTargets, &pMerge);
|
|
||||||
}
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
code = smaIndexOptRecombinationNode(pLogicSubplan, pScan->node.pParent, pMerge, pSmaScan);
|
|
||||||
}
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int32_t smaIndexOptApplyIndex(SLogicSubplan* pLogicSubplan, SScanLogicNode* pScan, STableIndexInfo* pIndex,
|
static int32_t smaIndexOptApplyIndex(SLogicSubplan* pLogicSubplan, SScanLogicNode* pScan, STableIndexInfo* pIndex,
|
||||||
SNodeList* pSmaCols, int32_t wstrartIndex) {
|
SNodeList* pSmaCols, int32_t wstrartIndex) {
|
||||||
SLogicNode* pSmaScan = NULL;
|
SLogicNode* pSmaScan = NULL;
|
||||||
|
@ -1559,7 +1491,7 @@ static SNode* partTagsCreateWrapperFunc(const char* pFuncName, SNode* pNode) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
strcpy(pFunc->functionName, pFuncName);
|
snprintf(pFunc->functionName, sizeof(pFunc->functionName), "%s", pFuncName);
|
||||||
if (QUERY_NODE_COLUMN == nodeType(pNode) && COLUMN_TYPE_TBNAME != ((SColumnNode*)pNode)->colType) {
|
if (QUERY_NODE_COLUMN == nodeType(pNode) && COLUMN_TYPE_TBNAME != ((SColumnNode*)pNode)->colType) {
|
||||||
SColumnNode* pCol = (SColumnNode*)pNode;
|
SColumnNode* pCol = (SColumnNode*)pNode;
|
||||||
partTagsSetAlias(pFunc->node.aliasName, sizeof(pFunc->node.aliasName), pCol->tableAlias, pCol->colName);
|
partTagsSetAlias(pFunc->node.aliasName, sizeof(pFunc->node.aliasName), pCol->tableAlias, pCol->colName);
|
||||||
|
@ -2028,7 +1960,7 @@ static SNode* rewriteUniqueOptCreateFirstFunc(SFunctionNode* pSelectValue, SNode
|
||||||
if (NULL != pSelectValue) {
|
if (NULL != pSelectValue) {
|
||||||
strcpy(pFunc->node.aliasName, pSelectValue->node.aliasName);
|
strcpy(pFunc->node.aliasName, pSelectValue->node.aliasName);
|
||||||
} else {
|
} else {
|
||||||
snprintf(pFunc->node.aliasName, sizeof(pFunc->node.aliasName), "%s.%p", pFunc->functionName, pFunc);
|
snprintf(pFunc->node.aliasName, sizeof(pFunc->node.aliasName), "%s.%p", pFunc->functionName, (void*)pFunc);
|
||||||
}
|
}
|
||||||
int32_t code = nodesListMakeStrictAppend(&pFunc->pParameterList, nodesCloneNode(pCol));
|
int32_t code = nodesListMakeStrictAppend(&pFunc->pParameterList, nodesCloneNode(pCol));
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
|
|
@ -67,7 +67,7 @@ static SNode* createSlotDesc(SPhysiPlanContext* pCxt, const char* pName, const S
|
||||||
if (NULL == pSlot) {
|
if (NULL == pSlot) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
strcpy(pSlot->name, pName);
|
snprintf(pSlot->name, sizeof(pSlot->name), "%s", pName);
|
||||||
pSlot->slotId = slotId;
|
pSlot->slotId = slotId;
|
||||||
pSlot->dataType = ((SExprNode*)pNode)->resType;
|
pSlot->dataType = ((SExprNode*)pNode)->resType;
|
||||||
pSlot->reserve = reserve;
|
pSlot->reserve = reserve;
|
||||||
|
@ -663,13 +663,17 @@ static int32_t createJoinPhysiNode(SPhysiPlanContext* pCxt, SNodeList* pChildren
|
||||||
code = addDataBlockSlots(pCxt, pJoin->pTargets, pJoin->node.pOutputDataBlockDesc);
|
code = addDataBlockSlots(pCxt, pJoin->pTargets, pJoin->node.pOutputDataBlockDesc);
|
||||||
}
|
}
|
||||||
|
|
||||||
SNodeList* condCols = nodesMakeList();
|
|
||||||
if (TSDB_CODE_SUCCESS == code && NULL != pJoinLogicNode->pOnConditions) {
|
if (TSDB_CODE_SUCCESS == code && NULL != pJoinLogicNode->pOnConditions) {
|
||||||
code = nodesCollectColumnsFromNode(pJoinLogicNode->pOnConditions, NULL, COLLECT_COL_TYPE_ALL, &condCols);
|
SNodeList* pCondCols = nodesMakeList();
|
||||||
}
|
if (NULL == pCondCols) {
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
code = addDataBlockSlots(pCxt, condCols, pJoin->node.pOutputDataBlockDesc);
|
} else {
|
||||||
nodesDestroyList(condCols);
|
code = nodesCollectColumnsFromNode(pJoinLogicNode->pOnConditions, NULL, COLLECT_COL_TYPE_ALL, &pCondCols);
|
||||||
|
}
|
||||||
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
|
code = addDataBlockSlots(pCxt, pCondCols, pJoin->node.pOutputDataBlockDesc);
|
||||||
|
}
|
||||||
|
nodesDestroyList(pCondCols);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && NULL != pJoinLogicNode->pOnConditions) {
|
if (TSDB_CODE_SUCCESS == code && NULL != pJoinLogicNode->pOnConditions) {
|
||||||
|
@ -761,7 +765,8 @@ static EDealRes doRewritePrecalcExprs(SNode** pNode, void* pContext) {
|
||||||
return collectAndRewrite(pCxt, pNode);
|
return collectAndRewrite(pCxt, pNode);
|
||||||
}
|
}
|
||||||
case QUERY_NODE_OPERATOR:
|
case QUERY_NODE_OPERATOR:
|
||||||
case QUERY_NODE_LOGIC_CONDITION: {
|
case QUERY_NODE_LOGIC_CONDITION:
|
||||||
|
case QUERY_NODE_CASE_WHEN: {
|
||||||
return collectAndRewrite(pCxt, pNode);
|
return collectAndRewrite(pCxt, pNode);
|
||||||
}
|
}
|
||||||
case QUERY_NODE_FUNCTION: {
|
case QUERY_NODE_FUNCTION: {
|
||||||
|
@ -1633,7 +1638,7 @@ static SSubplan* makeSubplan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubpl
|
||||||
pSubplan->subplanType = pLogicSubplan->subplanType;
|
pSubplan->subplanType = pLogicSubplan->subplanType;
|
||||||
pSubplan->level = pLogicSubplan->level;
|
pSubplan->level = pLogicSubplan->level;
|
||||||
if (NULL != pCxt->pPlanCxt->pUser) {
|
if (NULL != pCxt->pPlanCxt->pUser) {
|
||||||
strcpy(pSubplan->user, pCxt->pPlanCxt->pUser);
|
snprintf(pSubplan->user, sizeof(pSubplan->user), "%s", pCxt->pPlanCxt->pUser);
|
||||||
}
|
}
|
||||||
return pSubplan;
|
return pSubplan;
|
||||||
}
|
}
|
||||||
|
@ -1824,7 +1829,7 @@ static int32_t pushSubplan(SPhysiPlanContext* pCxt, SNode* pSubplan, int32_t lev
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nodesListStrictAppend(pGroup->pNodeList, (SNode*)pSubplan);
|
return nodesListAppend(pGroup->pNodeList, (SNode*)pSubplan);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t buildPhysiPlan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubplan, SSubplan* pParent,
|
static int32_t buildPhysiPlan(SPhysiPlanContext* pCxt, SLogicSubplan* pLogicSubplan, SSubplan* pParent,
|
||||||
|
|
|
@ -342,7 +342,7 @@ static int32_t stbSplAppendWStart(SNodeList* pFuncs, int32_t* pIndex) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
strcpy(pWStart->functionName, "_wstart");
|
strcpy(pWStart->functionName, "_wstart");
|
||||||
snprintf(pWStart->node.aliasName, sizeof(pWStart->node.aliasName), "%s.%p", pWStart->functionName, pWStart);
|
snprintf(pWStart->node.aliasName, sizeof(pWStart->node.aliasName), "%s.%p", pWStart->functionName, (void*)pWStart);
|
||||||
int32_t code = fmGetFuncInfo(pWStart, NULL, 0);
|
int32_t code = fmGetFuncInfo(pWStart, NULL, 0);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = nodesListStrictAppend(pFuncs, (SNode*)pWStart);
|
code = nodesListStrictAppend(pFuncs, (SNode*)pWStart);
|
||||||
|
@ -367,7 +367,7 @@ static int32_t stbSplAppendWEnd(SWindowLogicNode* pWin, int32_t* pIndex) {
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
strcpy(pWEnd->functionName, "_wend");
|
strcpy(pWEnd->functionName, "_wend");
|
||||||
snprintf(pWEnd->node.aliasName, sizeof(pWEnd->node.aliasName), "%s.%p", pWEnd->functionName, pWEnd);
|
snprintf(pWEnd->node.aliasName, sizeof(pWEnd->node.aliasName), "%s.%p", pWEnd->functionName, (void*)pWEnd);
|
||||||
int32_t code = fmGetFuncInfo(pWEnd, NULL, 0);
|
int32_t code = fmGetFuncInfo(pWEnd, NULL, 0);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = nodesListStrictAppend(pWin->pFuncs, (SNode*)pWEnd);
|
code = nodesListStrictAppend(pWin->pFuncs, (SNode*)pWEnd);
|
||||||
|
@ -389,22 +389,19 @@ static int32_t stbSplCreatePartWindowNode(SWindowLogicNode* pMergeWindow, SLogic
|
||||||
SNode* pConditions = pMergeWindow->node.pConditions;
|
SNode* pConditions = pMergeWindow->node.pConditions;
|
||||||
pMergeWindow->node.pConditions = NULL;
|
pMergeWindow->node.pConditions = NULL;
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
|
||||||
SWindowLogicNode* pPartWin = (SWindowLogicNode*)nodesCloneNode((SNode*)pMergeWindow);
|
SWindowLogicNode* pPartWin = (SWindowLogicNode*)nodesCloneNode((SNode*)pMergeWindow);
|
||||||
if (NULL == pPartWin) {
|
if (NULL == pPartWin) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pPartWin->node.groupAction = GROUP_ACTION_KEEP;
|
pPartWin->node.groupAction = GROUP_ACTION_KEEP;
|
||||||
|
pMergeWindow->node.pTargets = pTargets;
|
||||||
|
pMergeWindow->node.pConditions = pConditions;
|
||||||
|
pPartWin->node.pChildren = pChildren;
|
||||||
|
splSetParent((SLogicNode*)pPartWin);
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
|
||||||
pMergeWindow->node.pTargets = pTargets;
|
|
||||||
pMergeWindow->node.pConditions = pConditions;
|
|
||||||
pPartWin->node.pChildren = pChildren;
|
|
||||||
splSetParent((SLogicNode*)pPartWin);
|
|
||||||
code = stbSplRewriteFuns(pFunc, &pPartWin->pFuncs, &pMergeWindow->pFuncs);
|
|
||||||
}
|
|
||||||
int32_t index = 0;
|
int32_t index = 0;
|
||||||
|
int32_t code = stbSplRewriteFuns(pFunc, &pPartWin->pFuncs, &pMergeWindow->pFuncs);
|
||||||
if (TSDB_CODE_SUCCESS == code) {
|
if (TSDB_CODE_SUCCESS == code) {
|
||||||
code = stbSplAppendWStart(pPartWin->pFuncs, &index);
|
code = stbSplAppendWStart(pPartWin->pFuncs, &index);
|
||||||
}
|
}
|
||||||
|
@ -721,15 +718,16 @@ static int32_t stbSplCreatePartAggNode(SAggLogicNode* pMergeAgg, SLogicNode** pO
|
||||||
SNode* pConditions = pMergeAgg->node.pConditions;
|
SNode* pConditions = pMergeAgg->node.pConditions;
|
||||||
pMergeAgg->node.pConditions = NULL;
|
pMergeAgg->node.pConditions = NULL;
|
||||||
|
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
|
||||||
SAggLogicNode* pPartAgg = (SAggLogicNode*)nodesCloneNode((SNode*)pMergeAgg);
|
SAggLogicNode* pPartAgg = (SAggLogicNode*)nodesCloneNode((SNode*)pMergeAgg);
|
||||||
if (NULL == pPartAgg) {
|
if (NULL == pPartAgg) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
|
|
||||||
pPartAgg->node.groupAction = GROUP_ACTION_KEEP;
|
pPartAgg->node.groupAction = GROUP_ACTION_KEEP;
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && NULL != pGroupKeys) {
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
|
if (NULL != pGroupKeys) {
|
||||||
pPartAgg->pGroupKeys = pGroupKeys;
|
pPartAgg->pGroupKeys = pGroupKeys;
|
||||||
code = createColumnByRewriteExprs(pPartAgg->pGroupKeys, &pPartAgg->node.pTargets);
|
code = createColumnByRewriteExprs(pPartAgg->pGroupKeys, &pPartAgg->node.pTargets);
|
||||||
}
|
}
|
||||||
|
|
|
@ -53,7 +53,8 @@ static EDealRes doCreateColumn(SNode* pNode, void* pContext) {
|
||||||
}
|
}
|
||||||
case QUERY_NODE_OPERATOR:
|
case QUERY_NODE_OPERATOR:
|
||||||
case QUERY_NODE_LOGIC_CONDITION:
|
case QUERY_NODE_LOGIC_CONDITION:
|
||||||
case QUERY_NODE_FUNCTION: {
|
case QUERY_NODE_FUNCTION:
|
||||||
|
case QUERY_NODE_CASE_WHEN: {
|
||||||
SExprNode* pExpr = (SExprNode*)pNode;
|
SExprNode* pExpr = (SExprNode*)pNode;
|
||||||
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
SColumnNode* pCol = (SColumnNode*)nodesMakeNode(QUERY_NODE_COLUMN);
|
||||||
if (NULL == pCol) {
|
if (NULL == pCol) {
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen,
|
int32_t (*queryBuildMsg[TDMT_MAX])(void *input, char **msg, int32_t msgSize, int32_t *msgLen,
|
||||||
void *(*mallocFp)(int32_t)) = {0};
|
void *(*mallocFp)(int64_t)) = {0};
|
||||||
int32_t (*queryProcessMsgRsp[TDMT_MAX])(void *output, char *msg, int32_t msgSize) = {0};
|
int32_t (*queryProcessMsgRsp[TDMT_MAX])(void *output, char *msg, int32_t msgSize) = {0};
|
||||||
|
|
||||||
int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) {
|
int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) {
|
||||||
|
@ -68,7 +68,7 @@ int32_t queryBuildUseDbOutput(SUseDbOutput *pOut, SUseDbRsp *usedbRsp) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildTableMetaReqMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen,
|
int32_t queryBuildTableMetaReqMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen,
|
||||||
void *(*mallcFp)(int32_t)) {
|
void *(*mallcFp)(int64_t)) {
|
||||||
SBuildTableInput *pInput = input;
|
SBuildTableInput *pInput = input;
|
||||||
if (NULL == input || NULL == msg || NULL == msgLen) {
|
if (NULL == input || NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
|
@ -91,7 +91,7 @@ int32_t queryBuildTableMetaReqMsg(void *input, char **msg, int32_t msgSize, int3
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildUseDbMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildUseDbMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
SBuildUseDBInput *pInput = input;
|
SBuildUseDBInput *pInput = input;
|
||||||
if (NULL == pInput || NULL == msg || NULL == msgLen) {
|
if (NULL == pInput || NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
|
@ -114,7 +114,7 @@ int32_t queryBuildUseDbMsg(void *input, char **msg, int32_t msgSize, int32_t *ms
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildQnodeListMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildQnodeListMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -132,7 +132,7 @@ int32_t queryBuildQnodeListMsg(void *input, char **msg, int32_t msgSize, int32_t
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildDnodeListMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildDnodeListMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ int32_t queryBuildDnodeListMsg(void *input, char **msg, int32_t msgSize, int32_t
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildGetSerVerMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildGetSerVerMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -167,7 +167,7 @@ int32_t queryBuildGetSerVerMsg(void *input, char **msg, int32_t msgSize, int32_t
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildGetDBCfgMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildGetDBCfgMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -185,7 +185,7 @@ int32_t queryBuildGetDBCfgMsg(void *input, char **msg, int32_t msgSize, int32_t
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildGetIndexMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildGetIndexMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -204,7 +204,7 @@ int32_t queryBuildGetIndexMsg(void *input, char **msg, int32_t msgSize, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildRetrieveFuncMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen,
|
int32_t queryBuildRetrieveFuncMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen,
|
||||||
void *(*mallcFp)(int32_t)) {
|
void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -227,7 +227,7 @@ int32_t queryBuildRetrieveFuncMsg(void *input, char **msg, int32_t msgSize, int3
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildGetUserAuthMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildGetUserAuthMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -245,7 +245,7 @@ int32_t queryBuildGetUserAuthMsg(void *input, char **msg, int32_t msgSize, int32
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildGetTbIndexMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildGetTbIndexMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
@ -263,7 +263,7 @@ int32_t queryBuildGetTbIndexMsg(void *input, char **msg, int32_t msgSize, int32_
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t queryBuildGetTbCfgMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int32_t)) {
|
int32_t queryBuildGetTbCfgMsg(void *input, char **msg, int32_t msgSize, int32_t *msgLen, void *(*mallcFp)(int64_t)) {
|
||||||
if (NULL == msg || NULL == msgLen) {
|
if (NULL == msg || NULL == msgLen) {
|
||||||
return TSDB_CODE_TSC_INVALID_INPUT;
|
return TSDB_CODE_TSC_INVALID_INPUT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -123,6 +123,7 @@ typedef struct SQWTaskCtx {
|
||||||
int32_t execId;
|
int32_t execId;
|
||||||
int32_t level;
|
int32_t level;
|
||||||
|
|
||||||
|
bool queryGotData;
|
||||||
bool queryRsped;
|
bool queryRsped;
|
||||||
bool queryEnd;
|
bool queryEnd;
|
||||||
bool queryContinue;
|
bool queryContinue;
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
|
#include "tglobal.h"
|
||||||
|
|
||||||
SQWorkerMgmt gQwMgmt = {
|
SQWorkerMgmt gQwMgmt = {
|
||||||
.lock = 0,
|
.lock = 0,
|
||||||
|
@ -92,6 +93,19 @@ int32_t qwHandleTaskComplete(QW_FPARAMS_DEF, SQWTaskCtx *ctx) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qwSendQueryRsp(QW_FPARAMS_DEF, int32_t msgType, SQWTaskCtx *ctx, int32_t rspCode, bool quickRsp) {
|
||||||
|
if ((!quickRsp) || QUERY_RSP_POLICY_QUICK == tsQueryRspPolicy) {
|
||||||
|
if (!ctx->localExec) {
|
||||||
|
qwBuildAndSendQueryRsp(msgType, &ctx->ctrlConnInfo, rspCode, ctx);
|
||||||
|
QW_TASK_DLOG("query msg rsped, handle:%p, code:%x - %s", ctx->ctrlConnInfo.handle, rspCode, tstrerror(rspCode));
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx->queryRsped = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryStop) {
|
int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryStop) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
bool qcontinue = true;
|
bool qcontinue = true;
|
||||||
|
@ -144,7 +158,7 @@ int32_t qwExecTask(QW_FPARAMS_DEF, SQWTaskCtx *ctx, bool *queryStop) {
|
||||||
if (numOfResBlock == 0) {
|
if (numOfResBlock == 0) {
|
||||||
QW_TASK_DLOG("qExecTask end with empty res, useconds:%" PRIu64, useconds);
|
QW_TASK_DLOG("qExecTask end with empty res, useconds:%" PRIu64, useconds);
|
||||||
} else {
|
} else {
|
||||||
QW_TASK_DLOG("qExecTask done", "");
|
QW_TASK_DLOG("qExecTask done, useconds:%" PRIu64, useconds);
|
||||||
}
|
}
|
||||||
|
|
||||||
dsEndPut(sinkHandle, useconds);
|
dsEndPut(sinkHandle, useconds);
|
||||||
|
@ -234,6 +248,10 @@ int32_t qwGetQueryResFromSink(QW_FPARAMS_DEF, SQWTaskCtx *ctx, int32_t *dataLen,
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SOutputData output = {0};
|
SOutputData output = {0};
|
||||||
|
|
||||||
|
if (NULL == ctx->sinkHandle) {
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
*dataLen = 0;
|
*dataLen = 0;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
|
@ -407,6 +425,11 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu
|
||||||
QW_ERR_JRET(TSDB_CODE_QRY_DUPLICATTED_OPERATION);
|
QW_ERR_JRET(TSDB_CODE_QRY_DUPLICATTED_OPERATION);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->rspCode) {
|
||||||
|
QW_TASK_ELOG("task already failed cause of %s, phase:%s", tstrerror(ctx->rspCode), qwPhaseStr(phase));
|
||||||
|
QW_ERR_JRET(ctx->rspCode);
|
||||||
|
}
|
||||||
|
|
||||||
if (!ctx->queryRsped) {
|
if (!ctx->queryRsped) {
|
||||||
QW_TASK_ELOG("ready msg has not been processed, phase:%s", qwPhaseStr(phase));
|
QW_TASK_ELOG("ready msg has not been processed, phase:%s", qwPhaseStr(phase));
|
||||||
QW_ERR_JRET(TSDB_CODE_QRY_TASK_MSG_ERROR);
|
QW_ERR_JRET(TSDB_CODE_QRY_TASK_MSG_ERROR);
|
||||||
|
@ -419,6 +442,11 @@ int32_t qwHandlePrePhaseEvents(QW_FPARAMS_DEF, int8_t phase, SQWPhaseInput *inpu
|
||||||
QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED);
|
QW_ERR_JRET(TSDB_CODE_QRY_TASK_DROPPED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ctx->rspCode) {
|
||||||
|
QW_TASK_ELOG("task already failed cause of %s, phase:%s", tstrerror(ctx->rspCode), qwPhaseStr(phase));
|
||||||
|
QW_ERR_JRET(ctx->rspCode);
|
||||||
|
}
|
||||||
|
|
||||||
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) {
|
if (QW_EVENT_RECEIVED(ctx, QW_EVENT_DROP)) {
|
||||||
QW_ERR_JRET(qwDropTask(QW_FPARAMS()));
|
QW_ERR_JRET(qwDropTask(QW_FPARAMS()));
|
||||||
|
|
||||||
|
@ -499,21 +527,17 @@ _return:
|
||||||
|
|
||||||
if (TSDB_CODE_SUCCESS == code && QW_PHASE_POST_QUERY == phase) {
|
if (TSDB_CODE_SUCCESS == code && QW_PHASE_POST_QUERY == phase) {
|
||||||
qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_PART_SUCC);
|
qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_PART_SUCC);
|
||||||
|
ctx->queryGotData = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (QW_PHASE_POST_QUERY == phase && ctx) {
|
if (QW_PHASE_POST_QUERY == phase && ctx && !ctx->queryRsped) {
|
||||||
if (!ctx->localExec) {
|
bool rsped = false;
|
||||||
bool rsped = false;
|
SQWMsg qwMsg = {.msgType = ctx->msgType, .connInfo = ctx->ctrlConnInfo};
|
||||||
SQWMsg qwMsg = {.msgType = ctx->msgType, .connInfo = ctx->ctrlConnInfo};
|
qwDbgSimulateRedirect(&qwMsg, ctx, &rsped);
|
||||||
qwDbgSimulateRedirect(&qwMsg, ctx, &rsped);
|
qwDbgSimulateDead(QW_FPARAMS(), ctx, &rsped);
|
||||||
qwDbgSimulateDead(QW_FPARAMS(), ctx, &rsped);
|
if (!rsped) {
|
||||||
if (!rsped) {
|
qwSendQueryRsp(QW_FPARAMS(), input->msgType + 1, ctx, code, false);
|
||||||
qwBuildAndSendQueryRsp(input->msgType + 1, &ctx->ctrlConnInfo, code, ctx);
|
|
||||||
QW_TASK_DLOG("query msg rsped, handle:%p, code:%x - %s", ctx->ctrlConnInfo.handle, code, tstrerror(code));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx->queryRsped = true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (ctx) {
|
if (ctx) {
|
||||||
|
@ -551,6 +575,7 @@ int32_t qwPreprocessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
QW_ERR_JRET(qwAcquireTaskCtx(QW_FPARAMS(), &ctx));
|
QW_ERR_JRET(qwAcquireTaskCtx(QW_FPARAMS(), &ctx));
|
||||||
|
|
||||||
ctx->ctrlConnInfo = qwMsg->connInfo;
|
ctx->ctrlConnInfo = qwMsg->connInfo;
|
||||||
|
ctx->phase = -1;
|
||||||
|
|
||||||
QW_ERR_JRET(qwAddTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_INIT));
|
QW_ERR_JRET(qwAddTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_INIT));
|
||||||
|
|
||||||
|
@ -604,6 +629,8 @@ int32_t qwProcessQuery(QW_FPARAMS_DEF, SQWMsg *qwMsg, char *sql) {
|
||||||
QW_ERR_JRET(TSDB_CODE_QRY_APP_ERROR);
|
QW_ERR_JRET(TSDB_CODE_QRY_APP_ERROR);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
qwSendQueryRsp(QW_FPARAMS(), qwMsg->msgType + 1, ctx, code, true);
|
||||||
|
|
||||||
ctx->level = plan->level;
|
ctx->level = plan->level;
|
||||||
atomic_store_ptr(&ctx->taskHandle, pTaskInfo);
|
atomic_store_ptr(&ctx->taskHandle, pTaskInfo);
|
||||||
atomic_store_ptr(&ctx->sinkHandle, sinkHandle);
|
atomic_store_ptr(&ctx->sinkHandle, sinkHandle);
|
||||||
|
@ -619,6 +646,31 @@ _return:
|
||||||
input.msgType = qwMsg->msgType;
|
input.msgType = qwMsg->msgType;
|
||||||
code = qwHandlePostPhaseEvents(QW_FPARAMS(), QW_PHASE_POST_QUERY, &input, NULL);
|
code = qwHandlePostPhaseEvents(QW_FPARAMS(), QW_PHASE_POST_QUERY, &input, NULL);
|
||||||
|
|
||||||
|
if (ctx != NULL && QW_EVENT_RECEIVED(ctx, QW_EVENT_FETCH)) {
|
||||||
|
void *rsp = NULL;
|
||||||
|
int32_t dataLen = 0;
|
||||||
|
SOutputData sOutput = {0};
|
||||||
|
QW_ERR_JRET(qwGetQueryResFromSink(QW_FPARAMS(), ctx, &dataLen, &rsp, &sOutput));
|
||||||
|
|
||||||
|
if (rsp) {
|
||||||
|
bool qComplete = (DS_BUF_EMPTY == sOutput.bufStatus && sOutput.queryEnd);
|
||||||
|
|
||||||
|
qwBuildFetchRsp(rsp, &sOutput, dataLen, qComplete);
|
||||||
|
if (qComplete) {
|
||||||
|
atomic_store_8((int8_t *)&ctx->queryEnd, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
qwMsg->connInfo = ctx->dataConnInfo;
|
||||||
|
QW_SET_EVENT_PROCESSED(ctx, QW_EVENT_FETCH);
|
||||||
|
|
||||||
|
qwBuildAndSendFetchRsp(ctx->fetchType, &qwMsg->connInfo, rsp, dataLen, code);
|
||||||
|
rsp = NULL;
|
||||||
|
|
||||||
|
QW_TASK_DLOG("fetch rsp send, handle:%p, code:%x - %s, dataLen:%d", qwMsg->connInfo.handle, code,
|
||||||
|
tstrerror(code), dataLen);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QW_RET(TSDB_CODE_SUCCESS);
|
QW_RET(TSDB_CODE_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -740,7 +792,9 @@ int32_t qwProcessFetch(QW_FPARAMS_DEF, SQWMsg *qwMsg) {
|
||||||
locked = true;
|
locked = true;
|
||||||
|
|
||||||
// RC WARNING
|
// RC WARNING
|
||||||
if (QW_QUERY_RUNNING(ctx)) {
|
if (-1 == ctx->phase || false == ctx->queryGotData) {
|
||||||
|
QW_TASK_DLOG_E("task query unfinished");
|
||||||
|
} else if (QW_QUERY_RUNNING(ctx)) {
|
||||||
atomic_store_8((int8_t *)&ctx->queryContinue, 1);
|
atomic_store_8((int8_t *)&ctx->queryContinue, 1);
|
||||||
} else if (0 == atomic_load_8((int8_t *)&ctx->queryInQueue)) {
|
} else if (0 == atomic_load_8((int8_t *)&ctx->queryInQueue)) {
|
||||||
qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_EXEC);
|
qwUpdateTaskStatus(QW_FPARAMS(), JOB_TASK_STATUS_EXEC);
|
||||||
|
|
|
@ -86,7 +86,7 @@ typedef struct SScalarCtx {
|
||||||
} \
|
} \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
int32_t doConvertDataType(SValueNode* pValueNode, SScalarParam* out, int32_t* overflow);
|
int32_t sclConvertValueToSclParam(SValueNode* pValueNode, SScalarParam* out, int32_t* overflow);
|
||||||
int32_t sclCreateColumnInfoData(SDataType* pType, int32_t numOfRows, SScalarParam* pParam);
|
int32_t sclCreateColumnInfoData(SDataType* pType, int32_t numOfRows, SScalarParam* pParam);
|
||||||
int32_t sclConvertToTsValueNode(int8_t precision, SValueNode* valueNode);
|
int32_t sclConvertToTsValueNode(int8_t precision, SValueNode* valueNode);
|
||||||
|
|
||||||
|
@ -95,6 +95,11 @@ int32_t sclConvertToTsValueNode(int8_t precision, SValueNode* valueNode);
|
||||||
#define GET_PARAM_PRECISON(_c) ((_c)->columnData->info.precision)
|
#define GET_PARAM_PRECISON(_c) ((_c)->columnData->info.precision)
|
||||||
|
|
||||||
void sclFreeParam(SScalarParam* param);
|
void sclFreeParam(SScalarParam* param);
|
||||||
|
void doVectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t startIndex, int32_t numOfRows,
|
||||||
|
int32_t _ord, int32_t optr);
|
||||||
|
void vectorCompareImpl(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t startIndex, int32_t numOfRows,
|
||||||
|
int32_t _ord, int32_t optr);
|
||||||
|
void vectorCompare(SScalarParam* pLeft, SScalarParam* pRight, SScalarParam *pOut, int32_t _ord, int32_t optr);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue