]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/commitdiff
backup: remove the --no-backupdb command, the handling of "can't import sqlite",... trac-3900
authorZooko O'Whielacronx <zooko@zooko.com>
Thu, 4 Jun 2009 17:31:31 +0000 (10:31 -0700)
committerZooko O'Whielacronx <zooko@zooko.com>
Thu, 4 Jun 2009 17:31:31 +0000 (10:31 -0700)
Fixes #728.

docs/backupdb.txt
src/allmydata/scripts/backupdb.py
src/allmydata/scripts/cli.py
src/allmydata/scripts/tahoe_backup.py
src/allmydata/test/test_cli.py

index c6cea64555d0f03ddfe65a2ee212c84f364664e8..23daaedaaca34473ffb10051320896aa62b7256b 100644 (file)
@@ -5,9 +5,9 @@ To speed up backup operations, Tahoe maintains a small database known as the
 uploaded recently.
 
 This database lives in ~/.tahoe/private/backupdb.sqlite, and is a SQLite
-single-file database. It is used by the "tahoe backup" command (unless the
---no-backupdb option is included). In the future, it will also be used by
-"tahoe mirror", and by "tahoe cp" when the --use-backupdb option is included.
+single-file database. It is used by the "tahoe backup" command. In the future,
+it will also be used by "tahoe mirror", and by "tahoe cp" when the
+--use-backupdb option is included.
 
 The purpose of this database is specifically to manage the file-to-cap
 translation (the "upload" step). It does not address directory updates. A
@@ -23,9 +23,13 @@ subsequent backup operation may use more effort (network bandwidth, CPU
 cycles, and disk IO) than it would have without the backupdb.
 
 The database uses sqlite3, which is included as part of the standard python
-library with python2.5 and later. For python2.4, please install the
-"pysqlite2" package (which, despite the name, actually provides sqlite3
-rather than sqlite2).
+library with python2.5 and later. For python2.4, Tahoe will try to install the
+"pysqlite" package at build-time, but this will succeed only if sqlite3 with
+development headers is already installed.  On Debian and Debian derivatives
+you can install the "python-pysqlite2" package (which, despite the name,
+actually provides sqlite3 rather than sqlite2), but on old distributions such
+as Debian etch (4.0 "oldstable") or Ubuntu Edgy (6.10) the "python-pysqlite2"
+package won't work, but the "sqlite3-dev" package will.
 
 == Schema ==
 
index 8ab41d158c3c81472b481f727280ed4d326d1aa0..add7c02c68f993024caf34e7cf9c7dd61e05bbd6 100644 (file)
@@ -47,27 +47,10 @@ def get_backupdb(dbfile, stderr=sys.stderr):
         import sqlite3
         sqlite = sqlite3 # pyflakes whines about 'import sqlite3 as sqlite' ..
     except ImportError:
-        try:
-            from pysqlite2 import dbapi2
-            sqlite = dbapi2 # .. when this clause does it too
-        except ImportError:
-            print >>stderr, """\
-The backup command uses a SQLite database to avoid duplicate uploads, but
-I was unable to import a python sqlite library. You have two options:
-
- 1: Install a python sqlite library. python2.5 and beyond have one built-in.
-    If you are using python2.4, you can install the 'pysqlite' package,
-    perhaps with 'apt-get install python-pysqlite2', or 'easy_install
-    pysqlite', or by installing the 'pysqlite' package from
-    http://pypi.python.org . Make sure you get the version with support for
-    SQLite 3.
-
- 2: Run me with the --no-backupdb option to disable use of the database. This
-    will be somewhat slower, since I will be unable to avoid re-uploading
-    files that were uploaded in the past, but the basic functionality will be
-    unimpaired.
-"""
-            return None
+        from pysqlite2 import dbapi2
+        sqlite = dbapi2 # .. when this clause does it too
+        # This import should never fail, because setuptools requires that the
+        # "pysqlite" distribution is present at start time (if on Python < 2.5).
 
     must_create = not os.path.exists(dbfile)
     try:
index de8d6249bc9787779f03975e8c71b48c79707c81..e65196c624c5ac40159c47f7069d1b72ae9c4277 100644 (file)
@@ -208,7 +208,6 @@ class BackupConfigurationError(Exception):
 class BackupOptions(VDriveOptions):
     optFlags = [
         ("verbose", "v", "Be noisy about what is happening."),
-        ("no-backupdb", None, "Do not use the SQLite-based backup-database (always upload all files)."),
         ("ignore-timestamps", None, "Do not use backupdb timestamps to decide if a local file is unchanged."),
         ]
 
index d87196b7943cdb9cea903bd83e262bebcd541b2b..c8d5ea35f609d367e767b38a6904bef10df8e15c 100644 (file)
@@ -157,17 +157,13 @@ class BackerUpper:
 
         start_timestamp = datetime.datetime.now()
         self.backupdb = None
-        use_backupdb = not options["no-backupdb"]
-        if use_backupdb:
-            bdbfile = os.path.join(options["node-directory"],
-                                   "private", "backupdb.sqlite")
-            bdbfile = os.path.abspath(bdbfile)
-            self.backupdb = backupdb.get_backupdb(bdbfile, stderr)
-            if not self.backupdb:
-                # get_backupdb() has already delivered a lengthy speech about
-                # where to find pysqlite and how to add --no-backupdb
-                print >>stderr, "ERROR: Unable to import sqlite."
-                return 1
+        bdbfile = os.path.join(options["node-directory"],
+                               "private", "backupdb.sqlite")
+        bdbfile = os.path.abspath(bdbfile)
+        self.backupdb = backupdb.get_backupdb(bdbfile, stderr)
+        if not self.backupdb:
+            print >>stderr, "ERROR: Unable to load backup db."
+            return 1
 
         rootcap, path = get_alias(options.aliases, options.to_dir, DEFAULT_ALIAS)
         to_url = nodeurl + "uri/%s/" % urllib.quote(rootcap)
index dcab060fe0bd35a75e1e65dc367327e188df3c8f..12502f852a8c8ccf76f16edcc772142a42629063 100644 (file)
@@ -871,10 +871,8 @@ class Backup(GridTestMixin, CLITestMixin, StallMixin, unittest.TestCase):
         self.writeto("parent/subdir/bar.txt", "bar\n" * 1000)
         self.writeto("parent/blah.txt", "blah")
 
-        def do_backup(use_backupdb=True, verbose=False):
+        def do_backup(verbose=False):
             cmd = ["backup"]
-            if not have_bdb or not use_backupdb:
-                cmd.append("--no-backupdb")
             if verbose:
                 cmd.append("--verbose")
             cmd.append(source)
@@ -1055,20 +1053,6 @@ class Backup(GridTestMixin, CLITestMixin, StallMixin, unittest.TestCase):
             self.failUnlessEqual(out, "foo")
         d.addCallback(_check8)
 
-        d.addCallback(self.stall, 1.1)
-        d.addCallback(lambda res: do_backup(use_backupdb=False))
-        def _check9((rc, out, err)):
-            # --no-backupdb means re-upload everything. We still get to
-            # re-use the directories, since nothing changed.
-            self.failUnlessEqual(err, "")
-            self.failUnlessEqual(rc, 0)
-            fu, fr, dc, dr = self.count_output(out)
-            self.failUnlessEqual(fu, 5)
-            self.failUnlessEqual(fr, 0)
-            self.failUnlessEqual(dc, 0)
-            self.failUnlessEqual(dr, 5)
-        d.addCallback(_check9)
-
         return d
 
     # on our old dapper buildslave, this test takes a long time (usually