From: Daira Hopwood <daira@jacaranda.org>
Date: Fri, 17 Apr 2015 18:00:57 +0000 (+0100)
Subject: Remove the [storage]expire.{mutable,immutable} options.
X-Git-Url: https://git.rkrishnan.org/%5B/frontends/index.php?a=commitdiff_plain;h=4700c933c56000b9a0d0b3426a9331f0028b1b88;p=tahoe-lafs%2Ftahoe-lafs.git

Remove the [storage]expire.{mutable,immutable} options.

Signed-off-by: Daira Hopwood <daira@jacaranda.org>
---

diff --git a/docs/configuration.rst b/docs/configuration.rst
index ac75cca7..7e47f4a2 100644
--- a/docs/configuration.rst
+++ b/docs/configuration.rst
@@ -491,10 +491,6 @@ Storage Server Configuration
 
 ``expire.cutoff_date =``
 
-``expire.immutable =``
-
-``expire.mutable =``
-
     These settings control garbage collection, in which the server will
     delete shares that no longer have an up-to-date lease on them. Please see
     garbage-collection.rst_ for full details.
diff --git a/docs/garbage-collection.rst b/docs/garbage-collection.rst
index 3e8b4e5d..2078fdcc 100644
--- a/docs/garbage-collection.rst
+++ b/docs/garbage-collection.rst
@@ -203,17 +203,10 @@ The ``tahoe.cfg`` file uses the following keys to control lease expiration:
     "expire.mode = cutoff-date"). It will be rejected if age-based expiration
     is in use.
 
-  expire.immutable = (boolean, optional)
-
-    If this is False, then immutable shares will never be deleted, even if
-    their leases have expired. This can be used in special situations to
-    perform GC on mutable files but not immutable ones. The default is True.
-
-  expire.mutable = (boolean, optional)
-
-    If this is False, then mutable shares will never be deleted, even if
-    their leases have expired. This can be used in special situations to
-    perform GC on immutable files but not mutable ones. The default is True.
+In previous versions, the ``expire.immutable`` and ``expire.mutable`` keys
+could be used to selectively expire only mutable or only immutable shares.
+As of Tahoe-LAFS v1.11.0, these are no longer supported and will cause an
+error if set to ``False``.
 
 Expiration Progress
 ===================
diff --git a/src/allmydata/client.py b/src/allmydata/client.py
index 6e9cadc7..88530dcd 100644
--- a/src/allmydata/client.py
+++ b/src/allmydata/client.py
@@ -290,12 +290,11 @@ class Client(node.Node, pollmixin.PollMixin):
             cutoff_date = self.get_config("storage", "expire.cutoff_date")
             cutoff_date = parse_date(cutoff_date)
 
-        sharetypes = []
-        if self.get_config("storage", "expire.immutable", True, boolean=True):
-            sharetypes.append("immutable")
-        if self.get_config("storage", "expire.mutable", True, boolean=True):
-            sharetypes.append("mutable")
-        expiration_sharetypes = tuple(sharetypes)
+        if not self.get_config("storage", "expire.immutable", True, boolean=True):
+            raise OldConfigOptionError("[storage]expire.immutable = False is no longer supported.")
+        if not self.get_config("storage", "expire.mutable", True, boolean=True):
+            raise OldConfigOptionError("[storage]expire.mutable = False is no longer supported.")
+        expiration_sharetypes = ('mutable', 'immutable')
 
         ss = StorageServer(storedir, self.nodeid,
                            reserved_space=reserved,
diff --git a/src/allmydata/test/test_client.py b/src/allmydata/test/test_client.py
index 3d1d1f91..2cfcb885 100644
--- a/src/allmydata/test/test_client.py
+++ b/src/allmydata/test/test_client.py
@@ -247,6 +247,26 @@ class Basic(testutil.ReallyEqualMixin, unittest.TestCase):
                         "port = tcp:0:interface=127.0.0.1\n"))
         self.failUnlessRaises(NeedRootcapLookupScheme, client.Client, basedir)
 
