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