2331
2263
##############################################################################
2333
# Start the ndb cluster
2335
##############################################################################
2337
sub check_ndbcluster_support ($) {
2338
my $mysqld_variables= shift;
2340
if ($opt_skip_ndbcluster || $opt_extern)
2344
mtr_report("Skipping ndbcluster");
2346
$opt_skip_ndbcluster_slave= 1;
2350
if ( ! $mysqld_variables->{'ndb-connectstring'} )
2352
mtr_report("Skipping ndbcluster, mysqld not compiled with ndbcluster");
2353
$opt_skip_ndbcluster= 1;
2354
$opt_skip_ndbcluster_slave= 1;
2357
$glob_ndbcluster_supported= 1;
2358
mtr_report("Using ndbcluster when necessary, mysqld supports it");
2360
if ( $mysql_version_id < 50100 )
2362
# Slave cluster is not supported until 5.1
2363
$opt_skip_ndbcluster_slave= 1;
2371
sub ndbcluster_start_install ($) {
2374
mtr_report("Installing $cluster->{'name'} Cluster");
2376
mkdir($cluster->{'data_dir'});
2378
# Create a config file from template
2380
my $ndb_no_attr=2048;
2381
my $ndb_con_op=105000;
2384
my $ndb_pbmem="32M";
2385
my $nodes= $cluster->{'nodes'};
2386
my $ndb_host= "localhost";
2387
my $ndb_diskless= 0;
2391
# Use a smaller configuration
2392
if ( $mysql_version_id < 50100 )
2394
# 4.1 and 5.0 is using a "larger" --small configuration
2410
my $config_file_template= "ndb/ndb_config_${nodes}_node.ini";
2411
my $config_file= "$cluster->{'data_dir'}/config.ini";
2413
open(IN, $config_file_template)
2414
or mtr_error("Can't open $config_file_template: $!");
2415
open(OUT, ">", $config_file)
2416
or mtr_error("Can't write to $config_file: $!");
2421
s/CHOOSE_MaxNoOfAttributes/$ndb_no_attr/;
2422
s/CHOOSE_MaxNoOfOrderedIndexes/$ndb_no_ord/;
2423
s/CHOOSE_MaxNoOfConcurrentOperations/$ndb_con_op/;
2424
s/CHOOSE_DataMemory/$ndb_dmem/;
2425
s/CHOOSE_IndexMemory/$ndb_imem/;
2426
s/CHOOSE_Diskless/$ndb_diskless/;
2427
s/CHOOSE_HOSTNAME_.*/$ndb_host/;
2428
s/CHOOSE_FILESYSTEM/$cluster->{'data_dir'}/;
2429
s/CHOOSE_PORT_MGM/$cluster->{'port'}/;
2430
if ( $mysql_version_id < 50000 )
2432
my $base_port= $cluster->{'port'} + 1;
2433
s/CHOOSE_PORT_TRANSPORTER/$base_port/;
2435
s/CHOOSE_DiskPageBufferMemory/$ndb_pbmem/;
2443
# Start cluster with "--initial"
2445
ndbcluster_start($cluster, "--initial");
2451
sub ndbcluster_wait_started($$){
2453
my $ndb_waiter_extra_opt= shift;
2454
my $path_waiter_log= "$cluster->{'data_dir'}/ndb_waiter.log";
2457
mtr_init_args(\$args);
2459
mtr_add_arg($args, "--no-defaults");
2460
mtr_add_arg($args, "--core");
2461
mtr_add_arg($args, "--ndb-connectstring=%s", $cluster->{'connect_string'});
2462
mtr_add_arg($args, "--timeout=60");
2464
if ($ndb_waiter_extra_opt)
2466
mtr_add_arg($args, "$ndb_waiter_extra_opt");
2469
# Start the ndb_waiter which will connect to the ndb_mgmd
2470
# and poll it for state of the ndbd's, will return when
2471
# all nodes in the cluster is started
2472
my $res= mtr_run($exe_ndb_waiter, $args,
2473
"", $path_waiter_log, $path_waiter_log, "");
2474
mtr_verbose("ndbcluster_wait_started, returns: $res") if $res;
2480
sub mysqld_wait_started($){
2483
if (sleep_until_file_created($mysqld->{'path_pid'},
2484
$mysqld->{'start_timeout'},
2485
$mysqld->{'pid'}) == 0)
2487
# Failed to wait for pid file
2491
# Get the "real pid" of the process, it will be used for killing
2492
# the process in ActiveState's perl on windows
2493
$mysqld->{'real_pid'}= mtr_get_pid_from_file($mysqld->{'path_pid'});
2499
sub ndb_mgmd_wait_started($) {
2503
while (ndbcluster_wait_started($cluster, "--no-contact") and
2506
# Millisceond sleep emulated with select
2507
select(undef, undef, undef, (0.1));
2512
return $retries == 0;
2516
sub ndb_mgmd_start ($) {
2519
my $args; # Arg vector
2522
mtr_init_args(\$args);
2523
mtr_add_arg($args, "--no-defaults");
2524
mtr_add_arg($args, "--core");
2525
mtr_add_arg($args, "--nodaemon");
2526
mtr_add_arg($args, "--config-file=%s", "$cluster->{'data_dir'}/config.ini");
2529
my $path_ndb_mgmd_log= "$cluster->{'data_dir'}/\l$cluster->{'name'}_ndb_mgmd.log";
2530
$pid= mtr_spawn($exe_ndb_mgmd, $args, "",
2534
{ append_log_file => 1 });
2536
# FIXME Should not be needed
2537
# Unfortunately the cluster nodes will fail to start
2538
# if ndb_mgmd has not started properly
2539
if (ndb_mgmd_wait_started($cluster))
2541
mtr_error("Failed to wait for start of ndb_mgmd");
2544
# Remember pid of ndb_mgmd
2545
$cluster->{'pid'}= $pid;
2547
mtr_verbose("ndb_mgmd_start, pid: $pid");
2553
sub ndbd_start ($$$) {
2556
my $extra_args= shift;
2558
my $args; # Arg vector
2561
mtr_init_args(\$args);
2562
mtr_add_arg($args, "--no-defaults");
2563
mtr_add_arg($args, "--core");
2564
mtr_add_arg($args, "--ndb-connectstring=%s", "$cluster->{'connect_string'}");
2565
if ( $mysql_version_id >= 50000)
2567
mtr_add_arg($args, "--character-sets-dir=%s", "$path_charsetsdir");
2569
mtr_add_arg($args, "--nodaemon");
2570
mtr_add_arg($args, "$extra_args");
2572
my $nodeid= $cluster->{'ndbds'}->[$idx]->{'nodeid'};
2573
my $path_ndbd_log= "$cluster->{'data_dir'}/ndb_${nodeid}.log";
2574
$pid= mtr_spawn($exe_ndbd, $args, "",
2578
{ append_log_file => 1 });
2580
# Add pid to list of pids for this cluster
2581
$cluster->{'ndbds'}->[$idx]->{'pid'}= $pid;
2583
# Rememeber options used when starting
2584
$cluster->{'ndbds'}->[$idx]->{'start_extra_args'}= $extra_args;
2585
$cluster->{'ndbds'}->[$idx]->{'idx'}= $idx;
2587
mtr_verbose("ndbd_start, pid: $pid");
2593
sub ndbcluster_start ($$) {
2595
my $extra_args= shift;
2597
mtr_verbose("ndbcluster_start '$cluster->{'name'}'");
2599
if ( $cluster->{'use_running'} )
2604
if ( $cluster->{'pid'} )
2606
mtr_error("Cluster '$cluster->{'name'}' already started");
2609
ndb_mgmd_start($cluster);
2611
for ( my $idx= 0; $idx < $cluster->{'nodes'}; $idx++ )
2613
ndbd_start($cluster, $idx, $extra_args);
2620
sub rm_ndbcluster_tables ($) {
2622
foreach my $bin ( glob("$dir/mysql/ndb_apply_status*"),
2623
glob("$dir/mysql/ndb_schema*"))
2630
##############################################################################
2632
2265
# Run the benchmark suite
2634
2267
##############################################################################