From: Daira Hopwood 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/components/%22news.html/simplejson/decoder.py.html?a=commitdiff_plain;h=3a22fdc7ca1aa8aca1646bba14f2dd8469a1926e;p=tahoe-lafs%2Ftahoe-lafs.git Remove the [storage]expire.{mutable,immutable} options. Signed-off-by: Daira Hopwood --- 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 aa3ad411..f28ba017 100644 --- a/src/allmydata/test/test_client.py +++ b/src/allmydata/test/test_client.py @@ -242,6 +242,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 5fcb0208..b63f28df 100644 --- a/src/allmydata/test/test_storage.py +++ b/src/allmydata/test/test_storage.py @@ -3564,119 +3564,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):