From e2031aff0f2c031048da2e732d7dce89a4c9d51d Mon Sep 17 00:00:00 2001
From: Brian Warner <warner@lothar.com>
Date: Tue, 27 Apr 2010 22:08:03 -0700
Subject: [PATCH] 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.
---
 src/allmydata/scripts/backupdb.py | 13 +++++--------
 1 file changed, 5 insertions(+), 8 deletions(-)

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):
-- 
2.45.2