mirror of
https://github.com/MariaDB/server.git
synced 2025-01-19 05:22:25 +01:00
Merge rkalimullin@bk-internal.mysql.com:/home/bk/mysql-4.0
into mysql.r18.ru:/usr/home/ram/work/4.0
This commit is contained in:
commit
df0f59fcbd
2 changed files with 49 additions and 21 deletions
|
@ -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 {
|
||||
|
|
Loading…
Reference in a new issue