added force_recheck to torrent_handle. Fixes #120

This commit is contained in:
Arvid Norberg 2008-06-07 16:24:56 +00:00
parent b856e0f15a
commit a1857f9699
6 changed files with 85 additions and 9 deletions

View File

@ -1532,6 +1532,7 @@ Its declaration looks like this::
void resume() const;
bool is_paused() const;
bool is_seed() const;
void force_recheck() const;
void resolve_countries(bool r);
bool resolve_countries() const;
@ -1788,6 +1789,20 @@ all potential (not connected) peers. You can use ``is_paused()`` to determine if
is currently paused. Torrents may be paused automatically if there is a file error (e.g. disk full)
or something similar. See file_error_alert_.
force_recheck()
---------------
::
void force_recheck() const;
``force_recheck`` puts the torrent back in a state where it assumes to have no resume data.
All peers will be disconnected and the torrent will stop announcing to the tracker. The torrent
will be added to the checking queue, and will be checked (all the files will be read and
compared to the piece hashes). Once the check is complete, the torrent will start connecting
to peers again, as normal.
resolve_countries()
-------------------

View File

@ -1065,6 +1065,14 @@ int main(int ac, char* av[])
break;
}
if (c == 'j')
{
// force recheck all torrents
std::for_each(handles.begin(), handles.end()
, bind(&torrent_handle::force_recheck
, bind(&handles_t::value_type::second, _1)));
}
if (c == 'r')
{
// force reannounce on all torrents
@ -1205,7 +1213,8 @@ int main(int ac, char* av[])
std::stringstream out;
out << "[q] quit [i] toggle peers [d] toggle downloading pieces [p] pause all "
"[u] unpause all [a] toggle piece bar [s] toggle download sequential [f] toggle files\n"
"[u] unpause all [a] toggle piece bar [s] toggle download sequential [f] toggle files "
"[j] force recheck\n"
"[1] toggle IP [2] toggle AS [3] toggle timers [4] toggle block progress "
"[5] toggle peer rate [6] toggle failures [7] toggle send buffers\n";

View File

@ -149,6 +149,7 @@ namespace libtorrent
void init();
void on_resume_data_checked(int ret, disk_io_job const& j);
void on_force_recheck(int ret, disk_io_job const& j);
void on_piece_checked(int ret, disk_io_job const& j);
void files_checked();
void start_checking();
@ -191,6 +192,7 @@ namespace libtorrent
void pause();
void resume();
bool is_paused() const { return m_paused; }
void force_recheck();
void save_resume_data();
bool is_auto_managed() const { return m_auto_managed; }
@ -906,9 +908,10 @@ namespace libtorrent
// connection to this torrent
bool m_has_incoming:1;
#ifndef NDEBUG
// this is set to true when the files are checked
// before the files are checked, we don't try to
// connect to peers
bool m_files_checked:1;
#endif
};
inline ptime torrent::next_announce() const

View File

@ -345,6 +345,7 @@ namespace libtorrent
bool is_paused() const;
void pause() const;
void resume() const;
void force_recheck() const;
void save_resume_data() const;
bool is_auto_managed() const;

View File

@ -201,11 +201,9 @@ namespace libtorrent
, m_got_tracker_response(false)
, m_connections_initialized(true)
, m_has_incoming(false)
, m_files_checked(false)
{
if (resume_data) m_resume_data = *resume_data;
#ifndef NDEBUG
m_files_checked = false;
#endif
}
torrent::torrent(
@ -308,10 +306,10 @@ namespace libtorrent
if (m_ses.m_listen_sockets.empty()) return false;
if (!m_ses.m_dht) return false;
if (!m_files_checked) return false;
// don't announce private torrents
if (m_torrent_file->is_valid() && m_torrent_file->priv()) return false;
if (m_trackers.empty()) return true;
return m_failed_trackers > 0 || !m_ses.settings().use_dht_as_fallback;
@ -619,6 +617,51 @@ namespace libtorrent
}
}
void torrent::force_recheck()
{
disconnect_all();
m_owning_storage->async_release_files();
m_owning_storage = new piece_manager(shared_from_this(), m_torrent_file
, m_save_path, m_ses.m_files, m_ses.m_disk_thread, m_storage_constructor
, m_storage_mode);
m_storage = m_owning_storage.get();
m_picker.reset(new piece_picker);
m_picker->init(m_torrent_file->piece_length() / m_block_size
, int((m_torrent_file->total_size()+m_block_size-1)/m_block_size));
// assume that we don't have anything
m_files_checked = false;
m_state = torrent_status::queued_for_checking;
m_resume_data = entry();
m_storage->async_check_fastresume(&m_resume_data
, bind(&torrent::on_force_recheck
, shared_from_this(), _1, _2));
}
void torrent::on_force_recheck(int ret, disk_io_job const& j)
{
session_impl::mutex_t::scoped_lock l(m_ses.m_mutex);
if (ret == piece_manager::fatal_disk_error)
{
if (m_ses.m_alerts.should_post(alert::fatal))
{
m_ses.m_alerts.post_alert(file_error_alert(j.error_file, get_handle(), j.str));
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING || defined TORRENT_ERROR_LOGGING
(*m_ses.m_logger) << time_now_string() << ": fatal disk error ["
" error: " << j.str <<
" torrent: " << torrent_file().name() <<
" ]\n";
#endif
}
m_error = j.str;
pause();
return;
}
m_ses.check_torrent(shared_from_this());
}
void torrent::start_checking()
{
m_state = torrent_status::checking_files;
@ -770,6 +813,7 @@ namespace libtorrent
// INVARIANT_CHECK;
if (m_trackers.empty()) return false;
if (!m_files_checked) return false;
if (m_just_paused)
{
@ -3148,9 +3192,7 @@ namespace libtorrent
, "torrent finished checking"));
}
#ifndef NDEBUG
m_files_checked = true;
#endif
}
alert_manager& torrent::alerts() const

View File

@ -265,6 +265,12 @@ namespace libtorrent
TORRENT_FORWARD(save_resume_data());
}
void torrent_handle::force_recheck() const
{
INVARIANT_CHECK;
TORRENT_FORWARD(force_recheck());
}
void torrent_handle::resume() const
{
INVARIANT_CHECK;