diff options
-rw-r--r-- | ot_http.c | 1 | ||||
-rw-r--r-- | ot_mutex.h | 3 | ||||
-rw-r--r-- | ot_stats.c | 55 | ||||
-rw-r--r-- | ot_stats.h | 3 | ||||
-rw-r--r-- | trackerlogic.c | 5 |
5 files changed, 40 insertions, 27 deletions
@@ -172,6 +172,7 @@ static const ot_keywords keywords_mode[] = | |||
172 | { "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, { "completed", TASK_STATS_COMPLETED }, | 172 | { "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, { "completed", TASK_STATS_COMPLETED }, |
173 | { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION }, | 173 | { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION }, |
174 | { "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TRACKERSTATE }, { "fulllog", TASK_STATS_FULLLOG }, | 174 | { "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TRACKERSTATE }, { "fulllog", TASK_STATS_FULLLOG }, |
175 | { "woodpeckers", TASK_STATS_WOODPECKERS}, | ||
175 | #ifdef WANT_LOG_NUMWANT | 176 | #ifdef WANT_LOG_NUMWANT |
176 | { "numwants", TASK_STATS_NUMWANTS}, | 177 | { "numwants", TASK_STATS_NUMWANTS}, |
177 | #endif | 178 | #endif |
@@ -41,7 +41,8 @@ typedef enum { | |||
41 | TASK_STATS_TOP10 = 0x0104, | 41 | TASK_STATS_TOP10 = 0x0104, |
42 | TASK_STATS_EVERYTHING = 0x0105, | 42 | TASK_STATS_EVERYTHING = 0x0105, |
43 | TASK_STATS_FULLLOG = 0x0106, | 43 | TASK_STATS_FULLLOG = 0x0106, |
44 | 44 | TASK_STATS_WOODPECKERS = 0x0107, | |
45 | |||
45 | TASK_FULLSCRAPE = 0x0200, /* Default mode */ | 46 | TASK_FULLSCRAPE = 0x0200, /* Default mode */ |
46 | TASK_FULLSCRAPE_TPB_BINARY = 0x0201, | 47 | TASK_FULLSCRAPE_TPB_BINARY = 0x0201, |
47 | TASK_FULLSCRAPE_TPB_ASCII = 0x0202, | 48 | TASK_FULLSCRAPE_TPB_ASCII = 0x0202, |
@@ -181,7 +181,7 @@ static size_t stats_get_highscore_networks( stats_network_node *node, int depth, | |||
181 | return score; | 181 | return score; |
182 | } | 182 | } |
183 | 183 | ||
184 | static size_t stats_return_busy_networks( char * reply, stats_network_node *tree, int amount ) { | 184 | static size_t stats_return_busy_networks( char * reply, stats_network_node *tree, int amount, int limit ) { |
185 | ot_ip6 networks[amount]; | 185 | ot_ip6 networks[amount]; |
186 | ot_ip6 node_value; | 186 | ot_ip6 node_value; |
187 | size_t scores[amount]; | 187 | size_t scores[amount]; |
@@ -192,9 +192,9 @@ static size_t stats_return_busy_networks( char * reply, stats_network_node *tree | |||
192 | memset( networks, 0, sizeof( networks ) ); | 192 | memset( networks, 0, sizeof( networks ) ); |
193 | memset( node_value, 0, sizeof( node_value ) ); | 193 | memset( node_value, 0, sizeof( node_value ) ); |
194 | 194 | ||
195 | stats_get_highscore_networks( tree, 0, node_value, scores, networks, amount, STATS_NETWORK_NODE_MAXDEPTH ); | 195 | stats_get_highscore_networks( tree, 0, node_value, scores, networks, amount, limit ); |
196 | 196 | ||
197 | r += sprintf( r, "Networks, limit /%d:\n", STATS_NETWORK_NODE_MAXDEPTH+STATS_NETWORK_NODE_BITWIDTH ); | 197 | r += sprintf( r, "Networks, limit /%d:\n", limit+STATS_NETWORK_NODE_BITWIDTH ); |
198 | for( i=amount-1; i>=0; --i) { | 198 | for( i=amount-1; i>=0; --i) { |
199 | if( scores[i] ) { | 199 | if( scores[i] ) { |
200 | r += sprintf( r, "%08zd: ", scores[i] ); | 200 | r += sprintf( r, "%08zd: ", scores[i] ); |
@@ -206,25 +206,7 @@ static size_t stats_return_busy_networks( char * reply, stats_network_node *tree | |||
206 | *r++ = '\n'; | 206 | *r++ = '\n'; |
207 | } | 207 | } |
208 | } | 208 | } |
209 | 209 | *r++ = '\n'; | |
210 | memset( scores, 0, sizeof( scores ) ); | ||
211 | memset( networks, 0, sizeof( networks ) ); | ||
212 | memset( node_value, 0, sizeof( node_value ) ); | ||
213 | |||
214 | stats_get_highscore_networks( tree, 0, node_value, scores, networks, amount, STATS_NETWORK_NODE_LIMIT ); | ||
215 | |||
216 | r += sprintf( r, "\nNetworks, limit /%d:\n", STATS_NETWORK_NODE_LIMIT+STATS_NETWORK_NODE_BITWIDTH ); | ||
217 | for( i=amount-1; i>=0; --i) { | ||
218 | if( scores[i] ) { | ||
219 | r += sprintf( r, "%08zd: ", scores[i] ); | ||
220 | #ifdef WANT_V6 | ||
221 | r += fmt_ip6c( r, networks[i] ); | ||
222 | #else | ||
223 | r += fmt_ip4( r, networks[i] ); | ||
224 | #endif | ||
225 | *r++ = '\n'; | ||
226 | } | ||
227 | } | ||
228 | 210 | ||
229 | return r - reply; | 211 | return r - reply; |
230 | } | 212 | } |
@@ -262,7 +244,8 @@ static size_t stats_slash24s_txt( char *reply, size_t amount ) { | |||
262 | } | 244 | } |
263 | 245 | ||
264 | /* The tree is built. Now analyze */ | 246 | /* The tree is built. Now analyze */ |
265 | r += stats_return_busy_networks( r, slash24s_network_counters_root, amount ); | 247 | r += stats_return_busy_networks( r, slash24s_network_counters_root, amount, STATS_NETWORK_NODE_MAXDEPTH ); |
248 | r += stats_return_busy_networks( r, slash24s_network_counters_root, amount, STATS_NETWORK_NODE_LIMIT ); | ||
266 | goto success; | 249 | goto success; |
267 | 250 | ||
268 | bailout_unlock: | 251 | bailout_unlock: |
@@ -275,11 +258,25 @@ success: | |||
275 | return r-reply; | 258 | return r-reply; |
276 | } | 259 | } |
277 | 260 | ||
261 | #ifdef WANT_SPOT_WOODPECKER | ||
262 | static stats_network_node *stats_woodpeckers_tree; | ||
263 | static pthread_mutex_t g_woodpeckers_mutex = PTHREAD_MUTEX_INITIALIZER; | ||
264 | |||
265 | static size_t stats_return_woodpeckers( char * reply, int amount ) { | ||
266 | char * r = reply; | ||
267 | |||
268 | pthread_mutex_lock( &g_woodpeckers_mutex ); | ||
269 | r += stats_return_busy_networks( r, stats_woodpeckers_tree, amount, STATS_NETWORK_NODE_MAXDEPTH ); | ||
270 | pthread_mutex_unlock( &g_woodpeckers_mutex ); | ||
271 | return r-reply; | ||
272 | } | ||
273 | |||
278 | typedef struct { | 274 | typedef struct { |
279 | unsigned long long torrent_count; | 275 | unsigned long long torrent_count; |
280 | unsigned long long peer_count; | 276 | unsigned long long peer_count; |
281 | unsigned long long seed_count; | 277 | unsigned long long seed_count; |
282 | } torrent_stats; | 278 | } torrent_stats; |
279 | #endif | ||
283 | 280 | ||
284 | static int torrent_statter( ot_torrent *torrent, uintptr_t data ) { | 281 | static int torrent_statter( ot_torrent *torrent, uintptr_t data ) { |
285 | torrent_stats *stats = (torrent_stats*)data; | 282 | torrent_stats *stats = (torrent_stats*)data; |
@@ -611,6 +608,9 @@ static void stats_make( int *iovec_entries, struct iovec **iovector, ot_tasktype | |||
611 | case TASK_STATS_SLASH24S: r += stats_slash24s_txt( r, 128 ); break; | 608 | case TASK_STATS_SLASH24S: r += stats_slash24s_txt( r, 128 ); break; |
612 | case TASK_STATS_TOP10: r += stats_top10_txt( r ); break; | 609 | case TASK_STATS_TOP10: r += stats_top10_txt( r ); break; |
613 | case TASK_STATS_EVERYTHING: r += stats_return_everything( r ); break; | 610 | case TASK_STATS_EVERYTHING: r += stats_return_everything( r ); break; |
611 | #ifdef WANT_SPOT_WOODPECKER | ||
612 | case TASK_STATS_WOODPECKERS: r += stats_return_woodpeckers( r, 128 ); break; | ||
613 | #endif | ||
614 | #ifdef WANT_FULLLOG_NETWORKS | 614 | #ifdef WANT_FULLLOG_NETWORKS |
615 | case TASK_STATS_FULLLOG: stats_return_fulllog( iovec_entries, iovector, r ); | 615 | case TASK_STATS_FULLLOG: stats_return_fulllog( iovec_entries, iovector, r ); |
616 | return; | 616 | return; |
@@ -670,7 +670,7 @@ void stats_issue_event( ot_status_event event, PROTO_FLAG proto, uintptr_t event | |||
670 | case EVENT_FAILED: | 670 | case EVENT_FAILED: |
671 | ot_failed_request_counts[event_data]++; | 671 | ot_failed_request_counts[event_data]++; |
672 | break; | 672 | break; |
673 | case EVENT_RENEW: | 673 | case EVENT_RENEW: |
674 | ot_renewed[event_data]++; | 674 | ot_renewed[event_data]++; |
675 | break; | 675 | break; |
676 | case EVENT_SYNC: | 676 | case EVENT_SYNC: |
@@ -679,6 +679,13 @@ void stats_issue_event( ot_status_event event, PROTO_FLAG proto, uintptr_t event | |||
679 | case EVENT_BUCKET_LOCKED: | 679 | case EVENT_BUCKET_LOCKED: |
680 | ot_overall_stall_count++; | 680 | ot_overall_stall_count++; |
681 | break; | 681 | break; |
682 | #ifdef WANT_SPOT_WOODPECKER | ||
683 | case EVENT_WOODPECKER: | ||
684 | pthread_mutex_lock( &g_woodpeckers_mutex ); | ||
685 | stat_increase_network_count( &stats_woodpeckers_tree, 0, event_data ); | ||
686 | pthread_mutex_unlock( &g_woodpeckers_mutex ); | ||
687 | break; | ||
688 | #endif | ||
682 | default: | 689 | default: |
683 | break; | 690 | break; |
684 | } | 691 | } |
@@ -19,7 +19,8 @@ typedef enum { | |||
19 | EVENT_FULLSCRAPE_REQUEST_GZIP, | 19 | EVENT_FULLSCRAPE_REQUEST_GZIP, |
20 | EVENT_FULLSCRAPE, /* TCP only */ | 20 | EVENT_FULLSCRAPE, /* TCP only */ |
21 | EVENT_FAILED, | 21 | EVENT_FAILED, |
22 | EVENT_BUCKET_LOCKED | 22 | EVENT_BUCKET_LOCKED, |
23 | EVENT_WOODPECKER | ||
23 | } ot_status_event; | 24 | } ot_status_event; |
24 | 25 | ||
25 | enum { | 26 | enum { |
diff --git a/trackerlogic.c b/trackerlogic.c index 18895ba..6ca1ad2 100644 --- a/trackerlogic.c +++ b/trackerlogic.c | |||
@@ -145,7 +145,10 @@ size_t add_peer_to_torrent_and_return_peers( ot_hash hash, ot_peer *peer, PROTO_ | |||
145 | 145 | ||
146 | } else { | 146 | } else { |
147 | stats_issue_event( EVENT_RENEW, 0, OT_PEERTIME( peer_dest ) ); | 147 | stats_issue_event( EVENT_RENEW, 0, OT_PEERTIME( peer_dest ) ); |
148 | 148 | #ifdef WANT_SPOT_WOODPECKER | |
149 | if( ( OT_PEERTIME(peer_dest) > 0 ) && ( OT_PEERTIME(peer_dest) < 20 ) ) | ||
150 | stats_issue_event( EVENT_WOODPECKER, 0, (uintptr_t)peer ); | ||
151 | #endif | ||
149 | #ifdef WANT_SYNC_LIVE | 152 | #ifdef WANT_SYNC_LIVE |
150 | /* Won't live sync peers that come back too fast. Only exception: | 153 | /* Won't live sync peers that come back too fast. Only exception: |
151 | fresh "completed" reports */ | 154 | fresh "completed" reports */ |