Merge branch 'main' into merge/mainto3.0
This commit is contained in:
commit
94edf4b667
|
@ -107,12 +107,33 @@ node_url 是提供服务的 Anode 的 IP 和 PORT组成的字符串, 例如:`c
|
||||||
列出集群中所有的数据分析节点,包括其 `FQDN`, `PORT`, `STATUS`等属性。
|
列出集群中所有的数据分析节点,包括其 `FQDN`, `PORT`, `STATUS`等属性。
|
||||||
```sql
|
```sql
|
||||||
SHOW ANODES;
|
SHOW ANODES;
|
||||||
|
|
||||||
|
taos> show anodes;
|
||||||
|
id | url | status | create_time | update_time |
|
||||||
|
==================================================================================================================
|
||||||
|
1 | 192.168.0.1:6090 | ready | 2024-11-28 18:44:27.089 | 2024-11-28 18:44:27.089 |
|
||||||
|
Query OK, 1 row(s) in set (0.037205s)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 查看提供的时序数据分析服务
|
#### 查看提供的时序数据分析服务
|
||||||
|
|
||||||
```SQL
|
```SQL
|
||||||
SHOW ANODES FULL;
|
SHOW ANODES FULL;
|
||||||
|
|
||||||
|
taos> show anodes full;
|
||||||
|
id | type | algo |
|
||||||
|
============================================================================
|
||||||
|
1 | anomaly-detection | shesd |
|
||||||
|
1 | anomaly-detection | iqr |
|
||||||
|
1 | anomaly-detection | ksigma |
|
||||||
|
1 | anomaly-detection | lof |
|
||||||
|
1 | anomaly-detection | grubbs |
|
||||||
|
1 | anomaly-detection | ad_encoder |
|
||||||
|
1 | forecast | holtwinters |
|
||||||
|
1 | forecast | arima |
|
||||||
|
Query OK, 8 row(s) in set (0.008796s)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
#### 刷新集群中的分析算法缓存
|
#### 刷新集群中的分析算法缓存
|
||||||
|
|
|
@ -21,7 +21,7 @@ Anode的主要目录结构如下图所示
|
||||||
.
|
.
|
||||||
├── cfg
|
├── cfg
|
||||||
├── model
|
├── model
|
||||||
│ └── ad_detection
|
│ └── ad_autoencoder
|
||||||
├── release
|
├── release
|
||||||
├── script
|
├── script
|
||||||
└── taosanalytics
|
└── taosanalytics
|
||||||
|
@ -63,7 +63,7 @@ Anode采用算法自动加载模式,因此只识别符合命名约定的 Pytho
|
||||||
|
|
||||||
```SQL
|
```SQL
|
||||||
--- algo 后面的参数 name 即为类属性 `name`
|
--- algo 后面的参数 name 即为类属性 `name`
|
||||||
SELECT COUNT(*) FROM foo ANOMALY_DETECTION(col_name, 'algo=name')
|
SELECT COUNT(*) FROM foo ANOMALY_WINDOW(col_name, 'algo=name')
|
||||||
```
|
```
|
||||||
|
|
||||||
## 添加具有模型的分析算法
|
## 添加具有模型的分析算法
|
||||||
|
@ -72,11 +72,32 @@ SELECT COUNT(*) FROM foo ANOMALY_DETECTION(col_name, 'algo=name')
|
||||||
将具有模型的分析算法添加到 Anode 中,首先需要在 `model` 目录中建立该算法对应的目录(目录名称可自拟),将采用该算法针对不同的输入时间序列数据生成的训练模型均需要保存在该目录下,同时目录名称要在分析算法中确定,以便能够固定加载该目录下的分析模型。为了确保模型能够正常读取加载,存储的模型使用`joblib`库进行序列化保存。
|
将具有模型的分析算法添加到 Anode 中,首先需要在 `model` 目录中建立该算法对应的目录(目录名称可自拟),将采用该算法针对不同的输入时间序列数据生成的训练模型均需要保存在该目录下,同时目录名称要在分析算法中确定,以便能够固定加载该目录下的分析模型。为了确保模型能够正常读取加载,存储的模型使用`joblib`库进行序列化保存。
|
||||||
|
|
||||||
下面以自编码器(Autoencoder)为例,说明如何添加要预先训练的模型进行异常检测。
|
下面以自编码器(Autoencoder)为例,说明如何添加要预先训练的模型进行异常检测。
|
||||||
首先我们在`model`目录中创建一个目录 -- `ad_detection`,该目录将用来保存所有使用自编码器训练的模型。然后,我们使用自编码器对 foo 表的时间序列数据进行训练,得到模型 ad_autoencoder_foo,使用 `joblib`序列化以后保存在`ad_detection` 目录中。
|
首先我们在 `model `目录中创建一个目录 -- `ad_autoencoder` (见上图目录结构),该目录将用来保存所有使用自编码器训练的模型。然后,我们使用自编码器对 foo 表的时间序列数据进行训练,得到模型 针对 foo 表的模型,我们将其命名为 `ad_autoencoder_foo`,使用 `joblib`序列化该模型以后保存在 `ad_autoencoder` 目录中。如下图所示,ad_autoencoder_foo 由两个文件构成,分别是模型文件 (ad_autoencoder_foo.dat) 和模型文件描述文件 (ad_autoencoder_foo.info)。
|
||||||
|
|
||||||
使用 SQL 调用已经保存的模型,需要在调用参数中指定模型名称``model=ad_autoencoder_foo`,而 `algo=encoder` 是确定调用的自编码器生成的模型(这里的`encoder`说明调用的是自编码器算法模型,该名称是添加算法的时候在代码中定义)以便能够调用该模型。
|
```bash
|
||||||
|
.
|
||||||
|
├── cfg
|
||||||
|
├── model
|
||||||
|
│ └── ad_autoencoder
|
||||||
|
│ ├── ad_autoencoder_foo.dat
|
||||||
|
│ └── ad_autoencoder_foo.info
|
||||||
|
├── release
|
||||||
|
├── script
|
||||||
|
└── taosanalytics
|
||||||
|
├── algo
|
||||||
|
│ ├── ad
|
||||||
|
│ └── fc
|
||||||
|
├── misc
|
||||||
|
└── test
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
接下来说明如何使用 SQL 调用该模型。
|
||||||
|
通过设置参数 `algo=ad_encoder` 告诉分析平台要调用自编码器算法训练的模型(自编码器算法在可用算法列表中),因此直接指定即可。此外还需要指定自编码器针对某数据集训练的确定的模型,此时我们需要使用已经保存的模型 `ad_autoencoder_foo` ,因此需要添加参数 `model=ad_autoencoder_foo` 以便能够调用该模型。
|
||||||
|
|
||||||
```SQL
|
```SQL
|
||||||
--- 在 options 中增加 model 的名称,ad_autoencoder_foo, 针对 foo 数据集(表)训练的采用自编码器的异常检测模型进行异常检测
|
--- 在 options 中增加 model 的名称,ad_autoencoder_foo, 针对 foo 数据集(表)训练的采用自编码器的异常检测模型进行异常检测
|
||||||
SELECT COUNT(*), _WSTART FROM foo ANOMALY_DETECTION(col1, 'algo=encoder, model=ad_autoencoder_foo');
|
SELECT COUNT(*), _WSTART
|
||||||
|
FROM foo
|
||||||
|
ANOMALY_WINDOW(col1, 'algo=ad_encoder, model=ad_autoencoder_foo');
|
||||||
```
|
```
|
||||||
|
|
|
@ -89,6 +89,9 @@ taos -h h1.taos.com -s "use db; show tables;"
|
||||||
|
|
||||||
也可以通过配置文件中的参数设置来控制 TDengine CLI 的行为。可用配置参数请参考[客户端配置](../../components/taosc)
|
也可以通过配置文件中的参数设置来控制 TDengine CLI 的行为。可用配置参数请参考[客户端配置](../../components/taosc)
|
||||||
|
|
||||||
|
## 错误代码表
|
||||||
|
在 TDengine 3.3.5.0 版本后 TDengine CLI 在返回的错误信息中包含了具体的错误代码,用户可到 TDengine 官网的错误代码详细说明页面查找具体原因及解决措施,见:[错误码参考表](../error_code/)
|
||||||
|
|
||||||
## TDengine CLI TAB 键补全
|
## TDengine CLI TAB 键补全
|
||||||
|
|
||||||
- TAB 键前为空命令状态下按 TAB 键,会列出 TDengine CLI 支持的所有命令
|
- TAB 键前为空命令状态下按 TAB 键,会列出 TDengine CLI 支持的所有命令
|
||||||
|
|
|
@ -12,31 +12,31 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
## rpc
|
## rpc
|
||||||
|
|
||||||
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
||||||
| ---------- | -------------------------------------------------------------- | --------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
|
| ---------- | -----------------------------| --- | --- |
|
||||||
| 0x8000000B | 无法正常收发请求 | 1. 网络不通 2. 多次重试、依然不能执行REQ | 1. 检查网络 2. 分析日志,具体原因比较复杂 |
|
| 0x8000000B | Unable to establish connection | 1.网络不通 2.多次重试、依然不能执行请求 | 1.检查网络 2.分析日志,具体原因比较复杂 |
|
||||||
| 0x80000013 | 客户端和服务端之间的时间时间相差太大, 默认900s | 1. 客户端和服务端不在同一个时区 2. 客户端和服务端在同一个时区,但是两者的时间不同步、相差太大 | 1. 调整到同一个时区 2. 校准客户端和服务端的时间 |
|
| 0x80000013 | Client and server's time is not synchronized | 1.客户端和服务端不在同一个时区 2.客户端和服务端在同一个时区,但是两者的时间不同步,相差超过 900 秒 | 1.调整到同一个时区 2.校准客户端和服务端的时间|
|
||||||
| 0x80000015 | 无法解析FQDN | 设置了无效的fqdn | 检查fqdn 的设置 |
|
| 0x80000015 | Unable to resolve FQDN | 设置了无效的 fqdn | 检查fqdn 的设置 |
|
||||||
| 0x80000017 | 当前端口被占用 | 端口P已经被某个服务占用的情况下,新启的服务依然尝试绑定端口P | 1. 改动新服务的服务端口 2. 杀死之前占用端口的服务 |
|
| 0x80000017 | Port already in use | 端口已经被某个服务占用的情况下,新启的服务依然尝试绑定该端口 | 1.改动新服务的服务端口 2.杀死之前占用端口的服务 |
|
||||||
| 0x80000018 | 由于网络抖动/ REQ 请求时间过长导致系统主动摘掉REQ 所使用的conn | 1. 网络抖动 2. REQ 请求时间过长,大于900s | 1. 设置系统的最大超时时长 2. 检查REQ的请求时长 |
|
| 0x80000018 | Conn is broken | 由于网络抖动或者请求时间过长(超过 900 秒),导致系统主动摘掉连接 | 1.设置系统的最大超时时长 2.检查请求时长 |
|
||||||
| 0x80000019 | 暂时没有用到这个错误码 | | |
|
| 0x80000019 | Conn read timeout | 未启用 | |
|
||||||
| 0x80000020 | 多次重试之后,所有dnode 依然都链接不上 | 1. 所有的节点都挂了 2. 有节点挂了,但是存活的节点都不是master 节点 | 1. 查看taosd 的状态、分析taosd 挂掉的原因或者分析存活的taosd 为什么不是主 |
|
| 0x80000020 | some vnode/qnode/mnode(s) out of service | 多次重试之后,仍然无法连接到集群,可能是所有的节点都宕机了,或者存活的节点不是 Leader 节点 | 1.查看 taosd 的状态、分析 taosd 宕机的原因 2.分析存活的 taosd 为什么无法选取 Leader |
|
||||||
| 0x80000021 | 多次重试之后,所有dnode 依然都链接不上 | 1. 网络异常 2. req请求时间太长,服务端可能发生死锁等问题。系统自己断开了链接 | 1. 检查网络 2. 检查req 的执行时间 |
|
| 0x80000021 | some vnode/qnode/mnode(s) conn is broken | 多次重试之后,仍然无法连接到集群,可能是网络异常、请求时间太长、服务端死锁等问题 | 1.检查网络 2.请求的执行时间 |
|
||||||
| 0x80000022 | 达到了可用链接上线。 | 1. 并发太高、占用链接已经到达上线。 2. 服务端的BUG,导致conn 一直不释放, | 1. 提高tsNumOfRpcSessions这个值。 2. tsTimeToGetAvailableConn 3. 分析服务端不释放的conn 的原因 |
|
| 0x80000022 | rpc open too many session | 1.并发太高导致占用链接已经到达上限 2.服务端的 BUG,导致连接一直不释放 | 1.调整配置参数 numOfRpcSessions 2.调整配置参数 timeToGetAvailableConn 3.分析服务端不释放的连接的原因 |
|
||||||
|
|
||||||
|
|
||||||
## common
|
## common
|
||||||
|
|
||||||
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
||||||
| ---------- | --------------------------------- | -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------- |
|
| ---------- | -----------------------------| --- | --- |
|
||||||
| 0x80000100 | Operation not supported | 1. 操作不被支持、不允许的场景 | 1. 检查操作是否有误,确认该功能是否被支持 |
|
| 0x80000100 | Operation not supported | 操作不被支持、不允许的场景 | 检查操作是否有误,确认该功能是否被支持 |
|
||||||
| 0x80000102 | Out of Memory | 1. 客户端或服务端内存分配失败的场景 | 1. 检查客户端、服务端内存是否充足 |
|
| 0x80000102 | Out of Memory | 客户端或服务端内存分配失败的场景 | 检查客户端、服务端内存是否充足 |
|
||||||
| 0x80000104 | Data file corrupted | 1. 存储数据文件损坏 2. udf文件无法创建 | 1. 联系涛思客户支持 2. 确认服务端对临时目录有读写创建文件权限 |
|
| 0x80000104 | Data file corrupted | 1.存储数据文件损坏 2.udf 文件无法创建 | 1.联系涛思客户支持 2.确认服务端对临时目录有读写创建文件权限 |
|
||||||
| 0x80000106 | too many Ref Objs | 无可用ref资源 | 保留现场和日志,github上报issue |
|
| 0x80000106 | too many Ref Objs | 无可用ref资源 | 保留现场和日志,github 上报 issue |
|
||||||
| 0x80000107 | Ref ID is removed | 引用的ref资源已经释放 | 保留现场和日志,github上报issue |
|
| 0x80000107 | Ref ID is removed | 引用的ref资源已经释放 | 保留现场和日志,github 上报 issue |
|
||||||
| 0x80000108 | Invalid Ref ID | 无效ref ID | 保留现场和日志,github上报issue |
|
| 0x80000108 | Invalid Ref ID | 无效ref ID | 保留现场和日志,github 上报 issue |
|
||||||
| 0x8000010A | Ref is not there | ref信息不存在 | 保留现场和日志,github上报issue |
|
| 0x8000010A | Ref is not there | ref 信息不存在 | 保留现场和日志,github 上报 issue |
|
||||||
| 0x80000110 | | | |
|
| 0x80000110 | Unexpected generic error | 系统内部错误 | 保留现场和日志,github 上报 issue |
|
||||||
| 0x80000111 | Action in progress | 操作进行中 | 1. 等待操作完成 2. 根据需要取消操作 3. 当超出合理时间仍然未完成可保留现场和日志,或联系客户支持 |
|
| 0x80000111 | Action in progress | 操作进行中 | 1.等待操作完成 2.根据需要取消操作 3.当超出合理时间仍然未完成可保留现场和日志,或联系客户支持 |
|
||||||
| 0x80000112 | Out of range | 配置参数超出允许值范围 | 更改参数 |
|
| 0x80000112 | Out of range | 配置参数超出允许值范围 | 更改参数 |
|
||||||
| 0x80000115 | Invalid message | 消息错误 | 1. 检查是否存在节点间版本不一致 2. 保留现场和日志,github上报issue |
|
| 0x80000115 | Invalid message | 消息错误 | 1. 检查是否存在节点间版本不一致 2. 保留现场和日志,github上报issue |
|
||||||
| 0x80000116 | Invalid message len | 消息长度错误 | 1. 检查是否存在节点间版本不一致 2. 保留现场和日志,github上报issue |
|
| 0x80000116 | Invalid message len | 消息长度错误 | 1. 检查是否存在节点间版本不一致 2. 保留现场和日志,github上报issue |
|
||||||
|
@ -309,11 +309,11 @@ description: TDengine 服务端的错误码列表和详细说明
|
||||||
|
|
||||||
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
| 错误码 | 错误描述 | 可能的出错场景或者可能的原因 | 建议用户采取的措施 |
|
||||||
| ---------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
|
| ---------- | ---------------------------- | ----------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------ |
|
||||||
| 0x80000903 | Sync timeout | 场景1:发生了切主;旧主节点上已经开始协商但尚未达成一致的请求将超时。 场景2:从节点响应超时,导致协商超时。 | 检查集群状态,例如:show vgroups;查看服务端日志,以及服务端节点之间的网络状况。 |
|
| 0x80000903 | Sync timeout | 场景1:发生了切主 旧主节点上已经开始协商但尚未达成一致的请求将超时。 场景2:从节点响应超时,导致协商超时。 | 检查集群状态,例如:show vgroups 查看服务端日志,以及服务端节点之间的网络状况。 |
|
||||||
| 0x8000090C | Sync leader is unreachable | 场景1:选主过程中 场景2:客户端请求路由到了从节点,且重定向失败 场景3:客户端或服务端网络配置错误 | 检查集群状态、网络配置、应用程序访问状态等。查看服务端日志,以及服务端节点之间的网络状况。 |
|
| 0x8000090C | Sync leader is unreachable | 场景1:选主过程中 场景2:客户端请求路由到了从节点,且重定向失败 场景3:客户端或服务端网络配置错误 | 检查集群状态、网络配置、应用程序访问状态等。查看服务端日志,以及服务端节点之间的网络状况。 |
|
||||||
| 0x8000090F | Sync new config error | 成员变更配置错误 | 内部错误,用户无法干预 |
|
| 0x8000090F | Sync new config error | 成员变更配置错误 | 内部错误,用户无法干预 |
|
||||||
| 0x80000911 | Sync not ready to propose | 场景1:恢复未完成 | 检查集群状态,例如:show vgroups。查看服务端日志,以及服务端节点之间的网络状况。 |
|
| 0x80000911 | Sync not ready to propose | 场景1:恢复未完成 | 检查集群状态,例如:show vgroups。查看服务端日志,以及服务端节点之间的网络状况。 |
|
||||||
| 0x80000914 | Sync leader is restoring | 场景1:发生了切主;选主后,日志重演中 | 检查集群状态,例如:show vgroups。查看服务端日志,观察恢复进度。 |
|
| 0x80000914 | Sync leader is restoring | 场景1:发生了切主 选主后,日志重演中 | 检查集群状态,例如:show vgroups。查看服务端日志,观察恢复进度。 |
|
||||||
| 0x80000915 | Sync invalid snapshot msg | 快照复制消息错误 | 服务端内部错误 |
|
| 0x80000915 | Sync invalid snapshot msg | 快照复制消息错误 | 服务端内部错误 |
|
||||||
| 0x80000916 | Sync buffer is full | 场景1:客户端请求并发数特别大,超过了服务端处理能力,或者因为网络和CPU资源严重不足,或者网络连接问题等。 | 检查集群状态,系统资源使用率(例如磁盘IO、CPU、网络通信等),以及节点之间网络连接状况。 |
|
| 0x80000916 | Sync buffer is full | 场景1:客户端请求并发数特别大,超过了服务端处理能力,或者因为网络和CPU资源严重不足,或者网络连接问题等。 | 检查集群状态,系统资源使用率(例如磁盘IO、CPU、网络通信等),以及节点之间网络连接状况。 |
|
||||||
| 0x80000917 | Sync write stall | 场景1:状态机执行被阻塞,例如因系统繁忙,磁盘IO资源严重不足,或落盘失败等 | 检查集群状态,系统资源使用率(例如磁盘IO和CPU等),以及是否发生了落盘失败等。 |
|
| 0x80000917 | Sync write stall | 场景1:状态机执行被阻塞,例如因系统繁忙,磁盘IO资源严重不足,或落盘失败等 | 检查集群状态,系统资源使用率(例如磁盘IO和CPU等),以及是否发生了落盘失败等。 |
|
||||||
|
|
|
@ -0,0 +1,94 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Define log file and result files
|
||||||
|
LOG_FILE="test_server.log"
|
||||||
|
SUCCESS_FILE="success.txt"
|
||||||
|
FAILED_FILE="failed.txt"
|
||||||
|
|
||||||
|
# Initialize/clear result files
|
||||||
|
> "$SUCCESS_FILE"
|
||||||
|
> "$FAILED_FILE"
|
||||||
|
> "$LOG_FILE"
|
||||||
|
|
||||||
|
# Switch to the target directory
|
||||||
|
TARGET_DIR="../../tests/system-test/"
|
||||||
|
|
||||||
|
echo "===== Changing Directory to $TARGET_DIR =====" | tee -a "$LOG_FILE"
|
||||||
|
|
||||||
|
if cd "$TARGET_DIR"; then
|
||||||
|
echo "Successfully changed directory to $TARGET_DIR" | tee -a "$LOG_FILE"
|
||||||
|
else
|
||||||
|
echo "ERROR: Failed to change directory to $TARGET_DIR" | tee -a "$LOG_FILE"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Define the Python commands to execute :case list
|
||||||
|
commands=(
|
||||||
|
"python3 ./test.py -f 2-query/join.py"
|
||||||
|
"python3 ./test.py -f 1-insert/insert_column_value.py"
|
||||||
|
"python3 ./test.py -f 2-query/primary_ts_base_5.py"
|
||||||
|
"python3 ./test.py -f 2-query/case_when.py"
|
||||||
|
"python3 ./test.py -f 2-query/partition_limit_interval.py"
|
||||||
|
"python3 ./test.py -f 2-query/fill.py"
|
||||||
|
"python3 ./test.py -f query/query_basic.py -N 3"
|
||||||
|
"python3 ./test.py -f 7-tmq/basic5.py"
|
||||||
|
"python3 ./test.py -f 8-stream/stream_basic.py"
|
||||||
|
"python3 ./test.py -f 6-cluster/5dnode3mnodeStop.py -N 5 -M 3"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Counters
|
||||||
|
total=${#commands[@]}
|
||||||
|
success_count=0
|
||||||
|
fail_count=0
|
||||||
|
|
||||||
|
# Execute each command
|
||||||
|
for cmd in "${commands[@]}"
|
||||||
|
do
|
||||||
|
echo "===== Executing Command: $cmd =====" | tee -a "$LOG_FILE"
|
||||||
|
# Execute the command and append output and errors to the log file
|
||||||
|
eval "$cmd" >> "$LOG_FILE" 2>&1
|
||||||
|
exit_code=$?
|
||||||
|
|
||||||
|
if [ $exit_code -eq 0 ]; then
|
||||||
|
echo "SUCCESS: $cmd" | tee -a "$LOG_FILE"
|
||||||
|
echo "$cmd" >> "$SUCCESS_FILE"
|
||||||
|
((success_count++))
|
||||||
|
else
|
||||||
|
echo "FAILED: $cmd" | tee -a "$LOG_FILE"
|
||||||
|
echo "$cmd" >> "$FAILED_FILE"
|
||||||
|
((fail_count++))
|
||||||
|
fi
|
||||||
|
echo "" | tee -a "$LOG_FILE" # Add an empty line for separation
|
||||||
|
done
|
||||||
|
|
||||||
|
# Generate the final report
|
||||||
|
echo "===== Test Completed =====" | tee -a "$LOG_FILE"
|
||||||
|
echo "Total Commands Executed: $total" | tee -a "$LOG_FILE"
|
||||||
|
echo "Successful: $success_count" | tee -a "$LOG_FILE"
|
||||||
|
echo "Failed: $fail_count" | tee -a "$LOG_FILE"
|
||||||
|
|
||||||
|
if [ $fail_count -ne 0 ]; then
|
||||||
|
echo "" | tee -a "$LOG_FILE"
|
||||||
|
echo "The following commands failed:" | tee -a "$LOG_FILE"
|
||||||
|
cat "$FAILED_FILE" | tee -a "$LOG_FILE"
|
||||||
|
else
|
||||||
|
echo "All commands executed successfully." | tee -a "$LOG_FILE"
|
||||||
|
fi
|
||||||
|
|
||||||
|
# Optional: Generate a separate report file
|
||||||
|
echo "" > "report.txt"
|
||||||
|
echo "===== Test Report =====" >> "report.txt"
|
||||||
|
echo "Total Commands Executed: $total" >> "report.txt"
|
||||||
|
echo "Successful: $success_count" >> "report.txt"
|
||||||
|
echo "Failed: $fail_count" >> "report.txt"
|
||||||
|
|
||||||
|
if [ $fail_count -ne 0 ]; then
|
||||||
|
echo "" >> "report.txt"
|
||||||
|
echo "The following commands failed:" >> "report.txt"
|
||||||
|
cat "$FAILED_FILE" >> "report.txt"
|
||||||
|
else
|
||||||
|
echo "All commands executed successfully." >> "report.txt"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Detailed logs can be found in $LOG_FILE"
|
||||||
|
echo "Test report can be found in report.txt"
|
|
@ -53,6 +53,7 @@ TAOS_DEFINE_ERROR(TSDB_CODE_RPC_PORT_EADDRINUSE, "Port already in use")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_BROKEN_LINK, "Conn is broken")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_BROKEN_LINK, "Conn is broken")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_TIMEOUT, "Conn read timeout")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_TIMEOUT, "Conn read timeout")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_SOMENODE_NOT_CONNECTED, "some vnode/qnode/mnode(s) out of service")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_SOMENODE_NOT_CONNECTED, "some vnode/qnode/mnode(s) out of service")
|
||||||
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_SOMENODE_BROKEN_LINK, "some vnode/qnode/mnode(s) conn is broken")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_MAX_SESSIONS, "rpc open too many session")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_MAX_SESSIONS, "rpc open too many session")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_NETWORK_ERROR, "rpc network error")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_NETWORK_ERROR, "rpc network error")
|
||||||
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_NETWORK_BUSY, "rpc network busy")
|
TAOS_DEFINE_ERROR(TSDB_CODE_RPC_NETWORK_BUSY, "rpc network busy")
|
||||||
|
|
|
@ -0,0 +1,159 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# Color setting
|
||||||
|
RED='\033[0;31m'
|
||||||
|
GREEN='\033[1;32m'
|
||||||
|
GREEN_DARK='\033[0;32m'
|
||||||
|
GREEN_UNDERLINE='\033[4;32m'
|
||||||
|
NC='\033[0m'
|
||||||
|
|
||||||
|
TDENGINE_DIR=/root/TDinternal/community
|
||||||
|
|
||||||
|
|
||||||
|
#echo "TDENGINE_DIR = $TDENGINE_DIR"
|
||||||
|
today=`date +"%Y%m%d"`
|
||||||
|
TDENGINE_ALLCI_REPORT=$TDENGINE_DIR/tests/all-ci-report-$today.log
|
||||||
|
|
||||||
|
|
||||||
|
function runCasesOneByOne () {
|
||||||
|
while read -r line; do
|
||||||
|
if [[ "$line" != "#"* ]]; then
|
||||||
|
cmd=`echo $line | cut -d',' -f 5`
|
||||||
|
if [[ "$2" == "sim" ]] && [[ $line == *"script"* ]]; then
|
||||||
|
case=`echo $cmd | cut -d' ' -f 3`
|
||||||
|
start_time=`date +%s`
|
||||||
|
date +%F\ %T | tee -a $TDENGINE_ALLCI_REPORT && timeout 20m $cmd > /dev/null 2>&1 && \
|
||||||
|
echo -e "${GREEN}$case success${NC}" | tee -a $TDENGINE_ALLCI_REPORT \
|
||||||
|
|| echo -e "${RED}$case failed${NC}" | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
end_time=`date +%s`
|
||||||
|
echo execution time of $case was `expr $end_time - $start_time`s. | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
if $case failed
|
||||||
|
|
||||||
|
elif [[ "$line" == *"$2"* ]]; then
|
||||||
|
if [[ "$cmd" == *"pytest.sh"* ]]; then
|
||||||
|
cmd=`echo $cmd | cut -d' ' -f 2-20`
|
||||||
|
fi
|
||||||
|
case=`echo $cmd | cut -d' ' -f 4-20`
|
||||||
|
start_time=`date +%s`
|
||||||
|
date +%F\ %T | tee -a $TDENGINE_ALLCI_REPORT && timeout 20m $cmd > /dev/null 2>&1 && \
|
||||||
|
echo -e "${GREEN}$case success${NC}" | tee -a $TDENGINE_ALLCI_REPORT || \
|
||||||
|
echo -e "${RED}$case failed${NC}" | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
end_time=`date +%s`
|
||||||
|
echo execution time of $case was `expr $end_time - $start_time`s. | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
done < $1
|
||||||
|
}
|
||||||
|
|
||||||
|
function runUnitTest() {
|
||||||
|
echo "=== Run unit test case ==="
|
||||||
|
echo " $TDENGINE_DIR/debug"
|
||||||
|
cd $TDENGINE_DIR/debug
|
||||||
|
ctest -j12
|
||||||
|
echo "3.0 unit test done"
|
||||||
|
}
|
||||||
|
|
||||||
|
function runSimCases() {
|
||||||
|
echo "=== Run sim cases ==="
|
||||||
|
|
||||||
|
cd $TDENGINE_DIR/tests/script
|
||||||
|
runCasesOneByOne $TDENGINE_DIR/tests/parallel_test/cases-test.task sim
|
||||||
|
|
||||||
|
totalSuccess=`grep 'sim success' $TDENGINE_ALLCI_REPORT | wc -l`
|
||||||
|
if [ "$totalSuccess" -gt "0" ]; then
|
||||||
|
echo "### Total $totalSuccess SIM test case(s) succeed! ###" | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
fi
|
||||||
|
|
||||||
|
totalFailed=`grep 'sim failed\|fault' $TDENGINE_ALLCI_REPORT | wc -l`
|
||||||
|
if [ "$totalFailed" -ne "0" ]; then
|
||||||
|
echo "### Total $totalFailed SIM test case(s) failed! ###" | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
function runPythonCases() {
|
||||||
|
echo "=== Run python cases ==="
|
||||||
|
|
||||||
|
cd $TDENGINE_DIR/tests/parallel_test
|
||||||
|
sed -i '/compatibility.py/d' cases-test.task
|
||||||
|
|
||||||
|
# army
|
||||||
|
cd $TDENGINE_DIR/tests/army
|
||||||
|
runCasesOneByOne ../parallel_test/cases-test.task army
|
||||||
|
|
||||||
|
# system-test
|
||||||
|
cd $TDENGINE_DIR/tests/system-test
|
||||||
|
runCasesOneByOne ../parallel_test/cases-test.task system-test
|
||||||
|
|
||||||
|
# develop-test
|
||||||
|
cd $TDENGINE_DIR/tests/develop-test
|
||||||
|
runCasesOneByOne ../parallel_test/cases-test.task develop-test
|
||||||
|
|
||||||
|
totalSuccess=`grep 'py success' $TDENGINE_ALLCI_REPORT | wc -l`
|
||||||
|
if [ "$totalSuccess" -gt "0" ]; then
|
||||||
|
echo "### Total $totalSuccess python test case(s) succeed! ###" | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
fi
|
||||||
|
|
||||||
|
totalFailed=`grep 'py failed\|fault' $TDENGINE_ALLCI_REPORT | wc -l`
|
||||||
|
if [ "$totalFailed" -ne "0" ]; then
|
||||||
|
echo "### Total $totalFailed python test case(s) failed! ###" | tee -a $TDENGINE_ALLCI_REPORT
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function runTest() {
|
||||||
|
echo "run Test"
|
||||||
|
|
||||||
|
cd $TDENGINE_DIR
|
||||||
|
[ -d sim ] && rm -rf sim
|
||||||
|
[ -f $TDENGINE_ALLCI_REPORT ] && rm $TDENGINE_ALLCI_REPORT
|
||||||
|
|
||||||
|
runUnitTest
|
||||||
|
runSimCases
|
||||||
|
runPythonCases
|
||||||
|
|
||||||
|
stopTaosd
|
||||||
|
cd $TDENGINE_DIR/tests/script
|
||||||
|
find . -name '*.sql' | xargs rm -f
|
||||||
|
|
||||||
|
cd $TDENGINE_DIR/tests/pytest
|
||||||
|
find . -name '*.sql' | xargs rm -f
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopTaosd {
|
||||||
|
echo "Stop taosd start"
|
||||||
|
systemctl stop taosd
|
||||||
|
PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
|
||||||
|
while [ -n "$PID" ]
|
||||||
|
do
|
||||||
|
pkill -TERM -x taosd
|
||||||
|
sleep 1
|
||||||
|
PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
|
||||||
|
done
|
||||||
|
echo "Stop tasod end"
|
||||||
|
}
|
||||||
|
|
||||||
|
function stopTaosadapter {
|
||||||
|
echo "Stop taosadapter"
|
||||||
|
systemctl stop taosadapter.service
|
||||||
|
PID=`ps -ef|grep -w taosadapter | grep -v grep | awk '{print $2}'`
|
||||||
|
while [ -n "$PID" ]
|
||||||
|
do
|
||||||
|
pkill -TERM -x taosadapter
|
||||||
|
sleep 1
|
||||||
|
PID=`ps -ef|grep -w taosd | grep -v grep | awk '{print $2}'`
|
||||||
|
done
|
||||||
|
echo "Stop tasoadapter end"
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
WORK_DIR=/root/
|
||||||
|
|
||||||
|
date >> $WORK_DIR/date.log
|
||||||
|
echo "Run ALL CI Test Cases" | tee -a $WORK_DIR/date.log
|
||||||
|
|
||||||
|
stopTaosd
|
||||||
|
|
||||||
|
runTest
|
||||||
|
|
||||||
|
date >> $WORK_DIR/date.log
|
||||||
|
echo "End of CI Test Cases" | tee -a $WORK_DIR/date.log
|
Loading…
Reference in New Issue