dirnode: refactor deep-stats a bit

This commit is contained in:
Brian Warner
2008-05-08 13:33:07 -07:00
parent 6c00a70dbc
commit e6ae7a2c60
2 changed files with 46 additions and 34 deletions

View File

@ -476,20 +476,7 @@ class NewDirectoryNode:
return d return d
def deep_stats(self): def deep_stats(self):
stats = dict([ (k,0) for k in ["count-immutable-files", stats = DeepStats()
"count-mutable-files",
"count-literal-files",
"count-files",
"count-directories",
"size-immutable-files",
#"size-mutable-files",
"size-literal-files",
"size-directories",
"largest-directory",
"largest-directory-children",
"largest-immutable-file",
#"largest-mutable-file",
]])
# we track verifier caps, to avoid double-counting children for which # we track verifier caps, to avoid double-counting children for which
# we've got both a write-cap and a read-cap # we've got both a write-cap and a read-cap
found = set() found = set()
@ -498,7 +485,7 @@ class NewDirectoryNode:
limiter = ConcurrencyLimiter(10) limiter = ConcurrencyLimiter(10)
d = self._add_deepstats_from_node(self, found, stats, limiter) d = self._add_deepstats_from_node(self, found, stats, limiter)
d.addCallback(lambda res: stats) d.addCallback(lambda res: stats.get_results())
return d return d
def _add_deepstats_from_node(self, node, found, stats, limiter): def _add_deepstats_from_node(self, node, found, stats, limiter):
@ -507,12 +494,10 @@ class NewDirectoryNode:
dl = [] dl = []
dirsize_bytes = node.get_size() dirsize_bytes = node.get_size()
dirsize_children = len(children) dirsize_children = len(children)
stats["count-directories"] += 1 stats.add("count-directories")
stats["size-directories"] += dirsize_bytes stats.add("size-directories", dirsize_bytes)
stats["largest-directory"] = max(stats["largest-directory"], stats.max("largest-directory", dirsize_bytes)
dirsize_bytes) stats.max("largest-directory-children", dirsize_children)
stats["largest-directory-children"] = max(stats["largest-directory-children"],
dirsize_children)
for name, (child, metadata) in children.iteritems(): for name, (child, metadata) in children.iteritems():
verifier = child.get_verifier() verifier = child.get_verifier()
if verifier in found: if verifier in found:
@ -522,27 +507,52 @@ class NewDirectoryNode:
dl.append(self._add_deepstats_from_node(child, found, dl.append(self._add_deepstats_from_node(child, found,
stats, limiter)) stats, limiter))
elif IMutableFileNode.providedBy(child): elif IMutableFileNode.providedBy(child):
stats["count-files"] += 1 stats.add("count-files")
stats["count-mutable-files"] += 1 stats.add("count-mutable-files")
# TODO: update the servermap, compute a size, add it to # TODO: update the servermap, compute a size, add it to
# stats["size-mutable-files"], max it into # size-mutable-files, max it into "largest-mutable-file"
# stats["largest-mutable-file"]
elif IFileNode.providedBy(child): # CHK and LIT elif IFileNode.providedBy(child): # CHK and LIT
stats["count-files"] += 1 stats.add("count-files")
size = child.get_size() size = child.get_size()
if child.get_uri().startswith("URI:LIT:"): if child.get_uri().startswith("URI:LIT:"):
stats["count-literal-files"] += 1 stats.add("count-literal-files")
stats["size-literal-files"] += size stats.add("size-literal-files", size)
else: else:
stats["count-immutable-files"] += 1 stats.add("count-immutable-files")
stats["size-immutable-files"] += size stats.add("size-immutable-files", size)
stats["largest-immutable-file"] = max( stats.max("largest-immutable-file", size)
stats["largest-immutable-file"], size)
if dl: if dl:
return defer.DeferredList(dl) return defer.DeferredList(dl)
d.addCallback(_got_list) d.addCallback(_got_list)
return d return d
class DeepStats:
def __init__(self):
self.stats = {}
for k in ["count-immutable-files",
"count-mutable-files",
"count-literal-files",
"count-files",
"count-directories",
"size-immutable-files",
#"size-mutable-files",
"size-literal-files",
"size-directories",
"largest-directory",
"largest-directory-children",
"largest-immutable-file",
#"largest-mutable-file",
]:
self.stats[k] = 0
def add(self, key, value=1):
self.stats[key] += value
def max(self, key, value):
self.stats[key] = max(self.stats[key], value)
def get_results(self):
return self.stats
# use client.create_dirnode() to make one of these # use client.create_dirnode() to make one of these

View File

@ -226,8 +226,10 @@ class Dirnode(unittest.TestCase, testutil.ShouldFailMixin, testutil.StallMixin):
self.failUnlessEqual(stats[k], v, self.failUnlessEqual(stats[k], v,
"stats[%s] was %s, not %s" % "stats[%s] was %s, not %s" %
(k, stats[k], v)) (k, stats[k], v))
self.failUnless(stats["size-directories"] > 600) self.failUnless(stats["size-directories"] > 600,
self.failUnless(stats["largest-directory"] > 600) stats["size-directories"])
self.failUnless(stats["largest-directory"] > 600,
stats["largest-directory"])
d.addCallback(_check_deepstats) d.addCallback(_check_deepstats)
def _add_subsubdir(res): def _add_subsubdir(res):