Commit Graph

126 Commits

Author SHA1 Message Date
Brian Warner
8251572e01 web: improve layout of storage status with a table 2009-02-26 19:58:38 -07:00
Brian Warner
112dc35563 crawler: add ETA to get_progress() 2009-02-26 19:42:48 -07:00
Brian Warner
77f3b83d68 crawler: fix performance problems: only save state once per timeslice (not after every bucket), don't start the crawler until 5 minutes after node startup 2009-02-21 14:56:49 -07:00
Brian Warner
3c6471c717 test_storage: startService the server, as is now the standard practice 2009-02-20 21:57:55 -07:00
Brian Warner
1077826357 BucketCountingCrawler: rename status and state keys to use 'bucket' instead of 'share', because the former is more accurate 2009-02-20 21:46:06 -07:00
Brian Warner
b3cd4952bd storage: add bucket-counting share crawler, add its output (number of files+directories maintained by a storage server) and status to the webapi /storage page 2009-02-20 21:04:08 -07:00
Brian Warner
2e45619844 web/storage: make sure we can handle platforms without os.statvfs too 2009-02-20 16:03:53 -07:00
Brian Warner
00677ff9a5 web: add Storage status page, improve tests 2009-02-20 14:29:26 -07:00
Brian Warner
4646451de6 change StorageServer to take nodeid in the constructor, instead of assigning it later, since it's cleaner and because the original problem (Tubs not being ready until later) went away 2009-02-18 16:23:01 -07:00
Brian Warner
ef53da2b12 break storage.py into smaller pieces in storage/*.py . No behavioral changes. 2009-02-18 14:46:55 -07:00
Brian Warner
e9563ebc02 change RIStorageServer.remote_add_lease to exit silently in case of no-such-bucket, instead of raising IndexError, because that makes the upcoming --add-lease feature faster and less noisy 2009-02-17 19:30:53 -07:00
Brian Warner
7d907f35aa storage: make add-lease work, change default ownernum=1 since 0 is reserved to mean 'no lease here' 2009-02-10 23:39:38 -07:00
Brian Warner
13a3ef5ec1 #620: storage: allow mutable shares to be deleted, with a writev where new_length=0 2009-02-10 23:37:56 -07:00
Zooko O'Whielacronx
e08e8d3f41 storage: disable test_large_share again: my linux laptop has less than 4 GiB free 2009-01-30 22:16:49 -07:00
Zooko O'Whielacronx
204629be43 storage: enable the test of a share larger than 2 GiB; this will probably be too expensive on Mac OS X, but I think it won't be on all the other platforms ; I will probably set it to SkipTest if the sys.platform is Mac after seeing the results of this buildbot run 2009-01-28 16:33:12 -07:00
Zooko O'Whielacronx
67d72aadd3 immutable: skip the test of large files, because that is too hard on the host if it doesn't efficiently handle sparse files 2009-01-05 17:07:27 -07:00
Zooko O'Whielacronx
778167c2b1 immutable: refactor downloader to be more reusable for checker/verifier/repairer (and better)
The code for validating the share hash tree and the block hash tree has been rewritten to make sure it handles all cases, to share metadata about the file (such as the share hash tree, block hash trees, and UEB) among different share downloads, and not to require hashes to be stored on the server unnecessarily, such as the roots of the block hash trees (not needed since they are also the leaves of the share hash tree), and the root of the share hash tree (not needed since it is also included in the UEB).  It also passes the latest tests including handling corrupted shares well.
  
ValidatedReadBucketProxy takes a share_hash_tree argument to its constructor, which is a reference to a share hash tree shared by all ValidatedReadBucketProxies for that immutable file download.
  
ValidatedReadBucketProxy requires the block_size and share_size to be provided in its constructor, and it then uses those to compute the offsets and lengths of blocks when it needs them, instead of reading those values out of the share.  The user of ValidatedReadBucketProxy therefore has to have first used a ValidatedExtendedURIProxy to compute those two values from the validated contents of the URI.  This is pleasingly simplifies safety analysis: the client knows which span of bytes corresponds to a given block from the validated URI data, rather than from the unvalidated data stored on the storage server.  It also simplifies unit testing of verifier/repairer, because now it doesn't care about the contents of the "share size" and "block size" fields in the share.  It does not relieve the need for share data v2 layout, because we still need to store and retrieve the offsets of the fields which come after the share data, therefore we still need to use share data v2 with its 8-byte fields if we want to store share data larger than about 2^32.
  
Specify which subset of the block hashes and share hashes you need while downloading a particular share.  In the future this will hopefully be used to fetch only a subset, for network efficiency, but currently all of them are fetched, regardless of which subset you specify.
  
ReadBucketProxy hides the question of whether it has "started" or not (sent a request to the server to get metadata) from its user.

Download is optimized to do as few roundtrips and as few requests as possible, hopefully speeding up download a bit.
2009-01-05 09:51:45 -07:00
Zooko O'Whielacronx
63efa1665b immutable: make the test of large files more likely to work by requesting to allocate space for only one huge share, not three 2008-12-31 15:59:42 -07:00
Zooko O'Whielacronx
b0b9e8c1da trivial: "M-x whitespace-cleanup", and also remove an unused variable 2008-12-31 15:42:33 -07:00
Zooko O'Whielacronx
6c4019ec33 immutable: storage servers accept any size shares now
Nathan Wilcox observed that the storage server can rely on the size of the share file combined with the count of leases to unambiguously identify the location of the leases.  This means that it can hold any size share data, even though the field nominally used to hold the size of the share data is only 32 bits wide.

With this patch, the storage server still writes the "size of the share data" field (just in case the server gets downgraded to an earlier version which requires that field, or the share file gets moved to another server which is of an earlier vintage), but it doesn't use it.  Also, with this patch, the server no longer rejects requests to write shares which are >= 2^32 bytes in size, and it no longer rejects attempts to read such shares.

This fixes http://allmydata.org/trac/tahoe/ticket/346 (increase share-size field to 8 bytes, remove 12GiB filesize limit), although there remains open a question of how clients know that a given server can handle large shares (by using the new versioning scheme, probably).

Note that share size is also limited by another factor -- how big of a file we can store on the local filesystem on the server.  Currently allmydata.com typically uses ext3 and I think we typically have block size = 4 KiB, which means that the largest file is about 2 TiB.  Also, the hard drives themselves are only 1 TB, so the largest share is definitely slightly less than 1 TB, which means (when K == 3), the largest file is less than 3 TB.

This patch also refactors the creation of new sharefiles so that only a single fopen() is used.

This patch also helps with the unit-testing of repairer, since formerly it was unclear what repairer should expect to find if the "share data size" field was corrupted (some corruptions would have no effect, others would cause failure to download).  Now it is clear that repairer is not required to notice if this field is corrupted since it has no effect on download.  :-)
2008-12-31 15:42:26 -07:00
Zooko O'Whielacronx
7b285ebcb1 immutable: remove the last bits of code (only test code or unused code) which did something with plaintext hashes or plaintext hash trees 2008-12-19 08:18:07 -07:00
Zooko O'Whielacronx
82ee44ed5b debug: pass empty optional arguments to ReadBucketProxy
because those arguments are about to become non-optional (for other code than test/debug code)
2008-12-16 17:51:45 -07:00
Brian Warner
6958b7fa90 test_storage.py: more windows-vs-readonly-storage fixes 2008-12-02 19:41:02 -07:00
Brian Warner
cfba882b30 storage: replace sizelimit with reserved_space, make the stats 'disk_avail' number incorporate this reservation 2008-12-01 17:24:21 -07:00
Brian Warner
db37c14ab7 storage: add remote_advise_corrupt_share, for clients to tell storage servers about share corruption that they've discovered. The server logs the report. 2008-10-24 11:52:48 -07:00
Brian Warner
46657b797f test_storage: use different filenames, poor stupid windows 2008-10-09 19:11:39 -07:00
Brian Warner
7031a69bee storage: introduce v2 immutable shares, with 8-byte offsets fields, to remove two of the three size limitations in #346. This code handles v2 shares but does not generate them. We'll make a release with this v2-tolerance, wait a while, then make a second release that actually generates v2 shares, to avoid compatibility problems. 2008-10-09 18:13:27 -07:00
Brian Warner
288d55825c storage: split WriteBucketProxy and ReadBucketProxy out into immutable/layout.py . No behavioral changes. 2008-10-09 17:08:00 -07:00
Brian Warner
afda2a43e4 storage: remove update_write_enabler method, it won't serve the desired purpose, and I have a better scheme in mind. See #489 for details 2008-07-21 17:28:28 -07:00
Brian Warner
c46f5bc634 storage: rename the latency key names so they sort properly 2008-07-11 21:51:02 -07:00
Brian Warner
60725ed065 storage: add add_lease/update_write_enabler to remote API, revamp lease handling 2008-07-09 18:06:55 -07:00
Brian Warner
dfe235bcba test_storage: oops, update the test to match the leave-incoming/ change 2008-06-26 11:36:17 -07:00
Brian Warner
c09c342718 test_storage: yet more coverage 2008-06-17 17:44:10 -07:00
Brian Warner
6b55b8b022 test_storage.py: improve test coverage 2008-06-17 17:01:42 -07:00
Brian Warner
2154b5751b test_storage: add coverage for discard_storage 2008-06-16 17:52:40 -07:00
Brian Warner
75e662cc46 test_storage: add coverage for readonly_storage 2008-06-16 17:52:13 -07:00
Brian Warner
1ce3b77dde storage: improve stats, make them accessible via webport /statistics 2008-06-16 16:35:59 -07:00
Brian Warner
6b7ff02e36 storage: measure latency-per-operation, calculate mean/median/percentiles 2008-06-16 15:21:55 -07:00
Brian Warner
814922a9a1 storage: ignore shares in incoming/, to make clients use other servers during simultaneous uploads 2008-06-10 11:53:10 -07:00
Brian Warner
670933ecee storage: clean up use of si_s vs si_dir, add test for BadWriterEnabler message, add some logging 2008-01-31 17:48:48 -07:00
Zooko O'Whielacronx
7bf21082f7 remove unused import (thanks, pyflakes) 2008-01-31 17:00:59 -07:00
Zooko O'Whielacronx
79c439d026 storage: make two levels of share directories so as not to exceed certain filesystems's limitations on directory size
The filesystem which gets my vote for most undeservedly popular is ext3, and it has a hard limit of 32,000 entries in a directory.  Many other filesystems (even ones that I like more than I like ext3) have either hard limits or bad performance consequences or weird edge cases when you get too many entries in a single directory.

This patch makes it so that there is a layer of intermediate directories between the "shares" directory and the actual storage-index directory (the one whose name contains the entire storage index (z-base-32 encoded) and which contains one or more share files named by their share number).

The intermediate directories are named by the first 14 bits of the storage index, which means there are at most 16384 of them.  (This also means that the intermediate directory names are not a leading prefix of the storage-index directory names -- to do that would have required us to have intermediate directories limited to either 1024 (2-char), which is too few, or 32768 (3-chars of a full 5 bits each), which would overrun ext3's funny hard limit of 32,000.))

This closes #150, and please see the "convertshares.py" script attached to #150 to convert your old tahoe-0.7.0 storage/shares directory into a new tahoe-0.8.0 storage/shares directory.
2008-01-31 16:26:28 -07:00
Brian Warner
8063aa8b86 WriteBucketProxy: improve __repr__ 2008-01-28 18:53:51 -07:00
Brian Warner
821521cc3e test_storage: fix pyflakes warnings 2008-01-14 21:26:48 -07:00
Brian Warner
a6ca98ac53 upload: add Encoder.abort(), to abandon the upload in progress. Add some debug hooks to enable unit tests. 2008-01-14 21:22:55 -07:00
Brian Warner
76ee9cccfe storage: improve logging a bit 2008-01-14 11:58:58 -07:00
Zooko O'Whielacronx
08a64c3a2b rename "secret" to "lease_secret" and change its size from 16 to 32 bytes 2007-12-17 18:34:11 -07:00
Brian Warner
e08b091d9f storage: rewrite slot API, now use testv_and_readv_and_writev or readv 2007-11-05 20:17:14 -07:00
Brian Warner
8f21424449 storage: add readv_slots: get data from all shares 2007-11-05 00:37:01 -07:00
Brian Warner
bcf84c1238 storage.py: fix tests, timestamps get updated when leases are renewed 2007-10-31 12:31:33 -07:00
Brian Warner
70e7961088 storage.py: more test coverage, make sure leases survive resizing 2007-10-31 12:07:47 -07:00
Brian Warner
948e6b34dd storage.py: improve test coverage even more 2007-10-31 01:44:01 -07:00
Brian Warner
4bd739435f storage.py: more mutable-slot coverage, renewing/cancelling leases 2007-10-31 01:31:56 -07:00
Brian Warner
256ef1bf53 mutable slots: add some test coverage for lease-addition 2007-10-31 00:38:30 -07:00
Brian Warner
68d3d62002 mutable slots: finish up basic coding on server-side containers, add some tests. Remove all caching from MutableShareFile. 2007-10-31 00:10:40 -07:00
Brian Warner
b24c2925e8 checkpointing mutable-file work. Storage layer is 80% in place. 2007-10-30 19:47:36 -07:00
Brian Warner
8451b485a4 storage: fill alreadygot= with all known shares for the given storageindex, not just the ones they asked about 2007-09-17 00:48:40 -07:00
Brian Warner
d628d5f503 storage: remove the leftover incoming/XYZ/ directory when we're done with it 2007-09-15 14:34:04 -07:00
Brian Warner
277e720f7c storage: add version number to share data. Closes #90. 2007-09-04 09:00:24 -07:00
Brian Warner
85f3107b12 storage: handle simultanous uploads: add a lease for the pre-empted client 2007-09-02 14:57:49 -07:00
Brian Warner
0fe1205789 storage: replace sqlite with in-share lease records 2007-09-02 14:47:15 -07:00
Brian Warner
2a63fe8b01 deletion phase3: add a sqlite database to track renew/cancel-lease secrets, implement renew/cancel_lease (but nobody calls them yet). Also, move the shares from BASEDIR/storage/* down to BASEDIR/storage/shares/* 2007-08-27 23:41:40 -07:00
Brian Warner
739ae1ccde deletion phase1: send renew/cancel-lease secrets, but my_secret is fake, and the StorageServer discards them 2007-08-27 17:28:51 -07:00
Brian Warner
c6f52e379a rename storageserver.py to just storage.py, since it has both server and client sides now 2007-07-13 17:25:45 -07:00
Brian Warner
7589a8ee82 storage: we must truncate short segments. Now most tests pass (except uri_extension) 2007-07-13 16:38:25 -07:00
Brian Warner
1f8e407d9c more #85 work, system test still fails 2007-07-13 15:09:01 -07:00
Brian Warner
cd8648d39b storage: use one file per share instead of 7 (#85). work-in-progress, tests still fail 2007-07-13 14:04:49 -07:00
Brian Warner
a1c97aa0be storageserver: include metadata in the sizelimit, at least after the bucket has been closed 2007-07-03 17:38:49 -07:00
Brian Warner
c80ea7d693 storageserver: implement size limits. No code to enable them yet, though 2007-07-03 17:08:02 -07:00
Brian Warner
91d72bb504 test_storage: test StorageServer code too: allocation, lookup, multiple-writer behavior 2007-04-18 15:42:34 -07:00
Brian Warner
008e418523 storageserver: assert that blocks are written in-order, clean up tests a bit 2007-04-17 20:21:05 -07:00
Brian Warner
e040b85f5d test_storage: add (failing) test of the BucketWriter/BucketReader implementation 2007-04-17 20:03:44 -07:00
Brian Warner
7cd9ef3bbf finish making the new encoder/decoder/upload/download work 2007-03-30 16:50:50 -07:00
Brian Warner
78d19c271c rearrange service startup a bit, now Node.startService() returns a Deferred that fires when the tub is actually ready, and there is also a Node.when_tub_ready() hook. This allows get_local_addresses() to be slow and not break everything. Changed all necessary test cases to accomodate this slow startup. 2007-03-08 15:10:36 -07:00
Brian Warner
78a9e815c5 add simple metadata (a single string) to the storage protocol 2007-01-15 14:01:22 -07:00
Brian Warner
3490378551 move all packages into src/, fix allmydata.Crypto build. Now you must perform a 'setup.py build' before using anything, and you must add the build directory (build/lib.linux-i686-2.4) to your PYTHONPATH before doing anything 2006-12-14 03:39:50 -07:00