Hi,
Yes! This last patch solved the problem, thanks.
Now I have another bug : sometimes, there is a file that never stops
hashing... It is in "checking hash" state, the percentage moves at
random, maybe like it is hashing several times at the same time, and
stays that way forever.
Just now I had the problem, and I noticed that it happened on a torrent
that is not in the "active torrents" directry, and should therefore stay
in "closed" state. Maybe it was added then removed before it had time to
hash, and this caused that bug?
Jari Sundell wrote:
Jerome Stolfo wrote:
FYI, I just tried to install the last release (build 726). I get the
same error again, while rtorrent is hashing the files at the
beginning, just after a hash is finished and another is going to begin.
When I posted the patch earlier, I missed the real problem. It thought
it was finished hashing while there were still chunks queued for
hashing. I tested this patch and it works for me.
Rakshasa
------------------------------------------------------------------------
Index: libtorrent/src/data/hash_torrent.cc
===================================================================
--- libtorrent/src/data/hash_torrent.cc (revision 726)
+++ libtorrent/src/data/hash_torrent.cc (working copy)
@@ -74,14 +74,16 @@
bool
HashTorrent::is_checked() {
- return !m_chunkList->empty() && m_position == m_chunkList->size();
+ // When closed the chunk list is empty. Position can be equal to
+ // chunk list for a short while as we have outstanding chunks, so
+ // check the latter.
+ return !m_chunkList->empty() && m_position == m_chunkList->size() &&
m_outstanding == -1;
}
void
HashTorrent::receive_chunkdone() {
if (m_outstanding == -1)
-// throw internal_error("HashTorrent::receive_chunkdone() m_outstanding <
0.");
- return;
+ throw internal_error("HashTorrent::receive_chunkdone() m_outstanding <
0.");
// m_signalChunk will always point to
// DownloadMain::receive_hash_done, so it will take care of cleanup.
@@ -126,6 +128,10 @@
// file that hasn't be created/resized. Which means we ignore it
// when doing initial hashing.
if (handle.error_number().is_valid()) {
+ // The rest of the outstanding chunks get ignored by
+ // DownloadWrapper::receive_hash_done.
+ clear();
+
m_slotInitialHash();
m_slotStorageError("Hash checker was unable to map chunk: " +
std::string(handle.error_number().c_str()));
_______________________________________________
Libtorrent-devel mailing list
[email protected]
http://rakshasa.no/mailman/listinfo/libtorrent-devel