summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <monty@hundin.mysql.fi>2001-11-07 00:19:36 +0200
committerunknown <monty@hundin.mysql.fi>2001-11-07 00:19:36 +0200
commitd207a0c2f022d0a65e95cddf8a1dc957f0e0a34e (patch)
treef1c7979e7d8282f034f3cabdfe558293a7f7c2f4
parent228408a8c54e34922832082c0e36c1e87f224873 (diff)
parent3c0487c4c31c516c745a020f2c1b2e836cb28d86 (diff)
downloadmariadb-git-d207a0c2f022d0a65e95cddf8a1dc957f0e0a34e.tar.gz
merge
innobase/include/srv0srv.h: Auto merged mysql-test/mysql-test-run.sh: Auto merged innobase/srv/srv0srv.c: Auto merged innobase/srv/srv0start.c: Auto merged scripts/make_binary_distribution.sh: Auto merged sql/ha_innobase.cc: Auto merged
-rw-r--r--innobase/include/os0sync.h2
-rw-r--r--innobase/include/os0sync.ic14
-rw-r--r--innobase/include/srv0srv.h3
-rw-r--r--innobase/os/os0sync.c15
-rw-r--r--innobase/row/row0mysql.c34
-rw-r--r--innobase/srv/srv0srv.c47
-rw-r--r--innobase/srv/srv0start.c7
-rw-r--r--myisam/mi_open.c7
-rw-r--r--mysql-test/mysql-test-run.sh1
-rw-r--r--scripts/make_binary_distribution.sh2
-rw-r--r--scripts/mysqlhotcopy.sh111
-rw-r--r--sql/ha_innobase.cc8
-rw-r--r--sql/item_timefunc.cc2
13 files changed, 207 insertions, 46 deletions
diff --git a/innobase/include/os0sync.h b/innobase/include/os0sync.h
index 26f7dff5d8b..617f6b036fe 100644
--- a/innobase/include/os0sync.h
+++ b/innobase/include/os0sync.h
@@ -163,7 +163,7 @@ os_fast_mutex_trylock(
#endif
/**************************************************************
Releases ownership of a fast mutex. */
-UNIV_INLINE
+
void
os_fast_mutex_unlock(
/*=================*/
diff --git a/innobase/include/os0sync.ic b/innobase/include/os0sync.ic
index 057ad424dee..aa00300dec5 100644
--- a/innobase/include/os0sync.ic
+++ b/innobase/include/os0sync.ic
@@ -40,17 +40,3 @@ os_fast_mutex_trylock(
}
#endif
-/**************************************************************
-Releases ownership of a fast mutex. */
-UNIV_INLINE
-void
-os_fast_mutex_unlock(
-/*=================*/
- os_fast_mutex_t* fast_mutex) /* in: mutex to release */
-{
-#ifdef __WIN__
- LeaveCriticalSection(fast_mutex);
-#else
- pthread_mutex_unlock(fast_mutex);
-#endif
-}
diff --git a/innobase/include/srv0srv.h b/innobase/include/srv0srv.h
index df8e85d05f7..bae0aa89da9 100644
--- a/innobase/include/srv0srv.h
+++ b/innobase/include/srv0srv.h
@@ -66,6 +66,9 @@ extern char* srv_unix_file_flush_method_str;
extern ulint srv_unix_file_flush_method;
extern ulint srv_force_recovery;
extern ulint srv_thread_concurrency;
+
+extern lint srv_conc_n_threads;
+
extern ibool srv_fast_shutdown;
extern ibool srv_use_doublewrite_buf;
diff --git a/innobase/os/os0sync.c b/innobase/os/os0sync.c
index 8da142cd4a6..2cf5160d055 100644
--- a/innobase/os/os0sync.c
+++ b/innobase/os/os0sync.c
@@ -455,6 +455,21 @@ os_fast_mutex_lock(
}
/**************************************************************
+Releases ownership of a fast mutex. */
+
+void
+os_fast_mutex_unlock(
+/*=================*/
+ os_fast_mutex_t* fast_mutex) /* in: mutex to release */
+{
+#ifdef __WIN__
+ LeaveCriticalSection(fast_mutex);
+#else
+ pthread_mutex_unlock(fast_mutex);
+#endif
+}
+
+/**************************************************************
Frees a mutex object. */
void
diff --git a/innobase/row/row0mysql.c b/innobase/row/row0mysql.c
index 45de25437e1..3b7275da8d7 100644
--- a/innobase/row/row0mysql.c
+++ b/innobase/row/row0mysql.c
@@ -946,11 +946,27 @@ row_create_table_for_mysql(
"InnoDB: mysqld and edit my.cnf so that newraw is replaced\n"
"InnoDB: with raw, and innodb_force_... is removed.\n");
+ trx_commit_for_mysql(trx);
+
return(DB_ERROR);
}
trx->op_info = (char *) "creating table";
+ if (0 == ut_strcmp(table->name, "mysql/host")
+ || 0 == ut_strcmp(table->name, "mysql/user")
+ || 0 == ut_strcmp(table->name, "mysql/db")) {
+
+ fprintf(stderr,
+ "InnoDB: Error: trying to create a MySQL system table %s of type InnoDB.\n"
+ "InnoDB: MySQL system tables must be of the MyISAM type!\n",
+ table->name);
+
+ trx_commit_for_mysql(trx);
+
+ return(DB_ERROR);
+ }
+
trx_start_if_not_started(trx);
namelen = ut_strlen(table->name);
@@ -1428,6 +1444,8 @@ funct_exit:
que_graph_free(graph);
+ trx_commit_for_mysql(trx);
+
trx->op_info = (char *) "";
return((int) err);
@@ -1513,6 +1531,20 @@ row_rename_table_for_mysql(
"InnoDB: mysqld and edit my.cnf so that newraw is replaced\n"
"InnoDB: with raw, and innodb_force_... is removed.\n");
+ trx_commit_for_mysql(trx);
+ return(DB_ERROR);
+ }
+
+ if (0 == ut_strcmp(new_name, "mysql/host")
+ || 0 == ut_strcmp(new_name, "mysql/user")
+ || 0 == ut_strcmp(new_name, "mysql/db")) {
+
+ fprintf(stderr,
+ "InnoDB: Error: trying to create a MySQL system table %s of type InnoDB.\n"
+ "InnoDB: MySQL system tables must be of the MyISAM type!\n",
+ new_name);
+
+ trx_commit_for_mysql(trx);
return(DB_ERROR);
}
@@ -1596,6 +1628,8 @@ funct_exit:
que_graph_free(graph);
+ trx_commit_for_mysql(trx);
+
trx->op_info = (char *) "";
return((int) err);
diff --git a/innobase/srv/srv0srv.c b/innobase/srv/srv0srv.c
index a9de3418eb7..7f90c295b41 100644
--- a/innobase/srv/srv0srv.c
+++ b/innobase/srv/srv0srv.c
@@ -121,12 +121,17 @@ semaphore contention and convoy problems can occur withput this restriction.
Value 10 should be good if there are less than 4 processors + 4 disks in the
computer. Bigger computers need bigger values. */
-ulint srv_thread_concurrency = 4;
+ulint srv_thread_concurrency = 8;
os_fast_mutex_t srv_conc_mutex; /* this mutex protects srv_conc data
structures */
-ulint srv_conc_n_threads = 0; /* number of OS threads currently
- inside InnoDB */
+lint srv_conc_n_threads = 0; /* number of OS threads currently
+ inside InnoDB; it is not an error
+ if this drops temporarily below zero
+ because we do not demand that every
+ thread increments this, but a thread
+ waiting for a lock decrements this
+ temporarily */
typedef struct srv_conc_slot_struct srv_conc_slot_t;
struct srv_conc_slot_struct{
@@ -1646,7 +1651,7 @@ srv_conc_enter_innodb(
os_fast_mutex_lock(&srv_conc_mutex);
- if (srv_conc_n_threads < srv_thread_concurrency) {
+ if (srv_conc_n_threads < (lint)srv_thread_concurrency) {
srv_conc_n_threads++;
os_fast_mutex_unlock(&srv_conc_mutex);
@@ -1654,7 +1659,7 @@ srv_conc_enter_innodb(
return;
}
- /* Too many threads inside: put to the current thread to a queue */
+ /* Too many threads inside: put the current thread to a queue */
for (i = 0; i < OS_THREAD_MAX_N; i++) {
slot = srv_conc_slots + i;
@@ -1734,11 +1739,9 @@ srv_conc_exit_innodb(void)
os_fast_mutex_lock(&srv_conc_mutex);
- ut_a(srv_conc_n_threads > 0);
-
srv_conc_n_threads--;
- if (srv_conc_n_threads < srv_thread_concurrency) {
+ if (srv_conc_n_threads < (lint)srv_thread_concurrency) {
/* Look for a slot where a thread is waiting and no other
thread has yet released the thread */
@@ -1985,16 +1988,18 @@ srv_lock_timeout_and_monitor_thread(
void* arg) /* in: a dummy parameter required by
os_thread_create */
{
+ srv_slot_t* slot;
double time_elapsed;
time_t current_time;
time_t last_monitor_time;
+ time_t last_table_monitor_time;
ibool some_waits;
- srv_slot_t* slot;
double wait_time;
ulint i;
UT_NOT_USED(arg);
last_monitor_time = time(NULL);
+ last_table_monitor_time = time(NULL);
loop:
srv_lock_timeout_and_monitor_active = TRUE;
@@ -2056,7 +2061,7 @@ loop:
"ROW OPERATIONS\n"
"--------------\n");
printf(
- "%lu queries inside InnoDB; main thread: %s\n",
+ "%ld queries inside InnoDB; main thread: %s\n",
srv_conc_n_threads, srv_main_thread_op_info);
printf(
"Number of rows inserted %lu, updated %lu, deleted %lu, read %lu\n",
@@ -2083,12 +2088,13 @@ loop:
printf("----------------------------\n"
"END OF INNODB MONITOR OUTPUT\n"
"============================\n");
-
-
}
- if (srv_print_innodb_tablespace_monitor) {
-
+ if (srv_print_innodb_tablespace_monitor
+ && difftime(current_time, last_table_monitor_time) > 60) {
+
+ last_table_monitor_time = time(NULL);
+
printf("================================================\n");
ut_print_timestamp(stdout);
@@ -2105,7 +2111,10 @@ loop:
"=======================================\n");
}
- if (srv_print_innodb_table_monitor) {
+ if (srv_print_innodb_table_monitor
+ && difftime(current_time, last_table_monitor_time) > 60) {
+
+ last_table_monitor_time = time(NULL);
printf("===========================================\n");
@@ -2208,7 +2217,13 @@ loop:
os_thread_sleep(10000000);
sync_array_print_long_waits();
-
+
+ /* Flush stdout and stderr so that a database user gets their output
+ to possible MySQL error file */
+
+ fflush(stderr);
+ fflush(stdout);
+
if (srv_shutdown_state < SRV_SHUTDOWN_LAST_PHASE) {
goto loop;
diff --git a/innobase/srv/srv0start.c b/innobase/srv/srv0start.c
index a6e11364d67..702386a1a99 100644
--- a/innobase/srv/srv0start.c
+++ b/innobase/srv/srv0start.c
@@ -1004,6 +1004,13 @@ innobase_shutdown_for_mysql(void)
logs_empty_and_mark_files_at_shutdown();
+ if (srv_conc_n_threads != 0) {
+ fprintf(stderr,
+ "InnoDB: Warning: query counter shows %ld queries still\n"
+ "InnoDB: inside InnoDB at shutdown\n",
+ srv_conc_n_threads);
+ }
+
ut_free_all_mem();
return((int) DB_SUCCESS);
diff --git a/myisam/mi_open.c b/myisam/mi_open.c
index 7e72b818751..64707479d11 100644
--- a/myisam/mi_open.c
+++ b/myisam/mi_open.c
@@ -305,16 +305,16 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
}
}
}
- if (share->keyinfo[i].flag & HA_FULLTEXT) /* SerG */
+ if (share->keyinfo[i].flag & HA_FULLTEXT)
{
- share->keyinfo[i].seg=pos-FT_SEGS; /* SerG */
+ share->keyinfo[i].seg=pos-FT_SEGS;
share->fulltext_index=1;
}
share->keyinfo[i].end=pos;
pos->type=HA_KEYTYPE_END; /* End */
pos->length=share->base.rec_reflength;
pos->null_bit=0;
- pos->flag=0;
+ pos->flag=0; /* For purify */
pos++;
}
for (i=0 ; i < uniques ; i++)
@@ -338,6 +338,7 @@ MI_INFO *mi_open(const char *name, int mode, uint open_flags)
share->uniqueinfo[i].end=pos;
pos->type=HA_KEYTYPE_END; /* End */
pos->null_bit=0;
+ pos->flag=0;
pos++;
}
}
diff --git a/mysql-test/mysql-test-run.sh b/mysql-test/mysql-test-run.sh
index 57e5b5763f3..b52fd3f5b94 100644
--- a/mysql-test/mysql-test-run.sh
+++ b/mysql-test/mysql-test-run.sh
@@ -633,6 +633,7 @@ start_master()
--basedir=$MY_BASEDIR --init-rpl-role=master \
--port=$MASTER_MYPORT \
--exit-info=256 \
+ --core
--datadir=$MASTER_MYDDIR \
--pid-file=$MASTER_MYPID \
--socket=$MASTER_MYSOCK \
diff --git a/scripts/make_binary_distribution.sh b/scripts/make_binary_distribution.sh
index b743e228a0f..e6df1870311 100644
--- a/scripts/make_binary_distribution.sh
+++ b/scripts/make_binary_distribution.sh
@@ -63,7 +63,7 @@ done
for i in extra/comp_err extra/replace extra/perror extra/resolveip \
extra/my_print_defaults extra/resolve_stack_dump \
isam/isamchk isam/pack_isam myisam/myisamchk \
- myisam/myisampack sql/mysqld sql/mysqlbinlog \
+ myisam/myisampack sql/mysqld client/mysqlbinlog \
client/mysql sql/mysqld client/mysqlshow client/mysqlcheck \
client/mysqladmin client/mysqldump client/mysqlimport client/mysqltest \
client/mysqlmanagerc client/mysqlmanager-pwgen tools/mysqlmanager \
diff --git a/scripts/mysqlhotcopy.sh b/scripts/mysqlhotcopy.sh
index 71359fa5612..655e5a2a52b 100644
--- a/scripts/mysqlhotcopy.sh
+++ b/scripts/mysqlhotcopy.sh
@@ -6,6 +6,7 @@ use Data::Dumper;
use File::Basename;
use File::Path;
use DBI;
+use Sys::Hostname;
=head1 NAME
@@ -36,7 +37,7 @@ WARNING: THIS PROGRAM IS STILL IN BETA. Comments/patches welcome.
# Documentation continued at end of file
-my $VERSION = "1.12";
+my $VERSION = "1.13";
my $opt_tmpdir = $ENV{TMPDIR} || "/tmp";
@@ -68,6 +69,7 @@ Usage: $0 db_name[./table_regex/] [new_db_name | directory]
--resetmaster reset the binlog once all tables are locked
--resetslave reset the master.info once all tables are locked
--tmpdir=# temporary directory (instead of $opt_tmpdir)
+ --record_log_pos=# record slave and master status in specified db.table
Try \'perldoc $0 for more complete documentation\'
_OPTIONS
@@ -101,6 +103,7 @@ GetOptions( \%opt,
"regexp=s",
"suffix=s",
"checkpoint=s",
+ "record_log_pos=s",
"flushlog",
"resetmaster",
"resetslave",
@@ -117,6 +120,7 @@ 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
+# 'index' - array-ref to list of indexes to be copied
#
my @db_desc = ();
@@ -172,6 +176,16 @@ if ( $opt{checkpoint} ) {
if ( $@ );
}
+# --- check that log_pos table exists if specified ---
+if ( $opt{record_log_pos} ) {
+ eval { $dbh->do( qq{ select host, time_stamp, log_file, log_pos, master_host, master_log_file, master_log_pos
+ from $opt{record_log_pos} where 1 != 1} );
+ };
+
+ die "Error accessing log_pos table ($opt{record_log_pos}): $@"
+ if ( $@ );
+}
+
# --- get variables from database ---
my $sth_vars = $dbh->prepare("show variables like 'datadir'");
$sth_vars->execute;
@@ -294,8 +308,6 @@ foreach my $rdb ( @db_desc ) {
# --- resolve targets for copies ---
-my @targets = ();
-
if (defined($tgt_name) && length $tgt_name ) {
# explicit destination directory specified
@@ -382,11 +394,12 @@ foreach my $rdb ( @db_desc ) {
# read lock all the tables we'll be copying
# in order to get a consistent snapshot of the database
-if ( $opt{checkpoint} ) {
- # convert existing READ lock on checkpoint table into WRITE lock
- unless ( $hc_locks =~ s/$opt{checkpoint}\s+READ/$opt{checkpoint} WRITE/ ) {
- $hc_locks .= ", $opt{checkpoint} WRITE";
- }
+if ( $opt{checkpoint} || $opt{record_log_pos} ) {
+ # convert existing READ lock on checkpoint and/or log_pos table into WRITE lock
+ foreach my $table ( grep { defined } ( $opt{checkpoint}, $opt{record_log_pos} ) ) {
+ $hc_locks .= ", $table WRITE"
+ unless ( $hc_locks =~ s/$table\s+READ/$table WRITE/ );
+ }
}
my $hc_started = time; # count from time lock is granted
@@ -411,6 +424,11 @@ else {
$dbh->do( "FLUSH LOGS" ) if ( $opt{flushlog} );
$dbh->do( "RESET MASTER" ) if ( $opt{resetmaster} );
$dbh->do( "RESET SLAVE" ) if ( $opt{resetslave} );
+
+ if ( $opt{record_log_pos} ) {
+ record_log_pos( $dbh, $opt{record_log_pos} );
+ $dbh->do("FLUSH TABLES /*!32323 $hc_tables */");
+ }
}
my @failed = ();
@@ -473,6 +491,12 @@ if ( @failed ) {
# delete any @targets
# rename _old copy back to original
+ my @targets = ();
+ foreach my $rdb ( @db_desc ) {
+ push @targets, $rdb->{target} if ( -d $rdb->{target} );
+ }
+ print "Deleting @targets \n" if $opt{debug};
+
print "Deleting @targets \n" if $opt{debug};
rmtree([@targets]);
if (@existing) {
@@ -603,7 +627,6 @@ sub safe_system
}
}
-
sub retire_directory {
my ( @dir ) = @_;
@@ -625,6 +648,40 @@ sub retire_directory {
}
}
+sub record_log_pos {
+ my ( $dbh, $table_name ) = @_;
+
+ eval {
+ my ($file,$position) = get_row( $dbh, "show master status" );
+ die "master status is undefined" if !defined $file || !defined $position;
+
+ my ($master_host, undef, undef, undef, $log_file, $log_pos )
+ = get_row( $dbh, "show slave status" );
+
+ my $hostname = hostname();
+
+ $dbh->do( qq{ replace into $table_name
+ set host=?, log_file=?, log_pos=?,
+ master_host=?, master_log_file=?, master_log_pos=? },
+ undef,
+ $hostname, $file, $position,
+ $master_host, $log_file, $log_pos );
+
+ };
+
+ if ( $@ ) {
+ warn "Failed to store master position: $@\n";
+ }
+}
+
+sub get_row {
+ my ( $dbh, $sql ) = @_;
+
+ my $sth = $dbh->prepare($sql);
+ $sth->execute;
+ return $sth->fetchrow_array();
+}
+
__END__
=head1 DESCRIPTION
@@ -659,6 +716,38 @@ The checkpoint-table must contain at least the following fields:
=back
+=item --record_log_pos log-pos-table
+
+Just before the database files are copied, update the record in the
+log-pos-table from the values returned from "show master status" and
+"show slave status". The master status values are stored in the
+log_file and log_pos columns, and establish the position in the binary
+logs that any slaves of this host should adopt if initialised from
+this dump. The slave status values are stored in master_host,
+master_log_file, and master_log_pos, and these are useful if the host
+performing the dump is a slave and other sibling slaves are to be
+initialised from this dump.
+
+The name of the log-pos table should be supplied in database.table format.
+A sample log-pos table definition:
+
+=over 4
+
+CREATE TABLE log_pos (
+ host varchar(60) NOT null,
+ time_stamp timestamp(14) NOT NULL,
+ log_file varchar(32) default NULL,
+ log_pos int(11) default NULL,
+ master_host varchar(60) NULL,
+ master_log_file varchar(32) NULL,
+ master_log_pos int NULL,
+
+ PRIMARY KEY (host)
+);
+
+=back
+
+
=item --suffix suffix
Each database is copied back into the originating datadir under
@@ -784,7 +873,7 @@ Study the code inside this script and only rely on it if I<you> believe
that it does the right thing for you.
Patches adding bug fixes, documentation and new features are welcome.
-Please send these to internals@mysql.com.
+Please send these to internals@lists.mysql.com.
=head1 TO DO
@@ -814,6 +903,8 @@ Add support for forthcoming MySQL ``RAID'' table subdirectory layouts.
Tim Bunce
Martin Waite - added checkpoint, flushlog, regexp and dryrun options
+ Fixed cleanup of targets when hotcopy fails.
+ Added --record_log_pos.
Ralph Corderoy - added synonyms for commands
diff --git a/sql/ha_innobase.cc b/sql/ha_innobase.cc
index 4f3560290cf..3ff3e15e88e 100644
--- a/sql/ha_innobase.cc
+++ b/sql/ha_innobase.cc
@@ -1472,7 +1472,9 @@ ha_innobase::write_row(
The lock is released at each SQL statement's
end. */
+ srv_conc_enter_innodb(prebuilt->trx);
error = row_lock_table_autoinc_for_mysql(prebuilt);
+ srv_conc_exit_innodb();
if (error != DB_SUCCESS) {
@@ -1523,7 +1525,9 @@ ha_innobase::write_row(
auto_inc = table->next_number_field->val_int();
+ srv_conc_enter_innodb(prebuilt->trx);
error = row_lock_table_autoinc_for_mysql(prebuilt);
+ srv_conc_exit_innodb();
if (error != DB_SUCCESS) {
@@ -2803,6 +2807,8 @@ ha_innobase::delete_table(
srv_active_wake_master_thread();
+ trx_commit_for_mysql(trx);
+
trx_free_for_mysql(trx);
error = convert_error_code_to_mysql(error);
@@ -2856,6 +2862,7 @@ innobase_drop_database(
srv_active_wake_master_thread();
+ trx_commit_for_mysql(trx);
trx_free_for_mysql(trx);
error = convert_error_code_to_mysql(error);
@@ -2908,6 +2915,7 @@ ha_innobase::rename_table(
srv_active_wake_master_thread();
+ trx_commit_for_mysql(trx);
trx_free_for_mysql(trx);
error = convert_error_code_to_mysql(error);
diff --git a/sql/item_timefunc.cc b/sql/item_timefunc.cc
index a8bd219eef1..b198900d24e 100644
--- a/sql/item_timefunc.cc
+++ b/sql/item_timefunc.cc
@@ -525,7 +525,7 @@ String *Item_func_sec_to_time::val_str(String *str)
seconds= -seconds;
sign= "-";
}
- uint sec= (uint) (seconds % 3600);
+ uint sec= (uint) ((ulonglong) seconds % 3600);
sprintf(buff,"%s%02lu:%02u:%02u",sign,(long) (seconds/3600),
sec/60, sec % 60);
str->copy(buff,(uint) strlen(buff));