Merge branch '3.0' of github.com:taosdata/TDengine into szhou/save-op-state
This commit is contained in:
commit
d059aceb08
|
@ -103,6 +103,9 @@ IF (TD_WINDOWS)
|
||||||
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
|
SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${COMMON_FLAGS}")
|
||||||
|
|
||||||
ELSE ()
|
ELSE ()
|
||||||
|
IF (${TD_DARWIN})
|
||||||
|
set(CMAKE_MACOSX_RPATH 0)
|
||||||
|
ENDIF ()
|
||||||
IF (${COVER} MATCHES "true")
|
IF (${COVER} MATCHES "true")
|
||||||
MESSAGE(STATUS "Test coverage mode, add extra flags")
|
MESSAGE(STATUS "Test coverage mode, add extra flags")
|
||||||
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
|
SET(GCC_COVERAGE_COMPILE_FLAGS "-fprofile-arcs -ftest-coverage")
|
||||||
|
|
|
@ -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 2af2222
|
GIT_TAG 833b721
|
||||||
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
|
||||||
|
|
|
@ -10,7 +10,7 @@ One difference from the native connector is that the REST interface is stateless
|
||||||
|
|
||||||
## Installation
|
## Installation
|
||||||
|
|
||||||
The REST interface does not rely on any TDengine native library, so the client application does not need to install any TDengine libraries. The client application's development language only needs to support the HTTP protocol.
|
The REST interface does not rely on any TDengine native library, so the client application does not need to install any TDengine libraries. The client application's development language only needs to support the HTTP protocol. The REST interface is provided by [taosAdapter](../taosadapter), to use REST interface you need to make sure `taosAdapter` is running properly.
|
||||||
|
|
||||||
## Verification
|
## Verification
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 1
|
|
||||||
sidebar_label: C/C++
|
sidebar_label: C/C++
|
||||||
title: C/C++ Connector
|
title: C/C++ Connector
|
||||||
---
|
---
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 2
|
|
||||||
sidebar_label: Java
|
sidebar_label: Java
|
||||||
title: TDengine Java Connector
|
title: TDengine Java Connector
|
||||||
description: The TDengine Java Connector is implemented on the standard JDBC API and provides native and REST connectors.
|
description: The TDengine Java Connector is implemented on the standard JDBC API and provides native and REST connectors.
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 4
|
|
||||||
sidebar_label: Go
|
sidebar_label: Go
|
||||||
title: TDengine Go Connector
|
title: TDengine Go Connector
|
||||||
---
|
---
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 5
|
|
||||||
sidebar_label: Rust
|
sidebar_label: Rust
|
||||||
title: TDengine Rust Connector
|
title: TDengine Rust Connector
|
||||||
---
|
---
|
|
@ -1,5 +1,4 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 3
|
|
||||||
sidebar_label: Python
|
sidebar_label: Python
|
||||||
title: TDengine Python Connector
|
title: TDengine Python Connector
|
||||||
description: "taospy is the official Python connector for TDengine. taospy provides a rich API that makes it easy for Python applications to use TDengine. tasopy wraps both the native and REST interfaces of TDengine, corresponding to the two submodules of tasopy: taos and taosrest. In addition to wrapping the native and REST interfaces, taospy also provides a programming interface that conforms to the Python Data Access Specification (PEP 249), making it easy to integrate taospy with many third-party tools, such as SQLAlchemy and pandas."
|
description: "taospy is the official Python connector for TDengine. taospy provides a rich API that makes it easy for Python applications to use TDengine. tasopy wraps both the native and REST interfaces of TDengine, corresponding to the two submodules of tasopy: taos and taosrest. In addition to wrapping the native and REST interfaces, taospy also provides a programming interface that conforms to the Python Data Access Specification (PEP 249), making it easy to integrate taospy with many third-party tools, such as SQLAlchemy and pandas."
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 6
|
|
||||||
sidebar_label: Node.js
|
sidebar_label: Node.js
|
||||||
title: TDengine Node.js Connector
|
title: TDengine Node.js Connector
|
||||||
---
|
---
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 7
|
|
||||||
sidebar_label: C#
|
sidebar_label: C#
|
||||||
title: C# Connector
|
title: C# Connector
|
||||||
---
|
---
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 1
|
sidebar_label: PHP
|
||||||
sidebar_label: PHP (community contribution)
|
|
||||||
title: PHP Connector
|
title: PHP Connector
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
---
|
---
|
||||||
title: REST API
|
title: REST API
|
||||||
|
sidebar_label: REST API
|
||||||
|
description: 详细介绍 TDengine 提供的 RESTful API.
|
||||||
---
|
---
|
||||||
|
|
||||||
为支持各种不同类型平台的开发,TDengine 提供符合 REST 设计标准的 API,即 REST API。为最大程度降低学习成本,不同于其他数据库 REST API 的设计方法,TDengine 直接通过 HTTP POST 请求 BODY 中包含的 SQL 语句来操作数据库,仅需要一个 URL。REST 连接器的使用参见 [视频教程](https://www.taosdata.com/blog/2020/11/11/1965.html)。
|
为支持各种不同类型平台的开发,TDengine 提供符合 REST 设计标准的 API,即 REST API。为最大程度降低学习成本,不同于其他数据库 REST API 的设计方法,TDengine 直接通过 HTTP POST 请求 BODY 中包含的 SQL 语句来操作数据库,仅需要一个 URL。REST 连接器的使用参见 [视频教程](https://www.taosdata.com/blog/2020/11/11/1965.html)。
|
||||||
|
@ -10,7 +12,7 @@ title: REST API
|
||||||
|
|
||||||
## 安装
|
## 安装
|
||||||
|
|
||||||
RESTful 接口不依赖于任何 TDengine 的库,因此客户端不需要安装任何 TDengine 的库,只要客户端的开发语言支持 HTTP 协议即可。
|
RESTful 接口不依赖于任何 TDengine 的库,因此客户端不需要安装任何 TDengine 的库,只要客户端的开发语言支持 HTTP 协议即可。TDengine 的 RESTful API 由 [taosAdapter](../../reference/taosadapter) 提供,在使用 RESTful API 之前需要确保 `taosAdapter` 正常运行。
|
||||||
|
|
||||||
## 验证
|
## 验证
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 1
|
|
||||||
sidebar_label: C/C++
|
sidebar_label: C/C++
|
||||||
title: C/C++ Connector
|
title: C/C++ Connector
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 2
|
|
||||||
sidebar_label: Java
|
sidebar_label: Java
|
||||||
title: TDengine Java Connector
|
title: TDengine Java Connector
|
||||||
description: TDengine Java 连接器基于标准 JDBC API 实现, 并提供原生连接与 REST连接两种连接器。
|
description: TDengine Java 连接器基于标准 JDBC API 实现, 并提供原生连接与 REST连接两种连接器。
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 5
|
|
||||||
sidebar_label: Rust
|
sidebar_label: Rust
|
||||||
title: TDengine Rust Connector
|
title: TDengine Rust Connector
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 3
|
|
||||||
sidebar_label: Python
|
sidebar_label: Python
|
||||||
title: TDengine Python Connector
|
title: TDengine Python Connector
|
||||||
description: "taospy 是 TDengine 的官方 Python 连接器。taospy 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。tasopy 对 TDengine 的原生接口和 REST 接口都进行了封装, 分别对应 tasopy 的两个子模块:tasos 和 taosrest。除了对原生接口和 REST 接口的封装,taospy 还提供了符合 Python 数据访问规范(PEP 249)的编程接口。这使得 taospy 和很多第三方工具集成变得简单,比如 SQLAlchemy 和 pandas"
|
description: "taospy 是 TDengine 的官方 Python 连接器。taospy 提供了丰富的 API, 使得 Python 应用可以很方便地使用 TDengine。tasopy 对 TDengine 的原生接口和 REST 接口都进行了封装, 分别对应 tasopy 的两个子模块:tasos 和 taosrest。除了对原生接口和 REST 接口的封装,taospy 还提供了符合 Python 数据访问规范(PEP 249)的编程接口。这使得 taospy 和很多第三方工具集成变得简单,比如 SQLAlchemy 和 pandas"
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 6
|
|
||||||
sidebar_label: Node.js
|
sidebar_label: Node.js
|
||||||
title: TDengine Node.js Connector
|
title: TDengine Node.js Connector
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
toc_max_heading_level: 4
|
toc_max_heading_level: 4
|
||||||
sidebar_position: 7
|
|
||||||
sidebar_label: C#
|
sidebar_label: C#
|
||||||
title: C# Connector
|
title: C# Connector
|
||||||
---
|
---
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
---
|
---
|
||||||
sidebar_position: 1
|
sidebar_label: PHP
|
||||||
sidebar_label: PHP(社区贡献)
|
|
||||||
title: PHP Connector
|
title: PHP Connector
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
|
@ -698,122 +698,123 @@ charset 的有效值是 UTF-8。
|
||||||
| 45 | numOfVnodeFetchThreads | 否 | 是 |
|
| 45 | numOfVnodeFetchThreads | 否 | 是 |
|
||||||
| 46 | numOfVnodeWriteThreads | 否 | 是 |
|
| 46 | numOfVnodeWriteThreads | 否 | 是 |
|
||||||
| 47 | numOfVnodeSyncThreads | 否 | 是 |
|
| 47 | numOfVnodeSyncThreads | 否 | 是 |
|
||||||
| 48 | numOfQnodeQueryThreads | 否 | 是 |
|
| 48 | numOfVnodeRsmaThreads | 否 | 是 |
|
||||||
| 49 | numOfQnodeFetchThreads | 否 | 是 |
|
| 49 | numOfQnodeQueryThreads | 否 | 是 |
|
||||||
| 50 | numOfSnodeSharedThreads | 否 | 是 |
|
| 50 | numOfQnodeFetchThreads | 否 | 是 |
|
||||||
| 51 | numOfSnodeUniqueThreads | 否 | 是 |
|
| 51 | numOfSnodeSharedThreads | 否 | 是 |
|
||||||
| 52 | rpcQueueMemoryAllowed | 否 | 是 |
|
| 52 | numOfSnodeUniqueThreads | 否 | 是 |
|
||||||
| 53 | logDir | 是 | 是 |
|
| 53 | rpcQueueMemoryAllowed | 否 | 是 |
|
||||||
| 54 | minimalLogDirGB | 是 | 是 |
|
| 54 | logDir | 是 | 是 |
|
||||||
| 55 | numOfLogLines | 是 | 是 |
|
| 55 | minimalLogDirGB | 是 | 是 |
|
||||||
| 56 | asyncLog | 是 | 是 |
|
| 56 | numOfLogLines | 是 | 是 |
|
||||||
| 57 | logKeepDays | 是 | 是 |
|
| 57 | asyncLog | 是 | 是 |
|
||||||
| 58 | debugFlag | 是 | 是 |
|
| 58 | logKeepDays | 是 | 是 |
|
||||||
| 59 | tmrDebugFlag | 是 | 是 |
|
| 59 | debugFlag | 是 | 是 |
|
||||||
| 60 | uDebugFlag | 是 | 是 |
|
| 60 | tmrDebugFlag | 是 | 是 |
|
||||||
| 61 | rpcDebugFlag | 是 | 是 |
|
| 61 | uDebugFlag | 是 | 是 |
|
||||||
| 62 | jniDebugFlag | 是 | 是 |
|
| 62 | rpcDebugFlag | 是 | 是 |
|
||||||
| 63 | qDebugFlag | 是 | 是 |
|
| 63 | jniDebugFlag | 是 | 是 |
|
||||||
| 64 | cDebugFlag | 是 | 是 |
|
| 64 | qDebugFlag | 是 | 是 |
|
||||||
| 65 | dDebugFlag | 是 | 是 |
|
| 65 | cDebugFlag | 是 | 是 |
|
||||||
| 66 | vDebugFlag | 是 | 是 |
|
| 66 | dDebugFlag | 是 | 是 |
|
||||||
| 67 | mDebugFlag | 是 | 是 |
|
| 67 | vDebugFlag | 是 | 是 |
|
||||||
| 68 | wDebugFlag | 是 | 是 |
|
| 68 | mDebugFlag | 是 | 是 |
|
||||||
| 69 | sDebugFlag | 是 | 是 |
|
| 69 | wDebugFlag | 是 | 是 |
|
||||||
| 70 | tsdbDebugFlag | 是 | 是 |
|
| 70 | sDebugFlag | 是 | 是 |
|
||||||
| 71 | tqDebugFlag | 否 | 是 |
|
| 71 | tsdbDebugFlag | 是 | 是 |
|
||||||
| 72 | fsDebugFlag | 是 | 是 |
|
| 72 | tqDebugFlag | 否 | 是 |
|
||||||
| 73 | udfDebugFlag | 否 | 是 |
|
| 73 | fsDebugFlag | 是 | 是 |
|
||||||
| 74 | smaDebugFlag | 否 | 是 |
|
| 74 | udfDebugFlag | 否 | 是 |
|
||||||
| 75 | idxDebugFlag | 否 | 是 |
|
| 75 | smaDebugFlag | 否 | 是 |
|
||||||
| 76 | tdbDebugFlag | 否 | 是 |
|
| 76 | idxDebugFlag | 否 | 是 |
|
||||||
| 77 | metaDebugFlag | 否 | 是 |
|
| 77 | tdbDebugFlag | 否 | 是 |
|
||||||
| 78 | timezone | 是 | 是 |
|
| 78 | metaDebugFlag | 否 | 是 |
|
||||||
| 79 | locale | 是 | 是 |
|
| 79 | timezone | 是 | 是 |
|
||||||
| 80 | charset | 是 | 是 |
|
| 80 | locale | 是 | 是 |
|
||||||
| 81 | udf | 是 | 是 |
|
| 81 | charset | 是 | 是 |
|
||||||
| 82 | enableCoreFile | 是 | 是 |
|
| 82 | udf | 是 | 是 |
|
||||||
| 83 | arbitrator | 是 | 否 |
|
| 83 | enableCoreFile | 是 | 是 |
|
||||||
| 84 | numOfThreadsPerCore | 是 | 否 |
|
| 84 | arbitrator | 是 | 否 |
|
||||||
| 85 | numOfMnodes | 是 | 否 |
|
| 85 | numOfThreadsPerCore | 是 | 否 |
|
||||||
| 86 | vnodeBak | 是 | 否 |
|
| 86 | numOfMnodes | 是 | 否 |
|
||||||
| 87 | balance | 是 | 否 |
|
| 87 | vnodeBak | 是 | 否 |
|
||||||
| 88 | balanceInterval | 是 | 否 |
|
| 88 | balance | 是 | 否 |
|
||||||
| 89 | offlineThreshold | 是 | 否 |
|
| 89 | balanceInterval | 是 | 否 |
|
||||||
| 90 | role | 是 | 否 |
|
| 90 | offlineThreshold | 是 | 否 |
|
||||||
| 91 | dnodeNopLoop | 是 | 否 |
|
| 91 | role | 是 | 否 |
|
||||||
| 92 | keepTimeOffset | 是 | 否 |
|
| 92 | dnodeNopLoop | 是 | 否 |
|
||||||
| 93 | rpcTimer | 是 | 否 |
|
| 93 | keepTimeOffset | 是 | 否 |
|
||||||
| 94 | rpcMaxTime | 是 | 否 |
|
| 94 | rpcTimer | 是 | 否 |
|
||||||
| 95 | rpcForceTcp | 是 | 否 |
|
| 95 | rpcMaxTime | 是 | 否 |
|
||||||
| 96 | tcpConnTimeout | 是 | 否 |
|
| 96 | rpcForceTcp | 是 | 否 |
|
||||||
| 97 | syncCheckInterval | 是 | 否 |
|
| 97 | tcpConnTimeout | 是 | 否 |
|
||||||
| 98 | maxTmrCtrl | 是 | 否 |
|
| 98 | syncCheckInterval | 是 | 否 |
|
||||||
| 99 | monitorReplica | 是 | 否 |
|
| 99 | maxTmrCtrl | 是 | 否 |
|
||||||
| 100 | smlTagNullName | 是 | 否 |
|
| 100 | monitorReplica | 是 | 否 |
|
||||||
| 101 | keepColumnName | 是 | 否 |
|
| 101 | smlTagNullName | 是 | 否 |
|
||||||
| 102 | ratioOfQueryCores | 是 | 否 |
|
| 102 | keepColumnName | 是 | 否 |
|
||||||
| 103 | maxStreamCompDelay | 是 | 否 |
|
| 103 | ratioOfQueryCores | 是 | 否 |
|
||||||
| 104 | maxFirstStreamCompDelay | 是 | 否 |
|
| 104 | maxStreamCompDelay | 是 | 否 |
|
||||||
| 105 | retryStreamCompDelay | 是 | 否 |
|
| 105 | maxFirstStreamCompDelay | 是 | 否 |
|
||||||
| 106 | streamCompDelayRatio | 是 | 否 |
|
| 106 | retryStreamCompDelay | 是 | 否 |
|
||||||
| 107 | maxVgroupsPerDb | 是 | 否 |
|
| 107 | streamCompDelayRatio | 是 | 否 |
|
||||||
| 108 | maxTablesPerVnode | 是 | 否 |
|
| 108 | maxVgroupsPerDb | 是 | 否 |
|
||||||
| 109 | minTablesPerVnode | 是 | 否 |
|
| 109 | maxTablesPerVnode | 是 | 否 |
|
||||||
| 110 | tableIncStepPerVnode | 是 | 否 |
|
| 110 | minTablesPerVnode | 是 | 否 |
|
||||||
| 111 | cache | 是 | 否 |
|
| 111 | tableIncStepPerVnode | 是 | 否 |
|
||||||
| 112 | blocks | 是 | 否 |
|
| 112 | cache | 是 | 否 |
|
||||||
| 113 | days | 是 | 否 |
|
| 113 | blocks | 是 | 否 |
|
||||||
| 114 | keep | 是 | 否 |
|
| 114 | days | 是 | 否 |
|
||||||
| 115 | minRows | 是 | 否 |
|
| 115 | keep | 是 | 否 |
|
||||||
| 116 | maxRows | 是 | 否 |
|
| 116 | minRows | 是 | 否 |
|
||||||
| 117 | quorum | 是 | 否 |
|
| 117 | maxRows | 是 | 否 |
|
||||||
| 118 | comp | 是 | 否 |
|
| 118 | quorum | 是 | 否 |
|
||||||
| 119 | walLevel | 是 | 否 |
|
| 119 | comp | 是 | 否 |
|
||||||
| 120 | fsync | 是 | 否 |
|
| 120 | walLevel | 是 | 否 |
|
||||||
| 121 | replica | 是 | 否 |
|
| 121 | fsync | 是 | 否 |
|
||||||
| 122 | partitions | 是 | 否 |
|
| 122 | replica | 是 | 否 |
|
||||||
| 123 | quorum | 是 | 否 |
|
| 123 | partitions | 是 | 否 |
|
||||||
| 124 | update | 是 | 否 |
|
| 124 | quorum | 是 | 否 |
|
||||||
| 125 | cachelast | 是 | 否 |
|
| 125 | update | 是 | 否 |
|
||||||
| 126 | maxSQLLength | 是 | 否 |
|
| 126 | cachelast | 是 | 否 |
|
||||||
| 127 | maxWildCardsLength | 是 | 否 |
|
| 127 | maxSQLLength | 是 | 否 |
|
||||||
| 128 | maxRegexStringLen | 是 | 否 |
|
| 128 | maxWildCardsLength | 是 | 否 |
|
||||||
| 129 | maxNumOfOrderedRes | 是 | 否 |
|
| 129 | maxRegexStringLen | 是 | 否 |
|
||||||
| 130 | maxConnections | 是 | 否 |
|
| 130 | maxNumOfOrderedRes | 是 | 否 |
|
||||||
| 131 | mnodeEqualVnodeNum | 是 | 否 |
|
| 131 | maxConnections | 是 | 否 |
|
||||||
| 132 | http | 是 | 否 |
|
| 132 | mnodeEqualVnodeNum | 是 | 否 |
|
||||||
| 133 | httpEnableRecordSql | 是 | 否 |
|
| 133 | http | 是 | 否 |
|
||||||
| 134 | httpMaxThreads | 是 | 否 |
|
| 134 | httpEnableRecordSql | 是 | 否 |
|
||||||
| 135 | restfulRowLimit | 是 | 否 |
|
| 135 | httpMaxThreads | 是 | 否 |
|
||||||
| 136 | httpDbNameMandatory | 是 | 否 |
|
| 136 | restfulRowLimit | 是 | 否 |
|
||||||
| 137 | httpKeepAlive | 是 | 否 |
|
| 137 | httpDbNameMandatory | 是 | 否 |
|
||||||
| 138 | enableRecordSql | 是 | 否 |
|
| 138 | httpKeepAlive | 是 | 否 |
|
||||||
| 139 | maxBinaryDisplayWidth | 是 | 否 |
|
| 139 | enableRecordSql | 是 | 否 |
|
||||||
| 140 | stream | 是 | 否 |
|
| 140 | maxBinaryDisplayWidth | 是 | 否 |
|
||||||
| 141 | retrieveBlockingModel | 是 | 否 |
|
| 141 | stream | 是 | 否 |
|
||||||
| 142 | tsdbMetaCompactRatio | 是 | 否 |
|
| 142 | retrieveBlockingModel | 是 | 否 |
|
||||||
| 143 | defaultJSONStrType | 是 | 否 |
|
| 143 | tsdbMetaCompactRatio | 是 | 否 |
|
||||||
| 144 | walFlushSize | 是 | 否 |
|
| 144 | defaultJSONStrType | 是 | 否 |
|
||||||
| 145 | keepTimeOffset | 是 | 否 |
|
| 145 | walFlushSize | 是 | 否 |
|
||||||
| 146 | flowctrl | 是 | 否 |
|
| 146 | keepTimeOffset | 是 | 否 |
|
||||||
| 147 | slaveQuery | 是 | 否 |
|
| 147 | flowctrl | 是 | 否 |
|
||||||
| 148 | adjustMaster | 是 | 否 |
|
| 148 | slaveQuery | 是 | 否 |
|
||||||
| 149 | topicBinaryLen | 是 | 否 |
|
| 149 | adjustMaster | 是 | 否 |
|
||||||
| 150 | telegrafUseFieldNum | 是 | 否 |
|
| 150 | topicBinaryLen | 是 | 否 |
|
||||||
| 151 | deadLockKillQuery | 是 | 否 |
|
| 151 | telegrafUseFieldNum | 是 | 否 |
|
||||||
| 152 | clientMerge | 是 | 否 |
|
| 152 | deadLockKillQuery | 是 | 否 |
|
||||||
| 153 | sdbDebugFlag | 是 | 否 |
|
| 153 | clientMerge | 是 | 否 |
|
||||||
| 154 | odbcDebugFlag | 是 | 否 |
|
| 154 | sdbDebugFlag | 是 | 否 |
|
||||||
| 155 | httpDebugFlag | 是 | 否 |
|
| 155 | odbcDebugFlag | 是 | 否 |
|
||||||
| 156 | monDebugFlag | 是 | 否 |
|
| 156 | httpDebugFlag | 是 | 否 |
|
||||||
| 157 | cqDebugFlag | 是 | 否 |
|
| 157 | monDebugFlag | 是 | 否 |
|
||||||
| 158 | shortcutFlag | 是 | 否 |
|
| 158 | cqDebugFlag | 是 | 否 |
|
||||||
| 159 | probeSeconds | 是 | 否 |
|
| 159 | shortcutFlag | 是 | 否 |
|
||||||
| 160 | probeKillSeconds | 是 | 否 |
|
| 160 | probeSeconds | 是 | 否 |
|
||||||
| 161 | probeInterval | 是 | 否 |
|
| 161 | probeKillSeconds | 是 | 否 |
|
||||||
| 162 | lossyColumns | 是 | 否 |
|
| 162 | probeInterval | 是 | 否 |
|
||||||
| 163 | fPrecision | 是 | 否 |
|
| 163 | lossyColumns | 是 | 否 |
|
||||||
| 164 | dPrecision | 是 | 否 |
|
| 164 | fPrecision | 是 | 否 |
|
||||||
| 165 | maxRange | 是 | 否 |
|
| 165 | dPrecision | 是 | 否 |
|
||||||
| 166 | range | 是 | 否 |
|
| 166 | maxRange | 是 | 否 |
|
||||||
|
| 167 | range | 是 | 否 |
|
||||||
|
|
|
@ -66,6 +66,7 @@ extern int32_t tsNumOfVnodeStreamThreads;
|
||||||
extern int32_t tsNumOfVnodeFetchThreads;
|
extern int32_t tsNumOfVnodeFetchThreads;
|
||||||
extern int32_t tsNumOfVnodeWriteThreads;
|
extern int32_t tsNumOfVnodeWriteThreads;
|
||||||
extern int32_t tsNumOfVnodeSyncThreads;
|
extern int32_t tsNumOfVnodeSyncThreads;
|
||||||
|
extern int32_t tsNumOfVnodeRsmaThreads;
|
||||||
extern int32_t tsNumOfQnodeQueryThreads;
|
extern int32_t tsNumOfQnodeQueryThreads;
|
||||||
extern int32_t tsNumOfQnodeFetchThreads;
|
extern int32_t tsNumOfQnodeFetchThreads;
|
||||||
extern int32_t tsNumOfSnodeSharedThreads;
|
extern int32_t tsNumOfSnodeSharedThreads;
|
||||||
|
|
|
@ -40,10 +40,12 @@ if not exist %work_dir%\debug\ver-%2-x86 (
|
||||||
)
|
)
|
||||||
cd %work_dir%\debug\ver-%2-x64
|
cd %work_dir%\debug\ver-%2-x64
|
||||||
call vcvarsall.bat x64
|
call vcvarsall.bat x64
|
||||||
cmake ../../ -G "NMake Makefiles JOM" -DCMAKE_MAKE_PROGRAM=jom -DBUILD_TOOLS=true -DBUILD_HTTP=false -DVERNUMBER=%2 -DCPUTYPE=x64
|
cmake ../../ -G "NMake Makefiles JOM" -DCMAKE_MAKE_PROGRAM=jom -DBUILD_TOOLS=true -DBUILD_HTTP=false -DBUILD_TEST=false -DVERNUMBER=%2 -DCPUTYPE=x64
|
||||||
cmake --build .
|
cmake --build .
|
||||||
rd /s /Q C:\TDengine
|
rd /s /Q C:\TDengine
|
||||||
cmake --install .
|
cmake --install .
|
||||||
|
for /r c:\TDengine %%i in (*.dll) do signtool sign /f D:\\123.pfx /p taosdata %%i
|
||||||
|
for /r c:\TDengine %%i in (*.exe) do signtool sign /f D:\\123.pfx /p taosdata %%i
|
||||||
if not %errorlevel% == 0 ( call :RUNFAILED build x64 failed & exit /b 1)
|
if not %errorlevel% == 0 ( call :RUNFAILED build x64 failed & exit /b 1)
|
||||||
cd %package_dir%
|
cd %package_dir%
|
||||||
iscc /DMyAppInstallName="%packagServerName_x64%" /DMyAppVersion="%2" /DMyAppExcludeSource="" tools\tdengine.iss /O..\release
|
iscc /DMyAppInstallName="%packagServerName_x64%" /DMyAppVersion="%2" /DMyAppExcludeSource="" tools\tdengine.iss /O..\release
|
||||||
|
@ -51,19 +53,7 @@ if not %errorlevel% == 0 ( call :RUNFAILED package %packagServerName_x64% faile
|
||||||
iscc /DMyAppInstallName="%packagClientName_x64%" /DMyAppVersion="%2" /DMyAppExcludeSource="taosd.exe" tools\tdengine.iss /O..\release
|
iscc /DMyAppInstallName="%packagClientName_x64%" /DMyAppVersion="%2" /DMyAppExcludeSource="taosd.exe" tools\tdengine.iss /O..\release
|
||||||
if not %errorlevel% == 0 ( call :RUNFAILED package %packagClientName_x64% failed & exit /b 1)
|
if not %errorlevel% == 0 ( call :RUNFAILED package %packagClientName_x64% failed & exit /b 1)
|
||||||
|
|
||||||
cd %work_dir%\debug\ver-%2-x86
|
for /r ..\release %%i in (*.exe) do signtool sign /f d:\\123.pfx /p taosdata %%i
|
||||||
call vcvarsall.bat x86
|
|
||||||
cmake ../../ -G "NMake Makefiles JOM" -DCMAKE_MAKE_PROGRAM=jom -DBUILD_TOOLS=true -DBUILD_HTTP=false -DVERNUMBER=%2 -DCPUTYPE=x86
|
|
||||||
cmake --build .
|
|
||||||
rd /s /Q C:\TDengine
|
|
||||||
cmake --install .
|
|
||||||
if not %errorlevel% == 0 ( call :RUNFAILED build x86 failed & exit /b 1)
|
|
||||||
cd %package_dir%
|
|
||||||
@REM iscc /DMyAppInstallName="%packagServerName_x86%" /DMyAppVersion="%2" /DMyAppExcludeSource="" tools\tdengine.iss /O..\release
|
|
||||||
@REM if not %errorlevel% == 0 ( call :RUNFAILED package %packagServerName_x86% failed & exit /b 1)
|
|
||||||
iscc /DMyAppInstallName="%packagClientName_x86%" /DMyAppVersion="%2" /DMyAppExcludeSource="taosd.exe" tools\tdengine.iss /O..\release
|
|
||||||
if not %errorlevel% == 0 ( call :RUNFAILED package %packagClientName_x86% failed & exit /b 1)
|
|
||||||
|
|
||||||
goto EXIT0
|
goto EXIT0
|
||||||
|
|
||||||
:USAGE
|
:USAGE
|
||||||
|
|
|
@ -404,7 +404,9 @@ void taos_init_imp(void) {
|
||||||
schedulerInit();
|
schedulerInit();
|
||||||
tscDebug("starting to initialize TAOS driver");
|
tscDebug("starting to initialize TAOS driver");
|
||||||
|
|
||||||
|
#ifndef WINDOWS
|
||||||
taosSetCoreDump(true);
|
taosSetCoreDump(true);
|
||||||
|
#endif
|
||||||
|
|
||||||
initTaskQueue();
|
initTaskQueue();
|
||||||
fmFuncMgtInit();
|
fmFuncMgtInit();
|
||||||
|
|
|
@ -61,6 +61,7 @@ int32_t tsNumOfVnodeStreamThreads = 2;
|
||||||
int32_t tsNumOfVnodeFetchThreads = 4;
|
int32_t tsNumOfVnodeFetchThreads = 4;
|
||||||
int32_t tsNumOfVnodeWriteThreads = 2;
|
int32_t tsNumOfVnodeWriteThreads = 2;
|
||||||
int32_t tsNumOfVnodeSyncThreads = 2;
|
int32_t tsNumOfVnodeSyncThreads = 2;
|
||||||
|
int32_t tsNumOfVnodeRsmaThreads = 2;
|
||||||
int32_t tsNumOfQnodeQueryThreads = 4;
|
int32_t tsNumOfQnodeQueryThreads = 4;
|
||||||
int32_t tsNumOfQnodeFetchThreads = 4;
|
int32_t tsNumOfQnodeFetchThreads = 4;
|
||||||
int32_t tsNumOfSnodeSharedThreads = 2;
|
int32_t tsNumOfSnodeSharedThreads = 2;
|
||||||
|
@ -378,6 +379,10 @@ static int32_t taosAddServerCfg(SConfig *pCfg) {
|
||||||
tsNumOfVnodeSyncThreads = TMAX(tsNumOfVnodeSyncThreads, 16);
|
tsNumOfVnodeSyncThreads = TMAX(tsNumOfVnodeSyncThreads, 16);
|
||||||
if (cfgAddInt32(pCfg, "numOfVnodeSyncThreads", tsNumOfVnodeSyncThreads, 1, 1024, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "numOfVnodeSyncThreads", tsNumOfVnodeSyncThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
|
tsNumOfVnodeRsmaThreads = tsNumOfCores;
|
||||||
|
tsNumOfVnodeRsmaThreads = TMAX(tsNumOfVnodeRsmaThreads, 4);
|
||||||
|
if (cfgAddInt32(pCfg, "numOfVnodeRsmaThreads", tsNumOfVnodeRsmaThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
|
||||||
tsNumOfQnodeQueryThreads = tsNumOfCores * 2;
|
tsNumOfQnodeQueryThreads = tsNumOfCores * 2;
|
||||||
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 4);
|
tsNumOfQnodeQueryThreads = TMAX(tsNumOfQnodeQueryThreads, 4);
|
||||||
if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 1, 1024, 0) != 0) return -1;
|
if (cfgAddInt32(pCfg, "numOfQnodeQueryThreads", tsNumOfQnodeQueryThreads, 1, 1024, 0) != 0) return -1;
|
||||||
|
@ -539,6 +544,7 @@ static int32_t taosSetServerCfg(SConfig *pCfg) {
|
||||||
tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32;
|
tsNumOfVnodeFetchThreads = cfgGetItem(pCfg, "numOfVnodeFetchThreads")->i32;
|
||||||
tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32;
|
tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32;
|
||||||
tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32;
|
tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32;
|
||||||
|
tsNumOfVnodeRsmaThreads = cfgGetItem(pCfg, "numOfVnodeRsmaThreads")->i32;
|
||||||
tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32;
|
tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32;
|
||||||
tsNumOfQnodeFetchThreads = cfgGetItem(pCfg, "numOfQnodeFetchThreads")->i32;
|
tsNumOfQnodeFetchThreads = cfgGetItem(pCfg, "numOfQnodeFetchThreads")->i32;
|
||||||
tsNumOfSnodeSharedThreads = cfgGetItem(pCfg, "numOfSnodeSharedThreads")->i32;
|
tsNumOfSnodeSharedThreads = cfgGetItem(pCfg, "numOfSnodeSharedThreads")->i32;
|
||||||
|
@ -783,6 +789,8 @@ int32_t taosSetCfg(SConfig *pCfg, char *name) {
|
||||||
tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32;
|
tsNumOfVnodeWriteThreads = cfgGetItem(pCfg, "numOfVnodeWriteThreads")->i32;
|
||||||
} else if (strcasecmp("numOfVnodeSyncThreads", name) == 0) {
|
} else if (strcasecmp("numOfVnodeSyncThreads", name) == 0) {
|
||||||
tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32;
|
tsNumOfVnodeSyncThreads = cfgGetItem(pCfg, "numOfVnodeSyncThreads")->i32;
|
||||||
|
} else if (strcasecmp("numOfVnodeRsmaThreads", name) == 0) {
|
||||||
|
tsNumOfVnodeRsmaThreads = cfgGetItem(pCfg, "numOfVnodeRsmaThreads")->i32;
|
||||||
} else if (strcasecmp("numOfQnodeQueryThreads", name) == 0) {
|
} else if (strcasecmp("numOfQnodeQueryThreads", name) == 0) {
|
||||||
tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32;
|
tsNumOfQnodeQueryThreads = cfgGetItem(pCfg, "numOfQnodeQueryThreads")->i32;
|
||||||
} else if (strcasecmp("numOfQnodeFetchThreads", name) == 0) {
|
} else if (strcasecmp("numOfQnodeFetchThreads", name) == 0) {
|
||||||
|
|
|
@ -33,7 +33,6 @@ extern "C" {
|
||||||
// clang-format on
|
// clang-format on
|
||||||
|
|
||||||
#define RSMA_TASK_INFO_HASH_SLOT (8)
|
#define RSMA_TASK_INFO_HASH_SLOT (8)
|
||||||
#define RSMA_EXECUTOR_MAX (1)
|
|
||||||
|
|
||||||
typedef struct SSmaEnv SSmaEnv;
|
typedef struct SSmaEnv SSmaEnv;
|
||||||
typedef struct SSmaStat SSmaStat;
|
typedef struct SSmaStat SSmaStat;
|
||||||
|
@ -49,9 +48,12 @@ typedef struct SQTaskFWriter SQTaskFWriter;
|
||||||
struct SSmaEnv {
|
struct SSmaEnv {
|
||||||
SRWLatch lock;
|
SRWLatch lock;
|
||||||
int8_t type;
|
int8_t type;
|
||||||
|
int8_t flag; // 0x01 inClose
|
||||||
SSmaStat *pStat;
|
SSmaStat *pStat;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#define SMA_ENV_FLG_CLOSE ((int8_t)0x1)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int8_t inited;
|
int8_t inited;
|
||||||
int32_t rsetId;
|
int32_t rsetId;
|
||||||
|
@ -93,7 +95,6 @@ struct SRSmaStat {
|
||||||
int64_t refId; // shared by fetch tasks
|
int64_t refId; // shared by fetch tasks
|
||||||
volatile int64_t nBufItems; // number of items in queue buffer
|
volatile int64_t nBufItems; // number of items in queue buffer
|
||||||
SRWLatch lock; // r/w lock for rsma fs(e.g. qtaskinfo)
|
SRWLatch lock; // r/w lock for rsma fs(e.g. qtaskinfo)
|
||||||
volatile int8_t nExecutor; // [1, max(half of query threads, 4)]
|
|
||||||
int8_t triggerStat; // shared by fetch tasks
|
int8_t triggerStat; // shared by fetch tasks
|
||||||
int8_t commitStat; // 0 not in committing, 1 in committing
|
int8_t commitStat; // 0 not in committing, 1 in committing
|
||||||
SArray *aTaskFile; // qTaskFiles committed recently(for recovery/snapshot r/w)
|
SArray *aTaskFile; // qTaskFiles committed recently(for recovery/snapshot r/w)
|
||||||
|
@ -107,6 +108,7 @@ struct SSmaStat {
|
||||||
SRSmaStat rsmaStat; // rollup sma
|
SRSmaStat rsmaStat; // rollup sma
|
||||||
};
|
};
|
||||||
T_REF_DECLARE()
|
T_REF_DECLARE()
|
||||||
|
char data[];
|
||||||
};
|
};
|
||||||
|
|
||||||
#define SMA_STAT_TSMA(s) (&(s)->tsmaStat)
|
#define SMA_STAT_TSMA(s) (&(s)->tsmaStat)
|
||||||
|
|
|
@ -189,7 +189,6 @@ SSubmitReq* tqBlockToSubmit(SVnode* pVnode, const SArray* pBlocks, const STSchem
|
||||||
int32_t smaInit();
|
int32_t smaInit();
|
||||||
void smaCleanUp();
|
void smaCleanUp();
|
||||||
int32_t smaOpen(SVnode* pVnode);
|
int32_t smaOpen(SVnode* pVnode);
|
||||||
int32_t smaPreClose(SSma* pSma);
|
|
||||||
int32_t smaClose(SSma* pSma);
|
int32_t smaClose(SSma* pSma);
|
||||||
int32_t smaBegin(SSma* pSma);
|
int32_t smaBegin(SSma* pSma);
|
||||||
int32_t smaSyncPreCommit(SSma* pSma);
|
int32_t smaSyncPreCommit(SSma* pSma);
|
||||||
|
@ -199,7 +198,6 @@ int32_t smaAsyncPreCommit(SSma* pSma);
|
||||||
int32_t smaAsyncCommit(SSma* pSma);
|
int32_t smaAsyncCommit(SSma* pSma);
|
||||||
int32_t smaAsyncPostCommit(SSma* pSma);
|
int32_t smaAsyncPostCommit(SSma* pSma);
|
||||||
int32_t smaDoRetention(SSma* pSma, int64_t now);
|
int32_t smaDoRetention(SSma* pSma, int64_t now);
|
||||||
int32_t smaProcessExec(SSma* pSma, void* pMsg);
|
|
||||||
|
|
||||||
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
|
int32_t tdProcessTSmaCreate(SSma* pSma, int64_t version, const char* msg);
|
||||||
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg);
|
int32_t tdProcessTSmaInsert(SSma* pSma, int64_t indexUid, const char* msg);
|
||||||
|
@ -323,7 +321,6 @@ struct SVnode {
|
||||||
TdThreadMutex lock;
|
TdThreadMutex lock;
|
||||||
bool blocked;
|
bool blocked;
|
||||||
bool restored;
|
bool restored;
|
||||||
bool inClose;
|
|
||||||
tsem_t syncSem;
|
tsem_t syncSem;
|
||||||
SQHandle* pQuery;
|
SQHandle* pQuery;
|
||||||
};
|
};
|
||||||
|
|
|
@ -23,11 +23,13 @@ extern SSmaMgmt smaMgmt;
|
||||||
|
|
||||||
// declaration of static functions
|
// declaration of static functions
|
||||||
|
|
||||||
static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pSma);
|
static int32_t tdNewSmaEnv(SSma *pSma, int8_t smaType, SSmaEnv **ppEnv);
|
||||||
static SSmaEnv *tdNewSmaEnv(const SSma *pSma, int8_t smaType, const char *path);
|
static int32_t tdInitSmaEnv(SSma *pSma, int8_t smaType, SSmaEnv **ppEnv);
|
||||||
static int32_t tdInitSmaEnv(SSma *pSma, int8_t smaType, const char *path, SSmaEnv **pEnv);
|
static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pSma);
|
||||||
static void *tdFreeTSmaStat(STSmaStat *pStat);
|
static int32_t tdRsmaStartExecutor(const SSma *pSma);
|
||||||
static void tdDestroyRSmaStat(void *pRSmaStat);
|
static int32_t tdRsmaStopExecutor(const SSma *pSma);
|
||||||
|
static void *tdFreeTSmaStat(STSmaStat *pStat);
|
||||||
|
static void tdDestroyRSmaStat(void *pRSmaStat);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief rsma init
|
* @brief rsma init
|
||||||
|
@ -97,35 +99,42 @@ void smaCleanUp() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static SSmaEnv *tdNewSmaEnv(const SSma *pSma, int8_t smaType, const char *path) {
|
static int32_t tdNewSmaEnv(SSma *pSma, int8_t smaType, SSmaEnv **ppEnv) {
|
||||||
SSmaEnv *pEnv = NULL;
|
SSmaEnv *pEnv = NULL;
|
||||||
|
|
||||||
pEnv = (SSmaEnv *)taosMemoryCalloc(1, sizeof(SSmaEnv));
|
pEnv = (SSmaEnv *)taosMemoryCalloc(1, sizeof(SSmaEnv));
|
||||||
|
*ppEnv = pEnv;
|
||||||
if (!pEnv) {
|
if (!pEnv) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return NULL;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
SMA_ENV_TYPE(pEnv) = smaType;
|
SMA_ENV_TYPE(pEnv) = smaType;
|
||||||
|
|
||||||
taosInitRWLatch(&(pEnv->lock));
|
taosInitRWLatch(&(pEnv->lock));
|
||||||
|
|
||||||
|
(smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_store_ptr(&SMA_TSMA_ENV(pSma), *ppEnv)
|
||||||
|
: atomic_store_ptr(&SMA_RSMA_ENV(pSma), *ppEnv);
|
||||||
|
|
||||||
if (tdInitSmaStat(&SMA_ENV_STAT(pEnv), smaType, pSma) != TSDB_CODE_SUCCESS) {
|
if (tdInitSmaStat(&SMA_ENV_STAT(pEnv), smaType, pSma) != TSDB_CODE_SUCCESS) {
|
||||||
tdFreeSmaEnv(pEnv);
|
tdFreeSmaEnv(pEnv);
|
||||||
return NULL;
|
*ppEnv = NULL;
|
||||||
|
(smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_store_ptr(&SMA_TSMA_ENV(pSma), NULL)
|
||||||
|
: atomic_store_ptr(&SMA_RSMA_ENV(pSma), NULL);
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
return pEnv;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tdInitSmaEnv(SSma *pSma, int8_t smaType, const char *path, SSmaEnv **pEnv) {
|
static int32_t tdInitSmaEnv(SSma *pSma, int8_t smaType, SSmaEnv **ppEnv) {
|
||||||
if (!pEnv) {
|
if (!ppEnv) {
|
||||||
terrno = TSDB_CODE_INVALID_PTR;
|
terrno = TSDB_CODE_INVALID_PTR;
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!(*pEnv)) {
|
if (!(*ppEnv)) {
|
||||||
if (!(*pEnv = tdNewSmaEnv(pSma, smaType, path))) {
|
if (tdNewSmaEnv(pSma, smaType, ppEnv) != TSDB_CODE_SUCCESS) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -199,7 +208,7 @@ static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pS
|
||||||
* tdInitSmaStat invoked in other multithread environment later.
|
* tdInitSmaStat invoked in other multithread environment later.
|
||||||
*/
|
*/
|
||||||
if (!(*pSmaStat)) {
|
if (!(*pSmaStat)) {
|
||||||
*pSmaStat = (SSmaStat *)taosMemoryCalloc(1, sizeof(SSmaStat));
|
*pSmaStat = (SSmaStat *)taosMemoryCalloc(1, sizeof(SSmaStat) + sizeof(TdThread) * tsNumOfVnodeRsmaThreads);
|
||||||
if (!(*pSmaStat)) {
|
if (!(*pSmaStat)) {
|
||||||
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
terrno = TSDB_CODE_OUT_OF_MEMORY;
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
|
@ -231,6 +240,10 @@ static int32_t tdInitSmaStat(SSmaStat **pSmaStat, int8_t smaType, const SSma *pS
|
||||||
if (!RSMA_INFO_HASH(pRSmaStat)) {
|
if (!RSMA_INFO_HASH(pRSmaStat)) {
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (tdRsmaStartExecutor(pSma) < 0) {
|
||||||
|
return TSDB_CODE_FAILED;
|
||||||
|
}
|
||||||
} else if (smaType == TSDB_SMA_TYPE_TIME_RANGE) {
|
} else if (smaType == TSDB_SMA_TYPE_TIME_RANGE) {
|
||||||
// TODO
|
// TODO
|
||||||
} else {
|
} else {
|
||||||
|
@ -291,6 +304,9 @@ static void tdDestroyRSmaStat(void *pRSmaStat) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// step 4:
|
||||||
|
tdRsmaStopExecutor(pSma);
|
||||||
|
|
||||||
// step 5: free pStat
|
// step 5: free pStat
|
||||||
taosMemoryFreeClear(pStat);
|
taosMemoryFreeClear(pStat);
|
||||||
}
|
}
|
||||||
|
@ -381,17 +397,70 @@ int32_t tdCheckAndInitSmaEnv(SSma *pSma, int8_t smaType) {
|
||||||
pEnv = (smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_load_ptr(&SMA_TSMA_ENV(pSma))
|
pEnv = (smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_load_ptr(&SMA_TSMA_ENV(pSma))
|
||||||
: atomic_load_ptr(&SMA_RSMA_ENV(pSma));
|
: atomic_load_ptr(&SMA_RSMA_ENV(pSma));
|
||||||
if (!pEnv) {
|
if (!pEnv) {
|
||||||
char rname[TSDB_FILENAME_LEN] = {0};
|
if (tdInitSmaEnv(pSma, smaType, &pEnv) < 0) {
|
||||||
|
|
||||||
if (tdInitSmaEnv(pSma, smaType, rname, &pEnv) < 0) {
|
|
||||||
tdUnLockSma(pSma);
|
tdUnLockSma(pSma);
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
(smaType == TSDB_SMA_TYPE_TIME_RANGE) ? atomic_store_ptr(&SMA_TSMA_ENV(pSma), pEnv)
|
|
||||||
: atomic_store_ptr(&SMA_RSMA_ENV(pSma), pEnv);
|
|
||||||
}
|
}
|
||||||
tdUnLockSma(pSma);
|
tdUnLockSma(pSma);
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
void *tdRSmaExecutorFunc(void *param) {
|
||||||
|
setThreadName("vnode-rsma");
|
||||||
|
|
||||||
|
tdRSmaProcessExecImpl((SSma *)param, RSMA_EXEC_OVERFLOW);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tdRsmaStartExecutor(const SSma *pSma) {
|
||||||
|
TdThreadAttr thAttr = {0};
|
||||||
|
taosThreadAttrInit(&thAttr);
|
||||||
|
taosThreadAttrSetDetachState(&thAttr, PTHREAD_CREATE_JOINABLE);
|
||||||
|
|
||||||
|
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
||||||
|
SSmaStat *pStat = SMA_ENV_STAT(pEnv);
|
||||||
|
TdThread *pthread = (TdThread *)&pStat->data;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) {
|
||||||
|
if (taosThreadCreate(&pthread[i], &thAttr, tdRSmaExecutorFunc, (void *)pSma) != 0) {
|
||||||
|
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||||
|
smaError("vgId:%d, failed to create pthread for rsma since %s", SMA_VID(pSma), terrstr());
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
smaDebug("vgId:%d, success to create pthread for rsma", SMA_VID(pSma));
|
||||||
|
}
|
||||||
|
|
||||||
|
taosThreadAttrDestroy(&thAttr);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int32_t tdRsmaStopExecutor(const SSma *pSma) {
|
||||||
|
if (pSma && VND_IS_RSMA(pSma->pVnode)) {
|
||||||
|
SSmaEnv *pEnv = NULL;
|
||||||
|
SSmaStat *pStat = NULL;
|
||||||
|
SRSmaStat *pRSmaStat = NULL;
|
||||||
|
TdThread *pthread = NULL;
|
||||||
|
|
||||||
|
if (!(pEnv = SMA_RSMA_ENV(pSma)) || !(pStat = SMA_ENV_STAT(pEnv))) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
pEnv->flag |= SMA_ENV_FLG_CLOSE;
|
||||||
|
pRSmaStat = (SRSmaStat *)pStat;
|
||||||
|
pthread = (TdThread *)&pStat->data;
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) {
|
||||||
|
tsem_post(&(pRSmaStat->notEmpty));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int32_t i = 0; i < tsNumOfVnodeRsmaThreads; ++i) {
|
||||||
|
if (taosCheckPthreadValid(pthread[i])) {
|
||||||
|
smaDebug("vgId:%d, start to join pthread for rsma:%" PRId64, SMA_VID(pSma), pthread[i]);
|
||||||
|
taosThreadJoin(pthread[i], NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -146,20 +146,6 @@ int32_t smaClose(SSma *pSma) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t smaPreClose(SSma *pSma) {
|
|
||||||
if (pSma && VND_IS_RSMA(pSma->pVnode)) {
|
|
||||||
SSmaEnv *pEnv = NULL;
|
|
||||||
SRSmaStat *pStat = NULL;
|
|
||||||
if (!(pEnv = SMA_RSMA_ENV(pSma)) || !(pStat = (SRSmaStat *)SMA_ENV_STAT(pEnv))) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
for (int32_t i = 0; i < RSMA_EXECUTOR_MAX; ++i) {
|
|
||||||
tsem_post(&(pStat->notEmpty));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief rsma env restore
|
* @brief rsma env restore
|
||||||
*
|
*
|
||||||
|
|
|
@ -621,7 +621,7 @@ static int32_t tdFetchSubmitReqSuids(SSubmitReq *pMsg, STbUidStore *pStore) {
|
||||||
*/
|
*/
|
||||||
int32_t smaDoRetention(SSma *pSma, int64_t now) {
|
int32_t smaDoRetention(SSma *pSma, int64_t now) {
|
||||||
int32_t code = TSDB_CODE_SUCCESS;
|
int32_t code = TSDB_CODE_SUCCESS;
|
||||||
if (VND_IS_RSMA(pSma->pVnode)) {
|
if (!VND_IS_RSMA(pSma->pVnode)) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -734,10 +734,12 @@ static int32_t tdExecuteRSmaImplAsync(SSma *pSma, const void *pMsg, int32_t inpu
|
||||||
|
|
||||||
SRSmaStat *pRSmaStat = SMA_RSMA_STAT(pSma);
|
SRSmaStat *pRSmaStat = SMA_RSMA_STAT(pSma);
|
||||||
|
|
||||||
tsem_post(&(pRSmaStat->notEmpty));
|
|
||||||
|
|
||||||
int64_t nItems = atomic_fetch_add_64(&pRSmaStat->nBufItems, 1);
|
int64_t nItems = atomic_fetch_add_64(&pRSmaStat->nBufItems, 1);
|
||||||
|
|
||||||
|
if (atomic_load_8(&pInfo->assigned) == 0) {
|
||||||
|
tsem_post(&(pRSmaStat->notEmpty));
|
||||||
|
}
|
||||||
|
|
||||||
// smoothing consume
|
// smoothing consume
|
||||||
int32_t n = nItems / RSMA_QTASKEXEC_SMOOTH_SIZE;
|
int32_t n = nItems / RSMA_QTASKEXEC_SMOOTH_SIZE;
|
||||||
if (n > 1) {
|
if (n > 1) {
|
||||||
|
@ -911,39 +913,6 @@ static int32_t tdExecuteRSmaAsync(SSma *pSma, const void *pMsg, int32_t inputTyp
|
||||||
return TSDB_CODE_SUCCESS;
|
return TSDB_CODE_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int32_t tdRSmaExecCheck(SSma *pSma) {
|
|
||||||
SRSmaStat *pRSmaStat = SMA_RSMA_STAT(pSma);
|
|
||||||
|
|
||||||
if (atomic_load_8(&pRSmaStat->nExecutor) >= TMIN(RSMA_EXECUTOR_MAX, tsNumOfVnodeQueryThreads / 2)) {
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
SRSmaExecMsg fetchMsg;
|
|
||||||
int32_t contLen = sizeof(SMsgHead);
|
|
||||||
void *pBuf = rpcMallocCont(0 + contLen);
|
|
||||||
|
|
||||||
((SMsgHead *)pBuf)->vgId = SMA_VID(pSma);
|
|
||||||
((SMsgHead *)pBuf)->contLen = sizeof(SMsgHead);
|
|
||||||
|
|
||||||
SRpcMsg rpcMsg = {
|
|
||||||
.code = 0,
|
|
||||||
.msgType = TDMT_VND_EXEC_RSMA,
|
|
||||||
.pCont = pBuf,
|
|
||||||
.contLen = contLen,
|
|
||||||
};
|
|
||||||
|
|
||||||
if ((terrno = tmsgPutToQueue(&pSma->pVnode->msgCb, QUERY_QUEUE, &rpcMsg)) != 0) {
|
|
||||||
smaError("vgId:%d, failed to put rsma exec msg into query-queue since %s", SMA_VID(pSma), terrstr());
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
|
|
||||||
smaDebug("vgId:%d, success to put rsma fetch msg into query-queue", SMA_VID(pSma));
|
|
||||||
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
_err:
|
|
||||||
return TSDB_CODE_FAILED;
|
|
||||||
}
|
|
||||||
|
|
||||||
int32_t tdProcessRSmaSubmit(SSma *pSma, void *pMsg, int32_t inputType) {
|
int32_t tdProcessRSmaSubmit(SSma *pSma, void *pMsg, int32_t inputType) {
|
||||||
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
||||||
if (!pEnv) {
|
if (!pEnv) {
|
||||||
|
@ -974,10 +943,6 @@ int32_t tdProcessRSmaSubmit(SSma *pSma, void *pMsg, int32_t inputType) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (tdRSmaExecCheck(pSma) < 0) {
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
tdUidStoreDestory(&uidStore);
|
tdUidStoreDestory(&uidStore);
|
||||||
|
@ -1563,7 +1528,9 @@ static void tdRSmaFetchTrigger(void *param, void *tmrId) {
|
||||||
ASSERT(qItem->level == pItem->level);
|
ASSERT(qItem->level == pItem->level);
|
||||||
ASSERT(qItem->fetchLevel == pItem->fetchLevel);
|
ASSERT(qItem->fetchLevel == pItem->fetchLevel);
|
||||||
#endif
|
#endif
|
||||||
tsem_post(&(pStat->notEmpty));
|
if (atomic_load_8(&pRSmaInfo->assigned) == 0) {
|
||||||
|
tsem_post(&(pStat->notEmpty));
|
||||||
|
}
|
||||||
smaInfo("vgId:%d, rsma fetch task planned for level:%" PRIi8 " suid:%" PRIi64, SMA_VID(pSma), pItem->level,
|
smaInfo("vgId:%d, rsma fetch task planned for level:%" PRIi8 " suid:%" PRIi64, SMA_VID(pSma), pItem->level,
|
||||||
pRSmaInfo->suid);
|
pRSmaInfo->suid);
|
||||||
} break;
|
} break;
|
||||||
|
@ -1591,9 +1558,11 @@ _end:
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tdFreeRSmaSubmitItems(SArray *pItems) {
|
static void tdFreeRSmaSubmitItems(SArray *pItems) {
|
||||||
|
ASSERT(taosArrayGetSize(pItems) > 0);
|
||||||
for (int32_t i = 0; i < taosArrayGetSize(pItems); ++i) {
|
for (int32_t i = 0; i < taosArrayGetSize(pItems); ++i) {
|
||||||
taosFreeQitem(*(void **)taosArrayGet(pItems, i));
|
taosFreeQitem(*(void **)taosArrayGet(pItems, i));
|
||||||
}
|
}
|
||||||
|
taosArrayClear(pItems);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1703,6 +1672,7 @@ _err:
|
||||||
* @param type
|
* @param type
|
||||||
* @return int32_t
|
* @return int32_t
|
||||||
*/
|
*/
|
||||||
|
|
||||||
int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) {
|
int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) {
|
||||||
SVnode *pVnode = pSma->pVnode;
|
SVnode *pVnode = pSma->pVnode;
|
||||||
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
SSmaEnv *pEnv = SMA_RSMA_ENV(pSma);
|
||||||
|
@ -1722,41 +1692,53 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) {
|
||||||
goto _err;
|
goto _err;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool isBusy = false;
|
|
||||||
while (true) {
|
while (true) {
|
||||||
isBusy = false;
|
|
||||||
// step 1: rsma exec - consume data in buffer queue for all suids
|
// step 1: rsma exec - consume data in buffer queue for all suids
|
||||||
if (type == RSMA_EXEC_OVERFLOW || type == RSMA_EXEC_COMMIT) {
|
if (type == RSMA_EXEC_OVERFLOW || type == RSMA_EXEC_COMMIT) {
|
||||||
void *pIter = taosHashIterate(infoHash, NULL); // infoHash has r/w lock
|
void *pIter = NULL;
|
||||||
while (pIter) {
|
while ((pIter = taosHashIterate(infoHash, pIter))) {
|
||||||
SRSmaInfo *pInfo = *(SRSmaInfo **)pIter;
|
SRSmaInfo *pInfo = *(SRSmaInfo **)pIter;
|
||||||
int64_t itemSize = 0;
|
if (atomic_val_compare_exchange_8(&pInfo->assigned, 0, 1) == 0) {
|
||||||
if ((itemSize = taosQueueItemSize(pInfo->queue)) || RSMA_INFO_ITEM(pInfo, 0)->fetchLevel ||
|
if ((taosQueueItemSize(pInfo->queue) > 0) || RSMA_INFO_ITEM(pInfo, 0)->fetchLevel ||
|
||||||
RSMA_INFO_ITEM(pInfo, 1)->fetchLevel) {
|
RSMA_INFO_ITEM(pInfo, 1)->fetchLevel) {
|
||||||
smaDebug("vgId:%d, queueItemSize is %" PRIi64 " execType:%" PRIi8, SMA_VID(pSma), itemSize, type);
|
int32_t batchCnt = -1;
|
||||||
if (atomic_val_compare_exchange_8(&pInfo->assigned, 0, 1) == 0) {
|
int32_t batchMax = taosHashGetSize(infoHash) / tsNumOfVnodeRsmaThreads;
|
||||||
taosReadAllQitems(pInfo->queue, pInfo->qall); // queue has mutex lock
|
bool occupied = (batchMax <= 1);
|
||||||
int32_t qallItemSize = taosQallItemSize(pInfo->qall);
|
if (batchMax > 1) {
|
||||||
if (qallItemSize > 0) {
|
batchMax = 100 / batchMax;
|
||||||
tdRSmaBatchExec(pSma, pInfo, pInfo->qall, pSubmitArr, type);
|
|
||||||
}
|
}
|
||||||
|
while (occupied || (++batchCnt < batchMax)) { // greedy mode
|
||||||
|
taosReadAllQitems(pInfo->queue, pInfo->qall); // queue has mutex lock
|
||||||
|
int32_t qallItemSize = taosQallItemSize(pInfo->qall);
|
||||||
|
if (qallItemSize > 0) {
|
||||||
|
tdRSmaBatchExec(pSma, pInfo, pInfo->qall, pSubmitArr, type);
|
||||||
|
smaDebug("vgId:%d, batchSize:%d, execType:%" PRIi8, SMA_VID(pSma), qallItemSize, type);
|
||||||
|
}
|
||||||
|
|
||||||
if (type == RSMA_EXEC_OVERFLOW) {
|
if (type == RSMA_EXEC_OVERFLOW) {
|
||||||
tdRSmaFetchAllResult(pSma, pInfo, pSubmitArr);
|
tdRSmaFetchAllResult(pSma, pInfo, pSubmitArr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (qallItemSize > 0) {
|
if (qallItemSize > 0) {
|
||||||
// subtract the item size after the task finished, commit should wait for all items be consumed
|
atomic_fetch_sub_64(&pRSmaStat->nBufItems, qallItemSize);
|
||||||
atomic_fetch_sub_64(&pRSmaStat->nBufItems, qallItemSize);
|
continue;
|
||||||
isBusy = true;
|
} else if (RSMA_INFO_ITEM(pInfo, 0)->fetchLevel || RSMA_INFO_ITEM(pInfo, 1)->fetchLevel) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
ASSERT(1 == atomic_val_compare_exchange_8(&pInfo->assigned, 1, 0));
|
|
||||||
}
|
}
|
||||||
|
ASSERT(1 == atomic_val_compare_exchange_8(&pInfo->assigned, 1, 0));
|
||||||
}
|
}
|
||||||
pIter = taosHashIterate(infoHash, pIter);
|
|
||||||
}
|
}
|
||||||
if (type == RSMA_EXEC_COMMIT) {
|
if (type == RSMA_EXEC_COMMIT) {
|
||||||
break;
|
if (atomic_load_64(&pRSmaStat->nBufItems) <= 0) {
|
||||||
|
break;
|
||||||
|
} else {
|
||||||
|
// commit should wait for all items be consumed
|
||||||
|
continue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#if 0
|
#if 0
|
||||||
|
@ -1790,16 +1772,19 @@ int32_t tdRSmaProcessExecImpl(SSma *pSma, ERsmaExecType type) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (atomic_load_64(&pRSmaStat->nBufItems) <= 0) {
|
if (atomic_load_64(&pRSmaStat->nBufItems) <= 0) {
|
||||||
if (pVnode->inClose) {
|
if (pEnv->flag & SMA_ENV_FLG_CLOSE) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
tsem_wait(&pRSmaStat->notEmpty);
|
tsem_wait(&pRSmaStat->notEmpty);
|
||||||
if (pVnode->inClose && (atomic_load_64(&pRSmaStat->nBufItems) <= 0)) {
|
|
||||||
smaInfo("vgId:%d, exec task end, inClose:%d, nBufItems:%" PRIi64, SMA_VID(pSma), pVnode->inClose,
|
if ((pEnv->flag & SMA_ENV_FLG_CLOSE) && (atomic_load_64(&pRSmaStat->nBufItems) <= 0)) {
|
||||||
|
smaInfo("vgId:%d, exec task end, flag:%" PRIi8 ", nBufItems:%" PRIi64, SMA_VID(pSma), pEnv->flag,
|
||||||
atomic_load_64(&pRSmaStat->nBufItems));
|
atomic_load_64(&pRSmaStat->nBufItems));
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} // end of while(true)
|
} // end of while(true)
|
||||||
|
|
||||||
_end:
|
_end:
|
||||||
|
@ -1809,39 +1794,3 @@ _err:
|
||||||
taosArrayDestroy(pSubmitArr);
|
taosArrayDestroy(pSubmitArr);
|
||||||
return TSDB_CODE_FAILED;
|
return TSDB_CODE_FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief exec rsma level 1data, fetch result of level 2/3 and submit
|
|
||||||
*
|
|
||||||
* @param pSma
|
|
||||||
* @param pMsg
|
|
||||||
* @return int32_t
|
|
||||||
*/
|
|
||||||
int32_t smaProcessExec(SSma *pSma, void *pMsg) {
|
|
||||||
SRpcMsg *pRpcMsg = (SRpcMsg *)pMsg;
|
|
||||||
SRSmaStat *pRSmaStat = SMA_RSMA_STAT(pSma);
|
|
||||||
|
|
||||||
if (!pRpcMsg || pRpcMsg->contLen < sizeof(SMsgHead)) {
|
|
||||||
terrno = TSDB_CODE_RSMA_FETCH_MSG_MSSED_UP;
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
smaDebug("vgId:%d, begin to process rsma exec msg by TID:%p", SMA_VID(pSma), (void *)taosGetSelfPthreadId());
|
|
||||||
|
|
||||||
int8_t nOld = atomic_fetch_add_8(&pRSmaStat->nExecutor, 1);
|
|
||||||
|
|
||||||
if (nOld < TMIN(RSMA_EXECUTOR_MAX, tsNumOfVnodeQueryThreads / 2)) {
|
|
||||||
if (tdRSmaProcessExecImpl(pSma, RSMA_EXEC_OVERFLOW) < 0) {
|
|
||||||
goto _err;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
atomic_fetch_sub_8(&pRSmaStat->nExecutor, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
smaDebug("vgId:%d, success to process rsma exec msg by TID:%p", SMA_VID(pSma), (void *)taosGetSelfPthreadId());
|
|
||||||
return TSDB_CODE_SUCCESS;
|
|
||||||
_err:
|
|
||||||
atomic_fetch_sub_8(&pRSmaStat->nExecutor, 1);
|
|
||||||
smaError("vgId:%d, failed to process rsma exec msg by TID:%p since %s", SMA_VID(pSma), (void *)taosGetSelfPthreadId(),
|
|
||||||
terrstr());
|
|
||||||
return TSDB_CODE_FAILED;
|
|
||||||
}
|
|
||||||
|
|
|
@ -87,7 +87,6 @@ SVnode *vnodeOpen(const char *path, STfs *pTfs, SMsgCb msgCb) {
|
||||||
pVnode->msgCb = msgCb;
|
pVnode->msgCb = msgCb;
|
||||||
taosThreadMutexInit(&pVnode->lock, NULL);
|
taosThreadMutexInit(&pVnode->lock, NULL);
|
||||||
pVnode->blocked = false;
|
pVnode->blocked = false;
|
||||||
pVnode->inClose = false;
|
|
||||||
|
|
||||||
tsem_init(&pVnode->syncSem, 0, 0);
|
tsem_init(&pVnode->syncSem, 0, 0);
|
||||||
tsem_init(&(pVnode->canCommit), 0, 1);
|
tsem_init(&(pVnode->canCommit), 0, 1);
|
||||||
|
@ -182,8 +181,6 @@ _err:
|
||||||
void vnodePreClose(SVnode *pVnode) {
|
void vnodePreClose(SVnode *pVnode) {
|
||||||
if (pVnode) {
|
if (pVnode) {
|
||||||
syncLeaderTransfer(pVnode->sync);
|
syncLeaderTransfer(pVnode->sync);
|
||||||
pVnode->inClose = true;
|
|
||||||
smaPreClose(pVnode->pSma);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -301,8 +301,6 @@ int32_t vnodeProcessQueryMsg(SVnode *pVnode, SRpcMsg *pMsg) {
|
||||||
return qWorkerProcessQueryMsg(&handle, pVnode->pQuery, pMsg, 0);
|
return qWorkerProcessQueryMsg(&handle, pVnode->pQuery, pMsg, 0);
|
||||||
case TDMT_SCH_QUERY_CONTINUE:
|
case TDMT_SCH_QUERY_CONTINUE:
|
||||||
return qWorkerProcessCQueryMsg(&handle, pVnode->pQuery, pMsg, 0);
|
return qWorkerProcessCQueryMsg(&handle, pVnode->pQuery, pMsg, 0);
|
||||||
case TDMT_VND_EXEC_RSMA:
|
|
||||||
return smaProcessExec(pVnode->pSma, pMsg);
|
|
||||||
default:
|
default:
|
||||||
vError("unknown msg type:%d in query queue", pMsg->msgType);
|
vError("unknown msg type:%d in query queue", pMsg->msgType);
|
||||||
return TSDB_CODE_VND_APP_ERROR;
|
return TSDB_CODE_VND_APP_ERROR;
|
||||||
|
@ -380,14 +378,14 @@ static int32_t vnodeProcessTrimReq(SVnode *pVnode, int64_t version, void *pReq,
|
||||||
int32_t code = 0;
|
int32_t code = 0;
|
||||||
SVTrimDbReq trimReq = {0};
|
SVTrimDbReq trimReq = {0};
|
||||||
|
|
||||||
vInfo("vgId:%d, trim vnode request will be processed, time:%d", pVnode->config.vgId, trimReq.timestamp);
|
|
||||||
|
|
||||||
// decode
|
// decode
|
||||||
if (tDeserializeSVTrimDbReq(pReq, len, &trimReq) != 0) {
|
if (tDeserializeSVTrimDbReq(pReq, len, &trimReq) != 0) {
|
||||||
code = TSDB_CODE_INVALID_MSG;
|
code = TSDB_CODE_INVALID_MSG;
|
||||||
goto _exit;
|
goto _exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
vInfo("vgId:%d, trim vnode request will be processed, time:%d", pVnode->config.vgId, trimReq.timestamp);
|
||||||
|
|
||||||
// process
|
// process
|
||||||
code = tsdbDoRetention(pVnode->pTsdb, trimReq.timestamp);
|
code = tsdbDoRetention(pVnode->pTsdb, trimReq.timestamp);
|
||||||
if (code) goto _exit;
|
if (code) goto _exit;
|
||||||
|
|
|
@ -255,6 +255,13 @@ static int32_t sifInitOperParams(SIFParam **params, SOperatorNode *node, SIFCtx
|
||||||
if (node->opType == OP_TYPE_JSON_GET_VALUE) {
|
if (node->opType == OP_TYPE_JSON_GET_VALUE) {
|
||||||
return code;
|
return code;
|
||||||
}
|
}
|
||||||
|
if ((node->pLeft != NULL && nodeType(node->pLeft) == QUERY_NODE_COLUMN) &&
|
||||||
|
(node->pRight != NULL && nodeType(node->pRight) == QUERY_NODE_VALUE)) {
|
||||||
|
SColumnNode *cn = (SColumnNode *)(node->pLeft);
|
||||||
|
if (cn->node.resType.type == TSDB_DATA_TYPE_JSON) {
|
||||||
|
SIF_ERR_RET(TSDB_CODE_QRY_INVALID_INPUT);
|
||||||
|
}
|
||||||
|
}
|
||||||
SIFParam *paramList = taosMemoryCalloc(nParam, sizeof(SIFParam));
|
SIFParam *paramList = taosMemoryCalloc(nParam, sizeof(SIFParam));
|
||||||
|
|
||||||
if (NULL == paramList) {
|
if (NULL == paramList) {
|
||||||
|
|
|
@ -1401,7 +1401,7 @@ static int tdbBtreeDecodeCell(SPage *pPage, const SCell *pCell, SCellDecoder *pD
|
||||||
pDecoder->pgno = 0;
|
pDecoder->pgno = 0;
|
||||||
TDB_CELLDECODER_SET_FREE_NIL(pDecoder);
|
TDB_CELLDECODER_SET_FREE_NIL(pDecoder);
|
||||||
|
|
||||||
tdbDebug("tdb btc decoder set nil: %p/0x%x ", pDecoder, pDecoder->freeKV);
|
// tdbTrace("tdb btc decoder set nil: %p/0x%x ", pDecoder, pDecoder->freeKV);
|
||||||
|
|
||||||
// 1. Decode header part
|
// 1. Decode header part
|
||||||
if (!leaf) {
|
if (!leaf) {
|
||||||
|
|
|
@ -145,7 +145,7 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn)
|
||||||
// 1. Search the hash table
|
// 1. Search the hash table
|
||||||
pPage = pCache->pgHash[tdbPCachePageHash(pPgid) % pCache->nHash];
|
pPage = pCache->pgHash[tdbPCachePageHash(pPgid) % pCache->nHash];
|
||||||
while (pPage) {
|
while (pPage) {
|
||||||
if (memcmp(pPage->pgid.fileid, pPgid->fileid, TDB_FILE_ID_LEN) == 0 && pPage->pgid.pgno == pPgid->pgno) break;
|
if (pPage->pgid.pgno == pPgid->pgno && memcmp(pPage->pgid.fileid, pPgid->fileid, TDB_FILE_ID_LEN) == 0) break;
|
||||||
pPage = pPage->pHashNext;
|
pPage = pPage->pHashNext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -243,7 +243,7 @@ static void tdbPCachePinPage(SPCache *pCache, SPage *pPage) {
|
||||||
pCache->nRecyclable--;
|
pCache->nRecyclable--;
|
||||||
|
|
||||||
// printf("pin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
// printf("pin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
||||||
tdbTrace("pin page %d", pPage->id);
|
tdbDebug("pin page %d", pPage->id);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,30 +264,33 @@ static void tdbPCacheUnpinPage(SPCache *pCache, SPage *pPage) {
|
||||||
pCache->nRecyclable++;
|
pCache->nRecyclable++;
|
||||||
|
|
||||||
// printf("unpin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
// printf("unpin page %d pgno %d pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
||||||
tdbTrace("unpin page %d", pPage->id);
|
tdbDebug("unpin page %d", pPage->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tdbPCacheRemovePageFromHash(SPCache *pCache, SPage *pPage) {
|
static void tdbPCacheRemovePageFromHash(SPCache *pCache, SPage *pPage) {
|
||||||
SPage **ppPage;
|
uint32_t h = tdbPCachePageHash(&(pPage->pgid)) % pCache->nHash;
|
||||||
uint32_t h;
|
|
||||||
|
|
||||||
h = tdbPCachePageHash(&(pPage->pgid));
|
|
||||||
for (ppPage = &(pCache->pgHash[h % pCache->nHash]); (*ppPage) && *ppPage != pPage; ppPage = &((*ppPage)->pHashNext))
|
|
||||||
;
|
|
||||||
|
|
||||||
|
SPage **ppPage = &(pCache->pgHash[h]);
|
||||||
|
if (*ppPage == pPage) {
|
||||||
|
pCache->pgHash[h] = pPage->pHashNext;
|
||||||
|
} else {
|
||||||
|
for (; (*ppPage) && (*ppPage)->pHashNext != pPage; ppPage = &((*ppPage)->pHashNext))
|
||||||
|
;
|
||||||
|
if (*ppPage) {
|
||||||
|
(*ppPage)->pHashNext = pPage->pHashNext;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (*ppPage) {
|
if (*ppPage) {
|
||||||
*ppPage = pPage->pHashNext;
|
pPage->pHashNext = NULL;
|
||||||
pCache->nPage--;
|
--pCache->nPage;
|
||||||
// printf("rmv page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
// printf("rmv page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
||||||
}
|
}
|
||||||
|
|
||||||
tdbTrace("remove page %d to hash", pPage->id);
|
tdbDebug("remove page %p/%d from hash", pPage, pPage->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) {
|
static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) {
|
||||||
int h;
|
uint32_t h = tdbPCachePageHash(&(pPage->pgid)) % pCache->nHash;
|
||||||
|
|
||||||
h = tdbPCachePageHash(&(pPage->pgid)) % pCache->nHash;
|
|
||||||
|
|
||||||
pPage->pHashNext = pCache->pgHash[h];
|
pPage->pHashNext = pCache->pgHash[h];
|
||||||
pCache->pgHash[h] = pPage;
|
pCache->pgHash[h] = pPage;
|
||||||
|
@ -295,7 +298,7 @@ static void tdbPCacheAddPageToHash(SPCache *pCache, SPage *pPage) {
|
||||||
pCache->nPage++;
|
pCache->nPage++;
|
||||||
|
|
||||||
// printf("add page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
// printf("add page %d to hash, pgno %d, pPage %p\n", pPage->id, TDB_PAGE_PGNO(pPage), pPage);
|
||||||
tdbTrace("add page %d to hash", pPage->id);
|
tdbDebug("add page %p/%d to hash", pPage, pPage->id);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int tdbPCacheOpenImpl(SPCache *pCache) {
|
static int tdbPCacheOpenImpl(SPCache *pCache) {
|
||||||
|
|
|
@ -74,6 +74,7 @@ int tdbPageCreate(int pageSize, SPage **ppPage, void *(*xMalloc)(void *, size_t)
|
||||||
int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg) {
|
int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg) {
|
||||||
u8 *ptr;
|
u8 *ptr;
|
||||||
|
|
||||||
|
tdbDebug("page/destroy: %p %p", pPage, xFree);
|
||||||
ASSERT(xFree);
|
ASSERT(xFree);
|
||||||
|
|
||||||
for (int iOvfl = 0; iOvfl < pPage->nOverflow; iOvfl++) {
|
for (int iOvfl = 0; iOvfl < pPage->nOverflow; iOvfl++) {
|
||||||
|
@ -87,6 +88,7 @@ int tdbPageDestroy(SPage *pPage, void (*xFree)(void *arg, void *ptr), void *arg)
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdbPageZero(SPage *pPage, u8 szAmHdr, int (*xCellSize)(const SPage *, SCell *, int, TXN *, SBTree *pBt)) {
|
void tdbPageZero(SPage *pPage, u8 szAmHdr, int (*xCellSize)(const SPage *, SCell *, int, TXN *, SBTree *pBt)) {
|
||||||
|
tdbDebug("page/zero: %p %" PRIu8 " %p", pPage, szAmHdr, xCellSize);
|
||||||
pPage->pPageHdr = pPage->pData + szAmHdr;
|
pPage->pPageHdr = pPage->pData + szAmHdr;
|
||||||
TDB_PAGE_NCELLS_SET(pPage, 0);
|
TDB_PAGE_NCELLS_SET(pPage, 0);
|
||||||
TDB_PAGE_CCELLS_SET(pPage, pPage->pageSize - sizeof(SPageFtr));
|
TDB_PAGE_CCELLS_SET(pPage, pPage->pageSize - sizeof(SPageFtr));
|
||||||
|
@ -103,6 +105,7 @@ void tdbPageZero(SPage *pPage, u8 szAmHdr, int (*xCellSize)(const SPage *, SCell
|
||||||
}
|
}
|
||||||
|
|
||||||
void tdbPageInit(SPage *pPage, u8 szAmHdr, int (*xCellSize)(const SPage *, SCell *, int, TXN *, SBTree *pBt)) {
|
void tdbPageInit(SPage *pPage, u8 szAmHdr, int (*xCellSize)(const SPage *, SCell *, int, TXN *, SBTree *pBt)) {
|
||||||
|
tdbDebug("page/init: %p %" PRIu8 " %p", pPage, szAmHdr, xCellSize);
|
||||||
pPage->pPageHdr = pPage->pData + szAmHdr;
|
pPage->pPageHdr = pPage->pData + szAmHdr;
|
||||||
pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
|
pPage->pCellIdx = pPage->pPageHdr + TDB_PAGE_HDR_SIZE(pPage);
|
||||||
pPage->pFreeStart = pPage->pCellIdx + TDB_PAGE_OFFSET_SIZE(pPage) * TDB_PAGE_NCELLS(pPage);
|
pPage->pFreeStart = pPage->pCellIdx + TDB_PAGE_OFFSET_SIZE(pPage) * TDB_PAGE_NCELLS(pPage);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
|
|
||||||
|
|
||||||
#define HTTP_RECV_BUF_SIZE 1024
|
#define HTTP_RECV_BUF_SIZE 1024
|
||||||
|
|
||||||
typedef struct SHttpClient {
|
typedef struct SHttpClient {
|
||||||
uv_connect_t conn;
|
uv_connect_t conn;
|
||||||
uv_tcp_t tcp;
|
uv_tcp_t tcp;
|
||||||
|
@ -143,9 +144,9 @@ static void clientAllocBuffCb(uv_handle_t *handle, size_t suggested_size, uv_buf
|
||||||
static void clientRecvCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t *buf) {
|
static void clientRecvCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t *buf) {
|
||||||
SHttpClient* cli = handle->data;
|
SHttpClient* cli = handle->data;
|
||||||
if (nread < 0) {
|
if (nread < 0) {
|
||||||
uError("http-report read error:%s", uv_err_name(nread));
|
uError("http-report recv error:%s", uv_err_name(nread));
|
||||||
} else {
|
} else {
|
||||||
uTrace("http-report succ to read %d bytes, just ignore it", nread);
|
uTrace("http-report succ to recv %d bytes, just ignore it", nread);
|
||||||
}
|
}
|
||||||
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
|
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
|
||||||
}
|
}
|
||||||
|
|
|
@ -276,14 +276,16 @@ void uvOnRecvCb(uv_stream_t* cli, ssize_t nread, const uv_buf_t* buf) {
|
||||||
while (transReadComplete(pBuf)) {
|
while (transReadComplete(pBuf)) {
|
||||||
tTrace("%s conn %p alread read complete packet", transLabel(pTransInst), conn);
|
tTrace("%s conn %p alread read complete packet", transLabel(pTransInst), conn);
|
||||||
if (true == pBuf->invalid || false == uvHandleReq(conn)) {
|
if (true == pBuf->invalid || false == uvHandleReq(conn)) {
|
||||||
tError("%s conn %p read invalid packet, dst: %s, srv: %s", transLabel(pTransInst), conn, conn->dst, conn->src);
|
tError("%s conn %p read invalid packet, received from %s, local info:%s", transLabel(pTransInst), conn,
|
||||||
|
conn->dst, conn->src);
|
||||||
destroyConn(conn, true);
|
destroyConn(conn, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
} else {
|
} else {
|
||||||
tError("%s conn %p read invalid packet, exceed limit", transLabel(pTransInst), conn);
|
tError("%s conn %p read invalid packet, exceed limit, received from %s, local info:", transLabel(pTransInst),
|
||||||
|
conn, conn->dst, conn->src);
|
||||||
destroyConn(conn, true);
|
destroyConn(conn, true);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -649,7 +651,7 @@ void uvOnAcceptCb(uv_stream_t* stream, int status) {
|
||||||
|
|
||||||
pObj->workerIdx = (pObj->workerIdx + 1) % pObj->numOfThreads;
|
pObj->workerIdx = (pObj->workerIdx + 1) % pObj->numOfThreads;
|
||||||
|
|
||||||
tTrace("new conntion accepted by main server, dispatch to %dth worker-thread", pObj->workerIdx);
|
tTrace("new connection accepted by main server, dispatch to %dth worker-thread", pObj->workerIdx);
|
||||||
|
|
||||||
uv_write2(wr, (uv_stream_t*)&(pObj->pipe[pObj->workerIdx][0]), &buf, 1, (uv_stream_t*)cli, uvOnPipeWriteCb);
|
uv_write2(wr, (uv_stream_t*)&(pObj->pipe[pObj->workerIdx][0]), &buf, 1, (uv_stream_t*)cli, uvOnPipeWriteCb);
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -203,10 +203,11 @@ int32_t taosRenameFile(const char *oldName, const char *newName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime) {
|
int32_t taosStatFile(const char *path, int64_t *size, int32_t *mtime) {
|
||||||
struct stat fileStat;
|
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
int32_t code = _stat(path, &fileStat);
|
struct _stati64 fileStat;
|
||||||
|
int32_t code = _stati64(path, &fileStat);
|
||||||
#else
|
#else
|
||||||
|
struct stat fileStat;
|
||||||
int32_t code = stat(path, &fileStat);
|
int32_t code = stat(path, &fileStat);
|
||||||
#endif
|
#endif
|
||||||
if (code < 0) {
|
if (code < 0) {
|
||||||
|
|
|
@ -851,13 +851,12 @@ char *taosGetCmdlineByPID(int pid) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void taosSetCoreDump(bool enable) {
|
void taosSetCoreDump(bool enable) {
|
||||||
|
if (!enable) return;
|
||||||
#ifdef WINDOWS
|
#ifdef WINDOWS
|
||||||
// SetUnhandledExceptionFilter(exceptionHandler);
|
SetUnhandledExceptionFilter(exceptionHandler);
|
||||||
// SetUnhandledExceptionFilter(&FlCrashDump);
|
SetUnhandledExceptionFilter(&FlCrashDump);
|
||||||
#elif defined(_TD_DARWIN_64)
|
#elif defined(_TD_DARWIN_64)
|
||||||
#else
|
#else
|
||||||
if (!enable) return;
|
|
||||||
|
|
||||||
// 1. set ulimit -c unlimited
|
// 1. set ulimit -c unlimited
|
||||||
struct rlimit rlim;
|
struct rlimit rlim;
|
||||||
struct rlimit rlim_new;
|
struct rlimit rlim_new;
|
||||||
|
|
Loading…
Reference in New Issue