+    def test_expire_mutable_false_unsupported(self):
+        basedir = "client.Basic.test_expire_mutable_false_unsupported"
+        os.mkdir(basedir)
+        fileutil.write(os.path.join(basedir, "tahoe.cfg"), \
+                       BASECONFIG + \
+                       "[storage]\n" + \
+                       "enabled = true\n" + \
+                       "expire.mutable = False\n")
+        self.failUnlessRaises(OldConfigOptionError, client.Client, basedir)
+
+    def test_expire_immutable_false_unsupported(self):
+        basedir = "client.Basic.test_expire_immutable_false_unsupported"
+        os.mkdir(basedir)
+        fileutil.write(os.path.join(basedir, "tahoe.cfg"), \
+                       BASECONFIG + \
+                       "[storage]\n" + \
+                       "enabled = true\n" + \
+                       "expire.immutable = False\n")
+        self.failUnlessRaises(OldConfigOptionError, client.Client, basedir)
+
     def test_debug_discard_true_unsupported(self):
         basedir = "client.Basic.test_debug_discard_true_unsupported"
         os.mkdir(basedir)
diff --git a/src/allmydata/test/test_storage.py b/src/allmydata/test/test_storage.py
index 20586483..5fca2352 100644
--- a/src/allmydata/test/test_storage.py
+++ b/src/allmydata/test/test_storage.py
@@ -3567,119 +3567,6 @@ class LeaseCrawler(unittest.TestCase, pollmixin.PollMixin, WebRenderingMixin):
         d.addCallback(_check_html)
         return d
 
