fix: sometimes stuck magnet metadata transfer (#6364)

* fix: don't check `total_size` against `metadata_size_hint`

* refactor: remove `metadata_size_hint`

* refactor: restart metadata transfer from scratch on failing
This commit is contained in:
Yat Ho 2023-12-16 22:47:55 +08:00 committed by GitHub
parent 7f2e165c1e
commit 4b882b1bad
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 22 deletions

View File

@ -626,8 +626,6 @@ public:
EncryptionPreference encryption_preference = EncryptionPreference::Unknown;
int64_t metadata_size_hint = 0;
tr_torrent* const torrent;
std::shared_ptr<tr_peerIo> const io;
@ -1060,9 +1058,9 @@ void parseLtepHandshake(tr_peerMsgsImpl* msgs, MessageReader& payload)
}
/* look for metainfo size (BEP 9) */
if (tr_variantDictFindInt(&*var, TR_KEY_metadata_size, &i) && tr_torrentSetMetadataSizeHint(msgs->torrent, i))
if (tr_variantDictFindInt(&*var, TR_KEY_metadata_size, &i))
{
msgs->metadata_size_hint = i;
tr_torrentSetMetadataSizeHint(msgs->torrent, i);
}
/* look for upload_only (BEP 21) */
@ -1139,8 +1137,8 @@ void parseUtMetadata(tr_peerMsgsImpl* msgs, MessageReader& payload_in)
auto const* const benc_end = serde.end();
if (msg_type == MetadataMsgType::Data && total_size == msgs->metadata_size_hint && !msgs->torrent->has_metainfo() &&
msg_end - benc_end <= MetadataPieceSize && piece * MetadataPieceSize + (msg_end - benc_end) <= total_size)
if (msg_type == MetadataMsgType::Data && !msgs->torrent->has_metainfo() && msg_end - benc_end <= MetadataPieceSize &&
piece * MetadataPieceSize + (msg_end - benc_end) <= total_size)
{
size_t const piece_len = msg_end - benc_end;
tr_torrentSetMetadataPiece(msgs->torrent, piece, benc_end, piece_len);

View File

@ -263,27 +263,16 @@ void on_have_all_metainfo(tr_torrent* tor)
auto error = tr_error{};
auto& m = tor->incomplete_metadata;
TR_ASSERT(m);
if (use_new_metainfo(tor, &error))
{
m.reset();
}
else /* drat. */
{
auto const n = m->piece_count;
m->pieces_needed = create_all_needed(n);
if (!use_new_metainfo(tor, &error)) /* drat. */
{
auto msg = std::string_view{ error && !std::empty(error.message()) ? error.message() : "unknown error" };
tr_logAddWarnTor(
tor,
fmt::format(
tr_ngettext(
"Couldn't parse magnet metainfo: '{error}'. Redownloading {piece_count} piece",
"Couldn't parse magnet metainfo: '{error}'. Redownloading {piece_count} pieces",
n),
fmt::arg("error", msg),
fmt::arg("piece_count", n)));
fmt::format("Couldn't parse magnet metainfo: '{error}'. Redownloading metadata", fmt::arg("error", msg)));
}
m.reset();
}
} // namespace set_metadata_piece_helpers
} // namespace