From: Brian Warner <warner@lothar.com>
Date: Wed, 28 Apr 2010 05:08:03 +0000 (-0700)
Subject: backupdb.did_create_directory: use REPLACE INTO, not INSERT INTO + ignore error
X-Git-Url: https://git.rkrishnan.org/simplejson/components/%22doc.html/install.html?a=commitdiff_plain;h=e2031aff0f2c031048da2e732d7dce89a4c9d51d;p=tahoe-lafs%2Ftahoe-lafs.git

backupdb.did_create_directory: use REPLACE INTO, not INSERT INTO + ignore error

This handles the case where we upload a new tahoe directory for a
previously-processed local directory, possibly creating a new dircap (if the
metadata had changed). Now we replace the old dirhash->dircap record. The
previous behavior left the old record in place (with the old dircap and
timestamps), so we'd never stop creating new directories and never converge
on a null backup.
---

diff --git a/src/allmydata/scripts/backupdb.py b/src/allmydata/scripts/backupdb.py
index f5e3e073..f134e142 100644
--- a/src/allmydata/scripts/backupdb.py
+++ b/src/allmydata/scripts/backupdb.py
@@ -353,14 +353,11 @@ class BackupDB_v2:
 
     def did_create_directory(self, dircap, dirhash):
         now = time.time()
-        try:
-            self.cursor.execute("INSERT INTO directories VALUES (?,?,?,?)",
-                                (dirhash, dircap, now, now))
-        except (self.sqlite_module.IntegrityError,
-                self.sqlite_module.OperationalError):
-            # dirhash was already added: maybe they did mkdir and called us
-            # even though we told them the didn't have to
-            pass
+        # if the dirhash is already present (i.e. we've re-uploaded an
+        # existing directory, possibly replacing the dircap with a new one),
+        # update the record in place. Otherwise create a new record.)
+        self.cursor.execute("REPLACE INTO directories VALUES (?,?,?,?)",
+                            (dirhash, dircap, now, now))
         self.connection.commit()
 
     def did_check_directory_healthy(self, dircap, results):