Subject: | Rsync push to a remote rsync share hang on a file |
Hi,
File::RsyncP hang when I try to sync for the second time (and other next
runs) a directory to a remote rsync server. This appears only for a
specific file (can be sent privatly by email).
For first transfert, src_path as the problematic file, target_path is
empty, the copy works.
When I run the transfert again, it hangs every time at 58800kbytes (the
file is 58973kbytes long).
Doing the same with rsync as the client and same file/options works.
I tried to debug this but was not able to understand the problem except
that it seems to comes from File::RsyncP.
Versions:
========
client: File::RsyncP 0.68, OS Debian Lenny 64bit
server: rsync 3.0.3, OS Debian Lenny 32 bit
The server rsync configuration:
==============================
[backup]
uid = root
gid = root
path = /
auth users = backup
secrets file = /etc/rsyncd.secrets
read only = false
hosts allow = x.x.x.x
The client script that trigger this problem:
===========================================
use File::RsyncP;
# TargetPath contains utf8 chars
use utf8;
my $rs = File::RsyncP->new({
rsyncCmd => "/usr/bin/rsync",
rsyncArgs => [
'--numeric-ids',
'--perms',
'--owner',
'--group',
'-D',
'--links',
'--hard-links',
'--times',
'--block-size=2048',
'--relative',
'--ignore-times',
'--recursive',
'--checksum-seed=32761',
],
});
$rs->serverConnect('server', '873');
$rs->serverService('backup', 'backup', 'xxxxxxx', 0);
$rs->serverStart(0, '/target_path');
$rs->go('/src_path');
$rs->serverClose;
perl -d:
=======
[...]
File::RsyncP::getChunk(/usr/lib/perl5/File/RsyncP.pm:1387):
1387: while ( length($rs->{chunkData}) < $len ) {
File::RsyncP::fileCsumReceive(/usr/lib/perl5/File/RsyncP.pm:1036):
1036: $fileNum = unpack("V", $rs->{chunkData});
File::RsyncP::fileCsumReceive(/usr/lib/perl5/File/RsyncP.pm:1037):
1037: $rs->{chunkData} = substr($rs->{chunkData}, 4);
File::RsyncP::fileCsumReceive(/usr/lib/perl5/File/RsyncP.pm:1038):
1038: if ( $fileNum == 0xffffffff ) {
File::RsyncP::fileCsumReceive(/usr/lib/perl5/File/RsyncP.pm:1043):
1043: my $f = $rs->{fileList}->get($fileNum);
File::RsyncP::fileCsumReceive(/usr/lib/perl5/File/RsyncP.pm:1044):
1044: next if ( !defined($f) );
File::RsyncP::fileCsumReceive(/usr/lib/perl5/File/RsyncP.pm:1035):
1035: return -1 if ( $rs->getChunk(4) < 0 );
File::RsyncP::getChunk(/usr/lib/perl5/File/RsyncP.pm:1384):
1384: my($rs, $len) = @_;
File::RsyncP::getChunk(/usr/lib/perl5/File/RsyncP.pm:1386):
1386: $len ||= 1;
File::RsyncP::getChunk(/usr/lib/perl5/File/RsyncP.pm:1387):
1387: while ( length($rs->{chunkData}) < $len ) {
File::RsyncP::getChunk(/usr/lib/perl5/File/RsyncP.pm:1388):
1388: return -1 if ( $rs->getData(4) < 0 );
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1352):
1352: my($rs, $len) = @_;
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1353):
1353: my($data);
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1355):
1355: return -1 if ( $rs->{abort} );
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1356):
1356: alarm($rs->{timeout}) if ( $rs->{timeout} );
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1357):
1357: while ( length($rs->{readData}) < $len ) {
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1358):
1358: return -1 if ( $rs->{abort} );
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1359):
1359: my $ein;
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1360):
1360: vec($ein, fileno($rs->{fh}), 1) = 1;
File::RsyncP::getData(/usr/lib/perl5/File/RsyncP.pm:1361):
1361: select(my $rout = $ein, undef, $ein, undef);
here it hangs.