int kad_status( char *buf, int size ) { char hexbuf[SHA1_HEX_LENGTH+1]; struct storage *strg = storage; struct search *srch = searches; int numsearches_active = 0; int numsearches_done = 0; int numstorage = 0; int numstorage_peers = 0; int numvalues = 0; int written = 0; /* count searches */ while( srch != NULL ) { if( srch->done ) { numsearches_done++; } else { numsearches_active++; } srch = srch->next; } /* count storage and peers */ while( strg != NULL ) { numstorage_peers += strg->numpeers; numstorage++; strg = strg->next; } numvalues = values_count(); bprintf( "Version: %s\n", kadnode_version_str ); bprintf( "DHT id: %s\n", str_id( myid, hexbuf ) ); bprintf( "DHT bound to: %s:%s / %s\n", (gconf->af == AF_INET) ? "0.0.0.0" : "::", gconf->dht_port, (gconf->dht_ifname == NULL) ? "<any device>" : gconf->dht_ifname ); bprintf( "DHT Nodes: %d (%d good) (%s)\n", kad_count_nodes( 0 ), kad_count_nodes( 1 ), (gconf->af == AF_INET) ? "IPv4" : "IPv6" ); bprintf( "DHT Storage: %d (max %d), %d peers (max %d per storage)\n", numstorage, DHT_MAX_HASHES, numstorage_peers, DHT_MAX_PEERS ); bprintf( "DHT Searches: %d active, %d completed (max %d)\n", numsearches_active, numsearches_done, DHT_MAX_SEARCHES ); bprintf( "DHT Blacklist: %d (max %d)\n", (next_blacklisted % DHT_MAX_BLACKLISTED), DHT_MAX_BLACKLISTED ); bprintf( "DHT Values to announce: %d\n", numvalues ); return written; }
/** * Callout queue periodic event for request load updates. * Also reclaims dead keys holding no values. */ static bool keys_periodic_load(void *unused_obj) { struct load_ctx ctx; (void) unused_obj; ctx.values = 0; ctx.now = tm_time(); hikset_foreach_remove(keys, keys_update_load, &ctx); g_assert(values_count() == ctx.values); if (GNET_PROPERTY(dht_storage_debug)) { size_t keys_count = hikset_count(keys); g_debug("DHT holding %zu value%s spread over %zu key%s", ctx.values, plural(ctx.values), keys_count, plural(keys_count)); } return TRUE; /* Keep calling */ }