Commit df0f59fc authored by ram@mysql.r18.ru's avatar ram@mysql.r18.ru

Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.0

into mysql.r18.ru:/usr/home/ram/work/4.0
parents 82942ebf 2ca501f7
......@@ -569,22 +569,22 @@ sub copy_files {
print "Copying ".@$files." files...\n" unless $opt{quiet};
if ($method =~ /^s?cp\b/) { # cp or scp with optional flags
my @cp = ($method);
my $cp = $method;
# add option to preserve mod time etc of copied files
# not critical, but nice to have
push @cp, "-p" if $^O =~ m/^(solaris|linux|freebsd|darwin)$/;
$cp.= " -p" if $^O =~ m/^(solaris|linux|freebsd|darwin)$/;
# add recursive option for scp
push @cp, "-r" if $^O =~ /m^(solaris|linux|freebsd|darwin)$/ && $method =~ /^scp\b/;
$cp.= " -r" if $^O =~ /m^(solaris|linux|freebsd|darwin)$/ && $method =~ /^scp\b/;
my @non_raid = map { "'$_'" } grep { ! m:/\d{2}/[^/]+$: } @$files;
# add files to copy and the destination directory
safe_system( @cp, @non_raid, "'$target'" ) if (@non_raid);
safe_system( $cp, @non_raid, "'$target'" ) if (@non_raid);
foreach my $rd ( @$raid_dirs ) {
my @raid = map { "'$_'" } grep { m:$rd/: } @$files;
safe_system( @cp, @raid, "'$target'/$rd" ) if ( @raid );
safe_system( $cp, @raid, "'$target'/$rd" ) if ( @raid );
}
}
else
......@@ -646,16 +646,43 @@ sub copy_index
}
sub safe_system
{
sub safe_system {
my @sources= @_;
my $method= shift @sources;
my $target= pop @sources;
## @sources = list of source file names
## We have to deal with very long command lines, otherwise they may generate
## "Argument list too long".
## With 10000 tables the command line can be around 1MB, much more than 128kB
## which is the common limit on Linux (can be read from
## /usr/src/linux/include/linux/binfmts.h
## see http://www.linuxjournal.com/article.php?sid=6060).
my $chunk_limit= 100 * 1024; # 100 kB
my @chunk= ();
my $chunk_length= 0;
foreach (@sources) {
push @chunk, $_;
$chunk_length+= length($_);
if ($chunk_length > $chunk_limit) {
safe_simple_system($method, @chunk, $target);
@chunk=();
$chunk_length= 0;
}
}
if ($chunk_length > 0) { # do not forget last small chunk
safe_simple_system($method, @chunk, $target);
}
}
sub safe_simple_system {
my @cmd= @_;
if ( $opt{dryrun} )
{
if ( $opt{dryrun} ) {
print "@cmd\n";
return;
}
else {
## for some reason system fails but backticks works ok for scp...
print "Executing '@cmd'\n" if $opt{debug};
my $cp_status = system "@cmd > /dev/null";
......@@ -664,6 +691,7 @@ sub safe_system
## try something else
`@cmd` || die "Error: @cmd failed ($?) while copying files.\n";
}
}
}
sub retire_directory {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment