]> git.rkrishnan.org Git - tahoe-lafs/tahoe-lafs.git/blob - allmydata/encode.py
ea54fbd2bb9d79384a56e99c5d4cce9e6aabc322
[tahoe-lafs/tahoe-lafs.git] / allmydata / encode.py
1 from twisted.internet import defer
2 import sha
3 from allmydata.util import idlib
4
5 def netstring(s):
6     return "%d:%s," % (len(s), s)
7
8 class Encoder(object):
9     def __init__(self, infile, m):
10         self.infile = infile
11         self.k = 2
12         self.m = m
13
14     def do_upload(self, landlords):
15         dl = []
16         data = self.infile.read()
17         for (peerid, bucket_num, remotebucket) in landlords:
18             dl.append(remotebucket.callRemote('write', data))
19             dl.append(remotebucket.callRemote('close'))
20
21         return defer.DeferredList(dl)
22
23 class Decoder(object):
24     def __init__(self, outfile, k, m, verifierid):
25         self.outfile = outfile
26         self.k = 2
27         self.m = m
28         self._verifierid = verifierid
29
30     def start(self, buckets):
31         assert len(buckets) >= self.k
32         dl = []
33         for bucketnum, bucket in buckets[:self.k]:
34             d = bucket.callRemote("read")
35             dl.append(d)
36         d2 = defer.DeferredList(dl)
37         d2.addCallback(self._got_all_data)
38         return d2
39
40     def _got_all_data(self, resultslist):
41         shares = [results for success,results in resultslist if success]
42         assert len(shares) >= self.k
43         # here's where the Reed-Solomon magic takes place
44         self.outfile.write(shares[0])
45         hasher = sha.new(netstring("allmydata_v1_verifierid"))
46         hasher.update(shares[0])
47         vid = hasher.digest()
48         if self._verifierid:
49             assert self._verifierid == vid, "%s != %s" % (idlib.b2a(self._verifierid), idlib.b2a(vid))
50