Oops more testing was required....

Rogier Wolff R.E.Wolff at BitWizard.nl
Wed Jun 18 07:46:05 EST 2003


Oops. Missed one line in the last patch....

		Roger. 

-- 
** R.E.Wolff at BitWizard.nl ** http://www.BitWizard.nl/ ** +31-15-2600998 **
*-- BitWizard writes Linux device drivers for any device you may have! --*
* The Worlds Ecosystem is a stable system. Stable systems may experience *
* excursions from the stable situation. We are currently in such an      * 
* excursion: The stable situation does not include humans. ***************
-------------- next part --------------
diff -ur rsync-2.5.6.orig/io.c rsync-2.5.6/io.c
--- rsync-2.5.6.orig/io.c	Thu Apr 11 04:11:50 2002
+++ rsync-2.5.6/io.c	Tue Jun 17 23:43:49 2003
@@ -416,10 +416,19 @@
  * use a bit less bandwidth than specified, because it doesn't make up
  * for slow periods.  But arguably this is a feature.  In addition, we
  * ought to take the time used to write the data into account.
+ *
+ * During some phases of big transfers (file XXX is uptodate) this is
+ * called with a small bytes_written every time. As the kernel has to
+ * round small waits up to guarantee that we actually wait at least
+ * the requested number of microseconds, this can become grossly
+ * inaccurate. We therefore keep a cumulating number of microseconds
+ * to wait, and only actually perform the sleep when the rouding
+ * becomes insignificant. (less than 10%) -- REW.
  **/
 static void sleep_for_bwlimit(int bytes_written)
 {
 	struct timeval tv;
+	static int time_to_sleep = 0; 
 
 	if (!bwlimit)
 		return;
@@ -427,9 +436,13 @@
 	assert(bytes_written > 0);
 	assert(bwlimit > 0);
 	
-	tv.tv_usec = bytes_written * 1000 / bwlimit;
-	tv.tv_sec  = tv.tv_usec / 1000000;
-	tv.tv_usec = tv.tv_usec % 1000000;
+	time_to_sleep += bytes_written * 1000 / bwlimit; 
+
+	if (time_to_sleep < 100000) return;
+
+	tv.tv_sec  = time_to_sleep / 1000000;
+	tv.tv_usec = time_to_sleep % 1000000;
+	time_to_sleep = 0; 
 
 	select(0, NULL, NULL, NULL, &tv);
 }


More information about the rsync mailing list