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 |
