From 2b9663edceb06386947fe1046bad5231b6915130 Mon Sep 17 00:00:00 2001 From: Marcos Pinto Date: Fri, 11 Jul 2008 07:10:21 +0000 Subject: [PATCH] lt sync 2518 - mostly timeout fixes --- .../include/libtorrent/peer_connection.hpp | 1 + libtorrent/include/libtorrent/time.hpp | 2 ++ libtorrent/src/peer_connection.cpp | 20 +++++++++++++++---- libtorrent/src/session_impl.cpp | 17 ++++++++++++++++ 4 files changed, 36 insertions(+), 4 deletions(-) diff --git a/libtorrent/include/libtorrent/peer_connection.hpp b/libtorrent/include/libtorrent/peer_connection.hpp index bfc45db5d..5a24e433d 100644 --- a/libtorrent/include/libtorrent/peer_connection.hpp +++ b/libtorrent/include/libtorrent/peer_connection.hpp @@ -600,6 +600,7 @@ namespace libtorrent ptime m_remote_dl_update; // the time when async_connect was called + // or when the incoming connection was established ptime m_connect; // the time when this peer sent us a not_interested message diff --git a/libtorrent/include/libtorrent/time.hpp b/libtorrent/include/libtorrent/time.hpp index e74247ebb..ca9e2d85b 100644 --- a/libtorrent/include/libtorrent/time.hpp +++ b/libtorrent/include/libtorrent/time.hpp @@ -124,6 +124,8 @@ namespace libtorrent { ptime() {} explicit ptime(boost::int64_t t): time(t) {} + ptime& operator+=(time_duration rhs) { time += rhs.diff; return *this; } + ptime& operator-=(time_duration rhs) { time -= rhs.diff; return *this; } boost::int64_t time; }; diff --git a/libtorrent/src/peer_connection.cpp b/libtorrent/src/peer_connection.cpp index e8022390d..fce7f1999 100755 --- a/libtorrent/src/peer_connection.cpp +++ b/libtorrent/src/peer_connection.cpp @@ -84,6 +84,7 @@ namespace libtorrent , m_requested(min_time()) , m_timeout_extend(0) , m_remote_dl_update(time_now()) + , m_connect(time_now()) , m_became_uninterested(time_now()) , m_became_uninteresting(time_now()) , m_free_upload(0) @@ -187,6 +188,7 @@ namespace libtorrent , m_requested(min_time()) , m_timeout_extend(0) , m_remote_dl_update(time_now()) + , m_connect(time_now()) , m_became_uninterested(time_now()) , m_became_uninteresting(time_now()) , m_free_upload(0) @@ -1511,6 +1513,8 @@ namespace libtorrent return; } + ptime now = time_now(); + piece_picker& picker = t->picker(); piece_manager& fs = t->filesystem(); @@ -1580,14 +1584,14 @@ namespace libtorrent m_timeout_extend = 0; if (!m_download_queue.empty()) - m_requested = time_now(); + m_requested = now; request_a_block(*t, *this); send_block_requests(); return; } - if (total_seconds(time_now() - m_requested) + if (total_seconds(now - m_requested) < m_ses.settings().request_timeout && m_snubbed) { @@ -1605,9 +1609,17 @@ namespace libtorrent TORRENT_ASSERT(m_channel_state[download_channel] == peer_info::bw_idle); m_download_queue.erase(b); - m_timeout_extend = 0; if (!m_download_queue.empty()) - m_requested = time_now(); + { + m_timeout_extend = (std::max)(m_timeout_extend + - m_ses.settings().request_timeout, 0); + m_requested += seconds(m_ses.settings().request_timeout); + if (m_requested > now) m_requested = now; + } + else + { + m_timeout_extend = 0; + } // did we request this block from any other peers? bool multi = picker.num_peers(block_finished) > 1; diff --git a/libtorrent/src/session_impl.cpp b/libtorrent/src/session_impl.cpp index 92ad41db6..c2a87c73d 100755 --- a/libtorrent/src/session_impl.cpp +++ b/libtorrent/src/session_impl.cpp @@ -1022,6 +1022,23 @@ namespace aux { << m_disk_thread.disk_allocations() << "\t" << std::endl; #endif + + // -------------------------------------------------------------- + // check for incoming connections that might have timed out + // -------------------------------------------------------------- + + for (connection_map::iterator i = m_connections.begin(); + i != m_connections.end();) + { + peer_connection* p = (*i).get(); + ++i; + // ignore connections that already have a torrent, since they + // are ticket through the torrents' second_ticket + if (!p->associated_torrent().expired()) continue; + if (m_last_tick - p->connected_time() > seconds(m_settings.peer_connect_timeout)) + p->disconnect("timeout: incoming connection"); + } + // -------------------------------------------------------------- // second_tick every torrent // --------------------------------------------------------------