]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - docs/garbage-collection.rst
storage: remove the storage server's "remote_cancel_lease" function
[tahoe-lafs/tahoe-lafs.git] / docs / garbage-collection.rst
1 ===========================
2 Garbage Collection in Tahoe
3 ===========================
4
5 1. `Overview`_
6 2. `Client-side Renewal`_
7 3. `Server Side Expiration`_
8 4. `Expiration Progress`_
9 5. `Future Directions`_
10
11 Overview
12 ========
13
14 When a file or directory in the virtual filesystem is no longer referenced,
15 the space that its shares occupied on each storage server can be freed,
16 making room for other shares. Tahoe currently uses a garbage collection
17 ("GC") mechanism to implement this space-reclamation process. Each share has
18 one or more "leases", which are managed by clients who want the
19 file/directory to be retained. The storage server accepts each share for a
20 pre-defined period of time, and is allowed to delete the share if all of the
21 leases expire.
22
23 Garbage collection is not enabled by default: storage servers will not delete
24 shares without being explicitly configured to do so. When GC is enabled,
25 clients are responsible for renewing their leases on a periodic basis at
26 least frequently enough to prevent any of the leases from expiring before the
27 next renewal pass.
28
29 There are several tradeoffs to be considered when choosing the renewal timer
30 and the lease duration, and there is no single optimal pair of values. See
31 the `<lease-tradeoffs.svg>`_ diagram to get an idea for the tradeoffs involved.
32 If lease renewal occurs quickly and with 100% reliability, than any renewal
33 time that is shorter than the lease duration will suffice, but a larger ratio
34 of duration-over-renewal-time will be more robust in the face of occasional
35 delays or failures.
36
37 The current recommended values for a small Tahoe grid are to renew the leases
38 once a week, and give each lease a duration of 31 days. In the current
39 release, there is not yet a way to create a lease with a different duration,
40 but the server can use the ``expire.override_lease_duration`` configuration
41 setting to increase or decrease the effective duration (when the lease is
42 processed) to something other than 31 days.
43
44 Renewing leases can be expected to take about one second per file/directory,
45 depending upon the number of servers and the network speeds involved.
46
47 Client-side Renewal
48 ===================
49
50 If all of the files and directories which you care about are reachable from a
51 single starting point (usually referred to as a "rootcap"), and you store
52 that rootcap as an alias (via "``tahoe create-alias``" for example), then the
53 simplest way to renew these leases is with the following CLI command::
54
55   tahoe deep-check --add-lease ALIAS:
56
57 This will recursively walk every directory under the given alias and renew
58 the leases on all files and directories. (You may want to add a ``--repair``
59 flag to perform repair at the same time.) Simply run this command once a week
60 (or whatever other renewal period your grid recommends) and make sure it
61 completes successfully. As a side effect, a manifest of all unique files and
62 directories will be emitted to stdout, as well as a summary of file sizes and
63 counts. It may be useful to track these statistics over time.
64
65 Note that newly uploaded files (and newly created directories) get an initial
66 lease too: the ``--add-lease`` process is only needed to ensure that all
67 older objects have up-to-date leases on them.
68
69 A separate "rebalancing manager/service" is also planned -- see ticket
70 `#543 <http://tahoe-lafs.org/trac/tahoe-lafs/ticket/543>`_. The exact
71 details of what this service will do are not settled, but it is likely to
72 work by acquiring manifests from rootcaps on a periodic basis, keeping track
73 of checker results, managing lease-addition, and prioritizing repair and
74 rebalancing of shares. Eventually it may use multiple worker nodes to perform
75 these jobs in parallel.
76
77 Server Side Expiration
78 ======================
79
80 Expiration must be explicitly enabled on each storage server, since the
81 default behavior is to never expire shares. Expiration is enabled by adding
82 config keys to the ``[storage]`` section of the ``tahoe.cfg`` file (as described
83 below) and restarting the server node.
84
85 Each lease has two parameters: a create/renew timestamp and a duration. The
86 timestamp is updated when the share is first uploaded (i.e. the file or
87 directory is created), and updated again each time the lease is renewed (i.e.
88 "``tahoe check --add-lease``" is performed). The duration is currently fixed
89 at 31 days, and the "nominal lease expiration time" is simply $duration
90 seconds after the $create_renew timestamp. (In a future release of Tahoe, the
91 client will get to request a specific duration, and the server will accept or
92 reject the request depending upon its local configuration, so that servers
93 can achieve better control over their storage obligations.)
94
95 The lease-expiration code has two modes of operation. The first is age-based:
96 leases are expired when their age is greater than their duration. This is the
97 preferred mode: as long as clients consistently update their leases on a
98 periodic basis, and that period is shorter than the lease duration, then all
99 active files and directories will be preserved, and the garbage will
100 collected in a timely fashion.
101
102 Since there is not yet a way for clients to request a lease duration of other
103 than 31 days, there is a ``tahoe.cfg`` setting to override the duration of all
104 leases. If, for example, this alternative duration is set to 60 days, then
105 clients could safely renew their leases with an add-lease operation perhaps
106 once every 50 days: even though nominally their leases would expire 31 days
107 after the renewal, the server would not actually expire the leases until 60
108 days after renewal.
109
110 The other mode is an absolute-date-cutoff: it compares the create/renew
111 timestamp against some absolute date, and expires any lease which was not
112 created or renewed since the cutoff date. If all clients have performed an
113 add-lease some time after March 20th, you could tell the storage server to
114 expire all leases that were created or last renewed on March 19th or earlier.
115 This is most useful if you have a manual (non-periodic) add-lease process.
116 Note that there is not much point to running a storage server in this mode
117 for a long period of time: once the lease-checker has examined all shares and
118 expired whatever it is going to expire, the second and subsequent passes are
119 not going to find any new leases to remove.
120
121 The ``tahoe.cfg`` file uses the following keys to control lease expiration:
122
123 ``[storage]``
124
125 ``expire.enabled = (boolean, optional)``
126
127     If this is ``True``, the storage server will delete shares on which all
128     leases have expired. Other controls dictate when leases are considered to
129     have expired. The default is ``False``.
130
131 ``expire.mode = (string, "age" or "cutoff-date", required if expiration enabled)``
132
133     If this string is "age", the age-based expiration scheme is used, and the
134     ``expire.override_lease_duration`` setting can be provided to influence the
135     lease ages. If it is "cutoff-date", the absolute-date-cutoff mode is
136     used, and the ``expire.cutoff_date`` setting must be provided to specify
137     the cutoff date. The mode setting currently has no default: you must
138     provide a value.
139
140     In a future release, this setting is likely to default to "age", but in
141     this release it was deemed safer to require an explicit mode
142     specification.
143
144 ``expire.override_lease_duration = (duration string, optional)``
145
146     When age-based expiration is in use, a lease will be expired if its
147     ``lease.create_renew`` timestamp plus its ``lease.duration`` time is
148     earlier/older than the current time. This key, if present, overrides the
149     duration value for all leases, changing the algorithm from::
150
151       if (lease.create_renew_timestamp + lease.duration) < now:
152           expire_lease()
153
154     to::
155
156       if (lease.create_renew_timestamp + override_lease_duration) < now:
157           expire_lease()
158
159     The value of this setting is a "duration string", which is a number of
160     days, months, or years, followed by a units suffix, and optionally
161     separated by a space, such as one of the following::
162
163       7days
164       31day
165       60 days
166       2mo
167       3 month
168       12 months
169       2years
170
171     This key is meant to compensate for the fact that clients do not yet have
172     the ability to ask for leases that last longer than 31 days. A grid which
173     wants to use faster or slower GC than a 31-day lease timer permits can
174     use this parameter to implement it.
175
176     This key is only valid when age-based expiration is in use (i.e. when
177     ``expire.mode = age`` is used). It will be rejected if cutoff-date
178     expiration is in use.
179
180 ``expire.cutoff_date = (date string, required if mode=cutoff-date)``
181
182     When cutoff-date expiration is in use, a lease will be expired if its
183     create/renew timestamp is older than the cutoff date. This string will be
184     a date in the following format::
185
186       2009-01-16   (January 16th, 2009)
187       2008-02-02
188       2007-12-25
189
190     The actual cutoff time shall be midnight UTC at the beginning of the
191     given day. Lease timers should naturally be generous enough to not depend
192     upon differences in timezone: there should be at least a few days between
193     the last renewal time and the cutoff date.
194
195     This key is only valid when cutoff-based expiration is in use (i.e. when
196     "expire.mode = cutoff-date"). It will be rejected if age-based expiration
197     is in use.
198
199   expire.immutable = (boolean, optional)
200
201     If this is False, then immutable shares will never be deleted, even if
202     their leases have expired. This can be used in special situations to
203     perform GC on mutable files but not immutable ones. The default is True.
204
205   expire.mutable = (boolean, optional)
206
207     If this is False, then mutable shares will never be deleted, even if
208     their leases have expired. This can be used in special situations to
209     perform GC on immutable files but not mutable ones. The default is True.
210
211 Expiration Progress
212 ===================
213
214 In the current release, leases are stored as metadata in each share file, and
215 no separate database is maintained. As a result, checking and expiring leases
216 on a large server may require multiple reads from each of several million
217 share files. This process can take a long time and be very disk-intensive, so
218 a "share crawler" is used. The crawler limits the amount of time looking at
219 shares to a reasonable percentage of the storage server's overall usage: by
220 default it uses no more than 10% CPU, and yields to other code after 100ms. A
221 typical server with 1.1M shares was observed to take 3.5 days to perform this
222 rate-limited crawl through the whole set of shares, with expiration disabled.
223 It is expected to take perhaps 4 or 5 days to do the crawl with expiration
224 turned on.
225
226 The crawler's status is displayed on the "Storage Server Status Page", a web
227 page dedicated to the storage server. This page resides at $NODEURL/storage,
228 and there is a link to it from the front "welcome" page. The "Lease
229 Expiration crawler" section of the status page shows the progress of the
230 current crawler cycle, expected completion time, amount of space recovered,
231 and details of how many shares have been examined.
232
233 The crawler's state is persistent: restarting the node will not cause it to
234 lose significant progress. The state file is located in two files
235 ($BASEDIR/storage/lease_checker.state and lease_checker.history), and the
236 crawler can be forcibly reset by stopping the node, deleting these two files,
237 then restarting the node.
238
239 Future Directions
240 =================
241
242 Tahoe's GC mechanism is undergoing significant changes. The global
243 mark-and-sweep garbage-collection scheme can require considerable network
244 traffic for large grids, interfering with the bandwidth available for regular
245 uploads and downloads (and for non-Tahoe users of the network).
246
247 A preferable method might be to have a timer-per-client instead of a
248 timer-per-lease: the leases would not be expired until/unless the client had
249 not checked in with the server for a pre-determined duration. This would
250 reduce the network traffic considerably (one message per week instead of
251 thousands), but retain the same general failure characteristics.
252
253 In addition, using timers is not fail-safe (from the client's point of view),
254 in that a client which leaves the network for an extended period of time may
255 return to discover that all of their files have been garbage-collected. (It
256 *is* fail-safe from the server's point of view, in that a server is not
257 obligated to provide disk space in perpetuity to an unresponsive client). It
258 may be useful to create a "renewal agent" to which a client can pass a list
259 of renewal-caps: the agent then takes the responsibility for keeping these
260 leases renewed, so the client can go offline safely. Of course, this requires
261 a certain amount of coordination: the renewal agent should not be keeping
262 files alive that the client has actually deleted. The client can send the
263 renewal-agent a manifest of renewal caps, and each new manifest should
264 replace the previous set.
265
266 The GC mechanism is also not immediate: a client which deletes a file will
267 nevertheless be consuming extra disk space (and might be charged or otherwise
268 held accountable for it) until the ex-file's leases finally expire on their
269 own.
270
271 In the current release, these leases are each associated with a single "node
272 secret" (stored in $BASEDIR/private/secret), which is used to generate
273 renewal-secrets for each lease. Two nodes with different secrets
274 will produce separate leases, and will not be able to renew each
275 others' leases.
276
277 Once the Accounting project is in place, leases will be scoped by a
278 sub-delegatable "account id" instead of a node secret, so clients will be able
279 to manage multiple leases per file. In addition, servers will be able to
280 identify which shares are leased by which clients, so that clients can safely
281 reconcile their idea of which files/directories are active against the
282 server's list, and explicitly cancel leases on objects that aren't on the
283 active list.
284
285 By reducing the size of the "lease scope", the coordination problem is made
286 easier. In general, mark-and-sweep is easier to implement (it requires mere
287 vigilance, rather than coordination), so unless the space used by deleted
288 files is not expiring fast enough, the renew/expire timed lease approach is
289 recommended.
290