fix:conflict from 3.0

This commit is contained in:
wangmm0220 2022-08-20 16:00:56 +08:00
commit 90a3b68d68
10 changed files with 366 additions and 421 deletions

View File

@ -331,9 +331,11 @@ endif(${BUILD_WITH_TRAFT})
# LIBUV # LIBUV
if(${BUILD_WITH_UV}) if(${BUILD_WITH_UV})
if (NOT ${CMAKE_SYSTEM_NAME} MATCHES "Windows") if (TD_WINDOWS)
MESSAGE("Windows need set no-sign-compare") # There is no GetHostNameW function on win7.
add_compile_options(-Wno-sign-compare) file(READ "libuv/src/win/util.c" LIBUV_WIN_UTIL_CONTENT)
string(REPLACE "if (GetHostNameW(buf, UV_MAXHOSTNAMESIZE" "DWORD nSize = UV_MAXHOSTNAMESIZE;\n if (GetComputerNameW(buf, &nSize" LIBUV_WIN_UTIL_CONTENT "${LIBUV_WIN_UTIL_CONTENT}")
file(WRITE "libuv/src/win/util.c" "${LIBUV_WIN_UTIL_CONTENT}")
endif () endif ()
add_subdirectory(libuv EXCLUDE_FROM_ALL) add_subdirectory(libuv EXCLUDE_FROM_ALL)
endif(${BUILD_WITH_UV}) endif(${BUILD_WITH_UV})

View File

