On Fri, Apr 16, 2010 at 08:19:27PM +0400, Alexander V. Lukyanov wrote:
> The reason is that retries variable is reset to 0 when some work is done.
> In this case lftp assumes that if it uploaded some data to the server then
> some work is done, but this assumption is incorrect.

Could you try this patch, please?

--
   Alexander.
Index: FileCopy.cc
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileCopy.cc,v
retrieving revision 1.155
diff -u -p -r1.155 FileCopy.cc
--- FileCopy.cc 21 Jan 2010 08:22:26 -0000      1.155
+++ FileCopy.cc 16 Apr 2010 16:39:15 -0000
@@ -848,6 +848,11 @@ int FileCopyPeerFA::Do()
               {
                  try_time=session->GetTryTime();
                  retries=session->GetRetries();
+                 off_t pos=session->GetRealPos();
+                 if(upload_watermark<pos) {
+                    upload_watermark=pos;
+                    retries=-1;
+                 }
                  Log::global->Format(10,"try_time=%ld, 
retries=%d\n",(long)try_time,retries);
                  session->Close();
                  if(can_seek && seek_pos>0)
@@ -982,9 +987,9 @@ void FileCopyPeerFA::OpenSession()
    session->SetLimit(range_limit);
    if(mode==PUT)
    {
-      if(try_time!=0)
+      if(try_time!=NO_DATE)
         session->SetTryTime(try_time);
-      if(retries!=0)
+      if(retries>=0)
         session->SetRetries(retries+1);
       if(e_size!=NO_SIZE && e_size!=NO_SIZE_YET)
         session->SetSize(e_size);
@@ -1105,8 +1110,8 @@ int FileCopyPeerFA::Get_LL(int len)
            size=NO_SIZE_YET;
            date=NO_DATE_YET;
 
-           try_time=0;
-           retries=0;
+           try_time=NO_DATE;
+           retries=-1;
            current->Timeout(0); // retry with new location.
            return 0;
         }
@@ -1145,6 +1150,11 @@ int FileCopyPeerFA::Put_LL(const char *b
       {
         try_time=session->GetTryTime();
         retries=session->GetRetries();
+        off_t pos=session->GetRealPos();
+        if(upload_watermark<pos) {
+           upload_watermark=pos;
+           retries=-1;
+        }
         Log::global->Format(10,"try_time=%ld, 
retries=%d\n",(long)try_time,retries);
         session->Close();
         if(can_seek && seek_pos>0)
@@ -1198,8 +1208,9 @@ off_t FileCopyPeerFA::GetRealPos()
 void FileCopyPeerFA::Init()
 {
    fxp=false;
-   try_time=0;
-   retries=0;
+   try_time=NO_DATE;
+   retries=-1;
+   upload_watermark=0;
    redirections=0;
    can_seek=true;
    can_seek0=true;
Index: FileCopy.h
===================================================================
RCS file: /home/lav/cvsroot/lftp/src/FileCopy.h,v
retrieving revision 1.82
diff -u -p -r1.82 FileCopy.h
--- FileCopy.h  3 Mar 2009 07:31:48 -0000       1.82
+++ FileCopy.h  16 Apr 2010 16:38:47 -0000
@@ -295,6 +295,7 @@ class FileCopyPeerFA : public FileCopyPe
 
    time_t try_time;
    int retries;
+   off_t upload_watermark;
 
    int redirections;
 

Reply via email to