# Craig Barratt <cbarratt@users.sourceforge.net>
#
# COPYRIGHT
-# Copyright (C) 2002-2003 Craig Barratt
+# Copyright (C) 2002-2007 Craig Barratt
#
#========================================================================
#
-# Version 3.0.0beta2, released 11 Nov 2006.
+# Version 3.2.0beta0, released 5 April 2009.
#
# See http://backuppc.sourceforge.net.
#
$defBlkSize, $fio->{checksumSeed},
0, $attr->{compress}, 0,
$fio->{protocol_version});
+ if ( $err ) {
+ $fio->log("Can't get rsync digests from $attr->{fullPath}"
+ . " (err=$err, name=$f->{name})");
+ $fio->{stats}{errorCnt}++;
+ return -1;
+ }
my($isCached, $isInvalid) = $d->isCached;
if ( $fio->{logLevel} >= 5 ) {
$fio->log("$attr->{fullPath} verify; cached = $isCached,"
my($fio, $f, $placeHolder) = @_;
my($dir, $file);
+ return if ( $placeHolder && $fio->{phase} > 0 );
+
if ( $f->{name} =~ m{(.*)/(.*)}s ) {
$file = $2;
$dir = "$fio->{shareM}/" . $1;
$file = $f->{name};
}
- if ( !defined($fio->{attribLastDir}) || $fio->{attribLastDir} ne $dir ) {
+ if ( $dir ne ""
+ && (!defined($fio->{attribLastDir}) || $fio->{attribLastDir} ne $dir) ) {
#
# Flush any directories that don't match the first part
- # of the new directory
+ # of the new directory. Don't flush the top-level directory
+ # (ie: $dir eq "") since the "." might get sorted in the middle
+ # of other top-level directories or files.
#
foreach my $d ( keys(%{$fio->{attrib}}) ) {
next if ( $d eq "" || "$dir/" =~ m{^\Q$d/} );
$fio->{attribLastDir} = $dir;
}
if ( !exists($fio->{attrib}{$dir}) ) {
+ $fio->log("attribSet: dir=$dir not found") if ( $fio->{logLevel} >= 4 );
$fio->{attrib}{$dir} = BackupPC::Attrib->new({
compress => $fio->{xfer}{compress},
});
- my $path = $fio->{outDir} . $dir;
- if ( -f $fio->{attrib}{$dir}->fileName($path)
- && !$fio->{attrib}{$dir}->read($path) ) {
- $fio->log(sprintf("Unable to read attribute file %s",
+ my $dirM = $dir;
+ $dirM = $1 . "/" . $fio->{bpc}->fileNameMangle($2)
+ if ( $dirM =~ m{(.*?)/(.*)}s );
+ my $path = $fio->{outDir} . $dirM;
+ if ( -f $fio->{attrib}{$dir}->fileName($path) ) {
+ if ( !$fio->{attrib}{$dir}->read($path) ) {
+ $fio->log(sprintf("Unable to read attribute file %s",
$fio->{attrib}{$dir}->fileName($path)));
+ } else {
+ $fio->log(sprintf("attribRead file %s",
+ $fio->{attrib}{$dir}->fileName($path)))
+ if ( $fio->{logLevel} >= 4 );
+ }
}
+ } else {
+ $fio->log("attribSet: dir=$dir exists") if ( $fio->{logLevel} >= 4 );
}
- $fio->log("attribSet(dir=$dir, file=$file)") if ( $fio->{logLevel} >= 4 );
+ $fio->log("attribSet(dir=$dir, file=$file, size=$f->{size}, placeholder=$placeHolder)")
+ if ( $fio->{logLevel} >= 4 );
my $mode = $f->{mode};
my($fio, $d) = @_;
my($poolWrite);
- #
- # Don't write attributes on 2nd phase - they're already
- # taken care of during the first phase.
- #
- return if ( $fio->{phase} > 0 );
if ( !defined($d) ) {
#
# flush all entries (in reverse order)
return;
}
return if ( !defined($fio->{attrib}{$d}) );
+
#
# Set deleted files in the attributes. Any file in the view
# that doesn't have attributes is flagged as deleted for
}) if ( $fio->{logLevel} >= 2
&& $a->{type} == BPC_FTYPE_FILE );
}
- } elsif ( !$fio->{full} ) {
+ } elsif ( $fio->{phase} == 0 && !$fio->{full} ) {
##print("Delete file $f\n");
$fio->logFileAction("delete", {
%{$fio->{viewCache}{$d}{$f}},
}
}
}
- if ( $fio->{attrib}{$d}->fileCount ) {
+ if ( $fio->{attrib}{$d}->fileCount || $fio->{phase} > 0 ) {
my $data = $fio->{attrib}{$d}->writeData;
my $dirM = $d;
my($exists, $digest, $outSize, $errs) = $poolWrite->close;
$fileName =~ s{^/+}{};
- $fio->log(@$errs) if ( defined($errs) && @$errs );
+ if ( defined($errs) && @$errs ) {
+ $fio->log(@$errs);
+ $fio->{stats}{errorCnt} += @$errs;
+ }
if ( $doStats ) {
$fio->{stats}{TotalFileCnt}++;
$fio->{stats}{TotalFileSize} += $origSize;
$fio->logFileAction("create", $f) if ( $fio->{logLevel} >= 1 );
$fio->log("makePath($path, 0777)") if ( $fio->{logLevel} >= 5 );
$path = $1 if ( $path =~ /(.*)/s );
- File::Path::mkpath($path, 0, 0777) if ( !-d $path );
+ eval { File::Path::mkpath($path, 0, 0777) } if ( !-d $path );
return $fio->attribSet($f) if ( -d $path );
$fio->log("Can't create directory $path");
$fio->{stats}{errorCnt}++;
if ( $phase > 0 ) {
$fio->log("$name: fatal error: md4 doesn't match on retry;"
. " file removed");
+ $fio->{stats}{errorCnt}++;
} else {
$fio->log("$name: md4 doesn't match: will retry in phase 1;"
. " file removed");
}
- $fio->{stats}{errorCnt}++;
if ( defined($fio->{rxOutFd}) ) {
$fio->{rxOutFd}->close;
unlink($fio->{rxOutFile});