From 929c31a75774656b8e42bfdc13446702d3d3a9c9 Mon Sep 17 00:00:00 2001 From: Arvid Norberg Date: Thu, 24 Mar 2011 03:34:06 +0000 Subject: [PATCH] fix pex unit test and shave off a few seconds for pex --- src/ut_pex.cpp | 57 +++++++++++++++++++++++++++++++++++++++++------ test/test_pex.cpp | 52 +++++++++++++++++++++++++----------------- 2 files changed, 81 insertions(+), 28 deletions(-) diff --git a/src/ut_pex.cpp b/src/ut_pex.cpp index fb1cd2a4a..b122b96d9 100644 --- a/src/ut_pex.cpp +++ b/src/ut_pex.cpp @@ -55,6 +55,10 @@ POSSIBILITY OF SUCH DAMAGE. #include "libtorrent/extensions/ut_pex.hpp" +#ifdef TORRENT_VERBOSE_LOGGING +#include "libtorrent/lazy_entry.hpp" +#endif + namespace libtorrent { namespace { const char extension_name[] = "ut_pex"; @@ -77,7 +81,9 @@ namespace libtorrent { namespace struct ut_pex_plugin: torrent_plugin { - ut_pex_plugin(torrent& t): m_torrent(t), m_1_minute(55), m_peers_in_message(0) {} + // randomize when we rebuild the pex message + // to evenly spread it out across all torrents + ut_pex_plugin(torrent& t): m_torrent(t), m_1_minute(random() % 60), m_peers_in_message(0) {} virtual boost::shared_ptr new_connection(peer_connection* pc); @@ -217,7 +223,7 @@ namespace libtorrent { namespace : m_torrent(t) , m_pc(pc) , m_tp(tp) - , m_1_minute(55) + , m_1_minute(60) , m_message_index(0) , m_first_time(true) { @@ -262,8 +268,8 @@ namespace libtorrent { namespace if (body.left() < length) return true; - ptime now = time_now_hires(); //#error TEMP! - if (now - m_last_pex[0]< seconds(60)) + ptime now = time_now(); + if (now - m_last_pex[0] < seconds(60)) { // this client appears to be trying to flood us // with pex messages. Don't allow that. @@ -288,8 +294,9 @@ namespace libtorrent { namespace lazy_entry const* p = pex_msg.dict_find_string("dropped"); #ifdef TORRENT_VERBOSE_LOGGING - (*m_pc.m_logger) << time_now_string() << " <== PEX [" - " dropped:" << (p?p->string_length():0); + int num_dropped = 0; + int num_added = 0; + if (p) num_dropped += p->string_length()/6; #endif if (p) { @@ -309,7 +316,7 @@ namespace libtorrent { namespace lazy_entry const* pf = pex_msg.dict_find_string("added.f"); #ifdef TORRENT_VERBOSE_LOGGING - (*m_pc.m_logger) << " added:" << (p?p->string_length():0) << " ]\n"; + if (p) num_added += p->string_length() / 6; #endif if (p != 0 && pf != 0 @@ -343,6 +350,9 @@ namespace libtorrent { namespace #if TORRENT_USE_IPV6 lazy_entry const* p6 = pex_msg.dict_find("dropped6"); +#ifdef TORRENT_VERBOSE_LOGGING + if (p6) num_dropped += p->string_length() / 18; +#endif if (p6 != 0 && p6->type() == lazy_entry::string_t) { int num_peers = p6->string_length() / 18; @@ -358,6 +368,9 @@ namespace libtorrent { namespace } p6 = pex_msg.dict_find("added6"); +#ifdef TORRENT_VERBOSE_LOGGING + if (p6) num_added += p->string_length() / 18; +#endif lazy_entry const* p6f = pex_msg.dict_find("added6.f"); if (p6 != 0 && p6f != 0 @@ -387,6 +400,10 @@ namespace libtorrent { namespace p.add_peer(adr, pid, peer_info::pex, flags); } } +#endif +#ifdef TORRENT_VERBOSE_LOGGING + m_pc.peer_log("<== PEX [ dropped: %d added: %d ]" + , num_dropped, num_added); #endif return true; } @@ -426,6 +443,27 @@ namespace libtorrent { namespace i.begin += pex_msg.size(); TORRENT_ASSERT(i.begin == i.end); + +#ifdef TORRENT_VERBOSE_LOGGING + lazy_entry m; + error_code ec; + int ret = lazy_bdecode(&pex_msg[0], &pex_msg[0] + pex_msg.size(), m, ec); + TORRENT_ASSERT(ret == 0); + TORRENT_ASSERT(!ec); + int num_dropped = 0; + int num_added = 0; + lazy_entry const* e = m.dict_find_string("added"); + if (e) num_added += e->string_length() / 6; + e = m.dict_find_string("dropped"); + if (e) num_dropped += e->string_length() / 6; + e = m.dict_find_string("added6"); + if (e) num_added += e->string_length() / 18; + e = m.dict_find_string("dropped6"); + if (e) num_dropped += e->string_length() / 18; + m_pc.peer_log("==> PEX_DIFF [ dropped: %d added: %d msg_size: %d ]" + , num_dropped, num_added, int(pex_msg.size())); +#endif + m_pc.setup_send(); } @@ -498,6 +536,11 @@ namespace libtorrent { namespace i.begin += pex_msg.size(); TORRENT_ASSERT(i.begin == i.end); + +#ifdef TORRENT_VERBOSE_LOGGING + m_pc.peer_log("==> PEX_FULL [ added: %d msg_size: %d ]", num_added, int(pex_msg.size())); +#endif + m_pc.setup_send(); } diff --git a/test/test_pex.cpp b/test/test_pex.cpp index af31acae8..8b3391c5f 100644 --- a/test/test_pex.cpp +++ b/test/test_pex.cpp @@ -49,29 +49,45 @@ void test_pex() session ses2(fingerprint("LT", 0, 1, 0, 0), std::make_pair(49200, 50000), "0.0.0.0", 0); session ses3(fingerprint("LT", 0, 1, 0, 0), std::make_pair(50200, 51000), "0.0.0.0", 0); + ses1.add_extension(create_ut_pex_plugin); + ses2.add_extension(create_ut_pex_plugin); + + torrent_handle tor1; + torrent_handle tor2; + torrent_handle tor3; + + boost::tie(tor1, tor2, tor3) = setup_transfer(&ses1, &ses2, &ses3, true, false, false, "_pex"); + + int mask = alert::all_categories + & ~(alert::progress_notification + | alert::performance_warning + | alert::stats_notification); + ses1.set_alert_mask(mask); + ses2.set_alert_mask(mask); + ses3.set_alert_mask(mask); + // this is to avoid everything finish from a single peer // immediately. To make the swarm actually connect all // three peers before finishing. - float rate_limit = 1000; session_settings set = ses1.settings(); - set.upload_rate_limit = rate_limit; + set.download_rate_limit = 0; + set.upload_rate_limit = 0; ses1.set_settings(set); // make the peer connecting the two worthless to transfer // data, to force peer 3 to connect directly to peer 1 through pex set = ses2.settings(); - set.download_rate_limit = rate_limit; + set.download_rate_limit = 2000; set.upload_rate_limit = 2000; + set.ignore_limits_on_local_network = false; + set.rate_limit_utp = true; ses2.set_settings(set); set = ses3.settings(); - set.download_rate_limit = rate_limit; - set.upload_rate_limit = rate_limit / 2; + set.download_rate_limit = 0; + set.upload_rate_limit = 0; ses3.set_settings(set); - ses1.add_extension(&create_ut_pex_plugin); - ses2.add_extension(&create_ut_pex_plugin); - #ifndef TORRENT_DISABLE_ENCRYPTION pe_settings pes; pes.out_enc_policy = pe_settings::forced; @@ -81,18 +97,7 @@ void test_pex() ses3.set_pe_settings(pes); #endif - torrent_handle tor1; - torrent_handle tor2; - torrent_handle tor3; - - boost::tie(tor1, tor2, tor3) = setup_transfer(&ses1, &ses2, &ses3, true, false, false, "_pex"); - - int mask = alert::all_categories & ~(alert::progress_notification | alert::performance_warning); - ses1.set_alert_mask(mask); - ses2.set_alert_mask(mask); - ses3.set_alert_mask(mask); - - test_sleep(1000); + test_sleep(100); // in this test, ses1 is a seed, ses2 is connected to ses1 and ses3. // the expected behavior is that ses2 will introduce ses1 and ses3 to each other @@ -103,7 +108,7 @@ void test_pex() torrent_status st1; torrent_status st2; torrent_status st3; - for (int i = 0; i < 90; ++i) + for (int i = 0; i < 10; ++i) { print_alerts(ses1, "ses1"); print_alerts(ses2, "ses2"); @@ -126,10 +131,15 @@ void test_pex() << st3.num_peers << std::endl; + // this is the success condition if (st1.num_peers == 2 && st2.num_peers == 2 && st3.num_peers == 2) break; + // this suggests that we failed. If session 3 completes without + // actually connecting to session 1, everything was transferred + // through session 2 if (st3.state == torrent_status::seeding) break; + test_sleep(1000); }