Merge pull request #163 from aldenml/dht-storage-counters
Create dht_storage_counters to avoid internal counter in future public API
This commit is contained in:
commit
01193fcf7c
|
@ -50,6 +50,15 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
namespace libtorrent {
|
namespace libtorrent {
|
||||||
namespace dht
|
namespace dht
|
||||||
{
|
{
|
||||||
|
// This structure hold the relevant counters for the storage
|
||||||
|
struct TORRENT_EXPORT dht_storage_counters
|
||||||
|
{
|
||||||
|
boost::int32_t torrents;
|
||||||
|
boost::int32_t peers;
|
||||||
|
boost::int32_t immutable_data;
|
||||||
|
boost::int32_t mutable_data;
|
||||||
|
};
|
||||||
|
|
||||||
// The DHT storage interface is a pure virtual class that can
|
// The DHT storage interface is a pure virtual class that can
|
||||||
// be implemented to customize how the data for the DHT is stored.
|
// be implemented to customize how the data for the DHT is stored.
|
||||||
//
|
//
|
||||||
|
@ -186,12 +195,13 @@ namespace dht
|
||||||
//
|
//
|
||||||
virtual void tick() = 0;
|
virtual void tick() = 0;
|
||||||
|
|
||||||
|
virtual dht_storage_counters counters() const = 0;
|
||||||
|
|
||||||
virtual ~dht_storage_interface() {}
|
virtual ~dht_storage_interface() {}
|
||||||
};
|
};
|
||||||
|
|
||||||
TORRENT_EXPORT dht_storage_interface* dht_default_storage_constructor(sha1_hash const& id
|
TORRENT_EXPORT dht_storage_interface* dht_default_storage_constructor(sha1_hash const& id
|
||||||
, dht_settings const& settings
|
, dht_settings const& settings);
|
||||||
, counters& counters);
|
|
||||||
|
|
||||||
} } // namespace libtorrent::dht
|
} } // namespace libtorrent::dht
|
||||||
|
|
||||||
|
|
|
@ -114,6 +114,7 @@ namespace libtorrent { namespace dht
|
||||||
#endif
|
#endif
|
||||||
void dht_status(std::vector<dht_routing_bucket>& table
|
void dht_status(std::vector<dht_routing_bucket>& table
|
||||||
, std::vector<dht_lookup>& requests);
|
, std::vector<dht_lookup>& requests);
|
||||||
|
void update_stats_counters(counters& c) const;
|
||||||
|
|
||||||
// translate bittorrent kademlia message into the generic kademlia message
|
// translate bittorrent kademlia message into the generic kademlia message
|
||||||
// used by the library
|
// used by the library
|
||||||
|
|
|
@ -214,6 +214,8 @@ public:
|
||||||
void status(std::vector<dht_routing_bucket>& table
|
void status(std::vector<dht_routing_bucket>& table
|
||||||
, std::vector<dht_lookup>& requests);
|
, std::vector<dht_lookup>& requests);
|
||||||
|
|
||||||
|
void update_stats_counters(counters& c) const;
|
||||||
|
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
void status(libtorrent::session_status& s);
|
void status(libtorrent::session_status& s);
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -57,6 +57,8 @@ POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <libtorrent/kademlia/item.hpp>
|
#include <libtorrent/kademlia/item.hpp>
|
||||||
#include <libtorrent/kademlia/node_id.hpp>
|
#include <libtorrent/kademlia/node_id.hpp>
|
||||||
|
|
||||||
|
#include <string.h> // for memset
|
||||||
|
|
||||||
namespace libtorrent {
|
namespace libtorrent {
|
||||||
namespace dht {
|
namespace dht {
|
||||||
namespace
|
namespace
|
||||||
|
@ -198,12 +200,11 @@ namespace
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
dht_default_storage(sha1_hash const& id, dht_settings const& settings
|
dht_default_storage(sha1_hash const& id, dht_settings const& settings)
|
||||||
, counters& cnt)
|
|
||||||
: m_id(id)
|
: m_id(id)
|
||||||
, m_settings(settings)
|
, m_settings(settings)
|
||||||
, m_counters(cnt)
|
|
||||||
{
|
{
|
||||||
|
memset(&m_counters, 0, sizeof(m_counters));
|
||||||
}
|
}
|
||||||
|
|
||||||
~dht_default_storage() {}
|
~dht_default_storage() {}
|
||||||
|
@ -295,9 +296,9 @@ namespace
|
||||||
candidate = i;
|
candidate = i;
|
||||||
}
|
}
|
||||||
m_map.erase(candidate);
|
m_map.erase(candidate);
|
||||||
m_counters.inc_stats_counter(counters::dht_torrents, -1);
|
m_counters.torrents -= 1;
|
||||||
}
|
}
|
||||||
m_counters.inc_stats_counter(counters::dht_torrents);
|
m_counters.torrents += 1;
|
||||||
v = &m_map[info_hash];
|
v = &m_map[info_hash];
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -353,7 +354,7 @@ namespace
|
||||||
TORRENT_ASSERT(j != m_immutable_table.end());
|
TORRENT_ASSERT(j != m_immutable_table.end());
|
||||||
free(j->second.value);
|
free(j->second.value);
|
||||||
m_immutable_table.erase(j);
|
m_immutable_table.erase(j);
|
||||||
m_counters.inc_stats_counter(counters::dht_immutable_data, -1);
|
m_counters.immutable_data -= 1;
|
||||||
}
|
}
|
||||||
dht_immutable_item to_add;
|
dht_immutable_item to_add;
|
||||||
to_add.value = static_cast<char*>(malloc(size));
|
to_add.value = static_cast<char*>(malloc(size));
|
||||||
|
@ -362,7 +363,7 @@ namespace
|
||||||
|
|
||||||
boost::tie(i, boost::tuples::ignore) = m_immutable_table.insert(
|
boost::tie(i, boost::tuples::ignore) = m_immutable_table.insert(
|
||||||
std::make_pair(target, to_add));
|
std::make_pair(target, to_add));
|
||||||
m_counters.inc_stats_counter(counters::dht_immutable_data);
|
m_counters.immutable_data += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// fprintf(stderr, "added immutable item (%d)\n", int(m_immutable_table.size()));
|
// fprintf(stderr, "added immutable item (%d)\n", int(m_immutable_table.size()));
|
||||||
|
@ -423,7 +424,7 @@ namespace
|
||||||
free(j->second.value);
|
free(j->second.value);
|
||||||
free(j->second.salt);
|
free(j->second.salt);
|
||||||
m_mutable_table.erase(j);
|
m_mutable_table.erase(j);
|
||||||
m_counters.inc_stats_counter(counters::dht_mutable_data, -1);
|
m_counters.mutable_data -= 1;
|
||||||
}
|
}
|
||||||
dht_mutable_item to_add;
|
dht_mutable_item to_add;
|
||||||
to_add.value = static_cast<char*>(malloc(size));
|
to_add.value = static_cast<char*>(malloc(size));
|
||||||
|
@ -443,7 +444,7 @@ namespace
|
||||||
|
|
||||||
boost::tie(i, boost::tuples::ignore) = m_mutable_table.insert(
|
boost::tie(i, boost::tuples::ignore) = m_mutable_table.insert(
|
||||||
std::make_pair(target, to_add));
|
std::make_pair(target, to_add));
|
||||||
m_counters.inc_stats_counter(counters::dht_mutable_data);
|
m_counters.mutable_data += 1;
|
||||||
|
|
||||||
// fprintf(stderr, "added mutable item (%d)\n", int(m_mutable_table.size()));
|
// fprintf(stderr, "added mutable item (%d)\n", int(m_mutable_table.size()));
|
||||||
}
|
}
|
||||||
|
@ -483,7 +484,7 @@ namespace
|
||||||
}
|
}
|
||||||
free(i->second.value);
|
free(i->second.value);
|
||||||
m_immutable_table.erase(i++);
|
m_immutable_table.erase(i++);
|
||||||
m_counters.inc_stats_counter(counters::dht_immutable_data, -1);
|
m_counters.immutable_data -= 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
// look through all peers and see if any have timed out
|
// look through all peers and see if any have timed out
|
||||||
|
@ -501,15 +502,20 @@ namespace
|
||||||
if (it != m_map.end())
|
if (it != m_map.end())
|
||||||
{
|
{
|
||||||
m_map.erase(it);
|
m_map.erase(it);
|
||||||
m_counters.inc_stats_counter(counters::dht_torrents, -1);
|
m_counters.torrents -= 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
virtual dht_storage_counters counters() const TORRENT_OVERRIDE
|
||||||
|
{
|
||||||
|
return m_counters;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
sha1_hash m_id;
|
sha1_hash m_id;
|
||||||
dht_settings const& m_settings;
|
dht_settings const& m_settings;
|
||||||
counters& m_counters;
|
dht_storage_counters m_counters;
|
||||||
|
|
||||||
table_t m_map;
|
table_t m_map;
|
||||||
dht_immutable_table_t m_immutable_table;
|
dht_immutable_table_t m_immutable_table;
|
||||||
|
@ -518,10 +524,9 @@ namespace
|
||||||
}
|
}
|
||||||
|
|
||||||
dht_storage_interface* dht_default_storage_constructor(sha1_hash const& id
|
dht_storage_interface* dht_default_storage_constructor(sha1_hash const& id
|
||||||
, dht_settings const& settings
|
, dht_settings const& settings)
|
||||||
, counters& counters)
|
|
||||||
{
|
{
|
||||||
return new dht_default_storage(id, settings, counters);
|
return new dht_default_storage(id, settings);
|
||||||
}
|
}
|
||||||
|
|
||||||
} } // namespace libtorrent::dht
|
} } // namespace libtorrent::dht
|
||||||
|
|
|
@ -171,6 +171,11 @@ namespace libtorrent { namespace dht
|
||||||
m_dht.status(table, requests);
|
m_dht.status(table, requests);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void dht_tracker::update_stats_counters(counters& c) const
|
||||||
|
{
|
||||||
|
m_dht.update_stats_counters(c);
|
||||||
|
}
|
||||||
|
|
||||||
void dht_tracker::connection_timeout(error_code const& e)
|
void dht_tracker::connection_timeout(error_code const& e)
|
||||||
{
|
{
|
||||||
if (e || m_abort) return;
|
if (e || m_abort) return;
|
||||||
|
|
|
@ -98,7 +98,7 @@ node::node(udp_socket_interface* sock
|
||||||
, m_last_self_refresh(min_time())
|
, m_last_self_refresh(min_time())
|
||||||
, m_sock(sock)
|
, m_sock(sock)
|
||||||
, m_counters(cnt)
|
, m_counters(cnt)
|
||||||
, m_storage(dht_default_storage_constructor(m_id, m_settings, m_counters))
|
, m_storage(dht_default_storage_constructor(m_id, m_settings))
|
||||||
{
|
{
|
||||||
m_secret[0] = random();
|
m_secret[0] = random();
|
||||||
m_secret[1] = random();
|
m_secret[1] = random();
|
||||||
|
@ -603,6 +603,18 @@ void node::status(std::vector<dht_routing_bucket>& table
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: in the future, this function should update all the
|
||||||
|
// dht related counter. For now, it just update the storage
|
||||||
|
// related ones.
|
||||||
|
void node::update_stats_counters(counters& c) const
|
||||||
|
{
|
||||||
|
const dht_storage_counters& dht_cnt = m_storage->counters();
|
||||||
|
c.set_value(counters::dht_torrents, dht_cnt.torrents);
|
||||||
|
c.set_value(counters::dht_peers, dht_cnt.peers);
|
||||||
|
c.set_value(counters::dht_immutable_data, dht_cnt.immutable_data);
|
||||||
|
c.set_value(counters::dht_mutable_data, dht_cnt.mutable_data);
|
||||||
|
}
|
||||||
|
|
||||||
#ifndef TORRENT_NO_DEPRECATE
|
#ifndef TORRENT_NO_DEPRECATE
|
||||||
// TODO: 2 use the non deprecated function instead of this one
|
// TODO: 2 use the non deprecated function instead of this one
|
||||||
void node::status(session_status& s)
|
void node::status(session_status& s)
|
||||||
|
@ -1154,4 +1166,5 @@ void node::incoming_request(msg const& m, entry& e)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
} } // namespace libtorrent::dht
|
} } // namespace libtorrent::dht
|
||||||
|
|
|
@ -4417,6 +4417,11 @@ retry:
|
||||||
{
|
{
|
||||||
m_disk_thread.update_stats_counters(m_stats_counters);
|
m_disk_thread.update_stats_counters(m_stats_counters);
|
||||||
|
|
||||||
|
#ifndef TORRENT_DISABLE_DHT
|
||||||
|
if (m_dht)
|
||||||
|
m_dht->update_stats_counters(m_stats_counters);
|
||||||
|
#endif
|
||||||
|
|
||||||
m_stats_counters.set_value(counters::sent_ip_overhead_bytes
|
m_stats_counters.set_value(counters::sent_ip_overhead_bytes
|
||||||
, m_stat.total_transfer(stat::upload_ip_protocol));
|
, m_stat.total_transfer(stat::upload_ip_protocol));
|
||||||
|
|
||||||
|
|
|
@ -74,8 +74,7 @@ namespace
|
||||||
TORRENT_TEST(dht_storage)
|
TORRENT_TEST(dht_storage)
|
||||||
{
|
{
|
||||||
dht_settings sett = test_settings();
|
dht_settings sett = test_settings();
|
||||||
counters cnt;
|
dht_storage_interface* s = dht_default_storage_constructor(node_id(0), sett);
|
||||||
dht_storage_interface* s = dht_default_storage_constructor(node_id(0), sett, cnt);
|
|
||||||
|
|
||||||
TEST_CHECK(s != NULL);
|
TEST_CHECK(s != NULL);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue