From b8420fabb8c675dd607eb98ff362ac69a18b4264 Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Mon, 9 Mar 2009 13:00:44 -0400 Subject: [PATCH] Fix showblocks to display different colors for different metadata roots --- show-blocks | 83 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 51 insertions(+), 32 deletions(-) diff --git a/show-blocks b/show-blocks index 8db4c0b1..0164be96 100755 --- a/show-blocks +++ b/show-blocks @@ -16,7 +16,13 @@ # Free Software Foundation, Inc., 59 Temple Place - Suite 330, # Boston, MA 021110-1307, USA. # -import sys, os, signal, time, commands, tempfile +import sys, os, signal, time, commands, tempfile, random + +# numpy seems to override random() with something else. Instantiate our +# own here +randgen = random.Random() +randgen.seed(50) + from optparse import OptionParser from matplotlib import rcParams from matplotlib.font_manager import fontManager, FontProperties @@ -78,6 +84,7 @@ class AnnoteFinder: def loaddata(fh,delimiter=None, converters=None): + #14413824 8192 extent back ref root 5 gen 10 owner 282 num_refs 1 def iter(fh, delimiter, converters): global total_data global total_metadata @@ -86,6 +93,7 @@ def loaddata(fh,delimiter=None, converters=None): start = float(line[0]) len = float(line[1]) owner = float(line[10]) + root = float(line[6]) if owner <= 255: total_metadata += int(len) else: @@ -95,17 +103,18 @@ def loaddata(fh,delimiter=None, converters=None): yield start yield len yield owner + yield root X = numpy.fromiter(iter(fh, delimiter, converters), dtype=float) return X def run_debug_tree(device): - p = os.popen('debug-tree -e ' + device) + p = os.popen('btrfs-debug-tree -e ' + device) data = loaddata(p) return data def shapeit(X): - lines = len(X) / 3 - X.shape = (lines, 3) + lines = len(X) / 4 + X.shape = (lines, 4) def line_picker(line, mouseevent): if mouseevent.xdata is None: return False, dict() @@ -118,28 +127,43 @@ def xycalc(byte): xval = byte % num_cells return (xval, yval + 1) -def plotone(a, xvals, yvals, owner): - global data_lines - global meta_lines +# record the color used for each root the first time we find it +root_colors = {} +# there are lots of good colormaps to choose from +# http://www.scipy.org/Cookbook/Matplotlib/Show_colormaps +# +meta_cmap = get_cmap("gist_ncar") +data_done = False + +def plotone(a, xvals, yvals, owner, root, lines, labels): + global data_done + add_label = False if owner: if options.meta_only: return color = "blue" label = "Data" + if not data_done: + add_label = True + data_done = True else: if options.data_only: return - color = "green" - label = "Metadata" + if root not in root_colors: + color = meta_cmap(randgen.random()) + label = "Meta %d" % int(root) + root_colors[root] = (color, label) + add_label = True + else: + color, label = root_colors[root] - lines = a.plot(xvals, yvals, 's', color=color, mfc=color, mec=color, + plotlines = a.plot(xvals, yvals, 's', color=color, mfc=color, mec=color, markersize=.23, label=label) - if owner and not data_lines: - data_lines = lines - elif not owner and not meta_lines: - meta_lines = lines - + if add_label: + lines += plotlines + labels.append(label) + print "add label %s" % label def parse_zoom(): def parse_num(s): @@ -192,8 +216,6 @@ if not options.device and not options.input_file: zoommin, zoommax = parse_zoom() total_data = 0 total_metadata = 0 -data_lines = [] -meta_lines = [] if options.device: data = run_debug_tree(options.device) @@ -217,24 +239,29 @@ f = figure(figsize=(8,6)) # Throughput goes at the botoom a = subplot(1, 1, 1) +subplots_adjust(right=0.7) datai = 0 xvals = [] yvals = [] -last = 0 +last_owner = 0 +last_root = 0 +lines = [] +labels = [] while datai < datalen: row = data[datai] datai += 1 byte = row[0] size = row[1] owner = row[2] + root = row[3] if owner <= 255: owner = 0 else: owner = 1 - if len(xvals) and owner != last: - plotone(a, xvals, yvals, last) + if len(xvals) and (owner != last_owner or last_root != root): + plotone(a, xvals, yvals, last_owner, last_root, lines, labels) xvals = [] yvals = [] cell = 0 @@ -245,10 +272,11 @@ while datai < datalen: if xy: xvals.append(xy[0]) yvals.append(xy[1]) - last = owner + last_owner = owner + last_root = root if xvals: - plotone(a, xvals, yvals, last) + plotone(a, xvals, yvals, last_owner, last_root, lines, labels) # make sure the final second goes on the x axes ticks = [] @@ -278,16 +306,7 @@ a.set_ylabel('Disk offset (%s)' % scalestr) a.set_xlim(0, num_cells) a.set_title('Blocks') -lines = [] -labels = [] -if data_lines: - lines += data_lines - labels += ["Data"] -if meta_lines: - lines += meta_lines - labels += ["Metadata"] - -a.legend(lines, labels, loc=(.9, 1.02), shadow=True, pad=0.5, numpoints=1, +a.legend(lines, labels, loc=(1.05, 0.8), shadow=True, pad=0.1, numpoints=1, handletextsep = 0.005, labelsep = 0.01, markerscale=10,