Use DIR-IMM and t=mkdir-immutable for "tahoe backup", for #828
authorBrian Warner <warner@lothar.com>
Wed, 18 Nov 2009 19:28:13 +0000 (11:28 -0800)
committerBrian Warner <warner@lothar.com>
Wed, 18 Nov 2009 19:28:13 +0000 (11:28 -0800)
docs/frontends/CLI.txt
src/allmydata/scripts/tahoe_backup.py
src/allmydata/test/test_cli.py

index 4fbb7e5c5dbb10df4cb011a32ccaa033746d4bb6..5f601f9d3610a50769f48c9dfa91002f86b61c11 100644 (file)
@@ -336,16 +336,17 @@ tahoe mv tahoe:uploaded.txt fun:uploaded.txt
 tahoe backup ~ work:backups
 
  This command performs a full versioned backup of every file and directory
- underneath your "~" home directory, placing a read-only timestamped snapshot
- in e.g. work:backups/Archives/2009-02-06_04:00:05Z/ (note that the timestamp
- is in UTC, hence the "Z" suffix), and a link to the latest snapshot in
- work:backups/Latest/ . This command will use a small SQLite database known
- as the "backupdb", stored in ~/.tahoe/private/backupdb.sqlite, to remember
- which local files have been backed up already, and will avoid uploading
- files that have already been backed up. It compares timestamps and filesizes
- when making this comparison. The "tahoe backup" command also shares
- directories with the previous backup when nothing has changed, to run faster
- and to reduce the number of directories created.
+ underneath your "~" home directory, placing an immutable timestamped
+ snapshot in e.g. work:backups/Archives/2009-02-06_04:00:05Z/ (note that the
+ timestamp is in UTC, hence the "Z" suffix), and a link to the latest
+ snapshot in work:backups/Latest/ . This command will use a small SQLite
+ database known as the "backupdb", stored in
+ ~/.tahoe/private/backupdb.sqlite, to remember which local files have been
+ backed up already, and will avoid uploading files that have already been
+ backed up. It compares timestamps and filesizes when making this comparison.
+ The "tahoe backup" command also shares directories with the previous backup
+ when nothing has changed, to run faster and to reduce the number of
+ directories created.
 
 tahoe backup --exclude=*~ ~ work:backups
 
index c8d5ea35f609d367e767b38a6904bef10df8e15c..145106eeb61d9574ae746f588accf8069658346c 100644 (file)
@@ -83,21 +83,18 @@ def get_local_metadata(path):
     return metadata
 
 def mkdir(contents, options):
-    url = options['node-url'] + "uri?t=mkdir"
-    resp = do_http("POST", url)
-    if resp.status < 200 or resp.status >= 300:
-        raiseHTTPError("error during mkdir", resp)
-    dircap = str(resp.read().strip())
-    url = options['node-url'] + "uri/%s?t=set_children" % urllib.quote(dircap)
-    body = dict([ (childname, (contents[childname][0],
+    kids = dict([ (childname, (contents[childname][0],
                                {"ro_uri": contents[childname][1],
                                 "metadata": contents[childname][2],
                                 }))
                   for childname in contents
                   ])
-    resp = do_http("POST", url, simplejson.dumps(body))
-    if resp.status != 200:
-        raiseHTTPError("error during set_children", resp)
+    body = simplejson.dumps(kids)
+    url = options['node-url'] + "uri?t=mkdir-immutable"
+    resp = do_http("POST", url, body)
+    if resp.status < 200 or resp.status >= 300:
+        raiseHTTPError("error during mkdir", resp)
+    dircap = str(resp.read().strip())
     return dircap
 
 def put_child(dirurl, childname, childcap):
index 56a83470454177c9dcca02052f871d3c1755e4cd..58754b8865fcea0638c276091d5aacc7c56b7dd1 100644 (file)
@@ -998,11 +998,16 @@ class Backup(GridTestMixin, CLITestMixin, StallMixin, unittest.TestCase):
             self.failUnlessEqual(dr, 0)
         d.addCallback(_check0)
 
-        d.addCallback(lambda res: self.do_cli("ls", "tahoe:backups"))
+        d.addCallback(lambda res: self.do_cli("ls", "--uri", "tahoe:backups"))
         def _check1((rc, out, err)):
             self.failUnlessEqual(err, "")
             self.failUnlessEqual(rc, 0)
-            self.failUnlessEqual(sorted(out.split()), ["Archives", "Latest"])
+            lines = out.split("\n")
+            children = dict([line.split() for line in lines if line])
+            latest_uri = children["Latest"]
+            self.failUnless(latest_uri.startswith("URI:DIR2-CHK:"), latest_uri)
+            childnames = children.keys()
+            self.failUnlessEqual(sorted(childnames), ["Archives", "Latest"])
         d.addCallback(_check1)
         d.addCallback(lambda res: self.do_cli("ls", "tahoe:backups/Latest"))
         def _check2((rc, out, err)):