@ -25,10 +25,11 @@ curl -u root:taosdata -d "show databases" localhost:6041/rest/sql
$ docker exec -it tdengine taos $ docker exec -it tdengine taos
taos> show databases; taos> show databases;
name | created_time | ntables | vgroups | replica | quorum | days | keep | cache(MB) | blocks | minrows | maxrows | wallevel | fsync | comp | cachelast | precision | update | status | name |
==================================================================================================================================================================================================================================================================================== =================================
log | 2022-01-17 13:57:22.270 | 10 | 1 | 1 | 1 | 10 | 30 | 1 | 3 | 100 | 4096 | 1 | 3000 | 2 | 0 | us | 0 | ready | information_schema |
Query OK, 1 row(s) in set (0.002843s) performance_schema |
Query OK, 2 rows in database (0.033802s)
``` ```
因为运行在容器中的 TDengine 服务端使用容器的 hostname 建立连接,使用 taos shell 或者各种连接器(例如 JDBC-JNI从容器外访问容器内的 TDengine 比较复杂,所以上述方式是访问容器中 TDengine 服务的最简单的方法,适用于一些简单场景。如果在一些复杂场景下想要从容器化使用 taos shell 或者各种连接器访问容器中的 TDengine 服务,请参考下一节。 因为运行在容器中的 TDengine 服务端使用容器的 hostname 建立连接,使用 taos shell 或者各种连接器(例如 JDBC-JNI从容器外访问容器内的 TDengine 比较复杂,所以上述方式是访问容器中 TDengine 服务的最简单的方法,适用于一些简单场景。如果在一些复杂场景下想要从容器化使用 taos shell 或者各种连接器访问容器中的 TDengine 服务,请参考下一节。
@ -45,10 +46,11 @@ docker run -d --name tdengine --network host tdengine/tdengine
$ taos $ taos
taos> show dnodes; taos> show dnodes;
id | end_point | vnodes | cores | status | role | create_time | offline reason | id | endpoint | vnodes | support_vnodes | status | create_time | note |
====================================================================================================================================== =================================================================================================================================================
1 | myhost:6030 | 1 | 8 | ready | any | 2022-01-17 22:10:32.619 | | 1 | vm98:6030 | 0 | 32 | ready | 2022-08-19 14:50:05.337 | |
Query OK, 1 row(s) in set (0.003233s) Query OK, 1 rows in database (0.010654s)
``` ```
## 以指定的 hostname 和 port 启动 TDengine ## 以指定的 hostname 和 port 启动 TDengine
@ -59,12 +61,13 @@ Query OK, 1 row(s) in set (0.003233s)
docker run -d \ docker run -d \
--name tdengine \ --name tdengine \
-e TAOS_FQDN=tdengine \ -e TAOS_FQDN=tdengine \
-p 6030-6049:6030-6049 \ -p 6030:6030 \
-p 6030-6049:6030-6049/udp \ -p 6041-6049:6041-6049 \
-p 6041-6049:6041-6049/udp \
tdengine/tdengine tdengine/tdengine
``` ```
上面的命令在容器中启动一个 TDengine 服务,其所监听的 hostname 为 tdengine ,并将容器的 6030 到 6049 端口段映射到主机的 6030 到 6049 端口段 tcp 和 udp 都需要映射)。如果主机上该端口段已经被占用,可以修改上述命令指定一个主机上空闲的端口段。如果 `rpcForceTcp` 被设置为 `1` ,可以只映射 tcp 协议 上面的命令在容器中启动一个 TDengine 服务,其所监听的 hostname 为 tdengine ,并将容器的 6030 端口映射到主机的 6030 端口TCP只能映射主机 6030 端口6041-6049 端口段映射到主机 6041-6049 端口段tcp 和 udp 都需要映射,如果主机上该端口段已经被占用,可以修改上述命令指定一个主机上空闲的端口段
接下来,要确保 "tdengine" 这个 hostname 在 `/etc/hosts` 中可解析。 接下来,要确保 "tdengine" 这个 hostname 在 `/etc/hosts` 中可解析。
@ -103,9 +106,9 @@ taos -h tdengine -P 6030
3. 在同一网络上的另一容器中启动 TDengine 客户端 3. 在同一网络上的另一容器中启动 TDengine 客户端
```shell ```shell
docker run --rm -it --network td-net -e TAOS_FIRST_EP=tdengine tdengine/tdengine taos docker run --rm -it --network td-net -e TAOS_FIRST_EP=tdengine --entrypoint=taos tdengine/tdengine
# or # or
#docker run --rm -it --network td-net -e tdengine/tdengine taos -h tdengine #docker run --rm -it --network td-net --entrypoint=taos tdengine/tdengine -h tdengine
``` ```
## 在容器中启动客户端应用 ## 在容器中启动客户端应用
@ -115,7 +118,7 @@ taos -h tdengine -P 6030
```docker ```docker
FROM ubuntu:20.04 FROM ubuntu:20.04
RUN apt-get update && apt-get install -y wget RUN apt-get update && apt-get install -y wget
ENV TDENGINE_VERSION=2.4.0.0 ENV TDENGINE_VERSION=3.0.0.0
RUN wget -c https://www.taosdata.com/assets-download/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \ RUN wget -c https://www.taosdata.com/assets-download/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \ && tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& cd TDengine-client-${TDENGINE_VERSION} \ && cd TDengine-client-${TDENGINE_VERSION} \
@ -129,6 +132,14 @@ RUN wget -c https://www.taosdata.com/assets-download/TDengine-client-${TDENGINE_
以下是一个 go 应用程序的示例: 以下是一个 go 应用程序的示例:
* 创建 go mod 项目:
```bash
go mod init app
```
* 创建 main.go
```go ```go
/* /*
* In this test program, we'll create a database and insert 4 records then select out. * In this test program, we'll create a database and insert 4 records then select out.
@ -212,12 +223,18 @@ func checkErr(err error, prompt string) {
} }
``` ```
如下是完整版本的 dockerfile * 更新 go mod
```docker ```bash
FROM golang:1.17.6-buster as builder go mod tidy
ENV TDENGINE_VERSION=2.4.0.0 ```
RUN wget -c https://www.taosdata.com/assets-download/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
如下是完整版本的 dockerfile
```dockerfile
FROM golang:1.19.0-buster as builder
ENV TDENGINE_VERSION=3.0.0.0
RUN wget -c https://www.taosdata.com/assets-download/3.0/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \ && tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& cd TDengine-client-${TDENGINE_VERSION} \ && cd TDengine-client-${TDENGINE_VERSION} \
&& ./install_client.sh \ && ./install_client.sh \
@ -232,8 +249,8 @@ RUN go build
FROM ubuntu:20.04 FROM ubuntu:20.04
RUN apt-get update && apt-get install -y wget RUN apt-get update && apt-get install -y wget
ENV TDENGINE_VERSION=2.4.0.0 ENV TDENGINE_VERSION=3.0.0.0
RUN wget -c https://www.taosdata.com/assets-download/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \ RUN wget -c https://www.taosdata.com/assets-download/3.0/TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \ && tar xvf TDengine-client-${TDENGINE_VERSION}-Linux-x64.tar.gz \
&& cd TDengine-client-${TDENGINE_VERSION} \ && cd TDengine-client-${TDENGINE_VERSION} \
&& ./install_client.sh \ && ./install_client.sh \
@ -248,113 +265,112 @@ CMD ["app"]
目前我们已经有了 `main.go`, `go.mod`, `go.sum`, `app.dockerfile` 现在可以构建出这个应用程序并在 `td-net` 网络上启动它 目前我们已经有了 `main.go`, `go.mod`, `go.sum`, `app.dockerfile` 现在可以构建出这个应用程序并在 `td-net` 网络上启动它
```shell ```shell
$ docker build -t app -f app.dockerfile $ docker build -t app -f app.dockerfile .
$ docker run --rm --network td-net app -h tdengine -p 6030 $ docker run --rm --network td-net app app -h tdengine -p 6030
============= args parse result: ============= ============= args parse result: =============
hostName: tdengine hostName: tdengine
serverPort: 6030 serverPort: 6030
usr: root usr: root
password: taosdata password: taosdata
================================================ ================================================
2022-01-17 15:56:55.48 +0000 UTC 0 2022-08-19 07:43:51.68 +0000 UTC 0
2022-01-17 15:56:56.48 +0000 UTC 1 2022-08-19 07:43:52.68 +0000 UTC 1
2022-01-17 15:56:57.48 +0000 UTC 2 2022-08-19 07:43:53.68 +0000 UTC 2
2022-01-17 15:56:58.48 +0000 UTC 3 2022-08-19 07:43:54.68 +0000 UTC 3
2022-01-17 15:58:01.842 +0000 UTC 0
2022-01-17 15:58:02.842 +0000 UTC 1
2022-01-17 15:58:03.842 +0000 UTC 2
2022-01-17 15:58:04.842 +0000 UTC 3
2022-01-18 01:43:48.029 +0000 UTC 0
2022-01-18 01:43:49.029 +0000 UTC 1
2022-01-18 01:43:50.029 +0000 UTC 2
2022-01-18 01:43:51.029 +0000 UTC 3
``` ```
## 用 docker-compose 启动 TDengine 集群 ## 用 docker-compose 启动 TDengine 集群
1. 如下 docker-compose 文件启动一个 2 副本、2 管理节点、2 数据节点以及 1 个 arbitrator 的 TDengine 集群。 1. 如下 docker-compose 文件启动一个 三节点 TDengine 集群。
```docker ```yml
version: "3" version: "3"
services: services:
arbitrator: td-1:
image: tdengine/tdengine:$VERSION image: tdengine/tdengine:$VERSION
command: tarbitrator environment:
td-1: TAOS_FQDN: "td-1"
image: tdengine/tdengine:$VERSION TAOS_FIRST_EP: "td-1"
environment: volumes:
TAOS_FQDN: "td-1" - taosdata-td1:/var/lib/taos/
TAOS_FIRST_EP: "td-1" - taoslog-td1:/var/log/taos/
TAOS_NUM_OF_MNODES: "2" td-2:
TAOS_REPLICA: "2" image: tdengine/tdengine:$VERSION
TAOS_ARBITRATOR: arbitrator:6042 environment:
volumes: TAOS_FQDN: "td-2"
- taosdata-td1:/var/lib/taos/ TAOS_FIRST_EP: "td-1"
- taoslog-td1:/var/log/taos/ volumes:
td-2: - taosdata-td2:/var/lib/taos/
image: tdengine/tdengine:$VERSION - taoslog-td2:/var/log/taos/
environment: td-3:
TAOS_FQDN: "td-2" image: tdengine/tdengine:$VERSION
TAOS_FIRST_EP: "td-1" environment:
TAOS_NUM_OF_MNODES: "2" TAOS_FQDN: "td-3"
TAOS_REPLICA: "2" TAOS_FIRST_EP: "td-1"
TAOS_ARBITRATOR: arbitrator:6042 volumes:
volumes: - taosdata-td3:/var/lib/taos/
- taosdata-td2:/var/lib/taos/ - taoslog-td3:/var/log/taos/
- taoslog-td2:/var/log/taos/ volumes:
volumes: taosdata-td1:
taosdata-td1: taoslog-td1:
taoslog-td1: taosdata-td2:
taosdata-td2: taoslog-td2:
taoslog-td2: taosdata-td3:
``` taoslog-td3:
```
:::note :::note
- `VERSION` 环境变量被用来设置 tdengine image tag * `VERSION` 环境变量被用来设置 tdengine image tag
- 在新创建的实例上必须设置 `TAOS_FIRST_EP` 以使其能够加入 TDengine 集群;如果有高可用需求,则需要同时使用 `TAOS_SECOND_EP` * 在新创建的实例上必须设置 `TAOS_FIRST_EP` 以使其能够加入 TDengine 集群;如果有高可用需求,则需要同时使用 `TAOS_SECOND_EP`
- `TAOS_REPLICA` 用来设置缺省的数据库副本数量,其取值范围为[1,3] :::
在双副本环境下,推荐使用 arbitrator, 用 TAOS_ARBITRATOR 来设置
:::
2. 启动集群 2. 启动集群
```shell ```shell
$ VERSION=2.4.0.0 docker-compose up -d $ VERSION=3.0.0.0 docker-compose up -d
Creating network "test_default" with the default driver Creating network "test-docker_default" with the default driver
Creating volume "test_taosdata-td1" with default driver Creating volume "test-docker_taosdata-td1" with default driver
Creating volume "test_taoslog-td1" with default driver Creating volume "test-docker_taoslog-td1" with default driver
Creating volume "test_taosdata-td2" with default driver Creating volume "test-docker_taosdata-td2" with default driver
Creating volume "test_taoslog-td2" with default driver Creating volume "test-docker_taoslog-td2" with default driver
Creating test_td-1_1 ... done Creating volume "test-docker_taosdata-td3" with default driver
Creating test_arbitrator_1 ... done Creating volume "test-docker_taoslog-td3" with default driver
Creating test_td-2_1 ... done
``` Creating test-docker_td-3_1 ... done
Creating test-docker_td-1_1 ... done
Creating test-docker_td-2_1 ... done
```
3. 查看节点状态 3. 查看节点状态
```shell ```shell
$ docker-compose ps docker-compose ps
Name Command State Ports Name Command State Ports
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
test_arbitrator_1 /usr/bin/entrypoint.sh tar ... Up 6030/tcp, 6031/tcp, 6032/tcp, 6033/tcp, 6034/tcp, 6035/tcp, 6036/tcp, 6037/tcp, 6038/tcp, 6039/tcp, 6040/tcp, 6041/tcp, 6042/tcp -------------------------------------------------------------------
test_td-1_1 /usr/bin/entrypoint.sh taosd Up 6030/tcp, 6031/tcp, 6032/tcp, 6033/tcp, 6034/tcp, 6035/tcp, 6036/tcp, 6037/tcp, 6038/tcp, 6039/tcp, 6040/tcp, 6041/tcp, 6042/tcp test-docker_td-1_1 /tini -- /usr/bin/entrypoi ... Up
test_td-2_1 /usr/bin/entrypoint.sh taosd Up 6030/tcp, 6031/tcp, 6032/tcp, 6033/tcp, 6034/tcp, 6035/tcp, 6036/tcp, 6037/tcp, 6038/tcp, 6039/tcp, 6040/tcp, 6041/tcp, 6042/tcp test-docker_td-2_1 /tini -- /usr/bin/entrypoi ... Up
``` test-docker_td-3_1 /tini -- /usr/bin/entrypoi ... Up
```
4. 用 taos shell 查看 dnodes 4. 用 taos shell 查看 dnodes
```shell ```shell
$ docker-compose exec td-1 taos -s "show dnodes"
taos> show dnodes $ docker-compose exec td-1 taos -s "show dnodes"
id | end_point | vnodes | cores | status | role | create_time | offline reason |
====================================================================================================================================== taos> show dnodes
1 | td-1:6030 | 1 | 8 | ready | any | 2022-01-18 02:47:42.871 | |
2 | td-2:6030 | 0 | 8 | ready | any | 2022-01-18 02:47:43.518 | | id | endpoint | vnodes | support_vnodes | status | create_time | note |
0 | arbitrator:6042 | 0 | 0 | ready | arb | 2022-01-18 02:47:43.633 | - | =================================================================================================================================================
Query OK, 3 row(s) in set (0.000811s)
``` 1 | td-1:6030 | 0 | 32 | ready | 2022-08-19 07:57:29.971 | |
2 | td-2:6030 | 0 | 32 | ready | 2022-08-19 07:57:31.415 | |
3 | td-3:6030 | 0 | 32 | ready | 2022-08-19 07:57:31.417 | |
Query OK, 3 rows in database (0.021262s)
```
## taosAdapter ## taosAdapter
@ -362,93 +378,80 @@ password: taosdata
2. 同时为了部署灵活起见,可以在独立的容器中启动 taosAdapter 2. 同时为了部署灵活起见,可以在独立的容器中启动 taosAdapter
```docker ```docker
services: services:
# ... # ...
adapter: adapter:
image: tdengine/tdengine:$VERSION image: tdengine/tdengine:$VERSION
command: taosadapter command: taosadapter
``` ```
如果要部署多个 taosAdapter 来提高吞吐量并提供高可用性,推荐配置方式为使用 nginx 等反向代理来提供统一的访问入口。具体配置方法请参考 nginx 的官方文档。如下是示例: 如果要部署多个 taosAdapter 来提高吞吐量并提供高可用性,推荐配置方式为使用 nginx 等反向代理来提供统一的访问入口。具体配置方法请参考 nginx 的官方文档。如下是示例:
```docker ```yml
version: "3" version: "3"
networks: networks:
inter: inter:
api:
services: services:
arbitrator: td-1:
image: tdengine/tdengine:$VERSION image: tdengine/tdengine:$VERSION
command: tarbitrator networks:
networks: - inter
- inter environment:
td-1: TAOS_FQDN: "td-1"
image: tdengine/tdengine:$VERSION TAOS_FIRST_EP: "td-1"
networks: volumes:
- inter - taosdata-td1:/var/lib/taos/
environment: - taoslog-td1:/var/log/taos/
TAOS_FQDN: "td-1" td-2:
TAOS_FIRST_EP: "td-1" image: tdengine/tdengine:$VERSION
TAOS_NUM_OF_MNODES: "2" networks:
TAOS_REPLICA: "2" - inter
TAOS_ARBITRATOR: arbitrator:6042 environment:
volumes: TAOS_FQDN: "td-2"
- taosdata-td1:/var/lib/taos/ TAOS_FIRST_EP: "td-1"
- taoslog-td1:/var/log/taos/ volumes:
td-2: - taosdata-td2:/var/lib/taos/
image: tdengine/tdengine:$VERSION - taoslog-td2:/var/log/taos/
networks: adapter:
- inter image: tdengine/tdengine:$VERSION
environment: entrypoint: "taosadapter"
TAOS_FQDN: "td-2" networks:
TAOS_FIRST_EP: "td-1" - inter
TAOS_NUM_OF_MNODES: "2" environment:
TAOS_REPLICA: "2" TAOS_FIRST_EP: "td-1"
TAOS_ARBITRATOR: arbitrator:6042 TAOS_SECOND_EP: "td-2"
volumes: deploy:
- taosdata-td2:/var/lib/taos/ replicas: 4
- taoslog-td2:/var/log/taos/ nginx:
adapter: image: nginx
image: tdengine/tdengine:$VERSION depends_on:
command: taosadapter - adapter
networks: networks:
- inter - inter
environment: ports:
TAOS_FIRST_EP: "td-1" - 6041:6041
TAOS_SECOND_EP: "td-2" - 6044:6044/udp
deploy: command: [
replicas: 4 "sh",
nginx: "-c",
image: nginx "while true;
depends_on: do curl -s http://adapter:6041/-/ping >/dev/null && break;
- adapter done;
networks: printf 'server{listen 6041;location /{proxy_pass http://adapter:6041;}}'
- inter > /etc/nginx/conf.d/rest.conf;
- api printf 'stream{server{listen 6044 udp;proxy_pass adapter:6044;}}'
ports: >> /etc/nginx/nginx.conf;cat /etc/nginx/nginx.conf;
- 6041:6041 nginx -g 'daemon off;'",
- 6044:6044/udp ]
command: [ volumes:
"sh", taosdata-td1:
"-c", taoslog-td1:
"while true; taosdata-td2:
do curl -s http://adapter:6041/-/ping >/dev/null && break; taoslog-td2:
done; ```
printf 'server{listen 6041;location /{proxy_pass http://adapter:6041;}}'
> /etc/nginx/conf.d/rest.conf;
printf 'stream{server{listen 6044 udp;proxy_pass adapter:6044;}}'
>> /etc/nginx/nginx.conf;cat /etc/nginx/nginx.conf;
nginx -g 'daemon off;'",
]
volumes:
taosdata-td1:
taoslog-td1:
taosdata-td2:
taoslog-td2:
```
## 使用 docker swarm 部署 ## 使用 docker swarm 部署
@ -457,39 +460,35 @@ password: taosdata
docker-compose 文件可以参考上节。下面是使用 docker swarm 启动 TDengine 的命令: docker-compose 文件可以参考上节。下面是使用 docker swarm 启动 TDengine 的命令:
```shell ```shell
$ VERSION=2.4.0 docker stack deploy -c docker-compose.yml taos $ VERSION=3.0.0.0 docker stack deploy -c docker-compose.yml taos
Creating network taos_inter Creating network taos_inter
Creating network taos_api Creating service taos_nginx
Creating service taos_arbitrator
Creating service taos_td-1 Creating service taos_td-1
Creating service taos_td-2 Creating service taos_td-2
Creating service taos_adapter Creating service taos_adapter
Creating service taos_nginx
``` ```
查看和管理 查看和管理
```shell ```shell
$ docker stack ps taos $ docker stack ps taos
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
79ni8temw59n taos_nginx.1 nginx:latest TM1701 Running Running about a minute ago 7m3sbf532bqp taos_adapter.1 tdengine/tdengine:3.0.0.0 vm98 Running Running about a minute ago
3e94u72msiyg taos_adapter.1 tdengine/tdengine:2.4.0 TM1702 Running Running 56 seconds ago pj403n6ofmmh taos_adapter.2 tdengine/tdengine:3.0.0.0 vm98 Running Running about a minute ago
100amjkwzsc6 taos_td-2.1 tdengine/tdengine:2.4.0 TM1703 Running Running about a minute ago rxqfwsyk5q1h taos_adapter.3 tdengine/tdengine:3.0.0.0 vm98 Running Running about a minute ago
pkjehr2vvaaa taos_td-1.1 tdengine/tdengine:2.4.0 TM1704 Running Running 2 minutes ago qj40lpxr40oc taos_adapter.4 tdengine/tdengine:3.0.0.0 vm98 Running Running about a minute ago
tpzvgpsr1qkt taos_arbitrator.1 tdengine/tdengine:2.4.0 TM1705 Running Running 2 minutes ago oe3455ulxpze taos_nginx.1 nginx:latest vm98 Running Running about a minute ago
rvss3g5yg6fa taos_adapter.2 tdengine/tdengine:2.4.0 TM1706 Running Running 56 seconds ago o0tsg70nrrc6 taos_td-1.1 tdengine/tdengine:3.0.0.0 vm98 Running Running about a minute ago
i2augxamfllf taos_adapter.3 tdengine/tdengine:2.4.0 TM1707 Running Running 56 seconds ago q5m1oxs589cp taos_td-2.1 tdengine/tdengine:3.0.0.0 vm98 Running Running about a minute ago
lmjyhzccpvpg taos_adapter.4 tdengine/tdengine:2.4.0 TM1708 Running Running 56 seconds ago
$ docker service ls $ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS ID NAME MODE REPLICAS IMAGE PORTS
561t4lu6nfw6 taos_adapter replicated 4/4 tdengine/tdengine:2.4.0 ozuklorgl8bs taos_adapter replicated 4/4 tdengine/tdengine:3.0.0.0
3hk5ct3q90sm taos_arbitrator replicated 1/1 tdengine/tdengine:2.4.0 crmhdjw6vxw0 taos_nginx replicated 1/1 nginx:latest *:6041->6041/tcp, *:6044->6044/udp
d8qr52envqzu taos_nginx replicated 1/1 nginx:latest *:6041->6041/tcp, *:6044->6044/udp o86ngy7csv5n taos_td-1 replicated 1/1 tdengine/tdengine:3.0.0.0
2isssfvjk747 taos_td-1 replicated 1/1 tdengine/tdengine:2.4.0 rma040ny4tb0 taos_td-2 replicated 1/1 tdengine/tdengine:3.0.0.0
9pzw7u02ichv taos_td-2 replicated 1/1 tdengine/tdengine:2.4.0
``` ```
从上面的输出可以看到有两个 dnode个 taosAdapter以及一个 nginx 反向代理服务。 从上面的输出可以看到有两个 dnode个 taosAdapter以及一个 nginx 反向代理服务。
接下来,我们可以减少 taosAdapter 服务的数量 接下来,我们可以减少 taosAdapter 服务的数量
@ -501,6 +500,6 @@ overall progress: 1 out of 1 tasks
verify: Service converged verify: Service converged
$ docker service ls -f name=taos_adapter $ docker service ls -f name=taos_adapter
ID NAME MODE REPLICAS IMAGE PORTS ID NAME MODE REPLICAS IMAGE PORTS
561t4lu6nfw6 taos_adapter replicated 1/1 tdengine/tdengine:2.4.0 ozuklorgl8bs taos_adapter replicated 1/1 tdengine/tdengine:3.0.0.0
``` ```

View File

@ -924,9 +924,6 @@ SOperatorInfo* createMergeAlignedIntervalOperatorInfo(SOperatorInfo* downstream,
SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode, SOperatorInfo* createStreamFinalIntervalOperatorInfo(SOperatorInfo* downstream, SPhysiNode* pPhyNode,
SExecTaskInfo* pTaskInfo, int32_t numOfChild); SExecTaskInfo* pTaskInfo, int32_t numOfChild);
SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
STimeWindowAggSupp *pTwAggSupp, SExecTaskInfo* pTaskInfo);
SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionWinodwPhysiNode* pSessionNode, SOperatorInfo* createSessionAggOperatorInfo(SOperatorInfo* downstream, SSessionWinodwPhysiNode* pSessionNode,
SExecTaskInfo* pTaskInfo); SExecTaskInfo* pTaskInfo);
SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols, SOperatorInfo* createGroupOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,

View File

@ -871,7 +871,6 @@ static int32_t saveWinResult(int64_t ts, int32_t pageId, int32_t offset, uint64_
static int32_t saveWinResultRow(SResultRow* result, uint64_t groupId, SHashObj* pUpdatedMap) { static int32_t saveWinResultRow(SResultRow* result, uint64_t groupId, SHashObj* pUpdatedMap) {
return saveWinResult(result->win.skey, result->pageId, result->offset, groupId, pUpdatedMap); return saveWinResult(result->win.skey, result->pageId, result->offset, groupId, pUpdatedMap);
;
} }
static int32_t saveResultRow(SResultRow* result, uint64_t groupId, SArray* pUpdated) { static int32_t saveResultRow(SResultRow* result, uint64_t groupId, SArray* pUpdated) {
@ -1595,7 +1594,7 @@ static SSDataBlock* doStreamIntervalAgg(SOperatorInfo* pOperator) {
SOperatorInfo* downstream = pOperator->pDownstream[0]; SOperatorInfo* downstream = pOperator->pDownstream[0];
SArray* pUpdated = taosArrayInit(4, POINTER_BYTES); // SResKeyPos SArray* pUpdated = taosArrayInit(4, POINTER_BYTES); // SResKeyPos
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_TIMESTAMP); _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
SHashObj* pUpdatedMap = taosHashInit(1024, hashFn, false, HASH_NO_LOCK); SHashObj* pUpdatedMap = taosHashInit(1024, hashFn, false, HASH_NO_LOCK);
while (1) { while (1) {
SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream); SSDataBlock* pBlock = downstream->fpSet.getNextFn(downstream);
@ -1886,62 +1885,6 @@ _error:
return NULL; return NULL;
} }
SOperatorInfo* createStreamIntervalOperatorInfo(SOperatorInfo* downstream, SExprInfo* pExprInfo, int32_t numOfCols,
SSDataBlock* pResBlock, SInterval* pInterval, int32_t primaryTsSlotId,
STimeWindowAggSupp* pTwAggSupp, SExecTaskInfo* pTaskInfo) {
SIntervalAggOperatorInfo* pInfo = taosMemoryCalloc(1, sizeof(SIntervalAggOperatorInfo));
SOperatorInfo* pOperator = taosMemoryCalloc(1, sizeof(SOperatorInfo));
if (pInfo == NULL || pOperator == NULL) {
goto _error;
}
pOperator->pTaskInfo = pTaskInfo;
pInfo->inputOrder = TSDB_ORDER_ASC;
pInfo->interval = *pInterval;
pInfo->execModel = OPTR_EXEC_MODEL_STREAM;
pInfo->win = pTaskInfo->window;
pInfo->twAggSup = *pTwAggSupp;
pInfo->primaryTsIndex = primaryTsSlotId;
int32_t numOfRows = 4096;
size_t keyBufSize = sizeof(int64_t) + sizeof(int64_t) + POINTER_BYTES;
initResultSizeInfo(&pOperator->resultInfo, numOfRows);
int32_t code = initAggInfo(&pOperator->exprSupp, &pInfo->aggSup, pExprInfo, numOfCols, keyBufSize, pTaskInfo->id.str);
initBasicInfo(&pInfo->binfo, pResBlock);
initExecTimeWindowInfo(&pInfo->twAggSup.timeWindowData, &pInfo->win);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
initResultRowInfo(&pInfo->binfo.resultRowInfo);
pOperator->name = "StreamTimeIntervalAggOperator";
pOperator->operatorType = QUERY_NODE_PHYSICAL_PLAN_HASH_INTERVAL;
pOperator->blocking = true;
pOperator->status = OP_NOT_OPENED;
pOperator->exprSupp.pExprInfo = pExprInfo;
pOperator->exprSupp.numOfExprs = numOfCols;
pOperator->info = pInfo;
pOperator->fpSet = createOperatorFpSet(doOpenIntervalAgg, doStreamIntervalAgg, doStreamIntervalAgg, NULL,
destroyIntervalOperatorInfo, aggEncodeResultRow, aggDecodeResultRow, NULL);
code = appendDownstream(pOperator, &downstream, 1);
if (code != TSDB_CODE_SUCCESS) {
goto _error;
}
return pOperator;
_error:
destroyIntervalOperatorInfo(pInfo, numOfCols);
taosMemoryFreeClear(pOperator);
pTaskInfo->code = code;
return NULL;
}
// todo handle multiple timeline cases. assume no timeline interweaving // todo handle multiple timeline cases. assume no timeline interweaving
static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperatorInfo* pInfo, SSDataBlock* pBlock) { static void doSessionWindowAggImpl(SOperatorInfo* pOperator, SSessionAggOperatorInfo* pInfo, SSDataBlock* pBlock) {
SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo; SExecTaskInfo* pTaskInfo = pOperator->pTaskInfo;
@ -3109,11 +3052,12 @@ void processPullOver(SSDataBlock* pBlock, SHashObj* pMap) {
static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) { static SSDataBlock* doStreamFinalIntervalAgg(SOperatorInfo* pOperator) {
SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info; SStreamFinalIntervalOperatorInfo* pInfo = pOperator->info;
SOperatorInfo* downstream = pOperator->pDownstream[0];
SArray* pUpdated = taosArrayInit(4, POINTER_BYTES); SOperatorInfo* downstream = pOperator->pDownstream[0];
_hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_TIMESTAMP); SArray* pUpdated = taosArrayInit(4, POINTER_BYTES);
SHashObj* pUpdatedMap = taosHashInit(1024, hashFn, false, HASH_NO_LOCK); _hash_fn_t hashFn = taosGetDefaultHashFunction(TSDB_DATA_TYPE_BINARY);
TSKEY maxTs = INT64_MIN; SHashObj* pUpdatedMap = taosHashInit(1024, hashFn, false, HASH_NO_LOCK);
TSKEY maxTs = INT64_MIN;
SExprSupp* pSup = &pOperator->exprSupp; SExprSupp* pSup = &pOperator->exprSupp;

View File

@ -2822,6 +2822,29 @@ static int32_t createDefaultFillNode(STranslateContext* pCxt, SNode** pOutput) {
return TSDB_CODE_SUCCESS; return TSDB_CODE_SUCCESS;
} }
static int32_t checkEvery(STranslateContext* pCxt, SValueNode* pInterval) {
int32_t len = strlen(pInterval->literal);
char *unit = &pInterval->literal[len - 1];
if (*unit == 'n' || *unit == 'y') {
return generateSyntaxErrMsgExt(&pCxt->msgBuf, TSDB_CODE_PAR_WRONG_VALUE_TYPE,
"Unsupported time unit in EVERY clause");
}
return TSDB_CODE_SUCCESS;
}
static int32_t translateInterpEvery(STranslateContext* pCxt, SNode** pEvery) {
int32_t code = TSDB_CODE_SUCCESS;
code = checkEvery(pCxt, (SValueNode *)(*pEvery));
if (TSDB_CODE_SUCCESS == code) {
code = translateExpr(pCxt, pEvery);
}
return code;
}
static int32_t translateInterpFill(STranslateContext* pCxt, SSelectStmt* pSelect) { static int32_t translateInterpFill(STranslateContext* pCxt, SSelectStmt* pSelect) {
int32_t code = TSDB_CODE_SUCCESS; int32_t code = TSDB_CODE_SUCCESS;
@ -2856,7 +2879,7 @@ static int32_t translateInterp(STranslateContext* pCxt, SSelectStmt* pSelect) {
int32_t code = translateExpr(pCxt, &pSelect->pRange); int32_t code = translateExpr(pCxt, &pSelect->pRange);
if (TSDB_CODE_SUCCESS == code) { if (TSDB_CODE_SUCCESS == code) {
code = translateExpr(pCxt, &pSelect->pEvery); code = translateInterpEvery(pCxt, &pSelect->pEvery);
} }
if (TSDB_CODE_SUCCESS == code) { if (TSDB_CODE_SUCCESS == code) {
code = translateInterpFill(pCxt, pSelect); code = translateInterpFill(pCxt, pSelect);

View File

@ -199,10 +199,20 @@ static SPage *tdbPCacheFetchImpl(SPCache *pCache, const SPgid *pPgid, TXN *pTxn)
if (pPageH) { if (pPageH) {
// copy the page content // copy the page content
memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid)); memcpy(&(pPage->pgid), pPgid, sizeof(*pPgid));
for (int nLoops = 0;;) {
if (pPageH->pPager) break;
if (++nLoops > 1000) {
sched_yield();
nLoops = 0;
}
}
pPage->pLruNext = NULL; pPage->pLruNext = NULL;
pPage->pPager = pPageH->pPager; pPage->pPager = pPageH->pPager;
memcpy(pPage->pData, pPageH->pData, pPage->pageSize); memcpy(pPage->pData, pPageH->pData, pPage->pageSize);
tdbDebug("pcache/pPageH: %p %d %p %p", pPageH, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize, pPage);
tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize); tdbPageInit(pPage, pPageH->pPageHdr - pPageH->pData, pPageH->xCellSize);
pPage->kLen = pPageH->kLen; pPage->kLen = pPageH->kLen;
pPage->vLen = pPageH->vLen; pPage->vLen = pPageH->vLen;

View File

@ -21,11 +21,14 @@
#include "taoserror.h" #include "taoserror.h"
#include "tlog.h" #include "tlog.h"
#define HTTP_RECV_BUF_SIZE 1024
typedef struct SHttpClient { typedef struct SHttpClient {
uv_connect_t conn; uv_connect_t conn;
uv_tcp_t tcp; uv_tcp_t tcp;
uv_write_t req; uv_write_t req;
uv_buf_t* buf; uv_buf_t* wbuf;
char *rbuf;
char* addr; char* addr;
uint16_t port; uint16_t port;
} SHttpClient; } SHttpClient;
@ -122,14 +125,30 @@ _OVER:
} }
static void destroyHttpClient(SHttpClient* cli) { static void destroyHttpClient(SHttpClient* cli) {
taosMemoryFree(cli->buf); taosMemoryFree(cli->wbuf);
taosMemoryFree(cli->rbuf);
taosMemoryFree(cli->addr); taosMemoryFree(cli->addr);
taosMemoryFree(cli); taosMemoryFree(cli);
} }
static void clientCloseCb(uv_handle_t* handle) { static void clientCloseCb(uv_handle_t* handle) {
SHttpClient* cli = handle->data; SHttpClient* cli = handle->data;
destroyHttpClient(cli); destroyHttpClient(cli);
} }
static void clientAllocBuffCb(uv_handle_t *handle, size_t suggested_size, uv_buf_t *buf) {
SHttpClient* cli = handle->data;
buf->base = cli->rbuf;
buf->len = HTTP_RECV_BUF_SIZE;
}
static void clientRecvCb(uv_stream_t* handle, ssize_t nread, const uv_buf_t *buf) {
SHttpClient* cli = handle->data;
if (nread < 0) {
uError("http-report read error:%s", uv_err_name(nread));
} else {
uInfo("http-report succ to read %d bytes, just ignore it", nread);
}
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
}
static void clientSentCb(uv_write_t* req, int32_t status) { static void clientSentCb(uv_write_t* req, int32_t status) {
SHttpClient* cli = req->data; SHttpClient* cli = req->data;
if (status != 0) { if (status != 0) {
@ -138,7 +157,7 @@ static void clientSentCb(uv_write_t* req, int32_t status) {
} else { } else {
uInfo("http-report succ to send data"); uInfo("http-report succ to send data");
} }
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb); uv_read_start((uv_stream_t *)&cli->tcp, clientAllocBuffCb, clientRecvCb);
} }
static void clientConnCb(uv_connect_t* req, int32_t status) { static void clientConnCb(uv_connect_t* req, int32_t status) {
SHttpClient* cli = req->data; SHttpClient* cli = req->data;
@ -148,7 +167,7 @@ static void clientConnCb(uv_connect_t* req, int32_t status) {
uv_close((uv_handle_t*)&cli->tcp, clientCloseCb); uv_close((uv_handle_t*)&cli->tcp, clientCloseCb);
return; return;
} }
uv_write(&cli->req, (uv_stream_t*)&cli->tcp, cli->buf, 2, clientSentCb); uv_write(&cli->req, (uv_stream_t*)&cli->tcp, cli->wbuf, 2, clientSentCb);
} }
static int32_t taosBuildDstAddr(const char* server, uint16_t port, struct sockaddr_in* dest) { static int32_t taosBuildDstAddr(const char* server, uint16_t port, struct sockaddr_in* dest) {
@ -189,7 +208,8 @@ int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32
cli->conn.data = cli; cli->conn.data = cli;
cli->tcp.data = cli; cli->tcp.data = cli;
cli->req.data = cli; cli->req.data = cli;
cli->buf = wb; cli->wbuf = wb;
cli->rbuf = taosMemoryCalloc(1, HTTP_RECV_BUF_SIZE);
cli->addr = tstrdup(server); cli->addr = tstrdup(server);
cli->port = port; cli->port = port;
@ -199,7 +219,6 @@ int32_t taosSendHttpReport(const char* server, uint16_t port, char* pCont, int32
int32_t fd = taosCreateSocketWithTimeout(5); int32_t fd = taosCreateSocketWithTimeout(5);
uv_tcp_open((uv_tcp_t*)&cli->tcp, fd); uv_tcp_open((uv_tcp_t*)&cli->tcp, fd);
int32_t ret = uv_tcp_connect(&cli->conn, &cli->tcp, (const struct sockaddr*)&dest, clientConnCb); int32_t ret = uv_tcp_connect(&cli->conn, &cli->tcp, (const struct sockaddr*)&dest, clientConnCb);
if (ret != 0) { if (ret != 0) {
uError("http-report failed to connect to server, reason:%s, dst:%s:%d", uv_strerror(ret), cli->addr, cli->port); uError("http-report failed to connect to server, reason:%s, dst:%s:%d", uv_strerror(ret), cli->addr, cli->port);

View File

@ -33,6 +33,8 @@ int32_t cfgLoadFromEnvCmd(SConfig *pConfig, const char **envCmd);
int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url); int32_t cfgLoadFromApollUrl(SConfig *pConfig, const char *url);
int32_t cfgSetItem(SConfig *pConfig, const char *name, const char *value, ECfgSrcType stype); int32_t cfgSetItem(SConfig *pConfig, const char *name, const char *value, ECfgSrcType stype);
extern char **environ;
SConfig *cfgInit() { SConfig *cfgInit() {
SConfig *pCfg = taosMemoryCalloc(1, sizeof(SConfig)); SConfig *pCfg = taosMemoryCalloc(1, sizeof(SConfig));
if (pCfg == NULL) { if (pCfg == NULL) {
@ -627,24 +629,17 @@ void cfgDumpCfg(SConfig *pCfg, bool tsc, bool dump) {
} }
int32_t cfgLoadFromEnvVar(SConfig *pConfig) { int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
char *line = NULL, *name, *value, *value2, *value3; char line[1024], *name, *value, *value2, *value3;
int32_t olen, vlen, vlen2, vlen3; int32_t olen, vlen, vlen2, vlen3;
int32_t code = 0; int32_t code = 0;
ssize_t _bytes = 0; char **pEnv = environ;
TdCmdPtr pCmd = taosOpenCmd("set"); line[1023] = 0;
if (pCmd == NULL) { while(*pEnv != NULL) {
terrno = TAOS_SYSTEM_ERROR(errno);
return -1;
}
while (!taosEOFCmd(pCmd)) {
name = value = value2 = value3 = NULL; name = value = value2 = value3 = NULL;
olen = vlen = vlen2 = vlen3 = 0; olen = vlen = vlen2 = vlen3 = 0;
_bytes = taosGetLineCmd(pCmd, &line); strncpy(line, *pEnv, sizeof(line)-1);
if (_bytes < 0) { pEnv++;
break;
}
if(line[_bytes - 1] == '\n') line[_bytes - 1] = 0;
taosEnvToCfg(line, line); taosEnvToCfg(line, line);
paGetToken(line, &name, &olen); paGetToken(line, &name, &olen);
@ -671,9 +666,6 @@ int32_t cfgLoadFromEnvVar(SConfig *pConfig) {
} }
} }
taosCloseCmd(&pCmd);
if (line != NULL) taosMemoryFreeClear(line);
uInfo("load from env variables cfg success"); uInfo("load from env variables cfg success");
return 0; return 0;
} }
@ -1040,34 +1032,25 @@ int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char* apolloUrl
index++; index++;
} }
char *line = NULL; char line[1024];
ssize_t _bytes = 0; char **pEnv = environ;
TdCmdPtr pCmd = taosOpenCmd("set"); line[1023] = 0;
if (pCmd != NULL) { while(*pEnv != NULL) {
while (!taosEOFCmd(pCmd)) { strncpy(line, *pEnv, sizeof(line)-1);
_bytes = taosGetLineCmd(pCmd, &line); pEnv++;
if (_bytes < 0) { if (strncmp(line, "TAOS_APOLLO_URL", 14) == 0) {
break; char *p = strchr(line, '=');
} if (p != NULL) {
if(line[_bytes - 1] == '\n') line[_bytes - 1] = 0; p++;
if (strncmp(line, "TAOS_APOLLO_URL", 14) == 0) { if (*p == '\'') {
char *p = strchr(line, '=');
if (p != NULL) {
p++; p++;
if (*p == '\'') { p[strlen(p)-1] = '\0';
p++;
p[strlen(p)-1] = '\0';
}
memcpy(apolloUrl, p, TMIN(strlen(p)+1,PATH_MAX));
uInfo("get apollo url from env variables success, apolloUrl=%s",apolloUrl);
taosCloseCmd(&pCmd);
if (line != NULL) taosMemoryFreeClear(line);
return 0;
} }
memcpy(apolloUrl, p, TMIN(strlen(p)+1,PATH_MAX));
uInfo("get apollo url from env variables success, apolloUrl=%s",apolloUrl);
return 0;
} }
} }
taosCloseCmd(&pCmd);
if (line != NULL) taosMemoryFreeClear(line);
} }
const char *filepath = ".env"; const char *filepath = ".env";
@ -1083,10 +1066,11 @@ int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char* apolloUrl
return 0; return 0;
} }
} }
int64_t _bytes;
TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ | TD_FILE_STREAM); TdFilePtr pFile = taosOpenFile(filepath, TD_FILE_READ | TD_FILE_STREAM);
if (pFile != NULL) { if (pFile != NULL) {
while (!taosEOFFile(pFile)) { while (!taosEOFFile(pFile)) {
_bytes = taosGetLineFile(pFile, &line); _bytes = taosGetsFile(pFile, sizeof(line) - 1, line);
if (_bytes <= 0) { if (_bytes <= 0) {
break; break;
} }
@ -1101,14 +1085,12 @@ int32_t cfgGetApollUrl(const char **envCmd, const char *envFile, char* apolloUrl
} }
memcpy(apolloUrl, p, TMIN(strlen(p)+1,PATH_MAX)); memcpy(apolloUrl, p, TMIN(strlen(p)+1,PATH_MAX));
taosCloseFile(&pFile); taosCloseFile(&pFile);
if (line != NULL) taosMemoryFreeClear(line);
uInfo("get apollo url from env file success"); uInfo("get apollo url from env file success");
return 0; return 0;
} }
} }
} }
taosCloseFile(&pFile); taosCloseFile(&pFile);
if (line != NULL) taosMemoryFreeClear(line);
} }
uInfo("fail get apollo url from cmd env file"); uInfo("fail get apollo url from cmd env file");

View File

@ -136,7 +136,8 @@ if $data74 != -4.00000 then
endi endi
## fill(value) + group by ## fill(value) + group by
sql select max(c1), max(c2), max(c3), max(c4), max(c5) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, -1, -2, -3, -4, -5, -6, -7, -8) group by t1 print select _wstart, max(c1), max(c2), max(c3), max(c4), max(c5) from $stb where ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(value, -1, -2, -3, -4, -5, -6, -7, -8)
sql select _wstart, max(c1), max(c2), max(c3), max(c4), max(c5) from $stb where ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(value, -1, -2, -3, -4, -5, -6, -7, -8)
$val = $rowNum * 2 $val = $rowNum * 2
print $rowNum, $val print $rowNum, $val
@ -148,18 +149,13 @@ if $rows != 190 then
print expect 190, actual:$rows print expect 190, actual:$rows
return -1 return -1
endi endi
if $data06 != 0 then
return -1
endi
if $data11 != -1 then if $data11 != -1 then
return -1 return -1
endi endi
#if $data16 != 0 then
# return -1
#endi
# number of fill values is smaller than number of selected columns # number of fill values is smaller than number of selected columns
sql select max(c1), max(c2), max(c3) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 6, 6) print select _wstart, max(c1), max(c2), max(c3) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 6, 6)
sql select _wstart, max(c1), max(c2), max(c3) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 6, 6)
if $data11 != 6 then if $data11 != 6 then
return -1 return -1
endi endi
@ -174,11 +170,11 @@ endi
sql_error select max(c1), max(c2), max(c3), max(c4), max(c5) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill (6, 6, 6, 6, 6) sql_error select max(c1), max(c2), max(c3), max(c4), max(c5) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill (6, 6, 6, 6, 6)
# fill_char_values_to_arithmetic_fields # fill_char_values_to_arithmetic_fields
sql_error select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c') sql select sum(c1), avg(c2), max(c3), min(c4), avg(c4), count(c6), last(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'c', 'c', 'c', 'c', 'c', 'c', 'c', 'c')
# fill_multiple_columns # fill_multiple_columns
sql_error select sum(c1), avg(c2), min(c3), max(c4), count(c6), first(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99, 99, abc, abc) sql_error select sum(c1), avg(c2), min(c3), max(c4), count(c6), first(c7), last(c8) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99, 99, abc, abc)
sql select sum(c1), avg(c2), min(c3), max(c4) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99) sql select _wstart, sum(c1), avg(c2), min(c3), max(c4) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 99, 99, 99, 99)
$val = $rowNum * 2 $val = $rowNum * 2
$val = $val - 1 $val = $val - 1
if $rows != $val then if $rows != $val then
@ -196,11 +192,14 @@ sql select * from $stb
if $data09 != nchar0 then if $data09 != nchar0 then
return -1 return -1
endi endi
sql select max(c4) from $stb where t1 > 4 and ts >= $ts0 and ts <= $tsu interval(5m) fill(value, -1) group by t1
if $rows != 0 then print select max(c4) from $stb where t1 > 4 and ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(value, -1)
return -1 sql select max(c4) from $stb where t1 > 4 and ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(value, -1)
endi #if $rows != 0 then
sql select min(c1), max(c4) from $stb where t1 > 4 and ts >= $ts0 and ts <= $tsu interval(5m) fill(value, -1) # return -1
#endi
sql select _wstart, min(c1), max(c4) from $stb where t1 > 4 and ts >= $ts0 and ts <= $tsu interval(5m) fill(value, -1)
$val = $rowNum * 2 $val = $rowNum * 2
$val = $val - 1 $val = $val - 1
if $rows != $val then if $rows != $val then
@ -223,11 +222,12 @@ if $data12 != -1.000000000 then
endi endi
# fill_into_nonarithmetic_fieds # fill_into_nonarithmetic_fieds
sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000) print select _wstart, first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
sql select _wstart, first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 20000000, 20000000, 20000000)
#if $data11 != 20000000 then #if $data11 != 20000000 then
if $data11 != 1 then #if $data11 != 1 then
return -1 # return -1
endi #endi
sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1, 1, 1) sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1, 1, 1)
sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1.1, 1.1, 1.1) sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 1.1, 1.1, 1.1)
@ -235,16 +235,15 @@ sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <=
sql select first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1') sql select first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1')
# fill quoted values into bool column will throw error unless the value is 'true' or 'false' Note:2018-10-24 # fill quoted values into bool column will throw error unless the value is 'true' or 'false' Note:2018-10-24
# fill values into binary or nchar columns will be set to NULL automatically Note:2018-10-24 # fill values into binary or nchar columns will be set to NULL automatically Note:2018-10-24
sql_error select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1','1e1') sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '1e', '1e1','1e1')
sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, true, true, true) sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, true, true, true)
sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true', 'true','true') sql select first(c7), first(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true', 'true','true')
# fill nonarithmetic values into arithmetic fields # fill nonarithmetic values into arithmetic fields
sql_error select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, abc); sql_error select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, abc);
sql_error select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true'); sql select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 'true');
sql select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '2e1'); sql select _wstart, count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '2e1');
$val = $rowNum * 2 $val = $rowNum * 2
$val = $val - 1 $val = $val - 1
if $rows != $val then if $rows != $val then
@ -253,11 +252,11 @@ endi
if $data01 != $rowNum then if $data01 != $rowNum then
return -1 return -1
endi endi
if $data11 != 20 then #if $data11 != 20 then
return -1 # return -1
endi #endi
sql select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 2e1); sql select _wstart, count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, 2e1);
if $rows != $val then if $rows != $val then
return -1 return -1
endi endi
@ -268,43 +267,44 @@ if $data11 != 20 then
return -1 return -1
endi endi
sql select count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '20'); sql select _wstart, count(*) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(value, '20');
if $rows != $val then if $rows != $val then
return -1 return -1
endi endi
if $data01 != $rowNum then if $data01 != $rowNum then
return -1 return -1
endi endi
if $data11 != 20 then #if $data11 != 20 then
return -1 # return -1
endi #endi
## linear fill ## linear fill
sql select max(c1), min(c2), avg(c3), sum(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(linear) group by t1 sql select _wstart, max(c1), min(c2), avg(c3), sum(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu partition by t1 interval(5m) fill(linear)
$val = $rowNum * 2 $val = $rowNum * 2
$val = $val - 1 $val = $val - 1
$val = $val * $tbNum $val = $val * $tbNum
if $rows != $val then if $rows != $val then
return -1 return -1
endi endi
if $data08 != 0 then #if $data08 != 0 then
return -1 # return -1
endi #endi
if $data15 != NULL then #if $data15 != NULL then
return -1 # return -1
endi #endi
if $data16 != NULL then #if $data16 != NULL then
return -1 # return -1
endi #endi
if $data17 != NULL then #if $data17 != NULL then
return -1 # return -1
endi #endi
if $data18 != 0 then #if $data18 != 0 then
return -1 # return -1
endi #endi
## [TBASE-365] ## [TBASE-365]
sql select max(c1), min(c2), avg(c3), sum(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 interval(5m) fill(linear) group by t1 sql select _wstart, max(c1), min(c2), avg(c3), sum(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(linear)
print select _wstart, max(c1), min(c2), avg(c3), sum(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(linear)
if $rows != 95 then if $rows != 95 then
return -1 return -1
endi endi
@ -332,14 +332,8 @@ endi
if $data17 != NULL then if $data17 != NULL then
return -1 return -1
endi endi
if $data08 != 5 then
return -1
endi
if $data18 != 5 then
return -1
endi
sql select max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(linear) sql select _wstart, max(c1), min(c2), sum(c3), avg(c4), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu interval(5m) fill(linear)
$val = $rowNum * 2 $val = $rowNum * 2
$val = $val - 1 $val = $val - 1
if $rows != $val then if $rows != $val then
@ -359,7 +353,8 @@ endi
## previous fill ## previous fill
print fill(prev) print fill(prev)
sql select max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 interval(5m) fill(prev) group by t1 limit 5 print select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(prev) limit 5
sql select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(prev) limit 5
if $rows != 25 then if $rows != 25 then
return -1 return -1
endi endi
@ -372,69 +367,43 @@ endi
if $data04 != NULL then if $data04 != NULL then
return -1 return -1
endi endi
if $data09 != 5 then
return -1
endi
if $data12 != NULL then if $data12 != NULL then
return -1 return -1
endi endi
if $data19 != 5 then
return -1
endi
if $data18 != nchar0 then if $data18 != nchar0 then
return -1 return -1
endi endi
if $data59 != 6 then
return -1
endi
if $data69 != 6 then
return -1
endi
## NULL fill ## NULL fill
print fill(NULL) print fill(NULL)
sql select max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 interval(5m) fill(value, NULL) group by t1 limit 5 print select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(value, NULL) limit 5
sql select _wstart, max(c1), min(c2), avg(c3), sum(c4), count(c5), first(c7), last(c8), first(c9) from $stb where ts >= $ts0 and ts <= $tsu and t1 > 4 partition by t1 interval(5m) fill(value, NULL) limit 5
if $rows != 25 then if $rows != 25 then
return -1 return -1
endi endi
if $data01 != 0 then if $data01 != 0 then
return -1 return -1
endi endi
if $data02 != NULL then if $data02 != 0 then
return -1
endi
if $data04 != NULL then
return -1 return -1
endi endi
if $data06 != 1 then if $data06 != 1 then
return -1 return -1
endi endi
if $data09 != 5 then if $data11 != 0 then
return -1 return -1
endi endi
if $data11 != NULL then if $data12 != 0 then
return -1
endi
if $data12 != NULL then
return -1
endi
if $data19 != 5 then
return -1 return -1
endi endi
if $data18 != NULL then if $data18 != NULL then
return -1 return -1
endi endi
if $data59 != 6 then
return -1
endi
if $data69 != 6 then
return -1
endi
print =============== clear print =============== clear
sql drop database $db sql drop database $db
sql select * from information_schema.ins_databases sql select * from information_schema.ins_databases
if $rows != 0 then if $rows != 2 then
return -1 return -1
endi endi

View File

@ -174,15 +174,15 @@ ELSE ()
BUILD_COMMAND BUILD_COMMAND
COMMAND set CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client COMMAND set CGO_CFLAGS=-I${CMAKE_CURRENT_SOURCE_DIR}/../include/client
COMMAND set CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib COMMAND set CGO_LDFLAGS=-L${CMAKE_BINARY_DIR}/build/lib
COMMAND go build -ldflags "-s -w -X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}" COMMAND go build -a -o taosadapter.exe -ldflags "-s -w -X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
COMMAND go build -o taosadapter-debug -ldflags "-X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}" COMMAND go build -a -o taosadapter-debug.exe -ldflags "-X github.com/taosdata/taosadapter/version.Version=${taos_version} -X github.com/taosdata/taosadapter/version.CommitID=${taosadapter_commit_sha1}"
INSTALL_COMMAND INSTALL_COMMAND
COMMAND ${_upx_prefix}/src/upx/upx taosadapter.exe COMMAND ${_upx_prefix}/src/upx/upx taosadapter.exe
COMMAND cmake -E copy taosadapter.exe ${CMAKE_BINARY_DIR}/build/bin COMMAND cmake -E copy taosadapter.exe ${CMAKE_BINARY_DIR}/build/bin
COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/ COMMAND cmake -E make_directory ${CMAKE_BINARY_DIR}/test/cfg/
COMMAND cmake -E copy ./example/config/taosadapter.toml ${CMAKE_BINARY_DIR}/test/cfg/ COMMAND cmake -E copy ./example/config/taosadapter.toml ${CMAKE_BINARY_DIR}/test/cfg/
COMMAND cmake -E copy ./taosadapter.service ${CMAKE_BINARY_DIR}/test/cfg/ COMMAND cmake -E copy ./taosadapter.service ${CMAKE_BINARY_DIR}/test/cfg/
COMMAND cmake -E copy taosadapter-debug ${CMAKE_BINARY_DIR}/build/bin COMMAND cmake -E copy taosadapter-debug.exe ${CMAKE_BINARY_DIR}/build/bin
) )
unset(_upx_prefix) unset(_upx_prefix)
ELSE () ELSE ()