Bug 146997

Summary: Data lost when changing the download directory
Product: [Applications] ktorrent Reporter: Henri Hesse <henri.hesse>
Component: generalAssignee: Joris Guisson <joris.guisson>
Status: RESOLVED FIXED    
Severity: normal    
Priority: NOR    
Version: unspecified   
Target Milestone: ---   
Platform: Ubuntu   
OS: Linux   
Latest Commit: Version Fixed In:

Description Henri Hesse 2007-06-20 13:58:47 UTC
Version:           2.2rc1 (using KDE KDE 3.5.7)
Installed from:    Ubuntu Packages
OS:                Linux

When changing the download place for a torrent and downloading it at the same time, ktorrent starts to copy the old files to the new directory as it should, but as the download process is still going on it shows the error message of lost data (wether I want download the data again or ignore the problem)

The quick solution is to stop/pause the download and start it again when the transfer of the uncomplete data is done, but it might be nice if the was an automatic system for the dum guys like me how doesn't think before they do something :-)

Heres a screenshot of the situation: http://metalguru.fi/valokuva2.png
Comment 1 Joris Guisson 2007-06-20 18:31:22 UTC
Is this torrent controlled by the QM ?
Comment 2 Henri Hesse 2007-06-20 23:42:45 UTC
Yes, it was... and I tested to do the same thing to a torrent that is user controlled and discovered that torrent automatically stops untill the transfer is complete :-) So the problem obviously has something to do with the QM.
Comment 3 Joris Guisson 2007-06-21 12:38:35 UTC
We stop the torrent, but the QM starts it again.
Comment 4 Joris Guisson 2007-06-22 18:30:23 UTC
SVN commit 678949 by guisson:

Make sure QM cannot start torrents which are currently moving their data files.

BUG: 146997



 M  +3 -0      interfaces/torrentinterface.h  
 M  +1 -1      torrent/queuemanager.cpp  
 M  +9 -2      torrent/torrentcontrol.cpp  
 M  +4 -2      torrent/torrentcontrol.h  


--- branches/extragear/kde3/network/ktorrent/libktorrent/interfaces/torrentinterface.h #678948:678949
@@ -428,6 +428,9 @@
 		
 		/// Check if there is enough diskspace available for this torrent
 		virtual bool checkDiskSpace(bool emit_sig = true) = 0;
+		
+		/// Are we in the process of moving files
+		virtual bool isMovingFiles() const = 0;
 	signals:
 		/**
 		 * Emited when we have finished downloading.
--- branches/extragear/kde3/network/ktorrent/libktorrent/torrent/queuemanager.cpp #678948:678949
@@ -474,7 +474,7 @@
 						++user_seeding;
 				}
 
-				if (!s.user_controlled)
+				if (!s.user_controlled && !tc->isMovingFiles())
 				{
 					if (s.completed)
 						seed_queue.append(tc);
--- branches/extragear/kde3/network/ktorrent/libktorrent/torrent/torrentcontrol.cpp #678948:678949
@@ -117,6 +117,7 @@
 		// by default no torrent limits
 		upload_gid = download_gid = 0;
 		upload_limit = download_limit = 0;
+		moving_files = false;
 	}
 
 
@@ -142,7 +143,7 @@
 	void TorrentControl::update()
 	{
 		UpdateCurrentTime();
-		if (stats.status == kt::CHECKING_DATA)
+		if (stats.status == kt::CHECKING_DATA || moving_files)
 			return;
 		
 		if (istats.io_error)
@@ -322,7 +323,7 @@
 	void TorrentControl::start()
 	{	
 		// do not start running torrents
-		if (stats.running || stats.status == kt::ALLOCATING_DISKSPACE)
+		if (stats.running || stats.status == kt::ALLOCATING_DISKSPACE || moving_files)
 			return;
 
 		stats.stopped_by_error = false;
@@ -817,6 +818,7 @@
 		Out(SYS_GEN|LOG_NOTICE) << "Moving data for torrent " << stats.torrent_name << " to " << new_dir << endl;
 		
 		bool start = false;
+		int old_prio = getPriority();
 		
 		//check if torrent is running and stop it before moving data
 		if(stats.running)
@@ -825,6 +827,7 @@
 			this->stop(false);
 		}
 		
+		moving_files = true;
 		try
 		{
 			QString nd;
@@ -858,11 +861,15 @@
 		catch (Error& err)
 		{			
 			Out(SYS_GEN|LOG_IMPORTANT) << "Could not move " << stats.output_path << " to " << new_dir << ". Exception: " << err.toString() << endl;
+			moving_files = false;
 			return false;
 		}
 		
+		moving_files = false;
 		if(start)
+		{
 			this->start();
+		}
 		
 		return true;
 	}
--- branches/extragear/kde3/network/ktorrent/libktorrent/torrent/torrentcontrol.h #678948:678949
@@ -260,6 +260,9 @@
 		///Get the PeerManager
 		const PeerManager * getPeerMgr() const;
 		
+		/// Are we in the process of moving files
+		bool isMovingFiles() const {return moving_files;}
+		
 	public slots:
 		/**
 		 * Update the object, should be called periodically.
@@ -344,10 +347,9 @@
 		
 		bool prealloc;
 		PreallocationThread* prealoc_thread;
-		
 		DataCheckerThread* dcheck_thread;
-		
 		TimeStamp last_diskspace_check;
+		bool moving_files;
 		
 		struct InternalStats
 		{