- changed required File::RsyncP version to 0.50.
[BackupPC.git] / lib / BackupPC / Xfer / RsyncFileIO.pm
index 2fa3d27..3a0e826 100644 (file)
@@ -12,7 +12,7 @@
 #
 #========================================================================
 #
-# Version 2.1.0_CVS, released 8 Feb 2004.
+# Version 2.1.0_CVS, released 13 Mar 2004.
 #
 # See http://backuppc.sourceforge.net.
 #
@@ -24,9 +24,8 @@ use strict;
 use File::Path;
 use BackupPC::Attrib qw(:all);
 use BackupPC::View;
-use BackupPC::RsyncDigest;
+use BackupPC::Xfer::RsyncDigest;
 use BackupPC::PoolWrite;
-use Data::Dumper;
 
 use constant S_IFMT       => 0170000;  # type of file
 use constant S_IFDIR      => 0040000;  # directory
@@ -112,9 +111,9 @@ sub csumStart
     $fio->csumEnd if ( defined($fio->{csum}) );
     return -1 if ( $attr->{type} != BPC_FTYPE_FILE );
     (my $err, $fio->{csum}, my $blkSize)
-         = BackupPC::RsyncDigest->digestStart($attr->{fullPath}, $attr->{size},
-                         0, $defBlkSize, $fio->{checksumSeed}, $needMD4,
-                         $attr->{compress}, 1);
+         = BackupPC::Xfer::RsyncDigest->digestStart($attr->{fullPath},
+                        $attr->{size}, 0, $defBlkSize, $fio->{checksumSeed},
+                        $needMD4, $attr->{compress}, 1);
     if ( $err ) {
         $fio->log("Can't get rsync digests from $attr->{fullPath}"
                 . " (err=$err, name=$f->{name})");
@@ -191,6 +190,10 @@ sub checksumSeed
     my($fio, $checksumSeed) = @_;
 
     $fio->{checksumSeed} = $checksumSeed;
+    $fio->log("Checksum caching enabled (checksumSeed = $checksumSeed)")
+                   if ( $fio->{logLevel} >= 1 && $checksumSeed == 32761 );
+    $fio->log("Checksum seed is $checksumSeed")
+                   if ( $fio->{logLevel} >= 2 && $checksumSeed != 32761 );
 }
 
 sub dirs
@@ -639,6 +642,10 @@ sub attrSkippedFile
     $fio->{rxLocalAttr} = $attr;
     $fio->{rxFile} = $f;
     $fio->{rxSize} = $attr->{size};
+    delete($fio->{rxInFd});
+    delete($fio->{rxOutFd});
+    delete($fio->{rxDigest});
+    delete($fio->{rxInData});
     return $fio->fileDeltaRxDone();
 }
 
@@ -870,6 +877,7 @@ sub fileDeltaRxDone
 {
     my($fio, $md4) = @_;
     my $name = $1 if ( $fio->{rxFile}{name} =~ /(.*)/ );
+    my $ret;
 
     close($fio->{rxInFd})  if ( defined($fio->{rxInFd}) );
     unlink("$fio->{outDirSh}RStmp") if  ( -f "$fio->{outDirSh}RStmp" );
@@ -891,7 +899,7 @@ sub fileDeltaRxDone
                 # fetch the md4 file digest, not the block digests.
                 #
                 my($err, $csum, $blkSize)
-                         = BackupPC::RsyncDigest->digestStart(
+                         = BackupPC::Xfer::RsyncDigest->digestStart(
                                  $attr->{fullPath}, $attr->{size},
                                  0, 2048, $fio->{checksumSeed}, 1,
                                  $attr->{compress});
@@ -927,6 +935,8 @@ sub fileDeltaRxDone
                 $fio->{rxOutFd}->close;
                 unlink($fio->{rxOutFile});
             }
+            delete($fio->{rxFile});
+           delete($fio->{rxOutFile});
             return 1;
         }
     }
@@ -968,32 +978,34 @@ sub fileDeltaRxDone
             if ( !link($attr->{fullPath}, $rxOutFile) ) {
                 $fio->log("Unable to link $attr->{fullPath} to $rxOutFile");
                $fio->{stats}{errorCnt}++;
-                return -1;
-            }
-           #
-           # Cumulate the stats
-           #
-           $fio->{stats}{TotalFileCnt}++;
-           $fio->{stats}{TotalFileSize} += $fio->{rxSize};
-           $fio->{stats}{ExistFileCnt}++;
-           $fio->{stats}{ExistFileSize} += $fio->{rxSize};
-           $fio->{stats}{ExistFileCompSize} += -s $rxOutFile;
-           $fio->{rxFile}{size} = $fio->{rxSize};
-           return $fio->attribSet($fio->{rxFile});
+               $ret = -1;
+            } else {
+               #
+               # Cumulate the stats
+               #
+               $fio->{stats}{TotalFileCnt}++;
+               $fio->{stats}{TotalFileSize} += $fio->{rxSize};
+               $fio->{stats}{ExistFileCnt}++;
+               $fio->{stats}{ExistFileSize} += $fio->{rxSize};
+               $fio->{stats}{ExistFileCompSize} += -s $rxOutFile;
+               $fio->{rxFile}{size} = $fio->{rxSize};
+               $ret = $fio->attribSet($fio->{rxFile});
+           }
         }
-    }
-    if ( defined($fio->{rxOutFd}) ) {
+    } else {
        my $exist = $fio->processClose($fio->{rxOutFd},
                                       $fio->{rxOutFileRel},
                                       $fio->{rxSize}, 1);
        $fio->logFileAction($exist ? "pool" : "create", $fio->{rxFile})
                            if ( $fio->{logLevel} >= 1 );
        $fio->{rxFile}{size} = $fio->{rxSize};
-       return $fio->attribSet($fio->{rxFile});
+       $ret = $fio->attribSet($fio->{rxFile});
     }
     delete($fio->{rxDigest});
     delete($fio->{rxInData});
-    return;
+    delete($fio->{rxFile});
+    delete($fio->{rxOutFile});
+    return $ret;
 }
 
 #
@@ -1093,10 +1105,22 @@ sub finish
 {
     my($fio, $isChild) = @_;
 
+    #
+    # If we are aborting early, remove the last file since
+    # it was not complete
+    #
+    if ( $isChild && defined($fio->{rxFile}) ) {
+       unlink("$fio->{outDirSh}RStmp") if  ( -f "$fio->{outDirSh}RStmp" );
+       if ( defined($fio->{rxFile}) ) {
+           unlink($fio->{rxOutFile});
+           $fio->log("finish: removing in-process file $fio->{rxFile}{name}");
+       }
+    }
+
     #
     # Flush the attributes if this is the child
     #
-    $fio->attribWrite(undef);
+    $fio->attribWrite(undef) if ( $isChild );
 }
 
 #sub is_tainted