@ -50,12 +50,13 @@ static unsigned long long ot_full_scrape_size = 0;
static unsigned long long ot_failed_request_counts [ CODE_HTTPERROR_COUNT ] ;
static unsigned long long ot_failed_request_counts [ CODE_HTTPERROR_COUNT ] ;
static unsigned long long ot_renewed [ OT_PEER_TIMEOUT ] ;
static unsigned long long ot_renewed [ OT_PEER_TIMEOUT ] ;
static unsigned long long ot_overall_sync_count ;
static unsigned long long ot_overall_sync_count ;
static unsigned long long ot_overall_stall_count ;
static time_t ot_start_time ;
static time_t ot_start_time ;
# ifdef WANT_LOG_NETWORKS
# ifdef WANT_LOG_NETWORKS
# define STATS_NETWORK_NODE_BITWIDTH 8
# define STATS_NETWORK_NODE_BITWIDTH 8
# define STATS_NETWORK_NODE_MAXDEPTH 3
# define STATS_NETWORK_NODE_MAXDEPTH 16
# define STATS_NETWORK_NODE_BITMASK ((1<<STATS_NETWORK_NODE_BITWIDTH)-1)
# define STATS_NETWORK_NODE_BITMASK ((1<<STATS_NETWORK_NODE_BITWIDTH)-1)
# define STATS_NETWORK_NODE_COUNT (1<<STATS_NETWORK_NODE_BITWIDTH)
# define STATS_NETWORK_NODE_COUNT (1<<STATS_NETWORK_NODE_BITWIDTH)
@ -68,8 +69,9 @@ union stats_network_node {
static stats_network_node * stats_network_counters_root = NULL ;
static stats_network_node * stats_network_counters_root = NULL ;
static int stat_increase_network_count ( stats_network_node * * node , int depth , uint32_t ip ) {
static int stat_increase_network_count ( stats_network_node * * node , int depth , uintptr_t ip ) {
int foo = ( ip > > ( 32 - STATS_NETWORK_NODE_BITWIDTH * ( + + depth ) ) ) & STATS_NETWORK_NODE_BITMASK ;
ot_ip6 * _ip = ( ot_ip6 * ) ip ;
int foo = ( * _ip ) [ depth ] ;
if ( ! * node ) {
if ( ! * node ) {
* node = malloc ( sizeof ( stats_network_node ) ) ;
* node = malloc ( sizeof ( stats_network_node ) ) ;
@ -157,6 +159,20 @@ static size_t stats_return_busy_networks( char * reply ) {
# endif
# endif
typedef struct {
unsigned long long torrent_count ;
unsigned long long peer_count ;
unsigned long long seed_count ;
} torrent_stats ;
static int torrent_statter ( ot_torrent * torrent , uintptr_t data ) {
torrent_stats * stats = ( torrent_stats * ) data ;
stats - > torrent_count + + ;
stats - > peer_count + = torrent - > peer_list - > peer_count ;
stats - > seed_count + = torrent - > peer_list - > seed_count ;
return 0 ;
}
/* Converter function from memory to human readable hex strings */
/* Converter function from memory to human readable hex strings */
static char * to_hex ( char * d , uint8_t * s ) { char * m = " 0123456789ABCDEF " ; char * t = d ; char * e = d + 40 ; while ( d < e ) { * d + + = m [ * s > > 4 ] ; * d + + = m [ * s + + & 15 ] ; } * d = 0 ; return t ; }
static char * to_hex ( char * d , uint8_t * s ) { char * m = " 0123456789ABCDEF " ; char * t = d ; char * e = d + 40 ; while ( d < e ) { * d + + = m [ * s > > 4 ] ; * d + + = m [ * s + + & 15 ] ; } * d = 0 ; return t ; }
@ -208,7 +224,7 @@ size_t stats_top10_txt( char * reply ) {
/* This function collects 4096 /24s in 4096 possible
/* This function collects 4096 /24s in 4096 possible
malloc blocks
malloc blocks
*/
*/
static size_t stats_slash24s_txt ( char * reply , size_t amount , uint32_t thresh ) {
static size_t stats_slash24s_txt ( char * reply , size_t amount , uint32_t thresh ) {
# define NUM_TOPBITS 12
# define NUM_TOPBITS 12
@ -375,24 +391,14 @@ static size_t stats_fullscrapes_mrtg( char * reply ) {
}
}
static size_t stats_peers_mrtg ( char * reply ) {
static size_t stats_peers_mrtg ( char * reply ) {
size_t torrent_count = 0 , peer_count = 0 , seed_count = 0 , j ;
torrent_stats stats = { 0 , 0 , 0 } ;
int bucket ;
for ( bucket = 0 ; bucket < OT_BUCKET_COUNT ; + + bucket ) {
iterate_all_torrents ( torrent_statter , ( uintptr_t ) & stats ) ;
ot_vector * torrents_list = mutex_bucket_lock ( bucket ) ;
torrent_count + = torrents_list - > size ;
return sprintf ( reply , " %llu \n %llu \n opentracker serving %llu torrents \n opentracker " ,
for ( j = 0 ; j < torrents_list - > size ; + + j ) {
stats . peer_count ,
ot_peerlist * peer_list = ( ( ( ot_torrent * ) ( torrents_list - > data ) ) [ j ] ) . peer_list ;
stats . seed_count ,
peer_count + = peer_list - > peer_count ; seed_count + = peer_list - > seed_count ;
stats . torrent_count
}
mutex_bucket_unlock ( bucket , 0 ) ;
if ( ! g_opentracker_running )
return 0 ;
}
return sprintf ( reply , " %zd \n %zd \n opentracker serving %zd torrents \n opentracker " ,
peer_count ,
seed_count ,
torrent_count
) ;
) ;
}
}
@ -459,8 +465,7 @@ static size_t stats_return_renew_bucket( char * reply ) {
return r - reply ;
return r - reply ;
}
}
static size_t stats_return_sync_mrtg ( char * reply )
static size_t stats_return_sync_mrtg ( char * reply ) {
{
ot_time t = time ( NULL ) - ot_start_time ;
ot_time t = time ( NULL ) - ot_start_time ;
return sprintf ( reply ,
return sprintf ( reply ,
" %llu \n %llu \n %i seconds (%i hours) \n opentracker connections, %lu conns/s :: %lu success/s. " ,
" %llu \n %llu \n %i seconds (%i hours) \n opentracker connections, %lu conns/s :: %lu success/s. " ,
@ -473,6 +478,17 @@ static size_t stats_return_sync_mrtg( char * reply )
) ;
) ;
}
}
static size_t stats_return_everything ( char * reply ) {
char * r = reply ;
r + = sprintf ( r , " <stats> \n " ) ;
r + = sprintf ( r , " <uptime>%llu</uptime> \n " , ( unsigned long long ) ( time ( NULL ) - ot_start_time ) ) ;
r + = sprintf ( r , " <torrents>%zd</torrents> \n " , mutex_get_torrent_count ( ) ) ;
/* r += sprintf( r, " <peers>%llu</peers>\n", ); */
r + = sprintf ( reply , " </stats> " ) ;
return r - reply ;
}
extern const char
extern const char
* g_version_opentracker_c , * g_version_accesslist_c , * g_version_clean_c , * g_version_fullscrape_c , * g_version_http_c ,
* g_version_opentracker_c , * g_version_accesslist_c , * g_version_clean_c , * g_version_fullscrape_c , * g_version_http_c ,
* g_version_iovec_c , * g_version_mutex_c , * g_version_stats_c , * g_version_udp_c , * g_version_vector_c ,
* g_version_iovec_c , * g_version_mutex_c , * g_version_stats_c , * g_version_udp_c , * g_version_vector_c ,
@ -590,6 +606,9 @@ void stats_issue_event( ot_status_event event, PROTO_FLAG proto, uintptr_t event
case EVENT_SYNC :
case EVENT_SYNC :
ot_overall_sync_count + = event_data ;
ot_overall_sync_count + = event_data ;
break ;
break ;
case EVENT_BUCKET_LOCKED :
ot_overall_stall_count + + ;
break ;
default :
default :
break ;
break ;
}
}