~diego-fmpwizard/mysql-sandbox/repl-topo-aggr-support

« back to all changes in this revision

Viewing changes to bin/make_multiple_custom_sandbox

  • Committer: Giuseppe Maxia
  • Date: 2009-03-29 09:38:55 UTC
  • Revision ID: g.maxia@gmail.com-20090329093855-uie8syy1r12x6brj
- Preparation for version 3.0
- refactoring code to use with ExtUtilis::MakeMaker and install a proper Perl module 

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/perl 
 
2
#    The MySQL Sandbox
 
3
#    Copyright (C) 2006,2007,2008,2009 Giuseppe Maxia
 
4
#    Contacts: http://datacharmer.org
 
5
#
 
6
#    This program is free software; you can redistribute it and/or modify
 
7
#    it under the terms of the GNU General Public License as published by
 
8
#    the Free Software Foundation; version 2 of the License
 
9
#
 
10
#    This program is distributed in the hope that it will be useful,
 
11
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
 
12
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 
13
#    GNU General Public License for more details.
 
14
#
 
15
#    You should have received a copy of the GNU General Public License
 
16
#    along with this program; if not, write to the Free Software
 
17
#    Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
 
18
 
 
19
use strict;
 
20
use warnings;
 
21
use English qw( -no_match_vars ); 
 
22
use Data::Dumper;
 
23
use Getopt::Long qw(:config no_ignore_case );
 
24
use MySQL::Sandbox;
 
25
use MySQL::Sandbox::Scripts;
 
26
 
 
27
my $DEBUG = $MySQL::Sandbox::DEBUG;
 
28
 
 
29
my %defaults = (
 
30
    custom_base_port => $MySQL::Sandbox::default_base_port{custom},
 
31
    group_directory => 'multi_cmsb',
 
32
);
 
33
 
 
34
#my $install_dir;
 
35
#$install_dir = $PROGRAM_NAME;
 
36
#$install_dir =~ s{/\w+(\.pl)?$}{};
 
37
#eval "use lib q($install_dir)";
 
38
#eval "use MySandbox";
 
39
#eval "use MyScripts";
 
40
 
 
41
my $msb = MySQL::Sandbox->new();
 
42
 
 
43
my %parse_options = %{ MySQL::Sandbox::Scripts::parse_options_many() };
 
44
$msb->parse_options(\%parse_options);
 
45
 
 
46
my %options = map { $_ , $parse_options{$_}{'value'}}  keys %parse_options ;
 
47
 
 
48
GetOptions (
 
49
    map { $parse_options{$_}{parse}, \$options{$_} }        
 
50
        grep { $parse_options{$_}{parse}}  keys %parse_options  
 
51
) or $msb->get_help();
 
52
 
 
53
$msb->get_help() if $options{'help'};
 
54
 
 
55
unless ($options{server_version}) {
 
56
    $options{server_version} = join(':', @ARGV);
 
57
    @ARGV > 0 or $msb->get_help('server version required');
 
58
}
 
59
 
 
60
my $replication_port = 0;
 
61
my @base_version ;
 
62
my @dashed_version ;
 
63
my @versions= split /[,:;]/, $options{server_version};
 
64
my $counter =0;
 
65
for my $ver (@versions) {
 
66
    my $temp_path = $ver;
 
67
    $temp_path =~ s{.*/}{};
 
68
    if ( $temp_path =~ /(\d+)\.(\d+)\.(\d+)/ ) {
 
69
        $base_version[$counter] = "$1$2$3";
 
70
        $dashed_version[$counter] = "$1_$2_$3";
 
71
        $base_version[$counter] =~ s/^0+//;
 
72
        $counter++;
 
73
    }
 
74
    else {
 
75
        $msb->get_help("No recognizable version pattern in $options{server_version}\n");
 
76
    }
 
77
}
 
78
 
 
79
my $group_directory ;
 
80
 
 
81
if ( $options{group_directory}) {
 
82
    $group_directory = "$options{upper_directory}/$options{group_directory}";
 
83
}
 
84
else {
 
85
    $group_directory = "$options{upper_directory}/" 
 
86
        . make_group_dir( $defaults{group_directory}, \@dashed_version);
 
87
}
 
88
 
 
89
if ( -d $group_directory ) {
 
90
    system "$group_directory/clear_all";
 
91
}
 
92
else {
 
93
    print "creating replication directory $group_directory\n" if $options{verbose};
 
94
    mkdir $group_directory
 
95
}
 
96
 
 
97
for my $dir ( 1 .. @versions ) {
 
98
    if ( -d "$group_directory/node$dir" ) {
 
99
        system "rm -rf $group_directory/node$dir" 
 
100
            and die "unable to clean $group_directory/node$dir\n";
 
101
    }
 
102
}
 
103
 
 
104
for my $ver_counter (0 .. $#versions) {
 
105
 
 
106
    if ( $options{sandbox_base_port}) {
 
107
        $replication_port = $options{sandbox_base_port};
 
108
    }
 
109
    else {
 
110
        $replication_port = $defaults{custom_base_port} + $base_version[$ver_counter];
 
111
    }
 
112
 
 
113
    my $additional_node_options = $ENV{NODE_OPTIONS} || '';
 
114
    $additional_node_options .= q{ }; 
 
115
    my $node = $ver_counter + 1;
 
116
    my $node_port = $replication_port+ $node;
 
117
    print "installing node $node\n";
 
118
    my $install_node = qx(
 
119
     make_sandbox $versions[$ver_counter] \\
 
120
     --datadir_from=script \\
 
121
     --upper_directory=$group_directory \\
 
122
     --sandbox_directory=node$node \\
 
123
     --no_confirm \\
 
124
     --prompt_prefix=node$node \\
 
125
     --sandbox_port=$node_port \\
 
126
     -c server-id=10$node \\
 
127
     -c log-bin=mysql-bin $additional_node_options
 
128
     );
 
129
     print $install_node if $options{verbose};
 
130
     if ($CHILD_ERROR) {
 
131
         print "error installing node $node\n";
 
132
         print "$install_node\n";
 
133
         exit(1)
 
134
     }
 
135
     # sleep 1;
 
136
}
 
137
 
 
138
my $current_dir = $ENV{PWD};
 
139
 
 
140
chdir $group_directory;
 
141
 
 
142
for my $cmd ( qw(start stop clear send_kill) ) {
 
143
    my $cmd_fname = $cmd . '_all';
 
144
    $msb->write_to($cmd_fname, '>', '#!/bin/sh');
 
145
    for my $node (1 .. @versions ) {
 
146
        $msb->write_to ($cmd_fname, '>>', qq(echo 'executing "$cmd" on node $node'));
 
147
        $msb->write_to ($cmd_fname, '>>', "$group_directory/node$node/$cmd");
 
148
    }
 
149
    chmod 0755, $cmd_fname;
 
150
}
 
151
 
 
152
$msb->write_to('use_all', '>', '#!/bin/sh');
 
153
my $node_list = join(' ', (1 .. @versions ) );
 
154
 
 
155
$msb->write_to('use_all', '>>', 'if [ "$1" == "" ]');
 
156
$msb->write_to('use_all', '>>', 'then');
 
157
$msb->write_to('use_all', '>>', '  echo "syntax: $0 command"');
 
158
$msb->write_to('use_all', '>>', '  exit 1');
 
159
$msb->write_to('use_all', '>>', 'fi');
 
160
$msb->write_to('use_all', '>>', '');
 
161
$msb->write_to('use_all', '>>', 'for SNUM in ' . $node_list);
 
162
$msb->write_to('use_all', '>>', 'do ' );
 
163
$msb->write_to('use_all', '>>', '  echo "# server: $SNUM " ' );
 
164
$msb->write_to('use_all', '>>', '  echo "$@" | ' . $group_directory . '/node$SNUM/use $MYCLIENT_OPTIONS ');
 
165
$msb->write_to('use_all', '>>', 'done ' );
 
166
chmod 0755, 'use_all';
 
167
 
 
168
for my $node (1 .. @versions ) {
 
169
    $msb->write_to("n$node", '>', "#!/bin/sh");
 
170
    $msb->write_to("n$node", '>', qq($group_directory/node$node/use "\$@"));
 
171
    chmod 0755, "n$node";
 
172
}
 
173
 
 
174
chdir $current_dir;
 
175
print "group directory installed on $group_directory\n";
 
176
 
 
177
sub make_group_dir {
 
178
    my ($base_dir, $dashed) = @_;
 
179
    my @copy_dashed = @$dashed;
 
180
    my $suffix = '';
 
181
    if (@copy_dashed > 3) {
 
182
       $suffix = join('-', map { s/(\d+_\d+).*/$1/; $_ } @copy_dashed  ); 
 
183
    } 
 
184
    else {
 
185
        $suffix = join('-', @$dashed);
 
186
    }
 
187
    return $base_dir . '_' . $suffix;
 
188
}
 
189
 
 
190
__END__