@@ -3,14 +3,14 @@ use std::sync::Arc;
3
3
4
4
use torrust_tracker_configuration:: TrackerPolicy ;
5
5
use torrust_tracker_primitives:: announce_event:: AnnounceEvent ;
6
- use torrust_tracker_primitives:: peer:: { self } ;
6
+ use torrust_tracker_primitives:: peer:: { self , ReadInfo } ;
7
7
use torrust_tracker_primitives:: swarm_metadata:: SwarmMetadata ;
8
8
use torrust_tracker_primitives:: DurationSinceUnixEpoch ;
9
9
10
10
use super :: Entry ;
11
- use crate :: EntrySingle ;
11
+ use crate :: { BTreeMapPeerList , EntrySingle , SkipMapPeerList } ;
12
12
13
- impl Entry for EntrySingle {
13
+ impl Entry for EntrySingle < BTreeMapPeerList > {
14
14
#[ allow( clippy:: cast_possible_truncation) ]
15
15
fn get_swarm_metadata ( & self ) -> SwarmMetadata {
16
16
let complete: u32 = self . peers . values ( ) . filter ( |peer| peer. is_seeder ( ) ) . count ( ) as u32 ;
@@ -98,3 +98,108 @@ impl Entry for EntrySingle {
98
98
. retain ( |_, peer| peer:: ReadInfo :: get_updated ( peer) > current_cutoff) ;
99
99
}
100
100
}
101
+
102
+ impl Entry for EntrySingle < SkipMapPeerList > {
103
+ #[ allow( clippy:: cast_possible_truncation) ]
104
+ fn get_swarm_metadata ( & self ) -> SwarmMetadata {
105
+ let complete: u32 = self . peers . iter ( ) . filter ( |entry| entry. value ( ) . is_seeder ( ) ) . count ( ) as u32 ;
106
+ let incomplete: u32 = self . peers . len ( ) as u32 - complete;
107
+
108
+ SwarmMetadata {
109
+ downloaded : self . downloaded ,
110
+ complete,
111
+ incomplete,
112
+ }
113
+ }
114
+
115
+ fn is_good ( & self , policy : & TrackerPolicy ) -> bool {
116
+ if policy. persistent_torrent_completed_stat && self . downloaded > 0 {
117
+ return true ;
118
+ }
119
+
120
+ if policy. remove_peerless_torrents && self . peers . is_empty ( ) {
121
+ return false ;
122
+ }
123
+
124
+ true
125
+ }
126
+
127
+ fn peers_is_empty ( & self ) -> bool {
128
+ self . peers . is_empty ( )
129
+ }
130
+
131
+ fn get_peers_len ( & self ) -> usize {
132
+ self . peers . len ( )
133
+ }
134
+ fn get_peers ( & self , limit : Option < usize > ) -> Vec < Arc < peer:: Peer > > {
135
+ match limit {
136
+ Some ( limit) => self . peers . iter ( ) . take ( limit) . map ( |entry| entry. value ( ) . clone ( ) ) . collect ( ) ,
137
+ None => self . peers . iter ( ) . map ( |entry| entry. value ( ) . clone ( ) ) . collect ( ) ,
138
+ }
139
+ }
140
+
141
+ fn get_peers_for_client ( & self , client : & SocketAddr , limit : Option < usize > ) -> Vec < Arc < peer:: Peer > > {
142
+ match limit {
143
+ Some ( limit) => self
144
+ . peers
145
+ . iter ( )
146
+ // Take peers which are not the client peer
147
+ . filter ( |entry| peer:: ReadInfo :: get_address ( entry. value ( ) . as_ref ( ) ) != * client)
148
+ // Limit the number of peers on the result
149
+ . take ( limit)
150
+ . map ( |entry| entry. value ( ) . clone ( ) )
151
+ . collect ( ) ,
152
+ None => self
153
+ . peers
154
+ . iter ( )
155
+ // Take peers which are not the client peer
156
+ . filter ( |entry| peer:: ReadInfo :: get_address ( entry. value ( ) . as_ref ( ) ) != * client)
157
+ . map ( |entry| entry. value ( ) . clone ( ) )
158
+ . collect ( ) ,
159
+ }
160
+ }
161
+
162
+ fn upsert_peer ( & mut self , peer : & peer:: Peer ) -> bool {
163
+ let mut downloaded_stats_updated: bool = false ;
164
+
165
+ match peer:: ReadInfo :: get_event ( peer) {
166
+ AnnounceEvent :: Stopped => {
167
+ drop ( self . peers . remove ( & peer:: ReadInfo :: get_id ( peer) ) ) ;
168
+ }
169
+ AnnounceEvent :: Completed => {
170
+ let previous = self . peers . get ( & peer. get_id ( ) ) ;
171
+
172
+ let increase_downloads = match previous {
173
+ Some ( entry) => {
174
+ // Don't count if peer was already completed.
175
+ entry. value ( ) . event != AnnounceEvent :: Completed
176
+ }
177
+ None => {
178
+ // Don't count if peer was not previously known
179
+ false
180
+ }
181
+ } ;
182
+
183
+ self . peers . insert ( peer:: ReadInfo :: get_id ( peer) , Arc :: new ( * peer) ) ;
184
+
185
+ if increase_downloads {
186
+ self . downloaded += 1 ;
187
+ downloaded_stats_updated = true ;
188
+ }
189
+ }
190
+ _ => {
191
+ drop ( self . peers . insert ( peer:: ReadInfo :: get_id ( peer) , Arc :: new ( * peer) ) ) ;
192
+ }
193
+ }
194
+
195
+ downloaded_stats_updated
196
+ }
197
+
198
+ fn remove_inactive_peers ( & mut self , current_cutoff : DurationSinceUnixEpoch ) {
199
+ for entry in & self . peers {
200
+ if entry. value ( ) . get_updated ( ) >= current_cutoff {
201
+ entry. remove ( ) ;
202
+ }
203
+ }
204
+ }
205
+ }
0 commit comments