Use python-debian for parsing RFC 822 files (untested).
[quix0rs-apt-p2p.git] / TODO
1 Packages.diff files need to be considered.
2
3 The Packages.diff/Index files contain hashes of Packages.diff/rred.gz 
4 files, which themselves contain diffs to the Packages files previously 
5 downloaded. Apt will request these files for the testing/unstable 
6 distributions. They need to either be ignored, or dealt with properly by 
7 adding them to the tracking done by the AptPackages module.
8
9
10 PeerManager needs to download large files from multiple peers.
11
12 The PeerManager currently chooses a peer at random from the list of 
13 possible peers, and downloads the entire file from there. This needs to 
14 change if both a) the file is large (more than 512 KB), and b) there are
15 multiple peers with the file. The PeerManager should then break up the 
16 large file into multiple pieces of size < 512 KB, and then send requests 
17 to multiple peers for these pieces.
18
19 This can cause a problem with hash checking the returned data, as hashes 
20 for the pieces are not known. Any file that fails a hash check should be 
21 downloaded again, with each piece being downloaded from different peers 
22 than it was previously. The peers are shifted by 1, so that if a peers 
23 previously downloaded piece i, it now downloads piece i+1, and the first 
24 piece is downloaded by the previous downloader of the last piece, or 
25 preferably a previously unused peer. As each piece is downloaded the 
26 running hash of the file should be checked to determine the place at 
27 which the file differs from the previous download.
28
29 If the hash check then passes, then the peer who originally provided the 
30 bad piece can be assessed blame for the error. Otherwise, the peer who 
31 originally provided the piece is probably at fault, since he is now 
32 providing a later piece. This doesn't work if the differing piece is the 
33 first piece, in which case it is downloaded from a 3rd peer, with 
34 consensus revealing the misbehaving peer.
35
36
37 Store and share torrent-like strings for large files.
38
39 In addition to storing the file download location (which would still be 
40 used for small files), a bencoded dictionary containing the peer's 
41 hashes of the individual pieces could be stored for the larger files 
42 (20% of all the files are larger than 512 KB). This dictionary would 
43 have the normal piece size, the hash length, and a string containing the 
44 piece hashes of length <hash length>*<#pieces>. These piece hashes could 
45 be compared ahead of time to determine which peers have the same piece 
46 hashes (they all should), and then used during the download to verify 
47 the downloaded pieces.
48
49 For very large files (5 or more pieces), the torrent strings are too 
50 long to store in the DHT and retrieve (a single UDP packet should be 
51 less than 1472 bytes to avoid fragmentation). Instead, the peers should 
52 store the torrent-like string for large files separately, and only 
53 contain a reference to it in their stored value for the hash of the 
54 file. The reference would be a hash of the bencoded dictionary. If the 
55 torrent-like string is short enough to store in the DHT (i.e. less than 
56 1472 bytes, or about 70 pieces for the SHA1 hash), then a 
57 lookup of that hash in the DHT would give the torrent-like string. 
58 Otherwise, a request to the peer for the hash (just like files are 
59 downloaded), should return the bencoded torrent-like string.
60
61
62 PeerManager needs to track peers' properties.
63
64 The PeerManager needs to keep track of the observed properties of seen 
65 peers, to help determine a selection criteria for choosing peers to 
66 download from. Each property will give a value from 0 to 1. The relevant 
67 properties are:
68
69  - hash errors in last day (1 = 0, 0 = 3+)
70  - recent download speed (1 = fastest, 0 = 0)
71  - lag time from request to download (1 = 0, 0 = 15s+)
72  - number of pending requests (1 = 0, 0 = max (10))
73  - whether a connection is open (1 = yes, 0.9 = no)
74
75 These should be combined (multiplied) to provide a sort order for peers 
76 available to download from, which can then be used to assign new 
77 downloads to peers. Pieces should be downloaded from the best peers 
78 first (i.e. piece 0 from the absolute best peer).
79
80
81 Missing Kademlia implementation details are needed.
82
83 The current implementation is missing some important features, mostly 
84 focussed on storing values:
85  - values need to be republished (every hour?)
86  - original publishers need to republish values (every 24 hours)
87  - when a new node is found that is closer to some values, replicate the 
88    values there without deleting them
89  - when a value lookup succeeds, store the value in the closest node 
90    found that didn't have it
91  - make the expiration time of a value exponentially inversely 
92    proportional to the number of nodes between the current node and the 
93    node closest to the value