merged RC_1_1 into master

This commit is contained in:
Arvid Norberg 2018-07-18 14:46:11 +02:00
commit 828c5dd097
3 changed files with 61 additions and 9 deletions

View File

@ -87,6 +87,7 @@
* resume data no longer has timestamps of files
* require C++11 to build libtorrent
* fix exporting files from partfile while seeding
* fix potential deadlock on Windows, caused by performing restricted
tasks from within DllMain
* fix issue when subsequent file priority updates cause torrent to stop

View File

@ -3546,7 +3546,7 @@ bool is_downloading_state(int const st)
}
TORRENT_ASSERT(num_have() >= m_picker->num_have_filtered());
st.total_wanted_done = std::int64_t(num_passed() - m_picker->num_have_filtered())
st.total_wanted_done = std::int64_t(num_have() - m_picker->num_have_filtered())
* piece_size;
TORRENT_ASSERT(st.total_wanted_done >= 0);
@ -3580,7 +3580,7 @@ bool is_downloading_state(int const st)
st.total_done += corr;
if (m_picker->piece_priority(last_piece) != dont_download)
{
TORRENT_ASSERT(st.total_wanted_done >= piece_size);
TORRENT_ASSERT(st.total_wanted_done >= -corr);
st.total_wanted_done += corr;
}
}
@ -3600,7 +3600,7 @@ bool is_downloading_state(int const st)
for (piece_index_t j = p.piece; p.length > 0; ++j)
{
int const deduction = std::min(p.length, piece_size - p.start);
bool const done = m_picker->has_piece_passed(j);
bool const done = m_picker->have_piece(j);
bool const wanted = m_picker->piece_priority(j) > dont_download;
if (done) st.total_done -= deduction;
if (wanted) st.total_wanted -= deduction;
@ -5029,8 +5029,6 @@ bool is_downloading_state(int const st)
{
INVARIANT_CHECK;
if (is_seed()) return;
auto new_priority = fix_priorities(files
, valid_metadata() ? &m_torrent_file->files() : nullptr);
@ -5052,8 +5050,6 @@ bool is_downloading_state(int const st)
{
INVARIANT_CHECK;
if (is_seed()) return;
// setting file priority on a torrent that doesn't have metadata yet is
// similar to having passed in file priorities through add_torrent_params.
// we store the priorities in m_file_priority until we get the metadata
@ -7439,8 +7435,8 @@ bool is_downloading_state(int const st)
m_file_progress.clear();
}
m_have_all = true;
update_gauge();
}
update_gauge();
}
// called when torrent is complete. i.e. all pieces downloaded
@ -10789,7 +10785,12 @@ bool is_downloading_state(int const st)
if (st->state == torrent_status::finished
|| st->state == torrent_status::seeding)
{
TORRENT_ASSERT(st->is_finished);
// this assumption does not always hold. We transition to "finished"
// when we receive the last block of the last piece, which is before
// the hash check comes back. "is_finished" is set to true once all the
// pieces have been hash checked. So, there's a short window where it
// doesn't hold.
// TORRENT_ASSERT(st->is_finished);
}
#endif

View File

@ -479,3 +479,53 @@ TORRENT_TEST(no_metadata_piece_prio)
ses.remove_torrent(h);
}
TORRENT_TEST(export_file_while_seed)
{
settings_pack pack = settings();
lt::session ses(pack);
error_code ec;
create_directory("tmp2_priority", ec);
std::ofstream file("tmp2_priority/temporary");
auto t = ::create_torrent(&file, "temporary", 16 * 1024, 13, false);
file.close();
add_torrent_params addp;
addp.flags &= ~torrent_flags::paused;
addp.flags &= ~torrent_flags::auto_managed;
addp.save_path = ".";
addp.ti = t;
torrent_handle h = ses.add_torrent(addp);
// write to the partfile
h.file_priority(file_index_t{0}, lt::dont_download);
std::vector<char> piece(16 * 1024);
for (int i = 0; i < int(piece.size()); ++i)
piece[std::size_t(i)] = char((i % 26) + 'A');
for (piece_index_t i : t->piece_range())
h.add_piece(i, piece.data());
TEST_CHECK(!exists("temporary"));
for (int i = 0; i < 10; ++i)
{
if (h.status().is_seeding) break;
std::this_thread::sleep_for(lt::milliseconds(100));
}
TEST_EQUAL(h.status().is_seeding, true);
// this should cause the file to be exported
h.file_priority(file_index_t{0}, lt::low_priority);
for (int i = 0; i < 10; ++i)
{
if (h.file_priority(file_index_t{0}) == lt::low_priority) break;
std::this_thread::sleep_for(lt::milliseconds(100));
}
TEST_CHECK(exists("temporary"));
}