diff options
-rw-r--r-- | ot_fullscrape.c | 9 | ||||
-rw-r--r-- | ot_http.c | 2 | ||||
-rw-r--r-- | ot_mutex.h | 1 | ||||
-rw-r--r-- | ot_stats.c | 63 |
4 files changed, 47 insertions, 28 deletions
diff --git a/ot_fullscrape.c b/ot_fullscrape.c index 4cd0a44..d284bd4 100644 --- a/ot_fullscrape.c +++ b/ot_fullscrape.c | |||
@@ -162,14 +162,13 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas | |||
162 | switch( mode & TASK_TASK_MASK ) { | 162 | switch( mode & TASK_TASK_MASK ) { |
163 | case TASK_FULLSCRAPE: | 163 | case TASK_FULLSCRAPE: |
164 | default: | 164 | default: |
165 | |||
166 | /* push hash as bencoded string */ | 165 | /* push hash as bencoded string */ |
167 | *r++='2'; *r++='0'; *r++=':'; | 166 | *r++='2'; *r++='0'; *r++=':'; |
168 | memcpy( r, hash, sizeof(ot_hash) ); r += sizeof(ot_hash); | 167 | memcpy( r, hash, sizeof(ot_hash) ); r += sizeof(ot_hash); |
169 | /* push rest of the scrape string */ | 168 | /* push rest of the scrape string */ |
170 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count ); | 169 | r += sprintf( r, "d8:completei%zde10:downloadedi%zde10:incompletei%zdee", peer_list->seed_count, peer_list->down_count, peer_list->peer_count-peer_list->seed_count ); |
171 | 170 | ||
172 | break; | 171 | break; |
173 | case TASK_FULLSCRAPE_TPB_ASCII: | 172 | case TASK_FULLSCRAPE_TPB_ASCII: |
174 | to_hex( r, *hash ); r+= 2 * sizeof(ot_hash); | 173 | to_hex( r, *hash ); r+= 2 * sizeof(ot_hash); |
175 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); | 174 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); |
@@ -184,6 +183,12 @@ static void fullscrape_make( int *iovec_entries, struct iovec **iovector, ot_tas | |||
184 | r += fmt_urlencoded( r, (char *)*hash, 20 ); | 183 | r += fmt_urlencoded( r, (char *)*hash, 20 ); |
185 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); | 184 | r += sprintf( r, ":%zd:%zd\n", peer_list->seed_count, peer_list->peer_count-peer_list->seed_count ); |
186 | break; | 185 | break; |
186 | case TASK_FULLSCRAPE_TRACKERSTATE: | ||
187 | memcpy( r, *hash, sizeof(ot_hash) ); r += sizeof(ot_hash); | ||
188 | uint64_pack_big( r, (uint64_t)peer_list->down_count ); | ||
189 | uint64_pack_big( r + 8, (uint64_t)peer_list->base ); | ||
190 | r += 16; | ||
191 | break; | ||
187 | } | 192 | } |
188 | 193 | ||
189 | #ifdef WANT_COMPRESSION_GZIP | 194 | #ifdef WANT_COMPRESSION_GZIP |
@@ -165,7 +165,7 @@ static const ot_keywords keywords_mode[] = | |||
165 | { "busy", TASK_STATS_BUSY_NETWORKS }, { "torr", TASK_STATS_TORRENTS }, { "fscr", TASK_STATS_FULLSCRAPE }, | 165 | { "busy", TASK_STATS_BUSY_NETWORKS }, { "torr", TASK_STATS_TORRENTS }, { "fscr", TASK_STATS_FULLSCRAPE }, |
166 | { "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, | 166 | { "s24s", TASK_STATS_SLASH24S }, { "tpbs", TASK_STATS_TPB }, { "herr", TASK_STATS_HTTPERRORS }, |
167 | { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION }, | 167 | { "top10", TASK_STATS_TOP10 }, { "renew", TASK_STATS_RENEW }, { "syncs", TASK_STATS_SYNCS }, { "version", TASK_STATS_VERSION }, |
168 | { "everything", TASK_STATS_EVERYTHING }, { NULL, -3 } }; | 168 | { "everything", TASK_STATS_EVERYTHING }, { "statedump", TASK_FULLSCRAPE_TPB_URLENCODED }, { NULL, -3 } }; |
169 | static const ot_keywords keywords_format[] = | 169 | static const ot_keywords keywords_format[] = |
170 | { { "bin", TASK_FULLSCRAPE_TPB_BINARY }, { "ben", TASK_FULLSCRAPE }, { "url", TASK_FULLSCRAPE_TPB_URLENCODED }, | 170 | { { "bin", TASK_FULLSCRAPE_TPB_BINARY }, { "ben", TASK_FULLSCRAPE }, { "url", TASK_FULLSCRAPE_TPB_URLENCODED }, |
171 | { "txt", TASK_FULLSCRAPE_TPB_ASCII }, { NULL, -3 } }; | 171 | { "txt", TASK_FULLSCRAPE_TPB_ASCII }, { NULL, -3 } }; |
@@ -43,6 +43,7 @@ typedef enum { | |||
43 | TASK_FULLSCRAPE_TPB_BINARY = 0x0201, | 43 | TASK_FULLSCRAPE_TPB_BINARY = 0x0201, |
44 | TASK_FULLSCRAPE_TPB_ASCII = 0x0202, | 44 | TASK_FULLSCRAPE_TPB_ASCII = 0x0202, |
45 | TASK_FULLSCRAPE_TPB_URLENCODED = 0x0203, | 45 | TASK_FULLSCRAPE_TPB_URLENCODED = 0x0203, |
46 | TASK_FULLSCRAPE_TRACKERSTATE = 0x0204, | ||
46 | 47 | ||
47 | TASK_DMEM = 0x0300, | 48 | TASK_DMEM = 0x0300, |
48 | 49 | ||
@@ -57,11 +57,15 @@ static time_t ot_start_time; | |||
57 | 57 | ||
58 | #ifdef WANT_LOG_NETWORKS | 58 | #ifdef WANT_LOG_NETWORKS |
59 | #define STATS_NETWORK_NODE_BITWIDTH 8 | 59 | #define STATS_NETWORK_NODE_BITWIDTH 8 |
60 | #define STATS_NETWORK_NODE_MAXDEPTH 16 | ||
61 | |||
62 | #define STATS_NETWORK_NODE_BITMASK ((1<<STATS_NETWORK_NODE_BITWIDTH)-1) | ||
63 | #define STATS_NETWORK_NODE_COUNT (1<<STATS_NETWORK_NODE_BITWIDTH) | 60 | #define STATS_NETWORK_NODE_COUNT (1<<STATS_NETWORK_NODE_BITWIDTH) |
64 | 61 | ||
62 | #ifdef WANT_V6 | ||
63 | #define STATS_NETWORK_NODE_MAXDEPTH (48/8-1) | ||
64 | #else | ||
65 | #define STATS_NETWORK_NODE_MAXDEPTH (12+24/8-1) | ||
66 | #endif | ||
67 | |||
68 | |||
65 | typedef union stats_network_node stats_network_node; | 69 | typedef union stats_network_node stats_network_node; |
66 | union stats_network_node { | 70 | union stats_network_node { |
67 | int counters[STATS_NETWORK_NODE_COUNT]; | 71 | int counters[STATS_NETWORK_NODE_COUNT]; |
@@ -71,9 +75,9 @@ union stats_network_node { | |||
71 | static stats_network_node *stats_network_counters_root = NULL; | 75 | static stats_network_node *stats_network_counters_root = NULL; |
72 | 76 | ||
73 | static int stat_increase_network_count( stats_network_node **node, int depth, uintptr_t ip ) { | 77 | static int stat_increase_network_count( stats_network_node **node, int depth, uintptr_t ip ) { |
74 | ot_ip6 *_ip = (ot_ip6*)ip; | 78 | uint8_t *_ip = (uint8_t*)ip; |
75 | int foo = (*_ip)[depth]; | 79 | int foo = _ip[++depth]; |
76 | 80 | ||
77 | if( !*node ) { | 81 | if( !*node ) { |
78 | *node = malloc( sizeof( stats_network_node ) ); | 82 | *node = malloc( sizeof( stats_network_node ) ); |
79 | if( !*node ) | 83 | if( !*node ) |
@@ -91,31 +95,32 @@ static int stat_increase_network_count( stats_network_node **node, int depth, ui | |||
91 | static int stats_shift_down_network_count( stats_network_node **node, int depth, int shift ) { | 95 | static int stats_shift_down_network_count( stats_network_node **node, int depth, int shift ) { |
92 | int i, rest = 0; | 96 | int i, rest = 0; |
93 | if( !*node ) return 0; | 97 | if( !*node ) return 0; |
94 | 98 | ||
95 | if( ++depth == STATS_NETWORK_NODE_MAXDEPTH ) | 99 | if( ++depth == STATS_NETWORK_NODE_MAXDEPTH ) |
96 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) { | 100 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) { |
97 | rest += ((*node)->counters[i]>>=shift); | 101 | rest += ((*node)->counters[i]>>=shift); |
98 | return rest; | 102 | return rest; |
99 | } | 103 | } |
100 | 104 | ||
101 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) { | 105 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) { |
102 | stats_network_node **childnode = &(*node)->children[i]; | 106 | stats_network_node **childnode = &(*node)->children[i]; |
103 | int rest_val; | 107 | int rest_val; |
104 | 108 | ||
105 | if( !*childnode ) continue; | 109 | if( !*childnode ) continue; |
106 | 110 | ||
107 | rest += rest_val = stats_shift_down_network_count( childnode, depth, shift ); | 111 | rest += rest_val = stats_shift_down_network_count( childnode, depth, shift ); |
108 | 112 | ||
109 | if( rest_val ) continue; | 113 | if( rest_val ) continue; |
110 | 114 | ||
111 | free( (*node)->children[i] ); | 115 | free( (*node)->children[i] ); |
112 | (*node)->children[i] = NULL; | 116 | (*node)->children[i] = NULL; |
113 | } | 117 | } |
114 | 118 | ||
115 | return rest; | 119 | return rest; |
116 | } | 120 | } |
117 | 121 | ||
118 | static void stats_get_highscore_networks( stats_network_node *node, int depth, uint32_t node_value, int *scores, uint32_t *networks, int network_count ) { | 122 | static void stats_get_highscore_networks( stats_network_node *node, int depth, ot_ip6 node_value, int *scores, ot_ip6 *networks, int network_count ) { |
123 | uint8_t *_node_value = (uint8_t*)node_value; | ||
119 | int i; | 124 | int i; |
120 | 125 | ||
121 | if( !node ) return; | 126 | if( !node ) return; |
@@ -127,34 +132,41 @@ static void stats_get_highscore_networks( stats_network_node *node, int depth, u | |||
127 | 132 | ||
128 | if( depth < STATS_NETWORK_NODE_MAXDEPTH ) { | 133 | if( depth < STATS_NETWORK_NODE_MAXDEPTH ) { |
129 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) | 134 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) |
130 | if( node->children[i] ) | 135 | if( node->children[i] ) { |
131 | stats_get_highscore_networks( node->children[i], depth, node_value | ( i << ( 32 - depth * STATS_NETWORK_NODE_BITWIDTH ) ), scores, networks, network_count ); | 136 | _node_value[depth] = i; |
137 | stats_get_highscore_networks( node->children[i], depth, node_value, scores, networks, network_count ); | ||
138 | } | ||
132 | } else | 139 | } else |
133 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) { | 140 | for( i=0; i<STATS_NETWORK_NODE_COUNT; ++i ) { |
134 | int j=1; | 141 | int j=1; |
135 | if( node->counters[i] <= scores[0] ) continue; | 142 | if( node->counters[i] <= scores[0] ) continue; |
136 | 143 | ||
144 | _node_value[depth] = i; | ||
137 | while( (j<network_count) && (node->counters[i]>scores[j] ) ) ++j; | 145 | while( (j<network_count) && (node->counters[i]>scores[j] ) ) ++j; |
138 | --j; | 146 | --j; |
139 | 147 | ||
140 | memcpy( scores, scores + 1, j * sizeof( *scores ) ); | 148 | memcpy( scores, scores + 1, j * sizeof( *scores ) ); |
141 | memcpy( networks, networks + 1, j * sizeof( *networks ) ); | 149 | memcpy( networks, networks + 1, j * sizeof( *networks ) ); |
142 | scores[ j ] = node->counters[ i ]; | 150 | scores[ j ] = node->counters[ i ]; |
143 | networks[ j ] = node_value | ( i << ( 32 - depth * STATS_NETWORK_NODE_BITWIDTH ) ); | 151 | memcpy( networks + j, _node_value, sizeof( *networks ) ); |
144 | } | 152 | } |
145 | } | 153 | } |
146 | 154 | ||
147 | static size_t stats_return_busy_networks( char * reply ) { | 155 | static size_t stats_return_busy_networks( char * reply ) { |
148 | uint32_t networks[16]; | 156 | ot_ip6 networks[256]; |
149 | int scores[16]; | 157 | ot_ip6 node_value; |
158 | int scores[256]; | ||
150 | int i; | 159 | int i; |
151 | char * r = reply; | 160 | char * r = reply; |
161 | |||
162 | stats_get_highscore_networks( stats_network_counters_root, 0, node_value, scores, networks, 256 ); | ||
152 | 163 | ||
153 | stats_get_highscore_networks( stats_network_counters_root, 0, 0, scores, networks, 16 ); | 164 | for( i=255; i>=0; --i) { |
154 | 165 | r += sprintf( r, "%08i: ", scores[i] ); | |
155 | for( i=15; i>=0; --i) | 166 | r += fmt_ip6c( r, networks[i] ); |
156 | r += sprintf( r, "%08i: %d.%d.%d.0/24\n", scores[i], (networks[i]>>24)&0xff, (networks[i]>>16)&0xff, (networks[i]>>8)&0xff ); | 167 | *r++ = '\n'; |
157 | 168 | } | |
169 | |||
158 | return r - reply; | 170 | return r - reply; |
159 | } | 171 | } |
160 | 172 | ||
@@ -442,6 +454,7 @@ static size_t stats_return_everything( char * reply ) { | |||
442 | 454 | ||
443 | iterate_all_torrents( torrent_statter, (uintptr_t)&stats ); | 455 | iterate_all_torrents( torrent_statter, (uintptr_t)&stats ); |
444 | 456 | ||
457 | r += sprintf( r, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" ); | ||
445 | r += sprintf( r, "<version>\n" ); r += stats_return_tracker_version( r ); r += sprintf( r, "</version>\n" ); | 458 | r += sprintf( r, "<version>\n" ); r += stats_return_tracker_version( r ); r += sprintf( r, "</version>\n" ); |
446 | r += sprintf( r, "<stats>\n" ); | 459 | r += sprintf( r, "<stats>\n" ); |
447 | r += sprintf( r, " <uptime>%llu</uptime>\n", (unsigned long long)(time( NULL ) - ot_start_time) ); | 460 | r += sprintf( r, " <uptime>%llu</uptime>\n", (unsigned long long)(time( NULL ) - ot_start_time) ); |