Merge pull request #28579 from taosdata/merge/mainto3.0
merge: from main to 3.0 branch
This commit is contained in:
commit
27cdac0910
|
@ -46,7 +46,7 @@ For more details on features, please read through the entire documentation.
|
|||
|
||||
By making full use of [characteristics of time series data](https://tdengine.com/characteristics-of-time-series-data/), TDengine differentiates itself from other time series databases with the following advantages.
|
||||
|
||||
- **[High-Performance](https://tdengine.com/high-performance/)**: TDengine is the only time-series database to solve the high cardinality issue to support billions of data collection points while out performing other time-series databases for data ingestion, querying and data compression.
|
||||
- **[High-Performance](https://tdengine.com/high-performance/)**: TDengine is the only time-series database to solve the high cardinality issue to support billions of data collection points while outperforming other time-series databases for data ingestion, querying and data compression.
|
||||
|
||||
- **[Simplified Solution](https://tdengine.com/comprehensive-industrial-data-solution/)**: Through built-in caching, stream processing and data subscription features, TDengine provides a simplified solution for time-series data processing. It reduces system design complexity and operation costs significantly.
|
||||
|
||||
|
|
|
@ -1187,7 +1187,7 @@ CSUM(expr)
|
|||
### DERIVATIVE
|
||||
|
||||
```sql
|
||||
DERIVATIVE(expr, time_inerval, ignore_negative)
|
||||
DERIVATIVE(expr, time_interval, ignore_negative)
|
||||
|
||||
ignore_negative: {
|
||||
0
|
||||
|
|
|
@ -41,7 +41,7 @@ In this article, it specifically refers to the level within the secondary compre
|
|||
### Create Table with Compression
|
||||
|
||||
```sql
|
||||
CREATE [dbname.]tabname (colName colType [ENCODE 'encode_type'] [COMPRESS 'compress_type' [LEVEL 'level'], [, other cerate_definition]...])
|
||||
CREATE [dbname.]tabname (colName colType [ENCODE 'encode_type'] [COMPRESS 'compress_type' [LEVEL 'level'], [, other create_definition]...])
|
||||
```
|
||||
|
||||
**Parameter Description**
|
||||
|
@ -58,7 +58,7 @@ CREATE [dbname.]tabname (colName colType [ENCODE 'encode_type'] [COMPRESS 'compr
|
|||
### Change Compression Method
|
||||
|
||||
```sql
|
||||
ALTER TABLE [db_name.]tabName MODIFY COLUMN colName [ENCODE 'ecode_type'] [COMPRESS 'compress_type'] [LEVEL "high"]
|
||||
ALTER TABLE [db_name.]tabName MODIFY COLUMN colName [ENCODE 'encode_type'] [COMPRESS 'compress_type'] [LEVEL "high"]
|
||||
```
|
||||
|
||||
**Parameter Description**
|
||||
|
|
|
@ -125,7 +125,7 @@ where `TOKEN` is the string after Base64 encoding of `{username}:{password}`, e.
|
|||
Starting from `TDengine 3.0.3.0`, `taosAdapter` provides a configuration parameter `httpCodeServerError` to set whether to return a non-200 http status code when the C interface returns an error
|
||||
|
||||
| **Description** | **httpCodeServerError false** | **httpCodeServerError true** |
|
||||
|--------------------|---------------------------- ------|---------------------------------------|
|
||||
|--------------------|----------------------------------|---------------------------------------|
|
||||
| taos_errno() returns 0 | 200 | 200 |
|
||||
| taos_errno() returns non-0 | 200 (except authentication error) | 500 (except authentication error and 400/502 error) |
|
||||
| Parameter error | 400 (only handle HTTP request URL parameter error) | 400 (handle HTTP request URL parameter error and taosd return error) |
|
||||
|
|
|
@ -701,15 +701,6 @@ The charset that takes effect is UTF-8.
|
|||
| Type | String |
|
||||
| Default Value | _tag_null |
|
||||
|
||||
### smlDataFormat
|
||||
|
||||
| Attribute | Description |
|
||||
| ----------- | ----------------------------------------------------------------------------------- |
|
||||
| Applicable | Client only |
|
||||
| Meaning | Whether schemaless columns are consistently ordered, depat, discarded since 3.0.3.0 |
|
||||
| Value Range | 0: not consistent; 1: consistent. |
|
||||
| Default | 0 |
|
||||
|
||||
### smlTsDefaultName
|
||||
|
||||
| Attribute | Description |
|
||||
|
@ -719,6 +710,16 @@ The charset that takes effect is UTF-8.
|
|||
| Type | String |
|
||||
| Default Value | _ts |
|
||||
|
||||
### smlDot2Underline
|
||||
|
||||
| Attribute | Description |
|
||||
| -------- | -------------------------------------------------------- |
|
||||
| Applicable | Client only |
|
||||
| Meaning | Convert the dot in the supertable name to an underscore |
|
||||
| Type | Bool |
|
||||
| Default Value | true |
|
||||
|
||||
|
||||
## Compress Parameters
|
||||
|
||||
### compressMsgSize
|
||||
|
|
|
@ -4,7 +4,7 @@ sidebar_label: Load Balance
|
|||
description: This document describes how TDengine implements load balancing.
|
||||
---
|
||||
|
||||
The load balance in TDengine is mainly about processing data series data. TDengine employes builtin hash algorithm to distribute all the tables, sub-tables and their data of a database across all the vgroups that belongs to the database. Each table or sub-table can only be handled by a single vgroup, while each vgroup can process multiple table or sub-table.
|
||||
The load balance in TDengine is mainly about processing data series data. TDengine employs builtin hash algorithm to distribute all the tables, sub-tables and their data of a database across all the vgroups that belongs to the database. Each table or sub-table can only be handled by a single vgroup, while each vgroup can process multiple table or sub-table.
|
||||
|
||||
The number of vgroup can be specified when creating a database, using the parameter `vgroups`.
|
||||
|
||||
|
@ -12,10 +12,10 @@ The number of vgroup can be specified when creating a database, using the parame
|
|||
create database db0 vgroups 100;
|
||||
```
|
||||
|
||||
The proper value of `vgroups` depends on available system resources. Assuming there is only one database to be created in the system, then the number of `vgroups` is determined by the available resources from all dnodes. In principle more vgroups can be created if you have more CPU and memory. Disk I/O is another important factor to consider. Once the bottleneck shows on disk I/O, more vgroups may downgrad the system performance significantly. If multiple databases are to be created in the system, then the total number of `vroups` of all the databases are dependent on the available system resources. It needs to be careful to distribute vgroups among these databases, you need to consider the number of tables, data writing frequency, size of each data row for all these databases. A recommended practice is to firstly choose a starting number for `vgroups`, for example double of the number of CPU cores, then try to adjust and optimize system configurations to find the best setting for `vgroups`, then distribute these vgroups among databases.
|
||||
The proper value of `vgroups` depends on available system resources. Assuming there is only one database to be created in the system, then the number of `vgroups` is determined by the available resources from all dnodes. In principle more vgroups can be created if you have more CPU and memory. Disk I/O is another important factor to consider. Once the bottleneck shows on disk I/O, more vgroups may degrade the system performance significantly. If multiple databases are to be created in the system, then the total number of `vgroups` of all the databases are dependent on the available system resources. It needs to be careful to distribute vgroups among these databases, you need to consider the number of tables, data writing frequency, size of each data row for all these databases. A recommended practice is to firstly choose a starting number for `vgroups`, for example double of the number of CPU cores, then try to adjust and optimize system configurations to find the best setting for `vgroups`, then distribute these vgroups among databases.
|
||||
|
||||
Furthermode, TDengine distributes the vgroups of each database equally among all dnodes. In case of replica 3, the distribution is even more complex, TDengine tries its best to prevent any dnode from becoming a bottleneck.
|
||||
Furthermore, TDengine distributes the vgroups of each database equally among all dnodes. In case of replica 3, the distribution is even more complex, TDengine tries its best to prevent any dnode from becoming a bottleneck.
|
||||
|
||||
TDegnine utilizes the above ways to achieve load balance in a cluster, and finally achieve higher throughput.
|
||||
TDengine utilizes the above ways to achieve load balance in a cluster, and finally achieve higher throughput.
|
||||
|
||||
Once the load balance is achieved, after some operations like deleting tables or dropping databases, the load across all dnodes may become imbalanced, the method of rebalance will be provided in later versions. However, even without explicit rebalancing, TDengine will try its best to achieve new balance without manual interfering when a new database is created.
|
||||
|
|
|
@ -20,21 +20,22 @@ taosBenchmark --start-timestamp=1600000000000 --tables=100 --records=10000000 --
|
|||
|
||||
```sql
|
||||
SELECT * FROM meters
|
||||
WHERE voltage > 10
|
||||
WHERE voltage > 230
|
||||
ORDER BY ts DESC
|
||||
LIMIT 5
|
||||
LIMIT 5;
|
||||
```
|
||||
|
||||
上面的 SQL,从超级表 `meters` 中查询出电压 `voltage` 大于 10 的记录,按时间降序排列,且仅输出前 5 行。查询结果如下:
|
||||
上面的 SQL,从超级表 `meters` 中查询出电压 `voltage` 大于 230 的记录,按时间降序排列,且仅输出前 5 行。查询结果如下:
|
||||
|
||||
```text
|
||||
ts | current | voltage | phase | groupid | location |
|
||||
==========================================================================================================
|
||||
2023-11-14 22:13:10.000 | 1.1294620 | 18 | 0.3531540 | 8 | California.MountainView |
|
||||
2023-11-14 22:13:10.000 | 1.0294620 | 12 | 0.3631540 | 2 | California.Campbell |
|
||||
2023-11-14 22:13:10.000 | 1.0294620 | 16 | 0.3531540 | 1 | California.Campbell |
|
||||
2023-11-14 22:13:10.000 | 1.1294620 | 18 | 0.3531540 | 2 | California.Campbell |
|
||||
2023-11-14 22:13:10.000 | 1.1294620 | 16 | 0.3431540 | 7 | California.PaloAlto |
|
||||
ts | current | voltage | phase | groupid | location |
|
||||
===================================================================================================
|
||||
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 10 | California.Sunnyvale |
|
||||
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 1 | California.LosAngles |
|
||||
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 10 | California.Sunnyvale |
|
||||
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 5 | California.Cupertino |
|
||||
2023-11-15 06:13:10.000 | 14.0601978 | 232 | 146.5000000 | 4 | California.SanFrancisco |
|
||||
Query OK, 5 row(s) in set (0.145403s)
|
||||
```
|
||||
|
||||
## 聚合查询
|
||||
|
@ -48,28 +49,28 @@ TDengine 支持通过 GROUP BY 子句,对数据进行聚合查询。SQL 语句
|
|||
group by 子句用于对数据进行分组,并为每个分组返回一行汇总信息。在 group by 子句中,可以使用表或视图中的任何列作为分组依据,这些列不需要出现在 select 列表中。此外,用户可以直接在超级表上执行聚合查询,无须预先创建子表。以智能电表的数据模型为例,使用 group by 子句的 SQL 如下:
|
||||
|
||||
```sql
|
||||
SELECT groupid,avg(voltage)
|
||||
SELECT groupid, avg(voltage)
|
||||
FROM meters
|
||||
WHERE ts >= "2022-01-01T00:00:00+08:00"
|
||||
AND ts < "2023-01-01T00:00:00+08:00"
|
||||
GROUP BY groupid
|
||||
GROUP BY groupid;
|
||||
```
|
||||
|
||||
上面的 SQL,查询超级表 `meters` 中,时间戳大于等于 `2022-01-01T00:00:00+08:00`,且时间戳小于 `2023-01-01T00:00:00+08:00` 的数据,按照 `groupid` 进行分组,求每组的平均电压。查询结果如下:
|
||||
|
||||
```text
|
||||
groupid | avg(voltage) |
|
||||
==========================================
|
||||
8 | 9.104040404040404 |
|
||||
5 | 9.078333333333333 |
|
||||
1 | 9.087037037037037 |
|
||||
7 | 8.991414141414142 |
|
||||
9 | 8.789814814814815 |
|
||||
6 | 9.051010101010101 |
|
||||
4 | 9.135353535353536 |
|
||||
10 | 9.213131313131314 |
|
||||
2 | 9.008888888888889 |
|
||||
3 | 8.783888888888889 |
|
||||
groupid | avg(voltage) |
|
||||
======================================
|
||||
8 | 243.961981544901079 |
|
||||
5 | 243.961981544901079 |
|
||||
1 | 243.961981544901079 |
|
||||
7 | 243.961981544901079 |
|
||||
9 | 243.961981544901079 |
|
||||
6 | 243.961981544901079 |
|
||||
4 | 243.961981544901079 |
|
||||
10 | 243.961981544901079 |
|
||||
2 | 243.961981544901079 |
|
||||
3 | 243.961981544901079 |
|
||||
Query OK, 10 row(s) in set (0.042446s)
|
||||
```
|
||||
|
||||
|
@ -110,24 +111,24 @@ TDengine 按如下方式处理数据切分子句。
|
|||
```sql
|
||||
SELECT location, avg(voltage)
|
||||
FROM meters
|
||||
PARTITION BY location
|
||||
PARTITION BY location;
|
||||
```
|
||||
|
||||
上面的示例 SQL 查询超级表 `meters`,将数据按标签 `location` 进行分组,每个分组计算电压的平均值。查询结果如下:
|
||||
|
||||
```text
|
||||
location | avg(voltage) |
|
||||
=========================================================
|
||||
California.SantaClara | 8.793334320000000 |
|
||||
California.SanFrancisco | 9.017645882352941 |
|
||||
California.SanJose | 9.156112940000000 |
|
||||
California.LosAngles | 9.036753507692307 |
|
||||
California.SanDiego | 8.967037053333334 |
|
||||
California.Sunnyvale | 8.978572085714285 |
|
||||
California.PaloAlto | 8.936665800000000 |
|
||||
California.Cupertino | 8.987654066666666 |
|
||||
California.MountainView | 9.046297266666667 |
|
||||
California.Campbell | 9.149999028571429 |
|
||||
location | avg(voltage) |
|
||||
======================================================
|
||||
California.SantaClara | 243.962050000000005 |
|
||||
California.SanFrancisco | 243.962050000000005 |
|
||||
California.SanJose | 243.962050000000005 |
|
||||
California.LosAngles | 243.962050000000005 |
|
||||
California.SanDiego | 243.962050000000005 |
|
||||
California.Sunnyvale | 243.962050000000005 |
|
||||
California.PaloAlto | 243.962050000000005 |
|
||||
California.Cupertino | 243.962050000000005 |
|
||||
California.MountainView | 243.962050000000005 |
|
||||
California.Campbell | 243.962050000000005 |
|
||||
Query OK, 10 row(s) in set (2.415961s)
|
||||
```
|
||||
|
||||
|
@ -200,20 +201,20 @@ SLIMIT 2;
|
|||
上面的 SQL,查询超级表 `meters` 中,时间戳大于等于 `2022-01-01T00:00:00+08:00`,且时间戳小于 `2022-01-01T00:05:00+08:00` 的数据;数据首先按照子表名 `tbname` 进行数据切分,再按照每 1 分钟的时间窗口进行切分,且每个时间窗口向后偏移 5 秒;最后,仅取前 2 个分片的数据作为结果。查询结果如下:
|
||||
|
||||
```text
|
||||
tbname | _wstart | _wend | avg(voltage) |
|
||||
==========================================================================================
|
||||
d40 | 2021-12-31 15:59:05.000 | 2021-12-31 16:00:05.000 | 4.000000000000000 |
|
||||
d40 | 2021-12-31 16:00:05.000 | 2021-12-31 16:01:05.000 | 5.000000000000000 |
|
||||
d40 | 2021-12-31 16:01:05.000 | 2021-12-31 16:02:05.000 | 8.000000000000000 |
|
||||
d40 | 2021-12-31 16:02:05.000 | 2021-12-31 16:03:05.000 | 7.666666666666667 |
|
||||
d40 | 2021-12-31 16:03:05.000 | 2021-12-31 16:04:05.000 | 9.666666666666666 |
|
||||
d40 | 2021-12-31 16:04:05.000 | 2021-12-31 16:05:05.000 | 15.199999999999999 |
|
||||
d41 | 2021-12-31 15:59:05.000 | 2021-12-31 16:00:05.000 | 4.000000000000000 |
|
||||
d41 | 2021-12-31 16:00:05.000 | 2021-12-31 16:01:05.000 | 7.000000000000000 |
|
||||
d41 | 2021-12-31 16:01:05.000 | 2021-12-31 16:02:05.000 | 9.000000000000000 |
|
||||
d41 | 2021-12-31 16:02:05.000 | 2021-12-31 16:03:05.000 | 10.666666666666666 |
|
||||
d41 | 2021-12-31 16:03:05.000 | 2021-12-31 16:04:05.000 | 8.333333333333334 |
|
||||
d41 | 2021-12-31 16:04:05.000 | 2021-12-31 16:05:05.000 | 9.600000000000000 |
|
||||
tbname | _wstart | _wend | avg(voltage) |
|
||||
======================================================================================
|
||||
d2 | 2021-12-31 23:59:05.000 | 2022-01-01 00:00:05.000 | 253.000000000000000 |
|
||||
d2 | 2022-01-01 00:00:05.000 | 2022-01-01 00:01:05.000 | 244.166666666666657 |
|
||||
d2 | 2022-01-01 00:01:05.000 | 2022-01-01 00:02:05.000 | 241.833333333333343 |
|
||||
d2 | 2022-01-01 00:02:05.000 | 2022-01-01 00:03:05.000 | 243.166666666666657 |
|
||||
d2 | 2022-01-01 00:03:05.000 | 2022-01-01 00:04:05.000 | 240.833333333333343 |
|
||||
d2 | 2022-01-01 00:04:05.000 | 2022-01-01 00:05:05.000 | 244.800000000000011 |
|
||||
d26 | 2021-12-31 23:59:05.000 | 2022-01-01 00:00:05.000 | 253.000000000000000 |
|
||||
d26 | 2022-01-01 00:00:05.000 | 2022-01-01 00:01:05.000 | 244.166666666666657 |
|
||||
d26 | 2022-01-01 00:01:05.000 | 2022-01-01 00:02:05.000 | 241.833333333333343 |
|
||||
d26 | 2022-01-01 00:02:05.000 | 2022-01-01 00:03:05.000 | 243.166666666666657 |
|
||||
d26 | 2022-01-01 00:03:05.000 | 2022-01-01 00:04:05.000 | 240.833333333333343 |
|
||||
d26 | 2022-01-01 00:04:05.000 | 2022-01-01 00:05:05.000 | 244.800000000000011 |
|
||||
Query OK, 12 row(s) in set (0.021265s)
|
||||
```
|
||||
|
||||
|
@ -255,19 +256,19 @@ SLIMIT 1;
|
|||
上面的 SQL,查询超级表 `meters` 中,时间戳大于等于 `2022-01-01T00:00:00+08:00`,且时间戳小于 `2022-01-01T00:05:00+08:00` 的数据,数据首先按照子表名 `tbname` 进行数据切分,再按照每 1 分钟的时间窗口进行切分,且时间窗口按照 30 秒进行滑动;最后,仅取前 1 个分片的数据作为结果。查询结果如下:
|
||||
|
||||
```text
|
||||
tbname | _wstart | avg(voltage) |
|
||||
================================================================
|
||||
d40 | 2021-12-31 15:59:30.000 | 4.000000000000000 |
|
||||
d40 | 2021-12-31 16:00:00.000 | 5.666666666666667 |
|
||||
d40 | 2021-12-31 16:00:30.000 | 4.333333333333333 |
|
||||
d40 | 2021-12-31 16:01:00.000 | 5.000000000000000 |
|
||||
d40 | 2021-12-31 16:01:30.000 | 9.333333333333334 |
|
||||
d40 | 2021-12-31 16:02:00.000 | 9.666666666666666 |
|
||||
d40 | 2021-12-31 16:02:30.000 | 10.000000000000000 |
|
||||
d40 | 2021-12-31 16:03:00.000 | 10.333333333333334 |
|
||||
d40 | 2021-12-31 16:03:30.000 | 10.333333333333334 |
|
||||
d40 | 2021-12-31 16:04:00.000 | 13.000000000000000 |
|
||||
d40 | 2021-12-31 16:04:30.000 | 15.333333333333334 |
|
||||
tbname | _wstart | avg(voltage) |
|
||||
=============================================================
|
||||
d2 | 2021-12-31 23:59:30.000 | 248.333333333333343 |
|
||||
d2 | 2022-01-01 00:00:00.000 | 246.000000000000000 |
|
||||
d2 | 2022-01-01 00:00:30.000 | 244.666666666666657 |
|
||||
d2 | 2022-01-01 00:01:00.000 | 240.833333333333343 |
|
||||
d2 | 2022-01-01 00:01:30.000 | 239.500000000000000 |
|
||||
d2 | 2022-01-01 00:02:00.000 | 243.833333333333343 |
|
||||
d2 | 2022-01-01 00:02:30.000 | 243.833333333333343 |
|
||||
d2 | 2022-01-01 00:03:00.000 | 241.333333333333343 |
|
||||
d2 | 2022-01-01 00:03:30.000 | 241.666666666666657 |
|
||||
d2 | 2022-01-01 00:04:00.000 | 244.166666666666657 |
|
||||
d2 | 2022-01-01 00:04:30.000 | 244.666666666666657 |
|
||||
Query OK, 11 row(s) in set (0.013153s)
|
||||
```
|
||||
|
||||
|
@ -290,13 +291,13 @@ SLIMIT 1;
|
|||
上面的 SQL,查询超级表 `meters` 中,时间戳大于等于 `2022-01-01T00:00:00+08:00`,且时间戳小于 `2022-01-01T00:05:00+08:00` 的数据,数据首先按照子表名 `tbname` 进行数据切分,再按照每 1 分钟的时间窗口进行切分,且时间窗口按照 1 分钟进行切分;最后,仅取前 1 个分片的数据作为结果。查询结果如下:
|
||||
|
||||
```text
|
||||
tbname | _wstart | _wend | avg(voltage) |
|
||||
=================================================================================================================
|
||||
d28 | 2021-12-31 16:00:00.000 | 2021-12-31 16:01:00.000 | 7.333333333333333 |
|
||||
d28 | 2021-12-31 16:01:00.000 | 2021-12-31 16:02:00.000 | 8.000000000000000 |
|
||||
d28 | 2021-12-31 16:02:00.000 | 2021-12-31 16:03:00.000 | 11.000000000000000 |
|
||||
d28 | 2021-12-31 16:03:00.000 | 2021-12-31 16:04:00.000 | 6.666666666666667 |
|
||||
d28 | 2021-12-31 16:04:00.000 | 2021-12-31 16:05:00.000 | 10.000000000000000 |
|
||||
tbname | _wstart | _wend | avg(voltage) |
|
||||
======================================================================================
|
||||
d2 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:00.000 | 246.000000000000000 |
|
||||
d2 | 2022-01-01 00:01:00.000 | 2022-01-01 00:02:00.000 | 240.833333333333343 |
|
||||
d2 | 2022-01-01 00:02:00.000 | 2022-01-01 00:03:00.000 | 243.833333333333343 |
|
||||
d2 | 2022-01-01 00:03:00.000 | 2022-01-01 00:04:00.000 | 241.333333333333343 |
|
||||
d2 | 2022-01-01 00:04:00.000 | 2022-01-01 00:05:00.000 | 244.166666666666657 |
|
||||
Query OK, 5 row(s) in set (0.016812s)
|
||||
```
|
||||
|
||||
|
@ -342,53 +343,65 @@ SLIMIT 2;
|
|||
上面的 SQL,查询超级表 `meters` 中,时间戳大于等于 `2022-01-01T00:00:00+08:00`,且时间戳小于 `2022-01-01T00:05:00+08:00` 的数据;数据首先按照子表名 `tbname` 进行数据切分,再按照每 1 分钟的时间窗口进行切分,如果窗口内的数据出现缺失,则使用使用前一个非 NULL 值填充数据;最后,仅取前 2 个分片的数据作为结果。查询结果如下:
|
||||
|
||||
```text
|
||||
tbname | _wstart | _wend | avg(voltage) |
|
||||
=================================================================================================================
|
||||
d40 | 2021-12-31 16:00:00.000 | 2021-12-31 16:01:00.000 | 5.666666666666667 |
|
||||
d40 | 2021-12-31 16:01:00.000 | 2021-12-31 16:02:00.000 | 5.000000000000000 |
|
||||
d40 | 2021-12-31 16:02:00.000 | 2021-12-31 16:03:00.000 | 9.666666666666666 |
|
||||
d40 | 2021-12-31 16:03:00.000 | 2021-12-31 16:04:00.000 | 10.333333333333334 |
|
||||
d40 | 2021-12-31 16:04:00.000 | 2021-12-31 16:05:00.000 | 13.000000000000000 |
|
||||
d41 | 2021-12-31 16:00:00.000 | 2021-12-31 16:01:00.000 | 5.666666666666667 |
|
||||
d41 | 2021-12-31 16:01:00.000 | 2021-12-31 16:02:00.000 | 9.333333333333334 |
|
||||
d41 | 2021-12-31 16:02:00.000 | 2021-12-31 16:03:00.000 | 11.000000000000000 |
|
||||
d41 | 2021-12-31 16:03:00.000 | 2021-12-31 16:04:00.000 | 7.666666666666667 |
|
||||
d41 | 2021-12-31 16:04:00.000 | 2021-12-31 16:05:00.000 | 10.000000000000000 |
|
||||
tbname | _wstart | _wend | avg(voltage) |
|
||||
=======================================================================================
|
||||
d2 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:00.000 | 246.000000000000000 |
|
||||
d2 | 2022-01-01 00:01:00.000 | 2022-01-01 00:02:00.000 | 240.833333333333343 |
|
||||
d2 | 2022-01-01 00:02:00.000 | 2022-01-01 00:03:00.000 | 243.833333333333343 |
|
||||
d2 | 2022-01-01 00:03:00.000 | 2022-01-01 00:04:00.000 | 241.333333333333343 |
|
||||
d2 | 2022-01-01 00:04:00.000 | 2022-01-01 00:05:00.000 | 244.166666666666657 |
|
||||
d26 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:00.000 | 246.000000000000000 |
|
||||
d26 | 2022-01-01 00:01:00.000 | 2022-01-01 00:02:00.000 | 240.833333333333343 |
|
||||
d26 | 2022-01-01 00:02:00.000 | 2022-01-01 00:03:00.000 | 243.833333333333343 |
|
||||
d26 | 2022-01-01 00:03:00.000 | 2022-01-01 00:04:00.000 | 241.333333333333343 |
|
||||
d26 | 2022-01-01 00:04:00.000 | 2022-01-01 00:05:00.000 | 244.166666666666657 |
|
||||
Query OK, 10 row(s) in set (0.022866s)
|
||||
```
|
||||
|
||||
### 状态窗口
|
||||
|
||||
使用整数(布尔值)或字符串来标识产生记录时候设备的状态量。产生的记录如果具有相同的状态量数值则归属于同一个状态窗口,数值改变后该窗口关闭。TDengine 还支持将 CASE 表达式用在状态量,可以表达某个状态的开始是由满足某个条件而触发,这个状态的结束是由另外一个条件满足而触发的语义。以智能电表为例,电压正常范围是 205V 到 235V,那么可以通过监控电压来判断电路是否正常。
|
||||
使用整数(布尔值)或字符串来标识产生记录时候设备的状态量。产生的记录如果具有相同的状态量数值则归属于同一个状态窗口,数值改变后该窗口关闭。TDengine 还支持将 CASE 表达式用在状态量,可以表达某个状态的开始是由满足某个条件而触发,这个状态的结束是由另外一个条件满足而触发的语义。以智能电表为例,电压正常范围是 225V 到 235V,那么可以通过监控电压来判断电路是否正常。
|
||||
|
||||
```sql
|
||||
SELECT tbname, _wstart, _wend,_wduration, CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END status
|
||||
SELECT tbname, _wstart, _wend,_wduration, CASE WHEN voltage >= 225 and voltage <= 235 THEN 1 ELSE 0 END status
|
||||
FROM meters
|
||||
WHERE ts >= "2022-01-01T00:00:00+08:00"
|
||||
AND ts < "2022-01-01T00:05:00+08:00"
|
||||
PARTITION BY tbname
|
||||
STATE_WINDOW(
|
||||
CASE WHEN voltage >= 205 and voltage <= 235 THEN 1 ELSE 0 END
|
||||
CASE WHEN voltage >= 225 and voltage <= 235 THEN 1 ELSE 0 END
|
||||
)
|
||||
SLIMIT 10;
|
||||
SLIMIT 2;
|
||||
```
|
||||
|
||||
以上 SQL,查询超级表 meters 中,时间戳大于等于 2022-01-01T00:00:00+08:00,且时间戳小于 2022-01-01T00:05:00+08:00的数据;数据首先按照子表名 tbname 进行数据切分;根据电压是否在正常范围内进行状态窗口的划分;最后,取前 10 个分片的数据作为结果。查询结果如下:
|
||||
以上 SQL,查询超级表 meters 中,时间戳大于等于 2022-01-01T00:00:00+08:00,且时间戳小于 2022-01-01T00:05:00+08:00的数据;数据首先按照子表名 tbname 进行数据切分;根据电压是否在正常范围内进行状态窗口的划分;最后,取前 2 个分片的数据作为结果。查询结果如下:(由于数据是随机生成,结果集包含的数据条数会有不同)
|
||||
|
||||
```text
|
||||
tbname | _wstart | _wend | _wduration | status |
|
||||
=====================================================================================================================================
|
||||
d76 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d47 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d37 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d87 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d64 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d35 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d83 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d51 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d63 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
d0 | 2021-12-31 16:00:00.000 | 2021-12-31 16:04:50.000 | 290000 | 0 |
|
||||
Query OK, 10 row(s) in set (0.040495s)
|
||||
tbname | _wstart | _wend | _wduration | status |
|
||||
===============================================================================================
|
||||
d2 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:20.000 | 80000 | 0 |
|
||||
d2 | 2022-01-01 00:01:30.000 | 2022-01-01 00:01:30.000 | 0 | 1 |
|
||||
d2 | 2022-01-01 00:01:40.000 | 2022-01-01 00:01:40.000 | 0 | 0 |
|
||||
d2 | 2022-01-01 00:01:50.000 | 2022-01-01 00:01:50.000 | 0 | 1 |
|
||||
d2 | 2022-01-01 00:02:00.000 | 2022-01-01 00:02:20.000 | 20000 | 0 |
|
||||
d2 | 2022-01-01 00:02:30.000 | 2022-01-01 00:02:30.000 | 0 | 1 |
|
||||
d2 | 2022-01-01 00:02:40.000 | 2022-01-01 00:03:00.000 | 20000 | 0 |
|
||||
d2 | 2022-01-01 00:03:10.000 | 2022-01-01 00:03:10.000 | 0 | 1 |
|
||||
d2 | 2022-01-01 00:03:20.000 | 2022-01-01 00:03:40.000 | 20000 | 0 |
|
||||
d2 | 2022-01-01 00:03:50.000 | 2022-01-01 00:03:50.000 | 0 | 1 |
|
||||
d2 | 2022-01-01 00:04:00.000 | 2022-01-01 00:04:50.000 | 50000 | 0 |
|
||||
d26 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:20.000 | 80000 | 0 |
|
||||
d26 | 2022-01-01 00:01:30.000 | 2022-01-01 00:01:30.000 | 0 | 1 |
|
||||
d26 | 2022-01-01 00:01:40.000 | 2022-01-01 00:01:40.000 | 0 | 0 |
|
||||
d26 | 2022-01-01 00:01:50.000 | 2022-01-01 00:01:50.000 | 0 | 1 |
|
||||
d26 | 2022-01-01 00:02:00.000 | 2022-01-01 00:02:20.000 | 20000 | 0 |
|
||||
d26 | 2022-01-01 00:02:30.000 | 2022-01-01 00:02:30.000 | 0 | 1 |
|
||||
d26 | 2022-01-01 00:02:40.000 | 2022-01-01 00:03:00.000 | 20000 | 0 |
|
||||
d26 | 2022-01-01 00:03:10.000 | 2022-01-01 00:03:10.000 | 0 | 1 |
|
||||
d26 | 2022-01-01 00:03:20.000 | 2022-01-01 00:03:40.000 | 20000 | 0 |
|
||||
d26 | 2022-01-01 00:03:50.000 | 2022-01-01 00:03:50.000 | 0 | 1 |
|
||||
d26 | 2022-01-01 00:04:00.000 | 2022-01-01 00:04:50.000 | 50000 | 0 |
|
||||
Query OK, 22 row(s) in set (0.153403s)
|
||||
```
|
||||
|
||||
### 会话窗口
|
||||
|
@ -417,18 +430,18 @@ SLIMIT 10;
|
|||
|
||||
上面的 SQL,查询超级表 meters 中,时间戳大于等于 2022-01-01T00:00:00+08:00,且时间戳小于 2022-01-01T00:10:00+08:00的数据;数据先按照子表名 tbname 进行数据切分,再根据 10 分钟的会话窗口进行切分;最后,取前 10 个分片的数据作为结果,返回子表名、窗口开始时间、窗口结束时间、窗口宽度、窗口内数据条数。查询结果如下:
|
||||
```text
|
||||
tbname | _wstart | _wend | _wduration | count(*) |
|
||||
=====================================================================================================================================
|
||||
d76 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d47 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d37 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d87 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d64 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d35 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d83 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d51 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d63 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
d0 | 2021-12-31 16:00:00.000 | 2021-12-31 16:09:50.000 | 590000 | 60 |
|
||||
tbname | _wstart | _wend | _wduration | count(*) |
|
||||
===============================================================================================
|
||||
d2 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d26 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d52 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d64 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d76 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d28 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d4 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d88 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d77 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
d54 | 2022-01-01 00:00:00.000 | 2022-01-01 00:09:50.000 | 590000 | 60 |
|
||||
Query OK, 10 row(s) in set (0.043489s)
|
||||
```
|
||||
|
||||
|
@ -458,26 +471,26 @@ FROM meters
|
|||
WHERE ts >= "2022-01-01T00:00:00+08:00"
|
||||
AND ts < "2022-01-01T00:10:00+08:00"
|
||||
PARTITION BY tbname
|
||||
EVENT_WINDOW START WITH voltage >= 10 END WITH voltage < 20
|
||||
LIMIT 10;
|
||||
EVENT_WINDOW START WITH voltage >= 225 END WITH voltage < 235
|
||||
LIMIT 5;
|
||||
```
|
||||
|
||||
上面的 SQL,查询超级表meters中,时间戳大于等于2022-01-01T00:00:00+08:00,且时间戳小于2022-01-01T00:10:00+08:00的数据;数据先按照子表名tbname进行数据切分,再根据事件窗口条件:电压大于等于 10V,且小于 20V 进行切分;最后,取前 10 行的数据作为结果,返回子表名、窗口开始时间、窗口结束时间、窗口宽度、窗口内数据条数。查询结果如下:
|
||||
上面的 SQL,查询超级表meters中,时间戳大于等于2022-01-01T00:00:00+08:00,且时间戳小于2022-01-01T00:10:00+08:00的数据;数据先按照子表名tbname进行数据切分,再根据事件窗口条件:电压大于等于 225V,且小于 235V 进行切分;最后,取每个分片的前 5 行的数据作为结果,返回子表名、窗口开始时间、窗口结束时间、窗口宽度、窗口内数据条数。查询结果如下:
|
||||
|
||||
```text
|
||||
tbname | _wstart | _wend | _wduration | count(*) |
|
||||
=====================================================================================================================================
|
||||
d0 | 2021-12-31 16:00:00.000 | 2021-12-31 16:00:00.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:00:30.000 | 2021-12-31 16:00:30.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:00:40.000 | 2021-12-31 16:00:40.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:01:20.000 | 2021-12-31 16:01:20.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:02:20.000 | 2021-12-31 16:02:20.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:02:30.000 | 2021-12-31 16:02:30.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:03:10.000 | 2021-12-31 16:03:10.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:03:30.000 | 2021-12-31 16:03:30.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:03:40.000 | 2021-12-31 16:03:40.000 | 0 | 1 |
|
||||
d0 | 2021-12-31 16:03:50.000 | 2021-12-31 16:03:50.000 | 0 | 1 |
|
||||
Query OK, 10 row(s) in set (0.034127s)
|
||||
tbname | _wstart | _wend | _wduration | count(*) |
|
||||
==============================================================================================
|
||||
d0 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:30.000 | 90000 | 10 |
|
||||
d0 | 2022-01-01 00:01:40.000 | 2022-01-01 00:02:30.000 | 50000 | 6 |
|
||||
d0 | 2022-01-01 00:02:40.000 | 2022-01-01 00:03:10.000 | 30000 | 4 |
|
||||
d0 | 2022-01-01 00:03:20.000 | 2022-01-01 00:07:10.000 | 230000 | 24 |
|
||||
d0 | 2022-01-01 00:07:20.000 | 2022-01-01 00:07:50.000 | 30000 | 4 |
|
||||
d1 | 2022-01-01 00:00:00.000 | 2022-01-01 00:01:30.000 | 90000 | 10 |
|
||||
d1 | 2022-01-01 00:01:40.000 | 2022-01-01 00:02:30.000 | 50000 | 6 |
|
||||
d1 | 2022-01-01 00:02:40.000 | 2022-01-01 00:03:10.000 | 30000 | 4 |
|
||||
d1 | 2022-01-01 00:03:20.000 | 2022-01-01 00:07:10.000 | 230000 | 24 |
|
||||
……
|
||||
Query OK, 500 row(s) in set (0.328557s)
|
||||
```
|
||||
|
||||
### 计数窗口
|
||||
|
@ -492,17 +505,25 @@ sliding_val 是一个常量,表示窗口滑动的数量,类似于 interval
|
|||
select _wstart, _wend, count(*)
|
||||
from meters
|
||||
where ts >= "2022-01-01T00:00:00+08:00" and ts < "2022-01-01T00:30:00+08:00"
|
||||
count_window(10);
|
||||
count_window(1000);
|
||||
```
|
||||
|
||||
上面的 SQL 查询超级表 meters 中时间戳大于等于 2022-01-01T00:00:00+08:00 且时间戳小于 2022-01-01T00:10:00+08:00 的数据。以每 10 条数据为一组,返回每组的开始时间、结束时间和分组条数。查询结果如下。
|
||||
上面的 SQL 查询超级表 meters 中时间戳大于等于 2022-01-01T00:00:00+08:00 且时间戳小于 2022-01-01T00:10:00+08:00 的数据。以每 1000 条数据为一组,返回每组的开始时间、结束时间和分组条数。查询结果如下:
|
||||
|
||||
```text
|
||||
_wstart | _wend |count(*)|
|
||||
===========================================================
|
||||
2021-12-31 16:00:00.000 | 2021-12-31 16:10:00.000 | 10 |
|
||||
2021-12-31 16:10:00.000 | 2021-12-31 16:20:00.000 | 10 |
|
||||
2021-12-31 16:20:00.000 | 2021-12-31 16:30:00.000 | 10 |
|
||||
_wstart | _wend | count(*) |
|
||||
=====================================================================
|
||||
2022-01-01 00:00:00.000 | 2022-01-01 00:01:30.000 | 1000 |
|
||||
2022-01-01 00:01:40.000 | 2022-01-01 00:03:10.000 | 1000 |
|
||||
2022-01-01 00:03:20.000 | 2022-01-01 00:04:50.000 | 1000 |
|
||||
2022-01-01 00:05:00.000 | 2022-01-01 00:06:30.000 | 1000 |
|
||||
2022-01-01 00:06:40.000 | 2022-01-01 00:08:10.000 | 1000 |
|
||||
2022-01-01 00:08:20.000 | 2022-01-01 00:09:50.000 | 1000 |
|
||||
2022-01-01 00:10:00.000 | 2022-01-01 00:11:30.000 | 1000 |
|
||||
2022-01-01 00:11:40.000 | 2022-01-01 00:13:10.000 | 1000 |
|
||||
2022-01-01 00:13:20.000 | 2022-01-01 00:14:50.000 | 1000 |
|
||||
2022-01-01 00:15:00.000 | 2022-01-01 00:16:30.000 | 1000 |
|
||||
Query OK, 10 row(s) in set (0.062794s)
|
||||
```
|
||||
|
||||
## 时序数据特有函数
|
||||
|
@ -563,14 +584,14 @@ UNION ALL
|
|||
上面的 SQL,分别查询:子表 d1 的 1 条数据,子表 d11 的 2 条数据,子表 d21 的 3 条数据,并将结果合并。返回的结果如下:
|
||||
|
||||
```text
|
||||
tbname | ts | current | voltage | phase |
|
||||
=================================================================================================
|
||||
d11 | 2020-09-13 12:26:40.000 | 1.0260611 | 6 | 0.3620200 |
|
||||
d11 | 2020-09-13 12:26:50.000 | 2.9544230 | 8 | 1.0048079 |
|
||||
d21 | 2020-09-13 12:26:40.000 | 1.0260611 | 2 | 0.3520200 |
|
||||
d21 | 2020-09-13 12:26:50.000 | 2.9544230 | 2 | 0.9948080 |
|
||||
d21 | 2020-09-13 12:27:00.000 | -0.0000430 | 12 | 0.0099860 |
|
||||
d1 | 2020-09-13 12:26:40.000 | 1.0260611 | 10 | 0.3520200 |
|
||||
tbname | ts | current | voltage | phase |
|
||||
====================================================================================
|
||||
d11 | 2020-09-13 20:26:40.000 | 11.5680809 | 247 | 146.5000000 |
|
||||
d11 | 2020-09-13 20:26:50.000 | 14.2392311 | 234 | 148.0000000 |
|
||||
d1 | 2020-09-13 20:26:40.000 | 11.5680809 | 247 | 146.5000000 |
|
||||
d21 | 2020-09-13 20:26:40.000 | 11.5680809 | 247 | 146.5000000 |
|
||||
d21 | 2020-09-13 20:26:50.000 | 14.2392311 | 234 | 148.0000000 |
|
||||
d21 | 2020-09-13 20:27:00.000 | 10.0999422 | 251 | 146.0000000 |
|
||||
Query OK, 6 row(s) in set (0.006438s)
|
||||
```
|
||||
|
||||
|
|
|
@ -54,10 +54,10 @@ TDengine 利用这些日志文件实现故障前的状态恢复。在写入 WAL
|
|||
|
||||
数据库参数 wal_level 和 wal_fsync_period 共同决定了 WAL 的保存行为。。
|
||||
- wal_level:此参数控制 WAL 的保存级别。级别 1 表示仅将数据写入 WAL,但不立即执行 fsync 函数;级别 2 则表示在写入 WAL 的同时执行 fsync 函数。默认情况下,wal_level 设为 1。虽然执行 fsync 函数可以提高数据的持久性,但相应地也会降低写入性能。
|
||||
- wal_fsync_period:当 wal_level 设置为 1 时,这个参数控制执行 fsync 的频率。设置为 0 表示每次写入后立即执行 fsync,这可以确保数据的安全性,但可能会牺牲一些性能。当设置为大于 0 的数值时,表示 fsync 周期,默认为 3000,范围是[1, 180000],单位毫秒。
|
||||
- wal_fsync_period:当 wal_level 设置为 2 时,这个参数控制执行 fsync 的频率。设置为 0 表示每次写入后立即执行 fsync,这可以确保数据的安全性,但可能会牺牲一些性能。当设置为大于 0 的数值时,表示 fsync 周期,默认为 3000,范围是[1, 180000],单位毫秒。
|
||||
|
||||
```sql
|
||||
CREATE DATABASE POWER WAL_LEVEL 1 WAL_FSYNC_PERIOD 3000;
|
||||
CREATE DATABASE POWER WAL_LEVEL 2 WAL_FSYNC_PERIOD 3000;
|
||||
```
|
||||
|
||||
在创建数据库时可以选择不同的参数类型,来选择性能优先或者可靠性优先。
|
||||
|
|
|
@ -180,6 +180,7 @@ charset 的有效值是 UTF-8。
|
|||
| tmrDebugFlag | 定时器模块的日志开关,取值范围同上 |
|
||||
| uDebugFlag | 共用功能模块的日志开关,取值范围同上 |
|
||||
| rpcDebugFlag | rpc 模块的日志开关,取值范围同上 |
|
||||
| cDebugFlag | 客户端模块的日志开关,取值范围同上 |
|
||||
| jniDebugFlag | jni 模块的日志开关,取值范围同上 |
|
||||
| qDebugFlag | query 模块的日志开关,取值范围同上 |
|
||||
| dDebugFlag | dnode 模块的日志开关,取值范围同上,缺省值 135 |
|
||||
|
|
|
@ -35,6 +35,7 @@ TDengine 客户端驱动提供了应用编程所需要的全部 API,并且在
|
|||
|smlAutoChildTableNameDelimiter | schemaless tag之间的连接符,连起来作为子表名,无缺省值 |
|
||||
|smlTagName | schemaless tag 为空时默认的 tag 名字, 缺省值 "_tag_null" |
|
||||
|smlTsDefaultName | schemaless自动建表的时间列名字通过该配置设置, 缺省值 "_ts" |
|
||||
|smlDot2Underline | schemaless 把超级表名中的 dot 转成下划线 |
|
||||
|enableCoreFile | crash 时是否生成 core 文件,0: 不生成, 1: 生成;缺省值:1 |
|
||||
|enableScience | 是否开启科学计数法显示浮点数; 0: 不开始, 1: 开启;缺省值:1 |
|
||||
|compressMsgSize | 是否对 RPC 消息进行压缩; -1: 所有消息都不压缩; 0: 所有消息都压缩; N (N>0): 只有大于 N 个字节的消息才压缩; 缺省值 -1|
|
||||
|
|
|
@ -364,7 +364,7 @@ taosBenchmark -A INT,DOUBLE,NCHAR,BINARY\(16\)
|
|||
|
||||
- **max** : 数据类型的 列/标签 的最大值。生成的值将小于最小值。
|
||||
|
||||
- **scalingFactor** : 浮点数精度增强因子,仅当数据类型是float/double时生效,有效值范围为1至1000000的正整数。用于增强生成浮点数的精度,特别是在min或max值较小的情况下。此属性按10的幂次增强小数点后的精度:scalingFactor为10表示增强1位小数精度,100表示增强2位,依此类推。
|
||||
- **scalingFactor** : 浮点数精度增强因子,仅当数据类型是 float/double 时生效,有效值范围为 1 至 1000000 的正整数。用于增强生成浮点数的精度,特别是在 min 或 max 值较小的情况下。此属性按 10 的幂次增强小数点后的精度:scalingFactor 为 10 表示增强 1 位小数精度,100 表示增强 2 位,依此类推。
|
||||
|
||||
- **fun** : 此列数据以函数填充,目前只支持 sin 和 cos 两函数,输入参数为时间戳换算成角度值,换算公式: 角度 x = 输入的时间列ts值 % 360。同时支持系数调节,随机波动因子调节,以固定格式的表达式展现,如 fun=“10\*sin(x)+100\*random(5)” , x 表示角度,取值 0 ~ 360度,增长步长与时间列步长一致。10 表示乘的系数,100 表示加或减的系数,5 表示波动幅度在 5% 的随机范围内。目前支持的数据类型为 int, bigint, float, double 四种数据类型。注意:表达式为固定模式,不可前后颠倒。
|
||||
|
||||
|
|
|
@ -34,8 +34,8 @@ TDengine 版本更新往往会增加新的功能特性,列表中的连接器
|
|||
| **3.0.0.0 及以上** | 3.0.2以上 | 当前版本 | 3.0 分支 | 3.0.0 | 3.1.0 | 当前版本 | 与 TDengine 相同版本 |
|
||||
| **2.4.0.14 及以上** | 2.0.38 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 | 与 TDengine 相同版本 |
|
||||
| **2.4.0.4 - 2.4.0.13** | 2.0.37 | 当前版本 | develop 分支 | 1.0.2 - 1.0.6 | 2.0.10 - 2.0.12 | 当前版本 | 与 TDengine 相同版本 |
|
||||
| **2.2.x.x ** | 2.0.36 | 当前版本 | master 分支 | n/a | 2.0.7 - 2.0.9 | 当前版本 | 与 TDengine 相同版本 |
|
||||
| **2.0.x.x ** | 2.0.34 | 当前版本 | master 分支 | n/a | 2.0.1 - 2.0.6 | 当前版本 | 与 TDengine 相同版本 |
|
||||
| **2.2.x.x** | 2.0.36 | 当前版本 | master 分支 | n/a | 2.0.7 - 2.0.9 | 当前版本 | 与 TDengine 相同版本 |
|
||||
| **2.0.x.x** | 2.0.34 | 当前版本 | master 分支 | n/a | 2.0.1 - 2.0.6 | 当前版本 | 与 TDengine 相同版本 |
|
||||
|
||||
## 功能特性
|
||||
|
||||
|
|
|
@ -2,23 +2,22 @@
|
|||
MESSAGE(STATUS "build parser unit test")
|
||||
|
||||
# IF(NOT TD_DARWIN)
|
||||
# # GoogleTest requires at least C++11
|
||||
# SET(CMAKE_CXX_STANDARD 11)
|
||||
# AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
#
|
||||
# ADD_EXECUTABLE(executorTest ${SOURCE_LIST})
|
||||
# TARGET_LINK_LIBRARIES(
|
||||
# executorTest
|
||||
# PRIVATE os util common transport gtest taos_static qcom executor function planner scalar nodes vnode
|
||||
# )
|
||||
#
|
||||
# TARGET_INCLUDE_DIRECTORIES(
|
||||
# executorTest
|
||||
# PUBLIC "${TD_SOURCE_DIR}/include/libs/executor/"
|
||||
# PRIVATE "${TD_SOURCE_DIR}/source/libs/executor/inc"
|
||||
# )
|
||||
# # GoogleTest requires at least C++11
|
||||
# SET(CMAKE_CXX_STANDARD 11)
|
||||
# AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
#
|
||||
# ADD_EXECUTABLE(executorTest ${SOURCE_LIST})
|
||||
# TARGET_LINK_LIBRARIES(
|
||||
# executorTest
|
||||
# PRIVATE os util common transport gtest taos_static qcom executor function planner scalar nodes vnode
|
||||
# )
|
||||
#
|
||||
# TARGET_INCLUDE_DIRECTORIES(
|
||||
# executorTest
|
||||
# PUBLIC "${TD_SOURCE_DIR}/include/libs/executor/"
|
||||
# PRIVATE "${TD_SOURCE_DIR}/source/libs/executor/inc"
|
||||
# )
|
||||
# ENDIF ()
|
||||
|
||||
SET(CMAKE_CXX_STANDARD 11)
|
||||
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
|
||||
|
|
|
@ -7,160 +7,159 @@ IF(NOT TD_DARWIN)
|
|||
add_executable(idxFstUtilUT "")
|
||||
|
||||
target_sources(idxTest
|
||||
PRIVATE
|
||||
"indexTests.cc"
|
||||
PRIVATE
|
||||
"indexTests.cc"
|
||||
)
|
||||
target_sources(idxFstTest
|
||||
PRIVATE
|
||||
"fstTest.cc"
|
||||
PRIVATE
|
||||
"fstTest.cc"
|
||||
)
|
||||
|
||||
target_sources(idxFstUT
|
||||
PRIVATE
|
||||
"fstUT.cc"
|
||||
PRIVATE
|
||||
"fstUT.cc"
|
||||
)
|
||||
target_sources(idxUtilUT
|
||||
PRIVATE
|
||||
"utilUT.cc"
|
||||
PRIVATE
|
||||
"utilUT.cc"
|
||||
)
|
||||
|
||||
target_sources(idxJsonUT
|
||||
PRIVATE
|
||||
"jsonUT.cc"
|
||||
PRIVATE
|
||||
"jsonUT.cc"
|
||||
)
|
||||
target_sources(idxFstUtilUT
|
||||
PRIVATE
|
||||
"fstUtilUT.cc"
|
||||
PRIVATE
|
||||
"fstUtilUT.cc"
|
||||
)
|
||||
|
||||
target_include_directories(idxTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_include_directories(idxFstTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_include_directories (idxTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_include_directories (idxFstTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_sources(idxJsonUT
|
||||
PRIVATE
|
||||
"jsonUT.cc"
|
||||
PRIVATE
|
||||
"jsonUT.cc"
|
||||
)
|
||||
target_include_directories (idxTest
|
||||
target_include_directories(idxTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_include_directories (idxFstTest
|
||||
)
|
||||
target_include_directories(idxFstTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
)
|
||||
|
||||
target_include_directories (idxFstUT
|
||||
target_include_directories(idxFstUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
)
|
||||
|
||||
target_include_directories (idxUtilUT
|
||||
target_include_directories(idxUtilUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
)
|
||||
|
||||
target_include_directories (idxJsonUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_include_directories (idxFstUtilUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_include_directories (idxJsonUT
|
||||
target_include_directories(idxJsonUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
)
|
||||
target_include_directories(idxFstUtilUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
target_include_directories(idxJsonUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/index"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_link_libraries (idxTest
|
||||
os
|
||||
target_link_libraries(idxTest
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
target_link_libraries (idxFstTest
|
||||
os
|
||||
target_link_libraries(idxFstTest
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
target_link_libraries (idxFstUT
|
||||
os
|
||||
target_link_libraries(idxFstUT
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
|
||||
target_link_libraries (idxTest
|
||||
os
|
||||
target_link_libraries(idxTest
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
target_link_libraries (idxFstTest
|
||||
os
|
||||
target_link_libraries(idxFstTest
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
target_link_libraries (idxFstUT
|
||||
os
|
||||
target_link_libraries(idxFstUT
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
|
||||
target_link_libraries (idxUtilUT
|
||||
os
|
||||
target_link_libraries(idxUtilUT
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
|
||||
target_link_libraries (idxJsonUT
|
||||
os
|
||||
target_link_libraries(idxJsonUT
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
target_link_libraries (idxFstUtilUT
|
||||
os
|
||||
target_link_libraries(idxFstUtilUT
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
index
|
||||
)
|
||||
|
||||
|
||||
add_test(
|
||||
NAME idxJsonUT
|
||||
COMMAND idxJsonUT
|
||||
COMMAND idxJsonUT
|
||||
)
|
||||
add_test(
|
||||
NAME idxFstUtilUT
|
||||
COMMAND idxFstUtilUT
|
||||
|
||||
NAME idxFstUtilUT
|
||||
COMMAND idxFstUtilUT
|
||||
)
|
||||
|
||||
add_test(
|
||||
|
@ -168,15 +167,15 @@ IF(NOT TD_DARWIN)
|
|||
COMMAND idxTest
|
||||
)
|
||||
add_test(
|
||||
NAME idxUtilUT
|
||||
COMMAND idxUtilUT
|
||||
NAME idxUtilUT
|
||||
COMMAND idxUtilUT
|
||||
)
|
||||
add_test(
|
||||
NAME idxFstUT
|
||||
COMMAND idxFstUT
|
||||
NAME idxFstUT
|
||||
COMMAND idxFstUT
|
||||
)
|
||||
add_test(
|
||||
NAME idxFstTest
|
||||
COMMAND idxFstTest
|
||||
COMMAND idxFstTest
|
||||
)
|
||||
ENDIF ()
|
||||
ENDIF()
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
|
||||
MESSAGE(STATUS "build qworker unit test")
|
||||
|
||||
IF(NOT TD_DARWIN)
|
||||
# GoogleTest requires at least C++11
|
||||
SET(CMAKE_CXX_STANDARD 11)
|
||||
|
|
|
@ -353,6 +353,7 @@ typedef struct {
|
|||
queue node;
|
||||
void (*freeFunc)(void* arg);
|
||||
int32_t size;
|
||||
int8_t inited;
|
||||
} STransQueue;
|
||||
|
||||
/*
|
||||
|
|
|
@ -127,10 +127,12 @@ typedef struct {
|
|||
typedef struct SCliReq {
|
||||
SReqCtx* ctx;
|
||||
queue q;
|
||||
queue sendQ;
|
||||
STransMsgType type;
|
||||
uint64_t st;
|
||||
int64_t seq;
|
||||
int32_t sent; //(0: no send, 1: alread sent)
|
||||
int8_t inSendQ;
|
||||
STransMsg msg;
|
||||
int8_t inRetry;
|
||||
|
||||
|
@ -274,6 +276,8 @@ static FORCE_INLINE void destroyReqAndAhanlde(void* cmsg);
|
|||
static FORCE_INLINE int cliRBChoseIdx(STrans* pInst);
|
||||
static FORCE_INLINE void destroyReqCtx(SReqCtx* ctx);
|
||||
|
||||
static FORCE_INLINE void removeReqFromSendQ(SCliReq* pReq);
|
||||
|
||||
static int32_t cliHandleState_mayUpdateState(SCliConn* pConn, SCliReq* pReq);
|
||||
static int32_t cliHandleState_mayHandleReleaseResp(SCliConn* conn, STransMsgHead* pHead);
|
||||
static int32_t cliHandleState_mayCreateAhandle(SCliConn* conn, STransMsgHead* pHead, STransMsg* pResp);
|
||||
|
@ -453,6 +457,7 @@ static bool filteBySeq(void* key, void* arg) {
|
|||
SFiterArg* targ = arg;
|
||||
SCliReq* pReq = QUEUE_DATA(key, SCliReq, q);
|
||||
if (pReq->seq == targ->seq && pReq->msg.msgType + 1 == targ->msgType) {
|
||||
removeReqFromSendQ(pReq);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
@ -539,6 +544,7 @@ bool filterByQid(void* key, void* arg) {
|
|||
SCliReq* pReq = QUEUE_DATA(key, SCliReq, q);
|
||||
|
||||
if (pReq->msg.info.qId == *qid) {
|
||||
removeReqFromSendQ(pReq);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
@ -600,7 +606,7 @@ int32_t cliHandleState_mayHandleReleaseResp(SCliConn* conn, STransMsgHead* pHead
|
|||
queue* el = QUEUE_HEAD(&set);
|
||||
QUEUE_REMOVE(el);
|
||||
SCliReq* pReq = QUEUE_DATA(el, SCliReq, q);
|
||||
|
||||
removeReqFromSendQ(pReq);
|
||||
STraceId* trace = &pReq->msg.info.traceId;
|
||||
tGDebug("start to free msg %p", pReq);
|
||||
destroyReqWrapper(pReq, pThrd);
|
||||
|
@ -700,6 +706,7 @@ void cliHandleResp(SCliConn* conn) {
|
|||
tstrerror(code));
|
||||
}
|
||||
}
|
||||
removeReqFromSendQ(pReq);
|
||||
|
||||
code = cliBuildRespFromCont(pReq, &resp, pHead);
|
||||
STraceId* trace = &resp.info.traceId;
|
||||
|
@ -905,6 +912,10 @@ static void addConnToPool(void* pool, SCliConn* conn) {
|
|||
}
|
||||
|
||||
SCliThrd* thrd = conn->hostThrd;
|
||||
if (thrd->quit == true) {
|
||||
return;
|
||||
}
|
||||
|
||||
cliResetConnTimer(conn);
|
||||
if (conn->list == NULL && conn->dstAddr != NULL) {
|
||||
conn->list = taosHashGet((SHashObj*)pool, conn->dstAddr, strlen(conn->dstAddr));
|
||||
|
@ -1092,6 +1103,7 @@ _failed:
|
|||
transQueueDestroy(&conn->reqsToSend);
|
||||
transQueueDestroy(&conn->reqsSentOut);
|
||||
taosMemoryFree(conn->dstAddr);
|
||||
taosMemoryFree(conn->ipStr);
|
||||
}
|
||||
tError("failed to create conn, code:%d", code);
|
||||
taosMemoryFree(conn);
|
||||
|
@ -1216,6 +1228,7 @@ static FORCE_INLINE void destroyReqInQueue(SCliConn* conn, queue* set, int32_t c
|
|||
QUEUE_REMOVE(el);
|
||||
|
||||
SCliReq* pReq = QUEUE_DATA(el, SCliReq, q);
|
||||
removeReqFromSendQ(pReq);
|
||||
notifyAndDestroyReq(conn, pReq, code);
|
||||
}
|
||||
}
|
||||
|
@ -1246,8 +1259,8 @@ static void cliHandleException(SCliConn* conn) {
|
|||
}
|
||||
|
||||
cliDestroyAllQidFromThrd(conn);
|
||||
QUEUE_REMOVE(&conn->q);
|
||||
if (conn->list) {
|
||||
if (pThrd->quit == false && conn->list) {
|
||||
QUEUE_REMOVE(&conn->q);
|
||||
conn->list->totalSize -= 1;
|
||||
conn->list = NULL;
|
||||
}
|
||||
|
@ -1273,7 +1286,8 @@ static void cliHandleException(SCliConn* conn) {
|
|||
bool filterToRmReq(void* h, void* arg) {
|
||||
queue* el = h;
|
||||
SCliReq* pReq = QUEUE_DATA(el, SCliReq, q);
|
||||
if (pReq->sent == 1 && REQUEST_NO_RESP(&pReq->msg)) {
|
||||
if (pReq->sent == 1 && pReq->inSendQ == 0 && REQUEST_NO_RESP(&pReq->msg)) {
|
||||
removeReqFromSendQ(pReq);
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
@ -1300,12 +1314,18 @@ static void cliBatchSendCb(uv_write_t* req, int status) {
|
|||
SCliThrd* pThrd = conn->hostThrd;
|
||||
STrans* pInst = pThrd->pInst;
|
||||
|
||||
while (!QUEUE_IS_EMPTY(&wrapper->node)) {
|
||||
queue* h = QUEUE_HEAD(&wrapper->node);
|
||||
SCliReq* pReq = QUEUE_DATA(h, SCliReq, sendQ);
|
||||
removeReqFromSendQ(pReq);
|
||||
}
|
||||
freeWReqToWQ(&conn->wq, wrapper);
|
||||
|
||||
int32_t ref = transUnrefCliHandle(conn);
|
||||
if (ref <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
cliConnRmReqs(conn);
|
||||
if (status != 0) {
|
||||
tDebug("%s conn %p failed to send msg since %s", CONN_GET_INST_LABEL(conn), conn, uv_err_name(status));
|
||||
|
@ -1340,6 +1360,9 @@ bool cliConnMayAddUserInfo(SCliConn* pConn, STransMsgHead** ppHead, int32_t* msg
|
|||
}
|
||||
STransMsgHead* pHead = *ppHead;
|
||||
STransMsgHead* tHead = taosMemoryCalloc(1, *msgLen + sizeof(pInst->user));
|
||||
if (tHead == NULL) {
|
||||
return false;
|
||||
}
|
||||
memcpy((char*)tHead, (char*)pHead, TRANS_MSG_OVERHEAD);
|
||||
memcpy((char*)tHead + TRANS_MSG_OVERHEAD, pInst->user, sizeof(pInst->user));
|
||||
|
||||
|
@ -1398,6 +1421,10 @@ int32_t cliBatchSend(SCliConn* pConn, int8_t direct) {
|
|||
|
||||
int j = 0;
|
||||
int32_t batchLimit = 64;
|
||||
|
||||
queue reqToSend;
|
||||
QUEUE_INIT(&reqToSend);
|
||||
|
||||
while (!transQueueEmpty(&pConn->reqsToSend)) {
|
||||
queue* h = transQueuePop(&pConn->reqsToSend);
|
||||
SCliReq* pCliMsg = QUEUE_DATA(h, SCliReq, q);
|
||||
|
@ -1422,6 +1449,10 @@ int32_t cliBatchSend(SCliConn* pConn, int8_t direct) {
|
|||
if (cliConnMayAddUserInfo(pConn, &pHead, &msgLen)) {
|
||||
content = transContFromHead(pHead);
|
||||
contLen = transContLenFromMsg(msgLen);
|
||||
} else {
|
||||
if (pConn->userInited == 0) {
|
||||
return terrno;
|
||||
}
|
||||
}
|
||||
if (pHead->comp == 0) {
|
||||
pHead->noResp = REQUEST_NO_RESP(pReq) ? 1 : 0;
|
||||
|
@ -1447,30 +1478,51 @@ int32_t cliBatchSend(SCliConn* pConn, int8_t direct) {
|
|||
wb[j++] = uv_buf_init((char*)pHead, msgLen);
|
||||
totalLen += msgLen;
|
||||
|
||||
pCliMsg->sent = 1;
|
||||
pCliMsg->seq = pConn->seq;
|
||||
pCliMsg->sent = 1;
|
||||
|
||||
STraceId* trace = &pCliMsg->msg.info.traceId;
|
||||
tGDebug("%s conn %p %s is sent to %s, local info:%s, seq:%" PRId64 ", sid:%" PRId64 "", CONN_GET_INST_LABEL(pConn),
|
||||
pConn, TMSG_INFO(pReq->msgType), pConn->dst, pConn->src, pConn->seq, pReq->info.qId);
|
||||
|
||||
transQueuePush(&pConn->reqsSentOut, &pCliMsg->q);
|
||||
QUEUE_INIT(&pCliMsg->sendQ);
|
||||
QUEUE_PUSH(&reqToSend, &pCliMsg->sendQ);
|
||||
|
||||
pCliMsg->inSendQ = 1;
|
||||
if (j >= batchLimit) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
transRefCliHandle(pConn);
|
||||
uv_write_t* req = allocWReqFromWQ(&pConn->wq, pConn);
|
||||
|
||||
if (req == NULL) {
|
||||
tError("%s conn %p failed to send msg since %s", CONN_GET_INST_LABEL(pConn), pConn, tstrerror(terrno));
|
||||
while (!QUEUE_IS_EMPTY(&reqToSend)) {
|
||||
queue* h = QUEUE_HEAD(&reqToSend);
|
||||
SCliReq* pCliMsg = QUEUE_DATA(h, SCliReq, sendQ);
|
||||
removeReqFromSendQ(pCliMsg);
|
||||
}
|
||||
|
||||
transRefCliHandle(pConn);
|
||||
return terrno;
|
||||
}
|
||||
|
||||
SWReqsWrapper* pWreq = req->data;
|
||||
|
||||
QUEUE_MOVE(&reqToSend, &pWreq->node);
|
||||
tDebug("%s conn %p start to send msg, batch size:%d, len:%d", CONN_GET_INST_LABEL(pConn), pConn, j, totalLen);
|
||||
|
||||
int32_t ret = uv_write(req, (uv_stream_t*)pConn->stream, wb, j, cliBatchSendCb);
|
||||
if (ret != 0) {
|
||||
tError("%s conn %p failed to send msg since %s", CONN_GET_INST_LABEL(pConn), pConn, uv_err_name(ret));
|
||||
while (!QUEUE_IS_EMPTY(&pWreq->node)) {
|
||||
queue* h = QUEUE_HEAD(&pWreq->node);
|
||||
SCliReq* pCliMsg = QUEUE_DATA(h, SCliReq, sendQ);
|
||||
removeReqFromSendQ(pCliMsg);
|
||||
}
|
||||
|
||||
freeWReqToWQ(&pConn->wq, req->data);
|
||||
code = TSDB_CODE_THIRDPARTY_ERROR;
|
||||
TAOS_UNUSED(transUnrefCliHandle(pConn));
|
||||
|
@ -2182,11 +2234,21 @@ static void cliAsyncCb(uv_async_t* handle) {
|
|||
if (pThrd->stopMsg != NULL) cliHandleQuit(pThrd, pThrd->stopMsg);
|
||||
}
|
||||
|
||||
static FORCE_INLINE void removeReqFromSendQ(SCliReq* pReq) {
|
||||
if (pReq == NULL || pReq->inSendQ == 0) {
|
||||
return;
|
||||
}
|
||||
QUEUE_REMOVE(&pReq->sendQ);
|
||||
pReq->inSendQ = 0;
|
||||
}
|
||||
|
||||
static FORCE_INLINE void destroyReq(void* arg) {
|
||||
SCliReq* pReq = arg;
|
||||
if (pReq == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
removeReqFromSendQ(pReq);
|
||||
STraceId* trace = &pReq->msg.info.traceId;
|
||||
tGDebug("free memory:%p, free ctx: %p", pReq, pReq->ctx);
|
||||
|
||||
|
@ -2961,6 +3023,7 @@ int32_t cliNotifyCb(SCliConn* pConn, SCliReq* pReq, STransMsg* pResp) {
|
|||
STrans* pInst = pThrd->pInst;
|
||||
|
||||
if (pReq != NULL) {
|
||||
removeReqFromSendQ(pReq);
|
||||
if (pResp->code != TSDB_CODE_SUCCESS) {
|
||||
if (cliMayRetry(pConn, pReq, pResp)) {
|
||||
return TSDB_CODE_RPC_ASYNC_IN_PROCESS;
|
||||
|
@ -3114,7 +3177,7 @@ static int32_t transInitMsg(void* pInstRef, const SEpSet* pEpSet, STransMsg* pRe
|
|||
if (ctx != NULL) pCtx->userCtx = *ctx;
|
||||
|
||||
pCliReq = taosMemoryCalloc(1, sizeof(SCliReq));
|
||||
if (pReq == NULL) {
|
||||
if (pCliReq == NULL) {
|
||||
TAOS_CHECK_GOTO(terrno, NULL, _exception);
|
||||
}
|
||||
|
||||
|
@ -3183,6 +3246,7 @@ int32_t transSendRequestWithId(void* pInstRef, const SEpSet* pEpSet, STransMsg*
|
|||
return TSDB_CODE_INVALID_PARA;
|
||||
}
|
||||
int32_t code = 0;
|
||||
int8_t transIdInited = 0;
|
||||
|
||||
STrans* pInst = (STrans*)transAcquireExHandle(transGetInstMgt(), (int64_t)pInstRef);
|
||||
if (pInst == NULL) {
|
||||
|
@ -3200,6 +3264,7 @@ int32_t transSendRequestWithId(void* pInstRef, const SEpSet* pEpSet, STransMsg*
|
|||
if (exh == NULL) {
|
||||
TAOS_CHECK_GOTO(TSDB_CODE_RPC_MODULE_QUIT, NULL, _exception);
|
||||
}
|
||||
transIdInited = 1;
|
||||
|
||||
pReq->info.handle = (void*)(*transpointId);
|
||||
pReq->info.qId = *transpointId;
|
||||
|
@ -3216,9 +3281,6 @@ int32_t transSendRequestWithId(void* pInstRef, const SEpSet* pEpSet, STransMsg*
|
|||
return (code == TSDB_CODE_RPC_ASYNC_MODULE_QUIT ? TSDB_CODE_RPC_MODULE_QUIT : code);
|
||||
}
|
||||
|
||||
// if (pReq->msgType == TDMT_SCH_DROP_TASK) {
|
||||
// TAOS_UNUSED(transReleaseCliHandle(pReq->info.handle));
|
||||
// }
|
||||
transReleaseExHandle(transGetRefMgt(), *transpointId);
|
||||
transReleaseExHandle(transGetInstMgt(), (int64_t)pInstRef);
|
||||
return 0;
|
||||
|
@ -3226,6 +3288,7 @@ int32_t transSendRequestWithId(void* pInstRef, const SEpSet* pEpSet, STransMsg*
|
|||
_exception:
|
||||
transFreeMsg(pReq->pCont);
|
||||
pReq->pCont = NULL;
|
||||
if (transIdInited) transReleaseExHandle(transGetRefMgt(), *transpointId);
|
||||
transReleaseExHandle(transGetInstMgt(), (int64_t)pInstRef);
|
||||
|
||||
tError("failed to send request since %s", tstrerror(code));
|
||||
|
@ -3641,6 +3704,7 @@ bool filterTimeoutReq(void* key, void* arg) {
|
|||
if (pReq->msg.info.qId == 0 && !REQUEST_NO_RESP(&pReq->msg) && pReq->ctx) {
|
||||
int64_t elapse = ((st - pReq->st) / 1000000);
|
||||
if (listArg && elapse >= listArg->pInst->readTimeout) {
|
||||
removeReqFromSendQ(pReq);
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
|
|
|
@ -423,6 +423,7 @@ int32_t transQueueInit(STransQueue* wq, void (*freeFunc)(void* arg)) {
|
|||
QUEUE_INIT(&wq->node);
|
||||
wq->freeFunc = (void (*)(void*))freeFunc;
|
||||
wq->size = 0;
|
||||
wq->inited = 1;
|
||||
return 0;
|
||||
}
|
||||
void transQueuePush(STransQueue* q, void* arg) {
|
||||
|
@ -497,6 +498,7 @@ void transQueueRemove(STransQueue* q, void* e) {
|
|||
bool transQueueEmpty(STransQueue* q) { return q->size == 0 ? true : false; }
|
||||
|
||||
void transQueueClear(STransQueue* q) {
|
||||
if (q->inited == 0) return;
|
||||
while (!QUEUE_IS_EMPTY(&q->node)) {
|
||||
queue* h = QUEUE_HEAD(&q->node);
|
||||
QUEUE_REMOVE(h);
|
||||
|
|
|
@ -1289,8 +1289,8 @@ static FORCE_INLINE SSvrConn* createConn(void* hThrd) {
|
|||
int32_t code = 0;
|
||||
SWorkThrd* pThrd = hThrd;
|
||||
int32_t lino;
|
||||
|
||||
SSvrConn* pConn = (SSvrConn*)taosMemoryCalloc(1, sizeof(SSvrConn));
|
||||
int8_t wqInited = 0;
|
||||
SSvrConn* pConn = (SSvrConn*)taosMemoryCalloc(1, sizeof(SSvrConn));
|
||||
if (pConn == NULL) {
|
||||
TAOS_CHECK_GOTO(TSDB_CODE_OUT_OF_MEMORY, &lino, _end);
|
||||
}
|
||||
|
@ -1340,6 +1340,7 @@ static FORCE_INLINE SSvrConn* createConn(void* hThrd) {
|
|||
|
||||
code = initWQ(&pConn->wq);
|
||||
TAOS_CHECK_GOTO(code, &lino, _end);
|
||||
wqInited = 1;
|
||||
|
||||
// init client handle
|
||||
pConn->pTcp = (uv_tcp_t*)taosMemoryMalloc(sizeof(uv_tcp_t));
|
||||
|
@ -1372,7 +1373,7 @@ _end:
|
|||
transDestroyBuffer(&pConn->readBuf);
|
||||
taosHashCleanup(pConn->pQTable);
|
||||
taosMemoryFree(pConn->pTcp);
|
||||
destroyWQ(&pConn->wq);
|
||||
if (wqInited) destroyWQ(&pConn->wq);
|
||||
taosMemoryFree(pConn->buf);
|
||||
taosMemoryFree(pConn);
|
||||
pConn = NULL;
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
add_executable(transportTest "")
|
||||
add_executable(transUT "")
|
||||
add_executable(transUT2 "")
|
||||
add_executable(svrBench "")
|
||||
add_executable(cliBench "")
|
||||
add_executable(httpBench "")
|
||||
|
@ -9,7 +10,11 @@ target_sources(transUT
|
|||
"transUT.cpp"
|
||||
)
|
||||
|
||||
target_sources(transportTest
|
||||
target_sources(transUT2
|
||||
PRIVATE
|
||||
"transUT2.cpp"
|
||||
)
|
||||
target_sources(transportTest
|
||||
PRIVATE
|
||||
"transportTests.cpp"
|
||||
)
|
||||
|
@ -25,16 +30,16 @@ target_sources(cliBench
|
|||
target_sources(httpBench
|
||||
PRIVATE
|
||||
"http_test.c"
|
||||
)
|
||||
)
|
||||
|
||||
target_include_directories(transportTest
|
||||
target_include_directories(transportTest
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_link_libraries (transportTest
|
||||
os
|
||||
target_link_libraries(transportTest
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
|
@ -42,67 +47,81 @@ target_link_libraries (transportTest
|
|||
function
|
||||
)
|
||||
|
||||
target_link_libraries (transUT
|
||||
os
|
||||
target_link_libraries(transUT
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
transport
|
||||
transport
|
||||
)
|
||||
|
||||
target_include_directories(transUT
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_link_libraries(transUT2
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
transport
|
||||
)
|
||||
|
||||
target_include_directories(transUT2
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_include_directories(svrBench
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_link_libraries (svrBench
|
||||
os
|
||||
target_link_libraries(svrBench
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
transport
|
||||
transport
|
||||
)
|
||||
|
||||
target_include_directories(cliBench
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_include_directories(httpBench
|
||||
PUBLIC
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${TD_SOURCE_DIR}/include/libs/transport"
|
||||
"${CMAKE_CURRENT_SOURCE_DIR}/../inc"
|
||||
)
|
||||
|
||||
target_link_libraries (cliBench
|
||||
os
|
||||
target_link_libraries(cliBench
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
transport
|
||||
transport
|
||||
)
|
||||
|
||||
target_link_libraries(httpBench
|
||||
os
|
||||
os
|
||||
util
|
||||
common
|
||||
gtest_main
|
||||
transport
|
||||
transport
|
||||
)
|
||||
|
||||
add_test(
|
||||
NAME transUT
|
||||
COMMAND transUT
|
||||
NAME transUT
|
||||
COMMAND transUT
|
||||
)
|
||||
add_test(
|
||||
NAME transUtilUt
|
||||
NAME transUtilUt
|
||||
COMMAND transportTest
|
||||
)
|
||||
|
|
|
@ -53,8 +53,6 @@ static void processResponse(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
|||
tDebug("thread:%d, response is received, type:%d contLen:%d code:0x%x", pInfo->index, pMsg->msgType, pMsg->contLen,
|
||||
pMsg->code);
|
||||
|
||||
if (pEpSet) pInfo->epSet = *pEpSet;
|
||||
|
||||
rpcFreeCont(pMsg->pCont);
|
||||
tsem_post(&pInfo->rspSem);
|
||||
}
|
||||
|
@ -72,12 +70,12 @@ static void *sendRequest(void *param) {
|
|||
rpcMsg.pCont = rpcMallocCont(pInfo->msgSize);
|
||||
rpcMsg.contLen = pInfo->msgSize;
|
||||
rpcMsg.info.ahandle = pInfo;
|
||||
rpcMsg.info.noResp = 1;
|
||||
rpcMsg.info.noResp = 0;
|
||||
rpcMsg.msgType = 1;
|
||||
tDebug("thread:%d, send request, contLen:%d num:%d", pInfo->index, pInfo->msgSize, pInfo->num);
|
||||
rpcSendRequest(pInfo->pRpc, &pInfo->epSet, &rpcMsg, NULL);
|
||||
if (pInfo->num % 20000 == 0) tInfo("thread:%d, %d requests have been sent", pInfo->index, pInfo->num);
|
||||
// tsem_wait(&pInfo->rspSem);
|
||||
tsem_wait(&pInfo->rspSem);
|
||||
}
|
||||
|
||||
tDebug("thread:%d, it is over", pInfo->index);
|
||||
|
@ -110,17 +108,15 @@ int main(int argc, char *argv[]) {
|
|||
rpcInit.label = "APP";
|
||||
rpcInit.numOfThreads = 1;
|
||||
rpcInit.cfp = processResponse;
|
||||
rpcInit.sessions = 100;
|
||||
rpcInit.sessions = 1000;
|
||||
rpcInit.idleTime = tsShellActivityTimer * 1000;
|
||||
rpcInit.user = "michael";
|
||||
|
||||
rpcInit.connType = TAOS_CONN_CLIENT;
|
||||
rpcInit.connLimitNum = 10;
|
||||
rpcInit.connLimitLock = 1;
|
||||
rpcInit.shareConnLimit = 16 * 1024;
|
||||
rpcInit.shareConnLimit = tsShareConnLimit;
|
||||
rpcInit.supportBatch = 1;
|
||||
|
||||
rpcDebugFlag = 135;
|
||||
rpcInit.compressSize = -1;
|
||||
rpcDebugFlag = 143;
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
if (strcmp(argv[i], "-p") == 0 && i < argc - 1) {
|
||||
} else if (strcmp(argv[i], "-i") == 0 && i < argc - 1) {
|
||||
|
@ -139,6 +135,10 @@ int main(int argc, char *argv[]) {
|
|||
} else if (strcmp(argv[i], "-u") == 0 && i < argc - 1) {
|
||||
} else if (strcmp(argv[i], "-k") == 0 && i < argc - 1) {
|
||||
} else if (strcmp(argv[i], "-spi") == 0 && i < argc - 1) {
|
||||
} else if (strcmp(argv[i], "-l") == 0 && i < argc - 1) {
|
||||
rpcInit.shareConnLimit = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-c") == 0 && i < argc - 1) {
|
||||
rpcInit.compressSize = atoi(argv[++i]);
|
||||
} else if (strcmp(argv[i], "-d") == 0 && i < argc - 1) {
|
||||
rpcDebugFlag = atoi(argv[++i]);
|
||||
} else {
|
||||
|
@ -150,6 +150,8 @@ int main(int argc, char *argv[]) {
|
|||
printf(" [-n requests]: number of requests per thread, default is:%d\n", numOfReqs);
|
||||
printf(" [-u user]: user name for the connection, default is:%s\n", rpcInit.user);
|
||||
printf(" [-d debugFlag]: debug flag, default:%d\n", rpcDebugFlag);
|
||||
printf(" [-c compressSize]: compress size, default:%d\n", tsCompressMsgSize);
|
||||
printf(" [-l shareConnLimit]: share conn limit, default:%d\n", tsShareConnLimit);
|
||||
printf(" [-h help]: print out this help\n\n");
|
||||
exit(0);
|
||||
}
|
||||
|
@ -168,18 +170,18 @@ int main(int argc, char *argv[]) {
|
|||
|
||||
int64_t now = taosGetTimestampUs();
|
||||
|
||||
SInfo *pInfo = (SInfo *)taosMemoryCalloc(1, sizeof(SInfo) * appThreads);
|
||||
SInfo *p = pInfo;
|
||||
SInfo **pInfo = (SInfo **)taosMemoryCalloc(1, sizeof(SInfo *) * appThreads);
|
||||
for (int i = 0; i < appThreads; ++i) {
|
||||
pInfo->index = i;
|
||||
pInfo->epSet = epSet;
|
||||
pInfo->numOfReqs = numOfReqs;
|
||||
pInfo->msgSize = msgSize;
|
||||
tsem_init(&pInfo->rspSem, 0, 0);
|
||||
pInfo->pRpc = pRpc;
|
||||
SInfo *p = taosMemoryCalloc(1, sizeof(SInfo));
|
||||
p->index = i;
|
||||
p->epSet = epSet;
|
||||
p->numOfReqs = numOfReqs;
|
||||
p->msgSize = msgSize;
|
||||
tsem_init(&p->rspSem, 0, 0);
|
||||
p->pRpc = pRpc;
|
||||
pInfo[i] = p;
|
||||
|
||||
taosThreadCreate(&pInfo->thread, NULL, sendRequest, pInfo);
|
||||
pInfo++;
|
||||
taosThreadCreate(&p->thread, NULL, sendRequest, pInfo[i]);
|
||||
}
|
||||
|
||||
do {
|
||||
|
@ -192,12 +194,14 @@ int main(int argc, char *argv[]) {
|
|||
tInfo("Performance: %.3f requests per second, msgSize:%d bytes", 1000.0 * numOfReqs * appThreads / usedTime, msgSize);
|
||||
|
||||
for (int i = 0; i < appThreads; i++) {
|
||||
SInfo *pInfo = p;
|
||||
taosThreadJoin(pInfo->thread, NULL);
|
||||
p++;
|
||||
SInfo *p = pInfo[i];
|
||||
taosThreadJoin(p->thread, NULL);
|
||||
taosMemoryFree(p);
|
||||
}
|
||||
int ch = getchar();
|
||||
UNUSED(ch);
|
||||
taosMemoryFree(pInfo);
|
||||
|
||||
// int ch = getchar();
|
||||
// UNUSED(ch);
|
||||
|
||||
taosCloseLog();
|
||||
|
||||
|
|
|
@ -76,23 +76,6 @@ void *processShellMsg(void *arg) {
|
|||
|
||||
for (int i = 0; i < numOfMsgs; ++i) {
|
||||
taosGetQitem(qall, (void **)&pRpcMsg);
|
||||
|
||||
if (pDataFile != NULL) {
|
||||
if (taosWriteFile(pDataFile, pRpcMsg->pCont, pRpcMsg->contLen) < 0) {
|
||||
tInfo("failed to write data file, reason:%s", strerror(errno));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (commit >= 2) {
|
||||
num += numOfMsgs;
|
||||
// if (taosFsync(pDataFile) < 0) {
|
||||
// tInfo("failed to flush data to file, reason:%s", strerror(errno));
|
||||
//}
|
||||
|
||||
if (num % 10000 == 0) {
|
||||
tInfo("%d request have been written into disk", num);
|
||||
}
|
||||
}
|
||||
|
||||
taosResetQitems(qall);
|
||||
|
@ -107,16 +90,7 @@ void *processShellMsg(void *arg) {
|
|||
rpcMsg.code = 0;
|
||||
rpcSendResponse(&rpcMsg);
|
||||
|
||||
void *handle = pRpcMsg->info.handle;
|
||||
taosFreeQitem(pRpcMsg);
|
||||
//{
|
||||
// SRpcMsg nRpcMsg = {0};
|
||||
// nRpcMsg.pCont = rpcMallocCont(msgSize);
|
||||
// nRpcMsg.contLen = msgSize;
|
||||
// nRpcMsg.info.handle = handle;
|
||||
// nRpcMsg.code = TSDB_CODE_CTG_NOT_READY;
|
||||
// rpcSendResponse(&nRpcMsg);
|
||||
//}
|
||||
}
|
||||
|
||||
taosUpdateItemSize(qinfo.queue, numOfMsgs);
|
||||
|
@ -149,12 +123,13 @@ int main(int argc, char *argv[]) {
|
|||
rpcInit.localPort = 7000;
|
||||
memcpy(rpcInit.localFqdn, "localhost", strlen("localhost"));
|
||||
rpcInit.label = "SER";
|
||||
rpcInit.numOfThreads = 1;
|
||||
rpcInit.numOfThreads = 10;
|
||||
rpcInit.cfp = processRequestMsg;
|
||||
rpcInit.idleTime = 2 * 1500;
|
||||
|
||||
taosVersionStrToInt(version, &(rpcInit.compatibilityVer));
|
||||
rpcDebugFlag = 131;
|
||||
rpcInit.compressSize = -1;
|
||||
|
||||
for (int i = 1; i < argc; ++i) {
|
||||
if (strcmp(argv[i], "-p") == 0 && i < argc - 1) {
|
||||
|
@ -205,8 +180,8 @@ int main(int argc, char *argv[]) {
|
|||
if (pDataFile == NULL) tInfo("failed to open data file, reason:%s", strerror(errno));
|
||||
}
|
||||
|
||||
int32_t numOfAthread = 5;
|
||||
multiQ = taosMemoryMalloc(sizeof(numOfAthread));
|
||||
int32_t numOfAthread = 1;
|
||||
multiQ = taosMemoryMalloc(sizeof(MultiThreadQhandle));
|
||||
multiQ->numOfThread = numOfAthread;
|
||||
multiQ->qhandle = (STaosQueue **)taosMemoryMalloc(sizeof(STaosQueue *) * numOfAthread);
|
||||
multiQ->qset = (STaosQset **)taosMemoryMalloc(sizeof(STaosQset *) * numOfAthread);
|
||||
|
@ -221,11 +196,6 @@ int main(int argc, char *argv[]) {
|
|||
threads[i].idx = i;
|
||||
taosThreadCreate(&(threads[i].thread), NULL, processShellMsg, (void *)&threads[i]);
|
||||
}
|
||||
// qhandle = taosOpenQueue();
|
||||
// qset = taosOpenQset();
|
||||
// taosAddIntoQset(qset, qhandle, NULL);
|
||||
|
||||
// processShellMsg();
|
||||
|
||||
if (pDataFile != NULL) {
|
||||
taosCloseFile(&pDataFile);
|
||||
|
|
|
@ -54,6 +54,7 @@ class Client {
|
|||
rpcInit_.user = (char *)user;
|
||||
rpcInit_.parent = this;
|
||||
rpcInit_.connType = TAOS_CONN_CLIENT;
|
||||
rpcInit_.shareConnLimit = 200;
|
||||
|
||||
taosVersionStrToInt(version, &(rpcInit_.compatibilityVer));
|
||||
this->transCli = rpcOpen(&rpcInit_);
|
||||
|
@ -85,6 +86,14 @@ class Client {
|
|||
SemWait();
|
||||
*resp = this->resp;
|
||||
}
|
||||
void sendReq(SRpcMsg *req) {
|
||||
SEpSet epSet = {0};
|
||||
epSet.inUse = 0;
|
||||
addEpIntoEpSet(&epSet, "127.0.0.1", 7000);
|
||||
|
||||
rpcSendRequest(this->transCli, &epSet, req, NULL);
|
||||
|
||||
}
|
||||
void SendAndRecvNoHandle(SRpcMsg *req, SRpcMsg *resp) {
|
||||
if (req->info.handle != NULL) {
|
||||
rpcReleaseHandle(req->info.handle, TAOS_CONN_CLIENT);
|
||||
|
@ -160,6 +169,7 @@ static void processReq(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
|||
rpcMsg.contLen = 100;
|
||||
rpcMsg.info = pMsg->info;
|
||||
rpcMsg.code = 0;
|
||||
rpcFreeCont(pMsg->pCont);
|
||||
rpcSendResponse(&rpcMsg);
|
||||
}
|
||||
|
||||
|
@ -264,6 +274,7 @@ class TransObj {
|
|||
cli->Stop();
|
||||
}
|
||||
void cliSendAndRecv(SRpcMsg *req, SRpcMsg *resp) { cli->SendAndRecv(req, resp); }
|
||||
void cliSendReq(SRpcMsg *req) { cli->sendReq(req); }
|
||||
void cliSendAndRecvNoHandle(SRpcMsg *req, SRpcMsg *resp) { cli->SendAndRecvNoHandle(req, resp); }
|
||||
|
||||
~TransObj() {
|
||||
|
@ -492,15 +503,16 @@ TEST_F(TransEnv, queryExcept) {
|
|||
TEST_F(TransEnv, noResp) {
|
||||
SRpcMsg resp = {0};
|
||||
SRpcMsg req = {0};
|
||||
// for (int i = 0; i < 5; i++) {
|
||||
// memset(&req, 0, sizeof(req));
|
||||
// req.info.noResp = 1;
|
||||
// req.msgType = 1;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
//}
|
||||
// taosMsleep(2000);
|
||||
for (int i = 0; i < 500000; i++) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.info.noResp = 1;
|
||||
req.msgType = 3;
|
||||
req.pCont = rpcMallocCont(10);
|
||||
req.contLen = 10;
|
||||
tr->cliSendReq(&req);
|
||||
//tr->cliSendAndRecv(&req, &resp);
|
||||
}
|
||||
taosMsleep(2000);
|
||||
|
||||
// no resp
|
||||
}
|
||||
|
|
|
@ -0,0 +1,529 @@
|
|||
/*
|
||||
* Copyright (c) 2019 TAOS Data, Inc. <jhtao@taosdata.com>
|
||||
*
|
||||
* This program is free software: you can use, redistribute, and/or modify
|
||||
* it under the terms of the GNU Affero General Public License, version 3 * or later ("AGPL"), as published by the Free
|
||||
* Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE.
|
||||
*
|
||||
* You should have received a copy of the GNU Affero General Public License
|
||||
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
#include <gtest/gtest.h>
|
||||
#include <cstdio>
|
||||
#include <cstring>
|
||||
#include "tdatablock.h"
|
||||
#include "tglobal.h"
|
||||
#include "tlog.h"
|
||||
#include "tmisce.h"
|
||||
#include "transLog.h"
|
||||
#include "trpc.h"
|
||||
#include "tversion.h"
|
||||
using namespace std;
|
||||
|
||||
const char *label = "APP";
|
||||
const char *secret = "secret";
|
||||
const char *user = "user";
|
||||
const char *ckey = "ckey";
|
||||
|
||||
class Server;
|
||||
int port = 7000;
|
||||
// server process
|
||||
// server except
|
||||
|
||||
typedef void (*CB)(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||
|
||||
static void processContinueSend(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||
static void processReleaseHandleCb(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||
static void processRegisterFailure(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||
static void processReq(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||
// client process;
|
||||
static void processResp(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet);
|
||||
class Client {
|
||||
public:
|
||||
void Init(int nThread) {
|
||||
memcpy(tsTempDir, TD_TMP_DIR_PATH, strlen(TD_TMP_DIR_PATH));
|
||||
memset(&rpcInit_, 0, sizeof(rpcInit_));
|
||||
rpcInit_.localPort = 0;
|
||||
rpcInit_.label = (char *)"client";
|
||||
rpcInit_.numOfThreads = nThread;
|
||||
rpcInit_.cfp = processResp;
|
||||
rpcInit_.user = (char *)user;
|
||||
rpcInit_.parent = this;
|
||||
rpcInit_.connType = TAOS_CONN_CLIENT;
|
||||
rpcInit_.shareConnLimit = 200;
|
||||
|
||||
taosVersionStrToInt(version, &(rpcInit_.compatibilityVer));
|
||||
this->transCli = rpcOpen(&rpcInit_);
|
||||
//tsem_init(&this->sem, 0, 0);
|
||||
}
|
||||
void SetResp(SRpcMsg *pMsg) {
|
||||
// set up resp;
|
||||
this->resp = *pMsg;
|
||||
}
|
||||
SRpcMsg *Resp() { return &this->resp; }
|
||||
|
||||
void Restart(CB cb) {
|
||||
rpcClose(this->transCli);
|
||||
rpcInit_.cfp = cb;
|
||||
taosVersionStrToInt(version, &(rpcInit_.compatibilityVer));
|
||||
this->transCli = rpcOpen(&rpcInit_);
|
||||
}
|
||||
void Stop() {
|
||||
rpcClose(this->transCli);
|
||||
this->transCli = NULL;
|
||||
}
|
||||
|
||||
void SendAndRecv(SRpcMsg *req, SRpcMsg *resp) {
|
||||
SEpSet epSet = {0};
|
||||
epSet.inUse = 0;
|
||||
addEpIntoEpSet(&epSet, "127.0.0.1", 7000);
|
||||
|
||||
rpcSendRequest(this->transCli, &epSet, req, NULL);
|
||||
SemWait();
|
||||
*resp = this->resp;
|
||||
}
|
||||
void sendReq(SRpcMsg *req) {
|
||||
SEpSet epSet = {0};
|
||||
epSet.inUse = 0;
|
||||
addEpIntoEpSet(&epSet, "127.0.0.1", 7000);
|
||||
|
||||
rpcSendRequest(this->transCli, &epSet, req, NULL);
|
||||
}
|
||||
|
||||
void sendReqWithId(SRpcMsg *req, int64_t *id) {
|
||||
SEpSet epSet = {0};
|
||||
epSet.inUse = 0;
|
||||
addEpIntoEpSet(&epSet, "127.0.0.1",7000);
|
||||
rpcSendRequestWithCtx(this->transCli, &epSet, req, id, NULL);
|
||||
|
||||
}
|
||||
void freeId(int64_t *id) {
|
||||
rpcFreeConnById(this->transCli, *id);
|
||||
}
|
||||
void SendAndRecvNoHandle(SRpcMsg *req, SRpcMsg *resp) {
|
||||
if (req->info.handle != NULL) {
|
||||
rpcReleaseHandle(req->info.handle, TAOS_CONN_CLIENT);
|
||||
req->info.handle = NULL;
|
||||
}
|
||||
SendAndRecv(req, resp);
|
||||
}
|
||||
|
||||
void SemWait() { tsem_wait(&this->sem); }
|
||||
void SemPost() { tsem_post(&this->sem); }
|
||||
void Reset() {}
|
||||
|
||||
~Client() {
|
||||
if (this->transCli) rpcClose(this->transCli);
|
||||
}
|
||||
|
||||
private:
|
||||
tsem_t sem;
|
||||
SRpcInit rpcInit_;
|
||||
void *transCli;
|
||||
SRpcMsg resp;
|
||||
};
|
||||
class Server {
|
||||
public:
|
||||
Server() {
|
||||
memcpy(tsTempDir, TD_TMP_DIR_PATH, strlen(TD_TMP_DIR_PATH));
|
||||
memset(&rpcInit_, 0, sizeof(rpcInit_));
|
||||
|
||||
memcpy(rpcInit_.localFqdn, "localhost", strlen("localhost"));
|
||||
rpcInit_.localPort = port;
|
||||
rpcInit_.label = (char *)"server";
|
||||
rpcInit_.numOfThreads = 5;
|
||||
rpcInit_.cfp = processReq;
|
||||
rpcInit_.user = (char *)user;
|
||||
rpcInit_.connType = TAOS_CONN_SERVER;
|
||||
taosVersionStrToInt(version, &(rpcInit_.compatibilityVer));
|
||||
}
|
||||
void Start() {
|
||||
this->transSrv = rpcOpen(&this->rpcInit_);
|
||||
taosMsleep(1000);
|
||||
}
|
||||
void SetSrvContinueSend(CB cb) {
|
||||
this->Stop();
|
||||
rpcInit_.cfp = cb;
|
||||
this->Start();
|
||||
}
|
||||
void Stop() {
|
||||
if (this->transSrv == NULL) return;
|
||||
rpcClose(this->transSrv);
|
||||
this->transSrv = NULL;
|
||||
}
|
||||
void SetSrvSend(void (*cfp)(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet)) {
|
||||
this->Stop();
|
||||
rpcInit_.cfp = cfp;
|
||||
this->Start();
|
||||
}
|
||||
void Restart() {
|
||||
this->Stop();
|
||||
this->Start();
|
||||
}
|
||||
~Server() {
|
||||
if (this->transSrv) rpcClose(this->transSrv);
|
||||
this->transSrv = NULL;
|
||||
}
|
||||
|
||||
private:
|
||||
SRpcInit rpcInit_;
|
||||
void *transSrv;
|
||||
};
|
||||
static void processReq(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||
SRpcMsg rpcMsg = {0};
|
||||
rpcMsg.pCont = rpcMallocCont(100);
|
||||
rpcMsg.contLen = 100;
|
||||
rpcMsg.info = pMsg->info;
|
||||
rpcMsg.code = 0;
|
||||
rpcFreeCont(pMsg->pCont);
|
||||
rpcSendResponse(&rpcMsg);
|
||||
}
|
||||
|
||||
static void processContinueSend(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||
// for (int i = 0; i < 10; i++) {
|
||||
// SRpcMsg rpcMsg = {0};
|
||||
// rpcMsg.pCont = rpcMallocCont(100);
|
||||
// rpcMsg.contLen = 100;
|
||||
// rpcMsg.info = pMsg->info;
|
||||
// rpcMsg.code = 0;
|
||||
// rpcSendResponse(&rpcMsg);
|
||||
// }
|
||||
}
|
||||
static void processReleaseHandleCb(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||
SRpcMsg rpcMsg = {0};
|
||||
rpcMsg.pCont = rpcMallocCont(100);
|
||||
rpcMsg.contLen = 100;
|
||||
rpcMsg.info = pMsg->info;
|
||||
rpcMsg.code = 0;
|
||||
rpcSendResponse(&rpcMsg);
|
||||
|
||||
rpcReleaseHandle(&pMsg->info, TAOS_CONN_SERVER);
|
||||
}
|
||||
static void processRegisterFailure(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||
// {
|
||||
// SRpcMsg rpcMsg1 = {0};
|
||||
// rpcMsg1.pCont = rpcMallocCont(100);
|
||||
// rpcMsg1.contLen = 100;
|
||||
// rpcMsg1.info = pMsg->info;
|
||||
// rpcMsg1.code = 0;
|
||||
// rpcRegisterBrokenLinkArg(&rpcMsg1);
|
||||
// }
|
||||
// taosMsleep(10);
|
||||
|
||||
// SRpcMsg rpcMsg = {0};
|
||||
// rpcMsg.pCont = rpcMallocCont(100);
|
||||
// rpcMsg.contLen = 100;
|
||||
// rpcMsg.info = pMsg->info;
|
||||
// rpcMsg.code = 0;
|
||||
// rpcSendResponse(&rpcMsg);
|
||||
}
|
||||
// client process;
|
||||
static void processResp(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet) {
|
||||
Client *client = (Client *)parent;
|
||||
rpcFreeCont(pMsg->pCont);
|
||||
STraceId *trace = (STraceId *)&pMsg->info.traceId;
|
||||
tGDebug("received resp %s",tstrerror(pMsg->code));
|
||||
}
|
||||
|
||||
static void initEnv() {
|
||||
dDebugFlag = 143;
|
||||
vDebugFlag = 0;
|
||||
mDebugFlag = 143;
|
||||
cDebugFlag = 0;
|
||||
jniDebugFlag = 0;
|
||||
tmrDebugFlag = 143;
|
||||
uDebugFlag = 143;
|
||||
rpcDebugFlag = 143;
|
||||
qDebugFlag = 0;
|
||||
wDebugFlag = 0;
|
||||
sDebugFlag = 0;
|
||||
tsdbDebugFlag = 0;
|
||||
tsLogEmbedded = 1;
|
||||
tsAsyncLog = 0;
|
||||
|
||||
std::string path = TD_TMP_DIR_PATH "transport";
|
||||
// taosRemoveDir(path.c_str());
|
||||
taosMkDir(path.c_str());
|
||||
|
||||
tstrncpy(tsLogDir, path.c_str(), PATH_MAX);
|
||||
if (taosInitLog("taosdlog", 1, false) != 0) {
|
||||
printf("failed to init log file\n");
|
||||
}
|
||||
}
|
||||
|
||||
class TransObj {
|
||||
public:
|
||||
TransObj() {
|
||||
initEnv();
|
||||
cli = new Client;
|
||||
cli->Init(1);
|
||||
srv = new Server;
|
||||
srv->Start();
|
||||
}
|
||||
|
||||
void RestartCli(CB cb) {
|
||||
//
|
||||
cli->Restart(cb);
|
||||
}
|
||||
void StopSrv() {
|
||||
//
|
||||
srv->Stop();
|
||||
}
|
||||
// call when link broken, and notify query or fetch stop
|
||||
void SetSrvContinueSend(void (*cfp)(void *parent, SRpcMsg *pMsg, SEpSet *pEpSet)) {
|
||||
///////
|
||||
srv->SetSrvContinueSend(cfp);
|
||||
}
|
||||
void RestartSrv() { srv->Restart(); }
|
||||
void StopCli() {
|
||||
///////
|
||||
cli->Stop();
|
||||
}
|
||||
void cliSendAndRecv(SRpcMsg *req, SRpcMsg *resp) { cli->SendAndRecv(req, resp); }
|
||||
void cliSendReq(SRpcMsg *req) { cli->sendReq(req); }
|
||||
|
||||
void cliSendReqWithId(SRpcMsg *req, int64_t *id) { cli->sendReqWithId(req, id);}
|
||||
void cliFreeReqId(int64_t *id) { cli->freeId(id);}
|
||||
void cliSendAndRecvNoHandle(SRpcMsg *req, SRpcMsg *resp) { cli->SendAndRecvNoHandle(req, resp); }
|
||||
|
||||
~TransObj() {
|
||||
delete cli;
|
||||
delete srv;
|
||||
}
|
||||
|
||||
private:
|
||||
Client *cli;
|
||||
Server *srv;
|
||||
};
|
||||
class TransEnv : public ::testing::Test {
|
||||
protected:
|
||||
virtual void SetUp() {
|
||||
// set up trans obj
|
||||
tr = new TransObj();
|
||||
}
|
||||
virtual void TearDown() {
|
||||
// tear down
|
||||
delete tr;
|
||||
}
|
||||
|
||||
TransObj *tr = NULL;
|
||||
};
|
||||
|
||||
TEST_F(TransEnv, 01sendAndRec) {
|
||||
// for (int i = 0; i < 10; i++) {
|
||||
// SRpcMsg req = {0}, resp = {0};
|
||||
// req.msgType = 0;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// assert(resp.code == 0);
|
||||
// }
|
||||
}
|
||||
|
||||
TEST_F(TransEnv, 02StopServer) {
|
||||
// for (int i = 0; i < 1; i++) {
|
||||
// SRpcMsg req = {0}, resp = {0};
|
||||
// req.msgType = 0;
|
||||
// req.info.ahandle = (void *)0x35;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// assert(resp.code == 0);
|
||||
// }
|
||||
// SRpcMsg req = {0}, resp = {0};
|
||||
// req.info.ahandle = (void *)0x35;
|
||||
// req.msgType = 1;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->StopSrv();
|
||||
// // tr->RestartSrv();
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// assert(resp.code != 0);
|
||||
}
|
||||
TEST_F(TransEnv, clientUserDefined) {
|
||||
// tr->RestartSrv();
|
||||
// for (int i = 0; i < 10; i++) {
|
||||
// SRpcMsg req = {0}, resp = {0};
|
||||
// req.msgType = 0;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// assert(resp.code == 0);
|
||||
// }
|
||||
|
||||
//////////////////
|
||||
}
|
||||
|
||||
TEST_F(TransEnv, cliPersistHandle) {
|
||||
// SRpcMsg resp = {0};
|
||||
// void *handle = NULL;
|
||||
// for (int i = 0; i < 10; i++) {
|
||||
// SRpcMsg req = {0};
|
||||
// req.info = resp.info;
|
||||
// req.info.persistHandle = 1;
|
||||
|
||||
// req.msgType = 1;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// // if (i == 5) {
|
||||
// // std::cout << "stop server" << std::endl;
|
||||
// // tr->StopSrv();
|
||||
// //}
|
||||
// // if (i >= 6) {
|
||||
// // EXPECT_TRUE(resp.code != 0);
|
||||
// //}
|
||||
// handle = resp.info.handle;
|
||||
// }
|
||||
// rpcReleaseHandle(handle, TAOS_CONN_CLIENT);
|
||||
// for (int i = 0; i < 10; i++) {
|
||||
// SRpcMsg req = {0};
|
||||
// req.msgType = 1;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// }
|
||||
|
||||
// taosMsleep(1000);
|
||||
//////////////////
|
||||
}
|
||||
|
||||
TEST_F(TransEnv, srvReleaseHandle) {
|
||||
// SRpcMsg resp = {0};
|
||||
// tr->SetSrvContinueSend(processReleaseHandleCb);
|
||||
// // tr->Restart(processReleaseHandleCb);
|
||||
// void *handle = NULL;
|
||||
// SRpcMsg req = {0};
|
||||
// for (int i = 0; i < 1; i++) {
|
||||
// memset(&req, 0, sizeof(req));
|
||||
// req.info = resp.info;
|
||||
// req.info.persistHandle = 1;
|
||||
// req.msgType = 1;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// // tr->cliSendAndRecvNoHandle(&req, &resp);
|
||||
// EXPECT_TRUE(resp.code == 0);
|
||||
// }
|
||||
//////////////////
|
||||
}
|
||||
// reopen later
|
||||
// TEST_F(TransEnv, cliReleaseHandleExcept) {
|
||||
// SRpcMsg resp = {0};
|
||||
// SRpcMsg req = {0};
|
||||
// for (int i = 0; i < 3; i++) {
|
||||
// memset(&req, 0, sizeof(req));
|
||||
// req.info = resp.info;
|
||||
// req.info.persistHandle = 1;
|
||||
// req.info.ahandle = (void *)1234;
|
||||
// req.msgType = 1;
|
||||
// req.pCont = rpcMallocCont(10);
|
||||
// req.contLen = 10;
|
||||
// tr->cliSendAndRecv(&req, &resp);
|
||||
// if (i == 1) {
|
||||
// std::cout << "stop server" << std::endl;
|
||||
// tr->StopSrv();
|
||||
// }
|
||||
// if (i > 1) {
|
||||
// EXPECT_TRUE(resp.code != 0);
|
||||
// }
|
||||
// }
|
||||
// //////////////////
|
||||
//}
|
||||
TEST_F(TransEnv, srvContinueSend) {
|
||||
// tr->SetSrvContinueSend(processContinueSend);
|
||||
// SRpcMsg req = {0}, resp = {0};
|
||||
// for (int i = 0; i < 10; i++) {
|
||||
// // memset(&req, 0, sizeof(req));
|
||||
// // memset(&resp, 0, sizeof(resp));
|
||||
// // req.msgType = 1;
|
||||
// // req.pCont = rpcMallocCont(10);
|
||||
// // req.contLen = 10;
|
||||
// // tr->cliSendAndRecv(&req, &resp);
|
||||
// }
|
||||
// taosMsleep(1000);
|
||||
}
|
||||
|
||||
TEST_F(TransEnv, srvPersistHandleExcept) {
|
||||
// tr->SetSrvContinueSend(processContinueSend);
|
||||
// // tr->SetCliPersistFp(cliPersistHandle);
|
||||
// SRpcMsg resp = {0};
|
||||
// SRpcMsg req = {0};
|
||||
// for (int i = 0; i < 5; i++) {
|
||||
// // memset(&req, 0, sizeof(req));
|
||||
// // req.info = resp.info;
|
||||
// // req.msgType = 1;
|
||||
// // req.pCont = rpcMallocCont(10);
|
||||
// // req.contLen = 10;
|
||||
// // tr->cliSendAndRecv(&req, &resp);
|
||||
// // if (i > 2) {
|
||||
// // tr->StopCli();
|
||||
// // break;
|
||||
// //}
|
||||
// }
|
||||
// taosMsleep(2000);
|
||||
// conn broken
|
||||
//
|
||||
}
|
||||
TEST_F(TransEnv, cliPersistHandleExcept) {
|
||||
// tr->SetSrvContinueSend(processContinueSend);
|
||||
// SRpcMsg resp = {0};
|
||||
// SRpcMsg req = {0};
|
||||
// for (int i = 0; i < 5; i++) {
|
||||
// // memset(&req, 0, sizeof(req));
|
||||
// // req.info = resp.info;
|
||||
// // req.msgType = 1;
|
||||
// // req.pCont = rpcMallocCont(10);
|
||||
// // req.contLen = 10;
|
||||
// // tr->cliSendAndRecv(&req, &resp);
|
||||
// // if (i > 2) {
|
||||
// // tr->StopSrv();
|
||||
// // break;
|
||||
// //}
|
||||
// }
|
||||
// taosMsleep(2000);
|
||||
// // conn broken
|
||||
//
|
||||
}
|
||||
|
||||
TEST_F(TransEnv, multiCliPersistHandleExcept) {
|
||||
// conn broken
|
||||
}
|
||||
TEST_F(TransEnv, queryExcept) {
|
||||
//taosMsleep(4 * 1000);
|
||||
}
|
||||
TEST_F(TransEnv, idTest) {
|
||||
SRpcMsg resp = {0};
|
||||
SRpcMsg req = {0};
|
||||
for (int i = 0; i < 50000; i++) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.info.noResp = 0;
|
||||
req.msgType = 3;
|
||||
req.pCont = rpcMallocCont(10);
|
||||
req.contLen = 10;
|
||||
int64_t id;
|
||||
tr->cliSendReqWithId(&req, &id);
|
||||
tr->cliFreeReqId(&id);
|
||||
}
|
||||
taosMsleep(1000);
|
||||
// no resp
|
||||
}
|
||||
TEST_F(TransEnv, noResp) {
|
||||
SRpcMsg resp = {0};
|
||||
SRpcMsg req = {0};
|
||||
for (int i = 0; i < 500000; i++) {
|
||||
memset(&req, 0, sizeof(req));
|
||||
req.info.noResp = 0;
|
||||
req.msgType = 3;
|
||||
req.pCont = rpcMallocCont(10);
|
||||
req.contLen = 10;
|
||||
tr->cliSendReq(&req);
|
||||
//tr->cliSendAndRecv(&req, &resp);
|
||||
}
|
||||
taosMsleep(10000);
|
||||
// no resp
|
||||
}
|
|
@ -223,10 +223,15 @@ int32_t taosMulModeMkDir(const char *dirname, int mode, bool checkAccess) {
|
|||
if (checkAccess && taosCheckAccessFile(temp, TD_FILE_ACCESS_EXIST_OK | TD_FILE_ACCESS_READ_OK | TD_FILE_ACCESS_WRITE_OK)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
code = chmod(temp, mode);
|
||||
if (-1 == code) {
|
||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||
return terrno;
|
||||
struct stat statbuf = {0};
|
||||
code = stat(temp, &statbuf);
|
||||
if (code != 0 || (statbuf.st_mode & mode) != mode) {
|
||||
terrno = TAOS_SYSTEM_ERROR(errno);
|
||||
return terrno;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -5,12 +5,11 @@ FIND_PATH(HEADER_GTEST_INCLUDE_DIR gtest.h /usr/include/gtest /usr/local/include
|
|||
FIND_LIBRARY(LIB_GTEST_STATIC_DIR libgtest.a /usr/lib/ /usr/local/lib /usr/lib64)
|
||||
FIND_LIBRARY(LIB_GTEST_SHARED_DIR libgtest.so /usr/lib/ /usr/local/lib /usr/lib64)
|
||||
|
||||
IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||
IF(HEADER_GTEST_INCLUDE_DIR AND(LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||
MESSAGE(STATUS "gTest library found, build os test")
|
||||
|
||||
INCLUDE_DIRECTORIES(${HEADER_GTEST_INCLUDE_DIR})
|
||||
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
|
||||
ENDIF()
|
||||
|
||||
INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/src/util/inc)
|
||||
|
|
|
@ -5,7 +5,7 @@ FIND_PATH(HEADER_GTEST_INCLUDE_DIR gtest.h /usr/include/gtest /usr/local/include
|
|||
FIND_LIBRARY(LIB_GTEST_STATIC_DIR libgtest.a /usr/lib/ /usr/local/lib /usr/lib64)
|
||||
FIND_LIBRARY(LIB_GTEST_SHARED_DIR libgtest.so /usr/lib/ /usr/local/lib /usr/lib64)
|
||||
|
||||
IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||
IF(HEADER_GTEST_INCLUDE_DIR AND(LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||
MESSAGE(STATUS "gTest library found, build unit test")
|
||||
|
||||
INCLUDE_DIRECTORIES(${HEADER_GTEST_INCLUDE_DIR})
|
||||
|
@ -20,18 +20,16 @@ IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
|||
LIST(APPEND SOURCE_LIST ${CMAKE_CURRENT_SOURCE_DIR}/hashTest.cpp)
|
||||
ADD_EXECUTABLE(hashTest ${SOURCE_LIST})
|
||||
TARGET_LINK_LIBRARIES(hashTest util common os gtest pthread)
|
||||
|
||||
|
||||
LIST(APPEND BIN_SRC ${CMAKE_CURRENT_SOURCE_DIR}/trefTest.c)
|
||||
ADD_EXECUTABLE(trefTest ${BIN_SRC})
|
||||
TARGET_LINK_LIBRARIES(trefTest common util)
|
||||
|
||||
ENDIF()
|
||||
|
||||
#IF (TD_LINUX)
|
||||
# ADD_EXECUTABLE(trefTest ./trefTest.c)
|
||||
# TARGET_LINK_LIBRARIES(trefTest util common)
|
||||
#ENDIF ()
|
||||
|
||||
# IF (TD_LINUX)
|
||||
# ADD_EXECUTABLE(trefTest ./trefTest.c)
|
||||
# TARGET_LINK_LIBRARIES(trefTest util common)
|
||||
# ENDIF ()
|
||||
INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/src/util/inc)
|
||||
INCLUDE_DIRECTORIES(${TD_SOURCE_DIR}/include/common)
|
||||
|
||||
|
@ -46,8 +44,8 @@ add_test(
|
|||
# # freelistTest
|
||||
# add_executable(freelistTest "")
|
||||
# target_sources(freelistTest
|
||||
# PRIVATE
|
||||
# "freelistTest.cpp"
|
||||
# PRIVATE
|
||||
# "freelistTest.cpp"
|
||||
# )
|
||||
# target_link_libraries(freelistTest os util gtest gtest_main)
|
||||
|
||||
|
@ -57,7 +55,7 @@ add_test(
|
|||
|
||||
# cfgTest
|
||||
add_executable(cfgTest "cfgTest.cpp")
|
||||
target_link_libraries(cfgTest os util gtest_main)
|
||||
target_link_libraries(cfgTest os util gtest_main)
|
||||
add_test(
|
||||
NAME cfgTest
|
||||
COMMAND cfgTest
|
||||
|
@ -65,7 +63,7 @@ add_test(
|
|||
|
||||
# bloomFilterTest
|
||||
add_executable(bloomFilterTest "bloomFilterTest.cpp")
|
||||
target_link_libraries(bloomFilterTest os util gtest_main)
|
||||
target_link_libraries(bloomFilterTest os util gtest_main)
|
||||
add_test(
|
||||
NAME bloomFilterTest
|
||||
COMMAND bloomFilterTest
|
||||
|
@ -73,7 +71,7 @@ add_test(
|
|||
|
||||
# taosbsearchTest
|
||||
add_executable(taosbsearchTest "taosbsearchTest.cpp")
|
||||
target_link_libraries(taosbsearchTest os util gtest_main)
|
||||
target_link_libraries(taosbsearchTest os util gtest_main)
|
||||
add_test(
|
||||
NAME taosbsearchTest
|
||||
COMMAND taosbsearchTest
|
||||
|
@ -81,7 +79,7 @@ add_test(
|
|||
|
||||
# trbtreeTest
|
||||
add_executable(rbtreeTest "trbtreeTest.cpp")
|
||||
target_link_libraries(rbtreeTest os util gtest_main)
|
||||
target_link_libraries(rbtreeTest os util gtest_main)
|
||||
add_test(
|
||||
NAME rbtreeTest
|
||||
COMMAND rbtreeTest
|
||||
|
@ -120,17 +118,17 @@ add_test(
|
|||
)
|
||||
|
||||
add_executable(regexTest "regexTest.cpp")
|
||||
target_link_libraries(regexTest os util gtest_main )
|
||||
target_link_libraries(regexTest os util gtest_main)
|
||||
add_test(
|
||||
NAME regexTest
|
||||
COMMAND regexTest
|
||||
)
|
||||
|
||||
add_executable(logTest "log.cpp")
|
||||
target_link_libraries(logTest os util common gtest_main)
|
||||
add_test(
|
||||
NAME logTest
|
||||
COMMAND logTest
|
||||
target_link_libraries(logTest os util common gtest_main)
|
||||
add_test(
|
||||
NAME logTest
|
||||
COMMAND logTest
|
||||
)
|
||||
|
||||
add_executable(decompressTest "decompressTest.cpp")
|
||||
|
@ -140,7 +138,7 @@ add_test(
|
|||
COMMAND decompressTest
|
||||
)
|
||||
|
||||
if (${TD_LINUX})
|
||||
if(${TD_LINUX})
|
||||
# terrorTest
|
||||
add_executable(terrorTest "terrorTest.cpp")
|
||||
target_link_libraries(terrorTest os util common gtest_main)
|
||||
|
@ -154,4 +152,4 @@ if (${TD_LINUX})
|
|||
add_custom_command(TARGET terrorTest POST_BUILD
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${ERR_TBL_FILE} $<TARGET_FILE_DIR:terrorTest>
|
||||
)
|
||||
endif ()
|
||||
endif()
|
||||
|
|
|
@ -5,15 +5,15 @@ FIND_PATH(HEADER_GTEST_INCLUDE_DIR gtest.h /usr/include/gtest /usr/local/include
|
|||
FIND_LIBRARY(LIB_GTEST_STATIC_DIR libgtest.a /usr/lib/ /usr/local/lib /usr/lib64 /usr/local/taos/driver/)
|
||||
FIND_LIBRARY(LIB_GTEST_SHARED_DIR libgtest.so /usr/lib/ /usr/local/lib /usr/lib64 /usr/local/taos/driver/)
|
||||
|
||||
IF (HEADER_GTEST_INCLUDE_DIR AND (LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||
IF(HEADER_GTEST_INCLUDE_DIR AND(LIB_GTEST_STATIC_DIR OR LIB_GTEST_SHARED_DIR))
|
||||
MESSAGE(STATUS "gTest library found, build os test")
|
||||
|
||||
INCLUDE_DIRECTORIES(${HEADER_GTEST_INCLUDE_DIR})
|
||||
AUX_SOURCE_DIRECTORY(${CMAKE_CURRENT_SOURCE_DIR} SOURCE_LIST)
|
||||
|
||||
ENDIF()
|
||||
|
||||
aux_source_directory(src OS_SRC)
|
||||
|
||||
# taoscTest
|
||||
add_executable(taoscTest "taoscTest.cpp")
|
||||
target_link_libraries(taoscTest taos os gtest_main)
|
||||
|
@ -25,4 +25,3 @@ add_test(
|
|||
NAME taoscTest
|
||||
COMMAND taoscTest
|
||||
)
|
||||
|
||||
|
|
Loading…
Reference in New Issue