Bug 132066 - when importing torrent and start seeding (without first downloading some chunks)-> event=completed
Summary: when importing torrent and start seeding (without first downloading some chun...
Status: RESOLVED FIXED
Alias: None
Product: ktorrent
Classification: Applications
Component: general (other bugs)
Version First Reported In: unspecified
Platform: Ubuntu Linux
: NOR normal
Target Milestone: ---
Assignee: Joris Guisson
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2006-08-08 16:49 UTC by Martijn van Vliet
Modified: 2006-09-16 12:48 UTC (History)
0 users

See Also:
Latest Commit:
Version Fixed In:
Sentry Crash Report:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Martijn van Vliet 2006-08-08 16:49:00 UTC
Version:           svn (using KDE KDE 3.5.4)
Installed from:    Ubuntu Packages
OS:                Linux

In above situation there should be no event=completed but there should be just
event=started and left=0
(or event=started and left=something when hashes will fail)
Comment 1 Martijn van Vliet 2006-08-08 17:14:12 UTC
Above is when opening a torrent and you point a location where it already find the right files.

Starting download
Pre-allocating diskspace
Preallocating file /home/Martijn/.kde/share/apps/ktorrent/tor17/cache (3657142272 bytes)
file_size = 3657142272
PreallocationThread has finished
Doing tracker request to url : http://torrent.ubuntu.com:6969/announce?peer_id=-KT20DV-442558556447&port=48153&uploaded=0&downloaded=0&left=0&compact=1&numwant=100&key=1305821864&event=started&info_hash=%adS%c9%24%e2N%a8%b2%2c%7f%a4%feb%0fGuN%20%110
Doing tracker request to url : http://torrent.ubuntu.com:6969/announce?peer_id=-KT20DV-442558556447&port=48153&uploaded=0&downloaded=0&left=0&compact=1&numwant=100&key=1305821864&event=completed&info_hash=%adS%c9%24%e2N%a8%b2%2c%7f%a4%feb%0fGuN%20%110
Torrent moved to SeedView.

The import plugin handles this the correct way with only event=started and left=0.
Comment 2 Joris Guisson 2006-08-08 19:32:05 UTC
You are correct, allthough I'm not quite sure, if this is against the protocol.
Comment 3 Martijn van Vliet 2006-08-08 22:00:15 UTC
I think it implies we did 0 -> 100% without any seeders in less than one second. This is not true off course.
The trackers also counts this as way of event as one snatch. (this was why i noticed in the first place)

I wasn't sure mself so i asked on #bittorrent before reporting, and another guy said it should be event=started.
Comment 4 Joris Guisson 2006-08-09 18:51:15 UTC
We will make sure the completed does not happen.
Comment 5 Joris Guisson 2006-09-16 12:48:25 UTC
SVN commit 585108 by guisson:

Changes :
- Only send completed to tracker when we have all chunks
- When auto importing do not send completed when downloaded data is fully there

BUG: 132066



 M  +15 -15    ktorrent.kdevelop  
 M  +12 -0     libktorrent/torrent/chunkmanager.cpp  
 M  +7 -0      libktorrent/torrent/chunkmanager.h  
 M  +5 -1      libktorrent/torrent/torrentcontrol.cpp  


--- trunk/extragear/network/ktorrent/ktorrent.kdevelop #585107:585108
@@ -14,7 +14,7 @@
     </keywords>
     <projectdirectory>.</projectdirectory>
     <absoluteprojectpath>false</absoluteprojectpath>
-    <description/>
+    <description></description>
     <ignoreparts/>
     <versioncontrol>kdevsubversion</versioncontrol>
   </general>
@@ -69,14 +69,14 @@
         <f77compiler>kdevg77options</f77compiler>
         <cxxflags>-O0 -g3</cxxflags>
         <envvars/>
-        <topsourcedir/>
-        <cppflags/>
-        <ldflags/>
-        <ccompilerbinary/>
-        <cxxcompilerbinary/>
-        <f77compilerbinary/>
-        <cflags/>
-        <f77flags/>
+        <topsourcedir></topsourcedir>
+        <cppflags></cppflags>
+        <ldflags></ldflags>
+        <ccompilerbinary></ccompilerbinary>
+        <cxxcompilerbinary></cxxcompilerbinary>
+        <f77compilerbinary></f77compilerbinary>
+        <cflags></cflags>
+        <f77flags></f77flags>
       </debug>
     </configurations>
     <subclassing>
@@ -150,14 +150,14 @@
     <general>
       <dbgshell>libtool</dbgshell>
       <programargs>--nofork --debug</programargs>
-      <gdbpath/>
+      <gdbpath></gdbpath>
       <breakonloadinglibs>true</breakonloadinglibs>
       <separatetty>false</separatetty>
       <floatingtoolbar>false</floatingtoolbar>
       <runappinappdirectory>true</runappinappdirectory>
-      <configGdbScript/>
-      <runShellScript/>
-      <runGdbScript/>
+      <configGdbScript></configGdbScript>
+      <runShellScript></runShellScript>
+      <runGdbScript></runGdbScript>
     </general>
     <display>
       <staticmembers>false</staticmembers>
@@ -232,7 +232,7 @@
       <headerCompletionDelay>250</headerCompletionDelay>
     </codecompletion>
     <creategettersetter>
-      <prefixGet/>
+      <prefixGet></prefixGet>
       <prefixSet>set</prefixSet>
       <prefixVariable>m_,_</prefixVariable>
       <parameterName>theValue</parameterName>
@@ -245,7 +245,7 @@
     <qt>
       <used>true</used>
       <version>3</version>
-      <root/>
+      <root></root>
     </qt>
   </kdevcppsupport>
   <kdevvisualadvance>
--- trunk/extragear/network/ktorrent/libktorrent/torrent/chunkmanager.cpp #585107:585108
@@ -410,6 +410,18 @@
 		recalc_chunks_left = false;
 		return num;
 	}
+	
+	bool ChunkManager::haveAllChunks() const
+	{
+		Uint32 tot = chunks.size();
+		for (Uint32 i = 0;i < tot;i++)
+		{
+			const Chunk* c = chunks[i];
+			if (!bitset.get(i))
+				return false;
+		}
+		return true;
+	}
 
 	Uint64 ChunkManager::bytesExcluded() const
 	{
--- trunk/extragear/network/ktorrent/libktorrent/torrent/chunkmanager.h #585107:585108
@@ -190,6 +190,13 @@
 		 * @return The number of chunks to download
 		 */
 		Uint32 chunksLeft() const;
+		
+		/**
+		 * Check if we have all chunks, this is not the same as
+		 * chunksLeft() == 0, it does not look at excluded chunks.
+		 * @return true if all chunks have been downloaded
+		 */
+		bool haveAllChunks() const;
 
 		/**
 		 * Get the number of chunks which have been excluded.
--- trunk/extragear/network/ktorrent/libktorrent/torrent/torrentcontrol.cpp #585107:585108
@@ -176,7 +176,9 @@
 			if (stats.completed && !comp)
 			{
 				// download has just been completed
-				psman->completed();
+				// only sent completed to tracker when we have all chunks (so no excluded chunks)
+				if (cman->haveAllChunks())
+					psman->completed();
 				pman->killSeeders();
 				QDateTime now = QDateTime::currentDateTime();
 				running_time_dl += time_started_dl.secsTo(now);
@@ -1178,6 +1180,8 @@
 			{
 				down->recalcDownloaded();
 				stats.imported_bytes = down->bytesDownloaded();
+				if (cman->haveAllChunks())
+					stats.completed = true;
 			}
 		}
 		delete dc;