e000aa4
From 386db86fe865fb552b1867af4bf4b78dbf9080cf Mon Sep 17 00:00:00 2001
8d113be
From: Martin Sehnoutka <msehnout@redhat.com>
e000aa4
Date: Thu, 17 Nov 2016 12:44:26 +0100
Ondřej Lysoněk 7c0626d
Subject: [PATCH 25/59] Improve local_max_rate option.
8d113be
e000aa4
Now it should work as expected.
8d113be
---
8d113be
 ftpdataio.c | 14 +++++++-------
8d113be
 main.c      |  2 +-
8d113be
 session.h   |  3 ++-
8d113be
 3 files changed, 10 insertions(+), 9 deletions(-)
8d113be
8d113be
diff --git a/ftpdataio.c b/ftpdataio.c
8d113be
index 3e4e9c9..00f9021 100644
8d113be
--- a/ftpdataio.c
8d113be
+++ b/ftpdataio.c
8d113be
@@ -249,7 +249,7 @@ handle_io(int retval, int fd, void* p_private)
8d113be
 {
8d113be
   long curr_sec;
8d113be
   long curr_usec;
8d113be
-  unsigned int bw_rate;
8d113be
+  unsigned long bw_rate;
8d113be
   double elapsed;
8d113be
   double pause_time;
8d113be
   double rate_ratio;
8d113be
@@ -276,19 +276,16 @@ handle_io(int retval, int fd, void* p_private)
8d113be
   {
8d113be
     elapsed = (double) 0.01;
8d113be
   }
8d113be
-  bw_rate = (unsigned int) ((double) retval / elapsed);
8d113be
-  if (bw_rate <= p_sess->bw_rate_max)
8d113be
+  p_sess->bw_retval += retval;
8d113be
+  bw_rate = (unsigned long) ((double) p_sess->bw_retval / elapsed);
8d113be
+  if (bw_rate <= p_sess->bw_rate_max || p_sess->bw_retval < (unsigned long)(10*retval))
8d113be
   {
8d113be
-    p_sess->bw_send_start_sec = curr_sec;
8d113be
-    p_sess->bw_send_start_usec = curr_usec;
8d113be
     return;
8d113be
   }
8d113be
   /* Tut! Rate exceeded, calculate a pause to bring things back into line */
8d113be
   rate_ratio = (double) bw_rate / (double) p_sess->bw_rate_max;
8d113be
   pause_time = (rate_ratio - (double) 1) * elapsed;
8d113be
   vsf_sysutil_sleep(pause_time);
8d113be
-  p_sess->bw_send_start_sec = vsf_sysutil_get_time_sec();
8d113be
-  p_sess->bw_send_start_usec = vsf_sysutil_get_time_usec();
8d113be
 }
8d113be
 
8d113be
 int
8d113be
@@ -441,6 +438,9 @@ struct vsf_transfer_ret
8d113be
 vsf_ftpdataio_transfer_file(struct vsf_session* p_sess, int remote_fd,
8d113be
                             int file_fd, int is_recv, int is_ascii)
8d113be
 {
8d113be
+  p_sess->bw_send_start_sec = vsf_sysutil_get_time_sec();
8d113be
+  p_sess->bw_send_start_usec = vsf_sysutil_get_time_usec();
8d113be
+  p_sess->bw_retval = 0;
8d113be
   if (!is_recv)
8d113be
   {
8d113be
     if (is_ascii || p_sess->data_use_ssl)
8d113be
diff --git a/main.c b/main.c
8d113be
index eaba265..f1e2f69 100644
8d113be
--- a/main.c
8d113be
+++ b/main.c
63f4fa0
@@ -40,7 +40,7 @@
8d113be
     /* Control connection */
63f4fa0
     0, 0, 0, 0, 0, 0,
8d113be
     /* Data connection */
8d113be
-    -1, 0, -1, 0, 0, 0, 0,
8d113be
+    -1, 0, -1, 0, 0, 0, 0, 0,
8d113be
     /* Login */
8d113be
     1, 0, INIT_MYSTR, INIT_MYSTR,
8d113be
     /* Protocol state */
8d113be
diff --git a/session.h b/session.h
8d113be
index 956bfb7..3e8fdd5 100644
8d113be
--- a/session.h
8d113be
+++ b/session.h
8d113be
@@ -29,9 +29,10 @@ struct vsf_session
8d113be
   struct vsf_sysutil_sockaddr* p_port_sockaddr;
8d113be
   int data_fd;
8d113be
   int data_progress;
8d113be
-  unsigned int bw_rate_max;
8d113be
+  unsigned long bw_rate_max;
8d113be
   long bw_send_start_sec;
8d113be
   long bw_send_start_usec;
8d113be
+  unsigned long bw_retval;
8d113be
 
8d113be
   /* Details of the login */
8d113be
   int is_anonymous;
8d113be
-- 
Ondřej Lysoněk 7c0626d
2.14.4
8d113be