Commit 845b9445 authored by tsmith@ramayana.hindu.god's avatar tsmith@ramayana.hindu.god
Browse files

Bug #28460 mysqlhotcopy silently skips a database with two alphanumerics name

Remove code from mysqlhotcopy which deals with the so-called "RAID"
feature of older MyISAM.
parent 23d670c3
Loading
Loading
Loading
Loading
+24 −75
Original line number Diff line number Diff line
@@ -39,7 +39,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome.

# Documentation continued at end of file

my $VERSION = "1.22";
my $VERSION = "1.23";

my $opt_tmpdir = $ENV{TMPDIR} || "/tmp";

@@ -132,7 +132,6 @@ GetOptions( \%opt,
#   'target'  - destination directory of the copy
#   'tables'  - array-ref to list of tables in the db
#   'files'   - array-ref to list of files to be copied
#               (RAID files look like 'nn/name.MYD')
#   'index'   - array-ref to list of indexes to be copied
#

@@ -263,7 +262,6 @@ my $hc_locks = "";
my $hc_tables = "";
my $num_tables = 0;
my $num_files = 0;
my $raid_dir_regex = '[A-Za-z0-9]{2}';

foreach my $rdb ( @db_desc ) {
    my $db = $rdb->{src};
@@ -292,20 +290,12 @@ foreach my $rdb ( @db_desc ) {
      or die "Cannot open dir '$db_dir': $!";

    my %db_files;
    my @raid_dir = ();

    while ( defined( my $name = readdir DBDIR ) ) {
	if ( $name =~ /^$raid_dir_regex$/ && -d "$db_dir/$name" ) {
	    push @raid_dir, $name;
	}
	else {
        $db_files{$name} = $1 if ( $name =~ /(.+)\.\w+$/ );
    }
    }
    closedir( DBDIR );

    scan_raid_dir( \%db_files, $db_dir, @raid_dir );

    unless( keys %db_files ) {
	warn "'$db' is an empty database\n";
    }
@@ -336,8 +326,6 @@ foreach my $rdb ( @db_desc ) {
    my @hc_tables = map { quote_names("$db.$_") } @dbh_tables;
    $rdb->{tables} = [ @hc_tables ];

    $rdb->{raid_dirs} = [ get_raid_dirs( $rdb->{files} ) ];

    $hc_locks .= ", "  if ( length $hc_locks && @hc_tables );
    $hc_locks .= join ", ", map { "$_ READ" } @hc_tables;
    $hc_tables .= ", "  if ( length $hc_tables && @hc_tables );
@@ -411,9 +399,7 @@ if ($opt{method} =~ /^cp\b/)
retire_directory( @existing ) if @existing && !$opt{addtodest};

foreach my $rdb ( @db_desc ) {
    foreach my $td ( '', @{$rdb->{raid_dirs}} ) {

	my $tgt_dirpath = "$rdb->{target}/$td";
    my $tgt_dirpath = "$rdb->{target}";
    # Remove trailing slashes (needed for Mac OS X)
    substr($tgt_dirpath, 1) =~ s|/+$||;
    if ( $opt{dryrun} ) {
@@ -433,7 +419,6 @@ foreach my $rdb ( @db_desc ) {
        }
    }
}
}

##############################
# --- PERFORM THE HOT-COPY ---
@@ -489,7 +474,7 @@ foreach my $rdb ( @db_desc )
  my @files = map { "$datadir/$rdb->{src}/$_" } @{$rdb->{files}};
  next unless @files;
  
  eval { copy_files($opt{method}, \@files, $rdb->{target}, $rdb->{raid_dirs} ); };
  eval { copy_files($opt{method}, \@files, $rdb->{target}); };
  push @failed, "$rdb->{src} -> $rdb->{target} failed: $@"
    if ( $@ );
  
@@ -582,7 +567,7 @@ exit 0;
# ---

sub copy_files {
    my ($method, $files, $target, $raid_dirs) = @_;
    my ($method, $files, $target) = @_;
    my @cmd;
    print "Copying ".@$files." files...\n" unless $opt{quiet};

@@ -603,15 +588,8 @@ sub copy_files {
	# add recursive option for scp
	$cp.= " -r" if $^O =~ /m^(solaris|linux|freebsd|darwin)$/ && $method =~ /^scp\b/;

	my @non_raid = map { "'$_'" } grep { ! m:/$raid_dir_regex/[^/]+$: } @$files;

	# add files to copy and the destination directory
	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 );
	}
	# perform the actual copy
	safe_system( $cp, (map { "'$_'" } @$files), "'$target'" );
    }
    else
    {
@@ -789,35 +767,6 @@ sub get_row_hash {
  return $sth->fetchrow_hashref();
}

sub scan_raid_dir {
    my ( $r_db_files, $data_dir, @raid_dir ) = @_;

    local(*RAID_DIR);
    
    foreach my $rd ( @raid_dir ) {

	opendir(RAID_DIR, "$data_dir/$rd" ) 
	    or die "Cannot open dir '$data_dir/$rd': $!";

	while ( defined( my $name = readdir RAID_DIR ) ) {
	    $r_db_files->{"$rd/$name"} = $1 if ( $name =~ /(.+)\.\w+$/ );
	}
	closedir( RAID_DIR );
    }
}

sub get_raid_dirs {
    my ( $r_files ) = @_;

    my %dirs = ();
    foreach my $f ( @$r_files ) {
	if ( $f =~ m:^($raid_dir_regex)/: ) {
	    $dirs{$1} = 1;
	}
    }
    return sort keys %dirs;
}

sub get_list_of_tables {
    my ( $db ) = @_;