blob: 98e55f0acf7d3425d538c0b585dc873a2fdb47f3 [file] [log] [blame]
koder aka kdanilov70227062016-11-26 23:23:21 +02001import os
2import time
3import stat
4import random
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +02005import logging
koder aka kdanilov70227062016-11-26 23:23:21 +02006import subprocess
7
8
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +02009mod_name = "fio"
10__version__ = (0, 1)
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030011
koder aka kdanilov70227062016-11-26 23:23:21 +020012
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020013logger = logging.getLogger("agent.fio")
koder aka kdanilov3b4da8b2016-10-17 00:17:53 +030014
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020015
16def check_file_prefilled(path, used_size_mb):
koder aka kdanilov70227062016-11-26 23:23:21 +020017 used_size = used_size_mb * 1024 ** 2
18 blocks_to_check = 16
19
20 try:
21 fstats = os.stat(path)
22 if stat.S_ISREG(fstats.st_mode) and fstats.st_size < used_size:
23 return True
24 except EnvironmentError:
25 return True
26
27 offsets = [random.randrange(used_size - 1024) for _ in range(blocks_to_check)]
28 offsets.append(used_size - 1024)
29 offsets.append(0)
30
31 with open(path, 'rb') as fd:
32 for offset in offsets:
33 fd.seek(offset)
34 if b"\x00" * 1024 == fd.read(1024):
35 return True
36
37 return False
38
39
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020040def rpc_fill_file(fname, size, force=False, fio_path='fio'):
41 if not force:
42 if not check_file_prefilled(fname, size):
43 return
koder aka kdanilov70227062016-11-26 23:23:21 +020044
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020045 assert size % 4 == 0, "File size must be proportional to 4M"
koder aka kdanilov70227062016-11-26 23:23:21 +020046
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020047 cmd_templ = "{} --name=xxx --filename={} --direct=1 --bs=4m --size={}m --rw=write"
koder aka kdanilov70227062016-11-26 23:23:21 +020048
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020049 run_time = time.time()
50 subprocess.check_output(cmd_templ.format(fio_path, fname, size), shell=True)
51 run_time = time.time() - run_time
koder aka kdanilov70227062016-11-26 23:23:21 +020052
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020053 return None if run_time < 1.0 else int(size / run_time)
koder aka kdanilov70227062016-11-26 23:23:21 +020054
55
koder aka kdanilovbbbe1dc2016-12-20 01:19:56 +020056def rpc_install(name, binary):
57 try:
58 subprocess.check_output("which {}".format(binary), shell=True)
59 except:
60 subprocess.check_output("apt-get install -y {}".format(name), shell=True)