diff -U2 -r /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/Torrents.cpp /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/Torrents.cpp --- /var/lib/copr-rpmbuild/results/i2pd-git/upstream-unpacked/Source0/i2pd-openssl/libi2pd_client/Torrents.cpp 2026-09-07 01:13:48.000000000 +0000 +++ /var/lib/copr-rpmbuild/results/i2pd-git/srpm-unpacked/i2pd-openssl.tar.gz-extract/i2pd-openssl/libi2pd_client/Torrents.cpp 2026-09-07 00:49:15.000000000 +0000 @@ -686,27 +686,23 @@ } // try another piece if not current piece or no more blocks in current piece - using PieceNumPeers = std::tuple; // (index, num peers, random value) - std::set > - sortedByNumPeers ([](const PieceNumPeers& p1, const PieceNumPeers& p2)->bool + std::set, std::function&, const std::pair&)> > + sortedByNumPeers ([](const std::pair& p1, const std::pair& p2)->bool { - if (std::get<1>(p1) != std::get<1>(p2)) return std::get<1>(p1) < std::get<1>(p2); - if (std::get<2>(p1) != std::get<2>(p2)) return std::get<2>(p1) < std::get<2>(p2); - return std::get<0>(p1) < std::get<0>(p2); + if (p1.second != p2.second) return p1.second < p2.second; + return p1.first < p2.first; }); // sort eligible pieces by num peers - std::mt19937 rng (i2p::util::GetRngSeed ()); uint32_t ind = 0; for (auto& it: m_Pieces) { if (!it.IsComplete () && conn->IsPieceAvailable (ind) && (!skipRequested || !it.IsRequested ())) - sortedByNumPeers.emplace (ind, it.GetNumPeers (), rng ()); + sortedByNumPeers.emplace (ind, it.GetNumPeers ()); ind++; } for (const auto& it: sortedByNumPeers) { - uint32_t ind = std::get<0>(it); - auto [offset, len] = m_Pieces[ind].GetNextBlockToRequest (); + auto [offset, len] = m_Pieces[it.first].GetNextBlockToRequest (); if (len > 0) - return { ind, offset, len }; + return { it.first, offset, len }; } }