Merge branch '3.0' into feat/TS-3048
This commit is contained in:
commit
e8eadeb9f5
|
@ -15,7 +15,7 @@
|
||||||
[](https://coveralls.io/github/taosdata/TDengine?branch=develop)
|
[](https://coveralls.io/github/taosdata/TDengine?branch=develop)
|
||||||
[](https://bestpractices.coreinfrastructure.org/projects/4201)
|
[](https://bestpractices.coreinfrastructure.org/projects/4201)
|
||||||
|
|
||||||
简体中文 | [English](README.md) | 很多职位正在热招中,请看[这里](https://www.taosdata.com/cn/careers/)
|
简体中文 | [English](README.md) | [TDengine 云服务](https://cloud.taosdata.com/?utm_medium=cn&utm_source=github) | 很多职位正在热招中,请看[这里](https://www.taosdata.com/cn/careers/)
|
||||||
|
|
||||||
# TDengine 简介
|
# TDengine 简介
|
||||||
|
|
||||||
|
|
|
@ -123,8 +123,8 @@ ELSE ()
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -O3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
ELSE ()
|
ELSE ()
|
||||||
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
SET(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Werror -Werror=return-type -fPIC -g3 -gdwarf-2 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reserved-user-defined-literal -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -g3 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-reserved-user-defined-literal -g3 -Wno-literal-suffix -Werror=return-type -fPIC -gdwarf-2 -Wformat=2 -Wno-format-nonliteral -Wno-format-truncation -Wno-format-y2k")
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
# disable all assert
|
# disable all assert
|
||||||
|
|
|
@ -77,6 +77,12 @@ ELSEIF (TD_DARWIN_64)
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
ENDIF ()
|
ENDIF ()
|
||||||
|
|
||||||
|
option(
|
||||||
|
BUILD_GEOS
|
||||||
|
"If build geos on Windows"
|
||||||
|
ON
|
||||||
|
)
|
||||||
|
|
||||||
option(
|
option(
|
||||||
BUILD_SHARED_LIBS
|
BUILD_SHARED_LIBS
|
||||||
""
|
""
|
||||||
|
|
|
@ -57,8 +57,6 @@ IF (${CMAKE_SYSTEM_NAME} MATCHES "Linux" OR ${CMAKE_SYSTEM_NAME} MATCHES "Darwin
|
||||||
SET(TD_DARWIN TRUE)
|
SET(TD_DARWIN TRUE)
|
||||||
SET(OSTYPE "macOS")
|
SET(OSTYPE "macOS")
|
||||||
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare")
|
ADD_DEFINITIONS("-DDARWIN -Wno-tautological-pointer-compare")
|
||||||
INCLUDE_DIRECTORIES(/usr/local/include)
|
|
||||||
LINK_DIRECTORIES(/usr/local/lib)
|
|
||||||
|
|
||||||
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
|
IF (${CMAKE_SYSTEM_PROCESSOR} MATCHES "arm64")
|
||||||
MESSAGE("Current system arch is arm64")
|
MESSAGE("Current system arch is arm64")
|
||||||
|
|
|
@ -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 4378702
|
GIT_TAG 3.0
|
||||||
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
|
||||||
|
|
|
@ -231,11 +231,16 @@ if(${BUILD_WITH_ROCKSDB})
|
||||||
if(${TD_LINUX})
|
if(${TD_LINUX})
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=unused-function -Wno-errno=unused-private-field -Wno-error=unused-result")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=maybe-uninitialized -Wno-error=unused-but-set-variable -Wno-error=unused-variable -Wno-error=unused-function -Wno-errno=unused-private-field -Wno-error=unused-result")
|
||||||
endif(${TD_LINUX})
|
endif(${TD_LINUX})
|
||||||
|
MESSAGE(STATUS "CXXXX STATUS CONFIG: " ${CMAKE_CXX_FLAGS})
|
||||||
|
|
||||||
if(${TD_DARWIN})
|
if(${TD_DARWIN})
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=maybe-uninitialized")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wno-error=maybe-uninitialized")
|
||||||
endif(${TD_DARWIN})
|
endif(${TD_DARWIN})
|
||||||
|
|
||||||
|
if (${TD_DARWIN_ARM64})
|
||||||
|
set(HAS_ARMV8_CRC true)
|
||||||
|
endif(${TD_DARWIN_ARM64})
|
||||||
|
|
||||||
if (${TD_WINDOWS})
|
if (${TD_WINDOWS})
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4819")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /wd4244 /wd4819")
|
||||||
endif(${TD_WINDOWS})
|
endif(${TD_WINDOWS})
|
||||||
|
@ -248,7 +253,7 @@ if(${BUILD_WITH_ROCKSDB})
|
||||||
endif(${TD_DARWIN})
|
endif(${TD_DARWIN})
|
||||||
|
|
||||||
if(${TD_WINDOWS})
|
if(${TD_WINDOWS})
|
||||||
option(WITH_JNI "" ON)
|
option(WITH_JNI "" OFF)
|
||||||
endif(${TD_WINDOWS})
|
endif(${TD_WINDOWS})
|
||||||
|
|
||||||
if(${TD_WINDOWS})
|
if(${TD_WINDOWS})
|
||||||
|
@ -260,7 +265,7 @@ if(${BUILD_WITH_ROCKSDB})
|
||||||
option(WITH_FALLOCATE "" OFF)
|
option(WITH_FALLOCATE "" OFF)
|
||||||
option(WITH_JEMALLOC "" OFF)
|
option(WITH_JEMALLOC "" OFF)
|
||||||
option(WITH_GFLAGS "" OFF)
|
option(WITH_GFLAGS "" OFF)
|
||||||
option(PORTABLE "" ON)
|
option(PORTABLE "" OFF)
|
||||||
option(WITH_LIBURING "" OFF)
|
option(WITH_LIBURING "" OFF)
|
||||||
option(FAIL_ON_WARNINGS OFF)
|
option(FAIL_ON_WARNINGS OFF)
|
||||||
|
|
||||||
|
@ -268,8 +273,11 @@ if(${BUILD_WITH_ROCKSDB})
|
||||||
option(WITH_BENCHMARK_TOOLS "" OFF)
|
option(WITH_BENCHMARK_TOOLS "" OFF)
|
||||||
option(WITH_TOOLS "" OFF)
|
option(WITH_TOOLS "" OFF)
|
||||||
option(WITH_LIBURING "" OFF)
|
option(WITH_LIBURING "" OFF)
|
||||||
|
IF (TD_LINUX)
|
||||||
|
option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" ON)
|
||||||
|
ELSE()
|
||||||
option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" OFF)
|
option(ROCKSDB_BUILD_SHARED "Build shared versions of the RocksDB libraries" OFF)
|
||||||
|
ENDIF()
|
||||||
add_subdirectory(rocksdb EXCLUDE_FROM_ALL)
|
add_subdirectory(rocksdb EXCLUDE_FROM_ALL)
|
||||||
target_include_directories(
|
target_include_directories(
|
||||||
rocksdb
|
rocksdb
|
||||||
|
|
|
@ -45,7 +45,7 @@ In TDengine, the data types below can be used when specifying a column or tag.
|
||||||
:::note
|
:::note
|
||||||
|
|
||||||
- Only ASCII visible characters are suggested to be used in a column or tag of BINARY type. Multi-byte characters must be stored in NCHAR type.
|
- Only ASCII visible characters are suggested to be used in a column or tag of BINARY type. Multi-byte characters must be stored in NCHAR type.
|
||||||
- The length of BINARY can be up to 16,374 bytes. The string value must be quoted with single quotes. You must specify a length in bytes for a BINARY value, for example binary(20) for up to twenty single-byte characters. If the data exceeds the specified length, an error will occur. The literal single quote inside the string must be preceded with back slash like `\'`
|
- The length of BINARY can be up to 16,374(data column is 65,517 and tag column is 16,382 since version 3.0.5.0) bytes. The string value must be quoted with single quotes. You must specify a length in bytes for a BINARY value, for example binary(20) for up to twenty single-byte characters. If the data exceeds the specified length, an error will occur. The literal single quote inside the string must be preceded with back slash like `\'`
|
||||||
- Numeric values in SQL statements will be determined as integer or float type according to whether there is decimal point or whether scientific notation is used, so attention must be paid to avoid overflow. For example, 9999999999999999999 will be considered as overflow because it exceeds the upper limit of long integer, but 9999999999999999999.0 will be considered as a legal float number.
|
- Numeric values in SQL statements will be determined as integer or float type according to whether there is decimal point or whether scientific notation is used, so attention must be paid to avoid overflow. For example, 9999999999999999999 will be considered as overflow because it exceeds the upper limit of long integer, but 9999999999999999999.0 will be considered as a legal float number.
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
|
@ -45,7 +45,7 @@ table_option: {
|
||||||
|
|
||||||
1. The first column of a table MUST be of type TIMESTAMP. It is automatically set as the primary key.
|
1. The first column of a table MUST be of type TIMESTAMP. It is automatically set as the primary key.
|
||||||
2. The maximum length of the table name is 192 bytes.
|
2. The maximum length of the table name is 192 bytes.
|
||||||
3. The maximum length of each row is 48k bytes, please note that the extra 2 bytes used by each BINARY/NCHAR column are also counted.
|
3. The maximum length of each row is 48k(64k since version 3.0.5.0) bytes, please note that the extra 2 bytes used by each BINARY/NCHAR column are also counted.
|
||||||
4. The name of the subtable can only consist of characters from the English alphabet, digits and underscore. Table names can't start with a digit. Table names are case insensitive.
|
4. The name of the subtable can only consist of characters from the English alphabet, digits and underscore. Table names can't start with a digit. Table names are case insensitive.
|
||||||
5. The maximum length in bytes must be specified when using BINARY or NCHAR types.
|
5. The maximum length in bytes must be specified when using BINARY or NCHAR types.
|
||||||
6. Escape character "\`" can be used to avoid the conflict between table names and reserved keywords, above rules will be bypassed when using escape character on table names, but the upper limit for the name length is still valid. The table names specified using escape character are case sensitive.
|
6. Escape character "\`" can be used to avoid the conflict between table names and reserved keywords, above rules will be bypassed when using escape character on table names, but the upper limit for the name length is still valid. The table names specified using escape character are case sensitive.
|
||||||
|
|
|
@ -26,7 +26,7 @@ The following characters cannot occur in a password: single quotation marks ('),
|
||||||
|
|
||||||
- Maximum length of database name is 64 bytes
|
- Maximum length of database name is 64 bytes
|
||||||
- Maximum length of table name is 192 bytes, excluding the database name prefix and the separator.
|
- Maximum length of table name is 192 bytes, excluding the database name prefix and the separator.
|
||||||
- Maximum length of each data row is 48K bytes. Note that the upper limit includes the extra 2 bytes consumed by each column of BINARY/NCHAR type.
|
- Maximum length of each data row is 48K(64K since version 3.0.5.0) bytes. Note that the upper limit includes the extra 2 bytes consumed by each column of BINARY/NCHAR type.
|
||||||
- The maximum length of a column name is 64 bytes.
|
- The maximum length of a column name is 64 bytes.
|
||||||
- Maximum number of columns is 4096. There must be at least 2 columns, and the first column must be timestamp.
|
- Maximum number of columns is 4096. There must be at least 2 columns, and the first column must be timestamp.
|
||||||
- The maximum length of a tag name is 64 bytes
|
- The maximum length of a tag name is 64 bytes
|
||||||
|
|
|
@ -362,7 +362,7 @@ By using the optional req_id parameter, you can specify a request ID that can be
|
||||||
|
|
||||||
##### TaosConnection class
|
##### TaosConnection class
|
||||||
|
|
||||||
The `TaosConnection` class contains both an implementation of the PEP249 Connection interface (e.g., the `cursor()` method and the `close()` method) and many extensions (e.g., the `execute()`, `query()`, `schemaless_insert()`, and `subscribe()` methods).
|
As the way to connect introduced above but add `req_id` argument.
|
||||||
|
|
||||||
```python title="execute method"
|
```python title="execute method"
|
||||||
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:insert}}
|
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:insert}}
|
||||||
|
@ -372,13 +372,9 @@ The `TaosConnection` class contains both an implementation of the PEP249 Connect
|
||||||
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:query}}
|
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:query}}
|
||||||
```
|
```
|
||||||
|
|
||||||
:::tip
|
|
||||||
The queried results can only be fetched once. For example, only one of `fetch_all()` and `fetch_all_into_dict()` can be used in the example above. Repeated fetches will result in an empty list.
|
|
||||||
:::
|
|
||||||
|
|
||||||
##### Use of TaosResult class
|
##### Use of TaosResult class
|
||||||
|
|
||||||
In the above example of using the `TaosConnection` class, we have shown two ways to get the result of a query: `fetch_all()` and `fetch_all_into_dict()`. In addition, `TaosResult` also provides methods to iterate through the result set by rows (`rows_iter`) or by data blocks (`blocks_iter`). Using these two methods will be more efficient in scenarios where the query has a large amount of data.
|
As the way to fetch data introduced above but add `req_id` argument.
|
||||||
|
|
||||||
```python title="blocks_iter method"
|
```python title="blocks_iter method"
|
||||||
{{#include docs/examples/python/result_set_with_req_id_examples.py}}
|
{{#include docs/examples/python/result_set_with_req_id_examples.py}}
|
||||||
|
@ -391,17 +387,12 @@ The `TaosConnection` class and the `TaosResult` class already implement all the
|
||||||
{{#include docs/examples/python/cursor_usage_native_reference_with_req_id.py}}
|
{{#include docs/examples/python/cursor_usage_native_reference_with_req_id.py}}
|
||||||
```
|
```
|
||||||
|
|
||||||
:::note
|
|
||||||
The TaosCursor class uses native connections for write and query operations. In a client-side multi-threaded scenario, this cursor instance must remain thread exclusive and cannot be shared across threads for use, otherwise, it will result in errors in the returned results.
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="rest" label="REST connection">
|
<TabItem value="rest" label="REST connection">
|
||||||
|
|
||||||
##### Use of TaosRestCursor class
|
##### Use of TaosRestCursor class
|
||||||
|
|
||||||
The `TaosRestCursor` class is an implementation of the PEP249 Cursor interface.
|
As the way to connect introduced above but add `req_id` argument.
|
||||||
|
|
||||||
```python title="Use of TaosRestCursor"
|
```python title="Use of TaosRestCursor"
|
||||||
{{#include docs/examples/python/connect_rest_with_req_id_examples.py:basic}}
|
{{#include docs/examples/python/connect_rest_with_req_id_examples.py:basic}}
|
||||||
|
@ -421,8 +412,11 @@ The `RestClient` class is a direct wrapper for the [REST API](/reference/rest-ap
|
||||||
For a more detailed description of the `sql()` method, please refer to [RestClient](https://docs.taosdata.com/api/taospy/taosrest/restclient.html).
|
For a more detailed description of the `sql()` method, please refer to [RestClient](https://docs.taosdata.com/api/taospy/taosrest/restclient.html).
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem value="websocket" label="WebSocket connection">
|
<TabItem value="websocket" label="WebSocket connection">
|
||||||
|
|
||||||
|
As the way to connect introduced above but add `req_id` argument.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
{{#include docs/examples/python/connect_websocket_with_req_id_examples.py:basic}}
|
{{#include docs/examples/python/connect_websocket_with_req_id_examples.py:basic}}
|
||||||
```
|
```
|
||||||
|
|
|
@ -90,7 +90,7 @@ You can configure smlChildTableName in taos.cfg to specify table names, for exam
|
||||||
Note: TDengine 3.0.3.0 and later automatically detect whether order is consistent. This parameter is no longer used.
|
Note: TDengine 3.0.3.0 and later automatically detect whether order is consistent. This parameter is no longer used.
|
||||||
|
|
||||||
:::tip
|
:::tip
|
||||||
All processing logic of schemaless will still follow TDengine's underlying restrictions on data structures, such as the total length of each row of data cannot exceed 48 KB and the total length of a tag value cannot exceed 16 KB. See [TDengine SQL Boundary Limits](/taos-sql/limit) for specific constraints in this area.
|
All processing logic of schemaless will still follow TDengine's underlying restrictions on data structures, such as the total length of each row of data cannot exceed 48 KB(64 KB since version 3.0.5.0) and the total length of a tag value cannot exceed 16 KB. See [TDengine SQL Boundary Limits](/taos-sql/limit) for specific constraints in this area.
|
||||||
:::
|
:::
|
||||||
|
|
||||||
## Time resolution recognition
|
## Time resolution recognition
|
||||||
|
|
|
@ -65,6 +65,13 @@ taos = "*"
|
||||||
taos = { version = "*", default-features = false, features = ["ws"] }
|
taos = { version = "*", default-features = false, features = ["ws"] }
|
||||||
```
|
```
|
||||||
|
|
||||||
|
当仅启用 `ws` 特性时,可同时指定 `r2d2` 使得在同步(blocking/sync)模式下使用 [r2d2] 作为连接池:
|
||||||
|
|
||||||
|
```toml
|
||||||
|
[dependencies]
|
||||||
|
taos = { version = "*", default-features = false, features = ["r2d2", "ws"] }
|
||||||
|
```
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem value="native" label="仅原生连接">
|
<TabItem value="native" label="仅原生连接">
|
||||||
|
@ -257,26 +264,24 @@ let conn: Taos = cfg.build();
|
||||||
|
|
||||||
### 连接池
|
### 连接池
|
||||||
|
|
||||||
在复杂应用中,建议启用连接池。[taos] 的连接池使用 [r2d2] 实现。
|
在复杂应用中,建议启用连接池。[taos] 的连接池默认(异步模式)使用 [deadpool] 实现。
|
||||||
|
|
||||||
如下,可以生成一个默认参数的连接池。
|
如下,可以生成一个默认参数的连接池。
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
let pool = TaosBuilder::from_dsn(dsn)?.pool()?;
|
let pool: Pool<TaosBuilder> = TaosBuilder::from_dsn("taos:///")
|
||||||
|
.unwrap()
|
||||||
|
.pool()
|
||||||
|
.unwrap();
|
||||||
```
|
```
|
||||||
|
|
||||||
同样可以使用连接池的构造器,对连接池参数进行设置:
|
同样可以使用连接池的构造器,对连接池参数进行设置:
|
||||||
|
|
||||||
```rust
|
```rust
|
||||||
let dsn = "taos://localhost:6030";
|
let pool: Pool<TaosBuilder> = Pool::builder(Manager::from_dsn(self.dsn.clone()).unwrap().0)
|
||||||
|
.max_size(88) // 最大连接数
|
||||||
let opts = PoolBuilder::new()
|
.build()
|
||||||
.max_size(5000) // max connections
|
.unwrap();
|
||||||
.max_lifetime(Some(Duration::from_secs(60 * 60))) // lifetime of each connection
|
|
||||||
.min_idle(Some(1000)) // minimal idle connections
|
|
||||||
.connection_timeout(Duration::from_secs(2));
|
|
||||||
|
|
||||||
let pool = TaosBuilder::from_dsn(dsn)?.with_pool_builder(opts)?;
|
|
||||||
```
|
```
|
||||||
|
|
||||||
在应用代码中,使用 `pool.get()?` 来获取一个连接对象 [Taos]。
|
在应用代码中,使用 `pool.get()?` 来获取一个连接对象 [Taos]。
|
||||||
|
@ -516,6 +521,7 @@ consumer.unsubscribe().await;
|
||||||
其他相关结构体 API 使用说明请移步 Rust 文档托管网页:<https://docs.rs/taos>。
|
其他相关结构体 API 使用说明请移步 Rust 文档托管网页:<https://docs.rs/taos>。
|
||||||
|
|
||||||
[taos]: https://github.com/taosdata/rust-connector-taos
|
[taos]: https://github.com/taosdata/rust-connector-taos
|
||||||
|
[deadpool]: https://crates.io/crates/deadpool
|
||||||
[r2d2]: https://crates.io/crates/r2d2
|
[r2d2]: https://crates.io/crates/r2d2
|
||||||
[TaosBuilder]: https://docs.rs/taos/latest/taos/struct.TaosBuilder.html
|
[TaosBuilder]: https://docs.rs/taos/latest/taos/struct.TaosBuilder.html
|
||||||
[TaosCfg]: https://docs.rs/taos/latest/taos/struct.TaosCfg.html
|
[TaosCfg]: https://docs.rs/taos/latest/taos/struct.TaosCfg.html
|
||||||
|
|
|
@ -362,7 +362,7 @@ TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线
|
||||||
|
|
||||||
##### TaosConnection 类的使用
|
##### TaosConnection 类的使用
|
||||||
|
|
||||||
`TaosConnection` 类既包含对 PEP249 Connection 接口的实现(如:`cursor`方法和 `close` 方法),也包含很多扩展功能(如: `execute`、 `query`、`schemaless_insert` 和 `subscribe` 方法。
|
类似上文介绍的使用方法,增加 `req_id` 参数。
|
||||||
|
|
||||||
```python title="execute 方法"
|
```python title="execute 方法"
|
||||||
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:insert}}
|
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:insert}}
|
||||||
|
@ -372,13 +372,9 @@ TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线
|
||||||
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:query}}
|
{{#include docs/examples/python/connection_usage_native_reference_with_req_id.py:query}}
|
||||||
```
|
```
|
||||||
|
|
||||||
:::tip
|
|
||||||
查询结果只能获取一次。比如上面的示例中 `fetch_all()` 和 `fetch_all_into_dict()` 只能用一个。重复获取得到的结果为空列表。
|
|
||||||
:::
|
|
||||||
|
|
||||||
##### TaosResult 类的使用
|
##### TaosResult 类的使用
|
||||||
|
|
||||||
上面 `TaosConnection` 类的使用示例中,我们已经展示了两种获取查询结果的方法: `fetch_all()` 和 `fetch_all_into_dict()`。除此之外 `TaosResult` 还提供了按行迭代(`rows_iter`)或按数据块迭代(`blocks_iter`)结果集的方法。在查询数据量较大的场景,使用这两个方法会更高效。
|
类似上文介绍的使用方法,增加 `req_id` 参数。
|
||||||
|
|
||||||
```python title="blocks_iter 方法"
|
```python title="blocks_iter 方法"
|
||||||
{{#include docs/examples/python/result_set_with_req_id_examples.py}}
|
{{#include docs/examples/python/result_set_with_req_id_examples.py}}
|
||||||
|
@ -391,14 +387,11 @@ TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线
|
||||||
{{#include docs/examples/python/cursor_usage_native_reference_with_req_id.py}}
|
{{#include docs/examples/python/cursor_usage_native_reference_with_req_id.py}}
|
||||||
```
|
```
|
||||||
|
|
||||||
:::note
|
|
||||||
TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线程的场景下,这个游标实例必须保持线程独享,不能跨线程共享使用,否则会导致返回结果出现错误。
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
</TabItem>
|
</TabItem>
|
||||||
<TabItem value="rest" label="REST 连接">
|
<TabItem value="rest" label="REST 连接">
|
||||||
|
|
||||||
|
类似上文介绍的使用方法,增加 `req_id` 参数。
|
||||||
|
|
||||||
##### TaosRestCursor 类的使用
|
##### TaosRestCursor 类的使用
|
||||||
|
|
||||||
`TaosRestCursor` 类是对 PEP249 Cursor 接口的实现。
|
`TaosRestCursor` 类是对 PEP249 Cursor 接口的实现。
|
||||||
|
@ -420,8 +413,11 @@ TaosCursor 类使用原生连接进行写入、查询操作。在客户端多线
|
||||||
|
|
||||||
对于 `sql()` 方法更详细的介绍, 请参考 [RestClient](https://docs.taosdata.com/api/taospy/taosrest/restclient.html)。
|
对于 `sql()` 方法更详细的介绍, 请参考 [RestClient](https://docs.taosdata.com/api/taospy/taosrest/restclient.html)。
|
||||||
</TabItem>
|
</TabItem>
|
||||||
|
|
||||||
<TabItem value="websocket" label="WebSocket 连接">
|
<TabItem value="websocket" label="WebSocket 连接">
|
||||||
|
|
||||||
|
类似上文介绍的使用方法,增加 `req_id` 参数。
|
||||||
|
|
||||||
```python
|
```python
|
||||||
{{#include docs/examples/python/connect_websocket_with_req_id_examples.py:basic}}
|
{{#include docs/examples/python/connect_websocket_with_req_id_examples.py:basic}}
|
||||||
```
|
```
|
||||||
|
|
|
@ -45,9 +45,9 @@ CREATE DATABASE db_name PRECISION 'ns';
|
||||||
|
|
||||||
:::note
|
:::note
|
||||||
|
|
||||||
- 表的每行长度不能超过 48KB(注意:每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)。
|
- 表的每行长度不能超过 48KB(从 3.0.5.0 版本开始为 64KB)(注意:每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)。
|
||||||
- 虽然 BINARY 类型在底层存储上支持字节型的二进制字符,但不同编程语言对二进制数据的处理方式并不保证一致,因此建议在 BINARY 类型中只存储 ASCII 可见字符,而避免存储不可见字符。多字节的数据,例如中文字符,则需要使用 NCHAR 类型进行保存。如果强行使用 BINARY 类型保存中文字符,虽然有时也能正常读写,但并不带有字符集信息,很容易出现数据乱码甚至数据损坏等情况。
|
- 虽然 BINARY 类型在底层存储上支持字节型的二进制字符,但不同编程语言对二进制数据的处理方式并不保证一致,因此建议在 BINARY 类型中只存储 ASCII 可见字符,而避免存储不可见字符。多字节的数据,例如中文字符,则需要使用 NCHAR 类型进行保存。如果强行使用 BINARY 类型保存中文字符,虽然有时也能正常读写,但并不带有字符集信息,很容易出现数据乱码甚至数据损坏等情况。
|
||||||
- BINARY 类型理论上最长可以有 16,374 字节。BINARY 仅支持字符串输入,字符串两端需使用单引号引用。使用时须指定大小,如 BINARY(20) 定义了最长为 20 个单字节字符的字符串,每个字符占 1 字节的存储空间,总共固定占用 20 字节的空间,此时如果用户字符串超出 20 字节将会报错。对于字符串内的单引号,可以用转义字符反斜线加单引号来表示,即 `\'`。
|
- BINARY 类型理论上最长可以有 16,374(从 3.0.5.0 版本开始,数据列为 65,517,标签列为 16,382) 字节。BINARY 仅支持字符串输入,字符串两端需使用单引号引用。使用时须指定大小,如 BINARY(20) 定义了最长为 20 个单字节字符的字符串,每个字符占 1 字节的存储空间,总共固定占用 20 字节的空间,此时如果用户字符串超出 20 字节将会报错。对于字符串内的单引号,可以用转义字符反斜线加单引号来表示,即 `\'`。
|
||||||
- SQL 语句中的数值类型将依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型,因此在使用时要注意相应类型越界的情况。例如,9999999999999999999 会认为超过长整型的上边界而溢出,而 9999999999999999999.0 会被认为是有效的浮点数。
|
- SQL 语句中的数值类型将依据是否存在小数点,或使用科学计数法表示,来判断数值类型是否为整型或者浮点型,因此在使用时要注意相应类型越界的情况。例如,9999999999999999999 会认为超过长整型的上边界而溢出,而 9999999999999999999.0 会被认为是有效的浮点数。
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
|
@ -121,6 +121,8 @@ alter_database_option: {
|
||||||
| WAL_LEVEL value
|
| WAL_LEVEL value
|
||||||
| WAL_FSYNC_PERIOD value
|
| WAL_FSYNC_PERIOD value
|
||||||
| KEEP value
|
| KEEP value
|
||||||
|
| WAL_RETENTION_PERIOD value
|
||||||
|
| WAL_RETENTION_SIZE value
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
|
@ -43,7 +43,7 @@ table_option: {
|
||||||
|
|
||||||
1. 表的第一个字段必须是 TIMESTAMP,并且系统自动将其设为主键;
|
1. 表的第一个字段必须是 TIMESTAMP,并且系统自动将其设为主键;
|
||||||
2. 表名最大长度为 192;
|
2. 表名最大长度为 192;
|
||||||
3. 表的每行长度不能超过 48KB;(注意:每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
3. 表的每行长度不能超过 48KB(从 3.0.5.0 版本开始为 64KB);(注意:每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
||||||
4. 子表名只能由字母、数字和下划线组成,且不能以数字开头,不区分大小写
|
4. 子表名只能由字母、数字和下划线组成,且不能以数字开头,不区分大小写
|
||||||
5. 使用数据类型 binary 或 nchar,需指定其最长的字节数,如 binary(20),表示 20 字节;
|
5. 使用数据类型 binary 或 nchar,需指定其最长的字节数,如 binary(20),表示 20 字节;
|
||||||
6. 为了兼容支持更多形式的表名,TDengine 引入新的转义符 "\`",可以让表名与关键词不冲突,同时不受限于上述表名称合法性约束检查。但是同样具有长度限制要求。使用转义字符以后,不再对转义字符中的内容进行大小写统一。
|
6. 为了兼容支持更多形式的表名,TDengine 引入新的转义符 "\`",可以让表名与关键词不冲突,同时不受限于上述表名称合法性约束检查。但是同样具有长度限制要求。使用转义字符以后,不再对转义字符中的内容进行大小写统一。
|
||||||
|
|
|
@ -26,7 +26,7 @@ description: 合法字符集和命名中的限制规则
|
||||||
|
|
||||||
- 数据库名最大长度为 64 字节
|
- 数据库名最大长度为 64 字节
|
||||||
- 表名最大长度为 192 字节,不包括数据库名前缀和分隔符
|
- 表名最大长度为 192 字节,不包括数据库名前缀和分隔符
|
||||||
- 每行数据最大长度 48KB (注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
- 每行数据最大长度 48KB(从 3.0.5.0 版本开始为 64KB) (注意:数据行内每个 BINARY/NCHAR 类型的列还会额外占用 2 个字节的存储位置)
|
||||||
- 列名最大长度为 64 字节
|
- 列名最大长度为 64 字节
|
||||||
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
|
- 最多允许 4096 列,最少需要 2 列,第一列必须是时间戳。
|
||||||
- 标签名最大长度为 64 字节
|
- 标签名最大长度为 64 字节
|
||||||
|
|
|
@ -91,11 +91,30 @@ taos --dump-config
|
||||||
### maxShellConns
|
### maxShellConns
|
||||||
|
|
||||||
| 属性 | 说明 |
|
| 属性 | 说明 |
|
||||||
| -------- | ----------------------- |
|
| --------| ----------------------- |
|
||||||
| 适用范围 | 仅服务端适用 |
|
| 适用范围 | 仅服务端适用 |
|
||||||
| 含义 | 一个 dnode 容许的连接数 |
|
| 含义 | 一个 dnode 容许的连接数 |
|
||||||
| 取值范围 | 10-50000000 |
|
| 取值范围 | 10-50000000 |
|
||||||
| 缺省值 | 5000 |
|
| 缺省值 | 5000 |
|
||||||
|
|
||||||
|
### numOfRpcSessions
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| --------| ---------------------- |
|
||||||
|
| 适用范围 | 客户端和服务端都适用 |
|
||||||
|
| 含义 | 一个客户端能创建的最大连接数|
|
||||||
|
| 取值范围 | 100-100000 |
|
||||||
|
| 缺省值 | 10000 |
|
||||||
|
|
||||||
|
### timeToGetAvailableConn
|
||||||
|
|
||||||
|
| 属性 | 说明 |
|
||||||
|
| -------- | --------------------|
|
||||||
|
| 适用范围 | 客户端和服务端都适用 |
|
||||||
|
| 含义 |获得可用连接的最长等待时间|
|
||||||
|
| 取值范围 | 10-50000000(单位为毫秒)|
|
||||||
|
| 缺省值 | 500000 |
|
||||||
|
|
||||||
|
|
||||||
### numOfRpcSessions
|
### numOfRpcSessions
|
||||||
|
|
||||||
|
|
|
@ -87,7 +87,7 @@ st,t1=3,t2=4,t3=t3 c1=3i64,c3="passit",c2=false,c4=4f64 1626006833639000000
|
||||||
|
|
||||||
:::tip
|
:::tip
|
||||||
无模式所有的处理逻辑,仍会遵循 TDengine 对数据结构的底层限制,例如每行数据的总长度不能超过
|
无模式所有的处理逻辑,仍会遵循 TDengine 对数据结构的底层限制,例如每行数据的总长度不能超过
|
||||||
48KB,标签值的总长度不超过16KB。这方面的具体限制约束请参见 [TDengine SQL 边界限制](/taos-sql/limit)
|
48KB(从 3.0.5.0 版本开始为 64KB),标签值的总长度不超过16KB。这方面的具体限制约束请参见 [TDengine SQL 边界限制](/taos-sql/limit)
|
||||||
|
|
||||||
:::
|
:::
|
||||||
|
|
||||||
|
|
|
@ -247,10 +247,17 @@ launchctl limit maxfiles
|
||||||
该提示是创建 db 的 vnode 数量不够了,需要的 vnode 不能超过了 dnode 中 vnode 的上限。因为系统默认是一个 dnode 中有 CPU 核数两倍的 vnode,也可以通过配置文件中的参数 supportVnodes 控制。
|
该提示是创建 db 的 vnode 数量不够了,需要的 vnode 不能超过了 dnode 中 vnode 的上限。因为系统默认是一个 dnode 中有 CPU 核数两倍的 vnode,也可以通过配置文件中的参数 supportVnodes 控制。
|
||||||
正常调大 taos.cfg 中 supportVnodes 参数即可。
|
正常调大 taos.cfg 中 supportVnodes 参数即可。
|
||||||
|
|
||||||
### 21 【查询】在服务器上的使用 tao-CLI 能查到指定时间段的数据,但在客户端机器上查不到?
|
### 21 在服务器上的使用 taos-CLI 能查到指定时间段的数据,但在客户端机器上查不到?
|
||||||
这种情况是因为客户端与服务器上设置的时区不一致导致的,调整客户端与服务器的时区一致即可解决。
|
这种情况是因为客户端与服务器上设置的时区不一致导致的,调整客户端与服务器的时区一致即可解决。
|
||||||
|
|
||||||
### 22 【表名】表名确认是存在的,但写入或查询时报表不存在错误,非常奇怪,什么原因?
|
### 22 表名确认是存在的,但在写入或查询时返回表名不存在,什么原因?
|
||||||
TDengine 中的所有名称,包括数据库名、表名等都是区分大小写的,如果这些名称在程序或 taos-CLI 中没有使用反引号(`)括起来使用,即使你输入的是大写的,引擎也会转化成小写来使用,如果名称前后加上了反引号,引擎就不会再转化成小写,会保持原样来使用。
|
TDengine 中的所有名称,包括数据库名、表名等都是区分大小写的,如果这些名称在程序或 taos-CLI 中没有使用反引号(`)括起来使用,即使你输入的是大写的,引擎也会转化成小写来使用,如果名称前后加上了反引号,引擎就不会再转化成小写,会保持原样来使用。
|
||||||
|
|
||||||
|
### 23 在 taos-CLI 中查询,字段内容不能完全显示出来怎么办?
|
||||||
|
可以使用 \G 参数来竖式显示,如 show databases\G; (为了输入方便,在"\"后加 TAB 键,会自动补全后面的内容)
|
||||||
|
|
||||||
|
### 24 使用 taosBenchmark 测试工具写入数据查询很快,为什么我写入的数据查询非常慢?
|
||||||
|
TDengine 在写入数据时如果有很严重的乱序写入问题,会严重影响查询性能,所以需要在写入前解决乱序的问题。如果业务是从 kafka 消费写入,请合理设计消费者,尽可能的一个子表数据由一个消费者去消费并写入,避免由设计产生的乱序。
|
||||||
|
|
||||||
|
### 25 我想统计下前后两条写入记录之间的时间差值是多少?
|
||||||
|
使用 DIFF 函数,可以查看时间列或数值列前后两条记录的差值,非常方便,详细说明见 SQL手册->函数->DIFF
|
||||||
|
|
|
@ -145,7 +145,7 @@ int32_t tColDataCopy(SColData *pColDataFrom, SColData *pColData, xMallocFn xMall
|
||||||
extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull);
|
extern void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull);
|
||||||
|
|
||||||
// for stmt bind
|
// for stmt bind
|
||||||
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind);
|
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen);
|
||||||
void tColDataSortMerge(SArray *colDataArr);
|
void tColDataSortMerge(SArray *colDataArr);
|
||||||
|
|
||||||
// for raw block
|
// for raw block
|
||||||
|
|
|
@ -29,7 +29,6 @@ extern "C" {
|
||||||
#define SLOW_LOG_TYPE_OTHERS 0x4
|
#define SLOW_LOG_TYPE_OTHERS 0x4
|
||||||
#define SLOW_LOG_TYPE_ALL 0xFFFFFFFF
|
#define SLOW_LOG_TYPE_ALL 0xFFFFFFFF
|
||||||
|
|
||||||
|
|
||||||
// cluster
|
// cluster
|
||||||
extern char tsFirst[];
|
extern char tsFirst[];
|
||||||
extern char tsSecond[];
|
extern char tsSecond[];
|
||||||
|
@ -83,6 +82,7 @@ extern int64_t tsVndCommitMaxIntervalMs;
|
||||||
// mnode
|
// mnode
|
||||||
extern int64_t tsMndSdbWriteDelta;
|
extern int64_t tsMndSdbWriteDelta;
|
||||||
extern int64_t tsMndLogRetention;
|
extern int64_t tsMndLogRetention;
|
||||||
|
extern bool tsMndSkipGrant;
|
||||||
|
|
||||||
// monitor
|
// monitor
|
||||||
extern bool tsEnableMonitor;
|
extern bool tsEnableMonitor;
|
||||||
|
@ -131,7 +131,7 @@ extern int32_t tsSlowLogScope;
|
||||||
// client
|
// client
|
||||||
extern int32_t tsMinSlidingTime;
|
extern int32_t tsMinSlidingTime;
|
||||||
extern int32_t tsMinIntervalTime;
|
extern int32_t tsMinIntervalTime;
|
||||||
extern int32_t tsMaxMemUsedByInsert;
|
extern int32_t tsMaxInsertBatchRows;
|
||||||
|
|
||||||
// build info
|
// build info
|
||||||
extern char version[];
|
extern char version[];
|
||||||
|
@ -181,6 +181,7 @@ extern bool tsDisableStream;
|
||||||
extern int64_t tsStreamBufferSize;
|
extern int64_t tsStreamBufferSize;
|
||||||
extern int64_t tsCheckpointInterval;
|
extern int64_t tsCheckpointInterval;
|
||||||
extern bool tsFilterScalarMode;
|
extern bool tsFilterScalarMode;
|
||||||
|
extern int32_t tsMaxStreamBackendCache;
|
||||||
|
|
||||||
// #define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize)
|
// #define NEEDTO_COMPRESSS_MSG(size) (tsCompressMsgSize != -1 && (size) > tsCompressMsgSize)
|
||||||
|
|
||||||
|
|
|
@ -2009,10 +2009,8 @@ typedef struct {
|
||||||
int8_t withMeta;
|
int8_t withMeta;
|
||||||
char* sql;
|
char* sql;
|
||||||
char subDbName[TSDB_DB_FNAME_LEN];
|
char subDbName[TSDB_DB_FNAME_LEN];
|
||||||
union {
|
char* ast;
|
||||||
char* ast;
|
char subStbName[TSDB_TABLE_FNAME_LEN];
|
||||||
char subStbName[TSDB_TABLE_FNAME_LEN];
|
|
||||||
};
|
|
||||||
} SCMCreateTopicReq;
|
} SCMCreateTopicReq;
|
||||||
|
|
||||||
int32_t tSerializeSCMCreateTopicReq(void* buf, int32_t bufLen, const SCMCreateTopicReq* pReq);
|
int32_t tSerializeSCMCreateTopicReq(void* buf, int32_t bufLen, const SCMCreateTopicReq* pReq);
|
||||||
|
@ -2809,37 +2807,49 @@ typedef struct {
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
} SMqRebVgReq;
|
} SMqRebVgReq;
|
||||||
|
|
||||||
static FORCE_INLINE int32_t tEncodeSMqRebVgReq(void** buf, const SMqRebVgReq* pReq) {
|
static FORCE_INLINE int tEncodeSMqRebVgReq(SEncoder *pCoder, const SMqRebVgReq* pReq) {
|
||||||
int32_t tlen = 0;
|
if (tStartEncode(pCoder) < 0) return -1;
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->leftForVer);
|
if (tEncodeI64(pCoder, pReq->leftForVer) < 0) return -1;
|
||||||
tlen += taosEncodeFixedI32(buf, pReq->vgId);
|
if (tEncodeI32(pCoder, pReq->vgId) < 0) return -1;
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->oldConsumerId);
|
if (tEncodeI64(pCoder, pReq->oldConsumerId) < 0) return -1;
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->newConsumerId);
|
if (tEncodeI64(pCoder, pReq->newConsumerId) < 0) return -1;
|
||||||
tlen += taosEncodeString(buf, pReq->subKey);
|
if (tEncodeCStr(pCoder, pReq->subKey) < 0) return -1;
|
||||||
tlen += taosEncodeFixedI8(buf, pReq->subType);
|
if (tEncodeI8(pCoder, pReq->subType) < 0) return -1;
|
||||||
tlen += taosEncodeFixedI8(buf, pReq->withMeta);
|
if (tEncodeI8(pCoder, pReq->withMeta) < 0) return -1;
|
||||||
|
|
||||||
if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
tlen += taosEncodeString(buf, pReq->qmsg);
|
if (tEncodeCStr(pCoder, pReq->qmsg) < 0) return -1;
|
||||||
} else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
tlen += taosEncodeFixedI64(buf, pReq->suid);
|
if (tEncodeI64(pCoder, pReq->suid) < 0) return -1;
|
||||||
|
if (tEncodeCStr(pCoder, pReq->qmsg) < 0) return -1;
|
||||||
}
|
}
|
||||||
return tlen;
|
tEndEncode(pCoder);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static FORCE_INLINE void* tDecodeSMqRebVgReq(const void* buf, SMqRebVgReq* pReq) {
|
static FORCE_INLINE int tDecodeSMqRebVgReq(SDecoder *pCoder, SMqRebVgReq* pReq) {
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->leftForVer);
|
if (tStartDecode(pCoder) < 0) return -1;
|
||||||
buf = taosDecodeFixedI32(buf, &pReq->vgId);
|
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->oldConsumerId);
|
if (tDecodeI64(pCoder, &pReq->leftForVer) < 0) return -1;
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->newConsumerId);
|
|
||||||
buf = taosDecodeStringTo(buf, pReq->subKey);
|
if (tDecodeI32(pCoder, &pReq->vgId) < 0) return -1;
|
||||||
buf = taosDecodeFixedI8(buf, &pReq->subType);
|
if (tDecodeI64(pCoder, &pReq->oldConsumerId) < 0) return -1;
|
||||||
buf = taosDecodeFixedI8(buf, &pReq->withMeta);
|
if (tDecodeI64(pCoder, &pReq->newConsumerId) < 0) return -1;
|
||||||
|
if (tDecodeCStrTo(pCoder, pReq->subKey) < 0) return -1;
|
||||||
|
if (tDecodeI8(pCoder, &pReq->subType) < 0) return -1;
|
||||||
|
if (tDecodeI8(pCoder, &pReq->withMeta) < 0) return -1;
|
||||||
|
|
||||||
if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pReq->subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
buf = taosDecodeString(buf, &pReq->qmsg);
|
if (tDecodeCStr(pCoder, &pReq->qmsg) < 0) return -1;
|
||||||
} else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pReq->subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
buf = taosDecodeFixedI64(buf, &pReq->suid);
|
if (tDecodeI64(pCoder, &pReq->suid) < 0) return -1;
|
||||||
|
if (!tDecodeIsEnd(pCoder)){
|
||||||
|
if (tDecodeCStr(pCoder, &pReq->qmsg) < 0) return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return (void*)buf;
|
|
||||||
|
tEndDecode(pCoder);
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define TIME_IS_VAR_DURATION(_t) ((_t) == 'n' || (_t) == 'y' || (_t) == 'N' || (_t) == 'Y')
|
#define IS_CALENDAR_TIME_DURATION(_t) ((_t) == 'n' || (_t) == 'y' || (_t) == 'N' || (_t) == 'Y')
|
||||||
|
|
||||||
#define TIME_UNIT_NANOSECOND 'b'
|
#define TIME_UNIT_NANOSECOND 'b'
|
||||||
#define TIME_UNIT_MICROSECOND 'u'
|
#define TIME_UNIT_MICROSECOND 'u'
|
||||||
|
@ -74,7 +74,7 @@ static FORCE_INLINE int64_t taosGetTimestampToday(int32_t precision) {
|
||||||
|
|
||||||
int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision);
|
int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision);
|
||||||
|
|
||||||
int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precision);
|
int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval);
|
||||||
int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision);
|
int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char unit, int32_t precision);
|
||||||
|
|
||||||
int32_t parseAbsoluteDuration(const char* token, int32_t tokenlen, int64_t* ts, char* unit, int32_t timePrecision);
|
int32_t parseAbsoluteDuration(const char* token, int32_t tokenlen, int64_t* ts, char* unit, int32_t timePrecision);
|
||||||
|
|
|
@ -354,6 +354,7 @@
|
||||||
#define TK_WAL 336
|
#define TK_WAL 336
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#define TK_NK_SPACE 600
|
#define TK_NK_SPACE 600
|
||||||
#define TK_NK_COMMENT 601
|
#define TK_NK_COMMENT 601
|
||||||
#define TK_NK_ILLEGAL 602
|
#define TK_NK_ILLEGAL 602
|
||||||
|
|
|
@ -82,6 +82,8 @@ qTaskInfo_t qCreateStreamExecTaskInfo(void* msg, SReadHandle* readers, int32_t v
|
||||||
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols,
|
qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int32_t vgId, int32_t* numOfCols,
|
||||||
uint64_t id);
|
uint64_t id);
|
||||||
|
|
||||||
|
int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList, void* pTaskInfo);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* set the task Id, usually used by message queue process
|
* set the task Id, usually used by message queue process
|
||||||
* @param tinfo
|
* @param tinfo
|
||||||
|
@ -90,6 +92,8 @@ qTaskInfo_t qCreateQueueExecTaskInfo(void* msg, SReadHandle* pReaderHandle, int3
|
||||||
*/
|
*/
|
||||||
void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId);
|
void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId);
|
||||||
|
|
||||||
|
//void qSetTaskCode(qTaskInfo_t tinfo, int32_t code);
|
||||||
|
|
||||||
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo);
|
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
// todo refactor
|
// todo refactor
|
||||||
|
@ -186,7 +190,17 @@ int32_t qSerializeTaskStatus(qTaskInfo_t tinfo, char** pOutput, int32_t* len);
|
||||||
|
|
||||||
int32_t qDeserializeTaskStatus(qTaskInfo_t tinfo, const char* pInput, int32_t len);
|
int32_t qDeserializeTaskStatus(qTaskInfo_t tinfo, const char* pInput, int32_t len);
|
||||||
|
|
||||||
STimeWindow getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key);
|
void getNextTimeWindow(const SInterval* pInterval, STimeWindow* tw, int32_t order);
|
||||||
|
void getInitialStartTimeWindow(SInterval* pInterval, TSKEY ts, STimeWindow* w, bool ascQuery);
|
||||||
|
STimeWindow getAlignQueryTimeWindow(const SInterval* pInterval, int64_t key);
|
||||||
|
/**
|
||||||
|
* return the scan info, in the form of tuple of two items, including table uid and current timestamp
|
||||||
|
* @param tinfo
|
||||||
|
* @param uid
|
||||||
|
* @param ts
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
|
int32_t qGetStreamScanStatus(qTaskInfo_t tinfo, uint64_t* uid, int64_t* ts);
|
||||||
|
|
||||||
SArray* qGetQueriedTableListInfo(qTaskInfo_t tinfo);
|
SArray* qGetQueriedTableListInfo(qTaskInfo_t tinfo);
|
||||||
|
|
||||||
|
|
|
@ -16,13 +16,13 @@
|
||||||
#ifndef TDENGINE_STORAGEAPI_H
|
#ifndef TDENGINE_STORAGEAPI_H
|
||||||
#define TDENGINE_STORAGEAPI_H
|
#define TDENGINE_STORAGEAPI_H
|
||||||
|
|
||||||
#include "tsimplehash.h"
|
|
||||||
#include "tscalablebf.h"
|
|
||||||
#include "taosdef.h"
|
|
||||||
#include "tmsg.h"
|
|
||||||
#include "tcommon.h"
|
|
||||||
#include "index.h"
|
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
|
#include "index.h"
|
||||||
|
#include "taosdef.h"
|
||||||
|
#include "tcommon.h"
|
||||||
|
#include "tmsg.h"
|
||||||
|
#include "tscalablebf.h"
|
||||||
|
#include "tsimplehash.h"
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
@ -46,7 +46,7 @@ typedef struct SMetaEntry {
|
||||||
int8_t type;
|
int8_t type;
|
||||||
int8_t flags; // TODO: need refactor?
|
int8_t flags; // TODO: need refactor?
|
||||||
tb_uid_t uid;
|
tb_uid_t uid;
|
||||||
char * name;
|
char* name;
|
||||||
union {
|
union {
|
||||||
struct {
|
struct {
|
||||||
SSchemaWrapper schemaRow;
|
SSchemaWrapper schemaRow;
|
||||||
|
@ -57,43 +57,45 @@ typedef struct SMetaEntry {
|
||||||
int64_t ctime;
|
int64_t ctime;
|
||||||
int32_t ttlDays;
|
int32_t ttlDays;
|
||||||
int32_t commentLen;
|
int32_t commentLen;
|
||||||
char * comment;
|
char* comment;
|
||||||
tb_uid_t suid;
|
tb_uid_t suid;
|
||||||
uint8_t *pTags;
|
uint8_t* pTags;
|
||||||
} ctbEntry;
|
} ctbEntry;
|
||||||
struct {
|
struct {
|
||||||
int64_t ctime;
|
int64_t ctime;
|
||||||
int32_t ttlDays;
|
int32_t ttlDays;
|
||||||
int32_t commentLen;
|
int32_t commentLen;
|
||||||
char * comment;
|
char* comment;
|
||||||
int32_t ncid; // next column id
|
int32_t ncid; // next column id
|
||||||
SSchemaWrapper schemaRow;
|
SSchemaWrapper schemaRow;
|
||||||
} ntbEntry;
|
} ntbEntry;
|
||||||
struct {
|
struct {
|
||||||
STSma *tsma;
|
STSma* tsma;
|
||||||
} smaEntry;
|
} smaEntry;
|
||||||
};
|
};
|
||||||
|
|
||||||
uint8_t *pBuf;
|
uint8_t* pBuf;
|
||||||
} SMetaEntry;
|
} SMetaEntry;
|
||||||
|
|
||||||
typedef struct SMetaReader {
|
typedef struct SMetaReader {
|
||||||
int32_t flags;
|
int32_t flags;
|
||||||
void * pMeta;
|
void* pMeta;
|
||||||
SDecoder coder;
|
SDecoder coder;
|
||||||
SMetaEntry me;
|
SMetaEntry me;
|
||||||
void * pBuf;
|
void* pBuf;
|
||||||
int32_t szBuf;
|
int32_t szBuf;
|
||||||
struct SStoreMeta* pAPI;
|
struct SStoreMeta* pAPI;
|
||||||
} SMetaReader;
|
} SMetaReader;
|
||||||
|
|
||||||
typedef struct SMTbCursor {
|
typedef struct SMTbCursor {
|
||||||
void * pDbc;
|
void* pMeta;
|
||||||
void * pKey;
|
void* pDbc;
|
||||||
void * pVal;
|
void* pKey;
|
||||||
|
void* pVal;
|
||||||
int32_t kLen;
|
int32_t kLen;
|
||||||
int32_t vLen;
|
int32_t vLen;
|
||||||
SMetaReader mr;
|
SMetaReader mr;
|
||||||
|
int8_t paused;
|
||||||
} SMTbCursor;
|
} SMTbCursor;
|
||||||
|
|
||||||
typedef struct SRowBuffPos {
|
typedef struct SRowBuffPos {
|
||||||
|
@ -103,83 +105,26 @@ typedef struct SRowBuffPos {
|
||||||
bool beUsed;
|
bool beUsed;
|
||||||
} SRowBuffPos;
|
} SRowBuffPos;
|
||||||
|
|
||||||
// int32_t tsdbReuseCacherowsReader(void* pReader, void* pTableIdList, int32_t numOfTables);
|
|
||||||
// int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
|
||||||
// SArray *pCidList, int32_t *pSlotIds, uint64_t suid, void **pReader, const char *idstr);
|
|
||||||
// int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, const int32_t *dstSlotIds,
|
|
||||||
// SArray *pTableUids);
|
|
||||||
// void *tsdbCacherowsReaderClose(void *pReader);
|
|
||||||
// int32_t tsdbGetTableSchema(void *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid);
|
|
||||||
|
|
||||||
// int32_t tsdbReaderOpen(void *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
|
||||||
// SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr, bool countOnly, SHashObj** pIgnoreTables);
|
|
||||||
// int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
|
||||||
// void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
|
||||||
// void tsdbReaderClose(STsdbReader *pReader);
|
|
||||||
// int32_t tsdbNextDataBlock(STsdbReader *pReader, bool *hasNext);
|
|
||||||
// int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave);
|
|
||||||
// void tsdbReleaseDataBlock(STsdbReader *pReader);
|
|
||||||
// SSDataBlock *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
|
||||||
// int32_t tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond);
|
|
||||||
// int32_t tsdbGetFileBlocksDistInfo(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo);
|
|
||||||
// int64_t tsdbGetNumOfRowsInMemTable(STsdbReader *pHandle);
|
|
||||||
// void *tsdbGetIdx(void *pMeta);
|
|
||||||
// void *tsdbGetIvtIdx(void *pMeta);
|
|
||||||
// uint64_t tsdbGetReaderMaxVersion(STsdbReader *pReader);
|
|
||||||
// void tsdbReaderSetCloseFlag(STsdbReader *pReader);
|
|
||||||
// int64_t tsdbGetLastTimestamp(void* pVnode, void* pTableList, int32_t numOfTables, const char* pIdStr);
|
|
||||||
|
|
||||||
// int32_t vnodeGetCtbIdList(void *pVnode, int64_t suid, SArray *list);
|
|
||||||
// int32_t vnodeGetCtbIdListByFilter(void *pVnode, int64_t suid, SArray *list, bool (*filter)(void *arg), void *arg);
|
|
||||||
// int32_t vnodeGetStbIdList(void *pVnode, int64_t suid, SArray *list);
|
|
||||||
// void *vnodeGetIdx(void *pVnode);
|
|
||||||
// void *vnodeGetIvtIdx(void *pVnode);
|
|
||||||
|
|
||||||
// void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags);
|
|
||||||
// void metaReaderReleaseLock(SMetaReader *pReader);
|
|
||||||
// void metaReaderClear(SMetaReader *pReader);
|
|
||||||
// int32_t metaReaderGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
|
||||||
// int32_t metaReaderGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid);
|
|
||||||
// int metaGetTableEntryByName(SMetaReader *pReader, const char *name);
|
|
||||||
// int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList);
|
|
||||||
// int32_t metaGetTableTagsByUids(SMeta *pMeta, int64_t suid, SArray *uidList);
|
|
||||||
// const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal);
|
|
||||||
// int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName);
|
|
||||||
//
|
|
||||||
// int metaGetTableSzNameByUid(void *meta, uint64_t uid, char *tbName);
|
|
||||||
// int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid);
|
|
||||||
// int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
|
|
||||||
// bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid);
|
|
||||||
// int32_t metaGetCachedTableUidList(SMeta *pMeta, tb_uid_t suid, const uint8_t *key, int32_t keyLen, SArray *pList,
|
|
||||||
// bool *acquired);
|
|
||||||
// int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
|
||||||
// int32_t payloadLen, double selectivityRatio);
|
|
||||||
// int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
|
|
||||||
// tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
|
||||||
// int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList);
|
|
||||||
// int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
|
||||||
// int32_t payloadLen);
|
|
||||||
|
|
||||||
// tq
|
// tq
|
||||||
typedef struct SMetaTableInfo {
|
typedef struct SMetaTableInfo {
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
int64_t uid;
|
int64_t uid;
|
||||||
SSchemaWrapper *schema;
|
SSchemaWrapper* schema;
|
||||||
char tbName[TSDB_TABLE_NAME_LEN];
|
char tbName[TSDB_TABLE_NAME_LEN];
|
||||||
} SMetaTableInfo;
|
} SMetaTableInfo;
|
||||||
|
|
||||||
typedef struct SSnapContext {
|
typedef struct SSnapContext {
|
||||||
SMeta * pMeta; // todo remove it
|
SMeta* pMeta; // todo remove it
|
||||||
int64_t snapVersion;
|
int64_t snapVersion;
|
||||||
void * pCur;
|
void* pCur;
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
int8_t subType;
|
int8_t subType;
|
||||||
SHashObj * idVersion;
|
SHashObj* idVersion;
|
||||||
SHashObj * suidInfo;
|
SHashObj* suidInfo;
|
||||||
SArray * idList;
|
SArray* idList;
|
||||||
int32_t index;
|
int32_t index;
|
||||||
bool withMeta;
|
bool withMeta;
|
||||||
bool queryMeta; // true-get meta, false-get data
|
bool queryMeta; // true-get meta, false-get data
|
||||||
} SSnapContext;
|
} SSnapContext;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -196,69 +141,43 @@ typedef struct {
|
||||||
// int32_t tqReaderSeek(STqReader *pReader, int64_t ver, const char *id);
|
// int32_t tqReaderSeek(STqReader *pReader, int64_t ver, const char *id);
|
||||||
// bool tqNextBlockInWal(STqReader* pReader, const char* idstr);
|
// bool tqNextBlockInWal(STqReader* pReader, const char* idstr);
|
||||||
// bool tqNextBlockImpl(STqReader *pReader, const char* idstr);
|
// bool tqNextBlockImpl(STqReader *pReader, const char* idstr);
|
||||||
// int32_t getTableInfoFromSnapshot(SSnapContext *ctx, void **pBuf, int32_t *contLen, int16_t *type, int64_t *uid);
|
// int32_t getTableInfoFromSnapshot(SSnapContext *ctx, void **pBuf, int32_t *contLen, int16_t *type, int64_t
|
||||||
// SMetaTableInfo getMetaTableInfoFromSnapshot(SSnapContext *ctx);
|
// *uid); SMetaTableInfo getMetaTableInfoFromSnapshot(SSnapContext *ctx); int32_t setForSnapShot(SSnapContext
|
||||||
// int32_t setForSnapShot(SSnapContext *ctx, int64_t uid);
|
// *ctx, int64_t uid); int32_t destroySnapContext(SSnapContext *ctx);
|
||||||
// int32_t destroySnapContext(SSnapContext *ctx);
|
|
||||||
|
|
||||||
|
// clang-format off
|
||||||
/*-------------------------------------------------new api format---------------------------------------------------*/
|
/*-------------------------------------------------new api format---------------------------------------------------*/
|
||||||
|
|
||||||
// typedef int32_t (*__store_reader_(STsdbReader *pReader, const void *pTableList, int32_t num);
|
|
||||||
// typedef void (*tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
|
||||||
// typedef void (*tsdbReaderClose(STsdbReader *pReader);
|
|
||||||
// typedef int32_t (*tsdbNextDataBlock(STsdbReader *pReader, bool *hasNext);
|
|
||||||
// typedef int32_t (*tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave);
|
|
||||||
// typedef void (*tsdbReleaseDataBlock(STsdbReader *pReader);
|
|
||||||
// typedef SSDataBlock * (*tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
|
||||||
// typedef int32_t (*tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond);
|
|
||||||
// typedef int32_t (*tsdbGetFileBlocksDistInfo(STsdbReader *pReader, STableBlockDistInfo *pTableBlockInfo);
|
|
||||||
// typedef int64_t (*tsdbGetNumOfRowsInMemTable(STsdbReader *pHandle);
|
|
||||||
// typedef void * (*tsdbGetIdx(void *pMeta);
|
|
||||||
// typedef void * (*tsdbGetIvtIdx(void *pMeta);
|
|
||||||
// typedef uint64_t (*tsdbGetReaderMaxVersion(STsdbReader *pReader);
|
|
||||||
// typedef void (*tsdbReaderSetCloseFlag(STsdbReader *pReader);
|
|
||||||
// typedef int64_t (*tsdbGetLastTimestamp(void* pVnode, void* pTableList, int32_t numOfTables, const char* pIdStr);
|
|
||||||
|
|
||||||
typedef int32_t (*__store_reader_open_fn_t)(void *pVnode, SQueryTableDataCond *pCond, void *pTableList,
|
|
||||||
int32_t numOfTables, SSDataBlock *pResBlock, void **ppReader,
|
|
||||||
const char *idstr, bool countOnly, SHashObj **pIgnoreTables);
|
|
||||||
|
|
||||||
typedef struct TsdReader {
|
typedef struct TsdReader {
|
||||||
__store_reader_open_fn_t tsdReaderOpen;
|
int32_t (*tsdReaderOpen)(void* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
||||||
void (*tsdReaderClose)();
|
SSDataBlock* pResBlock, void** ppReader, const char* idstr, bool countOnly,
|
||||||
void (*tsdSetReaderTaskId)(void *pReader, const char *pId);
|
SHashObj** pIgnoreTables);
|
||||||
int32_t (*tsdSetQueryTableList)();
|
void (*tsdReaderClose)();
|
||||||
int32_t (*tsdNextDataBlock)();
|
void (*tsdSetReaderTaskId)(void *pReader, const char *pId);
|
||||||
|
int32_t (*tsdSetQueryTableList)();
|
||||||
|
int32_t (*tsdNextDataBlock)();
|
||||||
|
|
||||||
int32_t (*tsdReaderRetrieveBlockSMAInfo)();
|
int32_t (*tsdReaderRetrieveBlockSMAInfo)();
|
||||||
SSDataBlock *(*tsdReaderRetrieveDataBlock)();
|
SSDataBlock *(*tsdReaderRetrieveDataBlock)();
|
||||||
|
|
||||||
void (*tsdReaderReleaseDataBlock)();
|
void (*tsdReaderReleaseDataBlock)();
|
||||||
|
|
||||||
int32_t (*tsdReaderResetStatus)();
|
int32_t (*tsdReaderResetStatus)();
|
||||||
int32_t (*tsdReaderGetDataBlockDistInfo)();
|
int32_t (*tsdReaderGetDataBlockDistInfo)();
|
||||||
int64_t (*tsdReaderGetNumOfInMemRows)();
|
int64_t (*tsdReaderGetNumOfInMemRows)();
|
||||||
void (*tsdReaderNotifyClosing)();
|
void (*tsdReaderNotifyClosing)();
|
||||||
} TsdReader;
|
} TsdReader;
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* int32_t tsdbReuseCacherowsReader(void* pReader, void* pTableIdList, int32_t numOfTables);
|
|
||||||
int32_t tsdbCacherowsReaderOpen(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
|
||||||
SArray *pCidList, int32_t *pSlotIds, uint64_t suid, void **pReader, const char *idstr);
|
|
||||||
int32_t tsdbRetrieveCacheRows(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, const int32_t *dstSlotIds,
|
|
||||||
SArray *pTableUids);
|
|
||||||
void *tsdbCacherowsReaderClose(void *pReader);
|
|
||||||
*/
|
|
||||||
typedef struct SStoreCacheReader {
|
typedef struct SStoreCacheReader {
|
||||||
int32_t (*openReader)(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
int32_t (*openReader)(void *pVnode, int32_t type, void *pTableIdList, int32_t numOfTables, int32_t numOfCols,
|
||||||
SArray *pCidList, int32_t *pSlotIds, uint64_t suid, void **pReader, const char *idstr);
|
SArray *pCidList, int32_t *pSlotIds, uint64_t suid, void **pReader, const char *idstr);
|
||||||
void *(*closeReader)(void *pReader);
|
void *(*closeReader)(void *pReader);
|
||||||
int32_t (*retrieveRows)(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, const int32_t *dstSlotIds,
|
int32_t (*retrieveRows)(void *pReader, SSDataBlock *pResBlock, const int32_t *slotIds, const int32_t *dstSlotIds,
|
||||||
SArray *pTableUidList);
|
SArray *pTableUidList);
|
||||||
int32_t (*reuseReader)(void *pReader, void *pTableIdList, int32_t numOfTables);
|
int32_t (*reuseReader)(void *pReader, void *pTableIdList, int32_t numOfTables);
|
||||||
} SStoreCacheReader;
|
} SStoreCacheReader;
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
|
||||||
/*------------------------------------------------------------------------------------------------------------------*/
|
/*------------------------------------------------------------------------------------------------------------------*/
|
||||||
/*
|
/*
|
||||||
void tqReaderSetColIdList(STqReader *pReader, SArray *pColIdList);
|
void tqReaderSetColIdList(STqReader *pReader, SArray *pColIdList);
|
||||||
|
@ -301,24 +220,18 @@ typedef struct SStoreTqReader {
|
||||||
bool (*tqReaderIsQueriedTable)();
|
bool (*tqReaderIsQueriedTable)();
|
||||||
bool (*tqReaderCurrentBlockConsumed)();
|
bool (*tqReaderCurrentBlockConsumed)();
|
||||||
|
|
||||||
struct SWalReader *(*tqReaderGetWalReader)(); // todo remove it
|
struct SWalReader* (*tqReaderGetWalReader)(); // todo remove it
|
||||||
int32_t (*tqReaderRetrieveTaosXBlock)(); // todo remove it
|
int32_t (*tqReaderRetrieveTaosXBlock)(); // todo remove it
|
||||||
|
|
||||||
int32_t (*tqReaderSetSubmitMsg)(); // todo remove it
|
int32_t (*tqReaderSetSubmitMsg)(); // todo remove it
|
||||||
bool (*tqReaderNextBlockFilterOut)();
|
bool (*tqReaderNextBlockFilterOut)();
|
||||||
} SStoreTqReader;
|
} SStoreTqReader;
|
||||||
|
|
||||||
typedef struct SStoreSnapshotFn {
|
typedef struct SStoreSnapshotFn {
|
||||||
/*
|
int32_t (*createSnapshot)(SSnapContext* ctx, int64_t uid);
|
||||||
int32_t getTableInfoFromSnapshot(SSnapContext *ctx, void **pBuf, int32_t *contLen, int16_t *type, int64_t *uid);
|
int32_t (*destroySnapshot)(SSnapContext* ctx);
|
||||||
SMetaTableInfo getMetaTableInfoFromSnapshot(SSnapContext *ctx);
|
SMetaTableInfo (*getMetaTableInfoFromSnapshot)(SSnapContext* ctx);
|
||||||
int32_t setForSnapShot(SSnapContext *ctx, int64_t uid);
|
int32_t (*getTableInfoFromSnapshot)(SSnapContext* ctx, void** pBuf, int32_t* contLen, int16_t* type, int64_t* uid);
|
||||||
int32_t destroySnapContext(SSnapContext *ctx);
|
|
||||||
*/
|
|
||||||
int32_t (*createSnapshot)();
|
|
||||||
int32_t (*destroySnapshot)();
|
|
||||||
SMetaTableInfo (*getMetaTableInfoFromSnapshot)();
|
|
||||||
int32_t (*getTableInfoFromSnapshot)();
|
|
||||||
} SStoreSnapshotFn;
|
} SStoreSnapshotFn;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -327,12 +240,10 @@ void metaReaderReleaseLock(SMetaReader *pReader);
|
||||||
void metaReaderClear(SMetaReader *pReader);
|
void metaReaderClear(SMetaReader *pReader);
|
||||||
int32_t metaReaderGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
int32_t metaReaderGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
||||||
int32_t metaReaderGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid);
|
int32_t metaReaderGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid);
|
||||||
int metaGetTableEntryByName(SMetaReader *pReader, const char *name);
|
|
||||||
int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList);
|
int32_t metaGetTableTags(SMeta *pMeta, uint64_t suid, SArray *uidList);
|
||||||
const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal);
|
const void *metaGetTableTagVal(void *tag, int16_t type, STagVal *tagVal);
|
||||||
int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName);
|
int metaGetTableNameByUid(void *meta, uint64_t uid, char *tbName);
|
||||||
|
|
||||||
int metaGetTableSzNameByUid(void *meta, uint64_t uid, char *tbName);
|
|
||||||
int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid);
|
int metaGetTableUidByName(void *meta, char *tbName, uint64_t *uid);
|
||||||
int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
|
int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
|
||||||
bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid);
|
bool metaIsTableExist(SMeta *pMeta, tb_uid_t uid);
|
||||||
|
@ -340,55 +251,56 @@ int32_t metaGetCachedTableUidList(SMeta *pMeta, tb_uid_t suid, const uint8_t *k
|
||||||
bool *acquired);
|
bool *acquired);
|
||||||
int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
||||||
int32_t payloadLen, double selectivityRatio);
|
int32_t payloadLen, double selectivityRatio);
|
||||||
int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
|
|
||||||
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
||||||
int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList);
|
int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList);
|
||||||
int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload, int32_t
|
||||||
int32_t payloadLen);
|
payloadLen);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct SStoreMeta {
|
typedef struct SStoreMeta {
|
||||||
SMTbCursor *(*openTableMetaCursor)(void *pVnode); // metaOpenTbCursor
|
SMTbCursor* (*openTableMetaCursor)(void* pVnode); // metaOpenTbCursor
|
||||||
void (*closeTableMetaCursor)(SMTbCursor *pTbCur); // metaCloseTbCursor
|
void (*closeTableMetaCursor)(SMTbCursor* pTbCur); // metaCloseTbCursor
|
||||||
int32_t (*cursorNext)(); // metaTbCursorNext
|
void (*pauseTableMetaCursor)(SMTbCursor* pTbCur); // metaPauseTbCursor
|
||||||
int32_t (*cursorPrev)(); // metaTbCursorPrev
|
void (*resumeTableMetaCursor)(SMTbCursor* pTbCur, int8_t first); // metaResumeTbCursor
|
||||||
|
int32_t (*cursorNext)(SMTbCursor* pTbCur, ETableType jumpTableType); // metaTbCursorNext
|
||||||
|
int32_t (*cursorPrev)(SMTbCursor* pTbCur, ETableType jumpTableType); // metaTbCursorPrev
|
||||||
|
|
||||||
int32_t (*getTableTags)(void *pVnode, uint64_t suid, SArray *uidList);
|
int32_t (*getTableTags)(void* pVnode, uint64_t suid, SArray* uidList);
|
||||||
int32_t (*getTableTagsByUid)(void *pVnode, int64_t suid, SArray *uidList);
|
int32_t (*getTableTagsByUid)(void* pVnode, int64_t suid, SArray* uidList);
|
||||||
const void *(*extractTagVal)(const void *tag, int16_t type, STagVal *tagVal); // todo remove it
|
const void* (*extractTagVal)(const void* tag, int16_t type, STagVal* tagVal); // todo remove it
|
||||||
|
|
||||||
int32_t (*getTableUidByName)(void *pVnode, char *tbName, uint64_t *uid);
|
int32_t (*getTableUidByName)(void* pVnode, char* tbName, uint64_t* uid);
|
||||||
int32_t (*getTableTypeByName)(void *pVnode, char *tbName, ETableType *tbType);
|
int32_t (*getTableTypeByName)(void* pVnode, char* tbName, ETableType* tbType);
|
||||||
int32_t (*getTableNameByUid)(void *pVnode, uint64_t uid, char *tbName);
|
int32_t (*getTableNameByUid)(void* pVnode, uint64_t uid, char* tbName);
|
||||||
bool (*isTableExisted)(void *pVnode, tb_uid_t uid);
|
bool (*isTableExisted)(void* pVnode, tb_uid_t uid);
|
||||||
|
|
||||||
/**
|
int32_t (*metaGetCachedTbGroup)(void* pVnode, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList);
|
||||||
* int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
int32_t (*metaPutTbGroupToCache)(void* pVnode, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
int32_t payloadLen, double selectivityRatio);
|
int32_t payloadLen);
|
||||||
int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
|
|
||||||
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
|
||||||
int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList);
|
|
||||||
int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
|
||||||
int32_t payloadLen);
|
|
||||||
*/
|
|
||||||
void (*getCachedTableList)();
|
|
||||||
void (*putTableListIntoCache)();
|
|
||||||
|
|
||||||
/**
|
int32_t (*getCachedTableList)(void* pVnode, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray* pList1,
|
||||||
*
|
bool* acquireRes);
|
||||||
*/
|
int32_t (*putCachedTableList)(void* pVnode, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
void *(*storeGetIndexInfo)();
|
int32_t payloadLen, double selectivityRatio);
|
||||||
void *(*getInvertIndex)(void* pVnode);
|
|
||||||
int32_t (*getChildTableList)(void *pVnode, int64_t suid, SArray *list); // support filter and non-filter cases. [vnodeGetCtbIdList & vnodeGetCtbIdListByFilter]
|
|
||||||
int32_t (*storeGetTableList)(void* pVnode, int8_t type, SArray* pList); // vnodeGetStbIdList & vnodeGetAllTableList
|
|
||||||
void *storeGetVersionRange;
|
|
||||||
void *storeGetLastTimestamp;
|
|
||||||
|
|
||||||
int32_t (*getTableSchema)(void *pVnode, int64_t uid, STSchema **pSchema, int64_t *suid); // tsdbGetTableSchema
|
void* (*storeGetIndexInfo)();
|
||||||
|
void* (*getInvertIndex)(void* pVnode);
|
||||||
|
int32_t (*getChildTableList)(
|
||||||
|
void* pVnode, int64_t suid,
|
||||||
|
SArray* list); // support filter and non-filter cases. [vnodeGetCtbIdList & vnodeGetCtbIdListByFilter]
|
||||||
|
int32_t (*storeGetTableList)(void* pVnode, int8_t type, SArray* pList); // vnodeGetStbIdList & vnodeGetAllTableList
|
||||||
|
void* storeGetVersionRange;
|
||||||
|
void* storeGetLastTimestamp;
|
||||||
|
|
||||||
|
int32_t (*getTableSchema)(void* pVnode, int64_t uid, STSchema** pSchema, int64_t* suid); // tsdbGetTableSchema
|
||||||
|
|
||||||
// db name, vgId, numOfTables, numOfSTables
|
// db name, vgId, numOfTables, numOfSTables
|
||||||
int32_t (*getNumOfChildTables)(void* pVnode, int64_t uid, int64_t* numOfTables); // int32_t metaGetStbStats(SMeta *pMeta, int64_t uid, SMetaStbStats *pInfo);
|
int32_t (*getNumOfChildTables)(
|
||||||
void (*getBasicInfo)(void *pVnode, const char **dbname, int32_t *vgId, int64_t* numOfTables, int64_t* numOfNormalTables);// vnodeGetInfo(void *pVnode, const char **dbname, int32_t *vgId) & metaGetTbNum(SMeta *pMeta) & metaGetNtbNum(SMeta *pMeta);
|
void* pVnode, int64_t uid,
|
||||||
|
int64_t* numOfTables); // int32_t metaGetStbStats(SMeta *pMeta, int64_t uid, SMetaStbStats *pInfo);
|
||||||
|
void (*getBasicInfo)(void* pVnode, const char** dbname, int32_t* vgId, int64_t* numOfTables,
|
||||||
|
int64_t* numOfNormalTables); // vnodeGetInfo(void *pVnode, const char **dbname, int32_t *vgId) &
|
||||||
|
// metaGetTbNum(SMeta *pMeta) & metaGetNtbNum(SMeta *pMeta);
|
||||||
|
|
||||||
int64_t (*getNumOfRowsInMem)(void* pVnode);
|
int64_t (*getNumOfRowsInMem)(void* pVnode);
|
||||||
/**
|
/**
|
||||||
|
@ -399,24 +311,24 @@ int32_t vnodeGetStbIdList(void *pVnode, int64_t suid, SArray *list);
|
||||||
} SStoreMeta;
|
} SStoreMeta;
|
||||||
|
|
||||||
typedef struct SStoreMetaReader {
|
typedef struct SStoreMetaReader {
|
||||||
void (*initReader)(SMetaReader *pReader, void *pVnode, int32_t flags, SStoreMeta* pAPI);
|
void (*initReader)(SMetaReader* pReader, void* pVnode, int32_t flags, SStoreMeta* pAPI);
|
||||||
void (*clearReader)(SMetaReader *pReader);
|
void (*clearReader)(SMetaReader* pReader);
|
||||||
void (*readerReleaseLock)(SMetaReader *pReader);
|
void (*readerReleaseLock)(SMetaReader* pReader);
|
||||||
int32_t (*getTableEntryByUid)(SMetaReader *pReader, tb_uid_t uid);
|
int32_t (*getTableEntryByUid)(SMetaReader* pReader, tb_uid_t uid);
|
||||||
int32_t (*getTableEntryByName)(SMetaReader *pReader, const char *name);
|
int32_t (*getTableEntryByName)(SMetaReader* pReader, const char* name);
|
||||||
int32_t (*getEntryGetUidCache)(SMetaReader *pReader, tb_uid_t uid);
|
int32_t (*getEntryGetUidCache)(SMetaReader* pReader, tb_uid_t uid);
|
||||||
} SStoreMetaReader;
|
} SStoreMetaReader;
|
||||||
|
|
||||||
typedef struct SUpdateInfo {
|
typedef struct SUpdateInfo {
|
||||||
SArray *pTsBuckets;
|
SArray* pTsBuckets;
|
||||||
uint64_t numBuckets;
|
uint64_t numBuckets;
|
||||||
SArray *pTsSBFs;
|
SArray* pTsSBFs;
|
||||||
uint64_t numSBFs;
|
uint64_t numSBFs;
|
||||||
int64_t interval;
|
int64_t interval;
|
||||||
int64_t watermark;
|
int64_t watermark;
|
||||||
TSKEY minTS;
|
TSKEY minTS;
|
||||||
SScalableBf *pCloseWinSBF;
|
SScalableBf* pCloseWinSBF;
|
||||||
SHashObj *pMap;
|
SHashObj* pMap;
|
||||||
uint64_t maxDataVersion;
|
uint64_t maxDataVersion;
|
||||||
} SUpdateInfo;
|
} SUpdateInfo;
|
||||||
|
|
||||||
|
@ -435,15 +347,15 @@ typedef struct SStateStore {
|
||||||
|
|
||||||
int32_t (*streamStateAddIfNotExist)(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
|
int32_t (*streamStateAddIfNotExist)(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateReleaseBuf)(SStreamState* pState, const SWinKey* key, void* pVal);
|
int32_t (*streamStateReleaseBuf)(SStreamState* pState, const SWinKey* key, void* pVal);
|
||||||
void (*streamStateFreeVal)(void* val);
|
void (*streamStateFreeVal)(void* val);
|
||||||
|
|
||||||
int32_t (*streamStatePut)(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen);
|
int32_t (*streamStatePut)(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen);
|
||||||
int32_t (*streamStateGet)(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
|
int32_t (*streamStateGet)(SStreamState* pState, const SWinKey* key, void** pVal, int32_t* pVLen);
|
||||||
bool (*streamStateCheck)(SStreamState* pState, const SWinKey* key);
|
bool (*streamStateCheck)(SStreamState* pState, const SWinKey* key);
|
||||||
int32_t (*streamStateGetByPos)(SStreamState* pState, void* pos, void** pVal);
|
int32_t (*streamStateGetByPos)(SStreamState* pState, void* pos, void** pVal);
|
||||||
int32_t (*streamStateDel)(SStreamState* pState, const SWinKey* key);
|
int32_t (*streamStateDel)(SStreamState* pState, const SWinKey* key);
|
||||||
int32_t (*streamStateClear)(SStreamState* pState);
|
int32_t (*streamStateClear)(SStreamState* pState);
|
||||||
void (*streamStateSetNumber)(SStreamState* pState, int32_t number);
|
void (*streamStateSetNumber)(SStreamState* pState, int32_t number);
|
||||||
int32_t (*streamStateSaveInfo)(SStreamState* pState, void* pKey, int32_t keyLen, void* pVal, int32_t vLen);
|
int32_t (*streamStateSaveInfo)(SStreamState* pState, void* pKey, int32_t keyLen, void* pVal, int32_t vLen);
|
||||||
int32_t (*streamStateGetInfo)(SStreamState* pState, void* pKey, int32_t keyLen, void** pVal, int32_t* pLen);
|
int32_t (*streamStateGetInfo)(SStreamState* pState, void* pKey, int32_t keyLen, void** pVal, int32_t* pLen);
|
||||||
|
|
||||||
|
@ -454,36 +366,37 @@ typedef struct SStateStore {
|
||||||
int32_t (*streamStateCurNext)(SStreamState* pState, SStreamStateCur* pCur);
|
int32_t (*streamStateCurNext)(SStreamState* pState, SStreamStateCur* pCur);
|
||||||
int32_t (*streamStateCurPrev)(SStreamState* pState, SStreamStateCur* pCur);
|
int32_t (*streamStateCurPrev)(SStreamState* pState, SStreamStateCur* pCur);
|
||||||
|
|
||||||
SStreamStateCur* (*streamStateGetAndCheckCur)(SStreamState* pState, SWinKey* key);
|
SStreamStateCur* (*streamStateGetAndCheckCur)(SStreamState* pState, SWinKey* key);
|
||||||
SStreamStateCur* (*streamStateSeekKeyNext)(SStreamState* pState, const SWinKey* key);
|
SStreamStateCur* (*streamStateSeekKeyNext)(SStreamState* pState, const SWinKey* key);
|
||||||
SStreamStateCur* (*streamStateFillSeekKeyNext)(SStreamState* pState, const SWinKey* key);
|
SStreamStateCur* (*streamStateFillSeekKeyNext)(SStreamState* pState, const SWinKey* key);
|
||||||
SStreamStateCur* (*streamStateFillSeekKeyPrev)(SStreamState* pState, const SWinKey* key);
|
SStreamStateCur* (*streamStateFillSeekKeyPrev)(SStreamState* pState, const SWinKey* key);
|
||||||
void (*streamStateFreeCur)(SStreamStateCur* pCur);
|
void (*streamStateFreeCur)(SStreamStateCur* pCur);
|
||||||
|
|
||||||
int32_t (*streamStateGetGroupKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t (*streamStateGetGroupKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateGetKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
int32_t (*streamStateGetKVByCur)(SStreamStateCur* pCur, SWinKey* pKey, const void** pVal, int32_t* pVLen);
|
||||||
|
|
||||||
int32_t (*streamStateSessionAddIfNotExist)(SStreamState* pState, SSessionKey* key, TSKEY gap, void** pVal, int32_t* pVLen);
|
int32_t (*streamStateSessionAddIfNotExist)(SStreamState* pState, SSessionKey* key, TSKEY gap, void** pVal,
|
||||||
|
int32_t* pVLen);
|
||||||
int32_t (*streamStateSessionPut)(SStreamState* pState, const SSessionKey* key, const void* value, int32_t vLen);
|
int32_t (*streamStateSessionPut)(SStreamState* pState, const SSessionKey* key, const void* value, int32_t vLen);
|
||||||
int32_t (*streamStateSessionGet)(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen);
|
int32_t (*streamStateSessionGet)(SStreamState* pState, SSessionKey* key, void** pVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateSessionDel)(SStreamState* pState, const SSessionKey* key);
|
int32_t (*streamStateSessionDel)(SStreamState* pState, const SSessionKey* key);
|
||||||
int32_t (*streamStateSessionClear)(SStreamState* pState);
|
int32_t (*streamStateSessionClear)(SStreamState* pState);
|
||||||
int32_t (*streamStateSessionGetKVByCur)(SStreamStateCur* pCur, SSessionKey* pKey, void** pVal, int32_t* pVLen);
|
int32_t (*streamStateSessionGetKVByCur)(SStreamStateCur* pCur, SSessionKey* pKey, void** pVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateStateAddIfNotExist)(SStreamState* pState, SSessionKey* key, char* pKeyData, int32_t keyDataLen,
|
int32_t (*streamStateStateAddIfNotExist)(SStreamState* pState, SSessionKey* key, char* pKeyData, int32_t keyDataLen,
|
||||||
state_key_cmpr_fn fn, void** pVal, int32_t* pVLen);
|
state_key_cmpr_fn fn, void** pVal, int32_t* pVLen);
|
||||||
int32_t (*streamStateSessionGetKeyByRange)(SStreamState* pState, const SSessionKey* range, SSessionKey* curKey);
|
int32_t (*streamStateSessionGetKeyByRange)(SStreamState* pState, const SSessionKey* range, SSessionKey* curKey);
|
||||||
|
|
||||||
SUpdateInfo* (*updateInfoInit)(int64_t interval, int32_t precision, int64_t watermark);
|
SUpdateInfo* (*updateInfoInit)(int64_t interval, int32_t precision, int64_t watermark);
|
||||||
TSKEY (*updateInfoFillBlockData)(SUpdateInfo *pInfo, SSDataBlock *pBlock, int32_t primaryTsCol);
|
TSKEY (*updateInfoFillBlockData)(SUpdateInfo* pInfo, SSDataBlock* pBlock, int32_t primaryTsCol);
|
||||||
bool (*updateInfoIsUpdated)(SUpdateInfo *pInfo, uint64_t tableId, TSKEY ts);
|
bool (*updateInfoIsUpdated)(SUpdateInfo* pInfo, uint64_t tableId, TSKEY ts);
|
||||||
bool (*updateInfoIsTableInserted)(SUpdateInfo *pInfo, int64_t tbUid);
|
bool (*updateInfoIsTableInserted)(SUpdateInfo* pInfo, int64_t tbUid);
|
||||||
void (*updateInfoDestroy)(SUpdateInfo *pInfo);
|
void (*updateInfoDestroy)(SUpdateInfo* pInfo);
|
||||||
|
|
||||||
SUpdateInfo* (*updateInfoInitP)(SInterval *pInterval, int64_t watermark);
|
SUpdateInfo* (*updateInfoInitP)(SInterval* pInterval, int64_t watermark);
|
||||||
void (*updateInfoAddCloseWindowSBF)(SUpdateInfo *pInfo);
|
void (*updateInfoAddCloseWindowSBF)(SUpdateInfo* pInfo);
|
||||||
void (*updateInfoDestoryColseWinSBF)(SUpdateInfo *pInfo);
|
void (*updateInfoDestoryColseWinSBF)(SUpdateInfo* pInfo);
|
||||||
int32_t (*updateInfoSerialize)(void *buf, int32_t bufLen, const SUpdateInfo *pInfo);
|
int32_t (*updateInfoSerialize)(void* buf, int32_t bufLen, const SUpdateInfo* pInfo);
|
||||||
int32_t (*updateInfoDeserialize)(void *buf, int32_t bufLen, SUpdateInfo *pInfo);
|
int32_t (*updateInfoDeserialize)(void* buf, int32_t bufLen, SUpdateInfo* pInfo);
|
||||||
|
|
||||||
SStreamStateCur* (*streamStateSessionSeekKeyNext)(SStreamState* pState, const SSessionKey* key);
|
SStreamStateCur* (*streamStateSessionSeekKeyNext)(SStreamState* pState, const SSessionKey* key);
|
||||||
SStreamStateCur* (*streamStateSessionSeekKeyCurrentPrev)(SStreamState* pState, const SSessionKey* key);
|
SStreamStateCur* (*streamStateSessionSeekKeyCurrentPrev)(SStreamState* pState, const SSessionKey* key);
|
||||||
|
@ -497,11 +410,11 @@ typedef struct SStateStore {
|
||||||
bool (*needClearDiskBuff)(struct SStreamFileState* pFileState);
|
bool (*needClearDiskBuff)(struct SStreamFileState* pFileState);
|
||||||
|
|
||||||
SStreamState* (*streamStateOpen)(char* path, void* pTask, bool specPath, int32_t szPage, int32_t pages);
|
SStreamState* (*streamStateOpen)(char* path, void* pTask, bool specPath, int32_t szPage, int32_t pages);
|
||||||
void (*streamStateClose)(SStreamState* pState, bool remove);
|
void (*streamStateClose)(SStreamState* pState, bool remove);
|
||||||
int32_t (*streamStateBegin)(SStreamState* pState);
|
int32_t (*streamStateBegin)(SStreamState* pState);
|
||||||
int32_t (*streamStateCommit)(SStreamState* pState);
|
int32_t (*streamStateCommit)(SStreamState* pState);
|
||||||
void (*streamStateDestroy)(SStreamState* pState, bool remove);
|
void (*streamStateDestroy)(SStreamState* pState, bool remove);
|
||||||
int32_t (*streamStateDeleteCheckPoint)(SStreamState* pState, TSKEY mark);
|
int32_t (*streamStateDeleteCheckPoint)(SStreamState* pState, TSKEY mark);
|
||||||
} SStateStore;
|
} SStateStore;
|
||||||
|
|
||||||
typedef struct SStorageAPI {
|
typedef struct SStorageAPI {
|
||||||
|
|
|
@ -21,8 +21,8 @@ extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "tcommon.h"
|
#include "tcommon.h"
|
||||||
#include "tvariant.h"
|
|
||||||
#include "tsimplehash.h"
|
#include "tsimplehash.h"
|
||||||
|
#include "tvariant.h"
|
||||||
|
|
||||||
struct SqlFunctionCtx;
|
struct SqlFunctionCtx;
|
||||||
struct SResultRowEntryInfo;
|
struct SResultRowEntryInfo;
|
||||||
|
@ -77,7 +77,7 @@ enum {
|
||||||
enum {
|
enum {
|
||||||
MAIN_SCAN = 0x0u,
|
MAIN_SCAN = 0x0u,
|
||||||
REVERSE_SCAN = 0x1u, // todo remove it
|
REVERSE_SCAN = 0x1u, // todo remove it
|
||||||
PRE_SCAN = 0x2u, // pre-scan belongs to the main scan and occurs before main scan
|
PRE_SCAN = 0x2u, // pre-scan belongs to the main scan and occurs before main scan
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct SPoint1 {
|
typedef struct SPoint1 {
|
||||||
|
@ -130,43 +130,44 @@ typedef struct SSerializeDataHandle {
|
||||||
|
|
||||||
// incremental state storage
|
// incremental state storage
|
||||||
typedef struct STdbState {
|
typedef struct STdbState {
|
||||||
void* rocksdb;
|
void *rocksdb;
|
||||||
void** pHandle;
|
void **pHandle;
|
||||||
void* writeOpts;
|
void *writeOpts;
|
||||||
void* readOpts;
|
void *readOpts;
|
||||||
void** cfOpts;
|
void **cfOpts;
|
||||||
void* dbOpt;
|
void *dbOpt;
|
||||||
struct SStreamTask* pOwner;
|
struct SStreamTask *pOwner;
|
||||||
void* param;
|
void *param;
|
||||||
void* env;
|
void *env;
|
||||||
SListNode* pComparNode;
|
SListNode *pComparNode;
|
||||||
void* pBackendHandle;
|
void *pBackend;
|
||||||
char idstr[64];
|
char idstr[64];
|
||||||
void* compactFactory;
|
void *compactFactory;
|
||||||
|
TdThreadRwlock rwLock;
|
||||||
|
|
||||||
void* db;
|
void *db;
|
||||||
void* pStateDb;
|
void *pStateDb;
|
||||||
void* pFuncStateDb;
|
void *pFuncStateDb;
|
||||||
void* pFillStateDb; // todo refactor
|
void *pFillStateDb; // todo refactor
|
||||||
void* pSessionStateDb;
|
void *pSessionStateDb;
|
||||||
void* pParNameDb;
|
void *pParNameDb;
|
||||||
void* pParTagDb;
|
void *pParTagDb;
|
||||||
void* txn;
|
void *txn;
|
||||||
} STdbState;
|
} STdbState;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
STdbState* pTdbState;
|
STdbState *pTdbState;
|
||||||
struct SStreamFileState* pFileState;
|
struct SStreamFileState *pFileState;
|
||||||
int32_t number;
|
int32_t number;
|
||||||
SSHashObj* parNameMap;
|
SSHashObj *parNameMap;
|
||||||
int64_t checkPointId;
|
int64_t checkPointId;
|
||||||
int32_t taskId;
|
int32_t taskId;
|
||||||
int64_t streamId;
|
int64_t streamId;
|
||||||
} SStreamState;
|
} SStreamState;
|
||||||
|
|
||||||
typedef struct SFunctionStateStore {
|
typedef struct SFunctionStateStore {
|
||||||
int32_t (*streamStateFuncPut)(SStreamState* pState, const SWinKey* key, const void* value, int32_t vLen);
|
int32_t (*streamStateFuncPut)(SStreamState *pState, const SWinKey *key, const void *value, int32_t vLen);
|
||||||
int32_t (*streamStateFuncGet)(SStreamState* pState, const SWinKey* key, void** ppVal, int32_t* pVLen);
|
int32_t (*streamStateFuncGet)(SStreamState *pState, const SWinKey *key, void **ppVal, int32_t *pVLen);
|
||||||
} SFunctionStateStore;
|
} SFunctionStateStore;
|
||||||
|
|
||||||
// sql function runtime context
|
// sql function runtime context
|
||||||
|
@ -180,7 +181,7 @@ typedef struct SqlFunctionCtx {
|
||||||
int16_t functionId; // function id
|
int16_t functionId; // function id
|
||||||
char *pOutput; // final result output buffer, point to sdata->data
|
char *pOutput; // final result output buffer, point to sdata->data
|
||||||
// input parameter, e.g., top(k, 20), the number of results of top query is kept in param
|
// input parameter, e.g., top(k, 20), the number of results of top query is kept in param
|
||||||
SFunctParam *param;
|
SFunctParam *param;
|
||||||
// corresponding output buffer for timestamp of each result, e.g., diff/csum
|
// corresponding output buffer for timestamp of each result, e.g., diff/csum
|
||||||
SColumnInfoData *pTsOutput;
|
SColumnInfoData *pTsOutput;
|
||||||
int32_t numOfParams;
|
int32_t numOfParams;
|
||||||
|
|
|
@ -364,6 +364,7 @@ typedef struct SCreateTopicStmt {
|
||||||
bool ignoreExists;
|
bool ignoreExists;
|
||||||
bool withMeta;
|
bool withMeta;
|
||||||
SNode* pQuery;
|
SNode* pQuery;
|
||||||
|
SNode* pWhere;
|
||||||
} SCreateTopicStmt;
|
} SCreateTopicStmt;
|
||||||
|
|
||||||
typedef struct SDropTopicStmt {
|
typedef struct SDropTopicStmt {
|
||||||
|
|
|
@ -112,6 +112,7 @@ typedef struct SJoinLogicNode {
|
||||||
SNode* pOnConditions;
|
SNode* pOnConditions;
|
||||||
bool isSingleTableJoin;
|
bool isSingleTableJoin;
|
||||||
EOrder inputTsOrder;
|
EOrder inputTsOrder;
|
||||||
|
SNode* pColEqualOnConditions;
|
||||||
} SJoinLogicNode;
|
} SJoinLogicNode;
|
||||||
|
|
||||||
typedef struct SAggLogicNode {
|
typedef struct SAggLogicNode {
|
||||||
|
@ -406,6 +407,7 @@ typedef struct SSortMergeJoinPhysiNode {
|
||||||
SNode* pOnConditions;
|
SNode* pOnConditions;
|
||||||
SNodeList* pTargets;
|
SNodeList* pTargets;
|
||||||
EOrder inputTsOrder;
|
EOrder inputTsOrder;
|
||||||
|
SNode* pColEqualOnConditions;
|
||||||
} SSortMergeJoinPhysiNode;
|
} SSortMergeJoinPhysiNode;
|
||||||
|
|
||||||
typedef struct SAggPhysiNode {
|
typedef struct SAggPhysiNode {
|
||||||
|
@ -448,7 +450,7 @@ typedef struct SMergePhysiNode {
|
||||||
bool ignoreGroupId;
|
bool ignoreGroupId;
|
||||||
} SMergePhysiNode;
|
} SMergePhysiNode;
|
||||||
|
|
||||||
typedef struct SWinodwPhysiNode {
|
typedef struct SWindowPhysiNode {
|
||||||
SPhysiNode node;
|
SPhysiNode node;
|
||||||
SNodeList* pExprs; // these are expression list of parameter expression of function
|
SNodeList* pExprs; // these are expression list of parameter expression of function
|
||||||
SNodeList* pFuncs;
|
SNodeList* pFuncs;
|
||||||
|
@ -461,10 +463,10 @@ typedef struct SWinodwPhysiNode {
|
||||||
EOrder inputTsOrder;
|
EOrder inputTsOrder;
|
||||||
EOrder outputTsOrder;
|
EOrder outputTsOrder;
|
||||||
bool mergeDataBlock;
|
bool mergeDataBlock;
|
||||||
} SWinodwPhysiNode;
|
} SWindowPhysiNode;
|
||||||
|
|
||||||
typedef struct SIntervalPhysiNode {
|
typedef struct SIntervalPhysiNode {
|
||||||
SWinodwPhysiNode window;
|
SWindowPhysiNode window;
|
||||||
int64_t interval;
|
int64_t interval;
|
||||||
int64_t offset;
|
int64_t offset;
|
||||||
int64_t sliding;
|
int64_t sliding;
|
||||||
|
@ -497,7 +499,7 @@ typedef struct SMultiTableIntervalPhysiNode {
|
||||||
} SMultiTableIntervalPhysiNode;
|
} SMultiTableIntervalPhysiNode;
|
||||||
|
|
||||||
typedef struct SSessionWinodwPhysiNode {
|
typedef struct SSessionWinodwPhysiNode {
|
||||||
SWinodwPhysiNode window;
|
SWindowPhysiNode window;
|
||||||
int64_t gap;
|
int64_t gap;
|
||||||
} SSessionWinodwPhysiNode;
|
} SSessionWinodwPhysiNode;
|
||||||
|
|
||||||
|
@ -506,14 +508,14 @@ typedef SSessionWinodwPhysiNode SStreamSemiSessionWinodwPhysiNode;
|
||||||
typedef SSessionWinodwPhysiNode SStreamFinalSessionWinodwPhysiNode;
|
typedef SSessionWinodwPhysiNode SStreamFinalSessionWinodwPhysiNode;
|
||||||
|
|
||||||
typedef struct SStateWinodwPhysiNode {
|
typedef struct SStateWinodwPhysiNode {
|
||||||
SWinodwPhysiNode window;
|
SWindowPhysiNode window;
|
||||||
SNode* pStateKey;
|
SNode* pStateKey;
|
||||||
} SStateWinodwPhysiNode;
|
} SStateWinodwPhysiNode;
|
||||||
|
|
||||||
typedef SStateWinodwPhysiNode SStreamStateWinodwPhysiNode;
|
typedef SStateWinodwPhysiNode SStreamStateWinodwPhysiNode;
|
||||||
|
|
||||||
typedef struct SEventWinodwPhysiNode {
|
typedef struct SEventWinodwPhysiNode {
|
||||||
SWinodwPhysiNode window;
|
SWindowPhysiNode window;
|
||||||
SNode* pStartCond;
|
SNode* pStartCond;
|
||||||
SNode* pEndCond;
|
SNode* pEndCond;
|
||||||
} SEventWinodwPhysiNode;
|
} SEventWinodwPhysiNode;
|
||||||
|
|
|
@ -51,6 +51,12 @@ typedef enum {
|
||||||
TARGET_TYPE_OTHER,
|
TARGET_TYPE_OTHER,
|
||||||
} ETargetType;
|
} ETargetType;
|
||||||
|
|
||||||
|
typedef enum {
|
||||||
|
TCOL_TYPE_COLUMN = 1,
|
||||||
|
TCOL_TYPE_TAG,
|
||||||
|
TCOL_TYPE_NONE,
|
||||||
|
} ETableColumnType;
|
||||||
|
|
||||||
#define QUERY_POLICY_VNODE 1
|
#define QUERY_POLICY_VNODE 1
|
||||||
#define QUERY_POLICY_HYBRID 2
|
#define QUERY_POLICY_HYBRID 2
|
||||||
#define QUERY_POLICY_QNODE 3
|
#define QUERY_POLICY_QNODE 3
|
||||||
|
@ -253,6 +259,7 @@ void destroyQueryExecRes(SExecResult* pRes);
|
||||||
int32_t dataConverToStr(char* str, int type, void* buf, int32_t bufSize, int32_t* len);
|
int32_t dataConverToStr(char* str, int type, void* buf, int32_t bufSize, int32_t* len);
|
||||||
char* parseTagDatatoJson(void* p);
|
char* parseTagDatatoJson(void* p);
|
||||||
int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
|
int32_t cloneTableMeta(STableMeta* pSrc, STableMeta** pDst);
|
||||||
|
void getColumnTypeFromMeta(STableMeta* pMeta, char* pName, ETableColumnType* pType);
|
||||||
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
int32_t cloneDbVgInfo(SDBVgInfo* pSrc, SDBVgInfo** pDst);
|
||||||
int32_t cloneSVreateTbReq(SVCreateTbReq* pSrc, SVCreateTbReq** pDst);
|
int32_t cloneSVreateTbReq(SVCreateTbReq* pSrc, SVCreateTbReq** pDst);
|
||||||
void freeVgInfo(SDBVgInfo* vgInfo);
|
void freeVgInfo(SDBVgInfo* vgInfo);
|
||||||
|
|
|
@ -34,7 +34,24 @@ extern "C" {
|
||||||
// SListNode* streamBackendAddCompare(void* backend, void* arg);
|
// SListNode* streamBackendAddCompare(void* backend, void* arg);
|
||||||
// void streamBackendDelCompare(void* backend, void* arg);
|
// void streamBackendDelCompare(void* backend, void* arg);
|
||||||
|
|
||||||
//typedef struct STdbState {
|
// <<<<<<< HEAD
|
||||||
|
// typedef struct STdbState {
|
||||||
|
// rocksdb_t* rocksdb;
|
||||||
|
// rocksdb_column_family_handle_t** pHandle;
|
||||||
|
// rocksdb_writeoptions_t* writeOpts;
|
||||||
|
// rocksdb_readoptions_t* readOpts;
|
||||||
|
// rocksdb_options_t** cfOpts;
|
||||||
|
// rocksdb_options_t* dbOpt;
|
||||||
|
// struct SStreamTask* pOwner;
|
||||||
|
// void* param;
|
||||||
|
// void* env;
|
||||||
|
// SListNode* pComparNode;
|
||||||
|
// void* pBackend;
|
||||||
|
// char idstr[64];
|
||||||
|
// void* compactFactory;
|
||||||
|
// TdThreadRwlock rwLock;
|
||||||
|
// =======
|
||||||
|
// typedef struct STdbState {
|
||||||
// rocksdb_t* rocksdb;
|
// rocksdb_t* rocksdb;
|
||||||
// rocksdb_column_family_handle_t** pHandle;
|
// rocksdb_column_family_handle_t** pHandle;
|
||||||
// rocksdb_writeoptions_t* writeOpts;
|
// rocksdb_writeoptions_t* writeOpts;
|
||||||
|
@ -58,6 +75,7 @@ extern "C" {
|
||||||
// TTB* pParTagDb;
|
// TTB* pParTagDb;
|
||||||
// TXN* txn;
|
// TXN* txn;
|
||||||
//} STdbState;
|
//} STdbState;
|
||||||
|
//>>>>>>> enh/dev3.0
|
||||||
|
|
||||||
SStreamState* streamStateOpen(char* path, void* pTask, bool specPath, int32_t szPage, int32_t pages);
|
SStreamState* streamStateOpen(char* path, void* pTask, bool specPath, int32_t szPage, int32_t pages);
|
||||||
void streamStateClose(SStreamState* pState, bool remove);
|
void streamStateClose(SStreamState* pState, bool remove);
|
||||||
|
|
|
@ -78,11 +78,11 @@ enum {
|
||||||
TASK_TRIGGER_STATUS__ACTIVE,
|
TASK_TRIGGER_STATUS__ACTIVE,
|
||||||
};
|
};
|
||||||
|
|
||||||
enum {
|
typedef enum {
|
||||||
TASK_LEVEL__SOURCE = 1,
|
TASK_LEVEL__SOURCE = 1,
|
||||||
TASK_LEVEL__AGG,
|
TASK_LEVEL__AGG,
|
||||||
TASK_LEVEL__SINK,
|
TASK_LEVEL__SINK,
|
||||||
};
|
} ETASK_LEVEL;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
TASK_OUTPUT__FIXED_DISPATCH = 1,
|
TASK_OUTPUT__FIXED_DISPATCH = 1,
|
||||||
|
@ -206,7 +206,7 @@ static FORCE_INLINE void streamQueueProcessFail(SStreamQueue* queue) {
|
||||||
void* streamQueueNextItem(SStreamQueue* queue);
|
void* streamQueueNextItem(SStreamQueue* queue);
|
||||||
|
|
||||||
SStreamDataSubmit* streamDataSubmitNew(SPackedData* pData, int32_t type);
|
SStreamDataSubmit* streamDataSubmitNew(SPackedData* pData, int32_t type);
|
||||||
void streamDataSubmitDestroy(SStreamDataSubmit* pDataSubmit);
|
void streamDataSubmitDestroy(SStreamDataSubmit* pDataSubmit);
|
||||||
|
|
||||||
SStreamDataSubmit* streamSubmitBlockClone(SStreamDataSubmit* pSubmit);
|
SStreamDataSubmit* streamSubmitBlockClone(SStreamDataSubmit* pSubmit);
|
||||||
|
|
||||||
|
@ -284,13 +284,13 @@ struct SStreamTask {
|
||||||
int16_t dispatchMsgType;
|
int16_t dispatchMsgType;
|
||||||
SStreamStatus status;
|
SStreamStatus status;
|
||||||
int32_t selfChildId;
|
int32_t selfChildId;
|
||||||
int32_t nodeId;
|
int32_t nodeId; // vgroup id
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
SCheckpointInfo chkInfo;
|
SCheckpointInfo chkInfo;
|
||||||
STaskExec exec;
|
STaskExec exec;
|
||||||
|
int8_t fillHistory; // fill history
|
||||||
// fill history
|
int64_t ekey; // end ts key
|
||||||
int8_t fillHistory;
|
int64_t endVer; // end version
|
||||||
|
|
||||||
// children info
|
// children info
|
||||||
SArray* childEpInfo; // SArray<SStreamChildEpInfo*>
|
SArray* childEpInfo; // SArray<SStreamChildEpInfo*>
|
||||||
|
@ -346,12 +346,14 @@ typedef struct SStreamMeta {
|
||||||
void* streamBackend;
|
void* streamBackend;
|
||||||
int32_t streamBackendId;
|
int32_t streamBackendId;
|
||||||
int64_t streamBackendRid;
|
int64_t streamBackendRid;
|
||||||
|
SHashObj* pTaskBackendUnique;
|
||||||
} SStreamMeta;
|
} SStreamMeta;
|
||||||
|
|
||||||
int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo);
|
int32_t tEncodeStreamEpInfo(SEncoder* pEncoder, const SStreamChildEpInfo* pInfo);
|
||||||
int32_t tDecodeStreamEpInfo(SDecoder* pDecoder, SStreamChildEpInfo* pInfo);
|
int32_t tDecodeStreamEpInfo(SDecoder* pDecoder, SStreamChildEpInfo* pInfo);
|
||||||
|
|
||||||
SStreamTask* tNewStreamTask(int64_t streamId);
|
SStreamTask* tNewStreamTask(int64_t streamId, int8_t taskLevel, int8_t fillHistory, int64_t triggerParam,
|
||||||
|
SArray* pTaskList);
|
||||||
int32_t tEncodeStreamTask(SEncoder* pEncoder, const SStreamTask* pTask);
|
int32_t tEncodeStreamTask(SEncoder* pEncoder, const SStreamTask* pTask);
|
||||||
int32_t tDecodeStreamTask(SDecoder* pDecoder, SStreamTask* pTask);
|
int32_t tDecodeStreamTask(SDecoder* pDecoder, SStreamTask* pTask);
|
||||||
void tFreeStreamTask(SStreamTask* pTask);
|
void tFreeStreamTask(SStreamTask* pTask);
|
||||||
|
|
|
@ -212,7 +212,8 @@ int32_t walFetchHead(SWalReader *pRead, int64_t ver, SWalCkHead *pHead);
|
||||||
int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead);
|
int32_t walFetchBody(SWalReader *pRead, SWalCkHead **ppHead);
|
||||||
int32_t walSkipFetchBody(SWalReader *pRead, const SWalCkHead *pHead);
|
int32_t walSkipFetchBody(SWalReader *pRead, const SWalCkHead *pHead);
|
||||||
|
|
||||||
SWalRef *walRefFirstVer(SWal *, SWalRef *);
|
void walRefFirstVer(SWal *, SWalRef *);
|
||||||
|
void walRefLastVer(SWal *, SWalRef *);
|
||||||
SWalRef *walRefCommittedVer(SWal *);
|
SWalRef *walRefCommittedVer(SWal *);
|
||||||
|
|
||||||
SWalRef *walOpenRef(SWal *);
|
SWalRef *walOpenRef(SWal *);
|
||||||
|
|
|
@ -80,4 +80,5 @@ fi
|
||||||
|
|
||||||
# there can not libtaos.so*, otherwise ln -s error
|
# there can not libtaos.so*, otherwise ln -s error
|
||||||
${csudo}rm -f ${install_main_dir}/driver/libtaos.* || :
|
${csudo}rm -f ${install_main_dir}/driver/libtaos.* || :
|
||||||
|
[ -f ${install_main_dir}/driver/librocksdb.* ] && ${csudo}rm -f ${install_main_dir}/driver/librocksdb.* || :
|
||||||
[ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}rm -f ${install_main_dir}/driver/libtaosws.so || :
|
[ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}rm -f ${install_main_dir}/driver/libtaosws.so || :
|
||||||
|
|
|
@ -40,6 +40,7 @@ else
|
||||||
${csudo}rm -f ${inc_link_dir}/taosudf.h || :
|
${csudo}rm -f ${inc_link_dir}/taosudf.h || :
|
||||||
[ -f ${inc_link_dir}/taosws.h ] && ${csudo}rm -f ${inc_link_dir}/taosws.h || :
|
[ -f ${inc_link_dir}/taosws.h ] && ${csudo}rm -f ${inc_link_dir}/taosws.h || :
|
||||||
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
||||||
|
[ -f ${lib_link_dir}/librocksdb.* ] && ${csudo}rm -f ${lib_link_dir}/librocksdb.* || :
|
||||||
[ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || :
|
[ -f ${lib_link_dir}/libtaosws.so ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.so || :
|
||||||
|
|
||||||
${csudo}rm -f ${log_link_dir} || :
|
${csudo}rm -f ${log_link_dir} || :
|
||||||
|
|
|
@ -31,6 +31,7 @@ cd ${pkg_dir}
|
||||||
|
|
||||||
libfile="libtaos.so.${tdengine_ver}"
|
libfile="libtaos.so.${tdengine_ver}"
|
||||||
wslibfile="libtaosws.so"
|
wslibfile="libtaosws.so"
|
||||||
|
rocksdblib="librocksdb.so.8"
|
||||||
|
|
||||||
# create install dir
|
# create install dir
|
||||||
install_home_path="/usr/local/taos"
|
install_home_path="/usr/local/taos"
|
||||||
|
@ -94,6 +95,7 @@ fi
|
||||||
|
|
||||||
cp ${compile_dir}/build/bin/taos ${pkg_dir}${install_home_path}/bin
|
cp ${compile_dir}/build/bin/taos ${pkg_dir}${install_home_path}/bin
|
||||||
cp ${compile_dir}/build/lib/${libfile} ${pkg_dir}${install_home_path}/driver
|
cp ${compile_dir}/build/lib/${libfile} ${pkg_dir}${install_home_path}/driver
|
||||||
|
[ -f ${compile_dir}/build/lib/${rocksdblib} ] && cp ${compile_dir}/build/lib/${rocksdblib} ${pkg_dir}${install_home_path}/driver ||:
|
||||||
[ -f ${compile_dir}/build/lib/${wslibfile} ] && cp ${compile_dir}/build/lib/${wslibfile} ${pkg_dir}${install_home_path}/driver ||:
|
[ -f ${compile_dir}/build/lib/${wslibfile} ] && cp ${compile_dir}/build/lib/${wslibfile} ${pkg_dir}${install_home_path}/driver ||:
|
||||||
cp ${compile_dir}/../include/client/taos.h ${pkg_dir}${install_home_path}/include
|
cp ${compile_dir}/../include/client/taos.h ${pkg_dir}${install_home_path}/include
|
||||||
cp ${compile_dir}/../include/common/taosdef.h ${pkg_dir}${install_home_path}/include
|
cp ${compile_dir}/../include/common/taosdef.h ${pkg_dir}${install_home_path}/include
|
||||||
|
|
|
@ -45,6 +45,7 @@ echo buildroot: %{buildroot}
|
||||||
|
|
||||||
libfile="libtaos.so.%{_version}"
|
libfile="libtaos.so.%{_version}"
|
||||||
wslibfile="libtaosws.so"
|
wslibfile="libtaosws.so"
|
||||||
|
rocksdblib="librocksdb.so.8"
|
||||||
|
|
||||||
# create install path, and cp file
|
# create install path, and cp file
|
||||||
mkdir -p %{buildroot}%{homepath}/bin
|
mkdir -p %{buildroot}%{homepath}/bin
|
||||||
|
@ -92,6 +93,7 @@ if [ -f %{_compiledir}/build/bin/taosadapter ]; then
|
||||||
fi
|
fi
|
||||||
cp %{_compiledir}/build/lib/${libfile} %{buildroot}%{homepath}/driver
|
cp %{_compiledir}/build/lib/${libfile} %{buildroot}%{homepath}/driver
|
||||||
[ -f %{_compiledir}/build/lib/${wslibfile} ] && cp %{_compiledir}/build/lib/${wslibfile} %{buildroot}%{homepath}/driver ||:
|
[ -f %{_compiledir}/build/lib/${wslibfile} ] && cp %{_compiledir}/build/lib/${wslibfile} %{buildroot}%{homepath}/driver ||:
|
||||||
|
[ -f %{_compiledir}/build/lib/${rocksdblib} ] && cp %{_compiledir}/build/lib/${rocksdblib} %{buildroot}%{homepath}/driver ||:
|
||||||
cp %{_compiledir}/../include/client/taos.h %{buildroot}%{homepath}/include
|
cp %{_compiledir}/../include/client/taos.h %{buildroot}%{homepath}/include
|
||||||
cp %{_compiledir}/../include/common/taosdef.h %{buildroot}%{homepath}/include
|
cp %{_compiledir}/../include/common/taosdef.h %{buildroot}%{homepath}/include
|
||||||
cp %{_compiledir}/../include/util/taoserror.h %{buildroot}%{homepath}/include
|
cp %{_compiledir}/../include/util/taoserror.h %{buildroot}%{homepath}/include
|
||||||
|
@ -174,6 +176,7 @@ fi
|
||||||
|
|
||||||
# there can not libtaos.so*, otherwise ln -s error
|
# there can not libtaos.so*, otherwise ln -s error
|
||||||
${csudo}rm -f %{homepath}/driver/libtaos* || :
|
${csudo}rm -f %{homepath}/driver/libtaos* || :
|
||||||
|
${csudo}rm -f %{homepath}/driver/librocksdb* || :
|
||||||
|
|
||||||
#Scripts executed after installation
|
#Scripts executed after installation
|
||||||
%post
|
%post
|
||||||
|
@ -219,6 +222,7 @@ if [ $1 -eq 0 ];then
|
||||||
${csudo}rm -f ${inc_link_dir}/taoserror.h || :
|
${csudo}rm -f ${inc_link_dir}/taoserror.h || :
|
||||||
${csudo}rm -f ${inc_link_dir}/taosudf.h || :
|
${csudo}rm -f ${inc_link_dir}/taosudf.h || :
|
||||||
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
||||||
|
${csudo}rm -f ${lib_link_dir}/librocksdb.* || :
|
||||||
|
|
||||||
${csudo}rm -f ${log_link_dir} || :
|
${csudo}rm -f ${log_link_dir} || :
|
||||||
${csudo}rm -f ${data_link_dir} || :
|
${csudo}rm -f ${data_link_dir} || :
|
||||||
|
|
|
@ -250,18 +250,30 @@ function install_lib() {
|
||||||
# Remove links
|
# Remove links
|
||||||
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
${csudo}rm -f ${lib_link_dir}/libtaos.* || :
|
||||||
${csudo}rm -f ${lib64_link_dir}/libtaos.* || :
|
${csudo}rm -f ${lib64_link_dir}/libtaos.* || :
|
||||||
|
${csudo}rm -f ${lib_link_dir}/librocksdb.* || :
|
||||||
|
${csudo}rm -f ${lib64_link_dir}/librocksdb.* || :
|
||||||
#${csudo}rm -rf ${v15_java_app_dir} || :
|
#${csudo}rm -rf ${v15_java_app_dir} || :
|
||||||
${csudo}cp -rf ${script_dir}/driver/* ${install_main_dir}/driver && ${csudo}chmod 777 ${install_main_dir}/driver/*
|
${csudo}cp -rf ${script_dir}/driver/* ${install_main_dir}/driver && ${csudo}chmod 777 ${install_main_dir}/driver/*
|
||||||
|
|
||||||
${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.so.1
|
${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib_link_dir}/libtaos.so.1
|
||||||
${csudo}ln -sf ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so
|
${csudo}ln -sf ${lib_link_dir}/libtaos.so.1 ${lib_link_dir}/libtaos.so
|
||||||
|
|
||||||
|
${csudo}ln -sf ${install_main_dir}/driver/librocksdb.* ${lib_link_dir}/librocksdb.so.8
|
||||||
|
${csudo}ln -sf ${lib_link_dir}/librocksdb.so.8 ${lib_link_dir}/librocksdb.so
|
||||||
|
|
||||||
|
${csudo}ln -sf ${install_main_dir}/driver/librocksdb.* ${lib_link_dir}/librocksdb.so.8
|
||||||
|
${csudo}ln -sf ${lib_link_dir}/librocksdb.so.8 ${lib_link_dir}/librocksdb.so
|
||||||
|
|
||||||
|
|
||||||
[ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.so ${lib_link_dir}/libtaosws.so || :
|
[ -f ${install_main_dir}/driver/libtaosws.so ] && ${csudo}ln -sf ${install_main_dir}/driver/libtaosws.so ${lib_link_dir}/libtaosws.so || :
|
||||||
|
|
||||||
if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then
|
if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.so ]]; then
|
||||||
${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib64_link_dir}/libtaos.so.1 || :
|
${csudo}ln -sf ${install_main_dir}/driver/libtaos.* ${lib64_link_dir}/libtaos.so.1 || :
|
||||||
${csudo}ln -sf ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || :
|
${csudo}ln -sf ${lib64_link_dir}/libtaos.so.1 ${lib64_link_dir}/libtaos.so || :
|
||||||
|
|
||||||
|
${csudo}ln -sf ${install_main_dir}/driver/librocksdb.* ${lib64_link_dir}/librocksdb.so.8 || :
|
||||||
|
${csudo}ln -sf ${lib64_link_dir}/librocksdb.so.8 ${lib64_link_dir}/librocksdb.so || :
|
||||||
|
|
||||||
[ -f ${install_main_dir}/libtaosws.so ] && ${csudo}ln -sf ${install_main_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || :
|
[ -f ${install_main_dir}/libtaosws.so ] && ${csudo}ln -sf ${install_main_dir}/libtaosws.so ${lib64_link_dir}/libtaosws.so || :
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
|
@ -70,8 +70,7 @@ if [ "$pagMode" == "lite" ]; then
|
||||||
taostools_bin_files=""
|
taostools_bin_files=""
|
||||||
else
|
else
|
||||||
if [ "$verMode" == "cloud" ]; then
|
if [ "$verMode" == "cloud" ]; then
|
||||||
taostools_bin_files=" ${build_dir}/bin/taosdump \
|
taostools_bin_files=" ${build_dir}/bin/taosBenchmark"
|
||||||
${build_dir}/bin/taosBenchmark"
|
|
||||||
else
|
else
|
||||||
wget https://github.com/taosdata/grafanaplugin/releases/latest/download/TDinsight.sh -O ${build_dir}/bin/TDinsight.sh \
|
wget https://github.com/taosdata/grafanaplugin/releases/latest/download/TDinsight.sh -O ${build_dir}/bin/TDinsight.sh \
|
||||||
&& echo "TDinsight.sh downloaded!" \
|
&& echo "TDinsight.sh downloaded!" \
|
||||||
|
@ -112,9 +111,11 @@ fi
|
||||||
if [ "$osType" == "Darwin" ]; then
|
if [ "$osType" == "Darwin" ]; then
|
||||||
lib_files="${build_dir}/lib/libtaos.${version}.dylib"
|
lib_files="${build_dir}/lib/libtaos.${version}.dylib"
|
||||||
wslib_files="${build_dir}/lib/libtaosws.dylib"
|
wslib_files="${build_dir}/lib/libtaosws.dylib"
|
||||||
|
rocksdb_lib_files="${build_dir}/lib/librocksdb.dylib.8.1.1"
|
||||||
else
|
else
|
||||||
lib_files="${build_dir}/lib/libtaos.so.${version}"
|
lib_files="${build_dir}/lib/libtaos.so.${version}"
|
||||||
wslib_files="${build_dir}/lib/libtaosws.so"
|
wslib_files="${build_dir}/lib/libtaosws.so"
|
||||||
|
rocksdb_lib_files="${build_dir}/lib/librocksdb.so.8.1.1"
|
||||||
fi
|
fi
|
||||||
header_files="${code_dir}/include/client/taos.h ${code_dir}/include/common/taosdef.h ${code_dir}/include/util/taoserror.h ${code_dir}/include/libs/function/taosudf.h"
|
header_files="${code_dir}/include/client/taos.h ${code_dir}/include/common/taosdef.h ${code_dir}/include/util/taoserror.h ${code_dir}/include/libs/function/taosudf.h"
|
||||||
|
|
||||||
|
@ -337,6 +338,7 @@ fi
|
||||||
# Copy driver
|
# Copy driver
|
||||||
mkdir -p ${install_dir}/driver && cp ${lib_files} ${install_dir}/driver && echo "${versionComp}" >${install_dir}/driver/vercomp.txt
|
mkdir -p ${install_dir}/driver && cp ${lib_files} ${install_dir}/driver && echo "${versionComp}" >${install_dir}/driver/vercomp.txt
|
||||||
[ -f ${wslib_files} ] && cp ${wslib_files} ${install_dir}/driver || :
|
[ -f ${wslib_files} ] && cp ${wslib_files} ${install_dir}/driver || :
|
||||||
|
[ -f ${rocksdb_lib_files} ] && cp ${rocksdb_lib_files} ${install_dir}/driver || :
|
||||||
|
|
||||||
# Copy connector
|
# Copy connector
|
||||||
if [ "$verMode" == "cluster" ]; then
|
if [ "$verMode" == "cluster" ]; then
|
||||||
|
|
|
@ -202,10 +202,19 @@ function install_lib() {
|
||||||
log_print "start install lib from ${lib_dir} to ${lib_link_dir}"
|
log_print "start install lib from ${lib_dir} to ${lib_link_dir}"
|
||||||
${csudo}rm -f ${lib_link_dir}/libtaos* || :
|
${csudo}rm -f ${lib_link_dir}/libtaos* || :
|
||||||
${csudo}rm -f ${lib64_link_dir}/libtaos* || :
|
${csudo}rm -f ${lib64_link_dir}/libtaos* || :
|
||||||
|
|
||||||
|
#rocksdb
|
||||||
|
[ -f ${lib_link_dir}/librocksdb* ] && ${csudo}rm -f ${lib_link_dir}/librocksdb* || :
|
||||||
|
[ -f ${lib64_link_dir}/librocksdb* ] && ${csudo}rm -f ${lib64_link_dir}/librocksdb* || :
|
||||||
|
|
||||||
|
#rocksdb
|
||||||
|
[ -f ${lib_link_dir}/librocksdb* ] && ${csudo}rm -f ${lib_link_dir}/librocksdb* || :
|
||||||
|
[ -f ${lib64_link_dir}/librocksdb* ] && ${csudo}rm -f ${lib64_link_dir}/librocksdb* || :
|
||||||
|
|
||||||
[ -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}/librocksdb.* ${lib_link_dir}/librocksdb.${lib_file_ext_1} 2>>${install_log_path} || return 1
|
||||||
${csudo}ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.${lib_file_ext_1} 2>>${install_log_path} || return 1
|
${csudo}ln -s ${lib_dir}/libtaos.* ${lib_link_dir}/libtaos.${lib_file_ext_1} 2>>${install_log_path} || return 1
|
||||||
${csudo}ln -s ${lib_link_dir}/libtaos.${lib_file_ext_1} ${lib_link_dir}/libtaos.${lib_file_ext} 2>>${install_log_path} || return 1
|
${csudo}ln -s ${lib_link_dir}/libtaos.${lib_file_ext_1} ${lib_link_dir}/libtaos.${lib_file_ext} 2>>${install_log_path} || return 1
|
||||||
|
|
||||||
|
@ -214,6 +223,7 @@ function install_lib() {
|
||||||
if [[ -d ${lib64_link_dir} && ! -e ${lib64_link_dir}/libtaos.${lib_file_ext} ]]; 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.${lib_file_ext_1} 2>>${install_log_path} || return 1
|
${csudo}ln -s ${lib_dir}/libtaos.* ${lib64_link_dir}/libtaos.${lib_file_ext_1} 2>>${install_log_path} || return 1
|
||||||
${csudo}ln -s ${lib64_link_dir}/libtaos.${lib_file_ext_1} ${lib64_link_dir}/libtaos.${lib_file_ext} 2>>${install_log_path} || return 1
|
${csudo}ln -s ${lib64_link_dir}/libtaos.${lib_file_ext_1} ${lib64_link_dir}/libtaos.${lib_file_ext} 2>>${install_log_path} || return 1
|
||||||
|
${csudo}ln -s ${lib_dir}/librocksdb.* ${lib64_link_dir}/librocksdb.${lib_file_ext_1} 2>>${install_log_path} || return 1
|
||||||
|
|
||||||
[ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib64_link_dir}/libtaosws.${lib_file_ext} 2>>${install_log_path}
|
[ -f ${lib_dir}/libtaosws.${lib_file_ext} ] && ${csudo}ln -sf ${lib_dir}/libtaosws.${lib_file_ext} ${lib64_link_dir}/libtaosws.${lib_file_ext} 2>>${install_log_path}
|
||||||
fi
|
fi
|
||||||
|
|
|
@ -142,11 +142,14 @@ 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.* || :
|
||||||
|
${csudo}rm -f ${lib_link_dir}/librocksdb.* || :
|
||||||
[ -f ${lib_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib_link_dir}/libtaosws.* || :
|
[ -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.* || :
|
||||||
|
${csudo}rm -f ${lib64_link_dir}/librocksdb.* || :
|
||||||
[ -f ${lib64_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.* || :
|
[ -f ${lib64_link_dir}/libtaosws.* ] && ${csudo}rm -f ${lib64_link_dir}/libtaosws.* || :
|
||||||
#${csudo}rm -rf ${v15_java_app_dir} || :
|
#${csudo}rm -rf ${v15_java_app_dir} || :
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function clean_header() {
|
function clean_header() {
|
||||||
|
|
|
@ -158,6 +158,13 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetVgroupId(JN
|
||||||
*/
|
*/
|
||||||
JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetTableName(JNIEnv *, jobject, jlong);
|
JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetTableName(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Class: com_taosdata_jdbc_tmq_TMQConnector
|
||||||
|
* Method: tmqGetOffset
|
||||||
|
* Signature: (J)Ljava/lang/String;
|
||||||
|
*/
|
||||||
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetOffset(JNIEnv *, jobject, jlong);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Class: com_taosdata_jdbc_tmq_TMQConnector
|
* Class: com_taosdata_jdbc_tmq_TMQConnector
|
||||||
* Method: fetchBlockImp
|
* Method: fetchBlockImp
|
||||||
|
@ -166,6 +173,12 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetTableNam
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(JNIEnv *, jobject, jlong, jlong,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(JNIEnv *, jobject, jlong, jlong,
|
||||||
jobject, jobject);
|
jobject, jobject);
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqSeekImp(JNIEnv *, jobject, jlong, jstring, jint,
|
||||||
|
jlong);
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetTopicAssignmentImp(JNIEnv *, jobject, jlong,
|
||||||
|
jstring, jobject);
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -89,6 +89,7 @@ struct tmq_t {
|
||||||
void* commitCbUserParam;
|
void* commitCbUserParam;
|
||||||
|
|
||||||
// status
|
// status
|
||||||
|
SRWLatch lock;
|
||||||
int8_t status;
|
int8_t status;
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -148,10 +149,10 @@ typedef struct {
|
||||||
SVgOffsetInfo offsetInfo;
|
SVgOffsetInfo offsetInfo;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
int32_t vgStatus;
|
int32_t vgStatus;
|
||||||
int32_t vgSkipCnt; // here used to mark the slow vgroups
|
int32_t vgSkipCnt; // here used to mark the slow vgroups
|
||||||
bool receivedInfoFromVnode;// has already received info from vnode
|
bool receivedInfoFromVnode; // has already received info from vnode
|
||||||
int64_t emptyBlockReceiveTs; // once empty block is received, idle for ignoreCnt then start to poll data
|
int64_t emptyBlockReceiveTs; // once empty block is received, idle for ignoreCnt then start to poll data
|
||||||
bool seekUpdated; // offset is updated by seek operator, therefore, not update by vnode rsp.
|
bool seekUpdated; // offset is updated by seek operator, therefore, not update by vnode rsp.
|
||||||
SEpSet epSet;
|
SEpSet epSet;
|
||||||
} SMqClientVg;
|
} SMqClientVg;
|
||||||
|
|
||||||
|
@ -166,6 +167,7 @@ typedef struct {
|
||||||
int8_t tmqRspType;
|
int8_t tmqRspType;
|
||||||
int32_t epoch; // epoch can be used to guard the vgHandle
|
int32_t epoch; // epoch can be used to guard the vgHandle
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
|
char topicName[TSDB_TOPIC_FNAME_LEN];
|
||||||
SMqClientVg* vgHandle;
|
SMqClientVg* vgHandle;
|
||||||
SMqClientTopic* topicHandle;
|
SMqClientTopic* topicHandle;
|
||||||
uint64_t reqId;
|
uint64_t reqId;
|
||||||
|
@ -178,8 +180,8 @@ typedef struct {
|
||||||
} SMqPollRspWrapper;
|
} SMqPollRspWrapper;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t refId;
|
// int64_t refId;
|
||||||
int32_t epoch;
|
// int32_t epoch;
|
||||||
tsem_t rspSem;
|
tsem_t rspSem;
|
||||||
int32_t rspErr;
|
int32_t rspErr;
|
||||||
} SMqSubscribeCbParam;
|
} SMqSubscribeCbParam;
|
||||||
|
@ -194,8 +196,9 @@ typedef struct {
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t refId;
|
int64_t refId;
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
SMqClientVg* pVg;
|
char topicName[TSDB_TOPIC_FNAME_LEN];
|
||||||
SMqClientTopic* pTopic;
|
// SMqClientVg* pVg;
|
||||||
|
// SMqClientTopic* pTopic;
|
||||||
int32_t vgId;
|
int32_t vgId;
|
||||||
uint64_t requestId; // request id for debug purpose
|
uint64_t requestId; // request id for debug purpose
|
||||||
} SMqPollCbParam;
|
} SMqPollCbParam;
|
||||||
|
@ -743,8 +746,8 @@ static void generateTimedTask(int64_t refId, int32_t type) {
|
||||||
*pTaskType = type;
|
*pTaskType = type;
|
||||||
taosWriteQitem(tmq->delayedTask, pTaskType);
|
taosWriteQitem(tmq->delayedTask, pTaskType);
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
|
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||||
}
|
}
|
||||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void tmqAssignAskEpTask(void* param, void* tmrId) {
|
void tmqAssignAskEpTask(void* param, void* tmrId) {
|
||||||
|
@ -1071,6 +1074,7 @@ tmq_t* tmq_consumer_new(tmq_conf_t* conf, char* errstr, int32_t errstrLen) {
|
||||||
pTmq->commitCb = conf->commitCb;
|
pTmq->commitCb = conf->commitCb;
|
||||||
pTmq->commitCbUserParam = conf->commitCbUserParam;
|
pTmq->commitCbUserParam = conf->commitCbUserParam;
|
||||||
pTmq->resetOffsetCfg = conf->resetOffset;
|
pTmq->resetOffsetCfg = conf->resetOffset;
|
||||||
|
taosInitRWLatch(&pTmq->lock);
|
||||||
|
|
||||||
pTmq->hbBgEnable = conf->hbBgEnable;
|
pTmq->hbBgEnable = conf->hbBgEnable;
|
||||||
|
|
||||||
|
@ -1119,7 +1123,7 @@ _failed:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
||||||
const int32_t MAX_RETRY_COUNT = 120 * 4; // let's wait for 4 mins at most
|
const int32_t MAX_RETRY_COUNT = 120 * 60; // let's wait for 2 mins at most
|
||||||
const SArray* container = &topic_list->container;
|
const SArray* container = &topic_list->container;
|
||||||
int32_t sz = taosArrayGetSize(container);
|
int32_t sz = taosArrayGetSize(container);
|
||||||
void* buf = NULL;
|
void* buf = NULL;
|
||||||
|
@ -1172,7 +1176,7 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMqSubscribeCbParam param = { .rspErr = 0, .refId = tmq->refId, .epoch = tmq->epoch };
|
SMqSubscribeCbParam param = { .rspErr = 0};
|
||||||
if (tsem_init(¶m.rspSem, 0, 0) != 0) {
|
if (tsem_init(¶m.rspSem, 0, 0) != 0) {
|
||||||
code = TSDB_CODE_TSC_INTERNAL_ERROR;
|
code = TSDB_CODE_TSC_INTERNAL_ERROR;
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
|
@ -1206,8 +1210,8 @@ int32_t tmq_subscribe(tmq_t* tmq, const tmq_list_t* topic_list) {
|
||||||
int32_t retryCnt = 0;
|
int32_t retryCnt = 0;
|
||||||
while (TSDB_CODE_MND_CONSUMER_NOT_READY == doAskEp(tmq)) {
|
while (TSDB_CODE_MND_CONSUMER_NOT_READY == doAskEp(tmq)) {
|
||||||
if (retryCnt++ > MAX_RETRY_COUNT) {
|
if (retryCnt++ > MAX_RETRY_COUNT) {
|
||||||
tscError("consumer:0x%" PRIx64 ", mnd not ready for subscribe, max retry reached:%d", tmq->consumerId, retryCnt);
|
tscError("consumer:0x%" PRIx64 ", mnd not ready for subscribe, retry:%d in 500ms", tmq->consumerId, retryCnt);
|
||||||
code = TSDB_CODE_TSC_INTERNAL_ERROR;
|
code = TSDB_CODE_MND_CONSUMER_NOT_READY;
|
||||||
goto FAIL;
|
goto FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1242,12 +1246,40 @@ void tmq_conf_set_auto_commit_cb(tmq_conf_t* conf, tmq_commit_cb* cb, void* para
|
||||||
conf->commitCbUserParam = param;
|
conf->commitCbUserParam = param;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
static SMqClientVg* getVgInfo(tmq_t* tmq, char* topicName, int32_t vgId){
|
||||||
|
int32_t topicNumCur = taosArrayGetSize(tmq->clientTopics);
|
||||||
|
for(int i = 0; i < topicNumCur; i++){
|
||||||
|
SMqClientTopic* pTopicCur = taosArrayGet(tmq->clientTopics, i);
|
||||||
|
if(strcmp(pTopicCur->topicName, topicName) == 0){
|
||||||
|
int32_t vgNumCur = taosArrayGetSize(pTopicCur->vgs);
|
||||||
|
for (int32_t j = 0; j < vgNumCur; j++) {
|
||||||
|
SMqClientVg* pVgCur = taosArrayGet(pTopicCur->vgs, j);
|
||||||
|
if(pVgCur->vgId == vgId){
|
||||||
|
return pVgCur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SMqClientTopic* getTopicInfo(tmq_t* tmq, char* topicName){
|
||||||
|
int32_t topicNumCur = taosArrayGetSize(tmq->clientTopics);
|
||||||
|
for(int i = 0; i < topicNumCur; i++){
|
||||||
|
SMqClientTopic* pTopicCur = taosArrayGet(tmq->clientTopics, i);
|
||||||
|
if(strcmp(pTopicCur->topicName, topicName) == 0){
|
||||||
|
return pTopicCur;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
SMqPollCbParam* pParam = (SMqPollCbParam*)param;
|
SMqPollCbParam* pParam = (SMqPollCbParam*)param;
|
||||||
|
|
||||||
int64_t refId = pParam->refId;
|
int64_t refId = pParam->refId;
|
||||||
SMqClientVg* pVg = pParam->pVg;
|
// SMqClientVg* pVg = pParam->pVg;
|
||||||
SMqClientTopic* pTopic = pParam->pTopic;
|
// SMqClientTopic* pTopic = pParam->pTopic;
|
||||||
|
|
||||||
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
tmq_t* tmq = taosAcquireRef(tmqMgmt.rsetId, refId);
|
||||||
if (tmq == NULL) {
|
if (tmq == NULL) {
|
||||||
|
@ -1262,15 +1294,13 @@ static int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
int32_t vgId = pParam->vgId;
|
int32_t vgId = pParam->vgId;
|
||||||
uint64_t requestId = pParam->requestId;
|
uint64_t requestId = pParam->requestId;
|
||||||
|
|
||||||
taosMemoryFree(pParam);
|
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
if (pMsg->pData) taosMemoryFree(pMsg->pData);
|
if (pMsg->pData) taosMemoryFree(pMsg->pData);
|
||||||
if (pMsg->pEpSet) taosMemoryFree(pMsg->pEpSet);
|
if (pMsg->pEpSet) taosMemoryFree(pMsg->pEpSet);
|
||||||
|
|
||||||
// in case of consumer mismatch, wait for 500ms and retry
|
// in case of consumer mismatch, wait for 500ms and retry
|
||||||
if (code == TSDB_CODE_TMQ_CONSUMER_MISMATCH) {
|
if (code == TSDB_CODE_TMQ_CONSUMER_MISMATCH) {
|
||||||
taosMsleep(500);
|
// taosMsleep(500);
|
||||||
atomic_store_8(&tmq->status, TMQ_CONSUMER_STATUS__RECOVER);
|
atomic_store_8(&tmq->status, TMQ_CONSUMER_STATUS__RECOVER);
|
||||||
tscDebug("consumer:0x%" PRIx64 " wait for the re-balance, wait for 500ms and set status to be RECOVER",
|
tscDebug("consumer:0x%" PRIx64 " wait for the re-balance, wait for 500ms and set status to be RECOVER",
|
||||||
tmq->consumerId);
|
tmq->consumerId);
|
||||||
|
@ -1284,8 +1314,8 @@ static int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
pRspWrapper->tmqRspType = TMQ_MSG_TYPE__END_RSP;
|
pRspWrapper->tmqRspType = TMQ_MSG_TYPE__END_RSP;
|
||||||
taosWriteQitem(tmq->mqueue, pRspWrapper);
|
taosWriteQitem(tmq->mqueue, pRspWrapper);
|
||||||
} else if (code == TSDB_CODE_WAL_LOG_NOT_EXIST) { // poll data while insert
|
// } else if (code == TSDB_CODE_WAL_LOG_NOT_EXIST) { // poll data while insert
|
||||||
taosMsleep(500);
|
// taosMsleep(5);
|
||||||
} else{
|
} else{
|
||||||
tscError("consumer:0x%" PRIx64 " msg from vgId:%d discarded, epoch %d, since %s, reqId:0x%" PRIx64, tmq->consumerId,
|
tscError("consumer:0x%" PRIx64 " msg from vgId:%d discarded, epoch %d, since %s, reqId:0x%" PRIx64, tmq->consumerId,
|
||||||
vgId, epoch, tstrerror(code), requestId);
|
vgId, epoch, tstrerror(code), requestId);
|
||||||
|
@ -1307,6 +1337,8 @@ static int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
taosMemoryFree(pMsg->pEpSet);
|
taosMemoryFree(pMsg->pEpSet);
|
||||||
|
taosMemoryFree(pParam);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1328,11 +1360,12 @@ static int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
}
|
}
|
||||||
|
|
||||||
pRspWrapper->tmqRspType = rspType;
|
pRspWrapper->tmqRspType = rspType;
|
||||||
pRspWrapper->vgHandle = pVg;
|
// pRspWrapper->vgHandle = pVg;
|
||||||
pRspWrapper->topicHandle = pTopic;
|
// pRspWrapper->topicHandle = pTopic;
|
||||||
pRspWrapper->reqId = requestId;
|
pRspWrapper->reqId = requestId;
|
||||||
pRspWrapper->pEpset = pMsg->pEpSet;
|
pRspWrapper->pEpset = pMsg->pEpSet;
|
||||||
pRspWrapper->vgId = pVg->vgId;
|
pRspWrapper->vgId = vgId;
|
||||||
|
strcpy(pRspWrapper->topicName, pParam->topicName);
|
||||||
|
|
||||||
pMsg->pEpSet = NULL;
|
pMsg->pEpSet = NULL;
|
||||||
if (rspType == TMQ_MSG_TYPE__POLL_RSP) {
|
if (rspType == TMQ_MSG_TYPE__POLL_RSP) {
|
||||||
|
@ -1371,16 +1404,23 @@ static int32_t tmqPollCb(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||||
|
taosMemoryFree(pParam);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
CREATE_MSG_FAIL:
|
CREATE_MSG_FAIL:
|
||||||
if (epoch == tmq->epoch) {
|
if (epoch == tmq->epoch) {
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
taosWLockLatch(&tmq->lock);
|
||||||
|
SMqClientVg* pVg = getVgInfo(tmq, pParam->topicName, vgId);
|
||||||
|
if(pVg){
|
||||||
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
|
}
|
||||||
|
taosWUnLockLatch(&tmq->lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
tsem_post(&tmq->rspSem);
|
tsem_post(&tmq->rspSem);
|
||||||
taosReleaseRef(tmqMgmt.rsetId, refId);
|
taosReleaseRef(tmqMgmt.rsetId, refId);
|
||||||
|
taosMemoryFree(pParam);
|
||||||
|
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -1503,11 +1543,13 @@ static bool doUpdateLocalEp(tmq_t* tmq, int32_t epoch, const SMqAskEpRsp* pRsp)
|
||||||
|
|
||||||
taosHashCleanup(pVgOffsetHashMap);
|
taosHashCleanup(pVgOffsetHashMap);
|
||||||
|
|
||||||
|
taosWLockLatch(&tmq->lock);
|
||||||
// destroy current buffered existed topics info
|
// destroy current buffered existed topics info
|
||||||
if (tmq->clientTopics) {
|
if (tmq->clientTopics) {
|
||||||
taosArrayDestroyEx(tmq->clientTopics, freeClientVgInfo);
|
taosArrayDestroyEx(tmq->clientTopics, freeClientVgInfo);
|
||||||
}
|
}
|
||||||
tmq->clientTopics = newTopics;
|
tmq->clientTopics = newTopics;
|
||||||
|
taosWUnLockLatch(&tmq->lock);
|
||||||
|
|
||||||
int8_t flag = (topicNumGet == 0) ? TMQ_CONSUMER_STATUS__NO_TOPIC : TMQ_CONSUMER_STATUS__READY;
|
int8_t flag = (topicNumGet == 0) ? TMQ_CONSUMER_STATUS__NO_TOPIC : TMQ_CONSUMER_STATUS__READY;
|
||||||
atomic_store_8(&tmq->status, flag);
|
atomic_store_8(&tmq->status, flag);
|
||||||
|
@ -1523,7 +1565,7 @@ int32_t askEpCallbackFn(void* param, SDataBuf* pMsg, int32_t code) {
|
||||||
|
|
||||||
if (tmq == NULL) {
|
if (tmq == NULL) {
|
||||||
terrno = TSDB_CODE_TMQ_CONSUMER_CLOSED;
|
terrno = TSDB_CODE_TMQ_CONSUMER_CLOSED;
|
||||||
pParam->pUserFn(tmq, terrno, NULL, pParam->pParam);
|
// pParam->pUserFn(tmq, terrno, NULL, pParam->pParam);
|
||||||
|
|
||||||
taosMemoryFree(pMsg->pData);
|
taosMemoryFree(pMsg->pData);
|
||||||
taosMemoryFree(pMsg->pEpSet);
|
taosMemoryFree(pMsg->pEpSet);
|
||||||
|
@ -1682,8 +1724,9 @@ static int32_t doTmqPollImpl(tmq_t* pTmq, SMqClientTopic* pTopic, SMqClientVg* p
|
||||||
|
|
||||||
pParam->refId = pTmq->refId;
|
pParam->refId = pTmq->refId;
|
||||||
pParam->epoch = pTmq->epoch;
|
pParam->epoch = pTmq->epoch;
|
||||||
pParam->pVg = pVg;
|
// pParam->pVg = pVg; // pVg may be released,fix it
|
||||||
pParam->pTopic = pTopic;
|
// pParam->pTopic = pTopic;
|
||||||
|
strcpy(pParam->topicName, pTopic->topicName);
|
||||||
pParam->vgId = pVg->vgId;
|
pParam->vgId = pVg->vgId;
|
||||||
pParam->requestId = req.reqId;
|
pParam->requestId = req.reqId;
|
||||||
|
|
||||||
|
@ -1718,6 +1761,9 @@ static int32_t doTmqPollImpl(tmq_t* pTmq, SMqClientTopic* pTopic, SMqClientVg* p
|
||||||
|
|
||||||
// broadcast the poll request to all related vnodes
|
// broadcast the poll request to all related vnodes
|
||||||
static int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
|
static int32_t tmqPollImpl(tmq_t* tmq, int64_t timeout) {
|
||||||
|
if(atomic_load_8(&tmq->status) == TMQ_CONSUMER_STATUS__RECOVER){
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int32_t numOfTopics = taosArrayGetSize(tmq->clientTopics);
|
int32_t numOfTopics = taosArrayGetSize(tmq->clientTopics);
|
||||||
tscDebug("consumer:0x%" PRIx64 " start to poll data, numOfTopics:%d", tmq->consumerId, numOfTopics);
|
tscDebug("consumer:0x%" PRIx64 " start to poll data, numOfTopics:%d", tmq->consumerId, numOfTopics);
|
||||||
|
|
||||||
|
@ -1802,8 +1848,14 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
SMqDataRsp* pDataRsp = &pollRspWrapper->dataRsp;
|
SMqDataRsp* pDataRsp = &pollRspWrapper->dataRsp;
|
||||||
|
|
||||||
if (pDataRsp->head.epoch == consumerEpoch) {
|
if (pDataRsp->head.epoch == consumerEpoch) {
|
||||||
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
SMqClientVg* pVg = getVgInfo(tmq, pollRspWrapper->topicName, pollRspWrapper->vgId);
|
||||||
|
pollRspWrapper->vgHandle = pVg;
|
||||||
|
pollRspWrapper->topicHandle = getTopicInfo(tmq, pollRspWrapper->topicName);
|
||||||
|
if(pollRspWrapper->vgHandle == NULL || pollRspWrapper->topicHandle == NULL){
|
||||||
|
tscError("consumer:0x%" PRIx64 " get vg or topic error, topic:%s vgId:%d", tmq->consumerId,
|
||||||
|
pollRspWrapper->topicName, pollRspWrapper->vgId);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
// update the epset
|
// update the epset
|
||||||
if (pollRspWrapper->pEpset != NULL) {
|
if (pollRspWrapper->pEpset != NULL) {
|
||||||
SEp* pEp = GET_ACTIVE_EP(pollRspWrapper->pEpset);
|
SEp* pEp = GET_ACTIVE_EP(pollRspWrapper->pEpset);
|
||||||
|
@ -1816,7 +1868,10 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
// update the local offset value only for the returned values, only when the local offset is NOT updated
|
// update the local offset value only for the returned values, only when the local offset is NOT updated
|
||||||
// by tmq_offset_seek function
|
// by tmq_offset_seek function
|
||||||
if (!pVg->seekUpdated) {
|
if (!pVg->seekUpdated) {
|
||||||
|
tscDebug("consumer:0x%" PRIx64" local offset is update, since seekupdate not set", tmq->consumerId);
|
||||||
pVg->offsetInfo.currentOffset = pDataRsp->rspOffset;
|
pVg->offsetInfo.currentOffset = pDataRsp->rspOffset;
|
||||||
|
} else {
|
||||||
|
tscDebug("consumer:0x%" PRIx64" local offset is NOT update, since seekupdate is set", tmq->consumerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
// update the status
|
// update the status
|
||||||
|
@ -1862,8 +1917,16 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
tscDebug("consumer:0x%" PRIx64 " process meta rsp", tmq->consumerId);
|
tscDebug("consumer:0x%" PRIx64 " process meta rsp", tmq->consumerId);
|
||||||
|
|
||||||
if (pollRspWrapper->metaRsp.head.epoch == consumerEpoch) {
|
if (pollRspWrapper->metaRsp.head.epoch == consumerEpoch) {
|
||||||
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
SMqClientVg* pVg = getVgInfo(tmq, pollRspWrapper->topicName, pollRspWrapper->vgId);
|
||||||
if (!pVg->seekUpdated) {
|
pollRspWrapper->vgHandle = pVg;
|
||||||
|
pollRspWrapper->topicHandle = getTopicInfo(tmq, pollRspWrapper->topicName);
|
||||||
|
if(pollRspWrapper->vgHandle == NULL || pollRspWrapper->topicHandle == NULL){
|
||||||
|
tscError("consumer:0x%" PRIx64 " get vg or topic error, topic:%s vgId:%d", tmq->consumerId,
|
||||||
|
pollRspWrapper->topicName, pollRspWrapper->vgId);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pollRspWrapper->metaRsp.rspOffset.type != 0){ // if offset is validate
|
||||||
pVg->offsetInfo.currentOffset = pollRspWrapper->metaRsp.rspOffset;
|
pVg->offsetInfo.currentOffset = pollRspWrapper->metaRsp.rspOffset;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1883,9 +1946,24 @@ static void* tmqHandleAllRsp(tmq_t* tmq, int64_t timeout, bool pollIfReset) {
|
||||||
int32_t consumerEpoch = atomic_load_32(&tmq->epoch);
|
int32_t consumerEpoch = atomic_load_32(&tmq->epoch);
|
||||||
|
|
||||||
if (pollRspWrapper->taosxRsp.head.epoch == consumerEpoch) {
|
if (pollRspWrapper->taosxRsp.head.epoch == consumerEpoch) {
|
||||||
SMqClientVg* pVg = pollRspWrapper->vgHandle;
|
SMqClientVg* pVg = getVgInfo(tmq, pollRspWrapper->topicName, pollRspWrapper->vgId);
|
||||||
if (!pVg->seekUpdated) { // if offset is validate
|
pollRspWrapper->vgHandle = pVg;
|
||||||
pVg->offsetInfo.currentOffset = pollRspWrapper->taosxRsp.rspOffset;
|
pollRspWrapper->topicHandle = getTopicInfo(tmq, pollRspWrapper->topicName);
|
||||||
|
if(pollRspWrapper->vgHandle == NULL || pollRspWrapper->topicHandle == NULL){
|
||||||
|
tscError("consumer:0x%" PRIx64 " get vg or topic error, topic:%s vgId:%d", tmq->consumerId,
|
||||||
|
pollRspWrapper->topicName, pollRspWrapper->vgId);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
// update the local offset value only for the returned values, only when the local offset is NOT updated
|
||||||
|
// by tmq_offset_seek function
|
||||||
|
if (!pVg->seekUpdated) {
|
||||||
|
if(pollRspWrapper->taosxRsp.rspOffset.type != 0) { // if offset is validate
|
||||||
|
tscDebug("consumer:0x%" PRIx64" local offset is update, since seekupdate not set", tmq->consumerId);
|
||||||
|
pVg->offsetInfo.currentOffset = pollRspWrapper->taosxRsp.rspOffset;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
tscDebug("consumer:0x%" PRIx64" local offset is NOT update, since seekupdate is set", tmq->consumerId);
|
||||||
}
|
}
|
||||||
|
|
||||||
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
atomic_store_32(&pVg->vgStatus, TMQ_VG_STATUS__IDLE);
|
||||||
|
|
|
@ -17,9 +17,16 @@
|
||||||
#include "jniCommon.h"
|
#include "jniCommon.h"
|
||||||
#include "taos.h"
|
#include "taos.h"
|
||||||
|
|
||||||
int __init_tmq = 0;
|
int __init_tmq = 0;
|
||||||
jmethodID g_offsetCallback;
|
jmethodID g_offsetCallback;
|
||||||
|
|
||||||
|
jclass g_assignmentClass;
|
||||||
|
jmethodID g_assignmentConstructor;
|
||||||
|
jmethodID g_assignmentSetVgId;
|
||||||
|
jmethodID g_assignmentSetCurrentOffset;
|
||||||
|
jmethodID g_assignmentSetBegin;
|
||||||
|
jmethodID g_assignmentSetEnd;
|
||||||
|
|
||||||
void tmqGlobalMethod(JNIEnv *env) {
|
void tmqGlobalMethod(JNIEnv *env) {
|
||||||
// make sure init function executed once
|
// make sure init function executed once
|
||||||
switch (atomic_val_compare_exchange_32(&__init_tmq, 0, 1)) {
|
switch (atomic_val_compare_exchange_32(&__init_tmq, 0, 1)) {
|
||||||
|
@ -46,6 +53,38 @@ void tmqGlobalMethod(JNIEnv *env) {
|
||||||
jniDebug("tmq method register finished");
|
jniDebug("tmq method register finished");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int __init_assignment = 0;
|
||||||
|
void tmqAssignmentMethod(JNIEnv *env) {
|
||||||
|
// make sure init function executed once
|
||||||
|
switch (atomic_val_compare_exchange_32(&__init_assignment, 0, 1)) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
do {
|
||||||
|
taosMsleep(0);
|
||||||
|
} while (atomic_load_32(&__init_assignment) == 1);
|
||||||
|
case 2:
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (g_vm == NULL) {
|
||||||
|
(*env)->GetJavaVM(env, &g_vm);
|
||||||
|
}
|
||||||
|
|
||||||
|
jclass assignment = (*env)->FindClass(env, "com/taosdata/jdbc/tmq/Assignment");
|
||||||
|
g_assignmentClass = (*env)->NewGlobalRef(env, assignment);
|
||||||
|
g_assignmentConstructor = (*env)->GetMethodID(env, g_assignmentClass, "<init>", "()V");
|
||||||
|
g_assignmentSetVgId = (*env)->GetMethodID(env, g_assignmentClass, "setVgId", "(I)V"); // int
|
||||||
|
g_assignmentSetCurrentOffset = (*env)->GetMethodID(env, g_assignmentClass, "setCurrentOffset", "(J)V"); // long
|
||||||
|
g_assignmentSetBegin = (*env)->GetMethodID(env, g_assignmentClass, "setBegin", "(J)V"); // long
|
||||||
|
g_assignmentSetEnd = (*env)->GetMethodID(env, g_assignmentClass, "setEnd", "(J)V"); // long
|
||||||
|
|
||||||
|
(*env)->DeleteLocalRef(env, assignment);
|
||||||
|
|
||||||
|
atomic_store_32(&__init_assignment, 2);
|
||||||
|
jniDebug("tmq method assignment finished");
|
||||||
|
}
|
||||||
|
|
||||||
// deprecated
|
// deprecated
|
||||||
void commit_cb(tmq_t *tmq, int32_t code, void *param) {
|
void commit_cb(tmq_t *tmq, int32_t code, void *param) {
|
||||||
JNIEnv *env = NULL;
|
JNIEnv *env = NULL;
|
||||||
|
@ -266,8 +305,9 @@ JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqCommitAsync(JN
|
||||||
tmq_commit_async(tmq, res, commit_cb, consumer);
|
tmq_commit_async(tmq, res, commit_cb, consumer);
|
||||||
}
|
}
|
||||||
|
|
||||||
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_consumerCommitAsync(JNIEnv *env, jobject jobj, jlong jtmq,
|
JNIEXPORT void JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_consumerCommitAsync(JNIEnv *env, jobject jobj,
|
||||||
jlong jres, jobject offset) {
|
jlong jtmq, jlong jres,
|
||||||
|
jobject offset) {
|
||||||
tmqGlobalMethod(env);
|
tmqGlobalMethod(env);
|
||||||
tmq_t *tmq = (tmq_t *)jtmq;
|
tmq_t *tmq = (tmq_t *)jtmq;
|
||||||
if (tmq == NULL) {
|
if (tmq == NULL) {
|
||||||
|
@ -335,7 +375,7 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetVgroupId(JN
|
||||||
TAOS_RES *res = (TAOS_RES *)jres;
|
TAOS_RES *res = (TAOS_RES *)jres;
|
||||||
if (res == NULL) {
|
if (res == NULL) {
|
||||||
jniDebug("jobj:%p, invalid res handle", jobj);
|
jniDebug("jobj:%p, invalid res handle", jobj);
|
||||||
return -1;
|
return JNI_RESULT_SET_NULL;
|
||||||
}
|
}
|
||||||
return tmq_get_vgroup_id(res);
|
return tmq_get_vgroup_id(res);
|
||||||
}
|
}
|
||||||
|
@ -350,6 +390,15 @@ JNIEXPORT jstring JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetTableNam
|
||||||
return (*env)->NewStringUTF(env, tmq_get_table_name(res));
|
return (*env)->NewStringUTF(env, tmq_get_table_name(res));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jlong JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetOffset(JNIEnv *env, jobject jobj, jlong jres) {
|
||||||
|
TAOS_RES *res = (TAOS_RES *)jres;
|
||||||
|
if (res == NULL) {
|
||||||
|
jniDebug("jobj:%p, invalid res handle", jobj);
|
||||||
|
return JNI_RESULT_SET_NULL;
|
||||||
|
}
|
||||||
|
return tmq_get_vgroup_offset(res);
|
||||||
|
}
|
||||||
|
|
||||||
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(JNIEnv *env, jobject jobj, jlong con,
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(JNIEnv *env, jobject jobj, jlong con,
|
||||||
jlong res, jobject rowobj,
|
jlong res, jobject rowobj,
|
||||||
jobject arrayListObj) {
|
jobject arrayListObj) {
|
||||||
|
@ -369,7 +418,8 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(
|
||||||
jniDebug("jobj:%p, conn:%p, resultset:%p, no data to retrieve", jobj, tscon, (void *)res);
|
jniDebug("jobj:%p, conn:%p, resultset:%p, no data to retrieve", jobj, tscon, (void *)res);
|
||||||
return JNI_FETCH_END;
|
return JNI_FETCH_END;
|
||||||
} else {
|
} else {
|
||||||
jniError("jobj:%p, conn:%p, query interrupted, tmq fetch block error code:%d, msg:%s", jobj, tscon, error_code, taos_errstr(tres));
|
jniError("jobj:%p, conn:%p, query interrupted, tmq fetch block error code:%d, msg:%s", jobj, tscon, error_code,
|
||||||
|
taos_errstr(tres));
|
||||||
return JNI_RESULT_SET_NULL;
|
return JNI_RESULT_SET_NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -399,3 +449,72 @@ JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_fetchRawBlockImp(
|
||||||
(*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, jniFromNCharToByteArray(env, (char *)data, len));
|
(*env)->CallVoidMethod(env, rowobj, g_blockdataSetByteArrayFp, jniFromNCharToByteArray(env, (char *)data, len));
|
||||||
return JNI_SUCCESS;
|
return JNI_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqSeekImp(JNIEnv *env, jobject jobj, jlong jtmq,
|
||||||
|
jstring jtopic, jint partition,
|
||||||
|
jlong offset) {
|
||||||
|
tmq_t *tmq = (tmq_t *)jtmq;
|
||||||
|
if (tmq == NULL) {
|
||||||
|
jniDebug("jobj:%p, tmq is closed", jobj);
|
||||||
|
return TMQ_CONSUMER_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jtopic == NULL) {
|
||||||
|
jniDebug("jobj:%p, topic is null", jobj);
|
||||||
|
return TMQ_TOPIC_NULL;
|
||||||
|
}
|
||||||
|
const char *topicName = (*env)->GetStringUTFChars(env, jtopic, NULL);
|
||||||
|
|
||||||
|
int32_t res = tmq_offset_seek(tmq, topicName, partition, offset);
|
||||||
|
|
||||||
|
if (res != TSDB_CODE_SUCCESS) {
|
||||||
|
jniError("jobj:%p, tmq seek error, code:%d, msg:%s", jobj, res, tmq_err2str(res));
|
||||||
|
}
|
||||||
|
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jtopic, topicName);
|
||||||
|
return (jint)res;
|
||||||
|
}
|
||||||
|
|
||||||
|
JNIEXPORT jint JNICALL Java_com_taosdata_jdbc_tmq_TMQConnector_tmqGetTopicAssignmentImp(JNIEnv *env, jobject jobj,
|
||||||
|
jlong jtmq, jstring jtopic,
|
||||||
|
jobject jarrayList) {
|
||||||
|
tmqAssignmentMethod(env);
|
||||||
|
tmq_t *tmq = (tmq_t *)jtmq;
|
||||||
|
if (tmq == NULL) {
|
||||||
|
jniDebug("jobj:%p, tmq is closed", jobj);
|
||||||
|
return TMQ_CONSUMER_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (jtopic == NULL) {
|
||||||
|
jniDebug("jobj:%p, topic is null", jobj);
|
||||||
|
return TMQ_TOPIC_NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
const char *topicName = (*env)->GetStringUTFChars(env, jtopic, NULL);
|
||||||
|
|
||||||
|
tmq_topic_assignment *pAssign = NULL;
|
||||||
|
int32_t numOfAssignment = 0;
|
||||||
|
int32_t res = tmq_get_topic_assignment(tmq, topicName, &pAssign, &numOfAssignment);
|
||||||
|
|
||||||
|
if (res != TSDB_CODE_SUCCESS) {
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jtopic, topicName);
|
||||||
|
jniError("jobj:%p, tmq get topic assignment error, topic:%s, code:%d, msg:%s", jobj, topicName, res,
|
||||||
|
tmq_err2str(res));
|
||||||
|
tmq_free_assignment(pAssign);
|
||||||
|
return (jint)res;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*env)->ReleaseStringUTFChars(env, jtopic, topicName);
|
||||||
|
|
||||||
|
for (int i = 0; i < numOfAssignment; ++i) {
|
||||||
|
tmq_topic_assignment assignment = pAssign[i];
|
||||||
|
jobject jassignment = (*env)->NewObject(env, g_assignmentClass, g_assignmentConstructor);
|
||||||
|
(*env)->CallVoidMethod(env, jassignment, g_assignmentSetVgId, assignment.vgId);
|
||||||
|
(*env)->CallVoidMethod(env, jassignment, g_assignmentSetCurrentOffset, assignment.currentOffset);
|
||||||
|
(*env)->CallVoidMethod(env, jassignment, g_assignmentSetBegin, assignment.begin);
|
||||||
|
(*env)->CallVoidMethod(env, jassignment, g_assignmentSetEnd, assignment.end);
|
||||||
|
(*env)->CallBooleanMethod(env, jarrayList, g_arrayListAddFp, jassignment);
|
||||||
|
}
|
||||||
|
tmq_free_assignment(pAssign);
|
||||||
|
return JNI_SUCCESS;
|
||||||
|
}
|
||||||
|
|
|
@ -2504,18 +2504,21 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind) {
|
int32_t tColDataAddValueByBind(SColData *pColData, TAOS_MULTI_BIND *pBind, int32_t buffMaxLen) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
|
if (!(pBind->num == 1 && pBind->is_null && *pBind->is_null)) {
|
||||||
ASSERT(pColData->type == pBind->buffer_type);
|
ASSERT(pColData->type == pBind->buffer_type);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (IS_VAR_DATA_TYPE(pColData->type)) { // var-length data type
|
if (IS_VAR_DATA_TYPE(pColData->type)) { // var-length data type
|
||||||
for (int32_t i = 0; i < pBind->num; ++i) {
|
for (int32_t i = 0; i < pBind->num; ++i) {
|
||||||
if (pBind->is_null && pBind->is_null[i]) {
|
if (pBind->is_null && pBind->is_null[i]) {
|
||||||
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
|
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_NULL](pColData, NULL, 0);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
} else if (pBind->length[i] > buffMaxLen) {
|
||||||
|
uError("var data length too big, len:%d, max:%d", pBind->length[i], buffMaxLen);
|
||||||
|
return TSDB_CODE_INVALID_PARA;
|
||||||
} else {
|
} else {
|
||||||
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
|
code = tColDataAppendValueImpl[pColData->flag][CV_FLAG_VALUE](
|
||||||
pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
|
pColData, (uint8_t *)pBind->buffer + pBind->buffer_length * i, pBind->length[i]);
|
||||||
|
@ -3523,6 +3526,43 @@ static FORCE_INLINE void tColDataCalcSMAUBigInt(SColData *pColData, int64_t *sum
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static FORCE_INLINE void tColDataCalcSMAVarType(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min,
|
||||||
|
int16_t *numOfNull) {
|
||||||
|
*(uint64_t *)sum = 0;
|
||||||
|
*(uint64_t *)max = 0;
|
||||||
|
*(uint64_t *)min = 0;
|
||||||
|
*numOfNull = 0;
|
||||||
|
|
||||||
|
switch (pColData->flag) {
|
||||||
|
case HAS_NONE:
|
||||||
|
case HAS_NULL:
|
||||||
|
case (HAS_NONE | HAS_NULL):
|
||||||
|
*numOfNull = pColData->nVal;
|
||||||
|
break;
|
||||||
|
case HAS_VALUE:
|
||||||
|
*numOfNull = 0;
|
||||||
|
break;
|
||||||
|
case (HAS_VALUE | HAS_NULL):
|
||||||
|
case (HAS_VALUE | HAS_NONE):
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
if (GET_BIT1(pColData->pBitMap, iVal) == 0) {
|
||||||
|
(*numOfNull)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case (HAS_VALUE | HAS_NONE | HAS_NULL):
|
||||||
|
for (int32_t iVal = 0; iVal < pColData->nVal; iVal++) {
|
||||||
|
if (GET_BIT2(pColData->pBitMap, iVal) != 2) {
|
||||||
|
(*numOfNull)++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
ASSERT(0);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull) = {
|
void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_t *min, int16_t *numOfNull) = {
|
||||||
NULL,
|
NULL,
|
||||||
tColDataCalcSMABool, // TSDB_DATA_TYPE_BOOL
|
tColDataCalcSMABool, // TSDB_DATA_TYPE_BOOL
|
||||||
|
@ -3532,14 +3572,14 @@ void (*tColDataCalcSMA[])(SColData *pColData, int64_t *sum, int64_t *max, int64_
|
||||||
tColDataCalcSMABigInt, // TSDB_DATA_TYPE_BIGINT
|
tColDataCalcSMABigInt, // TSDB_DATA_TYPE_BIGINT
|
||||||
tColDataCalcSMAFloat, // TSDB_DATA_TYPE_FLOAT
|
tColDataCalcSMAFloat, // TSDB_DATA_TYPE_FLOAT
|
||||||
tColDataCalcSMADouble, // TSDB_DATA_TYPE_DOUBLE
|
tColDataCalcSMADouble, // TSDB_DATA_TYPE_DOUBLE
|
||||||
NULL, // TSDB_DATA_TYPE_VARCHAR
|
tColDataCalcSMAVarType, // TSDB_DATA_TYPE_VARCHAR
|
||||||
tColDataCalcSMABigInt, // TSDB_DATA_TYPE_TIMESTAMP
|
tColDataCalcSMABigInt, // TSDB_DATA_TYPE_TIMESTAMP
|
||||||
NULL, // TSDB_DATA_TYPE_NCHAR
|
tColDataCalcSMAVarType, // TSDB_DATA_TYPE_NCHAR
|
||||||
tColDataCalcSMAUTinyInt, // TSDB_DATA_TYPE_UTINYINT
|
tColDataCalcSMAUTinyInt, // TSDB_DATA_TYPE_UTINYINT
|
||||||
tColDataCalcSMATinyUSmallInt, // TSDB_DATA_TYPE_USMALLINT
|
tColDataCalcSMATinyUSmallInt, // TSDB_DATA_TYPE_USMALLINT
|
||||||
tColDataCalcSMAUInt, // TSDB_DATA_TYPE_UINT
|
tColDataCalcSMAUInt, // TSDB_DATA_TYPE_UINT
|
||||||
tColDataCalcSMAUBigInt, // TSDB_DATA_TYPE_UBIGINT
|
tColDataCalcSMAUBigInt, // TSDB_DATA_TYPE_UBIGINT
|
||||||
NULL, // TSDB_DATA_TYPE_JSON
|
tColDataCalcSMAVarType, // TSDB_DATA_TYPE_JSON
|
||||||
NULL, // TSDB_DATA_TYPE_VARBINARY
|
NULL, // TSDB_DATA_TYPE_VARBINARY
|
||||||
NULL, // TSDB_DATA_TYPE_DECIMAL
|
NULL, // TSDB_DATA_TYPE_DECIMAL
|
||||||
NULL, // TSDB_DATA_TYPE_BLOB
|
NULL, // TSDB_DATA_TYPE_BLOB
|
||||||
|
|
|
@ -60,6 +60,7 @@ int32_t tsNumOfQnodeQueryThreads = 4;
|
||||||
int32_t tsNumOfQnodeFetchThreads = 1;
|
int32_t tsNumOfQnodeFetchThreads = 1;
|
||||||
int32_t tsNumOfSnodeStreamThreads = 4;
|
int32_t tsNumOfSnodeStreamThreads = 4;
|
||||||
int32_t tsNumOfSnodeWriteThreads = 1;
|
int32_t tsNumOfSnodeWriteThreads = 1;
|
||||||
|
int32_t tsMaxStreamBackendCache = 128; // M
|
||||||
|
|
||||||
// sync raft
|
// sync raft
|
||||||
int32_t tsElectInterval = 25 * 1000;
|
int32_t tsElectInterval = 25 * 1000;
|
||||||
|
@ -72,6 +73,7 @@ int64_t tsVndCommitMaxIntervalMs = 600 * 1000;
|
||||||
// mnode
|
// mnode
|
||||||
int64_t tsMndSdbWriteDelta = 200;
|
int64_t tsMndSdbWriteDelta = 200;
|
||||||
int64_t tsMndLogRetention = 2000;
|
int64_t tsMndLogRetention = 2000;
|
||||||
|
bool tsMndSkipGrant = false;
|
||||||
|
|
||||||
// monitor
|
// monitor
|
||||||
bool tsEnableMonitor = true;
|
bool tsEnableMonitor = true;
|
||||||
|
@ -105,7 +107,7 @@ int32_t tsQueryPolicy = 1;
|
||||||
int32_t tsQueryRspPolicy = 0;
|
int32_t tsQueryRspPolicy = 0;
|
||||||
int64_t tsQueryMaxConcurrentTables = 200; // unit is TSDB_TABLE_NUM_UNIT
|
int64_t tsQueryMaxConcurrentTables = 200; // unit is TSDB_TABLE_NUM_UNIT
|
||||||
bool tsEnableQueryHb = false;
|
bool tsEnableQueryHb = false;
|
||||||
bool tsEnableScience = false; // on taos-cli show float and doulbe with scientific notation if true
|
bool tsEnableScience = false; // on taos-cli show float and doulbe with scientific notation if true
|
||||||
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;
|
||||||
|
@ -117,8 +119,8 @@ int32_t tsRedirectFactor = 2;
|
||||||
int32_t tsRedirectMaxPeriod = 1000;
|
int32_t tsRedirectMaxPeriod = 1000;
|
||||||
int32_t tsMaxRetryWaitTime = 10000;
|
int32_t tsMaxRetryWaitTime = 10000;
|
||||||
bool tsUseAdapter = false;
|
bool tsUseAdapter = false;
|
||||||
int32_t tsMetaCacheMaxSize = -1; // MB
|
int32_t tsMetaCacheMaxSize = -1; // MB
|
||||||
int32_t tsSlowLogThreshold = 3; // seconds
|
int32_t tsSlowLogThreshold = 3; // seconds
|
||||||
int32_t tsSlowLogScope = SLOW_LOG_TYPE_ALL;
|
int32_t tsSlowLogScope = SLOW_LOG_TYPE_ALL;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -141,8 +143,8 @@ int32_t tsCompressColData = -1;
|
||||||
// count/hyperloglog function always return values in case of all NULL data or Empty data set.
|
// count/hyperloglog function always return values in case of all NULL data or Empty data set.
|
||||||
int32_t tsCountAlwaysReturnValue = 1;
|
int32_t tsCountAlwaysReturnValue = 1;
|
||||||
|
|
||||||
// 10 ms for sliding time, the value will changed in case of time precision changed
|
// 1 ms for sliding time, the value will changed in case of time precision changed
|
||||||
int32_t tsMinSlidingTime = 10;
|
int32_t tsMinSlidingTime = 1;
|
||||||
|
|
||||||
// the maxinum number of distict query result
|
// the maxinum number of distict query result
|
||||||
int32_t tsMaxNumOfDistinctResults = 1000 * 10000;
|
int32_t tsMaxNumOfDistinctResults = 1000 * 10000;
|
||||||
|
@ -150,8 +152,8 @@ int32_t tsMaxNumOfDistinctResults = 1000 * 10000;
|
||||||
// 1 database precision unit for interval time range, changed accordingly
|
// 1 database precision unit for interval time range, changed accordingly
|
||||||
int32_t tsMinIntervalTime = 1;
|
int32_t tsMinIntervalTime = 1;
|
||||||
|
|
||||||
// maximum memory allowed to be allocated for a single csv load (in MB)
|
// maximum batch rows numbers imported from a single csv load
|
||||||
int32_t tsMaxMemUsedByInsert = 1024;
|
int32_t tsMaxInsertBatchRows = 1000000;
|
||||||
|
|
||||||
float tsSelectivityRatio = 1.0;
|
float tsSelectivityRatio = 1.0;
|
||||||
int32_t tsTagFilterResCacheSize = 1024 * 10;
|
int32_t tsTagFilterResCacheSize = 1024 * 10;
|
||||||
|
@ -345,11 +347,12 @@ static int32_t taosAddClientCfg(SConfig *pCfg) {
|
||||||
if (cfgAddString(pCfg, "smlTagName", tsSmlTagName, 1) != 0) return -1;
|
if (cfgAddString(pCfg, "smlTagName", tsSmlTagName, 1) != 0) return -1;
|
||||||
// if (cfgAddBool(pCfg, "smlDataFormat", tsSmlDataFormat, 1) != 0) return -1;
|
// if (cfgAddBool(pCfg, "smlDataFormat", tsSmlDataFormat, 1) != 0) return -1;
|
||||||
// if (cfgAddInt32(pCfg, "smlBatchSize", tsSmlBatchSize, 1, INT32_MAX, true) != 0) return -1;
|
// if (cfgAddInt32(pCfg, "smlBatchSize", tsSmlBatchSize, 1, INT32_MAX, true) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxMemUsedByInsert", tsMaxMemUsedByInsert, 1, INT32_MAX, true) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxInsertBatchRows", tsMaxInsertBatchRows, 1, INT32_MAX, true) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxRetryWaitTime", tsMaxRetryWaitTime, 0, 86400000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxRetryWaitTime", tsMaxRetryWaitTime, 0, 86400000, 0) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "useAdapter", tsUseAdapter, true) != 0) return -1;
|
if (cfgAddBool(pCfg, "useAdapter", tsUseAdapter, true) != 0) return -1;
|
||||||
if (cfgAddBool(pCfg, "crashReporting", tsEnableCrashReport, true) != 0) return -1;
|
if (cfgAddBool(pCfg, "crashReporting", tsEnableCrashReport, true) != 0) return -1;
|
||||||
if (cfgAddInt64(pCfg, "queryMaxConcurrentTables", tsQueryMaxConcurrentTables, INT64_MIN, INT64_MAX, 1) != 0) return -1;
|
if (cfgAddInt64(pCfg, "queryMaxConcurrentTables", tsQueryMaxConcurrentTables, INT64_MIN, INT64_MAX, 1) != 0)
|
||||||
|
return -1;
|
||||||
if (cfgAddInt32(pCfg, "metaCacheMaxSize", tsMetaCacheMaxSize, -1, INT32_MAX, 1) != 0) return -1;
|
if (cfgAddInt32(pCfg, "metaCacheMaxSize", tsMetaCacheMaxSize, -1, INT32_MAX, 1) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "slowLogThreshold", tsSlowLogThreshold, 0, INT32_MAX, true) != 0) return -1;
|
if (cfgAddInt32(pCfg, "slowLogThreshold", tsSlowLogThreshold, 0, INT32_MAX, true) != 0) return -1;
|
||||||
if (cfgAddString(pCfg, "slowLogScope", "", true) != 0) return -1;
|
if (cfgAddString(pCfg, "slowLogScope", "", true) != 0) return -1;
|
||||||
|
@ -420,7 +423,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
|
|
||||||
if (cfgAddInt32(pCfg, "maxShellConns", tsMaxShellConns, 10, 50000000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxShellConns", tsMaxShellConns, 10, 50000000, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "statusInterval", tsStatusInterval, 1, 30, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "statusInterval", tsStatusInterval, 1, 30, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "minSlidingTime", tsMinSlidingTime, 10, 1000000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "minSlidingTime", tsMinSlidingTime, 1, 1000000, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "minIntervalTime", tsMinIntervalTime, 1, 1000000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "minIntervalTime", tsMinIntervalTime, 1, 1000000, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "maxNumOfDistinctRes", tsMaxNumOfDistinctResults, 10 * 10000, 10000 * 10000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "maxNumOfDistinctRes", tsMaxNumOfDistinctResults, 10 * 10000, 10000 * 10000, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "countAlwaysReturnValue", tsCountAlwaysReturnValue, 0, 1, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "countAlwaysReturnValue", tsCountAlwaysReturnValue, 0, 1, 0) != 0) return -1;
|
||||||
|
@ -489,6 +492,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
|
|
||||||
if (cfgAddInt64(pCfg, "mndSdbWriteDelta", tsMndSdbWriteDelta, 20, 10000, 0) != 0) return -1;
|
if (cfgAddInt64(pCfg, "mndSdbWriteDelta", tsMndSdbWriteDelta, 20, 10000, 0) != 0) return -1;
|
||||||
if (cfgAddInt64(pCfg, "mndLogRetention", tsMndLogRetention, 500, 10000, 0) != 0) return -1;
|
if (cfgAddInt64(pCfg, "mndLogRetention", tsMndLogRetention, 500, 10000, 0) != 0) return -1;
|
||||||
|
if (cfgAddBool(pCfg, "skipGrant", tsMndSkipGrant, 0) != 0) return -1;
|
||||||
|
|
||||||
if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "monitor", tsEnableMonitor, 0) != 0) return -1;
|
||||||
if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 200000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "monitorInterval", tsMonitorInterval, 1, 200000, 0) != 0) return -1;
|
||||||
|
@ -524,6 +528,7 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
if (cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "cacheLazyLoadThreshold", tsCacheLazyLoadThreshold, 0, 100000, 0) != 0) return -1;
|
||||||
|
|
||||||
if (cfgAddBool(pCfg, "filterScalarMode", tsFilterScalarMode, 0) != 0) return -1;
|
if (cfgAddBool(pCfg, "filterScalarMode", tsFilterScalarMode, 0) != 0) return -1;
|
||||||
|
if (cfgAddInt32(pCfg, "maxStreamBackendCache", tsMaxStreamBackendCache, 16, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
GRANT_CFG_ADD;
|
GRANT_CFG_ADD;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -773,7 +778,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
|
||||||
// tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval;
|
// tsSmlDataFormat = cfgGetItem(pCfg, "smlDataFormat")->bval;
|
||||||
|
|
||||||
// tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32;
|
// tsSmlBatchSize = cfgGetItem(pCfg, "smlBatchSize")->i32;
|
||||||
tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32;
|
tsMaxInsertBatchRows = cfgGetItem(pCfg, "maxInsertBatchRows")->i32;
|
||||||
|
|
||||||
tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32;
|
tsShellActivityTimer = cfgGetItem(pCfg, "shellActivityTimer")->i32;
|
||||||
tsCompressMsgSize = cfgGetItem(pCfg, "compressMsgSize")->i32;
|
tsCompressMsgSize = cfgGetItem(pCfg, "compressMsgSize")->i32;
|
||||||
|
@ -781,7 +786,7 @@ static int32_t taosSetClientCfg(SConfig *pCfg) {
|
||||||
tsNumOfTaskQueueThreads = cfgGetItem(pCfg, "numOfTaskQueueThreads")->i32;
|
tsNumOfTaskQueueThreads = cfgGetItem(pCfg, "numOfTaskQueueThreads")->i32;
|
||||||
tsQueryPolicy = cfgGetItem(pCfg, "queryPolicy")->i32;
|
tsQueryPolicy = cfgGetItem(pCfg, "queryPolicy")->i32;
|
||||||
tsEnableQueryHb = cfgGetItem(pCfg, "enableQueryHb")->bval;
|
tsEnableQueryHb = cfgGetItem(pCfg, "enableQueryHb")->bval;
|
||||||
tsEnableScience = cfgGetItem(pCfg, "enableScience")->bval;
|
tsEnableScience = cfgGetItem(pCfg, "enableScience")->bval;
|
||||||
tsQuerySmaOptimize = cfgGetItem(pCfg, "querySmaOptimize")->i32;
|
tsQuerySmaOptimize = cfgGetItem(pCfg, "querySmaOptimize")->i32;
|
||||||
tsQueryPlannerTrace = cfgGetItem(pCfg, "queryPlannerTrace")->bval;
|
tsQueryPlannerTrace = cfgGetItem(pCfg, "queryPlannerTrace")->bval;
|
||||||
tsQueryNodeChunkSize = cfgGetItem(pCfg, "queryNodeChunkSize")->i32;
|
tsQueryNodeChunkSize = cfgGetItem(pCfg, "queryNodeChunkSize")->i32;
|
||||||
|
@ -887,6 +892,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
|
|
||||||
tsMndSdbWriteDelta = cfgGetItem(pCfg, "mndSdbWriteDelta")->i64;
|
tsMndSdbWriteDelta = cfgGetItem(pCfg, "mndSdbWriteDelta")->i64;
|
||||||
tsMndLogRetention = cfgGetItem(pCfg, "mndLogRetention")->i64;
|
tsMndLogRetention = cfgGetItem(pCfg, "mndLogRetention")->i64;
|
||||||
|
tsMndSkipGrant = cfgGetItem(pCfg, "skipGrant")->bval;
|
||||||
|
|
||||||
tsStartUdfd = cfgGetItem(pCfg, "udf")->bval;
|
tsStartUdfd = cfgGetItem(pCfg, "udf")->bval;
|
||||||
tstrncpy(tsUdfdResFuncs, cfgGetItem(pCfg, "udfdResFuncs")->str, sizeof(tsUdfdResFuncs));
|
tstrncpy(tsUdfdResFuncs, cfgGetItem(pCfg, "udfdResFuncs")->str, sizeof(tsUdfdResFuncs));
|
||||||
|
@ -902,7 +908,8 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
tsCheckpointInterval = cfgGetItem(pCfg, "checkpointInterval")->i64;
|
tsCheckpointInterval = cfgGetItem(pCfg, "checkpointInterval")->i64;
|
||||||
|
|
||||||
tsFilterScalarMode = cfgGetItem(pCfg, "filterScalarMode")->bval;
|
tsFilterScalarMode = cfgGetItem(pCfg, "filterScalarMode")->bval;
|
||||||
|
tsMaxStreamBackendCache = cfgGetItem(pCfg, "maxStreamBackendCache")->i32;
|
||||||
|
|
||||||
GRANT_CFG_GET;
|
GRANT_CFG_GET;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1044,7 +1051,7 @@ int32_t taosApplyLocalCfg(SConfig *pCfg, char *name) {
|
||||||
} else if (strcasecmp("maxNumOfDistinctRes", name) == 0) {
|
} else if (strcasecmp("maxNumOfDistinctRes", name) == 0) {
|
||||||
tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32;
|
tsMaxNumOfDistinctResults = cfgGetItem(pCfg, "maxNumOfDistinctRes")->i32;
|
||||||
} else if (strcasecmp("maxMemUsedByInsert", name) == 0) {
|
} else if (strcasecmp("maxMemUsedByInsert", name) == 0) {
|
||||||
tsMaxMemUsedByInsert = cfgGetItem(pCfg, "maxMemUsedByInsert")->i32;
|
tsMaxInsertBatchRows = cfgGetItem(pCfg, "maxInsertBatchRows")->i32;
|
||||||
} else if (strcasecmp("maxRetryWaitTime", name) == 0) {
|
} else if (strcasecmp("maxRetryWaitTime", name) == 0) {
|
||||||
tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32;
|
tsMaxRetryWaitTime = cfgGetItem(pCfg, "maxRetryWaitTime")->i32;
|
||||||
}
|
}
|
||||||
|
|
|
@ -4002,11 +4002,16 @@ int32_t tSerializeSCMCreateTopicReq(void *buf, int32_t bufLen, const SCMCreateTo
|
||||||
if (tEncodeI8(&encoder, pReq->withMeta) < 0) return -1;
|
if (tEncodeI8(&encoder, pReq->withMeta) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->subDbName) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->subDbName) < 0) return -1;
|
||||||
if (TOPIC_SUB_TYPE__DB == pReq->subType) {
|
if (TOPIC_SUB_TYPE__DB == pReq->subType) {
|
||||||
} else if (TOPIC_SUB_TYPE__TABLE == pReq->subType) {
|
|
||||||
if (tEncodeCStr(&encoder, pReq->subStbName) < 0) return -1;
|
|
||||||
} else {
|
} else {
|
||||||
if (tEncodeI32(&encoder, strlen(pReq->ast)) < 0) return -1;
|
if (TOPIC_SUB_TYPE__TABLE == pReq->subType) {
|
||||||
if (tEncodeCStr(&encoder, pReq->ast) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->subStbName) < 0) return -1;
|
||||||
|
}
|
||||||
|
if (pReq->ast && strlen(pReq->ast) > 0) {
|
||||||
|
if (tEncodeI32(&encoder, strlen(pReq->ast)) < 0) return -1;
|
||||||
|
if (tEncodeCStr(&encoder, pReq->ast) < 0) return -1;
|
||||||
|
} else {
|
||||||
|
if (tEncodeI32(&encoder, 0) < 0) return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (tEncodeI32(&encoder, strlen(pReq->sql)) < 0) return -1;
|
if (tEncodeI32(&encoder, strlen(pReq->sql)) < 0) return -1;
|
||||||
if (tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
if (tEncodeCStr(&encoder, pReq->sql) < 0) return -1;
|
||||||
|
@ -4032,9 +4037,10 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR
|
||||||
if (tDecodeI8(&decoder, &pReq->withMeta) < 0) return -1;
|
if (tDecodeI8(&decoder, &pReq->withMeta) < 0) return -1;
|
||||||
if (tDecodeCStrTo(&decoder, pReq->subDbName) < 0) return -1;
|
if (tDecodeCStrTo(&decoder, pReq->subDbName) < 0) return -1;
|
||||||
if (TOPIC_SUB_TYPE__DB == pReq->subType) {
|
if (TOPIC_SUB_TYPE__DB == pReq->subType) {
|
||||||
} else if (TOPIC_SUB_TYPE__TABLE == pReq->subType) {
|
|
||||||
if (tDecodeCStrTo(&decoder, pReq->subStbName) < 0) return -1;
|
|
||||||
} else {
|
} else {
|
||||||
|
if (TOPIC_SUB_TYPE__TABLE == pReq->subType) {
|
||||||
|
if (tDecodeCStrTo(&decoder, pReq->subStbName) < 0) return -1;
|
||||||
|
}
|
||||||
if (tDecodeI32(&decoder, &astLen) < 0) return -1;
|
if (tDecodeI32(&decoder, &astLen) < 0) return -1;
|
||||||
if (astLen > 0) {
|
if (astLen > 0) {
|
||||||
pReq->ast = taosMemoryCalloc(1, astLen + 1);
|
pReq->ast = taosMemoryCalloc(1, astLen + 1);
|
||||||
|
@ -4057,7 +4063,7 @@ int32_t tDeserializeSCMCreateTopicReq(void *buf, int32_t bufLen, SCMCreateTopicR
|
||||||
|
|
||||||
void tFreeSCMCreateTopicReq(SCMCreateTopicReq *pReq) {
|
void tFreeSCMCreateTopicReq(SCMCreateTopicReq *pReq) {
|
||||||
taosMemoryFreeClear(pReq->sql);
|
taosMemoryFreeClear(pReq->sql);
|
||||||
if (TOPIC_SUB_TYPE__COLUMN == pReq->subType) {
|
if (TOPIC_SUB_TYPE__DB != pReq->subType) {
|
||||||
taosMemoryFreeClear(pReq->ast);
|
taosMemoryFreeClear(pReq->ast);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -82,6 +82,7 @@ static int32_t parseLocaltime(char* timestr, int32_t len, int64_t* utime, int32_
|
||||||
static int32_t parseLocaltimeDst(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim);
|
static int32_t parseLocaltimeDst(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim);
|
||||||
static char* forwardToTimeStringEnd(char* str);
|
static char* forwardToTimeStringEnd(char* str);
|
||||||
static bool checkTzPresent(const char* str, int32_t len);
|
static bool checkTzPresent(const char* str, int32_t len);
|
||||||
|
static int32_t parseTimezone(char* str, int64_t* tzOffset);
|
||||||
|
|
||||||
static int32_t (*parseLocaltimeFp[])(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim) = {
|
static int32_t (*parseLocaltimeFp[])(char* timestr, int32_t len, int64_t* utime, int32_t timePrec, char delim) = {
|
||||||
parseLocaltime, parseLocaltimeDst};
|
parseLocaltime, parseLocaltimeDst};
|
||||||
|
@ -92,13 +93,13 @@ int32_t taosParseTime(const char* timestr, int64_t* utime, int32_t len, int32_t
|
||||||
if (checkTzPresent(timestr, len)) {
|
if (checkTzPresent(timestr, len)) {
|
||||||
return parseTimeWithTz(timestr, utime, timePrec, 'T');
|
return parseTimeWithTz(timestr, utime, timePrec, 'T');
|
||||||
} else {
|
} else {
|
||||||
return (*parseLocaltimeFp[day_light])((char*)timestr, len, utime, timePrec, 'T');
|
return parseLocaltimeDst((char*)timestr, len, utime, timePrec, 'T');
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (checkTzPresent(timestr, len)) {
|
if (checkTzPresent(timestr, len)) {
|
||||||
return parseTimeWithTz(timestr, utime, timePrec, 0);
|
return parseTimeWithTz(timestr, utime, timePrec, 0);
|
||||||
} else {
|
} else {
|
||||||
return (*parseLocaltimeFp[day_light])((char*)timestr, len, utime, timePrec, 0);
|
return parseLocaltimeDst((char*)timestr, len, utime, timePrec, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -713,16 +714,12 @@ int64_t taosTimeAdd(int64_t t, int64_t duration, char unit, int32_t precision) {
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unit != 'n' && unit != 'y') {
|
if (!IS_CALENDAR_TIME_DURATION(unit)) {
|
||||||
return t + duration;
|
return t + duration;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The following code handles the y/n time duration
|
// The following code handles the y/n time duration
|
||||||
int64_t numOfMonth = duration;
|
int64_t numOfMonth = (unit == 'y')? duration*12:duration;
|
||||||
if (unit == 'y') {
|
|
||||||
numOfMonth *= 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t fraction = t % TSDB_TICK_PER_SECOND(precision);
|
int64_t fraction = t % TSDB_TICK_PER_SECOND(precision);
|
||||||
|
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
|
@ -741,6 +738,7 @@ int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char
|
||||||
ekey = skey;
|
ekey = skey;
|
||||||
skey = tmp;
|
skey = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unit != 'n' && unit != 'y') {
|
if (unit != 'n' && unit != 'y') {
|
||||||
return (int32_t)((ekey - skey) / interval);
|
return (int32_t)((ekey - skey) / interval);
|
||||||
}
|
}
|
||||||
|
@ -764,13 +762,16 @@ int32_t taosTimeCountInterval(int64_t skey, int64_t ekey, int64_t interval, char
|
||||||
return (emon - smon) / (int32_t)interval;
|
return (emon - smon) / (int32_t)interval;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precision) {
|
int64_t taosTimeTruncate(int64_t ts, const SInterval* pInterval) {
|
||||||
if (pInterval->sliding == 0 && pInterval->interval == 0) {
|
if (pInterval->sliding == 0 && pInterval->interval == 0) {
|
||||||
return t;
|
return ts;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t start = t;
|
int64_t start = ts;
|
||||||
if (pInterval->slidingUnit == 'n' || pInterval->slidingUnit == 'y') {
|
int32_t precision = pInterval->precision;
|
||||||
|
|
||||||
|
if (IS_CALENDAR_TIME_DURATION(pInterval->slidingUnit)) {
|
||||||
|
|
||||||
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
start /= (int64_t)(TSDB_TICK_PER_SECOND(precision));
|
||||||
struct tm tm;
|
struct tm tm;
|
||||||
time_t tt = (time_t)start;
|
time_t tt = (time_t)start;
|
||||||
|
@ -792,44 +793,72 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
|
|
||||||
start = (int64_t)(taosMktime(&tm) * TSDB_TICK_PER_SECOND(precision));
|
start = (int64_t)(taosMktime(&tm) * TSDB_TICK_PER_SECOND(precision));
|
||||||
} else {
|
} else {
|
||||||
int64_t delta = t - pInterval->interval;
|
if (IS_CALENDAR_TIME_DURATION(pInterval->intervalUnit)) {
|
||||||
int32_t factor = (delta >= 0) ? 1 : -1;
|
int64_t news = (ts / pInterval->sliding) * pInterval->sliding;
|
||||||
|
ASSERT(news <= ts);
|
||||||
|
|
||||||
start = (delta / pInterval->sliding + factor) * pInterval->sliding;
|
if (news <= ts) {
|
||||||
|
int64_t prev = news;
|
||||||
|
int64_t newe = taosTimeAdd(news, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
||||||
|
|
||||||
if (pInterval->intervalUnit == 'd' || pInterval->intervalUnit == 'w') {
|
if (newe < ts) { // move towards the greater endpoint
|
||||||
/*
|
while(newe < ts && news < ts) {
|
||||||
* here we revised the start time of day according to the local time zone,
|
news += pInterval->sliding;
|
||||||
* but in case of DST, the start time of one day need to be dynamically decided.
|
newe = taosTimeAdd(news, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
||||||
*/
|
}
|
||||||
// todo refactor to extract function that is available for Linux/Windows/Mac platform
|
|
||||||
#if defined(WINDOWS) && _MSC_VER >= 1900
|
|
||||||
// see https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
|
|
||||||
int64_t timezone = _timezone;
|
|
||||||
int32_t daylight = _daylight;
|
|
||||||
char** tzname = _tzname;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
start += (int64_t)(timezone * TSDB_TICK_PER_SECOND(precision));
|
prev = news;
|
||||||
}
|
|
||||||
|
|
||||||
int64_t end = 0;
|
|
||||||
|
|
||||||
// not enough time range
|
|
||||||
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
|
||||||
end = taosTimeAdd(start, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
|
||||||
while (end < t) { // move forward to the correct time window
|
|
||||||
start += pInterval->sliding;
|
|
||||||
|
|
||||||
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
|
||||||
end = start + pInterval->interval - 1;
|
|
||||||
} else {
|
} else {
|
||||||
end = INT64_MAX;
|
while (newe >= ts) {
|
||||||
break;
|
prev = news;
|
||||||
|
news -= pInterval->sliding;
|
||||||
|
newe = taosTimeAdd(news, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return prev;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
end = INT64_MAX;
|
int64_t delta = ts - pInterval->interval;
|
||||||
|
int32_t factor = (delta >= 0) ? 1 : -1;
|
||||||
|
|
||||||
|
start = (delta / pInterval->sliding + factor) * pInterval->sliding;
|
||||||
|
|
||||||
|
if (pInterval->intervalUnit == 'd' || pInterval->intervalUnit == 'w') {
|
||||||
|
/*
|
||||||
|
* here we revised the start time of day according to the local time zone,
|
||||||
|
* but in case of DST, the start time of one day need to be dynamically decided.
|
||||||
|
*/
|
||||||
|
// todo refactor to extract function that is available for Linux/Windows/Mac platform
|
||||||
|
#if defined(WINDOWS) && _MSC_VER >= 1900
|
||||||
|
// see
|
||||||
|
// https://docs.microsoft.com/en-us/cpp/c-runtime-library/daylight-dstbias-timezone-and-tzname?view=vs-2019
|
||||||
|
int64_t timezone = _timezone;
|
||||||
|
int32_t daylight = _daylight;
|
||||||
|
char** tzname = _tzname;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
start += (int64_t)(timezone * TSDB_TICK_PER_SECOND(precision));
|
||||||
|
}
|
||||||
|
|
||||||
|
int64_t end = 0;
|
||||||
|
|
||||||
|
// not enough time range
|
||||||
|
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
||||||
|
end = taosTimeAdd(start, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
||||||
|
while (end < ts) { // move forward to the correct time window
|
||||||
|
start += pInterval->sliding;
|
||||||
|
|
||||||
|
if (start < 0 || INT64_MAX - start > pInterval->interval - 1) {
|
||||||
|
end = start + pInterval->interval - 1;
|
||||||
|
} else {
|
||||||
|
end = INT64_MAX;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
end = INT64_MAX;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -841,10 +870,10 @@ int64_t taosTimeTruncate(int64_t t, const SInterval* pInterval, int32_t precisio
|
||||||
// try to move current window to the left-hande-side, due to the offset effect.
|
// try to move current window to the left-hande-side, due to the offset effect.
|
||||||
int64_t end = taosTimeAdd(start, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
int64_t end = taosTimeAdd(start, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
||||||
|
|
||||||
int64_t newEnd = end;
|
int64_t newe = end;
|
||||||
while (newEnd >= t) {
|
while (newe >= ts) {
|
||||||
end = newEnd;
|
end = newe;
|
||||||
newEnd = taosTimeAdd(newEnd, -pInterval->sliding, pInterval->slidingUnit, precision);
|
newe = taosTimeAdd(newe, -pInterval->sliding, pInterval->slidingUnit, precision);
|
||||||
}
|
}
|
||||||
|
|
||||||
start = taosTimeAdd(end, -pInterval->interval, pInterval->intervalUnit, precision) + 1;
|
start = taosTimeAdd(end, -pInterval->interval, pInterval->intervalUnit, precision) + 1;
|
||||||
|
|
|
@ -78,7 +78,7 @@ static void vmProcessQueryQueue(SQueueInfo *pInfo, SRpcMsg *pMsg) {
|
||||||
int32_t code = vnodeProcessQueryMsg(pVnode->pImpl, pMsg);
|
int32_t code = vnodeProcessQueryMsg(pVnode->pImpl, pMsg);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
if (terrno != 0) code = terrno;
|
if (terrno != 0) code = terrno;
|
||||||
dGError("vgId:%d, msg:%p failed to query since %s", pVnode->vgId, pMsg, terrstr(code));
|
dGError("vgId:%d, msg:%p failed to query since %s", pVnode->vgId, pMsg, tstrerror(code));
|
||||||
vmSendRsp(pMsg, code);
|
vmSendRsp(pMsg, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -663,9 +663,10 @@ typedef struct {
|
||||||
char targetDb[TSDB_DB_FNAME_LEN];
|
char targetDb[TSDB_DB_FNAME_LEN];
|
||||||
char targetSTbName[TSDB_TABLE_FNAME_LEN];
|
char targetSTbName[TSDB_TABLE_FNAME_LEN];
|
||||||
int64_t targetStbUid;
|
int64_t targetStbUid;
|
||||||
int32_t fixedSinkVgId; // 0 for shuffle
|
|
||||||
// fixedSinkVg is not applicable for encode and decode
|
// fixedSinkVg is not applicable for encode and decode
|
||||||
SVgObj fixedSinkVg;
|
SVgObj fixedSinkVg;
|
||||||
|
int32_t fixedSinkVgId; // 0 for shuffle
|
||||||
|
|
||||||
// transformation
|
// transformation
|
||||||
char* sql;
|
char* sql;
|
||||||
|
|
|
@ -40,6 +40,8 @@ int32_t mndValidateUserPassInfo(SMnode *pMnode, SUserPassVersion *pUsers, int3
|
||||||
int32_t mndUserRemoveDb(SMnode *pMnode, STrans *pTrans, char *db);
|
int32_t mndUserRemoveDb(SMnode *pMnode, STrans *pTrans, char *db);
|
||||||
int32_t mndUserRemoveTopic(SMnode *pMnode, STrans *pTrans, char *topic);
|
int32_t mndUserRemoveTopic(SMnode *pMnode, STrans *pTrans, char *topic);
|
||||||
|
|
||||||
|
int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew);
|
||||||
|
void mndUserFreeObj(SUserObj *pUser);
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -446,7 +446,8 @@ static int32_t mndSetCreateDbUndoLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pD
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups) {
|
static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *pDb, SVgObj *pVgroups,
|
||||||
|
SUserObj *pUserDuped) {
|
||||||
SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
|
SSdbRaw *pDbRaw = mndDbActionEncode(pDb);
|
||||||
if (pDbRaw == NULL) return -1;
|
if (pDbRaw == NULL) return -1;
|
||||||
if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
|
if (mndTransAppendCommitlog(pTrans, pDbRaw) != 0) return -1;
|
||||||
|
@ -459,6 +460,13 @@ static int32_t mndSetCreateDbCommitLogs(SMnode *pMnode, STrans *pTrans, SDbObj *
|
||||||
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
|
if (sdbSetRawStatus(pVgRaw, SDB_STATUS_READY) != 0) return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (pUserDuped) {
|
||||||
|
SSdbRaw *pUserRaw = mndUserActionEncode(pUserDuped);
|
||||||
|
if (pUserRaw == NULL) return -1;
|
||||||
|
if (mndTransAppendCommitlog(pTrans, pUserRaw) != 0) return -1;
|
||||||
|
if (sdbSetRawStatus(pUserRaw, SDB_STATUS_READY) != 0) return -1;
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -565,6 +573,15 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate,
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// add database privileges for user
|
||||||
|
SUserObj newUserObj = {0}, *pNewUserDuped = NULL;
|
||||||
|
if (!pUser->superUser) {
|
||||||
|
if (mndUserDupObj(pUser, &newUserObj) != 0) goto _OVER;
|
||||||
|
taosHashPut(newUserObj.readDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN);
|
||||||
|
taosHashPut(newUserObj.writeDbs, dbObj.name, strlen(dbObj.name) + 1, dbObj.name, TSDB_FILENAME_LEN);
|
||||||
|
pNewUserDuped = &newUserObj;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t code = -1;
|
int32_t code = -1;
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "create-db");
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_RETRY, TRN_CONFLICT_DB, pReq, "create-db");
|
||||||
if (pTrans == NULL) goto _OVER;
|
if (pTrans == NULL) goto _OVER;
|
||||||
|
@ -577,7 +594,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate,
|
||||||
mndTransSetOper(pTrans, MND_OPER_CREATE_DB);
|
mndTransSetOper(pTrans, MND_OPER_CREATE_DB);
|
||||||
if (mndSetCreateDbRedoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbRedoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
if (mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbUndoLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
if (mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbCommitLogs(pMnode, pTrans, &dbObj, pVgroups, pNewUserDuped) != 0) goto _OVER;
|
||||||
if (mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbRedoActions(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
if (mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
if (mndSetCreateDbUndoActions(pMnode, pTrans, &dbObj, pVgroups) != 0) goto _OVER;
|
||||||
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
if (mndTransPrepare(pMnode, pTrans) != 0) goto _OVER;
|
||||||
|
@ -586,6 +603,7 @@ static int32_t mndCreateDb(SMnode *pMnode, SRpcMsg *pReq, SCreateDbReq *pCreate,
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
taosMemoryFree(pVgroups);
|
taosMemoryFree(pVgroups);
|
||||||
|
mndUserFreeObj(&newUserObj);
|
||||||
mndTransDrop(pTrans);
|
mndTransDrop(pTrans);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -929,7 +947,7 @@ static void mndDumpDbCfgInfo(SDbCfgRsp *cfgRsp, SDbObj *pDb) {
|
||||||
cfgRsp->walRetentionSize = pDb->cfg.walRetentionSize;
|
cfgRsp->walRetentionSize = pDb->cfg.walRetentionSize;
|
||||||
cfgRsp->walSegmentSize = pDb->cfg.walSegmentSize;
|
cfgRsp->walSegmentSize = pDb->cfg.walSegmentSize;
|
||||||
cfgRsp->numOfRetensions = pDb->cfg.numOfRetensions;
|
cfgRsp->numOfRetensions = pDb->cfg.numOfRetensions;
|
||||||
cfgRsp->pRetensions = pDb->cfg.pRetensions;
|
cfgRsp->pRetensions = taosArrayDup(pDb->cfg.pRetensions, NULL);
|
||||||
cfgRsp->schemaless = pDb->cfg.schemaless;
|
cfgRsp->schemaless = pDb->cfg.schemaless;
|
||||||
cfgRsp->sstTrigger = pDb->cfg.sstTrigger;
|
cfgRsp->sstTrigger = pDb->cfg.sstTrigger;
|
||||||
}
|
}
|
||||||
|
@ -972,6 +990,8 @@ static int32_t mndProcessGetDbCfgReq(SRpcMsg *pReq) {
|
||||||
|
|
||||||
_OVER:
|
_OVER:
|
||||||
|
|
||||||
|
tFreeSDbCfgRsp(&cfgRsp);
|
||||||
|
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
|
mError("db:%s, failed to get cfg since %s", cfgReq.db, terrstr());
|
||||||
}
|
}
|
||||||
|
|
|
@ -986,20 +986,20 @@ static int32_t mndProcessDropDnodeReq(SRpcMsg *pReq) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id);
|
int32_t numOfVnodes = mndGetVnodesNum(pMnode, pDnode->id);
|
||||||
if (numOfVnodes > 0 || pMObj != NULL || pSObj != NULL || pQObj != NULL) {
|
bool isonline = mndIsDnodeOnline(pDnode, taosGetTimestampMs());
|
||||||
bool isonline = mndIsDnodeOnline(pDnode, taosGetTimestampMs());
|
|
||||||
if (isonline && force) {
|
if (isonline && force) {
|
||||||
terrno = TSDB_CODE_DNODE_ONLY_USE_WHEN_OFFLINE;
|
terrno = TSDB_CODE_DNODE_ONLY_USE_WHEN_OFFLINE;
|
||||||
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, terrstr(),
|
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, terrstr(),
|
||||||
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
|
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
if (!isonline && !force) {
|
|
||||||
terrno = TSDB_CODE_DNODE_OFFLINE;
|
if (!isonline && !force) {
|
||||||
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, terrstr(),
|
terrno = TSDB_CODE_DNODE_OFFLINE;
|
||||||
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
|
mError("dnode:%d, failed to drop since %s, vnodes:%d mnode:%d qnode:%d snode:%d", pDnode->id, terrstr(),
|
||||||
goto _OVER;
|
numOfVnodes, pMObj != NULL, pQObj != NULL, pSObj != NULL);
|
||||||
}
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
code = mndDropDnode(pMnode, pReq, pDnode, pMObj, pQObj, pSObj, numOfVnodes, force, dropReq.unsafe);
|
code = mndDropDnode(pMnode, pReq, pDnode, pMObj, pQObj, pSObj, numOfVnodes, force, dropReq.unsafe);
|
||||||
|
|
|
@ -245,7 +245,7 @@ static int32_t mndProcessConnectReq(SRpcMsg *pReq) {
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1) != 0) {
|
if (strncmp(connReq.passwd, pUser->pass, TSDB_PASSWORD_LEN - 1) != 0 && !tsMndSkipGrant) {
|
||||||
mGError("user:%s, failed to login from %s since invalid pass, input:%s", pReq->info.conn.user, ip, connReq.passwd);
|
mGError("user:%s, failed to login from %s since invalid pass, input:%s", pReq->info.conn.user, ip, connReq.passwd);
|
||||||
code = TSDB_CODE_MND_AUTH_FAILURE;
|
code = TSDB_CODE_MND_AUTH_FAILURE;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
|
|
|
@ -14,18 +14,8 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "mndScheduler.h"
|
#include "mndScheduler.h"
|
||||||
#include "mndConsumer.h"
|
|
||||||
#include "mndDb.h"
|
#include "mndDb.h"
|
||||||
#include "mndDnode.h"
|
|
||||||
#include "mndMnode.h"
|
|
||||||
#include "mndShow.h"
|
|
||||||
#include "mndSnode.h"
|
#include "mndSnode.h"
|
||||||
#include "mndStb.h"
|
|
||||||
#include "mndStream.h"
|
|
||||||
#include "mndSubscribe.h"
|
|
||||||
#include "mndTopic.h"
|
|
||||||
#include "mndTrans.h"
|
|
||||||
#include "mndUser.h"
|
|
||||||
#include "mndVgroup.h"
|
#include "mndVgroup.h"
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
|
@ -34,12 +24,8 @@
|
||||||
|
|
||||||
extern bool tsDeployOnSnode;
|
extern bool tsDeployOnSnode;
|
||||||
|
|
||||||
static int32_t mndAddTaskToTaskSet(SArray* pArray, SStreamTask* pTask) {
|
static int32_t mndAddSinkTaskToStream(SStreamObj* pStream, SMnode* pMnode, int32_t vgId, SVgObj* pVgroup);
|
||||||
int32_t childId = taosArrayGetSize(pArray);
|
static void setFixedDownstreamEpInfo(SStreamTask* pDstTask, const SStreamTask* pTask);
|
||||||
pTask->selfChildId = childId;
|
|
||||||
taosArrayPush(pArray, &pTask);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t mndConvertRsmaTask(char** pDst, int32_t* pDstLen, const char* ast, int64_t uid, int8_t triggerType,
|
int32_t mndConvertRsmaTask(char** pDst, int32_t* pDstLen, const char* ast, int64_t uid, int8_t triggerType,
|
||||||
int64_t watermark, int64_t deleteMark) {
|
int64_t watermark, int64_t deleteMark) {
|
||||||
|
@ -97,7 +83,7 @@ END:
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndAddSinkToTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask) {
|
int32_t mndSetSinkTaskInfo(SStreamObj* pStream, SStreamTask* pTask) {
|
||||||
if (pStream->smaId != 0) {
|
if (pStream->smaId != 0) {
|
||||||
pTask->outputType = TASK_OUTPUT__SMA;
|
pTask->outputType = TASK_OUTPUT__SMA;
|
||||||
pTask->smaSink.smaId = pStream->smaId;
|
pTask->smaSink.smaId = pStream->smaId;
|
||||||
|
@ -106,16 +92,23 @@ int32_t mndAddSinkToTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask
|
||||||
pTask->tbSink.stbUid = pStream->targetStbUid;
|
pTask->tbSink.stbUid = pStream->targetStbUid;
|
||||||
memcpy(pTask->tbSink.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
memcpy(pTask->tbSink.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
||||||
pTask->tbSink.pSchemaWrapper = tCloneSSchemaWrapper(&pStream->outputSchema);
|
pTask->tbSink.pSchemaWrapper = tCloneSSchemaWrapper(&pStream->outputSchema);
|
||||||
|
if (pTask->tbSink.pSchemaWrapper == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask) {
|
#define SINK_NODE_LEVEL (0)
|
||||||
|
|
||||||
|
int32_t mndAddDispatcherForInnerTask(SMnode* pMnode, SStreamObj* pStream, SStreamTask* pTask) {
|
||||||
bool isShuffle = false;
|
bool isShuffle = false;
|
||||||
|
|
||||||
if (pStream->fixedSinkVgId == 0) {
|
if (pStream->fixedSinkVgId == 0) {
|
||||||
SDbObj* pDb = mndAcquireDb(pMnode, pStream->targetDb);
|
SDbObj* pDb = mndAcquireDb(pMnode, pStream->targetDb);
|
||||||
if (pDb != NULL && pDb->cfg.numOfVgroups > 1) {
|
if (pDb != NULL && pDb->cfg.numOfVgroups > 1) {
|
||||||
|
|
||||||
isShuffle = true;
|
isShuffle = true;
|
||||||
pTask->outputType = TASK_OUTPUT__SHUFFLE_DISPATCH;
|
pTask->outputType = TASK_OUTPUT__SHUFFLE_DISPATCH;
|
||||||
pTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
pTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
||||||
|
@ -127,47 +120,46 @@ int32_t mndAddDispatcherToInnerTask(SMnode* pMnode, SStreamObj* pStream, SStream
|
||||||
sdbRelease(pMnode->pSdb, pDb);
|
sdbRelease(pMnode->pSdb, pDb);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SArray* pSinkNodeList = taosArrayGetP(pStream->tasks, SINK_NODE_LEVEL);
|
||||||
|
int32_t numOfSinkNodes = taosArrayGetSize(pSinkNodeList);
|
||||||
|
|
||||||
if (isShuffle) {
|
if (isShuffle) {
|
||||||
memcpy(pTask->shuffleDispatcher.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
memcpy(pTask->shuffleDispatcher.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
||||||
SArray* pVgs = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
SArray* pVgs = pTask->shuffleDispatcher.dbInfo.pVgroupInfos;
|
||||||
int32_t sz = taosArrayGetSize(pVgs);
|
|
||||||
SArray* sinkLv = taosArrayGetP(pStream->tasks, 0);
|
int32_t numOfVgroups = taosArrayGetSize(pVgs);
|
||||||
int32_t sinkLvSize = taosArrayGetSize(sinkLv);
|
for (int32_t i = 0; i < numOfVgroups; i++) {
|
||||||
for (int32_t i = 0; i < sz; i++) {
|
|
||||||
SVgroupInfo* pVgInfo = taosArrayGet(pVgs, i);
|
SVgroupInfo* pVgInfo = taosArrayGet(pVgs, i);
|
||||||
for (int32_t j = 0; j < sinkLvSize; j++) {
|
|
||||||
SStreamTask* pLastLevelTask = taosArrayGetP(sinkLv, j);
|
for (int32_t j = 0; j < numOfSinkNodes; j++) {
|
||||||
if (pLastLevelTask->nodeId == pVgInfo->vgId) {
|
SStreamTask* pSinkTask = taosArrayGetP(pSinkNodeList, j);
|
||||||
pVgInfo->taskId = pLastLevelTask->id.taskId;
|
if (pSinkTask->nodeId == pVgInfo->vgId) {
|
||||||
|
pVgInfo->taskId = pSinkTask->id.taskId;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pTask->outputType = TASK_OUTPUT__FIXED_DISPATCH;
|
SStreamTask* pOneSinkTask = taosArrayGetP(pSinkNodeList, 0);
|
||||||
pTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
setFixedDownstreamEpInfo(pTask, pOneSinkTask);
|
||||||
SArray* pArray = taosArrayGetP(pStream->tasks, 0);
|
|
||||||
// one sink only
|
|
||||||
SStreamTask* lastLevelTask = taosArrayGetP(pArray, 0);
|
|
||||||
pTask->fixedEpDispatcher.taskId = lastLevelTask->id.taskId;
|
|
||||||
pTask->fixedEpDispatcher.nodeId = lastLevelTask->nodeId;
|
|
||||||
pTask->fixedEpDispatcher.epSet = lastLevelTask->epSet;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndAssignTaskToVg(SMnode* pMnode, SStreamTask* pTask, SSubplan* plan, const SVgObj* pVgroup) {
|
int32_t mndAssignStreamTaskToVgroup(SMnode* pMnode, SStreamTask* pTask, SSubplan* plan, const SVgObj* pVgroup) {
|
||||||
int32_t msgLen;
|
int32_t msgLen;
|
||||||
|
|
||||||
pTask->nodeId = pVgroup->vgId;
|
pTask->nodeId = pVgroup->vgId;
|
||||||
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
||||||
|
|
||||||
plan->execNode.nodeId = pVgroup->vgId;
|
plan->execNode.nodeId = pTask->nodeId;
|
||||||
plan->execNode.epSet = pTask->epSet;
|
plan->execNode.epSet = pTask->epSet;
|
||||||
|
|
||||||
if (qSubPlanToString(plan, &pTask->exec.qmsg, &msgLen) < 0) {
|
if (qSubPlanToString(plan, &pTask->exec.qmsg, &msgLen) < 0) {
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -210,100 +202,121 @@ SVgObj* mndSchedFetchOneVg(SMnode* pMnode, int64_t dbUid) {
|
||||||
return pVgroup;
|
return pVgroup;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// create sink node for each vgroup.
|
||||||
int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
|
int32_t mndAddShuffleSinkTasksToStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
SSdb* pSdb = pMnode->pSdb;
|
SSdb* pSdb = pMnode->pSdb;
|
||||||
void* pIter = NULL;
|
void* pIter = NULL;
|
||||||
SArray* tasks = taosArrayGetP(pStream->tasks, 0);
|
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SVgObj* pVgroup = NULL;
|
SVgObj* pVgroup = NULL;
|
||||||
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!mndVgroupInDb(pVgroup, pStream->targetDbUid)) {
|
if (!mndVgroupInDb(pVgroup, pStream->targetDbUid)) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamTask* pTask = tNewStreamTask(pStream->uid);
|
mndAddSinkTaskToStream(pStream, pMnode, pVgroup->vgId, pVgroup);
|
||||||
if (pTask == NULL) {
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pTask->fillHistory = pStream->fillHistory;
|
|
||||||
mndAddTaskToTaskSet(tasks, pTask);
|
|
||||||
|
|
||||||
pTask->nodeId = pVgroup->vgId;
|
|
||||||
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
|
||||||
|
|
||||||
// type
|
|
||||||
pTask->taskLevel = TASK_LEVEL__SINK;
|
|
||||||
|
|
||||||
// sink
|
|
||||||
if (pStream->smaId != 0) {
|
|
||||||
pTask->outputType = TASK_OUTPUT__SMA;
|
|
||||||
pTask->smaSink.smaId = pStream->smaId;
|
|
||||||
} else {
|
|
||||||
pTask->outputType = TASK_OUTPUT__TABLE;
|
|
||||||
pTask->tbSink.stbUid = pStream->targetStbUid;
|
|
||||||
memcpy(pTask->tbSink.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
|
||||||
pTask->tbSink.pSchemaWrapper = tCloneSSchemaWrapper(&pStream->outputSchema);
|
|
||||||
if (pTask->tbSink.pSchemaWrapper == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t mndAddFixedSinkTaskToStream(SMnode* pMnode, SStreamObj* pStream) {
|
int32_t mndAddSinkTaskToStream(SStreamObj* pStream, SMnode* pMnode, int32_t vgId, SVgObj* pVgroup) {
|
||||||
SArray* tasks = taosArrayGetP(pStream->tasks, 0);
|
SArray* pTaskList = taosArrayGetP(pStream->tasks, SINK_NODE_LEVEL);
|
||||||
SStreamTask* pTask = tNewStreamTask(pStream->uid);
|
|
||||||
|
SStreamTask* pTask = tNewStreamTask(pStream->uid, TASK_LEVEL__SINK, pStream->fillHistory, 0, pTaskList);
|
||||||
if (pTask == NULL) {
|
if (pTask == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pTask->fillHistory = pStream->fillHistory;
|
|
||||||
mndAddTaskToTaskSet(tasks, pTask);
|
|
||||||
|
|
||||||
pTask->nodeId = pStream->fixedSinkVgId;
|
pTask->nodeId = vgId;
|
||||||
#if 0
|
|
||||||
SVgObj* pVgroup = mndAcquireVgroup(pMnode, pStream->fixedSinkVgId);
|
|
||||||
if (pVgroup == NULL) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
pTask->epSet = mndGetVgroupEpset(pMnode, pVgroup);
|
||||||
#endif
|
mndSetSinkTaskInfo(pStream, pTask);
|
||||||
pTask->epSet = mndGetVgroupEpset(pMnode, &pStream->fixedSinkVg);
|
|
||||||
|
|
||||||
pTask->taskLevel = TASK_LEVEL__SINK;
|
|
||||||
|
|
||||||
// sink
|
|
||||||
if (pStream->smaId != 0) {
|
|
||||||
pTask->outputType = TASK_OUTPUT__SMA;
|
|
||||||
pTask->smaSink.smaId = pStream->smaId;
|
|
||||||
} else {
|
|
||||||
pTask->outputType = TASK_OUTPUT__TABLE;
|
|
||||||
pTask->tbSink.stbUid = pStream->targetStbUid;
|
|
||||||
memcpy(pTask->tbSink.stbFullName, pStream->targetSTbName, TSDB_TABLE_FNAME_LEN);
|
|
||||||
pTask->tbSink.pSchemaWrapper = tCloneSSchemaWrapper(&pStream->outputSchema);
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mndScheduleFillHistoryStreamTask(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t addSourceStreamTask(SMnode* pMnode, SVgObj* pVgroup, SArray* pTaskList, SStreamObj* pStream,
|
||||||
|
SSubplan* plan, uint64_t uid, int8_t taskLevel, int8_t fillHistory,
|
||||||
|
bool hasExtraSink) {
|
||||||
|
SStreamTask* pTask = tNewStreamTask(uid, taskLevel, fillHistory, pStream->triggerParam, pTaskList);
|
||||||
|
if (pTask == NULL) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
// sink or dispatch
|
||||||
|
if (hasExtraSink) {
|
||||||
|
mndAddDispatcherForInnerTask(pMnode, pStream, pTask);
|
||||||
|
} else {
|
||||||
|
mndSetSinkTaskInfo(pStream, pTask);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mndAssignStreamTaskToVgroup(pMnode, pTask, plan, pVgroup) < 0) {
|
||||||
|
return terrno;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SStreamChildEpInfo* createStreamTaskEpInfo(SStreamTask* pTask) {
|
||||||
|
SStreamChildEpInfo* pEpInfo = taosMemoryMalloc(sizeof(SStreamChildEpInfo));
|
||||||
|
if (pEpInfo == NULL) {
|
||||||
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
pEpInfo->childId = pTask->selfChildId;
|
||||||
|
pEpInfo->epSet = pTask->epSet;
|
||||||
|
pEpInfo->nodeId = pTask->nodeId;
|
||||||
|
pEpInfo->taskId = pTask->id.taskId;
|
||||||
|
|
||||||
|
return pEpInfo;
|
||||||
|
}
|
||||||
|
|
||||||
|
void setFixedDownstreamEpInfo(SStreamTask* pDstTask, const SStreamTask* pTask) {
|
||||||
|
STaskDispatcherFixedEp* pDispatcher = &pDstTask->fixedEpDispatcher;
|
||||||
|
pDispatcher->taskId = pTask->id.taskId;
|
||||||
|
pDispatcher->nodeId = pTask->nodeId;
|
||||||
|
pDispatcher->epSet = pTask->epSet;
|
||||||
|
|
||||||
|
pDstTask->outputType = TASK_OUTPUT__FIXED_DISPATCH;
|
||||||
|
pDstTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t appendToUpstream(SStreamTask* pTask, SStreamTask* pUpstream) {
|
||||||
|
SStreamChildEpInfo* pEpInfo = createStreamTaskEpInfo(pTask);
|
||||||
|
if (pEpInfo == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pUpstream->childEpInfo == NULL) {
|
||||||
|
pUpstream->childEpInfo = taosArrayInit(4, POINTER_BYTES);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayPush(pUpstream->childEpInfo, &pEpInfo);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
SSdb* pSdb = pMnode->pSdb;
|
SSdb* pSdb = pMnode->pSdb;
|
||||||
|
|
||||||
SQueryPlan* pPlan = qStringToQueryPlan(pStream->physicalPlan);
|
SQueryPlan* pPlan = qStringToQueryPlan(pStream->physicalPlan);
|
||||||
if (pPlan == NULL) {
|
if (pPlan == NULL) {
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
int32_t planTotLevel = LIST_LENGTH(pPlan->pSubplans);
|
|
||||||
|
|
||||||
pStream->tasks = taosArrayInit(planTotLevel, sizeof(void*));
|
int32_t planTotLevel = LIST_LENGTH(pPlan->pSubplans);
|
||||||
|
pStream->tasks = taosArrayInit(planTotLevel, POINTER_BYTES);
|
||||||
|
|
||||||
bool hasExtraSink = false;
|
bool hasExtraSink = false;
|
||||||
bool externalTargetDB = strcmp(pStream->sourceDb, pStream->targetDb) != 0;
|
bool externalTargetDB = strcmp(pStream->sourceDb, pStream->targetDb) != 0;
|
||||||
|
@ -313,13 +326,13 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool multiTarget = pDbObj->cfg.numOfVgroups > 1;
|
bool multiTarget = (pDbObj->cfg.numOfVgroups > 1);
|
||||||
sdbRelease(pSdb, pDbObj);
|
sdbRelease(pSdb, pDbObj);
|
||||||
|
|
||||||
if (planTotLevel == 2 || externalTargetDB || multiTarget || pStream->fixedSinkVgId) {
|
if (planTotLevel == 2 || externalTargetDB || multiTarget || pStream->fixedSinkVgId) {
|
||||||
/*if (true) {*/
|
SArray* taskOneLevel = taosArrayInit(0, POINTER_BYTES);
|
||||||
SArray* taskOneLevel = taosArrayInit(0, sizeof(void*));
|
|
||||||
taosArrayPush(pStream->tasks, &taskOneLevel);
|
taosArrayPush(pStream->tasks, &taskOneLevel);
|
||||||
|
|
||||||
// add extra sink
|
// add extra sink
|
||||||
hasExtraSink = true;
|
hasExtraSink = true;
|
||||||
if (pStream->fixedSinkVgId == 0) {
|
if (pStream->fixedSinkVgId == 0) {
|
||||||
|
@ -328,19 +341,20 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
if (mndAddFixedSinkTaskToStream(pMnode, pStream) < 0) {
|
if (mndAddSinkTaskToStream(pStream, pMnode, pStream->fixedSinkVgId, &pStream->fixedSinkVg) < 0) {
|
||||||
// TODO free
|
// TODO free
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pStream->totalLevel = planTotLevel + hasExtraSink;
|
pStream->totalLevel = planTotLevel + hasExtraSink;
|
||||||
|
|
||||||
if (planTotLevel > 1) {
|
if (planTotLevel > 1) {
|
||||||
SStreamTask* pInnerTask;
|
SStreamTask* pInnerTask;
|
||||||
// inner level
|
// inner level
|
||||||
{
|
{
|
||||||
SArray* taskInnerLevel = taosArrayInit(0, sizeof(void*));
|
SArray* taskInnerLevel = taosArrayInit(0, POINTER_BYTES);
|
||||||
taosArrayPush(pStream->tasks, &taskInnerLevel);
|
taosArrayPush(pStream->tasks, &taskInnerLevel);
|
||||||
|
|
||||||
SNodeListNode* inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 0);
|
SNodeListNode* inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 0);
|
||||||
|
@ -350,25 +364,15 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInnerTask = tNewStreamTask(pStream->uid);
|
pInnerTask = tNewStreamTask(pStream->uid, TASK_LEVEL__AGG, pStream->fillHistory, pStream->triggerParam, taskInnerLevel);
|
||||||
if (pInnerTask == NULL) {
|
if (pInnerTask == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInnerTask->fillHistory = pStream->fillHistory;
|
|
||||||
mndAddTaskToTaskSet(taskInnerLevel, pInnerTask);
|
|
||||||
|
|
||||||
pInnerTask->childEpInfo = taosArrayInit(0, sizeof(void*));
|
|
||||||
|
|
||||||
pInnerTask->taskLevel = TASK_LEVEL__AGG;
|
|
||||||
|
|
||||||
// trigger
|
|
||||||
pInnerTask->triggerParam = pStream->triggerParam;
|
|
||||||
|
|
||||||
// dispatch
|
// dispatch
|
||||||
if (mndAddDispatcherToInnerTask(pMnode, pStream, pInnerTask) < 0) {
|
if (mndAddDispatcherForInnerTask(pMnode, pStream, pInnerTask) < 0) {
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -377,7 +381,7 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
SSnodeObj* pSnode = mndSchedFetchOneSnode(pMnode);
|
SSnodeObj* pSnode = mndSchedFetchOneSnode(pMnode);
|
||||||
if (pSnode == NULL) {
|
if (pSnode == NULL) {
|
||||||
SVgObj* pVgroup = mndSchedFetchOneVg(pMnode, pStream->sourceDbUid);
|
SVgObj* pVgroup = mndSchedFetchOneVg(pMnode, pStream->sourceDbUid);
|
||||||
if (mndAssignTaskToVg(pMnode, pInnerTask, plan, pVgroup) < 0) {
|
if (mndAssignStreamTaskToVgroup(pMnode, pInnerTask, plan, pVgroup) < 0) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -392,17 +396,18 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
SVgObj* pVgroup = mndSchedFetchOneVg(pMnode, pStream->sourceDbUid);
|
SVgObj* pVgroup = mndSchedFetchOneVg(pMnode, pStream->sourceDbUid);
|
||||||
if (mndAssignTaskToVg(pMnode, pInnerTask, plan, pVgroup) < 0) {
|
if (mndAssignStreamTaskToVgroup(pMnode, pInnerTask, plan, pVgroup) < 0) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// source level
|
// source level
|
||||||
SArray* taskSourceLevel = taosArrayInit(0, sizeof(void*));
|
SArray* taskSourceLevel = taosArrayInit(0, POINTER_BYTES);
|
||||||
taosArrayPush(pStream->tasks, &taskSourceLevel);
|
taosArrayPush(pStream->tasks, &taskSourceLevel);
|
||||||
|
|
||||||
SNodeListNode* inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 1);
|
SNodeListNode* inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 1);
|
||||||
|
@ -416,66 +421,52 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
while (1) {
|
while (1) {
|
||||||
SVgObj* pVgroup;
|
SVgObj* pVgroup;
|
||||||
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!mndVgroupInDb(pVgroup, pStream->sourceDbUid)) {
|
if (!mndVgroupInDb(pVgroup, pStream->sourceDbUid)) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamTask* pTask = tNewStreamTask(pStream->uid);
|
SStreamTask* pTask = tNewStreamTask(pStream->uid, TASK_LEVEL__SOURCE, pStream->fillHistory, 0, taskSourceLevel);
|
||||||
if (pTask == NULL) {
|
if (pTask == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
pTask->fillHistory = pStream->fillHistory;
|
|
||||||
mndAddTaskToTaskSet(taskSourceLevel, pTask);
|
|
||||||
|
|
||||||
pTask->triggerParam = 0;
|
// all the source tasks dispatch result to a single agg node.
|
||||||
|
setFixedDownstreamEpInfo(pTask, pInnerTask);
|
||||||
|
|
||||||
// source
|
if (mndAssignStreamTaskToVgroup(pMnode, pTask, plan, pVgroup) < 0) {
|
||||||
pTask->taskLevel = TASK_LEVEL__SOURCE;
|
|
||||||
|
|
||||||
// add fixed vg dispatch
|
|
||||||
pTask->dispatchMsgType = TDMT_STREAM_TASK_DISPATCH;
|
|
||||||
pTask->outputType = TASK_OUTPUT__FIXED_DISPATCH;
|
|
||||||
|
|
||||||
pTask->fixedEpDispatcher.taskId = pInnerTask->id.taskId;
|
|
||||||
pTask->fixedEpDispatcher.nodeId = pInnerTask->nodeId;
|
|
||||||
pTask->fixedEpDispatcher.epSet = pInnerTask->epSet;
|
|
||||||
|
|
||||||
if (mndAssignTaskToVg(pMnode, pTask, plan, pVgroup) < 0) {
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamChildEpInfo* pEpInfo = taosMemoryMalloc(sizeof(SStreamChildEpInfo));
|
int32_t code = appendToUpstream(pTask, pInnerTask);
|
||||||
if (pEpInfo == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
|
||||||
qDestroyQueryPlan(pPlan);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pEpInfo->childId = pTask->selfChildId;
|
|
||||||
pEpInfo->epSet = pTask->epSet;
|
|
||||||
pEpInfo->nodeId = pTask->nodeId;
|
|
||||||
pEpInfo->taskId = pTask->id.taskId;
|
|
||||||
taosArrayPush(pInnerTask->childEpInfo, &pEpInfo);
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (planTotLevel == 1) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
SArray* taskOneLevel = taosArrayInit(0, sizeof(void*));
|
terrno = code;
|
||||||
taosArrayPush(pStream->tasks, &taskOneLevel);
|
qDestroyQueryPlan(pPlan);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (planTotLevel == 1) {
|
||||||
|
// create exec stream task, since only one level, the exec task is also the source task
|
||||||
|
SArray* pTaskList = taosArrayInit(0, POINTER_BYTES);
|
||||||
|
taosArrayPush(pStream->tasks, &pTaskList);
|
||||||
|
|
||||||
SNodeListNode* inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 0);
|
SNodeListNode* inner = (SNodeListNode*)nodesListGetNode(pPlan->pSubplans, 0);
|
||||||
if (LIST_LENGTH(inner->pNodeList) != 1) {
|
if (LIST_LENGTH(inner->pNodeList) != 1) {
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
SSubplan* plan = (SSubplan*)nodesListGetNode(inner->pNodeList, 0);
|
SSubplan* plan = (SSubplan*)nodesListGetNode(inner->pNodeList, 0);
|
||||||
if (plan->subplanType != SUBPLAN_TYPE_SCAN) {
|
if (plan->subplanType != SUBPLAN_TYPE_SCAN) {
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
|
@ -486,42 +477,26 @@ int32_t mndScheduleStream(SMnode* pMnode, SStreamObj* pStream) {
|
||||||
while (1) {
|
while (1) {
|
||||||
SVgObj* pVgroup;
|
SVgObj* pVgroup;
|
||||||
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
pIter = sdbFetch(pSdb, SDB_VGROUP, pIter, (void**)&pVgroup);
|
||||||
if (pIter == NULL) break;
|
if (pIter == NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
if (!mndVgroupInDb(pVgroup, pStream->sourceDbUid)) {
|
if (!mndVgroupInDb(pVgroup, pStream->sourceDbUid)) {
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
SStreamTask* pTask = tNewStreamTask(pStream->uid);
|
// new stream task
|
||||||
if (pTask == NULL) {
|
int32_t code = addSourceStreamTask(pMnode, pVgroup, pTaskList, pStream, plan, pStream->uid, TASK_LEVEL__SOURCE, pStream->fillHistory, hasExtraSink);
|
||||||
sdbRelease(pSdb, pVgroup);
|
|
||||||
qDestroyQueryPlan(pPlan);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
pTask->fillHistory = pStream->fillHistory;
|
|
||||||
mndAddTaskToTaskSet(taskOneLevel, pTask);
|
|
||||||
|
|
||||||
// source
|
|
||||||
pTask->taskLevel = TASK_LEVEL__SOURCE;
|
|
||||||
|
|
||||||
// trigger
|
|
||||||
pTask->triggerParam = pStream->triggerParam;
|
|
||||||
|
|
||||||
// sink or dispatch
|
|
||||||
if (hasExtraSink) {
|
|
||||||
mndAddDispatcherToInnerTask(pMnode, pStream, pTask);
|
|
||||||
} else {
|
|
||||||
mndAddSinkToTask(pMnode, pStream, pTask);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mndAssignTaskToVg(pMnode, pTask, plan, pVgroup) < 0) {
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
|
||||||
qDestroyQueryPlan(pPlan);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
sdbRelease(pSdb, pVgroup);
|
sdbRelease(pSdb, pVgroup);
|
||||||
|
|
||||||
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
qDestroyQueryPlan(pPlan);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -538,7 +513,23 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib
|
||||||
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
terrno = TSDB_CODE_QRY_INVALID_INPUT;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
}else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE && pTopic->ast != NULL){
|
||||||
|
SNode *pAst = NULL;
|
||||||
|
if (nodesStringToNode(pTopic->ast, &pAst) != 0) {
|
||||||
|
mError("topic:%s, failed to create since %s", pTopic->name, terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
SPlanContext cxt = {.pAstRoot = pAst, .topicQuery = true};
|
||||||
|
if (qCreateQueryPlan(&cxt, &pPlan, NULL) != 0) {
|
||||||
|
mError("failed to create topic:%s since %s", pTopic->name, terrstr());
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(pPlan){
|
||||||
int32_t levelNum = LIST_LENGTH(pPlan->pSubplans);
|
int32_t levelNum = LIST_LENGTH(pPlan->pSubplans);
|
||||||
if (levelNum != 1) {
|
if (levelNum != 1) {
|
||||||
qDestroyQueryPlan(pPlan);
|
qDestroyQueryPlan(pPlan);
|
||||||
|
@ -579,7 +570,7 @@ int32_t mndSchedInitSubEp(SMnode* pMnode, const SMqTopicObj* pTopic, SMqSubscrib
|
||||||
|
|
||||||
mDebug("init subscription %s for topic:%s assign vgId:%d", pSub->key, pTopic->name, pVgEp->vgId);
|
mDebug("init subscription %s for topic:%s assign vgId:%d", pSub->key, pTopic->name, pVgEp->vgId);
|
||||||
|
|
||||||
if (pTopic->subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pSubplan) {
|
||||||
int32_t msgLen;
|
int32_t msgLen;
|
||||||
|
|
||||||
pSubplan->execNode.epSet = pVgEp->epSet;
|
pSubplan->execNode.epSet = pVgEp->epSet;
|
||||||
|
|
|
@ -1230,7 +1230,7 @@ static int32_t mndCheckAlterColForTopic(SMnode *pMnode, const char *stbFullName,
|
||||||
|
|
||||||
mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s",
|
mInfo("topic:%s, check tag and column modifiable, stb:%s suid:%" PRId64 " colId:%d, subType:%d sql:%s",
|
||||||
pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql);
|
pTopic->name, stbFullName, suid, colId, pTopic->subType, pTopic->sql);
|
||||||
if (pTopic->subType != TOPIC_SUB_TYPE__COLUMN) {
|
if (pTopic->ast == NULL) {
|
||||||
sdbRelease(pSdb, pTopic);
|
sdbRelease(pSdb, pTopic);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -2272,7 +2272,7 @@ static int32_t mndCheckDropStbForTopic(SMnode *pMnode, const char *stbFullName,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pTopic->subType != TOPIC_SUB_TYPE__COLUMN) {
|
if (pTopic->ast == NULL) {
|
||||||
sdbRelease(pSdb, pTopic);
|
sdbRelease(pSdb, pTopic);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
|
@ -700,6 +700,7 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) {
|
||||||
if (pStream->sourceDbUid == streamObj.sourceDbUid) {
|
if (pStream->sourceDbUid == streamObj.sourceDbUid) {
|
||||||
++numOfStream;
|
++numOfStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
sdbRelease(pMnode->pSdb, pStream);
|
sdbRelease(pMnode->pSdb, pStream);
|
||||||
if (numOfStream > MND_STREAM_MAX_NUM) {
|
if (numOfStream > MND_STREAM_MAX_NUM) {
|
||||||
mError("too many streams, no more than %d for each database", MND_STREAM_MAX_NUM);
|
mError("too many streams, no more than %d for each database", MND_STREAM_MAX_NUM);
|
||||||
|
@ -723,6 +724,7 @@ static int32_t mndProcessCreateStreamReq(SRpcMsg *pReq) {
|
||||||
pDb = NULL;
|
pDb = NULL;
|
||||||
goto _OVER;
|
goto _OVER;
|
||||||
}
|
}
|
||||||
|
|
||||||
mndReleaseDb(pMnode, pDb);
|
mndReleaseDb(pMnode, pDb);
|
||||||
|
|
||||||
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stream");
|
STrans *pTrans = mndTransCreate(pMnode, TRN_POLICY_ROLLBACK, TRN_CONFLICT_DB_INSIDE, pReq, "create-stream");
|
||||||
|
|
|
@ -111,7 +111,14 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscri
|
||||||
req.suid = pSub->stbUid;
|
req.suid = pSub->stbUid;
|
||||||
tstrncpy(req.subKey, pSub->key, TSDB_SUBSCRIBE_KEY_LEN);
|
tstrncpy(req.subKey, pSub->key, TSDB_SUBSCRIBE_KEY_LEN);
|
||||||
|
|
||||||
int32_t tlen = sizeof(SMsgHead) + tEncodeSMqRebVgReq(NULL, &req);
|
int32_t tlen = 0;
|
||||||
|
int32_t ret = 0;
|
||||||
|
tEncodeSize(tEncodeSMqRebVgReq, &req, tlen, ret);
|
||||||
|
if (ret < 0) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
tlen += sizeof(SMsgHead);
|
||||||
void *buf = taosMemoryMalloc(tlen);
|
void *buf = taosMemoryMalloc(tlen);
|
||||||
if (buf == NULL) {
|
if (buf == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -123,8 +130,14 @@ static int32_t mndBuildSubChangeReq(void **pBuf, int32_t *pLen, const SMqSubscri
|
||||||
pMsgHead->contLen = htonl(tlen);
|
pMsgHead->contLen = htonl(tlen);
|
||||||
pMsgHead->vgId = htonl(pRebVg->pVgEp->vgId);
|
pMsgHead->vgId = htonl(pRebVg->pVgEp->vgId);
|
||||||
|
|
||||||
void *abuf = POINTER_SHIFT(buf, sizeof(SMsgHead));
|
SEncoder encoder = {0};
|
||||||
tEncodeSMqRebVgReq(&abuf, &req);
|
tEncoderInit(&encoder, POINTER_SHIFT(buf, sizeof(SMsgHead)), tlen);
|
||||||
|
if (tEncodeSMqRebVgReq(&encoder, &req) < 0) {
|
||||||
|
taosMemoryFreeClear(buf);
|
||||||
|
tEncoderClear(&encoder);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
tEncoderClear(&encoder);
|
||||||
*pBuf = buf;
|
*pBuf = buf;
|
||||||
*pLen = tlen;
|
*pLen = tlen;
|
||||||
|
|
||||||
|
|
|
@ -28,7 +28,7 @@
|
||||||
#include "parser.h"
|
#include "parser.h"
|
||||||
#include "tname.h"
|
#include "tname.h"
|
||||||
|
|
||||||
#define MND_TOPIC_VER_NUMBER 2
|
#define MND_TOPIC_VER_NUMBER 3
|
||||||
#define MND_TOPIC_RESERVE_SIZE 64
|
#define MND_TOPIC_RESERVE_SIZE 64
|
||||||
|
|
||||||
SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic);
|
SSdbRaw *mndTopicActionEncode(SMqTopicObj *pTopic);
|
||||||
|
@ -170,7 +170,7 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
|
||||||
int8_t sver = 0;
|
int8_t sver = 0;
|
||||||
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto TOPIC_DECODE_OVER;
|
if (sdbGetRawSoftVer(pRaw, &sver) != 0) goto TOPIC_DECODE_OVER;
|
||||||
|
|
||||||
if (sver != 1 && sver != 2) {
|
if (sver < 1 || sver > MND_TOPIC_VER_NUMBER) {
|
||||||
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
|
terrno = TSDB_CODE_SDB_INVALID_DATA_VER;
|
||||||
goto TOPIC_DECODE_OVER;
|
goto TOPIC_DECODE_OVER;
|
||||||
}
|
}
|
||||||
|
@ -197,7 +197,9 @@ SSdbRow *mndTopicActionDecode(SSdbRaw *pRaw) {
|
||||||
SDB_GET_INT8(pRaw, dataPos, &pTopic->withMeta, TOPIC_DECODE_OVER);
|
SDB_GET_INT8(pRaw, dataPos, &pTopic->withMeta, TOPIC_DECODE_OVER);
|
||||||
|
|
||||||
SDB_GET_INT64(pRaw, dataPos, &pTopic->stbUid, TOPIC_DECODE_OVER);
|
SDB_GET_INT64(pRaw, dataPos, &pTopic->stbUid, TOPIC_DECODE_OVER);
|
||||||
SDB_GET_BINARY(pRaw, dataPos, pTopic->stbName, TSDB_TABLE_FNAME_LEN, TOPIC_DECODE_OVER);
|
if (sver >= 3) {
|
||||||
|
SDB_GET_BINARY(pRaw, dataPos, pTopic->stbName, TSDB_TABLE_FNAME_LEN, TOPIC_DECODE_OVER);
|
||||||
|
}
|
||||||
SDB_GET_INT32(pRaw, dataPos, &pTopic->sqlLen, TOPIC_DECODE_OVER);
|
SDB_GET_INT32(pRaw, dataPos, &pTopic->sqlLen, TOPIC_DECODE_OVER);
|
||||||
pTopic->sql = taosMemoryCalloc(pTopic->sqlLen, sizeof(char));
|
pTopic->sql = taosMemoryCalloc(pTopic->sqlLen, sizeof(char));
|
||||||
if (pTopic->sql == NULL) {
|
if (pTopic->sql == NULL) {
|
||||||
|
@ -422,6 +424,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *
|
||||||
mError("failed to create topic:%s since %s", pCreate->name, terrstr());
|
mError("failed to create topic:%s since %s", pCreate->name, terrstr());
|
||||||
taosMemoryFree(topicObj.ast);
|
taosMemoryFree(topicObj.ast);
|
||||||
taosMemoryFree(topicObj.sql);
|
taosMemoryFree(topicObj.sql);
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -429,6 +432,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *
|
||||||
if (topicObj.ntbColIds == NULL) {
|
if (topicObj.ntbColIds == NULL) {
|
||||||
taosMemoryFree(topicObj.ast);
|
taosMemoryFree(topicObj.ast);
|
||||||
taosMemoryFree(topicObj.sql);
|
taosMemoryFree(topicObj.sql);
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -444,6 +448,7 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *
|
||||||
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
mError("topic:%s, failed to create since %s", pCreate->name, terrstr());
|
||||||
taosMemoryFree(topicObj.ast);
|
taosMemoryFree(topicObj.ast);
|
||||||
taosMemoryFree(topicObj.sql);
|
taosMemoryFree(topicObj.sql);
|
||||||
|
nodesDestroyNode(pAst);
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -465,6 +470,11 @@ static int32_t mndCreateTopic(SMnode *pMnode, SRpcMsg *pReq, SCMCreateTopicReq *
|
||||||
strcpy(topicObj.stbName, pCreate->subStbName);
|
strcpy(topicObj.stbName, pCreate->subStbName);
|
||||||
topicObj.stbUid = pStb->uid;
|
topicObj.stbUid = pStb->uid;
|
||||||
mndReleaseStb(pMnode, pStb);
|
mndReleaseStb(pMnode, pStb);
|
||||||
|
if(pCreate->ast != NULL){
|
||||||
|
qDebugL("topic:%s ast %s", topicObj.name, pCreate->ast);
|
||||||
|
topicObj.ast = taosStrdup(pCreate->ast);
|
||||||
|
topicObj.astLen = strlen(pCreate->ast) + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
/*} else if (pCreate->subType == TOPIC_SUB_TYPE__DB) {*/
|
/*} else if (pCreate->subType == TOPIC_SUB_TYPE__DB) {*/
|
||||||
/*topicObj.ast = NULL;*/
|
/*topicObj.ast = NULL;*/
|
||||||
|
@ -914,13 +924,12 @@ static int32_t mndRetrieveTopic(SRpcMsg *pReq, SShowObj *pShow, SSDataBlock *pBl
|
||||||
}else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE){
|
}else if(pTopic->subType == TOPIC_SUB_TYPE__TABLE){
|
||||||
SStbObj *pStb = mndAcquireStb(pMnode, pTopic->stbName);
|
SStbObj *pStb = mndAcquireStb(pMnode, pTopic->stbName);
|
||||||
if (pStb == NULL) {
|
if (pStb == NULL) {
|
||||||
terrno = TSDB_CODE_MND_STB_NOT_EXIST;
|
STR_TO_VARSTR(schemaJson, "NULL");
|
||||||
taosMemoryFree(schemaJson);
|
mError("mndRetrieveTopic mndAcquireStb null stbName:%s", pTopic->stbName);
|
||||||
return -1;
|
}else{
|
||||||
|
schemaToJson(pStb->pColumns, pStb->numOfColumns, schemaJson);
|
||||||
|
mndReleaseStb(pMnode, pStb);
|
||||||
}
|
}
|
||||||
schemaToJson(pStb->pColumns, pStb->numOfColumns, schemaJson);
|
|
||||||
|
|
||||||
mndReleaseStb(pMnode, pStb);
|
|
||||||
}else{
|
}else{
|
||||||
STR_TO_VARSTR(schemaJson, "NULL");
|
STR_TO_VARSTR(schemaJson, "NULL");
|
||||||
}
|
}
|
||||||
|
|
|
@ -488,7 +488,7 @@ SHashObj *mndDupUseDbHash(SHashObj *pOld) {
|
||||||
return pNew;
|
return pNew;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
|
int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
|
||||||
memcpy(pNew, pUser, sizeof(SUserObj));
|
memcpy(pNew, pUser, sizeof(SUserObj));
|
||||||
pNew->authVersion++;
|
pNew->authVersion++;
|
||||||
pNew->updateTime = taosGetTimestampMs();
|
pNew->updateTime = taosGetTimestampMs();
|
||||||
|
@ -508,7 +508,7 @@ static int32_t mndUserDupObj(SUserObj *pUser, SUserObj *pNew) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void mndUserFreeObj(SUserObj *pUser) {
|
void mndUserFreeObj(SUserObj *pUser) {
|
||||||
taosHashCleanup(pUser->readDbs);
|
taosHashCleanup(pUser->readDbs);
|
||||||
taosHashCleanup(pUser->writeDbs);
|
taosHashCleanup(pUser->writeDbs);
|
||||||
taosHashCleanup(pUser->topics);
|
taosHashCleanup(pUser->topics);
|
||||||
|
|
|
@ -87,6 +87,28 @@ target_include_directories(
|
||||||
PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar"
|
PUBLIC "${TD_SOURCE_DIR}/include/libs/scalar"
|
||||||
PUBLIC "${TD_SOURCE_DIR}/contrib/rocksdb/include"
|
PUBLIC "${TD_SOURCE_DIR}/contrib/rocksdb/include"
|
||||||
)
|
)
|
||||||
|
IF (TD_LINUX)
|
||||||
|
target_link_libraries(
|
||||||
|
vnode
|
||||||
|
PUBLIC os
|
||||||
|
PUBLIC util
|
||||||
|
PUBLIC common
|
||||||
|
PUBLIC tfs
|
||||||
|
PUBLIC wal
|
||||||
|
PUBLIC qworker
|
||||||
|
PUBLIC sync
|
||||||
|
PUBLIC executor
|
||||||
|
PUBLIC scheduler
|
||||||
|
PUBLIC tdb
|
||||||
|
|
||||||
|
# PUBLIC bdb
|
||||||
|
# PUBLIC scalar
|
||||||
|
PUBLIC rocksdb-shared
|
||||||
|
PUBLIC transport
|
||||||
|
PUBLIC stream
|
||||||
|
PUBLIC index
|
||||||
|
)
|
||||||
|
ELSE()
|
||||||
target_link_libraries(
|
target_link_libraries(
|
||||||
vnode
|
vnode
|
||||||
PUBLIC os
|
PUBLIC os
|
||||||
|
@ -107,6 +129,7 @@ target_link_libraries(
|
||||||
PUBLIC stream
|
PUBLIC stream
|
||||||
PUBLIC index
|
PUBLIC index
|
||||||
)
|
)
|
||||||
|
ENDIF()
|
||||||
|
|
||||||
IF (TD_GRANT)
|
IF (TD_GRANT)
|
||||||
TARGET_LINK_LIBRARIES(vnode PUBLIC grant)
|
TARGET_LINK_LIBRARIES(vnode PUBLIC grant)
|
||||||
|
|
|
@ -100,18 +100,11 @@ void vnodeApplyWriteMsg(SQueueInfo *pInfo, STaosQall *qall, int32_t numOfMsgs
|
||||||
void vnodeProposeCommitOnNeed(SVnode *pVnode, bool atExit);
|
void vnodeProposeCommitOnNeed(SVnode *pVnode, bool atExit);
|
||||||
|
|
||||||
// meta
|
// meta
|
||||||
typedef struct SMeta SMeta; // todo: remove
|
|
||||||
typedef struct SMetaReader SMetaReader;
|
|
||||||
typedef struct SMetaEntry SMetaEntry;
|
|
||||||
|
|
||||||
#define META_READER_NOLOCK 0x1
|
|
||||||
|
|
||||||
void _metaReaderInit(SMetaReader *pReader, void *pVnode, int32_t flags, SStoreMeta* pAPI);
|
void _metaReaderInit(SMetaReader *pReader, void *pVnode, int32_t flags, SStoreMeta* pAPI);
|
||||||
void metaReaderReleaseLock(SMetaReader *pReader);
|
void metaReaderReleaseLock(SMetaReader *pReader);
|
||||||
void metaReaderClear(SMetaReader *pReader);
|
void metaReaderClear(SMetaReader *pReader);
|
||||||
int32_t metaReaderGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
int32_t metaReaderGetTableEntryByUid(SMetaReader *pReader, tb_uid_t uid);
|
||||||
int32_t metaReaderGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid);
|
int32_t metaReaderGetTableEntryByUidCache(SMetaReader *pReader, tb_uid_t uid);
|
||||||
int metaGetTableEntryByName(SMetaReader *pReader, const char *name);
|
|
||||||
int32_t metaGetTableTags(void *pVnode, uint64_t suid, SArray *uidList);
|
int32_t metaGetTableTags(void *pVnode, uint64_t suid, SArray *uidList);
|
||||||
int32_t metaGetTableTagsByUids(void* pVnode, int64_t suid, SArray *uidList);
|
int32_t metaGetTableTagsByUids(void* pVnode, int64_t suid, SArray *uidList);
|
||||||
int32_t metaReadNext(SMetaReader *pReader);
|
int32_t metaReadNext(SMetaReader *pReader);
|
||||||
|
@ -122,37 +115,18 @@ int metaGetTableSzNameByUid(void *meta, uint64_t uid, char *tbName);
|
||||||
int metaGetTableUidByName(void *pVnode, char *tbName, uint64_t *uid);
|
int metaGetTableUidByName(void *pVnode, char *tbName, uint64_t *uid);
|
||||||
int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
|
int metaGetTableTypeByName(void *meta, char *tbName, ETableType *tbType);
|
||||||
bool metaIsTableExist(void* pVnode, tb_uid_t uid);
|
bool metaIsTableExist(void* pVnode, tb_uid_t uid);
|
||||||
int32_t metaGetCachedTableUidList(SMeta *pMeta, tb_uid_t suid, const uint8_t *key, int32_t keyLen, SArray *pList,
|
int32_t metaGetCachedTableUidList(void *pVnode, tb_uid_t suid, const uint8_t *key, int32_t keyLen, SArray *pList,
|
||||||
bool *acquired);
|
bool *acquired);
|
||||||
int32_t metaUidFilterCachePut(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
int32_t metaUidFilterCachePut(void *pVnode, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
||||||
int32_t payloadLen, double selectivityRatio);
|
int32_t payloadLen, double selectivityRatio);
|
||||||
int32_t metaUidCacheClear(SMeta *pMeta, uint64_t suid);
|
|
||||||
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name);
|
||||||
int32_t metaTbGroupCacheClear(SMeta *pMeta, uint64_t suid);
|
int32_t metaGetCachedTbGroup(void *pVnode, tb_uid_t suid, const uint8_t *pKey, int32_t keyLen, SArray **pList);
|
||||||
int32_t metaGetCachedTbGroup(SMeta *pMeta, tb_uid_t suid, const uint8_t *pKey, int32_t keyLen, SArray **pList);
|
int32_t metaPutTbGroupToCache(void* pVnode, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
||||||
int32_t metaPutTbGroupToCache(SMeta *pMeta, uint64_t suid, const void *pKey, int32_t keyLen, void *pPayload,
|
|
||||||
int32_t payloadLen);
|
int32_t payloadLen);
|
||||||
|
|
||||||
int64_t metaGetTbNum(SMeta *pMeta);
|
int64_t metaGetTbNum(SMeta *pMeta);
|
||||||
int64_t metaGetNtbNum(SMeta *pMeta);
|
|
||||||
//typedef struct {
|
|
||||||
// int64_t uid;
|
|
||||||
// int64_t ctbNum;
|
|
||||||
//} SMetaStbStats;
|
|
||||||
int32_t metaGetStbStats(void *pVnode, int64_t uid, int64_t *numOfTables);
|
|
||||||
|
|
||||||
#if 1 // refact APIs below (TODO)
|
int32_t metaGetStbStats(void *pVnode, int64_t uid, int64_t *numOfTables);
|
||||||
typedef SVCreateTbReq STbCfg;
|
|
||||||
typedef SVCreateTSmaReq SSmaCfg;
|
|
||||||
|
|
||||||
typedef struct SMTbCursor SMTbCursor;
|
|
||||||
|
|
||||||
SMTbCursor *metaOpenTbCursor(void *pVnode);
|
|
||||||
void metaCloseTbCursor(SMTbCursor *pTbCur);
|
|
||||||
int32_t metaTbCursorNext(SMTbCursor *pTbCur, ETableType jumpTableType);
|
|
||||||
int32_t metaTbCursorPrev(SMTbCursor *pTbCur, ETableType jumpTableType);
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// tsdb
|
// tsdb
|
||||||
typedef struct STsdbReader STsdbReader;
|
typedef struct STsdbReader STsdbReader;
|
||||||
|
@ -168,14 +142,14 @@ typedef struct STsdbReader STsdbReader;
|
||||||
#define CACHESCAN_RETRIEVE_LAST_ROW 0x4
|
#define CACHESCAN_RETRIEVE_LAST_ROW 0x4
|
||||||
#define CACHESCAN_RETRIEVE_LAST 0x8
|
#define CACHESCAN_RETRIEVE_LAST 0x8
|
||||||
|
|
||||||
int32_t tsdbReaderOpen(SVnode *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
int32_t tsdbReaderOpen(void *pVnode, SQueryTableDataCond *pCond, void *pTableList, int32_t numOfTables,
|
||||||
SSDataBlock *pResBlock, STsdbReader **ppReader, const char *idstr, bool countOnly,
|
SSDataBlock *pResBlock, void **ppReader, const char *idstr, bool countOnly,
|
||||||
SHashObj **pIgnoreTables);
|
SHashObj **pIgnoreTables);
|
||||||
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
int32_t tsdbSetTableList(STsdbReader *pReader, const void *pTableList, int32_t num);
|
||||||
void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
void tsdbReaderSetId(STsdbReader *pReader, const char *idstr);
|
||||||
void tsdbReaderClose(STsdbReader *pReader);
|
void tsdbReaderClose(STsdbReader *pReader);
|
||||||
int32_t tsdbNextDataBlock(STsdbReader *pReader, bool *hasNext);
|
int32_t tsdbNextDataBlock(STsdbReader *pReader, bool *hasNext);
|
||||||
int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave);
|
int32_t tsdbRetrieveDatablockSMA(STsdbReader *pReader, SSDataBlock *pDataBlock, bool *allHave, bool *hasNullSMA);
|
||||||
void tsdbReleaseDataBlock(STsdbReader *pReader);
|
void tsdbReleaseDataBlock(STsdbReader *pReader);
|
||||||
SSDataBlock *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
SSDataBlock *tsdbRetrieveDataBlock(STsdbReader *pTsdbReadHandle, SArray *pColumnIdList);
|
||||||
int32_t tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond);
|
int32_t tsdbReaderReset(STsdbReader *pReader, SQueryTableDataCond *pCond);
|
||||||
|
@ -201,32 +175,11 @@ size_t tsdbCacheGetUsage(SVnode *pVnode);
|
||||||
int32_t tsdbCacheGetElems(SVnode *pVnode);
|
int32_t tsdbCacheGetElems(SVnode *pVnode);
|
||||||
|
|
||||||
//// tq
|
//// tq
|
||||||
//typedef struct SMetaTableInfo {
|
|
||||||
// int64_t suid;
|
|
||||||
// int64_t uid;
|
|
||||||
// SSchemaWrapper *schema;
|
|
||||||
// char tbName[TSDB_TABLE_NAME_LEN];
|
|
||||||
//} SMetaTableInfo;
|
|
||||||
|
|
||||||
typedef struct SIdInfo {
|
typedef struct SIdInfo {
|
||||||
int64_t version;
|
int64_t version;
|
||||||
int32_t index;
|
int32_t index;
|
||||||
} SIdInfo;
|
} SIdInfo;
|
||||||
|
|
||||||
//typedef struct SSnapContext {
|
|
||||||
// SMeta *pMeta;
|
|
||||||
// int64_t snapVersion;
|
|
||||||
// TBC *pCur;
|
|
||||||
// int64_t suid;
|
|
||||||
// int8_t subType;
|
|
||||||
// SHashObj *idVersion;
|
|
||||||
// SHashObj *suidInfo;
|
|
||||||
// SArray *idList;
|
|
||||||
// int32_t index;
|
|
||||||
// bool withMeta;
|
|
||||||
// bool queryMeta; // true-get meta, false-get data
|
|
||||||
//} SSnapContext;
|
|
||||||
|
|
||||||
typedef struct STqReader {
|
typedef struct STqReader {
|
||||||
SPackedData msg;
|
SPackedData msg;
|
||||||
SSubmitReq2 submit;
|
SSubmitReq2 submit;
|
||||||
|
@ -247,7 +200,7 @@ STqReader *tqReaderOpen(SVnode *pVnode);
|
||||||
void tqReaderClose(STqReader *);
|
void tqReaderClose(STqReader *);
|
||||||
|
|
||||||
void tqReaderSetColIdList(STqReader *pReader, SArray *pColIdList);
|
void tqReaderSetColIdList(STqReader *pReader, SArray *pColIdList);
|
||||||
int32_t tqReaderSetTbUidList(STqReader *pReader, const SArray *tbUidList);
|
int32_t tqReaderSetTbUidList(STqReader *pReader, const SArray *tbUidList, const char* id);
|
||||||
int32_t tqReaderAddTbUidList(STqReader *pReader, const SArray *pTableUidList);
|
int32_t tqReaderAddTbUidList(STqReader *pReader, const SArray *pTableUidList);
|
||||||
int32_t tqReaderRemoveTbUidList(STqReader *pReader, const SArray *tbUidList);
|
int32_t tqReaderRemoveTbUidList(STqReader *pReader, const SArray *tbUidList);
|
||||||
|
|
||||||
|
@ -345,59 +298,6 @@ struct SVnodeCfg {
|
||||||
#define TABLE_ROLLUP_ON ((int8_t)0x1)
|
#define TABLE_ROLLUP_ON ((int8_t)0x1)
|
||||||
#define TABLE_IS_ROLLUP(FLG) (((FLG) & (TABLE_ROLLUP_ON)) != 0)
|
#define TABLE_IS_ROLLUP(FLG) (((FLG) & (TABLE_ROLLUP_ON)) != 0)
|
||||||
#define TABLE_SET_ROLLUP(FLG) ((FLG) |= TABLE_ROLLUP_ON)
|
#define TABLE_SET_ROLLUP(FLG) ((FLG) |= TABLE_ROLLUP_ON)
|
||||||
//struct SMetaEntry {
|
|
||||||
// int64_t version;
|
|
||||||
// int8_t type;
|
|
||||||
// int8_t flags; // TODO: need refactor?
|
|
||||||
// tb_uid_t uid;
|
|
||||||
// char *name;
|
|
||||||
// union {
|
|
||||||
// struct {
|
|
||||||
// SSchemaWrapper schemaRow;
|
|
||||||
// SSchemaWrapper schemaTag;
|
|
||||||
// SRSmaParam rsmaParam;
|
|
||||||
// } stbEntry;
|
|
||||||
// struct {
|
|
||||||
// int64_t ctime;
|
|
||||||
// int32_t ttlDays;
|
|
||||||
// int32_t commentLen;
|
|
||||||
// char *comment;
|
|
||||||
// tb_uid_t suid;
|
|
||||||
// uint8_t *pTags;
|
|
||||||
// } ctbEntry;
|
|
||||||
// struct {
|
|
||||||
// int64_t ctime;
|
|
||||||
// int32_t ttlDays;
|
|
||||||
// int32_t commentLen;
|
|
||||||
// char *comment;
|
|
||||||
// int32_t ncid; // next column id
|
|
||||||
// SSchemaWrapper schemaRow;
|
|
||||||
// } ntbEntry;
|
|
||||||
// struct {
|
|
||||||
// STSma *tsma;
|
|
||||||
// } smaEntry;
|
|
||||||
// };
|
|
||||||
//
|
|
||||||
// uint8_t *pBuf;
|
|
||||||
//};
|
|
||||||
|
|
||||||
//struct SMetaReader {
|
|
||||||
// int32_t flags;
|
|
||||||
// SMeta *pMeta;
|
|
||||||
// SDecoder coder;
|
|
||||||
// SMetaEntry me;
|
|
||||||
// void *pBuf;
|
|
||||||
// int32_t szBuf;
|
|
||||||
//};
|
|
||||||
|
|
||||||
//struct SMTbCursor {
|
|
||||||
// TBC *pDbc;
|
|
||||||
// void *pKey;
|
|
||||||
// void *pVal;
|
|
||||||
// int32_t kLen;
|
|
||||||
// int32_t vLen;
|
|
||||||
// SMetaReader mr;
|
|
||||||
//};
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,6 +72,8 @@ typedef struct {
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int64_t suid;
|
int64_t suid;
|
||||||
|
char* qmsg; // SubPlanToString
|
||||||
|
SNode* node;
|
||||||
} STqExecTb;
|
} STqExecTb;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
@ -96,18 +98,17 @@ typedef enum tq_handle_status {
|
||||||
} tq_handle_status;
|
} tq_handle_status;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
char subKey[TSDB_SUBSCRIBE_KEY_LEN];
|
||||||
int64_t consumerId;
|
int64_t consumerId;
|
||||||
int32_t epoch;
|
int32_t epoch;
|
||||||
int8_t fetchMeta;
|
int8_t fetchMeta;
|
||||||
int64_t snapshotVer;
|
int64_t snapshotVer;
|
||||||
SWalReader* pWalReader;
|
SWalReader* pWalReader;
|
||||||
SWalRef* pRef;
|
SWalRef* pRef;
|
||||||
// STqPushHandle pushHandle; // push
|
// STqPushHandle pushHandle; // push
|
||||||
STqExecHandle execHandle; // exec
|
STqExecHandle execHandle; // exec
|
||||||
SRpcMsg* msg;
|
SRpcMsg* msg;
|
||||||
int32_t noDataPollCnt;
|
tq_handle_status status;
|
||||||
tq_handle_status status;
|
|
||||||
} STqHandle;
|
} STqHandle;
|
||||||
|
|
||||||
struct STQ {
|
struct STQ {
|
||||||
|
|
|
@ -297,6 +297,7 @@ int32_t tsdbUpdateDelFileHdr(SDelFWriter *pWriter);
|
||||||
// SDelFReader
|
// SDelFReader
|
||||||
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb);
|
int32_t tsdbDelFReaderOpen(SDelFReader **ppReader, SDelFile *pFile, STsdb *pTsdb);
|
||||||
int32_t tsdbDelFReaderClose(SDelFReader **ppReader);
|
int32_t tsdbDelFReaderClose(SDelFReader **ppReader);
|
||||||
|
int32_t tsdbReadDelDatav1(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer);
|
||||||
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData);
|
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData);
|
||||||
int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx);
|
int32_t tsdbReadDelIdx(SDelFReader *pReader, SArray *aDelIdx);
|
||||||
// tsdbRead.c ==============================================================================================
|
// tsdbRead.c ==============================================================================================
|
||||||
|
|
|
@ -103,6 +103,19 @@ struct SQueryNode {
|
||||||
_query_reseek_func_t reseek;
|
_query_reseek_func_t reseek;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#if 1 // refact APIs below (TODO)
|
||||||
|
typedef SVCreateTbReq STbCfg;
|
||||||
|
typedef SVCreateTSmaReq SSmaCfg;
|
||||||
|
|
||||||
|
SMTbCursor* metaOpenTbCursor(void* pVnode);
|
||||||
|
void metaCloseTbCursor(SMTbCursor* pTbCur);
|
||||||
|
void metaPauseTbCursor(SMTbCursor* pTbCur);
|
||||||
|
void metaResumeTbCursor(SMTbCursor* pTbCur, int8_t first);
|
||||||
|
int32_t metaTbCursorNext(SMTbCursor* pTbCur, ETableType jumpTableType);
|
||||||
|
int32_t metaTbCursorPrev(SMTbCursor* pTbCur, ETableType jumpTableType);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
void* vnodeBufPoolMalloc(SVBufPool* pPool, int size);
|
void* vnodeBufPoolMalloc(SVBufPool* pPool, int size);
|
||||||
void* vnodeBufPoolMallocAligned(SVBufPool* pPool, int size);
|
void* vnodeBufPoolMallocAligned(SVBufPool* pPool, int size);
|
||||||
void vnodeBufPoolFree(SVBufPool* pPool, void* p);
|
void vnodeBufPoolFree(SVBufPool* pPool, void* p);
|
||||||
|
@ -135,6 +148,7 @@ int metaAlterSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* p
|
||||||
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
|
int metaDropSTable(SMeta* pMeta, int64_t verison, SVDropStbReq* pReq, SArray* tbUidList);
|
||||||
int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pReq, STableMetaRsp** pMetaRsp);
|
int metaCreateTable(SMeta* pMeta, int64_t version, SVCreateTbReq* pReq, STableMetaRsp** pMetaRsp);
|
||||||
int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids, int64_t* tbUid);
|
int metaDropTable(SMeta* pMeta, int64_t version, SVDropTbReq* pReq, SArray* tbUids, int64_t* tbUid);
|
||||||
|
int32_t metaTrimTables(SMeta* pMeta);
|
||||||
int metaTtlDropTable(SMeta* pMeta, int64_t ttl, SArray* tbUids);
|
int metaTtlDropTable(SMeta* pMeta, int64_t ttl, SArray* tbUids);
|
||||||
int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp);
|
int metaAlterTable(SMeta* pMeta, int64_t version, SVAlterTbReq* pReq, STableMetaRsp* pMetaRsp);
|
||||||
SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, int lock);
|
SSchemaWrapper* metaGetTableSchema(SMeta* pMeta, tb_uid_t uid, int32_t sver, int lock);
|
||||||
|
@ -143,6 +157,9 @@ int32_t metaGetTbTSchemaEx(SMeta* pMeta, tb_uid_t suid, tb_uid_t uid, in
|
||||||
int metaGetTableEntryByName(SMetaReader* pReader, const char* name);
|
int metaGetTableEntryByName(SMetaReader* pReader, const char* name);
|
||||||
int metaAlterCache(SMeta* pMeta, int32_t nPage);
|
int metaAlterCache(SMeta* pMeta, int32_t nPage);
|
||||||
|
|
||||||
|
int32_t metaUidCacheClear(SMeta* pMeta, uint64_t suid);
|
||||||
|
int32_t metaTbGroupCacheClear(SMeta* pMeta, uint64_t suid);
|
||||||
|
|
||||||
int metaAddIndexToSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
int metaAddIndexToSTable(SMeta* pMeta, int64_t version, SVCreateStbReq* pReq);
|
||||||
int metaDropIndexFromSTable(SMeta* pMeta, int64_t version, SDropIndexReq* pReq);
|
int metaDropIndexFromSTable(SMeta* pMeta, int64_t version, SDropIndexReq* pReq);
|
||||||
|
|
||||||
|
@ -161,7 +178,7 @@ void* metaGetIdx(SMeta* pMeta);
|
||||||
void* metaGetIvtIdx(SMeta* pMeta);
|
void* metaGetIvtIdx(SMeta* pMeta);
|
||||||
int metaTtlSmaller(SMeta* pMeta, uint64_t time, SArray* uidList);
|
int metaTtlSmaller(SMeta* pMeta, uint64_t time, SArray* uidList);
|
||||||
|
|
||||||
void metaReaderInit(SMetaReader *pReader, SMeta *pMeta, int32_t flags);
|
void metaReaderInit(SMetaReader* pReader, SMeta* pMeta, int32_t flags);
|
||||||
|
|
||||||
int32_t metaCreateTSma(SMeta* pMeta, int64_t version, SSmaCfg* pCfg);
|
int32_t metaCreateTSma(SMeta* pMeta, int64_t version, SSmaCfg* pCfg);
|
||||||
int32_t metaDropTSma(SMeta* pMeta, int64_t indexUid);
|
int32_t metaDropTSma(SMeta* pMeta, int64_t indexUid);
|
||||||
|
|
|
@ -499,8 +499,9 @@ static void initCacheKey(uint64_t* buf, const SHashObj* pHashMap, uint64_t suid,
|
||||||
ASSERT(keyLen == sizeof(uint64_t) * 2);
|
ASSERT(keyLen == sizeof(uint64_t) * 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetCachedTableUidList(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray* pList1,
|
int32_t metaGetCachedTableUidList(void* pVnode, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray* pList1,
|
||||||
bool* acquireRes) {
|
bool* acquireRes) {
|
||||||
|
SMeta* pMeta = ((SVnode*)pVnode)->pMeta;
|
||||||
int32_t vgId = TD_VID(pMeta->pVnode);
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
|
||||||
// generate the composed key for LRU cache
|
// generate the composed key for LRU cache
|
||||||
|
@ -603,9 +604,10 @@ static int32_t addNewEntry(SHashObj* pTableEntry, const void* pKey, int32_t keyL
|
||||||
}
|
}
|
||||||
|
|
||||||
// check both the payload size and selectivity ratio
|
// check both the payload size and selectivity ratio
|
||||||
int32_t metaUidFilterCachePut(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
int32_t metaUidFilterCachePut(void* pVnode, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
int32_t payloadLen, double selectivityRatio) {
|
int32_t payloadLen, double selectivityRatio) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
SMeta* pMeta = ((SVnode*)pVnode)->pMeta;
|
||||||
int32_t vgId = TD_VID(pMeta->pVnode);
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
|
||||||
if (selectivityRatio > tsSelectivityRatio) {
|
if (selectivityRatio > tsSelectivityRatio) {
|
||||||
|
@ -702,7 +704,8 @@ int32_t metaUidCacheClear(SMeta* pMeta, uint64_t suid) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetCachedTbGroup(SMeta* pMeta, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList) {
|
int32_t metaGetCachedTbGroup(void* pVnode, tb_uid_t suid, const uint8_t* pKey, int32_t keyLen, SArray** pList) {
|
||||||
|
SMeta* pMeta = ((SVnode*)pVnode)->pMeta;
|
||||||
int32_t vgId = TD_VID(pMeta->pVnode);
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
|
||||||
// generate the composed key for LRU cache
|
// generate the composed key for LRU cache
|
||||||
|
@ -786,9 +789,10 @@ static void freeTbGroupCachePayload(const void* key, size_t keyLen, void* value)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
int32_t metaPutTbGroupToCache(SMeta* pMeta, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
int32_t metaPutTbGroupToCache(void* pVnode, uint64_t suid, const void* pKey, int32_t keyLen, void* pPayload,
|
||||||
int32_t payloadLen) {
|
int32_t payloadLen) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
SMeta* pMeta = ((SVnode*)pVnode)->pMeta;
|
||||||
int32_t vgId = TD_VID(pMeta->pVnode);
|
int32_t vgId = TD_VID(pMeta->pVnode);
|
||||||
|
|
||||||
if (payloadLen > tsTagFilterResCacheSize) {
|
if (payloadLen > tsTagFilterResCacheSize) {
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
#include "osMemory.h"
|
#include "osMemory.h"
|
||||||
#include "tencode.h"
|
#include "tencode.h"
|
||||||
|
|
||||||
void _metaReaderInit(SMetaReader* pReader, void* pVnode, int32_t flags, SStoreMeta* pAPI) {
|
void _metaReaderInit(SMetaReader *pReader, void *pVnode, int32_t flags, SStoreMeta *pAPI) {
|
||||||
SMeta* pMeta = ((SVnode*)pVnode)->pMeta;
|
SMeta *pMeta = ((SVnode *)pVnode)->pMeta;
|
||||||
metaReaderInit(pReader, pMeta, flags);
|
metaReaderInit(pReader, pMeta, flags);
|
||||||
pReader->pAPI = pAPI;
|
pReader->pAPI = pAPI;
|
||||||
}
|
}
|
||||||
|
@ -71,7 +71,7 @@ _err:
|
||||||
}
|
}
|
||||||
|
|
||||||
bool metaIsTableExist(void *pVnode, tb_uid_t uid) {
|
bool metaIsTableExist(void *pVnode, tb_uid_t uid) {
|
||||||
SVnode* pVnodeObj = pVnode;
|
SVnode *pVnodeObj = pVnode;
|
||||||
metaRLock(pVnodeObj->pMeta); // query uid.idx
|
metaRLock(pVnodeObj->pMeta); // query uid.idx
|
||||||
|
|
||||||
if (tdbTbGet(pVnodeObj->pMeta->pUidIdx, &uid, sizeof(uid), NULL, NULL) < 0) {
|
if (tdbTbGet(pVnodeObj->pMeta->pUidIdx, &uid, sizeof(uid), NULL, NULL) < 0) {
|
||||||
|
@ -143,7 +143,7 @@ tb_uid_t metaGetTableEntryUidByName(SMeta *pMeta, const char *name) {
|
||||||
int metaGetTableNameByUid(void *pVnode, uint64_t uid, char *tbName) {
|
int metaGetTableNameByUid(void *pVnode, uint64_t uid, char *tbName) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
metaReaderInit(&mr, ((SVnode*)pVnode)->pMeta, 0);
|
metaReaderInit(&mr, ((SVnode *)pVnode)->pMeta, 0);
|
||||||
code = metaReaderGetTableEntryByUid(&mr, uid);
|
code = metaReaderGetTableEntryByUid(&mr, uid);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
|
@ -179,7 +179,7 @@ int metaGetTableUidByName(void *pVnode, char *tbName, uint64_t *uid) {
|
||||||
SMetaReader *pReader = &mr;
|
SMetaReader *pReader = &mr;
|
||||||
|
|
||||||
// query name.idx
|
// query name.idx
|
||||||
if (tdbTbGet(((SMeta*)pReader->pMeta)->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) {
|
if (tdbTbGet(((SMeta *)pReader->pMeta)->pNameIdx, tbName, strlen(tbName) + 1, &pReader->pBuf, &pReader->szBuf) < 0) {
|
||||||
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
terrno = TSDB_CODE_PAR_TABLE_NOT_EXIST;
|
||||||
metaReaderClear(&mr);
|
metaReaderClear(&mr);
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -195,7 +195,7 @@ int metaGetTableUidByName(void *pVnode, char *tbName, uint64_t *uid) {
|
||||||
int metaGetTableTypeByName(void *pVnode, char *tbName, ETableType *tbType) {
|
int metaGetTableTypeByName(void *pVnode, char *tbName, ETableType *tbType) {
|
||||||
int code = 0;
|
int code = 0;
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
metaReaderInit(&mr, ((SVnode*)pVnode)->pMeta, 0);
|
metaReaderInit(&mr, ((SVnode *)pVnode)->pMeta, 0);
|
||||||
|
|
||||||
code = metaGetTableEntryByName(&mr, tbName);
|
code = metaGetTableEntryByName(&mr, tbName);
|
||||||
if (code == 0) *tbType = mr.me.type;
|
if (code == 0) *tbType = mr.me.type;
|
||||||
|
@ -221,12 +221,13 @@ SMTbCursor *metaOpenTbCursor(void *pVnode) {
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
SVnode* pVnodeObj = pVnode;
|
SVnode *pVnodeObj = pVnode;
|
||||||
metaReaderInit(&pTbCur->mr, pVnodeObj->pMeta, 0);
|
// metaReaderInit(&pTbCur->mr, pVnodeObj->pMeta, 0);
|
||||||
|
|
||||||
tdbTbcOpen(pVnodeObj->pMeta->pUidIdx, (TBC **)&pTbCur->pDbc, NULL);
|
// tdbTbcMoveToFirst((TBC *)pTbCur->pDbc);
|
||||||
|
pTbCur->pMeta = pVnodeObj->pMeta;
|
||||||
tdbTbcMoveToFirst((TBC *)pTbCur->pDbc);
|
pTbCur->paused = 1;
|
||||||
|
metaResumeTbCursor(pTbCur, 1);
|
||||||
return pTbCur;
|
return pTbCur;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -234,14 +235,45 @@ void metaCloseTbCursor(SMTbCursor *pTbCur) {
|
||||||
if (pTbCur) {
|
if (pTbCur) {
|
||||||
tdbFree(pTbCur->pKey);
|
tdbFree(pTbCur->pKey);
|
||||||
tdbFree(pTbCur->pVal);
|
tdbFree(pTbCur->pVal);
|
||||||
metaReaderClear(&pTbCur->mr);
|
if (!pTbCur->paused) {
|
||||||
if (pTbCur->pDbc) {
|
metaReaderClear(&pTbCur->mr);
|
||||||
tdbTbcClose((TBC *)pTbCur->pDbc);
|
if (pTbCur->pDbc) {
|
||||||
|
tdbTbcClose((TBC *)pTbCur->pDbc);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
taosMemoryFree(pTbCur);
|
taosMemoryFree(pTbCur);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void metaPauseTbCursor(SMTbCursor *pTbCur) {
|
||||||
|
if (!pTbCur->paused) {
|
||||||
|
metaReaderClear(&pTbCur->mr);
|
||||||
|
tdbTbcClose((TBC *)pTbCur->pDbc);
|
||||||
|
pTbCur->paused = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
void metaResumeTbCursor(SMTbCursor *pTbCur, int8_t first) {
|
||||||
|
if (pTbCur->paused) {
|
||||||
|
metaReaderInit(&pTbCur->mr, pTbCur->pMeta, 0);
|
||||||
|
|
||||||
|
tdbTbcOpen(((SMeta *)pTbCur->pMeta)->pUidIdx, (TBC **)&pTbCur->pDbc, NULL);
|
||||||
|
|
||||||
|
if (first) {
|
||||||
|
tdbTbcMoveToFirst((TBC *)pTbCur->pDbc);
|
||||||
|
} else {
|
||||||
|
int c = 0;
|
||||||
|
tdbTbcMoveTo(pTbCur->pDbc, pTbCur->pKey, pTbCur->kLen, &c);
|
||||||
|
if (c < 0) {
|
||||||
|
tdbTbcMoveToPrev(pTbCur->pDbc);
|
||||||
|
} else {
|
||||||
|
tdbTbcMoveToNext(pTbCur->pDbc);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pTbCur->paused = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32_t metaTbCursorNext(SMTbCursor *pTbCur, ETableType jumpTableType) {
|
int32_t metaTbCursorNext(SMTbCursor *pTbCur, ETableType jumpTableType) {
|
||||||
int ret;
|
int ret;
|
||||||
void *pBuf;
|
void *pBuf;
|
||||||
|
@ -317,42 +349,6 @@ _query:
|
||||||
tDecoderClear(&dc);
|
tDecoderClear(&dc);
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
{ // Traverse to find the previous qualified data
|
|
||||||
TBC *pCur;
|
|
||||||
tdbTbcOpen(pMeta->pTbDb, &pCur, NULL);
|
|
||||||
STbDbKey key = {.version = sver, .uid = INT64_MAX};
|
|
||||||
int c = 0;
|
|
||||||
tdbTbcMoveTo(pCur, &key, sizeof(key), &c);
|
|
||||||
if (c < 0) {
|
|
||||||
tdbTbcMoveToPrev(pCur);
|
|
||||||
}
|
|
||||||
|
|
||||||
void *pKey = NULL;
|
|
||||||
void *pVal = NULL;
|
|
||||||
int vLen = 0, kLen = 0;
|
|
||||||
while (1) {
|
|
||||||
int32_t ret = tdbTbcPrev(pCur, &pKey, &kLen, &pVal, &vLen);
|
|
||||||
if (ret < 0) break;
|
|
||||||
|
|
||||||
STbDbKey *tmp = (STbDbKey *)pKey;
|
|
||||||
if (tmp->uid != uid) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
SDecoder dcNew = {0};
|
|
||||||
SMetaEntry meNew = {0};
|
|
||||||
tDecoderInit(&dcNew, pVal, vLen);
|
|
||||||
metaDecodeEntry(&dcNew, &meNew);
|
|
||||||
pSchema = tCloneSSchemaWrapper(&meNew.stbEntry.schemaRow);
|
|
||||||
tDecoderClear(&dcNew);
|
|
||||||
tdbTbcClose(pCur);
|
|
||||||
tdbFree(pKey);
|
|
||||||
tdbFree(pVal);
|
|
||||||
goto _exit;
|
|
||||||
}
|
|
||||||
tdbFree(pKey);
|
|
||||||
tdbFree(pVal);
|
|
||||||
tdbTbcClose(pCur);
|
|
||||||
}
|
|
||||||
} else if (me.type == TSDB_CHILD_TABLE) {
|
} else if (me.type == TSDB_CHILD_TABLE) {
|
||||||
uid = me.ctbEntry.suid;
|
uid = me.ctbEntry.suid;
|
||||||
tDecoderClear(&dc);
|
tDecoderClear(&dc);
|
||||||
|
@ -377,7 +373,6 @@ _query:
|
||||||
tDecoderClear(&dc);
|
tDecoderClear(&dc);
|
||||||
|
|
||||||
_exit:
|
_exit:
|
||||||
tDecoderClear(&dc);
|
|
||||||
if (lock) {
|
if (lock) {
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
}
|
}
|
||||||
|
@ -385,7 +380,6 @@ _exit:
|
||||||
return pSchema;
|
return pSchema;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
tDecoderClear(&dc);
|
|
||||||
if (lock) {
|
if (lock) {
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
}
|
}
|
||||||
|
@ -700,8 +694,6 @@ int64_t metaGetTimeSeriesNum(SMeta *pMeta) {
|
||||||
return pMeta->pVnode->config.vndStats.numOfTimeSeries + pMeta->pVnode->config.vndStats.numOfNTimeSeries;
|
return pMeta->pVnode->config.vndStats.numOfTimeSeries + pMeta->pVnode->config.vndStats.numOfNTimeSeries;
|
||||||
}
|
}
|
||||||
|
|
||||||
int64_t metaGetNtbNum(SMeta *pMeta) { return pMeta->pVnode->config.vndStats.numOfNTables; }
|
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SMeta *pMeta;
|
SMeta *pMeta;
|
||||||
TBC *pCur;
|
TBC *pCur;
|
||||||
|
@ -1014,7 +1006,7 @@ typedef struct {
|
||||||
} SIdxCursor;
|
} SIdxCursor;
|
||||||
|
|
||||||
int32_t metaFilterCreateTime(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
int32_t metaFilterCreateTime(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
||||||
SMeta *pMeta = ((SVnode*)pVnode)->pMeta;
|
SMeta *pMeta = ((SVnode *)pVnode)->pMeta;
|
||||||
SMetaFltParam *param = arg;
|
SMetaFltParam *param = arg;
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
|
|
||||||
|
@ -1074,7 +1066,7 @@ END:
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaFilterTableName(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
int32_t metaFilterTableName(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
||||||
SMeta *pMeta = ((SVnode*)pVnode)->pMeta;
|
SMeta *pMeta = ((SVnode *)pVnode)->pMeta;
|
||||||
SMetaFltParam *param = arg;
|
SMetaFltParam *param = arg;
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
@ -1141,7 +1133,7 @@ END:
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
int32_t metaFilterTtl(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
int32_t metaFilterTtl(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
||||||
SMeta *pMeta = ((SVnode*)pVnode)->pMeta;
|
SMeta *pMeta = ((SVnode *)pVnode)->pMeta;
|
||||||
SMetaFltParam *param = arg;
|
SMetaFltParam *param = arg;
|
||||||
int32_t ret = 0;
|
int32_t ret = 0;
|
||||||
char *buf = NULL;
|
char *buf = NULL;
|
||||||
|
@ -1172,7 +1164,7 @@ END:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
int32_t metaFilterTableIds(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
int32_t metaFilterTableIds(void *pVnode, SMetaFltParam *arg, SArray *pUids) {
|
||||||
SMeta *pMeta = ((SVnode*)pVnode)->pMeta;
|
SMeta *pMeta = ((SVnode *)pVnode)->pMeta;
|
||||||
SMetaFltParam *param = arg;
|
SMetaFltParam *param = arg;
|
||||||
|
|
||||||
SMetaEntry oStbEntry = {0};
|
SMetaEntry oStbEntry = {0};
|
||||||
|
@ -1358,7 +1350,7 @@ static int32_t metaGetTableTagByUid(SMeta *pMeta, int64_t suid, int64_t uid, voi
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetTableTagsByUids(void *pVnode, int64_t suid, SArray *uidList) {
|
int32_t metaGetTableTagsByUids(void *pVnode, int64_t suid, SArray *uidList) {
|
||||||
SMeta* pMeta = ((SVnode*) pVnode)->pMeta;
|
SMeta *pMeta = ((SVnode *)pVnode)->pMeta;
|
||||||
const int32_t LIMIT = 128;
|
const int32_t LIMIT = 128;
|
||||||
|
|
||||||
int32_t isLock = false;
|
int32_t isLock = false;
|
||||||
|
@ -1390,8 +1382,8 @@ int32_t metaGetTableTagsByUids(void *pVnode, int64_t suid, SArray *uidList) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetTableTags(void* pVnode, uint64_t suid, SArray *pUidTagInfo) {
|
int32_t metaGetTableTags(void *pVnode, uint64_t suid, SArray *pUidTagInfo) {
|
||||||
SMCtbCursor *pCur = metaOpenCtbCursor(((SVnode*)pVnode)->pMeta, suid, 1);
|
SMCtbCursor *pCur = metaOpenCtbCursor(((SVnode *)pVnode)->pMeta, suid, 1);
|
||||||
|
|
||||||
// If len > 0 means there already have uids, and we only want the
|
// If len > 0 means there already have uids, and we only want the
|
||||||
// tags of the specified tables, of which uid in the uid list. Otherwise, all table tags are retrieved and kept
|
// tags of the specified tables, of which uid in the uid list. Otherwise, all table tags are retrieved and kept
|
||||||
|
@ -1496,11 +1488,11 @@ _exit:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t metaGetStbStats(void *pVnode, int64_t uid, int64_t* numOfTables) {
|
int32_t metaGetStbStats(void *pVnode, int64_t uid, int64_t *numOfTables) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
*numOfTables = 0;
|
*numOfTables = 0;
|
||||||
|
|
||||||
SVnode* pVnodeObj = pVnode;
|
SVnode *pVnodeObj = pVnode;
|
||||||
metaRLock(pVnodeObj->pMeta);
|
metaRLock(pVnodeObj->pMeta);
|
||||||
|
|
||||||
// fast path: search cache
|
// fast path: search cache
|
||||||
|
|
|
@ -13,8 +13,10 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include "vnodeInt.h"
|
||||||
#include "meta.h"
|
#include "meta.h"
|
||||||
|
|
||||||
|
|
||||||
static int metaHandleSmaEntry(SMeta *pMeta, const SMetaEntry *pME);
|
static int metaHandleSmaEntry(SMeta *pMeta, const SMetaEntry *pME);
|
||||||
static int metaSaveSmaToDB(SMeta *pMeta, const SMetaEntry *pME);
|
static int metaSaveSmaToDB(SMeta *pMeta, const SMetaEntry *pME);
|
||||||
|
|
||||||
|
|
|
@ -838,22 +838,96 @@ int metaDropTable(SMeta *pMeta, int64_t version, SVDropTbReq *pReq, SArray *tbUi
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void metaDropTables(SMeta *pMeta, SArray *tbUids) {
|
||||||
|
metaWLock(pMeta);
|
||||||
|
for (int i = 0; i < TARRAY_SIZE(tbUids); ++i) {
|
||||||
|
tb_uid_t uid = *(tb_uid_t *)taosArrayGet(tbUids, i);
|
||||||
|
metaDropTableByUid(pMeta, uid, NULL);
|
||||||
|
metaDebug("batch drop table:%" PRId64, uid);
|
||||||
|
}
|
||||||
|
metaULock(pMeta);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t metaFilterTableByHash(SMeta *pMeta, SArray *uidList) {
|
||||||
|
int32_t code = 0;
|
||||||
|
// 1, tranverse table's
|
||||||
|
// 2, validate table name using vnodeValidateTableHash
|
||||||
|
// 3, push invalidated table's uid into uidList
|
||||||
|
|
||||||
|
TBC *pCur;
|
||||||
|
code = tdbTbcOpen(pMeta->pTbDb, &pCur, NULL);
|
||||||
|
if (code < 0) {
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = tdbTbcMoveToFirst(pCur);
|
||||||
|
if (code) {
|
||||||
|
tdbTbcClose(pCur);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *pData = NULL, *pKey = NULL;
|
||||||
|
int nData = 0, nKey = 0;
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
int32_t ret = tdbTbcNext(pCur, &pKey, &nKey, &pData, &nData);
|
||||||
|
if (ret < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SMetaEntry me = {0};
|
||||||
|
SDecoder dc = {0};
|
||||||
|
tDecoderInit(&dc, pData, nData);
|
||||||
|
metaDecodeEntry(&dc, &me);
|
||||||
|
if (me.type != TSDB_SUPER_TABLE) {
|
||||||
|
int32_t ret = vnodeValidateTableHash(pMeta->pVnode, me.name);
|
||||||
|
if (TSDB_CODE_VND_HASH_MISMATCH == ret) {
|
||||||
|
taosArrayPush(uidList, &me.uid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
}
|
||||||
|
tdbFree(pData);
|
||||||
|
tdbFree(pKey);
|
||||||
|
tdbTbcClose(pCur);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t metaTrimTables(SMeta *pMeta) {
|
||||||
|
int32_t code = 0;
|
||||||
|
|
||||||
|
SArray *tbUids = taosArrayInit(8, sizeof(int64_t));
|
||||||
|
if (tbUids == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
code = metaFilterTableByHash(pMeta, tbUids);
|
||||||
|
if (code != 0) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
if (TARRAY_SIZE(tbUids) == 0) {
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
metaDropTables(pMeta, tbUids);
|
||||||
|
|
||||||
|
end:
|
||||||
|
taosArrayDestroy(tbUids);
|
||||||
|
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
int metaTtlDropTable(SMeta *pMeta, int64_t ttl, SArray *tbUids) {
|
int metaTtlDropTable(SMeta *pMeta, int64_t ttl, SArray *tbUids) {
|
||||||
int ret = metaTtlSmaller(pMeta, ttl, tbUids);
|
int ret = metaTtlSmaller(pMeta, ttl, tbUids);
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
if (taosArrayGetSize(tbUids) == 0) {
|
if (TARRAY_SIZE(tbUids) == 0) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
metaWLock(pMeta);
|
metaDropTables(pMeta, tbUids);
|
||||||
for (int i = 0; i < taosArrayGetSize(tbUids); ++i) {
|
|
||||||
tb_uid_t *uid = (tb_uid_t *)taosArrayGet(tbUids, i);
|
|
||||||
metaDropTableByUid(pMeta, *uid, NULL);
|
|
||||||
metaDebug("ttl drop table:%" PRId64, *uid);
|
|
||||||
}
|
|
||||||
metaULock(pMeta);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,7 +1073,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
|
|
||||||
metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1);
|
metaUpdateStbStats(pMeta, e.ctbEntry.suid, -1);
|
||||||
metaUidCacheClear(pMeta, e.ctbEntry.suid);
|
metaUidCacheClear(pMeta, e.ctbEntry.suid);
|
||||||
metaTbGroupCacheClear(pMeta, e.ctbEntry.suid);
|
metaTbGroupCacheClear(pMeta, e.ctbEntry.suid);
|
||||||
} else if (e.type == TSDB_NORMAL_TABLE) {
|
} else if (e.type == TSDB_NORMAL_TABLE) {
|
||||||
// drop schema.db (todo)
|
// drop schema.db (todo)
|
||||||
|
|
||||||
|
@ -1011,7 +1085,7 @@ static int metaDropTableByUid(SMeta *pMeta, tb_uid_t uid, int *type) {
|
||||||
|
|
||||||
metaStatsCacheDrop(pMeta, uid);
|
metaStatsCacheDrop(pMeta, uid);
|
||||||
metaUidCacheClear(pMeta, uid);
|
metaUidCacheClear(pMeta, uid);
|
||||||
metaTbGroupCacheClear(pMeta, uid);
|
metaTbGroupCacheClear(pMeta, uid);
|
||||||
--pMeta->pVnode->config.vndStats.numOfSTables;
|
--pMeta->pVnode->config.vndStats.numOfSTables;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1432,7 +1506,7 @@ static int metaUpdateTableTagVal(SMeta *pMeta, int64_t version, SVAlterTbReq *pA
|
||||||
((STag *)(ctbEntry.ctbEntry.pTags))->len, pMeta->txn);
|
((STag *)(ctbEntry.ctbEntry.pTags))->len, pMeta->txn);
|
||||||
|
|
||||||
metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
metaUidCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
||||||
metaTbGroupCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
metaTbGroupCacheClear(pMeta, ctbEntry.ctbEntry.suid);
|
||||||
|
|
||||||
metaULock(pMeta);
|
metaULock(pMeta);
|
||||||
|
|
||||||
|
|
|
@ -23,8 +23,8 @@
|
||||||
static int32_t tqInitialize(STQ* pTq);
|
static int32_t tqInitialize(STQ* pTq);
|
||||||
|
|
||||||
static FORCE_INLINE bool tqIsHandleExec(STqHandle* pHandle) { return TMQ_HANDLE_STATUS_EXEC == pHandle->status; }
|
static FORCE_INLINE bool tqIsHandleExec(STqHandle* pHandle) { return TMQ_HANDLE_STATUS_EXEC == pHandle->status; }
|
||||||
static FORCE_INLINE void tqSetHandleExec(STqHandle* pHandle) {pHandle->status = TMQ_HANDLE_STATUS_EXEC;}
|
static FORCE_INLINE void tqSetHandleExec(STqHandle* pHandle) { pHandle->status = TMQ_HANDLE_STATUS_EXEC; }
|
||||||
static FORCE_INLINE void tqSetHandleIdle(STqHandle* pHandle) {pHandle->status = TMQ_HANDLE_STATUS_IDLE;}
|
static FORCE_INLINE void tqSetHandleIdle(STqHandle* pHandle) { pHandle->status = TMQ_HANDLE_STATUS_IDLE; }
|
||||||
|
|
||||||
int32_t tqInit() {
|
int32_t tqInit() {
|
||||||
int8_t old;
|
int8_t old;
|
||||||
|
@ -75,8 +75,10 @@ static void destroyTqHandle(void* data) {
|
||||||
} else if (pData->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pData->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
walCloseReader(pData->pWalReader);
|
walCloseReader(pData->pWalReader);
|
||||||
tqReaderClose(pData->execHandle.pTqReader);
|
tqReaderClose(pData->execHandle.pTqReader);
|
||||||
|
taosMemoryFreeClear(pData->execHandle.execTb.qmsg);
|
||||||
|
nodesDestroyNode(pData->execHandle.execTb.node);
|
||||||
}
|
}
|
||||||
if(pData->msg != NULL) {
|
if (pData->msg != NULL) {
|
||||||
rpcFreeCont(pData->msg->pCont);
|
rpcFreeCont(pData->msg->pCont);
|
||||||
taosMemoryFree(pData->msg);
|
taosMemoryFree(pData->msg);
|
||||||
pData->msg = NULL;
|
pData->msg = NULL;
|
||||||
|
@ -238,14 +240,15 @@ int32_t tqPushDataRsp(STqHandle* pHandle, int32_t vgId) {
|
||||||
|
|
||||||
int64_t sver = 0, ever = 0;
|
int64_t sver = 0, ever = 0;
|
||||||
walReaderValidVersionRange(pHandle->execHandle.pTqReader->pWalReader, &sver, &ever);
|
walReaderValidVersionRange(pHandle->execHandle.pTqReader->pWalReader, &sver, &ever);
|
||||||
tqDoSendDataRsp(&pHandle->msg->info, &dataRsp, pHandle->epoch, pHandle->consumerId, TMQ_MSG_TYPE__POLL_RSP, sver, ever);
|
tqDoSendDataRsp(&pHandle->msg->info, &dataRsp, pHandle->epoch, pHandle->consumerId, TMQ_MSG_TYPE__POLL_RSP, sver,
|
||||||
|
ever);
|
||||||
|
|
||||||
char buf1[80] = {0};
|
char buf1[80] = {0};
|
||||||
char buf2[80] = {0};
|
char buf2[80] = {0};
|
||||||
tFormatOffset(buf1, tListLen(buf1), &dataRsp.reqOffset);
|
tFormatOffset(buf1, tListLen(buf1), &dataRsp.reqOffset);
|
||||||
tFormatOffset(buf2, tListLen(buf2), &dataRsp.rspOffset);
|
tFormatOffset(buf2, tListLen(buf2), &dataRsp.rspOffset);
|
||||||
tqDebug("vgId:%d, from consumer:0x%" PRIx64 " (epoch %d) push rsp, block num: %d, req:%s, rsp:%s",
|
tqDebug("vgId:%d, from consumer:0x%" PRIx64 " (epoch %d) push rsp, block num: %d, req:%s, rsp:%s", vgId,
|
||||||
vgId, dataRsp.head.consumerId, dataRsp.head.epoch, dataRsp.blockNum, buf1, buf2);
|
dataRsp.head.consumerId, dataRsp.head.epoch, dataRsp.blockNum, buf1, buf2);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -261,8 +264,8 @@ int32_t tqSendDataRsp(STqHandle* pHandle, const SRpcMsg* pMsg, const SMqPollReq*
|
||||||
tFormatOffset(buf1, 80, &pRsp->reqOffset);
|
tFormatOffset(buf1, 80, &pRsp->reqOffset);
|
||||||
tFormatOffset(buf2, 80, &pRsp->rspOffset);
|
tFormatOffset(buf2, 80, &pRsp->rspOffset);
|
||||||
|
|
||||||
tqDebug("vgId:%d consumer:0x%" PRIx64 " (epoch %d) send rsp, block num:%d, req:%s, rsp:%s, reqId:0x%" PRIx64,
|
tqDebug("vgId:%d consumer:0x%" PRIx64 " (epoch %d) send rsp, block num:%d, req:%s, rsp:%s, reqId:0x%" PRIx64, vgId,
|
||||||
vgId, pReq->consumerId, pReq->epoch, pRsp->blockNum, buf1, buf2, pReq->reqId);
|
pReq->consumerId, pReq->epoch, pRsp->blockNum, buf1, buf2, pReq->reqId);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -334,8 +337,7 @@ int32_t tqProcessSeekReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen)
|
||||||
|
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, pOffset->subKey, strlen(pOffset->subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, pOffset->subKey, strlen(pOffset->subKey));
|
||||||
if (pHandle == NULL) {
|
if (pHandle == NULL) {
|
||||||
tqError("tmq seek: consumer:0x%" PRIx64 " vgId:%d subkey %s not found", vgOffset.consumerId, vgId,
|
tqError("tmq seek: consumer:0x%" PRIx64 " vgId:%d subkey %s not found", vgOffset.consumerId, vgId, pOffset->subKey);
|
||||||
pOffset->subKey);
|
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -351,7 +353,7 @@ int32_t tqProcessSeekReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen)
|
||||||
}
|
}
|
||||||
taosRUnLockLatch(&pTq->lock);
|
taosRUnLockLatch(&pTq->lock);
|
||||||
|
|
||||||
//3. check the offset info
|
// 3. check the offset info
|
||||||
STqOffset* pSavedOffset = tqOffsetRead(pTq->pOffsetStore, pOffset->subKey);
|
STqOffset* pSavedOffset = tqOffsetRead(pTq->pOffsetStore, pOffset->subKey);
|
||||||
if (pSavedOffset != NULL) {
|
if (pSavedOffset != NULL) {
|
||||||
if (pSavedOffset->val.type != TMQ_OFFSET__LOG) {
|
if (pSavedOffset->val.type != TMQ_OFFSET__LOG) {
|
||||||
|
@ -379,7 +381,7 @@ int32_t tqProcessSeekReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen)
|
||||||
tqDebug("vgId:%d sub:%s seek to:%" PRId64 " prev offset:%" PRId64, vgId, pOffset->subKey, pOffset->val.version,
|
tqDebug("vgId:%d sub:%s seek to:%" PRId64 " prev offset:%" PRId64, vgId, pOffset->subKey, pOffset->val.version,
|
||||||
pSavedOffset->val.version);
|
pSavedOffset->val.version);
|
||||||
} else {
|
} else {
|
||||||
tqDebug("vgId:%d sub:%s seek to:%"PRId64" not saved yet", vgId, pOffset->subKey, pOffset->val.version);
|
tqDebug("vgId:%d sub:%s seek to:%" PRId64 " not saved yet", vgId, pOffset->subKey, pOffset->val.version);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tqOffsetWrite(pTq->pOffsetStore, pOffset) < 0) {
|
if (tqOffsetWrite(pTq->pOffsetStore, pOffset) < 0) {
|
||||||
|
@ -421,6 +423,7 @@ int32_t tqCheckColModifiable(STQ* pTq, int64_t tbUid, int32_t colId) {
|
||||||
|
|
||||||
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
SMqPollReq req = {0};
|
SMqPollReq req = {0};
|
||||||
|
int code = 0;
|
||||||
if (tDeserializeSMqPollReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
|
if (tDeserializeSMqPollReq(pMsg->pCont, pMsg->contLen, &req) < 0) {
|
||||||
tqError("tDeserializeSMqPollReq %d failed", pMsg->contLen);
|
tqError("tDeserializeSMqPollReq %d failed", pMsg->contLen);
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
@ -431,37 +434,49 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
int32_t reqEpoch = req.epoch;
|
int32_t reqEpoch = req.epoch;
|
||||||
STqOffsetVal reqOffset = req.reqOffset;
|
STqOffsetVal reqOffset = req.reqOffset;
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
STqHandle* pHandle = NULL;
|
||||||
|
|
||||||
taosWLockLatch(&pTq->lock);
|
while (1) {
|
||||||
// 1. find handle
|
taosWLockLatch(&pTq->lock);
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
// 1. find handle
|
||||||
if (pHandle == NULL) {
|
pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
||||||
tqError("tmq poll: consumer:0x%" PRIx64 " vgId:%d subkey %s not found", consumerId, vgId, req.subKey);
|
if (pHandle == NULL) {
|
||||||
terrno = TSDB_CODE_INVALID_MSG;
|
tqError("tmq poll: consumer:0x%" PRIx64 " vgId:%d subkey %s not found", consumerId, vgId, req.subKey);
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. check re-balance status
|
||||||
|
if (pHandle->consumerId != consumerId) {
|
||||||
|
tqError("ERROR tmq poll: consumer:0x%" PRIx64
|
||||||
|
" vgId:%d, subkey %s, mismatch for saved handle consumer:0x%" PRIx64,
|
||||||
|
consumerId, TD_VID(pTq->pVnode), req.subKey, pHandle->consumerId);
|
||||||
|
terrno = TSDB_CODE_TMQ_CONSUMER_MISMATCH;
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool exec = tqIsHandleExec(pHandle);
|
||||||
|
if (!exec) {
|
||||||
|
tqSetHandleExec(pHandle);
|
||||||
|
// qSetTaskCode(pHandle->execHandle.task, TDB_CODE_SUCCESS);
|
||||||
|
tqDebug("tmq poll: consumer:0x%" PRIx64 "vgId:%d, topic:%s, set handle exec, pHandle:%p", consumerId, vgId,
|
||||||
|
req.subKey, pHandle);
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
|
break;
|
||||||
|
}
|
||||||
taosWUnLockLatch(&pTq->lock);
|
taosWUnLockLatch(&pTq->lock);
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
while (tqIsHandleExec(pHandle)) {
|
tqDebug("tmq poll: consumer:0x%" PRIx64
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 "vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", consumerId, vgId, req.subKey);
|
"vgId:%d, topic:%s, subscription is executing, wait for 10ms and retry, pHandle:%p",
|
||||||
taosMsleep(5);
|
consumerId, vgId, req.subKey, pHandle);
|
||||||
|
taosMsleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 2. check re-balance status
|
|
||||||
if (pHandle->consumerId != consumerId) {
|
|
||||||
tqDebug("ERROR tmq poll: consumer:0x%" PRIx64 " vgId:%d, subkey %s, mismatch for saved handle consumer:0x%" PRIx64,
|
|
||||||
consumerId, vgId, req.subKey, pHandle->consumerId);
|
|
||||||
terrno = TSDB_CODE_TMQ_CONSUMER_MISMATCH;
|
|
||||||
taosWUnLockLatch(&pTq->lock);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
tqSetHandleExec(pHandle);
|
|
||||||
taosWUnLockLatch(&pTq->lock);
|
|
||||||
|
|
||||||
// 3. update the epoch value
|
// 3. update the epoch value
|
||||||
int32_t savedEpoch = pHandle->epoch;
|
if (pHandle->epoch < reqEpoch) {
|
||||||
if (savedEpoch < reqEpoch) {
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " epoch update from %d to %d by poll req", consumerId, pHandle->epoch,
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " epoch update from %d to %d by poll req", consumerId, savedEpoch,
|
|
||||||
reqEpoch);
|
reqEpoch);
|
||||||
pHandle->epoch = reqEpoch;
|
pHandle->epoch = reqEpoch;
|
||||||
}
|
}
|
||||||
|
@ -471,8 +486,11 @@ int32_t tqProcessPollReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 " (epoch %d), subkey %s, recv poll req vgId:%d, req:%s, reqId:0x%" PRIx64,
|
tqDebug("tmq poll: consumer:0x%" PRIx64 " (epoch %d), subkey %s, recv poll req vgId:%d, req:%s, reqId:0x%" PRIx64,
|
||||||
consumerId, req.epoch, pHandle->subKey, vgId, buf, req.reqId);
|
consumerId, req.epoch, pHandle->subKey, vgId, buf, req.reqId);
|
||||||
|
|
||||||
int code = tqExtractDataForMq(pTq, pHandle, &req, pMsg);
|
code = tqExtractDataForMq(pTq, pHandle, &req, pMsg);
|
||||||
tqSetHandleIdle(pHandle);
|
tqSetHandleIdle(pHandle);
|
||||||
|
|
||||||
|
tqDebug("tmq poll: consumer:0x%" PRIx64 "vgId:%d, topic:%s, , set handle idle, pHandle:%p", consumerId, vgId,
|
||||||
|
req.subKey, pHandle);
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -536,7 +554,7 @@ int32_t tqProcessVgWalInfoReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
|
|
||||||
if (reqOffset.type == TMQ_OFFSET__LOG) {
|
if (reqOffset.type == TMQ_OFFSET__LOG) {
|
||||||
int64_t currentVer = walReaderGetCurrentVer(pHandle->execHandle.pTqReader->pWalReader);
|
int64_t currentVer = walReaderGetCurrentVer(pHandle->execHandle.pTqReader->pWalReader);
|
||||||
if (currentVer == -1) { // not start to read data from wal yet, return req offset directly
|
if (currentVer == -1) { // not start to read data from wal yet, return req offset directly
|
||||||
dataRsp.rspOffset.version = reqOffset.version;
|
dataRsp.rspOffset.version = reqOffset.version;
|
||||||
} else {
|
} else {
|
||||||
dataRsp.rspOffset.version = currentVer; // return current consume offset value
|
dataRsp.rspOffset.version = currentVer; // return current consume offset value
|
||||||
|
@ -560,7 +578,7 @@ int32_t tqProcessVgWalInfoReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
|
|
||||||
int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) {
|
int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) {
|
||||||
SMqVDeleteReq* pReq = (SMqVDeleteReq*)msg;
|
SMqVDeleteReq* pReq = (SMqVDeleteReq*)msg;
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
|
||||||
tqDebug("vgId:%d, tq process delete sub req %s", vgId, pReq->subKey);
|
tqDebug("vgId:%d, tq process delete sub req %s", vgId, pReq->subKey);
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -569,8 +587,9 @@ int32_t tqProcessDeleteSubReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, pReq->subKey, strlen(pReq->subKey));
|
||||||
if (pHandle) {
|
if (pHandle) {
|
||||||
while (tqIsHandleExec(pHandle)) {
|
while (tqIsHandleExec(pHandle)) {
|
||||||
tqDebug("vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
tqDebug("vgId:%d, topic:%s, subscription is executing, wait for 10ms and retry, pHandle:%p", vgId,
|
||||||
taosMsleep(5);
|
pHandle->subKey, pHandle);
|
||||||
|
taosMsleep(10);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pHandle->pRef) {
|
if (pHandle->pRef) {
|
||||||
|
@ -629,9 +648,18 @@ int32_t tqProcessDelCheckInfoReq(STQ* pTq, int64_t sversion, char* msg, int32_t
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) {
|
int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) {
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
SMqRebVgReq req = {0};
|
SMqRebVgReq req = {0};
|
||||||
tDecodeSMqRebVgReq(msg, &req);
|
SDecoder dc = {0};
|
||||||
|
|
||||||
|
tDecoderInit(&dc, msg, msgLen);
|
||||||
|
|
||||||
|
// decode req
|
||||||
|
if (tDecodeSMqRebVgReq(&dc, &req) < 0) {
|
||||||
|
terrno = TSDB_CODE_INVALID_MSG;
|
||||||
|
tDecoderClear(&dc);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
SVnode* pVnode = pTq->pVnode;
|
SVnode* pVnode = pTq->pVnode;
|
||||||
int32_t vgId = TD_VID(pVnode);
|
int32_t vgId = TD_VID(pVnode);
|
||||||
|
@ -639,7 +667,6 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
tqDebug("vgId:%d, tq process sub req:%s, Id:0x%" PRIx64 " -> Id:0x%" PRIx64, pVnode->config.vgId, req.subKey,
|
tqDebug("vgId:%d, tq process sub req:%s, Id:0x%" PRIx64 " -> Id:0x%" PRIx64, pVnode->config.vgId, req.subKey,
|
||||||
req.oldConsumerId, req.newConsumerId);
|
req.oldConsumerId, req.newConsumerId);
|
||||||
|
|
||||||
taosWLockLatch(&pTq->lock);
|
|
||||||
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
STqHandle* pHandle = taosHashGet(pTq->pHandle, req.subKey, strlen(req.subKey));
|
||||||
if (pHandle == NULL) {
|
if (pHandle == NULL) {
|
||||||
if (req.oldConsumerId != -1) {
|
if (req.oldConsumerId != -1) {
|
||||||
|
@ -655,7 +682,6 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
STqHandle tqHandle = {0};
|
STqHandle tqHandle = {0};
|
||||||
pHandle = &tqHandle;
|
pHandle = &tqHandle;
|
||||||
|
|
||||||
uint64_t oldConsumerId = pHandle->consumerId;
|
|
||||||
memcpy(pHandle->subKey, req.subKey, TSDB_SUBSCRIBE_KEY_LEN);
|
memcpy(pHandle->subKey, req.subKey, TSDB_SUBSCRIBE_KEY_LEN);
|
||||||
pHandle->consumerId = req.newConsumerId;
|
pHandle->consumerId = req.newConsumerId;
|
||||||
pHandle->epoch = -1;
|
pHandle->epoch = -1;
|
||||||
|
@ -679,8 +705,7 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
pHandle->snapshotVer = ver;
|
pHandle->snapshotVer = ver;
|
||||||
|
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
pHandle->execHandle.execCol.qmsg = req.qmsg;
|
pHandle->execHandle.execCol.qmsg = taosStrdup(req.qmsg);
|
||||||
req.qmsg = NULL;
|
|
||||||
|
|
||||||
pHandle->execHandle.task = qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, vgId,
|
pHandle->execHandle.task = qCreateQueueExecTaskInfo(pHandle->execHandle.execCol.qmsg, &handle, vgId,
|
||||||
&pHandle->execHandle.numOfCols, req.newConsumerId);
|
&pHandle->execHandle.numOfCols, req.newConsumerId);
|
||||||
|
@ -700,67 +725,75 @@ int32_t tqProcessSubscribeReq(STQ* pTq, int64_t sversion, char* msg, int32_t msg
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
pHandle->pWalReader = walOpenReader(pVnode->pWal, NULL);
|
pHandle->pWalReader = walOpenReader(pVnode->pWal, NULL);
|
||||||
pHandle->execHandle.execTb.suid = req.suid;
|
pHandle->execHandle.execTb.suid = req.suid;
|
||||||
|
pHandle->execHandle.execTb.qmsg = taosStrdup(req.qmsg);
|
||||||
|
|
||||||
SArray* tbUidList = taosArrayInit(0, sizeof(int64_t));
|
if (strcmp(pHandle->execHandle.execTb.qmsg, "") != 0) {
|
||||||
vnodeGetCtbIdList(pVnode, req.suid, tbUidList);
|
if (nodesStringToNode(pHandle->execHandle.execTb.qmsg, &pHandle->execHandle.execTb.node) != 0) {
|
||||||
tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pVnode->config.vgId, req.suid);
|
tqError("nodesStringToNode error in sub stable, since %s, vgId:%d, subkey:%s consumer:0x%" PRIx64, terrstr(),
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) {
|
pVnode->config.vgId, req.subKey, pHandle->consumerId);
|
||||||
int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i);
|
return -1;
|
||||||
tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid);
|
}
|
||||||
}
|
}
|
||||||
pHandle->execHandle.pTqReader = tqReaderOpen(pVnode);
|
|
||||||
tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList);
|
|
||||||
taosArrayDestroy(tbUidList);
|
|
||||||
|
|
||||||
buildSnapContext(handle.vnode, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta,
|
buildSnapContext(handle.vnode, handle.version, req.suid, pHandle->execHandle.subType, pHandle->fetchMeta,
|
||||||
(SSnapContext**)(&handle.sContext));
|
(SSnapContext**)(&handle.sContext));
|
||||||
pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, req.newConsumerId);
|
pHandle->execHandle.task = qCreateQueueExecTaskInfo(NULL, &handle, vgId, NULL, req.newConsumerId);
|
||||||
|
|
||||||
|
SArray* tbUidList = NULL;
|
||||||
|
ret = qGetTableList(req.suid, pVnode, pHandle->execHandle.execTb.node, &tbUidList, pHandle->execHandle.task);
|
||||||
|
if (ret != TDB_CODE_SUCCESS) {
|
||||||
|
tqError("qGetTableList error:%d vgId:%d, subkey:%s consumer:0x%" PRIx64, ret, pVnode->config.vgId, req.subKey,
|
||||||
|
pHandle->consumerId);
|
||||||
|
taosArrayDestroy(tbUidList);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
tqDebug("tq try to get ctb for stb subscribe, vgId:%d, subkey:%s consumer:0x%" PRIx64 " suid:%" PRId64,
|
||||||
|
pVnode->config.vgId, req.subKey, pHandle->consumerId, req.suid);
|
||||||
|
pHandle->execHandle.pTqReader = tqReaderOpen(pVnode);
|
||||||
|
tqReaderSetTbUidList(pHandle->execHandle.pTqReader, tbUidList, NULL);
|
||||||
|
taosArrayDestroy(tbUidList);
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, req.subKey, strlen(req.subKey), pHandle, sizeof(STqHandle));
|
||||||
tqDebug("try to persist handle %s consumer:0x%" PRIx64 " , old consumer:0x%" PRIx64, req.subKey,
|
tqDebug("try to persist handle %s consumer:0x%" PRIx64, req.subKey, pHandle->consumerId);
|
||||||
pHandle->consumerId, oldConsumerId);
|
|
||||||
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
||||||
goto end;
|
goto end;
|
||||||
} else {
|
} else {
|
||||||
while (tqIsHandleExec(pHandle)) {
|
taosWLockLatch(&pTq->lock);
|
||||||
tqDebug("sub req vgId:%d, topic:%s, subscription is executing, wait for 5ms and retry", vgId, pHandle->subKey);
|
|
||||||
taosMsleep(5);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (pHandle->consumerId == req.newConsumerId) { // do nothing
|
if (pHandle->consumerId == req.newConsumerId) { // do nothing
|
||||||
tqInfo("vgId:%d consumer:0x%" PRIx64 " remains, no switch occurs", req.vgId, req.newConsumerId);
|
tqInfo("vgId:%d consumer:0x%" PRIx64 " remains, no switch occurs, should not reach here", req.vgId,
|
||||||
atomic_add_fetch_32(&pHandle->epoch, 1);
|
req.newConsumerId);
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
tqInfo("vgId:%d switch consumer from Id:0x%" PRIx64 " to Id:0x%" PRIx64, req.vgId, pHandle->consumerId,
|
tqInfo("vgId:%d switch consumer from Id:0x%" PRIx64 " to Id:0x%" PRIx64, req.vgId, pHandle->consumerId,
|
||||||
req.newConsumerId);
|
req.newConsumerId);
|
||||||
atomic_store_64(&pHandle->consumerId, req.newConsumerId);
|
atomic_store_64(&pHandle->consumerId, req.newConsumerId);
|
||||||
atomic_store_32(&pHandle->epoch, 0);
|
|
||||||
}
|
}
|
||||||
|
// atomic_add_fetch_32(&pHandle->epoch, 1);
|
||||||
|
|
||||||
// kill executing task
|
// kill executing task
|
||||||
qTaskInfo_t pTaskInfo = pHandle->execHandle.task;
|
// if(tqIsHandleExec(pHandle)) {
|
||||||
if (pTaskInfo != NULL) {
|
// qTaskInfo_t pTaskInfo = pHandle->execHandle.task;
|
||||||
qKillTask(pTaskInfo, TSDB_CODE_SUCCESS);
|
// if (pTaskInfo != NULL) {
|
||||||
}
|
// qKillTask(pTaskInfo, TSDB_CODE_SUCCESS);
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
// }
|
||||||
qStreamCloseTsdbReader(pTaskInfo);
|
|
||||||
}
|
// if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
|
// qStreamCloseTsdbReader(pTaskInfo);
|
||||||
|
// }
|
||||||
|
// }
|
||||||
// remove if it has been register in the push manager, and return one empty block to consumer
|
// remove if it has been register in the push manager, and return one empty block to consumer
|
||||||
tqUnregisterPushHandle(pTq, pHandle);
|
tqUnregisterPushHandle(pTq, pHandle);
|
||||||
|
taosWUnLockLatch(&pTq->lock);
|
||||||
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
ret = tqMetaSaveHandle(pTq, req.subKey, pHandle);
|
||||||
goto end;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
taosWUnLockLatch(&pTq->lock);
|
tDecoderClear(&dc);
|
||||||
taosMemoryFree(req.qmsg);
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
void freePtr(void *ptr) {
|
void freePtr(void* ptr) { taosMemoryFree(*(void**)ptr); }
|
||||||
taosMemoryFree(*(void**)ptr);
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver) {
|
int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver) {
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
@ -783,7 +816,7 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver) {
|
||||||
pTask->chkInfo.currentVer = ver;
|
pTask->chkInfo.currentVer = ver;
|
||||||
|
|
||||||
// expand executor
|
// expand executor
|
||||||
pTask->status.taskStatus = (pTask->fillHistory)? TASK_STATUS__WAIT_DOWNSTREAM:TASK_STATUS__NORMAL;
|
pTask->status.taskStatus = (pTask->fillHistory) ? TASK_STATUS__WAIT_DOWNSTREAM : TASK_STATUS__NORMAL;
|
||||||
|
|
||||||
if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
if (pTask->taskLevel == TASK_LEVEL__SOURCE) {
|
||||||
pTask->pState = streamStateOpen(pTq->pStreamMeta->path, pTask, false, -1, -1);
|
pTask->pState = streamStateOpen(pTq->pStreamMeta->path, pTask, false, -1, -1);
|
||||||
|
@ -849,8 +882,8 @@ int32_t tqExpandTask(STQ* pTq, SStreamTask* pTask, int64_t ver) {
|
||||||
|
|
||||||
streamSetupTrigger(pTask);
|
streamSetupTrigger(pTask);
|
||||||
|
|
||||||
tqInfo("vgId:%d expand stream task, s-task:%s, checkpoint ver:%" PRId64 " child id:%d, level:%d", vgId, pTask->id.idStr,
|
tqInfo("vgId:%d expand stream task, s-task:%s, checkpoint ver:%" PRId64 " child id:%d, level:%d", vgId,
|
||||||
pTask->chkInfo.version, pTask->selfChildId, pTask->taskLevel);
|
pTask->id.idStr, pTask->chkInfo.version, pTask->selfChildId, pTask->taskLevel);
|
||||||
|
|
||||||
// next valid version will add one
|
// next valid version will add one
|
||||||
pTask->chkInfo.version += 1;
|
pTask->chkInfo.version += 1;
|
||||||
|
@ -963,7 +996,8 @@ int32_t tqProcessTaskDeployReq(STQ* pTq, int64_t sversion, char* msg, int32_t ms
|
||||||
SStreamTask* pTask = taosMemoryCalloc(1, sizeof(SStreamTask));
|
SStreamTask* pTask = taosMemoryCalloc(1, sizeof(SStreamTask));
|
||||||
if (pTask == NULL) {
|
if (pTask == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
tqError("vgId:%d failed to create stream task due to out of memory, alloc size:%d", vgId, (int32_t) sizeof(SStreamTask));
|
tqError("vgId:%d failed to create stream task due to out of memory, alloc size:%d", vgId,
|
||||||
|
(int32_t)sizeof(SStreamTask));
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1078,7 +1112,7 @@ int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t sversion, char* msg, int32_t
|
||||||
|
|
||||||
// do recovery step 2
|
// do recovery step 2
|
||||||
int64_t st = taosGetTimestampMs();
|
int64_t st = taosGetTimestampMs();
|
||||||
tqDebug("s-task:%s start step2 recover, ts:%"PRId64, pTask->id.idStr, st);
|
tqDebug("s-task:%s start step2 recover, ts:%" PRId64, pTask->id.idStr, st);
|
||||||
|
|
||||||
code = streamSourceRecoverScanStep2(pTask, sversion);
|
code = streamSourceRecoverScanStep2(pTask, sversion);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
|
@ -1086,7 +1120,8 @@ int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t sversion, char* msg, int32_t
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("s-task:%s set the start wal offset to be:%"PRId64, pTask->id.idStr, sversion);
|
qDebug("s-task:%s set start wal scan start ver:%"PRId64, pTask->id.idStr, sversion);
|
||||||
|
|
||||||
walReaderSeekVer(pTask->exec.pWalReader, sversion);
|
walReaderSeekVer(pTask->exec.pWalReader, sversion);
|
||||||
pTask->chkInfo.currentVer = sversion;
|
pTask->chkInfo.currentVer = sversion;
|
||||||
|
|
||||||
|
@ -1110,7 +1145,7 @@ int32_t tqProcessTaskRecover2Req(STQ* pTq, int64_t sversion, char* msg, int32_t
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
double el = (taosGetTimestampMs() - st)/ 1000.0;
|
double el = (taosGetTimestampMs() - st) / 1000.0;
|
||||||
tqDebug("s-task:%s step2 recover finished, el:%.2fs", pTask->id.idStr, el);
|
tqDebug("s-task:%s step2 recover finished, el:%.2fs", pTask->id.idStr, el);
|
||||||
|
|
||||||
// dispatch recover finish req to all related downstream task
|
// dispatch recover finish req to all related downstream task
|
||||||
|
@ -1226,12 +1261,12 @@ int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
|
SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
|
||||||
if (pTask != NULL) {
|
if (pTask != NULL) {
|
||||||
if (pTask->status.taskStatus == TASK_STATUS__NORMAL) {
|
if (pTask->status.taskStatus == TASK_STATUS__NORMAL) {
|
||||||
tqDebug("vgId:%d s-task:%s start to process block from wal, last chk point:%" PRId64, vgId,
|
tqDebug("vgId:%d s-task:%s start to process block from wal, last chk point:%" PRId64, vgId, pTask->id.idStr,
|
||||||
pTask->id.idStr, pTask->chkInfo.version);
|
pTask->chkInfo.version);
|
||||||
streamProcessRunReq(pTask);
|
streamProcessRunReq(pTask);
|
||||||
} else {
|
} else {
|
||||||
if (streamTaskShouldPause(&pTask->status)) {
|
if (streamTaskShouldPause(&pTask->status)) {
|
||||||
atomic_val_compare_exchange_8(&pTask->status.schedStatus, TASK_SCHED_STATUS__WAITING, TASK_SCHED_STATUS__INACTIVE);
|
atomic_store_8(&pTask->status.schedStatus, TASK_SCHED_STATUS__INACTIVE);
|
||||||
}
|
}
|
||||||
tqDebug("vgId:%d s-task:%s ignore run req since not in ready state", vgId, pTask->id.idStr);
|
tqDebug("vgId:%d s-task:%s ignore run req since not in ready state", vgId, pTask->id.idStr);
|
||||||
}
|
}
|
||||||
|
@ -1246,9 +1281,9 @@ int32_t tqProcessTaskRunReq(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec) {
|
int32_t tqProcessTaskDispatchReq(STQ* pTq, SRpcMsg* pMsg, bool exec) {
|
||||||
char* msgStr = pMsg->pCont;
|
char* msgStr = pMsg->pCont;
|
||||||
char* msgBody = POINTER_SHIFT(msgStr, sizeof(SMsgHead));
|
char* msgBody = POINTER_SHIFT(msgStr, sizeof(SMsgHead));
|
||||||
int32_t msgLen = pMsg->contLen - sizeof(SMsgHead);
|
int32_t msgLen = pMsg->contLen - sizeof(SMsgHead);
|
||||||
|
|
||||||
SStreamDispatchReq req = {0};
|
SStreamDispatchReq req = {0};
|
||||||
|
|
||||||
|
@ -1272,13 +1307,15 @@ int32_t tqProcessTaskDispatchRsp(STQ* pTq, SRpcMsg* pMsg) {
|
||||||
SStreamDispatchRsp* pRsp = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
|
SStreamDispatchRsp* pRsp = POINTER_SHIFT(pMsg->pCont, sizeof(SMsgHead));
|
||||||
int32_t taskId = ntohl(pRsp->upstreamTaskId);
|
int32_t taskId = ntohl(pRsp->upstreamTaskId);
|
||||||
SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
|
SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, taskId);
|
||||||
tqDebug("recv dispatch rsp, code:%x", pMsg->code);
|
|
||||||
|
int32_t vgId = pTq->pStreamMeta->vgId;
|
||||||
if (pTask) {
|
if (pTask) {
|
||||||
streamProcessDispatchRsp(pTask, pRsp, pMsg->code);
|
streamProcessDispatchRsp(pTask, pRsp, pMsg->code);
|
||||||
streamMetaReleaseTask(pTq->pStreamMeta, pTask);
|
streamMetaReleaseTask(pTq->pStreamMeta, pTask);
|
||||||
return 0;
|
return 0;
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
tqDebug("vgId:%d failed to handle the dispatch rsp, since find task:0x%x failed", vgId, taskId);
|
||||||
|
return TSDB_CODE_INVALID_MSG;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1292,7 +1329,7 @@ int32_t tqProcessTaskDropReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgL
|
||||||
|
|
||||||
int32_t tqProcessTaskPauseReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) {
|
int32_t tqProcessTaskPauseReq(STQ* pTq, int64_t sversion, char* msg, int32_t msgLen) {
|
||||||
SVPauseStreamTaskReq* pReq = (SVPauseStreamTaskReq*)msg;
|
SVPauseStreamTaskReq* pReq = (SVPauseStreamTaskReq*)msg;
|
||||||
SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, pReq->taskId);
|
SStreamTask* pTask = streamMetaAcquireTask(pTq->pStreamMeta, pReq->taskId);
|
||||||
if (pTask) {
|
if (pTask) {
|
||||||
tqDebug("vgId:%d s-task:%s set pause flag", pTq->pStreamMeta->vgId, pTask->id.idStr);
|
tqDebug("vgId:%d s-task:%s set pause flag", pTq->pStreamMeta->vgId, pTask->id.idStr);
|
||||||
atomic_store_8(&pTask->status.keepTaskStatus, pTask->status.taskStatus);
|
atomic_store_8(&pTask->status.keepTaskStatus, pTask->status.taskStatus);
|
||||||
|
|
|
@ -37,6 +37,9 @@ int32_t tEncodeSTqHandle(SEncoder* pEncoder, const STqHandle* pHandle) {
|
||||||
}
|
}
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
if (tEncodeI64(pEncoder, pHandle->execHandle.execTb.suid) < 0) return -1;
|
if (tEncodeI64(pEncoder, pHandle->execHandle.execTb.suid) < 0) return -1;
|
||||||
|
if (pHandle->execHandle.execTb.qmsg != NULL){
|
||||||
|
if (tEncodeCStr(pEncoder, pHandle->execHandle.execTb.qmsg) < 0) return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tEndEncode(pEncoder);
|
tEndEncode(pEncoder);
|
||||||
return pEncoder->pos;
|
return pEncoder->pos;
|
||||||
|
@ -64,6 +67,9 @@ int32_t tDecodeSTqHandle(SDecoder* pDecoder, STqHandle* pHandle) {
|
||||||
}
|
}
|
||||||
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
if (tDecodeI64(pDecoder, &pHandle->execHandle.execTb.suid) < 0) return -1;
|
if (tDecodeI64(pDecoder, &pHandle->execHandle.execTb.suid) < 0) return -1;
|
||||||
|
if (!tDecodeIsEnd(pDecoder)){
|
||||||
|
if (tDecodeCStrAlloc(pDecoder, &pHandle->execHandle.execTb.qmsg) < 0) return -1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
tEndDecode(pDecoder);
|
tEndDecode(pDecoder);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -337,25 +343,30 @@ int32_t tqMetaRestoreHandle(STQ* pTq) {
|
||||||
} else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (handle.execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
handle.pWalReader = walOpenReader(pTq->pVnode->pWal, NULL);
|
||||||
|
|
||||||
SArray* tbUidList = taosArrayInit(0, sizeof(int64_t));
|
if(handle.execHandle.execTb.qmsg != NULL && strcmp(handle.execHandle.execTb.qmsg, "") != 0) {
|
||||||
vnodeGetCtbIdList(pTq->pVnode, handle.execHandle.execTb.suid, tbUidList);
|
if (nodesStringToNode(handle.execHandle.execTb.qmsg, &handle.execHandle.execTb.node) != 0) {
|
||||||
tqDebug("vgId:%d, tq try to get all ctb, suid:%" PRId64, pTq->pVnode->config.vgId, handle.execHandle.execTb.suid);
|
tqError("nodesStringToNode error in sub stable, since %s", terrstr());
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(tbUidList); i++) {
|
return -1;
|
||||||
int64_t tbUid = *(int64_t*)taosArrayGet(tbUidList, i);
|
}
|
||||||
tqDebug("vgId:%d, idx %d, uid:%" PRId64, vgId, i, tbUid);
|
|
||||||
}
|
}
|
||||||
handle.execHandle.pTqReader = tqReaderOpen(pTq->pVnode);
|
|
||||||
tqReaderSetTbUidList(handle.execHandle.pTqReader, tbUidList);
|
|
||||||
taosArrayDestroy(tbUidList);
|
|
||||||
|
|
||||||
buildSnapContext(reader.vnode, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType,
|
buildSnapContext(reader.vnode, reader.version, handle.execHandle.execTb.suid, handle.execHandle.subType,
|
||||||
handle.fetchMeta, (SSnapContext**)(&reader.sContext));
|
handle.fetchMeta, (SSnapContext**)(&reader.sContext));
|
||||||
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0);
|
handle.execHandle.task = qCreateQueueExecTaskInfo(NULL, &reader, vgId, NULL, 0);
|
||||||
|
|
||||||
|
SArray* tbUidList = NULL;
|
||||||
|
int ret = qGetTableList(handle.execHandle.execTb.suid, pTq->pVnode, handle.execHandle.execTb.node, &tbUidList, handle.execHandle.task);
|
||||||
|
if(ret != TDB_CODE_SUCCESS) {
|
||||||
|
tqError("qGetTableList error:%d handle %s consumer:0x%" PRIx64, ret, handle.subKey, handle.consumerId);
|
||||||
|
taosArrayDestroy(tbUidList);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
tqDebug("vgId:%d, tq try to get ctb for stb subscribe, suid:%" PRId64, pTq->pVnode->config.vgId, handle.execHandle.execTb.suid);
|
||||||
|
handle.execHandle.pTqReader = tqReaderOpen(pTq->pVnode);
|
||||||
|
tqReaderSetTbUidList(handle.execHandle.pTqReader, tbUidList, NULL);
|
||||||
|
taosArrayDestroy(tbUidList);
|
||||||
}
|
}
|
||||||
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, vgId);
|
tqDebug("tq restore %s consumer %" PRId64 " vgId:%d", handle.subKey, handle.consumerId, vgId);
|
||||||
taosWLockLatch(&pTq->lock);
|
|
||||||
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
taosHashPut(pTq->pHandle, pKey, kLen, &handle, sizeof(STqHandle));
|
||||||
taosWUnLockLatch(&pTq->lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end:
|
end:
|
||||||
|
|
|
@ -78,7 +78,6 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname) {
|
||||||
|
|
||||||
// todo remove this
|
// todo remove this
|
||||||
if (offset.val.type == TMQ_OFFSET__LOG) {
|
if (offset.val.type == TMQ_OFFSET__LOG) {
|
||||||
taosWLockLatch(&pStore->pTq->lock);
|
|
||||||
STqHandle* pHandle = taosHashGet(pStore->pTq->pHandle, offset.subKey, strlen(offset.subKey));
|
STqHandle* pHandle = taosHashGet(pStore->pTq->pHandle, offset.subKey, strlen(offset.subKey));
|
||||||
if (pHandle) {
|
if (pHandle) {
|
||||||
if (walSetRefVer(pHandle->pRef, offset.val.version) < 0) {
|
if (walSetRefVer(pHandle->pRef, offset.val.version) < 0) {
|
||||||
|
@ -86,7 +85,6 @@ int32_t tqOffsetRestoreFromFile(STqOffsetStore* pStore, const char* fname) {
|
||||||
// offset.val.version);
|
// offset.val.version);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosWUnLockLatch(&pStore->pTq->lock);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
taosMemoryFree(pMemBuf);
|
taosMemoryFree(pMemBuf);
|
||||||
|
|
|
@ -101,8 +101,11 @@ int32_t tqUnregisterPushHandle(STQ* pTq, void *handle) {
|
||||||
STqHandle *pHandle = (STqHandle*)handle;
|
STqHandle *pHandle = (STqHandle*)handle;
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
|
||||||
|
if(taosHashGetSize(pTq->pPushMgr) <= 0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int32_t ret = taosHashRemove(pTq->pPushMgr, pHandle->subKey, strlen(pHandle->subKey));
|
int32_t ret = taosHashRemove(pTq->pPushMgr, pHandle->subKey, strlen(pHandle->subKey));
|
||||||
tqError("vgId:%d remove pHandle:%p,ret:%d consumer Id:0x%" PRIx64, vgId, pHandle, ret, pHandle->consumerId);
|
tqDebug("vgId:%d remove pHandle:%p,ret:%d consumer Id:0x%" PRIx64, vgId, pHandle, ret, pHandle->consumerId);
|
||||||
|
|
||||||
if(pHandle->msg != NULL) {
|
if(pHandle->msg != NULL) {
|
||||||
tqPushDataRsp(pHandle, vgId);
|
tqPushDataRsp(pHandle, vgId);
|
||||||
|
|
|
@ -394,8 +394,8 @@ bool tqNextBlockInWal(STqReader* pReader, const char* id) {
|
||||||
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk);
|
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk);
|
||||||
|
|
||||||
if (pReader->tbIdHash == NULL) {
|
if (pReader->tbIdHash == NULL) {
|
||||||
SSDataBlock* pRes = NULL;
|
SSDataBlock* pRes = NULL;
|
||||||
int32_t code = tqRetrieveDataBlock(pReader, &pRes, NULL);
|
int32_t code = tqRetrieveDataBlock(pReader, &pRes, NULL);
|
||||||
if (code == TSDB_CODE_SUCCESS && pRes->info.rows > 0) {
|
if (code == TSDB_CODE_SUCCESS && pRes->info.rows > 0) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -457,7 +457,7 @@ bool tqNextBlockImpl(STqReader* pReader, const char* idstr) {
|
||||||
|
|
||||||
int32_t numOfBlocks = taosArrayGetSize(pReader->submit.aSubmitTbData);
|
int32_t numOfBlocks = taosArrayGetSize(pReader->submit.aSubmitTbData);
|
||||||
while (pReader->nextBlk < numOfBlocks) {
|
while (pReader->nextBlk < numOfBlocks) {
|
||||||
tqDebug("tq reader next data block, len:%d ver:%" PRId64 " index:%d/%d, %s", pReader->msg.msgLen, pReader->msg.ver,
|
tqDebug("try next data block, len:%d ver:%" PRId64 " index:%d/%d, %s", pReader->msg.msgLen, pReader->msg.ver,
|
||||||
pReader->nextBlk, numOfBlocks, idstr);
|
pReader->nextBlk, numOfBlocks, idstr);
|
||||||
|
|
||||||
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk);
|
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk);
|
||||||
|
@ -467,10 +467,11 @@ bool tqNextBlockImpl(STqReader* pReader, const char* idstr) {
|
||||||
|
|
||||||
void* ret = taosHashGet(pReader->tbIdHash, &pSubmitTbData->uid, sizeof(int64_t));
|
void* ret = taosHashGet(pReader->tbIdHash, &pSubmitTbData->uid, sizeof(int64_t));
|
||||||
if (ret != NULL) {
|
if (ret != NULL) {
|
||||||
tqDebug("tq reader block found, ver:%" PRId64 ", uid:%" PRId64, pReader->msg.ver, pSubmitTbData->uid);
|
tqDebug("block found, ver:%" PRId64 ", uid:%" PRId64", %s", pReader->msg.ver, pSubmitTbData->uid, idstr);
|
||||||
return true;
|
return true;
|
||||||
} else {
|
} else {
|
||||||
tqDebug("tq reader discard submit block, uid:%" PRId64 ", continue", pSubmitTbData->uid);
|
tqDebug("discard submit block, uid:%" PRId64 ", total queried tables:%d continue %s", pSubmitTbData->uid,
|
||||||
|
taosHashGetSize(pReader->tbIdHash), idstr);
|
||||||
}
|
}
|
||||||
|
|
||||||
pReader->nextBlk++;
|
pReader->nextBlk++;
|
||||||
|
@ -604,7 +605,6 @@ static int32_t doSetVal(SColumnInfoData* pColumnInfoData, int32_t rowIndex, SCol
|
||||||
|
|
||||||
int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* id) {
|
int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char* id) {
|
||||||
tqDebug("tq reader retrieve data block %p, index:%d", pReader->msg.msgStr, pReader->nextBlk);
|
tqDebug("tq reader retrieve data block %p, index:%d", pReader->msg.msgStr, pReader->nextBlk);
|
||||||
|
|
||||||
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk++);
|
SSubmitTbData* pSubmitTbData = taosArrayGet(pReader->submit.aSubmitTbData, pReader->nextBlk++);
|
||||||
|
|
||||||
SSDataBlock* pBlock = pReader->pResBlock;
|
SSDataBlock* pBlock = pReader->pResBlock;
|
||||||
|
@ -612,6 +612,7 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char*
|
||||||
|
|
||||||
blockDataCleanup(pBlock);
|
blockDataCleanup(pBlock);
|
||||||
|
|
||||||
|
int32_t vgId = pReader->pWalReader->pWal->cfg.vgId;
|
||||||
int32_t sversion = pSubmitTbData->sver;
|
int32_t sversion = pSubmitTbData->sver;
|
||||||
int64_t suid = pSubmitTbData->suid;
|
int64_t suid = pSubmitTbData->suid;
|
||||||
int64_t uid = pSubmitTbData->uid;
|
int64_t uid = pSubmitTbData->uid;
|
||||||
|
@ -628,7 +629,7 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char*
|
||||||
if (pReader->pSchemaWrapper == NULL) {
|
if (pReader->pSchemaWrapper == NULL) {
|
||||||
tqWarn("vgId:%d, cannot found schema wrapper for table: suid:%" PRId64 ", uid:%" PRId64
|
tqWarn("vgId:%d, cannot found schema wrapper for table: suid:%" PRId64 ", uid:%" PRId64
|
||||||
"version %d, possibly dropped table",
|
"version %d, possibly dropped table",
|
||||||
pReader->pWalReader->pWal->cfg.vgId, suid, uid, pReader->cachedSchemaVer);
|
vgId, suid, uid, pReader->cachedSchemaVer);
|
||||||
pReader->cachedSchemaSuid = 0;
|
pReader->cachedSchemaSuid = 0;
|
||||||
terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
|
terrno = TSDB_CODE_TQ_TABLE_SCHEMA_NOT_FOUND;
|
||||||
return -1;
|
return -1;
|
||||||
|
@ -642,6 +643,7 @@ int32_t tqRetrieveDataBlock(STqReader* pReader, SSDataBlock** pRes, const char*
|
||||||
if (blockDataGetNumOfCols(pBlock) == 0) {
|
if (blockDataGetNumOfCols(pBlock) == 0) {
|
||||||
int32_t code = buildResSDataBlock(pReader->pResBlock, pReader->pSchemaWrapper, pReader->pColIdList);
|
int32_t code = buildResSDataBlock(pReader->pResBlock, pReader->pSchemaWrapper, pReader->pColIdList);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tqError("vgId:%d failed to build data block, code:%s", vgId, tstrerror(code));
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -998,7 +1000,7 @@ FAIL:
|
||||||
|
|
||||||
void tqReaderSetColIdList(STqReader* pReader, SArray* pColIdList) { pReader->pColIdList = pColIdList; }
|
void tqReaderSetColIdList(STqReader* pReader, SArray* pColIdList) { pReader->pColIdList = pColIdList; }
|
||||||
|
|
||||||
int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) {
|
int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList, const char* id) {
|
||||||
if (pReader->tbIdHash) {
|
if (pReader->tbIdHash) {
|
||||||
taosHashClear(pReader->tbIdHash);
|
taosHashClear(pReader->tbIdHash);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1015,6 +1017,7 @@ int tqReaderSetTbUidList(STqReader* pReader, const SArray* tbUidList) {
|
||||||
taosHashPut(pReader->tbIdHash, pKey, sizeof(int64_t), NULL, 0);
|
taosHashPut(pReader->tbIdHash, pKey, sizeof(int64_t), NULL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tqDebug("s-task:%s %d tables are set to be queried target table", id, (int32_t) taosArrayGetSize(tbUidList));
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1059,7 +1062,6 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
|
||||||
// update the table list for each consumer handle
|
// update the table list for each consumer handle
|
||||||
taosWLockLatch(&pTq->lock);
|
|
||||||
while (1) {
|
while (1) {
|
||||||
pIter = taosHashIterate(pTq->pHandle, pIter);
|
pIter = taosHashIterate(pTq->pHandle, pIter);
|
||||||
if (pIter == NULL) {
|
if (pIter == NULL) {
|
||||||
|
@ -1083,40 +1085,20 @@ int32_t tqUpdateTbUidList(STQ* pTq, const SArray* tbUidList, bool isAdd) {
|
||||||
}
|
}
|
||||||
} else if (pTqHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
} else if (pTqHandle->execHandle.subType == TOPIC_SUB_TYPE__TABLE) {
|
||||||
if (isAdd) {
|
if (isAdd) {
|
||||||
SArray* qa = taosArrayInit(4, sizeof(tb_uid_t));
|
SArray* list = NULL;
|
||||||
SMetaReader mr = {0};
|
int ret = qGetTableList(pTqHandle->execHandle.execTb.suid, pTq->pVnode, pTqHandle->execHandle.execTb.node, &list, pTqHandle->execHandle.task);
|
||||||
metaReaderInit(&mr, pTq->pVnode->pMeta, 0);
|
if(ret != TDB_CODE_SUCCESS) {
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(tbUidList); ++i) {
|
tqError("qGetTableList in tqUpdateTbUidList error:%d handle %s consumer:0x%" PRIx64, ret, pTqHandle->subKey, pTqHandle->consumerId);
|
||||||
uint64_t* id = (uint64_t*)taosArrayGet(tbUidList, i);
|
taosArrayDestroy(list);
|
||||||
|
return ret;
|
||||||
int32_t code = metaReaderGetTableEntryByUidCache(&mr, *id);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
tqError("failed to get table meta, uid:%" PRIu64 " code:%s", *id, tstrerror(terrno));
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
tDecoderClear(&mr.coder);
|
|
||||||
if (mr.me.type != TSDB_CHILD_TABLE || mr.me.ctbEntry.suid != pTqHandle->execHandle.execTb.suid) {
|
|
||||||
tqDebug("table uid %" PRId64 " does not add to tq handle", *id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
tqDebug("table uid %" PRId64 " add to tq handle", *id);
|
|
||||||
taosArrayPush(qa, id);
|
|
||||||
}
|
}
|
||||||
|
tqReaderSetTbUidList(pTqHandle->execHandle.pTqReader, list, NULL);
|
||||||
metaReaderClear(&mr);
|
taosArrayDestroy(list);
|
||||||
if (taosArrayGetSize(qa) > 0) {
|
|
||||||
tqReaderAddTbUidList(pTqHandle->execHandle.pTqReader, qa);
|
|
||||||
}
|
|
||||||
|
|
||||||
taosArrayDestroy(qa);
|
|
||||||
} else {
|
} else {
|
||||||
tqReaderRemoveTbUidList(pTqHandle->execHandle.pTqReader, tbUidList);
|
tqReaderRemoveTbUidList(pTqHandle->execHandle.pTqReader, tbUidList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
taosWUnLockLatch(&pTq->lock);
|
|
||||||
|
|
||||||
// update the table list handle for each stream scanner/wal reader
|
// update the table list handle for each stream scanner/wal reader
|
||||||
taosWLockLatch(&pTq->pStreamMeta->lock);
|
taosWLockLatch(&pTq->pStreamMeta->lock);
|
||||||
|
|
|
@ -84,8 +84,10 @@ int32_t tqScanData(STQ* pTq, const STqHandle* pHandle, SMqDataRsp* pRsp, STqOffs
|
||||||
qStreamSetOpen(task);
|
qStreamSetOpen(task);
|
||||||
|
|
||||||
tqDebug("consumer:0x%" PRIx64 " vgId:%d, tmq one task start execute", pHandle->consumerId, vgId);
|
tqDebug("consumer:0x%" PRIx64 " vgId:%d, tmq one task start execute", pHandle->consumerId, vgId);
|
||||||
if (qExecTask(task, &pDataBlock, &ts) != TSDB_CODE_SUCCESS) {
|
code = qExecTask(task, &pDataBlock, &ts);
|
||||||
tqError("consumer:0x%" PRIx64 " vgId:%d, task exec error since %s", pHandle->consumerId, vgId, terrstr());
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
tqError("consumer:0x%" PRIx64 " vgId:%d, task exec error since %s", pHandle->consumerId, vgId, tstrerror(code));
|
||||||
|
terrno = code;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,8 +130,10 @@ int32_t tqScanTaosx(STQ* pTq, const STqHandle* pHandle, STaosxRsp* pRsp, SMqMeta
|
||||||
SSDataBlock* pDataBlock = NULL;
|
SSDataBlock* pDataBlock = NULL;
|
||||||
uint64_t ts = 0;
|
uint64_t ts = 0;
|
||||||
tqDebug("tmqsnap task start to execute");
|
tqDebug("tmqsnap task start to execute");
|
||||||
if (qExecTask(task, &pDataBlock, &ts) < 0) {
|
int code = qExecTask(task, &pDataBlock, &ts);
|
||||||
tqError("vgId:%d, task exec error since %s", pTq->pVnode->config.vgId, terrstr());
|
if (code != 0) {
|
||||||
|
tqError("vgId:%d, task exec error since %s", pTq->pVnode->config.vgId, tstrerror(code));
|
||||||
|
terrno = code;
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -137,7 +137,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
|
||||||
|
|
||||||
int32_t blockSz = taosArrayGetSize(pBlocks);
|
int32_t blockSz = taosArrayGetSize(pBlocks);
|
||||||
|
|
||||||
tqDebug("vgId:%d, s-task:%s write results blocks:%d into table", TD_VID(pVnode), pTask->id.idStr, blockSz);
|
tqDebug("vgId:%d, s-task:%s write results %d blocks into table", TD_VID(pVnode), pTask->id.idStr, blockSz);
|
||||||
|
|
||||||
void* pBuf = NULL;
|
void* pBuf = NULL;
|
||||||
SArray* tagArray = NULL;
|
SArray* tagArray = NULL;
|
||||||
|
@ -294,6 +294,7 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
|
||||||
|
|
||||||
char* ctbName = pDataBlock->info.parTbName;
|
char* ctbName = pDataBlock->info.parTbName;
|
||||||
if (!ctbName[0]) {
|
if (!ctbName[0]) {
|
||||||
|
memset(ctbName, 0, TSDB_TABLE_NAME_LEN);
|
||||||
if (res == TSDB_CODE_SUCCESS) {
|
if (res == TSDB_CODE_SUCCESS) {
|
||||||
memcpy(ctbName, pTableSinkInfo->tbName, strlen(pTableSinkInfo->tbName));
|
memcpy(ctbName, pTableSinkInfo->tbName, strlen(pTableSinkInfo->tbName));
|
||||||
} else {
|
} else {
|
||||||
|
@ -482,17 +483,15 @@ void tqSinkToTablePipeline(SStreamTask* pTask, void* vnode, int64_t ver, void* d
|
||||||
tEncoderClear(&encoder);
|
tEncoderClear(&encoder);
|
||||||
tDestroySubmitReq(&submitReq, TSDB_MSG_FLG_ENCODE);
|
tDestroySubmitReq(&submitReq, TSDB_MSG_FLG_ENCODE);
|
||||||
|
|
||||||
SRpcMsg msg = {
|
SRpcMsg msg = { .msgType = TDMT_VND_SUBMIT, .pCont = pBuf, .contLen = len };
|
||||||
.msgType = TDMT_VND_SUBMIT,
|
|
||||||
.pCont = pBuf,
|
|
||||||
.contLen = len,
|
|
||||||
};
|
|
||||||
|
|
||||||
if (tmsgPutToQueue(&pVnode->msgCb, WRITE_QUEUE, &msg) != 0) {
|
if (tmsgPutToQueue(&pVnode->msgCb, WRITE_QUEUE, &msg) != 0) {
|
||||||
tqDebug("failed to put into write-queue since %s", terrstr());
|
tqDebug("failed to put into write-queue since %s", terrstr());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tqDebug("vgId:%d, s-task:%s write results completed", TD_VID(pVnode), pTask->id.idStr);
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
taosArrayDestroy(tagArray);
|
taosArrayDestroy(tagArray);
|
||||||
taosArrayDestroy(pVals);
|
taosArrayDestroy(pVals);
|
||||||
|
|
|
@ -15,8 +15,7 @@
|
||||||
|
|
||||||
#include "tq.h"
|
#include "tq.h"
|
||||||
|
|
||||||
#define IS_OFFSET_RESET_TYPE(_t) ((_t) < 0)
|
#define IS_OFFSET_RESET_TYPE(_t) ((_t) < 0)
|
||||||
#define NO_POLL_CNT 5
|
|
||||||
|
|
||||||
static int32_t tqSendMetaPollRsp(STqHandle* pHandle, const SRpcMsg* pMsg, const SMqPollReq* pReq,
|
static int32_t tqSendMetaPollRsp(STqHandle* pHandle, const SRpcMsg* pMsg, const SMqPollReq* pReq,
|
||||||
const SMqMetaRsp* pRsp, int32_t vgId);
|
const SMqMetaRsp* pRsp, int32_t vgId);
|
||||||
|
@ -89,15 +88,13 @@ static int32_t tqInitTaosxRsp(STaosxRsp* pRsp, const SMqPollReq* pReq) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t extractResetOffsetVal(STqOffsetVal* pOffsetVal, STQ* pTq, STqHandle* pHandle, const SMqPollReq* pRequest,
|
static int32_t extractResetOffsetVal(STqOffsetVal* pOffsetVal, STQ* pTq, STqHandle* pHandle, const SMqPollReq* pRequest, SRpcMsg* pMsg, bool* pBlockReturned) {
|
||||||
SRpcMsg* pMsg, bool* pBlockReturned) {
|
|
||||||
uint64_t consumerId = pRequest->consumerId;
|
uint64_t consumerId = pRequest->consumerId;
|
||||||
STqOffsetVal reqOffset = pRequest->reqOffset;
|
STqOffsetVal reqOffset = pRequest->reqOffset;
|
||||||
STqOffset* pOffset = tqOffsetRead(pTq->pOffsetStore, pRequest->subKey);
|
STqOffset* pOffset = tqOffsetRead(pTq->pOffsetStore, pRequest->subKey);
|
||||||
int32_t vgId = TD_VID(pTq->pVnode);
|
int32_t vgId = TD_VID(pTq->pVnode);
|
||||||
|
|
||||||
*pBlockReturned = false;
|
*pBlockReturned = false;
|
||||||
|
|
||||||
// In this vnode, data has been polled by consumer for this topic, so let's continue from the last offset value.
|
// In this vnode, data has been polled by consumer for this topic, so let's continue from the last offset value.
|
||||||
if (pOffset != NULL) {
|
if (pOffset != NULL) {
|
||||||
*pOffsetVal = pOffset->val;
|
*pOffsetVal = pOffset->val;
|
||||||
|
@ -121,21 +118,16 @@ static int32_t extractResetOffsetVal(STqOffsetVal* pOffsetVal, STQ* pTq, STqHand
|
||||||
tqOffsetResetToData(pOffsetVal, 0, 0);
|
tqOffsetResetToData(pOffsetVal, 0, 0);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
pHandle->pRef = walRefFirstVer(pTq->pVnode->pWal, pHandle->pRef);
|
walRefFirstVer(pTq->pVnode->pWal, pHandle->pRef);
|
||||||
if (pHandle->pRef == NULL) {
|
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
// offset set to previous version when init
|
|
||||||
tqOffsetResetToLog(pOffsetVal, pHandle->pRef->refVer - 1);
|
tqOffsetResetToLog(pOffsetVal, pHandle->pRef->refVer - 1);
|
||||||
}
|
}
|
||||||
} else if (reqOffset.type == TMQ_OFFSET__RESET_LATEST) {
|
} else if (reqOffset.type == TMQ_OFFSET__RESET_LATEST) {
|
||||||
|
walRefLastVer(pTq->pVnode->pWal, pHandle->pRef);
|
||||||
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
if (pHandle->execHandle.subType == TOPIC_SUB_TYPE__COLUMN) {
|
||||||
SMqDataRsp dataRsp = {0};
|
SMqDataRsp dataRsp = {0};
|
||||||
tqInitDataRsp(&dataRsp, pRequest);
|
tqInitDataRsp(&dataRsp, pRequest);
|
||||||
|
|
||||||
tqOffsetResetToLog(&dataRsp.rspOffset, walGetLastVer(pTq->pVnode->pWal));
|
tqOffsetResetToLog(&dataRsp.rspOffset, pHandle->pRef->refVer);
|
||||||
tqDebug("tmq poll: consumer:0x%" PRIx64 ", subkey %s, vgId:%d, (latest) offset reset to %" PRId64, consumerId,
|
tqDebug("tmq poll: consumer:0x%" PRIx64 ", subkey %s, vgId:%d, (latest) offset reset to %" PRId64, consumerId,
|
||||||
pHandle->subKey, vgId, dataRsp.rspOffset.version);
|
pHandle->subKey, vgId, dataRsp.rspOffset.version);
|
||||||
int32_t code = tqSendDataRsp(pHandle, pMsg, pRequest, &dataRsp, TMQ_MSG_TYPE__POLL_RSP, vgId);
|
int32_t code = tqSendDataRsp(pHandle, pMsg, pRequest, &dataRsp, TMQ_MSG_TYPE__POLL_RSP, vgId);
|
||||||
|
@ -146,7 +138,7 @@ static int32_t extractResetOffsetVal(STqOffsetVal* pOffsetVal, STQ* pTq, STqHand
|
||||||
} else {
|
} else {
|
||||||
STaosxRsp taosxRsp = {0};
|
STaosxRsp taosxRsp = {0};
|
||||||
tqInitTaosxRsp(&taosxRsp, pRequest);
|
tqInitTaosxRsp(&taosxRsp, pRequest);
|
||||||
tqOffsetResetToLog(&taosxRsp.rspOffset, walGetLastVer(pTq->pVnode->pWal));
|
tqOffsetResetToLog(&taosxRsp.rspOffset, pHandle->pRef->refVer);
|
||||||
int32_t code = tqSendDataRsp(pHandle, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP, vgId);
|
int32_t code = tqSendDataRsp(pHandle, pMsg, pRequest, (SMqDataRsp*)&taosxRsp, TMQ_MSG_TYPE__TAOSX_RSP, vgId);
|
||||||
tDeleteSTaosxRsp(&taosxRsp);
|
tDeleteSTaosxRsp(&taosxRsp);
|
||||||
|
|
||||||
|
@ -176,24 +168,18 @@ static int32_t extractDataAndRspForNormalSubscribe(STQ* pTq, STqHandle* pHandle,
|
||||||
|
|
||||||
qSetTaskId(pHandle->execHandle.task, consumerId, pRequest->reqId);
|
qSetTaskId(pHandle->execHandle.task, consumerId, pRequest->reqId);
|
||||||
code = tqScanData(pTq, pHandle, &dataRsp, pOffset);
|
code = tqScanData(pTq, pHandle, &dataRsp, pOffset);
|
||||||
if (code != 0) {
|
if(code != 0 && terrno != TSDB_CODE_WAL_LOG_NOT_EXIST) {
|
||||||
goto end;
|
goto end;
|
||||||
}
|
}
|
||||||
|
|
||||||
// till now, all data has been transferred to consumer, new data needs to push client once arrived.
|
// till now, all data has been transferred to consumer, new data needs to push client once arrived.
|
||||||
if (dataRsp.blockNum == 0 && dataRsp.reqOffset.type == TMQ_OFFSET__LOG &&
|
if (terrno == TSDB_CODE_WAL_LOG_NOT_EXIST && dataRsp.blockNum == 0) {
|
||||||
dataRsp.reqOffset.version == dataRsp.rspOffset.version && pHandle->consumerId == pRequest->consumerId) {
|
// lock
|
||||||
if (pHandle->noDataPollCnt >= NO_POLL_CNT) { // send poll result to client if no data 5 times to avoid lost data
|
taosWLockLatch(&pTq->lock);
|
||||||
pHandle->noDataPollCnt = 0;
|
code = tqRegisterPushHandle(pTq, pHandle, pMsg);
|
||||||
// lock
|
taosWUnLockLatch(&pTq->lock);
|
||||||
taosWLockLatch(&pTq->lock);
|
tDeleteMqDataRsp(&dataRsp);
|
||||||
code = tqRegisterPushHandle(pTq, pHandle, pMsg);
|
return code;
|
||||||
taosWUnLockLatch(&pTq->lock);
|
|
||||||
tDeleteMqDataRsp(&dataRsp);
|
|
||||||
return code;
|
|
||||||
} else {
|
|
||||||
pHandle->noDataPollCnt++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// NOTE: this pHandle->consumerId may have been changed already.
|
// NOTE: this pHandle->consumerId may have been changed already.
|
||||||
|
|
|
@ -128,6 +128,7 @@ static int32_t tsdbOpenRocksCache(STsdb *pTsdb) {
|
||||||
rocksdb_options_set_comparator(options, cmp);
|
rocksdb_options_set_comparator(options, cmp);
|
||||||
rocksdb_block_based_options_set_block_cache(tableoptions, cache);
|
rocksdb_block_based_options_set_block_cache(tableoptions, cache);
|
||||||
rocksdb_options_set_block_based_table_factory(options, tableoptions);
|
rocksdb_options_set_block_based_table_factory(options, tableoptions);
|
||||||
|
rocksdb_options_set_info_log_level(options, 2); // WARN_LEVEL
|
||||||
// rocksdb_options_set_inplace_update_support(options, 1);
|
// rocksdb_options_set_inplace_update_support(options, 1);
|
||||||
// rocksdb_options_set_allow_concurrent_memtable_write(options, 0);
|
// rocksdb_options_set_allow_concurrent_memtable_write(options, 0);
|
||||||
|
|
||||||
|
@ -1453,7 +1454,7 @@ static int32_t getTableDelDataFromDelIdx(SDelFReader *pDelReader, SDelIdx *pDelI
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (pDelIdx) {
|
if (pDelIdx) {
|
||||||
code = tsdbReadDelData(pDelReader, pDelIdx, aDelData);
|
code = tsdbReadDelDatav1(pDelReader, pDelIdx, aDelData, INT64_MAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -201,6 +201,9 @@ int32_t tsdbCacherowsReaderOpen(void* pVnode, int32_t type, void* pTableIdList,
|
||||||
|
|
||||||
void* tsdbCacherowsReaderClose(void* pReader) {
|
void* tsdbCacherowsReaderClose(void* pReader) {
|
||||||
SCacheRowsReader* p = pReader;
|
SCacheRowsReader* p = pReader;
|
||||||
|
if (p == NULL) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (p->pSchema != NULL) {
|
if (p->pSchema != NULL) {
|
||||||
for (int32_t i = 0; i < p->pSchema->numOfCols; ++i) {
|
for (int32_t i = 0; i < p->pSchema->numOfCols; ++i) {
|
||||||
|
|
|
@ -266,7 +266,7 @@ static int32_t tsdbCommitTableDel(SCommitter *pCommitter, STbData *pTbData, SDel
|
||||||
suid = pDelIdx->suid;
|
suid = pDelIdx->suid;
|
||||||
uid = pDelIdx->uid;
|
uid = pDelIdx->uid;
|
||||||
|
|
||||||
code = tsdbReadDelData(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData);
|
code = tsdbReadDelDatav1(pCommitter->pDelFReader, pDelIdx, pCommitter->aDelData, INT64_MAX);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
} else {
|
} else {
|
||||||
taosArrayClear(pCommitter->aDelData);
|
taosArrayClear(pCommitter->aDelData);
|
||||||
|
|
|
@ -412,7 +412,7 @@ static int32_t tsdbTombFileDataIterNext(STsdbDataIter2* pIter, STsdbFilterInfo*
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
code = tsdbReadDelData(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData);
|
code = tsdbReadDelDatav1(pIter->tIter.pReader, pDelIdx, pIter->tIter.aDelData, INT64_MAX);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
pIter->delInfo.suid = pDelIdx->suid;
|
pIter->delInfo.suid = pDelIdx->suid;
|
||||||
|
|
|
@ -754,7 +754,7 @@ static int32_t initResBlockInfo(SResultBlockInfo* pResBlockInfo, int64_t capacit
|
||||||
return terrno;
|
return terrno;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, STsdbReader** ppReader, int32_t capacity,
|
static int32_t tsdbReaderCreate(SVnode* pVnode, SQueryTableDataCond* pCond, void** ppReader, int32_t capacity,
|
||||||
SSDataBlock* pResBlock, const char* idstr) {
|
SSDataBlock* pResBlock, const char* idstr) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int8_t level = 0;
|
int8_t level = 0;
|
||||||
|
@ -1121,6 +1121,27 @@ static int32_t getEndPosInDataBlock(STsdbReader* pReader, SBlockData* pBlockData
|
||||||
endPos = doBinarySearchKey(pBlockData->aTSKEY, pBlock->nRow, pos, key, pReader->order);
|
endPos = doBinarySearchKey(pBlockData->aTSKEY, pBlock->nRow, pos, key, pReader->order);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if ((pReader->verRange.maxVer >= pBlock->minVer && pReader->verRange.maxVer < pBlock->maxVer)||
|
||||||
|
(pReader->verRange.minVer <= pBlock->maxVer && pReader->verRange.minVer > pBlock->minVer)) {
|
||||||
|
int32_t i = endPos;
|
||||||
|
|
||||||
|
if (asc) {
|
||||||
|
for(; i >= 0; --i) {
|
||||||
|
if (pBlockData->aVersion[i] <= pReader->verRange.maxVer) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(; i < pBlock->nRow; ++i) {
|
||||||
|
if (pBlockData->aVersion[i] >= pReader->verRange.minVer) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
endPos = i;
|
||||||
|
}
|
||||||
|
|
||||||
return endPos;
|
return endPos;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1260,10 +1281,11 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// row index of dump info remain the initial position, let's find the appropriate start position.
|
||||||
if ((pDumpInfo->rowIndex == 0 && asc) || (pDumpInfo->rowIndex == pBlock->nRow - 1 && (!asc))) {
|
if ((pDumpInfo->rowIndex == 0 && asc) || (pDumpInfo->rowIndex == pBlock->nRow - 1 && (!asc))) {
|
||||||
if (asc && pReader->window.skey <= pBlock->minKey.ts) {
|
if (asc && pReader->window.skey <= pBlock->minKey.ts && pReader->verRange.minVer <= pBlock->minVer) {
|
||||||
// pDumpInfo->rowIndex = 0;
|
// pDumpInfo->rowIndex = 0;
|
||||||
} else if (!asc && pReader->window.ekey >= pBlock->maxKey.ts) {
|
} else if (!asc && pReader->window.ekey >= pBlock->maxKey.ts && pReader->verRange.maxVer >= pBlock->maxVer) {
|
||||||
// pDumpInfo->rowIndex = pBlock->nRow - 1;
|
// pDumpInfo->rowIndex = pBlock->nRow - 1;
|
||||||
} else { // find the appropriate the start position in current block, and set it to be the current rowIndex
|
} else { // find the appropriate the start position in current block, and set it to be the current rowIndex
|
||||||
int32_t pos = asc ? pBlock->nRow - 1 : 0;
|
int32_t pos = asc ? pBlock->nRow - 1 : 0;
|
||||||
|
@ -1279,6 +1301,29 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader) {
|
||||||
pBlock->maxVer, pReader->idStr);
|
pBlock->maxVer, pReader->idStr);
|
||||||
return TSDB_CODE_INVALID_PARA;
|
return TSDB_CODE_INVALID_PARA;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ASSERT(pReader->verRange.minVer <= pBlock->maxVer && pReader->verRange.maxVer >= pBlock->minVer);
|
||||||
|
|
||||||
|
// find the appropriate start position that satisfies the version requirement.
|
||||||
|
if ((pReader->verRange.maxVer >= pBlock->minVer && pReader->verRange.maxVer < pBlock->maxVer)||
|
||||||
|
(pReader->verRange.minVer <= pBlock->maxVer && pReader->verRange.minVer > pBlock->minVer)) {
|
||||||
|
int32_t i = pDumpInfo->rowIndex;
|
||||||
|
if (asc) {
|
||||||
|
for(; i < pBlock->nRow; ++i) {
|
||||||
|
if (pBlockData->aVersion[i] >= pReader->verRange.minVer) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for(; i >= 0; --i) {
|
||||||
|
if (pBlockData->aVersion[i] <= pReader->verRange.maxVer) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pDumpInfo->rowIndex = i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1293,6 +1338,9 @@ static int32_t copyBlockDataToSDataBlock(STsdbReader* pReader) {
|
||||||
int32_t dumpedRows = asc ? (endIndex - pDumpInfo->rowIndex) : (pDumpInfo->rowIndex - endIndex);
|
int32_t dumpedRows = asc ? (endIndex - pDumpInfo->rowIndex) : (pDumpInfo->rowIndex - endIndex);
|
||||||
if (dumpedRows > pReader->resBlockInfo.capacity) { // output buffer check
|
if (dumpedRows > pReader->resBlockInfo.capacity) { // output buffer check
|
||||||
dumpedRows = pReader->resBlockInfo.capacity;
|
dumpedRows = pReader->resBlockInfo.capacity;
|
||||||
|
} else if (dumpedRows <= 0) { // no qualified rows in current data block, abort directly.
|
||||||
|
setBlockAllDumped(pDumpInfo, pReader->window.ekey, pReader->order);
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t i = 0;
|
int32_t i = 0;
|
||||||
|
@ -1848,7 +1896,7 @@ static bool isCleanFileDataBlock(STsdbReader* pReader, SFileDataBlockInfo* pBloc
|
||||||
SDataBlockToLoadInfo info = {0};
|
SDataBlockToLoadInfo info = {0};
|
||||||
getBlockToLoadInfo(&info, pBlockInfo, pBlock, pScanInfo, keyInBuf, pLastBlockReader, pReader);
|
getBlockToLoadInfo(&info, pBlockInfo, pBlock, pScanInfo, keyInBuf, pLastBlockReader, pReader);
|
||||||
bool isCleanFileBlock = !(info.overlapWithNeighborBlock || info.hasDupTs || info.overlapWithKeyInBuf ||
|
bool isCleanFileBlock = !(info.overlapWithNeighborBlock || info.hasDupTs || info.overlapWithKeyInBuf ||
|
||||||
info.overlapWithDelInfo || info.overlapWithLastBlock || info.partiallyRequired);
|
info.overlapWithDelInfo || info.overlapWithLastBlock);
|
||||||
return isCleanFileBlock;
|
return isCleanFileBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2809,7 +2857,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
// it is a clean block, load it directly
|
// it is a clean block, load it directly
|
||||||
if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader) &&
|
if (isCleanFileDataBlock(pReader, pBlockInfo, pBlock, pBlockScanInfo, keyInBuf, pLastBlockReader) &&
|
||||||
pBlock->nRow <= pReader->resBlockInfo.capacity) {
|
pBlock->nRow <= pReader->resBlockInfo.capacity) {
|
||||||
if (asc || ((!asc) && (!hasDataInLastBlock(pLastBlockReader)))) {
|
if (asc || (!hasDataInLastBlock(pLastBlockReader))) {
|
||||||
code = copyBlockDataToSDataBlock(pReader);
|
code = copyBlockDataToSDataBlock(pReader);
|
||||||
if (code) {
|
if (code) {
|
||||||
goto _end;
|
goto _end;
|
||||||
|
@ -2828,7 +2876,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
SBlockData* pBlockData = &pReader->status.fileBlockData;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
bool hasBlockData = false;
|
bool hasBlockData = false;
|
||||||
|
@ -2842,7 +2890,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
|
|
||||||
pDumpInfo->rowIndex += step;
|
pDumpInfo->rowIndex += step;
|
||||||
|
|
||||||
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
pBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
if (pDumpInfo->rowIndex >= pBlock->nRow || pDumpInfo->rowIndex < 0) {
|
if (pDumpInfo->rowIndex >= pBlock->nRow || pDumpInfo->rowIndex < 0) {
|
||||||
pBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter); // NOTE: get the new block info
|
pBlockInfo = getCurrentBlockInfo(&pReader->status.blockIter); // NOTE: get the new block info
|
||||||
|
|
||||||
|
@ -2870,7 +2918,7 @@ static int32_t buildComposedDataBlock(STsdbReader* pReader) {
|
||||||
|
|
||||||
// currently loaded file data block is consumed
|
// currently loaded file data block is consumed
|
||||||
if ((pBlockData->nRow > 0) && (pDumpInfo->rowIndex >= pBlockData->nRow || pDumpInfo->rowIndex < 0)) {
|
if ((pBlockData->nRow > 0) && (pDumpInfo->rowIndex >= pBlockData->nRow || pDumpInfo->rowIndex < 0)) {
|
||||||
SDataBlk* pBlock = getCurrentBlock(&pReader->status.blockIter);
|
pBlock = getCurrentBlock(&pReader->status.blockIter);
|
||||||
setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
|
setBlockAllDumped(pDumpInfo, pBlock->maxKey.ts, pReader->order);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2919,7 +2967,7 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
|
||||||
SDelIdx* pIdx = taosArraySearch(pReader->pDelIdx, &idx, tCmprDelIdx, TD_EQ);
|
SDelIdx* pIdx = taosArraySearch(pReader->pDelIdx, &idx, tCmprDelIdx, TD_EQ);
|
||||||
|
|
||||||
if (pIdx != NULL) {
|
if (pIdx != NULL) {
|
||||||
code = tsdbReadDelData(pReader->pDelFReader, pIdx, pDelData);
|
code = tsdbReadDelDatav1(pReader->pDelFReader, pIdx, pDelData, pReader->verRange.maxVer);
|
||||||
}
|
}
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _err;
|
goto _err;
|
||||||
|
@ -2930,7 +2978,10 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
|
||||||
if (pMemTbData != NULL) {
|
if (pMemTbData != NULL) {
|
||||||
p = pMemTbData->pHead;
|
p = pMemTbData->pHead;
|
||||||
while (p) {
|
while (p) {
|
||||||
taosArrayPush(pDelData, p);
|
if (p->version <= pReader->verRange.maxVer) {
|
||||||
|
taosArrayPush(pDelData, p);
|
||||||
|
}
|
||||||
|
|
||||||
p = p->pNext;
|
p = p->pNext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2938,7 +2989,9 @@ int32_t initDelSkylineIterator(STableBlockScanInfo* pBlockScanInfo, STsdbReader*
|
||||||
if (piMemTbData != NULL) {
|
if (piMemTbData != NULL) {
|
||||||
p = piMemTbData->pHead;
|
p = piMemTbData->pHead;
|
||||||
while (p) {
|
while (p) {
|
||||||
taosArrayPush(pDelData, p);
|
if (p->version <= pReader->verRange.maxVer) {
|
||||||
|
taosArrayPush(pDelData, p);
|
||||||
|
}
|
||||||
p = p->pNext;
|
p = p->pNext;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -4396,11 +4449,12 @@ static void freeSchemaFunc(void* param) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// ====================================== EXPOSED APIs ======================================
|
// ====================================== EXPOSED APIs ======================================
|
||||||
int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
int32_t tsdbReaderOpen(void* pVnode, SQueryTableDataCond* pCond, void* pTableList, int32_t numOfTables,
|
||||||
SSDataBlock* pResBlock, STsdbReader** ppReader, const char* idstr, bool countOnly, SHashObj** pIgnoreTables) {
|
SSDataBlock* pResBlock, void** ppReader, const char* idstr, bool countOnly, SHashObj** pIgnoreTables) {
|
||||||
STimeWindow window = pCond->twindows;
|
STimeWindow window = pCond->twindows;
|
||||||
|
SVnodeCfg* pConf = &(((SVnode*)pVnode)->config);
|
||||||
|
|
||||||
int32_t capacity = pVnode->config.tsdbCfg.maxRows;
|
int32_t capacity = pConf->tsdbCfg.maxRows;
|
||||||
if (pResBlock != NULL) {
|
if (pResBlock != NULL) {
|
||||||
blockDataEnsureCapacity(pResBlock, capacity);
|
blockDataEnsureCapacity(pResBlock, capacity);
|
||||||
}
|
}
|
||||||
|
@ -4431,7 +4485,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
}
|
}
|
||||||
|
|
||||||
// here we only need one more row, so the capacity is set to be ONE.
|
// here we only need one more row, so the capacity is set to be ONE.
|
||||||
code = tsdbReaderCreate(pVnode, pCond, &pReader->innerReader[0], 1, pResBlock, idstr);
|
code = tsdbReaderCreate(pVnode, pCond, (void**)&((STsdbReader*)pReader)->innerReader[0], 1, pResBlock, idstr);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -4445,7 +4499,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
}
|
}
|
||||||
pCond->order = order;
|
pCond->order = order;
|
||||||
|
|
||||||
code = tsdbReaderCreate(pVnode, pCond, &pReader->innerReader[1], 1, pResBlock, idstr);
|
code = tsdbReaderCreate(pVnode, pCond, (void**)&((STsdbReader*)pReader)->innerReader[1], 1, pResBlock, idstr);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
@ -4495,7 +4549,7 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
pReader->status.pLDataIter = taosMemoryCalloc(pVnode->config.sttTrigger, sizeof(SLDataIter));
|
pReader->status.pLDataIter = taosMemoryCalloc(pConf->sttTrigger, sizeof(SLDataIter));
|
||||||
if (pReader->status.pLDataIter == NULL) {
|
if (pReader->status.pLDataIter == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
goto _err;
|
goto _err;
|
||||||
|
@ -4509,7 +4563,11 @@ int32_t tsdbReaderOpen(SVnode* pVnode, SQueryTableDataCond* pCond, void* pTableL
|
||||||
|
|
||||||
pReader->pIgnoreTables = pIgnoreTables;
|
pReader->pIgnoreTables = pIgnoreTables;
|
||||||
|
|
||||||
tsdbDebug("%p total numOfTable:%d in this query %s", pReader, numOfTables, pReader->idStr);
|
tsdbDebug("%p total numOfTable:%d, window:%" PRId64 " - %" PRId64 ", verRange:%" PRId64 " - %" PRId64
|
||||||
|
" in this query %s",
|
||||||
|
pReader, numOfTables, pReader->window.skey, pReader->window.ekey, pReader->verRange.minVer,
|
||||||
|
pReader->verRange.maxVer, pReader->idStr);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
||||||
_err:
|
_err:
|
||||||
|
@ -4981,7 +5039,8 @@ int32_t tsdbNextDataBlock(STsdbReader* pReader, bool* hasNext) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_t numOfCols, SColumnDataAgg* pTsAgg) {
|
static bool doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_t numOfCols, SColumnDataAgg* pTsAgg) {
|
||||||
|
bool hasNullSMA = false;
|
||||||
// do fill all null column value SMA info
|
// do fill all null column value SMA info
|
||||||
int32_t i = 0, j = 0;
|
int32_t i = 0, j = 0;
|
||||||
int32_t size = (int32_t)taosArrayGetSize(pSup->pColAgg);
|
int32_t size = (int32_t)taosArrayGetSize(pSup->pColAgg);
|
||||||
|
@ -5001,6 +5060,7 @@ static void doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_
|
||||||
taosArrayInsert(pSup->pColAgg, i, &nullColAgg);
|
taosArrayInsert(pSup->pColAgg, i, &nullColAgg);
|
||||||
i += 1;
|
i += 1;
|
||||||
size++;
|
size++;
|
||||||
|
hasNullSMA = true;
|
||||||
}
|
}
|
||||||
j += 1;
|
j += 1;
|
||||||
}
|
}
|
||||||
|
@ -5011,12 +5071,15 @@ static void doFillNullColSMA(SBlockLoadSuppInfo* pSup, int32_t numOfRows, int32_
|
||||||
SColumnDataAgg nullColAgg = {.colId = pSup->colId[j], .numOfNull = numOfRows};
|
SColumnDataAgg nullColAgg = {.colId = pSup->colId[j], .numOfNull = numOfRows};
|
||||||
taosArrayInsert(pSup->pColAgg, i, &nullColAgg);
|
taosArrayInsert(pSup->pColAgg, i, &nullColAgg);
|
||||||
i += 1;
|
i += 1;
|
||||||
|
hasNullSMA = true;
|
||||||
}
|
}
|
||||||
j++;
|
j++;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return hasNullSMA;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SSDataBlock* pDataBlock, bool* allHave) {
|
int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SSDataBlock* pDataBlock, bool* allHave, bool *hasNullSMA) {
|
||||||
SColumnDataAgg*** pBlockSMA = &pDataBlock->pBlockAgg;
|
SColumnDataAgg*** pBlockSMA = &pDataBlock->pBlockAgg;
|
||||||
|
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
@ -5080,7 +5143,10 @@ int32_t tsdbRetrieveDatablockSMA(STsdbReader* pReader, SSDataBlock* pDataBlock,
|
||||||
}
|
}
|
||||||
|
|
||||||
// do fill all null column value SMA info
|
// do fill all null column value SMA info
|
||||||
doFillNullColSMA(pSup, pBlock->nRow, numOfCols, pTsAgg);
|
if (doFillNullColSMA(pSup, pBlock->nRow, numOfCols, pTsAgg)) {
|
||||||
|
*hasNullSMA = true;
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
size_t size = taosArrayGetSize(pSup->pColAgg);
|
size_t size = taosArrayGetSize(pSup->pColAgg);
|
||||||
|
|
||||||
int32_t i = 0, j = 0;
|
int32_t i = 0, j = 0;
|
||||||
|
@ -5247,6 +5313,9 @@ int32_t tsdbReaderReset(STsdbReader* pReader, SQueryTableDataCond* pCond) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t getBucketIndex(int32_t startRow, int32_t bucketRange, int32_t numOfRows, int32_t numOfBucket) {
|
static int32_t getBucketIndex(int32_t startRow, int32_t bucketRange, int32_t numOfRows, int32_t numOfBucket) {
|
||||||
|
if (numOfRows < startRow) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
int32_t bucketIndex = ((numOfRows - startRow) / bucketRange);
|
int32_t bucketIndex = ((numOfRows - startRow) / bucketRange);
|
||||||
if (bucketIndex == numOfBucket) {
|
if (bucketIndex == numOfBucket) {
|
||||||
bucketIndex -= 1;
|
bucketIndex -= 1;
|
||||||
|
@ -5546,7 +5615,7 @@ int64_t tsdbGetLastTimestamp(SVnode* pVnode, void* pTableList, int32_t numOfTabl
|
||||||
int64_t key = INT64_MIN;
|
int64_t key = INT64_MIN;
|
||||||
|
|
||||||
for(int32_t i = 0; i < numOfTables; ++i) {
|
for(int32_t i = 0; i < numOfTables; ++i) {
|
||||||
int32_t code = tsdbReaderOpen(pVnode, &cond, &pTableKeyInfo[i], 1, pBlock, &pReader, pIdStr, false, NULL);
|
int32_t code = tsdbReaderOpen(pVnode, &cond, &pTableKeyInfo[i], 1, pBlock, (void**)&pReader, pIdStr, false, NULL);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
|
@ -523,7 +523,7 @@ static int32_t tsdbWriteBlockSma(SDataFWriter *pWriter, SBlockData *pBlockData,
|
||||||
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
for (int32_t iColData = 0; iColData < pBlockData->nColData; iColData++) {
|
||||||
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
SColData *pColData = tBlockDataGetColDataByIdx(pBlockData, iColData);
|
||||||
|
|
||||||
if ((!pColData->smaOn) || IS_VAR_DATA_TYPE(pColData->type) || ((pColData->flag & HAS_VALUE) == 0)) continue;
|
if ((!pColData->smaOn) || ((pColData->flag & HAS_VALUE) == 0)) continue;
|
||||||
|
|
||||||
SColumnDataAgg sma = {.colId = pColData->cid};
|
SColumnDataAgg sma = {.colId = pColData->cid};
|
||||||
tColDataCalcSMA[pColData->type](pColData, &sma.sum, &sma.max, &sma.min, &sma.numOfNull);
|
tColDataCalcSMA[pColData->type](pColData, &sma.sum, &sma.max, &sma.min, &sma.numOfNull);
|
||||||
|
@ -1489,6 +1489,10 @@ int32_t tsdbDelFReaderClose(SDelFReader **ppReader) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData) {
|
int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData) {
|
||||||
|
return tsdbReadDelDatav1(pReader, pDelIdx, aDelData, INT64_MAX);
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t tsdbReadDelDatav1(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData, int64_t maxVer) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
int64_t offset = pDelIdx->offset;
|
int64_t offset = pDelIdx->offset;
|
||||||
int64_t size = pDelIdx->size;
|
int64_t size = pDelIdx->size;
|
||||||
|
@ -1510,11 +1514,15 @@ int32_t tsdbReadDelData(SDelFReader *pReader, SDelIdx *pDelIdx, SArray *aDelData
|
||||||
SDelData delData;
|
SDelData delData;
|
||||||
n += tGetDelData(pReader->aBuf[0] + n, &delData);
|
n += tGetDelData(pReader->aBuf[0] + n, &delData);
|
||||||
|
|
||||||
if (taosArrayPush(aDelData, &delData) == NULL) {
|
if (delData.version > maxVer) {
|
||||||
code = TSDB_CODE_OUT_OF_MEMORY;
|
continue;
|
||||||
goto _err;
|
|
||||||
}
|
}
|
||||||
|
if (taosArrayPush(aDelData, &delData) == NULL) {
|
||||||
|
code = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
goto _err;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ASSERT(n == size);
|
ASSERT(n == size);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
|
|
|
@ -1166,7 +1166,7 @@ static int32_t tsdbSnapWriteDelTableDataStart(STsdbSnapWriter* pWriter, TABLEID*
|
||||||
|
|
||||||
int32_t c = tTABLEIDCmprFn(pDelIdx, &pWriter->tbid);
|
int32_t c = tTABLEIDCmprFn(pDelIdx, &pWriter->tbid);
|
||||||
if (c < 0) {
|
if (c < 0) {
|
||||||
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->pTIter->tIter.aDelData);
|
code = tsdbReadDelDatav1(pWriter->pDelFReader, pDelIdx, pWriter->pTIter->tIter.aDelData, INT64_MAX);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
SDelIdx* pDelIdxNew = taosArrayReserve(pWriter->aDelIdx, 1);
|
SDelIdx* pDelIdxNew = taosArrayReserve(pWriter->aDelIdx, 1);
|
||||||
|
@ -1183,7 +1183,7 @@ static int32_t tsdbSnapWriteDelTableDataStart(STsdbSnapWriter* pWriter, TABLEID*
|
||||||
|
|
||||||
pWriter->pTIter->tIter.iDelIdx++;
|
pWriter->pTIter->tIter.iDelIdx++;
|
||||||
} else if (c == 0) {
|
} else if (c == 0) {
|
||||||
code = tsdbReadDelData(pWriter->pDelFReader, pDelIdx, pWriter->aDelData);
|
code = tsdbReadDelDatav1(pWriter->pDelFReader, pDelIdx, pWriter->aDelData, INT64_MAX);
|
||||||
TSDB_CHECK_CODE(code, lino, _exit);
|
TSDB_CHECK_CODE(code, lino, _exit);
|
||||||
|
|
||||||
pWriter->pTIter->tIter.iDelIdx++;
|
pWriter->pTIter->tIter.iDelIdx++;
|
||||||
|
|
|
@ -13,10 +13,10 @@
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "storageapi.h"
|
|
||||||
#include "vnodeInt.h"
|
|
||||||
#include "tstreamUpdate.h"
|
|
||||||
#include "meta.h"
|
#include "meta.h"
|
||||||
|
#include "storageapi.h"
|
||||||
|
#include "tstreamUpdate.h"
|
||||||
|
#include "vnodeInt.h"
|
||||||
|
|
||||||
static void initTsdbReaderAPI(TsdReader* pReader);
|
static void initTsdbReaderAPI(TsdReader* pReader);
|
||||||
static void initMetadataAPI(SStoreMeta* pMeta);
|
static void initMetadataAPI(SStoreMeta* pMeta);
|
||||||
|
@ -31,17 +31,18 @@ static void initSnapshotFn(SStoreSnapshotFn* pSnapshot);
|
||||||
void initStorageAPI(SStorageAPI* pAPI) {
|
void initStorageAPI(SStorageAPI* pAPI) {
|
||||||
initTsdbReaderAPI(&pAPI->tsdReader);
|
initTsdbReaderAPI(&pAPI->tsdReader);
|
||||||
initMetadataAPI(&pAPI->metaFn);
|
initMetadataAPI(&pAPI->metaFn);
|
||||||
initTqAPI(&pAPI->tqReaderFn);
|
|
||||||
initStateStoreAPI(&pAPI->stateStore);
|
initStateStoreAPI(&pAPI->stateStore);
|
||||||
initMetaReaderAPI(&pAPI->metaReaderFn);
|
initMetaReaderAPI(&pAPI->metaReaderFn);
|
||||||
initMetaFilterAPI(&pAPI->metaFilter);
|
initMetaFilterAPI(&pAPI->metaFilter);
|
||||||
|
initTqAPI(&pAPI->tqReaderFn);
|
||||||
initFunctionStateStore(&pAPI->functionStore);
|
initFunctionStateStore(&pAPI->functionStore);
|
||||||
initCacheFn(&pAPI->cacheFn);
|
initCacheFn(&pAPI->cacheFn);
|
||||||
initSnapshotFn(&pAPI->snapshotFn);
|
initSnapshotFn(&pAPI->snapshotFn);
|
||||||
}
|
}
|
||||||
|
|
||||||
void initTsdbReaderAPI(TsdReader* pReader) {
|
void initTsdbReaderAPI(TsdReader* pReader) {
|
||||||
pReader->tsdReaderOpen = (__store_reader_open_fn_t)tsdbReaderOpen;
|
pReader->tsdReaderOpen = (int32_t(*)(void*, SQueryTableDataCond*, void*, int32_t, SSDataBlock*, void**, const char*,
|
||||||
|
bool, SHashObj**))tsdbReaderOpen;
|
||||||
pReader->tsdReaderClose = tsdbReaderClose;
|
pReader->tsdReaderClose = tsdbReaderClose;
|
||||||
|
|
||||||
pReader->tsdNextDataBlock = tsdbNextDataBlock;
|
pReader->tsdNextDataBlock = tsdbNextDataBlock;
|
||||||
|
@ -55,10 +56,10 @@ void initTsdbReaderAPI(TsdReader* pReader) {
|
||||||
pReader->tsdReaderResetStatus = tsdbReaderReset;
|
pReader->tsdReaderResetStatus = tsdbReaderReset;
|
||||||
|
|
||||||
pReader->tsdReaderGetDataBlockDistInfo = tsdbGetFileBlocksDistInfo;
|
pReader->tsdReaderGetDataBlockDistInfo = tsdbGetFileBlocksDistInfo;
|
||||||
pReader->tsdReaderGetNumOfInMemRows = tsdbGetNumOfRowsInMemTable; // todo this function should be moved away
|
pReader->tsdReaderGetNumOfInMemRows = tsdbGetNumOfRowsInMemTable; // todo this function should be moved away
|
||||||
|
|
||||||
pReader->tsdSetQueryTableList = tsdbSetTableList;
|
pReader->tsdSetQueryTableList = tsdbSetTableList;
|
||||||
pReader->tsdSetReaderTaskId = (void (*)(void *, const char *))tsdbReaderSetId;
|
pReader->tsdSetReaderTaskId = (void (*)(void*, const char*))tsdbReaderSetId;
|
||||||
}
|
}
|
||||||
|
|
||||||
void initMetadataAPI(SStoreMeta* pMeta) {
|
void initMetadataAPI(SStoreMeta* pMeta) {
|
||||||
|
@ -66,6 +67,8 @@ void initMetadataAPI(SStoreMeta* pMeta) {
|
||||||
|
|
||||||
pMeta->openTableMetaCursor = metaOpenTbCursor;
|
pMeta->openTableMetaCursor = metaOpenTbCursor;
|
||||||
pMeta->closeTableMetaCursor = metaCloseTbCursor;
|
pMeta->closeTableMetaCursor = metaCloseTbCursor;
|
||||||
|
pMeta->pauseTableMetaCursor = metaPauseTbCursor;
|
||||||
|
pMeta->resumeTableMetaCursor = metaResumeTbCursor;
|
||||||
pMeta->cursorNext = metaTbCursorNext;
|
pMeta->cursorNext = metaTbCursorNext;
|
||||||
pMeta->cursorPrev = metaTbCursorPrev;
|
pMeta->cursorPrev = metaTbCursorPrev;
|
||||||
|
|
||||||
|
@ -77,7 +80,7 @@ void initMetadataAPI(SStoreMeta* pMeta) {
|
||||||
pMeta->storeGetIndexInfo = vnodeGetIdx;
|
pMeta->storeGetIndexInfo = vnodeGetIdx;
|
||||||
pMeta->getInvertIndex = vnodeGetIvtIdx;
|
pMeta->getInvertIndex = vnodeGetIvtIdx;
|
||||||
|
|
||||||
pMeta->extractTagVal = (const void *(*)(const void *, int16_t, STagVal *))metaGetTableTagVal;
|
pMeta->extractTagVal = (const void* (*)(const void*, int16_t, STagVal*))metaGetTableTagVal;
|
||||||
pMeta->getTableTags = metaGetTableTags;
|
pMeta->getTableTags = metaGetTableTags;
|
||||||
pMeta->getTableTagsByUid = metaGetTableTagsByUids;
|
pMeta->getTableTagsByUid = metaGetTableTagsByUids;
|
||||||
|
|
||||||
|
@ -85,8 +88,14 @@ void initMetadataAPI(SStoreMeta* pMeta) {
|
||||||
pMeta->getTableTypeByName = metaGetTableTypeByName;
|
pMeta->getTableTypeByName = metaGetTableTypeByName;
|
||||||
pMeta->getTableNameByUid = metaGetTableNameByUid;
|
pMeta->getTableNameByUid = metaGetTableNameByUid;
|
||||||
|
|
||||||
pMeta->getTableSchema = tsdbGetTableSchema; // todo refactor
|
pMeta->getTableSchema = tsdbGetTableSchema; // todo refactor
|
||||||
pMeta->storeGetTableList = vnodeGetTableList;
|
pMeta->storeGetTableList = vnodeGetTableList;
|
||||||
|
|
||||||
|
pMeta->getCachedTableList = metaGetCachedTableUidList;
|
||||||
|
pMeta->putCachedTableList = metaUidFilterCachePut;
|
||||||
|
|
||||||
|
pMeta->metaGetCachedTbGroup = metaGetCachedTbGroup;
|
||||||
|
pMeta->metaPutTbGroupToCache = metaPutTbGroupToCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
void initTqAPI(SStoreTqReader* pTq) {
|
void initTqAPI(SStoreTqReader* pTq) {
|
||||||
|
@ -99,7 +108,7 @@ void initTqAPI(SStoreTqReader* pTq) {
|
||||||
|
|
||||||
pTq->tqReaderNextBlockInWal = tqNextBlockInWal;
|
pTq->tqReaderNextBlockInWal = tqNextBlockInWal;
|
||||||
|
|
||||||
pTq->tqNextBlockImpl = tqNextBlockImpl;// todo remove it
|
pTq->tqNextBlockImpl = tqNextBlockImpl; // todo remove it
|
||||||
|
|
||||||
pTq->tqReaderAddTables = tqReaderAddTbUidList;
|
pTq->tqReaderAddTables = tqReaderAddTbUidList;
|
||||||
pTq->tqReaderSetQueryTableList = tqReaderSetTbUidList;
|
pTq->tqReaderSetQueryTableList = tqReaderSetTbUidList;
|
||||||
|
@ -109,10 +118,10 @@ void initTqAPI(SStoreTqReader* pTq) {
|
||||||
pTq->tqReaderIsQueriedTable = tqReaderIsQueriedTable;
|
pTq->tqReaderIsQueriedTable = tqReaderIsQueriedTable;
|
||||||
pTq->tqReaderCurrentBlockConsumed = tqCurrentBlockConsumed;
|
pTq->tqReaderCurrentBlockConsumed = tqCurrentBlockConsumed;
|
||||||
|
|
||||||
pTq->tqReaderGetWalReader = tqGetWalReader; // todo remove it
|
pTq->tqReaderGetWalReader = tqGetWalReader; // todo remove it
|
||||||
pTq->tqReaderRetrieveTaosXBlock = tqRetrieveTaosxBlock; // todo remove it
|
pTq->tqReaderRetrieveTaosXBlock = tqRetrieveTaosxBlock; // todo remove it
|
||||||
|
|
||||||
pTq->tqReaderSetSubmitMsg = tqReaderSetSubmitMsg; // todo remove it
|
pTq->tqReaderSetSubmitMsg = tqReaderSetSubmitMsg; // todo remove it
|
||||||
pTq->tqGetResultBlock = tqGetResultBlock;
|
pTq->tqGetResultBlock = tqGetResultBlock;
|
||||||
|
|
||||||
pTq->tqReaderNextBlockFilterOut = tqNextDataBlockFilterOut;
|
pTq->tqReaderNextBlockFilterOut = tqNextDataBlockFilterOut;
|
||||||
|
@ -192,7 +201,7 @@ void initStateStoreAPI(SStateStore* pStore) {
|
||||||
pStore->streamStateClose = streamStateClose;
|
pStore->streamStateClose = streamStateClose;
|
||||||
pStore->streamStateBegin = streamStateBegin;
|
pStore->streamStateBegin = streamStateBegin;
|
||||||
pStore->streamStateCommit = streamStateCommit;
|
pStore->streamStateCommit = streamStateCommit;
|
||||||
pStore->streamStateDestroy= streamStateDestroy;
|
pStore->streamStateDestroy = streamStateDestroy;
|
||||||
pStore->streamStateDeleteCheckPoint = streamStateDeleteCheckPoint;
|
pStore->streamStateDeleteCheckPoint = streamStateDeleteCheckPoint;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -232,4 +241,4 @@ void initSnapshotFn(SStoreSnapshotFn* pSnapshot) {
|
||||||
pSnapshot->destroySnapshot = destroySnapContext;
|
pSnapshot->destroySnapshot = destroySnapContext;
|
||||||
pSnapshot->getMetaTableInfoFromSnapshot = getMetaTableInfoFromSnapshot;
|
pSnapshot->getMetaTableInfoFromSnapshot = getMetaTableInfoFromSnapshot;
|
||||||
pSnapshot->getTableInfoFromSnapshot = getTableInfoFromSnapshot;
|
pSnapshot->getTableInfoFromSnapshot = getTableInfoFromSnapshot;
|
||||||
}
|
}
|
||||||
|
|
|
@ -245,11 +245,11 @@ _exit:
|
||||||
static int32_t vnodePreProcessDeleteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
static int32_t vnodePreProcessDeleteMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
int32_t size;
|
int32_t size;
|
||||||
int32_t ret;
|
int32_t ret;
|
||||||
uint8_t *pCont;
|
uint8_t *pCont;
|
||||||
SEncoder *pCoder = &(SEncoder){0};
|
SEncoder *pCoder = &(SEncoder){0};
|
||||||
SDeleteRes res = {0};
|
SDeleteRes res = {0};
|
||||||
|
|
||||||
SReadHandle handle = {.config = &pVnode->config, .vnode = pVnode, .pMsgCb = &pVnode->msgCb};
|
SReadHandle handle = {.config = &pVnode->config, .vnode = pVnode, .pMsgCb = &pVnode->msgCb};
|
||||||
initStorageAPI(&handle.api);
|
initStorageAPI(&handle.api);
|
||||||
|
@ -316,8 +316,7 @@ int32_t vnodeProcessWriteMsg(SVnode *pVnode, SRpcMsg *pMsg, int64_t ver, SRpcMsg
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
vDebug("vgId:%d, start to process write request %s, index:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType),
|
vDebug("vgId:%d, start to process write request %s, index:%" PRId64, TD_VID(pVnode), TMSG_INFO(pMsg->msgType), ver);
|
||||||
ver);
|
|
||||||
|
|
||||||
ASSERT(pVnode->state.applyTerm <= pMsg->info.conn.applyTerm);
|
ASSERT(pVnode->state.applyTerm <= pMsg->info.conn.applyTerm);
|
||||||
ASSERT(pVnode->state.applied + 1 == ver);
|
ASSERT(pVnode->state.applied + 1 == ver);
|
||||||
|
@ -1479,6 +1478,7 @@ static int32_t vnodeConsolidateAlterHashRange(SVnode *pVnode, int64_t ver) {
|
||||||
pVnode->config.hashBegin, pVnode->config.hashEnd, ver);
|
pVnode->config.hashBegin, pVnode->config.hashEnd, ver);
|
||||||
|
|
||||||
// TODO: trim meta of tables from TDB per hash range [pVnode->config.hashBegin, pVnode->config.hashEnd]
|
// TODO: trim meta of tables from TDB per hash range [pVnode->config.hashBegin, pVnode->config.hashEnd]
|
||||||
|
code = metaTrimTables(pVnode->pMeta);
|
||||||
|
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
@ -1492,8 +1492,7 @@ static int32_t vnodeProcessAlterConfirmReq(SVnode *pVnode, int64_t ver, void *pR
|
||||||
|
|
||||||
code = vnodeConsolidateAlterHashRange(pVnode, ver);
|
code = vnodeConsolidateAlterHashRange(pVnode, ver);
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
vError("vgId:%d, failed to consolidate alter hashrange since %s. version:%" PRId64, TD_VID(pVnode), terrstr(),
|
vError("vgId:%d, failed to consolidate alter hashrange since %s. version:%" PRId64, TD_VID(pVnode), terrstr(), ver);
|
||||||
ver);
|
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
pVnode->config.hashChange = false;
|
pVnode->config.hashChange = false;
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
#include "trpc.h"
|
#include "trpc.h"
|
||||||
|
|
||||||
extern SCatalogMgmt gCtgMgmt;
|
extern SCatalogMgmt gCtgMgmt;
|
||||||
SCtgDebug gCTGDebug = {.statEnable = true};
|
SCtgDebug gCTGDebug = {0};
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
|
|
||||||
|
|
|
@ -1555,14 +1555,17 @@ int32_t ctgChkSetAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) {
|
||||||
char dbFName[TSDB_DB_FNAME_LEN];
|
char dbFName[TSDB_DB_FNAME_LEN];
|
||||||
tNameGetFullDbName(&pReq->tbName, dbFName);
|
tNameGetFullDbName(&pReq->tbName, dbFName);
|
||||||
|
|
||||||
|
// since that we add read/write previliges when create db, there is no need to check createdDbs
|
||||||
|
#if 0
|
||||||
if (pInfo->createdDbs && taosHashGet(pInfo->createdDbs, dbFName, strlen(dbFName))) {
|
if (pInfo->createdDbs && taosHashGet(pInfo->createdDbs, dbFName, strlen(dbFName))) {
|
||||||
pRes->pass = true;
|
pRes->pass = true;
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
switch (pReq->type) {
|
switch (pReq->type) {
|
||||||
case AUTH_TYPE_READ: {
|
case AUTH_TYPE_READ: {
|
||||||
if (pInfo->readTbs && taosHashGetSize(pInfo->readTbs) > 0) {
|
if (pReq->tbName.type == TSDB_TABLE_NAME_T && pInfo->readTbs && taosHashGetSize(pInfo->readTbs) > 0) {
|
||||||
req->singleType = AUTH_TYPE_READ;
|
req->singleType = AUTH_TYPE_READ;
|
||||||
CTG_ERR_RET(ctgChkSetTbAuthRes(pCtg, req, res));
|
CTG_ERR_RET(ctgChkSetTbAuthRes(pCtg, req, res));
|
||||||
if (pRes->pass || res->metaNotExists) {
|
if (pRes->pass || res->metaNotExists) {
|
||||||
|
@ -1578,7 +1581,7 @@ int32_t ctgChkSetAuthRes(SCatalog* pCtg, SCtgAuthReq* req, SCtgAuthRsp* res) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case AUTH_TYPE_WRITE: {
|
case AUTH_TYPE_WRITE: {
|
||||||
if (pInfo->writeTbs && taosHashGetSize(pInfo->writeTbs) > 0) {
|
if (pReq->tbName.type == TSDB_TABLE_NAME_T && pInfo->writeTbs && taosHashGetSize(pInfo->writeTbs) > 0) {
|
||||||
req->singleType = AUTH_TYPE_WRITE;
|
req->singleType = AUTH_TYPE_WRITE;
|
||||||
CTG_ERR_RET(ctgChkSetTbAuthRes(pCtg, req, res));
|
CTG_ERR_RET(ctgChkSetTbAuthRes(pCtg, req, res));
|
||||||
if (pRes->pass || res->metaNotExists) {
|
if (pRes->pass || res->metaNotExists) {
|
||||||
|
|
|
@ -135,6 +135,10 @@ struct SResultRowEntryInfo* getResultEntryInfo(const SResultRow* pRow, int32_t i
|
||||||
|
|
||||||
static FORCE_INLINE SResultRow* getResultRowByPos(SDiskbasedBuf* pBuf, SResultRowPosition* pos, bool forUpdate) {
|
static FORCE_INLINE SResultRow* getResultRowByPos(SDiskbasedBuf* pBuf, SResultRowPosition* pos, bool forUpdate) {
|
||||||
SFilePage* bufPage = (SFilePage*)getBufPage(pBuf, pos->pageId);
|
SFilePage* bufPage = (SFilePage*)getBufPage(pBuf, pos->pageId);
|
||||||
|
if (!bufPage) {
|
||||||
|
uFatal("failed to get the buffer page:%d since %s", pos->pageId, terrstr());
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
if (forUpdate) {
|
if (forUpdate) {
|
||||||
setBufPageDirty(bufPage, true);
|
setBufPageDirty(bufPage, true);
|
||||||
}
|
}
|
||||||
|
@ -182,4 +186,7 @@ int32_t isQualifiedTable(STableKeyInfo* info, SNode* pTagCond, void* metaHandle,
|
||||||
|
|
||||||
void printDataBlock(SSDataBlock* pBlock, const char* flag);
|
void printDataBlock(SSDataBlock* pBlock, const char* flag);
|
||||||
|
|
||||||
|
void getNextTimeWindow(const SInterval* pInterval, STimeWindow* tw, int32_t order);
|
||||||
|
void getInitialStartTimeWindow(SInterval* pInterval, TSKEY ts, STimeWindow* w, bool ascQuery);
|
||||||
|
|
||||||
#endif // TDENGINE_EXECUTIL_H
|
#endif // TDENGINE_EXECUTIL_H
|
||||||
|
|
|
@ -456,6 +456,7 @@ typedef struct SStreamIntervalOperatorInfo {
|
||||||
SSHashObj* pUpdatedMap;
|
SSHashObj* pUpdatedMap;
|
||||||
int64_t dataVersion;
|
int64_t dataVersion;
|
||||||
SStateStore statestore;
|
SStateStore statestore;
|
||||||
|
bool recvGetAll;
|
||||||
} SStreamIntervalOperatorInfo;
|
} SStreamIntervalOperatorInfo;
|
||||||
|
|
||||||
typedef struct SDataGroupInfo {
|
typedef struct SDataGroupInfo {
|
||||||
|
|
|
@ -120,6 +120,8 @@ int64_t getNumOfResultsAfterFillGap(SFillInfo* pFillInfo, int64_t ekey, int32_t
|
||||||
void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey);
|
void taosFillSetStartInfo(struct SFillInfo* pFillInfo, int32_t numOfRows, TSKEY endKey);
|
||||||
void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp);
|
void taosResetFillInfo(struct SFillInfo* pFillInfo, TSKEY startTimestamp);
|
||||||
void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput);
|
void taosFillSetInputDataBlock(struct SFillInfo* pFillInfo, const struct SSDataBlock* pInput);
|
||||||
|
void taosFillUpdateStartTimestampInfo(SFillInfo* pFillInfo, int64_t ts);
|
||||||
|
bool taosFillNotStarted(const SFillInfo* pFillInfo);
|
||||||
SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr,
|
SFillColInfo* createFillColInfo(SExprInfo* pExpr, int32_t numOfFillExpr, SExprInfo* pNotFillExpr,
|
||||||
int32_t numOfNotFillCols, const struct SNodeListNode* val);
|
int32_t numOfNotFillCols, const struct SNodeListNode* val);
|
||||||
bool taosFillHasMoreResults(struct SFillInfo* pFillInfo);
|
bool taosFillHasMoreResults(struct SFillInfo* pFillInfo);
|
||||||
|
|
|
@ -136,7 +136,7 @@ void initGroupedResultInfo(SGroupResInfo* pGroupResInfo, SSHashObj* pHashmap, in
|
||||||
|
|
||||||
size_t keyLen = 0;
|
size_t keyLen = 0;
|
||||||
int32_t iter = 0;
|
int32_t iter = 0;
|
||||||
int32_t bufLen = 0, offset = 0;
|
int64_t bufLen = 0, offset = 0;
|
||||||
|
|
||||||
// todo move away and record this during create window
|
// todo move away and record this during create window
|
||||||
while ((pData = tSimpleHashIterate(pHashmap, pData, &iter)) != NULL) {
|
while ((pData = tSimpleHashIterate(pHashmap, pData, &iter)) != NULL) {
|
||||||
|
@ -495,7 +495,7 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf
|
||||||
genTbGroupDigest((SNode*)listNode, digest, &context);
|
genTbGroupDigest((SNode*)listNode, digest, &context);
|
||||||
nodesFree(listNode);
|
nodesFree(listNode);
|
||||||
|
|
||||||
pAPI->metaFn.getCachedTableList(pVnode, pTableListInfo->idInfo.suid, context.digest, tListLen(context.digest), &tableList);
|
pAPI->metaFn.metaGetCachedTbGroup(pVnode, pTableListInfo->idInfo.suid, context.digest, tListLen(context.digest), &tableList);
|
||||||
if (tableList) {
|
if (tableList) {
|
||||||
taosArrayDestroy(pTableListInfo->pTableList);
|
taosArrayDestroy(pTableListInfo->pTableList);
|
||||||
pTableListInfo->pTableList = tableList;
|
pTableListInfo->pTableList = tableList;
|
||||||
|
@ -632,7 +632,7 @@ int32_t getColInfoResultForGroupby(void* pVnode, SNodeList* group, STableListInf
|
||||||
|
|
||||||
if (tsTagFilterCache) {
|
if (tsTagFilterCache) {
|
||||||
tableList = taosArrayDup(pTableListInfo->pTableList, NULL);
|
tableList = taosArrayDup(pTableListInfo->pTableList, NULL);
|
||||||
pAPI->metaFn.putTableListIntoCache(pVnode, pTableListInfo->idInfo.suid, context.digest, tListLen(context.digest), tableList, taosArrayGetSize(tableList) * sizeof(STableKeyInfo));
|
pAPI->metaFn.metaPutTbGroupToCache(pVnode, pTableListInfo->idInfo.suid, context.digest, tListLen(context.digest), tableList, taosArrayGetSize(tableList) * sizeof(STableKeyInfo));
|
||||||
}
|
}
|
||||||
|
|
||||||
// int64_t st2 = taosGetTimestampUs();
|
// int64_t st2 = taosGetTimestampUs();
|
||||||
|
@ -960,6 +960,7 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN
|
||||||
SArray* pBlockList = NULL;
|
SArray* pBlockList = NULL;
|
||||||
SSDataBlock* pResBlock = NULL;
|
SSDataBlock* pResBlock = NULL;
|
||||||
SScalarParam output = {0};
|
SScalarParam output = {0};
|
||||||
|
SArray* pUidTagList = NULL;
|
||||||
|
|
||||||
tagFilterAssist ctx = {0};
|
tagFilterAssist ctx = {0};
|
||||||
ctx.colHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK);
|
ctx.colHash = taosHashInit(4, taosGetDefaultHashFunction(TSDB_DATA_TYPE_SMALLINT), false, HASH_NO_LOCK);
|
||||||
|
@ -979,7 +980,7 @@ static int32_t doFilterByTagCond(STableListInfo* pListInfo, SArray* pUidList, SN
|
||||||
SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)};
|
SDataType type = {.type = TSDB_DATA_TYPE_BOOL, .bytes = sizeof(bool)};
|
||||||
|
|
||||||
// int64_t stt = taosGetTimestampUs();
|
// int64_t stt = taosGetTimestampUs();
|
||||||
SArray* pUidTagList = taosArrayInit(10, sizeof(STUidTagInfo));
|
pUidTagList = taosArrayInit(10, sizeof(STUidTagInfo));
|
||||||
copyExistedUids(pUidTagList, pUidList);
|
copyExistedUids(pUidTagList, pUidList);
|
||||||
|
|
||||||
FilterCondType condType = checkTagCond(pTagCond);
|
FilterCondType condType = checkTagCond(pTagCond);
|
||||||
|
@ -1151,6 +1152,21 @@ _end:
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int32_t qGetTableList(int64_t suid, void* pVnode, void* node, SArray **tableList, void* pTaskInfo){
|
||||||
|
SSubplan *pSubplan = (SSubplan *)node;
|
||||||
|
SScanPhysiNode pNode = {0};
|
||||||
|
pNode.suid = suid;
|
||||||
|
pNode.uid = suid;
|
||||||
|
pNode.tableType = TSDB_SUPER_TABLE;
|
||||||
|
STableListInfo* pTableListInfo = tableListCreate();
|
||||||
|
uint8_t digest[17] = {0};
|
||||||
|
int code = getTableList(pVnode, &pNode, pSubplan ? pSubplan->pTagCond : NULL, pSubplan ? pSubplan->pTagIndexCond : NULL, pTableListInfo, digest, "qGetTableList", &((SExecTaskInfo*)pTaskInfo)->storageAPI);
|
||||||
|
*tableList = pTableListInfo->pTableList;
|
||||||
|
pTableListInfo->pTableList = NULL;
|
||||||
|
tableListDestroy(pTableListInfo);
|
||||||
|
return code;
|
||||||
|
}
|
||||||
|
|
||||||
size_t getTableTagsBufLen(const SNodeList* pGroups) {
|
size_t getTableTagsBufLen(const SNodeList* pGroups) {
|
||||||
size_t keyLen = 0;
|
size_t keyLen = 0;
|
||||||
|
|
||||||
|
@ -1745,12 +1761,12 @@ int32_t convertFillType(int32_t mode) {
|
||||||
return type;
|
return type;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getInitialStartTimeWindow(SInterval* pInterval, TSKEY ts, STimeWindow* w, bool ascQuery) {
|
void getInitialStartTimeWindow(SInterval* pInterval, TSKEY ts, STimeWindow* w, bool ascQuery) {
|
||||||
if (ascQuery) {
|
if (ascQuery) {
|
||||||
*w = getAlignQueryTimeWindow(pInterval, pInterval->precision, ts);
|
*w = getAlignQueryTimeWindow(pInterval, ts);
|
||||||
} else {
|
} else {
|
||||||
// the start position of the first time window in the endpoint that spreads beyond the queried last timestamp
|
// the start position of the first time window in the endpoint that spreads beyond the queried last timestamp
|
||||||
*w = getAlignQueryTimeWindow(pInterval, pInterval->precision, ts);
|
*w = getAlignQueryTimeWindow(pInterval, ts);
|
||||||
|
|
||||||
int64_t key = w->skey;
|
int64_t key = w->skey;
|
||||||
while (key < ts) { // moving towards end
|
while (key < ts) { // moving towards end
|
||||||
|
@ -1767,7 +1783,7 @@ static void getInitialStartTimeWindow(SInterval* pInterval, TSKEY ts, STimeWindo
|
||||||
static STimeWindow doCalculateTimeWindow(int64_t ts, SInterval* pInterval) {
|
static STimeWindow doCalculateTimeWindow(int64_t ts, SInterval* pInterval) {
|
||||||
STimeWindow w = {0};
|
STimeWindow w = {0};
|
||||||
|
|
||||||
w.skey = taosTimeTruncate(ts, pInterval, pInterval->precision);
|
w.skey = taosTimeTruncate(ts, pInterval);
|
||||||
w.ekey = taosTimeAdd(w.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1;
|
w.ekey = taosTimeAdd(w.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1;
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
@ -1801,6 +1817,7 @@ STimeWindow getActiveTimeWindow(SDiskbasedBuf* pBuf, SResultRowInfo* pResultRowI
|
||||||
if (pRow) {
|
if (pRow) {
|
||||||
w = pRow->win;
|
w = pRow->win;
|
||||||
}
|
}
|
||||||
|
|
||||||
// in case of typical time window, we can calculate time window directly.
|
// in case of typical time window, we can calculate time window directly.
|
||||||
if (w.skey > ts || w.ekey < ts) {
|
if (w.skey > ts || w.ekey < ts) {
|
||||||
w = doCalculateTimeWindow(ts, pInterval);
|
w = doCalculateTimeWindow(ts, pInterval);
|
||||||
|
@ -1815,6 +1832,34 @@ STimeWindow getActiveTimeWindow(SDiskbasedBuf* pBuf, SResultRowInfo* pResultRowI
|
||||||
return w;
|
return w;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void getNextTimeWindow(const SInterval* pInterval, STimeWindow* tw, int32_t order) {
|
||||||
|
int32_t factor = GET_FORWARD_DIRECTION_FACTOR(order);
|
||||||
|
if (!IS_CALENDAR_TIME_DURATION(pInterval->slidingUnit)) {
|
||||||
|
tw->skey += pInterval->sliding * factor;
|
||||||
|
tw->ekey = taosTimeAdd(tw->skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// convert key to second
|
||||||
|
int64_t key = convertTimePrecision(tw->skey, pInterval->precision, TSDB_TIME_PRECISION_MILLI) / 1000;
|
||||||
|
|
||||||
|
int64_t duration = pInterval->sliding;
|
||||||
|
if (pInterval->slidingUnit == 'y') {
|
||||||
|
duration *= 12;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct tm tm;
|
||||||
|
time_t t = (time_t) key;
|
||||||
|
taosLocalTime(&t, &tm, NULL);
|
||||||
|
|
||||||
|
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + duration * factor);
|
||||||
|
tm.tm_year = mon / 12;
|
||||||
|
tm.tm_mon = mon % 12;
|
||||||
|
tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
|
||||||
|
|
||||||
|
tw->ekey = taosTimeAdd(tw->skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1;
|
||||||
|
}
|
||||||
|
|
||||||
bool hasLimitOffsetInfo(SLimitInfo* pLimitInfo) {
|
bool hasLimitOffsetInfo(SLimitInfo* pLimitInfo) {
|
||||||
return (pLimitInfo->limit.limit != -1 || pLimitInfo->limit.offset != -1 || pLimitInfo->slimit.limit != -1 ||
|
return (pLimitInfo->limit.limit != -1 || pLimitInfo->limit.offset != -1 || pLimitInfo->slimit.limit != -1 ||
|
||||||
pLimitInfo->slimit.offset != -1);
|
pLimitInfo->slimit.offset != -1);
|
||||||
|
|
|
@ -132,7 +132,8 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
|
||||||
pOperator->status = OP_NOT_OPENED;
|
pOperator->status = OP_NOT_OPENED;
|
||||||
|
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
qDebug("s-task:%s set source blocks:%d", id, (int32_t)numOfBlocks);
|
|
||||||
|
qDebug("s-task:%s in this batch, all %d blocks need to be processed and dump results", id, (int32_t)numOfBlocks);
|
||||||
ASSERT(pInfo->validBlockIndex == 0 && taosArrayGetSize(pInfo->pBlockLists) == 0);
|
ASSERT(pInfo->validBlockIndex == 0 && taosArrayGetSize(pInfo->pBlockLists) == 0);
|
||||||
|
|
||||||
if (type == STREAM_INPUT__MERGED_SUBMIT) {
|
if (type == STREAM_INPUT__MERGED_SUBMIT) {
|
||||||
|
@ -140,6 +141,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
|
||||||
SPackedData* pReq = POINTER_SHIFT(input, i * sizeof(SPackedData));
|
SPackedData* pReq = POINTER_SHIFT(input, i * sizeof(SPackedData));
|
||||||
taosArrayPush(pInfo->pBlockLists, pReq);
|
taosArrayPush(pInfo->pBlockLists, pReq);
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->blockType = STREAM_INPUT__DATA_SUBMIT;
|
pInfo->blockType = STREAM_INPUT__DATA_SUBMIT;
|
||||||
} else if (type == STREAM_INPUT__DATA_SUBMIT) {
|
} else if (type == STREAM_INPUT__DATA_SUBMIT) {
|
||||||
taosArrayPush(pInfo->pBlockLists, input);
|
taosArrayPush(pInfo->pBlockLists, input);
|
||||||
|
@ -150,6 +152,7 @@ static int32_t doSetStreamBlock(SOperatorInfo* pOperator, void* input, size_t nu
|
||||||
SPackedData tmp = { .pDataBlock = pDataBlock };
|
SPackedData tmp = { .pDataBlock = pDataBlock };
|
||||||
taosArrayPush(pInfo->pBlockLists, &tmp);
|
taosArrayPush(pInfo->pBlockLists, &tmp);
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->blockType = STREAM_INPUT__DATA_BLOCK;
|
pInfo->blockType = STREAM_INPUT__DATA_BLOCK;
|
||||||
} else {
|
} else {
|
||||||
ASSERT(0);
|
ASSERT(0);
|
||||||
|
@ -183,6 +186,11 @@ void qSetTaskId(qTaskInfo_t tinfo, uint64_t taskId, uint64_t queryId) {
|
||||||
doSetTaskId(pTaskInfo->pRoot, &pTaskInfo->storageAPI);
|
doSetTaskId(pTaskInfo->pRoot, &pTaskInfo->storageAPI);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//void qSetTaskCode(qTaskInfo_t tinfo, int32_t code) {
|
||||||
|
// SExecTaskInfo* pTaskInfo = tinfo;
|
||||||
|
// pTaskInfo->code = code;
|
||||||
|
//}
|
||||||
|
|
||||||
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo) {
|
int32_t qSetStreamOpOpen(qTaskInfo_t tinfo) {
|
||||||
if (tinfo == NULL) {
|
if (tinfo == NULL) {
|
||||||
return TSDB_CODE_APP_ERROR;
|
return TSDB_CODE_APP_ERROR;
|
||||||
|
@ -398,7 +406,7 @@ int32_t qUpdateTableListForStreamScanner(qTaskInfo_t tinfo, const SArray* tableI
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
|
|
||||||
if (isAdd) {
|
if (isAdd) {
|
||||||
qDebug("add %d tables id into query list, %s", (int32_t)taosArrayGetSize(tableIdList), id);
|
qDebug("try to add %d tables id into query list, %s", (int32_t)taosArrayGetSize(tableIdList), id);
|
||||||
}
|
}
|
||||||
|
|
||||||
// traverse to the stream scanner node to add this table id
|
// traverse to the stream scanner node to add this table id
|
||||||
|
|
|
@ -442,15 +442,15 @@ void setBlockSMAInfo(SqlFunctionCtx* pCtx, SExprInfo* pExprInfo, SSDataBlock* pB
|
||||||
}
|
}
|
||||||
|
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////////
|
||||||
STimeWindow getAlignQueryTimeWindow(SInterval* pInterval, int32_t precision, int64_t key) {
|
STimeWindow getAlignQueryTimeWindow(const SInterval* pInterval, int64_t key) {
|
||||||
STimeWindow win = {0};
|
STimeWindow win = {0};
|
||||||
win.skey = taosTimeTruncate(key, pInterval, precision);
|
win.skey = taosTimeTruncate(key, pInterval);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* if the realSkey > INT64_MAX - pInterval->interval, the query duration between
|
* if the realSkey > INT64_MAX - pInterval->interval, the query duration between
|
||||||
* realSkey and realEkey must be less than one interval.Therefore, no need to adjust the query ranges.
|
* realSkey and realEkey must be less than one interval.Therefore, no need to adjust the query ranges.
|
||||||
*/
|
*/
|
||||||
win.ekey = taosTimeAdd(win.skey, pInterval->interval, pInterval->intervalUnit, precision) - 1;
|
win.ekey = taosTimeAdd(win.skey, pInterval->interval, pInterval->intervalUnit, pInterval->precision) - 1;
|
||||||
if (win.ekey < win.skey) {
|
if (win.ekey < win.skey) {
|
||||||
win.ekey = INT64_MAX;
|
win.ekey = INT64_MAX;
|
||||||
}
|
}
|
||||||
|
@ -726,7 +726,8 @@ void copyResultrowToDataBlock(SExprInfo* pExprInfo, int32_t numOfExprs, SResultR
|
||||||
pCtx[j].resultInfo->numOfRes = pRow->numOfRows;
|
pCtx[j].resultInfo->numOfRes = pRow->numOfRows;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
blockDataEnsureCapacity(pBlock, pBlock->info.rows + pCtx[j].resultInfo->numOfRes);
|
||||||
int32_t code = pCtx[j].fpSet.finalize(&pCtx[j], pBlock);
|
int32_t code = pCtx[j].fpSet.finalize(&pCtx[j], pBlock);
|
||||||
if (TAOS_FAILED(code)) {
|
if (TAOS_FAILED(code)) {
|
||||||
qError("%s build result data block error, code %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
qError("%s build result data block error, code %s", GET_TASKID(pTaskInfo), tstrerror(code));
|
||||||
|
@ -827,7 +828,7 @@ int32_t doCopyToSDataBlock(SExecTaskInfo* pTaskInfo, SSDataBlock* pBlock, SExprS
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
|
if (pBlock->info.rows + pRow->numOfRows > pBlock->info.capacity) {
|
||||||
uint32_t newSize = pBlock->info.rows + pRow->numOfRows + (numOfRows - i) > 1 ? 1 : 0;
|
uint32_t newSize = pBlock->info.rows + pRow->numOfRows + ((numOfRows - i) > 1 ? 1 : 0);
|
||||||
blockDataEnsureCapacity(pBlock, newSize);
|
blockDataEnsureCapacity(pBlock, newSize);
|
||||||
qDebug("datablock capacity not sufficient, expand to required:%d, current capacity:%d, %s",
|
qDebug("datablock capacity not sufficient, expand to required:%d, current capacity:%d, %s",
|
||||||
newSize, pBlock->info.capacity, GET_TASKID(pTaskInfo));
|
newSize, pBlock->info.capacity, GET_TASKID(pTaskInfo));
|
||||||
|
|
|
@ -61,25 +61,28 @@ typedef struct SFillOperatorInfo {
|
||||||
SExprSupp noFillExprSupp;
|
SExprSupp noFillExprSupp;
|
||||||
} SFillOperatorInfo;
|
} SFillOperatorInfo;
|
||||||
|
|
||||||
|
static void revisedFillStartKey(SFillOperatorInfo* pInfo, SSDataBlock* pBlock, int32_t order);
|
||||||
static void destroyFillOperatorInfo(void* param);
|
static void destroyFillOperatorInfo(void* param);
|
||||||
static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag);
|
static void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int32_t order, int32_t scanFlag);
|
||||||
|
|
||||||
static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
|
static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
|
||||||
SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) {
|
SResultInfo* pResultInfo, int32_t order) {
|
||||||
pInfo->totalInputRows = pInfo->existNewGroupBlock->info.rows;
|
pInfo->totalInputRows = pInfo->existNewGroupBlock->info.rows;
|
||||||
SSDataBlock* pResBlock = pInfo->pFinalRes;
|
SSDataBlock* pResBlock = pInfo->pFinalRes;
|
||||||
|
|
||||||
int32_t order = TSDB_ORDER_ASC;
|
// int32_t order = TSDB_ORDER_ASC;
|
||||||
int32_t scanFlag = MAIN_SCAN;
|
int32_t scanFlag = MAIN_SCAN;
|
||||||
getTableScanInfo(pOperator, &order, &scanFlag, false);
|
// getTableScanInfo(pOperator, &order, &scanFlag, false);
|
||||||
|
|
||||||
int64_t ekey = pInfo->existNewGroupBlock->info.window.ekey;
|
|
||||||
taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo));
|
taosResetFillInfo(pInfo->pFillInfo, getFillInfoStart(pInfo->pFillInfo));
|
||||||
|
|
||||||
blockDataCleanup(pInfo->pRes);
|
blockDataCleanup(pInfo->pRes);
|
||||||
doApplyScalarCalculation(pOperator, pInfo->existNewGroupBlock, order, scanFlag);
|
doApplyScalarCalculation(pOperator, pInfo->existNewGroupBlock, order, scanFlag);
|
||||||
|
|
||||||
taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ekey);
|
revisedFillStartKey(pInfo, pInfo->existNewGroupBlock, order);
|
||||||
|
|
||||||
|
int64_t ts = (order == TSDB_ORDER_ASC)? pInfo->existNewGroupBlock->info.window.ekey:pInfo->existNewGroupBlock->info.window.skey;
|
||||||
|
taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ts);
|
||||||
|
|
||||||
taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
|
taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
|
||||||
|
|
||||||
int32_t numOfResultRows = pResultInfo->capacity - pResBlock->info.rows;
|
int32_t numOfResultRows = pResultInfo->capacity - pResBlock->info.rows;
|
||||||
|
@ -90,7 +93,7 @@ static void doHandleRemainBlockForNewGroupImpl(SOperatorInfo* pOperator, SFillOp
|
||||||
}
|
}
|
||||||
|
|
||||||
static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
|
static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOperatorInfo* pInfo,
|
||||||
SResultInfo* pResultInfo, SExecTaskInfo* pTaskInfo) {
|
SResultInfo* pResultInfo, int32_t order) {
|
||||||
if (taosFillHasMoreResults(pInfo->pFillInfo)) {
|
if (taosFillHasMoreResults(pInfo->pFillInfo)) {
|
||||||
int32_t numOfResultRows = pResultInfo->capacity - pInfo->pFinalRes->info.rows;
|
int32_t numOfResultRows = pResultInfo->capacity - pInfo->pFinalRes->info.rows;
|
||||||
taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pFinalRes, numOfResultRows);
|
taosFillResultDataBlock(pInfo->pFillInfo, pInfo->pFinalRes, numOfResultRows);
|
||||||
|
@ -100,7 +103,7 @@ static void doHandleRemainBlockFromNewGroup(SOperatorInfo* pOperator, SFillOpera
|
||||||
|
|
||||||
// handle the cached new group data block
|
// handle the cached new group data block
|
||||||
if (pInfo->existNewGroupBlock) {
|
if (pInfo->existNewGroupBlock) {
|
||||||
doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo);
|
doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, order);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +122,53 @@ void doApplyScalarCalculation(SOperatorInfo* pOperator, SSDataBlock* pBlock, int
|
||||||
pInfo->pRes->info.id.groupId = pBlock->info.id.groupId;
|
pInfo->pRes->info.id.groupId = pBlock->info.id.groupId;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// todo refactor: decide the start key according to the query time range.
|
||||||
|
static void revisedFillStartKey(SFillOperatorInfo* pInfo, SSDataBlock* pBlock, int32_t order) {
|
||||||
|
if (order == TSDB_ORDER_ASC) {
|
||||||
|
int64_t skey = pBlock->info.window.skey;
|
||||||
|
if (skey < pInfo->pFillInfo->start) { // the start key may be smaller than the
|
||||||
|
ASSERT( taosFillNotStarted(pInfo->pFillInfo));
|
||||||
|
taosFillUpdateStartTimestampInfo(pInfo->pFillInfo, skey);
|
||||||
|
} else if (pInfo->pFillInfo->start < skey) {
|
||||||
|
int64_t t = skey;
|
||||||
|
SInterval* pInterval = &pInfo->pFillInfo->interval;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
int64_t prev = taosTimeAdd(t, -pInterval->sliding, pInterval->slidingUnit, pInterval->precision);
|
||||||
|
if (prev <= pInfo->pFillInfo->start) {
|
||||||
|
t = prev;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
t = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo time window chosen problem: t or prev value?
|
||||||
|
taosFillUpdateStartTimestampInfo(pInfo->pFillInfo, t);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int64_t ekey = pBlock->info.window.ekey;
|
||||||
|
if (ekey > pInfo->pFillInfo->start) {
|
||||||
|
ASSERT( taosFillNotStarted(pInfo->pFillInfo));
|
||||||
|
taosFillUpdateStartTimestampInfo(pInfo->pFillInfo, ekey);
|
||||||
|
} else if (ekey < pInfo->pFillInfo->start) {
|
||||||
|
int64_t t = ekey;
|
||||||
|
SInterval* pInterval = &pInfo->pFillInfo->interval;
|
||||||
|
|
||||||
|
while(1) {
|
||||||
|
int64_t prev = taosTimeAdd(t, pInterval->sliding, pInterval->slidingUnit, pInterval->precision);
|
||||||
|
if (prev >= pInfo->pFillInfo->start) {
|
||||||
|
t = prev;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
t = prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
// todo time window chosen problem: t or prev value?
|
||||||
|
taosFillUpdateStartTimestampInfo(pInfo->pFillInfo, t);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
||||||
SFillOperatorInfo* pInfo = pOperator->info;
|
SFillOperatorInfo* pInfo = pOperator->info;
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
|
@ -132,13 +182,19 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
||||||
int32_t scanFlag = MAIN_SCAN;
|
int32_t scanFlag = MAIN_SCAN;
|
||||||
getTableScanInfo(pOperator, &order, &scanFlag, false);
|
getTableScanInfo(pOperator, &order, &scanFlag, false);
|
||||||
|
|
||||||
doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo);
|
SOperatorInfo* pDownstream = pOperator->pDownstream[0];
|
||||||
|
|
||||||
|
// the scan order may be different from the output result order for agg interval operator.
|
||||||
|
if (pDownstream->operatorType == QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL) {
|
||||||
|
order = ((SIntervalAggOperatorInfo*) pDownstream->info)->resultTsOrder;
|
||||||
|
}
|
||||||
|
|
||||||
|
doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, order);
|
||||||
if (pResBlock->info.rows > 0) {
|
if (pResBlock->info.rows > 0) {
|
||||||
pResBlock->info.id.groupId = pInfo->curGroupId;
|
pResBlock->info.id.groupId = pInfo->curGroupId;
|
||||||
return pResBlock;
|
return pResBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
SOperatorInfo* pDownstream = pOperator->pDownstream[0];
|
|
||||||
while (1) {
|
while (1) {
|
||||||
SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream);
|
SSDataBlock* pBlock = pDownstream->fpSet.getNextFn(pDownstream);
|
||||||
if (pBlock == NULL) {
|
if (pBlock == NULL) {
|
||||||
|
@ -158,15 +214,16 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
||||||
blockDataEnsureCapacity(pInfo->pFinalRes, pBlock->info.rows);
|
blockDataEnsureCapacity(pInfo->pFinalRes, pBlock->info.rows);
|
||||||
doApplyScalarCalculation(pOperator, pBlock, order, scanFlag);
|
doApplyScalarCalculation(pOperator, pBlock, order, scanFlag);
|
||||||
|
|
||||||
if (pInfo->curGroupId == 0 || pInfo->curGroupId == pInfo->pRes->info.id.groupId) {
|
if (pInfo->curGroupId == 0 || (pInfo->curGroupId == pInfo->pRes->info.id.groupId)) {
|
||||||
|
if (pInfo->curGroupId == 0 && taosFillNotStarted(pInfo->pFillInfo)) {
|
||||||
|
revisedFillStartKey(pInfo, pBlock, order);
|
||||||
|
}
|
||||||
|
|
||||||
pInfo->curGroupId = pInfo->pRes->info.id.groupId; // the first data block
|
pInfo->curGroupId = pInfo->pRes->info.id.groupId; // the first data block
|
||||||
pInfo->totalInputRows += pInfo->pRes->info.rows;
|
pInfo->totalInputRows += pInfo->pRes->info.rows;
|
||||||
|
|
||||||
if (order == pInfo->pFillInfo->order) {
|
int64_t ts = (order == TSDB_ORDER_ASC)? pBlock->info.window.ekey:pBlock->info.window.skey;
|
||||||
taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.ekey);
|
taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, ts);
|
||||||
} else {
|
|
||||||
taosFillSetStartInfo(pInfo->pFillInfo, pInfo->pRes->info.rows, pBlock->info.window.skey);
|
|
||||||
}
|
|
||||||
taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
|
taosFillSetInputDataBlock(pInfo->pFillInfo, pInfo->pRes);
|
||||||
} else if (pInfo->curGroupId != pBlock->info.id.groupId) { // the new group data block
|
} else if (pInfo->curGroupId != pBlock->info.id.groupId) { // the new group data block
|
||||||
pInfo->existNewGroupBlock = pBlock;
|
pInfo->existNewGroupBlock = pBlock;
|
||||||
|
@ -190,7 +247,7 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
||||||
return pResBlock;
|
return pResBlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, pTaskInfo);
|
doHandleRemainBlockFromNewGroup(pOperator, pInfo, pResultInfo, order);
|
||||||
if (pResBlock->info.rows >= pOperator->resultInfo.threshold || pBlock == NULL) {
|
if (pResBlock->info.rows >= pOperator->resultInfo.threshold || pBlock == NULL) {
|
||||||
pResBlock->info.id.groupId = pInfo->curGroupId;
|
pResBlock->info.id.groupId = pInfo->curGroupId;
|
||||||
return pResBlock;
|
return pResBlock;
|
||||||
|
@ -198,7 +255,7 @@ static SSDataBlock* doFillImpl(SOperatorInfo* pOperator) {
|
||||||
} else if (pInfo->existNewGroupBlock) { // try next group
|
} else if (pInfo->existNewGroupBlock) { // try next group
|
||||||
blockDataCleanup(pResBlock);
|
blockDataCleanup(pResBlock);
|
||||||
|
|
||||||
doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, pTaskInfo);
|
doHandleRemainBlockForNewGroupImpl(pOperator, pInfo, pResultInfo, order);
|
||||||
if (pResBlock->info.rows > pResultInfo->threshold) {
|
if (pResBlock->info.rows > pResultInfo->threshold) {
|
||||||
pResBlock->info.id.groupId = pInfo->curGroupId;
|
pResBlock->info.id.groupId = pInfo->curGroupId;
|
||||||
return pResBlock;
|
return pResBlock;
|
||||||
|
@ -256,11 +313,11 @@ static int32_t initFillInfo(SFillOperatorInfo* pInfo, SExprInfo* pExpr, int32_t
|
||||||
const char* id, SInterval* pInterval, int32_t fillType, int32_t order) {
|
const char* id, SInterval* pInterval, int32_t fillType, int32_t order) {
|
||||||
SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode);
|
SFillColInfo* pColInfo = createFillColInfo(pExpr, numOfCols, pNotFillExpr, numOfNotFillCols, pValNode);
|
||||||
|
|
||||||
int64_t startKey = (order == TSDB_ORDER_ASC) ? win.skey : win.ekey;
|
int64_t startKey = (order == TSDB_ORDER_ASC) ? win.skey : win.ekey;
|
||||||
STimeWindow w = getAlignQueryTimeWindow(pInterval, pInterval->precision, startKey);
|
|
||||||
w = getFirstQualifiedTimeWindow(startKey, &w, pInterval, order);
|
|
||||||
|
|
||||||
pInfo->pFillInfo = taosCreateFillInfo(w.skey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo,
|
// STimeWindow w = {0};
|
||||||
|
// getInitialStartTimeWindow(pInterval, startKey, &w, order == TSDB_ORDER_ASC);
|
||||||
|
pInfo->pFillInfo = taosCreateFillInfo(startKey, numOfCols, numOfNotFillCols, capacity, pInterval, fillType, pColInfo,
|
||||||
pInfo->primaryTsCol, order, id);
|
pInfo->primaryTsCol, order, id);
|
||||||
|
|
||||||
if (order == TSDB_ORDER_ASC) {
|
if (order == TSDB_ORDER_ASC) {
|
||||||
|
@ -402,13 +459,13 @@ _error:
|
||||||
|
|
||||||
TSKEY getNextWindowTs(TSKEY ts, SInterval* pInterval) {
|
TSKEY getNextWindowTs(TSKEY ts, SInterval* pInterval) {
|
||||||
STimeWindow win = {.skey = ts, .ekey = ts};
|
STimeWindow win = {.skey = ts, .ekey = ts};
|
||||||
getNextIntervalWindow(pInterval, &win, TSDB_ORDER_ASC);
|
getNextTimeWindow(pInterval, &win, TSDB_ORDER_ASC);
|
||||||
return win.skey;
|
return win.skey;
|
||||||
}
|
}
|
||||||
|
|
||||||
TSKEY getPrevWindowTs(TSKEY ts, SInterval* pInterval) {
|
TSKEY getPrevWindowTs(TSKEY ts, SInterval* pInterval) {
|
||||||
STimeWindow win = {.skey = ts, .ekey = ts};
|
STimeWindow win = {.skey = ts, .ekey = ts};
|
||||||
getNextIntervalWindow(pInterval, &win, TSDB_ORDER_DESC);
|
getNextTimeWindow(pInterval, &win, TSDB_ORDER_DESC);
|
||||||
return win.skey;
|
return win.skey;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1002,9 +1059,10 @@ static void doStreamFillImpl(SOperatorInfo* pOperator) {
|
||||||
SSDataBlock* pBlock = pInfo->pSrcBlock;
|
SSDataBlock* pBlock = pInfo->pSrcBlock;
|
||||||
uint64_t groupId = pBlock->info.id.groupId;
|
uint64_t groupId = pBlock->info.id.groupId;
|
||||||
SSDataBlock* pRes = pInfo->pRes;
|
SSDataBlock* pRes = pInfo->pRes;
|
||||||
|
SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol);
|
||||||
|
TSKEY* tsCol = (TSKEY*)pTsCol->pData;
|
||||||
pRes->info.id.groupId = groupId;
|
pRes->info.id.groupId = groupId;
|
||||||
SColumnInfoData* pTsCol = taosArrayGet(pInfo->pSrcBlock->pDataBlock, pInfo->primaryTsCol);
|
pInfo->srcRowIndex++;
|
||||||
TSKEY* tsCol = (TSKEY*)pTsCol->pData;
|
|
||||||
|
|
||||||
if (pInfo->srcRowIndex == 0) {
|
if (pInfo->srcRowIndex == 0) {
|
||||||
keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize);
|
keepBlockRowInDiscBuf(pOperator, pFillInfo, pBlock, tsCol, pInfo->srcRowIndex, groupId, pFillSup->rowSize);
|
||||||
|
@ -1242,7 +1300,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
|
||||||
SSDataBlock* fillResult = NULL;
|
SSDataBlock* fillResult = NULL;
|
||||||
SOperatorInfo* downstream = pOperator->pDownstream[0];
|
SOperatorInfo* downstream = pOperator->pDownstream[0];
|
||||||
while (1) {
|
while (1) {
|
||||||
if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows) {
|
if (pInfo->srcRowIndex >= pInfo->pSrcBlock->info.rows || pInfo->pSrcBlock->info.rows == 0) {
|
||||||
// If there are delete datablocks, we receive them first.
|
// If there are delete datablocks, we receive them first.
|
||||||
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
|
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
|
||||||
if (pBlock == NULL) {
|
if (pBlock == NULL) {
|
||||||
|
@ -1281,7 +1339,7 @@ static SSDataBlock* doStreamFill(SOperatorInfo* pOperator) {
|
||||||
case STREAM_PULL_DATA: {
|
case STREAM_PULL_DATA: {
|
||||||
doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock);
|
doApplyStreamScalarCalculation(pOperator, pBlock, pInfo->pSrcBlock);
|
||||||
memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
|
memcpy(pInfo->pSrcBlock->info.parTbName, pBlock->info.parTbName, TSDB_TABLE_NAME_LEN);
|
||||||
pInfo->srcRowIndex = 0;
|
pInfo->srcRowIndex = -1;
|
||||||
} break;
|
} break;
|
||||||
case STREAM_CREATE_CHILD_TABLE: {
|
case STREAM_CREATE_CHILD_TABLE: {
|
||||||
return pBlock;
|
return pBlock;
|
||||||
|
@ -1497,7 +1555,7 @@ SOperatorInfo* createStreamFillOperatorInfo(SOperatorInfo* downstream, SStreamFi
|
||||||
goto _error;
|
goto _error;
|
||||||
}
|
}
|
||||||
|
|
||||||
pInfo->srcRowIndex = 0;
|
pInfo->srcRowIndex = -1;
|
||||||
setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo,
|
setOperatorInfo(pOperator, "StreamFillOperator", QUERY_NODE_PHYSICAL_PLAN_STREAM_FILL, false, OP_NOT_OPENED, pInfo,
|
||||||
pTaskInfo);
|
pTaskInfo);
|
||||||
pOperator->fpSet =
|
pOperator->fpSet =
|
||||||
|
|
|
@ -30,11 +30,13 @@ typedef struct SJoinRowCtx {
|
||||||
bool rowRemains;
|
bool rowRemains;
|
||||||
int64_t ts;
|
int64_t ts;
|
||||||
SArray* leftRowLocations;
|
SArray* leftRowLocations;
|
||||||
SArray* rightRowLocations;
|
|
||||||
SArray* leftCreatedBlocks;
|
SArray* leftCreatedBlocks;
|
||||||
SArray* rightCreatedBlocks;
|
SArray* rightCreatedBlocks;
|
||||||
int32_t leftRowIdx;
|
int32_t leftRowIdx;
|
||||||
int32_t rightRowIdx;
|
int32_t rightRowIdx;
|
||||||
|
|
||||||
|
bool rightUseBuildTable;
|
||||||
|
SArray* rightRowLocations;
|
||||||
} SJoinRowCtx;
|
} SJoinRowCtx;
|
||||||
|
|
||||||
typedef struct SJoinOperatorInfo {
|
typedef struct SJoinOperatorInfo {
|
||||||
|
@ -50,7 +52,17 @@ typedef struct SJoinOperatorInfo {
|
||||||
int32_t rightPos;
|
int32_t rightPos;
|
||||||
SColumnInfo rightCol;
|
SColumnInfo rightCol;
|
||||||
SNode* pCondAfterMerge;
|
SNode* pCondAfterMerge;
|
||||||
|
SNode* pColEqualOnConditions;
|
||||||
|
|
||||||
|
SArray* leftEqOnCondCols;
|
||||||
|
char* leftEqOnCondKeyBuf;
|
||||||
|
int32_t leftEqOnCondKeyLen;
|
||||||
|
|
||||||
|
SArray* rightEqOnCondCols;
|
||||||
|
char* rightEqOnCondKeyBuf;
|
||||||
|
int32_t rightEqOnCondKeyLen;
|
||||||
|
|
||||||
|
SSHashObj* rightBuildTable;
|
||||||
SJoinRowCtx rowCtx;
|
SJoinRowCtx rowCtx;
|
||||||
} SJoinOperatorInfo;
|
} SJoinOperatorInfo;
|
||||||
|
|
||||||
|
@ -92,6 +104,100 @@ static void extractTimeCondition(SJoinOperatorInfo* pInfo, SOperatorInfo** pDown
|
||||||
setJoinColumnInfo(&pInfo->rightCol, rightTsCol);
|
setJoinColumnInfo(&pInfo->rightCol, rightTsCol);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void extractEqualOnCondColsFromOper(SJoinOperatorInfo* pInfo, SOperatorInfo** pDownstreams, SOperatorNode* pOperNode,
|
||||||
|
SColumn* pLeft, SColumn* pRight) {
|
||||||
|
SColumnNode* pLeftNode = (SColumnNode*)pOperNode->pLeft;
|
||||||
|
SColumnNode* pRightNode = (SColumnNode*)pOperNode->pRight;
|
||||||
|
if (pLeftNode->dataBlockId == pRightNode->dataBlockId || pLeftNode->dataBlockId == pDownstreams[0]->resultDataBlockId) {
|
||||||
|
*pLeft = extractColumnFromColumnNode((SColumnNode*)pOperNode->pLeft);
|
||||||
|
*pRight = extractColumnFromColumnNode((SColumnNode*)pOperNode->pRight);
|
||||||
|
} else {
|
||||||
|
*pLeft = extractColumnFromColumnNode((SColumnNode*)pOperNode->pRight);
|
||||||
|
*pRight = extractColumnFromColumnNode((SColumnNode*)pOperNode->pLeft);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void extractEqualOnCondCols(SJoinOperatorInfo* pInfo, SOperatorInfo** pDownStream, SNode* pEqualOnCondNode,
|
||||||
|
SArray* leftTagEqCols, SArray* rightTagEqCols) {
|
||||||
|
SColumn left = {0};
|
||||||
|
SColumn right = {0};
|
||||||
|
if (nodeType(pEqualOnCondNode) == QUERY_NODE_LOGIC_CONDITION && ((SLogicConditionNode*)pEqualOnCondNode)->condType == LOGIC_COND_TYPE_AND) {
|
||||||
|
SNode* pNode = NULL;
|
||||||
|
FOREACH(pNode, ((SLogicConditionNode*)pEqualOnCondNode)->pParameterList) {
|
||||||
|
SOperatorNode* pOperNode = (SOperatorNode*)pNode;
|
||||||
|
extractEqualOnCondColsFromOper(pInfo, pDownStream, pOperNode, &left, &right);
|
||||||
|
taosArrayPush(leftTagEqCols, &left);
|
||||||
|
taosArrayPush(rightTagEqCols, &right);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodeType(pEqualOnCondNode) == QUERY_NODE_OPERATOR) {
|
||||||
|
SOperatorNode* pOperNode = (SOperatorNode*)pEqualOnCondNode;
|
||||||
|
extractEqualOnCondColsFromOper(pInfo, pDownStream, pOperNode, &left, &right);
|
||||||
|
taosArrayPush(leftTagEqCols, &left);
|
||||||
|
taosArrayPush(rightTagEqCols, &right);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t initTagColskeyBuf(int32_t* keyLen, char** keyBuf, const SArray* pGroupColList) {
|
||||||
|
int32_t numOfGroupCols = taosArrayGetSize(pGroupColList);
|
||||||
|
for (int32_t i = 0; i < numOfGroupCols; ++i) {
|
||||||
|
SColumn* pCol = (SColumn*)taosArrayGet(pGroupColList, i);
|
||||||
|
(*keyLen) += pCol->bytes; // actual data + null_flag
|
||||||
|
}
|
||||||
|
|
||||||
|
int32_t nullFlagSize = sizeof(int8_t) * numOfGroupCols;
|
||||||
|
(*keyLen) += nullFlagSize;
|
||||||
|
|
||||||
|
(*keyBuf) = taosMemoryCalloc(1, (*keyLen));
|
||||||
|
if ((*keyBuf) == NULL) {
|
||||||
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t fillKeyBufFromTagCols(SArray* pCols, SSDataBlock* pBlock, int32_t rowIndex, void* pKey) {
|
||||||
|
SColumnDataAgg* pColAgg = NULL;
|
||||||
|
size_t numOfGroupCols = taosArrayGetSize(pCols);
|
||||||
|
char* isNull = (char*)pKey;
|
||||||
|
char* pStart = (char*)pKey + sizeof(int8_t) * numOfGroupCols;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < numOfGroupCols; ++i) {
|
||||||
|
SColumn* pCol = (SColumn*) taosArrayGet(pCols, i);
|
||||||
|
SColumnInfoData* pColInfoData = taosArrayGet(pBlock->pDataBlock, pCol->slotId);
|
||||||
|
|
||||||
|
// valid range check. todo: return error code.
|
||||||
|
if (pCol->slotId > taosArrayGetSize(pBlock->pDataBlock)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pBlock->pBlockAgg != NULL) {
|
||||||
|
pColAgg = pBlock->pBlockAgg[pCol->slotId]; // TODO is agg data matched?
|
||||||
|
}
|
||||||
|
|
||||||
|
if (colDataIsNull(pColInfoData, pBlock->info.rows, rowIndex, pColAgg)) {
|
||||||
|
isNull[i] = 1;
|
||||||
|
} else {
|
||||||
|
isNull[i] = 0;
|
||||||
|
char* val = colDataGetData(pColInfoData, rowIndex);
|
||||||
|
if (pCol->type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
int32_t dataLen = getJsonValueLen(val);
|
||||||
|
memcpy(pStart, val, dataLen);
|
||||||
|
pStart += dataLen;
|
||||||
|
} else if (IS_VAR_DATA_TYPE(pCol->type)) {
|
||||||
|
varDataCopy(pStart, val);
|
||||||
|
pStart += varDataTLen(val);
|
||||||
|
} else {
|
||||||
|
memcpy(pStart, val, pCol->bytes);
|
||||||
|
pStart += pCol->bytes;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (int32_t)(pStart - (char*)pKey);
|
||||||
|
}
|
||||||
|
|
||||||
SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream,
|
SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t numOfDownstream,
|
||||||
SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo) {
|
SSortMergeJoinPhysiNode* pJoinNode, SExecTaskInfo* pTaskInfo) {
|
||||||
SJoinOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SJoinOperatorInfo));
|
SJoinOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SJoinOperatorInfo));
|
||||||
|
@ -153,6 +259,16 @@ SOperatorInfo* createMergeJoinOperatorInfo(SOperatorInfo** pDownstream, int32_t
|
||||||
pInfo->inputOrder = TSDB_ORDER_DESC;
|
pInfo->inputOrder = TSDB_ORDER_DESC;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pInfo->pColEqualOnConditions = pJoinNode->pColEqualOnConditions;
|
||||||
|
if (pInfo->pColEqualOnConditions != NULL) {
|
||||||
|
pInfo->leftEqOnCondCols = taosArrayInit(4, sizeof(SColumn));
|
||||||
|
pInfo->rightEqOnCondCols = taosArrayInit(4, sizeof(SColumn));
|
||||||
|
extractEqualOnCondCols(pInfo, pDownstream, pInfo->pColEqualOnConditions, pInfo->leftEqOnCondCols, pInfo->rightEqOnCondCols);
|
||||||
|
initTagColskeyBuf(&pInfo->leftEqOnCondKeyLen, &pInfo->leftEqOnCondKeyBuf, pInfo->leftEqOnCondCols);
|
||||||
|
initTagColskeyBuf(&pInfo->rightEqOnCondKeyLen, &pInfo->rightEqOnCondKeyBuf, pInfo->rightEqOnCondCols);
|
||||||
|
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
|
||||||
|
pInfo->rightBuildTable = tSimpleHashInit(256, hashFn);
|
||||||
|
}
|
||||||
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, optrDefaultBufFn, NULL);
|
pOperator->fpSet = createOperatorFpSet(optrDummyOpenFn, doMergeJoin, NULL, destroyMergeJoinOperator, optrDefaultBufFn, NULL);
|
||||||
code = appendDownstream(pOperator, pDownstream, numOfDownstream);
|
code = appendDownstream(pOperator, pDownstream, numOfDownstream);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
|
@ -179,8 +295,28 @@ void setJoinColumnInfo(SColumnInfo* pColumn, const SColumnNode* pColumnNode) {
|
||||||
pColumn->scale = pColumnNode->node.resType.scale;
|
pColumn->scale = pColumnNode->node.resType.scale;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mergeJoinDestoryBuildTable(SSHashObj* pBuildTable) {
|
||||||
|
void* p = NULL;
|
||||||
|
int32_t iter = 0;
|
||||||
|
|
||||||
|
while ((p = tSimpleHashIterate(pBuildTable, p, &iter)) != NULL) {
|
||||||
|
SArray* rows = (*(SArray**)p);
|
||||||
|
taosArrayDestroy(rows);
|
||||||
|
}
|
||||||
|
|
||||||
|
tSimpleHashCleanup(pBuildTable);
|
||||||
|
}
|
||||||
|
|
||||||
void destroyMergeJoinOperator(void* param) {
|
void destroyMergeJoinOperator(void* param) {
|
||||||
SJoinOperatorInfo* pJoinOperator = (SJoinOperatorInfo*)param;
|
SJoinOperatorInfo* pJoinOperator = (SJoinOperatorInfo*)param;
|
||||||
|
if (pJoinOperator->pColEqualOnConditions != NULL) {
|
||||||
|
mergeJoinDestoryBuildTable(pJoinOperator->rightBuildTable);
|
||||||
|
taosMemoryFreeClear(pJoinOperator->rightEqOnCondKeyBuf);
|
||||||
|
taosArrayDestroy(pJoinOperator->rightEqOnCondCols);
|
||||||
|
|
||||||
|
taosMemoryFreeClear(pJoinOperator->leftEqOnCondKeyBuf);
|
||||||
|
taosArrayDestroy(pJoinOperator->leftEqOnCondCols);
|
||||||
|
}
|
||||||
nodesDestroyNode(pJoinOperator->pCondAfterMerge);
|
nodesDestroyNode(pJoinOperator->pCondAfterMerge);
|
||||||
|
|
||||||
pJoinOperator->pRes = blockDataDestroy(pJoinOperator->pRes);
|
pJoinOperator->pRes = blockDataDestroy(pJoinOperator->pRes);
|
||||||
|
@ -300,21 +436,122 @@ static int32_t mergeJoinGetDownStreamRowsEqualTimeStamp(SOperatorInfo* pOperator
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int32_t mergeJoinFillBuildTable(SJoinOperatorInfo* pInfo, SArray* rightRowLocations) {
|
||||||
|
for (int32_t i = 0; i < taosArrayGetSize(rightRowLocations); ++i) {
|
||||||
|
SRowLocation* rightRow = taosArrayGet(rightRowLocations, i);
|
||||||
|
int32_t keyLen = fillKeyBufFromTagCols(pInfo->rightEqOnCondCols, rightRow->pDataBlock, rightRow->pos, pInfo->rightEqOnCondKeyBuf);
|
||||||
|
SArray** ppRows = tSimpleHashGet(pInfo->rightBuildTable, pInfo->rightEqOnCondKeyBuf, keyLen);
|
||||||
|
if (!ppRows) {
|
||||||
|
SArray* rows = taosArrayInit(4, sizeof(SRowLocation));
|
||||||
|
taosArrayPush(rows, rightRow);
|
||||||
|
tSimpleHashPut(pInfo->rightBuildTable, pInfo->rightEqOnCondKeyBuf, keyLen, &rows, POINTER_BYTES);
|
||||||
|
} else {
|
||||||
|
taosArrayPush(*ppRows, rightRow);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t mergeJoinLeftRowsRightRows(SOperatorInfo* pOperator, SSDataBlock* pRes, int32_t* nRows,
|
||||||
|
const SArray* leftRowLocations, int32_t leftRowIdx,
|
||||||
|
int32_t rightRowIdx, bool useBuildTableTSRange, SArray* rightRowLocations, bool* pReachThreshold) {
|
||||||
|
*pReachThreshold = false;
|
||||||
|
uint32_t limitRowNum = pOperator->resultInfo.threshold;
|
||||||
|
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
||||||
|
size_t leftNumJoin = taosArrayGetSize(leftRowLocations);
|
||||||
|
|
||||||
|
int32_t i,j;
|
||||||
|
|
||||||
|
for (i = leftRowIdx; i < leftNumJoin; ++i, rightRowIdx = 0) {
|
||||||
|
SRowLocation* leftRow = taosArrayGet(leftRowLocations, i);
|
||||||
|
SArray* pRightRows = NULL;
|
||||||
|
if (useBuildTableTSRange) {
|
||||||
|
int32_t keyLen = fillKeyBufFromTagCols(pJoinInfo->leftEqOnCondCols, leftRow->pDataBlock, leftRow->pos, pJoinInfo->leftEqOnCondKeyBuf);
|
||||||
|
SArray** ppRightRows = tSimpleHashGet(pJoinInfo->rightBuildTable, pJoinInfo->leftEqOnCondKeyBuf, keyLen);
|
||||||
|
if (!ppRightRows) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
pRightRows = *ppRightRows;
|
||||||
|
} else {
|
||||||
|
pRightRows = rightRowLocations;
|
||||||
|
}
|
||||||
|
size_t rightRowsSize = taosArrayGetSize(pRightRows);
|
||||||
|
for (j = rightRowIdx; j < rightRowsSize; ++j) {
|
||||||
|
if (*nRows >= limitRowNum) {
|
||||||
|
*pReachThreshold = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
SRowLocation* rightRow = taosArrayGet(pRightRows, j);
|
||||||
|
mergeJoinJoinLeftRight(pOperator, pRes, *nRows, leftRow->pDataBlock, leftRow->pos, rightRow->pDataBlock,
|
||||||
|
rightRow->pos);
|
||||||
|
++*nRows;
|
||||||
|
}
|
||||||
|
if (*pReachThreshold) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (*pReachThreshold) {
|
||||||
|
pJoinInfo->rowCtx.rowRemains = true;
|
||||||
|
pJoinInfo->rowCtx.leftRowIdx = i;
|
||||||
|
pJoinInfo->rowCtx.rightRowIdx = j;
|
||||||
|
}
|
||||||
|
return TSDB_CODE_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void mergeJoinDestroyTSRangeCtx(SJoinOperatorInfo* pJoinInfo, SArray* leftRowLocations, SArray* leftCreatedBlocks,
|
||||||
|
SArray* rightCreatedBlocks, bool rightUseBuildTable, SArray* rightRowLocations) {
|
||||||
|
for (int i = 0; i < taosArrayGetSize(rightCreatedBlocks); ++i) {
|
||||||
|
SSDataBlock* pBlock = taosArrayGetP(rightCreatedBlocks, i);
|
||||||
|
blockDataDestroy(pBlock);
|
||||||
|
}
|
||||||
|
taosArrayDestroy(rightCreatedBlocks);
|
||||||
|
for (int i = 0; i < taosArrayGetSize(leftCreatedBlocks); ++i) {
|
||||||
|
SSDataBlock* pBlock = taosArrayGetP(leftCreatedBlocks, i);
|
||||||
|
blockDataDestroy(pBlock);
|
||||||
|
}
|
||||||
|
if (rightRowLocations != NULL) {
|
||||||
|
taosArrayDestroy(rightRowLocations);
|
||||||
|
}
|
||||||
|
if (rightUseBuildTable) {
|
||||||
|
void* p = NULL;
|
||||||
|
int32_t iter = 0;
|
||||||
|
while ((p = tSimpleHashIterate(pJoinInfo->rightBuildTable, p, &iter)) != NULL) {
|
||||||
|
SArray* rows = (*(SArray**)p);
|
||||||
|
taosArrayDestroy(rows);
|
||||||
|
}
|
||||||
|
tSimpleHashClear(pJoinInfo->rightBuildTable);
|
||||||
|
}
|
||||||
|
|
||||||
|
taosArrayDestroy(leftCreatedBlocks);
|
||||||
|
taosArrayDestroy(leftRowLocations);
|
||||||
|
|
||||||
|
pJoinInfo->rowCtx.rowRemains = false;
|
||||||
|
pJoinInfo->rowCtx.leftRowLocations = NULL;
|
||||||
|
pJoinInfo->rowCtx.leftCreatedBlocks = NULL;
|
||||||
|
pJoinInfo->rowCtx.rightCreatedBlocks = NULL;
|
||||||
|
pJoinInfo->rowCtx.rightUseBuildTable = false;
|
||||||
|
pJoinInfo->rowCtx.rightRowLocations = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static int32_t mergeJoinJoinDownstreamTsRanges(SOperatorInfo* pOperator, int64_t timestamp, SSDataBlock* pRes,
|
static int32_t mergeJoinJoinDownstreamTsRanges(SOperatorInfo* pOperator, int64_t timestamp, SSDataBlock* pRes,
|
||||||
int32_t* nRows) {
|
int32_t* nRows) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
SJoinOperatorInfo* pJoinInfo = pOperator->info;
|
||||||
SArray* leftRowLocations = NULL;
|
SArray* leftRowLocations = NULL;
|
||||||
SArray* leftCreatedBlocks = NULL;
|
|
||||||
SArray* rightRowLocations = NULL;
|
SArray* rightRowLocations = NULL;
|
||||||
|
SArray* leftCreatedBlocks = NULL;
|
||||||
SArray* rightCreatedBlocks = NULL;
|
SArray* rightCreatedBlocks = NULL;
|
||||||
int32_t leftRowIdx = 0;
|
int32_t leftRowIdx = 0;
|
||||||
int32_t rightRowIdx = 0;
|
int32_t rightRowIdx = 0;
|
||||||
int32_t i, j;
|
SSHashObj* rightTableHash = NULL;
|
||||||
|
bool rightUseBuildTable = false;
|
||||||
|
|
||||||
if (pJoinInfo->rowCtx.rowRemains) {
|
if (pJoinInfo->rowCtx.rowRemains) {
|
||||||
leftRowLocations = pJoinInfo->rowCtx.leftRowLocations;
|
leftRowLocations = pJoinInfo->rowCtx.leftRowLocations;
|
||||||
leftCreatedBlocks = pJoinInfo->rowCtx.leftCreatedBlocks;
|
leftCreatedBlocks = pJoinInfo->rowCtx.leftCreatedBlocks;
|
||||||
|
rightUseBuildTable = pJoinInfo->rowCtx.rightUseBuildTable;
|
||||||
rightRowLocations = pJoinInfo->rowCtx.rightRowLocations;
|
rightRowLocations = pJoinInfo->rowCtx.rightRowLocations;
|
||||||
rightCreatedBlocks = pJoinInfo->rowCtx.rightCreatedBlocks;
|
rightCreatedBlocks = pJoinInfo->rowCtx.rightCreatedBlocks;
|
||||||
leftRowIdx = pJoinInfo->rowCtx.leftRowIdx;
|
leftRowIdx = pJoinInfo->rowCtx.leftRowIdx;
|
||||||
|
@ -330,78 +567,40 @@ static int32_t mergeJoinJoinDownstreamTsRanges(SOperatorInfo* pOperator, int64_t
|
||||||
pJoinInfo->leftPos, timestamp, leftRowLocations, leftCreatedBlocks);
|
pJoinInfo->leftPos, timestamp, leftRowLocations, leftCreatedBlocks);
|
||||||
mergeJoinGetDownStreamRowsEqualTimeStamp(pOperator, 1, pJoinInfo->rightCol.slotId, pJoinInfo->pRight,
|
mergeJoinGetDownStreamRowsEqualTimeStamp(pOperator, 1, pJoinInfo->rightCol.slotId, pJoinInfo->pRight,
|
||||||
pJoinInfo->rightPos, timestamp, rightRowLocations, rightCreatedBlocks);
|
pJoinInfo->rightPos, timestamp, rightRowLocations, rightCreatedBlocks);
|
||||||
|
if (pJoinInfo->pColEqualOnConditions != NULL && taosArrayGetSize(rightRowLocations) > 16) {
|
||||||
|
mergeJoinFillBuildTable(pJoinInfo, rightRowLocations);
|
||||||
|
rightUseBuildTable = true;
|
||||||
|
taosArrayDestroy(rightRowLocations);
|
||||||
|
rightRowLocations = NULL;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t leftNumJoin = taosArrayGetSize(leftRowLocations);
|
size_t leftNumJoin = taosArrayGetSize(leftRowLocations);
|
||||||
size_t rightNumJoin = taosArrayGetSize(rightRowLocations);
|
code = blockDataEnsureCapacity(pRes, pOperator->resultInfo.threshold);
|
||||||
uint32_t maxRowNum = *nRows + (leftNumJoin - leftRowIdx - 1) * rightNumJoin + rightNumJoin - rightRowIdx;
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
uint32_t limitRowNum = maxRowNum;
|
qError("%s can not ensure block capacity for join. left: %zu", GET_TASKID(pOperator->pTaskInfo),
|
||||||
if (maxRowNum > pOperator->resultInfo.threshold) {
|
leftNumJoin);
|
||||||
limitRowNum = pOperator->resultInfo.threshold;
|
}
|
||||||
if (!pJoinInfo->rowCtx.rowRemains) {
|
|
||||||
|
bool reachThreshold = false;
|
||||||
|
|
||||||
|
if (code == TSDB_CODE_SUCCESS) {
|
||||||
|
mergeJoinLeftRowsRightRows(pOperator, pRes, nRows, leftRowLocations, leftRowIdx,
|
||||||
|
rightRowIdx, rightUseBuildTable, rightRowLocations, &reachThreshold);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!reachThreshold) {
|
||||||
|
mergeJoinDestroyTSRangeCtx(pJoinInfo, leftRowLocations, leftCreatedBlocks, rightCreatedBlocks,
|
||||||
|
rightUseBuildTable, rightRowLocations);
|
||||||
|
|
||||||
|
} else {
|
||||||
pJoinInfo->rowCtx.rowRemains = true;
|
pJoinInfo->rowCtx.rowRemains = true;
|
||||||
pJoinInfo->rowCtx.ts = timestamp;
|
pJoinInfo->rowCtx.ts = timestamp;
|
||||||
pJoinInfo->rowCtx.leftRowLocations = leftRowLocations;
|
pJoinInfo->rowCtx.leftRowLocations = leftRowLocations;
|
||||||
pJoinInfo->rowCtx.rightRowLocations = rightRowLocations;
|
|
||||||
pJoinInfo->rowCtx.leftCreatedBlocks = leftCreatedBlocks;
|
pJoinInfo->rowCtx.leftCreatedBlocks = leftCreatedBlocks;
|
||||||
pJoinInfo->rowCtx.rightCreatedBlocks = rightCreatedBlocks;
|
pJoinInfo->rowCtx.rightCreatedBlocks = rightCreatedBlocks;
|
||||||
}
|
pJoinInfo->rowCtx.rightUseBuildTable = rightUseBuildTable;
|
||||||
}
|
pJoinInfo->rowCtx.rightRowLocations = rightRowLocations;
|
||||||
|
|
||||||
code = blockDataEnsureCapacity(pRes, limitRowNum);
|
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
|
||||||
qError("%s can not ensure block capacity for join. left: %zu, right: %zu", GET_TASKID(pOperator->pTaskInfo),
|
|
||||||
leftNumJoin, rightNumJoin);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (code == TSDB_CODE_SUCCESS) {
|
|
||||||
bool done = false;
|
|
||||||
for (i = leftRowIdx; i < leftNumJoin; ++i, rightRowIdx = 0) {
|
|
||||||
for (j = rightRowIdx; j < rightNumJoin; ++j) {
|
|
||||||
if (*nRows >= limitRowNum) {
|
|
||||||
done = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRowLocation* leftRow = taosArrayGet(leftRowLocations, i);
|
|
||||||
SRowLocation* rightRow = taosArrayGet(rightRowLocations, j);
|
|
||||||
mergeJoinJoinLeftRight(pOperator, pRes, *nRows, leftRow->pDataBlock, leftRow->pos, rightRow->pDataBlock,
|
|
||||||
rightRow->pos);
|
|
||||||
++*nRows;
|
|
||||||
}
|
|
||||||
if (done) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (maxRowNum > pOperator->resultInfo.threshold) {
|
|
||||||
pJoinInfo->rowCtx.leftRowIdx = i;
|
|
||||||
pJoinInfo->rowCtx.rightRowIdx = j;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (maxRowNum <= pOperator->resultInfo.threshold) {
|
|
||||||
for (int i = 0; i < taosArrayGetSize(rightCreatedBlocks); ++i) {
|
|
||||||
SSDataBlock* pBlock = taosArrayGetP(rightCreatedBlocks, i);
|
|
||||||
blockDataDestroy(pBlock);
|
|
||||||
}
|
|
||||||
taosArrayDestroy(rightCreatedBlocks);
|
|
||||||
taosArrayDestroy(rightRowLocations);
|
|
||||||
for (int i = 0; i < taosArrayGetSize(leftCreatedBlocks); ++i) {
|
|
||||||
SSDataBlock* pBlock = taosArrayGetP(leftCreatedBlocks, i);
|
|
||||||
blockDataDestroy(pBlock);
|
|
||||||
}
|
|
||||||
taosArrayDestroy(leftCreatedBlocks);
|
|
||||||
taosArrayDestroy(leftRowLocations);
|
|
||||||
|
|
||||||
if (pJoinInfo->rowCtx.rowRemains) {
|
|
||||||
pJoinInfo->rowCtx.rowRemains = false;
|
|
||||||
pJoinInfo->rowCtx.leftRowLocations = NULL;
|
|
||||||
pJoinInfo->rowCtx.rightRowLocations = NULL;
|
|
||||||
pJoinInfo->rowCtx.leftCreatedBlocks = NULL;
|
|
||||||
pJoinInfo->rowCtx.rightCreatedBlocks = NULL;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,8 @@
|
||||||
* 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 "executorInt.h"
|
#include "executorInt.h"
|
||||||
#include "filter.h"
|
#include "filter.h"
|
||||||
#include "function.h"
|
#include "function.h"
|
||||||
|
@ -88,39 +90,6 @@ static void switchCtxOrder(SqlFunctionCtx* pCtx, int32_t numOfOutput) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void getNextTimeWindow(SInterval* pInterval, STimeWindow* tw, int32_t order) {
|
|
||||||
int32_t factor = GET_FORWARD_DIRECTION_FACTOR(order);
|
|
||||||
if (pInterval->intervalUnit != 'n' && pInterval->intervalUnit != 'y') {
|
|
||||||
tw->skey += pInterval->sliding * factor;
|
|
||||||
tw->ekey = tw->skey + pInterval->interval - 1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int64_t key = tw->skey, interval = pInterval->interval;
|
|
||||||
// convert key to second
|
|
||||||
key = convertTimePrecision(key, pInterval->precision, TSDB_TIME_PRECISION_MILLI) / 1000;
|
|
||||||
|
|
||||||
if (pInterval->intervalUnit == 'y') {
|
|
||||||
interval *= 12;
|
|
||||||
}
|
|
||||||
|
|
||||||
struct tm tm;
|
|
||||||
time_t t = (time_t)key;
|
|
||||||
taosLocalTime(&t, &tm, NULL);
|
|
||||||
|
|
||||||
int mon = (int)(tm.tm_year * 12 + tm.tm_mon + interval * factor);
|
|
||||||
tm.tm_year = mon / 12;
|
|
||||||
tm.tm_mon = mon % 12;
|
|
||||||
tw->skey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
|
|
||||||
|
|
||||||
mon = (int)(mon + interval);
|
|
||||||
tm.tm_year = mon / 12;
|
|
||||||
tm.tm_mon = mon % 12;
|
|
||||||
tw->ekey = convertTimePrecision((int64_t)taosMktime(&tm) * 1000LL, TSDB_TIME_PRECISION_MILLI, pInterval->precision);
|
|
||||||
|
|
||||||
tw->ekey -= 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool overlapWithTimeWindow(SInterval* pInterval, SDataBlockInfo* pBlockInfo, int32_t order) {
|
static bool overlapWithTimeWindow(SInterval* pInterval, SDataBlockInfo* pBlockInfo, int32_t order) {
|
||||||
STimeWindow w = {0};
|
STimeWindow w = {0};
|
||||||
|
|
||||||
|
@ -130,7 +99,7 @@ static bool overlapWithTimeWindow(SInterval* pInterval, SDataBlockInfo* pBlockIn
|
||||||
}
|
}
|
||||||
|
|
||||||
if (order == TSDB_ORDER_ASC) {
|
if (order == TSDB_ORDER_ASC) {
|
||||||
w = getAlignQueryTimeWindow(pInterval, pInterval->precision, pBlockInfo->window.skey);
|
w = getAlignQueryTimeWindow(pInterval, pBlockInfo->window.skey);
|
||||||
ASSERT(w.ekey >= pBlockInfo->window.skey);
|
ASSERT(w.ekey >= pBlockInfo->window.skey);
|
||||||
|
|
||||||
if (w.ekey < pBlockInfo->window.ekey) {
|
if (w.ekey < pBlockInfo->window.ekey) {
|
||||||
|
@ -149,7 +118,7 @@ static bool overlapWithTimeWindow(SInterval* pInterval, SDataBlockInfo* pBlockIn
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
w = getAlignQueryTimeWindow(pInterval, pInterval->precision, pBlockInfo->window.ekey);
|
w = getAlignQueryTimeWindow(pInterval, pBlockInfo->window.ekey);
|
||||||
ASSERT(w.skey <= pBlockInfo->window.ekey);
|
ASSERT(w.skey <= pBlockInfo->window.ekey);
|
||||||
|
|
||||||
if (w.skey > pBlockInfo->window.skey) {
|
if (w.skey > pBlockInfo->window.skey) {
|
||||||
|
@ -206,7 +175,7 @@ static int32_t insertTableToScanIgnoreList(STableScanInfo* pTableScanInfo, uint6
|
||||||
return TSDB_CODE_OUT_OF_MEMORY;
|
return TSDB_CODE_OUT_OF_MEMORY;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
taosHashPut(pTableScanInfo->pIgnoreTables, &uid, sizeof(uid), &pTableScanInfo->scanTimes, sizeof(pTableScanInfo->scanTimes));
|
taosHashPut(pTableScanInfo->pIgnoreTables, &uid, sizeof(uid), &pTableScanInfo->scanTimes, sizeof(pTableScanInfo->scanTimes));
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
|
@ -215,7 +184,7 @@ static int32_t insertTableToScanIgnoreList(STableScanInfo* pTableScanInfo, uint6
|
||||||
static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo* pBlockInfo, uint32_t* status) {
|
static int32_t doDynamicPruneDataBlock(SOperatorInfo* pOperator, SDataBlockInfo* pBlockInfo, uint32_t* status) {
|
||||||
STableScanInfo* pTableScanInfo = pOperator->info;
|
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
|
|
||||||
if (pTableScanInfo->base.pdInfo.pExprSup == NULL) {
|
if (pTableScanInfo->base.pdInfo.pExprSup == NULL) {
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
@ -267,12 +236,13 @@ static bool doLoadBlockSMA(STableScanBase* pTableScanInfo, SSDataBlock* pBlock,
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
|
||||||
bool allColumnsHaveAgg = true;
|
bool allColumnsHaveAgg = true;
|
||||||
int32_t code = pAPI->tsdReader.tsdReaderRetrieveBlockSMAInfo(pTableScanInfo->dataReader, pBlock, &allColumnsHaveAgg);
|
bool hasNullSMA = false;
|
||||||
|
int32_t code = pAPI->tsdReader.tsdReaderRetrieveBlockSMAInfo(pTableScanInfo->dataReader, pBlock, &allColumnsHaveAgg, &hasNullSMA);
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!allColumnsHaveAgg) {
|
if (!allColumnsHaveAgg || hasNullSMA) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
|
@ -751,7 +721,7 @@ static SSDataBlock* doGroupedTableScan(SOperatorInfo* pOperator) {
|
||||||
STableScanInfo* pTableScanInfo = pOperator->info;
|
STableScanInfo* pTableScanInfo = pOperator->info;
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
|
||||||
// The read handle is not initialized yet, since no qualified tables exists
|
// The read handle is not initialized yet, since no qualified tables exists
|
||||||
if (pTableScanInfo->base.dataReader == NULL || pOperator->status == OP_EXEC_DONE) {
|
if (pTableScanInfo->base.dataReader == NULL || pOperator->status == OP_EXEC_DONE) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
@ -1072,6 +1042,7 @@ static void setGroupId(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_t grou
|
||||||
|
|
||||||
void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin, uint64_t ver) {
|
void resetTableScanInfo(STableScanInfo* pTableScanInfo, STimeWindow* pWin, uint64_t ver) {
|
||||||
pTableScanInfo->base.cond.twindows = *pWin;
|
pTableScanInfo->base.cond.twindows = *pWin;
|
||||||
|
pTableScanInfo->base.cond.startVersion = 0;
|
||||||
pTableScanInfo->base.cond.endVersion = ver;
|
pTableScanInfo->base.cond.endVersion = ver;
|
||||||
pTableScanInfo->scanTimes = 0;
|
pTableScanInfo->scanTimes = 0;
|
||||||
pTableScanInfo->currentGroupId = -1;
|
pTableScanInfo->currentGroupId = -1;
|
||||||
|
@ -1194,6 +1165,7 @@ static bool prepareRangeScan(SStreamScanInfo* pInfo, SSDataBlock* pBlock, int32_
|
||||||
}
|
}
|
||||||
|
|
||||||
STableScanInfo* pTScanInfo = pInfo->pTableScanOp->info;
|
STableScanInfo* pTScanInfo = pInfo->pTableScanOp->info;
|
||||||
|
qDebug("prepare range scan start:%" PRId64 ",end:%" PRId64 ",maxVer:%" PRIu64, win.skey, win.ekey, pInfo->pUpdateInfo->maxDataVersion);
|
||||||
resetTableScanInfo(pInfo->pTableScanOp->info, &win, pInfo->pUpdateInfo->maxDataVersion);
|
resetTableScanInfo(pInfo->pTableScanOp->info, &win, pInfo->pUpdateInfo->maxDataVersion);
|
||||||
pInfo->pTableScanOp->status = OP_OPENED;
|
pInfo->pTableScanOp->status = OP_OPENED;
|
||||||
return true;
|
return true;
|
||||||
|
@ -1649,6 +1621,10 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
qDebug("start to exec queue scan, %s", id);
|
qDebug("start to exec queue scan, %s", id);
|
||||||
|
|
||||||
|
if (isTaskKilled(pTaskInfo)) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (pTaskInfo->streamInfo.currentOffset.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
if (pTaskInfo->streamInfo.currentOffset.type == TMQ_OFFSET__SNAPSHOT_DATA) {
|
||||||
SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp);
|
SSDataBlock* pResult = doTableScan(pInfo->pTableScanOp);
|
||||||
if (pResult && pResult->info.rows > 0) {
|
if (pResult && pResult->info.rows > 0) {
|
||||||
|
@ -1661,7 +1637,7 @@ static SSDataBlock* doQueueScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
STableScanInfo* pTSInfo = pInfo->pTableScanOp->info;
|
||||||
pAPI->tsdReader.tsdReaderClose(pTSInfo->base.dataReader);
|
pAPI->tsdReader.tsdReaderClose(pTSInfo->base.dataReader);
|
||||||
|
|
||||||
pTSInfo->base.dataReader = NULL;
|
pTSInfo->base.dataReader = NULL;
|
||||||
qDebug("queue scan tsdb over, switch to wal ver %" PRId64 "", pTaskInfo->streamInfo.snapshotVer + 1);
|
qDebug("queue scan tsdb over, switch to wal ver %" PRId64 "", pTaskInfo->streamInfo.snapshotVer + 1);
|
||||||
if (pAPI->tqReaderFn.tqReaderSeek(pInfo->tqReader, pTaskInfo->streamInfo.snapshotVer + 1, pTaskInfo->id.str) < 0) {
|
if (pAPI->tqReaderFn.tqReaderSeek(pInfo->tqReader, pTaskInfo->streamInfo.snapshotVer + 1, pTaskInfo->id.str) < 0) {
|
||||||
|
@ -1797,9 +1773,10 @@ void streamScanOperatorDecode(void* pBuff, int32_t len, SStreamScanInfo* pInfo)
|
||||||
|
|
||||||
static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
// NOTE: this operator does never check if current status is done or not
|
// NOTE: this operator does never check if current status is done or not
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
const char* id = GET_TASKID(pTaskInfo);
|
||||||
|
|
||||||
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
SStreamScanInfo* pInfo = pOperator->info;
|
SStreamScanInfo* pInfo = pOperator->info;
|
||||||
|
|
||||||
qDebug("stream scan started, %s", GET_TASKID(pTaskInfo));
|
qDebug("stream scan started, %s", GET_TASKID(pTaskInfo));
|
||||||
|
@ -1883,11 +1860,12 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
if (pInfo->pRecoverRes != NULL) {
|
if (pInfo->pRecoverRes != NULL) {
|
||||||
pInfo->blockRecoverContiCnt++;
|
pInfo->blockRecoverContiCnt++;
|
||||||
calBlockTbName(pInfo, pInfo->pRecoverRes);
|
calBlockTbName(pInfo, pInfo->pRecoverRes);
|
||||||
if (pInfo->pUpdateInfo) {
|
if (!pInfo->igCheckUpdate && pInfo->pUpdateInfo) {
|
||||||
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__SCAN1) {
|
if (pTaskInfo->streamInfo.recoverStep == STREAM_RECOVER_STEP__SCAN1) {
|
||||||
TSKEY maxTs = pAPI->stateStore.updateInfoFillBlockData(pInfo->pUpdateInfo, pInfo->pRecoverRes, pInfo->primaryTsIndex);
|
TSKEY maxTs = pAPI->stateStore.updateInfoFillBlockData(pInfo->pUpdateInfo, pInfo->pRecoverRes, pInfo->primaryTsIndex);
|
||||||
pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs);
|
pInfo->twAggSup.maxTs = TMAX(pInfo->twAggSup.maxTs, maxTs);
|
||||||
} else {
|
} else {
|
||||||
|
pInfo->pUpdateInfo->maxDataVersion = pTaskInfo->streamInfo.fillHistoryVer2;
|
||||||
doCheckUpdate(pInfo, pInfo->pRecoverRes->info.window.ekey, pInfo->pRecoverRes);
|
doCheckUpdate(pInfo, pInfo->pRecoverRes->info.window.ekey, pInfo->pRecoverRes);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1896,6 +1874,7 @@ static SSDataBlock* doStreamScan(SOperatorInfo* pOperator) {
|
||||||
printDataBlock(pInfo->pCreateTbRes, "recover createTbl");
|
printDataBlock(pInfo->pCreateTbRes, "recover createTbl");
|
||||||
return pInfo->pCreateTbRes;
|
return pInfo->pCreateTbRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
qDebug("stream recover scan get block, rows %" PRId64, pInfo->pRecoverRes->info.rows);
|
qDebug("stream recover scan get block, rows %" PRId64, pInfo->pRecoverRes->info.rows);
|
||||||
printDataBlock(pInfo->pRecoverRes, "scan recover");
|
printDataBlock(pInfo->pRecoverRes, "scan recover");
|
||||||
return pInfo->pRecoverRes;
|
return pInfo->pRecoverRes;
|
||||||
|
@ -1922,7 +1901,9 @@ FETCH_NEXT_BLOCK:
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t current = pInfo->validBlockIndex++;
|
int32_t current = pInfo->validBlockIndex++;
|
||||||
|
qDebug("process %d/%d input data blocks, %s", current, (int32_t) total, id);
|
||||||
|
|
||||||
SPackedData* pPacked = taosArrayGet(pInfo->pBlockLists, current);
|
SPackedData* pPacked = taosArrayGet(pInfo->pBlockLists, current);
|
||||||
SSDataBlock* pBlock = pPacked->pDataBlock;
|
SSDataBlock* pBlock = pPacked->pDataBlock;
|
||||||
if (pBlock->info.parTbName[0]) {
|
if (pBlock->info.parTbName[0]) {
|
||||||
|
@ -2002,7 +1983,7 @@ FETCH_NEXT_BLOCK:
|
||||||
// printDataBlock(pBlock, "stream scan recv");
|
// printDataBlock(pBlock, "stream scan recv");
|
||||||
return pBlock;
|
return pBlock;
|
||||||
} else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) {
|
} else if (pInfo->blockType == STREAM_INPUT__DATA_SUBMIT) {
|
||||||
qDebug("scan mode %d", pInfo->scanMode);
|
qDebug("stream scan mode:%d, %s", pInfo->scanMode, id);
|
||||||
switch (pInfo->scanMode) {
|
switch (pInfo->scanMode) {
|
||||||
case STREAM_SCAN_FROM_RES: {
|
case STREAM_SCAN_FROM_RES: {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
pInfo->scanMode = STREAM_SCAN_FROM_READERHANDLE;
|
||||||
|
@ -2057,7 +2038,6 @@ FETCH_NEXT_BLOCK:
|
||||||
return pInfo->pUpdateRes;
|
return pInfo->pUpdateRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* id = GET_TASKID(pTaskInfo);
|
|
||||||
SSDataBlock* pBlock = pInfo->pRes;
|
SSDataBlock* pBlock = pInfo->pRes;
|
||||||
SDataBlockInfo* pBlockInfo = &pBlock->info;
|
SDataBlockInfo* pBlockInfo = &pBlock->info;
|
||||||
int32_t totalBlocks = taosArrayGetSize(pInfo->pBlockLists);
|
int32_t totalBlocks = taosArrayGetSize(pInfo->pBlockLists);
|
||||||
|
@ -2087,8 +2067,13 @@ FETCH_NEXT_BLOCK:
|
||||||
|
|
||||||
while (pAPI->tqReaderFn.tqNextBlockImpl(pInfo->tqReader, id)) {
|
while (pAPI->tqReaderFn.tqNextBlockImpl(pInfo->tqReader, id)) {
|
||||||
SSDataBlock* pRes = NULL;
|
SSDataBlock* pRes = NULL;
|
||||||
|
|
||||||
int32_t code = pAPI->tqReaderFn.tqRetrieveBlock(pInfo->tqReader, &pRes, id);
|
int32_t code = pAPI->tqReaderFn.tqRetrieveBlock(pInfo->tqReader, &pRes, id);
|
||||||
|
qDebug("retrieve data from submit completed code:%s, rows:%" PRId64 " %s", tstrerror(code), pRes->info.rows,
|
||||||
|
id);
|
||||||
|
|
||||||
if (code != TSDB_CODE_SUCCESS || pRes->info.rows == 0) {
|
if (code != TSDB_CODE_SUCCESS || pRes->info.rows == 0) {
|
||||||
|
qDebug("retrieve data failed, try next block in submit block, %s", id);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2096,6 +2081,7 @@ FETCH_NEXT_BLOCK:
|
||||||
|
|
||||||
if (pInfo->pCreateTbRes->info.rows > 0) {
|
if (pInfo->pCreateTbRes->info.rows > 0) {
|
||||||
pInfo->scanMode = STREAM_SCAN_FROM_RES;
|
pInfo->scanMode = STREAM_SCAN_FROM_RES;
|
||||||
|
qDebug("create table res exists, rows:%"PRId64" return from stream scan, %s", pInfo->pCreateTbRes->info.rows, id);
|
||||||
return pInfo->pCreateTbRes;
|
return pInfo->pCreateTbRes;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2104,6 +2090,8 @@ FETCH_NEXT_BLOCK:
|
||||||
pBlock->info.dataLoad = 1;
|
pBlock->info.dataLoad = 1;
|
||||||
blockDataUpdateTsWindow(pBlock, pInfo->primaryTsIndex);
|
blockDataUpdateTsWindow(pBlock, pInfo->primaryTsIndex);
|
||||||
|
|
||||||
|
qDebug("%" PRId64 " rows in datablock, update res:%" PRId64 " %s", pBlockInfo->rows,
|
||||||
|
pInfo->pUpdateDataRes->info.rows, id);
|
||||||
if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) {
|
if (pBlockInfo->rows > 0 || pInfo->pUpdateDataRes->info.rows > 0) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -2120,7 +2108,7 @@ FETCH_NEXT_BLOCK:
|
||||||
pInfo->numOfExec++;
|
pInfo->numOfExec++;
|
||||||
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
pOperator->resultInfo.totalRows += pBlockInfo->rows;
|
||||||
|
|
||||||
qDebug("stream scan get source rows:%" PRId64", %s", pBlockInfo->rows, id);
|
qDebug("stream scan completed, and return source rows:%" PRId64", %s", pBlockInfo->rows, id);
|
||||||
if (pBlockInfo->rows > 0) {
|
if (pBlockInfo->rows > 0) {
|
||||||
return pBlock;
|
return pBlock;
|
||||||
}
|
}
|
||||||
|
@ -2306,7 +2294,8 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
|
||||||
SArray* pColIds = NULL;
|
SArray* pColIds = NULL;
|
||||||
SStreamScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamScanInfo));
|
SStreamScanInfo* pInfo = taosMemoryCalloc(1, sizeof(SStreamScanInfo));
|
||||||
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
const char* idstr = pTaskInfo->id.str;
|
||||||
|
|
||||||
if (pInfo == NULL || pOperator == NULL) {
|
if (pInfo == NULL || pOperator == NULL) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
|
@ -2417,7 +2406,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
|
||||||
// set the extract column id to streamHandle
|
// set the extract column id to streamHandle
|
||||||
pAPI->tqReaderFn.tqReaderSetColIdList(pInfo->tqReader, pColIds);
|
pAPI->tqReaderFn.tqReaderSetColIdList(pInfo->tqReader, pColIds);
|
||||||
SArray* tableIdList = extractTableIdList(((STableScanInfo*)(pInfo->pTableScanOp->info))->base.pTableListInfo);
|
SArray* tableIdList = extractTableIdList(((STableScanInfo*)(pInfo->pTableScanOp->info))->base.pTableListInfo);
|
||||||
code = pAPI->tqReaderFn.tqReaderSetQueryTableList(pInfo->tqReader, tableIdList);
|
code = pAPI->tqReaderFn.tqReaderSetQueryTableList(pInfo->tqReader, tableIdList, idstr);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
taosArrayDestroy(tableIdList);
|
taosArrayDestroy(tableIdList);
|
||||||
goto _error;
|
goto _error;
|
||||||
|
@ -2467,6 +2456,7 @@ SOperatorInfo* createStreamScanOperatorInfo(SReadHandle* pHandle, STableScanPhys
|
||||||
int32_t len = 0;
|
int32_t len = 0;
|
||||||
pAPI->stateStore.streamStateGetInfo(pTaskInfo->streamInfo.pState, STREAM_SCAN_OP_NAME, strlen(STREAM_SCAN_OP_NAME), &buff, &len);
|
pAPI->stateStore.streamStateGetInfo(pTaskInfo->streamInfo.pState, STREAM_SCAN_OP_NAME, strlen(STREAM_SCAN_OP_NAME), &buff, &len);
|
||||||
streamScanOperatorDecode(buff, len, pInfo);
|
streamScanOperatorDecode(buff, len, pInfo);
|
||||||
|
taosMemoryFree(buff);
|
||||||
}
|
}
|
||||||
|
|
||||||
setOperatorInfo(pOperator, STREAM_SCAN_OP_NAME, QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN, false, OP_NOT_OPENED, pInfo,
|
setOperatorInfo(pOperator, STREAM_SCAN_OP_NAME, QUERY_NODE_PHYSICAL_PLAN_STREAM_SCAN, false, OP_NOT_OPENED, pInfo,
|
||||||
|
@ -3446,7 +3436,7 @@ static void buildVnodeGroupedNtbTableCount(STableCountScanOperatorInfo* pInfo, S
|
||||||
uint64_t groupId = calcGroupId(fullStbName, strlen(fullStbName));
|
uint64_t groupId = calcGroupId(fullStbName, strlen(fullStbName));
|
||||||
pRes->info.id.groupId = groupId;
|
pRes->info.id.groupId = groupId;
|
||||||
|
|
||||||
int64_t numOfTables = 0;//metaGetNtbNum(pInfo->readHandle.vnode);
|
int64_t numOfTables = 0;
|
||||||
pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, NULL, NULL, NULL, &numOfTables);
|
pAPI->metaFn.getBasicInfo(pInfo->readHandle.vnode, NULL, NULL, NULL, &numOfTables);
|
||||||
|
|
||||||
if (numOfTables != 0) {
|
if (numOfTables != 0) {
|
||||||
|
@ -3481,3 +3471,5 @@ static void destoryTableCountScanOperator(void* param) {
|
||||||
taosArrayDestroy(pTableCountScanInfo->stbUidList);
|
taosArrayDestroy(pTableCountScanInfo->stbUidList);
|
||||||
taosMemoryFreeClear(param);
|
taosMemoryFreeClear(param);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// clang-format on
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "tdatablock.h"
|
#include "tdatablock.h"
|
||||||
#include "tmsg.h"
|
#include "tmsg.h"
|
||||||
|
|
||||||
|
#include "index.h"
|
||||||
#include "operator.h"
|
#include "operator.h"
|
||||||
#include "query.h"
|
#include "query.h"
|
||||||
#include "querytask.h"
|
#include "querytask.h"
|
||||||
|
@ -32,7 +33,6 @@
|
||||||
#include "tcompare.h"
|
#include "tcompare.h"
|
||||||
#include "thash.h"
|
#include "thash.h"
|
||||||
#include "ttypes.h"
|
#include "ttypes.h"
|
||||||
#include "index.h"
|
|
||||||
|
|
||||||
typedef int (*__optSysFilter)(void* a, void* b, int16_t dtype);
|
typedef int (*__optSysFilter)(void* a, void* b, int16_t dtype);
|
||||||
typedef int32_t (*__sys_filte)(void* pMeta, SNode* cond, SArray* result);
|
typedef int32_t (*__sys_filte)(void* pMeta, SNode* cond, SArray* result);
|
||||||
|
@ -540,12 +540,12 @@ static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
int32_t restore = pInfo->restore;
|
int32_t restore = pInfo->restore;
|
||||||
pInfo->restore = false;
|
pInfo->restore = false;
|
||||||
|
|
||||||
while (restore || ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
|
while (restore || ((ret = pAPI->metaFn.cursorNext(pInfo->pCur, TSDB_TABLE_MAX)) == 0)) {
|
||||||
if (restore) {
|
if (restore) {
|
||||||
restore = false;
|
restore = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char typeName[TSDB_TABLE_FNAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
char tableName[TSDB_TABLE_NAME_LEN + VARSTR_HEADER_SIZE] = {0};
|
||||||
|
|
||||||
|
@ -626,8 +626,8 @@ static SSDataBlock* sysTableScanUserCols(SOperatorInfo* pOperator) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
|
static SSDataBlock* sysTableScanUserTags(SOperatorInfo* pOperator) {
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
|
||||||
SSysTableScanInfo* pInfo = pOperator->info;
|
SSysTableScanInfo* pInfo = pOperator->info;
|
||||||
if (pOperator->status == OP_EXEC_DONE) {
|
if (pOperator->status == OP_EXEC_DONE) {
|
||||||
|
@ -1100,8 +1100,8 @@ int32_t buildSysDbTableInfo(const SSysTableScanInfo* pInfo, int32_t capacity) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
|
static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
|
||||||
SSysTableScanInfo* pInfo = pOperator->info;
|
SSysTableScanInfo* pInfo = pOperator->info;
|
||||||
|
|
||||||
|
@ -1288,11 +1288,16 @@ static SSDataBlock* sysTableBuildUserTablesByUids(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
|
static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
int8_t firstMetaCursor = 0;
|
||||||
|
|
||||||
SSysTableScanInfo* pInfo = pOperator->info;
|
SSysTableScanInfo* pInfo = pOperator->info;
|
||||||
if (pInfo->pCur == NULL) {
|
if (pInfo->pCur == NULL) {
|
||||||
pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
|
pInfo->pCur = pAPI->metaFn.openTableMetaCursor(pInfo->readHandle.vnode);
|
||||||
|
firstMetaCursor = 1;
|
||||||
|
}
|
||||||
|
if (!firstMetaCursor) {
|
||||||
|
pAPI->metaFn.resumeTableMetaCursor(pInfo->pCur, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
blockDataCleanup(pInfo->pRes);
|
blockDataCleanup(pInfo->pRes);
|
||||||
|
@ -1436,12 +1441,14 @@ static SSDataBlock* sysTableBuildUserTables(SOperatorInfo* pOperator) {
|
||||||
numOfRows = 0;
|
numOfRows = 0;
|
||||||
|
|
||||||
if (pInfo->pRes->info.rows > 0) {
|
if (pInfo->pRes->info.rows > 0) {
|
||||||
|
pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (numOfRows > 0) {
|
if (numOfRows > 0) {
|
||||||
|
pAPI->metaFn.pauseTableMetaCursor(pInfo->pCur);
|
||||||
p->info.rows = numOfRows;
|
p->info.rows = numOfRows;
|
||||||
pInfo->pRes->info.rows = numOfRows;
|
pInfo->pRes->info.rows = numOfRows;
|
||||||
|
|
||||||
|
@ -1485,7 +1492,8 @@ static SSDataBlock* sysTableScanUserTables(SOperatorInfo* pOperator) {
|
||||||
} else {
|
} else {
|
||||||
if (pInfo->showRewrite == false) {
|
if (pInfo->showRewrite == false) {
|
||||||
if (pCondition != NULL && pInfo->pIdx == NULL) {
|
if (pCondition != NULL && pInfo->pIdx == NULL) {
|
||||||
SSTabFltArg arg = {.pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
|
SSTabFltArg arg = {
|
||||||
|
.pMeta = pInfo->readHandle.vnode, .pVnode = pInfo->readHandle.vnode, .pAPI = &pTaskInfo->storageAPI};
|
||||||
|
|
||||||
SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
|
SSysTableIndex* idx = taosMemoryMalloc(sizeof(SSysTableIndex));
|
||||||
idx->init = 0;
|
idx->init = 0;
|
||||||
|
@ -1827,7 +1835,7 @@ void destroySysScanOperator(void* param) {
|
||||||
pInfo->pIdx = NULL;
|
pInfo->pIdx = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if(pInfo->pSchema) {
|
if (pInfo->pSchema) {
|
||||||
taosHashCleanup(pInfo->pSchema);
|
taosHashCleanup(pInfo->pSchema);
|
||||||
pInfo->pSchema = NULL;
|
pInfo->pSchema = NULL;
|
||||||
}
|
}
|
||||||
|
@ -2144,7 +2152,7 @@ static int32_t optSysTabFilte(void* arg, SNode* cond, SArray* result) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t doGetTableRowSize(SReadHandle *pHandle, uint64_t uid, int32_t* rowLen, const char* idstr) {
|
static int32_t doGetTableRowSize(SReadHandle* pHandle, uint64_t uid, int32_t* rowLen, const char* idstr) {
|
||||||
*rowLen = 0;
|
*rowLen = 0;
|
||||||
|
|
||||||
SMetaReader mr = {0};
|
SMetaReader mr = {0};
|
||||||
|
@ -2194,17 +2202,17 @@ static SSDataBlock* doBlockInfoScan(SOperatorInfo* pOperator) {
|
||||||
|
|
||||||
SBlockDistInfo* pBlockScanInfo = pOperator->info;
|
SBlockDistInfo* pBlockScanInfo = pOperator->info;
|
||||||
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
|
||||||
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
SStorageAPI* pAPI = &pTaskInfo->storageAPI;
|
||||||
|
|
||||||
STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
|
STableBlockDistInfo blockDistInfo = {.minRows = INT_MAX, .maxRows = INT_MIN};
|
||||||
int32_t code = doGetTableRowSize(&pBlockScanInfo->readHandle, pBlockScanInfo->uid,
|
int32_t code = doGetTableRowSize(&pBlockScanInfo->readHandle, pBlockScanInfo->uid, (int32_t*)&blockDistInfo.rowSize,
|
||||||
(int32_t*)&blockDistInfo.rowSize, GET_TASKID(pTaskInfo));
|
GET_TASKID(pTaskInfo));
|
||||||
if (code != TSDB_CODE_SUCCESS) {
|
if (code != TSDB_CODE_SUCCESS) {
|
||||||
T_LONG_JMP(pTaskInfo->env, code);
|
T_LONG_JMP(pTaskInfo->env, code);
|
||||||
}
|
}
|
||||||
|
|
||||||
pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
|
pAPI->tsdReader.tsdReaderGetDataBlockDistInfo(pBlockScanInfo->pHandle, &blockDistInfo);
|
||||||
blockDistInfo.numOfInmemRows = (int32_t) pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pBlockScanInfo->pHandle);
|
blockDistInfo.numOfInmemRows = (int32_t)pAPI->tsdReader.tsdReaderGetNumOfInMemRows(pBlockScanInfo->pHandle);
|
||||||
|
|
||||||
SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
|
SSDataBlock* pBlock = pBlockScanInfo->pResBlock;
|
||||||
|
|
||||||
|
@ -2289,7 +2297,8 @@ SOperatorInfo* createDataBlockInfoScanOperator(SReadHandle* readHandle, SBlockDi
|
||||||
size_t num = tableListGetSize(pTableListInfo);
|
size_t num = tableListGetSize(pTableListInfo);
|
||||||
void* pList = tableListGetInfo(pTableListInfo, 0);
|
void* pList = tableListGetInfo(pTableListInfo, 0);
|
||||||
|
|
||||||
code = readHandle->api.tsdReader.tsdReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock, (void**)&pInfo->pHandle, pTaskInfo->id.str, false, NULL);
|
code = readHandle->api.tsdReader.tsdReaderOpen(readHandle->vnode, &cond, pList, num, pInfo->pResBlock,
|
||||||
|
(void**)&pInfo->pHandle, pTaskInfo->id.str, false, NULL);
|
||||||
cleanupQueryTableDataCond(&cond);
|
cleanupQueryTableDataCond(&cond);
|
||||||
if (code != 0) {
|
if (code != 0) {
|
||||||
goto _error;
|
goto _error;
|
||||||
|
@ -2316,4 +2325,4 @@ _error:
|
||||||
taosMemoryFreeClear(pInfo);
|
taosMemoryFreeClear(pInfo);
|
||||||
taosMemoryFreeClear(pOperator);
|
taosMemoryFreeClear(pOperator);
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue