]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
add GET /uri/URI/?t=deep-size, to compute the total size of immutable files reachable...
authorBrian Warner <warner@allmydata.com>
Thu, 27 Mar 2008 18:33:42 +0000 (11:33 -0700)
committerBrian Warner <warner@allmydata.com>
Thu, 27 Mar 2008 18:33:42 +0000 (11:33 -0700)
docs/webapi.txt
src/allmydata/test/test_web.py
src/allmydata/web/directory.xhtml
src/allmydata/webish.py

index e5e492effe7a35f14d39695fd0be257b8ab3bac6..b8989f7265b557335c9ce2588490cea7f7175402 100644 (file)
@@ -561,6 +561,15 @@ GET $URL?t=manifest
 
   Return an HTML-formatted manifest of the given directory, for debugging.
 
+GET $URL?t=deep-size
+
+  Return a number (in bytes) containing the sum of the filesize of all
+  immutable files reachable from the given directory. This is a rough lower
+  bound of the total space consumed by this subtree. It does not include
+  space consumed by directories or immutable files, nor does it take
+  expansion or encoding overhead into account. Later versions of the code may
+  improve this estimate upwards.
+
 6. XMLRPC (coming soon)
 
   http://localhost:8123/xmlrpc
index a55b9efb7550efa147923a52d50d5da67a848268..c53b49aecf6707f54b78e216c6cb442bb4983fae 100644 (file)
@@ -740,6 +740,14 @@ class Web(WebMixin, unittest.TestCase):
         d.addCallback(_got)
         return d
 
+    def test_GET_DIRURL_deepsize(self):
+        d = self.GET(self.public_url + "/foo?t=deep-size", followRedirect=True)
+        def _got(manifest):
+            self.failUnless(re.search(r'^\d+$', manifest), manifest)
+            self.failUnlessEqual("57", manifest)
+        d.addCallback(_got)
+        return d
+
     def test_GET_DIRURL_uri(self):
         d = self.GET(self.public_url + "/foo?t=uri")
         def _check(res):
index e902a217e397bf1d8c14f575ebcb0d501c676440..cdd2fd91bcdf8b2a23a29075d617b76475c662fe 100644 (file)
@@ -16,6 +16,7 @@
 
 <div>Other representations of this directory:
 <a href="?t=manifest">manifest</a>,
+<a href="?t=deep-size">total size</a>,
 <a href="?t=uri">URI</a>,
 <a href="?t=readonly-uri">read-only URI</a>,
 <a href="?t=json">JSON</a>
index 3b6485d120cfef02e8437461d8e7a92b7d11bb36..8bda3d49d4a203761027c334295d0ea90fc4002a 100644 (file)
@@ -12,6 +12,7 @@ from allmydata.interfaces import IDownloadTarget, IDirectoryNode, IFileNode, \
      IMutableFileNode
 import allmydata # to display import path
 from allmydata import download
+from allmydata.uri import from_string_verifier, CHKFileVerifierURI
 from allmydata.upload import FileHandle, FileName
 from allmydata import provisioning
 from allmydata import get_package_versions_string
@@ -1223,6 +1224,25 @@ class Manifest(rend.Page):
         ctx.fillSlots("refresh_capability", refresh_cap)
         return ctx.tag
 
+class DeepSize(rend.Page):
+
+    def __init__(self, dirnode, dirpath):
+        self._dirnode = dirnode
+        self._dirpath = dirpath
+
+    def renderHTTP(self, ctx):
+        inevow.IRequest(ctx).setHeader("content-type", "text/plain")
+        d = self._dirnode.build_manifest()
+        def _measure_size(manifest):
+            total = 0
+            for verifiercap in manifest:
+                u = from_string_verifier(verifiercap)
+                if isinstance(u, CHKFileVerifierURI):
+                    total += u.size
+            return str(total)
+        d.addCallback(_measure_size)
+        return d
+
 class ChildError:
     implements(inevow.IResource)
     def renderHTTP(self, ctx):
@@ -1315,6 +1335,8 @@ class VDrive(rend.Page):
                         return DirectoryReadonlyURI(node), ()
                     elif t == "manifest":
                         return Manifest(node, path), ()
+                    elif t == "deep-size":
+                        return DeepSize(node, path), ()
                     elif t == 'rename-form':
                         return RenameForm(self.name, node, path), ()
                     else: