From: Brian Warner 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/%5B/%5D%20/file/URI:LIT:krugkidfnzsc4/README.win32?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):