From 6b03975c7fe1f338994e74b6be03ec40d66b0e35 Mon Sep 17 00:00:00 2001 From: lingsheng Date: Tue, 3 Nov 2020 11:27:57 +0800 Subject: [PATCH] fio2gnuplot: fix TabErrors when running with Python 3 --- fio.spec | 6 +- ...TabErrors-when-running-with-Python-3.patch | 322 ++++++++++++++++++ 2 files changed, 327 insertions(+), 1 deletion(-) create mode 100644 fio2gnuplot-fix-TabErrors-when-running-with-Python-3.patch diff --git a/fio.spec b/fio.spec index 0381a4d..44c7a43 100644 --- a/fio.spec +++ b/fio.spec @@ -1,6 +1,6 @@ Name: fio Version: 3.7 -Release: 7 +Release: 8 Summary: Versatile IO workload generator License: GPLv2 URL: http://git.kernel.dk/?p=fio.git;a=summary @@ -12,6 +12,7 @@ BuildRequires: libpmem-devel libpmemblk-devel %endif Patch0000: fix-glibc-error.patch Patch0001: Modify-python2.7-to-python3-with-requires.patch +Patch0002: fio2gnuplot-fix-TabErrors-when-running-with-Python-3.patch %description fio is a tool used to spawn many threads or processes that perform a specific type of io operation specified by the user.It accepts many global parameters inherited @@ -45,6 +46,9 @@ export EXTFLAGS="$RPM_OPT_FLAGS" LDFLAGS="$RPM_LD_FLAGS" %{_mandir}/man1/* %changelog +* Tue Nov 03 2020 lingsheng - 3.7-8 +- fio2gnuplot: fix TabErrors when running with Python 3 + * Sat Sep 19 2020 yanan li - 3.7-7 - Modify python2.7 to python3 with requires diff --git a/fio2gnuplot-fix-TabErrors-when-running-with-Python-3.patch b/fio2gnuplot-fix-TabErrors-when-running-with-Python-3.patch new file mode 100644 index 0000000..b964571 --- /dev/null +++ b/fio2gnuplot-fix-TabErrors-when-running-with-Python-3.patch @@ -0,0 +1,322 @@ +From 4cbe3909942e913f3a71113bf4036824fcb54953 Mon Sep 17 00:00:00 2001 +From: Alexander Kapshuna +Date: Sat, 27 Jul 2019 18:45:32 +0300 +Subject: [PATCH] fio2gnuplot: fix TabErrors when running with Python 3 + +Closes #804 + +Signed-off-by: Alexander Kapshuna +--- + tools/plot/fio2gnuplot | 234 ++++++++++++++++++++--------------------- + 1 file changed, 117 insertions(+), 117 deletions(-) + +diff --git a/tools/plot/fio2gnuplot b/tools/plot/fio2gnuplot +index 4d1815cf8..cc4ea4c74 100755 +--- a/tools/plot/fio2gnuplot ++++ b/tools/plot/fio2gnuplot +@@ -36,10 +36,10 @@ def find_file(path, pattern): + fio_data_file=[] + # For all the local files + for file in os.listdir(path): +- # If the file matches the glob +- if fnmatch.fnmatch(file, pattern): +- # Let's consider this file +- fio_data_file.append(file) ++ # If the file matches the glob ++ if fnmatch.fnmatch(file, pattern): ++ # Let's consider this file ++ fio_data_file.append(file) + + return fio_data_file + +@@ -51,7 +51,7 @@ def generate_gnuplot_script(fio_data_file,title,gnuplot_output_filename,gnuplot_ + + # Plotting 3D or comparing graphs doesn't have a meaning unless if there is at least 2 traces + if len(fio_data_file) > 1: +- f.write("call \'%s/graph3D.gpm\' \'%s' \'%s\' \'\' \'%s\' \'%s\'\n" % (gpm_dir,title,gnuplot_output_filename,gnuplot_output_filename,mode)) ++ f.write("call \'%s/graph3D.gpm\' \'%s' \'%s\' \'\' \'%s\' \'%s\'\n" % (gpm_dir,title,gnuplot_output_filename,gnuplot_output_filename,mode)) + + # Setting up the compare files that will be plot later + compare=open(gnuplot_output_dir + 'compare.gnuplot','w') +@@ -93,10 +93,10 @@ set style line 1 lt 1 lw 3 pt 3 linecolor rgb "green" + compare_smooth.write("plot %s w l ls 1 ti 'Global average value (%.2f)'" % (global_avg,global_avg)); + compare_trend.write("plot %s w l ls 1 ti 'Global average value (%.2f)'" % (global_avg,global_avg)); + +- pos=0 +- # Let's create a temporary file for each selected fio file +- for file in fio_data_file: +- tmp_filename = "gnuplot_temp_file.%d" % pos ++ pos=0 ++ # Let's create a temporary file for each selected fio file ++ for file in fio_data_file: ++ tmp_filename = "gnuplot_temp_file.%d" % pos + + # Plotting comparing graphs doesn't have a meaning unless if there is at least 2 traces + if len(fio_data_file) > 1: +@@ -106,12 +106,12 @@ set style line 1 lt 1 lw 3 pt 3 linecolor rgb "green" + compare_trend.write(",\\\n'%s' using 2:3 smooth bezier title '%s'" % (tmp_filename,fio_data_file[pos])) + + png_file=file.replace('.log','') +- raw_filename = "%s-2Draw" % (png_file) +- smooth_filename = "%s-2Dsmooth" % (png_file) +- trend_filename = "%s-2Dtrend" % (png_file) +- avg = average(disk_perf[pos]) +- f.write("call \'%s/graph2D.gpm\' \'%s' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%f\'\n" % (gpm_dir,title,tmp_filename,fio_data_file[pos],raw_filename,mode,smooth_filename,trend_filename,avg)) +- pos = pos +1 ++ raw_filename = "%s-2Draw" % (png_file) ++ smooth_filename = "%s-2Dsmooth" % (png_file) ++ trend_filename = "%s-2Dtrend" % (png_file) ++ avg = average(disk_perf[pos]) ++ f.write("call \'%s/graph2D.gpm\' \'%s' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%s\' \'%f\'\n" % (gpm_dir,title,tmp_filename,fio_data_file[pos],raw_filename,mode,smooth_filename,trend_filename,avg)) ++ pos = pos +1 + + # Plotting comparing graphs doesn't have a meaning unless if there is at least 2 traces + if len(fio_data_file) > 1: +@@ -125,7 +125,7 @@ def generate_gnuplot_math_script(title,gnuplot_output_filename,mode,average,gnup + filename=gnuplot_output_dir+'mymath'; + temporary_files.append(filename) + f=open(filename,'a') +- f.write("call \'%s/math.gpm\' \'%s' \'%s\' \'\' \'%s\' \'%s\' %s\n" % (gpm_dir,title,gnuplot_output_filename,gnuplot_output_filename,mode,average)) ++ f.write("call \'%s/math.gpm\' \'%s' \'%s\' \'\' \'%s\' \'%s\' %s\n" % (gpm_dir,title,gnuplot_output_filename,gnuplot_output_filename,mode,average)) + f.close() + + def compute_aggregated_file(fio_data_file, gnuplot_output_filename, gnuplot_output_dir): +@@ -250,10 +250,10 @@ def compute_math(fio_data_file, title,gnuplot_output_filename,gnuplot_output_dir + stddev_file.write('DiskName %s\n'% mode ) + for disk in range(len(fio_data_file)): + # print disk_perf[disk] +- min_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) +- max_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) +- average_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) +- stddev_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) ++ min_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) ++ max_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) ++ average_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) ++ stddev_file.write("# Disk%d was coming from %s\n" % (disk,fio_data_file[disk])) + avg = average(disk_perf[disk]) + variance = [(x - avg)**2 for x in disk_perf[disk]] + standard_deviation = math.sqrt(average(variance)) +@@ -406,126 +406,126 @@ def main(argv): + force_keep_temp_files=False + + if not os.path.isfile(gpm_dir+'math.gpm'): +- gpm_dir="/usr/local/share/fio/" +- if not os.path.isfile(gpm_dir+'math.gpm'): +- print("Looks like fio didn't get installed properly as no gpm files found in '/usr/share/fio' or '/usr/local/share/fio'\n") +- sys.exit(3) ++ gpm_dir="/usr/local/share/fio/" ++ if not os.path.isfile(gpm_dir+'math.gpm'): ++ print("Looks like fio didn't get installed properly as no gpm files found in '/usr/share/fio' or '/usr/local/share/fio'\n") ++ sys.exit(3) + + try: +- opts, args = getopt.getopt(argv[1:],"ghkbivo:d:t:p:G:m:M:",['bandwidth', 'iops', 'pattern', 'outputfile', 'outputdir', 'title', 'min_time', 'max_time', 'gnuplot', 'Global', 'help', 'verbose','keep']) ++ opts, args = getopt.getopt(argv[1:],"ghkbivo:d:t:p:G:m:M:",['bandwidth', 'iops', 'pattern', 'outputfile', 'outputdir', 'title', 'min_time', 'max_time', 'gnuplot', 'Global', 'help', 'verbose','keep']) + except getopt.GetoptError: +- print("Error: One of the options passed to the cmdline was not supported") +- print("Please fix your command line or read the help (-h option)") +- sys.exit(2) ++ print("Error: One of the options passed to the cmdline was not supported") ++ print("Please fix your command line or read the help (-h option)") ++ sys.exit(2) + + for opt, arg in opts: +- if opt in ("-b", "--bandwidth"): +- pattern='*_bw.log' +- elif opt in ("-i", "--iops"): +- pattern='*_iops.log' +- elif opt in ("-v", "--verbose"): +- verbose=True +- elif opt in ("-k", "--keep"): +- #User really wants to keep the temporary files +- force_keep_temp_files=True +- elif opt in ("-p", "--pattern"): +- pattern_set_by_user=True +- pattern=arg +- pattern=pattern.replace('\\','') +- elif opt in ("-o", "--outputfile"): +- gnuplot_output_filename=arg +- elif opt in ("-d", "--outputdir"): +- gnuplot_output_dir=arg +- if not gnuplot_output_dir.endswith('/'): +- gnuplot_output_dir=gnuplot_output_dir+'/' +- if not os.path.exists(gnuplot_output_dir): +- os.makedirs(gnuplot_output_dir) +- elif opt in ("-t", "--title"): +- title=arg +- elif opt in ("-m", "--min_time"): +- min_time=arg +- elif opt in ("-M", "--max_time"): +- max_time=arg +- elif opt in ("-g", "--gnuplot"): +- run_gnuplot=True +- elif opt in ("-G", "--Global"): +- parse_global=True +- global_search=arg +- elif opt in ("-h", "--help"): +- print_help() +- sys.exit(1) ++ if opt in ("-b", "--bandwidth"): ++ pattern='*_bw.log' ++ elif opt in ("-i", "--iops"): ++ pattern='*_iops.log' ++ elif opt in ("-v", "--verbose"): ++ verbose=True ++ elif opt in ("-k", "--keep"): ++ #User really wants to keep the temporary files ++ force_keep_temp_files=True ++ elif opt in ("-p", "--pattern"): ++ pattern_set_by_user=True ++ pattern=arg ++ pattern=pattern.replace('\\','') ++ elif opt in ("-o", "--outputfile"): ++ gnuplot_output_filename=arg ++ elif opt in ("-d", "--outputdir"): ++ gnuplot_output_dir=arg ++ if not gnuplot_output_dir.endswith('/'): ++ gnuplot_output_dir=gnuplot_output_dir+'/' ++ if not os.path.exists(gnuplot_output_dir): ++ os.makedirs(gnuplot_output_dir) ++ elif opt in ("-t", "--title"): ++ title=arg ++ elif opt in ("-m", "--min_time"): ++ min_time=arg ++ elif opt in ("-M", "--max_time"): ++ max_time=arg ++ elif opt in ("-g", "--gnuplot"): ++ run_gnuplot=True ++ elif opt in ("-G", "--Global"): ++ parse_global=True ++ global_search=arg ++ elif opt in ("-h", "--help"): ++ print_help() ++ sys.exit(1) + + # Adding .global extension to the file + if parse_global==True: +- if not gnuplot_output_filename.endswith('.global'): +- pattern = pattern+'.global' ++ if not gnuplot_output_filename.endswith('.global'): ++ pattern = pattern+'.global' + + fio_data_file=find_file('.',pattern) + if len(fio_data_file) == 0: +- print("No log file found with pattern %s!" % pattern) +- # Try numjob log file format if per_numjob_logs=1 +- if (pattern == '*_bw.log'): +- fio_data_file=find_file('.','*_bw.*.log') +- if (pattern == '*_iops.log'): +- fio_data_file=find_file('.','*_iops.*.log') +- if len(fio_data_file) == 0: +- sys.exit(1) +- else: +- print("Using log file per job format instead") ++ print("No log file found with pattern %s!" % pattern) ++ # Try numjob log file format if per_numjob_logs=1 ++ if (pattern == '*_bw.log'): ++ fio_data_file=find_file('.','*_bw.*.log') ++ if (pattern == '*_iops.log'): ++ fio_data_file=find_file('.','*_iops.*.log') ++ if len(fio_data_file) == 0: ++ sys.exit(1) ++ else: ++ print("Using log file per job format instead") + else: +- print("%d files Selected with pattern '%s'" % (len(fio_data_file), pattern)) ++ print("%d files Selected with pattern '%s'" % (len(fio_data_file), pattern)) + + fio_data_file=sorted(fio_data_file, key=str.lower) + for file in fio_data_file: +- print(' |-> %s' % file) +- if "_bw.log" in file : +- mode="Bandwidth (KB/sec)" +- if "_iops.log" in file : +- mode="IO per Seconds (IO/sec)" ++ print(' |-> %s' % file) ++ if "_bw.log" in file : ++ mode="Bandwidth (KB/sec)" ++ if "_iops.log" in file : ++ mode="IO per Seconds (IO/sec)" + if (title == 'No title') and (mode != 'unknown'): +- if "Bandwidth" in mode: +- title='Bandwidth benchmark with %d fio results' % len(fio_data_file) +- if "IO" in mode: +- title='IO benchmark with %d fio results' % len(fio_data_file) ++ if "Bandwidth" in mode: ++ title='Bandwidth benchmark with %d fio results' % len(fio_data_file) ++ if "IO" in mode: ++ title='IO benchmark with %d fio results' % len(fio_data_file) + + print() + #We need to adjust the output filename regarding the pattern required by the user + if (pattern_set_by_user == True): +- gnuplot_output_filename=pattern +- # As we do have some glob in the pattern, let's make this simpliest +- # We do remove the simpliest parts of the expression to get a clear file name +- gnuplot_output_filename=gnuplot_output_filename.replace('-*-','-') +- gnuplot_output_filename=gnuplot_output_filename.replace('*','-') +- gnuplot_output_filename=gnuplot_output_filename.replace('--','-') +- gnuplot_output_filename=gnuplot_output_filename.replace('.log','') +- # Insure that we don't have any starting or trailing dash to the filename +- gnuplot_output_filename = gnuplot_output_filename[:-1] if gnuplot_output_filename.endswith('-') else gnuplot_output_filename +- gnuplot_output_filename = gnuplot_output_filename[1:] if gnuplot_output_filename.startswith('-') else gnuplot_output_filename +- if (gnuplot_output_filename == ''): +- gnuplot_output_filename='default' ++ gnuplot_output_filename=pattern ++ # As we do have some glob in the pattern, let's make this simpliest ++ # We do remove the simpliest parts of the expression to get a clear file name ++ gnuplot_output_filename=gnuplot_output_filename.replace('-*-','-') ++ gnuplot_output_filename=gnuplot_output_filename.replace('*','-') ++ gnuplot_output_filename=gnuplot_output_filename.replace('--','-') ++ gnuplot_output_filename=gnuplot_output_filename.replace('.log','') ++ # Insure that we don't have any starting or trailing dash to the filename ++ gnuplot_output_filename = gnuplot_output_filename[:-1] if gnuplot_output_filename.endswith('-') else gnuplot_output_filename ++ gnuplot_output_filename = gnuplot_output_filename[1:] if gnuplot_output_filename.startswith('-') else gnuplot_output_filename ++ if (gnuplot_output_filename == ''): ++ gnuplot_output_filename='default' + + if parse_global==True: +- parse_global_files(fio_data_file, global_search) ++ parse_global_files(fio_data_file, global_search) + else: +- blk_size=compute_temp_file(fio_data_file,disk_perf,gnuplot_output_dir,min_time,max_time) +- title="%s @ Blocksize = %dK" % (title,blk_size/1024) +- compute_aggregated_file(fio_data_file, gnuplot_output_filename, gnuplot_output_dir) +- compute_math(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir) +- generate_gnuplot_script(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir) +- +- if (run_gnuplot==True): +- render_gnuplot(fio_data_file, gnuplot_output_dir) +- +- # Shall we clean the temporary files ? +- if keep_temp_files==False and force_keep_temp_files==False: +- # Cleaning temporary files +- if verbose: print("Cleaning temporary files") +- for f in enumerate(temporary_files): +- if verbose: print(" -> %s"%f[1]) +- try: +- os.remove(f[1]) +- except: +- True ++ blk_size=compute_temp_file(fio_data_file,disk_perf,gnuplot_output_dir,min_time,max_time) ++ title="%s @ Blocksize = %dK" % (title,blk_size/1024) ++ compute_aggregated_file(fio_data_file, gnuplot_output_filename, gnuplot_output_dir) ++ compute_math(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir) ++ generate_gnuplot_script(fio_data_file,title,gnuplot_output_filename,gnuplot_output_dir,mode,disk_perf,gpm_dir) ++ ++ if (run_gnuplot==True): ++ render_gnuplot(fio_data_file, gnuplot_output_dir) ++ ++ # Shall we clean the temporary files ? ++ if keep_temp_files==False and force_keep_temp_files==False: ++ # Cleaning temporary files ++ if verbose: print("Cleaning temporary files") ++ for f in enumerate(temporary_files): ++ if verbose: print(" -> %s"%f[1]) ++ try: ++ os.remove(f[1]) ++ except: ++ True + + #Main + if __name__ == "__main__": -- Gitee