From 4b882b1bad9560985075273ec2900d7c22bcc77d Mon Sep 17 00:00:00 2001 From: Yat Ho Date: Sat, 16 Dec 2023 22:47:55 +0800 Subject: [PATCH] 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 --- libtransmission/peer-msgs.cc | 10 ++++------ libtransmission/torrent-magnet.cc | 21 +++++---------------- 2 files changed, 9 insertions(+), 22 deletions(-) diff --git a/libtransmission/peer-msgs.cc b/libtransmission/peer-msgs.cc index a7d1f44dc..bba95c46a 100644 --- a/libtransmission/peer-msgs.cc +++ b/libtransmission/peer-msgs.cc @@ -626,8 +626,6 @@ public: EncryptionPreference encryption_preference = EncryptionPreference::Unknown; - int64_t metadata_size_hint = 0; - tr_torrent* const torrent; std::shared_ptr 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); diff --git a/libtransmission/torrent-magnet.cc b/libtransmission/torrent-magnet.cc index 73318895b..bcf768bb9 100644 --- a/libtransmission/torrent-magnet.cc +++ b/libtransmission/torrent-magnet.cc @@ -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