summaryrefslogtreecommitdiff
path: root/DESIGN
diff options
context:
space:
mode:
Diffstat (limited to 'DESIGN')
-rw-r--r--DESIGN33
1 files changed, 19 insertions, 14 deletions
diff --git a/DESIGN b/DESIGN
index a32eeb8..f089a3d 100644
--- a/DESIGN
+++ b/DESIGN
@@ -84,24 +84,29 @@ finish a sweep in OT_CLEAN_INTERVAL_MINUTES. At the default bucket count that
84is one bucket every 117 ms. 84is one bucket every 117 ms.
85 85
86 86
87A torrent carries its hash, two peer-list pointers, a base and a down count, 87A torrent carries its hash, one peerlist pointer, a base and a down count, 40
8848 bytes on a 64-bit host, and the down count sits in what would otherwise be 88bytes on a 64-bit host. The base and the down count live on the torrent, not
89alignment padding. Each family's peer list, 32 bytes plus its peer vector, is 89on a list, so a torrent kept only for its download count holds no list at all.
90allocated on that family's first peer and freed when its last peer goes. The 90The one peerlist, allocated on the first peer of either family and freed when
91base and the down count live on the torrent rather than on a list, which is 91the last peer of both goes, holds the two family vectors and a single seeder
92what lets a list come and go: a torrent kept only for its download count holds 92count. The peer count is not stored, since a vector's own size is the count
93no list at all, and a single-family torrent holds one rather than two. 93for a plain list and the sum of its buckets for a split one. That leaves the
94seeder count the only tally to maintain, because seeding is a per-peer flag
95and counting it would mean a walk.
94 96
95This is paid for in the common shape of a large table. A tracker carrying 97This is paid for in the common shape of a large table. A tracker carrying
96millions of torrents averages close to two peers each, a few crowded swarms 98millions of torrents averages close to two peers each, a few crowded swarms
97over a long tail of near-empty ones, so fixed per-torrent cost, not peer 99over a long tail of near-empty ones, so fixed per-torrent cost, not peer
98payload, is most of resident memory. Allocating both lists for every torrent 100payload, is most of resident memory. An earlier layout gave each torrent two
99and keeping an idle torrent alive for a day to preserve one counter cost, on 101always-allocated peer lists with their own counters and kept an idle torrent
100glibc, 168 bytes per torrent before a peer; the layout above costs 48 for an 102alive for a day to preserve one number: on glibc 168 bytes before a peer. The
101empty torrent and 96 for a single-family one. The per-torrent counts are 103merged layout costs 40 for an empty torrent and, on glibc, 136 for a
102uint32: no single torrent holds 2^32 peers, and the four bytes saved against a 104single-family one and 184 for a torrent carrying both. A torrent with peers in
103size_t are multiplied by the torrent count. Global totals stay 64-bit. 105both families now takes one allocation rather than two. The split is drawn
104 106along the family distribution: empty and both-family torrents gain, a
107single-family torrent pays for the absent family's vector header. On jemalloc
108the bins differ, so the per-shape figures do too, but the empty-torrent and
109single-allocation gains hold on both.
105 110
106A refused announce is answered over UDP with a well formed announce for an 111A refused announce is answered over UDP with a well formed announce for an
107empty swarm rather than with the error action. BEP 15 binds a client to the 112empty swarm rather than with the error action. BEP 15 binds a client to the