-    def test_only_immutable(self):
-        basedir = "storage/LeaseCrawler/only_immutable"
-        fileutil.make_dirs(basedir)
-        now = time.time()
-        then = int(now - 2000)
-        ss = StorageServer(basedir, "\x00" * 20,
-                           expiration_enabled=True,
-                           expiration_mode="cutoff-date",
-                           expiration_cutoff_date=then,
-                           expiration_sharetypes=("immutable",))
-        lc = ss.lease_checker
-        lc.slow_start = 0
-        webstatus = StorageStatus(ss)
-
-        self.make_shares(ss)
-        [immutable_si_0, immutable_si_1, mutable_si_2, mutable_si_3] = self.sis
-        # set all leases to be expirable
-        new_expiration_time = now - 3000 + 31*24*60*60
-
-        def count_shares(si):
-            return len(list(ss._iter_share_files(si)))
-        def _get_sharefile(si):
-            return list(ss._iter_share_files(si))[0]
-        def count_leases(si):
-            return len(list(_get_sharefile(si).get_leases()))
-
-        sf0 = _get_sharefile(immutable_si_0)
-        self.backdate_lease(sf0, self.renew_secrets[0], new_expiration_time)
-        sf1 = _get_sharefile(immutable_si_1)
-        self.backdate_lease(sf1, self.renew_secrets[1], new_expiration_time)
-        self.backdate_lease(sf1, self.renew_secrets[2], new_expiration_time)
-        sf2 = _get_sharefile(mutable_si_2)
-        self.backdate_lease(sf2, self.renew_secrets[3], new_expiration_time)
-        sf3 = _get_sharefile(mutable_si_3)
-        self.backdate_lease(sf3, self.renew_secrets[4], new_expiration_time)
-        self.backdate_lease(sf3, self.renew_secrets[5], new_expiration_time)
-
-        ss.setServiceParent(self.s)
-        def _wait():
-            return bool(lc.get_state()["last-cycle-finished"] is not None)
-        d = self.poll(_wait)
-
-        def _after_first_cycle(ignored):
-            self.failUnlessEqual(count_shares(immutable_si_0), 0)
-            self.failUnlessEqual(count_shares(immutable_si_1), 0)
-            self.failUnlessEqual(count_shares(mutable_si_2), 1)
-            self.failUnlessEqual(count_leases(mutable_si_2), 1)
-            self.failUnlessEqual(count_shares(mutable_si_3), 1)
-            self.failUnlessEqual(count_leases(mutable_si_3), 2)
-        d.addCallback(_after_first_cycle)
-        d.addCallback(lambda ign: self.render1(webstatus))
-        def _check_html(html):
-            s = remove_tags(html)
-            self.failUnlessIn("The following sharetypes will be expired: immutable.", s)
-        d.addCallback(_check_html)
-        return d
-
-    def test_only_mutable(self):
-        basedir = "storage/LeaseCrawler/only_mutable"
-        fileutil.make_dirs(basedir)
-        now = time.time()
-        then = int(now - 2000)
-        ss = StorageServer(basedir, "\x00" * 20,
-                           expiration_enabled=True,
-                           expiration_mode="cutoff-date",
-                           expiration_cutoff_date=then,
-                           expiration_sharetypes=("mutable",))
-        lc = ss.lease_checker
-        lc.slow_start = 0
-        webstatus = StorageStatus(ss)
-
-        self.make_shares(ss)
-        [immutable_si_0, immutable_si_1, mutable_si_2, mutable_si_3] = self.sis
-        # set all leases to be expirable
-        new_expiration_time = now - 3000 + 31*24*60*60
-
-        def count_shares(si):
-            return len(list(ss._iter_share_files(si)))
-        def _get_sharefile(si):
-            return list(ss._iter_share_files(si))[0]
-        def count_leases(si):
-            return len(list(_get_sharefile(si).get_leases()))
-
-        sf0 = _get_sharefile(immutable_si_0)
-        self.backdate_lease(sf0, self.renew_secrets[0], new_expiration_time)
-        sf1 = _get_sharefile(immutable_si_1)
-        self.backdate_lease(sf1, self.renew_secrets[1], new_expiration_time)
-        self.backdate_lease(sf1, self.renew_secrets[2], new_expiration_time)
-        sf2 = _get_sharefile(mutable_si_2)
-        self.backdate_lease(sf2, self.renew_secrets[3], new_expiration_time)
-        sf3 = _get_sharefile(mutable_si_3)
-        self.backdate_lease(sf3, self.renew_secrets[4], new_expiration_time)
-        self.backdate_lease(sf3, self.renew_secrets[5], new_expiration_time)
-
-        ss.setServiceParent(self.s)
-        def _wait():
-            return bool(lc.get_state()["last-cycle-finished"] is not None)
-        d = self.poll(_wait)
-
-        def _after_first_cycle(ignored):
-            self.failUnlessEqual(count_shares(immutable_si_0), 1)
-            self.failUnlessEqual(count_leases(immutable_si_0), 1)
-            self.failUnlessEqual(count_shares(immutable_si_1), 1)
-            self.failUnlessEqual(count_leases(immutable_si_1), 2)
-            self.failUnlessEqual(count_shares(mutable_si_2), 0)
-            self.failUnlessEqual(count_shares(mutable_si_3), 0)
-        d.addCallback(_after_first_cycle)
-        d.addCallback(lambda ign: self.render1(webstatus))
-        def _check_html(html):
-            s = remove_tags(html)
-            self.failUnlessIn("The following sharetypes will be expired: mutable.", s)
-        d.addCallback(_check_html)
-        return d
 
     def test_bad_mode(self):
         basedir = "storage/LeaseCrawler/bad_mode"
diff --git a/src/allmydata/web/storage.py b/src/allmydata/web/storage.py
index 24d769bb..6bb27850 100644
--- a/src/allmydata/web/storage.py
+++ b/src/allmydata/web/storage.py
@@ -151,9 +151,6 @@ class StorageStatus(rend.Page):
             isoutcdate = time_format.iso_utc_date(lc.cutoff_date)
             ctx.tag["Leases created or last renewed before %s (%s) UTC "
                     "will be considered expired." % (isoutcdate, localizedutcdate, )]
-        if len(lc.mode) > 2:
-            ctx.tag[" The following sharetypes will be expired: ",
-                    " ".join(sorted(lc.sharetypes_to_expire)), "."]
         return ctx.tag
 
     def format_recovered(self, sr, a):