From 05e0de1a5fa0efd99ada80ce8431dc69a39df0da Mon Sep 17 00:00:00 2001 From: erdgeist <> Date: Fri, 18 May 2012 05:16:57 +0000 Subject: Add a top100 for most popular torrents --- ot_http.c | 2 +- ot_mutex.h | 7 ++++--- ot_stats.c | 54 +++++++++++++++++++++++++++++------------------------- 3 files changed, 34 insertions(+), 29 deletions(-) diff --git a/ot_http.c b/ot_http.c index 6493e59..97bf2ec 100644 --- a/ot_http.c +++ b/ot_http.c @@ -175,7 +175,7 @@ static const ot_keywords keywords_mode[] = { { "peer", TASK_STATS_PEERS }, { "conn", TASK_STATS_CONNS }, { "scrp", TASK_STATS_SCRAPE }, { "udp4", TASK_STATS_UDP }, { "tcp4", TASK_STATS_TCP }, { "busy", TASK_STATS_BUSY_NETWORKS }, { "torr", TASK_STATS_TORRENTS }, { "fscr", TASK_STATS_FULLSCRAPE }, { "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, { "completed", TASK_STATS_COMPLETED }, - { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION }, + { "top100", TASK_STATS_TOP100 }, { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION }, { "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TRACKERSTATE }, { "fulllog", TASK_STATS_FULLLOG }, { "woodpeckers", TASK_STATS_WOODPECKERS}, #ifdef WANT_LOG_NUMWANT diff --git a/ot_mutex.h b/ot_mutex.h index 4df5244..b0f0f0b 100644 --- a/ot_mutex.h +++ b/ot_mutex.h @@ -39,9 +39,10 @@ typedef enum { TASK_STATS_PEERS = 0x0102, TASK_STATS_SLASH24S = 0x0103, TASK_STATS_TOP10 = 0x0104, - TASK_STATS_EVERYTHING = 0x0105, - TASK_STATS_FULLLOG = 0x0106, - TASK_STATS_WOODPECKERS = 0x0107, + TASK_STATS_TOP100 = 0x0105, + TASK_STATS_EVERYTHING = 0x0106, + TASK_STATS_FULLLOG = 0x0107, + TASK_STATS_WOODPECKERS = 0x0108, TASK_FULLSCRAPE = 0x0200, /* Default mode */ TASK_FULLSCRAPE_TPB_BINARY = 0x0201, diff --git a/ot_stats.c b/ot_stats.c index ba08bbc..81343b8 100644 --- a/ot_stats.c +++ b/ot_stats.c @@ -93,7 +93,7 @@ static stats_network_node *stats_network_counters_root; static int stat_increase_network_count( stats_network_node **pnode, int depth, uintptr_t ip ) { int foo = __LDR(ip,depth); stats_network_node *node; - + if( !*pnode ) { *pnode = malloc( sizeof( stats_network_node ) ); if( !*pnode ) @@ -125,7 +125,7 @@ static int stats_shift_down_network_count( stats_network_node **node, int depth, free( *node ); *node = NULL; } - + return rest; } @@ -295,30 +295,33 @@ static char*to_hex(char*d,uint8_t*s){char*m="0123456789ABCDEF";char *t=d;char*e= typedef struct { size_t val; ot_torrent * torrent; } ot_record; /* Fetches stats from tracker */ -size_t stats_top10_txt( char * reply ) { +size_t stats_top_txt( char * reply, int amount ) { size_t j; - ot_record top10s[10], top10c[10]; + ot_record top100s[100], top100c[100]; char *r = reply, hex_out[42]; int idx, bucket; - byte_zero( top10s, sizeof( top10s ) ); - byte_zero( top10c, sizeof( top10c ) ); + if( amount > 100 ) + amount = 100; + + byte_zero( top100s, sizeof( top100s ) ); + byte_zero( top100c, sizeof( top100c ) ); for( bucket=0; bucketsize; ++j ) { ot_peerlist *peer_list = ( ((ot_torrent*)(torrents_list->data))[j] ).peer_list; - int idx = 9; while( (idx >= 0) && ( peer_list->peer_count > top10c[idx].val ) ) --idx; - if ( idx++ != 9 ) { - memmove( top10c + idx + 1, top10c + idx, ( 9 - idx ) * sizeof( ot_record ) ); - top10c[idx].val = peer_list->peer_count; - top10c[idx].torrent = (ot_torrent*)(torrents_list->data) + j; + int idx = amount - 1; while( (idx >= 0) && ( peer_list->peer_count > top100c[idx].val ) ) --idx; + if ( idx++ != amount - 1 ) { + memmove( top100c + idx + 1, top100c + idx, ( amount - 1 - idx ) * sizeof( ot_record ) ); + top100c[idx].val = peer_list->peer_count; + top100c[idx].torrent = (ot_torrent*)(torrents_list->data) + j; } - idx = 9; while( (idx >= 0) && ( peer_list->seed_count > top10s[idx].val ) ) --idx; - if ( idx++ != 9 ) { - memmove( top10s + idx + 1, top10s + idx, ( 9 - idx ) * sizeof( ot_record ) ); - top10s[idx].val = peer_list->seed_count; - top10s[idx].torrent = (ot_torrent*)(torrents_list->data) + j; + idx = amount - 1; while( (idx >= 0) && ( peer_list->seed_count > top100s[idx].val ) ) --idx; + if ( idx++ != amount - 1 ) { + memmove( top100s + idx + 1, top100s + idx, ( amount - 1 - idx ) * sizeof( ot_record ) ); + top100s[idx].val = peer_list->seed_count; + top100s[idx].torrent = (ot_torrent*)(torrents_list->data) + j; } } mutex_bucket_unlock( bucket, 0 ); @@ -326,14 +329,14 @@ size_t stats_top10_txt( char * reply ) { return 0; } - r += sprintf( r, "Top 10 torrents by peers:\n" ); - for( idx=0; idx<10; ++idx ) - if( top10c[idx].torrent ) - r += sprintf( r, "\t%zd\t%s\n", top10c[idx].val, to_hex( hex_out, top10c[idx].torrent->hash) ); - r += sprintf( r, "Top 10 torrents by seeds:\n" ); - for( idx=0; idx<10; ++idx ) - if( top10s[idx].torrent ) - r += sprintf( r, "\t%zd\t%s\n", top10s[idx].val, to_hex( hex_out, top10s[idx].torrent->hash) ); + r += sprintf( r, "Top %d torrents by peers:\n", amount ); + for( idx=0; idxhash) ); + r += sprintf( r, "Top %d torrents by seeds:\n", amount ); + for( idx=0; idxhash) ); return r - reply; } @@ -609,7 +612,8 @@ static void stats_make( int *iovec_entries, struct iovec **iovector, ot_tasktype case TASK_STATS_TORRENTS: r += stats_torrents_mrtg( r ); break; case TASK_STATS_PEERS: r += stats_peers_mrtg( r ); break; case TASK_STATS_SLASH24S: r += stats_slash24s_txt( r, 128 ); break; - case TASK_STATS_TOP10: r += stats_top10_txt( r ); break; + case TASK_STATS_TOP10: r += stats_top_txt( r, 10 ); break; + case TASK_STATS_TOP100: r += stats_top_txt( r, 100 ); break; case TASK_STATS_EVERYTHING: r += stats_return_everything( r ); break; #ifdef WANT_SPOT_WOODPECKER case TASK_STATS_WOODPECKERS: r += stats_return_woodpeckers( r, 128 ); break; -- cgit v1.2.3