Skip to content

Commit

Permalink
Remove the [storage]expire.{mutable,immutable} options.
Browse files Browse the repository at this point in the history
Signed-off-by: David-Sarah Hopwood <david-sarah@jacaranda.org>
  • Loading branch information
David-Sarah Hopwood authored and daira committed Apr 8, 2014
1 parent 91c66e8 commit 79e4766
Show file tree
Hide file tree
Showing 6 changed files with 29 additions and 137 deletions.
4 changes: 0 additions & 4 deletions docs/configuration.rst
Expand Up @@ -481,10 +481,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.
Expand Down
15 changes: 4 additions & 11 deletions docs/garbage-collection.rst
Expand Up @@ -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
===================
Expand Down
11 changes: 5 additions & 6 deletions src/allmydata/client.py
Expand Up @@ -285,12 +285,11 @@ def init_storage(self):
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,
Expand Down
20 changes: 20 additions & 0 deletions src/allmydata/test/test_client.py
Expand Up @@ -150,6 +150,26 @@ def test_reserved_bad(self):
"reserved_space = bogus\n")
self.failUnlessRaises(ValueError, 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)
Expand Down
113 changes: 0 additions & 113 deletions src/allmydata/test/test_storage.py
Expand Up @@ -3558,119 +3558,6 @@ def _check_html(html):
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"
Expand Down
3 changes: 0 additions & 3 deletions src/allmydata/web/storage.py
Expand Up @@ -151,9 +151,6 @@ def render_lease_expiration_mode(self, ctx, data):
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):
Expand Down

0 comments on commit 79e4766

Please sign in to comment.