diff options
author | Dirk Engling <erdgeist@erdgeist.org> | 2024-04-03 22:25:30 +0200 |
---|---|---|
committer | Dirk Engling <erdgeist@erdgeist.org> | 2024-04-03 22:25:30 +0200 |
commit | 2afc4893bf802700a1decfff57673cefc861c7e7 (patch) | |
tree | 9a0817371ac05062dbcf25107fcf5a6481feccc0 /ot_clean.c | |
parent | eb8834f7783cb85ae825976425800cd4af711263 (diff) |
Prepare opentracker for dual stack capabilities
Diffstat (limited to 'ot_clean.c')
-rw-r--r-- | ot_clean.c | 63 |
1 files changed, 36 insertions, 27 deletions
@@ -20,36 +20,36 @@ | |||
20 | #include "ot_accesslist.h" | 20 | #include "ot_accesslist.h" |
21 | 21 | ||
22 | /* Returns amount of removed peers */ | 22 | /* Returns amount of removed peers */ |
23 | static ssize_t clean_single_bucket( ot_peer *peers, size_t peer_count, time_t timedout, int *removed_seeders ) { | 23 | static ssize_t clean_single_bucket( ot_peer *peers, size_t peer_count, size_t peer_size, time_t timedout, int *removed_seeders ) { |
24 | ot_peer *last_peer = peers + peer_count, *insert_point; | 24 | ot_peer *last_peer = peers + peer_count * peer_size, *insert_point; |
25 | time_t timediff; | ||
26 | 25 | ||
27 | /* Two scan modes: unless there is one peer removed, just increase ot_peertime */ | 26 | /* Two scan modes: unless there is one peer removed, just increase ot_peertime */ |
28 | while( peers < last_peer ) { | 27 | while( peers < last_peer ) { |
29 | if( ( timediff = timedout + OT_PEERTIME( peers ) ) >= OT_PEER_TIMEOUT ) | 28 | time_t timediff = timedout + OT_PEERTIME( peers, peer_size ); |
29 | if( timediff >= OT_PEER_TIMEOUT ) | ||
30 | break; | 30 | break; |
31 | OT_PEERTIME( peers++ ) = timediff; | 31 | OT_PEERTIME( peers, peer_size ) = timediff; |
32 | peers += peer_size; | ||
32 | } | 33 | } |
33 | 34 | ||
34 | /* If we at least remove one peer, we have to copy */ | 35 | /* If we at least remove one peer, we have to copy */ |
35 | insert_point = peers; | 36 | for( insert_point = peers; peers < last_peer; peers += peer_size ) { |
36 | while( peers < last_peer ) | 37 | time_t timediff = timedout + OT_PEERTIME( peers, peer_size ); |
37 | if( ( timediff = timedout + OT_PEERTIME( peers ) ) < OT_PEER_TIMEOUT ) { | 38 | |
38 | OT_PEERTIME( peers ) = timediff; | 39 | if( timediff < OT_PEER_TIMEOUT ) { |
39 | memcpy( insert_point++, peers++, sizeof(ot_peer)); | 40 | OT_PEERTIME( peers, peer_size ) = timediff; |
41 | memcpy( insert_point, peers, peer_size); | ||
42 | insert_point += peer_size; | ||
40 | } else | 43 | } else |
41 | if( OT_PEERFLAG( peers++ ) & PEER_FLAG_SEEDING ) | 44 | if( OT_PEERFLAG_D( peers, peer_size ) & PEER_FLAG_SEEDING ) |
42 | (*removed_seeders)++; | 45 | (*removed_seeders)++; |
46 | } | ||
43 | 47 | ||
44 | return peers - insert_point; | 48 | return peers - insert_point; |
45 | } | 49 | } |
46 | 50 | ||
47 | /* Clean a single torrent | 51 | int clean_single_peer_list( ot_peerlist *peer_list, size_t peer_size ) { |
48 | return 1 if torrent timed out | 52 | ot_vector *peer_vector = &peer_list->peers; |
49 | */ | ||
50 | int clean_single_torrent( ot_torrent *torrent ) { | ||
51 | ot_peerlist *peer_list = torrent->peer_list; | ||
52 | ot_vector *bucket_list = &peer_list->peers; | ||
53 | time_t timedout = (time_t)( g_now_minutes - peer_list->base ); | 53 | time_t timedout = (time_t)( g_now_minutes - peer_list->base ); |
54 | int num_buckets = 1, removed_seeders = 0; | 54 | int num_buckets = 1, removed_seeders = 0; |
55 | 55 | ||
@@ -69,24 +69,26 @@ int clean_single_torrent( ot_torrent *torrent ) { | |||
69 | } | 69 | } |
70 | 70 | ||
71 | if( OT_PEERLIST_HASBUCKETS( peer_list ) ) { | 71 | if( OT_PEERLIST_HASBUCKETS( peer_list ) ) { |
72 | num_buckets = bucket_list->size; | 72 | num_buckets = peer_vector->size; |
73 | bucket_list = (ot_vector *)bucket_list->data; | 73 | peer_vector = (ot_vector *)peer_vector->data; |
74 | } | 74 | } |
75 | 75 | ||
76 | while( num_buckets-- ) { | 76 | while( num_buckets-- ) { |
77 | size_t removed_peers = clean_single_bucket( bucket_list->data, bucket_list->size, timedout, &removed_seeders ); | 77 | size_t removed_peers = clean_single_bucket( peer_vector->data, peer_vector->size, peer_size, timedout, &removed_seeders ); |
78 | peer_list->peer_count -= removed_peers; | 78 | peer_list->peer_count -= removed_peers; |
79 | bucket_list->size -= removed_peers; | 79 | peer_vector->size -= removed_peers; |
80 | if( bucket_list->size < removed_peers ) | 80 | if( removed_peers ) |
81 | vector_fixup_peers( bucket_list ); | 81 | vector_fixup_peers( peer_vector, peer_size ); |
82 | ++bucket_list; | 82 | |
83 | /* Skip to next bucket, a vector containing peers */ | ||
84 | ++peer_vector; | ||
83 | } | 85 | } |
84 | 86 | ||
85 | peer_list->seed_count -= removed_seeders; | 87 | peer_list->seed_count -= removed_seeders; |
86 | 88 | ||
87 | /* See, if we need to convert a torrent from simple vector to bucket list */ | 89 | /* See if we need to convert a torrent from simple vector to bucket list */ |
88 | if( ( peer_list->peer_count > OT_PEER_BUCKET_MINCOUNT ) || OT_PEERLIST_HASBUCKETS(peer_list) ) | 90 | if( ( peer_list->peer_count > OT_PEER_BUCKET_MINCOUNT ) || OT_PEERLIST_HASBUCKETS(peer_list) ) |
89 | vector_redistribute_buckets( peer_list ); | 91 | vector_redistribute_buckets( peer_list, peer_size ); |
90 | 92 | ||
91 | if( peer_list->peer_count ) | 93 | if( peer_list->peer_count ) |
92 | peer_list->base = g_now_minutes; | 94 | peer_list->base = g_now_minutes; |
@@ -96,7 +98,14 @@ int clean_single_torrent( ot_torrent *torrent ) { | |||
96 | peer_list->base = g_now_minutes - OT_PEER_TIMEOUT; | 98 | peer_list->base = g_now_minutes - OT_PEER_TIMEOUT; |
97 | } | 99 | } |
98 | return 0; | 100 | return 0; |
101 | } | ||
99 | 102 | ||
103 | /* Clean a single torrent | ||
104 | return 1 if torrent timed out | ||
105 | */ | ||
106 | int clean_single_torrent( ot_torrent *torrent ) { | ||
107 | return clean_single_peer_list( torrent->peer_list6, OT_PEER_SIZE6) * | ||
108 | clean_single_peer_list( torrent->peer_list4, OT_PEER_SIZE4); | ||
100 | } | 109 | } |
101 | 110 | ||
102 | /* Clean up all peers in current bucket, remove timedout pools and | 111 | /* Clean up all peers in current bucket, remove timedout pools and |