seed mode fixes

This commit is contained in:
Arvid Norberg 2014-03-13 08:00:53 +00:00
parent e041c06053
commit 1c954451ff
4 changed files with 64 additions and 44 deletions

View File

@ -535,6 +535,11 @@ namespace libtorrent
int num_have() const
{
// pretend we have every piece when in seed mode
if (m_seed_mode) {
return m_torrent_file->num_pieces();
}
return has_picker()
? m_picker->num_have()
: m_torrent_file->num_pieces();
@ -823,16 +828,8 @@ namespace libtorrent
int sequence_number() const { return m_sequence_number; }
bool seed_mode() const { return m_seed_mode; }
void leave_seed_mode(bool seed)
{
if (!m_seed_mode) return;
m_seed_mode = false;
// seed is false if we turned out not
// to be a seed after all
if (!seed) force_recheck();
m_num_verified = 0;
m_verified.clear();
}
void leave_seed_mode(bool seed);
bool all_verified() const
{ return int(m_num_verified) == m_torrent_file->num_pieces(); }
bool verified_piece(int piece) const
@ -841,14 +838,7 @@ namespace libtorrent
TORRENT_ASSERT(piece >= 0);
return m_verified.get_bit(piece);
}
void verified(int piece)
{
TORRENT_ASSERT(piece < int(m_verified.size()));
TORRENT_ASSERT(piece >= 0);
TORRENT_ASSERT(m_verified.get_bit(piece) == false);
++m_num_verified;
m_verified.set_bit(piece);
}
void verified(int piece);
bool add_merkle_nodes(std::map<int, sha1_hash> const& n, int piece);

View File

@ -2119,7 +2119,7 @@ namespace libtorrent
, t->have_piece(r.piece)
, t->block_size());
peer_log("==> REJECT_PIECE [ piece: %d s: %d l: %d ]"
peer_log("==> REJECT_PIECE [ piece: %d | s: %d | l: %d ] invalid request"
, r.piece , r.start , r.length);
#endif
@ -2168,21 +2168,6 @@ namespace libtorrent
boost::shared_ptr<torrent> t = associated_torrent().lock();
TORRENT_ASSERT(t);
// piece_block can't necessarily hold large piece numbers
// so check that first
if (r.piece < 0
|| r.piece >= t->torrent_file().num_pieces()
|| r.start < 0
|| r.start > t->torrent_file().piece_length())
{
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_ERROR_LOGGING
peer_log("*** INVALID_PIECE [ piece: %d s: %d l: %d ]"
, r.piece, r.start, r.length);
#endif
disconnect(errors::invalid_piece, 2);
return;
}
piece_block b(r.piece, r.start / t->block_size());
m_receiving_block = b;
@ -3163,7 +3148,7 @@ namespace libtorrent
++m_ses.m_choked_piece_requests;
#endif
#ifdef TORRENT_VERBOSE_LOGGING
peer_log("==> REJECT_PIECE [ piece: %d s: %d l: %d ]"
peer_log("==> REJECT_PIECE [ piece: %d s: %d l: %d ] choking"
, r.piece , r.start , r.length);
#endif
write_reject_request(r);

View File

@ -565,7 +565,7 @@ namespace libtorrent
m_override_resume_data = true;
init();
}
#else
#else // if 0
void torrent::on_torrent_download(error_code const& ec
, http_parser const& parser, char const* data, int size)
@ -679,7 +679,48 @@ namespace libtorrent
init();
}
#endif // if 0
void torrent::leave_seed_mode(bool seed)
{
if (!m_seed_mode) return;
if (!seed)
{
// this means the user promised we had all the
// files, but it turned out we didn't. This is
// an error.
// TODO: 2 post alert
#if defined TORRENT_ERROR_LOGGING
debug_log("*** FAILED SEED MODE, rechecking");
#endif
}
#if defined TORRENT_VERBOSE_LOGGING || defined TORRENT_LOGGING
debug_log("*** LEAVING SEED MODE (%s)", seed ? "as seed" : "as non-seed");
#endif
m_seed_mode = false;
// seed is false if we turned out not
// to be a seed after all
if (!seed)
{
set_state(torrent_status::downloading);
force_recheck();
}
m_num_verified = 0;
m_verified.clear();
}
void torrent::verified(int piece)
{
TORRENT_ASSERT(piece < int(m_verified.size()));
TORRENT_ASSERT(piece >= 0);
TORRENT_ASSERT(m_verified.get_bit(piece) == false);
++m_num_verified;
m_verified.set_bit(piece);
}
void torrent::start()
{
@ -2854,7 +2895,9 @@ namespace libtorrent
const int last_piece = m_torrent_file->num_pieces() - 1;
const int piece_size = m_torrent_file->piece_length();
if (is_seed())
// if any piece hash fails, we'll be taken out of seed mode
// and m_seed_mode will be false
if (m_seed_mode || is_seed())
{
st.total_done = m_torrent_file->total_size() - m_padding;
st.total_wanted_done = st.total_done;

View File

@ -391,7 +391,7 @@ void test_remap_files_prio(storage_mode_t storage_mode = storage_mode_sparse)
add_torrent_params params;
params.storage_mode = storage_mode;
params.flags &= ~add_torrent_params::flag_paused;
params.flags |= add_torrent_params::flag_paused;
params.flags &= ~add_torrent_params::flag_auto_managed;
wait_for_listen(ses1, "ses1");
@ -399,15 +399,18 @@ void test_remap_files_prio(storage_mode_t storage_mode = storage_mode_sparse)
peer_disconnects = 0;
std::vector<boost::uint8_t> file_prio(2, 1);
file_prio[0] = 0;
params.file_priorities = file_prio;
// test using piece sizes smaller than 16kB
boost::tie(tor1, tor2, ignore) = setup_transfer(&ses1, &ses2, 0
, true, false, true, "_remap3", 8 * 1024, &t, false, &params
, true, false, &t2);
std::vector<int> file_prio(3, 1);
file_prio[0] = 0;
tor2.prioritize_files(file_prio);
tor1.resume();
tor2.resume();
fprintf(stderr, "\ntesting remap scatter prio\n\n");
for (int i = 0; i < 50; ++i)
@ -443,8 +446,7 @@ void test_remap_files_prio(storage_mode_t storage_mode = storage_mode_sparse)
std::cerr << "st2 state: " << state_str[st2.state] << std::endl;
}
TEST_CHECK(st1.state == torrent_status::seeding
|| st1.state == torrent_status::checking_files);
TEST_CHECK(st1.state == torrent_status::seeding);
TEST_CHECK(st2.state == torrent_status::downloading
|| st2.state == torrent_status::checking_resume_data);