mirror of
https://github.com/MariaDB/server.git
synced 2026-01-06 05:22:24 +03:00
Merge joreland@bk-internal.mysql.com:/home/bk/mysql-5.0-ndb
into mysql.com:/home/jonas/src/mysql-5.0-ndb
This commit is contained in:
@@ -41,7 +41,7 @@ charset-collation code for them. */
|
||||
ulint data_mysql_default_charset_coll = 99999999;
|
||||
ulint data_mysql_latin1_swedish_charset_coll = 99999999;
|
||||
|
||||
dtype_t dtype_binary_val = {DATA_BINARY, 0, 0, 0};
|
||||
dtype_t dtype_binary_val = {DATA_BINARY, 0, 0, 0, 0, 0};
|
||||
dtype_t* dtype_binary = &dtype_binary_val;
|
||||
|
||||
/*************************************************************************
|
||||
@@ -216,6 +216,8 @@ dtype_validate(
|
||||
ut_a((type->prtype & DATA_MYSQL_TYPE_MASK) < DATA_N_SYS_COLS);
|
||||
}
|
||||
|
||||
ut_a(type->mbminlen <= type->mbmaxlen);
|
||||
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
|
||||
@@ -271,6 +271,24 @@ dtype_get_prec(
|
||||
/*===========*/
|
||||
dtype_t* type);
|
||||
/*************************************************************************
|
||||
Gets the minimum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
dtype_get_mbminlen(
|
||||
/*===============*/
|
||||
/* out: minimum length of a char, in bytes,
|
||||
or 0 if this is not a character type */
|
||||
const dtype_t* type); /* in: type */
|
||||
/*************************************************************************
|
||||
Gets the maximum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
dtype_get_mbmaxlen(
|
||||
/*===============*/
|
||||
/* out: maximum length of a char, in bytes,
|
||||
or 0 if this is not a character type */
|
||||
const dtype_t* type); /* in: type */
|
||||
/*************************************************************************
|
||||
Gets the padding character code for the type. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
@@ -352,16 +370,25 @@ dtype_print(
|
||||
/*========*/
|
||||
dtype_t* type); /* in: type */
|
||||
|
||||
/* Structure for an SQL data type */
|
||||
/* Structure for an SQL data type.
|
||||
If you add fields to this structure, be sure to initialize them everywhere.
|
||||
This structure is initialized in the following functions:
|
||||
dtype_set()
|
||||
dtype_read_for_order_and_null_size()
|
||||
dtype_new_read_for_order_and_null_size()
|
||||
sym_tab_add_null_lit() */
|
||||
|
||||
struct dtype_struct{
|
||||
ulint mtype; /* main data type */
|
||||
ulint prtype; /* precise type; MySQL data type */
|
||||
|
||||
/* the remaining two fields do not affect alphabetical ordering: */
|
||||
/* the remaining fields do not affect alphabetical ordering: */
|
||||
|
||||
ulint len; /* length */
|
||||
ulint prec; /* precision */
|
||||
|
||||
ulint mbminlen; /* minimum length of a character, in bytes */
|
||||
ulint mbmaxlen; /* maximum length of a character, in bytes */
|
||||
};
|
||||
|
||||
#ifndef UNIV_NONINL
|
||||
|
||||
@@ -9,15 +9,46 @@ Created 1/16/1996 Heikki Tuuri
|
||||
#include "mach0data.h"
|
||||
|
||||
/**********************************************************************
|
||||
Determines whether the given character set is of variable length.
|
||||
Get the variable length bounds of the given character set.
|
||||
|
||||
NOTE: the prototype of this function is copied from ha_innodb.cc! If you change
|
||||
this function, you MUST change also the prototype here! */
|
||||
extern
|
||||
ibool
|
||||
innobase_is_mb_cset(
|
||||
/*================*/
|
||||
ulint cset); /* in: MySQL charset-collation code */
|
||||
void
|
||||
innobase_get_cset_width(
|
||||
/*====================*/
|
||||
ulint cset, /* in: MySQL charset-collation code */
|
||||
ulint* mbminlen, /* out: minimum length of a char (in bytes) */
|
||||
ulint* mbmaxlen); /* out: maximum length of a char (in bytes) */
|
||||
|
||||
/*************************************************************************
|
||||
Gets the MySQL charset-collation code for MySQL string types. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
dtype_get_charset_coll(
|
||||
/*===================*/
|
||||
ulint prtype) /* in: precise data type */
|
||||
{
|
||||
return((prtype >> 16) & 0xFFUL);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Sets the mbminlen and mbmaxlen members of a data type structure. */
|
||||
UNIV_INLINE
|
||||
void
|
||||
dtype_set_mblen(
|
||||
/*============*/
|
||||
dtype_t* type) /* in/out: type struct */
|
||||
{
|
||||
ut_ad(type);
|
||||
if (dtype_is_string_type(type->mtype)) {
|
||||
innobase_get_cset_width(dtype_get_charset_coll(type->prtype),
|
||||
&type->mbminlen, &type->mbmaxlen);
|
||||
ut_ad(type->mbminlen <= type->mbmaxlen);
|
||||
} else {
|
||||
type->mbminlen = type->mbmaxlen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Sets a data type structure. */
|
||||
@@ -39,6 +70,7 @@ dtype_set(
|
||||
type->len = len;
|
||||
type->prec = prec;
|
||||
|
||||
dtype_set_mblen(type);
|
||||
ut_ad(dtype_validate(type));
|
||||
}
|
||||
|
||||
@@ -82,17 +114,6 @@ dtype_get_prtype(
|
||||
return(type->prtype);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the MySQL charset-collation code for MySQL string types. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
dtype_get_charset_coll(
|
||||
/*===================*/
|
||||
ulint prtype) /* in: precise data type */
|
||||
{
|
||||
return((prtype >> 16) & 0xFFUL);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the type length. */
|
||||
UNIV_INLINE
|
||||
@@ -119,6 +140,33 @@ dtype_get_prec(
|
||||
return(type->prec);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the minimum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
dtype_get_mbminlen(
|
||||
/*===============*/
|
||||
/* out: minimum length of a char, in bytes,
|
||||
or 0 if this is not a character type */
|
||||
const dtype_t* type) /* in: type */
|
||||
{
|
||||
ut_ad(type);
|
||||
return(type->mbminlen);
|
||||
}
|
||||
/*************************************************************************
|
||||
Gets the maximum length of a character, in bytes. */
|
||||
UNIV_INLINE
|
||||
ulint
|
||||
dtype_get_mbmaxlen(
|
||||
/*===============*/
|
||||
/* out: maximum length of a char, in bytes,
|
||||
or 0 if this is not a character type */
|
||||
const dtype_t* type) /* in: type */
|
||||
{
|
||||
ut_ad(type);
|
||||
return(type->mbmaxlen);
|
||||
}
|
||||
|
||||
/*************************************************************************
|
||||
Gets the padding character code for the type. */
|
||||
UNIV_INLINE
|
||||
@@ -211,6 +259,7 @@ dtype_read_for_order_and_null_size(
|
||||
|
||||
type->prtype = dtype_form_prtype(type->prtype,
|
||||
data_mysql_default_charset_coll);
|
||||
dtype_set_mblen(type);
|
||||
}
|
||||
|
||||
/**************************************************************************
|
||||
@@ -262,6 +311,7 @@ dtype_new_read_for_order_and_null_size(
|
||||
|
||||
type->prtype = dtype_form_prtype(type->prtype, charset_coll);
|
||||
}
|
||||
dtype_set_mblen(type);
|
||||
}
|
||||
|
||||
/***************************************************************************
|
||||
@@ -305,11 +355,40 @@ dtype_get_fixed_size(
|
||||
case DATA_FLOAT:
|
||||
case DATA_DOUBLE:
|
||||
case DATA_MYSQL:
|
||||
if ((type->prtype & DATA_BINARY_TYPE)
|
||||
|| !innobase_is_mb_cset(
|
||||
dtype_get_charset_coll(
|
||||
type->prtype))) {
|
||||
if (type->prtype & DATA_BINARY_TYPE) {
|
||||
return(dtype_get_len(type));
|
||||
} else {
|
||||
/* We play it safe here and ask MySQL for
|
||||
mbminlen and mbmaxlen. Although
|
||||
type->mbminlen and type->mbmaxlen are
|
||||
initialized if and only if type->prtype
|
||||
is (in one of the 3 functions in this file),
|
||||
it could be that none of these functions
|
||||
has been called. */
|
||||
|
||||
ulint mbminlen, mbmaxlen;
|
||||
|
||||
innobase_get_cset_width(
|
||||
dtype_get_charset_coll(type->prtype),
|
||||
&mbminlen, &mbmaxlen);
|
||||
|
||||
if (type->mbminlen != mbminlen
|
||||
|| type->mbmaxlen != mbmaxlen) {
|
||||
|
||||
ut_print_timestamp(stderr);
|
||||
fprintf(stderr, " InnoDB: "
|
||||
"mbminlen=%lu, "
|
||||
"mbmaxlen=%lu, "
|
||||
"type->mbminlen=%lu, "
|
||||
"type->mbmaxlen=%lu\n",
|
||||
(ulong) mbminlen,
|
||||
(ulong) mbmaxlen,
|
||||
(ulong) type->mbminlen,
|
||||
(ulong) type->mbmaxlen);
|
||||
}
|
||||
if (mbminlen == mbmaxlen) {
|
||||
return(dtype_get_len(type));
|
||||
}
|
||||
}
|
||||
/* fall through for variable-length charsets */
|
||||
case DATA_VARCHAR:
|
||||
|
||||
@@ -458,6 +458,10 @@ struct mysql_row_templ_struct {
|
||||
numbers DATA_CHAR... */
|
||||
ulint charset; /* MySQL charset-collation code
|
||||
of the column, or zero */
|
||||
ulint mbminlen; /* minimum length of a char, in bytes,
|
||||
or zero if not a char type */
|
||||
ulint mbmaxlen; /* maximum length of a char, in bytes,
|
||||
or zero if not a char type */
|
||||
ulint is_unsigned; /* if a column type is an integer
|
||||
type and this field is != 0, then
|
||||
it is an unsigned integer type */
|
||||
|
||||
@@ -93,17 +93,11 @@ row_mysql_store_col_in_innobase_format(
|
||||
|| type == DATA_BINARY) {
|
||||
/* Remove trailing spaces. */
|
||||
|
||||
/* Handle UCS2 strings differently. As no new
|
||||
collations will be introduced in 4.1, we hardcode the
|
||||
charset-collation codes here. In 5.0, the logic will
|
||||
be based on mbminlen. */
|
||||
ulint cset = dtype_get_charset_coll(
|
||||
dtype_get_prtype(dfield_get_type(dfield)));
|
||||
/* Handle UCS2 strings differently. */
|
||||
ulint mbminlen = dtype_get_mbminlen(
|
||||
dfield_get_type(dfield));
|
||||
ptr = row_mysql_read_var_ref(&col_len, mysql_data);
|
||||
if (cset == 35/*ucs2_general_ci*/
|
||||
|| cset == 90/*ucs2_bin*/
|
||||
|| (cset >= 128/*ucs2_unicode_ci*/
|
||||
&& cset <= 144/*ucs2_persian_ci*/)) {
|
||||
if (mbminlen == 2) {
|
||||
/* space=0x0020 */
|
||||
/* Trim "half-chars", just in case. */
|
||||
col_len &= ~1;
|
||||
@@ -113,6 +107,7 @@ row_mysql_store_col_in_innobase_format(
|
||||
col_len -= 2;
|
||||
}
|
||||
} else {
|
||||
ut_a(mbminlen == 1);
|
||||
/* space=0x20 */
|
||||
while (col_len > 0 && ptr[col_len - 1] == 0x20) {
|
||||
col_len--;
|
||||
|
||||
@@ -424,10 +424,13 @@ row_create_prebuilt(
|
||||
prebuilt->sel_graph = NULL;
|
||||
|
||||
prebuilt->search_tuple = dtuple_create(heap,
|
||||
dict_table_get_n_cols(table));
|
||||
2 * dict_table_get_n_cols(table));
|
||||
|
||||
clust_index = dict_table_get_first_index(table);
|
||||
|
||||
/* Make sure that search_tuple is long enough for clustered index */
|
||||
ut_a(2 * dict_table_get_n_cols(table) >= clust_index->n_fields);
|
||||
|
||||
ref_len = dict_index_get_n_unique(clust_index);
|
||||
|
||||
ref = dtuple_create(heap, ref_len);
|
||||
|
||||
@@ -2410,14 +2410,9 @@ row_sel_store_mysql_rec(
|
||||
/* Pad with trailing spaces */
|
||||
data = mysql_rec + templ->mysql_col_offset;
|
||||
|
||||
/* Handle UCS2 strings differently. As no new
|
||||
collations will be introduced in 4.1, we
|
||||
hardcode the charset-collation codes here.
|
||||
5.0 will use a different approach. */
|
||||
if (templ->charset == 35
|
||||
|| templ->charset == 90
|
||||
|| (templ->charset >= 128
|
||||
&& templ->charset <= 144)) {
|
||||
ut_ad(templ->mbminlen <= templ->mbmaxlen);
|
||||
/* Handle UCS2 strings differently. */
|
||||
if (templ->mbminlen == 2) {
|
||||
/* space=0x0020 */
|
||||
ulint col_len = templ->mysql_col_len;
|
||||
|
||||
@@ -2436,6 +2431,7 @@ row_sel_store_mysql_rec(
|
||||
data[len++] = 0x20;
|
||||
}
|
||||
} else {
|
||||
ut_ad(templ->mbminlen == 1);
|
||||
/* space=0x20 */
|
||||
memset(data + len, 0x20,
|
||||
templ->mysql_col_len - len);
|
||||
@@ -2477,14 +2473,8 @@ row_sel_store_mysql_rec(
|
||||
pad_char = '\0';
|
||||
}
|
||||
|
||||
/* Handle UCS2 strings differently. As no new
|
||||
collations will be introduced in 4.1,
|
||||
we hardcode the charset-collation codes here.
|
||||
5.0 will use a different approach. */
|
||||
if (templ->charset == 35
|
||||
|| templ->charset == 90
|
||||
|| (templ->charset >= 128
|
||||
&& templ->charset <= 144)) {
|
||||
/* Handle UCS2 strings differently. */
|
||||
if (templ->mbminlen == 2) {
|
||||
/* There are two bytes per char, so the length
|
||||
has to be an even number. */
|
||||
ut_a(!(templ->mysql_col_len & 1));
|
||||
@@ -2497,6 +2487,7 @@ row_sel_store_mysql_rec(
|
||||
len -= 2;
|
||||
}
|
||||
} else {
|
||||
ut_ad(templ->mbminlen == 1);
|
||||
memset(mysql_rec + templ->mysql_col_offset,
|
||||
pad_char, templ->mysql_col_len);
|
||||
}
|
||||
|
||||
File diff suppressed because one or more lines are too long
@@ -50,12 +50,14 @@ sub mtr_show_failed_diff ($) {
|
||||
$result_file= "$result_file$::opt_result_ext";
|
||||
}
|
||||
|
||||
my $diffopts= $::opt_udiff ? "-u" : "-c";
|
||||
|
||||
if ( -f $reject_file )
|
||||
{
|
||||
print "Below are the diffs between actual and expected results:\n";
|
||||
print "-------------------------------------------------------\n";
|
||||
# FIXME check result code?!
|
||||
mtr_run("diff",["-c",$result_file,$reject_file], "", "", "", "");
|
||||
mtr_run("diff",[$diffopts,$result_file,$reject_file], "", "", "", "");
|
||||
print "-------------------------------------------------------\n";
|
||||
print "Please follow the instructions outlined at\n";
|
||||
print "http://www.mysql.com/doc/en/Reporting_mysqltest_bugs.html\n";
|
||||
|
||||
@@ -156,13 +156,13 @@ our @mysqld_src_dirs=
|
||||
our $glob_win32= 0; # OS and native Win32 executables
|
||||
our $glob_win32_perl= 0; # ActiveState Win32 Perl
|
||||
our $glob_cygwin_perl= 0; # Cygwin Perl
|
||||
our $glob_cygwin_shell= undef;
|
||||
our $glob_mysql_test_dir= undef;
|
||||
our $glob_mysql_bench_dir= undef;
|
||||
our $glob_hostname= undef;
|
||||
our $glob_scriptname= undef;
|
||||
our $glob_use_running_server= 0;
|
||||
our $glob_use_running_ndbcluster= 0;
|
||||
our $glob_user= 'test';
|
||||
our $glob_use_embedded_server= 0;
|
||||
|
||||
our $glob_basedir;
|
||||
@@ -281,6 +281,8 @@ our $opt_wait_timeout= 10;
|
||||
|
||||
our $opt_warnings;
|
||||
|
||||
our $opt_udiff;
|
||||
|
||||
our $opt_with_ndbcluster;
|
||||
our $opt_with_openssl;
|
||||
|
||||
@@ -422,7 +424,9 @@ sub initial_setup () {
|
||||
{
|
||||
# Windows programs like 'mysqld' needs Windows paths
|
||||
$glob_mysql_test_dir= `cygpath -m $glob_mysql_test_dir`;
|
||||
$glob_cygwin_shell= `cygpath -w $ENV{'SHELL'}`; # The Windows path c:\...
|
||||
chomp($glob_mysql_test_dir);
|
||||
chomp($glob_cygwin_shell);
|
||||
}
|
||||
$glob_basedir= dirname($glob_mysql_test_dir);
|
||||
$glob_mysql_bench_dir= "$glob_basedir/mysql-bench"; # FIXME make configurable
|
||||
@@ -524,6 +528,7 @@ sub command_line_setup () {
|
||||
'start-from=s' => \$opt_start_from,
|
||||
'timer' => \$opt_timer,
|
||||
'tmpdir=s' => \$opt_tmpdir,
|
||||
'unified-diff|udiff' => \$opt_udiff,
|
||||
'user-test=s' => \$opt_user_test,
|
||||
'user=s' => \$opt_user,
|
||||
'verbose' => \$opt_verbose,
|
||||
@@ -712,17 +717,16 @@ sub command_line_setup () {
|
||||
# }
|
||||
#}
|
||||
|
||||
if ( $opt_user )
|
||||
if ( ! $opt_user )
|
||||
{
|
||||
$glob_user= $opt_user;
|
||||
}
|
||||
elsif ( $glob_use_running_server )
|
||||
{
|
||||
$glob_user= "test";
|
||||
}
|
||||
else
|
||||
{
|
||||
$glob_user= "root"; # We want to do FLUSH xxx commands
|
||||
if ( $glob_use_running_server )
|
||||
{
|
||||
$opt_user= "test";
|
||||
}
|
||||
else
|
||||
{
|
||||
$opt_user= "root"; # We want to do FLUSH xxx commands
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -837,7 +841,7 @@ sub executable_setup () {
|
||||
}
|
||||
else
|
||||
{
|
||||
error("Cannot find embedded server 'mysqltest_embedded'");
|
||||
mtr_error("Cannot find embedded server 'mysqltest_embedded'");
|
||||
}
|
||||
if ( -d "$path_tests_bindir/mysql_client_test_embedded" )
|
||||
{
|
||||
@@ -860,9 +864,6 @@ sub executable_setup () {
|
||||
$exe_ndb_mgm= "$glob_basedir/bin/ndb_mgm";
|
||||
}
|
||||
|
||||
# FIXME special $exe_master_mysqld and $exe_slave_mysqld
|
||||
# are not used that much....
|
||||
|
||||
if ( ! $exe_master_mysqld )
|
||||
{
|
||||
$exe_master_mysqld= $exe_mysqld;
|
||||
@@ -1099,7 +1100,7 @@ sub run_benchmarks ($) {
|
||||
mtr_init_args(\$args);
|
||||
|
||||
mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'});
|
||||
mtr_add_arg($args, "--user=root");
|
||||
mtr_add_arg($args, "--user=%s", $opt_user);
|
||||
|
||||
if ( $opt_small_bench )
|
||||
{
|
||||
@@ -1223,11 +1224,36 @@ sub install_db ($$) {
|
||||
my $type= shift;
|
||||
my $data_dir= shift;
|
||||
|
||||
my $init_db_sql= "lib/init_db.sql"; # FIXME this is too simple maybe
|
||||
my $init_db_sql= "lib/init_db.sql";
|
||||
my $init_db_sql_tmp= "/tmp/init_db.sql$$";
|
||||
my $args;
|
||||
|
||||
mtr_report("Installing \u$type Databases");
|
||||
|
||||
open(IN, $init_db_sql)
|
||||
or error("Can't open $init_db_sql: $!");
|
||||
open(OUT, ">", $init_db_sql_tmp)
|
||||
or error("Can't write to $init_db_sql_tmp: $!");
|
||||
while (<IN>)
|
||||
{
|
||||
chomp;
|
||||
s/\@HOSTNAME\@/$glob_hostname/;
|
||||
if ( /^\s*$/ )
|
||||
{
|
||||
print OUT "\n";
|
||||
}
|
||||
elsif (/;$/)
|
||||
{
|
||||
print OUT "$_\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
print OUT $_;
|
||||
}
|
||||
}
|
||||
close OUT;
|
||||
close IN;
|
||||
|
||||
mtr_init_args(\$args);
|
||||
|
||||
mtr_add_arg($args, "--no-defaults");
|
||||
@@ -1245,12 +1271,14 @@ sub install_db ($$) {
|
||||
mtr_add_arg($args, "--character-sets-dir=%s", $path_charsetsdir);
|
||||
}
|
||||
|
||||
if ( mtr_run($exe_mysqld, $args, $init_db_sql,
|
||||
if ( mtr_run($exe_mysqld, $args, $init_db_sql_tmp,
|
||||
$path_manager_log, $path_manager_log, "") != 0 )
|
||||
{
|
||||
unlink($init_db_sql_tmp);
|
||||
mtr_error("Error executing mysqld --bootstrap\n" .
|
||||
"Could not install $type test DBs");
|
||||
}
|
||||
unlink($init_db_sql_tmp);
|
||||
}
|
||||
|
||||
|
||||
@@ -1499,8 +1527,8 @@ sub do_before_start_master ($$) {
|
||||
$tname ne "rpl_crash_binlog_ib_3b")
|
||||
{
|
||||
# FIXME we really want separate dir for binlogs
|
||||
`rm -fr $glob_mysql_test_dir/var/log/master-bin.*`;
|
||||
# unlink("$glob_mysql_test_dir/var/log/master-bin.*");
|
||||
`rm -f $glob_mysql_test_dir/var/log/master-bin*`;
|
||||
# unlink("$glob_mysql_test_dir/var/log/master-bin*");
|
||||
}
|
||||
|
||||
# Remove old master.info and relay-log.info files
|
||||
@@ -1509,8 +1537,7 @@ sub do_before_start_master ($$) {
|
||||
unlink("$glob_mysql_test_dir/var/master1-data/master.info");
|
||||
unlink("$glob_mysql_test_dir/var/master1-data/relay-log.info");
|
||||
|
||||
#run master initialization shell script if one exists
|
||||
|
||||
# Run master initialization shell script if one exists
|
||||
if ( $master_init_script and
|
||||
mtr_run($master_init_script, [], "", "", "", "") != 0 )
|
||||
{
|
||||
@@ -1524,9 +1551,6 @@ sub do_before_start_slave ($$) {
|
||||
my $tname= shift;
|
||||
my $slave_init_script= shift;
|
||||
|
||||
# When testing fail-safe replication, we will have more than one slave
|
||||
# in this case, we start secondary slaves with an argument
|
||||
|
||||
# Remove stale binary logs and old master.info files
|
||||
# except for too tests which need them
|
||||
if ( $tname ne "rpl_crash_binlog_ib_1b" and
|
||||
@@ -1541,14 +1565,15 @@ sub do_before_start_slave ($$) {
|
||||
unlink("$glob_mysql_test_dir/var/slave-data/relay-log.info");
|
||||
}
|
||||
|
||||
#run slave initialization shell script if one exists
|
||||
# Run slave initialization shell script if one exists
|
||||
if ( $slave_init_script and
|
||||
mtr_run($slave_init_script, [], "", "", "", "") != 0 )
|
||||
{
|
||||
mtr_error("Can't run $slave_init_script");
|
||||
}
|
||||
|
||||
unlink("$glob_mysql_test_dir/var/slave-data/log.*");
|
||||
`rm -f $glob_mysql_test_dir/var/slave-data/log.*`;
|
||||
# unlink("$glob_mysql_test_dir/var/slave-data/log.*");
|
||||
}
|
||||
|
||||
sub mysqld_arguments ($$$$$) {
|
||||
@@ -1666,12 +1691,12 @@ sub mysqld_arguments ($$$$$) {
|
||||
{
|
||||
if ( $type eq 'master' )
|
||||
{
|
||||
mtr_add_arg($args, "--debug=d:t:i:A,%s/var/log/master%s.trace",
|
||||
mtr_add_arg($args, "%s--debug=d:t:i:A,%s/var/log/master%s.trace",
|
||||
$prefix, $glob_mysql_test_dir, $sidx);
|
||||
}
|
||||
if ( $type eq 'slave' )
|
||||
{
|
||||
mtr_add_arg($args, "--debug=d:t:i:A,%s/var/log/slave%s.trace",
|
||||
mtr_add_arg($args, "%s--debug=d:t:i:A,%s/var/log/slave%s.trace",
|
||||
$prefix, $glob_mysql_test_dir, $sidx);
|
||||
}
|
||||
}
|
||||
@@ -1786,18 +1811,17 @@ sub mysqld_start ($$$$) {
|
||||
my $exe;
|
||||
my $pid;
|
||||
|
||||
# FIXME code duplication, make up your mind....
|
||||
if ( $opt_source_dist )
|
||||
if ( $type eq 'master' )
|
||||
{
|
||||
$exe= "$glob_basedir/sql/mysqld";
|
||||
$exe= $exe_master_mysqld;
|
||||
}
|
||||
elsif ( $type eq 'slave' )
|
||||
{
|
||||
$exe= $exe_slave_mysqld;
|
||||
}
|
||||
else
|
||||
{
|
||||
$exe ="$glob_basedir/libexec/mysqld";
|
||||
if ( ! -x $exe )
|
||||
{
|
||||
$exe ="$glob_basedir/bin/mysqld";
|
||||
}
|
||||
$exe= $exe_mysqld;
|
||||
}
|
||||
|
||||
mtr_init_args(\$args);
|
||||
@@ -1980,7 +2004,7 @@ sub run_mysqltest ($$) {
|
||||
mtr_add_arg($args, "--no-defaults");
|
||||
mtr_add_arg($args, "--socket=%s", $master->[0]->{'path_mysock'});
|
||||
mtr_add_arg($args, "--database=test");
|
||||
mtr_add_arg($args, "--user=%s", $glob_user);
|
||||
mtr_add_arg($args, "--user=%s", $opt_user);
|
||||
mtr_add_arg($args, "--password=");
|
||||
mtr_add_arg($args, "--silent");
|
||||
mtr_add_arg($args, "-v");
|
||||
@@ -2051,7 +2075,7 @@ sub run_mysqltest ($$) {
|
||||
mysqld_arguments($args,'master',0,$tinfo->{'master_opt'},[]);
|
||||
}
|
||||
|
||||
return mtr_run($exe_mysqltest,$args,$tinfo->{'path'},"",$path_timefile,"");
|
||||
return mtr_run_test($exe_mysqltest,$args,$tinfo->{'path'},"",$path_timefile,"");
|
||||
}
|
||||
|
||||
##############################################################################
|
||||
@@ -2133,6 +2157,7 @@ Misc options
|
||||
start-and-exit Only initiate and start the "mysqld" servers
|
||||
fast Don't try to cleanup from earlier runs
|
||||
help Get this help text
|
||||
unified-diff | udiff When presenting differences, use unified diff
|
||||
|
||||
Options not yet described, or that I want to look into more
|
||||
|
||||
|
||||
@@ -6,5 +6,5 @@ drop table t1;
|
||||
flush tables;
|
||||
CREATE TABLE t1 (a int) ENGINE=INNODB;
|
||||
SELECT * from T1;
|
||||
ERROR HY000: Can't open file: 'T1.ibd' (errno: 1)
|
||||
ERROR 42S02: Table 'test.T1' doesn't exist
|
||||
drop table t1;
|
||||
|
||||
@@ -32,6 +32,6 @@ flush tables;
|
||||
#
|
||||
|
||||
CREATE TABLE t1 (a int) ENGINE=INNODB;
|
||||
--error 1016
|
||||
--error 1146
|
||||
SELECT * from T1;
|
||||
drop table t1;
|
||||
|
||||
@@ -1497,7 +1497,7 @@ NDB_SOCKET_TYPE TransporterRegistry::connect_ndb_mgmd(SocketClient *sc)
|
||||
{
|
||||
char c[100];
|
||||
char *cs= &c[0];
|
||||
int len= strlen(sc->get_server_name())+20;
|
||||
unsigned len= strlen(sc->get_server_name())+20;
|
||||
if( len > sizeof(c) )
|
||||
{
|
||||
/*
|
||||
|
||||
@@ -154,6 +154,7 @@ Configuration::Configuration()
|
||||
_daemonMode = false;
|
||||
m_config_retriever= 0;
|
||||
m_clusterConfig= 0;
|
||||
m_clusterConfigIter= 0;
|
||||
}
|
||||
|
||||
Configuration::~Configuration(){
|
||||
@@ -363,6 +364,8 @@ Configuration::setupConfiguration(){
|
||||
|
||||
ConfigValues* cf = ConfigValuesFactory::extractCurrentSection(iter.m_config);
|
||||
|
||||
if(m_clusterConfigIter)
|
||||
ndb_mgm_destroy_iterator(m_clusterConfigIter);
|
||||
m_clusterConfigIter = ndb_mgm_create_configuration_iterator
|
||||
(p, CFG_SECTION_NODE);
|
||||
|
||||
|
||||
@@ -151,7 +151,7 @@ ndb_mgm_create_handle()
|
||||
h->socket = NDB_INVALID_SOCKET;
|
||||
h->read_timeout = 50000;
|
||||
h->write_timeout = 100;
|
||||
h->cfg_i = 0;
|
||||
h->cfg_i = -1;
|
||||
|
||||
strncpy(h->last_error_desc, "No error", NDB_MGM_MAX_ERR_DESC_SIZE);
|
||||
|
||||
@@ -178,7 +178,7 @@ ndb_mgm_set_connectstring(NdbMgmHandle handle, const char * mgmsrv)
|
||||
SET_ERROR(handle, NDB_MGM_ILLEGAL_CONNECT_STRING, "");
|
||||
return -1;
|
||||
}
|
||||
handle->cfg_i= 0;
|
||||
handle->cfg_i= -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -191,6 +191,10 @@ ndb_mgm_destroy_handle(NdbMgmHandle * handle)
|
||||
{
|
||||
if(!handle)
|
||||
return;
|
||||
/**
|
||||
* important! only disconnect if connected
|
||||
* other code relies on this
|
||||
*/
|
||||
if((* handle)->connected){
|
||||
ndb_mgm_disconnect(* handle);
|
||||
}
|
||||
@@ -1748,13 +1752,19 @@ ndb_mgm_get_configuration_nodeid(NdbMgmHandle handle)
|
||||
extern "C"
|
||||
int ndb_mgm_get_connected_port(NdbMgmHandle handle)
|
||||
{
|
||||
return handle->cfg.ids[handle->cfg_i].port;
|
||||
if (handle->cfg_i >= 0)
|
||||
return handle->cfg.ids[handle->cfg_i].port;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
const char *ndb_mgm_get_connected_host(NdbMgmHandle handle)
|
||||
{
|
||||
return handle->cfg.ids[handle->cfg_i].name.c_str();
|
||||
if (handle->cfg_i >= 0)
|
||||
return handle->cfg.ids[handle->cfg_i].name.c_str();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
extern "C"
|
||||
|
||||
@@ -189,16 +189,16 @@ MgmtSrvr::logLevelThreadRun()
|
||||
void
|
||||
MgmtSrvr::startEventLog()
|
||||
{
|
||||
NdbMutex_Lock(m_configMutex);
|
||||
|
||||
g_eventLogger.setCategory("MgmSrvr");
|
||||
|
||||
ndb_mgm_configuration_iterator * iter = ndb_mgm_create_configuration_iterator
|
||||
((ndb_mgm_configuration*)_config->m_configValues, CFG_SECTION_NODE);
|
||||
if(iter == 0)
|
||||
return ;
|
||||
|
||||
if(ndb_mgm_find(iter, CFG_NODE_ID, _ownNodeId) != 0){
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
return ;
|
||||
ndb_mgm_configuration_iterator
|
||||
iter(* _config->m_configValues, CFG_SECTION_NODE);
|
||||
|
||||
if(iter.find(CFG_NODE_ID, _ownNodeId) != 0){
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return;
|
||||
}
|
||||
|
||||
const char * tmp;
|
||||
@@ -206,10 +206,10 @@ MgmtSrvr::startEventLog()
|
||||
char *clusterLog= NdbConfig_ClusterLogFileName(_ownNodeId);
|
||||
NdbAutoPtr<char> tmp_aptr(clusterLog);
|
||||
|
||||
if(ndb_mgm_get_string_parameter(iter, CFG_LOG_DESTINATION, &tmp) == 0){
|
||||
if(iter.get(CFG_LOG_DESTINATION, &tmp) == 0){
|
||||
logdest.assign(tmp);
|
||||
}
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
|
||||
if(logdest.length() == 0 || logdest == "") {
|
||||
logdest.assfmt("FILE:filename=%s,maxsize=1000000,maxfiles=6",
|
||||
@@ -343,42 +343,41 @@ MgmtSrvr::getNodeCount(enum ndb_mgm_node_type type) const
|
||||
}
|
||||
|
||||
int
|
||||
MgmtSrvr::getPort() const {
|
||||
const Properties *mgmProps;
|
||||
|
||||
ndb_mgm_configuration_iterator * iter =
|
||||
ndb_mgm_create_configuration_iterator(_config->m_configValues,
|
||||
CFG_SECTION_NODE);
|
||||
if(iter == 0)
|
||||
MgmtSrvr::getPort() const
|
||||
{
|
||||
if(NdbMutex_Lock(m_configMutex))
|
||||
return 0;
|
||||
|
||||
if(ndb_mgm_find(iter, CFG_NODE_ID, getOwnNodeId()) != 0){
|
||||
ndb_mgm_configuration_iterator
|
||||
iter(* _config->m_configValues, CFG_SECTION_NODE);
|
||||
|
||||
if(iter.find(CFG_NODE_ID, getOwnNodeId()) != 0){
|
||||
ndbout << "Could not retrieve configuration for Node "
|
||||
<< getOwnNodeId() << " in config file." << endl
|
||||
<< "Have you set correct NodeId for this node?" << endl;
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
unsigned type;
|
||||
if(ndb_mgm_get_int_parameter(iter, CFG_TYPE_OF_SECTION, &type) != 0 ||
|
||||
if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0 ||
|
||||
type != NODE_TYPE_MGM){
|
||||
ndbout << "Local node id " << getOwnNodeId()
|
||||
<< " is not defined as management server" << endl
|
||||
<< "Have you set correct NodeId for this node?" << endl;
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
Uint32 port = 0;
|
||||
if(ndb_mgm_get_int_parameter(iter, CFG_MGM_PORT, &port) != 0){
|
||||
if(iter.get(CFG_MGM_PORT, &port) != 0){
|
||||
ndbout << "Could not find PortNumber in the configuration file." << endl;
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
|
||||
return port;
|
||||
}
|
||||
|
||||
@@ -472,14 +471,14 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server,
|
||||
|
||||
{
|
||||
ndb_mgm_configuration_iterator
|
||||
*iter = ndb_mgm_create_configuration_iterator(_config->m_configValues,
|
||||
CFG_SECTION_NODE);
|
||||
for(ndb_mgm_first(iter); ndb_mgm_valid(iter); ndb_mgm_next(iter)){
|
||||
iter(* _config->m_configValues, CFG_SECTION_NODE);
|
||||
|
||||
for(iter.first(); iter.valid(); iter.next()){
|
||||
unsigned type, id;
|
||||
if(ndb_mgm_get_int_parameter(iter, CFG_TYPE_OF_SECTION, &type) != 0)
|
||||
if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0)
|
||||
continue;
|
||||
|
||||
if(ndb_mgm_get_int_parameter(iter, CFG_NODE_ID, &id) != 0)
|
||||
if(iter.get(CFG_NODE_ID, &id) != 0)
|
||||
continue;
|
||||
|
||||
MGM_REQUIRE(id < MAX_NODES);
|
||||
@@ -502,7 +501,6 @@ MgmtSrvr::MgmtSrvr(SocketServer *socket_server,
|
||||
break;
|
||||
}
|
||||
}
|
||||
ndb_mgm_destroy_iterator(iter);
|
||||
}
|
||||
|
||||
_props = NULL;
|
||||
@@ -1884,8 +1882,6 @@ void
|
||||
MgmtSrvr::handleReceivedSignal(NdbApiSignal* signal)
|
||||
{
|
||||
// The way of handling a received signal is taken from the Ndb class.
|
||||
int returnCode;
|
||||
|
||||
int gsn = signal->readSignalNumber();
|
||||
|
||||
switch (gsn) {
|
||||
@@ -2187,8 +2183,13 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId,
|
||||
int r_config_addr= -1;
|
||||
unsigned type_c= 0;
|
||||
|
||||
if(NdbMutex_Lock(m_configMutex))
|
||||
{
|
||||
error_string.appfmt("unable to lock configuration mutex");
|
||||
return false;
|
||||
}
|
||||
ndb_mgm_configuration_iterator
|
||||
iter(*(ndb_mgm_configuration *)_config->m_configValues, CFG_SECTION_NODE);
|
||||
iter(* _config->m_configValues, CFG_SECTION_NODE);
|
||||
for(iter.first(); iter.valid(); iter.next()) {
|
||||
unsigned tmp= 0;
|
||||
if(iter.get(CFG_NODE_ID, &tmp)) abort();
|
||||
@@ -2258,6 +2259,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId,
|
||||
"Suggest specifying node id in connectstring,\n"
|
||||
"or specifying unique host names in config file.",
|
||||
id_found, tmp);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(false);
|
||||
}
|
||||
if (config_hostname == 0) {
|
||||
@@ -2270,6 +2272,7 @@ MgmtSrvr::alloc_node_id(NodeId * nodeId,
|
||||
}
|
||||
id_found= tmp; // mgmt server matched, check for more matches
|
||||
}
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
|
||||
if (id_found)
|
||||
{
|
||||
@@ -2682,13 +2685,18 @@ MgmtSrvr::Allocated_resources::get_nodeid() const
|
||||
int
|
||||
MgmtSrvr::setDbParameter(int node, int param, const char * value,
|
||||
BaseString& msg){
|
||||
|
||||
if(NdbMutex_Lock(m_configMutex))
|
||||
return -1;
|
||||
|
||||
/**
|
||||
* Check parameter
|
||||
*/
|
||||
ndb_mgm_configuration_iterator iter(* _config->m_configValues,
|
||||
CFG_SECTION_NODE);
|
||||
ndb_mgm_configuration_iterator
|
||||
iter(* _config->m_configValues, CFG_SECTION_NODE);
|
||||
if(iter.first() != 0){
|
||||
msg.assign("Unable to find node section (iter.first())");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2696,16 +2704,19 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value,
|
||||
if(node != 0){
|
||||
if(iter.find(CFG_NODE_ID, node) != 0){
|
||||
msg.assign("Unable to find node (iter.find())");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return -1;
|
||||
}
|
||||
if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0){
|
||||
msg.assign("Unable to get node type(iter.get(CFG_TYPE_OF_SECTION))");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return -1;
|
||||
}
|
||||
} else {
|
||||
do {
|
||||
if(iter.get(CFG_TYPE_OF_SECTION, &type) != 0){
|
||||
msg.assign("Unable to get node type(iter.get(CFG_TYPE_OF_SECTION))");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return -1;
|
||||
}
|
||||
if(type == NODE_TYPE_DB)
|
||||
@@ -2716,6 +2727,7 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value,
|
||||
if(type != NODE_TYPE_DB){
|
||||
msg.assfmt("Invalid node type or no such node (%d %d)",
|
||||
type, NODE_TYPE_DB);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@@ -2741,6 +2753,7 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value,
|
||||
break;
|
||||
}
|
||||
msg.assign("Could not get parameter");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return -1;
|
||||
} while(0);
|
||||
|
||||
@@ -2778,6 +2791,7 @@ MgmtSrvr::setDbParameter(int node, int param, const char * value,
|
||||
} while(node == 0 && iter.next() == 0);
|
||||
|
||||
msg.assign("Success");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2791,12 +2805,18 @@ MgmtSrvr::setConnectionDbParameter(int node1,
|
||||
|
||||
DBUG_ENTER("MgmtSrvr::setConnectionDbParameter");
|
||||
|
||||
ndb_mgm_configuration_iterator iter(* _config->m_configValues,
|
||||
CFG_SECTION_CONNECTION);
|
||||
if(NdbMutex_Lock(m_configMutex))
|
||||
{
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
ndb_mgm_configuration_iterator
|
||||
iter(* _config->m_configValues, CFG_SECTION_CONNECTION);
|
||||
|
||||
if(iter.first() != 0){
|
||||
msg.assign("Unable to find connection section (iter.first())");
|
||||
return -1;
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
for(;iter.valid();iter.next()) {
|
||||
@@ -2809,11 +2829,13 @@ MgmtSrvr::setConnectionDbParameter(int node1,
|
||||
}
|
||||
if(!iter.valid()) {
|
||||
msg.assign("Unable to find connection between nodes");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-2);
|
||||
}
|
||||
|
||||
if(iter.get(param, ¤t_value) < 0) {
|
||||
if(iter.get(param, ¤t_value) != 0) {
|
||||
msg.assign("Unable to get current value of parameter");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-3);
|
||||
}
|
||||
|
||||
@@ -2822,15 +2844,18 @@ MgmtSrvr::setConnectionDbParameter(int node1,
|
||||
|
||||
if(i2.set(param, (unsigned)value) == false) {
|
||||
msg.assign("Unable to set new value of parameter");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-4);
|
||||
}
|
||||
|
||||
if(iter.get(param, &new_value) < 0) {
|
||||
if(iter.get(param, &new_value) != 0) {
|
||||
msg.assign("Unable to get parameter after setting it.");
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-5);
|
||||
}
|
||||
|
||||
msg.assfmt("%u -> %u",current_value,new_value);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
@@ -2843,16 +2868,22 @@ MgmtSrvr::getConnectionDbParameter(int node1,
|
||||
BaseString& msg){
|
||||
DBUG_ENTER("MgmtSrvr::getConnectionDbParameter");
|
||||
|
||||
ndb_mgm_configuration_iterator iter(* _config->m_configValues,
|
||||
CFG_SECTION_CONNECTION);
|
||||
if(NdbMutex_Lock(m_configMutex))
|
||||
{
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
ndb_mgm_configuration_iterator
|
||||
iter(* _config->m_configValues, CFG_SECTION_CONNECTION);
|
||||
|
||||
if(iter.first() != 0){
|
||||
msg.assign("Unable to find connection section (iter.first())");
|
||||
return -1;
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
for(;iter.valid();iter.next()) {
|
||||
Uint32 n1,n2;
|
||||
Uint32 n1=0,n2=0;
|
||||
iter.get(CFG_CONNECTION_NODE_1, &n1);
|
||||
iter.get(CFG_CONNECTION_NODE_2, &n2);
|
||||
if((n1 == (unsigned)node1 && n2 == (unsigned)node2)
|
||||
@@ -2861,21 +2892,35 @@ MgmtSrvr::getConnectionDbParameter(int node1,
|
||||
}
|
||||
if(!iter.valid()) {
|
||||
msg.assign("Unable to find connection between nodes");
|
||||
return -1;
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
if(iter.get(param, (Uint32*)value) < 0) {
|
||||
if(iter.get(param, (Uint32*)value) != 0) {
|
||||
msg.assign("Unable to get current value of parameter");
|
||||
return -1;
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(-1);
|
||||
}
|
||||
|
||||
msg.assfmt("%d",*value);
|
||||
NdbMutex_Unlock(m_configMutex);
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
void MgmtSrvr::transporter_connect(NDB_SOCKET_TYPE sockfd)
|
||||
{
|
||||
theFacade->get_registry()->connect_server(sockfd);
|
||||
if (theFacade->get_registry()->connect_server(sockfd))
|
||||
{
|
||||
/**
|
||||
* Force an update_connections() so that the
|
||||
* ClusterMgr and TransporterFacade is up to date
|
||||
* with the new connection.
|
||||
* Important for correct node id reservation handling
|
||||
*/
|
||||
NdbMutex_Lock(theFacade->theMutexPtr);
|
||||
theFacade->get_registry()->update_connections();
|
||||
NdbMutex_Unlock(theFacade->theMutexPtr);
|
||||
}
|
||||
}
|
||||
|
||||
int MgmtSrvr::set_connect_string(const char *str)
|
||||
|
||||
@@ -318,7 +318,7 @@ MgmApiSession::runSession() {
|
||||
break;
|
||||
}
|
||||
}
|
||||
if(m_socket >= 0)
|
||||
if(m_socket != NDB_INVALID_SOCKET)
|
||||
NDB_CLOSE_SOCKET(m_socket);
|
||||
}
|
||||
|
||||
@@ -1547,7 +1547,7 @@ MgmApiSession::transporter_connect(Parser_t::Context &ctx,
|
||||
|
||||
m_stop= true;
|
||||
m_stopped= true; // force a stop (no closing socket)
|
||||
m_socket= -1; // so nobody closes it
|
||||
m_socket= NDB_INVALID_SOCKET; // so nobody closes it
|
||||
|
||||
m_mgmsrv.transporter_connect(s);
|
||||
}
|
||||
|
||||
@@ -410,7 +410,13 @@ ClusterMgr::reportConnected(NodeId nodeId){
|
||||
theNode.connected = true;
|
||||
theNode.hbSent = 0;
|
||||
theNode.hbCounter = 0;
|
||||
|
||||
|
||||
/**
|
||||
* make sure the node itself is marked connected even
|
||||
* if first API_REGCONF has not arrived
|
||||
*/
|
||||
theNode.m_state.m_connected_nodes.set(nodeId);
|
||||
|
||||
if (theNode.m_info.m_type != NodeInfo::REP) {
|
||||
theNode.hbFrequency = 0;
|
||||
}
|
||||
|
||||
@@ -535,22 +535,31 @@ innobase_mysql_print_thd(
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
Determines whether the given character set is of variable length.
|
||||
Get the variable length bounds of the given character set.
|
||||
|
||||
NOTE that the exact prototype of this function has to be in
|
||||
/innobase/data/data0type.ic! */
|
||||
extern "C"
|
||||
ibool
|
||||
innobase_is_mb_cset(
|
||||
/*================*/
|
||||
ulint cset) /* in: MySQL charset-collation code */
|
||||
void
|
||||
innobase_get_cset_width(
|
||||
/*====================*/
|
||||
ulint cset, /* in: MySQL charset-collation code */
|
||||
ulint* mbminlen, /* out: minimum length of a char (in bytes) */
|
||||
ulint* mbmaxlen) /* out: maximum length of a char (in bytes) */
|
||||
{
|
||||
CHARSET_INFO* cs;
|
||||
ut_ad(cset < 256);
|
||||
ut_ad(mbminlen);
|
||||
ut_ad(mbmaxlen);
|
||||
|
||||
cs = all_charsets[cset];
|
||||
|
||||
return(cs && cs->mbminlen != cs->mbmaxlen);
|
||||
if (cs) {
|
||||
*mbminlen = cs->mbminlen;
|
||||
*mbmaxlen = cs->mbmaxlen;
|
||||
} else {
|
||||
ut_a(cset == 0);
|
||||
*mbminlen = *mbmaxlen = 0;
|
||||
}
|
||||
}
|
||||
|
||||
/**********************************************************************
|
||||
@@ -1079,6 +1088,8 @@ innobase_init(void)
|
||||
if (ret == FALSE) {
|
||||
sql_print_error(
|
||||
"InnoDB: syntax error in innodb_data_file_path");
|
||||
my_free(internal_innobase_data_file_path,
|
||||
MYF(MY_ALLOW_ZERO_PTR));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
@@ -1109,6 +1120,8 @@ innobase_init(void)
|
||||
"InnoDB: syntax error in innodb_log_group_home_dir\n"
|
||||
"InnoDB: or a wrong number of mirrored log groups\n");
|
||||
|
||||
my_free(internal_innobase_data_file_path,
|
||||
MYF(MY_ALLOW_ZERO_PTR));
|
||||
DBUG_RETURN(TRUE);
|
||||
}
|
||||
|
||||
@@ -1155,11 +1168,11 @@ innobase_init(void)
|
||||
|
||||
srv_fast_shutdown = (ibool) innobase_fast_shutdown;
|
||||
|
||||
srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite;
|
||||
srv_use_checksums = (ibool) innobase_use_checksums;
|
||||
srv_use_doublewrite_buf = (ibool) innobase_use_doublewrite;
|
||||
srv_use_checksums = (ibool) innobase_use_checksums;
|
||||
|
||||
os_use_large_pages = (ibool) innobase_use_large_pages;
|
||||
os_large_page_size = (ulint) innobase_large_page_size;
|
||||
os_use_large_pages = (ibool) innobase_use_large_pages;
|
||||
os_large_page_size = (ulint) innobase_large_page_size;
|
||||
|
||||
srv_file_per_table = (ibool) innobase_file_per_table;
|
||||
srv_locks_unsafe_for_binlog = (ibool) innobase_locks_unsafe_for_binlog;
|
||||
@@ -1197,7 +1210,8 @@ innobase_init(void)
|
||||
err = innobase_start_or_create_for_mysql();
|
||||
|
||||
if (err != DB_SUCCESS) {
|
||||
|
||||
my_free(internal_innobase_data_file_path,
|
||||
MYF(MY_ALLOW_ZERO_PTR));
|
||||
DBUG_RETURN(1);
|
||||
}
|
||||
|
||||
@@ -1241,23 +1255,23 @@ innobase_end(void)
|
||||
set_panic_flag_for_netware();
|
||||
}
|
||||
#endif
|
||||
if (innodb_inited)
|
||||
{
|
||||
if (innobase_very_fast_shutdown) {
|
||||
srv_very_fast_shutdown = TRUE;
|
||||
fprintf(stderr,
|
||||
if (innodb_inited) {
|
||||
if (innobase_very_fast_shutdown) {
|
||||
srv_very_fast_shutdown = TRUE;
|
||||
fprintf(stderr,
|
||||
"InnoDB: MySQL has requested a very fast shutdown without flushing\n"
|
||||
"InnoDB: the InnoDB buffer pool to data files. At the next mysqld startup\n"
|
||||
"InnoDB: InnoDB will do a crash recovery!\n");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
innodb_inited= 0;
|
||||
if (innobase_shutdown_for_mysql() != DB_SUCCESS)
|
||||
err= 1;
|
||||
hash_free(&innobase_open_tables);
|
||||
my_free(internal_innobase_data_file_path,MYF(MY_ALLOW_ZERO_PTR));
|
||||
pthread_mutex_destroy(&innobase_mutex);
|
||||
innodb_inited = 0;
|
||||
if (innobase_shutdown_for_mysql() != DB_SUCCESS) {
|
||||
err = 1;
|
||||
}
|
||||
hash_free(&innobase_open_tables);
|
||||
my_free(internal_innobase_data_file_path,
|
||||
MYF(MY_ALLOW_ZERO_PTR));
|
||||
pthread_mutex_destroy(&innobase_mutex);
|
||||
}
|
||||
|
||||
DBUG_RETURN(err);
|
||||
@@ -1861,7 +1875,7 @@ ha_innobase::open(
|
||||
my_free((char*) upd_buff, MYF(0));
|
||||
my_errno = ENOENT;
|
||||
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(HA_ERR_NO_SUCH_TABLE);
|
||||
}
|
||||
|
||||
if (ib_table->ibd_file_missing && !thd->tablespace_op) {
|
||||
@@ -1878,7 +1892,7 @@ ha_innobase::open(
|
||||
my_free((char*) upd_buff, MYF(0));
|
||||
my_errno = ENOENT;
|
||||
|
||||
DBUG_RETURN(1);
|
||||
DBUG_RETURN(HA_ERR_NO_SUCH_TABLE);
|
||||
}
|
||||
|
||||
innobase_prebuilt = row_create_prebuilt(ib_table);
|
||||
@@ -2475,6 +2489,8 @@ build_template(
|
||||
templ->type = get_innobase_type_from_mysql_type(field);
|
||||
templ->charset = dtype_get_charset_coll_noninline(
|
||||
index->table->cols[i].type.prtype);
|
||||
templ->mbminlen = index->table->cols[i].type.mbminlen;
|
||||
templ->mbmaxlen = index->table->cols[i].type.mbmaxlen;
|
||||
templ->is_unsigned = (ulint) (field->flags & UNSIGNED_FLAG);
|
||||
|
||||
if (templ->type == DATA_BLOB) {
|
||||
|
||||
@@ -1189,7 +1189,7 @@ int bin2decimal(char *from, decimal *to, int precision, int scale)
|
||||
intg0=intg/DIG_PER_DEC1, frac0=scale/DIG_PER_DEC1,
|
||||
intg0x=intg-intg0*DIG_PER_DEC1, frac0x=scale-frac0*DIG_PER_DEC1,
|
||||
intg1=intg0+(intg0x>0), frac1=frac0+(frac0x>0);
|
||||
dec1 *buf=to->buf, mask=(*from <0) ? 0 : -1;
|
||||
dec1 *buf=to->buf, mask=(*from & 0x80) ? 0 : -1;
|
||||
char *stop;
|
||||
char *d_copy;
|
||||
int bin_size= decimal_bin_size(precision, scale);
|
||||
|
||||
Reference in New Issue
Block a user