mirror of
https://github.com/transmission/transmission
synced 2025-03-08 21:04:25 +00:00
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:
parent
7f2e165c1e
commit
4b882b1bad
2 changed files with 9 additions and 22 deletions
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Add table
Reference in a new issue