TDengine/test/cases/02-Databases/08-Keep/test_mlevel_except.py

425 lines
15 KiB
Python

###################################################################
# 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 -*-
from new_test_framework.utils import tdLog, tdSql, TDSetSql, tdDnodes
import glob
import os
import time
import platform
import shutil
def scanFiles(pattern):
res = []
for f in glob.iglob(pattern):
res += [f]
return res
def checkFiles(pattern, state):
res = scanFiles(pattern)
tdLog.info(res)
num = len(res)
if num:
if state:
tdLog.info("%s: %d files exist. expect: files exist" % (pattern, num))
else:
tdLog.exit("%s: %d files exist. expect: files not exist." % (pattern, num))
else:
if state:
tdLog.exit("%s: %d files exist. expect: files exist" % (pattern, num))
else:
tdLog.info("%s: %d files exist. expect: files not exist." % (pattern, num))
class TestMultilevel:
def setup_class(cls):
tdLog.debug("start to execute %s" % __file__)
cls.setsql = TDSetSql()
def basic(self):
tdLog.info("============== basic test ===============")
cfg={
'/mnt/data1' : 'dataDir',
'/mnt/data2 0 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdSql.createDir('/mnt/data2')
tdLog.info("================= step1")
tdDnodes.stop(1)
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
tdLog.info("================= step2")
checkFiles(r'/mnt/data1/*/*',1)
checkFiles(r'/mnt/data2/*/*',0)
tdDnodes.stop(1)
time.sleep(3)
def basic_createdb(self):
cfg={
'/mnt/data1 0 1 0' : 'dataDir',
'/mnt/data2 0 0 0' : 'dataDir',
'/mnt/data3 0 0 0' : 'dataDir',
'/mnt/data4 0 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdSql.createDir('/mnt/data2')
tdSql.createDir('/mnt/data3')
tdSql.createDir('/mnt/data4')
tdDnodes.stop(1)
time.sleep(3)
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
checkFiles(r'/mnt/data1/*/*',1)
checkFiles(r'/mnt/data2/*/*',0)
tdSql.execute('create database nws vgroups 20 stt_trigger 1 wal_level 1 wal_retention_period 0')
checkFiles(r'/mnt/data1/vnode/*/wal',5)
checkFiles(r'/mnt/data2/vnode/*/wal',5)
checkFiles(r'/mnt/data3/vnode/*/wal',5)
checkFiles(r'/mnt/data4/vnode/*/wal',5)
# clear env
tdSql.execute('drop database nws')
tdDnodes.stop(1)
time.sleep(3)
# delete dirs
for i in range(1, 5):
shutil.rmtree(f'/mnt/data{i}', ignore_errors=True)
def dir_not_exist(self):
tdLog.info("============== dir_not_exist test ===============")
cfg={
'/mnt/data1 0 0' : 'dataDir',
'/mnt/data2 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
os.system('rm -rf /mnt/data2')
tdLog.info("================= step1")
tdDnodes.deploy(1,cfg)
tdDnodes.startWithoutSleep(1)
tdLog.info("================= step2")
tdSql.taosdStatus(0)
def dir_permission_denied(self):
tdDnodes.stop(1)
tdLog.info("============== dir_permission_denied test ===============")
cfg={
'/mnt/data1 0 0' : 'dataDir',
'/mnt/data2 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdSql.createDir('/mnt/data2')
os.system('chmod 111 /mnt/data2')
tdLog.info("================= step1")
tdDnodes.deploy(1,cfg)
tdDnodes.startWithoutSleep(1)
tdLog.info("================= step2")
tdSql.taosdStatus(0)
def file_distribution_same_level(self):
tdLog.info("============== file_distribution_same_level test ===============")
dataDir = ['data00','data01','data02','data03','data04']
dataDict = {'data00':0,'data01':0,'data02':0,'data03':0,'data04':0}
tdDnodes.stop(1)
self.ntables = 1000
self.ts = 1520000010000
tdLog.info("================= step1")
cfg={
'/mnt/data00 0 1' : 'dataDir',
'/mnt/data01 0 0' : 'dataDir',
'/mnt/data02 0 0 0' : 'dataDir',
'/mnt/data03 0 0' : 'dataDir',
'/mnt/data04 0 0 0' : 'dataDir'
}
dir_list = ['/mnt/data00','/mnt/data01','/mnt/data02','/mnt/data03','/mnt/data04']
for i in dir_list:
tdSql.createDir(i)
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
tdSql.execute("create database test duration 8h")
tdSql.execute("use test")
tdSql.execute("create table stb(ts timestamp, c int) tags(t int)")
for i in range(self.ntables):
tdSql.execute("create table tb%d using stb tags(%d)" %(i, i))
tdSql.execute("insert into tb%d values(%d, 1)" % (i,self.ts + int (i / 100) * 86400000))
tdLog.info("================= step2")
tdDnodes.stop(1)
tdDnodes.start(1)
tdSql.query("select * from test.stb")
tdSql.checkRows(1000)
tdLog.info("================= step3")
tdSql.execute('drop database test')
for i in range(10):
tdSql.execute("create database test%d duration 8h" %(i))
tdSql.execute("use test%d" %(i))
tdSql.execute("create table tb (ts timestamp,i int)")
for j in range(10):
tdSql.execute("insert into tb values(%d, 1)" % (self.ts + int (i / 100) * 86400000))
tdDnodes.stop(1)
tdDnodes.start(1)
flag = True
for i in range(4):
if dataDict[dataDir[i]] == dataDict[dataDir[i+1]]:
flag = flag & True
else:
flag = flag & False
break
if not flag : tdLog.exit("%s failed, expect not occured" % (sys.argv[0]))
def three_level_basic(self):
tdLog.info("============== three_level_basic test ===============")
tdDnodes.stop(1)
# Test1 1 dataDir
cfg={
'/mnt/data000 0 1 0' : 'dataDir',
'/mnt/data001 0 0' : 'dataDir',
'/mnt/data002 0 0 0' : 'dataDir',
'/mnt/data010 1 0' : 'dataDir',
'/mnt/data011 1 0 0' : 'dataDir',
'/mnt/data012 1 0' : 'dataDir',
'/mnt/data020 2 0 0' : 'dataDir',
'/mnt/data021 2 0 0' : 'dataDir',
'/mnt/data022 2 0 0' : 'dataDir'
}
dir_list = ['/mnt/data000','/mnt/data001','/mnt/data002','/mnt/data010','/mnt/data011','/mnt/data012','/mnt/data020','/mnt/data021''/mnt/data022']
for i in dir_list:
tdSql.createDir(i)
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
for i in dir_list:
if i == '/mnt/data000':
checkFiles("%s/*/*" % i, 1)
else:
checkFiles("%s/*/*" % i, 0)
def more_than_128_disks(self):
tdLog.info("============== more_than_128_disks test ===============")
cfg={}
for i in range(129):
if i == 0 :
datadir = '/mnt/data%d 0 1' % (i+1)
else:
datadir = '/mnt/data%d 0 0 0' % (i+1)
cfg.update({ datadir : 'dataDir' })
tdSql.createDir('/mnt/data%d' % (i+1))
tdLog.info("================= step1")
tdDnodes.stop(1)
tdDnodes.deploy(1,cfg)
tdDnodes.startWithoutSleep(1)
tdLog.info("================= step2")
tdSql.taosdStatus(0)
def missing_middle_level(self):
tdLog.info("============== missing_middle_level test ===============")
tdDnodes.stop(1)
time.sleep(3)
# Test1 1 dataDir
cfg={
'/mnt/data1 1 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdDnodes.deploy(1,cfg)
tdDnodes.startWithoutSleep(1)
tdSql.taosdStatus(0)
tdDnodes.stop(1)
# Test2 2 dataDir
cfg = {
'/mnt/data1 0 1' : 'dataDir',
'/mnt/data1 2 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdDnodes.deploy(1,cfg)
tdDnodes.startWithoutSleep(1)
tdSql.taosdStatus(0)
def disable_create_new_file(self):
tdLog.info("============== disable_create_new_file_0_not_exist test ===============")
cfg={
'/mnt/data1 0 1 1' : 'dataDir',
'/mnt/data2 0 0 1' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdSql.createDir('/mnt/data2')
tdLog.info("================= step1")
tdDnodes.deploy(1,cfg)
tdDnodes.startWithoutSleep(1)
tdLog.info("================= step2")
tdSql.taosdStatus(0)
def trim_database(self):
tdLog.info("============== trim_database test ===============")
tdDnodes.stop(1)
cfg = {
'/mnt/data1 0 1' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
tdSql.execute('create database dbtest duration 3')
tdSql.execute('use dbtest')
tdSql.execute('create table stb (ts timestamp,c0 int) tags(t0 int)')
tdSql.execute('create table tb1 using stb tags(1)')
for i in range(1,600, 30):
tdSql.execute(f'insert into tb1 values(now-{i}d,10)')
tdSql.execute('flush database dbtest')
time.sleep(3)
checkFiles('/mnt/data1/vnode/*/tsdb/v*',1)
tdDnodes.stop(1)
cfg={
'/mnt/data1 0 1' : 'dataDir',
'/mnt/data2 1 0 0' : 'dataDir',
'/mnt/data3 1 0 1' : 'dataDir',
'/mnt/data4 2 0' : 'dataDir',
}
tdSql.createDir('/mnt/data2')
tdSql.createDir('/mnt/data3')
tdSql.createDir('/mnt/data4')
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
checkFiles('/mnt/data1/vnode/*/tsdb/v*',1)
checkFiles('/mnt/data2/vnode/*/tsdb/v*',0)
checkFiles('/mnt/data3/vnode/*/tsdb/v*',0)
checkFiles('/mnt/data4/vnode/*/tsdb/v*',0)
tdSql.execute('alter database dbtest keep 10d,365d,3650d')
tdSql.execute('trim database dbtest')
time.sleep(3)
checkFiles('/mnt/data1/vnode/*/tsdb/v*',1)
checkFiles('/mnt/data2/vnode/*/tsdb/v*',1)
checkFiles('/mnt/data3/vnode/*/tsdb/v*',0)
checkFiles('/mnt/data4/vnode/*/tsdb/v*',1)
def run_alter_disable_err_case(self):
tdLog.info("============== run_alter_disable_err_case test ===============")
tdDnodes.stop(1)
cfg={
'/mnt/data1 0 1 1' : 'dataDir',
'/mnt/data2 0 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdSql.createDir('/mnt/data2')
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
if platform.system() == 'Windows':
drive_letter = os.path.splitdrive(os.path.dirname(__file__))[0]
tdSql.execute(f'alter dnode 1 "dataDir {drive_letter}\\\\mnt\\\\data2 1"')
tdSql.error(f'alter dnode 1 "dataDir {drive_letter}\\\\mnt\\\\errpath 1"')
tdSql.error(f'alter dnode 1 "dataDir {drive_letter}\\\\mnt\\\\data2 3"')
tdSql.error(f'alter dnode 1 "dataDir v:\\\\mnt\\\\data2 ee"')
else:
tdSql.execute('alter dnode 1 "dataDir /mnt/data2 1"')
tdSql.error('alter dnode 1 "dataDir /mnt/errpath 1"')
tdSql.error('alter dnode 1 "dataDir /mnt/data2 3"')
tdSql.error('alter dnode 1 "dataDir /mnt/data2 ee"')
def run_alter_disable_case(self):
tdLog.info("============== run_alter_disable_case test ===============")
tdDnodes.stop(1)
time.sleep(3)
cfg={
'/mnt/data1 0 1 1' : 'dataDir',
'/mnt/data2 0 0 0' : 'dataDir',
'/mnt/data3 0 0 0' : 'dataDir'
}
tdSql.createDir('/mnt/data1')
tdSql.createDir('/mnt/data2')
tdSql.createDir('/mnt/data3')
tdDnodes.deploy(1,cfg)
tdDnodes.start(1)
tdSql.execute('create database dbtest duration 3')
tdSql.execute('use dbtest')
tdSql.execute('create table stb (ts timestamp,c0 int) tags(t0 int)')
tdSql.execute('create table tb1 using stb tags(1)')
for i in range(1,600, 30):
tdSql.execute(f'insert into tb1 values(now-{i}d,10)')
tdSql.execute('flush database dbtest')
if platform.system() == 'Windows':
drive_letter = os.path.splitdrive(os.path.dirname(__file__))[0]
tdSql.execute(f'alter dnode 1 "dataDir {drive_letter}\\\\mnt\\\\data2 1"')
else:
tdSql.execute('alter dnode 1 "dataDir /mnt/data2 1"')
tdSql.execute('create database dbtest1 duration 3')
tdSql.execute('use dbtest1')
tdSql.execute('create table stb (ts timestamp,c0 int) tags(t0 int)')
tdSql.execute('create table tb1 using stb tags(1)')
for i in range(1,600, 30):
tdSql.execute(f'insert into tb1 values(now-{i}d,10)')
tdSql.execute('flush database dbtest1')
def test_multilevel(self):
"""Multi level except
1. dir not exist
2. dir permission denied
3. file distribution same level
4. three level basic
5. more than 128 disks
6. trim database
7. missing middle level
8. disable create new file
9. run alter disable err case
10. run alter disable case
11. create/drop database on multi level storage
Since: v3.0.0.0
Labels: common,ci
Jira: None
History:
- 2025-12-02 Alex Duan Migrated from uncatalog/system-test/0-others/test_multilevel.py
- 2025-12-02 Alex Duan Migrated from uncatalog/system-test/0-others/test_multilevel_createdb.py
"""
self.basic_createdb()
self.basic()
self.dir_not_exist()
self.dir_permission_denied()
self.file_distribution_same_level()
self.three_level_basic()
self.more_than_128_disks()
self.trim_database()
self.missing_middle_level()
self.disable_create_new_file()
self.run_alter_disable_err_case()
self.run_alter_disable_case()