Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
taosdata
TDengine
提交
9835b81e
T
TDengine
项目概览
taosdata
/
TDengine
1 年多 前同步成功
通知
1185
Star
22016
Fork
4786
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
1
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
T
TDengine
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
1
Issue
1
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
未验证
提交
9835b81e
编写于
6月 20, 2023
作者:
H
Hui Li
提交者:
GitHub
6月 20, 2023
浏览文件
操作
浏览文件
下载
差异文件
Merge pull request #21776 from taosdata/test/TD-23689-3.0
split vgroup add ci case splitVGroup.py
上级
9a19679b
f4ad0d6b
变更
2
显示空白变更内容
内联
并排
Showing
2 changed file
with
378 addition
and
0 deletion
+378
-0
tests/parallel_test/cases.task
tests/parallel_test/cases.task
+1
-0
tests/system-test/0-others/splitVGroup.py
tests/system-test/0-others/splitVGroup.py
+377
-0
未找到文件。
tests/parallel_test/cases.task
浏览文件 @
9835b81e
...
...
@@ -152,6 +152,7 @@
,,n,system-test,python3 ./test.py -f 0-others/tag_index_basic.py
,,n,system-test,python3 ./test.py -f 0-others/udfpy_main.py
,,n,system-test,python3 ./test.py -N 3 -f 0-others/walRetention.py
,,n,system-test,python3 ./test.py -f 0-others/splitVGroup.py -N 5
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_database.py
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/alter_replica.py -N 3
,,y,system-test,./pytest.sh python3 ./test.py -f 1-insert/influxdb_line_taosc_insert.py
...
...
tests/system-test/0-others/splitVGroup.py
0 → 100644
浏览文件 @
9835b81e
###################################################################
# Copyright (c) 2016 by TAOS Technologies, Inc.
# All rights reserved.
#
# This file is proprietary and confidential to TAOS Technologies.
# No part of this file may be reproduced, stored, transmitted,
# disclosed or used in any form or by any means other than as
# expressly provided by the written permission from Jianhui Tao
#
###################################################################
# -*- coding: utf-8 -*-
import
sys
import
random
import
time
import
copy
import
string
import
taos
from
util.log
import
*
from
util.cases
import
*
from
util.sql
import
*
class
TDTestCase
:
# random string
def
random_string
(
self
,
count
):
letters
=
string
.
ascii_letters
return
''
.
join
(
random
.
choice
(
letters
)
for
i
in
range
(
count
))
# get col value and total max min ...
def
getColsValue
(
self
,
i
,
j
):
# c1 value
if
random
.
randint
(
1
,
10
)
==
5
:
c1
=
None
else
:
c1
=
1
# c2 value
if
j
%
3200
==
0
:
c2
=
8764231
elif
random
.
randint
(
1
,
10
)
==
5
:
c2
=
None
else
:
c2
=
random
.
randint
(
-
87654297
,
98765321
)
value
=
f
"(
{
self
.
ts
}
, "
# c1
if
c1
is
None
:
value
+=
"null,"
else
:
self
.
c1Cnt
+=
1
value
+=
f
"
{
c1
}
,"
# c2
if
c2
is
None
:
value
+=
"null,"
else
:
value
+=
f
"
{
c2
}
,"
# total count
self
.
c2Cnt
+=
1
# max
if
self
.
c2Max
is
None
:
self
.
c2Max
=
c2
else
:
if
c2
>
self
.
c2Max
:
self
.
c2Max
=
c2
# min
if
self
.
c2Min
is
None
:
self
.
c2Min
=
c2
else
:
if
c2
<
self
.
c2Min
:
self
.
c2Min
=
c2
# sum
if
self
.
c2Sum
is
None
:
self
.
c2Sum
=
c2
else
:
self
.
c2Sum
+=
c2
# c3 same with ts
value
+=
f
"
{
self
.
ts
}
)"
# move next
self
.
ts
+=
1
return
value
# insert data
def
insertData
(
self
):
tdLog
.
info
(
"insert data ...."
)
sqls
=
""
for
i
in
range
(
self
.
childCnt
):
# insert child table
values
=
""
pre_insert
=
f
"insert into @db_name.t
{
i
}
values "
for
j
in
range
(
self
.
childRow
):
if
values
==
""
:
values
=
self
.
getColsValue
(
i
,
j
)
else
:
values
+=
","
+
self
.
getColsValue
(
i
,
j
)
# batch insert
if
j
%
self
.
batchSize
==
0
and
values
!=
""
:
sql
=
pre_insert
+
values
self
.
exeDouble
(
sql
)
values
=
""
# append last
if
values
!=
""
:
sql
=
pre_insert
+
values
self
.
exeDouble
(
sql
)
values
=
""
# insert nomal talbe
for
i
in
range
(
20
):
self
.
ts
+=
1000
name
=
self
.
random_string
(
20
)
sql
=
f
"insert into @db_name.ta values(
{
self
.
ts
}
,
{
i
}
,
{
self
.
ts
%
100000
}
, '
{
name
}
', false)"
self
.
exeDouble
(
sql
)
# insert finished
tdLog
.
info
(
f
"insert data successfully.
\n
"
f
" inserted child table =
{
self
.
childCnt
}
\n
"
f
" inserted child rows =
{
self
.
childRow
}
\n
"
f
" total inserted rows =
{
self
.
childCnt
*
self
.
childRow
}
\n
"
)
return
def
exeDouble
(
self
,
sql
):
# dbname replace
sql1
=
sql
.
replace
(
"@db_name"
,
self
.
db1
)
if
len
(
sql1
)
>
100
:
tdLog
.
info
(
sql1
[:
100
])
else
:
tdLog
.
info
(
sql1
)
tdSql
.
execute
(
sql1
)
sql2
=
sql
.
replace
(
"@db_name"
,
self
.
db2
)
if
len
(
sql1
)
>
100
:
tdLog
.
info
(
sql1
[:
100
])
else
:
tdLog
.
info
(
sql1
)
tdSql
.
execute
(
sql2
)
# prepareEnv
def
prepareEnv
(
self
):
# init
self
.
ts
=
1680000000000
self
.
childCnt
=
10
self
.
childRow
=
10000
self
.
batchSize
=
5000
self
.
vgroups1
=
4
self
.
vgroups2
=
4
self
.
db1
=
"db1"
self
.
db2
=
"db2"
# total
self
.
c1Cnt
=
0
self
.
c2Cnt
=
0
self
.
c2Max
=
None
self
.
c2Min
=
None
self
.
c2Sum
=
None
# create database db
sql
=
f
"create database @db_name vgroups
{
self
.
vgroups1
}
replica 3"
self
.
exeDouble
(
sql
)
# create super talbe st
sql
=
f
"create table @db_name.st(ts timestamp, c1 int, c2 bigint, ts1 timestamp) tags(area int)"
self
.
exeDouble
(
sql
)
# create child table
for
i
in
range
(
self
.
childCnt
):
sql
=
f
"create table @db_name.t
{
i
}
using @db_name.st tags(
{
i
}
) "
self
.
exeDouble
(
sql
)
# create normal table
sql
=
f
"create table @db_name.ta(ts timestamp, c1 int, c2 bigint, c3 binary(32), c4 bool)"
self
.
exeDouble
(
sql
)
# insert data
self
.
insertData
()
# check data correct
def
checkExpect
(
self
,
sql
,
expectVal
):
tdSql
.
query
(
sql
)
rowCnt
=
tdSql
.
getRows
()
for
i
in
range
(
rowCnt
):
val
=
tdSql
.
getData
(
i
,
0
)
if
val
!=
expectVal
:
tdLog
.
exit
(
f
"Not expect . query=
{
val
}
expect=
{
expectVal
}
i=
{
i
}
sql=
{
sql
}
"
)
return
False
tdLog
.
info
(
f
"check expect ok. sql=
{
sql
}
expect =
{
expectVal
}
rowCnt=
{
rowCnt
}
"
)
return
True
# init
def
init
(
self
,
conn
,
logSql
,
replicaVar
=
1
):
seed
=
time
.
clock_gettime
(
time
.
CLOCK_REALTIME
)
random
.
seed
(
seed
)
self
.
replicaVar
=
int
(
replicaVar
)
tdLog
.
debug
(
f
"start to excute
{
__file__
}
"
)
tdSql
.
init
(
conn
.
cursor
(),
True
)
# check query result same
def
queryDouble
(
self
,
sql
):
# sql
sql1
=
sql
.
replace
(
'@db_name'
,
self
.
db1
)
tdLog
.
info
(
sql1
)
start1
=
time
.
time
()
rows1
=
tdSql
.
query
(
sql1
)
spend1
=
time
.
time
()
-
start1
res1
=
copy
.
copy
(
tdSql
.
queryResult
)
sql2
=
sql
.
replace
(
'@db_name'
,
self
.
db2
)
tdLog
.
info
(
sql2
)
start2
=
time
.
time
()
tdSql
.
query
(
sql2
)
spend2
=
time
.
time
()
-
start2
res2
=
tdSql
.
queryResult
rowlen1
=
len
(
res1
)
rowlen2
=
len
(
res2
)
if
rowlen1
!=
rowlen2
:
tdLog
.
exit
(
f
"rowlen1=
{
rowlen1
}
rowlen2=
{
rowlen2
}
both not equal."
)
return
False
for
i
in
range
(
rowlen1
):
row1
=
res1
[
i
]
row2
=
res2
[
i
]
collen1
=
len
(
row1
)
collen2
=
len
(
row2
)
if
collen1
!=
collen2
:
tdLog
.
exit
(
f
"collen1=
{
collen1
}
collen2=
{
collen2
}
both not equal."
)
return
False
for
j
in
range
(
collen1
):
if
row1
[
j
]
!=
row2
[
j
]:
tdLog
.
exit
(
f
"col=
{
j
}
col1=
{
row1
[
j
]
}
col2=
{
row2
[
j
]
}
both col not equal."
)
return
False
# warning performance
diff
=
(
spend2
-
spend1
)
*
100
/
spend1
tdLog
.
info
(
"spend1=%.6fs spend2=%.6fs diff=%.1f%%"
%
(
spend1
,
spend2
,
diff
))
if
spend2
>
spend1
and
diff
>
20
:
tdLog
.
info
(
"warning: the diff for performance after spliting is over 20%"
)
return
True
# check result
def
checkResult
(
self
):
# check vgroupid
sql
=
f
"select vgroup_id from information_schema.ins_vgroups where db_name='
{
self
.
db2
}
'"
tdSql
.
query
(
sql
)
tdSql
.
checkRows
(
self
.
vgroups2
)
# check child table count same
sql
=
"select table_name from information_schema.ins_tables where db_name='@db_name' order by table_name"
self
.
queryDouble
(
sql
)
# check row value is ok
sql
=
"select * from @db_name.st order by ts"
self
.
queryDouble
(
sql
)
# where
sql
=
"select *,tbname from @db_name.st where c1 < 1000 order by ts"
self
.
queryDouble
(
sql
)
# max
sql
=
"select max(c1) from @db_name.st"
self
.
queryDouble
(
sql
)
# min
sql
=
"select min(c2) from @db_name.st"
self
.
queryDouble
(
sql
)
# sum
sql
=
"select sum(c1) from @db_name.st"
self
.
queryDouble
(
sql
)
# normal table
# all rows
sql
=
"select * from @db_name.ta"
self
.
queryDouble
(
sql
)
# count
sql
=
"select count(*) from @db_name.ta"
self
.
queryDouble
(
sql
)
# sum
sql
=
"select sum(c1) from @db_name.ta"
self
.
queryDouble
(
sql
)
# get vgroup list
def
getVGroup
(
self
,
db_name
):
vgidList
=
[]
sql
=
f
"select vgroup_id from information_schema.ins_vgroups where db_name='
{
db_name
}
'"
res
=
tdSql
.
getResult
(
sql
)
rows
=
len
(
res
)
for
i
in
range
(
rows
):
vgidList
.
append
(
res
[
i
][
0
])
return
vgidList
;
# split vgroup on db2
def
splitVGroup
(
self
,
db_name
):
vgids
=
self
.
getVGroup
(
db_name
)
selid
=
random
.
choice
(
vgids
)
sql
=
f
"split vgroup
{
selid
}
"
tdLog
.
info
(
sql
)
tdSql
.
execute
(
sql
)
# wait end
for
i
in
range
(
100
):
sql
=
"show transactions;"
rows
=
tdSql
.
query
(
sql
)
if
rows
==
0
:
tdLog
.
info
(
"split vgroup finished."
)
return
True
#tdLog.info(f"i={i} wait split vgroup ...")
time
.
sleep
(
1
)
tdLog
.
exit
(
"split vgroup transaction is not finished after executing 50s"
)
return
False
# split empty database
def
splitEmptyDB
(
self
):
dbName
=
"emptydb"
vgNum
=
2
# create database
sql
=
f
"create database
{
dbName
}
vgroups
{
vgNum
}
"
tdLog
.
info
(
sql
)
tdSql
.
execute
(
sql
)
# split vgroup
self
.
splitVGroup
(
dbName
)
vgList
=
self
.
getVGroup
(
dbName
)
vgNum1
=
len
(
vgList
)
vgNum2
=
vgNum
+
1
if
vgNum1
!=
vgNum2
:
tdLog
.
exit
(
f
" vglist len=
{
vgNum1
}
is not same for expect
{
vgNum2
}
"
)
return
# run
def
run
(
self
):
# prepare env
self
.
prepareEnv
()
for
i
in
range
(
5
):
# split vgroup on db2
self
.
splitVGroup
(
self
.
db2
)
self
.
vgroups2
+=
1
# check two db query result same
self
.
checkResult
()
tdLog
.
info
(
f
"split vgroup i=
{
i
}
passed."
)
# split empty db
self
.
splitEmptyDB
()
# stop
def
stop
(
self
):
tdSql
.
close
()
tdLog
.
success
(
f
"
{
__file__
}
successfully executed"
)
tdCases
.
addLinux
(
__file__
,
TDTestCase
())
tdCases
.
addWindows
(
__file__
,
TDTestCase
())
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录