summaryrefslogtreecommitdiff
path: root/ot_clean.c
diff options
context:
space:
mode:
authorDirk Engling <erdgeist@erdgeist.org>2024-04-03 22:25:30 +0200
committerDirk Engling <erdgeist@erdgeist.org>2024-04-03 22:25:30 +0200
commit2afc4893bf802700a1decfff57673cefc861c7e7 (patch)
tree9a0817371ac05062dbcf25107fcf5a6481feccc0 /ot_clean.c
parenteb8834f7783cb85ae825976425800cd4af711263 (diff)
Prepare opentracker for dual stack capabilities
Diffstat (limited to 'ot_clean.c')
-rw-r--r--ot_clean.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/ot_clean.c b/ot_clean.c
index 139bedb..3b494f4 100644
--- a/ot_clean.c
+++ b/ot_clean.c
@@ -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 */
23static ssize_t clean_single_bucket( ot_peer *peers, size_t peer_count, time_t timedout, int *removed_seeders ) { 23static 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 51int 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*/
50int 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*/
106int 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