merge loading of piece priorities from resume data fix from RC_1_0

This commit is contained in:
arvidn 2015-07-24 22:34:53 -07:00
parent bb705e9a52
commit 40c7596da9
3 changed files with 50 additions and 11 deletions

View File

@ -74,6 +74,7 @@
1.0.6 release
* fix loading of piece priorities from resume data
* improved seed-mode handling (seed-mode will now automatically be left when
performing operations implying it's not a seed)
* fixed issue with file priorities and override resume data

View File

@ -1859,6 +1859,17 @@ namespace libtorrent
construct_storage();
if (m_share_mode && valid_metadata())
{
// in share mode, all pieces have their priorities initialized to 0
m_file_priority.clear();
m_file_priority.resize(m_torrent_file->num_files(), 0);
}
// in case file priorities were passed in via the add_torrent_params
// and also in the case of share mode, we need to update the priorities
update_piece_priorities();
// if we've already loaded file priorities, don't load piece priorities,
// they will interfere.
if (!m_seed_mode && m_resume_data && m_file_priority.empty())
@ -1881,13 +1892,6 @@ namespace libtorrent
}
}
if (m_share_mode && valid_metadata())
{
// in share mode, all pieces have their priorities initialized to 0
m_file_priority.clear();
m_file_priority.resize(m_torrent_file->num_files(), 0);
}
if (!m_connections_initialized)
{
m_connections_initialized = true;
@ -1907,10 +1911,6 @@ namespace libtorrent
}
}
// in case file priorities were passed in via the add_torrent_params
// and also in the case of share mode, we need to update the priorities
update_piece_priorities();
std::vector<web_seed_entry> const& web_seeds = m_torrent_file->web_seeds();
m_web_seeds.insert(m_web_seeds.end(), web_seeds.begin(), web_seeds.end());

View File

@ -37,6 +37,7 @@ POSSIBILITY OF SUCH DAMAGE.
#include "libtorrent/create_torrent.hpp"
#include "libtorrent/alert_types.hpp"
#include "libtorrent/entry.hpp"
#include "libtorrent/bencode.hpp"
#include <boost/make_shared.hpp>
@ -188,6 +189,43 @@ void default_tests(torrent_status const& s)
TEST_EQUAL(s.completed_time, 1348);
}
TORRENT_TEST(piece_priorities)
{
session ses;
boost::shared_ptr<torrent_info> ti = generate_torrent();
add_torrent_params p;
p.ti = ti;
p.save_path = ".";
torrent_handle h = ses.add_torrent(p);
h.piece_priority(0, 0);
h.piece_priority(ti->num_pieces()-1, 0);
h.save_resume_data();
alert const* a = wait_for_alert(ses, save_resume_data_alert::alert_type);
TEST_CHECK(a);
if (save_resume_data_alert const* ra = alert_cast<save_resume_data_alert>(a))
{
fprintf(stderr, "%s\n", ra->resume_data->to_string().c_str());
entry::string_type prios = (*ra->resume_data)["piece_priority"].string();
TEST_EQUAL(prios.size(), ti->num_pieces());
TEST_EQUAL(prios[0], '\0');
TEST_EQUAL(prios[1], '\x04');
TEST_EQUAL(prios[ti->num_pieces()-1], '\0');
bencode(std::back_inserter(p.resume_data), *ra->resume_data);
}
ses.remove_torrent(h);
// now, make sure the piece priorities are loaded correctly
h = ses.add_torrent(p);
TEST_EQUAL(h.piece_priority(0), 0);
TEST_EQUAL(h.piece_priority(1), 4);
TEST_EQUAL(h.piece_priority(ti->num_pieces()-1), 0);
}
// TODO: test what happens when loading a resume file with both piece priorities
// and file priorities (file prio should take presedence)