seed mode fixes
This commit is contained in:
parent
e041c06053
commit
1c954451ff
|
@ -535,6 +535,11 @@ namespace libtorrent
|
||||||
|
|
||||||
int num_have() const
|
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()
|
return has_picker()
|
||||||
? m_picker->num_have()
|
? m_picker->num_have()
|
||||||
: m_torrent_file->num_pieces();
|
: m_torrent_file->num_pieces();
|
||||||
|
@ -823,16 +828,8 @@ namespace libtorrent
|
||||||
int sequence_number() const { return m_sequence_number; }
|
int sequence_number() const { return m_sequence_number; }
|
||||||
|
|
||||||
bool seed_mode() const { return m_seed_mode; }
|
bool seed_mode() const { return m_seed_mode; }
|
||||||
void leave_seed_mode(bool seed)
|
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();
|
|
||||||
}
|
|
||||||
bool all_verified() const
|
bool all_verified() const
|
||||||
{ return int(m_num_verified) == m_torrent_file->num_pieces(); }
|
{ return int(m_num_verified) == m_torrent_file->num_pieces(); }
|
||||||
bool verified_piece(int piece) const
|
bool verified_piece(int piece) const
|
||||||
|
@ -841,14 +838,7 @@ namespace libtorrent
|
||||||
TORRENT_ASSERT(piece >= 0);
|
TORRENT_ASSERT(piece >= 0);
|
||||||
return m_verified.get_bit(piece);
|
return m_verified.get_bit(piece);
|
||||||
}
|
}
|
||||||
void verified(int 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool add_merkle_nodes(std::map<int, sha1_hash> const& n, int piece);
|
bool add_merkle_nodes(std::map<int, sha1_hash> const& n, int piece);
|
||||||
|
|
||||||
|
|
|
@ -2119,7 +2119,7 @@ namespace libtorrent
|
||||||
, t->have_piece(r.piece)
|
, t->have_piece(r.piece)
|
||||||
, t->block_size());
|
, 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);
|
, r.piece , r.start , r.length);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -2168,21 +2168,6 @@ namespace libtorrent
|
||||||
boost::shared_ptr<torrent> t = associated_torrent().lock();
|
boost::shared_ptr<torrent> t = associated_torrent().lock();
|
||||||
TORRENT_ASSERT(t);
|
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());
|
piece_block b(r.piece, r.start / t->block_size());
|
||||||
m_receiving_block = b;
|
m_receiving_block = b;
|
||||||
|
|
||||||
|
@ -3163,7 +3148,7 @@ namespace libtorrent
|
||||||
++m_ses.m_choked_piece_requests;
|
++m_ses.m_choked_piece_requests;
|
||||||
#endif
|
#endif
|
||||||
#ifdef TORRENT_VERBOSE_LOGGING
|
#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);
|
, r.piece , r.start , r.length);
|
||||||
#endif
|
#endif
|
||||||
write_reject_request(r);
|
write_reject_request(r);
|
||||||
|
|
|
@ -565,7 +565,7 @@ namespace libtorrent
|
||||||
m_override_resume_data = true;
|
m_override_resume_data = true;
|
||||||
init();
|
init();
|
||||||
}
|
}
|
||||||
#else
|
#else // if 0
|
||||||
|
|
||||||
void torrent::on_torrent_download(error_code const& ec
|
void torrent::on_torrent_download(error_code const& ec
|
||||||
, http_parser const& parser, char const* data, int size)
|
, http_parser const& parser, char const* data, int size)
|
||||||
|
@ -679,7 +679,48 @@ namespace libtorrent
|
||||||
init();
|
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
|
#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()
|
void torrent::start()
|
||||||
{
|
{
|
||||||
|
@ -2854,7 +2895,9 @@ namespace libtorrent
|
||||||
const int last_piece = m_torrent_file->num_pieces() - 1;
|
const int last_piece = m_torrent_file->num_pieces() - 1;
|
||||||
const int piece_size = m_torrent_file->piece_length();
|
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_done = m_torrent_file->total_size() - m_padding;
|
||||||
st.total_wanted_done = st.total_done;
|
st.total_wanted_done = st.total_done;
|
||||||
|
|
|
@ -391,7 +391,7 @@ void test_remap_files_prio(storage_mode_t storage_mode = storage_mode_sparse)
|
||||||
|
|
||||||
add_torrent_params params;
|
add_torrent_params params;
|
||||||
params.storage_mode = storage_mode;
|
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;
|
params.flags &= ~add_torrent_params::flag_auto_managed;
|
||||||
|
|
||||||
wait_for_listen(ses1, "ses1");
|
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;
|
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
|
// test using piece sizes smaller than 16kB
|
||||||
boost::tie(tor1, tor2, ignore) = setup_transfer(&ses1, &ses2, 0
|
boost::tie(tor1, tor2, ignore) = setup_transfer(&ses1, &ses2, 0
|
||||||
, true, false, true, "_remap3", 8 * 1024, &t, false, ¶ms
|
, true, false, true, "_remap3", 8 * 1024, &t, false, ¶ms
|
||||||
, true, false, &t2);
|
, 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");
|
fprintf(stderr, "\ntesting remap scatter prio\n\n");
|
||||||
|
|
||||||
for (int i = 0; i < 50; ++i)
|
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;
|
std::cerr << "st2 state: " << state_str[st2.state] << std::endl;
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_CHECK(st1.state == torrent_status::seeding
|
TEST_CHECK(st1.state == torrent_status::seeding);
|
||||||
|| st1.state == torrent_status::checking_files);
|
|
||||||
TEST_CHECK(st2.state == torrent_status::downloading
|
TEST_CHECK(st2.state == torrent_status::downloading
|
||||||
|| st2.state == torrent_status::checking_resume_data);
|
|| st2.state == torrent_status::checking_resume_data);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue